[
  {
    "path": ".devcontainer/devcontainer.json",
    "content": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.com/devcontainers/templates/tree/main/src/alpine\n{\n    \"name\": \"Cross-Lib\",\n\t// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile\n\t\"image\": \"ghcr.io/cross-lib/devcontainers/base:1.0.6-ubuntu\",\n\t// \"postStartCommand\": \"bash .devcontainer/post-start.sh\",\n\t\"customizations\": {\n\t\t// Configure properties specific to VS Code.\n\t\t\"vscode\": {\n\t\t\t// Set *default* container specific settings.json values on container create.\n\t\t\t\"settings\": {\n\t\t\t\t\"files.trimTrailingWhitespace\": false,\n\t\t\t\t\"python.defaultInterpreterPath\": \"/usr/local/bin/python\"\n\t\t\t}\n\t\t},\n\t\t\"codespaces\": {\n\t\t\t// Set *default* codespaces specific settings.json values on container create.\n\t\t\t\"settings\": {\n\t\t\t\t\"files.trimTrailingWhitespace\": false,\n\t\t\t\t\"python.defaultInterpreterPath\": \"/usr/local/bin/python\"\n\t\t\t}\n\t\t}\n\t}\n\t// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.\n\t// \"remoteUser\": \"root\"\n}\n"
  },
  {
    "path": ".devcontainer/post-start.sh",
    "content": "sudo install /usr/local/bin/p2hex /usr/bin\nPATH=.:$PATH"
  },
  {
    "path": ".gitignore",
    "content": ".bash_history\r\n.python_history\r\ndeliverables\r\n**_shapes\r\nroms/mame/*.zip\r\nroms/vice/vic20/chargen\r\nroms/vice/vic20/kernal\r\nroms/vice/vic20/basic\r\nroms/vice/c64/chargen\r\nroms/vice/c64/kernal\r\nroms/vice/c64/basic\r\nroms/vice/plus4/chargen\r\nroms/vice/plus4/kernal\r\nroms/vice/plus4/basic\r\nroms/vice/plus4/3plus1hi\r\nroms/vice/plus4/3plus1lo\r\nroms/vice/pet/chargen\r\nroms/vice/pet/kernal1\r\nroms/vice/pet/kernal2\r\nroms/vice/pet/kernal4\r\nroms/vice/pet/basic1\r\nroms/vice/pet/basic2\r\nroms/vice/pet/basic4\r\nroms/vice/pet/edit*\r\nroms/vice/pet/characters*\r\nsrc/cfg/*\r\n**.lis\r\n**mapfile.txt\r\n**global.txt\r\n**A.BEE\r\n*.o\r\n*.def\r\n*.swp\r\n*.img\r\n*.tap\r\n*.prg\r\nbuild/*\r\nsrc/projects/*\r\n**generated_assets\r\n**__pycache__\r\nsrc/assets/generated_assets/*\r\nsrc/examples/matrix/generated_assets/*\r\nsrc/examples/tiles/generated_assets/*\r\nsrc/examples/invaders/generated_assets/*\r\nsrc/examples/zombies/generated_assets/*\r\nsrc/examples/sounds/generated_assets/*\r\nsrc/games/chase/generated_assets/*\r\nsrc/games/shoot/generated_assets/*\r\nsrc/games/bomber/generated_assets/*\r\nsrc/games/snake/generated_assets/*\r\nsrc/games/horde/generated_assets/*\r\nsrc/games/shoot/main.c\r\nsrc/games/chase/main.c\r\nsrc/games/snake/main.c\r\nsrc/test/*.exe\r\nsrc/*.asm\r\nsrc/examples/full_lcc1802_combo.c\r\nsrc/games/full_lcc1802_combo.c\r\nsrc/experiments/*\r\nsrc/wincmoc_main.c\r\nsrc/*.asm\r\nsrc/chase/*.s\r\nsrc/nes/*.o\r\nsrc/nes/nes_graphics.s\r\n*.swp\r\n*.swo\r\nsrc/wincmoc_input.c\r\nsrc/wincmoc_graphics.c\r\n./tools/cpcrslib/cpcrslib.lib\r\n./map.txt\r\n*.stackdump\r\nsrc/wincmoc_tmp.c\r\nsrc/*combo.c\r\nsrc/modules/*.pyc\r\n*.lst\r\ntools/EDIP1e/xchase.DSK\r\nsrc/cross_lib/display/*.s\r\nsrc/chase/wincmoc*\r\na.exe\r\na.out\r\nsrc/games/full_combo_rand.c\r\nsrc/examples/full_combo_rand.c\r\nsrc/examples/reduced_full_lcc1802_combo.c\r\nsrc/examples/reduced_full_lcc1802_color_combo.c\r\nsrc/games/reduced_full_lcc1802_combo.c\r\nsrc/games/reduced_full_lcc1802_color_combo.c\r\nsrc/games/reduced_full_lcc1802_micro_combo.c\r\nsrc/games/reduced_full_lcc1802_combo_no_sounds.c\r\nsrc/debug/*.bin\r\nsrc/debug/cprintf\r\nsrc/debug/*.inf\r\nsrc/debug/bbctest\r\nsrc/debug/bbctest1\r\nsrc/debug/bbctest2\r\nsrc/debug/*.dsk\r\nsrc/debug/*.nes\r\nsrc/assets/*.pyc\r\nsrc/debug/gamate_conio_test\r\nsrc/debug/gamate_conio_test2\r\ntools/cc65/gamate/gamate-fixcart.exe\r\ntools/cc65/osic1p/srecord-1.64/config.log\r\ntools/cmoc/mo5/f2k5.exe\r\ntools/cc65/gamate/gamate-fixcart.out\r\ntools/cc65/telestrat/tap2dsk.exe\r\ntools/cc65/telestrat/tap2dsk\r\ntools/cc65/telestrat/tap2dsk.out\r\ntools/cc65/telestrat/old2mfm.exe\r\ntools/cc65/telestrat/old2mfm\r\ntools/cc65/telestrat/old2mfm.out\r\ntools/cmoc/mo5/f2k5.out\r\ntools/bbc/bbcim.exe\r\ntools/bbc/bbcim.out\r\ntools/generic/CC1541/cc1541.exe\r\ntools/generic/CC1541/cc1541.out\r\ntools/generic/cc1541.exe\r\ntools/generic/cc1541.out\r\ntools/generic/exomizer/exomizer.exe\r\ntools/generic/exomizer/exomizer.out\r\ntools/generic/exomizer.exe\r\ntools/generic/exomizer\r\ntools/generic/exomizer/src/asm.tab.h\r\ntools/generic/exomizer/src/asm.tab.c\r\ntools/generic/CC1541/cc1541\r\ntools/z88dk/oz/makewzd.exe\r\ntools/z88dk/oz/makewzd.out\r\ntools/cmoc/coco/file2dsk/file2dsk.exe\r\ntools/cmoc/coco/file2dsk/file2dsk.out\r\ntools/cmoc/mo5/sap/*.exe\r\ntools/cmoc/mo5/sap/*.out\r\ntools/cmoc/mo5/sapfs.exe\r\ntools/cmoc/mo5/sapfs.out\r\ntools/cmoc/mo5/sap/sap2\r\ntools/cc65/atari/mkatr-master/lsatr.exe\r\ntools/cc65/atari/mkatr-master/mkatr.exe\r\ntools/cc65/atari/mkatr-master/lsatr.out\r\ntools/cc65/atari/mkatr-master/mkatr.out\r\ntools/z88dk/cpc/nocart/nocart.exe\r\ntools/z88dk/cpc/nocart/nocart.out\r\ntools/olivetti_m20/m20.exe\r\ntools/olivetti_m20/m20.out\r\ntools/ti99/elf2ea5.exe\r\ntools/ti99/elf2ea5.out\r\ntools/ti99/ea5split.exe\r\ntools/ti99/ea5split.out\r\nlogs/*.log\r\ntools/z88dk/abc80/abcdisk-2.7/conftest.c\r\ntools/z88dk/abc80/abcdisk-2.7/abcwrite\r\ntools/z88dk/abc80/abcdisk-2.7/bin2abc\r\ntools/z88dk/abc80/abcdisk-2.7/confdefs.h\r\n**/*.sym\r\n**/*.dSYM\r\n**/*.DS_Store\r\n"
  },
  {
    "path": "README.md",
    "content": "\n\n# CROSS LIB\n![LOGO](snapshots/CrossLibLogoByHamletShorter.jpg)\n\n*Cross-Lib* and games built with it (e.g., Chase, Shoot, Bomber, Snake, Horde, Verbix, Shuriken, Stinger, Trex)\n\nby Fabrizio Caruso (fabrizio_caruso@hotmail.com)\n\n*Cross-Lib* is a *WORA* (Write Once Run Anywhere) framework for vintage systems, i.e., \nyou code your game in C **once** and *Cross-Lib* builds the very same game for about 200 vintage systems (console, computers, etc.) with **the very same code**.\n\nRead the <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/DISCLAIMER.md\"><b>Disclaimer.</b></a>\n\n<br />\n\n-------------------------------------------\n\n## CROSS-LIB-HD\n\nCross-Lib-HD is an equivalent backward-compatible framework, still work-in-progress: \n\nhttp://github.com/Fabrizio-Caruso/CROSS-LIB-HD\n\nIts goal is to provide a **higher number of redefinable tiles**, while maintaining the **same API's** and possibly the same number of supported targets as Cross-Lib.\n\nCross-Lib-HD is not meant to replace Cross-Lib because the latter can provide slightly smaller binaries, a higher number of colors and a higher number of targets with real graphics.\nA game with the need for a higher number of tiles may require Cross-Lib-HD, whereas games with a lower number of tiles will work on both but on Cross-Lib may get a better color pallette and/or graphics on some very limited targets.\n\n-------------------------------------------\n\n## ARTICLES ABOUT CROSS-LIB\nArticle [in English], first published in C.A.L.L. Apple Volume 3 Number 1 (January 2023): <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/EnglishArticle.md\" download>C.A.L.L.-Apple</a>\n\n\nArticle [in French], first published in the French magazine \"Programmez! Hors série #6\": <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/articles/CROSS_LIB_PUBLIC.pdf\" download>Programmez!</a>\n\n\n\n-------------------------------------------\n\n\n## THE GAMES\n\n<p float=\"left\">\n  <img src=\"snapshots/XSnake_MSX2.png\" width=\"100\" />\n  <img src=\"snapshots/XStinger_Vic20.png\" width=\"100\" /> \n  <img src=\"snapshots/XVerbix_Vic20_gameplay.jpg\" width=\"100\" />\n  <img src=\"snapshots/XShoot_Level1_Skulls_VIC20.jpg\" width=\"100\" />\n  <img src=\"snapshots/XShuriken_Vic20_gameplay.jpg\" width=\"100\" />\n</p>\n\nClick on the links below to play the games on your browser. \n\n\n1. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#trex\"><b>Trex</b></a> is a mini-game and an obvious clone of off-line Chrome T-Rex game.\n2. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#stinger\"><b>Stinger</b></a> is a tank-shooter with several enemies, levels, power-ups and items to pick.\n3. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#shuriken\"><b>Shuriken</b></a> is somehow inspired by Pac-man and Pengo.\n4. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#verbix\"><b>Verbix</b></a> is a Scrabble-like game that looks like Tetrix with letters.\n5. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#horde\"><b>Horde</b></a> is a zombie shooter with several different enemies, levels, power-ups and special items to pick.\n6. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#snake\"><b>Snake</b></a> is my personal re-interpretation of Nibbler (arcade game) to which I have added more game elements.\n7. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#bomber\"><b>Bomber</b></a> is a mini-game and clone of Air Attack (aka Blitz).\n8. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#shoot\"><b>Shoot</b></a> is a shooter somehow similar to Robotron. It has many items and secrets to discover.\n9. <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GAMES.md#chase\"><b>Chase</b></a> is somehow similar to *Gnome Robots* but in real-time game and with several items and power-ups.\n\n-------------------------------------------\n\n\n## MORE THAN 200 SUPPORTED TARGETS\n\nCross-Lib can be used to build games for <ins>more than 200 different vintage systems</ins> (computers, consoles, arcade boards, pocket calculators, etc.). \nAn almost complete list of the supported systems with their status is in: <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md\"><b>Supported Systems</b></a>\n\n\nSome supported vintage CPU architectures are:\n\n- `GBZ80`\n- `Intel 8080/85`\n- `Intel 8086`\n- `MOS 6502` \n- `Motorola 6803` \n- `Motorola 6809`\n- `RCA 1802`\n- `TMS 9900`\n- `Zilog 80` \n\nCross-Lib has also some support for vintage 16-bit and 32-bit systems and the native host PC.\n\nFor a more complete list of architectures you can look at: <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/ARCHITECTURES.md\"><b>Architectures</b></a>\n\n-------------------------------------------\n\n## SUPPORTED HOSTS\nCross-Lib runs under __any POSIX__-like environment such as\n- ***Linux***\n- ***Windows/Cygwin***\n- ***Windows Subsystem for Linux***\n- ***Windows/MSYS2***\n- ***MacOS***\n- ***FreeBSD***\n\n-------------------------------------------\n## REQUIREMEMTS\nCross-Lib requires a **POSIX** environment with at least \n- **Python** (2.7 is the bare minimum but 3.x provides more features)\n- **make** (GNU make)\n- one or more **ANSI C compiler(s)** \n\nIf you want to produce interactive binaries for the *native terminal* you need a **native compiler** (*gcc* or any other compiler such as *clang*) with **ncurses** or **ncursesw**.\n\nIn order to build binaries for a supported vintage system, the corresponding **cross-compiler** has to be installed (see the list of supported targets to see which compiler is required).\n\n\n### Currently supported cross-compilers\n\nThe current set of supported cross-compilers is:\n- `CC65`,\n- `Z88DK` (`SCCZ80` and `ZSDCC`),\n- `CMOC`,\n- `LCC1802`,\n- `TMS9900-GCC`\n- `ACK`, \n- `VBCC`,\n- `CC6303`\n\nPartially supported cross-compilers:\n- `GCC-Z8K`,\n- `XTC68`\n- `GCC-ATARI-ST`,\n- `GCC-AMIGA`,\n\nFor more details click on <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/COMPILERS.md\"><b>Compilers</b></a>\n\n### Tools to generate disk/tape/cartridge images\nVery few targets use special tools to generate tape/disk/cartridge images. \nSome of these tools are built from source on the fly the first time they are required. Most require *gcc* or *g++*.\n\nIn order to generate disk images for the *Apple][* and derivative targets Cross-Lib uses *ac.jar* for which **java** is necessary.\n\nTo generate tape images for the *CoCo 1/2* and *Dragon 32/64* targets Cross-Lib uses bin2cas.pl for which **perl** is required.\n\n-------------------------------------------\n\n## NO ACTUAL INSTALLATION NECESSARY\n\nAn actual installation is not necessary because Cross-Lib is made of scripts and a C *source library*, which is compiled on the fly when building binaries for target systems.\n\nMoreover even installing the required compilers may not be necessary because Cross-Lib can be used through GitHub Codespaces (with <ins>preinstalled</ins> compilers) on any browser.\n\nAdditionally ou can also use it with\n- the pre-built docker image (compilers are <ins>preinstalled</ins>), \n- the dockerfile to build an image or (compilers are <ins>preinstalled</ins>), \n- a clone of this repository (which requires the installation of the compilers).\n\nFor the details click on <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/INSTALL.md\"><b>Installation</b></a>\n\n\n-------------------------------------------\n\n## THE `xl` SCRIPT\n\nInside the project main directory, you find the `src` and the `build` directories:\n- `src` contains the source code and all other files that are necessary to build the games and the examples;\n- `build` is supposed to be empty at first and it is the target directory for the build process.\n\nFirst of all you need to be in the `src` directory.\nFrom `src` you can use the `xl` script  to do different operations on projects.\n\n\n`xl` is used as follows:\n```\nxl <command> <[optional] parameters>\n```\n\nYou can get help with:\n```\nxl help <[optional] command>\n```\n\nYou can build games and examples with :\n\n`xl <game_or_example_name> <[optional] system_name>`\n\nFor example `xl snake vic20` builds the *snake* for the *Commodore Vic 20 +16K* and `xl stinger` builds *stinger* for the *native terminal*.\n\nFor more details click on <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/XL.md\"><b>XL script</b></a>\n\n\n-------------------------------------------\n\n## THE TOOL-CHAIN\n\nCross-Lib provides a full tool-chain to build universal vintage 8-bit games. \n\n### Cross-Lib components\n\nCross-Lib provides:\n- a C library with hardware-agnostic APIs for game development;\n- the \"user-friendly\" script `xl`.\n\n\n\n### The build process\n\nWhen a game is built for a specific target, the Cross-Lib tool-chain will automatically:\n1. if needed, **convert abstract graphics assets** into target specific assets on the fly;\n2. **compile and link** the game code (and the target-specific game assets) by using the appropriate compiler;\n3. if needed, whenever possible, **create disk/cassette/cartridge images**.\n\n### The Workflow\n\nThe user has to:\n- **code** the game in C with Cross-Lib APIs in a hardware-agnostic way;\n- **draw** the abstract graphics assets and store them in the *tiles* or *shapes* directory;\n- **run** the `xl` script (see below).\n\n![User](snapshots/User2.bmp)\n\nFor more details click on <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/BUILD_PROCESS.md\"><b>Build</b></a>\n\n\n\n-------------------------------------------\n\n## HOW TO CODE WITH CROSS-LIB\n\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HARDWARE_AGNOSTIC_CODE.md\n\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/CROSS_LIB_APIS.md\n\n\n-------------------------------------------\n\n## LOADING THE GAMES\n\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HOW_TO_LOAD.md\n\n-------------------------------------------\n\n## ACKNOWLEDGEMENTS\n\nCross-Lib would not exist without the cross-compilers and the support of their developers and the support of some people who have helped me handle the input/output of some targets.\n\nA partial list of the people who have helped in found in <a href=\"https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/CREDITS.txt\"><b>Credits</b></a>\n\n\n\n\n-------------------------------------------\n\n## LICENCE\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from\nthe use of this software.\n\nPermission is granted to anyone to use this software for non-commercial applications, \nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\nclaim that you wrote the original software. If you use this software in\na product, an acknowledgment in the product documentation would be\nappreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not\nbe misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution.\n\nFor example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).\nOn the other hand I authorize people to load the games in the most convenient way for their personal use.\n\n"
  },
  {
    "path": "cfg/___empty.cfg",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<!-- This file is autogenerated; comments and unknown tags will be stripped -->\r\n<mameconfig version=\"10\">\r\n    <system name=\"___empty\">\r\n        <video>\r\n            <target index=\"0\" view=\"Screen 0 Standard (4:3)\" />\r\n        </video>\r\n    </system>\r\n</mameconfig>\r\n"
  },
  {
    "path": "cfg/default.cfg",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<!-- This file is autogenerated; comments and unknown tags will be stripped -->\r\n<mameconfig version=\"10\">\r\n    <system name=\"default\" />\r\n</mameconfig>\r\n"
  },
  {
    "path": "docs/ARCHITECTURES.md",
    "content": "## SUPPORTED ARCHITECTURES\r\n\r\n### 8-BIT ARCHITECTURES\r\n- COSMAC RCA 1802 and derivates\r\n- Intel 8080 and derivatives\r\n- MOS 6502 and derivatives\r\n- Motorola 6809 and derivatives\r\n- Motorola 6803\r\n- Zilog 80 and derivatives\r\n\r\n### 16-BIT ARCHITECTURES\r\n- Intel 8088/8086 \r\n- Motorola 68000/68008\r\n- PDP11\r\n- TMS 9900\r\n- Zilog Z8000\r\n\r\n### 32-BIT ARCHITECTURES\r\n- PowerPC\r\n- Intel 386\r\n- Motorola 68020\r\n- MIPS32r2 (little-endian)\r\n\r\n### 32/64-BIT ARCHITECTURE\r\nWe also support any current architecture for which GCC can produce a working binary."
  },
  {
    "path": "docs/Alice32k.txt",
    "content": "By Christophe Possamaï\r\n\r\n//***************************************\r\n//* CODE DEMO redefinition caractere    *\r\n//* ligne de commande pour compilation: *\r\n//* cc68 -tmc10 tuto.c -o tuto          *\r\n//* pour executer sur alice:            *\r\n//* chargement: CLOADM                  *\r\n//* execution: EXEC                     *\r\n//***************************************\r\n#include <stdio.h>\r\n// definition Registres\r\n#define R0  0xBF20 //commande\r\n#define R1  0xBF21 //paramètre principal\r\n#define R2  0xBF22 //paramètre\r\n#define R3  0xBF23 //paramètre\r\n#define R4  0xBF24 //pointeur auxiliaire haut\r\n#define R5  0xBF25 //pointeur auxiliaire bas\r\n#define R6  0xBF26 //pointeur principal haut\r\n#define R7  0xBF27 //pointeur principal bas\r\n#define EXEC    0x8 // a ajouter au registe pour execution.\r\n// Definition couleurs\r\n#define noir            0\r\n#define rouge           1\r\n#define vert            2\r\n#define orange          3\r\n#define bleu            4\r\n#define magenta         5\r\n#define cyan            6\r\n#define rose            7\r\n#define vertc           10\r\n#define jaune           11\r\n#define magentac        13\r\n#define blanc           15\r\nchar tuiles_0[] ={0x00,0x00,0x7C,0x92,0x92,0xFE,0xEE,0x7C,0x54,0x00};\r\nchar tuiles_1[] ={0x7E,0xC3,0xA9,0xFD,0xFD,0xFD,0xB9,0x91,0xC3,0x7E};\r\n// fonction Poke\r\nvoid poke(uint16_t addr, uint8_t value) {*((uint8_t*)addr) = value;}\r\n//fonction Peek\r\nuint8_t peek(uint16_t address) {\r\n// Utilisez un pointeur pour accéder à l'adresse mémoire spécifiée\r\nuint8_t *memoryPointer = (uint8_t *)address;\r\n// Utilisez le pointeur pour lire la valeur à l'adresse spécifiée\r\nreturn *memoryPointer;\r\n}\r\n// positionne le curseur pour afficher un caractere\r\nvoid posxy(unsigned char colonne, unsigned char ligne) {\r\npoke(R6, ligne);  // R6 (MP / LIGNE)\r\npoke(R7, colonne);  // R7 (MP / COL)\r\n}\r\n// parametre\r\nvoid param(unsigned char b) {\r\npoke(R2, b);  // R2 (B)\r\n}\r\n// defnie la couleur du prichain caractere\r\nvoid color(unsigned char crayon, unsigned char papier) {\r\nunsigned char b=0,a;\r\nif(crayon>rose) {\r\nb=1;\r\ncrayon-=8;\r\n}\r\nif(papier>rose) {\r\nb=1;\r\npapier-=8;\r\n}\r\na=papier+(crayon*16);\r\npoke(R2, b);  // R2 (B)\r\npoke(R3, a);  // R3 (A) couleur\r\n}\r\n// affiche un caractere\r\nvoid affichr(unsigned char c) {\r\npoke(R1, c);  // R1 (C)\r\npoke(R0+EXEC, 0);  // R0 + EXEC (KRF)\r\n}\r\n// fonction pour afficher une chaine de caractere ASCII a une position et avec les couleurs.\r\nvoid print(signed char x, signed char y, char *texte) {\r\nchar *c = texte;  // Correction ici\r\nif (x < 0) {\r\nx = (40 - sizeof(texte)) / 2;\r\n}\r\nposxy(x, y);\r\nfor (; *c != '\\0'; c++) {\r\npoke(R1, *c);\r\npoke(R0+EXEC, 1);\r\n}\r\n}\r\n// Fonction pour redefinir un caracteres\r\nvoid redefin(char numcaractere,char* data){ //CARACTERES REDÉFINIS\r\nuint16_t A = numcaractere+192;\r\nchar i;\r\nfor (i = 0; i < 10; ++i) {\r\npoke(R4, A / 256);\r\npoke(R5, A & 255);\r\npoke(R1, data[i]);\r\npoke(R0+EXEC, 48 + 4); // OCT + AUX_PTR (EXEC)\r\nA += 4;\r\n}\r\n}\r\nvoid main() {\r\nredefin(0,tuiles_0); //redifinition du caractere 0/128\r\nredefin(1,tuiles_1); //redifinition du caractere 1/128\r\ncolor(rouge,noir);\r\nprint(6, 0,\"Demo redefinition caracteres\");\r\ncolor(bleu,noir);\r\nparam(128+32+16);// bascule sur les caractères redéfinit\r\nposxy(19, 8);\r\naffichr(0);\r\nposxy(20, 8);\r\naffichr(1);\r\n}"
  },
  {
    "path": "docs/BUILD.md",
    "content": "\r\n\r\n# BUILD INSTRUCTIONS\r\n\r\n## Build the default target for a given system\r\n\r\nIn order to build a game or a test, you need to be in the `src` directory.\r\nYou  build a project (either a game or a test) for a specific system by either using the `xl build` script or an equivalent `make` command. \r\nA convenient shortcut is \r\n### Using `xl build`\r\n\r\nI recommend that you use `xl build` as follows:\r\n\r\n`xl build [project_name] [optional system_name] [optional number of threads]`\r\n\r\nwhere `[project name]` is either an example, a built-in game or user-defined project.\r\n\r\nA convenient shortcut is using just `xl` as follows:\r\n\r\n`xl [project_name] [optional system_name] [optional number of threads]`\r\n\r\nThe `[optional system_name]` parameter is the name of the target. If no target is specified then the native target (the host terminal) is implied.\r\n\r\nThe `[optional number of threads]` is used to specify the number of threads to use for multiple targets that can be built in parallel.\r\n\r\n\r\nBuilt-in games are \r\n\r\n`chase`, `shoot`, `bomber`, `snake`, `horde`. \r\n\r\nCurrent examples are:\r\n\r\n`helloworld`, `text`, `pause`, `background`, `tiles`, `input`, `sounds`, `matrix`, `zombies`, `invaders`.\r\n\r\nFor the list of supported systems look at \r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md\r\n\r\nIf no system name is given, a native version of the game or test is built by using `gcc` and `ncurses`.\r\n\r\n*Only when using the script*: If you use the script you can pass `games`, `tests` or `all` as `[game_or_test_name]` to build all games, tests or all projects (games and tests) for a specific system or list of systems.\r\n\r\nAs system you can also pass a group of systems such as: \r\n- `[compiler name]_targets` to build a given project for all targets compiled by a given compiler (e.g., `cc65_targets`, `z88dk_targets`, `cmoc_targets`, etc.)\r\n- `all` to build a given project on all possible targets (avoid this if you are not sure as it fails if you have not installed *all* compilers).\r\n\r\nExamples (`xl build` is shortened to `xl`):\r\n- `xl snake` -> It builds Cross Snake for the native console by using `gcc` and `ncurses`.\r\n- `xl chase` -> It builds Cross Chase for the native console by using `gcc` and `ncurses`.\r\n- `xl bomber atari` -> It builds Cross Bomber for the Atari 8-bit target (by using the appropriate cross-compiler, i.e., CC65)\r\n- `xl snake vic20` -> It builds Cross Snake for the Commodore Vic 20.\r\n- `xl games msx` -> It builds all game projects for the MSX target (by using the appropriate cross-compiler, i.e., the ones in Z88DK).\r\n- `xl bomber cc65_targets` -> It builds Cross Bomber for all targets that use CC65.\r\n- `xl tests c64` -> It builds all tests for the Commodore 64 target\r\n- `xl all coco` -> It builds all projects (games and tests) for the TRS-80 Color Computer (by using the appropriate cross-compiler, i.e., CMOC)\r\n\r\n\r\n### Using `make`\r\nUsing a standard `make` command is possible but you will get fewer options.\r\n\r\nFor game projects you can use:\r\n\r\n`make [system_name] -f ./games/[game_name]/Makefile.[game_name]`\r\n\r\nFor test projects you can use:\r\n`make [system_name] -f ./tests/[test_name]/Makefile.[test_name]`\r\n\r\nExamples for games: \r\n- `make vic20 -f ./games/horde/Makefile.horde` builds *Cross Horde* for Commodore Vic 20.\r\n- `make c64 -f ./games/chase/Makefile.chase` builds *Cross Chase* for Commodore 64.\r\n- `make nes -f ./games/shoot/Makefile.shoot` builds *Cross Shoot* for the Nintendo NES videogame console.\r\n- `make spectrum -f ./games/bomber/Makefile.bomber` builds *Cross Bomber* for the Sinclair ZX Spectrum.\r\n- `make ti83 -f ./games/chase/Makefile.chase` builds *Cross Chase* for the Texas Instrument TI 83 scientific calculator.\r\n- `make ncurses -f ./games/chase/Makefile.chase` builds *Cross Chase* for all targets by using GCC for the native host console (e.g., CYGWIN, Linux, etc. console).\r\n- `make cc65_targets ./games/chase/Makefile.chase` builds *Cross Chase* for all targets that are built with the CC65 cross-compiler for the MOS 6502-based systems.\r\n- `make cmoc_targets ./games/chase/Makefile.chase` builds *Cross Chase* for all targets that are built with the CMOC cross-compiler for the Motorola 6809-based systems.\r\n- `make z88dk_targets ./games/chase/Makefile.chase` builds *Cross Chase* for all targets that are built with the SCCZ80 and ZSDCC cross-compilers of the Z88DK dev-kit for Zilog 80-based and Intel 8080-based systems.\r\n- `make cc65_targets -f ./games/shoot/Makefile.shoot` builds *Cross Shoot* for all targets that are built with the CC65 cross-compiler for the MOS 6502-based systems.\r\n- `make z88dk_targets -f ./games/bomber/Makefile.bomber` builds *Cross Bomber* for all targets that are built with the SCCZ80 and ZSDCC cross-compilers of the Z88DK dev-kit for Zilog 80-based and Intel 8080-based systems.\r\n- `make lcc1802_targets -f ./games/bomber/Makefile.bomber` builds *Cross Bomber* for all targets that are built with the LCC1802 cross-compiler for the RCA COSMAC 1802-based systems.\r\n\r\nExamples for tests:\r\n- `make vic20 -f ./tests/tiles/Makefile.tiles` builds the test `tiles` for the Commodore Vic 20.\r\n- `make cpc -f ./tests/sounds/Makefile.sounds` builds the test `sounds` for the Amstrad CPC computer.\r\n- `make atari -f ./tests/invaders/Makefile.invaders` builds the tests `invaders` for the Atari 8-bit computer.\r\n\r\n\r\n## Targets built by multiple dev-kits\r\nSome targets, e.g., CP/M and Commodore 128, can be built by two different compilers because they can run different CPU architectures or because we may want to have multiple versions.\r\nIn such cases we can specify the CPU in the target name:\r\n\r\nExamples using `xl build`\r\n- `xl build chase c128_targets` builds Cross Chase for all Commodore 128 targets for both the MOS 8502 and for the more exotic Zilog 80 non-CP/M mode.\r\n- `xl build chase c128_8502_targets` builds Cross Chase for all Commodore 128 targets for the MOS 8502 architecture in both 40 and 80 column mode.\r\n- `xl build chase c128_z80_targets` builds Cross Chase for all Commodore 128 targets for the Zilog 80 non-CP/M mode in both 40 and 80 column mode.\r\n- `xl build chase cpm_targets` builds Cross Chase for all \"generic\" CP/M targets for both the Intel 8080 and Zilog 80 architecture.\r\n- `xl build chase cpm_8080_targets` builds Cross Chase for all \"generic\" CP/M targets for the Intel 8080 architecture (compatible with Zilog 80 systems).\r\n- `xl build chase cpm_z80_targets` builds Cross Chase  for all \"generic\" CP/M targets for both the Zilog 80 architecture (not compatible with Intel 8080 systems).\r\n\r\nExamples using `make`:\r\n- `make c128_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all Commodore 128 targets for both the MOS 8502 and for the more exotic Zilog 80 non-CP/M mode.\r\n- `make c128_8502_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all Commodore 128 targets for the MOS 8502 architecture in both 40 and 80 column mode.\r\n- `make c128_z80_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all Commodore 128 targets for the Zilog 80 non-CP/M mode in both 40 and 80 column mode.\r\n- `make cpm_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all \"generic\" CP/M targets for both the Intel 8080 and Zilog 80 architecture.\r\n- `make cpm_8080_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all \"generic\" CP/M targets for the Intel 8080 architecture (compatible with Zilog 80 systems).\r\n- `make cpm_z80_targets -f ./games/chase/Makefile.chase` builds Cross Chase  for all \"generic\" CP/M targets for both the Zilog 80 architecture (not compatible with Intel 8080 systems).\r\n\r\n\r\n"
  },
  {
    "path": "docs/BUILD_PROCESS.md",
    "content": "The `xl` script will trigger the full build process which will produce the target specific version of the project \r\nor massively build the same project for several targets (or even build several projects for one or more targets).\r\nFor example for the build of a project for the sole GameBoy target we may represent \r\nthe interactions of various Cross-Lib components with this diagram:\r\n\r\n![User](../snapshots/CrossLibFlow8.png)\r\n\r\n"
  },
  {
    "path": "docs/COMPILERS.md",
    "content": "\r\n# SUPPORTED COMPILERS\r\n\r\nThe program is written in ANSI C and currently compiled with \r\n- CC65 for all MOS 6502 targets (http://www.cc65.org/), \r\n- SCCZ80 (from Z88DK) for most Zilog 80 and Intel 8080 targets (https://www.z88dk.org/), \r\n- ZSDCC (from Z88DK) for some Zilog 80 and Intel 8080 targets (https://www.z88dk.org/),\r\n- CMOC for Motorola 6809 targets (https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html),\r\n- LCC1802 for COSMAC RCA 1802 targets (https://sites.google.com/site/lcc1802/downloads),\r\n- ACK for PC 8088/8086, CP/M Intel 8080, Linux 386/68K/PPC/MIPS, PDP11 (https://github.com/davidgiven/ack),\r\n- XTC68 (C68) for the Motorola 68008-based Sinclair QL (https://github.com/stronnag/xtc68),\r\n- VBCC for BBC Micro, BBC Master and other systems (http://www.compilers.de/vbcc.html)\r\n- Z8KGCC for the Zilog Z8000-based Olivetti M20 series (http://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc.html),\r\n- CC6303 for the Motorola 6803-based targets (https://github.com/EtchedPixels/CC6303 or https://github.com/zu2/CC6303),\r\n- \"GCC for Atari ST\" (http://vincent.riviere.free.fr/soft/m68k-atari-mint/),\r\n- \"GCC for Amiga\" (https://github.com/bebbo/amiga-gcc),\r\n- \"GCC for TI\" for the Texas TI99/4a (https://github.com/mburkley/tms9900-gcc),\r\n- GCC for modern 32/64-bit PC under any operating systems \r\n\r\nPrevious versions used \r\n- WinCMOC for 6809 targets  (https://sourceforge.net/projects/cmoc-win32/).\r\nWinCMOC has been abandoned because it uses an old CMOC version that has broken pointer to functions and because it is no longer maintained by its author. \r\n\r\nFor other targets, the following compilers and dev-kits may be included in future versions of the tool-chain:\r\n- QDOS-GCC for the Sinclair QL (http://morloch.hd.free.fr/qdos/qdosgcc.html)\r\n- SDCC for Z80 and other targets (http://sdcc.sourceforge.net/),\r\n- PVSNESLIB for the Super Nintendo Entertainment System (https://github.com/alekmaul/pvsneslib),\r\n- amiga-os-toolchain for all Amigas (https://github.com/cahirwpz/amigaos-cross-toolchain),\r\n- GCC6809 for other 6809 targets (https://sourceforge.net/projects/freewpc/files/GCC-6809/),\r\n- TIGCC for 68k-based TI calculators (http://tigcc.ticalc.org/).\r\n\r\nThe tool-chain also uses some third-party target-specific tools to create usable cassette/disk/rom images.\r\nThis is documented in https://github.com/Fabrizio-Caruso/CROSS-CHASE/blob/master/tools/README.txt\r\n\r\n"
  },
  {
    "path": "docs/COMPILER_NAMES.md",
    "content": "## Compiler names of currently supported compilers\r\n\r\n- `ack`\r\n- `cc65`\r\n- `cmoc`\r\n- `emcc` (totally experimental Emscripten to produce WebAssembly/Javascript)\r\n- `gcc`\r\n- `gcc_amiga`\r\n- `gcc_atari_st`\r\n- `gcc_ti99`\r\n- `gcc_z8k` (currently buildable only under Linux)\r\n- `lcc1802`\r\n- `xtc68`\r\n- `z88dk` (for both the SCCZ80 and the ZSDCC cross-compiler in Z88DK)"
  },
  {
    "path": "docs/CREDITS.txt",
    "content": "CREDITS\n\nI have been helped by people who are involved in the cross compilers Z88Dk, CC65, CMOC, ACK, LCC1802, GCC for TI99 development.\n\nIn particular I must thank:\n- Alex Thissen for his support on the docker release and on the Atari Lynx target\n\n- Stefano Bodrato for lots of help on all Z80 targets including development on the Z88Dk to support my library and games.\n\n- Bill Rowe for improving LCC1802 and supporting my library\n\n- Antonino Porcino for providing his online emulators and helping me test my games.\n\n- Marcen van Tongeren: for implementing the dev-kit in LCC1802 and supporting CrossLib\n\n- Christian Groessler: has helped me to improve the Makefile and fix an issue on the Atari 8-bit color version.\n\n- Simon Jonassen: Help on getting a good routine for the keyboard input for all CoCo and Dragon models.\n\n- Tursi (from AtariAge) for his Classic99 emulator, his support with libti99 and general help on the TI99/4A\n\n- Asmusr (from AtariAge) for his JS99er JavaScript emulator, support on the cartUrl parameter, and the generation of cartridge images from EA5 files\n\n- Mark Burkley for his great work and support on GCC for the TI compiler\n\n- *Hamlet* for the logo.\n\n"
  },
  {
    "path": "docs/CROSSLIB.md",
    "content": "## CROSSLIB\r\n\r\nFor each target, at least one of the following modes has to be implemented:\r\n1. memory-mapped graphics (display can be implemented by writing bytes into video memory)\r\n2. conio-like (display is performed by either direct conio APIs or a wrapper that provides conio APIs, e.g., ADM3/A, VT52, VT100, etc.)\r\n3. TGI (CC65-specific graphics APIs)\r\n4. Z88DK Sprites (Z88DK-specific sprite APIs)\r\n5. CPCRSLIB (Amstrad CPC-specific graphics APIs)\r\n6. bit-mapped (display is implemented by writing into video memory and each bytes corresponds to one or more pixels)\r\n7. buffered (stdlib-only \"graphics\" for targets with just stdlib support)\r\n\r\nA graphic mode may implement the concrete graphics by either calling low level graphics instructions (e.g., writing into video-memory) or by calling higher level instructions (e.g., using control codes).\r\n\r\nFor example for a CPM target with ADM3/A control codes, we use\r\n1. CrossLib APIs that call\r\n2. conio.h APIs that call\r\n3. ADM3/A control codes\r\n\r\nFor a target with direct or indirect video memory (e.g., Commodore 64, MSX, etc.), one may use:\r\n1. CrossLib APIs that implement\r\n2. Direct (or indirect) writes into video memory\r\n\r\nRemark: For some targets multiple implementations are possible (C64 may use conio APIs as provided by C65, memory-mapped graphics, TGI APIs)\r\n"
  },
  {
    "path": "docs/CROSS_LIB_APIS.md",
    "content": "\r\n# CROSS-LIB APIs\r\n\r\n\r\n\r\n## GRAPHICS\r\n\r\n\r\n\r\n`_XL_INIT_GRAPHICS()`\r\n\r\nIt initializes the graphics. Necessary for any build that wants to show anything on the screen.\r\n\r\n--------------------------------------------------------\r\n\r\n`XSize`: Number of tiles that can be displayed horizontally on the (usable) screen\r\n\r\n\r\n`YSize`: Number of tiles that can be displayed vertically on the (usable) screen\r\n\r\n\r\n`_TILE_1`, ..., `_TILE_24`, `_DOLLAR_TILE`: Displayable tiles with _XL_DRAW\r\n\r\n\r\n`_XL_BLACK`, `_XL_WHITE`, `_XL_RED`, `_XL_CYAN`, `_XL_GREEN`, `_XL_YELLOW`, `_XL_BLUE`: Currently available colors\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_DRAW(X, Y, T, C)`\r\n\r\nIt displays tile T at position (X,Y) with color C if color C is available or its \"closest\" match when C is not supported by a target.\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_DELETE(X,Y)`\r\n\r\nIt deletes a tile-sized area of the screen at position (X,Y)\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_CLEAR_SCREEN()`\r\n\r\nIt clears the whole screen.\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_WAIT_VSYNC()`\r\n\r\nIt waits for the vertical synch if this is supported by the target. It does nothing otherwise.\r\n\r\n--------------------------------------------------------\r\n\r\n## TEXT\r\n\r\n\r\n\r\nA \"Cross-Lib string\" is string formed with only the following 37 possible characters\r\n`_XL_SPACE`, `_XL_a`, ..., `_XL_z`, `_XL_A`, ..., `_XL_Z`, `'0'`, ..., `'9'`\r\nwhere capital/small letter may be displayed as the same character depending on whether the target supports different display for capital vs small letters.\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_PRINT(X,Y,S)`\r\n\r\nIt prints the \"Cross-Lib string\" S starting a position (X,Y).\r\n\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_PRINT_CENTERED(S)`\r\n\r\nSame as `XL_PRINT` but it just displays the \"Cross-Lib string\" S at the center of the screen\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_PRINT_CENTERED_ON_ROW(Y,S)`\r\n\r\nSame as `XL_PRINT` but it just displays the \"Cross-Lib string\" S centered on row Y\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_PRINT_CENTERED_ON_ROW_WITH_COLOR(Y,C,S)`\r\n\r\nSame as `_XL_PRINT_CENTERED_ON_ROW` but with color C (if the target supports text color)\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_PRINT_CENTERED_WITH_COLOR(C,S)`\r\n\r\nSame as `_XL_PRINT_CENTERED` but with color C (if the target supports text color)\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_PRINTD(X,Y,L,N)`\r\n\r\nIt prints the positive integer number N in L digits (1<=L<=5) starting at position (X,Y)\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_SET_TEXT_COLOR(C)`\r\n\r\nIt sets the text color to C. Such color will be used on next PRINT and PRINTD for targets that support colored text.\r\nIf any other display operation is present (e.g., `_XL_DRAW`), then there is no guarantee that the color C will be used afterwards.\r\n\r\n--------------------------------------------------------\r\n\r\n## INPUT\r\n\r\n\r\n\r\n`_XL_INIT_INPUT()`\r\n\r\nIt initializes the input (joystick/keyboard). Necessary for any program that needs to receive an input\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_INPUT()`\r\n\r\nIt returns a value J that represents the specific received input or absence of input at the moment of its execution (keyboard may be buffered, though).\r\nThe result J is meant to be used with the Boolean functions below.\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_UP(J)`, `_XL_DOWN(J)`, `_XL_LEFT(J)`, `_XL_RIGHT(J)`, `_XL_FIRE(J)`\r\n\r\nThese Boolean functions return 1 (true) if J represents a specific movement or fire button/key, and 0 (false) otherwise.\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_KEY_PRESSED()`\r\n\r\nThis Boolean function returns 1 (true) if any key or fire button is pressed.\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_WAIT_FOR_INPUT()`\r\n\r\nIt waits for any key or fire button to be pressed.\r\n\r\n--------------------------------------------------------\r\n\r\n## SOUND\r\n\r\n\r\n\r\n`_XL_INIT_SOUND()`\r\n\r\nIt initializes the sound system. Necessary for any program that produces sound.\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_ZAP_SOUND()`: Long rising sound\r\n\r\n`_XL_PING_SOUND()`: Short high-pitched sound\r\n\r\n\r\n`_XL_TICK_SOUND()`: Very short high-pitched sound\r\n\r\n\r\n`_XL_TOCK_SOUND()`: Very short low-pitched sound\r\n\r\n\r\n`_XL_EXPLOSION_SOUND()`: Long noise\r\n\r\n\r\n`_XL_SHOOT_SOUND()`: Short noise\r\n\r\n\r\n\r\n## SLEEP\r\n\r\n\r\n`_XL_SLEEP(S)`\r\n\r\nIt waits  S seconds or an approximations of S seconds depending on the target\r\n\r\n--------------------------------------------------------\r\n\r\n`_XL_SLOW_DOWN(T)`\r\n\r\nIt waits T loops (0<=T<=65535)\r\n\r\n--------------------------------------------------------\r\n\r\n## RANDOM\r\n\r\n\r\n`_XL_RAND()`\r\n\r\nIt generates a pseudo-random number in the range \\[0,32767\\]\r\n\r\n\r\n"
  },
  {
    "path": "docs/CROSS_LIB_APIS.txt",
    "content": "--------------------------------------------------------------------------------------\r\nCROSS-LIB APIs\r\n--------------------------------------------------------------------------------------\r\n\r\n\r\n--------------------------------------------------------------------------------------\r\nGRAPHICS\r\n--------------------------------------------------------------------------------------\r\n\r\n--------------------------------\r\n_XL_INIT_GRAPHICS()\r\nIt initializes the graphics. Necessary for any build that wants to show anything on the screen.\r\n\r\n\r\n--------------------------------\r\nXSize: Number of tiles that can be displayed horizontally on the (usable) screen\r\n\r\n--------------------------------\r\nYSize: Number of tiles that can be displayed vertically on the (usable) screen\r\n\r\n--------------------------------\r\n_TILE_1, ..., _TILE_24, _DOLLAR_TILE\r\nDisplayable tiles with _XL_DRAW\r\n\r\n\r\n--------------------------------\r\n_XL_BLACK, _XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE\r\n\r\nCurrently available colors\r\n\r\n--------------------------------\r\n_XL_DRAW(X, Y, T, C)\r\nIt displays tile T at position (X,Y) with color C if color C is available or its \"closest\" match when C is not supported by a target.\r\n\r\n\r\n--------------------------------\r\n_XL_DELETE(X,Y)\r\nIt deletes a tile-sized area of the screen at position (X,Y)\r\n\r\n\r\n--------------------------------\r\n_XL_CLEAR_SCREEN()\r\nIt clears the whole screen.\r\n\r\n\r\n--------------------------------\r\n_XL_WAIT_VSYNC()\r\n\r\nIt waits for the vertical synch if this is supported by the target. It does nothing otherwise.\r\n\r\n--------------------------------------------------------------------------------------\r\nTEXT\r\n--------------------------------------------------------------------------------------\r\n\r\n--------------------------------\r\n_XL_PRINT(X,Y,S)\r\nIt prints the \"Cross-Lib string\" S starting a position (X,Y).\r\nA \"Cross-Lib string\" is string formed with only the following 37 possible characters\r\n_XL_SPACE, _XL_a, ..., _XL_z, _XL_A, ..., _XL_Z, '0', ..., '9'\r\nwhere capital/small letter may be displayed as the same character depending on whether the target supports different display for capital vs small letters.\r\n\r\n\r\n--------------------------------\r\n_XL_PRINTD(X,Y,L,N)\r\nIt prints the positive integer number N in L digits (1<=L<=5) starting at position (X,Y)\r\n\r\n\r\n--------------------------------\r\n_XL_SET_TEXT_COLOR(C)\r\nIt sets the text color to C. Such color will be used on next PRINT and PRINTD for targets that support colored text.\r\nIf any other display operation is present (e.g., _XL_DRAW), then there is no guarantee that the color C will be used afterwards.\r\n\r\n--------------------------------------------------------------------------------------\r\nINPUT\r\n--------------------------------------------------------------------------------------\r\n\r\n--------------------------------\r\n_XL_INIT_INPUT()\r\nIt initializes the input (joystick/keyboard). Necessary for any program that needs to receive an input\r\n\r\n\r\n--------------------------------\r\n_XL_INPUT()\r\nIt returns a value J that represents the specific received input or absence of input at the moment of its execution (keyboard may be buffered, though).\r\nThe result J is meant to be used with the Boolean functions below.\r\n\r\n--------------------------------\r\n_XL_UP(J), _XL_DOWN(J), _XL_LEFT(J), _XL_RIGHT(J), _XL_FIRE(J)\r\nThese Boolean functions return 1 (true) if J represents a specific movement or fire button/key, and 0 (false) otherwise.\r\n\r\n\r\n--------------------------------\r\n_XL_KEY_PRESSED()\r\nThis Boolean function returns 1 (true) if any key or fire button is pressed.\r\n\r\n\r\n--------------------------------\r\n_XL_WAIT_FOR_INPUT()\r\nIt waits for any key or fire button to be pressed.\r\n\r\n\r\n--------------------------------------------------------------------------------------\r\nSOUND\r\n--------------------------------------------------------------------------------------\r\n\r\n--------------------------------\r\n_XL_INIT_SOUND()\r\nIt initializes the sound system. Necessary for any program that produces sound.\r\n\r\n\r\n--------------------------------\r\n_XL_ZAP_SOUND()\r\nLong rising sound\r\n\r\n--------------------------------\r\n_XL_PING_SOUND()\r\nShort high-pitched sound\r\n\r\n--------------------------------\r\n_XL_TICK_SOUND()\r\nVery short high-pitched sound\r\n\r\n--------------------------------\r\n_XL_TOCK_SOUND()\r\nVery short low-pitched sound\r\n\r\n--------------------------------\r\n_XL_EXPLOSION_SOUND()\r\nLong noise\r\n\r\n--------------------------------\r\n_XL_SHOOT_SOUND()\r\nShort noise\r\n\r\n\r\n--------------------------------------------------------------------------------------\r\nSLEEP\r\n--------------------------------------------------------------------------------------\r\n\r\n\r\n--------------------------------\r\n_XL_SLEEP(S)\r\nIt waits  S seconds or an approximations of S seconds depending on the target\r\n\r\n\r\n--------------------------------\r\n_XL_SLOW_DOWN(T)\r\nIt waits T loops (0<=T<=65535)\r\n\r\n\r\n--------------------------------------------------------------------------------------\r\nRANDOM\r\n--------------------------------------------------------------------------------------\r\n\r\n_XL_RAND()\r\nIt generates a pseudo-random number in the range [0,32767]\r\n\r\n\r\n"
  },
  {
    "path": "docs/CX16.txt",
    "content": "\r\nVERA ports:\r\nIn a nutshell the values at $9F20, $9F21 & $9F22 specify a starting VRAM address and an auto-increment value (in $9F22).   Reading $9F23 reads the next VRAM byte.\r\nWriting $9F23 writes the next VRAM byte.\r\n\r\n----\r\n\r\nFor example:\r\n   $9F20 = 0\r\n   $9F21 = 0\r\n   $9F22 = %00010001 \r\n\r\nThis points at VRAM address 65536 with Auto Increment value of 1\r\n\r\n----\r\n\r\nBit 0 of $9F22 is considered the bank  the rest of the bits in 22 set the auto increment mode   \r\nThe address is Little Endian from $9F20 to the bank bit in $22\r\n\r\n----\r\n\r\nHSCALE = ( DESIRED RES/640 ) * 128\r\nVSCALE = (DESIREDRES/480) * 128\r\n\r\n----\r\n\r\nVRAM: \r\nThe FONT resides at 1:$F000\r\nThe text screen memory is at $1:BOOO layed out as  \r\n    ATTR, CHAR, ATTR, CHAR.....\r\n"
  },
  {
    "path": "docs/Creativision_binary_structure.txt",
    "content": "From FunnyMu source code:\r\n\r\n-----------------------------------\r\n\r\nReset CPU -> PC counter is initialized from values in $FFFC,$FFFD?\r\n\r\n-----------------------------------\r\n\r\n  if(F=fopen(Cartridge, \"rb\")) {\r\n    CartSize=fread(CART, 1, 0x8000, F);\t\t        // read a max of 32KB in CART\r\n    rewind(F);                                          // rewinds reading to 0\r\n\r\n    if (CartSize==0x1000) {\t\t\t\t// cart is 4KB\r\n      printf(\"4KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0xB000, 1, 0x1000, F);\t\t\t// main 4Kb\tat 0xB000\r\n      memcpy(RAM+0x9000, RAM+0xA000, 0x1000);\t\t\t// mirror 4KB\tat 0x9000\r\n    } else\r\n    if (CartSize==0x1800) {\t\t\t\t// cart is 6KB\r\n      printf(\"6KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0xB000, 1, 0x1000, F);\t\t\t// main 4Kb\tat 0xB000\r\n      memcpy(RAM+0x9000, RAM+0xB000, 0x1000);\t\t\t// mirror 4KB\tat 0x9000\r\n      CartSize=fread(RAM+0xA800, 1, 0x0800, F);\t\t\t// main 2Kb\tat 0xA800\r\n      memcpy(RAM+0xA000, RAM+0xA800, 0x0800);\t\t\t// mirror 2KB\tat 0xA000\r\n      memcpy(RAM+0x8800, RAM+0xA800, 0x0800);\t\t\t// mirror 2KB\tat 0x8800\r\n      memcpy(RAM+0x8000, RAM+0xA800, 0x0800);\t\t\t// mirror 2KB\tat 0x8000\r\n    } else\r\n    if (CartSize==0x2000) {\t\t\t\t// cart is 8KB\r\n      printf(\"8KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0xA000, 1, 0x2000, F);\t\t\t// main 8Kb\tat 0xA000\r\n      memcpy(RAM+0x8000, RAM+0xA000, 0x2000);\t\t\t// mirror 8KB\tat 0x8000\r\n    } else\r\n    if (CartSize==0x2800) {\t\t\t\t// cart is 10KB\r\n      printf(\"10KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0xA000, 1, 0x2000, F);\t\t\t// main 8Kb\tat 0xA000\r\n      memcpy(RAM+0x8000, RAM+0xA000, 0x2000);\t\t\t// mirror 8KB\tat 0x8000\r\n      CartSize=fread(RAM+0x7800, 1, 0x0800, F);\t\t\t// main 2KB\tat 0x7800\r\n      memcpy(RAM+0x5800, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x5800\r\n\r\n      memcpy(RAM+0x7000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x7000\r\n      memcpy(RAM+0x6800, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x6800\r\n      memcpy(RAM+0x6000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x6000\r\n      memcpy(RAM+0x5000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x5000\r\n      memcpy(RAM+0x4800, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x4800\r\n      memcpy(RAM+0x4000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x4000 (needed by Werben ++++ Informieren)\r\n    } else\r\n    if (CartSize==0x3000) {\t\t\t\t// cart is 12KB\r\n      printf(\"12KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0xA000, 1, 0x2000, F);\t\t\t// main 8Kb\tat 0xA000\r\n      memcpy(RAM+0x8000, RAM+0xA000, 0x2000);\t\t\t// mirror 8KB\tat 0x8000\r\n      CartSize=fread(RAM+0x7000, 1, 0x1000, F);\t\t\t// main 4Kb\tat 0x7000\r\n      memcpy(RAM+0x5000, RAM+0x7000, 0x1000);\t\t\t// mirror 4KB\tat 0x5000\r\n\r\n      memcpy(RAM+0x6000, RAM+0x7000, 0x1000);\t\t\t// mirror 4KB\tat 0x6000\r\n      memcpy(RAM+0x4000, RAM+0x7000, 0x1000);\t\t\t// mirror 4KB\tat 0x4000 (needed by Basic 82)\r\n    } else\r\n    if (CartSize==0x4000) {\t\t\t\t// cart is 16KB\r\n      printf(\"16KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0xA000, 1, 0x2000, F);\t\t\t// main 8Kb\tat 0xA000\r\n      CartSize=fread(RAM+0x8000, 1, 0x2000, F);\t\t\t// second 8Kb\tat 0x8000\r\n    } else\r\n    if (CartSize==0x4800) {\t\t\t\t// cart is 18KB\r\n      printf(\"18KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0xA000, 1, 0x2000, F);\t\t\t// main 8Kb\tat 0xA000\r\n      CartSize=fread(RAM+0x8000, 1, 0x2000, F);\t\t\t// second 8Kb\tat 0x8000\r\n      CartSize=fread(RAM+0x7800, 1, 0x0800, F);\t\t\t// main 2KB\tat 0x7800\r\n      memcpy(RAM+0x6800, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x6800\r\n      memcpy(RAM+0x5800, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x5800\r\n      memcpy(RAM+0x4800, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x4800\r\n\r\n      memcpy(RAM+0x7000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x7000\r\n      memcpy(RAM+0x6000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x6000\r\n      memcpy(RAM+0x5000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x5000\r\n      memcpy(RAM+0x4000, RAM+0x7800, 0x0800);\t\t\t// mirror 2Kb\tat 0x4000\r\n    } else\r\n    if (CartSize==0x8000) {\t\t\t\t// cart is 32KB\r\n      printf(\"32KBytes cartridge found...OK\\n\");\r\n      CartSize=fread(RAM+0x4000, 1, 0x8000, F);\t\t\t// main 32Kb\tat 0x4000\r\n    }\r\n    fclose(F);\r\n  }\r\n  else\r\n    P=\"NOT FOUND\";\r\n\t"
  },
  {
    "path": "docs/DISCLAIMER.md",
    "content": "# DISCLAIMER\r\n\r\nAll information on the site (https://github.com/Fabrizio-Caruso/CROSS-LIB) and the software it describes is provided in good faith, however we make no representation or warranty of any kind, express or implied, regarding the accuracy, adequacy, validity, reliability, availability or completeness of any information on the site https://github.com/Fabrizio-Caruso/CROSS-LIB and the software it provides.\r\n\r\nUnder no circumstance shall we have any liability to you for any loss or damage of any kind incurred as a result of the use of the aforementioned site and any software it provides (games, tests, tools, library, source code, scripts. etc.) or reliance on any information provided on the site. Your use of the site and the software it provides and your reliance on any information on the site is solely at your own risk."
  },
  {
    "path": "docs/EnglishArticle.md",
    "content": "# CROSS-LIB\r\nby Fabrizio Caruso\r\n\r\n## INTRODUCTION\r\n\r\nThe goal of this article is to present Cross-Lib, briefly show how to use it and present the 6 \"universal\" games I have written with it.\r\nBy \"universal\" here I mean that these games will run on about 200 different systems (consoles, computers, arcade boards, pocket calculators, etc.) despite using the very same game code.\r\nFor more details we refer to the GitHub page: http://www.github.com/Fabrizio-Caruso/CROSS-LIB/\r\n\r\n\r\n\r\n## WHAT IS CROSS-LIB?\r\n\r\nCross-Lib (https://github.com/Fabrizio-Caruso/CROSS-LIB/) is a free open source tool for retro-coding for a multitude of 8-bit and vintage systems from the ‘80s (computers, consoles, pocket calculators, arcade boards, etc.) \r\nsuch as Apple //, all 8-bit Commodore computers, Atari 800, Amstrad CPC, Sinclair ZX 81, Sinclair ZX Spectrum, TRS-80 CoCo, Dragon 32, TRS-80 MC-10, Thomson Mo5 and To7, MSX, Oric-1, Oric Atmos, BBC Micro, etc. as well as consoles such as GameBoy, Sega Master System, GameGear, Nintendo NES, etc. \r\nand other devices such as Texas Instruments pocket calculators. The main CPU architectures are Zilog 80, MOS 6502, Intel 8080, Motorola 6803, Motorola 6809 and RCA 1802. \r\nCross-Lib also supports several lesser known systems such as the Philips VG-5000, the Jupiter Ace and several exotic and rare systems such as the yugoslav Galaksija, the Hungarian Homlab-2, \r\nseveral computers from the Eastern German Robotron series such as the Robotron KC 85, etc. \r\nA large, yet partial list of the supported systems is at the page: \r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md. \r\n\r\nCross-Lib has two main components:\r\n\r\n1. A \"universal\" C library (e.g., a collection of C APIs mostly for input/output);\r\n2. A Python script to manage game projects (e.g., to build, create, clone, etc.) and manipulate graphics assets (e.g., to create, import or rip assets)\r\n\r\nThe main goal of Cross-Lib is to provide a *hardware abstraction layer* for hundreds of vintage systems so that the *very same* game code can be used without any adaptation for all its supported systems.\r\n\r\nSeveral articles have been published on Cross-Lib ([rg], [prog]) and its games ([ceo] and, in by this very magazine, [app]).\r\n\r\n\r\n\r\n## CROSS-LIB VS OTHER DEV-KITS\r\n\r\nHistorically, 8-bit systems were programmed directly on the system and mostly in Assembly, or for simpler programs in interpreted BASIC.\r\n\r\nToday cross-development simplifies developers’ tasks a lot (modern editors, simplified debugging, efficient and quick compilation, etc.) and can be done in C.\r\n\r\n\r\n\r\nThe problem with the portability of C code comes from the diversity of the machines and from the fact that ANSI C does not provide a standard library for graphics, sounds, input, etc.\r\nA partial solution is already provided by some dev-kits such as CC65 (for MOS 6502), Z88DK (for the Zilog 80 and Intel 8080), LCC1802 (for the RCA 1802), CMOC (for the Motorola 6890), etc. \r\nBy using one of these dev-kits, we can exploit their cross-compatible libraries for input and output.\r\nOn the other hand:\r\n1. Each dev-kit only covers a subset of all 8-bit architectures.\r\n2. Even within a given dev-kit, its libraries do not necessarily provide the very same input/output APIs across the entirety of its supported targets.\r\n\r\n\r\n\r\nCross-Lib improves on these points and lets you do things that you cannot do with other tools:\r\n1. cover many more vintage 8-bit architectures, including very exotic ones;\r\n2. writing 100% WORA code, i.e., \"write once, run anywhere\" (after re-compilation);\r\n3. using WORA graphics resources, i.e., define abstract graphics assets for several totally different systems;\r\n4. using a simplified tool-chain to create, compile and test the games.\r\n\r\n\r\n\r\nThe closest dev-kits to Cross-Lib with respect to these points are \r\n- 8-bit-Unity [un8] (meant to be used with CC65), which does incredible things but only for very few MOS 6502-based systems;\r\n- Z88DK, which has huge libraries but only covers Zilog 80 and Intel 8080 systems.\r\n\r\n\r\n\r\nOn the other hand Cross-Lib is not a compiler. It uses several compilers to build the binary files (executable files, disk images, tape images, cartridge images, etc.) for retro-consoles and retro-computers.\r\n\r\n\r\n\r\nBy providing an abstraction layer for all 8-bit systems, Cross-Lib makes some compromises with respect to what we could do if we were coding only for a specific system.\r\nIn particular, graphics is somehow limited by what is possible on all systems. Sound effects are even more limited.\r\n\r\n\r\n\r\n\r\n\r\n## COMPILERS\r\n\r\nCross-Lib is supposed to be used with C compilers but which ones? \r\n\r\nA native compiler (for example GCC) can be used to build native binaries that can be run, for instance, under Windows. \r\nToday the support for native compilation is limited to the text terminal, which means no graphics other than ASCII on the host machine.\r\n\r\n\r\n\r\nCurrently Cross-Lib fully supports the following cross-compilers and dev-kits with graphics and sound effects for most of its targets:\r\n- CC65 [cc65] for most systems based on the MOS 6502 architecture; \r\n- Z88DK [z88dk] for systems based on the Zilog 80 and Intel 8080 architectures;\r\n- CMOC [cmoc] for systems that use the Motorola 6809;\r\n- LCC1802 [lcc1802] for systems that use the COSMAC RCA 1802 ;\r\n- GCC for TI [ti] for the Texas Instruments TI99/4A based on the 16-bit TMS9900.\r\n\r\n\r\n\r\nCross-Lib also supports other compilers (currently with limited or absent graphics and sound effects) such as \r\n- ACK [ack] for 8088/8086, Intel 8080 CP/M, 386/68K/PPC/MIPS Linux and PDP11, \r\n- XTC68 [xtc68] for the Sinclair QL, \r\n- VBCC [vbcc] for the BBC Micro, BBC Master, the Amiga and others, \r\n- CC6303 [cc6303] for the Motorola 6803; \r\n- several versions of modded GCC to target vintage computers (Atari ST [st], Olivetti M20 [m20]).\r\n\r\n\r\n\r\nCross-Lib supports a large sub-set of ANSI C89 because most available cross-compilers for 8-bit architectures only implement a sub-set of ANSI C89.\r\nTherefore we write in C (a sub-set of ANSI C C89) with Cross-Lib APIs for graphics, sounds, input.\r\nIn particular we must avoid:\r\n- \"float\" and \"double\" types, \r\n- copies and parameters by value of \"struct\" objects,\r\n- any use of the heap.\r\n\r\n\r\nFor hints on how to code efficiently for 8-bit systems we refer to [effc] and for specific hints on how to code with these compilers we refer to [c8b].\r\n\r\n\r\n\r\n\r\n\r\n## INSTALLATION\r\n\r\nCross-Lib itself does not require any real installation. \r\nIt is enough to download the repository files (from the GitHub page) or to clone the repository with:\r\ngit clone https://www.github.com/Fabrizio-Caruso/CROSS-LIB/\r\n\r\n\r\n\r\nOn the other hand it requires:\r\n- a POSIX environment (e.g., Windows with Cygwin, Linux, FreeBSD, etc.);\r\n- Make (GNU Make);\r\n- Python 2.7 or Python 3.* [optional but necessary to simplify many operations];\r\n- GCC compiler with ncurses libraries [optional];\r\n- any compiler necessary to build for a desired target architecture (e.g., CC65, Z88DK, etc.) \r\n- JAVA (only to be disk images for the Apple //).\r\n\r\n\r\nOnce you have Cross-Lib with its dependencies in a POSIX environment, you should move to the \"src\" directory.\r\nInside \"src\" you will find the \"xl\" Python script and the following directories \r\n- \"cross-lib\", which contains the library code;\r\n- \"games\" with built-in games;\r\n- \"examples\" with built-in examples;\r\n- \"projects\" with user-defined projects.\r\n\r\n\r\n\r\n\r\n\r\nIf you have correctly installed just Makefile, Python and any compiler (e.g. GCC) in a POSIX environment, it should already be possible to minimally use Cross-Lib to build the Chase game by running the following command inside the \"src\" directory (you will have to make sure that the \".\" directory is in your PATH environment variable otherwise you will have to explicitly use \"./xl\" instead of \"xl\"):\r\n\r\n\"xl chase stdio\", which will build the game Chase in turn-based mode for the target if the compiler (e.g., the native console if you use GCC).\r\nAs stdio has no support for immediate input, the game will be, at best, barely playable in turn-based mode. \r\nMost games won't be playable at all, because this can only work for games that are aware of this (e.g., chase) where the code invokes a specific refresh command to re-display the content of the screen like a slide-slow. \r\nThis can be used to test if the games compile with a given compiler.\r\n\r\n\r\n\r\n\r\n\r\n## HOW TO USE THE XL SCRIPT\r\n\r\nIf just one of the supported compilers is installed, Cross-Lib can be used with the \"xl\" Python script inside the \"src\" directory.\r\nIf GCC with ncurses is installed, a native version of the games and examples can be built with:\r\n\r\n\"xl build \\<project name\\>\" or just \"xl \\<project name\\>\"\r\n\r\nFor example \r\n\r\n\"xl snake\" \r\n\r\nbuilds the \"snake\" game for the native console.\r\n\r\n\r\n\r\nIf a cross compiler (CC65, Z88DK, CMOC, CC6303, LCC1802, etc) is installed, the games and examples can be built for the corresponding systems.\r\n\r\nFor example, if CC65 is installed, \r\n\r\n\"xl horde apple2\" \r\n\r\nbuilds the \"horde\" game for the Apple // with 6-color HGR graphics. \r\n\r\n\r\n\r\nThe \"xl\" script takes several commands. In particular you can see a list of the available commands with \"xl commands\".\r\n\r\nYou can get an explanation of each command with examples with \r\n\r\n\"xl help \\<command\\>\".\r\n\r\n\r\n\r\nIf we want to create a new project, we need to use \r\n\r\n\"xl create \\<project name\\>\", \r\n\r\nwhich will create a project with a trivial \"hello world\" example inside the \"projects\" directory.\r\n\r\nWe can also start with a template code for a game if we pass the additional parameter \"game\": \r\n\r\n\"xl create \\<project name\\> game\".\r\n\r\n\r\n\r\n \r\n\r\n## HELLO WORLD\r\n\r\nCoding with Cross-Lib is like normal coding in C (with ANSI C89) with the only addition that all input/output is done through Cross-Lib APIs.\r\n\r\nCross-Lib comes with many examples in the src/examples/ directory as well as a few games in the src/games directory.\r\nBoth of which can be used to learn how to code with Cross-Lib.\r\nWe could start to look at src/examples/helloworld/, whose main.c files contains: \r\n\r\n\r\n```\r\n#include \"cross_lib.h\"\r\n\r\nint main(void)\r\n{        \r\n    _XL_INIT_GRAPHICS();\r\n    _XL_CLEAR_SCREEN();\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINT_CENTERED(\"HELLO WORLD\");\r\n    while(1){};\r\n    return EXIT_SUCCESS;\r\n}\r\n```\r\n\r\n\r\nWe remark that all Cross-Lib specific functions start with the _XL_ prefix: \r\n\r\n1. _XL_INIT_GRAPHICS() required to initialize the display ;\r\n\r\n2. _XL_CLEAR_SCREEN()  which cleans the content of the screen ;\r\n\r\n3. _XL_SET_TEXT_COLOR(_XL_WHITE) which defines the color to be used by the text and characters ;\r\n\r\n4. _XL_PRINT_CENTERED(\"HELLO WORLD\") which displays \"HELLO WORLD\" on the center of the screen.\r\n\r\n\r\n\r\nIf we want to use one of the examples or games as a starting point we can clone the project with:\r\n\r\nxl clone \\<existing project to clone\\> \\<new project name\\>\r\n\r\n\r\n\r\nOr we can start from (almost) scratch with\r\n\r\nxl create \\<new project name\\>\r\n\r\n\r\n\r\nOnce we have a new project, we can build it with\r\n\r\nxl \\<project\\> \\<target\\>\r\n\r\n\r\n\r\nor\r\n\r\n\r\n\r\nxl \\<project\\>\r\n\r\nif we want to build the project for the native terminal.\r\n\r\n\r\n\r\nWe can run the project for the native terminal with:\r\n\r\nxl run \\<project\\>\r\n\r\n\r\n\r\nFor example we could run these commands:\r\n\r\nxl clone helloworld myhelloworld [to clone helloworld and create myhellworld]\r\n\r\nWe modify the project myhelloworld (found inside ./src/projects/myhelloworld/)\r\n\r\nxl build myhelloworld (or equivalently xl myhelloworld) [to build a native binary of the new project]\r\n\r\nxl run myhelloworld [to run the new project]\r\n\r\nxl build myhelloworld c64 [to build the same project for the Commodore 64]\r\n\r\n\r\n\r\n\r\n\r\n## CODING WITH ABSTRACTIONS\r\n\r\n\r\n\r\nIn order to code with Cross-Lib for all targets at the same time, Cross-Lib uses several abstractions.\r\n\r\n\r\n\r\nGraphics is only tile-based. In the code, tiles are abstract as their exact shape will depend on the target type.\r\nThe game code only sees tiles as macros _TILE_0, _TILE_1, _TILE_2, etc.\r\n\r\nEach concrete target will interpret tiles in different ways depending on whether the target can or cannot assign free shapes to tiles and \r\non the number of pixels that define tiles on that system.\r\n\r\n\r\nSound is currently only limited to few sound effects that are rendered somehow similarly across multiple targets.\r\n\r\n\r\n\r\nInput is limited to 4 directions and a single fire button. On each target this will be mapped to either 5 keys (usually I J K L SPACE)\r\nor the main joystick/controller/gamepad.\r\n\r\n\r\n\r\nRunning \"xl manual\" will output a manual with all commands.\r\n\r\n\r\n\r\n\r\n\r\n## MAIN DEVELOPMENT FLOW\r\n\r\n\r\n\r\nProducing \"universal\" games with Cross-Lib for the developer boils down to these main steps:\r\n\r\n- Creating or cloning a project (with xl create or xl clone);\r\n\r\n- Writing the abstract game code in ANSI C with Cross-Lib APIs for input/output;\r\n\r\n- Manually creating or automatically importing abstract assets (with commands such as e.g., xl shapes, xl import, xl rip, xl tile);\r\n\r\n- Running the xl script to build the project for one or multiple targets (with xl build).\r\n\r\n\r\n\r\nThe \"xl build \\<project\\> \\<target\\>\" command (or its equivalent short form \"xl \\<project\\> \\<target\\>\") \r\n\r\nexecutes one or several Makefile targets, which generally:\r\n\r\n- generate a concrete asset file from the abstract asset files\r\n\r\n- compile the source code (game code and target-specific portions of Cross-Lib library);\r\n\r\n- include or link the asset files with the compiled source code;\r\n\r\n- if necessary a tool is used to create a usable disk/floppy/rom/cartridge image (this is the case for the Apple // for which disk images are generated).\r\n\r\n\r\n\r\n[INSERT FLOW PICTURE HERE]\r\n\r\n\r\n\r\n\r\n\r\n## GRAPHICS\r\n\r\n\r\n\r\nGraphics is performed by displaying \"tiles\", whose shape can be defined. The number of tiles is currently limited to 27 but future versions of Cross-Lib will overcome this constraint.\r\nWe can also display \"characters\" (letters, digits and the space character) but their shape is (currently) fixed.\r\nCharacters and tiles have the same size. Characters are used for the text, whereas tiles are used for graphics.\r\n\r\n\r\nASCII-only targets will be able to only assign ASCII shapes to tiles, whereas targets with real graphics will assign a \"freely defined\" shape to tiles.\r\n\r\n\r\n\r\nCurrently each tile only has one tile-specific foreground color and a common background color.\r\nThe definition of their shapes is not done in the C code.\r\nInstead it is done inside the \\<project\\>/tiles directory, which contains sub-directories with files with tile definitions for the ASCII case and \r\nfor the graphics-enabled targets, e.g., 8x8 (for most targets), 7x8 (for the Apple //), 6x8 (for the Oric series and NTSC COMX-35), etc... \r\n\r\n\r\n\r\nIn the aforementioned files the shapes are described by either ASCII codes for ASCII-only targets or sequences of bytes for graphics-enabled targets.\r\n\r\nThese files can be:\r\n\r\n1. edited manually or \r\n\r\n2. automatically imported from several programs such as CharPad [chPad] (with \"xl import \\<file\\> \\<project\\>\") or \r\n\r\n3. automatically ripped from BASIC or Assembly listings (with \"xl rip \\<file\\> \\<project\\>\") or\r\n\r\n4. generated by some simple \"pictorial\" text files with drawings made of \"#\" and \".\" characters \r\n\r\n(with \"xl shapes \\<project\\> \\<x_size\\> \\<y_size\\> or \"xl tile \\<file\\> \\<project\\> \\<tile number\\>\".\r\n\r\n\r\n\r\nYou can see how to use these commands by running \"xl help \\<command\\>\".\r\n\r\n\r\n\r\nIn the game code tile graphics is primarily performed by invoking these functions (to display or delete tiles):\r\n\r\nvoid _XL_DRAW_TILE(uint8_t x, uint8_t y, uint8_t tile_number, uint8_t tile_color);\r\n\r\nvoid _XL_DELETE(uint8_t x, uint8_t y);\r\n\r\n\r\n\r\n\r\n\r\n## SOUND\r\n\r\n\r\n\r\nSound is even more limited than graphics and it is restricted to a few predefined effects.\r\n\r\nThe sound commands have this form:\r\n\r\nvoid _XL_\\<effect name\\>_SOUND(void);\r\n\r\n\r\n\r\nFor example:\r\n\r\nXL_EXPLOSION_SOUND() produces an explosion sound (or something vaguely similar to it depending on the target)\r\n\r\n\r\n\r\n\r\n## INPUT\r\n\r\n\r\nInput is limited to four directions and a single fire button.\r\n\r\nThe primary input APIs are:\r\n\r\nuint8_t _XL_INPUT(void);\r\n\r\nuint8_t _XL_LEFT(uint8_t input);\r\n\r\nuint8_t _XL_RIGHT(uint8_t input);\r\n\r\nuint8_t _XL_UP(uint8_t input);\r\n\r\nuint8_t _XL_DOWN(uint8_t input);\r\n\r\nuint8_t _XL_FIRE(uint8_t input);\r\n\r\n\r\n\r\nwhere _XL_INPUT polls the input and the other functions are used to determined the specific input.\r\n\r\n\r\n\r\n\r\n\r\n## GRAPHICS, SOUNDS AND INPUT IN ONE EXAMPLE\r\n\r\n\r\n\r\nInside the src/examples/animate directory you can find the following example that could be used as a blueprint for a simple game.\r\n\r\nThis simple example has graphics, input and sound.\r\n\r\nWhen compiled for any of the possible systems, it will produce the very same program but the exact tile shapes and sounds will depend on the target.\r\n\r\nFor example it can be compiled for the native console with:\r\n\r\nxl animate\r\n\r\nor for the Apple // with\r\n\r\nxl animate apple2\r\n\r\nor for the MSX with\r\n\r\nxl animate msx\r\n\r\n\r\n```\r\n#include \"cross_lib.h\"\r\n\r\n\r\n\r\n#define MIN_X 1\r\n\r\n#define MAX_X (XSize-2)\r\n\r\n#define MIN_Y 1\r\n\r\n#define MAX_Y (YSize-2)\r\n\r\n#define DOWN_TILE  _TILE_0\r\n\r\n#define UP_TILE    _TILE_1 \r\n\r\n#define RIGHT_TILE _TILE_2\r\n\r\n#define LEFT_TILE  _TILE_3 \r\n\r\n#define FIRE_TILE  _TILE_4\r\n\r\n\r\n\r\nint main(void)\r\n\r\n{ \r\n\r\n uint8_t x;\r\n\r\n uint8_t y;\r\n\r\n uint8_t input;\r\n\r\n uint8_t tile;\r\n\r\n\r\n\r\n _XL_INIT_GRAPHICS();\r\n\r\n _XL_INIT_SOUND();\r\n\r\n _XL_INIT_INPUT();\r\n\r\n\r\n\r\n _XL_CLEAR_SCREEN();\r\n\r\n\r\n\r\n x = XSize/2;\r\n\r\n y = YSize/2;\r\n\r\n tile = DOWN_TILE;\r\n\r\n while(1)\r\n\r\n {\r\n\r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n\r\n        _XL_PRINTD(0,0,3,x);\r\n\r\n        _XL_PRINTD(5,0,3,y);\r\n\r\n        \r\n\r\n        input = _XL_INPUT();\r\n\r\n        if(_XL_UP(input))\r\n\r\n        {\r\n\r\n            _XL_DELETE(x,y);\r\n\r\n            tile = UP_TILE;\r\n\r\n            --y;\r\n\r\n        }\r\n\r\n        else if (_XL_DOWN(input))\r\n\r\n        {\r\n\r\n            _XL_DELETE(x,y);\r\n\r\n            tile = DOWN_TILE;\r\n\r\n            ++y;\r\n\r\n        }\r\n\r\n        else if (_XL_LEFT(input))\r\n\r\n        {\r\n\r\n            _XL_DELETE(x,y);\r\n\r\n            tile = LEFT_TILE;\r\n\r\n            --x;\r\n\r\n        }\r\n\r\n        else if(_XL_RIGHT(input))\r\n\r\n        {\r\n\r\n            _XL_DELETE(x,y);\r\n\r\n            tile = RIGHT_TILE;\r\n\r\n            ++x;\r\n\r\n        }\r\n\r\n        else if(_XL_FIRE(input))\r\n\r\n        {\r\n\r\n            _XL_DRAW(x,y,FIRE_TILE,_XL_WHITE);\r\n\r\n            _XL_EXPLOSION_SOUND();\r\n\r\n            _XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);  \r\n\r\n        }\r\n\r\n        \r\n\r\n        if((y>=MIN_Y)&&(y<=MAX_Y)&&(x>=MIN_X)&&(x<=MAX_X))\r\n\r\n        {\r\n\r\n            _XL_DRAW(x,y,tile,_XL_WHITE);\r\n\r\n        }\r\n\r\n        else\r\n\r\n        {\r\n\r\n            _XL_DELETE(x,y);\r\n\r\n            _XL_ZAP_SOUND();\r\n\r\n            _XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);  \r\n\r\n            x = XSize/2;\r\n\r\n            y = YSize/2;\r\n\r\n        }    \r\n\r\n        _XL_SLOW_DOWN(4*_XL_SLOW_DOWN_FACTOR);    \r\n\r\n    }\r\n\r\n    return EXIT_SUCCESS;\r\n\r\n}\r\n\r\n```\r\n\r\n\r\n\r\n## THE GAMES\r\n\r\n\r\n\r\nCross-Lib comes with some games I have written with it. As for July 2023, it includes seven games:\r\n\r\n- Shuriken\r\n\r\n- Verbix\r\n\r\n- Horde\r\n\r\n- Snake\r\n\r\n- Bomber\r\n\r\n- Shoot\r\n\r\n- Chase\r\n\r\n\r\n### SHURIKEN\r\n\r\nShuriken is somehow similar to PAC-MAN in that you need to collect all diamonds to complete non-boss levels while you need to avoid being hit by the shurikens.\r\nIn boss levels you have to additionally kill all the shurikens by using the movable blocks that are deadly for them.\r\nYou can also collect special items that make you temporarily invincible (white ring) or that slow down the shurikens (blue large diamond).\r\n\r\n\r\n### VERBIX\r\n\r\n\r\n\r\nVerbix is a Scrabble-like game that looks also a bit like Tetris.\r\nIn this game you have to form valid 5-letter English words on the bottom row before the tower of letters reaches the top level.\r\nYou can rotate the bottom row or any of the columns by moving in the 4 directions. You press fire to confirm the word.\r\n\r\n\r\n\r\n### HORDE\r\n\r\nHorde is a zombie-themed shooter with many power-ups and several different enemies, levels and special items to pick.\r\n\r\nYou control a bow with a limited number of arrows. You get more arrows as a possible reward for killing some zombies.\r\nIf you run out of arrows, you will get a few arrows after a short period.\r\nIn each level you are confronted with a horde of zombies that become harder as you progress.\r\n\r\n\r\n\r\n### SNAKE\r\n\r\nSnake is my personal interpretation of a hybrid game between the arcade game Nibbler and the Nokia cell phone game Snake to which I have added more game elements. \r\nAs in Nibbler the walls do not kill you and can be used to stop you and let you better control your movements.\r\nAs in Nokia Snake the main goal is to eat apples. If you do not eat any apple for too long, the snake becomes faster and harder to control, consumes its energy and eventually dies.\r\nIn each level you are also confronted with mines that kill you if the snake's head touches them.\r\nAs a secondary goal you can collect rings. If you manage to get 3 or more rings without dying on a level, you will be rewarded with bonus items.\r\nThe game has several secrets and level to discover.\r\n\r\n\r\n### BOMBER\r\n\r\nBomber is a mini-game and clone of Air Attack (aka Blitz) that first appeared on the Commodore Pet. \r\nThe game concept is horrible (not my own concept) but it can be addictive nevertheless.\r\nYour plane has to carpet-bomb an entire city in order to safely land on the road. Let us assume the city has no inhabitants.\r\nYou do not control the plane and can only press fire to drop a bomb at a time.\r\n\r\n\r\n\r\n### SHOOT\r\n\r\nShoot is a shooter somehow similar to Robotron. You have to kill a horde of ghosts on each level.\r\nYou can kill them by hitting them many times or by hitting them enough times to push them against the walls (mortal only for them).\r\nYou can also kill them by placing mines but you need to get the mine item (with 3 mines). A mine kills instantly common enemies.\r\nAt the end of each level when only few ghosts are left or if you survive without killing enemies long enough or in boss levels, you are confronted by some hard-to-kill skull-shaped enemies.\r\nAs a secondary goal you can complete the level by killing the skulls before the last ghosts and by doing so you unlock extra items and secrets in the next levels.\r\nDestroying the missile bases can also unlock items.\r\nThe game has many secrets, levels and items to discover.\r\n\r\n\r\n### CHASE\r\n\r\nCross Chase is somehow similar to Daleks / Gnome Robots. You need to lure your pursuers into the mines.\r\nThe main difference is that it is a real-time game and that it has several secrets items and power-ups to pick.\r\nSimilarly to Shoot, at the end of each level or in boss levels, you are confronted by a boss (a skull), which can only be killed by several bullets fired by the gun item.\r\nYou can complete the level by killing the skull before the last enemy and by doing so you unlock extra items and secrets in the next levels.\r\nDestroying the missile bases can also unlock items.\r\n\r\n\r\n\r\n\r\n## FUTURE DEVELOPMENT\r\n\r\nCross-Lib is actively developed. Planned future developments are: \r\n\r\n- support for more targets and architectures (e.g., Apple ||gs, Apple 1, etc.);\r\n\r\n- improved targets (e.g, DHGR mode for the 80-column capable Apple // models);\r\n\r\n- improved APIs (more tiles, improved sounds, etc.);\r\n\r\n- simplified setup (docker file with all compilers, tools and dependencies);\r\n\r\n- improved scripts to handle graphics assets;\r\n\r\n- improved support for the native target; \r\n\r\n- more games.\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n## BIBLIOGRAPHY\r\n\r\n\r\n\r\n[ack] ACK, Tanenbaum A., Jacobs C. et al., C compiler for Intel 8088, PDP 11, CP/M-80,etc., https://github.com/davidgiven/ack\r\n\r\n\r\n\r\n[app] Cross Chase: A Massively 8-bi Multi-System Game, Caruso F., Call-A.P.P.L.E., vol. 28, No. 1, Feb 2018, pages 31-33, http://www.callapple.org\r\n\r\n\r\n\r\n[c8b] 8-bit C, Caruso F., https://github.com/Fabrizio-Caruso/8bitC\r\n\r\n\r\n\r\n[cc6303] CC6303, Cox A., C compiler for the Motorola 6800 and 6803, https://github.com/EtchedPixels/CC6303\r\n\r\n\r\n\r\n[cc65] CC65, C compiler for the MOS 6502, https://sourceforge.net/projects/cc65/\r\n\r\n\r\n\r\n[ceo] Cross Chase, Caruso F., CEO-MAG, No. 327-328, Juillet-Août 2017, https://ceo.oric.org/\r\n\r\n\r\n\r\n[chPad] CharPad, Subchrist Software, https://subchristsoftware.itch.io/charpad-c64-free\r\n\r\n\r\n\r\n[cmoc] CMOC, Sarrazin P., C compiler for the Motorola 6809, https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html\r\n\r\n\r\n\r\n[effc] Efficient C Code for 8-bit Microcontrollers, Jones N., https://barrgroup.com/embedded-systems/how-to/efficient-c-code\r\n\r\n\r\n\r\n[m20] Z8KGCC, Groessler C., GCC modded for the Olivetti M20, http://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc.html\r\n\r\n\r\n\r\n[lcc1802] LCC1802, Rowe B., C compiler for the RCA 1802, https://github.com/bill2009/lcc1802\r\n\r\n\r\n\r\n[prog] Cross-Lib, Caruso F., Programmez! Hors Série #6, pages 72-82.\r\n\r\n\r\n\r\n[rg] Interview to F. Caruso about Cross-Lib, RetroGamer #240, page 100, https://www.retrogamer.net/\r\n\r\n\r\n\r\n[st] GCC, Rivière V., modded for the Atari ST, http://vincent.riviere.free.fr/soft/m68k-atari-mint/\r\n\r\n\r\n\r\n[ti] GCC, (Insomnia), modded for the TI99/4A, http://atariage.com/forums/topic/164295-gcc-for-the-ti\r\n\r\n\r\n\r\n[un8] 8-Bit Unity, Beaucamp A. (8-bit Dude), http://8bit-unity.com/\r\n\r\n\r\n\r\n[vbcc] VBCC, Barthelmann V., C compiler for the BBC Micro, BBC Master, Amiga, etc., http://www.compilers.de/vbcc.html\r\n\r\n\r\n\r\n[xtc68] XTC68, Hudson J., C compiler Sinclair QL, https://github.com/stronnag/xtc68\r\n\r\n\r\n\r\n[z88dk] Z88DK, C compiler and dev-kit for the Zilog 80 and Intel 8080 architectures.\r\n"
  },
  {
    "path": "docs/GAMES.md",
    "content": "# THE GAMES\r\n\r\n\r\n-------------------------------------------\r\n## TREX\r\n![Vic20](/snapshots/vic20_trex.jpg)\r\n\r\nCONTROLS: either SPACE or FIRE.\r\n\r\n1. Commodore Vic 20: \r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/trexBETA/Xtrex_vic20_exp_16k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXtrexti.bin\r\n\r\n3. MSX:\r\nhttps://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/trexBETA/Xtrex_msx_16k.rom\r\n\r\n4. Video Technology Laser 500: \r\nhttps://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/trexBETA/Xtrex_laser500_keyboard.bin\r\n\r\n\r\n-------------------------------------------\r\n## STINGER\r\n![Vic20](/snapshots/XStinger_VIC20_gameplay.jpg)\r\n![Vic20](/snapshots/XStinger_VIC20_title.jpg)\r\n\r\n\r\nCONTROLS: either the joystick or J (move lefte),  L(move right), SPACE (check word)\r\n\r\n1. Commodore Vic 20: \r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/stinger/Xstinger_vic20_exp_16k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXstingerti.bin\r\n\r\n3. MSX:\r\nhttps://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/stinger/Xstinger_msx_16k.rom\r\n\r\n4. Video Technology Laser 500: \r\nhttps://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/stinger/Xstinger_laser500.bin\r\n\r\n\r\n-------------------------------------------\r\n## SHURIKEN\r\n![Vic20](/snapshots/XShuriken_Vic20_gameplay.jpg)\r\n![Vic20](/snapshots/XShuriken_Vic20_title.jpg)\r\n\r\n\r\nCONTROLS: either the joystick or I (up rotate),  J (move left/left rotate), K (down rotate), L(move right, right rotate), SPACE (check word)\r\n\r\n1. Commodore Vic 20: \r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/shuriken/Xshuriken_vic20_exp_16k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXshurikenti.bin\r\n\r\n3. MSX:\r\nhttps://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/shuriken/Xshuriken_msx_16k.rom\r\n\r\n4. Video Technology Laser 500: \r\nhttps://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/shuriken/Xshuriken_laser500.bin\r\n\r\n\r\n-------------------------------------------\r\n## VERBIX\r\n![Vic20](/snapshots/XVerbix_Vic20_gameplay.jpg)\r\n![Vic20](/snapshots/XVerbix_Vic20_title.jpg)\r\n\r\nCross Verbix is a word game somehow similar to Scrabble and to a much lesser extent similar to Tetris: you must construct correct English words by rotating columns of letters or by rotating the bottom row before the letters reach the top level.\r\nYou can get extra points if you complete the level earlier by lowering the stack of letters below the second row.\r\n\r\nCONTROLS: either the joystick or I (up rotate),  J (move left/left rotate), K (down rotate), L(move right, right rotate), SPACE (check word)\r\n\r\n1. Commodore Vic 20: \r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_vic20_exp_16k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXverbixti.bin\r\n\r\n3. MSX:\r\nhttps://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_msx_16k.rom\r\n\r\n4. Video Technology Laser 500: \r\nhttps://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_laser500.bin\r\n\r\n5. Video Technology Laser 200 / VZ200: \r\nhttps://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_vz200_24k.vz\r\n\r\n\r\n## HORDE\r\n\r\n![CPC](../snapshots/XHorde_CPC.png)\r\n![Atari](../snapshots/XHorde_A8.png)\r\n![SMS](../snapshots/XHorde_SMS.png)\r\n\r\nCross Horde is a zombie shooter with several different enemies, levels and power-ups and items to pick.\r\n\r\nYou die if a zombie reaches the wall behind the bow or if a zombie hits you with its bullets.\r\n\r\nIn order to improve your fire power you can pick up the rings that are dropped when some zombies die.\r\nRings will improve in this order:\r\n- the range of your bow\r\n- the speed of your bow\r\n- the number of arrows thrown at once \r\n- the power of your bow\r\nAfter these improvements, the rings will be necessary to unblock special items and to achieve the temporary \"hyper\" power.\r\n\r\nCONTROLS: either the joystick or J (left), L (right), SPACE (fire).\r\n\r\n1. Commodore Vic 20: \r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vic20_exp_8k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXhordeti.bin\r\n\r\n3. Commodore 64: \r\nhttps://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_c64.prg\r\n\r\n4. MSX 1:\r\nhttps://homebrew.file-hunter.com/index.php?id=crosshorde\r\n\r\n5. Sinclair ZX Spectrum 48K: \\\r\nhttps://spectrumcomputing.co.uk/playonline.php?eml=2&downid=140691 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=140691\r\n\r\n6. Video Technology Laser 200 / VZ200: \r\nhttps://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vz200_24k.vz\r\n\r\n7. Video Technology Laser 500: \r\nhttps://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_laser500.bin\r\n\r\n8. Commodore 264 series (C16/C116/C+4):\r\nhttps://plus4world.powweb.com/play/cross_horde\r\n\r\n\r\nBinaries are in the release section (Click on Assets): \\\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XHorde1.0\r\n\r\n-------------------------------------------\r\n\r\n## SNAKE\r\n\r\n![MSX](../snapshots/XSnake_MSX2.png)\r\n![GB](../snapshots/XSnake_GB.png)\r\n![C64](../snapshots/XSnake_C64_intro.png)\r\n\r\nThis my own re-interpretation of Nibbler (arcade) and Snake (primarily a cell phone game), to which I have added many more game elements.\r\n\r\nYou have to go through 32 levels (with 16 different maps) + an optional secret level (with its own map).\r\nTo complete a level you have to eat all the apples while:\r\n- avoiding your own tail and body\r\n- avoiding the fixed and bouncing mines\r\n- avoiding to starve by losing your energy (eat apples to prevent this).\r\nAs you starve, the snake moves faster and faster.\r\n\r\nWalls do not kill you and let you pause the game and think about your next move.\r\n\r\nYou can also catch special items that will help in your quest:\r\n- ring (collect 3 or even 4 for extra points and to spawn more special items such as \"freeze\")\r\n- freeze (special item that freezes the mines and restores your energy\r\n- $ (extra points... but also some secret effects if you collect many)\r\n- extra life (special and hard to unlock item that gives 1 extra life)\r\n\r\nCONTROLS: either the joystick or I J K L to move and SPACE to start/continue.\r\n\r\nYou can play the game online:\r\n\r\n1. Commodore Vic 20: \\\r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vic20_exp_16k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXsnaketi.bin\r\n\r\n3. Commodore 64: \\\r\nhttps://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_c64.prg\r\n\r\n4. MSX 1: \\\r\nhttps://homebrew.file-hunter.com/index.php?id=crosssnake\r\n\r\n5. Sinclair ZX Spectrum 48K: \\\r\nhttps://spectrumcomputing.co.uk/playonline.php?eml=2&downid=137608 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137608\r\n\r\n6. Video Technology Laser 200 / VZ200: \\\r\nhttps://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vz200_24k.vz\r\n\r\n7. Video Technology Laser 500: \\\r\nhttps://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_laser500.bin\r\n\r\n8. Commodore 264 series (C16/C116/C+4): \\\r\nhttp://plus4world.powweb.com/play/cross_snake_2_0\r\n\r\nBinaries are in the release section (Click on Assets): \\\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XSnake2.0\r\n\r\n-------------------------------------------\r\n\r\n## BOMBER\r\n\r\n![Atari](../snapshots/XBomber_A8.png)\r\n \r\nThe game's goal is to destroy all buildings so that you can land on an empty road.\r\nThe game is a clone of Air Attack (aka Blitz) game that was first developed on the Commodore Pet.\r\nThe game is controlled by the single fire button (first joystick button for targets with joystick input and space key for targets with keyboard input).\r\nYour score depends on the number of building destroyed, the level reached and how fast you complete each single level.\r\nThe game has 9 levels and it ends after the eighth level.\r\n\r\nCONTROLS: either the joystick fire button or SPACE.\r\n\r\nYou can play the game online:\r\n\r\n1. Commodore Vic 20: \\\r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vic20_exp_8k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXbomberti.bin\r\n\r\n3. Commodore 64: \\\r\nhttps://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_c64.prg\r\n\r\n4. MSX 1: \\\r\nhttps://homebrew.file-hunter.com/index.php?id=crossbomber\r\n\r\n5. Sinclair ZX Spectrum 48K: \\\r\nhttps://spectrumcomputing.co.uk/playonline.php?eml=2&downid=137605 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137605\r\n\r\n6. Video technology Laser 200 / VZ200: \\\r\nhttps://nippur72.github.io/laser310-emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vz200_24k.vz\r\n\r\n7. Video technology Laser 500: \\\r\nhttps://nippur72.github.io/laser500emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/bomber/Xbomber_laser500.bin\r\n\r\n8. Commodore 264 series (C16/C116/C+4): \\\r\nhttp://plus4world.powweb.com/play/cross_bomber\r\n\r\n\r\nBinaries are in the release section (Click on Assets): \\\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XBomber\r\n\r\n-------------------------------------------\r\n\r\n## SHOOT \r\n\r\n![SMS](../snapshots/XShoot_sms.png)\r\n\r\nThe game's goal is to kill all common enemies or kill all 4 \"skulls\". \r\nCommon enemies can be killed quickly if pushed against the walls by shooting at them.\r\nThe \"skulls\" and the boss cannot be pushed and are harder to kill.\r\nYou have to avoid all enemies, rockets and chasing missiles.\r\nAll flashing items have positive effects and can grant you special powers. \r\nYour bullets have a limited power that can be improved by catching the special fire power item. \r\nYou can also fetch the mine item that grants you 3 powerful mines to use against all your enemies.\r\nDiscover the 12 items. Some items are secret. In total the game has 16 secrets.\r\nYou can unlock the 16 secrets by shooting at the skulls and at the missile and rocket bases in different ways.\r\nThe game has 16 different levels including 2 boss levels + 1 secret level.\r\n\r\nCONTROLS: either the joystick or I J K L to move and SPACE to fire.\r\n\r\nYou can play the gamne online:\r\n\r\n1. Commodore VIC 20: \\\r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/XShoot_vic20_exp_16k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXshootti.bin\r\n\r\n3. Commodore 64: \\\r\nhttps://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_c64.prg \r\n\r\n4. MSX 1: \\\r\nhttps://homebrew.file-hunter.com/index.php?id=crossshoot\r\n\r\n5. Sinclair ZX Spectrum 48K: \\\r\nhttps://spectrumcomputing.co.uk/playonline.php?eml=2&downid=137606 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137606\r\n\r\n6. Video Technology Laser 200 / VZ 200: \\\r\nhttps://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_vz200_24k.vz\r\n\r\n7. Video Technology Laser 500: \\\r\nhttps://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_laser500.bin\r\n\r\n8. Commodore 264 series (C16/C116/C+4): \\\r\nhttp://plus4world.powweb.com/play/cross_shoot\r\n\r\n\r\nBinaries are in the release section (Click on Assets): \\\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XShootRebuild\r\n\r\n-------------------------------------------\r\n\r\n## CHASE \r\n\r\n![Atari](../snapshots/XChase_A8.png)\r\n\r\nThe game's goal is to lure the \"ghosts\" into the mines and possibly kill the \"skull\" by repeatedly using the gun.\r\nYou have to avoid all enemies, the mines, all walls, rockets and chasing missiles.\r\nAll flashing items have positive effects and can grant you some special powers. Discover the 10 items.\r\nIf you use the gun against the skull and/or the missiles and rockets, you can unlock some special secret items.\r\nThere are 20 different levels including 4 boss levels.\r\n\r\nCONTROLS: either the joystick or I J K L (to move) and SPACE to fire.\r\n\r\nYou can play the game online for different systems:\r\n\r\n1. Commodore Vic 20: \\\r\nhttps://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vic20_exp_16k.prg\r\n\r\n2. TI99/4A:\r\nhttps://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXchaseti.bin\r\n\r\n3. Commodore 64: \\\r\nhttps://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_c64.prg\r\n\r\n4. MSX 1: \\\r\nhttps://homebrew.file-hunter.com/index.php?id=crosschase\r\n\r\n5. Sinclair ZX Spectrum 48K: \\\r\nhttps://spectrumcomputing.co.uk/playonline.php?eml=2&downid=112056 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=112056\r\n\r\n6. Video Technology Laser 210 / VZ200 : \\\r\nhttps://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vz200_18k.vz\r\n\r\n7. Video Technology Laser 500: \\\r\nhttps://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_laser500.bin\r\n\r\n8. Commodore 264 series (C16/C116/C+4): \\\r\nhttp://plus4world.powweb.com/play/cross_chase_32k_v0_9\r\n\r\n\r\nBinaries are in the release section (Click on Assets): \\\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XChase\r\n\r\n\r\n \r\n"
  },
  {
    "path": "docs/GIOCHI.md",
    "content": "# I GIOCHI\r\n\r\n\r\nA secondo del sistema il gioco prevede \r\n- l'uso del joystick nella port più comune (in genere port 1 tranne che port 2 su C64) oppure \r\n- l'uso di I J K L per i movimenti e SPAZIO per FIRE. \r\n\r\n-------------------------------------------\r\n\r\n\r\n## CROSS HORDE\r\n\r\n![CPC](../snapshots/XHorde_CPC.png)\r\n![Atari](../snapshots/XHorde_A8.png)\r\n![SMS](../snapshots/XHorde_SMS.png)\r\n\r\nCross Horde è uno zombie shooter con diversi tipi di nemici, power-ups e oggetti da raccogliere.\r\n\r\nSi muore se uno zombie raggiunge il muro o se uno zombie ci colpisce con un suo proiettile.\r\n\r\nPer migliorare la potenza di fuoco si possono raccogliere gli anelli che alcuni zombie ci lasciano alla loro morte.\r\n\r\nGli anelli hanno questi effetti in ordine temporale:\r\n- aumenta la distanza dei nostri colpi\r\n- aumenta la velocità di ricarica del nostro arco\r\n- aumenta il numero di frecce lanciate contemporaneamente\r\n- aumenta la potenza di ogni freccia\r\n\r\nUna volta raggiunti tutti questi miglioramenti, gli anelli successivi saranno utile per sbloccare oggetti speciali e per raggiungere la potenza di fuoco \"hyper\".\r\n\r\n\r\nIl gioco è disponibile pure online:\r\n\r\n1. Commodore 264 series (C16/C116/C+4):\r\nhttps://plus4world.powweb.com/play/cross_horde\r\n2. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vic20_exp_8k.prg\r\n3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_c64.prg\r\n4. Video Technology Laser 200 / VZ200: https://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vz200_24k.vz\r\n5. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_laser500.bin\r\n\r\n-------------------------------------------\r\n\r\n## CROSS SNAKE - THE GAME\r\n\r\n![MSX](../snapshots/XSnake_MSX2.png)\r\n![GB](../snapshots/XSnake_GB.png)\r\n![C64](../snapshots/XSnake_C64_intro.png)\r\n\r\nE' la mia personale re-interpretazione del gioco arcade Nibbler e del gioco per cellulare Snake, alla quale io ho aggiunto ulteriori elementi di gioco.\r\n\r\nCi sono 32 livelli (su 16 mappe diverse) + un livello opzionale segreto (con la sua mappa).\r\n\r\nPer completare un livello si devono mangiare tutte le mele preveste dal livello:\r\n- evitando di mordere il proprio corpo;\r\n- evitando di colpire con la testa le mine (mobili e fisse);\r\n- evitando di morire di fame, cioè perdendo tutta l'energia (non trascorrere troppo tempo senza mangiare una mela).\r\n\r\nPiù tempo passa senza mangiare mele, più veloce si muoverà il serpente e questo rende i movimenti sempre più difficili.\r\n\r\nI muri non uccidono (come nel gioco arcade Nibbler) e tu possono essere utili per fermare il serpente per decidere la mossa successiva.\r\n\r\nPuoi catturare oggetti speciali:\r\n- anello (prendine 3 or anche 4 per punti extra e per generare altri oggetti speciali come \"freeze\");\r\n- freeze (oggetto speciale che congela temporaneamente le mine e rallenta il serpente);\r\n- $ (punti extra ma anche effetti speciali se se ne prendono molti)\r\n- vita extra (oggetto difficile da sbloccare)\r\n\r\n\r\nIl gioco è disponibile pure online:\r\n\r\n1. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_snake_2_0\r\n2. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vic20_exp_16k.prg\r\n3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_c64.prg\r\n4. MSX 1: https://homebrew.file-hunter.com/index.php?id=crosssnake\r\n5. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137608\r\n6. Video Technology Laser 200 / VZ200: https://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vz200_24k.vz\r\n7. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_laser500.bin\r\n\r\n\r\n-------------------------------------------\r\n\r\n## CROSS BOMBER - THE GAME\r\n\r\n![Atari](../snapshots/XBomber_A8.png)\r\n \r\nLo scopo del gioco è distruggere tutti gli edifici in maniera da potere atterrare.\r\n\r\nTrattasi di un clone di Air Attack (anche noto come Blitz) che fu sviluppato la prima volta per Commodore Pet.\r\n\r\nIl gioco è controllato dal solo pulsate di fuoco (quindi FIRE o SPAZIO).\r\n\r\nIl punteggio dipende dal numero di edifici distrutti, dal livello raggiunto e da quanto velocemente si completi ogni singolo livello.\r\n\r\nIl gioco prevede 8 livelli e termina alla fine dell'ottavo livello.\r\n\r\nIl gioco è disponibile pure online:\r\n\r\n1. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_bomber\r\n2. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vic20_exp_8k.prg\r\n3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_c64.prg\r\n4. MSX 1: https://homebrew.file-hunter.com/index.php?id=crossbomber\r\n5. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137605\r\n6. Video technology Laser 200 / VZ200: https://nippur72.github.io/laser310-emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vz200_24k.vz\r\n7. Video technology Laser 500: https://nippur72.github.io/laser500emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/bomber/Xbomber_laser500.bin\r\n\r\n\r\n-------------------------------------------\r\n\r\n## CROSS SHOOT - THE GAME \r\n\r\n![SMS](../snapshots/XShoot_sms.png)\r\n\r\nLo scopo del gioco è di occidere tutti i nemici comuni oppure alternativamente uccidere i 4 teschi prima di avere ucciso tutti gli altri nemici. \r\nCompletare un livello uccidendo i 4 teschi permette di avere più punti e di sbloccare segreti, oggetti e bonus.\r\n\r\nI nemici comuni possono essere uccisi velocemente se spinti dai nostri proiettili contro i muri.\r\n\r\nDevi evitare tutti i nemici e i missili di vario tipo.\r\n\r\nTutti gli oggetti che lampeggiano hanno effetti positivi per noi e ci possono darci poteri speciali.\r\n\r\nI tuoi proiettili hanno una potenza limitata che puoi essere migliorata da un oggetto specifico.\r\n\r\nPuoi anche raccogliere un oggetto che ti dà 3 mine da usare contro tutti i nemici.\r\n\r\nPuoi scoprire 12 oggetti. Alcuni di questi oggetti sono segreti. Il gioco ha in totale 16 segreti (di vario tipo).\r\nPer trovare i segreti la strategia migliore è quella di distruggere diversi teschi e basi di missili.\r\n\r\nIl gioco prevede 16 diversi livelli compresi 2 boss + 1 livello segreto.\r\n\r\n\r\nIl gioco è disponibile pure online:\r\n\r\n1. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_shoot\r\n2. Commodore VIC 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/XShoot_vic20_exp_16k.prg\r\n3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_c64.prg \r\n4. MSX 1: https://homebrew.file-hunter.com/index.php?id=crossshoot\r\n5. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137606\r\n6. Video Technology Laser 200 / VZ 200: https://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_vz200_24k.vz\r\n7. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_laser500.bin\r\n\r\n-------------------------------------------\r\n\r\n## CROSS CHASE - THE GAME \r\n\r\n![Atari](../snapshots/XChase_A8.png)\r\n\r\nLo scopo del gioco è quello di fare finiti i nemici sulle mine e se possibile uccidere pure il teschio colpendolo con più colpi (dopo avere preso la pistola).\r\nIl gioco è quindi simile ad una versione real-time di Gnome Robots ma ha anche diversi elementi di gioco aggiuntivi.\r\n\r\nDevi evitare tutti i nemici, le mine, i muri e i missili di vario genere.\r\n\r\nTutti gli oggetti lampeggianti hanno effetti positivi e possono darti poteri speciali. Ci sono 10 oggeti diversi da scoprire e sbloccare.\r\n\r\nPer sbloccare alcuni segreti e oggetti speciali, dovrai usare la pistola contro il teschio e/o contro le basi dei missili.\r\n\r\nIl gioco prevde 20 livelli diversi compresi 4 boss.\r\n\r\nIl gioco è disponibile pure online:\r\n\r\n1. Atari LYNX: https://atarigamer.com/lynx/play/CrossChase/675300242\r\n2. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_chase_32k_v0_9\r\n3. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vic20_exp_16k.prg\r\n4. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_c64.prg \r\n5. MSX 1: https://homebrew.file-hunter.com/index.php?id=crosschase\r\n6. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=112056\r\n7. Video Technology Laser 210 / VZ200 : https://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vz200_18k.vz\r\n8. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_laser500.bin\r\n\r\n\r\n\r\n\r\n \r\n"
  },
  {
    "path": "docs/HARDWARE_AGNOSTIC_CODE.md",
    "content": "## HARDWARE-AGNOSTIC CODE\r\n\r\nThanks to Cross-Lib APIs, the game code can be *hardware-agnostic*.\r\nUsing only Cross-Lib APIs is not enough, though, as Cross-Lib covers targets that have different screen size, screen shape and targets that lack some hardware features such as graphics, colors, sounds.\r\n\r\n### ANSI C (A sub-set of)\r\nThe code has to be compiled by several different compilers that do not necessarily support the latest version of the C standard.\r\nTherefore it should be written in a sub-set of ANSI C89 that is common among all supported compilers.\r\n\r\nThis sub-set can be described as (mostly) ANSI C89 without:\r\n- `float` types;\r\n- `struct` copies, assignments, parameters (use pointers to `struct` instead);\r\n- dynamically allocated memory (`malloc`, `free`).\r\n\r\nMoreover for performance reasons it is better to avoid recursion (as this has an extreme high cost on MOS 6502 targets).\r\n\r\nSome C99 features are available:\r\n- Modern `//` comments are allowed.\r\n- `stdint.h` is not available but `uint8_t` and `uint16_t` are (with no need for extra include directive). \r\n\r\n\r\n### Screen size\r\nUsing Cross-Lib APIs is not enough as the screen size and shape may be different.\r\nCross-Lib exposes a constant `XSize` for the width of the screen and a constant `YSize` for the height of the screen.\r\nBoth these macros are measured in terms of numbers of *tiles* (see next section).\r\nThe game code should rely on fractions of `XSize` and of `YSize` and never use hard-coded sizes or use conditional directives to cover all sizes.\r\nBy doing so, upon compilation, the game will auto-adapt to the target's screen size.\r\n\r\n\r\n### Tile-based Graphics\r\n\r\nGraphics in Cross-Lib is tile-based as this is the only possible graphics that can be supported by all targets. \r\nFor targets with graphics, the shapes of tiles are only defined at compilation time and cannot be re-defined.\r\nSo, for targets with graphics, smoothly moving sprites can only be implemented as software sprites through pre-shifted tiles.\r\n\r\nMost targets with graphics have 8x8 pixel tiles but some other targets with graphics have different shapes.\r\nSo do not implement logic that only assumes 8x8 pixel tiles (e.g. when implementing software sprites with pre-shifted tiles). \r\nIf you want to support targets with no graphics (i.e., tiles are just mapped to ASCII characters), \r\nyou either avoid code that depends on tile shapes or if you, you have to implement an alternative version for non-graphics targets.\r\n\r\nFor example for the game Cross Snake you can see how it is rendered on the MSX 1 (graphics, sounds, colors) and on the Game Boy (graphics, sounds but no colors):\r\n\r\n![MSX](snapshots/XSnake_MSX2.png)\r\n![GB](snapshots/XSnake_GB.png)\r\n\r\nFor more snapshots we refer to: \r\n\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/SNAPSHOTS.md\r\n\r\n\r\n### Colors, Sounds and Graphics\r\nSome targets have no colors or no color on text, or no sounds, or no graphics.\r\nSo do not write any logic that relies only on the presence of colors/sounds/graphics; or if you do, use conditional directives to implement an alternative logic for targets with no colors/sounds/graphics.\r\n\r\n\r\n### Learn from the built-in games and tests\r\nCross-Lib comes with games and tests whose code can be used to learn how to code universal games.\r\n\r\nThe code of the games is in:\r\n\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/tree/master/src/games\r\n\r\nThe code of the examples is in:\r\n\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/tree/master/src/examples\r\n"
  },
  {
    "path": "docs/HOW_TO_ADD_A_NEW_GAME.md",
    "content": "## HOW TO ADD A NEW GAME\r\n\r\nAdding a new game <game_name> is just a matter of \r\n- copying src/Makefile.bomber into src/Makefile.<game_name>\r\n- copying src/games/bomber into src/games/<game_name>\r\n- add an exception to src/.gitignore for src/games/<game_name>/generated_assets\r\n\r\n"
  },
  {
    "path": "docs/HOW_TO_ADD_NEW_TARGET.txt",
    "content": "HOW TO COMPILE FOR A NEW TARGET\r\n\r\nAdding a new target computer with no sound, no joystick/gamepad inpu \r\nand no user-defined graphics can be as simple as just recompiling \r\nwith no modification if the compiler supports conio.h. \r\n\r\nIn most cases this won't produce the best result. So some little tuning\r\nis usually necessary.\r\n\r\nIf no conio is natively supported, some little conio wrapper and/or\r\nre-implementation of the display APIs in display_macros.c is necessary.\r\n\r\nHere we describe the simplest cases when conio is already available,\r\nno sound and no user defined graphics is expected.\r\n\r\nUsually you have to do the following steps:\r\n\r\n1. SCREEN SIZE\r\nBy default screen size is 16x16 cells.\r\nSo, if you want your target (e.g., NEW_TARGET) to use a different cell count.\r\nYou need to compile with the -D__NEW_TARGET__ option to let the code know you\r\nare compiling for NEW_TARGET\r\nedit display_macros.h and add something like:\r\n...\r\n#elif defined(__NEW_TARGET__)\r\n\t#define XSize <desired X cell resolution>\r\n...\r\n#elif defined(__NEW_TARGET__)\r\n\t#define YSize <desired Y cell resolution>\r\n...\r\n\r\n2. SPEED\r\nBy default no slow down is inserted in the main loop but in some cases your game\r\nmay run too fast.\r\nSo you will need to edit settings.h to add some slow-down:\r\n...\r\n#elif defined(__NEW_TARGET__)\r\n\t#define SLOW_DOWN\r\n\t#define GAME_SLOW_DOWN <number of slow-down cycles>\r\n...\r\n\r\n3. SLEEP\r\nIf the compiler does not implement the sleep function, you need to either implement one\r\nyourself or compile with -DNO_SLEEP if you want no sleep.\r\n\r\n4. KEYBOARD INPUT\r\nSome targets may detect key-presses as capital and others as small letters.\r\nYou can tune this in settings.h.\r\n\r\n5. INPUT \r\nSome targets may no implement getk to read the keyboard input.\r\nIn this case you need to provide a substitute in input_macros.h and input_macros.c\r\n\r\n\r\n\t"
  },
  {
    "path": "docs/HOW_TO_INSTALL_COMPILERS.txt",
    "content": "-------------------------------------------------------------------------------------------------------\r\nXTC68\r\n-------------------------------------------------------------------------------------------------------\r\n\r\n1. You need to clone \r\nhttps://github.com/stronnag/xtc68\r\n\r\n2. So you need a 32bit development environment on a x86-64 machine. \r\nSo, you may need to run:\r\n\"sudo apt install libc6-dev-i386\"\r\nor install the corresponding Cygwin package\r\nor just be in a 32-bit environment\r\n\r\n3. You need to unzip \r\n424frun1.zip \r\n(found inside the tools/xtc68 directory and originally taken from \"Runtime disk1\" \r\nin http://www.dilwyn.me.uk/c/index.html into the \"support\" directory which you find inside the newly cloned code.\r\n\r\ni.e., download the disk1 http://www.dilwyn.me.uk/c/424frun1.zip from http://www.dilwyn.me.uk/c/index.html and put it inside the \"support\" directory\r\n\r\n\r\n4. Run \"make all\"\r\n5. Run \"install.sh\"\r\n\r\nRemark:\r\nAfter linking and compilation the command will give us the number of bytes used for the \"dataspace\".\r\nIn order to use the binary inside an emulator we need to add some meta-data and choose an emulator, e.g.,\r\nQPC from https://www.kilgus.net/qpc/ :\r\n- run the following commands\r\n\"\r\nf$=“dos1_<path to binary in C: where you use '_' instead of '/'>“\r\nl=FLEN(\\f$)\r\nmem=RESPR(l)\r\nLBYTES f$,mem\r\nSEXEC ram1_<name in QL>,mem,l,<value >= dataspace bytes>\r\n\"\r\n- you will have the program in ram1 with the name chosen by the SEXEC command, which you run by selecting ram1 and the program.\r\n\r\n\r\n\r\n-------------------------------------------------------------------------------------------------------\r\nZ8K-GCC\r\n-------------------------------------------------------------------------------------------------------\r\n\r\n0. Under Linux 64-bit, you may need to install\r\nlibc6:i386, \r\nlibncurses5:i386, \r\nlibstdc++6:i386\r\nzlib1g:i386\r\n\r\n\r\n1. Use: z8kgcc-jan-19-2009-linux-fc9.tar\r\nfrom:\r\nftp://ftp.groessler.org/pub/chris/olivetti_m20/misc/z8kgcc/z8kgcc-jan-19-2009.tar.bz2\r\nor:\r\nhttp://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc-jan-19-2009-linux-fc9.tar.bz2\r\n\r\nMain site: http://www.z80ne.com/m20/index.php.\r\n\r\n2. Decompress it into /opt in order to have \"z8k-pcos-gcc\" inside /opt/z8kgcc-jan-2009/bin\r\n\r\n3. Add \"/opt/z8kgcc-jan-2009/bin\" to your PATH\r\nFor example by inserting the following line in .bashrc\r\nexport PATH=\"/opt/z8kgcc-jan-2009/bin:$PATH\"\r\n\r\n\r\nDisk images\r\nIn order to insert the binary inside a disk image download the tool m20floppy from  ftp://ftp.groessler.org/…/ol…/imgtools/m20floppy-0.61.tar.gz\r\nUse a bootable image from https://github.com/…/m…/tools/olivetti_m20/pcos20h_empty.img\r\n\r\nCompilation\r\n- to produce an object file do something like : qcc -c hello.c -o hello.o\r\n- to link and produce a binary \"a_out\" do something like qcc crt.o part1.o part2.o\r\n\r\n\r\n\r\n\r\n-------------------------------------------------------------------------------------------------------\r\nGCC for TI\r\n-------------------------------------------------------------------------------------------------------\r\nCompiler Installation:\r\ngit clone https://github.com/mburkley/tms9900-gcc\r\n\r\n(IMPORTANT:As of 2024/10/18 only 1.32 branch is stable)\r\ngit checkout 1.32\r\n\r\nsudo apt install build-essential libgmp-dev libmpfr-dev\r\ncd tms900-gcc\r\n./install.sh /opt/gcc4ti\r\n--------------------------------------------------------------------------------\r\nlibTi99:\r\ngit clone https://github.com/tursilion/libti99\r\n\r\nModify the Makefile to make it point to /opt/gcc/bin\r\ne.g.,\r\nTMS9900_DIR?=/opt/gcc4ti/bin\r\nELF2EA5_DIR?=/opt/gcc4ti/bin\r\nEA5_SPLIT_DIR?=/opt/gcc4ti/bin\r\n\r\nOnce the it has finished to build (even if with errors), make sure that \r\n- the header files are in /opt/gcc4ti/include\r\n- libti99 is in /opt/gcc4ti/lib\r\n\r\nThe lib may fail if it does not find classic 99 emulator, but it builds the libti99 file anyway.\r\nSo you have to move it manually to /opt/gcc4ti/lib and to move the .h files to /opt/gcc4ti/include.\r\nA cleaner way would be to have the Makefile also point to classic99.\r\n\r\n----\r\n\r\nOLD procedure\r\n\r\nfor the Texas TI99/4a \r\n(http://atariage.com/forums/topic/164295-gcc-for-the-ti/page-6),\r\n\r\n1. download and decompress gcc-installer.tar.gz from http://atariage.com/forums/topic/164295-gcc-for-the-ti/page-1\r\n2. install libgmp-dev libmpfr-dev tree\r\nFor Cygwin install:\r\n Category \"Devel\"\r\n- gcc-core\r\n- libiconv\r\n- make\r\n- patchutils\r\n\r\nCategory \"Libs\"\r\n- libgmp-devel\r\n- libmpfr-devel\r\n\r\nCategory \"Interpreters\"\r\n- m4 \r\n\r\n3. export set MAKEINFO=missing (to fix one error about texinfo) [maybe no longer necessary]\r\n4. run the \"install.sh <target dir>\" script command\r\n5. find files inside <target dir>/bin\r\n--------------\r\n\r\nNEW version\r\n\r\n-------------------------------------------------------------------------------------------------------\r\nGCC for Atari ST\r\n-------------------------------------------------------------------------------------------------------\r\n1. download the cross compiler from http://vincent.riviere.free.fr/soft/m68k-atari-mint/ \r\n2. follow the instructions from the installation site\r\n3. use as GCC\r\n4. place st52 terminfo file inside usr\\share\\terminfo\\s in the same virtual hard disk as the .tos file(s)\r\n\r\n\r\n"
  },
  {
    "path": "docs/HOW_TO_LOAD.md",
    "content": "In order to run the game you will have to follow a different procedure depending on whether you want to load it into an emulated system or a real system.\r\n\r\n### Loading the game into an emulated vintage system\r\nIn most cases loading an executable into an emulator is straightforward. \r\nFor a detailed guide on how to load the game on several emulated systems for which the procedure is not obvious, we refer to: \r\n\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HOW_TO_LOAD_THE_GAME.md\r\n\r\n### Loading the game into a real vintage system\r\nThis depends on the systems and the format used to store the game. For some hints on this take a look at:\r\n\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HOW_TO_LOAD_THE_GAME_ON_REAL_HARDWARE.md\r\n\r\n"
  },
  {
    "path": "docs/HOW_TO_LOAD_THE_GAME.md",
    "content": "## HOW TO LOAD THE GAME\r\n\r\nThis document only describes some non-obvious procedures on how to load the game\r\non some emulators (similar procedures can be followed on the real machines):\r\n\r\n-----------------------------------------------------------\r\n\r\n### AGAT 7 and 9\r\n\r\nUse the Agat emulator 1.29 (the one not detected as a virus):\r\nhttps://sourceforge.net/projects/agatemulator/\r\n\r\nSelect \"(2) IKP-9\"\r\n\r\nChose second option from below\r\n\r\nRight click top of the window\r\n\r\nGo to 140k drive\r\n\r\nSelect game disk image\r\n\r\nType:\r\n\"\r\nCATALOG,S6\r\nBRUN XL\r\n\"\r\n\r\n-----------------------------------------------------------\r\n\r\n### AGON LIGHT\r\n\r\nUse https://github.com/astralaster/agon-light-emulator\r\n\r\nPut the binaries inside the sdcard directory\r\ndir to list the content of the emulated SDK\r\nload <file name>\r\nrun\r\n\r\n-----------------------------------------------------------\r\n\r\n### ALPHATRONIC\r\n\r\n\r\nUse MAME/MESS\r\n\r\nmame64.exe alphatro -uimodekey DEL -window -cartridge1 c:\\Retro\\CROSS-CHASE\\build\\FULL_alphatro.rom\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### AMSTRAD CPC/GX4000\r\n\r\nYou can use Caprice, WinApe\r\n\r\n- Tape (.cdt) version:\r\nYou need to attach the image as a tape\r\nIn BASIC type\r\n|tape\r\nrun\"\r\nStart PLAY on the virtual tape player\r\n\r\n- Disk (.dsk) version:\r\nYou need to attach the image as a disk\r\nIn BASIC type\r\nrun\"XBIN    .CPC\"\r\n\r\n- ROM (.cpr) version:\r\nYou need to attach the image as a cartridge\r\n\r\n----------------------------------------------------------\r\n\r\n### Amstrad NC 100\r\n\r\nUse nc100em-1.2-2014 emulator .\r\n\r\nRename the binary to nc100.card and place it in the same folder as the emulator\r\n\r\nRun the emulator. \r\n\r\nControl-X to start the game\r\n\r\n\r\n---------------------------------------------------------\r\n### ATARI 5200\r\n\r\nUse Altirra or use Atari800 emulator with the Atari 5200 bios roms and select Atari 5200 emulation.\r\n\r\nLoad as 16k one chip cartridge.\r\n\r\n\r\n---------------------------------------------------------\r\n### ATARI 7800\r\n\r\nUse A7800 (http://7800.8bitdev.org/index.php/A7800_Emulator)\r\n\r\nSelect standard options.\r\nUse it as Mame/Mess by:\r\nTAB->load ROM->cartridge->select file\r\n\r\n---------------------------------------------------------\r\n### ATARI LYNX\r\n\r\nUse Handy 0.95 emulator (https://sourceforge.net/projects/handy/?source=typ_redirect).\r\n\r\nPlace the rom into same folder as Handy emulator (https://atariage.com/Lynx/roms/LynxBoot.zip)\r\n\r\n---------------------------------------------------------\r\n### AQUARIUS\r\n\r\nUnzip the .zip file.\r\n\r\nType CLOAD \r\n\r\nFirst load the file starting with underscore\r\n\r\nType RUN\r\n\r\nType CLOAD\r\n\r\nThen load the other file\r\n\r\n-----------------------------------------------------------\r\n\r\n### BBC MICRO / BBC MASTER\r\n\r\nUse BeebEm 4.19 emulator.\r\n\r\nFile-> Load disk 0-> Select .img file\r\n\r\nTo load and run the game in dsk format you can use the following commands:\r\n\r\n- *CAT to verify the disk content\r\n- *RUN\"XCHASE\"\r\n\r\n\r\nIf you want to create a dsk image from a .inf image:\r\n\r\nIt is better to have short simple name files. For example let us assume XCHASE and XCHASE.INF\r\n\r\nUse the binary and .inf files to \r\n\r\neither \r\n\r\ncreate a disk with tools such as bbcim or BBCExplorer-2.01 \r\n\r\nor \r\n\r\nuse BeebEm 4.16 emulator \r\n\r\n1. to create an empty disk image (File->Disc Options->New Disc 0)\r\n\r\n2. inject the binary into the new disk (Edit->Import files to disc->select .inf file)\r\n\r\n\r\n-----------------------------------------------------------\r\n### BIC / A5105\r\n\r\nUse JKCEMU.\r\n\r\n- (If not already selected) Einstellungen -> Select BIC \r\n- Datei->Diskettenstation->Laufwerk 1->Open->Diskettenabbilddatei oeffnen->select file .dumb file->Nur lesen\r\n- Datei->Schliessen\r\n- Run file by its name (e.g., BULD/FU)\r\n- Run DIR to see disk content/view/3/4/\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n### BIT90\r\n\r\nUse Mame emulator.\r\n\r\nRun it with something like:\r\n\r\nmame64.exe bit90 -window -uimodekey DEL\r\n\r\nAttach the .rom as a cartridge to load and run the game\r\n\r\n-----------------------------------------------------------\r\n\r\n### BONDWELL 2\r\n\r\nUse Mame\r\n- Start bw2\r\n- May need to use ScrollLock (FN+`[` on some keyboards) \r\n  in order to enable TAB to enter the disk selection menu\r\n- Select the CP/M 2.2 boot disk\r\n- Use natural keyboard to type CTRL-C to leave the menu\r\n- Switch to the game disk\r\n\r\n-----------------------------------------------------------\r\n### CAMPUTERS LYNX\r\n\r\nUse Jinx emulator: https://jynxemulator.wordpress.com/download/\r\n\r\nGitHub project: https://github.com/jonathan-markland/Jynx/releases\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### CANON X-07\r\n\r\nUse Takeda emulator\r\n\r\nInsert the .CAS file with PLAY->select file\r\nUse the CAS file with the following commands\r\nCLOAD\r\nRUN\r\n\r\n-----------------------------------------------------------\r\n\r\n### CASIO FP-1100\r\n\r\nUse Takeda's fp1100.exe emulator.\r\n\r\nYou need to put MAME roms in the same directory as the binary.\r\n\r\nAttach disk image\r\n\r\nReset\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### CCE MC-1000\r\n\r\nUse the MESS emulator \r\ne.g. \r\nmess64.exe mc1000 -uimodekey DEL -window \r\nmess64.exe mc1000 -uimodekey DEL -window -ramsize 48k (for the 48k expansion)       )   \r\n\r\nUse File Manager to attach the WAV file\r\n\r\nIn BASIC do: TLOAD\r\n\r\nStart the tape: Tape Control -> Tape\r\n\r\n---------------------------------------------------------\r\n\r\n### CBM 610\r\n\r\nUse WinVice 3.1 and try multiple times.\r\n\r\nSometimes load\"*\",8 helps.\r\n\r\nThere must be a bug in WinVice disk drive emulation for this target.\r\n\r\n-----------------------------------------------------------\r\n\r\n### COLECOVISION\r\n\r\nUse ColEm: https://fms.komkon.org/ColEm/\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### COLECO ADAM\r\n\r\nUse Mame emulator.\r\n\r\nmame64.exe adam -window -flop1 .\\disk\\adam\\cpm2.2_1.50.dsk -flop2 c:\\Retro\\CROSS-CHASE\\build\\FULL_coleco_adam.img\r\n\r\nB:\r\n\r\nType the binary name (no extension) contained in B:\r\n\r\n-------------------------------------------------------------\r\n\r\n### Color Computer (CoCo)\r\n\r\n\r\nTape load\r\n\r\n- Use XROAR emulator: https://www.6809.org.uk/xroar/\r\n- Attach the .cas image\r\n- Type\r\n- CLOADM\r\n\r\nRemark: You can also simply use the \"run\" option\r\n\r\n\r\nDisk load\r\n\r\n- Use XROAR emulator (Emulate CoCo DISK EXTENDED)\r\n- Disable \"keyboard translation\" in the \"Tool\" tab\r\n- Select a CoCO machine to emulate in the \"Hardware\" tab\r\n- Attach the .dsk disk image in \"File->Drive 1\"\r\n- Type:\r\n- LOADM\"XBIN\r\n- EXEC\r\n\r\n\r\n-------------------------------------------------------------\r\n\r\n### Color Computer 3 (CoCo 3)\r\n\r\nUse VCC emulator: https://github.com/VCCE/VCC/releases\r\n\r\nSame as CoCo with XROAR but disk drives need to be enabled:\r\n\r\nDisk load \r\n\r\nCartridge -> Cartridge -> Load Cart \r\nfd502.dll (to enable disk drive emulation)\r\n\r\n---------------------------------------------------------\r\n\r\n### COMX\r\n\r\nUse EMMA 02 (https://www.emma02.hobby-site.com/download.html)\r\nSelect COMX tab\r\nClick on START (window may hide the option -> make it bigger)\r\nClick on LOAD\r\nGo to the directory with the .hex file\r\nSelect HEX Files \r\nChose the .hex file\r\nType RUN\r\n[equivalent to CALL(@4401)]\r\n\r\n----------------------------------------------------------\r\n\r\n### CP/M (generic system) with ADM-3A control sequences\r\n\r\n.COM binaries:\r\n\r\nExamples of CP/M systems with ADM-3A support:\r\nmultiple Kaypro systems, Aussie Byte (Knight 2000), Decision Mate V\r\n\r\nUse MAME emulator with correct roms and CP/M disks.\r\n\r\n\r\nExamples:\r\n\r\n- mame64.exe kaypro2x -flop1 ..\\disk\\kaypro\\k10hald1.td0 -uimodekey DEL\r\n- mame64.exe aussieby -flop1 ..\\disk\\aussie_byte\\knight2000_boot.dsk -uimodekey DEL\r\n\r\nWAIT for the operating system to fully load.\r\n\r\nUse the quickload option to load the .COM file.\r\n\r\nIf you want to create a disk image you need to follow the instructions in the Z88DK wiki.\r\n\r\n.DSK images:\r\nUse MAME emulator with correct roms and CP/M disks\r\n\r\nExamples:\r\n\r\n- mame64.exe dmv -flop1 ..\\disk\\dmv\\dm5-cpm.td0 -uimodekey DEL\r\n- Attach image as disk B:\r\n- Run B:\r\n- <binary name without .COM>\r\n\r\n-----------------------------------------------------------\r\n\r\n### CREATIVISION\r\n\r\nUse MAME/MESS. \r\n\r\nMess 0.148 with crvision works fine:\r\n\r\nmess64.exe crvision -window -uimodekey DEL -cart1 c:\\Retro\\CROSS-LIB\\build\\FULL_creativision_16k_SWAPPED.bin\r\n\r\nmess64.exe crvision -window -uimodekey DEL -cart c:\\Retro\\CROSS-LIB\\build\\Xshoot_creativision_18k_SWAPPED.bin\r\n\r\n-------------------------------------------------------------\r\n### DAI\r\n\r\nUse Mame emulator.\r\n\r\nmame64.exe dai -window\r\n\r\nAttach tape file\r\n\r\nUT (to enter monitor)\r\n\r\nR (to load)\r\n\r\nG0800 (to start the game)\r\n\r\n-------------------------------------------------------------\r\n\r\n### Dragon\r\n\r\nTape load\r\n\r\n- Use XROAR emulator\r\n- Attach the .cas image\r\n- Type\r\n- CLOADM\r\n\r\nRemark: You can also simply use the \"run\" option\r\n\r\nDisk load\r\n- Use XROAR emulator (Emulate DOSPLUS)\r\n- Attach the .vdk disk image\r\n- Type: RUN\"XBIN.BIN\"\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### EACA 2000 - EG2K\r\n\r\nUse the Genieous emulator: http://gaia.atilia.eu/content/view/3/4/\r\n\r\n\r\n------------------------------------------------------------\r\n\r\n### EMSCRIPTEN\r\nThis is a special target: its build is generated by Emscripten and it is targeting browsers.\r\n\r\nThe build for this target are .html, .js, , .wasm files.\r\n\r\nIn order to run a game built for this target you need to run an HTTP server:\r\n-  move the generated files inside the emsdk directory\r\n-  python -m SimpleHTTPServer\r\n\r\nYou can then run your program by using the following URL:\r\ne.g., http://localhost:8000/FULL_emcc_buffered.html\r\n\r\nFor more info on Emscripten installation:\r\nsee https://emscripten.org/docs/getting_started/downloads.html\r\n\r\nIn particular: \r\n- Make the \"latest\" SDK \"active\" for the current user. (writes .emscripten file)\r\n./emsdk activate latest\r\n\r\n- Activate PATH and other environment variables in the current terminal\r\nsource ./emsdk_env.sh\r\n\r\nNote:\r\n\r\nOn Windows, run emsdk instead of ./emsdk, and emsdk_env.bat instead of source ./emsdk_env.sh.\r\n\r\nWSL mounted on:\r\nC:\\Users\\fabri\\AppData\\Local\\Packages\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\\LocalState\\rootfs\r\n\r\n------------------------------------------------------------\r\n\r\n### ENTERPRISE\r\n\r\nUse ep128emu (https://sourceforge.net/projects/ep128emu/files/)\r\n\r\nSelect config EP_128k_EXDOS_FileIO.cfg\r\n\r\nSet working directory to the directory with your binary\r\n\r\nF1 -> Select binary\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### EPSON PX-4 / HC-40\r\n\r\nUse Takeda emulator for HC-40 with the right SYS.ROM file (https://fjkraan.home.xs4all.nl/comp/px4/).\r\n\r\nRename the binary into BASIC.ROM and replace the original BASIC.ROM that\r\nshould be (or have been) in the same directory as the HC-40 emulator executable.\r\n\r\n----------------------------------------------------------\r\n\r\n### EPSON PX-8 / HC-80\r\n\r\nUse Takeda emulator for HC-80 with the right SYS.ROM file.\r\n\r\nRename the binary into BASIC.ROM and replace the original BASIC.ROM that\r\nshould be (or have been) in the same directory as the HC-80 emulator executable.\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### EPSON QC-10 / QX-10\r\n\r\nUse Mame emulator\r\ne.g., \r\nmame64.exe qx10 -window -uimodekey DEL -flop1 c:\\Emulation\\TEST\\0.196\\disk\\qc10\\EPSNQX10.dsk\r\n\r\nAttach the disk image and type the binary name (run DIR to see name).\r\n\r\n-----------------------------------------------------------\r\n\r\n### BGR COMPUTERS EXCALIBUR 64\r\n\r\nUse Mame emulator with the CP/M boot disk\r\ne.g., \r\nmame64.exe excali64 -window -uimodekey DEL -flop1 c:\\Emulation\\TEST\\0.196\\disk\\excali64\\excalibur_cpm_system.raw\r\n\r\nAttach the game image\r\n\r\nB:\r\n\r\nRun the binary in B: with its plain name (no extension)\r\n\r\n-----------------------------------------------------------\r\n\r\n### EXIDY SORCERER\r\n\r\nUse Mess emulator.\r\n\r\n\r\nAttach the .wav file\r\n\r\nType LOADG\r\n\r\n\r\n---------------------------------------------------------\r\n### PC-E200 / PC-G850 / PC-G815\r\nUse the g800 emulator (https://ver0.sakura.ne.jp/pc/)\r\n\r\nRun it from the cmd line with:\r\n\r\ng800(.exe) -machine=e200 <path to ihx file>\r\ng800(.exe) -machine=g815 <path to ihx file>\r\ng800(.exe) -machine=g850 <path to ihx file>\r\n\r\nOnce the emulated machine is started use:\r\nMON (to enter the Assembly monitor)\r\nG100 (to actually run the code)\r\n\r\n---------------------------------------------------------\r\n\r\n### Galaksija\r\n\r\nUse the MESS emulator or \r\n(for debugging) the online emulator https://galaksija.net/?i=2\r\n\r\nUse File Manager to attach the WAV file\r\n\r\nIn BASIC run: OLD\r\n\r\nStart the tape\r\n\r\nIn BASIC run: RUN\r\n\r\n---------------------------------------------------------\r\n\r\n### Galaksija Plus\r\n\r\nUse GALe emualtor:  https://galaksija.net/?i=1\r\n\r\nDrop the .gtp file into the browser.\r\n\r\n\r\n---------------------------------------------------------\r\n### GAMATE\r\n\r\nUse MESS/MAME (e.g., Mess 0.148).\r\n\r\nRun mess.exe gamate\r\n\r\nFile Manager -> Select cartridge -> Choose the .bin file\r\n\r\n\r\n---------------------------------------------------------\r\n### GAMEGEAR\r\n\r\nUse Mednafen.\r\n\r\nRemark: Sound works fine here.\r\n\r\nmednafen.exe c:\\Retro\\CROSS-LIB\\build\\Xhorde_gamegear.gg\r\n\r\nUse Emulitious (https://emulicious.net/)\r\n\r\nFile -> Open File -> Select .gg file\r\n\r\nor (maybe broken with no sound!)\r\n\r\nUse Kega Fusion ((https://segaretro.org/Kega_Fusion).\r\n\r\nFile -> Open GameGear ROM -> Select .gg file\r\n\r\n\r\n\r\n------------------------------------------------------------\r\n\r\n### GRUNDY NEWBRAIN\r\n\r\nUse NBemulator15.\r\n\r\n\r\nCreate a directory with _dir.txt, a.bas, a.dat \r\n\r\nInsert this directory into the BASIC directory\r\n\r\nStart the emulator\r\n\r\nFile -> Start Emulation\r\n\r\nFile -> Tape Management -> Select directory with the game's files\r\n\r\nType \"LOAD\"\r\n\r\nType \"RUN\"\r\n\r\n\r\n---------------------------------------------------------\r\n### HECTOR HR\r\nUse DCHector or VB Hector emulator\r\n\r\n[DCHector]\r\nSelect Hector HR(2)+.\r\n\r\nFile->Load Tape\r\n\r\nPress 1 and wait for the game to load and run\r\n\r\n\r\n---\r\n\r\n[VB HECTOR]\r\nStart the emulator\r\n\r\nSelect HR Plus\r\n\r\nFichier -> Ouvrir Fichier K7\r\n\r\nPress 1 and wait for the game to load and run\r\n\r\nClick on the emulator's window\r\n\r\n---------------------------------------------------------\r\n### HOMELAB 2### HECTOR HR\r\n\r\n\r\nUse MAME emulator.\r\n\r\nUse quickload to select the .htp file (and load it into memory)\r\n\r\nCALL 17152\r\n\r\n\r\n---------------------------------------------------------\r\n### HOMELAB 3/4\r\n\r\nUse MAME emulator.\r\n\r\nUse quickload to select the .htp file (and load it into memory)\r\n\r\nCALL $4300\r\n\r\n\r\n---------------------------------------------------------\r\n### HUEBLER/EVERT-MC\r\n\r\nUse JKCEmu.\r\n\r\nEinstellungen\r\n\r\nSelect HUEBLER/EVERT-MC\r\n\r\nUebernehmen\r\n\r\nSchliessen\r\n\r\nDatei -> Lauden -> Select binary\r\n\r\nGO 0000\r\n\r\n\r\n---------------------------------------------------------\r\n### HUEBLER-GRAFIK-MC\r\n\r\nEinstellungen\r\n\r\nSelect HUEBLER-GRAFIK-MC\r\n\r\nUebernehmen\r\n\r\nSchliessen\r\n\r\nDatei -> Lauden -> Select binary\r\n\r\nGO 0000\r\n\r\n\r\n---------------------------------------------------------\r\n### JUPITER ACE\r\n\r\nUse EightOne emulator.\r\n\r\nFor the FULL version game \r\n\r\n\"0 0 bload ace\"\r\n\r\nOpen the FULL .wav version with \r\n\r\nTools->Wav Loader.\r\n\r\n------------------------------------------------------------\r\n\r\n### KAYPRO\r\n\r\nUse Mame (See CP/M target)\r\n\r\nmame64.exe kaypro2x -flop1 ..\\disk\\kaypro\\k10hald1.td0 -uimodekey DEL\r\n\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Luxor ABC 80 \r\n\r\nUse the ABC80SIM emulator (https://www.abc80.org/pub/abc80sim/, https://git.zytor.com/abc80/abc80sim.git/)\r\n\r\n.ihx\r\n\r\nPass the ihx file as a parameter to the emulator\r\n\r\nRun it directly with the command “A=CALL(49200)”\r\n\r\n---\r\n\r\n.bac \r\n\r\nabc80 --casfile program.bac\r\n\r\nrun cas:\r\n\r\nor \r\n\r\nput the .bac file in the right directory (abcdir), \r\n\r\nthen run prb:xchase\r\n\r\n---\r\n\r\n.dsk\r\n\r\nRename the image to mo0\r\n\r\nPut the image in abcdisk\r\n\r\nrun xchase\r\n\r\nor \r\n\r\nRename the image to mo0\r\n\r\nPut the image in <mydir>\r\n\r\nRun abc80 -Dd <mydir>\r\n\r\nrun xchase\r\n\r\n--------------------------------\r\n\r\nUse ABC80Win.\r\n\r\nAttach .dsk image\r\n\r\nload\"xchase\"\r\n\r\nrun\r\n\r\n---------------------------------------------------------\r\n\r\n### Luxor ABC 800\r\n\r\nUse the ABC80SIM emulator (https://www.abc80.org/pub/abc80sim/, https://git.zytor.com/abc80/abc80sim.git/)\r\n\r\n\r\n.bac\r\n\r\nabc80 --abc802 --memfile program.bac\r\n\r\nThen \"run mem:\"\r\n\r\n\r\n.dsk\r\n\r\nRename the image to mo0\r\n\r\nPut the image in abcdisk\r\n\r\nrun xchase\r\n\r\nor \r\n\r\nRename the image to mo0\r\n\r\nPut the image in <mydir>\r\n\r\nRun abc80 -Dd <mydir>\r\n\r\nrun xchase\r\n\r\nUse ABC80Win\r\n\r\nAttach .dsk image\r\n\r\nload\"xchase\"\r\n\r\nrun\r\n\r\n\r\n---------------------------------------------------------\r\n### LVIV/LVOV\r\n\r\nUse https://web.archive.org/web/20201215185635/https://github.com/izhaks/PK01LvovEmulator/releases/tag/v1.4\r\n\r\n\r\n---------------------------------------------------------\r\n### M100 / Olivetti M10 / KC85 / PC8201\r\n\r\n.CO file can be loaded into VirtualT emulator through \"File > Load file from HD\" menu item.\r\n\r\nOnce the program is in memory, enter BASIC and give the following command:\r\n\r\nCLEAR 0,49999\r\n\r\nnow the program can be loaded, either via the BASIC command RUNM \"A.CO or by pressing F8 to get back to the menu and choosing it with the cursors.\r\n---------------------------------------------------------\r\n\r\n### Memotech MTX 500 and 512\r\n\r\nUse Bill's MEMU (http://www.primrosebank.net/computers/mtx/emulators/Bills_MEMU_ds.htm)\r\n\r\nmemu -tape-overwrite -vid-win-big -snd-portaudio <path to the .mtx file>\r\n\r\nType:\r\nLO.\"\"\r\n\r\nThen:\r\n\r\nRUN\r\n\r\n\r\n---\r\nPlace the .mtx binary into the directory \"tapes\"\r\n\r\nUse memu-cfg.exe \r\n\r\nF11 to enter the menu\r\n\r\nSelect MTX model if necessary (MTX500 or MTX512)\r\n\r\nSelect tape -> Choose the .mtx binary\r\n\r\nRestart\r\n\r\n\r\n\r\nMTX500 binary on MTX512\r\n\r\nPOKE 64122,0\r\n\r\nNEW\r\n\r\nLOAD\"\"\r\n\r\nRUN\r\n\r\nMTX500 binary on MTX500 or MTX 512 binary n MTX512\r\n\r\nLOAD\"\"\r\n\r\nRUN\r\n\r\n\r\n\r\n\r\nUse the MESS 0.118 emulator\r\n\r\nRename FULL_MTX.mtx to FULL and place it in the same folder as the Mess emulator\r\n\r\nIn Basic do:\r\n\r\nLOAD\"FULL\"\r\n\r\nRUN\r\n\r\n\r\n-----------------------------------------------------------\r\n### MITS Altair 8800\r\n\r\nUse http://www.classiccmp.org/altair32/\r\n\r\nSwitch it ON\r\n\r\nLoad the .bin y File -> Read Image File -> Select File -> Address: $0000\r\n\r\nClick on STOP/RUN\r\n\r\n-----------------------------------------------------------\r\n\r\n### MITSUBISHI MULTI 8\r\n\r\nUse Takeda emulator\r\n\r\nType \"MON\"\r\n\r\nThen \"R\"\r\n\r\nSelect tape file with CMT -> Play -> Select file\r\n\r\nType \"GC000\"\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n\r\n### MICROBEE\r\n\r\n(1) .WAV files\r\n\r\n(1a) Use Mame/Mess_\r\nFor example with:\r\nmbeepc85 -window -uimodekey DEL -cass c:\\Retro\\CROSS-LIB\\build\\<file_name>.WAV\r\n\r\nType B to enter BASIC\r\nType LOAD\r\nGo to Mame/Mess menu to control TAPE and select PLAY\r\n\r\n---\r\n\r\n(1b) Use UBEE512\r\n\r\nInstall UBEE512 (run script, copy roms into rom folder)\r\n\r\nSelect UBEE512 icon and select properties to add \" ic\" to the command\r\n\r\nRun UBEE512\r\n\r\nC:\\Emulation\\Computers\\ubee512\\ubee512.exe ic --tapei=\"a.wav\"\r\n \r\nType LOAD\r\nRight click to select TAPE to start loading the tape\r\nType RUN\r\n\r\n-----------------------------------------------------------\r\n\r\n###  MICRO (MICROBOARD SYSTEM)\r\n\r\nUse Emma 02 emulator.\r\nSelect RCA -> Microboard System\r\nCARD2 -> 128 6x8 characters\r\nCARD1 ->  RAM U20 -> binary\r\nSTART\r\n\r\n\r\n-----------------   \r\n\r\n(2) .BEE files \r\n\r\nUse Nanowasp emulator: http://nanowasp.org/\r\n\r\nClick on TAPE to select the .BEE file to insert the file in the list of programs\r\nClick on the selected file to insert in the tape player\r\nType LOADM  \r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n\r\n### MIKRO-80\r\n\r\nUse E3000 emulator http://www.emulator3000.org/e3.htm\r\n\r\nSelect the binary to load and run it.\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### MSX\r\n\r\nUse BlueMSX\r\n\r\nAttach image.\r\n\r\nRun bload\"cas:\",r\r\n\r\nOr use MAME\r\n\r\nFor example\r\nmame.exe canonv20 -window -uimodekey DEL -cart1 c:\\Retro\\CROSS-LIB\\build\\Xhorde_msx_32k.rom -skip_gameinfo\r\n\r\n-----------------------------------------------------------\r\n\r\n### NICHIBUTSU MY VISION\r\n\r\nUse Mame emulator\r\n\r\ne.g., mame64.exe myvision -window  -uimodekey DEL\r\n\r\nAttach the .rom image file as a cartridge\r\n\r\n-----------------------------------------------------------\r\n\r\n### NASCOM\r\n\r\nUse Virtual-Nascom (http://repo.or.cz/w/virtual-nascom.git)\r\n\r\nType virtualnascom [.nas file]\r\n\r\nOnce the monitor is running, enter “E 1000” \r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### NEC PC-6001\r\n\r\nUse Virtual Nec Trek \r\n\r\nSelect 2 pages at start-up\r\n\r\nType \"cload\"\r\n\r\nSelect cassette image\r\n\r\nType \"run\"\r\n\r\n\r\n---------------------------------------------------------\r\n### Nintendo NES / Famicom \r\n\r\nUse FCEUX (https://tasvideos.github.io/fceux/web/home.html)\r\n\r\nAlternatively Use mednafen and run the following command:\r\n\r\nmednafen.exe -fs  1 FULL_nes.nes\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Ohio Scientific C1P\r\n\r\nStart the WinOSI executable (http://osi.marks-lab.com/)\r\n\r\nUnder \"Options\" select \"System Configuration...\".\r\n\r\nSelect \"OSI C1P / Superboard II (600 BOard)\" as machine type.\r\n\r\nOn the \"System ROMs\" tab under \"Specify ROM Type\" select SYN600.\r\n\r\nPress \"OK\"\r\n\r\nUnder \"File\" select \"Attach Serial Input File...\".\r\n\r\nSelect the file \"FULL_osic1p.c1p\".\r\n\r\nIn the emulator window you should see the \"D/C/W/M\" prompt. \r\n\r\nPress \"M\" to run the monitor. You then should see the \"0000 00\" prompt of the machine monitor.\r\n\r\nPress \"l\" (lowercase L). This will load the program and start it.\r\n\r\n\r\n\r\nMemory configs in WinOSI \r\n\r\nOpen Osi.ini\r\n\r\n32K -> RAMTOP=0x7FFF\r\n\r\n8k  _> RAMTOP=0x1FFF\r\n\r\n\r\n-------------------------------------------------------------\r\n\r\n### Olivetti M20\r\n\r\nUse Mame\r\n\r\nYou need to attach the floppy image\r\n\r\nmame64.exe m20 -window -flop1 c:\\Retro\\CROSS-CHASE\\build\\FULL_m20_buffered.img\r\n\r\nAt the prompt run with \r\n\r\naout.cmd\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n\r\n### Sanyo PHC-25\r\n\r\nUse https://github.com/hitchhikr/phc25\r\nScreen -> 1 (to get more available memory)\r\ncload\r\nFile->Read tape options->Read tape file->(select file)\r\nrun\r\n\r\n----------------------------------------------------------\r\n\r\n### Senio MAP-1010\r\nYou need to convert the phc file to a wav file.\r\nIn order to do this you can use castool:\r\ncastool convert phc [phc file] [wav output file]\r\n\r\nUse TAKEDA emulator\r\nCLOAD\r\nCMT->Play->select file\r\nrun\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### MS-DOS 8086\r\nUse DOSBOX.\r\nMap the directory with the .COM binaries to a drive (e.g., C:)\r\nMove to C:\r\nType the name of the .COM file \r\n\r\n----------------------------------------------------------\r\n\r\n### MS-DOS 386\r\nUse DOSBOX.\r\nMap the directory with the .EXE binaries to a drive (e.g., C:)\r\nMove to C:\r\n\r\nYou need CWSDPMI\r\nRun: CWSDPMI -p -s\r\nType the name of the .EXE file \r\n\r\n\r\n------------------------------------------------------------\r\n\r\n### TESLA ONDRA VILI\r\nUse Mame emulator with the ondrav target\r\n\r\ne.g., mame64.exe ondrav -window -uimodekey DEL\r\n\r\nPress ENTER\r\n\r\nAttach .wav image as tape\r\n\r\nStart tape to load and autostart the game\r\n\r\n\r\n------------------------------------------------------------\r\n\r\n### ORIC 1 / ORIC ATMOS\r\n\r\nUse the Oricutron emulator (https://github.com/pete-gordon/oricutron)\r\n\r\nAttach the image.\r\n\r\nRun CLOAD\"\"\r\n\r\n\r\n------------------------------------------------------------\r\n\r\n### ORIC TELESTRAT\r\n\r\nUse the modified version of Oricutron emulator: http://orix.oric.org/download/\r\n\r\nUse the instructions on the link above to boot Orix operating system\r\n\r\nRename the binary file to a short name with no extension\r\n\r\nCopy it into sdcard/bin\r\n\r\nRun the binary by typing its name \r\n\r\n\r\n\r\n------------------------------------------------------------\r\n\r\n### OSCA \r\n\r\nUse the OSCA emulator (http://www.basoft.co.uk/wordpress/emulation/computer-system-emulation/v6z80p/osca-emulator/)\r\n\r\nUse WinImage to inject the .exe binary into a working .img file\r\n\r\nEdit the config.txt to make it point to the modified .img file\r\n\r\nRun by typing the executable name (whitout .exe)\r\n\r\n\r\n\r\n------------------------------------------------------------\r\n\r\n### OZ\r\n\r\n\r\nLaunch vOZ\r\n\r\nDrag oz750.rom on the emulator's windows\r\n\r\nchoose the memory size (256K in my case)\r\n\r\npress ENTER (CTRL key) to exit the display settings\r\n\r\npress ENTER (CTRL key) again\r\n\r\n(optional) Press F6 for brighter display\r\n\r\nDrag <program>.wzd on the emulator's windows\r\n\r\nChoose the program 'slot' from the emulator's dialog window\r\n\r\nPress F5 to select the custom program\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### NAMCO PUCMAN (PACMAN)\r\n\r\nUse the Mame emulator\r\n\r\nYou need the puckman.zip rom file.\r\n\r\nYou have to replace puckmod with the one generated by CrossLib Makefile.\r\n\r\nRun Mame:\r\n\r\nmame64.exe puckmod -window -uimodekey DEL\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### PASOPIA 7\r\n\r\nUse Takeda emulator (http://takeda-toshiya.my.coocan.jp/) with the Mame romset\r\n\r\nAttach the disk image\r\n\r\nReset to start the game\r\n\r\n-----------------------------------------------------------\r\n\r\n### PC 8088/8086\r\n\r\nUse qemu-system-i386 to start a bare metal PC 8088/8086 and attach the floppy image\r\n\r\nqemu-system-i386.exe c:\\Retro\\CROSS-CHASE\\build\\FULL_pc8086_turn_based.img\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### PCE\r\n\r\nUse mednafen and run the following command:\r\n\r\nmednafen.exe -fs  1 TINY_pce.pce\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Pecom 32/64\r\n\r\nUse EMMA 02 (https://www.emma02.hobby-site.com/download.html)\r\n\r\nSelect Pecom tab\r\n\r\nClick on START (window may hide the option -> make it bigger)\r\n\r\nClick on LOAD\r\n\r\nGo to the directory with the .hex file\r\n\r\nSelect HEX Files \r\n\r\nChose the .hex file\r\n\r\nType RUN [equivalent to CALL(&0201)]\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Hanimex Pencil II \r\n\r\nUse Mame emulator.\r\n\r\nRun mame64.exe pencil2 -window -uimodekey DEL\r\n\r\nAttach the ROM image\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### NEC PC 8801\r\n\r\nUse the M88 emulator: https://illusioncity.net/PC88/m88eng.rar\r\n\r\nBIOS: https://archive.org/details/m-88.7z\r\n\r\nType:\r\n\r\nMON\r\n\r\nR\r\n\r\nSelect the tape file\r\n\r\nG8A00 to start\r\n\r\n-----------------------------------------------------------\r\n\r\n### PETERS PLUS SPRINTER\r\n\r\nUse SPRINT (http://web.archive.org/web/20040905083237/http://shaos.ru/nedopc/sprinter/sprint.htm)\r\n\r\nrun with something like SPRINTGW.EXE c:\\Retro\\CROSS-CHASE\\build\\FULL_pps.exe\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Philips 2000\r\n\r\nUse m2000-allegro5 emulator\r\n\r\nPlace the game file into the same directory as the m2000.exe and rename it into p2000.cas\r\n\r\nIn BASIC execute:\r\n\r\nCLOAD\r\n\r\nRUN\r\n\r\n\r\n\r\n---------------------------------------------------------\r\n### Philips VG 5000\r\n\r\nType CLOAD\r\n\r\nSelect the game file\r\n\r\n\r\n----------------------------------------------------------\r\n### PMD-85\r\n\r\nUse Borik's PMD-85 Emulator (https://pmd85.borik.net/wiki/Emulator)\r\n\r\nSelect the .ptp image file.\r\n\r\nRun\r\n\r\nMGLD 00\r\n\r\nPress the flash button.\r\n\r\nClick on the play button.\r\n\r\nJUMP 0000\r\n\r\n\r\n----------------------------------------------------------\r\n### PRIMO\r\n\r\nUse Mame\r\n\r\ne.g., mame64.exe primoa64 -window  -uimodekey DEL\r\n\r\nUse Quickload to load the .pp image\r\n\r\n\r\n----------------------------------------------------------\r\n### Robotron KC 85/2, 85/3, 85/4, 85/5, HC 900\r\n\r\nUse the JKCEMU emulator.\r\n\r\nClick on \"Extra\" tab.\r\n\r\nChoose \"Einstellungen\"\r\n\r\nSelect your target (e.g., KC 85/5)\r\n\r\nPress \"Uebernehmen\" and then \"Schliessen\"\r\n\r\nLoad file with \"Datei\" -> \"Laden\" -> Select File -> \"Starten\"\r\n\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### Robotron Z 1013\r\n\r\nUse J1013 emulator (http://www.jens-mueller.org/j1013/download.html):\r\n\r\n1. Press Datei->Laden\r\n\r\n2. Select binary\r\n\r\n3. Press Starten\r\n\r\n\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Robotron Z 9001\r\n\r\nUse the JKCEMU emulator.\r\n\r\nClick on the \"Extra\" tab.\r\n\r\nChoose \"Einstellungen\"\r\n\r\nSelect Z9001\r\n\r\nPress \"Uebernehmen\"\r\n\r\nPress \"Schliessen\"\r\n\r\nLoad file with \"Datei\"->\"Laden\"\r\n\r\nSelect file \r\n\r\nClick \"Starten\"\r\n\r\n-------------------------------------------------------------\r\n\r\n### S-OS\r\n\r\nUse sword05 (http://www.retropc.net/ohishi/s-os/sword05.lzh)\r\n\r\nPlace the file (a.obj) in the same directory as the emulator\r\n\r\n(no space)L<SPACE>a.obj\r\n\r\n(no space)J 3000\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### SAMSUNG SPC-1000\r\n\r\nUse ESPC emulator\r\n\r\nType \"LOAD\"\r\n\r\nCMT -> Play -> Select file\r\n\r\nCMT -> Play button\r\n\r\n\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### SEGA MSTER SYSTEM\r\n\r\nUse Kega Fusion Emulator (https://segaretro.org/Kega_Fusion)\r\n\r\nFile -> Load MasterSystem ROM -> Select .sms file\r\n\r\nor\r\n\r\nUse Emulitious (https://emulicious.net/)\r\n\r\nFile -> Open File -> Select .sms file\r\n\r\n---------------------------------------------------------\r\n\r\n### SEGA SC 3000\r\n\r\nUse the MESS emulator\r\n\r\nRun mess with \r\n\r\nmess64.exe sc3000 -cart1 <basic31 file name>.sc -cass1 FULL_sc3000_32k.wav\r\n\r\nInside the emulator type:\r\n\r\nLOAD\r\n\r\nRUN\r\n\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Sharp MZ\r\n\r\nUse mz800Emu\r\n\r\nPress C\r\n\r\nSelect .mzf file\r\n\r\n----------------------------------------------------------\r\n\r\n### SHARP X1\r\n\r\nUse Takeda X1 emulator (you need the roms)\r\n\r\n1. Start the emulator.\r\n\r\n2. Click on FD0.\r\n\r\n3. Select the disk image\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### SHARP PC G850\r\n\r\nUse g800win32 emulator (http://ver0.sakura.ne.jp/pc/)\r\n\r\ng800.exe -machine=200 c:\\Retro\\CROSS-CHASE\\build\\FULL_g800_turn_based.ihx\r\n\r\nType \"G100\"\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### ZX SPECTRUM NEXT\r\n\r\nUse CSPECT emulator (http://www.cspect.org/)\r\n\r\nPress F2\r\n\r\nSelect .nex binary to load and start it\r\n\r\n-------------------------------------------------------------\r\n\r\n### Sinclair QL\r\n\r\nUse QPC https://www.kilgus.net/qpc/ \r\n\r\nRename the binary to something short, e.g., xchase\r\n\r\nType the following commands to add the necessary meta-data and have the binary inside the emulated Sinclair QL\r\n\r\n\"\r\nf$=“dos1_<path fo file with '_' instead of '/'>“\r\n\r\nl=FLEN(\\f$)\r\n\r\nmem=RESPR(l)\r\n\r\nLBYTES f$,mem\r\n\r\nSEXEC ram1_<name given to the binary inside the QL>,mem,l,<dataspace value (*)>\r\n\"\r\n\r\n(*) dataspace has to be big enough, i.e., bigger than what the compiler shows as output.\r\n\r\nA possible value is 4096.\r\n\r\nNow the ram1 disk has the executable binary inside the QL. Select ram1 and then the game to start\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n\r\n### SONY SMC-77\r\n\r\nUse Takeda emulator with Mame roms.\r\n\r\nInsert the boot disk into the first floppy drive and the game disk in the second one\r\n\r\nB:\r\n\r\nRun the binary inside B: (no extension)\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### SORD M5\r\n\r\nUse MESS/MAME\r\n\r\nYou need the basic-i rom somewhere in your file system\r\n\r\nYou could run:\r\n\r\nMess 0.191\r\nROM:\r\nmess64.exe m5 -window -ramsize 36k -cart1 c:\\Retro\\CROSS-LIB\\build\\Xbomber_m5_rom.rom\r\n\r\n|Tape:\r\nmess64.exe m5 -window -ramsize 36k -cart1 basic-i\\basic-i.rom -cass c:\\Retro\\CROSS-LIB\\build\\Xbomber_m5.cas\r\n\r\nor \r\n\r\nmess64.exe m5 -uimodekey DEL -cart1 basic-i\\basic-i.rom -ramsize 36k -window\r\n\r\nYou need to insert the tape\r\n\r\nType TAPE\r\n\r\nPress ESC\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### SUPERVISION\r\n\r\nUse Potator (https://emulationrealm.net/downloads/file/235-potator)\r\n\r\nUse arrows for movements and C for fire\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### SONY SV 8000\r\n\r\nUse the Mame emulator.\r\n\r\ne.g., mame64.exe sv8000 -window -uimodekey DEL\r\n\r\nAttach the .rom cartridge image to start the game.\r\n\r\n---------------------------------------------------------\r\n\r\n### DICK SMITH SUPER 80\r\n\r\nUse the Mame emulator\r\n\r\ne.g., mame64.exe super80 -window -uimodekey DEL\r\n\r\nUse quickload to load and start the game\r\n\r\n---------------------------------------------------------\r\n\r\n### DICK SMITH SUPER 80R\r\n\r\nUse the Mame emulator\r\n\r\ne.g., mame64.exe super80r -window -uimodekey DEL\r\n\r\nUes quickload to load and start the game\r\n\r\n-----------------------------------------------------------\r\n\r\n### TATUNG EINSTEIN\r\n\r\nWith +cpm -subtype=einstein\r\n\r\na .dsk will be produced that can be used in combination with dos80.dsk.\r\n\r\n-flop1 dos80.dsk -flop2 [created image]\r\n\r\nOnce booted, type:\r\n\r\n1:\r\nAPP.COM\r\n\r\n\r\n----------\r\n\r\nUSE EDIP1 1e (http://www.einstein.talktalk.net/edip.html?showpage=true)\r\n\r\nto insert the .COM file into a disk image:\r\n\r\n0. Rename your file such that no special characters (no underscore) are present\r\n\r\n1. Run EDIP 1e\r\n\r\n2. Select DOS80.DSK\r\n\r\n3. Click on CREATE BLANK -> Name your disk image\r\n\r\n4. Select DOS TATUNG XTAL...\r\n\r\n5. Press SELECT -> Select File\r\n\r\n6. Press SELECT -> Cancel -> Quit\r\n\r\n\r\nUse MAME/MESS:\r\n\r\n1. mame64.exe einstein -window -uimodekey DEL -flop1 c:\\Emulation\\Mame\\EDIP1e\\XCHASE.DSK\r\n\r\n2. run the .COM file by typing its name\r\n\r\n\r\n---------------------------------------------------------\r\n\r\n### Telmac TMC-600\r\n\r\nUse EMMA 02 (https://www.emma02.hobby-site.com/download.html)\r\n\r\nSelect telmac tab.\r\n\r\nSelect TMC-600\r\n\r\nClick on START (window may hide the option -> make it bigger)\r\n\r\nClick on LOAD\r\n\r\nGo to the directory with the .hex file\r\n\r\nSelect HEX Files \r\n\r\nChose the .hex file\r\n\r\nType RUN [equivalent to CALL(@6300)]\r\n\r\n\r\n-------------------------------------------------------------\r\n\r\n### Thomson MO5/MO6/Prodest PC 128\r\n\r\n- Tape\r\n\r\nUse DCMOTO\r\n\r\nSelect Mo5 or Mo6 or Prodest PC 128\r\n\r\nBASIC 1.0\r\n\r\nAttach .k7 image\r\n\r\nType\r\n\r\nLOADM\r\n\r\nEXEC\r\n\r\n\r\n\r\nBASIC 128 (Mo6/Prodest PC 128)\r\n\r\nAttach .k7 imloadage\r\n\r\nType\r\n\r\nLOADM\"CASS:\",&H600\r\n\r\nEXEC\r\n\r\nor\r\n\r\nLOADM\"CASS:\",&H600,R\r\n\r\n\r\n\r\n-------------------------------------------------------------\r\n\r\n### Thomson TO7/TO8/TO9\r\n\r\n- Disk .sap image\r\n\r\nUse DCMOTO\r\n\r\nSelect T08D\r\n\r\nAttach .sap image\r\n\r\nType\r\n\r\nloadm \"XLIB.bin\"\r\n\r\nexec\r\n\r\n\r\nIn order to load at an address lower than $A000 by <offset> bytes, you need to use CLEAR:\r\n\r\nCLEAR ,,,&h8000\r\n\r\nloadm \"XLIB.bin\",<offset>\r\n\r\nexec\r\n\r\nExample 1:\r\nCross Snake may need to be loaded at a lower start address than $A000, so you need to do:\r\n\r\nCLEAR ,,,&h8000\r\n\r\nloadm \"XLIB.bin\",-1024\r\n\r\nExample 2:\r\nCross Shoot may need even more memory than Cross Snake. So you need to do:\r\n\r\nCLEAR ,,,&H7FFF\r\n\r\nLOADM\"0:FULL_TO7.bin\",-&HA000\r\n\r\nEXEC\r\n\r\n-----------------------------------------------------------\r\n\r\n### TI-82\r\n\r\nUse the VTI emulator\r\n\r\n1. Load the Crash Shell into the calculator\r\n\r\n- 2nd + x,T,\\theta (LINK)\r\n\r\n- Select Receive\r\n\r\n- Drop Crash .82b \r\n\r\n- 2ND + ON (OFF) \r\n\r\n- ON (+ SAVE STATE to start from this point next time)\r\n\r\n\r\n\r\n2. Load the game\r\n\r\n- 2nd + x,T,\\theta (LINK)\r\n\r\n- Select Receive\r\n\r\n- Drop .82p file\r\n\r\n- 2ND + ON (OFF) \r\n\r\n- ON (+ SAVE STATE to start from this point next time)\r\n\r\n\r\n\r\n3. Run the game\r\n\r\n- PRGM\r\n\r\n- Select Crash (NOT the game)\r\n\r\n- Select the game\r\n\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### TI-83\r\n\r\nUse the VTI emulator\r\n\r\n1. Load the Ion Shell into the calculator\r\n\r\n- 2nd + x,T,\\theta,\\pi (LINK)\r\n\r\n- Select Receive\r\n\r\n- Drop .83b Ion 1.5 or 1.6 file\r\n\r\n- 2ND + ON (OFF) \r\n\r\n- ON (+ SAVE STATE to start from this point next time)\r\n\r\n\r\n\r\n2. Load the game\r\n\r\n- 2nd + x,T,\\theta,\\pi (LINK)\r\n\r\n- Select Receive\r\n\r\n- Drop .83p file\r\n\r\n- 2ND + ON (OFF) \r\n\r\n- ON (+ SAVE STATE to start from this point next time)\r\n\r\n\r\n3. Run the \"a\" application\r\n\r\n- PRGM\r\n\r\n- Select A \r\n\r\n\r\n4. Run the game\r\n\r\n- PRGM\r\n\r\n- Select Ion (NOT the game)\r\n\r\n- Select the game\r\n\r\n\r\n\r\nAlternative load instructions:\r\n\r\n\r\n- Use VTI 2.5 beta 4 or beta 5.\r\n\r\n- Select TI83 (v1.07)\r\n\r\n- Reset calculator (MEM CLEARED)\r\n\r\n- 2nd, LINK, RECEIVE (do not press ENTER, yet)\r\n\r\n- Look for ION.83G (memory dump)\r\n\r\n- Press ENTER on ION\r\n\r\n- Drag the file onto VTI\r\n\r\n- Transmission error. Retry.\r\n\r\n- PRGM -> ION (see prgmION) -> press Enter (INSTALLED)\r\n\r\n- Compile your program with a name different from default abc80\r\n\r\n- Transfer program as done with ION.83G\r\n\r\n- Start the shell and program\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### TI-85\r\n\r\nUse the VTI emulator\r\n\r\n1. Load the Rigel Shell into the calculator\r\n\r\n- 2nd + X-Var (LINK) + F2 \r\n\r\n- Drop Rigel memory backup file\r\n\r\n- 2ND + ON (OFF) \r\n\r\n-  ON (+ SAVE STATE to start from this point next time)\r\n\r\n\r\n2. Load the game\r\n\r\n- 2nd + X-Var (LINK) + F2 \r\n\r\n-  Drop the .85s game binary\r\n\r\n\r\n\r\n3. Run the game\r\n\r\n-  Custom + F1 (to select Rigel)\r\n\r\n- Select the game\r\n\r\n\r\n\r\nAlternative instructions:\r\n\r\n- Install the emulator program VTI.\r\n\r\n- Download the TI85.ROM and put it into VTI directory.\r\n\r\n- Download and extract Rigel Shell.\r\n\r\n- Start VTI. Select TI85.\r\n\r\n- Click 2nd Link, then press F2 to receive.\r\n\r\n- Right Mouse click and choose Send File to VTI. Choose the file rigel.85b from the Backups directory of the Rigel Shell.\r\n\r\n- Quickly press F1 to confirm Warning about Memory backup, before transmission error message.\r\n\r\n- Click 2nd OFF On, to init the Rigel Shell.\r\n\r\n- Click 2nd Link, then press F2 to receive.\r\n\r\n- Right Mouse click and choose Send File to VTI. Select spice.85s.\r\n\r\n- Click 2nd OFF On, to init the Rigel Shell.\r\n\r\n- Click Custom, then F1, and select SPICE program.\r\n\r\n\r\nQUICK\r\n\r\n- Load Rigel savestate \r\n\r\n- Click 2nd OFF On\r\n\r\n- Click 2nd Link, then press F2 to receive.\r\n\r\n- Right Mouse click and choose Send File to VTI. Choose the .85s file\r\n\r\n- Click 2nd OFF On, to init the Rigel Shell.\r\n\r\n- Click Custom, then F1, and select A program.\t\r\n\r\n\t\r\n\t\t\r\n\t\r\n-----------------------------------------------------------\r\n\r\n### TI-86\r\n\r\nUse Wabbitemu\r\n\r\nYou can load the .86p files by directly dragging them on VTI, \r\nno need to go through the 'link\" sequence, they'll be pushed in the TI86 memory.\r\n\r\n- So, first drag InstLASM.86p, \r\n\r\n- then enter: `asm(InstLASM)`\r\n\r\n- press `F5` and confirm the reset process\r\n\r\n- once you get the message \"MEM CLEARED\", \r\n\r\n- drag LargeLd.86p on the calculator.\r\n\r\n- Now you can upload *ONE SINGLE* \"big\" executable (built with the LASM startup option), just drag it on the calculator.\r\n\r\n- To run: asm(LargeLd)\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n### TI99/4A\r\n\r\nUse Classic99 (http://www.harmlesslion.com/cgi-bin/onesoft.cgi?1).\r\n\r\nEA5 files are loaded as follows:\r\n\r\n- Have one of the disks, e.g DSK1., point to the directory that contains the EA5 file: DSK1-> Set DSK1 -> Disk Type: FIAD\r\n\r\n- Go to Cartridge->Apps->Editor/Assembler\r\n\r\n- Press 2 to enter the Editor/Assembler\r\n\r\n- Press 5 to run a file\r\n\r\n- Enter DSK1.(file name)1\r\n\r\nExample: DSK1.XCHASE1 -> loads Cross Chase\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n\r\n### TIKI-100\r\n\r\nUse TIKI-100_emul (http://www.djupdal.org/tiki/emulator/)\r\n\r\nAttach the image and type: \r\n\r\na \r\n\r\nfolowed by enter.\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### TRS-80 MC-10\r\n\r\nUse VMC-10 emulator (https://github.com/PhoenixInteractiveNL/emuDownloadCenter/wiki/Emulator-virtualmc10#downloads)\r\n\r\nEnable 16k (at least): Configure -> Memory -> 16k\r\n\r\nRun:\r\n\r\n\r\nCLOADM\r\n\r\nLoad the .c10 file: File->Play cassette file\r\n\r\nRun:\r\n\r\nEXEC\r\n\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n\r\n### TRS-80 Model 1/2/4\r\n\r\n.cas version:\r\n\r\nIf you use trs80gp-1.8\r\n\r\nType enter to get to the console\r\n\r\nUse load option\r\n\r\n\r\n\r\nIf you use trs32\r\n\r\n\r\n\r\n.cas version:\r\n\r\nUse trs32 emulator.\r\n\r\nType L+enter at Cass?\r\n\r\nType enter at Memory?\r\n\r\nType System\r\n\r\nAttach .cas\r\n\r\nShow cassette\r\n\r\nType ../BUI\r\n\r\nPress PLAY\r\n\r\nWait...\r\n\r\nPress / + enter to start\r\n\r\n\r\n\r\n.cmd version:\r\n\r\nGet to BASIC prompt\r\n\r\nFile->Run-> Select .cmd file\r\n\r\n\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### VIDEOTON TVC\r\n \r\nUse WinTVC emulator (http://gaia.atilia.eu/downloads/)\r\n\r\nStart the emulator and wait until the BASIC prompt\r\n\r\nLoad the .cas file with \"CAS direkt betoeltese\"\r\n\r\nType \"run\" to start\r\n\r\n\r\n\r\n-----------------------------------------------------------\r\n\r\n\r\n### VECTOR 06C\r\n\r\nUse E3000 emulator http://www.emulator3000.org/e3.htm\r\n\r\nSelect the binary to load and run it.\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### VTECH Laser 500\r\n\r\nUse the online Laser500emu (https://nippur72.github.io/laser500emu/).\r\n\r\nDrop the .bin or .wav file onto the browser window\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n### Z80 TV GAME\r\n\r\nUse Takeda emulator with Mame roms\r\n\r\nStart the game: Cart -> Insert -> Select .rom image file \r\n\r\nInput: Host -> Input -> Joystick1 -> Redefine keys\r\n\r\n\r\n\r\n"
  },
  {
    "path": "docs/HOW_TO_LOAD_THE_GAME_ON_REAL_HARDWARE.md",
    "content": "## Loading the game into a real vintage system\r\nThe loading procedure depends on the systems and the format used to store the game. \r\n\r\n- Most vintage systems used cassette players. For such systems the .wav or any other reproducible format (e.g., mp3) \r\nis the easiest solution because it can be played by a PC or smartphone connected to the audio in of the vintage system.\r\nIf a different format is produced, we suggest the use of a tool to convert into a playable.\r\nIf the emulator supports the creation of .wav files, one way to do this is to use the `save` or equivalent BASIC command.\r\n- Several vintage systems use floppy disks. \r\nSome hardware solutions (e.g., XUM1541 cables for the Commodore 8-bit series) can be used to transfer disk images into real disks. \r\nSome other hardware solutions (SD2IEC for the Commodore 8-bit series, SI2SD for the Atari 8-bit series) allow the use disk images by a vintage system.\r\n- Some other systems use cartridges. Cartridge images can be store into EPROMs or can be used directly by some special hardware (e.g., EasyFlash for the Commodore 64).\r\n"
  },
  {
    "path": "docs/INSTALL.md",
    "content": "## NO LOCAL INSTALLATION\r\n\r\nHaving a Dockerfile and a devcontainer configuration means that anyone with a GitHub account can just clone this repository and run it with GitHub CodeSpaces (free of charge with some restrictions): https://github.com/codespaces.\r\n\r\n-------------------------------------------\r\n\r\n## LOCAL DOKCER WITH A PRE-BUILD DOCKER IMAGE\r\n\r\nYou can pull and run the latest pre-build image with\r\n```\r\ndocker run -it -v {cross-lib_location}:/usr/src/cross-lib ghcr.io/cross-lib/devcontainers/base:1.0.5-ubuntu\r\n```\r\nwhere {cross-lib_location} could be something like: *c:\\sources\\cross-lib*.\r\n\r\nOnce in the docker container, you can enter the *src* directory with *cd /usr/src/cross-lib/src* and \r\nuse the *xl* script, e.g., *./xl stinger cc65*.\r\n\r\nOr just pull  the pre-build image with\r\n```\r\ndocker pull ghcr.io/cross-lib/devcontainers/base:1.0.5-ubuntu\r\n```\r\n\r\nAn older image can be pulled here\r\n```\r\ndocker pull fabriziocaruso:crosslib:0.1\r\n```\r\n\r\nand follow the same instructions as for docker image built from a dockerfile.\r\n\r\n-------------------------------------------\r\n\r\n## LOCAL DOCKER WITH THE DOCKERFILE\r\n\r\nThe dockerized version of Cross-Lib can used by \r\n- cloning this repository into a directory (let us refer to it as `<local_cross-lib>`);\r\n- building the docker image that contains the dependencies by running the command \r\n\r\n```docker build . -t crosslib:<version>```;\r\n\r\nfrom the `/CROSS-LIB/.devcontainer` directory.\r\n\r\n- running the docker container and mapping the cloned repository into a directory (e.g. `/workspaces/crosslib`) in the container with\r\n\r\n```docker run -it -v <local_cross-lib>:/workspaces/crosslib --env-file <local_cross-lib>/.devcontainer/container.env crosslib:<version> bash```\r\n- (once in the docker container) by entering `workspaces/crosslib/src` and running `xl` commands.\r\n\r\n-------------------------------------------\r\n\r\n## LOCAL NON-DOCKER INSTALLATION - PREREQUISITES\r\n\r\nCross-Lib is meant to be used under a POSIX environment (Windows+Cygwin, Linux, etc.).\r\n\r\nIn order to be able to build the games and tests on all `default targets` you need:\r\n- GNU `make`\r\n- `python` (2.x or 3.x)\r\n- `gcc` and `ncurses` (necessary only for native builds)\r\n- cross-compilers (necessary to build for vintage targets)\r\n- `java` only to build disk images for the Apple//e, Apple\\]\\[ and the Agat 7/9 targets\r\n- `perl` only to build cassette images for the CoCo 1/2 and Dragon 32/64 targets\r\n\r\nFor the compilers to work, you may need to add the location of their binaries to the `$PATH` environment variable and to add the execution rights to those binaries.\r\nIf the compiler's binary cannot be found, you may have to set their paths in: `src\\makefiles.common\\auxiliary/Makefile_compilers`, e.g., `Z88DK_PATH`, `LCC1802_PATH`, etc..\r\n\r\nFor more details on the prerequisites we refer to: \r\n\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/PREREQUISITES.md\r\n\r\n\r\n-------------------------------------------\r\n## LOCAL NON-DOCKER INSTALLATION OF THE TOOL-CHAIN\r\n\r\nThe tool-chain Cross-Lib can be installed on different POSIX-compliant environments.\r\nIt has been tested on:\r\n- Windows (7, 10) + `Cygwin`\r\n- Windows Subsystem for Linux\r\n- MacOS X\r\n- Linux Ubuntu 18.04 under the Windows Subsystem\r\n- Linux (KUbuntu 18.04, Lubuntu 21.10) \r\n- FreeBSD 13.0\r\n\r\nCross-Lib itself does not require any installation. It is just a source library and scripts that is ready to be used as is, by just downloading or cloning the content of this repository.\r\nFor example you can do it by:\r\n\r\n```\r\ngit clone https://github.com/Fabrizio-Caruso/CROSS-LIB.git\r\n```\r\n\r\nIn order to use Cross-Lib you will need to install the prerequisites described in the previous section. \r\nThe way these prerequisites are installed vary depending on the environment.\r\n\r\n### Under Windows + Cygwin\r\nFor Windows + Cygwin the tested and verified installation procedure uses:\r\n- `Cygwin` setup to install `gcc`, `make`, `python`, `java`\r\n- `CC65` is installed under Windows by just downloading and decompressing its snapshot (https://sourceforge.net/projects/cc65/).\r\n- `Z88DK` is installed under Windows by downloading and decompressing its latest nightly build (http://nightly.z88dk.org/).\r\n- `CMOC` and `ACK` are installed from sources. Look at the installation procedure under Linux for the details.\r\n- `LCC1802` is installed under Windows by simply decompressing its released binary version (https://github.com/bill2009/lcc1802/releases).\r\n\r\n### Under Linux\r\nFor Linux (native or under the Windows Subsystem), the tested and verified procedure both standard repositories and installation from sources.\r\n\r\nA detailed procedure for recent Ubuntu distributions is described here: \r\n\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/LINUX_SETUP.md\r\n\r\n\r\n\r\n### ACKNOWLEDGEMENTS\r\n\r\n\r\nThanks to Alex Thissen, a version of Cross-Lib with (Z88DK, CC65, CMOC and native compilers) is available as a Docker image (to be built by using the provided Dockerfile) with a devcontainer configuration.\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "docs/LICENCE.txt",
    "content": "This software is provided 'as-is', without any express or implied warranty.\r\nIn no event will the authors be held liable for any damages arising from\r\nthe use of this software.\r\n\r\nPermission is granted to anyone to use this software for non-commercial applications, \r\nsubject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software in\r\na product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not\r\nbe misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n"
  },
  {
    "path": "docs/LINUX_SETUP.md",
    "content": "# CROSS-LIB SET-UP UNDER LINUX\r\n\r\nWe give here the procedure to install Cross-Lib and its dependencies under Linux.\r\nIn particular this procedure is the one I have used under LUBUNTU 21.10.\r\nOn other distributions the same procedure or a similar one can be used depending on how packages are handled.\r\nEven under Windows with Cygwin many of these steps are similar but the way packages are installed is very different (i.e., using Cygwin's `setup.exe`).\r\n\r\nWe do not cover *all* supported compilers here. We only fully covered the fully supported ones under Linux.\r\nIn particular we describe how to install:\r\n- `GCC` for native compilation\r\n- `CC65` for MOS 6502-based targets\r\n- `Z88DK` for Zilog 80, Intel 8080-based targets\r\n- `CMOC` for Motorola 6809-based targets\r\n\r\nWe give some information on how to install some experimentally supported compilers:\r\n- `ACK` for Intel 8088-based targets and other targets (partially supported and currently only used for one game)\r\n- `LCC1802` for RCA COSMAC 1802-based targets (with only experimental support under Linux)\r\n\r\n-----------------------------\r\n## Python Installation\r\n\r\nThe whole tool-chain uses heavily Python scripts. So we need Python to do anything. \r\nPython 2.7 or Python 3.X can used.\r\n\r\nUnder any recent Ubuntu distribution, Python is trivially installed with:\r\n```\r\nsudo apt install python\r\n```\r\n\r\n-----------------------------\r\n## Enable builds for the host \r\n\r\nNative builds can be performed as long as an ANSI C compiler and the `ncurses` libraries are installed.\r\nBy default Cross-Lib expects `gcc` to be the native compiler.\r\nA different one can be used (including a non-native one, which would defeat the purpose of a native compiler).\r\nIn order to select a different compiler edit the `NATIVE_CC` variable in `src/makefiles.common/auxiliary/Makefile.compilers`.\r\n\r\nThe `gcc` compiler may be pre-installed. In not present, `gcc` is trivially installed with\r\n```\r\nsudo apt install gcc\r\n```\r\n\r\nThe `ncurses` libraries can be installed with:\r\n```\r\nsudo apt install libncurses5-dev libncursesw5-dev\r\n```\r\n\r\nThe native target is the default target for the script command `xl build`.\r\nThis makes it possible to try and debug the code natively if desired. No emulator and no cross-compiler is necessary to start using Cross-Lib.\r\nCurrently the native target is just an ncurses-enabled terminal target. So no graphics. Only ASCII characters will be displayed.\r\n\r\nSo you can use Cross-Lib to build old and new games and to create new ones by using the `xl` command and by providing no target or equivalently the `ncurses` target.\r\n\r\n\r\nTo get started you can build some of the games by using `xl build [name of the game or test]`. \r\n\r\nExample:\r\nThe following commands will be three games for the native target:\r\n```\r\nxl build bomber\r\nxl build snake\r\nxl build horde\r\n```\r\n\r\n\r\n\r\n-----------------------------\r\n## Enable builds for MOS 6502-based targets \r\n\r\nNearly all MOS 6502-based targets supported by Cross-Lib rely on `CC65`. Very few others experimental targets use `VBCC`.\r\n\r\nOn very recent Ubuntu distributions we can install `CC65` by just:\r\n```\r\nsudo apt install cc65\r\n```\r\n\r\nIn order to build disk images for the `Apple][` and `Apple//e` targets we need `java`, which we can install with:\r\n```\r\nsudo apt install openjdk-17-jre-headless\r\n```\r\n\r\n\r\n-----------------------------\r\n## Enable builds for Motorola 6809-based targets\r\n\r\nCross-Lib relies on `CMOC` for all its supported Motorola 6809-targets. \r\nIn order to install `CMOC` you can use build from its source code and follow its simple installation procedure.\r\n\r\nFirst of all you need to download `LWTOOLS` (the linker) from http://www.lwtools.ca/, and install it with\r\n\r\n```\r\nmake\r\nsudo make install\r\n```\r\n\r\nThen you download `CMOC`'s source code from  http://perso.b2b2c.ca/~sarrazip/dev/cmoc.html and install it with:\r\n```\r\napt install bison\r\napt install flex\r\n\r\nconfigure\r\nmake\r\nsudo make install\r\n```\r\n----------------------\r\n\r\n## Enable builds for targets based on Zilog 80 and Intel 8080 \r\n\r\nCross-Lib relies on the `Z88DK` dev-kit for all its targets based on the Zilog 80, Intel 8080/5, and GBZ80.\r\n`Z88DK` contains two separate cross-compilers: `SCCZ80` and `ZSDCC`. Using `SCCZ80` is enough to build most Cross-Lib targets.\r\nSo the installation of `ZSDCC` is not strictly necessary to build new games.\r\n\r\nHere we describe how to download and install `Z88DK` from its source code.\r\n\r\n### Z88DK dependencies\r\nIn order to be able to compile the source you have to install the following packages by running `apt install [list of packages]`:\r\n\r\n```\r\napt install\r\n    build-essential\r\n    dos2unix\r\n    libboost-all-dev\r\n    texinfo\r\n    texi2html\r\n    libxml2-dev\r\n    subversion\r\n    bison\r\n    flex\r\n    zlib1g-dev\r\n    m4\r\n```\r\n\r\n\r\n### Installation from source code\r\nIn order to download `Z88DK`'s source code you can run:\r\n```\r\nwget http://nightly.z88dk.org/z88dk-latest.tgz\r\n```\r\nand then decompress it with:\r\n```\r\ntar -xzf z88dk-latest.tgz\r\n```\r\n\r\nYou can now start the build process by using the `build.sh` script:\r\n```\r\ncd z88dk\r\nexport BUILD_SDCC=1\r\nchmod 777 build.sh\r\n./build.sh\r\n```\r\n\r\nIn order to finalize the installation and to be able to use Z88DK from any location you need to set the following environment variables:\r\n```\r\nexport PATH=${PATH}:${HOME}/z88dk/bin\r\nexport ZCCCFG=${HOME}/z88dk/lib/config\r\n```\r\n\r\n----------------------------------------------------------\r\n## Enable builds for RCA COSMAC 1802-based targets\r\n\r\nThe build process for RCA COSMAC 1802-based targets relies on the `LCC1802` compiler.\r\n\r\nThis has not been tested, yet, under Linux.\r\n\r\nIts installation procedure under Linux is described in:\r\n\r\nhttps://github.com/bill2009/lcc1802\r\n\r\n----------------------------------------------------------\r\n\r\n## Enable builds for Intel 8088-based targets \r\n\r\nIn order to use Cross-Lib for targets based on the Intel 8088 and some other 16 and 32-bit vintage targets you can use `ACK`.\r\nSupport for these targets is currently only experimental.\r\n\r\n`ACK` can be downloaded from https://github.com/davidgiven/ack.\r\n\r\nIt depends only on `flex` and `yacc` or `bison` and it is installed with:\r\n```\r\nmake\r\nsudo make install\r\n```\r\n\r\n\r\n"
  },
  {
    "path": "docs/MSDOS_big_banging.txt",
    "content": "Skip to content\r\nChat history\r\nYou said:\r\nHow can I produce sounds with the speaker by big banging in msdos 8086?\r\nChatGPT said:\r\n\r\nOn an 8086 under MS-DOS you can produce sound with the PC speaker in two different ways:\r\n\r\n    Correct way (using the PIT timer, channel 2) – stable tone\r\n\r\n    True “bit banging” – manually toggling the speaker line for crude square waves\r\n\r\nBelow are both methods with full explanations and sample 8086 code.\r\n✅ 1. REAL MODE / MS-DOS PC SPEAKER USING PIT (recommended)\r\n\r\nThe PC speaker is controlled by:\r\nFunction\tPort\r\nPIT channel 2 control\t43h\r\nPIT channel 2 data\t42h\r\nSpeaker gate + data enable\t61h\r\n→ Steps to play a tone:\r\n\r\n    Program PIT channel 2 for square-wave mode.\r\n\r\n    Load divisor into port 42h (frequency = 1,193,180 / divisor).\r\n\r\n    Enable speaker bit 0 and 1 in port 61h.\r\n\r\n    Delay.\r\n\r\n    Turn off speaker.\r\n\r\nExample: 1 kHz tone\r\n\r\n; ====== Play 1 kHz tone ======\r\n; PIT clock = 1,193,180 Hz\r\n; divisor = 1193180 / 1000 ≈ 1193 = 04A9h\r\n\r\n    mov     al, 0B6h       ; Channel 2, lobyte/hibyte, mode 3 (square wave)\r\n    out     43h, al\r\n\r\n    mov     ax, 1193\r\n    out     42h, al        ; Low byte\r\n    mov     al, ah\r\n    out     42h, al        ; High byte\r\n\r\n    ; Enable speaker (bits 0 and 1 of port 61h)\r\n    in      al, 61h\r\n    or      al, 03h\r\n    out     61h, al\r\n\r\n    ; ---- Delay loop ----\r\n    mov cx, 0FFFFh\r\n.delay:\r\n    loop .delay\r\n\r\n    ; Disable speaker\r\n    in      al, 61h\r\n    and     al, 0FCh       ; clear bits 0 and 1\r\n    out     61h, al\r\n\r\nThis produces a clean, stable square wave.\r\n✅ 2. TRUE “BIT BANGING” (no PIT)\r\n\r\nThis is closer to the literal meaning of bit-banging: you manually drive the speaker by flipping bit 1 of port 61h at the desired rate.\r\n\r\nThe PC speaker is connected to bit 1 (value 2) of port 61h.\r\n→ Principle\r\n\r\nFlip bit 1 rapidly:\r\n\r\n0 → 1 → 0 → 1 → 0 → …\r\n\r\nThe switching speed = frequency × 2.\r\n\r\nSo for a 1 kHz tone, toggle 2000 times per second.\r\nExample: crude software-generated square wave\r\n\r\n; ====== Bit-banged speaker tone ======\r\n\r\n    in      al, 61h\r\n    or      al, 01h      ; enable speaker gate\r\n    out     61h, al\r\n\r\n    mov     bx, 2000     ; number of toggles (duration)\r\n\r\nbitloop:\r\n    in      al, 61h\r\n    xor     al, 02h      ; toggle speaker data bit (bit 1)\r\n    out     61h, al\r\n\r\n    ; small delay to control pitch\r\n    mov     cx, 80\r\ndelay:\r\n    loop    delay\r\n\r\n    dec     bx\r\n    jnz     bitloop\r\n\r\n    ; turn off speaker\r\n    in      al, 61h\r\n    and     al, 0FCh\r\n    out     61h, al\r\n\r\nThis method:\r\n\r\n    gives you full control\r\n\r\n    but tone quality is rough\r\n\r\n    pitch depends on CPU speed (so unstable on fast machines or emulators)\r\n\r\nChoosing a method\r\nMethod\tPros\tCons\r\nPIT (hardware)\tstable, accurate, classic PC speaker tone\tslightly more code\r\nBit banging\tunlimited waveforms, educational, works without PIT\tcrude, speed-dependent\r\n\r\nIf you want, I can also provide:\r\n\r\n    A macro-based sound library\r\n\r\n    C-callable 8086 routines\r\n\r\n    A bit-banged melody player\r\n\r\n    A PIT-based music routine using int 08h (timer interrupts)\r\n\r\n\r\nChatGPT can make mistakes. Check important info. See Cookie Preferences.\r\n"
  },
  {
    "path": "docs/PREREQUISITES.md",
    "content": "## Prerequisites\r\n\r\n- [Non-UNIX only] Install a POSIX environment if necessary, e.g., Cygwin.\r\n- Install `make` in your environment.\r\n- Install `python` (2.x or 3.x)\r\n- Install the required cross-compilers\r\n- [Only for some compilers] Make sure they are either installed as described in the Makefile variables: `Z88DK_PATH`, `CC65_PATH`, `LCC1802_PATH`, etc. or set these variables accordingly.\r\n- [Z88DK-only] Select the optimization level in Makefile by setting the variables: `SCZZ80_OPTS` (`-O3` for highest optimizations), `ZSDCC_OPTS` (`-SO3` for high optimizations; `-SO3 --max-allocs-per-node200000` for highest and extremely slow optimizations).\r\n- [Native builds only] Install `gcc` and `ncurses`\r\n- [Only to have disk images for the Apple //e and Apple\\]\\[] Install `java`"
  },
  {
    "path": "docs/PRESENTAZIONE_ITA/Documenti_on_line.txt",
    "content": "CROSS-LIB breve presentazione in italiano: https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/presentazione.md\r\n\r\nLISTA PARZIALE DEI SISTEMI SUPPORTATI: https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md\r\n\r\nDESCRIZIONE DEI GIOCHI (in italino): https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GIOCHI.md\r\n\r\nCROSS-LIB pagina principale (in inglese) : https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nCROSS-LIB presentazione lunga (in inglese) con slides: https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/CrossLib.odp\r\n"
  },
  {
    "path": "docs/PRESENTAZIONE_ITA/Giochi/EMULATORI_DA_USARE.txt",
    "content": "ATARI 8-bit: Altirra\r\nCommodore 64: Vice\r\nCommodore Vic 20 + 8k: Vice (settare memoria a +8k)\r\nGame Boy: Visual Boy Advance Emulator\r\nGame Gear: Emulicious (ULTIMA versione)\r\nSega Master System: Emulicious (ULTIMA versione)\r\nSinclair ZX Spectrum: Fuse\r\n\r\n"
  },
  {
    "path": "docs/SNAPSHOTS.md",
    "content": "## Snapshots\r\n\r\n![MSX](../snapshots/XSnake_MSX2.png)\r\n![Atari](../snapshots/XChase_A8.png)\r\n![CPC](../snapshots/XHorde_CPC.png)\r\n![Atari](../snapshots/XBomber_A8.png)\r\n![SMS](../snapshots/XShoot_sms.png)\r\n![GB](../snapshots/XSnake_GB.png)\r\n![Atari](../snapshots/XHorde_A8.png)\r\n![SMS](../snapshots/XHorde_SMS.png)\r\n"
  },
  {
    "path": "docs/STATUS.md",
    "content": "## STATUS\r\nLast update: 2026/03/16\r\n\r\n### 8-BIT targets\r\n\r\ntarget name         | long target name                            | working  |   CPU family  | dev-kit | real-time input |    graphics    |  sound  | notes      \r\n--------------------|---------------------------------------------|----------|---------------|---------|-----------------|----------------|---------|-----------\r\n*abc80*             | Luxor ABC 80                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*abc800*            | Luxor ABC 800                               |   YES    |   Zilog 80    |  Z88DK  |      OK?        |    missing     | missing |\r\n*ace*               | Jupiter Ace                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*agat*              | Agat-7/9                                    |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*alphatro*          | Alphatronic                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       | missing |\r\n*altair8800*        | MITS Altair 8800                            |   YES    |  Intel 8080   |  Z88DK  |      OK         |      N/A       |  N/A    |\r\n*apple2*            | Apple II                                    |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*apple2_z80*        | Apple II                                    |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*apple2enh*         | Apple //e                                   |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*aquarius*          | Mattel Aquarius                             |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   OK    |\r\n*aquarius plus*     | Aquarius Plus                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*atari5200*         | Atari 5200                                  |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*atari7800*         | Atari 7800                                  |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*atari*             | Atari 8-bit (e.g., Atari 800)               |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*atari_lynx*        | Atari Lynx                                  |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*attache*           | Otrona Attache                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing |\r\n*aussie*            | Aussie Byte (Knight 2000)                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     |   OK    |\r\n*bbc*               | BBC Micro                                   |   YES    |   MOS 6502    |   VBCC  |      OK         |       OK       |   OK    |\r\n*bbcmaster*         | BBC Master                                  |   YES    |   MOS 6502    |   VBCC  |      OK         |       OK       |   OK    |\r\n*bic*               | BIC/A5105                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |        ?       |    ?    |\r\n*bit90*             | Bit Corporation BIT 90                      |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing | PSG SN76489A\r\n*bondwell*          | Bondwell                                    |   YES?   |   Zilog 80    |  Z88DK  |      OK         |        ?       |    ?    |\r\n*bondwell2*         | Bondwell 2                                  |   YES?   |   Zilog 80    |  Z88DK  |      OK         |       OK       |    ?    |\r\n*c128_8502*         | Commodore 128 [8502 CPU]                    |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    | GFX in VDC mode\r\n*c128*              | Commodore 128 [Z80 CPU]                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | GFX with VIC (OK) and VDC (slow)\r\n*c16*               | Commodore 264 series (16/116/+4)            |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*c64*               | Commodore 64                                |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*c65*               | Commodore 65                                |    ?     |   MOS 6502    |   CC65  |      OK?        |    missing     | missing |\r\n*cbm510*            | Commodore CBM 510                           |   YES    |   MOS 6502    |   CC65  |      OK         |    missing     | missing |\r\n*cbm610*            | Commodore CBM 610                           |   YES    |   MOS 6502    |   CC65  |      OK         |    missing     | missing | \r\n*camputers_lynx*    | Camputers Lynx 48k/96k/128k                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing |\r\n*cidelsa_altair*    | Cidelsa Altair arcade board                 |   YES    |   RCA 1802    | LCC1802 |      OK         |    missing     |   OK    |\r\n*cidelsa_destroyer* | Cidelsa Destroyer arcade board              |   YES    |   RCA 1802    | LCC1802 |      OK         |    missing     |   OK    |\r\n*cidelsa_draco*     | Cidelsa Draco arcade board                  |   YES    |   RCA 1802    | LCC1802 |      OK         |    missing     |   OK    |\r\n*coco*              | Color Computer 1/2                          |   YES    | Motorola 6809 |   CMOC  |      OK         |       OK       |   OK    |\r\n*coco3*             | Color Computer 3                            |   YES    | Motorola 6809 |   CMOC  |      OK         |       OK       |   OK    |\r\n*coleco*            | Colecovision                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing | PSG SN76489A\r\n*coleco_adam*       | Colecovision Adam                           |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing | PSG SN76489A \r\n*comx*              | COMX-35                                     |   YES    |   RCA 1802    | LCC1802 |      OK         |       OK       |   OK    | \r\n*corvette*          | Corvette                                    |   YES?   |   Zilog 80    |  Z88DK  |      OK?        |       OK?      | missing |\r\n*cpc*               | Amstrad CPC                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*cpm_8080*          | CP/M Intel 8080                             |   YES    |  Intel 8080   |  Z88DK  |      OK         |      N/A       |  N/A    |\r\n*cpm_z80*           | CP/M Z80 with adm3a/vt52/vt100              |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |  N/A    | \r\n*creativision*      | VTech Creativision                          |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*cx16*              | Commander X16                               |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*dai*               | DAI                                         |   YES    |  Intel 8080   |  Z88DK  |   missing       |      N/A ?     |  N/A ?  |\r\n*dmv*               | Decision Mate V                             |   YES    |   Zilog 80    |  Z88DK  |      OK         |        ?       |    ?    |\r\n*dragon*            | Dragon 32/64                                |   YES    | Motorola 6809 |   CMOC  |      OK         |       OK       |   OK    |\r\n*e200*              | Sharp PC-E200                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*eg2k*              | EACA EG2000 Color Genie                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK ?  |\r\n*einstein*          | Tatung Einstein TC-01                       |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     |   OK ?  | PSG AY-3-8910\r\n*einstein256*       | Tatung Einstein TC-01                       |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     |   OK ?  | PSG AY-3-8910\r\n*enterprise*        | Enterprise 64/128                           |   YES    |   Zilog 80    |  Z88DK  |   missing       |    missing     | missing | \r\n*excalibur64*       | Excalibur64                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A ?     |   N/A ? |\r\n*fp1100*            | Casio FP-1100                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A ? |\r\n*g815*              | Sharp PC-G815                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*g850*              | Sharp PC-G850                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*gal*               | Galaksija                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   N/A   |\r\n*gal_plus*          | Galaksija Plus                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     |   N/A   |\r\n*gamate*            | Gamate                                      |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*gamegear*          | Game Gear                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK ?  | PSG SN76489 Mednafen OK \r\n*gb*                | Game Boy                                    |   YES    |   GBZ80       |  Z88DK  |      OK         |       OK       |   OK    | grey levels\r\n*gemini*            | Gemini                                      |   YES?   |   Zilog 80    |  Z88DK  |      OK         |        ?       |    ?    |\r\n*gl4000*            | VTech Genius Leader 4000                    |   YES    |   Zilog 80    |  Z88DK  |    missing      |    missing     | missing |\r\n*gl6000sl*          | VTech Genius Leader 6000sl                  |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing |\r\n*gx4000*            | Amstrad GX-4000                             |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*hbios*             | HBIOS generic target                        |     ?    |   Zilog 80    |  Z88DK  |   missing       |    missing     | missing |\r\n*hector1*           | Hector 1                                    |   YES    |   Zilog 80    |  Z88DK  |      OK?        |  missing       | missing | extremely low memory\r\n*hectorhr*          | Hector HR2+ / Hector HRX                    |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing |\r\n*hemc*              | Huebler/Evert-MC                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   N/A ? |\r\n*hgmc*              | Huebler-Grafik-MC                           |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     |   N/A ? |\r\n*homelab*           | Homelab 4                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   N/A ? |\r\n*homelab2*          | Homelab 2                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   N/A ? |\r\n*kaypro83*          | Kaypro 83                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   N/A ? |\r\n*kaypro*            | Kaypro 2X                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A ?     |   N/A ? |\r\n*interact*          | Interact                                    |   YES    |  Intel 8080   |  Z88DK  |      OK?        |  missing       | missing | extremely low memory\r\n*kc*                | Robotron KC-85/2/3/4                        |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A ? |\r\n*kc85*              | Kyocera 85                                  |   YES    |  Intel 8085   |  Z88DK  |      OK         |    missing     | missing |\r\n*kramermc*          | Kramer-MC                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   N/A ? |\r\n*krokha*            | Krokha                                      |   YES?   |   Zilog 80    |  Z88DK  |      OK         |        ?       |    ?    |\r\n*lambda*            | Lambda 8300                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   N/A ? |\r\n*laser500*          | Laser 500                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*lm80c*             | LM80C                                       |   YES    |   Zilog 80    |  Z88DK  |      OK?        |       OK       | missing |\r\n*m10*               | Olivetti M10                                |   YES    |  Intel 8085   |  Z88DK  |      OK         |    missing     | missing |\r\n*m100*              | TRS-80 M100                                 |   YES    |  Intel 8085   |  Z88DK  |      OK         |    missing     | missing |\r\n*m5*                | Sord M5                                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK ?  |\r\n*map1010*           | Seiko MAP-1010                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | \r\n*mbc200*            | Sanyo MBC 200                               |   YES?   |   Zilog 80    |  Z88DK  |      OK         |     missing    | missing |\r\n*mc10*              | TRS-80 MC-10 / Alice Matra 4k               |   YES    | Motorola 6803 | CC6303  |      OK         |    missing     |   OK    |\r\n*mc1000*            | CCE MC-1000                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*mega65*            | Mega 65 / Commodore 65                      |   YES    |   MOS 6502    |   CC65  |      OK         |    missing     |   OK    |\r\n*micro8085*         | Micro 8085                                  |   YES?   |  Intel 8085   |  Z88DK  |     N/A?        |      N/A?      |  N/A?   |\r\n*microboard*        | Microboard Computer Development System      |   YES    |   RCA 1802    | LCC1802 |      OK         |       OK       |   OK    |\r\n*microbee*          | Microobee                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*microbee_premium*  | Microobee Premium                           |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*mikro80*           | Mikro 80                                    |   YES    |  Intel 8080   |  Z88DK  |      OK         |      N/A       |   N/A   |\r\n*mo5*               | Thomson Mo series / Olivetti Prodest PC 128 |   YES    | Motorola 6809 |   CMOC  |      OK         |       OK       |   OK    |\r\n*msx*               | MSX 1                                       |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*msx 2*             | MSX 2/2+/Turbo                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*mtx*               | Memotech MTX 512                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK ?  |\r\n*mtx500*            | Memotech MTX 500                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK ?  |\r\n*multi8*            | Mitsubishi Multi 8                          |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*myvision*          | Nichibutsu My Vision                        |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*mz*                | Sharp MZ 80/700                             |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   OK    |\r\n*mz2500*            | Sharp MZ 2500                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*nabu*              | Nabu PC                                     |   YES?   |   Zilog 80    |  Z88DK  |      OK?        |       OK?      | missing |\r\n*nascom*            | Nascom                                      |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       | missing |\r\n*nc100*             | Amstrad NC-100/150                          |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A ? |\r\n*nc200*             | Amstrad NC-200                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A ? |\r\n*nes*               | Nintendo Enterteinment System               |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       | missing |\r\n*newbrain*          | Grundy Newbrain                             |   YES    |   Zilog 80    |  Z88DK  |    missing      |    missing     | missing |    \r\n*ondra*             | Tesla Ondra Vili                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     | missing |\r\n*oric*              | Tangerine Oric 1/Atmos                      |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |   \r\n*osborne1*          | Osborne 1                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A ?     |   N/A ? |\r\n*osca*              | OSCA v6z80p                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*osic1p*            | Ohio Scientific Challenger 1P               |   YES    |   MOS 6502    |   CC65  |      OK         |      N/A ?     |   N/A ? |\r\n*oz*                | Sharp OZ-700                                |   YES    |   Zilog 80    |  Z88DK  |     N/A ?       |      N/A ?     |   N/A ? |\r\n*p2000*             | Philips P2000                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   OK    |\r\n*pacman*            | Pacman Namco arcade board                   |    NO    |   Zilog 80    |  Z88DK  |    missing      |    missing     | missing |\r\n*pasaopia7*         | Toshiba Pasopia 7                           |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing | PSG SN76489 \r\n*pc6001*            | NEC PC 6001                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |    \r\n*pc8201*            | NEC PC 8201                                 |   YES    |  Intel 8085   |  Z88DK  |      OK         |    missing     | missing |\r\n*pc88*              | NEC PC 8801                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     | missing |\r\n*pce*               | PCEngine                                    |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*pcw*               | Amstrad PCW                                 |    ?     |   Zilog 80    |  Z88DK  |       ?         |    missing     | missing | \r\n*pecom*             | Pecom 32/64                                 |   YES    |   RCA 1802    | LCC1802 |      OK         |       OK       |   OK    |\r\n*pencil2*           | Hanimex Pencil II                           |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     | missing | PSG SN76489\r\n*pet*               | Commodore Pet                               |   YES    |   MOS 6502    |   CC65  |      OK         |      N/A       |   OK    |\r\n*phc25*             | Sanyo PHC-25                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*lviv*              | PK-01 LVIV/LVOV                             |   YES    |  Intel 8080   |  Z88DK  |      OK         |       OK       | missing |\r\n*pmd85*             | PMD85                                       |   YES    |  Intel 8080   |  Z88DK  |      OK         |       OK ?     | missing |\r\n*pps*               | Peters Plus Sprinter                        |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A ?     | missing |\r\n*primo*             | Microkey Primo                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     |   OK ?  |\r\n*pv1000*            | Casio PV1000                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing |\r\n*pv2000*            | Casio PV2000                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing | PSG SN76489\r\n*px4*               | Epson PX-4/HC-40                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A ? |\r\n*px8*               | Epson PX-8/HC-80                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A ? |\r\n*qc10*              | Epson QX-10/QC-10                           |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A ?     |   N/A ? |\r\n*radio86*           | Radio 86                                    |   YES?   |   Zilog 80    |  Z88DK  |      OK         |       OK?      | missing |\r\n*rex*               | Xircom Rex 6000                             |    ?     |   Zilog 80    |  Z88DK  |    missing      |    missing     | missing | \r\n*rc2014*            | RC 2014 board                               |     ?    |   Zilog 80    |  Z88DK  |   missing       |    missing     | missing |\r\n*rc700*             | Regnecentralen RC700                        |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A ?     |   N/A ? |\r\n*rcmx00*            | Rabbit Control Module                       |     ?    |   Zilog 80    |  Z88DK  |   missing       |    missing     | missing |\r\n*rx78*              | Bandai RX-78                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing | PSG SN76489\r\n*samcoupe*          | Sam Coupe                                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |     \r\n*sc3000*            | Sega SC 3000                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |         \r\n*scz180*            | SC126 and SC130 boards                      |     ?    |   Zilog 80    |  Z88DK  |   missing       |    missing     | missing |\r\n*sg1000*            | Sega SG 1000                                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | \r\n*smc777*            | Sony SMC-70 / SMC-777                       |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       | missing | PSG SN76489\r\n*sms*               | Sega Master System                          |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK?   | PSG SN76489 Mednafen OK \r\n*sol20*             | Sol 20                                      |   YES?   |  Intel 8085   |  Z88DK  |      OK?        |    missing     | missing |\r\n*sos*               | S-OS                                        |   YES    |   Zilog 80    |  Z88DK  |     N/A         |      N/A       |   N/A   |\r\n*spc1000*           | Samsung SPC 1000                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | \r\n*special*           | Specialist                                  |   NO     |   Zilog 80    |  Z88DK  |      OK         |      N/A ?     |   N/A ? |\r\n*zx*                | Sinclair Spectrum 16k/48k                   |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | \r\n*zx*                | Sinclair Spectrum 128k                      |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | PSG sounds could be improved\r\n*srr*               | Exidy Sorcerer                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A   |\r\n*super80*           | Dick Smith Super 80/80d/80e/80m             |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   OK    |\r\n*super80r*          | Dick Smith Super 80r/80v                    |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     |   OK    |\r\n*supervision*       | Watara Supervision                          |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    |\r\n*sv8000*            | Bandai Supervision 8000                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     |   OK ?  | 4k rom limit\r\n*svi*               | Spectravideo 318/328                        |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | \r\n*t200*              | TRS-80 T200                                 |   YES    |  Intel 8085   |  Z88DK  |      OK         |    missing     | missing |\r\n*telestrat*         | Oric Telestrat                              |   YES    |   MOS 6502    |   CC65  |    missing      |    missing     | missing |\r\n*tmc600*            | Telmac TMC-600                              |   YES    |   RCA 1802    | LCC1802 |      OK         |      N/A       |   OK    | \r\n*ti82*              | Texas Instruments TI 82                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A   | \r\n*ti83*              | Texas Instruments TI 83                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A   | \r\n*ti8x*              | Texas Instruments TI 83 Plus                |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A   | \r\n*ti85*              | Texas Instruments TI 85                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A   | \r\n*ti86*              | Texas Instruments TI 86                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   N/A   | \r\n*tiki100*           | TIKI 100                                    |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | \r\n*tim 011*           | Tim 011                                     |   YES?   |   Zilog 180   |  Z88DK  |      OK?        |       OK?      | missing |\r\n*to7*               | Thomson To series                           |   YES    | Motorola 6809 |   CMOC  |      OK         |       OK       |   OK    | \r\n*trs80*             | TRS-80 Model I/III/IV                       |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |   OK    |\r\n*ts2068*            | Timex TS 2068                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    | \r\n*tvc*               | Videoton TV Computer                        |   YES    |   Zilog 80    |  Z88DK  |    missing      |    missing     | missing |     \r\n*vector06c*         | Вектор-06Ц Vector06c                        |   YES    |   Zilog 80    |  Z88DK  |      OK         |    missing     | missing |\r\n*vg5k*              | VG-5000                                     |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*v1050*             | V1050                                       |   YES?   |   Zilog 80    |  Z88DK  |      OK?        |       OK       | missing |\r\n*vic20*             | Commodore Vic 20                            |   YES    |   MOS 6502    |   CC65  |      OK         |       OK       |   OK    | \r\n*vz*                | VTech VZ200                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*x1*                | Sharp X1                                    |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     |   OK    | mode 0 has udg\r\n*x07*               | Canon X-07                                  |   YES    |   Zilog 80    |  Z88DK  |      OK         |       ?        |    ?    |\r\n*x820*              | Xerox 820                                   |   YES?   |   Zilog 80    |  Z88DK  |      OK         |       OK ?     |   OK    |\r\n*yaz180*            | YAZ 180 board                               |     ?    |   Zilog 80    |  Z88DK  |   missing       |    missing     | missing |\r\n*z1013*             | Robotron Z1013                              |   YES    |   Zilog 80    |  Z88DK  |      OK         |      N/A       |  N/A ?  |\r\n*z80tvgame*         | Z80 TV Game                                 |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     | missing |\r\n*z88*               | Cambridge Z88                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n*z9001*             | Robotron Z9001, KC 85/1, KC 87              |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK ?     | missing |\r\n*zx80*              | Sinclair ZX80                               |   YES    |   Zilog 80    |  Z88DK  |      OK ?       |    missing     |  N/A    |\r\n*zx81*              | Sinclair ZX81                               |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |  N/A    |\r\n*zxn*               | ZX Spectrum Next                            |   YES    |   Zilog 80    |  Z88DK  |      OK         |       OK       |   OK    |\r\n\r\nTOTAL    : 192\r\n\r\nOK       : 183 (170 with real-time input)\r\n\r\nKO       :   2\r\n\r\nUNKNOWN  :   7\r\n\r\n\r\n-----------------------------------------------\r\n\r\n#### Statistics on 8-bit targets\r\n\r\nDev-kit | no. 8-bit targets\r\n--------|--------------------\r\n  Z88DK | 152\r\n   CC65 |  25\r\nLCC1802 |   7 \r\n   CMOC |   5\r\n   VBCC |   2\r\n CC6303 |   1\r\n\r\n\r\n-----------------------------------------------\r\n\r\nCPU family    | no. 8-bit targets  |\r\n--------------|--------------------|\r\nZilog 80      | 136                |\r\nMOS 6502      |  27                |\r\nRCA 1802      |   7                |\r\nIntel 8085    |   7                |\r\nIntel 8080    |   8                |\r\nMotorola 6809 |   5                |\r\nGBZ80         |   1                |\r\nMotorola 6803 |   1                |\r\n\r\n\r\n\r\n\r\n-----------------------------------------------------------------------------------------\r\n\r\n### 16-BIT targets\r\n\r\ntarget name         | long target name                            | working  |   CPU family  | dev-kit | real-time input |    graphics    |  sound  | notes      \r\n--------------------|---------------------------------------------|----------|---------------|---------|-----------------|----------------|---------|-----------\r\n*amiga*             | Commodore Amiga                             |   YES    |    68000      | GCC mod |    missing      |    missing     | missing |\r\n*atari_st*          | Atari ST                                    |   YES    |    68000      | GCC mod |    missing      |    missing     | missing |\r\n*olivetti_m20*      | Olivetti M20                                |   YES    |  Zilog 8001   | Z8K-GCC |    missing      |    missing     | missing |\r\n*pc86*              | PC 8088/86                                  |   YES    | Intel 8086    |   ACK   |      OK         |      OK        |   OK?   |\r\n*msdos86*           | MS-DOS 8086                                 |   YES    | Intel 8086    |   ACK   |      OK         |      OK        |   OK    |\r\n*pdp11v7*           | PDP 11 V7                                   |    ?     |    PDP 11     |   ACK   |    missing      |    missing     | missing |\r\n*sinclair_ql*       | Sinclair QL                                 |   YES    |    68000      |  XTC68  |    missing      |    missing     | missing |\r\n*ti99*              | Texas Instruments TI99/4A                   |   YES    |   TMS 9900    | GCC mod |      OK         |      OK        |   OK    |\r\n*minix68k*          | Minix 68K                                   |    ?     |    68000      |   ACK   |    missing      |    missing     | missing |\r\n\r\n\r\nOK       :   7 (3 with real-time input)\r\n\r\nUNKNOWN  :   2\r\n\r\n\r\n-----------------------------------------------------------------------------------------\r\n\r\n### 32-BIT targets (excluding modern PCs)\r\n\r\ntarget name         | long target name                            | working  |   CPU family  | dev-kit   | real-time input |    graphics    |  sound  | notes      \r\n--------------------|---------------------------------------------|----------|---------------|-----------|-----------------|----------------|---------|-----------\r\n*linux386*          | ELF linux for Intel 386                     |   YES    |   Intel 386   |   ACK     |  missing        |    missing     | missing |\r\n*linux68k*          | ELF linux for Motorola 68020                |   YES    | Motorola 68020|   ACK     |  missing        |    missing     | missing |\r\n*linuxppc*          | ELF linux for PPC                           |   YES    |    PPC        |   ACK     |  missing        |    missing     | missing |\r\n*linuxmips*         | ELF linux for little endian MIPS32r2        |    ?     |   MIPS32r2    |   ACK     |  missing        |    missing     | missing |\r\n*msdos386*          | MS-DOS 386 DPMI                             |   NO     |   Intel 386   |   ACK     |  missing        |    missing     | missing |\r\n*osx386*            | OSX X Mach0 for i386                        |    ?     |   Intel 386   |   ACK     |  missing        |    missing     | missing |\r\n*osxppc*            | OSX X Mach0 for PPC                         |    ?     |    PPC        |   ACK     |  missing        |    missing     | missing |\r\n*rpi*               | RPI GPU                                     |    ?     |   RPI GPU     |   ACK     |  missing        |    missing     | missing |\r\n\r\nOK       :   3 \r\n\r\nKO       :   4\r\n\r\nUNKNOWN  :   1\r\n\r\n-----------------------------------------------------------------------------------------\r\n\r\n### 32-BIT and 64-BIT targets on modern PC systems\r\n\r\ntarget name         | long target name                            | working  |   CPU family  | dev-kit   | real-time input |    graphics    |  sound  | notes      \r\n--------------------|---------------------------------------------|----------|---------------|-----------|-----------------|----------------|---------|-----------\r\n*gcc*               | Native Console version                      |   YES    |   host CPU    |  native   |    OK           |       OK       |   OK    | \r\n*emcc*              | Emscripten                                  |   YES    |  Web Assembly | emscripten|  missing        |     missing    | input   |\r\n\r\n\r\nOK       :   2 (1 wiith real-time input)\r\n\r\n-----------------------------------------------------------------------------------------\r\n\r\n\r\n### GLOBAL STATISTICS\r\n\r\nTOTAL    : 211\r\n\r\nOK       : 194 (179 with real-time input)\r\n\r\nKO       :   4\r\n\r\nUNKNOWN  :  13\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "docs/SUPPORT_FOR_NEW_TARGET.txt",
    "content": "\r\n\r\nExample to add support to PV1000\r\n\r\n\r\nConcerned files:\r\n\r\n        modified:   ../.gitignore\r\n        modified:   assets/templates/8x8/z88dk_pv1000.asm.template\r\n        modified:   cross_lib/cross_lib.h\r\n        modified:   cross_lib/display/color_definitions.h\r\n        modified:   cross_lib/display/display_target_color.h\r\n        modified:   cross_lib/display/graphics_settings.h\r\n        modified:   cross_lib/display/tiles.h\r\n        modified:   games/chase/config/project_config.mk\r\n        modified:   games/shoot/makefiles/Makefile.override\r\n        modified:   games/verbix/config/project_config.mk\r\n        modified:   makefiles.common/targets/z88dk/Makefile_pv1000\r\n\r\nUntracked files:\r\n  (use \"git add <file>...\" to include in what will be committed)\r\n        cross_lib/display/graphics_mode/pv1000_graphics.h\r\n        cross_lib/display/tiles/pv1000_settings.h\r\n\r\n\r\n1. New graphics mode:\r\ncross_lib/display/graphics_settings.h\r\ncross_lib/display/graphics_mode/pv1000_graphics.h\r\n\r\n2. Tile mapping:\r\ncross_lib/display/tiles.h\r\ncross_lib/display/tiles/pv1000_settings.h\r\n"
  },
  {
    "path": "docs/SYSTEMS.md",
    "content": "## SUPPORTED SYSTEMS \r\n\r\n(as of 2020/09/30)\r\n\r\nIn principle you can compile the game with minimal input and output for any recent or old/ancient architecture for which there is an ANSI C capable compiler.\r\nFor most vintage systems, you can build a version of the game with some graphics, sounds and real time input.\r\n\r\n\r\n### 8-BIT targets\r\n\r\nFor most systems, more than one version is built, in order to support different hardware configurations and expansions \r\n(e.g., memory expansions, second CPU, 80-col display card, etc.).\r\n\r\n- `abc80`: Luxor ABC 80\r\n- `abc800`: Luxor ABC 800\r\n- `ace`: Jupiter Ace\r\n- `alphatro`: Alphatronic\r\n- `altair8800`: MITS Altair 8800\r\n- `apple2`: Apple //\r\n- `apple2enh`: Enhanced Apple //e\r\n- `aquarius`: Mattel Aquarius \r\n- `atari5200`: Atari 5200\r\n- `atari`: Atari 400/800/600XL/800XL/1200XL/65XE/130XE\r\n- `atari_jaguar`: Atari Jaguar\r\n- `atari_lynx`: Atari Lynx\r\n- `attache`: Otrona Attache\r\n- `aussie`: Aussie Byte\r\n- `bbc`: BBC Micro\r\n- `bbcmaster`: BBC Master\r\n- `bic`: BIC/A5105\r\n- `bit90`: Bit Corporation BIT 90\r\n- `c128_8502`: Commodore 128 [8502 CPU]\r\n- `c128_z80`: Commodore 128 [Z80 CPU]\r\n- `c16`: Commodore 264 series (16/116/+4)\r\n- `c64`: Commodore 64\r\n- `c7420`: Philips VideoPac C7420 module (z88dk lib incomplete, work in progress)\r\n- `cbm510`: Commodore CBM 510\r\n- `cbm610`: Commodore CBM 610\r\n- `camputers_lynx`: Camputers Lynx 48k/96k/128k\r\n- `cidelsa_altair`: Cidelsa Altair arcade board\r\n- `cidelsa_destroyer`: Cidelsa Destroyer arcade board\r\n- `cidelsa_draco`: Cidelsa Draco arcade board\r\n- `coco`: Color Computer\r\n- `coleco`: Colecovision\r\n- `coleco_adam`: Colecovision Adam\r\n- `comx`: COMX-35\r\n- `cpc`: Amstrad CPC\r\n- `cpm_8080`: CP/M Intel 8080\r\n- `cpm_z80`: CP/M Z80 with adm3a/vt52/vt100 terminals\r\n- `creativision`: VTech Creativision\r\n- `dai`: DAI\r\n- `dmv`: Decision Mate V\r\n- `dragon`: Dragon 32/64\r\n- `eg2k`: EACA EG2000 Color Genie\r\n- `einstein`: Tatung Einstein\r\n- `enterprise`: Enterprise 64/128\r\n- `excalibur64`: Excalibur64\r\n- `fp1100`: Casio FP-1100\r\n- `g800`: Sharp PC-G800\r\n- `gal`: Galaksija\r\n- `gal_plus`: Galaksija Plus\r\n- `gamate`: Gamate\r\n- `gb`: Game Boy\r\n- `gx4000`: Amstrad GX-4000\r\n- `hemc`: Huebler/Evert-MC\r\n- `hgmc`: Huebler-Grafik-MC\r\n- `homelab`: Homelab 4\r\n- `homelab2`: Homelab 2\r\n- `kaypro`: Kaypro 2X\r\n- `kramermc`: Kramer-MCs\r\n- `kc`: Robotron KC-85/2/3/4\r\n- `lambda`: Lambda 8300\r\n- `laser500`: Laser 500\r\n- `m100`: TRS-80 M100 (z88dk lib incomplete, work in progress)\r\n- `m5`: Sord M5\r\n- `mega65`: Mega 65 / Commodore 65\r\n- `mc1000`: CCE MC-1000\r\n- `microboard`: Microboard Computer Development Board\r\n- `microbee`: Microobee\r\n- `mikro80`: Mikro 80\r\n- `mo5`: Thomson Mo5 / Thomson Mo6 / Olivetti Prodest PC 128\r\n- `msx`: MSX\r\n- `mtx`: Memotech MTX 512\r\n- `mtx500`: Memotech MTX 500\r\n- `multi8`: Mitsubishi Multi 8\r\n- `myvision`: Nichibutsu My Vision\r\n- `mz`: Sharp MZ 80/700\r\n- `mz2500`: Sharp MZ 2500\r\n- `nascom`: Nascom\r\n- `nc100`: Amstrad NC-100/150\r\n- `nc200`: Amstrad NC-200\r\n- `nes`: Nintendo Enterteinment System\r\n- `newbrain`: Grundy Newbrain\r\n- `ondra`: Tesla Ondra Vili\r\n- `oric`: Tangerine Oric 1/Atmos\r\n- `osborne1`: Osborne 1\r\n- `osca`: OSCA v6z80p\r\n- `osic1p`: Ohio Scientific Challenger 1P\r\n- `oz`: Sharp OZ-700\r\n- `p2000`: Philips P2000\r\n- `pacman`: Pacman (work in progress)\r\n- `pasaopia7`: Toshiba Pasopia 7\r\n- `pc6001`: NEC PC 6001\r\n- `pc88`: NEC PC 8801\r\n- `pce`: PCEngine\r\n- `pecom`: Pecom 32/64\r\n- `pencil2`: Hanimex Pencil II\r\n- `pet`: Commodore Pet\r\n- `pmd85`: PMD85\r\n- `pps`: Peters Plus Sprinter\r\n- `primo`: Primo\r\n- `pv1000`: Casio PV1000\r\n- `pv2000`: Casio PV2000\r\n- `px4`: Epson PX-4/HC-40\r\n- `px8`: Epson PX-8/HC-80\r\n- `qc10`: Epson QC-10/QX-10\r\n- `rex`: Xircom Rex 6000 (no available emulator, work in progress)\r\n- `rc700`: Regnecentralen RC700\r\n- `rx78`: Bandai RX-78\r\n- `samcoupe`: Sam Coupe\r\n- `sc3000`: Sega SC 3000\r\n- `sg1000`: Sega SG 1000\r\n- `smc777`: Sony SMC-70 / SMC-777\r\n- `sms`: Sega Master System\r\n- `sos`: S-OS \r\n- `spc1000`: Samsung SPC 1000\r\n- `special`: Specialist\r\n- `spectrum`: Sinclair Spectrum 16k/48k/128k\r\n- `srr`: Exidy Sorcerer\r\n- `super80`: Super 80/80d/80e/80m\r\n- `super80r`: Super 80r/Super80v\r\n- `supervision`: Watara Supervision\r\n- `sv8000`: Bandai Supervision 8000\r\n- `svi`: Spectravideo 318/328\r\n- `telestrat`: Oric Telestrat\r\n- `tmc600`: Telmac TMC-600\r\n- `ti82`: Texas TI 82\r\n- `ti83`: Texas TI 83\r\n- `ti8x`: Texas TI 83 Plus\r\n- `ti85`: Texas TI 85\r\n- `ti86`: Texas TI 86\r\n- `tiki100`: TIKI 100\r\n- `to7`: Thomson To7 / To7/70 / To8 / To8d / To8+ / To9 / To9+\r\n- `trs80`: TRS-80 Model I/III/IV\r\n- `ts2068`: Timex TS 2068\r\n- `tvc`: Videoton TV Computer\r\n- `vector06c`: Вектор-06Ц - Vector06c\r\n- `vg5k`: VG-5000\r\n- `vic20`: Commodore Vic 20\r\n- `vz200`: VTech VZ200\r\n- `x07`: Casio X-07 (z88dk lib incomplete, work in progress)\r\n- `x1`: Sharp X1\r\n- `z1013`: Robotron Z1013\r\n- `z80tvgame`: ZX80 TV Game\r\n- `z88`: Cambridge Z88\r\n- `z9001`: Robotron Z9001, Robotron KC 85/1, Robotron KC 87 \r\n- `zx80`: Sinclair ZX80\r\n- `zx81`: Sinclair ZX81\r\n- `zxn` : ZX Spectrum Next\r\n\r\n### 16-BIT targets\r\n- `amiga`: Amiga \r\n- `atari_st`: Atari ST\r\n- `cx16`: Commander X16 (work in progress)\r\n- `olivetti_m20`: Olivetti M20 \r\n- `pc8086`: Intel 8088/8086 PC\r\n- `pdp`: PDP 11 v7 (work in progress)\r\n- `sinclair_ql`: Sinclair QL\r\n- `ti99`: Texas Instruments TI99/4A \r\n\r\n\r\n\r\n### 32-BIT targets\r\n- `linux386`:  ELF linux for Intel 386\r\n- `linux68k`:  ELF linux for Motorola 68020\r\n- `linuxppc`:  ELF linux for PPC\r\n- `linuxmips`: ELF linux for little endian MIPS32r2 (work in progress)\r\n\r\n\r\n### Modern 32/64-BIT PC targets\r\n\r\nThere are a plain stdlib (turn based) and an ncurses (action) version that can be compiled for multiple platforms for which an ANSI C compiler and ncurses are available, including Windows and Linux.\r\nFor example:\r\n- Cygwin/Windows or Linux (gcc + ncurses, e.g., cygwin/Windows or Linux) \r\n- Windows 32/64 bit console (mingw-gcc + ncurses, e.g., x86_64-w64-mingw32-gcc)\r\n"
  },
  {
    "path": "docs/TESTS.md",
    "content": "## COMPILATION TESTS\r\n\r\nWe can test the compilation of the game for multiple targets by running some tests that build a very simple version of the game that may not be playable.\r\nThe purpose of these tests is to test the compilation.\r\n\r\n### SIMPLE GCC-ONLY TESTS\r\nIf you have installed `GCC`, you can run `make simple_test` (short compilation time), which builds the game by only using `GCC` for the host system.\r\nThis test will produce a binary that can be run on the host console.\r\n\r\n### TESTS ON SEVERAL COMPILERS AND TARGETS\r\nYou can run many tests that use several cross-compilers and dev-kits not including Z88DK by running `make no_z88dk_test`.\r\n\r\nYou can run many tests that use several cross-compilers and dev-kits including Z88DK by running `make test` (long compilation time).\r\n\r\n### MORE Z88DK-ONLY TESTS\r\nIf you have installed `Z88DK` you can test lots of Z80 systems and targets by \r\n- `make sccz80_test` to test the compilation of different targets with `SCCZ80`;\r\n- `make zsdcc_test` to test the compilation of different targets with `ZSDCC`\r\n- `make z88dk_test` to cover both cross-compilers.\r\n\r\n"
  },
  {
    "path": "docs/THE_GAME.txt",
    "content": "THE GAME\r\nby Fabrizio Caruso\r\n\r\n- Game idea\r\n\r\nThe idea behind the game was my own and it was not inspired by any other game. \r\nHowever, I later discovered that GNOME Robots is in some respects similar in its basic concept.\r\n\r\nThe key differences are that:\r\n1. the main version of Cross Chase is an action game, whereas Robots is only a turn-based game\r\n2. Cross Chase has other enemy types (skull, missiles, rockets) that require the use of the gun.\r\n3. Cross Chase has other game elements such as different types of walls and items\r\n\r\n- Game goals\r\nThe game goal is to kill two different types of enemies:\r\n1. the \"ghosts\" (shown as faces or \"O\" in no graphics versions), which die if they end up on a mine (or if shot by a bullet)\r\n2. the \"skull\" (shown as a skull or \"+\" in no graphics versions), which only dies if hit multiple times by bullets\r\n\r\nOptionally the player can destroy (horizontal and possibly chasing) missiles and (vertical) rockets by shooting at their bases.\r\n\r\nAll enemies and walls are deadly for the player.\r\n\r\n- Levels\r\nThere are 20 levels. The game has an end. Levels vary in terms of walls, missiles, rockets, items, speed, enemy's chasing strategy, etc.\r\n\r\nNormal levels are completed only by killing all the ghosts.\r\n\r\nBoss levels (every fifth level) are completed only by killing the skull.\r\n\r\n- Items\r\nAny item shown on the screen has a positive effect for the player. There are 10 items. \r\nSpecial and secret items require the player to perform some actions on the same level and/or previous levels.\r\n\r\nHINT: Use the gun to hit or even kill the skull and/or destroy missile and rocket bases to unlock more items in current and next levels."
  },
  {
    "path": "docs/TILES.txt",
    "content": "TILES\r\n\r\nIn the code we use the name tiles for different things:\r\n- tile absolute index  [used to display]  \"_TILE_{index}\", i.e., and index in memory that points to the tile data\r\n- tile relative index  [used to redefine] \"_TILE_{index}_OFFSET\", i.e. a relative index in memory (e.g., Atari 8-bit mode 1 characters are repeated 4 times)\r\n- tile data (in template files)           \"<TILE_{tile #}>\", i.e., this is the data that defines the shape of tiles \r\n- tile data in C code (in header files)   \"_TILE_{tile #}_UDG\" contains \"<TILE_{tile #}>\"\r\n\r\n----------------------------------------------------------------------------------------------\r\nTILE   | TILE |   CAN HAVE               | EXAMPLE CHARACTER\r\nINDEX  |   #  |   INTRINSIC COLOR (*)    | IN CROSS CHASE AND CROSS SHOOT                     \r\n----------------------------------------------------------------------------------------------\r\n   0   |   0  |                     CYAN | PLAYER DOWN\r\n----------------------------------------------------------------------------------------------\r\n   1   |   1  |                     CYAN | PLAYER UP\r\n----------------------------------------------------------------------------------------------\r\n   2   |   2  |                     CYAN | PLAYER RIGHT\r\n----------------------------------------------------------------------------------------------\r\n   3   |   3  |                     CYAN | PLAYER LEFT\r\n----------------------------------------------------------------------------------------------\r\n   4   |   4  |                    WHITE | GHOST\r\n----------------------------------------------------------------------------------------------\r\n   5   |   5  |                      RED | MINE\r\n----------------------------------------------------------------------------------------------\r\n   6   |   6  |                      RED | DEAD GHOST/BOSS\r\n----------------------------------------------------------------------------------------------\r\n   7   |   7  |                   YELLOW | SKULL\r\n----------------------------------------------------------------------------------------------\r\n   8   |   8  |                    GREEN | CALM-DOWN\r\n----------------------------------------------------------------------------------------------\r\n   9   |   9  |       CYAN/PURPLE/YELLOW | GUN/FIRE POWER\r\n----------------------------------------------------------------------------------------------\r\n  10   |  10  |                  YELLOW  | INVINCIBILITY\r\n----------------------------------------------------------------------------------------------\r\n  11   |  11  |                    WHITE | BULLET\r\n----------------------------------------------------------------------------------------------\r\n  12   |  12  |                   YELLOW | VERTICAL BRICK\r\n----------------------------------------------------------------------------------------------\r\n  13   |  13  |                   YELLOW | HORIZONTAL BRICK\r\n----------------------------------------------------------------------------------------------\r\n  14   |  14  |                    WHITE | LEFT HORIZONTAL MISSILE\r\n----------------------------------------------------------------------------------------------\r\n  15   |  15  |                    WHITE | RIGHT HORIZONTAL MISSILE\r\n----------------------------------------------------------------------------------------------\r\n  16   |  16  |                    WHITE | ROCKET\r\n----------------------------------------------------------------------------------------------\r\n  17   |  17  |                     CYAN | FREEZE\r\n----------------------------------------------------------------------------------------------\r\n  18   |  18  |                      RED | SUPER\r\n----------------------------------------------------------------------------------------------\r\n  19   |  13  |                     CYAN | \r\n----------------------------------------------------------------------------------------------\r\n  20   |  14  |                     CYAN | \r\n----------------------------------------------------------------------------------------------\r\n  21   |  15  |                     CYAN | \r\n----------------------------------------------------------------------------------------------\r\n  22   |  16  |                     CYAN | \r\n----------------------------------------------------------------------------------------------\r\n  23   |  17  |                     CYAN | \r\n----------------------------------------------------------------------------------------------\r\n  24   |  18  |                   YELLOW | \r\n----------------------------------------------------------------------------------------------\r\n  0_B  |   0  |                    WHITE | EXTRA LIFE    (PLAYER_DOWN)\r\n----------------------------------------------------------------------------------------------\r\n  4_B  |   4  |                   YELLOW | SUICIDE       (GHOST)\r\n----------------------------------------------------------------------------------------------\r\n  5_B  |   5  |                   YELLOW | BROKEN BRICK  (BOMB)\r\n----------------------------------------------------------------------------------------------\r\n  7_B  |   7  |                      RED | CONFUSE       (SKULL)\r\n----------------------------------------------------------------------------------------------\r\nDOLLAR |DOLLAR|                   YELLOW | DOLLAR SYMBOL [FIXED SHAPE]\r\n----------------------------------------------------------------------------------------------\r\n\r\n(*)  Some systems have tiles/characters with pre-assigned colors. The intrinsic color is the pre-assigned color to a tile (on most systems).\r\n\r\n\r\n"
  },
  {
    "path": "docs/TODO.txt",
    "content": "TODO\n\n 1. Improve documentation on how to add new targets\n\n 2. Factorize cmoc/stdlib includes in all concerned files\n\n 3. Fix implicit declaraton of kbhit and getch\n\n 4. _XL_NO_LOWER_BORDER fix/implementation\n\n 5. Retest BEE input\n\n 6. Check Unix compilation (A7800 assets?)\n\n 7. Compiler options should be settable per game\n\nTargets to improve/fix\n\tZ80:\n    - Casio FP 1100 (random zombie characters/missed display)\n    - Bandai Supervision 8000 (REMARK: ONLY 4k roms in real hardware)\n    - TVC Videoton (not cursor position)\n    - M100 (only single pixel graphics)\n    - MZ 2500\n    - Cambridge Z88 \n    - Sharp OZ\n\t- Coleco Adam\n\t- Super 80\n\t- ABC 800\n\t\n\t6809:\n\t- Vectrex\n\t\n\t8501:\n\t- Minitel [SDCC]\n\t\n\t6502:\n\t- Oric Telestrat\n\t- Acorn BBC Micro / Atom\n\t- Atari 2600 \n\t\n\t65C816 \n\t- Super NES [GBDK: http://gbdk.sourceforge.net/]\n\t\n\t68000:\n\t- Amiga\n\n8. Add more CP/M targets with just different disk image formats:\nSUBTYPE    actrix    -Cz+cpmdisk -Cz-f -Czactrix -Cz--container=imd -D__ACTRIX__\nSUBTYPE    actrixss  -Cz+cpmdisk -Cz-f -Czactrixss -Cz--container=imd -D__ACTRIX__\nSUBTYPE    adam      -Cz+cpmdisk -Cz-f -Czcol1 -Cz--container=raw -D__COLECOADAM__ -D__COLECO__ -ladam -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -pragma-define:__HAVE_TMS99X8=1\nSUBTYPE    alphatro  -Cz+cpmdisk -Cz-f -Czalphatro -Cz--container=imd -lalphatro_cpm -D__ALPHATRO__\nSUBTYPE    altos5    -Cz+cpmdisk -Cz-f -Czaltos5 -Cz--container=imd -D__ALTOS__\nSUBTYPE    altos580  -Cz+cpmdisk -Cz-f -Czaltos580 -Cz--container=imd -D__ALTOS__\nSUBTYPE    ampro     -Cz+cpmdisk -Cz-f -Czampro -Cz--container=imd -D__AMPRO__\nSUBTYPE    amust     -Cz+cpmdisk -Cz-f -Czamust -Cz--container=imd -D__AMUST__\nSUBTYPE    amustold  -Cz+cpmdisk -Cz-f -Czamustold -Cz--container=imd -D__AMUST__\nSUBTYPE    apple2    -Cz+cpmdisk -Cz-f -Czapple2 -Cz--container=raw -Cz--extension=.dsk -lapple2 -D__APPLE__\nSUBTYPE    aussie    -Cz+cpmdisk -Cz-f -Czaussie -Cz--container=imd -laussie -D__AUSSIE__\nSUBTYPE    archive   -Cz+cpmdisk -Cz-f -Czarchive -Cz--container=imd -D__ARCHIVE__\nSUBTYPE    attache   -Cz+cpmdisk -Cz-f -Czattache -lattache -D__ATTACHE__\nSUBTYPE    beehive   -Cz+cpmdisk -Cz-f -Czbeehive -Cz--container=imd -D__BEEHIVE__\nSUBTYPE    bbc       -Cz+cpmdisk -Cz-f -Czbbc -Cz--container=raw -Cz--extension=.ssd -D__BBC__\nSUBTYPE    bic       -Cz+cpmdisk -Cz-f -Czbic -Cz--container=ana -lbic -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -D__BIC__\nSUBTYPE    bigboard  -Cz+cpmdisk -Cz-f -Czbigboard -Cz--container=imd -Cz--container=imd -D__X820__ -lx820ii -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CRT_ORG_GRAPHICS=50000 -pragma-define:TAR__clib_gfx_fatpix=1\nSUBTYPE    bondwell  -Cz+cpmdisk -Cz-f -Czbw12 -lbondwell -D__BONDWELL__ -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25 \nSUBTYPE    bondwell2 -Cz+cpmdisk -Cz-f -Czbw2 -lbondwell2 -D__BONDWELL2__ -pragma-define:CRT_ORG_GRAPHICS=47000 -pragma-define:REGISTER_SP=47000 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25 -clib=ixiy\nSUBTYPE    compactor -Cz+cpmdisk -Cz-f -Czcompactor -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    corvette  -Cz+cpmdisk -Cz-f -Czcorvette -Cz--container=raw -D__CORVETTE__ -Cz--extension=.kdi -pragma-define:CLIB_FPUTC_CLS_CODE=0x1f -clib=8080\nSUBTYPE    corvboot  -Cz+cpmdisk -Cz-f -Czcorvboot -Cz--container=raw -D__CORVETTE__ -Cz--extension=.kdi -pragma-define:CLIB_FPUTC_CLS_CODE=0x1f -clib=8080\nSUBTYPE    cpc       -Cz+cpmdisk -Cz-f -Czcpcsystem -Cz--force-com-ext -lcpccpm -D__CPC__\nSUBTYPE    cpcvortex -Cz+cpmdisk -Cz-f -Czcpcvortex -Cz--force-com-ext -lcpccpm -D__CPC__\nSUBTYPE    dmvss     -Cz+cpmdisk -Cz-f -Czdmvss -Cz--container=imd -D__DMV__\nSUBTYPE    dmv       -Cz+cpmdisk -Cz-f -Czdmv -Cz--container=imd -D__DMV__\nSUBTYPE    eagle2    -Cz+cpmdisk -Cz-f -Czeagle2 -Cz--container=imd -D__EAGLE2__\nSUBTYPE    einstein  -Cz+cpmdisk -Cz-f -Czeinstein -leinstein -pragma-define:CONSOLE_COLUMNS=40 -pragma-define:CONSOLE_ROWS=24 -D__EINSTEIN__ -pragma-define:__HAVE_TMS99X8=1 -pragma-define:CLIB_FPUTC_CLS_CODE=0x0c\nSUBTYPE    einstein256 -Cz+cpmdisk -Cz-f -Czeinstein -leinstein -pragma-define:CONSOLE_COLUMNS=40 -pragma-define:CONSOLE_ROWS=24 -D__EINSTEIN__ -D__EINSTEIN256__ -pragma-define:__HAVE_TMS99X8=1 -pragma-define:CLIB_FPUTC_CLS_CODE=0x0c -leinstein256\nSUBTYPE    excali64  -Cz+cpmdisk -Cz-f -Czexcali64 -Cz--container=raw -D__EXCALI64__ -pragma-define:CRT_ORG_GRAPHICS=50000 -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -lexcali64_cpm\nSUBTYPE    fmgcpm    -Cz+cpmdisk -Cz-f -Czfmgcpm -Cz--container=imd -ltrs80_cpm -lgfxtrs80m2 -D__TRS80__ -D__TRS80II__\nSUBTYPE    fp1100    -Cz+cpmdisk -Cz-f -Czfp1100 -Cz--container=d88 -D__FP1100__ -lfp1100_cpm -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=40 \nSUBTYPE    g2skk     -Cz+cpmdisk -Cz-f -Czg2skk -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g2skkb    -Cz+cpmdisk -Cz-f -Czg2skkb -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g2sgs     -Cz+cpmdisk -Cz-f -Czg2sgs -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g3lowe22a -Cz+cpmdisk -Cz-f -Czg3lowe22a -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g3lowe22b -Cz+cpmdisk -Cz-f -Czg3lowe22b -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g3holte22 -Cz+cpmdisk -Cz-f -Czg3holte22 -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g3holte30 -Cz+cpmdisk -Cz-f -Czg3holte30 -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g3kk      -Cz+cpmdisk -Cz-f -Czg2skk -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    g3skk     -Cz+cpmdisk -Cz-f -Czg2skk -Cz--container=dmk -ltrs80_cpm -D__TRS80__\nSUBTYPE    gemini    -Cz+cpmdisk -Cz-f -Czgemini -Cz--container=imd -lgemini -D__GEMINI__\nSUBTYPE    gnat10    -Cz+cpmdisk -Cz-f -Czgnat10 -Cz--container=d88 -D__GNAT__\nSUBTYPE    holmes    -Cz+cpmdisk -Cz-f -Czholmes -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    hp125     -Cz+cpmdisk -Cz-f -Czhp125 -Cz--container=imd -D__HP125__\nSUBTYPE    hz89      -Cz+cpmdisk -Cz-f -Czhz89 -Cz--container=imd -lgfxh19 -D__ZENITH__\nSUBTYPE    hz100     -Cz+cpmdisk -Cz-f -Czhz100 -Cz--container=imd -lgfxh19 -D__ZENITH__\nSUBTYPE    itt3030   -Cz+cpmdisk -Cz-f -Czitt3030 -D__ITT__\nSUBTYPE    kaypro83  -Cz+cpmdisk -Cz-f -Czkayproii -D__KAYPROII__ -D__KAYPRO83__ -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -pragma-define:CRT_ORG_GRAPHICS=47000 -lgfxkp83 -pragma-export:GRAPHICS_CHAR_SET=31 -pragma-export:GRAPHICS_CHAR_UNSET=32\nSUBTYPE    kaypro84  -Cz+cpmdisk -Cz-f -Czkayproii -D__KAYPRO84__ -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25 -lgfxkp\nSUBTYPE    lifeboat  -Cz+cpmdisk -Cz-f -Czlifeboat -Cz--container=imd -ltrs80_cpm -lgfxtrs80m2 -D__TRS80__ -D__TRS80II__\nSUBTYPE    lynx      -Cz+cpmdisk -Cz-f -Czlynx -Cz--container=raw -Cz--extension=.ldf -D__LYNX__\nSUBTYPE    lnw80     -Cz+cpmdisk -Cz-f -Czlnw80 -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    max80     -Cz+cpmdisk -Cz-f -Czmax80cpm3 -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    magnolia  -Cz+cpmdisk -Cz-f -Czmagnolia -Cz--container=imd -lgfxh19 -D__ZENITH__\nSUBTYPE    mikko320  -Cz+cpmdisk -Cz-f -Czmikko-320 -Cz--container=dsk  -D__MIKKO__ -clib=8085\nSUBTYPE    mbc1100   -Cz+cpmdisk -Cz-f -Czmbc1000 -Cz--container=imd -D__SANYO__ -D__MB1100__\nSUBTYPE    mbc1160   -Cz+cpmdisk -Cz-f -Czmbc1200 -Cz--container=imd -D__SANYO__ -D__MBC1160__\nSUBTYPE    mbc200    -Cz+cpmdisk -Cz-f -Czmbc1200 -Cz--container=imd -lmbc200 -D__SANYO__ -D__MBC200__ -pragma-define:CONSOLE_ROWS=33 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:ansirows=33\nSUBTYPE    md2       -Cz+cpmdisk -Cz-f -Czmorrow2 -Cz--container=imd -D__MORROW__\nSUBTYPE    md3       -Cz+cpmdisk -Cz-f -Czmorrow3 -Cz--container=imd -D__MORROW__\nSUBTYPE    mbc2000   -Cz+cpmdisk -Cz-f -Czmbc2000 -Cz--container=imd -D__SANYO__ -D__MBC2000__ -clib=8080\nSUBTYPE    merchant  -Cz+cpmdisk -Cz-f -Czmerchant -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    microbee40 -Cz+cpmdisk -Cz-f -Czmicrobee-ds40 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lmicrobee -D__BEE__ -Ca-D__BEE__\nSUBTYPE    microbee  -Cz+cpmdisk -Cz-f -Czmicrobee-ds80 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lmicrobee -D__BEE__ -Ca-D__BEE__\nSUBTYPE    micromate -Cz+cpmdisk -Cz-f -Czmicromate -Cz--container=imd -D__MICROMATE__\nSUBTYPE    montezuma -Cz+cpmdisk -Cz-f -Czmontezuma -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    m4cpm3    -Cz+cpmdisk -Cz-f -Czm4cpm3 -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    msx       -Cz+fat -Cz-f -Czmsxdos -Cz--container -Czdsk -D__MSX__ -pragma-define:__HAVE_TMS99X8=1 -lcpm_msx\nSUBTYPE    mz80      -Cz+cpmdisk -Cz-f -Czmz80 -Cz--container=dsk -DSHARPMZ -D__SHARPMZ__\nSUBTYPE    mz800     -Cz+cpmdisk -Cz-f -Czmz800 -Cz--container=dsk -DSHARPMZ -D__SHARPMZ__\nSUBTYPE    mz2000    -Cz+cpmdisk -Cz-f -Czmz2000 -DSHARPMZ -D__SHARPMZ__\nSUBTYPE    mz2500    -Cz+cpmdisk -Cz-f -Czmz2500cpm -D__MZ2500__\nSUBTYPE    mz3500    -Cz+cpmdisk -Cz-f -Czmz3500 -Cz--container=raw -D__MZ3500__\nSUBTYPE    nabu      -Cz+cpmdisk -Cz-f -Cznabupc -Cz--container=raw -lnabu_cpm -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -D__NABUPC__ -Ca-D__NABUPC__ -pragma-define:__HAVE_TMS99X8=1\nSUBTYPE    nabu-nshd8 -Cz+cpmdisk -Cz-f -Cznshd8 -Cz--container=raw -lnabu_cpm -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -D__NABUPC__ -Ca-D__NABUPC__ -pragma-define:__HAVE_TMS99X8=1\nSUBTYPE    naburn    -Cz+cpmdisk -Cz-f -Cznaburn -Cz--container=raw -lnabu_cpm -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -D__NABUPC__ -Ca-D__NABUPC__ -pragma-define:__HAVE_TMS99X8=1\nSUBTYPE    nanos     -Cz+cpmdisk -Cz-f -Czcaos -Cz--container=ana -D__NANOS__ -lnanos\nSUBTYPE    nascom    -Cz+cpmdisk -Cz-f -Cznascomcpm -Cz--container=raw -lnascomcpm -pragma-export:CONSOLE_DISPLAY=0xf800 -pragma-define:CONSOLE_ROWS=16 -pragma-define:ansirows=16 -D__NASCOM__\nSUBTYPE    omikron   -Cz+cpmdisk -Cz-f -Czomikron -Cz--container=imd -ltrs80_cpm -D__TRS80__\nSUBTYPE    osborne1  -Cz+cpmdisk -Cz-f -Czosborne1 -lgfxosborne1 -Cz--container=imd -D__OSBORNE1__\nSUBTYPE    osborne1sd -Cz+cpmdisk -Cz-f -Czosborne1sd -lgfxosborne1 -Cz--container=imd -D__OSBORNE1__\nSUBTYPE    partner   -Cz+cpmdisk -Cz-f -Czidpfdd -Cz--container=raw -D__PARTNER__ \nSUBTYPE    pasopia   -Cz+cpmdisk -Cz-f -Czpasopia -Cz--container=d88 -D__PASOPIA__\nSUBTYPE    pc6001    -Cz+cpmdisk -Cz-f -Czpc6001 -Cz--container=d88 -D__PC6001__\nSUBTYPE    pc8001    -Cz+cpmdisk -Cz-f -Czpc8001 -Cz--container=d88 -D__PC88__\nSUBTYPE    pc88      -Cz+cpmdisk -Cz-f -Czpc88 -Cz--container=d88 -D__PC88__\nSUBTYPE    pcw40     -Cz+cpmdisk -Cz-f -Czpcw40 -lpcw -pragma-define:CRT_ORG_GRAPHICS=61000 -pragma-define:REGISTER_SP=61000 -pragma-export:CLIB_PCW_FARHEAP_BANK_START=0x90 -pragma-export:CLIB_PCW_DEFAULT_BANK=0x86\nSUBTYPE    pcw80     -Cz+cpmdisk -Cz-f -Czpcw80 -lpcw -pragma-define:CRT_ORG_GRAPHICS=61000 -pragma-define:REGISTER_SP=61000 -pragma-export:CLIB_PCW_FARHEAP_BANK_START=0x90 -pragma-export:CLIB_PCW_DEFAULT_BANK=0x86\nSUBTYPE    ptcpm     -Cz+cpmdisk -Cz-f -Czptcpm -Cz--container=imd -ltrs80_cpm -lgfxtrs80m2 -D__TRS80__ -D__TRS80II__\nSUBTYPE    px        -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -D__PX8__\nSUBTYPE    pxansi    -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -pragma-need=ansiterminal -D__CONIO_VT100 -pragma-define:ansicolumns=60 -pragma-define:ansipixels=480 -pragma-define:ansirows=10 -pragma-redirect:ansifont=_font_8x6_px -pragma-define:ansifont_is_packed=0 -D__PX8__\nSUBTYPE    px4       -Cz+px -lpx4 -Cz--32k -D__PX4__\nSUBTYPE    px4ansi   -Cz+px -lpx4 -Cz--32k -pragma-need=ansiterminal -D__CONIO_VT100 -pragma-define:ansipixels=240 -pragma-define:ansirows=8  -pragma-define:ansicolumns=30 -D__PX4__ \nSUBTYPE    px8       -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -D__PX8__\nSUBTYPE    px8ansi   -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -pragma-need=ansiterminal -D__CONIO_VT100 -pragma-define:ansicolumns=60 -pragma-define:ansipixels=480 -pragma-define:ansirows=10 -pragma-redirect:ansifont=_font_8x6_px -pragma-define:ansifont_is_packed=0 -D__PX8__\nSUBTYPE    qc10      -Cz+cpmdisk -Cz-f -Czqc10 -D__QC10__ -D__QX10__\nSUBTYPE    qc10m1    -Cz+cpmdisk -Cz-f -Czqc10m1 -D__QC10__ -D__QX10__\nSUBTYPE    rc700     -Cz+cpmdisk -Cz-f -Czrc700 -Cz--container=imd -D__RC700__ -pragma-define:CONSOLE_ROWS=25 -pragma-define:CONSOLE_COLUMNS=80 -lrc700 -pragma-export:GRAPHICS_CHAR_SET=127 -pragma-export:GRAPHICS_CHAR_UNSET=32\nSUBTYPE    rainbow   -Cz+cpmdisk -Cz-f -Czrainbow -Cz--container=imd -D__RAINBOW__\nSUBTYPE\t   sagafox   -Cz+cpmdisk -Cz-f -Czsagafox -Cz--container=imd\nSUBTYPE\t   sam       -Cz+cpmdisk -Cz-f -Czpcw80 -Cz--container=raw -Cz--extension=.dsk -lsam_cpm -startup=3\nSUBTYPE\t   seequa    -Cz+cpmdisk -Cz-f -Czseequa -Cz--container=imd\nSUBTYPE    smc777    -Cz+cpmdisk -Cz-f -Czsmc777 -D__SMC777__ -lsmc777_cpm -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25\nSUBTYPE    svi       -Cz+cpmdisk -Cz-f -Czsvi-40ss -D__SVI__ -pragma-define:__HAVE_TMS99X8=1\nSUBTYPE    teletek   -Cz+cpmdisk -Cz-f -Czteletekds -Cz--container=imd -D__TELETEK__\nSUBTYPE    televideo -Cz+cpmdisk -Cz-f -Cztelevideo -Cz--container=imd -D__TELEVIDEO__\nSUBTYPE    tiki100   -Cz+cpmdisk -Cz-f -Cztiki100ss -D__TIKI100__ -ltiki100 -pragma-define:CRT_ORG_GRAPHICS=48000 -pragma-define:REGISTER_SP=48000 -pragma-define:CONSOLE_ROWS=32 -pragma-define:CONSOLE_COLUMNS=128\nSUBTYPE    tiki100_400k -Cz+cpmdisk -Cz-f -Cztiki100ds -D__TIKI100__ -ltiki100 -pragma-define:CRT_ORG_GRAPHICS=48000 -pragma-define:REGISTER_SP=48000 -pragma-define:CONSOLE_ROWS=32 -pragma-define:CONSOLE_COLUMNS=128\nSUBTYPE    tim011    -Cz+cpmdisk -Cz-f -Cztim011 -D__TIM011__ -Cz--container=raw -ltim011 -clib=z180\nSUBTYPE    v1050     -Cz+cpmdisk -Cz-f -Czv1050 -Cz--container=imd -D__V1050__ -lv1050 -pragma-define:CONSOLE_ROWS=25 -pragma-define:CONSOLE_COLUMNS=80\nSUBTYPE    cortex    -Cz+cpmdisk -Cz-f -Czcortex -Cz--container=imd -D__V1050__ -lv1050 -pragma-define:CONSOLE_ROWS=25 -pragma-define:CONSOLE_COLUMNS=80\nSUBTYPE    vector06c -Cz+cpmdisk -Cz-f -Czvector06c -Cz--container=raw -D__VECTOR06C__ -clib=8080\nSUBTYPE    vt180     -Cz+cpmdisk -Cz-f -Czvt180 -Cz--container=imd -D__VT180__\nSUBTYPE    x1        -Cz+cpmdisk -Cz-f -Czsharpx1 -Cz--container=d88 -D__SHARPX1__ -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -lx1_cpm -pragma-define:CLIB_DEFAULT_SCREEN_MODE=1\nSUBTYPE    x820      -Cz+cpmdisk -Cz-f -Czx820 -Cz--container=imd -D__X820__ -lx820ii -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CRT_ORG_GRAPHICS=50000 -pragma-define:TAR__clib_gfx_fatpix=1\nSUBTYPE    z80pack   -Cz+cpmdisk -Cz-f -Czz80pack -Cz--container=raw -Cz--extension=.dsk\nSUBTYPE    z80retro  -lz80retro_cpm -pragma-define:CONSOLE_COLUMNS=40 -pragma-define:CONSOLE_ROWS=24 -D__Z80RETRO__ -pragma-define:__HAVE_TMS99X8=1\nSUBTYPE    zxplus3   -Cz+cpmdisk -Cz-f -Czplus3 -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3\nSUBTYPE    diskface  -Cz+cpmdisk -Cz-f -Czdiskface -Cz--container=raw  -Cz--extension=.raw -D__ZXPLUS3__ -lzxcpm -startup=4\nSUBTYPE    zxlec     -Cz+zx -Cz--lec-cpm -D__ZXPLUS3__ -lzxcpm -startup=5\nSUBTYPE    lec80t    -Cz+cpmdisk -Cz-f -Czlec80t -Cz--container=imd -D__ZXPLUS3__ -lzxcpm -startup=5\nSUBTYPE    scorpion  -Cz+cpmdisk -Cz-f -Czscorpion -Cz--container=raw  -Cz--extension=.trd -D__ZXPLUS3__ -lzxcpm -startup=3\nSUBTYPE    atmturbo  -Cz+cpmdisk -Cz-f -Czatmturbo -Cz--container=raw  -Cz--extension=.trd -D__ZXPLUS3__ -lzxcpm -startup=3\nSUBTYPE    quorum    -Cz+cpmdisk -Cz-f -Czquorum -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3\nSUBTYPE    hc91      -Cz+cpmdisk -Cz-f -Czhc91 -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3\nSUBTYPE    hc2000    -Cz+cpmdisk -Cz-f -Czhc2000 -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3"
  },
  {
    "path": "docs/VGA_from_protected_mode.txt",
    "content": "vga_mode13.s (ACK / Minix-386 assembly)\r\n        .globl  set_mode13h\r\n        .globl  set_textmode\r\n        .globl  init_vga_memory\r\n        .globl  A000\r\n\r\n        .data\r\n\r\n! -------------------------------------------------------\r\n! DPMI Real-Mode Register Structure (44 bytes)\r\n! Layout (ACK labels below). This block is zeroed before use.\r\n! -------------------------------------------------------\r\nRMRegs:\r\nRM_Edi:        .long 0      ! offset 0\r\nRM_Esi:        .long 0      ! offset 4\r\nRM_Ebp:        .long 0      ! offset 8\r\nRM_Res:        .long 0      ! offset 12 (reserved)\r\nRM_Ebx:        .long 0      ! offset 16\r\nRM_Edx:        .long 0      ! offset 20\r\nRM_Ecx:        .long 0      ! offset 24\r\nRM_Eax:        .long 0      ! offset 28\r\nRM_Flags:      .word 0      ! offset 32\r\nRM_ES:         .word 0      ! offset 34\r\nRM_DS:         .word 0      ! offset 36\r\nRM_FS:         .word 0      ! offset 38\r\nRM_GS:         .word 0      ! offset 40\r\nRM_IP:         .word 0      ! offset 42\r\nRM_CS:         .word 0      ! offset 44 (note: some hosts expect 44+; we keep labels for compatibility)\r\nRM_SP:         .word 0\r\nRM_SS:         .word 0\r\n\r\nRMRegs_end:\r\n\r\n! -------------------------------------------------------\r\n! Storage for protected-mode pointer/selector for A0000h\r\n! The C side expects 'unsigned char *A000' symbol.\r\n! -------------------------------------------------------\r\nA000:          .long 0\r\n\r\n        .text\r\n\r\n! =======================================================\r\n! void set_mode13h(void)\r\n! - zero RM register block\r\n! - set EAX = 0x0013 (BIOS: AH=0 AL=13h)\r\n! - call DPMI: AX=0x0300, BL=0x10 (simulate int 10h)\r\n! =======================================================\r\nset_mode13h:\r\n\r\n        ! Clear RM register structure bytewise\r\n        leal    RMRegs, %edi\r\n        movl    $0, %eax\r\n        movl    $((RMRegs_end - RMRegs)), %ecx\r\n1:\r\n        movb    %al, (%edi)\r\n        incl    %edi\r\n        loop    1b\r\n\r\n        ! Set EAX = 0x00000013 for BIOS int 10h (set video mode)\r\n        movl    $0x00000013, RM_Eax\r\n\r\n        ! Prepare DPMI simulate real-mode int:\r\n        ! AX = 0x0300, BL = int number (0x10)\r\n        movw    $0x0300, %ax\r\n        movb    $0x10, %bl\r\n        movb    $0x00, %bh\r\n\r\n        ! ES:DI -> pointer to RMRegs (DPMI expects a far pointer here)\r\n        leal    RMRegs, %edi\r\n        int     $0x31\r\n\r\n        ret\r\n\r\n\r\n! =======================================================\r\n! void set_textmode(void)\r\n! - same as above but AX = 0x0003 (text mode 03h)\r\n! =======================================================\r\nset_textmode:\r\n\r\n        ! Clear RM register structure\r\n        leal    RMRegs, %edi\r\n        movl    $0, %eax\r\n        movl    $((RMRegs_end - RMRegs)), %ecx\r\n2:\r\n        movb    %al, (%edi)\r\n        incl    %edi\r\n        loop    2b\r\n\r\n        ! AX = 0x0003 (text mode)\r\n        movl    $0x00000003, RM_Eax\r\n\r\n        movw    $0x0300, %ax\r\n        movb    $0x10, %bl\r\n        movb    $0x00, %bh\r\n        leal    RMRegs, %edi\r\n        int     $0x31\r\n\r\n        ret\r\n\r\n\r\n! =======================================================\r\n! void init_vga_memory(void)\r\n! - map physical A0000h (0xA0000) into protected-mode pointer\r\n! - uses DPMI function 0x0800 (service varies by host),\r\n!   many hosts return selector:offset in EAX/Ebx — this is\r\n!   somewhat host-dependent; the simple approach below\r\n!   uses INT 31h with AX=0x0800 (allocate/ map) which on\r\n!   many DPMI hosts returns linear pointer in EAX.\r\n! - After call we store EAX into A000 (caller reads it as pointer)\r\n! =======================================================\r\ninit_vga_memory:\r\n\r\n        ! physical base = 0x000A0000\r\n        movl    $0x000A0000, %ebx\r\n        ! size = 0x10000 (64K)\r\n        movl    $0x00010000, %ecx\r\n        ! access flags: 1 = read/write (host-specific)\r\n        movl    $0x00000001, %edx\r\n\r\n        ! DPMI function to map physical memory -> AX = 0x0800\r\n        movw    $0x0800, %ax\r\n        int     $0x31\r\n\r\n        ! store returned pointer/selector (EAX) into A000\r\n        movl    %eax, A000\r\n        ret\r\n\r\nvga.h (C header)\r\n/* vga.h */\r\n#ifndef VGA_H\r\n#define VGA_H\r\n\r\n/* switch to VGA 320x200x256 */\r\nvoid set_mode13h(void);\r\n\r\n/* restore text mode 80x25 */\r\nvoid set_textmode(void);\r\n\r\n/* map VGA memory A0000 -> returns pointer in global A000 (extern) */\r\nvoid init_vga_memory(void);\r\n\r\n/* extern pointer to VGA linear memory (set by init_vga_memory) */\r\nextern unsigned char *A000;\r\n\r\n#endif"
  },
  {
    "path": "docs/VZ.txt",
    "content": "VZ keyboard echo fix\r\n\r\n*((byte *)0x7839) |= 1; (that is, set bit 0 to \"1\")\r\n"
  },
  {
    "path": "docs/XL.md",
    "content": "## BUILDING PROJECTS\r\n\r\nWe recommend to use `xl` (equivalent to `xl build`) to build projects.\r\n\r\n### Using `xl`\r\n\r\nI recommend that you use `xl build`:\r\n\r\n`xl  [game_or_test_name] [optional system_name] [optional number of threads]`\r\n\r\nA convenient shortcut is using just `xl` as follows:\r\n\r\n`xl [project_name] [optional system_name] [optional number of threads]`\r\n\r\nThe `[optional system_name]` parameter is the name of the target. If no target is specified then the native target (the host terminal) is implied.\r\n\r\nThe `[optional number of threads]` is used to specify the number of threads to use for multiple targets that can be built in parallel.\r\n\r\nExamples:\r\n- `xl snake` -> It builds Cross Snake for the native console by using `gcc` and `ncurses`.\r\n- `xl bomber atari` -> It builds Cross Bomber for the Atari 8-bit target (by using the appropriate cross-compiler, i.e., CC65)\r\n- `xl snake vic20` -> It builds Cross Snake for the Commodore Vic 20.\r\n- `xl games msx` -> It builds all game projects for the MSX target (by using the appropriate cross-compiler, i.e., the ones in Z88DK).\r\n- `xl bomber cc65` -> It builds Cross Bomber for all targets that use CC65.\r\n- `xl examples c64` -> It builds all examples for the Commodore 64 target\r\n\r\nRemark: All binaries will be in the `build` directory (same depth level as `src`).\r\n\r\n-------------------------------------------\r\n## CREATING A NEW GAME PROJECT\r\n\r\nIn order to create a new game project we can use the `xl create` scripts that will create the necessary initial source code files, graphic assets and Makefile inside a folder in the `games` folder.\r\n\r\nThe script is used as follows:\r\n\r\n`xl create [game project name] [initial code type]`\r\n\r\nwhere `[initial code type]` can be \r\n- `helloworld` or empty for initial code that only displays 'hello world'\r\n- `game` for an initial code for a standard game with a main loop and a level loop\r\n- `demo` for an initial code that uses most APIs.\r\n\r\nExamples:\r\n- `xl create foo` -> It creates a new game project `foo` with a trivial code that initializes sound, input and graphics and just displays `hello world` on the screen.\r\n- `xl create bar game` -> It creates a new game project `bar` with code that initializes sound, input and graphics and contains the main loops that may be used in a standard game.\r\n- `xl create foobar demo` -> It creates a new game project `foobar` with code that initializes sound, input and graphics and contains code that shows how to use most APIs.\r\n\r\n-------------------------------------------\r\n## CLEANING TEMPORARY FILES AND BINARIES\r\n\r\nIf you  want to remove built binaries and temporary files that are produced during a build you can use 'xl clean'.\r\n\r\n`xl clean`\r\n\r\n--------------------------------------------\r\n## DELETING PROJECTS\r\n\r\nNon-built-in game projects can be deleted trhough the `xl delete` script in a very simple way:\r\n\r\n`xl delete [game project name]`\r\n\r\nExample: \r\n\r\n`xl delete foo` -> It removes the `foo` source code, assets and Makefile files\r\n"
  },
  {
    "path": "docs/alt_conio_fonts.s",
    "content": "; The internal font structure for Atari7800 needs a full set of 128\r\n; characters. Each character is 16 x 8 bits.\r\n; The font consists of 8 rows of data:\r\n; row7\r\n; row6\r\n; row5\r\n; row4\r\n; row3\r\n; row2\r\n; row1\r\n; row0\r\n; Each row is 256 bytes long\r\n; As we have 2 bits per pixel we need 2 bytes to represent\r\n; one character. So we can fit 128 characters in this font\r\n; When you later use the font you must address the characters as\r\n; 0, 2, 4, 6, ... 254\r\n; Odd indices cannot be used.\r\n\r\n    .export _conio_font\r\n    .rodata\r\n    .align 256\r\n_conio_font:\r\n    .byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $0, $0, $0, $0, $1, $40, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $82, $82\r\n    .byte $0, $0, $28, $0, $0, $0, $0, $0\r\n    .byte $2, $80, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $c3, $c3, $0, $0, $3c, $0\r\n    .byte $0, $0, $0, $0, $3, $c0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $0, $0\r\n    .byte $0, $0, $0, $0, $0, $0, $ff, $ff\r\n    .byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $0, $0, $5, $0, $1, $40, $15, $50\r\n    .byte $55, $50, $55, $50, $15, $40, $1, $54\r\n    .byte $15, $40, $15, $40, $5, $0, $15, $40\r\n    .byte $15, $0, $50, $50, $55, $50, $5, $50\r\n    .byte $55, $40, $55, $54, $55, $0, $5, $54\r\n    .byte $50, $50, $15, $40, $15, $40, $54, $14\r\n    .byte $55, $54, $50, $14, $50, $14, $5, $40\r\n    .byte $55, $0, $1, $50, $54, $14, $15, $40\r\n    .byte $15, $40, $55, $50, $5, $0, $50, $14\r\n    .byte $50, $14, $15, $40, $55, $54, $22, $88\r\n    .byte $a, $0, $a, $0, $0, $0, $a, $0\r\n    .byte $2, $80, $2a, $a0, $aa, $a0, $aa, $a0\r\n    .byte $2a, $80, $2, $a8, $2a, $80, $2a, $80\r\n    .byte $a, $0, $2a, $80, $2a, $0, $a0, $a0\r\n    .byte $aa, $a0, $a, $a0, $aa, $80, $aa, $a8\r\n    .byte $aa, $0, $a, $a8, $a0, $a0, $2a, $80\r\n    .byte $2a, $80, $a8, $28, $aa, $a8, $a0, $28\r\n    .byte $a0, $28, $a, $80, $aa, $0, $2, $a0\r\n    .byte $a8, $28, $2a, $80, $2a, $80, $aa, $a0\r\n    .byte $a, $0, $a0, $28, $a0, $28, $2a, $80\r\n    .byte $aa, $a8, $33, $cc, $f, $0, $f, $0\r\n    .byte $0, $0, $f, $0, $3, $c0, $3f, $f0\r\n    .byte $ff, $f0, $ff, $f0, $3f, $c0, $3, $fc\r\n    .byte $3f, $c0, $3f, $c0, $f, $0, $3f, $c0\r\n    .byte $3f, $0, $f0, $f0, $ff, $f0, $f, $f0\r\n    .byte $ff, $c0, $ff, $fc, $ff, $0, $f, $fc\r\n    .byte $f0, $f0, $3f, $c0, $3f, $c0, $fc, $3c\r\n    .byte $ff, $fc, $f0, $3c, $f0, $3c, $f, $c0\r\n    .byte $ff, $0, $3, $f0, $fc, $3c, $3f, $c0\r\n    .byte $3f, $c0, $ff, $f0, $f, $0, $f0, $3c\r\n    .byte $f0, $3c, $3f, $c0, $ff, $fc, $0, $0\r\n    .byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $0, $0, $5, $0, $1, $40, $54, $14\r\n    .byte $5, $0, $50, $50, $50, $50, $0, $50\r\n    .byte $50, $50, $50, $50, $5, $0, $50, $50\r\n    .byte $1, $40, $50, $50, $14, $14, $14, $14\r\n    .byte $14, $50, $14, $4, $14, $0, $14, $14\r\n    .byte $50, $50, $5, $0, $50, $50, $14, $14\r\n    .byte $14, $14, $50, $14, $50, $14, $14, $50\r\n    .byte $14, $0, $15, $40, $14, $14, $50, $50\r\n    .byte $5, $0, $50, $50, $15, $40, $54, $54\r\n    .byte $14, $50, $5, $0, $14, $14, $a, $a0\r\n    .byte $0, $0, $a, $0, $0, $0, $a, $0\r\n    .byte $2, $80, $a8, $28, $a, $0, $a0, $a0\r\n    .byte $a0, $a0, $0, $a0, $a0, $a0, $a0, $a0\r\n    .byte $a, $0, $a0, $a0, $2, $80, $a0, $a0\r\n    .byte $28, $28, $28, $28, $28, $a0, $28, $8\r\n    .byte $28, $0, $28, $28, $a0, $a0, $a, $0\r\n    .byte $a0, $a0, $28, $28, $28, $28, $a0, $28\r\n    .byte $a0, $28, $28, $a0, $28, $0, $2a, $80\r\n    .byte $28, $28, $a0, $a0, $a, $0, $a0, $a0\r\n    .byte $2a, $80, $a8, $a8, $28, $a0, $a, $0\r\n    .byte $28, $28, $f, $f0, $0, $0, $f, $0\r\n    .byte $0, $0, $f, $0, $3, $c0, $fc, $3c\r\n    .byte $f, $0, $f0, $f0, $f0, $f0, $0, $f0\r\n    .byte $f0, $f0, $f0, $f0, $f, $0, $f0, $f0\r\n    .byte $3, $c0, $f0, $f0, $3c, $3c, $3c, $3c\r\n    .byte $3c, $f0, $3c, $c, $3c, $0, $3c, $3c\r\n    .byte $f0, $f0, $f, $0, $f0, $f0, $3c, $3c\r\n    .byte $3c, $3c, $f0, $3c, $f0, $3c, $3c, $f0\r\n    .byte $3c, $0, $3f, $c0, $3c, $3c, $f0, $f0\r\n    .byte $f, $0, $f0, $f0, $3f, $c0, $fc, $fc\r\n    .byte $3c, $f0, $f, $0, $3c, $3c, $0, $0\r\n    .byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $55, $55, $0, $0, $1, $40, $55, $14\r\n    .byte $5, $0, $14, $0, $0, $50, $55, $54\r\n    .byte $0, $50, $50, $50, $5, $0, $50, $50\r\n    .byte $0, $50, $55, $50, $14, $14, $50, $0\r\n    .byte $14, $14, $14, $40, $14, $40, $50, $54\r\n    .byte $50, $50, $5, $0, $50, $50, $14, $50\r\n    .byte $14, $4, $51, $14, $50, $54, $50, $14\r\n    .byte $14, $0, $51, $50, $14, $50, $1, $50\r\n    .byte $5, $0, $50, $50, $50, $50, $55, $54\r\n    .byte $5, $40, $5, $0, $5, $4, $a8, $2a\r\n    .byte $a, $0, $0, $0, $aa, $aa, $0, $0\r\n    .byte $2, $80, $aa, $28, $a, $0, $28, $0\r\n    .byte $0, $a0, $aa, $a8, $0, $a0, $a0, $a0\r\n    .byte $a, $0, $a0, $a0, $0, $a0, $aa, $a0\r\n    .byte $28, $28, $a0, $0, $28, $28, $28, $80\r\n    .byte $28, $80, $a0, $a8, $a0, $a0, $a, $0\r\n    .byte $a0, $a0, $28, $a0, $28, $8, $a2, $28\r\n    .byte $a0, $a8, $a0, $28, $28, $0, $a2, $a0\r\n    .byte $28, $a0, $2, $a0, $a, $0, $a0, $a0\r\n    .byte $a0, $a0, $aa, $a8, $a, $80, $a, $0\r\n    .byte $a, $8, $fc, $3f, $f, $0, $0, $0\r\n    .byte $ff, $ff, $0, $0, $3, $c0, $ff, $3c\r\n    .byte $f, $0, $3c, $0, $0, $f0, $ff, $fc\r\n    .byte $0, $f0, $f0, $f0, $f, $0, $f0, $f0\r\n    .byte $0, $f0, $ff, $f0, $3c, $3c, $f0, $0\r\n    .byte $3c, $3c, $3c, $c0, $3c, $c0, $f0, $fc\r\n    .byte $f0, $f0, $f, $0, $f0, $f0, $3c, $f0\r\n    .byte $3c, $c, $f3, $3c, $f0, $fc, $f0, $3c\r\n    .byte $3c, $0, $f3, $f0, $3c, $f0, $3, $f0\r\n    .byte $f, $0, $f0, $f0, $f0, $f0, $ff, $fc\r\n    .byte $f, $c0, $f, $0, $f, $c, $0, $0\r\n    .byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $55, $55, $0, $0, $1, $40, $51, $54\r\n    .byte $5, $0, $5, $40, $5, $40, $50, $50\r\n    .byte $0, $50, $55, $40, $1, $40, $15, $40\r\n    .byte $15, $50, $50, $50, $15, $50, $50, $0\r\n    .byte $14, $14, $15, $40, $15, $40, $50, $0\r\n    .byte $55, $50, $5, $0, $0, $50, $15, $40\r\n    .byte $14, $0, $55, $54, $51, $54, $50, $14\r\n    .byte $15, $50, $50, $50, $15, $50, $15, $0\r\n    .byte $5, $0, $50, $50, $50, $50, $51, $14\r\n    .byte $5, $40, $15, $40, $1, $40, $a8, $2a\r\n    .byte $2, $80, $0, $0, $aa, $aa, $0, $0\r\n    .byte $2, $80, $a2, $a8, $a, $0, $a, $80\r\n    .byte $a, $80, $a0, $a0, $0, $a0, $aa, $80\r\n    .byte $2, $80, $2a, $80, $2a, $a0, $a0, $a0\r\n    .byte $2a, $a0, $a0, $0, $28, $28, $2a, $80\r\n    .byte $2a, $80, $a0, $0, $aa, $a0, $a, $0\r\n    .byte $0, $a0, $2a, $80, $28, $0, $aa, $a8\r\n    .byte $a2, $a8, $a0, $28, $2a, $a0, $a0, $a0\r\n    .byte $2a, $a0, $2a, $0, $a, $0, $a0, $a0\r\n    .byte $a0, $a0, $a2, $28, $a, $80, $2a, $80\r\n    .byte $2, $80, $fc, $3f, $3, $c0, $0, $0\r\n    .byte $ff, $ff, $0, $0, $3, $c0, $f3, $fc\r\n    .byte $f, $0, $f, $c0, $f, $c0, $f0, $f0\r\n    .byte $0, $f0, $ff, $c0, $3, $c0, $3f, $c0\r\n    .byte $3f, $f0, $f0, $f0, $3f, $f0, $f0, $0\r\n    .byte $3c, $3c, $3f, $c0, $3f, $c0, $f0, $0\r\n    .byte $ff, $f0, $f, $0, $0, $f0, $3f, $c0\r\n    .byte $3c, $0, $ff, $fc, $f3, $fc, $f0, $3c\r\n    .byte $3f, $f0, $f0, $f0, $3f, $f0, $3f, $0\r\n    .byte $f, $0, $f0, $f0, $f0, $f0, $f3, $3c\r\n    .byte $f, $c0, $3f, $c0, $3, $c0, $0, $0\r\n    .byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $0, $0, $0, $0, $1, $40, $50, $54\r\n    .byte $5, $0, $0, $50, $0, $50, $14, $50\r\n    .byte $55, $40, $50, $0, $0, $50, $50, $50\r\n    .byte $50, $50, $50, $50, $14, $14, $50, $0\r\n    .byte $14, $14, $14, $40, $14, $40, $50, $0\r\n    .byte $50, $50, $5, $0, $0, $50, $14, $50\r\n    .byte $14, $0, $55, $54, $55, $14, $50, $14\r\n    .byte $14, $14, $50, $50, $14, $14, $54, $0\r\n    .byte $5, $0, $50, $50, $50, $50, $50, $14\r\n    .byte $14, $50, $50, $50, $40, $50, $a, $a0\r\n    .byte $0, $a0, $0, $0, $0, $0, $0, $0\r\n    .byte $2, $80, $a0, $a8, $a, $0, $0, $a0\r\n    .byte $0, $a0, $28, $a0, $aa, $80, $a0, $0\r\n    .byte $0, $a0, $a0, $a0, $a0, $a0, $a0, $a0\r\n    .byte $28, $28, $a0, $0, $28, $28, $28, $80\r\n    .byte $28, $80, $a0, $0, $a0, $a0, $a, $0\r\n    .byte $0, $a0, $28, $a0, $28, $0, $aa, $a8\r\n    .byte $aa, $28, $a0, $28, $28, $28, $a0, $a0\r\n    .byte $28, $28, $a8, $0, $a, $0, $a0, $a0\r\n    .byte $a0, $a0, $a0, $28, $28, $a0, $a0, $a0\r\n    .byte $80, $a0, $f, $f0, $0, $f0, $0, $0\r\n    .byte $0, $0, $0, $0, $3, $c0, $f0, $fc\r\n    .byte $f, $0, $0, $f0, $0, $f0, $3c, $f0\r\n    .byte $ff, $c0, $f0, $0, $0, $f0, $f0, $f0\r\n    .byte $f0, $f0, $f0, $f0, $3c, $3c, $f0, $0\r\n    .byte $3c, $3c, $3c, $c0, $3c, $c0, $f0, $0\r\n    .byte $f0, $f0, $f, $0, $0, $f0, $3c, $f0\r\n    .byte $3c, $0, $ff, $fc, $ff, $3c, $f0, $3c\r\n    .byte $3c, $3c, $f0, $f0, $3c, $3c, $fc, $0\r\n    .byte $f, $0, $f0, $f0, $f0, $f0, $f0, $3c\r\n    .byte $3c, $f0, $f0, $f0, $c0, $f0, $0, $0\r\n    .byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $55, $FF, $55, $FF, $55, $FF, $50, $14\r\n    .byte $55, $FF, $55, $FF, $55, $FF, $5, $50\r\n    .byte $50, $0, $14, $0, $50, $50, $50, $50\r\n    .byte $50, $50, $15, $40, $14, $14, $14, $14\r\n    .byte $14, $50, $14, $4, $14, $4, $14, $14\r\n    .byte $50, $50, $5, $0, $0, $50, $14, $14\r\n    .byte $14, $0, $54, $54, $54, $14, $14, $50\r\n    .byte $14, $14, $50, $50, $14, $14, $50, $50\r\n    .byte $45, $10, $50, $50, $50, $50, $50, $14\r\n    .byte $50, $14, $50, $50, $50, $14, $22, $88\r\n    .byte $a0, $a0, $0, $0, $0, $0, $0, $0\r\n    .byte $2, $80, $a0, $28, $2a, $0, $a0, $a0\r\n    .byte $a0, $a0, $a, $a0, $a0, $0, $28, $0\r\n    .byte $a0, $a0, $a0, $a0, $a0, $a0, $2a, $80\r\n    .byte $28, $28, $28, $28, $28, $a0, $28, $8\r\n    .byte $28, $8, $28, $28, $a0, $a0, $a, $0\r\n    .byte $0, $a0, $28, $28, $28, $0, $a8, $a8\r\n    .byte $a8, $28, $28, $a0, $28, $28, $a0, $a0\r\n    .byte $28, $28, $a0, $a0, $8a, $20, $a0, $a0\r\n    .byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0\r\n    .byte $a0, $28, $33, $cc, $f0, $f0, $0, $0\r\n    .byte $0, $0, $0, $0, $3, $c0, $f0, $3c\r\n    .byte $3f, $0, $f0, $f0, $f0, $f0, $f, $f0\r\n    .byte $f0, $0, $3c, $0, $f0, $f0, $f0, $f0\r\n    .byte $f0, $f0, $3f, $c0, $3c, $3c, $3c, $3c\r\n    .byte $3c, $f0, $3c, $c, $3c, $c, $3c, $3c\r\n    .byte $f0, $f0, $f, $0, $0, $f0, $3c, $3c\r\n    .byte $3c, $0, $fc, $fc, $fc, $3c, $3c, $f0\r\n    .byte $3c, $3c, $f0, $f0, $3c, $3c, $f0, $f0\r\n    .byte $cf, $30, $f0, $f0, $f0, $f0, $f0, $3c\r\n    .byte $f0, $3c, $f0, $f0, $f0, $3c, $0, $0\r\n    .byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE\r\n    .byte $55, $FF, $55, $FF, $55, $FF, $15, $50\r\n    .byte $55, $FF, $55, $FF, $55, $FF, $1, $50\r\n    .byte $55, $50, $5, $40, $55, $50, $15, $40\r\n    .byte $15, $40, $5, $0, $55, $50, $5, $50\r\n    .byte $55, $40, $55, $54, $55, $54, $5, $50\r\n    .byte $50, $50, $15, $40, $1, $54, $54, $14\r\n    .byte $55, $0, $50, $14, $50, $14, $5, $40\r\n    .byte $55, $50, $15, $40, $55, $50, $15, $40\r\n    .byte $55, $50, $50, $50, $50, $50, $50, $14\r\n    .byte $50, $14, $50, $50, $55, $54, $82, $82\r\n    .byte $2a, $80, $0, $0, $0, $0, $0, $0\r\n    .byte $2, $80, $2a, $a0, $a, $0, $2a, $80\r\n    .byte $2a, $80, $2, $a0, $aa, $a0, $a, $80\r\n    .byte $aa, $a0, $2a, $80, $2a, $80, $a, $0\r\n    .byte $aa, $a0, $a, $a0, $aa, $80, $aa, $a8\r\n    .byte $aa, $a8, $a, $a0, $a0, $a0, $2a, $80\r\n    .byte $2, $a8, $a8, $28, $aa, $0, $a0, $28\r\n    .byte $a0, $28, $a, $80, $aa, $a0, $2a, $80\r\n    .byte $aa, $a0, $2a, $80, $aa, $a0, $a0, $a0\r\n    .byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0\r\n    .byte $aa, $a8, $c3, $c3, $3f, $c0, $0, $0\r\n    .byte $0, $0, $0, $0, $3, $c0, $3f, $f0\r\n    .byte $f, $0, $3f, $c0, $3f, $c0, $3, $f0\r\n    .byte $ff, $f0, $f, $c0, $ff, $f0, $3f, $c0\r\n    .byte $3f, $c0, $f, $0, $ff, $f0, $f, $f0\r\n    .byte $ff, $c0, $ff, $fc, $ff, $fc, $f, $f0\r\n    .byte $f0, $f0, $3f, $c0, $3, $fc, $fc, $3c\r\n    .byte $ff, $0, $f0, $3c, $f0, $3c, $f, $c0\r\n    .byte $ff, $f0, $3f, $c0, $ff, $f0, $3f, $c0\r\n    .byte $ff, $f0, $f0, $f0, $f0, $f0, $f0, $3c\r\n    .byte $f0, $3c, $f0, $f0, $ff, $fc, $0, $0\r\n"
  },
  {
    "path": "docs/articles/CALL_APPLE/apple2.txt",
    "content": "\r\n[INSERT LOGO PICTURE HERE]\r\n\r\n[If desired, also INSERT PHOTO OF THE AUTHOR]\r\n\r\n# INTRODUCTION\r\n\r\nThe goal of this article is to present Cross-Lib, briefly show how to use it and present the 6 \"universal\" games I have written with it.\r\nBy \"universal\" here I mean that these games will run on about 200 different systems (consoles, computers, arcade boards, pocket calculators, etc.) despite using the very same game code.\r\nA detailed description of Cross-Lib is not in the scope of this article.\r\nFor more details we refer to the GitHub page: http://www.github.com/Fabrizio-Caruso/CROSS-LIB/\r\n\r\n# WHAT IS CROSS-LIB?\r\nCross-Lib (https://github.com/Fabrizio-Caruso/CROSS-LIB/) is a free open source tool for retro-coding for a multitude of 8-bit and vintage systems from the ‘80s (computers, consoles, pocket calculators, arcade boards, etc.) \r\nsuch as Apple //, all 8-bit Commodore computers, Atari 800, Amstrad CPC, Sinclair ZX 81, Sinclair ZX Spectrum, TRS-80 CoCo, Dragon 32, TRS-80 MC-10, Thomson Mo5 and To7, MSX, Oric-1, Oric Atmos, BBC Micro, etc. as well as consoles such as GameBoy, Sega Master System, GameGear, Nintendo NES, etc. \r\nand other devices such as Texas Instruments pocket calculators. The main CPU architectures are Zilog 80, MOS 6502, Intel 8080, Motorola 6803, Motorola 6809 and RCA 1802. \r\nCross-Lib also supports several lesser known systems such as the Philips VG-5000, the Jupiter Ace and several exotic and rare systems such as the yugoslav Galaksija, the Hungarian Homlab-2, \r\nseveral computers from the Eastern German Robotron series such as the Robotron KC 85, etc. \r\nIn particular for the Apple //, Cross-Lib currently supports the 6-color HGR mode for graphics, joystick input and a few 1-bit sound effects.\r\n\r\nA large but partial list of the supported systems is at the page: \r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md. \r\n\r\nCross-Lib has two main components:\r\n1. A \"universal\" C library (e.g., a collection of C APIs mostly for input/output);\r\n2. A Python script to manage game projects (e.g., to build, create game projects, etc.) and manipulate graphics assets (e.g., to create, import or rip assets)\r\n\r\nThe main goal of Cross-Lib is to provide a *hardware abstraction layer* for hundreds of vintage systems so that the *very same* game code can be used without any adaptation for all its supported systems.\r\n\r\nSeveral articles have been published on Cross-Lib ([rg], [prog]) and its games ([ceo] and, in by this very magazine, [app]).\r\n\r\n# CROSS-LIB VS OTHER DEV-KITS\r\n\r\nHistorically, 8-bit systems were programmed directly on the system and mostly in Assembly, or for simpler programs in interpreted BASIC.\r\nToday cross-development simplifies developers’ tasks a lot (modern editors, simplified debugging, efficient and quick compilation, etc.) and can be done in C.\r\n\r\nThe problem with the portability of C code comes from the diversity of the machines and from the fact that ANSI C does not provide a standard library for graphics, sounds, input, etc.\r\nA partial solution is already provided by some dev-kits such as CC65 (for MOS 6502), Z88DK (for the Zilog 80 and Intel 8080), LCC1802 (for the RCA 1802), CMOC (for the Motorola 6890), etc. \r\nBy using one of these dev-kits, we can exploit their cross-compatible libraries for input and output.\r\nOn the other hand:\r\n1. Each dev-kit only covers a subset of all 8-bit architectures.\r\n2. Even within a given dev-kit, its libraries do not necessarily provide the very same input/output APIs across the entirety of its supported targets.\r\n\r\nCross-Lib improves on these points and lets you do things that you cannot do with other tools:\r\n1. cover many more vintage 8-bit architectures, including very exotic ones;\r\n2. writing 100% WORA code, i.e., \"write once, run anywhere\" (after re-compilation);\r\n3. using WORA graphics resources, i.e., define abstract graphics assets for several totally different systems;\r\n4. using a simplified tool-chain to create, compile and test the games.\r\n\r\nThe closest dev-kits to Cross-Lib with respect to these points are \r\n- 8-bit-Unity [un8] (meant to be used with CC65), which does incredible things but only for very few MOS 6502-based systems;\r\n- Z88DK, which has huge libraries but only covers Zilog 80 and Intel 8080 systems.\r\n\r\nOn the other hand Cross-Lib is not a compiler. It uses several compilers to build the binary files (executable files, disk images, tape images, cartridge images, etc.) for retro-consoles and retro-computers.\r\n\r\nBy providing an abstraction layer for all 8-bit systems, Cross-Lib makes some compromises with respect to what we could do if we were coding only for a specific system.\r\nIn particular, graphics is somehow limited by what is possible on all systems. Sound effects are even more limited.\r\n\r\n\r\n# COMPILERS\r\n\r\nCross-Lib is supposed to be used with C compilers but which ones? \r\n\r\nA native compiler (for example GCC) can be used to build native binaries that can be run, for instance, under Windows. Today the support for native compilation is limited to the text terminal, which means no graphics other than ASCII on the host machine.\r\n\r\nCurrently Cross-Lib fully supports the following cross-compilers and dev-kits with graphics and sound effects for most of its targets:\r\n- CC65 [cc65] for most systems based on the MOS 6502 architecture; \r\n- Z88DK [z88dk] for systems based on the Zilog 80 and Intel 8080 architectures;\r\n- CMOC [cmoc] for systems that use the Motorola 6809;\r\n- LCC1802 [lcc1802] for systems that use the COSMAC RCA 1802 ;\r\n- GCC for TI [ti] for the Texas Instruments TI99/4A based on the 16-bit TMS9900.\r\n\r\nCross-Lib also supports other compilers (currently with limited or absent graphics and sound effects) such as \r\n- ACK [ack] for 8088/8086, Intel 8080 CP/M, 386/68K/PPC/MIPS Linux and PDP11, \r\n- XTC68 [xtc68] for the Sinclair QL, \r\n- VBCC [vbcc] for the BBC Micro, BBC Master, the Amiga and others, \r\n- CC6303 [cc6303] for the Motorola 6803; \r\n- several versions of modded GCC to target vintage computers (Atari ST [st], Olivetti M20 [m20]).\r\n\r\nCross-Lib supports a large sub-set of ANSI C89 because most available cross-compilers for 8-bit architectures only implement a sub-set of ANSI C89.\r\nTherefore we write in C (a sub-set of ANSI C C89) with Cross-Lib APIs for graphics, sounds, input.\r\nIn particular we must avoid:\r\n- \"float\" and \"double\" types, \r\n- copies and parameters by value of \"struct\" objects,\r\n- any use of the heap.\r\n\r\nFor hints on how to code efficiently for 8-bit systems we refer to [effc] and for specific hints on how to code with these compilers we refer to [c8b].\r\n\r\n\r\n# INSTALLATION\r\n\r\nCross-Lib itself does not require any real installation. \r\nIt is enough to download the repository files (from the GitHub page) or to clone the repository with:\r\ngit clone https://www.github.com/Fabrizio-Caruso/CROSS-LIB/\r\n\r\nOn the other hand it requires:\r\n- a POSIX environment (e.g., Windows with Cygwin, Linux, FreeBSD, etc.);\r\n- Make (GNU Make);\r\n- Python 2.7 or Python 3.* [optional but necessary to simplify many operations];\r\n- JAVA [optional but required to generate floppy disk images for the Apple //];\r\n- GCC compiler with ncurses libraries [optional];\r\n- any compiler necessary to build for a desired target architecture (e.g., CC65, Z88DK, etc.) [optional but CC65 is necessary for the Apple //].\r\n\r\nOnce you have Cross-Lib with its dependencies in a POSIX environment, you should move to the \"src\" directory.\r\nInside \"src\" you will find the \"xl\" Python script and the following directories \r\n- \"cross-lib\", which contains the library code;\r\n- \"games\" with built-in games;\r\n- \"examples\" with built-in examples;\r\n- \"projects\" with user-defined projects.\r\n\r\n\r\nIf you have correctly installed just Makefile, Python and (native) GCC in a POSIX environment, it should already be possible to minimally use Cross-Lib to build the Chase game by running the following command inside the \"src\" directory:\r\n\"xl chase gcc\", which will build the game Chase in turn-based mode for the native console.\r\n\r\n\r\n# HOW TO USE THE XL SCRIPT\r\n\r\nIf just one of the supported compilers is installed, Cross-Lib can be used with the \"xl\" Python script inside the \"src\" directory.\r\nIf GCC with ncurses is installed, a native version of the games and examples can be built with:\r\n\"xl build <project name>\" or just \"xl <project name>\"\r\nFor example \r\n\"xl snake\" \r\nbuilds the \"snake\" game for the native console.\r\n\r\nIf a cross compiler (CC65, Z88DK, CMOC, CC6303, LCC1802, etc) is installed, the games and examples can be built for the corresponding systems.\r\nFor example, if CC65 is installed, \r\n\"xl horde apple2\" \r\nbuilds the \"horde\" game for the Apple // with 6-color HGR graphics. \r\n\r\nThe \"xl\" script takes several commands. In particular you can see a list of the available commands with \"xl commands\".\r\nYou can get an explanation of each command with examples with \r\n\"xl help <command>\".\r\n\r\nIf we want to create a new project, we need to use \r\n\"xl create <project name>\", \r\nwhich will create a project with a trivial \"hello world\" example inside the \"projects\" directory.\r\nWe can also start with a template code for a game if we pass the additional parameter \"game\": \r\n\"xl create <project name> game\".\r\n\r\n \r\n# HELLO WORLD\r\n\r\nCoding with Cross-Lib is like normal coding in C (with ANSI C89) with the only addition that all input/output is done through Cross-Lib APIs.\r\n\r\nCross-Lib comes with many examples in the src/examples/ directory as well as a few games in the src/games directory.\r\nBoth of which can be used to learn how to code with Cross-Lib.\r\n\r\nWe could start to look at src/examples/helloworld/, whose main.c files contains: \r\n\r\n#include \"cross_lib.h\"\r\n\r\nint main(void)\r\n{        \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_CLEAR_SCREEN();\r\n\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n\r\n    _XL_PRINT_CENTERED(\"HELLO WORLD\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\nWe remark that all Cross-Lib specific functions start with the _XL_ prefix: \r\n1. _XL_INIT_GRAPHICS() required to initialize the display ;\r\n2. _XL_CLEAR_SCREEN()  which cleans the content of the screen ;\r\n3. _XL_SET_TEXT_COLOR(_XL_WHITE) which defines the color to be used by the text and characters ;\r\n4. _XL_PRINT_CENTERED(\"HELLO WORLD\") which displays \"HELLO WORLD\" on the center of the screen.\r\n\r\nIf we want to use one of the examples or games as a starting point we can clone the project with:\r\nxl clone <existing project to clone> <new project name>\r\n\r\nOr we can start from (almost) scratch with\r\nxl create <new project name>\r\n\r\nOnce we have a new project, we can build it with\r\nxl <project> <target>\r\n\r\nor\r\n\r\nxl <project>\r\nif we want to build the project for the native terminal.\r\n\r\nWe can run the project for the native terminal with:\r\nxl run <project>\r\n\r\nFor example we could run these commands:\r\nxl clone helloworld myhelloworld [to clone helloworld and create myhellworld]\r\nWe modify the project myhelloworld (found inside ./src/projects/myhelloworld/)\r\nxl build myhelloworld (or equivalently xl myhelloworld) [to build a native binary of the new project]\r\nxl run myhelloworld [to run the new project]\r\nxl build myhelloworld apple2 [to build the same project for the Apple //]\r\n\r\n\r\n# CODING WITH ABSTRACTIONS\r\n\r\nIn order to code with Cross-Lib for all targets at the same time, Cross-Lib uses several abstractions.\r\n\r\nGraphics is only tile-based. In the code, tiles are abstract as their exact shape will depend on the target type.\r\nThe game code only sees tiles as macros _TILE_0, _TILE_1, _TILE_2, etc.\r\nEach concrete target will interpret tiles in different ways depending on whether the target can or cannot assign free shapes to tiles and \r\non the number of pixels that define tiles on that system.\r\n\r\nSound is currently only limited to few sound effects that are rendered somehow similarly across multiple targets.\r\n\r\nInput is limited to 4 directions and a single fire button. On each target this will be mapped to either 5 keys (usually I J K L SPACE)\r\nor the main joystick/controller/gamepad.\r\n\r\nRunning \"xl manual\" will output a manual with all commands.\r\n\r\n\r\n# MAIN DEVELOPMENT FLOW\r\n\r\nProducing \"universal\" games with Cross-Lib for the developer boils down to these main steps:\r\n- Creating or cloning a project (with xl create or xl clone);\r\n- Writing the abstract game code in ANSI C with Cross-Lib APIs for input/output;\r\n- Manually creating or automatically importing abstract assets (with commands such as e.g., xl shapes, xl import, xl rip, xl tile);\r\n- Running the xl script to build the project for one or multiple targets (with xl build).\r\n\r\nThe \"xl build <project> <target>\" command (or its equivalent short form \"xl <project> <target>\") \r\nexecutes one or several Makefile targets, which generally:\r\n- generate a concrete asset file from the abstract asset files\r\n- compile the source code (game code and target-specific portions of Cross-Lib library);\r\n- include or link the asset files with the compiled source code;\r\n- if necessary a tool is used to create a usable disk/floppy/rom/cartridge image (this is the case for the Apple // for which disk images are generated).\r\n\r\n[INSERT FLOW PICTURE HERE]\r\n\r\n\r\n# GRAPHICS\r\n\r\nGraphics is performed by displaying \"tiles\", whose shape can be defined. The number of tiles is currently limited to 27 but future versions of Cross-Lib will overcome this constraint.\r\nWe can also display \"characters\" (letters, digits and the space character) but their shape is (currently) fixed.\r\nCharacters and tiles have the same size. Characters are used for the text, whereas tiles are used for graphics.\r\n\r\nASCII-only targets will be able to only assign ASCII shapes to tiles, whereas targets with real graphics will assign a \"freely defined\" shape to tiles.\r\n\r\nCurrently each tile only has one tile-specific foreground color and a common background color.\r\nThe definition of their shapes is not done in the C code.\r\nInstead it is done inside the <project>/tiles directory, which contains sub-directories with files with tile definitions for the ASCII case and \r\nfor the graphics-enabled targets, e.g., 8x8 (for most targets), 7x8 (for the Apple //), 6x8 (for the Oric series and NTSC COMX-35), etc... \r\n\r\nIn the aforementioned files the shapes are described by either ASCII codes for ASCII-only targets or sequences of bytes for graphics-enabled targets.\r\n\r\nThese files can be:\r\n1. edited manually or \r\n2. automatically imported from several programs such as CharPad [chPad] (with \"xl import <file> <project>\") or \r\n3. automatically ripped from BASIC or Assembly listings (with \"xl rip <file> <project>\") or\r\n4. generated by some simple \"pictorial\" text files with drawings made of \"#\" and \".\" characters \r\n(with \"xl shapes <project> <x_size> <y_size> or \"xl tile <file> <project> <tile number>\".\r\n\r\nYou can see how to use these commands by running \"xl help <command>\".\r\n\r\nIn the game code tile graphics is primarily performed by invoking these functions (to display or delete tiles):\r\nvoid _XL_DRAW_TILE(uint8_t x, uint8_t y, uint8_t tile_number, uint8_t tile_color);\r\nvoid _XL_DELETE(uint8_t x, uint8_t y);\r\n\r\n\r\n# SOUND\r\n\r\nSound is even more limited than graphics and it is restricted to a few predefined effects.\r\nThe sound commands have this form:\r\nvoid _XL_<effect name>_SOUND(void);\r\n\r\nFor example:\r\nXL_EXPLOSION_SOUND() produces an explosion sound (or something vaguely similar to it depending on the target)\r\n\r\nFor the Apple //, the sound effects are produced by simple 1-bit banging.\r\n\r\n# INPUT\r\n\r\nInput is limited to four directions and a single fire button.\r\nThe primary input APIs are:\r\nuint8_t _XL_INPUT(void);\r\nuint8_t _XL_LEFT(uint8_t input);\r\nuint8_t _XL_RIGHT(uint8_t input);\r\nuint8_t _XL_UP(uint8_t input);\r\nuint8_t _XL_DOWN(uint8_t input);\r\nuint8_t _XL_FIRE(uint8_t input);\r\n\r\nwhere _XL_INPUT polls the input and the other functions are used to determined the specific input.\r\n\r\n\r\n# GRAPHICS, SOUNDS AND INPUT IN ONE EXAMPLE\r\n\r\nInside the src/examples/animate directory you can find the following example that could be used as a blueprint for a simple game.\r\nThis simple example has graphics, input and sound.\r\nWhen compiled for any of the possible systems, it will produce the very same program but the exact tile shapes and sounds will depend on the target.\r\nFor example it can be compiled for the native console with:\r\nxl animate\r\nor for the Apple // with\r\nxl animate apple2\r\n\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define MIN_X 1\r\n#define MAX_X (XSize-2)\r\n#define MIN_Y 1\r\n#define MAX_Y (YSize-2)\r\n#define DOWN_TILE  _TILE_0\r\n#define UP_TILE    _TILE_1 \r\n#define RIGHT_TILE _TILE_2\r\n#define LEFT_TILE  _TILE_3 \r\n#define FIRE_TILE  _TILE_4\r\n\r\nint main(void)\r\n{ \r\n uint8_t x;\r\n uint8_t y;\r\n uint8_t input;\r\n uint8_t tile;\r\n\r\n _XL_INIT_GRAPHICS();\r\n _XL_INIT_SOUND();\r\n _XL_INIT_INPUT();\r\n\r\n _XL_CLEAR_SCREEN();\r\n\r\n x = XSize/2;\r\n y = YSize/2;\r\n tile = DOWN_TILE;\r\n while(1)\r\n {\r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n        _XL_PRINTD(0,0,3,x);\r\n        _XL_PRINTD(5,0,3,y);\r\n        \r\n        input = _XL_INPUT();\r\n        if(_XL_UP(input))\r\n        {\r\n            _XL_DELETE(x,y);\r\n            tile = UP_TILE;\r\n            --y;\r\n        }\r\n        else if (_XL_DOWN(input))\r\n        {\r\n            _XL_DELETE(x,y);\r\n            tile = DOWN_TILE;\r\n            ++y;\r\n        }\r\n        else if (_XL_LEFT(input))\r\n        {\r\n            _XL_DELETE(x,y);\r\n            tile = LEFT_TILE;\r\n            --x;\r\n        }\r\n        else if(_XL_RIGHT(input))\r\n        {\r\n            _XL_DELETE(x,y);\r\n            tile = RIGHT_TILE;\r\n            ++x;\r\n        }\r\n        else if(_XL_FIRE(input))\r\n        {\r\n            _XL_DRAW(x,y,FIRE_TILE,_XL_WHITE);\r\n            _XL_EXPLOSION_SOUND();\r\n            _XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);  \r\n        }\r\n        \r\n        if((y>=MIN_Y)&&(y<=MAX_Y)&&(x>=MIN_X)&&(x<=MAX_X))\r\n        {\r\n            _XL_DRAW(x,y,tile,_XL_WHITE);\r\n        }\r\n        else\r\n        {\r\n            _XL_DELETE(x,y);\r\n            _XL_ZAP_SOUND();\r\n            _XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);  \r\n            x = XSize/2;\r\n            y = YSize/2;\r\n        }    \r\n        _XL_SLOW_DOWN(4*_XL_SLOW_DOWN_FACTOR);    \r\n    }\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n\r\n# THE GAMES\r\n\r\nCross-Lib comes with some games I have written with it. As for January 2023, it includes six games:\r\n- Cross Verbix\r\n- Cross Horde\r\n- Cross Snake\r\n- Cross Bomber\r\n- Cross Shoot\r\n- Cross Chase\r\nwhich are also referred to as Verbix, Horde, Snake, Bomber, Shoot, Chase.\r\n\r\n## VERBIX\r\n\r\nVerbix is a Scrabble-like game that looks also a bit like Tetris.\r\nIn this game you have to form valid 5-letter English words on the bottom row before the tower of letters reaches the top level.\r\nYou can rotate the bottom row or any of the columns by moving in the 4 directions. You press fire to confirm the word.\r\n\r\n[INSERT SNAPSHOT HERE]\r\n\r\n\r\n## HORDE\r\nHorde is a zombie-themed shooter with many power-ups and several different enemies, levels and special items to pick.\r\nYou control a bow with a limited number of arrows. You get more arrows as a possible reward for killing some zombies.\r\nIf you run out of arrows, you will get a few arrows after a short period.\r\nIn each level you are confronted with a horde of zombies that become harder as you progress.\r\n\r\n[INSERT SNAPSHOT HERE]\r\n\r\n\r\n## SNAKE\r\nSnake is my personal interpretation of a hybrid game between the arcade game Nibbler and the Nokia cell phone game Snake to which I have added more game elements. \r\nAs in Nibbler the walls do not kill you and can be used to stop you and let you better control your movements.\r\nAs in Nokia Snake the main goal is to eat apples. If you do not eat any apple for too long, the snake becomes faster and harder to control, consumes its energy and eventually dies.\r\nIn each level you are also confronted with mines that kill you if the snake's head touches them.\r\nAs a secondary goal you can collect rings. If you manage to get 3 or more rings without dying on a level, you will be rewarded with bonus items.\r\nThe game has several secrets and level to discover.\r\n\r\n[INSERT SNAPSHOT HERE]\r\n\r\n\r\n## BOMBER\r\nBomber is a mini-game and clone of Air Attack (aka Blitz) that first appeared on the Commodore Pet. \r\nThe game concept is horrible (not my own concept) but it can be addictive nevertheless.\r\nYour plane has to carpet-bomb an entire city in order to safely land on the road. Let us assume the city has no inhabitants.\r\nYou do not control the plane and can only press fire to drop a bomb at a time.\r\n\r\n[INSERT SNAPSHOT HERE]\r\n\r\n\r\n## SHOOT\r\nShoot is a shooter somehow similar to Robotron. You have to kill a horde of ghosts on each level.\r\nYou can kill them by hitting them many times or by hitting them enough times to push them against the walls (mortal only for them).\r\nYou can also kill them by placing mines but you need to get the mine item (with 3 mines). A mine kills instantly common enemies.\r\nAt the end of each level when only few ghosts are left or if you survive without killing enemies long enough or in boss levels, you are confronted by some hard-to-kill skull-shaped enemies.\r\nAs a secondary goal you can complete the level by killing the skulls before the last ghosts and by doing so you unlock extra items and secrets in the next levels.\r\nDestroying the missile bases can also unlock items.\r\nThe game has many secrets, levels and items to discover.\r\n\r\n[INSERT SNAPSHOT HERE]\r\n\r\n\r\n## CHASE\r\nCross Chase is somehow similar to Daleks / Gnome Robots. You need to lure your pursuers into the mines.\r\nThe main difference is that it is a real-time game and that it has several secrets items and power-ups to pick.\r\nSimilarly to Shoot, at the end of each level or in boss levels, you are confronted by a boss (a skull), which can only be killed by several bullets fired by the gun item.\r\nYou can complete the level by killing the skull before the last enemy and by doing so you unlock extra items and secrets in the next levels.\r\nDestroying the missile bases can also unlock items.\r\n\r\n[INSERT SNAPSHOT HERE]\r\n\r\n\r\n# FUTURE DEVELOPMENT\r\nCross-Lib is actively developed. Planned future developments are: \r\n- support for more targets and architectures (e.g., Apple ||gs, Apple 1, etc.);\r\n- improved targets (e.g, DHGR mode for the 80-column capable Apple // models);\r\n- improved APIs (more tiles, improved sounds, etc.);\r\n- simplified setup (docker file with all compilers, tools and dependencies);\r\n- improved scripts to handle graphics assets;\r\n- improved support for the native target; \r\n- more games.\r\n\r\n\r\n\r\n# BIBLIOGRAPHY\r\n\r\n[ack] ACK, Tanenbaum A., Jacobs C. et al., C compiler for Intel 8088, PDP 11, CP/M-80,etc., https://github.com/davidgiven/ack\r\n\r\n[app] Cross Chase: A Massively 8-bi Multi-System Game, Caruso F., Call-A.P.P.L.E., vol. 28, No. 1, Feb 2018, pages 31-33, http://www.callapple.org\r\n\r\n[c8b] 8-bit C, Caruso F., https://github.com/Fabrizio-Caruso/8bitC\r\n\r\n[cc6303] CC6303, Cox A., C compiler for the Motorola 6800 and 6803, https://github.com/EtchedPixels/CC6303\r\n\r\n[cc65] CC65, C compiler for the MOS 6502, https://sourceforge.net/projects/cc65/\r\n\r\n[ceo] Cross Chase, Caruso F., CEO-MAG, No. 327-328, Juillet-Août 2017, https://ceo.oric.org/\r\n\r\n[chPad] CharPad, Subchrist Software, https://subchristsoftware.itch.io/charpad-c64-free\r\n\r\n[cmoc] CMOC, Sarrazin P., C compiler for the Motorola 6809, https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html\r\n\r\n[effc] Efficient C Code for 8-bit Microcontrollers, Jones N., https://barrgroup.com/embedded-systems/how-to/efficient-c-code\r\n\r\n[m20] Z8KGCC, Groessler C., GCC modded for the Olivetti M20, http://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc.html\r\n\r\n[lcc1802] LCC1802, Rowe B., C compiler for the RCA 1802, https://github.com/bill2009/lcc1802\r\n\r\n[prog] Cross-Lib, Caruso F., Programmez! Hors Série #6, pages 72-82.\r\n\r\n[rg] Interview to F. Caruso about Cross-Lib, RetroGamer #240, page 100, https://www.retrogamer.net/\r\n\r\n[st] GCC, Rivière V., modded for the Atari ST, http://vincent.riviere.free.fr/soft/m68k-atari-mint/\r\n\r\n[ti] GCC, (Insomnia), modded for the TI99/4A, http://atariage.com/forums/topic/164295-gcc-for-the-ti\r\n\r\n[un8] 8-Bit Unity, Beaucamp A. (8-bit Dude), http://8bit-unity.com/\r\n\r\n[vbcc] VBCC, Barthelmann V., C compiler for the BBC Micro, BBC Master, Amiga, etc., http://www.compilers.de/vbcc.html\r\n\r\n[xtc68] XTC68, Hudson J., C compiler Sinclair QL, https://github.com/stronnag/xtc68\r\n\r\n[z88dk] Z88DK, C compiler and dev-kit for the Zilog 80 and Intel 8080 architectures."
  },
  {
    "path": "docs/articles/article.txt",
    "content": "CROSS CHASE\r\nA massively 8-bit multi-system game\r\n\r\nMYSELF - THE AUTHOR\r\nMy name is Fabrizio Caruso, I am a software engineer and a retro-computing enthusiast and collector.\r\nI have collected about 80 computers from the late '70s, '80s and early '90.\r\nI am mostly interested in the 8-bit era.\r\n\r\nCROSS CHASE is my personal project \r\nwhose main purpose is to create a simple, yet fun, game\r\nfor literally ALL 8-bit computers/consoles/handhelds\r\nfrom the '70s and '80s.\r\nBy ALL I mean any 8-bit computers with enough RAM and for which a capable ANSI C cross compiler exists.\r\nMy project is open source and it can be followed at:\r\nhttps://github.com/Fabrizio-Caruso/CROSS-CHASE\r\nwhere both the source code and pre-compiled binaries for more than 60 different systems and configurations\r\nare freely available.\r\nPlease go back often to the GitHub page if you want the latest version because I make frequent updates.\r\n\r\n\r\nHISTORY\r\nThis idea came to me when I found out about the CC65 cross development toolkit for 6502-based systems\r\n(https://github.com/cc65/cc65).\r\nI realized that CC65 provided a common language (ANSI C) for all its supported targets \r\nand some common APIs for most of its targets.\r\nI started playing around with it by modifying the \"hello world\" example, which is provided with it.\r\nAfter 1400 Git commits from the \"hello world\" I have now an arcade-like game that can run on about 60 different\r\nsystems.\r\nCC65 was clearly not enough and I had to resort to other toolkits such as:\r\nZ88DK (https://github.com/z88dk/z88dk) which comes with two ANSI C cross compilers (ZSDCC and SCCZ80) for Z80-based systems \r\nand WinCMOC and CMOC proper (https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html) which are development tools for 6809-based computers.\r\nI also plan to use GCC for TI for the TMS9000-based Texas Ti-99/4A, which I intend to support even if it is\r\na 16 bit system but for the same 8-bit era.\r\n\r\nTHE GAME\r\nThe idea of the game is original. \r\nYou are chased by some bad guys. You can kill by luring them into some mines that they do not see.\r\nI was not inspired by anything but I later found out that similar games exist.\r\nThe closest one may be Robots (https://wiki.gnome.org/Apps/Robots) as included in Gnome. \r\nThe main difference between my game and Robots is that\r\nmy game is an action game and Robots is turn-based.\r\n\r\nWith respect to the gameplay the game has three versions in order to fit into as many different memory (and in some cases video) configurations as possible.\r\nThe VERY SAME code (or meta-code) produces all three versions:\r\n- TINY: just you, the bad guys chasing you and the mines;\r\n- LIGHT: same as TINY but: 1. there is an enemy (the skull) who does not die on the mines and 2. you can get some power-ups\r\nincluding a gun that can kill all including the skull;\r\n- FULL: as as LIGHT but with different enemy types, more power-ups and multiple levels with different walls and missiles.\r\n\r\nTHE FRAMEWORK\r\nA very important by-product of this project is a C library/framework that I have written \r\nto create an abstraction layer so that the very same code can be used for all systems.\r\nThis means that it is already possible to create other universal 8 bit games within the \r\ngraphical and sound limitations of the framework.\r\n\r\nTHE APPLE VERSIONS\r\nThe game supports lots of systems (see next section) including the Apple][ and Apple//e systems.\r\nThe Apple versions currently only use the text mode and have no sound.\r\nBoth sound (through the bit banging technique), \r\nas well as graphics (through the CC65's TGI libraries) are planned.\r\nNevertheless the game is already fully playable in these versions.\r\n\r\nTHE SUPPORTED SYSTEMS\r\nThe supported systems are in principle ALL 8-bit systems but the game currently only works for just about 70 systems and configurations.\r\nI am actively adding new systems all the time, so I can only provide the partial list:\r\n\r\nPartial list of FULL versions:\r\n- Sega SC 3000\r\n- Luxor ABC80 32k\r\n- Jupiter Ace 16k \r\n- Apple //c\r\n- Apple ][e\r\n- Mattel Aquarius 16k\r\n- Atari 5200 (console)\r\n- Atari 400/800 (color low resolution)\r\n- Atari 400/800 (high resolution)\r\n- Tangerine Atmos and Oric 1 48K\r\n- Commodore 128 (native 40 column mode)\r\n- Commodore 128 (native 80 column mode)\r\n- Commodore 16/116/+4 (32k min)\r\n- Commodore 64\r\n- Commodore CBM 510\r\n- Commodore CBM 610\r\n- CoCo 1/2/3 and Dragon 32/64 (multiple versions)\r\n- Amstrad CPC\r\n- Galaksija 22k\r\n- Gamate (console)\r\n- Lambda 8300 16k\r\n- CCE MC-1000 48k\r\n- MicroBee\r\n- MSX 32K (cassette and rom version)\r\n- MTX\r\n- Nascom computer series 32k\r\n- NES (console)\r\n- Ohio Scientific 1P 32k\r\n- Philips P2000\r\n- PC-6001 32K\r\n- Commodore PET 16k\r\n- Sam Coupe\r\n- Sharp MZ series\r\n- Sinclair Spectrum 48K\r\n- Spectravideo SVI 328\r\n- VG-5000 with 16k expansion\r\n- Vic 20 with 16k expansion\r\n- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 32K\r\n- Robotron Z 9001 32k\r\n- Sinclair ZX80 with 16k expansion\r\n- Sinclair ZX81 with 16k expansion\r\n\r\nPartial list of LIGHT versions:\r\n- Atari Lynx (handheld)\r\n- Luxor ABC80 16k\r\n- Atari 400/800 (high resolution)\r\n- Commodore 16/116 (unexpanded)\r\n- CCE MC-1000 16k (unexpanded)\r\n- MSX 16k\r\n- Nascom computer series 16k\r\n- Oric 1 16k (unexpanded)\r\n- Philips P2000 16k (unexpanded)\r\n- Spectravideo 318 16k (unexpanded)\r\n- VG-5000 16k (unexpanded)\r\n- Vic 20 with 8k expansion\r\n- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 16K\r\n- Robotron Z 9001 16k\r\n\r\nPartial list of TINY versions:\r\n- Mattel Aquarius with 4k expansion\r\n- PCEngine (console) 8k rom version\r\n- Creativision (computer/console hybrid) 8k rom version\r\n- Ohio Scientific 1P 8k\r\n- Commodore PET 8k\r\n- Sinclair Spectrum 16k (unexpanded)\r\n- Commodore Vic 20 with 3k expansion\r\n\r\nSAME CODE FOR MORE THAN 100 SYSTEMS\r\nI am using the very same code for all systems. \r\nThis is possible because \r\n- I am using ANSI C, which is a universal language, \r\nwhich is compiled by multiple cross-compilers into executables for the specific systems.\r\n- I have created a universal 8-bit framework for very simple graphics and sounds.\r\nThe framework provides an abstraction layer so that hardware-specific code is used for graphics and sounds.\r\n\r\n\r\nACKKNOWLEDGEMENTS\r\nThis is a personal project but I have been helped and supported by different people.\r\nI have got a lot of support and help from Stefano Bodrato from the Z88DK team.\r\nI have also been supported by some people from the \"scene\" (Simon Jonassen from the CoCo/Dragon scene) \r\nand from some of the authors of the other toolkits \r\n(Christian Groessler from the CC65 team and Pierre Sarrazin who is the author of the CMOC).\r\n\r\n\r\n"
  },
  {
    "path": "docs/articles/articolo_ITA.txt",
    "content": "CROSS CHASE\r\nUn gioco estremamente multi-sistema di Fabrizio Caruso\r\n\r\n# L'autore\r\nMi chiamo Fabrizio Caruso. Sono uno sviluppatore software e collezionista entusiasta di retro-computer. \r\nHo circa 80 retrocomputer di svariate marche dai più comuni Commodore 64, Vic 20, Commodore 16, Sinclair ZX Spectrum ad alcuni modelli meno comuni come il Mattel Aquarius, il Commodore 116, Matra-Hachette Alice, etc.\r\nSono particolarmente interessato all'era 8-bit, cioè il periodo che va dalla fine degli anni 70 e l'inizio degli anni 90.\r\nMi piace usarli e restaurarli. Ultimamente ho scoperto il piacere di programmare su queste macchine (su tutte!).\r\n\r\n# Il progetto\r\nCROSS CHASE è il mio progetto personale il cui scopo è creare un gioco anche con un minimo di grafica e sonoro e che sia soprattutto divertente da giocare e, cosa ancora più importante, \r\nche possa girare su “tutti” i computer 8 bit e buona parte delle console, console-computer ipridi e handheld ad 8 bit dell'epoca 8'bit.\r\nIl termine “tutti” significa qualunque home computer 8-bit tra la fine degli anni 70 e fine anni 80 con abbastanza memoria RAM e per il quale esiste un cross compilatore ANSI C.\r\nIl mio progetto è open source e può esssere seguito sulla pagina GitHub:\r\nhttps://github.com/Fabrizio-Caruso/CROSS-CHASE\r\ndove, oltre al codice sorgente, metto a disposizione anche i binari già pronti per più di 60 computer (nella sezione release).\r\n\r\n# Il framework\r\nIl progetto ha richiesto la scrittura di un framework per la scrittura di giochi 8 bit \"universali\" che consente la scrittura contemporanea\r\ndi un gioco 8 bit su un centinaio di piattaforme 8-bit diverse.\r\nAl momento attuale il framework è ad uno stato molto iniziale ma ha già la proprietà più importante: il suo codice è indipendente dal gioco che sto sviluppando.\r\nQuando questo framework sarà maturo, sarà possibile usarlo per creare rapidamente altri giochi 8-bit universali SENZA dover fare porting o\r\nriscrittura del codice per ogni macchina. \r\n\r\n# Cosa mi ha fatto cominciare\r\nL'idea nacque 9 mesi fa con la mia scoperta del toolkit di sviluppo CC65 per sistemi basati su CPU 6502 e suoi derivati (come il Commodore 64, Commodore 16, Commodore Vic 20, Atari 400/800, NES, etc.).\r\nQuesto toolkit mette a disposizione un linguaggio comune (ANSI C) e alcune API per diversi computer e console.\r\nCominciai modificando il classico esempio “hello world” che viene formito con toolkit e dopo più di 1200 commits (modifiche) ho ottenuto con un gioco arcade completo che gira si un centinaio di sistemi totalmente diversi e incompatibili tra loro.\r\n\r\n# Tools di sviluppo\r\nChiaramente CC65 non sarebbe bastato per coprire tutti i sistemi 8 bit.\r\nHo quindi dovuto usare altri toolkit simili per altri sistemi.\r\nI principali tools di sviluppo che ho usato sono:\r\n- CC65  (https://github.com/cc65/cc65)\r\n- Z88DK (https://github.com/z88dk/z88dk) per i sistemi basati su CPU Z80 (come il Sinclair Spectrum, MSX, Amstrad CPC, etc.) e \r\n- CMOC (https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html) per i sistemi basati su CPU 6809 (come Dragon 32/64 e CoCo 1/2/ 3) e la sua variante WinCMOC.\r\n\r\nIn totale attualmente uso 5 cross compilatori \r\n- cl65 (CC65), \r\n- sccz80 (Z88DK), \r\n- zsdcc (variante di sdcc in Z88DK), \r\n- CMOC,\r\n- WinCMOC (variante moddata di CMOC).\r\nSto sperimentando con altri cross compilatori come GCC for TI (per TI99/4A), GCC6809 e sdcc (sia \"liscio\" sia la versione del toolkit CPCTelera per Amstrad CPC).\r\nLo scopo è di supportare il più grande numero di sistemi ma con una regola ferrea: nessun porting o riscrittura del codice della logica del gioco.\r\nLo stesso codice deve essere usato per tutti i computer e console. Il codice specifico è ammesso solo per alcuni dettagli dell'input/output.\r\n\r\n\r\n# 100 sistemi contemporaneamente supportati con lo stesso codice?\r\nQuesto è possibile perché:\r\n1.\tUso ANSI C che è un linguaggio universale che è ricompilato da vari cross-compilatori per produrre lo stesso gioco su sistemi diversi.\r\n2.\tHo creato dei livelli di astrazione nel mio codice (il framework!) così da poter inserire, in alcuni casi, del codice specifico per vari hardware senza modificare il codice del gioco.\r\n3.\tUso meta-codice per selezionare le porzioni di codice che servono per ogni sistema.\r\n\r\n\r\n# Il Gioco\r\nL'idea del gioco è totalmente originale: sei inseguito da dei nemici che puoi fare fuori facendoli schiantare contro delle mine che vede solo il giocatore o sparando contro loro se riesci ad ottenere una pistola. Esistono 10 diversi power-up che danno poteri speciali. Alcuni dei quali sono nascosti e vanno scoperti compiente specifiche operazioni (esempio: colpire o uccidere il teschio, etc.).\r\nNon mi sono ispirato a nulla ma ho scoperto che esistono giochi simili.\r\nIl più simile è Robots (https://wiki.gnome.org/Apps/Robots) che è incluso in Gnome. La differenza maggiore sta nel fatto che Robots è turn-based mentre il mio gioco è un gioco d'azione. Altra differenza importante è l'uso della pistola nel mio gioco che serve ad distruggere alcuni ostali e nemici speciali.\r\n\r\n# Tre versioni\r\nLo stesso codice del gioco produce 3 diverse varianti del gioco che sono più o meno complete in maniera tale da poter girare su hardware anche molto limitati (anche soli 8k di ram).\r\nQuindi il gioco esiste in versione:\r\n- TINY:  nemici semplice e mine\r\n- LIGHT: aggiunta di alcuni power-up ed il teschio (nemico da uccidere con la pistola)\r\n- FULL: versione completa\r\nSistemi supportati\r\nIl gioco supporta in principio tutti i sistemi a 8 bit comprese svariate configurazioni di memoria e video. Per il momento posso confermare il funzionamento  per una settantina. Aggiungo in continuazione nuovi sistemi e qui posso fornire una lista parzionale.\r\n\r\nVersione FULL\r\n- Luxor ABC80 32k\r\n- Jupiter Ace 16k\r\n- Apple //c\r\n- Apple ][e\r\n- Mattel Aquarius 16k\r\n- Atari 5200 (console)\r\n- Atari 400/800 (color low resolution)\r\n- Atari 400/800 (high resolution)\r\n- Tangerine Atmos and Oric 1 48K\r\n- Commodore 128 (native 40 column mode)\r\n- Commodore 128 (native 80 column mode)\r\n- Commodore 16/116/+4 (32k min)\r\n- Commodore 64\r\n- Commodore CBM 510\r\n- Commodore CBM 610\r\n- CoCo 1/2/3 and Dragon 32/64 (multiple versions)\r\n- Amstrad CPC\r\n- Galaksija 22k\r\n- Gamate (console)\r\n- Lambda 8300 16k\r\n- CCE MC-1000 48k\r\n- MicroBee\r\n- MSX 32K (cassette and rom version)\r\n- MTX\r\n- Nascom computer series 32k\r\n- NES (console)\r\n- Ohio Scientific 1P 32k\r\n- Philips P2000\r\n- PC-6001 32K\r\n- Commodore PET 16k\r\n- Sam Coupe\r\n- Sharp MZ series\r\n- Sinclair Spectrum 48K\r\n- Spectravideo SVI 328\r\n- VG-5000 with 16k expansion\r\n- Vic 20 with 16k expansion\r\n- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 32K\r\n- Robotron Z 9001 32k\r\n- Sinclair ZX80 with 16k expansion\r\n- Sinclair ZX81 with 16k expansion\r\n\r\nVersione LIGHT\r\n- Luxor ABC80 16k\r\n- Atari 400/800 (high resolution)\r\n- Commodore 16/116 (unexpanded)\r\n- CCE MC-1000 16k (unexpanded)\r\n- MSX 16k\r\n- Nascom computer series 16k\r\n- Oric 1 16k (unexpanded)\r\n- Philips P2000 16k (unexpanded)\r\n- Spectravideo 318 16k (unexpanded)\r\n- VG-5000 16k (unexpanded)\r\n- Vic 20 with 8k expansion\r\n- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 16K\r\n- Robotron Z 9001 16k\r\n\r\nVersione TINY\r\n- Creativision (computer/console hybrid) 8k rom version\r\n- Ohio Scientific 1P 8k\r\n- Commodore PET 8k\r\n- Sinclair Spectrum 16k (unexpanded)\r\n- Commodore Vic 20 with 3k expansion\r\n\r\n\r\n\r\n# Ringraziamenti\r\nPer essendo un progetto personale, sono stato aiutato da diverse persone.\r\nIn particolare da Stefano Bodrato che è uno dei principali sviluppatori di Z88DK.\r\nSono anche stato aiutato da alcuni membri di varie “scene” 8-bit (in particolare da Simon Jonassen che sviluppa per CoCo e Dragon).\r\nRingrazio anche  Christian Groessler (sviluppatore CC65) per avermi dato alcuni consigli su Atari.\r\n\r\n\r\n\r\n"
  },
  {
    "path": "docs/bbc/chibiakumas.txt",
    "content": "\r\n\r\nhttps://www.chibiakumas.com/6502/bbc.php\r\n\r\n\r\n"
  },
  {
    "path": "docs/bbc/putchar.txt",
    "content": "FYI I have uploaded a new release of vbcc6502. For the bbc target I have\r\nadded a function to suppress the conversion of \\n. After calling\r\n\r\n   __vdu_sequence(1);\r\n\r\nall the characters should be output without any modifications. Calling\r\n__vdu_sequence(0) will activate the \\n conversion again.\r\n\r\n\r\nvoid OSWRCHR(__reg(\"a\") char)=\"\\tjsr\\t0xffee\";\r\n...\r\nOSWRCHR(22);\r\nOSWRCHR(2);\r\n\r\n\r\n\r\nvoid OSNEWL()=\"\\tjsr\\t0xffe7\";\r\nvoid OSWRCHR(__reg(\"a\") char)=\"\\tjsr\\t0xffee\";\r\n\r\nunsigned int __write(int f,const char *p,unsigned int len)\r\n{\r\n   unsigned int n=len;\r\n   while(n){\r\n    char c=*p++;\r\n    if(c=='\\n')\r\n      OSNEWL();\r\n    else\r\n      OSWRCHR(c);\r\n    n--;\r\n   }\r\n   return len;\r\n}\r\n\r\n"
  },
  {
    "path": "docs/bbc_sounds/bbc.h",
    "content": "typedef struct {\n  int channel;\n  int amplitude;\n  int pitch;\n  int duration;\n} bbc_sound;\n\n\nchar OSBYTE0(__reg(\"a\") char)=\"\\tjsr\\t$fff4\\n\\ttxa\";\nchar OSBYTE1(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\";\nchar OSBYTE1RI(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\\n\\tpha\\n\\ttya\\n\\ttax\\n\\tpla\";\nchar OSBYTE2(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\nchar OSBYTE2I(__reg(\"a\") char,__reg(\"r0/r1\") unsigned int)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\nvoid OSBYTE0NR(__reg(\"a\") char)=\"\\tjsr\\t$fff4\";\nvoid OSBYTE1NR(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\";\nvoid OSBYTE2NR(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\";\n\n#define OSVER() OSBYTE0(0)\n#define OSUSRFLG(x,y) OSBYTE2(1,(x),(y))\n#define OSSELINPUT(x) OSBYTE1NR(2,(x))\n#define OSSELOUTPUT(x) OSBYTE2(3,(x),(y))\n#define OSCURSORED(x) OSBYTE2(4,(x),(y))\n#define OSSELADC(x) OSBYTE1(16,(x))\n#define OSFRCADC(x) OSBYTE1NR(17,(x))\n#define OSVSYNC() OSBYTE0(19)\n#define OSRDVDU() OSBYTE0(117)\n#define OSSCANKEY(x) OSBYTE1(121,(x))\n#define OSSCANKEY16() OSBYTE0(122)\n#define OSADVAL(x) OSBYTE1RI(128,(x))\n#define OSINKEY(x) OSBYTE2I(129,(x)) \n\n\n\n\nvoid OSWORD(__reg(\"a\") char,__reg(\"r0/r1\") void *)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff1\";\n\n#define OSRDSYSCLK(x) OSWORD(1,x)\n#define OSWRSYSCLK(x) OSWORD(2,x)\n#define OSRDTIMER(x) OSWORD(3,x)\n#define OSWRTIMER(x) OSWORD(4,x)\n#define OSRDIO(x) OSWORD(5,x)\n#define OSWRIO(x) OSWORD(6,x)\n#define OSSOUND(x) OSWORD(7,x)\n#define OSENVELOPE(x) OSWORD(8,x)\n#define OSRDPIXEL(x) OSWORD(9,x)\n#define OSRDCHARDEF(x) OSWORD(10,x)\n#define OSRDPALETTE(x) OSWORD(11,x)\n#define OSWRPALETTE(x) OSWORD(12,x)\n#define OSRDGRCURSOR(x) OSWORD(13,x)\n\n\n\n\n"
  },
  {
    "path": "docs/bbc_sounds/bbctest.c",
    "content": "#include <stdio.h>\n\n#include \"bbc.h\"\n\nbbc_sound snd = {1,-15,200,20};\n\nmain()\n{\n  unsigned int i=0;\n  puts(\"playing sound\");\n  OSSOUND(&snd);\n  puts(\"done\");\n  while(1){\n    printf(\"k=%03u js=%05u %05u %05u %05u\\n\",OSSCANKEY16(),OSADVAL(1),OSADVAL(2),OSADVAL(3),OSADVAL(4));\n  }\n}\n\n"
  },
  {
    "path": "docs/compilation_parameters.txt",
    "content": "\r\n-------------------------------------\r\nNO_MESSAGE\r\n\r\nIt disables:\r\n- printGameOver\r\n- gameCompleted\r\n- _printScoreOnRow\r\n- _printScore\r\n- printKillTheSkull\r\n- highScoreScreen\r\n\r\n-------------------------------------\r\nLESS_TEXT\r\n\r\nIt disables:\r\n- printLevel\r\n- printVictoryMessage\r\n- printExtraLife\r\n\r\n\r\n-------------------------------------\r\n\r\n"
  },
  {
    "path": "docs/compiler_install.txt",
    "content": "(1) TMS9900-GCC\r\nhttps://github.com/mburkley/tms9900-gcc\r\n\r\nVery simple instructions are here: https://github.com/mburkley/tms9900-gcc?tab=readme-ov-file#user-download-and-install\r\n\r\n-------------------------------------\r\n\r\n(2) ACK\r\nhttps://github.com/davidgiven/ack\r\n\r\nVery simple but *time consuming* compilation explained in the main README file.\r\n\r\n-------------------------------------\r\n\r\n(3) CC6303 for the Motorola 6803-based targets \r\nhttps://github.com/zu2/CC6303 (maintained and more recent but not tested yet)\r\nI need to check and see if it works fine.\r\n\r\nIf the first link fails to build and/or fails to build correct binaries we have this:\r\nhttps://github.com/EtchedPixels/CC6303 (obsolete and not maintained)\r\n\r\nNo instructions found but there is a simple Makefile.\r\nSo \"make all\" and probably \"make install\" (it just copies files to hard-coded locations)\r\n\r\n-------------------------------------\r\n\r\n(4) VBCC\r\nhttp://www.compilers.de/vbcc.html\r\n\r\nRemark: We need a *multi-target* version. The *multi-target* versions support several targets across different architectures.\r\n\r\nI have never built it from source myself. I have always used a pre-built multi-target.\r\nI need to check if it can be easily built.\r\n\r\nSource code of the multi-target version is here: http://www.ibaug.de/vbcc/vbcc.tar.gz\r\n"
  },
  {
    "path": "docs/conio_macros_vs_functions.txt",
    "content": "xl snake c16_16k_conio\r\n\r\n\r\nBEFORE (with macros for _XL_CHAR, _XL_PRINT):\r\nld65: Warning: cross_lib/cfg//cc65/c16-16k.cfg:10: Segment 'BSS' overflows memory area 'MAIN' by 1432 bytes\r\nld65: Error: Cannot generate most of the files due to memory area overflow \r\ngmake: *** [Makefile_common:486: c16_16k_conio] Error 1\r\n\r\nSegment list:\r\n-------------\r\nName                   Start     End    Size  Align\r\n----------------------------------------------------\r\nZEROPAGE              000008  000021  00001A  00001\r\nLOADADDR              000FFF  001000  000002  00001\r\nEXEHDR                001001  00100C  00000C  00001\r\nSTARTUP               00100D  00104E  000042  00001\r\nONCE                  00104F  00105A  00000C  00001\r\nCODE                  00105B  003AE1  002A87  00001\r\nRODATA                003AE2  003F6E  00048D  00001\r\nDATA                  003F6F  003FC0  000052  00001\r\nINIT                  003FC1  003FDA  00001A  00001\r\nBSS                   003FDB  004577  00059D  00001\r\n\r\n-------------------------------------------------------------------------------------------------\r\nAFTER (with functions):\r\nld65: Warning: cross_lib/cfg//cc65/c16-16k.cfg:10: Segment 'INIT' overflows memory area 'MAIN' by 5 bytes\r\nld65: Error: Cannot generate most of the files due to memory area overflow\r\nmake: *** [Makefile_common:486: c16_16k_conio] Error 1\r\n\r\n\r\nSegment list:\r\n-------------\r\nName                   Start     End    Size  Align\r\n----------------------------------------------------\r\nZEROPAGE              000008  000021  00001A  00001\r\nLOADADDR              000FFF  001000  000002  00001\r\nEXEHDR                001001  00100C  00000C  00001\r\nSTARTUP               00100D  00104E  000042  00001\r\nONCE                  00104F  00105A  00000C  00001\r\nCODE                  00105B  003AEB  002A91  00001\r\nRODATA                003AEC  003F78  00048D  00001\r\nDATA                  003F79  003FCA  000052  00001\r\nINIT                  003FCB  003FE4  00001A  00001\r\nBSS                   003FE5  004581  00059D  00001\r\n\r\n\r\n--------------------------------------------------------------\r\n\r\n\r\nshoot pet\r\n\r\nBEFORE\r\nSegment list:\r\n-------------\r\nName                   Start     End    Size  Align\r\n----------------------------------------------------\r\nZEROPAGE              000055  00006E  00001A  00001\r\nLOADADDR              0003FF  000400  000002  00001\r\nEXEHDR                000401  00040C  00000C  00001\r\nSTARTUP               00040D  00044C  000040  00001\r\nONCE                  00044D  000458  00000C  00001\r\nCODE                  000459  00474C  0042F4  00001\r\nRODATA                00474D  0049A1  000255  00001\r\nDATA                  0049A2  0049F3  000052  00001\r\nINIT                  0049F4  004A0D  00001A  00001\r\nBSS                   004A0E  004C1A  00020D  00001\r\n\r\n----------------------------------\r\n\r\nAFTER\r\nSegment list:\r\n-------------\r\nName                   Start     End    Size  Align\r\n----------------------------------------------------\r\nZEROPAGE              000055  00006E  00001A  00001\r\nLOADADDR              0003FF  000400  000002  00001\r\nEXEHDR                000401  00040C  00000C  00001\r\nSTARTUP               00040D  00044C  000040  00001\r\nONCE                  00044D  000458  00000C  00001\r\nCODE                  000459  004722  0042CA  00001\r\nRODATA                004723  004977  000255  00001\r\nDATA                  004978  0049C9  000052  00001\r\nINIT                  0049CA  0049E3  00001A  00001\r\nBSS                   0049E4  004BF0  00020D  00001"
  },
  {
    "path": "docs/docker.txt",
    "content": "\r\n# CROSS-LIB in GitHubCodeSpaces \r\n\r\nhttps://github.com/codespaces/\r\n\r\n\r\n# CROSS-LIB in a Docker container\r\n\r\n## BUILD IMAGE\r\nEnter .devcontainer\r\ndocker build . -t crosslib:254\r\n\r\n## RUN CONTAINER\r\n     docker run -it -v /mnt/c/Retro/CROSS-LIB:/workspaces/crosslib --env-file /mnt/c/Retro/CROSS-LIB/.devcontainer/devcontainer.env crosslib:254 bash\r\n\r\n---------------------\r\n\r\n\r\nsudo docker run -it -v .:/workspaces/crosslib --env-file ./.devcontainer/container.env crosslib:0.1 bash\r\n\r\n\r\nPush to registry:\r\n\r\n\r\ndocker push docker.io/fabriziocaruso/crosslib:0.1\r\n\r\nsudo docker tag crosslib:0.1 crosslib:0.1\r\n\r\nsudo docker logout && sudo docker login -u \"fabriziocaruso\" -p \"L1kud1a_33\" docker.io\r\n"
  },
  {
    "path": "docs/games/BOMBER.txt",
    "content": "BOMBER\r\nBomber is a mini-game and clone of Air Attack (aka Blitz) that first appeared on the Commodore Pet. \r\nThe game is about a rather horrible idea (not mine) but it can be addictive nevertheless.\r\nYou need to carpet-bomb an entire city in order to safely land on the road. Let us assume the city has no inhabitants.\r\nYou do not control the plane. You can only use fire to drop bombs.\r\n\r\nREMARK:\r\nThis game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nGo to its GitHub page for updates and new games.\r\n\r\nCross-Lib's licence applies to this game.\r\n------------------------------------------------------------------------------------------------------------------------------------\r\nCROSS-LIB'S LICENCE\r\n\r\nThis software is provided 'as-is', without any express or implied warranty.\r\nIn no event will the authors be held liable for any damages arising from\r\nthe use of this software.\r\n\r\nPermission is granted to anyone to use this software for non-commercial applications, \r\nsubject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software in\r\na product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not\r\nbe misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\nFor example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).\r\nOn the other hand I authorize people to load the games in the most convenient way for their personal use.\r\n"
  },
  {
    "path": "docs/games/CHASE.txt",
    "content": "CHASE\r\n\r\nCross Chase is somehow similar to Daleks / Gnome Robots. You need to lure your pursuers into the mines.\r\nThe main difference is that it is a real-time game and that it has several secrets items and power-ups to pick.\r\nSimilarly to Shoot, at the end of each level or in boss levels, you are confronted by a boss (a skull), which can only be killed by a few bullets fired by the gun item.\r\nYou can complete the level by killing the skull before the last enemy and by doing so you unlock extra items and secrets in the next levels.\r\nDestroying the missile bases can also unlock items.\r\nYou can move in 4 directions and shoot with fire (if you have collected the gun item).\r\n\r\nREMARK:\r\nThis game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nGo to its GitHub page for updates and new games.\r\n\r\nCross-Lib's licence applies to this game.\r\n------------------------------------------------------------------------------------------------------------------------------------\r\nCROSS-LIB'S LICENCE\r\n\r\nThis software is provided 'as-is', without any express or implied warranty.\r\nIn no event will the authors be held liable for any damages arising from\r\nthe use of this software.\r\n\r\nPermission is granted to anyone to use this software for non-commercial applications, \r\nsubject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software in\r\na product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not\r\nbe misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\nFor example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).\r\nOn the other hand I authorize people to load the games in the most convenient way for their personal use.\r\n"
  },
  {
    "path": "docs/games/HORDE.txt",
    "content": "HORDE\r\n\r\nHorde is a zombie-themed shooter with many power-ups and several different enemies, levels and special items to pick.\r\nYou control a bow with a limited number of arrows. You get more arrows as a possible reward for killing some zombies.\r\nIf you run out of arrows, you will get a few arrows after a short period.\r\nIn each level you are confronted with a horde of zombies that become harder as you progress.\r\nYou can move left or right. Use fire to shoot.\r\n\r\nREMARK:\r\nThis game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nGo to its GitHub page for updates and new games.\r\n\r\nCross-Lib's licence applies to this game.\r\n------------------------------------------------------------------------------------------------------------------------------------\r\nCROSS-LIB'S LICENCE\r\n\r\nThis software is provided 'as-is', without any express or implied warranty.\r\nIn no event will the authors be held liable for any damages arising from\r\nthe use of this software.\r\n\r\nPermission is granted to anyone to use this software for non-commercial applications, \r\nsubject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software in\r\na product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not\r\nbe misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\nFor example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).\r\nOn the other hand I authorize people to load the games in the most convenient way for their personal use.\r\n"
  },
  {
    "path": "docs/games/SHOOT.txt",
    "content": "SHOOT\r\n\r\nShoot is a shooter somehow similar to Robotron. You have to kill a horde of ghosts on each level.\r\nYou can kill them by hitting them many times or by hitting them enough times to push them against the walls (mortal only for them).\r\nYou can also kill them by placing mines but you need to get the mine item (with 3 mines). A mine kills instantly common enemies.\r\nAt the end of each level when only few ghosts are left or if you survive without killing enemies long enough or in boss levels, you are confronted by some hard-to-kill skulls.\r\nOptionally you can complete the level by killing the skulls before the last ghosts and by doing so you unlock extra items and secrets in the next levels.\r\nDestroying the missile bases can also unlock items.\r\nThe game has many secrets and items to discover.\r\nYou move in the 4 directions and shoot with fire.\r\n\r\nREMARK:\r\nThis game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nGo to its GitHub page for updates and new games.\r\n\r\nCross-Lib's licence applies to this game.\r\n------------------------------------------------------------------------------------------------------------------------------------\r\nCROSS-LIB'S LICENCE\r\n\r\nThis software is provided 'as-is', without any express or implied warranty.\r\nIn no event will the authors be held liable for any damages arising from\r\nthe use of this software.\r\n\r\nPermission is granted to anyone to use this software for non-commercial applications, \r\nsubject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software in\r\na product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not\r\nbe misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\nFor example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).\r\nOn the other hand I authorize people to load the games in the most convenient way for their personal use.\r\n\r\n"
  },
  {
    "path": "docs/games/SNAKE.txt",
    "content": "SNAKE\r\n\r\nSnake is my personal interpretation of a hybrid game between Nibbler (arcade game) and the Nokia Snake game to which I have added more game elements. \r\nAs in Nibbler the walls do not kill you and can be used to stop you and let you better control your movements.\r\nAs in Nokia Snake the main goal is to eat apples. If you do not eat any apple for too long, the snake becomes faster and harder to control and ultimately consume its energy.\r\nIn each level you are also confronted with mines that kill you if the snake's head touches them.\r\nAs a secondary goal you can collect rings. If you manage to get 3 or more rings without dying on a level, you will be rewarded with bonus items.\r\nUse the fire button to start the game.\r\nYou move in the 4 directions and shoot with fire.\r\n\r\nREMARK:\r\nThis game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nGo to its GitHub page for updates and new games.\r\n\r\nCross-Lib's licence applies to this game.\r\n------------------------------------------------------------------------------------------------------------------------------------\r\nCROSS-LIB'S LICENCE\r\n\r\nThis software is provided 'as-is', without any express or implied warranty.\r\nIn no event will the authors be held liable for any damages arising from\r\nthe use of this software.\r\n\r\nPermission is granted to anyone to use this software for non-commercial applications, \r\nsubject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software in\r\na product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not\r\nbe misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\nFor example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).\r\nOn the other hand I authorize people to load the games in the most convenient way for their personal use.\r\n"
  },
  {
    "path": "docs/games/VERBIX.txt",
    "content": "VERBIX\r\n\r\nVerbix is a Scrabble-like game that looks also a bit like Tetris.\r\nIn this game you have to form valid 5-letter English words on the bottom row before the tower of letters reaches the top level.\r\nYou can rotate the bottom row or any of the columns by moving in the 4 directions. You press fire to confirm the word.\r\n\r\nREMARK:\r\nThis game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nGo to its GitHub page for updates and new games.\r\n\r\nCross-Lib's licence applies to this game.\r\n------------------------------------------------------------------------------------------------------------------------------------\r\nCROSS-LIB'S LICENCE\r\n\r\nThis software is provided 'as-is', without any express or implied warranty.\r\nIn no event will the authors be held liable for any damages arising from\r\nthe use of this software.\r\n\r\nPermission is granted to anyone to use this software for non-commercial applications, \r\nsubject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\nclaim that you wrote the original software. If you use this software in\r\na product, an acknowledgment in the product documentation would be\r\nappreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not\r\nbe misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\nFor example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).\r\nOn the other hand I authorize people to load the games in the most convenient way for their personal use.\r\n"
  },
  {
    "path": "docs/generic_tiles.txt",
    "content": "GENERIC TILES\r\n\r\nNAMES USED IN THE CODE\r\nIn the code we use the name tiles for different things:\r\n- tile absolute index  [used to display]  \"_TILE_{index}\", i.e., and index in memory that points to the tile data\r\n- tile relative index  [used to redefine] \"_TILE_{index}_OFFSET\", i.e. a relative index in memory (e.g., Atari 8-bit mode 1 characters are repeated 4 times)\r\n- tile data (in template files)           \"<TILE_{tile #}>\", i.e., this is the data that defines the shape of tiles \r\n- tile data in C code (in header files)   \"_TILE_{tile #}_UDG\" contains \"<TILE_{tile #}>\"\r\n\r\nLINKED TILES VS TILES BY EXPLICIT REDEFINITION IN C CODE \r\nCross-Lib supports different ways to enable tiles:\r\n- by to-be-linked Assembly files with the tiles data\r\n- by including header files with tiles definitions\r\n\r\nTEMPLATED TILE FILES\r\nTemplates cover both cases described above (linked Assembly and header files).\r\nBoth to-be-linked Assembly files and tile header files are generated by Python scripts \"generate_assets.py\" and \"copy_assets.py\" found in src/assets/.\r\nThe scripts use \r\n- the templates in /src/assets/templates with \"<TILE_{tile #}>\" tags and \r\n- the game-specific tile data in /src/games/<game_name>/tiles or /src/demos/<demo_name>/tiles where \r\nthe file \"tile_<tile #>.txt\" contains the data the are meant to replace \"<TILE_{tile #}>\" in all templates\r\nThe result of the execution of the Python scripts is store in /src/games/<game_name>/generated_assets or /src/demos/<demo_name>/generated_assets.\r\n\r\nSUB-TARGET-SPECIFIC TILES\r\nTiles are implemented differently on each target and sub-target as this depend on the graphics mode chosen in Cross-Lib.\r\nEach tile is identified by a absolute index (used to display it) \"_TILE_{index}\" and a relative index (used to redefined it) \"_TILE_{index}_OFFSET\".\r\nThese indices are defined in /src/cross_lib/display/tiles.\r\n\r\nTILES DEFINED THROUGH HEADER FILES\r\nFor tiles that are defined by included header files (not by linked Assembly), the tile data is defined in \"_TILE_{tile #}_UDG\".\r\nEach target may use some specific code to redefine characters code.\r\nMost targets use the definitions and code in /src/cross_lib/display/redefined_characters/udg_map.h.\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "docs/hector_sound.txt",
    "content": "\r\nPour 2HR - CALL 0x07BF\r\nPour HRX - CALL 0x1A09\r\nIl faut préalablement définir DE pour la longueur\r\nEt BC pour le période.\r\nLa fréquence de la note sera égale à 1/(BC), et sa durée à (BC) x (DE).\r\nSi les interruptions sont autorisées, le son sera \"vibrato\", si les interruptions sont interdites, il sera continu.\r\n\r\n\r\nvoici ce que moi j'utilise pour 2HR\r\nmon code asm:\r\n\r\n\r\nPUBLIC _TONES\r\n;************************************\r\n; * émet un son *\r\n;************************************\r\n_TONES:\r\nPOP IX ; récupère l'adresse de retour\r\nPOP DE ; récupère le deuxième argument (longeur)\r\nPOP BC ; récupère le premier argument (periode)\r\nPUSH BC ; remet sur la pile\r\nPUSH DE ; remet sur la pile\r\nPUSH IX ; remet l'adresse de retour sur la pile\r\nCALL 0x07BF\r\nRET\r\ndans mon code C:\r\nextern void TONES(unsigned short periode, unsigned short longeur);\r\nTONES(0x1000,10);\r\n\r\n"
  },
  {
    "path": "docs/manual/XSize.txt",
    "content": "XSize\r\n\r\nNumber of tiles that can be displayed horizontally on the (usable) screen\r\n\r\n"
  },
  {
    "path": "docs/manual/YSize.txt",
    "content": "YSize\r\n\r\nNumber of tiles that can be displayed vertically on the (usable) screen\r\n"
  },
  {
    "path": "docs/manual/_XL_CHAR.txt",
    "content": "_XL_CHAR(X,Y,C)\r\n\r\nIt displays the C character at position X,Y with the color set by _XL_SET_TEXT_COLOR."
  },
  {
    "path": "docs/manual/_XL_CLEAR_SCREEN.txt",
    "content": "_XL_CLEAR_SCREEN()\r\n\r\nIt clears the whole screen.\r\n"
  },
  {
    "path": "docs/manual/_XL_DELETE.txt",
    "content": "_XL_DELETE(X,Y)\r\n\r\nIt deletes a tile-sized area of the screen at position (X,Y)\r\n\r\n"
  },
  {
    "path": "docs/manual/_XL_DOWN.txt",
    "content": "_XL_DOWN(J)\r\n\r\nThis Boolean function returns 1 (true) if J represents the down movement, and 0 (false) otherwise.\r\nJ is supposed to be the output of _XL_INPUT.\r\n"
  },
  {
    "path": "docs/manual/_XL_DRAW.txt",
    "content": "_XL_DRAW(X, Y, T, C)\r\n\r\nIt displays tile T at position (X,Y) with color C if color C is available or its \"closest\" match when C is not supported by a target.\r\nFor targets with no colors (i.e., with _XL_NO_COLOR) you may assume that _XL_DRAW is macro that disregards the C parameter.\r\n"
  },
  {
    "path": "docs/manual/_XL_EXPLOSION_SOUND.txt",
    "content": "_XL_EXPLOSION_SOUND()\r\n\r\nShort explosion noise\r\n"
  },
  {
    "path": "docs/manual/_XL_FIRE.txt",
    "content": "_XL_FIRE(J)\r\n\r\nThis Boolean function returns 1 (true) if J represents the fire button, and 0 (false) otherwise.\r\nJ is supposed to be the output of _XL_INPUT.\r\n"
  },
  {
    "path": "docs/manual/_XL_INIT_GRAPHICS.txt",
    "content": "_XL_INIT_GRAPHICS()\r\n\r\nIt initializes the graphics. Necessary for any build that wants to show anything on the screen.\r\n\r\n"
  },
  {
    "path": "docs/manual/_XL_INIT_INPUT.txt",
    "content": "_XL_INIT_INPUT()\r\n\r\nIt initializes the input (joystick/keyboard). Necessary for any program that needs to receive an input\r\n\r\n"
  },
  {
    "path": "docs/manual/_XL_INIT_SOUND.txt",
    "content": "_XL_INIT_SOUND()\r\n\r\nIt initializes the sound system. Necessary for any program that produces sound.\r\n"
  },
  {
    "path": "docs/manual/_XL_INPUT.txt",
    "content": "_XL_INPUT()\r\n\r\nIt returns a value J that represents the specific received input or absence of input at the moment of its execution (keyboard may be buffered, though).\r\nThe result J is meant to be used with the Boolean functions _XL_UP, _XL_DOWN, _XL_LEFT, _XL_RIGHT, _XL_FIRE.\r\n"
  },
  {
    "path": "docs/manual/_XL_KEY_PRESSED.txt",
    "content": "_XL_KEY_PRESSED()\r\n\r\nThis Boolean function returns 1 (true) if any key or fire button is pressed.\r\n"
  },
  {
    "path": "docs/manual/_XL_LEFT.txt",
    "content": "_XL_LEFT(J)\r\n\r\nThis Boolean function returns 1 (true) if J represents the left movement, and 0 (false) otherwise.\r\nJ is supposed to be the output of _XL_INPUT.\r\n"
  },
  {
    "path": "docs/manual/_XL_PING_SOUND.txt",
    "content": "_XL_PING_SOUND()\r\n\r\nShort high-pitched sound\r\n"
  },
  {
    "path": "docs/manual/_XL_PRINT.txt",
    "content": "_XL_PRINT(X,Y,S)\r\n\r\nIt prints the \"Cross-Lib string\" S starting a position (X,Y) with the color set by _XL_SET_TEXT_COLOR.\r\nA \"Cross-Lib string\" is string formed with only the following 37 possible characters\r\n_XL_SPACE, _XL_a, ..., _XL_z, _XL_A, ..., _XL_Z, '0', ..., '9'\r\nwhere capital/small letter may be displayed as the same character depending on whether the target supports different display for capital vs small letters.\r\n\r\n"
  },
  {
    "path": "docs/manual/_XL_PRINTD.txt",
    "content": "_XL_PRINTD(X,Y,L,N)\r\n\r\nIt prints the positive integer number N in L digits (1<=L<=5) starting at position (X,Y) with the color set by _XL_SET_TEXT_COLOR.\r\n"
  },
  {
    "path": "docs/manual/_XL_RAND.txt",
    "content": "_XL_RAND()\r\n\r\nIt generates a pseudo-random number in the range [0,32767]\r\n"
  },
  {
    "path": "docs/manual/_XL_RIGHT.txt",
    "content": "_XL_RIGHT(J)\r\n\r\nThis Boolean function returns 1 (true) if J represents the right movement, and 0 (false) otherwise.\r\nJ is supposed to be the output of _XL_INPUT.\r\n"
  },
  {
    "path": "docs/manual/_XL_SET_TEXT_COLOR.txt",
    "content": "_XL_SET_TEXT_COLOR(C)\r\n\r\nIt sets the text color to C. Such color will be used on next _XL_PRINT, _XL_PRINTD, _XL_CHAR for targets that support colored text.\r\nIf any other display operation is present (e.g., _XL_DRAW), then there is no guarantee that the color C will be used afterwards.\r\n"
  },
  {
    "path": "docs/manual/_XL_SHOOT_SOUND.txt",
    "content": "_XL_SHOOT_SOUND()\r\n\r\nVery short shoot noise\r\n\r\n"
  },
  {
    "path": "docs/manual/_XL_SLEEP.txt",
    "content": "_XL_SLEEP(S)\r\n\r\nIt waits  S seconds or an approximations of S seconds depending on the target\r\n"
  },
  {
    "path": "docs/manual/_XL_SLOW_DOWN.txt",
    "content": "_XL_SLOW_DOWN(T)\r\n\r\nIt waits T loops (0<=T<=65535)\r\n"
  },
  {
    "path": "docs/manual/_XL_TICK_SOUND.txt",
    "content": "_XL_TICK_SOUND()\r\n\r\nVery short high-pitched sound\r\n"
  },
  {
    "path": "docs/manual/_XL_TOCK_SOUND.txt",
    "content": "_XL_TOCK_SOUND()\r\n\r\nVery short low-pitched sound\r\n"
  },
  {
    "path": "docs/manual/_XL_UP.txt",
    "content": "_XL_UP(J)\r\n\r\nThis Boolean function returns 1 (true) if J represents the up movement, and 0 (false) otherwise.\r\nJ is supposed to be the output of _XL_INPUT.\r\n\r\n"
  },
  {
    "path": "docs/manual/_XL_WAIT_FOR_INPUT.txt",
    "content": "_XL_WAIT_FOR_INPUT()\r\n\r\nIt waits for any key or fire button to be pressed.\r\n\r\n"
  },
  {
    "path": "docs/manual/_XL_ZAP_SOUND.txt",
    "content": "_XL_ZAP_SOUND()\r\n\r\nShort rising sound\r\n"
  },
  {
    "path": "docs/mc10.txt",
    "content": "Multicolor graphics\r\n\r\nDisable Interrupt with SEI\r\nCLI to enable\r\n\r\nPOKE 49151,36\r\n\r\n$4000"
  },
  {
    "path": "docs/mc10_2.txt",
    "content": "; Radio Shack MC-10 Disassembly\r\n; (C) Copyright 1999 Kevin Timmerman\r\n;\tAdditional annotation by Greg D.\r\n;\tFixed and modified by James Tamer for use with TASM cross-assembler\r\n\r\n; A few handy defines to make TASM more like typcial \r\n; motorola syntax\r\n\r\n.MSFIRST        ; Most Significant byte first\r\n\r\n; .ADDINSTR inst args opcode nbytes rule class shift binor\r\n.ADDINSTR JSRE * BD 3 SWAP 1 shift binor\r\n\r\n#define EQU     .EQU\r\n#define ORG     .ORG\r\n#define RMB     .BLOCK\r\n#define FCB     .BYTE\r\n#define FCC     .TEXT\r\n#define FDB     .WORD\r\n\r\n#define equ     .EQU\r\n#define org     .ORG\r\n#define rmb     .BLOCK\r\n#define fcb     .BYTE\r\n#define fcc     .TEXT\r\n#define fdb     .WORD\r\n; end a few handy defines\r\n\r\n\r\n\r\n\r\n\r\n\r\nram00   equ     $00 ;Port 1/2 Data Directon Register 1=Output 0=Input\r\nram01\tequ\t\t$01\r\nram02   equ     $02 ;Port 1 Data Register\r\nram03   equ     $03 ;Port 2 Data Register\r\nram08   equ     $08 ;Timer control and status register\r\nram09   equ     $09 ;Counter        (2 bytes)\r\nram0B   equ     $0B ;Output Compare (2 bytes)\r\n\r\nram80   equ     $80 ;number build store MSB\r\nram81   equ     $81 ;number build store LSB\r\nram82   equ     $82 ;logic AND/OR function store\r\nram83   equ     $83\r\nram84   equ     $84 ;vartype flag\r\nram85   equ     $85 ;data token flag\r\nram86   equ     $86\r\nram87   equ     $87 ;READ cmd status flag\r\nram88   equ     $88\r\nram89   equ     $89 ;address temp store\r\nram8B   equ     $8B\r\nTBL008C equ     $8C\r\nTBL008D equ     $8D ; DIGIT 4 MSB\r\nram8E   equ     $8E ;       3\r\nram8F   equ     $8F ;       2\r\nram90   equ     $90 ;       1 LSB\r\nram91   equ     $91 ; stack pointer store\r\nram93   equ     $93 ; start of BASIC memory\r\nram95   equ     $95 ; start of variable space\r\nram97   equ     $97 ; start of dimensioned variable space\r\nram99   equ     $99 ; end of variables.\r\nram9B   equ     $9B ; start of string space\r\nram9D   equ     $9D ; next free string store\r\nram9F   equ     $9F ; address build store\r\nramA1   equ     $A1 ; top of string storage\r\nramA3   equ     $A3\r\nramA5   equ     $A5\r\nramA7   equ     $A7 ; program break address MSB\r\nramA8   equ     $A8 ; program break address LSB\r\nramA9   equ     $A9\r\nramAB   equ     $AB\r\nramAD   equ     $AD ; DATA pointer\r\nramAF   equ     $AF ; LIST command end line no.\r\nramB1   equ     $B1\r\nramB2   equ     $B2\r\nramB3   equ     $B3\r\nramB5   equ     $B5 ; FOR-NEXT var pointer\r\nramB7   equ     $B7\r\nramB9   equ     $B9\r\nTBL00BA equ     $BA ; EXPONENT\r\nramBB   equ     $BB ; DIGIT 4-3\r\nramBD   equ     $BD ; DIGIT 2-1\r\nramBF   equ     $BF ; SIGN\r\nramC0   equ     $C0\r\nramC1   equ     $C1\r\nramC2   equ     $C2\r\nTBL00C4 equ     $C4\r\nramC5   equ     $C5\r\nramC7   equ     $C7\r\nramC9   equ     $C9 ; EXPONENT        [FPA0]\r\nramCA   equ     $CA ; DIGIT 4 MSB\r\nramCB   equ     $CB ; DIGIT 3\r\nramCC   equ     $CC ; DIGIT 2\r\nramCD   equ     $CD ; DIGIT 1 LSB\r\nramCE   equ     $CE ; SIGN\r\nramCF   equ     $CF\r\nramD0   equ     $D0\r\nramD2   equ     $D2\r\nramD5   equ     $D5\r\nramD6   equ     $D6 ; EXPONENT        [FPA1]\r\nramD7   equ     $D7 ; DIGIT 4 MSB\r\nramD8   equ     $D8 ; DIGIT 3\r\nramD9   equ     $D9 ; DIGIT 2\r\nramDA   equ     $DA ; DIGIT 1 LSB\r\nramDB   equ     $DB ; SIGN \r\nramDC   equ     $DC ; SIGN\r\nramDD   equ     $DD\r\nramDE   equ     $DE ; end of string address MSB\r\nramDF   equ     $DF ; end of string address LSB\r\nramE2   equ     $E2 ; filename screen pointer\r\nramE4   equ     $E4 ; i/o tab field\r\nramE5   equ     $E5 ; i/o last tab field\r\nramE6   equ     $E6 ; max line length MSB\r\nramE7   equ     $E7 ; max line length LSB\r\nramE8   equ     $E8 ; I/O select 0=screen -1=printer\r\nramE9   equ     $E9\r\nramEA   equ     $EA ; warm start setup flag =$55\r\nLBL00EB equ     $EB ; bump interpreter pointer\r\nLBL00F3 equ     $F3 ; A <- [address ptr]\r\nramF4   equ     $F4 ; address ptr MSB\r\nramF5   equ     $F5 ; address ptr LSB\r\n\r\n\r\nTBL4000 equ     $4000 ; start of screen mem\r\nTBL41FD equ     $41FD ; start clearing.\r\nFNC_USR equ     $4215 ; USR command address\r\nram4218 equ     $4218 ; random number seed word 1\r\nram421A equ     $421A ; random number seed word 2\r\nram421C equ     $421C ; upcase flag\r\nram421D equ     $421D ; keyboard debounce delay $045E\r\nram421F equ     $421F ; default EXEC address    $EC2E\r\nram4221\tequ\t\t$4221\r\nram4223 equ     $4223 ; printer baud rate  $0080\r\nram4225 equ     $4225 ; cr. delay count    $0001\r\nram4227 equ     $4227 ; tab field width    16\r\nram4229 equ     $4229 ; last tab zone      112\r\nram422A equ     $422A ; printer line length max MSB 88\r\nram422B equ     $422B ; printer line length max LSB 132\r\nram422C equ     $422C ; cassette 1200/2400Hz partition  21 ($15)\r\nram422D equ     $422D ; upper limit of 1200 Hz\r\nram422E equ     $422E ; lower limit of 2400 Hz\r\nram422F equ     $422F ; number of 55's in leader MSB\r\nTBL4230 equ     $4230 ; number of 55's in leader LSB 128; kyboard scan buff 4231-8.\r\nram4239 equ     $4239 ; keyboard strobe store\r\nram423A equ     $423A ; keyboard control key flag\r\nram423B equ     $423B ; keyboard break flag\r\nram423C equ     $423C\r\nram423D equ     $423D ; string buffer pointer\r\nram423F equ     $423F\r\nTBL4241 equ     $4241 ; string buffer\r\nram4250 equ     $4250 ; end of memory pointer\r\nram4252 equ     $4252\r\nram4253 equ     $4253\r\nram4254 equ     $4254 ; random number store 1\r\nram4255 equ     $4255 ; random number store 2\r\nTBL4256 equ     $4256 ; file name length\r\nTBL4257 equ     $4257 ; SKIP/LOAD file name\r\nTBL425F equ     $425F ; TAPE file name block\r\nram4267 equ     $4267 ; file type flag\r\nram426A equ     $426A ; EXEC address offset\r\nram426C equ     $426C ; LOAD address\r\nram426E equ     $426E ; NEW command status flag\r\nram426F equ     $426F\r\nram4271 equ     $4271\r\nram4273 equ     $4273\r\nram4274 equ     $4274\r\nram4275 equ     $4275 ; cass block type flag\r\nram4276 equ     $4276 ; cass block length\r\nram4278 equ     $4278 ; cass buffer address\r\nram427A equ     $427A ; cass sumcheck\r\nram427B equ     $427B ; cass load status flag\r\nram427C equ     $427C ; cass byte load bit counter\r\nram427D equ     $427D ; tone duration counter\r\nram427E equ     $427E ; cass polarity flag\r\nram427F equ     $427F ; last keyboard input char\r\nram4280 equ     $4280 ; cursor address MSB\r\nram4281 equ     $4281 ; cursor address LSB\r\nram4282 equ     $4282 ; cursor color\r\nram4283 equ     $4283 ; break status flag\r\nram4284 equ     $4284 ; LIST command status flag\r\nLBL4285 equ     $4285 ; input char command extension\r\nLBL4288 equ     $4288 ; output char command extension\r\nLBL428B equ     $428B ; output char command extension\r\nLBL428E equ     $428E ; NEW command extension\r\nLBL4291 equ     $4291 ; build command line extension\r\nLBL4294 equ     $4294 ; maths command extension\r\nLBL4297 equ     $4297 ; error return extension 1\r\nLBL429A equ     $429A ; error return extension 2\r\nLBL429D equ     $429D ; fp-acc number transfer extension\r\nLBL42A0 equ     $42A0 ; RUN command extension\r\nLBL42A3 equ     $42A3 ; command token lookup extension\r\nLBL42A6 equ     $42A6 ; LIST command extension\r\nLBL42A9 equ     $42A9\r\nLBL42AC equ     $42AC\r\nram42AF\tequ\t    $42AF\r\nram42B0 equ     $42B0\r\nTBL42B1 equ     $42B1\r\nTBL42B2 equ     $42B2 ; command line buffer\r\nTBL4333 equ     $4333\r\nTBL4334 equ     $4334\r\nTBL4335 equ     $4335 ; binary-decimal conversion buffer\r\nTBL4346\tequ\t\t$4346\r\n\r\n\r\nioBFFF  equ     $BFFF\r\n\r\n\r\n        org     $E000\r\n\r\n                ; --- Function vector table ---\r\nTBLE000 FDB     FNC_SGN       ; $F2BA  SGN\r\n        FDB     FNC_INT       ; $F335  INT\r\n        FDB     FNC_ABS       ; $F2D5  ABS\r\n        FDB     FNC_USR       ; $4215  USR\r\n        FDB     FNC_RND       ; $F62A  RND\r\n        FDB     FNC_SQR       ; $F54D  SQR\r\n        FDB     FNC_LOG       ; $F0B9  LOG\r\n        FDB     FNC_EXP       ; $F5C9  EXP\r\n        FDB     FNC_SIN       ; $F68C  SIN\r\n        FDB     FNC_COS       ; $F686  COS\r\n        FDB     FNC_TAN       ; $F6D2  TAN\r\n        FDB     FNC_PEEK      ; $EF5F  PEEK\r\n        FDB     FNC_LEN       ; $EE82  LEN\r\n        FDB     FNC_STR       ; $ECED  STR$\r\n        FDB     FNC_VAL       ; $EF1C  VAL\r\n        FDB     FNC_ASC       ; $EEA2  ASC\r\n        FDB     FNC_CHR       ; $EE8E  CHR$\r\n        FDB     FNC_LEFT      ; $EEAD  LEFT$\r\n        FDB     FNC_RIGHT     ; $EEC8  RIGHT$\r\n        FDB     FNC_MID       ; $EECF  MID$\r\n        FDB     FNC_POINT     ; $FB9C  POINT\r\n        FDB     FNC_VARPTR    ; $FC11  VARPTR\r\n        FDB     FNC_INKEY     ; $FBED  INKEY$\r\n        FDB     FNC_MEM       ; $ECDB  MEM\r\n\r\n\r\nTBLE030 FCB     $79\r\n\t\tFDB\t\tfp_ADD    ; $EF80 +\r\n        FCB     $79\r\n\t\tFDB\t\tfp_SUB    ; $EF75 -\r\n        FCB     $7B\r\n\t\tFDB\t\tfp_MUL    ; $F0F1 *\r\n        FCB     $7B\r\n\t\tFDB\t\tfp_DIV    ; $F1C8 /\r\n        FCB     $7F\r\n\t\tFDB\t\tfp_POW    ; $F556 ^\r\n        FCB     $50\r\n\t\tFDB\t\tfp_OR+1   ; $EA8E AND (fp_AND)\r\n        FCB     $46\r\n\t\tFDB\t\tfp_OR     ; $EA8D OR\r\n\r\n                ;--- Tokens ---\r\nTBLE045 FCB     $46,$4F,$D2             ;FOR           80\r\n        FCB     $47,$4F,$54,$CF         ;GOTO          81\r\n        FCB     $47,$4F,$53,$55,$C2     ;GOSUB         82\r\n        FCB     $52,$45,$CD             ;REM           83\r\n        FCB     $49,$C6                 ;IF            84\r\n        FCB     $44,$41,$54,$C1         ;DATA          85\r\n        FCB     $50,$52,$49,$4E,$D4     ;PRINT         86\r\n        FCB     $4F,$CE                 ;ON            87\r\n        FCB     $49,$4E,$50,$55,$D4     ;INPUT         88\r\n        FCB     $45,$4E,$C4             ;END           89\r\n        FCB     $4E,$45,$58,$D4         ;NEXT          8A\r\n        FCB     $44,$49,$CD             ;DIM           8B\r\n        FCB     $52,$45,$41,$C4         ;READ          8C\r\n        FCB     $4C,$45,$D4             ;LET           8D\r\n        FCB     $52,$55,$CE             ;RUN           8E\r\n        FCB     $52,$45,$53,$54,$4F,$52,$C5 ;RESTORE   8F\r\n        FCB     $52,$45,$54,$55,$52,$CE ;RETURN        90\r\n        FCB     $53,$54,$4F,$D0         ;STOP          91\r\n        FCB     $50,$4F,$4B,$C5         ;POKE          92\r\n        FCB     $43,$4F,$4E,$D4         ;CONT          93\r\n        FCB     $4C,$49,$53,$D4         ;LIST          94\r\n        FCB     $43,$4C,$45,$41,$D2     ;CLEAR         95\r\n        FCB     $4E,$45,$D7             ;NEW           96\r\n        FCB     $43,$4C,$4F,$41,$C4     ;CLOAD         97\r\n        FCB     $43,$53,$41,$56,$C5     ;CSAVE         98\r\n        FCB     $4C,$4C,$49,$53,$D4     ;LLIST         99\r\n        FCB     $4C,$50,$52,$49,$4E,$D4 ;LPRINT        9A\r\n        FCB     $53,$45,$D4             ;SET           9B\r\n        FCB     $52,$45,$53,$45,$D4     ;RESET         9C\r\n        FCB     $43,$4C,$D3             ;CLS           9D\r\n        FCB     $53,$4F,$55,$4E,$C4     ;SOUND         9E\r\n        FCB     $45,$58,$45,$C3         ;EXEC          9F\r\n        FCB     $53,$4B,$49,$50,$C6     ;SKIPF         A0        \r\n        FCB     $54,$41,$42,$A8         ;TAB(          A1\r\n        FCB     $54,$CF                 ;TO            A2\r\n        FCB     $54,$48,$45,$CE         ;THEN          A3\r\n        FCB     $4E,$4F,$D4             ;NOT           A4\r\n        FCB     $53,$54,$45,$D0         ;STEP          A5\r\n        FCB     $4F,$46,$C6             ;OFF           A6\r\n        FCB     $AB                     ;+             A7\r\n        FCB     $AD                     ;-             A8\r\n        FCB     $AA                     ;*             A9\r\n        FCB     $AF                     ;/             AA\r\n        FCB     $DE                     ;^             AB\r\n        FCB     $41,$4E,$C4             ;AND           AC\r\n        FCB     $4F,$D2                 ;OR            AD\r\n        FCB     $BE                     ;>             AE\r\n        FCB     $BD                     ;=             AF\r\n        FCB     $BC                     ;<             B0\r\n        FCB     $53,$47,$CE             ;SGN           B1\r\n        FCB     $49,$4E,$D4             ;INT           B2\r\n        FCB     $41,$42,$D3             ;ABS           B3\r\n        FCB     $55,$53,$D2             ;USR           B4\r\n        FCB     $52,$4E,$C4             ;RND           B5\r\n        FCB     $53,$51,$D2             ;SQR           B6\r\n        FCB     $4C,$4F,$C7             ;LOG           B7\r\n        FCB     $45,$58,$D0             ;EXP           B8\r\n        FCB     $53,$49,$CE             ;SIN           B9\r\n        FCB     $43,$4F,$D3             ;COS           BA\r\n        FCB     $54,$41,$CE             ;TAN           BB\r\n        FCB     $50,$45,$45,$CB         ;PEEK          BC\r\n        FCB     $4C,$45,$CE             ;LEN           BD\r\n        FCB     $53,$54,$52,$A4         ;STR$          BE\r\n        FCB     $56,$41,$CC             ;VAL           BF\r\n        FCB     $41,$53,$C3             ;ASC           C0\r\n        FCB     $43,$48,$52,$A4         ;CHR$          C1\r\n        FCB     $4C,$45,$46,$54,$A4     ;LEFT$         C2\r\n        FCB     $52,$49,$47,$48,$54,$A4 ;RIGHT$        C3\r\n        FCB     $4D,$49,$44,$A4         ;MID$          C4\r\n        FCB     $50,$4F,$49,$4E,$D4     ;POINT         C5\r\n        FCB     $56,$41,$52,$50,$54,$D2 ;VARPTR        C6\r\n        FCB     $49,$4E,$4B,$45,$59,$A4 ;INKEY$        C7\r\n        FCB     $4D,$45,$CD             ;MEM           C8\r\n        FCB     $00\r\n\r\n                ; --- Command vector table ---\r\nTBLE148 FDB     CMD_FOR         ; $E4C4  FOR\r\n        FDB     CMD_GOTO        ; $E61A  GOTO\r\n        FDB     CMD_GOSUB       ; $E604  GOSUB\r\n        FDB     CMD_REM         ; $E685  REM\r\n        FDB     CMD_IF          ; $E672  IF\r\n        FDB     CMD_DATA        ; $E651  DATA\r\n        FDB     CMD_PRINT       ; $E71F  PRINT\r\n        FDB     CMD_ON          ; $E692  ON\r\n        FDB     CMD_INPUT       ; $E7DE  INPUT\r\n        FDB     CMD_END         ; $E57F  END\r\n        FDB     CMD_NEXT        ; $E8BB  NEXT\r\n        FDB     CMD_DIM         ; $EB12  DIM\r\n        FDB     CMD_READ        ; $E80E  READ\r\n        FDB     CMD_LET         ; $E6D3  LET\r\n        FDB     CMD_RUN         ; $E5FA  RUN\r\n        FDB     CMD_RESTORE     ; $E560  RESTORE\r\n        FDB     CMD_RETURN      ; $E631  RETURN\r\n        FDB     CMD_STOP        ; $E57E  STOP\r\n        FDB     CMD_POKE        ; $EF66  POKE\r\n        FDB     CMD_CONT        ; $E5A6  CONT\r\n        FDB     CMD_LIST        ; $E40D  LIST\r\n        FDB     CMD_CLEAR       ; $E5B8  CLEAR\r\n        FDB     CMD_NEW         ; $E3CD  NEW\r\n        FDB     CMD_CLOAD       ; $FD5C  CLOAD\r\n        FDB     CMD_CSAVE       ; $FC3B  CSAVE\r\n        FDB     CMD_LLIST       ; $E40B  LLIST\r\n        FDB     CMD_LPRINT      ; $E71C  LPRINT\r\n        FDB     CMD_SET         ; $FB25  SET\r\n        FDB     CMD_RESET       ; $FB55  RESET\r\n        FDB     CMD_CLS         ; $FBBF  CLS\r\n        FDB     CMD_SOUND       ; $FFA5  SOUND\r\n        FDB     CMD_EXEC        ; $FC04  EXEC\r\n        FDB     CMD_SKIPF       ; $FE2F  SKIPF\r\n\r\n                ; --- Errors ---\r\nTBLE18A FCB     $4E,$46         ;$00 NF NEXT without FOR                      \r\n        FCB     $53,$4E         ;$02 SN Syntax Error                          \r\n        FCB     $52,$47         ;$04 RG RETURN without GOSUB                  \r\n        FCB     $4F,$44         ;$06 OD Out of Data                           \r\n        FCB     $46,$43         ;$08 FC Illegal Function Call                 \r\n        FCB     $4F,$56         ;$0A OV Overflow                              \r\n        FCB     $4F,$4D         ;$0C OM Out of Memory                         \r\n        FCB     $55,$4C         ;$0E UL Undefined Line                        \r\n        FCB     $42,$53         ;$20 BS Bad Subscript                         \r\n        FCB     $44,$44         ;$22 DD Double Dimensioned Array              \r\n        FCB     $2F,$30         ;$24 /0 Division by 0                         \r\n        FCB     $49,$44         ;$26 ID Illegal Direct Statement              \r\n        FCB     $54,$4D         ;$28 TM Type Mismatch                         \r\n        FCB     $4F,$53         ;$2A OS Out of String Space                   \r\n        FCB     $4C,$53         ;$2C LS Long String (exceeds 255 characters)  \r\n        FCB     $53,$54         ;$2E ST String Formula Too Complex ? \"\"+(\"\"+(\"\"+\"\"))\r\n        FCB     $43,$4E         ;$30 CN Can't Continue                        \r\n        FCB     $49,$4F         ;$32 IO Input/Output Error                    \r\n        FCB     $46,$4D         ;$34 FM File Mode Error                       \r\n\r\n\r\nTBLE1B0 FCB     $20,$45,$52,$52,$4F,$52,$00     ; ERROR\r\nTBLE1B7 FCB     $20,$49,$4E,$20,$00             ; IN \r\nTBLE1BC FCB     $0D,$4F,$4B,$0D,$00             ; OK\r\nTBLE1C1 FCB     $0D,$42,$52,$45,$41,$4B,$00     ; BREAK\r\n\r\n\r\nLBLE1C8 CMPA    #$3A    ;Leave if non-numeric. Z=':' or NULL\r\n        BHS     LBLE1D7 ;                      C=Numeric\r\n        CMPA    #$20    ;skip whitespace\r\n        BNE     LBLE1D3\r\n        JMP     LBL00EB\r\nLBLE1D3 SUBA    #$30\r\n        SUBA    #$D0    ;Set Carry if numeric.\r\nLBLE1D7 RTS     \r\nLBLE1D8 TSX           \r\n        LDAB    #$04\r\n        ABX     \r\nLBLE1DC LDAB    #$12\r\n        STX     ram89\r\n        LDAA    ,X   ; SP+0==return addr.  SP+2==?.  SP+4->A\r\n        SUBA    #$80\r\n        BNE     LBLE1FA\r\n        LDX     1,X\r\n        STX     ram8B\r\n        LDX     ramB5\r\n        BEQ     LBLE1F6\r\n        CPX     ram8B\r\n        BEQ     LBLE1FA\r\n        BSR     LBLE22F\r\n        BRA     LBLE1DC\r\nLBLE1F6 LDX     ram8B\r\n        STX     ramB5\r\nLBLE1FA LDX     ram89\r\n        TSTA\r\n        RTS\r\n\r\n                ; -- copy [C1:BD]->[bf:BB]\r\nLBLE1FE BSR     LBLE21E; see if D bytes fit on stack\r\nLBLE200 TPA     \r\n        PSHA    \r\n        STS     ram91\r\n        SEI     \r\n        LDS     ramBB   ; store in [BB]\r\n        LDX     ramBD   ; start at [BD]\r\n        INX    \r\nLBLE20A DEX    \r\n        LDAA    ,X\r\n        PSHA    \r\n        CPX     ramC1   ; stop at [C1]\r\n        BNE     LBLE20A\r\n        INS    \r\n        STS     ramBF   ; store end in [BF]\r\n        LDS     ram91\r\n        PULA    \r\n        TAP     \r\n        RTS     \r\nLBLE21A CLRA           ; return with 2*B+#$3A+ram99\r\n        ASLB           ;\r\n        ADDD    ram99  ; check if 2*B+3A+ram99>0xffff\r\nLBLE21E ADDD    #$003A\r\n        BLO     LBLE236; ?OM error\r\n        STS     ram91\r\n        SUBD    ram91\r\n        BHS     LBLE236; ?OM if greater than stack\r\n        ADDD    ram91\r\n        RTS     \r\n\r\nLBLE22C CLRA          ; B+X->D,X\r\nLBLE22D STX     ram89 ; D+X->D,X (save old X in 89.  New X,D in 8B)\r\nLBLE22F ADDD    ram89 ; D+ram89->D,X.\r\n        STD     ram8B\r\n        LDX     ram8B\r\n        RTS\r\n\r\n\r\nLBLE236 LDAB    #$0C    ;?OM error\r\nLBLE238 JSR     LBL4297 ;error return extension 1\r\n        JSR     LBL429A ;error return extension 2\r\n        JSR     LBLFC86\r\n        LDAA    ram426E\r\n        BEQ     LBLE249\r\n        JSR     LBLE3CF\r\nLBLE249 JSR     LBLE3EE\r\n        CLR     ramE8   ;turn off printer\r\n        JSR     LBLE76A\r\n        JSR     LBLE7BB+1\r\n        LDX     #TBLE18A        ;Error table\r\n        ABX     \r\n        LDAA    ,X\r\n        JSR     LBLE7BE    ;A->SCN\r\n        LDAA    1,X\r\n        JSR     LBLE7BE    ;A->SCN\r\n        LDX     #TBLE1B0-1      ;\"ERROR\"\r\nLBLE266 JSR     LBLE7A8         ;Write string\r\n        LDX     ramE2\r\n        INX    \r\n        BEQ     LBLE271\r\n        JSR     LBLF412         ;' IN ' line\r\nLBLE271 JSR     LBLE76A\r\n        LDX     #TBLE1BC        ;\"OK\"\r\n        JSR     LBLE7A8         ;Write string\r\nLBLE27A LDX     #$FFFF\r\n        STX     ramE2\r\n        JSR     LBLFAA4         ;Get Command Line\r\n        BLO     LBLE27A         ;Try again if carry set (BREAK)\r\n        STX     ramF4\r\n        JSRE    LBL00EB \r\n        BEQ     LBLE27A         ;Try again if blank line\r\n        BLO     LBLE293\r\n        JSR     LBLE311         ;immediate mode - compile line.\r\n        JMP     LBLE53D\r\nLBLE293 JSR     LBLE6B2         ;get line number->ramA5\r\n        LDX     ramA5\r\n        STX     ram42B0         ;store line number\r\n        JSR     LBLE311         ;compile line\r\n        STAB    ram82           ;length of line\r\n        JSR     LBLE3B9         ;find first line greater than line number\r\n        BLO     LBLE2C1         ; none found, insert at end.\r\n        LDD     ramC1\r\n        SUBD    ,X\r\n        ADDD    ram95\r\n        STD     ram95\r\n        TPA     \r\n        PSHA    \r\n        STS     ram91\r\n        SEI     \r\n        LDS     ,X\r\n        DES    \r\nLBLE2B5 PULA    \r\n        STAA    ,X\r\n        INX    \r\n        CPX     ram95\r\n        BNE     LBLE2B5\r\n        LDS     ram91\r\n        PULA    \r\n        TAP     \r\nLBLE2C1 LDAA    TBL42B2\r\n        BEQ     LBLE2EB\r\n        LDD     ram95\r\n        STD     ramBD\r\n        ADDB    ram82\r\n        ADCA    #$00\r\n        STD     ramBB\r\n        JSR     LBLE1FE  ;copy [C1:BD]->[bf:BB]\r\n        TPA     \r\n        PSHA    \r\n        STS     ram91\r\n        SEI     \r\n        LDS     #$42AD\r\nLBLE2DB PULA    \r\n        STAA    ,X\r\n        INX    \r\n        CPX     ramBF  \r\n        BNE     LBLE2DB\r\n        LDS     ram91\r\n        PULA    \r\n        TAP     \r\n        LDX     ramBB\r\n        STX     ram95\r\nLBLE2EB JSR     LBLE3D9  ;reset variables\r\n        BSR     LBLE2F3  ;adjust next statement pointers\r\n        JMP     LBLE27A  ;get command line\r\n                         ; adjust next statement pointers\r\nLBLE2F3 LDX     ram93    ;start of basic\r\nLBLE2F5 LDD     ,X       ;return if last statement.\r\n        BNE     LBLE2FA\r\n        RTS     \r\nLBLE2FA PSHX             ;push address of statement\r\n        LDAB    #$04\r\n        ABX     \r\nLBLE2FE INX    \r\n        LDAA    ,X\r\n        BNE     LBLE2FE\r\n        INX    \r\n        PSHX           ;push address of next statement\r\n        TSX     \r\n        LDD     ,X     ;addr of next statement -> D\r\n        LDX     2,X    ;addr of prev statement -> X\r\n        STD     ,X     ;update addr of prev statment to point to next statement.\r\n        PULX    \r\n        INS    \r\n        INS    \r\n        BRA     LBLE2F5\r\n\r\nLBLE311 CLR     ram85    ;clear DATA token flag\r\n        LDX     ramF4    ;reset pointer back to start of line.\r\n        DEX    \r\n        STX     ramF4\r\n        LDX     #TBL42B1 ;start of command line buffer-1\r\n        STX     ramDE\r\n        STS     ram91\r\n        TPA             ; save interrupt flag\r\n        STAA    ram87\r\nLBLE323 NOP     \r\n        SEI             ; disable interrupts\r\n        LDS     ramF4\r\n        PULB    \r\n        CMPB    #$20    ; ' '\r\n        BEQ     LBLE364\r\n        STAB    ram81\r\n        CMPB    #$22    ; '\"'\r\n        BEQ     LBLE38D\r\n        LDAA    ram85\r\n        BNE     LBLE364\r\n        CMPB    #$3F    ; '?'\r\n        BNE     LBLE33E\r\n        LDAB    #$86    ; 'PRINT' code\r\n        BRA     LBLE364\r\nLBLE33E CMPB    #$30    ; '0'\r\n        BLO     LBLE346\r\n        CMPB    #$3C    ; '<'\r\n        BLO     LBLE364\r\nLBLE346 TSTB            ; use ! for non-printing input chars\r\n        BMI     LBLE361+1\r\n        LDX     #TBLE045-1 ; start matching tokens\r\n        LDS     ramF4\r\n        CLRB    \r\nLBLE34F INX    \r\nLBLE350 PULA    \r\n        CMPA    #$20    ; skip whitespace when matching tokens\r\n        BEQ     LBLE350\r\n        SUBA    ,X\r\n        BEQ     LBLE34F\r\n        CMPA    #$80\r\n        BNE     LBLE392\r\n        ORAB    #$80    ; found match, store token.\r\nLBLE35F LDX     ramDE\r\nLBLE361 CPX     #$C621          ;LDAB  #$21 '!'\r\nLBLE364 STS     ramF4\r\n        LDS     ram91\r\n        LDAA    ram87   ; restore interrupt\r\n        TAP     \r\n        INX    \r\n        STX     ramDE\r\n        STAB    ,X\r\n        BEQ     LBLE3AA\r\n        SUBB    #$3A    ; ':'\r\n        BEQ     LBLE37A\r\n        CMPB    #$4B    ; 'DATA' encountered\r\n        BNE     LBLE37C\r\nLBLE37A STAB    ram85   ; set DATA token flag\r\nLBLE37C SUBB    #$49    ; 'REM' \r\n        BNE     LBLE323 ; get next char.\r\n        STAB    ram81   ; 'REM' found, clear ram81\r\n        SEI     \r\n        LDS     ramF4\r\nLBLE385 PULB           ; copy until 0 or ram81 encountered.\r\n        TSTB    \r\n        BEQ     LBLE364\r\n        CMPB    ram81\r\n        BEQ     LBLE364\r\nLBLE38D INX    \r\n        STAB    ,X\r\n        BRA     LBLE385\r\nLBLE392 LDS     ramF4   ; token failed match\r\n        INCB            ;  inc token count\r\nLBLE395 LDAA    ,X      ;  \r\n        INX    \r\n        BPL     LBLE395\r\n        LDAA    ,X\r\n        BNE     LBLE350\r\n        STS     ramF4   ; no tokens matched.\r\n        LDS     ram91\r\n        JSR     LBL42A3\r\n        LDS     ramF4\r\n        PULB    \r\n        BRA     LBLE35F\r\nLBLE3AA STAB    1,X     ; clear next two bytes\r\n        STAB    2,X\r\n        LDD     ramDE\r\n        SUBD    #$42AD  ; length of buff in D.\r\n        LDX     #TBL42B1\r\n        STX     ramF4\r\n        RTS     \r\nLBLE3B9 LDX     ram93\r\nLBLE3BB LDD     ,X\r\n        BEQ     LBLE3C9\r\n        LDD     ramA5\r\n        SUBD    2,X\r\n        BLS     LBLE3CA\r\n        LDX     ,X\r\n        BRA     LBLE3BB\r\nLBLE3C9 SEC     \r\nLBLE3CA STX     ramC1\r\n        RTS\r\n\r\n                ; --- NEW command ---\r\nCMD_NEW\r\n        BNE     LBLE3CA ; cause syntax error\r\nLBLE3CF LDX     ram93   ; start of BASIC \r\n        CLR     ,X      ; clear line\r\n        INX            \r\n        CLR     ,X\r\n        INX    \r\n        STX     ram95   ; end of BASIC\r\nLBLE3D9 LDX     ram93   ; transfer control to program\r\n        DEX    \r\n        STX     ramF4   ; read pointer\r\nLBLE3DE JSR     LBL428E ; NEW command extension\r\n        LDX     ramA1   ; top of string storage\r\n        STX     ram9D   ; avail string storage.\r\n        JSR     CMD_RESTORE\r\n        LDX     ram95   ; end of BASIC\r\n        STX     ram97   ; DATA pointer\r\n        STX     ram99   ; \r\nLBLE3EE LDX     #TBL4241  ; string buff.\r\n        STX     ram423D   ; string ptr.\r\n        PULX    \r\n        LDS     ram9B   ; bottom of system stack \r\n        CLRA    \r\n        PSHA    \r\n        STAA    ramA7   ; program BREAK address\r\n        STAA    ramA8   ; program BREAK address\r\n        STAA    ram86   ; ?\r\n        STAA    ram426E ; NEW command status flag\r\n        JMP     ,X      ; RTS\r\n\r\n\r\nLBLE404 LDAB    #$FE    ; select printer\r\n        STAB    ramE8   ; turn on printer\r\nLBLE408 JMP     LBL00F3\r\n\r\n                ; --- LLIST command ---\r\nCMD_LLIST\r\n        BSR     LBLE404\r\n\r\n                ; --- LIST command ---\r\nCMD_LIST\r\n        TPA     \r\n        PSHA    \r\n        BSR     LBLE408 ; Get char\r\n        JSR     LBLE6B2 ; Get line number\r\n        BSR     LBLE3B9 ; Find line number in program\r\n        PULA    \r\n        TAP     \r\n        PSHX    \r\n        BEQ     LBLE431\r\n        JSRE    LBL00F3\r\n        BEQ     LBLE436\r\n        CMPA    #$A8    ; '-'\r\n        BNE     LBLE42E\r\n        JSRE    LBL00EB\r\n        BEQ     LBLE431\r\n        JSR     LBLE6B2\r\n        BEQ     LBLE436\r\nLBLE42E JMP     LBLEA3C  ;?SN ERROR\r\nLBLE431 LDX     #$FFFF\r\n        STX     ramA5\r\nLBLE436 PULX    \r\n        INS    \r\n        INS    \r\nLBLE439 JSR     LBLE76A\r\n        JSR     LBLE566\r\n        LDD     ,X\r\n        BNE     LBLE449\r\nLBLE443 CLR     ramE8   ; set output to printer\r\n        JMP     LBLE271\r\nLBLE449 LDD     2,X\r\n        SUBD    ramA5\r\n        BHI     LBLE443\r\n        LDD     2,X\r\n        PSHX    \r\n        JSR     LBLF419\r\n        PULX    \r\n        INX    \r\n        INX    \r\n        INX    \r\n        INX    \r\n        STX     ram89\r\n        CLR     ram4284\r\n        LDAA    #$20\r\nLBLE461 CPX     #$8621          ;LDAA  #$21\r\nLBLE464 LDX     ram89\r\n        ANDA    #$7F\r\nLBLE468 JSR     LBLE7BE  ;A->SCN\r\n        LDAA    ,X\r\n        INX    \r\n        TSTA    \r\n        BEQ     LBLE439\r\n        LDAB    ram4284\r\n        CMPA    #$22   ; '\"'\r\n        BNE     LBLE47D\r\n        EORB    #$01\r\n        STAB    ram4284\r\nLBLE47D CMPA    #$3A   ; ':'\r\n        BNE     LBLE48A\r\n        BITB    #$01\r\n        BNE     LBLE48A\r\n        ANDB    #$FD\r\n        STAB    ram4284\r\nLBLE48A TSTA    \r\n        BPL     LBLE468\r\n        TSTB    \r\n        BNE     LBLE468\r\n        CMPA    #$85   ; 'DATA'\r\n        BNE     LBLE496\r\n        ORAB    #$02\r\nLBLE496 CMPA    #$83   ; 'REM'\r\n        BNE     LBLE49C\r\n        ORAB    #$04\r\nLBLE49C STAB    ram4284\r\n        JSR     LBL42A6\r\n        CMPA    #$C8       ; 'MEM'\r\n        BHI     LBLE461+1  ; write ! for unknown print\r\n        BSR     LBLE4B2\r\nLBLE4A8 LDAA    ,X     ; write token\r\n        BMI     LBLE464\r\n        INX    \r\n        JSR     LBLE7BE;A->SCN\r\n        BRA     LBLE4A8\r\n\r\nLBLE4B2 SUBA    #$7F     ;Find address of matching token->X\r\n        STX     ram89    ;save X into ram89\r\n        LDX     #TBLE045\r\nLBLE4B9 DECA    \r\n        BNE     LBLE4BD\r\n        RTS     \r\nLBLE4BD TST     ,X\r\n        INX    \r\n        BPL     LBLE4BD\r\n        BRA     LBLE4B9\r\n\r\n                 ; --- FOR Command ---\r\nCMD_FOR LDAA    #$80\r\n        STAA    ram86\r\n        JSR     CMD_LET\r\n        JSR     LBLE1D8\r\n        PULX    \r\n        BNE     LBLE4D5\r\n        LDX     ram89\r\n        ABX     \r\n        TXS     \r\nLBLE4D5 LDAB    #$09\r\n        JSR     LBLE21A  ; Verify 9 words will fit on stack\r\n        JSR     LBLE656  ; ignore rest of line until ':' seen\r\n        PSHX    \r\n        LDX     ramE2\r\n        PSHX    \r\n        LDAB    #$A2     ;'TO' index\r\n        JSR     LBLEA31\r\n        JSR     LBLE90E  ; expect numeric\r\n        JSR     LBLE90C  ; Get numeric value\r\n        LDAB    ramCE\r\n        ORAB    #$7F\r\n        ANDB    ramCA\r\n        STAB    ramCA\r\n        LDX     #LBLE4FA  ; push C9-CA onto stack\r\n        JMP     LBLE9A4\r\nLBLE4FA LDX     #TBLF08B  ; 1.0\r\n        JSR     LBLF251  ;X->C9-E\r\n        JSRE    LBL00F3\r\n        CMPA    #$A5     ;'STEP' index\r\n        BNE     LBLE50D\r\n        JSRE    LBL00EB\r\n        JSR     LBLE90C  ; Get numeric value\r\nLBLE50D JSR     LBLF2AD  ;Sign C9-E -> B -1 0 1\r\n        JSR     LBLE9A2\r\n        LDX     ramB5\r\n        PSHX    \r\n        LDAA    #$80\r\n        PSHA    \r\nLBLE519 BSR     LBLE566  ; check for BREAK or PAUSE\r\n        LDX     ramF4\r\n        STX     ramA9\r\n        LDAA    ,X\r\n        BEQ     LBLE52A\r\n        CMPA    #$3A     ; ':'\r\n        BEQ     LBLE53D\r\nLBLE527 JMP     LBLEA3C  ; ?SN ERROR\r\nLBLE52A INX              ; check for next line\r\n        LDAA    ,X\r\n        INX    \r\n        ORAA    ,X\r\n        STAA    ram4283  ; 0 if at last line number\r\n        BEQ     LBLE589  ; Implicit END if no next line.\r\n        INX    \r\n        LDD     ,X\r\n        STD     ramE2    ; Otherwise store current line in E2.\r\n        INX    \r\n        STX     ramF4\r\nLBLE53D JSRE    LBL00EB  ; get token\r\n        BSR     LBLE544\r\n        BRA     LBLE519  ; continue executing line\r\nLBLE544 BEQ     LBLE5B7  ; RTS if 0 encountered.\r\nLBLE546 JSR     LBL42A0  ; Run command extension\r\n        TSTA    \r\n        BMI     LBLE54F  ; Command encountered.\r\n        JMP     CMD_LET  ; otherwise, this must be an assignment.\r\nLBLE54F CMPA    #$A0     ; SKIPF is the last valid command.\r\n        BHI     LBLE527  ; ?SN ERROR\r\n        ASLA             ; lookup command.\r\n        TAB     \r\n        LDX     #TBLE148\r\n        ABX     \r\n        LDX     ,X\r\n        JSRE    LBL00EB  ; prefetch next character.\r\n        JMP     ,X       ; GO! [to command]\r\n\r\n                ; --- RESTORE command ---\r\nCMD_RESTORE\r\n        LDX     ram93\r\n        DEX    \r\nLBLE563 STX     ramAD  ;DATA pointer\r\n        RTS\r\n\r\n\r\nLBLE566 JSR     LBLF879\r\n        BEQ     LBLE576\r\nLBLE56B CMPA    #$03     ; 'break pressed?\r\n        BEQ     CMD_STOP\r\n        CMPA    #$13     ; 'shift+@ pressed (pause)\r\n        BEQ     LBLE577  ;  wait for next key.\r\n        STAA    ram427F\r\nLBLE576 RTS\r\n\r\nLBLE577 JSR     LBLF883\r\n        BEQ     LBLE577\r\n        BRA     LBLE56B\r\n\r\n                ; --- STOP command ---\r\nCMD_STOP\r\n        SEC\r\n                ; --- END command ---\r\nCMD_END\r\n        BNE     LBLE5B7\r\n        LDX     ramF4\r\n        STX     ramA9\r\nLBLE585 ROR     ram4283 ; break status flag \r\n        PULX    \r\nLBLE589 LDX     ramE2\r\n        INX    \r\n        BEQ     LBLE595\r\n        DEX    \r\n        STX     ramA3\r\n        LDX     ramA9\r\n        STX     ramA7\r\nLBLE595 CLR     ramE8      ; turn off printing\r\n        LDX     #TBLE1C1-1 ; 'BREAK'\r\n        TST     ram4283\r\n        BPL     LBLE5A3\r\n        JMP     LBLE266    ; in program \r\nLBLE5A3 JMP     LBLE271    ; not in program\r\n\r\n                ; --- CONT command ---\r\nCMD_CONT\r\n        BNE     LBLE5B7\r\n        LDAB    #$20     ;?CN error\r\n        LDX     ramA7\r\n        BNE     LBLE5B1\r\n        JMP     LBLE238  ;write ?CN error\r\nLBLE5B1 STX     ramF4\r\n        LDX     ramA3\r\n        STX     ramE2\r\nLBLE5B7 RTS\r\n\r\n                ; --- CLEAR command ---\r\nCMD_CLEAR\r\n        BEQ     LBLE5F4\r\n        JSR     LBLEBBD\r\n        PSHB    \r\n        PSHA    \r\n        LDX     ramA1   ; top of string storage\r\n        STX     ramCC\r\n        JSRE    LBL00F3\r\n        BEQ     LBLE5DA\r\n        JSR     LBLEA2E+1  ; get ','\r\n        JSR     LBLEF4C\r\n        LDX     ramCC\r\n        DEX    \r\n        STX     ramCC\r\n        LDD     ram4250 ; end of memory pointer\r\n        SUBD    ramCC\r\n        BLO     LBLE5F7 ; ?OM error\r\nLBLE5DA LDD     ramCC\r\n        PSHB    \r\n        PSHA    \r\n        TSX     \r\n        SUBD    2,X\r\n        BLO     LBLE5F7 ; ?OM error\r\n        STD     2,X\r\n        SUBD    #$003A\r\n        BLO     LBLE5F7 ; ?OM error\r\n        SUBD    ram95\r\n        BLO     LBLE5F7 ; ?OM error\r\n        PULX    \r\n        STX     ramA1 ; top of string storage\r\n        PULX    \r\n        STX     ram9B   ; bottom of system stack\r\nLBLE5F4 JMP     LBLE3DE ; reset variables\r\nLBLE5F7 JMP     LBLE236 ; ?OM ERROR\r\n\r\n                ; --- RUN command ---\r\nCMD_RUN\r\n        BNE     LBLE5FF\r\n        JMP     LBLE3D9 ; transfer control to program / reset variables\r\nLBLE5FF JSR     LBLE3DE ; reset data variables\r\n        BRA     LBLE612\r\n\r\n                ; --- GOSUB command ---\r\nCMD_GOSUB\r\n        LDAB    #$03   \r\n        JSR     LBLE21A ; verify 3 words on stack\r\n        LDX     ramF4\r\n        PSHX    \r\n        LDX     ramE2\r\n        PSHX    \r\n        LDAA    #$82\r\n        PSHA    \r\nLBLE612 JSRE    LBL00F3\r\n        BSR     CMD_GOTO\r\n        JMP     LBLE519 ; Continue executing line\r\n\r\n                ; --- GOTO command ---\r\nCMD_GOTO\r\n        JSR     LBLE6B2\r\n        BSR     LBLE658+1\r\n        INX    \r\n        LDD     ramA5\r\n        SUBD    ramE2\r\n        BHI     LBLE628\r\n        LDX     ram93\r\nLBLE628 JSR     LBLE3BB\r\n        BLO     LBLE641+1 ;?UL error\r\n        DEX    \r\n        STX     ramF4\r\nLBLE630 RTS\r\n\r\n                ; --- RETURN command ---\r\nCMD_RETURN\r\n        BNE     LBLE630 ; will ultimately result in ?SN error\r\n        LDAA    #$FF\r\n        STAA    ramB5\r\n        JSR     LBLE1D8\r\n        TXS     \r\n        CMPA    #$02\r\n        BEQ     LBLE64A\r\n        LDAB    #$04    ;?RG error\r\nLBLE641 CPX     #$C60E          ;LDAB  #$0E ?UL error\r\n        JMP     LBLE238 ;Write error\r\nLBLE647 JMP     LBLEA3C ;?SN error\r\nLBLE64A PULA    \r\n        PULX    \r\n        STX     ramE2\r\n        PULX    \r\n        STX     ramF4\r\n\r\n\r\n                ; --- DATA command ---\r\nCMD_DATA\r\n        BSR     LBLE656 ; ignore rest of line until ':' or 0 reached.\r\n        STX     ramF4\r\nLBLE655 RTS\r\n\r\n\r\n\r\nLBLE656 LDAB    #$3A   ; ignore rest of line until ':' or 0 reached.\r\nLBLE658 LDAA    #$5F            ;CLRB; ignore rest of line\r\n        STAB    ram80\r\n        CLRB    \r\n        LDX     ramF4\r\nLBLE65F TBA     \r\n        LDAB    ram80\r\n        STAA    ram80\r\nLBLE664 LDAA    ,X\r\n        BEQ     LBLE655\r\n        CBA     \r\n        BEQ     LBLE655\r\n        INX    \r\n        CMPA    #$22   ; '\"'\r\n        BEQ     LBLE65F\r\n        BRA     LBLE664\r\n\r\n\r\n                ; --- IF command ---\r\nCMD_IF\r\n        JSR     LBLE90C ; Get numeric value\r\n        JSRE    LBL00F3\r\n        CMPA    #$81    ; GOTO\r\n        BEQ     LBLE681\r\n        LDAB    #$A3    ; THEN\r\n        JSR     LBLEA31\r\nLBLE681 LDAA    ramC9\r\n        BNE     LBLE68A\r\n\r\n\r\n                ; --- REM command ---\r\nCMD_REM BSR     LBLE658+1\r\n        STX     ramF4\r\n        RTS\r\n\r\n\r\nLBLE68A JSRE    LBL00F3\r\n        BLO     CMD_GOTO\r\n        JMP     LBLE544\r\n\r\n                ; --- ON command ----\r\nCMD_ON  JSR     LBLEF0D ; Arg->ramCD\r\n        PSHA    \r\n        CMPA    #$82    ; GOSUB\r\n        BEQ     LBLE69E\r\n        CMPA    #$81    ; GOTO\r\nLBLE69C BNE     LBLE647 ; ?SN ERROR\r\nLBLE69E DEC     ramCD\r\n        BNE     LBLE6A7\r\n        PULA    \r\n        JMP     LBLE546\r\nLBLE6A7 JSRE    LBL00EB\r\n        BSR     LBLE6B2 ; get line number->A5\r\n        CMPA    #$2C    ; ','\r\n        BEQ     LBLE69E\r\n        INS    \r\nLBLE6B1 RTS            ; bug -- \"0 ON 2 GOTO 4,#,4,4#\" hangs the MC-10 on RUN.\r\n\r\nLBLE6B2 LDX     #$0000   ; get line number->ramA5\r\n        STX     ramA5\r\nLBLE6B7 BHS     LBLE6B1\r\n        SUBA    #$30\r\n        STAA    ram80\r\n        LDD     ramA5   ; Get line number\r\n        CMPA    #$18    ; err if > 6399\r\n        BHI     LBLE69C ; ?SN ERROR\r\n        ASLD            ; ramA5 = 10*ramA5 + ram80\r\n        ASLD    \r\n        ADDD    ramA5\r\n        ASLD    \r\n        ADDB    ram80  \r\n        ADCA    #$00\r\n        STD     ramA5\r\n        JSRE    LBL00EB\r\n        BRA     LBLE6B7\r\n\r\n                ; --- LET command ---\r\nCMD_LET\r\n        JSR     LBLEB1B\r\n        STX     ramB5\r\n        LDAB    #$AF\r\n        JSR     LBLEA31\r\n        LDAA    ram84  ; vartype flag\r\n        PSHA    \r\n        JSR     LBLE91A\r\n        PULA    \r\n        RORA    \r\n        JSR     LBLE910 ;check for ?TM and get next number\r\n        BEQ     LBLE719\r\nLBLE6EA LDX     ramCC\r\n        LDD     ram9B   ; bottom of system stack\r\n        SUBD    2,X\r\n        BHS     LBLE705\r\n        LDD     ram95\r\n        SUBD    ramCC\r\n        BHI     LBLE705\r\n        LDAB    ,X\r\n        JSR     LBLECFC\r\n        LDX     ramC7\r\n        JSR     LBLEE38\r\n        LDX     #ramD0\r\nLBLE705 STX     ramC7\r\n        JSR     LBLEE70\r\n        LDX     ramC7\r\n        LDAA    ,X\r\n        PSHA    \r\n        LDD     2,X\r\n        LDX     ramB5\r\n        STD     2,X\r\n        PULA    \r\n        STAA    ,X\r\n        RTS     \r\nLBLE719 JMP     LBLF26F+1\r\n\r\n                ; --- LPRINT command ---\r\nCMD_LPRINT\r\n        JSR     LBLE404\r\n\r\n                ; --- PRINT command ---\r\nCMD_PRINT\r\n        BSR     LBLE725\r\n        CLR     ramE8  ; turn off printing\r\n        RTS     \r\nLBLE725 BEQ     LBLE766\r\n        CMPA    #$40      ; '@'\r\n        BNE     LBLE736\r\n        JSR     LBLFC29\r\n        JSRE    LBL00F3\r\n        BEQ     LBLE766\r\n        JSR     LBLEA2E+1 ; get ','\r\nLBLE736 BEQ     LBLE773\r\nLBLE738 CMPA    #$A1\r\n        BEQ     LBLE78C\r\n        CMPA    #$2C\r\n        BEQ     LBLE774\r\n        CMPA    #$3B\r\n        BEQ     LBLE7A2\r\n        JSR     LBLE91A\r\n        LDAA    ram84   ; vartype flag\r\n        PSHA    \r\n        BNE     LBLE752\r\n        JSR     LBLF426\r\n        JSR     LBLED05\r\nLBLE752 BSR     LBLE7AB\r\n        PULB    \r\n        TSTB    \r\n        BNE     LBLE761\r\n        JSRE    LBL00F3\r\n        CMPA    #$2C\r\n        BEQ     LBLE774\r\n        BSR     LBLE7B9\r\nLBLE761 JSRE    LBL00F3\r\n        BNE     LBLE738\r\nLBLE766 LDAA    #$0D\r\n        BRA     LBLE7BE ;A->SCN\r\nLBLE76A JSR     LBLFA7B\r\n        BEQ     LBLE766\r\n        LDAA    ramE6\r\n        BNE     LBLE766\r\nLBLE773 RTS     \r\nLBLE774 JSR     LBLFA7B\r\n        BEQ     LBLE783\r\n        LDAB    ramE6\r\n        CMPB    ramE5\r\n        BLO     LBLE785\r\n        BSR     LBLE766\r\n        BRA     LBLE7A2\r\nLBLE783 LDAB    ramE6\r\nLBLE785 SUBB    ramE4\r\n        BHS     LBLE785\r\n        NEGB    \r\n        BRA     LBLE79D\r\nLBLE78C JSR     LBLEF0A\r\n        CMPA    #$29\r\n        BEQ     LBLE796\r\n        JMP     LBLEA3C ;?SN ERROR\r\nLBLE796 JSR     LBLFA7B\r\n        SUBB    ramE6\r\n        BLS     LBLE7A2\r\nLBLE79D BSR     LBLE7B9\r\n        DECB    \r\n        BNE     LBLE79D\r\nLBLE7A2 JSRE    LBL00EB\r\n        JMP     LBLE736\r\n\r\n\r\n                ; --- Write string to screen ---\r\nLBLE7A8 JSR     LBLED06  ;Calc string length\r\nLBLE7AB JSR     LBLEE56  ;Get length to B, start address to X\r\n        INCB\r\nLBLE7AF DECB             ;Dec char count\r\n        BEQ     LBLE773  ;RTS\r\n        LDAA    ,X       ;Get char\r\n        INX              ;Inc char ptr\r\n        BSR     LBLE7BE  ;A->SCN   Write char\r\n        BRA     LBLE7AF  ;Next char\r\n\r\n\r\nLBLE7B9 LDAA    #$20\r\nLBLE7BB CPX     #$863F          ;LDAA  #$3F\r\nLBLE7BE JMP     LBLF9C6  ;A->SCN\r\n\r\n\r\nTBLE7C1 FCB     $3F,$52,$45,$44,$4F,$0D,$00     ;?REDO\r\n\r\n\r\nLBLE7C8 LDAA    ram87\r\n        BEQ     LBLE7D3\r\n        LDX     ramAB\r\n        STX     ramE2\r\n        JMP     LBLEA3C  ;?SN ERROR\r\nLBLE7D3 LDX     #TBLE7C1-1\r\n        JSR     LBLE7A8\r\n        LDX     ramA9\r\n        STX     ramF4\r\nLBLE7DD RTS\r\n\r\n\r\n                ; --- INPUT command ---\r\nCMD_INPUT\r\n        LDAB    #$16     ;?ID error\r\n        LDX     ramE2\r\n        INX    \r\n        BNE     LBLE7E8\r\n        JMP     LBLE238  ;write ?ID error\r\nLBLE7E8 CMPA    #$22     ;check for \"Prompt\";\r\n        BNE     LBLE7F7\r\n        JSR     LBLEA07  ; scan string until '\"' reached.\r\n        LDAB    #$3B\r\n        JSR     LBLEA31  ;expect and skip ';'\r\n        JSR     LBLE7AB  ;write string to screen.\r\nLBLE7F7 BSR     LBLE7FF  ;\"? \" and get command line\r\n        LDAB    #$2C\r\n        STAB    ,X\r\n        BRA     LBLE810+1\r\nLBLE7FF JSR     LBLE7BB+1 ; \"?\"->SCN\r\n        JSR     LBLE7B9   ; \" \"->SCN\r\n        JSR     LBLFAA4   ; get command line\r\n        BHS     LBLE7DD  \r\n        PULX    \r\n        JMP     LBLE585  ;break pressed - abort prog\r\n\r\n                ; --- READ command ---\r\nCMD_READ\r\n        LDX     ramAD    ;DATA pointer\r\nLBLE810 LDAA    #$4F            ;CLRA [used during INPUT command]\r\n        STAA    ram87\r\n        STX     ramAF\r\nLBLE816 JSR     LBLEB1B  ; Get Var\r\n        STX     ramB5\r\n        LDX     ramF4\r\n        STX     ramA5\r\n        LDX     ramAF\r\n        LDAA    ,X\r\n        BNE     LBLE82E\r\n        LDAA    ram87\r\n        BNE     LBLE877\r\n        JSR     LBLE7BB+1\r\n        BSR     LBLE7FF\r\nLBLE82E STX     ramF4\r\n        JSRE    LBL00EB\r\n        LDAB    ram84    ;vartype flag\r\n        BEQ     LBLE853\r\n        LDX     ramF4\r\n        STAA    ram80\r\n        CMPA    #$22\r\n        BEQ     LBLE846\r\n        DEX    \r\n        LDAA    #$3A\r\n        STAA    ram80\r\n        LDAA    #$2C\r\nLBLE846 STAA    ram81\r\n        JSR     LBLED0C\r\n        JSR     LBLEF3E\r\n        JSR     LBLE6EA\r\n        BRA     LBLE859\r\nLBLE853 JSR     LBLF359\r\n        JSR     LBLF26F+1\r\nLBLE859 JSRE    LBL00F3\r\n        BEQ     LBLE865\r\n        CMPA    #$2C\r\n        BEQ     LBLE865\r\n        JMP     LBLE7C8\r\nLBLE865 LDX     ramF4\r\n        STX     ramAF\r\n        LDX     ramA5\r\n        STX     ramF4\r\n        JSRE    LBL00F3\r\n        BEQ     LBLE897\r\n        JSR     LBLEA2E+1 ; get ','\r\n        BRA     LBLE816\r\nLBLE877 STX     ramF4\r\n        JSR     LBLE656  ; ignore rest of line thru ':'\r\n        INX    \r\n        TSTA    \r\n        BNE     LBLE88F\r\n        LDAB    #$06\r\n        LDAA    ,X\r\n        ORAA    1,X\r\n        BEQ     LBLE8CE\r\n        LDD     2,X\r\n        STD     ramAB\r\n        LDAB    #$04\r\n        ABX     \r\nLBLE88F LDAA    ,X\r\n        CMPA    #$85\r\n        BNE     LBLE877\r\n        BRA     LBLE82E\r\nLBLE897 LDX     ramAF\r\n        LDAB    ram87\r\n        BEQ     LBLE8A0\r\n        JMP     LBLE563\r\nLBLE8A0 LDAA    ,X\r\n        BEQ     LBLE8AA\r\n        LDX     #LBLE8AB-1\r\n        JMP     LBLE7A8\r\nLBLE8AA RTS\r\n\r\n\r\nLBLE8AB FCB     $3F,$45,$58,$54,$52,$41,$20,$49,$47,$4E,$4F,$52,$45,$44,$0D,$00 ;?EXTRA IGNORED\r\n\r\n\r\n                ; --- NEXT command ---\r\nCMD_NEXT\r\n        BNE     LBLE8C2\r\n        LDX     #$0000\r\n        BRA     LBLE8C5\r\nLBLE8C2 JSR     LBLEB1B ;Get Var\r\nLBLE8C5 STX     ramB5\r\n        JSR     LBLE1D8\r\n        BEQ     LBLE8D0\r\n        LDAB    #$00    ;?NF error\r\nLBLE8CE BRA     LBLE917 ;write error\r\nLBLE8D0 TXS     \r\n        INX    \r\n        INX    \r\n        INX    \r\n        JSR     LBLF251 ;X->C9-E\r\n        TSX     \r\n        LDAA    $08,X\r\n        STAA    ramCE\r\n        LDX     ramB5\r\n        JSR     LBLEF7D\r\n        JSR     LBLF26F+1\r\n        TSX     \r\n        LDAB    #$09\r\n        ABX     \r\n        JSR     LBLF2D9\r\n        TSX     \r\n        SUBB    $08,X\r\n        BEQ     LBLE8FC\r\n        LDX     $0E,X\r\n        STX     ramE2\r\n        TSX     \r\n        LDX     $10,X\r\n        STX     ramF4\r\nLBLE8F9 JMP     LBLE519  ; continue executing line\r\n\r\n\r\n\r\nLBLE8FC LDAB    #$12\r\n        ABX     \r\n        TXS     \r\n        JSRE    LBL00F3\r\n        CMPA    #$2C    ; ','\r\n        BNE     LBLE8F9 ; continue executing line\r\n        JSRE    LBL00EB\r\n        BSR     LBLE8C2\r\nLBLE90C BSR     LBLE91A\r\nLBLE90E TST     $0D,X           ;SEC  E-expect numeric? F-expect string?\r\nLBLE910 ROR     ram84   ;vartype flag\r\n        BVC     LBLE8AA ;RTS\r\n        LDAB    #$18        ;?TM error\r\nLBLE917 JMP     LBLE238\r\nLBLE91A LDX     ramF4\r\n        DEX    \r\n        STX     ramF4\r\n        CLRA    \r\nLBLE920 LDAB    #$37            ;PSHB\r\n        PSHA    \r\n        LDAB    #$01\r\n        JSR     LBLE21A  ; see if 1 word fits on stack\r\n        JSR     LBLE9E5\r\n        CLR     ramB9\r\nLBLE92E JSRE    LBL00F3\r\nLBLE931 SUBA    #$AE    ; '>'  ; + - * / ^ AND OR > = <\r\n        BLO     LBLE949\r\n        CMPA    #$03    ; SGN\r\n        BHS     LBLE949\r\n        CMPA    #$01\r\n        ROLA    \r\n        EORA    ramB9\r\n        CMPA    ramB9\r\n        BLO     LBLE99B\r\n        STAA    ramB9\r\n        JSRE    LBL00EB\r\n        BRA     LBLE931\r\nLBLE949 LDAB    ramB9\r\n        BNE     LBLE978\r\n        BHS     LBLE9B5\r\n        ADDA    #$07    ; + - * / ^ AND OR > = <\r\n        BHS     LBLE9B5\r\n        ADCA    ram84   ; vartype flag\r\n        BNE     LBLE95A\r\n        JMP     LBLEE06\r\nLBLE95A ADCA    #$FF\r\n        TAB             ; B = A*3\r\n        ASLA    \r\n        ABA     \r\n        TAB     \r\n        LDX     #TBLE030\r\n        ABX     \r\nLBLE964 PULA    \r\n        CMPA    ,X\r\n        BHS     LBLE9BC\r\n        BSR     LBLE90E ;expect numeric\r\nLBLE96B PSHA    \r\n        BSR     LBLE991\r\n        LDX     ramB7\r\n        PULA    \r\n        BNE     LBLE98B\r\n        TSTA    \r\n        BEQ     LBLE9E2\r\n        BRA     LBLE9C5\r\nLBLE978 ASL     ram84\r\n        ROLB    \r\n        LDX     ramF4\r\n        DEX    \r\n        STX     ramF4\r\n        LDX     #TBLE988\r\n        STAB    ramB9\r\n        BRA     LBLE964\r\nTBLE988 FCB     $64,$EA,$AE\r\nLBLE98B CMPA    ,X\r\n        BHS     LBLE9C5\r\n        BRA     LBLE96B\r\nLBLE991 LDD     1,X\r\n        PSHB           ;push binary fp operation onto stack.\r\n        PSHA    \r\n        BSR     LBLE99E  ;push CE onto stack.\r\n        LDAB    ramB9\r\n        BRA     LBLE920+1\r\n\r\nLBLE99B JMP     LBLEA3C  ;?SN ERROR\r\n\r\nLBLE99E LDAB    ramCE  ;push C9-CE onto stack.\r\n        LDAA    ,X  \r\nLBLE9A2 PULX    \r\n        PSHB         \r\nLBLE9A4 LDAB    ramCD  ;push C9 onto stack and return.\r\n        PSHB    \r\n        LDAB    ramCC\r\n        PSHB    \r\n        LDAB    ramCB\r\n        PSHB    \r\n        LDAB    ramCA\r\n        PSHB    \r\n        LDAB    ramC9\r\n        PSHB    \r\n        JMP     ,X\r\n\r\nLBLE9B5 LDX     #$0000\r\n        PULA    \r\n        TSTA    \r\n        BEQ     LBLE9E2\r\nLBLE9BC CMPA    #$64\r\n        BEQ     LBLE9C3\r\n        JSR     LBLE90E ; expect numeric\r\nLBLE9C3 STX     ramB7\r\nLBLE9C5 PULB    \r\n        CMPA    #$5A\r\n        BEQ     LBLE9E4  ;RTS\r\n        CMPA    #$7D\r\n        BEQ     LBLE9E4  ;RTS\r\n        LSRB    \r\n        STAB    ram88\r\n        PULA    \r\n        PULB    \r\n        STD     ramD6\r\n        PULX    \r\n        STX     ramD8\r\n        PULB    \r\n        STAB    ramDA\r\n        PULB    \r\n        STAB    ramDB\r\n        EORB    ramCE\r\n        STAB    ramDC\r\nLBLE9E2 LDAB    ramC9\r\nLBLE9E4 RTS     \r\nLBLE9E5 JSR     LBL4294 ; maths command extension\r\n        CLR     ram84   ; vartype flag\r\n        BSR     LBLEA39 ; get next char\r\n        BHS     LBLE9F2 ; go if not numeric\r\nLBLE9EF JMP     LBLF359 ; get FP number\r\nLBLE9F2 JSR     LBLEB76 ; is_alpha()?\r\n        BHS     LBLEA49 ; go if alpha()\r\n        CMPA    #$2E   ; '.'\r\n        BEQ     LBLE9EF\r\n        CMPA    #$A8   ; '-'\r\n        BEQ     LBLEA41\r\n        CMPA    #$A7   ; '+'\r\n        BEQ     LBLE9E5\r\n        CMPA    #$22   ; '\"'\r\n        BNE     LBLEA0F\r\nLBLEA07 LDX     ramF4\r\n        JSR     LBLED06\r\n        JMP     LBLEF3E\r\nLBLEA0F CMPA    #$A4   ;    ? NOT\r\n        BNE     LBLEA20\r\n        LDAA    #$5A\r\n        JSR     LBLE920+1\r\n        JSR     LBLEBC7    ;get result into D\r\n        COMA               ;perform bitwise negation\r\n        COMB    \r\n        JMP     LBLECE3    ;return D\r\nLBLEA20 SUBA    #$B1       ; start of function tokens [SGN()]\r\n        BHS     LBLEA55    ;go if a function\r\nLBLEA24 BSR     LBLEA2B+1  ;otherwise, must be a parenthetical expression\r\n        JSR     LBLE91A\r\nLBLEA29 LDAB    #$29       ;           ')' expect and skip char.\r\nLBLEA2B CPX     #$C628     ;LDAB  #$28 '('\r\nLBLEA2E CPX     #$C62C     ;LDAB  #$2C ','\r\nLBLEA31 PSHX    \r\n        LDX     ramF4\r\n        CMPB    ,X\r\n        PULX    \r\n        BNE     LBLEA3C  ;?SN error\r\nLBLEA39 JMP     LBL00EB\r\nLBLEA3C LDAB    #$02     ;?SN error\r\n        JMP     LBLE238\r\nLBLEA41 LDAA    #$7D\r\n        JSR     LBLE920+1\r\n        JMP     LBLF593\r\nLBLEA49 JSR     LBLEB1B   ; :get/init var\r\n        STX     ramCC\r\n        LDAA    ram84    ;vartype flag\r\n        BNE     LBLE9E4\r\n        JMP     LBLF251  ;X->C9-E\r\nLBLEA55 TAB     \r\n        ASLB    \r\n        BSR     LBLEA39 ;get next char\r\n        PSHB    \r\n        CMPB    #$22    ;'\"'\r\n        BLO     LBLEA7F\r\n        CMPB    #$2C    ;','\r\n        BHS     LBLEA81\r\n        BSR     LBLEA2B+1         ;get '('\r\n        PULB    \r\n        CMPB    #$28     ;'('\r\n        BHS     LBLEA82\r\n        PSHB    \r\n        JSR     LBLE91A\r\n        BSR     LBLEA2E+1  ;get ','\r\n        JSR     LBLE90E+1  ;expect string\r\n        PULA    \r\n        LDX     ramCC\r\n        PSHX    \r\n        PSHA    \r\n        JSR     LBLEF0D\r\n        PULA    \r\n        PSHB    \r\n        TAB     \r\n        BRA     LBLEA82\r\nLBLEA7F BSR     LBLEA24\r\nLBLEA81 PULB    \r\nLBLEA82 LDX     #TBLE000\r\n        ABX     \r\n        LDX     ,X\r\n        JSR     ,X\r\n        JMP     LBLE90E ; expect numeric\r\nfp_OR   LDAA    #$4F    ; perform fp OR.  CLRA -- perform fp_AND.\r\n        STAA    ram82\r\n        JSR     LBLEBC7 ; get result->D\r\n        STD     ram80\r\n        JSR     LBLF28B ; copy D6->C9.  Clear DD.\r\n        JSR     LBLEBC7 ; get result->D\r\n        TST     ram82\r\n        BNE     LBLEAA7\r\n        ANDA    ram80   ; perform the AND\r\n        ANDB    ram81\r\n        BRA     LBLEAAB\r\nLBLEAA7 ORAA    ram80   ; perform the OR\r\n        ORAB    ram81\r\nLBLEAAB JMP     LBLECE3 ; return D.\r\n                                       ; probably < = > ??\r\nfp_EAAE JSR     LBLE910 ; check for ?TM and get next number\r\n        BNE     LBLEAC3\r\n        LDAA    ramDB\r\n        ORAA    #$7F\r\n        ANDA    ramD7\r\n        STAA    ramD7\r\n        LDX     #ramD6\r\n        JSR     LBLF2D9\r\n        BRA     LBLEB03\r\nLBLEAC3 CLR     ram84   ; vartype flag\r\n        DEC     ramB9\r\n        JSR     LBLEE56\r\n        STAB    ramD0\r\n        STX     ramD2\r\n        LDX     ramD9\r\n        JSR     LBLEE58\r\n        LDAA    ramD0\r\n        SBA     \r\n        BEQ     LBLEAE1\r\n        LDAA    #$01\r\n        BHS     LBLEAE1\r\n        LDAB    ramD0\r\n        NEGA    \r\nLBLEAE1 STAA    ramCE\r\n        TPA     \r\n        PSHA    \r\n        STS     ram91\r\n        SEI     \r\n        TXS     \r\n        LDX     ramD2\r\n        INCB    \r\n        DEX    \r\nLBLEAED DECB    \r\n        BNE     LBLEAF4\r\n        LDAB    ramCE\r\n        BRA     LBLEAFF\r\nLBLEAF4 PULA    \r\n        INX    \r\n        CMPA    ,X\r\n        BEQ     LBLEAED\r\n        LDAB    #$FF\r\n        BHS     LBLEAFF\r\n        NEGB    \r\nLBLEAFF LDS     ram91\r\n        PULA    \r\n        TAP     \r\nLBLEB03 ADDB    #$01\r\n        ROLB    \r\n        ANDB    ram88\r\n        BEQ     LBLEB0C\r\n        LDAB    #$FF\r\nLBLEB0C JMP     LBLF2BC\r\nLBLEB0F JSR     LBLEA2E+1  ; get ','\r\n\r\n\r\n                ; --- DIM command ---\r\nCMD_DIM\r\n        TAB     \r\n        BSR     LBLEB1F\r\n        JSRE    LBL00F3\r\n        BNE     LBLEB0F\r\n        RTS     \r\nLBLEB1B CLRB    \r\n        JSRE    LBL00F3 ;Get current char\r\nLBLEB1F STAB    ram83   ; \r\n        STAA    ramB1\r\n        JSRE    LBL00F3\r\n        BSR     LBLEB76 ;Check for A-Z\r\n        BHS     LBLEB2D\r\n        JMP     LBLEA3C ;?SN error\r\nLBLEB2D CLRB    \r\n        STAB    ram84   ; vartype flag\r\n        JSRE    LBL00EB ; get next char\r\n        BLO     LBLEB39 ; go if numeric\r\n        BSR     LBLEB76 ; check for A-Z\r\n        BLO     LBLEB43 ; go if not\r\nLBLEB39 TAB             ; B holds second char (0) if none.\r\nLBLEB3A JSRE    LBL00EB ; skip until first non-alphanumeric char\r\n        BLO     LBLEB3A ;  '\r\n        BSR     LBLEB76 ;  '\r\n        BHS     LBLEB3A ;  '\r\nLBLEB43 CMPA    #$24    ; check for $\r\n        BNE     LBLEB4F\r\n        COM     ram84   ; vartype flag FF=string 00=numeric\r\n        ADDB    #$80    ; mask second char of B if string\r\n        JSRE    LBL00EB ; get next char\r\nLBLEB4F STAB    ramB2   ; B1-B2 hold varname.\r\n        LDAB    ram86   ; 01 if in CSAVE* or CLOAD* 80 if in FOR 0 else?\r\n        DECB    \r\n        BNE     LBLEB59\r\n        JMP     LBLEC07\r\nLBLEB59 ADDA    ram86\r\n        SUBA    #$28    ;'('\r\n        BNE     LBLEB62\r\n        JMP     LBLEBDE\r\nLBLEB62 CLR     ram86\r\n        LDX     ram95   ; start of variable space\r\nLBLEB67 CPX     ram97   ; start of dim variable space\r\n        BEQ     LBLEB7F ; go if varname not found\r\n        LDD     ramB1\r\n        SUBD    ,X\r\n        BEQ     LBLEBB0 ; go if varname found\r\n        LDAB    #$07\r\n        ABX     \r\n        BRA     LBLEB67 ; try again\r\n\r\nLBLEB76 CMPA    #$41     ; 'A'\r\n        BLO     LBLEB7E\r\n        SUBA    #$5B     ; 'Z'\r\n        SUBA    #$A5     ;-'Z'\r\nLBLEB7E RTS     \r\n\r\nLBLEB7F PULX             ;Varname not found.  find caller\r\n        PSHX    \r\n        CPX     #$EA4C   ;were we called from EA49?\r\n        BNE     LBLEB8A  ;yes, insert variable\r\n        LDX     #TBLEBB7 ;[X]=0\r\n        RTS     \r\nLBLEB8A LDD     ram99    ;end of arrays  \r\n        STD     ramBD    ;\r\n        ADDD    #$0007   ;length of var\r\n        STD     ramBB    ;\r\n        LDX     ram97    ;start of arrays\r\n        STX     ramC1    ;\r\n        JSR     LBLE1FE  ;copy [C1:BD]->[bf:BB]\r\n        LDX     ramBB    ;\r\n        STX     ram99    ;bump end of arrays\r\n        LDX     ramBF    ;\r\n        STX     ram97    ;bump start of arrays\r\n        LDX     ramC1    ;get destination of variable\r\n        LDD     ramB1    ;get varname\r\n        STD     ,X       ;store varname\r\n        CLRA    \r\n        CLRB    \r\n        STD     2,X      ;initialize variable to zero\r\n        STD     4,X\r\n        STAA    6,X\r\nLBLEBB0 INX    \r\n        INX    \r\n        STX     ramB3    ;?start of array data\r\n        RTS     \r\nTBLEBB5 FCB     $90\r\n        FCB     $80\r\nTBLEBB7 FCB     $00\r\n        FCB     $00\r\n        FCB     $00\r\nLBLEBBA JSRE    LBL00EB\r\nLBLEBBD JSR     LBLE90C\r\nLBLEBC0 JSR     LBLE90E    ;expect numeric\r\n        LDAA    ramCE\r\n        BMI     LBLEC2D+1  ;?FC error\r\nLBLEBC7 JSR     LBLE90E    ;expect numeric\r\n        LDAA    ramC9\r\n        CMPA    #$90\r\n        BLO     LBLEBD8\r\n        LDX     #TBLEBB5  ; -32768.0\r\n        JSR     LBLF2D9   ; compare [X] with C9-E.\r\n        BNE     LBLEC2D+1 ;?FC error\r\nLBLEBD8 JSR     LBLF30B   ; C9-x -> integer\r\n        LDD     ramCC\r\nLBLEBDD RTS     \r\n\r\nLBLEBDE LDX     ram83 ; Array detected...\r\n        PSHX    \r\n        CLRB    \r\nLBLEBE2 PSHB    \r\n        LDX     ramB1\r\n        PSHX    \r\n        BSR     LBLEBBA\r\n        PULX    \r\n        STX     ramB1\r\n        PULB    \r\n        INCB    \r\n        STAB    ram82\r\n        PULA    \r\n        PULB    \r\n        LDX     ramCC\r\n        PSHX    \r\n        PSHB    \r\n        PSHA    \r\n        LDAB    ram82\r\n        JSRE    LBL00F3\r\n        CMPA    #$2C\r\n        BEQ     LBLEBE2\r\n        JSR     LBLEA29; get ')'\r\n        PULX    \r\n        STX     ram83\r\n        LDAB    #$FF\r\nLBLEC07 PSHB    \r\n        LDX     ram97\r\nLBLEC0A CPX     ram99\r\n        BEQ     LBLEC33 ; go if not found\r\n        LDD     ramB1   ; get varname\r\n        SUBD    ,X\r\n        BEQ     LBLEC1B ; go if found\r\n        LDD     2,X     ; get length of current var\r\n        JSR     LBLE22D ; D+X->D,X\r\n        BRA     LBLEC0A\r\nLBLEC1B LDAB    #$12    ;?DD error\r\n        PULA    \r\n        TSTA    \r\n        BEQ     LBLEBDD ; RTS - if found and 0 on stack\r\n        LDAA    ram83\r\n        BNE     LBLEC30 ;write error if in a DIM command on a previously alloc'd var.\r\n        LDAB    ram82\r\n        CMPB    4,X\r\n        BEQ     LBLEC87\r\nLBLEC2B LDAB    #$10    ;?BS error\r\nLBLEC2D CPX     #$C608          ;LDAB  #$08 ?FC error\r\nLBLEC30 JMP     LBLE238\r\nLBLEC33 PULA    \r\n        TSTA    \r\n        BEQ     LBLEC2D+1  ;?FC error\r\n        LDD     #$0005\r\n        STD     ramDE\r\n        LDD     ramB1\r\n        STD     ,X\r\n        LDAB    ram82\r\n        STAB    4,X\r\n        JSR     LBLE21A  ; see if B words fit on stack\r\n        STX     ramBB\r\nLBLEC49 LDAB    #$0B\r\n        CLRA    \r\n        TST     ram83\r\n        BEQ     LBLEC56\r\n        PULA    \r\n        PULB    \r\n        ADDD    #$0001\r\nLBLEC56 STD     5,X\r\n        BSR     LBLECB9\r\n        STD     ramDE\r\n        INX    \r\n        INX    \r\n        DEC     ram82\r\n        BNE     LBLEC49\r\n        JSR     LBLE22D ; D+X->D,X\r\n        BHS     LBLEC6B\r\n        JMP     LBLE236 ; ?OM ERROR\r\nLBLEC6B JSR     LBLE21E ; see if D bytes fit on stack\r\n        SUBD    #$0035\r\n        STD     ram99\r\n        CLRA    \r\nLBLEC74 DEX    \r\n        STAA    5,X\r\n        CPX     ram89\r\n        BNE     LBLEC74\r\n        LDX     ramBB\r\n        LDAA    ram99\r\n        SUBD    ramBB\r\n        STD     2,X\r\n        LDAA    ram83\r\n        BNE     LBLECB8\r\nLBLEC87 LDAB    4,X\r\n        STAB    ram82\r\n        CLRA    \r\n        CLRB    \r\nLBLEC8D STD     ramDE\r\n        PULA    \r\n        PULB    \r\n        STD     ramCC\r\n        PSHB    \r\n        PSHA    \r\n        SUBD    5,X\r\n        BHS     LBLECD8\r\n        LDD     ramDE\r\n        PULA    \r\n        PULB    \r\n        BEQ     LBLECA3\r\n        BSR     LBLECB9\r\n        ADDD    ramCC\r\nLBLECA3 INX    \r\n        INX    \r\n        DEC     ram82\r\n        BNE     LBLEC8D\r\n        STD     ram89\r\n        ASLD    \r\n        ASLD    \r\n        ADDD    ram89\r\n        ADDD    #$0005\r\n        JSR     LBLE22D ;D+X->D,X\r\n        STX     ramB3\r\nLBLECB8 RTS     \r\n\r\nLBLECB9 LDAA    #$10\r\n        STAA    ramBF  \r\n        LDD     5,X\r\n        STD     ram91\r\n        CLRA    \r\n        CLRB    \r\nLBLECC3 ASLD    \r\n        BLO     LBLECD8\r\n        ASL     ramDF\r\n        ROL     ramDE\r\n        BHS     LBLECD2\r\n        ADDD    ram91\r\n        BLO     LBLECD8\r\nLBLECD2 DEC     ramBF  \r\n        BNE     LBLECC3\r\n        RTS     \r\nLBLECD8 JMP     LBLEC2B\r\n\r\n                ; --- MEM function ---\r\nFNC_MEM STS     ram91\r\n        LDD     ram91\r\n        SUBD    ram99\r\n        FCB     $21             ;\"BRN CLRA\"\r\nLBLECE2 CLRA           ; return value of B.  \r\nLBLECE3 CLR     ram84  ; vartype flag = 0 (numeric)\r\n        STD     ramCA\r\n        LDAB    #$90\r\n        JMP     LBLF2C3\r\n\r\n                ; --- STR$ function ---\r\nFNC_STR JSR     LBLE90E  ; expect numeric\r\n        LDX     #TBL4334\r\n        JSR     LBLF429\r\n        PULX    \r\n        LDX     #TBL4333\r\n        BRA     LBLED06\r\n\r\nLBLECFC STX     ramC7\r\nLBLECFE BSR     LBLED5F\r\nLBLED00 STX     ramD2\r\n        STAB    ramD0\r\n        RTS\r\n\r\nLBLED05 DEX    \r\nLBLED06 LDAA    #$22\r\n        STAA    ram80  ;String term char #1\r\n        STAA    ram81  ;String term char #2 \r\nLBLED0C INX    \r\n        STX     ramDC\r\n        STX     ramD2\r\n        LDAB    #$FF\r\nLBLED13 INCB    \r\n        LDAA    ,X\r\n        BEQ     LBLED26  ;Null char term\r\n        INX    \r\n        CMPA    ram80\r\n        BEQ     LBLED21\r\n        CMPA    ram81\r\n        BNE     LBLED13\r\nLBLED21 CMPA    #$22\r\n        BEQ     LBLED26\r\n        DEX    \r\nLBLED26 STX     ramDE  ;Points to non-null, non-\" term char.\r\n        STAB    ramD0  ;stringsize->D0\r\n        PSHB    \r\n        LDD     ramDC\r\n        SUBD    #$4334  ;See if in command buffer\r\n        PULB            \r\n        BHI     LBLED3A ;Jump if in program\r\n        BSR     LBLECFC\r\n        LDX     ramDC\r\n        JSR     LBLEE3A\r\nLBLED3A LDX     ram423D ;string buff pointer\r\n        CPX     #$4250  ;end of pointer space\r\n        BNE     LBLED47\r\n        LDAB    #$1E    ;?ST error\r\nLBLED44 JMP     LBLE238\r\nLBLED47 LDAA    ramD0   ;stringsize\r\n        STAA    ,X\r\n        LDD     ramD2\r\n        STD     2,X\r\n        LDAA    #$FF\r\n        STAA    ram84   ;vartype flag\r\n        STX     ram423F ;temp str buff ptr\r\n        STX     ramCC\r\n        LDAB    #$05\r\n        ABX     \r\n        STX     ram423D ;string buff pointer\r\n        RTS\r\n\r\n\r\nLBLED5F CLR     ram85\r\nLBLED62 PSHB    \r\n        CLRA    \r\n        STD     ram89\r\n        LDD     ram9D\r\n        SUBD    ram89\r\n        SUBD    ram9B ; bottom of system stack\r\n        BLO     LBLED79\r\n        ADDD    ram9B ; bottom of system stack\r\n        STD     ram9D\r\n        LDX     ram9D\r\n        INX    \r\n        STX     ram9F\r\n        PULB    \r\n        RTS     \r\n\r\nLBLED79 LDAB    #$1A    ;?OS error\r\n        COM     ram85\r\n        BEQ     LBLED44 ;write error\r\n        BSR     LBLED85\r\n        PULB    \r\n        BRA     LBLED62\r\nLBLED85 LDX     ramA1\r\nLBLED87 STX     ram9D\r\n        CLRA    \r\n        CLRB    \r\n        STD     ramC5\r\n        LDX     ram9B ; bottom of system stack\r\n        STX     ramC1\r\n        LDX     #TBL4241\r\nLBLED94 CPX     ram423D ;string buff pointer\r\n        BEQ     LBLED9D\r\n        BSR     LBLEDCD\r\n        BRA     LBLED94\r\nLBLED9D LDX     ram95\r\nLBLED9F CPX     ram97\r\n        BEQ     LBLEDA7\r\n        BSR     LBLEDC7\r\n        BRA     LBLED9F\r\nLBLEDA7 STX     ramBB\r\nLBLEDA9 LDX     ramBB\r\nLBLEDAB CPX     ram99\r\n        BEQ     LBLEDE7\r\n        LDD     2,X\r\n        ADDD    ramBB\r\n        STD     ramBB\r\n        LDAA    1,X\r\n        BPL     LBLEDA9\r\n        LDAB    4,X\r\n        ASLB    \r\n        ADDB    #$05\r\n        ABX     \r\nLBLEDBF CPX     ramBB\r\n        BEQ     LBLEDAB\r\n        BSR     LBLEDCD\r\n        BRA     LBLEDBF\r\nLBLEDC7 LDAA    1,X\r\n        INX    \r\n        INX    \r\n        BPL     LBLEDE3\r\nLBLEDCD LDAB    ,X\r\n        BEQ     LBLEDE3\r\n        LDD     2,X\r\n        SUBD    ram9D\r\n        BHI     LBLEDE3\r\n        LDD     2,X\r\n        SUBD    ramC1\r\n        BLS     LBLEDE3\r\n        STX     ramC5\r\n        LDD     2,X\r\n        STD     ramC1\r\nLBLEDE3 LDAB    #$05\r\n        ABX     \r\nLBLEDE6 RTS     \r\nLBLEDE7 LDX     ramC5\r\n        BEQ     LBLEDE6\r\n        CLRA    \r\n        LDAB    ,X\r\n        DECB    \r\n        ADDD    ramC1\r\n        STD     ramBD\r\n        LDX     ram9D\r\n        STX     ramBB\r\n        JSR     LBLE200\r\n        LDX     ramC5\r\n        LDD     ramBF  \r\n        STD     2,X\r\n        LDX     ramBF  \r\n        DEX    \r\n        JMP     LBLED87\r\nLBLEE06 LDX     ramCC\r\n        PSHX    \r\n        JSR     LBLE9E5\r\n        JSR     LBLE90E+1 ; expect string\r\n        PULX    \r\n        STX     ramDC\r\n        LDAB    ,X\r\n        LDX     ramCC\r\n        ADDB    ,X\r\n        BHS     LBLEE1F\r\n        LDAB    #$1C    ;?LS error\r\n        JMP     LBLE238\r\nLBLEE1F JSR     LBLECFC\r\n        LDX     ramDC\r\n        LDAB    ,X\r\n        BSR     LBLEE38\r\n        LDX     ramC7\r\n        BSR     LBLEE58\r\n        BSR     LBLEE3A\r\n        LDX     ramDC\r\n        BSR     LBLEE58\r\n        JSR     LBLED3A\r\n        JMP     LBLE92E\r\nLBLEE38 LDX     2,X\r\nLBLEE3A TPA     \r\n        PSHA    \r\n        STS     ram91\r\n        SEI     \r\n        TXS     \r\n        LDX     ram9F\r\n        INCB    \r\n        BRA     LBLEE49\r\nLBLEE45 PULA    \r\n        STAA    ,X\r\n        INX    \r\nLBLEE49 DECB    \r\n        BNE     LBLEE45\r\n        STX     ram9F\r\n        LDS     ram91\r\n        PULA    \r\n        TAP     \r\n        RTS\r\n\r\n\r\nLBLEE53 JSR     LBLE90E+1 ;expect string\r\nLBLEE56 LDX     ramCC\r\nLBLEE58 LDAB    ,X\r\n        BSR     LBLEE70\r\n        BNE     LBLEE6D\r\n        LDX     7,X\r\n        DEX    \r\n        CPX     ram9D     ; next free string store\r\n        BNE     LBLEE6B\r\n        PSHB    \r\n        ADDD    ram9D\r\n        STD     ram9D\r\n        PULB    \r\nLBLEE6B INX    \r\n        RTS\r\n\r\nLBLEE6D LDX     2,X\r\n        RTS\r\n\r\nLBLEE70 CPX     ram423F ;tmp str buff ptr\r\n        BNE     LBLEE81\r\n        STX     ram423D ;string buff pointer\r\n        DEX    \r\n        DEX    \r\n        DEX    \r\n        DEX    \r\n        DEX    \r\n        STX     ram423F ;tmp str buff ptr\r\n        CLRA    \r\nLBLEE81 RTS\r\n\r\n\r\n                ; --- LEN function ---\r\nFNC_LEN\r\n        BSR     LBLEE87 ; stringlen->B\r\nLBLEE84 JMP     LBLECE2\r\nLBLEE87 BSR     LBLEE53\r\n        CLR     ram84   ; vartype flag\r\n        TSTB    \r\n        RTS\r\n\r\n\r\n                ; --- CHR$ function ---\r\nFNC_CHR\r\n        JSR     LBLEF10\r\nLBLEE91 LDAB    #$01\r\n        JSR     LBLED5F\r\n        LDAA    ramCD\r\n        JSR     LBLED00\r\n        STAA    ,X\r\nLBLEE9D INS    \r\n        INS    \r\nLBLEE9F JMP     LBLED3A\r\n\r\n                ; --- ASC function ---\r\nFNC_ASC\r\n        BSR     LBLEEA6\r\n        BRA     LBLEE84\r\nLBLEEA6 BSR     LBLEE87\r\n        BEQ     LBLEF07    ;?FC error\r\n        LDAB    ,X\r\n        RTS\r\n\r\n                ; --- LEFT$ function ---\r\nFNC_LEFT\r\n        BSR     LBLEEF2\r\n        CLRA    \r\nLBLEEB0 CMPB    ,X\r\n        BLS     LBLEEB7\r\n        LDAB    ,X\r\n        CLRA    \r\nLBLEEB7 PSHB    \r\n        PSHA    \r\n        JSR     LBLECFE\r\n        LDX     ramC7\r\n        BSR     LBLEE58\r\n        PULB    \r\n        ABX     \r\n        PULB    \r\n        JSR     LBLEE3A\r\n        BRA     LBLEE9F\r\n\r\n                ; --- RIGHT$ function ---\r\nFNC_RIGHT\r\n        BSR     LBLEEF2\r\n        LDAA    ,X\r\n        SBA     \r\n        BRA     LBLEEB0\r\n\r\n                ; --- MID$ function ---\r\nFNC_MID\r\n        LDAB    #$FF\r\n        STAB    ramCD\r\n        BSR     LBLEF19\r\n        CMPA    #$29    ;')'\r\n        BEQ     LBLEEDC\r\n        JSR     LBLEF47\r\nLBLEEDC BSR     LBLEEF2\r\n        BEQ     LBLEF07    ;?FC error\r\n        CLRB    \r\n        DECA    \r\n        CMPA    ,X\r\n        BHS     LBLEEB7\r\n        TAB     \r\n        SUBB    ,X\r\n        NEGB    \r\n        CMPB    ramCD\r\n        BLS     LBLEEB7\r\n        LDAB    ramCD\r\n        BRA     LBLEEB7\r\n        \r\nLBLEEF2 JSR     LBLEA29; get ')'\r\n        TSX     \r\n        LDD     5,X\r\n        STD     ramC7\r\n        LDD     ,X\r\n        STD     5,X\r\n        INS    \r\n        INS    \r\n        INS    \r\n        INS    \r\n        PULA    \r\n        LDX     ramC7\r\n        TAB     \r\n        RTS     \r\n\r\n\r\nLBLEF07 JMP     LBLEC2D+1  ;?FC error\r\nLBLEF0A JSRE    LBL00EB\r\n;get arg -> B\r\nLBLEF0D JSR     LBLE90C\r\nLBLEF10 JSR     LBLEBC0\r\n        LDAA    ramCC      ; err if result >255\r\n        BNE     LBLEF07    ;?FC error    \r\n        LDAB    ramCD\r\nLBLEF19 JMP     LBL00F3\r\n\r\n                ; --- VAL function ---\r\nFNC_VAL\r\n        JSR     LBLEE87\r\n        BNE     LBLEF24\r\n        JMP     LBLEFF4\r\nLBLEF24 JSR     LBLE22C\r\n        LDAA    ,X\r\n        PSHA    \r\n        CLR     ,X\r\n        LDX     ramF4\r\n        STX     ramDE\r\n        LDX     ram89\r\n        STX     ramF4\r\n        BSR     LBLEF19\r\n        JSR     LBLF359  ; get FP number\r\n        PULA    \r\n        LDX     ram8B\r\n        STAA    ,X\r\nLBLEF3E LDX     ramDE\r\n        STX     ramF4\r\n        RTS     \r\n\r\nLBLEF43 BSR     LBLEF4C\r\n        STX     ramA5\r\nLBLEF47 JSR     LBLEA2E+1 ;get ','\r\n        BRA     LBLEF0D   ;get arg into B\r\n\r\n                ; get 0-65535 into X\r\nLBLEF4C JSR     LBLE90C   ;get numeric var.\r\nLBLEF4F LDAA    ramCE\r\n        BMI     LBLEF07   ;?FC error\r\n        LDAA    ramC9\r\n        CMPA    #$90\r\n        BHI     LBLEF07   ;?FC error\r\n        JSR     LBLF30B   ;C9->integer\r\n        LDX     ramCC\r\n        RTS\r\n\r\n\r\n                ; --- PEEK function ---\r\nFNC_PEEK\r\n        BSR     LBLEF4F\r\n        LDAB    ,X\r\n        JMP     LBLECE2; return B\r\n\r\n                ; --- POKE function ---\r\nCMD_POKE\r\n        BSR     LBLEF43\r\n        LDX     ramA5\r\n        STAB    ,X\r\n        RTS     \r\n        \r\nLBLEF6D LDX     #TBLF524\r\n        BRA     LBLEF7D\r\nLBLEF72 JSR     LBLF160\r\n                           ; perform fp -\r\nfp_SUB  COM     ramCE\r\n        COM     ramDC\r\n        BRA     fp_ADD\r\n\r\nLBLEF7D JSR     LBLF160\r\n                           ; peform fp +\r\nfp_ADD  TSTB    \r\n        BNE     LBLEF86\r\n        JMP     LBLF28B ; copy D6->C9.  Clear DD.\r\nLBLEF86 LDX     #ramD6\r\nLBLEF89 TAB     \r\n        BEQ     LBLEFF9 ; RTS\r\n        SUBB    ramC9\r\n        BEQ     LBLEFFA\r\n        BMI     LBLEF9C\r\n        STAA    ramC9\r\n        LDAA    ramDB\r\n        STAA    ramCE\r\n        LDX     #ramC9\r\n        NEGB    \r\nLBLEF9C CMPB    #$F8\r\n        BLE     LBLEFFA\r\n        CLRA    \r\n        LSR     1,X\r\n        JSR     LBLF080\r\nLBLEFA6 LDAB    ramDC\r\n        BPL     LBLEFB5\r\n        COM     1,X\r\n        COM     2,X\r\n        COM     3,X\r\n        COM     4,X\r\n        COMA    \r\n        ADCA    #$00\r\nLBLEFB5 STAA    ramDD\r\n        LDAA    ramCD\r\n        ADCA    ramDA\r\n        STAA    ramCD\r\n        LDAA    ramCC\r\n        ADCA    ramD9\r\n        STAA    ramCC\r\n        LDAA    ramCB\r\n        ADCA    ramD8\r\n        STAA    ramCB\r\n        LDAA    ramCA\r\n        ADCA    ramD7\r\n        STAA    ramCA\r\n        TBA     \r\n        BPL     LBLF018+1\r\nLBLEFD2 BLO     LBLEFD6\r\n        BSR     LBLF03C ; negate C9-E\r\nLBLEFD6 CLRB    \r\nLBLEFD7 LDAA    ramCA   \r\n        BNE     LBLF00F\r\n        LDAA    ramCB   ;shift digits left by one byte\r\n        STAA    ramCA\r\n        LDAA    ramCC\r\n        STAA    ramCB\r\n        LDAA    ramCD\r\n        STAA    ramCC\r\n        LDAA    ramDD\r\n        STAA    ramCD\r\n        CLR     ramDD\r\n        ADDB    #$08\r\n        CMPB    #$28\r\n        BLT     LBLEFD7\r\nLBLEFF4 CLRA    \r\nLBLEFF5 STAA    ramC9\r\nLBLEFF7 STAA    ramCE\r\nLBLEFF9 RTS     \r\nLBLEFFA BSR     LBLF074 ;shift digits right by -B bits\r\n        CLC     \r\n        BRA     LBLEFA6\r\nLBLEFFF INCB    \r\n        ASL     ramDD\r\n        ROL     ramCD\r\n        ROL     ramCC\r\n        ROL     ramCB\r\n        ROL     ramCA\r\nLBLF00F BPL     LBLEFFF\r\n        LDAA    ramC9\r\n        SBA     \r\n        STAA    ramC9\r\n        BLS     LBLEFF4\r\nLBLF018 CPX     #$2509          ;BLO LBLF024\r\n        ASL     ramDD\r\n        LDAA    #$00\r\n        STAA    ramDD\r\n        BRA     LBLF035\r\nLBLF024 INC     ramC9   ;mul by 2\r\n        BEQ     LBLF058 ;?OV ERROR\r\n        ROR     ramCA   ;div digits by 2\r\n        ROR     ramCB\r\n        ROR     ramCC\r\n        ROR     ramCD\r\nLBLF035 BHS     LBLF03B ; leave if we don't need to round up\r\n        BSR     LBLF04B ; increment CA-CD\r\n        BEQ     LBLF024 ; adjust exponenent if we broke the bank\r\nLBLF03B RTS     \r\nLBLF03C COM     ramCE   ; negate C9-E\r\nLBLF03F COM     ramCA   ; negate C9-D\r\n        COM     ramCB\r\n        COM     ramCC\r\n        COM     ramCD\r\nLBLF04B LDX     ramCC\r\n        INX    \r\n        STX     ramCC\r\n        BNE     LBLF057\r\n        LDX     ramCA\r\n        INX    \r\n        STX     ramCA\r\nLBLF057 RTS     \r\nLBLF058 LDAB    #$0A       ;?OV error\r\n        JMP     LBLE238\r\nLBLF05D LDX     #TBL008C\r\nLBLF060 LDAA    4,X        ;shift digits right one byte.\r\n        STAA    ramDD\r\n        LDAA    3,X\r\n        STAA    4,X\r\n        LDAA    2,X\r\n        STAA    3,X\r\n        LDAA    1,X\r\n        STAA    2,X\r\n        LDAA    ramD5\r\n        STAA    1,X\r\nLBLF074 ADDB    #$08       ;if B<-8, shift digits right one byte.\r\n        BLE     LBLF060\r\n        LDAA    ramDD\r\n        SUBB    #$08\r\n        BEQ     LBLF08A\r\nLBLF07E ASR     1,X        ;if B<0 shift digits right one bit\r\nLBLF080 ROR     2,X\r\n        ROR     3,X\r\n        ROR     4,X\r\n        RORA    \r\n        INCB    \r\n        BNE     LBLF07E\r\nLBLF08A RTS\r\n\r\n\r\nTBLF08B FCB     $81,$00,$00,$00,$00  ; 1.0\r\nTBLF090 FCB     $03\r\n        FCB     $7F,$5E,$56,$CB,$79  ;0.43425594\r\n        FCB     $80,$13,$9B,$0B,$64  ;0.57658454\r\n        FCB     $80,$76,$38,$93,$16  ;0.96180076\r\n        FCB     $82,$38,$AA,$3B,$20  ;2.88539007\r\nTBLF0A5 FCB     $80,$35,$04,$F3,$34  ;SQR(0.5)\r\nTBLF0AA FCB     $81,$35,$04,$F3,$34  ;SQR(2.0)\r\nTBLF0AF FCB     $80,$80,$00,$00,$00  ;-0.5\r\nTBLF0B4 FCB     $80,$31,$72,$17,$F8  ;LOG(2.0)\r\n\r\n\r\n                ; --- LOG function ---\r\nLBLF0B9\r\nFNC_LOG\r\n        JSR     LBLF2AD ;Test C9-E\r\n        BGT     LBLF0C1\r\n        JMP     LBLEC2D+1  ;?FC error\r\nLBLF0C1 LDX     #TBLF0A5\r\n        LDAA    ramC9\r\n        SUBA    #$80\r\n        PSHA    \r\n        LDAA    #$80\r\n        STAA    ramC9\r\n        JSR     LBLEF7D\r\n        LDX     #TBLF0AA\r\n        JSR     LBLF1C5+1\r\n        LDX     #TBLF08B  ; 1.0\r\n        JSR     LBLEF72\r\n        LDX     #TBLF090\r\n        JSR     LBLF5F8\r\n        LDX     #TBLF0AF\r\n        JSR     LBLEF7D\r\n        PULB    \r\n        JSR     LBLF3E9\r\n        LDX     #TBLF0B4\r\nLBLF0EF BSR     LBLF160\r\n\r\n                ; perform fp *\r\nfp_MUL  BEQ     LBLF15F\r\n        JSR     LBLF179\r\nLBLF0F6 LDAA    #$00\r\n        STAA    TBL008D\r\n        STAA    ram8E\r\n        STAA    ram8F\r\n        STAA    ram90\r\n        LDAB    ramCD\r\n        BSR     LBLF12A\r\n        LDAB    ramDD\r\n        STAB    ram4255\r\n        LDAB    ramCC\r\n        BSR     LBLF12A\r\n        LDAB    ramDD\r\n        STAB    ram4254\r\n        LDAB    ramCB\r\n        BSR     LBLF12A\r\n        LDAB    ramDD\r\n        STAB    ram4253\r\n        LDAB    ramCA\r\n        BSR     LBLF12F\r\n        LDAB    ramDD\r\n        STAB    ram4252\r\n        JSR     LBLF248\r\n        JMP     LBLEFD6\r\nLBLF12A BNE     LBLF12F\r\n        JMP     LBLF05D\r\nLBLF12F SEC     \r\nLBLF130 LDAA    TBL008D\r\n        RORB    \r\n        BEQ     LBLF15F\r\n        BHS     LBLF14D\r\n        LDAA    ram90\r\n        ADDA    ramDA\r\n        STAA    ram90\r\n        LDAA    ram8F\r\n        ADCA    ramD9\r\n        STAA    ram8F\r\n        LDAA    ram8E\r\n        ADCA    ramD8\r\n        STAA    ram8E\r\n        LDAA    TBL008D\r\n        ADCA    ramD7\r\nLBLF14D RORA    \r\n        STAA    TBL008D\r\n        ROR     ram8E\r\n        ROR     ram8F\r\n        ROR     ram90\r\n        ROR     ramDD\r\n        CLC     \r\n        BRA     LBLF130\r\nLBLF15F RTS     \r\nLBLF160 LDD     1,X\r\n        STAA    ramDB\r\n        ORAA    #$80\r\n        STD     ramD7\r\n        LDAB    ramDB\r\n        EORB    ramCE\r\n        STAB    ramDC\r\n        LDD     3,X\r\n        STD     ramD9\r\n        LDAA    ,X\r\n        STAA    ramD6\r\n        LDAB    ramC9\r\n        RTS     \r\nLBLF179 TSTA    \r\n        BEQ     LBLF195\r\n        ADDA    ramC9\r\n        RORA    \r\n        ROLA    \r\n        BVC     LBLF195\r\n        ADDA    #$80\r\n        STAA    ramC9\r\n        BNE     LBLF18B\r\n        JMP     LBLEFF7\r\nLBLF18B LDAA    ramDC\r\n        STAA    ramCE\r\n        RTS     \r\nLBLF190 LDAA    ramCE\r\n        COMA    \r\n        BRA     LBLF197\r\nLBLF195 PULA    \r\n        PULA    \r\nLBLF197 BMI     LBLF19C\r\n        JMP     LBLEFF4\r\nLBLF19C JMP     LBLF058  ; ?OV ERROR\r\nLBLF19F JSR     LBLF29F  ; copy fp C9->D6\r\n        BEQ     LBLF1B3  ; RTS\r\n        ADDA    #$02\r\n        BLO     LBLF19C  ; ?OV ERROR\r\n        CLR     ramDC\r\n        JSR     LBLEF89\r\n        INC     ramC9\r\n        BEQ     LBLF19C  ; ?OV ERROR\r\nLBLF1B3 RTS\r\n\r\nTBLF1B4 FCB     $84,$20,$00,$00,$00  ; 10.0\r\n\r\nLBLF1B9 JSR     LBLF29F  ;copy fp C9->D6\r\n        LDX     #TBLF1B4 ;10.0\r\n        CLRB    \r\nLBLF1C0 STAB    ramDC\r\n        JSR     LBLF251 ;X->C9-E\r\nLBLF1C5 CPX     #$8D98          ;BSR LBLF160\r\n\r\n                ; perform fp /\r\nfp_DIV  BEQ     LBLF243  ; ?/0 error\r\n        NEG     ramC9\r\n        BSR     LBLF179\r\n        INC     ramC9\r\n        BEQ     LBLF19C\r\n        LDX     #TBL008D\r\n        LDAB    #$04\r\n        STAB    ram82\r\n        LDAB    #$01\r\nLBLF1DD LDAA    ramCA\r\n        CMPA    ramD7\r\n        BNE     LBLF1F6\r\n        LDAA    ramCB\r\n        CMPA    ramD8\r\n        BNE     LBLF1F6\r\n        LDAA    ramCC\r\n        CMPA    ramD9\r\n        BNE     LBLF1F6\r\n        LDAA    ramCD\r\n        CMPA    ramDA\r\n        BNE     LBLF1F6\r\n        SEC     \r\nLBLF1F6 TPA     \r\n        ROLB    \r\n        BHS     LBLF206\r\n        STAB    ,X\r\n        INX    \r\n        DEC     ram82\r\n        BMI     LBLF239\r\n        BEQ     LBLF235\r\n        LDAB    #$01\r\nLBLF206 TAP     \r\n        BLO     LBLF21B\r\nLBLF209 ASL     ramDA\r\n        ROL     ramD9\r\n        ROL     ramD8\r\n        ROL     ramD7\r\n        BLO     LBLF1F6\r\n        BMI     LBLF1DD\r\n        BRA     LBLF1F6\r\nLBLF21B LDAA    ramDA\r\n        SUBA    ramCD\r\n        STAA    ramDA\r\n        LDAA    ramD9\r\n        SBCA    ramCC\r\n        STAA    ramD9\r\n        LDAA    ramD8\r\n        SBCA    ramCB\r\n        STAA    ramD8\r\n        LDAA    ramD7\r\n        SBCA    ramCA\r\n        STAA    ramD7\r\n        BRA     LBLF209\r\nLBLF235 LDAB    #$40\r\n        BRA     LBLF206\r\nLBLF239 RORB    \r\n        RORB    \r\n        RORB    \r\n        STAB    ramDD\r\n        BSR     LBLF248\r\n        JMP     LBLEFD6\r\nLBLF243 LDAB    #$14     ;?/0 error\r\n        JMP     LBLE238\r\nLBLF248 LDX     TBL008D\r\n        STX     ramCA\r\n        LDX     ram8F\r\n        STX     ramCC\r\n        RTS     \r\nLBLF251 PSHA    \r\n        LDD     1,X\r\n        STAA    ramCE\r\n        ORAA    #$80\r\n        STD     ramCA\r\n        CLR     ramDD\r\n        LDAB    ,X\r\n        LDX     3,X\r\n        STX     ramCC\r\n        STAB    ramC9\r\n        PULA    \r\n        RTS     \r\nLBLF267 LDX     #ramBF  \r\n        BRA     LBLF272  ;FPA->X\r\nLBLF26C LDX     #TBL00BA\r\nLBLF26F CPX     #$DEB5          ;LDX ramB5\r\nLBLF272 LDAA    ramC9  ; Load floating-point ACOI storage-> X.\r\n        STAA    ,X\r\n        LDAA    ramCE\r\n        ORAA    #$7F\r\n        ANDA    ramCA\r\n        STAA    1,X\r\n        LDAA    ramCB\r\n        STAA    2,X\r\n        LDAA    ramCC\r\n        STAA    3,X\r\n        LDAA    ramCD\r\n        STAA    4,X\r\n        RTS     \r\n                ; copy D6->C9.  Clear DD.\r\nLBLF28B LDAA    ramDB\r\nLBLF28D\tSTAA    ramCE\r\n        LDX     ramD6\r\n        STX     ramC9\r\n        CLR     ramDD\r\n        LDX     ramD8\r\n        STX     ramCB\r\n        LDX     ramD9\r\n        STX     ramCC\r\n        RTS     \r\nLBLF29F LDD     ramC9\r\n        STD     ramD6\r\n        LDX     ramCB\r\n        STX     ramD8\r\n        LDX     ramCD\r\n        STX     ramDA\r\n        TSTA    \r\n        RTS     \r\nLBLF2AD LDAB    ramC9\r\n        BEQ     LBLF2B9\r\nLBLF2B1 LDAB    ramCE\r\nLBLF2B3 ROLB    \r\n        LDAB    #$FF   ; return -1 in B.\r\n        BLO     LBLF2B9\r\n        NEGB           ; return 1 in B.\r\nLBLF2B9 RTS\r\n\r\n\r\n                ; --- SGN function ---\r\nFNC_SGN\r\n        BSR     LBLF2AD  ; Test C9-E.  B = -1 0 +1\r\nLBLF2BC STAB    ramCA\r\n        CLR     ramCB\r\n        LDAB    #$88\r\nLBLF2C3 LDAA    ramCA\r\n        SUBA    #$80\r\nLBLF2C7 STAB    ramC9\r\n        LDAA    #$00\r\n        TAB     \r\n        STD     ramCC\r\n        STAA    ramDD\r\n        STAA    ramCE\r\n        JMP     LBLEFD2\r\n\r\n\r\n                ; --- ABS function ---\r\nFNC_ABS\r\n        CLR     ramCE   ; clear sign bit\r\n        RTS\r\n\r\n                ; Compare C9-E with X, returning in B\r\n                ; =1 if C>X, =-1 if C<X =0 if equal.\r\nLBLF2D9 LDAB    ,X\r\n        BEQ     LBLF2AD\r\n        LDAB    1,X\r\n        EORB    ramCE\r\n        BMI     LBLF2B1 ; go if args differ in sign\r\nLBLF2E3 LDAB    ramC9\r\n        CMPB    ,X\r\n        BNE     LBLF306\r\n        LDAB    1,X\r\n        ORAB    #$7F\r\n        ANDB    ramCA\r\n        CMPB    1,X\r\n        BNE     LBLF306\r\n        LDAB    ramCB\r\n        CMPB    2,X\r\n        BNE     LBLF306\r\n        LDAB    ramCC\r\n        CMPB    3,X\r\n        BNE     LBLF306\r\n        LDAB    ramCD\r\n        SUBB    4,X\r\n        BNE     LBLF306\r\n        RTS             ; 0->B if equal\r\nLBLF306 RORB    \r\n        EORB    ramCE\r\n        BRA     LBLF2B3\r\n\r\n                ; convert C9-x to integer (contained in CC-D)\r\nLBLF30B LDAB    ramC9  \r\n        BEQ     LBLF350\r\n        SUBB    #$A0\r\n        LDAA    ramCE  ;test sign byte\r\n        BPL     LBLF31B\r\n        COM     ramD5\r\n        JSR     LBLF03F ;negate CA-CD\r\nLBLF31B LDX     #ramC9\r\n        CMPB    #$F8\r\n        BGT     LBLF329\r\n        JSR     LBLF074 ;shift digits right by -B bits\r\n        CLR     ramD5\r\n        RTS     \r\nLBLF329 CLR     ramD5\r\n        LDAA    ramCE\r\n        ROLA    \r\n        ROR     ramCA\r\n        JMP     LBLF080 ;divide CA-CD by 2^($100-B).\r\n\r\n                ; --- INT function ---\r\nLBLF335\r\nFNC_INT\r\n        LDAB    ramC9\r\n        CMPB    #$A0\r\n        BHS     LBLF358\r\n        BSR     LBLF30B ; C9-x -> integer\r\n        STAB    ramDD\r\n        LDAA    ramCE\r\n        STAB    ramCE\r\n        SUBA    #$80\r\n        LDAA    #$A0\r\n        STAA    ramC9\r\n        LDAA    ramCD\r\n        STAA    ram80\r\n        JMP     LBLEFD2\r\n\r\n\r\nLBLF350 STAB    ramCA\r\n        STAB    ramCB\r\n        STAB    ramCC\r\n        STAB    ramCD\r\nLBLF358 RTS     \r\n\r\n\r\nLBLF359 JSR     LBL429D ;fp-acc number transfer extension\r\n        LDX     #$0000\r\n        STX     ramCE   ;clear C9\r\n        STX     ramC9\r\n        STX     ramCB\r\n        STX     ramCC\r\n        STX     ramC1   ;clear C1\r\n        STX     ramBF  \r\n        BLO     LBLF3D8 ;go if numeric\r\n        CMPA    #$2D   ; '-'\r\n        BNE     LBLF376\r\n        COM     ramCF\r\n        BRA     LBLF37A\r\nLBLF376 CMPA    #$2B   ; '+'\r\n        BNE     LBLF37F\r\nLBLF37A JSRE    LBL00EB\r\n        BLO     LBLF3D8\r\nLBLF37F CMPA    #$2E   ; '.'\r\n        BEQ     LBLF3B0\r\n        CMPA    #$45   ; 'E'\r\n        BNE     LBLF3B5\r\n        JSRE    LBL00EB\r\n        BLO     LBLF3F5\r\n        CMPA    #$A8   ; '-'\r\n        BEQ     LBLF39E\r\n        CMPA    #$2D   ; '-'\r\n        BEQ     LBLF39E\r\n        CMPA    #$A7   ; '+'\r\n        BEQ     LBLF3A1\r\n        CMPA    #$2B   ; '+'\r\n        BEQ     LBLF3A1\r\n        BRA     LBLF3A6\r\nLBLF39E COM     ramC2\r\nLBLF3A1 JSRE    LBL00EB\r\n        BLO     LBLF3F5\r\nLBLF3A6 TST     ramC2\r\n        BEQ     LBLF3B5\r\n        NEG     ramC1\r\n        BRA     LBLF3B5\r\nLBLF3B0 COM     ramC0\r\n        BNE     LBLF37A\r\nLBLF3B5 LDAA    ramC1\r\n        SUBA    ramBF  \r\n        STAA    ramC1\r\n        BEQ     LBLF3D1\r\n        BPL     LBLF3C9\r\nLBLF3BF JSR     LBLF1B9\r\n        INC     ramC1\r\n        BNE     LBLF3BF\r\n        BRA     LBLF3D1\r\nLBLF3C9 JSR     LBLF19F\r\n        DEC     ramC1\r\n        BNE     LBLF3C9\r\nLBLF3D1 LDAA    ramCF\r\n        BPL     LBLF358\r\n        JMP     LBLF593\r\nLBLF3D8 LDAB    ramBF  \r\n        SUBB    ramC0\r\n        STAB    ramBF  \r\n        PSHA    \r\n        JSR     LBLF19F\r\n        PULB    \r\n        SUBB    #$30\r\n        BSR     LBLF3E9\r\n        BRA     LBLF37A\r\nLBLF3E9 JSR     LBLF26C ;C9->BA\r\n        JSR     LBLF2BC\r\n        LDX     #TBL00BA\r\n        JMP     LBLEF7D\r\n\r\n                ;ramC1 = 10*ramC1+(A-$30).  \r\nLBLF3F5 LDAB    ramC1\r\n        ASLB    \r\n        ASLB    \r\n        ADDB    ramC1\r\n        ASLB    \r\n        SUBA    #$30\r\n        ABA     \r\n        STAA    ramC1\r\n        BRA     LBLF3A1\r\n\r\n\r\nTBLF403 FCB     $9B,$3E,$BC,$1F,$FD  ;  99999999.90625\r\nTBLF408 FCB     $9E,$6E,$6B,$27,$FD  ; 999999999.25000\r\nTBLF40D FCB     $9E,$6E,$6B,$28,$00  ;1000000000.00000\r\n\r\n\r\nLBLF412 LDX     #TBLE1B7-1; ' IN '\r\n        BSR     LBLF423\r\n        LDD     ramE2     ; line number\r\nLBLF419 STD     ramCA\r\n        LDAB    #$90\r\n        SEC     \r\n        JSR     LBLF2C7\r\n        BSR     LBLF426\r\nLBLF423 JMP     LBLE7A8\r\nLBLF426 LDX     #TBL4335\r\nLBLF429 LDAA    #$20\r\n        LDAB    ramCE\r\n        BPL     LBLF431\r\n        LDAA    #$2D\r\nLBLF431 STAA    ,X\r\n        STAA    ramCE\r\n        STX     ramDE\r\n        INX    \r\n        LDAA    #$30\r\n        LDAB    ramC9\r\n        BNE     LBLF441\r\n        JMP     LBLF51C\r\nLBLF441 CLRA    \r\n        CMPB    #$80\r\n        BHI     LBLF44E\r\n        LDX     #TBLF40D\r\n        JSR     LBLF0EF\r\n        LDAA    #$F7\r\nLBLF44E STAA    ramBF  \r\nLBLF450 LDX     #TBLF408\r\n        JSR     LBLF2E3\r\n        BGT     LBLF468\r\nLBLF458 LDX     #TBLF403\r\n        JSR     LBLF2E3\r\n        BGT     LBLF470\r\n        JSR     LBLF19F\r\n        DEC     ramBF  \r\n        BRA     LBLF458\r\nLBLF468 JSR     LBLF1B9\r\n        INC     ramBF  \r\n        BRA     LBLF450\r\nLBLF470 JSR     LBLEF6D\r\n        JSR     LBLF30B ;C9-x -> integer \r\n        LDAB    #$01\r\n        LDAA    ramBF  \r\n        ADDA    #$0A\r\n        BMI     LBLF486\r\n        CMPA    #$0B\r\n        BHS     LBLF486\r\n        DECA    \r\n        TAB     \r\n        LDAA    #$02\r\nLBLF486 DECA    \r\n        DECA    \r\n        STAA    ramC1\r\n        STAB    ramBF  \r\n        BGT     LBLF49F\r\n        LDX     ramDE\r\n        LDAA    #$2E\r\n        INX    \r\n        STAA    ,X\r\n        TSTB    \r\n        BEQ     LBLF49D\r\n        LDAA    #$30\r\n        INX    \r\n        STAA    ,X\r\nLBLF49D STX     ramDE\r\nLBLF49F LDX     #TBLF529\r\n        LDAB    #$80\r\nLBLF4A4 LDAA    ramCD\r\n        ADDA    3,X\r\n        STAA    ramCD\r\n        LDAA    ramCC\r\n        ADCA    2,X\r\n        STAA    ramCC\r\n        LDAA    ramCB\r\n        ADCA    1,X\r\n        STAA    ramCB\r\n        LDAA    ramCA\r\n        ADCA    ,X\r\n        STAA    ramCA\r\n        INCB    \r\n        RORB    \r\n        ROLB    \r\n        BVC     LBLF4A4\r\n        BHS     LBLF4C6\r\n        SUBB    #$0B\r\n        NEGB    \r\nLBLF4C6 ADDB    #$2F\r\n        INX    \r\n        INX    \r\n        INX    \r\n        INX    \r\n        STX     ramB3\r\n        LDX     ramDE\r\n        INX    \r\n        TBA     \r\n        ANDA    #$7F\r\n        STAA    ,X\r\n        DEC     ramBF  \r\n        BNE     LBLF4E0\r\n        LDAA    #$2E\r\n        INX    \r\n        STAA    ,X\r\nLBLF4E0 STX     ramDE\r\n        LDX     ramB3\r\n        COMB    \r\n        ANDB    #$80\r\n        CPX     #$F54D\r\n        BNE     LBLF4A4\r\n        LDX     ramDE\r\nLBLF4EE LDAA    ,X\r\n        DEX    \r\n        CMPA    #$30   ; '0'\r\n        BEQ     LBLF4EE\r\n        CMPA    #$2E   ; '.'\r\n        BEQ     LBLF4FA\r\n        INX    \r\nLBLF4FA LDAA    #$2B   ; '+'\r\n        LDAB    ramC1\r\n        BEQ     LBLF51E\r\n        BPL     LBLF505\r\n        LDAA    #$2D   ; '-'\r\n        NEGB    \r\nLBLF505 STAA    2,X\r\n        LDAA    #$45\r\n        STAA    1,X\r\n        LDAA    #$2F\r\nLBLF50D INCA    \r\n        SUBB    #$0A\r\n        BHS     LBLF50D\r\n        ADDB    #$3A\r\n        STAA    3,X\r\n        STAB    4,X\r\n        CLR     5,X\r\n        BRA     LBLF520\r\nLBLF51C STAA    ,X\r\nLBLF51E CLR     1,X\r\nLBLF520 LDX     #TBL4335\r\nLBLF523\tRTS\r\n\r\n\r\nTBLF524 FCB     $80,$00,$00,$00,$00     ; 0.5\r\nTBLF529 FCB     $FA,$0A,$1F,$00 ;-100,000,000\r\n        FCB     $00,$98,$96,$80 ;  10,000,000\r\n        FCB     $FF,$F0,$BD,$C0 ;  -1,000,000\r\n        FCB     $00,$01,$86,$A0 ;     100,000\r\n        FCB     $FF,$FF,$D8,$F0 ;     -10,000\r\n        FCB     $00,$00,$03,$E8 ;       1,000\r\n        FCB     $FF,$FF,$FF,$9C ;        -100\r\n        FCB     $00,$00,$00,$0A ;          10\r\n        FCB     $FF,$FF,$FF,$FF ;          -1\r\n\r\n\r\n                ; --- SQR function ---\r\nFNC_SQR\r\n        JSR     LBLF29F  ;copy fp C9->D6\r\n        LDX     #TBLF524 ;0.5\r\n        JSR     LBLF251  ;X->C9-E\r\n\r\n                ; perform fp ^\r\nfp_POW  BEQ     LBLF5C9\r\n        TSTA\r\n        BNE     LBLF565\r\n        LDAA    ramCE\r\n        BPL     LBLF562\r\n        JMP     LBLF243  ; ?/0 error\r\nLBLF562 JMP     LBLEFF5\r\nLBLF565 LDX     #TBL00C4\r\n        JSR     LBLF272  ;FPA->X\r\n        CLRB\r\n        LDAA    ramDB\r\n        BPL     LBLF580\r\n        JSR     FNC_INT  ; LBLF335\r\n        LDX     #TBL00C4\r\n        LDAA    ramDB\r\n        JSR     LBLF2E3\r\n        BNE     LBLF580\r\n        COMA\r\n        LDAB    ram80    ; TBL0080\r\nLBLF580 JSR     LBLF28D\r\n        PSHB\r\n        JSR     FNC_LOG\t ; LBLF0B9\r\n        LDX     #TBL00C4\r\n        JSR     LBLF0EF\r\n        BSR     LBLF5C9\r\n        PULA\r\n        RORA\r\n        BHS     LBLF523\r\nLBLF593 LDAA    ramC9\r\n        BEQ     LBLF59A\r\n        COM     ramCE\r\nLBLF59A RTS\r\n\r\n\r\n\r\nTBLF59B FCB     $81,$38,$AA,$3B,$29 ;1.44269504 (CF) correction factor for EXP function\r\nTBLF5A0 FCB     $07\t\t   ;eight coeff's...  tchebyshev modified taylor series coeffs for exp(x)\r\n        FCB     $71,$34,$58,$3E,$56 ;0.00002150 1/(7! * CF^7)\r\n        FCB     $74,$16,$7E,$B3,$1B ;0.00014352 1/(6! * CF^6)\r\n        FCB     $77,$2F,$EE,$E3,$85 ;0.00134226 1/(5! * CF^5)\r\n        FCB     $7A,$1D,$84,$1C,$2A ;0.00961402 1/(4! * CF^4)\r\n        FCB     $7C,$63,$59,$58,$0A ;0.05550513 1/(3! * CF^3)\r\n        FCB     $7E,$75,$FD,$E7,$C6 ;0.24022638 1/(2! * CF^2)\r\n        FCB     $80,$31,$72,$18,$10 ;0.69314719 1/(1! * CF^1)\r\n        FCB     $81,$00,$00,$00,$00 ; 1.0\r\n\r\n\r\n                ; --- EXP function ---\r\nLBLF5C9:\r\nFNC_EXP LDX     #TBLF59B\t;Get correction factor\r\n        BSR     LBLF604\t\t;Multiply FPA0 by X\r\n        JSR     LBLF26C\t\t;pack fpa0 and store in fpa3\r\n        LDAA    ramC9\t\t;get exponent of fpa0 and compare to max value\r\n        CMPA    #$88\t\t; (128)\r\n        BLO     LBLF5DA\t\t;br if fpa0 < 128\r\nLBLF5D7 JMP     LBLF190\t\t;set fpa0 = 0 or ?OV ERROR\r\nLBLF5DA JSR     FNC_INT\t\t;convert fpa0 to integer\r\n        LDAA    ram80\t\t;get least significant byte of integer\r\n        ADDA    #$81\t\t; =127?\r\n        BEQ     LBLF5D7\t\t;  ?OV ERROR\r\n        DECA    \t\t;  adds bias of 80 (since 81 used above)\r\n        PSHA    \t\t;save exponent on stack\r\n        LDX     #TBL00BA\t;point (x) to FPa3\r\n        JSR     LBLEF72\t\t;subtract fpa0 from (x)\r\n        LDX     #TBLF5A0\t;point x to coeffs\r\n        BSR     LBLF607\t\t;eval polynomial for frac part\r\n        CLR     ramDC\t\t;force mantissa to be positive\r\n        PULA    \r\n        JSR     LBLF179\t\t;calc exp of new fpa0 by adding exps of integer and frac'l parts.\r\n        RTS     \r\nLBLF5F8 STX     ramDE\r\n        JSR     LBLF26C\r\n        BSR     LBLF604\r\n        BSR     LBLF609\r\n        LDX     #TBL00BA\r\nLBLF604 JMP     LBLF0EF\r\nLBLF607 STX     ramDE\r\nLBLF609 JSR     LBLF267\r\n        LDX     ramDE\r\n        LDAB    ,X\r\n        STAB    ramCF\r\n        INX    \r\n        STX     ramDE\r\nLBLF615 BSR     LBLF604\r\n        LDX     ramDE\r\n        LDAB    #$05\r\n        ABX     \r\n        STX     ramDE\r\n        JSR     LBLEF7D\r\n        LDX     #ramBF  \r\n        DEC     ramCF\r\n        BNE     LBLF615\r\n        RTS\r\n\r\n                ; --- RND function ---\r\nFNC_RND\r\n        JSR     LBLF2AD  ; Test C9-E\r\n        BMI     LBLF650\r\n        BEQ     LBLF646\r\n        BSR     LBLF643\r\n        JSR     LBLF26C\r\n        BSR     LBLF646\r\n        LDX     #TBL00BA\r\n        BSR     LBLF604\r\n        LDX     #TBLF08B  ; 1.0\r\n        JSR     LBLEF7D\r\nLBLF643 JMP     FNC_INT\r\nLBLF646 LDX     ram4218\r\n        STX     ramCA\r\n        LDX     ram421A\r\n        STX     ramCC\r\nLBLF650 LDX     CONF682\r\n        STX     ramD7\r\n        LDX     CONF684\r\n        STX     ramD9\r\n        JSR     LBLF0F6\r\n        LDD     ram4254\r\n        ADDD    #$658B\r\n        STD     ram421A\r\n        STD     ramCC\r\n        LDD     ram4252\r\n        ADCB    #$B0\r\n        ADCA    #$05\r\n        STD     ram4218\r\n        STD     ramCA\r\n        CLR     ramCE\r\n        LDAA    #$80\r\n        STAA    ramC9\r\n        LDAA    ram8F\r\n        STAA    ramDD\r\n        JMP     LBLEFD6\r\nCONF682 FDB     $40E6\r\nCONF684 FDB     $4DAB\r\n\r\n                ; --- COS function ---\r\nFNC_COS\r\n        LDX     #TBLF6F6  ; Pi/2\r\n        JSR     LBLEF7D\r\n\r\n                ; --- SIN function ---\r\nFNC_SIN\r\n        JSR     LBLF29F     ; copy FPA0 to FPA1\r\n        LDX     #TBLF6FB    ; point X to 2*Pi\r\n        LDAB    ramDB       ; get mantissa sign of fpa1\r\n        JSR     LBLF1C0     ; divide fpa0 by X\r\n        JSR     LBLF29F     ; copy FPA0 to FPA1\r\n        JSR     FNC_INT     ; convert FPA0 to integer\r\n        CLR     ramDC       ; set result sign to positive\r\n        LDAA    ramD6       ; get exponent of fpa1\r\n        LDAB    ramC9       ; get exponent of fpa0\r\n        JSR     fp_SUB      ; subtract fpa0 from fpa1\r\n        LDX     #TBLF700    ; point X to 0.25\r\n        JSR     LBLEF72     ; subtract fpa0 from 0.25 (pi/2)\r\n        LDAA    ramCE       ; get mantissa sign of fpa0\r\n        PSHA                ;    save on stack\r\n        BPL     LBLF6BC     ; branch if mantissa positive\r\n        JSR     LBLEF6D     ; add 0.5 (pi) to fpa0\r\n        LDAA    ramCE       ; get sign of fpa0\r\n        BMI     LBLF6BF     ; branch if negative\r\n        COM     ram88       ; com if 3pi/2 > arg > pi/2  [quadrant flag]\r\nLBLF6BC JSR     LBLF593     ; toggle mantissa sign of fpa0\r\nLBLF6BF LDX     #TBLF700    ; point X to 0.25\r\n        JSR     LBLEF7D     ; add it to fpa0\r\n        PULA                ; get the old sign\r\n        TSTA                ; \r\n        BPL     LBLF6CC     ; branch if old sign was positve\r\n        JSR     LBLF593     ; toggle mantissa sign\r\nLBLF6CC LDX     #TBLF705    ; point x to table of coeff's\r\n        JMP     LBLF5F8     ; calculate polynomial value\r\n\r\n                ; --- TAN function ---\r\nFNC_TAN\r\n        JSR     LBLF26C\r\n        CLR     ram88\r\n        BSR     FNC_SIN\r\n        LDX     #TBL00C4\r\n        JSR     LBLF272  ;FPA->X\r\n        LDX     #TBL00BA\r\n        JSR     LBLF251  ;X->C9-E\r\n        CLR     ramCE\r\n        LDAA    ram88\r\n        BSR     LBLF6F3\r\n        LDX     #TBL00C4\r\n        JMP     LBLF1C5+1\r\nLBLF6F3 PSHA    \r\n        BRA     LBLF6BC\r\n\r\n\r\nTBLF6F6 FCB     $81,$49,$0F,$DA,$A2 ;  1.57079632  Pi/2\r\nTBLF6FB FCB     $83,$49,$0F,$DA,$A2 ;  6.28318531  2*Pi\r\nTBLF700 FCB     $7F,$00,$00,$00,$00 ;  0.25         1/4\r\nTBLF705 FCB     $05\r\n        FCB     $84,$E6,$1A,$2D,$1B ;-14.38139067 -(2*Pi)^11/11! should be -15.094642578 ($84,$F1,$83,$A7,$EF)\r\n        FCB     $86,$28,$07,$FB,$F8 ; 42.00779712  (2*Pi)^9 / 9! should be  42.058693944 ($86,$28,$3C,$1A,$44)\r\n        FCB     $87,$99,$68,$89,$01 ;-76.70417026 -(2*Pi)^7 / 7! should be -76.705859753 ($87,$99,$69,$66,$73)\r\n        FCB     $87,$23,$35,$DF,$E1 ; 81.60522369  (2*Pi)^5 / 5! should be  81.605249276 ($87,$23,$35,$E3,$3C)\r\n        FCB     $86,$A5,$5D,$E7,$28 ;-41.34170210 -(2*Pi)^3 / 3! should be -41.341702240 ($86,$A5,$5D,$E7,$31)\r\n        FCB     $83,$49,$0F,$DA,$A2 ;  6.28318531  (2*Pi)^1 / 1! should be   6.283185307 ($86,$49,$0F,$DA,$A2)\r\n\r\n        FCB     $A1,$54,$46,$8F,$13 ; 7122787878.0 unused?\r\n        FCB     $8F,$52,$43,$89,$CD ; 26913.76914  unused?\r\n\r\n\r\n                ; --- Reset Vector ---\r\n                ;Reset I/O\r\nLBLF72E LDAA    #$FF\r\n        STAA    ram00\r\n        LDAA    #$01\r\n        STAA    ram01\r\n        LDAA    #$01\r\n        STAA    ram03\r\n\r\n        LDAA    ramEA       ;Check for warm boot flag\r\n        CMPA    #$55\r\n        BNE     LBLF74A     ;Not warm boot\r\n        LDX     ram4221\r\n        LDAA    ,X\r\n        DECA    \r\n        BNE     LBLF74A\r\n        JMP     ,X          ;Warm boot\r\n\r\n                            ;Cold boot\r\nLBLF74A LDX     #$0080      ;Clear 6803 RAM\r\nLBLF74D CLR     ,X\r\n        INX    \r\n        CPX     #$0100\r\n        BNE     LBLF74D\r\n\r\n        LDX     #TBL41FD    ;Size and clear external RAM\r\nLBLF758 INX    \r\n        LDAA    2,X         ;Get a byte\r\n        COM     2,X         ;Complement\r\n        LDAB    2,X         ;Get the complement\r\n        CLR     2,X         ;Clear\r\n        COMA    \r\n        CBA                 ;Complement successful?\r\n        BEQ     LBLF758     ;Next...\r\n\r\n        STX     ram4250     ;Save top of RAM\r\n        STX     ramA1\r\n        STX     ram9D\r\n        LDD     ram9D\r\n        SUBD    #100        ;Reserve 100 bytes for string space\r\n        STD     ram9B       ;bottom of system stack\r\n        LDS     ram9B \r\n\r\n        LDX     #TBLF7CF    ;Init 6803 RAM\r\n        LDD     #$00EB\r\n        BSR     LBLF7AD\r\n\r\n        LDX     #TBLF7DE    ;Init external RAM\r\n        LDD     #$4200\r\n        BSR     LBLF7AD\r\n\r\n        LDAA    #$39        ;==RTS\r\n        LDX     #LBL4285    ;4285 to 42AE set to RTS\r\nLBLF78A STAA    ,X\r\n        INX    \r\n        CPX     #$42AF\r\n        BNE     LBLF78A\r\n\r\n        COM     ram42AF         ;???\r\n\r\n        LDX     #TBL4346    ;init start of prog mem.\r\n        STX     ram93\r\n\r\n        JSR     LBLE3CF     ;NEW command\r\n        JSR     LBLFBD3+1   ;Clear screen\r\n\r\n        LDX     #TBLF810-1  ;Copyright message\r\n        JSR     LBLE7A8\r\n\r\n        LDAA    #$55        ;Flag warm boot\r\n        STAA    ramEA\r\n\r\nLBLF7AA JMP     LBLE271\r\n\r\n                ;Copy block of memory from [X+1] to [D], length at [X]\r\nLBLF7AD STD     ramBF       ;Save destination\r\n        LDAB    ,X          ;Get length\r\nLBLF7B1 INX                 ;Inc start\r\n                ;Copy block of memory from [X] to [$00BF], length in B\r\nLBLF7B2 LDAA    ,X          ;Get byte\r\n        STX     ramC1       ;Save source\r\n        LDX     ramBF       ;Get dest\r\n        STAA    ,X          ;Put byte\r\n        INX                 ;Inc dest\r\n        STX     ramBF       ;Save dest\r\n        LDX     ramC1       ;Get source\r\n        DECB                ;Dec count\r\n        BNE     LBLF7B1     ;More...\r\n        RTS\r\n\r\n;DEFAULT RESET WARM-BOOT (F7C3)\r\n        NOP     \r\n        CLR     ramE8       ;turn off printing\r\n        JSR     LBLE3EE\r\n        JSR     LBLFBD3+1   ;Clear screen\r\n        BRA     LBLF7AA\r\n\r\n                                ;Copied to $00EB                \r\nTBLF7CF FCB     14          ;14 bytes to copy\r\n        INC     ramF5\r\n        BNE     LBLF7D8\r\n        INC     ramF4\r\nLBLF7D8 LDAA    >ram00\r\n        JMP     LBLE1C8\r\n\r\n                ;Copied to $4200\r\nTBLF7DE FCB     49          ;49 bytes to copy\r\n        RTI     \r\n        FCB     $00\r\n        FCB     $00\r\n        RTI     \r\n        FCB     $00\r\n        FCB     $00\r\n        RTI     \r\n        FCB     $00\r\n        FCB     $00\r\n        RTI     \r\n        FCB     $00\r\n        FCB     $00\r\n        RTI     \r\n        FCB     $00\r\n        FCB     $00\r\n        RTI     \r\n        FCB     $00\r\n        FCB     $00\r\n        RTI     \r\n        FCB     $00\r\n        FCB     $00\r\n        JMP     LBLEC2D+1  ;?FC error\r\n        FCB     $4F,$C7,$52,$59,$FF,$04,$5E,$EC,$2E,$F7,$C3,$00,$76,$00,$01,$10\r\n        FCB     $70,$84,$00,$01,$15,$1A,$0B,$00,$80\r\n        \r\n\r\nTBLF810 FCB     $4D,$49,$43,$52,$4F,$43,$4F,$4C,$4F,$52,$20,$42,$41,$53,$49,$43 ;MICROCOLOR BASIC\r\n        FCB     $20,$31,$2E,$30,$0D                                             ; 1.0\r\n        FCB     $43,$4F,$50,$59,$52,$49,$47,$48,$54,$20,$31,$39,$38,$32,$20     ;COPYRIGHT 1982\r\nTBLF834 FCB     $4D,$49,$43,$52,$4F,$53,$4F,$46,$54,$0D,$00                     ;MICROSOFT\r\n\r\n\r\n                ; --- Flash cursor ---\r\nLBLF83F DEC     ram422B         ;cursor flash delay counter\r\n        BNE     LBLF85E\r\n        LDAA    ram4282         ;cursor color\r\n        EORA    #$0F\r\n        STAA    ram4282\r\n        ORAA    #$80\r\n        LDX     ram4280\r\n        STAA    ,X\r\n        LDAB    #$16\r\n        ANDA    #$0F\r\n        BEQ     LBLF85B\r\n        LDAB    #$58    ;flash color longer than black.\r\nLBLF85B STAB    ram422B\r\n\r\nLBLF85E LDX     #$03FA\r\nLBLF861 DEX    \r\n        BNE     LBLF861\r\n        RTS\r\n\r\n\r\n                ; --- Idle loop ---\r\nLBLF865 JSR     LBL4285 ;input char command extension\r\n        PSHX    \r\n        PSHB\r\nLBLF86A BSR     LBLF83F     ;Flash cursor\r\n        BSR     LBLF883     ;Scan keyboard\r\n        BEQ     LBLF86A     ;Repeat if no key pressed\r\n        LDAB    #$60\r\n        LDX     ram4280     ;cursor address\r\n        STAB    ,X\r\n        BRA     LBLF8CB\r\n\r\n\r\nLBLF879 CLRA    \r\n        BSR     LBLF8D0\r\n        BNE     LBLF883\r\n        BSR     LBLF8E4\r\n        INCA    \r\n        BEQ     LBLF8CD\r\n\r\n                ; --- Scan keyboard ---\r\nLBLF883 JSR     LBL42A9                 ; Keyscan command extension\r\n        PSHX    \r\n        PSHB    \r\n        LDAA    #$FB      ; Port code for BREAK key.\r\n        BSR     LBLF8D0\r\n        TAB     \r\n        BEQ     LBLF892\r\n        EORB    ram423B   ; keyboard BREAK flag.\r\nLBLF892 STAA    ram423B\r\n        TSTB    \r\n        BEQ     LBLF89E\r\n        BSR     LBLF8DC   ; delay\r\n        BSR     LBLF8D2   ; still a break?\r\n        BNE     LBLF8C7+1 ; return BREAK code 03\r\nLBLF89E LDX     #TBL4230\r\n        CLRB    \r\n        DECB    \r\n        STAB    ram4239\r\nLBLF8A6 ROLB    \r\n        BHS     LBLF8C6\r\n        INC     ram4239\r\n        BSR     LBLF8E2\r\n        PSHB    \r\n        TAB     \r\n        INX    \r\n        EORA    ,X\r\n        ANDA    ,X\r\n        STAB    ,X\r\n        PULB    \r\n        TSTA    \r\n        SEC     \r\n        BEQ     LBLF8A6\r\n        PSHA    \r\n        BSR     LBLF8DC\r\n        BSR     LBLF8E4\r\n        CMPA    ,X\r\n        PULA    \r\n        BNE     LBLF8EA\r\nLBLF8C6 CLRA    \r\nLBLF8C7 CPX     #$8603          ;LDAA  #$03\r\nLBLF8CA TSTA    \r\nLBLF8CB PULB                    ;Restore clobbered registers    \r\n        PULX    \r\nLBLF8CD RTS                     ; End Scan Keyboard subroutine\r\n\r\nLBLF8CE LDAA    #$7F        ; Port code for SHIFT key\r\nLBLF8D0 STAA    ram02       ; Keyboard port i/o sequence\r\nLBLF8D2 LDAA    ram03       ; A=0x00=found\r\n        COMA                ; A=0xff=not found\r\n        ANDA    #$02\r\n        BEQ     LBLF8DB\r\n        LDAA    #$FF\r\nLBLF8DB RTS     \r\nLBLF8DC LDX     ram421D ;keyboard debounce delay\r\n        JMP     LBLF861\r\nLBLF8E2 STAB    ram02\r\nLBLF8E4 LDAA    ioBFFF\r\n        ORAA    #$C0\r\n        RTS     \r\nLBLF8EA LDAB    #$F8\r\nLBLF8EC ADDB    #$08\r\n        LSRA    \r\n        BHS     LBLF8EC\r\n        ADDB    ram4239  ; keyboard strobe store\r\n        LDAA    #$FE     ; Port code for CONTROL key\r\n        BSR     LBLF8D0\r\n        STAA    ram423A  ; keyboard control key flag\r\n        JSR     LBL42AC  ; keyboard control extension\r\n        BEQ     LBLF911\r\n        LDX     #TBLF97C\r\n        CMPB    #$20\r\n        BNE     LBLF92E\r\n        LDAA    ram4282\r\n        ADDA    #$10\r\n        STAA    ram4282\r\n        BRA     LBLF8C6\r\nLBLF911 TBA     \r\n        BEQ     LBLF918+1\r\n        CMPB    #$1A\r\n        BLS     LBLF933\r\nLBLF918 CPX     #$C61D          ;LDAB  #$1D\r\n        LDX     #TBLF956-$1D\r\n        BSR     LBLF8CE\r\n        BEQ     LBLF92E\r\n        LDX     #TBLF969-$1D\r\n        CMPB    #$20\r\n        BNE     LBLF92E\r\n        COM     ram421C\r\n        BRA     LBLF8C6\r\nLBLF92E ABX     \r\n        LDAA    ,X\r\n        BRA     LBLF8CA\r\nLBLF933 BSR     LBLF8CE\r\n        EORA    ram421C\r\n        BNE     LBLF941\r\n        LDAA    ram421C\r\n        BNE     LBLF946\r\n        ORAB    #$20\r\nLBLF941 TBA     \r\n        ORAA    #$40\r\nLBLF944 BRA     LBLF8CA\r\nLBLF946 LDX     #TBLF9AB\r\n        ABX     \r\n        LDAA    ,X\r\n        BPL     LBLF944\r\n        LDAB    ram4282\r\n        ANDB    #$70\r\n        ABA\r\n        BRA     LBLF944\r\n\r\nTBLF956 FCB     $40,$0D,$20                         ;@- \r\n        FCB     $30,$31,$32,$33,$34,$35,$36,$37     ;01234567\r\n        FCB     $38,$39,$3A,$3B,$2C,$2D,$2E,$2F     ;89:;,-./\r\n\r\nTBLF969 FCB     $13,$0D,$20                         ;-- \r\n        FCB     $00,$21,$22,$23,$24,$25,$26,$27     ;-!\"#$%&'\r\n        FCB     $28,$29,$2A,$2B,$3C,$3D,$3E,$3F     ;()*+<=>?\r\n\r\n                                                   ;Tokens\r\nTBLF97C FCB     $88,$08,$B3,$B2,$82,$9B,$90,$84     ;--------\r\n        FCB     $A3,$8A,$81,$9E,$BC,$BA,$B9,$A5     ;--------\r\n        FCB     $C7,$15,$9C,$09,$8C,$80,$B5,$5E     ;-------^\r\n        FCB     $B1,$8F,$0A,$00,$00,$00,$0D,$20     ;------- \r\n        FCB     $00,$8E,$93,$98,$97,$96,$94,$95     ;--------\r\n        FCB     $9D,$86,$89,$92,$BB,$91,$B7         ;-------\r\n\r\n                                                   ;Graphic chars\r\nTBLF9AB FCB     $B6,$89,$80,$82,$87,$8D,$86,$85     ;--------\r\n        FCB     $48,$49,$4A,$4B,$4C,$4D,$4E,$4F     ;HIJKLMNO\r\n        FCB     $50,$8F,$8C,$88,$8B,$55,$81,$8E     ;P----U--\r\n        FCB     $83,$8A,$84                         ;---\r\n\r\n\r\nLBLF9C6 JSR     LBL4288         ; --- Write char to screen ---\r\n        PSHX    \r\n        PSHB    \r\n        PSHA    \r\n        LDAB    ramE8       ;Ouput device #\r\n        BEQ     LBLFA1B     ;Video...\r\n\r\n\r\n                            ;Assume printer\r\n        TAB     \r\n        TPA     \r\n        PSHA    \r\n        SEI     \r\n        TBA     \r\nLBLF9D5 LDAB    ram03       ;Wait for handshake\r\n        ANDB    #$04\r\n        BNE     LBLF9D5\r\n        BSR     LBLFA0A     ;Idle bit\r\n        CLRB    \r\n        BSR     LBLFA0C     ;Start bit\r\n        LDAB    #$08\r\nLBLF9E2 PSHB    \r\n        CLRB    \r\n        LSRA    \r\n        ROLB    \r\n        BSR     LBLFA0C     ;Bit out\r\n        PULB    \r\n        DECB    \r\n        BNE     LBLF9E2     ;Next bit\r\n        BSR     LBLFA0A     ;Stop bit\r\n        PULA    \r\n        TAP     \r\n        PULA    \r\n        CMPA    #$0D\r\n        BEQ     LBLFA00\r\n        INC     ram422A\r\n        LDAB    ram422A\r\n        CMPB    ram4229\r\n        BLO     LBLFA07\r\nLBLFA00 CLR     ram422A\r\n        BSR     LBLFA15\r\n        BSR     LBLFA15\r\nLBLFA07 PULB    \r\n        PULX    \r\n        RTS\r\n\r\nLBLFA0A LDAB    #$01\r\nLBLFA0C STAB    ram03       ;Printer bit output\r\n        BSR     LBLFA10\r\nLBLFA10 LDX     ram4223\r\n        BRA     LBLFA18\r\nLBLFA15 LDX     ram4225\r\nLBLFA18 JMP     LBLF861\r\n\r\n; A->SCN\r\nLBLFA1B LDX     ram4280\r\n        CMPA    #$08   ; backspace\r\n        BNE     LBLFA2E\r\n        CPX     #$4000\r\n        BEQ     LBLFA77\r\n        LDAA    #$60\r\n        DEX    \r\n        STAA    ,X\r\n        BRA     LBLFA5C\r\nLBLFA2E CMPA    #$0D   ; carriage return\r\n        BNE     LBLFA46\r\n        LDX     ram4280\r\nLBLFA35 LDAA    #$60\r\n        STAA    ,X\r\n        INX    \r\n        STX     ram4280\r\n        LDAB    ram4281\r\n        BITB    #$1F\r\n        BNE     LBLFA35\r\n        BRA     LBLFA5C\r\nLBLFA46 CMPA    #$20\r\n        BLO     LBLFA77\r\n        TSTA    \r\n        BMI     LBLFA59\r\n        CMPA    #$40\r\n        BLO     LBLFA57\r\n        CMPA    #$60\r\n        BLO     LBLFA59\r\n        ANDA    #$DF\r\nLBLFA57 EORA    #$40\r\nLBLFA59 STAA    ,X\r\n        INX    \r\nLBLFA5C STX     ram4280\r\n        CPX     #$4200\r\n        BNE     LBLFA77\r\n        LDX     #$4000  ; scroll up\r\nLBLFA67 LDD     $20,X\r\n        STD     ,X\r\n        INX    \r\n        INX    \r\n        CPX     #$41E0\r\n        BNE     LBLFA67\r\n        LDAB    #$60\r\n        JSR     LBLFBD9\r\nLBLFA77 PULA    \r\n        PULB    \r\n        PULX    \r\n        RTS     \r\nLBLFA7B JSR     LBL428B   ;I/O pointer setup command extenstion\r\n        PSHX    \r\n        PSHB    \r\n        PSHA    \r\n        LDAA    ramE8   ;Get device output 0=screen, -1 printer\r\n        BEQ     LBLFA8D ;go if on screen\r\n        LDX     ram4227 ;tab field width 16/last tab zone 112\r\n        LDD     ram4229 ;printer line length max\r\n        BRA     LBLFA97\r\nLBLFA8D LDAB    ram4281 ;cursor address lsb\r\n        ANDB    #$1F\r\n        LDX     #$1010\r\n        LDAA    #$20\r\nLBLFA97 STX     ramE4 ;i/o tab and last tab field\r\n        STAB    ramE6 ;max line length msb\r\n        STAA    ramE7 ;max line length lsb\r\n        PULA    \r\n        PULB    \r\n        PULX    \r\n        RTS\r\n\r\n\r\nLBLFAA1 JSR     LBLFBD3+1       ;Clear screen\r\nLBLFAA4 JSR     LBL4291   ;build command line extension\r\nLBLFAA7 CLR     ram427F   ;last keyboard input char\r\n        LDX     #TBL42B2  ;command line buffer\r\n        LDAB    #$01\r\nLBLFAAF JSR     LBLF865   ;Cursor loop return with KEY->A\r\n        TST     ramE9     ;Punt if set. (by cmd extension?)\r\n        BNE     LBLFB04   \r\n        TST     ramE8     ;check output flag\r\n        BNE     LBLFB00   ;go if printer\r\n        TSTA    \r\n        BPL     LBLFADD\r\n        TST     ram423A   ;control key flag\r\n        BEQ     LBLFADD\r\n        JSR     LBLE4B2   ;address of token->X (save X->ram89)\r\nLBLFAC7 LDAA    ,X\r\n        INX    \r\n        PSHX    \r\n        PSHA    \r\n        ANDA    #$7F\r\n        LDX     ram89\r\n        BSR     LBLFB1A\r\n        STX     ram89\r\n        PULA    \r\n        PULX    \r\n        TSTA    \r\n        BPL     LBLFAC7\r\n        LDX     ram89\r\n        BRA     LBLFAAF\r\nLBLFADD CMPA    #$0C      ;unimplemented clearscreen key?\r\n        BEQ     LBLFAA1\r\n        CMPA    #$08      ;backspace\r\n        BNE     LBLFAED\r\n        DECB    \r\n        BEQ     LBLFAA7   ;don't go before stop\r\n        DEX    \r\n        BSR     LBLFB22   ;A->SCN\r\n        BRA     LBLFAAF\r\nLBLFAED CMPA    #$15      ;L. DEL\r\n        BNE     LBLFAFB\r\nLBLFAF1 DECB              ;keep backspacing until stop\r\n        BEQ     LBLFAA7\r\n        LDAA    #$08\r\n        JSR     LBLF9C6   ;A->SCN\r\n        BRA     LBLFAF1\r\nLBLFAFB CMPA    #$03      ;break\r\n        SEC     \r\n        BEQ     LBLFB05\r\nLBLFB00 CMPA    #$0D      ;ENTER key\r\n        BNE     LBLFB12\r\nLBLFB04 CLRA              ;clear carry flag\r\nLBLFB05 TPA     \r\n        PSHA    \r\n        JSR     LBLE766   ;#0D->SCN\r\n        CLR     ,X        ;terminate scratch\r\n        LDX     #TBL42B1  ;command line buff-1\r\n        PULA              ;carry set if BREAK'd.\r\n        TAP     \r\nLBLFB11 RTS     \r\nLBLFB12 CMPA    #$20\r\n        BLO     LBLFAAF   ;ignore any non-printing char's\r\n        BSR     LBLFB1A\r\n        BRA     LBLFAAF\r\nLBLFB1A CMPB    #$80      ;don't go more than 128 chars.\r\n        BHS     LBLFB11\r\n        STAA    ,X        ;store char into command line buffer\r\n        INX    \r\n        INCB    \r\nLBLFB22 JMP     LBLF9C6 ;A->SCN\r\n\r\n\r\n                ; --- SET command ---\r\nCMD_SET\r\n        BSR     LBLFB6A   ; get (x,y arg into memloc into X\r\n        PSHX    \r\n        JSR     LBLEF47   ; get ,c    (B holds color code )\r\n        PULX    \r\n        CMPB    #$08      \r\n        BHI     LBLFB67   ; ?FC error if color > 8\r\n        DECB    \r\n        BMI     LBLFB38   \r\n        LDAA    #$10      ; LSLB LSLB LSLB LSLB\r\n        MUL     \r\n        BRA     LBLFB40  \r\nLBLFB38 LDAB    ,X        ; Get color from screen\r\n        BPL     LBLFB3F   ; Set to zero if text encountered\r\n        ANDB    #$70\r\n        FCB     $21             ;\"BRN CLRB\"\r\nLBLFB3F CLRB\r\nLBLFB40 STAB    ram82     ; save color\r\n        BSR     LBLFBB4   ; get trailing ')'\r\n        LDAA    ,X\r\n        BMI     LBLFB49   ; make sure its graphics\r\n        CLRA              ; clear if a text char\r\nLBLFB49 ANDA    #$0F      ; ignore color bits\r\n        ORAA    ram423C   ; holds desired bit\r\n        ORAA    ram82     ; get color\r\nLBLFB50 ORAA    #$80      ; make a graphics char\r\n        STAA    ,X        ; write value to screen\r\n        RTS\r\n\r\n                ; --- RESET command ---\r\nCMD_RESET\r\n        BSR     LBLFB6A   ; get (x,y arg into memloc into X\r\n        BSR     LBLFBB4   ; get trailing ')'\r\n        CLRA    \r\n        LDAB    ,X\r\n        BPL     LBLFB50   ; clear if it's a text char\r\n        COM     ram423C\r\n        ANDB    ram423C\r\n        STAB    ,X\r\n        RTS     \r\n\r\n\r\nLBLFB67 JMP     LBLEC2D+1  ; ?FC error\r\n\r\nLBLFB6A JSR     LBLEA2B+1  ; get '('\r\nLBLFB6D JSR     LBLEF0D    ; get x position\r\n        CMPB    #$3F\r\n        BHI     LBLFB67    ; ?FC error if > 63\r\n        PSHB               ; push x on stack\r\n        JSR     LBLEF47    ; get y position\r\n        CMPB    #$1F\r\n        BHI     LBLFB67    ; ?FC error if > 31\r\n        PSHB               ; push y on stack\r\n        LSRB               ; y=y/2\r\n        LDAA    #$20\r\n        MUL     \r\n        ADDD    #$4000     ; get address of left side of screen from y\r\n        PSHB               ; push onto stack\r\n        PSHA               \r\n        TSX     \r\n        LDAB    3,X        ; take x/2 and add to left side of screen\r\n        LSRB               \r\n        PULX               \r\n        ABX     \r\n        PULA               ; now construct mask for char block and store in 423C\r\n        PULB    \r\n        ANDA    #$01\r\n        RORB    \r\n        ROLA               ; A holds 2's complement of bit pos\r\n        LDAB    #$10       ; start B with bit 4\r\nLBLFB94 LSRB               ; shift right until A is zero\r\n        DECA    \r\n        BPL     LBLFB94    \r\n        STAB    ram423C    ; done, store into 423C\r\n        RTS\r\n\r\n                ; --- POINT command ---\r\nFNC_POINT\r\n        BSR     LBLFB6D    ; get '(x,y' into X and mask into 423C\r\n        LDAB    #$FF\r\n        LDAA    ,X\r\n        BPL     LBLFBB2    ; need to return -1 if text char\r\n        ANDA    ram423C    \r\n        BEQ     LBLFBB1    ; not set, return 0\r\n        LDAB    ,X   \r\n        LSRB    \r\n        LSRB    \r\n        LSRB    \r\n        LSRB    \r\n        ANDB    #$07\r\nLBLFBB1 INCB    \r\nLBLFBB2 BSR     LBLFBB7   ; return B (sign extended)\r\nLBLFBB4 JMP     LBLEA29   ; get ')'\r\nLBLFBB7 CLRA              ; return B (sign extended)\r\n        TSTB    \r\n        BPL     LBLFBBC\r\n        COMA    \r\nLBLFBBC JMP     LBLECE3 ; return D\r\n\r\n                ; --- CLS command ---\r\nCMD_CLS\r\n        BEQ     LBLFBD3+1       ;No args - default clear\r\n        JSR     LBLEF0D         ;Get integer arg into B between 0-255.\r\n        CMPB    #$08\r\n        BHI     LBLFBE5         ;If > 8 - Clear screen and print Microsoft message\r\n        TSTB    \r\n        BEQ     LBLFBD1         ;CLS 0...\r\n        DECB    \r\n        LDAA    #$10\r\n        MUL     \r\n        ORAB    #$0F\r\nLBLFBD1 ORAB    #$80            ;0=$80, 1=$8F, 2=$9F, 3=$AF, 4=$BF, 5=$CF, 6=$DF, 7=$EF, 8=$FF\r\n\r\nLBLFBD3 CPX     #$C660          ;==LDAB  #$60 - Default clear char\r\n        LDX     #TBL4000        ;Start of video memory\r\nLBLFBD9 STX     ram4280\r\nLBLFBDC STAB    ,X              ;Set mem\r\n        INX                     ;Next\r\n        CPX     #$4200          ;Done?\r\n        BNE     LBLFBDC         ;More...\r\n        RTS\r\n\r\nLBLFBE5 BSR     LBLFBD3+1       ;Clear screen\r\n        LDX     #TBLF834-1      ;Microsoft message\r\n        JMP     LBLE7A8         ;Write string\r\n\r\n\r\n                ; --- INKEY$ function ---\r\nFNC_INKEY\r\n        LDAA    ram427F ;last keyboard input char\r\n        BNE     LBLFBF5\r\n        JSR     LBLF883\r\nLBLFBF5 CLR     ram427F\r\n        STAA    ramCD\r\n        BEQ     LBLFBFF\r\n        JMP     LBLEE91\r\nLBLFBFF STAA    ramD0\r\n        JMP     LBLEE9D\r\n\r\n\r\n                ; --- EXEC function ---        \r\nCMD_EXEC\r\n        BEQ     LBLFC0C\r\n        JSR     LBLEF4C  ; Get address to X\r\n        STX     ram421F\r\nLBLFC0C LDX     ram421F\r\n        JMP     ,X\r\n\r\n\r\n                ; --- VARPTR function ---\r\nFNC_VARPTR\r\n        LDX     ram99\r\n        PSHX    \r\n        JSR     LBLEB1B\r\n        JSR     LBLEA29 ; get ')'\r\n        STX     ram89\r\n        PULX    \r\n        LDD     ram89\r\n        CPX     ram99\r\n        BEQ     LBLFC26\r\n        JMP     LBLEC2D+1  ; ?FC error\r\nLBLFC26 JMP     LBLECE3 ; return D\r\n\r\n                ; --- PRINT @expression  ---\r\nLBLFC29 JSR     LBLEBBA\r\n        SUBD    #$01FF\r\n        BLS     LBLFC34\r\n        JMP     LBLEC2D+1  ; ?FC error\r\nLBLFC34 ADDD    #$41FF\r\n        STD     ram4280\r\n        RTS\r\n\r\n                ; --- CSAVE command ---\r\nCMD_CSAVE\r\n        LDX     ram93\r\n        STX     ram426F ; start\r\n        LDX     ram95\r\n        STX     ram4271 ; end\r\n        CLRB    \r\n        CMPA    #$A9   ; CSAVE*\r\n        BNE     LBLFC4F\r\n        JSR     LBLFDDB\r\n        LDAB    #$04\r\nLBLFC4F STAB    ram4267  ;file type flag\r\n        LDD     ram4271  ; end\r\n        SUBD    ram426F  ; start\r\n        STD     ram426C  ;LOAD address\r\n        BSR     LBLFC8B\r\n        LDX     ram426F  ; start\r\nLBLFC60 STX     ram4278  ;cass buffer address\r\n        LDAA    #$FF\r\n        STAA    ram4276  ;cass block length\r\n        LDD     ram4271\r\n        SUBD    ram4278  ;cass buffer address\r\n        BLS     LBLFC7E\r\n        TSTA    \r\n        BNE     LBLFC7A\r\n        CMPB    #$FF\r\n        BEQ     LBLFC7A\r\n        STAB    ram4276  ;cass block length\r\nLBLFC7A BSR     LBLFCC0  ;write cassette block\r\n        BRA     LBLFC60\r\nLBLFC7E NEG     ram4275  ;cass block type flag\r\n        CLR     ram4276  ;cass block length\r\n        BSR     LBLFCC0  ;write cassette block\r\nLBLFC86 LDAA    #$01\r\n        STAA    ram03\r\n        RTS\r\n\r\n\r\nLBLFC8B JSR     LBLFD29\r\n        LDX     #TBL425F ;tape filename block\r\n        STX     ram4278  ;cass buffer address\r\n        STX     ramBF  \r\n        CLR     $09,X    ;ram4268\r\n        CLR     $0A,X    ;ram4269\r\n        LDX     #TBL4257 ;skip/load filename\r\n        LDAB    #$08\r\n        JSR     LBLF7B2  ;Copy block of memory from [X] to [$00BF], length in B\r\n        CLR     ram4275  ;cass block type flag\r\n        LDAA    #$0F\r\n        STAA    ram4276  ;cass block length\r\n        BSR     LBLFCB7  ;write cassette leader\r\n        BSR     LBLFCC0  ;write cassette block\r\n        INC     ram4275  ;cass block type flag\r\n        LDX     #$0000\r\n        JSR     LBLF861\r\n\r\n\r\n                ;Write cassette leader\r\nLBLFCB7 LDX     ram422F  ; numer of $55's in leader\r\nLBLFCBA BSR     LBLFD01\r\n        DEX    \r\n        BNE     LBLFCBA\r\n        RTS\r\n\r\n\r\nLBLFCC0 NOP      ;Write cassette block\r\n        SEI     \r\n        LDAB    ram4276  ;cass block length\r\n        STAB    ram427B  ;cass load status flag\r\n        LDAA    ram4276  ;cass block length\r\n        BEQ     LBLFCD6\r\n        LDX     ram4278  ;cass buffer address\r\nLBLFCD0 ADDA    ,X\r\n        INX    \r\n        DECB    \r\n        BNE     LBLFCD0\r\nLBLFCD6 ADDA    ram4275  ;cass block type flag\r\n        STAA    ram427A  ;cass sumcheck\r\n        LDX     ram4278  ;cass buffer address\r\n        BSR     LBLFD01\r\n        LDAA    #$3C\r\n        BSR     LBLFD03\r\n        LDAA    ram4275\r\n        BSR     LBLFD03\r\n        LDAA    ram4276  ;cass block length\r\n        BSR     LBLFD03\r\n        TSTA    \r\n        BEQ     LBLFCFC\r\nLBLFCF2 LDAA    ,X\r\n        INX    \r\n        BSR     LBLFD03\r\n        DEC     ram427B  ;cass load status flag\r\n        BNE     LBLFCF2\r\nLBLFCFC LDAA    ram427A  ;cass sumcheck\r\n        BSR     LBLFD03\r\nLBLFD01 LDAA    #$55\r\n\r\n                ;Write cassette char\r\nLBLFD03 PSHX    \r\n        PSHA    \r\n        PSHA    \r\n        LDAB    #$08\r\nLBLFD08 TSX     \r\n        LSR     ,X\r\n        LDX     #$0020\r\n        BLO     LBLFD13\r\n        LDX     #$0040\r\nLBLFD13 PSHX    \r\n        LDAA    #$01\r\n        STAA    ram03\r\nLBLFD18 DEX    \r\n        BNE     LBLFD18\r\n        CLRA    \r\n        STAA    ram03\r\n        PULX    \r\nLBLFD1F DEX    \r\n        BNE     LBLFD1F\r\n        DECB    \r\n        BNE     LBLFD08\r\n        PULA    \r\n        PULA    \r\n        PULX    \r\nLBLFD28 RTS\r\n\r\n\r\nLBLFD29 BSR     LBLFD33\r\n        JSRE    LBL00F3\r\n        BEQ     LBLFD28\r\n        JMP     LBLEA3C;?SN ERROR\r\n\r\nLBLFD33 LDX     #TBL4256      ; file name length\r\n        CLR     ,X\r\n        LDAA    #$20          ; pad filename with space chars\r\nLBLFD3A INX    \r\n        STAA    ,X\r\n        CPX     #$425F    ;tape filename block\r\n        BNE     LBLFD3A\r\n        JSRE    LBL00F3      ; load input char\r\n        BEQ     LBLFD28      ; return if no filename\r\n        JSR     LBLE91A      ; evaulate arg\r\n        JSR     LBLEE53      ; get string?\r\n        STAB    TBL4256      ; length of string to filename len.\r\n        BEQ     LBLFD28 ; RTS\r\n        PSHB    \r\n        LDD     #$4257  ;skip/load filename\r\n        STD     ramBF  \r\n        PULB    \r\n        JMP     LBLF7B2  ;Copy block of memory from [X] to [$00BF], length in B\r\n\r\n                ; --- CLOAD command ---\r\nCMD_CLOAD\r\n        CMPA    #$A9                    ; CLOAD*\r\n        BNE     LBLFD63\r\n        JMP     LBLFDB1\r\nLBLFD63 CMPA    #$4D                    ; CLOADM \r\n        BNE     LBLFD6A\r\n        JMP     LBLFE06\r\nLBLFD6A CLRA           ; program data\r\n        BSR     LBLFD8F\r\n        JSR     LBLE3CF  ; NEW command status flag\r\n        COM     ram426E  ; unset new command flag\r\n        LDD     ram426C  ; LOAD address\r\n        ADDD    ram93\r\n        JSR     LBLE21E  ; see if D bytes fit on stack\r\n        LDX     ram93\r\nLBLFD7D STX     ram4278  ; cass buffer address\r\n        BSR     LBLFDD0\r\n        BPL     LBLFD7D\r\n        STX     ram95\r\n        LDX     #TBLE1BC-1 ; \"OK\"\r\n        JSR     LBLE7A8    ; Write string\r\n        JMP     LBLE2EB    ; adjust next line pointers, and return to command mode\r\n\r\nLBLFD8F PSHA           ; A: 00=program 02=machine code 04=array data\r\n        BSR     LBLFDA2\r\n        PULA    \r\n        TST     ram4274\r\n        BNE     LBLFDCF\r\n        CMPA    ram4267  ;File type flag\r\n        BEQ     LBLFDCF\r\n        LDAB    #$24     ;?FM error\r\n        JMP     LBLE238  ;write error\r\n\r\nLBLFDA2 BSR     LBLFD33\r\n        JSR     LBLFE37\r\n        BNE     LBLFDAC  ;?IO error\r\n        JMP     LBLFF4E  ;Read cassette leader\r\n\r\nLBLFDAC LDAB    #$22     ;?IO error\r\n        JMP     LBLE238\r\n;CLOAD*\r\nLBLFDB1 BSR     LBLFDDB\r\n        LDAA    #$04     ;array data\r\n        BSR     LBLFD8F\r\n        LDD     ram4271  ;end\r\n        SUBD    ram426F  ;start\r\n        SUBD    ram426C  ; LOAD address\r\n        BHS     LBLFDC5\r\n        JMP     LBLE236 ;?OM error\r\n\r\n\r\nLBLFDC5 LDX     ram426F\r\nLBLFDC8 STX     ram4278  ;cass buffer address\r\n        BSR     LBLFDD0\r\n        BPL     LBLFDC8\r\nLBLFDCF RTS\r\n\r\n\r\nLBLFDD0 JSR     LBLFEB5+1 ;disable blocklength limit, enable writing, read block->X\r\nLBLFDD3 BNE     LBLFDAC   ; ?IO error\r\n        LDAA    ram4275   ; Cass block type flag\r\n        BEQ     LBLFDAC   ; ?IO error\r\n        RTS\r\n\r\n;CSAVE*\r\nLBLFDDB JSRE    LBL00EB ;get next char\r\n        LDAB    #$01\r\n        STAB    ram86\r\n        JSR     LBLEB1B ;get init/var\r\n        CLR     ram86\r\n        JSR     LBLE90E ;expect string\r\n        LDD     2,X\r\n        JSR     LBLE22D ;D+X->D,X\r\n        STX     ram4271\r\n        LDX     ram89\r\n        LDAB    4,X\r\n        ASLB    \r\n        ADDB    #$05\r\n        ABX     \r\n        STX     ram426F\r\n        JSRE    LBL00F3\r\n        BEQ     LBLFDCF\r\n        JMP     LBLEA2E+1 ; get ','\r\n\r\n;CLOADM \r\nLBLFE06 JSRE    LBL00EB    ; Get next input char\r\n        LDAA    #$02    ; machine code\r\n        BSR     LBLFD8F\r\n        LDX     #$0000\r\n        JSRE    LBL00F3\r\n        BEQ     LBLFE1B\r\n        JSR     LBLEA2E+1 ; get ','\r\n        JSR     LBLEF4C   ; get address offset to X\r\nLBLFE1B STX     ram89\r\n        LDD     ram426A   ;EXEC address offset\r\n        ADDD    ram89\r\n        STD     ram421F   ;default EXEC address\r\n        LDD     ram426C   ;LOAD address\r\n        ADDD    ram89\r\n        PSHB    \r\n        PSHA    \r\n        PULX    \r\n        BRA     LBLFDC8\r\n\r\n                ; --- SKIPF command ---\r\nCMD_SKIPF\r\n        JSR     LBLFDA2\r\n        BSR     LBLFE8A\r\n        BNE     LBLFDD3\r\n        RTS     \r\n\r\nLBLFE37 LDAA    ramE2\r\n        INCA    \r\n        BNE     LBLFE46\r\n        JSR     LBLFBD3+1    ;Clear screen\r\n        LDAA    #$53         ;write 'S' to screen\r\n        BSR     LBLFE81\r\n        JSR     LBLE7B9\r\nLBLFE46 BSR     LBLFEAA\r\n        ORAA    ram4275  ; Cass block type flag\r\n        BNE     LBLFE80\r\n        CLRB    \r\n        PSHB    \r\nLBLFE4F LDX     #TBL425F  ;tape filename block\r\n        ABX     \r\n        LDAA    ,X\r\n        LDX     ramE2\r\n        INX    \r\n        BNE     LBLFE5C\r\n        BSR     LBLFE81\r\nLBLFE5C LDX     #TBL4257  ;skip/load filename\r\n        ABX     \r\n        SUBA    ,X\r\n        TSX     \r\n        ORAA    ,X\r\n        STAA    ,X\r\n        INCB    \r\n        CMPB    #$08\r\n        BNE     LBLFE4F\r\n        PULA    \r\n        TSTA    \r\n        BEQ     LBLFE7B\r\n        TST     TBL4256\r\n        BEQ     LBLFE7B\r\n        BSR     LBLFE87\r\n        BNE     LBLFE80\r\n        BRA     LBLFE37\r\nLBLFE7B LDAA    #$46\r\n        BSR     LBLFEA1\r\n        CLRA    \r\nLBLFE80 RTS\r\n\r\n\r\nLBLFE81 CLR     ramE8   ;turn off printer\r\n        JMP     LBLF9C6 ;A->SCN\r\n\r\nLBLFE87 JSR     LBLFF4E ;Read cassette leader\r\nLBLFE8A LDAA    #$FF    ;disable blocklength limit\r\n        TAB             ;disable writing (B=$FF)\r\n        BSR     LBLFEB9\r\n        BNE     LBLFE98\r\n        LDAA    ram4275 ;cass block type flag\r\n        NEGA    \r\n        BMI     LBLFE8A\r\n        DECA    \r\nLBLFE98 STAA    ram427B ;cass load status flag\r\n        RTS\r\n\r\n\r\nLBLFE9C LDAA    TBL4000\r\n        EORA    #$40\r\nLBLFEA1 LDAB    ramE2\r\n        INCB    \r\n        BNE     LBLFEA9\r\n        STAA    TBL4000\r\nLBLFEA9 RTS\r\n\r\n\r\nLBLFEAA JSR     LBLFF4E  ;Read cassette leader\r\n        LDX     #TBL425F ;tape filename block\r\n        STX     ram4278  ;cass buffer address\r\n        LDAA    #$0F    ;15 byte block length limit\r\nLBLFEB5 CPX     #$86FF    ;LDAA  #$FF (disable blocklength limit)\r\n        CLRB             ;enable writing\r\n\r\nLBLFEB9 PSHA     ;Read cassette block\r\n        STAB    ram4273\r\n        NOP     \r\n        SEI     \r\n        BSR     LBLFE9C\r\n        LDX     ram4278  ;cass buffer address\r\n        CLRA    \r\nLBLFEC5 BSR     LBLFF22  ;Read cassette bit\r\n        RORA    \r\n        CMPA    #$3C     ;00111100\r\n        BNE     LBLFEC5\r\n        BSR     LBLFF14   ;Read cassette char\r\n        STAA    ram4275   ;cass block type flag\r\n        BSR     LBLFF14   ;Read cassette char\r\n        STAA    ram4276   ;cass block length\r\n        PULB    \r\n        CBA     \r\n        BHI     LBLFF0A+1\r\n        ADDA    ram4275  ;cass block type flag\r\n        STAA    ram427A  ;cass sumcheck\r\n        LDAA    ram4276  ;cass block length\r\n        STAA    ram427B  ;cass load status flag\r\n        BEQ     LBLFF01\r\nLBLFEE8 BSR     LBLFF14  ;Read cassette char\r\n        TST     ram4273\r\n        BNE     LBLFEF6  ;don't write if set\r\n        STAA    ,X\r\n        CMPA    ,X\r\n        BNE     LBLFF0D+1\r\n        INX    \r\nLBLFEF6 ADDA    ram427A   ;cass sumcheck\r\n        STAA    ram427A   ;cass sumcheck\r\n        DEC     ram427B   ;cass load status flag\r\n        BNE     LBLFEE8\r\nLBLFF01 BSR     LBLFF14   ;Read cassette char\r\n        SUBA    ram427A   ;cass sumcheck\r\n        BEQ     LBLFF10\r\n        LDAA    #$01      ;     #$01 - bad sumcheck\r\nLBLFF0A CPX     #$8603    ;LDAA  #$03 - unexpected block length\r\nLBLFF0D CPX     #$8602    ;LDAA  #$02 - store failed\r\nLBLFF10 STAA    ram427B   ;cass load status flag\r\n        RTS\r\n\r\n\r\nLBLFF14 LDAA    #$08            ;Read cassette char->A\r\n        STAA    ram427C   ;cass byte load bit counter\r\nLBLFF19 BSR     LBLFF22   ;read cassette bit\r\n        RORA    \r\n        DEC     ram427C   ;cass byte load bit counter\r\n        BNE     LBLFF19\r\n        RTS\r\n\r\n\r\nLBLFF22 BSR     LBLFF2C         ;Read cassette bit->C\r\n        LDAB    ram427D   ;tone duration counter\r\n        DECB    \r\n        CMPB    ram422C   ;cassette 1200/2400Hz partition\r\n        RTS\r\n\r\n\r\nLBLFF2C CLR     ram427D  ;tone duration counter\r\n        TST     ram427E  ;cass polarity flag\r\n        BNE     LBLFF45  ;get 1->0 transition\r\n\r\n                         ;get 0->1 transition\r\nLBLFF34 BSR     LBLFF3D  ;Inc duration until 0\r\n        BNE     LBLFF34\r\nLBLFF38 BSR     LBLFF3D  ;Inc duration until 1\r\n        BEQ     LBLFF38\r\n        RTS\r\n\r\n\r\nLBLFF3D INC     ram427D  ;tone duration counter\r\n        LDAB    ram03\r\n        ANDB    #$10\r\n        RTS\r\n\r\n                       ;get 1->0 transition\r\nLBLFF45 BSR     LBLFF3D  ;Inc duration until 1\r\n        BEQ     LBLFF45\r\nLBLFF49 BSR     LBLFF3D  ;Inc duration until 0\r\n        BNE     LBLFF49\r\n        RTS\r\n\r\n\r\nLBLFF4E NOP     ;Read cassette leader\r\n        SEI     \r\n        CLR     ram427C  ;cass byte load bit counter\r\nLBLFF53 BSR     LBLFF34  ;get 0->1 xsition\r\nLBLFF55 BSR     LBLFF84  ;clear counter, count until 0, compare counter against limit\r\n        BHI     LBLFF6B\r\nLBLFF59 BSR     LBLFF7D  ;clear counter, count until 1, compare counter against limit\r\n        BLO     LBLFF6F\r\n        DEC     ram427C  ;cass byte load bit counter\r\n        LDAA    ram427C  ;cass byte load bit counter\r\n        CMPA    #$A0\r\nLBLFF65 BNE     LBLFF53\r\n        STAA    ram427E  ;cass polarity flag\r\n        RTS\r\n\r\n\r\nLBLFF6B BSR     LBLFF7D  ;clear counter, count until 1, compare counter against limit\r\n        BHI     LBLFF55\r\nLBLFF6F BSR     LBLFF84  ;clear counter, count until 0, compare counter against limit\r\n        BLO     LBLFF59\r\n        INC     ram427C  ;cass byte load bit counter\r\n        LDAA    ram427C  ;cass byte load bit counter\r\n        SUBA    #$60\r\n        BRA     LBLFF65\r\n\r\nLBLFF7D CLR     ram427D  ;tone duration counter\r\n        BSR     LBLFF38  ;incr duration until 1\r\n        BRA     LBLFF89\r\nLBLFF84 CLR     ram427D  ;tone duration counter\r\n        BSR     LBLFF49  ;incr duration until 0\r\nLBLFF89 LDAB    ram427D  ;tone duration counter\r\n        CMPB    ram422D  ;upper limit of 1200 Hz\r\n        BHI     LBLFF95\r\n        CMPB    ram422E  ;lower limit of 2400 Hz\r\n        RTS\r\n\r\n\r\nLBLFF95 CLR     ram427C  ;cass byte load bit counter\r\n        RTS\r\n\r\n\r\nLBLFF99 JSR     LBLEA2E+1 ; get ','\r\nLBLFF9C JSR     LBLEF0D   ; get num->B\r\n        TSTB    \r\n        BNE     LBLFFD1\r\n        JMP     LBLEC2D+1  ;?FC error if B=0\r\n\r\n                ; --- SOUND command ---\r\nCMD_SOUND\r\n        BSR     LBLFF9C   ;get num->B\r\n        PSHB    \r\n        BSR     LBLFF99\t  ;get ,num->B\r\n        PULA    \r\nLBLFFAB PSHA    \t  ;A=PITCH, B=DURATION\r\n        PSHB    \r\n        CLRA    \r\nLBLFFAE LDX     ram09   ;4; read counter\r\n        LDAB    ram08   ;3; read timer control and status reg [req'd to clear OCF flag] (ICF OCF TOF EICI EOCI ETOI IEDG OLVL)\r\n        STX     ram0B   ;4; store counter to output compare register\r\nLBLFFB4 EORA    #$80    ;2; toggle speaker coil output\r\n        STAA    ioBFFF  ;4;\r\n        TSX             ;3;\r\n        LDAB    1,X\t;4; get pitch\r\nLBLFFBC INX            ;3; timewaste \r\n        INX            ;3; timewaste \r\n        INCB            ;2; \r\n        BNE     LBLFFBC ;3; (11 cycles per loop)\r\n        LDAB    ram08   ;3; \r\n        ANDB    #$40    ;2; get output compare flag  \r\n        BEQ     LBLFFB4 ;3; toggle again if still clear... (freq = 1MHz/(11*(256-PITCH)+21))\r\n        TSX             ;4;\r\n        DEC     ,X      ;6; dec duration (=DURATION * 65.56ms)\r\n        BNE     LBLFFAE ;3;\r\n        CLRA    \r\n        STAA    ioBFFF\r\n        PULX    \r\nLBLFFD1 RTS\r\n\r\n\r\n        FCB     $6E,$69,$6C,$72,$65,$62,$6D,$61,$68,$43 ; nilrebmahC (spell it backwards)\r\n\r\n                ; --- User ROM routines---\r\n\r\n        FDB     LBLF883         ;Scan keyboard\r\n        FDB     LBLF9C6         ;Write char to screen\r\n        FDB     LBLFF4E         ;Read cassette leader\r\n        FDB     LBLFEB9         ;Read cassette block\r\n        FDB     LBLFCC0         ;Write cassette block\r\n        FDB     LBLFFAB         ;Sound\r\n        FDB     LBLFCB7         ;Write cassette leader\r\n        FDB     LBLECE3\t\t; return D to BASIC\r\n        FDB     LBLEBC7\t\t; get result -> D\r\n\r\n        FCB     $00,$C9\r\n\r\n                                        ; 6803 vectors\r\n        FDB     $4200\t\t;SCI   (TDRE + RDRF + ORFE)\r\n        FDB     $4203\t\t;TOF   Timer overflow interrupt\r\n        FDB     $4206\t\t;OCF   Output compare interrupt\r\n        FDB     $4209\t\t;ICF   Input capture interrupt\r\n        FDB     $420C\t\t;IRQ1  Maskable interrupt req 1.\r\n        FDB     $420F\t\t;SWI   Software interrupt\r\n        FDB     $4212\t\t;NMI   Non-maskable interrupt\r\n        FDB     LBLF72E         ;Reset\r\n\r\n        .end\r\n\r\n\r\n;        { 0xE000, VECTOR },\r\n;        { 0xE030, TABLE },\r\n;        { 0xE045, TABLE_ASCII },\r\n;        { 0xE148, VECTOR },\r\n;        { 0xE18A, TABLE_ASCII },\r\n;        { 0xE1C8, CODE },\r\n;        { 0xE7C1, TABLE_ASCII },\r\n;        { 0xE7C8, CODE },\r\n;        { 0xE8AB, TABLE_ASCII },\r\n;        { 0xE8BB, CODE },\r\n;        { 0xE988, TABLE },\r\n;        { 0xE98B, CODE },\r\n;        { 0xF08B, TABLE },\r\n;        { 0xF0B9, CODE },\r\n;        { 0xF403, TABLE },\r\n;        { 0xF412, CODE },\r\n;        { 0xF524, TABLE },\r\n;        { 0xF54D, CODE },\r\n;        { 0xF59B, TABLE },\r\n;        { 0xF5C9, CODE },\r\n;        { 0xF682, TABLE_WORD },\r\n;        { 0xF686, CODE },\r\n;        { 0xF6F6, TABLE },\r\n;        { 0xF72E, CODE },\r\n;        { 0xF7F7, TABLE },\r\n;        { 0xF810, TABLE_ASCII },\r\n;        { 0xF83F, CODE },\r\n;        { 0xF956, TABLE_ASCII },\r\n;        { 0xF9C6, CODE },\r\n;        { 0xFFD2, TABLE_ASCII },\r\n;        { 0xFFDC, VECTOR },\r\n;        { 0xFFEE, TABLE },\r\n;        { 0xFFF0, TABLE_WORD },\r\n;        { 0x10000, DISASM_END },\r\n"
  },
  {
    "path": "docs/mega65.txt",
    "content": "https://dansanderson.com/mega65/taste-the-rainbow/"
  },
  {
    "path": "docs/presentazione.md",
    "content": "# CROSS-LIB \r\nUna breve presentazione\r\n\r\n## COSA E'?\r\nCross-Lib è una libreria C e alcuni strumenti che permettono di scrivere semplici giochi per computer, consoles 8-bit e \r\naltri dispositivi vintage (calcolatrici scientifiche, board arcade, computer giocattolo, etc.).\r\nPermette di scrivere un gioco *UNA SOLA VOLTA* e poi compilarne il codice per circa 200 sistemi vintage senza bisogno di doverlo adattare manualmente.\r\nQuindi si usa come una normale libreria C che non fa altro che estendere il C con alcune funzioni per l'input, la grafica e per i suoni.\r\nI giochi scritti con Cross-Lib sono quindi scritti in C.\r\n\r\n## COMPILAZIONE\r\nCross-Lib è fatta in modo che il codice del gioco possa essere cross-compilato con più di una dozzina di cross-compilatori diversi per centinaia di sistemi diversi.\r\nIn sostanza si usano dei cross-compilatori su PC che producono i binari e eventuali immagini disco/cassetta/cartuccia direttamente da PC.\r\n\r\n## FLESSIBILITA'\r\nCross-Lib supporta pressoché qualsiasi sistema 8-bit tra quelli degli ultimi anni 60 fino a quelli dei primi anni 90. Quindi supporta sia sistemi senza alcuna grafica, senza colori e suoni (come CP/M senza schede grafiche aggiuntive), sia sistemi con grafica, colori e suoni (come il Commodore 64 e la console Sega Master System).\r\nCross-Lib fa la \"magia\" di adattare durante la compilazione il gioco alla presenza o meno di grafica, colori, suoni e adatta il gioco anche rispetto alla dimensione dello schermo di ogni sistema.\r\n\r\n## LIMITI\r\nQuesta enorme flessibilità però impone alcuni vincoli su alcuni aspetti tecnici dei giochi che si possono scrivere con Cross-Lib: \r\n- grafica a tiles,\r\n- poche tiles,\r\n- suoni limitati, \r\n- pochi colori, \r\n- velocità del gioco a volte non sempre costante,\r\n- velocità del gioco non sempre identica tra i diversi sistemi,\r\n- etc.\r\n\r\nIl risultato più evidente è che i giochi scritti con C usano poche tiles (cioè qualcosa di simile a dei caratteri ridefiniti).\r\nNonostante questi limiti è comunque possibile creare delle animazioni più fluide del semplice movimento di un carattere.\r\nI giochi attualmente possibili hanno un aspetto simile a quelli dei primi anni 80 su un Sinclair ZX Spectrum.\r\n\r\n## SVILUPPO FUTURO\r\nCross-Lib NON è un prodotto finito.\r\nIn futuro migliorerò diversi aspetti tra cui:\r\n- facilità d'uso come framework di sviluppo,\r\n- possibilità di usare un numero maggiore di tiles,\r\n- maggiore flessibilità dei suoni.\r\n\r\n\r\n"
  },
  {
    "path": "docs/presentazione.txt",
    "content": "CROSS-LIB \r\nUna breve presentazione\r\n\r\nCOSA E'?\r\nCross-Lib è una libreria C e alcuni strumenti che permettono di scrivere semplici giochi per computer, consoles 8-bit e \r\naltri dispositivi vintage (calcolatrici scientifiche, board arcade, computer giocattolo, etc.).\r\nPermette di scrivere un gioco UNA SOLA VOLTA e poi compilarlo per circa 200 sistemi vintage senza bisogno di doverlo adattare.\r\nQuindi si usa come una normale libreria C che non fa altro che estendere il C con alcune funzioni per la grafica e per i suoni.\r\nI giochi scritti con Cross-Lib sono quindi scritti in C.\r\n\r\nCOMPILAZIONE\r\nCross-Lib è fatta in modo che il codice del gioco possa essere cross-compilato con più di una dozzina di cross-compilatori diversi per centinaia di sistemi diversi.\r\nIn sostanza si usano dei cross-compilatori su PC che producono i binari e eventuali immagini disco/cassetta/cartuccia direttamente da PC.\r\n\r\nFLESSIBILITA'\r\nCross-Lib supporta pressoché qualsiasi sistema 8-bit tra quelli degli ultimi anni 60 a quelli più recente. Quindi supporta target senza alcuna grafica, colori e suoni come CP/M senza schede grafiche aggiuntive e sistemi con grafica, colori e suoni come il Commodore 64 e la Game Boy.\r\nCross-Lib fa la \"magia\" di adattare durante la compilazione il gioco alla presenza o meno di grafica, colori, suoni e dimensione dello schermo di ogni sistema.\r\n\r\nLIMITI\r\nQuesta enorme flessibilità però impone alcuni vincoli su alcuni aspetti tecnici dei giochi che si possono scrivere con Cross-Lib: \r\n- grafica a tiles, \r\n- suoni limitati, \r\n- pochi colori, \r\n- velocità del gioco a volte non sempre costante,\r\n- velocità del gioco non sempre identica tra i diversi sistemi,\r\n- etc.\r\nIl risultato è che i giochi scritti con C usano poche tiles (cioè qualcosa di simile a dei caratteri ridefiniti).\r\nNonostante questi limiti è comunque possibile creare delle animazioni più fluide del semplice movimento di un carattere.\r\nI giochi attualmente possibili hanno un aspetto simile a quelli dei primi anni 80 su un Sinclair ZX Spectrum.\r\n\r\nSVILUPPO FUTURO\r\nCross-Lib NON è un prodotto finito.\r\nIn futuro migliorerò diversi aspetti tra cui:\r\n- facilità d'uso come framework di sviluppo,\r\n- possibilità di usare un numero maggiore di tiles,\r\n- maggiore flessibilità dei suoni.\r\n\r\n\r\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "REQUIREMENTS\n\nIn order to build the binaries for all targets, you need the compilers (see README.md) and some additionals tools, such as:\n- Java\n- Python\n\n\n"
  },
  {
    "path": "docs/zzap_issue.txt",
    "content": "Are PSG sound routines on the Spectrum target suppose to work as on other A&-3-8910 targets?\r\n\r\nI am testing with the Spectrum 128 emulated by Fuse and EightyOne emulators.\r\nFuse: black screen freezze\r\nEightyOne: no freeze but the border flashes when I run the zap function\r\n\r\nI am using the following code (which works on CPC):\r\n```\r\n#include <stdio.h>\r\n#include <conio.h>\r\n#include <psg.h>\r\n#define A_PERIOD_LOW 0\r\n#define A_PERIOD_HI 1\r\n#define B_PERIOD_LOW 2\r\n#define B_PERIOD_HI 3\r\n#define C_PERIOD_LOW 4\r\n#define C_PERIOD_HI 5\r\n#define NOISE 6\r\n#define CONTROL 7\r\n#define A_VOLUME 8\r\n#define B_VOLUME 9\r\n#define C_VOLUME 10\r\n#define ENV_PERIOD_LOW 11\r\n#define ENV_PERIOD_HI 12\r\n#define ENV_WAVE 13\r\n\r\n\r\nvoid _ping_sound(uint8_t freq)\r\n{ \r\n\tuint8_t i;\r\n\t\r\n\tset_psg(A_VOLUME,15);\r\n\tset_psg(A_PERIOD_LOW,255);\r\n\t\r\n\tset_psg(A_PERIOD_HI, 15 - (freq>>4));\t\t\r\n\r\n\tset_psg(CONTROL, 0xFF - 0x01);\r\n\t\r\n\tfor(i=0;i<220;++i)\r\n\t{\r\n\t}\r\n\t\t\r\n\tset_psg(A_VOLUME,0);\r\n}\t\t\t\r\n\r\n\r\nvoid _explosion_sound(uint8_t freq)\r\n{ \r\n\tuint8_t i;\r\n\tuint8_t j;\r\n\t\r\n\tset_psg(NOISE,15);\r\n\tset_psg(A_VOLUME,15);\r\n\t\r\n\tset_psg(A_PERIOD_LOW,0);\r\n\tset_psg(A_PERIOD_HI, 15 - (freq>>4));\r\n\t\r\n\tset_psg(CONTROL, 0xFF - 0x08);\r\n\t\r\n\tfor(i=0;i<13;i++)\r\n\t{\r\n\t\tset_psg(A_VOLUME,15-i);\t\t\r\n\t\tfor(j=0;j<253;++j)\r\n\t\t{\r\n\t\t}\t\t\r\n\t}\r\n\r\n\tset_psg(A_VOLUME,0);\t\t\r\n}\r\n\r\n\r\n\r\n\r\nvoid ZAP_SOUND(void) {\r\n\tuint8_t i;\r\n\tuint8_t j;\r\n\tset_psg(A_VOLUME,15);\r\n\tset_psg(A_PERIOD_LOW,255);\r\n\tset_psg(A_PERIOD_HI, 15);\r\n\tset_psg(CONTROL, 0xFF  - 0x01);\r\n\tfor(i=0;i<16;i++) {\r\n\t\tset_psg(A_PERIOD_HI,15-i);\t\t\r\n\t\tfor(j=0;j<150;++j){}\r\n\t}\r\n\tset_psg(A_VOLUME,0);\t\t\r\n}\r\n\r\n#define PING_SOUND() _ping_sound(0xF0);\t\r\n#define TOCK_SOUND() _ping_sound(0x02);\r\n#define TICK_SOUND() _ping_sound(0x60);\r\n#define SHOOT_SOUND() _explosion_sound(0xF0);\r\n#define EXPLOSION_SOUND() _explosion_sound(0x80);\r\nint main()\r\n{\r\n    while(1) {\r\n        clrscr();\r\n        printf(\"press a key\\n\");\r\n        getch();\r\n        \r\n        clrscr();\r\n        printf(\"ping sound\");\r\n        PING_SOUND();\r\n        \r\n        getch();\r\n        clrscr();\r\n        printf(\"explosion\");\r\n        EXPLOSION_SOUND();\r\n        getch();\r\n        \r\n        clrscr();\r\n        printf(\"zzzapp!!\\n\");\r\n        ZAP_SOUND();\r\n        getch();\r\n    };\r\n    return 0;\r\n}\r\n\r\n\r\n```\r\n\r\nwhich I compile with:\r\n```\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx -lndos -create-app  -vn  $(TEST_PATH)/psg_test.c\r\n```\r\n"
  },
  {
    "path": "logs/.gitkeep",
    "content": ""
  },
  {
    "path": "roms/mame/.keepthisfile.txt",
    "content": "keep this file\n\n"
  },
  {
    "path": "roms/vice/c64/.keepthisfile.txt",
    "content": "keep this file\n\n"
  },
  {
    "path": "roms/vice/pet/.keepthisfile.txt",
    "content": "keep this file\n\n"
  },
  {
    "path": "roms/vice/plus4/.keepthisfile.txt",
    "content": "keep this file\n\n"
  },
  {
    "path": "roms/vice/vic20/.keepthisfile.txt",
    "content": "keep this file\n\n"
  },
  {
    "path": "src/Makefile_common",
    "content": "######################################################################\n# Common Makefile\n\n\nSOURCE_PATH := $(PARENT_DIR)/$(GAME_NAME)\n\n#-D_DEFAULT_ASCII\nDEFAULT_ASCII=\n\nGLOBAL_OPTS ?= $(DEFAULT_ASCII)  $(COMPILER_OPTS) $(PROJECT_OPTS) -D__FORCE_SLOWDOWN=$(SLOWDOWN)\n\n# \n#-D_BACKGROUND_COLOR=1\n\n# NCURSES ?= ncursesw\n\n#######################################################################\n# Use parameters (env variables) to modify compilation parameters\n\nSCCZ80_OPTS ?=  $(GLOBAL_OPTS) $(Z88DK_MAKEFILE_COMPILATION_OPTS)\n#-O0\n#-O3\n\nSCCZ80_ROM_OPTS ?= $(GLOBAL_OPTS) $(Z88DK_MAKEFILE_COMPILATION_OPTS)\n#-O0\n#-O3\n\nZSDCC_OPTS ?=  $(ZSDCC_MAKEFILE_COMPILATION_OPTS) $(GLOBAL_OPTS)\n# -SO2\n#-SO0\n# -SO3 --max-allocs-per-node200000\n\nZSDCC_ROM_OPTS ?= $(ZSDCC_MAKEFILE_COMPILATION_OPTS) $(GLOBAL_OPTS)\n# -SO3\n# -SO3 --max-allocs-per-node200000\n\nZ88DK_MAKE_OPTS ?= $(ZSDCC_MAKEFILE_THREADS_OPTS)\n#-j 8\n\n######################################################################\n# Cross-Shoot files\n#\n\n\nSCCZ80_OPTS ?= -O0\n\n\n# Parallel compilation for Z88DK targets\n# Z88DK_MAKE_OPTS ?= -j 8\n\n\n\n####################################################################################################################\n# COMMON INCLUDES\n\ninclude makefiles.common/auxiliary/Makefile_ALL\n\n\n\n#################################################################\n#    Grouped Targets \n\nifeq ($(DO_WIN),1)\nall: \\\n    gcc_targets \\\n    cc65_targets \\\n    cmoc_targets \\\n    lcc1802_targets \\\n    z88dk_targets\n\t\nC1541 = ../tools/generic/c1541.exe\nLCC1802_HEX=hex\nelse\nall: \\\n    gcc_targets \\\n    cc65_targets \\\n    cmoc_targets \\\n    z88dk_targets\n\t\nC1541 = c1541\nLCC1802_HEX=out\nendif\n\ngcc_targets: \\\n\tncurses  \n\n#TODO: Atari is currently broken in newest cc65 versions\n\nifeq ($(DO_WIN),1)\ncc65_targets_sequential: \\\n    apple2 \\\n    apple2enh \\\n    atari \\\n    atari_lynx \\\n    atari5200 \\\n    atari7800 \\\n    c16 \\\n    c64 \\\n    cbm510 \\\n    cbm610 \\\n    creativision \\\n    gamate \\\n    oric  \\\n    nes \\\n    pet \\\n    pce \\\n    supervision \\\n    vic20 \nelse\ncc65_targets_sequential: \\\n    apple2 \\\n    apple2enh \\\n    atari_lynx \\\n    atari5200 \\\n    atari7800 \\\n    atari \\\n    c16 \\\n    c64 \\\n    cbm510 \\\n    cbm610 \\\n    creativision \\\n    gamate \\\n    oric  \\\n    nes \\\n    pet \\\n    pce \\\n    supervision \\\n    vic20 \nendif\n\n\ncc65_targets:\n\t$(MAKE) $(Z88DK_MAKE_OPTS) cc65_targets_sequential -f ./$(PARENT_DIR)/$(GAME_NAME)/Makefile.$(GAME_NAME)\n\n\n\ncmoc_targets: \\\n    mo5_targets \\\n    to7_targets \\\n    coco_targets\n\nifeq ($(DO_WIN),1)\nz88dk_targets_sequential: \\\n    ace \\\n    agon \\\n    aquarius \\\n    cpc \\\n    c128_z80_40col \\\n    camputers_lynx \\\n    coleco \\\n    cpm \\\n    gb \\\n    laser500 \\\n    mc1000 \\\n    bee \\\n    m5 \\\n    msx \\\n    mtx500 \\\n    mtx512 \\\n    mz \\\n    pc88 \\\n    samcoupe \\\n    sc3000 \\\n    sc3000_rom \\\n    sg1000 \\\n    spectrum \\\n    vg5k \\\n    vz200 \\\n    zx81_wrx \\\n    zx81_8x6_wrx128 \\\n    zx81 \\\n    gg \\\n    sms\nelse\nz88dk_targets_sequential: \\\n    aquarius \\\n    ace \\\n    agon \\\n    camputers_lynx \\\n    coleco \\\n    cpc \\\n    cpm \\\n    gb \\\n    laser500 \\\n    mc1000 \\\n    bee \\\n    m5 \\\n    msx \\\n    mtx500 \\\n    mtx512 \\\n    mz \\\n    pc88 \\\n    samcoupe \\\n    sc3000 \\\n    sc3000_rom \\\n    sg1000 \\\n    spectrum \\\n    vg5k \\\n    vz200 \\\n    zx81_wrx \\\n    zx81_8x6_wrx128 \\\n    zx81 \\\n    gg \\\n    sms\nendif\n\n\nz88dk_targets:\n\t$(MAKE) $(Z88DK_MAKE_OPTS) z88dk_targets_sequential -f ./$(PARENT_DIR)/$(GAME_NAME)/Makefile.$(GAME_NAME)\n\n\n_lcc1802_6x9_targets: \\\n    _comx \\\n    _pecom \\\n    _micro\n\nlcc1802_6x9_targets: \\\n    _lcc1802_6x9_targets \\\n    clean_combo_files\n\n_lcc1802_6x8_targets: \\\n    _comx_ntsc\n\nlcc1802_6x8_targets: \\\n    _lcc1802_6x8_targets \\\n    clean_combo_files\n    \n_lcc1802_ascii_targets: \\\n    _tmc600\n\nlcc1802_ascii_targets: \\\n    _lcc1802_ascii_targets \\\n    clean_combo_files\n\nlcc1802_targets: \\\n    _lcc1802_6x9_targets \\\n    _lcc1802_ascii_targets \\\n    clean_combo_files\n\n\n\n#################################################################\n# CC65\n\n#################################################################\n\nCC65_OPTS = $(GLOBAL_OPTS) $(CC65_MAKEFILE_COMPILATION_OPTS)\n\napple2: apple2_hgr\n\napple2_hgr: $(ASSETS_PATH)/7x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t apple2 \\\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\n\t-D__ALT_SLEEP  $(APPLE2_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_APPLE2_HGR_SLOWDOWN) -DXSize=20 -DYSize=24 \\\n\t-D__ALT_PRINT  \\\n\t-D__APPLE2_HGR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t--code-name LOWCODE \\\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\n\t-o $(BUILD_PATH)/aschase.bin\nifdef USE_TOOLS\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/aschase.bin\n\trm -rf $(BUILD_PATH)/aschase.bin\nelse\n\tmv $(BUILD_PATH)/aschase.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\n\nAGAT_GFX_OPTS         ?= -D__BIT_MAPPED_GRAPHICS -D__BIT_MAPPED_16_GRAPHICS -D_XL_NO_SMALL_LETTERS\n\nagat: $(ASSETS_PATH)/cc65_agat.s \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t agat \\\n\t-D__AGAT__ -D_XL_NO_JOYSTICK -D_XL_JCUKEN_KEYBOARD -D__ALT_SLEEP -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGAT_SLOWDOWN) -DXSize=16 -DYSize=16 \\\n\t$(AGAT_GFX_OPTS) \\\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\n\t$(FULL_FILES) $(ASSETS_PATH)/cc65_agat.s \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/agat/agat_init_graphics.c \\\n\t-o $(BUILD_PATH)/$@.bin\nifdef USE_TOOLS\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk xl < $(BUILD_PATH)/$@.bin\n\trm -rf $(BUILD_PATH)/$@.bin\nelse\n\tmv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\nagat_ijkl: $(ASSETS_PATH)/cc65_agat.s \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t agat \\\n\t-D__AGAT__ -D_XL_NO_JOYSTICK -D__ALT_SLEEP -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGAT_SLOWDOWN) -DXSize=16 -DYSize=16 \\\n\t$(AGAT_GFX_OPTS) \\\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\n\t$(FULL_FILES) $(ASSETS_PATH)/cc65_agat.s \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/agat/agat_init_graphics.c \\\n\t-o $(BUILD_PATH)/$@.bin\nifdef USE_TOOLS\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk xl < $(BUILD_PATH)/$@.bin\n\trm -rf $(BUILD_PATH)/$@.bin\nelse\n\tmv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\n# TODO: does it work?\nagat_cursors: $(ASSETS_PATH)/cc65_agat.s \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t agat \\\n\t-D__AGAT__ -D_XL_NO_JOYSTICK -D_XL_ARROW_KEYS -D__ALT_SLEEP -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGAT_SLOWDOWN) -DXSize=16 -DYSize=16 \\\n\t$(AGAT_GFX_OPTS) \\\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\n\t$(FULL_FILES) $(ASSETS_PATH)/cc65_agat.s \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/agat/agat_init_graphics.c \\\n\t-o $(BUILD_PATH)/$@.bin\nifdef USE_TOOLS\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk xl < $(BUILD_PATH)/$@.bin\n\trm -rf $(BUILD_PATH)/$@.bin\nelse\n\tmv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\n#################################################################\n\n\n\napple2enh: apple2enh_hgr\n\napple2enh_hgr: $(ASSETS_PATH)/7x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t apple2 \\\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\n\t -D__ALT_SLEEP  $(APPLE2_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_APPLE2ENH_HGR_SLOWDOWN) -DXSize=20 -DYSize=24 \\\n\t -D__ALT_PRINT  \\\n\t-D__APPLE2_HGR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t--code-name LOWCODE \\\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\n\t-o $(BUILD_PATH)/aschase.bin\nifdef USE_TOOLS\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/aschase.bin\n\trm -rf $(BUILD_PATH)/aschase.bin\nelse\n\tmv $(BUILD_PATH)/aschase.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\n#################################################################\n\natari: $(ASSETS_PATH)/8x8_chars.h $(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr$(COMPILEDEXT)\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari \\\n\t \\\n\t$(5COLOR_PALETTE)  \\\n\t--config $(CFG_PATH)/cc65/atari_mode1_redefined_chars.cfg \\\n\t-D__ANTIC_MODE6_GRAPHICS -D__ALT_SLEEP  \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D__ALT_PRINT \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/atari_mode1_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari/disable_setcursor.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari/atari_mode1_redefined_chars_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.xex\n\t$(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr $(BUILD_PATH)/X$(GAME_NAME)_$@.atr -b $(BUILD_PATH)/X$(GAME_NAME)_$@.xex\n\n#################################################################\n\natari5200: $(ASSETS_PATH)/8x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari5200 \\\n\t--config $(CFG_PATH)/cc65/atari5200_redefined_chars_32k.cfg \\\n\t-D__ATARI5200__  $(5COLOR_PALETTE) \\\n\t-D__ANTIC_MODE6_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI5200_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari5200/atari5200_init_graphics.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom\n\n#################################################################\n\n\natari_lynx: $(ASSETS_PATH)/8x6_tiles.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t lynx \\\n\t-D__ATARI_LYNX__  -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI_LYNX_SLOWDOWN)  \\\n\t-D__NO_SCREEN_COLOR_INIT  -DXSize=20 -DYSize=17 -D_XL_NUMBER_OF_TILES=27 \\\n\t-D__LYNX_TGI_GRAPHICS \\\n\t-D__ALT_PRINT \\\n\t$(CROSS_LIB_PATH)/display/alt_print/tgi_gfx_print.c \\\n\t$(CROSS_LIB_PATH)/sound/cc65/atari_lynx/atari_lynx_sounds.c \\\n\t$(CROSS_LIB_PATH)/sound/cc65/atari_lynx/chibisound.asm \\\n\t$(ASSETS_PATH)/8x6_tiles.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari_lynx/atari_lynx_gfx_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.lnx\n\n\n#################################################################\n\n\n%.o : %.s\n\t$(CC65_PATH)$(CA65) -t atari7800 -o$@ $<\n\nsfxobjects= \\\n\t$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_bling.o \\\n\t$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_explosion.o \\\n\t$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_poof1.o \\\n\t$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_poof2.o \\\n\t$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_powerup.o \\\n\t$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_quack.o\n\nsfxlib = sfx.lib\n\n# all: $(sfxlib)\n\n$(sfxlib) : $(sfxobjects)\n\t$(AR65) rv $(sfxlib) $(sfxobjects)\n\t$(AR65) t $(sfxlib)\n\natari7800: $(ASSETS_PATH)/cc65_udc_atari7800_160A.s $(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s $(TOOLS_PATH)/cc65/atari7800/sfx.o $(TOOLS_PATH)/cc65/atari7800/extzp.o $(sfxlib)\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari7800 --force-import __EXEHDR__ \\\n\t-D__ATARI7800_COLOR_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__ALT_SLEEP  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI7800_SLOWDOWN)  \\\n\t-DXSize=20 -DYSize=28 -D__DEFAULT_CLEAR_SCREEN $(4COLOR_PALETTE) \\\n\t-D__ALT_PRINT \\\n\t$(TOOLS_PATH)/cc65/atari7800/extzp.o \\\n\t$(TOOLS_PATH)/cc65/atari7800/sfx.o \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari7800/atari7800_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s  \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78 -L . sfx.lib\n\trm sfx.lib\n\n\natari7800_no_color: \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari7800 --force-import __EXEHDR__ atari7800-mono.o \\\n\t--config $(CFG_PATH)/cc65/atari7800_more_ram.cfg   -D_XL_NO_UDG -D_XL_NO_COLOR -D__TARGET_SPECIFIC_ASCII \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__NO_SCREEN_COLOR_INIT -D__ALT_SLEEP -D_XL_NO_SOUND \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI7800_NO_COLOR_SLOWDOWN) -DXSize=34 -DX_OFFSET=3 -DYSize=28 \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78\n\n\natari7800_320A: $(ASSETS_PATH)/cc65_udc_atari7800_160A.s $(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari7800 --force-import __EXEHDR__ atari7800-mono.o \\\n\t--config $(CFG_PATH)/cc65/atari7800_more_ram.cfg  -D_XL_NO_COLOR -D__TARGET_SPECIFIC_ASCII \\\n\t-D__ATARI7800_COLOR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\n\t-D__CONIO_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__ALT_SLEEP  -D_XL_NO_SOUND  \\\n\t$(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI7800_NO_COLOR_SLOWDOWN) -DXSize=34 -DX_OFFSET=3 -DYSize=28 \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari7800/atari7800_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78\n\n#################################################################\n\nc16: c16_32k\n\n#  -m mapfile.txt\n# --check-stack\n# D__DEFAULT_CLEAR_SCREEN uses _SPACE=$60, which is correct but slow\n# D__KERNAL_CLEAR_SCREEN uses a hard-coded $20 character, which is wrong in this case ($60 is needed)\n# D__ASSEMBLY_CLEAR_SCREEN uses a hard-coded $60, which is correct\nc16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 \\\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30.cfg \\\n\t-D__NO_SCREEN_COLOR_INIT  \\\n\t-D__ALT_PRINT \\\n\t-D__MEMORY_MAPPED_GRAPHICS \\\n\t-D__ASSEMBLY_CLEAR_SCREEN \\\n\t-D__ALT_SLEEP \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \\\n\t-D__UDG_BASE_FACTOR=15 \\\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nc16_16k_double_buffer: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 -m mapfile.txt \\\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30.cfg \\\n\t-D__NO_SCREEN_COLOR_INIT -D__USE_WAIT_V_SYNC \\\n\t-D__ALT_PRINT \\\n\t-D__MEMORY_MAPPED_GRAPHICS -D__DOUBLE_BUFFER \\\n\t-D__ASSEMBLY_CLEAR_SCREEN -D__DEFAULT_CLEAR_SCREEN \\\n\t-D__ALT_SLEEP \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_DOUBLE_BUFFER_SLOWDOWN) \\\n\t-D__UDG_BASE_FACTOR=15 \\\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nc16_16k_low_stack: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16  \\\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30_less_hd_stack.cfg \\\n\t-D__NO_SCREEN_COLOR_INIT  \\\n\t-D__ALT_PRINT \\\n\t-D__MEMORY_MAPPED_GRAPHICS \\\n\t-D__ASSEMBLY_CLEAR_SCREEN \\\n\t-D__ALT_SLEEP \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \\\n\t-D__UDG_BASE_FACTOR=15 \\\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nc16_conio: c16_16k_conio\n\nc16_16k_conio: $(ASSETS_PATH)/8x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 --config $(CFG_PATH)/cc65/c16-16k.cfg -m mapfile.txt \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_CONIO_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_redefined_chars_init_graphics.c  \\\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n#c16_32k: c16_32k_conio\n\nc16_32k: $(ASSETS_PATH)/8x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 --config $(CFG_PATH)/cc65/c16-32k.cfg \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_redefined_chars_init_graphics.c  \\\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n#################################################################\n\n\n# c64_Ln: $(ASSETS_PATH)/cc65_udc_arcade.s\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 -Ln global \\\n\t# --config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg  \\\n\t# -D__MEMORY_MAPPED_GRAPHICS -D__ALT_PRINT \\\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \\\n\t# $(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\n\t# $(ASSETS_PATH)/cc65_udc_arcade.s \\\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\n\t# $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t# $(FULL_FILES) \\\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n# -Ln global\nc64: $(ASSETS_PATH)/cc65_udc_arcade.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 \\\n\t--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg  \\\n\t-D__MEMORY_MAPPED_GRAPHICS -D__ALT_PRINT \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\n\t$(ASSETS_PATH)/cc65_udc_arcade.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nc64_double_buffer: $(ASSETS_PATH)/cc65_udc_arcade.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 \\\n\t--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg  \\\n\t-D__MEMORY_MAPPED_GRAPHICS -D__DOUBLE_BUFFER -D__ALT_PRINT \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\n\t$(ASSETS_PATH)/cc65_udc_arcade.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n#TODO: Broken\nc64_conio: $(ASSETS_PATH)/cc65_udc_arcade_conio.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 \\\n\t--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg  \\\n\t-D__CONIO_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\n\t$(ASSETS_PATH)/cc65_udc_arcade_conio.s \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \n\nifdef USE_TOOLS\nc64_exomized: c64 $(TOOLS_PATH)/generic/exomizer/exomizer$(COMPILEDEXT)\n\t$(TOOLS_PATH)/generic/exomizer/exomizer sfx basic $(BUILD_PATH)/X$(GAME_NAME)_$<.prg -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nc64_crt: c64_exomized\n\tpython $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/X$(GAME_NAME)_$<.prg  $(BUILD_PATH)/X$(GAME_NAME)_$@.crt\nendif\n\n\n\n#######################################################################################\n# CBM610\n\ncbm610: \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t cbm610 \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CBM610_SLOWDOWN) \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\n#######################################################################################\n# CBM510\n\ncbm510: \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t cbm510 -DEXTRA_TITLE \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_SOUND -D_XL_NO_UDG \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CBM510_SLOWDOWN) \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\n\n\n#################################################################\n\nifdef USE_TOOLS\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\nelse\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s\nendif\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\n\t \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAMATE_SLOWDOWN) \\\n\t $(GAMATE_GAME_OPTS) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\n\t$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\nifdef USE_TOOLS\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\nendif    \n\t\n#################################################################\n\nnes: $(ASSETS_PATH)/cc65_nes_color_tiles.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t nes \\\n\t--config $(CFG_PATH)/cc65/nes_fx.cfg \\\n\t-D__NES_CONIO_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NES_SLOWDOWN) \\\n\t$(4COLOR_PALETTE)  \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/nes/nes_init_graphics.c \\\n\t$(ASSETS_PATH)/cc65_nes_color_tiles.s \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_nes.nes\n\n\n#################################################################\n\npce: pce_32k\n\npce_16k: $(ASSETS_PATH)/cc65_pce_tiles.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t pce \\\n\t \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PCE_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t--config $(CFG_PATH)/cc65/pce_16k_less_stack.cfg   \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/cc65_pce_tiles.s \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 count=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 skip=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin \n\tcat $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin > $(BUILD_PATH)/X$(GAME_NAME)_PCE_SWAPPED.pce\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin\n\n\npce_32k: $(ASSETS_PATH)/cc65_pce_tiles.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t pce \\\n\t \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PCE_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t--config $(CFG_PATH)/cc65/pce_32k.cfg   \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/cc65_pce_tiles.s \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 count=24576 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 skip=24576 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin \n\tcat $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin > $(BUILD_PATH)/X$(GAME_NAME)_PCE_SWAPPED.pce\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin\n\n\n#################################################################\n\n\ncreativision: $(ASSETS_PATH)/8x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t creativision \\\n\t-D__CREATIVISION__  \\\n\t -D__ALT_SLEEP $(CREATIVISION_GAME_OPTS) \\\n\t-D__VDP_MODE1_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CREATIVISION_SLOWDOWN) \\\n\t--config $(CFG_PATH)/cc65/creativision-16k.cfg \\\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\n\n\n#################################################################\n\noric: oric_atmos\n\natmos: oric_atmos\n\noric1: oric_atmos\n\noric1_48k: oric_atmos\n\noric_atmos: $(ASSETS_PATH)/6x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS)  \\\n\t-t atmos -D_XL_NO_JOYSTICK $(ORIC_COLORS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ORIC_SLOWDOWN) \\\n\t--config $(CFG_PATH)/cc65/atmos_better_tap.cfg \\\n\t-D__ORIC_COLOR_GRAPHICS \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atmos/atmos_redefined_characters_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_atmos_and_oric1_48k.tap\n\n\n#################################################################\n\n\npet: pet_16k\n\npet_16k: \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t pet -m mapfile.txt \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PET_SLOWDOWN) \\\n\t-D__NO_INIT_GRAPHICS -D__CONIO_GRAPHICS -D_XL_NO_UDG  \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/pet/pet_sounds.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_pet_16k.prg\n\n\n#################################################################\n\nsupervision: $(ASSETS_PATH)/cc65_udc.s \n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t supervision  \\\n\t--config $(CFG_PATH)/cc65/supervision-16k_GFX_2.cfg \\\n\t$(ASSETS_PATH)/cc65_udc.s \\\n\t-D__ALT_PRINT -D__ALT_SLEEP \\\n\t-D__BIT_MAPPED_4_GRAPHICS \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SUPERVISION_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/supervision/supervision_init_graphics.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_supervision.sv\n\n\n#################################################################\n\n\nvic20: vic20_exp_16k\n\nvic20_exp_16k: $(ASSETS_PATH)/cc65_udc_arcade_v2.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS)  -t vic20    \\\n\t--config $(CFG_PATH)/cc65/vic20-16k_CODE2_GFX_V2.cfg \\\n\t-D__CONIO_GRAPHICS -D__VIC20_EXP_8K $(VIC_20_EXP_16K_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\n\t \\\n\t$(ASSETS_PATH)/cc65_udc_arcade_v2.s \\\n\t$(FULL_FILES) \\\n\t--code-name CODE2 \\\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nvic20_exp_8k_conio: $(ASSETS_PATH)/cc65_udc_arcade_v2.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS)  -t vic20    \\\n\t--config $(CFG_PATH)/cc65/vic20-8k_CODE2_GFX_V2.cfg \\\n\t-D__CONIO_GRAPHICS -D__VIC20_EXP_8K $(VIC_20_EXP_16K_GAME_OPTS)  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \\\n\t$(FULL_FILES) \\\n\t--code-name CODE2 \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\n\t$(ASSETS_PATH)/cc65_udc_arcade_v2.s \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nvic20_exp_8k: $(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \\\n\t--config $(CFG_PATH)/cc65/vic20-8k_memory_mapped_GFX.cfg \\\n\t-D__ALT_SLEEP $(VIC_20_EXP_16K_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \\\n\t-D__MEMORY_MAPPED_GRAPHICS  -D__VIC20__ -D__VIC20_EXP_8K \\\n\t-D__ALT_PRINT \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(FULL_FILES) \\\n\t--code-name CODE2 \\\n\t$(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nvic20_exp_3k: $(ASSETS_PATH)/cc65_udc_vic20_64_chars.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \\\n\t--config $(CFG_PATH)/cc65/vic20-3k_GFX.cfg \\\n\t-D__VIC20_EXP_3K \\\n\t-D__MEMORY_MAPPED_GRAPHICS \\\n\t$(VIC_20_EXP_3K_GAME_OPTS) \\\n\t-D__ALT_PRINT \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/cc65_udc_vic20_64_chars.s \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\n\n# Unexpanded VIC 20, with 6 tiles, default ASCII mapped as reverse characters\n# vic20_unexpanded: $(ASSETS_PATH)/cc65_udc_6chars.s\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 -m mapfile.txt \\\n\t# -D_XL_NO_TEXT_COLOR \\\n\t# -D__VIC20_UNEXPANDED -D_XL_NUMBER_OF_TILES=6 \\\n\t# -D__NO_SLEEP_SEC -D__ALT_SLEEP \\\n\t# -D__NO_COLOR_INIT \\\n\t# -D__MEMORY_MAPPED_GRAPHICS \\\n\t# -D__ALT_PRINT \\\n\t# -D__DEFAULT_CLEAR_SCREEN \\\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\n\t# $(VIC20_UNEXPANDED_GAME_OPTS) \\\n\t# --config $(CFG_PATH)/cc65/vic20_unexpanded_gfx.cfg  \\\n\t# $(FULL_FILES) \\\n\t# $(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t# $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t# $(ASSETS_PATH)/cc65_udc_6chars.s \\\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\n# Same as above but with just explosion sound\nvic20_unexpanded: $(ASSETS_PATH)/cc65_udc_6chars.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 -m mapfile.txt \\\n\t-D_XL_NO_TEXT_COLOR \\\n\t-D__VIC20_UNEXPANDED -D_XL_NUMBER_OF_TILES=6 \\\n\t-D__NO_SLEEP_SEC -D__ALT_SLEEP \\\n\t-D__NO_COLOR_INIT \\\n\t-D__MEMORY_MAPPED_GRAPHICS \\\n\t-D__ALT_PRINT \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\n\t$(VIC20_UNEXPANDED_GAME_OPTS) \\\n\t--config $(CFG_PATH)/cc65/vic20_unexpanded_gfx.cfg  \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_explosion_sound.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(ASSETS_PATH)/cc65_udc_6chars.s \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nvic20_unexpanded2: $(ASSETS_PATH)/cc65_udc_6chars.s\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 -m mapfile.txt \\\n\t-D_XL_NO_TEXT_COLOR \\\n\t-D__VIC20_UNEXPANDED -D_XL_NUMBER_OF_TILES=6 \\\n\t-D__NO_SLEEP_SEC -D__ALT_SLEEP \\\n\t-D__NO_COLOR_INIT \\\n\t-D__MEMORY_MAPPED_GRAPHICS \\\n\t-D__ALT_PRINT \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\n\t$(VIC20_UNEXPANDED_GAME_OPTS) \\\n\t--config $(CFG_PATH)/cc65/vic20_unexpanded_gfx_low_stack.cfg  \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(ASSETS_PATH)/cc65_udc_6chars.s \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nvic20_unexpanded_no_gfx:\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \\\n\t-D__MEMORY_MAPPED_GRAPHICS \\\n\t-D_XL_NO_TEXT_COLOR \\\n\t-D__VIC20_UNEXPANDED \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\n\t-D__ALT_SLEEP -D__NO_SLEEP_SEC \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_UDG \\\n\t$(VIC20_UNEXPANDED_NO_GFX_GAME_OPTS) \\\n\t-D__ALT_PRINT \\\n\t--config $(CFG_PATH)/cc65/alt/vic20_unexpanded.cfg  \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n#################################################################\n# Z88DK\n\n\n#################################################################\n\njupiter_ace: ace\n\nace: ace_exp_16k\n\nace_exp_16k: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +ace $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__ACE__  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ACE_SLOWDOWN) \\\n\t-D_XL_NO_JOYSTICK \\\n\t-D__CONIO_GRAPHICS \\\n\t-clib=default \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@ -Cz--audio -create-app\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\n\n#################################################################\n\n\nagon: agon_mode2\n\nagon_mode2: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +agon $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__AGON__ -D_XL_NO_JOYSTICK -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D__SCREEN_MODE=2 -pragma-define:CRT_ENABLE_COMMANDLINE=0 \\\n\t-D__CONIO_GRAPHICS -DXSize=40 -DYSize=24 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGON_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\n\n#################################################################\n\n\naquarius: aquarius_exp_16k\n\naquarius_exp_16k: \n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \\\n\t -D__AQUARIUS__ \\\n\t-lndos -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\naquarius_rom:\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi -subtype=rom $(INCLUDE_OPTS) -vn \\\n\t -D__AQUARIUS__  \\\n\t-lndos -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\naquarius_plus_caq: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=aqplus $(INCLUDE_OPTS) -vn \\\n\t -D__AQUARIUS__ --generic-console -D__SCREEN_MODE=1 \\\n\t-lndos -D_XL_NO_JOYSTICK -DY_OFFSET=1 -DYSize=23 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin \n\n\n# aqx \naquarius_plus: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=aqplus -subtype=aqx $(INCLUDE_OPTS) -vn \\\n\t -D__AQUARIUS__ --generic-console -D__SCREEN_MODE=1 \\\n\t-lndos -D_XL_NO_JOYSTICK -DY_OFFSET=1 -DYSize=23 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\n\naquarius_plus_rom: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=aqplus -subtype=rom $(INCLUDE_OPTS) -vn \\\n\t -D__AQUARIUS__ --generic-console -D__SCREEN_MODE=1 \\\n\t-lndos -D_XL_NO_JOYSTICK -DY_OFFSET=1 -DYSize=23 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\n\naquarius_alt: \n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \\\n\t -D__AQUARIUS__ \\\n\t-lndos -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) -D_XL_NO_UDG \\\n\t-D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \\\n\t$(FULL_FILES) \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\n\n\n# experimental\naquarius_exp_4k: \n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius -SO3 -compiler=sdcc -clib=ansi $(INCLUDE_OPTS) -vn \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\n\t-D__AQUARIUS__ \\\n\t-lndos -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_aquarius_exp_4k\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_aquarius_exp_4k\n\n\n\n#  \n# -D__BIT_BANG_SOUND \n#################################################################\n\nc128: c128_40col\n\nc128_8502_80col: $(ASSETS_PATH)/8x8_chars.h\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c128   \\\n\t-DXSize=80 \\\n\t-D__CONIO_GRAPHICS -D__80COL_UDG -D_XL_NO_SMALL_LETTERS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_8502_80COL_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c128/c128_80col_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nc128_zsdcc: c128_z80_40col_zsdcc\nc128_40col_zsdcc: c128_z80_40col_zsdcc\n\n\nc128_40col: c128_z80_40col\n\nc128_z80_40col_alt: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS)  \\\n\t$(INCLUDE_OPTS) \\\n\t-lndos -subtype=disk -clib=gencon \\\n\t-D__C128_Z80__ -DXSize=40 \\\n\t \\\n\t-D__BIT_BANG_SOUND   \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_40COL_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS  \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t-create-app -o\"a40.bin\"\nifdef USE_TOOLS\n\t$(C1541) -format \"crosschase,0\" d64 FULL_$@.d64\n\t$(C1541) -attach FULL_$@.d64 -write a40.ldr\n\t$(C1541) -attach FULL_$@.d64 -write a40\n\tmv FULL_$@.d64 $(BUILD_PATH)/X$(GAME_NAME)_$@.d64\n\trm a40.bin\nelse\n\tmv a40.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\trm a40.ldr\n\trm a40\n\n\nc128_z80_40col: $(ASSETS_PATH)/z88dk_xchase.asm  $(TOOLS_PATH)/generic/CC1541/cc1541$(COMPILEDEXT)\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS)  \\\n\t$(INCLUDE_OPTS) \\\n\t-lndos -subtype=disk -clib=gencon \\\n\t-D__C128_Z80__ -DXSize=40 \\\n\t \\\n\t-D__BIT_BANG_SOUND   \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_40COL_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS  \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t-create-app -o\"a40.bin\"\n\t../tools/generic/CC1541/cc1541 -f a40.ldr -w a40.ldr X$(GAME_NAME)_$@.d64\n\t../tools/generic/CC1541/cc1541 -f a40 -w a40 X$(GAME_NAME)_$@.d64\n\tmv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/\n\trm -rf a40.bin\n\trm -rf a40.ldr\n\trm -rf a40\n\n\nc128_80col: c128_8502_80col\n\nc128_z80_80col_alt: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) -lgfx128hr \\\n\t$(INCLUDE_OPTS)  \\\n\t-lndos -subtype=disk \\\n\t-D__C128_Z80__ -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_80COL_SLOWDOWN) \\\n\t-D__Z88DK_SPRITES_GRAPHICS \\\n\t-D__BIT_BANG_SOUND $(C128_Z80_80COL_GAME_OPTS)  \\\n\t-D__ALT_PRINT \\\n\t-D_XL_NO_COLOR \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/c128/c128_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-create-app -o\"a80.bin\"\nifdef USE_TOOLS\n\t$(C1541) -format \"crosschase,0\" d64 X$(GAME_NAME)_$@.d64\n\t$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80.ldr\n\t$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80\n\tmv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/\n\trm a80.bin\nelse\n\tmv a80.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\trm a80.ldr\n\trm a80\n\nc128_z80_80col: $(ASSETS_PATH)/z88dk_sprites_definitions.h $(TOOLS_PATH)/generic/CC1541/cc1541$(COMPILEDEXT)\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) -lgfx128hr \\\n\t$(INCLUDE_OPTS)  \\\n\t-lndos -subtype=disk \\\n\t-D__C128_Z80__ -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_80COL_SLOWDOWN) \\\n\t-D__Z88DK_SPRITES_GRAPHICS \\\n\t-D__BIT_BANG_SOUND $(C128_Z80_80COL_GAME_OPTS)  \\\n\t-D__ALT_PRINT \\\n\t-D_XL_NO_COLOR \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/c128/c128_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-create-app -o\"a80.bin\"\n\t../tools/generic/CC1541/cc1541 -f a80.ldr -w a80.ldr X$(GAME_NAME)_$@.d64\n\t../tools/generic/CC1541/cc1541 -f a80 -w a80 X$(GAME_NAME)_$@.d64\n\tmv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/\n\trm -rf a80.bin\n\trm -rf a80.ldr\n\trm -rf a80\n\n\nc128_8x6: c128_8x6_80col\nc128_8x6_80col: c128_z80_8x6_80col\nc128_z80_8x6_80col: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) -lgfx128hr \\\n\t$(INCLUDE_OPTS)  \\\n\t-lndos -subtype=disk \\\n\t-D__C128_Z80__ -D__NO_SPRITE_TRANSPARENCY \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 -DYSize=33 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_80COL_SLOWDOWN) \\\n\t-D__BIT_BANG_SOUND $(C128_Z80_80COL_GAME_OPTS)  \\\n\t-D__ALT_PRINT \\\n\t-D_XL_NO_COLOR \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/c128/c128_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-create-app -o\"a80.bin\"\nifdef USE_TOOLS\n\t$(C1541) -format \"crosschase,0\" d64 X$(GAME_NAME)_$@.d64\n\t$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80.ldr\n\t$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80\n\tmv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/\n\trm a80.bin\nelse\n\tmv a80.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\nendif\n\trm a80.ldr\n\trm a80\n\n#################################################################\n\ncamputers_lynx: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +lynx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-D__CAMPUTERS_LYNX__ -D_XL_NO_JOYSTICK  -D__BIT_BANG_SOUND \\\n\t-vn \\\n\t$(CAMPUTERS_LYNX_GAME_OPTS) \\\n\t-D__VT52 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CAMPUTERS_LYNX_SLOWDOWN) \\\n\t-lndos \\\n\t-D__CONIO_GRAPHICS  \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_camputers_lynx.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_camputers_lynx.bin\n\n\n#################################################################\n\ncoleco: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +coleco $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__COLECO__  \\\n\t \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COLECO_SLOWDOWN) \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_coleco.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco_DATA.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco_BSS.bin\n\n#################################################################\n\ngx4000: cpc\n\ncpc: cpc_mode0\n\nifdef USE_TOOLS\ncpc_mode0: $(ASSETS_PATH)/z88dk_xchase.asm $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)\nelse\ncpc_mode0: $(ASSETS_PATH)/z88dk_xchase.asm\nendif\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -subtype=dsk $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc  \\\n\t-DYSize=25 -DXSize=20 -D__SCREEN_MODE=0 \\\n\t$(CPC_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPC_MODE0_SLOWDOWN) \\\n\t-D__CPC__ \\\n\t-lndos -create-app \\\n\t-D__CONIO_GRAPHICS \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-o $(BUILD_PATH)/XBIN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES)\nifdef USE_TOOLS\n\tcp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\n\t$(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT) $(BUILD_PATH)/XBIN.dsk  $(BUILD_PATH)/XBIN_$@_gx4000.cpr   -c 'run\"XBIN'\n\trm os.rom\n\trm amsdos.rom\n\trm basic.rom\n\tmv $(BUILD_PATH)/XBIN_$@_gx4000.cpr $(BUILD_PATH)/X$(GAME_NAME)_$@_gx4000.cpr\nendif\n\tmv $(BUILD_PATH)/XBIN.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\trm -rf $(BUILD_PATH)/XBIN.bin\n\trm -rf $(BUILD_PATH)/XBIN.cpc\n\trm -rf $(BUILD_PATH)/XBIN\n\n\n\n\n#################################################################\n\ncpm: cpm_z80_adm3a\n\ncpm_adm3a: cpm_z80_adm3a\n\ncpm_8080: cpm_8080_adm3a\n\ncpm_8085: cpm_8085_adm3a\n\ncpm_vt52: cpm_z80_vt52\n\ncpm_targets: cpm_adm3a cpm_vt52\n\ncpm_z80_adm3a:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\ncpm_8080_adm3a:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) -clib=8080 --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\ncpm_8085_adm3a:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) -clib=8085 --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\ncpm_z80_vt52:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \\\n\t-D__VT52 -DXSize=80 -DYSize=24 \\\n\t-D__NO_WAIT -D_XL_NO_COLOR \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\ncpm_8080_vt52:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -m8080 -clib=8080 \\\n\t$(INCLUDE_OPTS) \\\n\t-D__VT52 -DXSize=80 -DYSize=24 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_INTEL8080_SLOWDOWN) \\\n\t-D__NO_WAIT -D_XL_NO_COLOR \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n#################################################################\n\n\ngb: $(ASSETS_PATH)/z88dk_gameboy.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +gb $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D__GB__ \\\n\t-DXSize=20 \\\n\t-DYSize=18 \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_COLOR  \\\n\t-D__SCREEN_MODE=1  \\\n\t-D__CONIO_GRAPHICS  \\\n\t-lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GB_SLOWDOWN) \\\n\t $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_gameboy.asm \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/gb/gb_sounds.c \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_1F.bin\n\n\n#################################################################\n\ngal: gal_22k\n\ngal_22k:\n\t$(Z88DK_PATH)$(MYZ88DK) +gal $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-need=ansiterminal \\\n\t-D__GAL__    \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAL_SLOWDOWN) \\\n\t-vn -lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_galaksija.prg \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\ngal_plus: gal_plus_gfx\n\ngal_plus_gfx: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +gal -subtype=galaxyp $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) \\\n\t--generic-console -D__SCREEN_MODE=1  -DYSize=26  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAL_GFX_SLOWDOWN) \\\n\t-D__GAL__ -D__GAL_PLUS__  $(GAL_PLUS_GAME_OPTS)  \\\n\t-D__CONIO_GRAPHICS  -D__BIT_BANG_SOUND \\\n\t-vn -lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_galaksija_plus.prg \\\n\t$(FULL_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\n#################################################################\n\n\ngg: gamegear\n\ngamegear: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +sms -subtype=gamegear $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D__SMS__ -D__GAME_GEAR__ \\\n\t-DXSize=20 \\\n\t-DYSize=18 \\\n\t-D__BIT_BANG_SOUND \\\n\t-D__CONIO_GRAPHICS  \\\n\t-lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GG_SLOWDOWN) \\\n\t $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_gamegear.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_DATA.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_BANK_1F.bin\n\n\n#################################################################\n\nlaser500: laser500_keyboard\n\nlaser500_joy: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +laser500 $(SCCZ80_OPTS) -vn -Cz--audio \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(INCLUDE_OPTS) \\\n\t-D__LASER500__  -DXSize=40 -DYSize=22 -D__SCREEN_MODE=2 \\\n\t-D__BIT_BANG_SOUND  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LASER500_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\n\n\nlaser500_keyboard: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +laser500 $(SCCZ80_OPTS) -vn -Cz--audio \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(INCLUDE_OPTS) -D_XL_NO_JOYSTICK \\\n\t-D__LASER500__  -DXSize=40 -DYSize=22 -D__SCREEN_MODE=2 \\\n\t-D__BIT_BANG_SOUND  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LASER500_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\n\n\n#################################################################\n\n# -D__NO_BOTTOM \nm100:\n\t$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__M100__ \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\n\t-DXSize=39 \\\n\t-DYSize=8 \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_COLOR \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\nm10:\n\t$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__M100__ -clib m10 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\n\t-DXSize=39 \\\n\t-DYSize=8 \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_COLOR \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\nkc85:\n\t$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__M100__ -clib kc85 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\n\t-DXSize=39 \\\n\t-DYSize=8 \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_COLOR \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\npc8201:\n\t$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__M100__ -clib pc8201 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\n\t-DXSize=39 \\\n\t-DYSize=8 \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_COLOR \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\nt200:\n\t$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__M100__ -clib t200 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\n\t-DXSize=39 \\\n\t-DYSize=16 \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_COLOR \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\nmc1000_mono: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +mc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-define:REGISTER_SP=0x3fff \\\n\t-subtype=gaming \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MC1000_SLOWDOWN) \\\n\t-D__SCREEN_MODE=1 \\\n\t-D__MC1000__ -D_XL_NO_JOYSTICK  \\\n\t-D__CONIO_GRAPHICS \\\n\t-vn  -lndos -Cz--audio \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES)\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\n\n\nmc1000_color: mc1000\n\n# background color white\nmc1000: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +mc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-define:REGISTER_SP=0x3fff \\\n\t-subtype=gaming \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MC1000_SLOWDOWN) \\\n\t-D__SCREEN_MODE=2 -DXSize=16  -D__NO_SCREEN_COLOR_INIT \\\n\t-D__MC1000__ -D_XL_NO_JOYSTICK  \\\n\t-D__CONIO_GRAPHICS \\\n\t-vn  -lndos -Cz--audio \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES)\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\n\n\n \n#################################################################\n\nmsx: msx_16k\n\nmsx_16k: $(ASSETS_PATH)/z88dk_xchase.asm   \n\t$(Z88DK_PATH)$(MYZ88DK) +msx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-vn   -D__MSX__ \\\n\t-lndos -subtype=rom \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \\\n\t-D__CONIO_GRAPHICS   -DXSize=32 -DYSize=24 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\n\n# TODO: BROKEN with only green\n# msx2_color: msx2_mode6\n\nmsx2: msx2_color\n\n\n# msx2_color: $(ASSETS_PATH)/z88dk_xchase.asm   \n\t# $(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t# -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/msx2_palette.asm \\\n\t# -vn   -D__MSX__ -D__SCREEN_MODE=6 -D__MSX2_COLOR -pragma-define:CLIB_CONIO_NATIVE_COLOUR=1 \\\n\t# -lndos -subtype=rom \\\n\t# -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \\\n\t# -D__CONIO_GRAPHICS   -DXSize=64 -DYSize=24 \\\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \\\n\t# $(ASSETS_PATH)/z88dk_xchase.asm \\\n\t# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t# $(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t# $(FULL_FILES)\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\nmsx2_mono: $(ASSETS_PATH)/z88dk_xchase.asm   \n\t$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic -D_XL_NO_COLOR \\\n\t-vn   -D__MSX__ -D__SCREEN_MODE=6 \\\n\t-lndos -subtype=rom \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \\\n\t-D__CONIO_GRAPHICS   -DXSize=64 -DYSize=24 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\nmsx2_color: msx2_mode7\n\nmsx2_mode7: $(ASSETS_PATH)/z88dk_xchase.asm   \n\t$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-vn   -D__MSX__ -D__SCREEN_MODE=7 \\\n\t-lndos -subtype=rom \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \\\n\t-D__CONIO_GRAPHICS   -DXSize=64 -DYSize=24 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\n\nmsx2_mode6: $(ASSETS_PATH)/z88dk_xchase.asm   \n\t$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-vn   -D__MSX__ -D__SCREEN_MODE=6 \\\n\t-lndos -subtype=rom \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \\\n\t-D__CONIO_GRAPHICS   -DXSize=64 -DYSize=24 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\nmsx2_mode7: $(ASSETS_PATH)/z88dk_xchase.asm   \n\t$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-vn   -D__MSX__ -D__SCREEN_MODE=7 \\\n\t-lndos -subtype=rom \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \\\n\t-D__CONIO_GRAPHICS   -DXSize=64 -DYSize=24 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n#################################################################\n\ninteract:\n\t$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-vn   -D__INTERACT__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \\\n\t-DXSize=28 -DYSize=9 -m8080 $(HECTOR1_GAME_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic  \\\n\t-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \\\n\t$(FULL_FILES)\n\nhector1: \n\t$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-vn   -D__HECTOR__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic  \\\n\t-DXSize=28 -DYSize=9 $(HECTOR1_GAME_OPTS) \\\n\t-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \\\n\t$(FULL_FILES)\n\n\ninteract_mono:\n\t$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-vn   -D__INTERACT__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \\\n\t-DXSize=28 -DYSize=9 -m8080 -D_XL_NO_COLOR $(HECTOR1_GAME_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic  \\\n\t-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \\\n\t$(FULL_FILES)\n\nhector1_mono: \n\t$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-vn   -D__HECTOR__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic  -D_XL_NO_COLOR $(HECTOR1_GAME_OPTS) \\\n\t-DXSize=28 -DYSize=9 \\\n\t-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \\\n\t$(FULL_FILES)\n\n\n# -D__PATCH_HECTORHR_COLORS\nhectorhr: $(ASSETS_PATH)/z88dk_xchase.asm   \n\t$(Z88DK_PATH)$(MYZ88DK) +hector -clib=hectorhr $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic  \\\n\t-vn   -D__HECTORHR__ -D_XL_NO_SOUND $(4COLOR_PALETTE) \\\n\t-lndos -pragma-define:CLIB_CONIO_NATIVE_COLOUR=1 \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t-D__CONIO_GRAPHICS   -DXSize=30 -DYSize=28 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTORHR_SLOWDOWN) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(FULL_FILES)\n\n\n\n\n\n#################################################################\n\nmtx: mtx512\n\n# $(CROSS_LIB_PATH)/sound/z88dk/psg/sn76489a_psg_sounds.c\n# -D__PSG_SOUND\nmtx512: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) -clib=ansi -startup=2 $(INCLUDE_OPTS) \\\n\t-D__MTX__ -D__SCREEN_MODE=2 \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin -vn \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MTX512_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\n\nmtx500: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__MTX__ \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin -vn \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MTX500_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\n\n#################################################################\n\n\nmz:\n\t$(Z88DK_PATH)$(MYZ88DK) +mz $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__MZ__ -clib=ansi -pragma-define:ansicolumns=32 -Cz--audio -vn \\\n\t-D_XL_NO_UDG  \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MZ_SLOWDOWN) \\\n\t-pragma-define:REGISTER_SP=0xd000 \\\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_mz.prg \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_mz.prg\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_mz.mzt $(BUILD_PATH)/X$(GAME_NAME)_mz.mzf\n\n\n#################################################################\n\n\n\nnabu_no_gfx:\n\t$(Z88DK_PATH)$(MYZ88DK) +nabu $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NABU__  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\n\t-DXSize=32 \\\n\t-DYSize=24 \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D_XL_NO_COLOR \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS \\\n\t-lndos \\\n\t-D__NO_INIT_GRAPHICS \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\nnabu: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +nabu $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\n\t -D__NABU__    \\\n\t-lndos -DXSize=32 -DYSize=24 -D_XL_NO_JOYSTICK \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_SOUND -D__DEFAULT_CLEAR_SCREEN \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\n#################################################################\n\n\npc88: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn \\\n\t -D__PC88__  -subtype=disk  \\\n\t-lndos -DXSize=80 -DYSize=25 -D_XL_NO_JOYSTICK \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND -D__DEFAULT_CLEAR_SCREEN \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PC88_SLOWDOWN) \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-create-app\t\\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\n\t# mv FULL_pc88.d88 $(BUILD_PATH)/X$(GAME_NAME)_$@.d88\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@_BOOTSTRAP.bin\n\t$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\n\t -D__PC88__    \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PC88_SLOWDOWN) \\\n\t-lndos -DXSize=80 -DYSize=25 \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND -D__DEFAULT_CLEAR_SCREEN \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-create-app\t\\\n\t-o FULL_$@\n\trm FULL_$@\n\tmv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\n\tmv FULL_$@.t88 $(BUILD_PATH)/X$(GAME_NAME)_$@.t88\n\n\n#################################################################\n\nsamcoupe: sam\n\nsam: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +sam $(SCCZ80_OPTS) $(INCLUDE_OPTS) -create-app \\\n\t-D__SAM__ -D_XL_NO_JOYSTICK  \\\n\t-D__CONIO_GRAPHICS  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SAMCOUPE_SLOWDOWN) \\\n\t-clib=ansi -pragma-define:ansicolumns=32 -vn \\\n\t-D__BIT_BANG_SOUND -o $(BUILD_PATH)/FULL_samcoupe_$(GAME_NAME).bin -lndos \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm\n\trm $(BUILD_PATH)/FULL_samcoupe_$(GAME_NAME).bin\n\tmv $(BUILD_PATH)/FULL_samcoupe_$(GAME_NAME).mgt $(BUILD_PATH)/X$(GAME_NAME)_$@.mgt\n\n\n#################################################################\n\n#############################\n# SC3000\n\nsc3000: sc3000_32k\n\nsc3000_32k: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_OPTS)  \\\n\t$(INCLUDE_OPTS) \\\n\t-D__SC3000__ \\\n\t \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \\\n\t-D__BIT_BANG_SOUND \\\n\t  \\\n\t-DZ88DK_JOYSTICK \\\n\t-D__CONIO_GRAPHICS \\\n\t-vn -lndos -create-app -Cz--audio \\\n\t-pragma-define:CRT_ORG_BSS=0x8000 \\\n\t-pragma-define:REGISTER_SP=0xFFFF \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.tap\n\nsc3000_rom: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_ROM_OPTS) -subtype=rom \\\n\t$(INCLUDE_OPTS)  \\\n\t-D__SC3000__ \\\n\t-DZ88DK_JOYSTICK \\\n\t-pragma-define:REGISTER_SP=0xC7FF \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \\\n\t-D__BIT_BANG_SOUND \\\n\t-D__CONIO_GRAPHICS \\\n\t-vn -lndos -create-app \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\n\n\n#############################\n# SG1000\n\nsg1000: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_ROM_OPTS) -subtype=rom \\\n\t$(INCLUDE_OPTS)  -pragma-define:REGISTER_SP=0xC7FF \\\n\t-D__SC3000__ \\\n\t-DZ88DK_JOYSTICK \\\n\t-DGHOSTS_NUMBER=6 -DBULLETS_NUMBER=3 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \\\n\t-D__BIT_BANG_SOUND \\\n\t  \\\n\t-D__CONIO_GRAPHICS \\\n\t-vn -lndos -create-app \\\n\t \\\n\t \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\n\n\n\n\n#################################################################\n\nsms: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D__SMS__ \\\n\t-DXSize=32 \\\n\t-DYSize=24 \\\n\t-D__BIT_BANG_SOUND \\\n\t-D__CONIO_GRAPHICS  \\\n\t-lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SMS_SLOWDOWN) \\\n\t $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_sms.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_BSS.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_DATA.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_BANK_1F.bin\n\n\n#################################################################\nzx : spectrum\n\nspectrum_48k : spectrum\n\nspectrum: spectrum_48k_keyboard\n\nspectrum_keyboard: spectrum_48k_keyboard\n\nspectrum_48k_joystick: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPECTRUM_SLOWDOWN) \\\n\t-D__SPECTRUM__ \\\n\t-lndos -create-app \\\n\t-D__CONIO_GRAPHICS \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\n\n\nspectrum_48k_keyboard: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPECTRUM_SLOWDOWN) \\\n\t-D__SPECTRUM__ -D_XL_NO_JOYSTICK \\\n\t-lndos -create-app \\\n\t-D__CONIO_GRAPHICS \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\n\n\nspectrum_128k: spectrum_128k_keyboard\n\nspectrum_128k_keyboard: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPECTRUM_SLOWDOWN) \\\n\t-D__SPECTRUM__ -D_XL_NO_JOYSTICK -D__PSG_SOUND \\\n\t-lndos -create-app \\\n\t-D__CONIO_GRAPHICS \\\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\n\n#################################################################\n\ntrs80_gfx: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos -subtype=disk \\\n\t$(INCLUDE_OPTS)  \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-pragma-define:REGISTER_SP=0xffb5 \\\n\t-D__TRS80__ \\\n\t-D_XL_NO_JOYSTICK \\\n\t-vn -lndos \\\n\t-D__ALT_PRINT  -D__BIT_BANG_SOUND \\\n\t \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\n\t \\\n\t-DLESS_TEXT \\\n\t-create-app \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \\\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@S.bin \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\ntrs80:\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos -subtype=disk \\\n\t$(INCLUDE_OPTS) \\\n\t-lm -create-app \\\n\t-D__TRS80__ \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\ntrs80_model2: trs80_model2_lifeboat\n\ntrs80_model2_lifeboat:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lndos -subtype=lifeboat -lgfxtrs80m2 \\\n\t$(INCLUDE_OPTS) --generic-console \\\n\t-lm -create-app \\\n\t-DXSize=80 -DYSize=24 \\\n\t-D__TRS80__ \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n\ntrs80_model2_ptcpm:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lndos -subtype=ptcpm \\\n\t$(INCLUDE_OPTS) \\\n\t-lm -create-app \\\n\t-D__TRS80__ \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \\\n\t--generic-console \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\ntrs80_model2_fmgcpm:\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lndos -subtype=fmgcpm \\\n\t$(INCLUDE_OPTS) \\\n\t-lm -create-app \\\n\t-D__TRS80__ \\\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t-pragma-redirect:getk=getk_inkey \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \\\n\t--generic-console \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\n\n#################################################################\n\nvg5k: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) \\\n\t-vn  -D__VG5K__ \\\n\t-D__CONIO_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VG5K_SLOWDOWN) \\\n\t-clib=default --generic-console \\\n\t-D_XL_NO_JOYSTICK \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \\\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_vg5k.prg\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_vg5k.prg\n\n\n#################################################################\nvz200_no_gfx: vz200_no_gfx_24k\n\nvz_no_gfx: vz200_no_gfx_24k\n\nvz200_no_gfx_24k:\n\t$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) -vn \\\n\t--hardware-keyboard  --generic-console -D__HARDWARE_KEYBOARD \\\n\t$(INCLUDE_OPTS) -D__TARGET_SPECIFIC_ASCII \\\n\t-D__VZ__ -D_XL_NO_JOYSTICK \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VZ200_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG \\\n\t-lndos \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.vz \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/vz200/vz200_init_graphics.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\n\nvz200: vz200_24k\n\nvz: vz200_24k\n\nvz200_24k: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) -vn \\\n\t--hardware-keyboard  --generic-console -D__HARDWARE_KEYBOARD \\\n\t$(INCLUDE_OPTS) -D__TARGET_SPECIFIC_ASCII \\\n\t-D__VZ__ -D_XL_NO_JOYSTICK \\\n\t-DXSize=16 -DYSize=8 \\\n\t-D__SCREEN_MODE=1 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VZ200_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-lndos \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.vz \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\n\nvz200_target_specific:\n\t$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) -vn \\\n\t--hardware-keyboard  --generic-console -D__HARDWARE_KEYBOARD \\\n\t$(INCLUDE_OPTS) -D__TARGET_SPECIFIC_ASCII -D_XL_NO_JOYSTICK \\\n\t-D__VZ__ -D_XL_NO_COLOR -D__ALT_PRINT \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VZ200_SLOWDOWN) \\\n\t-D__MEMORY_MAPPED_GRAPHICS -D_XL_NO_UDG \\\n\t-lndos \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.vz \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/vz200/vz200_init_graphics.c \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\n\n#################################################################\n\n\n\nzx81_no_gfx: zx81_no_gfx_16k\n\n# -pragma-define:ZX_CHAR_XLATE_MODE=1\nzx81_no_gfx_16k:\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) \\\n\t$(INCLUDE_OPTS) \\\n\t--opt-code-size -pragma-define:ZX_CHAR_XLATE_MODE=1 \\\n\t-vn  -D__TARGET_SPECIFIC_ASCII \\\n\t-D__ZX81__  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_SLOWDOWN) $(ZX81_NO_GFX_GAME_OPTS) \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \\\n\t-lndos \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES)\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nzx81: zx81_no_gfx\n\nzx81_wrx: zx81_32k_wrx\n\nzx81_16k_wrx: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=22 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nzx81_32k_wrx: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-pragma-define:hrgpage=36096  \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=22 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nzx81_8x6: zx81_8x6_wrx\nzx81_8x6_wrx: zx81_32k_8x6_wrx\n\nzx81_16k_8x6_wrx: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=32 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nzx81_32k_8x6_wrx: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-pragma-define:hrgpage=36096  \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=32 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nzx81_wrx64: zx81_32k_wrx64\n\nzx81_16k_wrx64: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx64 -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=8 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nzx81_32k_wrx64: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx64 -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-pragma-define:hrgpage=36096  \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=8 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nzx81_wrx128: zx81_32k_wrx128\n\nzx81_16k_wrx128: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx128 -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=16 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nzx81_32k_wrx128: $(ASSETS_PATH)/z88dk_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx128 -clib=wrx \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-pragma-define:hrgpage=36096  \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=16 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nzx81_8x6_wrx128: zx81_32k_8x6_wrx128\n\nzx81_16k_8x6_wrx128: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx128 \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=21 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nzx81_32k_8x6_wrx128: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx128 \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-pragma-define:hrgpage=36096  \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=21 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\nzx81_8x6_wrx64: zx81_32k_8x6_wrx64\n\nzx81_16k_8x6_wrx64: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx64 \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=11 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\nzx81_32k_8x6_wrx64: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx64 \\\n\t$(INCLUDE_OPTS) \\\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\n\t-pragma-define:hrgpage=36096  \\\n\t-D__NO_SPRITE_TRANSPARENCY \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \\\n\t-DXSize=32 \\\n\t-DYSize=11 \\\n\t-vn  \\\n\t-D__ZX81__ \\\n\t-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \\\n\t-lndos \\\n\t-D_XL_NO_COLOR \\\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t-D__FEWER_SPRITES \\\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\n\n\n#################################################################\n\n\nz1013:\n\t$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi \\\n\t-vn -lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z1013_SLOWDOWN) \\\n\t-D__Z1013__     \\\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\n\t$(FULL_FILES) \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\n\nz1013_krt: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS) $(INCLUDE_OPTS) --generic-console \\\n\t-vn -lndos \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z1013_SLOWDOWN) \\\n\t-D__Z1013__  -D__SCREEN_MODE=1    \\\n\t-D__CONIO_GRAPHICS  -D_XL_NO_JOYSTICK  \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\n\n#############################\n# Z9001\n\n# --generic-console\nz9001_krt: $(ASSETS_PATH)/z88dk_xchase.asm\n\t$(Z88DK_PATH)$(MYZ88DK) +z9001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__Z9001__ -vn  -D__SCREEN_MODE=1 -D_XL_NO_JOYSTICK  \\\n\t-D__CONIO_GRAPHICS  -D__BIT_BANG_SOUND --generic-console \\\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.z80 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z9001_SLOWDOWN) \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm\n\nz9001:\n\t$(Z88DK_PATH)$(MYZ88DK) +z9001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\n\t-D__Z9001__ -vn  -D__SCREEN_MODE=1 -D_XL_NO_JOYSTICK  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z9001_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND --generic-console \\\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.z80 \\\n\t$(FULL_FILES) \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm\n\n#############################\n# KC\n\nkc: $(ASSETS_PATH)/z88dk_xchase.asm \n\t$(Z88DK_PATH)$(MYZ88DK) +kc $(SCCZ80_OPTS) -subtype=tap $(INCLUDE_OPTS) \\\n\t-D__KC__ \\\n\t-D__VT52 \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_JOYSTICK \\\n\t-lndos \\\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_KC_SLOWDOWN) \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\n\t$(FULL_FILES) \\\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_kc.bin\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_kc.bin\n\n\n\n#################################################################\n# CMOC\n\n\n#################################################################\n\nCMOC_NO_UDG_OPTS        ?= $(CMOC_MAKEFILE_COMPILATION_OPTS) -Wno-const  -D__ALT_SLEEP  -D__DEFAULT_CLEAR_SCREEN -D__CMOC__  \n\nNO_UDG_OPS              ?= $(CMOC_NO_UDG_OPTS) -D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG -D__ALT_PRINT -D_XL_SLOW_DOWN_FACTOR=4000\n\nCOCO_OPTS               ?= -D__COCO__ $(NO_UDG_OPS) -D_XL_NO_COLOR  -D_XL_NO_JOYSTICK\n\nDRAGON_OPTS             ?= --dragon -D__COCO__ $(NO_UDG_OPS) -D_XL_NO_COLOR  -D_XL_NO_JOYSTICK\n\n\nCOCO_COMPILE_OPTS       ?= $(COCO_OPTS) \n\nDRAGON_COMPILE_OPTS     ?= $(DRAGON_OPTS) \n\n\nDRAGON_GFX_OPTS         ?= --dragon -D__DRAGON__ $(GFX_OPTS) -D_XL_NO_JOYSTICK\n\nDRAGON_GFX_COMPILE_OPTS ?= $(DRAGON_GFX_OPTS) \n\nCMOC_OPTS               ?= $(CMOC_MAKEFILE_COMPILATION_OPTS) -Wno-const  -D__ALT_SLEEP  -D__DEFAULT_CLEAR_SCREEN -D__CMOC__  \n\n\nGFX_OPTS                ?= $(CMOC_OPTS) -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COCO_SLOWDOWN)\n\n\nCOCO_GFX_OPTS           ?= -D__COCO__ $(GFX_OPTS) -D_XL_NO_COLOR -D_XL_NO_JOYSTICK\n\n\n\nCOCO_GFX_COMPILE_OPTS      ?= $(COCO_GFX_OPTS)  \n\n\n# ? BACKGROUND_COLOR white\nGFX_COLOR_OPTS              ?= $(CMOC_OPTS)  -D_XL_NO_JOYSTICK -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT   \n\nCOCO_COLOR_GFX_OPTS         ?= -D__COCO__ $(GFX_COLOR_OPTS) -D__BIT_MAPPED_4_GRAPHICS $(COCO_COLOR_GFX_GAME_OPTS) -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COCO_SLOWDOWN)\n\nCOCO_COLOR_GFX_COMPILE_OPTS ?= $(COCO_COLOR_GFX_OPTS)\n\nCOCO3_COLOR_GFX_OPTS         ?= -D__COCO3__ $(GFX_COLOR_OPTS) -D__BIT_MAPPED_16_GRAPHICS $(COCO3_COLOR_GFX_GAME_OPTS) -DXSize=32 -DYSize=24 -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COCO3_SLOWDOWN)\n\nCOCO3_COLOR_GFX_COMPILE_OPTS ?= $(COCO3_COLOR_GFX_OPTS)\n\nTHOMSON_OPTS    ?= $(CMOC_MAKEFILE_COMPILATION_OPTS) -D__ALT_SLEEP  -Wno-const -D__CMOC__ -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT\n\nMO5_OPTS        ?= $(THOMSON_OPTS)  -DXSize=39 -D_XL_NO_JOYSTICK -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MO5_SLOWDOWN) -D__MO5__\n\nTO7_OPTS        ?= $(THOMSON_OPTS)  -DXSize=39 -D_XL_NO_JOYSTICK -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TO7_SLOWDOWN) -D__TO7__ \n\nTO7_ORG_DATA    ?= --org=a000 \n\n#############################################################################################\n\n\ndragon: coco\ndragon_mono: coco_mono\n\nifdef USE_TOOLS\ncoco_mono: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\nelse\ncoco_mono: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\nendif\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco/coco_init_graphics.c\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(SOURCE_PATH)/main.c\n\t$(CMOC) -o $(BUILD_PATH)/XBIN.BIN \\\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\n\tmain.o coco_init_graphics.o \\\n\tdisplay_macros.o dac_sounds.o \\\n\tmemory_mapped_alt_print.o sleep_macros.o \\\n\tcmoc_udc_tiles_and_fonts.o \\\n\tinput_macros.o\n\trm main.o dac_sounds.o coco_init_graphics.o display_macros.o sleep_macros.o \\\n\tcmoc_udc_tiles_and_fonts.o \\\n\tmemory_mapped_alt_print.o \\\n\tinput_macros.o\nifdef USE_TOOLS\t\n\tmv $(BUILD_PATH)/XBIN.BIN XBIN.BIN\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XBIN.BIN\n\tmv XBIN.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_coco_dragon_mono.cas -C XBIN.BIN -A\nelse\n\tmv $(BUILD_PATH)/XBIN.BIN $(BUILD_PATH)/X$(GAME_NAME)_$@_dragon.bin\nendif\nifeq ($(DO_WIN),1)   \nifdef USE_TOOLS\n\t$(TOOLS_PATH)/cmoc/dragon/File2VDK.exe $(BUILD_PATH)/XBIN.BIN\n\tmv $(BUILD_PATH)/XBIN.BIN.vdk $(BUILD_PATH)/X$(GAME_NAME)_dragon_mono.vdk\nendif\nendif\n\trm -rf $(BUILD_PATH)/XBIN.BIN\n\trm -rf XBIN.BIN\n\trm -rf A80\n\trm -rf A80.LDR\n\n\ncoco_targets: \\\n    coco coco_mono coco3\n\ncoco_color: coco\ndragon_color: dragon\n\nifdef USE_TOOLS\ncoco: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\nelse\ncoco: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\nendif\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco/coco_init_graphics.c\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\n\t$(CMOC) \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(SOURCE_PATH)/main.c\n\t$(CMOC) -o $(BUILD_PATH)/XBIN.BIN \\\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\tmain.o coco_init_graphics.o \\\n\tdisplay_macros.o dac_sounds.o \\\n\tmemory_mapped_alt_print.o sleep_macros.o \\\n\tcmoc_udc_tiles_and_fonts.o \\\n\tinput_macros.o\n\trm main.o dac_sounds.o coco_init_graphics.o display_macros.o sleep_macros.o \\\n\tcmoc_udc_tiles_and_fonts.o \\\n\tmemory_mapped_alt_print.o \\\n\tinput_macros.o\nifdef USE_TOOLS\t\n\tmv $(BUILD_PATH)/XBIN.BIN XBIN.BIN\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XBIN.BIN\n\tmv XBIN.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_coco_dragon.cas -C XBIN.BIN -A\nelse\n\tmv $(BUILD_PATH)/XBIN.BIN $(BUILD_PATH)/X$(GAME_NAME)_$@_dragon.bin\nendif\nifeq ($(DO_WIN),1)   \nifdef USE_TOOLS\n\t$(TOOLS_PATH)/cmoc/dragon/File2VDK.exe $(BUILD_PATH)/XBIN.BIN\n\tmv $(BUILD_PATH)/XBIN.BIN.vdk $(BUILD_PATH)/X$(GAME_NAME)_dragon.vdk\nendif\nendif\n\trm -rf $(BUILD_PATH)/XBIN.BIN\n\trm -rf XBIN.BIN\n\trm -rf A80\n\trm -rf A80.LDR\n\n\n# coco3: coco3_gfx\n\t\ncoco3: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\n\t$(CMOC) \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\n\t$(CMOC) \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\n\t$(CMOC) \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\n\t$(CMOC) \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco3/coco3_init_graphics.c\n\t$(CMOC) \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\n\t$(CMOC) \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\n\t$(CMOC) \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\n\t$(CMOC) -o $(BUILD_PATH)/xbin.bin \\\n\t$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \\\n\t$(SOURCE_PATH)/main.c \\\n\tdisplay_macros.o dac_sounds.o sleep_macros.o \\\n\tcoco3_init_graphics.o \\\n\tmemory_mapped_alt_print.o \\\n\tinput_macros.o cmoc_udc_tiles_and_fonts.o\n\trm -rf \\\n\tdisplay_macros.o dac_sounds.o sleep_macros.o \\\n\tcoco3_init_graphics.o \\\n\tmemory_mapped_alt_print.o \\\n\tinput_macros.o cmoc_udc_tiles_and_fonts.o\nifdef USE_TOOLS\n\tmv $(BUILD_PATH)/xbin.bin XBIN.BIN\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XBIN.BIN\n\tmv XBIN.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@.cas -C XBIN.BIN -A\n\trm XBIN.BIN\nelse\n\tmv $(BUILD_PATH)/xbin.bin $(BUILD_PATH)/X$(GAME_NAME)_$@_dragon.bin\nendif\n\n\ncoco3_targets: \\\n\tcoco3_gfx\n\n\n########################################\n\n\nifdef USE_TOOLS\nmo5: $(ASSETS_PATH)/cmoc_udc_tiles.s $(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)\nelse\nmo5: $(ASSETS_PATH)/cmoc_udc_tiles.s\nendif\n\t$(CMOC) \\\n\t$(MO5_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\n\t$(CMOC) \\\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/alt_print/mo5_alt_print.c \n\t$(CMOC) \\\n\t$(MO5_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\n\t$(CMOC) \\\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/mo5/mo5_init_graphics.c\n\t$(CMOC) \\\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\n\t$(CMOC) \\\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\n\t$(CMOC) \\\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles.s\t\n\t$(CMOC) -o $(BUILD_PATH)/FULL_MO5.bin \\\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\n\t$(SOURCE_PATH)/main.c \\\n\tmo5_alt_print.o dac_sounds.o \\\n\tmo5_init_graphics.o \\\n\tdisplay_macros.o \\\n\tcmoc_udc_tiles.o \\\n\tsleep_macros.o \\\n\tinput_macros.o\n\trm \\\n\tmo5_alt_print.o dac_sounds.o \\\n\tcmoc_udc_tiles.o \\\n\tmo5_init_graphics.o \\\n\tdisplay_macros.o \\\n\t\\\n\tinput_macros.o sleep_macros.o\nifdef USE_TOOLS\n\t$(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) $(BUILD_PATH)/FULL_MO5.bin\n\tmv $(BUILD_PATH)/FULL_MO5.bin .\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) -c X$(GAME_NAME)_MO5.sap\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) --add X$(GAME_NAME)_MO5.sap FULL_MO5.bin\n\tmv ./X$(GAME_NAME)_MO5.sap $(BUILD_PATH)\n\tmv ./FILE.K5 $(BUILD_PATH)/X$(GAME_NAME)_MO5.k5\n\trm ./FULL_MO5.bin\nelse\n\tmv $(BUILD_PATH)/FULL_MO5.bin $(BUILD_PATH)/X$(GAME_NAME)_MO5.bin\nendif\n\n\nmo5_targets: \\\n\tmo5\n\nifdef USE_TOOLS\nto7: $(ASSETS_PATH)/cmoc_udc_tiles.s $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)\nelse\nto7: $(ASSETS_PATH)/cmoc_udc_tiles.s\nendif\n\t$(CMOC) \\\n\t$(TO7_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\t\n\t$(CMOC) \\\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/alt_print/mo5_alt_print.c \n\t$(CMOC) \\\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/mo5/mo5_init_graphics.c\n\t$(CMOC) \\\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\n\t$(CMOC) \\\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\n\t$(CMOC) \\\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\n\t$(CMOC) \\\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles.s\t\n\t$(CMOC) $(TO7_ORG_DATA) -o $(BUILD_PATH)/XLIB.bin \\\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\n\t$(SOURCE_PATH)/main.c \\\n\tmo5_alt_print.o dac_sounds.o \\\n\tmo5_init_graphics.o \\\n\tdisplay_macros.o \\\n\tcmoc_udc_tiles.o \\\n\t\\\n\tinput_macros.o sleep_macros.o\n\trm \\\n\tmo5_alt_print.o dac_sounds.o \\\n\tcmoc_udc_tiles.o \\\n\tmo5_init_graphics.o \\\n\tdisplay_macros.o \\\n\t\\\n\tinput_macros.o sleep_macros.o\nifdef USE_TOOLS\n\tmv $(BUILD_PATH)/XLIB.bin .\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) -c X$(GAME_NAME)_TO7.sap\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) --add X$(GAME_NAME)_TO7.sap XLIB.bin\n\tmv ./X$(GAME_NAME)_TO7.sap $(BUILD_PATH)\n\trm ./XLIB.bin\nelse\n\tmv $(BUILD_PATH)/XLIB.bin $(BUILD_PATH)/X$(GAME_NAME)_TO7.bin\nendif\n\n\nto7_targets: \\\n\tto7\n\n#################################################################\n# LCC1802\n\n\n#################################################################\n\n\nfull_combo_rand.c: \n\tcat  $(FULL_FILES) > $(SOURCE_PATH)/../full_combo_rand.c\n\n# ------------------------------------------------------------------------------------------\n# LCC1802\n#    -target=xr18CX\n# https://sites.google.com/site/lcc1802/downloads/Quarrantine.zip?attredirects=0&d=1\n\n\n\nifeq ($(DO_WIN),1)\n\nLCC1802_OPTS ?= -target=xr18CX $(LCC1802_MAKEFILE_COMPILATION_OPTS)\nBASIC_OPTS ?= $(LCC1802_OPTS) \"-Wa-D LCCCX=1\" \"-Wa-D LCCNOLONG\"\nCOMX_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x4401\" \nPECOM_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x201\" \nTMC600_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x6300\"\nCIDELSA_OPTS ?= $(LCC1802_OPTS)  \"-Wa-D CODELOC=0\"  \"-Wa-D NOFILLBSS=1\" \nDRACO_32K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x8000\" \"-Wa-D STACKLOC=0x83ff\"\nDRACO_16K_OPTS ?= $(CIDELSA_OPTS)  \"-Wa-D DATALOC=0x4000\" \"-Wa-D STACKLOC=0x43ff\"\nALTAIR_24K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x6000\" \"-Wa-D STACKLOC=0x60ff\"\nALTAIR_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x3000\" \"-Wa-D STACKLOC=0x30ff\"\nDESTROYER_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x3000\" \"-Wa-D STACKLOC=0x30ff\"\nDESTROYER_8K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x2000\" \"-Wa-D STACKLOC=0x20ff\"\n\nPIXIE_4K_OPTS ?= \"-Wa-D LCCCX=1\" -D__VIP__ -DRES=64 -DVIDMEM=0xF00 \"-Wa-D STACKLOC=0xDFF\"\n\n\nMICROBOARD_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x8000\" \"-Wa-D STACKLOC=0x9fff\"\n\nMICROBOARD_PAL_1_OPTS ?= $(MICROBOARD_OPTS) \"-DPAL=1\"\nMICROBOARD_PAL_2_OPTS ?= $(MICROBOARD_OPTS) \"-DPAL=2\"\n\nMICROBOARD_NTSC_1_OPTS ?= $(CIDELSA_OPTS) \"-DNTSC=1\"\nMICROBOARD_NTSC_3_OPTS ?= $(CIDELSA_OPTS) \"-DNTSC=3\"\n\nelse\n\n# LCC under Linux:\n# \"-Wa-D CODELOC=0x2000\" becomes \"-Wa-D\" \"-WaCODELOC=0x2000\" However, multiple symbols can still be combined as \"-Wa-D\" \"-WaCODELOC=0x2000,STACKLOC=7fff\"\n\n#/cygdrive/c/lcc42/bat/caCX.bat\n#/cygdrive/c/lcc42/bin/lcc.exe\n\n\nLCC1802_OPTS ?= -target=xr18CX $(LCC1802_MAKEFILE_COMPILATION_OPTS)\nBASIC_OPTS ?= $(LCC1802_OPTS) \"-Wa-D\" \"-WaLCCCX=1\" \"-Wa-D\" \"-WaLCCNOLONG\"\nCOMX_OPTS ?= $(BASIC_OPTS) \"-Wa-D\" \"-WaCODELOC=0x4401\" \nPECOM_OPTS ?= $(BASIC_OPTS) \"-Wa-D\" \"-WaCODELOC=0x201\" \nTMC600_OPTS ?= $(BASIC_OPTS) \"-Wa-D\" \"-WaCODELOC=0x6300\"\nCIDELSA_OPTS ?= $(LCC1802_OPTS)  \"-Wa-D\" \"-WaCODELOC=0,NOFILLBSS=1\" \nDRACO_32K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D\" \"-WaDATALOC=0x8000,STACKLOC=0x83ff\"\nDRACO_16K_OPTS ?= $(CIDELSA_OPTS)  \"-Wa-D\" \"-WaDATALOC=0x4000,STACKLOC=0x43ff\"\nALTAIR_24K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D\" \"-WaDATALOC=0x6000,STACKLOC=0x60ff\"\nALTAIR_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D\" \"-WaDATALOC=0x3000,STACKLOC=0x30ff\"\nDESTROYER_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D\" \"-WaDATALOC=0x3000,STACKLOC=0x30ff\"\nDESTROYER_8K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D\" \"-WaDATALOC=0x2000,STACKLOC=0x20ff\"\n\nPIXIE_4K_OPTS ?= \"-Wa-D\" \"-WaLCCCX=1\" -D__VIP__ -DRES=64 -DVIDMEM=0xF00,STACKLOC=0xDFF\"\n\n\nMICROBOARD_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x8000,STACKLOC=0x9fff\"\n\nMICROBOARD_PAL_1_OPTS ?= $(MICROBOARD_OPTS) \"-DPAL=1\"\nMICROBOARD_PAL_2_OPTS ?= $(MICROBOARD_OPTS) \"-DPAL=2\"\n\nMICROBOARD_NTSC_1_OPTS ?= $(CIDELSA_OPTS) \"-DNTSC=1\"\nMICROBOARD_NTSC_3_OPTS ?= $(CIDELSA_OPTS) \"-DNTSC=3\"\n\nendif\n\n\n\n# @c:\\lcc42\\bin\\lcc.exe \"-target=xr18CX\" \"-Wf-g,;\"  \"-Wf-volatile\" -O \"-Wp-D nofloats\" \"-Wa-D LCCNOLONG\" -D__MICRO__ -DNTSC=1 -S %2 %3 %4 %5 %6 %1.c \n# @IF ERRORLEVEL 1 GOTO quit\n# @c:\\lcc42\\bin\\copt c:\\lcc42\\include\\lcc1806.opt -I %1.asm -O %1.oasm\n# @c:\\lcc42\\bin\\asw -cpu 1802 -quiet -D NOFILLBSS=1 -D DATALOC=0x8000 -D CODELOC=0 -D STACKLOC=0x9fff -P -x -i ..\\..\\..\\include -L %1.oasm\n# @c:\\lcc42\\bin\\p2hex -r $-$ %1 %1_microboard_ntsc1_4_8 | more +2\n# @:quit\n\n\n# @c:\\lcc42\\bin\\lcc.exe \"-target=xr18CX\" \"-Wf-g,;\"  \"-Wf-volatile\" -O \"-Wp-D nofloats\" \"-Wa-D LCCNOLONG\" -D__MICRO__ -DNTSC=3 -S %2 %3 %4 %5 %6 %1.c \n# @IF ERRORLEVEL 1 GOTO quit\n# @c:\\lcc42\\bin\\copt c:\\lcc42\\include\\lcc1806.opt -I %1.asm -O %1.oasm\n# @c:\\lcc42\\bin\\asw -cpu 1802 -quiet -D NOFILLBSS=1 -D DATALOC=0x8000 -D CODELOC=0 -D STACKLOC=0x9fff -P -x -i ..\\..\\..\\include -L %1.oasm\n# @c:\\lcc42\\bin\\p2hex -r $-$ %1 %1_microboard_ntsc3 | more +2\n# @:quit\n\n\n\n################################################################################\n\n\n\nCOMX_REDUCED_EXTRA_FILES ?= \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/comx_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c \n\nCOMX_COLOR_GRAPHICS_REDUCED_EXTRA_FILES ?= \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/comx_color_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c \n\nCOMX_EXTRA_FILES ?= \\\n\t$(COMX_REDUCED_EXTRA_FILES) \\\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\n\t$(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c\n\nCOMX_COLOR_GRAPHICS_EXTRA_FILES ?= \\\n\t$(COMX_COLOR_GRAPHICS_REDUCED_EXTRA_FILES) \\\n\t$(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c\n\nCOMX_EXTRA_FILES_WTIH_END_SCREEN ?= \\\n\t$(COMX_EXTRA_FILES) \n\nCOMX_COLOR_GRAPHICS_EXTRA_FILES_WTIH_END_SCREEN ?= \\\n\t$(COMX_COLOR_GRAPHICS_EXTRA_FILES)\n\n\nreduced_full_lcc1802_combo.c: full_combo_rand.c\n\tcat \\\n\t$(COMX_REDUCED_EXTRA_FILES) $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \\\n\t$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\n\nreduced_full_lcc1802_color_combo.c: full_combo_rand.c\n\tcat \\\n\t$(COMX_COLOR_GRAPHICS_EXTRA_FILES) $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \\\n\t$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\nfull_lcc1802_combo.c: full_combo_rand.c\n\tcat \\\n\t$(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \\\n\t$(COMX_EXTRA_FILES_WTIH_END_SCREEN) \\\n\t$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../full_lcc1802_combo.c\n\n\nreduced_full_lcc1802_micro_combo.c: full_combo_rand.c\n\tcat \\\n\t$(MICRO_COLOR_REDUCED_EXTRA_FILES) $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \\\n\t$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\n\nclean_combo_files:\n\trm -rf $(SOURCE_PATH)/../full_combo_rand.c\n\trm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\n\trm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\n\trm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\trm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\n\nLCC1802_COLOR_BASIC_C_OPTS ?= \\\n\t-D__LCC1802__ \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D__COMX_COLOR_GRAPHICS \\\n\t-D__ALT_PRINT\n\nLCC1802_BASIC_C_OPTS ?= \\\n\t-D__LCC1802__ \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D__MEMORY_MAPPED_GRAPHICS \\\n\t-D__ALT_PRINT\n\n\nLCC1802_C_OPTS ?= \\\n\t$(LCC1802_BASIC_C_OPTS) \\\n\t \\\n\t-D__ALT_SLEEP \\\n\n\nLCC1802_C_OPTS_NO_SOUNDS ?= \\\n\t$(LCC1802_BASIC_C_OPTS) \\\n\t-D__ALT_SLEEP \\\n\nREDUCED_LCC1802_C_OPTS ?= \\\n\t$(LCC1802_BASIC_C_OPTS) \\\n\t-D_XL_NO_SLEEP\n\nPIXIE_C_OPTS ?= \\\n\t-D__LCC1802__ \\\n\t-D__NO_SCREEN_COLOR_INIT \\\n\t-D__NO_PRINT \\\n\t-D__NO_SLEEP\n\nLCC1802_COLOR_C_OPTS ?= \\\n\t$(LCC1802_COLOR_BASIC_C_OPTS) \\\n\t-D__ALT_SLEEP\n\n\nLCC1802_COLOR_C_OPTS_NO_SOUNDS ?= \\\n\t$(LCC1802_COLOR_BASIC_C_OPTS) \\\n\t-D__ALT_SLEEP\n\nREDUCED_LCC1802_COLOR_C_OPTS ?= \\\n\t$(LCC1802_COLOR_BASIC_C_OPTS) \\\n\t-D_XL_NO_SLEEP\n\nMICRO_COLOR_REDUCED_EXTRA_FILES ?= \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/micro_color_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c \n\nMICRO_COLOR_EXTRA_FILES ?= \\\n\t$(MICRO_COLOR_REDUCED_EXTRA_FILES) \\\n\t$(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c\n\nMICRO_COLOR_EXTRA_FILES_WTIH_END_SCREEN ?= \\\n\t$(MICRO_COLOR_EXTRA_FILES) \n\n###############################################################################\n# COMX\n\n_full_comx: _comx\n\n\n_comx_buffered: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS)  \\\n\t-D__COMX__  $(COMX_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\ncomx_buffered: \\\n    _comx_buffered \\\n    clean_combo_files\n\n# -D__LCC1802_UNBUFFERED\n_comx: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) -D__LCC1802_UNBUFFERED  \\\n\t-D__COMX__  $(COMX_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\ncomx: \\\n    _comx \\\n    clean_combo_files\n\n\n\n\n# Interrupt-driver graphics\n_comx_int: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) -DVIS_INT  \\\n\t-D__COMX__  \\\n\t$(COMX_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\ncomx_int: \\\n    _comx_int \\\n    clean_combo_files\n\n\n_comx_ntsc: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x8_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS)  \\\n\t-D__COMX__  -DNTSC $(COMX_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\ncomx_ntsc: \\\n    _comx_ntsc \\\n    clean_combo_files\n\n# VIP \n_vip: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/4x4_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PIXIE_4K_OPTS)  \\\n\t-D__VIP__  $(VIP_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIP_SLOWDOWN) \\\n\t$(PIXIE_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\nvip: \\\n    _vip \\\n    clean_combo_files\n\n\n###############################################################################\n# MICRO\n\n\n_micro_pal2: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x9_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_PAL_2_OPTS)  \\\n\t-D__MICRO__ \\\n\t-D__COMX_COLOR_GRAPHICS  \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MICRO_SLOWDOWN) \\\n\t$(MICRO_GAME_OPTS)  \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\n_micro_pal1: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x8_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_PAL_1_OPTS)  \\\n\t-D__MICRO__ \\\n\t-D__COMX_COLOR_GRAPHICS  \\\n\t$(MICRO_GAME_OPTS)  \\\n\t \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\n\n_micro_ntsc1: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x8_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_NTSC1_OPTS)  \\\n\t-D__MICRO__ -DNTSC \\\n\t-D__COMX_COLOR_GRAPHICS  \\\n\t$(MICRO_GAME_OPTS)  \\\n\t \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\n\nmicro_pal1: \\\n    _micro_pal1 \\\n    clean_combo_files\n    \nmicro_ntsc1: \\\n    _micro_ntsc1 \\\n    clean_combo_files\n\nmicro_pal2: \\\n    _micro_pal2 \\\n    clean_combo_files\n\n_micro: _micro_pal2\n\nmicro: \\\n    _micro \\\n    clean_combo_files\n\n###############################################################################\n# PECOM\n\n\n_full_pecom: _pecom\n\n_pecom: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PECOM_OPTS)  \\\n\t-D__PECOM__  $(PECOM_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PECOM_SLOWDOWN) \\\n\t$(PECOM_GAME_OPTS)  \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\npecom: \\\n    _pecom \\\n    clean_combo_files\n\n###############################################################################\n# TMC600\n\n\n_full_tmc600: _tmc600_37k\n_tmc600: _tmc600_37k\n\n# -savetemps -S\n_tmc600_37k: full_lcc1802_combo.c \n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(TMC600_OPTS)  \\\n\t-D__TMC600__   $(TMC600_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TMC600_SLOWDOWN) \\\n\t-D_XL_NO_UDG \\\n\t$(LCC1802_C_OPTS) \\\n\t$(SOURCE_PATH)/../full_lcc1802_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_tmc600_37k.hex\n\ntmc600: \\\n    _tmc600 \\\n    clean_combo_files\n\n###############################################################################\n# CIDELSA DRACO\n\n\n_cidelsa: _cidelsa_draco\n\n_cidelsa_draco: _cidelsa_draco_32k\n\n_cidelsa_draco_32k: reduced_full_lcc1802_color_combo.c\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DRACO_32K_OPTS)  \\\n\t-D__CIDELSA__ -D__DRACO__  \\\n\t-D_XL_NO_COLOR -D_XL_NO_UDG \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CIDELSA_SLOWDOWN) \\\n\t$(LCC1802_COLOR_C_OPTS) \\\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\n\tmv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\n\ncidelsa: \\\n    _cidelsa \\\n    clean_combo_files\n\n###############################################################################\n\n\ncomx_targets: comx comx_ntsc\n\npecom_targets: pecom\n\ntmc600_targets: tmc600_37k\n\ncidelsa_targets: $(MAKE) cidelsa_draco_32k\n\n\n\n\n###############################################################################################\n\n\nmc10:\n\tcc68 -tmc10  $(CC6303_MC10_OPTS) $(INCLUDE_OPTS) $(GLOBAL_OPTS) \\\n\t-D__MC10__ \\\n\t$(MC10_COLORS) \\\n\t-DXSize=32 \\\n\t-DYSize=16 \\\n\t-D__MEMORY_MAPPED_GRAPHICS -D_XL_NO_JOYSTICK \\\n\t-D_XL_NO_COLOR -D__TARGET_SPECIFIC_ASCII \\\n\t-D__ALT_SLEEP -D__ALT_RAND \\\n\t-D__NO_INIT_GRAPHICS \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MC10_SLOWDOWN) \\\n\t-D__DEFAULT_CLEAR_SCREEN -D__ALT_PRINT  \\\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\n\t$(FULL_FILES) \\\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t-o xbin\n\trm xbin\n\tmv xbin.c10 $(BUILD_PATH)/X$(GAME_NAME)_$@.c10\n\n\n###############################################################################################\n# GCC\n#\n\n\nncurses_targets: \\\n\tncurses\n    \n\nGCC_OPTS = $(GLOBAL_OPTS) $(NATIVE_MAKEFILE_COMPILATION_OPTS)    \n    \n###############################################################################################\n\n\nncurses_sized:\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) -D__NCURSES__ \\\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NCURSES_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES)\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_ncurses_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\n\n\nncurses:\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) -D__NCURSES__ \\\n\t\\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NCURSES_SLOWDOWN) \\\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_ncurses$(COMPILEDEXT)\n\n\nterminal8x8_sized:  $(ASSETS_PATH)/8x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_terminal8x8_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\n\n\nterminal: terminal8x8\n\nterminal8x8:  $(ASSETS_PATH)/8x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -DXSize=20 -DYSize=18 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)\n\n\nterminal8x6_sized:  $(ASSETS_PATH)/8x6_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -D_XL_TILE_X_SIZE=8 -D_XL_TILE_Y_SIZE=6 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_terminal8x6_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\n\n\nterminal8x6:  $(ASSETS_PATH)/8x6_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -DXSize=20 -DYSize=17 -D_XL_TILE_X_SIZE=8 -D_XL_TILE_Y_SIZE=6 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)\n\n\nterminal7x8_sized:  $(ASSETS_PATH)/7x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -D_XL_TILE_X_SIZE=7 -D_XL_TILE_Y_SIZE=8 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_terminal7x8_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\n\n\nterminal7x8:  $(ASSETS_PATH)/7x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -DXSize=20 -DYSize=24 -D_XL_TILE_X_SIZE=7 -D_XL_TILE_Y_SIZE=8 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)\n\n\nterminal6x8_sized:  $(ASSETS_PATH)/6x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=8 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_terminal6x8_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\n\n\nterminal6x8:  $(ASSETS_PATH)/6x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -DXSize=40 -DYSize=24 -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=8 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)\n\n\nterminal6x9_sized:  $(ASSETS_PATH)/6x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=9 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_terminal6x9_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\n\nterminal6x9:  $(ASSETS_PATH)/6x8_chars.h\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \\\n\t-D__TERMINAL__ -D_XL_NO_JOYSTICK \\\n\t-D__ALT_PRINT -DXSize=40 -DYSize=24 -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=9 \\\n\t$(NCURSES_GAME_OPTS) \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \\\n\t$(FULL_FILES) \\\n\t-l$(NCURSES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)\n\n##\n\n\nstdio_buffered: stdio\n# \nstdio:\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__STDIO $(STDIO_GAME_OPTS) \\\n\t-D_XL_NO_JOYSTICK \\\n\t-DXSize=32 -DYSize=24 \\\n\t-D_XL_NO_COLOR \\\n\t$(NCURSES_GAME_OPTS) \\\n\t-D_XL_TURN_BASED \\\n\t-D__BUFFERED_GRAPHICS \\\n\t-D__NO_INIT_GRAPHICS \\\n\t-D__ALT_PRINT \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES) \\\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)\n\nstdio_sized:\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) \\\n\t-D__STDIO $(STDIO_GAME_OPTS) \\\n\t-D_XL_NO_JOYSTICK \\\n\t-D_XL_NO_COLOR \\\n\t$(NCURSES_GAME_OPTS) \\\n\t-D_XL_TURN_BASED \\\n\t-D__BUFFERED_GRAPHICS \\\n\t-D__NO_INIT_GRAPHICS \\\n\t-D__ALT_PRINT \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\n\t$(FULL_FILES)\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_stdio_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\n\n\n################\n# Experimental targets\n\n# CC65\ninclude makefiles.common/targets/cc65/Makefile_c128_8502\ninclude makefiles.common/targets/cc65/Makefile_cx16\ninclude makefiles.common/targets/cc65/Makefile_c65\ninclude makefiles.common/targets/cc65/Makefile_osic1p\ninclude makefiles.common/targets/cc65/Makefile_telestrat\ninclude makefiles.common/targets/cc65/Makefile_kim1\ninclude makefiles.common/targets/cc65/Makefile_sym1\n\n\n\n# Z88DK\ninclude makefiles.common/targets/z88dk/Makefile_abc80\ninclude makefiles.common/targets/z88dk/Makefile_abc800\ninclude makefiles.common/targets/z88dk/Makefile_alphatro\ninclude makefiles.common/targets/z88dk/Makefile_altair8800\ninclude makefiles.common/targets/z88dk/Makefile_attache\ninclude makefiles.common/targets/z88dk/Makefile_aussie\ninclude makefiles.common/targets/z88dk/Makefile_bee\ninclude makefiles.common/targets/z88dk/Makefile_bic\ninclude makefiles.common/targets/z88dk/Makefile_bit90\ninclude makefiles.common/targets/z88dk/Makefile_bondwell\ninclude makefiles.common/targets/z88dk/Makefile_bondwell2\ninclude makefiles.common/targets/z88dk/Makefile_c7420\ninclude makefiles.common/targets/z88dk/Makefile_coleco_adam\ninclude makefiles.common/targets/z88dk/Makefile_corvette\ninclude makefiles.common/targets/z88dk/Makefile_dai\ninclude makefiles.common/targets/z88dk/Makefile_dmv\ninclude makefiles.common/targets/z88dk/Makefile_eg2k\ninclude makefiles.common/targets/z88dk/Makefile_einstein\ninclude makefiles.common/targets/z88dk/Makefile_enterprise\ninclude makefiles.common/targets/z88dk/Makefile_excalibur64\ninclude makefiles.common/targets/z88dk/Makefile_fp1100\ninclude makefiles.common/targets/z88dk/Makefile_g800\ninclude makefiles.common/targets/z88dk/Makefile_gemini\ninclude makefiles.common/targets/z88dk/Makefile_gl4000\ninclude makefiles.common/targets/z88dk/Makefile_gl6000sl\ninclude makefiles.common/targets/z88dk/Makefile_hemc\ninclude makefiles.common/targets/z88dk/Makefile_hgmc\ninclude makefiles.common/targets/z88dk/Makefile_homelab\ninclude makefiles.common/targets/z88dk/Makefile_homelab2\ninclude makefiles.common/targets/z88dk/Makefile_kaypro\ninclude makefiles.common/targets/z88dk/Makefile_kaypro83\ninclude makefiles.common/targets/z88dk/Makefile_kramermc\ninclude makefiles.common/targets/z88dk/Makefile_krokha\ninclude makefiles.common/targets/z88dk/Makefile_lambda\ninclude makefiles.common/targets/z88dk/Makefile_lm80c\ninclude makefiles.common/targets/z88dk/Makefile_lviv\ninclude makefiles.common/targets/z88dk/Makefile_m5\ninclude makefiles.common/targets/z88dk/Makefile_mbc200\ninclude makefiles.common/targets/z88dk/Makefile_micro8085\ninclude makefiles.common/targets/z88dk/Makefile_mikro80\ninclude makefiles.common/targets/z88dk/Makefile_multi8\ninclude makefiles.common/targets/z88dk/Makefile_myvision\ninclude makefiles.common/targets/z88dk/Makefile_mz2500\ninclude makefiles.common/targets/z88dk/Makefile_nascom\ninclude makefiles.common/targets/z88dk/Makefile_nc100\ninclude makefiles.common/targets/z88dk/Makefile_nc200\ninclude makefiles.common/targets/z88dk/Makefile_newbrain\ninclude makefiles.common/targets/z88dk/Makefile_ondra\ninclude makefiles.common/targets/z88dk/Makefile_osborne1\ninclude makefiles.common/targets/z88dk/Makefile_osca\ninclude makefiles.common/targets/z88dk/Makefile_oz\ninclude makefiles.common/targets/z88dk/Makefile_p2000\ninclude makefiles.common/targets/z88dk/Makefile_pasopia7\ninclude makefiles.common/targets/z88dk/Makefile_pc6001\ninclude makefiles.common/targets/z88dk/Makefile_pcw40\ninclude makefiles.common/targets/z88dk/Makefile_pcw80\ninclude makefiles.common/targets/z88dk/Makefile_pencil2\ninclude makefiles.common/targets/z88dk/Makefile_phc25\ninclude makefiles.common/targets/z88dk/Makefile_pmd85\ninclude makefiles.common/targets/z88dk/Makefile_pps\ninclude makefiles.common/targets/z88dk/Makefile_primo\ninclude makefiles.common/targets/z88dk/Makefile_pv1000\ninclude makefiles.common/targets/z88dk/Makefile_pv2000\ninclude makefiles.common/targets/z88dk/Makefile_px4\ninclude makefiles.common/targets/z88dk/Makefile_px8\ninclude makefiles.common/targets/z88dk/Makefile_radio86\ninclude makefiles.common/targets/z88dk/Makefile_rc700\ninclude makefiles.common/targets/z88dk/Makefile_rx78\ninclude makefiles.common/targets/z88dk/Makefile_smc777\ninclude makefiles.common/targets/z88dk/Makefile_sol20\ninclude makefiles.common/targets/z88dk/Makefile_sos\ninclude makefiles.common/targets/z88dk/Makefile_spc1000\ninclude makefiles.common/targets/z88dk/Makefile_special\ninclude makefiles.common/targets/z88dk/Makefile_srr\ninclude makefiles.common/targets/z88dk/Makefile_super80\ninclude makefiles.common/targets/z88dk/Makefile_super80r\ninclude makefiles.common/targets/z88dk/Makefile_sv8000\ninclude makefiles.common/targets/z88dk/Makefile_svi\ninclude makefiles.common/targets/z88dk/Makefile_ti82\ninclude makefiles.common/targets/z88dk/Makefile_ti83\ninclude makefiles.common/targets/z88dk/Makefile_ti85\ninclude makefiles.common/targets/z88dk/Makefile_ti86\ninclude makefiles.common/targets/z88dk/Makefile_ti83p\ninclude makefiles.common/targets/z88dk/Makefile_tiki100\ninclude makefiles.common/targets/z88dk/Makefile_tim011\ninclude makefiles.common/targets/z88dk/Makefile_ts2068\ninclude makefiles.common/targets/z88dk/Makefile_tvc\ninclude makefiles.common/targets/z88dk/Makefile_v1050\ninclude makefiles.common/targets/z88dk/Makefile_vector06c\ninclude makefiles.common/targets/z88dk/Makefile_x07\ninclude makefiles.common/targets/z88dk/Makefile_x1\ninclude makefiles.common/targets/z88dk/Makefile_x820\ninclude makefiles.common/targets/z88dk/Makefile_z80tvgame\ninclude makefiles.common/targets/z88dk/Makefile_z88\ninclude makefiles.common/targets/z88dk/Makefile_zx80\ninclude makefiles.common/targets/z88dk/Makefile_zxn\n\ninclude makefiles.common/targets/z88dk/Makefile_misc_cpm\n\n\n# GCC4TI\ninclude makefiles.common/targets/gcc4ti/Makefile_ti99\n\n\n# VBCC\ninclude makefiles.common/targets/vbcc/Makefile_amiga\ninclude makefiles.common/targets/vbcc/Makefile_atari_jaguar\ninclude makefiles.common/targets/vbcc/Makefile_bbc\ninclude makefiles.common/targets/vbcc/Makefile_m65\n\n# ATARI_MINT_GCC\ninclude makefiles.common/targets/atari_mint_gcc/Makefile_atari_st\n\n\n# TODO: Fix and improve these targets\n# ACK\ninclude makefiles.common/targets/ack/Makefile.ack_targets\n\n\n\n########################################################################\n# Extras\n\n# Z88DK Extras\ninclude makefiles.common/targets/z88dk/extras/Makefile_agon\ninclude makefiles.common/targets/z88dk/extras/Makefile_camputers_lynx\ninclude makefiles.common/targets/z88dk/extras/Makefile_gal\ninclude makefiles.common/targets/z88dk/extras/Makefile_gal_plus\ninclude makefiles.common/targets/z88dk/extras/Makefile_c128\ninclude makefiles.common/targets/z88dk/extras/Makefile_cpc\ninclude makefiles.common/targets/z88dk/extras/Makefile_pc88\n\n\nz88dk_experimental_targets: \\\nabc80 \\\nabc800 \\\nalphatro \\\naltair8800 \\\nattache \\\naussie \\\nbic \\\nbit90 \\\nbondwell \\\nbondwell2 \\\ncoleco_adam \\\ncorvette \\\ndai \\\ndmv \\\neg2k \\\nenterprise \\\nexcalibur64 \\\nfp1100 \\\ng800 \\\ngemini \\\ngl4000 \\\ngl6000sl \\\nhemc \\\nhgmc \\\nhomelab \\\nhomelab2 \\\nkaypro \\\nkaypro83 \\\nkramermc \\\nkrokha \\\nlambda \\\nlm80c \\\nm5 \\\nmbc200 \\\nmicro8085 \\\nmikro80 \\\nmulti8 \\\nmyvision \\\nmz2500 \\\nnascom \\\nnc100 \\\nnc200 \\\nnewbrain \\\nondra \\\nosborne1 \\\nosca \\\noz \\\np2000 \\\npasopia7 \\\npc6001 \\\npc88 \\\npcw40 \\\npcw80 \\\npencil2 \\\npmd85 \\\npps \\\nprimo \\\npv1000 \\\npv2000 \\\npx4 \\\npx8 \\\nqc10 \\\nradio86 \\\nrc700 \\\nrx78 \\\nsmc777 \\\nsol20 \\\nsos \\\nspc1000 \\\nspecial \\\nsrr \\\nsuper80 \\\nsuper80r \\\nsv8000 \\\nsvi \\\nti82 \\\nti83 \\\nti85 \\\nti86 \\\nti83p \\\ntiki100 \\\ntim011 \\\nts2068 \\\ntvc \\\nv1050 \\\nvector06c \\\nx1 \\\nx820 \\\nz80tvgame \\\nz88 \\\nzx80 \\\nzxn\n\n\n"
  },
  {
    "path": "src/assets/LoggerSingleton.py",
    "content": "import logging\r\nimport datetime\r\n\r\n\r\n# global logger \r\n\r\n# logger = None\r\n\r\nclass LoggerSingleton:\r\n    \r\n    @staticmethod\r\n    def initLogger(name, path):\r\n        if name in logging.Logger.manager.loggerDict:\r\n            logger = logging.getLogger(name)\r\n            # print(\"Logger already exists\")\r\n            # print(str(logging.Logger.manager.loggerDict))\r\n        else:\r\n            # print(\"Logger does not exists, yet\")\r\n            # print(str(logging.Logger.manager.loggerDict))\r\n            logger = logging.getLogger(name)\r\n            logger.setLevel(logging.DEBUG)\r\n            if not logger.handlers:\r\n                # file_name='/cygdrive/c/Retro/CROSS-LIB/logs/log_'+datetime.datetime.now().strftime(\"%Y-%m-%d_%H_%M_%S\")+'.log'\r\n                \r\n                # file_name=path+'/log_'+name+'_'+datetime.datetime.now().strftime(\"%Y-%m-%d_%H_%M_%S\")+'.log'\r\n                file_name=path+'/log.log'\r\n                file_handler = logging.FileHandler(file_name,mode='a+', encoding=\"utf-8\")\r\n                formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)s - %(message)s')\r\n                file_handler.setFormatter(formatter)\r\n                logger.addHandler(file_handler)\r\n        return logger\r\n\r\n        \r\n    # @staticmethod\r\n    # def initConsoleLogger(name):\r\n        # if name in logging.Logger.manager.loggerDict:\r\n            # logger = logging.getLogger(name)\r\n        # else:\r\n            # logger = logging.getLogger(name)\r\n            # logger.setLevel(logging.DEBUG)\r\n            # if not logger.handlers:\r\n                # console_handler = logging.StreamHandler()\r\n                # formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)s - %(message)s')\r\n                # console_handler.setFormatter(formatter)\r\n                # logger.addHandler(console_handler)\r\n        # return logger  "
  },
  {
    "path": "src/assets/__init__.py",
    "content": " "
  },
  {
    "path": "src/assets/copy_assets.py",
    "content": "#!/bin/python\n\n\nimport shutil\n\nimport os,sys\n\n\nif len(sys.argv)<2:\n    game_dir = \"chase\"\nelse:\n    game_dir = sys.argv[1]\n\nif len(sys.argv)<3:\n    parent_dir = \"games\"\nelse:\n    parent_dir = sys.argv[2]\n\nfile_names = os.listdir(\"./generated_assets/\"+game_dir)\n\nprint(\"Files to copy: \"+str(file_names))\n\nfor file_name in file_names:\n    print(\"Copying: \", file_name)\n    source_path = \"./generated_assets/\"+game_dir+\"/\"+file_name\n    print(\"from: \" + source_path)\n    dest_path = \"../\"+parent_dir+\"/\"+game_dir+\"/generated_assets\"\n    \n    if not os.path.exists(dest_path):\n        print(\"creating: \" + dest_path)\n        os.makedirs(dest_path)\n    print(\"to: \" + dest_path)\n    shutil.copy(source_path, dest_path )\n\n    "
  },
  {
    "path": "src/assets/examples/README.txt",
    "content": "Some of the sample BASIC programs and code excerpts are taken from\r\nhttps://gkanold.wixsite.com/homeputerium"
  },
  {
    "path": "src/assets/examples/single_tiles/tile_shape0.txt",
    "content": "...##...\n..#..#..\n...##...\n.##..##.\n#.####.#\n# ####.#\n..#..#..\n..#..#..\n"
  },
  {
    "path": "src/assets/examples/single_tiles/tile_shape1.txt",
    "content": "...#....   16\n..###...   56\n..#.###.   46\n.##...##   99\n##...##.  198\n.###.#..  116\n...###..   28\n....#...    8\n\n\n\n\n\n\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/8x6_cidelsa_digits.s",
    "content": "\r\n!byte $1E, $21, $21, $21, $1E, $00, $00, $00\r\n \r\n!byte $01, $3F, $21, $11, $01, $00, $00, $00\r\n \r\n!byte $11, $29, $25, $25, $13, $00, $00, $00\r\n \r\n!byte $16, $29, $29, $21, $21, $00, $00, $00\r\n \r\n!byte $04, $3F, $24, $14, $0C, $00, $00, $00\r\n \r\n!byte $26, $29, $29, $29, $32, $00, $00, $00\r\n \r\n!byte $26, $29, $29, $29, $1E, $00, $00, $00\r\n \r\n!byte $30, $28, $24, $23, $20, $00, $00, $00\r\n \r\n!byte $16, $29, $29, $29, $16, $00, $00, $00\r\n \r\n!byte $1E, $29, $29, $29, $11, $00, $00, $00\r\n\r\n\r\n!byte $00, $00, $00, $00, $00, $00, $00, $00"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/8x6_cidelsa_fonts.s",
    "content": "\r\n!byte $00, $1F, $28, $28, $28, $3F, $1F, $00\r\n\r\n!byte $00, $16, $29, $29, $29, $3F, $3F, $00\r\n \r\n!byte $00, $12, $21, $21, $21, $3F, $1E, $00\r\n \r\n!byte $00, $1E, $21, $21, $21, $3F, $3F, $00\r\n \r\n!byte $00, $21, $21, $29, $29, $3F, $3F, $00\r\n\r\n!byte $00, $20, $20, $28, $28, $3F, $3F, $00\r\n\r\n!byte $00, $16, $25, $21, $21, $3F, $1E, $00\r\n \r\n!byte $00, $3F, $08, $08, $08, $3F, $3F, $00\r\n \r\n!byte $00, $00, $21, $3F, $3F, $21, $00, $00\r\n \r\n!byte $00, $3E, $3F, $01, $01, $01, $02, $00\r\n \r\n!byte $00, $00, $21, $12, $0C, $3F, $3F, $00\r\n \r\n!byte $00, $00, $01, $01, $01, $3F, $3F, $00\r\n \r\n!byte $00, $3F, $10, $08, $10, $3F, $3F, $00\r\n \r\n!byte $00, $3F, $04, $08, $10, $3F, $3F, $00\r\n \r\n!byte $00, $1E, $21, $21, $21, $3F, $1E, $00\r\n \r\n!byte $00, $10, $28, $28, $28, $3F, $3F, $00\r\n \r\n!byte $00, $1E, $21, $27, $21, $3F, $1E, $00\r\n \r\n!byte $00, $11, $2A, $2C, $28, $3F, $3F, $00\r\n \r\n!byte $00, $26, $2F, $29, $29, $39, $11, $00\r\n \r\n!byte $00, $20, $20, $3F, $3F, $20, $20, $00\r\n \r\n!byte $00, $3E, $01, $01, $01, $3F, $3E, $00\r\n \r\n!byte $00, $30, $0C, $03, $0F, $3C, $30, $00\r\n \r\n!byte $30, $0C, $03, $0C, $03, $0F, $3C, $30  \r\n \r\n!byte $00, $33, $14, $08, $14, $33, $33, $00\r\n\r\n!byte $00, $20, $10, $0F, $1F, $30, $20, $00\r\n\r\n!byte $00, $31, $31, $29, $25, $23, $23, $00\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/Antiriad_Chars.asm",
    "content": "\r\n\r\n; CHARSET IMAGE DATA...\r\n; 48 images, 8 bytes per image, total size is 384 ($180) bytes.\r\n\r\ncharset_data\r\n\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$7C,$EE,$C6,$C6,$FE,$C6,$C6,$00\r\n.byte $FC,$C6,$C6,$FC,$C6,$C6,$FE,$00,$7E,$E6,$C0,$C0,$C0,$E6,$7E,$00\r\n.byte $FC,$CE,$C6,$C6,$C6,$CE,$FC,$00,$FE,$C6,$C0,$F8,$C0,$C6,$FE,$00\r\n.byte $FE,$C6,$C0,$F8,$C0,$C0,$C0,$00,$7E,$E6,$C0,$CE,$C6,$E6,$7E,$00\r\n.byte $C6,$C6,$C6,$C6,$FE,$C6,$C6,$00,$3C,$18,$18,$18,$18,$18,$3C,$00\r\n.byte $06,$06,$06,$06,$C6,$EE,$7C,$00,$CE,$DC,$F8,$F8,$DC,$CE,$C6,$00\r\n.byte $C0,$C0,$C0,$C0,$C0,$C6,$FE,$00,$C6,$EE,$FE,$FE,$C6,$C6,$C6,$00\r\n.byte $C6,$E6,$F6,$FE,$DE,$CE,$C6,$00,$FC,$CE,$C6,$C6,$C6,$E6,$7E,$00\r\n.byte $FC,$CE,$C6,$C6,$FE,$C0,$C0,$00,$FC,$CE,$C6,$C6,$E6,$7C,$0E,$00\r\n.byte $FC,$CE,$C6,$C6,$FE,$DC,$CE,$00,$FE,$C6,$C0,$7C,$06,$C6,$FE,$00\r\n.byte $FE,$36,$30,$30,$30,$30,$30,$00,$C6,$C6,$C6,$C6,$C6,$EE,$7C,$00\r\n.byte $C6,$C6,$C6,$EE,$7C,$38,$10,$00,$C6,$C6,$C6,$C6,$FE,$EE,$C6,$00\r\n.byte $C6,$6C,$38,$38,$6C,$C6,$C6,$00,$C6,$EC,$78,$30,$30,$30,$30,$00\r\n.byte $FE,$CE,$1C,$38,$70,$E6,$FE,$00,$7C,$EE,$C6,$C6,$C6,$EE,$7C,$00\r\n.byte $38,$18,$18,$18,$18,$18,$18,$00,$FC,$C6,$06,$1C,$70,$E0,$FE,$00\r\n.byte $FC,$C6,$06,$3C,$06,$C6,$FC,$00,$C0,$C0,$C0,$D8,$FE,$18,$18,$00\r\n.byte $FE,$C6,$C0,$FE,$06,$C6,$7C,$00,$1C,$38,$70,$EC,$C6,$E6,$7E,$00\r\n.byte $FE,$C6,$0C,$18,$30,$30,$30,$00,$7C,$C6,$C6,$7C,$C6,$C6,$7C,$00\r\n.byte $7E,$67,$63,$37,$0E,$1C,$38,$00,$00,$00,$00,$00,$00,$30,$30,$00\r\n.byte $00,$00,$00,$00,$00,$18,$30,$00,$7E,$66,$06,$1C,$18,$00,$18,$00\r\n.byte $18,$18,$18,$18,$18,$00,$18,$00,$18,$18,$18,$00,$00,$00,$00,$00\r\n.byte $6C,$6C,$6C,$00,$00,$00,$00,$00,$18,$30,$30,$30,$30,$30,$18,$00\r\n.byte $18,$0C,$0C,$0C,$0C,$0C,$18,$00,$00,$00,$FC,$7E,$00,$00,$00,$00\r\n.byte $00,$18,$18,$7E,$18,$18,$00,$00,$00,$00,$18,$00,$00,$18,$00,$00\r\n\r\n\r\n; CHARSET IMAGE ATTRIBUTE DATA...\r\n; 48 attributes, 1 attribute per image, 8 bits per attribute, total size is 48 ($30) bytes.\r\n; nb. Upper nybbles = material, lower nybbles = colour.\r\n\r\ncharset_attrib_data\r\n\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/test_vchar-charset.s",
    "content": "; Exported using VChar64 v0.2.4\n; Total bytes: 2048\ncharset:\nfoo .byte $3c,$66,$6e,$6e,$60,$62,$3c\n.byte $00,$18,$3c,$66,$7e,$66,$66,$66,$00\t; 0\nbar .byte $7c,$66,$66,$7c,$66,$66,$7c,$00,$3c,$66,$60,$60,$60,$66,$3c,$00\t; 16\ntoto .byte $78,$6c,$66,$66,$66,$6c,$78,$00,$7e,$60,$60,$78,$60,$60,$7e,$00\t; 32\n.byte $7e,$60,$60,$78,$60,$60,$60,$00,$3c,$66,$60,$6e,$66,$66,$3c,$00\t; 48\n.byte $66,$66,$66,$7e,$66,$66,$66,$00,$3c,$18,$18,$18,$18,$18,$3c,$00\t; 64\n.byte $1e,$0c,$0c,$0c,$0c,$6c,$38,$00,$66,$6c,$78,$70,$78,$6c,$66,$00\t; 80\n.byte $60,$60,$60,$60,$60,$60,$7e,$00,$63,$77,$7f,$6b,$63,$63,$63,$00\t; 96\n.byte $66,$76,$7e,$7e,$6e,$66,$66,$00,$3c,$66,$66,$66,$66,$66,$3c,$00\t; 112\n.byte $7c,$66,$66,$7c,$60,$60,$60,$00,$3c,$66,$66,$66,$66,$3c,$0e,$00\t; 128\n.byte $7c,$66,$66,$7c,$78,$6c,$66,$00,$3c,$66,$60,$3c,$06,$66,$3c,$00\t; 144\n.byte $7e,$18,$18,$18,$18,$18,$18,$00,$66,$66,$66,$66,$66,$66,$3c,$00\t; 160\n.byte $66,$66,$66,$66,$66,$3c,$18,$00,$63,$63,$63,$6b,$7f,$77,$63,$00\t; 176\n.byte $66,$66,$3c,$18,$3c,$66,$66,$00,$66,$66,$66,$3c,$18,$18,$18,$00\t; 192\n.byte $7e,$06,$0c,$18,$30,$60,$7e,$00,$3c,$30,$30,$30,$30,$30,$3c,$00\t; 208\n.byte $0c,$12,$30,$7c,$30,$62,$fc,$00,$3c,$0c,$0c,$0c,$0c,$0c,$3c,$00\t; 224\n.byte $00,$18,$3c,$7e,$18,$18,$18,$18,$00,$10,$30,$7f,$7f,$30,$10,$00\t; 240\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$18,$18,$18,$18,$00,$00,$18,$00\t; 256\n.byte $66,$66,$66,$00,$00,$00,$00,$00,$66,$66,$ff,$66,$ff,$66,$66,$00\t; 272\n.byte $18,$3e,$60,$3c,$06,$7c,$18,$00,$62,$66,$0c,$18,$30,$66,$46,$00\t; 288\n.byte $3c,$66,$3c,$38,$67,$66,$3f,$00,$06,$0c,$18,$00,$00,$00,$00,$00\t; 304\n.byte $0c,$18,$30,$30,$30,$18,$0c,$00,$30,$18,$0c,$0c,$0c,$18,$30,$00\t; 320\n.byte $00,$66,$3c,$ff,$3c,$66,$00,$00,$00,$18,$18,$7e,$18,$18,$00,$00\t; 336\n.byte $00,$00,$00,$00,$00,$18,$18,$30,$00,$00,$00,$7e,$00,$00,$00,$00\t; 352\n.byte $00,$00,$00,$00,$00,$18,$18,$00,$00,$03,$06,$0c,$18,$30,$60,$00\t; 368\n.byte $3c,$66,$6e,$76,$66,$66,$3c,$00,$18,$18,$38,$18,$18,$18,$7e,$00\t; 384\n.byte $3c,$66,$06,$0c,$30,$60,$7e,$00,$3c,$66,$06,$1c,$06,$66,$3c,$00\t; 400\n.byte $06,$0e,$1e,$66,$7f,$06,$06,$00,$7e,$60,$7c,$06,$06,$66,$3c,$00\t; 416\n.byte $3c,$66,$60,$7c,$66,$66,$3c,$00,$7e,$66,$0c,$18,$18,$18,$18,$00\t; 432\n.byte $3c,$66,$66,$3c,$66,$66,$3c,$00,$3c,$66,$66,$3e,$06,$66,$3c,$00\t; 448\n.byte $00,$00,$18,$00,$00,$18,$00,$00,$00,$00,$18,$00,$00,$18,$18,$30\t; 464\n.byte $0e,$18,$30,$60,$30,$18,$0e,$00,$00,$00,$7e,$00,$7e,$00,$00,$00\t; 480\n.byte $70,$18,$0c,$06,$0c,$18,$70,$00,$3c,$66,$06,$0c,$18,$00,$18,$00\t; 496\n.byte $00,$00,$00,$ff,$ff,$00,$00,$00,$08,$1c,$3e,$7f,$7f,$1c,$3e,$00\t; 512\n.byte $18,$18,$18,$18,$18,$18,$18,$18,$00,$00,$00,$ff,$ff,$00,$00,$00\t; 528\n.byte $00,$00,$ff,$ff,$00,$00,$00,$00,$00,$ff,$ff,$00,$00,$00,$00,$00\t; 544\n.byte $00,$00,$00,$00,$ff,$ff,$00,$00,$30,$30,$30,$30,$30,$30,$30,$30\t; 560\n.byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$00,$00,$00,$e0,$f0,$38,$18,$18\t; 576\n.byte $18,$18,$1c,$0f,$07,$00,$00,$00,$18,$18,$38,$f0,$e0,$00,$00,$00\t; 592\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$ff,$ff,$c0,$e0,$70,$38,$1c,$0e,$07,$03\t; 608\n.byte $03,$07,$0e,$1c,$38,$70,$e0,$c0,$ff,$ff,$c0,$c0,$c0,$c0,$c0,$c0\t; 624\n.byte $ff,$ff,$03,$03,$03,$03,$03,$03,$00,$3c,$7e,$7e,$7e,$7e,$3c,$00\t; 640\n.byte $00,$00,$00,$00,$00,$ff,$ff,$00,$36,$7f,$7f,$7f,$3e,$1c,$08,$00\t; 656\n.byte $60,$60,$60,$60,$60,$60,$60,$60,$00,$00,$00,$07,$0f,$1c,$18,$18\t; 672\n.byte $c3,$e7,$7e,$3c,$3c,$7e,$e7,$c3,$00,$3c,$7e,$66,$66,$7e,$3c,$00\t; 688\n.byte $18,$18,$66,$66,$18,$18,$3c,$00,$06,$06,$06,$06,$06,$06,$06,$06\t; 704\n.byte $08,$1c,$3e,$7f,$3e,$1c,$08,$00,$18,$18,$18,$ff,$ff,$18,$18,$18\t; 720\n.byte $c0,$c0,$30,$30,$c0,$c0,$30,$30,$18,$18,$18,$18,$18,$18,$18,$18\t; 736\n.byte $00,$00,$03,$3e,$76,$36,$36,$00,$ff,$7f,$3f,$1f,$0f,$07,$03,$01\t; 752\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0\t; 768\n.byte $00,$00,$00,$00,$ff,$ff,$ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00\t; 784\n.byte $00,$00,$00,$00,$00,$00,$00,$ff,$c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0\t; 800\n.byte $cc,$cc,$33,$33,$cc,$cc,$33,$33,$03,$03,$03,$03,$03,$03,$03,$03\t; 816\n.byte $00,$00,$00,$00,$cc,$cc,$33,$33,$ff,$fe,$fc,$f8,$f0,$e0,$c0,$80\t; 832\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$18,$18,$18,$1f,$1f,$18,$18,$18\t; 848\n.byte $00,$00,$00,$00,$0f,$0f,$0f,$0f,$18,$18,$18,$1f,$1f,$00,$00,$00\t; 864\n.byte $00,$00,$00,$f8,$f8,$18,$18,$18,$00,$00,$00,$00,$00,$00,$ff,$ff\t; 880\n.byte $00,$00,$00,$1f,$1f,$18,$18,$18,$18,$18,$18,$ff,$ff,$00,$00,$00\t; 896\n.byte $00,$00,$00,$ff,$ff,$18,$18,$18,$18,$18,$18,$f8,$f8,$18,$18,$18\t; 912\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0,$e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0\t; 928\n.byte $07,$07,$07,$07,$07,$07,$07,$07,$ff,$ff,$00,$00,$00,$00,$00,$00\t; 944\n.byte $ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$ff,$ff,$ff\t; 960\n.byte $03,$03,$03,$03,$03,$03,$ff,$ff,$00,$00,$00,$00,$f0,$f0,$f0,$f0\t; 976\n.byte $0f,$0f,$0f,$0f,$00,$00,$00,$00,$18,$18,$18,$f8,$f8,$00,$00,$00\t; 992\n.byte $f0,$f0,$f0,$f0,$00,$00,$00,$00,$f0,$f0,$f0,$f0,$0f,$0f,$0f,$0f\t; 1008\n.byte $c3,$99,$91,$91,$9f,$99,$c3,$ff,$e7,$c3,$99,$81,$99,$99,$99,$ff\t; 1024\n.byte $83,$99,$99,$83,$99,$99,$83,$ff,$c3,$99,$9f,$9f,$9f,$99,$c3,$ff\t; 1040\n.byte $87,$93,$99,$99,$99,$93,$87,$ff,$81,$9f,$9f,$87,$9f,$9f,$81,$ff\t; 1056\n.byte $81,$9f,$9f,$87,$9f,$9f,$9f,$ff,$c3,$99,$9f,$91,$99,$99,$c3,$ff\t; 1072\n.byte $99,$99,$99,$81,$99,$99,$99,$ff,$c3,$e7,$e7,$e7,$e7,$e7,$c3,$ff\t; 1088\n.byte $e1,$f3,$f3,$f3,$f3,$93,$c7,$ff,$99,$93,$87,$8f,$87,$93,$99,$ff\t; 1104\n.byte $9f,$9f,$9f,$9f,$9f,$9f,$81,$ff,$9c,$88,$80,$94,$9c,$9c,$9c,$ff\t; 1120\n.byte $99,$89,$81,$81,$91,$99,$99,$ff,$c3,$99,$99,$99,$99,$99,$c3,$ff\t; 1136\n.byte $83,$99,$99,$83,$9f,$9f,$9f,$ff,$c3,$99,$99,$99,$99,$c3,$f1,$ff\t; 1152\n.byte $83,$99,$99,$83,$87,$93,$99,$ff,$c3,$99,$9f,$c3,$f9,$99,$c3,$ff\t; 1168\n.byte $81,$e7,$e7,$e7,$e7,$e7,$e7,$ff,$99,$99,$99,$99,$99,$99,$c3,$ff\t; 1184\n.byte $99,$99,$99,$99,$99,$c3,$e7,$ff,$9c,$9c,$9c,$94,$80,$88,$9c,$ff\t; 1200\n.byte $99,$99,$c3,$e7,$c3,$99,$99,$ff,$99,$99,$99,$c3,$e7,$e7,$e7,$ff\t; 1216\n.byte $81,$f9,$f3,$e7,$cf,$9f,$81,$ff,$c3,$cf,$cf,$cf,$cf,$cf,$c3,$ff\t; 1232\n.byte $f3,$ed,$cf,$83,$cf,$9d,$03,$ff,$c3,$f3,$f3,$f3,$f3,$f3,$c3,$ff\t; 1248\n.byte $ff,$e7,$c3,$81,$e7,$e7,$e7,$e7,$ff,$ef,$cf,$80,$80,$cf,$ef,$ff\t; 1264\n.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$e7,$e7,$e7,$e7,$ff,$ff,$e7,$ff\t; 1280\n.byte $99,$99,$99,$ff,$ff,$ff,$ff,$ff,$99,$99,$00,$99,$00,$99,$99,$ff\t; 1296\n.byte $e7,$c1,$9f,$c3,$f9,$83,$e7,$ff,$9d,$99,$f3,$e7,$cf,$99,$b9,$ff\t; 1312\n.byte $c3,$99,$c3,$c7,$98,$99,$c0,$ff,$f9,$f3,$e7,$ff,$ff,$ff,$ff,$ff\t; 1328\n.byte $f3,$e7,$cf,$cf,$cf,$e7,$f3,$ff,$cf,$e7,$f3,$f3,$f3,$e7,$cf,$ff\t; 1344\n.byte $ff,$99,$c3,$00,$c3,$99,$ff,$ff,$ff,$e7,$e7,$81,$e7,$e7,$ff,$ff\t; 1360\n.byte $ff,$ff,$ff,$ff,$ff,$e7,$e7,$cf,$ff,$ff,$ff,$81,$ff,$ff,$ff,$ff\t; 1376\n.byte $ff,$ff,$ff,$ff,$ff,$e7,$e7,$ff,$ff,$fc,$f9,$f3,$e7,$cf,$9f,$ff\t; 1392\n.byte $c3,$99,$91,$89,$99,$99,$c3,$ff,$e7,$e7,$c7,$e7,$e7,$e7,$81,$ff\t; 1408\n.byte $c3,$99,$f9,$f3,$cf,$9f,$81,$ff,$c3,$99,$f9,$e3,$f9,$99,$c3,$ff\t; 1424\n.byte $f9,$f1,$e1,$99,$80,$f9,$f9,$ff,$81,$9f,$83,$f9,$f9,$99,$c3,$ff\t; 1440\n.byte $c3,$99,$9f,$83,$99,$99,$c3,$ff,$81,$99,$f3,$e7,$e7,$e7,$e7,$ff\t; 1456\n.byte $c3,$99,$99,$c3,$99,$99,$c3,$ff,$c3,$99,$99,$c1,$f9,$99,$c3,$ff\t; 1472\n.byte $ff,$ff,$e7,$ff,$ff,$e7,$ff,$ff,$ff,$ff,$e7,$ff,$ff,$e7,$e7,$cf\t; 1488\n.byte $f1,$e7,$cf,$9f,$cf,$e7,$f1,$ff,$ff,$ff,$81,$ff,$81,$ff,$ff,$ff\t; 1504\n.byte $8f,$e7,$f3,$f9,$f3,$e7,$8f,$ff,$c3,$99,$f9,$f3,$e7,$ff,$e7,$ff\t; 1520\n.byte $ff,$ff,$ff,$00,$00,$ff,$ff,$ff,$f7,$e3,$c1,$80,$80,$e3,$c1,$ff\t; 1536\n.byte $e7,$e7,$e7,$e7,$e7,$e7,$e7,$e7,$ff,$ff,$ff,$00,$00,$ff,$ff,$ff\t; 1552\n.byte $ff,$ff,$00,$00,$ff,$ff,$ff,$ff,$ff,$00,$00,$ff,$ff,$ff,$ff,$ff\t; 1568\n.byte $ff,$ff,$ff,$ff,$00,$00,$ff,$ff,$cf,$cf,$cf,$cf,$cf,$cf,$cf,$cf\t; 1584\n.byte $f3,$f3,$f3,$f3,$f3,$f3,$f3,$f3,$ff,$ff,$ff,$1f,$0f,$c7,$e7,$e7\t; 1600\n.byte $e7,$e7,$e3,$f0,$f8,$ff,$ff,$ff,$e7,$e7,$c7,$0f,$1f,$ff,$ff,$ff\t; 1616\n.byte $3f,$3f,$3f,$3f,$3f,$3f,$00,$00,$3f,$1f,$8f,$c7,$e3,$f1,$f8,$fc\t; 1632\n.byte $fc,$f8,$f1,$e3,$c7,$8f,$1f,$3f,$00,$00,$3f,$3f,$3f,$3f,$3f,$3f\t; 1648\n.byte $00,$00,$fc,$fc,$fc,$fc,$fc,$fc,$ff,$c3,$81,$81,$81,$81,$c3,$ff\t; 1664\n.byte $ff,$ff,$ff,$ff,$ff,$00,$00,$ff,$c9,$80,$80,$80,$c1,$e3,$f7,$ff\t; 1680\n.byte $9f,$9f,$9f,$9f,$9f,$9f,$9f,$9f,$ff,$ff,$ff,$f8,$f0,$e3,$e7,$e7\t; 1696\n.byte $3c,$18,$81,$c3,$c3,$81,$18,$3c,$ff,$c3,$81,$99,$99,$81,$c3,$ff\t; 1712\n.byte $e7,$e7,$99,$99,$e7,$e7,$c3,$ff,$f9,$f9,$f9,$f9,$f9,$f9,$f9,$f9\t; 1728\n.byte $f7,$e3,$c1,$80,$c1,$e3,$f7,$ff,$e7,$e7,$e7,$00,$00,$e7,$e7,$e7\t; 1744\n.byte $3f,$3f,$cf,$cf,$3f,$3f,$cf,$cf,$e7,$e7,$e7,$e7,$e7,$e7,$e7,$e7\t; 1760\n.byte $ff,$ff,$fc,$c1,$89,$c9,$c9,$ff,$00,$80,$c0,$e0,$f0,$f8,$fc,$fe\t; 1776\n.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f\t; 1792\n.byte $ff,$ff,$ff,$ff,$00,$00,$00,$00,$00,$ff,$ff,$ff,$ff,$ff,$ff,$ff\t; 1808\n.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$00,$3f,$3f,$3f,$3f,$3f,$3f,$3f,$3f\t; 1824\n.byte $33,$33,$cc,$cc,$33,$33,$cc,$cc,$fc,$fc,$fc,$fc,$fc,$fc,$fc,$fc\t; 1840\n.byte $ff,$ff,$ff,$ff,$33,$33,$cc,$cc,$00,$01,$03,$07,$0f,$1f,$3f,$7f\t; 1856\n.byte $fc,$fc,$fc,$fc,$fc,$fc,$fc,$fc,$e7,$e7,$e7,$e0,$e0,$e7,$e7,$e7\t; 1872\n.byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0,$e7,$e7,$e7,$e0,$e0,$ff,$ff,$ff\t; 1888\n.byte $ff,$ff,$ff,$07,$07,$e7,$e7,$e7,$ff,$ff,$ff,$ff,$ff,$ff,$00,$00\t; 1904\n.byte $ff,$ff,$ff,$e0,$e0,$e7,$e7,$e7,$e7,$e7,$e7,$00,$00,$ff,$ff,$ff\t; 1920\n.byte $ff,$ff,$ff,$00,$00,$e7,$e7,$e7,$e7,$e7,$e7,$07,$07,$e7,$e7,$e7\t; 1936\n.byte $3f,$3f,$3f,$3f,$3f,$3f,$3f,$3f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f\t; 1952\n.byte $f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$ff,$ff,$ff,$ff,$ff,$ff\t; 1968\n.byte $00,$00,$00,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$00,$00,$00\t; 1984\n.byte $fc,$fc,$fc,$fc,$fc,$fc,$00,$00,$ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f\t; 2000\n.byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff,$e7,$e7,$e7,$07,$07,$ff,$ff,$ff\t; 2016\n.byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f,$f0,$f0,$f0,$f0\t; 2032\nCHARSET_COUNT = 2048\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tile_8x6_shapeA.txt",
    "content": "!byte 0x00, 0x1F, 0x28, 0x28, 0x28, 0x3F, 0x1F, 0x00\n\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tile_8x6_shapeA_rotated.txt",
    "content": "!byte 0,0,60,98,126,98,98,98\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tiles_all.asm",
    "content": "Charset_00_data:\r\n!byte $18, $24, $18, $66, $BD, $3C, $24, $24\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tiles_all_2.asm",
    "content": "\r\n\r\n; Generated by CharPad 2.7, assemble with 64TASS or similar.\r\n\r\n\r\n; Character display mode : Multi-colour (MCM).\r\n\r\n; Character colouring method : Per-Map.\r\n\r\n\r\n; Colour values...\r\n\r\nCOLR_SCREEN = 9\r\nCOLR_CHAR_DEF = 3\r\nCOLR_CHAR_MC1 = 0\r\nCOLR_CHAR_MC2 = 1\r\n\r\n\r\n; Quantities and dimensions...\r\n\r\nCHAR_COUNT = 256\r\nMAP_WID = 40\r\nMAP_HEI = 25\r\n\r\n\r\n; Data block sizes (in bytes)...\r\n\r\nSZ_CHARSET_DATA        = 2048\r\nSZ_CHARSET_ATTRIB_DATA = 256\r\nSZ_MAP_DATA            = 1000\r\n\r\n\r\n; Data block addresses (dummy values)...\r\n\r\nADDR_CHARSET_DATA = $1000            ; block size = $0800, label = 'charset_data'.\r\nADDR_CHARSET_ATTRIB_DATA = $2000     ; block size = $0100, label = 'charset_attrib_data'.\r\nADDR_MAP_DATA = $5000                ; block size = $03e8, label = 'map_data'.\r\n\r\n\r\n\r\n\r\n\r\n; * INSERT EXAMPLE PROGRAM HERE! * (Or just include this file in your project).\r\n\r\n\r\n\r\n\r\n; CHARSET IMAGE DATA...\r\n; 256 images, 8 bytes per image, total size is 2048 ($800) bytes.\r\n\r\ncharset_data\r\n\r\nbar    .byte        $18,$24,$18\r\nfoo .byte    $66,$bd,$3c,$24,$24,  $11,$22,$33,$44,$55,$66,$77,$88\r\n.byte $99,$AA,$BB,$CC,$DD,$EE,$FF,$10  \r\n.byte $20,$30,$40,$50,$60,$70,$80,$90,$00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n\r\n\r\n; CHARSET IMAGE ATTRIBUTE DATA...\r\n; 256 attributes, 1 attribute per image, 8 bits per attribute, total size is 256 ($100) bytes.\r\n; nb. Upper nybbles = material, lower nybbles = colour.\r\n\r\ncharset_attrib_data\r\n\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n\r\n\r\n\r\n\r\n; MAP DATA...\r\n; 40x25 (1000) cells, 8 bits per cell, total size is 1000 ($3e8) bytes.\r\n\r\nmap_data\r\n\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00\r\n\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tiles_bin.asm",
    "content": "\r\n.byte %01010101\r\n.byte %11111111\r\n.byte %10101010\r\n.byte %00110011\r\n.byte %11001100\r\n.byte %01010101\r\n.byte %10101010\r\n.byte %11111111"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tiles_charPad.asm",
    "content": "\r\n\r\n\r\n; CHARSET IMAGE DATA...\r\n; 256 images, 8 bytes per image, total size is 2048 ($800) bytes.\r\n\r\ncharset_data\r\n\r\n.byte $18,$24,$18,$66,$bd,$3c,$24,$24,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n\r\n\r\n; CHARSET IMAGE ATTRIBUTE DATA...\r\n; 256 attributes, 1 attribute per image, 8 bits per attribute, total size is 256 ($100) bytes.\r\n; nb. Upper nybbles = material, lower nybbles = colour.\r\n\r\ncharset_attrib_data\r\n\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03\r\n\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tiles_magellan.a99",
    "content": "         \r\nPAT0   DATA >1824,>1866,>BD3C,>2424     \r\nPAT1   DATA >0000,>0000,>0000,>0000     \r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/asm/tiles_magellan_2.a99",
    "content": "CLRNUM DATA 256                         \r\nCLRSET BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\n       BYTE >10,>10,>10,>10             \r\nPAT0   DATA >0000,>0000,>0000,>0000     \r\nPAT1   DATA >0000,>0000,>0000,>0000     \r\nMCOUNT DATA 1                           \r\nMC0    DATA 0                           \r\nMS0    DATA >0020,>0018,>0300           \r\nMD0    DATA >8083,>8283,>8485,>8687     \r\n       DATA >8889,>8A8B,>8C8D,>8E20     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>8520,>2080,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >8520,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>8020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >8020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n       DATA >2020,>2020,>2020,>2020     \r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/test.txt",
    "content": "\r\n20 SYMBOL AFTER 32\r\n30 REM Upper case chars\r\n40 SYMBOL 65,126,66,66,126,98,98,98,0\r\n50 SYMBOL 66,126,66,66,126,98,98,126,0\r\n60 SYMBOL 67,126,64,64,96,96,96,126,0\r\n70 SYMBOL 68,254,66,66,98,98,98,254,0\r\n80 SYMBOL 69,126,64,64, 120,96,96,126,0\r\n90 SYMBOL 70,126,64,64,120,96,96,96,0\r\n100 SYMBOL 71,126,64,64,102,98,98,126,0\r\n110 SYMBOL 72,66,66,66,126,98,98,98,0\r\n120 SYMBOL 73,60,16,16,24,24,24,60,0\r\n130 SYMBOL 74,126,8,8,24,24,24,120,0\r\n140 SYMBOL 75,68,68,68, 120,100,100,100,0\r\n150 SYMBOL 76,64,64,64,96,96,96, 126,0\r\n160 SYMBOL 77,126,74,74,98,98,98,98,0\r\n170 SYMBOL 78,98,82,74,102,98,98,98,0\r\n180 SYMBOL 79,126,66,66,98,98,98,126,0\r\n190 SYMBOL 80,126,66,66,126,96,96,96,0\r\n200 SYMBOL 81,126,66,66,98,98,106,126,4\r\n210 SYMBOL 82,126,66,66,126,106,100,98,0\r\n220 SYMBOL 83,126,64,64,126,6,6,126,0\r\n230 SYMBOL 84,126,16,16,24,24,24,24,0\r\n240 SYMBOL 85,66,66,66,98,98,98,126,0\r\n250 SYMBOL 86,66,66,66,66,66,36,24,0\r\n260 SYMBOL 87,66,66,66,98,106,106,126,0\r\n270 SYMBOL 88,102,102,36,24,36,102,102,0\r\n280 SYMBOL 89,66,66,126,16,24,24,24,0\r\n290 SYMBOL 90,126,4,8,16,32,64,126,0\r\n295 REM Lower case chars\r\n300 SYMBOL 97,0,0,126,6,126,70,126,0\r\n310 SYMBOL 98,96,96,96,126,98,98,126,0\r\n320 SYMBOL 99,0,0,126,96,96,96,126,0\r\n330 SYMBOL 100,6,6,6,126,70,70,126,0\r\n340 SYMBOL 101,0,0,126,98,126,96,126,0\r\n350 SYMBOL 102,60,48,48,120,48,48,48,0\r\n360 SYMBOL 103,0,0,126,70,70,126,6,126\r\n370 SYMBOL 104,96,96,96,126,98,98,98,0\r\n380 SYMBOL 105,24,0,24,24,24,24,24,0\r\n390 SYMBOL 106,6,0,6,6,6,6,6,126\r\n400 SYMBOL 107,96,96,102,108,120,108, 102,0\r\n410 SYMBOL 108,24,24,24,24,24,24,24,0\r\n420 SYMBOL 109,0,0,126,90,90,66,66,0\r\n430 SYMBOL 110,0,0,108,114,98,98,98,0\r\n440 SYMBOL 111,0,0,126,102,102,102,126,0\r\n450 SYMBOL 112,0,0,126,98,98,126,96,96\r\n460 SYMBOL 113,8,0,126,70,70,126,6,6\r\n470 SYMBOL 114,0,0,108,114,96,96,96,0\r\n480 SYMBOL 115,0,0,126,96,126,6,126,0\r\n490 SYMBOL 116,24,62,24,24,24,24,30,0\r\n500 SYMBOL 117,0,0,102,102,102,102,126,0\r\n510 SYMBOL 118,0,0,102,102,102,60,24,0\r\n520 SYMBOL 119,0,0,66,66,90,90,126,0\r\n530 SYMBOL 120,0,0,198,104,16,104,198,0\r\n540 SYMBOL 121,0,0,102,102,102,126,6,126\r\n550 SYMBOL 122,0,0,126,12,24,48,126,0\r\n555 REM Numbers\r\n560 SYMBOL 48,126,102,110,118,102,102,126,0\r\n570 SYMBOL 49,24,56,24,24,24,24,126,0\r\n580 SYMBOL 50,126,2,2,126,96,96,126,0\r\n590 SYMBOL 51,126,2,2,30,6,6,126,0\r\n600 SYMBOL 52,96,96,96,96,104,126,8,8\r\n610 SYMBOL 53,126,64,126,6,6,6,126,0\r\n620 SYMBOL 54,126,64,64,126,98,98,126,0\r\n630 SYMBOL 55,126,2,4,62,16,32,64,0\r\n640 SYMBOL 56,126,66,66,126,66,66,126,0\r\n650 SYMBOL 57,126,66,66,126,6,6,6,0\r\n680 SYMBOL 95,0,255,0,0,0,0,0,0\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_atari.bas",
    "content": "\r\n1560 DATA 0,6,15,249,239,6,0,0\r\n1570 DATA 34,148,65,58,124,62,122,60\r\n1580 DATA 251,251,251,0,223,223,223,223\r\n1590 DATA 255,0,118,118,0,94,94,94\r\n1600 DATA 195,195,255,255,195,195,255,255\r\n1610 DATA 15,27,55,0,55,54,55,55\r\n1620 DATA 248,108,118,0,118,54,118,118\r\n1630 DATA 1,3,7,11,10,11,11,11\r\n1640 DATA 128,192,224,208,80,208,208,208\r\n1650 DATA 62,123,251,255,110,26,114,67\r\n1660 DATA 62,123,251,254,244,100,12,8\r\n1670 DATA 124,222,223,255,118,88,78,194\r\n1680 DATA 124,222,222,127,47,38,48,16\r\n1690 DATA 126,219,219,254,232,92,22,48\r\n1700 DATA 126,219,219,127,23,58,104,12\r\n1710 DATA 12,30,181,127,59,63,126,212\r\n1720 DATA 12,30,53,127,191,63,126,170\r\n1730 DATA 48,120,173,254,220,252,126,39\r\n1740 DATA 48,120,172,254,253,252,126,101\r\n1750 DATA 0,6,15,249,239,6,0,0\r\n1760 DATA 68,41,130,92,62,116,126,60\r\n1770 DATA 251,251,251,0,223,223,223,223\r\n1780 DATA 255,0,118,118,0,94,94,94\r\n1790 DATA 195,195,255,255,195,195,255,255\r\n1800 DATA 15,27,55,0,55,54,55,55\r\n1810 DATA 248,108,118,0,118,54,118,118\r\n1820 DATA 1,3,7,11,10,11,11,11\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_atari_2.bas",
    "content": "0A=PEEK(106)-4:POK.106,A:GR.17:U=256*A:F.I=28TO432:POK.U+I,PEEK(57344+I):N.I:F.I=64TO79:REA.J:POK.U+I,J:N.I:H=400\r\n1DIMN(255):POK.756,A:M=47:F.I=0TO4:REA.L:POK.708+I,L:N.I:B=PEEK(88)+PEEK(89)*256:O=B+59:Z=125:D=B+460:T=B+210:E=10\r\n2P=T:L=26:?#6;CHR$(Z);\"USE IJKL SPC\":K=1:Q=.9:G=B:U=3:J=0:F.I=0TO127:N(I)=0:N(I+128)=0:POK.O+1+INT(RND(0)*H),M:N.I\r\n3N(0)=1:N(5)=20:N(13)=-20:N(1)=-1:W=132:POS.6,1:?#6;\" MINES+ \":F.I=0TO19:POK.O-I,73:POK.D+I,73:N.I:D.0,60,126,126\r\n4R=J*(J>R)+R*(J<=R):POS.1,0:?#6;9-F;\" \";CHR$(136);U;\"  \";J;\"  hi \";R:IFPEEK(P)=W THENJ=J+9:F=F-(F>0):SO.0,Z,E,E\r\n5SE.4,0,0:Y=0:IFQ<RND(0)THENPOK.P-4+2*INT(RND(1)*5)+40*INT(RND(1)*3)-40,M:IFJ>=K*500 THENU=U+(U<9):K=K+1:F=0:L=74\r\n6POK.P,200:S=PEEK(764):SO.0,0,0,0:IFS<>9THENPOK.764,9:IFN(S)THENPOK.P,M:P=P+N(S):J=J+1:Y=1:Q=Q-.0005:SO.0,99,E,E\r\n7POK.G,W:G=B:POK.729,0:IFY*(INT(J/4)=J/4)THENG=O+1+INT(RND(1)*H):POK.G,68:D.126,126,60,0,0,170,85,170,85,170,85\r\n8U=(P>O)*(P<D)*U:IFS=33ANDF<9THENPOK.P-1,0:POK.P+1,0:POK.P-20,0:POK.P+20,0:F=F+1:SE.4,33,0:G.3:D.0,14,120,30,30,0\r\n9POK.711,L:ON((PEEK(P)<>M)*(U>0))GOTO4:SO.0,99,8,9:POK.P,138:U=U-1:F=0:ON(U>0)GOTO4:SO.0,0,0,0:F.I=0TO2600:N.I:G.2"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_bbc.bas",
    "content": "10 REM Walking alien\r\n20 MODE 6\r\n30 VDU 23,240,153,189,219,126,36,60,36,36\r\n40 PRINT TAB(0,10);CHR$(240)\r\n50 FOR I%=1 TO 19\r\n60   PRINT TAB(I%-1,10);\" \"\r\n70  PRINT TAB(I%,10);CHR$(240)\r\n80  FOR J%=1 TO 500: NEXT J%\r\n90 NEXT I%\r\n100 END"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_cbm.bas",
    "content": "000 REM ** USER DEFINED GRAPHICS **\r\n001 REM ** BY SHANE JOLLY **\r\n100 PRINT \"♥\": PRINT TAB(12)\"PLEASE WAIT...\"\r\n110 PRINT CHR$(142)\r\n120 POKE 52, 48: POKE 56, 48\r\n130 POKE UG=12288;CG=53248\r\n140 POKE 56334, PEEK(56334) AND 254\r\n150 POKE 1, PEEK(1) AND 251\r\n160 FOR K=1 TO 2047\r\n170 POKE UG+K, PEEK(CG+K)\r\n180 NEXT\r\n190 POKE 1, PEEK(1) OR 4\r\n200 POKE 56334, PEEK(6334) OR 1\r\n210 POKE 53272, (PEEK(53272) AND 240)+12\r\n220 FOR CC=1 TO 9\r\n230 FOR J=0 TO 7\r\n240 READ A: POKE UG+8*CC+J, A\r\n250 NEXT J\r\n260 NEXT CC\r\n270 FOR N=65 TO 90\r\n280 PRINT CHR$(N);\" \";\r\n290 NEXT N\r\n300 DATA 000, 016, 040, 068, 124, 068, 068, 000\r\n310 DATA 000, 120, 072, 124, 068, 068, 124, 000\r\n320 DATA 000, 124, 068, 064, 064, 068, 124, 000\r\n330 DATA 000, 120, 068, 068, 068, 068, 120, 000\r\n340 DATA 000, 124, 068, 112, 112, 068, 124, 000\r\n350 DATA 000, 124, 068, 112, 064, 064, 064, 000\r\n360 DATA 000, 124, 068, 064, 064, 078, 124, 000\r\n370 DATA 000, 068, 068, 124, 124, 068, 068, 000\r\n380 DATA 000, 056, 016, 016, 016, 016, 056, 000 "
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_cbm_10_liner.bas",
    "content": "0l=32:v=36878:fOk=.to4:rEb$:fOi=1to8:pO7167+i+k*8,aS(mI(b$,i)):pO7421+i,.:nE:nE\r\n1pO52,26:pO56,26:n=1:t=30720:pOv-9,255:pOv+1,8:?\"{clear}{reverse on}{yellow}ijkl\":x=3:p=7955:ifj>rtHr=j\r\n2wA198,1:g(0)=211:g(1)=209:g(2)=215:g(3)=218:pO650,128:u=22:k=7745:y=7732:z=y-8\r\n3gEa$:b=z+rN(.)*464:q=rN(1)*4:pOb,g(q):pOb+t,q+2:ifj>=100*ntHx=x-(x<9):n=n+1\r\n4pOk+i,l:pOy+i*u,l:i=i+1:ifi<=utHpOk+i,4:pOk+i+t,6:pOy+i*u,4:pOy+i*u+t,7:m=pE(p)\r\n5g=.:x=x+(m=4):e=saN1:c=s-1+e:ifi>utHi=.:y=z+rN(.)*u-1:k=z+u*int((p-z)/u)-1\r\n6ifc=sG(c)tHg=1:h=s+1:pOp,l:p=p+c*21*e+c:d=pE(p):ifd=ftHw=w-(d>l):j=j-(w>1)*w\r\n7pOp+t,7:?\"{home}{reverse on}{red}g{green}e{cyan}m{purple}s{white}\"j\" {blue}hi{cyan}\"r\" {yellow}{reverse off}b{green}{reverse on}\"x:ifd>ltHifgtHpOv,9:pOv,.:dA\"{24}{60}{24}{102}{153}{24}{36}{102}\"\r\n8pOp,h:w=-w*(d=f):s=aS(a$+\"@\")-74:dA\"{24}{44}{152}{110}{25}{24}{40}{40}\",\"{24}{36}{24}{102}{153}{24}{36}{102}\",\"{24}{52}{25}{118}{152}{24}{40}{40}\",\"{ 24}{ 36}{ 90}{189}{189}{ 90}{ 36}{ 24}\"\r\n9f=d:on-(x>.aNp<8186aNp>=z)gO3:?sP7)\"{reverse on}{red}game over\":fOa=.tov/9:nE:pO198,0:j=.:gO1"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_cbm_10_liner_2.bas",
    "content": "0pO56,26:pO52,26:v=36878:x=132:pOv-9,255:fOp=.to39:rEb:pO7168+p,b:pO7421+p,.:nE\r\n1e=22:z=218:o=4:y=3:b=7:p=8174:pO650,z:?\"{clear}{black}{reverse on}jl\":l$=\"{green}{68*2}{black}{66}\":r$=\"{black}{67}{green}{68*2}\":ifi>rtHr=i\r\n2n=v+1:t=30720:pOn,59:wA198,1:?\"{clear}\":fOi=3toe:?tA4)\"{green}{68}{black}{reverse on}{230}{191}\"sP8)\"{191}{230}{reverse off}{green}{68}\":nE:d=1:i=.\r\n3b=b+f:i=i+1:if(iaNy)=ytHd=int(rN(.)*3):ifb<4tHifo<6tHb=4:y=7:dA24,189,255,165\r\n4s=int(rN(.)*(b+1)):ifpE(p-e)<>32tHpOn,42:pOv,15:pOv,.:l=l+1:fOf=-9tox:nE:pOn,59\r\n5c$=\" \":gEa$:ifiaN1tHc$=\"{31}@\":ifl<.tHl=.:dA36,189,255,165,90,102,90,60,36,219,255\r\n6?\"{home}{down}{left}{148}\":pOz,x:pOp+t,2:pOp,1:ifpE(p-e)=4tHl=9:dA195,93,114,101,66,93,114,101,66\r\n7?sPo)l$sPs)c$sPb-s)r$:ifa$<>\"\"tHk=aS(a$):p=p+(k=74)-(k=76):dA93,39,83,33,93,39\r\n8?\"{home}{red}a{reverse on}\"l\" {purple}\"i\" {black}\"r:f=(iaN127)=.:l=l+f:ifo>1-dtHifo+d+b<17tHo=o-1+d:dA83,33,8,28\r\n9on-(l<9)gO3:?\"{home}{down*2}\"sP8)\"{black}{reverse on}{191} {red}end {black}{191}\":fOs=ttov:nE:l=.:pO198,0:gO1:dA62,28,62,8,8,"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_cbm_10_liner_3.bas",
    "content": "0pO56,28:pO52,28:n=36879:w=49:rEb$:fOk=1to48:pO7559+k,aS(mI(b$,k)):pO7421+k,.:nE\r\n1v=n-1:pOv-9,255:g=198:u=22:z=8186:t=30720:h=52:pOn,8:?\"{clear}{reverse on}{green}ijkl\":wAg,1:pO650,128\r\n2l=.:x=5:y=44:m=9:o=7723:?\"{clear}\":p=7933:fOa=.to9:fOd=.to9+j/2:goS9:pOf+t,5:pOf,w:nE\r\n3b=54:pOf,b:pOf+t,1:goS9:pOf+t,2:pOf,211:nE:pOg,.:wAg,1:fOq=.to439:pOo+q+t,.:nE\r\n4pOn,8:?\"{home}\"sP6)\"{reverse on}{red}S{cyan}\"j\"  {red}{reverse off}4{cyan}{reverse on}\"m-xaN15:ifpE(p)=211tHpOn,90:j=j+1:l=l+1:x=x+(x>1)\r\n5pOp+t,2:pOp,h:gEa$:s=aS(a$+\"@\"):ifl>mtH?sP7)\"{purple}{reverse on}completed\":fOi=tton:nE:pOn,8:gO2\r\n6e=saN1:c=s-75+e:ifc=sG(c)tHx=x+.1:h=s-23:pOp,160:q=p+c*21*e+c:if(pE(q)<>w)gO8\r\n7on-(x<maNp<zaNp>oaNpE(p)<>b)gO4:pOn,109:?sPm)\"{yellow}{reverse on}end\":fOi=tton:nE:j=.:pOg,.:gO1\r\n8p=q:pOv,m:pOv,.:fOa=-2to2:q=p+t+a:pOq-y,1:pOq-u,1:pOq,1:pOq+u,1:pOq+y,1:nE:gO7\r\n9f=2+o+2*a*u+rN(.)*20:reT:dA\"{16}{56}{124}{56}{124}{16}{16}{16}{24}{60}{24}{102}{153}{24}{36}{102}{24}{44}{152}{110}{25}{24}{40}{40}{24}{36}{24}{102}{153}{24}{36}{102}{24}{52}{25}{118}{152}{24}{40}{40}{62}{127}{73}{127}{119}{62}{42}{42}\""
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_cbm_10_liner_4.bas",
    "content": "0v=36878:t=30720:pokev+1,110:b=7816:c=b+12:z=65:q=.:g=160:dimc(g):pokev-9,255:data17,85\r\n1fori=1to16:reade:poke7167+i,255-e:next:s$=\"{home}{down*3}{reverse on}        {white}step{yellow}\":data17,,254,,,70,136\r\n2s=3:fori=.to3:p(i)=1:p(6-i)=0:next:c(0)=3:c(1)=5:print\"{clear}{reverse on}  {cyan}{reverse off}@{green}a{reverse on} {white}vic {green}fruzzle {cyan}{reverse off}@{green}a\"\r\n3h=42:q=.:p(s)=g:print\"{down*18}{reverse on}{yellow}    use {white}abcdefg{down}\"spc(11)\"{yellow}reset with {white}x\"\r\n4e=22:fori=.to6:poke8036+i*2,i+129:forj=1to8:pokeb+e*j+i*2,230:pokeb+e*j+i*2+t,7:next:next\r\n5fori=.to6:pokeb+t+i*2,c(p(i)):pokeb+i*2,p(i):next:prints$;q;:d$=\"{down}done!\":data170,136,,127,,\r\n6geta$:on-(a$=\"\")goto6:f=asc(a$)-z:on-(f=23)goto2:on-(f<.orf>6orf=sors<.ors>6)goto6:data98\r\n7x=peek(b+f*2):on-((x=1)and(((s-f)>2)or(f>s)))goto6:on-((x=0)and(((f-s)>2)or(s>f)))goto6\r\n8pokeb+f*2,g:q=q+1:j=b+f*2-22-sgn(f-s):pokej+t,c(x):pokej,x:pokev,9:pokev,0:p(s)=x:p(f)=g\r\n9k=tan(9.9):s=f:pokej,g:on-(p(4)*p(5)*p(6)<>1orp(3)<2)goto5:print\"{home}\"spc(9)d$:pokev+1,h:goto5"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_cbm_2.bas",
    "content": "1 goto800\r\n2 poke53280,6:poke53281,1\r\n5 s=1304:ex=1:l=3:sc=0:so=54272\r\n10 pokeso+24,15:pokeso+5,17:pokeso+6,16:pokeso,100\r\n20 tc=27:poke251,112:poke831,0:poke832,6:poke829,20\r\n30 tb(1)=112\r\n40 tb(2)=197\r\n50 ss$=\"{right*19}{space*3}{down}{left*4}{space*5}{down}{left*3} \"\r\n60 sc$=\"{right*19}{green}###{down}{left*4}{blue}#####{down}{left*3}$\"\r\n70 poke53272,(peek(53272)and240)+12\r\n80 t(1)=38:t(2)=40\r\n90 print\"{clear}{down*2}{red}########################################\";\r\n91 print\"{green}###################{space*3}##################\";\r\n92 print\"{blue}##################{space*5}#################\";\r\n100 fori=16to1step-1\r\n110 print\"{home}{down*3}\";:fort=1toi:print\"{down}\";:next:printsc$\r\n120 fory=1to75:next\r\n130 print\"{home}{down*3}\";:fort=1toi:print\"{down}\";:next:printss$\r\n140 next\r\n150 print\"{clear}{down*2}{red}########################################\";\r\n151 print\"{green}########################################\";\r\n152 print\"{blue}########################################\";\r\n160 print\"{home}{down}++++++++++++++++++++++++++++++++++++++++\"\r\n170 print\"{home}{down*23},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\";\r\n180 tt=1:d=-1:ao=40:mp=1244:mc=55516:tp=19:ba=121:z=0:poke834,tp\r\n185 w=int(rnd(1)*39)+1104\r\n190 poke251,tb(tt):sys49152\r\n200 print\"{home}{down*16}-------{space*26}-------\"\r\n210 print\"{home}{space*6}punti=\";sc:print\"{home}{right*25}clown=\";l\r\n220 pokemp,36:pokemc,0\r\n230 gosub750:iffbthen240\r\n235 goto230\r\n240 u=int(rnd(1)*10)\r\n244 ifz=0andu>8thenz=7:goto248\r\n246 ifz=7andu>7thenz=0:goto248\r\n248 ifpeek(w)=35thenpokew+so,z\r\n290 poke251,tb(tt):sys49434:tp=peek(834)\r\n310 ifd=-1then330\r\n320 ifd=1then410\r\n325 goto310\r\n330 op=mp:mp=mp+ao:mc=mp+so:pm=peek(mp)\r\n335 if((op-1023)/40=int((op-1023)/40))andao=41thenmp=mp-40:pm=peek(mp):mc=mp+so\r\n340 ifpm=32thengoto406\r\n350 ifpm=35thengosub560:goto406\r\n370 ifpm=t(tt)then460\r\n380 ifpm=43orpm=45thenmp=op:d=1:ao=int(rnd(1)*3)+39:goto240\r\n400 l=l-1:ifl<=0then630\r\n404 goto180\r\n406 pokeop,32:pokemp,36:pokemc,0:goto240\r\n410 op=mp:mp=mp-ao:mc=mp+so:pm=peek(mp)\r\n415 if((op-1024)/40=int((op-1024)/40))andao=41thenmp=mp+40:pm=peek(mp):mc=mp+so\r\n420 ifpm=32then450\r\n430 ifpm=35thend=-1:gosub560:goto450\r\n435 ifpm=45thenpokeop,32:mp=mp-ao:mc=mp+so\r\n440 ifpm=43thenmp=op:d=-1:ao=int(rnd(1)*3)+39:goto240\r\n450 pokeop,32:pokemp,36:pokemc,0:goto240\r\n460 sc=sc+5:pokeop,32\r\n480 pokeso+1,10:pokeso+4,33\r\n490 poke251,tc:sys49152\r\n500 pokeso+4,32:iftt=1thenmp=1787+tp:mc=mp+so\r\n510 iftt=2thenmp=1785+tp:mc=mp+so\r\n520 tt=tt+1:iftt>2thentt=1\r\n530 d=1\r\n540 poke251,tb(tt):sys49152\r\n550 ao=int(rnd(1)*3)+39\r\n555 print\"{home}{space*6}punti=\";sc:print\"{home}{right*25}clown=\";l:goto240\r\n560 pokeso+1,10:pokeso+4,129:fori=1to10:next:pokeso+4,128\r\n563 ifmp=wandc=0thenl=l-1:goto180\r\n566 ifmp=wandc=7thensc=sc+250:goto600\r\n570 ifmp>1103andmp<1144thensc=sc+100\r\n580 ifmp>1143andmp<1184thensc=sc+75\r\n590 ifmp>1183andmp<1224thensc=sc+50\r\n600 ifsc>ex*2000thenl=l+1:ex=ex+1\r\n605 ba=ba-1:ifba=1then180\r\n610 ao=int(rnd(1)*3)+39\r\n620 print\"{home}{space*6}punti=\";sc:print\"{home}{right*25}clown=\";l:return\r\n630 g$=\" p a r t i t a   c o n c l u s a \"\r\n640 fori=2to34step2\r\n650 print\"{home}{down*9}\";tab(i+2);mid$(g$,i,1)\r\n660 fort=1to100:next:next\r\n670 fori=1to250:next\r\n680 print\"{space*2}premi il pulsante per giocare ancora\"\r\n690 print\"{space*3}spingi il joystick verso il basso\"\r\n695 print\"{space*4}per terminare\"\r\n700 gosub750\r\n710 iffbthenclr:goto2\r\n720 ifj1thensys2048:end\r\n730 goto700\r\n750 p=peek(56320)and15\r\n760 j1=-(p=13)\r\n770 fb=-((peek(56320)and16)=0):return\r\n800 poke53280,6:poke53281,1\r\n810 print\"{clear}{down*12}{space*17}{red}c{cyan}i{purple}r{green}c{blue}o{black}\":c=0\r\n820 print\"{down}{space*12}attendere prego...\":goto1310\r\n830 gosub10000:poke53272,(peek(53272)and240)+12\r\n840 print\"{clear}{down*12}{right*17}{black}circo\"\r\n850 print\"{home}{down*10}{right*15}#########\"\r\n855 print\"{down*3}{right*15}#########\"\r\n860 print\"{home}{down*11}{right*15}#{down}{left}#{down}{left}#{up*2}{right*7}#{down}{left}#{down}{left}#\"\r\n880 fort=1to3:forp=1to7:s=p\r\n890 fori=55711to55720:pokei,s\r\n900 s=s+1:ifs=1thens=2\r\n910 ifs>7thens=0\r\n920 next\r\n930 fori=55760to55840step40:pokei,s\r\n940 s=s+1:ifs=1thens=2\r\n950 ifs>7thens=0\r\n960 next\r\n970 fori=55880to55871step-1:pokei,s\r\n980 s=s+1:ifs=1thens=2\r\n990 ifs>7thens=0\r\n1000 next\r\n1010 fori=55831to55751step-40:pokei,s\r\n1020 s=s+1:ifs-1thens=2\r\n1030 ifs>7thens=0\r\n1040 next\r\n1050 nextp,t\r\n1060 poke53272,21:print\"{clear}{down*12}\";\r\n1070 print\"{space*5}vuoi le istruzioni? (s/n)\"\r\n1080 geta$:ifa$=\"\"then1080\r\n1090 ifa$=\"s\"then1120\r\n1100 ifa$=\"n\"then1500\r\n1110 goto1080\r\n1120 printchr$(14);\"{clear}{down}questo e' il gioco del circo.\"\r\n1130 print\"{down}lo scopo del gioco consiste nel far\"\r\n1135 print\"scoppiare tutti i palloncini.\"\r\n1140 print\"{down}cio' e' possibile muovendo il joystick\"\r\n1145 print\"a sinistra e a destra in modo da pren-\"\r\n1150 print\"dere al volo il clown\"\r\n1153 print\"{down}all'inizio premere il pulsarte di sparo\"\r\n1155 print\"per dare il via al gioco.\"\r\n1160 print\"{home}{down*20} premi qualsiasi tasto\"\r\n1170 geta$:ifa$=\"\"then1170\r\n1180 print\"{clear}{down}tutti i blocchi a scacchi fanno rimbal- zare il vostro giocatore\"\r\n1190 print\"{down}ogni 2000 punti verra' concesso un uomo in piu'.\"\r\n1200 print\"{down}anche il blocco mobile permettera' al {space*3}vostro giocatore di\";\r\n1205 print\" rimbalzare.\"\r\n1210 print\"{home}{down*22} premi qualsiasi tasto\"\r\n1220 geta$:ifa$=\"\"then1220\r\n1230 print\"{clear}{down}dovete far attenzione al palloncino\"\r\n1235 print\"di diverso colore della riga superiore.\"\r\n1240 print\"{down}quando il palloncino e' nero, scoppiera'\"\r\n1250 print\"{up}in faccia al vostro giocatore, quando e'\"\r\n1260 print\"{up}giallo vi dara' 250 punti\"\r\n1270 print\"{down*2}buona fortuna!!!\"\r\n1280 print\"{home}{down*22} premi qualsiasi tasto\"\r\n1290 geta$:ifa$=\"\"then1290\r\n1300 goto1500\r\n1310 poke52,48:poke56,48:clr\r\n1320 cs=12288:poke56334,peek(56334)and254:poke1,peek(1)and251\r\n1330 fori=cstocs+511:pokei,peek(i+40960):next\r\n1340 poke1,peek(1)or4:poke56334,peek(56334)or1\r\n1360 fori=cs+35*8tocs+46*8-1:readj:pokei,j:a=a+j:next\r\n1365 ifa<>6897thenprint\"errore nei dati alle righe 1380-1480\":end\r\n1370 goto830\r\n1380 data28,62,47,63,63,126,96,0\r\n1390 data58,58,18,124,16,56,68,68\r\n1400 data128,64,32,16,24,28,38,37\r\n1410 data128,64,32,16,8,4,2,1\r\n1420 data1,2,4,8,24,56,100,164\r\n1430 data1,2,4,8,16,32,64,128\r\n1440 data0,0,0,255,24,24,36,36\r\n1450 data0,0,0,255,0,0,0,0\r\n1460 data170,85,170,85,170,85,170,85\r\n1470 data255,255,255,255,255,255,255,255\r\n1480 data170,85,170,85,170,85,170,85\r\n1500 print\"{clear}\":printchr$(17):goto2\r\n10000 i=49152\r\n10010 reada:ifa=256thengoto10025\r\n10020 pokei,a:i=i+1:c=c+a:goto10010\r\n10025 ifc<>21810thenprint\"errore nei dati alle righe 10030-10580\":end\r\n10028 return\r\n10030 data172,66,3,174,61,3,24\r\n10040 data32,240,255,169,192,133,252\r\n10050 data160,0,177,251,32,210,255\r\n10060 data200,192,85,208,246,96,32\r\n10070 data36,32,36,32,32,32,32\r\n10080 data32,32,32,32,32,32,32\r\n10090 data32,32,32,32,32,32,32\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_cpc.bas",
    "content": "\r\n20 SYMBOL AFTER 32\r\n30 REM Upper case chars\r\n40 SYMBOL 65,126,66,66,126,98,98,98,0\r\n50 SYMBOL 66,126,66,66,126,98,98,126,0\r\n60 SYMBOL 67,126,64,64,96,96,96,126,0\r\n70 SYMBOL 68,254,66,66,98,98,98,254,0\r\n80 SYMBOL 69,126,64,64, 120,96,96,126,0\r\n90 SYMBOL 70,126,64,64,120,96,96,96,0\r\n100 SYMBOL 71,126,64,64,102,98,98,126,0\r\n110 SYMBOL 72,66,66,66,126,98,98,98,0\r\n120 SYMBOL 73,60,16,16,24,24,24,60,0\r\n130 SYMBOL 74,126,8,8,24,24,24,120,0\r\n140 SYMBOL 75,68,68,68, 120,100,100,100,0\r\n150 SYMBOL 76,64,64,64,96,96,96, 126,0\r\n160 SYMBOL 77,126,74,74,98,98,98,98,0\r\n170 SYMBOL 78,98,82,74,102,98,98,98,0\r\n180 SYMBOL 79,126,66,66,98,98,98,126,0\r\n190 SYMBOL 80,126,66,66,126,96,96,96,0\r\n200 SYMBOL 81,126,66,66,98,98,106,126,4\r\n210 SYMBOL 82,126,66,66,126,106,100,98,0\r\n220 SYMBOL 83,126,64,64,126,6,6,126,0\r\n230 SYMBOL 84,126,16,16,24,24,24,24,0\r\n240 SYMBOL 85,66,66,66,98,98,98,126,0\r\n250 SYMBOL 86,66,66,66,66,66,36,24,0\r\n260 SYMBOL 87,66,66,66,98,106,106,126,0\r\n270 SYMBOL 88,102,102,36,24,36,102,102,0\r\n280 SYMBOL 89,66,66,126,16,24,24,24,0\r\n290 SYMBOL 90,126,4,8,16,32,64,126,0\r\n295 REM Lower case chars\r\n300 SYMBOL 97,0,0,126,6,126,70,126,0\r\n310 SYMBOL 98,96,96,96,126,98,98,126,0\r\n320 SYMBOL 99,0,0,126,96,96,96,126,0\r\n330 SYMBOL 100,6,6,6,126,70,70,126,0\r\n340 SYMBOL 101,0,0,126,98,126,96,126,0\r\n350 SYMBOL 102,60,48,48,120,48,48,48,0\r\n360 SYMBOL 103,0,0,126,70,70,126,6,126\r\n370 SYMBOL 104,96,96,96,126,98,98,98,0\r\n380 SYMBOL 105,24,0,24,24,24,24,24,0\r\n390 SYMBOL 106,6,0,6,6,6,6,6,126\r\n400 SYMBOL 107,96,96,102,108,120,108, 102,0\r\n410 SYMBOL 108,24,24,24,24,24,24,24,0\r\n420 SYMBOL 109,0,0,126,90,90,66,66,0\r\n430 SYMBOL 110,0,0,108,114,98,98,98,0\r\n440 SYMBOL 111,0,0,126,102,102,102,126,0\r\n450 SYMBOL 112,0,0,126,98,98,126,96,96\r\n460 SYMBOL 113,8,0,126,70,70,126,6,6\r\n470 SYMBOL 114,0,0,108,114,96,96,96,0\r\n480 SYMBOL 115,0,0,126,96,126,6,126,0\r\n490 SYMBOL 116,24,62,24,24,24,24,30,0\r\n500 SYMBOL 117,0,0,102,102,102,102,126,0\r\n510 SYMBOL 118,0,0,102,102,102,60,24,0\r\n520 SYMBOL 119,0,0,66,66,90,90,126,0\r\n530 SYMBOL 120,0,0,198,104,16,104,198,0\r\n540 SYMBOL 121,0,0,102,102,102,126,6,126\r\n550 SYMBOL 122,0,0,126,12,24,48,126,0\r\n555 REM Numbers\r\n560 SYMBOL 48,126,102,110,118,102,102,126,0\r\n570 SYMBOL 49,24,56,24,24,24,24,126,0\r\n580 SYMBOL 50,126,2,2,126,96,96,126,0\r\n590 SYMBOL 51,126,2,2,30,6,6,126,0\r\n600 SYMBOL 52,96,96,96,96,104,126,8,8\r\n610 SYMBOL 53,126,64,126,6,6,6,126,0\r\n620 SYMBOL 54,126,64,64,126,98,98,126,0\r\n630 SYMBOL 55,126,2,4,62,16,32,64,0\r\n640 SYMBOL 56,126,66,66,126,66,66,126,0\r\n650 SYMBOL 57,126,66,66,126,6,6,6,0\r\n680 SYMBOL 95,0,255,0,0,0,0,0,0\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_msx_headless_hex.bas",
    "content": "\r\n490 DATA 22,63,F7,B7,FF,7E,3C,3C ' a\r\n491 DATA 38,6C,FF,3F,0F,3F,FC,38 ' b\r\n492 DATA 3C,3C,7E,FF,ED,EF,C6,44 ' c\r\n493 DATA 1C,36,FF,FC,F0,FC,3F,1C ' d\r\n494 DATA 3C,7E,FF,FF,FF,FF,7E,3C ' e\r\n495 DATA 08,10,54,FE,FE,FE,FE,7C ' f\r\n496 DATA 06,08,10,10,38,7C,7C,38 ' g\r\n497 DATA 00,28,FE,AA,FE,54,38,10 ' h\r\n500 DATA 08,1C,2A,7F,77,3E,36,63 ' i\r\n501 DATA FF,D5,AB,D5,AB,D5,AB,FF ' j\r\n502 DATA 00,00,00,18,18,00,00,00 ' k\r\n503 DATA 00,00,18,24,24,18,00,00 ' l\r\n504 DATA 00,18,3C,66,66,3C,18,00 ' m\r\n505 DATA 3C,7E,E7,C3,C3,E7,7E,3C ' n\r\n510 DATA 00,01,06,1D,2A,2A,2A,1F ' o\r\n511 DATA 1B,8F,65,11,C9,A9,B1,F3 ' p\r\n512 DATA 4C,F7,F0,18,07,02,3E,FE ' q\r\n513 DATA 7F,9F,31,41,81,81,F9,FD ' r\r\n515 DATA 7E,C3,9F,9F,9F,C3,7E,00 ' s\r\n520 FORF%=&H2000+ASC(\"a\")*8TO&H2097+ASC(\"a\")*8:READA$:VPOKEF%,VAL(\"&H\"+A$):NEXTF%:F%=USR2(0):F%=USR3(0)\r\n530 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' a\r\n531 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' b\r\n532 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' c\r\n533 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' d\r\n534 DATA D1,D1,41,71,71,41,D1,D1 ' e\r\n535 DATA A1,A1,A1,A1,A1,A1,A1,A1 ' f\r\n536 DATA F1,F1,F1,F1,D1,D1,D1,D1 ' g\r\n537 DATA D1,D1,D1,D1,D1,D1,D1,D1 ' h\r\n540 DATA D1,D1,21,21,21,21,41,41 ' i\r\n541 DATA 31,31,D1,D1,81,81,51,51 ' j\r\n542 DATA F1,F1,F1,21,21,F1,F1,F1 ' k\r\n543 DATA F1,F1,F1,F1,F1,F1,F1,F1 ' l\r\n544 DATA F1,41,41,F1,F1,41,41,F1 ' m\r\n545 DATA D1,D1,81,81,81,81,D1,D1 ' n\r\n546 DATA 21,21,21,21,21,21,21,21 ' o\r\n547 DATA 21,21,21,21,21,21,21,21 ' p\r\n548 DATA 21,21,21,21,21,21,21,21 ' q\r\n550 DATA 21,21,21,21,21,21,21,21 ' r\r\n551 DATA 90,90,90,90,90,90,90,00 ' s\r\n552 DATA 91,91,91,91,91,91,91,91 ' t\r\n"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_oric.bas",
    "content": "10 REM Golf\r\n20 CH=46080\r\n30 FOR Q=1 TO 3\r\n40 READ C\r\n50 FOR I=0 TO 7\r\n60 READ D\r\n70 POKE CH+C+I,D\r\n80 NEXT I\r\n90 NEXT Q\r\n100 DATA 264,8,12,14,8,8,8,8,62\r\n110 DATA 512,12,30,45,30,12,18,18,33\r\n120 DATA 280,12,30,31,46,62,60,28,24\r\n130 DIM T(9)\r\n140 XH =0:XC=0\r\n150 YH=0:HT=0:YC=0\r\n170 FOR H=1 TO 9\r\n180 HIRES\r\n190 PAPER 2: INK 7\r\n200 PRINT \"Hole Number \";H\r\n220 FOR Z=1 TO 8\r\n230 XB=INT(RND(1)*80)+80\r\n240 YB=INT(RND(1)*40)+50\r\n250 CURSET XB,YB,0\r\n260 CHAR 35,0,1\r\n270 NEXT Z\r\n300 X=INT(RND(1)*20)+20\r\n310 Y=INT(RND(1)*30)+120\r\n320 XT=INT(RND(1)*50)+150\r\n330 YT=INT(RND(1)*10)+20\r\n340 D=SGN(XT-X)*SQR((XT-X)*(XT-X)+(YT-Y)*(YT-Y))\r\n350 CURSET XT,YT,0\r\n360 CHAR 33,0,1\r\n370 CURSET X,Y,0\r\n380 CHAR 64,0,1\r\n400 PRINT \"Distance to next hole is \";INT(D)\r\n410 INPUT \"Which club (1 to 8)\";C\r\n420 IF C<1 OR C>8 THEN GOTO 420\r\n430 C=(9-C)\r\n440 GOSUB 1160\r\n480 GOSUB 800\r\n490 B=1\r\n500 D=SGN(XT-X1)*SQR((XT-X1)*(XT-X1)+(YT-Y1)*(YT-Y1))\r\n510 IF D<-15 THEN PRINT \"You overshot-try another hole\":WAIT 100:GOTO 180\r\n520 IF D<12 THEN PRINT \"ON THE GREEN\":WAIT 200:GOTO 1320\r\n530 CURSET X1,Y1,0\r\n540 CHAR 46,0,0\r\n550 CURSET X,Y,0\r\n560 CHAR 64,0,0\r\n570 X=X1\r\n580 Y=Y1\r\n590 GOTO 350\r\n640 PRINT \"You took \";T(H);\" strokes\"\r\n650 WAIT 200:PRINT CHR$(17)\r\n660 NEXT H\r\n670 CLS\r\n680 PRINT:PRINT\r\n690 PRINT SPC(15);\"This Round\"\r\n700 COL=1:R0W=5:GOSUB 1700\r\n720 FOR I=1 TO 9\r\n730 PRINT SPC(10);\"Hole \";I;\r\n740 IF T(I)=-1 THEN PRINT \" lost ball\":GOTO 760\r\n750 PRINT \" \";T(I);\" strokes\"\r\n760 NEXT I\r\n765 ROW=20:COL=5:GOSUB 1700\r\n770 INPUT \"Another round Y/N\";A$\r\n775 PRINT CHR$(17)\r\n780 IF A$ = \"Y\" THEN RUN\r\n790 CLS : STOP\r\n800 VT=C*(1+RND(1)*.01)\r\n810 HT=0\r\n820 XH=0\r\n840 Q=(Y-YT)/(XT-X)\r\n850 VV=-VT*(SIN(45*PI/180))\r\n860 XC=X+3\r\n870 YC=Y+3\r\n880 VH=VT*(COS(45*PI/180))\r\n890 HT=HT+VV\r\n900 YH=Q*XH\r\n910 VV=VV+1\r\n920 XH=XH+VH\r\n930 YH=-Q*XH\r\n940 IF XH+XC>250 THEN GOTO 1100\r\n950 IF YH+HT+YC<0 THEN GOTO 1100\r\n960 IF HT>=0 THEN GOTO 1040\r\n970 CURSET XH+XC,YH+HT+YC,0\r\n980 CHAR 46,0,1\r\n1000 WAIT 3\r\n1010 CURSET XH+XC,YH+HT+YC,0\r\n1020 CHAR 46,0,0\r\n1030 GOTO 890\r\n1040 X1=XH+XC\r\n1050 Y1=YH+HT+YC\r\n1070 CURSET X1,Y1,O\r\n1080 CHAR 46,0,1\r\n1090 RETURN\r\n1100 YH=0:YT=0:YC=0:XH=0:XC=0\r\n1110 PRINT \"You've lost your ball \"\r\n1120 PING\r\n1130 T(H)=-1\r\n1140 WAIT 300\r\n1150 POP:GOTO 660\r\n1160 T(H)=T(H)+1\r\n1170 XS=X+4\r\n1180 YS=Y+4\r\n1190 FOR S=-5 TO -40 STEP -5\r\n1200 A=S/30*PI\r\n1210 SX=10*SIN(A)\r\n1220 SY=-10*COS(A)\r\n1230 CURSET XS,YS,0\r\n1240 DRAW SX,SY,2\r\n1250 IF SO<>-30 THEN WAIT 10\r\n1260 IF S=-30 THEN PING\r\n1270 CURSET XS,YS,0\r\n1280 DRAW SX,SY,2\r\n1300 NEXT S\r\n1310 RETURN\r\n1320 TEXT:PRINT CHR$(17)\r\n1330 PAPER 2\r\n1340 XG=INT(RND(1)*5)+1\r\n1350 YG=15\r\n1360 XH=INT(RND(1)*15)+10\r\n1370 YH=15\r\n1380 D=XH-XG\r\n1390 IF D<0 THEN D=ABS(D)\r\n1400 PLOT XH,YH,\"O\"\r\n1410 PLOT XG,YG,\"@\"\r\n1420 R0W=22:C0L=1:GOSUB 1700\r\n1440 PRINT \"Distance to hole is \";D;\"   \"\r\n1450 INPUT \"Which club (1 to 8)\";C\r\n1460 IF C<1 OR C>8 THEN GOTO 1450\r\n1470 T(H)=T(H)+1\r\n1480 H1=8-C+INT(RND(1)*2)\r\n1485 IF D=1 AND C=8 THEN H1=1\r\n1490 D=D-H1\r\n1500 FOR Z=XG+1 TO XG+H1\r\n1510 PLOT Z,YH,\".\"\r\n1520 WAIT 10\r\n1530 PLOT Z,YH,\" \"\r\n1540 NEXT Z\r\n1550 PLOT XG,YG,\" \"\r\n1560 XG=XG+H1\r\n1570 IF XG=XH THEN GOTO 640\r\n1580 IF D<0 THEN CLS:XG=XH+D:GOTO 1380\r\n1590 GOTO 1400\r\n1700 DOKE #12,48040+R0W*40+COL-1\r\n1710 POKE #268,ROW+1\r\n1720 POKE #269,COL/2\r\n1730 RETURN"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_oric_2.bas",
    "content": "0DATA,12,,30,45,12,18,51,63,63,45,30,12,12,18,51,,61,61,61,,47,47,47,18,12,30'\r\n1DIME(40):DEFFNR(X)=INT(RND(1)*36)+2:FORA=0TO39:READV:POKE47368+A,V:NEXT:G=2''\r\n2POKE#26A,10:LORES1:INK6:FORY=5TO20:FORX=2TO37:PLOTX,Y,163:NEXTX,Y:POKE#BBA8,6\r\n3B=163:N=20:X=20:P=34:V=175:REPEAT:PLOTX,4,P:IFX=ZANDP=33THENP=34:DATA45,12,30\r\n4U=U+1:K=PEEK(#208):IFK>100THENPLOTX,4,32:X=X-((K=172)*(X>2))+((K=188)*(X<37))\r\n5IFK=132ANDP=34THENE(X)=0:FORI=6TON:PLOTX,I,V:PLOTX,I-1,B:NEXT:P=33:Z=1:O=O+10\r\n6IFZ=1THENZ=FNR(0):PLOTZ,4,92ELSEIFX=ZTHENP=34:IFU>999THENL=L+1:U=0:DATA45,,''\r\n7S=S+1:IFS>4THENS=L:GOSUB9ELSE:PRINT@6,0;\"Man:\"G\" Lvl:\"L\" Scr:\"O:UNTILE(E)>15'\r\n8IFGTHENG=G-1:SHOOT:FORI=0TO40:E(I)=0:NEXT:GOTO2ELSEEND:DATA54,58,54,,59,55,59\r\n9E=FNR(0):PLOTE,N-E(E),165:E(E)=E(E)+1:PLOTE,N-E(E),36:PLAY0,1,1,99:RETURN''''"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_oric_3.bas",
    "content": "0PAPER0:INK7:FORA=0TO15:READV:POKE47368+A,V:NEXT:DATA0,28,56,63,63,56,28,0,54\r\n1HIRES:POKE#26A,10:Q=14:P=-14:X=231:Y=100:M=0:L=0:W=200:H=200:DATA0,25,45,14\r\n2REPEAT:CURSETX,Y,3:CHAR33,1,0:K$=KEY$:Y=Y+(K$=\"A\")-(K$=\"Z\"):X=X+1:GOSUB6\r\n3IFX=232THENX=12:Y=RND(1)*160+20:INKRND(1)*7+1:GOSUB8:L=L+1:CLS:PRINT\"Level:\"L\r\n4CURSETX,Y,3:CHAR33,1,1:IFK$=\" \"THENZAP:M=1:GOSUB7:M=0:GOSUB7:DATA32,29,0\r\n5T=X+6:UNTILPOINT(T,Y+2)ORPOINT(T,Y+3)ORPOINT(T,Y+4)ORPOINT(T,Y+5):EXPLODE:END\r\n6IFRND(1)*100<3THENCURSETRND(1)*W+30,RND(1)*190,3:CHAR34,1,1:RETURNELSERETURN\r\n7CURSETX+6,Y+3,M:T=60+(X>170)*(X-170):DRAWT,0,M:DRAW1,1,3:DRAW-T,0,M:RETURN\r\n8PING:CURSET10,0,3:FORA=0TO7:DRAWQ,Q,1:DRAWQ,P,1:NEXT:DRAW0,199,1:FORA=0TO7:\r\n9DRAWP,P,1:DRAWP,Q,1:NEXT:FORA=0TO99:CURSETRND(1)*W+30,RND(1)*H,1:NEXT:RETURN"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_oric_4.bas",
    "content": "0PAPER0:INK7:TEXT:FORI=0TO15:READA:POKE#B908+I,A:NEXT:DEFFNR(X)=RND(1)*X:G=.1\r\n1HIRES:Y=150:M=3:FORI=12TO230STEP6:R=FNR(14)-7:IFY+R<190ANDY+R>120THENY=Y+R\r\n2CURSETI+6,Y,3:T=FNR(60)+35:CHART,1,1:CURSETI,Y,3:CHART,1,1:DRAW0,6,3\r\n3FILL193-Y,2,255:CURSETFNR(239),FNR(110),1:NEXT:Y=5:X=FNR(220)+12:PRINT\"LVL:\"S\r\n4POKE#26A,10:INK3:REPEAT:K=PEEK(#208):Y=Y+V:V=V+G:IFX+E>12ANDX+E<225THENX=X+E\r\n5IFK=156THENV=V-.3-G:ELSEIFK=172THENE=E-FNR(1)ELSEIFK=188THENE=E+FNR(1)\r\n6IFY<0THENY=0ELSE:CURSETQ,W,3:CHAR33,1,M:M=2:CURSETX,Y,3:CHAR33,1,M:Q=X:W=Y'''\r\n7L=Y+8:O=POINT(X,L):P=POINT(X+2,L):L=POINT(X+5,L):Z=Y>115AND(OORPORL):UNTILZ''\r\n8G=G+0.03:CURSETX+7,Y,3:S=S+1:DATA0,12,22,47,30,12,30,51,,,48,62,60,56,32,32\r\n9IFOANDPANDLANDV<2THENCHAR34,1,1:PING:WAIT200:GETA$:GOTO1ELSEEXPLODE"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_oric_5.bas",
    "content": "0 U=520:W=34:X=20:Y=25:P=X:DIMJ(40):M=123:B=32:A=125:Z=124:O=24:GOSUB7:REPEAT\r\n1 K=PEEK(U):PLOTX,Y,B:X=X+(K=170ANDX>2):X=X-(K=176ANDX<37):PLOTX,Y,M:PLOTP,Q,B\r\n2 F=-(K=159ANDQ<2):G=-(F=0):P=P*G+X*F:Q=(Q+(Q>1))*G+(Y-1)*F:V=RND(1)-.3<(L/20)\r\n3 H=-(Q>1ANDSCRN(P,Q)=A):PLOTP,Q,Z:ONHGOSUB6:IFFTHENPLOT1,O,7:ZAP:PLOT1,O,4\r\n4 L=L+H:I=-(I<w)*(i+4)-4*(i>=W):J=J(I):PLOTI,J,B:J=(J-V)*-(J<y)-2*(j<2):j(i)=j 5=\"\" h=\"-(Q\">1ANDSCRN(I,J)=Z):PLOTI,J,A:ONHGOSUB6:L=L+H:UNTILJ=Y:EXPLODE:END\r\n6 SHOOT:PLOTP,Q,42:S=S+Q:PLOT18,0,STR$(S):J(P)=1+L/2:WAIT7:PLOTP,Q,B:Q=1:RETURN\r\n7 INK4:CLS:POKE#26A,10:FORG=0TO26:F=2*-(G>0ANDG<9)-(G>8ANDG<18)*3-(G>17ANDG<=Y)\r\n8 PLOT0,G,F+16:NEXT:FORG=47064TO47087:READD:POKEG,D:NEXT:PLOT1,1,2:PLOT1,0,7\r\n9 Q=1:RETURN:DATA0,12,12,45,45,63,63,30,0,8,4,8,4,8,4,0,33,18,30,45,45,63,18,33"
  },
  {
    "path": "src/assets/examples/tile_sets/basic/tiles_sinclair.bas",
    "content": "5 POKE USR \"a\"+0,BIN 0000000\r\n10 POKE USR \"a\"+1,BIN 0001000\r\n20 POKE USR \"a\"+2,BIN 0011100\r\n30 POKE USR \"a\"+3,BIN 0111110\r\n40 POKE USR \"a\"+4,BIN 1111111\r\n50 POKE USR \"a\"+5,BIN 0111110\r\n60 POKE USR \"a\"+6,BIN 0011100\r\n70 POKE USR \"a\"+7,BIN 0001000\r\n"
  },
  {
    "path": "src/assets/generate_assets.py",
    "content": "#!/bin/python\n\nimport os\nimport sys\n\n# sys.path.append(\"..\")\n\nfrom LoggerSingleton import *\n\nglobal logger\n\nif len(sys.argv)<2:\n    game_dir = \"chase\"\nelse:\n    game_dir = sys.argv[1]\n\nif len(sys.argv)<3:\n    parent_dir = \"games\"\nelse:\n    parent_dir = sys.argv[2]\n\n# TODO: Maybe we should have more\nMAX_NUMBER_OF_TILES = 91\n\n\nATARI7800_FILE = \"cc65_udc_atari7800_160A.s\"\nATARI7800_HEADER = \\\n    \".export _conio_font\\n\" \\\n    \".rodata\\n\" \\\n    \".align 256\\n\" \\\n    \"_conio_font:\\n\\n\"\n\n\nPMD85_FILE = \"z88dk_6x8_pmd85.asm\"\n\nVERBOSE = False\n\ntile=[]\n\n\n# Read tile files from a given directory and store them into the tile variable\ndef read_tiles_from_dir(dir_name):\n    logger.info(\"read_tiles_from_dir\")\n    global tile\n    tile = []\n    for i in range(MAX_NUMBER_OF_TILES):\n        file_to_open = \"../\"+parent_dir+\"/\"+game_dir+\"/tiles/\"+dir_name+\"/tile\"+str(i)+\".txt\"\n        if not os.path.exists(file_to_open):\n            file_to_open = \"../\"+parent_dir+\"/\"+game_dir+\"/tiles/\"+dir_name+\"/tile_\"+format(i,\"03d\")+\".txt\"\n        if VERBOSE:\n            print(\"tile file to open: \" + file_to_open)\n        if os.path.exists(file_to_open):\n            with open(file_to_open, 'r') as myfile:\n                if VERBOSE:\n                    print(\"Opening file tile\"+file_to_open)\n                tile.append(myfile.read().replace('\\n',''))\n        else:\n            if VERBOSE:\n                print(\"Tile file NOT found\")\n            y = int(dir_name[2])\n            zerolist = str([0]*y)\n            tile.append(zerolist[1:len(zerolist)-1])\n\n\ndef read_templates_from_dir(dir_name):\n\n    global stripped_template_file_names\n\n    template_file_names = os.listdir(\"./templates/\"+dir_name)\n\n    stripped_template_file_names = []\n    for template_file_name in template_file_names:\n        if template_file_name.endswith(\".template\"):\n            stripped_template_file_name = template_file_name[:-9]\n            print(\"template_file_name: \"+template_file_name)\n            print(\"stripped file name: \"+stripped_template_file_name)\n            stripped_template_file_names.append(stripped_template_file_name)\n    print(\"Templates found: \"+str(len(stripped_template_file_names)))\n    print(\"\")\n\n\n\n# Input : 4 bits\n# Output: 8 bits with double bits, e.g. 1010 -> 11001100\ndouble_bit_map = { \n    0x0:0x00, 0x1:0x03, 0x2:0x0C, 0x3:0x0F, 0x4:0x30, 0x5:0x33, 0x6:0x3C, 0x7:0x3F,\n    0x8:0xC0, 0x9:0xC3, 0xA:0xCC, 0xB:0xCF, 0xC:0xF0, 0xD:0xF3, 0xE:0xFC, 0xF:0xFF\n}\n\n# COCO\n# 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,\n# 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF\n\ncolor_1 = 0x55 # red\ncolor_2 = 0xAA # green\ncolor_3 = 0xFF # white\n\n# color = 0x00, 0x55, 0xAA, 0xFF\n# Input : 4 bits, color\n# Output: 8 bits encoding 4 pixels in 4 color mode in a given color \ndef four_colored(four_bit, color):\n    return double_bit_map[four_bit]&color\n\n\n# Input : 1 byte, color\n# Output: 2 bytes encoding 8 pixels in 4 color mode in a given color\ndef one_to_two(source, color):\n    return [four_colored(source>>4,color), four_colored(source&0x0F,color)]\n\n\n# INPUT: 64 monochromatic tiles (64 x 8 bytes)\n# OUTPUT: \n# First 37  -> Converted in 37 4-color tiles in color 3\n# Second 27 -> Converted in 3 groups of 27 4-color tiles in color 1, 2, 3\ndef generate_two_bit_asset(abstract_asset):\n    two_bit_asset = []\n    # space, alphabet, digits (1+26+10=37)\n    for i in range(0,37):\n        for j in range(0,8):\n            two_bit_block = one_to_two(abstract_asset[i*8+j],color_3)\n            # two_bit_asset.extend(two_bit_block)\n            two_bit_asset.append(two_bit_block)\n\n        \n    # 27 tiles in color 0\n    for i in range(37,64):\n        for j in range(0,8):\n            two_bit_block = one_to_two(abstract_asset[i*8+j],color_1)\n            # two_bit_asset.extend(two_bit_block)\n            two_bit_asset.append(two_bit_block)\n        \n    # 27 tiles in color 1\n    for i in range(37,64):\n        for j in range(0,8):\n            two_bit_block = one_to_two(abstract_asset[i*8+j],color_2)\n            # two_bit_asset.extend(two_bit_block)\n            two_bit_asset.append(two_bit_block)\n\n        \n    # 27 tiles in color 2\n    for i in range(37,64):\n        for j in range(0,8):\n            two_bit_block = one_to_two(abstract_asset[i*8+j],color_3)\n            # two_bit_asset.extend(two_bit_block)\n            two_bit_asset.append(two_bit_block)\n\n    # padding to get to 128\n    for i in range(0,10):\n        for j in range(0,8):\n            two_bit_asset.append([255,255])\n\n    return two_bit_asset\n\n\n\n\n# def generate_160A_asset(two_bit_asset, two_bit_160A_asset):\n\n\ndef generate_160A_asset(two_bit_assets):\n   row_map = {0:[], 1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[]}\n   two_bit_160A_asset = []\n\n   counter = 0\n   for byte_couple in two_bit_assets:\n       row_map[counter&7].extend(byte_couple)\n       counter+=1\n       \n   for i in range(0,8):\n       two_bit_160A_asset.extend(row_map[7-i])\n       \n   return two_bit_160A_asset\n       \n\n\ndef process_a7800_160A_file():\n    \n    parent_path = \"./generated_assets/\"\n    dest_path = parent_path+game_dir\n\n    \n    fin = open(dest_path+\"/\"+ATARI7800_FILE, \"rt\")\n\n    res = []\n    source = []\n    for line in fin:\n        words = line.split(\",\")\n        for word in words:\n            word = word.strip()\n            if word != '' and  word != \"\\n\" and word != \"\\t\\n\" and word != \"\\r\\n\" and word != \"\\r\":\n                trimmed_word = word.replace(\"\\n\",\"\").replace(\" \",\"\").replace(\"$\",\"0x\")\n                # print(trimmed_word)\n                source.append(trimmed_word)\n                base = 16 if trimmed_word.startswith(\"0x\") else 10\n                res.append(int(trimmed_word, base))\n    fin.close()\n    # print(res)\n    \n    if len(res)==512:\n        print(\"Asset has correct length (512 bytes)\")\n    else:\n        print(\"Asset has wrong length: \" + str(len(res)))\n        \n    two_bit_assets = generate_two_bit_asset(res)\n    \n    # print(\"two_bit_assets: \\n\" + str(two_bit_assets))\n\n    a7800_assets = generate_160A_asset(two_bit_assets)\n    \n    print(\"length of a7800_assets: \" + str(len(a7800_assets)))\n    \n    formatted_assets = ATARI7800_HEADER + format_asset(a7800_assets)\n    \n    \n    # print(formatted_assets)\n    \n    return formatted_assets\n    # while(1):\n        # pass\n\n\n\n\n# --------------------------------------------------------------------------------------\n\n\ndef format_asset(assets):\n    res = \"\"\n    counter = 0\n    for asset in assets:\n        # print(\"[format_asset] asset: \" + str(asset))\n        if counter==0:\n            line = \".byte \"\n        line = line + str(asset)\n        counter=counter+1\n        if counter<8:\n            line = line + \", \"\n        else:\n            res = res + line + \"\\n\"\n            # print(\"line: \" + line)\n            # print(\"res: \" + res)\n            counter = 0\n    if counter>0:     \n        res = res + line + \"\\n\"\n        # print(\"line: \" + line)\n        # print(\"res: \" + res)   \n    # if res.endswith(', '):\n        res = res[:-3] + \"\\n\"\n    return res\n\n    \ndef generate_asset_from_template(dir_name, stripped_template_file_name):\n    matches = 0\n    print(\"\")\n    print(\"Handling \"+stripped_template_file_name)\n    print(\"\")\n    \n    fin = open(\"./templates/\"+dir_name+\"/\"+stripped_template_file_name+\".template\", \"rt\")\n    \n    parent_path = \"./generated_assets/\"\n    \n    if not os.path.exists(parent_path):\n        print(\"creating: \" + parent_path)\n        os.makedirs(parent_path)\n    \n    dest_path = parent_path+game_dir\n    \n    if not os.path.exists(dest_path):\n        print(\"creating: \" + dest_path)\n        os.makedirs(dest_path)\n    \n    fout = open(dest_path+\"/\"+stripped_template_file_name, \"wt\")\n\n    for line in fin:\n        newline = line\n        for i in range(len(tile)):\n            if stripped_template_file_name==PMD85_FILE:\n                digits_string = tile[i].split(\",\")\n                normalized_digits_string = \"\"\n                for digit_string in digits_string:\n                    normalized_digit_string = str(int(digit_string)*4)\n                    normalized_digits_string += normalized_digit_string + \",\"\n                normalized_digits_string = normalized_digits_string[:-1]\n                tile_data=normalized_digits_string\n            elif stripped_template_file_name.startswith(\"cmoc\"):\n                tile_data = tile[i].replace(\",\",\" \\n    FCB \")\n            else:\n                if stripped_template_file_name.endswith(\".h\"):\n                    tile_data = tile[i].replace(\"$\",\"0x\")\n                else:\n                    tile_data = tile[i]\n            if stripped_template_file_name.startswith(\"cmoc\"):\n                tile_data = tile_data + \"\\n\"\n            newline = newline.replace('<tile_'+str(i)+'>', tile_data)\n        fout.write(newline)\n        if line != newline:\n            matches = matches+1\n            if VERBOSE:\n                print(\"Changing \\n\"+line+\"with\\n\"+newline)\n            \n    if VERBOSE:\n        print(\"Number of tiles found: \"+str(matches)) \n        print(\"\")\n        print(\"\")\n    #close input and output files\n    fin.close()\n    fout.close()\n    if stripped_template_file_name==ATARI7800_FILE:\n        formatted_assets = process_a7800_160A_file()\n    \n        fout = open(dest_path+\"/formatted_\"+ATARI7800_FILE, \"wt\")\n        fout.write(formatted_assets)\n        fout.close()\n    \n\n\ndef generate_assets_from_dir(dir_name):\n\n    for stripped_template_file_name in stripped_template_file_names:\n        generate_asset_from_template(dir_name, stripped_template_file_name)\n\n\ndef main():\n\n    for dir_name in [\"8x8\", \"7x8\", \"6x8\", \"6x9\", \"8x6\"]:\n        print(\"dir name: \" + dir_name)\n        read_tiles_from_dir(dir_name)\n        read_templates_from_dir(dir_name)\n        generate_assets_from_dir(dir_name)\n\n\n\nif __name__ == \"__main__\":\n    # execute only if run as a script\n    logger = LoggerSingleton.initLogger('xl','../../logs')\n    \n    # logger.setLevel(logging.DEBUG) \n    # logging.basicConfig(filename='../logs/log_'+datetime.datetime.now().strftime(\"%Y-%m-%d_%H_%M_%S\")+'.log', level = logging.DEBUG)\n    # logging.basicConfig(filename='../../logs/xl_log_.log', level = logging.DEBUG)\n\n    logger.info(\"Started generate_assets\")\n    main()\n    logger.error(\"Finished generate_assets\")\n\n"
  },
  {
    "path": "src/assets/templates/4x4/4x4_chars.h.template",
    "content": "#ifndef _4X4_CHARS\r\n#define _4X4_CHARS\r\n\r\n#define _TILE_0_UDG     { <tile_0>}\r\n#define _TILE_1_UDG     { <tile_1>}\r\n#define _TILE_3_UDG     { <tile_3>}\r\n#define _TILE_2_UDG     { <tile_2>}\r\n\r\n#define _TILE_4_UDG     {<tile_4>}\r\n\r\n#define _TILE_7_UDG     { <tile_7>}\r\n\r\n#define _TILE_9_UDG     {  <tile_9>}\r\n\r\n#define _TILE_8_UDG     {  <tile_8>}\r\n\r\n#define _TILE_11_UDG    {  <tile_11>}\r\n\r\n#define _TILE_5_UDG     { <tile_5>}\r\n\r\n#define _TILE_16_UDG    { <tile_16>}\r\n\r\n#define _TILE_15_UDG    {  <tile_15>}\r\n\r\n#define _TILE_14_UDG    { <tile_14>}\r\n\r\n#define _TILE_6_UDG     {<tile_6>}\r\n\r\n#define _TILE_12_UDG    { <tile_12> }\r\n\r\n#define _TILE_13_UDG    {  <tile_13> }\r\n\r\n#define _TILE_10_UDG    { <tile_10> }\r\n\r\n\r\n#define _TILE_17_UDG    { <tile_17> }\r\n\r\n#define _TILE_18_UDG    { <tile_18> }\r\n\r\n#define _TILE_19_UDG    { <tile_19> }\r\n\r\n#define _TILE_20_UDG    { <tile_20> }\r\n\r\n#define _TILE_21_UDG    { <tile_21> }\r\n\r\n#define _TILE_22_UDG    { <tile_22> }\r\n\r\n#define _TILE_23_UDG    { <tile_23> }\r\n\r\n#define _TILE_24_UDG    { <tile_24> }\r\n\r\n#define _TILE_25_UDG    { <tile_25> }\r\n\r\n#define _TILE_26_UDG    { <tile_26> }\r\n\r\n\r\n#endif // _4x4_CHARS\r\n\r\n\r\n"
  },
  {
    "path": "src/assets/templates/6x8/6x8_chars.h.template",
    "content": "#ifndef _6X8_CHARS\n#define _6X8_CHARS\n\n    // A - Z\n\t#define _TILE_A { 0x08, 0x1C, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00 }\n\t#define _TILE_B { 0x3C, 0x12, 0x12, 0x1C, 0x12, 0x12, 0x3C, 0x00 }\n\t#define _TILE_C { 0x1C, 0x22, 0x20, 0x20, 0x20, 0x22, 0x1C, 0x00 }\n\t#define _TILE_D { 0x38, 0x24, 0x22, 0x22, 0x22, 0x24, 0x38, 0x00 }\n\t#define _TILE_E { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x3E, 0x00 }\n\t#define _TILE_F { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x00 }\n\t#define _TILE_G { 0x1C, 0x20, 0x20, 0x2E, 0x22, 0x22, 0x1C, 0x00 }\n\t#define _TILE_H { 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x00 }\n\t#define _TILE_I { 0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }\n\t#define _TILE_J { 0x0E, 0x04, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00 }\n\t#define _TILE_K { 0x22, 0x24, 0x28, 0x30, 0x28, 0x24, 0x22, 0x00 }\n\t#define _TILE_L { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E, 0x00 }\n\t#define _TILE_M { 0x22, 0x36, 0x2A, 0x2A, 0x22, 0x22, 0x22, 0x00 }\n\t#define _TILE_N { 0x22, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22, 0x00 }\n\t#define _TILE_O { 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }\n\t#define _TILE_P { 0x3C, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x20, 0x00 }\n\t#define _TILE_Q { 0x1C, 0x22, 0x22, 0x22, 0x2A, 0x24, 0x1A, 0x00 }\n\t#define _TILE_R { 0x3C, 0x22, 0x22, 0x3C, 0x28, 0x24, 0x22, 0x00 }\n\t#define _TILE_S { 0x1C, 0x22, 0x20, 0x1C, 0x02, 0x22, 0x1C, 0x00 }\n\t#define _TILE_T { 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }\n\t#define _TILE_U { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }\n\t#define _TILE_V { 0x22, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x00 }\n\t#define _TILE_W { 0x22, 0x22, 0x22, 0x2A, 0x2A, 0x36, 0x22, 0x00 }\n\t#define _TILE_X { 0x22, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00 }\n\t#define _TILE_Y { 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00 }\n\t#define _TILE_Z { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3E, 0x00 }\n    \n    // 0 - 9\n\t#define _TILE_DIGIT_0 { 0x1C, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x1C, 0x00 }\n\t#define _TILE_DIGIT_1 { 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }\n\t#define _TILE_DIGIT_2 { 0x1C, 0x22, 0x22, 0x0C, 0x10, 0x20, 0x3E, 0x00 }\n\t#define _TILE_DIGIT_3 { 0x1C, 0x22, 0x02, 0x0C, 0x02, 0x22, 0x1C, 0x00 }\n\t#define _TILE_DIGIT_4 { 0x04, 0x0C, 0x14, 0x24, 0x3E, 0x04, 0x04, 0x00 }\n\t#define _TILE_DIGIT_5 { 0x3E, 0x30, 0x3C, 0x02, 0x02, 0x22, 0x1C, 0x00 }\n\t#define _TILE_DIGIT_6 { 0x0C, 0x10, 0x20, 0x3C, 0x22, 0x22, 0x1C, 0x00 }\n\t#define _TILE_DIGIT_7 { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00 }\n\t#define _TILE_DIGIT_8 { 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00 }\n\t#define _TILE_DIGIT_9 { 0x1C, 0x22, 0x22, 0x1E, 0x02, 0x04, 0x08, 0x00 }\n\n\t#define _TILE_0_UDG     {<tile_0>}\n\t#define _TILE_1_UDG     {<tile_1>}\n\t#define _TILE_2_UDG     {<tile_2>}\n\t#define _TILE_3_UDG     {<tile_3>}\n\n\t#define _TILE_4_UDG     {<tile_4>}\n\t#define _TILE_7_UDG     {<tile_7>}\n\t#define _TILE_9_UDG     {<tile_9>}\n\t#define _TILE_8_UDG     {<tile_8>}\n\t#define _TILE_11_UDG    {<tile_11>}\n\t#define _TILE_5_UDG     {<tile_5>}\n\n\t#define _TILE_6_UDG     {<tile_6>}\n\t\n\t#define _TILE_16_UDG    {<tile_16>}\n\t#define _TILE_14_UDG    {<tile_14>}\n\t#define _TILE_15_UDG    {<tile_15>}\n\t#define _TILE_10_UDG    {<tile_10>}\n\t#define _TILE_12_UDG    {<tile_12>}\n\t#define _TILE_13_UDG    {<tile_13>}\n\t#define _TILE_17_UDG    {<tile_17>}\n\t#define _TILE_18_UDG    {<tile_18>}\n\n\t#define _TILE_19_UDG    {<tile_19>}\n\t#define _TILE_20_UDG    {<tile_20>}\n\t#define _TILE_21_UDG    {<tile_21>}\n\t#define _TILE_22_UDG    {<tile_22>}\n\t#define _TILE_23_UDG    {<tile_23>}\n\t#define _TILE_24_UDG    {<tile_24>}\n    #define _TILE_25_UDG    {<tile_25>}\n    #define _TILE_26_UDG    {<tile_26>}\n#endif // _6x8_CHARS\n\n"
  },
  {
    "path": "src/assets/templates/6x8/z88dk_6x8_pmd85.asm.template",
    "content": "SECTION rodata_font\r\nSECTION rodata_font_6x8\r\n\r\nPUBLIC _udgs\r\nPUBLIC _udgs_end\r\n\r\n_udgs:\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"------\"\r\n\tdefb %\"------\"\r\n\tdefb %\"------\"\r\n\tdefb %\"------\"\r\n\tdefb %\"------\"\r\n\tdefb %\"------\"\r\n\tdefb %\"------\"\r\n\r\n; invincibility\r\ndefb <tile_10>\r\n\r\n; left missile\r\ndefb <tile_14>\r\n\r\n; bullet\r\ndefb <tile_11>\r\n\r\n; dollar\r\ndefb <tile_25>\r\n\r\n; power-up F\r\ndefb <tile_17> \r\n\r\n\r\n; vertical brick\r\ndefb <tile_12>\r\n\r\n\r\n; skull\r\ndefb <tile_7>\r\n\t \r\n\r\n; ghost\r\ndefb    <tile_4>\r\n \r\n\r\n; bomb\r\ndefb <tile_5>\r\n\r\n\r\n; player down\r\ndefb <tile_0>\r\n\r\n\r\n; horizontal brick\r\ndefb <tile_13>\r\n\r\n\r\n; power-up S\r\ndefb <tile_8>\r\n\r\ndefb <tile_26>\r\n\r\n; right missile\r\ndefb <tile_15>\r\n\r\n\r\n; rocket\r\ndefb <tile_16>\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#--##\"\r\n\tdefb %\"-#-#-#\"\r\n\tdefb %\"-#-#-#\"\r\n\tdefb %\"-##--#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"--##--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"---##-\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"----#-\"\r\n\tdefb %\"---##-\"\r\n\tdefb %\"--#-#-\"\r\n\tdefb %\"-#--#-\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"----#-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"----#-\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--####\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\ndefb <tile_19> \r\n\r\n; power-up H\r\ndefb <tile_18> \r\n\r\n\r\n; player up\r\ndefb <tile_1>\r\n\r\n\r\n; player right\r\ndefb <tile_2>\r\n\r\n\r\n; player left\r\ndefb <tile_3>\r\n\r\n\r\n; gun\r\n    defb <tile_9>\r\n\r\n\r\ndefb <tile_20> \r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-###--\"\r\n\tdefb %\"-#--#-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#--#-\"\r\n\tdefb %\"-###--\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#-###\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#--#-\"\r\n\tdefb %\"-#-#--\"\r\n\tdefb %\"-##---\"\r\n\tdefb %\"-#-#--\"\r\n\tdefb %\"-#--#-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-##-##\"\r\n\tdefb %\"-#-#-#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-##--#\"\r\n\tdefb %\"-#-#-#\"\r\n\tdefb %\"-#--##\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#-#-#\"\r\n\tdefb %\"-#--##\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-####-\"\r\n\tdefb %\"-#--#-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"-----#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--###-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--#-#-\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#-#-#\"\r\n\tdefb %\"--#-#-\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--#-#-\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"--#-#-\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"-#---#\"\r\n\tdefb %\"--#-#-\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"------\"\r\n\r\n\tdefb %\"------\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"----#-\"\r\n\tdefb %\"---#--\"\r\n\tdefb %\"--#---\"\r\n\tdefb %\"-#----\"\r\n\tdefb %\"-#####\"\r\n\tdefb %\"------\"\r\n\r\n; dead ghost\r\ndefb <tile_6> \r\n\r\ndefb <tile_21> \r\n\r\ndefb <tile_22> \r\n\r\ndefb <tile_23> \r\n\r\ndefb <tile_24> \r\n\r\n_udgs_end:\r\n\r\n"
  },
  {
    "path": "src/assets/templates/6x9/6x9_chars.h.template",
    "content": "#ifndef _6X9_CHARS\r\n#define _6X9_CHARS\r\n\r\n\r\n    // A - Z\r\n\t#define _TILE_A { 0x08, 0x1C, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_B { 0x3C, 0x12, 0x12, 0x1C, 0x12, 0x12, 0x3C, 0x00 }\r\n\t#define _TILE_C { 0x1C, 0x22, 0x20, 0x20, 0x20, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_D { 0x38, 0x24, 0x22, 0x22, 0x22, 0x24, 0x38, 0x00 }\r\n\t#define _TILE_E { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x3E, 0x00 }\r\n\t#define _TILE_F { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x00 }\r\n\t#define _TILE_G { 0x1C, 0x20, 0x20, 0x2E, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_H { 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_I { 0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }\r\n\t#define _TILE_J { 0x0E, 0x04, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00 }\r\n\t#define _TILE_K { 0x22, 0x24, 0x28, 0x30, 0x28, 0x24, 0x22, 0x00 }\r\n\t#define _TILE_L { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E, 0x00 }\r\n\t#define _TILE_M { 0x22, 0x36, 0x2A, 0x2A, 0x22, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_N { 0x22, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_O { 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_P { 0x3C, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x20, 0x00 }\r\n\t#define _TILE_Q { 0x1C, 0x22, 0x22, 0x22, 0x2A, 0x24, 0x1A, 0x00 }\r\n\t#define _TILE_R { 0x3C, 0x22, 0x22, 0x3C, 0x28, 0x24, 0x22, 0x00 }\r\n\t#define _TILE_S { 0x1C, 0x22, 0x20, 0x1C, 0x02, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_T { 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }\r\n\t#define _TILE_U { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_V { 0x22, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x00 }\r\n\t#define _TILE_W { 0x22, 0x22, 0x22, 0x2A, 0x2A, 0x36, 0x22, 0x00 }\r\n\t#define _TILE_X { 0x22, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_Y { 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00 }\r\n\t#define _TILE_Z { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3E, 0x00 }\r\n    \r\n    // 0 - 9\r\n\t#define _TILE_DIGIT_0 { 0x1C, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_1 { 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_2 { 0x1C, 0x22, 0x22, 0x0C, 0x10, 0x20, 0x3E, 0x00 }\r\n\t#define _TILE_DIGIT_3 { 0x1C, 0x22, 0x02, 0x0C, 0x02, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_4 { 0x04, 0x0C, 0x14, 0x24, 0x3E, 0x04, 0x04, 0x00 }\r\n\t#define _TILE_DIGIT_5 { 0x3E, 0x30, 0x3C, 0x02, 0x02, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_6 { 0x0C, 0x10, 0x20, 0x3C, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_7 { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00 }\r\n\t#define _TILE_DIGIT_8 { 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_9 { 0x1C, 0x22, 0x22, 0x1E, 0x02, 0x04, 0x08, 0x00 }\r\n\r\n\r\n\t#define _TILE_0_UDG     {<tile_0>}\r\n\t#define _TILE_1_UDG     {<tile_1>}\r\n\t#define _TILE_2_UDG     {<tile_2>}\r\n\t#define _TILE_3_UDG     {<tile_3>}\r\n\r\n\t#define _TILE_4_UDG     {<tile_4>}\r\n\t#define _TILE_7_UDG     {<tile_7>}\r\n\t#define _TILE_9_UDG     {<tile_9>}\r\n\t#define _TILE_8_UDG     {<tile_8>}\r\n\t#define _TILE_11_UDG    {<tile_11>}\r\n\t#define _TILE_5_UDG     {<tile_5>}\r\n\r\n\t#define _TILE_6_UDG     {<tile_6>}\r\n\t\r\n\t#define _TILE_16_UDG    {<tile_16>}\r\n\t#define _TILE_14_UDG    {<tile_14>}\r\n\t#define _TILE_15_UDG    {<tile_15>}\r\n\t#define _TILE_10_UDG    {<tile_10>}\r\n\t#define _TILE_12_UDG    {<tile_12>}\r\n\t#define _TILE_13_UDG    {<tile_13>}\r\n\t#define _TILE_17_UDG    {<tile_17>}\r\n\t#define _TILE_18_UDG    {<tile_18>}\r\n\r\n\t#define _TILE_19_UDG    {<tile_19>}\r\n\t#define _TILE_20_UDG    {<tile_20>}\r\n\t#define _TILE_21_UDG    {<tile_21>}\r\n\t#define _TILE_22_UDG    {<tile_22>}\r\n\t#define _TILE_23_UDG    {<tile_23>}\r\n\t#define _TILE_24_UDG    {<tile_24>}\r\n\t#define _TILE_25_UDG    {<tile_25>}\r\n    #define _TILE_26_UDG    {<tile_26>}\r\n    \r\n#endif // _6x9_CHARS\r\n\r\n"
  },
  {
    "path": "src/assets/templates/7x8/7x8_chars.h.template",
    "content": "#ifndef _7X8_CHARS\r\n#define _7X8_CHARS\r\n\r\n\r\n    // A - Z\r\n\t#define _TILE_A { 0x08, 0x1C, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_B { 0x3C, 0x12, 0x12, 0x1C, 0x12, 0x12, 0x3C, 0x00 }\r\n\t#define _TILE_C { 0x1C, 0x22, 0x20, 0x20, 0x20, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_D { 0x38, 0x24, 0x22, 0x22, 0x22, 0x24, 0x38, 0x00 }\r\n\t#define _TILE_E { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x3E, 0x00 }\r\n\t#define _TILE_F { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x00 }\r\n\t#define _TILE_G { 0x1C, 0x20, 0x20, 0x2E, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_H { 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_I { 0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }\r\n\t#define _TILE_J { 0x0E, 0x04, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00 }\r\n\t#define _TILE_K { 0x22, 0x24, 0x28, 0x30, 0x28, 0x24, 0x22, 0x00 }\r\n\t#define _TILE_L { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E, 0x00 }\r\n\t#define _TILE_M { 0x22, 0x36, 0x2A, 0x2A, 0x22, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_N { 0x22, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_O { 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_P { 0x3C, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x20, 0x00 }\r\n\t#define _TILE_Q { 0x1C, 0x22, 0x22, 0x22, 0x2A, 0x24, 0x1A, 0x00 }\r\n\t#define _TILE_R { 0x3C, 0x22, 0x22, 0x3C, 0x28, 0x24, 0x22, 0x00 }\r\n\t#define _TILE_S { 0x1C, 0x22, 0x20, 0x1C, 0x02, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_T { 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }\r\n\t#define _TILE_U { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_V { 0x22, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x00 }\r\n\t#define _TILE_W { 0x22, 0x22, 0x22, 0x2A, 0x2A, 0x36, 0x22, 0x00 }\r\n\t#define _TILE_X { 0x22, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00 }\r\n\t#define _TILE_Y { 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00 }\r\n\t#define _TILE_Z { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3E, 0x00 }\r\n    \r\n    // 0 - 9\r\n\t#define _TILE_DIGIT_0 { 0x1C, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_1 { 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_2 { 0x1C, 0x22, 0x22, 0x0C, 0x10, 0x20, 0x3E, 0x00 }\r\n\t#define _TILE_DIGIT_3 { 0x1C, 0x22, 0x02, 0x0C, 0x02, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_4 { 0x04, 0x0C, 0x14, 0x24, 0x3E, 0x04, 0x04, 0x00 }\r\n\t#define _TILE_DIGIT_5 { 0x3E, 0x30, 0x3C, 0x02, 0x02, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_6 { 0x0C, 0x10, 0x20, 0x3C, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_7 { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00 }\r\n\t#define _TILE_DIGIT_8 { 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00 }\r\n\t#define _TILE_DIGIT_9 { 0x1C, 0x22, 0x22, 0x1E, 0x02, 0x04, 0x08, 0x00 }\r\n\r\n\r\n\r\n\t#define _TILE_0_UDG     {<tile_0>}\r\n\t#define _TILE_1_UDG     {<tile_1>}\r\n\t#define _TILE_2_UDG     {<tile_2>}\r\n\t#define _TILE_3_UDG     {<tile_3>}\r\n\r\n\t#define _TILE_4_UDG     {<tile_4>}\r\n\t#define _TILE_7_UDG     {<tile_7>}\r\n\t#define _TILE_9_UDG     {<tile_9>}\r\n\t#define _TILE_8_UDG     {<tile_8>}\r\n\t#define _TILE_11_UDG    {<tile_11>}\r\n\t#define _TILE_5_UDG     {<tile_5>}\r\n\r\n\t#define _TILE_6_UDG     {<tile_6>}\r\n\t\r\n\t#define _TILE_16_UDG    {<tile_16>}\r\n\t#define _TILE_14_UDG    {<tile_14>}\r\n\t#define _TILE_15_UDG    {<tile_15>}\r\n\t#define _TILE_10_UDG    {<tile_10>}\r\n\t#define _TILE_12_UDG    {<tile_12>}\r\n\t#define _TILE_13_UDG    {<tile_13>}\r\n\t#define _TILE_17_UDG    {<tile_17>}\r\n\t#define _TILE_18_UDG    {<tile_18>}\r\n\r\n\t#define _TILE_19_UDG    {<tile_19>}\r\n\t#define _TILE_20_UDG    {<tile_20>}\r\n\t#define _TILE_21_UDG    {<tile_21>}\r\n\t#define _TILE_22_UDG    {<tile_22>}\r\n\t#define _TILE_23_UDG    {<tile_23>}\r\n\t#define _TILE_24_UDG    {<tile_24>}\r\n\t#define _TILE_25_UDG    {<tile_25>}\r\n    #define _TILE_26_UDG    {<tile_26>}\r\n    #define _TILE_27_UDG    {<tile_27>}\r\n#endif // _7x8_CHARS"
  },
  {
    "path": "src/assets/templates/8x6/8x6_chars.h.template",
    "content": "#ifndef _8x6_C_DEFINITION\r\n#define _8x6_C_DEFINITION\r\n\r\n#include \"standard_libs.h\"\r\n\r\n\r\n    // A - Z\r\n\t#define _TILE_A {60, 98, 126, 98, 98, 0}\r\n\t#define _TILE_B {124, 98, 124, 98, 124,0}\r\n\t#define _TILE_C {60, 98, 96, 98, 60, 0}\r\n\t#define _TILE_D {124, 98, 98, 98, 124,0}\r\n\t#define _TILE_E {126, 96, 120, 96, 126,0}\r\n\t#define _TILE_F {126, 96, 120, 96, 96, 0}\r\n\t#define _TILE_G {60, 96, 102, 98, 60, 0}\r\n\t#define _TILE_H {98, 98, 126, 98, 98, 0}\r\n\t#define _TILE_I {60, 24, 24, 24, 60, 0}\r\n\t#define _TILE_J {6, 6, 6, 70, 60,0}\r\n\t#define _TILE_K {100, 104, 112, 104, 100, 0}\r\n\t#define _TILE_L {96, 96, 96, 96, 124, 0}\r\n\t#define _TILE_M {98, 118, 106, 98, 98, 0}\r\n\t#define _TILE_N {98, 114, 106, 102, 98, 0}\r\n\t#define _TILE_O {60, 98, 98, 98, 60, 0}\r\n\t#define _TILE_P {124, 98, 124, 96, 96, 0}\r\n\t#define _TILE_Q {60, 98, 98, 106, 60, 0}\r\n\t#define _TILE_R {124, 98, 124, 104, 100, 0}\r\n\t#define _TILE_S {62, 96, 60, 6, 124, 0}\r\n\t#define _TILE_T {126, 24, 24, 24, 24, 0}\r\n\t#define _TILE_U {98, 98, 98, 98, 60, 0}\r\n\t#define _TILE_V {98, 98, 52, 52, 24, 0}\r\n\t#define _TILE_W {193, 193, 106, 106, 52, 0}\r\n\t#define _TILE_X {99, 54, 28, 54, 99, 0}\r\n\t#define _TILE_Y {98, 52, 24, 24, 24, 0}\r\n\t#define _TILE_Z {126, 6, 24, 96, 126,0}\r\n\r\n    // 0 - 9\r\n\t#define _TILE_DIGIT_0 {28, 34, 34, 34, 28, 0}\r\n\t#define _TILE_DIGIT_1 {12, 20, 4, 4, 30, 0}\r\n\t#define _TILE_DIGIT_2 {60, 2, 28, 32, 62, 0}\r\n\t#define _TILE_DIGIT_3 {60, 2, 12, 2, 60, 0}\r\n\t#define _TILE_DIGIT_4 {12, 20, 36, 62, 4, 0}\r\n\t#define _TILE_DIGIT_5 {62, 32, 28, 2, 60, 0}\r\n\t#define _TILE_DIGIT_6 {30, 32, 60, 34, 28, 0}\r\n\t#define _TILE_DIGIT_7 {62, 2, 4, 8, 16, 0}\r\n\t#define _TILE_DIGIT_8 {28, 34, 28, 34, 28, 0}\r\n\t#define _TILE_DIGIT_9 {28, 34, 30, 2, 60, 0}\r\n\r\n\r\n\r\n\r\n#define _TILE_0_UDG    {<tile_0>}\r\n#define _TILE_1_UDG    {<tile_1>}\r\n#define _TILE_2_UDG    {<tile_2>}\r\n#define _TILE_3_UDG    {<tile_3>}\r\n#define _TILE_4_UDG    {<tile_4>}\r\n#define _TILE_5_UDG    {<tile_5>}\r\n#define _TILE_6_UDG    {<tile_6>}\r\n#define _TILE_7_UDG    {<tile_7>}\r\n#define _TILE_8_UDG    {<tile_8>}\r\n#define _TILE_9_UDG    {<tile_9>}\r\n#define _TILE_10_UDG   {<tile_10>}\r\n#define _TILE_11_UDG   {<tile_11>}\r\n#define _TILE_12_UDG   {<tile_12>}\r\n#define _TILE_13_UDG   {<tile_13>}\r\n#define _TILE_14_UDG   {<tile_14>}\r\n#define _TILE_15_UDG   {<tile_15>}\r\n#define _TILE_16_UDG   {<tile_16>}\r\n#define _TILE_17_UDG   {<tile_17>}\r\n#define _TILE_18_UDG   {<tile_18>}\r\n#define _TILE_19_UDG   {<tile_19>}\r\n#define _TILE_20_UDG   {<tile_20>}\r\n#define _TILE_21_UDG   {<tile_21>}\r\n#define _TILE_22_UDG   {<tile_22>}\r\n#define _TILE_23_UDG   {<tile_23>}\r\n#define _TILE_24_UDG   {<tile_24>}\r\n#define _TILE_25_UDG   {<tile_25>}\r\n#define _TILE_26_UDG   {<tile_26>}\r\n\r\n\r\n#endif // _8x6_C_DEFINITION\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x6/8x6_tiles.s.template",
    "content": "\t\t.export __compressed_tile_data\r\n\r\n__compressed_tile_data:\r\n\r\n; tile 0\r\n.byte    <tile_0>\r\n\r\n; tile 1\r\n.byte    <tile_1>\r\n\r\n; tile 2\r\n.byte    <tile_2>\r\n\r\n; tile 3\r\n.byte    <tile_3>\r\n\r\n; tile 4\r\n.byte    <tile_4>\r\n\r\n; tile 5\r\n.byte    <tile_5>\r\n\r\n; tile 6\r\n.byte    <tile_6>\r\n\r\n; tile 7\r\n.byte    <tile_7>\r\n\r\n; tile 8\r\n.byte    <tile_8>\r\n\r\n; tile 9\r\n.byte    <tile_9>\r\n\r\n; tile 10\r\n.byte    <tile_10>\r\n\r\n; tile 11\r\n.byte    <tile_11>\r\n\r\n; tile 12\r\n.byte    <tile_12>\r\n\r\n; tile 13\r\n.byte    <tile_13>\r\n\r\n; tile 14\r\n.byte    <tile_14>\r\n\r\n; tile 15\r\n.byte    <tile_15>\r\n\r\n; tile 16\r\n.byte    <tile_16>\r\n\r\n; tile 17\r\n.byte    <tile_17>\r\n\r\n; tile 18\r\n.byte    <tile_18>\r\n\r\n; tile 19\r\n.byte    <tile_19>\r\n\r\n; tile 20\r\n.byte    <tile_20>\r\n\r\n; tile 21\r\n.byte    <tile_21>\r\n\r\n; tile 22\r\n.byte    <tile_22>\r\n\r\n; tile 23\r\n.byte    <tile_23>\r\n\r\n; tile 24\r\n.byte    <tile_24>\r\n\r\n; tile 25\r\n.byte    <tile_25>\r\n\r\n; tile 26\r\n.byte    <tile_26>\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x6/z88dk_8x6_sprites_definitions.h.template",
    "content": "#ifndef _Z88DK_8X6_SPRITES_DEFINITIONS\r\n#define _Z88DK_8X6_SPRITES_DEFINITIONS\r\n\r\n\r\n__asm\r\n\t._sprites\r\n\r\n; 0\r\n\tdefb    8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\t\r\n\r\n; 1\r\n\tdefb    8,6\r\n    defb <tile_10>\r\n\r\n\r\n; 2\r\n\tdefb    8,6\r\n    defb <tile_14>\r\n\r\n\r\n; 3\r\n\tdefb    8,6\t\r\n    defb <tile_11>\r\n\r\n; 4\r\n\tdefb 8,6\r\n    defb <tile_25>\r\n\r\n; 5\r\n\tdefb    8,6\r\n    defb <tile_17>\r\n\r\n; 6\r\n\tdefb    8,6\t\r\n    defb <tile_12>\r\n\r\n; 7\r\n\tdefb 8,6\r\n    defb <tile_7>\r\n\r\n; 8\r\n\tdefb 8,6\r\n    defb <tile_4>\r\n\r\n; 9\r\n\tdefb 8,6\r\n    defb <tile_5>\r\n\r\n; 10\r\n\tdefb 8,6\r\n    defb <tile_0>\r\n\r\n; 11\r\n\tdefb 8,6\r\n    defb <tile_13>\r\n\r\n; 12\r\n\tdefb 8,6\r\n    defb <tile_8>\r\n\r\n; 13\r\n\tdefb 8,6\r\n\tdefb <tile_26>\r\n\r\n; 14\r\n\tdefb 8,6\r\n    defb <tile_15>\r\n\r\n\r\n; 15\r\n\tdefb 8,6\r\n    defb <tile_16>\r\n\r\n; 16\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 17\r\n\tdefb 8,6\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\r\n; 18\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\r\n; 19\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 20\r\n\tdefb 8,6\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"----#---\"\r\n\r\n; 21\r\n\tdefb 8,6\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 22\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 23\r\n\tdefb 8,6\r\n\tdefb %\"-######-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\r\n; 24\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 25\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 26\r\n\tdefb 8,6\r\n    defb <tile_19>\r\n\r\n; 27\r\n\tdefb 8,6\r\n    defb <tile_18>\r\n\r\n; 28\r\n\tdefb 8,6\r\n    defb <tile_1>\r\n\r\n; 29\r\n\tdefb 8,6\r\n    defb <tile_2>\r\n\r\n; 30\r\n\tdefb 8,6\r\n    defb <tile_3>\r\n\r\n; 31\r\n\tdefb 8,6\r\n    defb <tile_9>\r\n\r\n; 32\r\n\tdefb    8,6\r\n    defb <tile_20>\r\n\r\n; 33\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n    \r\n; 34\r\n\tdefb 8,6\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\r\n; 35\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 36\r\n\tdefb 8,6\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\r\n; 37\r\n\tdefb 8,6\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\r\n; 38\r\n\tdefb 8,6\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\r\n; 39\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#--###-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 40\r\n\tdefb 8,6\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\r\n; 41\r\n\tdefb 8,6\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\r\n; 42\r\n\tdefb 8,6\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 43\r\n\tdefb 8,6\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\r\n; 44\r\n\tdefb 8,6\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\r\n; 45\r\n\tdefb 8,6\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##--##-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\r\n; 46\r\n\tdefb 8,6\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#----#-\"\r\n\r\n; 47\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 48\r\n\tdefb 8,6\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\r\n; 49\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 50\r\n\tdefb 8,6\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\r\n; 51\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 52\r\n\tdefb 8,6\r\n\tdefb %\"#######-\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\r\n; 53\r\n\tdefb 8,6\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 54\r\n\tdefb 8,6\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\r\n; 55\r\n\tdefb 8,6\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"--#--#--\"\r\n\r\n; 56\r\n\tdefb 8,6\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"-#----#-\"\r\n\r\n; 57\r\n\tdefb 8,6\r\n\tdefb %\"#-----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\r\n; 58\r\n\tdefb 8,6\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-######-\"\r\n\r\n; 59\r\n\tdefb 8,6\r\n    defb <tile_6>\r\n\r\n; 60\r\n\tdefb 8,6\r\n    defb <tile_21>\r\n\r\n; 61\r\n\tdefb 8,6\r\n    defb <tile_22>\r\n\r\n; 62\r\n\tdefb 8,6\r\n    defb <tile_23>\r\n\r\n; 63\r\n\tdefb 8,6\r\n    defb <tile_24>\r\n\r\n#if !defined(__FEWER_SPRITES)\r\n; 64\r\n\tdefb 8,6\r\n    defb %\"---###--\"\r\n    defb %\"--#---#-\"\r\n    defb %\"-####---\"\r\n    defb %\"--#-----\"\r\n    defb %\"--#-----\"\r\n    defb %\"-######-\"\r\n\r\n\r\n; 65\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\r\n; 66\r\n\tdefb 8,6\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--####--\"\r\n\r\n; 67\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"---###--\"\r\n\r\n; 68\r\n\tdefb 8,6\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\r\n; 69\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\r\n; 70\r\n\tdefb 8,6\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\r\n; 71\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n; 72\r\n\tdefb 8,6\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\r\n; 73\r\n\tdefb 8,6\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\r\n; 74\r\n\tdefb 8,6\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\r\n; 75\r\n\tdefb 8,6\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#--#--\"\r\n\r\n; 76\r\n\tdefb 8,6\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\r\n; 77\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"-##-#---\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\r\n; 78\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\r\n; 79\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\r\n; 80\r\n\tdefb 8,6\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\r\n; 81\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----##-\"\r\n\r\n; 82\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\r\n; 83\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-####---\"\r\n\r\n; 84\r\n\tdefb 8,6\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\r\n; 85\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\r\n; 86\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\r\n; 87\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"--#-#---\"\r\n\r\n; 88\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#---#--\"\r\n\r\n; 89\r\n\tdefb 8,6\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n; 90\r\n\tdefb 8,6\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-#####--\"\r\n\r\n; 91\r\n\tdefb 8,6\r\n\tdefb %\"----###-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----###-\"\r\n\r\n; 92\r\n\tdefb 8,6\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\r\n; 93\r\n\tdefb 8,6\r\n\tdefb %\"-###----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"-###----\"\r\n\r\n; 94\r\n\tdefb 8,6\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\r\n; 95\r\n\tdefb 8,6\r\n\tdefb %\"--####--\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"--####--\"\r\n\r\n#endif\r\n\r\n\tdefb    8,6\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\r\n\r\n__endasm;\r\n\r\n#endif // _Z88DK_8X6_SPRITES_DEFINITIONS\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/8x8_chars.h.template",
    "content": "#ifndef _8X8_CHARS\r\n#define _8X8_CHARS\r\n\r\n\r\n// A - Z\r\n#define _TILE_A { 0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0x00 }\r\n#define _TILE_B { 0xfc,0xc6,0xc6,0xfc,0xc6,0xc6,0xfc,0x00 }\r\n#define _TILE_C { 0x3c,0x66,0xc0,0xc0,0xc0,0x66,0x3c,0x00 }\r\n#define _TILE_D { 0xf8,0xcc,0xc6,0xc6,0xc6,0xcc,0xf8,0x00 }\r\n#define _TILE_E { 0xfc,0xc0,0xc0,0xf8,0xc0,0xc0,0xfe,0x00 }\r\n#define _TILE_F { 0xfc,0xc0,0xc0,0xf8,0xc0,0xc0,0xc0,0x00 }\r\n#define _TILE_G { 0x3e,0x60,0xc0,0xce,0xc6,0x66,0x3e,0x00 }\r\n#define _TILE_H { 0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00 }\r\n#define _TILE_I { 0xfc,0x30,0x30,0x30,0x30,0x30,0xfc,0x00 }\r\n#define _TILE_J { 0x06,0x06,0x06,0x06,0x06,0xc6,0x7c,0x00 }\r\n#define _TILE_K { 0xc6,0xcc,0xd8,0xf0,0xf8,0xdc,0xce,0x00 }\r\n#define _TILE_L { 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xfe,0x00 }\r\n#define _TILE_M { 0xc6,0xee,0xfe,0xd6,0xc6,0xc6,0xc6,0x00 }\r\n#define _TILE_N { 0xc6,0xe6,0xf6,0xde,0xce,0xc6,0xc6,0x00 }\r\n#define _TILE_O { 0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00 }\r\n#define _TILE_P { 0xfc,0xc6,0xc6,0xc6,0xfc,0xc0,0xc0,0x00 }\r\n#define _TILE_Q { 0x7c,0xc6,0xc6,0xc6,0xde,0xcc,0x7a,0x00 }\r\n#define _TILE_R { 0xfc,0xc6,0xc6,0xcc,0xf8,0xdc,0xce,0x00 }\r\n#define _TILE_S { 0x78,0xcc,0xc0,0x7c,0x06,0xc6,0x7c,0x00 }\r\n#define _TILE_T { 0xfc,0x30,0x30,0x30,0x30,0x30,0x30,0x00 }\r\n#define _TILE_U { 0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00 }\r\n#define _TILE_V { 0xc6,0xc6,0xc6,0xc6,0x6c,0x38,0x10,0x00 }\r\n#define _TILE_W { 0xc6,0xc6,0xd6,0xfe,0xfe,0xee,0xc6,0x00 }\r\n#define _TILE_X { 0xc6,0xee,0x7c,0x38,0x7c,0xee,0xc6,0x00 }\r\n#define _TILE_Y { 0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x00 }\r\n#define _TILE_Z { 0xfe,0x0e,0x1c,0x38,0x70,0xe0,0xfe,0x00  }\r\n\r\n// 0 - 9\r\n#define _TILE_DIGIT_0 { 0x38,0x4c,0xc6,0xc6,0xc6,0x64,0x38,0x00 }\r\n#define _TILE_DIGIT_1 { 0x30,0x70,0x30,0x30,0x30,0x30,0xfc,0x00 }\r\n#define _TILE_DIGIT_2 { 0x7c,0xc6,0x0e,0x3c,0x60,0xc0,0xfe,0x00 }\r\n#define _TILE_DIGIT_3 { 0x7e,0x0c,0x18,0x3c,0x06,0xc6,0x7c,0x00 }\r\n#define _TILE_DIGIT_4 { 0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x00 }\r\n#define _TILE_DIGIT_5 { 0xfc,0xc0,0xfc,0x06,0x06,0xc6,0x7c,0x00 }\r\n#define _TILE_DIGIT_6 { 0x3c,0x60,0xc0,0xfc,0xc6,0xc6,0x7c,0x00 }\r\n#define _TILE_DIGIT_7 { 0xfe,0xc6,0x0c,0x18,0x30,0x30,0x30,0x00 }\r\n#define _TILE_DIGIT_8 { 0x78,0xc4,0xe4,0x78,0x9e,0x86,0x7c,0x00 }\r\n#define _TILE_DIGIT_9 { 0x7c,0xc6,0xc6,0x7e,0x06,0x0c,0x78,0x00 }\r\n\r\n#define _SPACE_TILE   {0,0,0,0,0,0,0,0}\r\n\r\n#define _TILE_0_UDG     { <tile_0>}\r\n#define _TILE_1_UDG     { <tile_1>}\r\n#define _TILE_3_UDG     { <tile_3>}\r\n#define _TILE_2_UDG     { <tile_2>}\r\n\r\n#define _TILE_4_UDG     {<tile_4>}\r\n\r\n#define _TILE_7_UDG     { <tile_7>}\r\n\r\n#define _TILE_9_UDG     {  <tile_9>}\r\n\r\n#define _TILE_8_UDG     {  <tile_8>}\r\n\r\n#define _TILE_11_UDG    {  <tile_11>}\r\n\r\n#define _TILE_5_UDG     { <tile_5>}\r\n\r\n#define _TILE_16_UDG    { <tile_16>}\r\n\r\n#define _TILE_15_UDG    {  <tile_15>}\r\n\r\n#define _TILE_14_UDG    { <tile_14>}\r\n\r\n#define _TILE_6_UDG     {<tile_6>}\r\n\r\n#define _TILE_12_UDG    { <tile_12> }\r\n\r\n#define _TILE_13_UDG    {  <tile_13> }\r\n\r\n#define _TILE_10_UDG    { <tile_10> }\r\n\r\n\r\n#define _TILE_17_UDG    { <tile_17> }\r\n\r\n#define _TILE_18_UDG    { <tile_18> }\r\n\r\n#define _TILE_19_UDG    { <tile_19> }\r\n\r\n#define _TILE_20_UDG    { <tile_20> }\r\n\r\n#define _TILE_21_UDG    { <tile_21> }\r\n\r\n#define _TILE_22_UDG    { <tile_22> }\r\n\r\n#define _TILE_23_UDG    { <tile_23> }\r\n\r\n#define _TILE_24_UDG    { <tile_24> }\r\n\r\n#define _TILE_25_UDG    { <tile_25> }\r\n\r\n#define _TILE_26_UDG    { <tile_26> }\r\n\r\n\r\n#endif // _8x8_CHARS\r\n\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_agat.s.template",
    "content": "\t\t.export _udgs\n\n_udgs:\n\n.byte <tile_0>\n\n.byte <tile_1>\n\n.byte <tile_2>\n\n.byte <tile_3>\n\n.byte <tile_4>\n\n.byte <tile_5>\n\n.byte <tile_6>\n\n.byte <tile_7>\n\n.byte <tile_8>\n\n.byte <tile_9>\n\n.byte <tile_10>\n\n.byte <tile_11>\n\n.byte <tile_12>\n\n.byte <tile_13>\n\n.byte <tile_14>\n\n.byte <tile_15>\n\n.byte <tile_16>\n\n.byte <tile_17>\n\n.byte <tile_18>\n\n.byte <tile_19>\n\n.byte <tile_20>\n\n.byte <tile_21>\n\n.byte <tile_22>\n\n.byte <tile_23>\n\n.byte <tile_24>\n\n.byte <tile_25>\n\n.byte <tile_26>\n\n.byte $00,$00,$00,$00,$00,$00,$00,$00 ; 32\n\n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00 ; z\n\n.byte $38,$4c,$c6,$c6,$c6,$64,$38,$00 ; 0\n.byte $30,$70,$30,$30,$30,$30,$fc,$00,$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\n.byte $7e,$0c,$18,$3c,$06,$c6,$7c,$00,$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\n.byte $fc,$c0,$fc,$06,$06,$c6,$7c,$00,$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\n.byte $fe,$c6,$0c,$18,$30,$30,$30,$00,$78,$c4,$e4,$78,$9e,$86,$7c,$00\n.byte $7c,$c6,$c6,$7e,$06,$0c,$78,$00 ; 9\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_gamate_tiles.s.template",
    "content": "; VGA charset for the Gamate conio implementation\n\n.export fontdata\n\n.rodata\n\nfontdata:\n.byte <tile_26>\n.byte <tile_13>\n.byte <tile_12>\n.byte <tile_0>\n.byte <tile_1>\n.byte <tile_2>\n.byte <tile_3>\n.byte <tile_5>\n.byte <tile_7>\n.byte <tile_4>\n.byte <tile_6>\n.byte <tile_8>\n.byte <tile_17>\n.byte 0,0,0,0,0,0,0,0\n.byte <tile_9>\n.byte <tile_18>\n.byte <tile_11>\n.byte <tile_10>\n.byte  <tile_16>\n.byte <tile_14>\n.byte <tile_15>\n.byte <tile_6>\n.byte <tile_19>\n.byte <tile_20>\n.byte <tile_21>\n.byte <tile_22>\n.byte <tile_23>\n.byte <tile_24>\n.byte <tile_25>\n.byte   $00, $24, $66, $FF, $66, $24, $00, $00\n.byte   $00, $18, $3C, $7E, $FF, $FF, $00, $00\n.byte   $00, $FF, $FF, $7E, $3C, $18, $00, $00\n.byte   $00, $00, $00, $00, $00, $00, $00, $00\n.byte   $30, $78, $78, $78, $30, $00, $30, $00\n.byte   $6C, $6C, $6C, $00, $00, $00, $00, $00\n.byte   $6C, $6C, $FE, $6C, $FE, $6C, $6C, $00\n.byte   $30, $7C, $C0, $78, $0C, $F8, $30, $00\n.byte   $00, $C6, $CC, $18, $30, $66, $C6, $00\n.byte   $38, $6C, $38, $76, $DC, $CC, $76, $00\n.byte   $60, $60, $C0, $00, $00, $00, $00, $00\n.byte   $18, $30, $60, $60, $60, $30, $18, $00\n.byte   $60, $30, $18, $18, $18, $30, $60, $00\n.byte   $00, $66, $3C, $FF, $3C, $66, $00, $00\n.byte   $00, $30, $30, $FC, $30, $30, $00, $00\n.byte   $00, $00, $00, $00, $00, $30, $30, $60\n.byte   $00, $00, $00, $FC, $00, $00, $00, $00\n.byte   $00, $00, $00, $00, $00, $30, $30, $00\n.byte   $06, $0C, $18, $30, $60, $C0, $80, $00\n.byte   $7C, $C6, $CE, $DE, $F6, $E6, $7C, $00\n.byte   $30, $70, $30, $30, $30, $30, $FC, $00\n.byte   $78, $CC, $0C, $38, $60, $CC, $FC, $00\n.byte   $78, $CC, $0C, $38, $0C, $CC, $78, $00\n.byte   $1C, $3C, $6C, $CC, $FE, $0C, $1E, $00\n.byte   $FC, $C0, $F8, $0C, $0C, $CC, $78, $00\n.byte   $38, $60, $C0, $F8, $CC, $CC, $78, $00\n.byte   $FC, $CC, $0C, $18, $30, $30, $30, $00\n.byte   $78, $CC, $CC, $78, $CC, $CC, $78, $00\n.byte   $78, $CC, $CC, $7C, $0C, $18, $70, $00\n.byte   $00, $30, $30, $00, $00, $30, $30, $00\n.byte   $00, $30, $30, $00, $00, $30, $30, $60\n.byte   $18, $30, $60, $C0, $60, $30, $18, $00\n.byte   $00, $00, $FC, $00, $00, $FC, $00, $00\n.byte   $60, $30, $18, $0C, $18, $30, $60, $00\n.byte   $78, $CC, $0C, $18, $30, $00, $30, $00\n.byte   $7C, $C6, $DE, $DE, $DE, $C0, $78, $00\n.byte   $30, $78, $CC, $CC, $FC, $CC, $CC, $00\n.byte   $FC, $66, $66, $7C, $66, $66, $FC, $00\n.byte   $3C, $66, $C0, $C0, $C0, $66, $3C, $00\n.byte   $F8, $6C, $66, $66, $66, $6C, $F8, $00\n.byte   $7E, $60, $60, $78, $60, $60, $7E, $00\n.byte   $7E, $60, $60, $78, $60, $60, $60, $00\n.byte   $3C, $66, $C0, $C0, $CE, $66, $3E, $00\n.byte   $CC, $CC, $CC, $FC, $CC, $CC, $CC, $00\n.byte   $78, $30, $30, $30, $30, $30, $78, $00\n.byte   $1E, $0C, $0C, $0C, $CC, $CC, $78, $00\n.byte   $E6, $66, $6C, $78, $6C, $66, $E6, $00\n.byte   $60, $60, $60, $60, $60, $60, $7E, $00\n.byte   $C6, $EE, $FE, $FE, $D6, $C6, $C6, $00\n.byte   $C6, $E6, $F6, $DE, $CE, $C6, $C6, $00\n.byte   $38, $6C, $C6, $C6, $C6, $6C, $38, $00\n.byte   $FC, $66, $66, $7C, $60, $60, $F0, $00\n.byte   $78, $CC, $CC, $CC, $DC, $78, $1C, $00\n.byte   $FC, $66, $66, $7C, $6C, $66, $E6, $00\n.byte   $78, $CC, $E0, $70, $1C, $CC, $78, $00\n.byte   $FC, $30, $30, $30, $30, $30, $30, $00\n.byte   $CC, $CC, $CC, $CC, $CC, $CC, $FC, $00\n.byte   $CC, $CC, $CC, $CC, $CC, $78, $30, $00\n.byte   $C6, $C6, $C6, $D6, $FE, $EE, $C6, $00\n.byte   $C6, $C6, $6C, $38, $38, $6C, $C6, $00\n.byte   $CC, $CC, $CC, $78, $30, $30, $78, $00\n.byte   $FE, $06, $0C, $18, $30, $60, $FE, $00\n.byte   $78, $60, $60, $60, $60, $60, $78, $00\n.byte   $C0, $60, $30, $18, $0C, $06, $02, $00\n.byte   $78, $18, $18, $18, $18, $18, $78, $00\n.byte   $10, $38, $6C, $C6, $00, $00, $00, $00\n.byte   $00, $00, $00, $00, $00, $00, $00, $FF\n.byte   $30, $30, $18, $00, $00, $00, $00, $00\n.byte   $00, $00, $78, $0C, $7C, $CC, $76, $00\n.byte   $E0, $60, $60, $7C, $66, $66, $DC, $00\n.byte   $00, $00, $78, $CC, $C0, $CC, $78, $00\n.byte   $1C, $0C, $0C, $7C, $CC, $CC, $76, $00\n.byte   $00, $00, $78, $CC, $FC, $C0, $78, $00\n.byte   $38, $6C, $60, $F0, $60, $60, $F0, $00\n.byte   $00, $00, $76, $CC, $CC, $7C, $0C, $F8\n.byte   $E0, $60, $6C, $76, $66, $66, $E6, $00\n.byte   $30, $00, $70, $30, $30, $30, $78, $00\n.byte   $0C, $00, $0C, $0C, $0C, $CC, $CC, $78\n.byte   $E0, $60, $66, $6C, $78, $6C, $E6, $00\n.byte   $70, $30, $30, $30, $30, $30, $78, $00\n.byte   $00, $00, $CC, $FE, $FE, $D6, $C6, $00\n.byte   $00, $00, $F8, $CC, $CC, $CC, $CC, $00\n.byte   $00, $00, $78, $CC, $CC, $CC, $78, $00\n.byte   $00, $00, $DC, $66, $66, $7C, $60, $F0\n.byte   $00, $00, $76, $CC, $CC, $7C, $0C, $1E\n.byte   $00, $00, $DC, $76, $66, $60, $F0, $00\n.byte   $00, $00, $7C, $C0, $78, $0C, $F8, $00\n.byte   $10, $30, $7C, $30, $30, $34, $18, $00\n.byte   $00, $00, $CC, $CC, $CC, $CC, $76, $00\n.byte   $00, $00, $CC, $CC, $CC, $78, $30, $00\n.byte   $00, $00, $C6, $D6, $FE, $FE, $6C, $00\n.byte   $00, $00, $C6, $6C, $38, $6C, $C6, $00\n.byte   $00, $00, $CC, $CC, $CC, $7C, $0C, $F8\n.byte   $00, $00, $FC, $98, $30, $64, $FC, $00\n.byte   $1C, $30, $30, $E0, $30, $30, $1C, $00\n.byte   $18, $18, $18, $00, $18, $18, $18, $00\n.byte   $E0, $30, $30, $1C, $30, $30, $E0, $00\n.byte   $76, $DC, $00, $00, $00, $00, $00, $00\n.byte   $00, $10, $38, $6C, $C6, $C6, $FE, $00\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_nes_color_tiles.s.template",
    "content": "; ------------------------------------------------------------------------\n; Character data\n; ------------------------------------------------------------------------\n\n        .export         NESfont\n\n.segment        \"CHARS\"\n\nNESfont:\n        .byte   %00000000       ; 0000 1-00:\n        .byte   %00000000       ; 0001 1-00:\n        .byte   %00000000       ; 0002 1-00:\n        .byte   %00000000       ; 0003 1-00:\n        .byte   %00000000       ; 0004 1-00:\n        .byte   %00000000       ; 0005 1-00:\n        .byte   %00000000       ; 0006 1-00:\n        .byte   %00000000       ; 0007 1-00:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_0>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_0>\n\n        .byte   <tile_0>\n\n        .byte   <tile_0>\n\n        .byte   <tile_1>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_1>\n\n        .byte   <tile_1>\n\n        .byte   <tile_1>\n\n        .byte   <tile_2>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_2>\n\n        .byte   <tile_2>\n\n        .byte   <tile_2>\n\n        .byte   <tile_3>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_3>\n\n        .byte   <tile_3>\n\n        .byte   <tile_3>\n\n\n        .byte   <tile_4>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_4>\n\n\n        .byte   <tile_4>\n\n        .byte   <tile_4>\n\n        .byte   <tile_5>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_5>\n\n\n        .byte   <tile_5>\n\n        .byte   <tile_5>\n\n        .byte   <tile_6>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_6>\n\n\n        .byte   <tile_6>\n\n        .byte   <tile_6>\n\n        .byte   <tile_7>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_7>\n\n\n        .byte   <tile_7>\n\n        .byte   <tile_7>\n\n        .byte   <tile_8>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_8>\n\n\n        .byte   <tile_8>\n\n        .byte   <tile_8>\n\n        .byte   <tile_9>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_9>\n\n\n        .byte   <tile_9>\n\n        .byte   <tile_9>\n\n        .byte   %11110000       ; 01F0 1-3e: ****\n        .byte   %11110000       ; 01F1 1-3e: ****\n        .byte   %11110000       ; 01F2 1-3e: ****\n        .byte   %11110000       ; 01F3 1-3e: ****\n        .byte   %00001111       ; 01F4 1-3e:     ****\n        .byte   %00001111       ; 01F5 1-3e:     ****\n        .byte   %00001111       ; 01F6 1-3e:     ****\n        .byte   %00001111       ; 01F7 1-3e:     ****\n\n        .byte   %11110000       ; 01F8 1-3f: ****\n        .byte   %11110000       ; 01F9 1-3f: ****\n        .byte   %11110000       ; 01FA 1-3f: ****\n        .byte   %11110000       ; 01FB 1-3f: ****\n        .byte   %00001111       ; 01FC 1-3f:     ****\n        .byte   %00001111       ; 01FD 1-3f:     ****\n        .byte   %00001111       ; 01FE 1-3f:     ****\n        .byte   %00001111       ; 01FF 1-3f:     ****\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_10>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_10>\n\n        .byte   <tile_10>\n\n        .byte   <tile_10>\n\n        .byte   %00011000       ; 0240 1-48:    **\n        .byte   %00111110       ; 0241 1-48:   *****\n        .byte   %01100000       ; 0242 1-48:  **\n        .byte   %00111100       ; 0243 1-48:   ****\n        .byte   %00000110       ; 0244 1-48:      **\n        .byte   %01111100       ; 0245 1-48:  *****\n        .byte   %00011000       ; 0246 1-48:    **\n        .byte   %00000000       ; 0247 1-48:\n\n        .byte   %00011000       ; 0248 1-49:    **\n        .byte   %00111110       ; 0249 1-49:   *****\n        .byte   %01100000       ; 024A 1-49:  **\n        .byte   %00111100       ; 024B 1-49:   ****\n        .byte   %00000110       ; 024C 1-49:      **\n        .byte   %01111100       ; 024D 1-49:  *****\n        .byte   %00011000       ; 024E 1-49:    **\n        .byte   %00000000       ; 024F 1-49:\n\n        .byte   <tile_11>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_11>\n\n        .byte   <tile_11>\n\n        .byte   <tile_11>\n\n        .byte   <tile_12>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_12>\n\n        .byte   <tile_12>\n\n        .byte   <tile_12>\n\n\n        .byte   <tile_3>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_3>\n\n        .byte   <tile_3>\n\n        .byte   <tile_3>\n        \n        .byte   %00000000       ; 02E0 1-5c:\n        .byte   %00000000       ; 02E1 1-5c:\n        .byte   %00000000       ; 02E2 1-5c:\n        .byte   %00000000       ; 02E3 1-5c:\n        .byte   %00000000       ; 02E4 1-5c:\n        .byte   %00011000       ; 02E5 1-5c:    **\n        .byte   %00011000       ; 02E6 1-5c:    **\n        .byte   %00000000       ; 02E7 1-5c:\n\n        .byte   %00000000       ; 02E8 1-5d:\n        .byte   %00000000       ; 02E9 1-5d:\n        .byte   %00000000       ; 02EA 1-5d:\n        .byte   %00000000       ; 02EB 1-5d:\n        .byte   %00000000       ; 02EC 1-5d:\n        .byte   %00011000       ; 02ED 1-5d:    **\n        .byte   %00011000       ; 02EE 1-5d:    **\n        .byte   %00000000       ; 02EF 1-5d:\n\n        .byte   %00000000       ; 02F0 1-5e:\n        .byte   %00000011       ; 02F1 1-5e:       **\n        .byte   %00000110       ; 02F2 1-5e:      **\n        .byte   %00001100       ; 02F3 1-5e:     **\n        .byte   %00011000       ; 02F4 1-5e:    **\n        .byte   %00110000       ; 02F5 1-5e:   **\n        .byte   %01100000       ; 02F6 1-5e:  **\n        .byte   %00000000       ; 02F7 1-5e:\n\n        .byte   %00000000       ; 02F8 1-5f:\n        .byte   %00000011       ; 02F9 1-5f:       **\n        .byte   %00000110       ; 02FA 1-5f:      **\n        .byte   %00001100       ; 02FB 1-5f:     **\n        .byte   %00011000       ; 02FC 1-5f:    **\n        .byte   %00110000       ; 02FD 1-5f:   **\n        .byte   %01100000       ; 02FE 1-5f:  **\n        .byte   %00000000       ; 02FF 1-5f:\n\n        .byte   %00111100       ; 0300 1-60:   ****\n        .byte   %01100110       ; 0301 1-60:  **  **\n        .byte   %01101110       ; 0302 1-60:  ** ***\n        .byte   %01110110       ; 0303 1-60:  *** **\n        .byte   %01100110       ; 0304 1-60:  **  **\n        .byte   %01100110       ; 0305 1-60:  **  **\n        .byte   %00111100       ; 0306 1-60:   ****\n        .byte   %00000000       ; 0307 1-60:\n\n        .byte   %00111100       ; 0308 1-61:   ****\n        .byte   %01100110       ; 0309 1-61:  **  **\n        .byte   %01101110       ; 030A 1-61:  ** ***\n        .byte   %01110110       ; 030B 1-61:  *** **\n        .byte   %01100110       ; 030C 1-61:  **  **\n        .byte   %01100110       ; 030D 1-61:  **  **\n        .byte   %00111100       ; 030E 1-61:   ****\n        .byte   %00000000       ; 030F 1-61:\n\n        .byte   %00011000       ; 0310 1-62:    **\n        .byte   %00011000       ; 0311 1-62:    **\n        .byte   %00111000       ; 0312 1-62:   ***\n        .byte   %00011000       ; 0313 1-62:    **\n        .byte   %00011000       ; 0314 1-62:    **\n        .byte   %00011000       ; 0315 1-62:    **\n        .byte   %01111110       ; 0316 1-62:  ******\n        .byte   %00000000       ; 0317 1-62:\n\n        .byte   %00011000       ; 0318 1-63:    **\n        .byte   %00011000       ; 0319 1-63:    **\n        .byte   %00111000       ; 031A 1-63:   ***\n        .byte   %00011000       ; 031B 1-63:    **\n        .byte   %00011000       ; 031C 1-63:    **\n        .byte   %00011000       ; 031D 1-63:    **\n        .byte   %01111110       ; 031E 1-63:  ******\n        .byte   %00000000       ; 031F 1-63:\n\n        .byte   %00111100       ; 0320 1-64:   ****\n        .byte   %01100110       ; 0321 1-64:  **  **\n        .byte   %00000110       ; 0322 1-64:      **\n        .byte   %00001100       ; 0323 1-64:     **\n        .byte   %00110000       ; 0324 1-64:   **\n        .byte   %01100000       ; 0325 1-64:  **\n        .byte   %01111110       ; 0326 1-64:  ******\n        .byte   %00000000       ; 0327 1-64:\n\n        .byte   %00111100       ; 0328 1-65:   ****\n        .byte   %01100110       ; 0329 1-65:  **  **\n        .byte   %00000110       ; 032A 1-65:      **\n        .byte   %00001100       ; 032B 1-65:     **\n        .byte   %00110000       ; 032C 1-65:   **\n        .byte   %01100000       ; 032D 1-65:  **\n        .byte   %01111110       ; 032E 1-65:  ******\n        .byte   %00000000       ; 032F 1-65:\n\n        .byte   %00111100       ; 0330 1-66:   ****\n        .byte   %01100110       ; 0331 1-66:  **  **\n        .byte   %00000110       ; 0332 1-66:      **\n        .byte   %00011100       ; 0333 1-66:    ***\n        .byte   %00000110       ; 0334 1-66:      **\n        .byte   %01100110       ; 0335 1-66:  **  **\n        .byte   %00111100       ; 0336 1-66:   ****\n        .byte   %00000000       ; 0337 1-66:\n\n        .byte   %00111100       ; 0338 1-67:   ****\n        .byte   %01100110       ; 0339 1-67:  **  **\n        .byte   %00000110       ; 033A 1-67:      **\n        .byte   %00011100       ; 033B 1-67:    ***\n        .byte   %00000110       ; 033C 1-67:      **\n        .byte   %01100110       ; 033D 1-67:  **  **\n        .byte   %00111100       ; 033E 1-67:   ****\n        .byte   %00000000       ; 033F 1-67:\n\n        .byte   %00000110       ; 0340 1-68:      **\n        .byte   %00001110       ; 0341 1-68:     ***\n        .byte   %00011110       ; 0342 1-68:    ****\n        .byte   %01100110       ; 0343 1-68:  **  **\n        .byte   %01111111       ; 0344 1-68:  *******\n        .byte   %00000110       ; 0345 1-68:      **\n        .byte   %00000110       ; 0346 1-68:      **\n        .byte   %00000000       ; 0347 1-68:\n\n        .byte   %00000110       ; 0348 1-69:      **\n        .byte   %00001110       ; 0349 1-69:     ***\n        .byte   %00011110       ; 034A 1-69:    ****\n        .byte   %01100110       ; 034B 1-69:  **  **\n        .byte   %01111111       ; 034C 1-69:  *******\n        .byte   %00000110       ; 034D 1-69:      **\n        .byte   %00000110       ; 034E 1-69:      **\n        .byte   %00000000       ; 034F 1-69:\n\n        .byte   %01111110       ; 0350 1-6a:  ******\n        .byte   %01100000       ; 0351 1-6a:  **\n        .byte   %01111100       ; 0352 1-6a:  *****\n        .byte   %00000110       ; 0353 1-6a:      **\n        .byte   %00000110       ; 0354 1-6a:      **\n        .byte   %01100110       ; 0355 1-6a:  **  **\n        .byte   %00111100       ; 0356 1-6a:   ****\n        .byte   %00000000       ; 0357 1-6a:\n\n        .byte   %01111110       ; 0358 1-6b:  ******\n        .byte   %01100000       ; 0359 1-6b:  **\n        .byte   %01111100       ; 035A 1-6b:  *****\n        .byte   %00000110       ; 035B 1-6b:      **\n        .byte   %00000110       ; 035C 1-6b:      **\n        .byte   %01100110       ; 035D 1-6b:  **  **\n        .byte   %00111100       ; 035E 1-6b:   ****\n        .byte   %00000000       ; 035F 1-6b:\n\n        .byte   %00111100       ; 0360 1-6c:   ****\n        .byte   %01100110       ; 0361 1-6c:  **  **\n        .byte   %01100000       ; 0362 1-6c:  **\n        .byte   %01111100       ; 0363 1-6c:  *****\n        .byte   %01100110       ; 0364 1-6c:  **  **\n        .byte   %01100110       ; 0365 1-6c:  **  **\n        .byte   %00111100       ; 0366 1-6c:   ****\n        .byte   %00000000       ; 0367 1-6c:\n\n        .byte   %00111100       ; 0368 1-6d:   ****\n        .byte   %01100110       ; 0369 1-6d:  **  **\n        .byte   %01100000       ; 036A 1-6d:  **\n        .byte   %01111100       ; 036B 1-6d:  *****\n        .byte   %01100110       ; 036C 1-6d:  **  **\n        .byte   %01100110       ; 036D 1-6d:  **  **\n        .byte   %00111100       ; 036E 1-6d:   ****\n        .byte   %00000000       ; 036F 1-6d:\n\n        .byte   %01111110       ; 0370 1-6e:  ******\n        .byte   %01100110       ; 0371 1-6e:  **  **\n        .byte   %00001100       ; 0372 1-6e:     **\n        .byte   %00011000       ; 0373 1-6e:    **\n        .byte   %00011000       ; 0374 1-6e:    **\n        .byte   %00011000       ; 0375 1-6e:    **\n        .byte   %00011000       ; 0376 1-6e:    **\n        .byte   %00000000       ; 0377 1-6e:\n\n        .byte   %01111110       ; 0378 1-6f:  ******\n        .byte   %01100110       ; 0379 1-6f:  **  **\n        .byte   %00001100       ; 037A 1-6f:     **\n        .byte   %00011000       ; 037B 1-6f:    **\n        .byte   %00011000       ; 037C 1-6f:    **\n        .byte   %00011000       ; 037D 1-6f:    **\n        .byte   %00011000       ; 037E 1-6f:    **\n        .byte   %00000000       ; 037F 1-6f:\n\n        .byte   %00111100       ; 0380 1-70:   ****\n        .byte   %01100110       ; 0381 1-70:  **  **\n        .byte   %01100110       ; 0382 1-70:  **  **\n        .byte   %00111100       ; 0383 1-70:   ****\n        .byte   %01100110       ; 0384 1-70:  **  **\n        .byte   %01100110       ; 0385 1-70:  **  **\n        .byte   %00111100       ; 0386 1-70:   ****\n        .byte   %00000000       ; 0387 1-70:\n\n        .byte   %00111100       ; 0388 1-71:   ****\n        .byte   %01100110       ; 0389 1-71:  **  **\n        .byte   %01100110       ; 038A 1-71:  **  **\n        .byte   %00111100       ; 038B 1-71:   ****\n        .byte   %01100110       ; 038C 1-71:  **  **\n        .byte   %01100110       ; 038D 1-71:  **  **\n        .byte   %00111100       ; 038E 1-71:   ****\n        .byte   %00000000       ; 038F 1-71:\n\n        .byte   %00111100       ; 0390 1-72:   ****\n        .byte   %01100110       ; 0391 1-72:  **  **\n        .byte   %01100110       ; 0392 1-72:  **  **\n        .byte   %00111110       ; 0393 1-72:   *****\n        .byte   %00000110       ; 0394 1-72:      **\n        .byte   %01100110       ; 0395 1-72:  **  **\n        .byte   %00111100       ; 0396 1-72:   ****\n        .byte   %00000000       ; 0397 1-72:\n\n        .byte   %00111100       ; 0398 1-73:   ****\n        .byte   %01100110       ; 0399 1-73:  **  **\n        .byte   %01100110       ; 039A 1-73:  **  **\n        .byte   %00111110       ; 039B 1-73:   *****\n        .byte   %00000110       ; 039C 1-73:      **\n        .byte   %01100110       ; 039D 1-73:  **  **\n        .byte   %00111100       ; 039E 1-73:   ****\n        .byte   %00000000       ; 039F 1-73:\n\n        .byte   <tile_13>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_13>\n\n        .byte   <tile_13>\n\n        .byte   <tile_13>\n\n        .byte   <tile_14>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_14>\n\n        .byte   <tile_14>\n\n        .byte   <tile_14>\n\n        .byte   %00111100       ; 0400 1-80:   ****\n        .byte   %01100110       ; 0401 1-80:  **  **\n        .byte   %01101110       ; 0402 1-80:  ** ***\n        .byte   %01101110       ; 0403 1-80:  ** ***\n        .byte   %01100000       ; 0404 1-80:  **\n        .byte   %01100010       ; 0405 1-80:  **   *\n        .byte   %00111100       ; 0406 1-80:   ****\n        .byte   %00000000       ; 0407 1-80:\n\n        .byte   %00111100       ; 0408 1-81:   ****\n        .byte   %01100110       ; 0409 1-81:  **  **\n        .byte   %01101110       ; 040A 1-81:  ** ***\n        .byte   %01101110       ; 040B 1-81:  ** ***\n        .byte   %01100000       ; 040C 1-81:  **\n        .byte   %01100010       ; 040D 1-81:  **   *\n        .byte   %00111100       ; 040E 1-81:   ****\n        .byte   %00000000       ; 040F 1-81:\n\n        .byte   %00011000       ; 0410 1-82:    **\n        .byte   %00111100       ; 0411 1-82:   ****\n        .byte   %01100110       ; 0412 1-82:  **  **\n        .byte   %01111110       ; 0413 1-82:  ******\n        .byte   %01100110       ; 0414 1-82:  **  **\n        .byte   %01100110       ; 0415 1-82:  **  **\n        .byte   %01100110       ; 0416 1-82:  **  **\n        .byte   %00000000       ; 0417 1-82:\n\n        .byte   %00011000       ; 0418 1-83:    **\n        .byte   %00111100       ; 0419 1-83:   ****\n        .byte   %01100110       ; 041A 1-83:  **  **\n        .byte   %01111110       ; 041B 1-83:  ******\n        .byte   %01100110       ; 041C 1-83:  **  **\n        .byte   %01100110       ; 041D 1-83:  **  **\n        .byte   %01100110       ; 041E 1-83:  **  **\n        .byte   %00000000       ; 041F 1-83:\n\n        .byte   %01111100       ; 0420 1-84:  *****\n        .byte   %01100110       ; 0421 1-84:  **  **\n        .byte   %01100110       ; 0422 1-84:  **  **\n        .byte   %01111100       ; 0423 1-84:  *****\n        .byte   %01100110       ; 0424 1-84:  **  **\n        .byte   %01100110       ; 0425 1-84:  **  **\n        .byte   %01111100       ; 0426 1-84:  *****\n        .byte   %00000000       ; 0427 1-84:\n\n        .byte   %01111100       ; 0428 1-85:  *****\n        .byte   %01100110       ; 0429 1-85:  **  **\n        .byte   %01100110       ; 042A 1-85:  **  **\n        .byte   %01111100       ; 042B 1-85:  *****\n        .byte   %01100110       ; 042C 1-85:  **  **\n        .byte   %01100110       ; 042D 1-85:  **  **\n        .byte   %01111100       ; 042E 1-85:  *****\n        .byte   %00000000       ; 042F 1-85:\n\n        .byte   %00111100       ; 0430 1-86:   ****\n        .byte   %01100110       ; 0431 1-86:  **  **\n        .byte   %01100000       ; 0432 1-86:  **\n        .byte   %01100000       ; 0433 1-86:  **\n        .byte   %01100000       ; 0434 1-86:  **\n        .byte   %01100110       ; 0435 1-86:  **  **\n        .byte   %00111100       ; 0436 1-86:   ****\n        .byte   %00000000       ; 0437 1-86:\n\n        .byte   %00111100       ; 0438 1-87:   ****\n        .byte   %01100110       ; 0439 1-87:  **  **\n        .byte   %01100000       ; 043A 1-87:  **\n        .byte   %01100000       ; 043B 1-87:  **\n        .byte   %01100000       ; 043C 1-87:  **\n        .byte   %01100110       ; 043D 1-87:  **  **\n        .byte   %00111100       ; 043E 1-87:   ****\n        .byte   %00000000       ; 043F 1-87:\n\n        .byte   %01111000       ; 0440 1-88:  ****\n        .byte   %01101100       ; 0441 1-88:  ** **\n        .byte   %01100110       ; 0442 1-88:  **  **\n        .byte   %01100110       ; 0443 1-88:  **  **\n        .byte   %01100110       ; 0444 1-88:  **  **\n        .byte   %01101100       ; 0445 1-88:  ** **\n        .byte   %01111000       ; 0446 1-88:  ****\n        .byte   %00000000       ; 0447 1-88:\n\n        .byte   %01111000       ; 0448 1-89:  ****\n        .byte   %01101100       ; 0449 1-89:  ** **\n        .byte   %01100110       ; 044A 1-89:  **  **\n        .byte   %01100110       ; 044B 1-89:  **  **\n        .byte   %01100110       ; 044C 1-89:  **  **\n        .byte   %01101100       ; 044D 1-89:  ** **\n        .byte   %01111000       ; 044E 1-89:  ****\n        .byte   %00000000       ; 044F 1-89:\n\n        .byte   %01111110       ; 0450 1-8a:  ******\n        .byte   %01100000       ; 0451 1-8a:  **\n        .byte   %01100000       ; 0452 1-8a:  **\n        .byte   %01111000       ; 0453 1-8a:  ****\n        .byte   %01100000       ; 0454 1-8a:  **\n        .byte   %01100000       ; 0455 1-8a:  **\n        .byte   %01111110       ; 0456 1-8a:  ******\n        .byte   %00000000       ; 0457 1-8a:\n\n        .byte   %01111110       ; 0458 1-8b:  ******\n        .byte   %01100000       ; 0459 1-8b:  **\n        .byte   %01100000       ; 045A 1-8b:  **\n        .byte   %01111000       ; 045B 1-8b:  ****\n        .byte   %01100000       ; 045C 1-8b:  **\n        .byte   %01100000       ; 045D 1-8b:  **\n        .byte   %01111110       ; 045E 1-8b:  ******\n        .byte   %00000000       ; 045F 1-8b:\n\n        .byte   %01111110       ; 0460 1-8c:  ******\n        .byte   %01100000       ; 0461 1-8c:  **\n        .byte   %01100000       ; 0462 1-8c:  **\n        .byte   %01111000       ; 0463 1-8c:  ****\n        .byte   %01100000       ; 0464 1-8c:  **\n        .byte   %01100000       ; 0465 1-8c:  **\n        .byte   %01100000       ; 0466 1-8c:  **\n        .byte   %00000000       ; 0467 1-8c:\n\n        .byte   %01111110       ; 0468 1-8d:  ******\n        .byte   %01100000       ; 0469 1-8d:  **\n        .byte   %01100000       ; 046A 1-8d:  **\n        .byte   %01111000       ; 046B 1-8d:  ****\n        .byte   %01100000       ; 046C 1-8d:  **\n        .byte   %01100000       ; 046D 1-8d:  **\n        .byte   %01100000       ; 046E 1-8d:  **\n        .byte   %00000000       ; 046F 1-8d:\n\n        .byte   %00111100       ; 0470 1-8e:   ****\n        .byte   %01100110       ; 0471 1-8e:  **  **\n        .byte   %01100000       ; 0472 1-8e:  **\n        .byte   %01101110       ; 0473 1-8e:  ** ***\n        .byte   %01100110       ; 0474 1-8e:  **  **\n        .byte   %01100110       ; 0475 1-8e:  **  **\n        .byte   %00111100       ; 0476 1-8e:   ****\n        .byte   %00000000       ; 0477 1-8e:\n\n        .byte   %00111100       ; 0478 1-8f:   ****\n        .byte   %01100110       ; 0479 1-8f:  **  **\n        .byte   %01100000       ; 047A 1-8f:  **\n        .byte   %01101110       ; 047B 1-8f:  ** ***\n        .byte   %01100110       ; 047C 1-8f:  **  **\n        .byte   %01100110       ; 047D 1-8f:  **  **\n        .byte   %00111100       ; 047E 1-8f:   ****\n        .byte   %00000000       ; 047F 1-8f:\n\n        .byte   %01100110       ; 0480 1-90:  **  **\n        .byte   %01100110       ; 0481 1-90:  **  **\n        .byte   %01100110       ; 0482 1-90:  **  **\n        .byte   %01111110       ; 0483 1-90:  ******\n        .byte   %01100110       ; 0484 1-90:  **  **\n        .byte   %01100110       ; 0485 1-90:  **  **\n        .byte   %01100110       ; 0486 1-90:  **  **\n        .byte   %00000000       ; 0487 1-90:\n\n        .byte   %01100110       ; 0488 1-91:  **  **\n        .byte   %01100110       ; 0489 1-91:  **  **\n        .byte   %01100110       ; 048A 1-91:  **  **\n        .byte   %01111110       ; 048B 1-91:  ******\n        .byte   %01100110       ; 048C 1-91:  **  **\n        .byte   %01100110       ; 048D 1-91:  **  **\n        .byte   %01100110       ; 048E 1-91:  **  **\n        .byte   %00000000       ; 048F 1-91:\n\n        .byte   %00111100       ; 0490 1-92:   ****\n        .byte   %00011000       ; 0491 1-92:    **\n        .byte   %00011000       ; 0492 1-92:    **\n        .byte   %00011000       ; 0493 1-92:    **\n        .byte   %00011000       ; 0494 1-92:    **\n        .byte   %00011000       ; 0495 1-92:    **\n        .byte   %00111100       ; 0496 1-92:   ****\n        .byte   %00000000       ; 0497 1-92:\n\n        .byte   %00111100       ; 0498 1-93:   ****\n        .byte   %00011000       ; 0499 1-93:    **\n        .byte   %00011000       ; 049A 1-93:    **\n        .byte   %00011000       ; 049B 1-93:    **\n        .byte   %00011000       ; 049C 1-93:    **\n        .byte   %00011000       ; 049D 1-93:    **\n        .byte   %00111100       ; 049E 1-93:   ****\n        .byte   %00000000       ; 049F 1-93:\n\n        .byte   %00011110       ; 04A0 1-94:    ****\n        .byte   %00001100       ; 04A1 1-94:     **\n        .byte   %00001100       ; 04A2 1-94:     **\n        .byte   %00001100       ; 04A3 1-94:     **\n        .byte   %00001100       ; 04A4 1-94:     **\n        .byte   %01101100       ; 04A5 1-94:  ** **\n        .byte   %00111000       ; 04A6 1-94:   ***\n        .byte   %00000000       ; 04A7 1-94:\n\n        .byte   %00011110       ; 04A8 1-95:    ****\n        .byte   %00001100       ; 04A9 1-95:     **\n        .byte   %00001100       ; 04AA 1-95:     **\n        .byte   %00001100       ; 04AB 1-95:     **\n        .byte   %00001100       ; 04AC 1-95:     **\n        .byte   %01101100       ; 04AD 1-95:  ** **\n        .byte   %00111000       ; 04AE 1-95:   ***\n        .byte   %00000000       ; 04AF 1-95:\n\n        .byte   %01100110       ; 04B0 1-96:  **  **\n        .byte   %01101100       ; 04B1 1-96:  ** **\n        .byte   %01111000       ; 04B2 1-96:  ****\n        .byte   %01110000       ; 04B3 1-96:  ***\n        .byte   %01111000       ; 04B4 1-96:  ****\n        .byte   %01101100       ; 04B5 1-96:  ** **\n        .byte   %01100110       ; 04B6 1-96:  **  **\n        .byte   %00000000       ; 04B7 1-96:\n\n        .byte   %01100110       ; 04B8 1-97:  **  **\n        .byte   %01101100       ; 04B9 1-97:  ** **\n        .byte   %01111000       ; 04BA 1-97:  ****\n        .byte   %01110000       ; 04BB 1-97:  ***\n        .byte   %01111000       ; 04BC 1-97:  ****\n        .byte   %01101100       ; 04BD 1-97:  ** **\n        .byte   %01100110       ; 04BE 1-97:  **  **\n        .byte   %00000000       ; 04BF 1-97:\n\n        .byte   %01100000       ; 04C0 1-98:  **\n        .byte   %01100000       ; 04C1 1-98:  **\n        .byte   %01100000       ; 04C2 1-98:  **\n        .byte   %01100000       ; 04C3 1-98:  **\n        .byte   %01100000       ; 04C4 1-98:  **\n        .byte   %01100000       ; 04C5 1-98:  **\n        .byte   %01111110       ; 04C6 1-98:  ******\n        .byte   %00000000       ; 04C7 1-98:\n\n        .byte   %01100000       ; 04C8 1-99:  **\n        .byte   %01100000       ; 04C9 1-99:  **\n        .byte   %01100000       ; 04CA 1-99:  **\n        .byte   %01100000       ; 04CB 1-99:  **\n        .byte   %01100000       ; 04CC 1-99:  **\n        .byte   %01100000       ; 04CD 1-99:  **\n        .byte   %01111110       ; 04CE 1-99:  ******\n        .byte   %00000000       ; 04CF 1-99:\n\n        .byte   %01100011       ; 04D0 1-9a:  **   **\n        .byte   %01110111       ; 04D1 1-9a:  *** ***\n        .byte   %01111111       ; 04D2 1-9a:  *******\n        .byte   %01101011       ; 04D3 1-9a:  ** * **\n        .byte   %01100011       ; 04D4 1-9a:  **   **\n        .byte   %01100011       ; 04D5 1-9a:  **   **\n        .byte   %01100011       ; 04D6 1-9a:  **   **\n        .byte   %00000000       ; 04D7 1-9a:\n\n        .byte   %01100011       ; 04D8 1-9b:  **   **\n        .byte   %01110111       ; 04D9 1-9b:  *** ***\n        .byte   %01111111       ; 04DA 1-9b:  *******\n        .byte   %01101011       ; 04DB 1-9b:  ** * **\n        .byte   %01100011       ; 04DC 1-9b:  **   **\n        .byte   %01100011       ; 04DD 1-9b:  **   **\n        .byte   %01100011       ; 04DE 1-9b:  **   **\n        .byte   %00000000       ; 04DF 1-9b:\n\n        .byte   %01100110       ; 04E0 1-9c:  **  **\n        .byte   %01110110       ; 04E1 1-9c:  *** **\n        .byte   %01111110       ; 04E2 1-9c:  ******\n        .byte   %01111110       ; 04E3 1-9c:  ******\n        .byte   %01101110       ; 04E4 1-9c:  ** ***\n        .byte   %01100110       ; 04E5 1-9c:  **  **\n        .byte   %01100110       ; 04E6 1-9c:  **  **\n        .byte   %00000000       ; 04E7 1-9c:\n\n        .byte   %01100110       ; 04E8 1-9d:  **  **\n        .byte   %01110110       ; 04E9 1-9d:  *** **\n        .byte   %01111110       ; 04EA 1-9d:  ******\n        .byte   %01111110       ; 04EB 1-9d:  ******\n        .byte   %01101110       ; 04EC 1-9d:  ** ***\n        .byte   %01100110       ; 04ED 1-9d:  **  **\n        .byte   %01100110       ; 04EE 1-9d:  **  **\n        .byte   %00000000       ; 04EF 1-9d:\n\n        .byte   %00111100       ; 04F0 1-9e:   ****\n        .byte   %01100110       ; 04F1 1-9e:  **  **\n        .byte   %01100110       ; 04F2 1-9e:  **  **\n        .byte   %01100110       ; 04F3 1-9e:  **  **\n        .byte   %01100110       ; 04F4 1-9e:  **  **\n        .byte   %01100110       ; 04F5 1-9e:  **  **\n        .byte   %00111100       ; 04F6 1-9e:   ****\n        .byte   %00000000       ; 04F7 1-9e:\n\n        .byte   %00111100       ; 04F8 1-9f:   ****\n        .byte   %01100110       ; 04F9 1-9f:  **  **\n        .byte   %01100110       ; 04FA 1-9f:  **  **\n        .byte   %01100110       ; 04FB 1-9f:  **  **\n        .byte   %01100110       ; 04FC 1-9f:  **  **\n        .byte   %01100110       ; 04FD 1-9f:  **  **\n        .byte   %00111100       ; 04FE 1-9f:   ****\n        .byte   %00000000       ; 04FF 1-9f:\n\n        .byte   %01111100       ; 0500 1-a0:  *****\n        .byte   %01100110       ; 0501 1-a0:  **  **\n        .byte   %01100110       ; 0502 1-a0:  **  **\n        .byte   %01111100       ; 0503 1-a0:  *****\n        .byte   %01100000       ; 0504 1-a0:  **\n        .byte   %01100000       ; 0505 1-a0:  **\n        .byte   %01100000       ; 0506 1-a0:  **\n        .byte   %00000000       ; 0507 1-a0:\n\n        .byte   %01111100       ; 0508 1-a1:  *****\n        .byte   %01100110       ; 0509 1-a1:  **  **\n        .byte   %01100110       ; 050A 1-a1:  **  **\n        .byte   %01111100       ; 050B 1-a1:  *****\n        .byte   %01100000       ; 050C 1-a1:  **\n        .byte   %01100000       ; 050D 1-a1:  **\n        .byte   %01100000       ; 050E 1-a1:  **\n        .byte   %00000000       ; 050F 1-a1:\n\n        .byte   %00111100       ; 0510 1-a2:   ****\n        .byte   %01100110       ; 0511 1-a2:  **  **\n        .byte   %01100110       ; 0512 1-a2:  **  **\n        .byte   %01100110       ; 0513 1-a2:  **  **\n        .byte   %01100110       ; 0514 1-a2:  **  **\n        .byte   %00111100       ; 0515 1-a2:   ****\n        .byte   %00001110       ; 0516 1-a2:     ***\n        .byte   %00000000       ; 0517 1-a2:\n\n        .byte   %00111100       ; 0518 1-a3:   ****\n        .byte   %01100110       ; 0519 1-a3:  **  **\n        .byte   %01100110       ; 051A 1-a3:  **  **\n        .byte   %01100110       ; 051B 1-a3:  **  **\n        .byte   %01100110       ; 051C 1-a3:  **  **\n        .byte   %00111100       ; 051D 1-a3:   ****\n        .byte   %00001110       ; 051E 1-a3:     ***\n        .byte   %00000000       ; 051F 1-a3:\n\n        .byte   %01111100       ; 0520 1-a4:  *****\n        .byte   %01100110       ; 0521 1-a4:  **  **\n        .byte   %01100110       ; 0522 1-a4:  **  **\n        .byte   %01111100       ; 0523 1-a4:  *****\n        .byte   %01111000       ; 0524 1-a4:  ****\n        .byte   %01101100       ; 0525 1-a4:  ** **\n        .byte   %01100110       ; 0526 1-a4:  **  **\n        .byte   %00000000       ; 0527 1-a4:\n\n        .byte   %01111100       ; 0528 1-a5:  *****\n        .byte   %01100110       ; 0529 1-a5:  **  **\n        .byte   %01100110       ; 052A 1-a5:  **  **\n        .byte   %01111100       ; 052B 1-a5:  *****\n        .byte   %01111000       ; 052C 1-a5:  ****\n        .byte   %01101100       ; 052D 1-a5:  ** **\n        .byte   %01100110       ; 052E 1-a5:  **  **\n        .byte   %00000000       ; 052F 1-a5:\n\n        .byte   %00111100       ; 0530 1-a6:   ****\n        .byte   %01100110       ; 0531 1-a6:  **  **\n        .byte   %01100000       ; 0532 1-a6:  **\n        .byte   %00111100       ; 0533 1-a6:   ****\n        .byte   %00000110       ; 0534 1-a6:      **\n        .byte   %01100110       ; 0535 1-a6:  **  **\n        .byte   %00111100       ; 0536 1-a6:   ****\n        .byte   %00000000       ; 0537 1-a6:\n\n        .byte   %00111100       ; 0538 1-a7:   ****\n        .byte   %01100110       ; 0539 1-a7:  **  **\n        .byte   %01100000       ; 053A 1-a7:  **\n        .byte   %00111100       ; 053B 1-a7:   ****\n        .byte   %00000110       ; 053C 1-a7:      **\n        .byte   %01100110       ; 053D 1-a7:  **  **\n        .byte   %00111100       ; 053E 1-a7:   ****\n        .byte   %00000000       ; 053F 1-a7:\n\n        .byte   %01111110       ; 0540 1-a8:  ******\n        .byte   %00011000       ; 0541 1-a8:    **\n        .byte   %00011000       ; 0542 1-a8:    **\n        .byte   %00011000       ; 0543 1-a8:    **\n        .byte   %00011000       ; 0544 1-a8:    **\n        .byte   %00011000       ; 0545 1-a8:    **\n        .byte   %00011000       ; 0546 1-a8:    **\n        .byte   %00000000       ; 0547 1-a8:\n\n        .byte   %01111110       ; 0548 1-a9:  ******\n        .byte   %00011000       ; 0549 1-a9:    **\n        .byte   %00011000       ; 054A 1-a9:    **\n        .byte   %00011000       ; 054B 1-a9:    **\n        .byte   %00011000       ; 054C 1-a9:    **\n        .byte   %00011000       ; 054D 1-a9:    **\n        .byte   %00011000       ; 054E 1-a9:    **\n        .byte   %00000000       ; 054F 1-a9:\n\n        .byte   %01100110       ; 0550 1-aa:  **  **\n        .byte   %01100110       ; 0551 1-aa:  **  **\n        .byte   %01100110       ; 0552 1-aa:  **  **\n        .byte   %01100110       ; 0553 1-aa:  **  **\n        .byte   %01100110       ; 0554 1-aa:  **  **\n        .byte   %01100110       ; 0555 1-aa:  **  **\n        .byte   %00111100       ; 0556 1-aa:   ****\n        .byte   %00000000       ; 0557 1-aa:\n\n        .byte   %01100110       ; 0558 1-ab:  **  **\n        .byte   %01100110       ; 0559 1-ab:  **  **\n        .byte   %01100110       ; 055A 1-ab:  **  **\n        .byte   %01100110       ; 055B 1-ab:  **  **\n        .byte   %01100110       ; 055C 1-ab:  **  **\n        .byte   %01100110       ; 055D 1-ab:  **  **\n        .byte   %00111100       ; 055E 1-ab:   ****\n        .byte   %00000000       ; 055F 1-ab:\n\n        .byte   %01100110       ; 0560 1-ac:  **  **\n        .byte   %01100110       ; 0561 1-ac:  **  **\n        .byte   %01100110       ; 0562 1-ac:  **  **\n        .byte   %01100110       ; 0563 1-ac:  **  **\n        .byte   %01100110       ; 0564 1-ac:  **  **\n        .byte   %00111100       ; 0565 1-ac:   ****\n        .byte   %00011000       ; 0566 1-ac:    **\n        .byte   %00000000       ; 0567 1-ac:\n\n        .byte   %01100110       ; 0568 1-ad:  **  **\n        .byte   %01100110       ; 0569 1-ad:  **  **\n        .byte   %01100110       ; 056A 1-ad:  **  **\n        .byte   %01100110       ; 056B 1-ad:  **  **\n        .byte   %01100110       ; 056C 1-ad:  **  **\n        .byte   %00111100       ; 056D 1-ad:   ****\n        .byte   %00011000       ; 056E 1-ad:    **\n        .byte   %00000000       ; 056F 1-ad:\n\n        .byte   %01100011       ; 0570 1-ae:  **   **\n        .byte   %01100011       ; 0571 1-ae:  **   **\n        .byte   %01100011       ; 0572 1-ae:  **   **\n        .byte   %01101011       ; 0573 1-ae:  ** * **\n        .byte   %01111111       ; 0574 1-ae:  *******\n        .byte   %01110111       ; 0575 1-ae:  *** ***\n        .byte   %01100011       ; 0576 1-ae:  **   **\n        .byte   %00000000       ; 0577 1-ae:\n\n        .byte   %01100011       ; 0578 1-af:  **   **\n        .byte   %01100011       ; 0579 1-af:  **   **\n        .byte   %01100011       ; 057A 1-af:  **   **\n        .byte   %01101011       ; 057B 1-af:  ** * **\n        .byte   %01111111       ; 057C 1-af:  *******\n        .byte   %01110111       ; 057D 1-af:  *** ***\n        .byte   %01100011       ; 057E 1-af:  **   **\n        .byte   %00000000       ; 057F 1-af:\n\n        .byte   %01100110       ; 0580 1-b0:  **  **\n        .byte   %01100110       ; 0581 1-b0:  **  **\n        .byte   %00111100       ; 0582 1-b0:   ****\n        .byte   %00011000       ; 0583 1-b0:    **\n        .byte   %00111100       ; 0584 1-b0:   ****\n        .byte   %01100110       ; 0585 1-b0:  **  **\n        .byte   %01100110       ; 0586 1-b0:  **  **\n        .byte   %00000000       ; 0587 1-b0:\n\n        .byte   %01100110       ; 0588 1-b1:  **  **\n        .byte   %01100110       ; 0589 1-b1:  **  **\n        .byte   %00111100       ; 058A 1-b1:   ****\n        .byte   %00011000       ; 058B 1-b1:    **\n        .byte   %00111100       ; 058C 1-b1:   ****\n        .byte   %01100110       ; 058D 1-b1:  **  **\n        .byte   %01100110       ; 058E 1-b1:  **  **\n        .byte   %00000000       ; 058F 1-b1:\n\n        .byte   %01100110       ; 0590 1-b2:  **  **\n        .byte   %01100110       ; 0591 1-b2:  **  **\n        .byte   %01100110       ; 0592 1-b2:  **  **\n        .byte   %00111100       ; 0593 1-b2:   ****\n        .byte   %00011000       ; 0594 1-b2:    **\n        .byte   %00011000       ; 0595 1-b2:    **\n        .byte   %00011000       ; 0596 1-b2:    **\n        .byte   %00000000       ; 0597 1-b2:\n\n        .byte   %01100110       ; 0598 1-b3:  **  **\n        .byte   %01100110       ; 0599 1-b3:  **  **\n        .byte   %01100110       ; 059A 1-b3:  **  **\n        .byte   %00111100       ; 059B 1-b3:   ****\n        .byte   %00011000       ; 059C 1-b3:    **\n        .byte   %00011000       ; 059D 1-b3:    **\n        .byte   %00011000       ; 059E 1-b3:    **\n        .byte   %00000000       ; 059F 1-b3:\n\n        .byte   %01111110       ; 05A0 1-b4:  ******\n        .byte   %00000110       ; 05A1 1-b4:      **\n        .byte   %00001100       ; 05A2 1-b4:     **\n        .byte   %00011000       ; 05A3 1-b4:    **\n        .byte   %00110000       ; 05A4 1-b4:   **\n        .byte   %01100000       ; 05A5 1-b4:  **\n        .byte   %01111110       ; 05A6 1-b4:  ******\n        .byte   %00000000       ; 05A7 1-b4:\n\n        .byte   %01111110       ; 05A8 1-b5:  ******\n        .byte   %00000110       ; 05A9 1-b5:      **\n        .byte   %00001100       ; 05AA 1-b5:     **\n        .byte   %00011000       ; 05AB 1-b5:    **\n        .byte   %00110000       ; 05AC 1-b5:   **\n        .byte   %01100000       ; 05AD 1-b5:  **\n        .byte   %01111110       ; 05AE 1-b5:  ******\n        .byte   %00000000       ; 05AF 1-b5:\n\n        .byte   <tile_15>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_15>\n\n        .byte   <tile_15>\n\n        .byte   <tile_15>\n\n        .byte   <tile_16>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_16>\n\n        .byte   <tile_16>\n\n        .byte   <tile_16>\n\n        .byte   %00000000       ; 0610 1-c2:\n        .byte   %00000000       ; 0611 1-c2:\n        .byte   %00111100       ; 0612 1-c2:   ****\n        .byte   %00000110       ; 0613 1-c2:      **\n        .byte   %00111110       ; 0614 1-c2:   *****\n        .byte   %01100110       ; 0615 1-c2:  **  **\n        .byte   %00111110       ; 0616 1-c2:   *****\n        .byte   %00000000       ; 0617 1-c2:\n\n        .byte   %00000000       ; 0618 1-c3:\n        .byte   %00000000       ; 0619 1-c3:\n        .byte   %00111100       ; 061A 1-c3:   ****\n        .byte   %00000110       ; 061B 1-c3:      **\n        .byte   %00111110       ; 061C 1-c3:   *****\n        .byte   %01100110       ; 061D 1-c3:  **  **\n        .byte   %00111110       ; 061E 1-c3:   *****\n        .byte   %00000000       ; 061F 1-c3:\n\n        .byte   %00000000       ; 0620 1-c4:\n        .byte   %01100000       ; 0621 1-c4:  **\n        .byte   %01100000       ; 0622 1-c4:  **\n        .byte   %01111100       ; 0623 1-c4:  *****\n        .byte   %01100110       ; 0624 1-c4:  **  **\n        .byte   %01100110       ; 0625 1-c4:  **  **\n        .byte   %01111100       ; 0626 1-c4:  *****\n        .byte   %00000000       ; 0627 1-c4:\n\n        .byte   %00000000       ; 0628 1-c5:\n        .byte   %01100000       ; 0629 1-c5:  **\n        .byte   %01100000       ; 062A 1-c5:  **\n        .byte   %01111100       ; 062B 1-c5:  *****\n        .byte   %01100110       ; 062C 1-c5:  **  **\n        .byte   %01100110       ; 062D 1-c5:  **  **\n        .byte   %01111100       ; 062E 1-c5:  *****\n        .byte   %00000000       ; 062F 1-c5:\n\n        .byte   %00000000       ; 0630 1-c6:\n        .byte   %00000000       ; 0631 1-c6:\n        .byte   %00111100       ; 0632 1-c6:   ****\n        .byte   %01100000       ; 0633 1-c6:  **\n        .byte   %01100000       ; 0634 1-c6:  **\n        .byte   %01100000       ; 0635 1-c6:  **\n        .byte   %00111100       ; 0636 1-c6:   ****\n        .byte   %00000000       ; 0637 1-c6:\n\n        .byte   %00000000       ; 0638 1-c7:\n        .byte   %00000000       ; 0639 1-c7:\n        .byte   %00111100       ; 063A 1-c7:   ****\n        .byte   %01100000       ; 063B 1-c7:  **\n        .byte   %01100000       ; 063C 1-c7:  **\n        .byte   %01100000       ; 063D 1-c7:  **\n        .byte   %00111100       ; 063E 1-c7:   ****\n        .byte   %00000000       ; 063F 1-c7:\n\n        .byte   %00000000       ; 0640 1-c8:\n        .byte   %00000110       ; 0641 1-c8:      **\n        .byte   %00000110       ; 0642 1-c8:      **\n        .byte   %00111110       ; 0643 1-c8:   *****\n        .byte   %01100110       ; 0644 1-c8:  **  **\n        .byte   %01100110       ; 0645 1-c8:  **  **\n        .byte   %00111110       ; 0646 1-c8:   *****\n        .byte   %00000000       ; 0647 1-c8:\n\n        .byte   %00000000       ; 0648 1-c9:\n        .byte   %00000110       ; 0649 1-c9:      **\n        .byte   %00000110       ; 064A 1-c9:      **\n        .byte   %00111110       ; 064B 1-c9:   *****\n        .byte   %01100110       ; 064C 1-c9:  **  **\n        .byte   %01100110       ; 064D 1-c9:  **  **\n        .byte   %00111110       ; 064E 1-c9:   *****\n        .byte   %00000000       ; 064F 1-c9:\n\n        .byte   %00000000       ; 0650 1-ca:\n        .byte   %00000000       ; 0651 1-ca:\n        .byte   %00111100       ; 0652 1-ca:   ****\n        .byte   %01100110       ; 0653 1-ca:  **  **\n        .byte   %01111110       ; 0654 1-ca:  ******\n        .byte   %01100000       ; 0655 1-ca:  **\n        .byte   %00111100       ; 0656 1-ca:   ****\n        .byte   %00000000       ; 0657 1-ca:\n\n        .byte   %00000000       ; 0658 1-cb:\n        .byte   %00000000       ; 0659 1-cb:\n        .byte   %00111100       ; 065A 1-cb:   ****\n        .byte   %01100110       ; 065B 1-cb:  **  **\n        .byte   %01111110       ; 065C 1-cb:  ******\n        .byte   %01100000       ; 065D 1-cb:  **\n        .byte   %00111100       ; 065E 1-cb:   ****\n        .byte   %00000000       ; 065F 1-cb:\n\n        .byte   %00000000       ; 0660 1-cc:\n        .byte   %00001110       ; 0661 1-cc:     ***\n        .byte   %00011000       ; 0662 1-cc:    **\n        .byte   %00111110       ; 0663 1-cc:   *****\n        .byte   %00011000       ; 0664 1-cc:    **\n        .byte   %00011000       ; 0665 1-cc:    **\n        .byte   %00011000       ; 0666 1-cc:    **\n        .byte   %00000000       ; 0667 1-cc:\n\n        .byte   %00000000       ; 0668 1-cd:\n        .byte   %00001110       ; 0669 1-cd:     ***\n        .byte   %00011000       ; 066A 1-cd:    **\n        .byte   %00111110       ; 066B 1-cd:   *****\n        .byte   %00011000       ; 066C 1-cd:    **\n        .byte   %00011000       ; 066D 1-cd:    **\n        .byte   %00011000       ; 066E 1-cd:    **\n        .byte   %00000000       ; 066F 1-cd:\n\n        .byte   %00000000       ; 0670 1-ce:\n        .byte   %00000000       ; 0671 1-ce:\n        .byte   %00111110       ; 0672 1-ce:   *****\n        .byte   %01100110       ; 0673 1-ce:  **  **\n        .byte   %01100110       ; 0674 1-ce:  **  **\n        .byte   %00111110       ; 0675 1-ce:   *****\n        .byte   %00000110       ; 0676 1-ce:      **\n        .byte   %01111100       ; 0677 1-ce:  *****\n\n        .byte   %00000000       ; 0678 1-cf:\n        .byte   %00000000       ; 0679 1-cf:\n        .byte   %00111110       ; 067A 1-cf:   *****\n        .byte   %01100110       ; 067B 1-cf:  **  **\n        .byte   %01100110       ; 067C 1-cf:  **  **\n        .byte   %00111110       ; 067D 1-cf:   *****\n        .byte   %00000110       ; 067E 1-cf:      **\n        .byte   %01111100       ; 067F 1-cf:  *****\n\n        .byte   %00000000       ; 0680 1-d0:\n        .byte   %01100000       ; 0681 1-d0:  **\n        .byte   %01100000       ; 0682 1-d0:  **\n        .byte   %01111100       ; 0683 1-d0:  *****\n        .byte   %01100110       ; 0684 1-d0:  **  **\n        .byte   %01100110       ; 0685 1-d0:  **  **\n        .byte   %01100110       ; 0686 1-d0:  **  **\n        .byte   %00000000       ; 0687 1-d0:\n\n        .byte   %00000000       ; 0688 1-d1:\n        .byte   %01100000       ; 0689 1-d1:  **\n        .byte   %01100000       ; 068A 1-d1:  **\n        .byte   %01111100       ; 068B 1-d1:  *****\n        .byte   %01100110       ; 068C 1-d1:  **  **\n        .byte   %01100110       ; 068D 1-d1:  **  **\n        .byte   %01100110       ; 068E 1-d1:  **  **\n        .byte   %00000000       ; 068F 1-d1:\n\n        .byte   %00000000       ; 0690 1-d2:\n        .byte   %00011000       ; 0691 1-d2:    **\n        .byte   %00000000       ; 0692 1-d2:\n        .byte   %00111000       ; 0693 1-d2:   ***\n        .byte   %00011000       ; 0694 1-d2:    **\n        .byte   %00011000       ; 0695 1-d2:    **\n        .byte   %00111100       ; 0696 1-d2:   ****\n        .byte   %00000000       ; 0697 1-d2:\n\n        .byte   %00000000       ; 0698 1-d3:\n        .byte   %00011000       ; 0699 1-d3:    **\n        .byte   %00000000       ; 069A 1-d3:\n        .byte   %00111000       ; 069B 1-d3:   ***\n        .byte   %00011000       ; 069C 1-d3:    **\n        .byte   %00011000       ; 069D 1-d3:    **\n        .byte   %00111100       ; 069E 1-d3:   ****\n        .byte   %00000000       ; 069F 1-d3:\n\n        .byte   %00000000       ; 06A0 1-d4:\n        .byte   %00000110       ; 06A1 1-d4:      **\n        .byte   %00000000       ; 06A2 1-d4:\n        .byte   %00000110       ; 06A3 1-d4:      **\n        .byte   %00000110       ; 06A4 1-d4:      **\n        .byte   %00000110       ; 06A5 1-d4:      **\n        .byte   %00000110       ; 06A6 1-d4:      **\n        .byte   %00111100       ; 06A7 1-d4:   ****\n\n        .byte   %00000000       ; 06A8 1-d5:\n        .byte   %00000110       ; 06A9 1-d5:      **\n        .byte   %00000000       ; 06AA 1-d5:\n        .byte   %00000110       ; 06AB 1-d5:      **\n        .byte   %00000110       ; 06AC 1-d5:      **\n        .byte   %00000110       ; 06AD 1-d5:      **\n        .byte   %00000110       ; 06AE 1-d5:      **\n        .byte   %00111100       ; 06AF 1-d5:   ****\n\n        .byte   %00000000       ; 06B0 1-d6:\n        .byte   %01100000       ; 06B1 1-d6:  **\n        .byte   %01100000       ; 06B2 1-d6:  **\n        .byte   %01101100       ; 06B3 1-d6:  ** **\n        .byte   %01111000       ; 06B4 1-d6:  ****\n        .byte   %01101100       ; 06B5 1-d6:  ** **\n        .byte   %01100110       ; 06B6 1-d6:  **  **\n        .byte   %00000000       ; 06B7 1-d6:\n\n        .byte   %00000000       ; 06B8 1-d7:\n        .byte   %01100000       ; 06B9 1-d7:  **\n        .byte   %01100000       ; 06BA 1-d7:  **\n        .byte   %01101100       ; 06BB 1-d7:  ** **\n        .byte   %01111000       ; 06BC 1-d7:  ****\n        .byte   %01101100       ; 06BD 1-d7:  ** **\n        .byte   %01100110       ; 06BE 1-d7:  **  **\n        .byte   %00000000       ; 06BF 1-d7:\n\n        .byte   %00000000       ; 06C0 1-d8:\n        .byte   %00111000       ; 06C1 1-d8:   ***\n        .byte   %00011000       ; 06C2 1-d8:    **\n        .byte   %00011000       ; 06C3 1-d8:    **\n        .byte   %00011000       ; 06C4 1-d8:    **\n        .byte   %00011000       ; 06C5 1-d8:    **\n        .byte   %00111100       ; 06C6 1-d8:   ****\n        .byte   %00000000       ; 06C7 1-d8:\n\n        .byte   %00000000       ; 06C8 1-d9:\n        .byte   %00111000       ; 06C9 1-d9:   ***\n        .byte   %00011000       ; 06CA 1-d9:    **\n        .byte   %00011000       ; 06CB 1-d9:    **\n        .byte   %00011000       ; 06CC 1-d9:    **\n        .byte   %00011000       ; 06CD 1-d9:    **\n        .byte   %00111100       ; 06CE 1-d9:   ****\n        .byte   %00000000       ; 06CF 1-d9:\n\n        .byte   %00000000       ; 06D0 1-da:\n        .byte   %00000000       ; 06D1 1-da:\n        .byte   %01100110       ; 06D2 1-da:  **  **\n        .byte   %01111111       ; 06D3 1-da:  *******\n        .byte   %01111111       ; 06D4 1-da:  *******\n        .byte   %01101011       ; 06D5 1-da:  ** * **\n        .byte   %01100011       ; 06D6 1-da:  **   **\n        .byte   %00000000       ; 06D7 1-da:\n\n        .byte   %00000000       ; 06D8 1-db:\n        .byte   %00000000       ; 06D9 1-db:\n        .byte   %01100110       ; 06DA 1-db:  **  **\n        .byte   %01111111       ; 06DB 1-db:  *******\n        .byte   %01111111       ; 06DC 1-db:  *******\n        .byte   %01101011       ; 06DD 1-db:  ** * **\n        .byte   %01100011       ; 06DE 1-db:  **   **\n        .byte   %00000000       ; 06DF 1-db:\n\n        .byte   %00000000       ; 06E0 1-dc:\n        .byte   %00000000       ; 06E1 1-dc:\n        .byte   %01111100       ; 06E2 1-dc:  *****\n        .byte   %01100110       ; 06E3 1-dc:  **  **\n        .byte   %01100110       ; 06E4 1-dc:  **  **\n        .byte   %01100110       ; 06E5 1-dc:  **  **\n        .byte   %01100110       ; 06E6 1-dc:  **  **\n        .byte   %00000000       ; 06E7 1-dc:\n\n        .byte   %00000000       ; 06E8 1-dd:\n        .byte   %00000000       ; 06E9 1-dd:\n        .byte   %01111100       ; 06EA 1-dd:  *****\n        .byte   %01100110       ; 06EB 1-dd:  **  **\n        .byte   %01100110       ; 06EC 1-dd:  **  **\n        .byte   %01100110       ; 06ED 1-dd:  **  **\n        .byte   %01100110       ; 06EE 1-dd:  **  **\n        .byte   %00000000       ; 06EF 1-dd:\n\n        .byte   %00000000       ; 06F0 1-de:\n        .byte   %00000000       ; 06F1 1-de:\n        .byte   %00111100       ; 06F2 1-de:   ****\n        .byte   %01100110       ; 06F3 1-de:  **  **\n        .byte   %01100110       ; 06F4 1-de:  **  **\n        .byte   %01100110       ; 06F5 1-de:  **  **\n        .byte   %00111100       ; 06F6 1-de:   ****\n        .byte   %00000000       ; 06F7 1-de:\n\n        .byte   %00000000       ; 06F8 1-df:\n        .byte   %00000000       ; 06F9 1-df:\n        .byte   %00111100       ; 06FA 1-df:   ****\n        .byte   %01100110       ; 06FB 1-df:  **  **\n        .byte   %01100110       ; 06FC 1-df:  **  **\n        .byte   %01100110       ; 06FD 1-df:  **  **\n        .byte   %00111100       ; 06FE 1-df:   ****\n        .byte   %00000000       ; 06FF 1-df:\n\n        .byte   %00000000       ; 0700 1-e0:\n        .byte   %00000000       ; 0701 1-e0:\n        .byte   %01111100       ; 0702 1-e0:  *****\n        .byte   %01100110       ; 0703 1-e0:  **  **\n        .byte   %01100110       ; 0704 1-e0:  **  **\n        .byte   %01111100       ; 0705 1-e0:  *****\n        .byte   %01100000       ; 0706 1-e0:  **\n        .byte   %01100000       ; 0707 1-e0:  **\n\n        .byte   %00000000       ; 0708 1-e1:\n        .byte   %00000000       ; 0709 1-e1:\n        .byte   %01111100       ; 070A 1-e1:  *****\n        .byte   %01100110       ; 070B 1-e1:  **  **\n        .byte   %01100110       ; 070C 1-e1:  **  **\n        .byte   %01111100       ; 070D 1-e1:  *****\n        .byte   %01100000       ; 070E 1-e1:  **\n        .byte   %01100000       ; 070F 1-e1:  **\n\n        .byte   %00000000       ; 0710 1-e2:\n        .byte   %00000000       ; 0711 1-e2:\n        .byte   %00111110       ; 0712 1-e2:   *****\n        .byte   %01100110       ; 0713 1-e2:  **  **\n        .byte   %01100110       ; 0714 1-e2:  **  **\n        .byte   %00111110       ; 0715 1-e2:   *****\n        .byte   %00000110       ; 0716 1-e2:      **\n        .byte   %00000110       ; 0717 1-e2:      **\n\n        .byte   %00000000       ; 0718 1-e3:\n        .byte   %00000000       ; 0719 1-e3:\n        .byte   %00111110       ; 071A 1-e3:   *****\n        .byte   %01100110       ; 071B 1-e3:  **  **\n        .byte   %01100110       ; 071C 1-e3:  **  **\n        .byte   %00111110       ; 071D 1-e3:   *****\n        .byte   %00000110       ; 071E 1-e3:      **\n        .byte   %00000110       ; 071F 1-e3:      **\n\n        .byte   %00000000       ; 0720 1-e4:\n        .byte   %00000000       ; 0721 1-e4:\n        .byte   %01111100       ; 0722 1-e4:  *****\n        .byte   %01100110       ; 0723 1-e4:  **  **\n        .byte   %01100000       ; 0724 1-e4:  **\n        .byte   %01100000       ; 0725 1-e4:  **\n        .byte   %01100000       ; 0726 1-e4:  **\n        .byte   %00000000       ; 0727 1-e4:\n\n        .byte   %00000000       ; 0728 1-e5:\n        .byte   %00000000       ; 0729 1-e5:\n        .byte   %01111100       ; 072A 1-e5:  *****\n        .byte   %01100110       ; 072B 1-e5:  **  **\n        .byte   %01100000       ; 072C 1-e5:  **\n        .byte   %01100000       ; 072D 1-e5:  **\n        .byte   %01100000       ; 072E 1-e5:  **\n        .byte   %00000000       ; 072F 1-e5:\n\n        .byte   %00000000       ; 0730 1-e6:\n        .byte   %00000000       ; 0731 1-e6:\n        .byte   %00111110       ; 0732 1-e6:   *****\n        .byte   %01100000       ; 0733 1-e6:  **\n        .byte   %00111100       ; 0734 1-e6:   ****\n        .byte   %00000110       ; 0735 1-e6:      **\n        .byte   %01111100       ; 0736 1-e6:  *****\n        .byte   %00000000       ; 0737 1-e6:\n\n        .byte   %00000000       ; 0738 1-e7:\n        .byte   %00000000       ; 0739 1-e7:\n        .byte   %00111110       ; 073A 1-e7:   *****\n        .byte   %01100000       ; 073B 1-e7:  **\n        .byte   %00111100       ; 073C 1-e7:   ****\n        .byte   %00000110       ; 073D 1-e7:      **\n        .byte   %01111100       ; 073E 1-e7:  *****\n        .byte   %00000000       ; 073F 1-e7:\n\n        .byte   %00000000       ; 0740 1-e8:\n        .byte   %00011000       ; 0741 1-e8:    **\n        .byte   %01111110       ; 0742 1-e8:  ******\n        .byte   %00011000       ; 0743 1-e8:    **\n        .byte   %00011000       ; 0744 1-e8:    **\n        .byte   %00011000       ; 0745 1-e8:    **\n        .byte   %00001110       ; 0746 1-e8:     ***\n        .byte   %00000000       ; 0747 1-e8:\n\n        .byte   %00000000       ; 0748 1-e9:\n        .byte   %00011000       ; 0749 1-e9:    **\n        .byte   %01111110       ; 074A 1-e9:  ******\n        .byte   %00011000       ; 074B 1-e9:    **\n        .byte   %00011000       ; 074C 1-e9:    **\n        .byte   %00011000       ; 074D 1-e9:    **\n        .byte   %00001110       ; 074E 1-e9:     ***\n        .byte   %00000000       ; 074F 1-e9:\n\n        .byte   %00000000       ; 0750 1-ea:\n        .byte   %00000000       ; 0751 1-ea:\n        .byte   %01100110       ; 0752 1-ea:  **  **\n        .byte   %01100110       ; 0753 1-ea:  **  **\n        .byte   %01100110       ; 0754 1-ea:  **  **\n        .byte   %01100110       ; 0755 1-ea:  **  **\n        .byte   %00111110       ; 0756 1-ea:   *****\n        .byte   %00000000       ; 0757 1-ea:\n\n        .byte   %00000000       ; 0758 1-eb:\n        .byte   %00000000       ; 0759 1-eb:\n        .byte   %01100110       ; 075A 1-eb:  **  **\n        .byte   %01100110       ; 075B 1-eb:  **  **\n        .byte   %01100110       ; 075C 1-eb:  **  **\n        .byte   %01100110       ; 075D 1-eb:  **  **\n        .byte   %00111110       ; 075E 1-eb:   *****\n        .byte   %00000000       ; 075F 1-eb:\n\n        .byte   %00000000       ; 0760 1-ec:\n        .byte   %00000000       ; 0761 1-ec:\n        .byte   %01100110       ; 0762 1-ec:  **  **\n        .byte   %01100110       ; 0763 1-ec:  **  **\n        .byte   %01100110       ; 0764 1-ec:  **  **\n        .byte   %00111100       ; 0765 1-ec:   ****\n        .byte   %00011000       ; 0766 1-ec:    **\n        .byte   %00000000       ; 0767 1-ec:\n\n        .byte   %00000000       ; 0768 1-ed:\n        .byte   %00000000       ; 0769 1-ed:\n        .byte   %01100110       ; 076A 1-ed:  **  **\n        .byte   %01100110       ; 076B 1-ed:  **  **\n        .byte   %01100110       ; 076C 1-ed:  **  **\n        .byte   %00111100       ; 076D 1-ed:   ****\n        .byte   %00011000       ; 076E 1-ed:    **\n        .byte   %00000000       ; 076F 1-ed:\n\n        .byte   %00000000       ; 0770 1-ee:\n        .byte   %00000000       ; 0771 1-ee:\n        .byte   %01100011       ; 0772 1-ee:  **   **\n        .byte   %01101011       ; 0773 1-ee:  ** * **\n        .byte   %01111111       ; 0774 1-ee:  *******\n        .byte   %00111110       ; 0775 1-ee:   *****\n        .byte   %00110110       ; 0776 1-ee:   ** **\n        .byte   %00000000       ; 0777 1-ee:\n\n        .byte   %00000000       ; 0778 1-ef:\n        .byte   %00000000       ; 0779 1-ef:\n        .byte   %01100011       ; 077A 1-ef:  **   **\n        .byte   %01101011       ; 077B 1-ef:  ** * **\n        .byte   %01111111       ; 077C 1-ef:  *******\n        .byte   %00111110       ; 077D 1-ef:   *****\n        .byte   %00110110       ; 077E 1-ef:   ** **\n        .byte   %00000000       ; 077F 1-ef:\n\n        .byte   %00000000       ; 0780 1-f0:\n        .byte   %00000000       ; 0781 1-f0:\n        .byte   %01100110       ; 0782 1-f0:  **  **\n        .byte   %00111100       ; 0783 1-f0:   ****\n        .byte   %00011000       ; 0784 1-f0:    **\n        .byte   %00111100       ; 0785 1-f0:   ****\n        .byte   %01100110       ; 0786 1-f0:  **  **\n        .byte   %00000000       ; 0787 1-f0:\n\n        .byte   %00000000       ; 0788 1-f1:\n        .byte   %00000000       ; 0789 1-f1:\n        .byte   %01100110       ; 078A 1-f1:  **  **\n        .byte   %00111100       ; 078B 1-f1:   ****\n        .byte   %00011000       ; 078C 1-f1:    **\n        .byte   %00111100       ; 078D 1-f1:   ****\n        .byte   %01100110       ; 078E 1-f1:  **  **\n        .byte   %00000000       ; 078F 1-f1:\n\n        .byte   %00000000       ; 0790 1-f2:\n        .byte   %00000000       ; 0791 1-f2:\n        .byte   %01100110       ; 0792 1-f2:  **  **\n        .byte   %01100110       ; 0793 1-f2:  **  **\n        .byte   %01100110       ; 0794 1-f2:  **  **\n        .byte   %00111110       ; 0795 1-f2:   *****\n        .byte   %00001100       ; 0796 1-f2:     **\n        .byte   %01111000       ; 0797 1-f2:  ****\n\n        .byte   %00000000       ; 0798 1-f3:\n        .byte   %00000000       ; 0799 1-f3:\n        .byte   %01100110       ; 079A 1-f3:  **  **\n        .byte   %01100110       ; 079B 1-f3:  **  **\n        .byte   %01100110       ; 079C 1-f3:  **  **\n        .byte   %00111110       ; 079D 1-f3:   *****\n        .byte   %00001100       ; 079E 1-f3:     **\n        .byte   %01111000       ; 079F 1-f3:  ****\n\n        .byte   %00000000       ; 07A0 1-f4:\n        .byte   %00000000       ; 07A1 1-f4:\n        .byte   %01111110       ; 07A2 1-f4:  ******\n        .byte   %00001100       ; 07A3 1-f4:     **\n        .byte   %00011000       ; 07A4 1-f4:    **\n        .byte   %00110000       ; 07A5 1-f4:   **\n        .byte   %01111110       ; 07A6 1-f4:  ******\n        .byte   %00000000       ; 07A7 1-f4:\n\n        .byte   %00000000       ; 07A8 1-f5:\n        .byte   %00000000       ; 07A9 1-f5:\n        .byte   %01111110       ; 07AA 1-f5:  ******\n        .byte   %00001100       ; 07AB 1-f5:     **\n        .byte   %00011000       ; 07AC 1-f5:    **\n        .byte   %00110000       ; 07AD 1-f5:   **\n        .byte   %01111110       ; 07AE 1-f5:  ******\n        .byte   %00000000       ; 07AF 1-f5:\n\n        .byte   <tile_17>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_17>\n\n        .byte   <tile_17>\n\n        .byte   <tile_17>\n\n        .byte   <tile_18>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_18>\n\n        .byte   <tile_18>\n\n        .byte   <tile_18>\n\n        .byte   <tile_19>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_19>\n\n        .byte   <tile_19>\n\n        .byte   <tile_19>\n\n        .byte   <tile_20>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_20>\n\n        .byte   <tile_20>\n\n        .byte   <tile_20>\n\n        .byte   <tile_21>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_21>\n\n        .byte   <tile_21>\n\n        .byte   <tile_21>\n\n        .byte   <tile_22>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_22>\n\n        .byte   <tile_22>\n\n        .byte   <tile_22>\n\n        .byte   <tile_23>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_23>\n\n        .byte   <tile_23>\n\n        .byte   <tile_23>\n\n        .byte   <tile_24>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_24>\n\n        .byte   <tile_24>\n\n        .byte   <tile_24>\n\n\n\n\n        .byte   <tile_25>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_25>\n\n        .byte   <tile_25>\n\n        .byte   <tile_25>\n\n        .byte   <tile_26>\n\n        .byte   %00000000       ; 0200 1-40:\n        .byte   %00000000       ; 0201 1-40:\n        .byte   %00000000       ; 0202 1-40:\n        .byte   %00000000       ; 0203 1-40:\n        .byte   %00000000       ; 0204 1-40:\n        .byte   %00000000       ; 0205 1-40:\n        .byte   %00000000       ; 0206 1-40:\n        .byte   %00000000       ; 0207 1-40:\n\n        .byte   %00000000       ; 0208 1-41:\n        .byte   %00000000       ; 0209 1-41:\n        .byte   %00000000       ; 020A 1-41:\n        .byte   %00000000       ; 020B 1-41:\n        .byte   %00000000       ; 020C 1-41:\n        .byte   %00000000       ; 020D 1-41:\n        .byte   %00000000       ; 020E 1-41:\n        .byte   %00000000       ; 020F 1-41:\n\n        .byte   <tile_26>\n\n        .byte   <tile_26>\n\n        .byte   <tile_26>\n\n        .byte   <tile_4>\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   %00000000       ; 0008 1-01:\n        .byte   %00000000       ; 0009 1-01:\n        .byte   %00000000       ; 000A 1-01:\n        .byte   %00000000       ; 000B 1-01:\n        .byte   %00000000       ; 000C 1-01:\n        .byte   %00000000       ; 000D 1-01:\n        .byte   %00000000       ; 000E 1-01:\n        .byte   %00000000       ; 000F 1-01:\n\n        .byte   <tile_4>\n\n\n        .byte   <tile_4>\n\n        .byte   <tile_4>\n\n        .byte   %11110000       ; 09C0 2-38: ****\n        .byte   %11110000       ; 09C1 2-38: ****\n        .byte   %11110000       ; 09C2 2-38: ****\n        .byte   %11110000       ; 09C3 2-38: ****\n        .byte   %11111111       ; 09C4 2-38: ********\n        .byte   %11111111       ; 09C5 2-38: ********\n        .byte   %11111111       ; 09C6 2-38: ********\n        .byte   %11111111       ; 09C7 2-38: ********\n\n        .byte   %11110000       ; 09C8 2-39: ****\n        .byte   %11110000       ; 09C9 2-39: ****\n        .byte   %11110000       ; 09CA 2-39: ****\n        .byte   %11110000       ; 09CB 2-39: ****\n        .byte   %11111111       ; 09CC 2-39: ********\n        .byte   %11111111       ; 09CD 2-39: ********\n        .byte   %11111111       ; 09CE 2-39: ********\n        .byte   %11111111       ; 09CF 2-39: ********\n\n        .byte   %11111111       ; 09D0 2-3a: ********\n        .byte   %11111111       ; 09D1 2-3a: ********\n        .byte   %11111111       ; 09D2 2-3a: ********\n        .byte   %11111111       ; 09D3 2-3a: ********\n        .byte   %11110000       ; 09D4 2-3a: ****\n        .byte   %11110000       ; 09D5 2-3a: ****\n        .byte   %11110000       ; 09D6 2-3a: ****\n        .byte   %11110000       ; 09D7 2-3a: ****\n\n        .byte   %11111111       ; 09D8 2-3b: ********\n        .byte   %11111111       ; 09D9 2-3b: ********\n        .byte   %11111111       ; 09DA 2-3b: ********\n        .byte   %11111111       ; 09DB 2-3b: ********\n        .byte   %11110000       ; 09DC 2-3b: ****\n        .byte   %11110000       ; 09DD 2-3b: ****\n        .byte   %11110000       ; 09DE 2-3b: ****\n        .byte   %11110000       ; 09DF 2-3b: ****\n\n        .byte   %00001111       ; 09E0 2-3c:     ****\n        .byte   %00001111       ; 09E1 2-3c:     ****\n        .byte   %00001111       ; 09E2 2-3c:     ****\n        .byte   %00001111       ; 09E3 2-3c:     ****\n        .byte   %11111111       ; 09E4 2-3c: ********\n        .byte   %11111111       ; 09E5 2-3c: ********\n        .byte   %11111111       ; 09E6 2-3c: ********\n        .byte   %11111111       ; 09E7 2-3c: ********\n\n        .byte   %00001111       ; 09E8 2-3d:     ****\n        .byte   %00001111       ; 09E9 2-3d:     ****\n        .byte   %00001111       ; 09EA 2-3d:     ****\n        .byte   %00001111       ; 09EB 2-3d:     ****\n        .byte   %11111111       ; 09EC 2-3d: ********\n        .byte   %11111111       ; 09ED 2-3d: ********\n        .byte   %11111111       ; 09EE 2-3d: ********\n        .byte   %11111111       ; 09EF 2-3d: ********\n\n        .byte   %00001111       ; 09F0 2-3e:     ****\n        .byte   %00001111       ; 09F1 2-3e:     ****\n        .byte   %00001111       ; 09F2 2-3e:     ****\n        .byte   %00001111       ; 09F3 2-3e:     ****\n        .byte   %11110000       ; 09F4 2-3e: ****\n        .byte   %11110000       ; 09F5 2-3e: ****\n        .byte   %11110000       ; 09F6 2-3e: ****\n        .byte   %11110000       ; 09F7 2-3e: ****\n\n        .byte   %00001111       ; 09F8 2-3f:     ****\n        .byte   %00001111       ; 09F9 2-3f:     ****\n        .byte   %00001111       ; 09FA 2-3f:     ****\n        .byte   %00001111       ; 09FB 2-3f:     ****\n        .byte   %11110000       ; 09FC 2-3f: ****\n        .byte   %11110000       ; 09FD 2-3f: ****\n        .byte   %11110000       ; 09FE 2-3f: ****\n        .byte   %11110000       ; 09FF 2-3f: ****\n\n        .byte   %11111111       ; 0A00 2-40: ********\n        .byte   %11111111       ; 0A01 2-40: ********\n        .byte   %11111111       ; 0A02 2-40: ********\n        .byte   %11111111       ; 0A03 2-40: ********\n        .byte   %11111111       ; 0A04 2-40: ********\n        .byte   %11111111       ; 0A05 2-40: ********\n        .byte   %11111111       ; 0A06 2-40: ********\n        .byte   %11111111       ; 0A07 2-40: ********\n\n        .byte   %11111111       ; 0A08 2-41: ********\n        .byte   %11111111       ; 0A09 2-41: ********\n        .byte   %11111111       ; 0A0A 2-41: ********\n        .byte   %11111111       ; 0A0B 2-41: ********\n        .byte   %11111111       ; 0A0C 2-41: ********\n        .byte   %11111111       ; 0A0D 2-41: ********\n        .byte   %11111111       ; 0A0E 2-41: ********\n        .byte   %11111111       ; 0A0F 2-41: ********\n\n        .byte   %11100111       ; 0A10 2-42: ***  ***\n        .byte   %11100111       ; 0A11 2-42: ***  ***\n        .byte   %11100111       ; 0A12 2-42: ***  ***\n        .byte   %11100111       ; 0A13 2-42: ***  ***\n        .byte   %11111111       ; 0A14 2-42: ********\n        .byte   %11111111       ; 0A15 2-42: ********\n        .byte   %11100111       ; 0A16 2-42: ***  ***\n        .byte   %11111111       ; 0A17 2-42: ********\n\n        .byte   %11100111       ; 0A18 2-43: ***  ***\n        .byte   %11100111       ; 0A19 2-43: ***  ***\n        .byte   %11100111       ; 0A1A 2-43: ***  ***\n        .byte   %11100111       ; 0A1B 2-43: ***  ***\n        .byte   %11111111       ; 0A1C 2-43: ********\n        .byte   %11111111       ; 0A1D 2-43: ********\n        .byte   %11100111       ; 0A1E 2-43: ***  ***\n        .byte   %11111111       ; 0A1F 2-43: ********\n\n        .byte   %10011001       ; 0A20 2-44: *  **  *\n        .byte   %10011001       ; 0A21 2-44: *  **  *\n        .byte   %10011001       ; 0A22 2-44: *  **  *\n        .byte   %11111111       ; 0A23 2-44: ********\n        .byte   %11111111       ; 0A24 2-44: ********\n        .byte   %11111111       ; 0A25 2-44: ********\n        .byte   %11111111       ; 0A26 2-44: ********\n        .byte   %11111111       ; 0A27 2-44: ********\n\n        .byte   %10011001       ; 0A28 2-45: *  **  *\n        .byte   %10011001       ; 0A29 2-45: *  **  *\n        .byte   %10011001       ; 0A2A 2-45: *  **  *\n        .byte   %11111111       ; 0A2B 2-45: ********\n        .byte   %11111111       ; 0A2C 2-45: ********\n        .byte   %11111111       ; 0A2D 2-45: ********\n        .byte   %11111111       ; 0A2E 2-45: ********\n        .byte   %11111111       ; 0A2F 2-45: ********\n\n        .byte   %10011001       ; 0A30 2-46: *  **  *\n        .byte   %10011001       ; 0A31 2-46: *  **  *\n        .byte   %00000000       ; 0A32 2-46:\n        .byte   %10011001       ; 0A33 2-46: *  **  *\n        .byte   %00000000       ; 0A34 2-46:\n        .byte   %10011001       ; 0A35 2-46: *  **  *\n        .byte   %10011001       ; 0A36 2-46: *  **  *\n        .byte   %11111111       ; 0A37 2-46: ********\n\n        .byte   %10011001       ; 0A38 2-47: *  **  *\n        .byte   %10011001       ; 0A39 2-47: *  **  *\n        .byte   %00000000       ; 0A3A 2-47:\n        .byte   %10011001       ; 0A3B 2-47: *  **  *\n        .byte   %00000000       ; 0A3C 2-47:\n        .byte   %10011001       ; 0A3D 2-47: *  **  *\n        .byte   %10011001       ; 0A3E 2-47: *  **  *\n        .byte   %11111111       ; 0A3F 2-47: ********\n\n        .byte   %11100111       ; 0A40 2-48: ***  ***\n        .byte   %11000001       ; 0A41 2-48: **     *\n        .byte   %10011111       ; 0A42 2-48: *  *****\n        .byte   %11000011       ; 0A43 2-48: **    **\n        .byte   %11111001       ; 0A44 2-48: *****  *\n        .byte   %10000011       ; 0A45 2-48: *     **\n        .byte   %11100111       ; 0A46 2-48: ***  ***\n        .byte   %11111111       ; 0A47 2-48: ********\n\n        .byte   %11100111       ; 0A48 2-49: ***  ***\n        .byte   %11000001       ; 0A49 2-49: **     *\n        .byte   %10011111       ; 0A4A 2-49: *  *****\n        .byte   %11000011       ; 0A4B 2-49: **    **\n        .byte   %11111001       ; 0A4C 2-49: *****  *\n        .byte   %10000011       ; 0A4D 2-49: *     **\n        .byte   %11100111       ; 0A4E 2-49: ***  ***\n        .byte   %11111111       ; 0A4F 2-49: ********\n\n        .byte   %11111111       ; 0A50 2-4a: ********\n        .byte   %10011001       ; 0A51 2-4a: *  **  *\n        .byte   %11110011       ; 0A52 2-4a: ****  **\n        .byte   %11100111       ; 0A53 2-4a: ***  ***\n        .byte   %11001111       ; 0A54 2-4a: **  ****\n        .byte   %10011001       ; 0A55 2-4a: *  **  *\n        .byte   %10111001       ; 0A56 2-4a: * ***  *\n        .byte   %11111111       ; 0A57 2-4a: ********\n\n        .byte   %11111111       ; 0A58 2-4b: ********\n        .byte   %10011001       ; 0A59 2-4b: *  **  *\n        .byte   %11110011       ; 0A5A 2-4b: ****  **\n        .byte   %11100111       ; 0A5B 2-4b: ***  ***\n        .byte   %11001111       ; 0A5C 2-4b: **  ****\n        .byte   %10011001       ; 0A5D 2-4b: *  **  *\n        .byte   %10111001       ; 0A5E 2-4b: * ***  *\n        .byte   %11111111       ; 0A5F 2-4b: ********\n\n        .byte   %11000011       ; 0A60 2-4c: **    **\n        .byte   %10011001       ; 0A61 2-4c: *  **  *\n        .byte   %11000011       ; 0A62 2-4c: **    **\n        .byte   %11000111       ; 0A63 2-4c: **   ***\n        .byte   %10011000       ; 0A64 2-4c: *  **\n        .byte   %10011001       ; 0A65 2-4c: *  **  *\n        .byte   %11000000       ; 0A66 2-4c: **\n        .byte   %11111111       ; 0A67 2-4c: ********\n\n        .byte   %11000011       ; 0A68 2-4d: **    **\n        .byte   %10011001       ; 0A69 2-4d: *  **  *\n        .byte   %11000011       ; 0A6A 2-4d: **    **\n        .byte   %11000111       ; 0A6B 2-4d: **   ***\n        .byte   %10011000       ; 0A6C 2-4d: *  **\n        .byte   %10011001       ; 0A6D 2-4d: *  **  *\n        .byte   %11000000       ; 0A6E 2-4d: **\n        .byte   %11111111       ; 0A6F 2-4d: ********\n\n        .byte   %11111001       ; 0A70 2-4e: *****  *\n        .byte   %11110011       ; 0A71 2-4e: ****  **\n        .byte   %11100111       ; 0A72 2-4e: ***  ***\n        .byte   %11111111       ; 0A73 2-4e: ********\n        .byte   %11111111       ; 0A74 2-4e: ********\n        .byte   %11111111       ; 0A75 2-4e: ********\n        .byte   %11111111       ; 0A76 2-4e: ********\n        .byte   %11111111       ; 0A77 2-4e: ********\n\n        .byte   %11111001       ; 0A78 2-4f: *****  *\n        .byte   %11110011       ; 0A79 2-4f: ****  **\n        .byte   %11100111       ; 0A7A 2-4f: ***  ***\n        .byte   %11111111       ; 0A7B 2-4f: ********\n        .byte   %11111111       ; 0A7C 2-4f: ********\n        .byte   %11111111       ; 0A7D 2-4f: ********\n        .byte   %11111111       ; 0A7E 2-4f: ********\n        .byte   %11111111       ; 0A7F 2-4f: ********\n\n        .byte   %11110011       ; 0A80 2-50: ****  **\n        .byte   %11100111       ; 0A81 2-50: ***  ***\n        .byte   %11001111       ; 0A82 2-50: **  ****\n        .byte   %11001111       ; 0A83 2-50: **  ****\n        .byte   %11001111       ; 0A84 2-50: **  ****\n        .byte   %11100111       ; 0A85 2-50: ***  ***\n        .byte   %11110011       ; 0A86 2-50: ****  **\n        .byte   %11111111       ; 0A87 2-50: ********\n\n        .byte   %11110011       ; 0A88 2-51: ****  **\n        .byte   %11100111       ; 0A89 2-51: ***  ***\n        .byte   %11001111       ; 0A8A 2-51: **  ****\n        .byte   %11001111       ; 0A8B 2-51: **  ****\n        .byte   %11001111       ; 0A8C 2-51: **  ****\n        .byte   %11100111       ; 0A8D 2-51: ***  ***\n        .byte   %11110011       ; 0A8E 2-51: ****  **\n        .byte   %11111111       ; 0A8F 2-51: ********\n\n        .byte   %11001111       ; 0A90 2-52: **  ****\n        .byte   %11100111       ; 0A91 2-52: ***  ***\n        .byte   %11110011       ; 0A92 2-52: ****  **\n        .byte   %11110011       ; 0A93 2-52: ****  **\n        .byte   %11110011       ; 0A94 2-52: ****  **\n        .byte   %11100111       ; 0A95 2-52: ***  ***\n        .byte   %11001111       ; 0A96 2-52: **  ****\n        .byte   %11111111       ; 0A97 2-52: ********\n\n        .byte   %11001111       ; 0A98 2-53: **  ****\n        .byte   %11100111       ; 0A99 2-53: ***  ***\n        .byte   %11110011       ; 0A9A 2-53: ****  **\n        .byte   %11110011       ; 0A9B 2-53: ****  **\n        .byte   %11110011       ; 0A9C 2-53: ****  **\n        .byte   %11100111       ; 0A9D 2-53: ***  ***\n        .byte   %11001111       ; 0A9E 2-53: **  ****\n        .byte   %11111111       ; 0A9F 2-53: ********\n\n        .byte   %11111111       ; 0AA0 2-54: ********\n        .byte   %10011001       ; 0AA1 2-54: *  **  *\n        .byte   %11000011       ; 0AA2 2-54: **    **\n        .byte   %00000000       ; 0AA3 2-54:\n        .byte   %11000011       ; 0AA4 2-54: **    **\n        .byte   %10011001       ; 0AA5 2-54: *  **  *\n        .byte   %11111111       ; 0AA6 2-54: ********\n        .byte   %11111111       ; 0AA7 2-54: ********\n\n        .byte   %11111111       ; 0AA8 2-55: ********\n        .byte   %10011001       ; 0AA9 2-55: *  **  *\n        .byte   %11000011       ; 0AAA 2-55: **    **\n        .byte   %00000000       ; 0AAB 2-55:\n        .byte   %11000011       ; 0AAC 2-55: **    **\n        .byte   %10011001       ; 0AAD 2-55: *  **  *\n        .byte   %11111111       ; 0AAE 2-55: ********\n        .byte   %11111111       ; 0AAF 2-55: ********\n\n        .byte   %11111111       ; 0AB0 2-56: ********\n        .byte   %11100111       ; 0AB1 2-56: ***  ***\n        .byte   %11100111       ; 0AB2 2-56: ***  ***\n        .byte   %10000001       ; 0AB3 2-56: *      *\n        .byte   %11100111       ; 0AB4 2-56: ***  ***\n        .byte   %11100111       ; 0AB5 2-56: ***  ***\n        .byte   %11111111       ; 0AB6 2-56: ********\n        .byte   %11111111       ; 0AB7 2-56: ********\n\n        .byte   %11111111       ; 0AB8 2-57: ********\n        .byte   %11100111       ; 0AB9 2-57: ***  ***\n        .byte   %11100111       ; 0ABA 2-57: ***  ***\n        .byte   %10000001       ; 0ABB 2-57: *      *\n        .byte   %11100111       ; 0ABC 2-57: ***  ***\n        .byte   %11100111       ; 0ABD 2-57: ***  ***\n        .byte   %11111111       ; 0ABE 2-57: ********\n        .byte   %11111111       ; 0ABF 2-57: ********\n\n        .byte   %11111111       ; 0AC0 2-58: ********\n        .byte   %11111111       ; 0AC1 2-58: ********\n        .byte   %11111111       ; 0AC2 2-58: ********\n        .byte   %11111111       ; 0AC3 2-58: ********\n        .byte   %11111111       ; 0AC4 2-58: ********\n        .byte   %11100111       ; 0AC5 2-58: ***  ***\n        .byte   %11100111       ; 0AC6 2-58: ***  ***\n        .byte   %11001111       ; 0AC7 2-58: **  ****\n\n        .byte   %11111111       ; 0AC8 2-59: ********\n        .byte   %11111111       ; 0AC9 2-59: ********\n        .byte   %11111111       ; 0ACA 2-59: ********\n        .byte   %11111111       ; 0ACB 2-59: ********\n        .byte   %11111111       ; 0ACC 2-59: ********\n        .byte   %11100111       ; 0ACD 2-59: ***  ***\n        .byte   %11100111       ; 0ACE 2-59: ***  ***\n        .byte   %11001111       ; 0ACF 2-59: **  ****\n\n        .byte   %11111111       ; 0AD0 2-5a: ********\n        .byte   %11111111       ; 0AD1 2-5a: ********\n        .byte   %11111111       ; 0AD2 2-5a: ********\n        .byte   %10000001       ; 0AD3 2-5a: *      *\n        .byte   %11111111       ; 0AD4 2-5a: ********\n        .byte   %11111111       ; 0AD5 2-5a: ********\n        .byte   %11111111       ; 0AD6 2-5a: ********\n        .byte   %11111111       ; 0AD7 2-5a: ********\n\n        .byte   %11111111       ; 0AD8 2-5b: ********\n        .byte   %11111111       ; 0AD9 2-5b: ********\n        .byte   %11111111       ; 0ADA 2-5b: ********\n        .byte   %10000001       ; 0ADB 2-5b: *      *\n        .byte   %11111111       ; 0ADC 2-5b: ********\n        .byte   %11111111       ; 0ADD 2-5b: ********\n        .byte   %11111111       ; 0ADE 2-5b: ********\n        .byte   %11111111       ; 0ADF 2-5b: ********\n\n        .byte   %11111111       ; 0AE0 2-5c: ********\n        .byte   %11111111       ; 0AE1 2-5c: ********\n        .byte   %11111111       ; 0AE2 2-5c: ********\n        .byte   %11111111       ; 0AE3 2-5c: ********\n        .byte   %11111111       ; 0AE4 2-5c: ********\n        .byte   %11100111       ; 0AE5 2-5c: ***  ***\n        .byte   %11100111       ; 0AE6 2-5c: ***  ***\n        .byte   %11111111       ; 0AE7 2-5c: ********\n\n        .byte   %11111111       ; 0AE8 2-5d: ********\n        .byte   %11111111       ; 0AE9 2-5d: ********\n        .byte   %11111111       ; 0AEA 2-5d: ********\n        .byte   %11111111       ; 0AEB 2-5d: ********\n        .byte   %11111111       ; 0AEC 2-5d: ********\n        .byte   %11100111       ; 0AED 2-5d: ***  ***\n        .byte   %11100111       ; 0AEE 2-5d: ***  ***\n        .byte   %11111111       ; 0AEF 2-5d: ********\n\n        .byte   %11111111       ; 0AF0 2-5e: ********\n        .byte   %11111100       ; 0AF1 2-5e: ******\n        .byte   %11111001       ; 0AF2 2-5e: *****  *\n        .byte   %11110011       ; 0AF3 2-5e: ****  **\n        .byte   %11100111       ; 0AF4 2-5e: ***  ***\n        .byte   %11001111       ; 0AF5 2-5e: **  ****\n        .byte   %10011111       ; 0AF6 2-5e: *  *****\n        .byte   %11111111       ; 0AF7 2-5e: ********\n\n        .byte   %11111111       ; 0AF8 2-5f: ********\n        .byte   %11111100       ; 0AF9 2-5f: ******\n        .byte   %11111001       ; 0AFA 2-5f: *****  *\n        .byte   %11110011       ; 0AFB 2-5f: ****  **\n        .byte   %11100111       ; 0AFC 2-5f: ***  ***\n        .byte   %11001111       ; 0AFD 2-5f: **  ****\n        .byte   %10011111       ; 0AFE 2-5f: *  *****\n        .byte   %11111111       ; 0AFF 2-5f: ********\n\n        .byte   %11000011       ; 0B00 2-60: **    **\n        .byte   %10011001       ; 0B01 2-60: *  **  *\n        .byte   %10010001       ; 0B02 2-60: *  *   *\n        .byte   %10001001       ; 0B03 2-60: *   *  *\n        .byte   %10011001       ; 0B04 2-60: *  **  *\n        .byte   %10011001       ; 0B05 2-60: *  **  *\n        .byte   %11000011       ; 0B06 2-60: **    **\n        .byte   %11111111       ; 0B07 2-60: ********\n\n        .byte   %11000011       ; 0B08 2-61: **    **\n        .byte   %10011001       ; 0B09 2-61: *  **  *\n        .byte   %10010001       ; 0B0A 2-61: *  *   *\n        .byte   %10001001       ; 0B0B 2-61: *   *  *\n        .byte   %10011001       ; 0B0C 2-61: *  **  *\n        .byte   %10011001       ; 0B0D 2-61: *  **  *\n        .byte   %11000011       ; 0B0E 2-61: **    **\n        .byte   %11111111       ; 0B0F 2-61: ********\n\n        .byte   %11100111       ; 0B10 2-62: ***  ***\n        .byte   %11100111       ; 0B11 2-62: ***  ***\n        .byte   %11000111       ; 0B12 2-62: **   ***\n        .byte   %11100111       ; 0B13 2-62: ***  ***\n        .byte   %11100111       ; 0B14 2-62: ***  ***\n        .byte   %11100111       ; 0B15 2-62: ***  ***\n        .byte   %10000001       ; 0B16 2-62: *      *\n        .byte   %11111111       ; 0B17 2-62: ********\n\n        .byte   %11100111       ; 0B18 2-63: ***  ***\n        .byte   %11100111       ; 0B19 2-63: ***  ***\n        .byte   %11000111       ; 0B1A 2-63: **   ***\n        .byte   %11100111       ; 0B1B 2-63: ***  ***\n        .byte   %11100111       ; 0B1C 2-63: ***  ***\n        .byte   %11100111       ; 0B1D 2-63: ***  ***\n        .byte   %10000001       ; 0B1E 2-63: *      *\n        .byte   %11111111       ; 0B1F 2-63: ********\n\n        .byte   %11000011       ; 0B20 2-64: **    **\n        .byte   %10011001       ; 0B21 2-64: *  **  *\n        .byte   %11111001       ; 0B22 2-64: *****  *\n        .byte   %11110011       ; 0B23 2-64: ****  **\n        .byte   %11001111       ; 0B24 2-64: **  ****\n        .byte   %10011111       ; 0B25 2-64: *  *****\n        .byte   %10000001       ; 0B26 2-64: *      *\n        .byte   %11111111       ; 0B27 2-64: ********\n\n        .byte   %11000011       ; 0B28 2-65: **    **\n        .byte   %10011001       ; 0B29 2-65: *  **  *\n        .byte   %11111001       ; 0B2A 2-65: *****  *\n        .byte   %11110011       ; 0B2B 2-65: ****  **\n        .byte   %11001111       ; 0B2C 2-65: **  ****\n        .byte   %10011111       ; 0B2D 2-65: *  *****\n        .byte   %10000001       ; 0B2E 2-65: *      *\n        .byte   %11111111       ; 0B2F 2-65: ********\n\n        .byte   %11000011       ; 0B30 2-66: **    **\n        .byte   %10011001       ; 0B31 2-66: *  **  *\n        .byte   %11111001       ; 0B32 2-66: *****  *\n        .byte   %11100011       ; 0B33 2-66: ***   **\n        .byte   %11111001       ; 0B34 2-66: *****  *\n        .byte   %10011001       ; 0B35 2-66: *  **  *\n        .byte   %11000011       ; 0B36 2-66: **    **\n        .byte   %11111111       ; 0B37 2-66: ********\n\n        .byte   %11000011       ; 0B38 2-67: **    **\n        .byte   %10011001       ; 0B39 2-67: *  **  *\n        .byte   %11111001       ; 0B3A 2-67: *****  *\n        .byte   %11100011       ; 0B3B 2-67: ***   **\n        .byte   %11111001       ; 0B3C 2-67: *****  *\n        .byte   %10011001       ; 0B3D 2-67: *  **  *\n        .byte   %11000011       ; 0B3E 2-67: **    **\n        .byte   %11111111       ; 0B3F 2-67: ********\n\n        .byte   %11111001       ; 0B40 2-68: *****  *\n        .byte   %11110001       ; 0B41 2-68: ****   *\n        .byte   %11100001       ; 0B42 2-68: ***    *\n        .byte   %10011001       ; 0B43 2-68: *  **  *\n        .byte   %10000000       ; 0B44 2-68: *\n        .byte   %11111001       ; 0B45 2-68: *****  *\n        .byte   %11111001       ; 0B46 2-68: *****  *\n        .byte   %11111111       ; 0B47 2-68: ********\n\n        .byte   %11111001       ; 0B48 2-69: *****  *\n        .byte   %11110001       ; 0B49 2-69: ****   *\n        .byte   %11100001       ; 0B4A 2-69: ***    *\n        .byte   %10011001       ; 0B4B 2-69: *  **  *\n        .byte   %10000000       ; 0B4C 2-69: *\n        .byte   %11111001       ; 0B4D 2-69: *****  *\n        .byte   %11111001       ; 0B4E 2-69: *****  *\n        .byte   %11111111       ; 0B4F 2-69: ********\n\n        .byte   %10000001       ; 0B50 2-6a: *      *\n        .byte   %10011111       ; 0B51 2-6a: *  *****\n        .byte   %10000011       ; 0B52 2-6a: *     **\n        .byte   %11111001       ; 0B53 2-6a: *****  *\n        .byte   %11111001       ; 0B54 2-6a: *****  *\n        .byte   %10011001       ; 0B55 2-6a: *  **  *\n        .byte   %11000011       ; 0B56 2-6a: **    **\n        .byte   %11111111       ; 0B57 2-6a: ********\n\n        .byte   %10000001       ; 0B58 2-6b: *      *\n        .byte   %10011111       ; 0B59 2-6b: *  *****\n        .byte   %10000011       ; 0B5A 2-6b: *     **\n        .byte   %11111001       ; 0B5B 2-6b: *****  *\n        .byte   %11111001       ; 0B5C 2-6b: *****  *\n        .byte   %10011001       ; 0B5D 2-6b: *  **  *\n        .byte   %11000011       ; 0B5E 2-6b: **    **\n        .byte   %11111111       ; 0B5F 2-6b: ********\n\n        .byte   %11000011       ; 0B60 2-6c: **    **\n        .byte   %10011001       ; 0B61 2-6c: *  **  *\n        .byte   %10011111       ; 0B62 2-6c: *  *****\n        .byte   %10000011       ; 0B63 2-6c: *     **\n        .byte   %10011001       ; 0B64 2-6c: *  **  *\n        .byte   %10011001       ; 0B65 2-6c: *  **  *\n        .byte   %11000011       ; 0B66 2-6c: **    **\n        .byte   %11111111       ; 0B67 2-6c: ********\n\n        .byte   %11000011       ; 0B68 2-6d: **    **\n        .byte   %10011001       ; 0B69 2-6d: *  **  *\n        .byte   %10011111       ; 0B6A 2-6d: *  *****\n        .byte   %10000011       ; 0B6B 2-6d: *     **\n        .byte   %10011001       ; 0B6C 2-6d: *  **  *\n        .byte   %10011001       ; 0B6D 2-6d: *  **  *\n        .byte   %11000011       ; 0B6E 2-6d: **    **\n        .byte   %11111111       ; 0B6F 2-6d: ********\n\n        .byte   %10000001       ; 0B70 2-6e: *      *\n        .byte   %10011001       ; 0B71 2-6e: *  **  *\n        .byte   %11110011       ; 0B72 2-6e: ****  **\n        .byte   %11100111       ; 0B73 2-6e: ***  ***\n        .byte   %11100111       ; 0B74 2-6e: ***  ***\n        .byte   %11100111       ; 0B75 2-6e: ***  ***\n        .byte   %11100111       ; 0B76 2-6e: ***  ***\n        .byte   %11111111       ; 0B77 2-6e: ********\n\n        .byte   %10000001       ; 0B78 2-6f: *      *\n        .byte   %10011001       ; 0B79 2-6f: *  **  *\n        .byte   %11110011       ; 0B7A 2-6f: ****  **\n        .byte   %11100111       ; 0B7B 2-6f: ***  ***\n        .byte   %11100111       ; 0B7C 2-6f: ***  ***\n        .byte   %11100111       ; 0B7D 2-6f: ***  ***\n        .byte   %11100111       ; 0B7E 2-6f: ***  ***\n        .byte   %11111111       ; 0B7F 2-6f: ********\n\n        .byte   %11000011       ; 0B80 2-70: **    **\n        .byte   %10011001       ; 0B81 2-70: *  **  *\n        .byte   %10011001       ; 0B82 2-70: *  **  *\n        .byte   %11000011       ; 0B83 2-70: **    **\n        .byte   %10011001       ; 0B84 2-70: *  **  *\n        .byte   %10011001       ; 0B85 2-70: *  **  *\n        .byte   %11000011       ; 0B86 2-70: **    **\n        .byte   %11111111       ; 0B87 2-70: ********\n\n        .byte   %11000011       ; 0B88 2-71: **    **\n        .byte   %10011001       ; 0B89 2-71: *  **  *\n        .byte   %10011001       ; 0B8A 2-71: *  **  *\n        .byte   %11000011       ; 0B8B 2-71: **    **\n        .byte   %10011001       ; 0B8C 2-71: *  **  *\n        .byte   %10011001       ; 0B8D 2-71: *  **  *\n        .byte   %11000011       ; 0B8E 2-71: **    **\n        .byte   %11111111       ; 0B8F 2-71: ********\n\n        .byte   %11000011       ; 0B90 2-72: **    **\n        .byte   %10011001       ; 0B91 2-72: *  **  *\n        .byte   %10011001       ; 0B92 2-72: *  **  *\n        .byte   %11000001       ; 0B93 2-72: **     *\n        .byte   %11111001       ; 0B94 2-72: *****  *\n        .byte   %10011001       ; 0B95 2-72: *  **  *\n        .byte   %11000011       ; 0B96 2-72: **    **\n        .byte   %11111111       ; 0B97 2-72: ********\n\n        .byte   %11000011       ; 0B98 2-73: **    **\n        .byte   %10011001       ; 0B99 2-73: *  **  *\n        .byte   %10011001       ; 0B9A 2-73: *  **  *\n        .byte   %11000001       ; 0B9B 2-73: **     *\n        .byte   %11111001       ; 0B9C 2-73: *****  *\n        .byte   %10011001       ; 0B9D 2-73: *  **  *\n        .byte   %11000011       ; 0B9E 2-73: **    **\n        .byte   %11111111       ; 0B9F 2-73: ********\n\n        .byte   %11111111       ; 0BA0 2-74: ********\n        .byte   %11111111       ; 0BA1 2-74: ********\n        .byte   %11100111       ; 0BA2 2-74: ***  ***\n        .byte   %11111111       ; 0BA3 2-74: ********\n        .byte   %11111111       ; 0BA4 2-74: ********\n        .byte   %11100111       ; 0BA5 2-74: ***  ***\n        .byte   %11111111       ; 0BA6 2-74: ********\n        .byte   %11111111       ; 0BA7 2-74: ********\n\n        .byte   %11111111       ; 0BA8 2-75: ********\n        .byte   %11111111       ; 0BA9 2-75: ********\n        .byte   %11100111       ; 0BAA 2-75: ***  ***\n        .byte   %11111111       ; 0BAB 2-75: ********\n        .byte   %11111111       ; 0BAC 2-75: ********\n        .byte   %11100111       ; 0BAD 2-75: ***  ***\n        .byte   %11111111       ; 0BAE 2-75: ********\n        .byte   %11111111       ; 0BAF 2-75: ********\n\n        .byte   %11111111       ; 0BB0 2-76: ********\n        .byte   %11111111       ; 0BB1 2-76: ********\n        .byte   %11100111       ; 0BB2 2-76: ***  ***\n        .byte   %11111111       ; 0BB3 2-76: ********\n        .byte   %11111111       ; 0BB4 2-76: ********\n        .byte   %11100111       ; 0BB5 2-76: ***  ***\n        .byte   %11100111       ; 0BB6 2-76: ***  ***\n        .byte   %11001111       ; 0BB7 2-76: **  ****\n\n        .byte   %11111111       ; 0BB8 2-77: ********\n        .byte   %11111111       ; 0BB9 2-77: ********\n        .byte   %11100111       ; 0BBA 2-77: ***  ***\n        .byte   %11111111       ; 0BBB 2-77: ********\n        .byte   %11111111       ; 0BBC 2-77: ********\n        .byte   %11100111       ; 0BBD 2-77: ***  ***\n        .byte   %11100111       ; 0BBE 2-77: ***  ***\n        .byte   %11001111       ; 0BBF 2-77: **  ****\n\n        .byte   %11110001       ; 0BC0 2-78: ****   *\n        .byte   %11100111       ; 0BC1 2-78: ***  ***\n        .byte   %11001111       ; 0BC2 2-78: **  ****\n        .byte   %10011111       ; 0BC3 2-78: *  *****\n        .byte   %11001111       ; 0BC4 2-78: **  ****\n        .byte   %11100111       ; 0BC5 2-78: ***  ***\n        .byte   %11110001       ; 0BC6 2-78: ****   *\n        .byte   %11111111       ; 0BC7 2-78: ********\n\n        .byte   %11110001       ; 0BC8 2-79: ****   *\n        .byte   %11100111       ; 0BC9 2-79: ***  ***\n        .byte   %11001111       ; 0BCA 2-79: **  ****\n        .byte   %10011111       ; 0BCB 2-79: *  *****\n        .byte   %11001111       ; 0BCC 2-79: **  ****\n        .byte   %11100111       ; 0BCD 2-79: ***  ***\n        .byte   %11110001       ; 0BCE 2-79: ****   *\n        .byte   %11111111       ; 0BCF 2-79: ********\n\n        .byte   %11111111       ; 0BD0 2-7a: ********\n        .byte   %11111111       ; 0BD1 2-7a: ********\n        .byte   %10000001       ; 0BD2 2-7a: *      *\n        .byte   %11111111       ; 0BD3 2-7a: ********\n        .byte   %10000001       ; 0BD4 2-7a: *      *\n        .byte   %11111111       ; 0BD5 2-7a: ********\n        .byte   %11111111       ; 0BD6 2-7a: ********\n        .byte   %11111111       ; 0BD7 2-7a: ********\n\n        .byte   %11111111       ; 0BD8 2-7b: ********\n        .byte   %11111111       ; 0BD9 2-7b: ********\n        .byte   %10000001       ; 0BDA 2-7b: *      *\n        .byte   %11111111       ; 0BDB 2-7b: ********\n        .byte   %10000001       ; 0BDC 2-7b: *      *\n        .byte   %11111111       ; 0BDD 2-7b: ********\n        .byte   %11111111       ; 0BDE 2-7b: ********\n        .byte   %11111111       ; 0BDF 2-7b: ********\n\n        .byte   %10001111       ; 0BE0 2-7c: *   ****\n        .byte   %11100111       ; 0BE1 2-7c: ***  ***\n        .byte   %11110011       ; 0BE2 2-7c: ****  **\n        .byte   %11111001       ; 0BE3 2-7c: *****  *\n        .byte   %11110011       ; 0BE4 2-7c: ****  **\n        .byte   %11100111       ; 0BE5 2-7c: ***  ***\n        .byte   %10001111       ; 0BE6 2-7c: *   ****\n        .byte   %11111111       ; 0BE7 2-7c: ********\n\n        .byte   %10001111       ; 0BE8 2-7d: *   ****\n        .byte   %11100111       ; 0BE9 2-7d: ***  ***\n        .byte   %11110011       ; 0BEA 2-7d: ****  **\n        .byte   %11111001       ; 0BEB 2-7d: *****  *\n        .byte   %11110011       ; 0BEC 2-7d: ****  **\n        .byte   %11100111       ; 0BED 2-7d: ***  ***\n        .byte   %10001111       ; 0BEE 2-7d: *   ****\n        .byte   %11111111       ; 0BEF 2-7d: ********\n\n        .byte   %11000011       ; 0BF0 2-7e: **    **\n        .byte   %10011001       ; 0BF1 2-7e: *  **  *\n        .byte   %11111001       ; 0BF2 2-7e: *****  *\n        .byte   %11110011       ; 0BF3 2-7e: ****  **\n        .byte   %11100111       ; 0BF4 2-7e: ***  ***\n        .byte   %11111111       ; 0BF5 2-7e: ********\n        .byte   %11100111       ; 0BF6 2-7e: ***  ***\n        .byte   %11111111       ; 0BF7 2-7e: ********\n\n        .byte   %11000011       ; 0BF8 2-7f: **    **\n        .byte   %10011001       ; 0BF9 2-7f: *  **  *\n        .byte   %11111001       ; 0BFA 2-7f: *****  *\n        .byte   %11110011       ; 0BFB 2-7f: ****  **\n        .byte   %11100111       ; 0BFC 2-7f: ***  ***\n        .byte   %11111111       ; 0BFD 2-7f: ********\n        .byte   %11100111       ; 0BFE 2-7f: ***  ***\n        .byte   %11111111       ; 0BFF 2-7f: ********\n\n        .byte   %11000011       ; 0C00 2-80: **    **\n        .byte   %10011001       ; 0C01 2-80: *  **  *\n        .byte   %10010001       ; 0C02 2-80: *  *   *\n        .byte   %10010001       ; 0C03 2-80: *  *   *\n        .byte   %10011111       ; 0C04 2-80: *  *****\n        .byte   %10011101       ; 0C05 2-80: *  *** *\n        .byte   %11000011       ; 0C06 2-80: **    **\n        .byte   %11111111       ; 0C07 2-80: ********\n\n        .byte   %11000011       ; 0C08 2-81: **    **\n        .byte   %10011001       ; 0C09 2-81: *  **  *\n        .byte   %10010001       ; 0C0A 2-81: *  *   *\n        .byte   %10010001       ; 0C0B 2-81: *  *   *\n        .byte   %10011111       ; 0C0C 2-81: *  *****\n        .byte   %10011101       ; 0C0D 2-81: *  *** *\n        .byte   %11000011       ; 0C0E 2-81: **    **\n        .byte   %11111111       ; 0C0F 2-81: ********\n\n        .byte   %11100111       ; 0C10 2-82: ***  ***\n        .byte   %11000011       ; 0C11 2-82: **    **\n        .byte   %10011001       ; 0C12 2-82: *  **  *\n        .byte   %10000001       ; 0C13 2-82: *      *\n        .byte   %10011001       ; 0C14 2-82: *  **  *\n        .byte   %10011001       ; 0C15 2-82: *  **  *\n        .byte   %10011001       ; 0C16 2-82: *  **  *\n        .byte   %11111111       ; 0C17 2-82: ********\n\n        .byte   %11100111       ; 0C18 2-83: ***  ***\n        .byte   %11000011       ; 0C19 2-83: **    **\n        .byte   %10011001       ; 0C1A 2-83: *  **  *\n        .byte   %10000001       ; 0C1B 2-83: *      *\n        .byte   %10011001       ; 0C1C 2-83: *  **  *\n        .byte   %10011001       ; 0C1D 2-83: *  **  *\n        .byte   %10011001       ; 0C1E 2-83: *  **  *\n        .byte   %11111111       ; 0C1F 2-83: ********\n\n        .byte   %10000011       ; 0C20 2-84: *     **\n        .byte   %10011001       ; 0C21 2-84: *  **  *\n        .byte   %10011001       ; 0C22 2-84: *  **  *\n        .byte   %10000011       ; 0C23 2-84: *     **\n        .byte   %10011001       ; 0C24 2-84: *  **  *\n        .byte   %10011001       ; 0C25 2-84: *  **  *\n        .byte   %10000011       ; 0C26 2-84: *     **\n        .byte   %11111111       ; 0C27 2-84: ********\n\n        .byte   %10000011       ; 0C28 2-85: *     **\n        .byte   %10011001       ; 0C29 2-85: *  **  *\n        .byte   %10011001       ; 0C2A 2-85: *  **  *\n        .byte   %10000011       ; 0C2B 2-85: *     **\n        .byte   %10011001       ; 0C2C 2-85: *  **  *\n        .byte   %10011001       ; 0C2D 2-85: *  **  *\n        .byte   %10000011       ; 0C2E 2-85: *     **\n        .byte   %11111111       ; 0C2F 2-85: ********\n\n        .byte   %11000011       ; 0C30 2-86: **    **\n        .byte   %10011001       ; 0C31 2-86: *  **  *\n        .byte   %10011111       ; 0C32 2-86: *  *****\n        .byte   %10011111       ; 0C33 2-86: *  *****\n        .byte   %10011111       ; 0C34 2-86: *  *****\n        .byte   %10011001       ; 0C35 2-86: *  **  *\n        .byte   %11000011       ; 0C36 2-86: **    **\n        .byte   %11111111       ; 0C37 2-86: ********\n\n        .byte   %11000011       ; 0C38 2-87: **    **\n        .byte   %10011001       ; 0C39 2-87: *  **  *\n        .byte   %10011111       ; 0C3A 2-87: *  *****\n        .byte   %10011111       ; 0C3B 2-87: *  *****\n        .byte   %10011111       ; 0C3C 2-87: *  *****\n        .byte   %10011001       ; 0C3D 2-87: *  **  *\n        .byte   %11000011       ; 0C3E 2-87: **    **\n        .byte   %11111111       ; 0C3F 2-87: ********\n\n        .byte   %10000111       ; 0C40 2-88: *    ***\n        .byte   %10010011       ; 0C41 2-88: *  *  **\n        .byte   %10011001       ; 0C42 2-88: *  **  *\n        .byte   %10011001       ; 0C43 2-88: *  **  *\n        .byte   %10011001       ; 0C44 2-88: *  **  *\n        .byte   %10010011       ; 0C45 2-88: *  *  **\n        .byte   %10000111       ; 0C46 2-88: *    ***\n        .byte   %11111111       ; 0C47 2-88: ********\n\n        .byte   %10000111       ; 0C48 2-89: *    ***\n        .byte   %10010011       ; 0C49 2-89: *  *  **\n        .byte   %10011001       ; 0C4A 2-89: *  **  *\n        .byte   %10011001       ; 0C4B 2-89: *  **  *\n        .byte   %10011001       ; 0C4C 2-89: *  **  *\n        .byte   %10010011       ; 0C4D 2-89: *  *  **\n        .byte   %10000111       ; 0C4E 2-89: *    ***\n        .byte   %11111111       ; 0C4F 2-89: ********\n\n        .byte   %10000001       ; 0C50 2-8a: *      *\n        .byte   %10011111       ; 0C51 2-8a: *  *****\n        .byte   %10011111       ; 0C52 2-8a: *  *****\n        .byte   %10000111       ; 0C53 2-8a: *    ***\n        .byte   %10011111       ; 0C54 2-8a: *  *****\n        .byte   %10011111       ; 0C55 2-8a: *  *****\n        .byte   %10000001       ; 0C56 2-8a: *      *\n        .byte   %11111111       ; 0C57 2-8a: ********\n\n        .byte   %10000001       ; 0C58 2-8b: *      *\n        .byte   %10011111       ; 0C59 2-8b: *  *****\n        .byte   %10011111       ; 0C5A 2-8b: *  *****\n        .byte   %10000111       ; 0C5B 2-8b: *    ***\n        .byte   %10011111       ; 0C5C 2-8b: *  *****\n        .byte   %10011111       ; 0C5D 2-8b: *  *****\n        .byte   %10000001       ; 0C5E 2-8b: *      *\n        .byte   %11111111       ; 0C5F 2-8b: ********\n\n        .byte   %10000001       ; 0C60 2-8c: *      *\n        .byte   %10011111       ; 0C61 2-8c: *  *****\n        .byte   %10011111       ; 0C62 2-8c: *  *****\n        .byte   %10000111       ; 0C63 2-8c: *    ***\n        .byte   %10011111       ; 0C64 2-8c: *  *****\n        .byte   %10011111       ; 0C65 2-8c: *  *****\n        .byte   %10011111       ; 0C66 2-8c: *  *****\n        .byte   %11111111       ; 0C67 2-8c: ********\n\n        .byte   %10000001       ; 0C68 2-8d: *      *\n        .byte   %10011111       ; 0C69 2-8d: *  *****\n        .byte   %10011111       ; 0C6A 2-8d: *  *****\n        .byte   %10000111       ; 0C6B 2-8d: *    ***\n        .byte   %10011111       ; 0C6C 2-8d: *  *****\n        .byte   %10011111       ; 0C6D 2-8d: *  *****\n        .byte   %10011111       ; 0C6E 2-8d: *  *****\n        .byte   %11111111       ; 0C6F 2-8d: ********\n\n        .byte   %11000011       ; 0C70 2-8e: **    **\n        .byte   %10011001       ; 0C71 2-8e: *  **  *\n        .byte   %10011111       ; 0C72 2-8e: *  *****\n        .byte   %10010001       ; 0C73 2-8e: *  *   *\n        .byte   %10011001       ; 0C74 2-8e: *  **  *\n        .byte   %10011001       ; 0C75 2-8e: *  **  *\n        .byte   %11000011       ; 0C76 2-8e: **    **\n        .byte   %11111111       ; 0C77 2-8e: ********\n\n        .byte   %11000011       ; 0C78 2-8f: **    **\n        .byte   %10011001       ; 0C79 2-8f: *  **  *\n        .byte   %10011111       ; 0C7A 2-8f: *  *****\n        .byte   %10010001       ; 0C7B 2-8f: *  *   *\n        .byte   %10011001       ; 0C7C 2-8f: *  **  *\n        .byte   %10011001       ; 0C7D 2-8f: *  **  *\n        .byte   %11000011       ; 0C7E 2-8f: **    **\n        .byte   %11111111       ; 0C7F 2-8f: ********\n\n        .byte   %10011001       ; 0C80 2-90: *  **  *\n        .byte   %10011001       ; 0C81 2-90: *  **  *\n        .byte   %10011001       ; 0C82 2-90: *  **  *\n        .byte   %10000001       ; 0C83 2-90: *      *\n        .byte   %10011001       ; 0C84 2-90: *  **  *\n        .byte   %10011001       ; 0C85 2-90: *  **  *\n        .byte   %10011001       ; 0C86 2-90: *  **  *\n        .byte   %11111111       ; 0C87 2-90: ********\n\n        .byte   %10011001       ; 0C88 2-91: *  **  *\n        .byte   %10011001       ; 0C89 2-91: *  **  *\n        .byte   %10011001       ; 0C8A 2-91: *  **  *\n        .byte   %10000001       ; 0C8B 2-91: *      *\n        .byte   %10011001       ; 0C8C 2-91: *  **  *\n        .byte   %10011001       ; 0C8D 2-91: *  **  *\n        .byte   %10011001       ; 0C8E 2-91: *  **  *\n        .byte   %11111111       ; 0C8F 2-91: ********\n\n        .byte   %11000011       ; 0C90 2-92: **    **\n        .byte   %11100111       ; 0C91 2-92: ***  ***\n        .byte   %11100111       ; 0C92 2-92: ***  ***\n        .byte   %11100111       ; 0C93 2-92: ***  ***\n        .byte   %11100111       ; 0C94 2-92: ***  ***\n        .byte   %11100111       ; 0C95 2-92: ***  ***\n        .byte   %11000011       ; 0C96 2-92: **    **\n        .byte   %11111111       ; 0C97 2-92: ********\n\n        .byte   %11000011       ; 0C98 2-93: **    **\n        .byte   %11100111       ; 0C99 2-93: ***  ***\n        .byte   %11100111       ; 0C9A 2-93: ***  ***\n        .byte   %11100111       ; 0C9B 2-93: ***  ***\n        .byte   %11100111       ; 0C9C 2-93: ***  ***\n        .byte   %11100111       ; 0C9D 2-93: ***  ***\n        .byte   %11000011       ; 0C9E 2-93: **    **\n        .byte   %11111111       ; 0C9F 2-93: ********\n\n        .byte   %11100001       ; 0CA0 2-94: ***    *\n        .byte   %11110011       ; 0CA1 2-94: ****  **\n        .byte   %11110011       ; 0CA2 2-94: ****  **\n        .byte   %11110011       ; 0CA3 2-94: ****  **\n        .byte   %11110011       ; 0CA4 2-94: ****  **\n        .byte   %10010011       ; 0CA5 2-94: *  *  **\n        .byte   %11000111       ; 0CA6 2-94: **   ***\n        .byte   %11111111       ; 0CA7 2-94: ********\n\n        .byte   %11100001       ; 0CA8 2-95: ***    *\n        .byte   %11110011       ; 0CA9 2-95: ****  **\n        .byte   %11110011       ; 0CAA 2-95: ****  **\n        .byte   %11110011       ; 0CAB 2-95: ****  **\n        .byte   %11110011       ; 0CAC 2-95: ****  **\n        .byte   %10010011       ; 0CAD 2-95: *  *  **\n        .byte   %11000111       ; 0CAE 2-95: **   ***\n        .byte   %11111111       ; 0CAF 2-95: ********\n\n        .byte   %10011001       ; 0CB0 2-96: *  **  *\n        .byte   %10010011       ; 0CB1 2-96: *  *  **\n        .byte   %10000111       ; 0CB2 2-96: *    ***\n        .byte   %10001111       ; 0CB3 2-96: *   ****\n        .byte   %10000111       ; 0CB4 2-96: *    ***\n        .byte   %10010011       ; 0CB5 2-96: *  *  **\n        .byte   %10011001       ; 0CB6 2-96: *  **  *\n        .byte   %11111111       ; 0CB7 2-96: ********\n\n        .byte   %10011001       ; 0CB8 2-97: *  **  *\n        .byte   %10010011       ; 0CB9 2-97: *  *  **\n        .byte   %10000111       ; 0CBA 2-97: *    ***\n        .byte   %10001111       ; 0CBB 2-97: *   ****\n        .byte   %10000111       ; 0CBC 2-97: *    ***\n        .byte   %10010011       ; 0CBD 2-97: *  *  **\n        .byte   %10011001       ; 0CBE 2-97: *  **  *\n        .byte   %11111111       ; 0CBF 2-97: ********\n\n        .byte   %10011111       ; 0CC0 2-98: *  *****\n        .byte   %10011111       ; 0CC1 2-98: *  *****\n        .byte   %10011111       ; 0CC2 2-98: *  *****\n        .byte   %10011111       ; 0CC3 2-98: *  *****\n        .byte   %10011111       ; 0CC4 2-98: *  *****\n        .byte   %10011111       ; 0CC5 2-98: *  *****\n        .byte   %10000001       ; 0CC6 2-98: *      *\n        .byte   %11111111       ; 0CC7 2-98: ********\n\n        .byte   %10011111       ; 0CC8 2-99: *  *****\n        .byte   %10011111       ; 0CC9 2-99: *  *****\n        .byte   %10011111       ; 0CCA 2-99: *  *****\n        .byte   %10011111       ; 0CCB 2-99: *  *****\n        .byte   %10011111       ; 0CCC 2-99: *  *****\n        .byte   %10011111       ; 0CCD 2-99: *  *****\n        .byte   %10000001       ; 0CCE 2-99: *      *\n        .byte   %11111111       ; 0CCF 2-99: ********\n\n        .byte   %10011100       ; 0CD0 2-9a: *  ***\n        .byte   %10001000       ; 0CD1 2-9a: *   *\n        .byte   %10000000       ; 0CD2 2-9a: *\n        .byte   %10010100       ; 0CD3 2-9a: *  * *\n        .byte   %10011100       ; 0CD4 2-9a: *  ***\n        .byte   %10011100       ; 0CD5 2-9a: *  ***\n        .byte   %10011100       ; 0CD6 2-9a: *  ***\n        .byte   %11111111       ; 0CD7 2-9a: ********\n\n        .byte   %10011100       ; 0CD8 2-9b: *  ***\n        .byte   %10001000       ; 0CD9 2-9b: *   *\n        .byte   %10000000       ; 0CDA 2-9b: *\n        .byte   %10010100       ; 0CDB 2-9b: *  * *\n        .byte   %10011100       ; 0CDC 2-9b: *  ***\n        .byte   %10011100       ; 0CDD 2-9b: *  ***\n        .byte   %10011100       ; 0CDE 2-9b: *  ***\n        .byte   %11111111       ; 0CDF 2-9b: ********\n\n        .byte   %10011001       ; 0CE0 2-9c: *  **  *\n        .byte   %10001001       ; 0CE1 2-9c: *   *  *\n        .byte   %10000001       ; 0CE2 2-9c: *      *\n        .byte   %10000001       ; 0CE3 2-9c: *      *\n        .byte   %10010001       ; 0CE4 2-9c: *  *   *\n        .byte   %10011001       ; 0CE5 2-9c: *  **  *\n        .byte   %10011001       ; 0CE6 2-9c: *  **  *\n        .byte   %11111111       ; 0CE7 2-9c: ********\n\n        .byte   %10011001       ; 0CE8 2-9d: *  **  *\n        .byte   %10001001       ; 0CE9 2-9d: *   *  *\n        .byte   %10000001       ; 0CEA 2-9d: *      *\n        .byte   %10000001       ; 0CEB 2-9d: *      *\n        .byte   %10010001       ; 0CEC 2-9d: *  *   *\n        .byte   %10011001       ; 0CED 2-9d: *  **  *\n        .byte   %10011001       ; 0CEE 2-9d: *  **  *\n        .byte   %11111111       ; 0CEF 2-9d: ********\n\n        .byte   %11000011       ; 0CF0 2-9e: **    **\n        .byte   %10011001       ; 0CF1 2-9e: *  **  *\n        .byte   %10011001       ; 0CF2 2-9e: *  **  *\n        .byte   %10011001       ; 0CF3 2-9e: *  **  *\n        .byte   %10011001       ; 0CF4 2-9e: *  **  *\n        .byte   %10011001       ; 0CF5 2-9e: *  **  *\n        .byte   %11000011       ; 0CF6 2-9e: **    **\n        .byte   %11111111       ; 0CF7 2-9e: ********\n\n        .byte   %11000011       ; 0CF8 2-9f: **    **\n        .byte   %10011001       ; 0CF9 2-9f: *  **  *\n        .byte   %10011001       ; 0CFA 2-9f: *  **  *\n        .byte   %10011001       ; 0CFB 2-9f: *  **  *\n        .byte   %10011001       ; 0CFC 2-9f: *  **  *\n        .byte   %10011001       ; 0CFD 2-9f: *  **  *\n        .byte   %11000011       ; 0CFE 2-9f: **    **\n        .byte   %11111111       ; 0CFF 2-9f: ********\n\n        .byte   %10000011       ; 0D00 2-a0: *     **\n        .byte   %10011001       ; 0D01 2-a0: *  **  *\n        .byte   %10011001       ; 0D02 2-a0: *  **  *\n        .byte   %10000011       ; 0D03 2-a0: *     **\n        .byte   %10011111       ; 0D04 2-a0: *  *****\n        .byte   %10011111       ; 0D05 2-a0: *  *****\n        .byte   %10011111       ; 0D06 2-a0: *  *****\n        .byte   %11111111       ; 0D07 2-a0: ********\n\n        .byte   %10000011       ; 0D08 2-a1: *     **\n        .byte   %10011001       ; 0D09 2-a1: *  **  *\n        .byte   %10011001       ; 0D0A 2-a1: *  **  *\n        .byte   %10000011       ; 0D0B 2-a1: *     **\n        .byte   %10011111       ; 0D0C 2-a1: *  *****\n        .byte   %10011111       ; 0D0D 2-a1: *  *****\n        .byte   %10011111       ; 0D0E 2-a1: *  *****\n        .byte   %11111111       ; 0D0F 2-a1: ********\n\n        .byte   %11000011       ; 0D10 2-a2: **    **\n        .byte   %10011001       ; 0D11 2-a2: *  **  *\n        .byte   %10011001       ; 0D12 2-a2: *  **  *\n        .byte   %10011001       ; 0D13 2-a2: *  **  *\n        .byte   %10011001       ; 0D14 2-a2: *  **  *\n        .byte   %11000011       ; 0D15 2-a2: **    **\n        .byte   %11110001       ; 0D16 2-a2: ****   *\n        .byte   %11111111       ; 0D17 2-a2: ********\n\n        .byte   %11000011       ; 0D18 2-a3: **    **\n        .byte   %10011001       ; 0D19 2-a3: *  **  *\n        .byte   %10011001       ; 0D1A 2-a3: *  **  *\n        .byte   %10011001       ; 0D1B 2-a3: *  **  *\n        .byte   %10011001       ; 0D1C 2-a3: *  **  *\n        .byte   %11000011       ; 0D1D 2-a3: **    **\n        .byte   %11110001       ; 0D1E 2-a3: ****   *\n        .byte   %11111111       ; 0D1F 2-a3: ********\n\n        .byte   %10000011       ; 0D20 2-a4: *     **\n        .byte   %10011001       ; 0D21 2-a4: *  **  *\n        .byte   %10011001       ; 0D22 2-a4: *  **  *\n        .byte   %10000011       ; 0D23 2-a4: *     **\n        .byte   %10000111       ; 0D24 2-a4: *    ***\n        .byte   %10010011       ; 0D25 2-a4: *  *  **\n        .byte   %10011001       ; 0D26 2-a4: *  **  *\n        .byte   %11111111       ; 0D27 2-a4: ********\n\n        .byte   %10000011       ; 0D28 2-a5: *     **\n        .byte   %10011001       ; 0D29 2-a5: *  **  *\n        .byte   %10011001       ; 0D2A 2-a5: *  **  *\n        .byte   %10000011       ; 0D2B 2-a5: *     **\n        .byte   %10000111       ; 0D2C 2-a5: *    ***\n        .byte   %10010011       ; 0D2D 2-a5: *  *  **\n        .byte   %10011001       ; 0D2E 2-a5: *  **  *\n        .byte   %11111111       ; 0D2F 2-a5: ********\n\n        .byte   %11000011       ; 0D30 2-a6: **    **\n        .byte   %10011001       ; 0D31 2-a6: *  **  *\n        .byte   %10011111       ; 0D32 2-a6: *  *****\n        .byte   %11000011       ; 0D33 2-a6: **    **\n        .byte   %11111001       ; 0D34 2-a6: *****  *\n        .byte   %10011001       ; 0D35 2-a6: *  **  *\n        .byte   %11000011       ; 0D36 2-a6: **    **\n        .byte   %11111111       ; 0D37 2-a6: ********\n\n        .byte   %11000011       ; 0D38 2-a7: **    **\n        .byte   %10011001       ; 0D39 2-a7: *  **  *\n        .byte   %10011111       ; 0D3A 2-a7: *  *****\n        .byte   %11000011       ; 0D3B 2-a7: **    **\n        .byte   %11111001       ; 0D3C 2-a7: *****  *\n        .byte   %10011001       ; 0D3D 2-a7: *  **  *\n        .byte   %11000011       ; 0D3E 2-a7: **    **\n        .byte   %11111111       ; 0D3F 2-a7: ********\n\n        .byte   %10000001       ; 0D40 2-a8: *      *\n        .byte   %11100111       ; 0D41 2-a8: ***  ***\n        .byte   %11100111       ; 0D42 2-a8: ***  ***\n        .byte   %11100111       ; 0D43 2-a8: ***  ***\n        .byte   %11100111       ; 0D44 2-a8: ***  ***\n        .byte   %11100111       ; 0D45 2-a8: ***  ***\n        .byte   %11100111       ; 0D46 2-a8: ***  ***\n        .byte   %11111111       ; 0D47 2-a8: ********\n\n        .byte   %10000001       ; 0D48 2-a9: *      *\n        .byte   %11100111       ; 0D49 2-a9: ***  ***\n        .byte   %11100111       ; 0D4A 2-a9: ***  ***\n        .byte   %11100111       ; 0D4B 2-a9: ***  ***\n        .byte   %11100111       ; 0D4C 2-a9: ***  ***\n        .byte   %11100111       ; 0D4D 2-a9: ***  ***\n        .byte   %11100111       ; 0D4E 2-a9: ***  ***\n        .byte   %11111111       ; 0D4F 2-a9: ********\n\n        .byte   %10011001       ; 0D50 2-aa: *  **  *\n        .byte   %10011001       ; 0D51 2-aa: *  **  *\n        .byte   %10011001       ; 0D52 2-aa: *  **  *\n        .byte   %10011001       ; 0D53 2-aa: *  **  *\n        .byte   %10011001       ; 0D54 2-aa: *  **  *\n        .byte   %10011001       ; 0D55 2-aa: *  **  *\n        .byte   %11000011       ; 0D56 2-aa: **    **\n        .byte   %11111111       ; 0D57 2-aa: ********\n\n        .byte   %10011001       ; 0D58 2-ab: *  **  *\n        .byte   %10011001       ; 0D59 2-ab: *  **  *\n        .byte   %10011001       ; 0D5A 2-ab: *  **  *\n        .byte   %10011001       ; 0D5B 2-ab: *  **  *\n        .byte   %10011001       ; 0D5C 2-ab: *  **  *\n        .byte   %10011001       ; 0D5D 2-ab: *  **  *\n        .byte   %11000011       ; 0D5E 2-ab: **    **\n        .byte   %11111111       ; 0D5F 2-ab: ********\n\n        .byte   %10011001       ; 0D60 2-ac: *  **  *\n        .byte   %10011001       ; 0D61 2-ac: *  **  *\n        .byte   %10011001       ; 0D62 2-ac: *  **  *\n        .byte   %10011001       ; 0D63 2-ac: *  **  *\n        .byte   %10011001       ; 0D64 2-ac: *  **  *\n        .byte   %11000011       ; 0D65 2-ac: **    **\n        .byte   %11100111       ; 0D66 2-ac: ***  ***\n        .byte   %11111111       ; 0D67 2-ac: ********\n\n        .byte   %10011001       ; 0D68 2-ad: *  **  *\n        .byte   %10011001       ; 0D69 2-ad: *  **  *\n        .byte   %10011001       ; 0D6A 2-ad: *  **  *\n        .byte   %10011001       ; 0D6B 2-ad: *  **  *\n        .byte   %10011001       ; 0D6C 2-ad: *  **  *\n        .byte   %11000011       ; 0D6D 2-ad: **    **\n        .byte   %11100111       ; 0D6E 2-ad: ***  ***\n        .byte   %11111111       ; 0D6F 2-ad: ********\n\n        .byte   %10011100       ; 0D70 2-ae: *  ***\n        .byte   %10011100       ; 0D71 2-ae: *  ***\n        .byte   %10011100       ; 0D72 2-ae: *  ***\n        .byte   %10010100       ; 0D73 2-ae: *  * *\n        .byte   %10000000       ; 0D74 2-ae: *\n        .byte   %10001000       ; 0D75 2-ae: *   *\n        .byte   %10011100       ; 0D76 2-ae: *  ***\n        .byte   %11111111       ; 0D77 2-ae: ********\n\n        .byte   %10011100       ; 0D78 2-af: *  ***\n        .byte   %10011100       ; 0D79 2-af: *  ***\n        .byte   %10011100       ; 0D7A 2-af: *  ***\n        .byte   %10010100       ; 0D7B 2-af: *  * *\n        .byte   %10000000       ; 0D7C 2-af: *\n        .byte   %10001000       ; 0D7D 2-af: *   *\n        .byte   %10011100       ; 0D7E 2-af: *  ***\n        .byte   %11111111       ; 0D7F 2-af: ********\n\n        .byte   %10011001       ; 0D80 2-b0: *  **  *\n        .byte   %10011001       ; 0D81 2-b0: *  **  *\n        .byte   %11000011       ; 0D82 2-b0: **    **\n        .byte   %11100111       ; 0D83 2-b0: ***  ***\n        .byte   %11000011       ; 0D84 2-b0: **    **\n        .byte   %10011001       ; 0D85 2-b0: *  **  *\n        .byte   %10011001       ; 0D86 2-b0: *  **  *\n        .byte   %11111111       ; 0D87 2-b0: ********\n\n        .byte   %10011001       ; 0D88 2-b1: *  **  *\n        .byte   %10011001       ; 0D89 2-b1: *  **  *\n        .byte   %11000011       ; 0D8A 2-b1: **    **\n        .byte   %11100111       ; 0D8B 2-b1: ***  ***\n        .byte   %11000011       ; 0D8C 2-b1: **    **\n        .byte   %10011001       ; 0D8D 2-b1: *  **  *\n        .byte   %10011001       ; 0D8E 2-b1: *  **  *\n        .byte   %11111111       ; 0D8F 2-b1: ********\n\n        .byte   %10011001       ; 0D90 2-b2: *  **  *\n        .byte   %10011001       ; 0D91 2-b2: *  **  *\n        .byte   %10011001       ; 0D92 2-b2: *  **  *\n        .byte   %11000011       ; 0D93 2-b2: **    **\n        .byte   %11100111       ; 0D94 2-b2: ***  ***\n        .byte   %11100111       ; 0D95 2-b2: ***  ***\n        .byte   %11100111       ; 0D96 2-b2: ***  ***\n        .byte   %11111111       ; 0D97 2-b2: ********\n\n        .byte   %10011001       ; 0D98 2-b3: *  **  *\n        .byte   %10011001       ; 0D99 2-b3: *  **  *\n        .byte   %10011001       ; 0D9A 2-b3: *  **  *\n        .byte   %11000011       ; 0D9B 2-b3: **    **\n        .byte   %11100111       ; 0D9C 2-b3: ***  ***\n        .byte   %11100111       ; 0D9D 2-b3: ***  ***\n        .byte   %11100111       ; 0D9E 2-b3: ***  ***\n        .byte   %11111111       ; 0D9F 2-b3: ********\n\n        .byte   %10000001       ; 0DA0 2-b4: *      *\n        .byte   %11111001       ; 0DA1 2-b4: *****  *\n        .byte   %11110011       ; 0DA2 2-b4: ****  **\n        .byte   %11100111       ; 0DA3 2-b4: ***  ***\n        .byte   %11001111       ; 0DA4 2-b4: **  ****\n        .byte   %10011111       ; 0DA5 2-b4: *  *****\n        .byte   %10000001       ; 0DA6 2-b4: *      *\n        .byte   %11111111       ; 0DA7 2-b4: ********\n\n        .byte   %10000001       ; 0DA8 2-b5: *      *\n        .byte   %11111001       ; 0DA9 2-b5: *****  *\n        .byte   %11110011       ; 0DAA 2-b5: ****  **\n        .byte   %11100111       ; 0DAB 2-b5: ***  ***\n        .byte   %11001111       ; 0DAC 2-b5: **  ****\n        .byte   %10011111       ; 0DAD 2-b5: *  *****\n        .byte   %10000001       ; 0DAE 2-b5: *      *\n        .byte   %11111111       ; 0DAF 2-b5: ********\n\n        .byte   %11000011       ; 0DB0 2-b6: **    **\n        .byte   %11001111       ; 0DB1 2-b6: **  ****\n        .byte   %11001111       ; 0DB2 2-b6: **  ****\n        .byte   %11001111       ; 0DB3 2-b6: **  ****\n        .byte   %11001111       ; 0DB4 2-b6: **  ****\n        .byte   %11001111       ; 0DB5 2-b6: **  ****\n        .byte   %11000011       ; 0DB6 2-b6: **    **\n        .byte   %11111111       ; 0DB7 2-b6: ********\n\n        .byte   %11000011       ; 0DB8 2-b7: **    **\n        .byte   %11001111       ; 0DB9 2-b7: **  ****\n        .byte   %11001111       ; 0DBA 2-b7: **  ****\n        .byte   %11001111       ; 0DBB 2-b7: **  ****\n        .byte   %11001111       ; 0DBC 2-b7: **  ****\n        .byte   %11001111       ; 0DBD 2-b7: **  ****\n        .byte   %11000011       ; 0DBE 2-b7: **    **\n        .byte   %11111111       ; 0DBF 2-b7: ********\n\n        .byte   %10011111       ; 0DC0 2-b8: *  *****\n        .byte   %11001111       ; 0DC1 2-b8: **  ****\n        .byte   %11100111       ; 0DC2 2-b8: ***  ***\n        .byte   %11110011       ; 0DC3 2-b8: ****  **\n        .byte   %11111001       ; 0DC4 2-b8: *****  *\n        .byte   %11111100       ; 0DC5 2-b8: ******\n        .byte   %11111111       ; 0DC6 2-b8: ********\n        .byte   %11111111       ; 0DC7 2-b8: ********\n\n        .byte   %10011111       ; 0DC8 2-b9: *  *****\n        .byte   %11001111       ; 0DC9 2-b9: **  ****\n        .byte   %11100111       ; 0DCA 2-b9: ***  ***\n        .byte   %11110011       ; 0DCB 2-b9: ****  **\n        .byte   %11111001       ; 0DCC 2-b9: *****  *\n        .byte   %11111100       ; 0DCD 2-b9: ******\n        .byte   %11111111       ; 0DCE 2-b9: ********\n        .byte   %11111111       ; 0DCF 2-b9: ********\n\n        .byte   %11000011       ; 0DD0 2-ba: **    **\n        .byte   %11110011       ; 0DD1 2-ba: ****  **\n        .byte   %11110011       ; 0DD2 2-ba: ****  **\n        .byte   %11110011       ; 0DD3 2-ba: ****  **\n        .byte   %11110011       ; 0DD4 2-ba: ****  **\n        .byte   %11110011       ; 0DD5 2-ba: ****  **\n        .byte   %11000011       ; 0DD6 2-ba: **    **\n        .byte   %11111111       ; 0DD7 2-ba: ********\n\n        .byte   %11000011       ; 0DD8 2-bb: **    **\n        .byte   %11110011       ; 0DD9 2-bb: ****  **\n        .byte   %11110011       ; 0DDA 2-bb: ****  **\n        .byte   %11110011       ; 0DDB 2-bb: ****  **\n        .byte   %11110011       ; 0DDC 2-bb: ****  **\n        .byte   %11110011       ; 0DDD 2-bb: ****  **\n        .byte   %11000011       ; 0DDE 2-bb: **    **\n        .byte   %11111111       ; 0DDF 2-bb: ********\n\n        .byte   %11111111       ; 0DE0 2-bc: ********\n        .byte   %11100111       ; 0DE1 2-bc: ***  ***\n        .byte   %11000011       ; 0DE2 2-bc: **    **\n        .byte   %10011001       ; 0DE3 2-bc: *  **  *\n        .byte   %11111111       ; 0DE4 2-bc: ********\n        .byte   %11111111       ; 0DE5 2-bc: ********\n        .byte   %11111111       ; 0DE6 2-bc: ********\n        .byte   %11111111       ; 0DE7 2-bc: ********\n\n        .byte   %11111111       ; 0DE8 2-bd: ********\n        .byte   %11100111       ; 0DE9 2-bd: ***  ***\n        .byte   %11000011       ; 0DEA 2-bd: **    **\n        .byte   %10011001       ; 0DEB 2-bd: *  **  *\n        .byte   %11111111       ; 0DEC 2-bd: ********\n        .byte   %11111111       ; 0DED 2-bd: ********\n        .byte   %11111111       ; 0DEE 2-bd: ********\n        .byte   %11111111       ; 0DEF 2-bd: ********\n\n        .byte   %11111111       ; 0DF0 2-be: ********\n        .byte   %11111111       ; 0DF1 2-be: ********\n        .byte   %11111111       ; 0DF2 2-be: ********\n        .byte   %11111111       ; 0DF3 2-be: ********\n        .byte   %11111111       ; 0DF4 2-be: ********\n        .byte   %11111111       ; 0DF5 2-be: ********\n        .byte   %10000000       ; 0DF6 2-be: *\n        .byte   %11111111       ; 0DF7 2-be: ********\n\n        .byte   %11111111       ; 0DF8 2-bf: ********\n        .byte   %11111111       ; 0DF9 2-bf: ********\n        .byte   %11111111       ; 0DFA 2-bf: ********\n        .byte   %11111111       ; 0DFB 2-bf: ********\n        .byte   %11111111       ; 0DFC 2-bf: ********\n        .byte   %11111111       ; 0DFD 2-bf: ********\n        .byte   %10000000       ; 0DFE 2-bf: *\n        .byte   %11111111       ; 0DFF 2-bf: ********\n\n        .byte   %11100111       ; 0E00 2-c0: ***  ***\n        .byte   %11100111       ; 0E01 2-c0: ***  ***\n        .byte   %11100111       ; 0E02 2-c0: ***  ***\n        .byte   %11111111       ; 0E03 2-c0: ********\n        .byte   %11111111       ; 0E04 2-c0: ********\n        .byte   %11111111       ; 0E05 2-c0: ********\n        .byte   %11111111       ; 0E06 2-c0: ********\n        .byte   %11111111       ; 0E07 2-c0: ********\n\n        .byte   %11100111       ; 0E08 2-c1: ***  ***\n        .byte   %11100111       ; 0E09 2-c1: ***  ***\n        .byte   %11100111       ; 0E0A 2-c1: ***  ***\n        .byte   %11111111       ; 0E0B 2-c1: ********\n        .byte   %11111111       ; 0E0C 2-c1: ********\n        .byte   %11111111       ; 0E0D 2-c1: ********\n        .byte   %11111111       ; 0E0E 2-c1: ********\n        .byte   %11111111       ; 0E0F 2-c1: ********\n\n        .byte   %11111111       ; 0E10 2-c2: ********\n        .byte   %11111111       ; 0E11 2-c2: ********\n        .byte   %11000011       ; 0E12 2-c2: **    **\n        .byte   %11111001       ; 0E13 2-c2: *****  *\n        .byte   %11000001       ; 0E14 2-c2: **     *\n        .byte   %10011001       ; 0E15 2-c2: *  **  *\n        .byte   %11000001       ; 0E16 2-c2: **     *\n        .byte   %11111111       ; 0E17 2-c2: ********\n\n        .byte   %11111111       ; 0E18 2-c3: ********\n        .byte   %11111111       ; 0E19 2-c3: ********\n        .byte   %11000011       ; 0E1A 2-c3: **    **\n        .byte   %11111001       ; 0E1B 2-c3: *****  *\n        .byte   %11000001       ; 0E1C 2-c3: **     *\n        .byte   %10011001       ; 0E1D 2-c3: *  **  *\n        .byte   %11000001       ; 0E1E 2-c3: **     *\n        .byte   %11111111       ; 0E1F 2-c3: ********\n\n        .byte   %11111111       ; 0E20 2-c4: ********\n        .byte   %10011111       ; 0E21 2-c4: *  *****\n        .byte   %10011111       ; 0E22 2-c4: *  *****\n        .byte   %10000011       ; 0E23 2-c4: *     **\n        .byte   %10011001       ; 0E24 2-c4: *  **  *\n        .byte   %10011001       ; 0E25 2-c4: *  **  *\n        .byte   %10000011       ; 0E26 2-c4: *     **\n        .byte   %11111111       ; 0E27 2-c4: ********\n\n        .byte   %11111111       ; 0E28 2-c5: ********\n        .byte   %10011111       ; 0E29 2-c5: *  *****\n        .byte   %10011111       ; 0E2A 2-c5: *  *****\n        .byte   %10000011       ; 0E2B 2-c5: *     **\n        .byte   %10011001       ; 0E2C 2-c5: *  **  *\n        .byte   %10011001       ; 0E2D 2-c5: *  **  *\n        .byte   %10000011       ; 0E2E 2-c5: *     **\n        .byte   %11111111       ; 0E2F 2-c5: ********\n\n        .byte   %11111111       ; 0E30 2-c6: ********\n        .byte   %11111111       ; 0E31 2-c6: ********\n        .byte   %11000011       ; 0E32 2-c6: **    **\n        .byte   %10011111       ; 0E33 2-c6: *  *****\n        .byte   %10011111       ; 0E34 2-c6: *  *****\n        .byte   %10011111       ; 0E35 2-c6: *  *****\n        .byte   %11000011       ; 0E36 2-c6: **    **\n        .byte   %11111111       ; 0E37 2-c6: ********\n\n        .byte   %11111111       ; 0E38 2-c7: ********\n        .byte   %11111111       ; 0E39 2-c7: ********\n        .byte   %11000011       ; 0E3A 2-c7: **    **\n        .byte   %10011111       ; 0E3B 2-c7: *  *****\n        .byte   %10011111       ; 0E3C 2-c7: *  *****\n        .byte   %10011111       ; 0E3D 2-c7: *  *****\n        .byte   %11000011       ; 0E3E 2-c7: **    **\n        .byte   %11111111       ; 0E3F 2-c7: ********\n\n        .byte   %11111111       ; 0E40 2-c8: ********\n        .byte   %11111001       ; 0E41 2-c8: *****  *\n        .byte   %11111001       ; 0E42 2-c8: *****  *\n        .byte   %11000001       ; 0E43 2-c8: **     *\n        .byte   %10011001       ; 0E44 2-c8: *  **  *\n        .byte   %10011001       ; 0E45 2-c8: *  **  *\n        .byte   %11000001       ; 0E46 2-c8: **     *\n        .byte   %11111111       ; 0E47 2-c8: ********\n\n        .byte   %11111111       ; 0E48 2-c9: ********\n        .byte   %11111001       ; 0E49 2-c9: *****  *\n        .byte   %11111001       ; 0E4A 2-c9: *****  *\n        .byte   %11000001       ; 0E4B 2-c9: **     *\n        .byte   %10011001       ; 0E4C 2-c9: *  **  *\n        .byte   %10011001       ; 0E4D 2-c9: *  **  *\n        .byte   %11000001       ; 0E4E 2-c9: **     *\n        .byte   %11111111       ; 0E4F 2-c9: ********\n\n        .byte   %11111111       ; 0E50 2-ca: ********\n        .byte   %11111111       ; 0E51 2-ca: ********\n        .byte   %11000011       ; 0E52 2-ca: **    **\n        .byte   %10011001       ; 0E53 2-ca: *  **  *\n        .byte   %10000001       ; 0E54 2-ca: *      *\n        .byte   %10011111       ; 0E55 2-ca: *  *****\n        .byte   %11000011       ; 0E56 2-ca: **    **\n        .byte   %11111111       ; 0E57 2-ca: ********\n\n        .byte   %11111111       ; 0E58 2-cb: ********\n        .byte   %11111111       ; 0E59 2-cb: ********\n        .byte   %11000011       ; 0E5A 2-cb: **    **\n        .byte   %10011001       ; 0E5B 2-cb: *  **  *\n        .byte   %10000001       ; 0E5C 2-cb: *      *\n        .byte   %10011111       ; 0E5D 2-cb: *  *****\n        .byte   %11000011       ; 0E5E 2-cb: **    **\n        .byte   %11111111       ; 0E5F 2-cb: ********\n\n        .byte   %11111111       ; 0E60 2-cc: ********\n        .byte   %11110001       ; 0E61 2-cc: ****   *\n        .byte   %11100111       ; 0E62 2-cc: ***  ***\n        .byte   %11000001       ; 0E63 2-cc: **     *\n        .byte   %11100111       ; 0E64 2-cc: ***  ***\n        .byte   %11100111       ; 0E65 2-cc: ***  ***\n        .byte   %11100111       ; 0E66 2-cc: ***  ***\n        .byte   %11111111       ; 0E67 2-cc: ********\n\n        .byte   %11111111       ; 0E68 2-cd: ********\n        .byte   %11110001       ; 0E69 2-cd: ****   *\n        .byte   %11100111       ; 0E6A 2-cd: ***  ***\n        .byte   %11000001       ; 0E6B 2-cd: **     *\n        .byte   %11100111       ; 0E6C 2-cd: ***  ***\n        .byte   %11100111       ; 0E6D 2-cd: ***  ***\n        .byte   %11100111       ; 0E6E 2-cd: ***  ***\n        .byte   %11111111       ; 0E6F 2-cd: ********\n\n        .byte   %11111111       ; 0E70 2-ce: ********\n        .byte   %11111111       ; 0E71 2-ce: ********\n        .byte   %11000001       ; 0E72 2-ce: **     *\n        .byte   %10011001       ; 0E73 2-ce: *  **  *\n        .byte   %10011001       ; 0E74 2-ce: *  **  *\n        .byte   %11000001       ; 0E75 2-ce: **     *\n        .byte   %11111001       ; 0E76 2-ce: *****  *\n        .byte   %10000011       ; 0E77 2-ce: *     **\n\n        .byte   %11111111       ; 0E78 2-cf: ********\n        .byte   %11111111       ; 0E79 2-cf: ********\n        .byte   %11000001       ; 0E7A 2-cf: **     *\n        .byte   %10011001       ; 0E7B 2-cf: *  **  *\n        .byte   %10011001       ; 0E7C 2-cf: *  **  *\n        .byte   %11000001       ; 0E7D 2-cf: **     *\n        .byte   %11111001       ; 0E7E 2-cf: *****  *\n        .byte   %10000011       ; 0E7F 2-cf: *     **\n\n        .byte   %11111111       ; 0E80 2-d0: ********\n        .byte   %10011111       ; 0E81 2-d0: *  *****\n        .byte   %10011111       ; 0E82 2-d0: *  *****\n        .byte   %10000011       ; 0E83 2-d0: *     **\n        .byte   %10011001       ; 0E84 2-d0: *  **  *\n        .byte   %10011001       ; 0E85 2-d0: *  **  *\n        .byte   %10011001       ; 0E86 2-d0: *  **  *\n        .byte   %11111111       ; 0E87 2-d0: ********\n\n        .byte   %11111111       ; 0E88 2-d1: ********\n        .byte   %10011111       ; 0E89 2-d1: *  *****\n        .byte   %10011111       ; 0E8A 2-d1: *  *****\n        .byte   %10000011       ; 0E8B 2-d1: *     **\n        .byte   %10011001       ; 0E8C 2-d1: *  **  *\n        .byte   %10011001       ; 0E8D 2-d1: *  **  *\n        .byte   %10011001       ; 0E8E 2-d1: *  **  *\n        .byte   %11111111       ; 0E8F 2-d1: ********\n\n        .byte   %11111111       ; 0E90 2-d2: ********\n        .byte   %11100111       ; 0E91 2-d2: ***  ***\n        .byte   %11111111       ; 0E92 2-d2: ********\n        .byte   %11000111       ; 0E93 2-d2: **   ***\n        .byte   %11100111       ; 0E94 2-d2: ***  ***\n        .byte   %11100111       ; 0E95 2-d2: ***  ***\n        .byte   %11000011       ; 0E96 2-d2: **    **\n        .byte   %11111111       ; 0E97 2-d2: ********\n\n        .byte   %11111111       ; 0E98 2-d3: ********\n        .byte   %11100111       ; 0E99 2-d3: ***  ***\n        .byte   %11111111       ; 0E9A 2-d3: ********\n        .byte   %11000111       ; 0E9B 2-d3: **   ***\n        .byte   %11100111       ; 0E9C 2-d3: ***  ***\n        .byte   %11100111       ; 0E9D 2-d3: ***  ***\n        .byte   %11000011       ; 0E9E 2-d3: **    **\n        .byte   %11111111       ; 0E9F 2-d3: ********\n\n        .byte   %11111111       ; 0EA0 2-d4: ********\n        .byte   %11111001       ; 0EA1 2-d4: *****  *\n        .byte   %11111111       ; 0EA2 2-d4: ********\n        .byte   %11111001       ; 0EA3 2-d4: *****  *\n        .byte   %11111001       ; 0EA4 2-d4: *****  *\n        .byte   %11111001       ; 0EA5 2-d4: *****  *\n        .byte   %11111001       ; 0EA6 2-d4: *****  *\n        .byte   %11000011       ; 0EA7 2-d4: **    **\n\n        .byte   %11111111       ; 0EA8 2-d5: ********\n        .byte   %11111001       ; 0EA9 2-d5: *****  *\n        .byte   %11111111       ; 0EAA 2-d5: ********\n        .byte   %11111001       ; 0EAB 2-d5: *****  *\n        .byte   %11111001       ; 0EAC 2-d5: *****  *\n        .byte   %11111001       ; 0EAD 2-d5: *****  *\n        .byte   %11111001       ; 0EAE 2-d5: *****  *\n        .byte   %11000011       ; 0EAF 2-d5: **    **\n\n        .byte   %11111111       ; 0EB0 2-d6: ********\n        .byte   %10011111       ; 0EB1 2-d6: *  *****\n        .byte   %10011111       ; 0EB2 2-d6: *  *****\n        .byte   %10010011       ; 0EB3 2-d6: *  *  **\n        .byte   %10000111       ; 0EB4 2-d6: *    ***\n        .byte   %10010011       ; 0EB5 2-d6: *  *  **\n        .byte   %10011001       ; 0EB6 2-d6: *  **  *\n        .byte   %11111111       ; 0EB7 2-d6: ********\n\n        .byte   %11111111       ; 0EB8 2-d7: ********\n        .byte   %10011111       ; 0EB9 2-d7: *  *****\n        .byte   %10011111       ; 0EBA 2-d7: *  *****\n        .byte   %10010011       ; 0EBB 2-d7: *  *  **\n        .byte   %10000111       ; 0EBC 2-d7: *    ***\n        .byte   %10010011       ; 0EBD 2-d7: *  *  **\n        .byte   %10011001       ; 0EBE 2-d7: *  **  *\n        .byte   %11111111       ; 0EBF 2-d7: ********\n\n        .byte   %11111111       ; 0EC0 2-d8: ********\n        .byte   %11000111       ; 0EC1 2-d8: **   ***\n        .byte   %11100111       ; 0EC2 2-d8: ***  ***\n        .byte   %11100111       ; 0EC3 2-d8: ***  ***\n        .byte   %11100111       ; 0EC4 2-d8: ***  ***\n        .byte   %11100111       ; 0EC5 2-d8: ***  ***\n        .byte   %11000011       ; 0EC6 2-d8: **    **\n        .byte   %11111111       ; 0EC7 2-d8: ********\n\n        .byte   %11111111       ; 0EC8 2-d9: ********\n        .byte   %11000111       ; 0EC9 2-d9: **   ***\n        .byte   %11100111       ; 0ECA 2-d9: ***  ***\n        .byte   %11100111       ; 0ECB 2-d9: ***  ***\n        .byte   %11100111       ; 0ECC 2-d9: ***  ***\n        .byte   %11100111       ; 0ECD 2-d9: ***  ***\n        .byte   %11000011       ; 0ECE 2-d9: **    **\n        .byte   %11111111       ; 0ECF 2-d9: ********\n\n        .byte   %11111111       ; 0ED0 2-da: ********\n        .byte   %11111111       ; 0ED1 2-da: ********\n        .byte   %10011001       ; 0ED2 2-da: *  **  *\n        .byte   %10000000       ; 0ED3 2-da: *\n        .byte   %10000000       ; 0ED4 2-da: *\n        .byte   %10010100       ; 0ED5 2-da: *  * *\n        .byte   %10011100       ; 0ED6 2-da: *  ***\n        .byte   %11111111       ; 0ED7 2-da: ********\n\n        .byte   %11111111       ; 0ED8 2-db: ********\n        .byte   %11111111       ; 0ED9 2-db: ********\n        .byte   %10011001       ; 0EDA 2-db: *  **  *\n        .byte   %10000000       ; 0EDB 2-db: *\n        .byte   %10000000       ; 0EDC 2-db: *\n        .byte   %10010100       ; 0EDD 2-db: *  * *\n        .byte   %10011100       ; 0EDE 2-db: *  ***\n        .byte   %11111111       ; 0EDF 2-db: ********\n\n        .byte   %11111111       ; 0EE0 2-dc: ********\n        .byte   %11111111       ; 0EE1 2-dc: ********\n        .byte   %10000011       ; 0EE2 2-dc: *     **\n        .byte   %10011001       ; 0EE3 2-dc: *  **  *\n        .byte   %10011001       ; 0EE4 2-dc: *  **  *\n        .byte   %10011001       ; 0EE5 2-dc: *  **  *\n        .byte   %10011001       ; 0EE6 2-dc: *  **  *\n        .byte   %11111111       ; 0EE7 2-dc: ********\n\n        .byte   %11111111       ; 0EE8 2-dd: ********\n        .byte   %11111111       ; 0EE9 2-dd: ********\n        .byte   %10000011       ; 0EEA 2-dd: *     **\n        .byte   %10011001       ; 0EEB 2-dd: *  **  *\n        .byte   %10011001       ; 0EEC 2-dd: *  **  *\n        .byte   %10011001       ; 0EED 2-dd: *  **  *\n        .byte   %10011001       ; 0EEE 2-dd: *  **  *\n        .byte   %11111111       ; 0EEF 2-dd: ********\n\n        .byte   %11111111       ; 0EF0 2-de: ********\n        .byte   %11111111       ; 0EF1 2-de: ********\n        .byte   %11000011       ; 0EF2 2-de: **    **\n        .byte   %10011001       ; 0EF3 2-de: *  **  *\n        .byte   %10011001       ; 0EF4 2-de: *  **  *\n        .byte   %10011001       ; 0EF5 2-de: *  **  *\n        .byte   %11000011       ; 0EF6 2-de: **    **\n        .byte   %11111111       ; 0EF7 2-de: ********\n\n        .byte   %11111111       ; 0EF8 2-df: ********\n        .byte   %11111111       ; 0EF9 2-df: ********\n        .byte   %11000011       ; 0EFA 2-df: **    **\n        .byte   %10011001       ; 0EFB 2-df: *  **  *\n        .byte   %10011001       ; 0EFC 2-df: *  **  *\n        .byte   %10011001       ; 0EFD 2-df: *  **  *\n        .byte   %11000011       ; 0EFE 2-df: **    **\n        .byte   %11111111       ; 0EFF 2-df: ********\n\n        .byte   %11111111       ; 0F00 2-e0: ********\n        .byte   %11111111       ; 0F01 2-e0: ********\n        .byte   %10000011       ; 0F02 2-e0: *     **\n        .byte   %10011001       ; 0F03 2-e0: *  **  *\n        .byte   %10011001       ; 0F04 2-e0: *  **  *\n        .byte   %10000011       ; 0F05 2-e0: *     **\n        .byte   %10011111       ; 0F06 2-e0: *  *****\n        .byte   %10011111       ; 0F07 2-e0: *  *****\n\n        .byte   %11111111       ; 0F08 2-e1: ********\n        .byte   %11111111       ; 0F09 2-e1: ********\n        .byte   %10000011       ; 0F0A 2-e1: *     **\n        .byte   %10011001       ; 0F0B 2-e1: *  **  *\n        .byte   %10011001       ; 0F0C 2-e1: *  **  *\n        .byte   %10000011       ; 0F0D 2-e1: *     **\n        .byte   %10011111       ; 0F0E 2-e1: *  *****\n        .byte   %10011111       ; 0F0F 2-e1: *  *****\n\n        .byte   %11111111       ; 0F10 2-e2: ********\n        .byte   %11111111       ; 0F11 2-e2: ********\n        .byte   %11000001       ; 0F12 2-e2: **     *\n        .byte   %10011001       ; 0F13 2-e2: *  **  *\n        .byte   %10011001       ; 0F14 2-e2: *  **  *\n        .byte   %11000001       ; 0F15 2-e2: **     *\n        .byte   %11111001       ; 0F16 2-e2: *****  *\n        .byte   %11111001       ; 0F17 2-e2: *****  *\n\n        .byte   %11111111       ; 0F18 2-e3: ********\n        .byte   %11111111       ; 0F19 2-e3: ********\n        .byte   %11000001       ; 0F1A 2-e3: **     *\n        .byte   %10011001       ; 0F1B 2-e3: *  **  *\n        .byte   %10011001       ; 0F1C 2-e3: *  **  *\n        .byte   %11000001       ; 0F1D 2-e3: **     *\n        .byte   %11111001       ; 0F1E 2-e3: *****  *\n        .byte   %11111001       ; 0F1F 2-e3: *****  *\n\n        .byte   %11111111       ; 0F20 2-e4: ********\n        .byte   %11111111       ; 0F21 2-e4: ********\n        .byte   %10000011       ; 0F22 2-e4: *     **\n        .byte   %10011001       ; 0F23 2-e4: *  **  *\n        .byte   %10011111       ; 0F24 2-e4: *  *****\n        .byte   %10011111       ; 0F25 2-e4: *  *****\n        .byte   %10011111       ; 0F26 2-e4: *  *****\n        .byte   %11111111       ; 0F27 2-e4: ********\n\n        .byte   %11111111       ; 0F28 2-e5: ********\n        .byte   %11111111       ; 0F29 2-e5: ********\n        .byte   %10000011       ; 0F2A 2-e5: *     **\n        .byte   %10011001       ; 0F2B 2-e5: *  **  *\n        .byte   %10011111       ; 0F2C 2-e5: *  *****\n        .byte   %10011111       ; 0F2D 2-e5: *  *****\n        .byte   %10011111       ; 0F2E 2-e5: *  *****\n        .byte   %11111111       ; 0F2F 2-e5: ********\n\n        .byte   %11111111       ; 0F30 2-e6: ********\n        .byte   %11111111       ; 0F31 2-e6: ********\n        .byte   %11000001       ; 0F32 2-e6: **     *\n        .byte   %10011111       ; 0F33 2-e6: *  *****\n        .byte   %11000011       ; 0F34 2-e6: **    **\n        .byte   %11111001       ; 0F35 2-e6: *****  *\n        .byte   %10000011       ; 0F36 2-e6: *     **\n        .byte   %11111111       ; 0F37 2-e6: ********\n\n        .byte   %11111111       ; 0F38 2-e7: ********\n        .byte   %11111111       ; 0F39 2-e7: ********\n        .byte   %11000001       ; 0F3A 2-e7: **     *\n        .byte   %10011111       ; 0F3B 2-e7: *  *****\n        .byte   %11000011       ; 0F3C 2-e7: **    **\n        .byte   %11111001       ; 0F3D 2-e7: *****  *\n        .byte   %10000011       ; 0F3E 2-e7: *     **\n        .byte   %11111111       ; 0F3F 2-e7: ********\n\n        .byte   %11111111       ; 0F40 2-e8: ********\n        .byte   %11100111       ; 0F41 2-e8: ***  ***\n        .byte   %10000001       ; 0F42 2-e8: *      *\n        .byte   %11100111       ; 0F43 2-e8: ***  ***\n        .byte   %11100111       ; 0F44 2-e8: ***  ***\n        .byte   %11100111       ; 0F45 2-e8: ***  ***\n        .byte   %11110001       ; 0F46 2-e8: ****   *\n        .byte   %11111111       ; 0F47 2-e8: ********\n\n        .byte   %11111111       ; 0F48 2-e9: ********\n        .byte   %11100111       ; 0F49 2-e9: ***  ***\n        .byte   %10000001       ; 0F4A 2-e9: *      *\n        .byte   %11100111       ; 0F4B 2-e9: ***  ***\n        .byte   %11100111       ; 0F4C 2-e9: ***  ***\n        .byte   %11100111       ; 0F4D 2-e9: ***  ***\n        .byte   %11110001       ; 0F4E 2-e9: ****   *\n        .byte   %11111111       ; 0F4F 2-e9: ********\n\n        .byte   %11111111       ; 0F50 2-ea: ********\n        .byte   %11111111       ; 0F51 2-ea: ********\n        .byte   %10011001       ; 0F52 2-ea: *  **  *\n        .byte   %10011001       ; 0F53 2-ea: *  **  *\n        .byte   %10011001       ; 0F54 2-ea: *  **  *\n        .byte   %10011001       ; 0F55 2-ea: *  **  *\n        .byte   %11000001       ; 0F56 2-ea: **     *\n        .byte   %11111111       ; 0F57 2-ea: ********\n\n        .byte   %11111111       ; 0F58 2-eb: ********\n        .byte   %11111111       ; 0F59 2-eb: ********\n        .byte   %10011001       ; 0F5A 2-eb: *  **  *\n        .byte   %10011001       ; 0F5B 2-eb: *  **  *\n        .byte   %10011001       ; 0F5C 2-eb: *  **  *\n        .byte   %10011001       ; 0F5D 2-eb: *  **  *\n        .byte   %11000001       ; 0F5E 2-eb: **     *\n        .byte   %11111111       ; 0F5F 2-eb: ********\n\n        .byte   %11111111       ; 0F60 2-ec: ********\n        .byte   %11111111       ; 0F61 2-ec: ********\n        .byte   %10011001       ; 0F62 2-ec: *  **  *\n        .byte   %10011001       ; 0F63 2-ec: *  **  *\n        .byte   %10011001       ; 0F64 2-ec: *  **  *\n        .byte   %11000011       ; 0F65 2-ec: **    **\n        .byte   %11100111       ; 0F66 2-ec: ***  ***\n        .byte   %11111111       ; 0F67 2-ec: ********\n\n        .byte   %11111111       ; 0F68 2-ed: ********\n        .byte   %11111111       ; 0F69 2-ed: ********\n        .byte   %10011001       ; 0F6A 2-ed: *  **  *\n        .byte   %10011001       ; 0F6B 2-ed: *  **  *\n        .byte   %10011001       ; 0F6C 2-ed: *  **  *\n        .byte   %11000011       ; 0F6D 2-ed: **    **\n        .byte   %11100111       ; 0F6E 2-ed: ***  ***\n        .byte   %11111111       ; 0F6F 2-ed: ********\n\n        .byte   %11111111       ; 0F70 2-ee: ********\n        .byte   %11111111       ; 0F71 2-ee: ********\n        .byte   %10011100       ; 0F72 2-ee: *  ***\n        .byte   %10010100       ; 0F73 2-ee: *  * *\n        .byte   %10000000       ; 0F74 2-ee: *\n        .byte   %11000001       ; 0F75 2-ee: **     *\n        .byte   %11001001       ; 0F76 2-ee: **  *  *\n        .byte   %11111111       ; 0F77 2-ee: ********\n\n        .byte   %11111111       ; 0F78 2-ef: ********\n        .byte   %11111111       ; 0F79 2-ef: ********\n        .byte   %10011100       ; 0F7A 2-ef: *  ***\n        .byte   %10010100       ; 0F7B 2-ef: *  * *\n        .byte   %10000000       ; 0F7C 2-ef: *\n        .byte   %11000001       ; 0F7D 2-ef: **     *\n        .byte   %11001001       ; 0F7E 2-ef: **  *  *\n        .byte   %11111111       ; 0F7F 2-ef: ********\n\n        .byte   %11111111       ; 0F80 2-f0: ********\n        .byte   %11111111       ; 0F81 2-f0: ********\n        .byte   %10011001       ; 0F82 2-f0: *  **  *\n        .byte   %11000011       ; 0F83 2-f0: **    **\n        .byte   %11100111       ; 0F84 2-f0: ***  ***\n        .byte   %11000011       ; 0F85 2-f0: **    **\n        .byte   %10011001       ; 0F86 2-f0: *  **  *\n        .byte   %11111111       ; 0F87 2-f0: ********\n\n        .byte   %11111111       ; 0F88 2-f1: ********\n        .byte   %11111111       ; 0F89 2-f1: ********\n        .byte   %10011001       ; 0F8A 2-f1: *  **  *\n        .byte   %11000011       ; 0F8B 2-f1: **    **\n        .byte   %11100111       ; 0F8C 2-f1: ***  ***\n        .byte   %11000011       ; 0F8D 2-f1: **    **\n        .byte   %10011001       ; 0F8E 2-f1: *  **  *\n        .byte   %11111111       ; 0F8F 2-f1: ********\n\n        .byte   %11111111       ; 0F90 2-f2: ********\n        .byte   %11111111       ; 0F91 2-f2: ********\n        .byte   %10011001       ; 0F92 2-f2: *  **  *\n        .byte   %10011001       ; 0F93 2-f2: *  **  *\n        .byte   %10011001       ; 0F94 2-f2: *  **  *\n        .byte   %11000001       ; 0F95 2-f2: **     *\n        .byte   %11110011       ; 0F96 2-f2: ****  **\n        .byte   %10000111       ; 0F97 2-f2: *    ***\n\n        .byte   %11111111       ; 0F98 2-f3: ********\n        .byte   %11111111       ; 0F99 2-f3: ********\n        .byte   %10011001       ; 0F9A 2-f3: *  **  *\n        .byte   %10011001       ; 0F9B 2-f3: *  **  *\n        .byte   %10011001       ; 0F9C 2-f3: *  **  *\n        .byte   %11000001       ; 0F9D 2-f3: **     *\n        .byte   %11110011       ; 0F9E 2-f3: ****  **\n        .byte   %10000111       ; 0F9F 2-f3: *    ***\n\n        .byte   %11111111       ; 0FA0 2-f4: ********\n        .byte   %11111111       ; 0FA1 2-f4: ********\n        .byte   %10000001       ; 0FA2 2-f4: *      *\n        .byte   %11110011       ; 0FA3 2-f4: ****  **\n        .byte   %11100111       ; 0FA4 2-f4: ***  ***\n        .byte   %11001111       ; 0FA5 2-f4: **  ****\n        .byte   %10000001       ; 0FA6 2-f4: *      *\n        .byte   %11111111       ; 0FA7 2-f4: ********\n\n        .byte   %11111111       ; 0FA8 2-f5: ********\n        .byte   %11111111       ; 0FA9 2-f5: ********\n        .byte   %10000001       ; 0FAA 2-f5: *      *\n        .byte   %11110011       ; 0FAB 2-f5: ****  **\n        .byte   %11100111       ; 0FAC 2-f5: ***  ***\n        .byte   %11001111       ; 0FAD 2-f5: **  ****\n        .byte   %10000001       ; 0FAE 2-f5: *      *\n        .byte   %11111111       ; 0FAF 2-f5: ********\n\n        .byte   %11100011       ; 0FB0 2-f6: ***   **\n        .byte   %11001111       ; 0FB1 2-f6: **  ****\n        .byte   %11100111       ; 0FB2 2-f6: ***  ***\n        .byte   %10001111       ; 0FB3 2-f6: *   ****\n        .byte   %11100111       ; 0FB4 2-f6: ***  ***\n        .byte   %11001111       ; 0FB5 2-f6: **  ****\n        .byte   %11100011       ; 0FB6 2-f6: ***   **\n        .byte   %11111111       ; 0FB7 2-f6: ********\n\n        .byte   %11100011       ; 0FB8 2-f7: ***   **\n        .byte   %11001111       ; 0FB9 2-f7: **  ****\n        .byte   %11100111       ; 0FBA 2-f7: ***  ***\n        .byte   %10001111       ; 0FBB 2-f7: *   ****\n        .byte   %11100111       ; 0FBC 2-f7: ***  ***\n        .byte   %11001111       ; 0FBD 2-f7: **  ****\n        .byte   %11100011       ; 0FBE 2-f7: ***   **\n        .byte   %11111111       ; 0FBF 2-f7: ********\n\n        .byte   %11100111       ; 0FC0 2-f8: ***  ***\n        .byte   %11100111       ; 0FC1 2-f8: ***  ***\n        .byte   %11100111       ; 0FC2 2-f8: ***  ***\n        .byte   %11111111       ; 0FC3 2-f8: ********\n        .byte   %11111111       ; 0FC4 2-f8: ********\n        .byte   %11100111       ; 0FC5 2-f8: ***  ***\n        .byte   %11100111       ; 0FC6 2-f8: ***  ***\n        .byte   %11100111       ; 0FC7 2-f8: ***  ***\n\n        .byte   %11100111       ; 0FC8 2-f9: ***  ***\n        .byte   %11100111       ; 0FC9 2-f9: ***  ***\n        .byte   %11100111       ; 0FCA 2-f9: ***  ***\n        .byte   %11111111       ; 0FCB 2-f9: ********\n        .byte   %11111111       ; 0FCC 2-f9: ********\n        .byte   %11100111       ; 0FCD 2-f9: ***  ***\n        .byte   %11100111       ; 0FCE 2-f9: ***  ***\n        .byte   %11100111       ; 0FCF 2-f9: ***  ***\n\n        .byte   %11000111       ; 0FD0 2-fa: **   ***\n        .byte   %11110011       ; 0FD1 2-fa: ****  **\n        .byte   %11100111       ; 0FD2 2-fa: ***  ***\n        .byte   %11110001       ; 0FD3 2-fa: ****   *\n        .byte   %11100111       ; 0FD4 2-fa: ***  ***\n        .byte   %11110011       ; 0FD5 2-fa: ****  **\n        .byte   %11000111       ; 0FD6 2-fa: **   ***\n        .byte   %11111111       ; 0FD7 2-fa: ********\n\n        .byte   %11000111       ; 0FD8 2-fb: **   ***\n        .byte   %11110011       ; 0FD9 2-fb: ****  **\n        .byte   %11100111       ; 0FDA 2-fb: ***  ***\n        .byte   %11110001       ; 0FDB 2-fb: ****   *\n        .byte   %11100111       ; 0FDC 2-fb: ***  ***\n        .byte   %11110011       ; 0FDD 2-fb: ****  **\n        .byte   %11000111       ; 0FDE 2-fb: **   ***\n        .byte   %11111111       ; 0FDF 2-fb: ********\n\n        .byte   %11001100       ; 0FE0 2-fc: **  **\n        .byte   %00000000       ; 0FE1 2-fc:\n        .byte   %00110011       ; 0FE2 2-fc:   **  **\n        .byte   %11111111       ; 0FE3 2-fc: ********\n        .byte   %11111111       ; 0FE4 2-fc: ********\n        .byte   %11111111       ; 0FE5 2-fc: ********\n        .byte   %11111111       ; 0FE6 2-fc: ********\n        .byte   %11111111       ; 0FE7 2-fc: ********\n\n        .byte   %11001100       ; 0FE8 2-fd: **  **\n        .byte   %00000000       ; 0FE9 2-fd:\n        .byte   %00110011       ; 0FEA 2-fd:   **  **\n        .byte   %11111111       ; 0FEB 2-fd: ********\n        .byte   %11111111       ; 0FEC 2-fd: ********\n        .byte   %11111111       ; 0FED 2-fd: ********\n        .byte   %11111111       ; 0FEE 2-fd: ********\n        .byte   %11111111       ; 0FEF 2-fd: ********\n\n        .byte   %11111111       ; 0FF0 2-fe: ********\n        .byte   %11111111       ; 0FF1 2-fe: ********\n        .byte   %11111111       ; 0FF2 2-fe: ********\n        .byte   %11111111       ; 0FF3 2-fe: ********\n        .byte   %11111111       ; 0FF4 2-fe: ********\n        .byte   %11111111       ; 0FF5 2-fe: ********\n        .byte   %11111111       ; 0FF6 2-fe: ********\n        .byte   %11111111       ; 0FF7 2-fe: ********\n\n        .byte   %11111111       ; 0FF8 2-ff: ********\n        .byte   %11111111       ; 0FF9 2-ff: ********\n        .byte   %11111111       ; 0FFA 2-ff: ********\n        .byte   %11111111       ; 0FFB 2-ff: ********\n        .byte   %11111111       ; 0FFC 2-ff: ********\n        .byte   %11111111       ; 0FFD 2-ff: ********\n        .byte   %11111111       ; 0FFE 2-ff: ********\n        .byte   %11111111       ; 0FFF 2-ff: ********\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_nes_tiles.s.template",
    "content": "\t\t.segment \"CHARS\"\n\t\t.export _Charset\n\n_Charset:\n\n        .byte   %00000000       ; 0000 1-00:         \n        .byte   %00000000       ; 0001 1-00:         \n        .byte   %00000000       ; 0002 1-00:         \n        .byte   %00000000       ; 0003 1-00:         \n        .byte   %00000000       ; 0004 1-00:         \n        .byte   %00000000       ; 0005 1-00:         \n        .byte   %00000000       ; 0006 1-00:         \n        .byte   %00000000       ; 0007 1-00:         \n\n        .byte   %00000000       ; 0008 1-01:         \n        .byte   %00000000       ; 0009 1-01:         \n        .byte   %00000000       ; 000A 1-01:         \n        .byte   %00000000       ; 000B 1-01:         \n        .byte   %00000000       ; 000C 1-01:         \n        .byte   %00000000       ; 000D 1-01:         \n        .byte   %00000000       ; 000E 1-01:         \n        .byte   %00000000       ; 000F 1-01:         \n\n.byte <tile_19>\n.byte <tile_19>\n\n.byte <tile_20>\n.byte <tile_20>\n\n.byte <tile_21>\n.byte <tile_21>\n\n.byte <tile_22>\n.byte <tile_22>\n\n.byte <tile_23>\n.byte <tile_23>\n\n.byte <tile_24>\n.byte <tile_24>\n\n        .byte   %11100000       ; 0070 1-0e: ***     \n        .byte   %11100000       ; 0071 1-0e: ***     \n        .byte   %01100000       ; 0072 1-0e:  **     \n        .byte   %01100000       ; 0073 1-0e:  **     \n        .byte   %01100000       ; 0074 1-0e:  **     \n        .byte   %01100000       ; 0075 1-0e:  **     \n        .byte   %01100000       ; 0076 1-0e:  **     \n        .byte   %01100000       ; 0077 1-0e:  **     \n\n        .byte   %11100000       ; 0078 1-0f: ***     \n        .byte   %11100000       ; 0079 1-0f: ***     \n        .byte   %01100000       ; 007A 1-0f:  **     \n        .byte   %01100000       ; 007B 1-0f:  **     \n        .byte   %01100000       ; 007C 1-0f:  **     \n        .byte   %01100000       ; 007D 1-0f:  **     \n        .byte   %01100000       ; 007E 1-0f:  **     \n        .byte   %01100000       ; 007F 1-0f:  **     \n\n        .byte   %00011000       ; 0080 1-10:    **   \n        .byte   %00011000       ; 0081 1-10:    **   \n        .byte   %00011000       ; 0082 1-10:    **   \n        .byte   %11111000       ; 0083 1-10: *****   \n        .byte   %11111000       ; 0084 1-10: *****   \n        .byte   %00000000       ; 0085 1-10:         \n        .byte   %00000000       ; 0086 1-10:         \n        .byte   %00000000       ; 0087 1-10:         \n\n        .byte   %00011000       ; 0088 1-11:    **   \n        .byte   %00011000       ; 0089 1-11:    **   \n        .byte   %00011000       ; 008A 1-11:    **   \n        .byte   %11111000       ; 008B 1-11: *****   \n        .byte   %11111000       ; 008C 1-11: *****   \n        .byte   %00000000       ; 008D 1-11:         \n        .byte   %00000000       ; 008E 1-11:         \n        .byte   %00000000       ; 008F 1-11:         \n\n        .byte   %11001100       ; 0090 1-12: **  **  \n        .byte   %10011001       ; 0091 1-12: *  **  *\n        .byte   %00110011       ; 0092 1-12:   **  **\n        .byte   %01100110       ; 0093 1-12:  **  ** \n        .byte   %11001100       ; 0094 1-12: **  **  \n        .byte   %10011001       ; 0095 1-12: *  **  *\n        .byte   %00110011       ; 0096 1-12:   **  **\n        .byte   %01100110       ; 0097 1-12:  **  ** \n\n        .byte   %11001100       ; 0098 1-13: **  **  \n        .byte   %10011001       ; 0099 1-13: *  **  *\n        .byte   %00110011       ; 009A 1-13:   **  **\n        .byte   %01100110       ; 009B 1-13:  **  ** \n        .byte   %11001100       ; 009C 1-13: **  **  \n        .byte   %10011001       ; 009D 1-13: *  **  *\n        .byte   %00110011       ; 009E 1-13:   **  **\n        .byte   %01100110       ; 009F 1-13:  **  ** \n\n        .byte   %00110011       ; 00A0 1-14:   **  **\n        .byte   %10011001       ; 00A1 1-14: *  **  *\n        .byte   %11001100       ; 00A2 1-14: **  **  \n        .byte   %01100110       ; 00A3 1-14:  **  ** \n        .byte   %00110011       ; 00A4 1-14:   **  **\n        .byte   %10011001       ; 00A5 1-14: *  **  *\n        .byte   %11001100       ; 00A6 1-14: **  **  \n        .byte   %01100110       ; 00A7 1-14:  **  ** \n\n        .byte   %00110011       ; 00A8 1-15:   **  **\n        .byte   %10011001       ; 00A9 1-15: *  **  *\n        .byte   %11001100       ; 00AA 1-15: **  **  \n        .byte   %01100110       ; 00AB 1-15:  **  ** \n        .byte   %00110011       ; 00AC 1-15:   **  **\n        .byte   %10011001       ; 00AD 1-15: *  **  *\n        .byte   %11001100       ; 00AE 1-15: **  **  \n        .byte   %01100110       ; 00AF 1-15:  **  ** \n\n        .byte   %00000000       ; 00B0 1-16:         \n        .byte   %00000000       ; 00B1 1-16:         \n        .byte   %00000000       ; 00B2 1-16:         \n        .byte   %11111111       ; 00B3 1-16: ********\n        .byte   %11111111       ; 00B4 1-16: ********\n        .byte   %00000000       ; 00B5 1-16:         \n        .byte   %00000000       ; 00B6 1-16:         \n        .byte   %00000000       ; 00B7 1-16:         \n\n        .byte   %00000000       ; 00B8 1-17:         \n        .byte   %00000000       ; 00B9 1-17:         \n        .byte   %00000000       ; 00BA 1-17:         \n        .byte   %11111111       ; 00BB 1-17: ********\n        .byte   %11111111       ; 00BC 1-17: ********\n        .byte   %00000000       ; 00BD 1-17:         \n        .byte   %00000000       ; 00BE 1-17:         \n        .byte   %00000000       ; 00BF 1-17:         \n\n        .byte   %00000011       ; 00C0 1-18:       **\n        .byte   %00000011       ; 00C1 1-18:       **\n        .byte   %00000011       ; 00C2 1-18:       **\n        .byte   %00000011       ; 00C3 1-18:       **\n        .byte   %00000011       ; 00C4 1-18:       **\n        .byte   %00000011       ; 00C5 1-18:       **\n        .byte   %00000011       ; 00C6 1-18:       **\n        .byte   %00000011       ; 00C7 1-18:       **\n\n        .byte   %00000011       ; 00C8 1-19:       **\n        .byte   %00000011       ; 00C9 1-19:       **\n        .byte   %00000011       ; 00CA 1-19:       **\n        .byte   %00000011       ; 00CB 1-19:       **\n        .byte   %00000011       ; 00CC 1-19:       **\n        .byte   %00000011       ; 00CD 1-19:       **\n        .byte   %00000011       ; 00CE 1-19:       **\n        .byte   %00000011       ; 00CF 1-19:       **\n\n        .byte   %00000000       ; 00D0 1-1a:         \n        .byte   %00000000       ; 00D1 1-1a:         \n        .byte   %00000000       ; 00D2 1-1a:         \n        .byte   %00000000       ; 00D3 1-1a:         \n        .byte   %11001100       ; 00D4 1-1a: **  **  \n        .byte   %11001100       ; 00D5 1-1a: **  **  \n        .byte   %00110011       ; 00D6 1-1a:   **  **\n        .byte   %00110011       ; 00D7 1-1a:   **  **\n\n        .byte   %00000000       ; 00D8 1-1b:         \n        .byte   %00000000       ; 00D9 1-1b:         \n        .byte   %00000000       ; 00DA 1-1b:         \n        .byte   %00000000       ; 00DB 1-1b:         \n        .byte   %11001100       ; 00DC 1-1b: **  **  \n        .byte   %11001100       ; 00DD 1-1b: **  **  \n        .byte   %00110011       ; 00DE 1-1b:   **  **\n        .byte   %00110011       ; 00DF 1-1b:   **  **\n\n        .byte   %00011000       ; 00E0 1-1c:    **   \n        .byte   %00011000       ; 00E1 1-1c:    **   \n        .byte   %00011000       ; 00E2 1-1c:    **   \n        .byte   %00011000       ; 00E3 1-1c:    **   \n        .byte   %00011000       ; 00E4 1-1c:    **   \n        .byte   %00011000       ; 00E5 1-1c:    **   \n        .byte   %00011000       ; 00E6 1-1c:    **   \n        .byte   %00011000       ; 00E7 1-1c:    **   \n\n        .byte   %00011000       ; 00E8 1-1d:    **   \n        .byte   %00011000       ; 00E9 1-1d:    **   \n        .byte   %00011000       ; 00EA 1-1d:    **   \n        .byte   %00011000       ; 00EB 1-1d:    **   \n        .byte   %00011000       ; 00EC 1-1d:    **   \n        .byte   %00011000       ; 00ED 1-1d:    **   \n        .byte   %00011000       ; 00EE 1-1d:    **   \n        .byte   %00011000       ; 00EF 1-1d:    **   \n\n        .byte   %00011000       ; 00F0 1-1e:    **   \n        .byte   %00011000       ; 00F1 1-1e:    **   \n        .byte   %00011000       ; 00F2 1-1e:    **   \n        .byte   %00011111       ; 00F3 1-1e:    *****\n        .byte   %00011111       ; 00F4 1-1e:    *****\n        .byte   %00011000       ; 00F5 1-1e:    **   \n        .byte   %00011000       ; 00F6 1-1e:    **   \n        .byte   %00011000       ; 00F7 1-1e:    **   \n\n        .byte   %00011000       ; 00F8 1-1f:    **   \n        .byte   %00011000       ; 00F9 1-1f:    **   \n        .byte   %00011000       ; 00FA 1-1f:    **   \n        .byte   %00011111       ; 00FB 1-1f:    *****\n        .byte   %00011111       ; 00FC 1-1f:    *****\n        .byte   %00011000       ; 00FD 1-1f:    **   \n        .byte   %00011000       ; 00FE 1-1f:    **   \n        .byte   %00011000       ; 00FF 1-1f:    **   \n\n        .byte   %00011000       ; 0100 1-20:    **   \n        .byte   %00011000       ; 0101 1-20:    **   \n        .byte   %00011000       ; 0102 1-20:    **   \n        .byte   %11111111       ; 0103 1-20: ********\n        .byte   %11111111       ; 0104 1-20: ********\n        .byte   %00011000       ; 0105 1-20:    **   \n        .byte   %00011000       ; 0106 1-20:    **   \n        .byte   %00011000       ; 0107 1-20:    **   \n\n        .byte   %00011000       ; 0108 1-21:    **   \n        .byte   %00011000       ; 0109 1-21:    **   \n        .byte   %00011000       ; 010A 1-21:    **   \n        .byte   %11111111       ; 010B 1-21: ********\n        .byte   %11111111       ; 010C 1-21: ********\n        .byte   %00011000       ; 010D 1-21:    **   \n        .byte   %00011000       ; 010E 1-21:    **   \n        .byte   %00011000       ; 010F 1-21:    **   \n\n        .byte   %00011000       ; 0110 1-22:    **   \n        .byte   %00011000       ; 0111 1-22:    **   \n        .byte   %00011000       ; 0112 1-22:    **   \n        .byte   %00011111       ; 0113 1-22:    *****\n        .byte   %00011111       ; 0114 1-22:    *****\n        .byte   %00000000       ; 0115 1-22:         \n        .byte   %00000000       ; 0116 1-22:         \n        .byte   %00000000       ; 0117 1-22:         \n\n        .byte   %00011000       ; 0118 1-23:    **   \n        .byte   %00011000       ; 0119 1-23:    **   \n        .byte   %00011000       ; 011A 1-23:    **   \n        .byte   %00011111       ; 011B 1-23:    *****\n        .byte   %00011111       ; 011C 1-23:    *****\n        .byte   %00000000       ; 011D 1-23:         \n        .byte   %00000000       ; 011E 1-23:         \n        .byte   %00000000       ; 011F 1-23:         \n\n        .byte   %00000000       ; 0120 1-24:         \n        .byte   %00000000       ; 0121 1-24:         \n        .byte   %00000000       ; 0122 1-24:         \n        .byte   %11111000       ; 0123 1-24: *****   \n        .byte   %11111000       ; 0124 1-24: *****   \n        .byte   %00011000       ; 0125 1-24:    **   \n        .byte   %00011000       ; 0126 1-24:    **   \n        .byte   %00011000       ; 0127 1-24:    **   \n\n        .byte   %00000000       ; 0128 1-25:         \n        .byte   %00000000       ; 0129 1-25:         \n        .byte   %00000000       ; 012A 1-25:         \n        .byte   %11111000       ; 012B 1-25: *****   \n        .byte   %11111000       ; 012C 1-25: *****   \n        .byte   %00011000       ; 012D 1-25:    **   \n        .byte   %00011000       ; 012E 1-25:    **   \n        .byte   %00011000       ; 012F 1-25:    **   \n\n        .byte   %00000000       ; 0130 1-26:         \n        .byte   %00000000       ; 0131 1-26:         \n        .byte   %00000000       ; 0132 1-26:         \n        .byte   %00000000       ; 0133 1-26:         \n        .byte   %00000000       ; 0134 1-26:         \n        .byte   %00000000       ; 0135 1-26:         \n        .byte   %11111111       ; 0136 1-26: ********\n        .byte   %11111111       ; 0137 1-26: ********\n\n        .byte   %00000000       ; 0138 1-27:         \n        .byte   %00000000       ; 0139 1-27:         \n        .byte   %00000000       ; 013A 1-27:         \n        .byte   %00000000       ; 013B 1-27:         \n        .byte   %00000000       ; 013C 1-27:         \n        .byte   %00000000       ; 013D 1-27:         \n        .byte   %11111111       ; 013E 1-27: ********\n        .byte   %11111111       ; 013F 1-27: ********\n\n        .byte   %00000000       ; 0140 1-28:         \n        .byte   %00000000       ; 0141 1-28:         \n        .byte   %00000000       ; 0142 1-28:         \n        .byte   %00011111       ; 0143 1-28:    *****\n        .byte   %00011111       ; 0144 1-28:    *****\n        .byte   %00011000       ; 0145 1-28:    **   \n        .byte   %00011000       ; 0146 1-28:    **   \n        .byte   %00011000       ; 0147 1-28:    **   \n\n        .byte   %00000000       ; 0148 1-29:         \n        .byte   %00000000       ; 0149 1-29:         \n        .byte   %00000000       ; 014A 1-29:         \n        .byte   %00011111       ; 014B 1-29:    *****\n        .byte   %00011111       ; 014C 1-29:    *****\n        .byte   %00011000       ; 014D 1-29:    **   \n        .byte   %00011000       ; 014E 1-29:    **   \n        .byte   %00011000       ; 014F 1-29:    **   \n\n        .byte   %00011000       ; 0150 1-2a:    **   \n        .byte   %00011000       ; 0151 1-2a:    **   \n        .byte   %00011000       ; 0152 1-2a:    **   \n        .byte   %11111111       ; 0153 1-2a: ********\n        .byte   %11111111       ; 0154 1-2a: ********\n        .byte   %00000000       ; 0155 1-2a:         \n        .byte   %00000000       ; 0156 1-2a:         \n        .byte   %00000000       ; 0157 1-2a:         \n\n        .byte   %00011000       ; 0158 1-2b:    **   \n        .byte   %00011000       ; 0159 1-2b:    **   \n        .byte   %00011000       ; 015A 1-2b:    **   \n        .byte   %11111111       ; 015B 1-2b: ********\n        .byte   %11111111       ; 015C 1-2b: ********\n        .byte   %00000000       ; 015D 1-2b:         \n        .byte   %00000000       ; 015E 1-2b:         \n        .byte   %00000000       ; 015F 1-2b:         \n\n        .byte   %00000000       ; 0160 1-2c:         \n        .byte   %00000000       ; 0161 1-2c:         \n        .byte   %00000000       ; 0162 1-2c:         \n        .byte   %11111111       ; 0163 1-2c: ********\n        .byte   %11111111       ; 0164 1-2c: ********\n        .byte   %00011000       ; 0165 1-2c:    **   \n        .byte   %00011000       ; 0166 1-2c:    **   \n        .byte   %00011000       ; 0167 1-2c:    **   \n\n        .byte   %00000000       ; 0168 1-2d:         \n        .byte   %00000000       ; 0169 1-2d:         \n        .byte   %00000000       ; 016A 1-2d:         \n        .byte   %11111111       ; 016B 1-2d: ********\n        .byte   %11111111       ; 016C 1-2d: ********\n        .byte   %00011000       ; 016D 1-2d:    **   \n        .byte   %00011000       ; 016E 1-2d:    **   \n        .byte   %00011000       ; 016F 1-2d:    **   \n\n        .byte   %00011000       ; 0170 1-2e:    **   \n        .byte   %00011000       ; 0171 1-2e:    **   \n        .byte   %00011000       ; 0172 1-2e:    **   \n        .byte   %11111000       ; 0173 1-2e: *****   \n        .byte   %11111000       ; 0174 1-2e: *****   \n        .byte   %00011000       ; 0175 1-2e:    **   \n        .byte   %00011000       ; 0176 1-2e:    **   \n        .byte   %00011000       ; 0177 1-2e:    **   \n\n        .byte   %00011000       ; 0178 1-2f:    **   \n        .byte   %00011000       ; 0179 1-2f:    **   \n        .byte   %00011000       ; 017A 1-2f:    **   \n        .byte   %11111000       ; 017B 1-2f: *****   \n        .byte   %11111000       ; 017C 1-2f: *****   \n        .byte   %00011000       ; 017D 1-2f:    **   \n        .byte   %00011000       ; 017E 1-2f:    **   \n        .byte   %00011000       ; 017F 1-2f:    **   \n\n        .byte   %11110000       ; 0180 1-30: ****    \n        .byte   %11110000       ; 0181 1-30: ****    \n        .byte   %11110000       ; 0182 1-30: ****    \n        .byte   %11110000       ; 0183 1-30: ****    \n        .byte   %11110000       ; 0184 1-30: ****    \n        .byte   %11110000       ; 0185 1-30: ****    \n        .byte   %11110000       ; 0186 1-30: ****    \n        .byte   %11110000       ; 0187 1-30: ****    \n\n        .byte   %11110000       ; 0188 1-31: ****    \n        .byte   %11110000       ; 0189 1-31: ****    \n        .byte   %11110000       ; 018A 1-31: ****    \n        .byte   %11110000       ; 018B 1-31: ****    \n        .byte   %11110000       ; 018C 1-31: ****    \n        .byte   %11110000       ; 018D 1-31: ****    \n        .byte   %11110000       ; 018E 1-31: ****    \n        .byte   %11110000       ; 018F 1-31: ****    \n\n        .byte   %00000000       ; 0190 1-32:         \n        .byte   %00000000       ; 0191 1-32:         \n        .byte   %00000000       ; 0192 1-32:         \n        .byte   %00000000       ; 0193 1-32:         \n        .byte   %11111111       ; 0194 1-32: ********\n        .byte   %11111111       ; 0195 1-32: ********\n        .byte   %11111111       ; 0196 1-32: ********\n        .byte   %11111111       ; 0197 1-32: ********\n\n        .byte   %00000000       ; 0198 1-33:         \n        .byte   %00000000       ; 0199 1-33:         \n        .byte   %00000000       ; 019A 1-33:         \n        .byte   %00000000       ; 019B 1-33:         \n        .byte   %11111111       ; 019C 1-33: ********\n        .byte   %11111111       ; 019D 1-33: ********\n        .byte   %11111111       ; 019E 1-33: ********\n        .byte   %11111111       ; 019F 1-33: ********\n\n        .byte   %00000000       ; 01A0 1-34:         \n        .byte   %00000000       ; 01A1 1-34:         \n        .byte   %00000000       ; 01A2 1-34:         \n        .byte   %00000000       ; 01A3 1-34:         \n        .byte   %11110000       ; 01A4 1-34: ****    \n        .byte   %11110000       ; 01A5 1-34: ****    \n        .byte   %11110000       ; 01A6 1-34: ****    \n        .byte   %11110000       ; 01A7 1-34: ****    \n\n        .byte   %00000000       ; 01A8 1-35:         \n        .byte   %00000000       ; 01A9 1-35:         \n        .byte   %00000000       ; 01AA 1-35:         \n        .byte   %00000000       ; 01AB 1-35:         \n        .byte   %11110000       ; 01AC 1-35: ****    \n        .byte   %11110000       ; 01AD 1-35: ****    \n        .byte   %11110000       ; 01AE 1-35: ****    \n        .byte   %11110000       ; 01AF 1-35: ****    \n\n        .byte   %11000000       ; 01B0 1-36: **      \n        .byte   %11000000       ; 01B1 1-36: **      \n        .byte   %00110000       ; 01B2 1-36:   **    \n        .byte   %00110000       ; 01B3 1-36:   **    \n        .byte   %11000000       ; 01B4 1-36: **      \n        .byte   %11000000       ; 01B5 1-36: **      \n        .byte   %00110000       ; 01B6 1-36:   **    \n        .byte   %00110000       ; 01B7 1-36:   **    \n\n        .byte   %11000000       ; 01B8 1-37: **      \n        .byte   %11000000       ; 01B9 1-37: **      \n        .byte   %00110000       ; 01BA 1-37:   **    \n        .byte   %00110000       ; 01BB 1-37:   **    \n        .byte   %11000000       ; 01BC 1-37: **      \n        .byte   %11000000       ; 01BD 1-37: **      \n        .byte   %00110000       ; 01BE 1-37:   **    \n        .byte   %00110000       ; 01BF 1-37:   **    \n\n        .byte   %00001111       ; 01C0 1-38:     ****\n        .byte   %00001111       ; 01C1 1-38:     ****\n        .byte   %00001111       ; 01C2 1-38:     ****\n        .byte   %00001111       ; 01C3 1-38:     ****\n        .byte   %00000000       ; 01C4 1-38:         \n        .byte   %00000000       ; 01C5 1-38:         \n        .byte   %00000000       ; 01C6 1-38:         \n        .byte   %00000000       ; 01C7 1-38:         \n\n        .byte   %00001111       ; 01C8 1-39:     ****\n        .byte   %00001111       ; 01C9 1-39:     ****\n        .byte   %00001111       ; 01CA 1-39:     ****\n        .byte   %00001111       ; 01CB 1-39:     ****\n        .byte   %00000000       ; 01CC 1-39:         \n        .byte   %00000000       ; 01CD 1-39:         \n        .byte   %00000000       ; 01CE 1-39:         \n        .byte   %00000000       ; 01CF 1-39:         \n\n        .byte   %00000000       ; 01D0 1-3a:         \n        .byte   %00000000       ; 01D1 1-3a:         \n        .byte   %00000000       ; 01D2 1-3a:         \n        .byte   %00000000       ; 01D3 1-3a:         \n        .byte   %00001111       ; 01D4 1-3a:     ****\n        .byte   %00001111       ; 01D5 1-3a:     ****\n        .byte   %00001111       ; 01D6 1-3a:     ****\n        .byte   %00001111       ; 01D7 1-3a:     ****\n\n        .byte   %00000000       ; 01D8 1-3b:         \n        .byte   %00000000       ; 01D9 1-3b:         \n        .byte   %00000000       ; 01DA 1-3b:         \n        .byte   %00000000       ; 01DB 1-3b:         \n        .byte   %00001111       ; 01DC 1-3b:     ****\n        .byte   %00001111       ; 01DD 1-3b:     ****\n        .byte   %00001111       ; 01DE 1-3b:     ****\n        .byte   %00001111       ; 01DF 1-3b:     ****\n\n        .byte   %11110000       ; 01E0 1-3c: ****    \n        .byte   %11110000       ; 01E1 1-3c: ****    \n        .byte   %11110000       ; 01E2 1-3c: ****    \n        .byte   %11110000       ; 01E3 1-3c: ****    \n        .byte   %00000000       ; 01E4 1-3c:         \n        .byte   %00000000       ; 01E5 1-3c:         \n        .byte   %00000000       ; 01E6 1-3c:         \n        .byte   %00000000       ; 01E7 1-3c:         \n\n        .byte   %11110000       ; 01E8 1-3d: ****    \n        .byte   %11110000       ; 01E9 1-3d: ****    \n        .byte   %11110000       ; 01EA 1-3d: ****    \n        .byte   %11110000       ; 01EB 1-3d: ****    \n        .byte   %00000000       ; 01EC 1-3d:         \n        .byte   %00000000       ; 01ED 1-3d:         \n        .byte   %00000000       ; 01EE 1-3d:         \n        .byte   %00000000       ; 01EF 1-3d:         \n\n        .byte   %11110000       ; 01F0 1-3e: ****    \n        .byte   %11110000       ; 01F1 1-3e: ****    \n        .byte   %11110000       ; 01F2 1-3e: ****    \n        .byte   %11110000       ; 01F3 1-3e: ****    \n        .byte   %00001111       ; 01F4 1-3e:     ****\n        .byte   %00001111       ; 01F5 1-3e:     ****\n        .byte   %00001111       ; 01F6 1-3e:     ****\n        .byte   %00001111       ; 01F7 1-3e:     ****\n\n        .byte   %11110000       ; 01F8 1-3f: ****    \n        .byte   %11110000       ; 01F9 1-3f: ****    \n        .byte   %11110000       ; 01FA 1-3f: ****    \n        .byte   %11110000       ; 01FB 1-3f: ****    \n        .byte   %00001111       ; 01FC 1-3f:     ****\n        .byte   %00001111       ; 01FD 1-3f:     ****\n        .byte   %00001111       ; 01FE 1-3f:     ****\n        .byte   %00001111       ; 01FF 1-3f:     ****\n\n        .byte   %00000000       ; 0200 1-40:         \n        .byte   %00000000       ; 0201 1-40:         \n        .byte   %00000000       ; 0202 1-40:         \n        .byte   %00000000       ; 0203 1-40:         \n        .byte   %00000000       ; 0204 1-40:         \n        .byte   %00000000       ; 0205 1-40:         \n        .byte   %00000000       ; 0206 1-40:         \n        .byte   %00000000       ; 0207 1-40:         \n\n        .byte   %00000000       ; 0208 1-41:         \n        .byte   %00000000       ; 0209 1-41:         \n        .byte   %00000000       ; 020A 1-41:         \n        .byte   %00000000       ; 020B 1-41:         \n        .byte   %00000000       ; 020C 1-41:         \n        .byte   %00000000       ; 020D 1-41:         \n        .byte   %00000000       ; 020E 1-41:         \n        .byte   %00000000       ; 020F 1-41:         \n\n        .byte   %00011000       ; 0210 1-42:    **   \n        .byte   %00011000       ; 0211 1-42:    **   \n        .byte   %00011000       ; 0212 1-42:    **   \n        .byte   %00011000       ; 0213 1-42:    **   \n        .byte   %00000000       ; 0214 1-42:         \n        .byte   %00000000       ; 0215 1-42:         \n        .byte   %00011000       ; 0216 1-42:    **   \n        .byte   %00000000       ; 0217 1-42:         \n\n        .byte   %00011000       ; 0218 1-43:    **   \n        .byte   %00011000       ; 0219 1-43:    **   \n        .byte   %00011000       ; 021A 1-43:    **   \n        .byte   %00011000       ; 021B 1-43:    **   \n        .byte   %00000000       ; 021C 1-43:         \n        .byte   %00000000       ; 021D 1-43:         \n        .byte   %00011000       ; 021E 1-43:    **   \n        .byte   %00000000       ; 021F 1-43:         \n\n        .byte   %01100110       ; 0220 1-44:  **  ** \n        .byte   %01100110       ; 0221 1-44:  **  ** \n        .byte   %01100110       ; 0222 1-44:  **  ** \n        .byte   %00000000       ; 0223 1-44:         \n        .byte   %00000000       ; 0224 1-44:         \n        .byte   %00000000       ; 0225 1-44:         \n        .byte   %00000000       ; 0226 1-44:         \n        .byte   %00000000       ; 0227 1-44:         \n\n        .byte   %01100110       ; 0228 1-45:  **  ** \n        .byte   %01100110       ; 0229 1-45:  **  ** \n        .byte   %01100110       ; 022A 1-45:  **  ** \n        .byte   %00000000       ; 022B 1-45:         \n        .byte   %00000000       ; 022C 1-45:         \n        .byte   %00000000       ; 022D 1-45:         \n        .byte   %00000000       ; 022E 1-45:         \n        .byte   %00000000       ; 022F 1-45:         \n\n\n    .byte <tile_4>\n\t ; .byte    %10111101\n\t ; .byte    %01000010\n\t ; .byte    %10100101\n\t ; .byte    %10000001\n\t ; .byte    %10000001\n\t ; .byte    %10011001\n\t ; .byte    %10000001\n\t ; .byte    %01111110\n\n    .byte <tile_4>\n\t ; .byte    %10111101\n\t ; .byte    %01000010\n\t ; .byte    %10100101\n\t ; .byte    %10000001\n\t ; .byte    %10000001\n\t ; .byte    %10011001\n\t ; .byte    %10000001\n\t ; .byte    %01111110 \t \n    \n\n        .byte   %00000000       ; 0008 1-01:         \n        .byte   %00000000       ; 0009 1-01:         \n        .byte   %00000000       ; 000A 1-01:         \n        .byte   %00000000       ; 000B 1-01:         \n        .byte   %00000000       ; 000C 1-01:         \n        .byte   %00000000       ; 000D 1-01:         \n        .byte   %00000000       ; 000E 1-01:         \n        .byte   %00000000       ; 000F 1-01:         \n\n        .byte   <tile_25>     \n\n        .byte   %00000000       ; 0250 1-4a:         \n        .byte   %01100110       ; 0251 1-4a:  **  ** \n        .byte   %00001100       ; 0252 1-4a:     **  \n        .byte   %00011000       ; 0253 1-4a:    **   \n        .byte   %00110000       ; 0254 1-4a:   **    \n        .byte   %01100110       ; 0255 1-4a:  **  ** \n        .byte   %01000110       ; 0256 1-4a:  *   ** \n        .byte   %00000000       ; 0257 1-4a:         \n\n        .byte   %00000000       ; 0258 1-4b:         \n        .byte   %01100110       ; 0259 1-4b:  **  ** \n        .byte   %00001100       ; 025A 1-4b:     **  \n        .byte   %00011000       ; 025B 1-4b:    **   \n        .byte   %00110000       ; 025C 1-4b:   **    \n        .byte   %01100110       ; 025D 1-4b:  **  ** \n        .byte   %01000110       ; 025E 1-4b:  *   ** \n        .byte   %00000000       ; 025F 1-4b:         \n\n        .byte   %00111100       ; 0260 1-4c:   ****  \n        .byte   %01100110       ; 0261 1-4c:  **  ** \n        .byte   %00111100       ; 0262 1-4c:   ****  \n        .byte   %00111000       ; 0263 1-4c:   ***   \n        .byte   %01100111       ; 0264 1-4c:  **  ***\n        .byte   %01100110       ; 0265 1-4c:  **  ** \n        .byte   %00111111       ; 0266 1-4c:   ******\n        .byte   %00000000       ; 0267 1-4c:         \n\n        .byte   %00111100       ; 0268 1-4d:   ****  \n        .byte   %01100110       ; 0269 1-4d:  **  ** \n        .byte   %00111100       ; 026A 1-4d:   ****  \n        .byte   %00111000       ; 026B 1-4d:   ***   \n        .byte   %01100111       ; 026C 1-4d:  **  ***\n        .byte   %01100110       ; 026D 1-4d:  **  ** \n        .byte   %00111111       ; 026E 1-4d:   ******\n        .byte   %00000000       ; 026F 1-4d:         \n\n        .byte   %00000110       ; 0270 1-4e:      ** \n        .byte   %00001100       ; 0271 1-4e:     **  \n        .byte   %00011000       ; 0272 1-4e:    **   \n        .byte   %00000000       ; 0273 1-4e:         \n        .byte   %00000000       ; 0274 1-4e:         \n        .byte   %00000000       ; 0275 1-4e:         \n        .byte   %00000000       ; 0276 1-4e:         \n        .byte   %00000000       ; 0277 1-4e:         \n\n        .byte   %00000110       ; 0278 1-4f:      ** \n        .byte   %00001100       ; 0279 1-4f:     **  \n        .byte   %00011000       ; 027A 1-4f:    **   \n        .byte   %00000000       ; 027B 1-4f:         \n        .byte   %00000000       ; 027C 1-4f:         \n        .byte   %00000000       ; 027D 1-4f:         \n        .byte   %00000000       ; 027E 1-4f:         \n        .byte   %00000000       ; 027F 1-4f:         \n\n        .byte   %00001100       ; 0280 1-50:     **  \n        .byte   %00011000       ; 0281 1-50:    **   \n        .byte   %00110000       ; 0282 1-50:   **    \n        .byte   %00110000       ; 0283 1-50:   **    \n        .byte   %00110000       ; 0284 1-50:   **    \n        .byte   %00011000       ; 0285 1-50:    **   \n        .byte   %00001100       ; 0286 1-50:     **  \n        .byte   %00000000       ; 0287 1-50:         \n\n        .byte   %00001100       ; 0288 1-51:     **  \n        .byte   %00011000       ; 0289 1-51:    **   \n        .byte   %00110000       ; 028A 1-51:   **    \n        .byte   %00110000       ; 028B 1-51:   **    \n        .byte   %00110000       ; 028C 1-51:   **    \n        .byte   %00011000       ; 028D 1-51:    **   \n        .byte   %00001100       ; 028E 1-51:     **  \n        .byte   %00000000       ; 028F 1-51:         \n\n        .byte   %00110000       ; 0290 1-52:   **    \n        .byte   %00011000       ; 0291 1-52:    **   \n        .byte   %00001100       ; 0292 1-52:     **  \n        .byte   %00001100       ; 0293 1-52:     **  \n        .byte   %00001100       ; 0294 1-52:     **  \n        .byte   %00011000       ; 0295 1-52:    **   \n        .byte   %00110000       ; 0296 1-52:   **    \n        .byte   %00000000       ; 0297 1-52:         \n\n        .byte   %00110000       ; 0298 1-53:   **    \n        .byte   %00011000       ; 0299 1-53:    **   \n        .byte   %00001100       ; 029A 1-53:     **  \n        .byte   %00001100       ; 029B 1-53:     **  \n        .byte   %00001100       ; 029C 1-53:     **  \n        .byte   %00011000       ; 029D 1-53:    **   \n        .byte   %00110000       ; 029E 1-53:   **    \n        .byte   %00000000       ; 029F 1-53:         \n\n        .byte   %00000000       ; 02A0 1-54:         \n        .byte   %01100110       ; 02A1 1-54:  **  ** \n        .byte   %00111100       ; 02A2 1-54:   ****  \n        .byte   %11111111       ; 02A3 1-54: ********\n        .byte   %00111100       ; 02A4 1-54:   ****  \n        .byte   %01100110       ; 02A5 1-54:  **  ** \n        .byte   %00000000       ; 02A6 1-54:         \n        .byte   %00000000       ; 02A7 1-54:         \n\n        .byte   %00000000       ; 02A8 1-55:         \n        .byte   %01100110       ; 02A9 1-55:  **  ** \n        .byte   %00111100       ; 02AA 1-55:   ****  \n        .byte   %11111111       ; 02AB 1-55: ********\n        .byte   %00111100       ; 02AC 1-55:   ****  \n        .byte   %01100110       ; 02AD 1-55:  **  ** \n        .byte   %00000000       ; 02AE 1-55:         \n        .byte   %00000000       ; 02AF 1-55:         \n\n        .byte   %00000000       ; 02B0 1-56:         \n        .byte   %00011000       ; 02B1 1-56:    **   \n        .byte   %00011000       ; 02B2 1-56:    **   \n        .byte   %01111110       ; 02B3 1-56:  ****** \n        .byte   %00011000       ; 02B4 1-56:    **   \n        .byte   %00011000       ; 02B5 1-56:    **   \n        .byte   %00000000       ; 02B6 1-56:         \n        .byte   %00000000       ; 02B7 1-56:         \n\n        .byte   %00000000       ; 02B8 1-57:         \n        .byte   %00011000       ; 02B9 1-57:    **   \n        .byte   %00011000       ; 02BA 1-57:    **   \n        .byte   %01111110       ; 02BB 1-57:  ****** \n        .byte   %00011000       ; 02BC 1-57:    **   \n        .byte   %00011000       ; 02BD 1-57:    **   \n        .byte   %00000000       ; 02BE 1-57:         \n        .byte   %00000000       ; 02BF 1-57:         \n\n        .byte   %00000000       ; 02C0 1-58:         \n        .byte   %00000000       ; 02C1 1-58:         \n        .byte   %00000000       ; 02C2 1-58:         \n        .byte   %00000000       ; 02C3 1-58:         \n        .byte   %00000000       ; 02C4 1-58:         \n        .byte   %00011000       ; 02C5 1-58:    **   \n        .byte   %00011000       ; 02C6 1-58:    **   \n        .byte   %00110000       ; 02C7 1-58:   **    \n\n        .byte   %00000000       ; 02C8 1-59:         \n        .byte   %00000000       ; 02C9 1-59:         \n        .byte   %00000000       ; 02CA 1-59:         \n        .byte   %00000000       ; 02CB 1-59:         \n        .byte   %00000000       ; 02CC 1-59:         \n        .byte   %00011000       ; 02CD 1-59:    **   \n        .byte   %00011000       ; 02CE 1-59:    **   \n        .byte   %00110000       ; 02CF 1-59:   **    \n\n        .byte   %00000000       ; 02D0 1-5a:         \n        .byte   %00000000       ; 02D1 1-5a:         \n        .byte   %00000000       ; 02D2 1-5a:         \n        .byte   %01111110       ; 02D3 1-5a:  ****** \n        .byte   %00000000       ; 02D4 1-5a:         \n        .byte   %00000000       ; 02D5 1-5a:         \n        .byte   %00000000       ; 02D6 1-5a:         \n        .byte   %00000000       ; 02D7 1-5a:         \n\n        .byte   %00000000       ; 02D8 1-5b:         \n        .byte   %00000000       ; 02D9 1-5b:         \n        .byte   %00000000       ; 02DA 1-5b:         \n        .byte   %01111110       ; 02DB 1-5b:  ****** \n        .byte   %00000000       ; 02DC 1-5b:         \n        .byte   %00000000       ; 02DD 1-5b:         \n        .byte   %00000000       ; 02DE 1-5b:         \n        .byte   %00000000       ; 02DF 1-5b:         \n\n        .byte   %00000000       ; 02E0 1-5c:         \n        .byte   %00000000       ; 02E1 1-5c:         \n        .byte   %00000000       ; 02E2 1-5c:         \n        .byte   %00000000       ; 02E3 1-5c:         \n        .byte   %00000000       ; 02E4 1-5c:         \n        .byte   %00011000       ; 02E5 1-5c:    **   \n        .byte   %00011000       ; 02E6 1-5c:    **   \n        .byte   %00000000       ; 02E7 1-5c:         \n\n        .byte   %00000000       ; 02E8 1-5d:         \n        .byte   %00000000       ; 02E9 1-5d:         \n        .byte   %00000000       ; 02EA 1-5d:         \n        .byte   %00000000       ; 02EB 1-5d:         \n        .byte   %00000000       ; 02EC 1-5d:         \n        .byte   %00011000       ; 02ED 1-5d:    **   \n        .byte   %00011000       ; 02EE 1-5d:    **   \n        .byte   %00000000       ; 02EF 1-5d:         \n\n        .byte   %00000000       ; 02F0 1-5e:         \n        .byte   %00000011       ; 02F1 1-5e:       **\n        .byte   %00000110       ; 02F2 1-5e:      ** \n        .byte   %00001100       ; 02F3 1-5e:     **  \n        .byte   %00011000       ; 02F4 1-5e:    **   \n        .byte   %00110000       ; 02F5 1-5e:   **    \n        .byte   %01100000       ; 02F6 1-5e:  **     \n        .byte   %00000000       ; 02F7 1-5e:         \n\n        .byte   %00000000       ; 02F8 1-5f:         \n        .byte   %00000011       ; 02F9 1-5f:       **\n        .byte   %00000110       ; 02FA 1-5f:      ** \n        .byte   %00001100       ; 02FB 1-5f:     **  \n        .byte   %00011000       ; 02FC 1-5f:    **   \n        .byte   %00110000       ; 02FD 1-5f:   **    \n        .byte   %01100000       ; 02FE 1-5f:  **     \n        .byte   %00000000       ; 02FF 1-5f:         \n\n        .byte   %00111100       ; 0300 1-60:   ****  \n        .byte   %01100110       ; 0301 1-60:  **  ** \n        .byte   %01101110       ; 0302 1-60:  ** *** \n        .byte   %01110110       ; 0303 1-60:  *** ** \n        .byte   %01100110       ; 0304 1-60:  **  ** \n        .byte   %01100110       ; 0305 1-60:  **  ** \n        .byte   %00111100       ; 0306 1-60:   ****  \n        .byte   %00000000       ; 0307 1-60:         \n\n        .byte   %00111100       ; 0308 1-61:   ****  \n        .byte   %01100110       ; 0309 1-61:  **  ** \n        .byte   %01101110       ; 030A 1-61:  ** *** \n        .byte   %01110110       ; 030B 1-61:  *** ** \n        .byte   %01100110       ; 030C 1-61:  **  ** \n        .byte   %01100110       ; 030D 1-61:  **  ** \n        .byte   %00111100       ; 030E 1-61:   ****  \n        .byte   %00000000       ; 030F 1-61:         \n\n        .byte   %00011000       ; 0310 1-62:    **   \n        .byte   %00011000       ; 0311 1-62:    **   \n        .byte   %00111000       ; 0312 1-62:   ***   \n        .byte   %00011000       ; 0313 1-62:    **   \n        .byte   %00011000       ; 0314 1-62:    **   \n        .byte   %00011000       ; 0315 1-62:    **   \n        .byte   %01111110       ; 0316 1-62:  ****** \n        .byte   %00000000       ; 0317 1-62:         \n\n        .byte   %00011000       ; 0318 1-63:    **   \n        .byte   %00011000       ; 0319 1-63:    **   \n        .byte   %00111000       ; 031A 1-63:   ***   \n        .byte   %00011000       ; 031B 1-63:    **   \n        .byte   %00011000       ; 031C 1-63:    **   \n        .byte   %00011000       ; 031D 1-63:    **   \n        .byte   %01111110       ; 031E 1-63:  ****** \n        .byte   %00000000       ; 031F 1-63:         \n\n        .byte   %00111100       ; 0320 1-64:   ****  \n        .byte   %01100110       ; 0321 1-64:  **  ** \n        .byte   %00000110       ; 0322 1-64:      ** \n        .byte   %00001100       ; 0323 1-64:     **  \n        .byte   %00110000       ; 0324 1-64:   **    \n        .byte   %01100000       ; 0325 1-64:  **     \n        .byte   %01111110       ; 0326 1-64:  ****** \n        .byte   %00000000       ; 0327 1-64:         \n\n        .byte   %00111100       ; 0328 1-65:   ****  \n        .byte   %01100110       ; 0329 1-65:  **  ** \n        .byte   %00000110       ; 032A 1-65:      ** \n        .byte   %00001100       ; 032B 1-65:     **  \n        .byte   %00110000       ; 032C 1-65:   **    \n        .byte   %01100000       ; 032D 1-65:  **     \n        .byte   %01111110       ; 032E 1-65:  ****** \n        .byte   %00000000       ; 032F 1-65:         \n\n        .byte   %00111100       ; 0330 1-66:   ****  \n        .byte   %01100110       ; 0331 1-66:  **  ** \n        .byte   %00000110       ; 0332 1-66:      ** \n        .byte   %00011100       ; 0333 1-66:    ***  \n        .byte   %00000110       ; 0334 1-66:      ** \n        .byte   %01100110       ; 0335 1-66:  **  ** \n        .byte   %00111100       ; 0336 1-66:   ****  \n        .byte   %00000000       ; 0337 1-66:         \n\n        .byte   %00111100       ; 0338 1-67:   ****  \n        .byte   %01100110       ; 0339 1-67:  **  ** \n        .byte   %00000110       ; 033A 1-67:      ** \n        .byte   %00011100       ; 033B 1-67:    ***  \n        .byte   %00000110       ; 033C 1-67:      ** \n        .byte   %01100110       ; 033D 1-67:  **  ** \n        .byte   %00111100       ; 033E 1-67:   ****  \n        .byte   %00000000       ; 033F 1-67:         \n\n        .byte   %00000110       ; 0340 1-68:      ** \n        .byte   %00001110       ; 0341 1-68:     *** \n        .byte   %00011110       ; 0342 1-68:    **** \n        .byte   %01100110       ; 0343 1-68:  **  ** \n        .byte   %01111111       ; 0344 1-68:  *******\n        .byte   %00000110       ; 0345 1-68:      ** \n        .byte   %00000110       ; 0346 1-68:      ** \n        .byte   %00000000       ; 0347 1-68:         \n\n        .byte   %00000110       ; 0348 1-69:      ** \n        .byte   %00001110       ; 0349 1-69:     *** \n        .byte   %00011110       ; 034A 1-69:    **** \n        .byte   %01100110       ; 034B 1-69:  **  ** \n        .byte   %01111111       ; 034C 1-69:  *******\n        .byte   %00000110       ; 034D 1-69:      ** \n        .byte   %00000110       ; 034E 1-69:      ** \n        .byte   %00000000       ; 034F 1-69:         \n\n        .byte   %01111110       ; 0350 1-6a:  ****** \n        .byte   %01100000       ; 0351 1-6a:  **     \n        .byte   %01111100       ; 0352 1-6a:  *****  \n        .byte   %00000110       ; 0353 1-6a:      ** \n        .byte   %00000110       ; 0354 1-6a:      ** \n        .byte   %01100110       ; 0355 1-6a:  **  ** \n        .byte   %00111100       ; 0356 1-6a:   ****  \n        .byte   %00000000       ; 0357 1-6a:         \n\n        .byte   %01111110       ; 0358 1-6b:  ****** \n        .byte   %01100000       ; 0359 1-6b:  **     \n        .byte   %01111100       ; 035A 1-6b:  *****  \n        .byte   %00000110       ; 035B 1-6b:      ** \n        .byte   %00000110       ; 035C 1-6b:      ** \n        .byte   %01100110       ; 035D 1-6b:  **  ** \n        .byte   %00111100       ; 035E 1-6b:   ****  \n        .byte   %00000000       ; 035F 1-6b:         \n\n        .byte   %00111100       ; 0360 1-6c:   ****  \n        .byte   %01100110       ; 0361 1-6c:  **  ** \n        .byte   %01100000       ; 0362 1-6c:  **     \n        .byte   %01111100       ; 0363 1-6c:  *****  \n        .byte   %01100110       ; 0364 1-6c:  **  ** \n        .byte   %01100110       ; 0365 1-6c:  **  ** \n        .byte   %00111100       ; 0366 1-6c:   ****  \n        .byte   %00000000       ; 0367 1-6c:         \n\n        .byte   %00111100       ; 0368 1-6d:   ****  \n        .byte   %01100110       ; 0369 1-6d:  **  ** \n        .byte   %01100000       ; 036A 1-6d:  **     \n        .byte   %01111100       ; 036B 1-6d:  *****  \n        .byte   %01100110       ; 036C 1-6d:  **  ** \n        .byte   %01100110       ; 036D 1-6d:  **  ** \n        .byte   %00111100       ; 036E 1-6d:   ****  \n        .byte   %00000000       ; 036F 1-6d:         \n\n        .byte   %01111110       ; 0370 1-6e:  ****** \n        .byte   %01100110       ; 0371 1-6e:  **  ** \n        .byte   %00001100       ; 0372 1-6e:     **  \n        .byte   %00011000       ; 0373 1-6e:    **   \n        .byte   %00011000       ; 0374 1-6e:    **   \n        .byte   %00011000       ; 0375 1-6e:    **   \n        .byte   %00011000       ; 0376 1-6e:    **   \n        .byte   %00000000       ; 0377 1-6e:         \n\n        .byte   %01111110       ; 0378 1-6f:  ****** \n        .byte   %01100110       ; 0379 1-6f:  **  ** \n        .byte   %00001100       ; 037A 1-6f:     **  \n        .byte   %00011000       ; 037B 1-6f:    **   \n        .byte   %00011000       ; 037C 1-6f:    **   \n        .byte   %00011000       ; 037D 1-6f:    **   \n        .byte   %00011000       ; 037E 1-6f:    **   \n        .byte   %00000000       ; 037F 1-6f:         \n\n        .byte   %00111100       ; 0380 1-70:   ****  \n        .byte   %01100110       ; 0381 1-70:  **  ** \n        .byte   %01100110       ; 0382 1-70:  **  ** \n        .byte   %00111100       ; 0383 1-70:   ****  \n        .byte   %01100110       ; 0384 1-70:  **  ** \n        .byte   %01100110       ; 0385 1-70:  **  ** \n        .byte   %00111100       ; 0386 1-70:   ****  \n        .byte   %00000000       ; 0387 1-70:         \n\n        .byte   %00111100       ; 0388 1-71:   ****  \n        .byte   %01100110       ; 0389 1-71:  **  ** \n        .byte   %01100110       ; 038A 1-71:  **  ** \n        .byte   %00111100       ; 038B 1-71:   ****  \n        .byte   %01100110       ; 038C 1-71:  **  ** \n        .byte   %01100110       ; 038D 1-71:  **  ** \n        .byte   %00111100       ; 038E 1-71:   ****  \n        .byte   %00000000       ; 038F 1-71:         \n\n        .byte   %00111100       ; 0390 1-72:   ****  \n        .byte   %01100110       ; 0391 1-72:  **  ** \n        .byte   %01100110       ; 0392 1-72:  **  ** \n        .byte   %00111110       ; 0393 1-72:   ***** \n        .byte   %00000110       ; 0394 1-72:      ** \n        .byte   %01100110       ; 0395 1-72:  **  ** \n        .byte   %00111100       ; 0396 1-72:   ****  \n        .byte   %00000000       ; 0397 1-72:         \n\n        .byte   %00111100       ; 0398 1-73:   ****  \n        .byte   %01100110       ; 0399 1-73:  **  ** \n        .byte   %01100110       ; 039A 1-73:  **  ** \n        .byte   %00111110       ; 039B 1-73:   ***** \n        .byte   %00000110       ; 039C 1-73:      ** \n        .byte   %01100110       ; 039D 1-73:  **  ** \n        .byte   %00111100       ; 039E 1-73:   ****  \n        .byte   %00000000       ; 039F 1-73:         \n\n        .byte   %00000000       ; 03A0 1-74:         \n        .byte   %00000000       ; 03A1 1-74:         \n        .byte   %00011000       ; 03A2 1-74:    **   \n        .byte   %00000000       ; 03A3 1-74:         \n        .byte   %00000000       ; 03A4 1-74:         \n        .byte   %00011000       ; 03A5 1-74:    **   \n        .byte   %00000000       ; 03A6 1-74:         \n        .byte   %00000000       ; 03A7 1-74:         \n\n        .byte   %00000000       ; 03A8 1-75:         \n        .byte   %00000000       ; 03A9 1-75:         \n        .byte   %00011000       ; 03AA 1-75:    **   \n        .byte   %00000000       ; 03AB 1-75:         \n        .byte   %00000000       ; 03AC 1-75:         \n        .byte   %00011000       ; 03AD 1-75:    **   \n        .byte   %00000000       ; 03AE 1-75:         \n        .byte   %00000000       ; 03AF 1-75:         \n\n        .byte   %00000000       ; 03B0 1-76:         \n        .byte   %00000000       ; 03B1 1-76:         \n        .byte   %00011000       ; 03B2 1-76:    **   \n        .byte   %00000000       ; 03B3 1-76:         \n        .byte   %00000000       ; 03B4 1-76:         \n        .byte   %00011000       ; 03B5 1-76:    **   \n        .byte   %00011000       ; 03B6 1-76:    **   \n        .byte   %00110000       ; 03B7 1-76:   **    \n\n        .byte   %00000000       ; 03B8 1-77:         \n        .byte   %00000000       ; 03B9 1-77:         \n        .byte   %00011000       ; 03BA 1-77:    **   \n        .byte   %00000000       ; 03BB 1-77:         \n        .byte   %00000000       ; 03BC 1-77:         \n        .byte   %00011000       ; 03BD 1-77:    **   \n        .byte   %00011000       ; 03BE 1-77:    **   \n        .byte   %00110000       ; 03BF 1-77:   **    \n\n        .byte   %00001110       ; 03C0 1-78:     *** \n        .byte   %00011000       ; 03C1 1-78:    **   \n        .byte   %00110000       ; 03C2 1-78:   **    \n        .byte   %01100000       ; 03C3 1-78:  **     \n        .byte   %00110000       ; 03C4 1-78:   **    \n        .byte   %00011000       ; 03C5 1-78:    **   \n        .byte   %00001110       ; 03C6 1-78:     *** \n        .byte   %00000000       ; 03C7 1-78:         \n\n        .byte   %00001110       ; 03C8 1-79:     *** \n        .byte   %00011000       ; 03C9 1-79:    **   \n        .byte   %00110000       ; 03CA 1-79:   **    \n        .byte   %01100000       ; 03CB 1-79:  **     \n        .byte   %00110000       ; 03CC 1-79:   **    \n        .byte   %00011000       ; 03CD 1-79:    **   \n        .byte   %00001110       ; 03CE 1-79:     *** \n        .byte   %00000000       ; 03CF 1-79:         \n\n        .byte   %00000000       ; 03D0 1-7a:         \n        .byte   %00000000       ; 03D1 1-7a:         \n        .byte   %01111110       ; 03D2 1-7a:  ****** \n        .byte   %00000000       ; 03D3 1-7a:         \n        .byte   %01111110       ; 03D4 1-7a:  ****** \n        .byte   %00000000       ; 03D5 1-7a:         \n        .byte   %00000000       ; 03D6 1-7a:         \n        .byte   %00000000       ; 03D7 1-7a:         \n\n        .byte   %00000000       ; 03D8 1-7b:         \n        .byte   %00000000       ; 03D9 1-7b:         \n        .byte   %01111110       ; 03DA 1-7b:  ****** \n        .byte   %00000000       ; 03DB 1-7b:         \n        .byte   %01111110       ; 03DC 1-7b:  ****** \n        .byte   %00000000       ; 03DD 1-7b:         \n        .byte   %00000000       ; 03DE 1-7b:         \n        .byte   %00000000       ; 03DF 1-7b:         \n\n        .byte   %01110000       ; 03E0 1-7c:  ***    \n        .byte   %00011000       ; 03E1 1-7c:    **   \n        .byte   %00001100       ; 03E2 1-7c:     **  \n        .byte   %00000110       ; 03E3 1-7c:      ** \n        .byte   %00001100       ; 03E4 1-7c:     **  \n        .byte   %00011000       ; 03E5 1-7c:    **   \n        .byte   %01110000       ; 03E6 1-7c:  ***    \n        .byte   %00000000       ; 03E7 1-7c:         \n\n        .byte   %01110000       ; 03E8 1-7d:  ***    \n        .byte   %00011000       ; 03E9 1-7d:    **   \n        .byte   %00001100       ; 03EA 1-7d:     **  \n        .byte   %00000110       ; 03EB 1-7d:      ** \n        .byte   %00001100       ; 03EC 1-7d:     **  \n        .byte   %00011000       ; 03ED 1-7d:    **   \n        .byte   %01110000       ; 03EE 1-7d:  ***    \n        .byte   %00000000       ; 03EF 1-7d:         \n\n        .byte   %00111100       ; 03F0 1-7e:   ****  \n        .byte   %01100110       ; 03F1 1-7e:  **  ** \n        .byte   %00000110       ; 03F2 1-7e:      ** \n        .byte   %00001100       ; 03F3 1-7e:     **  \n        .byte   %00011000       ; 03F4 1-7e:    **   \n        .byte   %00000000       ; 03F5 1-7e:         \n        .byte   %00011000       ; 03F6 1-7e:    **   \n        .byte   %00000000       ; 03F7 1-7e:         \n\n        .byte   %00111100       ; 03F8 1-7f:   ****  \n        .byte   %01100110       ; 03F9 1-7f:  **  ** \n        .byte   %00000110       ; 03FA 1-7f:      ** \n        .byte   %00001100       ; 03FB 1-7f:     **  \n        .byte   %00011000       ; 03FC 1-7f:    **   \n        .byte   %00000000       ; 03FD 1-7f:         \n        .byte   %00011000       ; 03FE 1-7f:    **   \n        .byte   %00000000       ; 03FF 1-7f:         \n\n        .byte   %00111100       ; 0400 1-80:   ****  \n        .byte   %01100110       ; 0401 1-80:  **  ** \n        .byte   %01101110       ; 0402 1-80:  ** *** \n        .byte   %01101110       ; 0403 1-80:  ** *** \n        .byte   %01100000       ; 0404 1-80:  **     \n        .byte   %01100010       ; 0405 1-80:  **   * \n        .byte   %00111100       ; 0406 1-80:   ****  \n        .byte   %00000000       ; 0407 1-80:         \n\n        .byte   %00111100       ; 0408 1-81:   ****  \n        .byte   %01100110       ; 0409 1-81:  **  ** \n        .byte   %01101110       ; 040A 1-81:  ** *** \n        .byte   %01101110       ; 040B 1-81:  ** *** \n        .byte   %01100000       ; 040C 1-81:  **     \n        .byte   %01100010       ; 040D 1-81:  **   * \n        .byte   %00111100       ; 040E 1-81:   ****  \n        .byte   %00000000       ; 040F 1-81:         \n\n        .byte   %00011000       ; 0410 1-82:    **   \n        .byte   %00111100       ; 0411 1-82:   ****  \n        .byte   %01100110       ; 0412 1-82:  **  ** \n        .byte   %01111110       ; 0413 1-82:  ****** \n        .byte   %01100110       ; 0414 1-82:  **  ** \n        .byte   %01100110       ; 0415 1-82:  **  ** \n        .byte   %01100110       ; 0416 1-82:  **  ** \n        .byte   %00000000       ; 0417 1-82:         \n\n        .byte   %00011000       ; 0418 1-83:    **   \n        .byte   %00111100       ; 0419 1-83:   ****  \n        .byte   %01100110       ; 041A 1-83:  **  ** \n        .byte   %01111110       ; 041B 1-83:  ****** \n        .byte   %01100110       ; 041C 1-83:  **  ** \n        .byte   %01100110       ; 041D 1-83:  **  ** \n        .byte   %01100110       ; 041E 1-83:  **  ** \n        .byte   %00000000       ; 041F 1-83:         \n\n        .byte   %01111100       ; 0420 1-84:  *****  \n        .byte   %01100110       ; 0421 1-84:  **  ** \n        .byte   %01100110       ; 0422 1-84:  **  ** \n        .byte   %01111100       ; 0423 1-84:  *****  \n        .byte   %01100110       ; 0424 1-84:  **  ** \n        .byte   %01100110       ; 0425 1-84:  **  ** \n        .byte   %01111100       ; 0426 1-84:  *****  \n        .byte   %00000000       ; 0427 1-84:         \n\n        .byte   %01111100       ; 0428 1-85:  *****  \n        .byte   %01100110       ; 0429 1-85:  **  ** \n        .byte   %01100110       ; 042A 1-85:  **  ** \n        .byte   %01111100       ; 042B 1-85:  *****  \n        .byte   %01100110       ; 042C 1-85:  **  ** \n        .byte   %01100110       ; 042D 1-85:  **  ** \n        .byte   %01111100       ; 042E 1-85:  *****  \n        .byte   %00000000       ; 042F 1-85:         \n\n        .byte   %00111100       ; 0430 1-86:   ****  \n        .byte   %01100110       ; 0431 1-86:  **  ** \n        .byte   %01100000       ; 0432 1-86:  **     \n        .byte   %01100000       ; 0433 1-86:  **     \n        .byte   %01100000       ; 0434 1-86:  **     \n        .byte   %01100110       ; 0435 1-86:  **  ** \n        .byte   %00111100       ; 0436 1-86:   ****  \n        .byte   %00000000       ; 0437 1-86:         \n\n        .byte   %00111100       ; 0438 1-87:   ****  \n        .byte   %01100110       ; 0439 1-87:  **  ** \n        .byte   %01100000       ; 043A 1-87:  **     \n        .byte   %01100000       ; 043B 1-87:  **     \n        .byte   %01100000       ; 043C 1-87:  **     \n        .byte   %01100110       ; 043D 1-87:  **  ** \n        .byte   %00111100       ; 043E 1-87:   ****  \n        .byte   %00000000       ; 043F 1-87:         \n\n        .byte   %01111000       ; 0440 1-88:  ****   \n        .byte   %01101100       ; 0441 1-88:  ** **  \n        .byte   %01100110       ; 0442 1-88:  **  ** \n        .byte   %01100110       ; 0443 1-88:  **  ** \n        .byte   %01100110       ; 0444 1-88:  **  ** \n        .byte   %01101100       ; 0445 1-88:  ** **  \n        .byte   %01111000       ; 0446 1-88:  ****   \n        .byte   %00000000       ; 0447 1-88:         \n\n        .byte   %01111000       ; 0448 1-89:  ****   \n        .byte   %01101100       ; 0449 1-89:  ** **  \n        .byte   %01100110       ; 044A 1-89:  **  ** \n        .byte   %01100110       ; 044B 1-89:  **  ** \n        .byte   %01100110       ; 044C 1-89:  **  ** \n        .byte   %01101100       ; 044D 1-89:  ** **  \n        .byte   %01111000       ; 044E 1-89:  ****   \n        .byte   %00000000       ; 044F 1-89:         \n\n        .byte   %01111110       ; 0450 1-8a:  ****** \n        .byte   %01100000       ; 0451 1-8a:  **     \n        .byte   %01100000       ; 0452 1-8a:  **     \n        .byte   %01111000       ; 0453 1-8a:  ****   \n        .byte   %01100000       ; 0454 1-8a:  **     \n        .byte   %01100000       ; 0455 1-8a:  **     \n        .byte   %01111110       ; 0456 1-8a:  ****** \n        .byte   %00000000       ; 0457 1-8a:         \n\n        .byte   %01111110       ; 0458 1-8b:  ****** \n        .byte   %01100000       ; 0459 1-8b:  **     \n        .byte   %01100000       ; 045A 1-8b:  **     \n        .byte   %01111000       ; 045B 1-8b:  ****   \n        .byte   %01100000       ; 045C 1-8b:  **     \n        .byte   %01100000       ; 045D 1-8b:  **     \n        .byte   %01111110       ; 045E 1-8b:  ****** \n        .byte   %00000000       ; 045F 1-8b:         \n\n        .byte   %01111110       ; 0460 1-8c:  ****** \n        .byte   %01100000       ; 0461 1-8c:  **     \n        .byte   %01100000       ; 0462 1-8c:  **     \n        .byte   %01111000       ; 0463 1-8c:  ****   \n        .byte   %01100000       ; 0464 1-8c:  **     \n        .byte   %01100000       ; 0465 1-8c:  **     \n        .byte   %01100000       ; 0466 1-8c:  **     \n        .byte   %00000000       ; 0467 1-8c:         \n\n        .byte   %01111110       ; 0468 1-8d:  ****** \n        .byte   %01100000       ; 0469 1-8d:  **     \n        .byte   %01100000       ; 046A 1-8d:  **     \n        .byte   %01111000       ; 046B 1-8d:  ****   \n        .byte   %01100000       ; 046C 1-8d:  **     \n        .byte   %01100000       ; 046D 1-8d:  **     \n        .byte   %01100000       ; 046E 1-8d:  **     \n        .byte   %00000000       ; 046F 1-8d:         \n\n        .byte   %00111100       ; 0470 1-8e:   ****  \n        .byte   %01100110       ; 0471 1-8e:  **  ** \n        .byte   %01100000       ; 0472 1-8e:  **     \n        .byte   %01101110       ; 0473 1-8e:  ** *** \n        .byte   %01100110       ; 0474 1-8e:  **  ** \n        .byte   %01100110       ; 0475 1-8e:  **  ** \n        .byte   %00111100       ; 0476 1-8e:   ****  \n        .byte   %00000000       ; 0477 1-8e:         \n\n        .byte   %00111100       ; 0478 1-8f:   ****  \n        .byte   %01100110       ; 0479 1-8f:  **  ** \n        .byte   %01100000       ; 047A 1-8f:  **     \n        .byte   %01101110       ; 047B 1-8f:  ** *** \n        .byte   %01100110       ; 047C 1-8f:  **  ** \n        .byte   %01100110       ; 047D 1-8f:  **  ** \n        .byte   %00111100       ; 047E 1-8f:   ****  \n        .byte   %00000000       ; 047F 1-8f:         \n\n        .byte   %01100110       ; 0480 1-90:  **  ** \n        .byte   %01100110       ; 0481 1-90:  **  ** \n        .byte   %01100110       ; 0482 1-90:  **  ** \n        .byte   %01111110       ; 0483 1-90:  ****** \n        .byte   %01100110       ; 0484 1-90:  **  ** \n        .byte   %01100110       ; 0485 1-90:  **  ** \n        .byte   %01100110       ; 0486 1-90:  **  ** \n        .byte   %00000000       ; 0487 1-90:         \n\n        .byte   %01100110       ; 0488 1-91:  **  ** \n        .byte   %01100110       ; 0489 1-91:  **  ** \n        .byte   %01100110       ; 048A 1-91:  **  ** \n        .byte   %01111110       ; 048B 1-91:  ****** \n        .byte   %01100110       ; 048C 1-91:  **  ** \n        .byte   %01100110       ; 048D 1-91:  **  ** \n        .byte   %01100110       ; 048E 1-91:  **  ** \n        .byte   %00000000       ; 048F 1-91:         \n\n        .byte   %00111100       ; 0490 1-92:   ****  \n        .byte   %00011000       ; 0491 1-92:    **   \n        .byte   %00011000       ; 0492 1-92:    **   \n        .byte   %00011000       ; 0493 1-92:    **   \n        .byte   %00011000       ; 0494 1-92:    **   \n        .byte   %00011000       ; 0495 1-92:    **   \n        .byte   %00111100       ; 0496 1-92:   ****  \n        .byte   %00000000       ; 0497 1-92:         \n\n        .byte   %00111100       ; 0498 1-93:   ****  \n        .byte   %00011000       ; 0499 1-93:    **   \n        .byte   %00011000       ; 049A 1-93:    **   \n        .byte   %00011000       ; 049B 1-93:    **   \n        .byte   %00011000       ; 049C 1-93:    **   \n        .byte   %00011000       ; 049D 1-93:    **   \n        .byte   %00111100       ; 049E 1-93:   ****  \n        .byte   %00000000       ; 049F 1-93:         \n\n        .byte   %00011110       ; 04A0 1-94:    **** \n        .byte   %00001100       ; 04A1 1-94:     **  \n        .byte   %00001100       ; 04A2 1-94:     **  \n        .byte   %00001100       ; 04A3 1-94:     **  \n        .byte   %00001100       ; 04A4 1-94:     **  \n        .byte   %01101100       ; 04A5 1-94:  ** **  \n        .byte   %00111000       ; 04A6 1-94:   ***   \n        .byte   %00000000       ; 04A7 1-94:         \n\n        .byte   %00011110       ; 04A8 1-95:    **** \n        .byte   %00001100       ; 04A9 1-95:     **  \n        .byte   %00001100       ; 04AA 1-95:     **  \n        .byte   %00001100       ; 04AB 1-95:     **  \n        .byte   %00001100       ; 04AC 1-95:     **  \n        .byte   %01101100       ; 04AD 1-95:  ** **  \n        .byte   %00111000       ; 04AE 1-95:   ***   \n        .byte   %00000000       ; 04AF 1-95:         \n\n        .byte   %01100110       ; 04B0 1-96:  **  ** \n        .byte   %01101100       ; 04B1 1-96:  ** **  \n        .byte   %01111000       ; 04B2 1-96:  ****   \n        .byte   %01110000       ; 04B3 1-96:  ***    \n        .byte   %01111000       ; 04B4 1-96:  ****   \n        .byte   %01101100       ; 04B5 1-96:  ** **  \n        .byte   %01100110       ; 04B6 1-96:  **  ** \n        .byte   %00000000       ; 04B7 1-96:         \n\n        .byte   %01100110       ; 04B8 1-97:  **  ** \n        .byte   %01101100       ; 04B9 1-97:  ** **  \n        .byte   %01111000       ; 04BA 1-97:  ****   \n        .byte   %01110000       ; 04BB 1-97:  ***    \n        .byte   %01111000       ; 04BC 1-97:  ****   \n        .byte   %01101100       ; 04BD 1-97:  ** **  \n        .byte   %01100110       ; 04BE 1-97:  **  ** \n        .byte   %00000000       ; 04BF 1-97:         \n\n        .byte   %01100000       ; 04C0 1-98:  **     \n        .byte   %01100000       ; 04C1 1-98:  **     \n        .byte   %01100000       ; 04C2 1-98:  **     \n        .byte   %01100000       ; 04C3 1-98:  **     \n        .byte   %01100000       ; 04C4 1-98:  **     \n        .byte   %01100000       ; 04C5 1-98:  **     \n        .byte   %01111110       ; 04C6 1-98:  ****** \n        .byte   %00000000       ; 04C7 1-98:         \n\n        .byte   %01100000       ; 04C8 1-99:  **     \n        .byte   %01100000       ; 04C9 1-99:  **     \n        .byte   %01100000       ; 04CA 1-99:  **     \n        .byte   %01100000       ; 04CB 1-99:  **     \n        .byte   %01100000       ; 04CC 1-99:  **     \n        .byte   %01100000       ; 04CD 1-99:  **     \n        .byte   %01111110       ; 04CE 1-99:  ****** \n        .byte   %00000000       ; 04CF 1-99:         \n\n        .byte   %01100011       ; 04D0 1-9a:  **   **\n        .byte   %01110111       ; 04D1 1-9a:  *** ***\n        .byte   %01111111       ; 04D2 1-9a:  *******\n        .byte   %01101011       ; 04D3 1-9a:  ** * **\n        .byte   %01100011       ; 04D4 1-9a:  **   **\n        .byte   %01100011       ; 04D5 1-9a:  **   **\n        .byte   %01100011       ; 04D6 1-9a:  **   **\n        .byte   %00000000       ; 04D7 1-9a:         \n\n        .byte   %01100011       ; 04D8 1-9b:  **   **\n        .byte   %01110111       ; 04D9 1-9b:  *** ***\n        .byte   %01111111       ; 04DA 1-9b:  *******\n        .byte   %01101011       ; 04DB 1-9b:  ** * **\n        .byte   %01100011       ; 04DC 1-9b:  **   **\n        .byte   %01100011       ; 04DD 1-9b:  **   **\n        .byte   %01100011       ; 04DE 1-9b:  **   **\n        .byte   %00000000       ; 04DF 1-9b:         \n\n        .byte   %01100110       ; 04E0 1-9c:  **  ** \n        .byte   %01110110       ; 04E1 1-9c:  *** ** \n        .byte   %01111110       ; 04E2 1-9c:  ****** \n        .byte   %01111110       ; 04E3 1-9c:  ****** \n        .byte   %01101110       ; 04E4 1-9c:  ** *** \n        .byte   %01100110       ; 04E5 1-9c:  **  ** \n        .byte   %01100110       ; 04E6 1-9c:  **  ** \n        .byte   %00000000       ; 04E7 1-9c:         \n\n        .byte   %01100110       ; 04E8 1-9d:  **  ** \n        .byte   %01110110       ; 04E9 1-9d:  *** ** \n        .byte   %01111110       ; 04EA 1-9d:  ****** \n        .byte   %01111110       ; 04EB 1-9d:  ****** \n        .byte   %01101110       ; 04EC 1-9d:  ** *** \n        .byte   %01100110       ; 04ED 1-9d:  **  ** \n        .byte   %01100110       ; 04EE 1-9d:  **  ** \n        .byte   %00000000       ; 04EF 1-9d:         \n\n        .byte   %00111100       ; 04F0 1-9e:   ****  \n        .byte   %01100110       ; 04F1 1-9e:  **  ** \n        .byte   %01100110       ; 04F2 1-9e:  **  ** \n        .byte   %01100110       ; 04F3 1-9e:  **  ** \n        .byte   %01100110       ; 04F4 1-9e:  **  ** \n        .byte   %01100110       ; 04F5 1-9e:  **  ** \n        .byte   %00111100       ; 04F6 1-9e:   ****  \n        .byte   %00000000       ; 04F7 1-9e:         \n\n        .byte   %00111100       ; 04F8 1-9f:   ****  \n        .byte   %01100110       ; 04F9 1-9f:  **  ** \n        .byte   %01100110       ; 04FA 1-9f:  **  ** \n        .byte   %01100110       ; 04FB 1-9f:  **  ** \n        .byte   %01100110       ; 04FC 1-9f:  **  ** \n        .byte   %01100110       ; 04FD 1-9f:  **  ** \n        .byte   %00111100       ; 04FE 1-9f:   ****  \n        .byte   %00000000       ; 04FF 1-9f:         \n\n        .byte   %01111100       ; 0500 1-a0:  *****  \n        .byte   %01100110       ; 0501 1-a0:  **  ** \n        .byte   %01100110       ; 0502 1-a0:  **  ** \n        .byte   %01111100       ; 0503 1-a0:  *****  \n        .byte   %01100000       ; 0504 1-a0:  **     \n        .byte   %01100000       ; 0505 1-a0:  **     \n        .byte   %01100000       ; 0506 1-a0:  **     \n        .byte   %00000000       ; 0507 1-a0:         \n\n        .byte   %01111100       ; 0508 1-a1:  *****  \n        .byte   %01100110       ; 0509 1-a1:  **  ** \n        .byte   %01100110       ; 050A 1-a1:  **  ** \n        .byte   %01111100       ; 050B 1-a1:  *****  \n        .byte   %01100000       ; 050C 1-a1:  **     \n        .byte   %01100000       ; 050D 1-a1:  **     \n        .byte   %01100000       ; 050E 1-a1:  **     \n        .byte   %00000000       ; 050F 1-a1:         \n\n        .byte   %00111100       ; 0510 1-a2:   ****  \n        .byte   %01100110       ; 0511 1-a2:  **  ** \n        .byte   %01100110       ; 0512 1-a2:  **  ** \n        .byte   %01100110       ; 0513 1-a2:  **  ** \n        .byte   %01100110       ; 0514 1-a2:  **  ** \n        .byte   %00111100       ; 0515 1-a2:   ****  \n        .byte   %00001110       ; 0516 1-a2:     *** \n        .byte   %00000000       ; 0517 1-a2:         \n\n        .byte   %00111100       ; 0518 1-a3:   ****  \n        .byte   %01100110       ; 0519 1-a3:  **  ** \n        .byte   %01100110       ; 051A 1-a3:  **  ** \n        .byte   %01100110       ; 051B 1-a3:  **  ** \n        .byte   %01100110       ; 051C 1-a3:  **  ** \n        .byte   %00111100       ; 051D 1-a3:   ****  \n        .byte   %00001110       ; 051E 1-a3:     *** \n        .byte   %00000000       ; 051F 1-a3:         \n\n        .byte   %01111100       ; 0520 1-a4:  *****  \n        .byte   %01100110       ; 0521 1-a4:  **  ** \n        .byte   %01100110       ; 0522 1-a4:  **  ** \n        .byte   %01111100       ; 0523 1-a4:  *****  \n        .byte   %01111000       ; 0524 1-a4:  ****   \n        .byte   %01101100       ; 0525 1-a4:  ** **  \n        .byte   %01100110       ; 0526 1-a4:  **  ** \n        .byte   %00000000       ; 0527 1-a4:         \n\n        .byte   %01111100       ; 0528 1-a5:  *****  \n        .byte   %01100110       ; 0529 1-a5:  **  ** \n        .byte   %01100110       ; 052A 1-a5:  **  ** \n        .byte   %01111100       ; 052B 1-a5:  *****  \n        .byte   %01111000       ; 052C 1-a5:  ****   \n        .byte   %01101100       ; 052D 1-a5:  ** **  \n        .byte   %01100110       ; 052E 1-a5:  **  ** \n        .byte   %00000000       ; 052F 1-a5:         \n\n        .byte   %00111100       ; 0530 1-a6:   ****  \n        .byte   %01100110       ; 0531 1-a6:  **  ** \n        .byte   %01100000       ; 0532 1-a6:  **     \n        .byte   %00111100       ; 0533 1-a6:   ****  \n        .byte   %00000110       ; 0534 1-a6:      ** \n        .byte   %01100110       ; 0535 1-a6:  **  ** \n        .byte   %00111100       ; 0536 1-a6:   ****  \n        .byte   %00000000       ; 0537 1-a6:         \n\n        .byte   %00111100       ; 0538 1-a7:   ****  \n        .byte   %01100110       ; 0539 1-a7:  **  ** \n        .byte   %01100000       ; 053A 1-a7:  **     \n        .byte   %00111100       ; 053B 1-a7:   ****  \n        .byte   %00000110       ; 053C 1-a7:      ** \n        .byte   %01100110       ; 053D 1-a7:  **  ** \n        .byte   %00111100       ; 053E 1-a7:   ****  \n        .byte   %00000000       ; 053F 1-a7:         \n\n        .byte   %01111110       ; 0540 1-a8:  ****** \n        .byte   %00011000       ; 0541 1-a8:    **   \n        .byte   %00011000       ; 0542 1-a8:    **   \n        .byte   %00011000       ; 0543 1-a8:    **   \n        .byte   %00011000       ; 0544 1-a8:    **   \n        .byte   %00011000       ; 0545 1-a8:    **   \n        .byte   %00011000       ; 0546 1-a8:    **   \n        .byte   %00000000       ; 0547 1-a8:         \n\n        .byte   %01111110       ; 0548 1-a9:  ****** \n        .byte   %00011000       ; 0549 1-a9:    **   \n        .byte   %00011000       ; 054A 1-a9:    **   \n        .byte   %00011000       ; 054B 1-a9:    **   \n        .byte   %00011000       ; 054C 1-a9:    **   \n        .byte   %00011000       ; 054D 1-a9:    **   \n        .byte   %00011000       ; 054E 1-a9:    **   \n        .byte   %00000000       ; 054F 1-a9:         \n\n        .byte   %01100110       ; 0550 1-aa:  **  ** \n        .byte   %01100110       ; 0551 1-aa:  **  ** \n        .byte   %01100110       ; 0552 1-aa:  **  ** \n        .byte   %01100110       ; 0553 1-aa:  **  ** \n        .byte   %01100110       ; 0554 1-aa:  **  ** \n        .byte   %01100110       ; 0555 1-aa:  **  ** \n        .byte   %00111100       ; 0556 1-aa:   ****  \n        .byte   %00000000       ; 0557 1-aa:         \n\n        .byte   %01100110       ; 0558 1-ab:  **  ** \n        .byte   %01100110       ; 0559 1-ab:  **  ** \n        .byte   %01100110       ; 055A 1-ab:  **  ** \n        .byte   %01100110       ; 055B 1-ab:  **  ** \n        .byte   %01100110       ; 055C 1-ab:  **  ** \n        .byte   %01100110       ; 055D 1-ab:  **  ** \n        .byte   %00111100       ; 055E 1-ab:   ****  \n        .byte   %00000000       ; 055F 1-ab:         \n\n        .byte   %01100110       ; 0560 1-ac:  **  ** \n        .byte   %01100110       ; 0561 1-ac:  **  ** \n        .byte   %01100110       ; 0562 1-ac:  **  ** \n        .byte   %01100110       ; 0563 1-ac:  **  ** \n        .byte   %01100110       ; 0564 1-ac:  **  ** \n        .byte   %00111100       ; 0565 1-ac:   ****  \n        .byte   %00011000       ; 0566 1-ac:    **   \n        .byte   %00000000       ; 0567 1-ac:         \n\n        .byte   %01100110       ; 0568 1-ad:  **  ** \n        .byte   %01100110       ; 0569 1-ad:  **  ** \n        .byte   %01100110       ; 056A 1-ad:  **  ** \n        .byte   %01100110       ; 056B 1-ad:  **  ** \n        .byte   %01100110       ; 056C 1-ad:  **  ** \n        .byte   %00111100       ; 056D 1-ad:   ****  \n        .byte   %00011000       ; 056E 1-ad:    **   \n        .byte   %00000000       ; 056F 1-ad:         \n\n        .byte   %01100011       ; 0570 1-ae:  **   **\n        .byte   %01100011       ; 0571 1-ae:  **   **\n        .byte   %01100011       ; 0572 1-ae:  **   **\n        .byte   %01101011       ; 0573 1-ae:  ** * **\n        .byte   %01111111       ; 0574 1-ae:  *******\n        .byte   %01110111       ; 0575 1-ae:  *** ***\n        .byte   %01100011       ; 0576 1-ae:  **   **\n        .byte   %00000000       ; 0577 1-ae:         \n\n        .byte   %01100011       ; 0578 1-af:  **   **\n        .byte   %01100011       ; 0579 1-af:  **   **\n        .byte   %01100011       ; 057A 1-af:  **   **\n        .byte   %01101011       ; 057B 1-af:  ** * **\n        .byte   %01111111       ; 057C 1-af:  *******\n        .byte   %01110111       ; 057D 1-af:  *** ***\n        .byte   %01100011       ; 057E 1-af:  **   **\n        .byte   %00000000       ; 057F 1-af:         \n\n        .byte   %01100110       ; 0580 1-b0:  **  ** \n        .byte   %01100110       ; 0581 1-b0:  **  ** \n        .byte   %00111100       ; 0582 1-b0:   ****  \n        .byte   %00011000       ; 0583 1-b0:    **   \n        .byte   %00111100       ; 0584 1-b0:   ****  \n        .byte   %01100110       ; 0585 1-b0:  **  ** \n        .byte   %01100110       ; 0586 1-b0:  **  ** \n        .byte   %00000000       ; 0587 1-b0:         \n\n        .byte   %01100110       ; 0588 1-b1:  **  ** \n        .byte   %01100110       ; 0589 1-b1:  **  ** \n        .byte   %00111100       ; 058A 1-b1:   ****  \n        .byte   %00011000       ; 058B 1-b1:    **   \n        .byte   %00111100       ; 058C 1-b1:   ****  \n        .byte   %01100110       ; 058D 1-b1:  **  ** \n        .byte   %01100110       ; 058E 1-b1:  **  ** \n        .byte   %00000000       ; 058F 1-b1:         \n\n        .byte   %01100110       ; 0590 1-b2:  **  ** \n        .byte   %01100110       ; 0591 1-b2:  **  ** \n        .byte   %01100110       ; 0592 1-b2:  **  ** \n        .byte   %00111100       ; 0593 1-b2:   ****  \n        .byte   %00011000       ; 0594 1-b2:    **   \n        .byte   %00011000       ; 0595 1-b2:    **   \n        .byte   %00011000       ; 0596 1-b2:    **   \n        .byte   %00000000       ; 0597 1-b2:         \n\n        .byte   %01100110       ; 0598 1-b3:  **  ** \n        .byte   %01100110       ; 0599 1-b3:  **  ** \n        .byte   %01100110       ; 059A 1-b3:  **  ** \n        .byte   %00111100       ; 059B 1-b3:   ****  \n        .byte   %00011000       ; 059C 1-b3:    **   \n        .byte   %00011000       ; 059D 1-b3:    **   \n        .byte   %00011000       ; 059E 1-b3:    **   \n        .byte   %00000000       ; 059F 1-b3:         \n\n        .byte   %01111110       ; 05A0 1-b4:  ****** \n        .byte   %00000110       ; 05A1 1-b4:      ** \n        .byte   %00001100       ; 05A2 1-b4:     **  \n        .byte   %00011000       ; 05A3 1-b4:    **   \n        .byte   %00110000       ; 05A4 1-b4:   **    \n        .byte   %01100000       ; 05A5 1-b4:  **     \n        .byte   %01111110       ; 05A6 1-b4:  ****** \n        .byte   %00000000       ; 05A7 1-b4:         \n\n        .byte   %01111110       ; 05A8 1-b5:  ****** \n        .byte   %00000110       ; 05A9 1-b5:      ** \n        .byte   %00001100       ; 05AA 1-b5:     **  \n        .byte   %00011000       ; 05AB 1-b5:    **   \n        .byte   %00110000       ; 05AC 1-b5:   **    \n        .byte   %01100000       ; 05AD 1-b5:  **     \n        .byte   %01111110       ; 05AE 1-b5:  ****** \n        .byte   %00000000       ; 05AF 1-b5:         \n\n        .byte   %00111100       ; 05B0 1-b6:   ****  \n        .byte   %00110000       ; 05B1 1-b6:   **    \n        .byte   %00110000       ; 05B2 1-b6:   **    \n        .byte   %00110000       ; 05B3 1-b6:   **    \n        .byte   %00110000       ; 05B4 1-b6:   **    \n        .byte   %00110000       ; 05B5 1-b6:   **    \n        .byte   %00111100       ; 05B6 1-b6:   ****  \n        .byte   %00000000       ; 05B7 1-b6:         \n\n        .byte   %00111100       ; 05B8 1-b7:   ****  \n        .byte   %00110000       ; 05B9 1-b7:   **    \n        .byte   %00110000       ; 05BA 1-b7:   **    \n        .byte   %00110000       ; 05BB 1-b7:   **    \n        .byte   %00110000       ; 05BC 1-b7:   **    \n        .byte   %00110000       ; 05BD 1-b7:   **    \n        .byte   %00111100       ; 05BE 1-b7:   ****  \n        .byte   %00000000       ; 05BF 1-b7:         \n\n        .byte   %01100000       ; 05C0 1-b8:  **     \n        .byte   %00110000       ; 05C1 1-b8:   **    \n        .byte   %00011000       ; 05C2 1-b8:    **   \n        .byte   %00001100       ; 05C3 1-b8:     **  \n        .byte   %00000110       ; 05C4 1-b8:      ** \n        .byte   %00000011       ; 05C5 1-b8:       **\n        .byte   %00000000       ; 05C6 1-b8:         \n        .byte   %00000000       ; 05C7 1-b8:         \n\n        .byte   %01100000       ; 05C8 1-b9:  **     \n        .byte   %00110000       ; 05C9 1-b9:   **    \n        .byte   %00011000       ; 05CA 1-b9:    **   \n        .byte   %00001100       ; 05CB 1-b9:     **  \n        .byte   %00000110       ; 05CC 1-b9:      ** \n        .byte   %00000011       ; 05CD 1-b9:       **\n        .byte   %00000000       ; 05CE 1-b9:         \n        .byte   %00000000       ; 05CF 1-b9:         \n\n        .byte   %00111100       ; 05D0 1-ba:   ****  \n        .byte   %00001100       ; 05D1 1-ba:     **  \n        .byte   %00001100       ; 05D2 1-ba:     **  \n        .byte   %00001100       ; 05D3 1-ba:     **  \n        .byte   %00001100       ; 05D4 1-ba:     **  \n        .byte   %00001100       ; 05D5 1-ba:     **  \n        .byte   %00111100       ; 05D6 1-ba:   ****  \n        .byte   %00000000       ; 05D7 1-ba:         \n\n        .byte   %00111100       ; 05D8 1-bb:   ****  \n        .byte   %00001100       ; 05D9 1-bb:     **  \n        .byte   %00001100       ; 05DA 1-bb:     **  \n        .byte   %00001100       ; 05DB 1-bb:     **  \n        .byte   %00001100       ; 05DC 1-bb:     **  \n        .byte   %00001100       ; 05DD 1-bb:     **  \n        .byte   %00111100       ; 05DE 1-bb:   ****  \n        .byte   %00000000       ; 05DF 1-bb:         \n\n        .byte   %00000000       ; 05E0 1-bc:         \n        .byte   %00011000       ; 05E1 1-bc:    **   \n        .byte   %00111100       ; 05E2 1-bc:   ****  \n        .byte   %01100110       ; 05E3 1-bc:  **  ** \n        .byte   %00000000       ; 05E4 1-bc:         \n        .byte   %00000000       ; 05E5 1-bc:         \n        .byte   %00000000       ; 05E6 1-bc:         \n        .byte   %00000000       ; 05E7 1-bc:         \n\n        .byte   %00000000       ; 05E8 1-bd:         \n        .byte   %00011000       ; 05E9 1-bd:    **   \n        .byte   %00111100       ; 05EA 1-bd:   ****  \n        .byte   %01100110       ; 05EB 1-bd:  **  ** \n        .byte   %00000000       ; 05EC 1-bd:         \n        .byte   %00000000       ; 05ED 1-bd:         \n        .byte   %00000000       ; 05EE 1-bd:         \n        .byte   %00000000       ; 05EF 1-bd:         \n\n        .byte   %00000000       ; 05F0 1-be:         \n        .byte   %00000000       ; 05F1 1-be:         \n        .byte   %00000000       ; 05F2 1-be:         \n        .byte   %00000000       ; 05F3 1-be:         \n        .byte   %00000000       ; 05F4 1-be:         \n        .byte   %00000000       ; 05F5 1-be:         \n        .byte   %01111111       ; 05F6 1-be:  *******\n        .byte   %00000000       ; 05F7 1-be:         \n\n        .byte   %00000000       ; 05F8 1-bf:         \n        .byte   %00000000       ; 05F9 1-bf:         \n        .byte   %00000000       ; 05FA 1-bf:         \n        .byte   %00000000       ; 05FB 1-bf:         \n        .byte   %00000000       ; 05FC 1-bf:         \n        .byte   %00000000       ; 05FD 1-bf:         \n        .byte   %01111111       ; 05FE 1-bf:  *******\n        .byte   %00000000       ; 05FF 1-bf:         \n\n        .byte   %00011000       ; 0600 1-c0:    **   \n        .byte   %00011000       ; 0601 1-c0:    **   \n        .byte   %00011000       ; 0602 1-c0:    **   \n        .byte   %00000000       ; 0603 1-c0:         \n        .byte   %00000000       ; 0604 1-c0:         \n        .byte   %00000000       ; 0605 1-c0:         \n        .byte   %00000000       ; 0606 1-c0:         \n        .byte   %00000000       ; 0607 1-c0:         \n\n        .byte   %00011000       ; 0608 1-c1:    **   \n        .byte   %00011000       ; 0609 1-c1:    **   \n        .byte   %00011000       ; 060A 1-c1:    **   \n        .byte   %00000000       ; 060B 1-c1:         \n        .byte   %00000000       ; 060C 1-c1:         \n        .byte   %00000000       ; 060D 1-c1:         \n        .byte   %00000000       ; 060E 1-c1:         \n        .byte   %00000000       ; 060F 1-c1:         \n\n        .byte   %00000000       ; 0610 1-c2:         \n        .byte   %00000000       ; 0611 1-c2:         \n        .byte   %00111100       ; 0612 1-c2:   ****  \n        .byte   %00000110       ; 0613 1-c2:      ** \n        .byte   %00111110       ; 0614 1-c2:   ***** \n        .byte   %01100110       ; 0615 1-c2:  **  ** \n        .byte   %00111110       ; 0616 1-c2:   ***** \n        .byte   %00000000       ; 0617 1-c2:         \n\n        .byte   %00000000       ; 0618 1-c3:         \n        .byte   %00000000       ; 0619 1-c3:         \n        .byte   %00111100       ; 061A 1-c3:   ****  \n        .byte   %00000110       ; 061B 1-c3:      ** \n        .byte   %00111110       ; 061C 1-c3:   ***** \n        .byte   %01100110       ; 061D 1-c3:  **  ** \n        .byte   %00111110       ; 061E 1-c3:   ***** \n        .byte   %00000000       ; 061F 1-c3:         \n\n        .byte   %00000000       ; 0620 1-c4:         \n        .byte   %01100000       ; 0621 1-c4:  **     \n        .byte   %01100000       ; 0622 1-c4:  **     \n        .byte   %01111100       ; 0623 1-c4:  *****  \n        .byte   %01100110       ; 0624 1-c4:  **  ** \n        .byte   %01100110       ; 0625 1-c4:  **  ** \n        .byte   %01111100       ; 0626 1-c4:  *****  \n        .byte   %00000000       ; 0627 1-c4:         \n\n        .byte   %00000000       ; 0628 1-c5:         \n        .byte   %01100000       ; 0629 1-c5:  **     \n        .byte   %01100000       ; 062A 1-c5:  **     \n        .byte   %01111100       ; 062B 1-c5:  *****  \n        .byte   %01100110       ; 062C 1-c5:  **  ** \n        .byte   %01100110       ; 062D 1-c5:  **  ** \n        .byte   %01111100       ; 062E 1-c5:  *****  \n        .byte   %00000000       ; 062F 1-c5:         \n\n        .byte   %00000000       ; 0630 1-c6:         \n        .byte   %00000000       ; 0631 1-c6:         \n        .byte   %00111100       ; 0632 1-c6:   ****  \n        .byte   %01100000       ; 0633 1-c6:  **     \n        .byte   %01100000       ; 0634 1-c6:  **     \n        .byte   %01100000       ; 0635 1-c6:  **     \n        .byte   %00111100       ; 0636 1-c6:   ****  \n        .byte   %00000000       ; 0637 1-c6:         \n\n        .byte   %00000000       ; 0638 1-c7:         \n        .byte   %00000000       ; 0639 1-c7:         \n        .byte   %00111100       ; 063A 1-c7:   ****  \n        .byte   %01100000       ; 063B 1-c7:  **     \n        .byte   %01100000       ; 063C 1-c7:  **     \n        .byte   %01100000       ; 063D 1-c7:  **     \n        .byte   %00111100       ; 063E 1-c7:   ****  \n        .byte   %00000000       ; 063F 1-c7:         \n\n        .byte   %00000000       ; 0640 1-c8:         \n        .byte   %00000110       ; 0641 1-c8:      ** \n        .byte   %00000110       ; 0642 1-c8:      ** \n        .byte   %00111110       ; 0643 1-c8:   ***** \n        .byte   %01100110       ; 0644 1-c8:  **  ** \n        .byte   %01100110       ; 0645 1-c8:  **  ** \n        .byte   %00111110       ; 0646 1-c8:   ***** \n        .byte   %00000000       ; 0647 1-c8:         \n\n        .byte   %00000000       ; 0648 1-c9:         \n        .byte   %00000110       ; 0649 1-c9:      ** \n        .byte   %00000110       ; 064A 1-c9:      ** \n        .byte   %00111110       ; 064B 1-c9:   ***** \n        .byte   %01100110       ; 064C 1-c9:  **  ** \n        .byte   %01100110       ; 064D 1-c9:  **  ** \n        .byte   %00111110       ; 064E 1-c9:   ***** \n        .byte   %00000000       ; 064F 1-c9:         \n\n        .byte   %00000000       ; 0650 1-ca:         \n        .byte   %00000000       ; 0651 1-ca:         \n        .byte   %00111100       ; 0652 1-ca:   ****  \n        .byte   %01100110       ; 0653 1-ca:  **  ** \n        .byte   %01111110       ; 0654 1-ca:  ****** \n        .byte   %01100000       ; 0655 1-ca:  **     \n        .byte   %00111100       ; 0656 1-ca:   ****  \n        .byte   %00000000       ; 0657 1-ca:         \n\n        .byte   %00000000       ; 0658 1-cb:         \n        .byte   %00000000       ; 0659 1-cb:         \n        .byte   %00111100       ; 065A 1-cb:   ****  \n        .byte   %01100110       ; 065B 1-cb:  **  ** \n        .byte   %01111110       ; 065C 1-cb:  ****** \n        .byte   %01100000       ; 065D 1-cb:  **     \n        .byte   %00111100       ; 065E 1-cb:   ****  \n        .byte   %00000000       ; 065F 1-cb:         \n\n        .byte   %00000000       ; 0660 1-cc:         \n        .byte   %00001110       ; 0661 1-cc:     *** \n        .byte   %00011000       ; 0662 1-cc:    **   \n        .byte   %00111110       ; 0663 1-cc:   ***** \n        .byte   %00011000       ; 0664 1-cc:    **   \n        .byte   %00011000       ; 0665 1-cc:    **   \n        .byte   %00011000       ; 0666 1-cc:    **   \n        .byte   %00000000       ; 0667 1-cc:         \n\n        .byte   %00000000       ; 0668 1-cd:         \n        .byte   %00001110       ; 0669 1-cd:     *** \n        .byte   %00011000       ; 066A 1-cd:    **   \n        .byte   %00111110       ; 066B 1-cd:   ***** \n        .byte   %00011000       ; 066C 1-cd:    **   \n        .byte   %00011000       ; 066D 1-cd:    **   \n        .byte   %00011000       ; 066E 1-cd:    **   \n        .byte   %00000000       ; 066F 1-cd:         \n\n        .byte   %00000000       ; 0670 1-ce:         \n        .byte   %00000000       ; 0671 1-ce:         \n        .byte   %00111110       ; 0672 1-ce:   ***** \n        .byte   %01100110       ; 0673 1-ce:  **  ** \n        .byte   %01100110       ; 0674 1-ce:  **  ** \n        .byte   %00111110       ; 0675 1-ce:   ***** \n        .byte   %00000110       ; 0676 1-ce:      ** \n        .byte   %01111100       ; 0677 1-ce:  *****  \n\n        .byte   %00000000       ; 0678 1-cf:         \n        .byte   %00000000       ; 0679 1-cf:         \n        .byte   %00111110       ; 067A 1-cf:   ***** \n        .byte   %01100110       ; 067B 1-cf:  **  ** \n        .byte   %01100110       ; 067C 1-cf:  **  ** \n        .byte   %00111110       ; 067D 1-cf:   ***** \n        .byte   %00000110       ; 067E 1-cf:      ** \n        .byte   %01111100       ; 067F 1-cf:  *****  \n\n        .byte   %00000000       ; 0680 1-d0:         \n        .byte   %01100000       ; 0681 1-d0:  **     \n        .byte   %01100000       ; 0682 1-d0:  **     \n        .byte   %01111100       ; 0683 1-d0:  *****  \n        .byte   %01100110       ; 0684 1-d0:  **  ** \n        .byte   %01100110       ; 0685 1-d0:  **  ** \n        .byte   %01100110       ; 0686 1-d0:  **  ** \n        .byte   %00000000       ; 0687 1-d0:         \n\n        .byte   %00000000       ; 0688 1-d1:         \n        .byte   %01100000       ; 0689 1-d1:  **     \n        .byte   %01100000       ; 068A 1-d1:  **     \n        .byte   %01111100       ; 068B 1-d1:  *****  \n        .byte   %01100110       ; 068C 1-d1:  **  ** \n        .byte   %01100110       ; 068D 1-d1:  **  ** \n        .byte   %01100110       ; 068E 1-d1:  **  ** \n        .byte   %00000000       ; 068F 1-d1:         \n\n        .byte   %00000000       ; 0690 1-d2:         \n        .byte   %00011000       ; 0691 1-d2:    **   \n        .byte   %00000000       ; 0692 1-d2:         \n        .byte   %00111000       ; 0693 1-d2:   ***   \n        .byte   %00011000       ; 0694 1-d2:    **   \n        .byte   %00011000       ; 0695 1-d2:    **   \n        .byte   %00111100       ; 0696 1-d2:   ****  \n        .byte   %00000000       ; 0697 1-d2:         \n\n        .byte   %00000000       ; 0698 1-d3:         \n        .byte   %00011000       ; 0699 1-d3:    **   \n        .byte   %00000000       ; 069A 1-d3:         \n        .byte   %00111000       ; 069B 1-d3:   ***   \n        .byte   %00011000       ; 069C 1-d3:    **   \n        .byte   %00011000       ; 069D 1-d3:    **   \n        .byte   %00111100       ; 069E 1-d3:   ****  \n        .byte   %00000000       ; 069F 1-d3:         \n\n        .byte   %00000000       ; 06A0 1-d4:         \n        .byte   %00000110       ; 06A1 1-d4:      ** \n        .byte   %00000000       ; 06A2 1-d4:         \n        .byte   %00000110       ; 06A3 1-d4:      ** \n        .byte   %00000110       ; 06A4 1-d4:      ** \n        .byte   %00000110       ; 06A5 1-d4:      ** \n        .byte   %00000110       ; 06A6 1-d4:      ** \n        .byte   %00111100       ; 06A7 1-d4:   ****  \n\n        .byte   %00000000       ; 06A8 1-d5:         \n        .byte   %00000110       ; 06A9 1-d5:      ** \n        .byte   %00000000       ; 06AA 1-d5:         \n        .byte   %00000110       ; 06AB 1-d5:      ** \n        .byte   %00000110       ; 06AC 1-d5:      ** \n        .byte   %00000110       ; 06AD 1-d5:      ** \n        .byte   %00000110       ; 06AE 1-d5:      ** \n        .byte   %00111100       ; 06AF 1-d5:   ****  \n\n        .byte   %00000000       ; 06B0 1-d6:         \n        .byte   %01100000       ; 06B1 1-d6:  **     \n        .byte   %01100000       ; 06B2 1-d6:  **     \n        .byte   %01101100       ; 06B3 1-d6:  ** **  \n        .byte   %01111000       ; 06B4 1-d6:  ****   \n        .byte   %01101100       ; 06B5 1-d6:  ** **  \n        .byte   %01100110       ; 06B6 1-d6:  **  ** \n        .byte   %00000000       ; 06B7 1-d6:         \n\n        .byte   %00000000       ; 06B8 1-d7:         \n        .byte   %01100000       ; 06B9 1-d7:  **     \n        .byte   %01100000       ; 06BA 1-d7:  **     \n        .byte   %01101100       ; 06BB 1-d7:  ** **  \n        .byte   %01111000       ; 06BC 1-d7:  ****   \n        .byte   %01101100       ; 06BD 1-d7:  ** **  \n        .byte   %01100110       ; 06BE 1-d7:  **  ** \n        .byte   %00000000       ; 06BF 1-d7:         \n\n        .byte   %00000000       ; 06C0 1-d8:         \n        .byte   %00111000       ; 06C1 1-d8:   ***   \n        .byte   %00011000       ; 06C2 1-d8:    **   \n        .byte   %00011000       ; 06C3 1-d8:    **   \n        .byte   %00011000       ; 06C4 1-d8:    **   \n        .byte   %00011000       ; 06C5 1-d8:    **   \n        .byte   %00111100       ; 06C6 1-d8:   ****  \n        .byte   %00000000       ; 06C7 1-d8:         \n\n        .byte   %00000000       ; 06C8 1-d9:         \n        .byte   %00111000       ; 06C9 1-d9:   ***   \n        .byte   %00011000       ; 06CA 1-d9:    **   \n        .byte   %00011000       ; 06CB 1-d9:    **   \n        .byte   %00011000       ; 06CC 1-d9:    **   \n        .byte   %00011000       ; 06CD 1-d9:    **   \n        .byte   %00111100       ; 06CE 1-d9:   ****  \n        .byte   %00000000       ; 06CF 1-d9:         \n\n        .byte   %00000000       ; 06D0 1-da:         \n        .byte   %00000000       ; 06D1 1-da:         \n        .byte   %01100110       ; 06D2 1-da:  **  ** \n        .byte   %01111111       ; 06D3 1-da:  *******\n        .byte   %01111111       ; 06D4 1-da:  *******\n        .byte   %01101011       ; 06D5 1-da:  ** * **\n        .byte   %01100011       ; 06D6 1-da:  **   **\n        .byte   %00000000       ; 06D7 1-da:         \n\n        .byte   %00000000       ; 06D8 1-db:         \n        .byte   %00000000       ; 06D9 1-db:         \n        .byte   %01100110       ; 06DA 1-db:  **  ** \n        .byte   %01111111       ; 06DB 1-db:  *******\n        .byte   %01111111       ; 06DC 1-db:  *******\n        .byte   %01101011       ; 06DD 1-db:  ** * **\n        .byte   %01100011       ; 06DE 1-db:  **   **\n        .byte   %00000000       ; 06DF 1-db:         \n\n        .byte   %00000000       ; 06E0 1-dc:         \n        .byte   %00000000       ; 06E1 1-dc:         \n        .byte   %01111100       ; 06E2 1-dc:  *****  \n        .byte   %01100110       ; 06E3 1-dc:  **  ** \n        .byte   %01100110       ; 06E4 1-dc:  **  ** \n        .byte   %01100110       ; 06E5 1-dc:  **  ** \n        .byte   %01100110       ; 06E6 1-dc:  **  ** \n        .byte   %00000000       ; 06E7 1-dc:         \n\n        .byte   %00000000       ; 06E8 1-dd:         \n        .byte   %00000000       ; 06E9 1-dd:         \n        .byte   %01111100       ; 06EA 1-dd:  *****  \n        .byte   %01100110       ; 06EB 1-dd:  **  ** \n        .byte   %01100110       ; 06EC 1-dd:  **  ** \n        .byte   %01100110       ; 06ED 1-dd:  **  ** \n        .byte   %01100110       ; 06EE 1-dd:  **  ** \n        .byte   %00000000       ; 06EF 1-dd:         \n\n        .byte   %00000000       ; 06F0 1-de:         \n        .byte   %00000000       ; 06F1 1-de:         \n        .byte   %00111100       ; 06F2 1-de:   ****  \n        .byte   %01100110       ; 06F3 1-de:  **  ** \n        .byte   %01100110       ; 06F4 1-de:  **  ** \n        .byte   %01100110       ; 06F5 1-de:  **  ** \n        .byte   %00111100       ; 06F6 1-de:   ****  \n        .byte   %00000000       ; 06F7 1-de:         \n\n        .byte   %00000000       ; 06F8 1-df:         \n        .byte   %00000000       ; 06F9 1-df:         \n        .byte   %00111100       ; 06FA 1-df:   ****  \n        .byte   %01100110       ; 06FB 1-df:  **  ** \n        .byte   %01100110       ; 06FC 1-df:  **  ** \n        .byte   %01100110       ; 06FD 1-df:  **  ** \n        .byte   %00111100       ; 06FE 1-df:   ****  \n        .byte   %00000000       ; 06FF 1-df:         \n\n        .byte   %00000000       ; 0700 1-e0:         \n        .byte   %00000000       ; 0701 1-e0:         \n        .byte   %01111100       ; 0702 1-e0:  *****  \n        .byte   %01100110       ; 0703 1-e0:  **  ** \n        .byte   %01100110       ; 0704 1-e0:  **  ** \n        .byte   %01111100       ; 0705 1-e0:  *****  \n        .byte   %01100000       ; 0706 1-e0:  **     \n        .byte   %01100000       ; 0707 1-e0:  **     \n\n        .byte   %00000000       ; 0708 1-e1:         \n        .byte   %00000000       ; 0709 1-e1:         \n        .byte   %01111100       ; 070A 1-e1:  *****  \n        .byte   %01100110       ; 070B 1-e1:  **  ** \n        .byte   %01100110       ; 070C 1-e1:  **  ** \n        .byte   %01111100       ; 070D 1-e1:  *****  \n        .byte   %01100000       ; 070E 1-e1:  **     \n        .byte   %01100000       ; 070F 1-e1:  **     \n\n        .byte   %00000000       ; 0710 1-e2:         \n        .byte   %00000000       ; 0711 1-e2:         \n        .byte   %00111110       ; 0712 1-e2:   ***** \n        .byte   %01100110       ; 0713 1-e2:  **  ** \n        .byte   %01100110       ; 0714 1-e2:  **  ** \n        .byte   %00111110       ; 0715 1-e2:   ***** \n        .byte   %00000110       ; 0716 1-e2:      ** \n        .byte   %00000110       ; 0717 1-e2:      ** \n\n        .byte   %00000000       ; 0718 1-e3:         \n        .byte   %00000000       ; 0719 1-e3:         \n        .byte   %00111110       ; 071A 1-e3:   ***** \n        .byte   %01100110       ; 071B 1-e3:  **  ** \n        .byte   %01100110       ; 071C 1-e3:  **  ** \n        .byte   %00111110       ; 071D 1-e3:   ***** \n        .byte   %00000110       ; 071E 1-e3:      ** \n        .byte   %00000110       ; 071F 1-e3:      ** \n\n        .byte   %00000000       ; 0720 1-e4:         \n        .byte   %00000000       ; 0721 1-e4:         \n        .byte   %01111100       ; 0722 1-e4:  *****  \n        .byte   %01100110       ; 0723 1-e4:  **  ** \n        .byte   %01100000       ; 0724 1-e4:  **     \n        .byte   %01100000       ; 0725 1-e4:  **     \n        .byte   %01100000       ; 0726 1-e4:  **     \n        .byte   %00000000       ; 0727 1-e4:         \n\n        .byte   %00000000       ; 0728 1-e5:         \n        .byte   %00000000       ; 0729 1-e5:         \n        .byte   %01111100       ; 072A 1-e5:  *****  \n        .byte   %01100110       ; 072B 1-e5:  **  ** \n        .byte   %01100000       ; 072C 1-e5:  **     \n        .byte   %01100000       ; 072D 1-e5:  **     \n        .byte   %01100000       ; 072E 1-e5:  **     \n        .byte   %00000000       ; 072F 1-e5:         \n\n        .byte   %00000000       ; 0730 1-e6:         \n        .byte   %00000000       ; 0731 1-e6:         \n        .byte   %00111110       ; 0732 1-e6:   ***** \n        .byte   %01100000       ; 0733 1-e6:  **     \n        .byte   %00111100       ; 0734 1-e6:   ****  \n        .byte   %00000110       ; 0735 1-e6:      ** \n        .byte   %01111100       ; 0736 1-e6:  *****  \n        .byte   %00000000       ; 0737 1-e6:         \n\n        .byte   %00000000       ; 0738 1-e7:         \n        .byte   %00000000       ; 0739 1-e7:         \n        .byte   %00111110       ; 073A 1-e7:   ***** \n        .byte   %01100000       ; 073B 1-e7:  **     \n        .byte   %00111100       ; 073C 1-e7:   ****  \n        .byte   %00000110       ; 073D 1-e7:      ** \n        .byte   %01111100       ; 073E 1-e7:  *****  \n        .byte   %00000000       ; 073F 1-e7:         \n\n        .byte   %00000000       ; 0740 1-e8:         \n        .byte   %00011000       ; 0741 1-e8:    **   \n        .byte   %01111110       ; 0742 1-e8:  ****** \n        .byte   %00011000       ; 0743 1-e8:    **   \n        .byte   %00011000       ; 0744 1-e8:    **   \n        .byte   %00011000       ; 0745 1-e8:    **   \n        .byte   %00001110       ; 0746 1-e8:     *** \n        .byte   %00000000       ; 0747 1-e8:         \n\n        .byte   %00000000       ; 0748 1-e9:         \n        .byte   %00011000       ; 0749 1-e9:    **   \n        .byte   %01111110       ; 074A 1-e9:  ****** \n        .byte   %00011000       ; 074B 1-e9:    **   \n        .byte   %00011000       ; 074C 1-e9:    **   \n        .byte   %00011000       ; 074D 1-e9:    **   \n        .byte   %00001110       ; 074E 1-e9:     *** \n        .byte   %00000000       ; 074F 1-e9:         \n\n        .byte   %00000000       ; 0750 1-ea:         \n        .byte   %00000000       ; 0751 1-ea:         \n        .byte   %01100110       ; 0752 1-ea:  **  ** \n        .byte   %01100110       ; 0753 1-ea:  **  ** \n        .byte   %01100110       ; 0754 1-ea:  **  ** \n        .byte   %01100110       ; 0755 1-ea:  **  ** \n        .byte   %00111110       ; 0756 1-ea:   ***** \n        .byte   %00000000       ; 0757 1-ea:         \n\n        .byte   %00000000       ; 0758 1-eb:         \n        .byte   %00000000       ; 0759 1-eb:         \n        .byte   %01100110       ; 075A 1-eb:  **  ** \n        .byte   %01100110       ; 075B 1-eb:  **  ** \n        .byte   %01100110       ; 075C 1-eb:  **  ** \n        .byte   %01100110       ; 075D 1-eb:  **  ** \n        .byte   %00111110       ; 075E 1-eb:   ***** \n        .byte   %00000000       ; 075F 1-eb:         \n\n        .byte   %00000000       ; 0760 1-ec:         \n        .byte   %00000000       ; 0761 1-ec:         \n        .byte   %01100110       ; 0762 1-ec:  **  ** \n        .byte   %01100110       ; 0763 1-ec:  **  ** \n        .byte   %01100110       ; 0764 1-ec:  **  ** \n        .byte   %00111100       ; 0765 1-ec:   ****  \n        .byte   %00011000       ; 0766 1-ec:    **   \n        .byte   %00000000       ; 0767 1-ec:         \n\n        .byte   %00000000       ; 0768 1-ed:         \n        .byte   %00000000       ; 0769 1-ed:         \n        .byte   %01100110       ; 076A 1-ed:  **  ** \n        .byte   %01100110       ; 076B 1-ed:  **  ** \n        .byte   %01100110       ; 076C 1-ed:  **  ** \n        .byte   %00111100       ; 076D 1-ed:   ****  \n        .byte   %00011000       ; 076E 1-ed:    **   \n        .byte   %00000000       ; 076F 1-ed:         \n\n        .byte   %00000000       ; 0770 1-ee:         \n        .byte   %00000000       ; 0771 1-ee:         \n        .byte   %01100011       ; 0772 1-ee:  **   **\n        .byte   %01101011       ; 0773 1-ee:  ** * **\n        .byte   %01111111       ; 0774 1-ee:  *******\n        .byte   %00111110       ; 0775 1-ee:   ***** \n        .byte   %00110110       ; 0776 1-ee:   ** ** \n        .byte   %00000000       ; 0777 1-ee:         \n\n        .byte   %00000000       ; 0778 1-ef:         \n        .byte   %00000000       ; 0779 1-ef:         \n        .byte   %01100011       ; 077A 1-ef:  **   **\n        .byte   %01101011       ; 077B 1-ef:  ** * **\n        .byte   %01111111       ; 077C 1-ef:  *******\n        .byte   %00111110       ; 077D 1-ef:   ***** \n        .byte   %00110110       ; 077E 1-ef:   ** ** \n        .byte   %00000000       ; 077F 1-ef:         \n\n        .byte   %00000000       ; 0780 1-f0:         \n        .byte   %00000000       ; 0781 1-f0:         \n        .byte   %01100110       ; 0782 1-f0:  **  ** \n        .byte   %00111100       ; 0783 1-f0:   ****  \n        .byte   %00011000       ; 0784 1-f0:    **   \n        .byte   %00111100       ; 0785 1-f0:   ****  \n        .byte   %01100110       ; 0786 1-f0:  **  ** \n        .byte   %00000000       ; 0787 1-f0:         \n\n        .byte   %00000000       ; 0788 1-f1:         \n        .byte   %00000000       ; 0789 1-f1:         \n        .byte   %01100110       ; 078A 1-f1:  **  ** \n        .byte   %00111100       ; 078B 1-f1:   ****  \n        .byte   %00011000       ; 078C 1-f1:    **   \n        .byte   %00111100       ; 078D 1-f1:   ****  \n        .byte   %01100110       ; 078E 1-f1:  **  ** \n        .byte   %00000000       ; 078F 1-f1:         \n\n        .byte   %00000000       ; 0790 1-f2:         \n        .byte   %00000000       ; 0791 1-f2:         \n        .byte   %01100110       ; 0792 1-f2:  **  ** \n        .byte   %01100110       ; 0793 1-f2:  **  ** \n        .byte   %01100110       ; 0794 1-f2:  **  ** \n        .byte   %00111110       ; 0795 1-f2:   ***** \n        .byte   %00001100       ; 0796 1-f2:     **  \n        .byte   %01111000       ; 0797 1-f2:  ****   \n\n        .byte   %00000000       ; 0798 1-f3:         \n        .byte   %00000000       ; 0799 1-f3:         \n        .byte   %01100110       ; 079A 1-f3:  **  ** \n        .byte   %01100110       ; 079B 1-f3:  **  ** \n        .byte   %01100110       ; 079C 1-f3:  **  ** \n        .byte   %00111110       ; 079D 1-f3:   ***** \n        .byte   %00001100       ; 079E 1-f3:     **  \n        .byte   %01111000       ; 079F 1-f3:  ****   \n\n        .byte   %00000000       ; 07A0 1-f4:         \n        .byte   %00000000       ; 07A1 1-f4:         \n        .byte   %01111110       ; 07A2 1-f4:  ****** \n        .byte   %00001100       ; 07A3 1-f4:     **  \n        .byte   %00011000       ; 07A4 1-f4:    **   \n        .byte   %00110000       ; 07A5 1-f4:   **    \n        .byte   %01111110       ; 07A6 1-f4:  ****** \n        .byte   %00000000       ; 07A7 1-f4:         \n\n        .byte   %00000000       ; 07A8 1-f5:         \n        .byte   %00000000       ; 07A9 1-f5:         \n        .byte   %01111110       ; 07AA 1-f5:  ****** \n        .byte   %00001100       ; 07AB 1-f5:     **  \n        .byte   %00011000       ; 07AC 1-f5:    **   \n        .byte   %00110000       ; 07AD 1-f5:   **    \n        .byte   %01111110       ; 07AE 1-f5:  ****** \n        .byte   %00000000       ; 07AF 1-f5:         \n\n        .byte   %00011100       ; 07B0 1-f6:    ***  \n        .byte   %00110000       ; 07B1 1-f6:   **    \n        .byte   %00011000       ; 07B2 1-f6:    **   \n        .byte   %01110000       ; 07B3 1-f6:  ***    \n        .byte   %00011000       ; 07B4 1-f6:    **   \n        .byte   %00110000       ; 07B5 1-f6:   **    \n        .byte   %00011100       ; 07B6 1-f6:    ***  \n        .byte   %00000000       ; 07B7 1-f6:         \n\n        .byte   %00011100       ; 07B8 1-f7:    ***  \n        .byte   %00110000       ; 07B9 1-f7:   **    \n        .byte   %00011000       ; 07BA 1-f7:    **   \n        .byte   %01110000       ; 07BB 1-f7:  ***    \n        .byte   %00011000       ; 07BC 1-f7:    **   \n        .byte   %00110000       ; 07BD 1-f7:   **    \n        .byte   %00011100       ; 07BE 1-f7:    ***  \n        .byte   %00000000       ; 07BF 1-f7:         \n\n        .byte   %00011000       ; 07C0 1-f8:    **   \n        .byte   %00011000       ; 07C1 1-f8:    **   \n        .byte   %00011000       ; 07C2 1-f8:    **   \n        .byte   %00000000       ; 07C3 1-f8:         \n        .byte   %00000000       ; 07C4 1-f8:         \n        .byte   %00011000       ; 07C5 1-f8:    **   \n        .byte   %00011000       ; 07C6 1-f8:    **   \n        .byte   %00011000       ; 07C7 1-f8:    **   \n\n        .byte   %00011000       ; 07C8 1-f9:    **   \n        .byte   %00011000       ; 07C9 1-f9:    **   \n        .byte   %00011000       ; 07CA 1-f9:    **   \n        .byte   %00000000       ; 07CB 1-f9:         \n        .byte   %00000000       ; 07CC 1-f9:         \n        .byte   %00011000       ; 07CD 1-f9:    **   \n        .byte   %00011000       ; 07CE 1-f9:    **   \n        .byte   %00011000       ; 07CF 1-f9:    **   \n\n        .byte   %00111000       ; 07D0 1-fa:   ***   \n        .byte   %00001100       ; 07D1 1-fa:     **  \n        .byte   %00011000       ; 07D2 1-fa:    **   \n        .byte   %00001110       ; 07D3 1-fa:     *** \n        .byte   %00011000       ; 07D4 1-fa:    **   \n        .byte   %00001100       ; 07D5 1-fa:     **  \n        .byte   %00111000       ; 07D6 1-fa:   ***   \n        .byte   %00000000       ; 07D7 1-fa:         \n\n        .byte   %00111000       ; 07D8 1-fb:   ***   \n        .byte   %00001100       ; 07D9 1-fb:     **  \n        .byte   %00011000       ; 07DA 1-fb:    **   \n        .byte   %00001110       ; 07DB 1-fb:     *** \n        .byte   %00011000       ; 07DC 1-fb:    **   \n        .byte   %00001100       ; 07DD 1-fb:     **  \n        .byte   %00111000       ; 07DE 1-fb:   ***   \n        .byte   %00000000       ; 07DF 1-fb:         \n\n        .byte   %00110011       ; 07E0 1-fc:   **  **\n        .byte   %11111111       ; 07E1 1-fc: ********\n        .byte   %11001100       ; 07E2 1-fc: **  **  \n        .byte   %00000000       ; 07E3 1-fc:         \n        .byte   %00000000       ; 07E4 1-fc:         \n        .byte   %00000000       ; 07E5 1-fc:         \n        .byte   %00000000       ; 07E6 1-fc:         \n        .byte   %00000000       ; 07E7 1-fc:         \n\n        .byte   %00110011       ; 07E8 1-fd:   **  **\n        .byte   %11111111       ; 07E9 1-fd: ********\n        .byte   %11001100       ; 07EA 1-fd: **  **  \n        .byte   %00000000       ; 07EB 1-fd:         \n        .byte   %00000000       ; 07EC 1-fd:         \n        .byte   %00000000       ; 07ED 1-fd:         \n        .byte   %00000000       ; 07EE 1-fd:         \n        .byte   %00000000       ; 07EF 1-fd:         \n\n        .byte   %00000000       ; 07F0 1-fe:         \n        .byte   %00000000       ; 07F1 1-fe:         \n        .byte   %00000000       ; 07F2 1-fe:         \n        .byte   %00000000       ; 07F3 1-fe:         \n        .byte   %00000000       ; 07F4 1-fe:         \n        .byte   %00000000       ; 07F5 1-fe:         \n        .byte   %00000000       ; 07F6 1-fe:         \n        .byte   %00000000       ; 07F7 1-fe:         \n\n        .byte   %00000000       ; 07F8 1-ff:         \n        .byte   %00000000       ; 07F9 1-ff:         \n        .byte   %00000000       ; 07FA 1-ff:         \n        .byte   %00000000       ; 07FB 1-ff:         \n        .byte   %00000000       ; 07FC 1-ff:         \n        .byte   %00000000       ; 07FD 1-ff:         \n        .byte   %00000000       ; 07FE 1-ff:         \n        .byte   %00000000       ; 07FF 1-ff:         \n\n        .byte   %11111111       ; 0800 2-00: ********\n        .byte   %11111111       ; 0801 2-00: ********\n        .byte   %11111111       ; 0802 2-00: ********\n        .byte   %11111111       ; 0803 2-00: ********\n        .byte   %11111111       ; 0804 2-00: ********\n        .byte   %11111111       ; 0805 2-00: ********\n        .byte   %11111111       ; 0806 2-00: ********\n        .byte   %11111111       ; 0807 2-00: ********\n\n        .byte   %11111111       ; 0808 2-01: ********\n        .byte   %11111111       ; 0809 2-01: ********\n        .byte   %11111111       ; 080A 2-01: ********\n        .byte   %11111111       ; 080B 2-01: ********\n        .byte   %11111111       ; 080C 2-01: ********\n        .byte   %11111111       ; 080D 2-01: ********\n        .byte   %11111111       ; 080E 2-01: ********\n        .byte   %11111111       ; 080F 2-01: ********\n\n        .byte   %00110011       ; 0810 2-02:   **  **\n        .byte   %00110011       ; 0811 2-02:   **  **\n        .byte   %11001100       ; 0812 2-02: **  **  \n        .byte   %11001100       ; 0813 2-02: **  **  \n        .byte   %00110011       ; 0814 2-02:   **  **\n        .byte   %00110011       ; 0815 2-02:   **  **\n        .byte   %11001100       ; 0816 2-02: **  **  \n        .byte   %11001100       ; 0817 2-02: **  **  \n\n        .byte   %00110011       ; 0818 2-03:   **  **\n        .byte   %00110011       ; 0819 2-03:   **  **\n        .byte   %11001100       ; 081A 2-03: **  **  \n        .byte   %11001100       ; 081B 2-03: **  **  \n        .byte   %00110011       ; 081C 2-03:   **  **\n        .byte   %00110011       ; 081D 2-03:   **  **\n        .byte   %11001100       ; 081E 2-03: **  **  \n        .byte   %11001100       ; 081F 2-03: **  **  \n\n        .byte   %11111111       ; 0820 2-04: ********\n        .byte   %11100111       ; 0821 2-04: ***  ***\n        .byte   %11000011       ; 0822 2-04: **    **\n        .byte   %10000001       ; 0823 2-04: *      *\n        .byte   %11100111       ; 0824 2-04: ***  ***\n        .byte   %11100111       ; 0825 2-04: ***  ***\n        .byte   %11100111       ; 0826 2-04: ***  ***\n        .byte   %11100111       ; 0827 2-04: ***  ***\n\n        .byte   %11111111       ; 0828 2-05: ********\n        .byte   %11100111       ; 0829 2-05: ***  ***\n        .byte   %11000011       ; 082A 2-05: **    **\n        .byte   %10000001       ; 082B 2-05: *      *\n        .byte   %11100111       ; 082C 2-05: ***  ***\n        .byte   %11100111       ; 082D 2-05: ***  ***\n        .byte   %11100111       ; 082E 2-05: ***  ***\n        .byte   %11100111       ; 082F 2-05: ***  ***\n\n        .byte   %11111111       ; 0830 2-06: ********\n        .byte   %11101111       ; 0831 2-06: *** ****\n        .byte   %11001111       ; 0832 2-06: **  ****\n        .byte   %10000000       ; 0833 2-06: *       \n        .byte   %10000000       ; 0834 2-06: *       \n        .byte   %11001111       ; 0835 2-06: **  ****\n        .byte   %11101111       ; 0836 2-06: *** ****\n        .byte   %11111111       ; 0837 2-06: ********\n\n        .byte   %11111111       ; 0838 2-07: ********\n        .byte   %11101111       ; 0839 2-07: *** ****\n        .byte   %11001111       ; 083A 2-07: **  ****\n        .byte   %10000000       ; 083B 2-07: *       \n        .byte   %10000000       ; 083C 2-07: *       \n        .byte   %11001111       ; 083D 2-07: **  ****\n        .byte   %11101111       ; 083E 2-07: *** ****\n        .byte   %11111111       ; 083F 2-07: ********\n\n        .byte   %11110011       ; 0840 2-08: ****  **\n        .byte   %11101101       ; 0841 2-08: *** ** *\n        .byte   %11001111       ; 0842 2-08: **  ****\n        .byte   %10000011       ; 0843 2-08: *     **\n        .byte   %11001111       ; 0844 2-08: **  ****\n        .byte   %10011101       ; 0845 2-08: *  *** *\n        .byte   %00000011       ; 0846 2-08:       **\n        .byte   %11111111       ; 0847 2-08: ********\n\n        .byte   %11110011       ; 0848 2-09: ****  **\n        .byte   %11101101       ; 0849 2-09: *** ** *\n        .byte   %11001111       ; 084A 2-09: **  ****\n        .byte   %10000011       ; 084B 2-09: *     **\n        .byte   %11001111       ; 084C 2-09: **  ****\n        .byte   %10011101       ; 084D 2-09: *  *** *\n        .byte   %00000011       ; 084E 2-09:       **\n        .byte   %11111111       ; 084F 2-09: ********\n\n        .byte   %11111111       ; 0850 2-0a: ********\n        .byte   %11111111       ; 0851 2-0a: ********\n        .byte   %11111100       ; 0852 2-0a: ******  \n        .byte   %11000001       ; 0853 2-0a: **     *\n        .byte   %10001001       ; 0854 2-0a: *   *  *\n        .byte   %11001001       ; 0855 2-0a: **  *  *\n        .byte   %11001001       ; 0856 2-0a: **  *  *\n        .byte   %11111111       ; 0857 2-0a: ********\n\n        .byte   %11111111       ; 0858 2-0b: ********\n        .byte   %11111111       ; 0859 2-0b: ********\n        .byte   %11111100       ; 085A 2-0b: ******  \n        .byte   %11000001       ; 085B 2-0b: **     *\n        .byte   %10001001       ; 085C 2-0b: *   *  *\n        .byte   %11001001       ; 085D 2-0b: **  *  *\n        .byte   %11001001       ; 085E 2-0b: **  *  *\n        .byte   %11111111       ; 085F 2-0b: ********\n\n        .byte   %10000000       ; 0860 2-0c: *       \n        .byte   %10000000       ; 0861 2-0c: *       \n        .byte   %11111111       ; 0862 2-0c: ********\n        .byte   %11111111       ; 0863 2-0c: ********\n        .byte   %11111111       ; 0864 2-0c: ********\n        .byte   %11111111       ; 0865 2-0c: ********\n        .byte   %11111111       ; 0866 2-0c: ********\n        .byte   %11111111       ; 0867 2-0c: ********\n\n        .byte   %10000000       ; 0868 2-0d: *       \n        .byte   %10000000       ; 0869 2-0d: *       \n        .byte   %11111111       ; 086A 2-0d: ********\n        .byte   %11111111       ; 086B 2-0d: ********\n        .byte   %11111111       ; 086C 2-0d: ********\n        .byte   %11111111       ; 086D 2-0d: ********\n        .byte   %11111111       ; 086E 2-0d: ********\n        .byte   %11111111       ; 086F 2-0d: ********\n\n        .byte   %00011111       ; 0870 2-0e:    *****\n        .byte   %00011111       ; 0871 2-0e:    *****\n        .byte   %10011111       ; 0872 2-0e: *  *****\n        .byte   %10011111       ; 0873 2-0e: *  *****\n        .byte   %10011111       ; 0874 2-0e: *  *****\n        .byte   %10011111       ; 0875 2-0e: *  *****\n        .byte   %10011111       ; 0876 2-0e: *  *****\n        .byte   %10011111       ; 0877 2-0e: *  *****\n\n        .byte   %00011111       ; 0878 2-0f:    *****\n        .byte   %00011111       ; 0879 2-0f:    *****\n        .byte   %10011111       ; 087A 2-0f: *  *****\n        .byte   %10011111       ; 087B 2-0f: *  *****\n        .byte   %10011111       ; 087C 2-0f: *  *****\n        .byte   %10011111       ; 087D 2-0f: *  *****\n        .byte   %10011111       ; 087E 2-0f: *  *****\n        .byte   %10011111       ; 087F 2-0f: *  *****\n\n        .byte   %11100111       ; 0880 2-10: ***  ***\n        .byte   %11100111       ; 0881 2-10: ***  ***\n        .byte   %11100111       ; 0882 2-10: ***  ***\n        .byte   %00000111       ; 0883 2-10:      ***\n        .byte   %00000111       ; 0884 2-10:      ***\n        .byte   %11111111       ; 0885 2-10: ********\n        .byte   %11111111       ; 0886 2-10: ********\n        .byte   %11111111       ; 0887 2-10: ********\n\n        .byte   %11100111       ; 0888 2-11: ***  ***\n        .byte   %11100111       ; 0889 2-11: ***  ***\n        .byte   %11100111       ; 088A 2-11: ***  ***\n        .byte   %00000111       ; 088B 2-11:      ***\n        .byte   %00000111       ; 088C 2-11:      ***\n        .byte   %11111111       ; 088D 2-11: ********\n        .byte   %11111111       ; 088E 2-11: ********\n        .byte   %11111111       ; 088F 2-11: ********\n\n        .byte   %00110011       ; 0890 2-12:   **  **\n        .byte   %01100110       ; 0891 2-12:  **  ** \n        .byte   %11001100       ; 0892 2-12: **  **  \n        .byte   %10011001       ; 0893 2-12: *  **  *\n        .byte   %00110011       ; 0894 2-12:   **  **\n        .byte   %01100110       ; 0895 2-12:  **  ** \n        .byte   %11001100       ; 0896 2-12: **  **  \n        .byte   %10011001       ; 0897 2-12: *  **  *\n\n        .byte   %00110011       ; 0898 2-13:   **  **\n        .byte   %01100110       ; 0899 2-13:  **  ** \n        .byte   %11001100       ; 089A 2-13: **  **  \n        .byte   %10011001       ; 089B 2-13: *  **  *\n        .byte   %00110011       ; 089C 2-13:   **  **\n        .byte   %01100110       ; 089D 2-13:  **  ** \n        .byte   %11001100       ; 089E 2-13: **  **  \n        .byte   %10011001       ; 089F 2-13: *  **  *\n\n        .byte   %11001100       ; 08A0 2-14: **  **  \n        .byte   %01100110       ; 08A1 2-14:  **  ** \n        .byte   %00110011       ; 08A2 2-14:   **  **\n        .byte   %10011001       ; 08A3 2-14: *  **  *\n        .byte   %11001100       ; 08A4 2-14: **  **  \n        .byte   %01100110       ; 08A5 2-14:  **  ** \n        .byte   %00110011       ; 08A6 2-14:   **  **\n        .byte   %10011001       ; 08A7 2-14: *  **  *\n\n        .byte   %11001100       ; 08A8 2-15: **  **  \n        .byte   %01100110       ; 08A9 2-15:  **  ** \n        .byte   %00110011       ; 08AA 2-15:   **  **\n        .byte   %10011001       ; 08AB 2-15: *  **  *\n        .byte   %11001100       ; 08AC 2-15: **  **  \n        .byte   %01100110       ; 08AD 2-15:  **  ** \n        .byte   %00110011       ; 08AE 2-15:   **  **\n        .byte   %10011001       ; 08AF 2-15: *  **  *\n\n        .byte   %11111111       ; 08B0 2-16: ********\n        .byte   %11111111       ; 08B1 2-16: ********\n        .byte   %11111111       ; 08B2 2-16: ********\n        .byte   %00000000       ; 08B3 2-16:         \n        .byte   %00000000       ; 08B4 2-16:         \n        .byte   %11111111       ; 08B5 2-16: ********\n        .byte   %11111111       ; 08B6 2-16: ********\n        .byte   %11111111       ; 08B7 2-16: ********\n\n        .byte   %11111111       ; 08B8 2-17: ********\n        .byte   %11111111       ; 08B9 2-17: ********\n        .byte   %11111111       ; 08BA 2-17: ********\n        .byte   %00000000       ; 08BB 2-17:         \n        .byte   %00000000       ; 08BC 2-17:         \n        .byte   %11111111       ; 08BD 2-17: ********\n        .byte   %11111111       ; 08BE 2-17: ********\n        .byte   %11111111       ; 08BF 2-17: ********\n\n        .byte   %11111100       ; 08C0 2-18: ******  \n        .byte   %11111100       ; 08C1 2-18: ******  \n        .byte   %11111100       ; 08C2 2-18: ******  \n        .byte   %11111100       ; 08C3 2-18: ******  \n        .byte   %11111100       ; 08C4 2-18: ******  \n        .byte   %11111100       ; 08C5 2-18: ******  \n        .byte   %11111100       ; 08C6 2-18: ******  \n        .byte   %11111100       ; 08C7 2-18: ******  \n\n        .byte   %11111100       ; 08C8 2-19: ******  \n        .byte   %11111100       ; 08C9 2-19: ******  \n        .byte   %11111100       ; 08CA 2-19: ******  \n        .byte   %11111100       ; 08CB 2-19: ******  \n        .byte   %11111100       ; 08CC 2-19: ******  \n        .byte   %11111100       ; 08CD 2-19: ******  \n        .byte   %11111100       ; 08CE 2-19: ******  \n        .byte   %11111100       ; 08CF 2-19: ******  \n\n        .byte   %11111111       ; 08D0 2-1a: ********\n        .byte   %11111111       ; 08D1 2-1a: ********\n        .byte   %11111111       ; 08D2 2-1a: ********\n        .byte   %11111111       ; 08D3 2-1a: ********\n        .byte   %00110011       ; 08D4 2-1a:   **  **\n        .byte   %00110011       ; 08D5 2-1a:   **  **\n        .byte   %11001100       ; 08D6 2-1a: **  **  \n        .byte   %11001100       ; 08D7 2-1a: **  **  \n\n        .byte   %11111111       ; 08D8 2-1b: ********\n        .byte   %11111111       ; 08D9 2-1b: ********\n        .byte   %11111111       ; 08DA 2-1b: ********\n        .byte   %11111111       ; 08DB 2-1b: ********\n        .byte   %00110011       ; 08DC 2-1b:   **  **\n        .byte   %00110011       ; 08DD 2-1b:   **  **\n        .byte   %11001100       ; 08DE 2-1b: **  **  \n        .byte   %11001100       ; 08DF 2-1b: **  **  \n\n        .byte   %11100111       ; 08E0 2-1c: ***  ***\n        .byte   %11100111       ; 08E1 2-1c: ***  ***\n        .byte   %11100111       ; 08E2 2-1c: ***  ***\n        .byte   %11100111       ; 08E3 2-1c: ***  ***\n        .byte   %11100111       ; 08E4 2-1c: ***  ***\n        .byte   %11100111       ; 08E5 2-1c: ***  ***\n        .byte   %11100111       ; 08E6 2-1c: ***  ***\n        .byte   %11100111       ; 08E7 2-1c: ***  ***\n\n        .byte   %11100111       ; 08E8 2-1d: ***  ***\n        .byte   %11100111       ; 08E9 2-1d: ***  ***\n        .byte   %11100111       ; 08EA 2-1d: ***  ***\n        .byte   %11100111       ; 08EB 2-1d: ***  ***\n        .byte   %11100111       ; 08EC 2-1d: ***  ***\n        .byte   %11100111       ; 08ED 2-1d: ***  ***\n        .byte   %11100111       ; 08EE 2-1d: ***  ***\n        .byte   %11100111       ; 08EF 2-1d: ***  ***\n\n        .byte   %11100111       ; 08F0 2-1e: ***  ***\n        .byte   %11100111       ; 08F1 2-1e: ***  ***\n        .byte   %11100111       ; 08F2 2-1e: ***  ***\n        .byte   %11100000       ; 08F3 2-1e: ***     \n        .byte   %11100000       ; 08F4 2-1e: ***     \n        .byte   %11100111       ; 08F5 2-1e: ***  ***\n        .byte   %11100111       ; 08F6 2-1e: ***  ***\n        .byte   %11100111       ; 08F7 2-1e: ***  ***\n\n        .byte   %11100111       ; 08F8 2-1f: ***  ***\n        .byte   %11100111       ; 08F9 2-1f: ***  ***\n        .byte   %11100111       ; 08FA 2-1f: ***  ***\n        .byte   %11100000       ; 08FB 2-1f: ***     \n        .byte   %11100000       ; 08FC 2-1f: ***     \n        .byte   %11100111       ; 08FD 2-1f: ***  ***\n        .byte   %11100111       ; 08FE 2-1f: ***  ***\n        .byte   %11100111       ; 08FF 2-1f: ***  ***\n\n        .byte   %11100111       ; 0900 2-20: ***  ***\n        .byte   %11100111       ; 0901 2-20: ***  ***\n        .byte   %11100111       ; 0902 2-20: ***  ***\n        .byte   %00000000       ; 0903 2-20:         \n        .byte   %00000000       ; 0904 2-20:         \n        .byte   %11100111       ; 0905 2-20: ***  ***\n        .byte   %11100111       ; 0906 2-20: ***  ***\n        .byte   %11100111       ; 0907 2-20: ***  ***\n\n        .byte   %11100111       ; 0908 2-21: ***  ***\n        .byte   %11100111       ; 0909 2-21: ***  ***\n        .byte   %11100111       ; 090A 2-21: ***  ***\n        .byte   %00000000       ; 090B 2-21:         \n        .byte   %00000000       ; 090C 2-21:         \n        .byte   %11100111       ; 090D 2-21: ***  ***\n        .byte   %11100111       ; 090E 2-21: ***  ***\n        .byte   %11100111       ; 090F 2-21: ***  ***\n\n        .byte   %11100111       ; 0910 2-22: ***  ***\n        .byte   %11100111       ; 0911 2-22: ***  ***\n        .byte   %11100111       ; 0912 2-22: ***  ***\n        .byte   %11100000       ; 0913 2-22: ***     \n        .byte   %11100000       ; 0914 2-22: ***     \n        .byte   %11111111       ; 0915 2-22: ********\n        .byte   %11111111       ; 0916 2-22: ********\n        .byte   %11111111       ; 0917 2-22: ********\n\n        .byte   %11100111       ; 0918 2-23: ***  ***\n        .byte   %11100111       ; 0919 2-23: ***  ***\n        .byte   %11100111       ; 091A 2-23: ***  ***\n        .byte   %11100000       ; 091B 2-23: ***     \n        .byte   %11100000       ; 091C 2-23: ***     \n        .byte   %11111111       ; 091D 2-23: ********\n        .byte   %11111111       ; 091E 2-23: ********\n        .byte   %11111111       ; 091F 2-23: ********\n\n        .byte   %11111111       ; 0920 2-24: ********\n        .byte   %11111111       ; 0921 2-24: ********\n        .byte   %11111111       ; 0922 2-24: ********\n        .byte   %00000111       ; 0923 2-24:      ***\n        .byte   %00000111       ; 0924 2-24:      ***\n        .byte   %11100111       ; 0925 2-24: ***  ***\n        .byte   %11100111       ; 0926 2-24: ***  ***\n        .byte   %11100111       ; 0927 2-24: ***  ***\n\n        .byte   %11111111       ; 0928 2-25: ********\n        .byte   %11111111       ; 0929 2-25: ********\n        .byte   %11111111       ; 092A 2-25: ********\n        .byte   %00000111       ; 092B 2-25:      ***\n        .byte   %00000111       ; 092C 2-25:      ***\n        .byte   %11100111       ; 092D 2-25: ***  ***\n        .byte   %11100111       ; 092E 2-25: ***  ***\n        .byte   %11100111       ; 092F 2-25: ***  ***\n\n        .byte   %11111111       ; 0930 2-26: ********\n        .byte   %11111111       ; 0931 2-26: ********\n        .byte   %11111111       ; 0932 2-26: ********\n        .byte   %11111111       ; 0933 2-26: ********\n        .byte   %11111111       ; 0934 2-26: ********\n        .byte   %11111111       ; 0935 2-26: ********\n        .byte   %00000000       ; 0936 2-26:         \n        .byte   %00000000       ; 0937 2-26:         \n\n        .byte   %11111111       ; 0938 2-27: ********\n        .byte   %11111111       ; 0939 2-27: ********\n        .byte   %11111111       ; 093A 2-27: ********\n        .byte   %11111111       ; 093B 2-27: ********\n        .byte   %11111111       ; 093C 2-27: ********\n        .byte   %11111111       ; 093D 2-27: ********\n        .byte   %00000000       ; 093E 2-27:         \n        .byte   %00000000       ; 093F 2-27:         \n\n        .byte   %11111111       ; 0940 2-28: ********\n        .byte   %11111111       ; 0941 2-28: ********\n        .byte   %11111111       ; 0942 2-28: ********\n        .byte   %11100000       ; 0943 2-28: ***     \n        .byte   %11100000       ; 0944 2-28: ***     \n        .byte   %11100111       ; 0945 2-28: ***  ***\n        .byte   %11100111       ; 0946 2-28: ***  ***\n        .byte   %11100111       ; 0947 2-28: ***  ***\n\n        .byte   %11111111       ; 0948 2-29: ********\n        .byte   %11111111       ; 0949 2-29: ********\n        .byte   %11111111       ; 094A 2-29: ********\n        .byte   %11100000       ; 094B 2-29: ***     \n        .byte   %11100000       ; 094C 2-29: ***     \n        .byte   %11100111       ; 094D 2-29: ***  ***\n        .byte   %11100111       ; 094E 2-29: ***  ***\n        .byte   %11100111       ; 094F 2-29: ***  ***\n\n        .byte   %11100111       ; 0950 2-2a: ***  ***\n        .byte   %11100111       ; 0951 2-2a: ***  ***\n        .byte   %11100111       ; 0952 2-2a: ***  ***\n        .byte   %00000000       ; 0953 2-2a:         \n        .byte   %00000000       ; 0954 2-2a:         \n        .byte   %11111111       ; 0955 2-2a: ********\n        .byte   %11111111       ; 0956 2-2a: ********\n        .byte   %11111111       ; 0957 2-2a: ********\n\n        .byte   %11100111       ; 0958 2-2b: ***  ***\n        .byte   %11100111       ; 0959 2-2b: ***  ***\n        .byte   %11100111       ; 095A 2-2b: ***  ***\n        .byte   %00000000       ; 095B 2-2b:         \n        .byte   %00000000       ; 095C 2-2b:         \n        .byte   %11111111       ; 095D 2-2b: ********\n        .byte   %11111111       ; 095E 2-2b: ********\n        .byte   %11111111       ; 095F 2-2b: ********\n\n        .byte   %11111111       ; 0960 2-2c: ********\n        .byte   %11111111       ; 0961 2-2c: ********\n        .byte   %11111111       ; 0962 2-2c: ********\n        .byte   %00000000       ; 0963 2-2c:         \n        .byte   %00000000       ; 0964 2-2c:         \n        .byte   %11100111       ; 0965 2-2c: ***  ***\n        .byte   %11100111       ; 0966 2-2c: ***  ***\n        .byte   %11100111       ; 0967 2-2c: ***  ***\n\n        .byte   %11111111       ; 0968 2-2d: ********\n        .byte   %11111111       ; 0969 2-2d: ********\n        .byte   %11111111       ; 096A 2-2d: ********\n        .byte   %00000000       ; 096B 2-2d:         \n        .byte   %00000000       ; 096C 2-2d:         \n        .byte   %11100111       ; 096D 2-2d: ***  ***\n        .byte   %11100111       ; 096E 2-2d: ***  ***\n        .byte   %11100111       ; 096F 2-2d: ***  ***\n\n        .byte   %11100111       ; 0970 2-2e: ***  ***\n        .byte   %11100111       ; 0971 2-2e: ***  ***\n        .byte   %11100111       ; 0972 2-2e: ***  ***\n        .byte   %00000111       ; 0973 2-2e:      ***\n        .byte   %00000111       ; 0974 2-2e:      ***\n        .byte   %11100111       ; 0975 2-2e: ***  ***\n        .byte   %11100111       ; 0976 2-2e: ***  ***\n        .byte   %11100111       ; 0977 2-2e: ***  ***\n\n        .byte   %11100111       ; 0978 2-2f: ***  ***\n        .byte   %11100111       ; 0979 2-2f: ***  ***\n        .byte   %11100111       ; 097A 2-2f: ***  ***\n        .byte   %00000111       ; 097B 2-2f:      ***\n        .byte   %00000111       ; 097C 2-2f:      ***\n        .byte   %11100111       ; 097D 2-2f: ***  ***\n        .byte   %11100111       ; 097E 2-2f: ***  ***\n        .byte   %11100111       ; 097F 2-2f: ***  ***\n\n        .byte   %00001111       ; 0980 2-30:     ****\n        .byte   %00001111       ; 0981 2-30:     ****\n        .byte   %00001111       ; 0982 2-30:     ****\n        .byte   %00001111       ; 0983 2-30:     ****\n        .byte   %00001111       ; 0984 2-30:     ****\n        .byte   %00001111       ; 0985 2-30:     ****\n        .byte   %00001111       ; 0986 2-30:     ****\n        .byte   %00001111       ; 0987 2-30:     ****\n\n        .byte   %00001111       ; 0988 2-31:     ****\n        .byte   %00001111       ; 0989 2-31:     ****\n        .byte   %00001111       ; 098A 2-31:     ****\n        .byte   %00001111       ; 098B 2-31:     ****\n        .byte   %00001111       ; 098C 2-31:     ****\n        .byte   %00001111       ; 098D 2-31:     ****\n        .byte   %00001111       ; 098E 2-31:     ****\n        .byte   %00001111       ; 098F 2-31:     ****\n\n        .byte   %11111111       ; 0990 2-32: ********\n        .byte   %11111111       ; 0991 2-32: ********\n        .byte   %11111111       ; 0992 2-32: ********\n        .byte   %11111111       ; 0993 2-32: ********\n        .byte   %00000000       ; 0994 2-32:         \n        .byte   %00000000       ; 0995 2-32:         \n        .byte   %00000000       ; 0996 2-32:         \n        .byte   %00000000       ; 0997 2-32:         \n\n        .byte   %11111111       ; 0998 2-33: ********\n        .byte   %11111111       ; 0999 2-33: ********\n        .byte   %11111111       ; 099A 2-33: ********\n        .byte   %11111111       ; 099B 2-33: ********\n        .byte   %00000000       ; 099C 2-33:         \n        .byte   %00000000       ; 099D 2-33:         \n        .byte   %00000000       ; 099E 2-33:         \n        .byte   %00000000       ; 099F 2-33:         \n\n        .byte   %11111111       ; 09A0 2-34: ********\n        .byte   %11111111       ; 09A1 2-34: ********\n        .byte   %11111111       ; 09A2 2-34: ********\n        .byte   %11111111       ; 09A3 2-34: ********\n        .byte   %00001111       ; 09A4 2-34:     ****\n        .byte   %00001111       ; 09A5 2-34:     ****\n        .byte   %00001111       ; 09A6 2-34:     ****\n        .byte   %00001111       ; 09A7 2-34:     ****\n\n        .byte   %11111111       ; 09A8 2-35: ********\n        .byte   %11111111       ; 09A9 2-35: ********\n        .byte   %11111111       ; 09AA 2-35: ********\n        .byte   %11111111       ; 09AB 2-35: ********\n        .byte   %00001111       ; 09AC 2-35:     ****\n        .byte   %00001111       ; 09AD 2-35:     ****\n        .byte   %00001111       ; 09AE 2-35:     ****\n        .byte   %00001111       ; 09AF 2-35:     ****\n\n        .byte   %00111111       ; 09B0 2-36:   ******\n        .byte   %00111111       ; 09B1 2-36:   ******\n        .byte   %11001111       ; 09B2 2-36: **  ****\n        .byte   %11001111       ; 09B3 2-36: **  ****\n        .byte   %00111111       ; 09B4 2-36:   ******\n        .byte   %00111111       ; 09B5 2-36:   ******\n        .byte   %11001111       ; 09B6 2-36: **  ****\n        .byte   %11001111       ; 09B7 2-36: **  ****\n\n        .byte   %00111111       ; 09B8 2-37:   ******\n        .byte   %00111111       ; 09B9 2-37:   ******\n        .byte   %11001111       ; 09BA 2-37: **  ****\n        .byte   %11001111       ; 09BB 2-37: **  ****\n        .byte   %00111111       ; 09BC 2-37:   ******\n        .byte   %00111111       ; 09BD 2-37:   ******\n        .byte   %11001111       ; 09BE 2-37: **  ****\n        .byte   %11001111       ; 09BF 2-37: **  ****\n\n        .byte   %11110000       ; 09C0 2-38: ****    \n        .byte   %11110000       ; 09C1 2-38: ****    \n        .byte   %11110000       ; 09C2 2-38: ****    \n        .byte   %11110000       ; 09C3 2-38: ****    \n        .byte   %11111111       ; 09C4 2-38: ********\n        .byte   %11111111       ; 09C5 2-38: ********\n        .byte   %11111111       ; 09C6 2-38: ********\n        .byte   %11111111       ; 09C7 2-38: ********\n\n        .byte   %11110000       ; 09C8 2-39: ****    \n        .byte   %11110000       ; 09C9 2-39: ****    \n        .byte   %11110000       ; 09CA 2-39: ****    \n        .byte   %11110000       ; 09CB 2-39: ****    \n        .byte   %11111111       ; 09CC 2-39: ********\n        .byte   %11111111       ; 09CD 2-39: ********\n        .byte   %11111111       ; 09CE 2-39: ********\n        .byte   %11111111       ; 09CF 2-39: ********\n\n        .byte   %11111111       ; 09D0 2-3a: ********\n        .byte   %11111111       ; 09D1 2-3a: ********\n        .byte   %11111111       ; 09D2 2-3a: ********\n        .byte   %11111111       ; 09D3 2-3a: ********\n        .byte   %11110000       ; 09D4 2-3a: ****    \n        .byte   %11110000       ; 09D5 2-3a: ****    \n        .byte   %11110000       ; 09D6 2-3a: ****    \n        .byte   %11110000       ; 09D7 2-3a: ****    \n\n        .byte   %11111111       ; 09D8 2-3b: ********\n        .byte   %11111111       ; 09D9 2-3b: ********\n        .byte   %11111111       ; 09DA 2-3b: ********\n        .byte   %11111111       ; 09DB 2-3b: ********\n        .byte   %11110000       ; 09DC 2-3b: ****    \n        .byte   %11110000       ; 09DD 2-3b: ****    \n        .byte   %11110000       ; 09DE 2-3b: ****    \n        .byte   %11110000       ; 09DF 2-3b: ****    \n\n        .byte   %00001111       ; 09E0 2-3c:     ****\n        .byte   %00001111       ; 09E1 2-3c:     ****\n        .byte   %00001111       ; 09E2 2-3c:     ****\n        .byte   %00001111       ; 09E3 2-3c:     ****\n        .byte   %11111111       ; 09E4 2-3c: ********\n        .byte   %11111111       ; 09E5 2-3c: ********\n        .byte   %11111111       ; 09E6 2-3c: ********\n        .byte   %11111111       ; 09E7 2-3c: ********\n\n        .byte   %00001111       ; 09E8 2-3d:     ****\n        .byte   %00001111       ; 09E9 2-3d:     ****\n        .byte   %00001111       ; 09EA 2-3d:     ****\n        .byte   %00001111       ; 09EB 2-3d:     ****\n        .byte   %11111111       ; 09EC 2-3d: ********\n        .byte   %11111111       ; 09ED 2-3d: ********\n        .byte   %11111111       ; 09EE 2-3d: ********\n        .byte   %11111111       ; 09EF 2-3d: ********\n\n        .byte   %00001111       ; 09F0 2-3e:     ****\n        .byte   %00001111       ; 09F1 2-3e:     ****\n        .byte   %00001111       ; 09F2 2-3e:     ****\n        .byte   %00001111       ; 09F3 2-3e:     ****\n        .byte   %11110000       ; 09F4 2-3e: ****    \n        .byte   %11110000       ; 09F5 2-3e: ****    \n        .byte   %11110000       ; 09F6 2-3e: ****    \n        .byte   %11110000       ; 09F7 2-3e: ****    \n\n        .byte   %00001111       ; 09F8 2-3f:     ****\n        .byte   %00001111       ; 09F9 2-3f:     ****\n        .byte   %00001111       ; 09FA 2-3f:     ****\n        .byte   %00001111       ; 09FB 2-3f:     ****\n        .byte   %11110000       ; 09FC 2-3f: ****    \n        .byte   %11110000       ; 09FD 2-3f: ****    \n        .byte   %11110000       ; 09FE 2-3f: ****    \n        .byte   %11110000       ; 09FF 2-3f: ****    \n\n        .byte   %11111111       ; 0A00 2-40: ********\n        .byte   %11111111       ; 0A01 2-40: ********\n        .byte   %11111111       ; 0A02 2-40: ********\n        .byte   %11111111       ; 0A03 2-40: ********\n        .byte   %11111111       ; 0A04 2-40: ********\n        .byte   %11111111       ; 0A05 2-40: ********\n        .byte   %11111111       ; 0A06 2-40: ********\n        .byte   %11111111       ; 0A07 2-40: ********\n\n        .byte   %11111111       ; 0A08 2-41: ********\n        .byte   %11111111       ; 0A09 2-41: ********\n        .byte   %11111111       ; 0A0A 2-41: ********\n        .byte   %11111111       ; 0A0B 2-41: ********\n        .byte   %11111111       ; 0A0C 2-41: ********\n        .byte   %11111111       ; 0A0D 2-41: ********\n        .byte   %11111111       ; 0A0E 2-41: ********\n        .byte   %11111111       ; 0A0F 2-41: ********\n\n        .byte   %11100111       ; 0A10 2-42: ***  ***\n        .byte   %11100111       ; 0A11 2-42: ***  ***\n        .byte   %11100111       ; 0A12 2-42: ***  ***\n        .byte   %11100111       ; 0A13 2-42: ***  ***\n        .byte   %11111111       ; 0A14 2-42: ********\n        .byte   %11111111       ; 0A15 2-42: ********\n        .byte   %11100111       ; 0A16 2-42: ***  ***\n        .byte   %11111111       ; 0A17 2-42: ********\n\n        .byte   %11100111       ; 0A18 2-43: ***  ***\n        .byte   %11100111       ; 0A19 2-43: ***  ***\n        .byte   %11100111       ; 0A1A 2-43: ***  ***\n        .byte   %11100111       ; 0A1B 2-43: ***  ***\n        .byte   %11111111       ; 0A1C 2-43: ********\n        .byte   %11111111       ; 0A1D 2-43: ********\n        .byte   %11100111       ; 0A1E 2-43: ***  ***\n        .byte   %11111111       ; 0A1F 2-43: ********\n\n        .byte   %10011001       ; 0A20 2-44: *  **  *\n        .byte   %10011001       ; 0A21 2-44: *  **  *\n        .byte   %10011001       ; 0A22 2-44: *  **  *\n        .byte   %11111111       ; 0A23 2-44: ********\n        .byte   %11111111       ; 0A24 2-44: ********\n        .byte   %11111111       ; 0A25 2-44: ********\n        .byte   %11111111       ; 0A26 2-44: ********\n        .byte   %11111111       ; 0A27 2-44: ********\n\n        .byte   %10011001       ; 0A28 2-45: *  **  *\n        .byte   %10011001       ; 0A29 2-45: *  **  *\n        .byte   %10011001       ; 0A2A 2-45: *  **  *\n        .byte   %11111111       ; 0A2B 2-45: ********\n        .byte   %11111111       ; 0A2C 2-45: ********\n        .byte   %11111111       ; 0A2D 2-45: ********\n        .byte   %11111111       ; 0A2E 2-45: ********\n        .byte   %11111111       ; 0A2F 2-45: ********\n\n        .byte   %10011001       ; 0A30 2-46: *  **  *\n        .byte   %10011001       ; 0A31 2-46: *  **  *\n        .byte   %00000000       ; 0A32 2-46:         \n        .byte   %10011001       ; 0A33 2-46: *  **  *\n        .byte   %00000000       ; 0A34 2-46:         \n        .byte   %10011001       ; 0A35 2-46: *  **  *\n        .byte   %10011001       ; 0A36 2-46: *  **  *\n        .byte   %11111111       ; 0A37 2-46: ********\n\n        .byte   %10011001       ; 0A38 2-47: *  **  *\n        .byte   %10011001       ; 0A39 2-47: *  **  *\n        .byte   %00000000       ; 0A3A 2-47:         \n        .byte   %10011001       ; 0A3B 2-47: *  **  *\n        .byte   %00000000       ; 0A3C 2-47:         \n        .byte   %10011001       ; 0A3D 2-47: *  **  *\n        .byte   %10011001       ; 0A3E 2-47: *  **  *\n        .byte   %11111111       ; 0A3F 2-47: ********\n\n        .byte   %11100111       ; 0A40 2-48: ***  ***\n        .byte   %11000001       ; 0A41 2-48: **     *\n        .byte   %10011111       ; 0A42 2-48: *  *****\n        .byte   %11000011       ; 0A43 2-48: **    **\n        .byte   %11111001       ; 0A44 2-48: *****  *\n        .byte   %10000011       ; 0A45 2-48: *     **\n        .byte   %11100111       ; 0A46 2-48: ***  ***\n        .byte   %11111111       ; 0A47 2-48: ********\n\n        .byte   %11100111       ; 0A48 2-49: ***  ***\n        .byte   %11000001       ; 0A49 2-49: **     *\n        .byte   %10011111       ; 0A4A 2-49: *  *****\n        .byte   %11000011       ; 0A4B 2-49: **    **\n        .byte   %11111001       ; 0A4C 2-49: *****  *\n        .byte   %10000011       ; 0A4D 2-49: *     **\n        .byte   %11100111       ; 0A4E 2-49: ***  ***\n        .byte   %11111111       ; 0A4F 2-49: ********\n\n        .byte   %11111111       ; 0A50 2-4a: ********\n        .byte   %10011001       ; 0A51 2-4a: *  **  *\n        .byte   %11110011       ; 0A52 2-4a: ****  **\n        .byte   %11100111       ; 0A53 2-4a: ***  ***\n        .byte   %11001111       ; 0A54 2-4a: **  ****\n        .byte   %10011001       ; 0A55 2-4a: *  **  *\n        .byte   %10111001       ; 0A56 2-4a: * ***  *\n        .byte   %11111111       ; 0A57 2-4a: ********\n\n        .byte   %11111111       ; 0A58 2-4b: ********\n        .byte   %10011001       ; 0A59 2-4b: *  **  *\n        .byte   %11110011       ; 0A5A 2-4b: ****  **\n        .byte   %11100111       ; 0A5B 2-4b: ***  ***\n        .byte   %11001111       ; 0A5C 2-4b: **  ****\n        .byte   %10011001       ; 0A5D 2-4b: *  **  *\n        .byte   %10111001       ; 0A5E 2-4b: * ***  *\n        .byte   %11111111       ; 0A5F 2-4b: ********\n\n        .byte   %11000011       ; 0A60 2-4c: **    **\n        .byte   %10011001       ; 0A61 2-4c: *  **  *\n        .byte   %11000011       ; 0A62 2-4c: **    **\n        .byte   %11000111       ; 0A63 2-4c: **   ***\n        .byte   %10011000       ; 0A64 2-4c: *  **   \n        .byte   %10011001       ; 0A65 2-4c: *  **  *\n        .byte   %11000000       ; 0A66 2-4c: **      \n        .byte   %11111111       ; 0A67 2-4c: ********\n\n        .byte   %11000011       ; 0A68 2-4d: **    **\n        .byte   %10011001       ; 0A69 2-4d: *  **  *\n        .byte   %11000011       ; 0A6A 2-4d: **    **\n        .byte   %11000111       ; 0A6B 2-4d: **   ***\n        .byte   %10011000       ; 0A6C 2-4d: *  **   \n        .byte   %10011001       ; 0A6D 2-4d: *  **  *\n        .byte   %11000000       ; 0A6E 2-4d: **      \n        .byte   %11111111       ; 0A6F 2-4d: ********\n\n        .byte   %11111001       ; 0A70 2-4e: *****  *\n        .byte   %11110011       ; 0A71 2-4e: ****  **\n        .byte   %11100111       ; 0A72 2-4e: ***  ***\n        .byte   %11111111       ; 0A73 2-4e: ********\n        .byte   %11111111       ; 0A74 2-4e: ********\n        .byte   %11111111       ; 0A75 2-4e: ********\n        .byte   %11111111       ; 0A76 2-4e: ********\n        .byte   %11111111       ; 0A77 2-4e: ********\n\n        .byte   %11111001       ; 0A78 2-4f: *****  *\n        .byte   %11110011       ; 0A79 2-4f: ****  **\n        .byte   %11100111       ; 0A7A 2-4f: ***  ***\n        .byte   %11111111       ; 0A7B 2-4f: ********\n        .byte   %11111111       ; 0A7C 2-4f: ********\n        .byte   %11111111       ; 0A7D 2-4f: ********\n        .byte   %11111111       ; 0A7E 2-4f: ********\n        .byte   %11111111       ; 0A7F 2-4f: ********\n\n        .byte   %11110011       ; 0A80 2-50: ****  **\n        .byte   %11100111       ; 0A81 2-50: ***  ***\n        .byte   %11001111       ; 0A82 2-50: **  ****\n        .byte   %11001111       ; 0A83 2-50: **  ****\n        .byte   %11001111       ; 0A84 2-50: **  ****\n        .byte   %11100111       ; 0A85 2-50: ***  ***\n        .byte   %11110011       ; 0A86 2-50: ****  **\n        .byte   %11111111       ; 0A87 2-50: ********\n\n        .byte   %11110011       ; 0A88 2-51: ****  **\n        .byte   %11100111       ; 0A89 2-51: ***  ***\n        .byte   %11001111       ; 0A8A 2-51: **  ****\n        .byte   %11001111       ; 0A8B 2-51: **  ****\n        .byte   %11001111       ; 0A8C 2-51: **  ****\n        .byte   %11100111       ; 0A8D 2-51: ***  ***\n        .byte   %11110011       ; 0A8E 2-51: ****  **\n        .byte   %11111111       ; 0A8F 2-51: ********\n\n        .byte   %11001111       ; 0A90 2-52: **  ****\n        .byte   %11100111       ; 0A91 2-52: ***  ***\n        .byte   %11110011       ; 0A92 2-52: ****  **\n        .byte   %11110011       ; 0A93 2-52: ****  **\n        .byte   %11110011       ; 0A94 2-52: ****  **\n        .byte   %11100111       ; 0A95 2-52: ***  ***\n        .byte   %11001111       ; 0A96 2-52: **  ****\n        .byte   %11111111       ; 0A97 2-52: ********\n\n        .byte   %11001111       ; 0A98 2-53: **  ****\n        .byte   %11100111       ; 0A99 2-53: ***  ***\n        .byte   %11110011       ; 0A9A 2-53: ****  **\n        .byte   %11110011       ; 0A9B 2-53: ****  **\n        .byte   %11110011       ; 0A9C 2-53: ****  **\n        .byte   %11100111       ; 0A9D 2-53: ***  ***\n        .byte   %11001111       ; 0A9E 2-53: **  ****\n        .byte   %11111111       ; 0A9F 2-53: ********\n\n        .byte   %11111111       ; 0AA0 2-54: ********\n        .byte   %10011001       ; 0AA1 2-54: *  **  *\n        .byte   %11000011       ; 0AA2 2-54: **    **\n        .byte   %00000000       ; 0AA3 2-54:         \n        .byte   %11000011       ; 0AA4 2-54: **    **\n        .byte   %10011001       ; 0AA5 2-54: *  **  *\n        .byte   %11111111       ; 0AA6 2-54: ********\n        .byte   %11111111       ; 0AA7 2-54: ********\n\n        .byte   %11111111       ; 0AA8 2-55: ********\n        .byte   %10011001       ; 0AA9 2-55: *  **  *\n        .byte   %11000011       ; 0AAA 2-55: **    **\n        .byte   %00000000       ; 0AAB 2-55:         \n        .byte   %11000011       ; 0AAC 2-55: **    **\n        .byte   %10011001       ; 0AAD 2-55: *  **  *\n        .byte   %11111111       ; 0AAE 2-55: ********\n        .byte   %11111111       ; 0AAF 2-55: ********\n\n        .byte   %11111111       ; 0AB0 2-56: ********\n        .byte   %11100111       ; 0AB1 2-56: ***  ***\n        .byte   %11100111       ; 0AB2 2-56: ***  ***\n        .byte   %10000001       ; 0AB3 2-56: *      *\n        .byte   %11100111       ; 0AB4 2-56: ***  ***\n        .byte   %11100111       ; 0AB5 2-56: ***  ***\n        .byte   %11111111       ; 0AB6 2-56: ********\n        .byte   %11111111       ; 0AB7 2-56: ********\n\n        .byte   %11111111       ; 0AB8 2-57: ********\n        .byte   %11100111       ; 0AB9 2-57: ***  ***\n        .byte   %11100111       ; 0ABA 2-57: ***  ***\n        .byte   %10000001       ; 0ABB 2-57: *      *\n        .byte   %11100111       ; 0ABC 2-57: ***  ***\n        .byte   %11100111       ; 0ABD 2-57: ***  ***\n        .byte   %11111111       ; 0ABE 2-57: ********\n        .byte   %11111111       ; 0ABF 2-57: ********\n\n        .byte   %11111111       ; 0AC0 2-58: ********\n        .byte   %11111111       ; 0AC1 2-58: ********\n        .byte   %11111111       ; 0AC2 2-58: ********\n        .byte   %11111111       ; 0AC3 2-58: ********\n        .byte   %11111111       ; 0AC4 2-58: ********\n        .byte   %11100111       ; 0AC5 2-58: ***  ***\n        .byte   %11100111       ; 0AC6 2-58: ***  ***\n        .byte   %11001111       ; 0AC7 2-58: **  ****\n\n        .byte   %11111111       ; 0AC8 2-59: ********\n        .byte   %11111111       ; 0AC9 2-59: ********\n        .byte   %11111111       ; 0ACA 2-59: ********\n        .byte   %11111111       ; 0ACB 2-59: ********\n        .byte   %11111111       ; 0ACC 2-59: ********\n        .byte   %11100111       ; 0ACD 2-59: ***  ***\n        .byte   %11100111       ; 0ACE 2-59: ***  ***\n        .byte   %11001111       ; 0ACF 2-59: **  ****\n\n        .byte   %11111111       ; 0AD0 2-5a: ********\n        .byte   %11111111       ; 0AD1 2-5a: ********\n        .byte   %11111111       ; 0AD2 2-5a: ********\n        .byte   %10000001       ; 0AD3 2-5a: *      *\n        .byte   %11111111       ; 0AD4 2-5a: ********\n        .byte   %11111111       ; 0AD5 2-5a: ********\n        .byte   %11111111       ; 0AD6 2-5a: ********\n        .byte   %11111111       ; 0AD7 2-5a: ********\n\n        .byte   %11111111       ; 0AD8 2-5b: ********\n        .byte   %11111111       ; 0AD9 2-5b: ********\n        .byte   %11111111       ; 0ADA 2-5b: ********\n        .byte   %10000001       ; 0ADB 2-5b: *      *\n        .byte   %11111111       ; 0ADC 2-5b: ********\n        .byte   %11111111       ; 0ADD 2-5b: ********\n        .byte   %11111111       ; 0ADE 2-5b: ********\n        .byte   %11111111       ; 0ADF 2-5b: ********\n\n        .byte   %11111111       ; 0AE0 2-5c: ********\n        .byte   %11111111       ; 0AE1 2-5c: ********\n        .byte   %11111111       ; 0AE2 2-5c: ********\n        .byte   %11111111       ; 0AE3 2-5c: ********\n        .byte   %11111111       ; 0AE4 2-5c: ********\n        .byte   %11100111       ; 0AE5 2-5c: ***  ***\n        .byte   %11100111       ; 0AE6 2-5c: ***  ***\n        .byte   %11111111       ; 0AE7 2-5c: ********\n\n        .byte   %11111111       ; 0AE8 2-5d: ********\n        .byte   %11111111       ; 0AE9 2-5d: ********\n        .byte   %11111111       ; 0AEA 2-5d: ********\n        .byte   %11111111       ; 0AEB 2-5d: ********\n        .byte   %11111111       ; 0AEC 2-5d: ********\n        .byte   %11100111       ; 0AED 2-5d: ***  ***\n        .byte   %11100111       ; 0AEE 2-5d: ***  ***\n        .byte   %11111111       ; 0AEF 2-5d: ********\n\n        .byte   %11111111       ; 0AF0 2-5e: ********\n        .byte   %11111100       ; 0AF1 2-5e: ******  \n        .byte   %11111001       ; 0AF2 2-5e: *****  *\n        .byte   %11110011       ; 0AF3 2-5e: ****  **\n        .byte   %11100111       ; 0AF4 2-5e: ***  ***\n        .byte   %11001111       ; 0AF5 2-5e: **  ****\n        .byte   %10011111       ; 0AF6 2-5e: *  *****\n        .byte   %11111111       ; 0AF7 2-5e: ********\n\n        .byte   %11111111       ; 0AF8 2-5f: ********\n        .byte   %11111100       ; 0AF9 2-5f: ******  \n        .byte   %11111001       ; 0AFA 2-5f: *****  *\n        .byte   %11110011       ; 0AFB 2-5f: ****  **\n        .byte   %11100111       ; 0AFC 2-5f: ***  ***\n        .byte   %11001111       ; 0AFD 2-5f: **  ****\n        .byte   %10011111       ; 0AFE 2-5f: *  *****\n        .byte   %11111111       ; 0AFF 2-5f: ********\n\n        .byte   %11000011       ; 0B00 2-60: **    **\n        .byte   %10011001       ; 0B01 2-60: *  **  *\n        .byte   %10010001       ; 0B02 2-60: *  *   *\n        .byte   %10001001       ; 0B03 2-60: *   *  *\n        .byte   %10011001       ; 0B04 2-60: *  **  *\n        .byte   %10011001       ; 0B05 2-60: *  **  *\n        .byte   %11000011       ; 0B06 2-60: **    **\n        .byte   %11111111       ; 0B07 2-60: ********\n\n        .byte   %11000011       ; 0B08 2-61: **    **\n        .byte   %10011001       ; 0B09 2-61: *  **  *\n        .byte   %10010001       ; 0B0A 2-61: *  *   *\n        .byte   %10001001       ; 0B0B 2-61: *   *  *\n        .byte   %10011001       ; 0B0C 2-61: *  **  *\n        .byte   %10011001       ; 0B0D 2-61: *  **  *\n        .byte   %11000011       ; 0B0E 2-61: **    **\n        .byte   %11111111       ; 0B0F 2-61: ********\n\n        .byte   %11100111       ; 0B10 2-62: ***  ***\n        .byte   %11100111       ; 0B11 2-62: ***  ***\n        .byte   %11000111       ; 0B12 2-62: **   ***\n        .byte   %11100111       ; 0B13 2-62: ***  ***\n        .byte   %11100111       ; 0B14 2-62: ***  ***\n        .byte   %11100111       ; 0B15 2-62: ***  ***\n        .byte   %10000001       ; 0B16 2-62: *      *\n        .byte   %11111111       ; 0B17 2-62: ********\n\n        .byte   %11100111       ; 0B18 2-63: ***  ***\n        .byte   %11100111       ; 0B19 2-63: ***  ***\n        .byte   %11000111       ; 0B1A 2-63: **   ***\n        .byte   %11100111       ; 0B1B 2-63: ***  ***\n        .byte   %11100111       ; 0B1C 2-63: ***  ***\n        .byte   %11100111       ; 0B1D 2-63: ***  ***\n        .byte   %10000001       ; 0B1E 2-63: *      *\n        .byte   %11111111       ; 0B1F 2-63: ********\n\n        .byte   %11000011       ; 0B20 2-64: **    **\n        .byte   %10011001       ; 0B21 2-64: *  **  *\n        .byte   %11111001       ; 0B22 2-64: *****  *\n        .byte   %11110011       ; 0B23 2-64: ****  **\n        .byte   %11001111       ; 0B24 2-64: **  ****\n        .byte   %10011111       ; 0B25 2-64: *  *****\n        .byte   %10000001       ; 0B26 2-64: *      *\n        .byte   %11111111       ; 0B27 2-64: ********\n\n        .byte   %11000011       ; 0B28 2-65: **    **\n        .byte   %10011001       ; 0B29 2-65: *  **  *\n        .byte   %11111001       ; 0B2A 2-65: *****  *\n        .byte   %11110011       ; 0B2B 2-65: ****  **\n        .byte   %11001111       ; 0B2C 2-65: **  ****\n        .byte   %10011111       ; 0B2D 2-65: *  *****\n        .byte   %10000001       ; 0B2E 2-65: *      *\n        .byte   %11111111       ; 0B2F 2-65: ********\n\n        .byte   %11000011       ; 0B30 2-66: **    **\n        .byte   %10011001       ; 0B31 2-66: *  **  *\n        .byte   %11111001       ; 0B32 2-66: *****  *\n        .byte   %11100011       ; 0B33 2-66: ***   **\n        .byte   %11111001       ; 0B34 2-66: *****  *\n        .byte   %10011001       ; 0B35 2-66: *  **  *\n        .byte   %11000011       ; 0B36 2-66: **    **\n        .byte   %11111111       ; 0B37 2-66: ********\n\n        .byte   %11000011       ; 0B38 2-67: **    **\n        .byte   %10011001       ; 0B39 2-67: *  **  *\n        .byte   %11111001       ; 0B3A 2-67: *****  *\n        .byte   %11100011       ; 0B3B 2-67: ***   **\n        .byte   %11111001       ; 0B3C 2-67: *****  *\n        .byte   %10011001       ; 0B3D 2-67: *  **  *\n        .byte   %11000011       ; 0B3E 2-67: **    **\n        .byte   %11111111       ; 0B3F 2-67: ********\n\n        .byte   %11111001       ; 0B40 2-68: *****  *\n        .byte   %11110001       ; 0B41 2-68: ****   *\n        .byte   %11100001       ; 0B42 2-68: ***    *\n        .byte   %10011001       ; 0B43 2-68: *  **  *\n        .byte   %10000000       ; 0B44 2-68: *       \n        .byte   %11111001       ; 0B45 2-68: *****  *\n        .byte   %11111001       ; 0B46 2-68: *****  *\n        .byte   %11111111       ; 0B47 2-68: ********\n\n        .byte   %11111001       ; 0B48 2-69: *****  *\n        .byte   %11110001       ; 0B49 2-69: ****   *\n        .byte   %11100001       ; 0B4A 2-69: ***    *\n        .byte   %10011001       ; 0B4B 2-69: *  **  *\n        .byte   %10000000       ; 0B4C 2-69: *       \n        .byte   %11111001       ; 0B4D 2-69: *****  *\n        .byte   %11111001       ; 0B4E 2-69: *****  *\n        .byte   %11111111       ; 0B4F 2-69: ********\n\n        .byte   %10000001       ; 0B50 2-6a: *      *\n        .byte   %10011111       ; 0B51 2-6a: *  *****\n        .byte   %10000011       ; 0B52 2-6a: *     **\n        .byte   %11111001       ; 0B53 2-6a: *****  *\n        .byte   %11111001       ; 0B54 2-6a: *****  *\n        .byte   %10011001       ; 0B55 2-6a: *  **  *\n        .byte   %11000011       ; 0B56 2-6a: **    **\n        .byte   %11111111       ; 0B57 2-6a: ********\n\n        .byte   %10000001       ; 0B58 2-6b: *      *\n        .byte   %10011111       ; 0B59 2-6b: *  *****\n        .byte   %10000011       ; 0B5A 2-6b: *     **\n        .byte   %11111001       ; 0B5B 2-6b: *****  *\n        .byte   %11111001       ; 0B5C 2-6b: *****  *\n        .byte   %10011001       ; 0B5D 2-6b: *  **  *\n        .byte   %11000011       ; 0B5E 2-6b: **    **\n        .byte   %11111111       ; 0B5F 2-6b: ********\n\n        .byte   %11000011       ; 0B60 2-6c: **    **\n        .byte   %10011001       ; 0B61 2-6c: *  **  *\n        .byte   %10011111       ; 0B62 2-6c: *  *****\n        .byte   %10000011       ; 0B63 2-6c: *     **\n        .byte   %10011001       ; 0B64 2-6c: *  **  *\n        .byte   %10011001       ; 0B65 2-6c: *  **  *\n        .byte   %11000011       ; 0B66 2-6c: **    **\n        .byte   %11111111       ; 0B67 2-6c: ********\n\n        .byte   %11000011       ; 0B68 2-6d: **    **\n        .byte   %10011001       ; 0B69 2-6d: *  **  *\n        .byte   %10011111       ; 0B6A 2-6d: *  *****\n        .byte   %10000011       ; 0B6B 2-6d: *     **\n        .byte   %10011001       ; 0B6C 2-6d: *  **  *\n        .byte   %10011001       ; 0B6D 2-6d: *  **  *\n        .byte   %11000011       ; 0B6E 2-6d: **    **\n        .byte   %11111111       ; 0B6F 2-6d: ********\n\n        .byte   %10000001       ; 0B70 2-6e: *      *\n        .byte   %10011001       ; 0B71 2-6e: *  **  *\n        .byte   %11110011       ; 0B72 2-6e: ****  **\n        .byte   %11100111       ; 0B73 2-6e: ***  ***\n        .byte   %11100111       ; 0B74 2-6e: ***  ***\n        .byte   %11100111       ; 0B75 2-6e: ***  ***\n        .byte   %11100111       ; 0B76 2-6e: ***  ***\n        .byte   %11111111       ; 0B77 2-6e: ********\n\n        .byte   %10000001       ; 0B78 2-6f: *      *\n        .byte   %10011001       ; 0B79 2-6f: *  **  *\n        .byte   %11110011       ; 0B7A 2-6f: ****  **\n        .byte   %11100111       ; 0B7B 2-6f: ***  ***\n        .byte   %11100111       ; 0B7C 2-6f: ***  ***\n        .byte   %11100111       ; 0B7D 2-6f: ***  ***\n        .byte   %11100111       ; 0B7E 2-6f: ***  ***\n        .byte   %11111111       ; 0B7F 2-6f: ********\n\n        .byte   %11000011       ; 0B80 2-70: **    **\n        .byte   %10011001       ; 0B81 2-70: *  **  *\n        .byte   %10011001       ; 0B82 2-70: *  **  *\n        .byte   %11000011       ; 0B83 2-70: **    **\n        .byte   %10011001       ; 0B84 2-70: *  **  *\n        .byte   %10011001       ; 0B85 2-70: *  **  *\n        .byte   %11000011       ; 0B86 2-70: **    **\n        .byte   %11111111       ; 0B87 2-70: ********\n\n        .byte   %11000011       ; 0B88 2-71: **    **\n        .byte   %10011001       ; 0B89 2-71: *  **  *\n        .byte   %10011001       ; 0B8A 2-71: *  **  *\n        .byte   %11000011       ; 0B8B 2-71: **    **\n        .byte   %10011001       ; 0B8C 2-71: *  **  *\n        .byte   %10011001       ; 0B8D 2-71: *  **  *\n        .byte   %11000011       ; 0B8E 2-71: **    **\n        .byte   %11111111       ; 0B8F 2-71: ********\n\n        .byte   %11000011       ; 0B90 2-72: **    **\n        .byte   %10011001       ; 0B91 2-72: *  **  *\n        .byte   %10011001       ; 0B92 2-72: *  **  *\n        .byte   %11000001       ; 0B93 2-72: **     *\n        .byte   %11111001       ; 0B94 2-72: *****  *\n        .byte   %10011001       ; 0B95 2-72: *  **  *\n        .byte   %11000011       ; 0B96 2-72: **    **\n        .byte   %11111111       ; 0B97 2-72: ********\n\n        .byte   %11000011       ; 0B98 2-73: **    **\n        .byte   %10011001       ; 0B99 2-73: *  **  *\n        .byte   %10011001       ; 0B9A 2-73: *  **  *\n        .byte   %11000001       ; 0B9B 2-73: **     *\n        .byte   %11111001       ; 0B9C 2-73: *****  *\n        .byte   %10011001       ; 0B9D 2-73: *  **  *\n        .byte   %11000011       ; 0B9E 2-73: **    **\n        .byte   %11111111       ; 0B9F 2-73: ********\n\n        .byte   %11111111       ; 0BA0 2-74: ********\n        .byte   %11111111       ; 0BA1 2-74: ********\n        .byte   %11100111       ; 0BA2 2-74: ***  ***\n        .byte   %11111111       ; 0BA3 2-74: ********\n        .byte   %11111111       ; 0BA4 2-74: ********\n        .byte   %11100111       ; 0BA5 2-74: ***  ***\n        .byte   %11111111       ; 0BA6 2-74: ********\n        .byte   %11111111       ; 0BA7 2-74: ********\n\n        .byte   %11111111       ; 0BA8 2-75: ********\n        .byte   %11111111       ; 0BA9 2-75: ********\n        .byte   %11100111       ; 0BAA 2-75: ***  ***\n        .byte   %11111111       ; 0BAB 2-75: ********\n        .byte   %11111111       ; 0BAC 2-75: ********\n        .byte   %11100111       ; 0BAD 2-75: ***  ***\n        .byte   %11111111       ; 0BAE 2-75: ********\n        .byte   %11111111       ; 0BAF 2-75: ********\n\n        .byte   %11111111       ; 0BB0 2-76: ********\n        .byte   %11111111       ; 0BB1 2-76: ********\n        .byte   %11100111       ; 0BB2 2-76: ***  ***\n        .byte   %11111111       ; 0BB3 2-76: ********\n        .byte   %11111111       ; 0BB4 2-76: ********\n        .byte   %11100111       ; 0BB5 2-76: ***  ***\n        .byte   %11100111       ; 0BB6 2-76: ***  ***\n        .byte   %11001111       ; 0BB7 2-76: **  ****\n\n        .byte   %11111111       ; 0BB8 2-77: ********\n        .byte   %11111111       ; 0BB9 2-77: ********\n        .byte   %11100111       ; 0BBA 2-77: ***  ***\n        .byte   %11111111       ; 0BBB 2-77: ********\n        .byte   %11111111       ; 0BBC 2-77: ********\n        .byte   %11100111       ; 0BBD 2-77: ***  ***\n        .byte   %11100111       ; 0BBE 2-77: ***  ***\n        .byte   %11001111       ; 0BBF 2-77: **  ****\n\n        .byte   %11110001       ; 0BC0 2-78: ****   *\n        .byte   %11100111       ; 0BC1 2-78: ***  ***\n        .byte   %11001111       ; 0BC2 2-78: **  ****\n        .byte   %10011111       ; 0BC3 2-78: *  *****\n        .byte   %11001111       ; 0BC4 2-78: **  ****\n        .byte   %11100111       ; 0BC5 2-78: ***  ***\n        .byte   %11110001       ; 0BC6 2-78: ****   *\n        .byte   %11111111       ; 0BC7 2-78: ********\n\n        .byte   %11110001       ; 0BC8 2-79: ****   *\n        .byte   %11100111       ; 0BC9 2-79: ***  ***\n        .byte   %11001111       ; 0BCA 2-79: **  ****\n        .byte   %10011111       ; 0BCB 2-79: *  *****\n        .byte   %11001111       ; 0BCC 2-79: **  ****\n        .byte   %11100111       ; 0BCD 2-79: ***  ***\n        .byte   %11110001       ; 0BCE 2-79: ****   *\n        .byte   %11111111       ; 0BCF 2-79: ********\n\n        .byte   %11111111       ; 0BD0 2-7a: ********\n        .byte   %11111111       ; 0BD1 2-7a: ********\n        .byte   %10000001       ; 0BD2 2-7a: *      *\n        .byte   %11111111       ; 0BD3 2-7a: ********\n        .byte   %10000001       ; 0BD4 2-7a: *      *\n        .byte   %11111111       ; 0BD5 2-7a: ********\n        .byte   %11111111       ; 0BD6 2-7a: ********\n        .byte   %11111111       ; 0BD7 2-7a: ********\n\n        .byte   %11111111       ; 0BD8 2-7b: ********\n        .byte   %11111111       ; 0BD9 2-7b: ********\n        .byte   %10000001       ; 0BDA 2-7b: *      *\n        .byte   %11111111       ; 0BDB 2-7b: ********\n        .byte   %10000001       ; 0BDC 2-7b: *      *\n        .byte   %11111111       ; 0BDD 2-7b: ********\n        .byte   %11111111       ; 0BDE 2-7b: ********\n        .byte   %11111111       ; 0BDF 2-7b: ********\n\n        .byte   %10001111       ; 0BE0 2-7c: *   ****\n        .byte   %11100111       ; 0BE1 2-7c: ***  ***\n        .byte   %11110011       ; 0BE2 2-7c: ****  **\n        .byte   %11111001       ; 0BE3 2-7c: *****  *\n        .byte   %11110011       ; 0BE4 2-7c: ****  **\n        .byte   %11100111       ; 0BE5 2-7c: ***  ***\n        .byte   %10001111       ; 0BE6 2-7c: *   ****\n        .byte   %11111111       ; 0BE7 2-7c: ********\n\n        .byte   %10001111       ; 0BE8 2-7d: *   ****\n        .byte   %11100111       ; 0BE9 2-7d: ***  ***\n        .byte   %11110011       ; 0BEA 2-7d: ****  **\n        .byte   %11111001       ; 0BEB 2-7d: *****  *\n        .byte   %11110011       ; 0BEC 2-7d: ****  **\n        .byte   %11100111       ; 0BED 2-7d: ***  ***\n        .byte   %10001111       ; 0BEE 2-7d: *   ****\n        .byte   %11111111       ; 0BEF 2-7d: ********\n\n        .byte   %11000011       ; 0BF0 2-7e: **    **\n        .byte   %10011001       ; 0BF1 2-7e: *  **  *\n        .byte   %11111001       ; 0BF2 2-7e: *****  *\n        .byte   %11110011       ; 0BF3 2-7e: ****  **\n        .byte   %11100111       ; 0BF4 2-7e: ***  ***\n        .byte   %11111111       ; 0BF5 2-7e: ********\n        .byte   %11100111       ; 0BF6 2-7e: ***  ***\n        .byte   %11111111       ; 0BF7 2-7e: ********\n\n        .byte   %11000011       ; 0BF8 2-7f: **    **\n        .byte   %10011001       ; 0BF9 2-7f: *  **  *\n        .byte   %11111001       ; 0BFA 2-7f: *****  *\n        .byte   %11110011       ; 0BFB 2-7f: ****  **\n        .byte   %11100111       ; 0BFC 2-7f: ***  ***\n        .byte   %11111111       ; 0BFD 2-7f: ********\n        .byte   %11100111       ; 0BFE 2-7f: ***  ***\n        .byte   %11111111       ; 0BFF 2-7f: ********\n\n        .byte   %11000011       ; 0C00 2-80: **    **\n        .byte   %10011001       ; 0C01 2-80: *  **  *\n        .byte   %10010001       ; 0C02 2-80: *  *   *\n        .byte   %10010001       ; 0C03 2-80: *  *   *\n        .byte   %10011111       ; 0C04 2-80: *  *****\n        .byte   %10011101       ; 0C05 2-80: *  *** *\n        .byte   %11000011       ; 0C06 2-80: **    **\n        .byte   %11111111       ; 0C07 2-80: ********\n\n        .byte   %11000011       ; 0C08 2-81: **    **\n        .byte   %10011001       ; 0C09 2-81: *  **  *\n        .byte   %10010001       ; 0C0A 2-81: *  *   *\n        .byte   %10010001       ; 0C0B 2-81: *  *   *\n        .byte   %10011111       ; 0C0C 2-81: *  *****\n        .byte   %10011101       ; 0C0D 2-81: *  *** *\n        .byte   %11000011       ; 0C0E 2-81: **    **\n        .byte   %11111111       ; 0C0F 2-81: ********\n\n        .byte   %11100111       ; 0C10 2-82: ***  ***\n        .byte   %11000011       ; 0C11 2-82: **    **\n        .byte   %10011001       ; 0C12 2-82: *  **  *\n        .byte   %10000001       ; 0C13 2-82: *      *\n        .byte   %10011001       ; 0C14 2-82: *  **  *\n        .byte   %10011001       ; 0C15 2-82: *  **  *\n        .byte   %10011001       ; 0C16 2-82: *  **  *\n        .byte   %11111111       ; 0C17 2-82: ********\n\n        .byte   %11100111       ; 0C18 2-83: ***  ***\n        .byte   %11000011       ; 0C19 2-83: **    **\n        .byte   %10011001       ; 0C1A 2-83: *  **  *\n        .byte   %10000001       ; 0C1B 2-83: *      *\n        .byte   %10011001       ; 0C1C 2-83: *  **  *\n        .byte   %10011001       ; 0C1D 2-83: *  **  *\n        .byte   %10011001       ; 0C1E 2-83: *  **  *\n        .byte   %11111111       ; 0C1F 2-83: ********\n\n        .byte   %10000011       ; 0C20 2-84: *     **\n        .byte   %10011001       ; 0C21 2-84: *  **  *\n        .byte   %10011001       ; 0C22 2-84: *  **  *\n        .byte   %10000011       ; 0C23 2-84: *     **\n        .byte   %10011001       ; 0C24 2-84: *  **  *\n        .byte   %10011001       ; 0C25 2-84: *  **  *\n        .byte   %10000011       ; 0C26 2-84: *     **\n        .byte   %11111111       ; 0C27 2-84: ********\n\n        .byte   %10000011       ; 0C28 2-85: *     **\n        .byte   %10011001       ; 0C29 2-85: *  **  *\n        .byte   %10011001       ; 0C2A 2-85: *  **  *\n        .byte   %10000011       ; 0C2B 2-85: *     **\n        .byte   %10011001       ; 0C2C 2-85: *  **  *\n        .byte   %10011001       ; 0C2D 2-85: *  **  *\n        .byte   %10000011       ; 0C2E 2-85: *     **\n        .byte   %11111111       ; 0C2F 2-85: ********\n\n        .byte   %11000011       ; 0C30 2-86: **    **\n        .byte   %10011001       ; 0C31 2-86: *  **  *\n        .byte   %10011111       ; 0C32 2-86: *  *****\n        .byte   %10011111       ; 0C33 2-86: *  *****\n        .byte   %10011111       ; 0C34 2-86: *  *****\n        .byte   %10011001       ; 0C35 2-86: *  **  *\n        .byte   %11000011       ; 0C36 2-86: **    **\n        .byte   %11111111       ; 0C37 2-86: ********\n\n        .byte   %11000011       ; 0C38 2-87: **    **\n        .byte   %10011001       ; 0C39 2-87: *  **  *\n        .byte   %10011111       ; 0C3A 2-87: *  *****\n        .byte   %10011111       ; 0C3B 2-87: *  *****\n        .byte   %10011111       ; 0C3C 2-87: *  *****\n        .byte   %10011001       ; 0C3D 2-87: *  **  *\n        .byte   %11000011       ; 0C3E 2-87: **    **\n        .byte   %11111111       ; 0C3F 2-87: ********\n\n        .byte   %10000111       ; 0C40 2-88: *    ***\n        .byte   %10010011       ; 0C41 2-88: *  *  **\n        .byte   %10011001       ; 0C42 2-88: *  **  *\n        .byte   %10011001       ; 0C43 2-88: *  **  *\n        .byte   %10011001       ; 0C44 2-88: *  **  *\n        .byte   %10010011       ; 0C45 2-88: *  *  **\n        .byte   %10000111       ; 0C46 2-88: *    ***\n        .byte   %11111111       ; 0C47 2-88: ********\n\n        .byte   %10000111       ; 0C48 2-89: *    ***\n        .byte   %10010011       ; 0C49 2-89: *  *  **\n        .byte   %10011001       ; 0C4A 2-89: *  **  *\n        .byte   %10011001       ; 0C4B 2-89: *  **  *\n        .byte   %10011001       ; 0C4C 2-89: *  **  *\n        .byte   %10010011       ; 0C4D 2-89: *  *  **\n        .byte   %10000111       ; 0C4E 2-89: *    ***\n        .byte   %11111111       ; 0C4F 2-89: ********\n\n        .byte   %10000001       ; 0C50 2-8a: *      *\n        .byte   %10011111       ; 0C51 2-8a: *  *****\n        .byte   %10011111       ; 0C52 2-8a: *  *****\n        .byte   %10000111       ; 0C53 2-8a: *    ***\n        .byte   %10011111       ; 0C54 2-8a: *  *****\n        .byte   %10011111       ; 0C55 2-8a: *  *****\n        .byte   %10000001       ; 0C56 2-8a: *      *\n        .byte   %11111111       ; 0C57 2-8a: ********\n\n        .byte   %10000001       ; 0C58 2-8b: *      *\n        .byte   %10011111       ; 0C59 2-8b: *  *****\n        .byte   %10011111       ; 0C5A 2-8b: *  *****\n        .byte   %10000111       ; 0C5B 2-8b: *    ***\n        .byte   %10011111       ; 0C5C 2-8b: *  *****\n        .byte   %10011111       ; 0C5D 2-8b: *  *****\n        .byte   %10000001       ; 0C5E 2-8b: *      *\n        .byte   %11111111       ; 0C5F 2-8b: ********\n\n        .byte   %10000001       ; 0C60 2-8c: *      *\n        .byte   %10011111       ; 0C61 2-8c: *  *****\n        .byte   %10011111       ; 0C62 2-8c: *  *****\n        .byte   %10000111       ; 0C63 2-8c: *    ***\n        .byte   %10011111       ; 0C64 2-8c: *  *****\n        .byte   %10011111       ; 0C65 2-8c: *  *****\n        .byte   %10011111       ; 0C66 2-8c: *  *****\n        .byte   %11111111       ; 0C67 2-8c: ********\n\n        .byte   %10000001       ; 0C68 2-8d: *      *\n        .byte   %10011111       ; 0C69 2-8d: *  *****\n        .byte   %10011111       ; 0C6A 2-8d: *  *****\n        .byte   %10000111       ; 0C6B 2-8d: *    ***\n        .byte   %10011111       ; 0C6C 2-8d: *  *****\n        .byte   %10011111       ; 0C6D 2-8d: *  *****\n        .byte   %10011111       ; 0C6E 2-8d: *  *****\n        .byte   %11111111       ; 0C6F 2-8d: ********\n\n        .byte   %11000011       ; 0C70 2-8e: **    **\n        .byte   %10011001       ; 0C71 2-8e: *  **  *\n        .byte   %10011111       ; 0C72 2-8e: *  *****\n        .byte   %10010001       ; 0C73 2-8e: *  *   *\n        .byte   %10011001       ; 0C74 2-8e: *  **  *\n        .byte   %10011001       ; 0C75 2-8e: *  **  *\n        .byte   %11000011       ; 0C76 2-8e: **    **\n        .byte   %11111111       ; 0C77 2-8e: ********\n\n        .byte   %11000011       ; 0C78 2-8f: **    **\n        .byte   %10011001       ; 0C79 2-8f: *  **  *\n        .byte   %10011111       ; 0C7A 2-8f: *  *****\n        .byte   %10010001       ; 0C7B 2-8f: *  *   *\n        .byte   %10011001       ; 0C7C 2-8f: *  **  *\n        .byte   %10011001       ; 0C7D 2-8f: *  **  *\n        .byte   %11000011       ; 0C7E 2-8f: **    **\n        .byte   %11111111       ; 0C7F 2-8f: ********\n\n        .byte   %10011001       ; 0C80 2-90: *  **  *\n        .byte   %10011001       ; 0C81 2-90: *  **  *\n        .byte   %10011001       ; 0C82 2-90: *  **  *\n        .byte   %10000001       ; 0C83 2-90: *      *\n        .byte   %10011001       ; 0C84 2-90: *  **  *\n        .byte   %10011001       ; 0C85 2-90: *  **  *\n        .byte   %10011001       ; 0C86 2-90: *  **  *\n        .byte   %11111111       ; 0C87 2-90: ********\n\n        .byte   %10011001       ; 0C88 2-91: *  **  *\n        .byte   %10011001       ; 0C89 2-91: *  **  *\n        .byte   %10011001       ; 0C8A 2-91: *  **  *\n        .byte   %10000001       ; 0C8B 2-91: *      *\n        .byte   %10011001       ; 0C8C 2-91: *  **  *\n        .byte   %10011001       ; 0C8D 2-91: *  **  *\n        .byte   %10011001       ; 0C8E 2-91: *  **  *\n        .byte   %11111111       ; 0C8F 2-91: ********\n\n        .byte   %11000011       ; 0C90 2-92: **    **\n        .byte   %11100111       ; 0C91 2-92: ***  ***\n        .byte   %11100111       ; 0C92 2-92: ***  ***\n        .byte   %11100111       ; 0C93 2-92: ***  ***\n        .byte   %11100111       ; 0C94 2-92: ***  ***\n        .byte   %11100111       ; 0C95 2-92: ***  ***\n        .byte   %11000011       ; 0C96 2-92: **    **\n        .byte   %11111111       ; 0C97 2-92: ********\n\n        .byte   %11000011       ; 0C98 2-93: **    **\n        .byte   %11100111       ; 0C99 2-93: ***  ***\n        .byte   %11100111       ; 0C9A 2-93: ***  ***\n        .byte   %11100111       ; 0C9B 2-93: ***  ***\n        .byte   %11100111       ; 0C9C 2-93: ***  ***\n        .byte   %11100111       ; 0C9D 2-93: ***  ***\n        .byte   %11000011       ; 0C9E 2-93: **    **\n        .byte   %11111111       ; 0C9F 2-93: ********\n\n        .byte   %11100001       ; 0CA0 2-94: ***    *\n        .byte   %11110011       ; 0CA1 2-94: ****  **\n        .byte   %11110011       ; 0CA2 2-94: ****  **\n        .byte   %11110011       ; 0CA3 2-94: ****  **\n        .byte   %11110011       ; 0CA4 2-94: ****  **\n        .byte   %10010011       ; 0CA5 2-94: *  *  **\n        .byte   %11000111       ; 0CA6 2-94: **   ***\n        .byte   %11111111       ; 0CA7 2-94: ********\n\n        .byte   %11100001       ; 0CA8 2-95: ***    *\n        .byte   %11110011       ; 0CA9 2-95: ****  **\n        .byte   %11110011       ; 0CAA 2-95: ****  **\n        .byte   %11110011       ; 0CAB 2-95: ****  **\n        .byte   %11110011       ; 0CAC 2-95: ****  **\n        .byte   %10010011       ; 0CAD 2-95: *  *  **\n        .byte   %11000111       ; 0CAE 2-95: **   ***\n        .byte   %11111111       ; 0CAF 2-95: ********\n\n        .byte   %10011001       ; 0CB0 2-96: *  **  *\n        .byte   %10010011       ; 0CB1 2-96: *  *  **\n        .byte   %10000111       ; 0CB2 2-96: *    ***\n        .byte   %10001111       ; 0CB3 2-96: *   ****\n        .byte   %10000111       ; 0CB4 2-96: *    ***\n        .byte   %10010011       ; 0CB5 2-96: *  *  **\n        .byte   %10011001       ; 0CB6 2-96: *  **  *\n        .byte   %11111111       ; 0CB7 2-96: ********\n\n        .byte   %10011001       ; 0CB8 2-97: *  **  *\n        .byte   %10010011       ; 0CB9 2-97: *  *  **\n        .byte   %10000111       ; 0CBA 2-97: *    ***\n        .byte   %10001111       ; 0CBB 2-97: *   ****\n        .byte   %10000111       ; 0CBC 2-97: *    ***\n        .byte   %10010011       ; 0CBD 2-97: *  *  **\n        .byte   %10011001       ; 0CBE 2-97: *  **  *\n        .byte   %11111111       ; 0CBF 2-97: ********\n\n        .byte   %10011111       ; 0CC0 2-98: *  *****\n        .byte   %10011111       ; 0CC1 2-98: *  *****\n        .byte   %10011111       ; 0CC2 2-98: *  *****\n        .byte   %10011111       ; 0CC3 2-98: *  *****\n        .byte   %10011111       ; 0CC4 2-98: *  *****\n        .byte   %10011111       ; 0CC5 2-98: *  *****\n        .byte   %10000001       ; 0CC6 2-98: *      *\n        .byte   %11111111       ; 0CC7 2-98: ********\n\n        .byte   %10011111       ; 0CC8 2-99: *  *****\n        .byte   %10011111       ; 0CC9 2-99: *  *****\n        .byte   %10011111       ; 0CCA 2-99: *  *****\n        .byte   %10011111       ; 0CCB 2-99: *  *****\n        .byte   %10011111       ; 0CCC 2-99: *  *****\n        .byte   %10011111       ; 0CCD 2-99: *  *****\n        .byte   %10000001       ; 0CCE 2-99: *      *\n        .byte   %11111111       ; 0CCF 2-99: ********\n\n        .byte   %10011100       ; 0CD0 2-9a: *  ***  \n        .byte   %10001000       ; 0CD1 2-9a: *   *   \n        .byte   %10000000       ; 0CD2 2-9a: *       \n        .byte   %10010100       ; 0CD3 2-9a: *  * *  \n        .byte   %10011100       ; 0CD4 2-9a: *  ***  \n        .byte   %10011100       ; 0CD5 2-9a: *  ***  \n        .byte   %10011100       ; 0CD6 2-9a: *  ***  \n        .byte   %11111111       ; 0CD7 2-9a: ********\n\n        .byte   %10011100       ; 0CD8 2-9b: *  ***  \n        .byte   %10001000       ; 0CD9 2-9b: *   *   \n        .byte   %10000000       ; 0CDA 2-9b: *       \n        .byte   %10010100       ; 0CDB 2-9b: *  * *  \n        .byte   %10011100       ; 0CDC 2-9b: *  ***  \n        .byte   %10011100       ; 0CDD 2-9b: *  ***  \n        .byte   %10011100       ; 0CDE 2-9b: *  ***  \n        .byte   %11111111       ; 0CDF 2-9b: ********\n\n        .byte   %10011001       ; 0CE0 2-9c: *  **  *\n        .byte   %10001001       ; 0CE1 2-9c: *   *  *\n        .byte   %10000001       ; 0CE2 2-9c: *      *\n        .byte   %10000001       ; 0CE3 2-9c: *      *\n        .byte   %10010001       ; 0CE4 2-9c: *  *   *\n        .byte   %10011001       ; 0CE5 2-9c: *  **  *\n        .byte   %10011001       ; 0CE6 2-9c: *  **  *\n        .byte   %11111111       ; 0CE7 2-9c: ********\n\n        .byte   %10011001       ; 0CE8 2-9d: *  **  *\n        .byte   %10001001       ; 0CE9 2-9d: *   *  *\n        .byte   %10000001       ; 0CEA 2-9d: *      *\n        .byte   %10000001       ; 0CEB 2-9d: *      *\n        .byte   %10010001       ; 0CEC 2-9d: *  *   *\n        .byte   %10011001       ; 0CED 2-9d: *  **  *\n        .byte   %10011001       ; 0CEE 2-9d: *  **  *\n        .byte   %11111111       ; 0CEF 2-9d: ********\n\n        .byte   %11000011       ; 0CF0 2-9e: **    **\n        .byte   %10011001       ; 0CF1 2-9e: *  **  *\n        .byte   %10011001       ; 0CF2 2-9e: *  **  *\n        .byte   %10011001       ; 0CF3 2-9e: *  **  *\n        .byte   %10011001       ; 0CF4 2-9e: *  **  *\n        .byte   %10011001       ; 0CF5 2-9e: *  **  *\n        .byte   %11000011       ; 0CF6 2-9e: **    **\n        .byte   %11111111       ; 0CF7 2-9e: ********\n\n        .byte   %11000011       ; 0CF8 2-9f: **    **\n        .byte   %10011001       ; 0CF9 2-9f: *  **  *\n        .byte   %10011001       ; 0CFA 2-9f: *  **  *\n        .byte   %10011001       ; 0CFB 2-9f: *  **  *\n        .byte   %10011001       ; 0CFC 2-9f: *  **  *\n        .byte   %10011001       ; 0CFD 2-9f: *  **  *\n        .byte   %11000011       ; 0CFE 2-9f: **    **\n        .byte   %11111111       ; 0CFF 2-9f: ********\n\n        .byte   %10000011       ; 0D00 2-a0: *     **\n        .byte   %10011001       ; 0D01 2-a0: *  **  *\n        .byte   %10011001       ; 0D02 2-a0: *  **  *\n        .byte   %10000011       ; 0D03 2-a0: *     **\n        .byte   %10011111       ; 0D04 2-a0: *  *****\n        .byte   %10011111       ; 0D05 2-a0: *  *****\n        .byte   %10011111       ; 0D06 2-a0: *  *****\n        .byte   %11111111       ; 0D07 2-a0: ********\n\n        .byte   %10000011       ; 0D08 2-a1: *     **\n        .byte   %10011001       ; 0D09 2-a1: *  **  *\n        .byte   %10011001       ; 0D0A 2-a1: *  **  *\n        .byte   %10000011       ; 0D0B 2-a1: *     **\n        .byte   %10011111       ; 0D0C 2-a1: *  *****\n        .byte   %10011111       ; 0D0D 2-a1: *  *****\n        .byte   %10011111       ; 0D0E 2-a1: *  *****\n        .byte   %11111111       ; 0D0F 2-a1: ********\n\n        .byte   %11000011       ; 0D10 2-a2: **    **\n        .byte   %10011001       ; 0D11 2-a2: *  **  *\n        .byte   %10011001       ; 0D12 2-a2: *  **  *\n        .byte   %10011001       ; 0D13 2-a2: *  **  *\n        .byte   %10011001       ; 0D14 2-a2: *  **  *\n        .byte   %11000011       ; 0D15 2-a2: **    **\n        .byte   %11110001       ; 0D16 2-a2: ****   *\n        .byte   %11111111       ; 0D17 2-a2: ********\n\n        .byte   %11000011       ; 0D18 2-a3: **    **\n        .byte   %10011001       ; 0D19 2-a3: *  **  *\n        .byte   %10011001       ; 0D1A 2-a3: *  **  *\n        .byte   %10011001       ; 0D1B 2-a3: *  **  *\n        .byte   %10011001       ; 0D1C 2-a3: *  **  *\n        .byte   %11000011       ; 0D1D 2-a3: **    **\n        .byte   %11110001       ; 0D1E 2-a3: ****   *\n        .byte   %11111111       ; 0D1F 2-a3: ********\n\n        .byte   %10000011       ; 0D20 2-a4: *     **\n        .byte   %10011001       ; 0D21 2-a4: *  **  *\n        .byte   %10011001       ; 0D22 2-a4: *  **  *\n        .byte   %10000011       ; 0D23 2-a4: *     **\n        .byte   %10000111       ; 0D24 2-a4: *    ***\n        .byte   %10010011       ; 0D25 2-a4: *  *  **\n        .byte   %10011001       ; 0D26 2-a4: *  **  *\n        .byte   %11111111       ; 0D27 2-a4: ********\n\n        .byte   %10000011       ; 0D28 2-a5: *     **\n        .byte   %10011001       ; 0D29 2-a5: *  **  *\n        .byte   %10011001       ; 0D2A 2-a5: *  **  *\n        .byte   %10000011       ; 0D2B 2-a5: *     **\n        .byte   %10000111       ; 0D2C 2-a5: *    ***\n        .byte   %10010011       ; 0D2D 2-a5: *  *  **\n        .byte   %10011001       ; 0D2E 2-a5: *  **  *\n        .byte   %11111111       ; 0D2F 2-a5: ********\n\n        .byte   %11000011       ; 0D30 2-a6: **    **\n        .byte   %10011001       ; 0D31 2-a6: *  **  *\n        .byte   %10011111       ; 0D32 2-a6: *  *****\n        .byte   %11000011       ; 0D33 2-a6: **    **\n        .byte   %11111001       ; 0D34 2-a6: *****  *\n        .byte   %10011001       ; 0D35 2-a6: *  **  *\n        .byte   %11000011       ; 0D36 2-a6: **    **\n        .byte   %11111111       ; 0D37 2-a6: ********\n\n        .byte   %11000011       ; 0D38 2-a7: **    **\n        .byte   %10011001       ; 0D39 2-a7: *  **  *\n        .byte   %10011111       ; 0D3A 2-a7: *  *****\n        .byte   %11000011       ; 0D3B 2-a7: **    **\n        .byte   %11111001       ; 0D3C 2-a7: *****  *\n        .byte   %10011001       ; 0D3D 2-a7: *  **  *\n        .byte   %11000011       ; 0D3E 2-a7: **    **\n        .byte   %11111111       ; 0D3F 2-a7: ********\n\n        .byte   %10000001       ; 0D40 2-a8: *      *\n        .byte   %11100111       ; 0D41 2-a8: ***  ***\n        .byte   %11100111       ; 0D42 2-a8: ***  ***\n        .byte   %11100111       ; 0D43 2-a8: ***  ***\n        .byte   %11100111       ; 0D44 2-a8: ***  ***\n        .byte   %11100111       ; 0D45 2-a8: ***  ***\n        .byte   %11100111       ; 0D46 2-a8: ***  ***\n        .byte   %11111111       ; 0D47 2-a8: ********\n\n        .byte   %10000001       ; 0D48 2-a9: *      *\n        .byte   %11100111       ; 0D49 2-a9: ***  ***\n        .byte   %11100111       ; 0D4A 2-a9: ***  ***\n        .byte   %11100111       ; 0D4B 2-a9: ***  ***\n        .byte   %11100111       ; 0D4C 2-a9: ***  ***\n        .byte   %11100111       ; 0D4D 2-a9: ***  ***\n        .byte   %11100111       ; 0D4E 2-a9: ***  ***\n        .byte   %11111111       ; 0D4F 2-a9: ********\n\n        .byte   %10011001       ; 0D50 2-aa: *  **  *\n        .byte   %10011001       ; 0D51 2-aa: *  **  *\n        .byte   %10011001       ; 0D52 2-aa: *  **  *\n        .byte   %10011001       ; 0D53 2-aa: *  **  *\n        .byte   %10011001       ; 0D54 2-aa: *  **  *\n        .byte   %10011001       ; 0D55 2-aa: *  **  *\n        .byte   %11000011       ; 0D56 2-aa: **    **\n        .byte   %11111111       ; 0D57 2-aa: ********\n\n        .byte   %10011001       ; 0D58 2-ab: *  **  *\n        .byte   %10011001       ; 0D59 2-ab: *  **  *\n        .byte   %10011001       ; 0D5A 2-ab: *  **  *\n        .byte   %10011001       ; 0D5B 2-ab: *  **  *\n        .byte   %10011001       ; 0D5C 2-ab: *  **  *\n        .byte   %10011001       ; 0D5D 2-ab: *  **  *\n        .byte   %11000011       ; 0D5E 2-ab: **    **\n        .byte   %11111111       ; 0D5F 2-ab: ********\n\n        .byte   %10011001       ; 0D60 2-ac: *  **  *\n        .byte   %10011001       ; 0D61 2-ac: *  **  *\n        .byte   %10011001       ; 0D62 2-ac: *  **  *\n        .byte   %10011001       ; 0D63 2-ac: *  **  *\n        .byte   %10011001       ; 0D64 2-ac: *  **  *\n        .byte   %11000011       ; 0D65 2-ac: **    **\n        .byte   %11100111       ; 0D66 2-ac: ***  ***\n        .byte   %11111111       ; 0D67 2-ac: ********\n\n        .byte   %10011001       ; 0D68 2-ad: *  **  *\n        .byte   %10011001       ; 0D69 2-ad: *  **  *\n        .byte   %10011001       ; 0D6A 2-ad: *  **  *\n        .byte   %10011001       ; 0D6B 2-ad: *  **  *\n        .byte   %10011001       ; 0D6C 2-ad: *  **  *\n        .byte   %11000011       ; 0D6D 2-ad: **    **\n        .byte   %11100111       ; 0D6E 2-ad: ***  ***\n        .byte   %11111111       ; 0D6F 2-ad: ********\n\n        .byte   %10011100       ; 0D70 2-ae: *  ***  \n        .byte   %10011100       ; 0D71 2-ae: *  ***  \n        .byte   %10011100       ; 0D72 2-ae: *  ***  \n        .byte   %10010100       ; 0D73 2-ae: *  * *  \n        .byte   %10000000       ; 0D74 2-ae: *       \n        .byte   %10001000       ; 0D75 2-ae: *   *   \n        .byte   %10011100       ; 0D76 2-ae: *  ***  \n        .byte   %11111111       ; 0D77 2-ae: ********\n\n        .byte   %10011100       ; 0D78 2-af: *  ***  \n        .byte   %10011100       ; 0D79 2-af: *  ***  \n        .byte   %10011100       ; 0D7A 2-af: *  ***  \n        .byte   %10010100       ; 0D7B 2-af: *  * *  \n        .byte   %10000000       ; 0D7C 2-af: *       \n        .byte   %10001000       ; 0D7D 2-af: *   *   \n        .byte   %10011100       ; 0D7E 2-af: *  ***  \n        .byte   %11111111       ; 0D7F 2-af: ********\n\n        .byte   %10011001       ; 0D80 2-b0: *  **  *\n        .byte   %10011001       ; 0D81 2-b0: *  **  *\n        .byte   %11000011       ; 0D82 2-b0: **    **\n        .byte   %11100111       ; 0D83 2-b0: ***  ***\n        .byte   %11000011       ; 0D84 2-b0: **    **\n        .byte   %10011001       ; 0D85 2-b0: *  **  *\n        .byte   %10011001       ; 0D86 2-b0: *  **  *\n        .byte   %11111111       ; 0D87 2-b0: ********\n\n        .byte   %10011001       ; 0D88 2-b1: *  **  *\n        .byte   %10011001       ; 0D89 2-b1: *  **  *\n        .byte   %11000011       ; 0D8A 2-b1: **    **\n        .byte   %11100111       ; 0D8B 2-b1: ***  ***\n        .byte   %11000011       ; 0D8C 2-b1: **    **\n        .byte   %10011001       ; 0D8D 2-b1: *  **  *\n        .byte   %10011001       ; 0D8E 2-b1: *  **  *\n        .byte   %11111111       ; 0D8F 2-b1: ********\n\n        .byte   %10011001       ; 0D90 2-b2: *  **  *\n        .byte   %10011001       ; 0D91 2-b2: *  **  *\n        .byte   %10011001       ; 0D92 2-b2: *  **  *\n        .byte   %11000011       ; 0D93 2-b2: **    **\n        .byte   %11100111       ; 0D94 2-b2: ***  ***\n        .byte   %11100111       ; 0D95 2-b2: ***  ***\n        .byte   %11100111       ; 0D96 2-b2: ***  ***\n        .byte   %11111111       ; 0D97 2-b2: ********\n\n        .byte   %10011001       ; 0D98 2-b3: *  **  *\n        .byte   %10011001       ; 0D99 2-b3: *  **  *\n        .byte   %10011001       ; 0D9A 2-b3: *  **  *\n        .byte   %11000011       ; 0D9B 2-b3: **    **\n        .byte   %11100111       ; 0D9C 2-b3: ***  ***\n        .byte   %11100111       ; 0D9D 2-b3: ***  ***\n        .byte   %11100111       ; 0D9E 2-b3: ***  ***\n        .byte   %11111111       ; 0D9F 2-b3: ********\n\n        .byte   %10000001       ; 0DA0 2-b4: *      *\n        .byte   %11111001       ; 0DA1 2-b4: *****  *\n        .byte   %11110011       ; 0DA2 2-b4: ****  **\n        .byte   %11100111       ; 0DA3 2-b4: ***  ***\n        .byte   %11001111       ; 0DA4 2-b4: **  ****\n        .byte   %10011111       ; 0DA5 2-b4: *  *****\n        .byte   %10000001       ; 0DA6 2-b4: *      *\n        .byte   %11111111       ; 0DA7 2-b4: ********\n\n        .byte   %10000001       ; 0DA8 2-b5: *      *\n        .byte   %11111001       ; 0DA9 2-b5: *****  *\n        .byte   %11110011       ; 0DAA 2-b5: ****  **\n        .byte   %11100111       ; 0DAB 2-b5: ***  ***\n        .byte   %11001111       ; 0DAC 2-b5: **  ****\n        .byte   %10011111       ; 0DAD 2-b5: *  *****\n        .byte   %10000001       ; 0DAE 2-b5: *      *\n        .byte   %11111111       ; 0DAF 2-b5: ********\n\n        .byte   %11000011       ; 0DB0 2-b6: **    **\n        .byte   %11001111       ; 0DB1 2-b6: **  ****\n        .byte   %11001111       ; 0DB2 2-b6: **  ****\n        .byte   %11001111       ; 0DB3 2-b6: **  ****\n        .byte   %11001111       ; 0DB4 2-b6: **  ****\n        .byte   %11001111       ; 0DB5 2-b6: **  ****\n        .byte   %11000011       ; 0DB6 2-b6: **    **\n        .byte   %11111111       ; 0DB7 2-b6: ********\n\n        .byte   %11000011       ; 0DB8 2-b7: **    **\n        .byte   %11001111       ; 0DB9 2-b7: **  ****\n        .byte   %11001111       ; 0DBA 2-b7: **  ****\n        .byte   %11001111       ; 0DBB 2-b7: **  ****\n        .byte   %11001111       ; 0DBC 2-b7: **  ****\n        .byte   %11001111       ; 0DBD 2-b7: **  ****\n        .byte   %11000011       ; 0DBE 2-b7: **    **\n        .byte   %11111111       ; 0DBF 2-b7: ********\n\n        .byte   %10011111       ; 0DC0 2-b8: *  *****\n        .byte   %11001111       ; 0DC1 2-b8: **  ****\n        .byte   %11100111       ; 0DC2 2-b8: ***  ***\n        .byte   %11110011       ; 0DC3 2-b8: ****  **\n        .byte   %11111001       ; 0DC4 2-b8: *****  *\n        .byte   %11111100       ; 0DC5 2-b8: ******  \n        .byte   %11111111       ; 0DC6 2-b8: ********\n        .byte   %11111111       ; 0DC7 2-b8: ********\n\n        .byte   %10011111       ; 0DC8 2-b9: *  *****\n        .byte   %11001111       ; 0DC9 2-b9: **  ****\n        .byte   %11100111       ; 0DCA 2-b9: ***  ***\n        .byte   %11110011       ; 0DCB 2-b9: ****  **\n        .byte   %11111001       ; 0DCC 2-b9: *****  *\n        .byte   %11111100       ; 0DCD 2-b9: ******  \n        .byte   %11111111       ; 0DCE 2-b9: ********\n        .byte   %11111111       ; 0DCF 2-b9: ********\n\n        .byte   %11000011       ; 0DD0 2-ba: **    **\n        .byte   %11110011       ; 0DD1 2-ba: ****  **\n        .byte   %11110011       ; 0DD2 2-ba: ****  **\n        .byte   %11110011       ; 0DD3 2-ba: ****  **\n        .byte   %11110011       ; 0DD4 2-ba: ****  **\n        .byte   %11110011       ; 0DD5 2-ba: ****  **\n        .byte   %11000011       ; 0DD6 2-ba: **    **\n        .byte   %11111111       ; 0DD7 2-ba: ********\n\n        .byte   %11000011       ; 0DD8 2-bb: **    **\n        .byte   %11110011       ; 0DD9 2-bb: ****  **\n        .byte   %11110011       ; 0DDA 2-bb: ****  **\n        .byte   %11110011       ; 0DDB 2-bb: ****  **\n        .byte   %11110011       ; 0DDC 2-bb: ****  **\n        .byte   %11110011       ; 0DDD 2-bb: ****  **\n        .byte   %11000011       ; 0DDE 2-bb: **    **\n        .byte   %11111111       ; 0DDF 2-bb: ********\n\n        .byte   %11111111       ; 0DE0 2-bc: ********\n        .byte   %11100111       ; 0DE1 2-bc: ***  ***\n        .byte   %11000011       ; 0DE2 2-bc: **    **\n        .byte   %10011001       ; 0DE3 2-bc: *  **  *\n        .byte   %11111111       ; 0DE4 2-bc: ********\n        .byte   %11111111       ; 0DE5 2-bc: ********\n        .byte   %11111111       ; 0DE6 2-bc: ********\n        .byte   %11111111       ; 0DE7 2-bc: ********\n\n        .byte   %11111111       ; 0DE8 2-bd: ********\n        .byte   %11100111       ; 0DE9 2-bd: ***  ***\n        .byte   %11000011       ; 0DEA 2-bd: **    **\n        .byte   %10011001       ; 0DEB 2-bd: *  **  *\n        .byte   %11111111       ; 0DEC 2-bd: ********\n        .byte   %11111111       ; 0DED 2-bd: ********\n        .byte   %11111111       ; 0DEE 2-bd: ********\n        .byte   %11111111       ; 0DEF 2-bd: ********\n\n        .byte   %11111111       ; 0DF0 2-be: ********\n        .byte   %11111111       ; 0DF1 2-be: ********\n        .byte   %11111111       ; 0DF2 2-be: ********\n        .byte   %11111111       ; 0DF3 2-be: ********\n        .byte   %11111111       ; 0DF4 2-be: ********\n        .byte   %11111111       ; 0DF5 2-be: ********\n        .byte   %10000000       ; 0DF6 2-be: *       \n        .byte   %11111111       ; 0DF7 2-be: ********\n\n        .byte   %11111111       ; 0DF8 2-bf: ********\n        .byte   %11111111       ; 0DF9 2-bf: ********\n        .byte   %11111111       ; 0DFA 2-bf: ********\n        .byte   %11111111       ; 0DFB 2-bf: ********\n        .byte   %11111111       ; 0DFC 2-bf: ********\n        .byte   %11111111       ; 0DFD 2-bf: ********\n        .byte   %10000000       ; 0DFE 2-bf: *       \n        .byte   %11111111       ; 0DFF 2-bf: ********\n\n        .byte   %11100111       ; 0E00 2-c0: ***  ***\n        .byte   %11100111       ; 0E01 2-c0: ***  ***\n        .byte   %11100111       ; 0E02 2-c0: ***  ***\n        .byte   %11111111       ; 0E03 2-c0: ********\n        .byte   %11111111       ; 0E04 2-c0: ********\n        .byte   %11111111       ; 0E05 2-c0: ********\n        .byte   %11111111       ; 0E06 2-c0: ********\n        .byte   %11111111       ; 0E07 2-c0: ********\n\n        .byte   %11100111       ; 0E08 2-c1: ***  ***\n        .byte   %11100111       ; 0E09 2-c1: ***  ***\n        .byte   %11100111       ; 0E0A 2-c1: ***  ***\n        .byte   %11111111       ; 0E0B 2-c1: ********\n        .byte   %11111111       ; 0E0C 2-c1: ********\n        .byte   %11111111       ; 0E0D 2-c1: ********\n        .byte   %11111111       ; 0E0E 2-c1: ********\n        .byte   %11111111       ; 0E0F 2-c1: ********\n\n        .byte   %11111111       ; 0E10 2-c2: ********\n        .byte   %11111111       ; 0E11 2-c2: ********\n        .byte   %11000011       ; 0E12 2-c2: **    **\n        .byte   %11111001       ; 0E13 2-c2: *****  *\n        .byte   %11000001       ; 0E14 2-c2: **     *\n        .byte   %10011001       ; 0E15 2-c2: *  **  *\n        .byte   %11000001       ; 0E16 2-c2: **     *\n        .byte   %11111111       ; 0E17 2-c2: ********\n\n        .byte   %11111111       ; 0E18 2-c3: ********\n        .byte   %11111111       ; 0E19 2-c3: ********\n        .byte   %11000011       ; 0E1A 2-c3: **    **\n        .byte   %11111001       ; 0E1B 2-c3: *****  *\n        .byte   %11000001       ; 0E1C 2-c3: **     *\n        .byte   %10011001       ; 0E1D 2-c3: *  **  *\n        .byte   %11000001       ; 0E1E 2-c3: **     *\n        .byte   %11111111       ; 0E1F 2-c3: ********\n\n        .byte   %11111111       ; 0E20 2-c4: ********\n        .byte   %10011111       ; 0E21 2-c4: *  *****\n        .byte   %10011111       ; 0E22 2-c4: *  *****\n        .byte   %10000011       ; 0E23 2-c4: *     **\n        .byte   %10011001       ; 0E24 2-c4: *  **  *\n        .byte   %10011001       ; 0E25 2-c4: *  **  *\n        .byte   %10000011       ; 0E26 2-c4: *     **\n        .byte   %11111111       ; 0E27 2-c4: ********\n\n        .byte   %11111111       ; 0E28 2-c5: ********\n        .byte   %10011111       ; 0E29 2-c5: *  *****\n        .byte   %10011111       ; 0E2A 2-c5: *  *****\n        .byte   %10000011       ; 0E2B 2-c5: *     **\n        .byte   %10011001       ; 0E2C 2-c5: *  **  *\n        .byte   %10011001       ; 0E2D 2-c5: *  **  *\n        .byte   %10000011       ; 0E2E 2-c5: *     **\n        .byte   %11111111       ; 0E2F 2-c5: ********\n\n        .byte   %11111111       ; 0E30 2-c6: ********\n        .byte   %11111111       ; 0E31 2-c6: ********\n        .byte   %11000011       ; 0E32 2-c6: **    **\n        .byte   %10011111       ; 0E33 2-c6: *  *****\n        .byte   %10011111       ; 0E34 2-c6: *  *****\n        .byte   %10011111       ; 0E35 2-c6: *  *****\n        .byte   %11000011       ; 0E36 2-c6: **    **\n        .byte   %11111111       ; 0E37 2-c6: ********\n\n        .byte   %11111111       ; 0E38 2-c7: ********\n        .byte   %11111111       ; 0E39 2-c7: ********\n        .byte   %11000011       ; 0E3A 2-c7: **    **\n        .byte   %10011111       ; 0E3B 2-c7: *  *****\n        .byte   %10011111       ; 0E3C 2-c7: *  *****\n        .byte   %10011111       ; 0E3D 2-c7: *  *****\n        .byte   %11000011       ; 0E3E 2-c7: **    **\n        .byte   %11111111       ; 0E3F 2-c7: ********\n\n        .byte   %11111111       ; 0E40 2-c8: ********\n        .byte   %11111001       ; 0E41 2-c8: *****  *\n        .byte   %11111001       ; 0E42 2-c8: *****  *\n        .byte   %11000001       ; 0E43 2-c8: **     *\n        .byte   %10011001       ; 0E44 2-c8: *  **  *\n        .byte   %10011001       ; 0E45 2-c8: *  **  *\n        .byte   %11000001       ; 0E46 2-c8: **     *\n        .byte   %11111111       ; 0E47 2-c8: ********\n\n        .byte   %11111111       ; 0E48 2-c9: ********\n        .byte   %11111001       ; 0E49 2-c9: *****  *\n        .byte   %11111001       ; 0E4A 2-c9: *****  *\n        .byte   %11000001       ; 0E4B 2-c9: **     *\n        .byte   %10011001       ; 0E4C 2-c9: *  **  *\n        .byte   %10011001       ; 0E4D 2-c9: *  **  *\n        .byte   %11000001       ; 0E4E 2-c9: **     *\n        .byte   %11111111       ; 0E4F 2-c9: ********\n\n        .byte   %11111111       ; 0E50 2-ca: ********\n        .byte   %11111111       ; 0E51 2-ca: ********\n        .byte   %11000011       ; 0E52 2-ca: **    **\n        .byte   %10011001       ; 0E53 2-ca: *  **  *\n        .byte   %10000001       ; 0E54 2-ca: *      *\n        .byte   %10011111       ; 0E55 2-ca: *  *****\n        .byte   %11000011       ; 0E56 2-ca: **    **\n        .byte   %11111111       ; 0E57 2-ca: ********\n\n        .byte   %11111111       ; 0E58 2-cb: ********\n        .byte   %11111111       ; 0E59 2-cb: ********\n        .byte   %11000011       ; 0E5A 2-cb: **    **\n        .byte   %10011001       ; 0E5B 2-cb: *  **  *\n        .byte   %10000001       ; 0E5C 2-cb: *      *\n        .byte   %10011111       ; 0E5D 2-cb: *  *****\n        .byte   %11000011       ; 0E5E 2-cb: **    **\n        .byte   %11111111       ; 0E5F 2-cb: ********\n\n        .byte   %11111111       ; 0E60 2-cc: ********\n        .byte   %11110001       ; 0E61 2-cc: ****   *\n        .byte   %11100111       ; 0E62 2-cc: ***  ***\n        .byte   %11000001       ; 0E63 2-cc: **     *\n        .byte   %11100111       ; 0E64 2-cc: ***  ***\n        .byte   %11100111       ; 0E65 2-cc: ***  ***\n        .byte   %11100111       ; 0E66 2-cc: ***  ***\n        .byte   %11111111       ; 0E67 2-cc: ********\n\n        .byte   %11111111       ; 0E68 2-cd: ********\n        .byte   %11110001       ; 0E69 2-cd: ****   *\n        .byte   %11100111       ; 0E6A 2-cd: ***  ***\n        .byte   %11000001       ; 0E6B 2-cd: **     *\n        .byte   %11100111       ; 0E6C 2-cd: ***  ***\n        .byte   %11100111       ; 0E6D 2-cd: ***  ***\n        .byte   %11100111       ; 0E6E 2-cd: ***  ***\n        .byte   %11111111       ; 0E6F 2-cd: ********\n\n        .byte   %11111111       ; 0E70 2-ce: ********\n        .byte   %11111111       ; 0E71 2-ce: ********\n        .byte   %11000001       ; 0E72 2-ce: **     *\n        .byte   %10011001       ; 0E73 2-ce: *  **  *\n        .byte   %10011001       ; 0E74 2-ce: *  **  *\n        .byte   %11000001       ; 0E75 2-ce: **     *\n        .byte   %11111001       ; 0E76 2-ce: *****  *\n        .byte   %10000011       ; 0E77 2-ce: *     **\n\n        .byte   %11111111       ; 0E78 2-cf: ********\n        .byte   %11111111       ; 0E79 2-cf: ********\n        .byte   %11000001       ; 0E7A 2-cf: **     *\n        .byte   %10011001       ; 0E7B 2-cf: *  **  *\n        .byte   %10011001       ; 0E7C 2-cf: *  **  *\n        .byte   %11000001       ; 0E7D 2-cf: **     *\n        .byte   %11111001       ; 0E7E 2-cf: *****  *\n        .byte   %10000011       ; 0E7F 2-cf: *     **\n\n        .byte   %11111111       ; 0E80 2-d0: ********\n        .byte   %10011111       ; 0E81 2-d0: *  *****\n        .byte   %10011111       ; 0E82 2-d0: *  *****\n        .byte   %10000011       ; 0E83 2-d0: *     **\n        .byte   %10011001       ; 0E84 2-d0: *  **  *\n        .byte   %10011001       ; 0E85 2-d0: *  **  *\n        .byte   %10011001       ; 0E86 2-d0: *  **  *\n        .byte   %11111111       ; 0E87 2-d0: ********\n\n        .byte   %11111111       ; 0E88 2-d1: ********\n        .byte   %10011111       ; 0E89 2-d1: *  *****\n        .byte   %10011111       ; 0E8A 2-d1: *  *****\n        .byte   %10000011       ; 0E8B 2-d1: *     **\n        .byte   %10011001       ; 0E8C 2-d1: *  **  *\n        .byte   %10011001       ; 0E8D 2-d1: *  **  *\n        .byte   %10011001       ; 0E8E 2-d1: *  **  *\n        .byte   %11111111       ; 0E8F 2-d1: ********\n\n        .byte   %11111111       ; 0E90 2-d2: ********\n        .byte   %11100111       ; 0E91 2-d2: ***  ***\n        .byte   %11111111       ; 0E92 2-d2: ********\n        .byte   %11000111       ; 0E93 2-d2: **   ***\n        .byte   %11100111       ; 0E94 2-d2: ***  ***\n        .byte   %11100111       ; 0E95 2-d2: ***  ***\n        .byte   %11000011       ; 0E96 2-d2: **    **\n        .byte   %11111111       ; 0E97 2-d2: ********\n\n        .byte   %11111111       ; 0E98 2-d3: ********\n        .byte   %11100111       ; 0E99 2-d3: ***  ***\n        .byte   %11111111       ; 0E9A 2-d3: ********\n        .byte   %11000111       ; 0E9B 2-d3: **   ***\n        .byte   %11100111       ; 0E9C 2-d3: ***  ***\n        .byte   %11100111       ; 0E9D 2-d3: ***  ***\n        .byte   %11000011       ; 0E9E 2-d3: **    **\n        .byte   %11111111       ; 0E9F 2-d3: ********\n\n        .byte   %11111111       ; 0EA0 2-d4: ********\n        .byte   %11111001       ; 0EA1 2-d4: *****  *\n        .byte   %11111111       ; 0EA2 2-d4: ********\n        .byte   %11111001       ; 0EA3 2-d4: *****  *\n        .byte   %11111001       ; 0EA4 2-d4: *****  *\n        .byte   %11111001       ; 0EA5 2-d4: *****  *\n        .byte   %11111001       ; 0EA6 2-d4: *****  *\n        .byte   %11000011       ; 0EA7 2-d4: **    **\n\n        .byte   %11111111       ; 0EA8 2-d5: ********\n        .byte   %11111001       ; 0EA9 2-d5: *****  *\n        .byte   %11111111       ; 0EAA 2-d5: ********\n        .byte   %11111001       ; 0EAB 2-d5: *****  *\n        .byte   %11111001       ; 0EAC 2-d5: *****  *\n        .byte   %11111001       ; 0EAD 2-d5: *****  *\n        .byte   %11111001       ; 0EAE 2-d5: *****  *\n        .byte   %11000011       ; 0EAF 2-d5: **    **\n\n        .byte   %11111111       ; 0EB0 2-d6: ********\n        .byte   %10011111       ; 0EB1 2-d6: *  *****\n        .byte   %10011111       ; 0EB2 2-d6: *  *****\n        .byte   %10010011       ; 0EB3 2-d6: *  *  **\n        .byte   %10000111       ; 0EB4 2-d6: *    ***\n        .byte   %10010011       ; 0EB5 2-d6: *  *  **\n        .byte   %10011001       ; 0EB6 2-d6: *  **  *\n        .byte   %11111111       ; 0EB7 2-d6: ********\n\n        .byte   %11111111       ; 0EB8 2-d7: ********\n        .byte   %10011111       ; 0EB9 2-d7: *  *****\n        .byte   %10011111       ; 0EBA 2-d7: *  *****\n        .byte   %10010011       ; 0EBB 2-d7: *  *  **\n        .byte   %10000111       ; 0EBC 2-d7: *    ***\n        .byte   %10010011       ; 0EBD 2-d7: *  *  **\n        .byte   %10011001       ; 0EBE 2-d7: *  **  *\n        .byte   %11111111       ; 0EBF 2-d7: ********\n\n        .byte   %11111111       ; 0EC0 2-d8: ********\n        .byte   %11000111       ; 0EC1 2-d8: **   ***\n        .byte   %11100111       ; 0EC2 2-d8: ***  ***\n        .byte   %11100111       ; 0EC3 2-d8: ***  ***\n        .byte   %11100111       ; 0EC4 2-d8: ***  ***\n        .byte   %11100111       ; 0EC5 2-d8: ***  ***\n        .byte   %11000011       ; 0EC6 2-d8: **    **\n        .byte   %11111111       ; 0EC7 2-d8: ********\n\n        .byte   %11111111       ; 0EC8 2-d9: ********\n        .byte   %11000111       ; 0EC9 2-d9: **   ***\n        .byte   %11100111       ; 0ECA 2-d9: ***  ***\n        .byte   %11100111       ; 0ECB 2-d9: ***  ***\n        .byte   %11100111       ; 0ECC 2-d9: ***  ***\n        .byte   %11100111       ; 0ECD 2-d9: ***  ***\n        .byte   %11000011       ; 0ECE 2-d9: **    **\n        .byte   %11111111       ; 0ECF 2-d9: ********\n\n        .byte   %11111111       ; 0ED0 2-da: ********\n        .byte   %11111111       ; 0ED1 2-da: ********\n        .byte   %10011001       ; 0ED2 2-da: *  **  *\n        .byte   %10000000       ; 0ED3 2-da: *       \n        .byte   %10000000       ; 0ED4 2-da: *       \n        .byte   %10010100       ; 0ED5 2-da: *  * *  \n        .byte   %10011100       ; 0ED6 2-da: *  ***  \n        .byte   %11111111       ; 0ED7 2-da: ********\n\n        .byte   %11111111       ; 0ED8 2-db: ********\n        .byte   %11111111       ; 0ED9 2-db: ********\n        .byte   %10011001       ; 0EDA 2-db: *  **  *\n        .byte   %10000000       ; 0EDB 2-db: *       \n        .byte   %10000000       ; 0EDC 2-db: *       \n        .byte   %10010100       ; 0EDD 2-db: *  * *  \n        .byte   %10011100       ; 0EDE 2-db: *  ***  \n        .byte   %11111111       ; 0EDF 2-db: ********\n\n        .byte   %00000000       ; 0008 1-01:         \n        .byte   %00000000       ; 0009 1-01:         \n        .byte   %00000000       ; 000A 1-01:         \n        .byte   %00000000       ; 000B 1-01:         \n        .byte   %00000000       ; 000C 1-01:         \n        .byte   %00000000       ; 000D 1-01:         \n        .byte   %00000000       ; 000E 1-01:         \n        .byte   %00000000       ; 000F 1-01:         \n\t \n     .byte <tile_10>\n\t ; .byte    %00011000\n\t ; .byte    %00100100\n\t ; .byte    %00000000\n\t ; .byte    %01100110\n\t ; .byte    %10011001\n\t ; .byte    %00000000\n\t ; .byte    %00100100\n\t ; .byte    %01100110\n\t \n\n    .byte <tile_16>\n\t ; .byte    %00011000\n\t ; .byte    %00111100\n\t ; .byte    %00111100\n\t ; .byte    %00111100\n\t ; .byte    %01111110\n\t ; .byte    %01111110\n\t ; .byte    %01011010\n\t ; .byte    %01000010\n\n    .byte <tile_16>\n\t ; .byte    %00011000\n\t ; .byte    %00111100\n\t ; .byte    %00111100\n\t ; .byte    %00111100\n\t ; .byte    %01111110\n\t ; .byte    %01111110\n\t ; .byte    %01011010\n\t ; .byte    %01000010\t \n\n    .byte <tile_15>\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %00001111\n\t ; .byte    %11111110\n\t ; .byte    %11111110\n\t ; .byte    %00001111\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\n    .byte <tile_15>\n\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %00001111\n\t ; .byte    %11111110\n\t ; .byte    %11111110\n\t ; .byte    %00001111\n\t ; .byte    %00000000\n\t ; .byte    %00000000\t \n\n    .byte <tile_14>\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %11110000\n\t ; .byte    %01111111\n\t ; .byte    %01111111\n\t ; .byte    %11110000\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\n    .byte <tile_14>\n\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %11110000\n\t ; .byte    %01111111\n\t ; .byte    %01111111\n\t ; .byte    %11110000\n\t ; .byte    %00000000\n\t ; .byte    %00000000\t \n\n\n    .byte <tile_11>\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %00001000\n\t ; .byte    %00111000\n\t ; .byte    %00011100\n\t ; .byte    %00010000\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\n\n    .byte <tile_11>\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %00001000\n\t ; .byte    %00111000\n\t ; .byte    %00011100\n\t ; .byte    %00010000\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\n    .byte <tile_17>\n\t ; .byte    %00000000\n\t ; .byte    %00111100\n\t ; .byte    %01000010\n\t ; .byte    %11001111\n\t ; .byte    %11000011\n\t ; .byte    %01100110\n\t ; .byte    %00100100\n\t ; .byte    %00011000\n\n\n    .byte <tile_17>\n\t ; .byte    %00000000\n\t ; .byte    %00111100\n\t ; .byte    %01000010\n\t ; .byte    %11001111\n\t ; .byte    %11000011\n\t ; .byte    %01100110\n\t ; .byte    %00100100\n\t ; .byte    %00011000\n\t \n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\t\t\n\n\n    .byte <tile_13>\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %11111111\n\t ; .byte    %11111111\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t ; .byte    %00000000\n\t  \n\n    .byte <tile_18>\n\t ; .byte    %00000000\n\t ; .byte    %00111100\n\t ; .byte    %01011010\n\t ; .byte    %11011011\n\t ; .byte    %11000011\n\t ; .byte    %01011010\n\t ; .byte    %00111100\n\t ; .byte    %00011000\n\t \n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\t\n\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\t\t\t\n\n    .byte <tile_9>\n\t ; .byte    %00000000\n\t ; .byte    %10000000\n\t ; .byte    %01111110\n\t ; .byte    %11001000\n\t ; .byte    %11111000\n\t ; .byte    %11000000\n\t ; .byte    %10000000\t \n\t ; .byte    %00000000\n\n    .byte <tile_6>\n\t ; .byte    %10111101\n\t ; .byte    %01000010\n\t ; .byte    %10100101\n\t ; .byte    %10100101\n\t ; .byte    %10000001\n\t ; .byte    %10011001\n\t ; .byte    %10000001\n\t ; .byte    %01111110 \n\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\t\t \n\t \n\t\t\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\t\n\n    .byte <tile_8>\n\t ; .byte    %00000000\n\t ; .byte    %00111100\n\t ; .byte    %01100110\n\t ; .byte    %11011111\n\t ; .byte    %11100111\n\t ; .byte    %01111010\n\t ; .byte    %00100100\n\t ; .byte    %00011000\n\n\t\t\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\t\n\n    .byte <tile_12>\n\t ; .byte    %00011000\n\t ; .byte    %00011000\n\t ; .byte    %01111000\n\t ; .byte    %00011000\n\t ; .byte    %00011000\n\t ; .byte    %00011110\n\t ; .byte    %00011000\n\t ; .byte    %00011000\n\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\t\t\n\n    .byte <tile_7>\n\n\t \n\n; \n    .byte <tile_5>\n\t \n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t \n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\n    .byte <tile_0>\n\t\t\n\n\t \n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\n\n    .byte <tile_3>\n\t\t\n\n\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\n\n    .byte <tile_2>\n\t ; .byte    %00011000\n\t ; .byte    %00110100\n\t ; .byte    %00011001\n\t ; .byte    %01110111\n\t ; .byte    %10011000\n\t ; .byte    %00011000\n\t ; .byte    %00101000\n\t ; .byte    %00101000\t \n\t \n\t\t\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\t .byte    %00000000\n\n    .byte <tile_1>\n\t ; .byte    %00011000\n\t ; .byte    %00111100\n\t ; .byte    %00011000\n\t ; .byte    %01100110\n\t ; .byte    %10011001\n\t ; .byte    %00011000\n\t ; .byte    %00100100\n\t ; .byte    %01100110\n\n\t\t"
  },
  {
    "path": "src/assets/templates/8x8/cc65_pce_tiles.s.template",
    "content": ";----------------------------------------------------------------------------\r\n; VGA font for the PC-Engine conio implementation\r\n\r\n        .export _pce_font\r\n\r\n; The character tiles use only two colors from each pallette.  Color zero\r\n; comes from pallette zero; color one is different in each pallette.  The\r\n; color of a character is set by choosing one of the 16 pallettes.\r\n\r\n.rodata\r\n\r\n_pce_font:\r\n.byte  <tile_26>\r\n\r\n.byte <tile_13>\r\n\r\n.byte <tile_12>\r\n\r\n; down\r\n.byte <tile_0>\r\n\r\n; up\r\n.byte <tile_1>\r\n\r\n; right\r\n.byte <tile_2> \r\n\r\n; left\r\n.byte <tile_3>\t \r\n\r\n; bomb\r\n.byte <tile_5>\r\n\r\n; skull\r\n.byte <tile_7>\r\n\r\n; ghost\r\n.byte <tile_4>\r\n\r\n; unused gun\r\n.byte $00,$80,$7e,$c8,$f8,$c0,$80,$00\r\n\r\n; power-up S\r\n.byte <tile_8>\r\n\r\n; power-up F\r\n.byte <tile_17>\r\n\r\n; unused power-up H\r\n.byte $00,$3c,$5a,$db,$c3,$5A,$3c,$18\r\n\r\n; gun\r\n.byte <tile_9>\r\n\r\n; power-up H \r\n.byte <tile_18>\r\n\r\n; bullet\r\n.byte <tile_11>\r\n\r\n.byte <tile_10>\r\n\r\n; rocket\r\n.byte  <tile_16>\r\n\r\n; left missile\r\n.byte <tile_14>\r\n\r\n; right missile\r\n.byte <tile_15>\r\n\r\n; dead ghost\r\n.byte <tile_6>\r\n\r\n.byte <tile_19>\r\n\r\n.byte <tile_20>\r\n\r\n.byte <tile_21>\r\n\r\n.byte <tile_22>\r\n\r\n.byte <tile_23>\r\n\r\n.byte <tile_24>\r\n\r\n.byte <tile_25>\r\n\r\n.byte   $00, $24, $66, $FF, $66, $24, $00, $00\r\n.byte   $00, $18, $3C, $7E, $FF, $FF, $00, $00\r\n.byte   $00, $FF, $FF, $7E, $3C, $18, $00, $00\r\n.byte   $00, $00, $00, $00, $00, $00, $00, $00\r\n.byte   $30, $78, $78, $78, $30, $00, $30, $00\r\n.byte   $6C, $6C, $6C, $00, $00, $00, $00, $00\r\n.byte   $6C, $6C, $FE, $6C, $FE, $6C, $6C, $00\r\n.byte   $30, $7C, $C0, $78, $0C, $F8, $30, $00\r\n.byte   $00, $C6, $CC, $18, $30, $66, $C6, $00\r\n.byte   $38, $6C, $38, $76, $DC, $CC, $76, $00\r\n.byte   $60, $60, $C0, $00, $00, $00, $00, $00\r\n.byte   $18, $30, $60, $60, $60, $30, $18, $00\r\n.byte   $60, $30, $18, $18, $18, $30, $60, $00\r\n.byte   $00, $66, $3C, $FF, $3C, $66, $00, $00\r\n.byte   $00, $30, $30, $FC, $30, $30, $00, $00\r\n.byte   $00, $00, $00, $00, $00, $30, $30, $60\r\n.byte   $00, $00, $00, $FC, $00, $00, $00, $00\r\n.byte   $00, $00, $00, $00, $00, $30, $30, $00\r\n.byte   $06, $0C, $18, $30, $60, $C0, $80, $00\r\n.byte   $7C, $C6, $CE, $DE, $F6, $E6, $7C, $00\r\n.byte   $30, $70, $30, $30, $30, $30, $FC, $00\r\n.byte   $78, $CC, $0C, $38, $60, $CC, $FC, $00\r\n.byte   $78, $CC, $0C, $38, $0C, $CC, $78, $00\r\n.byte   $1C, $3C, $6C, $CC, $FE, $0C, $1E, $00\r\n.byte   $FC, $C0, $F8, $0C, $0C, $CC, $78, $00\r\n.byte   $38, $60, $C0, $F8, $CC, $CC, $78, $00\r\n.byte   $FC, $CC, $0C, $18, $30, $30, $30, $00\r\n.byte   $78, $CC, $CC, $78, $CC, $CC, $78, $00\r\n.byte   $78, $CC, $CC, $7C, $0C, $18, $70, $00\r\n.byte   $00, $30, $30, $00, $00, $30, $30, $00\r\n.byte   $00, $30, $30, $00, $00, $30, $30, $60\r\n.byte   $18, $30, $60, $C0, $60, $30, $18, $00\r\n.byte   $00, $00, $FC, $00, $00, $FC, $00, $00\r\n.byte   $60, $30, $18, $0C, $18, $30, $60, $00\r\n.byte   $78, $CC, $0C, $18, $30, $00, $30, $00\r\n.byte   $7C, $C6, $DE, $DE, $DE, $C0, $78, $00\r\n.byte   $30, $78, $CC, $CC, $FC, $CC, $CC, $00\r\n.byte   $FC, $66, $66, $7C, $66, $66, $FC, $00\r\n.byte   $3C, $66, $C0, $C0, $C0, $66, $3C, $00\r\n.byte   $F8, $6C, $66, $66, $66, $6C, $F8, $00\r\n.byte   $7E, $60, $60, $78, $60, $60, $7E, $00\r\n.byte   $7E, $60, $60, $78, $60, $60, $60, $00\r\n.byte   $3C, $66, $C0, $C0, $CE, $66, $3E, $00\r\n.byte   $CC, $CC, $CC, $FC, $CC, $CC, $CC, $00\r\n.byte   $78, $30, $30, $30, $30, $30, $78, $00\r\n.byte   $1E, $0C, $0C, $0C, $CC, $CC, $78, $00\r\n.byte   $E6, $66, $6C, $78, $6C, $66, $E6, $00\r\n.byte   $60, $60, $60, $60, $60, $60, $7E, $00\r\n.byte   $C6, $EE, $FE, $FE, $D6, $C6, $C6, $00\r\n.byte   $C6, $E6, $F6, $DE, $CE, $C6, $C6, $00\r\n.byte   $38, $6C, $C6, $C6, $C6, $6C, $38, $00\r\n.byte   $FC, $66, $66, $7C, $60, $60, $F0, $00\r\n.byte   $78, $CC, $CC, $CC, $DC, $78, $1C, $00\r\n.byte   $FC, $66, $66, $7C, $6C, $66, $E6, $00\r\n.byte   $78, $CC, $E0, $70, $1C, $CC, $78, $00\r\n.byte   $FC, $30, $30, $30, $30, $30, $30, $00\r\n.byte   $CC, $CC, $CC, $CC, $CC, $CC, $FC, $00\r\n.byte   $CC, $CC, $CC, $CC, $CC, $78, $30, $00\r\n.byte   $C6, $C6, $C6, $D6, $FE, $EE, $C6, $00\r\n.byte   $C6, $C6, $6C, $38, $38, $6C, $C6, $00\r\n.byte   $CC, $CC, $CC, $78, $30, $30, $78, $00\r\n.byte   $FE, $06, $0C, $18, $30, $60, $FE, $00\r\n.byte   $78, $60, $60, $60, $60, $60, $78, $00\r\n.byte   $C0, $60, $30, $18, $0C, $06, $02, $00\r\n.byte   $78, $18, $18, $18, $18, $18, $78, $00\r\n.byte   $10, $38, $6C, $C6, $00, $00, $00, $00\r\n.byte   $00, $00, $00, $00, $00, $00, $00, $FF\r\n.byte   $30, $30, $18, $00, $00, $00, $00, $00\r\n.byte   $00, $00, $78, $0C, $7C, $CC, $76, $00\r\n.byte   $E0, $60, $60, $7C, $66, $66, $DC, $00\r\n.byte   $00, $00, $78, $CC, $C0, $CC, $78, $00\r\n.byte   $1C, $0C, $0C, $7C, $CC, $CC, $76, $00\r\n.byte   $00, $00, $78, $CC, $FC, $C0, $78, $00\r\n.byte   $38, $6C, $60, $F0, $60, $60, $F0, $00\r\n.byte   $00, $00, $76, $CC, $CC, $7C, $0C, $F8\r\n.byte   $E0, $60, $6C, $76, $66, $66, $E6, $00\r\n.byte   $30, $00, $70, $30, $30, $30, $78, $00\r\n.byte   $0C, $00, $0C, $0C, $0C, $CC, $CC, $78\r\n.byte   $E0, $60, $66, $6C, $78, $6C, $E6, $00\r\n.byte   $70, $30, $30, $30, $30, $30, $78, $00\r\n.byte   $00, $00, $CC, $FE, $FE, $D6, $C6, $00\r\n.byte   $00, $00, $F8, $CC, $CC, $CC, $CC, $00\r\n.byte   $00, $00, $78, $CC, $CC, $CC, $78, $00\r\n.byte   $00, $00, $DC, $66, $66, $7C, $60, $F0\r\n.byte   $00, $00, $76, $CC, $CC, $7C, $0C, $1E\r\n.byte   $00, $00, $DC, $76, $66, $60, $F0, $00\r\n.byte   $00, $00, $7C, $C0, $78, $0C, $F8, $00\r\n.byte   $10, $30, $7C, $30, $30, $34, $18, $00\r\n.byte   $00, $00, $CC, $CC, $CC, $CC, $76, $00\r\n.byte   $00, $00, $CC, $CC, $CC, $78, $30, $00\r\n.byte   $00, $00, $C6, $D6, $FE, $FE, $6C, $00\r\n.byte   $00, $00, $C6, $6C, $38, $6C, $C6, $00\r\n.byte   $00, $00, $CC, $CC, $CC, $7C, $0C, $F8\r\n.byte   $00, $00, $FC, $98, $30, $64, $FC, $00\r\n.byte   $1C, $30, $30, $E0, $30, $30, $1C, $00\r\n.byte   $18, $18, $18, $00, $18, $18, $18, $00\r\n.byte   $E0, $30, $30, $1C, $30, $30, $E0, $00\r\n.byte   $76, $DC, $00, $00, $00, $00, $00, $00\r\n.byte   $00, $10, $38, $6C, $C6, $C6, $FE, $00\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc.s.template",
    "content": "\t\t.segment \"GFX\"\n\t\t.export _udgs\n\n_udgs:\n\n.byte <tile_26>                \n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00 ; z\n.byte $00,$00,$00,$ff,$ff,$00,$00,$00 ; // unused\n.byte <tile_19>, <tile_20> ; 28 29\n.byte <tile_16> ; 30\n.byte <tile_6>; 31\n.byte $00,$00,$00,$00,$00,$00,$00,$00 ; 32\n\n.byte <tile_7>\n.byte <tile_5>\n.byte <tile_17>\n\n;.byte $18,$3e,$60,$3c,$06,$7c,$18,$00 ; 36\n.byte <tile_25>\n\n.byte <tile_21> ; \n.byte <tile_22> ; \n.byte <tile_0>\n.byte <tile_23>\n.byte <tile_24>\n.byte <tile_19>\n.byte <tile_20>\n.byte <tile_8>\n.byte <tile_9>\n.byte <tile_11>\n.byte <tile_12>\n\n.byte $3c,$66,$6e,$76,$66,$66,$3c,$00, $18,$18,$38,$18,$18,$18,$7e,$00 ; 0 1\n.byte $3c,$66,$06,$0c,$30,$60,$7e,$00, $3c,$66,$06,$1c,$06,$66,$3c,$00\n.byte $06,$0e,$1e,$66,$7f,$06,$06,$00, $7e,$60,$7c,$06,$06,$66,$3c,$00\n.byte $3c,$66,$60,$7c,$66,$66,$3c,$00, $7e,$66,$0c,$18,$18,$18,$18,$00\n.byte $3c,$66,$66,$3c,$66,$66,$3c,$00, $3c,$66,$66,$3e,$06,$66,$3c,$00 ; 8 9\n\n.byte <tile_15>\n\n.byte <tile_14>\n\n.byte <tile_13>\n\n.byte <tile_1>\n\n.byte <tile_3>\n.byte <tile_10>\n\n.byte <tile_2>\n\n.byte <tile_18>\n\n.byte <tile_4>\n\n\n\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_64_chars.s.template",
    "content": "\t\t.segment \"UDCCHAR\"\n\t\t.export _Charset\n\n_Charset:\n\n; 0xFE super\n.byte <tile_18>\n\n.byte <tile_21>\n\n.byte <tile_22>\n\n.byte <tile_23>\n\n; formerly 24\n.byte <tile_17>\n\n; A-Z\n.byte $18,$3c,$66,$7e,$66,$66,$66,$00\n.byte $7c,$66,$66,$7c,$66,$66,$7c,$00,$3c,$66,$60,$60,$60,$66,$3c,$00\n.byte $78,$6c,$66,$66,$66,$6c,$78,$00,$7e,$60,$60,$78,$60,$60,$7e,$00\n.byte $7e,$60,$60,$78,$60,$60,$60,$00,$3c,$66,$60,$6e,$66,$66,$3c,$00\n.byte $66,$66,$66,$7e,$66,$66,$66,$00,$3c,$18,$18,$18,$18,$18,$3c,$00\n.byte $1e,$0c,$0c,$0c,$0c,$6c,$38,$00,$66,$6c,$78,$70,$78,$6c,$66,$00\n.byte $60,$60,$60,$60,$60,$60,$7e,$00,$63,$77,$7f,$6b,$63,$63,$63,$00\n.byte $66,$76,$7e,$7e,$6e,$66,$66,$00,$3c,$66,$66,$66,$66,$66,$3c,$00\n.byte $7c,$66,$66,$7c,$60,$60,$60,$00,$3c,$66,$66,$66,$66,$3c,$0e,$00\n.byte $7c,$66,$66,$7c,$78,$6c,$66,$00,$3c,$66,$60,$3c,$06,$66,$3c,$00\n.byte $7e,$18,$18,$18,$18,$18,$18,$00,$66,$66,$66,$66,$66,$66,$3c,$00\n.byte $66,$66,$66,$66,$66,$3c,$18,$00,$63,$63,$63,$6b,$7f,$77,$63,$00\n.byte $66,$66,$3c,$18,$3c,$66,$66,$00,$66,$66,$66,$3c,$18,$18,$18,$00\n.byte $7e,$06,$0c,$18,$30,$60,$7e,$00\n\n; gun\n.byte <tile_9>\n\n; pound - invincibility\n.byte <tile_10>\n\n; powerup\n.byte <tile_8>\n\n; rocket\n.byte <tile_16>\n\n; cbm left arrow - left missile\n.byte <tile_14>\n\n; space\n.byte $00,$00,$00,$00,$00,$00,$00,$00\n\n; bullet\n.byte <tile_11>\n\n; vertical brick\n.byte <tile_12>\n\n; horizontal brick\n.byte  <tile_13>\n\n; ghost\n.byte <tile_4>\n\n; skull\n.byte <tile_7>\n\n; bomb\n.byte <tile_5>\n\n; player down \n.byte <tile_0>\n\n; player left\n.byte <tile_3>\n\n; player right \n.byte <tile_2>\n\n; extraPoints\n.byte $18,$3e,$60,$3c,$06,$7c,$18,$00\n\n; player up\n.byte <tile_1>\n\n; comma\n.byte <tile_6>\n\n; dash\n.byte $00,$00,$00,$7e,$00,$00,$00,$00\n\n; period\n;.byte $00,$00,$00,$00,$00,$18,$18,$00\n.byte <tile_19>\n\n; slash\n;.byte 0,0,0,0,0,0,0,0\n.byte <tile_20>\n\n.byte $3c,$66,$6e,$76,$66,$66,$3c,$00,$18,$18,$38,$18,$18,$18,$7e,$00\n.byte $3c,$66,$06,$0c,$30,$60,$7e,$00,$3c,$66,$06,$1c,$06,$66,$3c,$00\n.byte $06,$0e,$1e,$66,$7f,$06,$06,$00,$7e,$60,$7c,$06,$06,$66,$3c,$00\n.byte $3c,$66,$60,$7c,$66,$66,$3c,$00,$7e,$66,$0c,$18,$18,$18,$18,$00\n.byte $3c,$66,$66,$3c,$66,$66,$3c,$00\n.byte $3c,$66,$66,$3e,$06,$66,$3c,$00\n\n; right missile\n.byte <tile_15>\n\n\n; 0xFD freeze\n; formerly 17\n.byte <tile_24>\n\n\n\n; ------------------------------------------------------------------------\n; Unused - Conflict?\n\n\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_6chars.s.template",
    "content": "\n\t\t.segment \"UDCCHAR\"\n\t\t.export _Charset\n\n_Charset:\n\n.byte <tile_4>\n.byte <tile_5>\n.byte <tile_1>\n.byte <tile_0>\n.byte <tile_3>\n.byte <tile_2>\n\n\n\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_arcade.s.template",
    "content": "\t\t.segment \"GFX\"\n\t\t.export _udgs\n\n_udgs:\n\n.byte <tile_26>                 \n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00\n.byte $00,$00,$00,$ff,$ff,$00,$00,$00 \n.byte <tile_19>, <tile_20> ; 28 29\n.byte <tile_16> ; 30\n.byte <tile_6>; 31\n.byte $00,$00,$00,$00,$00,$00,$00,$00 ; 32\n\n.byte <tile_7>\n.byte <tile_5>\n.byte <tile_17>\n\n;.byte $18,$3e,$60,$3c,$06,$7c,$18,$00 ; 36\n.byte <tile_25>\n\n.byte <tile_21>\n.byte <tile_22>\n.byte <tile_0>\n.byte <tile_23>\n.byte <tile_24>\n\n.byte <tile_19>\n.byte <tile_20>\n\n.byte <tile_8>\n.byte <tile_9>\n.byte <tile_11>\n.byte <tile_12>\n\n.byte $38,$4c,$c6,$c6,$c6,$64,$38,$00 ; 0\n.byte $30,$70,$30,$30,$30,$30,$fc,$00,$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\n.byte $7e,$0c,$18,$3c,$06,$c6,$7c,$00,$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\n.byte $fc,$c0,$fc,$06,$06,$c6,$7c,$00,$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\n.byte $fe,$c6,$0c,$18,$30,$30,$30,$00,$78,$c4,$e4,$78,$9e,$86,$7c,$00\n.byte $7c,$c6,$c6,$7e,$06,$0c,$78,$00 ; 9\n\n.byte <tile_15>\n\n.byte <tile_14>\n\n.byte <tile_13>\n\n.byte <tile_1>\n\n.byte <tile_3>\n.byte <tile_10>\n\n.byte <tile_2>\n\n.byte <tile_18>\n\n.byte <tile_4>\n\n\n\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_arcade_64_chars.s.template",
    "content": "\t\t.segment \"UDCCHAR\"\n\t\t.export _Charset\n\n_Charset:\n\n\n; right missile\n.byte <tile_15>\n\n\n; 0xFD freeze\n; formerly 17\n.byte <tile_24>\n\n; 0xFE super\n.byte <tile_18>\n\n.byte <tile_21>\n\n.byte <tile_22>\n\n.byte <tile_23>\n\n; formerly 24\n.byte <tile_17>\n\n; A-Z\n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00 \n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00 ; z\n\n; gun\n.byte <tile_9>\n\n; pound - invincibility\n.byte <tile_10>\n\n; powerup\n.byte <tile_8>\n\n; rocket\n.byte <tile_16>\n\n; cbm left arrow - left missile\n.byte <tile_14>\n\n; space\n.byte $00,$00,$00,$00,$00,$00,$00,$00\n\n; bullet\n.byte <tile_11>\n\n; vertical brick\n.byte <tile_12>\n\n; horizontal brick\n.byte  <tile_13>\n\n; ghost\n.byte <tile_4>\n\n; skull\n.byte <tile_7>\n\n; bomb\n.byte <tile_5>\n\n; player down \n.byte <tile_0>\n\n; player left\n.byte <tile_3>\n\n; player right \n.byte <tile_2>\n\n; extraPoints\n;.byte $18,$3e,$60,$3c,$06,$7c,$18,$00\n.byte <tile_25>\n\n; player up\n.byte <tile_1>\n\n; comma\n.byte <tile_6>\n\n; dash\n.byte <tile_26>\n\n; period\n;.byte $00,$00,$00,$00,$00,$18,$18,$00\n.byte <tile_19>\n\n; slash\n;.byte 0,0,0,0,0,0,0,0\n.byte <tile_20>\n\n.byte $38,$4c,$c6,$c6,$c6,$64,$38,$00 ; 0\n.byte $30,$70,$30,$30,$30,$30,$fc,$00,$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\n.byte $7e,$0c,$18,$3c,$06,$c6,$7c,$00,$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\n.byte $fc,$c0,$fc,$06,$06,$c6,$7c,$00,$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\n.byte $fe,$c6,$0c,$18,$30,$30,$30,$00,$78,$c4,$e4,$78,$9e,$86,$7c,$00\n.byte $7c,$c6,$c6,$7e,$06,$0c,$78,$00 ; 9\n\n\n\n; ------------------------------------------------------------------------\n; Unused - Conflict?\n\n\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_arcade_VIC20.s.template",
    "content": "\t\t.segment \"GFX\"\n\t\t.export _udgs\n\n_udgs:\n\n\n.byte $00,$00,$00,$00,$00,$00,$00,$00 ; 32\n\n.byte <tile_7> ;(33)\n.byte <tile_5>\n.byte <tile_17>\n.byte <tile_25>\n.byte <tile_21>\n.byte <tile_22>\n.byte <tile_0>\n.byte <tile_23> ;(40)\n.byte <tile_24>\n.byte <tile_19>\n.byte <tile_20>\n.byte <tile_8>\n.byte <tile_9>\n.byte <tile_11>\n.byte <tile_12>\n\n\n.byte $38,$4c,$c6,$c6,$c6,$64,$38,$00 ; 0 (48)\n.byte $30,$70,$30,$30,$30,$30,$fc,$00,$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\n.byte $7e,$0c,$18,$3c,$06,$c6,$7c,$00,$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\n.byte $fc,$c0,$fc,$06,$06,$c6,$7c,$00,$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\n.byte $fe,$c6,$0c,$18,$30,$30,$30,$00,$78,$c4,$e4,$78,$9e,$86,$7c,$00\n.byte $7c,$c6,$c6,$7e,$06,$0c,$78,$00 ; 9 (57)\n\n.byte <tile_15>\n.byte <tile_14>\n.byte <tile_13>\n.byte <tile_1>\n.byte <tile_3>\n.byte <tile_10>\n.byte <tile_2> ;(64)\n\n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a (65)\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00 ; z (90)\n\n;.byte $00,$00,$00,$ff,$ff,$00,$00,$00 ; (91) unused (future 27th tile)\n.byte <tile_26>\n\n.byte <tile_4>  ; (92)\n.byte <tile_18> ; (93)\n.byte <tile_16> ; (94)\n.byte <tile_6>  ; (95)\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_arcade_conio.s.template",
    "content": "\t\t.segment \"GFX\"\n\t\t.export _udgs\n\n_udgs:\n\n.byte <tile_26>                 \n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00\n.byte $00,$00,$00,$ff,$ff,$00,$00,$00 \n.byte <tile_19>, <tile_20> ; 28 29\n.byte <tile_16> ; 30\n.byte <tile_6>; 31\n.byte $00,$00,$00,$00,$00,$00,$00,$00 ; 32\n\n.byte <tile_7>\n.byte <tile_5>\n.byte <tile_17>\n\n;.byte $18,$3e,$60,$3c,$06,$7c,$18,$00 ; 36\n.byte <tile_25>\n\n.byte <tile_21>\n.byte <tile_22>\n.byte <tile_0>\n.byte <tile_23>\n.byte <tile_24>\n\n.byte <tile_19>\n.byte <tile_20>\n\n.byte <tile_8>\n.byte <tile_9>\n.byte <tile_11>\n.byte <tile_12>\n\n.byte $38,$4c,$c6,$c6,$c6,$64,$38,$00 ; 0\n.byte $30,$70,$30,$30,$30,$30,$fc,$00,$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\n.byte $7e,$0c,$18,$3c,$06,$c6,$7c,$00,$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\n.byte $fc,$c0,$fc,$06,$06,$c6,$7c,$00,$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\n.byte $fe,$c6,$0c,$18,$30,$30,$30,$00,$78,$c4,$e4,$78,$9e,$86,$7c,$00\n.byte $7c,$c6,$c6,$7e,$06,$0c,$78,$00 ; 9\n\n.byte <tile_15>\n\n.byte <tile_14>\n\n.byte <tile_13>\n\n.byte <tile_1>\n\n.byte <tile_3>\n.byte <tile_10>\n\n; .byte <tile_2>\n.byte 0,0,0,0,0,0,0,0\n\n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00\n\n.byte <tile_2>\n\n\n.byte <tile_4>\n\n.byte <tile_18>\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_arcade_v2.s.template",
    "content": "\t\t.segment \"GFX\"\r\n\t\t.export _udgs\r\n\r\n_udgs:\r\n\r\n\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00 ; 32\r\n\r\n.byte <tile_7> ;(33)\r\n.byte <tile_5>\r\n.byte <tile_17>\r\n.byte <tile_25>\r\n.byte <tile_21>\r\n.byte <tile_22>\r\n.byte <tile_0>\r\n.byte <tile_23> ;(40)\r\n.byte <tile_24>\r\n.byte <tile_19>\r\n.byte <tile_20>\r\n.byte <tile_8>\r\n.byte <tile_9>\r\n.byte <tile_11>\r\n.byte <tile_12>\r\n\r\n\r\n.byte $38,$4c,$c6,$c6,$c6,$64,$38,$00 ; 0 (48)\r\n.byte $30,$70,$30,$30,$30,$30,$fc,$00,$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\r\n.byte $7e,$0c,$18,$3c,$06,$c6,$7c,$00,$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\r\n.byte $fc,$c0,$fc,$06,$06,$c6,$7c,$00,$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\r\n.byte $fe,$c6,$0c,$18,$30,$30,$30,$00,$78,$c4,$e4,$78,$9e,$86,$7c,$00\r\n.byte $7c,$c6,$c6,$7e,$06,$0c,$78,$00 ; 9 (57)\r\n\r\n.byte <tile_15>\r\n.byte <tile_14>\r\n.byte <tile_13>\r\n.byte <tile_1>\r\n.byte <tile_3>\r\n.byte <tile_10>\r\n.byte <tile_2> ;(64)\r\n\r\n.byte $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a (65)\r\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\r\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\r\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\r\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\r\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\r\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\r\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\r\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\r\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\r\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\r\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\r\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\r\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00 ; z (90)\r\n\r\n.byte <tile_26> ; (91) unused (future 27th tile)\r\n\r\n.byte <tile_4>  ; (92)\r\n.byte <tile_18> ; (93)\r\n.byte <tile_16> ; (94)\r\n.byte <tile_6>  ; (95)\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_atari7800_160A.s.template",
    "content": "\r\n0,0,0,0,0,0,0,0\r\n\t\r\n\r\n$38,$4c,$c6,$c6,$c6,$64,$38,$00\r\n$30,$70,$30,$30,$30,$30,$fc,$00\r\n$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\r\n$7e,$0c,$18,$3c,$06,$c6,$7c,$00\r\n$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\r\n$fc,$c0,$fc,$06,$06,$c6,$7c,$00\r\n$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\r\n$fe,$c6,$0c,$18,$30,$30,$30,$00\r\n$78,$c4,$e4,$78,$9e,$86,$7c,$00\r\n$7c,$c6,$c6,$7e,$06,$0c,$78,$00\r\n\r\n$38,$6c,$c6,$c6,$fe,$c6,$c6,$00\r\n$fc,$c6,$c6,$fc,$c6,$c6,$fc,$00\r\n$3c,$66,$c0,$c0,$c0,$66,$3c,$00\r\n$f8,$cc,$c6,$c6,$c6,$cc,$f8,$00\r\n$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\r\n$fc,$c0,$c0,$f8,$c0,$c0,$c0,$00\r\n$3e,$60,$c0,$ce,$c6,$66,$3e,$00\r\n$c6,$c6,$c6,$fe,$c6,$c6,$c6,$00\r\n$fc,$30,$30,$30,$30,$30,$fc,$00\r\n$06,$06,$06,$06,$06,$c6,$7c,$00\r\n$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\r\n$c0,$c0,$c0,$c0,$c0,$c0,$fe,$00\r\n$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\r\n$c6,$e6,$f6,$de,$ce,$c6,$c6,$00\r\n$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\r\n$fc,$c6,$c6,$c6,$fc,$c0,$c0,$00\r\n$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\r\n$fc,$c6,$c6,$cc,$f8,$dc,$ce,$00\r\n$78,$cc,$c0,$7c,$06,$c6,$7c,$00\r\n$fc,$30,$30,$30,$30,$30,$30,$00\r\n$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\r\n$c6,$c6,$c6,$c6,$6c,$38,$10,$00\r\n$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\r\n$c6,$ee,$7c,$38,$7c,$ee,$c6,$00\r\n$cc,$cc,$cc,$78,$30,$30,$30,$00 \r\n$fe,$0e,$1c,$38,$70,$e0,$fe,$00\r\n\t\r\n\r\n\t\r\n<tile_0>\r\n<tile_1>\r\n<tile_2>\r\n<tile_3>\r\n<tile_4>\r\n<tile_5>\r\n<tile_6>\r\n<tile_7>\r\n<tile_8>\r\n<tile_9>\r\n<tile_10>\r\n<tile_11>\r\n<tile_12>\r\n<tile_13>\r\n<tile_14>\r\n<tile_15>\r\n<tile_16>\r\n<tile_17>\r\n<tile_18>\r\n<tile_19>\r\n<tile_20>\r\n<tile_21>\r\n<tile_22>\r\n<tile_23>\r\n<tile_24>\r\n<tile_25>\r\n<tile_26>\r\n\t\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_vic20_19_tiles.s.template",
    "content": "\t\t.segment \"UDCCHAR\"\r\n\t\t.export _Charset\r\n\r\n_Charset:\r\n\r\n\r\n; 0xEC player up\r\n.byte <tile_1>\r\n\r\n; 0xED gun\r\n.byte <tile_9>\r\n\r\n; 0xEE pound - invincibility\r\n.byte <tile_10>\r\n\r\n; 0xEF powerup\r\n.byte <tile_8>\r\n\r\n; 0xF0 rocket\r\n.byte <tile_16>\r\n\r\n; 0xF1 left missile\r\n.byte <tile_14>\r\n\r\n; 0xF2 space\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00\r\n\r\n; 0xF3 bullet\r\n.byte <tile_11>\r\n\r\n; 0xF4 vertical\r\n.byte <tile_12>\r\n\r\n; 0xF5 horizontal\r\n.byte  <tile_13>\r\n\r\n; 0xF6 ghost\r\n.byte <tile_4>\r\n\r\n; 0xF7 skull\r\n.byte <tile_7>\r\n\r\n; 0xF8 bomb\r\n.byte <tile_5>\r\n\r\n; 0xF9 player down \r\n.byte <tile_0>\r\n\r\n; 0xFA player left\r\n.byte <tile_3>\r\n\r\n; 0xFB player right \r\n.byte <tile_2>\r\n\r\n; 0xFC right missile from the right\r\n.byte <tile_15>\r\n\r\n\r\n; 0xFD freeze\r\n.byte <tile_17>\r\n\r\n\r\n; 0xFE super\r\n.byte <tile_18>\r\n\r\n; 0xFF dead ghost\r\n.byte <tile_6>\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_vic20_25_tiles.s.template",
    "content": "\t\t.segment \"UDCCHAR\"\r\n\t\t.export _Charset\r\n\r\n_Charset:\r\n\r\n; 0xE6\r\n.byte <tile_19>\r\n\r\n; 0xE7\r\n.byte <tile_20>\r\n\r\n; 0xE8\r\n.byte <tile_21>\r\n\r\n; 0xE9\r\n.byte <tile_22>\r\n\r\n; 0xEA\r\n.byte <tile_23>\r\n\r\n; 0xEB\r\n.byte <tile_24>\r\n\r\n\r\n; 0xEC player up\r\n.byte <tile_1>\r\n\r\n; 0xED gun\r\n.byte <tile_9>\r\n\r\n; 0xEE pound - invincibility\r\n.byte <tile_10>\r\n\r\n; 0xEF powerup\r\n.byte <tile_8>\r\n\r\n; 0xF0 rocket\r\n.byte <tile_16>\r\n\r\n; 0xF1 left missile\r\n.byte <tile_14>\r\n\r\n; 0xF2 space\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00\r\n\r\n; 0xF3 bullet\r\n.byte <tile_11>\r\n\r\n; 0xF4 vertical\r\n.byte <tile_12>\r\n\r\n; 0xF5 horizontal\r\n.byte  <tile_13>\r\n\r\n; 0xF6 ghost\r\n.byte <tile_4>\r\n\r\n; 0xF7 skull\r\n.byte <tile_7>\r\n\r\n; 0xF8 bomb\r\n.byte <tile_5>\r\n\r\n; 0xF9 player down \r\n.byte <tile_0>\r\n\r\n; 0xFA player left\r\n.byte <tile_3>\r\n\r\n; 0xFB player right \r\n.byte <tile_2>\r\n\r\n; 0xFC right missile from the right\r\n.byte <tile_15>\r\n\r\n\r\n; 0xFD freeze\r\n.byte <tile_17>\r\n\r\n\r\n; 0xFE super\r\n.byte <tile_18>\r\n\r\n; 0xFF dead ghost\r\n.byte <tile_6>\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_vic20_27_tiles.s.template",
    "content": "\t\t.segment \"UDCCHAR\"\r\n\t\t.export _Charset\r\n\r\n_Charset:\r\n\r\n\r\n; 0xE4\r\n.byte <tile_19>\r\n\r\n; 0xE5\r\n.byte <tile_20>\r\n\r\n; 0xE6\r\n.byte <tile_21>\r\n\r\n; 0xE7\r\n.byte <tile_22>\r\n\r\n; 0xE8\r\n.byte <tile_23>\r\n\r\n; 0xE9\r\n.byte <tile_24>\r\n\r\n; 0xEA\r\n.byte <tile_25>\r\n\r\n; 0xEB\r\n.byte <tile_26>\r\n\r\n; 0xEC player up\r\n.byte <tile_1>\r\n\r\n; 0xED gun\r\n.byte <tile_9>\r\n\r\n; 0xEE pound - invincibility\r\n.byte <tile_10>\r\n\r\n; 0xEF powerup\r\n.byte <tile_8>\r\n\r\n; 0xF0 rocket\r\n.byte <tile_16>\r\n\r\n; 0xF1 left missile\r\n.byte <tile_14>\r\n\r\n; 0xF2 space\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00\r\n\r\n; 0xF3 bullet\r\n.byte <tile_11>\r\n\r\n; 0xF4 vertical\r\n.byte <tile_12>\r\n\r\n; 0xF5 horizontal\r\n.byte  <tile_13>\r\n\r\n; 0xF6 ghost\r\n.byte <tile_4>\r\n\r\n; 0xF7 skull\r\n.byte <tile_7>\r\n\r\n; 0xF8 bomb\r\n.byte <tile_5>\r\n\r\n; 0xF9 player down \r\n.byte <tile_0>\r\n\r\n; 0xFA player left\r\n.byte <tile_3>\r\n\r\n; 0xFB player right \r\n.byte <tile_2>\r\n\r\n; 0xFC right missile from the right\r\n.byte <tile_15>\r\n\r\n\r\n; 0xFD freeze\r\n.byte <tile_17>\r\n\r\n\r\n; 0xFE super\r\n.byte <tile_18>\r\n\r\n; 0xFF dead ghost\r\n.byte <tile_6>\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cc65_udc_vic20_64_chars.s.template",
    "content": "\t\t.segment \"UDCCHAR\"\n\t\t.export _Charset\n\n_Charset:\n\n\n\n\n\n.byte <tile_0>, $38,$6c,$c6,$c6,$fe,$c6,$c6,$00 ; a (65)\n.byte $fc,$c6,$c6,$fc,$c6,$c6,$fc,$00,$3c,$66,$c0,$c0,$c0,$66,$3c,$00\n.byte $f8,$cc,$c6,$c6,$c6,$cc,$f8,$00,$fc,$c0,$c0,$f8,$c0,$c0,$fe,$00\n.byte $fc,$c0,$c0,$f8,$c0,$c0,$c0,$00,$3e,$60,$c0,$ce,$c6,$66,$3e,$00\n.byte $c6,$c6,$c6,$fe,$c6,$c6,$c6,$00,$fc,$30,$30,$30,$30,$30,$fc,$00\n.byte $06,$06,$06,$06,$06,$c6,$7c,$00,$c6,$cc,$d8,$f0,$f8,$dc,$ce,$00\n.byte $c0,$c0,$c0,$c0,$c0,$c0,$fe,$00,$c6,$ee,$fe,$d6,$c6,$c6,$c6,$00\n.byte $c6,$e6,$f6,$de,$ce,$c6,$c6,$00,$7c,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $fc,$c6,$c6,$c6,$fc,$c0,$c0,$00,$7c,$c6,$c6,$c6,$de,$cc,$7a,$00\n.byte $fc,$c6,$c6,$cc,$f8,$dc,$ce,$00,$78,$cc,$c0,$7c,$06,$c6,$7c,$00\n.byte $fc,$30,$30,$30,$30,$30,$30,$00,$c6,$c6,$c6,$c6,$c6,$c6,$7c,$00\n.byte $c6,$c6,$c6,$c6,$6c,$38,$10,$00,$c6,$c6,$d6,$fe,$fe,$ee,$c6,$00\n.byte $c6,$ee,$7c,$38,$7c,$ee,$c6,$00,$cc,$cc,$cc,$78,$30,$30,$30,$00\n.byte $fe,$0e,$1c,$38,$70,$e0,$fe,$00, <tile_1> ; z (90)\n.byte <tile_2>, <tile_3>\n.byte <tile_4>, <tile_5>\n.byte $00,$00,$00,$00,$00,$00,$00,$00, <tile_6>\n.byte <tile_7>, <tile_8>\n.byte <tile_9>, <tile_10>\n.byte <tile_11>, <tile_12>\n.byte <tile_13>, <tile_14>\n.byte <tile_15>, <tile_16>\n.byte <tile_17>, <tile_18>\n.byte <tile_19>, <tile_20>\n.byte $38,$4c,$c6,$c6,$c6,$64,$38,$00 ; 0\n.byte $30,$70,$30,$30,$30,$30,$fc,$00,$7c,$c6,$0e,$3c,$60,$c0,$fe,$00\n.byte $7e,$0c,$18,$3c,$06,$c6,$7c,$00,$1c,$3c,$6c,$cc,$fe,$0c,$0c,$00\n.byte $fc,$c0,$fc,$06,$06,$c6,$7c,$00,$3c,$60,$c0,$fc,$c6,$c6,$7c,$00\n.byte $fe,$c6,$0c,$18,$30,$30,$30,$00,$78,$c4,$e4,$78,$9e,$86,$7c,$00\n.byte $7c,$c6,$c6,$7e,$06,$0c,$78,$00 ; 9\n.byte <tile_21>, <tile_22>\n.byte <tile_23>, <tile_24>\n.byte <tile_25>, <tile_26>\n\n"
  },
  {
    "path": "src/assets/templates/8x8/cmoc_udc_tiles.s.template",
    "content": "* 6809 assembly program generated by cmoc 0.1.56\r\n\r\n\r\n\tSECTION\tcode\r\n\r\n\r\n_udgs\tEXPORT\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\trodata\r\n\r\n\r\nstring_literals_start\tEQU\t*\r\nstring_literals_end\tEQU\t*\r\n\r\n\r\n*******************************************************************************\r\n\r\n* READ0ONLY GLOBAL VARIABLES\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\trwdata\r\n\r\n\r\n* Globals with static initializers\r\n_udgs\tEQU\t*\t\tudgs: uint8_t[]\r\n\r\n\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; invincibility\r\n    FCB <tile_10>\r\n\r\n; left missile\r\n    FCB <tile_14>\r\n\r\n; bullet\r\n    FCB <tile_11>\r\n\r\n; dollar $\r\n    FCB <tile_25>\r\n\r\n; power-up F\r\n    FCB <tile_17>\r\n\r\n; vertical brick\r\n    FCB <tile_12>\r\n\r\n; skull\r\n    FCB <tile_7>\r\n\r\n; ghost\r\n    FCB <tile_4>\r\n\r\n; bomb\r\n    FCB <tile_5>\r\n\r\n; player down\r\n    FCB <tile_0>\r\n\r\n; horizontal brick\r\n    FCB <tile_13>\r\n\r\n; power-up S\r\n    FCB <tile_8>\r\n\r\n\tFCB <tile_26>\r\n\r\n; right missile\r\n    FCB <tile_15>\r\n\r\n; rocket\r\n    FCB <tile_16>\r\n\r\n\tFCB %00000000 ; \r\n\tFCB %00111100 ;  ####\r\n\tFCB %01000110 ; #   ## \r\n\tFCB %01001010 ; #  # # \r\n\tFCB %01010010 ; # #  # \r\n\tFCB %01100010 ; ##   #\r\n\tFCB %00111100 ;  ####\r\n\tFCB %00000000\r\n\r\n    FCB <tile_19>\r\n    FCB <tile_20>\r\n    FCB <tile_21>\r\n    FCB <tile_22>\r\n    FCB <tile_23>\r\n    FCB <tile_24>\r\n\r\n\tFCB %00000000\r\n\tFCB %01111110\r\n\tFCB %00000010\r\n\tFCB %00000100\r\n\tFCB %00001000\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00000000\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111110\r\n\tFCB %00000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; dead ghost\r\n    FCB <tile_6>\r\n\r\n; power-up H\r\n    FCB <tile_18>\r\n\r\n; player up\r\n    FCB <tile_1>\r\n\r\n; player right\r\n    FCB <tile_2>\r\n\r\n; player left\r\n    FCB <tile_3>\r\n\r\n; gun\r\n    FCB <tile_9>\r\n\r\n\r\n\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\tbss\r\n\r\n\r\n* Uninitialized globals\r\nbss_start\tEQU\t*\r\nbss_end\tEQU\t*\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\tcode\r\n\r\n\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\tinitgl\r\n\r\n\r\n\r\n\r\n*******************************************************************************\r\n\r\n* Initialize global variables.\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n*******************************************************************************\r\n\r\n* Importing 0 utility routine(s).\r\n\r\n\r\n*******************************************************************************\r\n\r\n\tEND\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/cmoc_udc_tiles_and_fonts.s.template",
    "content": "* 6809 assembly program generated by cmoc 0.1.56\r\n\r\n\r\n\tSECTION\tcode\r\n\r\n\r\n_udgs\tEXPORT\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\trodata\r\n\r\n\r\nstring_literals_start\tEQU\t*\r\nstring_literals_end\tEQU\t*\r\n\r\n\r\n*******************************************************************************\r\n\r\n* READ0ONLY GLOBAL VARIABLES\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\trwdata\r\n\r\n\r\n* Globals with static initializers\r\n_udgs\tEQU\t*\t\tudgs: uint8_t[]\r\n\r\n\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; invincibility\r\n    FCB <tile_10>\r\n\r\n; left missile\r\n    FCB <tile_14>\r\n\r\n; bullet\r\n    FCB <tile_11>\r\n\r\n; dollar $\r\n    FCB <tile_25>\r\n\r\n; power0up F\r\n    FCB <tile_17>\r\n\r\n; vertical brick\r\n    FCB <tile_12>\r\n\r\n; skull\r\n    FCB <tile_7>\r\n\r\n; ghost\r\n    FCB <tile_4>\r\n\r\n; bomb\r\n    FCB <tile_5>\r\n\r\n; player down\r\n    FCB <tile_0>\r\n\r\n; horizontal brick\r\n    FCB <tile_13>\r\n\r\n; power0up S\r\n    FCB <tile_8>\r\n\r\n\tFCB <tile_26>\r\n\r\n; right missile\r\n    FCB <tile_15>\r\n\r\n; rocket\r\n    FCB <tile_16>\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n\r\n    FCB <tile_19>\r\n    FCB <tile_20>\r\n    FCB <tile_21>\r\n    FCB <tile_22>\r\n    FCB <tile_23>\r\n    FCB <tile_24>\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n\r\n; dead ghost\r\n    FCB <tile_6>\r\n\r\n; power0up H\r\n    FCB <tile_18>\r\n\r\n; player up\r\n    FCB <tile_1>\r\n\r\n; player right\r\n    FCB <tile_2>\r\n\r\n; player left\r\n    FCB <tile_3>\r\n\r\n; gun\r\n    FCB <tile_9>\r\n\r\n\r\n\r\n; 13\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00111110\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 14\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n\r\n; 15\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 16\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000110\r\n\tFCB %01001010\r\n\tFCB %01010010\r\n\tFCB %01100010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 17\r\n\r\n\tFCB %00000000\r\n\tFCB %00011000\r\n\tFCB %00101000\r\n\tFCB %00001000\r\n\tFCB %00001000\r\n\tFCB %00001000\r\n\tFCB %00111110\r\n\tFCB %00000000\r\n\r\n; 18\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %00000010\r\n\tFCB %00111100\r\n\tFCB %01000000\r\n\tFCB %01111110\r\n\tFCB %00000000\r\n\r\n; 19\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %00001100\r\n\tFCB %00000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 20\r\n\r\n\tFCB %00000000\r\n\tFCB %00001000\r\n\tFCB %00011000\r\n\tFCB %00101000\r\n\tFCB %01001000\r\n\tFCB %01111110\r\n\tFCB %00001000\r\n\tFCB %00000000\r\n\r\n; 21\r\n\r\n\tFCB %00000000\r\n\tFCB %01111110\r\n\tFCB %01000000\r\n\tFCB %01111100\r\n\tFCB %00000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 22\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000000\r\n\tFCB %01111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 23\r\n\r\n\tFCB %00000000\r\n\tFCB %01111110\r\n\tFCB %00000010\r\n\tFCB %00000100\r\n\tFCB %00001000\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00000000\r\n\r\n; 24\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 25\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111110\r\n\tFCB %00000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 26\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 27\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 28\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 29\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 30\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 31\r\n\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 32\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\tFCB %00000000\r\n\r\n; 33\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01111110\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00000000\r\n    \r\n; 34\r\n\r\n\tFCB %00000000\r\n\tFCB %01111100\r\n\tFCB %01000010\r\n\tFCB %01111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01111100\r\n\tFCB %00000000\r\n\r\n; 35\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 36\r\n\r\n\tFCB %00000000\r\n\tFCB %01111000\r\n\tFCB %01000100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000100\r\n\tFCB %01111000\r\n\tFCB %00000000\r\n\r\n; 37\r\n\r\n\tFCB %00000000\r\n\tFCB %01111110\r\n\tFCB %01000000\r\n\tFCB %01111100\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %01111110\r\n\tFCB %00000000\r\n\r\n; 38\r\n\r\n\tFCB %00000000\r\n\tFCB %01111110\r\n\tFCB %01000000\r\n\tFCB %01111100\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %00000000\r\n\r\n; 39\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000000\r\n\tFCB %01001110\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 40\r\n\r\n\tFCB %00000000\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01111110\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00000000\r\n\r\n; 41\r\n\r\n\tFCB %00000000\r\n\tFCB %00111110\r\n\tFCB %00001000\r\n\tFCB %00001000\r\n\tFCB %00001000\r\n\tFCB %00001000\r\n\tFCB %00111110\r\n\tFCB %00000000\r\n\r\n; 42\r\n\r\n\tFCB %00000000\r\n\tFCB %00000010\r\n\tFCB %00000010\r\n\tFCB %00000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 43\r\n\r\n\tFCB %00000000\r\n\tFCB %01000100\r\n\tFCB %01001000\r\n\tFCB %01110000\r\n\tFCB %01001000\r\n\tFCB %01000100\r\n\tFCB %01000010\r\n\tFCB %00000000\r\n\r\n; 44\r\n\r\n\tFCB %00000000\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %01111110\r\n\tFCB %00000000\r\n\r\n; 45\r\n\r\n\tFCB %00000000\r\n\tFCB %01000010\r\n\tFCB %01100110\r\n\tFCB %01011010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00000000\r\n\r\n; 46\r\n\r\n\tFCB %00000000\r\n\tFCB %01000010\r\n\tFCB %01100010\r\n\tFCB %01010010\r\n\tFCB %01001010\r\n\tFCB %01000110\r\n\tFCB %01000010\r\n\tFCB %00000000\r\n\r\n; 47\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 48\r\n\r\n\tFCB %00000000\r\n\tFCB %01111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01111100\r\n\tFCB %01000000\r\n\tFCB %01000000\r\n\tFCB %00000000\r\n\r\n; 49\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01010010\r\n\tFCB %01001010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 50\r\n\r\n\tFCB %00000000\r\n\tFCB %01111100\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01111100\r\n\tFCB %01000100\r\n\tFCB %01000010\r\n\tFCB %00000000\r\n\r\n; 51\r\n\r\n\tFCB %00000000\r\n\tFCB %00111100\r\n\tFCB %01000000\r\n\tFCB %00111100\r\n\tFCB %00000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 52\r\n\r\n\tFCB %00000000\r\n\tFCB %11111110\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00000000\r\n\r\n; 53\r\n\r\n\tFCB %00000000\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00111100\r\n\tFCB %00000000\r\n\r\n; 54\r\n\r\n\tFCB %00000000\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %00100100\r\n\tFCB %00011000\r\n\tFCB %00000000\r\n\r\n; 55\r\n\r\n\tFCB %00000000\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01000010\r\n\tFCB %01011010\r\n\tFCB %00100100\r\n\tFCB %00000000\r\n\r\n; 56\r\n\r\n\tFCB %00000000\r\n\tFCB %01000010\r\n\tFCB %00100100\r\n\tFCB %00011000\r\n\tFCB %00011000\r\n\tFCB %00100100\r\n\tFCB %01000010\r\n\tFCB %00000000\r\n\r\n; 57\r\n\r\n\tFCB %00000000\r\n\tFCB %10000010\r\n\tFCB %01000100\r\n\tFCB %00101000\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00010000\r\n\tFCB %00000000\r\n\r\n; 58\r\n\r\n\tFCB %00000000\r\n\tFCB %01111110\r\n\tFCB %00000100\r\n\tFCB %00001000\r\n\tFCB %00010000\r\n\tFCB %00100000\r\n\tFCB %01111110\r\n\tFCB %00000000\r\n\r\n\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\tbss\r\n\r\n\r\n* Uninitialized globals\r\nbss_start\tEQU\t*\r\nbss_end\tEQU\t*\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\tcode\r\n\r\n\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n\tSECTION\tinitgl\r\n\r\n\r\n\r\n\r\n*******************************************************************************\r\n\r\n* Initialize global variables.\r\n\r\n\r\n\tENDSECTION\r\n\r\n\r\n\r\n\r\n*******************************************************************************\r\n\r\n* Importing 0 utility routine(s).\r\n\r\n\r\n*******************************************************************************\r\n\r\n\tEND\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/z88dk_cpc_Chars8.asm.template",
    "content": "; ******************************************************\n; **       Libreria de rutinas para Amstrad CPC       **\n; **\t   Raul Simarro, \t  Artaburu 2009       **\n; ******************************************************\n\nGLOBAL cpc_Chars8\nGLOBAL first_char8\n\n.first_char8 defb 32\t;first defined char number (ASCII)\n\n.cpc_Chars8   ;each bit of each byte is a pixel, same way as SYMBOL function of Locomotive BASIC.\n\n;; KEY SET BY ANJUEL AND NA_TH_AN FROM NANAKO CPC GAME.\n   DEFB     0,  0,  0,  0,  0,  0,  0,  0 ; (32)\n   DEFB    <tile_0>\n   DEFB    <tile_1>\n   DEFB    <tile_2>\n   DEFB    <tile_3>\n   DEFB   <tile_4>\n   DEFB     <tile_15>\n   DEFB     <tile_14>\n   DEFB    <tile_7>\n   DEFB     <tile_9>\n   DEFB     <tile_8>\n   DEFB     <tile_11>\n   DEFB    <tile_5>\n   DEFB    <tile_16>\n   DEFB    <tile_10>\n   DEFB    <tile_12> ; TILE 12 (47)\n   DEFB     <tile_13> ; TILE 13 (48)\n   DEFB     <tile_25> ; TILE 25 (49)\n   DEFB   <tile_17> ; TILE 17 (50)\n   DEFB   <tile_18> ; TILE 18 (51)\n   DEFB   <tile_6>; (52)\n   DEFB    62, 32, 32, 62,  2, 34, 62,  0\n   DEFB    62, 32, 32, 62, 34, 34, 62,  0\n   DEFB    62, 36,  4,  4,  4,  4, 14,  0\n   DEFB    62, 34, 34, 62, 34, 34, 62,  0\n   DEFB    62, 34, 34, 62,  2, 34, 62,  0\n   DEFB     0, 24, 24,  0,  0, 24, 24,  0\n   DEFB     0, 24, 24,  0,  0, 24, 24, 32\n   DEFB     4,  8, 16, 32, 16,  8,  4,  0\n   DEFB     0,  0,126,  0,  0,126,  0,  0\n   DEFB    32, 16,  8,  4,  8, 16, 32,  0\n   DEFB    64,124, 68,  4, 28, 16,  0, 16\n   DEFB     0, 56, 84, 92, 64, 60,  0,  0\n   DEFB   126, 36, 36, 36, 60, 36,102,  0\n   DEFB   124, 36, 36, 62, 34, 34,126,  0\n   DEFB     2,126, 66, 64, 66,126,  2,  0\n   DEFB   126, 34, 34, 34, 34, 34,126,  0\n   DEFB     2,126, 66,120, 66,126,  2,  0\n   DEFB     2,126, 34, 48, 32, 32,112,  0\n   DEFB     2,126, 34, 32, 46, 36,124,  0\n   DEFB   102, 36, 36, 60, 36, 36,102,  0\n   DEFB    56, 16, 16, 16, 16, 16, 56,  0\n   DEFB    28,  8,  8,  8,  8, 40, 56,  0\n   DEFB   108, 40, 40,124, 36, 36,102,  0\n   DEFB   112, 32, 32, 32, 34,126,  2,  0\n   DEFB   127, 42, 42, 42, 42,107,  8,  0\n   DEFB   126, 36, 36, 36, 36, 36,102,  0\n   DEFB   126, 66, 66, 66, 66, 66,126,  0\n   DEFB   126, 34, 34,126, 32, 32,112,  0\n   DEFB   126, 66, 66, 74,126,  8, 28,  0\n   DEFB   126, 34, 34,126, 36, 36,114,  0\n   DEFB   126, 66, 64,126,  2, 66,126,  0\n   DEFB    34, 62, 42,  8,  8,  8, 28,  0\n   DEFB   102, 36, 36, 36, 36, 36,126,  0\n   DEFB   102, 36, 36, 36, 36, 24,  0,  0\n   DEFB   107, 42, 42, 42, 42, 42, 62,  0\n   DEFB   102, 36, 36, 24, 36, 36,102,  0\n   DEFB   102, 36, 36, 60,  8,  8, 28,  0\n   DEFB   126, 66,  4,  8, 16, 34,126,  0\n   DEFB     4, 60, 36, 32, 36, 60,  4,  0\n   DEFB     0, 64, 32, 16,  8,  4,  0,  0\n   DEFB    32, 60, 36,  4, 36, 60, 32,  0\n   DEFB     0, 16, 40, 68,  0,  0,  0,  0\n   DEFB     0,  0,  0,  0,  0,  0,  0,  0\n   DEFB     0,100,104, 16, 44, 76,  0,  0\n   DEFB   126, 36, 36, 36, 60, 36,102,  0\n   DEFB   124, 36, 36, 62, 34, 34,126,  0\n   DEFB     2,126, 66, 64, 66,126,  2,  0\n   DEFB   126, 34, 34, 34, 34, 34,126,  0\n   DEFB     2,126, 66,120, 66,126,  2,  0\n   DEFB     2,126, 34, 48, 32, 32,112,  0\n   DEFB     2,126, 34, 32, 46, 36,124,  0\n   DEFB   102, 36, 36, 60, 36, 36,102,  0\n   DEFB    56, 16, 16, 16, 16, 16, 56,  0\n   DEFB    28,  8,  8,  8,  8, 40, 56,  0\n   DEFB   108, 40, 40,124, 36, 36,102,  0\n   DEFB   112, 32, 32, 32, 34,126,  2,  0\n   DEFB   127, 42, 42, 42, 42,107,  8,  0\n   DEFB   126, 36, 36, 36, 36, 36,102,  0\n   DEFB   126, 66, 66, 66, 66, 66,126,  0\n   DEFB   126, 34, 34,126, 32, 32,112,  0\n   DEFB   126, 66, 66, 74,126,  8, 28,  0\n   DEFB   126, 34, 34,126, 36, 36,114,  0\n   DEFB   126, 66, 64,126,  2, 66,126,  0\n   DEFB    34, 62, 42,  8,  8,  8, 28,  0\n   DEFB   102, 36, 36, 36, 36, 36,126,  0\n   DEFB   102, 36, 36, 36, 36, 24,  0,  0\n   DEFB   107, 42, 42, 42, 42, 42, 62,  0\n   DEFB   102, 36, 36, 24, 36, 36,102,  0\n   DEFB   102, 36, 36, 60,  8,  8, 28,  0\n   DEFB <tile_19>\n   DEFB <tile_20>\n   DEFB <tile_21>\n   DEFB <tile_22>\n   DEFB <tile_23>\n   DEFB <tile_24>\n   DEFB <tile_26>\n"
  },
  {
    "path": "src/assets/templates/8x8/z88dk_gameboy.asm.template",
    "content": "\r\nSECTION rodata_user\r\nPUBLIC _udgs\r\n\r\n_udgs:\r\n\r\n; Paste in the contents of lower.asm here\r\n\r\n\r\n\tdefb\t2+4\t;256 char encoding, compressed\r\n\tdefb\t128\t;Number of tiles\r\n\r\n; Character: ? (00)\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Character: ? (01)\r\n        defb    0b00011000      ;    oo\r\n        defb    0b00100100      ;   o  o\r\n        defb    0b01000010      ;  o    o\r\n        defb    0b10000001      ; o      o\r\n        defb    0b11100111      ; ooo  ooo\r\n        defb    0b00100100      ;   o  o\r\n        defb    0b00100100      ;   o  o\r\n        defb    0b00111100      ;   oooo\r\n\r\n; Character: ? (02)\r\n        defb    0b00111100      ;   oooo\r\n        defb    0b00100100      ;   o  o\r\n        defb    0b00100100      ;   o  o\r\n        defb    0b11100111      ; ooo  ooo\r\n        defb    0b10000001      ; o      o\r\n        defb    0b01000010      ;  o    o\r\n        defb    0b00100100      ;   o  o\r\n        defb    0b00011000      ;    oo\r\n\r\n; Character: ? (03)\r\n        defb    0b00011000      ;    oo\r\n        defb    0b00010100      ;    o o\r\n        defb    0b11110010      ; oooo  o\r\n        defb    0b10000001      ; o      o\r\n        defb    0b10000001      ; o      o\r\n        defb    0b11110010      ; oooo  o\r\n        defb    0b00010100      ;    o o\r\n        defb    0b00011000      ;    oo\r\n\r\n; Character: ? (04)\r\n        defb    0b00011000      ;    oo\r\n        defb    0b00101000      ;   o o\r\n        defb    0b01001111      ;  o  oooo\r\n        defb    0b10000001      ; o      o\r\n        defb    0b10000001      ; o      o\r\n        defb    0b01001111      ;  o  oooo\r\n        defb    0b00101000      ;   o o\r\n        defb    0b00011000      ;    oo\r\n\r\n; Character: ? (05)\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Character: ? (06)\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Character: ? (07)\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n; Character: ? (08)\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n; Character: ? (09)\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n; Character: ? (0a)\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n; Character: ? (0b)\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n; Character: ? (0c)\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\r\n; Character: ? (0D)\r\n        defb    0b01110000      ;  ooo\r\n        defb    0b11001000      ; oo  o\r\n        defb    0b11011110      ; oo oooo\r\n        defb    0b11011011      ; oo oo oo\r\n        defb    0b11011011      ; oo oo oo\r\n        defb    0b01111110      ;  oooooo\r\n        defb    0b00011011      ;    oo oo\r\n        defb    0b00011011      ;    oo oo\r\n\r\n; Character: ? (0E)\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n        defb    0b11111111      ; oooooooo\r\n        defb    0b11111111      ; oooooooo\r\n        defb    0b11111111      ; oooooooo\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n\r\n; Character: ? (0F)\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n\r\n; Character: ? (10)\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n; Character: ? (11)\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n; Character: ? (12)\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n; Character: ? (13)\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n; Character: ? (14)\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11110000\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n; Character: ? (15)\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@00001111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n; Character: ? (16)\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n\tdefb\t@11111111\r\n; Character: ? (17)\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n; Character: ? (18)\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n; Character: ? (19)\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n\tdefb\t@10101010\r\n\tdefb\t@01010101\r\n; Character: ? (1A)\r\n\tdefb\t@00001010\r\n\tdefb\t@00000101\r\n\tdefb\t@00001010\r\n\tdefb\t@00000101\r\n\tdefb\t@00001010\r\n\tdefb\t@00000101\r\n\tdefb\t@00001010\r\n\tdefb\t@00000101\r\n; Character: ? (1B)\r\n\tdefb\t@10100000\r\n\tdefb\t@01010000\r\n\tdefb\t@10100000\r\n\tdefb\t@01010000\r\n\tdefb\t@10100000\r\n\tdefb\t@01010000\r\n\tdefb\t@10100000\r\n\tdefb\t@01010000\r\n\r\n; Character: ? (1C)\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n        defb    0b00011111      ;    ooooo\r\n        defb    0b00011111      ;    ooooo\r\n        defb    0b00011111      ;    ooooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n\r\n; Character: ? (1D)\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n        defb    0b11111100      ; oooooo\r\n        defb    0b11111100      ; oooooo\r\n        defb    0b11111100      ; oooooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n\r\n\r\n; Character: ? (1E)\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011111      ;    ooooo\r\n        defb    0b00011111      ;    ooooo\r\n        defb    0b00011111      ;    ooooo\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n\r\n; Character: ? (1F)\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b00011100      ;    ooo\r\n        defb    0b11111100      ; oooooo\r\n        defb    0b11111100      ; oooooo\r\n        defb    0b11111100      ; oooooo\r\n        defb    0b00000000      ;\r\n        defb    0b00000000      ;\r\n\r\n\r\n\r\n; Include your usual font file here\r\n\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\r\n; invincibility\r\ndefb <tile_10>\r\n\t ; defb    @00011000\r\n\t ; defb    @00100100\r\n\t ; defb    @00000000\r\n\t ; defb    @01100110\r\n\t ; defb    @10011001\r\n\t ; defb    @00000000\r\n\t ; defb    @00100100\r\n\t ; defb    @01100110\r\n\r\n; left missile\r\ndefb <tile_14>\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\t ; defb    @11110000\r\n\t ; defb    @01111111\r\n\t ; defb    @01111111\r\n\t ; defb    @11110000\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\r\n; bullet\r\ndefb <tile_11>\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\t ; defb    @00001000\r\n\t ; defb    @00111000\r\n\t ; defb    @00011100\r\n\t ; defb    @00010000\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\r\n; dollar\r\ndefb <tile_25>\r\n\t;defb %\"--------\"\r\n\t;defb %\"----#---\"\r\n\t;defb %\"--#####-\"\r\n\t;defb %\"--#-#---\"\r\n\t;defb %\"--#####-\"\r\n\t;defb %\"----#-#-\"\r\n\t;defb %\"--#####-\"\r\n\t;defb %\"----#---\"\r\n\r\n; power-up F\r\ndefb <tile_17> \r\n\t ; defb    @00000000\r\n\t ; defb    @00111100\r\n\t ; defb    @01000010\r\n\t ; defb    @11001111\r\n\t ; defb    @11000011\r\n\t ; defb    @01100110\r\n\t ; defb    @00100100\r\n\t ; defb    @00011000\r\n\r\n; vertical brick\r\ndefb <tile_12>\r\n\t ; defb    @00011000\r\n\t ; defb    @00011000\r\n\t ; defb    @01111000\r\n\t ; defb    @00011000\r\n\t ; defb    @00011000\r\n\t ; defb    @00011110\r\n\t ; defb    @00011000\r\n\t ; defb    @00011000\r\n\r\n; skull\r\ndefb <tile_7>\r\n\t ; defb    @00111100\r\n\t ; defb    @01000010\r\n\t ; defb    @10100101\r\n\t ; defb    @10000001\r\n\t ; defb    @01011010\r\n\t ; defb    @00100100\r\n\t ; defb    @00100100\r\n\t ; defb    @00111100 \t \r\n\r\n; ghost\r\n\t defb    <tile_4>\r\n\t ; defb    @10111101\r\n\t ; defb    @01000010\r\n\t ; defb    @10100101\r\n\t ; defb    @10000001\r\n\t ; defb    @10000001\r\n\t ; defb    @10011001\r\n\t ; defb    @10000001\r\n\t ; defb    @01111110 \r\n\r\n; bomb\r\ndefb <tile_5>\r\n\t ; defb    @00111100\r\n\t ; defb    @01000010\r\n\t ; defb    @10100101\r\n\t ; defb    @10011001\r\n\t ; defb    @10011001\r\n\t ; defb    @10100101\r\n\t ; defb    @01000010\r\n\t ; defb    @00111100\r\n\r\n; player down\r\ndefb <tile_0>\r\n\t ; defb    @00011000\r\n\t ; defb    @00100100\r\n\t ; defb    @00011000\r\n\t ; defb    @01100110\r\n\t ; defb    @10011001\r\n\t ; defb    @00011000\r\n\t ; defb    @00100100\r\n\t ; defb    @01100110\r\n\r\n; horizontal brick\r\ndefb <tile_13>\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\t ; defb    @11111111\r\n\t ; defb    @11111111\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\r\n; power-up S\r\ndefb <tile_8>\r\n\t ; defb    @00000000\r\n\t ; defb    @00111100\r\n\t ; defb    @01100110\r\n\t ; defb    @11011111\r\n\t ; defb    @11100111\r\n\t ; defb    @01111010\r\n\t ; defb    @00100100\r\n\t ; defb    @00011000\r\n\r\ndefb <tile_26>\r\n\t; defb %\"--------\"\r\n\t; defb %\"--------\"\r\n\t; defb %\"--------\"\r\n\t; defb %\"--------\"\r\n\t; defb %\"--#####-\"\r\n\t; defb %\"--------\"\r\n\t; defb %\"--------\"\r\n\t; defb %\"--------\"\r\n\r\n; right missile\r\ndefb <tile_15>\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\t ; defb    @00001111\r\n\t ; defb    @11111110\r\n\t ; defb    @11111110\r\n\t ; defb    @00001111\r\n\t ; defb    @00000000\r\n\t ; defb    @00000000\r\n\r\n; rocket\r\ndefb <tile_16>\r\n\t ; defb    @00011000\r\n\t ; defb    @00111100\r\n\t ; defb    @00111100\r\n\t ; defb    @00111100\r\n\t ; defb    @01111110\r\n\t ; defb    @01111110\r\n\t ; defb    @01011010\r\n\t ; defb    @01000010\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\ndefb <tile_19>\r\n\r\n; power-up H\r\ndefb <tile_18> \r\n\t ; defb    @00000000\r\n\t ; defb    @00111100\r\n\t ; defb    @01011010\r\n\t ; defb    @11011011\r\n\t ; defb    @11000011\r\n\t ; defb    @01011010\r\n\t ; defb    @00111100\r\n\t ; defb    @00011000\r\n\r\n; player up\r\ndefb <tile_1>\r\n\t ; defb    @00011000\r\n\t ; defb    @00111100\r\n\t ; defb    @00011000\r\n\t ; defb    @01100110\r\n\t ; defb    @10011001\r\n\t ; defb    @00011000\r\n\t ; defb    @00100100\r\n\t ; defb    @01100110\r\n\r\n; player right\r\ndefb <tile_2>\r\n\t ; defb    @00011000\r\n\t ; defb    @00110100\r\n\t ; defb    @00011001\r\n\t ; defb    @01101111\r\n\t ; defb    @10011000\r\n\t ; defb    @00011000\r\n\t ; defb    @00010100\r\n\t ; defb    @00010100\r\n\r\n; player left\r\ndefb <tile_3>\r\n\t ; defb    @00011000\r\n\t ; defb    @00101100\r\n\t ; defb    @10011000\r\n\t ; defb    @11101110\r\n\t ; defb    @00011001\r\n\t ; defb    @00011000\r\n\t ; defb    @00101000\r\n\t ; defb    @00101000\r\n\r\n; gun\r\n    defb <tile_9>\r\n\r\n\t ; defb    @00000000\r\n\t ; defb    @10000000\r\n\t ; defb    @01111110\r\n\t ; defb    @11001000\r\n\t ; defb    @11111000\r\n\t ; defb    @11000000\r\n\t ; defb    @10000000\t \r\n\t ; defb    @00000000\r\n\r\ndefb <tile_20> \r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#--###-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##--##-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"#######-\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"#-----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n; dead ghost\r\ndefb <tile_6>\r\n\t ; defb    @10111101\r\n\t ; defb    @01000010\r\n\t ; defb    @10100101\r\n\t ; defb    @10100101\r\n\t ; defb    @10000001\r\n\t ; defb    @10011001\r\n\t ; defb    @10000001\r\n\t ; defb    @01111110 \r\n\r\ndefb <tile_21> \r\n\r\ndefb <tile_22> \r\n\r\ndefb <tile_23> \r\n\r\ndefb <tile_24> \r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-##-#---\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----##-\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----###-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----###-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#-#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n_udgs_end:\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/z88dk_pv1000.asm.template",
    "content": "    \r\n\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n; Char 32 (20)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 33 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_0>\r\n\r\n    defb <tile_0>\r\n\r\n\r\n    defb <tile_0>\r\n\r\n\r\n\r\n; Char 34 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_0>\r\n\r\n    defb <tile_0>\r\n\r\n\r\n\r\n; Char 35 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_0>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 36 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_0>\r\n\r\n\r\n\r\n    defb <tile_0>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 37 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_0>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 38 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_1>\r\n\r\n    defb <tile_1>\r\n\r\n\r\n    defb <tile_1>\r\n\r\n\r\n\r\n; Char 39 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_1>\r\n\r\n    defb <tile_1>\r\n\r\n\r\n\r\n; Char 40 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_1>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 41 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_1>\r\n\r\n\r\n\r\n    defb <tile_1>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 42 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_1>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 43 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_2>\r\n\r\n    defb <tile_2>\r\n\r\n\r\n    defb <tile_2>\r\n\r\n\r\n\r\n; Char 44 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_2>\r\n\r\n    defb <tile_2>\r\n\r\n\r\n\r\n; Char 45 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_2>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 46 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_2>\r\n\r\n\r\n\r\n    defb <tile_2>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 47 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_2>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 48 (30)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n\tdefb\t@01111100\r\n\tdefb\t@11000110\r\n\tdefb\t@11001110\r\n\tdefb\t@11010110\r\n\tdefb\t@11100110\r\n\tdefb\t@11000110\r\n\tdefb\t@01111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111100\r\n\tdefb\t@11000110\r\n\tdefb\t@11001110\r\n\tdefb\t@11010110\r\n\tdefb\t@11100110\r\n\tdefb\t@11000110\r\n\tdefb\t@01111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111100\r\n\tdefb\t@11000110\r\n\tdefb\t@11001110\r\n\tdefb\t@11010110\r\n\tdefb\t@11100110\r\n\tdefb\t@11000110\r\n\tdefb\t@01111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 49 (31)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00011000\r\n\tdefb\t@00111000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011000\r\n\tdefb\t@00111000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011000\r\n\tdefb\t@00111000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 50 (32)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00111100\r\n\tdefb\t@01100000\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00111100\r\n\tdefb\t@01100000\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00111100\r\n\tdefb\t@01100000\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 51 (33)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00011100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00011100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00011100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 52 (34)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00011100\r\n\tdefb\t@00111100\r\n\tdefb\t@01101100\r\n\tdefb\t@11001100\r\n\tdefb\t@11111110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011100\r\n\tdefb\t@00111100\r\n\tdefb\t@01101100\r\n\tdefb\t@11001100\r\n\tdefb\t@11111110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011100\r\n\tdefb\t@00111100\r\n\tdefb\t@01101100\r\n\tdefb\t@11001100\r\n\tdefb\t@11111110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 53 (35)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01100000\r\n\tdefb\t@01111100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01100000\r\n\tdefb\t@01111100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01100000\r\n\tdefb\t@01111100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 54 (36)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100000\r\n\tdefb\t@01111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100000\r\n\tdefb\t@01111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100000\r\n\tdefb\t@01111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 55 (37)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 56 (38)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 57 (39)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111110\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111110\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111110\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n; Char 58 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_3>\r\n\r\n    defb <tile_3>\r\n\r\n\r\n    defb <tile_3>\r\n\r\n\r\n\r\n; Char 59 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_3>\r\n\r\n    defb <tile_3>\r\n\r\n\r\n\r\n; Char 60 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_3>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 61 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_3>\r\n\r\n\r\n\r\n    defb <tile_3>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 62 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_3>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n; Char 63 (3f)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 64 (40)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01111100\r\n\tdefb\t@11000110\r\n\tdefb\t@11011110\r\n\tdefb\t@11011110\r\n\tdefb\t@11011110\r\n\tdefb\t@11000000\r\n\tdefb\t@01111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111100\r\n\tdefb\t@11000110\r\n\tdefb\t@11011110\r\n\tdefb\t@11011110\r\n\tdefb\t@11011110\r\n\tdefb\t@11000000\r\n\tdefb\t@01111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n; Char 65 (41)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 66 (42)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@11111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@11111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@11111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 67 (43)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 68 (44)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11111000\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01101100\r\n\tdefb\t@11111000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111000\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01101100\r\n\tdefb\t@11111000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111000\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01101100\r\n\tdefb\t@11111000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 69 (45)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01101000\r\n\tdefb\t@01111000\r\n\tdefb\t@01101000\r\n\tdefb\t@01100010\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01101000\r\n\tdefb\t@01111000\r\n\tdefb\t@01101000\r\n\tdefb\t@01100010\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01101000\r\n\tdefb\t@01111000\r\n\tdefb\t@01101000\r\n\tdefb\t@01100010\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 70 (46)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01101000\r\n\tdefb\t@01111000\r\n\tdefb\t@01101000\r\n\tdefb\t@01100000\r\n\tdefb\t@11110000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01101000\r\n\tdefb\t@01111000\r\n\tdefb\t@01101000\r\n\tdefb\t@01100000\r\n\tdefb\t@11110000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111110\r\n\tdefb\t@01100010\r\n\tdefb\t@01101000\r\n\tdefb\t@01111000\r\n\tdefb\t@01101000\r\n\tdefb\t@01100000\r\n\tdefb\t@11110000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 71 (47)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@11001110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@11001110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@11000000\r\n\tdefb\t@11000000\r\n\tdefb\t@11001110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 72 (48)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 73 (49)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01111110\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@01111110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 74 (4a)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00011110\r\n\tdefb\t@00001100\r\n\tdefb\t@00001100\r\n\tdefb\t@00001100\r\n\tdefb\t@11001100\r\n\tdefb\t@11001100\r\n\tdefb\t@01111000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011110\r\n\tdefb\t@00001100\r\n\tdefb\t@00001100\r\n\tdefb\t@00001100\r\n\tdefb\t@11001100\r\n\tdefb\t@11001100\r\n\tdefb\t@01111000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00011110\r\n\tdefb\t@00001100\r\n\tdefb\t@00001100\r\n\tdefb\t@00001100\r\n\tdefb\t@11001100\r\n\tdefb\t@11001100\r\n\tdefb\t@01111000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 75 (4b)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01101100\r\n\tdefb\t@01111000\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@11100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01101100\r\n\tdefb\t@01111000\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@11100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01101100\r\n\tdefb\t@01111000\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@11100110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 76 (4c)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11110000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100010\r\n\tdefb\t@01100110\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11110000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100010\r\n\tdefb\t@01100110\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11110000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@01100010\r\n\tdefb\t@01100110\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 77 (4d)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11000110\r\n\tdefb\t@11101110\r\n\tdefb\t@11111110\r\n\tdefb\t@11111110\r\n\tdefb\t@11010110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@11101110\r\n\tdefb\t@11111110\r\n\tdefb\t@11111110\r\n\tdefb\t@11010110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@11101110\r\n\tdefb\t@11111110\r\n\tdefb\t@11111110\r\n\tdefb\t@11010110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 78 (4e)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11000110\r\n\tdefb\t@11100110\r\n\tdefb\t@11110110\r\n\tdefb\t@11011110\r\n\tdefb\t@11001110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@11100110\r\n\tdefb\t@11110110\r\n\tdefb\t@11011110\r\n\tdefb\t@11001110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@11100110\r\n\tdefb\t@11110110\r\n\tdefb\t@11011110\r\n\tdefb\t@11001110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 79 (4f)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@01101100\r\n\tdefb\t@00111000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@01101100\r\n\tdefb\t@00111000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@01101100\r\n\tdefb\t@00111000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 80 (50)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@11110000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@11110000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01100000\r\n\tdefb\t@01100000\r\n\tdefb\t@11110000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 81 (51)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11011010\r\n\tdefb\t@11001100\r\n\tdefb\t@01110110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11011010\r\n\tdefb\t@11001100\r\n\tdefb\t@01110110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11011010\r\n\tdefb\t@11001100\r\n\tdefb\t@01110110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 82 (52)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@11100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@11100110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01111100\r\n\tdefb\t@01101100\r\n\tdefb\t@01100110\r\n\tdefb\t@11100110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 83 (53)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@00111100\r\n\tdefb\t@01100110\r\n\tdefb\t@01100000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 84 (54)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01111110\r\n\tdefb\t@01011010\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@01011010\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01111110\r\n\tdefb\t@01011010\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 85 (55)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 86 (56)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00011000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 87 (57)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11010110\r\n\tdefb\t@11111110\r\n\tdefb\t@11101110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11010110\r\n\tdefb\t@11111110\r\n\tdefb\t@11101110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@11010110\r\n\tdefb\t@11111110\r\n\tdefb\t@11101110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 88 (58)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11000110\r\n\tdefb\t@01101100\r\n\tdefb\t@00111000\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@01101100\r\n\tdefb\t@00111000\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11000110\r\n\tdefb\t@01101100\r\n\tdefb\t@00111000\r\n\tdefb\t@00111000\r\n\tdefb\t@01101100\r\n\tdefb\t@11000110\r\n\tdefb\t@11000110\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 89 (59)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@01100110\r\n\tdefb\t@00111100\r\n\tdefb\t@00011000\r\n\tdefb\t@00011000\r\n\tdefb\t@00111100\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 90 (5a)\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@11111110\r\n\tdefb\t@11000110\r\n\tdefb\t@10001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00110010\r\n\tdefb\t@01100110\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111110\r\n\tdefb\t@11000110\r\n\tdefb\t@10001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00110010\r\n\tdefb\t@01100110\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n\tdefb\t@11111110\r\n\tdefb\t@11000110\r\n\tdefb\t@10001100\r\n\tdefb\t@00011000\r\n\tdefb\t@00110010\r\n\tdefb\t@01100110\r\n\tdefb\t@11111110\r\n\tdefb\t@00000000\r\n\r\n; Char 91 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_4>\r\n\r\n    defb <tile_4>\r\n\r\n\r\n    defb <tile_4>\r\n\r\n\r\n\r\n; Char 92 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_4>\r\n\r\n    defb <tile_4>\r\n\r\n\r\n\r\n; Char 93 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_4>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 94 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_4>\r\n\r\n\r\n\r\n    defb <tile_4>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 95 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_4>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 96 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_5>\r\n\r\n    defb <tile_5>\r\n\r\n\r\n    defb <tile_5>\r\n\r\n\r\n\r\n; Char 97 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_5>\r\n\r\n    defb <tile_5>\r\n\r\n\r\n\r\n; Char 98 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_5>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 99 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_5>\r\n\r\n\r\n\r\n    defb <tile_5>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 100 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_5>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 101 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_6>\r\n\r\n    defb <tile_6>\r\n\r\n\r\n    defb <tile_6>\r\n\r\n\r\n\r\n; Char 102 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_6>\r\n\r\n    defb <tile_6>\r\n\r\n\r\n\r\n; Char 103 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_6>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 94 (104) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_6>\r\n\r\n\r\n\r\n    defb <tile_6>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 105 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_6>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 106 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_7>\r\n\r\n    defb <tile_7>\r\n\r\n\r\n    defb <tile_7>\r\n\r\n\r\n\r\n; Char 107 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_7>\r\n\r\n    defb <tile_7>\r\n\r\n\r\n\r\n; Char 108 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_7>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 109 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_7>\r\n\r\n\r\n\r\n    defb <tile_7>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 110 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_7>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 111 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_8>\r\n\r\n    defb <tile_8>\r\n\r\n\r\n    defb <tile_8>\r\n\r\n\r\n\r\n; Char 112 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_8>\r\n\r\n    defb <tile_8>\r\n\r\n\r\n\r\n; Char 113 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_8>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 114 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_8>\r\n\r\n\r\n\r\n    defb <tile_8>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 115 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_8>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 116 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_9>\r\n\r\n    defb <tile_9>\r\n\r\n\r\n    defb <tile_9>\r\n\r\n\r\n\r\n; Char 117 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_9>\r\n\r\n    defb <tile_9>\r\n\r\n\r\n\r\n; Char 118 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_9>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 119 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_9>\r\n\r\n\r\n\r\n    defb <tile_9>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 120 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_9>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 121 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_10>\r\n\r\n    defb <tile_10>\r\n\r\n\r\n    defb <tile_10>\r\n\r\n\r\n\r\n; Char 122 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_10>\r\n\r\n    defb <tile_10>\r\n\r\n\r\n\r\n; Char 123 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_10>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 124 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_10>\r\n\r\n\r\n\r\n    defb <tile_10>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 125 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_10>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 126 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_11>\r\n\r\n    defb <tile_11>\r\n\r\n\r\n    defb <tile_11>\r\n\r\n\r\n\r\n; Char 127 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_11>\r\n\r\n    defb <tile_11>\r\n\r\n\r\n\r\n; Char 128 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_11>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 129 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_11>\r\n\r\n\r\n\r\n    defb <tile_11>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 130 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_11>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 131 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_12>\r\n\r\n    defb <tile_12>\r\n\r\n\r\n    defb <tile_12>\r\n\r\n\r\n\r\n; Char 132 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_12>\r\n\r\n    defb <tile_12>\r\n\r\n\r\n\r\n; Char 133 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_12>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 134 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_12>\r\n\r\n\r\n\r\n    defb <tile_12>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 135 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_12>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 136 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_13>\r\n\r\n    defb <tile_13>\r\n\r\n\r\n    defb <tile_13>\r\n\r\n\r\n\r\n; Char 137 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_13>\r\n\r\n    defb <tile_13>\r\n\r\n\r\n\r\n; Char 138 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_13>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 139 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_13>\r\n\r\n\r\n\r\n    defb <tile_13>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 140 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_13>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 141 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_14>\r\n\r\n    defb <tile_14>\r\n\r\n\r\n    defb <tile_14>\r\n\r\n\r\n\r\n; Char 142 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_14>\r\n\r\n    defb <tile_14>\r\n\r\n\r\n\r\n; Char 143 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_14>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 144 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_14>\r\n\r\n\r\n\r\n    defb <tile_14>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 145 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_14>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 146 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_15>\r\n\r\n    defb <tile_15>\r\n\r\n\r\n    defb <tile_15>\r\n\r\n\r\n\r\n; Char 147 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_15>\r\n\r\n    defb <tile_15>\r\n\r\n\r\n\r\n; Char 148 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_15>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 149 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_15>\r\n\r\n\r\n\r\n    defb <tile_15>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 150 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_15>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 151 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_16>\r\n\r\n    defb <tile_16>\r\n\r\n\r\n    defb <tile_16>\r\n\r\n\r\n\r\n; Char 152 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_16>\r\n\r\n    defb <tile_16>\r\n\r\n\r\n\r\n; Char 153 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_16>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 154 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_16>\r\n\r\n\r\n\r\n    defb <tile_16>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 155 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_16>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 156 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_17>\r\n\r\n    defb <tile_17>\r\n\r\n\r\n    defb <tile_17>\r\n\r\n\r\n\r\n; Char 157 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_17>\r\n\r\n    defb <tile_17>\r\n\r\n\r\n\r\n; Char 158 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_17>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 159 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_17>\r\n\r\n\r\n\r\n    defb <tile_17>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 160 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_17>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 161 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_18>\r\n\r\n    defb <tile_18>\r\n\r\n\r\n    defb <tile_18>\r\n\r\n\r\n\r\n; Char 162 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_18>\r\n\r\n    defb <tile_18>\r\n\r\n\r\n\r\n; Char 163 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_18>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 164 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_18>\r\n\r\n\r\n\r\n    defb <tile_18>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 165 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_18>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 166 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_19>\r\n\r\n    defb <tile_19>\r\n\r\n\r\n    defb <tile_19>\r\n\r\n\r\n\r\n; Char 167 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_19>\r\n\r\n    defb <tile_19>\r\n\r\n\r\n\r\n; Char 168 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_19>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 169 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_19>\r\n\r\n\r\n\r\n    defb <tile_19>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 170 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_19>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 171 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_20>\r\n\r\n    defb <tile_20>\r\n\r\n\r\n    defb <tile_20>\r\n\r\n\r\n\r\n; Char 172 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_20>\r\n\r\n    defb <tile_20>\r\n\r\n\r\n\r\n; Char 173 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_20>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 174 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_20>\r\n\r\n\r\n\r\n    defb <tile_20>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 175 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_20>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 176 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_21>\r\n\r\n    defb <tile_21>\r\n\r\n\r\n    defb <tile_21>\r\n\r\n\r\n\r\n; Char 177 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_21>\r\n\r\n    defb <tile_21>\r\n\r\n\r\n\r\n; Char 178 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_21>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 179 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_21>\r\n\r\n\r\n\r\n    defb <tile_21>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 180 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_21>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 181 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_22>\r\n\r\n    defb <tile_22>\r\n\r\n\r\n    defb <tile_22>\r\n\r\n\r\n\r\n; Char 182 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_22>\r\n\r\n    defb <tile_22>\r\n\r\n\r\n\r\n; Char 183 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_22>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 184 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_22>\r\n\r\n\r\n\r\n    defb <tile_22>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 185 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_22>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 186 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_23>\r\n\r\n    defb <tile_23>\r\n\r\n\r\n    defb <tile_23>\r\n\r\n\r\n\r\n; Char 187 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_23>\r\n\r\n    defb <tile_23>\r\n\r\n\r\n\r\n; Char 188 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_23>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 189 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_23>\r\n\r\n\r\n\r\n    defb <tile_23>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 190 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_23>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 191 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_24>\r\n\r\n    defb <tile_24>\r\n\r\n\r\n    defb <tile_24>\r\n\r\n\r\n\r\n; Char 192 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_24>\r\n\r\n    defb <tile_24>\r\n\r\n\r\n\r\n; Char 193 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_24>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 194 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_24>\r\n\r\n\r\n\r\n    defb <tile_24>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 195 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_24>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 196 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_25>\r\n\r\n    defb <tile_25>\r\n\r\n\r\n    defb <tile_25>\r\n\r\n\r\n\r\n; Char 197 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_25>\r\n\r\n    defb <tile_25>\r\n\r\n\r\n\r\n; Char 198 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_25>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 199 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_25>\r\n\r\n\r\n\r\n    defb <tile_25>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 200 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_25>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n; Char 201 (21) WHITE\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_26>\r\n\r\n    defb <tile_26>\r\n\r\n\r\n    defb <tile_26>\r\n\r\n\r\n\r\n; Char 202 (22) CYAN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n    defb <tile_26>\r\n\r\n    defb <tile_26>\r\n\r\n\r\n\r\n; Char 203 (23) GREEN\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n    defb <tile_26>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 204 (24) YELLOW\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n    defb <tile_26>\r\n\r\n\r\n\r\n    defb <tile_26>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n; Char 205 (25) RED\r\n\tdefb\t0,0,0,0,0,0,0,0\r\n\r\n    defb <tile_26>\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n\r\n\r\n\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\tdefb\t@00000000\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/z88dk_sprites_definitions.h.template",
    "content": "#ifndef _Z88DK_SPRITES_DEFINITIONS\r\n#define _Z88DK_SPRITES_DEFINITIONS\r\n\r\n\r\n__asm\r\n\t._sprites\r\n\r\n; 0\r\n\tdefb    8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\t\r\n\r\n; 1\r\n\tdefb    8,8\r\n    defb <tile_10>\r\n\r\n\r\n; 2\r\n\tdefb    8,8\r\n    defb <tile_14>\r\n\r\n\r\n; 3\r\n\tdefb    8,8\t\r\n    defb <tile_11>\r\n\r\n; 4\r\n\tdefb 8,8\r\n    defb <tile_25>\r\n;\tdefb %\"--------\"\r\n;\tdefb %\"----#---\"\r\n;\tdefb %\"--#####-\"\r\n;\tdefb %\"--#-#---\"\r\n;\tdefb %\"--#####-\"\r\n;\tdefb %\"----#-#-\"\r\n;\tdefb %\"--#####-\"\r\n;\tdefb %\"----#---\"\r\n\r\n; 5\r\n\tdefb    8,8\r\n    defb <tile_17>\r\n\r\n; 6\r\n\tdefb    8,8\t\r\n    defb <tile_12>\r\n\r\n; 7\r\n\tdefb 8,8\r\n    defb <tile_7>\r\n\r\n; 8\r\n\tdefb 8,8\r\n    defb <tile_4>\r\n\r\n; 9\r\n\tdefb 8,8\r\n    defb <tile_5>\r\n\r\n; 10\r\n\tdefb 8,8\r\n    defb <tile_0>\r\n\r\n; 11\r\n\tdefb 8,8\r\n    defb <tile_13>\r\n\r\n; 12\r\n\tdefb 8,8\r\n    defb <tile_8>\r\n\r\n; 13\r\n\tdefb 8,8\r\n\tdefb <tile_26>\r\n\r\n; 14\r\n\tdefb 8,8\r\n    defb <tile_15>\r\n\r\n\r\n; 15\r\n\tdefb 8,8\r\n    defb <tile_16>\r\n\r\n; 16\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 17\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"--------\"\r\n\r\n; 18\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n; 19\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 20\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--------\"\r\n\r\n; 21\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 22\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 23\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n; 24\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 25\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 26\r\n\tdefb 8,8\r\n    defb <tile_19>\r\n\r\n; 27\r\n\tdefb 8,8\r\n    defb <tile_18>\r\n\r\n; 28\r\n\tdefb 8,8\r\n    defb <tile_1>\r\n\r\n; 29\r\n\tdefb 8,8\r\n    defb <tile_2>\r\n\r\n; 30\r\n\tdefb 8,8\r\n    defb <tile_3>\r\n\r\n; 31\r\n\tdefb 8,8\r\n    defb <tile_9>\r\n\r\n; 32\r\n\tdefb    8,8\r\n    defb <tile_20>\r\n\r\n; 33\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n    \r\n; 34\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 35\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 36\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--------\"\r\n\r\n; 37\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n; 38\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--------\"\r\n\r\n; 39\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#--###-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 40\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n; 41\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"--------\"\r\n\r\n; 42\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 43\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n; 44\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n; 45\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##--##-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n; 46\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n; 47\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 48\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--------\"\r\n\r\n; 49\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 50\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n; 51\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 52\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"#######-\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n; 53\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 54\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--------\"\r\n\r\n; 55\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"--------\"\r\n\r\n; 56\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n; 57\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"#-----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n; 58\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n; 59\r\n\tdefb 8,8\r\n    defb <tile_6>\r\n\r\n; 60\r\n\tdefb 8,8\r\n    defb <tile_21>\r\n\r\n; 61\r\n\tdefb 8,8\r\n    defb <tile_22>\r\n\r\n; 62\r\n\tdefb 8,8\r\n    defb <tile_23>\r\n\r\n; 63\r\n\tdefb 8,8\r\n    defb <tile_24>\r\n\r\n#if !defined(__FEWER_SPRITES)\r\n; 64\r\n\tdefb 8,8\r\n    defb %\"--------\"\r\n    defb %\"---###--\"\r\n    defb %\"--#---#-\"\r\n    defb %\"-####---\"\r\n    defb %\"--#-----\"\r\n    defb %\"--#-----\"\r\n    defb %\"-######-\"\r\n    defb %\"--------\"\r\n\r\n\r\n; 65\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 66\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 67\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--------\"\r\n\r\n; 68\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 69\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 70\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n; 71\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n; 72\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n; 73\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n; 74\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\r\n; 75\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"--------\"\r\n\r\n; 76\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"--------\"\r\n\r\n; 77\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-##-#---\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"--------\"\r\n\r\n; 78\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n; 79\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n; 80\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\r\n; 81\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----##-\"\r\n\r\n; 82\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--------\"\r\n\r\n; 83\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--------\"\r\n\r\n; 84\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"--------\"\r\n\r\n; 85\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n; 86\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n; 87\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--------\"\r\n\r\n; 88\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n; 89\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n; 90\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"--------\"\r\n\r\n; 91\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"----###-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----###-\"\r\n\tdefb %\"--------\"\r\n\r\n; 92\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--------\"\r\n\r\n; 93\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"--------\"\r\n\r\n; 94\r\n\tdefb 8,8\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#-#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\r\n; 95\r\n\tdefb 8,8\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n#endif\r\n\r\n\tdefb    8,8\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\tdefb %\"########\"\r\n\r\n\r\n__endasm;\r\n\r\n#endif // _Z88DK_SPRITES_DEFINITIONS\r\n\r\n"
  },
  {
    "path": "src/assets/templates/8x8/z88dk_xchase.asm.template",
    "content": "SECTION rodata_font\r\nSECTION rodata_font_8x8\r\n\r\nPUBLIC _udgs\r\nPUBLIC _udgs_end\r\n\r\n_udgs:\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\r\n; invincibility\r\ndefb <tile_10>\r\n\r\n; left missile\r\ndefb <tile_14>\r\n\r\n; bullet\r\ndefb <tile_11>\r\n\r\n; dollar\r\ndefb <tile_25>\r\n\r\n; power-up F\r\ndefb <tile_17> \r\n\r\n\r\n; vertical brick\r\ndefb <tile_12>\r\n\r\n\r\n; skull\r\ndefb <tile_7>\r\n\t \r\n\r\n; ghost\r\ndefb    <tile_4>\r\n \r\n\r\n; bomb\r\ndefb <tile_5>\r\n\r\n\r\n; player down\r\ndefb <tile_0>\r\n\r\n\r\n; horizontal brick\r\ndefb <tile_13>\r\n\r\n\r\n; power-up S\r\ndefb <tile_8>\r\n\r\ndefb <tile_26>\r\n\r\n; right missile\r\ndefb <tile_15>\r\n\r\n\r\n; rocket\r\ndefb <tile_16>\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\ndefb <tile_19> \r\n\r\n; power-up H\r\ndefb <tile_18> \r\n\r\n\r\n; player up\r\ndefb <tile_1>\r\n\r\n\r\n; player right\r\ndefb <tile_2>\r\n\r\n\r\n; player left\r\ndefb <tile_3>\r\n\r\n\r\n; gun\r\n    defb <tile_9>\r\n\r\n\r\ndefb <tile_20> \r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#--###-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--#####-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"-#--#---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##--##-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-##---#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"-#---##-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-#--#-\"\r\n\tdefb %\"-#--#-#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"------#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"#######-\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"-#-##-#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"#-----#-\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n; dead ghost\r\ndefb <tile_6> \r\n\r\ndefb <tile_21> \r\n\r\ndefb <tile_22> \r\n\r\ndefb <tile_23> \r\n\r\ndefb <tile_24> \r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-######-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--#---#-\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---##---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"---##---\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#--#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-##-#---\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"-#------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-----##-\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"---###--\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-#------\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"-####---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--###---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"-#-#-#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"-#---#--\"\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-----#--\"\r\n\tdefb %\"--###---\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"--#-----\"\r\n\tdefb %\"-#####--\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----###-\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--##----\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----###-\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"----#---\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"----##--\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"---#----\"\r\n\tdefb %\"-###----\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--------\"\r\n\tdefb %\"---#-#--\"\r\n\tdefb %\"--#-#---\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\tdefb %\"--------\"\r\n\r\n\tdefb %\"--####--\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#-#----#\"\r\n\tdefb %\"#--##--#\"\r\n\tdefb %\"-#----#-\"\r\n\tdefb %\"--####--\"\r\n\r\n_udgs_end:\r\n\r\n"
  },
  {
    "path": "src/assets/unit_tests/testAssets.py",
    "content": "import unittest\r\nimport sys\r\n\r\n\r\n\r\nsys.path.append(\"assets\")\r\n\r\nfrom generate_assets import *\r\n\r\n\r\n\r\nclass testAssets(unittest.TestCase):\r\n\r\n    COLOR1 = 0x55\r\n    COLOR2 = 0xAA\r\n    COLOR3 = 0xFF\r\n\r\n    def test_four_colored_1(self):\r\n        res = four_colored(0x1,testAssets.COLOR3)\r\n        self.assertEqual(res,0x03)\r\n\r\n    def test_four_colored_2(self):\r\n        res = four_colored(0x3,testAssets.COLOR3)\r\n        self.assertEqual(res,0x0F)\r\n\r\n    def test_four_colored_3(self):\r\n        res = four_colored(0x7,testAssets.COLOR3)\r\n        self.assertEqual(res,0x3F)\r\n\r\n    def test_four_colored_4(self):\r\n        res = four_colored(0xF,testAssets.COLOR3)\r\n        self.assertEqual(res,0xFF)\r\n\r\n    def test_four_colored_5(self):\r\n        res = four_colored(0x1,testAssets.COLOR2)\r\n        self.assertEqual(res,0x02)\r\n\r\n    def test_four_colored_6(self):\r\n        res = four_colored(0x3,testAssets.COLOR2)\r\n        self.assertEqual(res,0x0A)\r\n\r\n    def test_four_colored_7(self):\r\n        res = four_colored(0x7,testAssets.COLOR2)\r\n        self.assertEqual(res,0x2A)\r\n\r\n    def test_four_colored_8(self):\r\n        res = four_colored(0xF,testAssets.COLOR2)\r\n        self.assertEqual(res,0xAA)\r\n\r\n    def test_four_colored_9(self):\r\n        res = four_colored(0x1,testAssets.COLOR1)\r\n        self.assertEqual(res,0x01)\r\n\r\n    def test_four_colored_10(self):\r\n        res = four_colored(0x3,testAssets.COLOR1)\r\n        self.assertEqual(res,0x05)\r\n\r\n    def test_four_colored_11(self):\r\n        res = four_colored(0x7,testAssets.COLOR1)\r\n        self.assertEqual(res,0x15)\r\n\r\n    def test_four_colored_12(self):\r\n        res = four_colored(0xF,testAssets.COLOR1)\r\n        self.assertEqual(res,0x55)\r\n\r\n    def test_four_colored_13(self):\r\n        res = four_colored(0x2,testAssets.COLOR1)\r\n        self.assertEqual(res,0x04)\r\n\r\n    def test_four_colored_14(self):\r\n        res = four_colored(0x2,testAssets.COLOR2)\r\n        self.assertEqual(res,0x08)\r\n\r\n    def test_four_colored_15(self):\r\n        res = four_colored(0x2,testAssets.COLOR3)\r\n        self.assertEqual(res,0x0C)\r\n\r\n\r\n\r\n\r\nif __name__ == '__main__':\r\n    unittest.main()\r\n"
  },
  {
    "path": "src/config.ini",
    "content": "[build]\n\n# gnu_make name (usually \"make\" but \"gmake\" on FreeBSD\")\n# auto -> automatic heuristic detection\ngnu_make                = auto \n \n# Maximum number of threads to be used when building\ncompilation_threads     = auto \n\n# Parallel build of different projects (i.e. games/examples)\nparallelize_multi_build = 1 \n\nz88dk_compiler          = sccz80\n# sccz80\n# zsdcc\n# clang [experimental]\n\n# Z88DK common optimization options\nz88dk_compiler_opts     =\n#-compiler=sdcc -SO3 --max-allocs-per-node200000\n#-O3\n\n# SCCZ80-specific compiler options \nsccz80_compiler_opts    = -O3\n\n# ZSDCC-specific (Z88DK) optimization options for ZSDCC targets\nzsdcc_compiler_opts     = -SO3 --max-allocs-per-node200000\n# --opt-code-size -SO3 --max-allocs-per-node200000\n# -SO3 --max-allocs-per-node200000\n# --opt-code-size\n\n# CMOC optimization options\ncmoc_compiler_opts      = -O2 \n#--verbose\n#-fomit-frame-pointer\n\n# CC65 optimization options\ncc65_compiler_opts      = -Or -Cl\n\n# LCC1802 optimization options\nlcc1802_compiler_opts   = -v -O \"-Wf-volatile\" \"-Wp-D nofloats\" \"-Wf-mulcall\"\n\n# GCC for TI99/4A options\n# -O2\n# -O1\n# -Os\n# -fno-peephole2 -fno-function-cse\ngcc4ti99_compiler_opts  = -O2 -fno-peephole2 -fno-function-cse\n\n# VBCC options\nvbcc_compiler_opts      = -O1\n\n# ACK options\nack_compiler_opts       = -O6 \n\n# Native compiler options\nnative_compiler_opts    = -Wpedantic -Wall\n\n# Compiler use to build native builds\n# Remark: Under cygwin, gcc targets the cygwin environment and not Windows\nnative_compiler         = gcc\n\n# Flag to toggle tools when building\n# 0 -> targets won't use tools to create easy to use disk/tape/cartridge images so that raw or simpler binaries are produced \n# 1 -> targets that need tools will use tools to create easy to use disk/tape/cartridge images\nuse_tools               = 1 \n\n# Compiler to use for tools that are built by a C compiler\ntool_compiler           = gcc\n\n    \n[extend]\n    \n# How to approximate tiles with more rows \n# duplicate -> duplicate adjacent row\n# zero      -> add zero row(s)\nextend_algorithm        = duplicate\n\n# Location of generated non-8x8 pixel shapes\n# 0 -> write in _shapes directory, \n# 1 -> write in shapes directory but avoid overwriting existing shapes or tiles\nreplace_shapes          = 1\n\n\n[run]\n    \n# If empty, we assume the emulator path is in PATH environment variable\nvice_path               = \n\n# If empty, vice searches its default path (OS-dependent)\nvice_rom_path           = ../roms/vice/\n\n# If empty, we assume the emulator path is in the PATH environment variable\nmame_path               = \n#e.g., /cygdrive/c/Retro/Emulators/Mame0251/\n\n# If empty, mame searches the current directory (which should be wrong)\nmame_rom_path           = ../roms/mame/\n#e.g., 'c:\\\\Retro\\\\Emulators\\\\Mame0251\\\\roms\\\\'\n\n\n[terminal]\n\ncolor_terminal          = 1 \n\nverbose                 = 1 \n\nfast_test               = 0 \n\ninteractive_test        = 0 \n"
  },
  {
    "path": "src/cross_lib/boot/multi8/bootstrap.c",
    "content": "/*\n * Bootstrap program for loading larger programs in 64k mode\n * on the Mitsubishi Multi8\n *\n * zcc +multi8 bootstrap.c -create-app\n */\n\n#include <stdio.h>\n#include <arch/multi8.h>\n\n\nextern void start() @ 0x0000;\n\n#pragma define CRT_ENABLE_STDIO=0\n#pragma redirect fputc_cons=fputc_cons_native\n\nstatic void setup_memory_map() __naked\n{\n#asm\n\t; Here we need to switch to 64k RAM mode\n\t; We have no access to the display (unless we page it in)\n\tdi\n\tld\ta,@00100000\t;bit 5 set = RAM\n\t\t\t\t;bit 4 reset = RAM\n\tout\t($2a),a\n\tret\n#endasm\n}\n\nstatic void reset_memory_map() __naked\n{\n#asm\n\t; Here we need to switch to 64k RAM mode\n\t; We have no access to the display (unless we page it in)\n\tld\ta,@00010000\t;bit 5 set = RAM\n\t\t\t\t;bit 4 reset = RAM\n\tout\t($2a),a\n\tei\n\tret\n#endasm\n}\n\nstatic void write_string(char *str) __z88dk_fastcall \n{\n    while (*str)\n       fputc_cons(*str++);\n}\n\nint main() \n{\n    write_string(\"z88dk Multi8 bootstrap starting\\n\");\n    setup_memory_map();\n    if ( tape_load() == 0 ) {\n        start();\n    } else {\n        reset_memory_map();\n        write_string(\"Loading failed\\n\");\n    }\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20-16k.cfg",
    "content": "# Memory configuration for the VIC-20 with 32K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0000; \n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n    MAIN:     file = %O, define = yes, start = $120D, size = $4DF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20-24k.cfg",
    "content": "# Memory configuration for the VIC-20 with 32K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0400; # 1k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n    MAIN:     file = %O, define = yes, start = $120D, size = $6DF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20-3k.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0001; # 1k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $03FF, size = $0002;\n    HEADER:   file = %O,               start = $0401, size = $000C;\n    MAIN:     file = %O, define = yes, start = $040D, size = $1E00 - __MAIN_START__ - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20-8k.cfg",
    "content": "# Memory configuration for the VIC-20 with 32K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0010; \n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    SCREEN:   start =  $1000, size = $0200;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n    MAIN:     file = %O, define = yes, start = $120D, size = $2DF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20-8k_GFX_tight.cfg",
    "content": "# Memory configuration for the VIC-20 with 32K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0014; \n}\n\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    SCREEN:   start =  $1000, size = $0200;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n\tMAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1C00 - $120D - __STACKSIZE__;\n\tDUMMY:    file = %O,               start = $1C00 - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\n    CHARMEM:  file = %O, start = $1C00, size = $0200, type = rw,  define = yes, fill = yes;\n    RAM1: \t  file = %O, start = $1E00, size = $2200, type = rw;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = RAM1,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = RAM1,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\n\tCODE2:    load = MAIN,     type = ro;\n}\n\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20-8k_old_GFX.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0002; # 256 byte stack\n\t__GFX_START__: type = weak, value = $1C00;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    SCREEN:   start =  $1000, size = $0200;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n\tMAIN:     file = %O, define = yes, start = $120D, fill = yes, size = __GFX_START__ - $120D - __STACKSIZE__;\n\tDUMMY:    file = %O,               start = __GFX_START__ - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\n    CHARMEM:  file = %O, start = __GFX_START__, size = $0400, type = rw,  define = yes, fill = yes;\n    RAM1: \t  file = %O, start = $2000, size = $2000, type = rw;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = RAM1,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = RAM1,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\n\tCODE2:    load = MAIN,     type = ro;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20-8k_tight.cfg",
    "content": "# Memory configuration for the VIC-20 with 32K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0014; \n}\n\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    SCREEN:   start =  $1000, size = $0200;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n\tMAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1C00 - $120D - __STACKSIZE__;\n\tDUMMY:    file = %O,               start = $1C00 - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\n    CHARMEM:  file = %O, start = $1C00, size = $0200, type = rw,  define = yes, fill = yes;\n    RAM1: \t  file = %O, start = $1E00, size = $2200, type = rw;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = RAM1,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = RAM1,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\n\tCODE2:    load = MAIN,     type = ro;\n}\n\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/alt/vic20_unexpanded.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0001; # 1k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n    MAIN:     file = %O, define = yes, start = $100D, size = $0DF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/apple2-hgr.cfg",
    "content": "# Configuration for programs including a hires screen (with 6KB LOWCODE)\n\nFEATURES {\n    STARTADDRESS: default = $0803;\n}\nSYMBOLS {\n    __EXEHDR__:    type = import;\n    __FILETYPE__:  type = weak, value = $0006; # ProDOS file type\n    __STACKSIZE__: type = weak, value = $0200; # 0.5k stack\n    __HIMEM__:     type = weak, value = $9600; # Presumed RAM end\n    __LCADDR__:    type = weak, value = $D400; # Behind quit code\n    __LCSIZE__:    type = weak, value = $0C00; # Rest of bank two\n}\nMEMORY {\n    ZP:     file = \"\", define = yes, start = $0080,        size = $001A;\n    HEADER: file = %O,               start = %S - $003A,   size = $003A;\n    MAIN:   file = %O, define = yes, start = %S,           size = __HIMEM__ - %S;\n    BSS:    file = \"\",               start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;\n    LC:     file = \"\", define = yes, start = __LCADDR__,   size = __LCSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    EXEHDR:   load = HEADER,         type = ro,  optional = yes;\n    STARTUP:  load = MAIN,           type = ro;\n    LOWCODE:  load = MAIN,           type = ro,  optional = yes;\n    HGR:      load = MAIN,           type = rw,  start    = $2000;\n    CODE:     load = MAIN,           type = ro   start    = $4000;\n    RODATA:   load = MAIN,           type = ro;\n    DATA:     load = MAIN,           type = rw;\n    INIT:     load = MAIN,           type = rw;\n    ONCE:     load = MAIN,           type = ro,  define   = yes;\n    LC:       load = MAIN, run = LC, type = ro,  optional = yes;\n    BSS:      load = BSS,            type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/apple2enh-hgr.cfg",
    "content": "# Configuration for programs including a hires screen (with 6KB LOWCODE)\n\nFEATURES {\n    STARTADDRESS: default = $0803;\n}\nSYMBOLS {\n    __EXEHDR__:    type = import;\n    __FILETYPE__:  type = weak, value = $0006; # ProDOS file type\n    __STACKSIZE__: type = weak, value = $0200; # 0.5k stack\n    __HIMEM__:     type = weak, value = $9600; # Presumed RAM end\n    __LCADDR__:    type = weak, value = $D400; # Behind quit code\n    __LCSIZE__:    type = weak, value = $0C00; # Rest of bank two\n}\nMEMORY {\n    ZP:     file = \"\", define = yes, start = $0080,        size = $001A;\n    HEADER: file = %O,               start = %S - $003A,   size = $003A;\n    MAIN:   file = %O, define = yes, start = %S,           size = __HIMEM__ - %S;\n    BSS:    file = \"\",               start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;\n    LC:     file = \"\", define = yes, start = __LCADDR__,   size = __LCSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    EXEHDR:   load = HEADER,         type = ro,  optional = yes;\n    STARTUP:  load = MAIN,           type = ro;\n    LOWCODE:  load = MAIN,           type = ro,  optional = yes;\n    HGR:      load = MAIN,           type = rw,  start    = $2000;\n    CODE:     load = MAIN,           type = ro   start    = $4000;\n    RODATA:   load = MAIN,           type = ro;\n    DATA:     load = MAIN,           type = rw;\n    INIT:     load = MAIN,           type = rw;\n    ONCE:     load = MAIN,           type = ro,  define   = yes;\n    LC:       load = MAIN, run = LC, type = ro,  optional = yes;\n    BSS:      load = BSS,            type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/atari5200_redefined_chars.cfg",
    "content": "SYMBOLS {\n    __CARTSIZE__:        type = weak,   value = $4000;   # possible values: $4000 and $8000\n    __CART_ENTRY__:      type = import;\n    __STACKSIZE__:       type = weak,   value = $0400;   # 4 pages stack\n    __RESERVED_MEMORY__: type = export, value = $01E0;   # space for 20x24 screen buffer (default display list is in ROM)\n}\nMEMORY {\n    ZP:        file = \"\", start = $001D,                size = $00E3,                                               define = yes;\n    RAM:       file = \"\", start = $021C,                size = $4000 - $0200 - __STACKSIZE__ - __RESERVED_MEMORY__ - $021C, define = yes;\n\tFONT:      file = \"\", start = $3800, \t\t\t\tsize = $0400, define = yes;\n    ROM:       file = %O, start = $C000 - __CARTSIZE__, size = __CARTSIZE__ - $18,                                  define = yes, fill = yes, fillval = $FF;\n    CARTNAME:  file = %O, start = $BFE8,                size = $0014                                                              fill = yes, fillval = $40;\n    CARTYEAR:  file = %O, start = $BFFC,                size = $0002                                                              fill = yes, fillval = $59;\n    CARTENTRY: file = %O, start = $BFFE,                size = $0002;\n}\nSEGMENTS {\n    ZEROPAGE:  load = ZP,             type = zp,                optional = yes;\n    EXTZP:     load = ZP,             type = zp,                optional = yes;\n    DLIST:     load = ROM  ,          type = ro,  define = yes, optional = yes;\n    STARTUP:   load = ROM,            type = ro,  define = yes, optional = yes;\n    LOWCODE:   load = ROM,            type = ro,  define = yes, optional = yes;\n    ONCE:      load = ROM,            type = ro,                optional = yes;\n    CODE:      load = ROM,            type = ro,  define = yes;\n    RODATA:    load = ROM,            type = ro,                optional = yes;\n    DATA:      load = ROM, run = RAM, type = rw,  define = yes, optional = yes;\n    BSS:       load = RAM,            type = bss, define = yes, optional = yes;\n    CARTNAME:  load = CARTNAME,       type = ro;\n    CARTYEAR:  load = CARTYEAR,       type = ro;\n    CARTENTRY: load = CARTENTRY,      type = ro;\n\tFONT:      load = FONT,           type = rw,  optional = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/atari5200_redefined_chars_32k.cfg",
    "content": "SYMBOLS {\n    __CARTSIZE__:        type = weak,   value = $8000;   # possible values: $4000 and $8000\n    __CART_ENTRY__:      type = import;\n    __STACKSIZE__:       type = weak,   value = $0400;   # 4 pages stack\n    __RESERVED_MEMORY__: type = export, value = $01E0;   # space for 20x24 screen buffer (default display list is in ROM)\n}\nMEMORY {\n    ZP:        file = \"\", start = $001D,                size = $00E3,                                               define = yes;\n    RAM:       file = \"\", start = $021C,                size = $4000 - $0200 - __STACKSIZE__ - __RESERVED_MEMORY__ - $021C, define = yes;\n\tFONT:      file = \"\", start = $3800, \t\t\t\tsize = $0400, define = yes;\n    ROM:       file = %O, start = $C000 - __CARTSIZE__, size = __CARTSIZE__ - $18,                                  define = yes, fill = yes, fillval = $FF;\n    CARTNAME:  file = %O, start = $BFE8,                size = $0014                                                              fill = yes, fillval = $40;\n    CARTYEAR:  file = %O, start = $BFFC,                size = $0002                                                              fill = yes, fillval = $59;\n    CARTENTRY: file = %O, start = $BFFE,                size = $0002;\n}\nSEGMENTS {\n    ZEROPAGE:  load = ZP,             type = zp,                optional = yes;\n    EXTZP:     load = ZP,             type = zp,                optional = yes;\n    DLIST:     load = ROM  ,          type = ro,  define = yes, optional = yes;\n    STARTUP:   load = ROM,            type = ro,  define = yes, optional = yes;\n    LOWCODE:   load = ROM,            type = ro,  define = yes, optional = yes;\n    ONCE:      load = ROM,            type = ro,                optional = yes;\n    CODE:      load = ROM,            type = ro,  define = yes;\n    RODATA:    load = ROM,            type = ro,                optional = yes;\n    DATA:      load = ROM, run = RAM, type = rw,  define = yes, optional = yes;\n    BSS:       load = RAM,            type = bss, define = yes, optional = yes;\n    CARTNAME:  load = CARTNAME,       type = ro;\n    CARTYEAR:  load = CARTYEAR,       type = ro;\n    CARTENTRY: load = CARTENTRY,      type = ro;\n\tFONT:      load = FONT,           type = rw,  optional = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/atari7800_more_ram.cfg",
    "content": "# Atari VCS 7800 linker configuration file for cc65\n# In order to add the a78 header to the build you can add\n# \"--force-import __EXEHDR__\" to the command line\n\nSYMBOLS {\n    __STACKSIZE__:        type = weak, value = $0600; # C stack\n    __CARTSIZE__:         type = weak, value = $8000;\n    __VEC_BOTTOM__:       value = $fffa, type = export;\n    __VEC_SIZE__:         value = $6, type = export;\n    __ENCRYPT_BOTTOM__:   value = $ff7a, type = export;\n    __ENCRYPT_SIZE__:     value = $80, type = export;\n    __MEMORY_TOP__:       value = __ENCRYPT_BOTTOM__, type = export;\n    __INIT_SIZE__:        value = 156, type = export;\n    __MEMORY_INIT__:      value = __MEMORY_TOP__ - __INIT_SIZE__, type = export;\n    __MEMORY_BOTTOM__:    value = $10000 - __CARTSIZE__, type = weak;\n    __FREE_ROM_SIZE__:    value = __MEMORY_INIT__ - __MEMORY_BOTTOM__, type = export;\n}\n\nMEMORY {\n    ZP:     file = \"\", define = yes, start = $0040, size = $00C0, type = rw;\n    SP:     file = \"\", define = yes, start = $0140, size = $00C0, type = rw;\n    RAM1:   file = \"\", define = yes, start = $1800, size = $0840, type = rw;\n    RAM3:   file = \"\", define = yes, start = $2100, size = $0040, type = rw;\n    RAM2:   file = \"\", define = yes, start = $2200, size = $0600, type = rw;\n    # For emulators you also need a header file\n    HEADER: file = %O, start = $0000, size = 128;\n    # \"Normal\" cartridge rom. Multiple banks arent supported\n    # by this script. You may change the rom size, but keep\n    # two things in mind:\n    # - start must be a multiple of $1000\n    # - ROM must end at $ff79\n    ROM:    file = %O, define = yes, start = __MEMORY_BOTTOM__, size = __FREE_ROM_SIZE__, type = ro, fill = yes, fillval = $ff;\n    ROMS:   file = %O, define = yes, start = __MEMORY_INIT__, size = __INIT_SIZE__, type = ro, fill = yes, fillval = $ff;\n    # Encryption stuff\n    ROME:   file = %O, start = __ENCRYPT_BOTTOM__, size = __ENCRYPT_SIZE__, type = ro, fill = yes, fillval = $ff;\n    # Interrupt vectors\n    ROMV:   file = %O, start = __VEC_BOTTOM__, size = __VEC_SIZE__, type = ro, fill = yes, fillval = $ff;\n}\n\nSEGMENTS {\n    ZEROPAGE:   load = ZP,              type = zp;\n    EXTZP:      load = ZP,              type = zp;\n    EXEHDR:     load = HEADER,          type = ro,  optional = yes;\n    STARTUP:    load = ROMS,            type = ro,  define = yes;\n    ONCE:       load = ROMS,            type = ro,  define = yes;\n    CODE:       load = ROM,             type = ro,  define = yes;\n    RODATA:     load = ROM,             type = ro,  define = yes, align = 256;\n    DATA:       load = ROM, run = RAM2, type = rw,  define = yes;\n    BSS:        load = RAM1,            type = bss, define = yes;\n    VECTORS:    load = ROMV,            type = ro,  define = yes;\n    ENCRYPTION: load = ROME,            type = ro   define = yes;\n}\n\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/atari_mode12.cfg",
    "content": "FEATURES {\n    STARTADDRESS: default = $2000;\n}\nSYMBOLS {\n    __EXEHDR__:          type = import;\n    __SYSTEM_CHECK__:    type = import;  # force inclusion of \"system check\" load chunk\n    __AUTOSTART__:       type = import;  # force inclusion of autostart \"trailer\"\n    __STACKSIZE__:       type = weak, value = $0800; # 2k stack\n    __STARTADDRESS__:    type = export, value = %S;\n#    __RESERVED_MEMORY__: type = weak, value = $00A2;\n}\nMEMORY {\n    ZP:         file = \"\", define = yes, start = $0082, size = $007E;\n\n# file header, just $FFFF\n    HEADER:     file = %O,               start = $0000, size = $0002;\n\n# \"system check\" load chunk\n    SYSCHKHDR:  file = %O,               start = $0000, size = $0004;\n    SYSCHKCHNK: file = %O,               start = $2E00, size = $0300;\n    SYSCHKTRL:  file = %O,               start = $0000, size = $0006;\n\n# \"main program\" load chunk\n    MAINHDR:    file = %O,               start = $0000, size = $0004;\n    MAIN:       file = %O, define = yes, start = %S,    size = $BC20 - __STACKSIZE__ - __RESERVED_MEMORY__ - %S;\n    TRAILER:    file = %O,               start = $0000, size = $0006;\n}\nSEGMENTS {\n    ZEROPAGE:  load = ZP,         type = zp;\n    EXTZP:     load = ZP,         type = zp,                optional = yes;\n    EXEHDR:    load = HEADER,     type = ro;\n    SYSCHKHDR: load = SYSCHKHDR,  type = ro,                optional = yes;\n    SYSCHK:    load = SYSCHKCHNK, type = rw,  define = yes, optional = yes;\n    SYSCHKTRL: load = SYSCHKTRL,  type = ro,                optional = yes;\n    MAINHDR:   load = MAINHDR,    type = ro;\n    STARTUP:   load = MAIN,       type = ro,  define = yes;\n    LOWCODE:   load = MAIN,       type = ro,  define = yes, optional = yes;\n    ONCE:      load = MAIN,       type = ro,                optional = yes;\n    CODE:      load = MAIN,       type = ro,  define = yes;\n    RODATA:    load = MAIN,       type = ro;\n    DATA:      load = MAIN,       type = rw;\n    INIT:      load = MAIN,       type = rw,                optional = yes;\n    BSS:       load = MAIN,       type = bss, define = yes;\n    AUTOSTRT:  load = TRAILER,    type = ro;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/atari_mode1_redefined_chars.cfg",
    "content": "FEATURES {\n    STARTADDRESS: default = $2000;\n}\nSYMBOLS {\n    __EXEHDR__:          type = import;\n    __SYSTEM_CHECK__:    type = import;  # force inclusion of \"system check\" load chunk\n    __AUTOSTART__:       type = import;  # force inclusion of autostart \"trailer\"\n    __STACKSIZE__:       type = weak, value = $0800; # 2k stack\n    __STARTADDRESS__:    type = export, value = %S;\n    __RESERVED_MEMORY__: type = weak, value = $0000;\n}\nMEMORY {\n    ZP:         file = \"\", define = yes, start = $0082, size = $007E;\n\n# file header, just $FFFF\n    HEADER:     file = %O,               start = $0000, size = $0002;\n\n# \"system check\" load chunk\n    SYSCHKHDR:  file = %O,               start = $0000, size = $0004;\n    SYSCHKCHNK: file = %O,               start = $2E00, size = $0300;\n    SYSCHKTRL:  file = %O,               start = $0000, size = $0006;\n\n# \"main program\" load chunk\n    MAINHDR:    file = %O,               start = $0000, size = $0004;\n    MAIN:       file = %O, define = yes, start = %S + $0200,    size = $BC20 - __STACKSIZE__ - __RESERVED_MEMORY__ - %S - $0200;\n    TRAILER:    file = %O,               start = $0000, size = $0006;\n\n# font area\n    FONT:       file = \"\", define = yes, start = %S,    size = $0200;\n\t\n}\nSEGMENTS {\n    ZEROPAGE:  load = ZP,         type = zp;\n    EXTZP:     load = ZP,         type = zp,                optional = yes;\n    EXEHDR:    load = HEADER,     type = ro;\n    SYSCHKHDR: load = SYSCHKHDR,  type = ro,                optional = yes;\n    SYSCHK:    load = SYSCHKCHNK, type = rw,  define = yes, optional = yes;\n    SYSCHKTRL: load = SYSCHKTRL,  type = ro,                optional = yes;\n    MAINHDR:   load = MAINHDR,    type = ro;\n    STARTUP:   load = MAIN,       type = ro,  define = yes;\n    LOWCODE:   load = MAIN,       type = ro,  define = yes, optional = yes;\n    ONCE:      load = MAIN,       type = ro,                optional = yes;\n    CODE:      load = MAIN,       type = ro,  define = yes;\n    RODATA:    load = MAIN,       type = ro;\n    DATA:      load = MAIN,       type = rw;\n    INIT:      load = MAIN,       type = rw,  define = yes, optional = yes;\n    BSS:       load = MAIN,       type = bss, define = yes;\n    AUTOSTRT:  load = TRAILER,    type = ro;\n\tFONT:      load = FONT,       type = rw,                optional = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/atarixl_mode12.cfg",
    "content": "FEATURES {\n    STARTADDRESS: default = $2400;\n}\nSYMBOLS {\n    __EXEHDR__:       type = import;\n    __SYSTEM_CHECK__: type = import;  # force inclusion of \"system check\" load chunk\n    __AUTOSTART__:    type = import;  # force inclusion of autostart \"trailer\"\n    __STACKSIZE__:    type = weak, value = $0800; # 2k stack\n    __STARTADDRESS__: type = export, value = %S;\n}\nMEMORY {\n    ZP:          file = \"\", define = yes, start = $0082,                size = $007E;\n\n# just $FFFF\n    HEADER:      file = %O,               start = $0000,                size = $0002;\n\n# \"system check\" load chunk\n    SYSCHKHDR:   file = %O,               start = $0000,                size = $0004;\n    SYSCHKCHNK:  file = %O,               start = $2E00,                size = $0300;\n    SYSCHKTRL:   file = %O,               start = $0000,                size = $0006;\n\n# \"shadow RAM preparation\" load chunk\n    SRPREPHDR:   file = %O,               start = $0000,                size = $0004;\n    SRPREPCHNK:  file = %O, define = yes, start = %S,                   size = $7C20 - %S - $07FF;  # $07FF: space for temp. chargen buffer, 1K aligned\n    SRPREPTRL:   file = %O,               start = $0000,                size = $0006;\n\n# \"main program\" load chunk\n    MAINHDR:     file = %O,               start = $0000,                size = $0004;\n    MAIN:        file = %O, define = yes, start = %S + __LOWBSS_SIZE__, size = $D000 - __STACKSIZE__ - %S - __LOWBSS_SIZE__;\n\n# defines entry point into program\n    TRAILER:     file = %O,               start = $0000,                size = $0006;\n\n# memory beneath the ROM preceeding the character generator\n    HIDDEN_RAM2: file = \"\", define = yes, start = $D800,                size = $0800;\n\n# address of relocated character generator (same addess as ROM version)\n    CHARGEN:     file = \"\", define = yes, start = $E000,                size = $0400;\n\n# memory beneath the ROM\n    HIDDEN_RAM:  file = \"\", define = yes, start = $E400,                size = $FFFA - $E400;\n}\nSEGMENTS {\n    ZEROPAGE:    load = ZP,                            type = zp;\n    EXTZP:       load = ZP,                            type = zp,                optional = yes;\n\n    EXEHDR:      load = HEADER,                        type = ro;\n\n    SYSCHKHDR:   load = SYSCHKHDR,                     type = ro,                optional = yes;\n    SYSCHK:      load = SYSCHKCHNK,                    type = rw,  define = yes, optional = yes;\n    SYSCHKTRL:   load = SYSCHKTRL,                     type = ro,                optional = yes;\n\n    SRPREPHDR:   load = SRPREPHDR,                     type = ro;\n    LOWBSS:      load = SRPREPCHNK,                    type = bss, define = yes;  # shared btw. SRPREPCHNK and RAM, not zero initialized\n    SRPREP:      load = SRPREPCHNK,                    type = rw,  define = yes;\n    SHADOW_RAM:  load = SRPREPCHNK, run = HIDDEN_RAM,  type = rw,  define = yes, optional = yes;\n    SHADOW_RAM2: load = SRPREPCHNK, run = HIDDEN_RAM2, type = rw,  define = yes, optional = yes;\n    SRPREPTRL:   load = SRPREPTRL,                     type = ro;\n\n    MAINHDR:     load = MAINHDR,                       type = ro;\n    STARTUP:     load = MAIN,                          type = ro,  define = yes;\n    LOWCODE:     load = MAIN,                          type = ro,  define = yes, optional = yes;\n    ONCE:        load = MAIN,                          type = ro,                optional = yes;\n    CODE:        load = MAIN,                          type = ro,  define = yes;\n    RODATA:      load = MAIN,                          type = ro;\n    DATA:        load = MAIN,                          type = rw;\n    INIT:        load = MAIN,                          type = rw,                optional = yes;\n    BSS:         load = MAIN,                          type = bss, define = yes;\n    AUTOSTRT:    load = TRAILER,                       type = ro;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/atmos_better_tap.cfg",
    "content": "# Fichier de configuration gnrant un fichier TAP.\n# Le programme est assemble  partir de l'adresse __BASHEAD__ $500 (1280)\n# La compilation donne un nom a la cassette __TAPNAME__\n# Cette compilation n'integre pas la librairie __BASHDR__ demandee en standard\n\nSYMBOLS {\n    __TAPEHDR__:   type = import;\n    __PROGFLAG__:  type = weak, value = $80; # $00=BASIC, $80=machine code\n    __AUTORUN__:   type = weak, value = $C7; # $00=only load, $C7=run\n    __STACKSIZE__: type = weak, value = $0020; # 2K stack\n    __GRAB__:      type = weak, value = 1; # 0=don't grab graphics RAM, 1=grab graphics RAM\n    __RAMEND__:    type = weak, value = $9800 + $1C00 * __GRAB__;\n    # __TAPNAME__:   value = \"CC65\"; # Definition du nom du fichier TAP\n}\nMEMORY {\n    ZP:      file = \"\", define = yes, start = $00E2,            size = $001A;\n    TAPEHDR: file = %O, type   = ro,  start = $0000,            size = $001F;\n    BASHEAD: file = %O, define = yes, start = $0500,            size = $000D;\n    MAIN:    file = %O, define = yes, start = __BASHEAD_LAST__, size = __RAMEND__ - __MAIN_START__;\n    BSS:     file = \"\",               start = __ONCE_RUN__,     size = __RAMEND__ - __STACKSIZE__ - __ONCE_RUN__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,      type = zp;\n    TAPEHDR:  load = TAPEHDR, type = ro;\n    STARTUP:  load = MAIN,    type = ro;\n    LOWCODE:  load = MAIN,    type = ro,  optional = yes;\n    CODE:     load = MAIN,    type = ro;\n    RODATA:   load = MAIN,    type = ro;\n    DATA:     load = MAIN,    type = rw;\n    INIT:     load = MAIN,    type = rw;\n    ONCE:     load = MAIN,    type = ro,  define   = yes;\n    BASTAIL:  load = MAIN,    type = ro,  optional = yes;\n    BSS:      load = BSS,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-16k.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0020; # 2k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0008, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n    MAIN:     file = %O,               start = $100D, size = $2FF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-16k_GFX.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0040; \n\t__UDC_START__: type = weak, value = $3DF8;\n\t__MAIN_START__: type = weak, value = __UDC_START__ - $100D;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n    MAIN:     file = %O,               start = $100D, size = __MAIN_START__ - __STACKSIZE__, fill = yes;\n    DUMMY:    file = %O,               start = __UDC_START__ - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\t\n    CHARMEM:  file = %O, define = yes, start = __UDC_START__, size = $01F8, type = rw;\t\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\t\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-16k_GFX_64chars.cfg",
    "content": "SYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0048; \r\n    __UDC_START__: type = weak, value = $3DD0;\r\n    __MAINSIZE__: type = weak, value = __UDC_START__ - $100D;\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\r\n    HEADER:   file = %O,               start = $1001, size = $000C;\r\n    MAIN:     file = %O,               start = $100D, size = __MAINSIZE__ - __STACKSIZE__, fill = yes;\r\n    DUMMY:    file = %O,               start = __UDC_START__ - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\t\r\n    CHARMEM:  file = %O, define = yes, start = __UDC_START__, size = $0200, type = rw;\t\r\n}\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = MAIN,     type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = MAIN,     type = bss, define   = yes;\r\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\t\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-16k_GFX_64chars_stack_0x30.cfg",
    "content": "SYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; \r\n    __UDC_START__: type = weak, value = $3DD0;\r\n    __MAINSIZE__: type = weak, value = __UDC_START__ - $100D;\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\r\n    TAPEBUF:    file = \"\", define = yes, start = $0333, size = $0100;\r\n    HEADER:   file = %O,               start = $1001, size = $000C;\r\n    MAIN:     file = %O,               start = $100D, size = __MAINSIZE__, fill = yes;\r\n    CHARMEM:  file = %O, define = yes, start = __UDC_START__, size = $0200, type = rw;\t\r\n}\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = MAIN,     type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = TAPEBUF,  type = bss;\r\n    BSS:      load = MAIN,     type = bss, define   = yes;\r\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\t\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-16k_GFX_64chars_stack_0x30_less_hd_stack.cfg",
    "content": "SYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; \r\n    __UDC_START__: type = weak, value = $3DD0;\r\n    __MAINSIZE__: type = weak, value = __UDC_START__ - $100D;\r\n}\r\nMEMORY {\r\n    ZP:         file = \"\", define = yes, start = $0002, size = $001A;\r\n    LOWHDSTACK: file = \"\", define = yes, start = $0100, size = $00B0;\r\n    TAPEBUF:    file = \"\", define = yes, start = $0333, size = $0100;\r\n    LOADADDR:   file = %O,               start = $0FFF, size = $0002;\r\n    HEADER:     file = %O,               start = $1001, size = $000C;\r\n    MAIN:       file = %O,               start = $100D, size = __MAINSIZE__, fill = yes;\r\n    CHARMEM:    file = %O, define = yes, start = __UDC_START__, size = $0200, type = rw;\t\r\n}\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,         type = zp;\r\n    LOADADDR: load = LOADADDR,   type = ro;\r\n    EXEHDR:   load = HEADER,     type = ro;\r\n    STARTUP:  load = MAIN,       type = ro;\r\n    LOWCODE:  load = MAIN,       type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,       type = ro,  optional = yes;\r\n    CODE:     load = MAIN,       type = ro;\r\n    RODATA:   load = MAIN,       type = ro;\r\n    DATA:     load = MAIN,       type = rw;\r\n    INIT:     load = TAPEBUF,    type = bss;\r\n    BSS:      load = LOWHDSTACK, type = bss, define   = yes;\r\n    UDCCHAR:  load = CHARMEM,    type = ro, define = yes, optional = no;\t\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-32k.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0028; \n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n    MAIN:     file = %O,               start = $100D, size = $4FF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-32k_GFX.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0040; \n\t__UDC_START__: type = weak, value = $5E08;\n\t__MAIN_START__: type = weak, value = __UDC_START__ - $100D;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n    MAIN:     file = %O,               start = $100D, size = __MAIN_START__ - __STACKSIZE__, fill = yes;\n    DUMMY:    file = %O,               start = __UDC_START__ - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\t\n    CHARMEM:  file = %O, define = yes, start = __UDC_START__, size = $01F8, type = rw;\t\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\t\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c16-32k_GFX_64chars.cfg",
    "content": "SYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0100; \r\n    __UDC_START__: type = weak, value = $5DE0;\r\n    __MAINSIZE__: type = weak, value = __UDC_START__ - $100D;\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\r\n    HEADER:   file = %O,               start = $1001, size = $000C;\r\n    MAIN:     file = %O,               start = $100D, size = __MAINSIZE__, fill = yes;\r\n    CHARMEM:  file = %O, define = yes, start = __UDC_START__, size = $0200, type = rw;\t\r\n}\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = MAIN,     type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = MAIN,     type = bss, define   = yes;\r\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\t\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/c64_GFXat0xC000.cfg",
    "content": "FEATURES {\n    STARTADDRESS: default = $0801;\n}\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0800; # 2k stack\n    __HIMEM__:     type = weak, value = $D000;\n\t__GFXSTART__:  type = weak, value = $C800;\n\t__GFXSIZE__:   type = weak, value = $02F0;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002,           size = $001A;\n    LOADADDR: file = %O,               start = $7FF,          size = $0002;\n    HEADER:   file = %O, define = yes, start = $801,              size = $000D;\n    MAIN:     file = %O, define = yes, start = __HEADER_LAST__, fill = yes, size = __GFXSTART__ - __HEADER_SIZE__ - __STACKSIZE__;\n    GFX:      start = __GFXSTART__, size = __GFXSIZE__, type = rw, file = %O, fill = yes, define = yes;\n    BSS:      file = \"\", start = __ONCE_RUN__,    size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = rw;\n    ONCE:     load = MAIN,     type = ro,  define   = yes;\n    GFX:      load = GFX,      type = rw;\n    BSS:      load = BSS,      type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-16k.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0060;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $00E0;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n    ROM: file = %O, define = yes, start = $8000, size = $4000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-16k_2.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0020;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $00E0;\n    RAM0: file = \"\", define = yes, start = $0100, size = $A0;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n    ROM: file = %O, define = yes, start = $8000, size = $4000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-16k_less_stack.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $001E;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $00E0;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n    ROM: file = %O, define = yes, start = $8000, size = $4000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-18k.cfg",
    "content": "SYMBOLS {\r\n    __STACKSIZE__: type = weak, value = $0036;\r\n}\r\nMEMORY {\r\n    ZP:  file = \"\", define = yes, start = $0020, size = $00E0;\r\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\r\n\tROM: file = %O, define = yes, start = $7800, size = $4800, fill = yes, fillval = $FF;\r\n}\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,             type = zp;\r\n    ZP:       load = ZP,             type = zp,                optional = yes;\r\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\r\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\r\n    BSS:      load = RAM,            type = bss, define = yes;\r\n    ONCE:     load = ROM,            type = ro,                optional = yes;\r\n    CODE:     load = ROM,            type = ro;\r\n    INIT:     load = ROM,            type = ro;\r\n    RODATA:   load = ROM,            type = ro;\r\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\r\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = INIT;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-24k.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0020;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $0020;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n\tROM: file = %O, define = yes, start = $6000, size = $6000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-32k.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0036;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $0020;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n\tROM: file = %O, define = yes, start = $4000, size = $8000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-32k_alt.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0020;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $0020;\n\tEXTRA: file = \"\", define = yes, start = $0100, size = $0080;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n\tROM: file = %O, define = yes, start = $4000, size = $8000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = EXTRA, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-8k.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0100;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $00E0;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n    ROM: file = %O, define = yes, start = $A000, size = $2000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/creativision-8k_less_stack.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0018;\n}\nMEMORY {\n    ZP:  file = \"\", define = yes, start = $0020, size = $00E0;\n    RAM: file = \"\", define = yes, start = $01FA, size = $0206 - __STACKSIZE__;\n    ROM: file = %O, define = yes, start = $A000, size = $2000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp;\n    ZP:       load = ZP,             type = zp,                optional = yes;\n    VECTORS:  load = ROM, run = RAM, type = rw,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes,                 start = $0204;\n    BSS:      load = RAM,            type = bss, define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro;\n    INIT:     load = ROM,            type = ro;\n    RODATA:   load = ROM,            type = ro;\n    AUDIO:    load = ROM,            type = ro,                optional = yes, start = $BF00;\n    SETUP:    load = ROM,            type = ro,                                start = $BFE8;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = INIT;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/gamate_reduced_stack.cfg",
    "content": "# linker config to produce simple Gamate cartridge (.bin)\n\nSYMBOLS {\n    __STARTUP__:   type = import;\n    __STACKSIZE__: type = weak, value = $0020; # 1 page stack\n}\n\nMEMORY {\n    # 0000-03ff is RAM\n    # FIXME: what zp range can we actually use?\n    # $0a-$11 is used by IRQ/NMI, $e8 is used by NMI\n    ZP:        start = $0012,        size = $00E8 - $0012;\n    CPUSTACK:  start = $0100,        size = $0100;\n    RAM:       start = $0200,        size = $0200 - __STACKSIZE__, define = yes;\n\n    CARTHEADER: file = %O, define = yes, start = %S, size = $0029;\n    # 6000-e000 can be (Cartridge) ROM\n    # WARNING: fill value must be $00 else it will no more work\n    #ROM:     start = $6000,         size = $1000,         fill = yes, fillval = $00, file = %O, define = yes;\n    #ROMFILL: start = $7000,         size = $7000,         fill = yes, fillval = $00, file = %O, define = yes;\n    # for images that have code >$6fff we must calculate the checksum!\n    ROM:      start = $6000 + $0029, size = $8000 - $0029, fill = yes, fillval = $00, file = %O, define = yes;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp,  define = yes;\n    EXTZP:    load = ZP,             type = zp,  define = yes, optional = yes;\n    APPZP:    load = ZP,             type = zp,  define = yes, optional = yes;\n    STARTUP:  load = CARTHEADER,     type = ro,  define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro,  define = yes;\n    RODATA:   load = ROM,            type = ro,  define = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define = yes;\n    BSS:      load = RAM,            type = bss, define = yes;\n}\n\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/gamate_reduced_stack_2.cfg",
    "content": "# linker config to produce simple Gamate cartridge (.bin)\n\nSYMBOLS {\n    __STARTUP__:   type = import;\n    __STACKSIZE__: type = weak, value = $0020; # 1 page stack\n}\n\nMEMORY {\n    # 0000-03ff is RAM\n    # FIXME: what zp range can we actually use?\n    # $0a-$11 is used by IRQ/NMI, $e8 is used by NMI\n    ZP:        start = $0012,        size = $00E8 - $0012;\n    LOWCPUSTACK:  start = $0100,        size = $0080;\n    CPUSTACK:  start = $0180,        size = $0080;\n    RAM:       start = $0200,        size = $0200 - __STACKSIZE__, define = yes;\n\n    CARTHEADER: file = %O, define = yes, start = %S, size = $0029;\n    # 6000-e000 can be (Cartridge) ROM\n    # WARNING: fill value must be $00 else it will no more work\n    #ROM:     start = $6000,         size = $1000,         fill = yes, fillval = $00, file = %O, define = yes;\n    #ROMFILL: start = $7000,         size = $7000,         fill = yes, fillval = $00, file = %O, define = yes;\n    # for images that have code >$6fff we must calculate the checksum!\n    ROM:      start = $6000 + $0029, size = $8000 - $0029, fill = yes, fillval = $00, file = %O, define = yes;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp,  define = yes;\n    EXTZP:    load = ZP,             type = zp,  define = yes, optional = yes;\n    APPZP:    load = ZP,             type = zp,  define = yes, optional = yes;\n    STARTUP:  load = CARTHEADER,     type = ro,  define = yes;\n    ONCE:     load = ROM,            type = ro,                optional = yes;\n    CODE:     load = ROM,            type = ro,  define = yes;\n    RODATA:   load = ROM,            type = ro,  define = yes;\n    DATA:     load = ROM, run = LOWCPUSTACK, type = rw,  define = yes;\n    BSS:      load = RAM,            type = bss, define = yes;\n}\n\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/nes_fx.cfg",
    "content": "SYMBOLS {\n    __STACKSIZE__: type = weak, value = $0300; # 3 pages stack\n}\nMEMORY {\n    ZP:     file = \"\", start = $0002, size = $001A, type = rw, define = yes;\n\n    # INES Cartridge Header\n    HEADER: file = %O, start = $0000, size = $0010, fill = yes;\n\n    # 2 16K ROM Banks\n    # - startup\n    # - code\n    # - rodata\n    # - data (load)\n    ROM0:   file = %O, start = $8000, size = $7FFA, fill = yes, define = yes;\n\n    # Hardware Vectors at End of 2nd 8K ROM\n    ROMV:   file = %O, start = $FFFA, size = $0006, fill = yes;\n\n    # 1 8k CHR Bank\n    ROM2:   file = %O, start = $0000, size = $2000, fill = yes;\n\n    # standard 2k SRAM (-zeropage)\n    # $0100-$0200 cpu stack\n    # $0200-$0500 3 pages for ppu memory write buffer\n    # $0500-$0800 3 pages for cc65 parameter stack\n\t\n    SRAM:   file = \"\", start = $0500, size = __STACKSIZE__, define = yes;\n\n    # additional 8K SRAM Bank\n    # - data (run)\n    # - bss\n    # - heap\n    RAM:    file = \"\", start = $6000, size = $2000, define = yes;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,              type = zp;\n    HEADER:   load = HEADER,          type = ro;\n    STARTUP:  load = ROM0,            type = ro,  define   = yes;\n    LOWCODE:  load = ROM0,            type = ro,  optional = yes;\n    ONCE:     load = ROM0,            type = ro,  optional = yes;\n    CODE:     load = ROM0,            type = ro,  define   = yes;\n    RODATA:   load = ROM0,            type = ro,  define   = yes;\n    DATA:     load = ROM0, run = RAM, type = rw,  define   = yes;\n    VECTORS:  load = ROMV,            type = rw;\n    CHARS:    load = ROM2,            type = rw;\n    BSS:      load = RAM,             type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/osic1p_less_stack.cfg",
    "content": "FEATURES {\n    STARTADDRESS: default = $0200;\n}\nSYMBOLS {\n# If you want ld65 to output a loadable-format file by default, then uncomment\n# the next line. (Then, \"-u __BOOT__\" wouldn't be needed on the command line.)\n#    __BOOT__:      type = import;\n    __STACKSIZE__: type = weak, value = $0001; # 1 kB stack\n    __HIMEM__:     type = weak, value = $2000; # 32 kB RAM\n}\nMEMORY {\n    # for size of ZP, see runtime/zeropage.s and c1p/extzp.s\n    ZP:   file = \"\", define = yes, start = $0002, size = $001A + $0020;\n    HEAD: file = %O,               start = $0000, size = $00B6;\n    MAIN: file = %O, define = yes, start = %S, size = __HIMEM__ - __STACKSIZE__ - %S;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,   type = zp;\n    EXTZP:    load = ZP,   type = zp,  define = yes, optional = yes;\n    BOOT:     load = HEAD, type = ro,                optional = yes;\n    STARTUP:  load = MAIN, type = ro;\n    LOWCODE:  load = MAIN, type = ro,                optional = yes;\n    ONCE:     load = MAIN, type = ro,                optional = yes;\n    CODE:     load = MAIN, type = rw;\n    RODATA:   load = MAIN, type = rw;\n    DATA:     load = MAIN, type = rw;\n    BSS:      load = MAIN, type = bss, define = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/pce.cfg",
    "content": "# linker config to produce simple NEC PC-Engine cartridge (.pce)\n\nSYMBOLS {\n    __STACKSIZE__: type = weak, value = $0300; # 3 pages stack\n}\n\nMEMORY {\n    # FIXME: is this correct? the first 3? bytes cant be used?\n    ZP:   file = \"\", start = $0003, size = $00FD, type = rw,  define = yes;\n\n    # reset-bank and hardware vectors\n    ROM0: file = %O, start = $E000, size = $1FF6, fill = yes, define = yes;\n    ROMV: file = %O, start = $FFF6, size = $000A, fill = yes;\n\n    # first RAM page (also contains stack and zeropage)\n    RAM:  file = \"\", start = $2200, size = $1e00,             define = yes;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,              type = zp,  define = yes;\n    EXTZP:    load = ZP,              type = zp,  define = yes, optional = yes;\n    APPZP:    load = ZP,              type = zp,  define = yes, optional = yes;\n    STARTUP:  load = ROM0,            type = ro,  define = yes;\n    ONCE:     load = ROM0,            type = ro,                optional = yes;\n    CODE:     load = ROM0,            type = ro,  define = yes;\n    RODATA:   load = ROM0,            type = ro,  define = yes;\n    DATA:     load = ROM0, run = RAM, type = rw,  define = yes;\n    BSS:      load = RAM,             type = bss, define = yes;\n    VECTORS:  load = ROMV,            type = rw,  define = yes;\n}\n\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/pce_16k.cfg",
    "content": "# linker config to produce simple NEC PC-Engine cartridge (.pce)\n\nSYMBOLS {\n    __STACKSIZE__: type = weak, value = $0300; # 3 pages stack\n}\n\nMEMORY {\n\t# Preserve System Card standard ZP locations.\n\tZP: start = $00, size = $EC, type = rw, define = yes;\n\n\t# banks and vectors\n\tROM00:   start = $E000, size = $1FF6, file = %O, fill = yes, bank = $00, fillval = $FF, define = yes;\n\tVECTORS: start = $FFF6, size = $000A, file = %O, fill = yes;\n\tROM01:   start = $6000, size = $2000, file = %O, fill = yes, bank = $01, fillval = $FF, define = yes;\n\n\t# First RAM page (also contains zero page and stack)\n\tRAM: start $2200, size $1E00, define = yes;\n}\n\nSEGMENTS {\n    EXTZP:    load = ZP,              type = zp,  define = yes, optional = yes;\n    APPZP:    load = ZP,              type = zp,  define = yes, optional = yes;\n    STARTUP:  load = ROM00,            type = ro,  define = yes;\n\tCODE:     load = ROM00,   type = ro,  define = yes;\n\tRODATA:   load = ROM00,   type = ro,  define = yes;\n\tDATA:     load = ROM00,   run  = RAM, type = rw,  define = yes;\n    ONCE:     load = ROM00,            type = ro,                optional = yes;\t\n\tBSS:      load = RAM,     type = bss, define = yes;\n\tVECTORS:  load = VECTORS, type = rw,  define = yes;\n\tZEROPAGE: load = ZP,      type = zp,  define = yes;\n\t\n\tBANK01:   load = ROM01,   type = ro,  define = yes;\n}\n\n# \tBANK01:   load = ROM01,   type = ro,  define = yes;\n\n\n\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/pce_16k_less_stack.cfg",
    "content": "# linker config. to produce a NEC PC-Engine 8K, 16K, or 32K image (.bin)\nSYMBOLS {\n    __CARTSIZE__:  type = weak, value = $4000; # $2000, $4000, or $8000\n    __STACKSIZE__: type = weak, value = $0020; # 3 pages stack\n}\nMEMORY {\n    ZP:   file = \"\", start =  $0000,                size = $0100,                 define = yes;\n    # RAM bank\n    MAIN: file = \"\", start =  $2200,                size = $1E00 - __STACKSIZE__, define = yes;\n    # ROM banks, before swapping, and after mapping\n    ROM:  file = %O, start = $10000 - __CARTSIZE__, size = __CARTSIZE__, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,              type = zp;\n    EXTZP:    load = ZP,              type = zp,  optional = yes;\n    APPZP:    load = ZP,              type = zp,  optional = yes;\n    DATA:     load = ROM, run = MAIN, type = rw,                  define = yes;\n    INIT:     load = MAIN,            type = bss, optional = yes;\n    BSS:      load = MAIN,            type = bss,                 define = yes;\n    RODATA:   load = ROM,             type = ro;\n    CODE:     load = ROM,             type = ro;\n    LOWCODE:  load = ROM,             type = ro,  optional = yes;\n    ONCE:     load = ROM,             type = ro,  optional = yes;\n    STARTUP:  load = ROM,             type = ro,  start = $FFF6 - $0066;\n    VECTORS:  load = ROM,             type = ro,  start = $FFF6;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/pce_32k.cfg",
    "content": "# linker config. to produce a NEC PC-Engine 8K, 16K, or 32K image (.bin)\nSYMBOLS {\n    __CARTSIZE__:  type = weak, value = $8000; # $2000, $4000, or $8000\n    __STACKSIZE__: type = weak, value = $0200; # 3 pages stack\n}\nMEMORY {\n    ZP:   file = \"\", start =  $0000,                size = $0100,                 define = yes;\n    # RAM bank\n    MAIN: file = \"\", start =  $2200,                size = $1E00 - __STACKSIZE__, define = yes;\n    # ROM banks, before swapping, and after mapping\n    ROM:  file = %O, start = $10000 - __CARTSIZE__, size = __CARTSIZE__, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,              type = zp;\n    EXTZP:    load = ZP,              type = zp,  optional = yes;\n    APPZP:    load = ZP,              type = zp,  optional = yes;\n    DATA:     load = ROM, run = MAIN, type = rw,                  define = yes;\n    INIT:     load = MAIN,            type = bss, optional = yes;\n    BSS:      load = MAIN,            type = bss,                 define = yes;\n    RODATA:   load = ROM,             type = ro;\n    CODE:     load = ROM,             type = ro;\n    LOWCODE:  load = ROM,             type = ro,  optional = yes;\n    ONCE:     load = ROM,             type = ro,  optional = yes;\n    STARTUP:  load = ROM,             type = ro,  start = $FFF6 - $0066;\n    VECTORS:  load = ROM,             type = ro,  start = $FFF6;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/pce_8k_less_stack.cfg",
    "content": "# linker config. to produce a NEC PC-Engine 8K, 16K, or 32K image (.bin)\nSYMBOLS {\n    __CARTSIZE__:  type = weak, value = $2000; # $2000, $4000, or $8000\n    __STACKSIZE__: type = weak, value = $0020; # 3 pages stack\n}\nMEMORY {\n    ZP:   file = \"\", start =  $0000,                size = $0100,                 define = yes;\n    # RAM bank\n    MAIN: file = \"\", start =  $2200,                size = $1E00 - __STACKSIZE__, define = yes;\n    # ROM banks, before swapping, and after mapping\n    ROM:  file = %O, start = $10000 - __CARTSIZE__, size = __CARTSIZE__, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,              type = zp;\n    EXTZP:    load = ZP,              type = zp,  optional = yes;\n    APPZP:    load = ZP,              type = zp,  optional = yes;\n    DATA:     load = ROM, run = MAIN, type = rw,                  define = yes;\n    INIT:     load = MAIN,            type = bss, optional = yes;\n    BSS:      load = MAIN,            type = bss,                 define = yes;\n    RODATA:   load = ROM,             type = ro;\n    CODE:     load = ROM,             type = ro;\n    LOWCODE:  load = ROM,             type = ro,  optional = yes;\n    ONCE:     load = ROM,             type = ro,  optional = yes;\n    STARTUP:  load = ROM,             type = ro,  start = $FFF6 - $0066;\n    VECTORS:  load = ROM,             type = ro,  start = $FFF6;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/pet_8k.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0010; # 2k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0055, size = $001A;\n    LOADADDR: file = %O,               start = $03FF, size = $0002;\n    HEADER:   file = %O,               start = $0401, size = $000C;\n    RAM:      file = %O,               start = $040D, size = $1BF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = RAM,      type = ro;\n    LOWCODE:  load = RAM,      type = ro,  optional = yes;\n    ONCE:     load = RAM,      type = ro,  optional = yes;\n    CODE:     load = RAM,      type = ro;\n    RODATA:   load = RAM,      type = ro;\n    DATA:     load = RAM,      type = rw;\n    INIT:     load = RAM,      type = bss;\n    BSS:      load = RAM,      type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/plus4_GFX.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0800; # 2k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n    MAIN:     file = %O, define = yes, start = $100D, size = $5FF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/supervision-16k.cfg",
    "content": "# supervision 16kbyte cartridge\n\n# ld65 config file\n# ld65 --config supervision-16k.cfg -o <prog>.bin <prog>.o\n\nSYMBOLS {\n    __STACKSIZE__: type = weak, value = $0100; # 1 page stack\n\t__GFX_START__: type = weak, value = $FB00;\n}\nMEMORY {\n    ZP:       file = \"\", start = $0000, size = $0100;\n    CPUSTACK: file = \"\", start = $0100, size = $0100;\n    RAM:      file = \"\", start = $0200, size = $1E00 - __STACKSIZE__, define=yes;\n    VRAM:     file = \"\", start = $4000, size = $2000;\n    BANKROM1: file = %O, start = $8000, size = $4000, fill = yes, fillval = $ff, define=yes;\n    ROM:      file = %O, start = $C000, size = $3F00, fill = yes, fillval = $ff, define=yes;\n    ROM2:     file = %O, start = $FF00, size = $0100, fill = yes, fillval = $ff, define=yes;   \n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp,  define   = yes;\n    LOWCODE:  load = ROM,            type = ro,  optional = yes;\n    ONCE:     load = ROM,            type = ro,  optional = yes;\n    CODE:     load = ROM,            type = ro,  define   = yes;\n    RODATA:   load = ROM,            type = ro,  define   = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define   = yes;\n    FFF0:     load = ROM2,           type = ro,  offset   = $F0;    \n    VECTORS:   load = ROM2,           type = ro,  offset   = $FA;\n    BSS:      load = RAM,            type = bss, define   = yes;\n    \n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/supervision-16k_GFX.cfg",
    "content": "# supervision 16kbyte cartridge\n\n# ld65 config file\n# ld65 --config supervision-16k.cfg -o <prog>.bin <prog>.o\n\nSYMBOLS {\n    __STACKSIZE__: type = weak, value = $0040; # 1 page stack\n\t__GFX_START__: type = weak, value = $FB00;\n}\nMEMORY {\n    ZP:       file = \"\", start = $0000, size = $0100;\n    CPUSTACK: file = \"\", start = $0100, size = $0100;\n    RAM:      file = \"\", start = $0200, size = $1E00 - __STACKSIZE__, define=yes;\n    VRAM:     file = \"\", start = $4000, size = $2000;\n    DUMMY:    file = %O, start = $8000, size = $4000, fill = yes, fillval = $ff, define=yes;\n    ROM:      file = %O, start = $C000, size = $3B00, fill = yes, fillval = $ff, define=yes;\n    CHARMEM:  file = %O, start = __GFX_START__, size = $0400, type = rw,  define = yes, fill = yes;\n    ROM2:     file = %O, start = $FF00, size = $0100, fill = yes, fillval = $ff, define=yes;   \n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp,  define   = yes;\n    GFX:  load = CHARMEM,        type = ro,  define   = yes, optional = no;    \n    LOWCODE:  load = ROM,            type = ro,  optional = yes;\n    ONCE:     load = ROM,            type = ro,  optional = yes;\n    CODE:     load = ROM,            type = ro,  define   = yes;\n    RODATA:   load = ROM,            type = ro,  define   = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define   = yes;\n    FFF0:     load = ROM2,           type = ro,  offset   = $F0;    \n    VECTORS:   load = ROM2,           type = ro,  offset   = $FA;\n    BSS:      load = RAM,            type = bss, define   = yes;\n    \n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/supervision-16k_GFX_2.cfg",
    "content": "# supervision 16kbyte cartridge\n\n# ld65 config file\n# ld65 --config supervision-16k.cfg -o <prog>.bin <prog>.o\n\nSYMBOLS {\n    __STACKSIZE__: type = weak, value = $0040; # 1 page stack\n\t__GFX_START__: type = weak, value = $FB00;\n}\nMEMORY {\n    ZP:       file = \"\", start = $0000, size = $0100;\n    CPUSTACK: file = \"\", start = $0100, size = $0100;\n    RAM:      file = \"\", start = $0200, size = $1E00 - __STACKSIZE__, define=yes;\n    VRAM:     file = \"\", start = $4000, size = $2000;\n    ROM0:    file = %O, start = $8000, size = $4000, fill = yes, fillval = $ff, define=yes;\n    ROM:      file = %O, start = $C000, size = $3B00, fill = yes, fillval = $ff, define=yes;\n    CHARMEM:  file = %O, start = __GFX_START__, size = $0400, type = rw,  define = yes, fill = yes;\n    ROM2:     file = %O, start = $FF00, size = $0100, fill = yes, fillval = $ff, define=yes;   \n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,             type = zp,  define   = yes;\n    GFX:  load = CHARMEM,        type = ro,  define   = yes, optional = no;    \n    LOWCODE:  load = ROM,            type = ro,  optional = yes;\n    ONCE:     load = ROM,            type = ro,  optional = yes;\n    CODE:     load = ROM,            type = ro,  define   = yes;\n    RODATA:   load = ROM0,            type = ro,  define   = yes;\n    DATA:     load = ROM, run = RAM, type = rw,  define   = yes;\n    FFF0:     load = ROM2,           type = ro,  offset   = $F0;    \n    VECTORS:   load = ROM2,           type = ro,  offset   = $FA;\n    BSS:      load = RAM,            type = bss, define   = yes;\n    \n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/supervision-16k_GFX_2_stack_0x1B.cfg",
    "content": "# supervision 16kbyte cartridge\r\n\r\n# ld65 config file\r\n# ld65 --config supervision-16k.cfg -o <prog>.bin <prog>.o\r\n\r\nSYMBOLS {\r\n    __STACKSIZE__: type = weak, value = $001B; # 1 page stack\r\n\t__GFX_START__: type = weak, value = $FB00;\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", start = $0000, size = $0100;\r\n    CPUSTACK: file = \"\", start = $0100, size = $0100;\r\n    RAM:      file = \"\", start = $0200, size = $1E00 - __STACKSIZE__, define=yes;\r\n    VRAM:     file = \"\", start = $4000, size = $2000;\r\n    ROM0:    file = %O, start = $8000, size = $4000, fill = yes, fillval = $ff, define=yes;\r\n    ROM:      file = %O, start = $C000, size = $3B00, fill = yes, fillval = $ff, define=yes;\r\n    CHARMEM:  file = %O, start = __GFX_START__, size = $0400, type = rw,  define = yes, fill = yes;\r\n    ROM2:     file = %O, start = $FF00, size = $0100, fill = yes, fillval = $ff, define=yes;   \r\n}\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,             type = zp,  define   = yes;\r\n    GFX:  load = CHARMEM,        type = ro,  define   = yes, optional = no;    \r\n    LOWCODE:  load = ROM,            type = ro,  optional = yes;\r\n    ONCE:     load = ROM,            type = ro,  optional = yes;\r\n    CODE:     load = ROM,            type = ro,  define   = yes;\r\n    RODATA:   load = ROM0,            type = ro,  define   = yes;\r\n    DATA:     load = ROM, run = RAM, type = rw,  define   = yes;\r\n    FFF0:     load = ROM2,           type = ro,  offset   = $F0;    \r\n    VECTORS:   load = ROM2,           type = ro,  offset   = $FA;\r\n    BSS:      load = RAM,            type = bss, define   = yes;\r\n    \r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/supervision-16k_GFX_3.cfg",
    "content": "# supervision 16kbyte cartridge\r\n\r\n# ld65 config file\r\n# ld65 --config supervision-16k.cfg -o <prog>.bin <prog>.o\r\n\r\nSYMBOLS {\r\n    __STACKSIZE__: type = weak, value = $0040; # 1 page stack\r\n\t__GFX_START__: type = weak, value = $FB00;\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", start = $0000, size = $0100;\r\n    CPUSTACK: file = \"\", start = $0100, size = $0100;\r\n    RAM:      file = \"\", start = $0200, size = $1E00 - __STACKSIZE__, define=yes;\r\n    VRAM:     file = \"\", start = $4000, size = $2000;\r\n    ROM0:    file = %O, start = $8000, size = $4000, fill = yes, fillval = $ff, define=yes;\r\n    ROM:      file = %O, start = $C000, size = $3B00, fill = yes, fillval = $ff, define=yes;\r\n    CHARMEM:  file = %O, start = __GFX_START__, size = $0400, type = rw,  define = yes, fill = yes;\r\n    ROM2:     file = %O, start = $FF00, size = $0100, fill = yes, fillval = $ff, define=yes;   \r\n}\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,             type = zp,  define   = yes;\r\n    GFX:  load = CHARMEM,        type = ro,  define   = yes, optional = no;    \r\n    LOWCODE:  load = ROM,            type = ro,  optional = yes;\r\n    ONCE:     load = ROM,            type = ro,  optional = yes;\r\n    CODE:     load = ROM,            type = ro,  define   = yes;\r\n    CODE0:    load = ROM0,            type = ro,  define   = yes;\r\n    RODATA:   load = ROM0,            type = ro,  define   = yes;\r\n    DATA:     load = ROM, run = RAM, type = rw,  define   = yes;\r\n    FFF0:     load = ROM2,           type = ro,  offset   = $F0;    \r\n    VECTORS:   load = ROM2,           type = ro,  offset   = $FA;\r\n    BSS:      load = RAM,            type = bss, define   = yes;\r\n    \r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/supervision-64k.cfg",
    "content": "# supervision 64kbyte cartridge with bankswitching\n# for assembler\n\n# ld65 config file\n# ld65 --config supervision-64k.cfg -o <prog>.bin <prog>.o\n\nSYMBOLS {\n    __STACKSIZE__: type = weak, value = $0100; # 1 page stack\n}\nMEMORY {\n    RAM:      file = \"\", start = $0000, size = $2000 - __STACKSIZE__, define = yes;\n    VRAM:     file = \"\", start = $4000, size = $2000;\n    BANKROM1: file = %O, start = $8000, size = $4000, fill = yes, fillval = $FF;\n    BANKROM2: file = %O, start = $8000, size = $4000, fill = yes, fillval = $FF;\n    BANKROM3: file = %O, start = $8000, size = $4000, fill = yes, fillval = $FF;\n    ROM:      file = %O, start = $C000, size = $4000, fill = yes, fillval = $FF;\n}\nSEGMENTS {\n    LOWCODE:  load = ROM,      type = ro,  optional = yes;\n    ONCE:     load = ROM,      type = ro,  optional = yes;\n    CODE:     load = ROM,      type = ro;\n    RODATA:   load = ROM,      type = ro;\n    BANK1:    load = BANKROM1, type = ro;\n    BANK2:    load = BANKROM2, type = ro;\n    BANK3:    load = BANKROM3, type = ro;\n    ZEROPAGE: load = RAM,      type = bss, define   = yes;\n    DATA:     load = RAM,      type = bss, define   = yes, offset = $0200;\n    BSS:      load = RAM,      type = bss, define   = yes;\n    VECTORS:   load = ROM,      type = ro,                  offset = $3FFA;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-16k_CODE2_GFX.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; # 256 byte stack\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1C00 - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = $1C00 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\r\n    CHARMEM:  file = %O, start = $1C00, size = $02F0-216, type = rw,  define = yes, fill = yes;\r\n    RAM1: \t  file = %O, start = $1EF0-216, size = $4000+216, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = RAM1,     type = ro,  optional = yes;\r\n    CODE:     load = RAM1,     type = ro;\r\n    CODE2:    load = MAIN,     type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = RAM1,     type = bss, define   = yes;\r\n    GFX:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-16k_CODE2_GFX_ALT_V2.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; # 256 byte stack\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1900 - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = $1900 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\r\n    CHARMEM:  file = %O,               start = $1900, size = $0200, type = rw,  define = yes, fill = yes;\r\n    RAM1:     file = %O,               start = $1B00, size = $4500, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = RAM1,     type = ro;\r\n    CODE2:    load = MAIN,     type = ro;\r\n    RODATA:   load = RAM1,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = RAM1,     type = bss, define   = yes;\r\n    GFX:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-16k_CODE2_GFX_V2.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; # 256 byte stack\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1900 - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = $1900 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\r\n    CHARMEM:  file = %O,               start = $1900, size = $0200, type = rw,  define = yes, fill = yes;\r\n    RAM1:     file = %O,               start = $1B00, size = $4500, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = RAM1,     type = ro;\r\n    CODE2:    load = MAIN,     type = ro;\r\n    RODATA:   load = RAM1,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = RAM1,     type = bss, define   = yes;\r\n    GFX:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-16k_GFX.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0020; # 256 byte stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    SCREEN:   start =  $1000, size = $0200;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1C00 - $120D - __STACKSIZE__;\n    DUMMY:    file = %O,               start = $1C00 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\n    CHARMEM:  file = %O, start = $1C00, size = $02F0, type = rw,  define = yes, fill = yes;\n    RAM1: \t  file = %O, start = $1EF0, size = $4000, type = rw;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = RAM1,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    GFX:  load = CHARMEM,  type = ro, define = yes, optional = no;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-3k_GFX.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0001; # 1k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $03FF, size = $0002;\n    HEADER:   file = %O,               start = $0401, size = $000C;\n    MAIN:     file = %O, define = yes, start = $040D, size = $1C00 - $40D - __STACKSIZE__, fill=yes;\n\tDUMMY:    file = %O,               start = $1C00 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\t\n    CHARMEM:  file = %O, define = yes, start = $1C00, size = $0200, type = rw,  fill = yes;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\t\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-8k_CODE2_GFX.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; # 256 byte stack\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1C00 - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = $1C00 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\r\n    CHARMEM:  file = %O,               start = $1C00, size = $02F0 - 216, type = rw,  define = yes, fill = yes;\r\n    RAM1:     file = %O,               start = $1EF0 - 216, size = $2110 + 216, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = RAM1,     type = ro;\r\n    CODE2:    load = MAIN,     type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = MAIN,     type = bss, define   = yes;\r\n    GFX:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-8k_CODE2_GFX_V2.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; # 256 byte stack\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1900 - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = $1900 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\r\n    CHARMEM:  file = %O,               start = $1900, size = $0200, type = rw,  define = yes, fill = yes;\r\n    RAM1:     file = %O,               start = $1B00, size = $2500, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = RAM1,     type = ro;\r\n    CODE2:    load = MAIN,     type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = RAM1,     type = bss, define   = yes;\r\n    GFX:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-8k_CODE2_GFX_V2_alt.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0030; # 256 byte stack\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = $1900 - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = $1900 - __STACKSIZE__ - 1, size = __STACKSIZE__, fill = yes;\r\n    CHARMEM:  file = %O,               start = $1900, size = $0200, type = rw,  define = yes, fill = yes;\r\n    RAM1:     file = %O,               start = $1B00, size = $2500, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = RAM1,     type = ro;\r\n    CODE2:    load = MAIN,     type = ro;\r\n    RODATA:   load = RAM1,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = RAM1,     type = bss, define   = yes;\r\n    GFX:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-8k_GFX.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0050; # small stack\n    __GFX_START__: type = weak, value = $1F60;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    SCREEN:   start =  $1000, size = $0200;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = __GFX_START__ - $120D - __STACKSIZE__;\n    DUMMY:    file = %O,               start = __GFX_START__ - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\n    CHARMEM:  file = %O, start = __GFX_START__, size = $00A0, type = rw,  define = yes, fill = yes;\n    RAMEXP:   file = %O, start = $2000, size = $2000, type = rw;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = RAMEXP,   type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\n    CODE2:    load = MAIN,     type = ro;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-8k_GFX_25_tiles.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0050; # small stack\n    __GFX_START__: type = weak, value = $1F30;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    SCREEN:   start =  $1000, size = $0200;\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\n    HEADER:   file = %O,               start = $1201, size = $000C;\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = __GFX_START__ - $120D - __STACKSIZE__;\n    DUMMY:    file = %O,               start = __GFX_START__ - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\n    CHARMEM:  file = %O, start = __GFX_START__, size = $00D0, type = rw,  define = yes, fill = yes;\n    RAMEXP:   file = %O, start = $2000, size = $2000, type = rw;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = RAMEXP,   type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\n    CODE2:    load = MAIN,     type = ro;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-8k_GFX_stack_0x1B.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $001B; # small stack\r\n    __GFX_START__: type = weak, value = $1F60;\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = __GFX_START__ - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = __GFX_START__ - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\r\n    CHARMEM:  file = %O, start = __GFX_START__, size = $00A0, type = rw,  define = yes, fill = yes;\r\n    RAMEXP:   file = %O, start = $2000, size = $2000, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = RAMEXP,   type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = MAIN,     type = bss, define   = yes;\r\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n    CODE2:    load = MAIN,     type = ro;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-8k_memory_mapped_GFX.cfg",
    "content": "# Memory configuration for the VIC-20 with 16K RAM Cartridge\r\n# Contributed by Stefan Haubenthal\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $001B; # small stack\r\n    __GFX_START__: type = weak, value = $1F20;\r\n}\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    SCREEN:   start =  $1000, size = $0200;\r\n    LOADADDR: file = %O,               start = $11FF, size = $0002;\r\n    HEADER:   file = %O,               start = $1201, size = $000C;\r\n    MAIN:     file = %O, define = yes, start = $120D, fill = yes, size = __GFX_START__ - $120D - __STACKSIZE__;\r\n    DUMMY:    file = %O,               start = __GFX_START__ - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\r\n    CHARMEM:  file = %O, start = __GFX_START__, size = $00E0, type = rw,  define = yes, fill = yes;\r\n    RAMEXP:   file = %O, start = $2000, size = $2000, type = rw;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,       type = zp;\r\n    LOADADDR: load = LOADADDR, type = ro;\r\n    EXEHDR:   load = HEADER,   type = ro;\r\n    STARTUP:  load = MAIN,     type = ro;\r\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\r\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\r\n    CODE:     load = RAMEXP,   type = ro;\r\n    RODATA:   load = MAIN,     type = ro;\r\n    DATA:     load = MAIN,     type = rw;\r\n    INIT:     load = MAIN,     type = bss;\r\n    BSS:      load = MAIN,     type = bss, define   = yes;\r\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\r\n    CODE2:    load = MAIN,     type = ro;\r\n}\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20-cart.cfg",
    "content": "#\r\n# VIC-20 cart image with CC65 compiler suite\r\n# Linker configuration file for unexpanded VIC-20\r\n#\r\n# Taken from https://github.com/ops/vic-cc65-cart\r\n\r\n\r\nSYMBOLS {\r\n    __LOADADDR__:  type = import;\r\n    __EXEHDR__:    type = import;\r\n    __STACKSIZE__: type = weak, value = $0400; # 1k stack\r\n}\r\n\r\nMEMORY {\r\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\r\n    HEADER:   file = \"\",               start = $1001, size = $000C;\r\n    LOADADDR: file = %O,               start = $9FFE, size = $0002;\r\n    RAM:      file = \"\", define = yes, start = $1000, size = $0E00;\r\n    MAIN:     file = %O, define = yes, start = $A000, size = $2000, fill=yes;\r\n}\r\n\r\nSEGMENTS {\r\n    ZEROPAGE: load = ZP,              type = zp;\r\n    LOADADDR: load = LOADADDR,        type = ro;\r\n    EXEHDR:   load = HEADER,          type = ro;\r\n    STARTUP:  load = MAIN,            type = ro;\r\n    ONCE:     load = MAIN,            type = ro, optional = yes;\r\n    CODE:     load = MAIN,            type = ro;\r\n    RODATA:   load = MAIN,            type = ro;\r\n    DATA:     load = MAIN, run = RAM, type = rw, define = yes;\r\n    BSS:      load = RAM,             type = bss, define   = yes;\r\n}\r\n\r\nFEATURES {\r\n    CONDES: type    = constructor,\r\n            label   = __CONSTRUCTOR_TABLE__,\r\n            count   = __CONSTRUCTOR_COUNT__,\r\n            segment = ONCE;\r\n    CONDES: type    = destructor,\r\n            label   = __DESTRUCTOR_TABLE__,\r\n            count   = __DESTRUCTOR_COUNT__,\r\n            segment = RODATA;\r\n    CONDES: type    = interruptor,\r\n            label   = __INTERRUPTOR_TABLE__,\r\n            count   = __INTERRUPTOR_COUNT__,\r\n            segment = RODATA,\r\n            import  = __CALLIRQ__;\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20.cfg",
    "content": "SYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0400; # 1k stack\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n    MAIN:     file = %O, define = yes, start = $100D, size = $0DF3 - __STACKSIZE__;\n}\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20_unexpanded_gfx.cfg",
    "content": "\n#    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n#    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n#    HEADER:   file = %O,               start = $1001, size = $000C;\n#    MAIN:     file = %O, define = yes, start = $100D, size = $0DF3 - __STACKSIZE__;\n\n\n\n# Memory configuration for the VIC-20 with 16K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0010; # small stack\n\t__GFX_START__: type = weak, value = $1DD0;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n\tMAIN:     file = %O, define = yes, start = $100D, fill = yes, size = __GFX_START__ - $100D - __STACKSIZE__;\n\tDUMMY:    file = %O,               start = __GFX_START__ - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\n    CHARMEM:  file = %O, start = __GFX_START__, size = $0030, type = rw,  define = yes, fill = yes;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = MAIN,     type = bss;\n    BSS:      load = MAIN,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/cc65/vic20_unexpanded_gfx_low_stack.cfg",
    "content": "\n#    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n#    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n#    HEADER:   file = %O,               start = $1001, size = $000C;\n#    MAIN:     file = %O, define = yes, start = $100D, size = $0DF3 - __STACKSIZE__;\n\n\n\n# Memory configuration for the VIC-20 with 16K RAM Cartridge\n# Contributed by Stefan Haubenthal\nSYMBOLS {\n    __LOADADDR__:  type = import;\n    __EXEHDR__:    type = import;\n    __STACKSIZE__: type = weak, value = $0010; # small stack\n\t__GFX_START__: type = weak, value = $1DD0;\n}\nMEMORY {\n    ZP:       file = \"\", define = yes, start = $0002, size = $001A;\n    LOADADDR: file = %O,               start = $0FFF, size = $0002;\n    LOWCPUSTACK:  start = $0100,        size = $0070;\n    HEADER:   file = %O,               start = $1001, size = $000C;\n\tMAIN:     file = %O, define = yes, start = $100D, fill = yes, size = __GFX_START__ - $100D - __STACKSIZE__;\n\tDUMMY:    file = %O,               start = __GFX_START__ - __STACKSIZE__ - 1, fill = yes, size = __STACKSIZE__;\n    CHARMEM:  file = %O, start = __GFX_START__, size = $0030, type = rw,  define = yes, fill = yes;\n}\n\nSEGMENTS {\n    ZEROPAGE: load = ZP,       type = zp;\n    LOADADDR: load = LOADADDR, type = ro;\n    EXEHDR:   load = HEADER,   type = ro;\n    STARTUP:  load = MAIN,     type = ro;\n    LOWCODE:  load = MAIN,     type = ro,  optional = yes;\n    ONCE:     load = MAIN,     type = ro,  optional = yes;\n    CODE:     load = MAIN,     type = ro;\n    RODATA:   load = MAIN,     type = ro;\n    DATA:     load = MAIN,     type = rw;\n    INIT:     load = LOWCPUSTACK,     type = bss;\n    BSS:      load = LOWCPUSTACK,     type = bss, define   = yes;\n    UDCCHAR:  load = CHARMEM,  type = ro, define = yes, optional = no;\n}\nFEATURES {\n    CONDES: type    = constructor,\n            label   = __CONSTRUCTOR_TABLE__,\n            count   = __CONSTRUCTOR_COUNT__,\n            segment = ONCE;\n    CONDES: type    = destructor,\n            label   = __DESTRUCTOR_TABLE__,\n            count   = __DESTRUCTOR_COUNT__,\n            segment = RODATA;\n    CONDES: type    = interruptor,\n            label   = __INTERRUPTOR_TABLE__,\n            count   = __INTERRUPTOR_COUNT__,\n            segment = RODATA,\n            import  = __CALLIRQ__;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/gcc4ti99/linkfile.cfg",
    "content": "MEMORY\r\n{\r\n  cart_rom   (rx) : ORIGIN = 0x6000, LENGTH = 0x2000 /* cartridge ROM, read-only */\r\n  lower_exp  (wx) : ORIGIN = 0x2080, LENGTH = 0x1F80 /* 8k - 128 bytes       */\r\n  higher_exp (wx) : ORIGIN = 0xa000, LENGTH = 0x6000\r\n  scratchpad (wx) : ORIGIN = 0x8320, LENGTH = 0x00e0 /* 32b is for workspace */\r\n}\r\n\r\n\r\nSECTIONS\r\n{\r\n  .text 0x6000 : {*(.text)}\r\n  \r\n  .ctors ALIGN(2) : { __CTOR_START = .; *(.ctors);}\r\n  __CTOR_END = .;\r\n\r\n  __VAL_START = .;\r\n  .data 0xa000 : { __DATA_START = .; *(.data);}\r\n  __DATA_END = .;\r\n\r\n  .bss  ALIGN(2) : { __BSS_START = .; *(.bss);}\r\n  __BSS_END = .;\r\n}  \r\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc",
    "content": "-cc=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=del %s\n-rmv=del %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc -Mmapfile\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s -Mmapfile\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc2",
    "content": "-cc=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=del %s\n-rmv=del %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc -Mmapfile\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s -Mmapfile\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc2_posix",
    "content": "-cc=vbcc6502 -I$VBCC/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I$VBCC/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nosym -vobj3 -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nosym -vobj3 -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=rm %s\n-rmv=rm %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink2.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc5",
    "content": "-cc=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=del %s\n-rmv=del %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc -Mmapfile\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s -Mmapfile\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc5_posix",
    "content": "-cc=vbcc6502 -I$VBCC/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I$VBCC/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nosym -vobj3 -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nosym -vobj3 -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=rm %s\n-rmv=rm %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink5.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc7",
    "content": "-cc=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=del %s\n-rmv=del %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc -Mmapfile\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s -Mmapfile\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc7_posix",
    "content": "-cc=vbcc6502 -I$VBCC/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I$VBCC/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nosym -vobj3 -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nosym -vobj3 -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=rm %s\n-rmv=rm %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbc_posix",
    "content": "-cc=vbcc6502 -I$VBCC/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I$VBCC/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nosym -vobj3 -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nosym -vobj3 -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=rm %s\n-rmv=rm %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L$VBCC/targets/6502-bbc/lib $VBCC/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink.cmd -L$VBCC/targets/6502-bbc/lib %s %s -o %s\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/bbcmaster",
    "content": "-cc=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include -quiet %s -o= %s %s -O=%ld\n-ccv=vbcc6502 -I\"%%VBCC%%\"/targets/6502-bbc/include %s -o= %s %s -O=%ld\n-unsigned-char\n-mainargs\n-mask-opt\n-as=vasm6502_oldstyle -quiet -nowarn=62 -opt-branch -ldots -Fvobj %s -o %s\n-asv=vasm6502_oldstyle -nowarn=62 -Fvobj -opt-branch -ldots %s -o %s\n-rm=del %s\n-rmv=del %s\n-cpr=vcpr6502 -quiet %s %s\n-cprv=vcpr6502 %s %s\n-ld=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s -o %s -lvc\n-ldv=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib \"%%VBCC%%\"/targets/6502-bbc/lib/startup.o %s %s  -o %s -lvc -Mmapfile\n-l2=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s\n-l2v=vlink -m -b bbc -Cvbcc -T./cross_lib/cfg/vbcc/bbc/vlink7.cmd -L\"%%VBCC%%\"/targets/6502-bbc/lib %s %s -o %s -Mmapfile\n\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/vlink.cmd",
    "content": "HIMEM = 0x7C00;\nSTACKSIZE = 0x100;\nSTACKSTART = HIMEM - STACKSIZE;\nOSHWM = 0x1900;\n\nMEMORY\n{\n zero : org = 0 , len = 0x90\n ram : org = OSHWM, len = (STACKSTART-OSHWM)\n}\n\nSECTIONS\n{\n  text : {*(text)} >ram\n  .dtors : { *(.dtors) } > ram\n  .ctors : { *(.ctors) } > ram\n  rodata : {*(rodata)} >ram\n  data: {*(data)} >ram\n  init : {*(init)} >ram\n  zpage (NOLOAD) : {*(zpage) *(zp1) *(zp2)} >zero\n  bss (NOLOAD): {*(bss)} >ram\n\n  __BB = ADDR(bss);\n  __BE = ADDR(bss)+SIZEOF(bss);\n  ___heap = ADDR(bss)+SIZEOF(bss);\n  ___heapend = STACKSTART-1;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/vlink2.cmd",
    "content": "HIMEM = 0x3000;\nSTACKSIZE = 0x040;\nSTACKSTART = HIMEM - STACKSIZE;\nOSHWM = 0x1900;\n\nMEMORY\n{\n zero : org = 0 , len = 0x90\n ram : org = OSHWM, len = (STACKSTART-OSHWM)\n}\n\nSECTIONS\n{\n  text : {*(text)} >ram\n  .dtors : { *(.dtors) } > ram\n  .ctors : { *(.ctors) } > ram\n  rodata : {*(rodata)} >ram\n  data: {*(data)} >ram\n  init : {*(init)} >ram\n  zpage (NOLOAD) : {*(zpage) *(zp1) *(zp2)} >zero\n  bss (NOLOAD): {*(bss)} >ram\n\n  __BB = ADDR(bss);\n  __BE = ADDR(bss)+SIZEOF(bss);\n  ___heap = ADDR(bss)+SIZEOF(bss);\n  ___heapend = STACKSTART-1;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/vlink5.cmd",
    "content": "HIMEM = 0x5800;\nSTACKSIZE = 0x040;\nSTACKSTART = HIMEM - STACKSIZE;\nOSHWM = 0x1900;\n\nMEMORY\n{\n zero : org = 0 , len = 0x90\n ram : org = OSHWM, len = (STACKSTART-OSHWM)\n}\n\nSECTIONS\n{\n  text : {*(text)} >ram\n  .dtors : { *(.dtors) } > ram\n  .ctors : { *(.ctors) } > ram\n  rodata : {*(rodata)} >ram\n  data: {*(data)} >ram\n  init : {*(init)} >ram\n  zpage (NOLOAD) : {*(zpage) *(zp1) *(zp2)} >zero\n  bss (NOLOAD): {*(bss)} >ram\n\n  __BB = ADDR(bss);\n  __BE = ADDR(bss)+SIZEOF(bss);\n  ___heap = ADDR(bss)+SIZEOF(bss);\n  ___heapend = STACKSTART-1;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/vbcc/bbc/vlink7.cmd",
    "content": "HIMEM = 0x7C00;\nSTACKSIZE = 0x040;\nSTACKSTART = HIMEM - STACKSIZE;\nOSHWM = 0x1900;\n\nMEMORY\n{\n zero : org = 0 , len = 0x90\n ram : org = OSHWM, len = (STACKSTART-OSHWM)\n}\n\nSECTIONS\n{\n  text : {*(text)} >ram\n  .dtors : { *(.dtors) } > ram\n  .ctors : { *(.ctors) } > ram\n  rodata : {*(rodata)} >ram\n  data: {*(data)} >ram\n  init : {*(init)} >ram\n  zpage (NOLOAD) : {*(zpage) *(zp1) *(zp2)} >zero\n  bss (NOLOAD): {*(bss)} >ram\n\n  __BB = ADDR(bss);\n  __BE = ADDR(bss)+SIZEOF(bss);\n  ___heap = ADDR(bss)+SIZEOF(bss);\n  ___heapend = STACKSTART-1;\n}\n"
  },
  {
    "path": "src/cross_lib/cfg/z88dk/zpragma.inc",
    "content": "\n// It next exits\n#pragma-define:CLIB_EXIT_STACK_SIZE=0\n\n// Do not initialize BSS\n#pragma-define:CRT_INITIALIZE_BSS=0\n\n// move the stack to available memory\n#pragma output REGISTER_SP = -1      // must be placed somewhere in the 16k ram\n\n// halt program on exit, no need to play well with basic\n#pragma output CRT_ON_EXIT = 0x10001\n\n// eliminate the malloc heap\n#pragma output CLIB_MALLOC_HEAP_SIZE = 0\n\n// eliminate the stdio heap (no files can be opened)\n#pragma output CLIB_STDIO_HEAP_SIZE = 0\n\n// eliminate unused printf converters\n#pragma printf = \"%c %u\"    // placed used converters here, empty string if none\n\n"
  },
  {
    "path": "src/cross_lib/cfg/z88dk/zpragma_clib.inc",
    "content": "\n// It next exits\n#pragma-define:CLIB_EXIT_STACK_SIZE=0\n\n// Do not initialize BSS\n#pragma-define:CRT_INITIALIZE_BSS=0\n\n// move the stack to available memory\n//#pragma output REGISTER_SP = -1      // must be placed somewhere in the 16k ram\n\n// halt program on exit, no need to play well with basic\n#pragma output CRT_ON_EXIT = 0x10001\n\n// eliminate the malloc heap\n#pragma output CLIB_MALLOC_HEAP_SIZE = 0\n\n// eliminate the stdio heap (no files can be opened)\n#pragma output CLIB_STDIO_HEAP_SIZE = 0\n\n// eliminate unused printf converters\n#pragma printf = \"%0u\"    // placed used converters here, empty string if none\n\n"
  },
  {
    "path": "src/cross_lib/cfg/z88dk/zpragma_clib_no_printf.inc",
    "content": "\r\n// It next exits\r\n#pragma-define:CLIB_EXIT_STACK_SIZE=0\r\n\r\n// Do not initialize BSS\r\n#pragma-define:CRT_INITIALIZE_BSS=0\r\n\r\n// move the stack to available memory\r\n#pragma output REGISTER_SP = -1      // must be placed somewhere in the 16k ram\r\n\r\n// halt program on exit, no need to play well with basic\r\n#pragma output CRT_ON_EXIT = 0x10001\r\n\r\n// eliminate the malloc heap\r\n#pragma output CLIB_MALLOC_HEAP_SIZE = 0\r\n\r\n// eliminate the stdio heap (no files can be opened)\r\n#pragma output CLIB_STDIO_HEAP_SIZE = 0\r\n\r\n// eliminate unused printf converters\r\n//#pragma printf = \"\" // placed used converters here, empty string if none\r\n\r\n"
  },
  {
    "path": "src/cross_lib/cfg/z88dk/zpragma_sms.inc",
    "content": "// Standard SMS Header\n\n#pragma output   SMS_HDR_PRODUCT_CODE = 107026\n#pragma output   SMS_HDR_VERSION      = 1\n#pragma output   SMS_HDR_REGION       = 0x3\n#pragma output   SMS_HDR_ROM_SIZE     = 0x1              // ignored; rom size is always set to 32k\n\n// SDSC Header - not generated if no SDSC pragmas are present\n\n#pragma output   SDSC_HDR_VERSION     = 199\n#pragma output   SDSC_HDR_DATE        = 20170416         // if omitted current date is used\n#pragma redirect SDSC_HDR_AUTHOR      = _author          // character string in program\n#pragma redirect SDSC_HDR_NAME        = _name            // character string in program\n#pragma redirect SDSC_HDR_DESCRIPTION = _description     // character string in program\n\n// Eliminate Unused Printf Converters\n\n#pragma printf = \"\"    // generates a reference to the printf core so only employ if actually using the printf() family\n\n// Output Terminal Options\n\n#pragma output CRT_OTERM_CHAR_PATTERN_OFFSET = -32       // ascii code 32 of the font will be mapped to tile 0\n#pragma output CRT_OTERM_BACKGROUND_CHAR     = 0         // background tile is an absolute tile 0-511\n\n#pragma output CRT_OTERM_WINDOW_X      = 4\n#pragma output CRT_OTERM_WINDOW_WIDTH  = 24\n#pragma output CRT_OTERM_WINDOW_Y      = 4\n#pragma output CRT_OTERM_WINDOW_HEIGHT = 16\n"
  },
  {
    "path": "src/cross_lib/cross_lib.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _CROSS_LIB_H\n#define _CROSS_LIB_H\n\n#if !defined(__NO_GRAPHICS)\n#include \"standard_libs.h\"\n#endif\n\n#if !defined EXIT_SUCCESS\n    #define EXIT_SUCCESS 0\n#endif\n\n#if !defined(_TARGET_SETTINGS)\n#define _TARGET_SETTINGS\n\n#if !defined(__COCO3__) && !defined(__COCO__) && !defined(__DRAGON__) && !defined(__MO5__) && !defined(__TO7__) \\\n    && !defined(__SUPERVISION__) && !defined(__MC10__) && !defined(__LCC1802__) && !defined(__ATARI_LYNX__) \\\n    && !(defined(__MSX__) && defined(__MEMORY_MAPPED_GRAPHICS)) \\\n    && !defined(__SVI__) \\\n\t&& !defined(__ENTERPRISE__) \\\n\t&& !defined(__ABC800__) \\\n\t&& !(defined(__KC__) && defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t&& !(defined(__OSBORNE1__) && defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t&& !defined(__EINSTEIN__) \\\n\t&& !defined(__SRR__) \\\n\t&& !defined(__NCURSES__) \\\n\t&& !defined(__TERMINAL__) \\\n\t&& !defined(__MZ2500__) \\\n\t&& !defined(__VECTREX__) \\\n\t&& !defined(ACK) \\\n\t&& !defined(__STDIO) && !defined(__BBC_GRAPHICS)\n\t#define __INCLUDE_CONIO_H\n#endif\n\n\n#if !defined(__BACKGROUND_COLOR)\n    #define __BACKGROUND_COLOR 0\n#endif\n\n// This may be different on each target\n#if !defined(_XL_NUMBER_OF_TILES)\n    #define _XL_NUMBER_OF_TILES 27\n#endif\n\n\n#if defined(ACK) || defined(__NCURSES__) || defined(__LCC1802__)\n\t//\n#elif defined(__TI99__)\n    //\n#elif defined(__CC6303__)\n    //\n#elif defined(__SCCZ80) || defined(__SDCC)\n\t#define __Z88DK__\n#else \n\t//\n#endif\n\n\n#if !defined(_XL_NO_SMALL_LETTERS)\n    #  if defined(__PV1000_GRAPHICS) || defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__) \\\n        || (defined(__C64__) && defined(__MEMORY_MAPPED_GRAPHICS)) \\\n        || (defined(__C16__) && defined(__ALT_PRINT))  || (defined(__ATARI__) && !defined(_XL_NO_COLOR)) \\\n        || defined(__LCC1802__) || defined(__FEWER_SPRITES) || defined(__SUPERVISION__) || (defined(__MSX__)&&defined(__MEMORY_MAPPED_GRAPHICS)) \\\n        || defined(__ZX80__) || defined(__ZX81__) \\\n        || (defined(__APPLE2__) && defined(__APPLE2_HGR_GRAPHICS)) || defined(__VIC20__) \\\n        || (defined(__APPLE2__) && !defined(__APPLE2ENH__) && !defined(__APPLE2_HGR_GRAPHICS)) \\\n        || (defined(__ATARI_LYNX__) && defined(__LYNX_TGI_GRAPHICS)) || defined(__MC10__) || defined(__TI99__) \\\n        || (defined(__ATARI7800__) &&  !defined(_XL_NO_COLOR)) || defined(__TERMINAL__)\n        #define _XL_NO_SMALL_LETTERS\n    #endif  \n#endif\n\n\n#if !defined(_XL_TILE_X_SIZE)\n    #if defined(_XL_NO_UDG)\n        #define _XL_TILE_X_SIZE 1\n    #elif defined(__ORIC__) || defined(__ATMOS__) \\\n        || defined(__COMX__) || defined(__PECOM__) || defined(__MICRO__)\n        #define _XL_TILE_X_SIZE 6\n    #elif defined(__APPLE2__) || defined(__APPLE2__)\n        #define _XL_TILE_X_SIZE 7\n    #else\n        #define _XL_TILE_X_SIZE 8\n    #endif\n#endif\n\n#if !defined(_XL_TILE_Y_SIZE)\n    #if defined(_XL_NO_UDG)\n        #define _XL_TILE_Y_SIZE 1\n    #elif (defined(__COMX__) || defined(__PECOM__) || defined(__MICRO__)) && !defined(NTSC)\n        #define _XL_TILE_Y_SIZE 9\n    #elif (defined(__MC10__) && defined(__BIT_MAPPED_4_GRAPHICS)) || defined(__ATARI_LYNX__)\n        #define _XL_TILE_Y_SIZE 6\n    #else\n        #define _XL_TILE_Y_SIZE 8\n    #endif\n#endif\n\n#include \"input_target_settings.h\"\n#include \"input_macros.h\"\n\n#include \"display_target_color.h\"\n\n#include \"color_definitions.h\"\n\n#include \"sound_macros.h\"\n\n#include \"sleep_macros.h\"\n\n#include \"letters.h\"\n\n#include \"graphics_settings.h\"\n\n#include \"display_macros.h\"\n\n#include \"tiles.h\"\n\n#if !defined(__LCC1802__)\n    #include \"rand.h\"\n#else\n    #define _XL_RAND() rand()\n#endif\n\n#endif // _TARGET_SETTINGS\n\n#endif // _CROSS_LIB_H\n"
  },
  {
    "path": "src/cross_lib/crt/cc65/vic20/vic20_cart.crt",
    "content": ";\r\n; VIC-20 cart image with CC65 compiler suite\r\n; Startup code\r\n;\r\n\r\n; Taken from https://github.com/ops/vic-cc65-cart\r\n\r\nINITMEM := $FD8D\r\nFRESTOR := $FD52\r\nINITVIA := $FDF9\r\nINITSK  := $E518\r\n\r\nINITVCTRS := $E45B\r\nINITBA    := $E3A4\r\nFREMSG    := $E404\r\nREADY     := $C474\r\n\r\n        .export         _exit\r\n        .export         __STARTUP__ : absolute = 1      ; Mark as startup\r\n\r\n        .import         initlib, callmain, donelib\r\n        .import         zerobss, copydata\r\n        .import         __STACKSIZE__                   ; Linker generated\r\n        .import         __RAM_START__, __RAM_SIZE__     ; Linker generated\r\n        .importzp       ST\r\n\r\n        .include        \"zeropage.inc\"\r\n\r\n; ------------------------------------------------------------------------\r\n\r\n.segment \"LOADADDR\"\r\n        .export __LOADADDR__: absolute = 1\r\n        .addr   *+2\r\n\r\n.segment \"STARTUP\"\r\n\r\n; Startup code\r\n\r\n        .word   reset\r\n        .word   $FEA9\r\n\r\n        ; Cart signature\r\n        .byte   $41,$30,\"CBM\"\r\n\r\nreset:\r\n        jsr     INITMEM                 ; initialise and test RAM\r\n        jsr     FRESTOR                 ; restore default I/O vectors\r\n        jsr     INITVIA                 ; initialise I/O registers\r\n        jsr     INITSK                  ; initialise hardware\r\n\r\n        jsr     INITVCTRS               ; initialise BASIC vector table\r\n        jsr     INITBA                  ; initialise BASIC RAM locations\r\n        jsr     FREMSG                  ; print start up message and initialise memory pointers\r\n        cli                             ; enable interrupts\r\n\r\n        jsr     copydata\r\n\r\n; Clear the BSS data.\r\n\r\n        jsr     zerobss\r\n\r\n; Set up the stack.\r\n\r\n        lda     #<(__RAM_START__ + __RAM_SIZE__)\r\n        sta     sp\r\n        lda     #>(__RAM_START__ + __RAM_SIZE__)\r\n        sta     sp+1            ; Set argument stack ptr\r\n\r\n; Call the module constructors.\r\n\r\n        jsr     initlib\r\n\r\n; Push the command-line arguments; and, call main().\r\n\r\n        jsr     callmain\r\n\r\n; Back from main() [this is also the exit() entry]. Run the module destructors.\r\n\r\n_exit:  pha                     ; Save the return code on stack\r\n        jsr     donelib\r\n\r\n; Place the program return code into BASIC's status variable.\r\n\r\n        pla\r\n        sta     ST\r\n\r\n; Back to BASIC.\r\n\r\n        jmp     READY                   ; do \"READY.\" warm start"
  },
  {
    "path": "src/cross_lib/display/alt_print/atari_mode1_alt_print.c",
    "content": "\n#include <stdint.h>\n#include <conio.h>\n\n#include \"cross_lib.h\"\n\n#if !defined(__ANTIC_MODE6_GRAPHICS)\n    void _GOTOXY(uint8_t x, uint8_t y)\n    { \n        if((y)&1) \n        { \n            gotoxy(x+20,(y)/2);\n        } \n        else \n        { \n            gotoxy(x, (y)/2);\n        } \n    };\n\n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n    { \n        _GOTOXY(x,y);\n        cprintf(str); \n    };\n\n#else\n    extern uint8_t _atari_text_color;\n\n\n\tuint8_t screenCode(uint8_t ch)\n\t{\n\t\tif(ch==32)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ch+(_atari_text_color)-0x20u;\n\t\t}\n\t}\n\n\n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n    {\n        uint8_t i = 0;\n\n        while(str[i]!='\\0')\n        {\n\n            DISPLAY_POKE(loc(x+i,y), screenCode(str[i]));\n            ++i;\n        }\n    }\n    \n    void _XL_CHAR(uint8_t x, uint8_t y, char ch) \n    {\n        DISPLAY_POKE(loc(x,y),screenCode(ch));\n    }\n#endif\n\nvoid _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val)\n{\n\tuint8_t i;\n\tuint8_t digit;\n\t\n\tfor(i=0;i<length;++i)\n\t{\n\t\tdigit = (uint8_t) ((val)%10);\n\t\tval-= digit;\n\t\tval/=10;\n#if defined(__ANTIC_MODE6_GRAPHICS)\n\t\tDISPLAY_POKE(loc(x+length-1-i,y), (uint8_t) (digit+(uint8_t) 0x10 + _atari_text_color));\n#else\n\t\tDISPLAY_POKE(loc(x+length-1-i,y), (uint8_t) (digit+(uint8_t) 0x10 + 64));\n\n#endif\n\t}\n}\n\n\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/comx_alt_print.c",
    "content": "#include \"display_macros.h\"\r\n#include <devkit/video/vis_video.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\n\r\nunsigned int strlen(char *str)\r\n{\r\n    asm(\r\n        \" ldi 0xff\\n\"\r\n        \" plo R15\\n\"\r\n        \" phi R15\\n\"\r\n        \"$$loop:\\n\"\r\n        \" inc R15\\n\"\r\n        \" lda R12\\n\"\r\n        \" bnz $$loop\\n\"\r\n        \" Cretn\\n\");\r\n    return 0;\r\n}\r\n\r\n\r\n// TODO: This is broken with a const parameter\r\nvoid _XL_PRINT(uint8_t x, uint8_t y, const char * str)\r\n{\r\n#if !defined(__CIDELSA__)\n    vidstrcpy((uint16_t) BASE_ADDR+x+y*40,(char *)str);\r\n#else\r\n    vidstrcpy((uint16_t) 0xF800+REAL_XSIZE*40-40 -(uint16_t)(x+X_OFFSET)*(uint16_t)40+(y+Y_OFFSET),(char *)str);\r\n#endif\r\n}\r\n\r\n#if defined(__COMX__) && !defined(__COMX_COLOR_GRAPHICS)\r\n    #define CHAR_OFFSET 96\r\n#else\r\n    #define CHAR_OFFSET 48\r\n#endif\r\n\r\n\r\n#if !defined(__CIDELSA__)\r\n    #if defined(__LCC1802_UNBUFFERED) \n        #define _DISPLAY(x,y,ch) vidcharnobufxy(x,y, (uint8_t) (ch+CHAR_OFFSET))\r\n    #else\r\n        #define _DISPLAY(x,y,ch) vidcharxy(x,y, (uint8_t) (ch+CHAR_OFFSET))\r\n    #endif\r\n#else\r\n        #define _DISPLAY(__x,__y,__ch) vidcharxy(__x+X_OFFSET,__y+Y_OFFSET, (uint8_t) (__ch+CHAR_OFFSET))\r\n#endif\r\n\r\n#define COLOR_BIT 0\r\n\r\n#define _XL_CHAR(x,y,ch) _DISPLAY(x,y,(ch+80+COLOR_BIT))\r\n\r\n\r\n#if !defined(__TMC600__)\r\n    #define DIGIT_OFFSET 128U\r\n#else\r\n    #define DIGIT_OFFSET 0U\r\n#endif\r\n\r\nvoid _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val)\r\n{\r\n\tuint8_t i;\r\n\tuint8_t digit;\r\n\t\r\n\tfor(i=0;i<length;++i)\r\n\t{\r\n\t\tdigit = (uint8_t) ((val)%10);\r\n\t\tval-= digit;\r\n\t\tval/=10;\r\n\t\t_DISPLAY(x+length-1-i,y, (uint8_t) (digit+DIGIT_OFFSET));\r\n\t}\r\n}\t\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/memory_mapped_alt_print.c",
    "content": "\n#if !defined(__Z88DK_SPRITES_GRAPHICS)\n    #if defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n        #include \"quad_memory_mapped_graphics.h\"\n    #elif defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\n        #include \"dual_memory_mapped_graphics.h\"\n    #else\n        #include \"memory_mapped_graphics.h\"\n    #endif\n#endif\n\n\n#include \"memory_mapped_alt_print.h\"\n\n#include \"standard_libs.h\"\n\n#include \"display_macros.h\"\n\n#if defined(__BUFFERED_GRAPHICS)\t\n\n\t#include \"display_target_geometry.h\"\n\t\n\textern uint8_t video_buffer[YSize+Y_OFFSET][XSize];\n#endif\n\n\n#  if defined(__C64__)\n\tchar screenCode(char ch)\n\t{\n        if(ch>=65)\n        {\n            return 64+ch;\n        }\n        else\n        {\n            return ch;\n        }\n\t}\n    \n#elif defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n\tchar screenCode(char ch)\n\t{\n        return ch-(uint8_t) 32u;\n\t}  \n#elif defined(CBM_SCREEN_CODES) || defined(__SUPERVISION__)\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch<64)\n\t\t{\n\t\t\treturn ch;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ch-64;\n\t\t}\n\t\treturn ch;\n\t}\n\n\n#elif (defined(__COCO__) || defined(__DRAGON__)) && !defined(__BIT_MAPPED_GRAPHICS) && !defined(__BIT_MAPPED_4_GRAPHICS)\n\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch==32)\n\t\t{\n\t\t\treturn 96;\n\t\t}\n\t\telse if((ch>='0')&&(ch<='9'))\n\t\t{\n\t\t\treturn 64+ch;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ch;\n\t\t}        \n\t}\n\n#elif defined(__TERMINAL__)\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch==32) \n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\telse if((ch>='0')&&(ch<='9'))\n\t\t{\n\t\t\treturn ch-48+1;\n\t\t}\n\t\telse if(ch<58)\n\t\t{\n\t\t\treturn ch-48+1-64;\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\treturn ch+18-65;\n\t\t}\n\t}    \n\n#elif ((defined(__APPLE2__) || defined(__APPLE2ENH__)) && defined(__APPLE2_HGR_GRAPHICS))\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch==32) \n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t\telse if((ch>='0')&&(ch<='9'))\n\t\t{\n\t\t\treturn ch-48+1;\n\t\t}\n\t\telse if(ch<58)\n\t\t{\n\t\t\treturn ch-48+1-64;\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\treturn ch+18-65;\n\t\t}\n\t}    \n#elif (defined(__COCO3__) && defined(__BIT_MAPPED_16_GRAPHICS))\n\n\t#define _SPACE_OFFSET 13\n\n\tchar screenCode(char ch)\n\t{\n        if(ch==32)\n        {\n            return 0+_SPACE_OFFSET;\n        }\n        else\n        {\n\t\t\treturn ch;\n        }\n\t}\n#elif (defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__)) && (defined(__BIT_MAPPED_GRAPHICS) || defined(__BIT_MAPPED_4_GRAPHICS))\n\n    #if defined(__BIT_MAPPED_4_GRAPHICS)\n        #define _SPACE_OFFSET 13\n    #else\n        #define _SPACE_OFFSET 0\n    #endif\n\tchar screenCode(char ch)\n\t{\n        if(ch==32)\n        {\n            return 0+_SPACE_OFFSET;\n        }\n        else\n        {\n\t\t\treturn ch;\n        }\n\t}\n\n#elif defined(__ZX81__) && defined(__Z88DK_SPRITES_GRAPHICS)\n\tchar screenCode(char ch)\n\t{\n        if(ch==32)\n        {\n            return 32;\n        }\n        else\n        {\n\t\t\treturn ch-32-64;\n        }\n\t}\n\n#elif (defined(__VIC20__) && (defined(__VIC20_EXP_3K) || defined(__VIC20_EXP_8K)))\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch<64)\n\t\t{\n\t\t\treturn 128+ch;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 64+ch;\n\t\t}\t\n\t}\n#elif (defined(__VIC20__) && (defined(__VIC20_UNEXPANDED)))\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch<64)\n\t\t{\n\t\t\treturn 128+ch;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 192+ch;\n\t\t}\t\n\t}\n#elif defined(__C16__) && defined(__MEMORY_MAPPED_GRAPHICS)\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch&0x80)\n        {\n\t\t\treturn ch&0x7F;\n\t\t}\n        else\n\t\t{\n            if(ch<58) // TODO: Use bitwise operator <64?\n            {\n                return ch|64;\n            }\n            else\n            {\n                return ch;\n            }\n\t\t}\n\t}  \n\n#endif\n\n#  if defined(__Z88DK_SPRITES_GRAPHICS)\n\t#include <graphics.h>\n\t#include <games.h>\n\n\t#include \"display_macros.h\"\n\t\n\t#define _DISPLAY(x,y,ch) \\\n\t\t__draw_ch(x,y,ch);\n\t\n#elif defined(__BUFFERED_GRAPHICS)\n\t#define _DISPLAY(x,y,ch) \\\n\t\tvideo_buffer[(y)][(x)] = (ch)\n\t\t\n#elif defined(__NO_GRAPHICS)\n\t#define _DISPLAY(x,y,ch)\n\n#elif defined(__TERMINAL__)\n    #include \"cross_lib.h\"\n\n    extern uint8_t _terminal_text_color;\n\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            _terminal_draw(x, y, ch, _terminal_text_color);\n        }\n\n#elif (defined(__APPLE2__)||defined(__APPLE2ENH__)) && defined(__APPLE2_HGR_GRAPHICS)\n    #include \"cross_lib.h\"\n\n    extern uint8_t _apple2_text_color;\n\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            hgr_draw(x, y, ch, _apple2_text_color);\n        }\n\t\n#elif (defined(__C16__) && defined(__MEMORY_MAPPED_GRAPHICS)) && defined(__NO_SCREEN_CODES)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n\t\t\tDISPLAY_POKE((loc(x,y)), ch);\n\t\t\tDISPLAY_POKE((loc(x,y)-1024), PEEK(0x053B));\n\t\t}\n#elif (defined(__C16__) && defined(__MEMORY_MAPPED_GRAPHICS)) && defined(__DOUBLE_BUFFER)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            DISPLAY_POKE(((uint16_t) BASE_ADDR)+(1)*x+(uint8_t)((1)*y)*((uint16_t) ((XSize) + X_OFFSET)), screenCode(ch));\n            DISPLAY_POKE(((uint16_t) COLOR_ADDR)+(1)*x+(uint8_t)((1)*y)*((uint16_t) ((XSize) + X_OFFSET)), PEEK(0x053B));\n\t\t}\n#elif (defined(__C16__) && defined(__MEMORY_MAPPED_GRAPHICS)) \n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n\t\t\tDISPLAY_POKE((loc(x,y)), screenCode(ch));\n\t\t\tDISPLAY_POKE((loc(x,y)-1024), PEEK(0x053B));\n\t\t}\n#elif (defined(__VIC20__) && defined(__VIC20_EXP_8K)) && !defined(_XL_NO_UDG)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n        DISPLAY_POKE((loc(x,y)), screenCode(ch));\n        DISPLAY_POKE((0x8400+loc(x,y)), PEEK(0x0286));\n        }\n#elif (defined(__VIC20__) && defined(__VIC20_UNEXPANDED)) && !defined(_XL_NO_UDG)\n    #if !defined(_XL_NO_TEXT_COLOR)\n        void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n            {\n                DISPLAY_POKE((loc(x,y)), screenCode(ch));\n                DISPLAY_POKE((0x7800+loc(x,y)), PEEK(0x0286));\n            }\n    #else\n        void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n            {\n                DISPLAY_POKE((loc(x,y)), screenCode(ch));\n                DISPLAY_POKE((0x7800+loc(x,y)), 0x1);\n            }\n    #endif\n#elif defined(__C64__)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n        DISPLAY_POKE((loc(x,y)), ch);\n        DISPLAY_POKE((0x1800+loc(x,y)), PEEK(0x0286));\n        } \n#elif defined(__VGA_GRAPHICS)\n    extern uint8_t _vga_text_color;\n\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            uint8_t tile_index;\n            \n            if((ch>=65) && (ch<=65+25))\n            {\n                tile_index = _XL_NUMBER_OF_TILES+ch-'A';\n            }\n            else if ((ch>=48) && (ch<=48+9))\n            {\n                tile_index = _XL_NUMBER_OF_TILES+26+ch-'0';\n            }\n            else\n            {\n                tile_index = _XL_NUMBER_OF_TILES+26+10;\n            }\n            _display_tile(x, y, tile_index, _vga_text_color);\n        } \n#elif defined(__BIT_MAPPED_4_GRAPHICS)\n    #include \"bit_mapped_4_graphics.h\"\n    #include \"cross_lib.h\"\n    \n    #if defined(__COCO__) || defined(__DRAGON__)\n        #define _CHAR_OFFSET (-13)\n    #else\n        #define _CHAR_OFFSET 0\n    #endif\n    \n    extern uint8_t _bitmap4_text_color;\n\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            _color_draw(x,y,ch+_CHAR_OFFSET,_bitmap4_text_color);\n        }\n\n#elif defined(__BIT_MAPPED_16_GRAPHICS)\n    #include \"bit_mapped_16_graphics.h\"\n    #include \"cross_lib.h\"\n    \n    #if defined(__COCO3__)\n        #define _CHAR_OFFSET (-13)\n    #elif defined(__AGAT__)\n        #define _CHAR_OFFSET (_XL_NUMBER_OF_TILES)\n    #endif\n    \n    extern uint8_t _bitmap16_text_color;\n\n    #if defined(__COCO3__)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n        _color_draw(x,y,ch+_CHAR_OFFSET,_bitmap16_text_color);\n        }\n    #else\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            if(ch==' ')\n            {\n                ch = 27;\n            }\n            else if (ch<65)\n            {\n                ch+= 27+26+1-48;\n            }\n            else\n            {\n                ch = 27+1+ch-'A';\n            }\n        _color_draw(x,y,ch,_bitmap16_text_color);\n        }\n    #endif\n#elif (defined(__COCO__) || defined(__DRAGON__)) && defined(__BIT_MAPPED_GRAPHICS)\n    #include \"bit_mapped_graphics.h\"\n    #include \"cross_lib.h\"\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            if(ch==0)\n            {\n                _XL_DELETE(x,y);\n            }\n            else\n            {\n                _XL_DRAW(x,y,(ch-13),0);\n            }\n        }\n#elif defined(__AQUARIUS__) || defined(__MEMORY_MAPPED_GRAPHICS)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            if(ch==0)\n            {\n                _XL_DELETE(x,y);\n            }\n            else\n            {\n                _XL_DRAW(x,y,ch,_XL_WHITE);\n            }\n        }\n#elif defined(__QUAD_MEMORY_MAPPED_GRAPHICS) || defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            _XL_DRAW(x,y,ch-32,_XL_WHITE);\n        }\n\n#elif defined(__ATARI7800__)\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\n            uint8_t adjusted_ch;\n            \n            if(ch==32)\n            {\n                adjusted_ch = 0;\n            }\n            else if(ch<=57)\n            {\n                adjusted_ch = ch-48+1;\n            }\n            else \n            {\n                adjusted_ch = ch - 65 + 10 + 1;\n            }\n            screen[loc(x,y)] = 2*adjusted_ch;\n        }\n#else\n    void _DISPLAY(uint8_t x, uint8_t y, uint8_t ch)\n        {\t\t\n        DISPLAY_POKE((loc(x,y)), (ch));\n        }\n#endif\n\n\nvoid _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n{\n\tuint8_t i = 0;\n\n\twhile(str[i]!='\\0')\n\t{\n\t\t#if defined(CBM_SCREEN_CODES) || defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__) || defined(__SUPERVISION__) \\\n            || ((defined(__APPLE2__) || defined(__APPLE2ENH__)) && defined(__APPLE2_HGR_GRAPHICS)) \\\n            || defined(__C64__) \\\n            || (defined(__VIC20__) && !defined(__VIC20_UNEXPANDED)) \\\n            || defined(__QUAD_MEMORY_MAPPED_GRAPHICS) || defined(__TERMINAL__)\n\t\t\t_DISPLAY(x+i,y, screenCode(str[i]));\n\t\t#else\n\t\t\t_DISPLAY(x+i,y, str[i]);\n\t\t#endif\n\t\t++i;\n\t}\n}\n\n\nvoid _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val)\n{\n\tuint8_t i;\n\tuint8_t digit;\n\t\n\tfor(i=0;i<length;++i)\n\t{\n\t\tdigit = (uint8_t) ((val)%10);\n\t\tval-= digit;\n\t\tval/=10;\n        #if ((defined(__APPLE2__) || defined(__APPLE2ENH__)) && defined(__APPLE2_HGR_GRAPHICS))\n        _DISPLAY(x+length-1-i,y, (uint8_t) (digit+(uint8_t) 1u));\n        #elif defined(__TERMINAL__)\n        _DISPLAY(x+length-1-i,y, (uint8_t) (digit+(uint8_t) 1u));\n        #elif ((defined(__COCO__) || defined(__DRAGON__))&&!defined(__BIT_MAPPED_GRAPHICS))\n        _DISPLAY(x+length-1-i,y, (uint8_t) (digit+(uint8_t) 48u + 64u));\n        // #elif defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n        // DRAW_QUAD_CHAR(x+length-1-i,y,(digit+(uint8_t) 48u),_XL_WHITE);\n        #elif defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n\t\t_DISPLAY(x+length-1-i,y, (uint8_t) (digit+(uint8_t) 48u-32u));\n        #else\n\t\t_DISPLAY(x+length-1-i,y, (uint8_t) (digit+(uint8_t) 48u));\n        #endif\n\t}\n}\n\n#if defined(CBM_SCREEN_CODES) || defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__) || defined(__SUPERVISION__) \\\n    || ((defined(__APPLE2__) || defined(__APPLE2ENH__)) && defined(__APPLE2_HGR_GRAPHICS)) \\\n    || defined(__C64__) || defined(__TERMINAL__)\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch)\n    {    \n        _DISPLAY(x,y, screenCode(ch));\n    }\n#else\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch)\n    {    \n        _DISPLAY(x,y, ch);\n    }\n#endif\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/memory_mapped_alt_print.h",
    "content": "#ifndef _MEMORY_MAPPED_ALT_PRINT\n#define _MEMORY_MAPPED_ALT_PRINT\n\n#include \"cross_lib.h\"\n\n\n#if !defined(__CC65__) && !defined(POKE) && !defined(PEEK)\n\t#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\n\t#define POKEW(addr,val)    (*(unsigned*) (addr) = (val))\n\t#define PEEK(addr)         (*(uint8_t*) (addr))\n\t#define PEEKW(addr) (*(unsigned*) (addr))\n#endif\n\n#if defined(CBM_SCREEN_CODES)\n\tchar screenCode(char ch);\n#endif\n\n// void _XL_PRINT(uint8_t x, uint8_t y, const char * str);\n\n// void _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val);\n\n#endif // _MEMORY_MAPPED_ALT_PRINT\n\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/mo5_alt_print.c",
    "content": "#include \"standard_libs.h\"\r\n#include \"display_macros.h\"\r\n\r\nvoid _XL_PRINT(uint8_t x, uint8_t y, const char * str)\r\n{\r\n\tuint8_t i = 0;\r\n\t\r\n\tgotoxy(x,y);\r\n\twhile(str[i]!='\\0')\r\n\t{\r\n\t\tPUTCH(str[i]);\r\n\t\t++i;\r\n\t}\r\n    \r\n\tSWITCH_COLOR_BANK_OFF();\r\n}\r\n\r\n\r\nvoid _XL_CHAR(uint8_t x, uint8_t y, char ch)\r\n{\r\n    gotoxy(x,y);\r\n    PUTCH(ch);\r\n}\r\n\r\n\r\nvoid _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val)\r\n{\r\n\tuint8_t i;\r\n\tuint8_t digit;\r\n\t\r\n\r\n\tfor(i=0;i<length;++i)\r\n\t{\r\n\t\tdigit = (uint8_t) ((val)%10);\r\n\t\tval-= digit;\r\n\t\tval/=10;\r\n\t\tgotoxy(x+length-1-i,y);\r\n\t\tPUTCH(48+digit);\r\n\t}\r\n\t\r\n}\t\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/ncurses_alt_print.c",
    "content": "#include <stdint.h>\n#if defined(WIN32)\n    #include <ncurses/curses.h>\n#else\n    #include <ncurses.h>\n#endif\n#include \"display_macros.h\"\n\nvoid _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n{\n\tmove(y,x); \n\tprintw(\"%s\",str); \n\trefresh();\n}\n\n\n// void _XL_PRINTD(uint8_t x, uint8_t y, uint8_t len, uint16_t value)\n// {\n// }\n\n\nvoid _XL_CHAR(uint8_t x, uint8_t y, char ch)\n{\n    move(y,x);\n    cputc(ch);\n}\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/simple_alt_stats.c",
    "content": "#include \"standard_libs.h\"\n\n#include \"display_macros.h\"\n\n#include \"memory_mapped_graphics.h\"\n\n\n#if !defined(__CC65__) && !defined(POKE) && !defined(PEEK)\n    #define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\n    #define POKEW(addr,val)    (*(unsigned*) (addr) = (val))\n    #define PEEK(addr)         (*(uint8_t*) (addr))\n    #define PEEKW(addr) (*(unsigned*) (addr))\n#else\n    #include <peekpoke.h>\n#endif\n\n\n#if defined(__VIC20__) && defined(__VIC20_UNEXPANDED) && !defined(_XL_NO_UDG)\n    #define UDG_OFFSET 128\n#else\n    #define UDG_OFFSET 0\n#endif\n\n#define _COLOR_ADDR 0x7800\n\n\n\n// void _XL_PRINTD(register uint8_t x, uint8_t y, uint8_t length, register uint16_t value)\nvoid _displayShort(uint8_t x, register uint16_t value)\n{ \n    uint8_t i; \n    uint8_t old;\n    uint16_t addr;\n\n    for(i=0;i<5;++i) \n    { \n        old = value%10;\n        addr = BASE_ADDR+4+x-i;\n        value -= POKE(addr,(uint8_t) ((value)%10));\n        value/=10; \n        POKE(addr,UDG_OFFSET+48+old); \n        POKE(_COLOR_ADDR+addr,0x1);\n    } \n}\n\nvoid _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n{\n    uint8_t i = 0;\n    while(str[i]!='\\0')\n    {\n        POKE(loc(x+i,y), 192+str[i]); \n        POKE((_COLOR_ADDR+loc(x+i,y)),0x01);\n        ++i;\n    }\n}\t\n\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/tgi_alt_print.c",
    "content": "#include <tgi.h>\n\n#include \"standard_libs.h\"\n\n\nvoid _XL_CHAR(uint8_t x, uint8_t y,  char ch)\n{\n    char str[2];\n    \n    str[1]='\\0';\n    str[0] = (uint8_t) ch;\n    \n    tgi_outtextxy(x*8,y*8,str);\n}\n\nvoid _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n{\n\ttgi_outtextxy(x*8,y*8,str);\n}\n\n\nvoid _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val)\n{\n\tuint8_t i;\n\tuint8_t digit;\n    char str[2];\n    \n    str[1]='\\0';\n\t\n\tfor(i=0;i<length;++i)\n\t{\n\t\tdigit = (uint8_t) ((val)%10);\n\t\tval-= digit;\n\t\tval/=10;\n        str[0] = (uint8_t) (digit+(uint8_t) 48u);\n\t\ttgi_outtextxy((x+length-1-i)*8,y*8, str );   \n\t}\n}\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/alt_print/tgi_gfx_print.c",
    "content": "#include <tgi.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\nextern uint8_t _atari_lynx_text_color;\r\n\r\n#include \"cross_lib.h\"\r\n\r\nvoid _XL_CHAR(uint8_t x, uint8_t y,  char ch)\r\n{\r\n    if(ch==' ')\r\n    {\r\n        _XL_DRAW(x,y,_XL_NUMBER_OF_TILES+FONT_SIZE-1, _atari_lynx_text_color);\r\n    }\r\n    else\r\n    {\r\n        if((ch>='A')&&(ch<='Z'))\r\n        {\r\n            _XL_DRAW(x,y,ch-'A'+_XL_NUMBER_OF_TILES, _atari_lynx_text_color);\r\n        }\r\n        else\r\n        {\r\n            _XL_DRAW(x,y,ch-'0'+_XL_NUMBER_OF_TILES+26, _atari_lynx_text_color);\r\n        }\r\n    }\r\n}\r\n\r\n\r\nvoid _XL_PRINT(uint8_t x, uint8_t y, const char * str)\r\n{\r\n    uint8_t i;\r\n    \r\n    i=0;\r\n    while(str[i]!='\\0')\r\n    {\r\n        // _XL_DRAW(x+i,y,str[i]-'A'+_XL_NUMBER_OF_TILES,_XL_WHITE);\r\n        _XL_CHAR(x+i,y,str[i]);\r\n        ++i;\r\n    }\r\n    \r\n}\r\n\r\n\r\nvoid _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val)\r\n{\r\n    \r\n\tuint8_t i;\r\n\tuint8_t digit;\r\n\r\n\tfor(i=0;i<length;++i)\r\n\t{\r\n\t\tdigit = (uint8_t) ((val)%10);\r\n\t\tval-= digit;\r\n\t\tval/=10;\r\n        _XL_DRAW((x+length-1-i),y,(uint8_t) (digit+_XL_NUMBER_OF_TILES+26),_atari_lynx_text_color);\r\n\t}\r\n    \r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/color_definitions.h",
    "content": "\r\n#ifndef _COLOR_DEFINITIONS_H\r\n#define _COLOR_DEFINITIONS_H\r\n\r\n\r\n#if defined(__NO_GRAPHICS) || defined(_XL_NO_COLOR)\r\n    #define _XL_BLACK 0\r\n    #define _XL_WHITE 0\r\n    #define _XL_RED 0\r\n    #define _XL_CYAN 0\r\n    #define _XL_GREEN 0\r\n    #define _XL_YELLOW 0\r\n    #define _XL_BLUE 0\r\n    #define _XL_MAGENTA 0\r\n    \r\n#elif defined(__AQUARIUS__) && !defined(__CONIO_GRAPHICS)\r\n    #define _XL_CYAN (16*6)\r\n    #define _XL_BLUE (16*4)\r\n    #define _XL_YELLOW (16*CYAN)\r\n    #define _XL_RED 16\r\n    #define _XL_WHITE (16*7)\r\n    #define _XL_GREEN (16*GREEN)\r\n    #define _XL_BLACK (16*BLACK)\r\n    \r\n    // TODO: Fix this\r\n    #define _XL_MAGENTA _XL_RED\r\n#elif defined(__PV1000_GRAPHICS)\r\n    #define __PV1000_WHITE  0\r\n    #define __PV1000_CYAN   1\r\n    #define __PV1000_GREEN  2\r\n    #define __PV1000_YELLOW 3\r\n    #define __PV1000_RED    4\r\n\r\n    \r\n    #define _XL_WHITE   __PV1000_WHITE\r\n    #define _XL_CYAN    __PV1000_CYAN\r\n    #define _XL_GREEN   __PV1000_GREEN\r\n    #define _XL_RED     __PV1000_RED\r\n    #define _XL_YELLOW  __PV1000_YELLOW\r\n    #define _XL_BLACK   __PV1000_WHITE\r\n    #define _XL_BLUE    __PV1000_CYAN\r\n    #define _XL_MAGENTA __PV1000_RED\r\n\r\n#elif defined(__MO5__)\r\n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n        #define _XL_BLACK (0+7)\r\n        #define _XL_RED (16+7)\r\n        #define _XL_GREEN (32+7)\r\n        #define _XL_YELLOW (48+7)\r\n        #define _XL_BLUE (64+7)\r\n        #define _XL_MAGENTA (80+7)\r\n        #define _XL_CYAN (96+7)\r\n        #define _XL_WHITE (112+7)\r\n    #else\r\n        #define _XL_BLACK 0\r\n        #define _XL_RED 16\r\n        #define _XL_GREEN 32\r\n        #define _XL_YELLOW 48\r\n        #define _XL_BLUE 64\r\n        #define _XL_MAGENTA 80\r\n        #define _XL_CYAN 96\r\n        #define _XL_WHITE 112\r\n    #endif\r\n#elif defined(__TO7__)\r\n    #define TO7_PASTEL_OFF 192U\r\n    #define _XL_BLACK (0+TO7_PASTEL_OFF)\r\n    #define _XL_RED (8+TO7_PASTEL_OFF)\r\n    #define _XL_GREEN (16+TO7_PASTEL_OFF)\r\n    #define _XL_YELLOW (24+TO7_PASTEL_OFF)\r\n    #define _XL_BLUE (48+TO7_PASTEL_OFF)\r\n    #define _XL_MAGENTA (40+TO7_PASTEL_OFF)\r\n    #define _XL_CYAN (48+TO7_PASTEL_OFF)\r\n    #define _XL_WHITE (56+TO7_PASTEL_OFF)\r\n#elif defined(__CPCRSLIB_GRAPHICS)\r\n    #define CPC_WHITE 1\r\n    #define CPC_YELLOW 2 \r\n    #define CPC_RED 3\r\n    #define CPC_BLACK 4\r\n\r\n    #define CPC_TEXT_WHITE 3\r\n    #define CPC_TEXT_RED 4\r\n    #define CPC_TEXT_BLACK 7\r\n    #define CPC_TEXT_YELLOW 0\r\n\r\n    #define _XL_BLACK CPC_BLACK\r\n    #define _XL_BLUE CPC_WHITE\r\n    #define _XL_CYAN CPC_WHITE\r\n    #define _XL_RED CPC_RED\r\n    #define _XL_WHITE CPC_WHITE\r\n    #define _XL_YELLOW CPC_YELLOW\r\n    #define _XL_MAGENTA CPC_YELLOW\r\n    #define _XL_GREEN CPC_YELLOW\r\n#elif defined(__ANTIC_MODE6_GRAPHICS) || defined(__ATARI5200__)\r\n\r\n    #if defined(__USE_CYAN_YELLOW)\r\n        #define _ATARI_MODE1_RED 0\r\n        #define _ATARI_MODE1_WHITE 64\r\n        #define _ATARI_MODE1_BLACK 64\r\n        #define _ATARI_MODE1_CYAN 128\r\n        #define _ATARI_MODE1_YELLOW 192\r\n        #define _ATARI_MODE1_GREEN 128\r\n\r\n        #define _XL_RED _ATARI_MODE1_RED\r\n        #define _XL_WHITE _ATARI_MODE1_WHITE\r\n        #define _XL_BLACK _ATARI_MODE1_BLACK\r\n        #define _XL_BLUE _ATARI_MODE1_CYAN\r\n        #define _XL_YELLOW _ATARI_MODE1_YELLOW\r\n        #define _XL_GREEN _ATARI_MODE1_GREEN\r\n        #define _XL_CYAN _ATARI_MODE1_CYAN\r\n        #define _XL_MAGENTA _XL_RED\r\n    #elif defined(__USE_GREEN_YELLOW)\r\n        #define _ATARI_MODE1_RED 0\r\n        #define _ATARI_MODE1_WHITE 64\r\n        #define _ATARI_MODE1_BLACK 64\r\n        #define _ATARI_MODE1_YELLOW 128\r\n        #define _ATARI_MODE1_GREEN 192\r\n        #define _ATARI_MODE1_CYAN 192\r\n        \r\n\r\n        #define _XL_RED _ATARI_MODE1_RED\r\n        #define _XL_WHITE _ATARI_MODE1_WHITE\r\n        #define _XL_BLACK _ATARI_MODE1_BLACK\r\n        #define _XL_BLUE _ATARI_MODE1_CYAN\r\n        #define _XL_YELLOW _ATARI_MODE1_YELLOW\r\n        #define _XL_GREEN _ATARI_MODE1_GREEN\r\n        #define _XL_CYAN _ATARI_MODE1_CYAN\r\n        #define _XL_MAGENTA _XL_RED\r\n    #else\r\n        #define _ATARI_MODE1_RED 0\r\n        #define _ATARI_MODE1_WHITE 64\r\n        #define _ATARI_MODE1_BLACK 64\r\n        #define _ATARI_MODE1_CYAN 128\r\n        #define _ATARI_MODE1_GREEN 192\r\n        #define _ATARI_MODE1_YELLOW 64\r\n        \r\n\r\n        #define _XL_RED _ATARI_MODE1_RED\r\n        #define _XL_WHITE _ATARI_MODE1_WHITE\r\n        #define _XL_BLACK _ATARI_MODE1_BLACK\r\n        #define _XL_BLUE _ATARI_MODE1_CYAN\r\n        #define _XL_YELLOW _ATARI_MODE1_YELLOW\r\n        #define _XL_GREEN _ATARI_MODE1_GREEN\r\n        #define _XL_CYAN _ATARI_MODE1_CYAN\r\n        #define _XL_MAGENTA _XL_RED\r\n    #endif\r\n\r\n#elif defined(__NES_CONIO_GRAPHICS)\r\n\r\n    #define _NES_RED 0\r\n    #define _NES_CYAN 1\r\n    #define _NES_WHITE 2\r\n\r\n    #define _XL_BLACK COLOR_BLACK\r\n    #define _XL_RED _NES_RED\r\n    #define _XL_WHITE _NES_WHITE\r\n    #define _XL_BLUE _NES_CYAN\r\n    #define _XL_YELLOW _NES_WHITE\r\n    #define _XL_GREEN _NES_CYAN\r\n    #define _XL_CYAN _NES_CYAN\r\n    \r\n    #define _XL_MAGENTA _XL_RED\r\n\r\n#elif defined(__COMX_COLOR_GRAPHICS)\r\n\r\n    /*\r\n    \r\n    _textcolor:             ; set text to 'color' in R12.0\r\n                            ; 0: black\r\n                            ; 1: green\r\n                            ; 2: blue\r\n                            ; 3: cyan\r\n                            ; 4: red\r\n                            ; 5: yellow\r\n                            ; 6: magenta\r\n                            ; 7: white\r\n--\r\n    _textcolor:             ; set text to 'color' in R12.0\r\n                            ; 0: 'low' character color (character 0-127)\r\n                            ; 1: 'high' chatacter color (character 128-255)\r\n    */\r\n    #define _COMX_TEXT_CYAN 128\r\n    #define _COMX_TEXT_GREEN 128\r\n    #define _COMX_TEXT_YELLOW 0\r\n    #define _COMX_TEXT_RED 0\r\n    #define _COMX_TEXT_WHITE 0\r\n\r\n    #if defined(__MICRO__) \r\n        #define _COMX_BLUE 0\r\n        #define _COMX_GREEN 0\r\n        #define _COMX_CYAN 0\r\n        #define _COMX_PURPLE 128\r\n        #define _COMX_YELLOW 128\r\n        #define _COMX_WHITE  128\r\n\r\n        #define _XL_RED _COMX_PURPLE\r\n        #define _XL_WHITE _COMX_WHITE\r\n        #define _XL_BLUE _COMX_BLUE\r\n        #define _XL_YELLOW _COMX_YELLOW\r\n        #define _XL_GREEN _COMX_GREEN\r\n        #define _XL_CYAN _COMX_CYAN\r\n        \r\n        #define _XL_BLACK 0\r\n    \r\n    #elif defined(__CIDELSA__)\r\n        #define _COMX_BLUE 0\r\n        #define _COMX_GREEN 0\r\n        #define _COMX_CYAN 0\r\n        #define _COMX_PURPLE 0\r\n        #define _COMX_YELLOW 0\r\n        #define _COMX_WHITE  0\r\n\r\n        #define _XL_RED _COMX_PURPLE\r\n        #define _XL_WHITE _COMX_WHITE\r\n        #define _XL_BLUE _COMX_BLUE\r\n        #define _XL_YELLOW _COMX_YELLOW\r\n        #define _XL_GREEN _COMX_GREEN\r\n        #define _XL_CYAN _COMX_CYAN\r\n        \r\n        #define _XL_BLACK 0\r\n        \r\n        \r\n    #else\r\n        #define _COMX_BLUE 0\r\n        #define _COMX_GREEN 1\r\n        #define _COMX_CYAN 2\r\n        #define _COMX_PURPLE (0+128)\r\n        #define _COMX_YELLOW (1+128)\r\n        #define _COMX_WHITE  (2+128) \r\n\r\n        #define _XL_RED _COMX_PURPLE\r\n        #define _XL_WHITE _COMX_WHITE\r\n        #define _XL_BLUE _COMX_BLUE\r\n        #define _XL_YELLOW _COMX_YELLOW\r\n        #define _XL_GREEN _COMX_GREEN\r\n        #define _XL_CYAN _COMX_CYAN\r\n        \r\n        #define _XL_BLACK 3\r\n    #endif\r\n    #define _XL_MAGENTA _XL_RED\r\n\r\n#elif defined(__ORIC_COLOR_GRAPHICS)\r\n\r\n    #define _ORIC_NORMAL 0\r\n    #define _ORIC_INVERSE 128\r\n    \r\n    #define _XL_BLACK _ORIC_INVERSE\r\n    #define _XL_RED _ORIC_INVERSE\r\n    #define _XL_WHITE _ORIC_NORMAL\r\n    #define _XL_BLUE _ORIC_INVERSE\r\n    #define _XL_YELLOW _ORIC_NORMAL\r\n    #define _XL_GREEN _ORIC_NORMAL\r\n    #define _XL_CYAN _ORIC_NORMAL\r\n    #define _XL_MAGENTA _XL_RED\r\n#elif defined(__ATARI7800__) \r\n    #if defined(__ATARI7800_COLOR_GRAPHICS)\r\n        #define _XL_WHITE 2U\r\n        #define _XL_YELLOW 2U\r\n        #define _XL_CYAN 1U\r\n        #define _XL_BLUE _XL_CYAN\r\n        #define _XL_RED 0U\r\n        #define _XL_GREEN _XL_CYAN\r\n        #define _XL_BLACK 2U\r\n    #else\r\n        #define _XL_WHITE 3U\r\n        #define _XL_YELLOW 3U\r\n        #define _XL_CYAN 1U\r\n        #define _XL_BLUE _XL_CYAN\r\n        #define _XL_RED 0U\r\n        #define _XL_GREEN _XL_CYAN\r\n        #define _XL_BLACK 2U\r\n    #endif\r\n    #define _XL_MAGENTA _XL_RED\r\n\r\n#elif defined(__VDP_MODE1_GRAPHICS)\r\n\r\n    #if defined(__TI99__)\r\n        #define _COLOR_OFFSET -64\r\n    #else\r\n        #define _COLOR_OFFSET 0\r\n    #endif\r\n        \r\n    #if defined(__TI99__)\r\n        #define _CREAT_YELLOW (192+_COLOR_OFFSET)\r\n        #define _CREAT_GREEN  (160+_COLOR_OFFSET)\r\n    #else\r\n        #define _CREAT_YELLOW (32 +_COLOR_OFFSET)\r\n        #define _CREAT_GREEN  (0 +_COLOR_OFFSET)\r\n    #endif\r\n    #define _CREAT_WHITE  (64 +_COLOR_OFFSET)\r\n    #define _CREAT_CYAN   (96 +_COLOR_OFFSET)\r\n    #define _CREAT_RED    (128+_COLOR_OFFSET)\r\n    #define _CREAT_BLUE _CREAT_CYAN\r\n\r\n    #define _XL_RED _CREAT_RED\r\n    #define _XL_WHITE _CREAT_WHITE\r\n    #define _XL_BLUE _CREAT_BLUE\r\n    #define _XL_YELLOW _CREAT_YELLOW\r\n    #define _XL_GREEN _CREAT_GREEN\r\n    #define _XL_CYAN _CREAT_CYAN\r\n    #define _XL_BLACK _CREAT_WHITE\r\n\r\n    // TODO: Use correct definition\r\n    #define _XL_MAGENTA _CREAT_RED\r\n#elif (defined(__APPLE2__) || defined(__APPLE2ENH__)) && defined(__APPLE2_HGR_GRAPHICS)\r\n\t// TODO: This has to be fixed probably by avoiding __BACKGROUND_COLOR = a macro color\r\n\t// TODO: White option\r\n\r\n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n        #define _XL_GREEN 1\r\n        #define _XL_MAGENTA 0\r\n        #define _XL_CYAN ((_XL_MAGENTA)+4)\r\n        #define _XL_BLUE _XL_CYAN\r\n        #define _XL_RED ((_XL_GREEN)+4)\r\n        #define _XL_YELLOW _XL_RED\r\n        #define _XL_BLACK 2\r\n        #define _XL_WHITE _XL_BLUE\r\n    #else\r\n        #define _XL_WHITE 2\r\n        #define _XL_GREEN 0\r\n        #define _XL_MAGENTA 1\r\n        #define _XL_CYAN ((_XL_MAGENTA)+4)\r\n        #define _XL_BLUE _XL_CYAN\r\n        #define _XL_RED ((_XL_GREEN)+4)\r\n        #define _XL_YELLOW _XL_RED\r\n        \r\n        // TODO: Remove this hack and handle real black on white background\r\n        #define _XL_BLACK _XL_BLUE\r\n\t#endif\r\n#elif defined(__ATARI_LYNX__) && defined(__LYNX_TGI_GRAPHICS)\r\n\t// 3 -> pink\r\n\t// 0 -> white\r\n\t// 4 -> grey \r\n\t// 5 -> darker grey ?\r\n\t// 6 -> even darker grey\r\n\t// 7 -> grey/red\r\n\t// 8 -> light red\r\n\t// B -> dark green\r\n\t// C -> dark blue\r\n\t\r\n\t// #define _XL_BLACK 0x6\r\n\t\r\n\r\n\t#define _XL_BLACK 0x1\r\n\t#define _XL_RED 0x2\r\n\t#define _XL_WHITE 0x0F\r\n\t#define _XL_BLUE 0xD\r\n\t#define _XL_YELLOW 0x9\r\n\t#define _XL_GREEN 0xA\r\n\t#define _XL_CYAN 0xE\r\n\t\r\n    #define _XL_MAGENTA 0x3\r\n\r\n#elif defined(__SUPERVISION__)\r\n\r\n    #define _AUX_BLACK 0xFF\r\n    #define _AUX_DARK_GREY 0xAA\r\n    #define _AUX_LIGHT_GREY 0x55\r\n    #define _AUX_WHITE 0x00\r\n\r\n    #define _XL_BLACK _AUX_BLACK\r\n    #define _XL_WHITE _AUX_BLACK\r\n    #define _XL_YELLOW _AUX_DARK_GREY\r\n    #define _XL_RED _AUX_LIGHT_GREY\r\n    #define _XL_GREEN _AUX_BLACK\r\n    #define _XL_CYAN _AUX_DARK_GREY\r\n    #define _XL_BLUE _AUX_DARK_GREY\r\n    \r\n    #define _XL_MAGENTA _XL_RED\r\n\r\n#elif defined(__GAMATE__)\r\n    #define _AUX_BLACK COLOR_BLACK\r\n    #define _AUX_DARK_GREY 2\r\n    #define _AUX_LIGHT_GREY 1\r\n    #define _AUX_WHITE 0\r\n\r\n    #define _XL_BLACK _AUX_BLACK\r\n    #define _XL_WHITE _AUX_BLACK\r\n    #define _XL_YELLOW _AUX_DARK_GREY\r\n    #define _XL_RED _AUX_LIGHT_GREY\r\n    #define _XL_GREEN _AUX_BLACK\r\n    #define _XL_CYAN _AUX_DARK_GREY\r\n    #define _XL_BLUE _AUX_DARK_GREY\r\n    \r\n    #define _XL_MAGENTA _XL_RED\r\n\r\n#elif defined(__BIT_MAPPED_16_GRAPHICS)\r\n\r\n    #if defined(__COCO3__)\r\n        // TODO: BOGUS\r\n\r\n        #define _XL_BLACK   0x00\r\n        #define _XL_WHITE   0x11\r\n        #define _XL_GREEN   0x33\r\n        #define _XL_CYAN    0x44\r\n        #define _XL_YELLOW  0x55\r\n        #define _XL_RED     0xAA\r\n        #define _XL_BLUE    0xFF\r\n        // TODO: Use correct definition\r\n        #define _XL_MAGENTA 0xAA\r\n    \r\n    #elif defined(__AGAT__)\r\n        #define _XL_BLACK   0x00\r\n        #define _XL_WHITE   0xFF\r\n        #define _XL_GREEN   0x22 \r\n        #define _XL_CYAN    0x66\r\n        #define _XL_YELLOW  0x33\r\n        #define _XL_RED     0x11\r\n        #define _XL_BLUE    0xCC\r\n        #define _XL_MAGENTA 0xDD\r\n\r\n    #endif\r\n    \r\n\r\n#elif defined(__BBC__) && defined(__BBC_GRAPHICS)\r\n// COLORS\r\n// 0 -> black\r\n// 1 -> red\r\n// 2 -> green\r\n// 3 -> yellow\r\n// 4 -> blue\r\n// 5 -> purple\r\n// 6 -> cyan\r\n// 7 -> white\r\n\r\n    #if __BBC_MODE==130\r\n    \r\n        #define _XL_BLACK   0\r\n        #define _XL_RED     1\r\n        #define _XL_GREEN   2\r\n        #define _XL_YELLOW  3\r\n        #define _XL_MAGENTA 5\r\n        #define _XL_BLUE    4\r\n        #define _XL_CYAN    6\r\n        #define _XL_WHITE   7\r\n    #else\r\n        #define _XL_BLACK   0\r\n        #define _XL_RED     1\r\n        #define _XL_GREEN   2\r\n        #define _XL_YELLOW  3\r\n        #define _XL_MAGENTA 5\r\n        #define _XL_BLUE    2\r\n        #define _XL_CYAN    2\r\n        #define _XL_WHITE   3\r\n    #endif\r\n\r\n#elif (defined(__COCO__) || defined(__DRAGON__) || defined(__MC10__)) && defined(__BIT_MAPPED_4_GRAPHICS)\r\n\r\n    #define _COCO_RED 0xFF\r\n    #define _COCO_YELLOW 0x55\r\n    #define _COCO_CYAN 0xAA\r\n\r\n    #define _XL_BLACK _COCO_CYAN\r\n    #define _XL_WHITE _COCO_RED\r\n    #define _XL_YELLOW _COCO_YELLOW\r\n    #define _XL_RED _COCO_RED\r\n    #define _XL_GREEN _COCO_CYAN\r\n    #define _XL_CYAN _COCO_CYAN\r\n    #define _XL_BLUE _COCO_CYAN\r\n    #define _XL_MAGENTA _COCO_RED\r\n\r\n#elif defined(__TI99__)\r\n    #define _XL_BLACK COLOR_BLACK\r\n    #define _XL_RED COLOR_LTRED\r\n    #define _XL_WHITE COLOR_WHITE\r\n    #define _XL_BLUE COLOR_DKBLUE\r\n    #define _XL_YELLOW COLOR_YELLOW\r\n    #define _XL_GREEN COLOR_GREEN\r\n    #define _XL_CYAN COLOR_LTBLUE\r\n    #define _XL_MAGENTA COLOR_RED\r\n#elif defined(__CC65__) || defined(__TMC600__)\r\n\r\n    #define _XL_BLACK COLOR_BLACK\r\n    #define _XL_RED COLOR_RED\r\n    #define _XL_WHITE COLOR_WHITE\r\n    #define _XL_BLUE COLOR_BLUE\r\n    #define _XL_YELLOW COLOR_YELLOW\r\n    #define _XL_GREEN COLOR_GREEN\r\n\r\n    #if defined(COLOR_CYAN)\r\n        #define _XL_CYAN COLOR_CYAN\r\n    #else\r\n        #define _XL_CYAN COLOR_BLUE\r\n    #endif\r\n    \r\n    #if defined(COLOR_MAGENTA)\r\n        #define _XL_MAGENTA COLOR_MAGENTA\r\n    #elif defined(COLOR_PURPLE) && !defined(__C16__)\r\n        #define _XL_MAGENTA COLOR_PURPLE\r\n    #else\r\n        #define _XL_MAGENTA COLOR_RED\r\n    #endif\r\n\r\n\r\n#elif defined(__NCURSES__) || defined(__TERMINAL__)\r\n    #define _XL_YELLOW  1\r\n    #define _XL_CYAN    2\r\n    #define _XL_RED     3\r\n    #define _XL_GREEN   4\r\n    #define _XL_BLUE    5\r\n    #define _XL_WHITE   6\r\n    #define _XL_MAGENTA 7\r\n    #define _XL_BLACK   8\r\n    \r\n#elif defined(__MC1000__)\r\n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n        #define _XL_WHITE MAGENTA\r\n        #define _XL_CYAN CYAN\r\n        #define _XL_YELLOW MAGENTA\r\n        #define _XL_GREEN CYAN\r\n        #define _XL_RED RED\r\n        #define _XL_BLUE BLUE\r\n        #define _XL_BLACK BLUE\r\n    #else\r\n        #define _XL_BLACK CYAN\r\n        #define _XL_WHITE RED\r\n        #define _XL_YELLOW YELLOW\r\n        #define _XL_RED RED\r\n        #define _XL_GREEN BLUE\r\n        #define _XL_CYAN BLUE\r\n        #define _XL_BLUE BLUE\r\n    #endif\r\n    #define _XL_MAGENTA MAGENTA\r\n\r\n#elif defined(__HECTORHR__)\r\n\r\n        #define _XL_WHITE   1\r\n        #define _XL_CYAN    2\r\n        #define _XL_YELLOW  1\r\n        #define _XL_GREEN   2\r\n        #define _XL_RED     3\r\n        #define _XL_BLUE    2\r\n        #define _XL_BLACK   0\r\n        #define _XL_MAGENTA 3\r\n\r\n#elif defined(__VGA_GRAPHICS)\r\n        #define _XL_WHITE   0x0F\r\n        #define _XL_CYAN    0x0B\r\n        #define _XL_YELLOW  0x2C\r\n        #define _XL_GREEN   0x2F\r\n        #define _XL_RED     0x28\r\n        #define _XL_BLUE    0x20\r\n        #define _XL_BLACK   0x00\r\n        #define _XL_MAGENTA 0x23\r\n#else // Z88DK\r\n    #define _XL_BLACK BLACK\r\n    \r\n    \r\n    #if defined(__PC6001__) || defined(__SPC1000__) || defined(__PHC25__) || defined(__VZ__)\r\n        #undef _XL_WHITE\r\n        #if defined(__PHC25__) || defined(__VZ__)\r\n            #define _XL_WHITE 3\r\n        #else\r\n            #define _XL_WHITE 7\r\n        #endif\r\n    #else\r\n        #define _XL_WHITE WHITE\r\n    #endif\r\n\r\n    #if defined(__CPC__) || defined(__LASER500__)\r\n        #define _XL_CYAN LIGHTCYAN\r\n    #elif defined(__PHC25__) || defined(__VZ__)\r\n        #define _XL_CYAN 5 \r\n    #else\r\n        #define _XL_CYAN CYAN\r\n    #endif\r\n\r\n    #if defined(__SMS__) || defined(__GAME_GEAR__)\r\n        #define _XL_YELLOW LIGHTGRAY\r\n    #else\r\n        #define _XL_YELLOW YELLOW\r\n    #endif\r\n\r\n    #if defined(__LASER500__)\r\n        #define _XL_RED LIGHTRED\r\n        #define _XL_GREEN LIGHTGREEN\r\n        #define _XL_MAGENTA LIGHTMAGENTA\r\n        #define _XL_BLUE LIGHTBLUE\r\n    #else\r\n\r\n        #if defined(__SMS__) || defined(__GAME_GEAR__)\r\n            #define _XL_RED LIGHTRED\r\n            #define _XL_GREEN LIGHTGREEN\r\n        #elif defined(__PHC25__) || defined(__VZ__)\r\n            #define _XL_RED RED\r\n            #define _XL_GREEN 5\r\n        #else\r\n            #define _XL_RED RED\r\n            #define _XL_GREEN GREEN\r\n        #endif\r\n        #if defined(__PHC25__) || defined(__VZ__)\r\n            #define _XL_MAGENTA RED\r\n\r\n        #else\r\n            #define _XL_MAGENTA MAGENTA\r\n        #endif\r\n        \r\n        \r\n        #if defined(__PHC25__) || defined(__VZ__)\r\n            #define _XL_BLUE 5\r\n        #else\r\n            #define _XL_BLUE BLUE\r\n        #endif\r\n    #endif\r\n\r\n   \r\n\r\n#endif\r\n\r\n\r\n#endif // _COLOR_DEFINITIONS_H\r\n"
  },
  {
    "path": "src/cross_lib/display/conio_patch.h",
    "content": "\n#ifndef _CONIO_PATCH_H\n#define _CONIO_PATCH_H\n\n\n#if defined(ACK)\n    #define cputc(c) putchar(c)\n#endif\n\n#if defined(__NO_PRINT) || defined(__NO_GRAPHICS)\n    #ifndef gotoxy\n        #define gotoxy(x,y)\n    #endif\n    #ifndef clrscr\n        #define clrscr()\n    #endif\n    #ifndef textcolor\n        #define textcolor(c)\n    #endif\n#else\n    \n    #if defined(__C16__) && defined(__MEMORY_MAPPED_GRAPHICS)\n\n        // #if !defined(PEEK) && !defined(POKE)\n            // #include <peekpoke.h>\n        // #endif\n        #define textcolor(c) POKE(0x053B,c)\n        #define bgcolor(c)\n        #define bordercolor(c)\n    #endif\n\n    #if defined(__Z88DK__) || defined(ACK)\n        #define cprintf printf\n    #endif\n\n\n    #if defined(__SMS__) && defined(NEW_LIB)\n        #include <stdio.h>\n        #include <stropts.h>\n        #include <arch/sms.h>\n        #include <rect.h>\n        #include <input.h>\n        #include <arch/sms/SMSlib.h>\n        #include <arch/sms/PSGlib.h>\n\n        #define gotoxy(x,y) \\\n            SMS_setNextTileatXY(x,y)\n            \n        #define cputc(c) \\\n            SMS_setTile(c)\n\n    #endif\n\n    #if defined(__Z88DK__) && !defined(__SMS__) && !defined(__ZX80__) && !defined(__ZX81__) && !defined(__LAMBDA__)\n        #undef cputc\n        #define cputc(c) fputc_cons(c)\n    #endif\n\n    #  if defined(__ADM3A)\n        #define gotoxy(x,y) printf(\"\\033=%c%c\",y+32,x+32);\n        #define clrscr() printf(\"\\032\")\n\n    #elif defined(__ADM3A_WITH_UNDEF)\n        // TODO: Remove undef's below\n        #undef gotoxy\n        #undef clrscr \n        #define gotoxy(x,y) printf(\"\\033=%c%c\",y+32,x+32);\n        #define clrscr() printf(\"\\032\")\t\n    #elif defined(__VT52)\n        #undef gotoxy\n        #define gotoxy(x,y) printf(\"\\033Y%c%c\",y+32,x+32)\n\n        #undef clrscr\n        #define clrscr() printf(\"\\033E\")\n\n    #elif defined(__VT100)\n        #undef gotoxy\n        #define gotoxy(x,y) printf(\"\\033[%d;%dH\", y+1, x+1)\n\n        #undef clrscr\n        #define clrscr() printf(\"\\033[2J\\033[H\")\n\n    #elif defined(__PDP)\n/*\n                       <ESC>+     FUNCTION\n                       ---------------------------------------------------\n     \n                       =          Alternate keypad mode\n                       >          Exit alternate keypad mode\n                       A          Move cursor up one line\n                       B          Move cursor down one line\n                       C          Move cursor left one space\n                       D          Move cursor right one space\n                       F          Enter graphics mode\n                       G          Exit graphics mode\n                       H          Home cursor\n                       I          Reverse scroll\n                       J          Erase screen from cursor to bottom\n                       K          Erase screen from cursor to end of line\n                       Z          Ident terminal type\n                       [          Enter hold screen mode\n                       ]          \"Copy\" screen to printer\n                       \\          Exit hold screen mode\n                       ----------------------------------------------------\n*/\n        #include <stdio.h>\n        \n        // TODO: BOGUS gotoxy\n        #define gotoxy(x,y)\n        // #define gotoxy(x,y) printf(\"\\033[%d;%dH\", y+1, x+1)\n        #define clrscr() printf(\"\\033H\\033J\")\n        \n    #elif defined(__ATARI_LYNX__)\n        #include <tgi.h>\n        #include <stdio.h>\n        #include <lynx.h>\n        \n        #define gotoxy(a,b) tgi_gotoxy(a*8,b*8)\n        #define clrscr() tgi_clear()\n        #define cprintf(str) tgi_outtext(str)\n        #define cputc(c) \n        #define textcolor tgi_setcolor\n\n    #elif defined(__SUPERVISION__)\n        #include <stdio.h>\n        \n        #define gotoxy(a,b) \n        #define clrscr() \n        #define cprintf \n        #define cputc(c) \t\n        #define textcolor\n        \n    #elif defined(__ZX81__) || defined(__ZX80__) || defined(__LAMBDA__)\n        #undef gotoxy\n        \n        #if defined(__ZX80__) && defined(ZX80_GEN_TV_FIELD)\n            #undef gotoxy\n            #undef cputc\n            #define gotoxy(x,y) do {gen_tv_field(); zx_setcursorpos(y,x); gen_tv_field();} while(0)\n            #define cputc(c) do { gen_tv_field(); fputc_cons(c); gen_tv_field(); } while(0)\n        #else\n            #define gotoxy(x,y) zx_setcursorpos(y,x)\n        #endif\n        \n\n     \n    #elif (defined(__MSX__) && defined(__MEMORY_MAPPED_GRAPHICS)) || (defined(__SVI__) && defined(MSX_MODE0))\n        #define gotoxy(a,b)     printf(\"\\033Y%c%c\",b+31+1,a+31)\n        #define clrscr() printf(\"\\033E\") \n\n\n    #elif defined(__KC__)\n        #include <stdio.h>\n        \n        #define gotoxy(x,y) do \\\n            { \\\n            printf(\"\\1B%c%c\",y+0x80, x+0x80); \\\n            \\\n            } while(0)\n            \n        #define clrscr() printf(\"\\0C\");\n\n        #define cprintf printf\n\n    #elif defined(__COCO__) || defined(__DRAGON__)\n\n        #define cprintf printf\n        #define gotoxy(x,y) locate(y,x)\n        #define cputc(c) printf(\"%c\",c)\n        \n    #elif defined(__MO5__) || defined(__TO7__)\n        #include \"coco.h\" // uint8_t definition\n        void SWITCH_COLOR_BANK_OFF(void);\n        void SWITCH_COLOR_BANK_ON(void);\n        \n        void PUTCH(unsigned char ch);\n        \n        #define cputc(c) \\\n            PUTCH(c)\n\n        void gotoxy(uint8_t x, uint8_t y);\n                \n            \n    #elif defined(__NCURSES__)\n        #if defined(WIN32)\n            #include <ncurses/curses.h>\n        #else\n            #include <ncurses.h>\n        #endif\n        \n        #define gotoxy(x,y) do { move(y,x); refresh(); } while(0)\n        #define cputc(c) do { addch(c); refresh(); } while(0)\n\n    #else\n        //\n    #endif\n\n#endif // defined(__NO_PRINT) || defined(__NO_GRAPHICS)\n#endif // _CONIO_PATCH_H\n\n"
  },
  {
    "path": "src/cross_lib/display/display_macros.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#ifndef POKE\n    #define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\n#endif\n\n#if defined(__ATARI__) && (defined(__ANTIC_MODE6_GRAPHICS) ) \nextern uint16_t BASE_ADDR;\n#endif\n\n#if defined(__AQUARIUS__) && defined(__MEMORY_MAPPED_GRAPHICS)\nvoid _XL_SET_TEXT_COLOR(uint8_t c)\n{\n    if(c==_XL_WHITE)\n    {\n        textcolor(WHITE);\n    }\n    else if(c==_XL_RED)\n    {\n        textcolor(RED);\n    }\n    else if(c==_XL_YELLOW)\n    {\n        textcolor(YELLOW);\n    }\n    else if(c==_XL_GREEN)\n    {\n        textcolor(GREEN);\n    }\n    else if(c==_XL_CYAN)\n    {\n        textcolor(CYAN);\n    }\n    else if(c==_XL_BLUE)\n    {\n        textcolor(BLUE);\n    }\n}\n#endif\n\n// #if defined(__SUPERVISION__) || (defined(__COCO__) && defined(__BIT_MAPPED_4_GRAPHICS)) || (defined(__MC10__) && defined(__BIT_MAPPED_4_GRAPHICS))\n#if defined(__BIT_MAPPED_4_GRAPHICS)\n    extern uint8_t udgs[];\n\n    uint8_t _bitmap4_text_color;\n\n    void _color_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\n    {\n        uint8_t k;\n        uint16_t offset = (_XL_TILE_Y_SIZE*(uint16_t)(tile)); // uint8_t does not work on CoCo and Dragon but it does work on Supervision\n        \n        uint16_t base = 2*x+BYTES_PER_LINE*_XL_TILE_Y_SIZE*(y);\n\t\tuint8_t udg;\n        \n        for(k=0;k<_XL_TILE_Y_SIZE;++k)\n        {\n\t\t\tudg=udgs[offset++];\n            SV_VIDEO[base]    = left_map_one_to_two(udg)&color;\n            SV_VIDEO[++base]  = right_map_one_to_two(udg)&color;\n            base+=BYTES_PER_LINE-1;\n        }\n    }\n\n    void _color_delete(uint8_t x, uint8_t y)\n    {\n        uint8_t k;\n        uint16_t base = 2*x+BYTES_PER_LINE*_XL_TILE_Y_SIZE*(y);\n        // uint16_t delta = 0;\n        \n        for(k=0;k<_XL_TILE_Y_SIZE;++k)\n        {\n\n            // SV_VIDEO[base]=0;\n            // SV_VIDEO[base+1]=0;\n            // base+=BYTES_PER_LINE;\n\t\t\tSV_VIDEO[base]=0;\n            SV_VIDEO[++base]=0;\n\t\t\tbase+=BYTES_PER_LINE-1;\n            // base+=BYTES_PER_LINE;\n        }\n    }\n#elif defined(__BIT_MAPPED_16_GRAPHICS)\n\n    extern uint8_t udgs[];\n\n    uint8_t _bitmap16_text_color;\n\n    void _color_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\n    {\n        uint8_t k;\n        uint16_t offset = (_XL_TILE_Y_SIZE*(uint16_t)(tile)); // uint8_t does not work on CoCo and Dragon but it does work on Supervision\n        \n        uint16_t base = 4*x+BYTES_PER_LINE*_XL_TILE_Y_SIZE*(y);\n        // uint16_t delta = 0;\n\t\tuint8_t udg;\n        \n        for(k=0;k<_XL_TILE_Y_SIZE;++k)\n        {\n\t\t\tudg = udgs[offset++];\n            SV_VIDEO[base]    = first_map_one_to_four(udg)&color;\n            SV_VIDEO[++base]  = second_map_one_to_four(udg)&color;\n            SV_VIDEO[++base]  = third_map_one_to_four(udg)&color;\n            SV_VIDEO[++base]  = fourth_map_one_to_four(udg)&color;\n            // SV_VIDEO[base]    = 0xFF;\n            // SV_VIDEO[++base]  = 0xFF;\n            // SV_VIDEO[++base]  = 0xFF;\n            // SV_VIDEO[++base]  = 0xFF;\t\n            base+=BYTES_PER_LINE-3;\n        }\n    }\n\n    void _color_delete(uint8_t x, uint8_t y)\n    {\n        uint8_t k;\n        uint16_t base = 4*x+BYTES_PER_LINE*_XL_TILE_Y_SIZE*(y);\n\t\t\n        for(k=0;k<_XL_TILE_Y_SIZE;++k)\n        {\n\n            SV_VIDEO[base]=0;\n            SV_VIDEO[++base]=0;\n\t\t\tSV_VIDEO[++base]=0;\n            SV_VIDEO[++base]=0;\n            base+=BYTES_PER_LINE-3;\n        }\n    }\n#endif \n\n\n#if defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n// TODO: MOVE THIS TO GRAPHICS INIT?\n    uint8_t quad_tile[1+27+10+26][4] = {\n        {      ' ',      ' ',      ' ',      ' '},     // 32 [SPACE]\n        \n        {_TILE_0_0,_TILE_0_1,_TILE_0_2,_TILE_0_3},     // 33\n        {_TILE_1_0,_TILE_1_1,_TILE_1_2,_TILE_1_3},     // 34\n        {_TILE_2_0,_TILE_2_1,_TILE_2_2,_TILE_2_3},     // 35\n        {_TILE_3_0,_TILE_3_1,_TILE_3_2,_TILE_3_3},     // 36\n        {_TILE_4_0,_TILE_4_1,_TILE_4_2,_TILE_4_3},     // 37\n        {_TILE_5_0,_TILE_5_1,_TILE_5_2,_TILE_5_3},     // 38\n        {_TILE_6_0,_TILE_6_1,_TILE_6_2,_TILE_6_3},     // 39\n        {_TILE_7_0,_TILE_7_1,_TILE_7_2,_TILE_7_3},     // 40\n        {_TILE_8_0,_TILE_8_1,_TILE_8_2,_TILE_8_3},     // 41\n        {_TILE_9_0,_TILE_9_1,_TILE_9_2,_TILE_9_3},     // 42\n        {_TILE_10_0,_TILE_10_1,_TILE_10_2,_TILE_10_3}, // 43\n        {_TILE_11_0,_TILE_11_1,_TILE_11_2,_TILE_11_3}, // 44\n        {_TILE_12_0,_TILE_12_1,_TILE_12_2,_TILE_12_3}, // 45\n        {_TILE_13_0,_TILE_13_1,_TILE_13_2,_TILE_13_3}, // 48\n        {_TILE_14_0,_TILE_14_1,_TILE_14_2,_TILE_14_3}, // 47\n\n        {      '0',      ' ',      ' ',      ' '},     // 48 [0]\n        {      '1',      ' ',      ' ',      ' '},     // 49\n        {      '2',      ' ',      ' ',      ' '},     // 50\n        {      '3',      ' ',      ' ',      ' '},     // 51\n        {      '4',      ' ',      ' ',      ' '},     // 52\n        {      '5',      ' ',      ' ',      ' '},     // 53\n        {      '6',      ' ',      ' ',      ' '},     // 54\n        {      '7',      ' ',      ' ',      ' '},     // 55\n        {      '8',      ' ',      ' ',      ' '},     // 56\n        {      '9',      ' ',      ' ',      ' '},     // 57 [9]        \n        \n        {_TILE_15_0,_TILE_15_1,_TILE_15_2,_TILE_15_3}, // 58\n        {_TILE_16_0,_TILE_16_1,_TILE_16_2,_TILE_16_3}, // 59\n        {_TILE_17_0,_TILE_17_1,_TILE_17_2,_TILE_17_3}, // 60\n        {_TILE_18_0,_TILE_18_1,_TILE_18_2,_TILE_18_3}, // 61\n        {_TILE_19_0,_TILE_19_1,_TILE_19_2,_TILE_19_3}, // 62\n        {_TILE_20_0,_TILE_20_1,_TILE_20_2,_TILE_20_3}, // 63\n        {_TILE_21_0,_TILE_21_1,_TILE_21_2,_TILE_21_3}, // 64\n                \n        {      'A',      ' ',      ' ',      ' '},     // 65 [A]\n        {      'B',      ' ',      ' ',      ' '},     // 66\n        {      'C',      ' ',      ' ',      ' '},     // 67\n        {      'D',      ' ',      ' ',      ' '},     // 68\n        {      'E',      ' ',      ' ',      ' '},     // 69\n        {      'F',      ' ',      ' ',      ' '},     // 70\n        {      'G',      ' ',      ' ',      ' '},     // 71\n        {      'H',      ' ',      ' ',      ' '},     // 72\n        {      'I',      ' ',      ' ',      ' '},     // 73\n        {      'J',      ' ',      ' ',      ' '},     // 74\n        {      'K',      ' ',      ' ',      ' '},     // 75\n        {      'L',      ' ',      ' ',      ' '},     // 76\n        {      'M',      ' ',      ' ',      ' '},     // 77\n        {      'N',      ' ',      ' ',      ' '},     // 78\n        {      'O',      ' ',      ' ',      ' '},     // 79\n        {      'P',      ' ',      ' ',      ' '},     // 80\n        {      'Q',      ' ',      ' ',      ' '},     // 81\n        {      'R',      ' ',      ' ',      ' '},     // 82\n        {      'S',      ' ',      ' ',      ' '},     // 83\n        {      'T',      ' ',      ' ',      ' '},     // 84\n        {      'U',      ' ',      ' ',      ' '},     // 85\n        {      'V',      ' ',      ' ',      ' '},     // 86\n        {      'W',      ' ',      ' ',      ' '},     // 87\n        {      'X',      ' ',      ' ',      ' '},     // 88\n        {      'Y',      ' ',      ' ',      ' '},     // 89\n        {      'Z',      ' ',      ' ',      ' '},     // 90 [Z]\n\n        {_TILE_22_0,_TILE_22_1,_TILE_22_2,_TILE_22_3}, // 91\n        {_TILE_23_0,_TILE_23_1,_TILE_23_2,_TILE_23_3}, // 92\n        {_TILE_24_0,_TILE_24_1,_TILE_24_2,_TILE_24_3}, // 93\n        {_TILE_25_0,_TILE_25_1,_TILE_25_2,_TILE_25_3}, // 94\n        {_TILE_26_0,_TILE_26_1,_TILE_26_2,_TILE_26_3}, // 95\n    };   \n// -------------------------\n\n#endif\n\n#if defined(__MC10__)\n    void mc10_display_poke(uint16_t addr, uint8_t val)\n    {\n        #if !defined(__REVERSE_LETTERS)\n        if((val>='A')&&(val<='Z')) // TODO: Change this to allow negative letters\n        {\n            val = val-64;\n        }\n        #endif\n        POKE(addr,val);\n    }\n#endif\n\n\n#if defined(__VDP_WAIT_V_SYNC)\n    void vdp_waitvsync(void)\n    { \n        #asm \n            ld hl,_tick_count \n            ld a,(hl) \n        loop: \n            cp (hl) \n            jr nz,loop \n        #endasm \n        return;\n    }\n#endif\n\n#if (defined(__VDP_MODE1_GRAPHICS) || defined(__MEMORY_MAPPED_GRAPHICS) || defined(__QUAD_MEMORY_MAPPED_GRAPHICS) || defined(__ORIC_COLOR_GRAPHICS) || defined(__ANTIC_MODE6_GRAPHICS) || defined(__ATARI7800_COLOR_GRAPHICS))\n    \n\t\n    #if defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n        #define X_MULT 2\n        #define Y_MULT 2\n    #else\n        #define X_MULT 1\n        #define Y_MULT 1\n    #endif\n\n    uint16_t loc(uint8_t x, uint8_t y)\n    {\n        #if !defined(__CIDELSA__)\n            #if defined(__CREATIVISION__)\n                #if !defined(_CREAT_XSIZE)\n                    #define _CREAT_XSIZE XSize\n                #endif\n                return ((uint16_t) BASE_ADDR)+(x+X_OFFSET)+(uint8_t)(Y_OFFSET+y)*((uint16_t) (_CREAT_XSIZE));\n            #else\n                return ((uint16_t) BASE_ADDR)+(X_MULT)*x+(uint8_t)((Y_MULT)*y)*((uint16_t) ((XSize) + X_OFFSET));\n            #endif\n        #else\n            return ((uint16_t) 0xF800+XSize*YSize-YSize)-x*YSize+(uint8_t)y;\n    #endif\n    }\n\n#elif defined(__Z88DK_SPRITES_GRAPHICS)\n\n\t#if SPRITE_Y_SIZE==8\n\t\t#include \"z88dk_sprites_definitions.h\"\n\t#elif SPRITE_Y_SIZE==6\n\t\t#include \"z88dk_8x6_sprites_definitions.h\"\n\t#endif\n    extern uint8_t sprites[];\n\n#elif defined(__BUFFERED_GRAPHICS)\n    #if defined(_XL_NO_LOWER_BORDER)\n        #define LOWER_BORDER_OFFSET 1\n    #else\n        #define LOWER_BORDER_OFFSET 0\n    #endif\n    uint8_t video_buffer[YSize+Y_OFFSET][XSize];\n    \n    #if !defined(__DOUBLE_BUFFER)\n    void __display_all(void)\n    {\n        uint8_t j; \n        uint8_t i;\n        \n        for(j=0;j<YSize-1+Y_OFFSET-LOWER_BORDER_OFFSET;++j)\n        {\n            for(i=0;i<XSize;++i)\n            {\n                putchar(video_buffer[j][i]);\n            }\n            putchar('\\n');\n        }\n        for(i=0;i<XSize;++i)\n        {\n            putchar(video_buffer[YSize-1+Y_OFFSET-LOWER_BORDER_OFFSET][i]);\n        }\n        putchar('\\n');\n    }\n    #endif\n#elif defined(__MO5__)\n/*\nCOLOR:\nlda $a7c0\n anda #$f0\n sta $a7c0\n\n\nFORMS:\nlda $a7c0\n ora #$01\n sta $a7c0\n*/\n\n\n    void SWITCH_COLOR_BANK_ON(void)\n    {\n        asm\n        {\n            swi\n            .byte 4\n        }    \n    }\n    \n    void SWITCH_COLOR_BANK_OFF(void)\n    {\n        asm\n        {\n            swi\n            .byte 6\n        }    \n    }    \n    \n    void PUTCH(unsigned char ch)\n    {\n        asm\n        {\n            ldb ch\n            swi\n            .byte 2\n        }\n    }\n    \n\n    void gotoxy(uint8_t x, uint8_t y)\n    {\n        PUTCH(0x1F);\n        PUTCH(0x40+y);\n        PUTCH(0x41+x);\n    }    \n    \n#elif defined(__TO7__)\n    #define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\n\n    void SWITCH_COLOR_BANK_ON(void)\n    {\n        asm\n        {\n            LDA $E7C3\n            ANDA #254\n            STA $E7C3\t\n        }  \n    }\n    \n    void SWITCH_COLOR_BANK_OFF(void)\n    {\n        asm\n        {\n            LDA $E7C3\n            ORA #1\n            STA $E7C3\n        }    \n    }    \n\n    void PUTCH(unsigned char ch)\n    {\n        asm\n        {\n            ldb ch\n            jsr    0xE803\n        }\n    }\n    \n    void gotoxy(uint8_t x, uint8_t y)\n    {\n        PUTCH(0x1F);\n        PUTCH(0x40+y);\n        PUTCH(0x41+x);\n    }    \n    \n#elif defined(__BIT_MAPPED_4_GRAPHICS)\n    const uint8_t map_one_to_two_lookup[16] = \n    {  \n    #if defined(__COCO__) || defined(__DRAGON__) || defined(__MC10__)\n        0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,\n        0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF\n    #elif defined(__SUPERVISION__)\n        0x00, 0xC0, 0x30, 0xF0, 0x0C, 0xCC, 0x3C, 0xFC,\n        0x03, 0xC3, 0x33, 0xF3, 0x0F, 0xCF, 0x3F, 0xFF\n    #endif\n    }; \n        \n    uint8_t left_map_one_to_two(uint8_t n)\n    {\n        return map_one_to_two_lookup[n >> 4];\n    }\n    \n    uint8_t right_map_one_to_two(uint8_t n)\n    {\n        return map_one_to_two_lookup[n&0x0F];\n    }\n#elif defined(__BIT_MAPPED_16_GRAPHICS)\n    const uint8_t map_one_to_four_lookup[4] = \n    {  \n        // 0x00000000, \n\t\t// 0b00001111, \n\t\t// 0b11110000, \n\t\t// 0b11111111,\n\t\t0x00,\n\t\t0x0F, \n\t\t0xF0, \n\t\t0xFF,\n    }; \n        \n    uint8_t first_map_one_to_four(uint8_t n)\n    {\n        return map_one_to_four_lookup[n >> 6];\n    }\n    \n    uint8_t second_map_one_to_four(uint8_t n)\n    {\n        return map_one_to_four_lookup[(n >> 4)&0x03];\n    }\n\n    uint8_t third_map_one_to_four(uint8_t n)\n    {\n        return map_one_to_four_lookup[(n >> 2)&0x03];\n    }\n    \n    uint8_t fourth_map_one_to_four(uint8_t n)\n    {\n        return map_one_to_four_lookup[n&0x03];\n    }\n#endif\n\n\n#ifndef X_OFFSET\n  COMPILATION ERROR\n#endif\n    \n#ifndef Y_OFFSET\n  COMPILATION ERROR\n#endif\n\n#if defined(__MO5__) || defined(__TO7__)\n\n    #define _THOMSON_BLACK 64\n    #define _THOMSON_RED 65\n    #define _THOMSON_GREEN 66\n    #define _THOMSON_YELLOW 67\n    #define _THOMSON_BLUE 68\n    #define _THOMSON_MAGENTA 69\n    #define _THOMSON_CYAN 70\n    #define _THOMSON_WHITE 71\n    #define _THOMSON_GREY 72\n\n    void _XL_SET_TEXT_COLOR(uint8_t c)\n    {\n        PUTCH(0x1B);\n        if(c==_XL_WHITE)\n        {\n            PUTCH(_THOMSON_WHITE);\n        }\n        else if(c==_XL_RED)\n        {\n            PUTCH(_THOMSON_RED);\n        }\n        else if(c==_XL_GREEN)\n        {\n            PUTCH(_THOMSON_GREEN);\n        }\n        else if (c==_XL_YELLOW)\n        {\n            PUTCH(_THOMSON_YELLOW);\n        }\n        else if(c==_XL_BLUE)\n        {\n            PUTCH(_THOMSON_BLUE);\n        }\n        else if(c==_XL_CYAN)\n        {\n            PUTCH(_THOMSON_CYAN);\n        }\n        else if(c==_XL_WHITE)\n        {\n            PUTCH(_THOMSON_WHITE);\n        }\n        else\n        {\n            PUTCH(_THOMSON_BLACK);\n        }\n    }\n#endif\n\n\n#if defined(__Z88DK_SPRITES_GRAPHICS) && defined(__ALT_PRINT)\n    void __draw_ch(uint8_t x, uint8_t y, uint8_t ch)\n    {\n        _XL_DELETE(x,y); \n\n        putsprite(spr_or,x*(__SPRITE_X_STEP),y*(__SPRITE_Y_STEP),sprites + ((ch-32U)*(2+SPRITE_Y_SIZE)));\n    }\n#endif\n\n\n\n#if defined(__DEFAULT_CLEAR_SCREEN)\n    void _XL_CLEAR_SCREEN(void)\n    {\n        uint8_t i;\n        uint8_t j;\n        \n        for(i=0;i<XSize;++i)\n        {\n\n            for(j=0;j<YSize+Y_OFFSET;++j)\n            {\n                _XL_DELETE(i,j);\n            }\n        }\n    }\n    \n#endif\n\n\n\n#if defined(__MEMORY_MAPPED_GRAPHICS)\n    #if !defined(_XL_NO_COLOR)\n        void _XL_DRAW(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\n        {\n            COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(x)) +(uint16_t)(y)*(XSize)),(color));\n            DISPLAY_POKE(loc(x,y), (tile));\n        }\n    #else\n        void __DRAW_NO_COLOR(uint8_t x, uint8_t y, uint8_t tile)\n        {\n            DISPLAY_POKE(loc(x,y), (tile));\n        }   \n    #endif\n\t\n\tvoid _XL_DELETE(uint8_t x, uint8_t y)\n\t{\n\t\tDISPLAY_POKE(loc(x,y), _SPACE);\n\t}\n#endif\n\n\n#if defined(__BBC_GRAPHICS)\n\n    #include <stdint.h>\n    void osputc(__reg(\"a\") char)=\"\\tjsr\\t0xffee\";\n\n    void _gotoxy(uint8_t x, uint8_t y)\n    {\n        osputc(31);\n        osputc(x);\n        osputc(y);\n    }\n\n    void _select_color(uint8_t color)\n    {\n        osputc(17);\n        osputc(color);\n    }\n\n    #if !defined(_XL_NO_COLOR)\n        void _bbc_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\n        {\n            _gotoxy(x,y);\n            _select_color(color);\n            osputc(tile);\n        }\n    \n    #else\n        void _bbc_draw(uint8_t x, uint8_t y, uint8_t tile)\n        {\n            _gotoxy(x,y);\n            osputc(tile);\n        }\n    \n    #endif\n    \n    void _bbc_delete(uint8_t x, uint8_t y)\n    {\n        _gotoxy(x,y);\n        putchar(' ');\n    }\n#endif\n\n\n\n\n#if defined(__TERMINAL__)\n\n#if _XL_TILE_X_SIZE==8\n    #define _MAX_BIT_VALUE 128\n\n    #if _XL_TILE_Y_SIZE==8\n        #include \"8x8_chars.h\"\n\n    #elif _XL_TILE_Y_SIZE==6\n        #include \"8x6_chars.h\"\n    #endif\n#elif _XL_TILE_X_SIZE==7\n    #define _MAX_BIT_VALUE 64\n\n    #include \"7x8_chars.h\"\n\n#elif _XL_TILE_X_SIZE==6\n    #define _MAX_BIT_VALUE 32\n\n    #if _XL_TILE_Y_SIZE==8\n        #include \"6x8_chars.h\"\n        \n    #elif _XL_TILE_Y_SIZE==9\n        #include \"6x9_chars.h\"\n    #endif\n#endif\n\n\n\n    #define _WIDTH 4\n    \n    \n    #define _gotoxy(x,y) do { move(y,x); } while(0)\n    #define _cputc(c) do { addch(c);  } while(0)\n\n    #if defined(WIN32)\n        #include <ncurses/curses.h>\n    #else\n        #include <ncurses.h>\n    #endif    \n\n    extern uint8_t _tiles[_XL_NUMBER_OF_TILES][_XL_TILE_Y_SIZE];\n    \n    void _terminal_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\n    {\n        uint8_t i;\n        uint8_t j;\n        uint8_t k;\n        uint8_t n;\n        \n\n        for(i=0;i<_XL_TILE_Y_SIZE;++i)\n        {\n            k = _MAX_BIT_VALUE;\n            for(j=0;j<_XL_TILE_X_SIZE;++j)\n            {\n                if(k & _tiles[tile][i])\n                {\n                    attron(COLOR_PAIR(color));\n                }\n                else\n                {   \n                    attron(COLOR_PAIR(_XL_BLACK));\n                }\n                \n                for(n=1;n<=_WIDTH;++n)\n                {\n                    _gotoxy(_WIDTH*(_XL_TILE_X_SIZE*(x)+j)+n,_XL_TILE_Y_SIZE*(y)+i);\n                    _cputc(' ');\n                }\n                \n                k/=2;\n            }\n        }\n        refresh();\n    }\n\n    void _terminal_delete(uint8_t x, uint8_t y)\n    {\n        uint8_t i;\n        uint8_t j;\n        uint8_t n;\n        \n        attron(COLOR_PAIR(_XL_BLACK));\n\n        for(i=0;i<_XL_TILE_Y_SIZE;++i)\n        {\n            for(j=0;j<_XL_TILE_X_SIZE;++j)\n            {\n                for(n=1;n<=_WIDTH;++n)\n                {\n                    _gotoxy(_WIDTH*(_XL_TILE_X_SIZE*(x)+j)+n,_XL_TILE_Y_SIZE*(y)+i);\n                    _cputc(' ');\n                }\n                \n            }\n        }\n        refresh();\n    }\n\n#endif\n\n\n#if defined(__DOUBLE_BUFFER) && !defined(__BUFFERED_GRAPHICS)\n    #if defined(__CC65__)\n        void _XL_REFRESH(void)\n            {\n                memcpy((uint8_t *)REAL_BASE_ADDR, (uint8_t *)BASE_ADDR,XSize*YSize);\n            }\n    #else\n        void _XL_REFRESH(void)\n        {\n            uint16_t i;\n           \n            for(i=0;i<(XSize)*(YSize);++i) \\\n            {\n                POKE(REAL_BASE_ADDR+i,PEEK(BASE_ADDR+i));\n            }\n        }\n    #endif\n#endif\n\n\n\n#if defined(__BBC__)\n\n    #include <stdint.h>\n    \n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n    {\n        uint8_t i = 0;\n        \n        _gotoxy(X_OFFSET+x,Y_OFFSET+y);\n        while(str[i]!='\\0')\n        {\n            osputc(str[i++]);\n        }\n    }\n\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch)\n    {\n        _gotoxy(x+X_OFFSET,Y_OFFSET+y);\n        osputc(ch);\n    }\n\n#include <stdio.h>\n\nvoid _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val)\n{\n\tuint8_t i;\n\tuint8_t digit;\n\n\tfor(i=0;i<length;++i)\n\t{\n\t\tdigit = (uint8_t) ((val)%10);\n\t\tval-= digit;\n\t\tval/=10;\n        _gotoxy(x+length-1-i,y);\n        osputc((uint8_t) (digit+(uint8_t) 48u));\n\t}\n}\n\n    #if !defined(_XL_NO_TEXT_COLOR) || !defined(_XL_NO_COLOR)\n        #include <stdio.h>\n        void _XL_SET_TEXT_COLOR(uint8_t c)\n        {\n            osputc(17);\n            osputc(c);\n        }\n    \n    #endif\n\n#endif\n\n#if defined(__CONIO_PRINT) \n\n    #if !defined(__VT52)\n        #include <conio.h>\n    #endif\n    \n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str)\n    {\n        gotoxy(X_OFFSET+x,Y_OFFSET+y);\n        cprintf(str);\n    }\n\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch)\n    {\n        gotoxy(x+X_OFFSET,Y_OFFSET+y);\n        cputc(ch);\n    }\n#endif\n"
  },
  {
    "path": "src/cross_lib/display/display_macros.h",
    "content": "/* --------------------------------------------------------------------------------------- */\n//\n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications,\n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */\n\n#ifndef _DISPLAY_MACROS\n#define _DISPLAY_MACROS\n\n#include \"cross_lib.h\"\n#include \"display_target_color.h\"\n\n#if !defined(__NO_GRAPHICS)\n    #if defined(__INCLUDE_CONIO_H)\n        #include <conio.h>\n    #elif defined(__CMOC__) && !defined(__WINCMOC__)\n        #include <coco.h>\n    #endif\n#endif\n\n#include \"conio_patch.h\"\n\n#include \"standard_libs.h\"\n\n\n#if defined(__BUFFERED_GRAPHICS)\n    extern uint8_t video_buffer[YSize+Y_OFFSET][XSize];\n#endif\n\n#if defined(__Z88DK_SPRITES_GRAPHICS)\n    extern uint8_t sprites[];\n#endif\n\n#if defined(__Z88DK_SPRITES_GRAPHICS) && defined(__ALT_PRINT)\n    void __draw_ch(uint8_t x, uint8_t y, uint8_t ch);\n#endif\n\n#if defined(__VGA_GRAPHICS)\n    void _init_vga(void);\n    void _display_tile(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\n    void _delete_vga_segment(uint8_t x, uint8_t y);\n    void _delete_vga_tile(uint16_t x, uint16_t y);\n#endif\n\n\n#if defined(__VIC20__)\n    #define SET_DEBUG_BORDER()     POKE(36879u, 12)\n    #define UNSET_DEBUG_BORDER()   POKE(36879u,  8)\n#elif defined(__C64__)\n    #define SET_DEBUG_BORDER()     POKE(53280u,  1)\n    #define UNSET_DEBUG_BORDER()   POKE(53280u,  0)\n#else\n    #define SET_DEBUG_BORDER()\n    #define UNSET_DEBUG_BORDER()\n#endif\n\n\n#if defined(__USE_WAIT_V_SYNC)\n\n    #if defined(__MSX__) || defined(__SVI__) || defined(__M5__) || defined(__MTX__)\n        #define __VDP_WAIT_V_SYNC\n    #endif\n\n    #if defined(__VIC20__) || defined(__C16__) || defined(__PLUS4__) || defined(__C64__) || \\\n        defined(__APPLE2ENH__) || defined(__PCE__) || defined(__NES__) || \\\n        defined(__GAMATE__) || defined(__CBM510__) || defined(__CX16__) || \\\n        defined(__ATARI__) || defined(__ATARI5200__)\n        #define _XL_WAIT_VSYNC() waitvsync()\n    #elif defined(__GB__)\n        #include <gb/gb.h>\n        #define _XL_WAIT_VSYNC() wait_vbl_done()\n    #elif defined(__VDP_WAIT_V_SYNC)\n        void vdp_waitvsync(void);\n        #include <interrupt.h>\n        #define _XL_WAIT_VSYNC() vdp_waitvsync()\n    #else\n        #define _XL_WAIT_VSYNC()\n    #endif\n#else\n    #define _XL_WAIT_VSYNC()\n#endif\n\n\n#if !defined(__BUFFERED_GRAPHICS) && !defined(__DOUBLE_BUFFER)\n\n    #define _XL_REFRESH()\n#elif defined(__DOUBLE_BUFFER) && !defined(__BUFFERED_GRAPHICS)\n    void _XL_REFRESH(void);\n#elif defined(ZX80_GEN_TV_FIELD)\n\n    #define _XL_REFRESH() gen_tv_field()\n    \n#else\n    void __display_all(void);\n\n    #include \"buffered_graphics.h\"\n    #define __REFRESH() \\\n        do \\\n        { \\\n            putchar('\\n'); \\\n            __display_all(); \\\n        } while(0);\n\n    #if !defined(__EMCC__)\n        #define _XL_REFRESH() __REFRESH()\n    #else\n        #define _XL_REFRESH() \\\n            do \\\n            { \\\n                __REFRESH(); \\\n                fflush(stdout); \\\n            } while(0)\n    #endif\n#endif\n\n\n// PRINT AND PRINTD\n#  if defined(__ALT_DISPLAY_STATS)\n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str);\n    // void _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val);\n    void _displayShort(uint8_t x, uint16_t val);\n    #define _XL_PRINTD(x,y,length,val) _displayShort(x,val)\n    uint16_t loc(uint8_t x, uint8_t y);\n    #define _XL_CHAR(x,y,ch)\n#elif defined(__NO_PRINT)\n    #define _XL_PRINT(x,y,str)\n    #define _XL_PRINTD(x,y,length, val)\n    #define _XL_CHAR(x,y,ch)\n#elif defined(__ATARI__) && defined(__ANTIC_MODE6_GRAPHICS)\n    void _GOTOXY(uint8_t x, uint8_t y);\n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str);\n    void _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val);\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch);\n// #elif defined(__TERMINAL__)\n\n    // #define _XL_PRINT(x,y,str)\n    // #define _XL_PRINTD(x,y,length, val)\n    // #define _XL_CHAR(x,y,ch)\n\n\n\n#elif defined(__NCURSES__) && !defined(__TERMINAL__)\n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str);\n    #define _XL_PRINTD(x,y,length,val) \\\n    do { \\\n        move(y,x); \\\n        printw(\"%0\" #length \"u\",val); \\\n        refresh(); \\\n    } while(0)\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch);\n\n#elif defined(__ALT_PRINT)\n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str);\n    void _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val);\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch);\n\n#elif defined(__NO_BOTTOM)\n    #define _XL_PRINT(x,y,str) \\\n    do \\\n    { \\\n\t\tif(y<YSize-1) \\\n\t\t{ \\\n\t\t\tgotoxy(X_OFFSET+x,Y_OFFSET+y); \\\n\t\t\tcprintf(str); \\\n\t\t} \\\n    } while(0)\n\n    #define _XL_PRINTD(x,y,length,val) \\\n    do \\\n    { \\\n\t\tif(y<YSize-1) \\\n\t\t{ \\\n\t\t\tgotoxy(x+X_OFFSET,Y_OFFSET+y); \\\n\t\t\tcprintf(\"%0\" #length \"u\",val); \\\n\t\t} \\\n    } while(0)\n\n    #define _XL_CHAR(x,y,ch) \\\n    do \\\n    { \\\n\t\tif(y<YSize-1) \\\n\t\t{ \\\n\t\t\tgotoxy(x+X_OFFSET,Y_OFFSET+y); \\\n\t\t\tcputc(ch); \\\n\t\t} \\\n    } while(0)\n\n#elif defined(__BBC__)\n\n    #include <stdint.h>\n\n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str);\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch);\n\n    void _XL_PRINTD(uint8_t x, uint8_t y, uint8_t length, uint16_t val);\n\n#elif !defined(__NO_PRINT)\n    \n    #define __CONIO_PRINT\n\n    \n    void _XL_PRINT(uint8_t x, uint8_t y, const char * str);\n    void _XL_CHAR(uint8_t x, uint8_t y, char ch);\n    \n\n    #define _XL_PRINTD(x,y,length,val) \\\n    do \\\n    { \\\n        gotoxy(x+X_OFFSET,Y_OFFSET+y); \\\n        cprintf(\"%0\" #length \"u\",val); \\\n    } while(0)\n\n\n#endif\n\n#if defined(__NO_SCREEN_COLOR_INIT) || defined(__NO_GRAPHICS)\n    #define _setScreenColors()\n#else\n    #define _setScreenColors() \\\n    do \\\n    { \\\n        _SET_BORDER_COLOR(__BORDER_COLOR); \\\n        _SET_BACKGROUND_COLOR(_XL_BACKGROUND_COLOR); \\\n    } while(0)\n#endif\n\n\n// COLORS\n#if defined(__ATARI5200__)\n    #define _XL_SET_TEXT_COLOR(c) textcolor(c>>6)\n#elif defined(__ATARI__) && (defined(__ANTIC_MODE6_GRAPHICS))\n    extern uint8_t _atari_text_color;\n    #define _XL_SET_TEXT_COLOR(c) _atari_text_color = (c)\n#elif defined(__TERMINAL__)\n    extern uint8_t _terminal_text_color;\n    #define _XL_SET_TEXT_COLOR(c) _terminal_text_color = (c)\n#elif defined(__APPLE2__) && (defined(__APPLE2_HGR_GRAPHICS))\n    extern uint8_t _apple2_text_color;\n    #define _XL_SET_TEXT_COLOR(c) _apple2_text_color = (c)\n#elif defined(__VGA_GRAPHICS)\n    extern uint8_t _vga_text_color;\n    #define _XL_SET_TEXT_COLOR(c) _vga_text_color = (c)\n#elif defined(__MO5__) || defined(__TO7__)\n    void _XL_SET_TEXT_COLOR(uint8_t c);\n#elif defined(__BIT_MAPPED_16_GRAPHICS)\n    extern uint8_t _bitmap16_text_color;\n    #define _XL_SET_TEXT_COLOR(c) _bitmap16_text_color = (c)\n#elif defined(__SUPERVISION__) || (defined(__COCO__)&&defined(__BIT_MAPPED_4_GRAPHICS))\n    extern uint8_t _bitmap4_text_color;\n    #define _XL_SET_TEXT_COLOR(c) _bitmap4_text_color = (c)\n#elif defined(_XL_NO_TEXT_COLOR)\n    #define _XL_SET_TEXT_COLOR(c)\n#elif defined(__ATARI_LYNX__)\n    #if defined(__LYNX_TGI_GRAPHICS)\n        extern uint8_t _atari_lynx_text_color;\n        #define _XL_SET_TEXT_COLOR(c) (_atari_lynx_text_color=(c))\n    #else\n        #define _XL_SET_TEXT_COLOR(c) tgi_setcolor(c)\n    #endif\n#elif defined(__NCURSES__) || defined(__TERMINAL__)\n        #if defined(WIN32)\n            #include <ncurses/curses.h>\n        #else\n            #include <ncurses.h>\n        #endif\n    #define _XL_SET_TEXT_COLOR(c) attron(COLOR_PAIR(c))\n#elif defined(__CPC__) && defined(__CPCRSLIB_GRAPHICS)\n    #define CPC_TEXT_WHITE 3\n    #define CPC_TEXT_RED 4\n    #define CPC_TEXT_BLACK 7\n    #define CPC_TEXT_YELLOW 0\n\n    #define _XL_SET_TEXT_COLOR(c) \\\n    if(c==_XL_WHITE) \\\n    { \\\n        textcolor(CPC_TEXT_WHITE); \\\n    } \\\n    else if(c==_XL_RED) \\\n    { \\\n        textcolor(CPC_TEXT_RED); \\\n    } \\\n    else \\\n    { \\\n        textcolor(CPC_TEXT_YELLOW); \\\n    }\n#elif defined(__BBC__) \n    void _XL_SET_TEXT_COLOR(uint8_t c);\n#elif defined(__MC10__)\n    #define _XL_SET_TEXT_COLOR(c)\n#elif defined(__AQUARIUS__) && defined(__MEMORY_MAPPED_GRAPHICS)\n    void _XL_SET_TEXT_COLOR(uint8_t c);\n#elif defined(__COMX__) || defined(__PECOM__) || defined(__CIDELSA__) || defined(__MICRO__)\n    #define _XL_SET_TEXT_COLOR(c) textcolor(_COMX_TEXT_WHITE)\n    // #define _XL_SET_TEXT_COLOR(c)\n#else\n    #define _XL_SET_TEXT_COLOR(c) textcolor(c)\n#endif\n\n\n#if defined(__Z88DK_SPRITES_GRAPHICS) || defined(__MO5__)||defined(__TO7__) || defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__)\n\t#define _Z88DK_SPRITE_OFFSET (0x20)\n#else\n\t#define _Z88DK_SPRITE_OFFSET 0x00\n#endif\n\n#if defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__)\n    #define NOT_INVERTED 64\n    #define INVERTED -64\n#endif\n\n#  if defined(__VIC20__) && (defined(__VIC20_EXP_8K) && !defined(__CONIO_GRAPHICS)) && !defined(_XL_NO_UDG)\n    #define _SPACE 0x72\n#elif defined(__VIC20__) && defined(__VIC20_UNEXPANDED) && !defined(_XL_NO_UDG)\n    #define _SPACE 0xA0\n#elif (defined(__ATARI__) && defined(__ANTIC_MODE6_GRAPHICS))\n    #define _SPACE 0\n#elif defined(__C16__) && !defined(_XL_NO_UDG) && defined(__MEMORY_MAPPED_GRAPHICS)\n    #define _SPACE 0x60\n\t// If you use the kernal routine, you risk to get a corrupted space character\n#elif defined(__Z88DK_SPRITES_GRAPHICS)\n    #if defined(__FEWER_SPRITES)\n        #define _SPACE 64\n    #else\n        #define _SPACE 96\n    #endif\n#elif defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__)\n    #define _SPACE (' '+NOT_INVERTED)\n#elif defined(__ATARI5200__) || defined(__ATARI7800_COLOR_GRAPHICS)\n    #define _SPACE 0\n#elif defined(__CPCRSLIB_GRAPHICS)\n    #define _SPACE (19*2)\n#else\n    #define _SPACE ' '\n#endif\n\n\n// CLEAR SCREEN\n#  if defined(__DEFAULT_CLEAR_SCREEN)\n    void _XL_CLEAR_SCREEN(void);\n#elif defined(__MSDOS86__)\n    #define _XL_CLEAR_SCREEN() _init_vga()\n#elif defined(__NO_CLEAR_SCREEN)\n    #define _XL_CLEAR_SCREEN()\n#elif defined(__TI99__)\n    #include <vdp.h>\n    #define _XL_CLEAR_SCREEN() vdpmemset(gImage, 32, 768)\n#elif defined(__ATARI_LYNX__)\n    #define _XL_CLEAR_SCREEN() tgi_bar(0,0,159,101)\n#elif defined(__CPC__) && defined(__CPCRSLIB_GRAPHICS)\n    #define _XL_CLEAR_SCREEN() printf(\"\\x1B[37;40m\\x1B[2J\")\n#elif defined(__ATMOS__)\n    #define _XL_CLEAR_SCREEN() do {clrscr(); _XL_INIT_GRAPHICS(); } while(0)\n#elif defined(__Z88DK_SPRITES_GRAPHICS)\n    #include <games.h>\n    #include <graphics.h>\n    #define _XL_CLEAR_SCREEN() clg()\n#elif defined(__NCURSES__) || defined(__TERMINAL__)\n        #if defined(WIN32)\n            #include <ncurses/curses.h>\n        #else\n            #include <ncurses.h>\n        #endif\n    #if defined(_DEBUG_FLAG) && _DEBUG_FLAG==1\n        #define _XL_CLEAR_SCREEN() \\\n            do \\\n            { \\\n                uint8_t i; \\\n                \\\n                clear(); \\\n                \\\n                for(i=0;i<YSize;++i) \\\n                { \\\n                    _XL_DRAW(XSize,i,_TILE_0,_XL_WHITE); \\\n                } \\\n                for(i=0;i<XSize;++i) \\\n                { \\\n                    _XL_DRAW(i,YSize,_TILE_0,_XL_WHITE); \\\n                } \\\n            } while(0)\n    #else\n        #define _XL_CLEAR_SCREEN() clear()\n    #endif\n#elif (defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__) || defined(__MICRO__))\n    #include <devkit/video/vis_video.h>\n    #if defined(__DRACO__)\n        #define REAL_XSIZE 27\n    #else\n        #define REAL_XSIZE 25\n    #endif\n    #define _XL_CLEAR_SCREEN() vidclr(BASE_ADDR,XSize*40)\n#elif defined(__MO5__)||defined(__TO7__)\n    #define _XL_CLEAR_SCREEN() PUTCH(12);\n\n#elif defined(__ASSEMBLY_CLEAR_SCREEN)\n    #if defined(__C16__)\n        #define _XL_CLEAR_SCREEN() \\\n            __asm__(\"LDX #$04\"); \\\n            __asm__(\"LDY #$0C\"); \\\n            __asm__(\"LDA #$60\"); \\\n            __asm__(\"JSR $C5A7\");\n    #endif\n// KERNAL routine uses ASCII character 0x20 (32), whereas memory mapped sets space character at 0x60\n#elif defined(__KERNAL_CLEAR_SCREEN) && !defined(__MEMORY_MAPPED_GRAPHICS)\n    #if defined(__C16__)\n        #define _XL_CLEAR_SCREEN() __asm__(\"jsr $D88B\")\n    #elif defined(__VIC20__)\n        #define _XL_CLEAR_SCREEN() __asm__(\"jsr $E55F\")\n    #endif\n#else // CONIO case\n    #define _XL_CLEAR_SCREEN() clrscr()\n#endif\n\n\n// BORDER AND BACKGROUND COLORS\n#if defined(__CC65__) && !defined(__NES_CONIO_GRAPHICS) && !defined(__ATARI5200__) && !defined(__SUPERVISION__) && defined(__CONIO_GRAPHICS)\n    #define _SET_BORDER_COLOR(c) (void) bordercolor(c)\n    #define _SET_BACKGROUND_COLOR(c) (void) bgcolor (c)\n#elif defined(__SAM__)\n    #define _SET_BORDER_COLOR(c) {}\n    #define _SET_BACKGROUND_COLOR(c) {}\n#elif (defined(__Z88DK__) && !defined(_XL_NO_UDG)) || defined(__AQUARIUS__)\n    #define _SET_BORDER_COLOR(c) (void) bordercolor(c)\n    #define _SET_BACKGROUND_COLOR(c) (void) textbackground(c)\n#else\n    #define _SET_BORDER_COLOR(c) {}\n    #define _SET_BACKGROUND_COLOR(c) {}\n#endif\n\n\n\n#if !defined(__NO_INIT_GRAPHICS)\n    void _XL_INIT_GRAPHICS(void);\n#else\n    #define _XL_INIT_GRAPHICS() _setScreenColors()\n#endif\n\n#endif // _DISPLAY_MACROS\n\n"
  },
  {
    "path": "src/cross_lib/display/display_target_color.h",
    "content": "#ifndef _DISPLAY_TARGET_COLOR\n#define _DISPLAY_TARGET_COLOR\n\n#include \"cross_lib.h\"\n\n#include \"display_target_geometry.h\"\n\n\n#if defined(__GAL__) \\\n    || (defined(__PC6001__) && !(__SCREEN_MODE==2)) \\\n    || (defined(__ATARI5200__) && !defined(__ANTIC_MODE6_GRAPHICS)) \\\n    || (defined(__CREATIVISION__) && !defined(__VDP_MODE1_GRAPHICS)) \\\n    || defined(__WINCMOC__) || (defined(__COCO3__)&&!defined(__BIT_MAPPED_16_GRAPHICS)) || (defined(__COCO__)&&!defined(__BIT_MAPPED_4_GRAPHICS)) || (defined(__DRAGON__)&&!defined(__BIT_MAPPED_4_GRAPHICS)) || defined(__OSIC1P__) \\\n    || (defined(__MC1000__)  && !(__SCREEN_MODE==2)) \\\n    || defined(__LAMBDA__) || (defined(__MSX__) && defined(__MEMORY_MAPPED_GRAPHICS)) \\\n    || (defined(__VZ__) && defined(_XL_NO_UDG)) \\\n    || (defined(__ATARI__) && !defined(__ANTIC_MODE6_GRAPHICS)) \\\n    || defined(__PET__) || defined(__CBM610__) || ((defined(__APPLE2__) || defined(__APPLE2ENH__)) && !defined(__APPLE2_HGR_GRAPHICS)) \\\n    || defined(__ZX81__) || defined(__ZX80__) || defined(__ACE__) \\\n    || defined(__TRS80__) || defined(__PX8__) || defined(__PX4__) \\\n    || defined(__ABC80__) || defined(__ABC800__) || defined(__SRR__) \\\n    || defined(__KC__) || (defined(__ATMOS__) && !defined(__ORIC_COLOR_GRAPHICS)) \\\n    || defined(__VECTREX__) || defined(__GB__) \\\n    || defined(__NC100__) || defined(__NC200__)\n    #if !defined(_XL_NO_COLOR)\n        #define _XL_NO_COLOR \n    #endif\n#endif\n\n//  defined(__COMX__) || defined(__PECOM__) || defined(__CIDELSA__) || defined(__MICRO__)\n#if defined(_XL_NO_COLOR) || defined(__PV1000_GRAPHICS) || defined(__NES__) \\\n    || defined(__CREATIVISION__) || defined(__ORIC__) || defined(__ATMOS__) || defined(__TI99__) \\\n\t|| defined(__COMX__) || defined(__PECOM__) || defined(__CIDELSA__) || defined(__MICRO__) \\\n\t|| defined(__ATARI7800_COLOR_GRAPHICS)\n    #define _XL_NO_TEXT_COLOR\n#endif\n\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n\t#define _XL_BACKGROUND_COLOR _XL_WHITE\n\t#define __BORDER_COLOR _XL_WHITE\n#else\n\t#define _XL_BACKGROUND_COLOR _XL_BLACK\n\t#define __BORDER_COLOR _XL_BLACK\n#endif\n\n\n#endif // _DISPLAY_TARGET_COLOR\n"
  },
  {
    "path": "src/cross_lib/display/display_target_geometry.h",
    "content": "#ifndef DISPLAY_TARGET_GEOMETRY_H\n#define DISPLAY_TARGET_GEOMETRY_H\n\n#if defined(__Z88DK_SPRITES_GRAPHICS)\n\n#if (defined(__TRS80__) && !defined(__EG2K__) && defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t|| (defined(__OSBORNE1__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t#define EXTRA_TINY_Y\n\t#define EXTRA_TINY_X\n#endif\n#if defined(__TI82__) && defined(__Z88DK_SPRITES_GRAPHICS)\n\t#define EXTRA_TINY_X\n#endif\n\n#if !defined(__SPRITE_Y_STEP)\n\t#if !defined(EXTRA_TINY_Y)\n\t\t#define __SPRITE_Y_STEP 5\t\n\t#else\n\t\t#define __SPRITE_Y_STEP 3\n\t#endif\n#endif\n\n#if !defined(__SPRITE_X_STEP)\n\t#if !defined(EXTRA_TINY_X)\n\t\t#define __SPRITE_X_STEP 7\t\n\t#else\n\t\t#define __SPRITE_X_STEP 6\n\t#endif\t\n#endif\n\n#if !defined(SPRITE_X_SIZE)\n\t#define SPRITE_X_SIZE 8\n#endif\n\n#if !defined(SPRITE_Y_SIZE)\n\t#define SPRITE_Y_SIZE 8\n#endif\n\n\t\t\n\t#ifndef __SPRITE_X_STEP\n\t\t#define __SPRITE_X_STEP SPRITE_X_SIZE\n\t#endif\n\t\n\t#ifndef __SPRITE_Y_STEP\n\t\t#define __SPRITE_Y_STEP SPRITE_Y_SIZE\n\t#endif\n#endif\n\n\n#if !defined(YSize)\n\t#  if defined(__NCURSES__)\n\t\t#define YSize (24-Y_OFFSET)\n\t#elif defined(__CIDELSA__) // DRACO/DESTROYER/ALTAIR\n\t\t#define YSize (40-Y_OFFSET)\n\t#elif defined(__PPS__)\n\t\t#define YSize (32-Y_OFFSET)\n\t#elif defined(__Z1013__)\n\t\t  #define YSize (32-Y_OFFSET)\n\t#elif defined(__SRR__)\n\t\t  #define YSize (30-Y_OFFSET)\n\t#elif defined(__KC__) && defined(__Z88DK_SPRITES_GRAPHICS)\n\t\t  #define YSize ((256/__SPRITE_Y_STEP)-Y_OFFSET)\t\n\t#elif (defined(__KC__) && !defined(_XL_NO_UDG)) \\\n\t\t  || defined(__CAMPUTERS_LYNX__)\n\t\t  #define YSize (32-Y_OFFSET)\t\t  \n\t#elif defined(__ATMOS__) || defined(__NES__) \n\t\t#define YSize (28-Y_OFFSET)\t  \n\t#elif defined(__CBM610__) || defined(__PET__) || (defined(__C128__) && !defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t\t  || defined(__C16__) || defined(__PLUS4__) || defined(__C64__) \\\n\t\t  || defined(__PET__) || defined(__CBM510__) \\\n\t\t  || defined(__MZ__) || defined(__BEE__) || defined(__X1__) \\\n\t\t  || defined(__PCE__) || defined(__CPC__) || defined(__VG5K__)  \\\n\t\t  || defined(__ENTERPRISE__) \\\n\t\t  || defined(__FP1100__) \\\n\t\t  || defined(__MULTI8__) \\\n\t\t  || defined(__MO5__) || defined(__TO7__)\n\t\t#define YSize (25-Y_OFFSET)\n\t#elif defined(__CREATIVISION__) || defined(__MSX__) || defined(__SVI__) \\\n\t\t|| defined(__ZX81__) || defined(__ZX80__) || defined(__LAMBDA__) \\\n\t\t|| (defined(__SPECTRUM__) && !defined(__TS2068__)) || defined(__SC3000__) || defined(__MTX__) \\\n\t\t|| defined(__APPLE2ENH__) || defined(__APPLE2__) \\\n\t\t|| defined(__Z9001__) || defined(__P2000__) \\\n\t\t|| defined(__ATARI__) \\\n\t\t|| defined(__ATARI5200__) \\\n\t\t|| defined(__ACE__) \\\n\t\t|| defined(__EINSTEIN__) \\\n\t\t|| defined(__OSIC1P__) \\\n\t\t|| defined(__MC1000__) \\\n\t\t|| defined(__M5__) \\\n\t\t|| (defined(__AQUARIUS__) && !defined(QUAD_MEMORY_MAP)) \\\n\t\t|| defined(__COLECO__) \\\n\t\t|| defined(__PV2000__) \\\n\t\t|| defined(__PV1000__) \\\n\t\t|| (defined(__EG2K__) && !!defined(_XL_NO_UDG))  \\\n\t\t|| (defined(__EG2K__) && !defined(_XL_NO_UDG)) \\\n\t\t|| defined(__ALPHATRO__) || defined(__ABC80__) \\\n\t\t|| defined(__LASER500__) \\\n\t\t|| (defined(__OSCA__) && !defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t\t|| defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__MICRO__)\n\t\t#define YSize (24-Y_OFFSET)\n\t#elif defined(__VIC20__) \\\n\t\t|| defined(__RX78__)\n\t\t#define YSize 23\n\t#elif defined(__SPC1000__)\n\t\t#define YSize 22\n\t#elif defined(__SAM__)\n\t\t#define YSize (24-2-Y_OFFSET)\n\t#elif (defined(__TS2068__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize (192/__SPRITE_Y_STEP -Y_OFFSET)\n\t#elif (defined(__NC200__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((128/__SPRITE_Y_STEP)-Y_OFFSET)\n\t#elif defined(__SUPERVISION__)\n\t\t#define YSize 20\n\t#elif defined(__GAMATE__)\n\t\t#define YSize 19\t\n\t#elif defined(__ATARI_LYNX__)\n\t\t#define YSize 13\n\t#elif (defined(__PX4__) && defined(Z88DK_PUTC4X6))\n\t\t#define YSize (10+1)\n\t#elif defined(__Z88__) || (defined(__PX8__) && !defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t\t|| ((defined(__TI82__) || defined(__TI83__) || defined(__TI8X__) || defined(__TI85__) || defined(__TI86__)) && !defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize 8\n\t#elif defined(__G800__)\n\t\t#define YSize 7\n\t#elif ((defined(__TI82__) || defined(__TI83__) || defined(__TI8X__) || defined(__TI85__) || defined(__TI86__)) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((64/__SPRITE_Y_STEP)+1)\n\t#elif (defined(__VZ__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((64/__SPRITE_Y_STEP)+1)\n\t#elif (defined(__PX8__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((64/__SPRITE_Y_STEP)+1)\t\t\n\t#elif (defined(__PX4__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((64/__SPRITE_Y_STEP)+1)\n\t#elif (defined(__OSBORNE1__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((48/__SPRITE_Y_STEP)-1)\n\t#elif defined(__TIKI100__)\n\t\t#define YSize ((256/__SPRITE_Y_STEP)-Y_OFFSET)\n\t#elif (defined(__NC100__) && defined(__Z88DK_SPRITES_GRAPHICS)) \n\t\t#define YSize ((64/__SPRITE_Y_STEP)+1)\n\t#elif (defined(__TRS80__) && !defined(__EG2K__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((48/__SPRITE_Y_STEP)-1)\n\t#elif defined(__KAYPRO83__)\n\t\t#define YSize (50/__SPRITE_Y_STEP)\n\t#elif defined(__KAYPRO__)\n\t\t#define YSize (100/__SPRITE_Y_STEP)\n\t#elif defined(__ATTACHE__) && defined(__Z88DK_SPRITES_GRAPHICS)\n\t\t#define YSize (240/__SPRITE_Y_STEP)\t\n\t#elif (defined(__OZ__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize (80/__SPRITE_Y_STEP)\n\t#elif (defined(__C128_Z80__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((200/__SPRITE_Y_STEP)-Y_OFFSET)\n\t#elif (defined(__Z88__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define YSize ((64/__SPRITE_Y_STEP))\n\t#elif (defined(__PC6001__) && __SCREEN_MODE==2) || (defined(__COCO__) || defined(__DRAGON__)) && defined(__BIT_MAPPED_GRAPHICS)\n\t\t#define YSize 24\n\t#else\n\t\t#define YSize 16\n\t#endif\n#endif\n\n\n#if !defined(XSize)\n\t#  if defined(__NCURSES__)\n\t\t#define XSize 80\n\t#elif defined(__CBM610__) || defined(__PET__) || (defined(__C128__) && defined(C128_80COL_VIDEO_MODE)) \\\n\t\t  || defined(__BEE__) || defined(__PET__) || defined(__CBM610__) \\\n\t\t  || (defined(__PX8__) && !defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t\t  || (defined(__APPLE2ENH__) && defined(APPLE2ENH_80COL_VIDEO_MODE)) \\\n\t\t  || defined(__PPS__) || (defined(__MULTI8__) && !defined(_XL_NO_UDG)) \\\n\t\t  || (defined(__TS2068__) && !defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize 80\n\t#elif defined(__SRR__) || (defined(__TRS80__) && !defined(__EG2K__) && !defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize 64\n\t#elif defined(__PCE__) || (defined(__PX4__) && defined(Z88DK_PUTC4X6))\n\t\t #define XSize 60\n\t#elif defined(__TIKI100__)\n\t\t#define XSize (1024/__SPRITE_X_STEP)\n\t#elif ((defined(__NC100__) || defined(__NC200__)) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (480/__SPRITE_X_STEP)\n\t#elif (defined(__PX8__) && defined(__Z88DK_SPRITES_GRAPHICS))\t\n\t\t#define XSize (480/__SPRITE_X_STEP)\n\t#elif (defined(__PX4__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (240/__SPRITE_X_STEP)\n\t#elif (defined(__ATTACHE__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (320/__SPRITE_X_STEP)\t\n\t#elif (defined(__OZ__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (239/__SPRITE_X_STEP)\n\t#elif (defined(__OSBORNE1__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (104/__SPRITE_X_STEP)\n\t#elif (defined(__C128_Z80__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (640/__SPRITE_X_STEP)\n\t#elif defined(__NASCOM__)\t\n\t\t#define XSize 48\n\t#elif defined(__VG5K__) || (defined(__APPLE2ENH__) && !defined(APPLE2ENH_80COL_VIDEO_MODE))|| defined(__APPLE2__) \\\n\t\t  || defined(__Z9001__) || defined(__P2000__) || defined(__ABC80__) \\\n\t\t  || defined(__X1__) || defined(__ATMOS__) \\\n\t\t  || (defined(__CPC__) && defined(__CPCRSLIB_GRAPHICS)) || defined(__C16__) || defined(__PLUS4__) || defined(__C64__) \\\n\t\t  || (defined(__C128__) && !defined(__Z88DK_SPRITES_GRAPHICS) && !defined(C128_80COL_VIDEO_MODE)) \\\n\t\t  || (defined(__AQUARIUS__) && !defined(QUAD_MEMORY_MAP)) || (defined(__SVI__) && defined(MSX_MODE0)) \\\n\t\t  || defined(__ENTERPRISE__) \\\n\t\t  || (defined(__ATARI__) && !defined(__ANTIC_MODE6_GRAPHICS)) \\\n\t\t  || defined(__CBM510__) \\\n\t\t  || defined(__FP1100__) \\\n\t\t  || (defined(__EG2K__) && !defined(_XL_NO_UDG)) \\\n\t\t  || (defined(__EG2K__) && !!defined(_XL_NO_UDG)) \\\n\t\t  || defined(__ALPHATRO__) \\\n\t\t  || defined(__LASER500__) \\\n\t\t  || (defined(__OSCA__) && !defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t\t  || defined(__MO5__) || defined(__TO7__) \\\n\t\t  || defined(__COMX__) || defined (__PECOM__) || defined(__TMC600__) || defined(__MICRO__)\n\t\t#define XSize (40-X_OFFSET)\n\t#elif defined(__KC__) && defined(__Z88DK_SPRITES_GRAPHICS)\n\t\t#define XSize (320/__SPRITE_X_STEP)\n\t#elif (defined(__TS2068__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (512/__SPRITE_X_STEP)\n\t#elif (defined(__VZ__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (128/__SPRITE_X_STEP)\n \t#elif defined(__KAYPRO83__)\n\t\t#define XSize (80/__SPRITE_X_STEP)   \n\t#elif defined(__KAYPRO__)\n\t\t#define XSize (160/__SPRITE_X_STEP)\n\t#elif ((defined(__TI82__) ) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize ((96/__SPRITE_X_STEP))\n\t#elif ((defined(__TI83__)) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize ((96/__SPRITE_X_STEP)+1)\n\t#elif ((defined(__TI8X__)) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize ((96/__SPRITE_X_STEP)+1)\t\n\t#elif ((defined(__TI85__) || defined(__TI86__)) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (128/__SPRITE_X_STEP)\t\n\t#elif (defined(__TRS80__) && !defined(__EG2K__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (128/__SPRITE_X_STEP)\n\t#elif (defined(__Z88__) && defined(__Z88DK_SPRITES_GRAPHICS))\n\t\t#define XSize (256/__SPRITE_X_STEP)\n\t#elif defined(__KC__) && !defined(_XL_NO_UDG)\n\t\t#define XSize 40\n    #elif (defined(__COCO__) || defined(__DRAGON__)) && defined(__BIT_MAPPED_4_GRAPHICS)\n        #define XSize 16\n\t#elif (defined(__VZ__) && !defined(__Z88DK_SPRITES_GRAPHICS)) || defined(__NES__) || defined(__CREATIVISION__) || defined(__MSX__) \\\n\t\t  || (defined(__SVI__) && !defined(MSX_MODE0) ) || defined(__ZX81__) || defined(__ZX80__) \\\n\t\t  || defined(__LAMBDA__) || (defined(__SPECTRUM__)&&!defined(__TS2068)) || (defined(__PC6001__) && !defined(__SCREEN_MODE))\\\n\t\t  || defined(__SC3000__) || defined(__MC1000__) || defined(__MTX__) || defined(__SAM__) \\\n\t\t  || defined(__GAL__) || defined(__COCO__) || defined(__DRAGON__) || defined(__WINCMOC__) \\\n\t\t  || defined(__Z1013__) || defined(__Z88__) || defined(__ACE__) \\\n\t\t  || defined(__EINSTEIN__) \\\n\t\t  || ((defined(__TI82__) || defined(__TI83__) || defined(__TI8X__) || defined(__TI85__) || defined(__TI86__)) && !defined(__Z88DK_SPRITES_GRAPHICS)) \\\n\t\t  || defined(__M5__) || defined(__COLECO__) \\\n\t\t  || defined(__PV2000__) || defined(__MZ__) \\\n\t\t  || defined(__CAMPUTERS_LYNX__)\n\t\t#define XSize 32\n\t#elif defined(__PV1000__)\n\t\t#define XSize 28\n\t#elif defined(__CIDELSA__) && defined(__DRACO__)\n\t\t#define XSize 27\n\t#elif defined(__CIDELSA__) && (defined(__DESTROYER__) || defined(__ALTAIR__))\n\t\t#define XSize 25\n\t#elif defined(__OSIC1P__) || defined(__G800__) || defined(__RX78__) \n\t\t#define XSize 24\n\t#elif defined(__VIC20__) \n\t\t#define XSize 22\n\t#elif (defined(__ATARI__) && defined(__ANTIC_MODE6_GRAPHICS)) \\\n\t\t  || defined(__ATARI_LYNX__) || defined(__SUPERVISION__) \\\n\t\t  || defined(__ATARI5200__) || defined(__GAMATE__)\n\t\t#define XSize 20\n\t#elif defined(__PC6001__) && __SCREEN_MODE==2\n\t\t#define XSize 16\n\t#else\n\t\t#define XSize 16\n\t#endif\n#endif\n\n\n\n#if !defined(Y_OFFSET)\n    #define Y_OFFSET 0\n#endif\n\n#if !defined(X_OFFSET)\n    #if defined(__ATMOS__)\n        #define X_OFFSET 2\n    #else\n        #define X_OFFSET 0\n    #endif\n#endif\n\n#endif // _DISPLAY_TARGET_GEOMETRY_H \n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/antic_mode6_graphics.h",
    "content": "#ifndef _ATARI_MODE1_COLOR_GRAPHICS_H\r\n#define _ATARI_MODE1_COLOR_GRAPHICS_H\r\n\r\n#include \"standard_libs.h\"\r\n\r\n\r\n#if defined(__ATARI5200__)\r\n    #define BASE_ADDR 0x3E20\r\n#else\r\n    #define BASE_ADDR_VALUE (PEEK(88)+PEEK(89)*256)\r\n#endif\r\n\r\n#define DISPLAY_POKE(addr,val) (*(uint8_t*) (addr) = (val))\r\n\r\n#define _XL_DRAW(x,y, tile,color) \\\r\n    DISPLAY_POKE((uint16_t) loc(x,y), tile+color);\r\n\r\n\r\n#define _XL_DELETE(x,y) DISPLAY_POKE(loc(x,y), _SPACE)\r\n\r\nuint16_t loc(uint8_t x, uint8_t y);\r\n  \r\n#endif // _ATARI_MODE1_COLOR_GRAPHICS_H\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/apple2_hgr_graphics.h",
    "content": "\r\n#ifndef _APPLE2_HGR_H\r\n#define _APPLE2_HGR_H\r\n\r\n/*\r\nunsigned HB2[]={\r\n0x4000, 0x4400, 0x4800, 0x4C00, 0x5000, 0x5400, 0x5800, 0x5C00,\r\n0x4080, 0x4480, 0x4880, 0x4C80, 0x5080, 0x5480, 0x5880, 0x5C80,\r\n0x4100, 0x4500, 0x4900, 0x4D00, 0x5100, 0x5500, 0x5900, 0x5D00,\r\n0x4180, 0x4580, 0x4980, 0x4D80, 0x5180, 0x5580, 0x5980, 0x5D80,\r\n0x4200, 0x4600, 0x4A00, 0x4E00, 0x5200, 0x5600, 0x5A00, 0x5E00,\r\n0x4280, 0x4680, 0x4A80, 0x4E80, 0x5280, 0x5680, 0x5A80, 0x5E80,\r\n0x4300, 0x4700, 0x4B00, 0x4F00, 0x5300, 0x5700, 0x5B00, 0x5F00,\r\n0x4380, 0x4780, 0x4B80, 0x4F80, 0x5380, 0x5780, 0x5B80, 0x5F80,\r\n0x4028, 0x4428, 0x4828, 0x4C28, 0x5028, 0x5428, 0x5828, 0x5C28,\r\n0x40A8, 0x44A8, 0x48A8, 0x4CA8, 0x50A8, 0x54A8, 0x58A8, 0x5CA8,\r\n0x4128, 0x4528, 0x4928, 0x4D28, 0x5128, 0x5528, 0x5928, 0x5D28,\r\n0x41A8, 0x45A8, 0x49A8, 0x4DA8, 0x51A8, 0x55A8, 0x59A8, 0x5DA8,\r\n0x4228, 0x4628, 0x4A28, 0x4E28, 0x5228, 0x5628, 0x5A28, 0x5E28,\r\n0x42A8, 0x46A8, 0x4AA8, 0x4EA8, 0x52A8, 0x56A8, 0x5AA8, 0x5EA8,\r\n0x4328, 0x4728, 0x4B28, 0x4F28, 0x5328, 0x5728, 0x5B28, 0x5F28,\r\n0x43A8, 0x47A8, 0x4BA8, 0x4FA8, 0x53A8, 0x57A8, 0x5BA8, 0x5FA8,\r\n0x4050, 0x4450, 0x4850, 0x4C50, 0x5050, 0x5450, 0x5850, 0x5C50,\r\n0x40D0, 0x44D0, 0x48D0, 0x4CD0, 0x50D0, 0x54D0, 0x58D0, 0x5CD0,\r\n0x4150, 0x4550, 0x4950, 0x4D50, 0x5150, 0x5550, 0x5950, 0x5D50,\r\n0x41D0, 0x45D0, 0x49D0, 0x4DD0, 0x51D0, 0x55D0, 0x59D0, 0x5DD0,\r\n0x4250, 0x4650, 0x4A50, 0x4E50, 0x5250, 0x5650, 0x5A50, 0x5E50,\r\n0x42D0, 0x46D0, 0x4AD0, 0x4ED0, 0x52D0, 0x56D0, 0x5AD0, 0x5ED0,\r\n0x4350, 0x4750, 0x4B50, 0x4F50, 0x5350, 0x5750, 0x5B50, 0x5F50,\r\n0x43D0, 0x47D0, 0x4BD0, 0x4FD0, 0x53D0, 0x57D0, 0x5BD0, 0x5FD0};\r\n*/\r\n\r\nextern uint16_t HB1[];\r\n\r\n\r\nvoid hgr_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\r\nvoid hgr_delete(uint8_t x, uint8_t y);\r\n\r\n#define _XL_DRAW(x, y, tile, color) hgr_draw(x,y,tile,color)\r\n\r\n#define _XL_DELETE(x,y) hgr_delete(x,y)\r\n\r\n\r\n#endif //_APPLE2_HGR_H\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/atari7800_color_graphics.h",
    "content": "#ifndef _ATARI_7800_GRAPHICS_H\r\n#define _ATARI_7800_GRAPHICS_H\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#include <atari7800.h>\r\n\r\nextern char screen[];\r\n\r\n#define BASE_ADDR 0x0000\r\n\r\n\r\nuint16_t loc(uint8_t x, uint8_t y);\r\n\r\n#define DISPLAY_POKE(addr,val) (screen[addr] = (val))\r\n\r\n#define _XL_DRAW(x, y, tile, color) \\\r\n    DISPLAY_POKE((uint16_t) loc(x,y), (unsigned char) (tile)+((color)*54U));\r\n\r\n// +(tile+color)\r\n\r\n\r\n#define _XL_DELETE(x,y) DISPLAY_POKE(loc(x,y), 0)\r\n\r\n  \r\n#endif // _ATARI_7800_GRAPHICS_H\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/atari_lynx_tgi_graphics.h",
    "content": "#ifndef _LYNX_TGI_GRAPHICS_GRAPHICS\r\n#define _LYNX_TGI_GRAPHICS_GRAPHICS\r\n\r\n#include \"cross_lib.h\"\r\n#include <tgi.h>\r\n\r\n#define FONT_SIZE (26+10+1)\r\n\r\ntypedef struct scb_hv_pal2 {\r\n    unsigned char sprctl0;\r\n    unsigned char sprctl1; // set REHV\r\n    unsigned char sprcoll;\r\n    char *next;\r\n    unsigned char *data;\r\n    signed int hpos;\r\n    signed int vpos;\r\n    unsigned int hsize;\r\n    unsigned int vsize;\r\n    unsigned char penpal[2];\r\n} scb_hv_pal2;\r\n\r\nextern scb_hv_pal2 _tgi_tile[_XL_NUMBER_OF_TILES+FONT_SIZE];\r\nextern scb_hv_pal2 *empty_spr;\r\n\r\nvoid _tgi_gfx_delete(uint8_t x, uint8_t y);\r\nvoid _tgi_gfx_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\r\n\r\n#define _XL_DELETE(__x,__y) \\\r\n    _tgi_gfx_delete(__x,__y)\r\n\r\n#define _XL_DRAW(__x,__y,__tile,__color) \\\r\n    _tgi_gfx_draw(__x,__y,__tile,__color)\r\n\r\n#endif // _LYNX_TGI_GRAPHICS_GRAPHICS\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/bbc_graphics.h",
    "content": "#include <stdint.h>\r\n\r\n#if !defined(_XL_NO_COLOR)\r\n\r\nvoid _bbc_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\r\n#else\r\nvoid _bbc_draw(uint8_t x, uint8_t y, uint8_t tile);\r\n\r\n#endif\r\n\r\nvoid _bbc_delete(uint8_t x, uint8_t y);\r\n\r\n#if !defined(_XL_NO_COLOR)\r\n    #define _XL_DRAW(x,y,tile,color) _bbc_draw(x,y,tile,color)\r\n#else\r\n    #define _XL_DRAW(x,y,tile,color) _bbc_draw(x,y,tile)\r\n#endif\r\n\r\n#define _XL_DELETE(x,y) _bbc_delete(x,y)\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/bit_mapped_16_graphics.h",
    "content": "\n#ifndef _BIT_MAPPED_16_GRAPHICS\n#define _BIT_MAPPED_16_GRAPHICS\n\n#if defined(__COCO3__)\n\t#define SV_VIDEO ((uint8_t*)0x8000)\n#elif defined(__AGAT__)\n    #define SV_VIDEO ((uint8_t*)0x6000)\n#endif\n\nextern uint8_t udgs[];\n\n#define BYTES_PER_LINE ((XSize)*4)\n\nuint8_t first_map_one_to_four(uint8_t n);\nuint8_t second_map_one_to_four(uint8_t n);\nuint8_t third_map_one_to_four(uint8_t n);\nuint8_t fourth_map_one_to_four(uint8_t n);\n\nvoid _color_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\n\nvoid _color_delete(uint8_t x, uint8_t y);\n\n\n#define _XL_DRAW(x,y,tile,color) \\\n    _color_draw(x,y,tile,color)\n\n#define _XL_DELETE(x,y) \\\n    _color_delete(x,y)\n\n\n#endif // _BIT_MAPPED_16_GRAPHICS\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/bit_mapped_4_graphics.h",
    "content": "\n#ifndef _BIT_MAPPED_4_GRAPHICS\n#define _BIT_MAPPED_4_GRAPHICS\n\n\n#if defined(__SUPERVISION__)\n// \n#elif defined(__COCO__)\n\t#define SV_VIDEO  ((uint8_t*)0x0E00)\n#elif defined(__MC10__)\n    #define SV_VIDEO  ((uint8_t*)0x4000)\n#endif\n\n// TODO: Make this more general \n#if defined(__SUPERVISION__)    \n    #define EXTRA_PADDING 8\n#else\n    #define EXTRA_PADDING 0\n#endif\n\n/*\n\nNON-REVERSED MAPPING (e.g., COCO/DRAGON) \n\ncolor 1\n0x00,0x01,0x04,0x05,0x10,0x11,0x14,0x15,0x40,0x41,0x44,0x45,0x50,0x51,0x54,0x55,\n\ncolor 2\n0x00,0x02,0x08,0x0A,0x20,0x22,0x28,0x2A,0x80,0x82,0x88,0x8A,0xA0,0xA2,0xA8,0xAA,\n\ncolor 3\n0x00,0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,0xC0,0xC3,0xCC,0xCF,0xF0,0xF3,0xFC,0xFF,\n\n*/\n\n#define BYTES_PER_LINE ((XSize)*2+EXTRA_PADDING)\n\n#if defined(__MC10__)\n    #include \"8x6_c_definition.h\"\n#endif\n\nuint8_t left_map_one_to_two(uint8_t n);\nuint8_t right_map_one_to_two(uint8_t n);\n\nvoid _color_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\n\nvoid _color_delete(uint8_t x, uint8_t y);\n\n\n#define _XL_DRAW(x,y,tile,color) \\\n    _color_draw(x,y,tile,color)\n\n#define _XL_DELETE(x,y) \\\n    _color_delete(x,y)\n\n\n#endif // _BIT_MAPPED_4_GRAPHICS\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/bit_mapped_graphics.h",
    "content": "\n#ifndef _BIT_MAPPED_GRAPHICS\n#define _BIT_MAPPED_GRAPHICS\n\n#if defined(__MO5__)\n\t#define SV_VIDEO  ((uint8_t*)0x0000)\n#elif defined(__TO7__)\n\t#define SV_VIDEO  ((uint8_t*)0x4000)\n#elif defined(__COCO__) || defined(__DRAGON__)\n\t#define SV_VIDEO  ((uint8_t*)0x0E00)\n#elif defined(__COCO3__)\n\t#define SV_VIDEO ((uint8_t*)0x8000)\n#endif\n\nextern uint8_t udgs[];\n\n#if defined(__MO5__) || defined(__TO7__) \n    #define _BITMAP_XSize 40\n#else\n    #define _BITMAP_XSize (XSize)\n#endif\n\n#define BIT_MAP_DRAW() \\\n    for(__i=0;__i<7;++__i) \\\n    { \\\n        SV_VIDEO[__base+__delta]  = udgs[__offset+__i]; \\\n        __delta+=_BITMAP_XSize; \\\n    } \\\n    SV_VIDEO[__base+(_BITMAP_XSize)*7] = udgs[__offset+7]; \\\n\n\n#define BIT_MAP_DELETE() \\\n    for(__i=0;__i<7;++__i) \\\n    { \\\n        SV_VIDEO[(uint16_t) __base+__delta] = 0; \\\n        __delta+=_BITMAP_XSize; \\\n    } \\\n    SV_VIDEO[__base+(_BITMAP_XSize)*(uint16_t)7] = 0; \\\n\n#if defined(__MO5__) || defined(__TO7__) \n\t#include \"conio_patch.h\"\n    \n\t#define _XL_DRAW(x,y,tile,color) \\\n\t{ \\\n\t\tuint8_t __i; \\\n\t\tuint16_t __base = (x)+(_BITMAP_XSize)*8*(y); \\\n\t\tuint8_t __delta = 0; \\\n\t\tuint8_t __offset = (8U*(uint8_t)(tile)) ; \\\n\t\t\\\n\t\tSWITCH_COLOR_BANK_OFF(); \\\n\t\tBIT_MAP_DRAW(); \\\n\t\t\\\n\t\t__delta = 0; \\\n\t\tSWITCH_COLOR_BANK_ON(); \\\n\t\tfor(__i=0;__i<7;++__i) \\\n\t\t{ \\\n\t\t\tSV_VIDEO[__base+__delta]  = (color); \\\n\t\t\t__delta+=_BITMAP_XSize; \\\n\t\t} \\\n\t\tSV_VIDEO[__base+(_BITMAP_XSize)*(uint16_t)7] = (color); \\\n\t\tSWITCH_COLOR_BANK_OFF(); \\\n\t}\n\t#define _XL_DELETE(x,y) \\\n\t{ \\\n\t\tuint8_t __i; \\\n\t\tuint16_t __base = (x)+(_BITMAP_XSize)*8*(y); \\\n\t\tuint8_t __delta = 0; \\\n\t\t\\\n\t\tSWITCH_COLOR_BANK_OFF(); \\\n\t\tBIT_MAP_DELETE(); \\\n\t}\n\n#elif defined(__COCO__) || defined(__DRAGON__)\n\n\t#define _XL_DRAW(x,y,tile,color) \\\n\t{ \\\n\t\tuint16_t __i; \\\n\t\tuint16_t __base = (x)+(_BITMAP_XSize)*8*(y); \\\n\t\tuint8_t __delta = 0; \\\n\t\tuint16_t __offset = (8U*((uint16_t) tile)) ; \\\n\t\t\\\n\t\tBIT_MAP_DRAW(); \\\n\t}\n\t\n\n\n\t#define _XL_DELETE(x,y) \\\n\t{ \\\n\t\tuint8_t __i; \\\n\t\tuint16_t __base = (x)+(_BITMAP_XSize)*8*(y); \\\n\t\tuint8_t __delta = 0; \\\n\t\t\\\n\t\tBIT_MAP_DELETE(); \\\n\t}\n\n#endif\n\t\n#endif // _BIT_MAPPED_GRAPHICS\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/buffered_graphics.h",
    "content": "#ifndef ___BUFFERED_GRAPHICS\n#define ___BUFFERED_GRAPHICS\n\n#include \"display_target_geometry.h\"\n\n#if defined(__C64__) || defined(__C128__)\n    #if defined(__DOUBLE_BUFFER)\n        #define BASE_ADDR 0xB800\n        #define COLOR_ADDR 0xBC00\n        #define REAL_BASE_ADDR 0xC000\n        #define REAL_COLOR_ADDR 0xD800\n    #else\n        #define BASE_ADDR 0xC000\n        #define COLOR_ADDR 0xD800\n    #endif\n#endif\n\nvoid display_all(void);\n\n#define _XL_DRAW(x,y,tile,color) \\\n\tvideo_buffer[(y)][(x)]=tile;\n\n#define _XL_DELETE(x,y) \\\n\tvideo_buffer[(y)][(x)]=_SPACE;\n\n\n#endif // ___BUFFERED_GRAPHICS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/conio_graphics.h",
    "content": "#ifndef _CONIO_GRAPHICS_H\n#define _CONIO_GRAPHICS_H\n\n\n#if !defined(_XL_NO_COLOR)\n\n    #if defined(__FP1100__)\n    \n        #define _XL_DRAW(x,y,tile,color) \\\n        do \\\n        { \\\n            gotoxy((X_OFFSET+(x)),(Y_OFFSET+(y))); \\\n            _XL_SET_TEXT_COLOR(color); \\\n            cputc(tile); \\\n            gotoxy((X_OFFSET+((XSize)-1)),(Y_OFFSET+((YSize)))); \\\n            cputc(' '); \\\n        } \\\n        while(0)\n            \n    #else\n        #if defined(__NO_BOTTOM)\n            #define _XL_DRAW(x,y,tile,color) \\\n            do \\\n            { \\\n                if(y<YSize-1) \\\n                { \\\n                    gotoxy((X_OFFSET+(x)),(Y_OFFSET+(y))); \\\n                    _XL_SET_TEXT_COLOR(color); \\\n                    cputc(tile); \\\n                } \\\n            } \\\n            while(0)\n        #else\n            #define _XL_DRAW(x,y,tile,color) \\\n            do \\\n            { \\\n                gotoxy((X_OFFSET+(x)),(Y_OFFSET+(y))); \\\n                _XL_SET_TEXT_COLOR(color); \\\n                cputc(tile); \\\n            } \\\n            while(0)\n            \n        #endif\n    #endif\n\n#elif defined(__KIM1__) || defined(__SYM1__)\n\n\t\t#define _XL_DRAW(x,y,tile,color) \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tgotoxy((X_OFFSET+x),(Y_OFFSET+y)); \\\n\t\t\tputchar(tile); \\\n\t\t} \\\n\t\twhile(0)\n#else\n\n\t#if defined(__NO_BOTTOM)\n\t\t#define _XL_DRAW(x,y,tile,color) \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tif(y<YSize-1) \\\n\t\t\t{ \\\n\t\t\t\tgotoxy((X_OFFSET+x),(Y_OFFSET+y)); \\\n\t\t\t\tcputc(tile); \\\n\t\t\t} \\\n\t\t} \\\n\t\twhile(0)\n\t#else\n\n\t\t#define _XL_DRAW(x,y,tile,color) \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tgotoxy((X_OFFSET+x),(Y_OFFSET+y)); \\\n\t\t\tcputc(tile); \\\n\t\t} \\\n\t\twhile(0)\n    #endif\n\n#endif\n\n#if defined(__NO_BOTTOM)\n\t#define _XL_DELETE(x,y) \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tif(y<YSize-1) \\\n\t\t\t{ \\\n\t\t\t\tgotoxy((X_OFFSET+x),(Y_OFFSET+y)); \\\n\t\t\t\tcputc(_SPACE); \\\n\t\t\t} \\\n\t\t} \\\n\t\twhile(0)\n#elif defined(__KIM1__) || defined(__SYM1__)\n\t#define _XL_DELETE(x,y) \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tgotoxy((X_OFFSET+x),(Y_OFFSET+y)); \\\n\t\t\tputchar(_SPACE); \\\n\t\t} \\\n\t\twhile(0)\n#else\n\t\n\t#define _XL_DELETE(x,y) \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tgotoxy((X_OFFSET+x),(Y_OFFSET+y)); \\\n\t\t\tcputc(_SPACE); \\\n\t\t} \\\n\t\twhile(0)\n\n#endif\n\t\t\n#endif // _CONIO_GRAPHICS_H\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/cpc_cpcrslib_graphics.h",
    "content": "#ifndef _CPC___CPCRSLIB_GRAPHICS\n#define _CPC___CPCRSLIB_GRAPHICS\n\n#include \"standard_libs.h\"\n\nextern uint8_t char_list[];\n\nextern uint8_t space_str[];\n\n#define CPC_WHITE 1\n#define CPC_YELLOW 2 \n#define CPC_RED 3\n#define CPC_BLACK 4\n\n#include <cpc.h>\n\n#define _DRAW_AUX(color,str,x,y) cpc_PrintGphStrStdXY(color,str,(x*2),(y*8))\n\n#define _XL_DRAW(x,y,tile,color) _DRAW_AUX(color, char_list+(tile), (x), (y))\n\n#define _XL_DELETE(x,y) _DRAW_AUX(CPC_BLACK,space_str,(x),(y))\n\n\n#endif // _CPC___CPCRSLIB_GRAPHICS\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/dual_memory_mapped_graphics.h",
    "content": "#ifndef ___DUAL_MEMORY_MAPPED_GRAPHICS\r\n#define ___DUAL_MEMORY_MAPPED_GRAPHICS\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#include \"display_macros.h\"\r\n\r\n#if defined(___DUAL_MEMORY_MAPPED_GRAPHICS)\r\n\r\n#  if defined(__C64__) || defined(__C128__)\r\n    #if defined(__DOUBLE_BUFFER)\r\n        #define BASE_ADDR 0xB800\r\n        #define COLOR_ADDR 0xBC00\r\n        #define REAL_BASE_ADDR 0xC000\r\n        #define REAL_COLOR_ADDR 0xD800\r\n    #else\r\n        #define BASE_ADDR 0xC000\r\n        #define COLOR_ADDR 0xD800\r\n    #endif\r\n#elif defined(__MC10__)\r\n\t#define BASE_ADDR 0x4000   \r\n#elif defined(__VIC20__) && defined(___DUAL_MEMORY_MAPPED_GRAPHICS) && (defined(__VIC20_EXP_8K) || defined(__VIC20_EXP_16K))\r\n\t#define BASE_ADDR 0x1000\r\n\t#define COLOR_ADDR 0x9400\r\n#elif defined(__C16__)\r\n\t#define BASE_ADDR 0x0C00\r\n\t#define COLOR_ADDR 0x0800\r\n#elif defined(__GAL__)\r\n\t#define BASE_ADDR 0x2800\r\n#elif defined(__COCO__) || defined(__DRAGON__)\r\n\t#define BASE_ADDR 0x0400\r\n#elif defined(__ATARI__) && defined(__ANTIC_MODE6_GRAPHICS)\r\n\t#define BASE_ADDR_VALUE (PEEK(88)+PEEK(89)*256)\r\n#elif defined(__ATARI5200__)\r\n\t#define BASE_ADDR 0x3E20\r\n#elif defined(__ATMOS__)\r\n\t#define BASE_ADDR 0xBB80\r\n#elif defined(__VIC20__) && (defined(__VIC20_UNEXPANDED) || defined(__VIC20_EXP_3K))\r\n\t#define BASE_ADDR 0x1E00\r\n\t#define COLOR_ADDR 0x9600\r\n#elif defined(__MSX__)\r\n    #if !defined(USE_MSX_BIOS)\r\n        #define BASE_ADDR 0x0000\r\n    #else\r\n        #define BASE_ADDR 0x1800\r\n    #endif\r\n#elif defined(__CREATIVISION__) && defined(___DUAL_MEMORY_MAPPED_GRAPHICS)\r\n    #define BASE_ADDR 0x1000\r\n#elif defined(__AQUARIUS__)\r\n    // TODO: it could be 12288 with X_OFFSET 1 to avoid using the first character that also sets the border character\r\n    #if defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n        #define BASE_ADDR (12288+40)\r\n    #else\r\n        #define BASE_ADDR (12288+40)\r\n    #endif\r\n\t#define COLOR_ADDR (BASE_ADDR+1024)\r\n#elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__) || defined(__MICRO__)\r\n\t#define BASE_ADDR 0xF800\r\n    #if defined(__TMC600__)\r\n        #define COLOR_ADDR 0\r\n    #endif\r\n#elif defined(__PET__)\r\n\t#define BASE_ADDR 0x8000\r\n#endif\r\n\r\n#if defined(__MSX__)\r\n\t#define DISPLAY_POKE(addr,val) msx_vpoke(addr,val)\r\n#elif defined(__CREATIVISION__)\r\n    #define VDP_DATA  0x3000\r\n    #define VDP_CONTROL 0x3001\r\n    #include <peekpoke.h>\r\n        \r\n    #define CHAR_BASE ((uint16_t) 0x0000)\r\n    #define COLOR_DEF ((uint16_t) 0x1800)   \r\n    #define DISPLAY_POKE(addr,val) \\\r\n    do { \\\r\n        __asm__(\"sei\"); \\\r\n        POKE(VDP_CONTROL,(uint8_t) (addr&0x00FF)); \\\r\n        POKE(VDP_CONTROL,(uint8_t) (addr>>8)|0x40); \\\r\n        POKE(VDP_DATA,val); \\\r\n        __asm__(\"cli\"); \\\r\n    } while(0)\r\n        \r\n#elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__) || defined(__MICRO__)\r\n    #include <devkit/video/vis_video.h>\r\n    #define DISPLAY_POKE(addr,val) vidchar(addr,val)\r\n#elif defined(__MC10__)\r\n    void mc10_display_poke(uint16_t addr, uint8_t val);\r\n    #define DISPLAY_POKE(addr,val) mc10_display_poke(addr,val)\r\n#else\r\n\t#define DISPLAY_POKE(addr,val) (*(uint8_t*) (addr) = (val))\r\n#endif\r\n\r\n#if defined(__TMC600__)\r\n    #include <devkit/video/vis_video.h>\r\n    #define COLOR_POKE(addr,color) setcolor(addr,color)\r\n#else\r\n    #define COLOR_POKE(addr, color) \\\r\n    do \\\r\n    { \\\r\n        DISPLAY_POKE(addr, color); \\\r\n    } while(0)\r\n        \r\n#endif\r\n\r\n/*\r\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1)) +(uint16_t)(2*(y))*(XSize)),(color)); \\\r\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1)+(uint8_t)(2*(y))*((uint16_t) (XSize ))), (tile)); \\\r\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1)) +(uint16_t)(2*(y)+2)*(XSize)),(color)); \\\r\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1)+(uint8_t)(2*(y)+2)*((uint16_t) (XSize))), (tile)); \\\r\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x))) +(uint16_t)(2*(y)+2)*(XSize)),(color)); \\\r\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x))+(uint8_t)(2*(y)+2)*((uint16_t) (XSize))), (tile)); \\\r\n        */\r\n\r\n\r\n#if defined(__AQUARIUS__) \r\n    #define HARD_Y_LIMIT (YSize-1)\r\n#else\r\n    #define HARD_Y_LIMIT (YSize+1)\r\n#endif\r\n\r\n\r\n#if !defined(_XL_NO_COLOR)\r\n\r\n    #define _XL_DRAW(x,y,tile,color) \\\r\n    do \\\r\n    { \\\r\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x))) +(uint16_t)(1*(y))*(2*XSize)),(color)); \\\r\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x))+(uint8_t)(1*(y))*((uint16_t) (2*XSize))), (tile)); \\\r\n        \\\r\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1)) +(uint16_t)(1*(y))*(2*XSize)),(color)); \\\r\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1)+(uint8_t)(1*(y))*((uint16_t) (2*XSize))), (tile)); \\\r\n        \\\r\n    } \\\r\n    while(0)\r\n    \r\n#else\r\n    #define _XL_DRAW(x,y,tile,color) \\\r\n    do \\\r\n    { \\\r\n        uint8_t computed_loc = (((uint16_t) BASE_ADDR)+(2*(x))+(uint8_t)((y))*((uint16_t) (XSize + X_OFFSET))); \\\r\n        \\\r\n        DISPLAY_POKE(computed_loc, (tile)); \\\r\n        DISPLAY_POKE(computed_loc+2, (tile)); \\\r\n    } \\\r\n    while(0)\r\n\r\n#endif\r\n\r\n\r\n#define _XL_DELETE(x,y) \\\r\ndo \\\r\n{ \\\r\n    COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x))) +(uint16_t)(1*(y))*(2*XSize)), _XL_BLACK); \\\r\n    DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x))+(uint8_t)((1*y))*((uint16_t) (2*XSize))), _SPACE); \\\r\n    \\\r\n    COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1)) +(uint16_t)(1*(y))*(2*XSize)), _XL_BLACK); \\\r\n    DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1)+(uint8_t)((1*y))*((uint16_t) (2*XSize))), _SPACE); \\\r\n    \\\r\n} \\\r\nwhile(0)\r\n\r\n\r\n#endif\r\n\r\n#endif // ___DUAL_MEMORY_MAPPED_GRAPHICS\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/lcc1802_color_graphics.h",
    "content": "#ifndef _LCC1802_COLOR_GRAPHICS\r\n#define _LCC1802_COLOR_GRAPHICS\r\n\r\n#define BASE_ADDR 0xF800\r\n\r\n#if defined(__LCC1802_UNBUFFERED)\r\n\t#define VIDCHARXY(x,y,ch) vidcharnobufxy(x,y,ch)\r\n\t#define VIDFLUSH()\r\n#elif defined(VIS_INT)\r\n\t#define VIDCHARXY(x,y,ch) vidcharxy(x,y,ch)\r\n\t#define VIDFLUSH()\r\n#else\r\n\t#define VIDCHARXY(x,y,ch) vidcharxy(x,y,ch)\r\n\t#define VIDFLUSH() vidflush()\r\n#endif\r\n\r\n\r\n#if !defined(_XL_NO_COLOR)\r\n    #define _XL_DRAW(x,y,tile,color) VIDCHARXY(((x)+X_OFFSET),((y)+Y_OFFSET),(tile)+(color))\r\n#else\r\n    #define _XL_DRAW(x,y,tile,color) VIDCHARXY(((x)+X_OFFSET),((y)+Y_OFFSET),(tile))\r\n#endif\r\n\r\n#define _XL_DELETE(x,y) VIDCHARXY(((x)+X_OFFSET),((y)+Y_OFFSET),' ')\r\n\r\n    \r\n\r\n#endif // _LCC1802_COLOR_GRAPHICS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/lcc1802_graphics.h",
    "content": "#ifndef _LCC1802_GRAPHICS\r\n#define _LCC1802_GRAPHICS\r\n\r\n#define BASE_ADDR 0xF800\r\n\r\n#define _XL_DRAW(x,y,tile,color) vidcharxy(((x)+X_OFFSET),((y)+Y_OFFSET),tile)\r\n\r\n#define _XL_DELETE(x,y) vidcharxy(((x)+X_OFFSET),((y)+Y_OFFSET),' ')\r\n\r\n\r\n#endif // _LCC1802_GRAPHICS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/memory_mapped_graphics.h",
    "content": "#ifndef _MEMORY_MAPPED_GRAPHICS\n#define _MEMORY_MAPPED_GRAPHICS\n\n#include \"standard_libs.h\"\n\n#if (defined(__PET__) && defined(__MEMORY_MAPPED_GRAPHICS)) || defined(__MC10__) || defined(__AQUARIUS__) || \\\n    (defined(__COCO__) && !defined(__BIT_MAPPED_GRAPHICS)) || (defined(__DRAGON__) && !defined(__BIT_MAPPED_GRAPHICS))\n    #include \"display_macros.h\"\n#endif\n\n#if defined(__MEMORY_MAPPED_GRAPHICS)\n\n\t#  if defined(__C64__) || defined(__C128__)\n\t\t#if defined(__DOUBLE_BUFFER)\n\t\t\t// #define BASE_ADDR 0x9800\n\t\t\t// #define COLOR_ADDR 0x9C00\n\t\t\t// #define REAL_BASE_ADDR 0xC000\n\t\t\t// #define REAL_COLOR_ADDR 0xD800\n\t\t\t#define BASE_ADDR 0xB800\n\t\t\t#define COLOR_ADDR 0xBC00\n\t\t\t#define REAL_BASE_ADDR 0xC000\n\t\t\t#define REAL_COLOR_ADDR 0xD800\n\t\t#else\n\t\t\t#define BASE_ADDR 0xC000\n\t\t\t#define COLOR_ADDR 0xD800\n\t\t#endif\n\t#elif defined(__VZ__)\n\t\t#define BASE_ADDR 0x7000\n\t#elif defined(__MC10__)\n\t\t#define BASE_ADDR 0x4000   \n\t#elif defined(__VIC20__) && defined(__MEMORY_MAPPED_GRAPHICS) && (defined(__VIC20_EXP_8K) || defined(__VIC20_EXP_16K))\n\t\t#define BASE_ADDR 0x1000\n\t\t#define COLOR_ADDR 0x9400\n\t#elif defined(__C16__)\n\t\t#if defined(__DOUBLE_BUFFER)\n            #define BASE_ADDR 0x2B00\n            // #define COLOR_ADDR 0x3000\n            #define REAL_BASE_ADDR 0x0C00\n            // #define REAL_COLOR_ADDR 0x0800\n        #else\n            #define BASE_ADDR 0x0C00\n            // #define COLOR_ADDR 0x0800\n        #endif\n        #define COLOR_ADDR 0x0800\n\t#elif defined(__GAL__)\n\t\t#define BASE_ADDR 0x2800\n\t#elif defined(__COCO__) || defined(__DRAGON__)\n\t\t#define BASE_ADDR 0x0400\n\t#elif defined(__ATARI__) && defined(__ANTIC_MODE6_GRAPHICS)\n\t\t#define BASE_ADDR_VALUE (PEEK(88)+PEEK(89)*256)\n\t#elif defined(__ATARI5200__)\n\t\t#define BASE_ADDR 0x3E20\n\t#elif defined(__ATMOS__)\n\t\t#define BASE_ADDR 0xBB80\n\t#elif defined(__VIC20__) && (defined(__VIC20_UNEXPANDED) || defined(__VIC20_EXP_3K))\n\t\t#define BASE_ADDR 0x1E00\n\t\t#define COLOR_ADDR 0x9600\n\t#elif defined(__MSX__)\n\t\t#if !defined(USE_MSX_BIOS)\n\t\t\t#define BASE_ADDR 0x0000\n\t\t#else\n\t\t\t#define BASE_ADDR 0x1800\n\t\t#endif\n\t#elif defined(__CREATIVISION__) && defined(__MEMORY_MAPPED_GRAPHICS)\n\t\t#define BASE_ADDR 0x1000\n\t#elif defined(__AQUARIUS__)\n\t\t#define BASE_ADDR (12288+40)\n\t\t#define COLOR_ADDR (BASE_ADDR+1024)\n\t#elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__) || defined(__MICRO__)\n\t\t#define BASE_ADDR 0xF800\n\t\t#if defined(__TMC600__)\n\t\t\t#define COLOR_ADDR 0\n\t\t#endif\n\t#elif defined(__PET__)\n\t\t#define BASE_ADDR 0x8000\n\t#endif\n\n\t#if defined(__MSX__)\n\t\t#define DISPLAY_POKE(addr,val) msx_vpoke(addr,val)\n\t#elif defined(__CREATIVISION__)\n\t\t#define VDP_DATA  0x3000\n\t\t#define VDP_CONTROL 0x3001\n\n\t\t#if !defined(PEEK)\n\t\t\t#include <peekpoke.h>\n\t\t#endif\n\t\t\t\n\t\t#define CHAR_BASE ((uint16_t) 0x0000)\n\t\t#define COLOR_DEF ((uint16_t) 0x1800)   \n\t\t#define DISPLAY_POKE(addr,val) \\\n\t\tdo { \\\n\t\t\t__asm__(\"sei\"); \\\n\t\t\tPOKE(VDP_CONTROL,(uint8_t) (addr&0x00FF)); \\\n\t\t\tPOKE(VDP_CONTROL,(uint8_t) (addr>>8)|0x40); \\\n\t\t\tPOKE(VDP_DATA,val); \\\n\t\t\t__asm__(\"cli\"); \\\n\t\t} while(0)\n\t\t\t\n\t#elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__) || defined(__MICRO__)\n\t\t#include <devkit/video/vis_video.h>\n\t\t#define DISPLAY_POKE(addr,val) vidchar(addr,val)\n\t#elif defined(__MC10__)\n\t\tvoid mc10_display_poke(uint16_t addr, uint8_t val);\n\t\t#define DISPLAY_POKE(addr,val) mc10_display_poke(addr,val)\n\t#else\n\t\t#define DISPLAY_POKE(addr,val) (*(uint8_t*) (addr) = (val))\n\t#endif\n\n\t#if defined(__TMC600__)\n\t\t#include <devkit/video/vis_video.h>\n\t\t#define COLOR_POKE(addr,color) setcolor(addr,color)\n\t#else\n\t\t#define COLOR_POKE(addr, color) DISPLAY_POKE(addr, color)\n\t#endif\n\n    #if !defined(_XL_NO_COLOR)\n        void _XL_DRAW(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\n    #else\n        void __DRAW_NO_COLOR(uint8_t x, uint8_t y, uint8_t tile);\n        #define _XL_DRAW(x, y, tile, color) __DRAW_NO_COLOR(x,y,tile)\n    \n    #endif\n    \n\n\tvoid _XL_DELETE(uint8_t x,uint8_t y);\n\n\t// #define _XL_DELETE(x,y) DISPLAY_POKE(loc(x,y), _SPACE)\n\n\tuint16_t loc(uint8_t x, uint8_t y);\n\n#endif\n\n#endif // _MEMORY_MAPPED_GRAPHICS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/nes_conio_graphics.h",
    "content": "#ifndef _CONIO_GRAPHICS_H\n#define _CONIO_GRAPHICS_H\n\n\n#define _XL_DRAW(x,y,tile,color) \\\ndo \\\n{ \\\n    gotoxy((x),(y)); \\\n    cputc((tile)+(color)); \\\n} \\\nwhile(0)\n\n\n#define _XL_DELETE(x,y) \\\ndo \\\n{ \\\n    gotoxy((x),(y)); \\\n    cputc(_SPACE); \\\n} \\\nwhile(0)\n\n#endif // _CONIO_GRAPHICS_H\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/no_graphics.h",
    "content": "#ifndef ___NO_GRAPHICS\n#define ___NO_GRAPHICS\n\n\n// TODO: to be implemented\n\n#define _XL_DRAW(x,y,tile,color)\n\n#define _XL_DELETE(x,y) \n\t\t\n#endif // ___NO_GRAPHICS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/oric_color_graphics.h",
    "content": "#ifndef _MEMORY_MAPPED_GRAPHICS\r\n#define _MEMORY_MAPPED_GRAPHICS\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#define BASE_ADDR 0xBB80\r\n\r\n\r\n#define DISPLAY_POKE(addr,val) (*(uint8_t*) (addr) = (val))\r\n\r\n#if defined(__MONO_COLOR)\r\n    #define _XL_DRAW(x,y,tile,color) \\\r\n        DISPLAY_POKE((uint16_t) loc(x+X_OFFSET,y), (tile));\r\n#else\r\n    #define _XL_DRAW(x,y,tile,color) \\\r\n            DISPLAY_POKE((uint16_t) loc(x+X_OFFSET,y), (tile)+(color)); \r\n#endif\r\n\r\n#define _XL_DELETE(x,y) DISPLAY_POKE(loc(x+X_OFFSET,y), _SPACE)\r\n\r\n\r\nuint16_t loc(uint8_t x, uint8_t y);\r\n\r\n#endif // _MEMORY_MAPPED_GRAPHICS\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/pv1000_graphics.h",
    "content": "#ifndef _PV1000_GRAPHICS_H\r\n#define _PV1000_GRAPHICS_H\r\n\r\n\r\n\r\n#define _XL_DRAW(x,y,tile,color) \\\r\ndo \\\r\n{ \\\r\n    gotoxy((X_OFFSET+(x)),(Y_OFFSET+(y))); \\\r\n    cputc(tile+color); \\\r\n} \\\r\nwhile(0)\r\n\r\n\r\n\r\n\r\n#define _XL_DELETE(x,y) \\\r\ndo \\\r\n{ \\\r\n    gotoxy((X_OFFSET+x),(Y_OFFSET+y)); \\\r\n    cputc(_SPACE); \\\r\n} \\\r\nwhile(0)\r\n\r\n\n#endif // _PV1000_GRAPHICS_H\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/quad_memory_mapped_graphics.h",
    "content": "#ifndef ___QUAD_MEMORY_MAPPED_GRAPHICS\n#define ___QUAD_MEMORY_MAPPED_GRAPHICS\n\n#include \"standard_libs.h\"\n\n#include \"display_macros.h\"\n\n#if defined(___QUAD_MEMORY_MAPPED_GRAPHICS)\n\n#  if defined(__C64__) || defined(__C128__)\n    #if defined(__DOUBLE_BUFFER)\n        #define BASE_ADDR 0xB800\n        #define COLOR_ADDR 0xBC00\n        #define REAL_BASE_ADDR 0xC000\n        #define REAL_COLOR_ADDR 0xD800\n    #else\n        #define BASE_ADDR 0xC000\n        #define COLOR_ADDR 0xD800\n    #endif\n#elif defined(__MC10__)\n\t#define BASE_ADDR 0x4000   \n#elif defined(__VIC20__) && defined(___QUAD_MEMORY_MAPPED_GRAPHICS) && (defined(__VIC20_EXP_8K) || defined(__VIC20_EXP_16K))\n\t#define BASE_ADDR 0x1000\n\t#define COLOR_ADDR 0x9400\n#elif defined(__C16__)\n\t#define BASE_ADDR 0x0C00\n\t#define COLOR_ADDR 0x0800\n#elif defined(__GAL__)\n\t#define BASE_ADDR 0x2800\n#elif defined(__COCO__) || defined(__DRAGON__)\n\t#define BASE_ADDR 0x0400\n#elif defined(__ATARI__) && defined(__ANTIC_MODE6_GRAPHICS)\n\t#define BASE_ADDR_VALUE (PEEK(88)+PEEK(89)*256)\n#elif defined(__ATARI5200__)\n\t#define BASE_ADDR 0x3E20\n#elif defined(__ATMOS__)\n\t#define BASE_ADDR 0xBB80\n#elif defined(__VIC20__) && (defined(__VIC20_UNEXPANDED) || defined(__VIC20_EXP_3K))\n\t#define BASE_ADDR 0x1E00\n\t#define COLOR_ADDR 0x9600\n#elif defined(__MSX__)\n    #if !defined(USE_MSX_BIOS)\n        #define BASE_ADDR 0x0000\n    #else\n        #define BASE_ADDR 0x1800\n    #endif\n#elif defined(__CREATIVISION__) && defined(___QUAD_MEMORY_MAPPED_GRAPHICS)\n    #define BASE_ADDR 0x1000\n#elif defined(__AQUARIUS__)\n    // TODO: it could be 12288 with X_OFFSET 1 to avoid using the first character that also sets the border character\n    #if defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n        #define BASE_ADDR (12288)\n    #else\n        #define BASE_ADDR (12288+40)\n    #endif\n\t#define COLOR_ADDR (BASE_ADDR+1024)\n#elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__) || defined(__MICRO__)\n\t#define BASE_ADDR 0xF800\n    #if defined(__TMC600__)\n        #define COLOR_ADDR 0\n    #endif\n#elif defined(__PET__)\n\t#define BASE_ADDR 0x8000\n#endif\n\n#if defined(__MSX__)\n\t#define DISPLAY_POKE(addr,val) msx_vpoke(addr,val)\n#elif defined(__CREATIVISION__)\n    #define VDP_DATA  0x3000\n    #define VDP_CONTROL 0x3001\n    #include <peekpoke.h>\n        \n    #define CHAR_BASE ((uint16_t) 0x0000)\n    #define COLOR_DEF ((uint16_t) 0x1800)   \n    #define DISPLAY_POKE(addr,val) \\\n    do { \\\n        __asm__(\"sei\"); \\\n        POKE(VDP_CONTROL,(uint8_t) (addr&0x00FF)); \\\n        POKE(VDP_CONTROL,(uint8_t) (addr>>8)|0x40); \\\n        POKE(VDP_DATA,val); \\\n        __asm__(\"cli\"); \\\n    } while(0)\n        \n#elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__) || defined(__MICRO__)\n    #include <devkit/video/vis_video.h>\n    #define DISPLAY_POKE(addr,val) vidchar(addr,val)\n#elif defined(__MC10__)\n    void mc10_display_poke(uint16_t addr, uint8_t val);\n    #define DISPLAY_POKE(addr,val) mc10_display_poke(addr,val)\n#else\n\t#define DISPLAY_POKE(addr,val) (*(uint8_t*) (addr) = (val))\n#endif\n\n#if defined(__TMC600__)\n    #include <devkit/video/vis_video.h>\n    #define COLOR_POKE(addr,color) setcolor(addr,color)\n#else\n    #define COLOR_POKE(addr, color) \\\n    do \\\n    { \\\n        DISPLAY_POKE(addr, color); \\\n    } while(0)\n        \n#endif\n\n/*\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1)) +(uint16_t)(2*(y))*(XSize)),(color)); \\\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1)+(uint8_t)(2*(y))*((uint16_t) (XSize ))), (tile)); \\\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1)) +(uint16_t)(2*(y)+2)*(XSize)),(color)); \\\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1)+(uint8_t)(2*(y)+2)*((uint16_t) (XSize))), (tile)); \\\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x))) +(uint16_t)(2*(y)+2)*(XSize)),(color)); \\\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x))+(uint8_t)(2*(y)+2)*((uint16_t) (XSize))), (tile)); \\\n        */\n\n\n#if defined(__AQUARIUS__) \n    #define HARD_Y_LIMIT (YSize-1)\n#else\n    #define HARD_Y_LIMIT (YSize+1)\n#endif\n\n#define SCREEN_XSIZE (XSize+X_OFFSET)\n\nextern uint8_t quad_tile[26][4];\n\n#if !defined(_XL_NO_COLOR)\n\n    #define _XL_DRAW(x,y,tile,color) \\\n    do \\\n    { \\\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+X_OFFSET)) +(uint16_t)((y))*(4*SCREEN_XSIZE)),(color)); \\\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+X_OFFSET)+(uint8_t)((y))*((uint16_t) (4*SCREEN_XSIZE))), (quad_tile[tile][0])); \\\n        \\\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1+X_OFFSET)) +(uint16_t)((y))*(4*SCREEN_XSIZE)),(color)); \\\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1+X_OFFSET)+(uint8_t)((y))*((uint16_t) (4*SCREEN_XSIZE))), (quad_tile[tile][1])); \\\n        \\\n        if(y<HARD_Y_LIMIT) \\\n        { \\\n            COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+X_OFFSET)) +(uint16_t)(4*(y)+2)*(SCREEN_XSIZE)),(color)); \\\n            DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+X_OFFSET)+(uint8_t)(4*(y)+2)*((uint16_t) (SCREEN_XSIZE))), (quad_tile[tile][2])); \\\n            \\\n            COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1+X_OFFSET)) +(uint16_t)(4*(y)+2)*(SCREEN_XSIZE)),(color)); \\\n            DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1+X_OFFSET)+(uint8_t)(4*(y)+2)*((uint16_t) (SCREEN_XSIZE))), (quad_tile[tile][3])); \\\n        } \\\n    } \\\n    while(0)\n    \n    // #define DRAW_QUAD_CHAR(x,y,tile,color) \\\n    // do \\\n    // { \\\n        // COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+X_OFFSET)) +(uint16_t)((y))*(4*SCREEN_XSIZE)),(color)); \\\n        // DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+X_OFFSET)+(uint8_t)((y))*((uint16_t) (4*SCREEN_XSIZE))), tile); \\\n        // \\\n        // COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1+X_OFFSET)) +(uint16_t)((y))*(4*SCREEN_XSIZE)), _XL_BLACK); \\\n        // DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1+X_OFFSET)+(uint8_t)((y))*((uint16_t) (4*SCREEN_XSIZE))), _SPACE); \\\n        // \\\n        // if(y<HARD_Y_LIMIT) \\\n        // { \\\n            // COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+X_OFFSET)) +(uint16_t)(4*(y)+2)*(SCREEN_XSIZE)), _XL_BLACK); \\\n            // DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+X_OFFSET)+(uint8_t)((4*(y)+2))*((uint16_t) (SCREEN_XSIZE))), _SPACE); \\\n            // \\\n            // COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1+X_OFFSET)) +(uint16_t)((4*(y))+2)*(SCREEN_XSIZE)), _XL_BLACK); \\\n            // DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1+X_OFFSET)+(uint8_t)((4*(y)+2))*((uint16_t) (SCREEN_XSIZE))), _SPACE); \\\n        // } \\\n    // } \\\n    // while(0)\n        \n#else\n    #define _XL_DRAW(x,y,tile,color) \\\n    do \\\n    { \\\n        uint8_t computed_loc = (((uint16_t) BASE_ADDR)+(2*(x))+(uint8_t)(2*(y))*((uint16_t) (SCREEN_XSIZE + X_OFFSET))); \\\n        \\\n        DISPLAY_POKE(computed_loc, (tile)); \\\n        DISPLAY_POKE(computed_loc+2, (tile)); \\\n        DISPLAY_POKE(computed_loc+4*SCREEN_XSIZE, (tile)); \\\n        DISPLAY_POKE(computed_loc+2+4*SCREEN_XSIZE, (tile)); \\\n    } \\\n    while(0)\n\n#endif\n\n\n#define _XL_DELETE(x,y) \\\ndo \\\n{ \\\n    COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+X_OFFSET)) +(uint16_t)((y))*(4*SCREEN_XSIZE)), _XL_BLACK); \\\n    DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+X_OFFSET)+(uint8_t)((y))*((uint16_t) (4*SCREEN_XSIZE))), _SPACE); \\\n    \\\n    COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1+X_OFFSET)) +(uint16_t)((y))*(4*SCREEN_XSIZE)), _XL_BLACK); \\\n    DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1+X_OFFSET)+(uint8_t)((y))*((uint16_t) (4*SCREEN_XSIZE))), _SPACE); \\\n    \\\n    if(y<HARD_Y_LIMIT) \\\n    { \\\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+X_OFFSET)) +(uint16_t)(4*(y)+2)*(SCREEN_XSIZE)), _XL_BLACK); \\\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+X_OFFSET)+(uint8_t)((4*(y)+2))*((uint16_t) (SCREEN_XSIZE))), _SPACE); \\\n        \\\n        COLOR_POKE((uint16_t) ((uint16_t) (COLOR_ADDR+(2*(x)+1+X_OFFSET)) +(uint16_t)((4*(y))+2)*(SCREEN_XSIZE)), _XL_BLACK); \\\n        DISPLAY_POKE((((uint16_t) BASE_ADDR)+(2*(x)+1+X_OFFSET)+(uint8_t)((4*(y)+2))*((uint16_t) (SCREEN_XSIZE))), _SPACE); \\\n    } \\\n} \\\nwhile(0)\n\n\n#endif\n\n#endif // ___QUAD_MEMORY_MAPPED_GRAPHICS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/rex_graphics.h",
    "content": "#ifndef _REX_GRAPHICS\n#define _REX_GRAPHICS\n\n#include <rex/rex.h>\n\n#include \"standard_libs.h\"\n\nextern uint8_t char_list[];\n\nextern uint8_t space_str[];\n\n#define _XL_DRAW(x,y,tile,color) DsPrintf((x),(y),16,char_list+tile)\n\n#define _XL_DELETE(x,y) DsPrintf((x),(y),16,space_str)\n\n#endif // _REX_GRAPHICS\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/terminal_graphics.h",
    "content": "#ifndef _TERMINAL_GRAPHICS_H\n#define _TERMINAL_GRAPHICS_H\n\nvoid _terminal_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\nvoid _terminal_delete(uint8_t x, uint8_t y);\n\n    #define _XL_DRAW(x,y,tile,color) \\\n        _terminal_draw(x,y,tile,color)\n\t\t\n\n\n\t#define _XL_DELETE(x,y) \\\n        _terminal_delete(x,y)\n\n\n\n#endif // _TERMINAL_GRAPHICS_H\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/vdp_mode1_graphics.h",
    "content": "#ifndef _VDP_MODE1_GRAPHICS\r\n#define _VDP_MODE1_GRAPHICS\r\n\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#define _CREAT_XSIZE 32\r\n#define _CREAT_YSIZE 24\r\n\r\n#if defined(__CREATIVISION__)\r\n    #define BASE_ADDR 0x1000\r\n#elif defined(__TI99__)\r\n    #define BASE_ADDR gImage\r\n#endif\r\n\r\n#define VDP_DATA  0x3000\r\n#define VDP_CONTROL 0x3001\r\n\r\n\r\n   \r\n    \r\n#if defined(__CREATIVISION__)\r\n    #include <peekpoke.h>\r\n\r\n    #define CHAR_BASE ((uint16_t) 0x0000)\r\n    #define COLOR_DEF ((uint16_t) 0x1800)   \r\n    \r\n    #define DISPLAY_POKE(addr,val) \\\r\n    do { \\\r\n        __asm__(\"sei\"); \\\r\n        POKE(VDP_CONTROL,(uint8_t) (addr&0x00FF)); \\\r\n        POKE(VDP_CONTROL,(uint8_t) (addr>>8)|0x40); \\\r\n        POKE(VDP_DATA,val); \\\r\n        __asm__(\"cli\"); \\\r\n    } while(0)\r\n#elif defined(__TI99__)\r\n    \r\n    #define DISPLAY_POKE(addr,val) \\\r\n    do { \\\r\n        vdpmemset(addr,val,1); \\\r\n    } while(0)\r\n#endif\r\n\r\nuint16_t loc(uint8_t x, uint8_t y);\r\n\r\n#if defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\r\n    #define X_MULT 2\r\n    #define Y_MULT 2\r\n#else\r\n    #define X_MULT 1\r\n    #define Y_MULT 1\r\n#endif\r\n\r\n// TODO: Isolate the bug when _XL_DRAW uses loc(x,y)\r\n// loc(x,y) -> \r\n// no string displayed after _XL_DRAW in title screen of Snake\r\n//\r\n// locti99(x,y) ->\r\n// games/stinger/main.o: In function `L300':\r\n// (.text+0x1585): relocation truncated to fit: R_TMS9900_PC8 against `.text'\r\n// make: *** [makefiles.common/targets/gcc4ti/Makefile_ti99:132: xchase.ea5.elf] Error 1\r\n\r\n// #define locti99(x, y) ((uint16_t) BASE_ADDR)+(X_MULT)*x+(uint8_t)((Y_MULT)*y)*(uint16_t) ((XSize) + X_OFFSET)\r\n\r\n\r\n// #define _XL_DRAW(x,y,__tile,__color) \\\r\n// do \\\r\n// { \\\r\n    // DISPLAY_POKE(locti99(x,y), (__tile)+(__color)); \\\r\n// } \\\r\n// while(0)\r\n\r\n// #define _XL_DELETE(x,y) DISPLAY_POKE(locti99(x,y), _SPACE)\r\n\r\n\r\n#define _XL_DRAW(x,y,__tile,__color) \\\r\ndo \\\r\n{ \\\r\n    DISPLAY_POKE(loc(x,y), (__tile)+(__color)); \\\r\n} \\\r\nwhile(0)\r\n\r\n#define _XL_DELETE(x,y) DISPLAY_POKE(loc(x,y), _SPACE)\r\n\r\n\r\n\r\n#endif // _VDP_MODE1_GRAPHICS\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/vectorial_graphics.h",
    "content": "#ifndef ___VECTORIAL_GRAPHICS_GRAPHICS\n#define ___VECTORIAL_GRAPHICS_GRAPHICS\n\n\n// TODO: to be implemented\n\n#define _XL_DRAW(tile,color) \n\n#define _XL_DELETE(x,y) \n\t\t\n#endif // ___VECTORIAL_GRAPHICS_GRAPHICS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/vga_graphics.h",
    "content": "\r\n\r\n// void _XL_DRAW(uint8_t x, uint8_t y, uint8_t tile, uint8_t color);\r\n\r\n\r\n// void _XL_DELETE(uint8_t x, uint8_t y);\r\n// TODO: color \r\n#define _XL_DRAW(x,y,tile,color) \\\r\n    _display_tile(x,y,tile,color);\r\n\r\n#define _XL_DELETE(x,y) \\\r\n    _delete_vga_tile(8*(uint16_t)(x),8*(uint16_t)(y));\r\n\r\n// #define _XL_DELETE(x,y) \\\r\n    // _display_tile(x,y,0,0);\r\n\r\n\r\n// #define _XL_DELETE2(x,y) \\\r\n    // do \\\r\n    // { \\\r\n        // _delete_vga_tile(x,y); \\\r\n        // _delete_vga_tile(x,(y+1)); \\\r\n        // _delete_vga_tile(x,(y+2)); \\\r\n        // _delete_vga_tile(x,(y+3)); \\\r\n        // _delete_vga_tile(x,(y+4)); \\\r\n        // _delete_vga_tile(x,(y+5)); \\\r\n        // _delete_vga_tile(x,(y+6)); \\\r\n        // _delete_vga_tile(x,(y+7)); \\\r\n    // } while(0)"
  },
  {
    "path": "src/cross_lib/display/graphics_mode/z88dk_sprites_graphics.h",
    "content": "#ifndef __Z88DK_SPRITES_GRAPHICS_GRAPHICS\n#define __Z88DK_SPRITES_GRAPHICS_GRAPHICS\n\n#include <graphics.h>\n#include <games.h>\n\n#include <stdint.h>\n\nextern uint8_t sprites[];\n\n#include \"display_target_geometry.h\"\n\n#define BLIT_OPERATION spr_or\n\n#if defined(__ZX81__) || defined(__C128_Z80__)\n\t#define _XL_DELETE(x,y) \\\n\t\tclga((x)*(__SPRITE_X_STEP),(y)*(__SPRITE_Y_STEP),SPRITE_X_SIZE,SPRITE_Y_SIZE)\n#else\n\t#define _XL_DELETE(x,y) \\\n\t\tputsprite(spr_and,(x)*(__SPRITE_X_STEP),(y)*(__SPRITE_Y_STEP),sprites + ((_SPACE)*(2+SPRITE_Y_SIZE)))\n#endif\n\n#if defined(__NO_SPRITE_TRANSPARENCY)\n    #define _XL_DRAW(x,y,tile,color) \\\n        do \\\n        { \\\n            _XL_DELETE(x,y); \\\n            putsprite(BLIT_OPERATION,(x)*(__SPRITE_X_STEP),(y)*(__SPRITE_Y_STEP),sprites + ((tile)*(2+SPRITE_Y_SIZE))); \\\n        } while(0)\n#else\n    #define _XL_DRAW(x,y,tile,color) \\\n        putsprite(BLIT_OPERATION,(x)*(__SPRITE_X_STEP),(y)*(__SPRITE_Y_STEP),sprites + ((tile)*(2+SPRITE_Y_SIZE)))\n#endif\n\n\n#endif // __Z88DK_SPRITES_GRAPHICS_GRAPHICS\n\n\n"
  },
  {
    "path": "src/cross_lib/display/graphics_settings.h",
    "content": "#ifndef _GRAPHICS_SETTING_H\r\n#define _GRAPHICS_SETTING_H\r\n\r\n\r\n#  if defined(__MEMORY_MAPPED_GRAPHICS)\r\n\t#include \"memory_mapped_graphics.h\"\r\n#elif defined(__PV1000_GRAPHICS)\r\n    #include \"pv1000_graphics.h\"\r\n#elif defined(__VGA_GRAPHICS)\r\n    #include \"vga_graphics.h\"\r\n\r\n#elif defined(__BBC__) && defined(__BBC_GRAPHICS)\r\n    #include \"bbc_graphics.h\"\r\n#elif defined(__TERMINAL__) \r\n    #include \"terminal_graphics.h\"\r\n#elif defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\r\n\t#include \"quad_memory_mapped_graphics.h\"\r\n#elif defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n\t#include \"dual_memory_mapped_graphics.h\" \r\n#elif defined(__ATARI7800_COLOR_GRAPHICS)\r\n\t#include \"atari7800_color_graphics.h\"\r\n#elif defined(__APPLE2_HGR_GRAPHICS)\r\n    #include \"apple2_hgr_graphics.h\"\r\n#elif defined(__VDP_MODE1_GRAPHICS)\r\n\t#include \"vdp_mode1_graphics.h\"\r\n#elif defined(__NES_CONIO_GRAPHICS)\r\n\t#include \"nes_conio_graphics.h\"\r\n#elif defined(__COMX_COLOR_GRAPHICS)\r\n\t#include \"lcc1802_color_graphics.h\"\r\n#elif defined(__ORIC_COLOR_GRAPHICS)\r\n\t#include \"oric_color_graphics.h\"\r\n#elif defined(__CONIO_GRAPHICS)\r\n\t#include \"conio_graphics.h\"\r\n#elif defined(__ANTIC_MODE6_GRAPHICS)\r\n    #include \"antic_mode6_graphics.h\"\r\n#elif defined(__VECTORIAL_GRAPHICS)\r\n\t#include \"vectorial_graphics.h\"\r\n#elif defined(__BUFFERED_GRAPHICS)\r\n\t#include \"buffered_graphics.h\"\r\n#elif defined(__Z88DK_SPRITES_GRAPHICS)\r\n\t#include \"z88dk_sprites_graphics.h\"\r\n#elif defined(__LYNX_TGI_GRAPHICS)\r\n    #include \"atari_lynx_tgi_graphics.h\"\r\n#elif defined(__CPCRSLIB_GRAPHICS)\r\n\t#include \"cpc_cpcrslib_graphics.h\"\r\n#elif defined(__BIT_MAPPED_16_GRAPHICS)\r\n\t#include \"bit_mapped_16_graphics.h\"\r\n#elif defined(__BIT_MAPPED_4_GRAPHICS)\r\n\t#include \"bit_mapped_4_graphics.h\"\r\n#elif defined(__BIT_MAPPED_GRAPHICS)\r\n\t#include \"bit_mapped_graphics.h\"\r\n#elif defined(__REX_GRAPHICS)\r\n\t#include \"rex_graphics.h\"\r\n#elif defined(__LCC1802_GRAPHICS)\r\n\t#include \"lcc1802_graphics.h\"\r\n#elif defined(__PV1000_GRAPHICS)\r\n    #include \"pv1000_graphics.h\"\r\n#elif defined(__NO_GRAPHICS)\r\n\t#include \"no_graphics.h\"\r\n#endif\r\n\r\n#endif // _GRAPHICS_SETTING_H\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/ack/msdos386/init386_vga.s",
    "content": ".sect .text\r\n.sect .rom\r\n.sect .data\r\n.sect .bss\r\n\r\n.sect .text\r\n\r\n\r\n\r\n! Protected mode code\r\n! Set VGA mode 13h through DPMI\r\n\r\n!mov ax, 0x0000        ; AL=00: set video mode\r\n!mov bx, 0x0013        ; mode 13h\r\n!mov cx, 0             ; not used\r\n\r\n!; Build the real-mode register structure somewhere in memory:\r\n!; DPMI real-mode call uses a 16-byte structure.\r\n\r\n!; ES:DI points to the structure\r\n\r\n!mov ax, 0x0300        ; DPMI: simulate real-mode interrupt\r\n!mov bl, 0x10          ; BIOS interrupt 10h\r\n!int 0x31              ; run it\r\n\r\n\r\n.define __init_vga\r\n__init_vga:\r\nret\r\n\r\n\r\n\r\n!.define __cls\r\n!__cls:\r\n!    push bp\r\n!    push di\r\n!    mov ax, 0x0013   ! VGA 320x200x256\r\n!    int 0x10          ! BIOS sets the mode and clears the screen\r\n!    pop di\r\n!    pop bp\r\n!    ret\r\n\r\n!.define __init_vga\r\n!__init_vga:\r\n!    push bp\r\n!    push di\r\n!    mov ax, 0x13\r\n!    int 0x10\r\n!    pop di\r\n!    pop bp\r\n!    ret\r\n    \r\n!.define __video_mode\r\n!__video_mode:\r\n!    push bp\r\n!    push di\r\n!    mov ax, 19\r\n!    int 16\r\n!    pop di\r\n!    pop bp\r\n!    ret\r\n\r\n.define __keyboard_init\r\n__keyboard_init:\r\n    push bp\r\n    push di\r\n    movb ah, 0x03 \r\n    movb al, 0x05 !set typematic rate/delay\r\n    movb bh, 0x00 !repeat delay: 250ms <-- this has to be 0\r\n    movb bl, 0x00 !typematic rate: 30\r\n    int 0x16\r\n    pop di\r\n    pop bp\r\n    ret\r\n\r\n\r\n!.define _text_mode\r\n!_text_mode:\r\n!    mov ax, 3\r\n!    int 16\r\n!    ret\r\n\r\n.define __wait_for_key\r\n__wait_for_key:\r\n    push bp\r\n    push di\r\n    movb ah, 0x00    ! function: wait for key\r\n    int 0x16         ! returns key in AX\r\n    pop di\r\n    pop bp\r\n    ret\r\n   \r\n\r\n.define __delete_vga_pixel\r\n__delete_vga_pixel:\r\n    push    bp\r\n    mov     bp, sp\r\n    push    ax\r\n    push    bx\r\n    push    cx\r\n    push    dx\r\n    push    di\r\n    \r\n    ! mov bx, sp\r\n    mov cx, 4(bp)\r\n    mov dx, 6(bp)\r\n\r\n\r\n    ! Set ES = A000h (VGA memory)\r\n    mov     ax, 0xA000\r\n    mov     es, ax\r\n\r\n\r\n    ! Compute offset = y*320 + x\r\n    mov     ax, dx       ! AX = y\r\n    mov     bx, 320\r\n    mul     bx           ! AX = y*320   (fits in 16 bits)\r\n    add     ax, cx       ! AX = y*320 + x\r\n    mov     di, ax       ! DI = offset\r\n\r\n    ! movb al, 0       ! color\r\n    xor ax,ax\r\n\r\n    ! AL already contains color\r\n    ! Write pixel using STOSB\r\n   \r\n    stosb                 ! [ES:DI] = AL, increments DI\r\n    \r\n    \r\n    pop     di\r\n    pop     dx\r\n    pop     cx\r\n    pop     bx\r\n    pop     ax\r\n    pop     bp\r\n    ret\r\n\r\n.define __delete_vga_segment\r\n__delete_vga_segment:\r\n    push    bp\r\n    mov     bp, sp\r\n!    push    ax\r\n!    push    bx\r\n    push    cx\r\n!    push    dx\r\n    push    di\r\n    \r\n    ! mov bx, sp\r\n    mov cx, 4(bp)\r\n    mov dx, 6(bp)\r\n\r\n\r\n    ! Set ES = A000h (VGA memory)\r\n    mov     ax, 0xA000\r\n    mov     es, ax\r\n\r\n\r\n    ! Compute offset = y*320 + x\r\n    mov     ax, dx       ! AX = y\r\n    mov     bx, 320\r\n    mul     bx           ! AX = y*320   (fits in 16 bits)\r\n    add     ax, cx       ! AX = y*320 + x\r\n    mov     di, ax       ! DI = offset\r\n\r\n    movb al, 0       ! color\r\n\r\n    ! AL already contains color\r\n    ! Write pixel using STOSB\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n    \r\n    \r\n    pop     di\r\n!    pop     dx\r\n    pop     cx\r\n!    pop     bx\r\n!    pop     ax\r\n    pop     bp\r\n    ret\r\n\r\n\r\n! TODO: Fix this because it is still broken\r\n.define __delete_vga_tile\r\n__delete_vga_tile:\r\n    push    bp\r\n    mov     bp, sp\r\n!    push    ax\r\n!    push    bx\r\n    push    cx\r\n!    push    dx\r\n    push    di\r\n    \r\n    ! mov bx, sp\r\n    mov cx, 4(bp)\r\n    mov dx, 6(bp)\r\n\r\n\r\n    ! Set ES = A000h (VGA memory)\r\n    mov     ax, 0xA000\r\n    mov     es, ax\r\n\r\n\r\n    ! Compute offset = y*320 + x\r\n    mov     ax, dx       ! AX = y\r\n    mov     bx, 320\r\n    mul     bx           ! AX = y*320   (fits in 16 bits)\r\n    add     ax, cx       ! AX = y*320 + x\r\n    mov     di, ax       ! DI = offset\r\n\r\n    movb al, 0       ! color\r\n\r\n    ! AL already contains color\r\n    ! Write pixel using STOSB\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n   \r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    \r\n    \r\n    pop     di\r\n!    pop     dx\r\n    pop     cx\r\n!    pop     bx\r\n!    pop     ax\r\n    pop     bp\r\n    ret\r\n\r\n\r\n! PlotPixel_STOSB:\r\n!   CX = x (0..319)\r\n!   DX = y (0..199)\r\n!   AL = color (0..255)\r\n! Uses STOSB to write the pixel\r\n! Registers preserved.\r\n.define __plot_vga\r\n__plot_vga:\r\n    ! Stack layout (cdecl):\r\n    ! esp+4  -> x   (32-bit int)\r\n    ! esp+8  -> y   (32-bit int)\r\n    ! esp+12 -> color (8-bit, but passed as 32-bit)\r\n\r\n    !mov eax, [esp+4]      ! eax = x\r\n    !mov ebx, [esp+8]      ! ebx = y\r\n    !mov ecx, [esp+12]     ! ecx = color (lower byte used)\r\n\r\n    mov eax, 4(esp)      ! eax = x\r\n    mov ebx, 8(esp)     ! ebx = y\r\n    mov ecx, 12(esp)     ! ecx = color (lower byte used)\r\n\r\n    ! offset = y * 320 + x\r\n    imul ebx, ebx, 320     ! ebx = y*320\r\n    add ebx, eax           ! ebx = y*320 + x\r\n\r\n    ! edi = A0000h + offset\r\n    mov edi, 0xA0000\r\n    add edi, ebx\r\n\r\n! eseg mov (esi), al\r\n\r\n    ! Write pixel\r\n    !mov [edi], cl          ! store color byte\r\n    eseg movb (esi), cl          ! store color byte\r\n\r\n    ret\r\n\r\n\r\n.define __kb_poll\r\n__kb_poll:\r\n    inb 0x60\r\n    ret\r\n\r\n! int kb_poll_buffer() returns ASCII code or 0 if none\r\n! it also flushes the buffer (so the buffer behaves as a 1 byte buffer)\r\n.define __kb_poll_buffer\r\n__kb_poll_buffer:\r\n    push bp\r\n    push di\r\n    push bx\r\n\r\n    movb bl, 0\r\nCheckLoop:\r\n    movb ah, 0x01\r\n    int 0x16\r\n    jz Done\r\n    \r\n    movb ah, 0x00\r\n    int 0x16\r\n    movb bl, al\r\n    jmp CheckLoop\r\nDone:\r\n    movb ah, 0\r\n    movb al, bl\r\n    pop bx\r\n    pop di\r\n    pop bp\r\n    ret\r\n\r\n\r\n\r\n\r\n.define __speaker_beep\r\n__speaker_beep:\r\n    push bp\r\n    \r\n    mov     bp, sp\r\n    \r\n    push di\r\n    movb     al, 0xB6       ! Channel 2, lobyte/hibyte, mode 3 (square wave)\r\n    outb     0x43\r\n\r\n    mov ax, 4(bp)\r\n    !mov      ax, 1193\r\n    outb     0x42        ! Low byte\r\n    movb     al, ah\r\n    outb     0x42        ! High byte\r\n\r\n    ! Enable speaker (bits 0 and 1 of port 61h)\r\n    inb      0x61\r\n    orb      al, 0x03\r\n    outb     0x61\r\n\r\n    ! ---- Delay loop ----\r\n    mov cx,  6(bp)\r\n.delay:\r\n    loop .delay\r\n\r\n    ! Disable speaker\r\n    inb      0x61\r\n    andb     al, 0xFC       ! clear bits 0 and 1\r\n    outb     0x61\r\n    pop di\r\n    pop bp\r\n    \r\n    ret\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/ack/msdos386/msdos386_init_graphics.c",
    "content": "\r\n// #define POKE(addr,val)     (*(unsigned char *) (addr) = (val))\r\n// #define POKEW(addr,val)    (*(unsigned int *) (addr) = (val))\r\n\r\n// #define SCREEN_BASE (0x0000A000UL)\r\n// #define TEXT_BASE   (0x0000B800UL)\r\n\r\n#include <stdlib.h>\r\n#include <stdio.h>\r\n\r\n#include \"8x8_chars.h\"\r\n\r\nextern void _init_vga(void);\r\nextern void _video_mode(void);\r\nextern void _delete_vga_tile(uint16_t x, uint16_t y);\r\nextern void _delete_vga_segment(uint16_t x, uint16_t y);\r\nextern void _delete_vga_pixel(uint16_t x, uint16_t y);\r\n\r\nextern void _keyboard_init(void);\r\n\r\nextern void _plot_vga(uint16_t x, uint16_t y, uint8_t color);\r\n\r\nuint8_t _vga_text_color;\r\n\r\nuint16_t _i86_tiles[][8] = \r\n    {\r\n        _TILE_0_UDG,\r\n        _TILE_1_UDG,\r\n        _TILE_2_UDG,\r\n        _TILE_3_UDG,\r\n        _TILE_4_UDG,\r\n        _TILE_5_UDG,\r\n        _TILE_6_UDG,\r\n        _TILE_7_UDG,\r\n        _TILE_8_UDG,\r\n        _TILE_9_UDG,\r\n        _TILE_10_UDG,\r\n        _TILE_11_UDG,\r\n        _TILE_12_UDG,\r\n        _TILE_13_UDG,\r\n        _TILE_14_UDG,\r\n        _TILE_15_UDG,\r\n        _TILE_16_UDG,\r\n        _TILE_17_UDG,\r\n        _TILE_18_UDG,\r\n        _TILE_19_UDG,\r\n        _TILE_20_UDG,\r\n        _TILE_21_UDG,\r\n        _TILE_22_UDG,\r\n        _TILE_23_UDG,\r\n        _TILE_24_UDG,\r\n        _TILE_25_UDG,\r\n        _TILE_26_UDG,\r\n        _TILE_A,\r\n        _TILE_B,\r\n        _TILE_C,\r\n        _TILE_D,\r\n        _TILE_E,\r\n        _TILE_F,\r\n        _TILE_G,\r\n        _TILE_H,\r\n        _TILE_I,\r\n        _TILE_J,\r\n        _TILE_K,\r\n        _TILE_L,\r\n        _TILE_M,\r\n        _TILE_N,\r\n        _TILE_O,\r\n        _TILE_P,\r\n        _TILE_Q,\r\n        _TILE_R,\r\n        _TILE_S,\r\n        _TILE_T,\r\n        _TILE_U,\r\n        _TILE_V,\r\n        _TILE_W,\r\n        _TILE_X,\r\n        _TILE_Y,\r\n        _TILE_Z,\r\n        _TILE_DIGIT_0,\r\n        _TILE_DIGIT_1,\r\n        _TILE_DIGIT_2,\r\n        _TILE_DIGIT_3,\r\n        _TILE_DIGIT_4,\r\n        _TILE_DIGIT_5,\r\n        _TILE_DIGIT_6,\r\n        _TILE_DIGIT_7,\r\n        _TILE_DIGIT_8,\r\n        _TILE_DIGIT_9,\r\n        _SPACE_TILE,\r\n    };\r\n\r\n\r\n\r\n// void _display_tile(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\r\n// {\r\n    // uint8_t row;\r\n    // uint8_t col;\r\n    // uint16_t row_pos;\r\n    // uint16_t col_pos;\r\n    // uint8_t tile_row;\r\n    \r\n    // for(row=0;row<8;++row)\r\n    // {\r\n        // row_pos = 8*(uint16_t)y+row;\r\n        // tile_row = _i86_tiles[tile][row];\r\n        // for(col=0;col<8;++col)\r\n        // {\r\n            // col_pos = 8*(uint16_t)x+col;\r\n            // if(tile_row&(128>>col))\r\n            // {\r\n                // _plot_vga(col_pos,row_pos,color);\r\n            // }\r\n            // else\r\n            // {\r\n                // _delete_vga_pixel(col_pos,row_pos);\r\n            // }\r\n        // }\r\n    // }\r\n// }\r\n\r\n\r\nvoid _display_tile(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\r\n{\r\n    uint8_t row;\r\n    uint8_t col;\r\n    uint16_t row_pos;\r\n    uint16_t col_pos;\r\n    uint8_t tile_row;\r\n    \r\n    row_pos = 8*(uint16_t)y;\r\n    for(row=0;row<8;++row)\r\n    {\r\n        tile_row = _i86_tiles[tile][row];\r\n        col_pos = 8*(uint16_t)x;\r\n        for(col=0;col<8;++col)\r\n        {\r\n            if(tile_row&(128>>col))\r\n            {\r\n                _plot_vga(col_pos,row_pos,color);\r\n            }\r\n            else\r\n            {\r\n                _delete_vga_pixel(col_pos,row_pos);\r\n            }\r\n            ++col_pos;\r\n        }\r\n        ++row_pos;\r\n    }\r\n}\r\n\r\n\r\n// void _delete_tile(uint8_t x, uint8_t y)\r\n// {\r\n    // _delete_vga_tile(8*(uint16_t)x,8*(uint16_t)y);\r\n// }\r\n\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n\r\n    _init_vga();\r\n\r\n    _keyboard_init();\r\n    \r\n    // _plot_vga(10,10,100);\r\n    // _plot_vga(20,10,110);\r\n    // _plot_vga(30,20,120);\r\n    // _plot_vga(40,20,130);\r\n\r\n    // while(1){};\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/ack/msdos86/CGA.txt",
    "content": "; ==========================================================\r\n; CGA Mode 04h pixel plot\r\n; void plot_pixel(int x, int y, unsigned char color);\r\n; ==========================================================\r\n\r\n        public _plot_pixel\r\n_plot_pixel proc near\r\n        push bp\r\n        mov  bp, sp\r\n\r\n        push ax\r\n        push bx\r\n        push cx\r\n        push dx\r\n        push si\r\n\r\n        mov bx, [bp+4]       ; x\r\n        mov cx, [bp+6]       ; y\r\n        mov dl, [bp+8]       ; color (0–3)\r\n\r\n        ;------------------------------------------\r\n        ; Compute base address:\r\n        ; B800:0000 = even scanlines\r\n        ; B800:2000 = odd scanlines\r\n        ;------------------------------------------\r\n\r\n        mov ax, 0B800h\r\n        mov es, ax\r\n\r\n        mov ax, cx\r\n        shr ax, 1            ; ax = y/2\r\n        mov si, ax\r\n        mov ax, 80\r\n        mul si               ; ax = (y/2)*80\r\n\r\n        mov si, ax           ; SI = line base\r\n\r\n        test cx, 1\r\n        jz LineEven\r\n        add si, 2000h        ; odd lines start at offset 0x2000\r\nLineEven:\r\n\r\n        ; --- byte offset += x/2 ---\r\n        mov ax, bx\r\n        shr ax, 1            ; ax = x/2\r\n        add si, ax\r\n\r\n        ;------------------------------------------\r\n        ; Determine which half-byte to modify\r\n        ;------------------------------------------\r\n\r\n        mov al, es:[si]      ; read old byte\r\n\r\n        test bx, 1\r\n        jz PixelLeft\r\n\r\n        ; Right pixel (low 4 bits)\r\n        and al, 0F0h         ; clear low nibble\r\n        or  al, dl           ; insert color 0..3\r\n        jmp Store\r\n\r\nPixelLeft:\r\n        ; Left pixel (high 4 bits)\r\n        and al, 0Fh          ; clear high nibble\r\n        mov ah, dl\r\n        shl ah, 4            ; move into high nibble\r\n        or  al, ah\r\n\r\nStore:\r\n        mov es:[si], al      ; write pixel\r\n\r\n        pop si\r\n        pop dx\r\n        pop cx\r\n        pop bx\r\n        pop ax\r\n        pop bp\r\n        ret 6\r\n_plot_pixel endp"
  },
  {
    "path": "src/cross_lib/display/init_graphics/ack/msdos86/EGA.txt",
    "content": "; ==========================================================\r\n; void plot_pixel(int x, int y, unsigned char color);\r\n; ==========================================================\r\n\r\n        public _plot_pixel\r\n_plot_pixel proc near\r\n        push bp\r\n        mov  bp, sp\r\n\r\n        push ax\r\n        push bx\r\n        push cx\r\n        push dx\r\n        push si\r\n\r\n        mov bx, [bp+4]        ; x\r\n        mov cx, [bp+6]        ; y\r\n        mov dl, [bp+8]        ; color\r\n\r\n        ; offset = y * 40 + (x >> 3)\r\n        mov ax, cx\r\n        mov si, 40\r\n        mul si                ; ax = y*40\r\n        mov si, ax\r\n        mov ax, bx\r\n        shr ax, 3             ; ax = x/8\r\n        add si, ax\r\n\r\n        ; mask = 80h >> (x & 7)\r\n        mov dx, bx\r\n        and dx, 7\r\n        mov ah, 80h\r\n        mov cl, dl            ; save color\r\n        shr ah, cl            ; mask in AH\r\n\r\n        ; Now write color bit-by-bit into 4 planes\r\n        mov ax, 0A000h\r\n        mov es, ax\r\n\r\n        mov al, dl            ; al = color\r\n        mov cx, 4\r\n\r\nWritePlane:\r\n        push ax\r\n        push cx\r\n\r\n        ; Select plane = (1 << plane)\r\n        mov dx, 3C4h\r\n        mov al, 02h           ; index = 2 (Map Mask Register)\r\n        mov ah, 1\r\n        shl ah, cl            ; mask = 1 << plane\r\n        out dx, ax\r\n\r\n        ; Write bit if this plane's color bit = 1\r\n        pop cx\r\n        pop ax\r\n\r\n        test al, 1\r\n        jz SkipWrite\r\n        mov es:[si], ah       ; write mask bit\r\n\r\nSkipWrite:\r\n        shr al, 1             ; next color bit (next plane)\r\n        loop WritePlane\r\n\r\n        pop si\r\n        pop dx\r\n        pop cx\r\n        pop bx\r\n        pop ax\r\n        pop bp\r\n        ret 6\r\n\r\n_plot_pixel endp"
  },
  {
    "path": "src/cross_lib/display/init_graphics/ack/msdos86/init_vga.s",
    "content": ".sect .text\r\n.sect .rom\r\n.sect .data\r\n.sect .bss\r\n\r\n.sect .text\r\n\r\n!.define __cls\r\n!__cls:\r\n!    push bp\r\n!    push di\r\n!    mov ax, 0x0013   ! VGA 320x200x256\r\n!    int 0x10          ! BIOS sets the mode and clears the screen\r\n!    pop di\r\n!    pop bp\r\n!    ret\r\n\r\n.define __init_vga\r\n__init_vga:\r\n    push bp\r\n    push di\r\n    mov ax, 0x13\r\n    int 0x10\r\n    pop di\r\n    pop bp\r\n    ret\r\n    \r\n!.define __video_mode\r\n!__video_mode:\r\n!    push bp\r\n!    push di\r\n!    mov ax, 19\r\n!    int 16\r\n!    pop di\r\n!    pop bp\r\n!    ret\r\n\r\n.define __keyboard_init\r\n__keyboard_init:\r\n    push bp\r\n    push di\r\n    movb ah, 0x03 \r\n    movb al, 0x05 !set typematic rate/delay\r\n    movb bh, 0x00 !repeat delay: 250ms <-- this has to be 0\r\n    movb bl, 0x00 !typematic rate: 30\r\n    int 0x16\r\n    pop di\r\n    pop bp\r\n    ret\r\n\r\n\r\n!.define _text_mode\r\n!_text_mode:\r\n!    mov ax, 3\r\n!    int 16\r\n!    ret\r\n\r\n.define __wait_for_key\r\n__wait_for_key:\r\n    push bp\r\n    push di\r\n    movb ah, 0x00    ! function: wait for key\r\n    int 0x16         ! returns key in AX\r\n    pop di\r\n    pop bp\r\n    ret\r\n   \r\n\r\n.define __delete_vga_pixel\r\n__delete_vga_pixel:\r\n    push    bp\r\n    mov     bp, sp\r\n    push    ax\r\n    push    bx\r\n    push    cx\r\n    push    dx\r\n    push    di\r\n    \r\n    ! mov bx, sp\r\n    mov cx, 4(bp)\r\n    mov dx, 6(bp)\r\n\r\n\r\n    ! Set ES = A000h (VGA memory)\r\n    mov     ax, 0xA000\r\n    mov     es, ax\r\n\r\n\r\n    ! Compute offset = y*320 + x\r\n    mov     ax, dx       ! AX = y\r\n    mov     bx, 320\r\n    mul     bx           ! AX = y*320   (fits in 16 bits)\r\n    add     ax, cx       ! AX = y*320 + x\r\n    mov     di, ax       ! DI = offset\r\n\r\n    ! movb al, 0       ! color\r\n    xor ax,ax\r\n\r\n    ! AL already contains color\r\n    ! Write pixel using STOSB\r\n   \r\n    stosb                 ! [ES:DI] = AL, increments DI\r\n    \r\n    \r\n    pop     di\r\n    pop     dx\r\n    pop     cx\r\n    pop     bx\r\n    pop     ax\r\n    pop     bp\r\n    ret\r\n\r\n.define __delete_vga_segment\r\n__delete_vga_segment:\r\n    push    bp\r\n    mov     bp, sp\r\n!    push    ax\r\n!    push    bx\r\n    push    cx\r\n!    push    dx\r\n    push    di\r\n    \r\n    ! mov bx, sp\r\n    mov cx, 4(bp)\r\n    mov dx, 6(bp)\r\n\r\n\r\n    ! Set ES = A000h (VGA memory)\r\n    mov     ax, 0xA000\r\n    mov     es, ax\r\n\r\n\r\n    ! Compute offset = y*320 + x\r\n    mov     ax, dx       ! AX = y\r\n    mov     bx, 320\r\n    mul     bx           ! AX = y*320   (fits in 16 bits)\r\n    add     ax, cx       ! AX = y*320 + x\r\n    mov     di, ax       ! DI = offset\r\n\r\n    movb al, 0       ! color\r\n\r\n    ! AL already contains color\r\n    ! Write pixel using STOSB\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n    \r\n    \r\n    pop     di\r\n!    pop     dx\r\n    pop     cx\r\n!    pop     bx\r\n!    pop     ax\r\n    pop     bp\r\n    ret\r\n\r\n\r\n! TODO: Fix this because it is still broken\r\n.define __delete_vga_tile\r\n__delete_vga_tile:\r\n    push    bp\r\n    mov     bp, sp\r\n!    push    ax\r\n!    push    bx\r\n    push    cx\r\n!    push    dx\r\n    push    di\r\n    \r\n    ! mov bx, sp\r\n    mov cx, 4(bp)\r\n    mov dx, 6(bp)\r\n\r\n\r\n    ! Set ES = A000h (VGA memory)\r\n    mov     ax, 0xA000\r\n    mov     es, ax\r\n\r\n\r\n    ! Compute offset = y*320 + x\r\n    mov     ax, dx       ! AX = y\r\n    mov     bx, 320\r\n    mul     bx           ! AX = y*320   (fits in 16 bits)\r\n    add     ax, cx       ! AX = y*320 + x\r\n    mov     di, ax       ! DI = offset\r\n\r\n    movb al, 0       ! color\r\n\r\n    ! AL already contains color\r\n    ! Write pixel using STOSB\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n   \r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    mov ax, di\r\n    add ax, 312\r\n    mov di, ax\r\n    movb al, 0\r\n    mov cx, 8\r\n    rep stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    \r\n    \r\n    pop     di\r\n!    pop     dx\r\n    pop     cx\r\n!    pop     bx\r\n!    pop     ax\r\n    pop     bp\r\n    ret\r\n\r\n\r\n! PlotPixel_STOSB:\r\n!   CX = x (0..319)\r\n!   DX = y (0..199)\r\n!   AL = color (0..255)\r\n! Uses STOSB to write the pixel\r\n! Registers preserved.\r\n.define __plot_vga\r\n__plot_vga:\r\n    push    bp\r\n    mov     bp, sp\r\n!    push    ax\r\n!    push    bx\r\n!    push    cx\r\n!    push    dx\r\n    push    di\r\n    \r\n    ! mov bx, sp\r\n    mov cx, 4(bp)\r\n    mov dx, 6(bp)\r\n\r\n\r\n    ! Set ES = A000h (VGA memory)\r\n    mov     ax, 0xA000\r\n    mov     es, ax\r\n\r\n\r\n    ! Compute offset = y*320 + x\r\n    mov     ax, dx       ! AX = y\r\n    mov     bx, 320\r\n    mul     bx           ! AX = y*320   (fits in 16 bits)\r\n    add     ax, cx       ! AX = y*320 + x\r\n    mov     di, ax       ! DI = offset\r\n\r\n    movb al, 8(bp)       ! color\r\n\r\n    ! AL already contains color\r\n    ! Write pixel using STOSB\r\n    stosb                 ! [ES:DI] = AL, increments DI\r\n\r\n    pop     di\r\n!    pop     dx\r\n!    pop     cx\r\n!    pop     bx\r\n!    pop     ax\r\n    pop     bp\r\n    ret\r\n\r\n\r\n.define __kb_poll\r\n__kb_poll:\r\n    inb 0x60\r\n    ret\r\n\r\n! int kb_poll_buffer() returns ASCII code or 0 if none\r\n! it also flushes the buffer (so the buffer behaves as a 1 byte buffer)\r\n.define __kb_poll_buffer\r\n__kb_poll_buffer:\r\n    push bp\r\n    push di\r\n    push bx\r\n\r\n    movb bl, 0\r\nCheckLoop:\r\n    movb ah, 0x01\r\n    int 0x16\r\n    jz Done\r\n    \r\n    movb ah, 0x00\r\n    int 0x16\r\n    movb bl, al\r\n    jmp CheckLoop\r\nDone:\r\n    movb ah, 0\r\n    movb al, bl\r\n    pop bx\r\n    pop di\r\n    pop bp\r\n    ret\r\n\r\n\r\n\r\n\r\n.define __speaker_beep\r\n__speaker_beep:\r\n    push bp\r\n    \r\n    mov     bp, sp\r\n    \r\n    push di\r\n    movb     al, 0xB6       ! Channel 2, lobyte/hibyte, mode 3 (square wave)\r\n    outb     0x43\r\n\r\n    mov ax, 4(bp)\r\n    !mov      ax, 1193\r\n    outb     0x42        ! Low byte\r\n    movb     al, ah\r\n    outb     0x42        ! High byte\r\n\r\n    ! Enable speaker (bits 0 and 1 of port 61h)\r\n    inb      0x61\r\n    orb      al, 0x03\r\n    outb     0x61\r\n\r\n    ! ---- Delay loop ----\r\n    mov cx,  6(bp)\r\n.delay:\r\n    loop .delay\r\n\r\n    ! Disable speaker\r\n    inb      0x61\r\n    andb     al, 0xFC       ! clear bits 0 and 1\r\n    outb     0x61\r\n    pop di\r\n    pop bp\r\n    \r\n    ret\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/ack/msdos86/msdos86_init_graphics.c",
    "content": "\r\n#include <stdlib.h>\r\n#include <stdio.h>\r\n\r\n#include \"8x8_chars.h\"\r\n\r\nextern void _init_vga(void);\r\nextern void _video_mode(void);\r\nextern void _delete_vga_tile(uint16_t x, uint16_t y);\r\nextern void _delete_vga_segment(uint16_t x, uint16_t y);\r\nextern void _delete_vga_pixel(uint16_t x, uint16_t y);\r\nextern void _speaker_beep(uint16_t freq, uint16_t length);\r\n\r\nextern void _keyboard_init(void);\r\n\r\nextern void _plot_vga(uint16_t x, uint16_t y, uint8_t color);\r\n\r\nuint8_t _vga_text_color;\r\n\r\nuint16_t _i86_tiles[][8] = \r\n    {\r\n        _TILE_0_UDG,\r\n        _TILE_1_UDG,\r\n        _TILE_2_UDG,\r\n        _TILE_3_UDG,\r\n        _TILE_4_UDG,\r\n        _TILE_5_UDG,\r\n        _TILE_6_UDG,\r\n        _TILE_7_UDG,\r\n        _TILE_8_UDG,\r\n        _TILE_9_UDG,\r\n        _TILE_10_UDG,\r\n        _TILE_11_UDG,\r\n        _TILE_12_UDG,\r\n        _TILE_13_UDG,\r\n        _TILE_14_UDG,\r\n        _TILE_15_UDG,\r\n        _TILE_16_UDG,\r\n        _TILE_17_UDG,\r\n        _TILE_18_UDG,\r\n        _TILE_19_UDG,\r\n        _TILE_20_UDG,\r\n        _TILE_21_UDG,\r\n        _TILE_22_UDG,\r\n        _TILE_23_UDG,\r\n        _TILE_24_UDG,\r\n        _TILE_25_UDG,\r\n        _TILE_26_UDG,\r\n        _TILE_A,\r\n        _TILE_B,\r\n        _TILE_C,\r\n        _TILE_D,\r\n        _TILE_E,\r\n        _TILE_F,\r\n        _TILE_G,\r\n        _TILE_H,\r\n        _TILE_I,\r\n        _TILE_J,\r\n        _TILE_K,\r\n        _TILE_L,\r\n        _TILE_M,\r\n        _TILE_N,\r\n        _TILE_O,\r\n        _TILE_P,\r\n        _TILE_Q,\r\n        _TILE_R,\r\n        _TILE_S,\r\n        _TILE_T,\r\n        _TILE_U,\r\n        _TILE_V,\r\n        _TILE_W,\r\n        _TILE_X,\r\n        _TILE_Y,\r\n        _TILE_Z,\r\n        _TILE_DIGIT_0,\r\n        _TILE_DIGIT_1,\r\n        _TILE_DIGIT_2,\r\n        _TILE_DIGIT_3,\r\n        _TILE_DIGIT_4,\r\n        _TILE_DIGIT_5,\r\n        _TILE_DIGIT_6,\r\n        _TILE_DIGIT_7,\r\n        _TILE_DIGIT_8,\r\n        _TILE_DIGIT_9,\r\n        _SPACE_TILE,\r\n    };\r\n\r\n\r\nvoid _display_tile(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\r\n{\r\n    uint8_t row;\r\n    uint8_t col;\r\n    uint16_t row_pos;\r\n    uint16_t col_pos;\r\n    uint8_t tile_row;\r\n    \r\n    row_pos = 8*(uint16_t)y;\r\n    for(row=0;row<8;++row)\r\n    {\r\n        tile_row = _i86_tiles[tile][row];\r\n        col_pos = 8*(uint16_t)x;\r\n        for(col=0;col<8;++col)\r\n        {\r\n            if(tile_row&(128>>col))\r\n            {\r\n                _plot_vga(col_pos,row_pos,color);\r\n            }\r\n            else\r\n            {\r\n                _delete_vga_pixel(col_pos,row_pos);\r\n            }\r\n            ++col_pos;\r\n        }\r\n        ++row_pos;\r\n    }\r\n}\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    _init_vga();\r\n    _keyboard_init();\r\n    _speaker_beep(100,100);\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc6303/mc10_init_graphics.c",
    "content": "\r\n#include \"standard_libs.h\"\r\n#include \"8x6_chars.h\"\r\n\r\n\r\n#define POKE(addr,val) (*(uint8_t*) (addr) = (val))\r\n\r\nconst uint8_t udgs[] =\r\n{\r\n    _TILE_0_UDG,  _TILE_1_UDG,  _TILE_2_UDG,  _TILE_4_UDG, \r\n    _TILE_5_UDG,  _TILE_6_UDG,  _TILE_7_UDG,  _TILE_8_UDG, \r\n    _TILE_9_UDG,  _TILE_10_UDG, _TILE_11_UDG, _TILE_12_UDG, \r\n    _TILE_13_UDG, _TILE_14_UDG, _TILE_15_UDG, _TILE_16_UDG, \r\n    _TILE_17_UDG, _TILE_18_UDG, _TILE_19_UDG, _TILE_20_UDG, \r\n    _TILE_21_UDG, _TILE_22_UDG, _TILE_23_UDG, _TILE_24_UDG, \r\n    _TILE_25_UDG, _TILE_26_UDG,    \r\n};\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // uint16_t i;\r\n    // uint8_t j;\r\n    // uint8_t c;\r\n    \r\n    __asm__(\"sei\"   );\r\n    POKE(49151U,36); \r\n    \r\n    // for(j=0;j<6 ;++j)\r\n    // {\r\n        // if((j&3)==0)\r\n        // {\r\n            // c=0xFF;\r\n        // }\r\n        // else if((j&3)==1)\r\n        // {\r\n            // c=0xAA;\r\n        // }\r\n        // else if((j&3)==2)\r\n        // {\r\n            // c=0x55;\r\n        // }\r\n        // else\r\n        // {\r\n            // c=0;\r\n        // }\r\n        // for(i=0;i<6000;++i)\r\n        // {\r\n            // POKE(0x4000+i,c);\r\n        // }\r\n    // }\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/agat/agat_init_graphics.c",
    "content": "// STA $C133 ; map 3-rd physical memory page to 3-rd CPU memory segment\r\n// LDA #$12  ; load red:green to A\r\n// STA $6000 ; store to 3-rd memory segment\r\n// LDA #$34  ; load yellow:blue to A\r\n// STA $6001 ; store to 3-rd memory segment\r\n// STA $C731 ; switch display controller to 3-rd memory page in 128x128 mode.\r\n\r\n#include<peekpoke.h>\r\n#include \"standard_libs.h\"\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // uint16_t i;\r\n    // uint16_t j;\r\n    \r\n    POKE(0xC133,0);\r\n    POKE(0xC731,0);\r\n\r\n    // for(i=0;i<8192;i+=2)\r\n    // {\r\n        // POKE(0x6000+i,0x12);\r\n        // POKE(0x6001+i,0x34);\r\n        // for(j=0;j<300;++j)\r\n        // {\r\n        // };\r\n    // }\r\n    \r\n    \r\n    // while(1){};\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c",
    "content": "\r\n/* Entry points\r\n$F3D8 - HGR2\r\n$F3E2 - HGR\r\n$F605 - XDRAW\r\n$F661 - DRAW\r\n$F6E9 - HCOLOR\r\n$F6FD - HPLOT\r\n$F721 - ROT\r\n$F727 - SCALE \r\n*/\r\n\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#include \"apple2_hgr_graphics.h\"\r\n\r\n#include <conio.h>\r\n#include <peekpoke.h>\r\n\r\n#include \"7x8_chars.h\"\r\n\r\n\r\nuint8_t _apple2_text_color;\r\n\r\n\r\nuint16_t HB1[]={\r\n0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00,\r\n0x2080, 0x2480, 0x2880, 0x2C80, 0x3080, 0x3480, 0x3880, 0x3C80,\r\n0x2100, 0x2500, 0x2900, 0x2D00, 0x3100, 0x3500, 0x3900, 0x3D00,\r\n0x2180, 0x2580, 0x2980, 0x2D80, 0x3180, 0x3580, 0x3980, 0x3D80,\r\n0x2200, 0x2600, 0x2A00, 0x2E00, 0x3200, 0x3600, 0x3A00, 0x3E00,\r\n0x2280, 0x2680, 0x2A80, 0x2E80, 0x3280, 0x3680, 0x3A80, 0x3E80,\r\n0x2300, 0x2700, 0x2B00, 0x2F00, 0x3300, 0x3700, 0x3B00, 0x3F00,\r\n0x2380, 0x2780, 0x2B80, 0x2F80, 0x3380, 0x3780, 0x3B80, 0x3F80,\r\n0x2028, 0x2428, 0x2828, 0x2C28, 0x3028, 0x3428, 0x3828, 0x3C28,\r\n0x20A8, 0x24A8, 0x28A8, 0x2CA8, 0x30A8, 0x34A8, 0x38A8, 0x3CA8,\r\n0x2128, 0x2528, 0x2928, 0x2D28, 0x3128, 0x3528, 0x3928, 0x3D28,\r\n0x21A8, 0x25A8, 0x29A8, 0x2DA8, 0x31A8, 0x35A8, 0x39A8, 0x3DA8,\r\n0x2228, 0x2628, 0x2A28, 0x2E28, 0x3228, 0x3628, 0x3A28, 0x3E28,\r\n0x22A8, 0x26A8, 0x2AA8, 0x2EA8, 0x32A8, 0x36A8, 0x3AA8, 0x3EA8,\r\n0x2328, 0x2728, 0x2B28, 0x2F28, 0x3328, 0x3728, 0x3B28, 0x3F28,\r\n0x23A8, 0x27A8, 0x2BA8, 0x2FA8, 0x33A8, 0x37A8, 0x3BA8, 0x3FA8,\r\n0x2050, 0x2450, 0x2850, 0x2C50, 0x3050, 0x3450, 0x3850, 0x3C50,\r\n0x20D0, 0x24D0, 0x28D0, 0x2CD0, 0x30D0, 0x34D0, 0x38D0, 0x3CD0,\r\n0x2150, 0x2550, 0x2950, 0x2D50, 0x3150, 0x3550, 0x3950, 0x3D50,\r\n0x21D0, 0x25D0, 0x29D0, 0x2DD0, 0x31D0, 0x35D0, 0x39D0, 0x3DD0,\r\n0x2250, 0x2650, 0x2A50, 0x2E50, 0x3250, 0x3650, 0x3A50, 0x3E50,\r\n0x22D0, 0x26D0, 0x2AD0, 0x2ED0, 0x32D0, 0x36D0, 0x3AD0, 0x3ED0,\r\n0x2350, 0x2750, 0x2B50, 0x2F50, 0x3350, 0x3750, 0x3B50, 0x3F50,\r\n0x23D0, 0x27D0, 0x2BD0, 0x2FD0, 0x33D0, 0x37D0, 0x3BD0, 0x3FD0};\r\n\r\n#define _SPACE_ {0,0,0,0,0,0,0,0}\r\n\r\nconst static uint8_t tiles[][8] =\r\n{\r\n    _SPACE_,\r\n    _TILE_DIGIT_0,\r\n    _TILE_DIGIT_1,\r\n    _TILE_DIGIT_2,\r\n    _TILE_DIGIT_3,\r\n    _TILE_DIGIT_4,\r\n    _TILE_DIGIT_5,\r\n    _TILE_DIGIT_6,\r\n    _TILE_DIGIT_7,\r\n    _TILE_DIGIT_8,\r\n    _TILE_DIGIT_9,\r\n    _TILE_0_UDG,\r\n    _TILE_1_UDG,\r\n    _TILE_2_UDG,\r\n    _TILE_3_UDG,\r\n    _TILE_4_UDG,\r\n    _TILE_5_UDG,\r\n    _TILE_6_UDG,\r\n    _TILE_A,\r\n    _TILE_B,\r\n    _TILE_C,\r\n    _TILE_D,\r\n    _TILE_E,\r\n    _TILE_F,\r\n    _TILE_G,\r\n    _TILE_H,\r\n    _TILE_I,\r\n    _TILE_J,\r\n    _TILE_K,\r\n    _TILE_L,\r\n    _TILE_M,\r\n    _TILE_N,\r\n    _TILE_O,\r\n    _TILE_P,\r\n    _TILE_Q,\r\n    _TILE_R,\r\n    _TILE_S,\r\n    _TILE_T,\r\n    _TILE_U,\r\n    _TILE_V,\r\n    _TILE_W,\r\n    _TILE_X,\r\n    _TILE_Y,\r\n    _TILE_Z,\r\n    _TILE_7_UDG, // 43\r\n    _TILE_8_UDG,\r\n    _TILE_9_UDG,\r\n    _TILE_10_UDG,\r\n    _TILE_11_UDG,\r\n    _TILE_12_UDG,\r\n    _TILE_13_UDG,\r\n    _TILE_14_UDG,\r\n    _TILE_15_UDG,\r\n    _TILE_16_UDG,\r\n    _TILE_17_UDG,\r\n    _TILE_18_UDG,\r\n    _TILE_19_UDG,\r\n    _TILE_20_UDG,\r\n    _TILE_21_UDG,\r\n    _TILE_22_UDG,\r\n    _TILE_23_UDG,\r\n    _TILE_24_UDG,\r\n    _TILE_25_UDG,\r\n    _TILE_26_UDG,\r\n    // {0x18,0x3e,0x60,0x3c,0x06,0x7c,0x18,0x00},\r\n};\r\n\r\n\r\nuint8_t hgr_enc[3*2*128] = \r\n{\r\n0,0,0,64,0,16,0,80,0,4,0,68,0,20,0,84,0,1,0,65,0,17,0,81,0,5,0,69,0,21,0,85,32,0,32,64,32,16,32,80,32,4,32,68,32,20,32,84,32,1,32,65,32,17,32,81,32,5,32,69,32,21,32,85,8,0,8,64,8,16,8,80,8,4,8,68,8,20,8,84,8,1,8,65,8,17,8,81,8,5,8,69,8,21,8,85,40,0,40,64,40,16,40,80,40,4,40,68,40,20,40,84,40,1,40,65,40,17,40,81,40,5,40,69,40,21,40,85,2,0,2,64,2,16,2,80,2,4,2,68,2,20,2,84,2,1,2,65,2,17,2,81,2,5,2,69,2,21,2,85,34,0,34,64,34,16,34,80,34,4,34,68,34,20,34,84,34,1,34,65,34,17,34,81,34,5,34,69,34,21,34,85,10,0,10,64,10,16,10,80,10,4,10,68,10,20,10,84,10,1,10,65,10,17,10,81,10,5,10,69,10,21,10,85,42,0,42,64,42,16,42,80,42,4,42,68,42,20,42,84,42,1,42,65,42,17,42,81,42,5,42,69,42,21,42,85,\r\n\r\n0,0,0,32,0,8,0,40,0,2,0,34,0,10,0,42,64,0,64,32,64,8,64,40,64,2,64,34,64,10,64,42,16,0,16,32,16,8,16,40,16,2,16,34,16,10,16,42,80,0,80,32,80,8,80,40,80,2,80,34,80,10,80,42,4,0,4,32,4,8,4,40,4,2,4,34,4,10,4,42,68,0,68,32,68,8,68,40,68,2,68,34,68,10,68,42,20,0,20,32,20,8,20,40,20,2,20,34,20,10,20,42,84,0,84,32,84,8,84,40,84,2,84,34,84,10,84,42,1,0,1,32,1,8,1,40,1,2,1,34,1,10,1,42,65,0,65,32,65,8,65,40,65,2,65,34,65,10,65,42,17,0,17,32,17,8,17,40,17,2,17,34,17,10,17,42,81,0,81,32,81,8,81,40,81,2,81,34,81,10,81,42,5,0,5,32,5,8,5,40,5,2,5,34,5,10,5,42,69,0,69,32,69,8,69,40,69,2,69,34,69,10,69,42,21,0,21,32,21,8,21,40,21,2,21,34,21,10,21,42,85,0,85,32,85,8,85,40,85,2,85,34,85,10,85,42,\r\n\r\n0,0,0,96,0,24,0,120,0,6,0,102,0,30,0,126,64,1,64,97,64,25,64,121,64,7,64,103,64,31,64,127,48,0,48,96,48,24,48,120,48,6,48,102,48,30,48,126,112,1,112,97,112,25,112,121,112,7,112,103,112,31,112,127,12,0,12,96,12,24,12,120,12,6,12,102,12,30,12,126,76,1,76,97,76,25,76,121,76,7,76,103,76,31,76,127,60,0,60,96,60,24,60,120,60,6,60,102,60,30,60,126,124,1,124,97,124,25,124,121,124,7,124,103,124,31,124,127,3,0,3,96,3,24,3,120,3,6,3,102,3,30,3,126,67,1,67,97,67,25,67,121,67,7,67,103,67,31,67,127,51,0,51,96,51,24,51,120,51,6,51,102,51,30,51,126,115,1,115,97,115,25,115,121,115,7,115,103,115,31,115,127,15,0,15,96,15,24,15,120,15,6,15,102,15,30,15,126,79,1,79,97,79,25,79,121,79,7,79,103,79,31,79,127,63,0,63,96,63,24,63,120,63,6,63,102,63,30,63,126,127,1,127,97,127,25,127,121,127,7,127,103,127,31,127,127,\r\n};\r\n\r\n// uint8_t mock_tile[8] = { 12,18,12,51,45,12,18,51 };\r\n\r\nvoid hgr_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\r\n{\r\n    uint8_t k;\r\n    \r\n    uint8_t extra_color = color>3;\r\n    \r\n    uint8_t d_x = 2*x; \r\n    uint16_t o_y = 8*y;\r\n    uint16_t cc; \r\n    uint16_t index;\r\n    \r\n    color = color-4*extra_color;\r\n    cc = ((uint16_t)color)<<8;\r\n    \r\n    extra_color<<=7;\r\n    \r\n    for(k=0;k<8;++k)\r\n    {\r\n        index = (uint16_t) (tiles[tile][k])*2u+cc;\r\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n        POKE(HB1[o_y+k]+d_x,(hgr_enc[index]^0x7F)|extra_color);\r\n        POKE(HB1[o_y+k]+d_x+1,(hgr_enc[index+1]^0x7F)|extra_color);\r\n        #else\r\n        POKE(HB1[o_y+k]+d_x,hgr_enc[index]|extra_color);\r\n        POKE(HB1[o_y+k]+d_x+1,hgr_enc[index+1]|extra_color);\r\n        #endif\r\n    }\r\n}\r\n\r\nvoid hgr_delete(uint8_t x, uint8_t y)\r\n{\r\n    uint8_t k;\r\n    uint8_t d_x = 2*x; \r\n    uint16_t o_y = 8*y;\r\n    \r\n    for(k=0;k<8;++k)\r\n    {\r\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n        POKE(HB1[o_y+k]+d_x,0x7F);\r\n        POKE(HB1[o_y+k]+d_x+1,0x7F);\r\n        #else\r\n        POKE(HB1[o_y+k]+d_x,0);\r\n        POKE(HB1[o_y+k]+d_x+1,0);   \r\n        #endif\r\n    }\r\n}\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // HIGH RES ON\r\n    POKE(0xC057,0);\r\n\r\n    // HGR PAGE 2\r\n    // POKE(0xC055,0);\r\n\r\n    // HGR PAGE 1\r\n    POKE(0xC054,0);\r\n \r\n    // TEXT OFF\r\n    POKE(0xC050,0);\r\n    \r\n    // MIXED OFF\r\n    POKE(0xC052,0);\r\n    \r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/apple2/hgr.s",
    "content": ".segment \"HGR\"\r\n\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/apple2enh/apple2enh_80col_init_graphics.c",
    "content": "#include <apple2enh.h>\n#include <display_macros.h>\n\n#include \"cross_lib.h\"\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\t#if defined(__APPLE2ENH__) && defined(APPLE2ENH_80COL_VIDEO_MODE)\n\t\tvideomode(80);\n\t#endif\n    \n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atari/atari_mode1_redefined_chars_init_graphics.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include <conio.h>\n#include <peekpoke.h>\n#include <atari.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"display_macros.h\"\n\n#include \"graphics_settings.h\"\n\n#include \"8x8_chars.h\"\n\n#define GRAPHICS_MODE_1 (1+16)\n\n#include \"udg_map.h\"\t\n\n#if !defined(_XL_NO_UDG)\nvoid set_udg(void)\n{\n\tuint8_t *_CHBAS = (uint8_t *) 0x2F4;\n\textern char _FONT_START__[];\n\n\tmemcpy(_FONT_START__, (void *)0xE000, 512);\n\t\n\t/* modify your font at _FONT_START__, etc, then set the new font: */\n\tREDEFINE_AT(_FONT_START__);\n\t\n\t*_CHBAS = ((int)_FONT_START__ >> 8);  /* enable the new font */\n}\n#endif\n\nuint16_t BASE_ADDR;\n\n#if defined(__ANTIC_MODE6_GRAPHICS)\nuint8_t _atari_text_color;\n#endif\n\n// ; Hue values\n\n// HUE_GREY        = 0\n// HUE_GOLD        = 1\n// HUE_GOLDORANGE  = 2\n// HUE_REDORANGE   = 3\n// HUE_ORANGE      = 4\n// HUE_MAGENTA     = 5\n// HUE_PURPLE      = 6\n// HUE_BLUE        = 7\n// HUE_BLUE2       = 8\n// HUE_CYAN        = 9\n// HUE_BLUEGREEN   = 10\n// HUE_BLUEGREEN2  = 11\n// HUE_GREEN       = 12\n// HUE_YELLOWGREEN = 13\n// HUE_YELLOW      = 14\n// HUE_YELLOWRED   = 15\n\n// ; Color defines, similar to c64 colors (untested)\n\n// GTIA_COLOR_BLACK      = (HUE_GREY << 4)\n// GTIA_COLOR_WHITE      = (HUE_GREY << 4 | 7 << 1)\n// GTIA_COLOR_RED        = (HUE_REDORANGE << 4 | 1 << 1)\n// GTIA_COLOR_CYAN       = (HUE_CYAN << 4 | 3 << 1)\n// GTIA_COLOR_VIOLET     = (HUE_PURPLE << 4 | 4 << 1)\n// GTIA_COLOR_GREEN      = (HUE_GREEN << 4 | 2 << 1)\n// GTIA_COLOR_BLUE       = (HUE_BLUE << 4 | 2 << 1)\n// GTIA_COLOR_YELLOW     = (HUE_YELLOW << 4 | 7 << 1)\n// GTIA_COLOR_ORANGE     = (HUE_ORANGE << 4 | 5 << 1)\n// GTIA_COLOR_BROWN      = (HUE_YELLOW << 4 | 2 << 1)\n// GTIA_COLOR_LIGHTRED   = (HUE_REDORANGE << 4 | 6 << 1)\n// GTIA_COLOR_GRAY1      = (HUE_GREY << 4 | 2 << 1)\n// GTIA_COLOR_GRAY2      = (HUE_GREY << 4 | 3 << 1)\n// GTIA_COLOR_LIGHTGREEN = (HUE_GREEN << 4 | 6 << 1)\n// GTIA_COLOR_LIGHTBLUE  = (HUE_BLUE << 4 | 6 << 1)\n// GTIA_COLOR_GRAY3      = (HUE_GREY << 4 | 5 << 1)\n    \n// #define SETCOLOR_LOW(reg, val) *((unsigned char *)12 + (reg)) = (val)\n\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n    #define _ATARI_BACKGROUND_COLOR GTIA_COLOR_WHITE\n    #define _ATARI_EXTRA_COLOR GTIA_COLOR_BLACK\n#else\n    #define _ATARI_BACKGROUND_COLOR GTIA_COLOR_BLACK\n    #define _ATARI_EXTRA_COLOR GTIA_COLOR_WHITE\n#endif\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\t// Mode 12 with no last monochromatic lines (12+16)\n\t_graphics(GRAPHICS_MODE_1);\n    \n    #if defined(__USE_CYAN_YELLOW)\n        _setcolor_low(0,_gtia_mkcolor(HUE_REDORANGE,2));\n        _setcolor_low(1,_ATARI_EXTRA_COLOR);\n        _setcolor_low(2,GTIA_COLOR_CYAN);\n        _setcolor_low(3,GTIA_COLOR_YELLOW);\n        _setcolor_low(4, _ATARI_BACKGROUND_COLOR);\n    #elif defined(__USE_GREEN_YELLOW)\n        _setcolor_low(0,_gtia_mkcolor(HUE_REDORANGE,2));\n        _setcolor_low(1,_ATARI_EXTRA_COLOR);\n        _setcolor_low(2,GTIA_COLOR_YELLOW);\n        _setcolor_low(3,_gtia_mkcolor(HUE_GREEN  ,4));\n        _setcolor_low(4, _ATARI_BACKGROUND_COLOR);\n    #else\n        _setcolor_low(0,_gtia_mkcolor(HUE_REDORANGE,2));\n        _setcolor_low(1,_ATARI_EXTRA_COLOR);\n        _setcolor_low(2,GTIA_COLOR_CYAN);\n        _setcolor_low(3,_gtia_mkcolor(HUE_GREEN  ,4));\n        _setcolor_low(4, _ATARI_BACKGROUND_COLOR);\n    #endif\n\n\t#if !defined(_XL_NO_UDG)\n\tset_udg();\n\t#endif\n    \n    BASE_ADDR = BASE_ADDR_VALUE;\n\n    _setScreenColors();\n}\n\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atari/disable_setcursor.s",
    "content": ";\n; Christian Groessler, November-2002\n;\n; cursor handling, internal function\n\n        .include \"atari.inc\"\n        .import cursor,_mul40\n        .export setcursor\n\n.proc   setcursor\n\n        ldy     #0\n        ;lda     OLDCHR\n        ;sta     (OLDADR),y\n\n        lda     ROWCRS\n        jsr     _mul40\n        clc\n        adc     SAVMSC          ; add start of screen memory\n        sta     OLDADR\n        txa\n        adc     SAVMSC+1\n        sta     OLDADR+1\n        lda     COLCRS\n        adc     OLDADR\n        sta     OLDADR\n        bcc     nc\n        inc     OLDADR+1\nnc:     lda     (OLDADR),y\n        sta     OLDCHR\n\n        ldx     cursor          ; current cursor setting as requested by the user\n        beq     off\n        ldx     #0\n        beq     cont\n\noff:    inx\ncont:   stx     CRSINH          ; update system variable\n\n        beq     turnon\n        ;and     #$7f            ; clear high bit / inverse flag\nfinish: sta     (OLDADR),y      ; update on-screen display\n        rts\n\nturnon: ;ora     #$80            ; set high bit / inverse flag\n        jmp     finish\n\n.endproc\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atari5200/atari5200_init_graphics.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include <conio.h>\n#include <peekpoke.h>\n#include <atari5200.h>\n\n#include \"display_macros.h\"\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"setcolor.h\"\n\n#include \"graphics_settings.h\"\n\n#include \"8x8_chars.h\"\n\n#include \"udg_map.h\"\t\n\n\nvoid set_udg(void)\n{\n\textern char _FONT_START__[];\n\t\n\tuint8_t *CHBASE = (uint8_t *)0xD409;\n\n\tmemcpy(_FONT_START__, (void *)0xF800, 512);\n\t\n\tREDEFINE_AT(_FONT_START__);\n\t\n\t*CHBASE = ((int)_FONT_START__ >> 8);\n}\n\n#define SETCOLOR_LOW(reg, val) *((unsigned char *)12 + (reg)) = (val)\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\n    #if defined(__USE_CYAN_YELLOW)\n        POKE(COLOR0,_gtia_mkcolor(HUE_REDORANGE,2));\n        POKE(COLOR1,GTIA_COLOR_WHITE);\n        POKE(COLOR2,GTIA_COLOR_CYAN);\n        POKE(COLOR3,GTIA_COLOR_YELLOW);\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n            POKE(COLOR4,GTIA_COLOR_WHITE);\n        #else\n            POKE(COLOR4,GTIA_COLOR_BLACK);\n        #endif\n    #elif defined(__USE_GREEN_YELLOW)\n        POKE(COLOR0,_gtia_mkcolor(HUE_REDORANGE,2));\n        POKE(COLOR1,GTIA_COLOR_WHITE);\n        POKE(COLOR2,GTIA_COLOR_YELLOW);\n        POKE(COLOR3,_gtia_mkcolor(HUE_GREEN  ,4));\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n            POKE(COLOR4,GTIA_COLOR_WHITE);\n        #else\n            POKE(COLOR4,GTIA_COLOR_BLACK);\n        #endif\n    #else\n        POKE(COLOR0,_gtia_mkcolor(HUE_REDORANGE,2));\n        POKE(COLOR1,GTIA_COLOR_WHITE);\n        POKE(COLOR2,GTIA_COLOR_CYAN);\n        POKE(COLOR3,_gtia_mkcolor(HUE_GREEN  ,4));\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n            POKE(COLOR4,GTIA_COLOR_WHITE);\n        #else\n            POKE(COLOR4,GTIA_COLOR_BLACK);\n        #endif\n    #endif\n\n    set_udg();\n\n    _setScreenColors();\n}\n\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atari5200/setcolor.h",
    "content": "#ifndef _SET_COLOR\n#define _SET_COLOR\n\n#define TGI_COLOR_BLACK         COLOR_BLACK\n#define TGI_COLOR_WHITE         COLOR_WHITE\n#define TGI_COLOR_RED           COLOR_RED\n#define TGI_COLOR_CYAN          COLOR_CYAN\n#define TGI_COLOR_VIOLET        COLOR_VIOLET\n#define TGI_COLOR_GREEN         COLOR_GREEN\n#define TGI_COLOR_BLUE          COLOR_BLUE\n#define TGI_COLOR_YELLOW        COLOR_YELLOW\n#define TGI_COLOR_ORANGE        COLOR_ORANGE\n#define TGI_COLOR_BROWN         COLOR_BROWN\n#define TGI_COLOR_LIGHTRED      COLOR_LIGHTRED\n#define TGI_COLOR_GRAY1         COLOR_GRAY1\n#define TGI_COLOR_GRAY2         COLOR_GRAY2\n#define TGI_COLOR_LIGHTGREEN    COLOR_LIGHTGREEN\n#define TGI_COLOR_LIGHTBLUE     COLOR_LIGHTBLUE\n#define TGI_COLOR_GRAY3         COLOR_GRAY3\n\n\n#define COLOR0 0x0C\n#define COLOR1 0x0D\n#define COLOR2 0x0E\n#define COLOR3 0x0F\n#define COLOR4 0x10\t\n\n#endif"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atari7800/atari7800_init_graphics.c",
    "content": "\r\n#include <atari7800.h>\r\n// #include <conio.h>\r\n\r\n#include \"cross_lib.h\"\r\n\r\nextern char screen[];\r\n\r\n\r\n// 0x48 pink\r\n// 0x38 light red\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n\r\n    // #if defined(__USE_GREEN)\r\n    \r\n        // TODO: Implement palette switch\r\n        // MARIA.bkgrnd = 0x17;\r\n        // MARIA.p0c1 = 0x00;\r\n        // MARIA.p0c2 = 0xb2;\r\n        // MARIA.p0c3 = 0x05;\r\n        MARIA.bkgrnd = 0x00; // black\r\n        \r\n    #if defined(__USE_GREEN)\r\n        MARIA.p0c2 = 0xD4;\r\n    #else\r\n        MARIA.p0c2 = 0xAA; // darker cyan 0x98\r\n    #endif\r\n        MARIA.p0c1 = 0x33; // red\r\n\r\n        MARIA.p0c3 = 0x0F; // white\r\n    // #endif\r\n    \r\n        // MARIA.p0c1 = 0xD4; // green\r\n\r\n            // MARIA.p0c1 = 0xB4; // green\r\n\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atari7800/atari7800_init_graphics_debug.c",
    "content": "\r\n#include <atari7800.h>\r\n// #include <conio.h>\r\n\r\n#include \"cross_lib.h\"\r\n\r\nextern char screen[];\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n\tchar i;\r\n\t\r\n    \r\n    // clrscr();\r\n    // cputc('A');\r\n\tfor(i=0;i<100;++i)\r\n\t{\r\n\t\t\r\n\t\tscreen[i]=2*i;\r\n\t\t_XL_SLEEP(1);\r\n    }\r\n\r\n\twhile (1) {\r\n\t\tscreen[0] = screen[0] + 1;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atari_lynx/atari_lynx_gfx_init_graphics.c",
    "content": "// Alex Thissen has helped a lot to fix a bug\n\n#include \"display_macros.h\"\n#include \"graphics_settings.h\"\n#include \"input_macros.h\"\n\n#include <tgi.h>\n#include <6502.h>\n#include <lynx.h>\n#include <time.h>\n\n// Default to black\nuint8_t _atari_lynx_background_color = TGI_COLOR_BLACK;\nuint8_t _atari_lynx_text_color;\n\nextern uint8_t _compressed_tile_data[_XL_NUMBER_OF_TILES][6];\n\nuint8_t _compressed_font_data[FONT_SIZE][6] =\n{\n    // A\n    {60, 98, 126, 98, 98, 0},\n\n    // B\n    {124, 98, 124, 98, 124,0},\n\n    // C\n    {60, 98, 96, 98, 60, 0}, //\n\n    // D\n    {124, 98, 98, 98, 124,0},\n\n    // E\n    {126, 96, 120, 96, 126,0},\n\n    // F\n    {126, 96, 120, 96, 96, 0},\n\n    // G\n    {60, 96, 102, 98, 60, 0}, //\n\n    // H\n    {98, 98, 126, 98, 98, 0},\n\n    // I\n    {60, 24, 24, 24, 60, 0},\n\n    // J\n    {6, 6, 6, 70, 60,0},\n\n    // K\n    {100, 104, 112, 104, 100, 0}, //\n\n    // L\n    {96, 96, 96, 96, 124, 0},\n\n    // M\n    {98, 118, 106, 98, 98, 0},\n\n    // N\n    {98, 114, 106, 102, 98, 0},\n\n    // O\n    {60, 98, 98, 98, 60, 0},\n\n    // P\n    {124, 98, 124, 96, 96, 0},\n\n    // Q\n    {60, 98, 98, 106, 60, 0},\n\n    // R\n    {124, 98, 124, 104, 100, 0}, //\n\n    // S\n    {62, 96, 60, 6, 124, 0},\n\n    // T\n    {126, 24, 24, 24, 24, 0},\n\n    // U\n    {98, 98, 98, 98, 60, 0},\n\n    // V\n    {98, 98, 52, 52, 24, 0},\n\n    // W\n    {193, 193, 106, 106, 52, 0},\n\n    // X\n    {99, 54, 28, 54, 99, 0},\n\n    // Y\n    {98, 52, 24, 24, 24, 0},\n\n    // Z\n    {126, 6, 24, 96, 126,0},\n\n    // DIGITS\n\n    // 0\n    // {14, 17, 17, 17, 14, 0},\n    {28, 34, 34, 34, 28, 0},\n\n    // 1\n    // {6, 10, 2, 2, 15, 0},\n    {12, 20, 4, 4, 30, 0},\n\n    // 2\n    // {30, 1, 14, 16, 31, 0},\n    {60, 2, 28, 32, 62, 0},\n\n    // 3\n    // {30, 1, 6, 1, 30, 0},\n    {60, 2, 12, 2, 60, 0},\n\n    // 4\n    // {6, 10, 18, 31, 2, 0},\n    {12, 20, 36, 62, 4, 0},\n\n    // 5\n    // {31, 16, 14, 1, 30, 0},\n    {62, 32, 28, 2, 60, 0},\n\n\n    // 6\n    // {15, 16, 30, 17, 14, 0},\n    {30, 32, 60, 34, 28, 0},\n\n    // 7\n    // {31, 1, 2, 4, 8, 0},\n    {62, 2, 4, 8, 16, 0},\n\n    // 8\n    // {14, 17, 14, 17, 14, 0},\n    {28, 34, 28, 34, 28, 0},\n\n    // 9\n    // {14, 17, 15, 1, 30, 0},\n    {28, 34, 30, 2, 60, 0},\n\n    // SPACE CHARACTER\n    {0, 0, 0, 0, 0, 0}\n\n};\n\n#define BYTES_PER_LINE 4\n\nuint8_t _tile_data[_XL_NUMBER_OF_TILES+FONT_SIZE][BYTES_PER_LINE*6+1];\n\n// Alex Thissen has helped a lot to fix a bug in this code\nvoid init_tile_data(void)\n{\n    uint8_t i;\n    uint8_t j;\n    uint8_t data, bit, byte1, byte2;\n\n    for(i = 0; i < FONT_SIZE+_XL_NUMBER_OF_TILES; ++i)\n    {\n\t\tuint8_t line; // for line\n\n\t\tfor(line = 0; line < 6; line++)\n\t\t{\n\t\t  j = line*BYTES_PER_LINE;\n\n          // Indicate literal sprite data of 3 bytes (plus 1)\n\t\t  _tile_data[i][j] = BYTES_PER_LINE;\n\n          byte1 = 0;\n          byte2 = 0;\n\n          for (bit = 0; bit < 8; bit++)\n          {\n              data = i < _XL_NUMBER_OF_TILES ?\n                _compressed_tile_data[i][line] :\n                _compressed_font_data[i-_XL_NUMBER_OF_TILES][line];\n\n              if (data & (1 << bit)) {\n                  if (bit * 2 < 8) {\n                      byte2 |= 1 << (bit * 2);\n                  } else {\n                      byte1 |= 1 << ((bit * 2) - 8);\n                  }\n              }\n          }\n\t\t  _tile_data[i][j+1] = byte1;\n          _tile_data[i][j+2] = byte2;\n\n          _tile_data[i][j+3] = 0xAA;\n\n\t\t}\n\t\t_tile_data[i][6*BYTES_PER_LINE] = 0x00;\n    }\n}\n\nscb_hv_pal2 _tgi_tile[_XL_NUMBER_OF_TILES+FONT_SIZE];\n\nvoid init_tgi_tile(void)\n{\n    uint8_t i;\n    scb_hv_pal2 *tile;\n\n    for(i = 0; i < _XL_NUMBER_OF_TILES+FONT_SIZE; ++i)\n    {\n        tile = &_tgi_tile[i];\n\t\ttile->sprctl0 = BPP_2 | TYPE_NORMAL;\n\t\ttile->sprctl1 = LITERAL | REHV;\n        tile->sprcoll = NO_COLLIDE;\n        tile->next = (char *)NULL;\n        tile->data = _tile_data[i];\n        tile->hpos = 0;\n        tile->vpos = 0;\n        tile->hsize = 0x100;\n        tile->vsize = 0x100;\n\n        // Palette will use 4 pens for background and color and transparent (for hardware bug)\n        tile->penpal[0] = (_atari_lynx_background_color << 4); // Dynamically changed during draw\n        tile->penpal[1] = 0x00; // Two (same) transparent pens\n    }\n}\n\n// No significant bit at end, so no extra byte is needed\nconst unsigned char empty[] = {\n    4, 0, 0, 0x55,\n    4, 0, 0, 0x55,\n    4, 0, 0, 0x55,\n    4, 0, 0, 0x55,\n    4, 0, 0, 0x55,\n    4, 0, 0, 0x55,\n    0x00,\n};\n\nscb_hv_pal2 Sempty= {\n        BPP_2 | TYPE_NORMAL,\n        LITERAL | REHV,\n        NO_COLLIDE,\n        0, // next\n        (unsigned char *)empty, // data\n        0, 0,\n        0x100, 0x100, // hsize/vsize\n        {0x00, 0xef}  // Pen palette 0 will be set in _XL_INIT_GRAPHICS  \n};\n\nscb_hv_pal2 *empty_spr;\n\nvoid _tgi_gfx_delete(uint8_t x, uint8_t y)\n{\n    // Use 8x6 pixel empty sprite to erase tile\n    empty_spr->hpos = (x)*8;\n    empty_spr->vpos = (y)*6;\n    tgi_sprite(empty_spr);\n}\n\nvoid _tgi_gfx_draw(uint8_t x, uint8_t y, uint8_t tile, uint8_t color)\n{\n    // Reposition sprite\n    _tgi_tile[tile].hpos = (x)*8;\n    _tgi_tile[tile].vpos = (y)*6;\n\n    // Solid black for first pen 0 and selected color for pen 1\n    _tgi_tile[tile].penpal[0] = (_atari_lynx_background_color << 4) + color;\n    tgi_sprite(&(_tgi_tile[tile]));\n}\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n   #if defined(_XL_BACKGROUND_COLOR)\n    _atari_lynx_background_color = _XL_BACKGROUND_COLOR;\n    #endif\n\n  Sempty.penpal[0] = _atari_lynx_background_color << 4;\n  empty_spr = &Sempty;\n\n  tgi_install(tgi_static_stddrv);\n\n\ttgi_init();\n\tCLI();\n\n  init_tile_data();\n  init_tgi_tile();\n\n  tgi_setcolor(_atari_lynx_background_color);\n  tgi_bar(0,0,159,101);\n  \n  while (tgi_busy())  {  };\n}\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/atmos/atmos_redefined_characters_init_graphics.c",
    "content": "#include <peekpoke.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"graphics_settings.h\"\n#include \"display_macros.h\"\n\n#include \"6x8_chars.h\"\n\n#define UDG_BASE_ADDR 0xb400\n\n#include \"udg_map.h\"\n\n\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n    #define ORIC_BACKGROUND_COLOR 23\n    #define ORIC_INK_COLOR 0\n#else\n    #define ORIC_BACKGROUND_COLOR 16\n    #define ORIC_INK_COLOR 3\n#endif\n\nvoid init_colors(void)\n{\n\tuint8_t i;\n\t\n\t// Initialize colors \t\n\tfor(i=0;i<28;++i)\n\t{\n\t\t// yellow on black (inverted: blue on white)\n\t\tPOKE(0xBB80+i*40,ORIC_BACKGROUND_COLOR);\n\t\tPOKE(0xBB81+i*40,ORIC_INK_COLOR); \n\t}\n}\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n    REDEFINE_AT(((uint8_t *)UDG_BASE_ADDR));\n\n    init_colors();\n    \n    _setScreenColors();\n}\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/c128/c128_80col_init_graphics.c",
    "content": "#include <c128.h>\n#include \"display_macros.h\"\n#include <peekpoke.h>\n\n#include \"8x8_chars.h\"\n\n#include \"udg_map.h\"\n\n#define ADDRESS_PORT 0xD600\n#define DATA_PORT    0xD601\n\n#define HIGH_ADDRESS_REGISTER 0x12\n#define LOW_ADDRESS_REGISTER  0x13\n#define VDC_DATA_REGISTER     0x1F\n\n#define CHAR_BASE    0x3000\n\nvoid vdc_write(uint8_t vdc_register, uint8_t value)\n{\n    POKE(ADDRESS_PORT,vdc_register);\n    while(!(PEEK(ADDRESS_PORT)&(0x80))){};\n    POKE(DATA_PORT,value);\n}\n\nvoid redefine(uint8_t tile, const uint8_t definition[])\n{\n    uint8_t i;\n    uint16_t address = CHAR_BASE + (((uint16_t)tile)<<4U);\n    vdc_write(HIGH_ADDRESS_REGISTER,(uint8_t)(address>>8));\n    vdc_write(LOW_ADDRESS_REGISTER,(uint8_t)(address&0x00FF));\n    for(i=0;i<8;++i)\n    {\n        vdc_write(VDC_DATA_REGISTER,definition[i]);\n    }\n}\n\nvoid set_udg(void)\n{\n    uint8_t i;\n    \n    for (i = 0; i < (sizeof(redefine_map)/sizeof(*redefine_map)); ++i)\n    {\n        redefine(redefine_map[i].ascii,redefine_map[i].bitmap);\n    }\n}\n\n\n// #define DEBUG\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n    fast();\n    videomode(80);\n    \n    #if !defined(DEBUG)\n\n    set_udg();\n\n    _setScreenColors();\n\n    #else\n    \n    vdc_write(HIGH_ADDRESS_REGISTER,0x00);\n    vdc_write(LOW_ADDRESS_REGISTER,0x00);\n    {\n        uint8_t i;\n\n        for(i=0;i<255;++i)\n        {\n            vdc_write(VDC_DATA_REGISTER,i);\n        };\n    }\n    // sleep(2);\n    set_udg();\n    // sleep(2);\n    while(1){};\n\n    _setScreenColors();\n    #endif\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c",
    "content": "\n#if !defined(PEEK)\n    #include <peekpoke.h>\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"graphics_settings.h\"\n#include \"display_macros.h\"\n\n#if !defined(__UDG_BASE_FACTOR)\n    #define __UDG_BASE_FACTOR 15\n#endif\n\n// #define DEBUG\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\n    // __asm__ (\"STA $FF3F\");\n    // __asm__ (\"SEI\");\n\n\tPOKE(65299ul,(PEEK(65299ul)&3)|((__UDG_BASE_FACTOR)*4)); // change character base address to 28th Kbyte\n\tPOKE(65298ul,PEEK(65298ul)&251); // make graphics chip get characters from RAM\n\t\n\t#if defined(DEBUG)\n\t{\n\t\tuint8_t i;\n\t\tfor(i=0;i<255;++i)\n\t\t{\n\t\t\tPOKE((3072+i),i+0x40);\n\t\t}\n\t\t\n\t\twhile(1){};\n\t}\n\t#endif\n\t\n    POKE(65301u,0);\n    POKE(65305u,0);\n\n    // clear screen and color ram\n    __asm__(\"jsr $D88B\");\n    \n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/c264/c16_redefined_chars_init_graphics.c",
    "content": "\n#if !defined(PEEK)\n    #include <peekpoke.h>\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"graphics_settings.h\"\n#include \"display_macros.h\"\n\n#include \"8x8_chars.h\"\n\n#include \"udg_map.h\"\n\n#include <stdint.h>\n\n#if !defined(__UDG_BASE_FACTOR)\n\t#define __UDG_BASE_FACTOR 29\n#else\n\t#define __UDG_BASE_FACTOR 15\n#endif\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tuint16_t i;\n\t\n\t#if defined(__INCLUDE_CONIO_H)\n\t\tPOKE(65301u,0);\n\t\tPOKE(65305u,0);\n\t#endif\n    \n\tPOKE(1177,62); // disable switch to RAM in PEEK\n\tfor(i=0;i<1023;++i)\n\t{\n\t\tPOKE(__UDG_BASE_FACTOR*1024+i,PEEK((uint16_t) (54272ul+(uint16_t) i)));\n\t}\n\tPOKE(1177,63); // re-enable switch to RAM in PEEK\n\tPOKE(65299ul,(PEEK(65299ul)&3)|((__UDG_BASE_FACTOR)*4)); // change character base address to 28th Kbyte\n\tPOKE(65298ul,PEEK(65298ul)&251); // make graphics chip get characters from RAM\n\t\t\n\tREDEFINE_AT(__UDG_BASE_FACTOR*1024);\n    \n    _setScreenColors();\n\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/c64/c64_init_graphics.c",
    "content": "\n#if !defined(PEEK)\n    #include <peekpoke.h>\n#endif\n#include \"display_macros.h\"\n\n#define _C64_FOREGROUND 53280u\n#define _C64_BORDER 53281u\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\t// Select video bank and set the character set pointer to point to $C800\n\t// where the redefined charset has been placed by the linker\n\tPOKE(56576u,0);\n\tPOKE(53272u,2);\n\tPOKE(648,192);\n\t\n\n\tPOKE(_C64_FOREGROUND,_XL_BACKGROUND_COLOR);\n\tPOKE(_C64_BORDER,_XL_BACKGROUND_COLOR);\n\n    _setScreenColors();\n}"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/c65/c65_init_graphics.c",
    "content": "\r\n#include <peekpoke.h>\r\n#include <conio.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#define CRAM2K 0xD030\r\n    // lda #%00000001  ; Enable CRAM2K\r\n    // tsb cram2k\r\n    \r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // __asm__(\"SEI\");\r\n    \r\n    // BLACK background and border\r\n    POKE(53281U,0U);\r\n    POKE(53280U,0U);\r\n    \r\n    #if defined(__CRAM2K)\r\n        POKE(CRAM2K,PEEK(CRAM2K)|(0x01));\r\n    #endif\r\n        \r\n    #if defined(__MEGA65_40COL)\r\n        // gotoxy(0,0);\r\n        // cputc(27);\r\n        // cputc('4');\r\n        \r\n// lda #27\r\n// jsr $ffd2\r\n// lda #52\r\n// jsr $ffd2\r\n        __asm__(\"lda #27\");\r\n        __asm__(\"jsr $ffd2\");\r\n        __asm__(\"lda #52\");\r\n        __asm__(\"jsr $ffd2\");\r\n\r\n        \r\n        // 40 column mode\r\n        // POKE(0xD031,PEEK(0xD031)&(0x7F));\r\n        \r\n        // CRAM2K\r\n\r\n    #endif\r\n    \r\n    // {\r\n        // uint16_t i;\r\n        \r\n        // for(i=0;i<2000;++i)\r\n        // {\r\n            // POKE(2048+i,65);\r\n        // }\r\n    // };\r\n    // while(1){};\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c",
    "content": "\r\n// https://www.msx.org/wiki/Category:VDP_Registers\r\n\r\n#include \"8x8_chars.h\"\r\n\r\n#include \"udg_map.h\"\r\n\r\n#include \"memory_mapped_graphics.h\"\r\n#include \"display_macros.h\"\r\n\r\n/*\r\n\r\n0 Transparent\r\n1 Black \r\n2 Green\r\n3 Light Green\r\n4 Dark Blue\r\n5 Light Blue\r\n6 Dark Red\r\n7 Cyan\r\n8 Red\r\n9 Bright Red\r\n10 Yellow\r\n11 Light Yellow\r\n12 Dark Green\r\n13 Magenta\r\n14 Grey\r\n15 White\r\n*/\r\n\r\n#define _CREAT_VDP_GREEN 3\r\n#define _CREAT_VDP_BLUE 5\r\n#define _CREAT_VDP_CYAN 7\r\n#define _CREAT_VDP_RED 9\r\n#define _CREAT_VDP_YELLOW 10\r\n#define _CREAT_VDP_WHITE 15\r\n#define _CREAT_VDP_BLACK 0\r\n\r\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n    #define _CREAT_BACKGROUND_COLOR _CREAT_VDP_WHITE\r\n    #define _CREAT_TEXT_COLOR _CREAT_VDP_BLACK\r\n#else\r\n    #define _CREAT_BACKGROUND_COLOR _CREAT_VDP_BLACK\r\n    #define _CREAT_TEXT_COLOR _CREAT_VDP_WHITE\r\n#endif\r\n\r\n\r\n#define set_group_colorset_group_color(group, color) \\\r\ndo \\\r\n{ \\\r\n\tDISPLAY_POKE((uint16_t) COLOR_DEF + (uint16_t) group, (((uint16_t) color)<<4)+_CREAT_BACKGROUND_COLOR); \\\r\n} while(0)\r\n\r\n\r\nvoid set_group_block_color(uint8_t group, uint8_t color)\r\n{\r\n\tuint8_t i;\r\n\tfor(i=0;i<4;++i)\r\n\t{\r\n\t\tset_group_colorset_group_color(group+i,color);\r\n\t}\r\n}\r\n\r\nvoid set_udg_colors(void)\r\n{\r\n\r\n// 0\r\n\t// set_group_color(0,_CREAT_VDP_BLUE);\r\n\t// set_group_color(1,_CREAT_VDP_BLUE);\r\n\t// set_group_color(2,_CREAT_VDP_BLUE);\r\n\t// set_group_color(3,_CREAT_VDP_BLUE);\r\n\tset_group_block_color(0,_CREAT_VDP_BLUE);\r\n\r\n// 32\r\n\t// set_group_color(4,_CREAT_VDP_GREEN);\r\n\t// set_group_color(5,_CREAT_VDP_GREEN);\r\n\t// set_group_color(6,_CREAT_VDP_GREEN);\r\n\t// set_group_color(7,_CREAT_VDP_GREEN);\r\n\tset_group_block_color(4,_CREAT_VDP_GREEN);\r\n\r\n// 64\r\n\t// set_group_color(8,_CREAT_VDP_YELLOW);\r\n\t// set_group_color(9,_CREAT_VDP_YELLOW);\r\n\t// set_group_color(10,_CREAT_VDP_YELLOW);\r\n\t// set_group_color(11,_CREAT_VDP_YELLOW);\r\n\tset_group_block_color(8,_CREAT_VDP_YELLOW);\r\n\r\n// 96\r\n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n\t// set_group_color(12,_CREAT_VDP_BLACK);\r\n\t// set_group_color(13,_CREAT_VDP_BLACK);\r\n\t// set_group_color(14,_CREAT_VDP_BLACK);\r\n\t// set_group_color(15,_CREAT_VDP_BLACK);\r\n\tset_group_block_color(12,_CREAT_VDP_BLACK);\r\n    #else\r\n\t// set_group_color(12,_CREAT_VDP_WHITE);\r\n\t// set_group_color(13,_CREAT_VDP_WHITE);\r\n\t// set_group_color(14,_CREAT_VDP_WHITE);\r\n\t// set_group_color(15,_CREAT_VDP_WHITE);\r\n\tset_group_block_color(12,_CREAT_VDP_WHITE);\r\n    #endif\r\n\r\n// 128\r\n\t// set_group_color(16,_CREAT_VDP_CYAN);\r\n\t// set_group_color(17,_CREAT_VDP_CYAN);\r\n\t// set_group_color(18,_CREAT_VDP_CYAN);\r\n\t// set_group_color(19,_CREAT_VDP_CYAN);\r\n\tset_group_block_color(16,_CREAT_VDP_CYAN);\r\n\r\n\r\n// 160\r\n\t// set_group_color(20,_CREAT_VDP_RED);\r\n\t// set_group_color(21,_CREAT_VDP_RED);\r\n\t// set_group_color(22,_CREAT_VDP_RED);\r\n\t// set_group_color(23,_CREAT_VDP_RED);\r\n\tset_group_block_color(20,_CREAT_VDP_RED);\r\n\r\n\r\n// 192\r\n\t// set_group_color(24,_CREAT_TEXT_COLOR);\r\n\t// set_group_color(25,_CREAT_TEXT_COLOR);\r\n\t// set_group_color(26,_CREAT_TEXT_COLOR);\r\n\t// set_group_color(27,_CREAT_TEXT_COLOR);\r\n\t// set_group_block_color(16,_CREAT_VDP_CYAN);\r\n\r\n\r\n// 224\r\n\t// set_group_color(28,_CREAT_TEXT_COLOR);\r\n\t// set_group_color(29,_CREAT_TEXT_COLOR);\r\n\t// set_group_color(30,_CREAT_TEXT_COLOR);\r\n\t// set_group_color(31,_CREAT_TEXT_COLOR);\r\n\tset_group_block_color(28,_CREAT_TEXT_COLOR);\r\n\r\n}\r\n\r\nvoid redefine(const uint8_t ch, const uint8_t* image) \r\n{ \r\n    uint8_t i; \r\n    \r\n    for(i=0;i<8;++i) \r\n    { \r\n        DISPLAY_POKE(CHAR_BASE +(uint16_t)(ch<<3)+i,image[i]); \r\n    } \r\n} \r\n\r\n\r\nvoid SET_UDG_IMAGES(void) \r\n{ \r\n    uint8_t i;\r\n    uint8_t j;\r\n\r\n    for (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \r\n    {\r\n        for(j=0;j<5;++j)\r\n        {\r\n            redefine(redefine_map[i].ascii+32*j, redefine_map[i].bitmap);\r\n        }\r\n    } \r\n}\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    SET_UDG_IMAGES();\r\n    \r\n    set_udg_colors();\r\n\r\n    _setScreenColors();\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/creativision/creativision_init_graphics.c",
    "content": "\r\n#include \"8x8_chars.h\"\r\n\r\n#include \"udg_map.h\"\r\n\r\n#include \"memory_mapped_graphics.h\"\r\n#include \"display_macros.h\"\r\n\r\n\r\nvoid set_group_color(uint8_t group, uint8_t color)\r\n{\r\n\tDISPLAY_POKE((uint16_t) COLOR_DEF + (uint16_t) group, ((uint16_t) color)<<4);\r\n}\r\n\r\nvoid set_udg_colors(void)\r\n{\r\n\tuint8_t i;\r\n\t\r\n\tset_group_color(0,9);\r\n\tset_group_color(1,7);\r\n\tset_group_color(2,9);\r\n\tset_group_color(3,11);\r\n\tset_group_color(4,10);\r\n\tset_group_color(5,2);\r\n\tset_group_color(6,4);\r\n\tset_group_color(7,4);\r\n\t\r\n\tfor(i=8;i<=11;++i)\r\n\t{\r\n\t\tset_group_color(i,8);\r\n\t}\r\n}\r\n\r\nvoid redefine(const uint8_t ch, const uint8_t* image) \r\n{ \r\n    uint8_t i; \r\n    \r\n    for(i=0;i<8;++i) \r\n    { \r\n        DISPLAY_POKE(CHAR_BASE +(uint16_t)(ch<<3)+i,image[i]); \r\n    } \r\n} \r\n\r\n\r\nvoid SET_UDG_IMAGES(void) \r\n{ \r\n\tuint8_t i;\r\n    \r\n\tfor (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \r\n\t{ \r\n\t   redefine(redefine_map[i].ascii, redefine_map[i].bitmap); \r\n\t} \r\n}\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    \r\n    SET_UDG_IMAGES();\r\n    \r\n    set_udg_colors();\r\n    \r\n    _setScreenColors();\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/cx16/cx16_init_graphics.c",
    "content": "#include <cx16.h>\r\n#include \"standard_libs.h\"\r\n\r\n#include \"8x8_chars.h\"\r\n\r\n#include \"udg_map.h\"\r\n\r\n\r\n#define CHAR_BASE ((long) 0x01F000)\r\n\r\n\r\nvoid redefine(const uint8_t ch, const uint8_t* image) \r\n{ \r\n    uint8_t i;\r\n    \r\n    for(i=0;i<8;++i) \r\n    {\r\n        if(ch>63)\r\n        {\r\n            vpoke(image[i], CHAR_BASE +(unsigned long)((((unsigned long) ch-64U)<<3)+i)); \r\n        }\r\n        else\r\n        {\r\n            vpoke(image[i], CHAR_BASE +(unsigned long)((((unsigned long) ch)<<3)+i)); \r\n        }\r\n    } \r\n} \r\n\r\n\r\nvoid SET_UDG_IMAGES(void) \r\n{ \r\n\tuint8_t i;\r\n    \r\n\tfor (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \r\n\t{ \r\n\t   redefine(redefine_map[i].ascii, redefine_map[i].bitmap); \r\n\t} \r\n}\r\n\r\n// ; #define VIDEOMODE_80x60         0x00\r\n// ; #define VIDEOMODE_80x30         0x01\r\n// ; #define VIDEOMODE_40x60         0x02\r\n// ; #define VIDEOMODE_40x30         0x03\r\n// ; #define VIDEOMODE_40x15         0x04\r\n// ; #define VIDEOMODE_20x30         0x05\r\n// ; #define VIDEOMODE_20x15         0x06\r\n// ; #define VIDEOMODE_22x23         0x07\r\n// ; #define VIDEOMODE_64x50         0x08\r\n// ; #define VIDEOMODE_64x25         0x09\r\n// ; #define VIDEOMODE_32x50         0x0A\r\n// ; #define VIDEOMODE_32x25         0x0B\r\n// ; #define VIDEOMODE_80COL         VIDEOMODE_80x60\r\n// ; #define VIDEOMODE_40COL         VIDEOMODE_40x30\r\n// ; #define VIDEOMODE_320x240       0x80\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    videomode(VIDEOMODE_20x30);\r\n    printf(\"%c%c%c%c\",0x90,0x01,0x05,147);\r\n    // printf(\"%c\",0x09);\r\n    // printf(\"%c\",0x01);\r\n    // printf(\"%c\",0x01);\r\n\r\n    // printf(\"%c\",0x10);\r\n    // printf(\"%c\",0x01);\r\n    cputc(0x10);\r\n    cputc(0x01);\r\n\tSET_UDG_IMAGES();\r\n}"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/mega65/mega65_init_graphics.c",
    "content": "\r\n#include <peekpoke.h>\r\n#include <conio.h>\r\n\r\n#define CRAM2K 0xD030\r\n    // lda #%00000001  ; Enable CRAM2K\r\n    // tsb cram2k\r\n    \r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // __asm__(\"SEI\");\r\n    \r\n    // BLACK background and border\r\n    POKE(53281U,0U);\r\n    POKE(53280U,0U);\r\n    \r\n    #if defined(__CRAM2K)\r\n        POKE(CRAM2K,PEEK(CRAM2K)|(0x01));\r\n    #endif\r\n        \r\n    #if defined(__MEGA65_40COL)\r\n        // gotoxy(0,0);\r\n        // cputc(27);\r\n        // cputc('4');\r\n        \r\n// lda #27\r\n// jsr $ffd2\r\n// lda #52\r\n// jsr $ffd2\r\n        __asm__(\"lda #27\");\r\n        __asm__(\"jsr $ffd2\");\r\n        __asm__(\"lda #52\");\r\n        __asm__(\"jsr $ffd2\");\r\n\r\n        \r\n        // 40 column mode\r\n        // POKE(0xD031,PEEK(0xD031)&(0x7F));\r\n        \r\n        // CRAM2K\r\n\r\n    #endif\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/nes/nes_init_graphics.c",
    "content": "#include <peekpoke.h>\n#include \"display_macros.h\"\n\n#include <stdint.h>\n\n#include <nes.h>\n\n#define _RED 6\n#define _BROWN 24\n#define _WHITE 32\n#define _ORANGE 23\n#define _GREEN_BROWN 25\n#define _CYAN 33\n#define _DARK_YELLOW 40\n#define _LIGHT_YELLOW 56\n\n\nvoid set_color(uint8_t palette_group, uint8_t color_index, uint8_t color)\n{\n    PPU.vram.address = 0x3f;\n    PPU.vram.address = palette_group * 4 + color_index;   \n    PPU.vram.data = color;   \n}\n\n#define CTRL 0x2000\n#define MASK 0x2001\n#define SCROLL 0x2005\n\n\nvoid All_Off(void) {\n\tPPU.control = 0;\n\tPPU.mask = 0;\n}\n\t\nvoid All_On(void) {\n\tPPU.control = 0x80;\n\tPPU.mask = 0x1e;\n}\n\nvoid Reset_Scroll(void)\n{\n\tPPU.vram.address = 0;\n\tPPU.vram.address = 0;\n\t\n\tPPU.scroll = 0;\n\tPPU.scroll = 0;\n}\n\n\n//\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n    #define NES_BACKGROUND_COLOR COLOR_WHITE\n#else\n    #define NES_BACKGROUND_COLOR COLOR_BLACK\n#endif\n\n#if defined(__USE_GREEN)\n    #define _CYAN_GREEN _GREEN_BROWN\n#else\n    #define _CYAN_GREEN _CYAN\n\n#endif\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tAll_Off();\n\n\tset_color(0,2,_CYAN_GREEN);\n\tset_color(0,1,_RED);\n\tset_color(0,3,_WHITE);\n\n\tset_color(1,2,_CYAN_GREEN);\n\tset_color(1,1,_RED);\n\tset_color(1,3,_WHITE);\n\n\tset_color(3,2,_CYAN_GREEN);\n\tset_color(3,1,_RED);\n\tset_color(3,3,_WHITE);\n\n\t// set_color(1,2,_DARK_YELLOW);\n\t// set_color(1,1,_GREEN_BROWN);\n\t// set_color(1,3,_RED);\n\n\n\t// set_color(3,2,_DARK_YELLOW);\n\t// set_color(3,1,_BROWN);\n\t// set_color(3,3,_CYAN);\n\t\n\t{\n\t\tuint8_t j;\n\t\n\t\tfor(j=0;j<4;++j)\n\t\t{\t\n\t\t\tPPU.vram.address = 0x23;\n\t\t\tPPU.vram.address = (0xC0+j);\t\t\t\t\n\t\t\tPPU.vram.data = 0xFF;//0b00001111;\t\n\t\t}\n\t\t\n\t\tfor(j=4;j<8;++j)\n\t\t{\t\n\t\t\tPPU.vram.address = 0x23;\n\t\t\tPPU.vram.address = (0xC0+j);\t\t\t\t\n\t\t\tPPU.vram.data = 0x55;//0b00001111;\t\n\t\t}\n\t\t\t\t\t\n\t\tPPU.vram.address = 0x23;\n\t\tPPU.vram.address = 0xC3;\n\t\tPPU.vram.data = 0xF0;\t\t\t\n\t\t\n\t\tPPU.vram.address = 0x23;\n\t\tPPU.vram.address = 0xC4;\n\t\tPPU.vram.data = 0x00;\n\t\t\t\t\n\t}\t\n\t\n\tReset_Scroll();\n\tAll_On();\n\n    bgcolor(NES_BACKGROUND_COLOR);\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/pce/pce_init_graphics.c",
    "content": "#include <peekpoke.h>\n#include <pce.h>\n#include <_vdc.h>\n\n#include \"display_macros.h\"\n\n\n#define VDC_CTRL     0x0000\n#define VDC_DATA_LO  0x0002\n#define VDC_DATA_HI  0x0003\n\n/*\nVDC_CTRL        = $0000\nVDC_DATA_LO     = $0002\nVDC_DATA_HI = $0003\n*/\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tuint8_t i;\n\t// uint8_t j;\n\t\n\t// for(j=0;j<8;++j)\n\t\tfor(i=0;i<254;++i)\n\t\t{\n\t\t\tPOKE(VDC_CTRL,0x20);\n\t\t\tPOKE(VDC_CTRL,0x00);\n\t\t\t\n\t\t\tPOKE(VDC_DATA_HI,i);\n\t\t\tPOKE(VDC_DATA_LO,i);\n\t\t\t// __vdc.data = i;\n\t\t\t// POKE(VDC_MAWR,0x20+j);\n\t\t\t// POKE(VDC_MAWR,0x00+i);\n\t\t\t// POKE(VDC_VWR,i);\n\t\t}\n\n    _setScreenColors();\n}\n\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/supervision/supervision_init_graphics.c",
    "content": "#include <supervision.h>\r\n#include \"display_macros.h\"\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    SV_LCD.height = 160;\r\n    SV_LCD.width = 160;\r\n    \r\n    _setScreenColors();\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cc65/vic20/vic20_init_graphics.c",
    "content": "\n#if !defined(PEEK)\n    #include <peekpoke.h>\n#endif\n#include <vic20.h>\n#include <stdint.h>\n\n#include \"display_macros.h\"\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\t#if !defined(_XL_NO_UDG)\n\t\t#if defined(__VIC20_EXP_8K) || defined(__VIC20_EXP_16K)\n            #if !defined(VIC20_USE_0X0F) && !defined(__MEMORY_MAPPED_GRAPHICS)\n                uint8_t tmp;\n\n                tmp = ~0x0F & PEEK(&(VIC.addr));\n                POKE(&(VIC.addr), tmp | 0x0E); // 1110 -> character map at $1800\n            #else\n\t\t\tuint8_t tmp;\n\n\t\t\ttmp = ~0x0F & PEEK(&(VIC.addr));\n\t\t\tPOKE(&(VIC.addr), tmp | 0x0F);\n            #endif\n\t\t#elif defined(__VIC20_EXP_3K) || defined(__VIC20_UNEXPANDED) \n\t\t\tPOKE(0x9005,0xFF);\n\t\t#endif\n\t#endif\n\t\n\tPOKE(646,1);\n    \n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n        POKE(36879L,25);\n    #else\n        POKE(36879L,8);\n    #endif\n    \n\t#if defined(DEBUG)\n\t\t#if defined(__VIC20_EXP_8K) || defined(__VIC20_EXP_16K)\n\t\t\t#define BASE_ADDR 0x1000\n\t\t#else\n\t\t\t#define BASE_ADDR 0x1E00\n\t\t#endif\n\t\t{\n\t\t\tuint8_t i;\n\t\t\t\n\t\t\ti=0;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tPOKE(BASE_ADDR+i,i);\n\t\t\t\t++i;\n\t\t\t} while(i!=0);\n\t\t\twhile(1);\n\t\t}\n\t#endif\n\n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cmoc/coco/coco_init_graphics.c",
    "content": "\r\n/*\r\n\r\n// COCO 3\r\n// Set 256x192x16 mode\r\nPOKE(0xFF99,0x1A);\r\n\r\n// Set graphics ON\r\nPOKE(0xFF98,0x80);\r\n\r\n// Set actual screen ram at $600000\r\nPOKE(0xFF9D,0xC0);\r\nPOKE(0xFF9E,0x00);\r\n\r\n// Set palette\r\nPOKE(0xFFB0,...);\r\n...\r\nPOKE(0xFFBF,...);\r\n\r\n// Set MMU windows at $8000\r\nPOKE(0xFFA4,0x30);\r\nPOKE(0xFFA5,0x31);\r\nPOKE(0xFFA6,0x32);\r\n\r\n\r\n*/\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\r\n\r\n#define _MONO_WHITE_ON_BLACK 0xF8\r\n#define _MONO_GREEN_ON_DARK_GREEN 0xF0\r\n#define _MULTI_COLOR_ON_WHITE (0xF8-0x10)\r\n#define _MULTI_COLOR_ON_GREEN (0xF0-0x10)\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // Set monochromatic black/white ($F0 for green)\r\n    // 0xF8    -> 2 colors (black and white)\r\n    // 0XF0    -> 2 colors (dark green and light green)\r\n    // 0xF8-16 -> 4 colors with white background\r\n    // 0xF0-16 -> 4 colors with green background\r\n    \r\n    #if defined(__BIT_MAPPED_4_GRAPHICS)\r\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n            POKE(0xFF22,_MULTI_COLOR_ON_WHITE);\r\n        #else\r\n            POKE(0xFF22,_MULTI_COLOR_ON_GREEN);\r\n        #endif\r\n    #else\r\n        POKE(0xFF22,_MONO_GREEN_ON_DARK_GREEN);\r\n    #endif\r\n    \r\n    // Set resolution to 256x192\r\n    POKE(0xFFC3,1);\r\n    POKE(0xFFC5,1);\r\n    \r\n    // Set screen memory at $0E00\r\n    POKE(0xFFC7,1);\r\n    POKE(0xFFC9,1);\r\n    POKE(0xFFCB,1);\r\n\r\n    _setScreenColors();\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cmoc/coco3/coco3_init_graphics.c",
    "content": "\r\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\r\n#define POKEW(addr,val)    (*(unsigned*) (addr) = (val))\r\n#define PEEK(addr)         (*(uint8_t*) (addr))\r\n#define PEEKW(addr)        (*(unsigned*) (addr))\r\n\r\n#include \"display_macros.h\"\r\n\r\n#include \"coco.h\"\r\n\r\n// #include \"color_definitions.h\"\r\n\t\r\n#define _GIME_BLACK 0b000000\r\n#define _GIME_WHITE 0b111111\r\n\r\n#define _GIME_RED 0b100100\r\n#define _GIME_GREEN 0b010010\r\n#define _GIME_CYAN 0b011011\r\n\r\n#define _GIME_YELLOW 0b110110\r\n\r\n#define _GIME_PURPLE 0b101101\r\n\r\n#define _GIME_BLUE 0b001001\r\n\r\n\r\nconst unsigned char _color_encoding[] = \r\n\t{\r\n\t\t_GIME_BLACK,_GIME_WHITE,_GIME_RED,_GIME_GREEN,_GIME_CYAN,_GIME_YELLOW,_GIME_PURPLE,_GIME_BLUE,\r\n\t\t_GIME_BLACK,_GIME_WHITE,_GIME_RED,_GIME_GREEN,_GIME_CYAN,_GIME_YELLOW,_GIME_PURPLE,_GIME_BLUE,\r\n\t};\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // uint16_t i;\r\n\t// uint16_t j;\r\n\tuint8_t color;\r\n\r\n\tdisableInterrupts();\r\n\r\n\t// High speed (2 Mhz CPU clock)\r\n\tPOKE(65497,0);\r\n\r\n    // Enable MMU\r\n    // POKE(0xFF90,0x40);\r\n    POKE(0xFF90,0x44);\r\n\r\n    // Set graphics ON\r\n    POKE(0xFF98,0x80);\r\n\r\n    // Set 256x192x16 mode\r\n    POKE(0xFF99,0x1A);\r\n\r\n    // Set actual screen ram at $600000\r\n    POKE(0xFF9D,0xC0);\r\n    POKE(0xFF9E,0x00);\r\n\r\n    // Set palette   \r\n    for(color=0;color<16;++color)\r\n    {\r\n        POKE(0xFFB0+color,_color_encoding[color]);\r\n    }\r\n    // POKE(0xFFB,0x3F);\r\n    \r\n    // Set MMU windows at $8000\r\n    POKE(0xFFA4,0x30);\r\n    POKE(0xFFA5,0x31);\r\n    POKE(0xFFA6,0x32);\r\n\r\n\t// color = 0;\r\n\r\n    // for(i=0;i<24000/32;++i)\r\n    // {\r\n\t\t\r\n        // POKE(0x8000+i,255);\r\n\r\n\t\t// for(j=0;j<700;++j)\r\n\t\t// {\r\n\t\t// }\r\n\t\t// if((i&31)==31)\r\n\t\t// {\r\n\t\t\t// _XL_WAIT_FOR_INPUT();\r\n\t\t\t// ++color;\r\n\t\t\t// color&=7;\r\n\t\t// }\r\n    // }\r\n\r\n    // while(1){};\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/cmoc/mo5/mo5_init_graphics.c",
    "content": "#include \"conio_patch.h\"\n#include \"display_macros.h\"\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{               \n\t\t// Hide blinking cursor\n\t\tPUTCH(0x14);\t\n\t\n\t\t\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n            \n            // SCREEN 7 - TEXT COLOR\n            PUTCH(0x1B);PUTCH(32);PUTCH(64);PUTCH(32);\n        \n            // SCREEN ,0 - BACKGROUND COLOR\n            PUTCH(0x1B);PUTCH(32);PUTCH(87);PUTCH(32);\n\n            // BORDER COLOR\n            PUTCH(0x1B);PUTCH(103);\n\n\t\t#else\n            // SCREEN 7 - TEXT COLOR\n            PUTCH(0x1B);PUTCH(32);PUTCH(71);PUTCH(32);\n            \n            // SCREEN ,0 - BACKGROUND COLOR\n            PUTCH(0x1B);PUTCH(32);PUTCH(80);PUTCH(32);  \n\n            // BORDER COLOR\n            PUTCH(0x1B);PUTCH(96);\n\n        #endif\n                \n\t\t// SCREEN ,,,0 (Fix attributes)\n\t\tPUTCH(0x1B);PUTCH(118);\n\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/gcc/ncurses_init_graphics.c",
    "content": "#if defined(WIN32)\n    #include <ncurses/curses.h>\n#else\n    #include <ncurses.h>\n#endif\n\n#include \"display_macros.h\"\n\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n    #define _NCURSES_BACKGROUND_COLOR COLOR_WHITE\n#else\n    #define _NCURSES_BACKGROUND_COLOR COLOR_BLACK\n#endif\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n    #if defined(__ATARI_ST__)\n        putenv(\"TERM=st52\");\n    #endif\n\tinitscr();   \n\tnoecho();\n\tcurs_set(0);\n\tstart_color();\n\tcbreak();\n\tintrflush(stdscr, TRUE);\n\tinit_pair(1, COLOR_YELLOW, _NCURSES_BACKGROUND_COLOR);\n\tinit_pair(2, COLOR_CYAN, _NCURSES_BACKGROUND_COLOR);\n\tinit_pair(3, COLOR_RED, _NCURSES_BACKGROUND_COLOR);\n\tinit_pair(4, COLOR_GREEN, _NCURSES_BACKGROUND_COLOR);\n\tinit_pair(5, COLOR_BLUE, _NCURSES_BACKGROUND_COLOR);\n\tinit_pair(6, COLOR_WHITE, _NCURSES_BACKGROUND_COLOR);\n\tinit_pair(7, COLOR_MAGENTA, _NCURSES_BACKGROUND_COLOR);\n\tinit_pair(8, COLOR_BLACK, _NCURSES_BACKGROUND_COLOR);\n\n    wbkgd(stdscr, COLOR_PAIR(1));\n    \n    refresh();\n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/gcc/terminal_init_graphics.c",
    "content": "#if defined(WIN32)\n    #include <ncurses/curses.h>\n#else\n    #include <ncurses.h>\n#endif\n\n#include \"display_macros.h\"\n\n\n#if _XL_TILE_X_SIZE==8\n    #define _MAX_BIT_VALUE 128\n\n    #if _XL_TILE_Y_SIZE==8\n        #include \"8x8_chars.h\"\n\n    #elif _XL_TILE_Y_SIZE==6\n        #include \"8x6_chars.h\"\n    #endif\n#elif _XL_TILE_X_SIZE==7\n    #define _MAX_BIT_VALUE 64\n\n    #include \"7x8_chars.h\"\n\n#elif _XL_TILE_X_SIZE==6\n    #define _MAX_BIT_VALUE 32\n\n    #if _XL_TILE_Y_SIZE==8\n        #include \"6x8_chars.h\"\n        \n    #elif _XL_TILE_Y_SIZE==9\n        #include \"6x9_chars.h\"\n    #endif\n#endif\n\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n    #define _NCURSES_BACKGROUND_COLOR COLOR_WHITE\n#else\n    #define _NCURSES_BACKGROUND_COLOR COLOR_BLACK\n#endif\n\n#if _XL_TILE_Y_SIZE==9\n    #define _SPACE_ {0,0,0,0,0,0,0,0,0}\n#elif _XL_TILE_Y_SIZE==8\n    #define _SPACE_ {0,0,0,0,0,0,0,0}\n#elif _XL_TILE_Y_SIZE==6\n    #define _SPACE_ {0,0,0,0,0,0}\n#endif\n\nuint8_t _terminal_text_color;\n\nuint8_t _tiles[][_XL_TILE_Y_SIZE] =\n{\n    _SPACE_,\n    _TILE_DIGIT_0,\n    _TILE_DIGIT_1,\n    _TILE_DIGIT_2,\n    _TILE_DIGIT_3,\n    _TILE_DIGIT_4,\n    _TILE_DIGIT_5,\n    _TILE_DIGIT_6,\n    _TILE_DIGIT_7,\n    _TILE_DIGIT_8,\n    _TILE_DIGIT_9,\n    _TILE_0_UDG,\n    _TILE_1_UDG,\n    _TILE_2_UDG,\n    _TILE_3_UDG,\n    _TILE_4_UDG,\n    _TILE_5_UDG,\n    _TILE_6_UDG,\n    _TILE_A,\n    _TILE_B,\n    _TILE_C,\n    _TILE_D,\n    _TILE_E,\n    _TILE_F,\n    _TILE_G,\n    _TILE_H,\n    _TILE_I,\n    _TILE_J,\n    _TILE_K,\n    _TILE_L,\n    _TILE_M,\n    _TILE_N,\n    _TILE_O,\n    _TILE_P,\n    _TILE_Q,\n    _TILE_R,\n    _TILE_S,\n    _TILE_T,\n    _TILE_U,\n    _TILE_V,\n    _TILE_W,\n    _TILE_X,\n    _TILE_Y,\n    _TILE_Z,\n    _TILE_7_UDG, // 43\n    _TILE_8_UDG,\n    _TILE_9_UDG,\n    _TILE_10_UDG,\n    _TILE_11_UDG,\n    _TILE_12_UDG,\n    _TILE_13_UDG,\n    _TILE_14_UDG,\n    _TILE_15_UDG,\n    _TILE_16_UDG,\n    _TILE_17_UDG,\n    _TILE_18_UDG,\n    _TILE_19_UDG,\n    _TILE_20_UDG,\n    _TILE_21_UDG,\n    _TILE_22_UDG,\n    _TILE_23_UDG,\n    _TILE_24_UDG,\n    _TILE_25_UDG,\n    _TILE_26_UDG,\n    // {0x18,0x3e,0x60,0x3c,0x06,0x7c,0x18,0x00},\n};\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n    #if defined(__ATARI_ST__)\n        putenv(\"TERM=st52\");\n    #endif\n\tinitscr();\n\tnoecho();\n    nodelay(NULL, TRUE);\n\tcurs_set(0);\n\tstart_color();\n\tcbreak();\n\tintrflush(stdscr, TRUE);\n\t// init_pair(1, COLOR_YELLOW, _NCURSES_BACKGROUND_COLOR);\n\t// init_pair(2, COLOR_CYAN, _NCURSES_BACKGROUND_COLOR);\n\t// init_pair(3, COLOR_RED, _NCURSES_BACKGROUND_COLOR);\n\t// init_pair(4, COLOR_GREEN, _NCURSES_BACKGROUND_COLOR);\n\t// init_pair(5, COLOR_BLUE, _NCURSES_BACKGROUND_COLOR);\n\t// init_pair(6, COLOR_WHITE, _NCURSES_BACKGROUND_COLOR);\n\t// init_pair(7, COLOR_MAGENTA, _NCURSES_BACKGROUND_COLOR);\n\t// init_pair(8, COLOR_BLACK, _NCURSES_BACKGROUND_COLOR);\n\n\tinit_pair(1, _NCURSES_BACKGROUND_COLOR, COLOR_YELLOW);\n\tinit_pair(2, _NCURSES_BACKGROUND_COLOR, COLOR_CYAN);\n\tinit_pair(3, _NCURSES_BACKGROUND_COLOR, COLOR_RED);\n\tinit_pair(4, _NCURSES_BACKGROUND_COLOR, COLOR_GREEN);\n\tinit_pair(5, _NCURSES_BACKGROUND_COLOR, COLOR_BLUE);\n\tinit_pair(6, _NCURSES_BACKGROUND_COLOR, COLOR_WHITE);\n\tinit_pair(7, _NCURSES_BACKGROUND_COLOR, COLOR_MAGENTA);\n\tinit_pair(8, _NCURSES_BACKGROUND_COLOR, COLOR_BLACK);\n\n    wbkgd(stdscr, COLOR_PAIR(8));\n    \n    refresh();\n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/gcc4ti99/gcc4ti99_init_graphics.c",
    "content": "\r\n#include <system.h>\r\n#include <conio.h>\r\n#include <vdp.h>\r\n\r\n#include \"8x8_chars.h\"\r\n\r\n#include \"udg_map.h\"\r\n\r\n#include \"display_macros.h\"\r\n// #include <stdint.h>\r\n\r\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n    #define set_group_color(group, color) \\\r\n        vdpmemset(gColor+group,COLOR_WHITE+16*color,1)\r\n\r\n#else\r\n    #define set_group_color(group, color) \\\r\n        vdpmemset(gColor+group,COLOR_BLACK+16*color,1)\r\n#endif\r\n\r\n#define _GROUP_COLOR_OFFSET 8\r\n\r\n// COLOR_LTGREEN\r\n// COLOR_LTYELLOW\r\n\r\nvoid set_udg_colors(void)\r\n{\r\n\r\n// 0\r\n\tset_group_color(0,COLOR_LTBLUE);\r\n\tset_group_color(1,COLOR_LTBLUE);\r\n\tset_group_color(2,COLOR_LTBLUE);\r\n\tset_group_color(3,COLOR_LTBLUE);\r\n\r\n// 32 - Digits\r\n\tset_group_color(4,COLOR_WHITE);\r\n\tset_group_color(5,COLOR_WHITE);\r\n\tset_group_color(6,COLOR_WHITE);\r\n\tset_group_color(7,COLOR_WHITE);\r\n\r\n// 64 - Alphabet\r\n\tset_group_color(8,COLOR_WHITE);\r\n\tset_group_color(9,COLOR_WHITE);\r\n\tset_group_color(10,COLOR_WHITE);\r\n\tset_group_color(11,COLOR_WHITE);\r\n\r\n// 96\r\n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n\tset_group_color(12,COLOR_BLACK);\r\n\tset_group_color(13,COLOR_BLACK);\r\n\tset_group_color(14,COLOR_BLACK);\r\n\tset_group_color(15,COLOR_BLACK);\r\n    #else\r\n\tset_group_color(12,COLOR_WHITE);\r\n\tset_group_color(13,COLOR_WHITE);\r\n\tset_group_color(14,COLOR_WHITE);\r\n\tset_group_color(15,COLOR_WHITE);\r\n    #endif\r\n\r\n// 128\r\n\tset_group_color(16,COLOR_CYAN);\r\n\tset_group_color(17,COLOR_CYAN);\r\n\tset_group_color(18,COLOR_CYAN);\r\n\tset_group_color(19,COLOR_CYAN);\r\n\r\n// 160\r\n\tset_group_color(20,COLOR_LTRED);\r\n\tset_group_color(21,COLOR_LTRED);\r\n\tset_group_color(22,COLOR_LTRED);\r\n\tset_group_color(23,COLOR_LTRED);\r\n\r\n// 192\r\n\tset_group_color(24,COLOR_LTGREEN);\r\n\tset_group_color(25,COLOR_LTGREEN);\r\n\tset_group_color(26,COLOR_LTGREEN);\r\n\tset_group_color(27,COLOR_LTGREEN);\r\n\r\n// 224\r\n\tset_group_color(28,COLOR_LTYELLOW);\r\n\tset_group_color(29,COLOR_LTYELLOW);\r\n\tset_group_color(30,COLOR_LTYELLOW);\r\n\tset_group_color(31,COLOR_LTYELLOW);\r\n}\r\n\r\n\r\nvoid redefine(const uint8_t ch, const uint8_t* image) \r\n{ \r\n\r\n    vdpmemcpy(gPattern +(uint16_t)(ch<<3),image,8); \r\n} \r\n\r\n\r\nvoid SET_UDG_IMAGES(void) \r\n{ \r\n    uint8_t i;\r\n    uint8_t j;\r\n\r\n    for (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \r\n    {\r\n        for(j=0;j<5;++j)\r\n        {\r\n            redefine(redefine_map[i].ascii+32*j, redefine_map[i].bitmap);\r\n        }\r\n    } \r\n}\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    set_graphics(VDP_SPR_16x16);                        // set video mode\r\n    charsetlc();                                        // load character set with lowercase\r\n    vdpmemset(gImage, 32, 768);                         // clear screen\r\n    VDP_SET_REGISTER(VDP_REG_COL, COLOR_BLACK);      // set screen color\r\n    \r\n    set_udg_colors();\r\n    \r\n    SET_UDG_IMAGES();\r\n\r\n    _setScreenColors();\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/lcc1802/comx/comx_color_init_graphics.c",
    "content": "#include <devkit/video/vis_video.h>\r\n#include <devkit/system/system.h>\r\n\r\n#if !defined(NTSC)\r\n    #define NUMBER_OF_LINES 9\r\n    #include \"6x9_chars.h\"\r\n#else\r\n    #define NUMBER_OF_LINES 8\r\n    #include \"6x8_chars.h\"\r\n#endif\r\n\r\n\r\n#if defined(__COMX__) || defined(__PECOM__) \r\n    #include \"comx_color_settings.h\"\r\n#elif defined(__CIDELSA__) && !!defined(_XL_NO_UDG)\r\n    // #include \"cidelsa_no_gfx.h\"\r\n#elif defined(__MICRO__)\r\n    #include \"micro_settings.h\"\r\n#endif\r\n\r\n#include \"standard_libs.h\"\r\n#include \"cross_lib.h\"\r\n\r\n#if defined(__CIDELSA__)\r\n    #include <devkit/video/cidelsa_char.h>\r\n#endif\r\n\r\n#if defined(__MICRO__)\r\n    #include \"devkit/video/vis_char.h\"\r\n#endif\r\n\r\n#if !defined(COLOR_OFFSET)\r\n    #define COLOR_OFFSET 64\r\n#endif\r\n\r\n#if defined(__COMX__) || defined(__PECOM__) || defined(__MICRO__) || !defined(_XL_NO_UDG)\r\n        void redefine_char(uint8_t ch, const uint8_t * shapelocation)\r\n        {\r\n            uint8_t colored_shape[NUMBER_OF_LINES];\r\n            uint8_t i;\r\n            uint8_t color;\r\n            \r\n            for(color=0;color<3;++color)\r\n            {\r\n                for(i=0;i<NUMBER_OF_LINES;++i)\r\n                {\r\n                   colored_shape[i]=shapelocation[i]+COLOR_OFFSET+color*64U;\r\n                }\r\n                shapechar(colored_shape, ch+color, 1);\r\n            }\r\n        }\r\n\r\n        const struct redefine_struct\r\n        {\r\n           const uint8_t _ascii;\r\n           const uint8_t _bitmap[9];\r\n        } ;\r\n\r\n    #if defined(__COMX__) || defined(__PECOM__) || defined(__MICRO__)\r\n        const struct redefine_struct redefine_map[] =\r\n        {\r\n            {_TILE_0, _TILE_0_UDG},\r\n            {_TILE_1, _TILE_1_UDG},\r\n            {_TILE_2, _TILE_2_UDG},\r\n            {_TILE_3, _TILE_3_UDG},\r\n            {_TILE_4, _TILE_4_UDG},\r\n            {_TILE_5, _TILE_5_UDG},\r\n            {_TILE_6, _TILE_6_UDG},\r\n            {_TILE_7, _TILE_7_UDG},\r\n            {_TILE_8, _TILE_8_UDG},\r\n            {_TILE_9, _TILE_9_UDG},\r\n            {_TILE_10, _TILE_10_UDG},\r\n            {_TILE_11, _TILE_11_UDG},\r\n            {_TILE_12, _TILE_12_UDG},\r\n            {_TILE_13, _TILE_13_UDG},\r\n            {_TILE_14, _TILE_14_UDG},\r\n            {_TILE_15, _TILE_15_UDG},\r\n            {_TILE_16, _TILE_16_UDG},\r\n            {_TILE_17, _TILE_17_UDG},\r\n            {_TILE_18, _TILE_18_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=20\r\n            {_TILE_19, _TILE_19_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=21\r\n            {_TILE_20, _TILE_20_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=22\r\n            {_TILE_21, _TILE_21_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=23\r\n            {_TILE_22, _TILE_22_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=24\r\n            {_TILE_23, _TILE_23_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=25\r\n            {_TILE_24, _TILE_24_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=26\r\n            {_TILE_25, _TILE_25_UDG},\r\n            // #if _XL_NUMBER_OF_TILES>=27\r\n            {_TILE_26, _TILE_26_UDG},\r\n            // #endif\r\n            // #endif\r\n            // #endif\r\n            // #endif\r\n            // #endif\r\n            // #endif\r\n            // #endif\r\n            // #endif\r\n        };\r\n\r\n    #endif\r\n\r\n#endif\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    initvideo();\r\n    setvideobase(BASE_ADDR);\r\n    \r\n\t#if !defined(VIS_INT)\r\n\t\tdisableinterrupt();\r\n    #endif\r\n\t\r\n    #if defined(__TMC600__)\r\n    \ttextcolor(5);\r\n    #endif\r\n    \r\n    #if defined(__CIDELSA__) || defined(__MICRO__)\r\n        character_set(4);\r\n    #endif\r\n\r\n    #if defined(__COMX__) || defined(__PECOM__) || defined(__CIDELSA__) || defined(__MICRO__)\r\n    \r\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n            (void) bgcolor(7);\r\n        #else\r\n            (void) bgcolor(0);\r\n        #endif\r\n        \r\n        // bgcolor(__BACKGROUND_COLOR); \r\n        \r\n    \ttextcolordefinition(3);\r\n        monochrome(0);\r\n    #endif\r\n    \r\n    #if defined(__PECOM__)\r\n        shapecolor(48, 10, 2); // to reshape the numbers\r\n        shapecolor(65, 26, 3); // to reshape the capitals\r\n    #endif\r\n \r\n    #if defined(__COMX__) || defined(__PECOM__) || defined(__MICRO__) || !defined(_XL_NO_UDG) \r\n        for(i=0;i<_XL_NUMBER_OF_TILES;++i)\r\n        {\r\n            redefine_char(redefine_map[i]._ascii, redefine_map[i]._bitmap);\r\n        }\r\n    #endif\r\n   \r\n\r\n    _setScreenColors();\r\n}\r\n\r\n\r\n#if defined(__CIDELSA__)\r\n#include <devkit/video/cidelsa_char.c>\r\n#endif\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/lcc1802/comx/comx_init_graphics.c",
    "content": "#include <devkit/video/vis_video.h>\r\n#include <devkit/system/system.h>\r\n\r\n#if !defined(_XL_NO_UDG)\r\n    #include \"6x9_chars.h\"\r\n#endif\r\n\r\n#if defined(__COMX__) || defined(__PECOM__) || (defined(__CIDELSA__) && !defined(_XL_NO_UDG))\r\n    #include \"comx_settings.h\"\r\n#elif defined(__MICRO__)\r\n    #include \"micro_settings.h\"\r\n\r\n#endif\r\n\r\n#include \"standard_libs.h\"\r\n#include \"cross_lib.h\"\r\n\r\n#if defined(__CIDELSA__)\r\n    #include <devkit/video/cidelsa_char.h>\r\n#endif\r\n\r\n#if defined(__MICRO__)\r\n    #include \"devkit/video/vis_char.h\"\r\n#endif\r\n\r\n#if defined(__COMX__) || defined(__PECOM__) || defined(__MICRO__) || !defined(_XL_NO_UDG)\r\n    void redefine_char(uint8_t ch, const uint8_t * shapelocation, int color)\r\n    {\r\n        uint8_t colored_shape[9];\r\n        uint8_t i;\r\n        \r\n        for(i=0;i<9;++i)\r\n        {\r\n           colored_shape[i]=shapelocation[i]+color*64;\r\n        }\r\n        shapechar(colored_shape, ch, 1);\r\n    }\r\n\r\n    const struct redefine_struct\r\n    {\r\n       const uint8_t _ascii;\r\n       const uint8_t _bitmap[9];\r\n       const uint8_t _color;\r\n    } ;\r\n\r\n\r\nconst struct redefine_struct redefine_map[] =\r\n{\r\n    {_TILE_0, _TILE_0_UDG, 3},\r\n    {_TILE_1, _TILE_1_UDG, 3},\r\n    {_TILE_2, _TILE_2_UDG, 3},\r\n    {_TILE_3, _TILE_3_UDG, 3},\r\n    {_TILE_4, _TILE_4_UDG, 3},\r\n    {_TILE_5, _TILE_5_UDG, 0},\r\n    {_TILE_6, _TILE_6_UDG, 0},\r\n    {_TILE_7, _TILE_7_UDG, 2},\r\n    {_TILE_8, _TILE_8_UDG, 2},\r\n    {_TILE_9, _TILE_9_UDG, 1},\r\n    {_TILE_10, _TILE_10_UDG, 3},\r\n    {_TILE_11, _TILE_11_UDG, 3},\r\n    {_TILE_12, _TILE_12_UDG, 2},\r\n    {_TILE_13, _TILE_13_UDG, 2},\r\n    {_TILE_14, _TILE_14_UDG, 3},\r\n    {_TILE_15, _TILE_15_UDG, 3},\r\n    {_TILE_16, _TILE_16_UDG, 3},\r\n    {_TILE_17, _TILE_17_UDG, 3},\r\n    {_TILE_18, _TILE_18_UDG, 0},\r\n    {_TILE_19, _TILE_19_UDG, 3},\r\n    {_TILE_20, _TILE_20_UDG, 3},\r\n    {_TILE_21, _TILE_21_UDG, 3},\r\n    {_TILE_22, _TILE_22_UDG, 3},\r\n    {_TILE_23, _TILE_23_UDG, 3},\r\n    {_TILE_24, _TILE_24_UDG, 3},\r\n    {_TILE_25, _TILE_25_UDG, 3},\r\n    {_TILE_26, _TILE_26_UDG, 3},\r\n};\r\n\r\n\r\n\r\n#endif\r\n\r\n#if defined(__MEMORY_MAPPED_GRAPHICS)\r\n    #include \"memory_mapped_graphics.h\"\r\n#elif defined(__LCC1802_GRAPHICS)\r\n    #include \"lcc1802_graphics.h\"\r\n#endif\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    initvideo();\r\n    setvideobase(BASE_ADDR);\r\n    \r\n    disableinterrupt();\r\n    \r\n    #if defined(__TMC600__)\r\n    \ttextcolor(5);\r\n    #endif\r\n    \r\n    #if defined(__CIDELSA__) || defined(__MICRO__)\r\n        character_set(4);\r\n    #endif\r\n    \r\n    #if defined(__COMX__) || defined(__PECOM__) || defined(__MICRO__) || !defined(_XL_NO_UDG) \r\n        for(i=0;i<_XL_NUMBER_OF_TILES;++i)\r\n        {\r\n            redefine_char(redefine_map[i]._ascii, redefine_map[i]._bitmap, redefine_map[i]._color);\r\n        }\r\n    #endif\r\n    \r\n    #if defined(__COMX__) || defined(__PECOM__) || defined(__CIDELSA__) || defined(__MICRO__)\r\n        #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n            (void) bgcolor(7);\r\n        #else\r\n            (void) bgcolor(0);\r\n        #endif\r\n    \ttextcolordefinition(3);\r\n        monochrome(0);\r\n    #endif\r\n    \r\n    #if defined(__PECOM__)\r\n        shapecolor(36, 22, 2); // to reshape the numbers\r\n        shapecolor(65, 26, 3); // to reshape the capitals\r\n    #endif\r\n\r\n    _setScreenColors();\r\n}\r\n\r\n\r\n#if defined(__CIDELSA__)\r\n#include <devkit/video/cidelsa_char.c>\r\n#endif\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/lcc1802/comx/micro_color_init_graphics.c",
    "content": "#include <devkit/video/vis_video.h>\r\n#include <devkit/system/system.h>\r\n\r\n#if !defined(_XL_NO_UDG)\r\n    #if !defined(NTSC)\r\n        #define NUMBER_OF_LINES 9\r\n        #include \"6x9_chars.h\"\r\n    #else\r\n        #define NUMBER_OF_LINES 8\r\n        #include \"6x8_chars.h\"\r\n    #endif\r\n#endif\r\n\r\n\r\n#include \"micro_color_settings.h\"\r\n\r\n#include \"standard_libs.h\"\r\n#include \"cross_lib.h\"\r\n\r\n#include \"devkit/video/vis_char.h\"\r\n\r\n#define _BASE_COLOR 192\r\n\r\nvoid redefine_char(uint8_t ch, const uint8_t * shapelocation)\r\n{\r\n    uint8_t colored_shape[NUMBER_OF_LINES];\r\n    uint8_t i;\r\n    \r\n\r\n    for(i=0;i<NUMBER_OF_LINES;++i)\r\n    {\r\n       colored_shape[i]=shapelocation[i]+_BASE_COLOR;\r\n    }\r\n    shapechar(colored_shape, ch, 1);\r\n}\r\n\r\nconst struct redefine_struct\r\n{\r\n   const uint8_t _ascii;\r\n   const uint8_t _bitmap[9];\r\n} ;\r\n\r\n\r\n// {0,16, 62, 32, 60,  4,124,  8,  0}},\r\nconst struct redefine_struct redefine_map[] =\r\n{\r\n    {_TILE_0, _TILE_0_UDG},\r\n    {_TILE_1, _TILE_1_UDG},\r\n    {_TILE_2, _TILE_2_UDG},\r\n    {_TILE_3, _TILE_3_UDG},\r\n    {_TILE_4, _TILE_4_UDG},\r\n    {_TILE_5, _TILE_5_UDG},\r\n    {_TILE_6, _TILE_6_UDG},\r\n    {_TILE_7, _TILE_7_UDG},\r\n    {_TILE_8, _TILE_8_UDG},\r\n    {_TILE_9, _TILE_9_UDG},\r\n    {_TILE_10, _TILE_10_UDG},\r\n    {_TILE_11, _TILE_11_UDG},\r\n    {_TILE_12, _TILE_12_UDG},\r\n    {_TILE_13, _TILE_13_UDG},\r\n    {_TILE_14, _TILE_14_UDG},\r\n    {_TILE_15, _TILE_15_UDG},\r\n    {_TILE_16, _TILE_16_UDG},\r\n    {_TILE_17, _TILE_17_UDG},\r\n    {_TILE_18, _TILE_18_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=20\r\n    {_TILE_19, _TILE_19_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=21\r\n    {_TILE_20, _TILE_20_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=22\r\n    {_TILE_21, _TILE_21_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=23\r\n    {_TILE_22, _TILE_22_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=24\r\n    {_TILE_23, _TILE_23_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=25\r\n    {_TILE_24, _TILE_24_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=26\r\n    {_TILE_25, _TILE_25_UDG},\r\n    #if _XL_NUMBER_OF_TILES>=27\r\n    {_TILE_26, _TILE_26_UDG},\r\n    #endif\r\n    #endif\r\n    #endif\r\n    #endif\r\n    #endif\r\n    #endif\r\n    #endif\r\n    #endif\r\n    // {_DOLLAR_TILE, _DOLLAR_DEFINITION},\r\n};\r\n\r\n\r\n\r\n#include \"lcc1802_color_graphics.h\"\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    initvideo();\r\n    setvideobase(BASE_ADDR);\r\n    \r\n    disableinterrupt();\r\n    \r\n    character_set(4);\r\n    \r\n    \r\n    for(i=0;i<_XL_NUMBER_OF_TILES;++i)\r\n    {\r\n        redefine_char(redefine_map[i]._ascii, redefine_map[i]._bitmap);\r\n    }\r\n    \r\n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n        (void) bgcolor(7);\r\n    #else\r\n        (void) bgcolor(0);\r\n    #endif\r\n    textcolordefinition(3);\r\n    monochrome(0);\r\n    \r\n    _setScreenColors();\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/vbcc/bbc/bbc_init_graphics.c",
    "content": "\r\n// DOC on VDU\r\n// https://www.bbcbasic.co.uk/bbcbasic/manual/vdu.html#vdu22\r\n\r\n/*\r\n0 \tNull - it does nothing.\r\n1 \tSend the next character to the printer ONLY.\r\n2 \tEnable the printer.\r\n3 \tDisable the printer.\r\n4 \tWrite text at the text cursor position.\r\n5 \tWrite text at the graphics cursor position.\r\n6 \tEnable output to the screen.\r\n7 \tBell - make a short 'beep'.\r\n8 \tMove the text cursor backwards one character.\r\n9 \tMove the text cursor forwards one character.\r\n10 \tMove the text cursor down one line.\r\n11 \tMove the text cursor up one line.\r\n12 \tClear the text area - identical to CLS.\r\n13 \tMove the text cursor to the start of the current line.\r\n14 \tEnable the auto-paging mode.\r\n15 \tDisable the auto-paging mode.\r\n16 \tClear the graphics area - identical to CLG.\r\n17 \tDefine a text colour - identical to COLOUR.\r\n18 \tDefine a graphics colour - identical to GCOL.\r\n19 \tSelect a colour palette.\r\n20 \tRestore the default logical colours.\r\n21 \tDisable output to the screen.\r\n22 \tSelect the screen mode - identical to MODE.\r\n23 \tProgram characters and control the cursor.\r\n24 \tDefine a graphics window.\r\n25 \tIdentical to PLOT.\r\n26 \tRestore the default text and graphics windows.\r\n27 \tSend the next character to the screen.\r\n28 \tDefine a text window.\r\n29 \tSet the graphics origin.\r\n30 \tHome the text cursor to the top left of the screen.\r\n31 \tMove the text cursor - identical to TAB(x,y).\r\n127 \tBackspace and delete.\r\n*/\r\n\r\n// char OSBYTE0(__reg(\"a\") char)=\"\\tjsr\\t$fff4\\n\\ttxa\";\r\n// char OSBYTE1(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\n// char OSBYTE1RI(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\\n\\tpha\\n\\ttya\\n\\ttax\\n\\tpla\";\r\n// char OSBYTE2(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\n// char OSBYTE2I(__reg(\"a\") char,__reg(\"r0/r1\") unsigned int)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\n// void OSBYTE0NR(__reg(\"a\") char)=\"\\tjsr\\t$fff4\";\r\n// void OSBYTE1NR(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\";\r\n// void OSBYTE2NR(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\";\r\n\r\n// #define OSVER() OSBYTE0(0)\r\n// #define OSUSRFLG(x,y) OSBYTE2(1,(x),(y))\r\n// #define OSSELINPUT(x) OSBYTE1NR(2,(x))\r\n// #define OSSELOUTPUT(x) OSBYTE2(3,(x),(y))\r\n// #define OSCURSORED(x) OSBYTE2(4,(x),(y))\r\n// #define OSSELADC(x) OSBYTE1(16,(x))\r\n// #define OSFRCADC(x) OSBYTE1NR(17,(x))\r\n// #define OSVSYNC() OSBYTE0(19)\r\n// #define OSRDVDU() OSBYTE0(117)\r\n// #define OSSCANKEY(x) OSBYTE1(121,(x))\r\n// #define OSSCANKEY16() OSBYTE0(122)\r\n// #define OSADVAL(x) OSBYTE1RI(128,(x))\r\n// #define OSINKEY(x) OSBYTE2I(129,(x)) \r\n\r\n\r\n// void OSWORD(__reg(\"a\") char,__reg(\"r0/r1\") void *)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff1\";\r\n\r\n// #define OSRDSYSCLK(x) OSWORD(1,x)\r\n// #define OSWRSYSCLK(x) OSWORD(2,x)\r\n// #define OSRDTIMER(x) OSWORD(3,x)\r\n// #define OSWRTIMER(x) OSWORD(4,x)\r\n// #define OSRDIO(x) OSWORD(5,x)\r\n// #define OSWRIO(x) OSWORD(6,x)\r\n// #define OSSOUND(x) OSWORD(7,x)\r\n// #define OSENVELOPE(x) OSWORD(8,x)\r\n// #define OSRDPIXEL(x) OSWORD(9,x)\r\n// #define OSRDCHARDEF(x) OSWORD(10,x)\r\n// #define OSRDPALETTE(x) OSWORD(11,x)\r\n// #define OSWRPALETTE(x) OSWORD(12,x)\r\n// #define OSRDGRCURSOR(x) OSWORD(13,x)\r\n\r\n#include \"8x8_chars.h\"\r\n#include \"udg_map.h\"\r\n\r\n#include <stdint.h>\r\n\r\nvoid osputc(__reg(\"a\") char)=\"\\tjsr\\t0xffee\";\r\n\r\n\r\n\r\nvoid redefine(const uint8_t ch, const uint8_t *data)\r\n{\r\n    uint8_t i;\r\n    \r\n    osputc(23);\r\n    osputc(ch);\r\n    for(i=0;i<8;++i)\r\n    {\r\n        osputc(data[i]);\r\n    }\r\n}\r\n\r\n\r\nvoid SET_UDG_IMAGES(void) \r\n{ \r\n    uint8_t i;\r\n\r\n    for (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \r\n    {\r\n            redefine(redefine_map[i].ascii, redefine_map[i].bitmap);\r\n    } \r\n}\r\n\r\n\r\n// COLORS\r\n// 0 -> black\r\n// 1 -> red\r\n// 2 -> green\r\n// 3 -> yellow\r\n// 4 -> blue\r\n// 5 -> purple\r\n// 6 -> cyan\r\n// 7 -> white\r\n\r\n\r\n\r\n// OSSCANKEY\r\n// 'b' <-> SPACE\r\n// '%' <-> 'I'\r\n// 'F' <-> 'K'\r\n// 'E' <-> 'J'\r\n// 'V' <-> 'L'\r\n\r\n#if !defined(__BBC_MODE)\r\n    #define __BBC_MODE 7\r\n#endif\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    #if __BBC_MODE!=7\r\n        osputc(22);\r\n        #if defined(__SHADOW_RAM)\r\n            osputc((uint8_t)__BBC_MODE+128U);\r\n        #else\r\n            osputc(__BBC_MODE);\r\n        #endif\r\n    #endif\r\n\r\n\r\n    #if __BBC_MODE==5\r\n        #if !defined(__USE_GREEN)\r\n            osputc(19);\r\n            osputc(2);\r\n            osputc(6);\r\n            osputc(1);\r\n            osputc(1);\r\n            osputc(1);\r\n        #else\r\n            osputc(19);\r\n            osputc(2);\r\n            osputc(2);\r\n            osputc(0);\r\n            osputc(0);\r\n            osputc(0);\r\n        #endif\r\n    \r\n    #endif\r\n    \r\n    // Disable the cursor\r\n    osputc(23);\r\n    osputc(1);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n\r\n#if !(__BBC_MODE==7) \r\n    SET_UDG_IMAGES();\r\n#endif\r\n\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/vbcc/bbc/bbc_init_graphics_test.c",
    "content": "\r\n// DOC on VDU\r\n// https://www.bbcbasic.co.uk/bbcbasic/manual/vdu.html#vdu22\r\n\r\n/*\r\n0 \tNull - it does nothing.\r\n1 \tSend the next character to the printer ONLY.\r\n2 \tEnable the printer.\r\n3 \tDisable the printer.\r\n4 \tWrite text at the text cursor position.\r\n5 \tWrite text at the graphics cursor position.\r\n6 \tEnable output to the screen.\r\n7 \tBell - make a short 'beep'.\r\n8 \tMove the text cursor backwards one character.\r\n9 \tMove the text cursor forwards one character.\r\n10 \tMove the text cursor down one line.\r\n11 \tMove the text cursor up one line.\r\n12 \tClear the text area - identical to CLS.\r\n13 \tMove the text cursor to the start of the current line.\r\n14 \tEnable the auto-paging mode.\r\n15 \tDisable the auto-paging mode.\r\n16 \tClear the graphics area - identical to CLG.\r\n17 \tDefine a text colour - identical to COLOUR.\r\n18 \tDefine a graphics colour - identical to GCOL.\r\n19 \tSelect a colour palette.\r\n20 \tRestore the default logical colours.\r\n21 \tDisable output to the screen.\r\n22 \tSelect the screen mode - identical to MODE.\r\n23 \tProgram characters and control the cursor.\r\n24 \tDefine a graphics window.\r\n25 \tIdentical to PLOT.\r\n26 \tRestore the default text and graphics windows.\r\n27 \tSend the next character to the screen.\r\n28 \tDefine a text window.\r\n29 \tSet the graphics origin.\r\n30 \tHome the text cursor to the top left of the screen.\r\n31 \tMove the text cursor - identical to TAB(x,y).\r\n127 \tBackspace and delete.\r\n*/\r\n\r\n#include \"bbc.h\"\r\n// char OSBYTE0(__reg(\"a\") char)=\"\\tjsr\\t$fff4\\n\\ttxa\";\r\n// char OSBYTE1(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\n// char OSBYTE1RI(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\\n\\tpha\\n\\ttya\\n\\ttax\\n\\tpla\";\r\n// char OSBYTE2(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\n// char OSBYTE2I(__reg(\"a\") char,__reg(\"r0/r1\") unsigned int)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\n// void OSBYTE0NR(__reg(\"a\") char)=\"\\tjsr\\t$fff4\";\r\n// void OSBYTE1NR(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\";\r\n// void OSBYTE2NR(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\";\r\n\r\n// #define OSVER() OSBYTE0(0)\r\n// #define OSUSRFLG(x,y) OSBYTE2(1,(x),(y))\r\n// #define OSSELINPUT(x) OSBYTE1NR(2,(x))\r\n// #define OSSELOUTPUT(x) OSBYTE2(3,(x),(y))\r\n// #define OSCURSORED(x) OSBYTE2(4,(x),(y))\r\n// #define OSSELADC(x) OSBYTE1(16,(x))\r\n// #define OSFRCADC(x) OSBYTE1NR(17,(x))\r\n// #define OSVSYNC() OSBYTE0(19)\r\n// #define OSRDVDU() OSBYTE0(117)\r\n// #define OSSCANKEY(x) OSBYTE1(121,(x))\r\n// #define OSSCANKEY16() OSBYTE0(122)\r\n// #define OSADVAL(x) OSBYTE1RI(128,(x))\r\n// #define OSINKEY(x) OSBYTE2I(129,(x)) \r\n\r\n\r\n// void OSWORD(__reg(\"a\") char,__reg(\"r0/r1\") void *)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff1\";\r\n\r\n// #define OSRDSYSCLK(x) OSWORD(1,x)\r\n// #define OSWRSYSCLK(x) OSWORD(2,x)\r\n// #define OSRDTIMER(x) OSWORD(3,x)\r\n// #define OSWRTIMER(x) OSWORD(4,x)\r\n// #define OSRDIO(x) OSWORD(5,x)\r\n// #define OSWRIO(x) OSWORD(6,x)\r\n// #define OSSOUND(x) OSWORD(7,x)\r\n// #define OSENVELOPE(x) OSWORD(8,x)\r\n// #define OSRDPIXEL(x) OSWORD(9,x)\r\n// #define OSRDCHARDEF(x) OSWORD(10,x)\r\n// #define OSRDPALETTE(x) OSWORD(11,x)\r\n// #define OSWRPALETTE(x) OSWORD(12,x)\r\n// #define OSRDGRCURSOR(x) OSWORD(13,x)\r\n\r\n#include \"8x8_chars.h\"\r\n#include \"udg_map.h\"\r\n\r\n#include <stdint.h>\r\n// #include <stdio.h>\r\n\r\nvoid osputc(__reg(\"a\") char)=\"\\tjsr\\t0xffee\";\r\n\r\n// static uint8_t stripes[] = {255,0,255,0,255,0,255,0};\r\n\r\n// static uint8_t player[] = {24, 36, 24,102,153, 24, 36, 102};\r\n\r\n\r\n\r\n\r\n// void redefine(const uint8_t ch, const uint8_t* image) \r\n// { \r\n    // uint8_t i; \r\n    \r\n    // for(i=0;i<8;++i) \r\n    // { \r\n        // DISPLAY_POKE(CHAR_BASE +(uint16_t)(ch<<3)+i,image[i]); \r\n    // } \r\n// } \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nvoid redefine(const uint8_t ch, const uint8_t *data)\r\n{\r\n    uint8_t i;\r\n    \r\n    osputc(23);\r\n    osputc(ch);\r\n    for(i=0;i<8;++i)\r\n    {\r\n        osputc(data[i]);\r\n    }\r\n    // osputc('\\n');\r\n}\r\n\r\n\r\nvoid SET_UDG_IMAGES(void) \r\n{ \r\n    uint8_t i;\r\n    // uint8_t j;\r\n\r\n    for (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \r\n    {\r\n            redefine(redefine_map[i].ascii, redefine_map[i].bitmap);\r\n    } \r\n}\r\n\r\n\r\n// void _gotoxy(uint8_t x, uint8_t y)\r\n// {\r\n    // osputc(31);\r\n    // osputc(x);\r\n    // osputc(y);\r\n// }\r\n// COLORS\r\n// 0 -> black\r\n// 1 -> red\r\n// 2 -> green\r\n// 3 -> yellow\r\n// 4 -> blue\r\n// 5 -> purple\r\n// 6 -> cyan\r\n// 7 -> white\r\n\r\n\r\n\r\n// OSSCANKEY\r\n// 'b' <-> SPACE\r\n// '%' <-> 'I'\r\n// 'F' <-> 'K'\r\n// 'E' <-> 'J'\r\n// 'V' <-> 'L'\r\n\r\n#if !defined(__BBC_MODE)\r\n    #define __BBC_MODE 7\r\n#endif\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // uint8_t res;\r\n\r\n    #if __BBC_MODE!=7\r\n        osputc(22);\r\n        #if defined(__SHADOW_RAM)\r\n            osputc((uint8_t)__BBC_MODE+128U);\r\n        #else\r\n            osputc(__BBC_MODE);\r\n        #endif\r\n    #endif\r\n\r\n\r\n    #if __BBC_MODE==5\r\n        #if !defined(__USE_GREEN)\r\n            osputc(19);\r\n            osputc(2);\r\n            osputc(6);\r\n            osputc(1);\r\n            osputc(1);\r\n            osputc(1);\r\n        #else\r\n            osputc(19);\r\n            osputc(2);\r\n            osputc(2);\r\n            osputc(0);\r\n            osputc(0);\r\n            osputc(0);\r\n        #endif\r\n    \r\n    #endif\r\n    \r\n    // Disable the cursor\r\n    osputc(23);\r\n    osputc(1);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n\r\n    // Delete graphics screen data\r\n    // osputc(16);\r\n    // osputc(12);\r\n\r\n        \r\n    // Redefine characters\r\n    // TODO: This is wrong\r\n#if !(__BBC_MODE==7) \r\n    SET_UDG_IMAGES();\r\n#endif\r\n\r\n    osputc('A');\r\n    osputc('B');\r\n    osputc('C');\r\n    \r\n    osputc(_TILE_0);\r\n    osputc(_TILE_1);\r\n    osputc(_TILE_2);\r\n\r\n    \r\n    while(1){};\r\n\r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/aquarius/aquarius_init_graphics.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#define _AQUARIUS_RED 16\n#define _AQUARIUS_WHITE (16+32+64)\n#define _AQUARIUS_CYAN (16+128)\n\n#include \"memory_mapped_graphics.h\"\n#include \"display_macros.h\"\n\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\n#define POKEW(addr,val)    (*(unsigned*) (addr) = (val))\n#define PEEK(addr)         (*(uint8_t*) (addr))\n#define PEEKW(addr) (*(unsigned*) (addr))\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tuint8_t i;\n\t\n\tPOKE(COLOR_ADDR,7);\n\t\n\tfor(i=0;i<251;++i)\n\t{\n\t\tPOKE((uint16_t) (COLOR_ADDR+1+i),128);\n\t\tPOKE((uint16_t) (COLOR_ADDR+250+i),128);\n\t\tPOKE((uint16_t) (COLOR_ADDR+500+i),128);\n\t\tPOKE((uint16_t) (COLOR_ADDR+749+i),128);\n\t}\n\n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/c128/c128_init_graphics.c",
    "content": "#include <graphics.h>\n#include \"display_macros.h\"\n\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tclg();\n\t\n\t// Disable VIC-IIe to get a little speed-up (about 7%)\n    /*\n\t__asm\n    ; Disable VIC-IIe chip\n\tld a,0\n\tld bc,$d011\n\tout (c),a\n    \n    ; Set fast mode\n    ld a,1\n    ld bc,$d030\n    out (c),a\n\t__endasm;\n    */\n    \n    _setScreenColors();\n}\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/cpc/cpc_cpcrslib_init_graphics.c",
    "content": "\n#include \"display_macros.h\"\n\n#define UDG_N 26\n\n\nchar char_list[] = \n{ \n33, '\\0', // TILE_\n37, '\\0', // TILE_\n44, '\\0', // TILE_\n40, '\\0', // TILE_\n43, '\\0', // TILE_\n42, '\\0', // TILE_8\n41, '\\0', // TILE_\n49, '\\0', // TILE_\n46, '\\0', // TILE_\n52, '\\0', // TILE_\n39, '\\0', // TILE_\n38, '\\0', // TILE_\n45, '\\0', // TILE_\n33, '\\0', // TILE_\n34, '\\0', // TILE_\n35, '\\0', // TILE_\n36, '\\0', // TILE_\n47, '\\0', // TILE_12\n48, '\\0', // TILE_13\n50, '\\0',\n51, '\\0',\n122, '\\0',\n123, '\\0',\n124, '\\0',\n125, '\\0',\n126, '\\0',\n127, '\\0',\n128, '\\0'\n};\n\nchar space_str[2] = {' ', '\\0'};\n\nvoid set_palette()\n{ \n#asm\n    EXTERN firmware\n\n\tld bc,$0000\n    call firmware\n\tdefw 0xbc38\t\n \n    ld  a,$00\n    ld  bc,$0000\n    call firmware\n    defw 0xbc32\n\t\n    ld  a,$02\n    ld  bc,$1a1a\n    call firmware\n    defw 0xbc32\n\t\n    ld  a,$03\n    ld  bc,$0606\n    call firmware\n    defw 0xbc32\n\t\n    ld  a,$01\n    ld  bc,$1818\n    call firmware\n    defw 0xbc32\n#endasm \n}\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tset_palette();\n\n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/g850/g850_init_graphics.c",
    "content": "\r\n#include <conio.h>\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    fputc_cons(12);\r\n}"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/msx/msx_redefined_chars_init_graphics.c",
    "content": "\n#include <msx/gfx.h>\n#include \"display_macros.h\"\n\n// 0000 | 07FF | VRAM: Main Tile Patterns (1/3)\n// 0800 | 0FFF | VRAM: Extra Tile Patterns (2/3)\n// 1000 | 17FF | VRAM: Extra Tile Patterns (3/3)\n// 1800 | 1AFF | VRAM: Tilemap\n// 1B00 | 1B7F | VRAM: Sprite Attributes\n// 1B80 | 1BAF | VRAM: Palette Table\n// 2000 | 37FF | VRAM: Colormap\n// 3800 | 3FFF | VRAM: Sprite Patterns\n\n\n\n\n#if !defined(USE_MSX_BIOS)\n    #define COLOR_DEF 0x1000\n    #define CHAR_BASE 0x2000\n    #define TEXT_MODE_32x40 mode_0\n#else\n    #define COLOR_DEF 0x2000\n    #define CHAR_BASE 0x0000\n    #define TEXT_MODE_32x40 mode_1    \n#endif\n\n#include \"msx_redefined_chars_settings.h\"\n\n#include \"8x8_chars.h\"\n\n#include \"udg_map.h\"\n\n#include \"memory_mapped_graphics.h\"\n\n\nvoid set_group_color(uint8_t group, uint8_t color)\n{\n\tmsx_vpoke(COLOR_DEF+group, color<<4);\n}\n\n/*\n\n$00 \tTransparent \t#000000\n$01 \tBlack \t#000000\n$02 \tMedium Green \t#21C842\n$03 \tLight Green \t#5EDC78\n$04 \tDark Blue \t#5455ED\n$05 \tLight Blue \t#7D76FC\n$06 \tDark Red \t#D4524D\n$07 \tCyan \t#42EBF5\n$08 \tMedium Red \t#FC5554\n$09 \tLight Red \t#FF7978\n$0a \tDark Yellow \t#D4C154\n$0b \tLight Yellow \t#E6CE80\n$0c \tDark Green \t#21B03B\n$0d \tMagenta \t#C95BBA\n$0e \tGray \t#CCCCCC\n$0f \tWhite \t#FFFFFF \n\n*/\n\n#define MSX_COLOR_MEDIUM_GREEN 2\n#define MSX_COLOR_DARK_RED 6\n#define MSX_COLOR_CYAN 7\n#define MSX_COLOR_MEDIUM_RED 8\n#define MSX_COLOR_LIGHT_RED 9\n#define MSX_COLOR_DARK_YELLOW 10\n#define MSX_COLOR_LIGHT_YELLOW 11\n#define MSX_COLOR_WHITE 15\n\nvoid set_udg_colors(void)\n{\n\tuint8_t i;\n\t\n    #if !defined(ALL_COLOR)\n        #if defined(__ALTERNATIVE_COLOR)\n            set_group_color(0,MSX_COLOR_LIGHT_RED);\n            set_group_color(1,MSX_COLOR_WHITE);\n            set_group_color(2,MSX_COLOR_LIGHT_RED);\n            set_group_color(3,MSX_COLOR_LIGHT_YELLOW);\n            set_group_color(4,MSX_COLOR_DARK_YELLOW);\n            set_group_color(5,MSX_COLOR_MEDIUM_GREEN);\n            set_group_color(6,MSX_COLOR_WHITE);\n            set_group_color(7,MSX_COLOR_WHITE);\n            for(i=8;i<=11;++i)\n            {\n                set_group_color(i,MSX_COLOR_WHITE);\n            }\n            for(i=12;i<=20;++i)\n            {\n                set_group_color(i,MSX_COLOR_DARK_RED);\n            }\n            for(i=21;i<=28;++i)\n            {\n                set_group_color(i,MSX_COLOR_WHITE);\n            }\n            for(i=29;i<=31;++i)\n            {\n                set_group_color(i,MSX_COLOR_CYAN);\n            }\n        #else\n            set_group_color(0,MSX_COLOR_LIGHT_RED);\n            set_group_color(1,MSX_COLOR_WHITE);\n            set_group_color(2,MSX_COLOR_LIGHT_RED);\n            set_group_color(3,MSX_COLOR_LIGHT_YELLOW);\n            set_group_color(4,MSX_COLOR_DARK_YELLOW);\n            set_group_color(5,MSX_COLOR_MEDIUM_GREEN);\n            set_group_color(6,MSX_COLOR_CYAN);\n            set_group_color(7,MSX_COLOR_CYAN);\n            for(i=8;i<=11;++i)\n            {\n                set_group_color(i,MSX_COLOR_WHITE);\n            }\n            for(i=21;i<=31;++i)\n            {\n                set_group_color(i,MSX_COLOR_LIGHT_RED);\n            }\n        #endif\n        \n\n\t#else\n        for(i=0;i<=32;++i)\n        {\n            set_group_color(i,ALL_COLOR);\n        }\n    #endif\n    \n    \n\n}\n\n\nvoid redefine(const uint8_t ch, const uint8_t* image) \n{ \n    uint8_t i; \n    \n    for(i=0;i<8;++i) \n    { \n        DISPLAY_POKE(CHAR_BASE +(uint16_t)(ch<<3)+i,image[i]); \n    } \n} \n\n\nvoid SET_UDG_IMAGES(void) \n{ \n\tuint8_t i;\n    \n\tfor (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \n\t{ \n\t   redefine(redefine_map[i].ascii, redefine_map[i].bitmap); \n\t} \n}\n\n#include <conio.h>\nvoid _XL_INIT_GRAPHICS(void)\n{\n    \n    #if defined(VDP_WAIT_V_SYNC)\n        #include <interrupt.h>\n        add_raster_int(tick_count_isr);\n    #endif\n\n\tset_mode(TEXT_MODE_32x40);\n    \n\tset_color(15, 1, 1);\n    \n\tset_udg_colors();\n    \n\tSET_UDG_IMAGES();\n    \n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/rex/rex_init_graphics.c",
    "content": "\n#include <rex/rex.h>\n#include \"display_macros.h\"\n\n\n#define UDG_N 20\n\nchar char_list[UDG_N*2] = \n{ \n'*', '\\0', // PLAYER\n'O', '\\0', // GHOST\n'X', '\\0', // BOMB\n'+', '\\0', // SKULL\n'.', '\\0', // BULLET\n'P', '\\0', // POWERUP\n'!', '\\0', // GUN\n'$', '\\0', // EXTRA_POINTS_IMAGE\n'V', '\\0', // INVINCIBILITY\n'*', '\\0', // EXTRA LIFE\n'>', '\\0', // LEFT_HORIZONTAL_MISSILE\n'<', '\\0', // RIGHT_HORIZONTAL_MISSILE\n'^', '\\0', // ROCKET\n'*', '\\0', // PLAYER_DOWN\n'*', '\\0', // PLAYER_UP\n'*', '\\0', // PLAYER_RIGHT\n'*', '\\0', // PLAYER_LEFT    \n'|', '\\0', // VERTICAL_BRICK\n'-', '\\0' // HORIZONTAL_BRICK \n};\n\nchar space_str[2] = {' ', '\\0'};\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tDsEventClear();\n\tDsClearScreen();\n    \n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/sms/sms_init_graphics.c",
    "content": "#include <stdio.h>\n#include <stropts.h>\n#include <arch/sms.h>\n#include <rect.h>\n#include <input.h>\n\n#include \"display_macros.h\"\n\n\nconst uint8_t author[] = \"z88dk\";\nconst uint8_t name[] = \"Hello World\";\nconst uint8_t description[] = \"Test program for the output terminal.\";\n\nextern uint8_t font_8x8_bbc_system[];\n\nconst uint8_t palette[] = {0x00,0x01,0x05,0x15,0x24,0x25,0x29,0x39,0x16,0x1a,0x1b,0x2a,0x3a,0x3e,0x2b,0x3f};\n\nconst struct r_Rect8 rect = {0, 32, 0, 24};\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tsms_memcpy_mem_to_cram(0, palette, 16);\n\tsms_memcpy_mem_to_cram(16, palette, 16);\n\n\tsms_vdp_set_write_address(0x0000);\n\tsms_copy_font_8x8_to_vram(font_8x8_bbc_system, 128 - 32, 0, 1);\n\t\n\tsms_display_on();\n\tsms_border(4);\n\t\n\t// clear entire screen with # character\n\t\n\tsms_cls_wc(&rect,'#' - 32);\n\t\n\t// clear terminal only\n\t\n\tioctl(1, IOCTL_OTERM_CLS);\n\tioctl(1, IOCTL_OTERM_PAUSE, 0);\n\n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/udg/udg_init_graphics.c",
    "content": "\n#include <graphics.h>\n\n#include \"display_macros.h\"\n\n#include <sys/ioctl.h>\n\n#if defined(__HECTORHR__)\n        #include <arch/hector.h>\n#endif \n\nextern uint8_t udgs[];\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\tvoid *param = &udgs;\n\t\n\n    // Necessary to have .vz file correctly started on several emulators that do not load .vz as they should\n    #if defined(__VZ__)\n        *((unsigned char *)0x7839) |= 1;\n    #endif\n\n\t#if !defined(__SCREEN_MODE)\n\t\t#define __SCREEN_MODE 2\n\t#endif\n\t\n\t#if defined(__MC1000__) && defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\n\t\tint mode = __SCREEN_MODE + 32;\n\t#else\n\t\tint mode = __SCREEN_MODE;\n\t#endif\n\t\t\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode); \n\tconsole_ioctl(IOCTL_GENCON_SET_FONT32, &param);\n\n    // TODO: remove the Spectrum special case\n\t#if defined(__SPECTRUM__)\n        printf(\"\\x01\\x20\");\n\n        textbackground(_XL_BACKGROUND_COLOR);\n        zx_border(_XL_BACKGROUND_COLOR);\n    #elif defined(__HECTORHR__)\n        // #include <arch/hector.h>\n        #if defined(__USE_GREEN)\n            hector_set_palette(HECTOR_BLACK, HECTOR_WHITE, HECTOR_GREEN, HECTOR_RED);\n        #else\n            hector_set_palette(HECTOR_BLACK, HECTOR_WHITE, HECTOR_CYAN, HECTOR_RED);\n        #endif\n\t#else\n        _setScreenColors();\n    #endif\n}\n\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/udg/udg_msx_test.c",
    "content": "\r\n#include <graphics.h>\r\n\r\n#include \"display_macros.h\"\r\n\r\n#include <sys/ioctl.h>\r\n\r\n#include <conio.h>\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n\t\r\n    int mode = mode_2;\r\n    console_ioctl(IOCTL_GENCON_SET_MODE, &mode);\r\n    \r\n    gotoxy(2,2);\r\n    printf(\"hello world!\\n\");\r\n    \r\n    gotoxy(0,0);\r\n    printf(\"a\");\r\n    \r\n    gotoxy(31,0);\r\n    printf(\"b\");\r\n    \r\n    gotoxy(0,23);\r\n    printf(\"c\");\r\n    \r\n    gotoxy(31,23);\r\n    printf(\"d\");\r\n    \r\n    while(1){};\r\n    _setScreenColors();\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/vz200/vz200_init_graphics.c",
    "content": "\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    // Necessary to have .vz file correctly started on several emulators that do not load .vz as they should\r\n    *((unsigned char *)0x7839) |= 1; \r\n}\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/x07/x07_init_graphics.c",
    "content": "\r\n#include <sys/ioctl.h>\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    int height = 4;\r\n    console_ioctl(IOCTL_GENCON_SET_FONT_H,&height);\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/z88/z88_init_graphics.c",
    "content": "#include <dor.h>\n\n// #define HELP1   \"A pointless demo application made with z88dk\"\n// #define HELP2   \"Simply loops, points out menu selections and dies\"\n// #define HELP3   \"..eventually..see source for details\"\n// #define HELP4   \"\"\n// #define HELP5   \"v0.1 - 9.4.99 (djm)\"\n// #define HELP6   \"\"\n\n#pragma -no-expandz88\n\n#if !defined(BAD_PAGES)\n\t#define BAD_PAGES 2\n#else\n\t#define BAD_PAGES 1\n#endif \n#pragma -reqpag=BAD_PAGES\n\n#pragma printf = \"\"\n\n// /* Redirect OZ required callbacks to our functions */\n// #pragma redirect handlecmds=_handlecmds\n// #pragma redirect redrawscreen=_redrawscreen\n\n#define APP_INFO \"by Fabrizio Caruso\"\n#define APP_KEY  'X'\n#define APP_NAME \"XChase\"\n\n#include <application.h>\n\n#include <graphics.h> \n\n#include \"display_macros.h\"\n\nvoid _XL_INIT_GRAPHICS(void) \n{ \n\t#if defined(__Z88DK_SPRITES_GRAPHICS)\n\t\tstatic struct window win; /* Window structure */ \t\n\t\n\t\twin.graph=1; \n\t\twin.width=255; \n\t\twin.number='4'; \n\t\twindow(win); \n\t#endif\n    _setScreenColors();\n}\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/z88/z88_udg_init_graphics.c",
    "content": "#include <dor.h>\r\n#pragma -no-expandz88\r\n#if !defined(BAD_PAGES)\r\n\t#define BAD_PAGES 2\r\n#else\r\n\t#define BAD_PAGES 1\r\n#endif \r\n#pragma -reqpag=BAD_PAGES\r\n#define APP_INFO \"by Fabrizio Caruso\"\r\n#define APP_KEY  'X'\r\n#define APP_NAME \"XL\"\r\n#include <application.h>\r\n#include <graphics.h> \r\n#include \"display_macros.h\"\r\n\r\nextern uint8_t udgs[];\r\n\r\nvoid _XL_INIT_GRAPHICS(void) \r\n{ \r\n\tvoid *param = &udgs;\r\n\t#if !defined(__SCREEN_MODE)\r\n\t\t#define __SCREEN_MODE 2\r\n\t#endif\r\n    int mode = __SCREEN_MODE;\r\n\tconsole_ioctl(IOCTL_GENCON_SET_FONT32, &param);\r\n        \r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode); \r\n\r\n    z88_disable_cursor();\r\n    _setScreenColors();\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/zx80/zx80_init_graphics.c",
    "content": "\n#include \"display_macros.h\"\n\n\nvoid _XL_INIT_GRAPHICS(void)\n{\n\t#if defined(ZX80_GEN_TV_FIELD)\n\t\tgen_tv_field_init();\n\t#endif\n    _setScreenColors();\n}\n\n\n"
  },
  {
    "path": "src/cross_lib/display/init_graphics/z88dk/zx81/zx81_init_graphics.c",
    "content": "\r\n#include \"display_macros.h\"\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n    #if !defined(__Z88DK_SPRITES_GRAPHICS)\r\n\tclg();\r\n    #endif\r\n    _setScreenColors();\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/redefine_characters/udg_map.h",
    "content": "\n#ifndef _UDG_MAP\n#define _UDG_MAP\n\n#if !defined(USE_MSX_BIOS)\n    #include \"display_macros.h\"\n    #include \"tiles.h\"\n#endif\n\nconst struct redefine_struct\n{\n   const uint8_t ascii;\n   const uint8_t bitmap[8];\n} ;\n\n\n#if defined(__C16__) && defined(__CONIO_GRAPHICS)\n\tchar screenCode(char ch)\n\t{\n\t\tif(ch<64)\n\t\t{\n\t\t\treturn ch;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ch-64;\n\t\t}\n\t\treturn ch;\n\t}\n#else\n    #define screenCode(ch) ch\n#endif\n\nconst struct redefine_struct redefine_map[] =\n{\n\t{_TILE_0, _TILE_0_UDG},\n\t{_TILE_1, _TILE_1_UDG},\n\t{_TILE_2, _TILE_2_UDG},\t\n\t{_TILE_3, _TILE_3_UDG},\n\t{_TILE_4, _TILE_4_UDG},\n\t{_TILE_5, _TILE_5_UDG},\n\t{_TILE_6, _TILE_6_UDG},\n    {_TILE_7, _TILE_7_UDG},\n    {_TILE_8, _TILE_8_UDG},\n    {_TILE_9, _TILE_9_UDG},\n    {_TILE_10, _TILE_10_UDG},\n    {_TILE_11, _TILE_11_UDG},\n    {_TILE_12, _TILE_12_UDG},\n    {_TILE_13, _TILE_13_UDG},\n    {_TILE_14, _TILE_14_UDG},\n    {_TILE_15, _TILE_15_UDG},\n    {_TILE_16, _TILE_16_UDG},\n    {_TILE_17, _TILE_17_UDG},\n    {_TILE_18, _TILE_18_UDG},\n    {_TILE_19, _TILE_19_UDG},\n    {_TILE_20, _TILE_20_UDG},\n    {_TILE_21, _TILE_21_UDG},\n    {_TILE_22, _TILE_22_UDG},\n    {_TILE_23, _TILE_23_UDG},\n    {_TILE_24, _TILE_24_UDG},\n    {_TILE_25, _TILE_25_UDG},\n    {_TILE_26, _TILE_26_UDG},\n};\n\n\n#define REDEFINE_AT(addr) \\\n{ \\\n\tuint8_t i; \\\n\t\\\n\tfor (i = 0; i < (sizeof(redefine_map)/sizeof(*redefine_map)); ++i) \\\n\t{ \\\n\t\tmemcpy((uint8_t *)(addr) + screenCode((redefine_map[i].ascii))*8, redefine_map[i].bitmap, 8); \\\n\t} \\\n}\n\n\n#endif // _UDG_MAP\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/agat_settings.h",
    "content": "#define _TILE_0 0\r\n\r\n#define _TILE_1 1\r\n\r\n#define _TILE_2 2\r\n\r\n#define _TILE_3 3\r\n\r\n#define _TILE_4 4\r\n\r\n#define _TILE_5 5\r\n\r\n#define _TILE_6 6\r\n\r\n#define _TILE_7 7\r\n\r\n#define _TILE_8 8\r\n\r\n#define _TILE_9 9\r\n\r\n#define _TILE_10 10\r\n\r\n#define _TILE_11 11\r\n\r\n#define _TILE_12 12\r\n\r\n#define _TILE_13 13\r\n\r\n#define _TILE_14 14\r\n\r\n#define _TILE_15 15\r\n\r\n#define _TILE_16 16\r\n\r\n#define _TILE_17 17\r\n\r\n#define _TILE_18 18\r\n\r\n#define _TILE_19 19\r\n\r\n#define _TILE_20 20\r\n\r\n#define _TILE_21 21\r\n\r\n#define _TILE_22 22\r\n\r\n#define _TILE_23 23\r\n\r\n#define _TILE_24 24\r\n\r\n#define _TILE_25 25\r\n\r\n#define _TILE_26 26\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/apple2_hgr_settings.h",
    "content": "\n#ifndef _APPLE2_HGR_SETTINGS\n#define _APPLE2_HGR_SETTINGS\n\n\n#define _TILE_0 11\n#define _TILE_1 12\n#define _TILE_2 13\n#define _TILE_3 14\n\n#define _TILE_4 15\n#define _TILE_5 16\n\n#define _TILE_6 17\n#define _TILE_7 44\n\n#define _TILE_8 45\n#define _TILE_9 46\n#define _TILE_10 47 \n#define _TILE_11 48\n\n#define _TILE_12 49\n#define _TILE_13 50\n#define _TILE_14 51\n#define _TILE_15 52\n#define _TILE_16 53\n#define _TILE_17 54\n#define _TILE_18 55\n\n\n#define _TILE_19 56\n#define _TILE_20 57\n#define _TILE_21 58\n#define _TILE_22 59\n#define _TILE_23 60\n#define _TILE_24 61\n\n#define _TILE_25 62\n#define _TILE_26 63\n\n\n\n#endif // _APPLE2_HGR_SETTINGS\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/atari7800_settings.h",
    "content": "\r\n// 37 * 2 = 74\r\n\r\n#define _TILE_0  (0+74)\r\n#define _TILE_1  (2+74)\r\n#define _TILE_2  (4+74)\r\n#define _TILE_3  (6+74)\r\n#define _TILE_4  (8+74)\r\n#define _TILE_5  (10+74)\r\n#define _TILE_6  (12+74)\r\n#define _TILE_7  (14+74)\r\n#define _TILE_8  (16+74)\r\n#define _TILE_9  (18+74)\r\n#define _TILE_10 (20+74)\r\n#define _TILE_11 (22+74)\r\n#define _TILE_12 (24+74)\r\n#define _TILE_13 (26+74)\r\n#define _TILE_14 (28+74)\r\n#define _TILE_15 (30+74)\r\n#define _TILE_16 (32+74)\r\n#define _TILE_17 (34+74)\r\n#define _TILE_18 (36+74)\r\n#define _TILE_19 (38+74)\r\n#define _TILE_20 (40+74)\r\n#define _TILE_21 (42+74)\r\n#define _TILE_22 (44+74)\r\n#define _TILE_23 (46+74)\r\n#define _TILE_24 (48+74)\r\n#define _TILE_25 (50+74)\r\n#define _TILE_26 (52+74)\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/atari_mode1_redefined_chars_settings.h",
    "content": "\n#ifndef _ATARI_MODE1_SETTINGS\n#define _ATARI_MODE1_SETTINGS\n\n// Still available:\n// 3,15,26,27,31,32 (TILE_19-24)\n// 16-25 (0-9)\n// 33-58 (A-Z)\n// 13 (-)\n// 4 ($)\n\n// #define _ATARI_MODE1_RED 0\n// #define _ATARI_MODE1_WHITE 64\n// #define _ATARI_MODE1_BLUE 128\n// #define _ATARI_MODE1_YELLOW 192\n\n\n#define _TILE_0 60\n#define _TILE_1 61\n#define _TILE_2 62\n#define _TILE_3 63\n\n#define _TILE_4 59\n#define _TILE_5 29\n\n#define _TILE_6 14\n#define _TILE_7 30 \n\n#define _TILE_8 28\n#define _TILE_9 11\n#define _TILE_10 12 \n#define _TILE_11 10 \n\n#define _TILE_12 5\n#define _TILE_13 6\n#define _TILE_14 9\n#define _TILE_15 8\n#define _TILE_16 7\n#define _TILE_17 1\n#define _TILE_18 2\n\n\n#define _TILE_19 3\n#define _TILE_20 15\n#define _TILE_21 26\n#define _TILE_22 27\n#define _TILE_23 31\n#define _TILE_24 32\n\n#define _TILE_25 4\n#define _TILE_26 13\n\n\n#endif // _ATARI_MODE1_SETTINGS\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/atmos_redefined_characters_settings.h",
    "content": "\n\n#define _TILE_0 '/'\n#define _TILE_1 '.'\n#define _TILE_2 ','\n#define _TILE_3 '*'\n#define _TILE_4 0x60\n#define _TILE_5 0x5b\n#define _TILE_6 ('Z'+2)\n#define _TILE_7 0x7b\n#define _TILE_8 0x5d\n#define _TILE_9 0x5e\n#define _TILE_10 0x3B  \n#define _TILE_11 0x5f\n#define _TILE_12 '|'\n#define _TILE_13 0x26\n#define _TILE_14 '>'\n#define _TILE_15 '<'\n#define _TILE_16 0x23\n#define _TILE_17 0x28\n#define _TILE_18 0x29\n#define _TILE_19 ('Z'+35)\n#define _TILE_20 ('Z'+36)\n#define _TILE_21 ('Z'+37)\n#define _TILE_22 ('<'+1)\n#define _TILE_23 ('+')\n#define _TILE_24 ('?')\n#define _TILE_25 '$'\n#define _TILE_26 ('@')\n\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/bbc_settings.h",
    "content": "\r\n#define _TILE_0 200\r\n#define _TILE_1 201\r\n#define _TILE_2 202\r\n#define _TILE_3 203\r\n#define _TILE_4 204\r\n#define _TILE_5 205\r\n#define _TILE_6 206\r\n#define _TILE_7 207\r\n#define _TILE_8 208\r\n#define _TILE_9 209\r\n#define _TILE_10 210\r\n#define _TILE_11 211\r\n#define _TILE_12 212\r\n#define _TILE_13 213\r\n#define _TILE_14 214\r\n#define _TILE_15 215\r\n#define _TILE_16 216\r\n#define _TILE_17 217\r\n#define _TILE_18 218\r\n#define _TILE_19 219\r\n#define _TILE_20 220\r\n#define _TILE_21 221\r\n#define _TILE_22 222\r\n#define _TILE_23 223\r\n#define _TILE_24 224\r\n#define _TILE_25 225\r\n#define _TILE_26 226\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/c128_settings.h",
    "content": "\r\n#ifndef _C264_REDEFINED_CHARS_H\r\n#define _C264_REDEFINED_CHARS_H\r\n\r\n// Still available:\r\n// 0x80-.... ?\r\n\r\n// BLUE\r\n#define _TILE_0 0x3B\r\n#define _TILE_1 0x3C\r\n#define _TILE_2 0x3D \r\n#define _TILE_3 0x3E\r\n\r\n#define _TILE_9 0x3F\r\n\r\n// YELLOW\r\n#define _TILE_7 0x27\r\n#define _TILE_12 0x26\r\n#define _TILE_13 0x2B\r\n#define _TILE_25 0x24\r\n\r\n// GREEN\r\n#define _TILE_8  0x2C\r\n\r\n// RED\r\n#define _TILE_5 0x29\r\n\r\n// CYAN\r\n#define _TILE_10 0x21\r\n#define _TILE_11 0x23\r\n\r\n// WHITE\r\n#define _TILE_4 0x1F\r\n\r\n#define _TILE_6 0x28\r\n\r\n#define _TILE_14 0x22\r\n\r\n#define _TILE_15 0x2E\r\n\r\n#define _TILE_16 0x2F\r\n\r\n#define _TILE_17 0x3A\r\n#define _TILE_18 0x25\r\n\r\n// OK\r\n#define _TILE_19 0\r\n\r\n// OK\r\n#define _TILE_20 28\r\n\r\n// OK\r\n#define _TILE_21 30\r\n\r\n// ok\r\n#define _TILE_22 0x2A\r\n\r\n// KO:\r\n#define _TILE_23 ('b'-65)\r\n\r\n// KO: \r\n#define _TILE_24 ('c'-65)\r\n\r\n#define _TILE_26 0x2D\r\n\r\n#endif // _C264_REDEFINED_CHARS_H\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/c264_link_time_redefined_chars_settings.h",
    "content": "\n\n\n// #define _TILE_15 0x7A\n// #define _TILE_24 0x7B\n\n#define _TILE_15 0x3A\n#define _TILE_24 0x3B\n\n#define _TILE_18 0x3C\n\n#define _TILE_21 0x3D\n#define _TILE_22 0x3E\n#define _TILE_23 0x3F\n// TO FIX\n// #define _TILE_24 0x40\n\n// TODO: Move this to 0x3A or 0x3B\n\n// BLUE\n#define _TILE_0 0x67\n#define _TILE_1 0x6B\n#define _TILE_2 0x69\n#define _TILE_3 0x68\n\n#define _TILE_9 0x5B\n\n// YELLOW\n#define _TILE_7 0x65\n#define _TILE_12 0x62\n#define _TILE_13 0x63\n#define _TILE_25 0x6A\n\n// GREEN\n#define _TILE_8  0x5D\n\n// RED\n#define _TILE_5 0x66\n\n// CYAN\n#define _TILE_10 0x5C\n#define _TILE_11 0x61\n\n// WHITE\n#define _TILE_4 0x64\n\n#define _TILE_6 0x6C\n\n#define _TILE_14 0x5F\n\n\n#define _TILE_16 0x5E\n\n// #define _TILE_17 0x7B\n#define _TILE_17 0x40\n\n\n#define _TILE_19 0x6E\n#define _TILE_20 0x6F\n\n#define _TILE_26 0x6D\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/c264_redefined_chars_settings.h",
    "content": "\n#ifndef _C264_REDEFINED_CHARS_H\n#define _C264_REDEFINED_CHARS_H\n\n// Still available:\n// 0x80-.... ?\n\n// BLUE\n#define _TILE_0 0x3B\n#define _TILE_1 0x3C\n#define _TILE_2 0x3D \n#define _TILE_3 0x3E\n\n#define _TILE_9 0x3F\n\n// YELLOW\n#define _TILE_7 0x27\n#define _TILE_12 0x26\n#define _TILE_13 0x2B\n#define _TILE_25 0x24\n\n// GREEN\n#define _TILE_8  0x2C\n\n// RED\n#define _TILE_5 0x29\n\n// CYAN\n#define _TILE_10 0x21\n#define _TILE_11 0x23\n\n// WHITE\n#define _TILE_4 0x1F\n\n#define _TILE_6 0x28\n\n#define _TILE_14 0x22\n\n#define _TILE_15 0x2E\n\n#define _TILE_16 0x2F\n\n#define _TILE_17 0x3A\n#define _TILE_18 0x25\n\n// OK\n#define _TILE_19 0\n\n// OK\n#define _TILE_20 28\n\n// OK\n#define _TILE_21 30\n\n// ok\n#define _TILE_22 0x2A\n\n// KO:\n#define _TILE_23 ('{')\n\n// KO: \n#define _TILE_24 ('}')\n\n#define _TILE_26 0x2D\n\n#endif // _C264_REDEFINED_CHARS_H\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/c64_conio_settings.h",
    "content": "\n/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include<conio.h>\n// #include <peekpoke.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"display_macros.h\"\n\n// #define _TILE_4 (0x76-0x20-13-7)\n\n#define _TILE_7 33\n#define _TILE_5 34\n#define _TILE_17 35\n\n#define _TILE_8 44\n#define _TILE_9 45\n#define _TILE_11 46\n#define _TILE_12 47\n\n#define _TILE_0 '\\''\n#define _TILE_1 (0x70-0x20-12-7)\n// #define _TILE_2 (0x74-0x20-13-7)\n#define _TILE_3 (0x72-0x20-13-7)\n\t\n\n#define _TILE_16 ('^'-0x40)\n#define _TILE_25 '$'\n#define _TILE_14 ('>'-3)\n#define _TILE_15 ('<'-2)\n#define _TILE_10 (0x73 - 0x20-13-7)\n\n#define _TILE_6 (('^'-0x40)+1)\n\n#define _TILE_13 (0xC3-128-7)\n\n// #define _TILE_18 (0x75-0x20-13-7)\n\n#define _TILE_19 42\n#define _TILE_20 43\n#define _TILE_21 37\n#define _TILE_22 38\n#define _TILE_23 40\n#define _TILE_24 41\n\n#define _TILE_26 0\n\n#define _TILE_2 ('Z'+1)\n#define _TILE_4 ('Z'+2)\n#define _TILE_18 ('Z'+3)\n"
  },
  {
    "path": "src/cross_lib/display/tiles/c64_memory_mapped_settings.h",
    "content": "\n/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include<conio.h>\n// #include <peekpoke.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"display_macros.h\"\n\n#define _TILE_4 (0x76-0x20-13-7)\n\n#define _TILE_7 33\n#define _TILE_5 34\n#define _TILE_17 35\n\n#define _TILE_8 44\n#define _TILE_9 45\n#define _TILE_11 46\n#define _TILE_12 47\n\n#define _TILE_0 '\\''\n#define _TILE_1 (0x70-0x20-12-7)\n#define _TILE_2 (0x74-0x20-13-7)\n#define _TILE_3 (0x72-0x20-13-7)\n\t\n\n#define _TILE_16 ('^'-0x40)\n#define _TILE_25 '$'\n#define _TILE_14 ('>'-3)\n#define _TILE_15 ('<'-2)\n#define _TILE_10 (0x73 - 0x20-13-7)\n\n#define _TILE_6 (('^'-0x40)+1)\n\n#define _TILE_13 (0xC3-128-7)\n\n#define _TILE_18 (0x75-0x20-13-7)\n\n#define _TILE_19 42\n#define _TILE_20 43\n#define _TILE_21 37\n#define _TILE_22 38\n#define _TILE_23 40\n#define _TILE_24 41\n\n#define _TILE_26 0\n"
  },
  {
    "path": "src/cross_lib/display/tiles/cidelsa_no_gfx.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _DEFAULT_GRAPHICS_SETTINGS\r\n#define _DEFAULT_GRAPHICS_SETTINGS\r\n\r\n#if !defined(_DEFAULT_ASCII)\r\n    #include \"tiles/ASCII/char_tiles.h\"\r\n#endif\r\n// #else\r\n\r\n    #if !defined(_TILE_19)\r\n        #define _TILE_19 'T'\r\n    #endif \r\n\r\n    #if !defined(_TILE_20)\r\n        #define _TILE_20 'W'\r\n    #endif \r\n\r\n    #if !defined(_TILE_21)\r\n        #define _TILE_21 'H'\r\n    #endif \r\n\r\n    #if !defined(_TILE_22)\r\n        #define _TILE_22 'E'\r\n    #endif \r\n\r\n    #if !defined(_TILE_23)\r\n        #define _TILE_23 'L'\r\n    #endif \r\n\r\n    #if !defined(_TILE_24)\r\n        #define _TILE_24 'D'\r\n    #endif \r\n\r\n\r\n    #if !defined(_TILE_1)\r\n        #define _TILE_1 'H'\r\n    #endif \r\n\r\n    #if !defined(_TILE_3)\r\n        #define _TILE_3 'H'\r\n    #endif\r\n\r\n    #if !defined(_TILE_2)\r\n        #define _TILE_2 'H'\r\n    #endif\r\n\r\n    #if !defined(_TILE_0)\r\n            #define _TILE_0 'H'\r\n    #endif\r\n    // RED\r\n\r\n    #if !defined(_TILE_5)\r\n        #define _TILE_5 'X'\r\n    #endif\r\n\r\n    // WHITE\r\n    #if !defined(_TILE_4)\r\n        #define _TILE_4 'O'\r\n    #endif\r\n\r\n    #if !defined(_TILE_6)\r\n        #define _TILE_6 'Z'\r\n    #endif\r\n\r\n    // BLUE\r\n    #if !defined(_TILE_9)\r\n        #define _TILE_9 'G'\r\n    #endif\r\n\r\n    // YELLOW\r\n    #if !defined(_TILE_7)\r\n        #define _TILE_7 'A'\r\n    #endif\r\n\r\n    #if !defined(_TILE_25)\r\n        #define _TILE_25 'M'\r\n    #endif\r\n\r\n    #if !defined(_TILE_26)\r\n        #define _TILE_26 'M'\r\n    #endif\r\n\r\n    // GREEN\r\n    #if !defined(_TILE_8)\r\n        #define _TILE_8  'S'\r\n    #endif\r\n\r\n    #if !defined(_TILE_17)\r\n        #define _TILE_17 'F'\r\n    #endif\r\n\r\n    #if !defined(_TILE_18)\r\n        #define _TILE_18 'H'\r\n    #endif\r\n\r\n    // CYAN\r\n    #if !defined(_TILE_10)\r\n        #define _TILE_10 'V'\r\n    #endif\r\n\r\n\r\n    #if !defined(_TILE_11)\r\n        #define _TILE_11 'O'\r\n    #endif\r\n\r\n    #if !defined(_TILE_14)\r\n        #define _TILE_14 'D'\r\n    #endif\r\n\r\n    #if !defined(_TILE_15)\r\n        #define _TILE_15 'C'\r\n    #endif\r\n\r\n    #if !defined(_TILE_16)\r\n        #define _TILE_16 'I'\r\n\r\n    #endif\r\n\r\n    #if !defined(_TILE_12)\r\n        #define _TILE_12 'I' \r\n    #endif\r\n\r\n    #if !defined(_TILE_13)\r\n        #define _TILE_13 'I'\r\n\r\n    #endif\r\n\r\n// #endif\r\n\r\n#endif // _DEFAULT_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/cmoc_memory_mapped_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n#ifndef _CMOC_GRAPHICS_SETTINGS\n#define _CMOC_GRAPHICS_SETTINGS\n\n#include \"cross_lib.h\"\n\n#if !defined(_DEFAULT_ASCII)\n    #include \"tiles/ASCII/char_tiles.h\"\n#endif\n\n\n\n#if !defined(_TILE_19)\n    #if !defined(__CIDELSA__)\n        #define _TILE_19 '*'\n    #else\n        #define _TILE_19 'H'\n    #endif\n#endif \n\n#if !defined(_TILE_20)\n    #if !defined(__CIDELSA__)\n        #define _TILE_20 '*'\n    #else\n        #define _TILE_20 'H'\n    #endif\n#endif \n\n#if !defined(_TILE_21)\n    #if !defined(__CIDELSA__)\n        #define _TILE_21 '*'\n    #else\n        #define _TILE_21 'H'\n    #endif\n#endif \n\n#if !defined(_TILE_22)\n    #if !defined(__CIDELSA__)\n        #define _TILE_22 '*'\n    #else\n        #define _TILE_22 'H'\n    #endif\n#endif \n\n#if !defined(_TILE_23)\n    #if !defined(__CIDELSA__)\n        #define _TILE_23 '*'\n    #else\n        #define _TILE_23 'H'\n    #endif\n#endif \n\n#if !defined(_TILE_24)\n    #if !defined(__CIDELSA__)\n        #define _TILE_24 '*'\n    #else\n        #define _TILE_24 'H'\n    #endif\n#endif \n\n// BLUE\n#if !defined(_TILE_0)\n#define _TILE_0 ('*'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_1)\n#define _TILE_1 ('*'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_2)\n#define _TILE_2 ('*'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_3)\n#define _TILE_3 ('*'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_9)\n    #define _TILE_9 '!'\n#endif \n\n#if !defined(_TILE_7)\n    #define _TILE_7 ('+'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_25)\n    #define _TILE_25 '$'\n#endif\n\n#if !defined(_TILE_8)\n    #define _TILE_8  ('S'+INVERTED)\n#endif\n\n#if !defined(_TILE_17)\n    #define _TILE_17 ('F'+INVERTED)\n#endif \n\n#if !defined(_TILE_18)\n    #define _TILE_18 ('H'+INVERTED)\n#endif\n\n#if !defined(_TILE_5)\n    #define _TILE_5 ('X'+INVERTED)\n#endif \n\n#if !defined(_TILE_6)\n    #define _TILE_6 '#'\n#endif\n\n#if !defined(_TILE_10)\n    #define _TILE_10 'I'\n#endif\n\n#if !defined(_TILE_11)\n    #define _TILE_11 ('.'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_4)\n    #define _TILE_4 'O'\n#endif\n\n#if !defined(_TILE_14)\n    #define _TILE_14 ('>'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_15)\n    #define _TILE_15 ('<'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_16)\n    #define _TILE_16 ('#'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_18)\n    #define _TILE_18 ('H'+INVERTED)\n#endif \n\n#if !defined(_TILE_12)\n    #define _TILE_12 ('#'+NOT_INVERTED)\n#endif\n\n#if !defined(_TILE_13)\n    #define _TILE_13 ('-'+NOT_INVERTED)\n#endif\n\n\n#if !defined(_TILE_26)\n    #define _TILE_26 ('-'+NOT_INVERTED)\n#endif\n\n#endif // _CMOC_GRAPHICS_SETTINGS\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/comx_color_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _COMX_COLOR_GRAPHICS_GRAPHICS_SETTINGS\r\n#define _COMX_COLOR_GRAPHICS_GRAPHICS_SETTINGS\r\n\r\n#define _TILE_0 0\r\n\r\n#define _TILE_1 3\r\n\r\n#define _TILE_2 6\r\n\r\n#define _TILE_3 9\r\n\r\n#define _TILE_4 12\r\n\r\n#define _TILE_5 15\r\n\r\n#define _TILE_6 18\r\n\r\n#define _TILE_7 21\r\n\r\n#define _TILE_8 24\r\n\r\n#define _TILE_9 27\r\n\r\n#define _TILE_10 33\r\n\r\n#define _TILE_11 39\r\n\r\n#define _TILE_12 42\r\n\r\n#define _TILE_13 58\r\n\r\n#define _TILE_14 91\r\n\r\n#define _TILE_15 94\r\n\r\n#define _TILE_16 97\r\n\r\n#define _TILE_17 100\r\n\r\n#define _TILE_18 103\r\n\r\n#define _TILE_19 106\r\n\r\n#define _TILE_20 109\r\n\r\n#define _TILE_21 112\r\n\r\n#define _TILE_22 115\r\n\r\n#define _TILE_23 118\r\n\r\n#define _TILE_24 121\r\n\r\n#define _TILE_25 36\r\n\r\n#define _TILE_26 124\r\n\r\n#endif // _COMX_COLOR_GRAPHICS_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/comx_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _COMX_GRAPHICS_SETTINGS\r\n#define _COMX_GRAPHICS_SETTINGS\r\n\r\n#define PALETTE_SWITCH 128\r\n\r\n\r\n#define _TILE_0 ('k')\r\n\r\n#define _TILE_1 ('l')\r\n\r\n#define _TILE_2 ('m')\r\n\r\n#define _TILE_3 ('n')\r\n\r\n\r\n\r\n// RED\r\n#define _TILE_5 ('o'+PALETTE_SWITCH)\r\n\r\n// WHITE\r\n#define _TILE_4 ('p'+PALETTE_SWITCH)\r\n\r\n#define _TILE_6 ('u'+PALETTE_SWITCH)\r\n\r\n\r\n// BLUE\r\n#define _TILE_9 ('s')\r\n//('s'+PALETTE_SWITCH)\r\n\r\n\r\n// YELLOW\r\n#define _TILE_7 ('q'+PALETTE_SWITCH)\r\n\r\n#define _TILE_25 '$'\r\n\r\n#define _TILE_26 ('a'-2)\r\n\r\n// GREEN\r\n#define _TILE_8 'r'\r\n\r\n#define _TILE_17 ('z'+1)\r\n\r\n#define _TILE_18 ('z'+2+PALETTE_SWITCH)\r\n\r\n// CYAN\r\n#define _TILE_10 'j'\r\n#define _TILE_11 ('t'+PALETTE_SWITCH)\r\n\r\n#define _TILE_14 ('w'+PALETTE_SWITCH)\r\n\r\n#define _TILE_15 ('x'+PALETTE_SWITCH)\r\n\r\n#define _TILE_16 ('v'+PALETTE_SWITCH)\r\n\r\n#define _TILE_12 ('y'+PALETTE_SWITCH)\r\n \r\n\r\n#define _TILE_13 ('z'+PALETTE_SWITCH)\r\n\r\n\r\n#if !defined(__COMX__)\r\n#define _TILE_19 ('a')\r\n#define _TILE_20 ('b')\r\n#define _TILE_21 ('c')\r\n#define _TILE_22 ('d')\r\n#define _TILE_23 ('e')\r\n#define _TILE_24 ('f')\r\n#else\r\n#define _TILE_19 ('/')\r\n#define _TILE_20 ('=')\r\n#define _TILE_21 (';')\r\n#define _TILE_22 ('+')\r\n#define _TILE_23 ('*')\r\n#define _TILE_24 ('!')\r\n#endif\r\n\r\n#endif // _COMX_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/cpc_cpcrslib_settings.h",
    "content": "#ifndef _CPC___CPCRSLIB_GRAPHICS_SETTINGS\n#define _CPC___CPCRSLIB_GRAPHICS_SETTINGS\n\n// Offsets in the \"meta-string\" \n#define _TILE_4 1*2\n#define _TILE_5 2*2\n#define _TILE_7 3*2\n#define _TILE_11 4*2\n#define _TILE_8 5*2\n#define _TILE_9 6*2\n#define _TILE_25 7*2\n#define _TILE_10 8*2\n\n#define _TILE_14 10*2\n#define _TILE_15 11*2\n#define _TILE_16 12*2\n#define _TILE_0 13*2\n#define _TILE_1 14*2\n#define _TILE_2 15*2\n#define _TILE_3 16*2\n#define _TILE_12 17*2\n#define _TILE_13 18*2\n\n#define _TILE_6 9*2\n\n#define _TILE_17 19*2\n#define _TILE_18 20*2\n\n\n#define _TILE_19 21*2\n#define _TILE_20 22*2\n#define _TILE_21 23*2\n#define _TILE_22 24*2\n#define _TILE_23 25*2\n#define _TILE_24 26*2\n\n#define _TILE_26 27*2\n\n\n#endif // _CPC___CPCRSLIB_GRAPHICS_SETTINGS\n\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/creativision_settings.h",
    "content": "\r\n#ifndef _CREATIVISION_COLOR_REDEFINED_CHARS_SETTINGS\r\n#define _CREATIVISION_COLOR_REDEFINED_CHARS_SETTINGS\r\n\r\n// Still available:\r\n// 0x80-.... ?\r\n\r\n// BLUE\r\n#define _TILE_0 0x3B\r\n#define _TILE_1 0x3C\r\n#define _TILE_2 0x3D \r\n#define _TILE_3 0x3E\r\n\r\n#define _TILE_9 0x3F\r\n\r\n// YELLOW\r\n#define _TILE_7 0x27\r\n#define _TILE_12 0x26\r\n#define _TILE_13 0x22\r\n#define _TILE_25 0x24\r\n\r\n\r\n\r\n// GREEN\r\n#define _TILE_8  0x2C\r\n\r\n// RED\r\n#define _TILE_5 0x5E\r\n#define _TILE_6 0x5B\r\n\r\n// CYAN\r\n#define _TILE_10 0x08\r\n#define _TILE_11 0x09\r\n\r\n#define _TILE_17 0x0A\r\n#define _TILE_18 0x5C\r\n\r\n// WHITE\r\n#define _TILE_4 0x7E\r\n\r\n#define _TILE_14 ((uint8_t)0x7B)\r\n#define _TILE_15 ((uint8_t)0x7D)\r\n#define _TILE_16 ((uint8_t)0x60)\r\n\r\n#define _TILE_19 0x41\r\n#define _TILE_20 0x42\r\n#define _TILE_21 0x43\r\n#define _TILE_22 0x44\r\n#define _TILE_23 0x45\r\n#define _TILE_24 0x46\r\n\r\n// TODO: Check this\r\n#define _TILE_26 0x47\r\n\r\n#endif // _CREATIVISION_COLOR_REDEFINED_CHARS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/cx16_settings.h",
    "content": "#define _TILE_0 (33)\r\n\r\n#define _TILE_1 (34)\r\n\r\n#define _TILE_2 (35)\r\n\r\n#define _TILE_3 (36)\r\n\r\n#define _TILE_4 (37)\r\n\r\n#define _TILE_5 (38)\r\n\r\n#define _TILE_6 (39)\r\n\r\n#define _TILE_7 (40)\r\n\r\n#define _TILE_8 (41)\r\n\r\n#define _TILE_9 (42)\r\n\r\n#define _TILE_10 (43)\r\n\r\n#define _TILE_11 (44)\r\n\r\n#define _TILE_12 (45)\r\n\r\n#define _TILE_13 (46)\r\n\r\n#define _TILE_14 (47)\r\n\r\n#define _TILE_15 (58)\r\n\r\n#define _TILE_16 (59)\r\n\r\n#define _TILE_17 (60)\r\n\r\n#define _TILE_18 (61)\r\n\r\n#define _TILE_19 (62)\r\n\r\n#define _TILE_20 (63)\r\n\r\n#define _TILE_21 (64)\r\n\r\n#define _TILE_22 (65)\r\n\r\n#define _TILE_23 (66)\r\n\r\n#define _TILE_24 (67)\r\n\r\n#define _TILE_25 (68)\r\n\r\n#define _TILE_26 (69)\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/default_image_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _DEFAULT_GRAPHICS_SETTINGS\n#define _DEFAULT_GRAPHICS_SETTINGS\n\n#if !defined(_DEFAULT_ASCII)\n    #include \"tiles/ASCII/char_tiles.h\"\n#endif\n\n\n#if !defined(_TILE_19)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_19 '*'\n\t#else\n\t\t#define _TILE_19 'H'\n\t#endif\n#endif \n\n#if !defined(_TILE_20)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_20 '*'\n\t#else\n\t\t#define _TILE_20 'H'\n\t#endif\n#endif \n\n#if !defined(_TILE_21)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_21 '*'\n\t#else\n\t\t#define _TILE_21 'H'\n\t#endif\n#endif \n\n#if !defined(_TILE_22)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_22 '*'\n\t#else\n\t\t#define _TILE_22 'H'\n\t#endif\n#endif \n\n#if !defined(_TILE_23)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_23 '*'\n\t#else\n\t\t#define _TILE_23 'H'\n\t#endif\n#endif \n\n#if !defined(_TILE_24)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_24 'W'\n\t#else\n\t\t#define _TILE_24 'W'\n\t#endif\n#endif \n\n#if !defined(_TILE_1)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_1 '*'\n\t#else\n\t\t#define _TILE_1 'H'\n\t#endif\n#endif \n\n#if !defined(_TILE_3)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_3 '*'\n\t#else\n\t\t#define _TILE_3 'H'\n\t#endif\n#endif\n\n#if !defined(_TILE_2)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_2 '*'\n\t#else\n\t\t#define _TILE_2 'H'\n\t#endif\n#endif\n\n#if !defined(_TILE_0)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_0 '*'\n\t#else\n\t\t#define _TILE_0 'H'\n\t#endif\n#endif\n// RED\n\n#if !defined(_TILE_5)\n\t#if defined(__ZX81__) || defined(__ZX80__)\n\t\t#define _TILE_5 'x'\n\t#else\n\t\t#define _TILE_5 'X'\n\t#endif\n#endif\n\n// WHITE\n#if !defined(_TILE_4)\n\t#if defined(__LCC1802__) || defined(__SV8000__) || defined(__CIDELSA__) || defined(__MC10__) \n\t\t#define _TILE_4 'O'\n\t#elif defined(__CREATIVISION__)\n\t\t#define _TILE_4 'Q'\n\t#else\n\t\t#define _TILE_4 'o'\n\t#endif\n#endif\n\n#if !defined(_TILE_6)\n\t#if defined(__ALPHATRO__)\n\t\t#define _TILE_6 'm'\n\t#elif defined(__CIDELSA__) || defined(__CREATIVISION__)\n\t\t#define _TILE_6 'M'\n\t#else\n\t\t#define _TILE_6 '#'\n\t#endif\n#endif\n\n// BLUE\n#if !defined(_TILE_9)\n\t#if defined(__ZX80__) || defined(__CIDELSA__) || defined(__CREATIVISION__)\n\t\t#define _TILE_9 'G'\n\t#else\n\t\t#define _TILE_9 '!'\n\t#endif\n#endif\n\n// YELLOW\n#if !defined(_TILE_7)\n\t#if !defined(__CIDELSA__) && !defined(__CREATIVISION__)\n\t\t#define _TILE_7 '+'\n\t#elif defined(__ZX81__) || defined(__ZX80__)\n\t\t#define _TILE_7 'a'\n\t#else\n\t\t#define _TILE_7 'A'\n\t#endif\n#endif\n\n\n#if !defined(_TILE_25)\n\t#if !defined(__CREATIVISION__)\n\t\t#define _TILE_25 '$'\n\t#else\n\t\t#define _TILE_25 'M'\n\t#endif\n#endif\n\n// GREEN\n#if !defined(_TILE_8)\n\t#if defined(__ZX81__) || defined(__ZX80__)\n\t\t#define _TILE_8 's'\n\t#else\n\t\t#define _TILE_8  'S'\n\t#endif\n#endif\n\n#if !defined(_TILE_17)\n\t#if defined(__ZX81__) || defined(__ZX80__)\n\t\t#define _TILE_17 'f'\n\t#else\n\t\t#define _TILE_17 'F'\n\t#endif\n#endif\n\n#if !defined(_TILE_18)\n\t#if defined(__ZX81__) || defined(__ZX80__)\n\t\t#define _TILE_18 'h'\n\t#else\n\t\t#define _TILE_18 'H'\n\t#endif\n#endif\n\n// CYAN\n#if !defined(_TILE_10)\n\t#if defined(__ZX81__) || defined(__ZX80__)\n\t\t#define _TILE_10 'v'\n\t#else\n\t\t#define _TILE_10 'V'\n\t#endif\n#endif\n\n#if !defined(_TILE_11)\n\t#if defined(__CIDELSA__) || defined(__CREATIVISION__)\n\t\t#define _TILE_11 'O'\n\t#else\n\t\t#define _TILE_11 '.'\n\t#endif\n#endif\n\n#if !defined(_TILE_14) \n\t#if !defined(__CREATIVISION__)\n\t\t#define _TILE_14 '>'\n\t#else\n\t\t#define _TILE_14 'N'\n\t#endif\n#endif\n\n#if !defined(_TILE_15)\n\t#if !defined(__CREATIVISION__)\n\t\t#define _TILE_15 '<'\n\t#else\n\t\t#define _TILE_15 'N'\n\t#endif\n#endif\n\n#if !defined(_TILE_16)\n\t#if defined(__ZX80__) || defined(__ZX81__) \n\t\t#define _TILE_16 'i'\n\t#elif defined(__CIDELSA__) || defined(__CREATIVISION__) || defined(__MC10__)\n\t\t#define _TILE_16 'I'\n\t#else\n\t\t#define _TILE_16 ('^')\n\t#endif\n#endif\n\n#if !defined(_TILE_12)\n\t#if defined(__C128_Z80__) || defined(__GAL__)  || defined(__VZ__) || defined(__COCO__) || defined(__DRAGON__) \n\t\t#define _TILE_12 'i'\n\t#elif defined(__APPLE2__) || defined(__ATARI_LYNX__) || defined(__ABC80__) || defined(__OSIC1P__) || defined(__TMC600__) \\\n\t|| defined(__MIKRO80__) || defined(__BIC__) || defined(__SUPER80__) || defined(__CIDELSA__) || defined(__CREATIVISION__) \\\n\t|| defined(__ZX80__) || defined(__ZX81__) || defined(__MC10__)\n\t\t#define _TILE_12 'I' \n\t#else\n\t\t#define _TILE_12 ('|')\n\t#endif \n#endif\n\n#if !defined(_TILE_13)\n\t#if defined(__CIDELSA__)\n\t\t#define _TILE_13 'I'\n\t#elif defined(__CREATIVISION__)\n\t\t#define _TILE_13 'N'\n\t#else\n\t\t#define _TILE_13 '-'\n\t#endif\n#endif\n\n#if !defined(_TILE_26)\n\t#if defined(__C128_Z80__) || defined(__GAL__)  || defined(__VZ__) || defined(__COCO__) || defined(__DRAGON__) \n\t\t#define _TILE_26 't'\n\t#else\n\t\t#define _TILE_26 'T'\n\t#endif\n#endif\n\n#endif // _DEFAULT_GRAPHICS_SETTINGS\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/default_quad_graphics_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _DEFAULT_QUAD_GRAPHICS_SETTINGS\r\n#define _DEFAULT_QUAD_GRAPHICS_SETTINGS\r\n\r\n#if !defined(_DEFAULT_QUAD_ASCII)\r\n    #include \"tiles/ASCII/quad_char_tiles.h\"\r\n#endif\r\n\r\n\r\n\r\n#endif // _DEFAULT_QUAD_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/micro_color_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _MICRO_COLOR_GRAPHICS_SETTINGS\r\n#define _MICRO_COLOR_GRAPHICS_SETTINGS\r\n\r\n#define PALETTE_SWITCH 0\r\n\r\n\r\n#define _TILE_0 0\r\n\r\n#define _TILE_1 27\r\n\r\n#define _TILE_3 29\r\n\r\n#define _TILE_2 28\r\n\r\n\r\n\r\n// RED\r\n#define _TILE_5 (31)\r\n\r\n// WHITE\r\n#define _TILE_4 (30)\r\n//('p')\r\n\r\n#define _TILE_6 (33)\r\n\r\n\r\n// BLUE\r\n#define _TILE_9 46\r\n\r\n\r\n// YELLOW\r\n#define _TILE_7 (34)\r\n\r\n\r\n#define _TILE_25 ('$')\r\n\r\n// GREEN\r\n#define _TILE_8 35\r\n\r\n#define _TILE_17 44\r\n\r\n#define _TILE_18 (45)\r\n\r\n// CYAN\r\n#define _TILE_10 37\r\n#define _TILE_11 (38)\r\n\r\n#define _TILE_14 (41)\r\n\r\n#define _TILE_15 (42)\r\n\r\n#define _TILE_16 (43)\r\n\r\n#define _TILE_12 (39)\r\n \r\n\r\n#define _TILE_13 (40)\r\n\r\n#define _TILE_19 (47)\r\n#define _TILE_20 (58)\r\n\r\n#define _TILE_21 (59)\r\n\r\n#define _TILE_22 (60)\r\n\r\n#define _TILE_23 (61)\r\n#define _TILE_24 (62)\r\n#define _TILE_26 (63)\r\n\r\n#endif // _MICRO_COLOR_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/micro_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _MICRO_GRAPHICS_SETTINGS\r\n#define _MICRO_GRAPHICS_SETTINGS\r\n\r\n#define PALETTE_SWITCH 128\r\n\r\n\r\n#define _TILE_0 0\r\n\r\n#define _TILE_1 27\r\n\r\n#define _TILE_3 29\r\n\r\n#define _TILE_2 28\r\n\r\n\r\n\r\n// RED\r\n#define _TILE_5 (31+PALETTE_SWITCH)\r\n\r\n// WHITE\r\n#define _TILE_4 (30+PALETTE_SWITCH)\r\n//('p'+PALETTE_SWITCH)\r\n\r\n#define _TILE_6 (33+PALETTE_SWITCH)\r\n\r\n\r\n// BLUE\r\n#define _TILE_9 46\r\n\r\n\r\n// YELLOW\r\n#define _TILE_7 (34+PALETTE_SWITCH)\r\n\r\n\r\n#define _TILE_25 ('$'+PALETTE_SWITCH)\r\n\r\n// GREEN\r\n#define _TILE_8 35\r\n\r\n#define _TILE_17 44\r\n\r\n#define _TILE_18 (45+PALETTE_SWITCH)\r\n\r\n// CYAN\r\n#define _TILE_10 37\r\n#define _TILE_11 (38+PALETTE_SWITCH)\r\n\r\n#define _TILE_14 (41+PALETTE_SWITCH)\r\n\r\n#define _TILE_15 (42+PALETTE_SWITCH)\r\n\r\n#define _TILE_16 (43+PALETTE_SWITCH)\r\n\r\n#define _TILE_12 (39+PALETTE_SWITCH)\r\n \r\n\r\n#define _TILE_13 (40+PALETTE_SWITCH)\r\n\r\n#define _TILE_19 (47)\r\n#define _TILE_20 (58)\r\n\r\n#define _TILE_21 (59)\r\n\r\n#define _TILE_22 (60)\r\n\r\n#define _TILE_23 (61)\r\n#define _TILE_24 (62)\r\n\r\n#define _TILE_26 (63)\r\n\r\n#endif // _MICRO_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/msx_redefined_chars_settings.h",
    "content": "\n#ifndef _MSX_REDEFINED_CHARS_SETTINGS\n#define _MSX_REDEFINED_CHARS_SETTINGS\n\n// Still available:\n// 0x80-.... ?\n#if !defined(__ALTERNATIVE_COLOR)\n\n    // CYAN\n\n    #define _TILE_0 0x3B\n    #define _TILE_1 0x3C\n    #define _TILE_2 0x3D \n    #define _TILE_3 0x3E\n    #define _TILE_9 0x3F\n    #define _TILE_11 0x09\n    #define _TILE_17 0x3A\n    \n    // YELLOW\n    #define _TILE_7 0x27\n    #define _TILE_12 0x26\n    #define _TILE_13 0x22\n    #define _TILE_25 0x24\n    #define _TILE_10 0x23\n\n    // GREEN\n    #define _TILE_8  0x2C\n\n    // WHITE\n    #define _TILE_4 0x7E\n\n    #define _TILE_14 ((uint8_t)0x7B)\n    #define _TILE_15 ((uint8_t)0x7D)\n    #define _TILE_16 ((uint8_t)0x60)\n\n    #define _TILE_19 0x80\n    #define _TILE_20 0x81\n    #define _TILE_21 0x82\n    #define _TILE_22 0x83\n    #define _TILE_23 0x84\n    #define _TILE_24 0x85\n\n\n    // RED\n    #define _TILE_5 0xEE\n    #define _TILE_6 0xEB\n    #define _TILE_18 0xEC\n\n\t// TODO: Check this\n    #define _TILE_26 0x86\n\n\n#else\n    // CYAN\n    #define _TILE_2 0xEB\n    #define _TILE_3 0xEC\n    #define _TILE_11 0xED \n    #define _TILE_15 0xEE\n    #define _TILE_17 0xEF\n    #define _TILE_18 0xEA\n    #define _TILE_14 0xF0\n    #define _TILE_16 0xF1\n    // YELLOW\n    #define _TILE_7 0x27\n    #define _TILE_12 0x26\n    #define _TILE_13 0x22\n    #define _TILE_10 0x23\n\n    // GREEN\n    #define _TILE_0  0x2C\n    #define _TILE_1  0x2D\n    #define _TILE_4  0x2E\n    #define _TILE_9  0x2F\n\n    // RED\n    #define _TILE_5 0x86\n    #define _TILE_6 0x87\n\n    // WHITE\n    #define _TILE_8 0xA9\n\n    #define _TILE_19 0x80\n    #define _TILE_20 0x81\n    #define _TILE_21 0x82\n    #define _TILE_22 0x83\n    #define _TILE_23 0x84\n    #define _TILE_24 0x85\n\t\n\t// TODO: check this\n\t#define _TILE_26 0xB0\n\n#endif\n\n#endif // _MSX_REDEFINED_CHARS_SETTINGS\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/nes_conio_settings.h",
    "content": "\r\n/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include<conio.h>\r\n#include <peekpoke.h>\r\n\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <unistd.h>\r\n\r\n#include \"display_macros.h\"\r\n\r\n\r\n// #define _TILE_3 10\r\n// #define _TILE_4 13\r\n#define _TILE_3 43\r\n#define _TILE_4 153\r\n\r\n#define _TILE_8 25\r\n#define _TILE_5 16\r\n#define _TILE_9 28\r\n\r\n#define _TILE_0 1\r\n#define _TILE_1 4\r\n#define _TILE_2 7\r\n\t\r\n\r\n#define _TILE_11 37\r\n#define _TILE_16 94\r\n#define _TILE_25 147\r\n#define _TILE_14 61\r\n#define _TILE_15 91\r\n#define _TILE_10 33\r\n\r\n#define _TILE_7 22\r\n\r\n#define _TILE_6 19\r\n\r\n\r\n#define _TILE_18 126\r\n#define _TILE_17 123\r\n\r\n#define _TILE_12 40\r\n#define _TILE_13 58\r\n\r\n#define _TILE_19 129\r\n#define _TILE_20 132\r\n\r\n#define _TILE_21 135\r\n#define _TILE_22 138\r\n\r\n#define _TILE_23 141\r\n#define _TILE_24 144\r\n\r\n#define _TILE_26 150 "
  },
  {
    "path": "src/cross_lib/display/tiles/nes_settings.h",
    "content": "\n/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include<conio.h>\n#include <peekpoke.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"display_macros.h\"\n\n#define _TILE_8 248\n#define _TILE_4 35\n#define _TILE_5 251\n#define _TILE_9 246\n\n#define _TILE_0 252\n#define _TILE_1 255\n#define _TILE_2 254\n#define _TILE_3 253\n\t\n\n#define _TILE_11 242\n#define _TILE_16 239\n#define _TILE_25 '$'\n#define _TILE_14 241\n#define _TILE_15 240\n#define _TILE_10 238\n\n#define _TILE_7 250\n\n#define _TILE_6 247\n#define _TILE_0_B _TILE_0\n#define _TILE_7_B _TILE_7\n\n#define _TILE_18 245\n#define _TILE_17 243\n\n#define _TILE_12 249\n#define _TILE_13 244\n\n#define _TILE_4_B _TILE_4\n\n#define _TILE_5_B 'X'\n\n#define _TILE_19 1\n#define _TILE_20 2\n\n#define _TILE_21 3\n#define _TILE_22 4\n\n#define _TILE_23 5\n#define _TILE_24 6\n"
  },
  {
    "path": "src/cross_lib/display/tiles/pce_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _PCE_GRAPHICS_SETTINGS\r\n#define _PCE_GRAPHICS_SETTINGS\r\n\r\n\r\n\r\n#define _TILE_0 3\r\n#define _TILE_1 4\r\n\r\n#define _TILE_2 5\r\n#define _TILE_3 6\r\n\r\n// RED\r\n#define _TILE_5 7\r\n\r\n// WHITE\r\n#define _TILE_4 9\r\n\r\n\r\n\r\n#define _TILE_6 21\r\n\r\n\r\n// CYAN\r\n#define _TILE_9 14\r\n\r\n\r\n// YELLOW\r\n\r\n#define _TILE_7 8\r\n\r\n#define _TILE_25 28\r\n\r\n// GREEN\r\n#define _TILE_8  11\r\n\r\n#define _TILE_17 12\r\n\r\n// 13\r\n#define _TILE_18 15\r\n\r\n// CYAN\r\n#define _TILE_10 17\r\n\r\n#define _TILE_11 16\r\n\r\n#define _TILE_14 19\r\n\r\n#define _TILE_15 20\r\n\r\n#define _TILE_16 18\r\n\r\n#define _TILE_12 2\r\n\r\n#define _TILE_13 1\r\n\r\n#define _TILE_19 22\r\n#define _TILE_20 23\r\n#define _TILE_21 24\r\n#define _TILE_22 25\r\n#define _TILE_23 26\r\n#define _TILE_24 27\r\n\r\n#define _TILE_26 0\r\n\r\n#endif // _PCE_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/petscii_memory_mapped_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _PETSCII_MEMORY_MAPPED_SETTINGS\n#define _PETSCII_MEMORY_MAPPED_SETTINGS\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <conio.h>\n#include <peekpoke.h>\n#include <string.h>\n\n#define _TILE_0 (0xB2-0x40)\n//0x3B\n#define _TILE_1  (0xB1-0x40)\n//0x3C\n#define _TILE_2 (0xAB-0x40)\n//0x3D \n#define _TILE_3  (0xB3-0x40)\n//0x3E\n\n#define _TILE_5 '^'\n\n#define _TILE_4 'o'\n\n#define _TILE_6 '#'\n\n#define _TILE_9 '!'\n\n#define _TILE_7 '+'\n\n#define _TILE_25 '$'\n\n#define _TILE_8  'S'\n#define _TILE_17 'F'\n#define _TILE_18 'H'\n\n#define _TILE_10 'V'\n#define _TILE_11 '.'\n\n#define _TILE_14 '>'\n\n#define _TILE_15 '<'\n\n#define _TILE_16 ('^'-64)\n\n#define _TILE_12 ('|'-128)\n#define _TILE_13 '-'\n\n\n\n#endif // _PETSCII_MEMORY_MAPPED_SETTINGS\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/pv1000_settings.h",
    "content": "\r\n\r\n#ifndef __PV1000_SETTINGS_H\r\n#define __PV1000_SETTINGS_H\r\n\r\n#define _TILE_0   33\r\n#define _TILE_1   38\r\n#define _TILE_2   43\r\n#define _TILE_3   58\r\n#define _TILE_4   91\r\n#define _TILE_5   96\r\n#define _TILE_6  101\r\n#define _TILE_7  106\r\n#define _TILE_8  111\r\n#define _TILE_9  116\r\n#define _TILE_10 121\r\n#define _TILE_11 126\r\n#define _TILE_12 131\r\n#define _TILE_13 136\r\n#define _TILE_14 141\r\n#define _TILE_15 146\r\n#define _TILE_16 151\r\n#define _TILE_17 156\r\n#define _TILE_18 161\r\n#define _TILE_19 166\r\n#define _TILE_20 171\r\n#define _TILE_21 176\r\n#define _TILE_22 181\r\n#define _TILE_23 186\r\n#define _TILE_24 191\r\n#define _TILE_25 196\r\n#define _TILE_26 201\r\n\r\n\r\n#endif // __PV1000_SETTINGS_H"
  },
  {
    "path": "src/cross_lib/display/tiles/supervision_settings.h",
    "content": "\r\n\r\n\r\n#define _TILE_4 (0x76-0x20-13-7)\r\n\r\n#define _TILE_0 '\\''\r\n#define _TILE_1 (0x76 - 6 - 0x20-12-7)\r\n#define _TILE_2 (0x76 - 2 - 0x20-13-7)\r\n#define _TILE_3 (0x76 - 4 -0x20-13-7)\r\n\r\n#define _TILE_8 44\r\n#define _TILE_9 45\r\n#define _TILE_11 46\r\n#define _TILE_12 47\r\n\r\n#define _TILE_16 ('^'-0x40)\r\n#define _TILE_25 '$'\r\n#define _TILE_14 ('>'-3)\r\n#define _TILE_15 ('<'-2)\r\n#define _TILE_10 (0x73 - 0x20-13-7)\r\n\r\n#define _TILE_7 33\r\n#define _TILE_5 34\r\n#define _TILE_17 35\r\n\r\n#define _TILE_6 (_TILE_16+1)\r\n\r\n#define _TILE_13 (0xC3-128-7)\r\n\r\n#define _TILE_18 (0x7A-0x20-13-7-5)\r\n\r\n#define _TILE_19 42\r\n#define _TILE_20 43\r\n#define _TILE_21 37\r\n#define _TILE_22 38\r\n#define _TILE_23 40\r\n#define _TILE_24 41\r\n\r\n#define _TILE_26 0"
  },
  {
    "path": "src/cross_lib/display/tiles/tgi_gfx_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _LYNX_TGI_GRAPHICS_SETTINGS\r\n#define _LYNX_TGI_GRAPHICS_SETTINGS\r\n\r\n\r\n#define _TILE_0 0\r\n#define _TILE_1 1\r\n\r\n#define _TILE_2 2\r\n#define _TILE_3 3\r\n\r\n#define _TILE_4 4\r\n\r\n#define _TILE_5 5\r\n\r\n#define _TILE_6 6\r\n\r\n#define _TILE_7 7\r\n#define _TILE_8 8\r\n\r\n#define _TILE_9 9\r\n#define _TILE_10 10\r\n\r\n#define _TILE_11 11\r\n\r\n#define _TILE_12 12\r\n\r\n#define _TILE_13 13\r\n\r\n#define _TILE_14 14\r\n\r\n#define _TILE_15 15\r\n#define _TILE_16 16\r\n\r\n#define _TILE_17 17\r\n\r\n#define _TILE_18 18\r\n\r\n#define _TILE_19 19\r\n\r\n#define _TILE_20 20\r\n#define _TILE_21 21\r\n\r\n#define _TILE_22 22\r\n#define _TILE_23 23\r\n\r\n#define _TILE_24 24\r\n\r\n#define _TILE_25 25\r\n\r\n#define _TILE_26 26\r\n\r\n#endif // _LYNX_TGI_GRAPHICS_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/udg_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _UDG_SETTINGS\n#define _UDG_SETTINGS\n\n#define _TILE_0  (0x2A - _Z88DK_SPRITE_OFFSET)\n#define _TILE_1  (0x3C - _Z88DK_SPRITE_OFFSET)\n#define _TILE_2  (0x3D - _Z88DK_SPRITE_OFFSET) \n#define _TILE_3  (0x3E - _Z88DK_SPRITE_OFFSET)\n\n\n#define _TILE_9  (0x3F-_Z88DK_SPRITE_OFFSET)\n\n// YELLOW\n#define _TILE_7  (0x27 - _Z88DK_SPRITE_OFFSET)\n#define _TILE_12 (0x26 -_Z88DK_SPRITE_OFFSET)\n#define _TILE_13 (0x2B -_Z88DK_SPRITE_OFFSET)\n#define _TILE_25 (0x24 - _Z88DK_SPRITE_OFFSET)\n\n// GREEN\n#define _TILE_8  (0x2C - _Z88DK_SPRITE_OFFSET)\n\n#define _TILE_17 (0x25 - _Z88DK_SPRITE_OFFSET)\n\n#define _TILE_18 (0x3B - _Z88DK_SPRITE_OFFSET)\n\n// RED\n#define _TILE_5  (0x29 - _Z88DK_SPRITE_OFFSET)\n\n// CYAN\n#define _TILE_10 (0x21 - _Z88DK_SPRITE_OFFSET)\n#define _TILE_11 (0x23 - _Z88DK_SPRITE_OFFSET)\n\n// WHITE\n#define _TILE_4  (0x28 - _Z88DK_SPRITE_OFFSET)\n\n#if defined(__MO5__)||defined(__TO7__)|| defined(__COCO3__) || defined(__COCO__)||defined(__DRAGON__)\n\t#define _TILE_6 (0x3A - _Z88DK_SPRITE_OFFSET)\n#else\n\t#define _TILE_6 (0x5B - _Z88DK_SPRITE_OFFSET)\n#endif\n\n#define _TILE_14 (0x22 - _Z88DK_SPRITE_OFFSET)\n\n#define _TILE_15 (0x2E - _Z88DK_SPRITE_OFFSET )\n\n#define _TILE_16 (0x2F - _Z88DK_SPRITE_OFFSET)\n\n\n// 0x50 -> 0\n#if defined(__MO5__)||defined(__TO7__)\n    #define _TILE_19 49\n    #define _TILE_20 50\n    #define _TILE_21 51\n    #define _TILE_22 52\n    #define _TILE_23 53\n    #define _TILE_24 54\n    #define _TILE_26 (_TILE_8+1)\n#elif defined(__COCO3__) || defined(__COCO__)||defined(__DRAGON__)\n    #define _TILE_19 (_TILE_16+2)\n    #define _TILE_20 (_TILE_16+3)\n    #define _TILE_21 (_TILE_16+4)\n    #define _TILE_22 (_TILE_16+5)\n    #define _TILE_23 (_TILE_16+6)\n    #define _TILE_24 (_TILE_16+7)\n    #define _TILE_26 (_TILE_8+1)\n#else\n    #define _TILE_19 (0x3A - _Z88DK_SPRITE_OFFSET)\n    #define _TILE_20 (0x40 - _Z88DK_SPRITE_OFFSET)\n    #define _TILE_21 (0x5C - _Z88DK_SPRITE_OFFSET)\n    #define _TILE_22 (0x5D - _Z88DK_SPRITE_OFFSET)\n    #define _TILE_23 (0x5E - _Z88DK_SPRITE_OFFSET)\n    #define _TILE_24 (0x5F - _Z88DK_SPRITE_OFFSET)\n    #define _TILE_26 (_TILE_8+1)\n#endif\n\n\n\n#endif // _UDG_SETTINGS\n\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/vdp_mode1_settings.h",
    "content": "\r\n#if defined(__TI99__)\r\n    #define _BASE 96\r\n#else\r\n    #define _BASE 32\r\n#endif\r\n\r\n#define _TILE_0 (_BASE+27)\r\n#define _TILE_1 (_BASE+1)\r\n#define _TILE_2 (_BASE+2)\r\n#define _TILE_3 (_BASE+3)\r\n\r\n#define _TILE_25 (_BASE+4)\r\n\r\n#define _TILE_4 (_BASE+5)\r\n#define _TILE_5 (_BASE+6)\r\n#define _TILE_6 (_BASE+7)\r\n#define _TILE_7 (_BASE+8)\r\n\r\n#define _TILE_8 (_BASE+9)\r\n#define _TILE_9 (_BASE+10)\r\n\r\n#define _TILE_10 (_BASE+11)\r\n#define _TILE_11 (_BASE+12)\r\n\r\n#define _TILE_12 (_BASE+14)\r\n#define _TILE_13 (_BASE+15)\r\n\r\n#define _TILE_14 (_BASE+16)\r\n#define _TILE_15 (_BASE+17)\r\n#define _TILE_16 (_BASE+18)\r\n#define _TILE_17 (_BASE+19)\r\n\r\n#define _TILE_18 (_BASE+20)\r\n#define _TILE_19 (_BASE+21)\r\n\r\n#define _TILE_20 (_BASE+22)\r\n#define _TILE_21 (_BASE+23)\r\n#define _TILE_22 (_BASE+24)\r\n#define _TILE_23 (_BASE+25)\r\n#define _TILE_24 (_BASE+26)\r\n\r\n#define _TILE_26 (_BASE+13)\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/display/tiles/vic20_exp_16k_settings.h",
    "content": "\n#define _TILE_0 '\\''\n#define _TILE_1 ('>'+1-2)\n#define _TILE_2 (0x74-13-7) \n#define _TILE_3 ('>'+1-2+1)\n\n#define _TILE_8  44\n#define _TILE_9 45\n#define _TILE_11 46\n#define _TILE_12 47\n\n#define _TILE_7 33\n#define _TILE_5 34\n#define _TILE_17 35\n\n#define _TILE_15 ('<'-2)\n\n#define _TILE_13 ('>'+5-7)\n\n#define _TILE_25 '$'\n\n#define _TILE_10 ('>'+1-2+1+1)\n\n#define _TILE_4 (0x76-13-7)\n\n#define _TILE_6 ('^'+1)\n\n#define _TILE_14 ('>'-3)\n\n#define _TILE_16 '^'\n\n\n#define _TILE_18 ((0x7A-13-7)-5)\n\n#define _TILE_19 42\n#define _TILE_20 43\n#define _TILE_21 37\n#define _TILE_22 38\n#define _TILE_23 40\n#define _TILE_24 41\n"
  },
  {
    "path": "src/cross_lib/display/tiles/vic20_exp_16k_v2_settings.h",
    "content": "\n#define _TILE_0 '\\''\n#define _TILE_1 ('>'+1-2)\n#define _TILE_2 (0x74-13-7) \n#define _TILE_3 ('>'+1-2+1)\n\n#define _TILE_8  44\n#define _TILE_9 45\n#define _TILE_11 46\n#define _TILE_12 47\n\n#define _TILE_7 33\n#define _TILE_5 34\n#define _TILE_17 35\n\n#define _TILE_15 ('<'-2)\n\n#define _TILE_13 ('>'+5-7)\n\n#define _TILE_25 '$'\n\n#define _TILE_10 ('>'+1-2+1+1)\n\n#define _TILE_4 ('Z'+2)\n//(0x76-13-7)\n\n#define _TILE_6 ('Z'+5)\n\n#define _TILE_14 ('>'-3)\n\n#define _TILE_16 ('Z'+4)\n\n\n#define _TILE_18 ('Z'+3)\n\n#define _TILE_19 42\n#define _TILE_20 43\n#define _TILE_21 37\n#define _TILE_22 38\n#define _TILE_23 40\n#define _TILE_24 41\n\n#define _TILE_26 ('Z'+1)"
  },
  {
    "path": "src/cross_lib/display/tiles/vic20_exp_3k_light_settings.h",
    "content": "\n\n#define _TILE_0 0x00\n#define _TILE_1 27\n#define _TILE_2 28\n#define _TILE_3 29\n#define _TILE_4 30\n#define _TILE_5 31\n#define _TILE_6 33\n#define _TILE_7 34\n#define _TILE_8 35\n#define _TILE_9 36\n#define _TILE_10 37\n#define _TILE_11 38\n#define _TILE_12 39\n#define _TILE_13 40\n#define _TILE_14 41\n#define _TILE_15 42\n#define _TILE_16 43\n#define _TILE_17 44\n#define _TILE_18 45\n#define _TILE_19 46\n#define _TILE_20 47\n#define _TILE_21 58\n#define _TILE_22 59\n#define _TILE_23 60\n#define _TILE_24 61\n#define _TILE_25 62\n#define _TILE_26 63\n\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/vic20_exp_3k_settings.h",
    "content": "\n\n#define _TILE_0 0x00\n#define _TILE_1 0x0E\n#define _TILE_2 0x11\n#define _TILE_3 0x10\n#define _TILE_4 0x1C\n#define _TILE_5 0x1B\n\n// BOGUS TILES\n//#define _TILE_6 _TILE_4\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/vic20_rom_chars_and_26_tiles_settings.h",
    "content": "\n// BLUE\n#define _TILE_0 0x79\n#define _TILE_1 0x6C\n#define _TILE_2 0x7B\n#define _TILE_3 0x7A\n// #define _PLAYER _PLAYER_DOWN\n\n#define _TILE_9 0x6D\n\n// YELLOW\n#define _TILE_7 0x77\n#define _TILE_12 0x74\n#define _TILE_13 0x75\n#define _TILE_25 ('$'+128)\n\n// GREEN\n#define _TILE_8  0x6F\n\n// RED\n#define _TILE_5 0x78\n\n// CYAN\n#define _TILE_10 0x6E\n#define _TILE_11 0x73\n\n\n// WHITE\n#define _TILE_4 0x76\n\n#define _TILE_6 0x7F\n\n#define _TILE_14 0x71\n\n#define _TILE_15 0x7C\n\n#define _TILE_16 0x70\n\n#define _TILE_17 0x7D\n\n#define _TILE_18 0x7E\n\n#define _TILE_19 0x66\n#define _TILE_20 0x67\n#define _TILE_21 0x68\n#define _TILE_22 0x69\n#define _TILE_23 0x6A\n#define _TILE_24 0x6B\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/vic20_rom_chars_and_27_tiles_settings.h",
    "content": "\n// BLUE\n#define _TILE_0 0x79\n#define _TILE_1 0x6C\n#define _TILE_2 0x7B\n#define _TILE_3 0x7A\n// #define _PLAYER _PLAYER_DOWN\n\n#define _TILE_9 0x6D\n\n// YELLOW\n#define _TILE_7 0x77\n#define _TILE_12 0x74\n#define _TILE_13 0x75\n\n// GREEN\n#define _TILE_8  0x6F\n\n// RED\n#define _TILE_5 0x78\n\n// CYAN\n#define _TILE_10 0x6E\n#define _TILE_11 0x73\n\n\n// WHITE\n#define _TILE_4 0x76\n\n#define _TILE_6 0x7F\n\n#define _TILE_14 0x71\n\n#define _TILE_15 0x7C\n\n#define _TILE_16 0x70\n\n#define _TILE_17 0x7D\n\n#define _TILE_18 0x7E\n\n#define _TILE_19 0x64\n#define _TILE_20 0x65\n#define _TILE_21 0x66\n#define _TILE_22 0x67\n#define _TILE_23 0x68\n#define _TILE_24 0x69\n#define _TILE_25 0x6A\n#define _TILE_26 0x6B\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles/vic20_rom_chars_and_6_tiles_settings.h",
    "content": "\n// BLUE\n#define _TILE_0 61\n#define _TILE_1 60\n#define _TILE_2 63\n#define _TILE_3 62\n#define _TILE_4 58\n#define _TILE_5 59\n\n#define _TILE_6 61\n#define _TILE_7 60\n#define _TILE_8 63\n#define _TILE_9 62\n#define _TILE_10 58\n#define _TILE_11 59\n\n#define _TILE_12 61\n#define _TILE_13 60\n#define _TILE_14 63\n#define _TILE_15 62\n#define _TILE_16 58\n#define _TILE_17 59\n\n#define _TILE_18 61\n#define _TILE_19 60\n#define _TILE_20 63\n#define _TILE_21 62\n#define _TILE_22 58\n#define _TILE_23 59\n\n#define _TILE_24 61\n#define _TILE_25 60\n#define _TILE_26 63\n\n\n\n"
  },
  {
    "path": "src/cross_lib/display/tiles.h",
    "content": "#ifndef _TILES_H\n#define _TILES_H\n\n#include \"cross_lib.h\"\n\n#  if defined(__C64__) && defined(__MEMORY_MAPPED_GRAPHICS)\n\t#include \"c64_memory_mapped_settings.h\"\n#elif (defined(__AGAT__) && defined(__BIT_MAPPED_GRAPHICS)) || defined(__VGA_GRAPHICS)\n    #include \"agat_settings.h\"\n#elif  (defined(__CX16__) && !defined(_XL_NO_UDG))\n    // #include \"agat_settings.h\"\n    #include \"cx16_settings.h\"\n#elif defined(__PV1000__) && defined(__PV1000_GRAPHICS)\n    #include \"pv1000_settings.h\"\n#elif defined(__C64__) && defined(__CONIO_GRAPHICS)\n\t#include \"c64_conio_settings.h\"\n#elif defined(__C128__) && defined(__80COL_UDG)\n\t// #include \"c264_redefined_chars_settings.h\" 23 24\n\t#include \"c128_settings.h\"\n#elif defined(__ATARI7800_COLOR_GRAPHICS)\n\t#include \"atari7800_settings.h\"\n#elif defined(__BBC_GRAPHICS) && !defined(_XL_NO_UDG)\n    #include \"bbc_settings.h\"\n#elif defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\n    #include \"default_quad_graphics_settings.h\"\n#elif defined(__CREATIVISION__) && defined(__VDP_MODE1_GRAPHICS) && !defined(_XL_NO_UDG)\n    #include \"vdp_mode1_settings.h\"\n#elif defined(__TI99__) && !defined(_XL_NO_UDG)\n    #include \"vdp_mode1_settings.h\"\n#elif defined(__CREATIVISION__) && !defined(_XL_NO_UDG)\n    #include \"creativision_settings.h\"\n#elif defined(__VIC20__) && defined(__VIC20_EXP_3K) && defined(_XL_NO_UDG)\n\t#include \"vic20_exp_3k_settings.h\"\n#elif defined(__VIC20__) && defined(__VIC20_EXP_3K) && !defined(_XL_NO_UDG)\n\t#include \"vic20_exp_3k_light_settings.h\"\n#elif defined(__VIC20__) && defined(__MEMORY_MAPPED_GRAPHICS) && (defined(__VIC20_EXP_8K) || defined(__VIC20_EXP_3K)) && !defined(_XL_NO_UDG)\n    #include \"vic20_rom_chars_and_27_tiles_settings.h\"\n#elif defined(__VIC20__) && defined(__VIC20_UNEXPANDED) && !defined(_XL_NO_UDG)\n\t#include \"vic20_rom_chars_and_6_tiles_settings.h\"\n#elif defined(__VIC20__) && defined(__CONIO_GRAPHICS)\n\t#include \"vic20_exp_16k_v2_settings.h\"\n#elif defined(__C16__) && !defined(_XL_NO_UDG) && !defined(__MEMORY_MAPPED_GRAPHICS)\n\t#include \"c264_redefined_chars_settings.h\"\n#elif defined(__C16__) && !defined(_XL_NO_UDG)\n\t#include \"c264_link_time_redefined_chars_settings.h\"\n// #elif defined(__CBM__) && defined(__MEMORY_MAPPED_GRAPHICS)\n// e.g., Bomber Vic 20 unexpanded no gfx\n// #include \"petscii_memory_mapped_settings.h\"\n#elif defined(__MO5__) || defined(__TO7__) || ( (defined(__COCO__) || defined(__DRAGON__)) && (defined(__BIT_MAPPED_GRAPHICS) || defined(__BIT_MAPPED_4_GRAPHICS)))\n\t#include \"udg_settings.h\"\n#elif (defined(__COCO__) || defined(__DRAGON__)) && defined(__MEMORY_MAPPED_GRAPHICS)\n\t#include \"cmoc_memory_mapped_settings.h\"\n#elif defined(__COCO3__)\n\t#include \"udg_settings.h\"\n#elif (defined(__ATARI__) && defined(__ANTIC_MODE6_GRAPHICS))\n\t#include \"atari_mode1_redefined_chars_settings.h\"\n#elif defined(__ATARI5200__)\n\t#include \"atari_mode1_redefined_chars_settings.h\"\n#elif defined(__ATMOS__) && !defined(NO_UDG)\n\t#include \"atmos_redefined_characters_settings.h\"\n#elif defined(__Z88DK_SPRITES_GRAPHICS) \n\t#include \"udg_settings.h\"\n#elif defined(__MSX__) && defined(__MEMORY_MAPPED_GRAPHICS)\n\t#include \"msx_redefined_chars_settings.h\"\n#elif defined(__CPCRSLIB_GRAPHICS)\n\t#include \"cpc_cpcrslib_settings.h\"\n#elif defined(__REX__)\n\t#include \"cpc_cpcrslib_settings.h\"\n#elif defined(__SUPERVISION__)\n\t#include \"supervision_settings.h\"\n#elif defined(__NES__) && defined(__CONIO_GRAPHICS)\n\t#include \"nes_settings.h\"\n#elif defined(__NES__) && defined(__NES_CONIO_GRAPHICS)\n\t#include \"nes_conio_settings.h\"\n#elif defined(__CIDELSA__) && defined(_XL_NO_UDG)\n    #include \"cidelsa_no_gfx.h\"\n#elif defined(__COMX_COLOR_GRAPHICS) && !defined(__MICRO__)\n\t#include \"comx_color_settings.h\"\n#elif defined(__COMX__) || defined(__PECOM__) || ((defined(__CIDELSA__) && !defined(_XL_NO_UDG)))\n    #include \"comx_settings.h\"\n#elif defined(__MICRO__)\n\t// #include \"micro_settings.h\"\n#elif defined(__ATARI_LYNX__) && defined(__LYNX_TGI_GRAPHICS)\n    #include \"tgi_gfx_settings.h\"\n// #elif (defined(__SCCZ80) || defined(__SDCC)) && !defined(_XL_NO_UDG)\n#elif  defined(__Z88DK__) && !defined(_XL_NO_UDG)\n\t#include \"udg_settings.h\"\n#elif defined(__PCE__) || ( defined(__GAMATE__) && !defined(_XL_NO_UDG))\n\t#include \"pce_settings.h\"\n#elif (defined(__APPLE2__)||defined(__APPLE2ENH__))&&defined(__APPLE2_HGR_GRAPHICS)\n    #include \"apple2_hgr_settings.h\"\n#elif defined(__TERMINAL__)\n    #include \"apple2_hgr_settings.h\"\n#else\n\t#include \"default_image_settings.h\"\n#endif \n\n\n#endif // _TILES_H\n\n"
  },
  {
    "path": "src/cross_lib/include/standard_libs.h",
    "content": "#ifndef _STANDARD_LIBS_H\n#define _STANDARD_LIBS_H\n\n#if defined(__COCO__) || defined(__DRAGON__) || (defined(__CMOC__) && !defined(__WINCMOC__))\n\t#include <cmoc.h>\n    #include <coco.h>\n\n#elif defined(__MC10__)\n    #include <stdint.h>\n    #include <stdio.h>\n    int rand(void);\n\n#elif defined(__BBC__) && defined(__NO_GRAPHICS)\n    #include <stdint.h>\n    #include <stdlib.h>\n#elif defined(__LCC1802__) \n    #include <stdint.h>\n#elif defined(__TI99__)\n        typedef unsigned char uint8_t;\n        typedef unsigned int uint16_t;\n        #include <string.h>\n#elif defined(__NO_GRAPHICS) \n    #if !defined(_STDINT)\n        #define _STDINT\n        typedef unsigned char uint8_t;\n        typedef unsigned int uint16_t;\n    #endif // _STDINT\n#else\n\t#include <stdlib.h>\n\t#include <string.h>\n\t#include <stdio.h>\n    #if !defined(__XTC68__) && !defined(__OLIVETTI_M20__)\n        #include <stdint.h>\n    #else\n        #if !defined(_STDINT)\n            #define _STDINT\n            typedef unsigned char uint8_t;\n            typedef unsigned short uint16_t;\n        #endif // _STDINT\n    #endif\n#endif\n\n#if defined(__ALT_RAND) && !defined(__LCC1802__)\n    int rand(void);\n#endif\n\n#endif // _STANDARD_LIBS_H\n\n"
  },
  {
    "path": "src/cross_lib/input/input_macros.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#include \"sleep_macros.h\"\n\n#include \"input_macros.h\"\n\n#if defined(__Z88DK__)\n\tuint8_t stick;\n#endif\n\n#ifndef POKE\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))    \n#endif\n\n#ifndef PEEK\n#define PEEK(addr)         (*(uint8_t*) (addr))    \n#endif\n\n#if defined(__TI99__) && !defined(_XL_NO_JOYSTICK)\n\n    #include \"kscan.h\"\n\n    uint8_t __joystfast(int unit) {\n    unsigned int result;\n\n    // read the joystick lines (column 6 or 7, (5 added to unit))\n    __asm__(\"li r12,>0024\\n\\tai %1,5\\n\\tswpb %1\\n\\tldcr %1,3\\n\\tsrc r12,7\\n\\tli r12,>0006\\n\\tclr %0\\n\\tstcr %0,8\" : \"=r\"(result) : \"r\"(unit) : \"r12\");\n\n    KSCAN_JOYY = 0;\n    KSCAN_JOYX = 0;\n\n    if ((result & 0x0200) == 0) \n    {\n        KSCAN_JOYX = JOY_LEFT;\n        return JOY_LEFT;\n    }\n    if ((result & 0x0400) == 0) \n    {\n        KSCAN_JOYX = JOY_RIGHT;\n        return JOY_RIGHT;\n    }\n    if ((result & 0x0800) == 0) \n    {\n        KSCAN_JOYY = JOY_DOWN;\n        return JOY_DOWN;\n    }\n    if ((result & 0x1000) == 0) \n    {\n        KSCAN_JOYY = JOY_UP;\n        return JOY_UP;\n    }\n    kscan(1);\n    if(result==18)\n    {\n        return 18;\n    }\n    }\n    \n    uint8_t JOY_INPUT(void)\n    {\n        return __joystfast(1);\n    }\n#endif\n\n// !defined(ACK)\n#if defined(_XL_NO_JOYSTICK) && !defined(__STDIO) && !defined(__NO_INPUT)\n    #if defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__MICRO__)\n\t\t#include <devkit/input/keyboard.h>\n    #endif \n        \n    char GET_CHAR(void)\n    {\n    // #  if defined(__NO_PRINT)\n        // return 0;\n    #if defined(_XL_TURN_BASED)\n        return _XL_TURN_BASED_INPUT();\n    \n    // #elif defined(__MSX__)\n        // if(!get_trigger(0)) \n        // {\n            // return get_stick(0);\n        // } \n        // else \n        // {\n            // return 9;\n        // }\n    \n    #elif defined(__MSDOS86__) && defined(__KEY_POLL_FROM_BUFFER)\n            #define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\t\n            #define PEEK(addr)         (*(uint8_t*) (addr))\n            \n            unsigned char _kb_poll_buffer(void);\n            // void GET_CHAR(void)\n            // {\n            unsigned char volatile input = _kb_poll_buffer();\n            // POKE(1050,PEEK(1052));\n            return input;\n            // }\n                        \n\n    #elif defined(__MC10__)\n    \n        POKE(2u,0xFFu-0x10u);\n        if(!(PEEK((volatile uint16_t) 49151u)&2))\n        {\n            return 'L';\n        }\n        POKE(2u,0xFFu-0x08u);\n        if(!(PEEK((volatile uint16_t)49151u)&2))\n        {\n            return 'K';\n        }\n        POKE(2u,0xFFu-0x04u);\n        if(!(PEEK((volatile uint16_t)49151u)&2))\n        {\n            return 'J';\n        }\n        POKE(2u,0xFFu-0x2u);\n        if(!(PEEK((volatile uint16_t)49151u)&2))\n        {\n            return 'I';\n        }\n        POKE(2u,0xFFu-0x80u);\n        if(!(PEEK((volatile uint16_t)49151u)&8))\n        {\n            return ' ';\n        }\n        return 0;\n\n    #elif defined(__VIC20__) || defined(__SUPERVISION__) || defined(__CREATIVISION__) || defined(__OSIC1P__) \\\n    || defined(__APPLE2__) || defined(__APPLE2ENH__) || defined(__CBM610__) || defined(__C16__) \\\n    || defined(__CX16__) || defined(__AGAT__) || defined(__MEGA65__) || defined(__C65__) \\\n    || defined(__KIM1__) || defined(__SYM1__)\n    \n        if(kbhit())\n            return cgetc();\n        else\n            return 0;\n    // Code by Marcel van Tongeren\n    #elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__MICRO__)\n        return get_stick();\n        \n    #elif defined(__ATMOS__) || defined(__TELESTRAT__)\n        #include <peekpoke.h>    \n        \n        uint8_t polledValue = PEEK(0x208);\n\n        switch(polledValue)\n        {\n            case 141:\n                return 'I';\n            break;\n            case 129:\n                return 'J';\n            break;\n            case 131:\n                return 'K';\n            break;\n            case 143:\n                return 'L';\n            break;\n            case 132:\n                return ' ';\n            break;\n        }\n        return '\\0';\n    #elif defined(__TO7__)\n        \n        uint8_t res;\n        \n        asm\n        {\n            jsr 0xE806\n            stb res\n        }\n        return res; \n        #define PEEK(addr)         (*(uint8_t*) (addr))    \n    \n    #elif defined(__MO5__) \n\n        #define KEYREG 0xA7C1\n        \n        POKE(KEYREG,0x18);\n        if(!(PEEK(KEYREG)&128))\n        {\n            return 'I';\n        }\n        else \n        {\n            POKE(KEYREG,0x04);\n            if(!(PEEK(KEYREG)&128))\n            {\n                return 'J';\n            }\n            else\n            {\n                POKE(KEYREG,0x14);\n                if(!(PEEK(KEYREG)&128))\n                {\n                    return 'K';\n                }\n                else\n                {\n                    POKE(KEYREG,0x24);\n                    if(!(PEEK(KEYREG)&128))\n                    {\n                        return 'L';\n                    }\n                    else\n                    {\n                        POKE(KEYREG,0x40);\n                        if(!(PEEK(KEYREG)&128))\n                        {\n                            return ' ';\n                        }\n                        else\n                        {\n                            return 0;\n                        }\n                    }\n                }\n            }\n        }\n\n    #elif defined(__NCURSES__) || defined(__TERMINAL__)\n\n        #if defined(__TERMINAL__)\n            #if defined(WIN32)\n                #include <ncurses/curses.h>\n            #else\n                #include <ncurses.h>\n            #endif\n        #endif\n        \n        #define INPUT_LOOPS 10\n        \n        unsigned long delay = 0;\n        volatile char _ch;\n        volatile char ch = 0;\n\n        while(delay<INPUT_LOOPS)\n        {    \n            _ch = getch();\n            if(_ch!=ERR)\n            {\n                ch = _ch;\n            }\n            ++delay;\n        }\n        \n        return ch;\n\n    #elif defined(__COCO3__) \n        #include <cmoc.h>\n        #include <coco.h>\n        \n        uint8_t res;\n        uint8_t machine;\n        \n        asm {\n            lda #253\n            sta machine\n            sta $FF02\n            ldb #73\ntest        lda $ff00\n            cmpa machine\n            beq out\n            incb\n            rol $ff02\n            inc $ff02\n            cmpb #77\n            bne test\n            clrb \nout         stb res\n        }\n        \n        #define _COCO_SPACE_BIT_MASK 0x08\n                \n        POKE(0xFF02,0x7F);\n        if(!(PEEK(0xFF00)&_COCO_SPACE_BIT_MASK))\n        {\n            return ' ';\n        }\n\n        return res;\n        \n    \n    #elif defined(__COCO__) || defined(__DRAGON__)\n        #include <cmoc.h>\n        #include <coco.h>\n\n        uint8_t res;\n        uint8_t machine;\n        \n        asm {\n            ldd $8000\n            cmpd #$7EBB\n            beq _dragon\n            lda #253\n            sta machine\n            bra pia\n_dragon     lda #247\n            sta machine\npia         lda #253        \n            sta $FF02\n            ldb #73\ntest        lda $ff00\n            cmpa machine\n            beq out\n            incb\n            rol $ff02\n            inc $ff02\n            cmpb #77\n            bne test\n            clrb \nout         stb res\n        }\n        \n        #define _COCO_SPACE_BIT_MASK 0x08\n        \n        #define _DRAGON_SPACE_BIT_MASK 0x20\n        \n        POKE(0xFF02,0x7F);\n        if(!(PEEK(0xFF00)&_COCO_SPACE_BIT_MASK) || !(PEEK(0xFF00)&_DRAGON_SPACE_BIT_MASK))\n        {\n            return ' ';\n        }\n\n        return res;\n        \n    #elif defined(__SRR__)\n        return getk_inkey();     \n    #elif defined(__TI99__)\n        \n        POKE(0x83C8,0);\n        POKE(0x83CA,0);\n        if(kbhit())\n            return cgetc();\n        else\n            return 0;    \n        \n    #elif defined(__BBC__)\n        #define OSSCANKEY(x) OSBYTE1(121,(x))\n        \n        char OSBYTE1(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\";\n        \n        return OSSCANKEY('')+1;\n        \n    #else\n        return getk();\n    #endif\n    }\n#endif    \n\n\n\n// _XL_WAIT_FOR_INPUT() definitions\n#if !defined(__NO_INPUT)\n    #  if defined(__NO_WAIT) && !defined(_XL_NO_SLEEP)\n        void _XL_WAIT_FOR_INPUT(void)\n        {\n            _XL_SLEEP(2);\n        }\n    #elif defined(__NO_WAIT) \n    //\n    #elif defined(WAIT_FOR_KEY)\n        #  if defined(__STDIO)\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                getchar();\n            }\n        #elif defined(__MSDOS86__)\n            extern void _wait_for_key(void);\n\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                _wait_for_key();\n            }\n        #elif defined(__MC10__)\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                getchar();\n            }\n        #elif defined(__NCURSES__) || defined(__TERMINAL__)\n            #if defined(WIN32)\n                #include <ncurses/curses.h>\n            #else\n                #include <ncurses.h>\n            #endif\n            \n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                #if !defined(_XL_TURN_BASED)\n                    while(getch()==ERR)\n                    {}\n                #else\n                    getch();\n                #endif\n            }\n            \n        #elif  defined(__COCO3__)\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                do\n                {\n                    \n                } while(!_XL_INPUT());\n            }\n        #elif defined(__COCO__) || defined(__DRAGON__)\n            #include <cmoc.h>\n            \n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                waitkey(0);\n                // isKeyPressed();\n            }\n        #elif defined(__NO_INPUT)\n        //\n        #elif defined(__BBC__)\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                while(!_XL_KEY_PRESSED())\n                {\n                }\n            }\n        #elif defined(__MO5__) || defined(__TO7__)\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                while(GET_CHAR())\n                {\n                };\n                while(!GET_CHAR())\n                {\n                }\n            }\n        #elif defined(__TERMINAL__)\n            #include <ncurses.h>\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                // TODO: Implement this\n            }\n        #else \n            #if defined(__INCLUDE_CONIO_H)\n                #include<conio.h>\n            #endif\n\n            #if defined(__Z88DK__)\n                #undef cgetc\n                #define cgetc() getch()\n            #endif \n\n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                while(kbhit())\n                    (void) cgetc();\n                while(!kbhit())\n                { \n                }; \n                (void) cgetc();\n            }\n        #endif    \n    #else\n        #if defined(__Z88DK__)\n            #include <games.h>\n            \n            extern uint8_t stick;\n            \n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                while ((joystick(stick) & MOVE_FIRE))\n                {\n                }\n                while (!(joystick(stick) & MOVE_FIRE))\n                {\n                }\n            }        \n        #elif defined(__LCC1802__)\n            #include <devkit/input/joystick.h>\n            \n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                // Flush the video buffer to make sure that the latest character is displayed\n                #if !defined(__LCC1802_UNBUFFERED)\n                VIDFLUSH();\n                #endif\n                \n                while(!get_stick(0))\n                {\n                }\n            }\n        #elif defined(__TI99__)\n            // TODO: Implement this\n            #include \"kscan.h\"\n            \n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                do\n                {\n                    kscan(1);\n                } while(KSCAN_KEY!=18);\n                \n            }\n        #else\n            #include<joystick.h>\n            \n            void _XL_WAIT_FOR_INPUT(void)\n            {\n                while ((joy_read(STANDARD_JOY) & JOY_BTN_1_MASK))\n                {\n                }\n                while (! (joy_read(STANDARD_JOY) & JOY_BTN_1_MASK))\n                {\n                }\n            }    \n        #endif\n#endif\n#endif\n\n"
  },
  {
    "path": "src/cross_lib/input/input_macros.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _INPUT_MACROS\n#define _INPUT_MACROS\n\n\t#include \"input_target_settings.h\"\n\n    // _XL_INIT_INPUT\n\t#if defined(_XL_NO_JOYSTICK)\n\t\t#if defined(__ATMOS__)\n\n            #if !defined(PEEK)\n                #include <peekpoke.h>\n            #endif\n\n\t\t\t#define _XL_INIT_INPUT() { POKE(0x26A,PEEK(0x26A) | 8); }\n\t\t#elif defined(__MSX__)\n\t\t\t#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\t\t\n\t\t\t#define _XL_INIT_INPUT() { POKE(0xF3DB,0); }\n        // Enable key-repeat on all VIC 20 targets that use the keyboard\n\t\t#elif defined(__VIC20__) || defined(__C64__)\n\n            #if !defined(PEEK)\n                #include <peekpoke.h>\n            #endif\n            \n\t\t\t#define _XL_INIT_INPUT() \\\n            do \\\n            { \\\n                POKE(0x028A ,0xFF) \\\n                POKE(657,128); \\\n            } while(0)\n        #elif defined(__TO7__)\n\t\t\t#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\t\n\t\t\t#define PEEK(addr)         (*(uint8_t*) (addr))\n            #define _XL_INIT_INPUT() POKE(0x6067,0);\n\t\t#elif (defined(__NCURSES__) || defined(__TERMINAL__)) && !defined(_XL_TURN_BASED)\n\t\t\t#define _XL_INIT_INPUT() nodelay(stdscr,TRUE)\n\t\t#elif defined(__M5__)\n\t\t\t#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\t\n\t\t\t#define PEEK(addr)         (*(uint8_t*) (addr))\t\t\n\t\t\t#define _XL_INIT_INPUT() { POKE(0x701A,PEEK(0x701A)&0x7F);}\n\t\t#else\n\t\t\t#define _XL_INIT_INPUT()\n\t\t#endif\n\t#elif defined(__Z88DK__)\n\t\textern uint8_t stick;\n\t\t\n        #if !defined(STICK)\n            #if defined(__ZX81__)\n                #define STICK 3\n            // #elif defined(__LASER500__)\n                // #define STICK 2\n            #else\n                #define STICK 1\n            #endif\n        #endif\n        #define _XL_INIT_INPUT() \\\n            { \\\n                stick = STICK; \\\n            }\n\t#elif defined(__SMS__) || defined(__LCC1802__) || defined(__TI99__)\n\t\t#define _XL_INIT_INPUT()\n\t#else // All CBM except CBM610 + ATARI + ATARI XL + ATARI 5200\n\t\t#include <joystick.h>\n\t\t#if defined(__SUPERVISION__)\n\t\t\t#include <supervision.h>\n\t\t#endif\n        #if defined(__VIC20__) || defined(__C64__)\n\n            #if !defined(PEEK)\n                #include <peekpoke.h>\n            #endif            \n            #define _XL_INIT_INPUT() \\\n                do \\\n                { \\\n                    joy_install((void *)joy_static_stddrv); \\\n                    POKE(657,128); \\\n                } while(0);\n        #else\n            #define _XL_INIT_INPUT() { joy_install((void *)joy_static_stddrv); };\n        #endif\n\t#endif //\n\n\n// __JOY_UP/DOWN/LEFT/RIGHT/FIRE\n#if !defined(_XL_NO_JOYSTICK)\n\t#if defined(__C64__) || defined(__C128__)\n\t\t#define STANDARD_JOY JOY_2\n\t#else\n\t\t#define STANDARD_JOY JOY_1\n\t#endif\n\n    #if defined(__Z88DK__)\n        #include <games.h>\n        \n        #define __JOY_UP(joyInput) ((joyInput) & MOVE_UP)\n        #define __JOY_DOWN(joyInput) ((joyInput) & MOVE_DOWN)\n        #define __JOY_LEFT(joyInput) ((joyInput) & MOVE_LEFT)\n        #define __JOY_RIGHT(joyInput) ((joyInput) & MOVE_RIGHT)\n        #define __JOY_FIRE(joyInput) ((joyInput) & MOVE_FIRE)\n\n    #elif defined(__LCC1802__)\n        #include <devkit/input/joystick.h>\n\n        #define __JOY_UP(joyInput) ((joyInput) == MOVE_UP)\n        #define __JOY_DOWN(joyInput) ((joyInput) == MOVE_DOWN)\n        #define __JOY_LEFT(joyInput) ((joyInput) == MOVE_LEFT)\n        #define __JOY_RIGHT(joyInput) ((joyInput) == MOVE_RIGHT)\n        #define __JOY_FIRE(joyInput) ((joyInput) == MOVE_FIRE)\n    #elif defined(__TI99__)\n        #include \"kscan.h\"\n\n        #define __JOY_UP(joyInput) ((KSCAN_JOYY) == JOY_UP)\n        #define __JOY_DOWN(joyInput) ((KSCAN_JOYY) == JOY_DOWN)\n        #define __JOY_LEFT(joyInput) ((KSCAN_JOYX) == JOY_LEFT)\n        #define __JOY_RIGHT(joyInput) ((KSCAN_JOYX) == JOY_RIGHT)\n        #define __JOY_FIRE(joyInput) ((joyInput) == 18)\n    #else // CC65\n        #include <joystick.h>\n        #define __JOY_UP(joyInput) JOY_UP(joyInput)\n        #define __JOY_DOWN(joyInput) JOY_DOWN(joyInput)\n        #define __JOY_LEFT(joyInput) JOY_LEFT(joyInput)\n        #define __JOY_RIGHT(joyInput) JOY_RIGHT(joyInput)\n        #if !defined(__JOY_FIRE)\n            #define __JOY_FIRE(joyKey) JOY_BTN_1(joyKey)\n        #endif\n    #endif //\n    \n    \n    #if defined(__Z88DK__)\n        extern uint8_t stick;\n        \n        #define JOY_INPUT() joystick(stick)\n    // #elif defined(__SMS__)\n        // #include <arch/sms/SMSLib.h>\n        \n        // #define JOY_INPUT() (SMS_getKeysStatus() & 0xFF)\n    #elif defined(__LCC1802__)\n        #define JOY_INPUT() get_stick(0)\n    #elif defined(__TI99__)\n        // #include \"kscan.h\"\n        \n        uint8_t JOY_INPUT(void);\n    #else\n        #define JOY_INPUT() joy_read(STANDARD_JOY)\n    #endif \n    \n#endif\n\n\n\n\n/*\n#if defined(__EMCC__)\n#include <emscripten.h>\nvoid js_getchar(void)\n{\nwindow.addEventListener(\"keydown\", function (event) {\n  if (event.defaultPrevented) {\n    return; // Do nothing if the event was already processed\n  }\n\n  switch (event.key) {\n    case \"ArrowDown\":\n      // code for \"down arrow\" key press.\n      break;\n    case \"ArrowUp\":\n      // code for \"up arrow\" key press.\n      break;\n    case \"ArrowLeft\":\n      // code for \"left arrow\" key press.\n      break;\n    case \"ArrowRight\":\n      // code for \"right arrow\" key press.\n      break;\n    default:\n      return; // Quit when this doesn't handle the key event.\n  }\n\n  // Cancel the default action to avoid it being handled twice\n  event.preventDefault();\n}, true);\n// the last option dispatches the event to the listener first,\n// then dispatches event to window\n\n#endif\n*/\n\n// _XL_TURN_BASED_INPUT definitions\n#  if defined(__TELESTRAT__)\n    #include <conio.h>\n    #define _XL_TURN_BASED_INPUT() cgetc();\n#elif defined(__EMCC__)\n    #define __() getchar()\n#elif defined(__NCURSES__) || defined(__STDIO) || defined(__MC10__)\n    #if defined(__MC10__)\n        #include <stdio.h>\n    #endif\n    #define _XL_TURN_BASED_INPUT() getchar()\n#elif defined(__Z88DK__)\n    #define _XL_TURN_BASED_INPUT() getch()\n#elif defined(ACK)\n    #define _XL_TURN_BASED_INPUT() getchar()\n#elif defined(__NO_PRINT)\n    #define _XL_TURN_BASED_INPUT()\n#else\n    #define _XL_TURN_BASED_INPUT() cgetc()\n#endif\t// _XL_TURN_BASED_INPUT definitions\n\n#if defined(__NO_INPUT)\n    #define _XL_INPUT() 0\n#elif defined(_XL_TURN_BASED)\n    #define _XL_INPUT() _XL_TURN_BASED_INPUT()\n#elif !defined(_XL_NO_JOYSTICK)\n    #define _XL_INPUT() JOY_INPUT()\n#else\n    #define _XL_INPUT() GET_CHAR()\n#endif\n\n\n\n\n    // GET_CHAR\n\t#if !defined(__NO_INPUT) && defined(_XL_NO_JOYSTICK)\n        #if defined(__TELESTRAT__)\n            #include<conio.h>\n            #define GET_CHAR() cgetc()\n        #elif defined(__MSDOS86__)\n            #if defined(__KEY_POLL_FROM_BUFFER)\n                // unsigned char _kb_poll_buffer(void);\n                // #define GET_CHAR() _kb_poll_buffer()\n                char GET_CHAR(void);\n\n            #else // Direct poll\n                unsigned char _kb_poll(void);\n                #define GET_CHAR() _kb_poll()\n\n            #endif\n\n        #elif defined(ACK) || defined(__STDIO)\n            #define GET_CHAR() getchar()\n        #else\n            char GET_CHAR(void);\n        #endif\n    #else\n        #define GET_CHAR()\n    #endif // !defined(__NO_PRINT)\n\n    #if defined(__MSDOS86__)\n        void _wait_for_key(void);\n    #endif\n    #if !defined(__NO_INPUT)\n        // _XL_WAIT_FOR_INPUT\n        #if !defined(__NO_WAIT) || !defined(_XL_NO_SLEEP)\n            void _XL_WAIT_FOR_INPUT(void);\n        #else // __NO_WAIT + _XL_NO_SLEEP\n            #define _XL_WAIT_FOR_INPUT()\n        #endif // !defined(__NO_WAIT) || !defined(_XL_NO_SLEEP)\n    #else\n        #define _XL_WAIT_FOR_INPUT()\n    #endif\n\n\n// KEY_PRESSED definitions\n#if !defined(__NO_INPUT)\n    #if defined(_XL_NO_JOYSTICK)\n        #define _XL_KEY_PRESSED() (GET_CHAR())\n    #else\n        #define _XL_KEY_PRESSED() (__JOY_FIRE(JOY_INPUT()))\n    #endif\n#else\n\n    #define _XL_KEY_PRESSED() ' '\n#endif\n\n\n#if defined(_XL_NO_JOYSTICK)\n    #define _XL_UP(input) ((input)==_MOVE_UP)\n    #define _XL_DOWN(input) ((input)==_MOVE_DOWN)\n    #define _XL_LEFT(input) ((input)==_MOVE_LEFT)\n    #define _XL_RIGHT(input) ((input)==_MOVE_RIGHT)\n    #define _XL_FIRE(input) ((input)==_FIRE)\n\n#else\n    #define _XL_UP(input) __JOY_UP(input)\n    #define _XL_DOWN(input)  __JOY_DOWN(input)\n    #define _XL_LEFT(input)  __JOY_LEFT(input)\n    #define _XL_RIGHT(input)  __JOY_RIGHT(input)\n    #define _XL_FIRE(input)  __JOY_FIRE(input)\n#endif\n\n#endif // _INPUT_MACROS\n\n"
  },
  {
    "path": "src/cross_lib/input/input_target_settings.h",
    "content": "#ifndef _INPUT_TARGET_SETTINGS\n#define _INPUT_TARGET_SETTINGS\n\n#if !defined(_MOVE_UP) && !defined(_MOVE_LEFT) && !defined(_MOVE_RIGHT) && !defined(_MOVE_DOWN)\n    #if defined(__NASCOM__) || defined(__MC1000__) || defined(__OSIC1P__) \\\n        || defined(__WINCMOC__) || defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__) || defined(__TO7__) ||defined(__MO5__) \\\n        ||  defined(__GAL__)  || defined(__Z9001__) || (defined(__APPLE2__) && !defined(__APPLE2_CPM__)) || (defined(__APPLE2ENH__) && !defined(__APPLE2_CPM__)) \\\n        || (defined(__AGAT__) && !defined(_XL_JCUKEN_KEYBOARD) && defined(_XL_NO_JOYSTICK)) \\\n        || (defined(__VZ__) && !defined(__HARDWARE_KEYBOARD)) || defined(__ATMOS__) || defined(__MZ__) || defined(__MTX__) || defined(__SC3000__) \\\n        || defined(__Z1013__) || defined(__KC__) || defined(__C128_Z80__) || defined(__EINSTEIN__) || defined(__MULTI8__) \\\n        || defined(__G800__) || defined(__FP1100__) || defined(__TI99__) || defined(__HEMC__) || defined(__HGMC__) \\\n        || defined(__HOMELAB__) || defined(__SPECIAL__) || defined(__KRAMERMC__) || defined(__DAI__) || defined(__X07__) \\\n        || (defined(__BBC__) && defined(TURN_BASED))|| defined(__BBCMASTER__) \\\n        || defined(__MC10__) || (defined(__ZX81__) && defined(__CONIO_GRAPHICS))\n        #define _MOVE_UP 'I'\n        #define _MOVE_DOWN 'K'\n        #define _MOVE_LEFT 'J'\n        #define _MOVE_RIGHT 'L'\n    #elif defined(__AGAT__) && defined(_XL_JCUKEN_KEYBOARD)\n        #define _MOVE_UP 'G'\n        #define _MOVE_DOWN 'O'\n        #define _MOVE_LEFT 'R'\n        #define _MOVE_RIGHT 'L'\n    #elif defined(__AGAT__) && defined(_XL_ARROW_KEYS)\n        #define _MOVE_UP 0x19\n        #define _MOVE_DOWN 0x1A\n        #define _MOVE_LEFT 0x08\n        #define _MOVE_RIGHT 0x15\n    #elif defined(__MSDOS__) && !defined(__KEY_POLL_FROM_BUFFER)\n    \n        #define _MOVE_UP     0x17\n        #define _MOVE_DOWN   0x25\n        #define _MOVE_LEFT   0x24\n        #define _MOVE_RIGHT  0x26\n    \n    #elif defined(__BBC__)\n    // 'b' <-> SPACE\n    // '%' <-> 'I'\n    // 'F' <-> 'K'\n    // 'E' <-> 'J'\n    // 'V' <-> 'L'\n        #define _MOVE_UP ('%'+1)\n        #define _MOVE_DOWN ('F'+1)\n        #define _MOVE_LEFT ('E'+1)\n        #define _MOVE_RIGHT ('V'+1)\n    #else\n        #define _MOVE_UP 'i'\n        #define _MOVE_DOWN 'k'\n        #define _MOVE_LEFT 'j'\n        #define _MOVE_RIGHT 'l'\n    #endif\n#endif\n\n#if !defined(_FIRE)\n    #if defined(__COMX__)\n        #define _FIRE 0x5f \n    #elif defined(__MSDOS__) && !defined(__KEY_POLL_FROM_BUFFER)\n        #define _FIRE 0x39\n    #elif defined(__BBC__)\n        #define _FIRE ('b'+1)\n    #else\n        #define _FIRE ' '\n    #endif\n#endif\n\n\n#if !defined(_XL_UP_KEY) && !defined(_XL_LEFT_KEY) && !defined(_XL_DOWN_KEY) && !defined(_XL_RIGHT_KEY) && !defined(_XL_FIRE_KEY)\n    #if !defined(_XL_JCUKEN_KEYBOARD)\n        #define _XL_UP_KEY \"I\"\n        #define _XL_LEFT_KEY \"J\"\n        #define _XL_DOWN_KEY \"K\"\n        #define _XL_RIGHT_KEY \"L\"\n        #define _XL_FIRE_KEY \"SPACE\"\n    #else\n        #define _XL_UP_KEY \"G\"\n        #define _XL_LEFT_KEY \"R\"\n        #define _XL_DOWN_KEY \"O\"\n        #define _XL_RIGHT_KEY \"L\"\n        #define _XL_FIRE_KEY \"SPACE\"\n    #endif\n#endif\n\n\n#if defined(_XL_NO_JOYSTICK)\n\t#define WAIT_FOR_KEY\n#else\n\t#define WAIT_FOR_JOY\n#endif\n\n\n#endif // _INPUT_TARGET_SETTINGS\n"
  },
  {
    "path": "src/cross_lib/rand/rand.c",
    "content": "\r\n// #define rnd_m 2345\r\n// #define rnd_a 6789\r\n\r\n// #define rnd_m 58653\r\n// #define rnd_a 13849\r\n\r\n/*\r\nstatic unsigned int next = 1;\r\nint rand(void) // RAND_MAX assumed to be 32767\r\n{\r\n    next = next * rnd_m + rnd_a;\r\n    return next;\r\n}\r\n*/\r\n\r\n#if defined(__ALT_RAND)\r\n\tstatic unsigned long int next = 1;\r\n\tint rand(void) // RAND_MAX assumed to be 32767\r\n\t{\r\n\t\tnext = next * 1103515245 + 12345;\r\n\t\treturn (unsigned int)(next>>16)&0x7FFF;\r\n\t}\r\n#endif\r\n\r\n"
  },
  {
    "path": "src/cross_lib/rand/rand.h",
    "content": "#ifndef _RAND_H\r\n#define _RAND_H\r\n\r\n// Normalized 15-bit pseudo-random number generator\r\n#if defined(__NORMALIZED_RAND) || defined(__NCURSES__) || defined(__TERMINAL__)\r\n    #define _XL_RAND() (rand()&0x7FFF)\r\n#else\r\n    #define _XL_RAND() (rand())\r\n#endif\r\n\r\n#endif // _RAND_H\r\n\r\n"
  },
  {
    "path": "src/cross_lib/rand/rand_lcc1802_devkit_include.c",
    "content": "// Necessary for LCC1802\r\n\r\n#include <devkit/system/rand.h>\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sleep/sleep_macros.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"sleep_macros.h\"\n\n#include \"cross_lib.h\" \n\n#include \"standard_libs.h\"\n\n#if !defined(_XL_NO_SLEEP)\n\n\t#if defined(__OSIC1P__) || defined(__ZX81__)\n\t\t#define CYCLES 500\n\t#elif defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__VIC20__)\n        #define CYCLES 2000U\n\t#elif defined(__COCO3___)\n        #define CYCLES 30000U\n    #elif defined(__COCO__) || defined(__DRAGON__)\n        #define CYCLES 600U\n    #elif defined(__SUPERVISION__)\n        #define CYCLES 6000U\n    #elif defined(__BBC__)\n        #define CYCLES 9000U\n    #elif defined(__TI99__)\n        #define CYCLES 17000U\n    #else\n\t\t#define CYCLES 1000\n\t#endif\n\n    #if defined(__ALT_SLEEP) && !defined(__NO_SLEEP_SEC)\n\tvoid _XL_SLEEP(uint8_t sec)\n\t{\n        #if defined(__TI99__)\n        volatile uint16_t ii;\n        #else\n\t\tuint16_t ii;\n        #endif\n        \n        // Flush the video buffer to make sure that the latest character is displayed\n        #if !defined(__LCC1802_UNBUFFERED) && (defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__MICRO__) || defined(__CIDELSA__))\n            VIDFLUSH();\n        #endif\n\t\t\n\t\t#if defined(__CMOC__)\n\t\t\tuint16_t foo;\n\t\t\tuint16_t bar;\n\t\t\t\n\t\t\tfor(ii=0;ii<sec*CYCLES;++ii)\n\t\t\t{\n\t\t\t\tfor(bar=0;bar<10;++bar)\n\t\t\t\t{\n\t\t\t\t\tfoo=42*PEEK(0xF000);\n\t\t\t\t}\n\n\t\t\t}; \n\t\t#else\n\t\t\tfor(ii=0;ii<sec*CYCLES;++ii)\n\t\t\t{\n\t\t\t}; \n\t\t#endif\n\n\t}\n    #endif\n#endif\n\n#if !defined(_XL_NO_SLEEP) && !defined(__NO_SLEEP)\n\t#if defined(__NCURSES__) || defined(__TERMINAL__)\n\t\t#include <stdint.h>\n\t\t#include <time.h>\n\t\t#include <unistd.h>\n\t\tvoid _XL_SLOW_DOWN(uint16_t t)\n\t\t{\n\t\t\tusleep((t)*800);\n\t\t}\n\t\t\n\t#elif defined(__TI99__)\n\t\tvoid _XL_SLOW_DOWN(uint16_t t)\n\t\t{\n\t\t\tvolatile uint16_t i;\n\n\t\t\tfor(i=0;i<(t);++i)\n\t\t\t{\n\t\t\t}\n\t\t}\n\t#elif defined(__CMOC__) // TODO: There should be a less hackish way\n\t\tvoid _XL_SLOW_DOWN(uint16_t t)\n\t\t{\n\t\t\tuint16_t i;\n\t\t\tuint16_t foo;\n\n\t\t\tfor(i=0;i<(t);++i)\n\t\t\t{\n                // foo=42*PEEK(0xF000);\n\t\t\t\tfoo=42+i;\n\t\t\t}\n\t\t}\n    #elif defined(__CX16__)\n\t\tvoid _XL_SLOW_DOWN(uint16_t t)\n\t\t{\n\t\t\tuint16_t i;\n            uint8_t j;\n\n\t\t\tfor(i=0;i<(t);++i)\n\t\t\t{\n                for(j=0;j<9;++j)\n                {\n                }\n\t\t\t}       \n\t\t}\n    #elif defined(__MEGA65__)\n\t\tvoid _XL_SLOW_DOWN(uint16_t t)\n\t\t{\n\t\t\tuint16_t i;\n            uint8_t j;\n\n\t\t\tfor(i=0;i<(t);++i)\n\t\t\t{\n                for(j=0;j<9;++j)\n                {\n                }\n\t\t\t}       \n\t\t}\n    #elif defined(__MSDOS86__)\n\t\tvoid _XL_SLOW_DOWN(uint16_t t)\n\t\t{\n\t\t\tuint16_t i;\n            uint8_t j;\n\n\t\t\tfor(i=0;i<(t);++i)\n\t\t\t{\n                for(j=0;j<9;++j)\n                {\n                }\n\t\t\t}       \n\t\t}\n\t#else\n\t\tvoid _XL_SLOW_DOWN(uint16_t t)\n\t\t{\n\t\t\tuint16_t i;\n\n\t\t\tfor(i=0;i<(t);++i)\n\t\t\t{\n\t\t\t}       \n\t\t}\n\t#endif\n#endif\n"
  },
  {
    "path": "src/cross_lib/sleep/sleep_macros.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _SLEEP_MACROS\n#define _SLEEP_MACROS\n\n    #include <standard_libs.h>\n  \n    #if !defined(_XL_NO_SLEEP)\n        #  if !defined(__CMOC__) && !defined(__LCC1802__) && !defined(__TI99__) && !defined(__MC10__)\n            #include <time.h>\n            #if !defined(__BBC__)\n                #include <unistd.h>\n            #endif\n            #include <stdlib.h>        \n        #elif defined(__CMC__)\n            #include <coco.h>\n            #include <cmoc.h>\n        #endif    \n    #endif\n\n    #if defined(__VIC20__)\n        #define MAX_XL_SLOW_DOWN_FACTOR 20000u\n    #else\n        #define MAX_XL_SLOW_DOWN_FACTOR 65534U\n    #endif\n\n    #if defined(_XL_NO_SLEEP)\n        #define _XL_SLEEP(s)\n    #elif defined(__NO_SLEEP_SEC)\n        #define _XL_SLEEP(s) _XL_SLOW_DOWN(MAX_XL_SLOW_DOWN_FACTOR)\n    #elif defined(__ALT_SLEEP)\n        void _XL_SLEEP(uint8_t s);\n    #else\n        #define _XL_SLEEP(s) sleep(s)\n    #endif\n\n\n#if !defined(__FORCE_SLOWDOWN) || __FORCE_SLOWDOWN==-1\n    #if !defined(_XL_SLOW_DOWN_FACTOR)\n        #if defined(_XL_TURN_BASED)\n                #define _XL_SLOW_DOWN_FACTOR 0\n        #else \n            #  if defined(__NCURSES__)\n                #define _XL_SLOW_DOWN_FACTOR 100\n            #elif defined(__OSIC1P__)\n                #define _XL_SLOW_DOWN_FACTOR 500U\n            #elif defined(__OSCA__)\n                #define _XL_SLOW_DOWN_FACTOR 8167U\t\t\n            #elif defined(__SC3000__)\n                #define _XL_SLOW_DOWN_FACTOR 2500\n            #elif defined(__NC100__) || defined(__NC200__)\n                #define _XL_SLOW_DOWN_FACTOR 1500\n            #elif defined(__MTX__)\n                #define _XL_SLOW_DOWN_FACTOR 3300U\n            #elif defined(__MSX__)\n                #define _XL_SLOW_DOWN_FACTOR 2000U\t\t\n            #elif defined(__MC1000__)\n                #define _XL_SLOW_DOWN_FACTOR 1200\t\t\t\n            #elif defined(__SAM__)\n                #define _XL_SLOW_DOWN_FACTOR 500\n            #elif defined(__VIC20__) && defined(__VIC20_UNEXPANDED)\n                #define _XL_SLOW_DOWN_FACTOR 0\n            #elif defined(__PC6001__)\n                #define _XL_SLOW_DOWN_FACTOR 500\t\n            #elif defined(__NASCOM__)\n                #define _XL_SLOW_DOWN_FACTOR 8000U\n            #elif defined(__ABC80__)\n                #define _XL_SLOW_DOWN_FACTOR 8000U\t\t\n            #elif defined(__VZ__)\n                #define _XL_SLOW_DOWN_FACTOR 3000U\n            #elif defined(__TI82__) || defined(__TI83__) || defined(__TI85__) || defined(__TI8X__) || defined(__TI86__)\n                #define _XL_SLOW_DOWN_FACTOR 6000U\n            #elif defined(__C64__)\n                #if defined(__USE_WAIT_V_SYNC)\n                    #define _XL_SLOW_DOWN_FACTOR 0\n                #else\n                    #define _XL_SLOW_DOWN_FACTOR 300\n                #endif\n            #elif (defined(__VIC20__) && !defined(__VIC20_UNEXPANDED)) \n                #define _XL_SLOW_DOWN_FACTOR 600\n            #elif defined(__NES__) || defined(__MZ__) || defined(__Z9001__) || defined(__WINCMOC__) || defined(__CMOC__) || \\\n                  defined(__CBM610__) || defined(__MSX__) || defined(__LASER500__)\n                #define _XL_SLOW_DOWN_FACTOR 800\n            #elif defined(__APPLE2__) || defined(__APPLE2ENH__) || (defined(__C16__) || defined(__PLUS4__))\n                #define _XL_SLOW_DOWN_FACTOR 250\n            #elif defined(__ATMOS__)\n                #define _XL_SLOW_DOWN_FACTOR 50\t\t\n            #elif defined(__VG5K__) && !defined(__ALT_PRINT)\n                #define _XL_SLOW_DOWN_FACTOR 2000U\n            #elif defined(__VG5K__) && defined(__ALT_PRINT)\n                #define _XL_SLOW_DOWN_FACTOR 5000U\t\t\n            #elif defined(__GAMATE__) || defined(__X1__) || defined(__AQUARIUS__) && defined(__ALT_PRINT)\n                #define _XL_SLOW_DOWN_FACTOR 1500\n            #elif defined(__CREATIVISION__) || defined(__ATARI5200__) || defined(__ATARI__)  || \\\n                  defined(__ACE__) || defined(__BEE__) || defined(__AQUARIUS__) && !defined(__ALT_PRINT) || defined(__PET__)\n                #define _XL_SLOW_DOWN_FACTOR 1000\n            #elif defined(__PCE__)\n                #define _XL_SLOW_DOWN_FACTOR 5500U\t\n            #elif defined(__SPECTRUM__) && !defined(__TS2068__)\n                #define _XL_SLOW_DOWN_FACTOR 1400\n            #elif defined(__TS2068__)\n                #define _XL_SLOW_DOWN_FACTOR 3000\n            #elif defined(__CPC__) && defined(__CPCRSLIB_GRAPHICS)\n                #define _XL_SLOW_DOWN_FACTOR 500\t\n            #elif defined(__SVI__)\n                #define _XL_SLOW_DOWN_FACTOR 1200\n            #elif defined(__ATARI_LYNX__)\n                #define _XL_SLOW_DOWN_FACTOR 6000U\n            #elif (defined(__TRS80__) || defined(__EG2K__)) &&  !defined(__Z88DK_SPRITES_GRAPHICS)\n                #define _XL_SLOW_DOWN_FACTOR 100\t\n            #elif defined(__EINSTEIN__)\n                #define _XL_SLOW_DOWN_FACTOR 5000\t\n            #elif defined(__PX4__)\n                #define _XL_SLOW_DOWN_FACTOR 2500\n            #elif defined(__PX8__)\n                #define _XL_SLOW_DOWN_FACTOR 30000U\n            #elif defined(__M5__)\n                #define _XL_SLOW_DOWN_FACTOR 900\t\t\n            #elif defined(__SUPERVISION__)\n                #define _XL_SLOW_DOWN_FACTOR 2000\t\t\n            #endif\n        #endif\n    #endif\n#else\n    #undef _XL_SLOW_DOWN_FACTOR\n    #define _XL_SLOW_DOWN_FACTOR __FORCE_SLOWDOWN\n#endif\n\n#if !defined(_XL_SLOW_DOWN_FACTOR)\n    #define _XL_SLOW_DOWN_FACTOR 0\n#endif\n\n#if defined(_XL_NO_SLEEP) || defined(__NO_SLEEP)\n\t#define _XL_SLOW_DOWN(t)\n#else\n\tvoid _XL_SLOW_DOWN(uint16_t t);\n#endif\n\n#endif // _SLEEP_MACROS\n\n"
  },
  {
    "path": "src/cross_lib/sound/ack/msdos86/msdos86_sounds.h",
    "content": "\r\n#ifndef _MSDOS86_SOUNDS\r\n#define _MSDOS86_SOUNDS\r\n\r\n\r\n\r\nextern void _speaker_beep(uint16_t freq, uint16_t length);\r\n\r\n#define __NOISE \r\n\r\n#if defined(__NOISE)\r\n\r\n    #define _speaker_noise(length) \\\r\n        do \\\r\n        { \\\r\n            uint16_t i; \\\r\n            \\\r\n            for(i=0;i<length;++i) \\\r\n            { \\\r\n                _speaker_beep((rand()+0x0B00)&0x0FFF,0x007F); \\\r\n            } \\\r\n        } while(0)\r\n\r\n    #define _XL_EXPLOSION_SOUND() _speaker_noise(0x03FF)\r\n\r\n    #define _XL_SHOOT_SOUND()     _speaker_noise(0x017F)\r\n\r\n#else\r\n    #define _XL_EXPLOSION_SOUND() _speaker_beep(893, 0x3FFF)\r\n    #define _XL_SHOOT_SOUND() _speaker_beep(993, 0x1FFF)\r\n#endif\r\n\r\n\r\n\r\n\r\n#define _XL_PING_SOUND()      _speaker_beep(1393, 0x1FFF)\r\n\r\n  \r\n\r\n\r\n#define _XL_TICK_SOUND()      _speaker_beep(1293, 0x1FFF)\r\n\r\n\r\n#define _XL_TOCK_SOUND()      _speaker_beep(1093, 0x1FFF)\r\n\r\n\r\n#define _XL_ZAP_SOUND()       _speaker_beep(1193, 0x3FFF)\r\n\r\n\r\n\r\n#endif // _MSDOS86_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/atari7800/atari7800_sounds.h",
    "content": "\r\n#ifndef _ATARI7800_SOUNDS\r\n#define _ATARI7800_SOUNDS\r\n\r\nextern unsigned char sfx_bling[];\r\nextern unsigned char sfx_explosion[];\r\nextern unsigned char sfx_poof1[];\r\nextern unsigned char sfx_poof2[];\r\nextern unsigned char sfx_powerup[];\r\nextern unsigned char sfx_quack[];\r\n\r\nextern void __fastcall__ playsfx0(unsigned char *);\r\n\r\n\r\n#define _XL_EXPLOSION_SOUND() playsfx0(sfx_explosion);\r\n\r\n\r\n#define _XL_PING_SOUND() playsfx0(sfx_bling);\r\n\r\n  \r\n#define _XL_SHOOT_SOUND() playsfx0(sfx_quack);\r\n\r\n\r\n#define _XL_TICK_SOUND() playsfx0(sfx_poof1);\r\n\r\n\r\n#define _XL_TOCK_SOUND() playsfx0(sfx_poof1);\r\n\r\n\r\n#define _XL_ZAP_SOUND() playsfx0(sfx_powerup);\r\n\r\n\r\n\r\n#endif // _ATARI7800_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/atari_lynx/atari_lynx_sounds.c",
    "content": "#include \"cross_lib.h\"\r\n\r\n#include \"atari_lynx_sounds.h\"\r\n\r\n// #include \"cross_lib.h\"\r\n\r\nextern void chibisound(unsigned char sound);\r\n\r\nvoid _play_frequency(uint16_t freq)\r\n{\r\n    uint16_t i;\r\n    \r\n    chibisound(127);\r\n    \r\n    chibisound(freq);\r\n\r\n    for(i=0;i<1000;++i){};\r\n    \r\n    chibisound(0);\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/atari_lynx/atari_lynx_sounds.h",
    "content": "\r\n#ifndef _ATARI_LYNX_SOUNDS\r\n#define _ATARI_LYNX_SOUNDS\r\n\r\nvoid _play_frequency(uint16_t freq);\r\n\r\n#define _XL_EXPLOSION_SOUND() _play_frequency(128+40)\r\n\r\n#define _XL_PING_SOUND() _play_frequency(60)\r\n  \r\n#define _XL_SHOOT_SOUND() _play_frequency(128+20)\r\n\r\n#define _XL_TICK_SOUND() _play_frequency(45)\r\n\r\n#define _XL_TOCK_SOUND() _play_frequency(25)\r\n\r\n#define _XL_ZAP_SOUND() _play_frequency(50)\r\n\r\n\r\n#endif // _ATARI_LYNX_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/atari_lynx/chibisound.asm",
    "content": ".include \"lynx.inc\"\r\n.export _chibisound\r\n.importzp\tsp\r\n\r\n.code\r\n\r\n.proc _chibisound\t\t\t; %NVPPPPPP\tN=Noise  V=Volume  P=Pitch\r\n\tcmp #0\r\n\tbeq silent\r\n\r\n\tpha\r\n\tand #%01000000\t\t\t; Mask for volume\t\t\r\n\tora #%00111111\r\n\tsta AUD0VOL   \t\t\t; Volume (127=max 0=min)\t\r\n\tpla \r\n\t\r\n\tpha\r\n\tand #%00111111\t\t\t; Mask for pitch\r\n\tsta AUD0BKUP\t\t\t; Effectively frequency\r\n\tpla\t\t\t\t\t\t\r\n\t\r\n\tand #%10000000\t\t\t; Noise Bit\r\n\tbeq nonoise\r\n\tlda #%11110000\t\t\t; 15 = Noise\r\n\tjmp noiseset\r\nnonoise:\t\r\n\tlda #%00010000\t\t\t; 1 = Good tone\r\nnoiseset:\r\n\tsta AUD0FEED\t\t\t; FFFFFFFF\tEffective sound of instrument\r\n\t\r\n\tstz AUD0SHIFT\t\t\t; SSSSSSSS\tShift Register L\r\n\tstz AUD0CTLB\t\t\t; SSSS-CBB\tS=Shift Register H, \r\n\t\t\t\t\t\t\t\t\t\t;C=Clock state B=Borrow\r\n\tstz MSTEREO\t\t\t\t; LLLLRRRR\tLR Vol - 0=all on 255=all off\r\n\r\n\tlda #$80\t\t\t\t; Silent\r\n\tsta AUD0OUT\t\t\t\t; Reset Audio Output Value \r\n\t\r\n\tlda #%00011110 \t\t\t; FTIRCKKK\tF=Feedback bit 7 , reset Timer done, \r\n\t\t\t\t\t\t\t; enable Integrate, enable Reload enable Count,\r\n\t\t\t\t\t\t\t; clock select\r\n\tsta AUD0CTLA\t\t\t; Audio Control bits\r\n\trts\r\n\t\r\nsilent:\r\n\tstz AUD0VOL\t\t\t\t; Volume (127=max 0=min)\r\n\trts\r\n\r\n.endproc"
  },
  {
    "path": "src/cross_lib/sound/cc65/atmos/atmos_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef __ATMOS_SOUNDS\n#define __ATMOS_SOUNDS\n\t#include <atmos.h>\n\t\n\t#define _XL_EXPLOSION_SOUND() atmos_explode();\n\t#define _XL_PING_SOUND() atmos_ping();\n\t#define _XL_SHOOT_SOUND() atmos_shoot();\n\t#define _XL_TICK_SOUND() atmos_tick();\n\t#define _XL_TOCK_SOUND() atmos_tock();\n\t#define _XL_ZAP_SOUND() atmos_zap();\n#endif // __ATMOS_SOUNDS"
  },
  {
    "path": "src/cross_lib/sound/cc65/c264/c264_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"c264_sounds.h\"\n\n#include <stdint.h>\n\nvoid _set_sound()\n{\n\tPOKE(SELECT,MAX_VOLUME+VOICE_1); \n\tPOKE(HI_FREQ_1,PEEK(HI_FREQ_1) & (255-3)); \t\n}\n\t\nvoid _pause(uint8_t length)\n{\n\tuint8_t i;\n\tfor(i=0;i<length;++i)\n\t{\n\t}\n}\n\t\nvoid _noise_sound(uint8_t type)\n\t{ \n\t\tuint8_t volume = 0; \n\n\t\tfor(;volume<=MAX_VOLUME;++volume) \n\t\t{ \n\t\t\t_pause(type);\n\t\t\tPOKE(SELECT,volume+NOISE); \n\t\t} \n\t\tPOKE(SELECT,128); \n\t};\t\n\n\nvoid _short_sound(uint8_t type) \n{ \n\t_set_sound();\n\tPOKE(LO_FREQ_1,type); \n\t_pause(type);\n\tPOKE(SELECT,128); \n};\n\n\n\nvoid _XL_ZAP_SOUND(void) \n{ \n\tuint8_t freq; \n\n\t_set_sound();\n\tfor(freq=100;freq<255;++freq) \n\t{ \n\t\t_pause(25);\n\t\tPOKE(LO_FREQ_1,freq); \n\t} \n\tPOKE(SELECT,128); \n};\t\n\n\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/c264/c264_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef __C264_SOUNDS\n#define __C264_SOUNDS\n    #if !defined(PEEK) && !defined(POKE)\n        #include<peekpoke.h>\n    #endif\n    \n    #include<stdint.h>\n\t\n\t#define NOISE 64\n\t#define VOICE_1 16\n\t#define MAX_VOLUME 15\n\t\n\t#define LO_FREQ_1 0xFF0E\n\t#define HI_FREQ_1 0xFF12\n\t#define SELECT 0xFF11 \n\t\n\tvoid _noise_sound(uint8_t type);\n\t\n\t#define _XL_EXPLOSION_SOUND() _noise_sound(220)\n\t\n\t#define _XL_SHOOT_SOUND() _noise_sound(160)\n\t\n\tvoid _short_sound(uint8_t freq);\n\t\n\t#define _XL_PING_SOUND() _short_sound(200)\n\t\n\t#define _XL_TOCK_SOUND() _short_sound(150)\n\t\n\t#define _XL_TICK_SOUND() _short_sound(250)\n\t\n\tvoid _XL_ZAP_SOUND(void);\n\t\t\n#endif // __C264_SOUNDS"
  },
  {
    "path": "src/cross_lib/sound/cc65/creativision/creativision_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _CREATIVISION_SOUNDS\r\n#define _CREATIVISION_SOUNDS\r\n\r\n#include <peekpoke.h>\r\n#include <creativision.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#include \"creativision_sounds.h\"\r\n\r\n\r\nvoid play_frequency(uint16_t value)\r\n{\r\n    psg_outb(value&0xFF); // Latch frequency\r\n    psg_outb((value&0xFF00)>>8); // Frequency byte 2\r\n    psg_outb(0x90); // Channel 0 full volume\r\n    psg_delay(900);\r\n    psg_silence();\r\n}\r\n\r\n\r\n\r\n#endif // _CREATIVISION_SOUNDS\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/creativision/creativision_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _GAMATE_SOUNDS\n#define _GAMATE_SOUNDS\n\nvoid play_frequency(uint16_t freq);\n\n#define _XL_EXPLOSION_SOUND() play_frequency(350)\n\n#define _XL_PING_SOUND() play_frequency(200)\n  \n#define _XL_SHOOT_SOUND() play_frequency(600)\n\n#define _XL_TICK_SOUND() play_frequency(80)\n\n#define _XL_TOCK_SOUND() play_frequency(90)\n\n#define _XL_ZAP_SOUND() play_frequency(1200)\n\n#endif // _GAMATE_SOUNDS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/cx16/cx16_sounds.c",
    "content": "\r\n#include \"cx16_sounds.h\"\r\n#include <cx16.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\n// VERA $1F9C0 - $1F9C3\r\n\r\n#define _FREQ_LO_REG  0x1F9C0\r\n#define _FREQ_HI_REG  0x1F9C1\r\n#define _VOLUME_REG   0x1F9C2\r\n#define _WAVE_REG     0x1F9C3\r\n\r\nvoid _play(uint16_t value)\r\n{\r\n    uint16_t i;\r\n    \r\n    vpoke(0xFF, _VOLUME_REG);\r\n    vpoke(value>>8, _FREQ_HI_REG);\r\n    vpoke(((value&0xFF00)>>8), _FREQ_LO_REG);\r\n    vpoke(0b00011111,_WAVE_REG);\r\n    for(i=0;i<5000;++i){};\r\n    // while(1){};\r\n    vpoke(0x00, _VOLUME_REG);\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/cx16/cx16_sounds.h",
    "content": "//VERA $1F9C0 - $1F9C3\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#ifndef _CX16_SOUNDS\r\n#define _CX16_SOUNDS\r\n\r\nvoid _play(uint16_t freq);\r\n\r\n#define _XL_EXPLOSION_SOUND() _play(3500U)\r\n\r\n#define _XL_PING_SOUND() _play(2000U)\r\n  \r\n#define _XL_SHOOT_SOUND() _play(6000U)\r\n\r\n#define _XL_TICK_SOUND() _play(8000U)\r\n\r\n#define _XL_TOCK_SOUND() _play(9000U)\r\n\r\n#define _XL_ZAP_SOUND() _play(1200U)\r\n\r\n#endif // _CX16_SOUNDS\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/gamate/gamate_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _GAMATE_SOUNDS\r\n#define _GAMATE_SOUNDS\r\n\r\n#include <peekpoke.h>\r\n#include <gamate.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#include \"gamate_sounds.h\"\r\n\r\n#define set_volume(value) \\\r\n    POKE(AUDIO_BASE+10,value)\r\n\r\n#define silence() set_volue(0)\r\n\r\nvoid play_frequency(uint16_t value)\r\n{\r\n    uint16_t i;\r\n    \r\n    set_volume(0xF);  \r\n    POKE(AUDIO_BASE+4,value&0xFF);\r\n    POKE(AUDIO_BASE+5,(value&0x0F00)>>8);\r\n    for(i=0;i<1200U;++i)\r\n    {\r\n    }\r\n    set_volume(0x0);\r\n}\r\n\r\n\r\n#endif // _GAMATE_SOUNDS\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/gamate/gamate_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _GAMATE_SOUNDS\n#define _GAMATE_SOUNDS\n\nvoid play_frequency(uint16_t value);\n\n#define _XL_EXPLOSION_SOUND() play_frequency(350)\n\n#define _XL_PING_SOUND() play_frequency(200)\n\n#define _XL_SHOOT_SOUND() play_frequency(600)\n\n#define _XL_TOCK_SOUND() play_frequency(90)\n\n#define _XL_TICK_SOUND() play_frequency(150)\n\n#define _XL_ZAP_SOUND() play_frequency(1200)\n\n#endif // _GAMATE_SOUNDS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/pet/pet_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _GAMATE_SOUNDS\r\n#define _GAMATE_SOUNDS\r\n\r\n#include <peekpoke.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#include \"pet_sounds.h\"\r\n\r\n\r\nvoid beep(uint8_t value)\r\n{\r\n    uint8_t i;\r\n    \r\n    POKE(SHIFT_REG, 15);\r\n    POKE(AUX_CTRL_REG,16);\r\n    POKE(TIMER_2_LOW,value);\r\n    for(i=0;i<100;++i){};\r\n    POKE(AUX_CTRL_REG,0);\r\n}\r\n\r\n\r\nvoid noise(uint8_t duration)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    POKE(SHIFT_REG,15);\r\n    POKE(AUX_CTRL_REG,16);\r\n    for(i=0;i<duration;++i)\r\n    {\r\n        POKE(TIMER_2_LOW,(uint8_t)rand()&0xFF);\r\n        for(j=0;j<8;++j){};\r\n    }\r\n    POKE(AUX_CTRL_REG,0);    \r\n}\r\n\r\n\r\nvoid _XL_ZAP_SOUND(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    POKE(SHIFT_REG, 15);\r\n    POKE(AUX_CTRL_REG,16);\r\n    for(i=255;i>0;--i)\r\n    {\r\n        POKE(TIMER_2_LOW,i);\r\n    }\r\n    POKE(AUX_CTRL_REG,0);\r\n}\r\n\r\n\r\n#endif // _GAMATE_SOUNDS\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/pet/pet_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _PET_SOUNDS\n#define _PET_SOUNDS\n\n#include <peekpoke.h>\n\n// Auxiliary control register (Free run)\n#define AUX_CTRL_REG 59467U\n\n// Timbre and octave\n#define SHIFT_REG 59466U\n\n// Period: Small -> high pitch\n#define TIMER_2_LOW 59464U\n#define TIMER_2_HIGH 59465U \n\nvoid beep(uint8_t freq);\nvoid noise(uint8_t duration);\n#define _XL_EXPLOSION_SOUND() noise(250)\n\n#define _XL_PING_SOUND() beep(90)\n  \n#define _XL_SHOOT_SOUND() noise(180)\n\n#define _XL_TICK_SOUND() beep(60)\n\n#define _XL_TOCK_SOUND() beep(220)\n\nvoid _XL_ZAP_SOUND(void);\n\n#endif // _GAMATE_SOUNDS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/pokey/pokey_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"pokey_sounds.h\"\n\n#include <stdint.h>\n\nvoid _explosion_sound(uint8_t freq)\n{\n    uint16_t i; \n    POKEY_WRITE.audctl = 0x00; \n    POKEY_WRITE.skctl = 2;\n    POKEY_WRITE.audf1 = freq; \n    POKEY_WRITE.audc1 = 0x07; \n    for(i=150;i>0;--i) \n    { \n        POKEY_WRITE.audc1 = i/10u; \n    } \n}\n\n\nvoid _ping_sound(uint8_t freq)\n{ \n    uint16_t i; \n    POKEY_WRITE.audctl = 0x00; \n    POKEY_WRITE.skctl = 2;\t\t\n    POKEY_WRITE.audf1 = freq; \n    POKEY_WRITE.audc1 = 0xA7; \n    for(i=700;i>0;--i) \n    { \n    } \n    POKEY_WRITE.audc1 = 0x00; \n};\n\n\nvoid _XL_ZAP_SOUND(void) \n{ \n    uint16_t i; \n    uint16_t j; \n    POKEY_WRITE.audctl = 0x00; \n    POKEY_WRITE.skctl = 2;\t\t\n    POKEY_WRITE.audf1 = 0x02;\n    POKEY_WRITE.audc1 = 0xA7; \n    for(i=0;i<100;++i) \n    { \n        for(j=0;j<50;++j) { } \n        POKEY_WRITE.audf1 = 100+i; \n    } \n    POKEY_WRITE.audc1 = 0x00; \n};\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/pokey/pokey_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _ATARI_SOUNDS\n#define _ATARI_SOUNDS\n\n    #include <stdint.h>\n    \n\t#if defined(__ATARI__)\n\t\t#include<atari.h>\n\t#else\n\t\t#include<atari5200.h>\n\t#endif\n\t\t\n\tvoid _ping_sound(uint8_t freq);\n\t#define _XL_PING_SOUND() _ping_sound(0xF0);\t\n\t#define _XL_TOCK_SOUND() _ping_sound(0x02);\n\t#define _XL_TICK_SOUND() _ping_sound(0x60);\n\t\n\tvoid _explosion_sound(uint8_t freq);\n\t#define _XL_SHOOT_SOUND() _explosion_sound(0xF0);\n\t#define _XL_EXPLOSION_SOUND() _explosion_sound(0x80);\n\t\n\tvoid _XL_ZAP_SOUND(void);\t\n\n#endif // _ATARI_SOUNDS\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/sid/sid_sounds.c",
    "content": "\n#include \"sid_sounds.h\"\n#include <stdint.h>\n\n#if defined(__MEGA65__)\n    #define SID SID1\n    #define _SOUND_DELAY 16\n#else\n    #define _SOUND_DELAY 1\n#endif\n\n#if !defined(_XL_NO_SOUND)\nvoid _set_noise(void)\n{\n\tSID.v3.ad    = 0x00; \n\tSID.v3.sr    = 0xA8; \n\tSID.flt_ctrl = 0x44; \n\tSID.amp      = 0x1F; \n\tSID.v3.ctrl  = 0x81;\n}\n\nvoid _short_sound(void)\n{\n\tuint16_t i;\n\n    #if defined(__MEGA65__)\n\tSID.v3.freq  = 0x1800; \n\tSID.v3.ad    = 0x00; \n\tSID.v3.sr    = 0xC8; \n\tSID.flt_ctrl = 0x44; \n\tSID.amp      = 0x1F; \n\tSID.v3.ctrl  = 0x21;\n    \n    for(i=0;i<253*_SOUND_DELAY;++i) \n\t{ \n\t\tSID.v3.freq+=8;\n\t}; \n    #else\n\tSID.v3.freq  = 0x2000; \n\tSID.v3.ad    = 0x00; \n\tSID.v3.sr    = 0xC8; \n\tSID.flt_ctrl = 0x44; \n\tSID.amp      = 0x1F; \n\tSID.v3.ctrl  = 0x21; \n    #endif\n\n\tfor(i=0;i<200*_SOUND_DELAY;++i) {};\n\tSID.amp      = 0x00; \n\tSID.v3.ctrl  = 0x08;\n}\n\nvoid _XL_SHOOT_SOUND(void) \n{ \n\tuint16_t i; \n\t\n    #if defined(__MEGA65__)\n\tSID.v3.freq  = 0x1800; \n\tSID.flt_freq = 0x3000; \n    #else\n\tSID.v3.freq  = 0x3000; \n\tSID.flt_freq = 0x9000; \n    #endif\n\t_set_noise();\n\t\n\tfor(i=0;i<800*_SOUND_DELAY;++i) {} \n\tSID.amp      = 0x00; \n\tSID.v3.ctrl  = 0x08; \n};\t\n\t\n\nvoid _XL_EXPLOSION_SOUND(void)\n{ \n\tuint16_t i; \n\tuint16_t j; \n\t\n\tSID.v3.freq  = 0x1200; \n\tSID.flt_freq = 0x2000; \n\n\t_set_noise();\n\t\n\tfor(i=0;i<300*_SOUND_DELAY;++i) \n\t\t{ \n\t\t} \n\tfor(j=0;j<15;++j) \n\t{ \n\t\tSID.amp      = 0x1F - j; \n\t\tfor(i=0;i<100*_SOUND_DELAY;++i) \n\t\t{ \n\t\t} \n\t} \n\tSID.amp      = 0x00; \n\tSID.v3.ctrl  = 0x08; \n};\n\n\nvoid _XL_PING_SOUND(void)\n{ \n\tSID.flt_freq = 0x3500; \n\t_short_sound();\n};\n\n\nvoid _XL_TICK_SOUND(void) \n{ \n\tSID.flt_freq = 0x2000; \n\t_short_sound();\n};\n\nvoid _XL_TOCK_SOUND(void) \n{\n\tSID.flt_freq = 0x1000; \n\t_short_sound();\n};\n\nvoid _XL_ZAP_SOUND(void) \n{ \n\tuint16_t i;\n\tuint8_t j;\n\t\n\tSID.v3.freq  = 0x6800; \n\tSID.v3.ad    = 0x88; \n\tSID.v3.sr    = 0xC8; \n\tSID.flt_freq = 0x5000; \n\tSID.flt_ctrl = 0x44; \n\tSID.amp      = 0x1F; \n\tSID.v3.ctrl  = 0x21; \n\t\n\tfor(i=0;i<253*_SOUND_DELAY;++i) \n\t{ \n\t\tSID.v3.freq+=8;\n\t\tfor(j=0;j<25;++j){};\n\t}; \n\n\tSID.amp      = 0x00; \n\tSID.v3.ctrl  = 0x08; \n};\n\n#endif // _XL_NO_SOUND"
  },
  {
    "path": "src/cross_lib/sound/cc65/sid/sid_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _SID_SOUNDS\n#define _SID_SOUNDS\n\n\t#if defined(__C64__)\n\t\t#include <c64.h>\n\t#elif defined(__C128__)\n\t\t#include <c128.h>\n    #elif defined(__MEGA65__)\n        #include <mega65.h>\n\t#else\n\t\t// TODO: USE pokebsys and pokewsys for the CBM510\n\t\t#include <cbm510.h>\n\t#endif\n\t\n    #if !defined(__XL_NO_SOUND)\n\tvoid _XL_EXPLOSION_SOUND(void);\n\t\n\tvoid _XL_PING_SOUND(void);\n\t\n\tvoid _XL_SHOOT_SOUND(void);\n\n\tvoid _XL_TICK_SOUND(void);\n\t\n\tvoid _XL_TOCK_SOUND(void);\n\t\n\tvoid _XL_ZAP_SOUND(void);\n    #endif\n#endif // SID_SOUNDS\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/supervision/reverse_engineered_notes.txt",
    "content": "\r\nSupervision Reverse Engineering Notes\r\n\r\nThis is a copy of http://blog.kevtris.org/blogfiles/Supervision_Tech.txt just to preserve it.\r\n\r\nSupervision Reverse Engineering Notes\r\n-------------------------------------\r\n\r\nKevin Horton\r\n12/20/2011\r\nV4.00\r\n\r\n\r\n\r\n\r\nThe Supervision is a Gameboy wanna-be.  It was sold and marketed in many countries, under many different names.  Here in the US, it was simply sold as the \"Supervision\".  The branding on it is \"Watara\", and it has a vaguely Gameboy-like look, but the screen can be angled up or down via a hinge below the display proper.\r\n\r\nThe top half contains the actual game hardware, a 160*160 LCD, the main PCB with a glop-top ASIC which is the \"brains\", and two 8K SRAMs.  The two 8K SRAMs are 6264's or equivelant, and are physically glop-tops on little tiny carrier boards.\r\n\r\nThe cartridges seem to support up to 128K byte ROMs, but as far as I know, the games were only as large as 64K bytes.  There are a few 4 in 1 multicarts which might be 128K bytes, but contain games that were previously released on separate carts.\r\n\r\nTo perform this reverse engineering, I made a special test system.  It is composed of a home made game cartridge, with a UART mapped into memory at 1FFE and 1FFF.  I cut the chip enable to the internal WRAM, and ran it through a circuit to pull out 1FFE/1FFF, which then ran the chip enable on the UART.  \r\n\r\nA simple \"bios\" was made that allowed me to read/write data to/from anywhere in memory.  This was then used to poke data into VRAM, poke registers, and all that fun stuff.  I used an HP 54645D mixed signal oscilloscope/logic analyzer.  I connected a test header to the VRAM and LCD control signals.  This was then used to poke at things on the system to figure out how it all works.\r\n\r\nSo that's the background, now onto the juicy technical details.\r\n\r\n---\r\n\r\nSystem Overview\r\n---------------\r\n\r\nThe device runs on a 4MHz resonator.  This resonator's not that great (mine was 1.35% off), so I replaced it with a 4MHz crystal.  I replaced to increase the accuracy which helped during reverse engineering on the logic analyzer.\r\n\r\nThere are not many parts in this system:\r\n\r\n* 65C02 CPU running at 4MHz\r\n* 8K of VRAM which the CPU can access with 0 wait states\r\n* 8K of WRAM which is connected to the CPU\r\n* audio amplifier\r\n* 160*160 monochrome LCD (see the LCD section)\r\n* speaker\r\n* cartridge port that can accept a single ROM, up to 128Kbytes\r\n\r\n---\r\n\r\nThe LCD system\r\n--------------\r\n\r\nThe LCD on the Supervision is a simple 160*160 dot 2 bpp monochrome LCD.  The LCD uses some tricks to load the data into it.  A full frame is composed of two fields.  Each field is 1 bit per pixel, so to show a full frame it takes two fields.\r\n\r\nframe:  p0 p1 p2 p3\r\n-------------------\r\n1       0  0  1  1\r\n2       0  1  0  1\r\n3       0  0  1  1\r\n4       0  1  0  1\r\n\r\np0 is an 'off' pixel.  It shows up as the lightest colour possible\r\np1 1/3rd darkness\r\np2 2/3rd darkness\r\np3 an 'on' pixel which is as dark as possible\r\n\r\nThe LCD is physically connected with 9 outputs from the ASIC.  \r\nIn order, they are:\r\n\r\n1 - Data 0\r\n2 - Data 1\r\n3 - Data 2\r\n4 - Data 3\r\n5 - Pixel Clock\r\n6 - Line Latch\r\n7 - Frame Latch\r\n8 - Frame Polarity/bright control\r\n9 - Power Control\r\n\r\nA diagram of how the LCD hardware works is probably in order.  The LCD on this system is not much different from other similar displays available from Optrex and other manufacturers. \r\n\r\n\r\nA block diagram of the LCD system looks like this:\r\n\r\n                   +---------------------------+\r\n      Pix clk(5)O--|Clock                      |\r\n       Data 0(1)O--|D0          CK LT PL       | \r\n       Data 1(2)O--|D1    4*40 bit shift reg   |\r\n       Data 2(3)O--|D2                         |\r\n       Data 3(4)O--|D3 0...            ...159  |\r\n                   +---------------------------+\r\n                     |                        |\r\n                     |                        |\r\n                   +---------------------------+\r\n                   |                           |\r\n     Line Lat(6)O--|Latch  160 bit latch       |\r\n     Polarity(8)O--|Pol                        |\r\n                   +---------------------------+ \r\n                     |                        |\r\n                     |       160 Columns      |\r\n                  +------------------------------+\r\n                  |                              |\r\n        +-----+   |                              |\r\nLL(6)O--|CK  0|---|                              |\r\nFL(7)O--|DT  .|   |                              |\r\nPL(8)O--|PL  .| 1 |                              |\r\n        |    .| 6 |          LCD Glass           |\r\n        |     | 0 |                              |\r\n        |     |   |                              |\r\n        |     | R |                              |\r\n        |     | o |                              |\r\n        |     | w |                              |\r\n        |     | s |                              |\r\n        |    .|   |                              |\r\n        |    .|   |                              |\r\n        |    .|   |                              |\r\n        |  159|---|                              |\r\n        +-----+   |                              |\r\n                  |                              |\r\n                  +------------------------------+\r\n\r\nThere are two shift registers.  Data is shifted into the column shift register 4 bits at a time. This is done simply to increase the speed at which data can be shifted in.  The shift register is pretty simple, and bits are arranged on the 160 pin outputs in sequence like so:\r\n\r\n01230123012301230123....  (0,1,2,3 = data bits 0-3).\r\n\r\nAfter 40 clocks (160 pixels:  40*4 = 160), the line latch signal is pulsed, which latches all 160 pixels into the columns of the LCD glass at the same time.\r\n\r\nThere is a second shift register that drives the rows of the LCD.  This shift register selects a single row to be enabled.  Its data input is connected to the frame latch signal:  It's pulsed high for 1 scanline, and on line latch's falling edge, it's clocked into the row shift register.\r\n\r\nThis enables the topmost scanline, and when it is enabled, the first row's pixel signals are simultaniously latched into the column drivers.  This \"lights up\" the uppermost row of pixels.\r\n\r\nThe next line latch signal then clocks the row shift register and simultaniously latches in new data into the columns to \"light up\" the second row of pixels, and so on.  This process repeats for all 160 scanlines, and repeats.\r\n\r\nThe frame polarity/bright control signal is toggled every field.  This inverts all the driver signals.  It also darkens the display a bit so you can get a true 2 bits per pixel. The polarity toggling is done to prevent destruction of the LCD display glass via electrolytic plating action.  (Incidentally, this is why you should never turn the Gameboy LCD off during rendering and you must turn it off in VBLANK).\r\n\r\nTiming\r\n------\r\n\r\nA single frame is composed of two fields.  A field is a complete scanning of the LCD.  There's two fields in each frame to effect the grey scale.\r\n\r\nEach field takes exactly 39360 cycles.  A complete frame is thus 2x that, or 78720 cycles.\r\nThere are 160 scanlines in each field, and each scanline takes 246 clocks to complete.  Thus, 246*160 = 39360, and 39360*2 = 78720.  With the 4MHz system clock, this means that there are 101.62 fields a second, or 50.81 frames a second.\r\n\r\nEach scanline is composed of 246 clocks.  There are 40 pixel writes to the LCD, and 1 latch write, for a total of 41 writes.  Each write period lasts 6 clock cycles, so 41*6 = 246 cycles.\r\n\r\nOn the following diagram, a clock cycle is 1 character cell. The \"clk cyc\" is a count of the phase of the LCD write hardware, which performs 1 write to the LCD every 6 clocks.  I have arbitrarily placed the pixel clock (which writes 4 pixels into the LCD shift register) on clock cycle 0.\r\n\r\nI have shown a line latch pulse on the diagram, too.  These pulses only occur every 246 clocks, and are what latch data into the LCD's output buffers from the LCD's input shift register.\r\n\r\nclk cyc  012345012345012345012345012345012345012345012345012345012345012345012345\r\npixclk   -_____-___________-_____-_____-_____-_____-_____-_____-_____-_____-_____\r\ndata 0-3 ====x=====x=====x=====x=====x=====x=====x=====x=====x=====x=====x=====x=\r\nline lat _____________-__________________________________________________________\r\n\r\n_ - a low signal\r\n- - a high signal\r\n= - data (high or low)\r\nx - transition point (where this signal CAN (but doesn't have to) change\r\n\r\nscanline timing:\r\n\r\n                |       field N            |      field N+1         | field N+2 ...\r\nframe lat ______-______________/___________-____________/___________-________\r\nframe pol ______---------------/-----------_____________/___________---------\r\n\r\nEach character cell is 1 scanline (246 clocks).  There are 160 scanlines represented on the diagram, with a / to indicate that part of the diagram has been removed for clarity.\r\n\r\nThat about wraps up LCD timing.  The LCD timing does not deviate from this set pattern, even when the CPU writes or reads from the VRAM.  \r\n\r\n\r\n---\r\n\r\nVRAM Timing\r\n-----------\r\n\r\nThe VRAM timing is very rigid and does not deviate, even during CPU reads or writes.  The RAM is simply addressed by the video hardware and sent out to the LCD.\r\n\r\nEvery 6 clocks, a new RAM location is accessed.  The address lines update every 6 cycles.  This corresponds neatly to the LCD output timing.  The way the data gets from the RAM to the LCD is very simple.  Data is read a byte at a time from the VRAM, and 4 bits of it are sent to the 4 LCD data lines.  Either D0/D2/D4/D6 or D1/D3/D5/D7 depending on which field it is.  The bits sent alternate this way every field to effect the 4 level greyscale.  Thus, every 2 bits of RAM correspond to a single pixel on the LCD.\r\n\r\nWhen the CPU reads or writes the VRAM, it simply inserts a single clock access.  This access can occur anywhere in the 6 cycle period.  The video controller seems to read the LCD data on all 6 clocks, and any clock where there is a CPU access, it simply doesn't read it.  This means that unless there's 6 writes or reads in a row from the CPU, it will always have valid display data.  During normal operation, there is no way there can be more than 1 write to VRAM at any one time. (An interrupt or JSR would do 3 or 2 respectively, but VRAM does not sit at 0100h so this can never occur). A fun test will be to execute code out of VRAM to see how the display reacts.\r\n\r\n---------------------------------------\r\n\r\n\r\nCartridge pinout:\r\n\r\n(taken from svision.txt from the Mess emulator documentation, updated by me.)\r\n\r\nCartridge connector (looking at the cartridge pins)\r\n            +-------+\r\n       /RD -| 1  40 |- +5v (picture side)\r\n        A0 -| 2  39 |- nc\r\n        A1 -| 3  38 |- nc\r\n        A2 -| 4  37 |- nc\r\n        A3 -| 5  36 |- nc\r\n        A4 -| 6  35 |- /WR\r\n        A5 -| 7  34 |- D0\r\n        A6 -| 8  33 |- D1 \r\n        A7 -| 9  32 |- D2\r\n        A8 -| 10 31 |- D3\r\n        A9 -| 11 30 |- D4\r\n       A10 -| 12 29 |- D5\r\n       A11 -| 13 28 |- D6\r\n       A12 -| 14 27 |- D7\r\n       A13 -| 15 26 |- nc\r\n       A14 -| 16 25 |- nc\r\n       A15 -| 17 24 |- nc\r\n       A16 -| 18 23 |- nc\r\n        nc -| 19 22 |- gnd\r\n        nc -| 20 21 |- power ground\r\n            +-------+\r\n\r\n* A0-A16 connect to A0-A16 on the ROM/EPROM\r\n* D0-D7 connect to D0-D7 on the ROM/EPROM\r\n* /RD connects to /CE or /OE (or both) on the EPROM\r\n* /WR is not used (but could be used to run a simple latch to effect more bankswitching)\r\n* power ground must be connected to gnd for the Supervision to turn on\r\n\r\nThat power ground input connects from the power source to ground on the rest of the console. The system will not power up without a cartridge installed.\r\n\r\n\r\n---------------------------------------\r\n\r\nASIC Pinout\r\n-----------\r\n\r\n\r\n 1 - VRAM D5\r\n 2 - VRAM D6\r\n 3 - VRAM D7\r\n 4 - VRAM /WR\r\n 5 - Dpad Right\r\n 6 - Dpad Left\r\n 7 - Dpad Down\r\n 8 - Dpad Up\r\n 9 - B Button\r\n10 - A Button\r\n11 - Select Button\r\n12 - Start Button\r\n13 - +5V\r\n14 - Audio Left Out\r\n15 - Audio Right Out\r\n16 - GND\r\n17 - CLK Out?\r\n18 - CPU D7\r\n19 - CPU D6\r\n20 - CPU D5\r\n21 - CPU D4\r\n22 - CPU D3\r\n23 - CPU D2\r\n24 - CPU D1\r\n\r\n25 - CPU D0\r\n26 - CPU A16\r\n27 - CPU A15\r\n28 - CPU A14\r\n29 - CPU A13\r\n30 - CPU A12\r\n31 - CPU A11\r\n32 - CPU A10\r\n33 - CPU A9\r\n34 - CPU A8\r\n35 - CPU A7\r\n36 - CPU A6\r\n37 - CPU A5\r\n38 - CPU A4\r\n39 - CPU A3\r\n40 - CPU A2\r\n\r\n41 - CPU A1\r\n42 - CPU A0\r\n43 - WRAM /CE\r\n44 - CPU R/W\r\n45 - CART /CE\r\n46 - NC\r\n47 - Link Port D0\r\n48 - Link Port D1\r\n49 - Link Port D2\r\n50 - Link Port D3\r\n51 - LCD 9\r\n52 - LCD 8\r\n53 - LCD 7\r\n54 - LCD 6\r\n55 - LCD 5\r\n56 - LCD 4\r\n57 - LCD 3\r\n58 - LCD 2\r\n59 - LCD 1\r\n60 - Xtal 2\r\n61 - Xtal 1\r\n62 - GND\r\n63 - VRAM A0\r\n64 - VRAM A1\r\n\r\n65 - VRAM A2\r\n66 - VRAM A3\r\n67 - VRAM A4\r\n68 - VRAM A5\r\n69 - VRAM A6\r\n70 - VRAM A7\r\n71 - VRAM A8\r\n72 - VRAM A9\r\n73 - VRAM A10\r\n74 - VRAM A11\r\n75 - VRAM A12\r\n76 - VRAM D0\r\n77 - VRAM D1\r\n78 - VRAM D2\r\n79 - VRAM D3\r\n80 - VRAM D4\r\n\r\n\r\n---------------------------------------\r\n\r\nThat's the basics of the hardware end.  Now for programming.\r\n\r\n\r\n\r\n2000 - LCD_X_Size\r\n2001 - LCD_Y_Size\r\n2002 - X_Scroll\r\n2003 - Y_Scroll\r\n2004 - Mirror of register 2000\r\n2005 - Mirror of register 2001\r\n2006 - Mirror of register 2002\r\n2007 - Mirror of register 2003\r\n2008 - DMA Source low\r\n2009 - DMA Source high\r\n200A - DMA Destination low\r\n200B - DMA Destination high\r\n200C - DMA Length\r\n200D - DMA Control\r\n200E\r\n200F\r\n2010 - CH1_Flow (Right only)\r\n2011 - CH1_Fhi\r\n2012 - CH1_Vol_Duty\r\n2013 - CH1_Length\r\n2014 - CH2_Flow (Left only)\r\n2015 - CH2_Fhi\r\n2016 - CH2_Vol_Duty\r\n2017 - CH2_Length\r\n2018 - CH3_Addrlow\r\n2019 - CH3_Addrhi\r\n201A - CH3_Length\r\n201B - CH3_Control\r\n201C - CH3_Trigger\r\n201D\r\n201E\r\n201F\r\n2020 - Controller\r\n2021 - Link port DDR\r\n2022 - Link port data\r\n2023 - IRQ Timer\r\n2024 - Reset IRQ timer flag\r\n2025 - Reset Sound DMA IRQ flag\r\n2026 - System Control\r\n2027 - IRQ Status\r\n2028 - CH4_Freq_Vol (Left and Right)\r\n2029 - CH4_Length\r\n202A - CH4_Control\r\n202B\r\n202C - Mirror of 2028\r\n202D - Mirror of 2029\r\n202E - Mirror of 202A\r\n202F\r\n\r\n----------------------------------------------------------\r\n\r\nAudio system\r\n------------\r\n\r\n2010, 2011, 2012, and 2013 correspond to channel 1 which is a square wave on right channel\r\n2014, 2015, 2016, and 2017 correspond to channel 2 which is a square wave on left channel\r\n2018, 2019, 201A, 201B, and 201C correspond to the DMA channel on both output channels\r\n2028, 2029, 202A correspond to channel 4 which is the noise wave on both output channels\r\n\r\nSquare waves:\r\n-------------\r\n\r\nCHx_Flow:\r\n7       0\r\n---------\r\nFFFF FFFF  \r\n\r\nF: lower 8 bits of frequency\r\n\r\nCHx_Fhi:\r\n7       0\r\n---------\r\n???? ?FFF\r\n\r\nF: Upper 3 bits of frequency\r\n\r\nCHx_Vol_Duty:\r\n7       0\r\n---------\r\n?EDD VVVV\r\n\r\nE: Enable. 1 = channel always produces sound.  0 = only plays when length reg is written\r\nD: Duty cycle:\r\n  00 - 12.5%\r\n  01 - 25%\r\n  10 - 50%\r\n  11 - 75%\r\nV: Volume. 0 = silent, F = loudest.  Linear.\r\n\r\nCHx_Length:\r\n7       0\r\n---------\r\nLLLL LLLL\r\n\r\nL: Length.  Writing to this register triggers the sound to play for L counts if bit 6 of CHx_Vol_Duty is cleared.  If that E bit is set, the length counter still runs, but it has no effect unless the E bit is cleared before the timer expires.\r\n\r\n---\r\n\r\nFrequency is calculated using the following formula:\r\n\r\n          125000\r\nFout =  ----------\r\n         (Freq+1)\r\n\r\nFreq is the concatenated value of the 8 lower bits and the 3 upper bits.\r\n\r\nWriting to EITHER frequency register resets the duty cycle prescaler, just like writing to Fhi does on the NES... only in this case, writing to either does it.\r\n\r\n---\r\n\r\nThe length counter works in increments of 16.384ms.  This value is gotten by taking the 4000000Hz clock divided by 65536 via a 16 bit prescaler.  \r\n\r\nThere is a 1 clock uncertainty in the length counter, because it's decremented each time the prescaler expires.  This prescaler is never reloaded or reset so the point where the length register is written determines the 1 count uncertainty.\r\n\r\nThe length count is simply L+1 * 65536 cycles, with up to 65535 extra cycles added on.  i.e.:\r\n\r\nIf L is loaded with 10,  then it will expire between (65536*11) counts and (65536*11+65535) counts.\r\n\r\n-------\r\n\r\nDMA Channel:\r\n------------\r\n\r\nCH3_Addrlow:\r\nCH3_Addrehi:\r\n7       0\r\n---------\r\nAAAA AAAA\r\n\r\nA: All 16 bits are the start address of the DMA audio channel.  Each register holds 8 bits.\r\n\r\nCH3_Length:\r\n7       0\r\n---------\r\nLLLL LLLL\r\n\r\nL: Length of the sample to play.  The sample length is L * 16 bytes.  For a length of 00h, 4096 samples will be played (100h * 16).\r\n\r\nCH3_Control:\r\n7       0\r\n---------\r\n?BBB LRFF\r\n\r\nB: ROM bank to use for pulling sample data\r\n   These bits determine what ROM bank will be mapped into 8000-BFFF for digi audio.\r\n   This overrides the bank bits on 2026, but only for digi audio.\r\nL: Output audio to left channel\r\nR: Output audio to right channel\r\nF: Playback frequency: (outputs a sample every...)\r\n   00 - 256 clocks\r\n   01 - 512 clocks\r\n   10 - 1024 clocks\r\n   11 - 2048 clocks\r\n\r\nThe RAM is read at 1/2 the rate samples are outputted.  The memory is read first, then the upper 4 bits are output to the DAC, and then the lower 4 bits are output, then the next byte is read, and the upper 4 bits of the next sample are output, etc.\r\n\r\n\r\nCH3_Trigger:\r\n7       0\r\n---------\r\nT??? ????\r\n\r\nT: Trigger the channel. Writing a 1 here will start the sample playing.\r\n\r\n\r\nNotes:\r\n\r\nWriting to the length and address registers set them.   When the channel is triggered, via CH3_Trigger, The registers are modified.  Thus, if the channel is triggered again, the address is not updated and points to the last address that was accessed.  Additionally, the length counter is 00h, and the channel plays a maximum length sample (4096 bytes).\r\n\r\n-------\r\n\r\nNoise Channel:\r\n--------------\r\n\r\nCH4_Freq_Vol:\r\n7       0\r\n---------\r\nFFFF VVVV\r\n\r\nV: Volume, 0 = silence, F = maximum,  linear stepping.\r\n\r\nF: Frequency:     Divisor:\r\n   0 - 500KHz     8\r\n   1 - 125KHz     32\r\n   2 - 62.5KHz    64\r\n   3 - 31.25KHz   128\r\n   4 - 15.625KHz  256\r\n   5 - 7.8125KHz  512\r\n   6 - 3.90625KHz 1024\r\n   7 - 1.953KHz   2048\r\n   8 - 976.56Hz   4096\r\n   9 - 488.28Hz   8192\r\n   A - 244.14Hz   16384\r\n   B - 122.07Hz   32768\r\n   C - 61.035Hz   65536\r\n   D - 30.52Hz    131072\r\n   E - 61.035Hz   65536\r\n   F - 30.52Hz    131072\r\n\r\n     4000000\r\nF = ---------\r\n     divisor\r\n\r\nThe frequency is how often (per second) that the noise LFSR is updated.  \r\n\r\nThe LFSR is 15 bits long, and is tapped at bits 14 and 15 to generate a maximal length shift register that repeats after 32767 counts.  Bit 0 of CH4_Noise_Con controls the length of the register.  When the bit is clear, the shift register is cut down to just 7 bits, and repeats after 127 counts.  \r\n\r\nCH4_Length:\r\n7       0\r\n---------\r\nLLLL LLLL\r\n\r\nL: Length to play noise.  Works identically to the square wave length register.\r\n\r\nCH4_Control:\r\n7       0\r\n---------\r\n???N LREP\r\n\r\nN: Noise Enable\r\nL: Left output. 1 - mix audio with left channel\r\nR: Right output. 1 - mix audio with right channel\r\nE: Channel Enable. 1 - enable noise channel continuously.  0 - use the length register\r\nP: LFSR length. 1 - 15 bit LFSR, 0 = 7 bit LFSR.\r\n\r\nWriting to this register resets the LFSR to all 1's.  Writing to the other noise registers do not reset the LFSR.  \r\n\r\n\r\nAudio Mixing:\r\n-------------\r\n\r\nAudio is mixed in an interesting fashion.  Each of the outputs (left and right) are only 4 bit DACs.  But each channel can output up to 3 different things.  (Square, noise, DMA).\r\n\r\nThe hardware simply adds all three together, and clips it at 0fh.  This means that if more than 1 channel is playing, they cannot be outputting the maximum level or else they can be clipped.  Kinda dumb and would result in weird things occuring as well as kinda poor audio output.\r\n\r\n----------------------------------------------------------\r\n\r\nController\r\n----------\r\n\r\n2020 - Controller\r\n\r\n\r\nNothing too special here.\r\n\r\nController:\r\n7       0\r\n---------\r\nSLAB UDLR\r\n\r\nS: Start button\r\nL: Select button\r\nA: A button\r\nB: B button\r\nU: Up on D-pad\r\nD: Down on D-pad\r\nL: Left on D-pad\r\nR: Right on D-pad\r\n\r\nPressing a button results in that bit going LOW.  Bits are high for buttons that are not pressed. (i.e. the register returns FFh when no buttons are pressed).\r\n\r\n----------------------------------------------------------\r\n\r\nLink Port\r\n---------\r\n\r\n2021 - Link port DDR\r\n2022 - Link port data\r\n\r\n\r\nPinout:\r\n\r\nThe link port is a male DB-9 connector.  The pinout is as follows (using standard DB-x pin notations as molded into the plugs/sockets)\r\n\r\n1 - D0\r\n2 - D1\r\n3 - D2\r\n4 - D3\r\n6 - ground\r\n8 - VCC\r\n\r\nAll other pins are NC.\r\n\r\n\r\nLink Port DDR:\r\n7       0\r\n---------\r\n???? DDDD\r\n\r\nD: Data direction bits for the link port.\r\n   0 - this is an output bit\r\n   1 - this is an input bit\r\n\r\nLink Port data:\r\n7       0\r\n---------\r\n???? LLLL\r\n\r\nL: Link port bits.\r\n   0 - output a low on this link port line.\r\n   1 - output a high on this link port line.\r\n\r\nWhen the link port line(s) are set as inputs, they float high via 30uA current sources.  The upper 4 bits on the link port data register returns open bus.\r\n\r\nI thought there was a UART on here to communicate on the link port, but it does not appear there is.\r\n\r\n\r\n\r\n----------------------------------------------------------\r\n\r\nDMA\r\n---\r\n\r\n2008 - DMA Source low\r\n2009 - DMA Source high\r\n200A - DMA Destination low\r\n200B - DMA Destination high\r\n200C - DMA Length\r\n200D - DMA Control\r\n\r\n\r\nCAUTION:  This DMA can only be used to move data from WRAM/cartridge ROM to VRAM!  Attempting to move data to a non-VRAM address will cause serious problems to occur. See my findings at the bottom of the document in the DMA timing section.\r\n\r\n\r\nDMA Source low/high:\r\n7       0\r\n---------\r\nSSSS SSSS\r\n   \r\n   S: Source address\r\n \r\nDMA Destination low/high:\r\n7       0\r\n---------\r\nDDDD DDDD\r\n\r\n   D: Destination address\r\n\r\nThese four registers select the source and destination addresses for the DMA unit.  \r\n\r\nDMA length:\r\n7       0\r\n---------\r\nLLLL LLLL\r\n\r\n   L: Length*16 (in bytes)\r\n\r\nThis register selects how many bytes of data to move.  The actual number of bytes to move is (L * 16).  If the register is loaded with 0, a full 4096 bytes is moved. \r\n\r\nAfter a DMA occurs, the registers are updated internally, and performing another DMA will cause a full 4096 bytes to be moved, because the length register now holds 00h.  The source/destination registers are incremented each transfer, and it will start transferring where it left off.\r\n\r\nDMA Control:\r\n7       0\r\n---------\r\nS??? ????\r\n\r\n   S: Start DMA when written with this bit set.\r\n\r\n\r\n\r\n\r\n\r\n----------------------------------------------------------\r\n\r\nInterrupts & Bankswitching & System Control\r\n-------------------------------------------\r\n\r\n2023 - IRQ Timer\r\n2024 - Reset IRQ timer flag\r\n2025 - Reset Sound DMA IRQ flag\r\n2026 - System Control\r\n2027 - IRQ Status\r\n\r\n\r\nNMI:\r\n\r\nThe NMI occurs every 65536 clock cycles (61.04Hz) regardless of the rate that the LCD refreshes. I find this interesting, because the LCD refresh is totally divorced from the NMI timing.  In fact, there is no way to know what the LCD is doing from software.\r\n\r\nSystem Control:\r\n7       0\r\n---------\r\nBBBS D?IN\r\n\r\n   B: Bank select bits for 8000-BFFF.\r\n   N: Enable the NMI (1 = enable)\r\n   I: Enable the IRQ (1 = enable)\r\n   S: IRQ Timer prescaler.  1 = divide by 16384, 0 = divide by 256\r\n   D: Display enable. 1 = enable display, 0 = disable display  \r\n\r\nWriting to this register resets the LCD rendering system and makes it start rendering from the upper left corner, regardless of the bit pattern.\r\n\r\nIRQ Timer:\r\n7       0\r\n---------\r\nTTTT TTTT\r\n\r\n   T: IRQ Timer.  Readable and writable.  \r\n\r\nWhen a value is written to this register, the timer will start decrementing until it is 00h, then it will stay at 00h.  When the timer expires, it sets a flag which triggers an IRQ.  This timer is clocked by a prescaler, which is reset when the timer is written to.  This prescaler can divide the system clock by 256 or 16384.  \r\n\r\nWriting 00h to the IRQ Timer register results in an instant IRQ. It does not wrap to FFh and continue counting;  it just stays at 00h and fires off an IRQ.\r\n\r\n\r\nIRQ Status:\r\n7       0\r\n---------\r\n???? ??DT\r\n\r\n   D: DMA Audio system (1 = DMA audio finished)\r\n   T: IRQ Timer expired (1 = expired)\r\n\r\nReset IRQ timer flag:\r\n7       0\r\n---------\r\n???? ????\r\n\r\nWhen this register is read, it resets the timer IRQ flag (clears the status reg bit too)\r\n\r\nReset Sound DMA IRQ flag:\r\n7       0\r\n---------\r\n???? ????\r\n\r\nWhen this register is read, it resets the audio DMA IRQ flag (clears status reg bit too)\r\n\r\n\r\nBankswitching\r\n-------------\r\n\r\nThe bankswitching on this system is very simple.  8000-FFFF is the cartridge ROM.  C000-FFFF is fixed to the last 16K bank of the game ROM.  8000-BFFF is selectable using the 3 bits on the System Control register.  0 = first 16K, 1 = second 16K, etc.\r\n\r\n\r\n\r\n----------------------------------------------------------\r\n\r\n\r\nLCD System\r\n----------\r\n\r\n2000 - LCD_X_Size\r\n2001 - LCD_Y_Size\r\n2002 - X_Scroll\r\n2003 - Y_Scroll\r\n2004 - Mirror of register 2000\r\n2005 - Mirror of register 2001\r\n2006 - Mirror of register 2002\r\n2007 - Mirror of register 2003\r\n\r\n\r\nFrame Timing Registers\r\n----------------------\r\n\r\n2000: LCD X size\r\n2001: LCD Y size\r\n\r\nLCD X and Y size control LCD refreshing.  All games program A0h / A0h into them since the LCD is 160*160 pixels.\r\n\r\nOnly the upper 6 bits of LCD_X_Size are usable, though.  The lower 2 bits are \"don't care\" bits, because the LCD size can only be changed in 4 pixel increments (due to the LCD loading 4 pixels at a time.  See the LCD hardware description above).\r\n\r\nChanging LCD_X_size simply changes how many pixclk pulses are output before line latch signal is output.  Frame timing changes of course, depending on how many clocks have been output.  Setting this to a value less than A0h results in some of the columns (in groups of four) NOT being refreshed.  On the system, the columns keep outputting what they were at the time the count was reduced.  So, if the LCD has a black square on it the width of the display and the rest is white, and if the count is reduced when the LCD is scanning the black rows, those columns on the right will be solid black.  If it was scanning the white area at the time, those columns will be solid white.  \r\n\r\nIncreasing it past A0h but less than C4h does not do anything visually;  the extra bits just shift out and are not displayed.  It does slow LCD timing down, however.  Increasing it past C3h does do something cool:  the LCD data is shown twice on the screen.  The reason for this is pretty simple.  Every scanline, the VRAM start address is bumped 30h.  This corresponds to 192 pixels.  So setting the count past 192 (C0h) results in it changing the VRAM start address increment size from 30h to 60h.\r\n\r\nChanging LCD_Y_Size controls how many scanlines are shown in the frame.  After the requisite number of scanlines, the LCD frame latch signal is output and the frame polarity line is toggled.  Normally, this is A0h for 160 lines.  Making this number larger reduces the LCD duty cycle since each row is on for 1/LCD_Y_Size of the time.  i.e. normally when it's set to A0h, each row is on for 1/160th of the time.  Making it larger reduces the duty cycle further and the display gets dimmer which means you have to advance the contrast knob to see it.  The frame rate also drops because of this.  \r\n\r\nDecreasing it below A0h results in a higher duty cycle which means the contrast knob has to be backed off because the whole screen gets darker.  This also has the negative effect of repeating the data on the display.  This is because more than 1 row driver output is on at a time now, so by necessity the bottom scanline(s) will now reflect what's happening at the top of the display.  This also increases the frame rate of the display.\r\n\r\nSo, to summerize.  Frame timing is calculated like this:   \r\n\r\nScanlinelen = ((LCD_X_Size & 0xFC) + 4) * 6\r\n\r\nXsize is anded with FCh because only the upper 6 bits are used, and +4 to account for the line latch pulse, and *6 due to each LCD clocking period taking 6 cycles.\r\n\r\nFramelen = Scanlinelen * LCD_Y_Size * 2\r\n\r\nFrame length is simply the number of scanlines * the Y_Size register.\r\n\r\n---\r\n\r\nScrolling:\r\n----------\r\n\r\n2002: X_scroll\r\n2003: Y_scroll\r\n\r\n\r\nX_scroll and Y_scroll are used to (as you might've guessed) scroll the display information.  The upper 6 bits of X_scroll control the starting offset of the VRAM buffer, and the lower 2 bits delay the bits going to the LCD by 0, 1, 2, or 3 clocks.  The chip actually reads data during the line load pulse to the LCD which reads the first byte of VRAM data.  This data is mostly sent through a 1 deep by 4 bit shift register, which is then run through a multiplexer to choose the appropriate 4 bits to send to the LCD.\r\n\r\nY_Scroll is another offset added to the VRAM pointer at the start of the frame.  It's Y_Scroll * 30h.  Since the chip adds 30h (and sometimes 60h, see below) each scanline, this makes sense.  The hardware also checks to make sure that you cannot display the last bit of VRAM, which would offset the pixels, because 48 byte scanlines do not exactly fill all 8K of VRAM.  The closest number is 170.  This leaves 20h bytes on the end which the hardware then skips. (most of the time.  You CAN make it display these.  see below)\r\n\r\nTesting:\r\n--------\r\n\r\nFirst, I am setting the LCD_Size registers both to A0h, which is how all games set them.\r\n\r\n\r\nX_scroll is set to 0, and Y_Scroll is set to AAh.  The display looks exactly like it does for a Y_Scroll value of 0, so this tells me the check occurs when the offset used to count through VRAM is updated (either loaded, or 30/60h are added).  Adjusting X_Scroll when Y_Scroll = AAh results in expected behaviour.  If X_Size is changed to a value greater than C3h, this test is still performed, but it might be skipped because of the hardware adding 60h each scanline instead of 30h.  The Y_Scroll still changes the inital offset the same way regardless of X_Size value.\r\n\r\nGoing by how this works, I can generate some pseudocode to reproduce the behaviour:\r\n\r\n// inputs\r\nint8  X_Scroll;    // X scroll register\r\nint8  Y_Scroll;    // Y scroll register\r\nint8  LCD_X_Size;  // X size register\r\nint8  LCD_Y_Size;  // Y size register\r\n\r\n// internal variables\r\nint16 Vstart;      // starting VRAM address for the scanline\r\nint16 Vtemp;       // temporary VRAM address that is incremented in the scanline\r\nint8  oldpix;      // stores the last 4 pixels read from VRAM\r\nint16 pixels;      // the current 4 pixels read, and the last 4 pixels read\r\nint8  outpixels;   // the 4 output pixels\r\nint8  X;           // X count\r\nint8  Y;           // Y count\r\n\r\n\r\nVstart = (Y_Scroll * 0x30) & 0x1FFF;      // initial V start value (limit to 8K size)\r\nif (Vstart == 0x1FE0) Vstart = 0;         // if it has wrapped, perform the wrap here\r\n\r\nfor (Y = 1; Y < LCD_Y_Size; Y++)\t\t// do Y_Size scanlines\r\n{\r\n    Vtemp = Vstart + (X_Scroll >> 2);\t// start address for this scanline\r\n    oldpix = buffer[Vtemp];\t\t\t// get the pipeline rolling\r\n    Vtemp++;\r\n    for (X = 1; X < (LCD_X_Size >> 2); X++)\r\n    {\r\n        pixels = (buffer[Vtemp] << 8) | oldpix;\t         // mingle old pixels from last read with new ones\r\n        outpixels = pixels >> ((X_Scroll & 0x03) << 1);  // get the correct 4 pixels (see below)\r\n        plotpixels(outpixels);                           // display them\r\n        oldpix = pixels >> 8;                            // move current pixels into old pixels\r\n        Vtemp++;\r\n    }\r\n    Vstart += ((LCD_X_size > 0xC3) ? 0x60 : 0x30) & 0x1FFF;  // add 30/60 and keep in 8K range\r\n    if (Vstart == 0x1FE0) Vstart = 0;\r\n}\r\n\r\n\"plotpixels\" is the routine that would plot 4 pixels to the display buffer or LCD or what have you.  The format of the data is simply 4 pixels packed into a byte.  bits 0/1 are one pixel, bits 2/3 are the next, and so on.\r\n\r\nThe above code does not take into account clearing/setting the unused pixels on the screen, but I don't think this has to be done for an emulator.\r\n\r\n----------------------------------------------------------\r\n\r\nDMA Timing\r\n----------\r\n\r\nA bunch of headers were soldered on and I connected up A0-A5 cart /CE, R/W, and my 1ffe/1fff decode output to the logic analyzer.\r\n\r\nchannel setup:\r\n--------------\r\n0-5 = A0-A5\r\n6   = cart /CE\r\n7   = 1FFE/1FFF decode\r\n8   = R/W\r\n\r\nTo test the DMA, I set the DMA start address to FFFF, destination address to 40FF, length to 1 and then started it up and recorded the results on the logic analyzer.\r\n\r\nTurns out that the DMA unit fails to operate properly, unless the destination is VRAM.  If the destination is not VRAM, the DMA fails, and ends up clobbering WRAM (if the read pointer is indexing it).  Attempting to DMA VRAM to VRAM causes corruption too, because the data is being overwritten.  \r\n\r\nThe DMA is extremely fast.  It copies 5 bytes to the VRAM every 6 clocks;  the 6th clock is for the LCD system to read VRAM for display.\r\n\r\nCopying continues until all bytes are copied.  On the idle cycle (every 6 clocks) the CPU is allowed to run for that cycle.\r\n\r\n\r\nAudio DMA Timing\r\n----------------\r\n\r\nNothing special here.   When the Audio DMA Trigger register is written to, a flag is set (I call it \"ADMA playing\").  The first 2 samples are fetched when the prescaler overflows.  The first sample (upper 4 bits of the byte) are then output.  After the prescaler expires again, the lower 4 bits of the byte are output.  After another prescaler expiration, the next byte is fetched, and so on until the complete sample is played.\r\n\r\nThe DMA fetch only takes a single cycle to perform.\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/supervision/supervision_sounds.c",
    "content": "#include <supervision.h>\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#include <peekpoke.h>\r\n\r\n// struct __sv_tone {\r\n    // unsigned            delay;   // Fhx_Flow and hi\r\n    // unsigned char       control; // Chx_Vol_duty\r\n    // unsigned char       timer; // Chx_Length\r\n// };\r\n// #define SV_RIGHT (*(struct __sv_tone*)0x2010)\r\n// #define SV_LEFT  (*(struct __sv_tone*)0x2014)\r\n\r\n// struct __sv_noise {\r\n    // unsigned char       volume;         /* and frequency */\r\n    // unsigned char       timer;\r\n    // unsigned char       control;\r\n// };\r\n// #define SV_NOISE (*(struct __sv_noise*)0x2028)\r\n\r\nvoid play_frequency(uint16_t value)\r\n{\r\n    SV_RIGHT.delay = 10000+value;\r\n    SV_LEFT.delay = 10000+value;\r\n    \r\n    SV_RIGHT.control = 0x3F;\r\n    SV_LEFT.control  = 0x3F;\r\n\r\n    SV_RIGHT.timer = 2;\r\n    SV_LEFT.timer = 2;\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/supervision/supervision_sounds.h",
    "content": "#ifndef _SUPERVISION_SOUNDS\r\n#define _SUPERVISION_SOUNDS\r\n\r\nvoid play_frequency(uint16_t value);\r\n\r\n#define _XL_EXPLOSION_SOUND() play_frequency(350)\r\n\r\n#define _XL_PING_SOUND() play_frequency(200)\r\n\r\n#define _XL_SHOOT_SOUND() play_frequency(600)\r\n\r\n#define _XL_TOCK_SOUND() play_frequency(90)\r\n\r\n#define _XL_TICK_SOUND() play_frequency(150)\r\n\r\n#define _XL_ZAP_SOUND() play_frequency(1200)\r\n\r\n#endif // _SUPERVISION_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/vic20/vic20_explosion_sound.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include<vic20.h>\n#include \"cross_lib.h\"\n#include \"vic20_explosion_sound.h\"\n\n#define FREQ 0x80\n#define VOL  0x08\n\n\tvoid _explosion_sound(void)\n\t{ \n\t\t// uint8_t i; \n\t\t// uint8_t j;\n\t\tVIC.noise = FREQ; \n\t\tVIC.volume_color |= VOL; \n\n\n        // for(i=0;i<254;++i) \n        // { \n        // }\n\n        _XL_SLOW_DOWN(100);\n\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n        // __asm__(\"NOP\");\n\t\tVIC.volume_color &= 0x00; \n\t};\t\n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/vic20/vic20_explosion_sound.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _VIC_SOUNDS\n#define _VIC_SOUNDS\n\n#include <stdint.h>\n\n\t#define _XL_PING_SOUND() _explosion_sound()\n\t#define _XL_TOCK_SOUND() _explosion_sound()\n\t#define _XL_TICK_SOUND() _explosion_sound()\n\t\n\tvoid _explosion_sound(void);\n\t#define _XL_SHOOT_SOUND() _explosion_sound()\n\t#define _XL_EXPLOSION_SOUND() _explosion_sound()\n\t\n\t#define _XL_ZAP_SOUND() _explosion_sound()\n\t\n#endif // _VIC_SOUNDS"
  },
  {
    "path": "src/cross_lib/sound/cc65/vic20/vic20_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include<vic20.h>\n\n#include <stdint.h>\n\n#include \"sleep_macros.h\"\n\n// #define _pause() _XL_SLOW_DOWN(100)\n\nvoid _pause(void)\n{\n    _XL_SLOW_DOWN(100);\n    // uint8_t i;\n    // for(i=0;i<254;++i) \n        // { \n        // } \t\t\t\n}\n\nvoid silence(void)\n{\n    VIC.noise = 0x00; \n    VIC.voice1 = 0x00;\n    VIC.volume_color = 0x00;    \n}\n\nvoid _explosion_sound(uint8_t freq, uint8_t duration)\n{ \n    uint8_t j;\n    VIC.noise = freq; \n    VIC.volume_color |= 15; \n\n    for(j=0;j<duration;++j) \n    { \n        _pause();\n    } \n    silence();\n};\t\n\nvoid _ping_sound(uint8_t freq)\n{ \n    VIC.voice1 = freq; \n    VIC.volume_color |= 0x08; \n    _pause();\n    silence();\n};\n\n\nvoid _XL_ZAP_SOUND() \n{ \n    uint8_t j;\n    VIC.volume_color |= 0x0B; \n    for(j=0;j<14;++j) \n    { \\\n        VIC.voice1 = j<<4;\n        _pause(); _pause();\n    } \\\n    silence();\n};\t\t\n\n    \n\n"
  },
  {
    "path": "src/cross_lib/sound/cc65/vic20/vic20_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _VIC_SOUNDS\n#define _VIC_SOUNDS\n#include <stdint.h>\n\n\tvoid _ping_sound(uint8_t freq);\n\t#define _XL_PING_SOUND() _ping_sound(0xF0);\t\n\t#define _XL_TOCK_SOUND() _ping_sound(0x08);\n\t#define _XL_TICK_SOUND() _ping_sound(0xC0);\t\n\t\n\tvoid _explosion_sound(uint8_t freq, uint8_t vol);\n\t#define _XL_SHOOT_SOUND() _explosion_sound(0x50, 0x0B);\n\t#define _XL_EXPLOSION_SOUND() _explosion_sound(0x80, 0x0F);\n\t\n\tvoid _XL_ZAP_SOUND();\n\t\n#endif // _VIC_SOUNDS\n\n"
  },
  {
    "path": "src/cross_lib/sound/gcc4ti99/ti99_sounds.c",
    "content": "\r\n#include \"cross_lib.h\"\r\n#include \"ti99_sounds.h\"\r\n\r\n#include <sound.h>\r\n\r\n\r\n// period must be in the range of 1 (highest pitch) to 1023 (lowest pitch)\r\nvoid CLICK(uint16_t duration, uint16_t period)\r\n{\r\n    volatile uint16_t i;\r\n   \r\n    SOUND=TONE1_VOL;\r\n    SOUND=TONE1_FREQ|(period&0xf);\r\n    SOUND=(period>>4)&0xff;\r\n   \r\n    for(i=0;i<duration;++i){};\r\n   \r\n    SOUND=TONE1_VOL|0x0F;\r\n}\r\n\r\n\r\n// For NOISE_MODE, you OR in the type of noise you want, from 0-7\r\nvoid NOISE(uint16_t duration, uint8_t mode) \r\n{\r\n    volatile uint16_t i;\r\n    volatile uint8_t j;\r\n    \r\n    SOUND=NOISE_VOL&0xF0;\r\n    SOUND=NOISE_MODE|mode;\r\n    \r\n    for(i=0;i<duration;++i){};\r\n    \r\n    for(i=0;i<16;++i)\r\n    {\r\n        SOUND=NOISE_VOL|i;\r\n        for(j=0;j<40;++j){};\r\n    }\r\n}\r\n\r\n\r\nvoid _XL_ZAP_SOUND(void)\r\n{\r\n    uint16_t i;\r\n    \r\n    for(i=1;i<29;++i)\r\n    {\r\n        CLICK(100-(i<<1),400+(i<<4));\r\n    }\r\n    SOUND=TONE1_VOL|0x0F;\r\n}\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/gcc4ti99/ti99_sounds.h",
    "content": "#ifndef  __TI99_SOUNDS\r\n#define  __TI99_SOUNDS\r\n\r\n#include <sound.h>\r\n\r\nvoid _XL_ZAP_SOUND();\r\n\r\nvoid NOISE(uint16_t duration, uint8_t mode);\r\n\r\nvoid CLICK(uint16_t duration, uint16_t period);\r\n\r\n#define _XL_EXPLOSION_SOUND() NOISE(1000,4)\r\n\r\n#define _XL_SHOOT_SOUND() NOISE(200,5)\r\n\r\n#define _XL_PING_SOUND() CLICK(550,900)\r\n\r\n#define _XL_TICK_SOUND() CLICK(450,700)\r\n\r\n#define _XL_TOCK_SOUND() CLICK(350,300)\r\n\r\n#endif // __TI99_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/generic/ascii_sounds.h",
    "content": "\r\n\r\n#ifndef  __ASCII_SOUNDS\r\n#define  __ASCII_SOUNDS\r\n\r\n#if defined(__MO5__) || defined(__TO7__)\r\n    #define BEEP_ASCII() PUTCH(7)\r\n#else\r\n    #define BEEP_ASCII() putchar('\\a')\r\n#endif\r\n\r\n#define _XL_EXPLOSION_SOUND() BEEP_ASCII()\r\n\r\n#define _XL_ZAP_SOUND() BEEP_ASCII()\r\n\r\n#define _XL_SHOOT_SOUND() BEEP_ASCII()\r\n\r\n#define _XL_PING_SOUND() BEEP_ASCII()\r\n\r\n#define _XL_TICK_SOUND() BEEP_ASCII()\r\n\r\n#define _XL_TOCK_SOUND() BEEP_ASCII()\r\n\r\n#endif // __ASCII_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/generic/bit_bang_sounds.c",
    "content": "\r\n#include \"cross_lib.h\"\r\n#include \"bit_bang_sounds.h\"\r\n\r\n// #if defined(__APPLE2__) || defined(__APPLE2ENH__)\r\n    // #define _click() \\\r\n        // __asm__(\"LDA $C030\")\r\n// #else\r\n\r\n#if defined(__APPLE2__) || defined(__APPLE2ENH__) || defined(__AGAT__)\r\n    void _click(void)\r\n    {\r\n        uint8_t k;\r\n        k = PEEK(BIT_BANG_ADDR);\r\n    }\r\n#elif defined(__MC10__)\r\n    void _click(void)\r\n    {\r\n        POKE(0xBFFF,0x80);\r\n        POKE(0xBFFF,0x00);\r\n    }\r\n#endif\r\n\r\n\r\nvoid _XL_ZAP_SOUND(void)\r\n{\r\n    uint16_t i;\r\n    uint8_t j;\r\n    \r\n    for(i=1;i<6;++i)\r\n    {\r\n        CLICK(50-i,i);\r\n        for(j=0;j<5;++j){};\r\n    }\r\n}\r\n\r\n\r\nvoid CLICK(uint16_t duration, uint8_t period) \r\n{\r\n    uint16_t i;\r\n    uint8_t j;\r\n    \r\n    for(i=0;i<duration;++i)\r\n    {\r\n        _click();\r\n        for(j=0;j<period;++j){};\r\n    }\r\n}\r\n\r\n\r\nvoid NOISE(uint16_t duration, uint8_t period) \r\n{\r\n    uint16_t i;\r\n    uint8_t j;\r\n    \r\n    for(i=0;i<duration;++i)\r\n    {\r\n\r\n        if(rand()&1)\r\n        {\r\n            _click();\r\n            for(j=0;j<period;++j){};\r\n        }\r\n    }\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/generic/bit_bang_sounds.h",
    "content": "#ifndef  __BIT_BANG_SOUNDS\r\n#define  __BIT_BANG_SOUNDS\r\n\r\n#if defined(__APPLE2__) || defined(__APPLE2ENH__) || defined(__AGAT__)\r\n    #define BIT_BANG_ADDR 0xC030\r\n    #define ROM_ADDR 0xD000\r\n#endif\r\n\r\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\r\n#define PEEK(addr)         (*(uint8_t*) (addr))\r\n\r\n//void _XL_INIT_SOUND(void);\r\n\r\nvoid CLICK(uint16_t duration, uint8_t period);\r\n\r\nvoid NOISE(uint16_t duration, uint8_t period);\r\n\r\nvoid _XL_ZAP_SOUND(void);\r\n\r\n#define _XL_EXPLOSION_SOUND() NOISE(75,6)\r\n\r\n#define _XL_SHOOT_SOUND() NOISE(100,3)\r\n\r\n#define _XL_PING_SOUND() CLICK(25,5)\r\n\r\n#define _XL_TICK_SOUND() CLICK(20,4)\r\n\r\n#define _XL_TOCK_SOUND() CLICK(15,3)\r\n\r\n#endif // __BIT_BANG_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/generic/dac_sounds.c",
    "content": "\r\n#include \"cross_lib.h\"\r\n#include \"dac_sounds.h\"\r\n\r\n#if defined(__COCO__) || defined(__DRAGON__)\r\nvoid _XL_INIT_SOUND(void)\r\n{\r\n    asm\r\n    {\r\n        LDA $FF01\r\n        ANDA #$F7\r\n        STA $FF01\r\n        LDA $FF03\r\n        ANDA #$F7\r\n        STA $FF03\r\n        LDA $FF23\r\n        ORA #8\r\n        STA $FF23\r\n    }\r\n}\r\n#elif defined(__COCO3__)\r\nvoid _XL_INIT_SOUND(void)\r\n{\r\n    asm\r\n    {\r\n        LDA $FF01\r\n        ANDA #$F7\r\n        STA $FF01\r\n        LDA $FF03\r\n        ANDA #$F7\r\n        STA $FF03\r\n        LDA $FF23\r\n        ORA #8\r\n        STA $FF23\r\n    }\r\n}\r\n#elif defined(__MO5__)\r\nvoid _XL_INIT_SOUND(void)\r\n{\r\n    asm \r\n    {\r\n        orcc #$50\r\n        lda $a7c0\r\n        anda #$fb\r\n        sta $a7c0\r\n        lda $a7cf\r\n        anda #$fb\r\n        sta $a7cf\r\n        lda #$3f\r\n        sta $a7cd\r\n        lda $a7cf\r\n        ora #$04\r\n        sta $a7cf\r\n        andcc #$af\r\n    }\r\n    // TODO: Remove this HACK to reset border color by fixing the Assembly code above\r\n    // #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n        // PUTCH(0x1B);PUTCH(103);\r\n    // #else\r\n        // PUTCH(0x1B);PUTCH(96);\r\n    // #endif\r\n}\r\n\r\n#elif defined(__TO7__)\r\nvoid _XL_INIT_SOUND(void)\r\n{\r\n    asm \r\n    {\r\n        orcc #$50\r\n        lda $e7c0\r\n        anda #$fb\r\n        sta $e7c0\r\n        lda $e7cf\r\n        anda #$fb\r\n        sta $e7cf\r\n        lda #$3f\r\n        sta $e7cd\r\n        lda $e7cf\r\n        ora #$04\r\n        sta $e7cf\r\n        andcc #$af\r\n    }\r\n}\r\n#endif\r\n\r\n\r\n\r\nvoid CLICK(uint8_t duration, uint8_t period) \r\n{\r\n    uint8_t i;\r\n    uint16_t j;\r\n    \r\n    for(i=0;i<duration;++i)\r\n    {\r\n        POKE(DAC,63<<SHIFT);\r\n        for(j=0;j<period;++j){};\r\n        POKE(DAC,0); \\\r\n        for(j=0;j<period;++j){};\r\n    }\r\n}\r\n\r\nvoid NOISE(uint8_t duration, uint16_t period) \r\n{\r\n    uint8_t i;\r\n    uint16_t j;\r\n    \r\n    for(i=0;i<duration;++i)\r\n    {\r\n        POKE(DAC,(63)<<SHIFT);\r\n        for(j=0;j<period;++j){};\r\n        POKE(DAC,PEEK(ROM_ADDR+i)); \\\r\n        for(j=0;j<period;++j){};\r\n    }\r\n    POKE(DAC,0);\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/generic/dac_sounds.h",
    "content": "#ifndef  __DAC_SOUNDS\r\n#define  __DAC_SOUNDS\r\n\r\n#if defined(__COCO__) || defined(__DRAGON__)\r\n    #define DAC 0xFF20\r\n    #define SHIFT 2\r\n    #define ROM_ADDR 0x8000\r\n\t\r\n\t#define CYCLES_FACTOR 1\r\n#elif defined(__COCO3__)\r\n    #define DAC 0xFF20\r\n    #define SHIFT 2\r\n    #define ROM_ADDR 0x8000\r\n\t\r\n\t#define CYCLES_FACTOR 1\r\n#elif defined(__MO5__)\r\n    #define DAC 0xA7CD\r\n    #define SHIFT 0\r\n    #define ROM_ADDR 0xE000\r\n\t\r\n\t#define CYCLES_FACTOR 1\r\n#elif defined(__TO7__)\r\n    #define DAC 0xE7CD\r\n    #define SHIFT 0\r\n    #define ROM_ADDR 0xF000\r\n\t\r\n\t#define CYCLES_FACTOR 1\r\n#endif\r\n\r\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\r\n#define PEEK(addr)         (*(uint8_t*) (addr))\r\n\r\nvoid _XL_INIT_SOUND(void);\r\n\r\nvoid CLICK(uint8_t duration, uint8_t period);\r\n\r\nvoid NOISE(uint8_t duration, uint16_t period);\r\n\r\n\r\n#define _XL_EXPLOSION_SOUND() NOISE(18*CYCLES_FACTOR,5)\r\n\r\n#define _XL_ZAP_SOUND() CLICK(15*CYCLES_FACTOR,65)\r\n\r\n#define _XL_SHOOT_SOUND() NOISE(9*CYCLES_FACTOR,10)\r\n\r\n#define _XL_PING_SOUND() CLICK(1*CYCLES_FACTOR,15)\r\n\r\n#define _XL_TICK_SOUND() CLICK(1*CYCLES_FACTOR,30)\r\n\r\n#define _XL_TOCK_SOUND() CLICK(1*CYCLES_FACTOR,50)\r\n\r\n#endif // __DAC_SOUNDS\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/lcc1802/comx/comx_sounds.c",
    "content": "#include \"comx_sounds.h\"\r\n#include \"standard_libs.h\"\r\n\r\n#if !defined(_XL_NO_SOUND)\r\n\r\nvoid _ping_sound(uint8_t freq)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    generatetone(freq,80,7);\r\n    \r\n    for(j=7;j>0;--j)\r\n    {\r\n        for(i=0;i<90;++i){};\r\n        generatetone(freq,80,j);\r\n    }\r\n    \r\n    generatetone(0,0,0);\r\n}\r\n\r\n\r\nvoid _explosion_sound(uint8_t range, uint8_t duration)\r\n{\r\n    uint16_t i;\r\n    uint8_t j;\r\n    \r\n    generatenoise(range,7);\r\n    \r\n    for(j=7;j>0;--j)\r\n    {\r\n        for(i=0;i<duration;++i)\r\n        {\r\n        }\r\n        generatenoise(range,j);\r\n    }\r\n    \r\n    generatenoise(0,0);\r\n}\r\n\r\n\r\nvoid _XL_ZAP_SOUND(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<40;++i)\r\n    {\r\n        generatetone(i/2,i,7);\r\n    }\r\n    generatetone(0,0,0);\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "src/cross_lib/sound/lcc1802/comx/comx_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _COMX_SOUNDS\r\n#define _COMX_SOUNDS\r\n\r\n#include <devkit/sound/vis_sound.h>\r\n\r\n#if !defined(_XL_NO_SOUND)\r\n    void _ping_sound(uint8_t freq);\r\n    \r\n\t#define _XL_PING_SOUND() _ping_sound(0x75)\r\n\t#define _XL_TOCK_SOUND() _ping_sound(0x20)\r\n\t#define _XL_TICK_SOUND() _ping_sound(0x45)\t\r\n\t\r\n    void _explosion_sound(uint8_t range, uint8_t duration);\r\n    \r\n\t#define _XL_SHOOT_SOUND() _explosion_sound(0x4,30)\r\n\t#define _XL_EXPLOSION_SOUND() _explosion_sound(0x2,80)\r\n\t\r\n\tvoid _XL_ZAP_SOUND(void);\r\n#else\r\n\t#define _XL_PING_SOUND() \r\n\t#define _XL_TOCK_SOUND() \r\n\t#define _XL_TICK_SOUND() \r\n\t\r\n    \r\n\t#define _XL_SHOOT_SOUND() \r\n\t#define _XL_EXPLOSION_SOUND() \r\n#endif\r\n#endif // _COMX_SOUNDS\r\n"
  },
  {
    "path": "src/cross_lib/sound/sound_macros.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#ifndef _SOUNDS_MACROS\n#define _SOUNDS_MACROS\n    #if !defined(_XL_NO_SOUND)\n        #  if defined(__BIT_BANG_SOUND)\n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif defined(__PSG_SOUND)\n            #include \"psg_sounds.h\"\n        #elif defined(ASCII_SOUNDS)\n            #define _XL_INIT_SOUND()\n            #include \"ascii_sounds.h\"\n        #elif defined(__TI99__) \n            #include \"ti99_sounds.h\"\n        #elif defined(__ACE__) \n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif (defined(__ATARI__) )\n            #include \"pokey_sounds.h\"\n        #elif defined(__ATARI5200__) \n            #include \"pokey_sounds.h\"\n        #elif defined(__ATMOS__) \n            #include \"atmos_sounds.h\"\n        #elif defined(__AQUARIUS__) \n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif defined(__BEE__) \n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif defined(__C16__) \n            #include \"c264_sounds.h\"\n        #elif defined(__C64__) \n            #include \"sid_sounds.h\"\n        #elif defined(__C128__) \n            #include \"sid_sounds.h\"\n        #elif defined(__CBM510__) \n            #include \"sid_sounds.h\"\n        // #elif defined(__COLECO__) \n            // #include \"psg_sounds.h\"\n        // #elif defined(__COLECO_ADAM__) \n            // #include \"psg_sounds.h\"\n        #elif (defined(__COMX__) || defined(__PECOM__) || defined(__TMC600__) || defined(__CIDELSA__)) \n            #include \"comx_sounds.h\"\n        #elif defined(__CPC__) \n            #include \"psg_sounds.h\"\n        #elif defined(__MC1000__) \n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif defined(__MSX__) \n            #include \"psg_sounds.h\"\n        #elif defined(__RX78__) \n            #include \"psg_sounds.h\"\n        #elif defined(__SPECTRUM__) \n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif defined(__SV8000__) \n            #include \"psg_sounds.h\"\n        #elif defined(__SVI__) \n            #include \"psg_sounds.h\"\n        #elif defined(__VG5K__) \n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif defined(__VIC20__) && !defined(__VIC20_UNEXPANDED) \n            #include \"vic20_sounds.h\"\n        #elif defined(__VIC20__) && defined(__VIC20_UNEXPANDED) \n            #include \"vic20_explosion_sound.h\"\n        #elif defined(__VZ__) \n            #include \"z88dk_bit_bang_sounds.h\"\n        #elif defined(__WINCMOC__) \n            #include \"wincmoc_sounds.h\"\n        #elif (defined(__COCO__) || defined(__DRAGON__))  \n            #include \"dac_sounds.h\"\n        #elif defined(__COCO3__)  \n            #include \"dac_sounds.h\"\n        #elif (defined(__MO5__) || defined(__TO7__)) \n            #include \"dac_sounds.h\"\n        #elif defined(__GAMATE__) \n            #include \"gamate_sounds.h\"\n        #elif defined(__CREATIVISION__) \n            #include \"creativision_sounds.h\"\n        #elif defined(__GB__) \n            #include \"gb_sounds.h\"\n        #elif (defined(__APPLE2__) || defined(__APPLE2ENH__) || defined(__AGAT__)) \n            #include \"bit_bang_sounds.h\"\n        #elif defined(__PET__) \n            #include \"pet_sounds.h\"\n        #elif defined(__ATARI_LYNX__)\n            #include \"atari_lynx_sounds.h\"\n        #elif defined(__MC10__) \n            #include \"bit_bang_sounds.h\"\n        #elif defined(__ATARI7800__) \n            #include \"atari7800_sounds.h\"\n        // #elif defined(__SUPERVISION__) \n            // #include \"supervision_sounds.h\"\n        #elif defined(__BBC__)\n            #include \"bbc_sounds.h\"\n        #else\n            #define _XL_NO_SOUND\n        #endif\n    #endif\n    \n    \n    #if defined(_XL_NO_SOUND)\n\t\t#define _XL_EXPLOSION_SOUND() \n\t\t#define _XL_PING_SOUND() \n\t\t#define _XL_SHOOT_SOUND() \n\t\t#define _XL_TICK_SOUND() \n\t\t#define _XL_TOCK_SOUND() \n\t\t#define _XL_ZAP_SOUND() \n\t#endif\n    \n    #if !defined(_XL_NO_SOUND) && (defined(__GB__) \\\n        || defined(__MO5__) || defined(__TO7__) || defined(__COCO3__) || defined(__COCO__) || defined(__DRAGON__) \\\n        || defined(__MSX__)) || defined(__PSG_SOUND)\n     // _XL_INIT_SOUND() needs to be defined\n\t void _XL_INIT_SOUND();\n    #else\n        #define _XL_INIT_SOUND()\n    #endif\n#endif // _SOUNDS_MACROS\n\n\n\n"
  },
  {
    "path": "src/cross_lib/sound/vbcc/bbc/bbc_sounds.c",
    "content": "#include \"bbc.h\"\r\n\r\nbbc_sound ping_snd =      {1,-15,100,2};\r\n\r\nbbc_sound tick_snd =      {1,-15,50,1};\r\nbbc_sound tock_snd =      {1,-15,30,1};\r\n\r\nbbc_sound shoot_snd =     {0,-15,40,1};\r\nbbc_sound explosion_snd = {0,-15,20,2};"
  },
  {
    "path": "src/cross_lib/sound/vbcc/bbc/bbc_sounds.h",
    "content": "#include \"bbc.h\"\r\n\r\nextern bbc_sound ping_snd;\r\nextern bbc_sound tick_snd;\r\nextern bbc_sound tock_snd;\r\nextern bbc_sound explosion_snd;\r\nextern bbc_sound shoot_snd;\r\n\r\n\r\n\r\n#define _XL_EXPLOSION_SOUND() OSSOUND(&explosion_snd)\r\n\r\n#define _XL_PING_SOUND() OSSOUND(&ping_snd)\r\n\r\n#define _XL_SHOOT_SOUND() OSSOUND(&shoot_snd)\r\n\r\n#define _XL_TICK_SOUND() OSSOUND(&tick_snd)\r\n\r\n#define _XL_TOCK_SOUND() OSSOUND(&tock_snd)\r\n\r\n#define _XL_ZAP_SOUND() OSSOUND(&ping_snd)\r\n"
  },
  {
    "path": "src/cross_lib/sound/z88dk/bit_bang/z88dk_bit_bang_sounds.h",
    "content": "/*****************************************************************************/\n/*                                                                           */\n/*                                \t\t                                     */\n/*                                                                           */\n/*                                                                           */\n/*                                                                           */\n/*                                                                           */\n/*                                                                           */\n/* (C) 2017      Fabrizio Caruso                                  \t\t     */\n/*                \t\t\t\t\t                                         */\n/*              \t\t\t\t                                             */\n/* EMail:        Fabrizio_Caruso@hotmail.com                                 */\n/*                                                                           */\n/*                                                                           */\n/* This software is provided 'as-is', without any expressed or implied       */\n/* warranty.  In no event will the authors be held liable for any damages    */\n/* arising from the use of this software.                                    */\n/*                                                                           */\n/* Permission is granted to anyone to use this software for any purpose,     */\n/* including commercial applications, and to alter it and redistribute it    */\n/* freely, subject to the following restrictions:                            */\n/*                                                                           */\n/* 1. The origin of this software must not be misrepresented; you must not   */\n/*    claim that you wrote the original software. If you use this software   */\n/*    in a product, an acknowledgment in the product documentation would be  */\n/*    appreciated but is not required.                                       */\n/* 2. Altered source versions must be plainly marked as such, and must not   */\n/*    be misrepresented as being the original software.                      */\n/* 3. This notice may not be removed or altered from any source              */\n/*    distribution.                                                          */\n/*                                                                           */\n/*****************************************************************************/\n\n/*\nbit_fx(0)\tShort hi-pitch decreasing \"gulp/fall\" sound\nbit_fx(1)\tFast increasing scale\nbit_fx(2)\tFast increasing squeak, mid duration, high pitch\nbit_fx(3)\tCrash sound, mid duration\nbit_fx(4)\tFast increasing squeak/jump, short duration\nbit_fx(5)\tShort two tones clackson sound\nbit_fx(6)\tTwo tones mid/high pitch bright beep\nbit_fx(7)\tMedium duration moving down, then up\n\nbit_fx2(0)\tSort of electronic synth, mid-low tone, mid duration\nbit_fx2(1)\tMid duration low tone, beating waves effect\nbit_fx2(2)\tQuick low pitch electronic buzz/noise\nbit_fx2(3)\tLong two tones truck clackson\nbit_fx2(4)\tTwo tones increasing sound, electr. fx, mid duration\nbit_fx2(5)\tTwo tones bounce sound\nbit_fx2(6)\tAlt. two tones bounce sound\nbit_fx2(7)\tLong low explosion sound\n\nbit_fx3(0)\tQuick noisy high pitch buzz / break noise\nbit_fx3(1)\tLonger very noisy high pitch buzz\nbit_fx3(2)\tVery quick low electronic noise / explosion / drum\nbit_fx3(3)\tShort low explosion sound\nbit_fx3(4)\tElectronic zap, mid duration\nbit_fx3(5)\tNoisy high pitch short increasing sound\nbit_fx3(6)\tLow level noise (AM radio noise)\nbit_fx3(7)\tQuick high pitch tremolo sound\n\nbit_fx4(0)\tVery quick squeaky sound\nbit_fx4(1)\tTape rewind effect, long duration\nbit_fx4(2)\tFast squeak/bounce/duck sound\nbit_fx4(3)\tFall-down, mid duration\nbit_fx4(4)\tHigh pitch fall-down sound, long duration\nbit_fx4(5)\tShort high pitch slightly noisy decreasing sound\nbit_fx4(6)\tShort jump sound\nbit_fx4(7)\tVery quick duck squeak\n\nextern void __LIB__ bit_beep(int duration, int period) __smallc;\n*/\n\n#ifndef __BIT_BANG_SOUNDS\n#define __BIT_BANG_SOUNDS\n\t#include <sound.h>\n\t\n\t// TODO: Remove these HACKS\n\t#if defined(__ACE__) \n\t\t#define _XL_EXPLOSION_SOUND() bit_fx3(3)\n\t#elif defined(__MC1000__)\n\t\t#define _XL_EXPLOSION_SOUND() bit_fx(1)\n\t#elif defined(__SC3000__)\n\t\t#define _XL_EXPLOSION_SOUND() bit_fx3(3)\n\t#else\n\t\t#define _XL_EXPLOSION_SOUND() bit_fx3(0) // TODO: Improve this sound\n\t#endif\n\t\n\t// TODO: Remove these HACKS\n\t#if defined(__M5__) || defined(__SC3000__)\n\t\t#define _XL_ZAP_SOUND() bit_fx3(0)\n\t\t#define _XL_SHOOT_SOUND() bit_fx3(0)\n\t#else\n\t\t#define _XL_ZAP_SOUND() bit_fx(7)\n\t\t#define _XL_SHOOT_SOUND() bit_fx3(2)\n\t#endif\n\t#define _XL_PING_SOUND() bit_beep(70,3)\n\t// bit_fx3(3)\n\t// bit_beep(40,20)\n\n\t#define _XL_TICK_SOUND() bit_beep(20,20)\n\t// bit_fx(0)\n\t// bit_beep(40,40)\n\t\n\t#define _XL_TOCK_SOUND() bit_beep(20,40)\n\n#endif // __BIT_BANG_SOUNDS\n\n"
  },
  {
    "path": "src/cross_lib/sound/z88dk/gb/gb_sounds.c",
    "content": "// see https://github.com/bwhitman/pushpin/blob/master/src/gbsound.txt\r\n// chanel 1 register 0, Frequency sweep settings\r\n// 7\tUnused\r\n// 6-4\tSweep time(update rate) (if 0, sweeping is off)\r\n// 3\tSweep Direction (1: decrease, 0: increase)\r\n// 2-0\tSweep RtShift amount (if 0, sweeping is off)\r\n// 0001 0110 is 0x16, sweet time 1, sweep direction increase, shift ammount per step 110 (6 decimal)\r\n// NR10_REG = 0x16; \r\n\r\n// chanel 1 register 1: Wave pattern duty and sound length\r\n// Channels 1 2 and 4\r\n// 7-6\tWave pattern duty cycle 0-3 (12.5%, 25%, 50%, 75%), duty cycle is how long a quadrangular  wave is \"on\" vs \"of\" so 50% (2) is both equal.\r\n// 5-0 sound length (higher the number shorter the sound)\r\n// 01000000 is 0x40, duty cycle 1 (25%), wave length 0 (long)\r\n// NR11_REG = 0x40;\r\n\r\n// chanel 1 register 2: Volume Envelope (Makes the volume get louder or quieter each \"tick\")\r\n// On Channels 1 2 and 4\r\n// 7-4\t(Initial) Channel Volume\r\n// 3\tVolume sweep direction (0: down; 1: up)\r\n// 2-0\tLength of each step in sweep (if 0, sweeping is off)\r\n// NOTE: each step is n/64 seconds long, where n is 1-7\t\r\n// 0111 0011 is 0x73, volume 7, sweep down, step length 3\r\n// NR12_REG = 0x73;  \r\n\r\n// chanel 1 register 3: Frequency LSbs (Least Significant bits) and noise options\r\n// for Channels 1 2 and 3\r\n// 7-0\t8 Least Significant bits of frequency (3 Most Significant Bits are set in register 4)\r\n// NR13_REG = 0x00;   \r\n\r\n// chanel 1 register 4: Playback and frequency MSbs\r\n// Channels 1 2 3 and 4\r\n// 7\tInitialize (trigger channel start, AKA channel INIT) (Write only)\r\n// 6\tConsecutive select/length counter enable (Read/Write). When \"0\", regardless of the length of data on the NR11 register, sound can be produced consecutively.  When \"1\", sound is generated during the time period set by the length data contained in register NR11.  After the sound is ouput, the Sound 1 ON flag, at bit 0 of register NR52 is reset.\r\n// 5-3\tUnused\r\n// 2-0\t3 Most Significant bits of frequency\r\n// 1100 0011 is 0xC3, initialize, no consecutive, frequency = MSB + LSB = 011 0000 0000 = 0x300\r\n// NR14_REG = 0xC3;\t\r\n\r\n#include \"standard_libs.h\"    \r\n\r\n#include \"gb_sounds.h\"\r\n#include <gb/gb.h>\r\n\r\n\r\nvoid _XL_INIT_SOUND(void)\r\n{\r\n    NR52_REG = 0x80;\r\n    NR50_REG = 0x77;\r\n    NR51_REG = 0xFF;\r\n}\r\n\r\n\r\nvoid _XL_ZAP_SOUND(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    NR10_REG = 0x36;\r\n    NR11_REG = 0x4F;\r\n    NR12_REG = 0x73;\r\n    NR13_REG = 0x80;\r\n    NR14_REG = 0xC4;\r\n    for(i=0;i<0x80;++i)\r\n    {\r\n        NR13_REG = 0x80+i;\r\n        for(j=0;j<8;++j)\r\n        {\r\n        }\r\n    }\r\n}\r\n\r\nvoid sound(uint8_t freq_msb)\r\n{\r\n    NR10_REG = 0x16;\r\n    NR11_REG = 0x4F;\r\n    NR12_REG = 0x73;\r\n    NR13_REG = 0x00;\r\n    NR14_REG = 0xC0 | freq_msb;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "src/cross_lib/sound/z88dk/gb/gb_sounds.h",
    "content": "/*****************************************************************************/\n/*                                                                           */\n/*                                \t\t                                     */\n/*                                                                           */\n/*                                                                           */\n/*                                                                           */\n/*                                                                           */\n/*                                                                           */\n/* (C) 2017      Fabrizio Caruso                                  \t\t     */\n/*                \t\t\t\t\t                                         */\n/*              \t\t\t\t                                             */\n/* EMail:        Fabrizio_Caruso@hotmail.com                                 */\n/*                                                                           */\n/*                                                                           */\n/* This software is provided 'as-is', without any expressed or implied       */\n/* warranty.  In no event will the authors be held liable for any damages    */\n/* arising from the use of this software.                                    */\n/*                                                                           */\n/* Permission is granted to anyone to use this software for any purpose,     */\n/* including commercial applications, and to alter it and redistribute it    */\n/* freely, subject to the following restrictions:                            */\n/*                                                                           */\n/* 1. The origin of this software must not be misrepresented; you must not   */\n/*    claim that you wrote the original software. If you use this software   */\n/*    in a product, an acknowledgment in the product documentation would be  */\n/*    appreciated but is not required.                                       */\n/* 2. Altered source versions must be plainly marked as such, and must not   */\n/*    be misrepresented as being the original software.                      */\n/* 3. This notice may not be removed or altered from any source              */\n/*    distribution.                                                          */\n/*                                                                           */\n/*****************************************************************************/\n\n\n\n#ifndef __GB_SOUNDS\n#define __GB_SOUNDS\n\n#include <gb/gb.h>\n\n#include \"standard_libs.h\"\n\n// NR52_REG = 0x80; is 1000 0000 in binary and turns on sound\n// NR50_REG = 0x77; sets the volume for both left and right channel just set to max 0x77\n// NR51_REG = 0xFF; is 1111 1111 in binary, select which chanels we want to use in this case all of them. One bit for the L one bit for the R of all four channels\n\n\n\n// see https://github.com/bwhitman/pushpin/blob/master/src/gbsound.txt\n// chanel 1 register 0, Frequency sweep settings\n// 7\tUnused\n// 6-4\tSweep time(update rate) (if 0, sweeping is off)\n// 3\tSweep Direction (1: decrease, 0: increase)\n// 2-0\tSweep RtShift amount (if 0, sweeping is off)\n// 0001 0110 is 0x16, sweet time 1, sweep direction increase, shift ammount per step 110 (6 decimal)\n// NR10_REG = 0x16; \n\n// chanel 1 register 1: Wave pattern duty and sound length\n// Channels 1 2 and 4\n// 7-6\tWave pattern duty cycle 0-3 (12.5%, 25%, 50%, 75%), duty cycle is how long a quadrangular  wave is \"on\" vs \"of\" so 50% (2) is both equal.\n// 5-0 sound length (higher the number shorter the sound)\n// 01000000 is 0x40, duty cycle 1 (25%), wave length 0 (long)\n// NR11_REG = 0x40;\n\n// chanel 1 register 2: Volume Envelope (Makes the volume get louder or quieter each \"tick\")\n// On Channels 1 2 and 4\n// 7-4\t(Initial) Channel Volume\n// 3\tVolume sweep direction (0: down; 1: up)\n// 2-0\tLength of each step in sweep (if 0, sweeping is off)\n// NOTE: each step is n/64 seconds long, where n is 1-7\t\n// 0111 0011 is 0x73, volume 7, sweep down, step length 3\n// NR12_REG = 0x73;  \n\n// chanel 1 register 3: Frequency LSbs (Least Significant bits) and noise options\n// for Channels 1 2 and 3\n// 7-0\t8 Least Significant bits of frequency (3 Most Significant Bits are set in register 4)\n// NR13_REG = 0x00;   \n\n// chanel 1 register 4: Playback and frequency MSbs\n// Channels 1 2 3 and 4\n// 7\tInitialize (trigger channel start, AKA channel INIT) (Write only)\n// 6\tConsecutive select/length counter enable (Read/Write). When \"0\", regardless of the length of data on the NR11 register, sound can be produced consecutively.  When \"1\", sound is generated during the time period set by the length data contained in register NR11.  After the sound is ouput, the Sound 1 ON flag, at bit 0 of register NR52 is reset.\n// 5-3\tUnused\n// 2-0\t3 Most Significant bits of frequency\n// 1100 0011 is 0xC3, initialize, no consecutive, frequency = MSB + LSB = 011 0000 0000 = 0x300\n// NR14_REG = 0xC3;\t\n\n\n\nvoid sound(uint8_t freq_msb);\n\n#define _XL_EXPLOSION_SOUND() sound(1)\n\n//#define _XL_ZAP_SOUND() sound(6)\n\nvoid _XL_ZAP_SOUND(void);\n\n#define _XL_SHOOT_SOUND() sound(2);\n \n#define _XL_PING_SOUND() sound(5);\n \n#define _XL_TICK_SOUND() sound(4);\n \n#define _XL_TOCK_SOUND() sound(3);\n \n#endif // __GB_SOUNDS\n\n"
  },
  {
    "path": "src/cross_lib/sound/z88dk/psg/ay-3-8910_psg_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n\n#if !defined(_XL_NO_SOUND)\n\n#include \"psg_sounds.h\"\n#include <psg.h>\n\n#include <stdint.h>\n\n// PSG code for AY-3-8910\n\n\n/*\nR0\tChannel A Period\tpa7\tpa6\tpa5\tpa4\tpa3\tpa2\tpa1\tpa0\nR1\t-\t-\t-\t-\tpaB\tpaA\tpa9\tpa8\nR2\tChannel B Period\tpb7\tpb6\tpb5\tpb4\tpb3\tpb2\tpb1\tpb0\nR3\t-\t-\t-\t-\tpbB\tpbA\tpb9\tpb8\nR4\tChannel C Period\tpc7\tpc6\tpc5\tpc4\tpc3\tpc2\tpc1\tpc0\nR5\t-\t-\t-\t-\tpcB\tpcA\tpc9\tpc8\nR6\tNoise Tone\t-\t-\t-\tn4\tn3\tn2\tn1\tn0\nR7\t/Enable\tPort B Dir.\tPort A Dir.\tC Noise\tB Noise\tA Noise\tC Tone\tB Tone\tA Tone\nR8\tChannel A Volume\t-\t-\t-\tA Mode\tva3\tva2\tva1\tva0\nR9\tChannel B Volume\t-\t-\t-\tB Mode\tvb3\tvb2\tvb1\tvb0\nR10\tChannel C Volume\t-\t-\t-\tC Mode\tvc3\tvc2\tvc1\tvc0\nR11\tEnvelope Period\tep7\tep6\tep5\tep4\tep3\tep2\tep1\tep0\nR12\tepF\tepE\tepD\tepC\tepB\tepA\tep9\tep8\nR13\tEnvelope Wave Shape\t-\t-\t-\t-\tes3\tes2\tes1\tes0\nR14\tI/O Port A\tCas\nInput\tKbd\nMode\tJoy\nTrg.B\tJoy\nTrg.A\tJoy\nRight\tJoy\nLeft\tJoy\nBack\tJoy\nFwd\nR15\tI/O Port B\tKana\nLED\tJoy\nSel\tPulse\n2\tPulse\n1\t1\t1\t1\t1\n\n*/\n\n\n#define A_PERIOD_LOW 0\n#define A_PERIOD_HI 1\n\n#define B_PERIOD_LOW 2\n#define B_PERIOD_HI 3\n\n#define C_PERIOD_LOW 4\n#define C_PERIOD_HI 5\n\t\n#define NOISE 6\n#define CONTROL 7\n\n#define A_VOLUME 8\n#define B_VOLUME 9\n#define C_VOLUME 10\n\t\n#define ENV_PERIOD_LOW 11\n#define ENV_PERIOD_HI 12\n\n#define ENV_WAVE 13\n\n\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\n\nvoid _XL_INIT_SOUND(void)\n{\n    #if defined(__MSX__)\n    POKE(0xF3DB,0);\n    #endif\n    psg_init();\n}\n\n\n\n#if defined(__CPC__)\n\t#define SAFE_PORT_A_DIRECTION 0x40\n#else\n\t#define SAFE_PORT_A_DIRECTION 0x00\n#endif\n\n\nvoid _XL_ZAP_SOUND(void) \n{\n\tuint8_t i;\n\tuint8_t j;\n\t\n\tset_psg(A_VOLUME,15);\n\tset_psg(A_PERIOD_LOW,255);\n\t\n\tset_psg(A_PERIOD_HI, 15);\n\t\n\tset_psg(CONTROL, 0xFF  - 0x01 - SAFE_PORT_A_DIRECTION);\n\t\n\tfor(i=0;i<16;i++)\n\t{\n\t\tset_psg(A_PERIOD_HI,15-i);\t\t\n\t\tfor(j=0;j<150U;++j)\n\t\t{\n\t\t}\n\t}\n\t\n\tset_psg(A_VOLUME,0);\t\t\n}\n\n\nvoid _ping_sound(uint8_t freq)\n{ \n\tuint8_t i;\n\t\n\tset_psg(A_VOLUME,15);\n\tset_psg(A_PERIOD_LOW,255);\n\t\n\tset_psg(A_PERIOD_HI, 15 - (freq>>4));\t\t\n\n\tset_psg(CONTROL, 0xFF - 0x01 - SAFE_PORT_A_DIRECTION); // -0x40 is necessary for the CPC\n\t\n\tfor(i=0;i<250U;++i)\n\t{\n\t}\n\tfor(i=0;i<250U;++i)\n\t{\n\t}\n\t\t\n\tset_psg(A_VOLUME,0);\n}\t\t\t\n\n\nvoid _explosion_sound(uint8_t freq)\n{ \n\tuint8_t i;\n\t// uint8_t j;\n\t\n\tset_psg(NOISE,15);\n\tset_psg(A_VOLUME,15);\n\t\n\tset_psg(A_PERIOD_LOW,0);\n\tset_psg(A_PERIOD_HI, 15 - (freq>>4));\n\t\n\tset_psg(CONTROL, 0xFF - 0x08 - SAFE_PORT_A_DIRECTION);\n\t\n\tfor(i=0;i<16;i++)\n\t{\n\t\tset_psg(A_VOLUME,15-i);\t\t\n\t\t// for(j=0;j<40;++j)\n\t\t// {\n\t\t// }\t\t\n\t}\n\n\t// set_psg(A_VOLUME,0);\t\t\n}\n\n\n\n#endif"
  },
  {
    "path": "src/cross_lib/sound/z88dk/psg/psg_sounds.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n// PSG code for AY-3-8910\n\n#ifndef _PSG_SOUNDS\n#define _PSG_SOUNDS\n\n#include <stdint.h>\n\n\t// void _XL_INIT_SOUND(void);\n\n\tvoid _ping_sound(uint8_t freq);\n\t#define _XL_PING_SOUND() _ping_sound(0xF0);\t\n\t#define _XL_TOCK_SOUND() _ping_sound(0x02);\n\t#define _XL_TICK_SOUND() _ping_sound(0xA0);\n\t\n\tvoid _explosion_sound(uint8_t freq);\n\t#define _XL_SHOOT_SOUND() _explosion_sound(0xF0);\n\t#define _XL_EXPLOSION_SOUND() _explosion_sound(0x80);\n\t\n\tvoid _XL_ZAP_SOUND(void);\t\n\n#endif // _PSG_SOUNDS\n\n"
  },
  {
    "path": "src/cross_lib/sound/z88dk/psg/sn76489a_psg_sounds.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n// PSG code for AY-3-8910\r\n\r\n#if !defined(_XL_NO_SOUND)\r\n\r\n#include \"psg_sounds.h\"\r\n#include <psg.h>\r\n\r\n#include <stdint.h>\r\n\r\n\r\n#define A_PERIOD_LOW 0\r\n#define A_PERIOD_HI 1\r\n\r\n#define B_PERIOD_LOW 2\r\n#define B_PERIOD_HI 3\r\n\r\n#define C_PERIOD_LOW 4\r\n#define C_PERIOD_HI 5\r\n\t\r\n#define NOISE 6\r\n#define CONTROL 7\r\n\r\n#define A_VOLUME 8\r\n#define B_VOLUME 9\r\n#define C_VOLUME 10\r\n\t\r\n#define ENV_PERIOD_LOW 11\r\n#define ENV_PERIOD_HI 12\r\n\r\n#define ENV_WAVE 13\r\n\r\n\r\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\r\n\r\n#if defined(__MSX__)\r\nvoid _XL_INIT_SOUND(void)\r\n{\r\n    POKE(0xF3DB,0);\r\n}\r\n// #elif defined(__SMS__)\r\n\r\n// #include <psg.h>\r\n\r\n// void _XL_INIT_SOUND(void)\r\n// {\r\n    // psg_init();\r\n  \r\n// }\r\n#else\r\n    \r\n#include <psg.h>\r\n\r\nvoid _XL_INIT_SOUND(void)\r\n{\r\n    psg_init();\r\n}\r\n#endif\r\n\r\n\r\nvoid _ping_sound(uint8_t freq)\r\n{\r\n\tuint16_t i;\r\n    \r\n\tpsg_volume(0,15);\r\n    \r\n    psg_tone(0,freq);\r\n\r\n    for(i=0;i<220;i++)\r\n    {\r\n    }\r\n\r\n    psg_volume(0,0);\r\n}\r\n\r\n\r\nvoid _XL_ZAP_SOUND(void) \r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n\r\n\tpsg_volume(0,15);\r\n    \r\n    for(i=0;i<30;i++)\r\n    {\r\n        for(j=0;j<i;++j)\r\n        {\r\n        }\r\n        psg_tone(0,i*4);\r\n        \r\n    }   \r\n    psg_volume(0,0);\r\n}\r\n\r\n\r\n\r\nvoid _explosion_sound(uint8_t freq)\r\n{ \r\n    uint8_t i;\r\n    uint8_t j;\r\n\r\n\tpsg_volume(0,15);\r\n    \r\n    for(i=0;i<30;i++)\r\n    {\r\n        psg_tone(0,freq);\r\n        for(j=0;j<i;++j)\r\n        {\r\n        }\r\n        psg_tone(0,i&3);\r\n        for(j=0;j<i;++j)\r\n        {\r\n        }\r\n        \r\n    }   \r\n    psg_volume(0,0);\r\n}\r\n\r\n\r\n\r\n#endif"
  },
  {
    "path": "src/cross_lib/text/letters.h",
    "content": "\r\n#if defined(__MC10__)\r\nextern uint8_t strlen(char *);\r\n#endif \r\n\r\n#ifndef _LETTERS_H\r\n#define _LETTERS_H\r\n\r\n    #if defined(ONLY_SMALL_LETTERS) \r\n        #define _XL_A \"a\"\r\n        #define _XL_B \"b\"\r\n        #define _XL_C \"c\"\r\n        #define _XL_D \"d\"\r\n        #define _XL_E \"e\"\r\n        #define _XL_F \"f\"\r\n        #define _XL_G \"g\"\r\n        #define _XL_H \"h\"\r\n        #define _XL_I \"i\"\r\n        #define _XL_J \"j\"\r\n        #define _XL_K \"k\"\r\n        #define _XL_L \"l\"\r\n        #define _XL_M \"m\"\r\n        #define _XL_N \"n\"\r\n        #define _XL_O \"o\"\r\n        #define _XL_P \"p\"\r\n        #define _XL_Q \"q\"\r\n        #define _XL_R \"r\"\r\n        #define _XL_S \"s\"\r\n        #define _XL_T \"t\"\r\n        #define _XL_U \"u\"\r\n        #define _XL_V \"v\"\r\n        #define _XL_W \"w\"\r\n        #define _XL_X \"x\"\r\n        #define _XL_Y \"y\"\r\n        #define _XL_Z \"z\"\r\n        \r\n\r\n    #elif defined(_XL_NO_SMALL_LETTERS)\r\n    \r\n        #define _XL_a \"A\"\r\n        #define _XL_b \"B\"\r\n        #define _XL_c \"C\"\r\n        #define _XL_d \"D\"\r\n        #define _XL_e \"E\"\r\n        #define _XL_f \"F\"\r\n        #define _XL_g \"G\"\r\n        #define _XL_h \"H\"\r\n        #define _XL_i \"I\"\r\n        #define _XL_j \"J\"\r\n        #define _XL_k \"K\"\r\n        #define _XL_l \"L\"\r\n        #define _XL_m \"M\"\r\n        #define _XL_n \"N\"\r\n        #define _XL_o \"O\"\r\n        #define _XL_p \"P\"\r\n        #define _XL_q \"Q\"\r\n        #define _XL_r \"R\"\r\n        #define _XL_s \"S\"\r\n        #define _XL_t \"T\"\r\n        #define _XL_u \"U\"\r\n        #define _XL_v \"V\"\r\n        #define _XL_w \"W\"\r\n        #define _XL_x \"X\"\r\n        #define _XL_y \"Y\"\r\n        #define _XL_z \"Z\"\r\n        \r\n    #endif\r\n    \r\n    #if !defined(ONLY_SMALL_LETTERS)\r\n        #define _XL_A \"A\"\r\n        #define _XL_B \"B\"\r\n        #define _XL_C \"C\"\r\n        #define _XL_D \"D\"\r\n        #define _XL_E \"E\"\r\n        #define _XL_F \"F\"\r\n        #define _XL_G \"G\"\r\n        #define _XL_H \"H\"\r\n        #define _XL_I \"I\"\r\n        #define _XL_J \"J\"\r\n        #define _XL_K \"K\"\r\n        #define _XL_L \"L\"\r\n        #define _XL_M \"M\"\r\n        #define _XL_N \"N\"\r\n        #define _XL_O \"O\"\r\n        #define _XL_P \"P\"\r\n        #define _XL_Q \"Q\"\r\n        #define _XL_R \"R\"\r\n        #define _XL_S \"S\"\r\n        #define _XL_T \"T\"\r\n        #define _XL_U \"U\"\r\n        #define _XL_V \"V\"\r\n        #define _XL_W \"W\"\r\n        #define _XL_X \"X\"\r\n        #define _XL_Y \"Y\"\r\n        #define _XL_Z \"Z\"\r\n    #endif\r\n    \r\n    #if !defined(_XL_NO_SMALL_LETTERS)\r\n        #define _XL_a \"a\"\r\n        #define _XL_b \"b\"\r\n        #define _XL_c \"c\"\r\n        #define _XL_d \"d\"\r\n        #define _XL_e \"e\"\r\n        #define _XL_f \"f\"\r\n        #define _XL_g \"g\"\r\n        #define _XL_h \"h\"\r\n        #define _XL_i \"i\"\r\n        #define _XL_j \"j\"\r\n        #define _XL_k \"k\"\r\n        #define _XL_l \"l\"\r\n        #define _XL_m \"m\"\r\n        #define _XL_n \"n\"\r\n        #define _XL_o \"o\"\r\n        #define _XL_p \"p\"\r\n        #define _XL_q \"q\"\r\n        #define _XL_r \"r\"\r\n        #define _XL_s \"s\"\r\n        #define _XL_t \"t\"\r\n        #define _XL_u \"u\"\r\n        #define _XL_v \"v\"\r\n        #define _XL_w \"w\"\r\n        #define _XL_x \"x\"\r\n        #define _XL_y \"y\"\r\n        #define _XL_z \"z\"\r\n    #endif    \r\n\r\n    #if !defined(_XL_SPACE)\r\n        #define _XL_SPACE \" \"\r\n    #endif\r\n\r\n\r\n#endif // _LETTERS_H\r\n\r\n"
  },
  {
    "path": "src/debug/Makefile",
    "content": "\r\nEXEEXT?=.exe\r\n\r\nCL65?=/home/fabri/CC65_fix/cc65/bin/cl65$(EXEEXT)\r\n\r\ngamate_conio_test:\r\n\t$(CL65) -tgamate gamate_conio_test.c\r\n\t../../tools/cc65/gamate/gamate-fixcart$(EXEEXT) gamate_conio_test\r\n\r\n\r\ngamate_conio_test2:\r\n\t$(CL65) -tgamate gamate_conio_test2.c\r\n\t../../tools/cc65/gamate/gamate-fixcart$(EXEEXT) gamate_conio_test2\r\n\r\n\r\nall: gamate_conio_test gamate_conio_test2\r\n\r\nclean: \r\n\trm -rf gamate_conio_test\r\n\trm -rf gamate_conio_test2\r\n"
  },
  {
    "path": "src/debug/amiga_core.h",
    "content": "\r\n#if __GNUC__ >= 8\r\n#include \"support/gcc8_c_support.h\"\r\n#define AMIGADEBUGGER 1\r\n#else\r\n#define AMIGADEBUGGER 0\r\n#define warpmode(x)\r\n#endif\r\n\r\n#include <proto/exec.h>\r\n#include <proto/dos.h>\r\n#include <proto/graphics.h>\r\n#include <graphics/gfxbase.h>\r\n#include <graphics/view.h>\r\n#include <exec/execbase.h>\r\n#include <hardware/custom.h>\r\n#include <hardware/intbits.h>\r\n\r\n\r\n#define BPLHPTH_ADDR\t\t0x1EC\r\n#define BPLHPTL_ADDR\t\t0x1EE\r\n#define FMODE_ADDR\t\t0x1FC\r\n\r\n#define COP1LCH_ADDR\t\t0x080\r\n#define COP1LCL_ADDR\t\t0x082\r\n#define COP2LCH_ADDR\t\t0x084\r\n#define COP2LCL_ADDR\t\t0x086\r\n#define COPJMP1_ADDR\t\t0x088\r\n#define COPJMP2_ADDR\t\t0x08A\r\n#define COPINS_ADDR\t\t0x08C\r\n#define DIWSTRT_ADDR\t\t0x08E\r\n#define DIWSTOP_ADDR\t\t0x090\r\n#define DDFSTRT_ADDR\t\t0x092\r\n#define DDFSTOP_ADDR\t\t0x094\r\n#define BITPLNS_ADDR\t\t0x0E0  // + 4*N bitplane.\r\n#define BPLCON0_ADDR\t\t0x100\r\n#define BPLCON1_ADDR\t\t0x102\r\n#define BPLCON2_ADDR\t\t0x104\r\n#define BPLCON3_ADDR\t\t0x106\r\n#define BPL1MOD_ADDR\t\t0x108\r\n#define BPL2MOD_ADDR\t\t0x10A\r\n#define BPLCON4_ADDR\t\t0x10C\r\n#define COLOR00_ADDR\t\t0x180\r\n\r\n#define BLITTER_READY (1<<14)\r\n#define BLITTER_ZERO (1<<13)\r\n#define BLITTER_NASTY (1<<12)\r\n#define DMA_ALL (1<<9)\r\n#define BITPLANES_ON (1<<8)\r\n#define COPPER_ON (1<<7)\r\n#define BLITTER_ON (1<<6)\r\n#define SPRITES_ON (1<<5)\r\n#define DISKS_ON (1<<4)\r\n#define AUDIO3_ON (1<<3)\r\n#define AUDIO2_ON (1<<2)\r\n#define AUDIO1_ON (1<<1)\r\n#define AUDIO0_ON (1<<0)\r\n#define DMACON_ADDR\t\t0x096\r\n \r\n\r\nstruct ExecBase *SysBase;\r\nvolatile struct Custom *hw;\r\nstruct DosLibrary *DOSBase;\r\nstruct GfxBase *GfxBase;\r\n\r\n\r\nvoid dma_On(int v)\r\n{\r\n hw->dmacon=0x8000|v;\r\n}\r\nvoid dma_Off(int v)\r\n{\r\n hw->dmacon=v;\r\n}\r\n\r\nshort *copper_List = 0;\r\nint copper_List_cursor=0;\r\nint copper_List_bitplanes_cursor=0;\r\nint copper_List_vx,copper_List_vy;\r\n int copper_Move(short a,short v) \r\n{\r\n    int c=copper_List_cursor;\r\n    copper_List[copper_List_cursor++]=a;\r\n    copper_List[copper_List_cursor++]=v;\r\n    return c;\r\n\r\n}\r\n\r\n void copper_Set(void *copmem)\r\n{\r\n    copper_List=(short*)copmem;\r\n    copper_List_cursor=0;\r\n}\r\n//(short sx = 0, short sy = 0, short ww = 320, short hh = 256, short wib = 0)\r\n int copper_SetView(short sx , short sy , short ww , short hh , short wib )\r\n\t\t\t{\r\n\t\t\t\thh += sy;\r\n\t\t\t\tsx += 0x81; sy += 0x2c;\r\n\t\t\t\tww += 0x81; hh += 0x2c;\r\n\t\t\t\tcopper_List_vx = sx; copper_List_vy = sy;\r\n\t\t\t\tint r = copper_List_cursor;\r\n\t\t\t\tcopper_Move(FMODE_ADDR, 0); // rimuovere se AGA\r\n\t\t\t\tcopper_Move(DIWSTRT_ADDR, (sx) | (sy << 8));\r\n\t\t\t\tcopper_Move(DIWSTOP_ADDR, (ww & 0xff) | ((hh & 0xff) << 8));\r\n\t\t\t\tcopper_Move(DDFSTRT_ADDR, 0x38); // qui ci sarebbe da calcolare cose in modo da gestire overscan etc.\r\n\t\t\t\tcopper_Move(DDFSTOP_ADDR, 0xd0);\r\n\t\t\t\tcopper_Move(DDFSTOP_ADDR, 0xd0);\r\n\t\t\t\tcopper_Move(BPLCON3_ADDR, 0x0c00); // AGA compatibility se dual playfield mode\r\n\t\t\t\tcopper_Move(BPL1MOD_ADDR, wib);\r\n\t\t\t\tcopper_Move(BPL2MOD_ADDR, wib);\r\n\t\t\t\tcopper_Move(BPLCON1_ADDR, 0);\r\n\r\n\t\t\t\t// qua tocco ctrl se chiedo hires.. etc..\r\n\t\t\t\t//DIWSTRT, $5281; DIWSTOP, $06c1\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t\t int copper_OffsetX(short x)\r\n\t\t\t{\r\n\t\t\t\tx &= 0xf;\r\n\t\t\t\treturn copper_Move(BPLCON1_ADDR, x | (x << 4));\r\n\t\t\t}\r\n             int copper_Pointer(short addr, short n, void *pdata)\r\n\t\t\t{\r\n\r\n\t\t\t\tshort* d = (short*)&pdata;\r\n\t\t\t\tshort hi = d[0];\r\n\t\t\t\tshort lo = d[1];\r\n\r\n\t\t\t\tshort a = addr + (n << 2);\r\n\t\t\t\t// qui riswitcha da LE a BE\r\n                copper_Move(a,hi);\r\n\t\t\t\tcopper_Move(a+2,lo);\r\n\t\t\t\treturn copper_List_cursor - 4;\r\n\t\t\t}\r\n\r\n             int copper_Bitplane(short n, void *data)\r\n\t\t\t{\r\n\t\t\t\treturn copper_Pointer(BITPLNS_ADDR, n, data);\r\n\t\t\t}\r\n            \r\n\t\t\t int copper_Bitplanes(short n, void *data, int count , int stride )\r\n\t\t\t{\r\n\t\t\t\tint r = copper_List_cursor;\r\n\t\t\t\tif(data)copper_List_bitplanes_cursor = copper_List_cursor;\r\n\t\t\t\tchar *p = (char*)data;\r\n\t\t\t\tfor (int i = 0; i < count; i++, p += stride)\r\n\t\t\t\t\tcopper_Pointer(BITPLNS_ADDR, n + i, p);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t\t int copper_RefreshBitplanes(short n, void *data, int count , int stride )\r\n\t\t\t{\r\n\t\t\t\tint oc = copper_List_cursor;\r\n\t\t\t\tcopper_List_cursor = copper_List_bitplanes_cursor;\r\n\t\t\t\tcopper_Bitplanes(n, data, count, stride);\r\n\t\t\t\tcopper_List_cursor = oc;\r\n\t\t\t\treturn copper_List_bitplanes_cursor;\r\n\t\t\t}\r\n\r\n\r\n\t\t\t int copper_BitplanesNum(int n)\r\n\t\t\t{\r\n\t\t\t\tint v = 0;//playfields_mode ? (1 << 10) : 0;\r\n\t\t\t\tv |= n << 12;\r\n\t\t\t\tv |= 0x200;\r\n\r\n\t\t\t\treturn copper_Move(BPLCON0_ADDR, v);\r\n\t\t\t}\r\n\r\n             int copper_Jump(int cpl)\r\n\t\t\t{\r\n\t\t\t\treturn copper_Move(COPJMP1_ADDR + (cpl<<1) , 0);\r\n\t\t\t}\r\n\t\t\t int copper_Next(int cmdn, int cpl )\r\n\t\t\t{\r\n\t\t\t\tshort *l = copper_List + copper_List_cursor + (cmdn<<1) + 4;\r\n\t\t\t\treturn copper_Pointer(COP1LCH_ADDR, cpl, l);\r\n\t\t\t}\r\n\r\n\t\t\t\r\n\r\n\t\t\t int copper_Color(short n, short  val)\r\n\t\t\t{\r\n\t\t\t\treturn copper_Move(COLOR00_ADDR + (n << 1), val);\r\n\t\t\t}\r\n\t\t\t int copper_Colors(short *c, int pos, int count )\r\n\t\t\t{\r\n\t\t\t\tint a = COLOR00_ADDR + (pos << 1);\r\n\t\t\t\tint r = copper_List_cursor;\r\n\t\t\t\tfor (int i=0;i<count;i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tcopper_Move(a, c[i]);\r\n\t\t\t\t\ta += 2;\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n            #define cWAITDEF      0xff,  0xff, \r\n             int copper_WaitRaw(int x , int y , int maskx , int masky, int blitwait )\r\n\t\t\t{\t// calcolo in LE e copiando il res lo trasforma in BE\r\n\t\t\t\tcopper_Move( (y << 8) | (x) | 1 , (blitwait ? 0x8000 : 0) | ((((masky & 0x7f) << 8) | maskx)&(~1)));\r\n\t\t\t\treturn copper_List_cursor - 2;\r\n\t\t\t}\r\n\r\n             //(int x = 0xdf, int y = 0xff, int maskx = 0xff, int masky = 0xff, bool blitwait = false)\r\n\t\t\t int copper_Wait(int x , int y , int maskx , int masky , int blitwait )\r\n\t\t\t{\r\n\t\t\t\tx = ((x + copper_List_vx) >> 1) ;\r\n\t\t\t\ty = copper_List_vy + y;\r\n\t\t\t\treturn copper_WaitRaw(x, y, maskx, masky, blitwait);\r\n\t\t\t}\r\n\t\t\t int copper_End()\r\n\t\t\t{\r\n\t\t\t\tint r = copper_List_cursor;\r\n\t\t\t\tcopper_Move(0xffdf, 0xfffe);\r\n\t\t\t\tcopper_Move(0xffff, 0xfffe);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\t\t\t void copper_Load() //=0\r\n\t\t\t{\r\n\t\t\t\thw->cop1lc = (long)copper_List;\r\n\r\n\t\t\t}\r\n\t\r\n     void OpenDisplay(int w,int h, void* bitplanes, int nbitplanes,short *palette,int ncolors)\r\n    {\r\n           \r\n            copper_List_cursor=0;\r\n            copper_SetView(0,0,w,h,0);\r\n            copper_Bitplanes(0,bitplanes,nbitplanes, (w>>3)*h);\r\n            copper_Bitplanes(nbitplanes,0,6-nbitplanes, 0);\r\n            copper_BitplanesNum(nbitplanes);\r\n            copper_Colors(palette,0,ncolors);\r\n            copper_End();\r\n            copper_Load();\r\n            dma_On(BITPLANES_ON|COPPER_ON|DMA_ALL);\r\n\t\t\t\r\n\r\n    }\r\n\t\r\n\r\n\r\n//backup\r\nstatic UWORD SystemInts;\r\nstatic UWORD SystemDMA;\r\nstatic UWORD SystemADKCON;\r\nvolatile static APTR VBR=0;\r\nstatic APTR SystemIrq;\r\n \r\nstruct View *ActiView;\r\n\r\nstatic APTR GetVBR(void) {\r\n\tAPTR vbr = 0;\r\n\tUWORD getvbr[] = { 0x4e7a, 0x0801, 0x4e73 }; // copper_MoveC.L VBR,D0 RTE\r\n\r\n\tif (SysBase->AttnFlags & AFF_68010) \r\n\t\tvbr = (APTR)Supervisor((void*)getvbr);\r\n\r\n\treturn vbr;\r\n}\r\n\r\nvoid SetInterruptHandler(APTR interrupt) {\r\n\t*(volatile APTR*)(((UBYTE*)VBR)+0x6c) = interrupt;\r\n}\r\n\r\nAPTR GetInterruptHandler() {\r\n\treturn *(volatile APTR*)(((UBYTE*)VBR)+0x6c);\r\n}\r\n\r\n//vblank begins at vpos 312 hpos 1 and ends at vpos 25 hpos 1\r\n//vsync begins at line 2 hpos 132 and ends at vpos 5 hpos 18 \r\nvoid WaitVbl() {\r\n\twhile (1) {\r\n\t\tvolatile ULONG vpos=*(volatile ULONG*)0xDFF004;\r\n\t\tvpos&=0x1ff00;\r\n\t\tif (vpos!=(311<<8))\r\n\t\t\tbreak;\r\n\t}\r\n\twhile (1) {\r\n\t\tvolatile ULONG vpos=*(volatile ULONG*)0xDFF004;\r\n\t\tvpos&=0x1ff00;\r\n\t\tif (vpos==(311<<8))\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\n void WaitBlt() {\r\n\tUWORD tst=*(volatile UWORD*)&hw->dmaconr; //for compatiblity a1000\r\n\t(void)tst;\r\n\twhile (*(volatile UWORD*)&hw->dmaconr&(1<<14)) {} //blitter busy wait\r\n}\r\n\r\nvoid TakeSystem() {\r\n\r\n\r\n\twarpmode(0);\r\n\r\n\tActiView=GfxBase->ActiView; //store current view\r\n\tOwnBlitter();\r\n\tWaitBlit();\t\r\n\tDisable();\r\n\t\r\n\t//Save current interrupts and DMA settings so we can restore them upon exit. \r\n\tSystemADKCON=hw->adkconr;\r\n\tSystemInts=hw->intenar;\r\n\tSystemDMA=hw->dmaconr;\r\n\thw->intena=0x7fff;//disable all interrupts\r\n\thw->intreq=0x7fff;//Clear any interrupts that were pending\r\n\t\r\n\tWaitVbl();\r\n\tWaitVbl();\r\n\thw->dmacon=0x7fff;//Clear all DMA channels\r\n   \r\n\r\n\t//set all colors black\r\n\tfor(int a=0;a<32;a++)\r\n\t\thw->color[a]=0xf0;\r\n\r\n\tLoadView(0);\r\n\tWaitTOF();\r\n\tWaitTOF();\r\n\r\n\tWaitVbl();\r\n\tWaitVbl();\r\n\r\n\tVBR=GetVBR();\r\n\tSystemIrq=GetInterruptHandler(); //store interrupt register\r\n\r\n\tWaitVbl();\r\n\r\n}\r\n\r\nvoid FreeSystem() { \r\n\tWaitVbl();\r\n\tWaitBlt();\r\n\thw->intena=0x7fff;//disable all interrupts\r\n\thw->intreq=0x7fff;//Clear any interrupts that were pending\r\n\thw->dmacon=0x7fff;//Clear all DMA channels\r\n\r\n\t//restore interrupts\r\n\tSetInterruptHandler(SystemIrq);\r\n\r\n\t/*Restore system copper list(s). */\r\n\thw->cop1lc=(ULONG)GfxBase->copinit;\r\n\thw->cop2lc=(ULONG)GfxBase->LOFlist;\r\n\thw->copjmp1=0x7fff; //start coppper\r\n\r\n\t/*Restore all interrupts and DMA settings. */\r\n\thw->intena=SystemInts|0x8000;\r\n\thw->dmacon=SystemDMA|0x8000;\r\n\thw->adkcon=SystemADKCON|0x8000;\r\n\r\n\tLoadView(ActiView);\r\n\tWaitTOF();\r\n\tWaitTOF();\r\n\tWaitBlit();\t\r\n\tDisownBlitter();\r\n\tEnable();\r\n}\r\n\r\nshort MouseLeft(){return !((*(volatile UBYTE*)0xbfe001)&64);}\t\r\nshort MouseRight(){return !((*(volatile UWORD*)0xdff016)&(1<<10));}\r\n\r\n\r\nvoid *alloc_chip(unsigned long sz )\r\n{\r\n\tlong *r=(long*)AllocMem(sz+4, MEMF_CHIP);\r\n\t*r= sz;\r\n\treturn (void*)(r+1);\r\n}\r\n\r\n\r\nvoid *free_chip(void *memtofree)\r\n{\r\n\tlong *r=((long*)memtofree)-1;\r\n\r\n\tFreeMem(r,*r);\r\n\treturn r;\r\n}\r\n\r\nvoid InitializeSystem()\r\n{\r\n\t\tSysBase = *((struct ExecBase**)4UL);\r\n\thw = (struct Custom*)0xdff000;\r\n\r\n\t// We will use the graphics library only to locate and restore the system copper list once we are through.\r\n\tGfxBase = (struct GfxBase *)OpenLibrary(\"graphics.library\",0);\r\n\tif (!GfxBase)\r\n\t\tExit(0);\r\n\r\n\t// used for printing\r\n\tDOSBase = (struct DosLibrary*)OpenLibrary(\"dos.library\", 0);\r\n\tif (!DOSBase)\r\n\t\tExit(0);\r\n}\r\nvoid SetVBLInterrupt(APTR intr)\r\n{\r\n\t\tSetInterruptHandler(intr);\r\n\thw->intena=(1<<INTB_SETCLR)|(1<<INTB_INTEN)|(1<<INTB_VERTB);\r\n\thw->intreq=1<<INTB_VERTB;//reset vbl req\r\n}"
  },
  {
    "path": "src/debug/atari2600_graphics_test.c",
    "content": "/*****************************************************************************/\n/*                                                                           */\n/* Atari VCS 2600 sample C program                                           */\n/*                                                                           */\n/* Florent Flament (contact@florentflament.com), 2017                        */\n/*                                                                           */\n/*****************************************************************************/\n\n#include <atari2600.h>\n\n// PAL Timings\n// Roughly computed based on Stella Programmer's guide (Steve Wright)\n// scanlines count per section.\n#define VBLANK_TIM64 51 // 45 lines * 76 cycles/line / 64 cycles/tick\n#define KERNAL_T1024 17 // 228 lines * 76 cycles/line / 1024 cycles/tick\n#define OVERSCAN_TIM64 42 // 36 lines * 76 cycles/line / 64 cycles/tick\n\n// Testing memory zones\nconst uint8_t rodata_v[] = \"Hello!\";\nuint8_t data_v = 0x77;\nuint8_t bss_v;\n\nvoid main(void) {\n    uint8_t color = 0x79; // Stack variable\n    bss_v = 0x88; // Testing BSS variable\n\n    for/*ever*/(;;) {\n        // Vertical Sync signal\n        TIA.vsync = 0x02;\n        TIA.wsync = 0x00;\n        TIA.wsync = 0x00;\n        TIA.wsync = 0x00;\n        TIA.vsync = 0x00;\n\n        // Vertical Blank timer setting\n        RIOT.tim64t = VBLANK_TIM64;\n\n        // Doing frame computation during blank\n        TIA.colubk = color++; // Update color\n        \n        // while(RIOT.timint>0)\n        // {\n            TIA.colubk = ++color;\n        // }\n\n        // Wait for end of Vertical Blank\n        while (RIOT.timint == 0) {}\n        TIA.wsync = 0x00;\n        TIA.vblank = 0x00; // Turn on beam\n\n        // Display frame\n        RIOT.t1024t = KERNAL_T1024;\n        while (RIOT.timint == 0) {}\n        TIA.wsync = 0x00;\n        TIA.vblank = 0x02; // Turn off beam\n\n        // Overscan\n        RIOT.tim64t = OVERSCAN_TIM64;\n        while (RIOT.timint == 0) {}\n    }\n}\n"
  },
  {
    "path": "src/debug/atari7800_test.c",
    "content": "// cl65.exe -t atari7800 --force-import __EXEHDR__ atari7800_test.c -o atari7800_DEBUG.a78\r\n\r\n#include <conio.h>\r\n#include <peekpoke.h>\r\n\r\nextern char screen[];\r\n\r\nint main(void)\r\n{\r\n\tclrscr();\r\n\r\n\tPOKE(7000,1);\r\n\t\r\n\twhile(1){};\r\n\t\r\n\treturn 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/atari7800_test2.c",
    "content": "#include <atari7800.h>\r\n#include <conio.h>\r\n\r\nextern char screen[];\r\n\r\nvoid main()\r\n{\r\n\tchar i;\r\n\t\r\n\tclrscr();\r\n\t\r\n\tfor(i=0;i<100;++i)\r\n\t{\r\n\t\t\r\n\t\tscreen[i]=i;\r\n    }\r\n\twhile (1) {\r\n\t\tscreen[0] = screen[0] + 1;\r\n\t}\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/atari7800_test3.c",
    "content": "#include <conio.h>\r\n\r\nextern char *screen;\r\n\r\nint main(void)\r\n{\r\n\tchar i;\r\n\t\r\n\tclrscr();\r\n\t\r\n\tfor(i=0;i<100;++i)\r\n\t{\r\n\t\t\r\n\t\tscreen[i]=i;\r\n    }\r\n\r\n\twhile (1) {\r\n\t\tscreen[0] = screen[0] + 1;\r\n\t}\r\n\t\r\n\treturn 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/atari_lynx.c",
    "content": "#include <tgi.h>\r\n#define CLI() asm(\"\\tcli\")\r\nint main(void)\r\n{\r\n    tgi_install (tgi_static_stddrv);\r\n    tgi_init ();        \r\n    CLI();\r\n    while (tgi_busy())  {  };\r\n    tgi_setpalette(tgi_getdefpalette());\r\n    tgi_setbgcolor(TGI_COLOR_WHITE);\r\n    tgi_outtextxy(8,8,\"    \"); \r\n    tgi_setcolor(TGI_COLOR_BLACK);\r\n    // tgi_setcolor(TGI_COLOR_RED);\r\n    tgi_outtextxy(8,8,\"hello\");\r\n        \r\n    while(1){};\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/bar.c",
    "content": "\r\n\r\nchar foo[] = {'a','b','c'};\r\n\r\n"
  },
  {
    "path": "src/debug/bbctest.c",
    "content": "\r\n// DOC on VDU\r\n// https://www.bbcbasic.co.uk/bbcbasic/manual/vdu.html#vdu22\r\n\r\n/*\r\n0 \tNull - it does nothing.\r\n1 \tSend the next character to the printer ONLY.\r\n2 \tEnable the printer.\r\n3 \tDisable the printer.\r\n4 \tWrite text at the text cursor position.\r\n5 \tWrite text at the graphics cursor position.\r\n6 \tEnable output to the screen.\r\n7 \tBell - make a short 'beep'.\r\n8 \tMove the text cursor backwards one character.\r\n9 \tMove the text cursor forwards one character.\r\n10 \tMove the text cursor down one line.\r\n11 \tMove the text cursor up one line.\r\n12 \tClear the text area - identical to CLS.\r\n13 \tMove the text cursor to the start of the current line.\r\n14 \tEnable the auto-paging mode.\r\n15 \tDisable the auto-paging mode.\r\n16 \tClear the graphics area - identical to CLG.\r\n17 \tDefine a text colour - identical to COLOUR.\r\n18 \tDefine a graphics colour - identical to GCOL.\r\n19 \tSelect a colour palette.\r\n20 \tRestore the default logical colours.\r\n21 \tDisable output to the screen.\r\n22 \tSelect the screen mode - identical to MODE.\r\n23 \tProgram characters and control the cursor.\r\n24 \tDefine a graphics window.\r\n25 \tIdentical to PLOT.\r\n26 \tRestore the default text and graphics windows.\r\n27 \tSend the next character to the screen.\r\n28 \tDefine a text window.\r\n29 \tSet the graphics origin.\r\n30 \tHome the text cursor to the top left of the screen.\r\n31 \tMove the text cursor - identical to TAB(x,y).\r\n127 \tBackspace and delete.\r\n*/\r\n\r\n// #include \"bbc.h\"\r\nchar OSBYTE0(__reg(\"a\") char)=\"\\tjsr\\t$fff4\\n\\ttxa\";\r\nchar OSBYTE1(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\nchar OSBYTE1RI(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\\n\\ttxa\\n\\tpha\\n\\ttya\\n\\ttax\\n\\tpla\";\r\nchar OSBYTE2(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\nchar OSBYTE2I(__reg(\"a\") char,__reg(\"r0/r1\") unsigned int)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\\n\\ttxa\";\r\nvoid OSBYTE0NR(__reg(\"a\") char)=\"\\tjsr\\t$fff4\";\r\nvoid OSBYTE1NR(__reg(\"a\") char,__reg(\"r0\") char)=\"\\tldx\\tr0\\n\\tjsr\\t$fff4\";\r\nvoid OSBYTE2NR(__reg(\"a\") char,__reg(\"r0\") char,__reg(\"r1\") char)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff4\";\r\n\r\n#define OSVER() OSBYTE0(0)\r\n#define OSUSRFLG(x,y) OSBYTE2(1,(x),(y))\r\n#define OSSELINPUT(x) OSBYTE1NR(2,(x))\r\n#define OSSELOUTPUT(x) OSBYTE2(3,(x),(y))\r\n#define OSCURSORED(x) OSBYTE2(4,(x),(y))\r\n#define OSSELADC(x) OSBYTE1(16,(x))\r\n#define OSFRCADC(x) OSBYTE1NR(17,(x))\r\n#define OSVSYNC() OSBYTE0(19)\r\n#define OSRDVDU() OSBYTE0(117)\r\n#define OSSCANKEY(x) OSBYTE1(121,(x))\r\n#define OSSCANKEY16() OSBYTE0(122)\r\n#define OSADVAL(x) OSBYTE1RI(128,(x))\r\n#define OSINKEY(x) OSBYTE2I(129,(x)) \r\n\r\n\r\nvoid OSWORD(__reg(\"a\") char,__reg(\"r0/r1\") void *)=\"\\tldx\\tr0\\n\\tldy\\tr1\\n\\tjsr\\t$fff1\";\r\n\r\n#define OSRDSYSCLK(x) OSWORD(1,x)\r\n#define OSWRSYSCLK(x) OSWORD(2,x)\r\n#define OSRDTIMER(x) OSWORD(3,x)\r\n#define OSWRTIMER(x) OSWORD(4,x)\r\n#define OSRDIO(x) OSWORD(5,x)\r\n#define OSWRIO(x) OSWORD(6,x)\r\n#define OSSOUND(x) OSWORD(7,x)\r\n#define OSENVELOPE(x) OSWORD(8,x)\r\n#define OSRDPIXEL(x) OSWORD(9,x)\r\n#define OSRDCHARDEF(x) OSWORD(10,x)\r\n#define OSRDPALETTE(x) OSWORD(11,x)\r\n#define OSWRPALETTE(x) OSWORD(12,x)\r\n#define OSRDGRCURSOR(x) OSWORD(13,x)\r\n\r\n\r\n#define _TILE_0 200\r\n#define _TILE_1 201\r\n#define _TILE_2 202\r\n#define _TILE_3 203\r\n#define _TILE_4 204\r\n#define _TILE_5 205\r\n#define _TILE_6 206\r\n#define _TILE_7 207\r\n#define _TILE_8 208\r\n#define _TILE_9 209\r\n#define _TILE_10 210\r\n#define _TILE_11 211\r\n#define _TILE_12 212\r\n#define _TILE_13 213\r\n#define _TILE_14 214\r\n#define _TILE_15 215\r\n#define _TILE_16 216\r\n#define _TILE_17 217\r\n#define _TILE_18 218\r\n#define _TILE_19 219\r\n#define _TILE_20 220\r\n#define _TILE_21 221\r\n#define _TILE_22 222\r\n#define _TILE_23 223\r\n#define _TILE_24 224\r\n#define _TILE_25 225\r\n#define _TILE_26 226\r\n\r\n\r\n#include <stdint.h>\r\n\r\nvoid osputc(__reg(\"a\") char)=\"\\tjsr\\t0xffee\";\r\n\r\n\r\n\r\n#define _TILE_0_UDG     { 198,186,254,170,238,186,170,16}\r\n#define _TILE_1_UDG     { 0,0,198,186,254,170,238,186}\r\n#define _TILE_3_UDG     { 0,0,0,0,198,186,254,170}\r\n#define _TILE_2_UDG     { 170,16,0,0,0,0,0,0}\r\n\r\n#define _TILE_4_UDG     {238,186,170,16,0,0,0,0}\r\n\r\n#define _TILE_7_UDG     { 198,186,0,170,0,186,214,16}\r\n\r\n#define _TILE_9_UDG     {  4,14,14,4,63,68,228,64}\r\n\r\n#define _TILE_8_UDG     {  60,126,231,195,195,231,126,60}\r\n\r\n#define _TILE_11_UDG    {  0,0,0,0,3,10,4,10}\r\n\r\n#define _TILE_5_UDG     { 0,0,0,0,0,0,198,186}\r\n\r\n#define _TILE_16_UDG    { 0,0,0,0,248,4,14,4}\r\n\r\n#define _TILE_15_UDG    {  0,0,0,16,130,16,84,16}\r\n\r\n#define _TILE_14_UDG    { 198,186,68,84,186,214,16,16}\r\n\r\n#define _TILE_6_UDG     {254,170,238,186,170,16,0,0}\r\n\r\n#define _TILE_12_UDG    { 64,224,224,64,248,68,78,4 }\r\n\r\n#define _TILE_13_UDG    {  0,0,0,0,63,64,224,64 }\r\n\r\n#define _TILE_10_UDG    { 0,0,0,0,128,160,64,160 }\r\n\r\n\r\n#define _TILE_17_UDG    { 4,14,14,4,4,4,0,0 }\r\n\r\n#define _TILE_18_UDG    { 64,224,224,64,64,64,0,0 }\r\n\r\n#define _TILE_19_UDG    { 198,186,254,170,238,186,214,16 }\r\n\r\n#define _TILE_20_UDG    { 254,170,238,186,214,16,0,0 }\r\n\r\n#define _TILE_21_UDG    { 238,186,214,16,0,0,0,0 }\r\n\r\n#define _TILE_22_UDG    { 214,16,0,0,0,0,0,0 }\r\n\r\n#define _TILE_23_UDG    { 0,24,60,122,253,122,60,24 }\r\n\r\n#define _TILE_24_UDG    { 120,252,255,133,255,161,255,0 }\r\n\r\n#define _TILE_25_UDG    { 0,0,0,24,52,122,52,24 }\r\n\r\n#define _TILE_26_UDG    { 0,0,0,0,0,16,16,16 }\r\n\r\n\r\nconst struct redefine_struct\r\n{\r\n   const uint8_t ascii;\r\n   const uint8_t bitmap[8];\r\n} ;\r\n\r\n\r\n\r\nconst struct redefine_struct redefine_map[] =\r\n{\r\n\t{_TILE_0, _TILE_0_UDG},\r\n\t{_TILE_1, _TILE_1_UDG},\r\n\t{_TILE_2, _TILE_2_UDG},\t\r\n\t{_TILE_3, _TILE_3_UDG},\r\n\t{_TILE_4, _TILE_4_UDG},\r\n\t{_TILE_5, _TILE_5_UDG},\r\n\t{_TILE_6, _TILE_6_UDG},\r\n    {_TILE_7, _TILE_7_UDG},\r\n    {_TILE_8, _TILE_8_UDG},\r\n    {_TILE_9, _TILE_9_UDG},\r\n    {_TILE_10, _TILE_10_UDG},\r\n    {_TILE_11, _TILE_11_UDG},\r\n    {_TILE_12, _TILE_12_UDG},\r\n    {_TILE_13, _TILE_13_UDG},\r\n    {_TILE_14, _TILE_14_UDG},\r\n    {_TILE_15, _TILE_15_UDG},\r\n    {_TILE_16, _TILE_16_UDG},\r\n    {_TILE_17, _TILE_17_UDG},\r\n    {_TILE_18, _TILE_18_UDG},\r\n    {_TILE_19, _TILE_19_UDG},\r\n    {_TILE_20, _TILE_20_UDG},\r\n    {_TILE_21, _TILE_21_UDG},\r\n    {_TILE_22, _TILE_22_UDG},\r\n    {_TILE_23, _TILE_23_UDG},\r\n    {_TILE_24, _TILE_24_UDG},\r\n    {_TILE_25, _TILE_25_UDG},\r\n    {_TILE_26, _TILE_26_UDG},\r\n};\r\n\r\n\r\n#define REDEFINE_AT(addr) \\\r\n{ \\\r\n\tuint8_t i; \\\r\n\t\\\r\n\tfor (i = 0; i < (sizeof(redefine_map)/sizeof(*redefine_map)); ++i) \\\r\n\t{ \\\r\n\t\tmemcpy((uint8_t *)(addr) + screenCode((redefine_map[i].ascii))*8, redefine_map[i].bitmap, 8); \\\r\n\t} \\\r\n}\r\n\r\n\r\n\r\n\r\nvoid redefine(const uint8_t ch, const uint8_t *data)\r\n{\r\n    uint8_t i;\r\n    \r\n    osputc(23);\r\n    osputc(ch);\r\n    for(i=0;i<8;++i)\r\n    {\r\n        osputc(data[i]);\r\n    }\r\n}\r\n\r\n\r\nvoid SET_UDG_IMAGES(void) \r\n{ \r\n    uint8_t i;\r\n\r\n    for (i = 0; i < sizeof(redefine_map) / sizeof(*redefine_map); ++i) \r\n    {\r\n            redefine(redefine_map[i].ascii, redefine_map[i].bitmap);\r\n    } \r\n}\r\n\r\n\r\n\r\n\r\nvoid _XL_INIT_GRAPHICS(void)\r\n{\r\n\r\n    osputc(22);\r\n\r\n    osputc(5);\r\n\r\n    \r\n    // Disable the cursor\r\n    osputc(23);\r\n    osputc(1);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n    osputc(0);\r\n\r\n    SET_UDG_IMAGES();\r\n\r\n    osputc('A');\r\n    osputc('B');\r\n    osputc('C');\r\n    \r\n    osputc(_TILE_0);\r\n    osputc(_TILE_1);\r\n    osputc(_TILE_2);\r\n\r\n    \r\n    while(1){};\r\n\r\n}\r\n\r\n\r\nint main(void)\r\n{\r\n    _XL_INIT_GRAPHICS();\r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/bitbang.c",
    "content": "#include <sound.h>\r\n    \r\n#include <stdio.h>\r\n\r\nint main(void)\r\n{\r\n\r\n    while(1)\r\n    {\r\n        bit_fx(7);\r\n        getchar();\r\n        \r\n        bit_fx(1);\r\n        getchar();\r\n        \r\n        bit_fx3(0);\r\n        getchar();\r\n    }\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/build_conio_test.txt",
    "content": "zcc.exe +cpm --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 conio_test.c -create-app -oconio_test.bin -lndos \r\n\r\n\r\n\r\n\r\ncpm_z80_adm3a:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_cpm_adm3a.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_cpm_adm3a.bin\r\n\r\ncpm_8080_adm3a:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -clib=8080 --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\ncpm_8085_adm3a:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -clib=8085 --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/debug/coco3_test.c",
    "content": "#include<coco.h>\r\n#include<cmoc.h>\r\n\r\n#define POKE(addr,value) (*(unsigned char *)(addr)=(value))\r\n#define PEEK(addr) (*(unsigned char *)(addr))\r\n\r\nint main(void)\r\n{\r\n    uint16_t i;\r\n\r\n    disableInterrupts();\r\n    \r\n    // Enable MMU\r\n    POKE(0xFF90,0x40);\r\n\r\n    // Set graphics ON\r\n    POKE(0xFF98,0x80);\r\n\r\n    // Set 256x192x16 mode\r\n    POKE(0xFF99,0x1A);\r\n\r\n    // Set actual screen ram at $600000\r\n    POKE(0xFF9D,0xC0);\r\n    POKE(0xFF9E,0x00);\r\n\r\n    // Set palette   \r\n    for(i=0;i<16;++i)\r\n    {\r\n        POKE(0xFFB0+i,(unsigned char) i&0xFF);\r\n    }\r\n    \r\n    // Set MMU windows at $8000\r\n    POKE(0xFFA4,0x30);\r\n    POKE(0xFFA5,0x31);\r\n    POKE(0xFFA6,0x32);\r\n\r\n    for(i=0;i<24000;++i)\r\n    {\r\n        POKE(0x8000+i,(unsigned char) 255);\r\n    }\r\n    \r\n    while(1){};\r\n    \r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/coco_strings_test.c",
    "content": "\r\n#include <coco.h>\r\n#include <cmoc.h>\r\n\r\nchar strings[5][7] = \r\n{\r\n    \"Mine\",\r\n    \"Energy\",\r\n    \"Bonus\",\r\n    \"Points\",\r\n    \"Apple\",\r\n};\r\n\r\n\r\nint main(void)\r\n{\r\n    unsigned char i;\r\n    \r\n    for(i=0;i<5;++i)\r\n    {\r\n        printf(\"%s\\n\", strings[i]);\r\n    }\r\n    \r\n    while(1){};\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/comx_class.c",
    "content": "\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\n\r\n\r\n\r\nstruct ParentStruct\r\n{\r\n    int data;\r\n    void (*set_parent_data)(struct ParentStruct*, int);\r\n};\r\n\r\ntypedef struct ParentStruct parent_t;\r\n\r\nstruct ChildStruct\r\n{\r\n    parent_t _parent;\r\n    int more_data;\r\n    void (*set_child_data)(struct ChildStruct* this, int val);\r\n};\r\n\r\ntypedef struct ChildStruct child_t;\r\n\r\n\r\nvoid _set_parent_data(struct ParentStruct* this, int val)\r\n{\r\n    this->data = val;\r\n}\r\n\r\n\r\nvoid _set_child_data(child_t* this, int val)\r\n{\r\n    this->more_data = val;\r\n}\r\n\r\n\r\nint main()\r\n{\r\n    parent_t foo;\r\n    child_t bar;\r\n    parent_t *bar_p = (parent_t*) &bar;\r\n    unsigned int vidmem=0xf800;\r\n\r\n    setvideobase(vidmem);\r\n\r\n    bar._parent.set_parent_data = _set_parent_data;\r\n    foo.set_parent_data = _set_parent_data;\r\n   \r\n    foo.set_parent_data(&foo, 42);\r\n    bar_p->set_parent_data(bar_p, 43);\r\n    \r\n    if(foo.data==42)\r\n    {\r\n        vidstrcpy(vidmem+40, \"OK  -  FOO.DATA == 42\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+40, \"KO  -  FOO.DATA != 42\");\r\n    }\r\n    \r\n    if(bar_p->data==43)\r\n    {\r\n        vidstrcpy(vidmem+80, \"OK  -  BAR_P->DATA == 43\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+80, \"KO  -  BAR_P->DATA != 43\");\r\n    }\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/comx_conv_debug.c",
    "content": "\r\n\r\n#define BASE_ADDR 0xF800\r\n\r\ntypedef unsigned char uint8_t;\r\ntypedef unsigned short uint16_t;\r\n\r\nvoid main(){\r\n\r\n    uint16_t foo;\r\n    uint16_t bar = 42;\r\n    \r\n    foo = (uint16_t) BASE_ADDR + (uint16_t) bar;\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/debug/comx_hello.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$loop:\\n\"\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$loop\\n\"\t\t // Loop if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n    \" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n    \" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n    \"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\r\n    setvideobase(vidmem);\r\n    vidclr(vidmem,24*40);\r\n\r\n\tenableinterrupt();\r\n    printf(\"HELLO WORLD! %i %d  end of digits\\n second line\", 42, 43);\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/debug/comx_hello_integer.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$loop:\\n\"\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$loop\\n\"\t\t // Loop if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n    \" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n    \" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n    \"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\r\n    setvideobase(vidmem);\r\n\tdisableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\r\n\r\n\tenableinterrupt();\r\n    printf(\"HELLO WORLD! %i %d\", 42, 43);\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/comx_mod.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$loop:\\n\"\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$loop\\n\"\t\t // Loop if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n    \" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n    \" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n    \"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\ntypedef unsigned char uint8_t;\r\nuint8_t level;\r\n#define FIRST_ROCKETS_LEVEL 7\r\n#define FIRST_HORIZONTAL_WALLS_LEVEL 6\r\n\r\nuint8_t oneMissileLevel(void)\r\n{\r\n    return ((level%5)==3) || (level==5);\r\n}\r\n\r\nuint8_t rocketLevel(void)\r\n{\r\n    return (level >= FIRST_ROCKETS_LEVEL) && ((level%5)==2 || (level%5)==3);\r\n}\r\n\r\nuint8_t missileLevel(void)\r\n{\r\n    return level%5==4;\r\n}\t\r\n\r\nuint8_t bossLevel(void)\r\n{\r\n    return !(level%5);\r\n}\r\n\r\nuint8_t horizontalWallsLevel(void)\r\n{\r\n    return ((level >= FIRST_HORIZONTAL_WALLS_LEVEL) && ((level%5==1) || (level%5==4)));\r\n}\t\r\n\r\n\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\r\n    setvideobase(vidmem);\r\n\tdisableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\r\n\r\n\tenableinterrupt();\r\n    \r\n    for(level=1;level<=20;++level)\r\n    {\r\n        printf(\"LEVEL %d  \", level);\r\n        printf(\"1MISSILE: %d  \", oneMissileLevel());\r\n        printf(\"ROCKET: %d  \", rocketLevel());\r\n        printf(\"MISSILES: %d  \", missileLevel());\r\n        printf(\"BOSS: %d  \", bossLevel());\r\n        printf(\"H.WALL: %d\", horizontalWallsLevel());\r\n        printf(\"\\n\");\r\n        (void) cgetc();\r\n    }\r\n    \r\n    // printf(\"HELLO WORLD! %i %d\", 42, 43);\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/comx_pointer2func.c",
    "content": "void _do_nothing(void){}\r\nvoid main()\r\n{\r\n    void (*bar)(void) = _do_nothing;\r\n    bar();\r\n}\r\n"
  },
  {
    "path": "src/debug/comx_pp_debug.c",
    "content": "#include \"debug_images.h\"\r\n\n#if !defined(ANIMATE_PLAYER)\n\textern Image PLAYER_IMAGE;\n#else\n\textern Image PLAYER_DOWN;\n\textern Image PLAYER_UP;\n\textern Image PLAYER_RIGHT;\n\textern Image PLAYER_LEFT;\n#endif\n\t\nextern Image GHOST_IMAGE;\nextern Image BOMB_IMAGE;\n\n#if !defined(NO_DEAD_GHOSTS)\n\textern Image DEAD_GHOST_IMAGE;\n#endif\n\n#if !defined(TINY_GAME)\n\textern Image SKULL_IMAGE;\n\textern Image POWERUP_IMAGE;\n\textern Image GUN_IMAGE;\n\textern Image BULLET_IMAGE;\n\textern Image EXTRA_POINTS_IMAGE;\n\t\n\textern Image HORIZONTAL_BRICK_IMAGE;\n\textern Image VERTICAL_BRICK_IMAGE;\n#endif\n\n#if defined(FULL_GAME)\n\textern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\n\textern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\n\textern Image ROCKET_IMAGE;\n\n\textern Image FREEZE_IMAGE;\n\textern Image EXTRA_LIFE_IMAGE;\n\textern Image INVINCIBILITY_IMAGE;\n\textern Image SUPER_IMAGE;\t\n\textern Image CONFUSE_IMAGE;\n\textern Image ZOMBIE_IMAGE;\n\t\n\textern Image BROKEN_BRICK_IMAGE;\n#endif\n\nint main(void)\r\n{\r\n    \r\n    PLAYER_LEFT._imageData = _PLAYER_LEFT;\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/comx_simple_class.c",
    "content": "\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\n\r\nstruct ClassStruct\r\n{\r\n    int data;\r\n    void (*set_class_data)(struct ClassStruct*, int);\r\n};\r\n\r\ntypedef struct ClassStruct class_t;\r\n\r\n\r\nvoid _set_class_data(struct ClassStruct* this, int val)\r\n{\r\n    this->data = val;\r\n}\r\n\r\n\r\nint main()\r\n{\r\n    class_t foo;\r\n    \r\n    unsigned int vidmem=0xf800;\r\n\r\n    setvideobase(vidmem);\r\n\r\n    foo.set_class_data = _set_class_data;\r\n   \r\n    foo.set_class_data(&foo, 42);\r\n\r\n    \r\n    if(foo.data==42)\r\n    {\r\n        vidstrcpy(vidmem+40, \"OK  -  FOO.DATA == 42\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+40, \"KO  -  FOO.DATA != 42\");\r\n    }\r\n    \r\n\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/comx_simplest_class.c",
    "content": "\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\n\r\nstruct ClassStruct\r\n{\r\n    void (*method_t)(void);\r\n};\r\n\r\ntypedef struct ClassStruct class_t;\r\n\r\nunsigned int vidmem=0xf800;\r\n    \r\nvoid _print_42(void)\r\n{\r\n    vidstrcpy(vidmem+40, \"42\");\r\n}\r\n\r\n\r\nint main()\r\n{\r\n    class_t foo;\r\n\r\n    setvideobase(vidmem);\r\n\r\n    foo.method_t = _print_42;\r\n    \r\n    foo.method_t();\r\n    \r\n\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/comx_size_debug.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char  getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" bn3 $$nokey ;check if key pressed\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\" bn3 $ ;wait for key\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n\t\" b2 $$keypressed\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\r\n    setvideobase(vidmem);\r\n\tenableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD\");\r\n\r\n    if(sizeof(unsigned char)==1)\r\n    {\r\n        vidstrcpy(vidmem+80, \"UNSIGNED CHAR HAS SIZE 1\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+80, \"UNSIGNED CHAR DOES NOT HAVE SIZE 1!\");\r\n    }\r\n    \r\n    if(sizeof(unsigned short)==2)\r\n    {\r\n        vidstrcpy(vidmem+120, \"UNSIGNED SHORT HAS SIZE 2\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+120, \"UNSIGNED SHORT DOES NOT HAVE SIZE 2!\");\r\n    }\r\n\r\n    if(sizeof(unsigned int)==2)\r\n    {\r\n        vidstrcpy(vidmem+160, \"UNSIGNED INT HAS SIZE 2\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+160, \"UNSIGNED INT DOES NOT HAVE SIZE 2!\");\r\n    }\r\n    \r\n    if(sizeof(unsigned long)==4)\r\n    {\r\n        vidstrcpy(vidmem+200, \"UNSIGNED LONG HAS SIZE 4\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+200, \"UNSIGNED LONG DOES NOT HAVE SIZE 4!\");\r\n    }\r\n    \r\n    if(sizeof(unsigned long long)==8)\r\n    {\r\n        vidstrcpy(vidmem+240, \"UNSIGNED LONG LONG HAS SIZE 8\");\r\n    }\r\n    else\r\n    {\r\n        vidstrcpy(vidmem+240, \"UNSIGNED LONG LONG DOES NOT HAVE SIZE 8!\");\r\n    }\r\n    \r\n    while(1);\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/conio.c",
    "content": "\r\n/*\r\n * conio API test program\r\n *\r\n * keys:\r\n *\r\n * 1...0        change text color\r\n * F5/F6        change border color\r\n * F7/F8        change background color\r\n *\r\n */\r\n\r\n\r\n#include <conio.h>\r\n#include <string.h>\r\n#include <stdlib.h>\r\n#include <joystick.h>\r\n\r\n#if defined(__GAMATE__)\r\n/* there is not enough screen space to show all 256 characters at the bottom */\r\n#define NUMCHARS        128\r\n#define NUMCOLS           4\r\n#else\r\n#define NUMCHARS        256\r\n#define NUMCOLS          16\r\n#endif\r\n\r\nstatic char grid[5][5] = {\r\n    {CH_ULCORNER, CH_HLINE, CH_TTEE,  CH_HLINE, CH_URCORNER},\r\n    {CH_VLINE,    ' ',      CH_VLINE, ' ',      CH_VLINE   },\r\n    {CH_LTEE,     CH_HLINE, CH_CROSS, CH_HLINE, CH_RTEE    },\r\n    {CH_VLINE,    ' ',      CH_VLINE, ' ',      CH_VLINE   },\r\n    {CH_LLCORNER, CH_HLINE, CH_BTEE,  CH_HLINE, CH_LRCORNER}\r\n};\r\n\r\nvoid main(void)\r\n{\r\n        unsigned int i, j, n;\r\n        unsigned char xsize, ysize, tcol, bgcol, bcol, inpos = 0;\r\n#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)\r\n        unsigned char joy;\r\n\r\n        joy_install(joy_static_stddrv);\r\n#endif\r\n        clrscr();\r\n        screensize(&xsize, &ysize);\r\n        cputs(\"cc65 conio test\\n\\r\");\r\n        cputs(\"Input:[        ]\");      /* 8 spaces */\r\n\r\n        tcol = textcolor(0);    /* memorize original textcolor */\r\n        bgcol = bgcolor(0);     /* memorize original background color */\r\n        bcol = bordercolor(0);  /* memorize original border color */\r\n        (void)bordercolor(bcol);\r\n        (void)bgcolor(bgcol);\r\n\r\n        cputsxy(0, 2, \"Colors:\" );\r\n        for (i = 0; i < 3; ++i) {\r\n                gotoxy(i, 3 + i);\r\n                for (j = 0; j < NUMCOLS; ++j) {\r\n                        (void)textcolor(j);\r\n                        cputc('X');\r\n                }\r\n        }\r\n        (void)textcolor(tcol);\r\n\r\n        cprintf(\"\\n\\n\\r Screensize: %ux%u\", xsize, ysize);\r\n\r\n        chlinexy(0, 6, xsize);\r\n        cvlinexy(0, 6, 3);\r\n        chlinexy(0, 8, xsize);\r\n        cvlinexy(xsize - 1, 6, 3);\r\n        cputcxy(0, 6, CH_ULCORNER);\r\n        cputcxy(xsize - 1, 6, CH_URCORNER);\r\n        cputcxy(0, 8, CH_LLCORNER);\r\n        cputcxy(xsize - 1, 8, CH_LRCORNER);\r\n\r\n        for (i = 0; i < 5; ++i) {\r\n                gotoxy(xsize - 5, i);\r\n                for (j = 0; j < 5; ++j) {\r\n                        cputc(grid[i][j]);\r\n                }\r\n        }\r\n\r\n        gotoxy(0, ysize - 2 - ((NUMCHARS + xsize) / xsize));\r\n        revers(1);\r\n        for (i = 0; i < xsize; ++i) {\r\n                cputc('0' + i % 10);\r\n        }\r\n        revers(0);\r\n        for (i = 0; i < NUMCHARS; ++i) {\r\n            if ((i != '\\n') && (i != '\\r')) {\r\n                    cputc(i);\r\n            } else {\r\n                    cputc(' ');\r\n            }\r\n        }\r\n        while(wherex() > 0) {\r\n                cputc('#');\r\n        }\r\n        revers(1);\r\n        for (i = 0; i < xsize; ++i) {\r\n                cputc('0' + i % 10);\r\n        }\r\n        revers(0);\r\n\r\n        cursor(1);\r\n        for (;;) {\r\n                /* do the \"rvs\" blinking */\r\n                i = textcolor(COLOR_BLACK);\r\n                gotoxy(8, 2);\r\n                j = (++n / 16) & 1;\r\n                revers(j);\r\n                cputc(j ? 'R' : ' ');\r\n                revers(j ^ 1);\r\n                cputs(\" rvs\");\r\n                revers(0);\r\n                (void)textcolor(i);\r\n\r\n                gotoxy(7 + inpos, 1);\r\n\r\n#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)\r\n                /* not all targets have waitvsync */\r\n                waitvsync();\r\n                /* for targets that do not have a keyboard, read the first\r\n                   joystick */\r\n                joy = joy_read(JOY_1);\r\n                cprintf(\"%02x\", joy);\r\n#else\r\n                i = cgetc();\r\n                switch (i) {\r\n                    case CH_ENTER:\r\n                        clrscr();\r\n                        return;\r\n                    case CH_CURS_LEFT:\r\n                        inpos = (inpos - 1) % 8;\r\n                        break;\r\n                    case '0': case '1': case '2': case '3': case '4':\r\n                    case '5': case '6': case '7': case '8': case '9':\r\n                        (void)textcolor(i - '0');\r\n                        break;\r\n#ifdef CH_F5\r\n                    case CH_F5:\r\n                        bcol = (bcol + 1) & 0x0f;\r\n                        (void)bordercolor(bcol);\r\n                        break;\r\n#endif\r\n#ifdef CH_F6\r\n                    case CH_F6:\r\n                        bcol = (bcol - 1) & 0x0f;\r\n                        (void)bordercolor(bcol);\r\n                        break;\r\n#endif\r\n#ifdef CH_F7\r\n                    case CH_F7:\r\n                        bgcol = (bgcol + 1) & 0x0f;\r\n                        (void)bgcolor(bgcol);\r\n                        break;\r\n#endif\r\n#ifdef CH_F8\r\n                    case CH_F8:\r\n                        bgcol = (bgcol - 1) & 0x0f;\r\n                        (void)bgcolor(bgcol);\r\n                        break;\r\n#endif\r\n                    default:\r\n                        cputc(i);\r\n                        /* fallthrough */\r\n                    case CH_CURS_RIGHT:\r\n                        inpos = (inpos + 1) % 8;\r\n                }\r\n#endif\r\n        }\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/conio0.c",
    "content": "\r\n/*\r\n * conio API test program\r\n *\r\n * keys:\r\n *\r\n * 1...0        change text color\r\n * F5/F6        change border color\r\n * F7/F8        change background color\r\n *\r\n */\r\n\r\n\r\n#include <conio.h>\r\n#include <string.h>\r\n#include <stdlib.h>\r\n#include <joystick.h>\r\n\r\nint main()\r\n{\r\n    int i;\r\n    int j;\r\n    \r\n    for(i=0;i<10;++i)\r\n    {\r\n        for(j=0;j<10;++j)\r\n        {\r\n            gotoxy(i,j);\r\n            cputc('x');\r\n        }\r\n    }\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/conio_test.c",
    "content": "#include <conio.h>\r\n\r\nint main()\r\n{\r\n   gotoxy(0,1);\r\n   \r\n   cprintf(\"hello world\");\r\n\r\n   gotoxy(0,2);\r\n\r\n   cprintf(\"au revoir\");\r\n\r\n   gotoxy(0,3);\r\n   \r\n   cprintf(\"%d\", XSize);\r\n\r\n   gotoxy(5,3);\r\n   \r\n   cprintf(\"%d\", YSize);\r\n\r\n   gotoxy(0,0);\r\n   \r\n   // cprintf(\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\");\r\n   cprintf(\"0123456789012345678901234567890123456789\");\r\n   \r\n   gotoxy(0,24);\r\n   \r\n   // cprintf(\"01234567890123456789012345678901234567890123456789012345678901234567890123456789\");\r\n   cprintf(\"0123456789012345678901234567890123456789\");\r\n\r\n   while(1){};\r\n\r\n   return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/cpc_test.c",
    "content": "#include <conio.h>\r\n#include <graphics.h>\r\n#include <sys/ioctl.h>\r\n\r\n\r\nint main(void)\r\n{\r\n\r\n    int mode = 0;\r\n    console_ioctl(IOCTL_GENCON_SET_MODE, &mode);\r\n    \r\n    textbackground(BLACK);\r\n    \r\n    printf(\"Hello world\\n\");\r\n    getchar();\r\n    \r\n    bordercolor(BLACK);\r\n    \r\n    clrscr(); \r\n    textcolor(RED);\r\n    gotoxy(2,2);\r\n    printf(\"Hello world\\n\");\r\n    \r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/cprintf.c",
    "content": "#include <conio.h>\r\n\r\n\r\n\r\n#define _XL_PRINTD(x,y,length,val) \\\r\ndo \\\r\n{ \\\r\n    gotoxy(x,y); \\\r\n    cprintf(\"%0\" #length \"u\",val); \\\r\n} while(0)\r\n\r\nint main(void)\r\n{\r\n    // _XL_PRINTD(10,10,3,123);\r\n    cprintf(\"%03u\",123);\r\n\r\n    while(1){};\r\n    \r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/debug_images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#define _PLAYER_LEFT 42\n\ntypedef unsigned char uint8_t;\n\nstruct ImageStruct\n{\n\tuint8_t _imageData;\n\t#if !defined(_XL_NO_COLOR)\n\t\tuint8_t _color;\n\t#endif\n};\n\ntypedef struct ImageStruct Image;\n\n#if !defined(ANIMATE_PLAYER)\n\tImage PLAYER_IMAGE;\n#else\n\n        // #if !defined(__LCC1802__)\n    Image PLAYER_DOWN;\n    Image PLAYER_UP;\n    Image PLAYER_RIGHT;\n    Image PLAYER_LEFT;\n        // #endif\n\n#endif\n\n\n\tImage GHOST_IMAGE;\n\tImage BOMB_IMAGE;\t\n\n\n#if !defined(NO_DEAD_GHOSTS)\n\tImage DEAD_GHOST_IMAGE;\n#endif\n\n\n\n\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/debug/empty42.c",
    "content": "\nint main()\n{\n    int a = 42;\n    int b;\n\n    b = a;\n\n    return 0;\n}\n\n"
  },
  {
    "path": "src/debug/extern.c",
    "content": "#include \"extern.h\"\n\nextern const int foo[];\n\nint main(void)\n{\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/debug/extern.h",
    "content": "\nconst int foo[] = {42,43,44,45,46,47};\n\n"
  },
  {
    "path": "src/debug/foo.c",
    "content": "\r\nextern char foo[];\r\n\r\nint main(void)\r\n{\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/foo.h",
    "content": "\r\n\r\n#if defined(_FOO_DEF)\r\n    #define _FOO 43\r\n#endif\r\n\r\nstruct FooStruct\r\n{\r\n    unsigned char bar;\r\n}; \r\ntypedef struct FooStruct Foo;\r\n\r\n\r\nFoo FOO;\r\n"
  },
  {
    "path": "src/debug/fx.c",
    "content": "#include <sound.h>\r\n#include <stdio.h>\r\n\r\nvoid main()\r\n{\r\n\tint i;\r\n\r\n\tfor (i=0; i < 8 ; i++ ) {\r\n\t\tprintf(\"bit_fx(%u)\\n\",i);\r\n\t\tbit_fx(i);\r\n\t}\r\n\tfor (i=0; i < 8 ; i++ ) {\r\n\t\tprintf(\"bit_fx2(%u)\\n\",i);\r\n\t\tbit_fx2(i);\r\n\t}\r\n\tfor (i=0; i < 8 ; i++ ) {\r\n\t\tprintf(\"bit_fx3(%u)\\n\",i);\r\n\t\tbit_fx3(i);\r\n\t}\r\n\tfor (i=0; i < 8 ; i++ ) {\r\n\t\tprintf(\"bit_fx4(%u)\\n\",i);\r\n\t\tbit_fx4(i);\r\n\t}\r\n\tfor (i=0; i < 8 ; i++ ) {\r\n\t\tprintf(\"bit_fx5(%u)\\n\",i);\r\n\t\tbit_fx5(i);\r\n\t}\r\n    \r\n    while(1){};\r\n}\r\n"
  },
  {
    "path": "src/debug/gamate_conio_test.c",
    "content": "\r\n#include <conio.h>\r\n#include <unistd.h>\r\n#include <joystick.h>\r\n\r\nvoid waitForJoy(void)\r\n{\r\n    while(!(JOY_BTN_1(joy_read(0)))){};\r\n}\r\n\r\n\r\nint main(void)\r\n{    \r\n    joy_install((void *)joy_static_stddrv);    \r\n\r\n    while(1)\r\n    {\r\n        clrscr();\r\n        \r\n        gotoxy(2,2);\r\n        textcolor(COLOR_BLACK);\r\n        cprintf(\"hello\");\r\n        sleep(1);\r\n        waitForJoy();\r\n        \r\n        textcolor(COLOR_WHITE);\r\n        gotoxy(2,2);\r\n        cprintf(\"ciao!\");\r\n        sleep(1);\r\n        waitForJoy();\r\n        \r\n        gotoxy(2,2);\r\n        textcolor(1);\r\n        cprintf(\"hello\");\r\n        sleep(1);\r\n        waitForJoy();\r\n        \r\n        textcolor(2);\r\n        gotoxy(2,2);\r\n        cprintf(\"ciao!\");\r\n        sleep(1);\r\n        waitForJoy();\r\n\r\n        gotoxy(2,2);\r\n        textcolor(2);\r\n        cprintf(\"hello\");\r\n        sleep(1);\r\n        waitForJoy();\r\n        \r\n        textcolor(1);\r\n        gotoxy(2,2);\r\n        cprintf(\"ciao!\");\r\n        sleep(1);\r\n        waitForJoy();\r\n        \r\n        gotoxy(2,2);\r\n        textcolor(COLOR_BLACK);\r\n        cprintf(\"hello\");\r\n        sleep(1);\r\n        waitForJoy();\r\n        \r\n        textcolor(COLOR_WHITE);\r\n        gotoxy(2,2);\r\n        cprintf(\"ciao!\");    \r\n    }\r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/gamate_conio_test2.c",
    "content": "\r\n#include <conio.h>\r\n#include <unistd.h>\r\n#include <joystick.h>\r\n#include <stdint.h>\r\n\r\n\r\nvoid waitForJoy(void)\r\n{\r\n    while(!(JOY_BTN_1(joy_read(0)))){};\r\n}\r\n\r\n\r\nvoid display_3_rows(uint8_t x_offset, uint8_t y_offset)\r\n{\r\n    uint8_t i;\r\n    uint16_t j;\r\n    \r\n    for(i=0;i<3;++i)\r\n    {\r\n        gotoxy(x_offset,y_offset+i);\r\n        textcolor(1+i);\r\n        cprintf(\"hello\");\r\n        for(j=0;j<10000;++j){};\r\n        waitForJoy();\r\n    }\r\n}\r\n\r\n\r\nint main(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    joy_install((void *)joy_static_stddrv);    \r\n\r\n    while(1)\r\n    {\r\n        clrscr();\r\n        \r\n        for(i=0;i<3;++i)\r\n        {\r\n        display_3_rows(2+i,2+i);\r\n        waitForJoy();\r\n        }\r\n        \r\n        for(i=0;i<3;++i)\r\n        {\r\n        display_3_rows(2+5*i,9+i);\r\n        waitForJoy();\r\n        }\r\n        sleep(1);\r\n    }\r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/gb_main.c",
    "content": "\n#include <conio.h>\n\nint main(void)\n{   \n    unsigned char i;\n        \n    for(i=0;i<20;++i)\n    {\n        gotoxy(19,i);\n    }    \n\n    while(1){};\n    \n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/debug/gcc_class.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n\r\n\r\nstruct ParentStruct\r\n{\r\n    int data;\r\n    void (*set_parent_data)(struct ParentStruct*, int);\r\n};\r\n\r\ntypedef struct ParentStruct parent_t;\r\n\r\nstruct ChildStruct\r\n{\r\n    parent_t _parent;\r\n    int more_data;\r\n    void (*set_child_data)(struct ChildStruct* this, int val);\r\n};\r\n\r\ntypedef struct ChildStruct child_t;\r\n\r\n\r\nvoid _set_parent_data(struct ParentStruct* this, int val)\r\n{\r\n    this->data = val;\r\n}\r\n\r\n\r\nvoid _set_child_data(child_t* this, int val)\r\n{\r\n    this->more_data = val;\r\n}\r\n\r\n\r\nint main()\r\n{\r\n    parent_t foo;\r\n    child_t bar;\r\n    parent_t *bar_p = (parent_t*) &bar;\r\n   \r\n    bar._parent.set_parent_data = _set_parent_data;\r\n   \r\n    foo.set_parent_data = _set_parent_data;\r\n   \r\n    foo.set_parent_data(&foo, 42);\r\n   \r\n    bar_p->set_parent_data(bar_p, 43);\r\n   \r\n   \r\n    printf(\"value in parent: %d\\n\", foo.data);\r\n    printf(\"value in child: %d\\n\", bar_p->data);\r\n    \r\n    if(foo.data==42)\r\n    {\r\n        printf(\"OK  -  FOO.DATA == 42 OK\\n\");\r\n\r\n    }\r\n    else\r\n    {\r\n        printf(\"KO  -  FOO.DATA != 42\\n\");\r\n    }\r\n    \r\n    if(bar_p->data==43)\r\n    {\r\n        printf(\"OK  -  BAR_P->DATA == 43 OK\\n\");\r\n    }\r\n    else\r\n    {\r\n        printf(\"KO  -  BAR_P->DATA != 43 OK\\n\");\r\n    }\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n"
  },
  {
    "path": "src/debug/gcc_simple_class.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n\r\n\r\nstruct ClassStruct\r\n{\r\n    int data;\r\n    void (*set_data)(struct ClassStruct*, int);\r\n};\r\ntypedef struct ClassStruct class_t;\r\n\r\n\r\nvoid _set_data(struct ClassStruct* this, int val)\r\n{\r\n    this->data = val;\r\n}\r\n\r\n\r\n\r\nint main()\r\n{\r\n    class_t foo;\r\n   \r\n    foo.set_data = _set_data;\r\n    foo.set_data(&foo, 42);\r\n    \r\n    if(foo.data==42)\r\n    {\r\n        printf(\"OK  -  FOO.DATA == 42\\n\");\r\n    }\r\n    else\r\n    {\r\n        printf(\"KO  -  FOO.DATA != 42\\n\");\r\n    }\r\n\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n"
  },
  {
    "path": "src/debug/gcc_simplest_class.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n\r\n\r\nstruct ClassStruct\r\n{\r\n    void (*method_t)(void);\r\n};\r\ntypedef struct ClassStruct class_t;\r\n\r\n\r\nvoid _print_42(void)\r\n{\r\n    printf(\"42\\n\");\r\n}\r\n\r\n\r\n\r\nint main()\r\n{\r\n    class_t foo;\r\n   \r\n    foo.method_t = _print_42;\r\n\r\n    foo.method_t();\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n"
  },
  {
    "path": "src/debug/gcc_test.c",
    "content": "#include <system.h>\r\n#include <conio.h>\r\n\r\n#define NUMBER_OF_STRINGS 5\r\n#define MAX_STRING_SIZE 7\r\n\r\nconst char strings[NUMBER_OF_STRINGS][MAX_STRING_SIZE] = \r\n{\r\n    \"Mine\",\r\n    \"Energy\",\r\n    \"Bonus\",\r\n    \"Points\",\r\n    \"Apple\"\r\n};\r\n\r\n\r\nint main(void)\r\n{\r\n    uint8_i;\r\n    \r\n    set_graphics(VDP_SPR_16x16);                        // set video mode\r\n    charsetlc();                                        // load character set with lowercase\r\n    vdpmemset(gImage, 32, 768);                         // clear screen\r\n    VDP_SET_REGISTER(VDP_REG_COL, COLOR_BLACK);      // set screen color\r\n    \r\n\r\n    \r\n    for(i=0;i<NUMBER_OF_STRINGS;++i)\r\n    {\r\n        gotoxy(2,2+i);\r\n        cprintf(strings[i]);\r\n    }\r\n    \r\n    \r\n    while(1){};\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/generic_psg.c",
    "content": "#include <psg.h>\r\n\r\nint main(void)\r\n{\r\n    unsigned char i;\r\n    unsigned char j;\r\n    \r\n    psg_init();                       \r\n    psg_volume(0, 15);        \r\n    //psg_channels(1, 0); // set first channel to tone generation, reset noise channels\r\n          \r\n    for(i=0;i<16;i++)\r\n    {\r\n        psg_tone(0, 500-(i*16));\r\n        for(j=0;j<150;++j) {}\r\n    }         \r\n    psg_volume(0, 0);\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/getk_test.c",
    "content": "#include <conio.h>\r\n\r\nint main()\r\n{\r\n    while(1)\r\n    {\r\n        printf(\"ch: %d\\n\", getk());\r\n    }\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/h0comx.c",
    "content": "int main()\r\n{\r\n    int a = 42;\r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/hello_cgetc.c",
    "content": "#include<stdio.h>\r\n#include<conio.h>\r\n\r\nint main(){\r\n\r\n    while(1){\r\n        clrscr();\r\n        printf(\"Hello World!\\n\");\r\n        cgetc();\r\n    };\r\n    return 0;\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/debug/hello_conio.c",
    "content": "#include <conio.h>\nint main()\n{\n    clrscr();\n    gotoxy(4,4);\n    textcolor(RED);\n    cprintf(\"hello world\");\n    while(1){};\n    return 0;\n}\n\n"
  },
  {
    "path": "src/debug/hello_fputc.c",
    "content": "#include<stdio.h>\n\nint main()\n{\n\n    fputc_cons('h');\n    fputc_cons('e');\n    fputc_cons('l');\n    fputc_cons('l');\n    fputc_cons('o');\n    while(1){};\n    return 0;\n}\n\n"
  },
  {
    "path": "src/debug/hello_sdl.c",
    "content": "#include <SDL.h>\r\n#include <emscripten.h>\r\n#include <stdlib.h>\r\n\r\nSDL_Surface *screen;\r\n\r\nvoid drawRandomPixels() {\r\n    if (SDL_MUSTLOCK(screen)) SDL_LockSurface(screen);\r\n\r\n    Uint8 * pixels = screen->pixels;\r\n    \r\n    for (int i=0; i < 1048576; i++) {\r\n        char randomByte = rand() % 255;\r\n        pixels[i] = randomByte;\r\n    }\r\n\r\n    if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);\r\n\r\n    SDL_Flip(screen);\r\n}\r\n\r\nint main(int argc, char* argv[]) {\r\n    SDL_Init(SDL_INIT_VIDEO);\r\n    screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE);\r\n    \r\n    emscripten_set_main_loop(drawRandomPixels, 60, 1);\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/helloworld.c",
    "content": "#include<stdio.h>\r\n\r\nint main()\r\n{\r\n\r\n    printf(\"Hello World!\\n\");\r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/helloworld_background_color.c",
    "content": "#include<conio.h>\r\n#include <sys/ioctl.h>\r\n\r\n#if defined(__MSX__)\r\n    #define MODE 2\r\n#else\r\n    #define MODE 0\r\n#endif\r\n\r\nint main()\r\n{\r\n    int mode = MODE;\r\n    console_ioctl(IOCTL_GENCON_SET_MODE, &mode);\r\n\r\n    textcolor(WHITE);    \r\n    bordercolor(YELLOW);\r\n    textbackground(RED);\r\n    clrscr();\r\n\r\n    gotoxy(2,2);\r\n    cprintf(\"hello world\\n\");\r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/helloworld_getchar.c",
    "content": "#include<stdio.h>\r\nint main(){\r\n\r\n    while(1){\r\n        printf(\"Hello World!\\n\");\r\n        getchar();\r\n    };\r\n    return 0;\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/debug/htron.c",
    "content": "/**************************************************************\r\n*    htron.c                                   \t              *\r\n*    H-Tron - a Tron motorcycle game                          *\r\n*    Originally written in Borland Turbo C 2.01 for           *\r\n*    XT-class DOS PCs equipped with a Hercules graphics card  *\r\n*    Author: RobertK (RobertK@psc.at), December 2016          *\r\n*                                                             *\r\n*    Ported to the varous Z80-based computers                 *\r\n*    (based on DOS Version 2016-12-26a)                       *\r\n*    by RobertK in 2018 using the z88dk C compiler            *\r\n*                                                             *\r\n*    Portable z88dk Version 2020-05-04                        *\r\n*                                                             *\r\n*    Compile with z88dk nightly build                         *\r\n*    (last full compilation with version 2018-07-09,          *\r\n*    ColecoVision target with 2018-07-04 due to a             *\r\n*    problem with that target in the 2018-07-09 nightly)      * \r\n*    Do not use the stable release 1.99B because              *\r\n*    the z88dk team have since then massively improved        *\r\n*    the graphics functions for various targets.              *\r\n*                                                             *\r\n*    This is the classic overhead view \"Tron\" game from       *\r\n*    the movie of the same title (motorcycles that leave      *\r\n*    \"wall trails\" behind them). If you crash into a wall,    *\r\n*    your opponent scores a point. The player who first       *\r\n*    reaches a score of 5 wins.                               *\r\n*                                                             *\r\n*    Controls (on QWERTY keyboards, AZERTY differs)           *\r\n*    Turn left/right:                                         *\r\n*      Left Player: A/S                                       *\r\n*      Right Player: N/M or 5/8 (Cursor left/right on ZX81)   *\r\n*      (in one-player mode, human is right player)            *\r\n*    Start round: Space or 0                                  *\r\n*    Pause game: P                                            *\r\n*    End game: X                                              *\r\n**************************************************************/\r\n\r\n#include <stdio.h>\r\n// #include <zx81plot.h>\t// custom-made ASM plot() and point() functions for the ZX81 target (by A. Rea)\r\n#include <graphics.h>\t\t// contains standard plot() and point() functions\r\n\r\n#if defined(__PC6001__)\t|| defined(__MC1000__) || defined(__EINSTEIN80COLUMNS__) || defined(__TIKI100__) || defined(__GALPLUSHIRES__) || defined(__SMC777__) || defined(__EXCALIBUR64__) || defined(__FP1100__) // NEC PC-6001, CCE MC-1000, Tatung Einstein 80 column mode, Tiki-100, Galaksija Plus HiRes-Mode, Sony SMC-777, Casio FP-1100\r\n\t#include <sys/ioctl.h>\t\t// required for switching the screen mode\r\n#endif\r\n\r\n#if defined(__TIKI100__)\r\n\t#include <tiki100.h>\r\n#endif\r\n\r\n#if defined(__MSX__)\r\n\t#pragma output nofileio\t\t// we don't need any file I/O in this game, so we can save a few bytes here\r\n#endif\r\n\r\n// Some systems have no keyboard\r\n// These are usually consoles with two joysticks\r\n#if defined(__PV1000__) || (defined(__COLECO__) && !defined(__BIT90__)) || defined(__PACMAN__) || defined(__Z80TVGAME__) || defined(__GAMEBOY__) || defined(__MYVISION__) // Casio PV-1000, ColecoVision, PacMan-Hardware, etc.\r\n\t#define JOYSTICK_ONLY 1\r\n\t#include <games.h>\r\n#endif\r\n// But some have only one joystick\r\n#if defined(__Z80TVGAME__) || defined(__GAMEBOY__)\r\n\t#define TWO_PLAYER_MODE_NOT_AVAILABLE 1\r\n#endif\r\n// For joystick-only systems we have to define the joystick numbers, and\r\n// if there is a \"Pause\" button and a \"Menu\" button\r\n// -1 means that such a button is not available\r\n#if defined(__PV1000__) // Casio PV-1000\r\n\t#define JOYSTICK_1 0\r\n\t#define JOYSTICK_2 1\r\n\t#define JOYSTICK_BUTTON_MENU MOVE_FIRE3\t// Select\r\n\t#define JOYSTICK_BUTTON_PAUSE MOVE_FIRE4 // Start\t\r\n#elif defined(__COLECO__) && !defined(__BIT90__) // ColecoVision\r\n\t#define JOYSTICK_1 1\r\n\t#define JOYSTICK_2 2\r\n\t#define JOYSTICK_BUTTON_MENU MOVE_FIRE2\t// Select\r\n\t#define JOYSTICK_BUTTON_PAUSE -1 // only two-Joystick buttons available\t\r\n#elif defined(__PACMAN__)\t// PacMan-Hardware\r\n\t// PROVISIONAL VALUES\r\n\t#define JOYSTICK_1 1\r\n\t#define JOYSTICK_2 2\r\n\t#define JOYSTICK_BUTTON_MENU -1  // only 1-player start and 2-player-start button\r\n\t#define JOYSTICK_BUTTON_PAUSE -1 // only 1-player start and 2-player-start button\r\n#elif defined(__Z80TVGAME__)\t// Z80 TV-Game (homebrew)\r\n\t#define JOYSTICK_1 1\r\n\t#define JOYSTICK_2 1\t// The z88dk wiki says that this is a single joystick system, but the Takeda emulator supports two??\r\n\t#define JOYSTICK_BUTTON_MENU MOVE_FIRE2 // Button 2\r\n\t#define JOYSTICK_BUTTON_PAUSE -1\r\n#elif defined(__GAMEBOY__)\t// Nintendo Gameboy\r\n\t#define JOYSTICK_1 0\r\n\t#define JOYSTICK_2 1\r\n\t#define JOYSTICK_BUTTON_MENU MOVE_FIRE3\t// Select Button\r\n\t#define JOYSTICK_BUTTON_PAUSE MOVE_FIRE4 // Start Button\r\n#elif defined(__MYVISION__)\r\n\t#define JOYSTICK_1 1\r\n\t#define JOYSTICK_2 2\r\n\t#define JOYSTICK_BUTTON_MENU MOVE_FIRE3\t// Select Button\r\n\t#define JOYSTICK_BUTTON_PAUSE MOVE_FIRE4 // Start Button\r\n#endif\r\n\r\n// VT100 Console I/O ANSI driver for the targets that support it\r\n// we use this for gotoxy() and keyboard input\r\n#if defined(__ABC80__) || defined(__ACE__) || defined(__AQUARIUS__) || defined(__NASCOM__) || defined(__P2000__) || defined(__VG5000__) || defined(__SHARPMZ__) || defined(__VZ200__) || defined(__Z1013__) || defined(__Z9001__) || defined(__PC6001__) || defined(__MSX__) || defined(__CPC__) || defined(__X1__)\r\n\t#include <conio.h>\r\n\t#define USE_ANSI 1\r\n#elif ((defined(__TRS80__) && !defined(__EG2000__)) || defined(__PV1000__)) || defined(__SORCERER__) || defined(__COLECO__) || defined(__ALPHATRO__) || defined(__SPC1000__) || defined(__MULTI8__) || defined(__RX78__) || defined(__PV2000__) || defined(__SPECTRUM__) || defined(__KC__) || defined(__SVI__) || defined(__MTX__) || defined(__M5__) || defined(__SC3000__) || defined(__LASER500__) || defined(__EINSTEIN__) || (defined(__LYNX__) && !defined(__LYNXSTANDARDCONSOLE__)) || defined(__MC1000__) || defined(__BEE__) || defined(__TIKI100__) || defined(__SUPER80__) || defined(__GAL__) || defined(__SMC777__) || defined(__Z80TVGAME__) || defined(__EXCALIBUR64__) || defined(__GAMEBOY__) || defined(__RC700__) || defined(__PC88__) || defined(__FP1100__) || defined(__MYVISION__) || defined(__PENCIL2__) || defined(__HGMC__) || defined(__PMD85__) || defined(__VECTOR06C__) || defined(__HOMELAB__) || defined(__HOMELAB2__) || defined(__PRIMO__) || defined(__MIKRO80__) // TRS-80, Casio PV-1000, Exidy Sorcerer, ColecoVision, ...\r\n\t#define USE_GENERIC_CONSOLE 1\r\n#elif defined(__OSBORNE1__) || defined(__PACMAN__) || defined(__KAYPRO84__) || defined(__ATTACHE__) // Osborne 1, PacMan-Hardware, Kaypro, Otrona Attache\r\n\t#define USE_NATIVE_CONSOLE 1 \r\n#endif\r\n\r\n// #if defined(__TRS80__) || defined(__SORCERER__) \r\n// Triumph-Adler Alphatronic PC, Samsung SPC-1000, Mitsubishi Multi8\r\n// Note: TRS-80 / EG2000 and Exidy Sorcerer use inkey_pressed() input during gameplay, but native keyboard input is used in menus\r\n#if defined(__ALPHATRO__) || defined(__SPC1000__) || defined(__MULTI8__) || defined(__TRS80__) || defined(__SORCERER__) || defined(__RX78__) || defined(__PV2000__) || defined(__SPECTRUM__) || defined(__SVI__)|| defined(__MTX__) || defined(__M5__) || defined(__SC3000__) || defined(__LASER500__) || defined(__EINSTEIN__) || defined(__OSBORNE1__) || defined(__LYNX__) || defined(__MC1000__) || defined(__BEE__) || defined(__TIKI100__) || defined(__SUPER80__) || defined(__GAL__) || defined(__SMC777__) || defined(__ATTACHE__) || defined(__EXCALIBUR64__) || defined(__RC700__) || defined(__PC88__) || defined(__PENCIL2__) || defined(__PMD85__) || defined(__BIT90__) || defined(__VECTOR06C__) || defined(__HOMELAB2__) || defined(__MIKRO80__) || defined(__PRIMO__)\r\n\t#define USE_NATIVE_INPUT 1\t\t// kbhit() and getch() without conio.h\r\n#endif\r\n\r\n#if defined(__ZX81__) || defined(__ZX80__) || defined(__ACE__) || defined(__VZ200__) || defined(__SORCERER__) || defined(__VG5000__) || defined(__TRS80__) || defined(__AQUARIUS__) || defined(__SPECTRUM__) || defined(__PMD85__) || defined(__PRIMO__) || defined(__MIKRO80__)\r\n\t#define USE_INKEYPRESSED 1\t\t// allows simultaneously checking the status of more than just one key\r\n#endif\r\n\r\n// These systems can only display upper-case characters, but in the C source you need to\r\n// use lower-case characters while the upper-case ones have a different meaning (for the \r\n// ZX80 and ZX81 they produce inverse character)\r\n#if defined(__ZX81__) || defined(__ZX80__) || defined(__PACMAN__) || (defined(__GAL__) && !defined(__GALPLUSHIRES__)) || defined(__HOMELAB2__) || defined(__MIKRO80__)\r\n\t#define SMALL_LETTERS_ONLY 1\r\n#endif\r\n\r\n// Here we define the position of the separator line, etc.\r\n// Most systems use the values in the ELSE section, but some need special values.\r\n#if (defined(__VZ200__) && !defined(VZ200_LGFX)) || defined(__P2000__) || (defined(__TRS80__) && defined(__EG2000__)) || defined(__PC88__)\r\n  // Some systems cannot combine text and graphics, so the z88dk team kindly added\r\n  // 4x6 character support to their graphic modes. This requires a different method\r\n  // of text positioning by specifying pixel coordinates instead of line and column \r\n  // coordinates. For these systems we define FOUR_BY_SIX_CHARACTERS.\r\n  #define FOUR_BY_SIX_CHARACTERS 1\r\n  #define SCORE_LINE 0\r\n  #define SCORE_COL 0\r\n  #define BORDER_TOP 7\r\n  #define SEPARATOR_LINE -1\t// not drawn\r\n#elif defined(__TRS80__) && !defined(__EG2000__)\t// TRS-80\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 2\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 6\r\n#elif defined(__SORCERER__) || defined(__MULTI8__) || defined(__SPECTRUM__) || defined(__OSBORNE1__) || defined(__BEE__) || defined(__MIKRO80__) // Exidy Sorcerer, Mitsubishi Multi8, ZX Spectrum, Osborne 1, Microbee, Mikro-80\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 2\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 5\r\n#elif defined(__ALPHATRO__)  // Triumph-Adler Alphatronic PC\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 7\r\n#elif defined(__NASCOM__)\t// Nascom\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 7\r\n#elif defined(__PC6001__)\t// NEC PC-6001\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 7\r\n#elif defined(__SPC1000__) // Samsung SPC-1000\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 7\r\n#elif defined(__VG5000__)  // Philips VG5000\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 7\r\n#elif defined(__EINSTEIN80COLUMNS__) || defined(__RC700__)  // Tatung Einstein 80 column mode, RC-700\r\n  #define SCORE_LINE 0\r\n  #define SCORE_COL 3\r\n  #define BORDER_TOP 1\r\n  #define SEPARATOR_LINE -1 // not drawn\r\n#elif defined(__SUPER80__) && !defined(__SUPER80_VDUEM__) // Super-80 e or m model\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 7\r\n#elif defined(__SUPER80__) && defined(__SUPER80_VDUEM__) // Super-80 r or v model\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 2\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 5  \r\n#elif defined(__PACMAN__)\t// PacMan-Hardware\r\n  // PROVISIONAL VALUES\r\n  #define SCORE_LINE 2\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 5\r\n#elif (defined(__GAL__) && !defined(__GALPLUSHIRES__))\r\n  #define SCORE_LINE 0\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 4\r\n  #define SEPARATOR_LINE -1 // not drawn\r\n#elif defined(__ATTACHE__)\t// Otrona Attache\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 2\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 6\r\n#elif defined(__EXCALIBUR64__)\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 7\r\n#else\r\n  #define SCORE_LINE 1\r\n  #define SCORE_COL 1\r\n  #define BORDER_TOP 0\r\n  #define SEPARATOR_LINE 5\r\n#endif\r\n\r\n// Some 4x6 character systems offer a higher resolution, there we \r\n// do not need to shorten the text strings\r\n#if (defined(__VZ200__) && !defined(VZ200_LGFX)) || (defined(__TRS80__) && defined(__EG2000__)) || defined(__PC88__)\r\n  #define FOUR_BY_SIX_CHARACTERS_WIDE_SCREEN 1\r\n#endif\r\n// On some 4x6 systems we don't need to show the menu texts in two parts\r\n#if defined(__TRS80__) && defined(__EG2000__) || defined(__PC88__)\r\n  #define FOUR_BY_SIX_CHARACTERS_TALL_SCREEN 1\r\n#endif\r\n// Some systems support uppercase and lowercase characters, but have a narrow screen\r\n#if defined(__PV1000__)\r\n  // identical to the FOUR_BY_SIX_CHARACTERS_WIDE_SCREEN variant, but with both uppercase and lowercase letters\r\n  #define STANDARD_CHARACTERS_NARROW_SCREEN 1\r\n#elif defined(__RX78__)\r\n  // RX78: This system is special: 24x23 makes an almost quadratic layout \r\n  #define STANDARD_CHARACTERS_NARROW_BUT_TALL_SCREEN 1\r\n#elif defined(__Z80TVGAME__) || defined(__GAMEBOY__)\r\n  #define STANDARD_CHARACTERS_VERYNARROW_BUT_TALL_SCREEN 1\r\n#endif\r\n\r\n// Some systems have a screen resolution that requires us to double the \r\n// pixels on one axis to get closer to a 4:3 aspect ratio. Apart from looking \r\n// odd, the movement on one axis would be twice as fast as on the other axis\r\n// if we wouldn't make this correction.\r\n#if (defined(__TRS80__) && !defined(__EG2000__)) || defined(__SORCERER__) || defined(__MULTI8__) || defined(__OSBORNE1__) || defined(__CPC__) || defined(__BEE__) || defined(__EINSTEIN80COLUMNS__) || defined(__SUPER80_VDUEM__) || defined(__MIKRO80__) // || defined(__HOMELAB__) // || defined(__RC700__)\r\n// TRS-80, Exidy Sorcerer, Mitsubishi Multi8, Osborne 1, CPC, Tatung Einstein 80 Columns, Microbee, Super-80 r or v model\r\n  #define DOUBLE_PIXELS_HORIZONTALLY 1\r\n#endif \r\n\r\n// On some systems with high resolution graphics we use c_plot() and c_point() to \r\n// achieve a pseudo lo-res graphics resolution. c_plot() creates a 4x4 pixel rectangle,\r\n// which turns e.g. a 256x192 resolution into 64x48.\r\n#if defined(__COLECO__) || defined(__MULTI8__) || defined(__RX78__) || defined(__PV2000__) || defined(__SPECTRUM__) || defined(__SC3000__) || defined(__KC__) || defined(__MSX__) || defined(__M5__) || defined(__SVI__) || defined(__MTX__) || (defined(__EINSTEIN__) && !defined(__EINSTEIN80COLUMNS__)) || defined(__CPC__) || defined(__MC1000__) || defined(__TIKI100__) || (__GALPLUSHIRES__) || defined(__Z80TVGAME__) || defined(__ATTACHE__) || defined(__X1__) || defined(__MYVISION__) || defined(__PENCIL2__) || defined(__HGMC__) || defined(__PMD85__) || defined(__VECTOR06C__) || defined(__PRIMO__)\r\n  #define USE_C_PLOT 1\r\n#endif \r\n\r\n// The Sharp MZ seems to run out of stack space when the program crashes at the \r\n// \"char textP1[25];\" declaration within the InitPlayfield() function. Solution according to dom: \r\n// \"compiling with the atexit size removed - by default on the MZ that's taking up 64 bytes of stack\"\r\n// \"For your case, I don't think there's any benefit in protecting that #pragma as just for the MZ - \r\n// I'm guessing you're not using atexit() so it might as well be 0 for all targets.\"\r\n// #if defined(__SHARPMZ__)\t// Sharp MZ\r\n\t#pragma output CLIB_EXIT_STACK_SIZE = 0\r\n// #endif\r\n\r\n#define POINTS_TO_WIN 5\r\n\r\n// On systems with very low resolution we reduce the AI player's sighting distance to get him closer to the walls\r\n#if (defined(__VZ200__) && defined(VZ200_LGFX)) // || defined(__SPC1000__)\r\n\t#define AI_MAX_DISTANCE_TO_CHECK 8\r\n\t#define AI_SHORTSIGHTED_FACTOR 5\r\n#else\r\n\t#define AI_MAX_DISTANCE_TO_CHECK 12 // (DOS version: 15)\r\n\t#define AI_SHORTSIGHTED_FACTOR 8\r\n#endif\r\n\r\n// ZX81 and ZX80 Key Codes\r\n#define KEY_CODE_0 48\r\n#define KEY_CODE_1 49\r\n#define KEY_CODE_2 50\r\n#define KEY_CODE_SPACE 32\r\n\r\n// Keypress codes - only for those systems where in_KeyPressed() is implemented\r\n// You can find out these codes like this:\r\n// printf(\"in_lookupkey() for a is %d\\n\",in_LookupKey('a'));\r\n#if defined(__ZX81__) || defined(__ZX80__) || defined(__SPECTRUM__)\r\n\t#define KEYPRESS_CODE_5 4343\r\n\t#define KEYPRESS_CODE_8 1263\r\n\t#define KEYPRESS_CODE_A 509\r\n\t#define KEYPRESS_CODE_M 1151\r\n\t#define KEYPRESS_CODE_N 2175\r\n\t#define KEYPRESS_CODE_P 479\r\n\t#define KEYPRESS_CODE_S 765\r\n\t#define KEYPRESS_CODE_X 1278\t\r\n#elif defined(__ACE__)\r\n\t#define KEYPRESS_CODE_5 4343\r\n\t#define KEYPRESS_CODE_8 1263\r\n\t#define KEYPRESS_CODE_A 509\r\n\t#define KEYPRESS_CODE_M 639\r\n\t#define KEYPRESS_CODE_N 1151\r\n\t#define KEYPRESS_CODE_P 479\r\n\t#define KEYPRESS_CODE_S 765\r\n\t#define KEYPRESS_CODE_X 2302\r\n#elif defined(__VZ200__)\r\n\t#define KEYPRESS_CODE_5 -2303\r\n\t#define KEYPRESS_CODE_8 -8440\r\n\t#define KEYPRESS_CODE_A -752\r\n\t#define KEYPRESS_CODE_M -4320\r\n\t#define KEYPRESS_CODE_N -4351\r\n\t#define KEYPRESS_CODE_P -16624\r\n\t#define KEYPRESS_CODE_S -766\r\n\t#define KEYPRESS_CODE_X -1278\r\n#elif defined(__SORCERER__)\r\n\t#define KEYPRESS_CODE_5 4101\r\n\t#define KEYPRESS_CODE_8 4104\r\n\t#define KEYPRESS_CODE_A 1026\r\n\t#define KEYPRESS_CODE_M 262\r\n\t#define KEYPRESS_CODE_N 518\r\n\t#define KEYPRESS_CODE_P 2057\r\n\t#define KEYPRESS_CODE_S 1027\r\n\t#define KEYPRESS_CODE_X 258\r\n#elif defined(__VG5000__)\t// this machine from France has an AZERTY keyboard\r\n\t#define KEYPRESS_CODE_5 4099\r\n\t#define KEYPRESS_CODE_8 16389\r\n\t#define KEYPRESS_CODE_A 513\t\t// Q instead of A\r\n\t#define KEYPRESS_CODE_M 4101\t// , instead of M\r\n\t#define KEYPRESS_CODE_N 1031\r\n\t#define KEYPRESS_CODE_P -32764\r\n\t#define KEYPRESS_CODE_S 259\r\n\t#define KEYPRESS_CODE_X 514\r\n#elif defined(__TRS80__) \t// TRS-80 or EG2000, both use the same key codes\r\n\t#define KEYPRESS_CODE_5 8196\r\n\t#define KEYPRESS_CODE_8 261\r\n\t#define KEYPRESS_CODE_A 512\r\n\t#define KEYPRESS_CODE_M 8193\r\n\t#define KEYPRESS_CODE_N 16385\r\n\t#define KEYPRESS_CODE_P 258\r\n\t#define KEYPRESS_CODE_S 2050\r\n\t#define KEYPRESS_CODE_X 259\r\n#elif defined(__AQUARIUS__)\t// Mattel Aquarius\r\n\t#define KEYPRESS_CODE_5 261\r\n\t#define KEYPRESS_CODE_8 259\r\n\t#define KEYPRESS_CODE_A 8198\r\n\t#define KEYPRESS_CODE_M 2050\r\n\t#define KEYPRESS_CODE_N 4098\r\n\t#define KEYPRESS_CODE_P 2049\r\n\t#define KEYPRESS_CODE_S 1030\r\n\t#define KEYPRESS_CODE_X 8197\r\n#elif defined(__PMD85__)\r\n\t#define KEYPRESS_CODE_5 516\r\n\t#define KEYPRESS_CODE_8 519\r\n\t#define KEYPRESS_CODE_A 2048\r\n\t#define KEYPRESS_CODE_M 4103\r\n\t#define KEYPRESS_CODE_N 4102\r\n\t#define KEYPRESS_CODE_P 1033\r\n\t#define KEYPRESS_CODE_S 2049\r\n\t#define KEYPRESS_CODE_X 4098\r\n#elif defined(__PRIMO__)\r\n\t#define KEYPRESS_CODE_5 29\r\n\t#define KEYPRESS_CODE_8 33\r\n\t#define KEYPRESS_CODE_A 14\r\n\t#define KEYPRESS_CODE_M 44\r\n\t#define KEYPRESS_CODE_N 32\r\n\t#define KEYPRESS_CODE_P 50\r\n\t#define KEYPRESS_CODE_S 2\r\n\t#define KEYPRESS_CODE_X 10\r\n#elif defined(__MIKRO80__)\r\n\t#define KEYPRESS_CODE_5 8192\r\n\t#define KEYPRESS_CODE_8 513\r\n\t#define KEYPRESS_CODE_A 2050\r\n\t#define KEYPRESS_CODE_M 516\r\n\t#define KEYPRESS_CODE_N 1028\r\n\t#define KEYPRESS_CODE_P 4100\r\n\t#define KEYPRESS_CODE_S 261\r\n\t#define KEYPRESS_CODE_X 8197\r\n#endif\r\n\r\n// The key codes on the ZX81 and ZX80 are the same, but for the menu screens we use in_Inkey() \r\n// on the ZX81 and fgetc_cons() on the ZX80, and these two function return different codes.\r\n#if defined(__ZX80__) || defined(__SPECTRUM__)\r\n\t#define KEY_CODE_D 100\r\n\t#define KEY_CODE_M 109\r\n\t#define KEY_CODE_N 110\r\n\t#define KEY_CODE_P 112\r\n\t#define KEY_CODE_X 120\r\n\t#define KEY_CODE_Y 121\r\n#else\t// we use these ZX81 constants for the ANSI variants as well (the actual code values are irrelevant for this purpose)\r\n\t#define KEY_CODE_D 68\r\n\t#define KEY_CODE_M 77\r\n\t#define KEY_CODE_N 78\r\n\t#define KEY_CODE_P 80\r\n\t#define KEY_CODE_X 88\r\n\t#define KEY_CODE_Y 89\r\n#endif\r\n\r\n\r\n// ZX81/ZX80/Ace playfield dimensions:  64 x 48  (DOS version:  90 x 58 )\r\n\r\n// Define the screen dimensions and startup positions for the current system\r\n// Note: the screen dimensions can be determined on runtime by calling getmaxx() and getmaxy()\r\n#if defined(__ZX81__) || defined(__ZX80__) || defined(__ACE__) || (defined(__GAL__) && !defined(__GALPLUSHIRES__)) || defined(__COLECO__) || defined(__PV2000__) || defined(__SC3000__) || defined(__PC6001__) || defined(__MSX__) || defined(__M5__) || defined(__SVI__) || defined(__MTX__) || defined(__SPC1000__) || (defined(__EINSTEIN__) && !defined(__EINSTEIN80COLUMNS__)) || defined(__MC1000__) || (defined(__SUPER80__) && !defined(__SUPER80_VDUEM__)) || defined(__MYVISION__) || defined(__PENCIL2__) || defined(__PRIMO__)\r\n// ZX81, ZX80, Jupiter Ace, Galaksija, ColecoVision, Casio PV-2000 (using c_plot), etc.\r\n\t#define X_RES 64\r\n\t#define Y_RES 48\r\n\t#define X_COLS 32\r\n\t#define STARTUP_P1_X 10\r\n\t#define STARTUP_P2_X 53\r\n\t#define STARTUP_Y 26\r\n#elif defined(__SPECTRUM__)\t// ZX Spectrum\r\n\t#define X_RES 64\r\n\t#define Y_RES 48\r\n\t#define X_COLS 64\r\n\t#define STARTUP_P1_X 10\r\n\t#define STARTUP_P2_X 53\r\n\t#define STARTUP_Y 26\r\n#elif defined(__GAL__) && defined(__GALPLUSHIRES__)\t// Galaksija Plus Hi-Res Mode 256x208\r\n\t#define X_RES 64\r\n\t#define Y_RES 52\r\n\t#define X_COLS 32\r\n\t#define STARTUP_P1_X 10\r\n\t#define STARTUP_P2_X 53\r\n\t#define STARTUP_Y 28\r\n#elif defined(__VG5000__) || defined(__EXCALIBUR64__)\t// Philips VG5000 or Excalibur 64\r\n\t#define X_RES 80\r\n\t#define Y_RES 72\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 67\r\n\t#define STARTUP_Y 39\r\n#elif defined(__AQUARIUS__) || defined(__Z9001__) || defined(__LASER500__) || defined(__FP1100__)\t// Mattel Aquarius, Robotron Z9001, Laser 500/700, Casio FP-1100\r\n\t#define X_RES 80\r\n\t#define Y_RES 48\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 67\r\n\t#define STARTUP_Y 26\r\n#elif defined(__VZ200__)\t// VZ200 / Laser 310/210/110\r\n\t#if !defined(VZ200_LGFX)\r\n\t\t#define X_RES 128\r\n\t\t#define Y_RES 64\r\n\t\t#define X_COLS 32\r\n\t\t#define STARTUP_P1_X 20\r\n\t\t#define STARTUP_P2_X 107\r\n\t\t#define STARTUP_Y 35\r\n\t#else\r\n\t\t#define X_RES 64\r\n\t\t#define Y_RES 32\r\n\t\t#define X_COLS 32\r\n\t\t#define STARTUP_P1_X 10\r\n\t\t#define STARTUP_P2_X 53\r\n\t\t#define STARTUP_Y 17\t\t\r\n\t#endif\r\n#elif defined(__TRS80__) && !defined(__EG2000__)\t// TRS-80\r\n\t#define X_RES 64\t// normally 128, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 48\r\n\t#define X_COLS 64\t// no VT100 Console I/O ANSI for this system\r\n\t#define STARTUP_P1_X 10 // normally 20, see above\r\n\t#define STARTUP_P2_X 53 // normally 107, see above\r\n\t#define STARTUP_Y 26\r\n#elif defined(__TRS80__) && defined(__EG2000__)\t\t// EG2000  (constant for this sub-type available since nightly 2018-03-31)\r\n\t#define X_RES 160\r\n\t#define Y_RES 96\t// 160x102 on the newer models, but only 160x96 on the older ones - we use the latter so it will work on both models\r\n\t#define X_COLS 40\t// no VT100 Console I/O ANSI for this system\r\n\t#define STARTUP_P1_X 25\r\n\t#define STARTUP_P2_X 134\r\n\t#define STARTUP_Y 54\r\n#elif defined(__Z1013__) || defined(__HGMC__) || defined(__LYNX__) || defined(__VECTOR06C__)\t// Robotron Z1013, Hübler-Grafik-MC, Camputers Lynx, Vector 06c\r\n\t#define X_RES 64\r\n\t#define Y_RES 64\r\n\t#define X_COLS 32\r\n\t#define STARTUP_P1_X 10\r\n\t#define STARTUP_P2_X 53\r\n\t#define STARTUP_Y 35\r\n#elif defined(__SHARPMZ__) || defined(__SMC777__) || defined(__X1__) || defined(__HOMELAB2__)\t// Sharp MZ, Sony SMC-777 or Sharp X1\r\n\t#define X_RES 80\r\n\t#define Y_RES 50\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 67\r\n\t#define STARTUP_Y 27\r\n#elif defined(__ABC80__)\t// Luxor ABC 80\r\n\t#define X_RES 78\r\n\t#define Y_RES 72\t\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 65\r\n\t#define STARTUP_Y 39\r\n#elif defined(__NASCOM__)\t// Nascom\r\n\t#define X_RES 96\r\n\t#define Y_RES 48\r\n\t#define X_COLS 48\r\n\t#define STARTUP_P1_X 15\r\n\t#define STARTUP_P2_X 80\r\n\t#define STARTUP_Y 26\r\n#elif defined(__P2000__)\t// Philips P2000\r\n\t#define X_RES 78\r\n\t#define Y_RES 72\r\n\t#define X_COLS 19\t// normally 40, but with 4x6 characters LOWER(X_RES / 4)\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 65\r\n\t#define STARTUP_Y 39\r\n#elif defined(__PV1000__)\t// Casio PV-1000\r\n\t#define X_RES 56\r\n\t#define Y_RES 48\r\n\t#define X_COLS 28\r\n\t#define STARTUP_P1_X 8\r\n\t#define STARTUP_P2_X 47\r\n\t#define STARTUP_Y 26\r\n#elif defined(__SORCERER__)\r\n\t#define X_RES 64\t// normally 128, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 60\r\n\t#define X_COLS 64\r\n\t#define STARTUP_P1_X 10 // normally 20, see above\r\n\t#define STARTUP_P2_X 53 // normally 107, see above\r\n\t#define STARTUP_Y 31\r\n#elif defined(__ALPHATRO__)\t// Triumph-Adler Alphatronic PC\r\n\t#define X_RES 80\r\n\t#define Y_RES 72\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 67\r\n\t#define STARTUP_Y 39\r\n/*\r\n// SPC-1000 resolution is now 64x48, see above\r\n#elif defined(__SPC1000__)\t// Samsung SPC-1000\r\n\t#define X_RES 64\r\n\t#define Y_RES 32\r\n\t#define X_COLS 32\r\n\t#define STARTUP_P1_X 10\r\n\t#define STARTUP_P2_X 53\r\n\t#define STARTUP_Y 17\r\n\t/*\r\n\t#define X_RES 32\t// normally 64, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 32\r\n\t#define X_COLS 32\r\n\t#define STARTUP_P1_X 5\t// normally 10, see above\r\n\t#define STARTUP_P2_X 26 // normally 53, see above\r\n\t#define STARTUP_Y 17\r\n\t*/\r\n*/\r\n#elif defined(__MULTI8__)\t// Mitsubishi Multi8 (640x200)\r\n\t#define X_RES 80\t\t// normally 160, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 50\r\n\t#define X_COLS 80\r\n\t#define STARTUP_P1_X 12\t// normally 25, see above\r\n\t#define STARTUP_P2_X 67\t// normally 134, see above\r\n\t#define STARTUP_Y 27\r\n#elif defined(__CPC__)\t\t// Amstrad/Schneider CPC (640x200)\r\n\t#define X_RES 80\t\t// normally 160, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 50\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 12\t// normally 25, see above\r\n\t#define STARTUP_P2_X 67\t// normally 134, see above\r\n\t#define STARTUP_Y 27\r\n#elif defined(__RX78__)\t// Bandai RX-78\r\n\t#define X_RES 48\r\n\t#define Y_RES 46\r\n\t#define X_COLS 24\r\n\t#define STARTUP_P1_X 7\r\n\t#define STARTUP_P2_X 40\r\n\t#define STARTUP_Y 25\r\n#elif defined(__GAMEBOY__)\t// Nintendo Gameboy\r\n\t#define X_RES 40\r\n\t#define Y_RES 36\r\n\t#define X_COLS 20\r\n\t#define STARTUP_P1_X 6\r\n\t#define STARTUP_P2_X 33\r\n\t#define STARTUP_Y 19\r\n#elif defined(__KC__) // Robotron HC-900, KC85/2..KC85/5\r\n\t#define X_RES 80\r\n\t#define Y_RES 64\t\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 67\r\n\t#define STARTUP_Y 35\r\n#elif defined(__OSBORNE1__)\r\n\t#define X_RES 52 // normally 104, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 48\t\r\n\t#define X_COLS 52\r\n\t#define STARTUP_P1_X 8  // normally 16, see above\r\n\t#define STARTUP_P2_X 43 // normally 87, see above\r\n\t#define STARTUP_Y 26\r\n#elif defined(__EINSTEIN80COLUMNS__) // || defined(__RC700__) // Tatung Einstein 80 column mode\r\n\t#define X_RES 40\t// normally 80, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 25\r\n\t#define X_COLS 80\r\n\t#define STARTUP_P1_X 6\t// normally 12, see above\r\n\t#define STARTUP_P2_X 33\t// normally 67, see above\r\n\t#define STARTUP_Y 13\r\n#elif defined(__RC700__) // RC-700\r\n\t#define X_RES 80\r\n\t#define Y_RES 25\r\n\t#define X_COLS 80\r\n\t#define STARTUP_P1_X 12\r\n\t#define STARTUP_P2_X 67\r\n\t#define STARTUP_Y 13\r\n#elif defined(__BEE__) // Microbee\r\n\t#define X_RES 80\t// normally 160, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 48\r\n\t#define X_COLS 80\r\n\t#define STARTUP_P1_X 12\t// normally 25, see above\r\n\t#define STARTUP_P2_X 67\t// normally 134, see above\r\n\t#define STARTUP_Y 26\r\n#elif defined(__TIKI100__) || defined(__HOMELAB__) //  || defined(__MIKRO80__)    // Tiki-100 (also known as \"Kontiki-100\"), Homelab 3/4, Mikro-80\r\n\t#define X_RES 128\r\n\t#define Y_RES 64\r\n\t#define X_COLS 64\r\n\t#define STARTUP_P1_X 20\r\n\t#define STARTUP_P2_X 107\r\n\t#define STARTUP_Y 35\r\n#elif defined(__MIKRO80__)    // Mikro-80\r\n\t#define X_RES 64\t// normally 128, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 64\r\n\t#define X_COLS 64\r\n\t#define STARTUP_P1_X 10\t\t// normally 20, see above\r\n\t#define STARTUP_P2_X 53\t\t// normally 107, see above\r\n\t#define STARTUP_Y 35\t\r\n/*\r\n#elif defined(__HOMELAB__)\t// Homelab 3/4\r\n\t#define X_RES 64\t// normally 128, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 64\r\n\t#define X_COLS 64\r\n\t#define STARTUP_P1_X 10\t\t// normally 20, see above\r\n\t#define STARTUP_P2_X 53\t\t// normally 107, see above\r\n\t#define STARTUP_Y 35\r\n*/\r\n#elif defined(__SUPER80__) && defined(__SUPER80_VDUEM__)\t\t// Super-80 r or v model\r\n\t#define X_RES 80 // normally 160, but on this system we double the pixels horizontally to get a better aspect ratio\r\n\t#define Y_RES 50\r\n\t#define X_COLS 80\r\n\t#define STARTUP_P1_X 12\t// normally 25, see above\r\n\t#define STARTUP_P2_X 67\t// normally 134, see above\r\n\t#define STARTUP_Y 27\t\r\n#elif defined(__PACMAN__)\t// PacMan-Hardware\r\n\t#define X_RES 56\r\n\t#define Y_RES 72\r\n\t#define X_COLS 28\r\n\t#define STARTUP_P1_X 8\r\n\t#define STARTUP_P2_X 47\r\n\t#define STARTUP_Y 39\r\n#elif defined(__Z80TVGAME__)\t// Z80 TV-Game (homebrew)\r\n\t#define X_RES 42\r\n\t#define Y_RES 52\r\n\t#define X_COLS 21\r\n\t#define STARTUP_P1_X 6\r\n\t#define STARTUP_P2_X 35\r\n\t#define STARTUP_Y 28\r\n#elif defined(__ATTACHE__)\t// Otrona Attache\r\n\t#define X_RES 80\r\n\t#define Y_RES 60\r\n\t#define X_COLS 80\r\n\t#define STARTUP_P1_X 12\t// normally 25, see above\r\n\t#define STARTUP_P2_X 67\t// normally 134, see above\r\n\t#define STARTUP_Y 31\r\n#elif defined(__PC88__)\t\t// NEC PC-800x\r\n\t#define X_RES 160\r\n\t#define Y_RES 100\r\n\t#define X_COLS 40\r\n\t#define STARTUP_P1_X 25\r\n\t#define STARTUP_P2_X 134\r\n\t#define STARTUP_Y 54\t\r\n#elif defined(__PMD85__)\r\n\t#define X_RES 72\r\n\t#define Y_RES 64\r\n\t#define X_COLS 48\r\n\t#define STARTUP_P1_X 11\r\n\t#define STARTUP_P2_X 60\r\n\t#define STARTUP_Y 35\t\r\n#else\r\n\t#define X_RES 0\r\n\t#define Y_RES 0\t\r\n\t#define X_COLS 0\r\n\t#define STARTUP_P1_X 0\r\n\t#define STARTUP_P2_X 0\r\n\t#define STARTUP_Y 0\r\n#endif \r\n\r\n// Delay Values\r\n// These values are milliseconds\r\n#define DELAY_DEMO_BEFOREROUNDSTART 1000\r\n#define DELAY_AFTER_CRASH 250\r\n\r\n// We adjust the speed for each system so that in 1-player mode it takes the player \r\n// about 5,5 seconds to horizontally cross the entire screen.\r\n// On the higher-resolution systems (VZ200, EG2000), we set the \r\n// values so that this takes about 7,5 seconds.\r\n#if defined(__ZX81__) || defined(__ZX80__) \t// ZX81, ZX80\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 5\r\n\t#define DELAY_GAME_TWOPLAYERS 18\r\n#elif defined(__ACE__)\t\t// Jupiter Ace\r\n\t#define DELAY_BEFORE_NEWKEY 0\r\n\t#define DELAY_GAME_DEMO 40\r\n\t#define DELAY_GAME_ONEPLAYER 50\r\n\t#define DELAY_GAME_TWOPLAYERS 60\r\n#elif defined(__AQUARIUS__)\t// Mattel Aquarius\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 20\r\n\t#define DELAY_GAME_ONEPLAYER 30\r\n\t#define DELAY_GAME_TWOPLAYERS 40\r\n#elif defined(__Z1013__)\t// Robotron Z1013\r\n\t// Check if \"Z1013_2MHZ\" has been defined in the compile parameters\r\n\t#if !defined(Z1013_2MHZ) // 1 MHz values\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 0\r\n\t\t#define DELAY_GAME_ONEPLAYER 6\r\n\t\t#define DELAY_GAME_TWOPLAYERS 60\r\n\t#else // 2 MHz values\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 20\r\n\t\t#define DELAY_GAME_ONEPLAYER 75\r\n\t\t#define DELAY_GAME_TWOPLAYERS 130\r\n\t#endif\t\r\n#elif defined(__Z9001__)\t// Robotron Z9001\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 15\r\n\t#define DELAY_GAME_ONEPLAYER 32\r\n\t#define DELAY_GAME_TWOPLAYERS 55\r\n#elif defined(__P2000__)\t// Philips P2000\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 12\r\n\t#define DELAY_GAME_ONEPLAYER 35\r\n\t#define DELAY_GAME_TWOPLAYERS 60\r\n#elif defined(__VG5000__)\t// Philips VG5000\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 30\r\n\t#define DELAY_GAME_ONEPLAYER 40\r\n\t#define DELAY_GAME_TWOPLAYERS 50\r\n#elif defined(__TRS80__) && !defined(__EG2000__)  // TRS-80\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 4\r\n\t#define DELAY_GAME_TWOPLAYERS 60\r\n#elif defined(__TRS80__) && defined(__EG2000__)  // EG2000\r\n\t// here it takes about 7,5 seconds in one-player mode to horizontally move across the entire screen\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 0\r\n\t#define DELAY_GAME_TWOPLAYERS 27\r\n#elif defined(__SHARPMZ__)\t// Sharp MZ\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 20\r\n\t#define DELAY_GAME_ONEPLAYER 30\r\n\t#define DELAY_GAME_TWOPLAYERS 40\r\n#elif defined(__VZ200__)  // VZ200 / Laser 310/210/110\r\n\t#if !defined(VZ200_LGFX)\r\n\t\t// 128x64 values\r\n\t\t// here it takes about 7,5 seconds in one-player mode to horizontally move across the entire screen\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 15\r\n\t\t#define DELAY_GAME_ONEPLAYER 25\r\n\t\t#define DELAY_GAME_TWOPLAYERS 40\r\n\t#else\r\n\t\t// 64x32 values\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 40\r\n\t\t#define DELAY_GAME_ONEPLAYER 50\r\n\t\t#define DELAY_GAME_TWOPLAYERS 65\r\n\t#endif\r\n#elif defined(__SORCERER__) // Exidy Sorcerer\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 3\r\n\t#define DELAY_GAME_ONEPLAYER 27\r\n\t#define DELAY_GAME_TWOPLAYERS 57\r\n#elif defined(__PV1000__)\t// Casio PV-1000\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 8\r\n\t#define DELAY_GAME_TWOPLAYERS 20\r\n#elif defined(__ALPHATRO__)  // Triumph-Adler Alphatronic PC\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 10\r\n\t#define DELAY_GAME_ONEPLAYER 26\r\n\t#define DELAY_GAME_TWOPLAYERS 50\r\n#elif defined(__SPC1000__)\t// Samsung SPC-1000\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 60\r\n\t#define DELAY_GAME_ONEPLAYER 65\r\n\t#define DELAY_GAME_TWOPLAYERS 75\r\n#elif defined(__MULTI8__)  // Mitsubishi Multi8\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 10\r\n\t#define DELAY_GAME_ONEPLAYER 20\r\n\t#define DELAY_GAME_TWOPLAYERS 40\r\n#elif defined(__COLECO__)\t// ColecoVision or Bit-90\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 35\r\n\t#define DELAY_GAME_ONEPLAYER 45\r\n\t#define DELAY_GAME_TWOPLAYERS 58\r\n#elif defined(__RX78__)\t// Bandai RX-78\t- due to the smaller screen, we let it take 5 seconds\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 50\r\n\t#define DELAY_GAME_ONEPLAYER 60\r\n\t#define DELAY_GAME_TWOPLAYERS 70\r\n#elif defined(__PV2000__)\t// Casio PV-2000\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 35\r\n\t#define DELAY_GAME_ONEPLAYER 45\r\n\t#define DELAY_GAME_TWOPLAYERS 58\r\n#elif defined(__NASCOM__)\t// Nascom\r\n\t// Note: Unfortunately, this system is not powerful enough for this game.\r\n    // Only the 2-player mode is playable (on a 4 MHz Nascom at about 90% of the desired speed).\r\n\t// EDIT: the accurate speed of the original hardware is still unknown, because the emulators \r\n\t// run at different speeds.\t\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 0\r\n\t#define DELAY_GAME_TWOPLAYERS 0\r\n#elif defined(__SPECTRUM__)\t// ZX Spectrum\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 35\r\n\t#define DELAY_GAME_ONEPLAYER 45\r\n\t#define DELAY_GAME_TWOPLAYERS 62\r\n#elif defined(__SC3000__)\t// Sega SC-3000\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 20\r\n\t#define DELAY_GAME_ONEPLAYER 35\r\n\t#define DELAY_GAME_TWOPLAYERS 55\r\n#elif defined(__PC6001__)\t// NEC PC-6001 - these are the values for the Mk2 model, the original machine was slower\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 12\r\n\t#define DELAY_GAME_TWOPLAYERS 27\r\n#elif defined(__MSX__)\t// MSX\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 20\r\n\t#define DELAY_GAME_ONEPLAYER 30\r\n\t#define DELAY_GAME_TWOPLAYERS 50\r\n#elif defined(__M5__)\t// Sord M5\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 30\r\n\t#define DELAY_GAME_ONEPLAYER 39\r\n\t#define DELAY_GAME_TWOPLAYERS 60\r\n#elif defined(__SVI__)\t// Spectravideo SVI\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 20\r\n\t#define DELAY_GAME_ONEPLAYER 35\r\n\t#define DELAY_GAME_TWOPLAYERS 55\r\n#elif defined(__KC__)\t// Robotron KC85/2..KC85/5 and HC900\r\n\t// Note: Unfortunately, this system is not powerful enough for this game.\r\n\t// One-Player mode is a little slower than it should be\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 0\r\n\t#define DELAY_GAME_TWOPLAYERS 30\r\n#elif defined(__LASER500__) // VTech Laser 350/500/700\r\n// MAME 0.201 delay values - in MAME the game runs faster than on the real hardware\r\n/*\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 30\r\n\t#define DELAY_GAME_ONEPLAYER 40\r\n\t#define DELAY_GAME_TWOPLAYERS 55\r\n*/\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 15\r\n\t#define DELAY_GAME_ONEPLAYER 21\r\n\t#define DELAY_GAME_TWOPLAYERS 35\r\n#elif defined(__EINSTEIN__)  // Tatung Einstein\r\n\t#if !defined(__EINSTEIN80COLUMNS__)\t// 40 column mode\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 30\r\n\t\t#define DELAY_GAME_ONEPLAYER 40\r\n\t\t#define DELAY_GAME_TWOPLAYERS 55\r\n\t#else\t// 80 column mode (TK02)\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 80\r\n\t\t#define DELAY_GAME_ONEPLAYER 90\r\n\t\t#define DELAY_GAME_TWOPLAYERS 100\r\n\t#endif\r\n#elif defined(__OSBORNE1__)\t// Osborne 1\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 60\r\n\t#define DELAY_GAME_ONEPLAYER 70\r\n\t#define DELAY_GAME_TWOPLAYERS 82\r\n#elif defined(__LYNX__)\t// Camputers Lynx\r\n\t#if defined(__LYNXSTANDARDCONSOLE__)\r\n\t\t// Standard console (ROM printer)\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 4\r\n\t\t#define DELAY_GAME_ONEPLAYER 20\r\n\t\t#define DELAY_GAME_TWOPLAYERS 50\r\n\t#else\r\n\t\t// Generic console\r\n\t\t#define DELAY_BEFORE_NEWKEY 50\r\n\t\t#define DELAY_GAME_DEMO 2\r\n\t\t#define DELAY_GAME_ONEPLAYER 19\r\n\t\t#define DELAY_GAME_TWOPLAYERS 50\r\n\t#endif\r\n#elif defined(__MTX__)\t// Memotech MTX\r\n\t#define DELAY_BEFORE_NEWKEY 30\r\n\t#define DELAY_GAME_DEMO 30\r\n\t#define DELAY_GAME_ONEPLAYER 40\r\n\t#define DELAY_GAME_TWOPLAYERS 55\r\n#elif defined(__CPC__)  // Amstrad/Schneider CPC\r\n\t#define DELAY_BEFORE_NEWKEY 10\r\n\t#define DELAY_GAME_DEMO 5\r\n\t#define DELAY_GAME_ONEPLAYER 10\r\n\t#define DELAY_GAME_TWOPLAYERS 25\r\n#elif defined(__MC1000__)\t// CCE MC-1000\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 20\r\n\t#define DELAY_GAME_ONEPLAYER 30\r\n\t#define DELAY_GAME_TWOPLAYERS 50\r\n#elif defined (__BEE__) // Microbee\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 15\r\n\t#define DELAY_GAME_ONEPLAYER 30\r\n\t#define DELAY_GAME_TWOPLAYERS 40\r\n#elif defined(__TIKI100__)  // Tiki-100 (also known as \"Kontiki-100\")\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 5\r\n\t#define DELAY_GAME_ONEPLAYER 15\r\n\t#define DELAY_GAME_TWOPLAYERS 33\r\n#elif defined(__SUPER80__) && !defined(__SUPER80_VDUEM__) // Super-80 e or m model\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 3\r\n\t#define DELAY_GAME_TWOPLAYERS 30\r\n#elif defined(__SUPER80__) && defined(__SUPER80_VDUEM__) // Super-80 r or v model\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 5\r\n\t#define DELAY_GAME_ONEPLAYER 17\r\n\t#define DELAY_GAME_TWOPLAYERS 45\r\n#elif defined(__PACMAN__)\t// PacMan-Hardware\r\n\t// PROVISIONAL VALUES\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 35\r\n\t#define DELAY_GAME_ONEPLAYER 60\r\n\t#define DELAY_GAME_TWOPLAYERS 90\r\n#elif (defined(__GAL__) && !defined(__GALPLUSHIRES__))\t// Galaksija\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 1\t// still too slow, but 1 instead of 0 to avoid massive speed-ups when the computer player is within closely spaced walls\r\n\t#define DELAY_GAME_TWOPLAYERS 20\r\n#elif (defined(__GAL__) && defined(__GALPLUSHIRES__))\t// Galaksija Plus Hi-Res\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 1\t// still too slow, but 1 instead of 0 to avoid massive speed-ups when the computer player is within closely spaced walls\r\n\t#define DELAY_GAME_TWOPLAYERS 16\r\n#elif defined(__SMC777__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 25\r\n\t#define DELAY_GAME_ONEPLAYER 35\r\n\t#define DELAY_GAME_TWOPLAYERS 50\r\n#elif defined(__Z80TVGAME__)\t// Z80 TV-Game (homebrew)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 50\r\n\t#define DELAY_GAME_ONEPLAYER 60\r\n\t#define DELAY_GAME_TWOPLAYERS 70\r\n#elif defined(__ATTACHE__)\t// Otrona Attache\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 18\r\n\t#define DELAY_GAME_ONEPLAYER 30\r\n\t#define DELAY_GAME_TWOPLAYERS 47\r\n#elif defined(__EXCALIBUR64__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 30\r\n\t#define DELAY_GAME_ONEPLAYER 40\r\n\t#define DELAY_GAME_TWOPLAYERS 55\r\n#elif defined(__GAMEBOY__)\r\n\t#define DELAY_BEFORE_NEWKEY 10\r\n\t#define DELAY_GAME_DEMO 80\r\n\t#define DELAY_GAME_ONEPLAYER 95\r\n\t#define DELAY_GAME_TWOPLAYERS 110\r\n#elif defined(__RC700__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 80\r\n\t#define DELAY_GAME_ONEPLAYER 90\r\n\t#define DELAY_GAME_TWOPLAYERS 100\r\n#elif defined(__PC88__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 45\r\n\t#define DELAY_GAME_ONEPLAYER 55\r\n\t#define DELAY_GAME_TWOPLAYERS 65\r\n#elif defined(__X1__)\r\n\t#define DELAY_BEFORE_NEWKEY 100\r\n\t#define DELAY_GAME_DEMO 13\r\n\t#define DELAY_GAME_ONEPLAYER 24\r\n\t#define DELAY_GAME_TWOPLAYERS 45\r\n#elif defined(__FP1100__)\r\n\t#define DELAY_BEFORE_NEWKEY 20\r\n\t#define DELAY_GAME_DEMO 25\r\n\t#define DELAY_GAME_ONEPLAYER 35\r\n\t#define DELAY_GAME_TWOPLAYERS 47\r\n#elif defined(__MYVISION__)\r\n\t#define DELAY_BEFORE_NEWKEY 10\r\n\t#define DELAY_GAME_DEMO 12\r\n\t#define DELAY_GAME_ONEPLAYER 27\r\n\t#define DELAY_GAME_TWOPLAYERS 45\r\n#elif defined(__PENCIL2__)\r\n\t#define DELAY_BEFORE_NEWKEY 70\r\n\t#define DELAY_GAME_DEMO 35\r\n\t#define DELAY_GAME_ONEPLAYER 45\r\n\t#define DELAY_GAME_TWOPLAYERS 63\r\n#elif defined(__HGMC__)\t\t// Hübler-Grafik-MC\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 22\r\n\t#define DELAY_GAME_TWOPLAYERS 55\r\n#elif defined(__PMD85__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 0\r\n\t#define DELAY_GAME_TWOPLAYERS 38\r\n#elif defined(__VECTOR06C__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 0\r\n\t#define DELAY_GAME_ONEPLAYER 15\r\n\t#define DELAY_GAME_TWOPLAYERS 43\r\n#elif defined(__HOMELAB__)\r\n\t#define DELAY_BEFORE_NEWKEY 100\r\n\t#define DELAY_GAME_DEMO 15\r\n\t#define DELAY_GAME_ONEPLAYER 27\r\n\t#define DELAY_GAME_TWOPLAYERS 45\r\n#elif defined(__HOMELAB2__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 45\r\n\t#define DELAY_GAME_ONEPLAYER 60\r\n\t#define DELAY_GAME_TWOPLAYERS 75\r\n#elif defined(__PRIMO__)\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 25\r\n\t#define DELAY_GAME_ONEPLAYER 40\r\n\t#define DELAY_GAME_TWOPLAYERS 60\r\n#elif defined(__MIKRO80__)\r\n\t// #define DELAY_BEFORE_NEWKEY 50\r\n\t// #define DELAY_GAME_DEMO 2\r\n\t// #define DELAY_GAME_ONEPLAYER 20\r\n\t// #define DELAY_GAME_TWOPLAYERS 45\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 24\r\n\t#define DELAY_GAME_ONEPLAYER 53\r\n\t#define DELAY_GAME_TWOPLAYERS 81\r\n#else\t\t// default values from Mattel Aquarius, need to be adjusted for each new supported target\r\n\t#define DELAY_BEFORE_NEWKEY 50\r\n\t#define DELAY_GAME_DEMO 20\r\n\t#define DELAY_GAME_ONEPLAYER 30\r\n\t#define DELAY_GAME_TWOPLAYERS 40\r\n#endif \r\n\r\n// Text constants\r\n#if defined(SMALL_LETTERS_ONLY) || defined(FOUR_BY_SIX_CHARACTERS_WIDE_SCREEN)\r\n\t#define SCORE_COMP1 \"computer 1: %d\"\r\n\t#define SCORE_COMP2 \"computer 2: %d\"\r\n\t#define SCORE_COMP \"computer: %d\"\r\n\t#define SCORE_HUMAN \"human: %d\"\r\n\t#define SCORE_P1 \"player 1: %d\"\r\n\t#define SCORE_P2 \"player 2: %d\"\r\n\r\n\t#define MENU_LINE1 \"*** h-tron ***\\n\"\r\n\t#define MENU_LINE2 \"by robertk (2016, 2018)\\n\"\r\n\t\r\n\t#if defined(JOYSTICK_ONLY)\r\n\t\t#define MENU_LINE3 \"\\nuse joystick left/right\\n\"\r\n\t\t#define MENU_LINE4 \"to select game type\\n\\n\"\r\n\t#else\r\n\t\t#define MENU_LINE3 \"controls:\\n\\n\"\r\n\t\t#define MENU_LINE4 \"turn left/right:\\n\"\r\n\t\t#define MENU_LINE5 \" left player: a/s\\n\"\r\n\t\t#define MENU_LINE6 \" right player: n/m or 5/8\\n\"\r\n\t\t#define MENU_LINE8 \" (in one-player mode,\\n\"\r\n\t\t#define MENU_LINE9 \"  human is right player)\\n\\n\"\r\n\t\t\r\n\t\t// On the Galaksija, we need to save one line to make everything fit on the screen \r\n\t\t#if (defined(__GAL__) && !defined(__GALPLUSHIRES__))\r\n\t\t\t#define MENU_LINE10 \"pause game: p, end game: x\\n\"\r\n\t\t#else\r\n\t\t\t#define MENU_LINE10 \"pause game: p, end game: x\\n\\n\"\t\t\t\r\n\t\t#endif\r\n\t\t\r\n\t\t#define MENU_LINE11 \"press space or 0\\n\"\r\n\t\t#define MENU_LINE12 \"to start a round\\n\\n\"\r\n\t\t#define MENU_LINE13 \"one or two players (1/2)?\\n\"\r\n\t\t#define MENU_LINE14 \"(or press d for demo mode)\"\r\n\t#endif\r\n\t\t\r\n\t#define END_FINALSCORE \"final score\"\r\n\r\n\t#define END_COMP1_WINS \"computer player one wins\\n\"\r\n\t#define END_P1_WINS \"player one wins\\n\"\r\n\t#define END_COMP_WINS \"computer wins\\n\"\r\n\t#define END_COMP2_WINS \"computer player two wins\\n\"\r\n\t#define END_P2_WINS \"player two wins\\n\"\r\n\t#define END_YOU_WIN \"you win\\n\"\r\n\t#define END_A_DRAW \"a draw\\n\"\r\n\t\r\n\t#if !defined(JOYSTICK_ONLY)\r\n\t\t#define END_PLAY_AGAIN \"\\nplay again (y/n)?\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(press m to return to the menu)\\n\"\r\n\t#else\r\n\t\t#define END_PLAY_AGAIN \"\\npress fire to play again\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(move joystick up for menu)\\n\"\r\n\t#endif \t\r\n\r\n#elif defined(FOUR_BY_SIX_CHARACTERS)\r\n\t#define SCORE_COMP1 \"comp 1: %d\"\r\n\t#define SCORE_COMP2 \"comp 2: %d\"\r\n\t#define SCORE_COMP \"comp: %d\"\r\n\t#define SCORE_HUMAN \"human: %d\"\r\n\t#define SCORE_P1 \"plr 1: %d\"\r\n\t#define SCORE_P2 \"plr 2: %d\"\r\n\r\n\t#define MENU_LINE1 \"*** h-tron ***\\n\"\r\n\t#define MENU_LINE2 \"by robertk\\n(2016, 2018)\\n\"\r\n\t#define MENU_LINE3 \"\\ncontrols:\\n\\n\"\r\n\t#define MENU_LINE4 \"turn left/right:\\n\"\r\n\t#if defined(__VG5000__) // this machine from France has an AZERTY keyboard\r\n\t\t#define MENU_LINE5 \" left player: q/s\\n\"\r\n\t\t#define MENU_LINE6 \" right player: n/,\\n or 5/8\\n\"\r\n\t#else\r\n\t\t#define MENU_LINE5 \" left player: a/s\\n\"\r\n\t\t#define MENU_LINE6 \" right player: n/m\\n or 5/8\\n\"\r\n\t#endif\r\n\t#define MENU_LINE8 \"(in 1-player mode,\\n\"\r\n\t#define MENU_LINE9 \" human is right pl.)\\n\"\r\n\t#define MENU_LINE10 \"pause game: p\\nend game: x\\n\\n\"\r\n\t#define MENU_LINE11 \"press space or 0\\n\"\r\n\t#define MENU_LINE12 \"to start a round\\n\\n\"\r\n\t#define MENU_LINE13 \"(1) or (2) players?\\n\"\r\n\t#define MENU_LINE14 \"(or d for demo mode)\"\r\n\r\n\t#define END_FINALSCORE \"final score\"\r\n\r\n\t#define END_COMP1_WINS \"computer player one wins\\n\"\r\n\t#define END_P1_WINS \"player one wins\\n\"\r\n\t#define END_COMP_WINS \"computer wins\\n\"\r\n\t#define END_COMP2_WINS \"computer player two wins\\n\"\r\n\t#define END_P2_WINS \"player two wins\\n\"\r\n\t#define END_YOU_WIN \"you win\\n\"\r\n\t#define END_A_DRAW \"a draw\\n\"\r\n\t#define END_PLAY_AGAIN \"\\nplay again (y/n)?\\n\\n\"\r\n\t#define END_M_FOR_MENU \"(press m to return\\nto the menu)\\n\"\r\n\t\r\n\t\r\n#elif defined(STANDARD_CHARACTERS_NARROW_SCREEN)\r\n\t#define SCORE_COMP1 \"Comp 1: %d\"\r\n\t#define SCORE_COMP2 \"Comp 2: %d\"\r\n\t#define SCORE_COMP \"Comp: %d\"\r\n\t#define SCORE_HUMAN \"Human: %d\"\r\n\t#define SCORE_P1 \"Plr 1: %d\"\r\n\t#define SCORE_P2 \"Plr 2: %d\"\r\n\t\r\n\t#define MENU_LINE1 \"*** H-Tron ***\\n\"\r\n\t#define MENU_LINE2 \"by RobertK (2016, 2018)\\n\"\r\n\t\r\n\t#if defined(JOYSTICK_ONLY)\r\n\t\t#define MENU_LINE3 \"\\nUse Joystick left/right\\n\"\r\n\t\t#define MENU_LINE4 \"to select game type\\n\\n\"\r\n\t#else\t\r\n\t\t#define MENU_LINE3 \"Controls:\\n\\n\"\r\n\t\t#define MENU_LINE4 \"Turn left/right:\\n\"\r\n\t\t#define MENU_LINE5 \" Left player: A/S\\n\"\r\n\t\t#define MENU_LINE6 \" Right player: N/M or 5/8\\n\"\r\n\t\t#define MENU_LINE8 \" (in one-player mode,\\n\"\r\n\t\t#define MENU_LINE9 \"  human is right player)\\n\\n\"\r\n\t\t#define MENU_LINE10 \"Pause game: P, End Game: X\\n\\n\"\r\n\t\t#define MENU_LINE11 \"Press Space or 0\\n\"\r\n\t\t#define MENU_LINE12 \"to start a round\\n\\n\"\r\n\t\t#define MENU_LINE13 \"One or two players (1/2)?\\n\"\r\n\t\t#define MENU_LINE14 \"(or press D for demo mode)\"\r\n\t#endif \r\n\t\r\n\t#define END_FINALSCORE \"Final score\"\r\n\r\n\t#define END_COMP1_WINS \"Computer player one wins\\n\"\r\n\t#define END_P1_WINS \"Player one wins\\n\"\r\n\t#define END_COMP_WINS \"Computer wins\\n\"\r\n\t#define END_COMP2_WINS \"Computer player two wins\\n\"\r\n\t#define END_P2_WINS \"Player two wins\\n\"\r\n\t#define END_YOU_WIN \"You win\\n\"\r\n\t#define END_A_DRAW \"A draw\\n\"\r\n\t\r\n\t#if !defined(JOYSTICK_ONLY)\r\n\t\t#define END_PLAY_AGAIN \"\\nPlay again (y/n)?\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(press M to return to the menu)\\n\"\r\n\t#else\r\n\t\t#define END_PLAY_AGAIN \"\\nPress fire to play again\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(move joystick up for menu)\\n\"\r\n\t#endif \r\n\r\n#elif defined(STANDARD_CHARACTERS_NARROW_BUT_TALL_SCREEN)\r\n\t#define SCORE_COMP1 \"Comp 1: %d\"\r\n\t#define SCORE_COMP2 \"Comp 2: %d\"\r\n\t#define SCORE_COMP \"Comp: %d\"\r\n\t#define SCORE_HUMAN \"Human: %d\"\r\n\t#define SCORE_P1 \"Plr 1: %d\"\r\n\t#define SCORE_P2 \"Plr 2: %d\"\r\n\t\r\n\t#define MENU_LINE1 \"*** H-Tron ***\\n\"\r\n\t#define MENU_LINE2 \"by RobertK (2016, 2018)\\n\"\r\n\t\r\n\t#if defined(JOYSTICK_ONLY)\r\n\t\t#define MENU_LINE3 \"\\nUse Joystick left/right\\n\"\r\n\t\t#define MENU_LINE4 \"to select game type\\n\\n\"\r\n\t#else\t\r\n\t\t#define MENU_LINE3 \"Controls:\\n\\n\"\r\n\t\t#define MENU_LINE4 \"Turn left/right:\\n\"\r\n\t\t#define MENU_LINE5 \" Left player: A/S\\n\"\r\n\t\t#define MENU_LINE6 \" Right plr: N/M or 5/8\\n\"\r\n\t\t#define MENU_LINE8 \" (in one-player mode,\\n\"\r\n\t\t#define MENU_LINE9 \"  human is right player)\\n\\n\"\r\n\t\t#define MENU_LINE10 \"Pause: P, End Game: X\\n\\n\"\r\n\t\t#define MENU_LINE11 \"Press Space or 0\\n\"\r\n\t\t#define MENU_LINE12 \"to start a round\\n\\n\"\r\n\t\t#define MENU_LINE13 \"One or two players?\\n\"\r\n\t\t#define MENU_LINE14 \"Press 1 or 2, or \\nD for demo mode...\"\r\n\t#endif \r\n\t\r\n\t#define END_FINALSCORE \"Final score\"\r\n\r\n\t#define END_COMP1_WINS \"Computer player one wins\\n\"\r\n\t#define END_P1_WINS \"Player one wins\\n\"\r\n\t#define END_COMP_WINS \"Computer wins\\n\"\r\n\t#define END_COMP2_WINS \"Computer player two wins\\n\"\r\n\t#define END_P2_WINS \"Player two wins\\n\"\r\n\t#define END_YOU_WIN \"You win\\n\"\r\n\t#define END_A_DRAW \"A draw\\n\"\r\n\t\r\n\t#if !defined(JOYSTICK_ONLY)\r\n\t\t#define END_PLAY_AGAIN \"\\nPlay again (y/n)?\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(press M to return \\nto the menu)\\n\"\r\n\t#else\r\n\t\t#define END_PLAY_AGAIN \"\\nPress fire to play again\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(move joystick up for menu)\\n\"\r\n\t#endif \r\n\t\r\n\t\r\n#elif defined(STANDARD_CHARACTERS_VERYNARROW_BUT_TALL_SCREEN)\r\n\t\r\n\t#if defined(__GAMEBOY__)\r\n\t\t#define SCORE_COMP1 \"Cmp 1: %d\"\r\n\t\t#define SCORE_COMP2 \"Cmp 2: %d\"\r\n\t#else\r\n\t\t#define SCORE_COMP1 \"Comp 1: %d\"\r\n\t\t#define SCORE_COMP2 \"Comp 2: %d\"\r\n\t#endif\r\n\t\r\n\t#define SCORE_COMP \"Comp: %d\"\r\n\t#define SCORE_HUMAN \"Human: %d\"\r\n\t#define SCORE_P1 \"Plr 1: %d\"\r\n\t#define SCORE_P2 \"Plr 2: %d\"\r\n\t\r\n\t#define MENU_LINE1 \"*** H-Tron ***\\n\"\r\n\t#define MENU_LINE2 \"RobertK (2016, 2018)\\n\"\r\n\t\r\n\t#if defined(JOYSTICK_ONLY)\r\n\t\t#define MENU_LINE3 \"\\nUse Joy left/right\\n\"\r\n\t\t#define MENU_LINE4 \"to select game type\\n\\n\"\r\n\t#else\r\n\t\t// these texts are untested\r\n\t\t#define MENU_LINE3 \"Controls:\\n\\n\"\r\n\t\t#define MENU_LINE4 \"Turn left/right:\\n\"\r\n\t\t#define MENU_LINE5 \" Left player: A/S\\n\"\r\n\t\t#define MENU_LINE6 \" Right plr: N/M or 5/8\\n\"\r\n\t\t#define MENU_LINE8 \" (in one-player mode,\\n\"\r\n\t\t#define MENU_LINE9 \"  human is right player)\\n\\n\"\r\n\t\t#define MENU_LINE10 \"Pause: P, End Game: X\\n\\n\"\r\n\t\t#define MENU_LINE11 \"Press Space or 0\\n\"\r\n\t\t#define MENU_LINE12 \"to start a round\\n\\n\"\r\n\t\t#define MENU_LINE13 \"One or two players?\\n\"\r\n\t\t#define MENU_LINE14 \"Press 1 or 2, or \\nD for demo mode...\"\r\n\t#endif \r\n\t\r\n\t#define END_FINALSCORE \"Final score\"\r\n\r\n\t#define END_COMP1_WINS \"Computer player one wins\\n\"\r\n\t#define END_P1_WINS \"Player one wins\\n\"\r\n\t#define END_COMP_WINS \"Computer wins\\n\"\r\n\t#define END_COMP2_WINS \"Computer player two wins\\n\"\r\n\t#define END_P2_WINS \"Player two wins\\n\"\r\n\t#define END_YOU_WIN \"You win\\n\"\r\n\t#define END_A_DRAW \"A draw\\n\"\r\n\t\r\n\t#if !defined(JOYSTICK_ONLY)\r\n\t\t#define END_PLAY_AGAIN \"\\nPlay again (y/n)?\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(press M to return \\nto the menu)\\n\"\r\n\t#else\r\n\t\t// these texts are untested\r\n\t\t#define END_PLAY_AGAIN \"\\nFire to play again\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"Joystick up for menu\\n\"\r\n\t#endif \r\n\r\n\t\r\n\t\r\n#else\r\n\t#define SCORE_COMP1 \"Computer 1: %d\"\r\n\t#define SCORE_COMP2 \"Computer 2: %d\"\r\n\t#define SCORE_COMP \"Computer: %d\"\r\n\t#define SCORE_HUMAN \"Human: %d\"\r\n\t#define SCORE_P1 \"Player 1: %d\"\r\n\t#define SCORE_P2 \"Player 2: %d\"\r\n\r\n\t#define MENU_LINE1 \"*** H-Tron ***\\n\"\r\n\t#define MENU_LINE2 \"by RobertK (2016, 2018)\\n\"\r\n\t\r\n\t#if defined(JOYSTICK_ONLY)\r\n\t\t#define MENU_LINE3 \"\\nUse Joystick left/right\\n\"\r\n\t\t#define MENU_LINE4 \"to select game type\\n\\n\"\r\n\t#else\r\n\t\t#define MENU_LINE3 \"Controls:\\n\\n\"\r\n\t\t#define MENU_LINE4 \"Turn left/right:\\n\"\r\n\t\t#define MENU_LINE5 \" Left player: A/S\\n\"\r\n\t\t#define MENU_LINE6 \" Right player: N/M or 5/8\\n\"\r\n\t\t#define MENU_LINE8 \" (in one-player mode,\\n\"\r\n\t\t#define MENU_LINE9 \"  human is right player)\\n\\n\"\r\n\t\t\r\n\t\t\r\n\t\t#if defined(__PC6001__)\t|| (defined(__VZ200__) && defined(VZ200_LGFX)) || (defined(__SUPER80__) && !defined(__SUPER80_VDUEM__))\r\n\t\t\t// NEC PC-6001, VZ200 lo-res, Super-80 e or m model\r\n\t\t\t// On these systems, we need to save one line to make everything fit on the screen \r\n\t\t\t#define MENU_LINE10 \"Pause game: P, End Game: X\\n\"\r\n\t\t#else\r\n\t\t\t#define MENU_LINE10 \"Pause game: P, End Game: X\\n\\n\"\r\n\t\t#endif\t\t\t\r\n\r\n\t\t#define MENU_LINE11 \"Press Space or 0\\n\"\r\n\t\t#define MENU_LINE12 \"to start a round\\n\\n\"\r\n\t\t#define MENU_LINE13 \"One or two players (1/2)?\\n\"\r\n\t\t#define MENU_LINE14 \"(or press D for demo mode)\"\r\n\t#endif \r\n\t\r\n\t#define END_FINALSCORE \"Final score\"\r\n\r\n\t#define END_COMP1_WINS \"Computer player one wins\\n\"\r\n\t#define END_P1_WINS \"Player one wins\\n\"\r\n\t#define END_COMP_WINS \"Computer wins\\n\"\r\n\t#define END_COMP2_WINS \"Computer player two wins\\n\"\r\n\t#define END_P2_WINS \"Player two wins\\n\"\r\n\t#define END_YOU_WIN \"You win\\n\"\r\n\t#define END_A_DRAW \"A draw\\n\"\r\n\t#if !defined(JOYSTICK_ONLY)\r\n\t\t#define END_PLAY_AGAIN \"\\nPlay again (y/n)?\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(press M to return to the menu)\\n\"\r\n\t#else\r\n\t\t#define END_PLAY_AGAIN \"\\nPress fire to play again\\n\\n\"\r\n\t\t#define END_M_FOR_MENU \"(move joystick up for menu)\\n\"\r\n\t#endif \t\r\n#endif \r\n\r\n#if (X_COLS>36) && defined(SMALL_LETTERS_ONLY)\r\n\t#define MENU_LINE11_12 \"press space or 0 to start a round\\n\\n\"\r\n#elif (X_COLS>36) && !defined(SMALL_LETTERS_ONLY) \r\n\t#define MENU_LINE11_12 \"Press Space or 0 to start a round\\n\\n\"\r\n#endif \r\n\r\n/* indicates whether the player has hit an obstacle */\r\nint p1Crashed;\r\nint p2Crashed;\r\n\r\n/* player coordinate variables */\r\nint p1x,p1y,p2x,p2y;\r\n\r\n/* player direction variables in radian degrees */\r\n/* 0 (or 360) = right, 90 = up, 180 = left, 270 = down */\r\nint p1dir,p2dir;\r\n\r\n/* player score variables */\r\nint p1Score,p2Score;\r\n\r\n/* One or two players */\r\nint numberOfPlayers;\r\n\r\n\r\nvoid myTextOut(int x, int y, const char* text)\r\n{\r\n\t// writes a text to the specified x,y (column and row) screen position\r\n\t// this is the place for the platform-dependent \r\n\t// implementation of this function\r\n    #if defined(__ZX81__) || defined(__ZX80__) // || defined(__SPECTRUM__)\r\n\t\tzx_setcursorpos(y,x);\r\n\t\tprintf(text);\r\n\t#elif defined(__LYNXSTANDARDCONSOLE__)\t// for the Camputers Lynx \"ROM printer\" (when compiling without the generic console parameter)\r\n\t\t// See page 62 of thy Lynx user manual\r\n\t\t// TODO\r\n\t\t/*\r\n\t\tprintf(\"%c\",23); // homes cursor\r\n\t\tfor (int i = 1; i <= y; i++)\r\n\t\t\tprintf(\"%c\",10); // line feed\r\n\t\tfor (int i = 1; i <= x; i++)\r\n\t\t\tprintf(\"%c\",12); // moves cursor one character block to the right\r\n\t\t*/\r\n\t\tprintf(text);\r\n\t#elif defined(__PACMAN__) // PacMan-Hardware\r\n\t\t// TODO: Screen positioning on PacMan-HW?\r\n\t\tprintf(text);\r\n\t#elif defined(FOUR_BY_SIX_CHARACTERS)\r\n\t\tx_4x6 = x*4;\r\n\t\ty_4x6 = y*6;\r\n\t\tprintf(text);\r\n\t#elif defined(USE_NATIVE_CONSOLE)\r\n\t\tprintf(\"\\033=%c%c\",y+32,x+32);\r\n\t\tprintf(text);\r\n\t#elif defined(USE_ANSI) || defined(USE_GENERIC_CONSOLE)\r\n\t\t// ANSI VT100 (conio.h) or native console (including conio.h not required, e.g. TRS-80)\r\n\t\tgotoxy(x,y);\r\n\t\tcprintf(text);\t\r\n    #endif\r\n}\r\n\r\n\r\nvoid myTextOutXY(int x, int y, const char* text)\r\n{\r\n\t// writes a text to the specified x,y (graphics coordinate) screen position\r\n\t// only for targets that support this (currently those with 4x6 character mode)\r\n\t#if defined(FOUR_BY_SIX_CHARACTERS)\r\n\t\tx_4x6 = x;\r\n\t\ty_4x6 = y;\r\n\t\tprintf(text);\r\n    #endif\r\n}\r\n\r\n\r\nvoid myPlot(short x, short y, short pmode)\r\n{\r\n\t// sets or clears a pixel\r\n\t// pmode 1 plots, pmode 0 unplots\r\n\t// this is the place for the platform-dependent \r\n\t// implementation of this function\r\n\t\r\n\t#if defined(__EINSTEIN80COLUMNS__)  // Tatung Einstein 80 column mode\r\n\t\tgotoxy(x*2,y);\r\n\t\tif (pmode==1)\r\n\t\t{\r\n\t\t\tprintf(\"%c\",160);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tcprintf(\" \");\t\t\r\n\t\t}\r\n\t\tgotoxy(x*2+1,y);\r\n\t\tif (pmode==1)\r\n\t\t{\r\n\t\t\tprintf(\"%c\",160);\t\t\t\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tcprintf(\" \");\t\t\r\n\t\t}\r\n\t#elif defined(DOUBLE_PIXELS_HORIZONTALLY)\r\n\t\t// graphics.h\r\n\t\tif (pmode==1)\r\n\t\t{\r\n\t\t\t#if defined(USE_C_PLOT)\r\n\t\t\t\tc_plot(x*2,y);\r\n\t\t\t\tc_plot(x*2 + 1,y);\t\t\t\r\n\t\t\t#else\r\n\t\t\t\tplot(x*2,y);\r\n\t\t\t\tplot(x*2 + 1,y);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\telse\r\n\t\t{ \r\n\t\t\t#if defined(USE_C_PLOT)\r\n\t\t\t\tc_unplot(x*2,y);\r\n\t\t\t\tc_unplot(x*2 + 1,y);\r\n\t\t\t#else\r\n\t\t\t\tunplot(x*2,y);\r\n\t\t\t\tunplot(x*2 + 1,y);\r\n\t\t\t#endif\r\n\t\t}\r\n\t\t// zx81plot.h\r\n\t\t// zx_plot(x*2,y,pmode);\t\r\n\t\t// zx_plot(x*2 + 1,y,pmode);\t\t\t\r\n\t#else\t\r\n\t\t#if defined(USE_C_PLOT)\r\n\t\t\tif (pmode==1) c_plot(x,y); else c_unplot(x,y);\t// graphics.h\r\n\t\t#else\r\n\t\t\tif (pmode==1) plot(x,y); else unplot(x,y);\t// graphics.h\r\n\t\t#endif\r\n\t\t// zx_plot(x,y,pmode);\t\t\t\t// zx81plot.h\t\r\n    #endif\r\n}\r\n\r\n\r\nvoid myCls()\t// clear the screen \r\n{\r\n#if defined(__PACMAN__)\r\n\tprintf(\"%c\",12);\r\n\tprintf(\"\\x0c\");  // the \"\\x0c\" (0x0c character) resets the cursor position to the top left corner\r\n#elif defined(USE_NATIVE_CONSOLE)\r\n\tprintf(\"\\032\");\r\n#elif defined(__LYNXSTANDARDCONSOLE__)\t// for the Camputers Lynx \"rom printer\" (when compiling without the generic console parameter)\r\n\tprintf(\"%c\",4);\t\t// See page 62 of thy Lynx user manual\r\n\tclg();\r\n#else\r\n\tprintf(\"%c\",12);\r\n\tprintf(\"\\x0c\");  // the \"\\x0c\" (0x0c character) resets the cursor position to the top left corner\r\n#endif\r\n}\r\n\r\nint myPoint(short x, short y)\r\n{\r\n\t// checks the status of a pixel - returns 0 if unset or 1 if set\r\n\t// this is the place for the platform-dependent \r\n\t// implementation of this function\r\n\r\n\t#if defined(__EINSTEIN80COLUMNS__)  // Tatung Einstein 80 column mode\r\n\t\tif (cvpeekr(x*2,y)==160) return 1; else return 0;\r\n\t#elif defined(DOUBLE_PIXELS_HORIZONTALLY)\r\n\t\t#if defined(USE_C_PLOT)\r\n\t\t\treturn c_point(x*2,y);\t\t\t\t\t\t// graphics.h\r\n\t\t#else\r\n\t\t\treturn point(x*2,y);\t\t\t\t\t\t// graphics.h\r\n\t\t#endif\r\n\t\t// return zx_point(x*2,y);\t\t\t\t\t// zx81plot.h\r\n\t#else\r\n\t\t#if defined(USE_C_PLOT)\r\n\t\t\treturn c_point(x,y);\t\t\t\t\t\t// graphics.h\r\n\t\t#else\r\n\t\t\treturn point(x,y);\t\t\t\t\t\t// graphics.h\r\n\t\t#endif\r\n\t\t// return zx_point(x,y);\t\t\t\t\t// zx81plot.h\r\n    #endif\r\n\t\r\n}\r\n\r\n\r\nvoid myWait(uint msec)\r\n{\r\n\t// waits a specified number of milliseconds\r\n\t// this is the place for the platform-dependent \r\n\t// implementation of this function\r\n\tif (msec==0) return;\r\n\tmsleep(msec);\r\n\t\r\n\t// The msleep() function should now be available on all platforms\r\n\t// (it runs the same code as the previously Sinclair-only in_Wait() function)\r\n\r\n\t// If there should be a future platform that does not support msleep(), \r\n\t// we can wait by doing a busy loop:\r\n\t/*\r\n    #if defined(__....__)\r\n\t\t// Taken from CROSS CHASE by Fabrizio Caruso (sleep_macros.c)\r\n\t\t// value is not in milliseconds, has to be adjusted for each platform\t\t\r\n\t\tunsigned int ii; \r\n\t\tfor(ii=0;ii<msec;++ii){}; \r\n\t#else\r\n\t\tmsleep(msec);\r\n\t#endif\r\n\t*/\t\r\n}\r\n\r\nuint myKeyPressed(uint scancode)\r\n{\r\n\t#if defined(USE_INKEYPRESSED)\r\n\t\treturn in_KeyPressed(scancode);\r\n\t#else\r\n\t\t// Currently such a key status function is implemented in z88dk \r\n\t\t// only for a few computers. Provisionally we use ANSI key input \r\n\t\t// for all other systems, although this is problematic in two-player \r\n\t\t// mode as it does not allow two keys to be pressed simultaneously.\r\n\t\treturn 0;\r\n\t#endif\r\n}\r\n\r\nvoid InitPlayfield()\r\n{\r\n  // sets up the initial playfield before a round starts\r\n  int x,y;\r\n  char textP1[25];\r\n  char textP2[25];\r\n\t\t\r\n  myCls();\r\n\r\n  // Workaround for systems with a background colour problem: on these \r\n  // we simply fill the screen with black pixels to get a black background\r\n  #if defined(__SPC1000__) || (defined(__VZ200__) && defined(VZ200_LGFX)) // || defined(__PC6001__)\r\n\tfor (x = 0; x <= X_RES-1; ++x)\r\n\t\tfor (y = 0; y <= Y_RES-1; ++y)\r\n\t\t\tmyPlot(x,y,0);\r\n  #endif\r\n\t\r\n  /* Draw border */\r\n  for (x = 0; x <= X_RES-1; ++x)\r\n  {\r\n\tmyPlot(x,Y_RES-1,1);\r\n\tmyPlot(x,BORDER_TOP,1);\r\n  }\r\n  for (y = BORDER_TOP+1; y <= Y_RES-1; ++y)\r\n  {\r\n\tmyPlot(0,y,1);\r\n\tmyPlot(X_RES-1,y,1);\r\n  }\r\n  // score area separator\r\n  // we draw this only if the border was drawn from the top of the screen\r\n  if (BORDER_TOP==0)\r\n  {\r\n\t  for (x = 0; x <= X_RES-1; ++x)\r\n\t\tmyPlot(x,SEPARATOR_LINE,1);\r\n  }\r\n  /* display P1 and P2 score */\r\n  // we first use sprintf() for string formatting,\r\n  // and then we put the formatted string on the \r\n  // screen using myTextOut()\r\n \r\n  if (numberOfPlayers==0)\r\n  {\r\n   sprintf(textP1,SCORE_COMP1,p1Score);\r\n   sprintf(textP2,SCORE_COMP2,p2Score);   \r\n  }\r\n  else if (numberOfPlayers==1)\r\n  {\r\n   sprintf(textP1,SCORE_COMP,p1Score);\r\n   sprintf(textP2,SCORE_HUMAN,p2Score);\r\n  }\r\n  else\r\n  {\r\n   sprintf(textP1,SCORE_P1,p1Score);\r\n   sprintf(textP2,SCORE_P2,p2Score);\r\n  }\r\n\r\n  myTextOut(SCORE_COL, SCORE_LINE, textP1);\r\n  // Workaround for the Camputers Lynx standard console until screen positioning works\r\n  #if defined(__LYNXSTANDARDCONSOLE__)\r\n\t  if (numberOfPlayers==0)      printf(\"              \");\r\n\t  else if (numberOfPlayers==1) printf(\"                     \");\r\n\t  else                         printf(\"                  \");\r\n  #endif\r\n  \r\n  myTextOut(X_COLS-strlen(textP2)-SCORE_COL, SCORE_LINE, textP2);\r\n  \r\n  #if defined(__OSBORNE1__)\t// Osborne 1\r\n\t// Workaround to hide the \"_\" cursor\r\n\t// We position it where there is already a plotted block\r\n\t// As the cursor is not XORed, it becomes invisible\r\n\tmyTextOut(1, 2, \"\");\r\n  #endif\r\n  \r\n  /* Initiate player positions, directions and crash indicators */\r\n  p1x=STARTUP_P1_X; // ZX81: 10;\t// DOS version: 15\r\n  p1y=STARTUP_Y; \t// ZX81: 26;\t// DOS version: 29\r\n  p2x=STARTUP_P2_X; // ZX81: 53;\t// DOS version: 74\r\n  p2y=STARTUP_Y; \t// ZX81: 26;\t// DOS version: 29\r\n  p1dir=0;\r\n  p2dir=180;\r\n  p1Crashed=0;\r\n  p2Crashed=0;\r\n\r\n  /* Draw players at their start positions */\r\n  myPlot(p1x,p1y,1);\r\n  myPlot(p2x,p2y,1);\r\n}\r\n\r\n\r\nvoid MovePlayers()\r\n{\r\n  // Moves both players one step forward\r\n  switch(p1dir)\r\n  {\r\n    case 0:   p1x=p1x+1; break;\r\n    case 90:  p1y=p1y-1; break;\r\n    case 180: p1x=p1x-1; break;\r\n    case 270: p1y=p1y+1; break;\r\n  }\r\n  switch(p2dir)\r\n  {\r\n    case 0:   p2x=p2x+1; break;\r\n    case 90:  p2y=p2y-1; break;\r\n    case 180: p2x=p2x-1; break;\r\n    case 270: p2y=p2y+1; break;\r\n  }\r\n\r\n  /* Collision detection */\r\n  if (myPoint(p1x,p1y)==1)\r\n  { \r\n    p1Crashed=1;\r\n    p2Score++;\r\n  }\r\n  if (myPoint(p2x,p2y)==1)\r\n  {\r\n    p2Crashed=1;\r\n    p1Score++;\r\n  }\r\n  /* no points when both players crashed */\r\n  if (p1Crashed==1 && p2Crashed==1)\r\n  {\r\n   p1Score--;\r\n   p2Score--;\r\n  }\r\n  \r\n  /* Draw players at their new positions */\r\n  /* (unless a collision has been detected) */\r\n  if (p1Crashed==0) myPlot(p1x,p1y,1); \r\n\r\n  // ZX80: make the screen visible (as the ZX80 only runs in FAST mode, \r\n  // the screen is normally only visible during fgetc_cons() calls)\r\n  #if defined(__ZX80__)\r\n\tgen_tv_field();\r\n  #endif\r\n\r\n  if (p2Crashed==0) myPlot(p2x,p2y,1);\r\n\r\n  // ZX80: make the screen visible (as the ZX80 only runs in FAST mode, \r\n  // the screen is normally only visible during fgetc_cons() calls)\r\n  #if defined(__ZX80__)\r\n\tgen_tv_field();\r\n  #endif\r\n\r\n}\r\n\r\n\r\nvoid AIComputerPlayer(int *x, int *y, int *dir)\r\n{\r\n  /* Let the computer player decide whether to turn left or right,\r\n     or continue straight on.\r\n     The coordinate and direction variables are passed by reference,\r\n     so we can use this function for either computer player one or two */\r\n\r\n  /* number of empty grid blocks before an obstacle\r\n     from the AI player's point of view */\r\n  int distanceFront,distanceLeft,distanceRight;\r\n\r\n// kkkk\r\n// int debugOutputCounter = 0;\r\n  \r\n  int maxDistanceToChk;\r\n  maxDistanceToChk=AI_MAX_DISTANCE_TO_CHECK;\r\n  \r\n  /* To make the AI player's movements less predictable,\r\n  we occasionally make him a little short-sighted */\r\n  maxDistanceToChk=maxDistanceToChk-(rand() % AI_SHORTSIGHTED_FACTOR);\r\n\r\n// kkkk\r\n// debugOutputCounter++;\r\n// myPlot(2 + debugOutputCounter*2,1,1);\t\t\t\t\r\n\r\n  /* Check the distance from the AI player's position\r\n     to the next obstacle in the front, left and right\r\n     direction from the AI player's point of view. According\r\n     to the players direction, we have to use the respective\r\n     grid direction */\r\n  switch(*dir)\r\n  {\r\n    case 0: /* right */\r\n// myPlot(2 + debugOutputCounter*2,2,1);\t\t\t\t\r\n       distanceFront=AICheckDistanceEast(*x,*y,maxDistanceToChk);\r\n       distanceLeft=AICheckDistanceNorth(*x,*y,maxDistanceToChk);\r\n       distanceRight=AICheckDistanceSouth(*x,*y,maxDistanceToChk);\r\n       break;\r\n    case 90: /* up */\r\n// myPlot(2 + debugOutputCounter*2,3,1);\t\t\t\t\r\n       distanceFront=AICheckDistanceNorth(*x,*y,maxDistanceToChk);\r\n       distanceLeft=AICheckDistanceWest(*x,*y,maxDistanceToChk);\r\n       distanceRight=AICheckDistanceEast(*x,*y,maxDistanceToChk);\r\n       break;\r\n    case 180: /* left */\r\n// myPlot(2 + debugOutputCounter*2,4,1);\t\t\t\t\r\n       distanceFront=AICheckDistanceWest(*x,*y,maxDistanceToChk);\r\n       distanceLeft=AICheckDistanceSouth(*x,*y,maxDistanceToChk);\r\n       distanceRight=AICheckDistanceNorth(*x,*y,maxDistanceToChk);\r\n       break;\r\n    case 270: /* down */\r\n// myPlot(2 + debugOutputCounter*2,5,1);\t\t\t\t\r\n       distanceFront=AICheckDistanceSouth(*x,*y,maxDistanceToChk);\r\n       distanceLeft=AICheckDistanceEast(*x,*y,maxDistanceToChk);\r\n       distanceRight=AICheckDistanceWest(*x,*y,maxDistanceToChk);\r\n       break;\r\n  }\r\n\r\n// kkkk\r\n// debugOutputCounter++;\r\n// myPlot(2 + debugOutputCounter*2,1,1);\t\t\t\t\r\n\r\n  /* Now we decide what the AI player shall do */\r\n  if ((distanceFront>=distanceLeft) && (distanceFront>=distanceRight))\r\n  {\r\n    /* clear sailing ahead, nothing to do */\r\n  }\r\n  else if ((distanceFront<distanceLeft) || (distanceFront<distanceRight))\r\n  {\r\n    /* now we know that it would be safer to turn either left or right */\r\n    /* let us check which direction would be better */\r\n    if (distanceLeft>distanceRight)\r\n    {\r\n    \t/* turn left */\r\n    \t*dir = *dir+90;\r\n    \tif (*dir>=360) *dir=0;\r\n    }\r\n    else if (distanceLeft<distanceRight)\r\n    {\r\n        /* turn right */\r\n\t\t*dir = *dir-90;\r\n\t\tif (*dir<0) *dir=270;\r\n    }\r\n    else /* distanceLeft == distanceRight */\r\n    {\r\n\t\t/* randomly turn either left or right */\r\n\t\tif ((rand() % 2)==0)\r\n\t\t{\r\n\t\t  /* turn left */\r\n\t\t  *dir = *dir+90;\r\n\t\t  if (*dir>=360) *dir=0;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t  /* turn right */\r\n\t\t  *dir = *dir-90;\r\n\t\t  if (*dir<0) *dir=270;\r\n\t\t}\r\n    }\r\n  }\r\n}\r\n\r\n\r\n/* The following four functions calculate the distance from the\r\n   given position to the next obstacle in grid map direction */\r\nint AICheckDistanceEast(int x,int y,int maxDistanceToCheck)\r\n{\r\n  int distance;\r\n  distance=1;\r\n  while(myPoint(x+distance,y)==0 && distance<=maxDistanceToCheck)\r\n  {\r\n    distance++;\r\n  }\r\n  return distance;\r\n}\r\n\r\nint AICheckDistanceWest(int x,int y,int maxDistanceToCheck)\r\n{\r\n  int distance;\r\n  distance=1;\r\n  while(myPoint(x-distance,y)==0 && distance<=maxDistanceToCheck)\r\n  {\r\n    distance++;\r\n  }\r\n  return distance;\r\n}\r\n\r\nint AICheckDistanceNorth(int x,int y,int maxDistanceToCheck)\r\n{\r\n  int distance;\r\n  distance=1;\r\n  while(myPoint(x,y-distance)==0 && distance<=maxDistanceToCheck)\r\n  {\r\n    distance++;\r\n  }\r\n  return distance;\r\n}\r\n\r\nint AICheckDistanceSouth(int x,int y,int maxDistanceToCheck)\r\n{\r\n  int distance;\r\n  distance=1;\r\n  while(myPoint(x,y+distance)==0 && distance<=maxDistanceToCheck)\r\n  {\r\n    distance++;\r\n  }\r\n  return distance;\r\n}\r\n\r\n#if defined(JOYSTICK_ONLY)\r\nvoid DisplayGameType(int gameType)\r\n{\r\n\t#if defined(STANDARD_CHARACTERS_VERYNARROW_BUT_TALL_SCREEN)\r\n\t\tswitch(gameType)\r\n\t\t{\r\n\t\t\tcase 1: printf(\"1-Plr\"); break;\r\n\t\t\tcase 2: printf(\"2-Plr\"); break;\r\n\t\t\tcase 3: printf(\"Demo\"); break;\r\n\t\t}\r\n\t\tprintf(\" Mode selected\\n\");\r\n\t\tprintf(\"Fire to continue\");\r\n\t#else\r\n\t\tswitch(gameType)\r\n\t\t{\r\n\t\t\tcase 1: printf(\"One-Player\"); break;\r\n\t\t\tcase 2: printf(\"Two-Player\"); break;\r\n\t\t\tcase 3: printf(\"Demo\"); break;\r\n\t\t}\r\n\t\tprintf(\" Mode selected\\n\");\r\n\t\tprintf(\"Press Fire to continue\");\r\n\t#endif\r\n}\r\n#endif\r\n\r\nvoid DoWhenProgramTerminates()\r\n{\r\n  #if defined(__MC1000__) || defined(__GALPLUSHIRES__) || defined(__SMC777__) || defined(__EXCALIBUR64__) || defined(__FP1100__)\t// CCE MC-1000, Galaksija Plus Hi-Res, Sony SMC-777, Casio FP-1100\r\n\tint mode=0;\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\t// return to text mode (green/yellow):\r\n\tmyCls();\r\n  #elif defined(__TIKI100__)  // Tiki-100 (also known as \"Kontiki-100\")\r\n\tint mode=3; // set to standard display mode 256x256\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\r\n  #endif\r\n}\r\n\r\nvoid main()\r\n{\r\n  int exitgame;\r\n  int key;\r\n  #if defined(JOYSTICK_ONLY)\r\n\tint gameType=1;\t// for Joystick menu selection; 1 = 1 player, 2 players, 3 = demo\r\n\tint joystickNumber1 = JOYSTICK_1;\r\n\tint joystickNumber2 = JOYSTICK_2;\r\n\tint joyButtonMenu=JOYSTICK_BUTTON_MENU;\r\n\tint joyButtonPause=JOYSTICK_BUTTON_PAUSE;\r\n  #endif\r\n  int notPlayAgain, restartAgain;\r\n  int randomSeed=0;\r\n  char c; // for ANSI keyboard input\r\n  \r\n  // Key press indicators\r\n  // Note: internally P1 is always the \"right\" player, i.e. human in \r\n  // 1-player-mode and player 2 in two player mode. \r\n  int p1PressedLeft;\r\n  int p1PressedRight;\r\n  int p2PressedLeft;\r\n  int p2PressedRight;\r\n  int lastState_p1PressedLeft;\r\n  int lastState_p1PressedRight;\r\n  int lastState_p2PressedLeft;\r\n  int lastState_p2PressedRight;\r\n\r\n  int mode; // for IOCTL_GENCON_SET_MODE. Note that this requires a pointer parameter, so you cannot pass the value directly\r\n\t\r\n  // Workaround for solving the \"Visible Cursor Problem\" occasionally occurring on the VZ \r\n  #if defined(__VZ200__)\r\n  #asm\r\n  di\r\n  #endasm\r\n  #endif\r\n   \r\n  restartAgain=0;\r\n  // randomize();\t\t// no longer available in nightly builds, we have to use srand(value) instead\r\n\r\n  // Set the background and foreground colour of the block-graphics characters where necessary\r\n  #if defined(__PC6001__) // NEC PC-6001\r\n\tmode=1\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\r\n\ttextcolor(WHITE);\r\n\ttextbackground(BLACK);\r\n  #elif (defined(__VZ200__) && defined(VZ200_LGFX)) // VZ200 / Laser 310/210/110\r\n\t// Note: in MAME, the block-graphics characters have a black background colour (it should be dark green)\r\n\t// Strangely, in VZEM the background colour is dark green as it should be.\r\n\t// This seems to have no effect:\r\n\t// textcolor(LIGHTGREEN);\r\n\t// textbackground(GREEN);\r\n  #elif defined(__CPC__)\r\n\ttextcolor(YELLOW);  // this gives only the text output a yellow colour, the plotted points are still red\r\n  #endif\r\n\r\n  // On some systems we first need to activate the graphics mode\r\n  #if (defined(__VZ200__) && !defined(VZ200_LGFX)) || defined(__ABC80__) || defined(__P2000__) || defined(__Z9001__) || defined(__MULTI8__) || defined(__MSX__) || defined(__SVI__) || defined(__PACMAN__) || defined(__ATTACHE__)\r\n\tclg();  // activate graphics mode\r\n  #elif defined(__MC1000__) // CCE MC-1000\r\n\tmode=1;\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\t// switch to hires mode\r\n\tclg();\r\n  #elif defined(__GALPLUSHIRES__) || defined(__SMC777__) || defined(__EXCALIBUR64__) // Galaksija Plus Hi-Res, Sony SMC-777 or Excalibur 64\r\n\tmode=1;\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\t// switch to hires mode\r\n  #elif defined(__FP1100__)\t// Casio FP-1100\r\n\tmode=2;\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\t// switch to 80x48 lores mode\t\r\n  #elif defined(__EINSTEIN80COLUMNS__)  // Tatung Einstein 80 column mode\r\n\tmode=10;\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\t// switch the generic console to the 80 columns screen\r\n  #elif defined(__TIKI100__)  // Tiki-100 (also known as \"Kontiki-100\")\r\n\tclg();\t\t  // initiate graphicsets\r\n\tmode=2; // set to 512x256\r\n\tconsole_ioctl(IOCTL_GENCON_SET_MODE, &mode);\r\n\t// set palette to avoid the rather dark default cyan colour\r\n\t// the first value is the background colour\r\n\t// the last is used as the default foreground colour\r\n\tchar palette[]={0,0xD2,0x7F,0xFF};\r\n\tgr_setpalette(4,palette);\r\n\t// textcolor(1);\r\n  #endif\r\n  \r\n  do\r\n  {\r\n  \r\n\t  notPlayAgain=0;\r\n\t  myCls();\r\n\t  printf(MENU_LINE1);\r\n\t  printf(MENU_LINE2);\r\n\t  printf(MENU_LINE3);\r\n\t  printf(MENU_LINE4);\t  \r\n\t  #if !defined(JOYSTICK_ONLY)\r\n\t\t  printf(MENU_LINE5);\r\n\t\t  printf(MENU_LINE6);\r\n\r\n\t\t  // when using the 4x6 character set, we show the rest on the second \r\n\t\t  // screen, because of the very tall characters \r\n\t\t  // in the graphics mode of these systems\r\n\t\t  #if defined(FOUR_BY_SIX_CHARACTERS) && !defined(FOUR_BY_SIX_CHARACTERS_TALL_SCREEN)\r\n\t\t\tgetch();\r\n\t\t\tmyCls();\r\n\t\t  #endif\t  \r\n\t\t  printf(MENU_LINE8);\r\n\t\t  printf(MENU_LINE9);\r\n\t\t  printf(MENU_LINE10);\r\n\t\t  \r\n\t\t  #if defined(__SPC1000__)\r\n\t\t\tgetch();\r\n\t\t\tmyCls();\r\n\t\t  #endif\r\n\t\t  \r\n\t\t #if defined(MENU_LINE11_12) // on some systems, we show the text from lines 11 and 12 in only one line\r\n\t\t\tprintf(MENU_LINE11_12);\r\n\t\t #else\r\n\t\t\tprintf(MENU_LINE11);\r\n\t\t\tprintf(MENU_LINE12);\r\n\t\t #endif\t\t \r\n\r\n\t\t  printf(MENU_LINE13);\r\n\t\t  printf(MENU_LINE14);\r\n\t\t  // printf(\"\\nxcols=%d\\n\",X_COLS);\r\n\t #endif\t\t \r\n\t  \r\n\t  \r\n\t  #if defined(__ZX80__)\r\n\t\tgen_tv_field_init(0);\t// has to be called once for screen-refreshing on the ZX80\r\n\t  #endif\r\n\t  \r\n\t  /*\r\n\t  myCls();\r\n\t  printf(\"\\n\");\r\n\t  printf(\"in_lookupkey() for 5 is %d\\n\",in_LookupKey('5'));\t  \r\n\t  printf(\"in_lookupkey() for 8 is %d\\n\",in_LookupKey('8'));\t  \r\n\t  printf(\"in_lookupkey() for a is %d\\n\",in_LookupKey('a'));\t  \r\n\t  printf(\"in_lookupkey() for m is %d\\n\",in_LookupKey('m'));\t  \r\n\t  printf(\"in_lookupkey() for n is %d\\n\",in_LookupKey('n'));\r\n\t  printf(\"in_lookupkey() for p is %d\\n\",in_LookupKey('p'));\t  \r\n\t  printf(\"in_lookupkey() for s is %d\\n\",in_LookupKey('s'));\t  \r\n\t  printf(\"in_lookupkey() for x is %d\\n\",in_LookupKey('x'));\t  \r\n\t  */\r\n\t  \r\n\t  // VG5000\r\n\t  /*\r\n\t  myCls();\r\n\t  printf(\"in_lookupkey() for 5 is %d\\n\",in_LookupKey('5'));\t  \r\n\t  printf(\"in_lookupkey() for 8 is %d\\n\",in_LookupKey('8'));\t  \r\n\t  printf(\"in_lookupkey() for a is %d\\n\",in_LookupKey('q'));\t  // Q instead of A\r\n\t  printf(\"in_lookupkey() for m is %d\\n\",in_LookupKey(','));\t  // , instead of M\r\n      printf(\"in_lookupkey() for n is %d\\n\",in_LookupKey('n'));\r\n\t  printf(\"in_lookupkey() for p is %d\\n\",in_LookupKey('p'));\t  \r\n\t  printf(\"in_lookupkey() for s is %d\\n\",in_LookupKey('s'));\t  \r\n\t  printf(\"in_lookupkey() for x is %d\\n\",in_LookupKey('x'));\t\r\n\t  */\r\n\t  do\r\n\t  {\t\t\r\n\t\t// The ZX80 has FAST-mode only, therefore using in_Inkey() would leave the screen black (calling \r\n\t\t// gen_tv_field() within the loop would help a little but this would still make the screen flicker heavily)\r\n\t\t// So we use fgetc_cons() instead, which halts program execution and makes the ZX80 screen visible.\r\n\t\t// Unfortunately, with this we cannot provide a different random seed counter every time on the ZX80.\r\n\t\t#if defined(__ZX80__)\r\n\t\t\tkey=fgetc_cons();\r\n\t\t#elif defined(__ZX81__) || defined(__SPECTRUM__)\r\n\t\t\tkey=in_Inkey();\t// from input.h, available on the following platforms: zx spectrum, zx81, sam), returns the currently pressed key and program execution continues \r\n\t\t#elif defined(JOYSTICK_ONLY)\r\n\t\t\tDisplayGameType(gameType);\r\n\t\t\twhile (!(joystick(joystickNumber1) & MOVE_FIRE1) && !(joystick(joystickNumber2) & MOVE_FIRE1))\r\n\t\t\t{\r\n\t\t\t\tif (((joystick(joystickNumber1) & MOVE_RIGHT) || (joystick(joystickNumber2) & MOVE_RIGHT)) && gameType<3)\r\n\t\t\t\t{\r\n\t\t\t\t\tgameType++;\r\n\t\t\t\t\t#if defined(TWO_PLAYER_MODE_NOT_AVAILABLE)\r\n\t\t\t\t\t  if (gameType==2) gameType=3;\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\tmyCls(); // clear the screen\r\n\t\t\t\t\tDisplayGameType(gameType);\r\n\t\t\t\t\tmyWait(DELAY_BEFORE_NEWKEY);\r\n\t\t\t\t}\r\n\t\t\t\tif (((joystick(joystickNumber1) & MOVE_LEFT) || (joystick(joystickNumber2) & MOVE_LEFT)) && gameType>1)\r\n\t\t\t\t{\r\n\t\t\t\t\tgameType--;\r\n\t\t\t\t\t#if defined(TWO_PLAYER_MODE_NOT_AVAILABLE)\r\n\t\t\t\t\t  if (gameType==2) gameType=1;\r\n\t\t\t\t\t#endif\r\n\t\t\t\t\tmyCls(); // clear the screen\r\n\t\t\t\t\tDisplayGameType(gameType);\r\n\t\t\t\t\tmyWait(DELAY_BEFORE_NEWKEY);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tswitch(gameType)\r\n\t\t\t{\r\n\t\t\t\tcase 1: key=KEY_CODE_1; break;\r\n\t\t\t\tcase 2: key=KEY_CODE_2; break;\r\n\t\t\t\tcase 3: key=KEY_CODE_D; break;\r\n\t\t\t}\t\t\t\r\n\t\t#elif defined(USE_ANSI) || defined(USE_NATIVE_INPUT)\r\n\t\t\tif(kbhit())\r\n\t\t\t{\r\n\t\t\t\tc = getch();\r\n\t\t\t\tif (c=='d' || c=='D') key=KEY_CODE_D;\r\n\t\t\t\telse if (c=='1') key=KEY_CODE_1;\r\n\t\t\t\telse if (c=='2') key=KEY_CODE_2;\r\n\t\t\t\telse if (c=='x' || c=='X') key=KEY_CODE_X;\r\n\t\t\t\t}\r\n\t\t\telse key=0;\r\n\t\t#else\r\n\t\t\tkey=fgetc_cons();\t\r\n\t\t#endif\r\n\r\n\t\t// if (key>0) printf(\"\\nkeycode: %d\",key);\t\t\t\t\r\n\t\t// printf(\"key a (65) pressed: %d\\n\",myKeyPressed(in_LookupKey('A')));\r\n\t\t\r\n\t\tif (key==KEY_CODE_D) numberOfPlayers=0;\r\n\t\tif (key==KEY_CODE_1) numberOfPlayers=1;\r\n\t\tif (key==KEY_CODE_2) numberOfPlayers=2;\r\n\t\tif (key==KEY_CODE_X)\r\n\t\t{\r\n\t\t  myCls();\r\n\t\t  DoWhenProgramTerminates();\r\n\t\t  return;\r\n\t\t}\r\n\t\t// we use this counter to every time get a different random seed value,\r\n\t\t// depending on how long it took until the user pressed a button\r\n\t\trandomSeed++;\r\n\t\tif (randomSeed>32766) randomSeed=0;\t// reset counter to avoid overflow\r\n\t  }\r\n\t  while(key!=KEY_CODE_D && key!=KEY_CODE_1 && key!=KEY_CODE_2);\r\n\r\n\t  srand(randomSeed);\r\n\t  /*\r\n\t  myCls();\r\n\t  printf(\"\\n\\nrandom seed is %d\\n\",randomSeed);\r\n\t  printf(\"first rand value is %d\\n\",rand());\r\n\t  printf(\"press space to continue\\n\",rand());\r\n\t  do\r\n\t  {\t  \r\n\t\t  #if defined(USE_ANSI) || defined(USE_NATIVE_INPUT)\r\n\t\t\t  if(kbhit())\r\n\t\t\t  {\r\n\t\t\t\tc = getch();\r\n\t\t\t\tif (c==' ') key=KEY_CODE_SPACE; else key=0;\r\n\t\t\t  }\r\n\t\t\t  else key=0;\r\n\t\t  #else\r\n\t\t\t  key=fgetc_cons();\t\r\n\t\t  #endif\r\n\t  }\r\n\t  while(key!=KEY_CODE_SPACE);\r\n\t  */\r\n\t  \r\n\t  /* game restart loop */\r\n\t  while(notPlayAgain<1)\r\n\t  {\r\n\t\tp1Score=0;\r\n\t\tp2Score=0;\r\n\t\texitgame=0;\r\n\t\t\r\n\t\t/* round restart loop */\r\n\t\twhile(p1Score<POINTS_TO_WIN && p2Score<POINTS_TO_WIN && exitgame<1)\r\n\t\t{\r\n\t\t\tInitPlayfield();\r\n\t\t\tkey=0;\r\n\t\r\n\t\t\tif (numberOfPlayers>0)\r\n\t\t\t{\r\n\t\t\t  do\r\n\t\t\t  {\r\n\t\t\t\t#if defined(JOYSTICK_ONLY)\r\n\t\t\t\t\t// Fire\r\n\t\t\t\t\tif ((joystick(joystickNumber1) & MOVE_FIRE1) || (numberOfPlayers>1 && (joystick(joystickNumber2) & MOVE_FIRE1))) key=KEY_CODE_SPACE;\r\n\t\t\t\t\t// Return to Menu\r\n\t\t\t\t\tif (joyButtonMenu>0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif ((joystick(joystickNumber1) & joyButtonMenu) || (joystick(joystickNumber2) & joyButtonMenu)) key=KEY_CODE_X;\r\n\t\t\t\t\t}\r\n\t\t\t\t#elif defined(USE_ANSI) || defined(USE_NATIVE_INPUT)\r\n\t\t\t\t\tif(kbhit())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tc = getch();\r\n\t\t\t\t\t\tif (c==' ') key=KEY_CODE_SPACE;\r\n\t\t\t\t\t\telse if (c=='0') key=KEY_CODE_0;\r\n\t\t\t\t\t\telse if (c=='x' || c=='X') key=KEY_CODE_X;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse key=0;\r\n\t\t\t\t#elif defined(__ZX81__) || defined(__SPECTRUM__)\r\n\t\t\t\t\tkey=in_Inkey();\t// from input.h, available on the following platforms: zx spectrum, zx81, sam), returns the currently pressed key and program execution continues \r\n\t\t\t\t#else\r\n\t\t\t\t\tkey=fgetc_cons();  // for ZX80 to keep the screen visible\r\n\t\t\t\t#endif\r\n\t\t\t\tif (key==KEY_CODE_X) exitgame=1;\r\n\t\t\t  } while (key!=KEY_CODE_SPACE && key!= KEY_CODE_0 && key!=KEY_CODE_X);\r\n\t\t\t}\r\n\t\t\telse myWait(DELAY_DEMO_BEFOREROUNDSTART); /* in demo mode, the round starts automatically */\r\n\r\n\t\t\tlastState_p1PressedLeft=0;\r\n\t\t\tlastState_p1PressedRight=0;\r\n\t\t\tlastState_p2PressedLeft=0;\r\n\t\t\tlastState_p2PressedRight=0;\r\n\t\t\t\r\n\t\t\t/* main game loop */\r\n\t\t\twhile(exitgame<1 && p1Crashed<1 && p2Crashed<1)\r\n\t\t\t{\t\t\r\n\t\t\t\t// Check keyboard state for player's control\r\n\t\t\t\t\r\n\t\t\t\t// ZX81 note: here we could use in_Inkey() and then switch-case to set the \r\n\t\t\t\t// actions for the possible key combinations. But this would not allow \r\n\t\t\t\t// both players to simultaneously press their control key - one would lock \r\n\t\t\t\t// the other one's steering.\r\n\t\t\t\t// So we have to use in_KeyPressed() which requires more code lines and \r\n\t\t\t\t// is probably a little less efficient, but it does the job that we need.\t\t\t\t\r\n\t\t\t\t// The lookup keys can be determined using the in_LookupKey() function.\r\n\r\n\t\t\t\tp1PressedLeft=0;\r\n\t\t\t\tp1PressedRight=0;\r\n\t\t\t\tp2PressedLeft=0;\r\n\t\t\t\tp2PressedRight=0;\r\n\t\t\t\t\r\n\t\t\t\t#if defined(USE_INKEYPRESSED)\r\n\t\t\t\t\tif (myKeyPressed(KEYPRESS_CODE_5)>0 || myKeyPressed(KEYPRESS_CODE_N)>0) p1PressedLeft=1;\r\n\t\t\t\t\tif (myKeyPressed(KEYPRESS_CODE_8)>0 || myKeyPressed(KEYPRESS_CODE_M)>0) p1PressedRight=1;\r\n\t\t\t\t\tif (myKeyPressed(KEYPRESS_CODE_A)>0) p2PressedLeft=1;\r\n\t\t\t\t\tif (myKeyPressed(KEYPRESS_CODE_S)>0) p2PressedRight=1;\r\n\t\t\t\t#elif defined(JOYSTICK_ONLY)\r\n\t\t\t\t\tif (joystick(joystickNumber1) & MOVE_LEFT) p1PressedLeft=1;\r\n\t\t\t\t\tif (joystick(joystickNumber1) & MOVE_RIGHT) p1PressedRight=1;\r\n\t\t\t\t\tif (joystick(joystickNumber2) & MOVE_LEFT) p2PressedLeft=1;\r\n\t\t\t\t\tif (joystick(joystickNumber2) & MOVE_RIGHT) p2PressedRight=1;\r\n\t\t\t\t#else\r\n\t\t\t\t// #if defined(USE_ANSI) || defined(USE_NATIVE_INPUT)\r\n\t\t\t\t\t// myPlot(p1x+5,p1y+5,1);\t// FOR TESTING PURPOSES\r\n\r\n\t\t\t\t\tif(kbhit())\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tc = getch();\r\n\t\t\t\t\t\tif (c=='5' || c=='n' || c=='N') p1PressedLeft=1;\r\n\t\t\t\t\t#if defined(__VG5000__) // this machine from France has an AZERTY keyboard\r\n\t\t\t\t\t\telse if (c=='8' || c==',') p1PressedRight=1;\t\r\n\t\t\t\t\t\telse if (c=='q' || c=='Q') p2PressedLeft=1;\r\n\t\t\t\t\t#else\r\n\t\t\t\t\t\telse if (c=='8' || c=='m' || c=='M') p1PressedRight=1;\t\r\n\t\t\t\t\t\telse if (c=='a' || c=='A') p2PressedLeft=1;\r\n\t\t\t\t\t#endif\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\telse if (c=='s' || c=='S') p2PressedRight=1;\r\n\t\t\t\t\t\telse if (c=='p' || c=='P')\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t // in ANSI mode we do not make a pause here because here key \r\n\t\t\t\t\t\t\t // input is not as responsive as with in_keypressed() on the Sinclair computers\r\n\t\t\t\t\t\t\t // myWait(DELAY_BEFORE_NEWKEY);  \t// make pause before waiting for new key\r\n\t\t\t\t\t\t\t // Some systems are however special, so we still need to make a short pause...\r\n\t\t\t\t\t\t\t #if defined(__X1__) || defined(__HOMELAB__) || defined(__HOMELAB2__)\r\n\t\t\t\t\t\t\t\tmyWait(DELAY_BEFORE_NEWKEY);  \t// make pause before waiting for new key\r\n\t\t\t\t\t\t\t #endif\r\n\t\t\t\t\t\t\t fgetc_cons();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (c=='x' || c=='X') exitgame=1;\r\n\t\t\t\t\t}\t\t\t\t\t\r\n\t\t\t\t#endif\r\n\t\t\t\t\r\n\t\t\t\t// We react to the key press only if there was a change since the \r\n\t\t\t\t// last time we came along here, hence the lastState...-Check. \r\n\t\t\t\t// By doing this we avoid unintended multiple turn commands, \r\n\t\t\t\t// the player must always first release the button and then press it again.\r\n\t\t\t\t\r\n\t\t\t\tif (p1PressedLeft>0 && p1PressedLeft!=lastState_p1PressedLeft)\r\n\t\t\t\t{\r\n\t\t\t\t  if (numberOfPlayers>0)\r\n\t\t\t\t  {\r\n\t\t\t\t\tp2dir = p2dir+90;\r\n\t\t\t\t\tif (p2dir>=360) p2dir=0;\r\n\t\t\t\t  }\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (p1PressedRight>0 && p1PressedRight!=lastState_p1PressedRight)\r\n\t\t\t\t{\r\n\t\t\t\t  if (numberOfPlayers>0)\r\n\t\t\t\t  {\r\n\t\t\t\t\tp2dir = p2dir-90;\r\n\t\t\t\t\tif (p2dir<0) p2dir=270;\r\n\t\t\t\t  }\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (p2PressedLeft>0 && p2PressedLeft!=lastState_p2PressedLeft)\r\n\t\t\t\t{\r\n\t\t\t\t  if (numberOfPlayers==2)\r\n\t\t\t\t  {\r\n\t\t\t\t\tp1dir = p1dir+90;\r\n\t\t\t\t\tif (p1dir>=360) p1dir=0;\r\n\t\t\t\t  }\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (p2PressedRight>0 && p2PressedRight!=lastState_p2PressedRight)\r\n\t\t\t\t{\r\n\t\t\t\t  if (numberOfPlayers==2)\r\n\t\t\t\t  {\r\n\t\t\t\t\tp1dir = p1dir-90;\r\n\t\t\t\t\tif (p1dir<0) p1dir=270;\r\n\t\t\t\t  }\r\n\t\t\t\t }\r\n\r\n\t\t\t\t\r\n\t\t\t\t// For the remaining keys we do not need to remember the status\r\n\t\t\t\t// For ANSI we have already handled this above\t\t\t\t\r\n\t\t\t\t#if defined(USE_INKEYPRESSED)\r\n\t\t\t\t\tif (myKeyPressed(KEYPRESS_CODE_P)>0)\t// Pause\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t myWait(DELAY_BEFORE_NEWKEY);  \t// make pause before waiting for new key\r\n\t\t\t\t\t\t fgetc_cons();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (myKeyPressed(KEYPRESS_CODE_X)>0)\t// Exit\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\texitgame=1;\r\n\t\t\t\t\t}\r\n\t\t\t\t#elif defined(JOYSTICK_ONLY)\r\n\t\t\t\t\tif (joyButtonPause>0)\t// Pause\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif ((joystick(joystickNumber1) & joyButtonPause) || (joystick(joystickNumber2) & joyButtonPause))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t myWait(DELAY_BEFORE_NEWKEY);  \t// make pause before waiting for new key\r\n\t\t\t\t\t\t\t while (!(joystick(joystickNumber1) & MOVE_FIRE1) && !(joystick(joystickNumber2) & MOVE_FIRE1));\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (joyButtonMenu>0)\t// Exit to Menu\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif ((joystick(joystickNumber1) & joyButtonMenu) || (joystick(joystickNumber2) & joyButtonMenu)) exitgame=1;\r\n\t\t\t\t\t}\r\n\t\t\t\t#endif\r\n\r\n\t\t\t\t/* let the computer player decide what to do */\r\n\t\t\t\t/* in one-player mode, Player 1 is controlled by the computer */\r\n\t\t\t\tif (numberOfPlayers<2) AIComputerPlayer(&p1x,&p1y,&p1dir);\r\n\r\n\t\t\t\t/* in demo mode, Player 2 is also controlled by the computer */\r\n\t\t\t\tif (numberOfPlayers==0) AIComputerPlayer(&p2x,&p2y,&p2dir);\r\n\t\t\t\t\r\n\t\t\t\tMovePlayers();\r\n\r\n\t\t\t\t// speed throttling\r\n\t\t\t\t// depending on the type of game we use different delay values\r\n\t\t\t\tswitch(numberOfPlayers)\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 0: if (DELAY_GAME_DEMO>0) myWait(DELAY_GAME_DEMO); break;\t// usually no delay required because AI for two computer players is most demanding for the CPU\r\n\t\t\t\t\tcase 1: myWait(DELAY_GAME_ONEPLAYER); break;\r\n\t\t\t\t\tcase 2: myWait(DELAY_GAME_TWOPLAYERS); break;\r\n\t\t\t\t}\t\t  \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t// remember the last state of the control keys\t\t\t  \r\n\t\t\t\tlastState_p1PressedLeft=p1PressedLeft;\r\n\t\t\t\tlastState_p1PressedRight=p1PressedRight;\r\n\t\t\t\tlastState_p2PressedLeft=p2PressedLeft;\r\n\t\t\t\tlastState_p2PressedRight=p2PressedRight;\t\t\t  \r\n\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\t/* wait a quarter of a second after a crash has happened before clearing the screen */\r\n\t\t\tif (p1Crashed || p2Crashed) myWait(DELAY_AFTER_CRASH);\r\n\t\t\r\n\t\t}\r\n\r\n\t\tmyCls();\r\n\t\tprintf(END_FINALSCORE);\r\n\t\t#if !defined(FOUR_BY_SIX_CHARACTERS)\r\n\t\t\tprintf(\"    %d : %d\\n\\n\", p1Score, p2Score);\r\n\t\t#else\r\n\t\t\tprintf(\"  %d : %d\\n\\n\", p1Score, p2Score);\r\n\t\t#endif\r\n\t\t\t\t\r\n\t\tif (p1Score>p2Score)\r\n\t\t\tif (numberOfPlayers==0)\r\n\t\t\t  printf(END_COMP1_WINS);\r\n\t\t\telse if (numberOfPlayers==2)\r\n\t\t\t  printf(END_P1_WINS);\r\n\t\t\telse\r\n\t\t\t  printf(END_COMP_WINS);\r\n\t\tif (p1Score<p2Score)\r\n\t\t\tif (numberOfPlayers==0)\r\n\t\t\t  printf(END_COMP2_WINS);\r\n\t\t\telse if (numberOfPlayers==2)\r\n\t\t\t  printf(END_P2_WINS);\r\n\t\t\telse\r\n\t\t\t  printf(END_YOU_WIN);\r\n\t\tif (p1Score==p2Score)\r\n\t\t\tprintf(END_A_DRAW);\r\n\t\t\t\r\n\t\tprintf(END_PLAY_AGAIN);\r\n\t\tprintf(END_M_FOR_MENU);\r\n\t\tkey=0;\r\n\t\tdo\r\n\t\t{\r\n\t\t\t#if defined(__ZX80__)\r\n\t\t\t\tkey=fgetc_cons();\r\n\t\t\t#elif defined(__ZX81__) || defined(__SPECTRUM__)\r\n\t\t\t\tkey=in_Inkey();\t// from input.h, available on the following platforms: zx spectrum, zx81, sam), returns the currently pressed key and program execution continues \t\t\r\n\t\t\t#elif defined(JOYSTICK_ONLY)\r\n\t\t\t\tif ((joystick(joystickNumber1) & MOVE_FIRE1) || (joystick(joystickNumber2) & MOVE_FIRE1)) key=KEY_CODE_Y;\r\n\t\t\t\tif ((joystick(joystickNumber1) & MOVE_UP) || (joystick(joystickNumber2) & MOVE_UP)) key=KEY_CODE_M;\r\n\t\t\t\t// N for No (= end program) makes no sense on consoles\r\n\t\t\t#elif defined(USE_ANSI) || defined(USE_NATIVE_INPUT)\r\n\t\t\t\tif(kbhit())\r\n\t\t\t\t{\r\n\t\t\t\t\tc = getch();\r\n\t\t\t\t\tif (c=='y' || c=='Y') key=KEY_CODE_Y;\r\n\t\t\t\t\telse if (c=='0') key=KEY_CODE_0;\r\n\t\t\t\t\telse if (c=='m' || c=='M') key=KEY_CODE_M;\r\n\t\t\t\t\telse if (c=='n' || c=='N') key=KEY_CODE_N;\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\telse key=0;\r\n\t\t\t#else\r\n\t\t\t\tkey=fgetc_cons();\t\r\n\t\t\t#endif\r\n\t\t\r\n\t\t\t// if (key>0) printf(\"\\nkeycode: %d\",key);\t\t\t\t\t\r\n\t\t\tif (key==KEY_CODE_N)\r\n\t\t\t{\r\n\t\t\t\tnotPlayAgain=1;\r\n\t\t\t\trestartAgain=0;\t\r\n\t\t\t}\r\n\t\t\tif (key==KEY_CODE_M)\r\n\t\t\t{\r\n\t\t\t\tnotPlayAgain=1;\r\n\t\t\t\trestartAgain=1;\t\r\n\t\t\t}\r\n\r\n\t\t} while(key!=KEY_CODE_Y && key!=KEY_CODE_N && key!=KEY_CODE_0 && key!=KEY_CODE_M);  // key 0 is for the ZX81 \"cursor joystick\" fire button\r\n\r\n\t  }\r\n  } while (restartAgain>0);\r\n\r\n  myCls();\r\n  \r\n  DoWhenProgramTerminates();\r\n  \r\n  return;\r\n}\r\n"
  },
  {
    "path": "src/debug/hwcomx.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n\t\t\" ldireg R8, 0x4195\\n\"\r\n\t\t\" ghi R12\\n\"\r\n\t\t\" str R8\\n\"\r\n\t\t\" inc R8\\n\"\r\n\t\t\" glo R12\\n\"\r\n\t\t\" str R8\\n\"\r\n\t\t\" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n \r\nvoid gotoxycomx(unsigned int vidmem, unsigned char column){\r\n\tasm(\r\n\t\" ldireg R8, 0x419A\\n\"\r\n\t\" sex R8\\n\"\r\n\t\" glo R13\\n\"\r\n\t\" stxd\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" glo R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ghi R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" glo R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ghi R12\\n\"\r\n\t\" adi 0xf8\\n\"\r\n\t\" stxd\\n\"\r\n    \" sex R2\\n\");\r\n}\r\n\r\nvoid gotoxy(unsigned char x, unsigned char y){\r\n\tunsigned int vidmem;\r\n\tvidmem = y*40 + x;\r\n    gotoxycomx(vidmem, x);\r\n}\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" bz $$end\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" br $$cpy\\n\"\r\n\t\"$$end:\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$loop:\\n\"\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$loop\\n\"\t\t // Loop if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n    \" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n    \" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n    \"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nunsigned char bgcolor(unsigned char color){\r\n\tasm( //color is in R12.0\r\n\t\t //0: black\r\n\t\t //1: green\r\n\t\t //2: blue\r\n\t\t //3: cyan\r\n\t\t //4: red\r\n\t\t //5: yellow\r\n\t\t //6: magenta\r\n\t\t //7: white\r\n\t\t\" ldireg R8, 0x41C0\\n\"\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 7\\n\"\t\t\t\t//get old background color\r\n\t\t\" plo R15\\n\"\r\n\t\t\" ldi 0\\n\"\r\n\t\t\" phi R15\\n\"\t\t\t//return old background in R15\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 0xf8\\n\"\t\t\t//clear background color\r\n\t\t\" str R2\\n\"\t\t\t\t//store value on stack\r\n\t\t\" glo R12\\n\"\t\t\t//get new color\r\n\t\t\" ani 7\\n\"\t\t\t\t//limit to 3 bits\r\n\t\t\" or\\n\"\t\t\t\t\t//new color OR latest OUT3 value\r\n\t\t\" str R8\\n\"\t\t\t\t//store new value \r\n\t\t\" sex R8\\n\"\r\n\t\t\" out 3\\n\"\t\t\t\t//set new color value\r\n\t\t\" sex R2\\n\"\r\n\t\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid textcolordefinition(unsigned char definition){\r\n\tasm( //definition is in R12.0\r\n\t\t // b1\tb0\tRED\t BLUE\tGREEN\r\n\t\t //  0\t 0\tCB0\t CB1\tPCB\r\n\t\t //  0\t 1  CCB0 PCB\tCCB1\r\n\t\t //  1  0/1 PCB\t CCB0\tCCB1\r\n\t\t\" ldireg R8, 0x41C0\\n\"\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 0x9f\\n\"\t\t\t//clear text color definition\r\n\t\t\" str R2\\n\"\t\t\t\t//store value on stack\r\n\t\t\" glo R12\\n\"\t\t\t//get new color\r\n\t\t\" ani 3\\n\"\t\t\t\t//limit to 2 bits\r\n\t\t\" shrc\\n\"\r\n\t\t\" shrc\\n\"\r\n\t\t\" shrc\\n\"\r\n\t\t\" shrc\\n\"\r\n\t\t\" or\\n\"\t\t\t\t\t//new text color definition OR latest OUT3 value\r\n\t\t\" str R8\\n\"\t\t\t\t//store new value \r\n\t\t\" sex R8\\n\"\r\n\t\t\" out 3\\n\"\t\t\t\t//set new color definition value\r\n\t\t\" sex R2\\n\");\r\n}\r\n\r\nvoid monochrome(unsigned char mono){\r\n\tasm( //mono/cfc is in R12.0, 0=color, 1=mono\r\n\t\t\" ldireg R8, 0x41C0\\n\"\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 0xf7\\n\"\t\t\t//clear cfc\r\n\t\t\" str R2\\n\"\t\t\t\t//store value on stack\r\n\t\t\" glo R12\\n\"\t\t\t//get new cfc\r\n\t\t\" ani 1\\n\"\t\t\t\t//limit to 1 bits\r\n\t\t\" shl\\n\"\r\n\t\t\" shl\\n\"\r\n\t\t\" shl\\n\"\r\n\t\t\" or\\n\"\t\t\t\t\t//new cfc OR latest OUT3 value\r\n\t\t\" str R8\\n\"\t\t\t\t//store new value \r\n\t\t\" sex R8\\n\"\r\n\t\t\" out 3\\n\"\t\t\t\t//set new cfc value\r\n\t\t\" sex R2\\n\");\r\n}\r\n\r\nunsigned short int rand(){\r\n\tasm( \r\n\t\" ldireg R8, 0x42be\\n\"\t\t// COMX BASIC RND seed value\r\n\t\" lda R8\\n\"\t\r\n\t\" bnz $$rand1\\n\"\t\t\t// Do rand if high byte of seed value != 0\r\n    \"$$zerolow:\\n\"\r\n\t\" glo R0\\n\"\t\t\t\t\t\r\n\t\" bz $$zerolow\\n\"\t\t\t// Wait until R0.0 != 0\r\n\t\" phi R15\\n\"\t\t\t\t// Use R0.0 as low byte of seed value\r\n    \"$$zerohigh:\\n\"\r\n\t\" ghi R0\\n\"\r\n\t\" bnz $$rand2\\n\"\t\t\t// If R0.1 != 0 use as high byte of seed value\r\n\t\" br $$zerohigh\\n\"\t\t\t// Wait until R0.1 != 0\r\n   \"$$rand1:\\n\"\r\n\t\" phi R15\\n\"\t// R15.1 = high byte of seed value\r\n\t\" ldn 8\\n\"\t\r\n   \"$$rand2:\\n\"\r\n\t\" plo R15\\n\"\t// R15.0 = low byte of seed value\r\n\t\" ani 1\\n\"\r\n\t\" str R2\\n\"\t\t// Stack = bit 0 of seed value, rest is 0\r\n\t\" glo R15\\n\"\t// D = low byte of seed value\r\n\t\" shr\\n\"\t    \r\n\t\" shr\\n\"\t\t\r\n\t\" xor\\n\"\t\t// D bit 0 = bit 0 XOR bit 2\r\n\t\" plo R9\\n\"\r\n\t\" ani 1\\n\"\r\n\t\" str R2\\n\"\t\t// Stack = bit 0 XOR bit 2\r\n\t\" glo R9\\n\"\r\n\t\" shr\\n\"\t\t\r\n\t\" xor\\n\"\t\t// D bit 0 = bit 0/2 XOR bit 3\r\n\t\" plo R9\\n\"\r\n\t\" ani 1\\n\"\r\n\t\" str R2\\n\"\t\t// Stack = bit 0/2 XOR bit 3\r\n\t\" glo R9\\n\"\r\n\t\" shr\\n\"\t\t\r\n\t\" shr\\n\"\t\t\r\n\t\" xor\\n\"\t\t// D bit 0 = bit 0/2/3  XOR bit 5\r\n\t\" shr\\n\"\t\t// DF = new input bit\r\n\t\" ghi R15\\n\"\r\n\t\" shrc\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" str R8\\n\"\t\t// Store high byte new seed value, \r\n\t\t\t\t\t// R15.1 >> 1, MSB = DF, new input bit, DF = LSB\r\n\t\" ani 0x7f\\n\"\r\n\t\" phi R15\\n\"\t// R15.1 = seed value & 0x7f, allowing only postivie numbers\r\n\t\" glo R15\\n\"\r\n\t\" shrc\\n\"\r\n\t\" plo R15\\n\"\t// R15.0 >> 1, MSB = DF, DF = LSB\r\n\t\" inc R8\\n\"\r\n\t\" str R8\\n\"\t\t// Store low byte new seed value\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\tunsigned int oldbkcolor;\r\n\r\n    setvideobase(vidmem);\r\n\r\n\toldbkcolor = bgcolor(0);\r\n\ttextcolordefinition(3);\r\n\tmonochrome(0);\r\n\r\n\tdisableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD, abc \\xe1\\xe2\\xe3\");\r\n\tshapechar(shapes, 3);\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xf828;\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,'U');\r\n\t\t\t\tvidchar(vidmem+1,'P');\r\n\t\t\t\tvidchar(vidmem+2,' ');\r\n\t\t\t\tvidchar(vidmem+3,' ');\r\n\t\t\t\tvidchar(vidmem+4,' ');\r\n\t\t\t\tgeneratetone(80,5,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidstrcpy(vidmem,\"RIGHT\");\r\n\t\t\t\tgeneratenoise(2,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidstrcpy(vidmem,\"LEFT \");\r\n\t\t\t\tgeneratenoise(6,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidstrcpy(vidmem,\"DOWN \");\r\n\t\t\t\tgeneratetone(80,7,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (kbhit() == 0)\r\n\t\t{\r\n\t\t\tsettone(0);\r\n\t\t\tsetnoise(0);\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\twhile (kbhit() == 1)\r\n\t{\r\n\t}\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xfa00;\r\n\tvidchar(vidmem,'X');\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem - 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem++;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem--;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem + 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\tenableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tgotoxy(0,0);\r\n    printf(\"HELLO WORLD!\");\r\n\tgotoxy(20,0);\r\n    printf(\"20,0\");\r\n\tgotoxy(0,20);\r\n    printf(\"0,20\");\r\n\tgotoxy(10,10);\r\n    printf(\"10,10\");\r\n\twhile(1)\r\n\t\tprintf(\" %i\",rand());\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/hwcomx1.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren\r\n    modified by Fabrizio Caruso\r\n*/\r\n\r\n\r\n\r\n#define _PLAYER_DOWN_UDG              12,18,12,51,45,12,18,51,0\r\n#define _PLAYER_UP_UDG                12,30,12,51,45,12,18,51,0\r\n#define _PLAYER_LEFT_UDG              12,22,12,62,13,12,20,20,0\r\n#define _PLAYER_RIGHT_UDG             12,26,12,31,44,12,10,10,0\r\n\r\n#define _PLAYER_DOWN_UDG_1              12+64,18+64,12+64,51+64,45+64,12+64,18+64,51+64,0+64\r\n#define _PLAYER_UP_UDG_1                12+64,30+64,12+64,51+64,45+64,12+64,18+64,51+64,0+64\r\n#define _PLAYER_LEFT_UDG_1              12+64,22+64,12+64,62+64,13+64,12+64,20+64,20+64,0+64\r\n#define _PLAYER_RIGHT_UDG_1             12+64,26+64,12+64,31+64,44+64,12+64,10+64,10+64,0+64\r\n\r\n#define _PLAYER_DOWN_UDG_2              12+128,18+128,12+128,51+128,45+128,12+128,18+128,51+128,0+128\r\n#define _PLAYER_UP_UDG_2                12+128,30+128,12+128,51+128,45+128,12+128,18+128,51+128,0+128\r\n#define _PLAYER_LEFT_UDG_2              12+128,22+128,12+128,62+128,13+128,12+128,20+128,20+128,0+128\r\n#define _PLAYER_RIGHT_UDG_2             12+128,26+128,12+128,31+128,44+128,12+128,10+128,10+128,0+128\r\n\r\n#define _PLAYER_DOWN_UDG_3              12+192,18+192,12+192,51+192,45+192,12+192,18+192,51+192,0+192\r\n#define _PLAYER_UP_UDG_3                12+192,30+192,12+192,51+192,45+192,12+192,18+192,51+192,0+192\r\n#define _PLAYER_LEFT_UDG_3              12+192,22+192,12+192,62+192,13+192,12+192,20+192,20+192,0+192\r\n#define _PLAYER_RIGHT_UDG_3             12+192,26+192,12+192,31+192,44+192,12+192,10+192,10+192,0+192\r\n\r\nunsigned char shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t_PLAYER_DOWN_UDG,\r\n\t98, // next character to shape\r\n\t_PLAYER_UP_UDG,\r\n\t99,\r\n\t_PLAYER_RIGHT_UDG,\r\n\t100,\r\n\t_PLAYER_LEFT_UDG,\r\n\t101, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t_PLAYER_DOWN_UDG_1,\r\n\t102, // next character to shape\r\n\t_PLAYER_UP_UDG_1,\r\n\t103,\r\n\t_PLAYER_RIGHT_UDG_1,\r\n\t104,\r\n\t_PLAYER_LEFT_UDG_1,\r\n\t105, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t_PLAYER_DOWN_UDG_2,\r\n\t106, // next character to shape\r\n\t_PLAYER_UP_UDG_2,\r\n\t107,\r\n\t_PLAYER_RIGHT_UDG_2,\r\n\t108,\r\n\t_PLAYER_LEFT_UDG_2,\r\n\t109, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t_PLAYER_DOWN_UDG_3,\r\n\t110, // next character to shape\r\n\t_PLAYER_UP_UDG_3,\r\n\t111,\r\n\t_PLAYER_RIGHT_UDG_3,\r\n\t112,\r\n\t_PLAYER_LEFT_UDG_3\r\n};\r\n\r\nvoid shapechar(unsigned char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(){\r\n\tasm(\" ldiReg R8,0xF800\\n\"\r\n\t    \" sex R8\\n\"\r\n\t    \" out 7\\n\"\r\n\t    \" sex R2\\n\");\r\n}\r\n\r\nvoid vidstrcpy(unsigned char * vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned char * vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nint getlastkey(){ //get last key\r\n\tasm(\r\n\t\" ldiReg R8,0x41A3\\n\"\r\n\t\" ldn R8\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" str R8\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint getkey(){ //get key value if currently pressed\r\n\tasm(\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\n#define POKE(addr,val)     (*(unsigned char*) (addr) = (val))\r\n\r\n\r\nvoid main(){\r\n\tunsigned char* vidmem=(unsigned char *)0xf800;\r\n\tchar key;\r\n\tunsigned int loop, vidmemaddress;\r\n    int i;\r\n\r\n\tsetvideobase();\r\n\tvidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD\");\r\n    vidstrcpy(vidmem+40, \"a b c d  e f g h  i j k l  m n o p\");\r\n\tvidmemaddress = (unsigned int) 0xf800+120;\r\n\t// vidchar(vidmemaddress+21, 0xe1); // print character a in second color scheme\r\n\tfor(i = 0;i<16;++i)\r\n\t{\r\n        vidchar(vidmemaddress+i*2,0xe1+i);\r\n\t}\r\n\tshapechar(shapes, 16);\r\n    \r\n    POKE(0xf800+200,0xe1);    \r\n    POKE(0xf800+201,0xe2);\r\n    POKE(0xf800+202,0xe3);    \r\n    POKE(0xf800+203,0xe4);\r\n\r\n\tloop = 1;\r\n\tvidmem = (unsigned char *)0xf828;\r\n\tvidmemaddress = (unsigned int) 0xf828;\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmemaddress,'U');\r\n\t\t\t\tvidchar(vidmemaddress+1,'P');\r\n\t\t\t\tvidchar(vidmemaddress+2,' ');\r\n\t\t\t\tvidchar(vidmemaddress+3,' ');\r\n\t\t\t\tvidchar(vidmemaddress+4,' ');\r\n\t\t\t\tgeneratetone(80,5,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidstrcpy(vidmem,\"RIGHT\");\r\n\t\t\t\tgeneratetone(80,6,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidstrcpy(vidmem,\"LEFT \");\r\n\t\t\t\tgeneratetone(80,4,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidstrcpy(vidmem,\"DOWN \");\r\n\t\t\t\tgeneratetone(80,7,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tsettone(0);\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/debug/hwcomx2.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n        \" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$loop:\\n\"\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$loop\\n\"\t\t // Loop if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n    \" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n    \" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n    \"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\r\n    setvideobase(vidmem);\r\n\tdisableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD, abc \\xe1\\xe2\\xe3\");\r\n\tshapechar(shapes, 3);\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xf828;\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,'U');\r\n\t\t\t\tvidchar(vidmem+1,'P');\r\n\t\t\t\tvidchar(vidmem+2,' ');\r\n\t\t\t\tvidchar(vidmem+3,' ');\r\n\t\t\t\tvidchar(vidmem+4,' ');\r\n\t\t\t\tgeneratetone(80,5,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidstrcpy(vidmem,\"RIGHT\");\r\n\t\t\t\tgeneratenoise(2,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidstrcpy(vidmem,\"LEFT \");\r\n\t\t\t\tgeneratenoise(6,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidstrcpy(vidmem,\"DOWN \");\r\n\t\t\t\tgeneratetone(80,7,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (kbhit() == 0)\r\n\t\t{\r\n\t\t\tsettone(0);\r\n\t\t\tsetnoise(0);\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\twhile (kbhit() == 1)\r\n\t{\r\n\t}\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xfa00;\r\n\tvidchar(vidmem,'X');\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem - 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem++;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem--;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem + 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\tenableinterrupt();\r\n    printf(\"HELLO WORLD! %i %d\", 42, 43);\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/hwcomx_gotoxy.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n\t\t\" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n \r\nvoid gotoxycomx(unsigned short vidmem, unsigned char column)\r\n{\r\n\tasm(\r\n\t\" ldireg R8, 0x419A\\n\"\r\n\t\" sex R8\\n\"\r\n\t\" glo R13\\n\"\r\n\t\" stxd\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" glo R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ghi R12\\n\"\r\n\t\" smi 0xf8\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ldi 0xf8\\n\"\r\n\t\" stxd\\n\"\r\n\t\" glo R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ghi R12\\n\"\r\n\t\" stxd\\n\");\r\n}\r\n\r\n// void gotoxy(unsigned char x, unsigned char y)\r\n// {\r\n    // gotoxycomx((unsigned short)0xf800+x+y*40,x);\r\n// }\r\n\r\n#define gotoxy(x,y) gotoxycomx((unsigned short)0xf800+(x)+(y)*40,(x))\r\n\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$loop:\\n\"\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$loop\\n\"\t\t // Loop if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n    \" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n    \" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n    \"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\r\n    setvideobase(vidmem);\r\n\tdisableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD, abc \\xe1\\xe2\\xe3\");\r\n\tshapechar(shapes, 3);\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xf828;\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,'U');\r\n\t\t\t\tvidchar(vidmem+1,'P');\r\n\t\t\t\tvidchar(vidmem+2,' ');\r\n\t\t\t\tvidchar(vidmem+3,' ');\r\n\t\t\t\tvidchar(vidmem+4,' ');\r\n\t\t\t\tgeneratetone(80,5,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidstrcpy(vidmem,\"RIGHT\");\r\n\t\t\t\tgeneratenoise(2,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidstrcpy(vidmem,\"LEFT \");\r\n\t\t\t\tgeneratenoise(6,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidstrcpy(vidmem,\"DOWN \");\r\n\t\t\t\tgeneratetone(80,7,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (kbhit() == 0)\r\n\t\t{\r\n\t\t\tsettone(0);\r\n\t\t\tsetnoise(0);\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\twhile (kbhit() == 1)\r\n\t{\r\n\t}\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xfa00;\r\n\tvidchar(vidmem,'X');\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem - 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem++;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem--;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem + 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\tenableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tgotoxy(0,0);\r\n    printf(\"HELLO WORLD!\");\r\n\tgotoxy(20,0);\r\n    printf(\"20,0\");\r\n\tgotoxy(0,20);\r\n    printf(\"0,20\");\r\n\tgotoxy(10,10);\r\n    printf(\"10,10\");\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/hwcomx_gotoxy2.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putcomx(c,0x3302)\r\n\r\nvoid putcomx(unsigned char c, unsigned int r13val){\r\n    asm(\r\n        \" glo r12\\n\"\r\n        \" lbr 0x2cd3\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n\t\t\" ldireg R8, 0x4195\\n\"\r\n\t\t\" ghi R12\\n\"\r\n\t\t\" str R8\\n\"\r\n\t\t\" inc R8\\n\"\r\n\t\t\" glo R12\\n\"\r\n\t\t\" str R8\\n\"\r\n\t\t\" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n \r\nvoid gotoxycomx(unsigned int vidmem, unsigned char column){\r\n\tasm(\r\n\t\" ldireg R8, 0x419A\\n\"\r\n\t\" sex R8\\n\"\r\n\t\" glo R13\\n\"\r\n\t\" stxd\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" glo R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ghi R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" dec R8\\n\"\r\n\t\" glo R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ghi R12\\n\"\r\n\t\" adi 0xf8\\n\"\r\n\t\" stxd\\n\");\r\n}\r\n\r\n// void gotoxy(unsigned char x, unsigned char y){\r\n\t// unsigned int vidmem;\r\n\t// vidmem = y*40 + x;\r\n    // gotoxycomx(vidmem, x);\r\n// }\r\n\r\n#define gotoxy(x,y) gotoxycomx((y)*40 + (x), (x))\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$loop:\\n\"\r\n\t\" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n\t\" bn2 $$loop\\n\"\t\t // Loop if no key was pressed previously\r\n\t\"$$keypressed:\\n\"\r\n\t\" inp 3\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n    \" b3 $$keypressed\\n\" // Check if a key is pressed for the 'first time'\r\n    \" bn2 $$nokey\\n\"     // Branch to nokey if no key was pressed previously\r\n    \"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\r\n\t\" lskp\\n\"\r\n\t\"$$nokey:\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldireg R8,0x41C3\\n\"\r\n\t\" ldn R8\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting from 0x41C3 and store in R12.0\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\r\n    setvideobase(vidmem);\r\n\tdisableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD, abc \\xe1\\xe2\\xe3\");\r\n\tshapechar(shapes, 3);\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xf828;\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,'U');\r\n\t\t\t\tvidchar(vidmem+1,'P');\r\n\t\t\t\tvidchar(vidmem+2,' ');\r\n\t\t\t\tvidchar(vidmem+3,' ');\r\n\t\t\t\tvidchar(vidmem+4,' ');\r\n\t\t\t\tgeneratetone(80,5,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidstrcpy(vidmem,\"RIGHT\");\r\n\t\t\t\tgeneratenoise(2,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidstrcpy(vidmem,\"LEFT \");\r\n\t\t\t\tgeneratenoise(6,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidstrcpy(vidmem,\"DOWN \");\r\n\t\t\t\tgeneratetone(80,7,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (kbhit() == 0)\r\n\t\t{\r\n\t\t\tsettone(0);\r\n\t\t\tsetnoise(0);\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\twhile (kbhit() == 1)\r\n\t{\r\n\t}\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xfa00;\r\n\tvidchar(vidmem,'X');\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x82:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem - 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x83:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem++;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x84:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem--;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x85:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem + 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x71:  // Q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\tenableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n\tgotoxy(0,0);\r\n    printf(\"HELLO WORLD!\");\r\n\tgotoxy(20,0);\r\n    printf(\"20,0\");\r\n\tgotoxy(0,20);\r\n    printf(\"0,20\");\r\n\tgotoxy(10,10);\r\n    printf(\"10,10\");\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/hwcomx_pp_debug.c",
    "content": "#include \"foo.h\"\r\n\r\n\r\nvoid setvideobase(){\r\n\tasm(\" ldiReg R8,0xF800\\n\"\r\n\t    \" sex R8\\n\"\r\n\t    \" out 7\\n\"\r\n\t    \" sex R2\\n\");\r\n}\r\n\r\nvoid vidstrcpy(unsigned char * vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned char * vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\n\r\n\r\nunsigned char _foo = 43;\r\n\r\nextern Foo FOO;\r\n\r\nint main(void)\r\n{\r\n\tunsigned char* vidmem=(unsigned char *)0xf800;\r\n\r\n\r\n    \r\n\tsetvideobase();\r\n\tvidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD\");\r\n    \r\n    // if(FOO==42)\r\n        // vidstrcpy(vidmem+80, \"FOO IS 42\");\r\n    // else\r\n        // vidstrcpy(vidmem+80, \"FOO IS NOT 42!\");\r\n    \r\n    \r\n    // if(_FOO==43)\r\n        // vidstrcpy(vidmem+120, \"_FOO IS 43\");\r\n    // else\r\n        // vidstrcpy(vidmem+120, \"_FOO IS NOT 43!\");\r\n    \r\n    FOO.bar = _FOO;\r\n    \r\n    while(1){};\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/hwpecom.c",
    "content": "/*\r\n    Hello World for the PECOM 64\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#define putc(c) putpecom(c,0xB102)\r\n\r\nvoid putpecom(unsigned char c, unsigned int r13val){\r\n    asm(\r\n\t\t\" sex R2\\n\"\r\n\t\t\" glo r12\\n\"\r\n        \" lbr 0xAAB8\\n\");\r\n}\r\n\r\nchar shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n\r\nvoid shapechar(char * shapelocation, int number)\r\n{\r\n\tasm( //shapelocation pointer is R12, number of shapes is R13\r\n\t\" sex R3\\n\"\r\n\t\" out 1\\n\"\r\n\t\" db  2\\n\"\r\n    \" sex R2\\n\"\r\n\t\" ldi 0xf7\\n\"\r\n\t\" phi R8\\n\"\r\n\t\" ldi 0xfb\\n\"\r\n\t\" phi R9\\n\"\r\n\t\"$$nextshape:\\n\"\r\n\t\" ldi 0xC0 \\n\"\r\n\t\" plo R8 ; R8 = charmem pointer\\n\"\r\n\t\" plo r9 ; R9 = vidmem pointer\\n\"\r\n\t\" ldi 9 \\n\"\r\n\t\" plo R10 ; R10.0 = number of lines, we need to somehowe make a NTSC version for 8 lines\\n\"\r\n\t\" lda 12\\n\" \r\n\t\" phi R10 ; R10.1 = character\\n\"\r\n\t\"$$nextline:\\n\"\r\n\t\" ghi R10\\n\"\r\n\t\" b1  $\t; wait til video is quiet\\n\"\r\n\t\" str R9 ; store character in vidmem\\n\"\r\n\t\" inc R9\\n\"\r\n\t\" lda R12\\n\"\r\n\t\" str R8 ; store first shape line in charmem\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" dec R10\\n\"\r\n\t\" glo R10\\n\"\r\n\t\" bnz $$nextline ; number of lines - 1 if not zero do next line\\n\"\r\n\t\" dec r13\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" bnz $$nextshape\\n\");\r\n}\r\n\r\nvoid setvideobase(unsigned int vidmem){\r\n    asm( //vidmem pointer is R12\r\n\t\t\" ldireg R8, 0x7cc8\\n\"\r\n\t\t\" ghi R12\\n\"\r\n\t\t\" str R8\\n\"\r\n\t\t\" inc R8\\n\"\r\n\t\t\" glo R12\\n\"\r\n\t\t\" str R8\\n\"\r\n\t\t\" sex R12\\n\"\r\n        \" out 7\\n\"\r\n        \" sex R2\\n\");\r\n}\r\n\r\nvoid disableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" dis\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid enableinterrupt(){\r\n    asm( \r\n        \" sex 3\\n\"\r\n        \" ret\\n\"\r\n        \" db 0x23\\n\");\r\n}\r\n\r\nvoid gotoxypecom(unsigned int vidmem){\r\n\tasm(\r\n\t\" ldireg R8, 0x7CC6\\n\"\r\n\t\" sex R8\\n\"\r\n\t\" glo R12\\n\"\r\n\t\" stxd\\n\"\r\n\t\" ghi R12\\n\"\r\n\t\" adi 0xf8\\n\"\r\n\t\" stxd\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid gotoxy(unsigned char x, unsigned char y){\r\n    gotoxypecom(y*40 + x);\r\n}\r\n\r\nvoid vidstrcpy(unsigned int vidmem,char * text){ //write to video memory\r\n\tasm(\r\n\t\" sex R3\\n\"\r\n\t\" out 1\\n\"\r\n\t\" db  2\\n\"\r\n    \" sex R2\\n\"\r\n\t\"$$cpy:\\n\"\r\n\t\" lda R13 ;pick up input pointer\\n\"\r\n\t\" bz $$end\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" br $$cpy\\n\"\r\n\t\"$$end:\\n\");\r\n}\r\n\r\nvoid vidclr(unsigned int vidmem, int vidlen){ //write 0's to video memory\r\n\tasm( //vidmem pointer is R12, vidlen is R13\r\n\t\" sex R3\\n\"\r\n\t\" out 1\\n\"\r\n\t\" db  2\\n\"\r\n    \" sex R2\\n\"\r\n\t\"$$cpy:\\n\"\r\n\t\" ldi 0 ;source a 0 for clearing the screen\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\"\r\n\t\" inc R12 ;++\\n\"\r\n\t\" dec R13 ;decrement count\\n\"\r\n\t\" glo R13 ; check bottom byte\\n\"\r\n\t\" bnz $$cpy\\n\"\r\n\t\" ghi R13 ;top byte\\n\"\r\n\t\" bnz $$cpy\\n\");\r\n\treturn;\r\n}\r\n\r\nvoid vidchar(unsigned int vidmem, int character){ //write character to vidmem location in video memory\r\n\tasm(//vidmem pointer is R12, character is R13.0\r\n\t\" sex R3\\n\"\r\n\t\" out 1\\n\"\r\n\t\" db  2\\n\"\r\n    \" sex R2\\n\"\r\n\t\" glo r13\\n\"\r\n\t\" b1  $\t;wait til video is quiet\\n\"\r\n\t\" str R12 ;move the byte\\n\");\r\n\treturn;\r\n}\r\n\r\nunsigned char getkey(){ //get key value if pressed, otherwise return 0\r\n\tasm(\r\n\t\" ldireg R8, 0x7CCA\\n\"\r\n\t\" sex R8\\n\"\t\t\t\t//Set stack to R8 which counts up from 0x7CCA to 0x7CE3 to check all keys\r\n\t\"$$checknext:\\n\"\r\n\t\" inp 3\\n\"\t\t\t\t// bit 0 and 1 indicate key press\r\n\t\" ani 3\\n\"\r\n\t\" bnz $$keypressed\\n\"\t// bit 0 or 1 are 1 so a key is pressed\r\n\t\" glo R8\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" xri 0xe3\\n\"\r\n\t\" bnz $$checknext\\n\"\t// R8++ if not 0xE3 check next key\r\n\t\" ldi 0\\n\"\r\n\t\" br  $$exit\\n\"\t\t\t// all keys checked - return 0\r\n\t\"$$keypressed:\\n\"\r\n\t\" shr\\n\"\t\r\n\t\" shr\\n\"\t\t\t\t// move bit 1 into DF\r\n\t\" glo R8\\n\"\t\t\t\t// get value 'keyset'\r\n\t\" shlc\\n\"\t\t\t\t// shift left and move DF to b0 so key value is unique\r\n\t\" adi 0x98\\n\"\t\t\t// convert to ASCII\r\n\t\"$$exit:\\n\"\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n    \" sex R2\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nunsigned char cgetc(){ //wait for key press\r\n\tasm(\r\n\t\"$$cgetc:\\n\"\r\n\t\" ldireg R8, 0x7CCA\\n\"\r\n\t\" sex R8\\n\"\t\t\t\t//Set stack to R8 which counts up from 0x7CCA to 0x7CE3 to check all keys\r\n\t\"$$checknext:\\n\"\r\n\t\" inp 3\\n\"\t\t\t\t// bit 0 and 1 indicate key press\r\n\t\" ani 3\\n\"\r\n\t\" bnz $$keypressed\\n\"\t// bit 0 or 1 are 1 so a key is pressed\r\n\t\" glo R8\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" xri 0xe3\\n\"\r\n\t\" bnz $$checknext\\n\"\t// R8++ if not 0xE3 check next key\r\n\t\" br  $$cgetc\\n\"\t\t// all keys checked - check again\r\n\t\"$$keypressed:\\n\"\r\n\t\" shr\\n\"\t\r\n\t\" shr\\n\"\t\t\t\t// move bit 1 into DF\r\n\t\" glo R8\\n\"\t\t\t\t// get value 'keyset'\r\n\t\" shlc\\n\"\t\t\t\t// shift left and move DF to b0 so key value is unique\r\n\t\" adi 0x98\\n\"\t\t\t// convert to ASCII\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n    \" sex R2\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nint kbhit(){ //return 1 if a key is pressed, 0 if not\r\n\tasm(\r\n\t\" ldireg R8, 0x7CCA\\n\"\r\n\t\" sex R8\\n\"\t\t\t\t//Set stack to R8 which counts up from 0x7CCA to 0x7CE3 to check all keys\r\n\t\"$$checknext:\\n\"\r\n\t\" inp 3\\n\"\t\t\t\t// bit 0 and 1 indicate key press\r\n\t\" ani 3\\n\"\r\n\t\" bnz $$keypressed\\n\"\t// bit 0 or 1 are 1 so a key is pressed\r\n\t\" glo R8\\n\"\r\n\t\" inc R8\\n\"\r\n\t\" xri 0xe3\\n\"\r\n\t\" bnz $$checknext\\n\"\t// R8++ if not 0xE3 check next key\r\n\t\" ldi 0\\n\"\t\t\t\t// all keys checked - return 0\r\n\t\" lskp\\n\"\r\n\t\"$$keypressed:\\n\"\r\n\t\" ldi 1\\n\"\t\t\t\t// key pressed - return 1\r\n\t\" plo R15\\n\"\r\n\t\" ldi 0\\n\"\r\n\t\" phi R15\\n\"\r\n    \" sex R2\\n\"\r\n\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid settone(int value){\r\n\tasm(\r\n\t\" sex R12 ;Tone generation value\\n\"\r\n\t\" out 4\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatetone(int tone, int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = (volume & 0xf) + ((range &0x7) << 4) + 0x8 + ((tone & 0x7f) << 8);\r\n\tsettone(tonevalue);\r\n}\r\n\r\nvoid setnoise(int value){\r\n\tasm(\r\n\t\" ldi 0x80\\n\"\t\t    \r\n\t\" plo R12 ; load current OUT 5 (low byte) video setting 0x80\\n\"\t  \r\n\t\" sex R12 ; Noise  generation value\\n\"\r\n\t\" out 5\\n\"\r\n\t\" sex R2\\n\");\r\n}\r\n\r\nvoid generatenoise(int range, int volume){\r\n\tint tonevalue;\r\n\ttonevalue = ((volume & 0xf) + ((range &0x7) << 4) + 0x8) << 8;\r\n\tsetnoise(tonevalue);\r\n}\r\n\r\nunsigned char bgcolor(unsigned char color){\r\n\tasm( //color is in R12.0\r\n\t\t //0: black\r\n\t\t //1: green\r\n\t\t //2: blue\r\n\t\t //3: cyan\r\n\t\t //4: red\r\n\t\t //5: yellow\r\n\t\t //6: magenta\r\n\t\t //7: white\r\n\t\t\" ldireg R8, 0x7cc4\\n\"\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 7\\n\"\t\t\t\t//get old background color\r\n\t\t\" plo R15\\n\"\r\n\t\t\" ldi 0\\n\"\r\n\t\t\" phi R15\\n\"\t\t\t//return old background in R15\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 0xf8\\n\"\t\t\t//clear background color\r\n\t\t\" str R2\\n\"\t\t\t\t//store value on stack\r\n\t\t\" glo R12\\n\"\t\t\t//get new color\r\n\t\t\" ani 7\\n\"\t\t\t\t//limit to 3 bits\r\n\t\t\" or\\n\"\t\t\t\t\t//new color OR latest OUT3 value\r\n\t\t\" str R8\\n\"\t\t\t\t//store new value \r\n\t\t\" sex R8\\n\"\r\n\t\t\" out 3\\n\"\t\t\t\t//set new color value\r\n\t\t\" sex R2\\n\"\r\n\t\t\" Cretn\\n\");\r\n\treturn 0; //this statement will never be executed but it keeps the compiler happy\r\n}\r\n\r\nvoid textcolordefinition(unsigned char definition){\r\n\tasm( //definition is in R12.0\r\n\t\t // b1\tb0\tRED\t BLUE\tGREEN\r\n\t\t //  0\t 0\tCB0\t CB1\tPCB\r\n\t\t //  0\t 1  CCB0 PCB\tCCB1\r\n\t\t //  1  0/1 PCB\t CCB0\tCCB1\r\n\t\t\" ldireg R8, 0x7cc4\\n\"\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 0x9f\\n\"\t\t\t//clear text color definition\r\n\t\t\" str R2\\n\"\t\t\t\t//store value on stack\r\n\t\t\" glo R12\\n\"\t\t\t//get new color\r\n\t\t\" ani 3\\n\"\t\t\t\t//limit to 2 bits\r\n\t\t\" shrc\\n\"\r\n\t\t\" shrc\\n\"\r\n\t\t\" shrc\\n\"\r\n\t\t\" shrc\\n\"\r\n\t\t\" or\\n\"\t\t\t\t\t//new text color definition OR latest OUT3 value\r\n\t\t\" str R8\\n\"\t\t\t\t//store new value \r\n\t\t\" sex R8\\n\"\r\n\t\t\" out 3\\n\"\t\t\t\t//set new color definition value\r\n\t\t\" sex R2\\n\");\r\n}\r\n\r\nvoid monochrome(unsigned char mono){\r\n\tasm( //mono/cfc is in R12.0, 0=color, 1=mono\r\n\t\t\" ldireg R8, 0x7cc4\\n\"\r\n\t\t\" ldn R8\\n\"\t\t\t\t//get latest OUT 3 value\r\n\t\t\" ani 0xf7\\n\"\t\t\t//clear cfc\r\n\t\t\" str R2\\n\"\t\t\t\t//store value on stack\r\n\t\t\" glo R12\\n\"\t\t\t//get new cfc\r\n\t\t\" ani 1\\n\"\t\t\t\t//limit to 1 bits\r\n\t\t\" shl\\n\"\r\n\t\t\" shl\\n\"\r\n\t\t\" shl\\n\"\r\n\t\t\" or\\n\"\t\t\t\t\t//new cfc OR latest OUT3 value\r\n\t\t\" str R8\\n\"\t\t\t\t//store new value \r\n\t\t\" sex R8\\n\"\r\n\t\t\" out 3\\n\"\t\t\t\t//set new cfc value\r\n\t\t\" sex R2\\n\");\r\n}\r\n\r\nvoid main(){\r\n\tunsigned int vidmem=0xf800;\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\tunsigned int oldbkcolor;\r\n\r\n    setvideobase(vidmem);\r\n\r\n\toldbkcolor = bgcolor(0);\r\n\ttextcolordefinition(3);\r\n\tmonochrome(0);\r\n\r\n\tvidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD, abc \\xe1\\xe2\\xe3\");\r\n\tshapechar(shapes, 3);\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xf828;\r\n\r\n\twhile (1){\r\n\t\tkey = cgetc();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x5E:\r\n\t\t\t\tvidchar(vidmem,'U');\r\n\t\t\t\tvidchar(vidmem+1,'P');\r\n\t\t\t\tvidchar(vidmem+2,' ');\r\n\t\t\t\tvidchar(vidmem+3,' ');\r\n\t\t\t\tvidchar(vidmem+4,' ');\r\n\t\t\t\tgeneratetone(80,5,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x5D:\r\n\t\t\t\tvidstrcpy(vidmem,\"RIGHT\");\r\n\t\t\t\tgeneratenoise(2,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x5C:\r\n\t\t\t\tvidstrcpy(vidmem,\"LEFT \");\r\n\t\t\t\tgeneratenoise(6,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x5B:\r\n\t\t\t\tvidstrcpy(vidmem,\"DOWN \");\r\n\t\t\t\tgeneratetone(80,7,7);\r\n\t\t\tbreak;\r\n\t\t\tcase 0x51:  // q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (kbhit() == 0)\r\n\t\t{\r\n\t\t\tsettone(0);\r\n\t\t\tsetnoise(0);\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\twhile (kbhit() == 1)\r\n\t{\r\n\t}\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xfa00;\r\n\tvidchar(vidmem,'X');\r\n\twhile (1){\r\n\t\tkey = getkey();\r\n\t\tswitch (key){\r\n\t\t\tcase 0x5E:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem - 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x5D:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem++;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x5C:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem--;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x5B:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n\t\t\t\tvidmem = vidmem + 40;\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase 0x51:  // q\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n    vidclr(vidmem,24*40);\r\n//\tgotoxy(0,0);\r\n //   printf(\"HELLO WORLD!\");\r\n//\tgotoxy(20,0);\r\n//    printf(\"20,0\");\r\n//\tgotoxy(0,20);\r\n//    printf(\"0,20\");\r\n//\tgotoxy(10,10);\r\n//    printf(\"10,10\");\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/intern.c",
    "content": "#include \"intern.h\"\n\nextern const int foo[];\n\nint main(void)\n{\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/debug/intern.h",
    "content": "\nconst int foo[] = {42,43,44,45,46,47};\n\n"
  },
  {
    "path": "src/debug/lcc1802_test.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#include \"comx\\rca_vis_video.h\"\r\n#include \"comx\\rca_vis_sound.h\"\r\n#ifdef __PECOM__\r\n#include \"comx\\rca_joystick.h\"\r\n#endif\r\n#ifdef __TMC600__\r\n#include \"comx\\rca_joystick.h\"\r\n#endif\r\n#ifdef __CIDELSA__\r\n#include \"comx\\rca_joystick.h\"\r\n#endif\r\n#ifdef __COMX__\r\n#include \"comx\\rca_keyboard_encoder.h\"\r\n#endif\r\n#include \"comx\\rca_rand.h\"\r\n#include \"comx\\rca_system.h\"\r\n#ifndef __CIDELSA__\r\n#include \"comx\\rca_printf.h\"\r\n#endif\r\n\r\n#ifdef __COMX__\r\n#define key_up 0x82\r\n#define key_right 0x83\r\n#define key_left 0x84\r\n#define key_down 0x85\r\n#define key_exit 0x71\r\n#endif\r\n\r\n#ifdef __PECOM__\r\n#define key_up 0x5e\r\n#define key_right 0x5d\r\n#define key_left 0x5c\r\n#define key_down 0x5b\r\n#define key_exit 0x40\r\n#endif\r\n\r\n#ifdef __TMC600__\r\n#define key_up 0xb\r\n#define key_right 0x9\r\n#define key_left 0x8\r\n#define key_down 0xa\r\n#define key_exit 0x20\r\n#endif\r\n\r\n#ifdef __CIDELSA__\r\n#define key_up 0x10\r\n#define key_right 0x40\r\n#define key_left 0x80\r\n#define key_down 0x20\r\n#define key_exit 0x1\r\n#endif\r\n\r\nvoid main(){\r\n\r\n#ifdef __CIDELSA__\r\nstatic const unsigned char shape_alpha[] =\r\n{\r\n\t0x7E,\t// First byte is the '3rd' color bit for following lines one bit per line, b7 for first line\r\n\t0x00, 0xDF, 0xE8, 0xE8, 0xE8, 0xFF, 0xDF, 0x00,  //A\n\t0x7E,\n\t0x00, 0xD6, 0xE9, 0xE9, 0xE9, 0xFF, 0xFF, 0x00,  //B\n\t0x7E, \n\t0x00, 0xD2, 0xE1, 0xE1, 0xE1, 0xFF, 0xDE, 0x00,  //C\n\t0x7E, \n\t0x00, 0xDE, 0xE1, 0xE1, 0xE1, 0xFF, 0xFF, 0x00,  //D\n\t0x7E, \n\t0x00, 0xE1, 0xE1, 0xE9, 0xE9, 0xFF, 0xFF, 0x00,  //E\n\t0x7E,\n\t0x00, 0xE0, 0xE0, 0xE8, 0xE8, 0xFF, 0xFF, 0x00,  //F\n\t0x7E,\n\t0x00, 0xD6, 0xE5, 0xE1, 0xE1, 0xFF, 0xDE, 0x00,  //G\n\t0x7E, \n\t0x00, 0xFF, 0xC8, 0xC8, 0xC8, 0xFF, 0xFF, 0x00,  //H\n\t0x3C, \n\t0x00, 0x00, 0xE1, 0xFF, 0xFF, 0xE1, 0x00, 0x00,  //I\n\t0x7E, \n\t0x00, 0xFE, 0xFF, 0xC1, 0xC1, 0xC1, 0xC2, 0x00,  //J\r\n\t0x3E, \r\n\t0x00, 0x00, 0xE1, 0xD2, 0xCC, 0xFF, 0xFF, 0x00,  //K\r\n\t0x3E, \r\n\t0x00, 0x00, 0xC1, 0xC1, 0xC1, 0xFF, 0xFF, 0x00,  //L\r\n\t0x7E, \r\n\t0x00, 0xFF, 0xD0, 0xC8, 0xD0, 0xFF, 0xFF, 0x00,  //M\r\n\t0x7E, \r\n\t0x00, 0xFF, 0xC4, 0xC8, 0xD0, 0xFF, 0xFF, 0x00,  //N\r\n\t0x7E, \r\n\t0x00, 0xDE, 0xE1, 0xE1, 0xE1, 0xFF, 0xDE, 0x00,  //O\r\n\t0x7E, \r\n\t0x00, 0xD0, 0xE8, 0xE8, 0xE8, 0xFF, 0xFF, 0x00,  //P\r\n\t0x7E, \r\n\t0x00, 0xDE, 0xE1, 0xE7, 0xE1, 0xFF, 0xDE, 0x00,  //Q\r\n\t0x7E, \r\n\t0x00, 0xD1, 0xEA, 0xEC, 0xE8, 0xFF, 0xFF, 0x00,  //R\r\n\t0x7E, \r\n\t0x00, 0xE6, 0xEF, 0xE9, 0xE9, 0xF9, 0xD1, 0x00,  //S\r\n\t0x7E, \r\n\t0x00, 0xE0, 0xE0, 0xFF, 0xFF, 0xE0, 0xE0, 0x00,  //T\r\n\t0x7E, \r\n\t0x00, 0xFE, 0xC1, 0xC1, 0xC1, 0xFF, 0xFE, 0x00,  //U\r\n\t0x7E, \r\n\t0x00, 0xF0, 0xCC, 0xC3, 0xCF, 0xFC, 0xF0, 0x00,  //V\r\n\t0xFF, \r\n\t0xF0, 0xCC, 0xC3, 0xCC, 0xC3, 0xCF, 0xFC, 0xF0,  //W\r\n\t0x7E, \r\n\t0x00, 0xF3, 0xD4, 0xC8, 0xD4, 0xF3, 0xF3, 0x00,  //X\r\n\t0x7E,\r\n\t0x00, 0xE0, 0xD0, 0xCF, 0xDF, 0xF0, 0xE0, 0x00,  //Y\r\n\t0x7E,\r\n\t0x00, 0xF1, 0xF1, 0xE9, 0xE5, 0xE3, 0xE3, 0x00,  //Z\r\n};\r\n\r\nstatic const unsigned char shape_numbers[] =\r\n{\r\n\t0x00,\t\r\n\t0x5E, 0x61, 0x61, 0x61, 0x5E, 0x00, 0x00, 0x00,\t //0\r\n\t0x00, \r\n\t0x41, 0x7F, 0x61, 0x51, 0x41, 0x00, 0x00, 0x00,  //1\r\n\t0x00, \r\n\t0x51, 0x69, 0x65, 0x65, 0x53, 0x00, 0x00, 0x00,  //2\r\n\t0x00, \r\n\t0x56, 0x69, 0x69, 0x61, 0x61, 0x00, 0x00, 0x00,  //3\r\n\t0x00, \r\n\t0x44, 0x7F, 0x64, 0x54, 0x4C, 0x00, 0x00, 0x00,  //4\r\n\t0x00, \r\n\t0x66, 0x69, 0x69, 0x69, 0x72, 0x00, 0x00, 0x00,  //5\r\n\t0x00, \r\n\t0x66, 0x69, 0x69, 0x69, 0x5E, 0x00, 0x00, 0x00,  //6\r\n\t0x00, \r\n\t0x70, 0x68, 0x64, 0x63, 0x60, 0x00, 0x00, 0x00,  //7\r\n\t0x00, \r\n\t0x56, 0x69, 0x69, 0x69, 0x56, 0x00, 0x00, 0x00,  //8\r\n\t0x00, \r\n\t0x5E, 0x69, 0x69, 0x69, 0x51, 0x00, 0x00, 0x00,  //9\r\n\t0x00, \r\n};\r\n\r\nstatic const unsigned char shape_space[] =\r\n{\r\n\t0x00,\t\r\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\t //space\r\n};\r\n#else\r\nstatic const unsigned char shapes[] =\r\n{\r\n\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n\t0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n\t98, // next character to shape\r\n\t0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n\t99,\r\n\t0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n};\r\n#endif\r\n\r\n#ifdef __CIDELSA__\r\n\tunsigned int vidmem=0xfc10;\r\n#else\r\n\tunsigned int vidmem=0xf800;\r\n#endif\r\n\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\tunsigned int oldbkcolor;\r\n\r\n\tdisableinterrupt();\r\n    setvideobase(vidmem);\r\n\r\n\toldbkcolor = bgcolor(0);\r\n#ifndef __TMC600__\r\n\ttextcolordefinition(3);\r\n\tmonochrome(0);\r\n#ifdef __CIDELSA__\r\n\tshapechar(shape_space, 0x0001, 0x0);\r\n\tshapechar(shape_space, 0x2001, 0x0);\r\n\tshapechar(shape_numbers, 0x300A, 0x40);\r\n\tshapechar(shape_alpha, 0x411A, 0x0);\r\n\tshapechar(shape_space, 0x8001, 0x0);\r\n\tshapechar(shape_space, 0xA001, 0x0);\r\n\tshapechar(shape_numbers, 0xB00A, 0x80);\r\n\tshapechar(shape_alpha, 0xC11A, 0xa0);\r\n#else\r\n\tshapecolor(0x20, 0x5f, 2);\r\n\tshapechar(shapes, 3);\r\n#endif\r\n#else\r\n\ttextcolor(7);\r\n#endif\r\n\r\n#ifdef __CIDELSA__\r\n    vidclr(0xf800,27*40);\r\n\tvidstrcpy(vidmem, \"HELLO WORLD\");\r\n\tvidstrcpy(vidmem + 4, \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\");\r\n\tvidstrcpy(vidmem + 6, \"0 1 2 3 4 5 6 7 8 9\");\r\n\ttextcolor(1);\r\n\tvidstrcpy(vidmem + 8, \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\");\r\n\tvidstrcpy(vidmem + 10, \"0 1 2 3 4 5 6 7 8 9\");\r\n\tvidmem += 2;\r\n#else\r\n    vidclr(vidmem,24*40);\r\n\tvidstrcpy(vidmem, \"HELLO \");\r\n\ttextcolor(1);\r\n\tvidstrcpy(vidmem+6, \"WORLD\");\r\n\tvidmem = 0xf828;\r\n#endif\r\n\r\n#ifdef __TMC600__\r\n\tsetcolor(0,3);\r\n#endif\r\n\tloop = 1;\r\n\r\n\twhile (1){\r\n#ifdef __CIDELSA__\r\n\t\tkey = get_stick();\r\n\t\tif (get_trigger() != 0)\r\n\t\t\tkey = 1;\r\n#else\r\n\t\tkey = getkey();\r\n#endif\r\n\t\tswitch (key){\r\n\t\t\tcase key_up:\r\n\t\t\t\tvidstrcpy(vidmem,\"UP   \");\r\n\t\t\t\tgeneratetone(80,5,7);\r\n\t\t\tbreak;\r\n\t\t\tcase key_right:\r\n\t\t\t\tvidstrcpy(vidmem,\"RIGHT\");\r\n\t\t\t\tgeneratenoise(2,7);\r\n\t\t\tbreak;\r\n\t\t\tcase key_left:\r\n\t\t\t\tvidstrcpy(vidmem,\"LEFT \");\r\n\t\t\t\tgeneratenoise(6,7);\r\n\t\t\tbreak;\r\n\t\t\tcase key_down:\r\n\t\t\t\tvidstrcpy(vidmem,\"DOWN \");\r\n\t\t\t\tgeneratetone(80,7,7);\r\n\t\t\tbreak;\r\n\t\t\tcase key_exit:  // Q or space\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (kbhit() == 0)\r\n\t\t{\r\n\t\t\tgeneratetone(0, 0, 0);\r\n\t\t\tgeneratenoise(0,0);\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\twhile (kbhit() == 1)\r\n\t{\r\n\t}\r\n\r\n\tloop = 1;\r\n\tvidmem = 0xfa00;\r\n\tvidchar(vidmem,'X');\r\n\twhile (1){\r\n#ifdef __CIDELSA__\r\n\t\tkey = get_stick();\r\n\t\tif (get_trigger() != 0)\r\n\t\t\tkey = 1;\r\n#else\r\n\t\tkey = getkey();\r\n#endif\r\n\t\tswitch (key){\r\n\t\t\tcase key_up:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n#ifdef __CIDELSA__\r\n\t\t\t\tvidmem--;\r\n#else\r\n\t\t\t\tvidmem = vidmem - 40;\r\n#endif\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase key_right:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n#ifdef __CIDELSA__\r\n\t\t\t\tvidmem = vidmem - 40;\r\n#else\r\n\t\t\t\tvidmem++;\r\n#endif\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase key_left:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n#ifdef __CIDELSA__\r\n\t\t\t\tvidmem = vidmem + 40;\r\n#else\r\n\t\t\t\tvidmem--;\r\n#endif\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase key_down:\r\n\t\t\t\tvidchar(vidmem,' ');\r\n#ifdef __CIDELSA__\r\n\t\t\t\tvidmem++;\r\n#else\r\n\t\t\t\tvidmem = vidmem + 40;\r\n#endif\r\n\t\t\t\tvidchar(vidmem,'X');\r\n\t\t\tbreak;\r\n\t\t\tcase key_exit:  // Q or space\r\n\t\t\t\tloop = 0;\r\n\t\t\tbreak;\t\r\n\t\t\tdefault:\r\n\t\t\tbreak;\t\t\t\r\n\t\t}\r\n\t\tif (loop == 0)  break;\r\n\t}\r\n\r\n\tenableinterrupt();\r\n    vidclr(vidmem,24*40);\r\n#ifndef __CIDELSA__\r\n\tgotoxy(0,0);\r\n    printf(\"HELLO WORLD!\");\r\n\tgotoxy(20,0);\r\n    printf(\"20,0\");\r\n\tgotoxy(0,20);\r\n    printf(\"0,20\");\r\n\tgotoxy(10,10);\r\n    printf(\"10,10\");\r\n\r\n\tprintf(\" %i\",rand());\r\n\tprintf(\" %i\",rand());\r\n\tprintf(\" %i\",rand());\r\n\tprintf(\" %i\",rand());\r\n\tprintf(\" %i\",rand());\r\n#endif\r\n}\r\n\r\n#include <nstdlib.c>\r\n"
  },
  {
    "path": "src/debug/lcc1802_test_NEW.c",
    "content": "/*\r\n    Hello World for the COMX-35\r\n    by Marcel van Tongoren & Bill Rowe\r\n*/\r\n\r\n#include <nstdlib.h>\r\n#include \"comx\\rca_vis_video.h\"\r\n#include \"comx\\rca_vis_sound.h\"\r\n#ifdef __PECOM__\r\n#include \"comx\\rca_joystick.h\"\r\n#endif\r\n#ifdef __TMC600__\r\n#include \"comx\\rca_joystick.h\"\r\n#endif\r\n#ifdef __CIDELSA__\r\n#include \"comx\\rca_joystick.h\"\r\n#include \"comx\\rca_character_set.h\"\r\n#endif\r\n#ifdef __COMX__\r\n#include \"comx\\rca_keyboard_encoder.h\"\r\n#endif\r\n#include \"comx\\rca_rand.h\"\r\n#include \"comx\\rca_system.h\"\r\n#ifndef __CIDELSA__\r\n#include \"comx\\rca_printf.h\"\r\n#endif\r\n\r\n#ifdef __COMX__\r\n#define key_up 0x82\r\n#define key_right 0x83\r\n#define key_left 0x84\r\n#define key_down 0x85\r\n#define key_exit 0x71\r\n#endif\r\n\r\n#ifdef __PECOM__\r\n#define key_up 0x5e\r\n#define key_right 0x5d\r\n#define key_left 0x5c\r\n#define key_down 0x5b\r\n#define key_exit 0x40\r\n#endif\r\n\r\n#ifdef __TMC600__\r\n#define key_up 0xb\r\n#define key_right 0x9\r\n#define key_left 0x8\r\n#define key_down 0xa\r\n#define key_exit 0x20\r\n#endif\r\n\r\n#ifdef __CIDELSA__\r\n#define key_up 0x40\t\t// UP is really right on the Cidelsa screen, key up = 0x10\r\n#define key_right 0x20\t// RIGHT is really down on the Cidelsa screen, key right = 0x40\r\n#define key_left 0x10\t// LEFT is really up on the Cidelsa screen, key left = 0x80\r\n#define key_down 0x80\t// DOWN is really left on the Cidelsa screen, key down = 0x20\r\n#define key_exit 0x1\r\n#endif\r\n\r\nvoid main(){\r\n\r\n#ifndef __CIDELSA__\r\n    static const unsigned char shapes[] =\r\n    {\r\n    //\t97, // First byte is the character to shape followed by 9 bytes for the shape\r\n        0x00, 0xcc, 0xde, 0xed, 0xff, 0xf3, 0xed, 0xe1, 0x00,\r\n    //\t98, // next character to shape\r\n        0x00, 0x8c, 0x9e, 0xad, 0xbf, 0xb3, 0xad, 0xa1, 0x00,\r\n    //\t99,\r\n        0x00, 0x00, 0xcc, 0xde, 0xff, 0xde, 0xcc, 0x00, 0x00,\r\n    };\r\n#endif\r\n\r\n\tunsigned int vidmem=0xf800;\r\n\r\n\tunsigned char key;\r\n\tunsigned int loop;\r\n\tunsigned int oldbkcolor;\r\n\r\n\tdisableinterrupt();\r\n    setvideobase(vidmem);\r\n\r\n#ifdef __CIDELSA__\r\n    #ifdef __DRACO__\r\n        vidmem=0xfc10;\r\n    #else\r\n        vidmem=0xfbc0;\r\n    #endif\r\n#endif\r\n\r\n\toldbkcolor = bgcolor(0);\r\n    #ifndef __TMC600__\r\n        textcolordefinition(3);\r\n        monochrome(0);\r\n    #else\r\n        textcolor(7);\r\n    #endif\r\n\r\n#ifdef __CIDELSA__\r\n\tcharacter_set(4);\r\n    #ifdef __DRACO__\r\n        vidclr(0xf800,27*40);\r\n    #else\r\n        vidclr(0xf800,25*40);\r\n    #endif\r\n\tvidstrcpy(vidmem, \"HELLO WORLD\");\r\n\tvidstrcpy(vidmem + 4, \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\");\r\n\tvidstrcpy(vidmem + 6, \"0 1 2 3 4 5 6 7 8 9\");\r\n\ttextcolor(1);\r\n\tvidstrcpy(vidmem + 8, \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\");\r\n\tvidstrcpy(vidmem + 10, \"0 1 2 3 4 5 6 7 8 9\");\r\n\ttextcolor(2);\r\n\tvidstrcpy(vidmem + 12, \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\");\r\n\tvidstrcpy(vidmem + 14, \"0 1 2 3 4 5 6 7 8 9\");\r\n\ttextcolor(3);\r\n\tvidstrcpy(vidmem + 16, \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\");\r\n\tvidstrcpy(vidmem + 18, \"0 1 2 3 4 5 6 7 8 9\");\r\n\tvidmem += 2;\r\n#else\r\n    #ifndef __TMC600__\r\n        shapecolor(0x20, 0x5f, 2);\r\n        shapechar(shapes, 0x61, 3);\r\n    #endif\r\n    vidclr(vidmem,24*40);\r\n    vidstrcpy(vidmem, \"HELLO \");\r\n    textcolor(1);\r\n    vidstrcpy(vidmem+6, \"WORLD abc\");\r\n    vidmem = 0xf828;\r\n#endif\r\n\r\n#ifdef __TMC600__\r\n    setcolor(0,3);\r\n#endif\r\nloop = 1;\r\n\r\nwhile (1){\r\n#ifdef __CIDELSA__\r\n        key = get_stick();\r\n        if (get_trigger() != 0)\r\n            key = 1;\r\n#else\r\n        key = getkey();\r\n#endif\r\n    switch (key){\r\n        case key_up:\r\n            vidstrcpy(vidmem,\"UP   \");\r\n            generatetone(80,5,7);\r\n        break;\r\n        case key_right:\r\n            vidstrcpy(vidmem,\"RIGHT\");\r\n            generatenoise(2,7);\r\n        break;\r\n        case key_left:\r\n            vidstrcpy(vidmem,\"LEFT \");\r\n            generatenoise(6,7);\r\n        break;\r\n        case key_down:\r\n            vidstrcpy(vidmem,\"DOWN \");\r\n            generatetone(80,7,7);\r\n        break;\r\n        case key_exit:  // Q or space\r\n            loop = 0;\r\n        break;\t\r\n        default:\r\n        break;\t\t\t\r\n    }\r\n    if (kbhit() == 0)\r\n    {\r\n        generatetone(0, 0, 0);\r\n        generatenoise(0,0);\r\n    }\r\n    if (loop == 0)  break;\r\n}\r\n\r\nwhile (kbhit() == 1)\r\n{\r\n}\r\n\r\nloop = 1;\r\nvidmem = 0xfa00;\r\nvidchar(vidmem,'X');\r\nwhile (1){\r\n#ifdef __CIDELSA__\r\n        key = get_stick();\r\n        if (get_trigger() != 0)\r\n            key = 1;\r\n#else\r\n        key = getkey();\r\n#endif\r\n    switch (key){\r\n        case key_up:\r\n            vidchar(vidmem,' ');\r\n            vidmem = vidmem - 40;\r\n            vidchar(vidmem,'X');\r\n        break;\r\n        case key_right:\r\n            vidchar(vidmem,' ');\r\n            vidmem++;\r\n            vidchar(vidmem,'X');\r\n        break;\r\n        case key_left:\r\n            vidchar(vidmem,' ');\r\n            vidmem--;\r\n            vidchar(vidmem,'X');\r\n        break;\r\n        case key_down:\r\n            vidchar(vidmem,' ');\r\n            vidmem = vidmem + 40;\r\n            vidchar(vidmem,'X');\r\n        break;\r\n        case key_exit:  // Q or space\r\n            loop = 0;\r\n        break;\t\r\n        default:\r\n        break;\t\t\t\r\n    }\r\n    if (loop == 0)  break;\r\n}\r\n\r\nenableinterrupt();\r\nvidclr(vidmem,24*40);\r\n#ifndef __CIDELSA__\r\n    gotoxy(0,0);\r\n    printf(\"HELLO WORLD!\");\r\n    gotoxy(20,0);\r\n    printf(\"20,0\");\r\n    gotoxy(0,20);\r\n    printf(\"0,20\");\r\n    gotoxy(10,10);\r\n    printf(\"10,10\");\r\n\r\n    printf(\" %i\",rand());\r\n    printf(\" %i\",rand());\r\n    printf(\" %i\",rand());\r\n    printf(\" %i\",rand());\r\n    printf(\" %i\",rand());\r\n#endif\r\n}\r\n\r\n#include <nstdlib.c>\r\n#include <comx\\rca_character_set.c>\r\n"
  },
  {
    "path": "src/debug/litterals.c",
    "content": "#include <stdio.h>\r\n\r\n#define XSize 32\r\n\r\nint main(void)\r\n{\r\n    \r\n    printf(\"debug: %d\\n\", XSize-XSize/4-XSize/5);\r\n\r\n    printf(\"debug 2: %f\\n\", XSize/5);\r\n\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/m5.c",
    "content": "#include <stdio.h>\r\n\r\nint main()\r\n{\r\n   printf(\"Hello CGL M5 World !\\n\");\r\n\r\n   while(1){};\r\n   return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/main_use_amiga_core.c",
    "content": "#include \"amiga_core.h\"\r\n// DEMO - INCBIN\r\nvolatile int frameCounter = 0;\r\n//INCBIN(colors, \"colors.bin\")\r\n\r\nstatic __attribute__((interrupt)) void interruptHandler() {\r\n\thw->intreq=(1<<INTB_VERTB); hw->intreq=(1<<INTB_VERTB); //reset vbl req. twice for a4000 bug.\r\n\t// DEMO - increment frameCounter\r\n\tframeCounter++;\r\n}\r\n\r\n\r\nint main() {\r\n\r\n\tInitializeSystem();\r\n\r\n\r\n\tchar *mem = (char*)alloc_chip(320*256*3/8+1024);\r\n\tshort* copperlist=(short*)mem;\r\n\tchar *video = mem+1024;\r\n\tcopper_Set(copperlist);\r\n\r\n\t//KPrintF(\"Hello debugger from Amiga!\\n\");\r\n\tWrite(Output(), \"Hello console!\\n\", 15);\r\n\tDelay(50);\r\n\r\n\twarpmode(1);\r\n\t// TODO: precalc stuff here\r\n\twarpmode(0);\r\n\r\n\tTakeSystem();\r\n\r\n\t// DEMO\r\n\tSetVBLInterrupt((APTR)interruptHandler);\r\n\t\r\n\tshort palette[8]={0x888,0xf00,0x0f0,0x00f,0xff0,0x0ff,0xf0f,0xfff};\r\n\tOpenDisplay(320,256,video,3,palette,8);\r\n\r\n\tint bplsz= 40*256;\r\n\r\n\tfor(int i=0;i<40*256;i++)\r\n\t\tvideo[i]= 0xff; //i+palette[i&7];\r\n\tfor(int i=0;i<40*256*2;i++)\r\n\t\tvideo[i+bplsz]= 0x0; //i+palette[i&7];\r\n\t\r\n\r\n\twhile(!MouseLeft()) {\r\n\t\tWaitVbl();\r\n\t\tvideo[bplsz+0]=0xff;\r\n\t\tvideo[40*100]=frameCounter;\r\n\t\tvideo[40*200]=0x0;\r\n\t\t// DEMO - set colors from INCBIN (contains 64 colors)\r\n\t\t//hw->color[0] = ((UWORD*)colors)[frameCounter & 63];\r\n\t}\r\n\r\n\tfree_chip(mem);\r\n\t// END\r\n\tFreeSystem();\r\n\r\n\tCloseLibrary((struct Library*)DOSBase);\r\n\tCloseLibrary((struct Library*)GfxBase);\r\n}\r\n"
  },
  {
    "path": "src/debug/mapfile_shoot_pet_func.txt",
    "content": "Modules list:\r\n-------------\r\ndisplay_macros.o:\r\n    CODE              Offs=000000  Size=00006B  Align=00001  Fill=0000\r\ninput_macros.o:\r\n    CODE              Offs=00006B  Size=000011  Align=00001  Fill=0000\r\nsleep_macros.o:\r\n    CODE              Offs=00007C  Size=000028  Align=00001  Fill=0000\r\n    BSS               Offs=000000  Size=000002  Align=00001  Fill=0000\r\nmain.o:\r\n    CODE              Offs=0000A4  Size=0035D0  Align=00001  Fill=0000\r\n    RODATA            Offs=000000  Size=000178  Align=00001  Fill=0000\r\n    BSS               Offs=000002  Size=0001D7  Align=00001  Fill=0000\r\npet_sounds.o:\r\n    CODE              Offs=003674  Size=00008C  Align=00001  Fill=0000\r\n    BSS               Offs=0001D9  Size=000004  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(_hextab.o):\r\n    RODATA            Offs=000178  Size=000010  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(_longminstr.o):\r\n    RODATA            Offs=000188  Size=00000C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(_printf.o):\r\n    CODE              Offs=003700  Size=0003A4  Align=00001  Fill=0000\r\n    BSS               Offs=0001DD  Size=00002B  Align=00001  Fill=0000\r\n    DATA              Offs=000000  Size=000003  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(add.o):\r\n    CODE              Offs=003AA4  Size=00001C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(addysp.o):\r\n    CODE              Offs=003AC0  Size=00000E  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(aslax1.o):\r\n    CODE              Offs=003ACE  Size=000008  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(aslax2.o):\r\n    CODE              Offs=003AD6  Size=00000B  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(aslax4.o):\r\n    CODE              Offs=003AE1  Size=000011  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(axlong.o):\r\n    CODE              Offs=003AF2  Size=00000D  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(call.o):\r\n    CODE              Offs=003AFF  Size=000007  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(callmain.o):\r\n    CODE              Offs=003B06  Size=000017  Align=00001  Fill=0000\r\n    DATA              Offs=000003  Size=000004  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(checkst.o):\r\n    CODE              Offs=003B1D  Size=00000A  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(clock.o):\r\n    CODE              Offs=003B27  Size=00000A  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(clrscr.o):\r\n    CODE              Offs=003B31  Size=00002A  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(condes.o):\r\n    CODE              Offs=003B5B  Size=00000C  Align=00001  Fill=0000\r\n    DATA              Offs=000007  Size=000025  Align=00001  Fill=0000\r\n    ONCE              Offs=000000  Size=00000C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(conio.o):\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(cprintf.o):\r\n    CODE              Offs=003B67  Size=00002A  Align=00001  Fill=0000\r\n    BSS               Offs=000208  Size=000001  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(cputc.o):\r\n    CODE              Offs=003B91  Size=00006F  Align=00001  Fill=0000\r\n    RODATA            Offs=000194  Size=000032  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(crt0.o):\r\n    BSS               Offs=000209  Size=000002  Align=00001  Fill=0000\r\n    STARTUP           Offs=000000  Size=000040  Align=00001  Fill=0000\r\n    INIT              Offs=000000  Size=00001A  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(ctype.o):\r\n    RODATA            Offs=0001C6  Size=00008B  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(ctypemask.o):\r\n    CODE              Offs=003C00  Size=00001E  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(decax1.o):\r\n    CODE              Offs=003C1E  Size=000007  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(decax3.o):\r\n    CODE              Offs=003C25  Size=000007  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(decsp4.o):\r\n    CODE              Offs=003C2C  Size=00000D  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(decsp6.o):\r\n    CODE              Offs=003C39  Size=00000D  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(div.o):\r\n    CODE              Offs=003C46  Size=000015  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(exehdr.o):\r\n    EXEHDR            Offs=000000  Size=00000C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(gotoxy.o):\r\n    CODE              Offs=003C5B  Size=00000D  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(icmp.o):\r\n    CODE              Offs=003C68  Size=00002E  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incax1.o):\r\n    CODE              Offs=003C96  Size=000007  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incax2.o):\r\n    CODE              Offs=003C9D  Size=000007  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incaxy.o):\r\n    CODE              Offs=003CA4  Size=00000B  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incsp1.o):\r\n    CODE              Offs=003CAF  Size=000007  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incsp2.o):\r\n    CODE              Offs=003CB6  Size=000016  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incsp3.o):\r\n    CODE              Offs=003CCC  Size=000005  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incsp4.o):\r\n    CODE              Offs=003CD1  Size=000005  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incsp5.o):\r\n    CODE              Offs=003CD6  Size=000005  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incsp6.o):\r\n    CODE              Offs=003CDB  Size=000005  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(incsp7.o):\r\n    CODE              Offs=003CE0  Size=000005  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(joy-kernel.o):\r\n    CODE              Offs=003CE5  Size=00004D  Align=00001  Fill=0000\r\n    RODATA            Offs=000251  Size=000004  Align=00001  Fill=0000\r\n    BSS               Offs=00020B  Size=000002  Align=00001  Fill=0000\r\n    DATA              Offs=00002C  Size=00000C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(joy_read.o):\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(joy_stat_stddrv.o):\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(kbsout.o):\r\n    CODE              Offs=003D32  Size=000006  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(krdtim.o):\r\n    CODE              Offs=003D38  Size=000009  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(ladd.o):\r\n    CODE              Offs=003D41  Size=000025  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(lcmp.o):\r\n    CODE              Offs=003D66  Size=00003B  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(ldaxi.o):\r\n    CODE              Offs=003DA1  Size=00000D  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(ldaxsp.o):\r\n    CODE              Offs=003DAE  Size=000009  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(ldeaxysp.o):\r\n    CODE              Offs=003DB7  Size=000013  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(lge.o):\r\n    CODE              Offs=003DCA  Size=000006  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(libref.o):\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(lmul.o):\r\n    CODE              Offs=003DD0  Size=00005C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(lneg.o):\r\n    CODE              Offs=003E2C  Size=00001E  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(loadaddr.o):\r\n    LOADADDR          Offs=000000  Size=000002  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(lpush.o):\r\n    CODE              Offs=003E4A  Size=000021  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(lsub.o):\r\n    CODE              Offs=003E6B  Size=000027  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(ltoa.o):\r\n    CODE              Offs=003E92  Size=000095  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(makebool.o):\r\n    CODE              Offs=003F27  Size=00002C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(mod.o):\r\n    CODE              Offs=003F53  Size=000011  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(mul.o):\r\n    CODE              Offs=003F64  Size=000045  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(mul8.o):\r\n    CODE              Offs=003FA9  Size=00003A  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(mulax5.o):\r\n    CODE              Offs=003FE3  Size=000014  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(mulax9.o):\r\n    CODE              Offs=003FF7  Size=000017  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(negabs.o):\r\n    CODE              Offs=00400E  Size=000012  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(popa.o):\r\n    CODE              Offs=004020  Size=00000C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(popptr1.o):\r\n    CODE              Offs=00402C  Size=00000E  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(push1.o):\r\n    CODE              Offs=00403A  Size=000005  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(pusha.o):\r\n    CODE              Offs=00403F  Size=000016  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(pushax.o):\r\n    CODE              Offs=004055  Size=00001A  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(pushwsp.o):\r\n    CODE              Offs=00406F  Size=00001C  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(rand.o):\r\n    CODE              Offs=00408B  Size=000034  Align=00001  Fill=0000\r\n    DATA              Offs=000038  Size=000004  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(regswap2.o):\r\n    CODE              Offs=0040BF  Size=000016  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(shelp.o):\r\n    CODE              Offs=0040D5  Size=000020  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(shrax1.o):\r\n    CODE              Offs=0040F5  Size=000008  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(shrax2.o):\r\n    CODE              Offs=0040FD  Size=00000B  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(shrax3.o):\r\n    CODE              Offs=004108  Size=00000E  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(shrax4.o):\r\n    CODE              Offs=004116  Size=000011  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(sleep.o):\r\n    CODE              Offs=004127  Size=000043  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(staspidx.o):\r\n    CODE              Offs=00416A  Size=000016  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(status.o):\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(strlen.o):\r\n    CODE              Offs=004180  Size=000016  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(strlower.o):\r\n    CODE              Offs=004196  Size=000027  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(sub.o):\r\n    CODE              Offs=0041BD  Size=000015  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(udiv.o):\r\n    CODE              Offs=0041D2  Size=00004F  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(vcprintf.o):\r\n    CODE              Offs=004221  Size=000078  Align=00001  Fill=0000\r\n    DATA              Offs=00003C  Size=000008  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(zerobss.o):\r\n    CODE              Offs=004299  Size=000023  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(zeropage.o):\r\n    ZEROPAGE          Offs=000000  Size=00001A  Align=00001  Fill=0000\r\nC:\\cc65-snapshot-win32\\lib/pet.lib(pet-stdjoy-joy.o):\r\n    CODE              Offs=0042BC  Size=00003F  Align=00001  Fill=0000\r\n    DATA              Offs=000044  Size=00000E  Align=00001  Fill=0000\r\n\r\n\r\nSegment list:\r\n-------------\r\nName                   Start     End    Size  Align\r\n----------------------------------------------------\r\nZEROPAGE              000055  00006E  00001A  00001\r\nLOADADDR              0003FF  000400  000002  00001\r\nEXEHDR                000401  00040C  00000C  00001\r\nSTARTUP               00040D  00044C  000040  00001\r\nONCE                  00044D  000458  00000C  00001\r\nCODE                  000459  004753  0042FB  00001\r\nRODATA                004754  0049A8  000255  00001\r\nDATA                  0049A9  0049FA  000052  00001\r\nINIT                  0049FB  004A14  00001A  00001\r\nBSS                   004A15  004C21  00020D  00001\r\n\r\n\r\nExports list by name:\r\n---------------------\r\nBSOUT                     00418B RLA    CURS_X                    0000C6 RLZ    \r\nCURS_Y                    0000D8 RLZ    RDTIM                     004191 RLA    \r\nST                        000096 RLZ    __BSS_RUN__               004A15 RLA    \r\n__BSS_SIZE__              00020D REA    __CONSTRUCTOR_COUNT__     000000 REA    \r\n__CONSTRUCTOR_TABLE__     000459 RLA    __DESTRUCTOR_COUNT__      000000 REA    \r\n__DESTRUCTOR_TABLE__      0049A9 RLA    __EXEHDR__                000001 REA    \r\n__LOADADDR__              000001 REA    __STACKSIZE__             000800 REA    \r\n__STARTUP__               000001 REA    __XL_CHAR                 0004A9 RLA    \r\n__XL_PRINT                00048D RLA    __XL_SLOW_DOWN            0004D5 RLA    \r\n__XL_WAIT_FOR_INPUT       0004C4 RLA    __XL_ZAP_SOUND            003B38 RLA    \r\n__conio_delete            000474 RLA    __conio_draw              000459 RLA    \r\n__ctype                   00491A RLA    __ctypeidx                004925 RLA    \r\n__hextab                  0048CC RLA    __longminstr              0048DC RLA    \r\n__printf                  003C4C RLA    _beep                     003ACD RLA    \r\n_clock                    003F80 RLA    _clrscr                   003F8A RLA    \r\n_cprintf                  003FC0 RLA    _cputc                    003FEF RLA    \r\n_exit                     000437 RLA    _gotoxy                   0040B7 RLA    \r\n_joy_install              00413E RLA    _joy_read                 0049DE REA    \r\n_joy_static_stddrv        0049ED RLA    _ltoa                     004303 RLA    \r\n_main                     0033F3 RLA    _noise                    003AF9 RLA    \r\n_pet_stdjoy_joy           0049ED RLA    _rand                     0044F0 RLA    \r\n_sleep                    004580 RLA    _strlen                   0045D9 RLA    \r\n_strlower                 0045EF RLA    _ultoa                    004344 RLA    \r\n_vcprintf                 0046C2 RLA    addysp                    003F1A RLA    \r\naddysp1                   003F19 RLA    aslax4                    003F3A RLA    \r\naxlong                    003F4B RLA    axulong                   003F51 RLA    \r\nboolge                    004397 RLA    boolugt                   0043A5 RLA    \r\nboolult                   00439F RLA    callax                    003F58 RLA    \r\ncallmain                  003F5F RLA    checkst                   003F76 RLA    \r\nctypemaskdirect           00405D RLA    decax1                    004077 RLA    \r\ndecax3                    00407E RLA    decsp4                    004085 RLA    \r\ndecsp6                    004092 RLA    donelib                   003FB4 RLA    \r\ngotoxy                    0040B4 RLA    incax1                    0040EF RLA    \r\nincax2                    0040F6 RLA    incaxy                    0040FF RLA    \r\nincsp1                    004108 RLA    incsp2                    004117 RLA    \r\nincsp3                    004125 RLA    incsp4                    00412A RLA    \r\nincsp5                    00412F RLA    incsp6                    004134 RLA    \r\nincsp7                    004139 RLA    initlib                   00044D RLA    \r\njoy_libref                000437 RLA    joy_read                  0049DE RLA    \r\nldax0sp                   004207 RLA    ldaxidx                   0041FC RLA    \r\nldaxysp                   004209 RLA    ldeax0sp                  004210 RLA    \r\nmul8x16                   004404 RLA    mul8x16a                  00440E RLA    \r\nmulax5                    00443C RLA    mulax9                    004450 RLA    \r\nnegax                     00446B RLA    negeax                    004285 RLA    \r\nplot                      00403A RLA    popa                      004479 RLA    \r\npopax                     00410F RLA    popptr1                   004485 RLA    \r\npopsargsudiv16            00452E RLA    ptr1                      00005D RLZ    \r\nptr2                      00005F RLZ    ptr3                      000061 RLZ    \r\nptr4                      000063 RLZ    push1                     004493 RLA    \r\npusha                     00449C RLA    pusha0                    0044B0 RLA    \r\npushax                    0044B2 RLA    pusheax                   0042AC RLA    \r\npushw0sp                  0044C8 RLA    pushwysp                  0044CA RLA    \r\nregbank                   000069 RLZ    regswap2                  004518 RLA    \r\nshlax1                    003F27 RLA    shlax2                    003F2F RLA    \r\nshlax4                    003F3A RLA    shrax1                    00454E RLA    \r\nshrax2                    004556 RLA    shrax3                    004561 RLA    \r\nshrax4                    00456F RLA    sp                        000055 RLZ    \r\nsreg                      000057 RLZ    staspidx                  0045C3 RLA    \r\ntmp1                      000065 RLZ    tmp2                      000066 RLZ    \r\ntmp3                      000067 RLZ    tmp4                      000068 RLZ    \r\ntosadda0                  003EFD RLA    tosaddax                  003EFF RLA    \r\ntosaddeax                 0041A0 RLA    tosdivax                  0040A1 RLA    \r\ntosgeeax                  004223 RLA    tosicmp                   0040C3 RLA    \r\ntoslcmp                   0041BF RLA    tosmoda0                  0043AC RLA    \r\ntosmulax                  0043BD RLA    tossuba0                  004616 RLA    \r\ntossubax                  004618 RLA    tossubeax                 0042CA RLA    \r\ntosudivax                 00462D RLA    tosumul0ax                004229 RLA    \r\ntosumula0                 004402 RLA    udiv16                    00463C RLA    \r\nzerobss                   0046F2 RLA    \r\n\r\n\r\nExports list by value:\r\n----------------------\r\n__CONSTRUCTOR_COUNT__     000000 REA    __DESTRUCTOR_COUNT__      000000 REA    \r\n__EXEHDR__                000001 REA    __STARTUP__               000001 REA    \r\n__LOADADDR__              000001 REA    sp                        000055 RLZ    \r\nsreg                      000057 RLZ    ptr1                      00005D RLZ    \r\nptr2                      00005F RLZ    ptr3                      000061 RLZ    \r\nptr4                      000063 RLZ    tmp1                      000065 RLZ    \r\ntmp2                      000066 RLZ    tmp3                      000067 RLZ    \r\ntmp4                      000068 RLZ    regbank                   000069 RLZ    \r\nST                        000096 RLZ    CURS_X                    0000C6 RLZ    \r\nCURS_Y                    0000D8 RLZ    __BSS_SIZE__              00020D REA    \r\n_exit                     000437 RLA    joy_libref                000437 RLA    \r\ninitlib                   00044D RLA    __conio_draw              000459 RLA    \r\n__CONSTRUCTOR_TABLE__     000459 RLA    __conio_delete            000474 RLA    \r\n__XL_PRINT                00048D RLA    __XL_CHAR                 0004A9 RLA    \r\n__XL_WAIT_FOR_INPUT       0004C4 RLA    __XL_SLOW_DOWN            0004D5 RLA    \r\n__STACKSIZE__             000800 REA    _main                     0033F3 RLA    \r\n_beep                     003ACD RLA    _noise                    003AF9 RLA    \r\n__XL_ZAP_SOUND            003B38 RLA    __printf                  003C4C RLA    \r\ntosadda0                  003EFD RLA    tosaddax                  003EFF RLA    \r\naddysp1                   003F19 RLA    addysp                    003F1A RLA    \r\nshlax1                    003F27 RLA    shlax2                    003F2F RLA    \r\nshlax4                    003F3A RLA    aslax4                    003F3A RLA    \r\naxlong                    003F4B RLA    axulong                   003F51 RLA    \r\ncallax                    003F58 RLA    callmain                  003F5F RLA    \r\ncheckst                   003F76 RLA    _clock                    003F80 RLA    \r\n_clrscr                   003F8A RLA    donelib                   003FB4 RLA    \r\n_cprintf                  003FC0 RLA    _cputc                    003FEF RLA    \r\nplot                      00403A RLA    ctypemaskdirect           00405D RLA    \r\ndecax1                    004077 RLA    decax3                    00407E RLA    \r\ndecsp4                    004085 RLA    decsp6                    004092 RLA    \r\ntosdivax                  0040A1 RLA    gotoxy                    0040B4 RLA    \r\n_gotoxy                   0040B7 RLA    tosicmp                   0040C3 RLA    \r\nincax1                    0040EF RLA    incax2                    0040F6 RLA    \r\nincaxy                    0040FF RLA    incsp1                    004108 RLA    \r\npopax                     00410F RLA    incsp2                    004117 RLA    \r\nincsp3                    004125 RLA    incsp4                    00412A RLA    \r\nincsp5                    00412F RLA    incsp6                    004134 RLA    \r\nincsp7                    004139 RLA    _joy_install              00413E RLA    \r\nBSOUT                     00418B RLA    RDTIM                     004191 RLA    \r\ntosaddeax                 0041A0 RLA    toslcmp                   0041BF RLA    \r\nldaxidx                   0041FC RLA    ldax0sp                   004207 RLA    \r\nldaxysp                   004209 RLA    ldeax0sp                  004210 RLA    \r\ntosgeeax                  004223 RLA    tosumul0ax                004229 RLA    \r\nnegeax                    004285 RLA    pusheax                   0042AC RLA    \r\ntossubeax                 0042CA RLA    _ltoa                     004303 RLA    \r\n_ultoa                    004344 RLA    boolge                    004397 RLA    \r\nboolult                   00439F RLA    boolugt                   0043A5 RLA    \r\ntosmoda0                  0043AC RLA    tosmulax                  0043BD RLA    \r\ntosumula0                 004402 RLA    mul8x16                   004404 RLA    \r\nmul8x16a                  00440E RLA    mulax5                    00443C RLA    \r\nmulax9                    004450 RLA    negax                     00446B RLA    \r\npopa                      004479 RLA    popptr1                   004485 RLA    \r\npush1                     004493 RLA    pusha                     00449C RLA    \r\npusha0                    0044B0 RLA    pushax                    0044B2 RLA    \r\npushw0sp                  0044C8 RLA    pushwysp                  0044CA RLA    \r\n_rand                     0044F0 RLA    regswap2                  004518 RLA    \r\npopsargsudiv16            00452E RLA    shrax1                    00454E RLA    \r\nshrax2                    004556 RLA    shrax3                    004561 RLA    \r\nshrax4                    00456F RLA    _sleep                    004580 RLA    \r\nstaspidx                  0045C3 RLA    _strlen                   0045D9 RLA    \r\n_strlower                 0045EF RLA    tossuba0                  004616 RLA    \r\ntossubax                  004618 RLA    tosudivax                 00462D RLA    \r\nudiv16                    00463C RLA    _vcprintf                 0046C2 RLA    \r\nzerobss                   0046F2 RLA    __hextab                  0048CC RLA    \r\n__longminstr              0048DC RLA    __ctype                   00491A RLA    \r\n__ctypeidx                004925 RLA    __DESTRUCTOR_TABLE__      0049A9 RLA    \r\n_joy_read                 0049DE REA    joy_read                  0049DE RLA    \r\n_pet_stdjoy_joy           0049ED RLA    _joy_static_stddrv        0049ED RLA    \r\n__BSS_RUN__               004A15 RLA    \r\n\r\n\r\nImports list:\r\n-------------\r\nBSOUT (kbsout.o):\r\n    crt0.o                    pet/crt0.s:10\r\nCURS_X (conio.o):\r\n    gotoxy.o                  cbm/gotoxy.s:9\r\nCURS_Y (conio.o):\r\n    gotoxy.o                  cbm/gotoxy.s:9\r\nRDTIM (krdtim.o):\r\n    clock.o                   cbm/cbm.inc:40\r\nST (status.o):\r\n    checkst.o                 pet/checkst.s:9\r\n    crt0.o                    pet/crt0.s:11\r\n__BSS_RUN__ ([linker generated]):\r\n    zerobss.o                 common/zerobss.s:8\r\n__BSS_SIZE__ ([linker generated]):\r\n    zerobss.o                 common/zerobss.s:8\r\n__CONSTRUCTOR_COUNT__ ([linker generated]):\r\n    condes.o                  runtime/condes.s:18\r\n__CONSTRUCTOR_TABLE__ ([linker generated]):\r\n    condes.o                  runtime/condes.s:18\r\n__DESTRUCTOR_COUNT__ ([linker generated]):\r\n    condes.o                  runtime/condes.s:19\r\n__DESTRUCTOR_TABLE__ ([linker generated]):\r\n    condes.o                  runtime/condes.s:19\r\n__EXEHDR__ (exehdr.o):\r\n    [linker generated]        C:\\cc65-snapshot-win32\\cfg/pet.cfg:3\r\n__LOADADDR__ (loadaddr.o):\r\n    [linker generated]        C:\\cc65-snapshot-win32\\cfg/pet.cfg:2\r\n__STACKSIZE__ ([linker generated]):\r\n    [linker generated]        C:\\cc65-snapshot-win32\\cfg/pet.cfg:10\r\n__STARTUP__ (crt0.o):\r\n    main.o                    games/shoot/main.s:13\r\n__XL_CHAR (display_macros.o):\r\n    main.o                    games/shoot/main.s:31\r\n__XL_PRINT (display_macros.o):\r\n    main.o                    games/shoot/main.s:30\r\n__XL_SLOW_DOWN (sleep_macros.o):\r\n    main.o                    games/shoot/main.s:24\r\n__XL_WAIT_FOR_INPUT (input_macros.o):\r\n    main.o                    games/shoot/main.s:19\r\n__XL_ZAP_SOUND (pet_sounds.o):\r\n    main.o                    games/shoot/main.s:22\r\n__conio_delete (display_macros.o):\r\n    main.o                    games/shoot/main.s:26\r\n__conio_draw (display_macros.o):\r\n    main.o                    games/shoot/main.s:25\r\n__ctype (ctype.o):\r\n    ctypemask.o               common/ctypemask.s:23\r\n__ctypeidx (ctype.o):\r\n    ctypemask.o               common/ctypemask.s:24\r\n__hextab (_hextab.o):\r\n    ltoa.o                    common/ltoa.s:10\r\n__longminstr (_longminstr.o):\r\n    ltoa.o                    common/ltoa.s:10\r\n__printf (_printf.o):\r\n    vcprintf.o                conio/vcprintf.s:9\r\n_beep (pet_sounds.o):\r\n    main.o                    games/shoot/main.s:20\r\n_clock (clock.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:13\r\n_clrscr (clrscr.o):\r\n    main.o                    games/shoot/main.s:27\r\n_cprintf (cprintf.o):\r\n    main.o                    games/shoot/main.s:29\r\n    display_macros.o          cross_lib/display/display_macros.s:17\r\n_cputc (cputc.o):\r\n    vcprintf.o                conio/vcprintf.s:9\r\n    display_macros.o          cross_lib/display/display_macros.s:16\r\n_exit (crt0.o):\r\n    libref.o                  pet/libref.s:6\r\n_gotoxy (gotoxy.o):\r\n    main.o                    games/shoot/main.s:28\r\n    display_macros.o          cross_lib/display/display_macros.s:15\r\n_joy_install (joy-kernel.o):\r\n    main.o                    games/shoot/main.s:17\r\n_joy_read (joy_read.o):\r\n    main.o                    games/shoot/main.s:18\r\n    input_macros.o            cross_lib/input/input_macros.s:13\r\n_joy_static_stddrv (joy_stat_stddrv.o):\r\n    main.o                    games/shoot/main.s:16\r\n_ltoa (ltoa.o):\r\n    _printf.o                 common/_printf.s:12\r\n_main (main.o):\r\n    callmain.o                runtime/callmain.s:11\r\n_noise (pet_sounds.o):\r\n    main.o                    games/shoot/main.s:21\r\n_pet_stdjoy_joy (pet-stdjoy-joy.o):\r\n    joy_stat_stddrv.o         pet/joy_stat_stddrv.s:10\r\n_rand (rand.o):\r\n    pet_sounds.o              cross_lib/sound/cc65/pet/pet_sounds.s:13\r\n    main.o                    games/shoot/main.s:14\r\n_sleep (sleep.o):\r\n    main.o                    games/shoot/main.s:23\r\n_strlen (strlen.o):\r\n    _printf.o                 common/_printf.s:13\r\n    main.o                    games/shoot/main.s:15\r\n_strlower (strlower.o):\r\n    _printf.o                 common/_printf.s:13\r\n_ultoa (ltoa.o):\r\n    _printf.o                 common/_printf.s:12\r\n_vcprintf (vcprintf.o):\r\n    cprintf.o                 conio/cprintf.s:8\r\naddysp (addysp.o):\r\n    incsp7.o                  runtime/incsp7.s:8\r\n    incsp6.o                  runtime/incsp6.s:8\r\n    incsp5.o                  runtime/incsp5.s:8\r\n    incsp4.o                  runtime/incsp4.s:8\r\n    incsp3.o                  runtime/incsp3.s:8\r\n    cprintf.o                 conio/cprintf.s:8\r\naddysp1 (addysp.o):\r\n    lsub.o                    runtime/lsub.s:11\r\n    lmul.o                    runtime/lmul.s:9\r\n    ladd.o                    runtime/ladd.s:8\r\n    sub.o                     runtime/sub.s:8\r\naslax4 (aslax4.o):\r\n    main.o                    games/shoot/main.s:8704\r\naxlong (axlong.o):\r\n    _printf.o                 common/_printf.s:11\r\naxulong (axlong.o):\r\n    _printf.o                 common/_printf.s:11\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\nboolge (makebool.o):\r\n    lge.o                     runtime/lge.s:8\r\nboolugt (makebool.o):\r\n    main.o                    games/shoot/main.s:8704\r\nboolult (makebool.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\ncallax (call.o):\r\n    main.o                    games/shoot/main.s:8704\r\ncallmain (callmain.o):\r\n    crt0.o                    pet/crt0.s:9\r\ncheckst (checkst.o):\r\n    kbsout.o                  pet/kbsout.s:10\r\nctypemaskdirect (ctypemask.o):\r\n    strlower.o                common/strlower.s:14\r\ndecax1 (decax1.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\ndecax3 (decax3.o):\r\n    main.o                    games/shoot/main.s:8704\r\ndecsp4 (decsp4.o):\r\n    lpush.o                   runtime/lpush.s:12\r\ndecsp6 (decsp6.o):\r\n    _printf.o                 common/_printf.s:11\r\ndonelib (condes.o):\r\n    crt0.o                    pet/crt0.s:7\r\ngotoxy (gotoxy.o):\r\n    cputc.o                   pet/cputc.s:10\r\nincax1 (incax1.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nincax2 (incax2.o):\r\n    main.o                    games/shoot/main.s:8704\r\nincaxy (incaxy.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nincsp1 (incsp1.o):\r\n    pet_sounds.o              cross_lib/sound/cc65/pet/pet_sounds.s:127\r\n    pet_sounds.o              cross_lib/sound/cc65/pet/pet_sounds.s:127\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nincsp2 (incsp2.o):\r\n    staspidx.o                runtime/staspidx.s:8\r\n    popptr1.o                 runtime/popptr1.s:8\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    sleep_macros.o            cross_lib/sleep/sleep_macros.s:48\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\nincsp3 (incsp3.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\nincsp4 (incsp4.o):\r\n    lcmp.o                    runtime/lcmp.s:9\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\nincsp5 (incsp5.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nincsp6 (incsp6.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\n    main.o                    games/shoot/main.s:8704\r\nincsp7 (incsp7.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\ninitlib (condes.o):\r\n    crt0.o                    pet/crt0.s:7\r\njoy_libref (libref.o):\r\n    joy-kernel.o              joystick/joy-kernel.s:7\r\njoy_read (joy-kernel.o):\r\n    joy_read.o                /home/runner/work/cc65/cc65/asminc/joy-kernel.inc:71\r\nldax0sp (ldaxsp.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nldaxidx (ldaxi.o):\r\n    main.o                    games/shoot/main.s:8704\r\nldaxysp (ldaxsp.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nldeax0sp (ldeaxysp.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\nmul8x16 (mul8.o):\r\n    mul.o                     runtime/mul.s:8\r\nmul8x16a (mul8.o):\r\n    mul.o                     runtime/mul.s:8\r\nmulax5 (mulax5.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nmulax9 (mulax9.o):\r\n    main.o                    games/shoot/main.s:8704\r\nnegax (negabs.o):\r\n    shelp.o                   runtime/shelp.s:11\r\n    mod.o                     runtime/mod.s:11\r\n    div.o                     runtime/div.s:11\r\nnegeax (lneg.o):\r\n    ltoa.o                    common/ltoa.s:9\r\nplot (cputc.o):\r\n    gotoxy.o                  cbm/gotoxy.s:8\r\n    clrscr.o                  pet/clrscr.s:8\r\npopa (popa.o):\r\n    gotoxy.o                  cbm/gotoxy.s:8\r\npopax (incsp2.o):\r\n    ltoa.o                    common/ltoa.s:9\r\n    _printf.o                 common/_printf.s:11\r\n    vcprintf.o                conio/vcprintf.s:8\r\n    shelp.o                   runtime/shelp.s:11\r\npopptr1 (popptr1.o):\r\n    ltoa.o                    common/ltoa.s:9\r\n    vcprintf.o                conio/vcprintf.s:8\r\n    udiv.o                    runtime/udiv.s:9\r\n    mul8.o                    runtime/mul8.s:9\r\n    mul.o                     runtime/mul.s:9\r\npopsargsudiv16 (shelp.o):\r\n    mod.o                     runtime/mod.s:11\r\n    div.o                     runtime/div.s:11\r\nptr1 (zeropage.o):\r\n    lcmp.o                    runtime/lcmp.s:10\r\n    strlower.o                common/strlower.s:13\r\n    ltoa.o                    common/ltoa.s:11\r\n    lmul.o                    runtime/lmul.s:10\r\n    _printf.o                 /home/runner/work/cc65/cc65/asminc/zeropage.inc:12\r\n    zerobss.o                 common/zerobss.s:9\r\n    vcprintf.o                conio/vcprintf.s:10\r\n    udiv.o                    runtime/udiv.s:10\r\n    staspidx.o                runtime/staspidx.s:9\r\n    shelp.o                   runtime/shelp.s:12\r\n    popptr1.o                 runtime/popptr1.s:9\r\n    mulax9.o                  runtime/mulax9.s:10\r\n    mulax5.o                  runtime/mulax5.s:9\r\n    mul8.o                    runtime/mul8.s:10\r\n    mul.o                     runtime/mul.s:10\r\n    ldaxi.o                   runtime/ldaxi.s:8\r\n    joy-kernel.o              joystick/joy-kernel.s:8\r\n    div.o                     runtime/div.s:12\r\n    cprintf.o                 conio/cprintf.s:9\r\n    clrscr.o                  pet/clrscr.s:9\r\n    call.o                    runtime/call.s:8\r\n    main.o                    games/shoot/main.s:11\r\nptr2 (zeropage.o):\r\n    strlower.o                common/strlower.s:13\r\n    ltoa.o                    common/ltoa.s:11\r\n    _printf.o                 /home/runner/work/cc65/cc65/asminc/zeropage.inc:12\r\n    vcprintf.o                conio/vcprintf.s:10\r\n    strlen.o                  common/strlen.s:12\r\nptr3 (zeropage.o):\r\n    ltoa.o                    common/ltoa.s:11\r\n    lmul.o                    runtime/lmul.s:10\r\n    vcprintf.o                conio/vcprintf.s:10\r\nptr4 (zeropage.o):\r\n    lmul.o                    runtime/lmul.s:10\r\n    udiv.o                    runtime/udiv.s:10\r\n    shelp.o                   runtime/shelp.s:12\r\n    mul8.o                    runtime/mul8.s:10\r\n    mul.o                     runtime/mul.s:10\r\npush1 (push1.o):\r\n    _printf.o                 common/_printf.s:11\r\npusha (pusha.o):\r\n    pet_sounds.o              cross_lib/sound/cc65/pet/pet_sounds.s:127\r\n    pet_sounds.o              cross_lib/sound/cc65/pet/pet_sounds.s:127\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\npusha0 (pushax.o):\r\n    push1.o                   runtime/push1.s:8\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\npushax (pushax.o):\r\n    callmain.o                runtime/callmain.s:11\r\n    _printf.o                 common/_printf.s:11\r\n    vcprintf.o                conio/vcprintf.s:8\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\n    cprintf.o                 conio/cprintf.s:8\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    sleep_macros.o            cross_lib/sleep/sleep_macros.s:48\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\npusheax (lpush.o):\r\n    _printf.o                 common/_printf.s:11\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\npushw0sp (pushwsp.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    display_macros.o          cross_lib/display/display_macros.s:115\r\npushwysp (pushwsp.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nregbank (zeropage.o):\r\n    _printf.o                 /home/runner/work/cc65/cc65/asminc/zeropage.inc:14\r\n    regswap2.o                runtime/regswap2.s:8\r\n    main.o                    games/shoot/main.s:10\r\nregswap2 (regswap2.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nshlax1 (aslax1.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nshlax2 (aslax2.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nshlax4 (aslax4.o):\r\n    main.o                    games/shoot/main.s:8704\r\nshrax1 (shrax1.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nshrax2 (shrax2.o):\r\n    main.o                    games/shoot/main.s:8704\r\nshrax3 (shrax3.o):\r\n    main.o                    games/shoot/main.s:8704\r\nshrax4 (shrax4.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\nsp (zeropage.o):\r\n    lcmp.o                    runtime/lcmp.s:10\r\n    decsp4.o                  runtime/decsp4.s:8\r\n    lsub.o                    runtime/lsub.s:12\r\n    lpush.o                   runtime/lpush.s:13\r\n    lmul.o                    runtime/lmul.s:10\r\n    ldeaxysp.o                runtime/ldeaxysp.s:12\r\n    ladd.o                    runtime/ladd.s:9\r\n    decsp6.o                  runtime/decsp6.s:8\r\n    addysp.o                  runtime/addysp.s:8\r\n    _printf.o                 /home/runner/work/cc65/cc65/asminc/zeropage.inc:11\r\n    vcprintf.o                conio/vcprintf.s:10\r\n    sub.o                     runtime/sub.s:9\r\n    staspidx.o                runtime/staspidx.s:9\r\n    regswap2.o                runtime/regswap2.s:8\r\n    pushwsp.o                 runtime/pushwsp.s:8\r\n    pushax.o                  runtime/pushax.s:8\r\n    pusha.o                   runtime/pusha.s:8\r\n    popptr1.o                 runtime/popptr1.s:9\r\n    popa.o                    runtime/popa.s:8\r\n    ldaxsp.o                  runtime/ldaxsp.s:8\r\n    incsp2.o                  runtime/incsp2.s:8\r\n    incsp1.o                  runtime/incsp1.s:8\r\n    icmp.o                    runtime/icmp.s:9\r\n    crt0.o                    /home/runner/work/cc65/cc65/asminc/zeropage.inc:11\r\n    cprintf.o                 conio/cprintf.s:9\r\n    add.o                     runtime/add.s:12\r\n    pet_sounds.o              cross_lib/sound/cc65/pet/pet_sounds.s:10\r\n    main.o                    games/shoot/main.s:10\r\n    sleep_macros.o            cross_lib/sleep/sleep_macros.s:10\r\n    display_macros.o          cross_lib/display/display_macros.s:10\r\nsreg (zeropage.o):\r\n    lneg.o                    runtime/lneg.s:11\r\n    lcmp.o                    runtime/lcmp.s:10\r\n    ltoa.o                    common/ltoa.s:11\r\n    lsub.o                    runtime/lsub.s:12\r\n    lpush.o                   runtime/lpush.s:13\r\n    lmul.o                    runtime/lmul.s:10\r\n    ldeaxysp.o                runtime/ldeaxysp.s:12\r\n    ladd.o                    runtime/ladd.s:9\r\n    clock.o                   cbm/clock.s:9\r\n    axlong.o                  runtime/axlong.s:9\r\n    _printf.o                 /home/runner/work/cc65/cc65/asminc/zeropage.inc:11\r\n    udiv.o                    runtime/udiv.s:10\r\n    sleep.o                   ../libwrk/pet/sleep.s:10\r\n    mod.o                     runtime/mod.s:12\r\n    icmp.o                    runtime/icmp.s:9\r\nstaspidx (staspidx.o):\r\n    main.o                    games/shoot/main.s:8704\r\ntmp1 (zeropage.o):\r\n    ltoa.o                    common/ltoa.s:11\r\n    ladd.o                    runtime/ladd.s:9\r\n    _printf.o                 /home/runner/work/cc65/cc65/asminc/zeropage.inc:13\r\n    vcprintf.o                conio/vcprintf.s:10\r\n    staspidx.o                runtime/staspidx.s:9\r\n    shrax4.o                  runtime/shrax4.s:8\r\n    shrax3.o                  runtime/shrax3.s:8\r\n    shrax2.o                  runtime/shrax2.s:8\r\n    shrax1.o                  runtime/shrax1.s:8\r\n    shelp.o                   runtime/shelp.s:12\r\n    mul.o                     runtime/mul.s:10\r\n    mod.o                     runtime/mod.s:12\r\n    incaxy.o                  runtime/incaxy.s:8\r\n    div.o                     runtime/div.s:12\r\n    aslax4.o                  runtime/aslax4.s:8\r\n    aslax2.o                  runtime/aslax2.s:8\r\n    aslax1.o                  runtime/aslax1.s:8\r\n    add.o                     runtime/add.s:12\r\n    main.o                    games/shoot/main.s:11\r\ntmp2 (zeropage.o):\r\n    lmul.o                    runtime/lmul.s:10\r\n    shelp.o                   runtime/shelp.s:12\r\n    div.o                     runtime/div.s:12\r\ntmp3 (zeropage.o):\r\n    lmul.o                    runtime/lmul.s:10\r\ntmp4 (zeropage.o):\r\n    lmul.o                    runtime/lmul.s:10\r\ntosadda0 (add.o):\r\n    main.o                    games/shoot/main.s:8704\r\ntosaddax (add.o):\r\n    main.o                    games/shoot/main.s:8704\r\ntosaddeax (ladd.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\ntosdivax (div.o):\r\n    main.o                    games/shoot/main.s:8704\r\ntosgeeax (lge.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\ntosicmp (icmp.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\ntoslcmp (lcmp.o):\r\n    lge.o                     runtime/lge.s:8\r\ntosmoda0 (mod.o):\r\n    main.o                    games/shoot/main.s:8704\r\ntosmulax (mul.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\ntossuba0 (sub.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\ntossubax (sub.o):\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\n    main.o                    games/shoot/main.s:8704\r\ntossubeax (lsub.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\ntosudivax (udiv.o):\r\n    main.o                    games/shoot/main.s:8704\r\ntosumul0ax (lmul.o):\r\n    sleep.o                   ../libwrk/pet/sleep.s:54\r\ntosumula0 (mul8.o):\r\n    main.o                    games/shoot/main.s:8704\r\nudiv16 (udiv.o):\r\n    shelp.o                   runtime/shelp.s:11\r\nzerobss (zerobss.o):\r\n    crt0.o                    pet/crt0.s:8\r\n\r\n"
  },
  {
    "path": "src/debug/mc10_getk.s",
    "content": ".export _getk\r\n.setcpu 6803\r\n\r\n.code\r\n\r\n_getk:\r\n    pshx\r\n    ldx $FFDC\r\n    jsr ,x\r\n    pulx\r\n    tab\r\n    clra\r\n    rts\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/debug/mc10_test1.c",
    "content": "\r\n#if defined(__MC10__)\r\n    #define SCREEN 0x4000\r\n    #define YSize 16\r\n    #define XSize 32\r\n#elif defined(__C64__)\r\n    #define SCREEN 0x0400\r\n    #define YSize 25\r\n    #define XSize 40\r\n#elif defined(__VIC20__)\r\n    #define SCREEN 7680\r\n    #define YSize 23\r\n    #define XSize 22\r\n#endif\r\n\r\n#define POKE(addr,val) (*(unsigned char*) (addr) = (val))\r\n#include <stdint.h>\r\n\r\nint main(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    for(i=0;i<YSize;++i)\r\n    {\r\n        for(j=0;j<XSize;++j)\r\n        {\r\n            POKE((uint16_t) SCREEN+((uint16_t)i)*XSize+j,67);\r\n        }\r\n    }\r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/mc10_test2.c",
    "content": "\r\n#if defined(__MC10__)\r\n    #define SCREEN 0x4000\r\n    #define YSize 16\r\n    #define XSize 32\r\n#elif defined(__C64__)\r\n    #define SCREEN 0x0400\r\n    #define YSize 25\r\n    #define XSize 40\r\n#elif defined(__VIC20__)\r\n    #define SCREEN 7680\r\n    #define YSize 23\r\n    #define XSize 22\r\n#endif\r\n\r\n#define POKE(addr,val) (*(unsigned char*) (addr) = (val))\r\n#include <stdint.h>\r\n\r\nstatic const char foo[5] = {'H','E','L','L','O'};\r\n\r\nint main(void)\r\n{\r\n    uint8_t i;\r\n\r\n    for(i=0;i<5;++i)\r\n    {\r\n        POKE((uint16_t) SCREEN+i,foo[i]);\r\n    }\r\n\r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/mc10_test3.c",
    "content": "\r\n#if defined(__MC10__)\r\n    #define SCREEN 0x4000\r\n    #define YSize 16\r\n    #define XSize 32\r\n#elif defined(__C64__)\r\n    #define SCREEN 0x0400\r\n    #define YSize 25\r\n    #define XSize 40\r\n#elif defined(__VIC20__)\r\n    #define SCREEN 7680\r\n    #define YSize 23\r\n    #define XSize 22\r\n#endif\r\n\r\n#define POKE(addr,val) (*(unsigned char*) (addr) = (val))\r\n#include <stdint.h>\r\n\r\n#define FOO 10\r\n#define BAR 1\r\nuint8_t bar;\r\n\r\nint main(void)\r\n{\r\n\r\n    bar = BAR;\r\n    POKE(SCREEN,65);\r\n    while(1 && (bar < FOO + 1))\r\n    {\r\n        POKE(SCREEN+1,66);\r\n    }\r\n    POKE(SCREEN+2,67);\r\n\r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/mc10_test4.c",
    "content": "\r\n#if defined(__MC10__)\r\n    #define SCREEN 0x4000\r\n    #define YSize 16\r\n    #define XSize 32\r\n#elif defined(__C64__)\r\n    #define SCREEN 0x0400\r\n    #define YSize 25\r\n    #define XSize 40\r\n#elif defined(__VIC20__)\r\n    #define SCREEN 7680\r\n    #define YSize 23\r\n    #define XSize 22\r\n#endif\r\n\r\n#define POKE(addr,val) (*(unsigned char*) (addr) = (val))\r\n#define PEEK(addr) (*(unsigned char*) (addr))\r\n#include <stdint.h>\r\n\r\n/*\r\n\r\n__getc:\r\n\tpshx\r\ngetc_wait:\r\n\tldx $FFDC\t\t\t; poll keyboard\r\n\tjsr ,x\r\n\tbeq getc_wait\r\n\tpulx\r\n\ttab\r\n\trts\r\n\r\n*/\r\n\r\n\r\n\r\n\r\n// uint8_t getk(void)\r\n// {\r\n    // __asm__(\"pshx\");\r\n    // __asm__(\"ldx $FFDC\");\r\n    // __asm__(\"jsr ,x\");\r\n    // __asm__(\"pulx\");\r\n    // __asm__(\"tab\");\r\n// }\r\n\r\n#include <stdio.h>\r\n\r\nextern int getk(void);\r\n\r\nint main(void)\r\n{\r\n\r\n    uint8_t c = 0;\r\n    uint8_t ch;\r\n    \r\n    while(1)\r\n    {\r\n        POKE(SCREEN,PEEK(49151U));\r\n        POKE(SCREEN+1,PEEK(17023U));\r\n        POKE(SCREEN+2,PEEK(2));\r\n        ch = (uint8_t) getk();\r\n        POKE(SCREEN+4,(uint8_t) ch);\r\n        if(ch)\r\n        {\r\n            POKE(SCREEN+32+c++,ch);\r\n        }\r\n    }\r\n\r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/msx_test.c",
    "content": "#include <msx/gfx.h>\r\nint main()\r\n{\r\n    uint8_t i;\r\n    set_color(15, 1, 1);\r\n    set_mode(mode_0);\r\n\r\n    for(i=0;i<254;++i)\r\n    {\r\n        vpoke(0x0000+i,i);\r\n    }    \r\n    while(1);\r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/msx_test2.c",
    "content": "\r\n#include <graphics.h>\r\n\r\n\r\n#include <sys/ioctl.h>\r\n\r\n#include <conio.h>\r\n\r\nint main(void)\r\n{\r\n\r\n\r\n    int mode = mode_2;\r\n    console_ioctl(IOCTL_GENCON_SET_MODE, &mode);\r\n        \r\n    \r\n    gotoxy(2,2);\r\n    \r\n    printf(\"hello world!\\n\");\r\n    \r\n    \r\n    textcolor(RED);\r\n    gotoxy(0,0);\r\n    printf(\"a\");\r\n    \r\n    gotoxy(31,0);\r\n    printf(\"b\");\r\n    \r\n    textcolor(BLUE);\r\n    gotoxy(0,23);\r\n    printf(\"c\");\r\n    \r\n    gotoxy(31,23);\r\n    printf(\"d\");\r\n    \r\n    while(1){};\r\n    \r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/ncurses_test.c",
    "content": "/*\r\nIf compiled with gcc ./debug/ncurses_test.c -lncurses you get the correct behavior, i.e., it detects i and k key presses with auto-repeat. For example this works with gcc targeting the native machine or cygwin.\r\n\r\nIf the code above is cross-compiled with m68k-atari-mint-gcc ./debug/ncurses_test.c -lncurses -D__ATARI_ST__ then no key press is detected (tested on an emulated Atari ST with Hatari).\r\n*/\r\n\r\n\r\n#include <ncurses.h>\r\n\r\n#define _NCURSES_BACKGROUND_COLOR COLOR_BLACK\r\n\r\n#define INPUT_LOOPS 10\r\n\r\n\r\nint main(void)\r\n{\r\n    volatile unsigned char ch;\r\n    \r\n    #if defined(__ATARI_ST__)\r\n        putenv(\"TERM=st52\");\r\n    #endif\r\n    initscr();   \r\n    noecho();\r\n    curs_set(0);\r\n    start_color();\r\n    cbreak();\r\n    intrflush(stdscr, TRUE);\r\n    init_pair(1, COLOR_YELLOW, _NCURSES_BACKGROUND_COLOR);\r\n    init_pair(2, COLOR_CYAN, _NCURSES_BACKGROUND_COLOR);\r\n    init_pair(3, COLOR_RED, _NCURSES_BACKGROUND_COLOR);\r\n    init_pair(4, COLOR_GREEN, _NCURSES_BACKGROUND_COLOR);\r\n    init_pair(5, COLOR_BLUE, _NCURSES_BACKGROUND_COLOR);\r\n    init_pair(6, COLOR_WHITE, _NCURSES_BACKGROUND_COLOR);\r\n    init_pair(7, COLOR_MAGENTA, _NCURSES_BACKGROUND_COLOR);\r\n    init_pair(8, COLOR_BLACK, _NCURSES_BACKGROUND_COLOR);\r\n\r\n    wbkgd(stdscr, COLOR_PAIR(1));\r\n    \r\n    \r\n    nodelay(stdscr,TRUE);    \r\n    refresh();\r\n    \r\n    move(0,0);\r\n    while(1)\r\n    {\r\n        ch = getch();\r\n        \r\n        if(ch=='i' || ch=='k')\r\n        {\r\n            printw(\"%c\", ch);\r\n        }\r\n        refresh();\r\n    }\r\n    return 0;\r\n}\r\n```\r\n"
  },
  {
    "path": "src/debug/nes_bgcolor.c",
    "content": "#include<conio.h>\r\n\r\nint main()\r\n{\r\n    bgcolor(COLOR_WHITE);\r\n    clrscr();\r\n\r\n    gotoxy(2,2);\r\n    cprintf(\"hello world\\n\");\r\n    while(1){};\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/psg_test.c",
    "content": "#include <stdio.h>\r\n#include <conio.h>\r\n#include <psg.h>\r\n#define A_PERIOD_LOW 0\r\n#define A_PERIOD_HI 1\r\n#define B_PERIOD_LOW 2\r\n#define B_PERIOD_HI 3\r\n#define C_PERIOD_LOW 4\r\n#define C_PERIOD_HI 5\r\n#define NOISE 6\r\n#define CONTROL 7\r\n#define A_VOLUME 8\r\n#define B_VOLUME 9\r\n#define C_VOLUME 10\r\n#define ENV_PERIOD_LOW 11\r\n#define ENV_PERIOD_HI 12\r\n#define ENV_WAVE 13\r\n\r\n\r\nvoid _ping_sound(uint8_t freq)\r\n{ \r\n\tuint8_t i;\r\n\t\r\n\tset_psg(A_VOLUME,15);\r\n\tset_psg(A_PERIOD_LOW,255);\r\n\t\r\n\tset_psg(A_PERIOD_HI, 15 - (freq>>4));\t\t\r\n\r\n\tset_psg(CONTROL, 0xFF - 0x01);\r\n\t\r\n\tfor(i=0;i<220;++i)\r\n\t{\r\n\t}\r\n\t\t\r\n\tset_psg(A_VOLUME,0);\r\n}\t\t\t\r\n\r\n\r\nvoid _explosion_sound(uint8_t freq)\r\n{ \r\n\tuint8_t i;\r\n\tuint8_t j;\r\n\t\r\n\tset_psg(NOISE,15);\r\n\tset_psg(A_VOLUME,15);\r\n\t\r\n\tset_psg(A_PERIOD_LOW,0);\r\n\tset_psg(A_PERIOD_HI, 15 - (freq>>4));\r\n\t\r\n\tset_psg(CONTROL, 0xFF - 0x08);\r\n\t\r\n\tfor(i=0;i<13;i++)\r\n\t{\r\n\t\tset_psg(A_VOLUME,15-i);\t\t\r\n\t\tfor(j=0;j<253;++j)\r\n\t\t{\r\n\t\t}\t\t\r\n\t}\r\n\r\n\tset_psg(A_VOLUME,0);\t\t\r\n}\r\n\r\n\r\n\r\n\r\nvoid ZAP_SOUND(void) {\r\n\tuint8_t i;\r\n\tuint8_t j;\r\n\tset_psg(A_VOLUME,15);\r\n\tset_psg(A_PERIOD_LOW,255);\r\n\tset_psg(A_PERIOD_HI, 15);\r\n\tset_psg(CONTROL, 0xFF  - 0x01);\r\n\tfor(i=0;i<16;i++) {\r\n\t\tset_psg(A_PERIOD_HI,15-i);\t\t\r\n\t\tfor(j=0;j<150;++j){}\r\n\t}\r\n\tset_psg(A_VOLUME,0);\t\t\r\n}\r\n\r\n#define PING_SOUND() _ping_sound(0xF0);\t\r\n#define TOCK_SOUND() _ping_sound(0x02);\r\n#define TICK_SOUND() _ping_sound(0x60);\r\n\r\n#define SHOOT_SOUND() _explosion_sound(0xF0);\r\n#define EXPLOSION_SOUND() _explosion_sound(0x80);\r\n\r\n\r\nint main()\r\n{\r\n    while(1)\r\n    {\r\n        clrscr();\r\n        printf(\"press a key\\n\");\r\n        getchar();\r\n        \r\n        clrscr();\r\n        printf(\"ping sound\");\r\n        // PING_SOUND();\r\n        \r\n        getchar();\r\n        clrscr();\r\n        printf(\"explosion\");\r\n        // EXPLOSION_SOUND();\r\n        getchar();\r\n        \r\n        clrscr();\r\n        printf(\"zzzapp!!\\n\");\r\n        // ZAP_SOUND();\r\n        getch();\r\n    \r\n}   ;\r\n\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/psg_test2.c",
    "content": "#include <psg.h>\r\n\r\nint main(void)\r\n{\r\n    unsigned char i;\r\n    unsigned char j;\r\n    \r\n    psg_init();                       \r\n    psg_volume(0, 15);        \r\n    // psg_channels(chan0, chanNone); // set first channel to tone generation, reset noise channels\r\n          \r\n    for(i=0;i<16;i++)\r\n    {\r\n        psg_tone(0, 500-(i*16));\r\n        for(j=0;j<150;++j) {}\r\n    }         \r\n    psg_volume(0, 0);\r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/psg_test3.c",
    "content": "#include <psg.h>\r\n#include <stdio.h>\r\n\r\nvoid _ping_sound(uint8_t freq)\r\n{\r\n\tuint16_t i;\r\n    \r\n\tpsg_volume(0,15);\r\n    \r\n    psg_tone(0,freq);\r\n\r\n    for(i=0;i<120;i++)\r\n    {\r\n    }\r\n\r\n    psg_volume(0,0);\r\n}\r\n\r\nvoid _XL_ZAP_SOUND(void) \r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n\r\n\tpsg_volume(0,15);\r\n    \r\n    for(i=0;i<40;i++)\r\n    {\r\n        for(j=0;j<i;++j)\r\n        {\r\n        }\r\n        psg_tone(0,i*4);\r\n        \r\n    }   \r\n    psg_volume(0,0);\r\n}\r\n\r\n\r\nvoid _explosion_sound(uint8_t freq)\r\n{ \r\n    uint8_t i;\r\n    uint8_t j;\r\n\r\n\tpsg_volume(0,15);\r\n    \r\n    for(i=0;i<freq;i++)\r\n    {\r\n        psg_tone(0,freq);\r\n        for(j=0;j<i;++j)\r\n        {\r\n        }\r\n        psg_tone(0,i&3);\r\n        \r\n    }   \r\n    psg_volume(0,0);\r\n}\r\n\r\nint main(void)\r\n{\r\n    psg_init();\r\n    while(1)\r\n    {\r\n        _ping_sound(120);\r\n        getchar();\r\n        _XL_ZAP_SOUND();\r\n        getchar();\r\n        _explosion_sound(80);\r\n        getchar();\r\n    }\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/rand.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n\r\nint main(void)\r\n{\r\n\r\n    while(1)\r\n    {\r\n        printf(\"%d\\n\", 1+(rand()&3));\r\n        \r\n        getchar();\r\n    }\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/struct.c",
    "content": "#include <stdio.h>\n \nstruct Test {\n \n\tint a;\n\tint b;\n};\n \nconst struct Test globale = { 21, 42 };\n \nconst struct Test const * funzione() {\n\treturn &globale;\n}\n \nvoid main(void) {\n\tconst struct Test const* result = funzione();\n\tprintf( \"risultato = %d, %d\", result->a, result->b );\n}\n\n"
  },
  {
    "path": "src/debug/testBitwiseAnd.c",
    "content": "#include <conio.h>\r\n\r\nint main()\r\n{\r\n   unsigned char i;\r\n   unsigned char j;\r\n   \r\n   for(i=0;i<=10;++i)\r\n   {\r\n\tgotoxy(0,i);\r\n\t\r\n\tcprintf(\"%d %d\", i, i&3);\r\n\t\r\n\tj=i;\r\n\tj&=3;\r\n\tgotoxy(8,i);\r\n\tcprintf(\"%d\", j);\r\n   }\r\n\r\n   while(1){};\r\n\r\n   return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/test_gb.c",
    "content": "#include <conio.h>\n\nint main(void)\n{\n\tunsigned char i;\n\n\tfor(i=0;i<20;++i) \n\t{\n\t\tgotoxy(19,i);\n\t}\n        while(1){};\n\treturn EXIT_SUCCESS;\n}\n\n\n"
  },
  {
    "path": "src/debug/test_getk.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n\nint main() {\n        int c;\n\n        printf(\"Going\\n\");\n        while ( 1 ) {\n                c = getk();\n                printf(\".\");\n                if ( c != 0 ) printf(\"Got key %d \", c);\n                msleep(100);\n        }\n\n}\n\n\n"
  },
  {
    "path": "src/debug/test_joy.c",
    "content": "// CPC: zcc +cpc test_joy.c -subtype=dsk -lndos -otestjoy.dsk -create-app\r\n\r\n#include <stdio.h>\r\n#include <games.h>\r\n\r\nint main(void)\r\n{\r\n\tint stick = 1;\r\n\tint input;\r\n\t\r\n\twhile(1)\r\n\t{\r\n\t\tinput = joystick(stick);\r\n\t\tif(input && input==MOVE_FIRE)\r\n\t\t{\r\n\t\t\tprintf(\"FIRE\\n\");\r\n\t\t}\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/test_joy2.c",
    "content": "// CPC: zcc +cpc  test_joy2.c -subtype=dsk -lndos -otestjoy2.dsk -create-app\r\n\r\n\r\n#include <stdio.h>\r\n#include <time.h>\r\n#include <unistd.h>\r\n#include <stdlib.h> \r\n#include <sound.h>\r\n\r\n#include <games.h>\r\n#define YSize 20\r\n\r\n#include <psg.h>\r\n#include <stdint.h>\r\n#define A_PERIOD_LOW 0\r\n#define A_PERIOD_HI 1\r\n#define B_PERIOD_LOW 2\r\n#define B_PERIOD_HI 3\r\n#define C_PERIOD_LOW 4\r\n#define C_PERIOD_HI 5\r\n#define NOISE 6\r\n#define CONTROL 7\r\n#define A_VOLUME 8\r\n#define B_VOLUME 9\r\n#define C_VOLUME 10  \r\n#define ENV_PERIOD_LOW 11\r\n#define ENV_PERIOD_HI 12\r\n#define ENV_WAVE 13\r\n\r\n#define POKE(addr,val)     (*(uint8_t*) (addr) = (val))\r\n\r\nint input;\r\nint stick = 1;\r\nint time_counter;\r\nint fire_pressed = 0;\r\n\r\nvoid _XL_ZAP_SOUND(void) \r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    set_psg(A_VOLUME,15);\r\n    set_psg(A_PERIOD_LOW,255);  \r\n    set_psg(A_PERIOD_HI, 15);  \r\n    set_psg(CONTROL, 0xFF  - 0x01 - 0x40);  // -0x40 is the FIX\r\n    for(i=0;i<16;i++)\r\n    {\r\n        set_psg(A_PERIOD_HI,15-i);        \r\n        for(j=0;j<150U;++j)\r\n        {\r\n        }\r\n    }    \r\n    set_psg(A_VOLUME,0);        \r\n}\r\n\r\n\r\n\r\nuint8_t fire_pressed_after_time(void)\r\n{\r\n    return (!time_counter) && (fire_pressed = (joystick(stick)==MOVE_FIRE));\r\n}\r\n\r\n\r\nvoid short_sleep(void)\r\n{\r\n    uint16_t i;\r\n    for(i=0;i<200;++i)\r\n    {\r\n    }\r\n}\r\n\r\nint main(void)\r\n{\r\n    input = 0;\r\n    uint8_t i;\r\n    time_counter = 5;\r\n    do\r\n    {\r\n        for(i=3;i<(YSize-5)*4;++i)\r\n        {\r\n            if(time_counter)\r\n            {\r\n                --time_counter;\r\n            }            \r\n            // Do something here\r\n            if(fire_pressed_after_time())\r\n            {\r\n                break;\r\n            } \r\n            // Do something else here\r\n            short_sleep();\r\n            if(fire_pressed_after_time())\r\n            {\r\n                break;\r\n            }\r\n        }\r\n        if(!fire_pressed)\r\n        {\r\n            // Do something\r\n        }\r\n    }\r\n    while(!fire_pressed);    \r\n    printf(\"OK1\");\r\n    \r\n\t\r\n\t//asm(\"di\"); \r\n\t_XL_ZAP_SOUND(); \r\n\t//asm(\"ei\");\r\n\t\r\n    // **********************************\r\n    // _XL_ZAP_SOUND(); // **** BUG HERE *** \r\n    // **********************************\r\n    \r\n    sleep(1);\r\n    time_counter = 5;\r\n    do\r\n    {\r\n        for(i=5;i<YSize-2;++i)\r\n        {\r\n            if(fire_pressed_after_time())\r\n            {\r\n                break;\r\n            }\r\n            if(time_counter)\r\n            {\r\n                --time_counter;\r\n            }\r\n        }\r\n    }\r\n    while(!fire_pressed); \r\n    printf(\"OK2\");\r\n    while(1){};\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/test_sleep.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n\nint main(void)\n\n{\n\tshort i;\n\t\n\tfor(i=0;i<10;++i)\n\t{\n\t\tprintf(\"%d\\n\", i);\n\t\tsleep(1);\n\t}\n\twhile(1){};\n\treturn 0;\n}\n"
  },
  {
    "path": "src/debug/test_vsync.c",
    "content": "#include <peekpoke.h>\r\n#include <conio.h>\r\n\r\n#if defined(__VIC20__)\r\n    #define SET_DEBUG_BORDER()     POKE(36879u, 12)\r\n    #define UNSET_DEBUG_BORDER()   POKE(36879u,  8)\r\n#elif defined(__C64__)\r\n    #define SET_DEBUG_BORDER()     POKE(53280u,  1)\r\n    #define UNSET_DEBUG_BORDER()   POKE(53280u,  0)\r\n#else\r\n    #define SET_DEBUG_BORDER() \r\n    #define UNSET_DEBUG_BORDER() \r\n#endif\r\n\r\n\r\nint main()\r\n{\r\n\r\n    int i;\r\n    \r\n    while(1)\r\n    {\r\n        waitvsync();\r\n        SET_DEBUG_BORDER();\r\n        \r\n        // Waste some time\r\n        for(i=0;i<100;++i){};\r\n        \r\n        UNSET_DEBUG_BORDER();\r\n    }\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/testc16.c",
    "content": "\n\n#include <conio.h>\n\nint main(void)\n\n{\n\ttextcolor(COLOR_PURPLE);\n\n\tgotoxy(0,0);\n\tcprintf(\"HELLO\");\n\treturn 0;\n}\n"
  },
  {
    "path": "src/debug/tgi_lynx_black_test.c",
    "content": "#include <tgi.h>\r\n\r\n#define CLI() asm(\"\\tcli\")\r\n\r\nint main(void)\r\n{\r\n    tgi_install (tgi_static_stddrv);\r\n\r\n    tgi_init ();        \r\n    CLI();\r\n\r\n    while (tgi_busy())  {  };\r\n\r\n    tgi_setpalette(tgi_getdefpalette());\r\n    tgi_setbgcolor(TGI_COLOR_GREY);\r\n\r\n    tgi_setcolor(TGI_COLOR_RED);\r\n    tgi_outtextxy(8,8,\"hello\"); \r\n    tgi_outtextxy(8,8*4,\"hello\");\r\n    \r\n    \r\n    tgi_setbgcolor(TGI_COLOR_WHITE);\r\n    tgi_outtextxy(8,8,\"    \"); \r\n    \r\n    tgi_setbgcolor(TGI_COLOR_BLACK);\r\n    tgi_outtextxy(8,8*4,\"    \");\r\n\r\n    while(1){};\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/tgi_lynx_cgetc_test.c",
    "content": "\r\n#include <tgi.h>\r\n#include <conio.h>\r\n\r\n#define CLI() asm(\"\\tcli\")\r\n\r\nint main(void)\r\n{\r\n    uint16_t i;\r\n    uint8_t str[2];\r\n    \r\n    str[1] = '\\0';\r\n    tgi_install (tgi_static_stddrv);\r\n\r\n    tgi_init ();        \r\n    CLI();\r\n\r\n    tgi_clear();\r\n\r\n    while (tgi_busy())  {  };\r\n\r\n    tgi_setpalette(tgi_getdefpalette());\r\n    tgi_setbgcolor(TGI_COLOR_GREY);\r\n\r\n    tgi_setcolor(TGI_COLOR_RED);\r\n\r\n    tgi_outtextxy(8,8*0,\"press a key\"); \r\n    for(i=0;i<30000;++i){}\r\n    if(kbhit())\r\n    {\r\n    }\r\n    else\r\n    {\r\n    }    \r\n    \r\n    str[0] = cgetc();   \r\n    tgi_outtextxy(8,8*1,\"step 1\"); \r\n    tgi_outtextxy(8*8,8*1,str); \r\n    for(i=0;i<30000;++i){}\r\n\r\n    if(kbhit())\r\n    {\r\n    }\r\n    else\r\n    {\r\n    }\r\n\r\n    str[0] = cgetc();   \r\n    tgi_outtextxy(8,8*2,\"step 2\"); \r\n    tgi_outtextxy(8*8,8*2,str); \r\n    for(i=0;i<30000;++i){}\r\n    \r\n    str[0] = cgetc();   \r\n    tgi_outtextxy(8,8*3,\"step 3\");\r\n    tgi_outtextxy(8*8,8*3,str);     \r\n    for(i=0;i<30000;++i){}\r\n    tgi_outtextxy(8,8*4,\"step 4\");\r\n    \r\n    while(1)\r\n    {\r\n        if(kbhit())\r\n        {\r\n            str[0] = cgetc();\r\n            tgi_outtextxy(8*8,8*4,str);\r\n        }\r\n        else\r\n        {\r\n            tgi_outtextxy(8*8,8*6,\"*\");\r\n            for(i=0;i<4000;++i){}\r\n            tgi_outtextxy(8*8,8*6,\"+\");            \r\n            tgi_outtextxy(8*8,8*4,\" \");            \r\n        }\r\n    }\r\n    \r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/tgi_lynx_test.c",
    "content": "#include <tgi.h>\n\n#define CLI() asm(\"\\tcli\")\n\nint main(void)\n{\n    tgi_install (tgi_static_stddrv);\n\n    tgi_init ();        \n    CLI();\n\n    tgi_clear();\n\n    while (tgi_busy())  {  };\n\n    tgi_setpalette(tgi_getdefpalette());\n    tgi_setbgcolor(TGI_COLOR_GREY);\n\n    tgi_setcolor(TGI_COLOR_RED);\n    tgi_outtextxy(8*6,8,\"** ##\"); \n    \n    tgi_setcolor(TGI_COLOR_WHITE);\n    tgi_outtextxy(8,8,\"** ##\"); \n\n    while(1){};\n    return 0;\n}\n"
  },
  {
    "path": "src/debug/ti99.c",
    "content": "#include <stdio.h>\r\n\r\n#include <stdint.h>\r\n\r\nint main(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t offset;\r\n    uint8_t new_arrow_x;\r\n    uint8_t bow_x;\r\n    uint8_t number_of_arrows_per_shoot;\r\n    \r\n    number_of_arrows_per_shoot = 2;\r\n    bow_x = 20;\r\n    new_arrow_x = (bow_x>>1)+(bow_x&1);\r\n    \r\n    for(i=0;i<number_of_arrows_per_shoot;++i)\r\n    {\r\n        printf(\"i: %d \", i);\r\n        if((number_of_arrows_per_shoot==2)&&i)\r\n        {\r\n            offset = i-2*(bow_x&1);\r\n        }\r\n        else\r\n        {\r\n            offset = i;\r\n        }\r\n        printf(\"| offset: %d\\n\", offset);\r\n        \r\n        new_arrow_x+=offset;\r\n        if(i==2)\r\n        {\r\n            if(new_arrow_x>=4)\r\n            {\r\n                new_arrow_x-=4; \r\n            }\r\n            else\r\n            {\r\n                // printf(\"new_arrow_x for %d: %d\\n\", i, new_arrow_x);\r\n\r\n                continue;\r\n            }\r\n        }\r\n        printf(\"new_arrow_x for %d: %d\\n\\n\", i, new_arrow_x);\r\n    }\r\n    \r\n    return 0;\r\n}"
  },
  {
    "path": "src/debug/ti99_test.c",
    "content": "#include <system.h>\r\n#include <conio.h>\r\n\r\n#define NUMBER_OF_STRINGS 5\r\n#define MAX_STRING_SIZE 7\r\n\r\nconst char strings[NUMBER_OF_STRINGS][MAX_STRING_SIZE] = \r\n{\r\n    \"M\" \"i\" \"n\" \"e\",\r\n    \"E\" \"n\" \"e\" \"r\" \"g\" \"y\",\r\n    \"B\" \"o\" \"n\" \"u\" \"s\",\r\n    \"P\" \"o\" \"i\" \"n\" \"t\" \"s\",\r\n    \"A\" \"p\" \"p\" \"l\" \"e\"\r\n};\r\n\r\n#define LINE_OFFSET 4\r\n#define LINE_SKIP 2\r\n\r\nint main(void)\r\n{\r\n    unsigned char i;\r\n    \r\n    set_graphics(VDP_SPR_16x16);                        // set video mode\r\n    charsetlc();                                        // load character set with lowercase\r\n    vdpmemset(gImage, 32, 768);                         // clear screen\r\n    VDP_SET_REGISTER(VDP_REG_COL, COLOR_BLACK);      // set screen color\r\n    \r\n\r\n    \r\n    for(i=0;i<NUMBER_OF_STRINGS;++i)\r\n    {\r\n        // _XL_PRINT(XSize/2-4,YSize/8+LINE_OFFSET+LINE_SKIP*i, (char *) strings[NUMBER_OF_STRINGS-1-i] );\r\n        gotoxy(XSize/2-4, YSize/8+LINE_OFFSET+LINE_SKIP*i);\r\n        cprintf((char *) strings[NUMBER_OF_STRINGS-1-i]);\r\n    }\r\n    \r\n    \r\n    while(1){};\r\n    \r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/unsigned_right_shift.c",
    "content": "#include <stdio.h>\r\n#include <stdint.h>\r\n\r\nuint8_t foo;\r\nuint8_t bar; // Without this there is no bug\r\n\r\nint main(void)\r\n{            \r\n    uint8_t i; \r\n\r\n    foo = 1U;\r\n    bar = 3U;  // Without this there is no bug\r\n\r\n    for(i=0;i<(int16_t) foo;++i)\r\n    {\r\n        printf(\"foo\\n\");\r\n    }\r\n\r\n    printf(\"OK\");\r\n\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/debug/wait_for_key.c",
    "content": "#include<conio.h>\r\n\r\n#define cgetc() getch()\r\n\r\nvoid wait_for_key(void)\r\n{\r\n    while(kbhit())\r\n        (void) cgetc();\r\n    while(!kbhit())\r\n    { \r\n    }; \r\n    (void) cgetc();\r\n}\r\n\r\n\r\nint main(void)\r\n{\r\n\r\n    clrscr();\r\n    \r\n    while(1)\r\n    {\r\n        printf(\"press a key\\n\");\r\n        wait_for_key();\r\n    }\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/debug/world.c",
    "content": "/*\n *\tHello World\n */\n\n\n#include <stdio.h>\n\n\nmain()\n{\n\tprintf(\"Hello world! %d\\n\",12);\n\tfgetc_cons();\n}\n"
  },
  {
    "path": "src/debug/x07.c",
    "content": "void send_t6834(char data) __stdc\r\n{\r\n#asm\r\n; __stdc: params pushed right-to-left, so on stack (low to high):\r\n; SP+0: return address (2 bytes)\r\n; SP+2: data (1 byte, but word-aligned)\r\n\r\n.wait\t\t\t; wait for T6834\r\n\tin a,($f2)\t;\r\n\tand $02\t\t;\r\n\tjr z,wait\t;\r\n\t\t\t\t; nop\r\n\tei\t\r\n\tld a,($026c)\t; INTIMAG\r\n\tor $80\r\n\t\t\t\t; ld ($026c),a\t???\t\t\r\n\tout ($f0),a\r\n\tdi\r\n\t\t\t\t; nop\r\n\t\t\r\n\tld hl,$02\t; load byte to write from stack\r\n\tadd hl,sp\t; \r\n\tld a,(hl)\t        ; a<-byte to write\r\n\t\r\n\tout ($f1),a\t; send a to $F1\r\n\t\t\t\t; nop\r\n\t\t\r\n\tld a,$02\t; a<-2\r\n\tout ($f5),a\r\n\t\r\n#endasm\r\n\r\n}\r\n\r\n// function 0X15 CIRCLE x,y center r radius\r\n// this work\r\nvoid x_circle(char x,y,r)\r\n{\r\nsend_t6834(0x15);\r\nsend_t6834(x);\r\nsend_t6834(y);\r\nsend_t6834(r);\r\n}\r\n\r\n// function 0X06 WRITE a char in the T6384 address room\r\n// addr where to be wrote\r\n// data to write\r\nvoid x_ramwrite(char data,unsigned int addr)\r\n{\r\nunsigned char low,high;\r\n\r\nlow=addr&0xff;\r\nhigh=(addr>>8)&0xff;\r\n// printf(\"%d %d\",high,low);\t\r\nsend_t6834(0x06);\t\t// RAM WRITE command,\r\n\r\n\r\n\r\nsend_t6834(high);\t\t// Address high byte\r\nsend_t6834(low); \t\t// Address low byte\r\n\r\nsend_t6834(data);\t\t// Data byte\r\n\r\n}\r\n\r\n\r\nint main(void)\r\n{\r\n    int i;\r\n\r\n    for(i=0;i<0x511;++i)\r\n    {\r\n        x_ramwrite(i,0xE000+i);\r\n    };\r\n\r\n    while(1){};\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/examples/animate/Makefile.animate",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\t\r\nGAME_NAME := animate\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/animate/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=14\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/animate/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n\n#include \"cross_lib.h\"\n\n#define MIN_X 1\n#define MAX_X (XSize-2)\n#define MIN_Y 1\n#define MAX_Y (YSize-2)\n\n#define DOWN_TILE  _TILE_0\n#define UP_TILE    _TILE_1 \n#define RIGHT_TILE _TILE_2\n#define LEFT_TILE  _TILE_3 \n#define FIRE_TILE  _TILE_4\n\nint main(void)\n{   \n\n    uint8_t x;\n    uint8_t y;\n    uint8_t input;\n    uint8_t tile;\n\n    _XL_INIT_GRAPHICS();\n    _XL_INIT_SOUND();\n    _XL_INIT_INPUT();\n\n    _XL_CLEAR_SCREEN();\n\n    x = XSize/2;\n    y = YSize/2;\n    \n    tile = DOWN_TILE;\n    \n    while(1)\n    {\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\n        _XL_PRINTD(0,0,3,x);\n        _XL_PRINTD(5,0,3,y);\n        \n        input = _XL_INPUT();\n        if(_XL_UP(input))\n        {\n            _XL_DELETE(x,y);\n            tile = UP_TILE;\n            --y;\n        }\n        else if (_XL_DOWN(input))\n        {\n            _XL_DELETE(x,y);\n            tile = DOWN_TILE;\n            ++y;\n        }\n        else if (_XL_LEFT(input))\n        {\n            _XL_DELETE(x,y);\n            tile = LEFT_TILE;\n            --x;\n        }\n        else if(_XL_RIGHT(input))\n        {\n            _XL_DELETE(x,y);\n            tile = RIGHT_TILE;\n            ++x;\n        }\n        else if(_XL_FIRE(input))\n        {\n            _XL_DRAW(x,y,FIRE_TILE,_XL_WHITE);\n            _XL_EXPLOSION_SOUND();\n            _XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);  \n        }\n        \n        if((y>=MIN_Y)&&(y<=MAX_Y)&&(x>=MIN_X)&&(x<=MAX_X))\n        {\n            _XL_DRAW(x,y,tile,_XL_WHITE);\n            _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n        }\n        else\n        {\n            _XL_DELETE(x,y);\n            _XL_ZAP_SOUND();\n            _XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);  \n            x = XSize/2;\n            y = YSize/2;\n        }\n        \n        _XL_SLOW_DOWN(4*_XL_SLOW_DOWN_FACTOR);\n        \n    }\n    \n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/animate/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/animate/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile25.txt",
    "content": "$ff,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/animate/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36, 102"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile1.txt",
    "content": "24, 60, 24,102,153, 24, 36,102"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile10.txt",
    "content": "24, 36, 24,  0,153,  0, 36,102"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile11.txt",
    "content": "0,  0,  8, 56, 28, 16,  0,  0"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile12.txt",
    "content": "24, 24, 24, 48, 24, 12, 24, 24"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile13.txt",
    "content": "0,  0,  32,255,  4,  0,  0,  0"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile14.txt",
    "content": "0,  0,240, 63, 63,240,  0,  0"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile15.txt",
    "content": "0,  0, 15,252,252, 15,  0,  0"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile16.txt",
    "content": "24, 60, 60, 60,126, 90, 66, 66"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile17.txt",
    "content": "0,60,66,207,195,102,36,24"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile18.txt",
    "content": "0,60,90,219,195,90,60,24"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile19.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile2.txt",
    "content": "24, 52, 25,118,152, 24, 20, 20"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile20.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile21.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile22.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile23.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile24.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile3.txt",
    "content": "24, 44,152,110, 25, 24, 40, 40"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile4.txt",
    "content": "60, 66,165,153,153,165, 66, 60"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile5.txt",
    "content": "60, 66,165,153,153,165, 66, 60"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile6.txt",
    "content": "189,66,165,165,129,153,129,126"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile7.txt",
    "content": "60, 66,165,129, 90, 36, 36, 60"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile8.txt",
    "content": "0, 60, 102,223,231,122, 36, 24"
  },
  {
    "path": "src/examples/animate/tiles/8x8/tile9.txt",
    "content": "0,128,126,200,248,192,128,  0"
  },
  {
    "path": "src/examples/animate/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define _TILE_0 (unsigned char) '0'\r\n#define _TILE_1 (unsigned char) '1'\r\n\r\n#define _TILE_2 (unsigned char) '2'\r\n\r\n#define _TILE_3 (unsigned char) '3'\r\n\r\n// Apple\r\n#define _TILE_4 (unsigned char) '4'\r\n\r\n// Body\r\n#define _TILE_5 (unsigned char) '5'\r\n\r\n#define _TILE_6 (unsigned char) '6'\r\n\r\n#define _TILE_7 (unsigned char) '7'\r\n\r\n#define _TILE_8 (unsigned char) '8'\r\n\r\n#define _TILE_9 (unsigned char) '9'\r\n\r\n#define _TILE_10 (unsigned char) 'A'\r\n\r\n#define _TILE_11 (unsigned char) 'B'\r\n#define _TILE_12 (unsigned char) 'C'\r\n\r\n#define _TILE_13 (unsigned char) 'D'\r\n\r\n#define _TILE_14 (unsigned char) 'E'\r\n\r\n#define _TILE_15 (unsigned char) 'F'\r\n\r\n#define _TILE_16 (unsigned char) 'G'\r\n\r\n#define _TILE_17 (unsigned char) 'H'\r\n\r\n#define _TILE_18 (unsigned char) 'I'\r\n\r\n#define _TILE_19 (unsigned char) 'J'\r\n\r\n#define _TILE_20 (unsigned char) 'K'\r\n\r\n#define _TILE_21 (unsigned char) 'L'\r\n\r\n#define _TILE_22 (unsigned char) 'M'\r\n\r\n#define _TILE_23 (unsigned char) 'N'\r\n\r\n#define _TILE_24 (unsigned char) 'O'\r\n\r\n#define _TILE_25 'P'\r\n\r\n//#define _TILE_25 '$'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/background/Makefile.background",
    "content": "\r\nPROJECT_OPTS = -D__BACKGROUND_COLOR=1\r\n\r\nFULL_FILES ?=  \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := background\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/background/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=50\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12"
  },
  {
    "path": "src/examples/background/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define NUMBER_OF_COLORS 7\r\n#define MAX_STRING_SIZE 10\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t color[NUMBER_OF_COLORS] = {_XL_BLACK, _XL_WHITE,  _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE};\r\n#endif\r\n\r\n\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"BLACK\",\r\n                                \"WHITE\",\r\n                                \"RED\", \r\n                                \"CYAN\", \r\n                                \"GREEN\", \r\n                                \"YELLOW\", \r\n                                \"BLUE\", \r\n                                };\r\n\r\n#define MAX_TILES_TO_DISPLAY 16\r\n\r\nconst uint8_t tile[MAX_TILES_TO_DISPLAY] = {\r\n    _TILE_0,\r\n    _TILE_1,\r\n    _TILE_2,\r\n    _TILE_3,\r\n    _TILE_4,\r\n    _TILE_5,\r\n    _TILE_6,\r\n    _TILE_7,\r\n    _TILE_8,\r\n    _TILE_9,\r\n    _TILE_10,\r\n    _TILE_11,\r\n    _TILE_12,\r\n    _TILE_13,\r\n    _TILE_14,\r\n    _TILE_15,\r\n};\r\n\r\n#define COL_OFFSET 4\r\n#define ROW_OFFSET 3\r\n\r\n#if XSize <=((MAX_TILES_TO_DISPLAY)*2-COL_OFFSET)\r\n    #define TILE_SEPARATION 1\r\n    #define TILES_TO_DISPLAY ((XSize)-COL_OFFSET)\r\n#else\r\n    #define TILE_SEPARATION 2\r\n    #define TILES_TO_DISPLAY (MAX_TILES_TO_DISPLAY-(COL_OFFSET/2))\r\n#endif\r\n\r\nint main(void)\r\n{        \r\n    uint8_t i;\r\n    uint8_t j;\r\n    uint8_t k;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_SOUND();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n\r\n    for(k=0;k<3;++k)\r\n    {\r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n\t\t\t// TODO: This may work weirdly when WHITE is defined as a non-WHITE color, e.g., on the Apple //\r\n\t\t\t// TODO: WHITE should be defined differently for the Apple // and maybe on other targets\r\n            // if(color[j]!=_XL_BACKGROUND_COLOR)\r\n            // {\r\n                _XL_CLEAR_SCREEN();\r\n                \r\n                _XL_SET_TEXT_COLOR(color[j]);\r\n\r\n                _XL_PRINT(XSize-12,0,\"01234567890\");\r\n                \r\n                _XL_PRINT(COL_OFFSET,   1,\"PRINTD\");\r\n                _XL_PRINTD(COL_OFFSET  ,2,5, 1234U);\r\n                _XL_PRINTD(COL_OFFSET+5,2,5,56789U);\r\n                \r\n                _XL_PRINT(COL_OFFSET, 4, (char *) color_name[j]);\r\n                \r\n                _XL_PRINT(COL_OFFSET, 6, _XL_a _XL_b _XL_c _XL_d _XL_e _XL_f _XL_g _XL_h _XL_i _XL_j);\r\n                _XL_PRINT(COL_OFFSET, 7, _XL_k _XL_l _XL_m _XL_n _XL_o _XL_p _XL_q _XL_r _XL_s _XL_t);\r\n                _XL_PRINT(COL_OFFSET, 8, _XL_u _XL_v _XL_w _XL_x _XL_y _XL_z);\r\n                \r\n                #if YSize>=12\r\n                _XL_PRINT(COL_OFFSET,10, _XL_A _XL_B _XL_C _XL_D _XL_E _XL_F _XL_G _XL_H _XL_I _XL_J);\r\n                _XL_PRINT(COL_OFFSET,11, _XL_K _XL_L _XL_M _XL_N _XL_O _XL_P _XL_Q _XL_R _XL_S _XL_T);\r\n                _XL_PRINT(COL_OFFSET,12, _XL_U _XL_V _XL_W _XL_X _XL_Y _XL_Z);\r\n                #endif\r\n\r\n                #if YSize >= 15\r\n                \r\n                #if XSize>=16\r\n                _XL_PRINT(COL_OFFSET,14, \" ABCDEFG HIJKLM\");\r\n                _XL_PRINT(COL_OFFSET,15, \" NOPQRST UVWXYZ\");\r\n                #else\r\n                _XL_PRINT(COL_OFFSET,14, \" ABCDEFG\");\r\n                _XL_PRINT(COL_OFFSET,15, \" NOPQRST\");   \r\n                #endif\r\n            \r\n                #endif\r\n                \r\n                for(i=0;i<TILES_TO_DISPLAY;++i)\r\n                {\r\n                    _XL_DRAW(COL_OFFSET+TILE_SEPARATION*i,3,tile[i],color[j]);\r\n                }   \r\n                _XL_WAIT_FOR_INPUT();\r\n            // }\r\n        }\r\n    }\r\n    _XL_CLEAR_SCREEN();\r\n    _XL_PRINT(XSize/2-5,YSize/2, \"END OF DEMO\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/background/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/background/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile25.txt",
    "content": "$7f,$3e,$60,$3c,$06,$7c,$18,$7f"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/background/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/background/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/background/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/blob/Makefile.blob",
    "content": "######################################################################\n# Makefile for CROSS-BLOB\n\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c \n\nGAME_NAME := blob\n\nPARENT_DIR = examples\n\nSOURCE_PATH := $(PARENT_DIR)/$(GAME_NAME)\n\n#-D_DEFAULT_ASCII\nDEFAULT_ASCII=\n\nGLOBAL_OPTS = $(DEFAULT_ASCII)\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\n\ninclude ./Makefile_common\n\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n"
  },
  {
    "path": "src/examples/blob/config/game_config.mk",
    "content": "#\r\n\r\nCOCO_COLOR_GFX_GAME_OPTS ?= \r\n\r\nCREATIVISION_GAME_OPTS ?=  \r\n\r\nGAMATE_GAME_OPTS ?=\r\n\r\nC128_Z80_80COL_GAME_OPTS ?= \r\n\r\nZX81_NO_GFX_GAME_OPTS ?=\r\n\r\nZX81_GFX_GAME_OPTS ?= \r\n\r\nAPPLE2_GAME_OPTS ?= \r\n\r\nCOMX_GAME_OPTS ?= \r\n\r\nPECOM_GAME_OPTS ?= \r\n\r\nTMC600_GAME_OPTS ?= \r\n\r\nMICRO_GAME_OPTS ?= \r\n\r\nCAMPUTERS_LYNX_GAME_OPTS ?=\r\n\r\nVIC_20_EXP_3K_GAME_OPTS ?= \r\n\r\nVIC20_UNEXPANDED_GAME_OPTS ?= \r\n\r\nSTDIO_GAME_OPTS ?= \r\n\r\nBBC7_GAME_OPTS ?="
  },
  {
    "path": "src/examples/blob/config/project_config.mk",
    "content": "#####################################################################\r\n# DISPLAY FLAGS\r\n\r\n4COLOR_PALETTE=\r\n# As of 2024/11/24, impacted targets are: bbc, nes, atari7800, hectorhr\r\n# Default: Black, White, Red, Cyan\r\n#-D__USE_GREEN\r\n\r\n5COLOR_PALETTE=\r\n# As of 2024/11/24, impacted targets are: atari, atari5200\r\n# Default: Black, White, Red, Cyan, Green\r\n#-D__USE_CYAN_YELLOW\r\n#-D__USE_GREEN_YELLOW\r\n\r\nORIC_COLORS=\r\n# -D__MONO_COLORS\r\n\r\nMC10_COLORS=\r\n# -D__REVERSE_LETTERS\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=70\r\n_APPLE2_HGR_SLOWDOWN=70\r\n_APPLE2ENH_HGR_SLOWDOWN=70\r\n_ATARI_SLOWDOWN=120\r\n_ATARI5200_SLOWDOWN=120\r\n_ATARI_LYNX_SLOWDOWN=230\r\n_ATARI7800_NO_COLOR_SLOWDOWN=300\r\n_ATARI7800_SLOWDOWN=400\r\n_ATARI_LYNX_SLOWDOWN=400\r\n_C16_SLOWDOWN=155\r\n_C16_CONIO_SLOWDOWN=185\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=800\r\n_ORIC_SLOWDOWN=90\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=60\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=1400\r\n_VIC20_SLOWDOWN=500\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=150\r\n_ACE_SLOWDOWN=130\r\n_AGON_SLOWDOWN=600\r\n_BEE_SLOWDOWN=150\r\n_C128_Z80_40COL_SLOWDOWN=200\r\n_C128_Z80_80COL_SLOWDOWN=50\r\n_CAMPUTERS_LYNX_SLOWDOWN=0\r\n_COLECO_SLOWDOWN=230\r\n_CPC_MODE0_SLOWDOWN=250\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=240\r\n_CPC_MODE2_SLOWDOWN=240\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_GAL_SLOWDOWN=100\r\n_GAL_GFX_SLOWDOWN=50\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=260\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_KC_SLOWDOWN=200\r\n_LASER500_SLOWDOWN=250\r\n_MC1000_SLOWDOWN=220\r\n_MSX_SLOWDOWN=250\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=250\r\n_MTX512_SLOWDOWN=250\r\n_MZ_SLOWDOWN=250\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SC3000_SLOWDOWN=250\r\n_SMS_SLOWDOWN=260\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=220\r\n_VZ200_SLOWDOWN=220\r\n_Z1013_SLOWDOWN=100\r\n_Z9001_SLOWDOWN=100\r\n_ZX81_SLOWDOWN=60\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=150\r\n_COCO3_SLOWDOWN=300\r\n_DRAGON_SLOWDOWN=150\r\n_MO5_SLOWDOWN=180\r\n_TO7_SLOWDOWN=180\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=100\r\n_PECOM_SLOWDOWN=100\r\n_TMC600_SLOWDOWN=120\r\n_MICRO_SLOWDOWN=130\r\n_CIDELSA_SLOWDOWN=100\r\n\r\n\r\n# MC10\r\n_MC10_SLOWDOWN=110\r\n\r\n# GCC FOR TI99\r\n_TI99_SLOWDOWN=120\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n_TERMINAL_SLOWDOWN=8\r\n"
  },
  {
    "path": "src/examples/blob/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subxect to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#define INITIAL_LEVEL 1\n#define FINAL_LEVEL 8\n\nuint16_t hiscore;\nuint16_t score;\nuint8_t level;\nuint8_t alive;\nuint8_t lives;\nuint8_t input;\nuint8_t level_completed;\nuint8_t counter;\n\nuint8_t direction;\n\nuint8_t x;\nuint8_t y;\n\n\nuint8_t enemy_x;\nuint8_t enemy_y;\n\n#define RIGHT_TAIL              _TILE_0\n#define LEFT_TAIL               _TILE_1\n#define RIGHT_PART              _TILE_2\n#define LEFT_PART               _TILE_3\n#define RIGHT_PLAYER_HEAD       _TILE_4\n#define LEFT_PLAYER_HEAD        _TILE_5\n#define RIGHT_BOSS_HEAD         _TILE_6\n#define LEFT_BOSS_HEAD          _TILE_7\n#define RIGHT_ENEMY_HEAD        _TILE_8\n#define LEFT_ENEMY_HEAD         _TILE_9\n#define RIGHT_PLAYER_HEAD_PART  _TILE_10\n#define LEFT_PLAYER_HEAD_PART   _TILE_11\n#define RIGHT_BOSS_HEAD_PART    _TILE_12\n#define LEFT_BOSS_HEAD_PART     _TILE_13\n#define RIGHT_ENEMY_HEAD_PART   _TILE_14\n#define LEFT_ENEMY_HEAD_PART    _TILE_15\n#define TERRAIN                 _TILE_16\n#define JUMP                    _TILE_17\n#define FIRE                    _TILE_18\n#define STOP                    _TILE_19\n#define EXIT                    _TILE_20\n#define LEFT_MINE               _TILE_21\n#define RIGHT_MINE              _TILE_22\n#define UP_MINE                 _TILE_23\n#define DOWN_MINE               _TILE_24\n#define CENTER_MINE             _TILE_25\n#define PILL                    _TILE_26\n\n#define MAX_X                   (XSize-2)\n#define MIN_X                   2\n\nstruct BlobStruct\n{\n    uint8_t x;\n    uint8_t y;\n    uint8_t direction;\n    uint8_t left_head;\n    uint8_t left_head_part;\n    uint8_t right_head;\n    uint8_t right_head_part;   \n};\n\ntypedef struct BlobStruct Blob;\n\n\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\n{\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\n}\n\n#define PRINT_CENTERED(Text) \\\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\n\n\nvoid display_player_right(void)\n{\n    uint8_t rx;\n    if((x&1))\n    {\n        rx = (x+1)>>1;\n        _XL_DELETE(rx-1,y); \n        _XL_DRAW(rx,y,RIGHT_PART,_XL_GREEN);\n        _XL_DRAW(rx+1,y,RIGHT_PLAYER_HEAD_PART,_XL_GREEN);\n    }\n    else\n    {\n        rx = x>>1;\n        _XL_DELETE(rx-1,y);\n        _XL_DRAW(rx,y,RIGHT_TAIL,_XL_GREEN);\n        _XL_DRAW(rx+1,y,RIGHT_PLAYER_HEAD,_XL_GREEN);\n    }\n}\n\nvoid display_player_left(void)\n{\n    uint8_t rx;\n    if((x&1))\n    {\n        rx = (x-1)>>1;\n        _XL_DELETE(rx+2,y);\n        _XL_DRAW(rx,y,LEFT_PLAYER_HEAD_PART,_XL_GREEN);\n        _XL_DRAW(rx+1,y,LEFT_PART,_XL_GREEN);\n    }\n    else\n    {\n        rx = x>>1;\n        _XL_DELETE(rx+2,y);\n        _XL_DRAW(rx,y,LEFT_PLAYER_HEAD,_XL_GREEN);\n        _XL_DRAW(rx+1,y,LEFT_TAIL,_XL_GREEN);\n    }\n}\n\n\nvoid display_enemy_right(void)\n{\n    uint8_t rx;\n    if((x&1))\n    {\n        rx = (x+1)>>1;\n        _XL_DELETE(rx-1,y); \n        _XL_DRAW(rx,y,RIGHT_PART,_XL_GREEN);\n        _XL_DRAW(rx+1,y,RIGHT_ENEMY_HEAD_PART,_XL_GREEN);\n    }\n    else\n    {\n        rx = x>>1;\n        _XL_DELETE(rx-1,y);\n        _XL_DRAW(rx,y,RIGHT_TAIL,_XL_GREEN);\n        _XL_DRAW(rx+1,y,RIGHT_ENEMY_HEAD,_XL_GREEN);\n    }\n}\n\nvoid display_enemy_left(void)\n{\n    uint8_t rx;\n    if((x&1))\n    {\n        rx = (x-1)>>1;\n        _XL_DELETE(rx+2,y);\n        _XL_DRAW(rx,y,LEFT_ENEMY_HEAD_PART,_XL_GREEN);\n        _XL_DRAW(rx+1,y,LEFT_PART,_XL_GREEN);\n    }\n    else\n    {\n        rx = x>>1;\n        _XL_DELETE(rx+2,y);\n        _XL_DRAW(rx,y,LEFT_ENEMY_HEAD,_XL_GREEN);\n        _XL_DRAW(rx+1,y,LEFT_TAIL,_XL_GREEN);\n    }\n}\n\n\nvoid display_boss_right(void)\n{\n    uint8_t rx;\n    if((x&1))\n    {\n        rx = (x+1)>>1;\n        _XL_DELETE(rx-1,y); \n        _XL_DRAW(rx,y,RIGHT_PART,_XL_GREEN);\n        _XL_DRAW(rx+1,y,RIGHT_BOSS_HEAD_PART,_XL_GREEN);\n    }\n    else\n    {\n        rx = x>>1;\n        _XL_DELETE(rx-1,y);\n        _XL_DRAW(rx,y,RIGHT_TAIL,_XL_GREEN);\n        _XL_DRAW(rx+1,y,RIGHT_BOSS_HEAD,_XL_GREEN);\n    }\n}\n\nvoid display_boss_left(void)\n{\n    uint8_t rx;\n    if((x&1))\n    {\n        rx = (x-1)>>1;\n        _XL_DELETE(rx+2,y);\n        _XL_DRAW(rx,y,LEFT_BOSS_HEAD_PART,_XL_GREEN);\n        _XL_DRAW(rx+1,y,LEFT_PART,_XL_GREEN);\n    }\n    else\n    {\n        rx = x>>1;\n        _XL_DELETE(rx+2,y);\n        _XL_DRAW(rx,y,LEFT_BOSS_HEAD,_XL_GREEN);\n        _XL_DRAW(rx+1,y,LEFT_TAIL,_XL_GREEN);\n    }\n}\n\n\nvoid display_player(void)\n{\n    if(direction)\n    {\n        display_player_right();\n    }\n    else\n    {\n        display_player_left();\n    }\n}\n\n\n\nvoid display_enemy(void)\n{\n    if(direction)\n    {\n        display_enemy_right();\n    }\n    else\n    {\n        display_enemy_left();\n    }\n}\n\n\nvoid display_boss(void)\n{\n    if(direction)\n    {\n        display_boss_right();\n    }\n    else\n    {\n        display_boss_left();\n    }\n}\n\n\nvoid draw_level(void)\n{\n    uint8_t i;\n    for(i=MIN_X; i<=MAX_X/2;  ++i)\n    {\n        _XL_DRAW(i,YSize/2+1,TERRAIN, _XL_WHITE);\n    }\n}\n\n\nvoid handle_player(void)\n{\n    input = _XL_INPUT();\n\n    if (_XL_RIGHT(input) && x<MAX_X)\n    {\n        direction = 1;\n        ++x;\n        display_player();\n    } \n    else if (_XL_LEFT(input) && x>MIN_X)\n    {\n        direction = 0;\n        --x;\n        display_player();\n    } \n}\n\n\nint main(void)\n{        \n\n    _XL_INIT_GRAPHICS();\n\n    _XL_INIT_INPUT();\n    \n    _XL_INIT_SOUND();\n    \n    hiscore = 0;\n\n    // MAIN END-LESS LOOP\n    while(1)\n    {\n        score = 0;\n        level = INITIAL_LEVEL;\n        lives = 3;\n\n        _XL_CLEAR_SCREEN();\n            \n        _XL_SET_TEXT_COLOR(_XL_RED);\n        PRINT_CENTERED_ON_ROW(4, \"BLOB\");\n        _XL_SET_TEXT_COLOR(_XL_CYAN);\n        PRINT_CENTERED_ON_ROW(6, \"FABRIZIO CARUSO\");\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\n        \n        PRINT_CENTERED_ON_ROW(0, \"HISCORE\");\n        _XL_PRINTD(XSize/2-3,1,5,hiscore);\n        \n        #if !defined(_XL_NO_JOYSTICK)\n        PRINT_CENTERED_ON_ROW(YSize-1, \"PRESS FIRE\");\n        #else\n        PRINT_CENTERED_ON_ROW(YSize-1, \"PRESS A KEY\");\n        #endif\n        _XL_WAIT_FOR_INPUT();\n        \n        _XL_CLEAR_SCREEN();\n        \n        // GAME LOOP\n        while(lives && (level<FINAL_LEVEL+1))\n        {\n            x = XSize/4;\n            y = YSize/2;\n            // (RE-)START LEVEL\n            level_completed = 0;\n            alive = 1;\n            counter = 0;\n            direction = 1;\n            \n            _XL_CLEAR_SCREEN();\n            \n            _XL_PRINT(0,0,\"LEVEL\");\n            _XL_PRINTD(7,0,1,level);\n            \n            _XL_PRINT(0,2,\"LIVES\");\n            _XL_PRINTD(7,2,1,lives);       \n            \n            _XL_SLEEP(1);\n            PRINT_CENTERED_ON_ROW(14, \"PRESS FIRE\");\n            _XL_WAIT_FOR_INPUT();\n            \n            _XL_CLEAR_SCREEN();\n            \n            _XL_PRINT(0,0, \"SCORE\");\n            _XL_PRINTD(7,0,5,score);\n            _XL_PRINTD(XSize-6,YSize-1,5,0);\n            display_player();\n            draw_level();\n\n            // LEVEL LOOP\n            while(!level_completed && alive)\n            {\n                \n                handle_player();\n                _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n\n            }\n                        \n            // ALIVE OR LEVEL_COMPLETED?\n            if(alive)\n            {\n                ++level;\n                PRINT_CENTERED(\"LEVEL COMPLETED\");\n            }\n            else\n            {\n                --lives;\n                PRINT_CENTERED(\"YOU DIED\");\n                _XL_SLEEP(1);\n            }\n        } // (lives && (level<FINAL_LEVEL+1)) \n        if(lives) // Game completed\n        {\n            // GAME COMPLETED\n            _XL_CLEAR_SCREEN();\n            PRINT_CENTERED(\"GAME COMPLETED\");\n            _XL_SLEEP(1);\n            _XL_WAIT_FOR_INPUT();\n        }\n        _XL_CLEAR_SCREEN();\n        PRINT_CENTERED(\"GAME OVER\");\n        _XL_WAIT_FOR_INPUT();\n        if(score>hiscore) \n        {\n            hiscore = score;\n        }\n    } // while(1) -> restart from level 1\n\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/blob/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/blob/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/blob/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/blob/shapes/8x8/shape18.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n...#....\r\n..###...\r\n...#....\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/blob/shapes/8x8/shape19.txt",
    "content": "...#....\r\n..#.#...\r\n.#...#..\r\n#..#..#.\r\n.#...# .\r\n..#.#...\r\n...#....\r\n...#...."
  },
  {
    "path": "src/examples/blob/shapes/8x8/shape20.txt",
    "content": "..####..\r\n.######.\r\n###..###\r\n##....##\r\n##....##\r\n###..###\r\n.######.\r\n..####..\r\n"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/blob/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/examples/blob/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/examples/blob/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile0.txt",
    "content": "$00,$00,$00,$01,$01,$07,$1f,$3f"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile1.txt",
    "content": "$00,$00,$00,$80,$80,$e0,$f8,$fc"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile10.txt",
    "content": "$c0,$e0,$f0,$50,$50,$f0,$f0,$e0"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile11.txt",
    "content": "$03,$07,$0f,$0a,$0a,$0f,$0f,$07"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile12.txt",
    "content": "$c0,$e0,$f0,$00,$b0,$f0,$f0,$e0"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile13.txt",
    "content": "$03,$07,$0f,$00,$0d,$0f,$0f,$07"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile14.txt",
    "content": "$c0,$e0,$f0,$50,$f0,$10,$f0,$e0"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile15.txt",
    "content": "$03,$07,$0f,$0a,$0f,$08,$0f,$07"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile16.txt",
    "content": "$ff,$aa,$ff,$aa,$ff,$00,$00,$00"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile17.txt",
    "content": "$ff,$55,$22,$55,$ff,$00,$00,$00"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile18.txt",
    "content": "0,0,0,0,16,56,16,0"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile19.txt",
    "content": "16,40,68,146,68,40,16,16"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile2.txt",
    "content": "$01,$07,$0f,$1f,$1f,$3f,$7f,$ff"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile20.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile21.txt",
    "content": "0,1,7,12,6,2,3,1"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile22.txt",
    "content": "128,192,64,96,48,224,128,0"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile23.txt",
    "content": "0,0,0,0,8,28,116,198"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile24.txt",
    "content": "99,46,56,16,0,0,0,0"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile25.txt",
    "content": "16,56,46,99,198,116,28,8"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile26.txt",
    "content": "0,0,0,24,52,122,52,24"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile3.txt",
    "content": "$80,$e0,$f0,$f8,$f8,$fc,$fe,$ff"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile4.txt",
    "content": "$3c,$7e,$ff,$f5,$f5,$ff,$ff,$fe"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile5.txt",
    "content": "$3c,$7e,$ff,$af,$af,$ff,$ff,$7f"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile6.txt",
    "content": "$3c,$7e,$ff,$f0,$fb,$ff,$ff,$fe"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile7.txt",
    "content": "$3c,$7e,$ff,$0f,$df,$ff,$ff,$7f"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile8.txt",
    "content": "$3c,$7e,$ff,$f5,$ff,$f1,$ff,$fe"
  },
  {
    "path": "src/examples/blob/tiles/8x8/tile9.txt",
    "content": "$3c,$7e,$ff,$af,$ff,$8f,$ff,$7f"
  },
  {
    "path": "src/examples/blob/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/boundary/Makefile.boundary",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\t\r\n\r\nGAME_NAME := boundary\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/boundary/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/boundary/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\nint main(void)\n{   \n    uint8_t i;\n        \n    _XL_INIT_GRAPHICS();\n\n    _XL_CLEAR_SCREEN();\n\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n\n    _XL_PRINT((XSize-11)/2,YSize-2,\"HELLO WORLD\");\n\n    for(i=0;i<XSize;++i)\n    {\n        _XL_DRAW(i,0,_TILE_0,_XL_WHITE);\n        _XL_DRAW(i,YSize-1,_TILE_0,_XL_WHITE);\n    }\n    for(i=0;i<YSize;++i)\n    {\n        _XL_DRAW(0,i,_TILE_0,_XL_WHITE);\n        _XL_DRAW(XSize-1,i,_TILE_0,_XL_WHITE);\n    }    \n\n    _XL_PRINT(XSize-4-2,0,\"HI\");\n    _XL_PRINTD(XSize-4,0,4,1234);\n\n    _XL_REFRESH();\n\n    while(1){};\n    \n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/boundary/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile25.txt",
    "content": "$ff,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/boundary/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/boundary/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/boundary/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define _TILE_0 (unsigned char) '0'\r\n#define _TILE_1 (unsigned char) '1'\r\n\r\n#define _TILE_2 (unsigned char) '2'\r\n\r\n#define _TILE_3 (unsigned char) '3'\r\n\r\n// Apple\r\n#define _TILE_4 (unsigned char) '4'\r\n\r\n// Body\r\n#define _TILE_5 (unsigned char) '5'\r\n\r\n#define _TILE_6 (unsigned char) '6'\r\n\r\n#define _TILE_7 (unsigned char) '7'\r\n\r\n#define _TILE_8 (unsigned char) '8'\r\n\r\n#define _TILE_9 (unsigned char) '9'\r\n\r\n#define _TILE_10 (unsigned char) 'A'\r\n\r\n#define _TILE_11 (unsigned char) 'B'\r\n#define _TILE_12 (unsigned char) 'C'\r\n\r\n#define _TILE_13 (unsigned char) 'D'\r\n\r\n#define _TILE_14 (unsigned char) 'E'\r\n\r\n#define _TILE_15 (unsigned char) 'F'\r\n\r\n#define _TILE_16 (unsigned char) 'G'\r\n\r\n#define _TILE_17 (unsigned char) 'H'\r\n\r\n#define _TILE_18 (unsigned char) 'I'\r\n\r\n#define _TILE_19 (unsigned char) 'J'\r\n\r\n#define _TILE_20 (unsigned char) 'K'\r\n\r\n#define _TILE_21 (unsigned char) 'L'\r\n\r\n#define _TILE_22 (unsigned char) 'M'\r\n\r\n#define _TILE_23 (unsigned char) 'N'\r\n\r\n#define _TILE_24 (unsigned char) 'O'\r\n\r\n#define _TILE_25 'P'\r\n\r\n//#define _TILE_25 '$'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/characters/Makefile.characters",
    "content": "\r\n\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\n\r\nGAME_NAME := characters\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/characters/config/project_config.mk",
    "content": "\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_COCO3_SLOWDOWN=100\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=14\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/characters/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define NUMBER_OF_COLORS 6\r\n#define MAX_STRING_SIZE 10\r\n#define NUMBER_OF_CHARS 26\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t text_color[NUMBER_OF_COLORS] = {_XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE};\r\n#endif\r\n\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                _XL_W _XL_H _XL_I _XL_T _XL_E, \r\n                                _XL_R _XL_E _XL_D, \r\n                                _XL_C _XL_Y _XL_A _XL_N, \r\n                                _XL_G _XL_R _XL_E _XL_E _XL_N, \r\n                                _XL_Y _XL_E _XL_L _XL_L _XL_O _XL_W, \r\n                                _XL_B _XL_L _XL_U _XL_E, \r\n                                };\r\n\r\nconst char chars[NUMBER_OF_CHARS] = {\r\n    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',\r\n    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',\r\n    'U', 'V', 'W', 'X', 'Y', 'Z'};\r\n\r\n#define COL_OFFSET ((XSize-16)/2-1)\r\n#define ROW_OFFSET 3\r\n\r\n\r\nint main(void)\r\n{        \r\n    uint8_t j;\r\n    uint8_t k;\r\n    uint8_t i;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_SOUND();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n\r\n    for(k=0;k<3;++k)\r\n    {\r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            _XL_SET_TEXT_COLOR(text_color[j]);\r\n\r\n            _XL_PRINT(XSize-12,0,\"01234567890\");\r\n            \r\n            _XL_PRINT(COL_OFFSET,   1,\"PRINTD\");\r\n            _XL_PRINTD(COL_OFFSET  ,2,5, 1234U);\r\n            _XL_PRINTD(COL_OFFSET+5,2,5,56789U);\r\n            \r\n            _XL_PRINT(COL_OFFSET, 4, (char *) color_name[j]);\r\n            \r\n            _XL_PRINT(COL_OFFSET, 6, _XL_a _XL_b _XL_c _XL_d _XL_e _XL_f _XL_g _XL_h _XL_i _XL_j);\r\n            _XL_PRINT(COL_OFFSET, 7, _XL_k _XL_l _XL_m _XL_n _XL_o _XL_p _XL_q _XL_r _XL_s _XL_t);\r\n            _XL_PRINT(COL_OFFSET, 8, _XL_u _XL_v _XL_w _XL_x _XL_y _XL_z);\r\n            _XL_PRINT(COL_OFFSET,10, _XL_A _XL_B _XL_C _XL_D _XL_E _XL_F _XL_G _XL_H _XL_I _XL_J);\r\n            _XL_PRINT(COL_OFFSET,11, _XL_K _XL_L _XL_M _XL_N _XL_O _XL_P _XL_Q _XL_R _XL_S _XL_T);\r\n            _XL_PRINT(COL_OFFSET,12, _XL_U _XL_V _XL_W _XL_X _XL_Y _XL_Z);\r\n\r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n\r\n            _XL_PRINT(COL_OFFSET,YSize/2-1, \" ABCDEFG HIJKLM\");\r\n            _XL_PRINT(COL_OFFSET,YSize/2+1, \" NOPQRST UVWXYZ\");\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            \r\n            for(i=0;i<NUMBER_OF_CHARS;++i)\r\n            {\r\n                _XL_CHAR(2*(i%(XSize/2)),YSize/3+2*(i/(XSize/2)),chars[i]);\r\n            }\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n        }\r\n    }\r\n    _XL_PRINT(COL_OFFSET,YSize-5, \"END OF DEMO\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/characters/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/characters/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile25.txt",
    "content": "$7f,$3e,$60,$3c,$06,$7c,$18,$7f"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/characters/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/characters/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/characters/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/color/Makefile.color",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := color\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/color/config/project_config.mk",
    "content": "\r\n\r\n\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n#CC6303\r\n_MC10_SLOWDOWN=14\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/color/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define NUMBER_OF_COLORS 7\r\n#define MAX_STRING_SIZE 10\r\n\r\nconst uint8_t tile[] = {\r\n\t\t_TILE_0, _TILE_1, _TILE_2, _TILE_3, \r\n\t\t_TILE_4, _TILE_5, _TILE_6, _TILE_7, \r\n\t\t_TILE_8, _TILE_9, _TILE_10, _TILE_11, \r\n\t\t_TILE_12, _TILE_13, _TILE_14, _TILE_15, \r\n\t\t_TILE_16, _TILE_17, _TILE_18, _TILE_19,\r\n\t\t_TILE_20, _TILE_21, _TILE_22, _TILE_23, \r\n\t\t_TILE_24, _TILE_25, _TILE_26\r\n\t\t};\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t color_code[NUMBER_OF_COLORS] = \r\n    {_XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE, _XL_MAGENTA};\r\n\r\n#endif\r\n\r\n\r\n#if XSize>=38\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"WHITE   \", \r\n                                \"RED     \", \r\n                                \"CYAN    \", \r\n                                \"GREEN   \", \r\n                                \"YELLOW  \", \r\n                                \"BLUE    \", \r\n                                \"MAGENTA \",\r\n                                };\r\n    #define NAME_SIZE 7\r\n#else\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"WH \", \r\n                                \"RE \", \r\n                                \"CY \", \r\n                                \"GR \", \r\n                                \"YE \", \r\n                                \"BL \", \r\n                                \"MA \",\r\n                                };\r\n    #define NAME_SIZE 2\r\n#endif\r\n\r\n#if YSize<=9\r\n    #define SHORT_X_OFFSET 4\r\n    #define SHOOT_Y_OFFSET 8\r\n#elif YSize<=14\r\n\r\n    #define SHORT_X_OFFSET 5\r\n    #define SHOOT_Y_OFFSET 5\r\n#else\r\n    #define SHORT_X_OFFSET 0\r\n    #define SHOOT_Y_OFFSET 0\r\n#endif\r\n\r\n\r\n#if _XL_NUMBER_OF_TILES>=XSize-NAME_SIZE\r\n    #define DISPLAYED_TILES (XSize-NAME_SIZE-1)-SHORT_X_OFFSET\r\n    #define OFFSET (NAME_SIZE+1)\r\n#else\r\n    #define DISPLAYED_TILES _XL_NUMBER_OF_TILES\r\n    #define OFFSET (NAME_SIZE+1)\r\n#endif\r\n\r\n\r\n\r\n\r\nint main(void)\r\n{        \r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_SOUND();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    // for(;;)\r\n    // {\r\n        _XL_CLEAR_SCREEN();\r\n\r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n            \r\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n            \r\n            // _XL_PRINT(0,0,\"SET COLOR \");\r\n            \r\n\r\n\r\n            \r\n            #if XSize>=16 && YSize>=15\r\n                _XL_PRINT(XSize-1-1,0,\"TX\");\r\n                _XL_PRINT(XSize-1-1,3,\"CL\");\r\n                #if defined(_XL_NO_TEXT_COLOR)\r\n                    _XL_PRINT(XSize-1-2,1,\"OFF\");\r\n                #else\r\n                    _XL_PRINT(XSize-1-1,1,\"ON\");\r\n                #endif\r\n                #if defined(_XL_NO_COLOR)\r\n                    _XL_PRINT(XSize-1-2, 4,\"OFF\");\r\n                #else\r\n                    _XL_PRINT(XSize-1-1, 4,\"ON\");\r\n                #endif \r\n            #endif\r\n            _XL_SET_TEXT_COLOR(color_code[j]);\r\n            \r\n            _XL_PRINT(0,0+j, (char *) color_name[j]);\r\n            _XL_PRINT(NAME_SIZE+1,0+j,\"0123456789\");\r\n            \r\n        }\r\n        \r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n        \r\n            _XL_SET_TEXT_COLOR(color_code[j]);\r\n            _XL_PRINT(0+SHORT_X_OFFSET,NUMBER_OF_COLORS+1+j-SHOOT_Y_OFFSET, (char *) color_name[j]);\r\n            for(i=0;i<DISPLAYED_TILES;++i)\r\n            {   \r\n                _XL_DRAW(OFFSET+i+SHORT_X_OFFSET,NUMBER_OF_COLORS+1+j-SHOOT_Y_OFFSET,tile[i],color_code[j]);   \r\n\r\n            }       \r\n        }\r\n        \r\n\r\n    // }\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/color/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/color/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/color/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/examples/color/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/color/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/color/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape10.txt",
    "content": "........\r\n.#....#.\r\n##...#.#\r\n.#...#.#\r\n.#...#.#\r\n.#...#.#\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape11.txt",
    "content": "........\r\n.#....#.\r\n##...##.\r\n.#....#.\r\n.#....#.\r\n.#....#.\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape12.txt",
    "content": "........\r\n.#....##\r\n##...#.#\r\n.#.....#\r\n.#....#.\r\n.#...#..\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape13.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape14.txt",
    "content": "........\r\n.#...#.#\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape15.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape16.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape17.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#....#.\r\n.#....#.\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape18.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape19.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape20.txt",
    "content": "........\r\n.##...#.\r\n#.#..#.#\r\n..#..#.#\r\n.#...#.#\r\n#....#.#\r\n###...#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape21.txt",
    "content": "........\r\n.##...#.\r\n#.#..##.\r\n..#...#.\r\n.#....#.\r\n#.....#.\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape22.txt",
    "content": "........\r\n.##...##\r\n#.#..#.#\r\n..#....#\r\n.#....#.\r\n#....#..\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape23.txt",
    "content": "........\r\n.##..###\r\n#.#....#\r\n..#....#\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape24.txt",
    "content": "........\r\n.##..#.#\r\n#.#..#.#\r\n..#..#.#\r\n.#...###\r\n#......#\r\n###....#\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape25.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape26.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#....#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/examples/color/shapes/8x8/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/color/shapes/8x8/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/color/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/examples/color/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/examples/color/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile0.txt",
    "content": "0,66,165,165,165,165,66,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile1.txt",
    "content": "0,66,166,162,162,162,71,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile10.txt",
    "content": "0,66,197,69,69,69,226,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile11.txt",
    "content": "0,66,198,66,66,66,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile12.txt",
    "content": "0,67,197,65,66,68,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile13.txt",
    "content": "0,71,193,65,71,65,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile14.txt",
    "content": "0,69,197,69,71,65,225,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile15.txt",
    "content": "0,71,196,68,71,65,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile16.txt",
    "content": "0,71,196,68,71,69,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile17.txt",
    "content": "0,71,193,65,66,66,226,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile18.txt",
    "content": "0,71,197,69,71,69,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile19.txt",
    "content": "0,71,197,69,71,65,225,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile2.txt",
    "content": "0,67,165,161,162,164,71,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile20.txt",
    "content": "0,98,165,37,69,133,226,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile21.txt",
    "content": "0,98,166,34,66,130,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile22.txt",
    "content": "0,99,165,33,66,132,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile23.txt",
    "content": "0,103,161,33,71,129,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile24.txt",
    "content": "0,101,165,37,71,129,225,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile25.txt",
    "content": "0,103,164,36,71,129,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile26.txt",
    "content": "0,103,164,36,71,133,231,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile3.txt",
    "content": "0,71,161,161,167,161,71,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile4.txt",
    "content": "0,69,165,165,167,161,65,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile5.txt",
    "content": "0,71,164,164,167,161,71,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile6.txt",
    "content": "0,71,164,164,167,165,71,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile7.txt",
    "content": "0,71,161,161,162,162,66,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile8.txt",
    "content": "0,71,165,165,167,165,71,0"
  },
  {
    "path": "src/examples/color/tiles/8x8/tile9.txt",
    "content": "0,71,165,165,167,161,65,0"
  },
  {
    "path": "src/examples/color/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/Makefile.graphics",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := graphics\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/graphics/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C16_CONIO_SLOWDOWN=85\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_COCO3_SLOWDOWN=120\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=2\r\n\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=200\r\n"
  },
  {
    "path": "src/examples/graphics/images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n\n#include \"cross_lib.h\"\n\n\n    #define PLAYER_DOWN_TILE _TILE_0\n    #define PLAYER_UP_TILE _TILE_1\n    #define PLAYER_RIGHT_TILE _TILE_2\n    #define PLAYER_LEFT_TILE _TILE_0\n\n    #define GHOST_TILE _TILE_4\n    #define BOMB_TILE _TILE_5\n\n    #define DEAD_GHOST_TILE _TILE_6\n    #define SKULL_TILE _TILE_7\n    #define CALM_DOWN_TILE _TILE_8\n    #define FIRE_POWER_TILE _TILE_9\n    #define INVINCIBILITY_TILE _TILE_10\n\n    #define BULLET_TILE _TILE_11\n\n    #define VERTICAL_BRICK_TILE _TILE_12\n    #define HORIZONTAL_BRICK_TILE _TILE_13\n\n\n    #define LEFT_HORIZONTAL_MISSILE_TILE _TILE_14\n    #define RIGHT_HORIZONTAL_MISSILE_TILE _TILE_15\n\n    #define ROCKET_TILE _TILE_16\n\n    #define FREEZE_TILE\t _TILE_17\n    #define SUPER_TILE _TILE_18\n\n    #define EXTRA1_TILE _TILE_19\n    #define EXTRA2_TILE _TILE_20\n    #define EXTRA3_TILE _TILE_21\n    #define EXTRA4_TILE _TILE_22\n    #define EXTRA5_TILE _TILE_23\n    #define EXTRA6_TILE _TILE_24\n    \n    // #define _DOLLAR_TILE _TILE_25\n    \n    #define EXTRA_POINTS_TILE _TILE_25\n\n\n    #define _PLAYER_COLOR _XL_CYAN\n\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/examples/graphics/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"images.h\"\r\n\r\nconst uint8_t tiles[] = {\r\n\t\t_TILE_0, _TILE_1, _TILE_2, _TILE_3, \r\n\t\t_TILE_4, _TILE_5, _TILE_6, _TILE_7, \r\n\t\t_TILE_8, _TILE_9, _TILE_10, _TILE_11, \r\n\t\t_TILE_12, _TILE_13, _TILE_14, _TILE_15, \r\n\t\t_TILE_16, _TILE_17, _TILE_18, _TILE_19,\r\n\t\t_TILE_20, _TILE_21, _TILE_22, _TILE_23, \r\n        _TILE_24, _TILE_25,\r\n        _TILE_26\r\n\t\t};\r\n\r\n#define NUMBER_OF_COLORS 7\r\n#define MAX_STRING_SIZE 10\r\n\r\n#if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n    #define FIRST_COLOR _XL_BLACK\r\n#else\r\n    #define FIRST_COLOR _XL_WHITE\r\n#endif\r\n\r\n// TODO: This requires _XL_DRAW to be a macro \r\n// that suppresses the last the color argument when _XL_NO_COLOR is set\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t tile_color[NUMBER_OF_COLORS] = {\r\n    FIRST_COLOR,\r\n    _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE, _XL_MAGENTA};\r\n#endif\r\n\r\n\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n    #if defined(__BACKGROUND_COLOR) && __BACKGROUND_COLOR==1\r\n                                \"BLACK\",\r\n    #else\r\n                                \"WHITE\",\r\n    #endif\r\n                                \"RED\", \r\n                                \"CYAN\", \r\n                                \"GREEN\", \r\n                                \"YELLOW\", \r\n                                \"BLUE\", \r\n                                \"MAGENTA\",\r\n                                };\r\n\r\n\r\n#if XSize<23\r\n    #define COL_OFFSET 0\r\n#else\r\n    #define COL_OFFSET ((XSize/3)-3)\r\n#endif\r\n\r\n#if YSize<12\r\n    #define  ROW_OFFSET 1\r\n#else\r\n    \r\n    #define ROW_OFFSET (YSize/7)\r\n#endif\r\n\r\n#if YSize<=15\r\n    #define CHAR_SKIP 1\r\n    #define LINE_SKIP 1\r\n#else\r\n    #define CHAR_SKIP 2\r\n    #define LINE_SKIP 2\r\n#endif    \r\n\r\n#if defined(_XL_NO_JOYSTICK)\r\n    #define _PRESS \"PRESS A KEY\"\r\n#else\r\n    #define _PRESS \"PRESS FIRE\"\r\n#endif\r\n\r\n\r\nint main(void)\r\n{        \r\n\r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_SOUND();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n\r\n    for(;;)\r\n    {\r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            _XL_SET_TEXT_COLOR(tile_color[j]);\r\n            \r\n            _XL_PRINT(COL_OFFSET, 0, (char *) color_name[j]);\r\n            \r\n            #if YSize>=16\r\n            _XL_SET_TEXT_COLOR(FIRST_COLOR);\r\n            _XL_PRINT(COL_OFFSET,YSize-4, _PRESS);\r\n            #endif\r\n\r\n            for(i=0;i<_XL_NUMBER_OF_TILES;++i)\r\n            {\r\n                _XL_DRAW((i&7)*CHAR_SKIP+COL_OFFSET,(i/8)*LINE_SKIP+ROW_OFFSET,tiles[i],tile_color[j]);\r\n                _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n            }\r\n            \r\n            _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n        }\r\n    }\r\n    _XL_PRINT(COL_OFFSET,YSize-5, \"END OF DEMO\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/graphics/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/graphics/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape10.txt",
    "content": "........\r\n.#....#.\r\n##...#.#\r\n.#...#.#\r\n.#...#.#\r\n.#...#.#\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape11.txt",
    "content": "........\r\n.#....#.\r\n##...##.\r\n.#....#.\r\n.#....#.\r\n.#....#.\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape12.txt",
    "content": "........\r\n.#....##\r\n##...#.#\r\n.#.....#\r\n.#....#.\r\n.#...#..\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape13.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape14.txt",
    "content": "........\r\n.#...#.#\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape15.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape16.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape17.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#....#.\r\n.#....#.\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape18.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape19.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape20.txt",
    "content": "........\r\n.##...#.\r\n#.#..#.#\r\n..#..#.#\r\n.#...#.#\r\n#....#.#\r\n###...#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape21.txt",
    "content": "........\r\n.##...#.\r\n#.#..##.\r\n..#...#.\r\n.#....#.\r\n#.....#.\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape22.txt",
    "content": "........\r\n.##...##\r\n#.#..#.#\r\n..#....#\r\n.#....#.\r\n#....#..\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape23.txt",
    "content": "........\r\n.##..###\r\n#.#....#\r\n..#....#\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape24.txt",
    "content": "........\r\n.##..#.#\r\n#.#..#.#\r\n..#..#.#\r\n.#...###\r\n#......#\r\n###....#\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape25.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape26.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#....#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/shapes/8x8/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/graphics/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/examples/graphics/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/examples/graphics/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile0.txt",
    "content": "0,66,165,165,165,165,66,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile1.txt",
    "content": "0,66,166,162,162,162,71,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile10.txt",
    "content": "0,66,197,69,69,69,226,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile11.txt",
    "content": "0,66,198,66,66,66,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile12.txt",
    "content": "0,67,197,65,66,68,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile13.txt",
    "content": "0,71,193,65,71,65,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile14.txt",
    "content": "0,69,197,69,71,65,225,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile15.txt",
    "content": "0,71,196,68,71,65,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile16.txt",
    "content": "0,71,196,68,71,69,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile17.txt",
    "content": "0,71,193,65,66,66,226,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile18.txt",
    "content": "0,71,197,69,71,69,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile19.txt",
    "content": "0,71,197,69,71,65,225,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile2.txt",
    "content": "0,67,165,161,162,164,71,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile20.txt",
    "content": "0,98,165,37,69,133,226,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile21.txt",
    "content": "0,98,166,34,66,130,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile22.txt",
    "content": "0,99,165,33,66,132,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile23.txt",
    "content": "0,103,161,33,71,129,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile24.txt",
    "content": "0,101,165,37,71,129,225,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile25.txt",
    "content": "0,103,164,36,71,129,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile26.txt",
    "content": "0,103,164,36,71,133,231,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile3.txt",
    "content": "0,71,161,161,167,161,71,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile4.txt",
    "content": "0,69,165,165,167,161,65,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile5.txt",
    "content": "0,71,164,164,167,161,71,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile6.txt",
    "content": "0,71,164,164,167,165,71,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile7.txt",
    "content": "0,71,161,161,162,162,66,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile8.txt",
    "content": "0,71,165,165,167,165,71,0"
  },
  {
    "path": "src/examples/graphics/tiles/8x8/tile9.txt",
    "content": "0,71,165,165,167,161,65,0"
  },
  {
    "path": "src/examples/graphics/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/graphics/tools/digit_0.txt",
    "content": "....\n..#.\n.#.#\n.#.#\n.#.#\n.#.#\n..#.\n...."
  },
  {
    "path": "src/examples/graphics/tools/digit_1.txt",
    "content": "....\n..#.\n.##.\n..#.\n..#.\n..#.\n.###\n....\n"
  },
  {
    "path": "src/examples/graphics/tools/digit_2.txt",
    "content": "....\n..##\n.#.#\n...#\n..#.\n.#..\n.###\n...."
  },
  {
    "path": "src/examples/graphics/tools/digit_3.txt",
    "content": "....\n.###\n...#\n...#\n.###\n...#\n.###\n...."
  },
  {
    "path": "src/examples/graphics/tools/digit_4.txt",
    "content": "....\n.#.#\n.#.#\n.#.#\n.###\n...#\n...#\n...."
  },
  {
    "path": "src/examples/graphics/tools/digit_5.txt",
    "content": "....\n.###\n.#..\n.#..\n.###\n...#\n.###\n...."
  },
  {
    "path": "src/examples/graphics/tools/digit_6.txt",
    "content": "....\n.###\n.#..\n.#..\n.###\n.#.#\n.###\n....\n"
  },
  {
    "path": "src/examples/graphics/tools/digit_7.txt",
    "content": "....\n.###\n...#\n...#\n..#.\n..#.\n..#.\n....."
  },
  {
    "path": "src/examples/graphics/tools/digit_8.txt",
    "content": "....\n.###\n.#.#\n.#.#\n.###\n.#.#\n.###\n...."
  },
  {
    "path": "src/examples/graphics/tools/digit_9.txt",
    "content": "....\n.###\n.#.#\n.#.#\n.###\n...#\n...#\n....\n"
  },
  {
    "path": "src/examples/graphics/tools/extract_least.py",
    "content": "import sys\r\n\r\nif __name__ == \"__main__\":\r\n    iFile = open(sys.argv[1])\r\n    oFile = open(sys.argv[2],'w')\r\n    counter = 1\r\n    for line in iFile:\r\n        line_len = len(line.strip())\r\n        \r\n        # print(str(counter) + \": \" + line)\r\n        \r\n        right_part = line[int(line_len/2):]\r\n        \r\n        counter+=1\r\n        \r\n        oFile.write(right_part)"
  },
  {
    "path": "src/examples/graphics/tools/join_digits.py",
    "content": "import sys\r\n\r\nif __name__ == \"__main__\":\r\n    iLhsFile = open(sys.argv[1])\r\n\r\n    \r\n    lhs = []\r\n    lhsLength = 0\r\n    for lhsLine in iLhsFile:\r\n        \r\n        lhs.append(lhsLine)\r\n        lhsLength+=1\r\n    \r\n    iLhsFile.close()\r\n    # print(str(lhs))\r\n\r\n\r\n    iRhsFile = open(sys.argv[2])\r\n\r\n    rhs = []\r\n    rhsLength = 0\r\n    for rhsLine in iRhsFile:\r\n        \r\n        rhs.append(rhsLine)\r\n        rhsLength+=1\r\n\r\n    iRhsFile.close()\r\n    # print(str(rhs))\r\n    \r\n    oFile = open(sys.argv[3],'w')\r\n\r\n    for counter in range(0,max(lhsLength,rhsLength)):\r\n        # print(counter)\r\n        oFile.write(lhs[counter].strip()+rhs[counter])\r\n    oFile.close()"
  },
  {
    "path": "src/examples/graphics/tools/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/examples/graphics/tools/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/tools/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/tools/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/tools/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/examples/graphics/tools/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/tools/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/tools/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/examples/graphics/tools/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/graphics/tools/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/examples/graphics/tools/test.txt",
    "content": "........\n..#...#.\n.#.#.##.\n.#.#..#.\n.#.#..#.\n.#.#..#.\n..#..###\n........\n"
  },
  {
    "path": "src/examples/hello/Makefile.hello",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := hello\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/hello/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n\r\n"
  },
  {
    "path": "src/examples/hello/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\nint main(void)\n{        \n    _XL_INIT_GRAPHICS();\n\n    _XL_CLEAR_SCREEN();\n\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n\n    _XL_PRINT(XSize/2-5,YSize/2,\"HELLO WORLD\");\n\n    _XL_REFRESH();\n\n    while(1){};\n    \n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/hello/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/hello/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile25.txt",
    "content": "$ff,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/hello/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/hello/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/hello/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define _TILE_0 (unsigned char) '0'\r\n#define _TILE_1 (unsigned char) '1'\r\n\r\n#define _TILE_2 (unsigned char) '2'\r\n\r\n#define _TILE_3 (unsigned char) '3'\r\n\r\n// Apple\r\n#define _TILE_4 (unsigned char) '4'\r\n\r\n// Body\r\n#define _TILE_5 (unsigned char) '5'\r\n\r\n#define _TILE_6 (unsigned char) '6'\r\n\r\n#define _TILE_7 (unsigned char) '7'\r\n\r\n#define _TILE_8 (unsigned char) '8'\r\n\r\n#define _TILE_9 (unsigned char) '9'\r\n\r\n#define _TILE_10 (unsigned char) 'A'\r\n\r\n#define _TILE_11 (unsigned char) 'B'\r\n#define _TILE_12 (unsigned char) 'C'\r\n\r\n#define _TILE_13 (unsigned char) 'D'\r\n\r\n#define _TILE_14 (unsigned char) 'E'\r\n\r\n#define _TILE_15 (unsigned char) 'F'\r\n\r\n#define _TILE_16 (unsigned char) 'G'\r\n\r\n#define _TILE_17 (unsigned char) 'H'\r\n\r\n#define _TILE_18 (unsigned char) 'I'\r\n\r\n#define _TILE_19 (unsigned char) 'J'\r\n\r\n#define _TILE_20 (unsigned char) 'K'\r\n\r\n#define _TILE_21 (unsigned char) 'L'\r\n\r\n#define _TILE_22 (unsigned char) 'M'\r\n\r\n#define _TILE_23 (unsigned char) 'N'\r\n\r\n#define _TILE_24 (unsigned char) 'O'\r\n\r\n#define _TILE_25 'P'\r\n\r\n//#define _TILE_25 '$'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/input/Makefile.input",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := input\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/input/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/input/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define PREVIOUS_STATE_X (XSize/2-7)\r\n#define CURRENT_STATE_X  (XSize/2+2)\r\n\r\n#define STATE_Y ((YSize)/2-1)\r\n\r\n\r\nvoid UPDATE_STATE(char *Text)\r\n{\r\n    _XL_PRINT(CURRENT_STATE_X,STATE_Y, Text);\r\n    _XL_PRINT(PREVIOUS_STATE_X,STATE_Y, Text);\r\n}\r\n\r\nint main(void)\r\n{        \r\n    uint8_t input;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    _XL_CLEAR_SCREEN();\r\n    \r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    \r\n    _XL_PRINT(XSize/2-6,0, \"INPUT TEST\");\r\n\r\n    _XL_PRINT(CURRENT_STATE_X,STATE_Y-2, \"CURRENT\");\r\n    _XL_PRINT(PREVIOUS_STATE_X-3,STATE_Y-2, \"PREVIOUS\");\r\n    \r\n    while(1)\r\n    {\r\n        input = _XL_INPUT();\r\n        _XL_PRINT(CURRENT_STATE_X,STATE_Y, \"     \");\r\n        \r\n        if(_XL_FIRE(input))\r\n        {\r\n            UPDATE_STATE(\"FIRE \");\r\n        }\r\n        else if(_XL_LEFT(input))\r\n        {\r\n            UPDATE_STATE(\"LEFT \");\r\n        }\r\n        else if(_XL_RIGHT(input))\r\n        {\r\n            UPDATE_STATE(\"RIGHT\");\r\n        }\r\n        else if(_XL_DOWN(input))\r\n        {\r\n            UPDATE_STATE(\"DOWN \");\r\n        }\r\n        else if(_XL_UP(input))\r\n        {\r\n            UPDATE_STATE(\"UP   \");\r\n        }\r\n\r\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n    }\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/input/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/input/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile25.txt",
    "content": "$ff,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/input/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/input/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/input/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/invaders/Makefile.invaders",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := invaders\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/invaders/config/project_config.mk",
    "content": "\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/invaders/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subxect to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"tile_aliases.h\"\r\n\r\n#if !defined(_XL_SLOW_DOWN_FACTOR)\r\n    #define _XL_SLOW_DOWN_FACTOR 0\r\n#endif\r\n\r\n#  if _XL_SLOW_DOWN_FACTOR<20\r\n    #define LEVEL_SPEED_UP 0\r\n#elif _XL_SLOW_DOWN_FACTOR<100\r\n    #define LEVEL_SPEED_UP 2\r\n#elif _XL_SLOW_DOWN_FACTOR<200\r\n    #define LEVEL_SPEED_UP 4\r\n#elif _XL_SLOW_DOWN_FACTOR<400\r\n    #define LEVEL_SPEED_UP 8\r\n#elif _XL_SLOW_DOWN_FACTOR<800\r\n    #define LEVEL_SPEED_UP 16\r\n#elif _XL_SLOW_DOWN_FACTOR<1600\r\n    #define LEVEL_SPEED_UP 32\r\n#elif _XL_SLOW_DOWN_FACTOR<3200\r\n    #define LEVEL_SPEED_UP 64\r\n#else\r\n    #define LEVEL_SPEED_UP 128\r\n#endif \r\n\r\n\r\n#define MAX_Y ((YSize)+(Y_OFFSET))\r\n\r\n#define SPACE_SHIP_Y (MAX_Y-4)\r\n\r\n\r\n#if !defined(_XL_NO_UDG)\r\n\r\n    #define draw_ship_1() \\\r\n    { \\\r\n        _XL_DRAW(ship_x/4,SPACE_SHIP_Y,SPACE_SHIP_1_W_TILE, _XL_CYAN); \\\r\n        _XL_DRAW(ship_x/4+1,SPACE_SHIP_Y,SPACE_SHIP_1_E_TILE, _XL_CYAN); \\\r\n    }\r\n\r\n\r\n    #define draw_ship_2() \\\r\n    { \\\r\n        _XL_DRAW(ship_x/4,SPACE_SHIP_Y,SPACE_SHIP_2_W_TILE, _XL_CYAN); \\\r\n        _XL_DRAW(ship_x/4+1,SPACE_SHIP_Y,SPACE_SHIP_2_E_TILE, _XL_CYAN); \\\r\n    }\r\n\r\n    #define draw_ship_3() \\\r\n    { \\\r\n        _XL_DRAW(ship_x/4,SPACE_SHIP_Y,SPACE_SHIP_3_W_TILE, _XL_CYAN); \\\r\n        _XL_DRAW(ship_x/4+1,SPACE_SHIP_Y,SPACE_SHIP_3_C_TILE, _XL_CYAN); \\\r\n        _XL_DRAW(ship_x/4+2,SPACE_SHIP_Y,SPACE_SHIP_3_E_TILE, _XL_CYAN); \\\r\n    }\r\n\r\n\r\n    #define draw_ship_4() \\\r\n    { \\\r\n        _XL_DRAW(ship_x/4,SPACE_SHIP_Y,SPACE_SHIP_4_W_TILE, _XL_CYAN); \\\r\n        _XL_DRAW(ship_x/4+1,SPACE_SHIP_Y,SPACE_SHIP_4_E_TILE, _XL_CYAN); \\\r\n    }\r\n\r\n    #define delete_at_the_right() \\\r\n    { \\\r\n        _XL_DELETE(ship_x/4+2,SPACE_SHIP_Y); \\\r\n    }\r\n\r\n    #define delete_at_the_left() \\\r\n    { \\\r\n        _XL_DELETE(ship_x/4,SPACE_SHIP_Y); \\\r\n    }\r\n\r\n#else\r\n    #define draw_ship() \\\r\n        _XL_DRAW(ship_x,SPACE_SHIP_Y,SPACE_SHIP_1_W_TILE, _XL_WHITE); \\\r\n        _XL_DRAW(ship_x+1,SPACE_SHIP_Y,SPACE_SHIP_1_E_TILE, _XL_WHITE); \\\r\n  \r\n    #define draw_ship_1() \\\r\n        draw_ship()\r\n  \r\n    #define draw_ship_2() \\\r\n        draw_ship()\r\n\r\n    #define draw_ship_3() \\\r\n        draw_ship()\r\n\r\n    #define draw_ship_4() \\\r\n        draw_ship() \r\n        \r\n    #define delete_at_the_left() \\\r\n        _XL_DELETE(ship_x-1,SPACE_SHIP_Y); \\\r\n        _XL_DELETE(ship_x,SPACE_SHIP_Y); \\\r\n\r\n        \r\n    #define delete_at_the_right() \\\r\n        _XL_DELETE(ship_x+1,SPACE_SHIP_Y);  \\\r\n        _XL_DELETE(ship_x,SPACE_SHIP_Y)\r\n\r\n#endif\r\n\r\n\r\nuint16_t x;\r\n\r\nuint8_t invader[5];\r\n\r\nuint8_t ship_x;\r\n\r\nuint8_t ship_fire;\r\n\r\n#define TOP_INVADER_Y (MAX_Y-21)\r\n#define MID_INVADER_Y (MAX_Y-19)\r\n#define LOW_INVADER_Y (MAX_Y-15)\r\n\r\n#if !defined(_XL_NO_UDG)\r\n\r\n    #define draw_mid_invader_closed(x,y) \\\r\n    { \\\r\n        _XL_DRAW(x,y,MID_INVADER_CLOSED_W_TILE, _XL_WHITE); \\\r\n        _XL_DRAW(x+1,y,MID_INVADER_CLOSED_E_TILE, _XL_WHITE); \\\r\n    }\r\n\r\n    #define draw_mid_invader_open(x,y) \\\r\n    { \\\r\n        _XL_DRAW(x,y,MID_INVADER_OPEN_W_TILE, _XL_WHITE); \\\r\n        _XL_DRAW(x+1,y,MID_INVADER_OPEN_E_TILE, _XL_WHITE); \\\r\n    }\r\n\r\n    #define delete_mid_invader(x,y) \\\r\n    { \\\r\n        _XL_DELETE(x,y); \\\r\n    }\r\n\r\n    #define draw_low_invader_open(x,y) \\\r\n    { \\\r\n        _XL_DRAW(x,y,LOW_INVADER_OPEN_W_TILE, _XL_WHITE); \\\r\n        _XL_DRAW(x+1,y,LOW_INVADER_OPEN_E_TILE, _XL_WHITE); \\\r\n    }\r\n\r\n    #define draw_low_invader_closed(x,y) \\\r\n    { \\\r\n        _XL_DRAW(x,y,LOW_INVADER_CLOSED_W_TILE, _XL_WHITE); \\\r\n        _XL_DRAW(x+1,y,LOW_INVADER_CLOSED_E_TILE, _XL_WHITE); \\\r\n    }\r\n\r\n    #define delete_low_invader(x,y) \\\r\n    { \\\r\n        _XL_DELETE(x,y); \\\r\n    }\r\n\r\n    #define draw_top_invader_closed(x,y) \\\r\n    { \\\r\n        _XL_DRAW(x,y,TOP_INVADER_CLOSED_TILE, _XL_WHITE); \\\r\n    }\r\n\r\n    #define draw_top_invader_open(x,y) \\\r\n    { \\\r\n        _XL_DRAW(x,y,TOP_INVADER_OPEN_W_TILE, _XL_WHITE); \\\r\n        _XL_DRAW(x+1,y,TOP_INVADER_OPEN_E_TILE, _XL_WHITE); \\\r\n    }\r\n\r\n    #define delete_top_invader(x,y) \\\r\n    { \\\r\n        _XL_DELETE(x,y); \\\r\n    }\r\n#else\r\n    \r\n    #define draw_top_invader_closed(x,y) \\\r\n        _XL_DRAW(x,y,TOP_INVADER_CLOSED_TILE, _XL_WHITE)\r\n\r\n    #define draw_top_invader_open(x,y) \\\r\n        _XL_DRAW(x,y,TOP_INVADER_OPEN_W_TILE, _XL_WHITE)\r\n\r\n    #define draw_mid_invader_closed(x,y) \\\r\n        _XL_DRAW(x,y,MID_INVADER_CLOSED_W_TILE, _XL_WHITE)\r\n\r\n    #define draw_mid_invader_open(x,y) \\\r\n        _XL_DRAW(x,y,MID_INVADER_OPEN_W_TILE, _XL_WHITE)\r\n\r\n    #define draw_low_invader_closed(x,y) \\\r\n        _XL_DRAW(x,y,LOW_INVADER_CLOSED_W_TILE, _XL_WHITE)\r\n\r\n    #define draw_low_invader_open(x,y) \\\r\n        _XL_DRAW(x,y,LOW_INVADER_OPEN_W_TILE, _XL_WHITE)\r\n    \r\n    #define delete_top_invader(x,y) \\\r\n        _XL_DELETE(x,y)\r\n\r\n    #define delete_mid_invader(x,y) \\\r\n        _XL_DELETE(x,y)\r\n\r\n    #define delete_low_invader(x,y) \\\r\n        _XL_DELETE(x,y)\r\n\r\n#endif\r\n\r\n\r\n#if !defined(INVADERS_PER_LINE)\r\n    #define INVADERS_PER_LINE (XSize/5)\r\n#endif\r\n#define SPACE_BETWEEN_INVADERS 2\r\n\r\n\r\n\r\n\r\nvoid redraw(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    _XL_CLEAR_SCREEN();\r\n    \r\n    for(i=0;i<INVADERS_PER_LINE*SPACE_BETWEEN_INVADERS;i+=SPACE_BETWEEN_INVADERS)\r\n    {\r\n        draw_top_invader_open(invader[4]+i,TOP_INVADER_Y);\r\n        draw_mid_invader_open(invader[3]+i,MID_INVADER_Y);\r\n        draw_mid_invader_open(invader[2]+i,MID_INVADER_Y+2);\r\n        draw_low_invader_closed(invader[1]+i,LOW_INVADER_Y);\r\n        draw_low_invader_closed(invader[0]+i,LOW_INVADER_Y+2);\r\n    }\r\n}\r\n\r\n\r\n    \r\n#if defined(__NO_INPUT)\r\n    void MOVE_PLAYER(void) {}\r\n#else\r\n    void MOVE_PLAYER(void)\r\n    {\r\n        uint8_t input = _XL_INPUT();\r\n        \r\n        if(_XL_LEFT(input))\r\n        {\r\n            delete_at_the_right();\r\n            --ship_x;\r\n        }\r\n        else if(_XL_RIGHT(input))\r\n        {\r\n            delete_at_the_left();\r\n            ++ship_x;\r\n        }\r\n        else if(_XL_FIRE(input))\r\n        {\r\n            ship_fire = 1;\r\n        }\r\n        \r\n        switch(ship_x&3)\r\n        {\r\n            case 1:\r\n                draw_ship_1();\r\n            break;\r\n            \r\n            case 2:\r\n                draw_ship_2();\r\n            break;\r\n            \r\n            case 3:\r\n                draw_ship_3();\r\n            break;\r\n            \r\n            case 0:\r\n                draw_ship_4();\r\n            break;\r\n        }\r\n    }\r\n#endif\r\n\r\n\r\n\r\nint main(void)\r\n{        \r\n\r\n    uint8_t i;\r\n    \r\n    uint8_t line_counter;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();    \r\n    \r\n    ship_x = XSize/2;\r\n    line_counter = 0;\r\n\r\n    _XL_CLEAR_SCREEN();\r\n\r\n    x = 0;\r\n    while(1)\r\n    {\r\n        for(i=0;i<5;++i)\r\n        {\r\n            invader[i] = 0;\r\n        }\r\n        redraw();\r\n        \r\n        while(invader[4]<XSize-INVADERS_PER_LINE*SPACE_BETWEEN_INVADERS)\r\n        {\r\n\r\n            MOVE_PLAYER();\r\n            if(!(x&1))\r\n            {\r\n                for(i=0;i<INVADERS_PER_LINE*SPACE_BETWEEN_INVADERS;i+=SPACE_BETWEEN_INVADERS)\r\n                {\r\n                    switch(line_counter%10)\r\n                    {\r\n                        case 4:\r\n                            delete_top_invader(invader[4]+i,TOP_INVADER_Y);\r\n                        break;\r\n                        case 3:\r\n                            delete_mid_invader(invader[3]+i,MID_INVADER_Y);\r\n                        break;\r\n                        case 2:\r\n                            delete_mid_invader(invader[2]+i,MID_INVADER_Y+2);\r\n                        break;\r\n                        case 1:\r\n                            delete_low_invader(invader[1]+i,LOW_INVADER_Y);\r\n                        break;\r\n                        case 0:\r\n                            delete_low_invader(invader[0]+i,LOW_INVADER_Y+2);\r\n                        break;\r\n                    }\r\n                }\r\n                \r\n                if(line_counter%10<5)\r\n                {\r\n                    ++invader[line_counter%5];\r\n                }\r\n                \r\n                for(i=0;i<INVADERS_PER_LINE*SPACE_BETWEEN_INVADERS;i+=SPACE_BETWEEN_INVADERS)\r\n                {\r\n                    switch(line_counter%10)\r\n                    {\r\n                        case 4:\r\n                            draw_top_invader_closed(invader[4]+i,TOP_INVADER_Y);\r\n                        break;\r\n                        case 3:\r\n                            draw_mid_invader_closed(invader[3]+i,MID_INVADER_Y);\r\n                        break;\r\n                        case 2:\r\n                            draw_mid_invader_closed(invader[2]+i,MID_INVADER_Y+2);\r\n                        break;\r\n                        case 1:\r\n                            draw_low_invader_open(invader[1]+i,LOW_INVADER_Y);\r\n                        break;\r\n                        case 0:\r\n                            draw_low_invader_open(invader[0]+i,LOW_INVADER_Y+2);\r\n                        break;\r\n                    }\r\n                }\r\n                ++line_counter;\r\n                if(line_counter==250)\r\n                {\r\n                    line_counter=0;\r\n                }\r\n            }\r\n            \r\n            _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/8);\r\n            \r\n            if(x&1)\r\n            {\r\n                for(i=0;i<INVADERS_PER_LINE*SPACE_BETWEEN_INVADERS;i+=SPACE_BETWEEN_INVADERS)\r\n                {\r\n                    switch(line_counter%10)\r\n                    {\r\n                        case 9:\r\n                            draw_top_invader_open(invader[4]+i,TOP_INVADER_Y);\r\n                        break;\r\n                        case 8:\r\n                            draw_mid_invader_open(invader[3]+i,MID_INVADER_Y);\r\n                        break;\r\n                        case 7:\r\n                            draw_mid_invader_open(invader[2]+i,MID_INVADER_Y+2);\r\n                        break;\r\n                        case 6:\r\n                            draw_low_invader_closed(invader[1]+i,LOW_INVADER_Y);\r\n                        break;\r\n                        case 5:\r\n                            draw_low_invader_closed(invader[0]+i,LOW_INVADER_Y+2);\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            ++x;\r\n        }\r\n        \r\n    }\r\n\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/invaders/tile_aliases.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#include \"cross_lib.h\"\n\n    // Unused: 4,8,9,10, 17,$(25),-(26)\n    \n    #define SPACE_SHIP_1_W_TILE _TILE_0\n    #define SPACE_SHIP_1_E_TILE _TILE_1\n    \n    #define SPACE_SHIP_2_W_TILE _TILE_2\n    #define SPACE_SHIP_2_E_TILE _TILE_3\n\n    #define SPACE_SHIP_3_W_TILE _TILE_19\n    #define SPACE_SHIP_3_C_TILE _TILE_20\n    #define SPACE_SHIP_3_E_TILE _TILE_21\n\n    #define SPACE_SHIP_4_W_TILE _TILE_22\n    #define SPACE_SHIP_4_E_TILE _TILE_23\n\n    #define MID_INVADER_CLOSED_W_TILE _TILE_11\n    #define MID_INVADER_CLOSED_E_TILE _TILE_14\n\n    #define MID_INVADER_OPEN_W_TILE _TILE_15\n    #define MID_INVADER_OPEN_E_TILE _TILE_16\n    \n    #define LOW_INVADER_CLOSED_W_TILE _TILE_7\n    #define LOW_INVADER_CLOSED_E_TILE _TILE_24\n\n    #define LOW_INVADER_OPEN_W_TILE _TILE_12\n    #define LOW_INVADER_OPEN_E_TILE _TILE_13\n\n    #define TOP_INVADER_OPEN_W_TILE _TILE_5\n    #define TOP_INVADER_OPEN_E_TILE _TILE_6\n\n    #define TOP_INVADER_CLOSED_TILE _TILE_18\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile0.txt",
    "content": "1,0,6,3,3,1,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile1.txt",
    "content": "12,6,51,25,31,15,1,3"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile10.txt",
    "content": "33,33,45,63,30,30,30,12"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile11.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile12.txt",
    "content": "0,0,0,0,0,33,33,45"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile13.txt",
    "content": "63,30,30,30,12,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile14.txt",
    "content": "0,59,41,41,57,33,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile15.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile16.txt",
    "content": "0,46,8,4,2,14,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile17.txt",
    "content": "0,0,0,0,48,56,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile18.txt",
    "content": "0,0,0,0,0,18,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile19.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile2.txt",
    "content": "0,0,0,32,62,63,32,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile20.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile21.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile22.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile23.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile24.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile3.txt",
    "content": "32,48,24,12,63,63,12,24"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile4.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile5.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile6.txt",
    "content": "0,21,21,29,21,21,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile7.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile8.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x8/tile9.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile0.txt",
    "content": "1,0,6,3,3,1,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile1.txt",
    "content": "12,6,51,25,31,15,1,3,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile10.txt",
    "content": "0,33,33,45,63,30,30,30,12"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile11.txt",
    "content": "31,19,31,19,31,25,31,25,31"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile12.txt",
    "content": "0,0,0,0,0,0,33,33,45"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile13.txt",
    "content": "63,30,30,30,12,0,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile14.txt",
    "content": "0,59,41,41,57,33,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile15.txt",
    "content": "63,41,63,37,63,41,63,37,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile16.txt",
    "content": "0,46,8,4,2,14,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile17.txt",
    "content": "0,0,0,0,48,56,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile18.txt",
    "content": "0,0,0,0,0,0,18,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile19.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile2.txt",
    "content": "0,0,0,32,62,63,32,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile20.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile21.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile22.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile23.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile24.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile3.txt",
    "content": "32,48,24,12,63,63,12,24,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile4.txt",
    "content": "31,21,31,21,31,21,31,21,31"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile5.txt",
    "content": "63,49,63,35,63,49,63,35,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile6.txt",
    "content": "0,21,21,29,21,21,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile7.txt",
    "content": "63,45,63,45,63,45,63,45,63"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile8.txt",
    "content": "63,63,36,9,63,63,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/6x9/tile9.txt",
    "content": "0,37,37,37,37,50,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile0.txt",
    "content": "1,0,6,3,3,1,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile1.txt",
    "content": "12,6,51,25,31,15,1,3"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile10.txt",
    "content": "33,33,45,63,30,30,30,12"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile11.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile12.txt",
    "content": "0,0,0,0,0,33,33,45"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile13.txt",
    "content": "63,30,30,30,12,0,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile14.txt",
    "content": "0,59,41,41,57,33,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile15.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile16.txt",
    "content": "0,46,8,4,2,14,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile17.txt",
    "content": "0,0,0,0,48,56,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile18.txt",
    "content": "0,0,0,0,0,18,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile19.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile2.txt",
    "content": "0,0,0,32,62,63,32,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile20.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile21.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile22.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile23.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile24.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile3.txt",
    "content": "32,48,24,12,63,63,12,24"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile4.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile5.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile6.txt",
    "content": "0,21,21,29,21,21,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile7.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile8.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/7x8/tile9.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile0.txt",
    "content": "1,3,3,31,63,63,63,63"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile1.txt",
    "content": "0,128,128,240,248,248,248,248"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile10.txt",
    "content": "66,66,90,126,60,60,60,24"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile11.txt",
    "content": "32,17,63,110,255,191,160,27"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile12.txt",
    "content": "15,127,255,230,255,25,54,192"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile13.txt",
    "content": "0,224,240,112,240,128,192,48"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile14.txt",
    "content": "128,0,128,192,224,160,160,0"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile15.txt",
    "content": "2,9,11,14,15,7,2,4"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile16.txt",
    "content": "8,18,250,238,254,252,8,4"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile17.txt",
    "content": "0,0,0,0,224,240,0,0"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile18.txt",
    "content": "24,60,126,219,255,90,129,66"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile19.txt",
    "content": "0,0,0,1,3,3,3,3"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile2.txt",
    "content": "0,0,0,7,15,15,15,15"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile20.txt",
    "content": "16,56,56,255,255,255,255,255"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,128,128,128,128"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile22.txt",
    "content": "4,14,14,127,255,255,255,255"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile23.txt",
    "content": "0,0,0,192,224,224,224,224"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile24.txt",
    "content": "240,254,255,103,255,156,102,12"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile3.txt",
    "content": "64,224,224,252,254,254,254,254"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile4.txt",
    "content": "64,224,224,252,254,254,254,254"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile5.txt",
    "content": "1,3,7,13,15,2,5,10"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile6.txt",
    "content": "128,192,224,176,240,64,160,80"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile7.txt",
    "content": "0,7,15,14,15,3,6,3"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile8.txt",
    "content": "255,255,255,192,129,255,255,255"
  },
  {
    "path": "src/examples/invaders/tiles/8x8/tile9.txt",
    "content": "37,37,37,37,37,37,50,0"
  },
  {
    "path": "src/examples/invaders/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n// Plane\r\n#define _TILE_1 '-'\r\n#define _TILE_2 '>'\r\n\r\n// Animated plane\r\n#define _TILE_0 '='\r\n#define _TILE_3 _TILE_1\r\n#define _TILE_17 _TILE_2\r\n\r\n#define _TILE_6  'H'\r\n#define _TILE_9  'L'\r\n#define _TILE_14 'S'\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_10 'O'\r\n\r\n\r\n#define _TILE_13 _TILE_10\r\n\r\n#define _TILE_18 '~'\r\n\r\n#define _TILE_8 '='\r\n\r\n#define _TILE_26 'A'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/matrix/Makefile.matrix",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := matrix\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/matrix/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n#CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/matrix/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"tile_aliases.h\"\r\n\r\n#if ((YSize)+(Y_OFFSET)-19)>=1\r\n    #define MAX_INIT_Y_POS ((YSize)+(Y_OFFSET)-19)\r\n#else\r\n    #define MAX_INIT_Y_POS 1\r\n#endif\r\n\r\n#if ((YSize)+(Y_OFFSET)-1)>19\r\n    #define MAX_TILES 19\r\n#else\r\n    #define MAX_TILES ((YSize)+(Y_OFFSET)-1)\r\n#endif\r\n\r\n\r\nstatic const uint8_t tiles[19] = {\r\n        PLAYER_DOWN_TILE, PLAYER_UP_TILE, PLAYER_RIGHT_TILE, PLAYER_LEFT_TILE, \r\n        GHOST_TILE, BOMB_TILE, DEAD_GHOST_TILE, SKULL_TILE, \r\n        CALM_DOWN_TILE, FIRE_POWER_TILE, BULLET_TILE, VERTICAL_BRICK_TILE, \r\n        HORIZONTAL_BRICK_TILE, LEFT_HORIZONTAL_MISSILE_TILE, RIGHT_HORIZONTAL_MISSILE_TILE, ROCKET_TILE, \r\n        FREEZE_TILE, SUPER_TILE, INVINCIBILITY_TILE\r\n        };\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t tile_colors[19] = {\r\n        _XL_CYAN, _XL_CYAN, _XL_CYAN, _XL_CYAN, \r\n        _XL_WHITE, _XL_RED, _XL_RED, _XL_YELLOW, \r\n        _XL_GREEN, _XL_YELLOW, _XL_WHITE, _XL_YELLOW, \r\n        _XL_YELLOW, _XL_WHITE, _XL_WHITE, _XL_WHITE, \r\n        _XL_CYAN, _XL_RED, _XL_YELLOW\r\n        };\r\n#endif\r\n\r\n\r\nint main(void)\r\n{        \r\n    uint8_t i;\r\n    uint8_t j;\r\n    uint8_t init_y;\r\n    uint8_t max_j;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    _XL_INIT_INPUT();\r\n    \r\n    while(1)\r\n    {\r\n        _XL_CLEAR_SCREEN();\r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n        _XL_PRINT(4,0, _XL_P _XL_R _XL_E _XL_S _XL_S _XL_SPACE _XL_F _XL_I _XL_R _XL_E);\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_CLEAR_SCREEN();\r\n        while(1)\r\n        {\r\n            i = (uint8_t) (_XL_RAND() % XSize);   \r\n            max_j = (uint8_t) (_XL_RAND() % (MAX_TILES+1));\r\n            init_y = (uint8_t) (_XL_RAND() % MAX_INIT_Y_POS);\r\n            for(j=0;j<max_j;++j)\r\n            {\r\n                _XL_DRAW(i,j+init_y,tiles[j],tile_colors[j]);\r\n                _XL_SLOW_DOWN(900);\r\n            }\r\n        }\r\n    } \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/matrix/tile_aliases.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n\n#include \"cross_lib.h\"\n\n\n    #define PLAYER_DOWN_TILE _TILE_0\n    #define PLAYER_UP_TILE _TILE_1\n    #define PLAYER_RIGHT_TILE _TILE_2\n    #define PLAYER_LEFT_TILE _TILE_3\n\n    #define GHOST_TILE _TILE_4\n    #define BOMB_TILE _TILE_5\n\n    #define DEAD_GHOST_TILE _TILE_6\n    #define SKULL_TILE _TILE_7\n\n    #define CALM_DOWN_TILE _TILE_8\n    \n    #define FIRE_CHARGE_TILE _TILE_\n    #define FIRE_POWER_TILE _TILE_9\n    #define INVINCIBILITY_TILE _TILE_10\n    #define BULLET_TILE _TILE_11\n\n    #define HORIZONTAL_BRICK_TILE _TILE_12\n    #define VERTICAL_BRICK_TILE _TILE_13\n\n\n    #define LEFT_HORIZONTAL_MISSILE_TILE _TILE_14\n    #define RIGHT_HORIZONTAL_MISSILE_TILE _TILE_15\n\n    #define ROCKET_TILE _TILE_16\n\n    #define FREEZE_TILE _TILE_17\n    #define SUPER_TILE _TILE_18\n\n    #define EXTRA_POINTS_TILE _TILE__DOLLAR_TILE\n\n#endif // _IMaGES_H\n\n"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile1.txt",
    "content": "12,30,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile12.txt",
    "content": "12,12,28,12,12,14,12,12"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile19.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile2.txt",
    "content": "12,22,12,62,13,12,20,20"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile20.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile21.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile22.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile23.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile3.txt",
    "content": "12,26,12,31,44,12,10,10"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile4.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile5.txt",
    "content": "30,33,51,45,45,51,33,30"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile6.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile7.txt",
    "content": "30,33,51,33,33,18,18,12"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/examples/matrix/tiles/6x8/tile9.txt",
    "content": "33,18,12,26,22,12,18,33"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,51,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile1.txt",
    "content": "12,30,12,51,45,12,18,51,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0, 0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile12.txt",
    "content": "12,12,28,12,12,14,12,12, 12"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile16.txt",
    "content": "12,30,30,30,63,45,33,33,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile17.txt",
    "content": "0,30,51,55,51,22,20,12,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile18.txt",
    "content": "0,30,43,43,35,42,30,12,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile19.txt",
    "content": "31,21,31,21,31,21,31,21,31"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile2.txt",
    "content": "12,22,12,62,13,12,20,20,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile20.txt",
    "content": "63,49,63,35,63,49,63,35,63"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile21.txt",
    "content": "63,45,63,45,63,45,63,45,63"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile22.txt",
    "content": "63,63,36,9,63,63,0,0,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile23.txt",
    "content": "31,19,31,19,31,25,31,25,31"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile24.txt",
    "content": "63,41,63,37,63,41,63,37,63"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile3.txt",
    "content": "12,26,12,31,44,12,10,10,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile4.txt",
    "content": "12,30,63,45,30,12,30,51,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile5.txt",
    "content": "30,33,51,45,45,51,33,30,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile6.txt",
    "content": "12,30,63,45,30,12,30,51,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile7.txt",
    "content": "30,33,51,33,33,18,18,12,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile8.txt",
    "content": "0,30,51,55,51,26,18,12,0"
  },
  {
    "path": "src/examples/matrix/tiles/6x9/tile9.txt",
    "content": "33,18,12,26,22,12,18,33,0"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile1.txt",
    "content": "12,30,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile12.txt",
    "content": "12,12,28,12,12,14,12,12"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile19.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile2.txt",
    "content": "12,22,12,62,13,12,20,20"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile20.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile21.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile22.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile23.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile3.txt",
    "content": "12,26,12,31,44,12,10,10"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile4.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile5.txt",
    "content": "30,33,51,45,45,51,33,30"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile6.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile7.txt",
    "content": "30,33,51,33,33,18,18,12"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/examples/matrix/tiles/7x8/tile9.txt",
    "content": "33,18,12,26,22,12,18,33"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,102"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile1.txt",
    "content": "24, 60, 24,102,153, 24, 36,102"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile10.txt",
    "content": "24, 36, 24,  0,153,  0, 36,102"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile11.txt",
    "content": "0,  0,  8, 56, 28, 16,  0,  0"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile12.txt",
    "content": "24, 24, 24, 48, 24, 12, 24, 24"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,255,  0,  0,  0,  0"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile14.txt",
    "content": "0,  0,240, 63, 63,240,  0,  0"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile15.txt",
    "content": "0,  0, 15,252,252, 15,  0,  0"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile16.txt",
    "content": "24, 60, 60, 60,126, 90, 66, 66"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile17.txt",
    "content": "0,60,66,207,195,102,36,24"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile18.txt",
    "content": "0,60,90,219,195,90,60,24"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile19.txt",
    "content": "126,90,126,90,126,90,126,90"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile2.txt",
    "content": "24, 52, 25,118,152, 24, 20, 20"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile20.txt",
    "content": "0,0,0,0,0,170,255,255"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile21.txt",
    "content": "255,153,255,153,255,153,255,153"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile22.txt",
    "content": "255,255,255,192,129,255,255,255"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile23.txt",
    "content": "126,102,126,102,126,102,126,102"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile24.txt",
    "content": "255,165,255,165,255,165,255,165"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile3.txt",
    "content": "24, 44,152,110, 25, 24, 40, 40"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile4.txt",
    "content": "60,126,255,153,126,60,126,219"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile5.txt",
    "content": "60, 66,165,153,153,165, 66, 60"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile6.txt",
    "content": "189,126,255,153,126,60,126,219"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile7.txt",
    "content": "60, 66,165,129, 90, 36, 36, 60"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile8.txt",
    "content": "0, 60, 102,223,231,122, 36, 24"
  },
  {
    "path": "src/examples/matrix/tiles/8x8/tile9.txt",
    "content": "129,66,24,52,44,24,66,129"
  },
  {
    "path": "src/examples/matrix/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define _TILE_0 (unsigned char) '0'\r\n#define _TILE_1 (unsigned char) '1'\r\n\r\n#define _TILE_2 (unsigned char) '2'\r\n\r\n#define _TILE_3 (unsigned char) '3'\r\n\r\n// Apple\r\n#define _TILE_4 (unsigned char) '4'\r\n\r\n// Body\r\n#define _TILE_5 (unsigned char) '5'\r\n\r\n#define _TILE_6 (unsigned char) '6'\r\n\r\n#define _TILE_7 (unsigned char) '7'\r\n\r\n#define _TILE_8 (unsigned char) '8'\r\n\r\n#define _TILE_9 (unsigned char) '9'\r\n\r\n#define _TILE_10 (unsigned char) 'A'\r\n\r\n#define _TILE_11 (unsigned char) 'B'\r\n#define _TILE_12 (unsigned char) 'C'\r\n\r\n#define _TILE_13 (unsigned char) 'D'\r\n\r\n#define _TILE_14 (unsigned char) 'E'\r\n\r\n#define _TILE_15 (unsigned char) 'F'\r\n\r\n#define _TILE_16 (unsigned char) 'G'\r\n\r\n#define _TILE_17 (unsigned char) 'H'\r\n\r\n#define _TILE_18 (unsigned char) 'I'\r\n\r\n#define _TILE_19 (unsigned char) 'J'\r\n\r\n#define _TILE_20 (unsigned char) 'K'\r\n\r\n#define _TILE_21 (unsigned char) 'L'\r\n\r\n#define _TILE_22 (unsigned char) 'M'\r\n\r\n#define _TILE_23 (unsigned char) 'N'\r\n\r\n#define _TILE_24 (unsigned char) 'O'\r\n\r\n#define _TILE_25 'P'\r\n\r\n//#define _TILE_25 '$'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/numbers/Makefile.numbers",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := numbers\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/numbers/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n\r\n"
  },
  {
    "path": "src/examples/numbers/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define MAX_1_DIGIT_NUMBER 9\r\n#define MAX_2_DIGIT_NUMBER 99\r\n#define MAX_3_DIGIT_NUMBER 999\r\n#define MAX_4_DIGIT_NUMBER 5000\r\n#define MAX_5_DIGIT_NUMBER 20000\r\n\r\nint main(void)\r\n{        \r\n    uint16_t i;\r\n    uint8_t j;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_INPUT();\r\n\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n\r\n    for(j=0;j<3;++j)\r\n    {\r\n        _XL_CLEAR_SCREEN();\r\n        \r\n        for(i=0;i<=MAX_1_DIGIT_NUMBER;++i)\r\n        {\r\n            _XL_PRINTD(XSize/2-3,2,1,i);\r\n        }\r\n        for(i=0;i<=MAX_2_DIGIT_NUMBER;++i)\r\n        {\r\n            _XL_PRINTD(XSize/2-3,4,2,i);\r\n        }\r\n        for(i=0;i<=MAX_3_DIGIT_NUMBER;++i)\r\n        {\r\n            _XL_PRINTD(XSize/2-3,6,3,i);\r\n        }      \r\n        for(i=0;i<=MAX_4_DIGIT_NUMBER;i+=5)\r\n        {\r\n            _XL_PRINTD(XSize/2-3,8,4,i);\r\n        }\r\n        i=0;\r\n        while(i<MAX_5_DIGIT_NUMBER)\r\n        {\r\n            i+=_XL_RAND()&0xFF;\r\n            if(i>MAX_5_DIGIT_NUMBER)\r\n            {\r\n                i=MAX_5_DIGIT_NUMBER;\r\n            }\r\n            _XL_PRINTD(XSize/2-3,10,5,i);\r\n        }\r\n                \r\n        _XL_WAIT_FOR_INPUT();\r\n    }\r\n    \r\n    _XL_CLEAR_SCREEN();\r\n    \r\n    _XL_PRINT((XSize-11)/2,YSize/2,\"END OF DEMO\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/numbers/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile25.txt",
    "content": "$7f,$3e,$60,$3c,$06,$7c,$18,$7f"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/numbers/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/numbers/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/numbers/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/palette/Makefile.palette",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := palette\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/palette/config/project_config.mk",
    "content": "\r\n4COLOR_PALETTE=-D__USE_GREEN\r\n#-D__USE_GREEN\r\n\r\n5COLOR_PALETTE= -D__USE_GREEN_YELLOW\r\n#-D__USE_CYAN_YELLOW\r\n#-D__USE_GREEN_YELLOW\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n#CC6303\r\n_MC10_SLOWDOWN=14\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n"
  },
  {
    "path": "src/examples/palette/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define NUMBER_OF_COLORS 7\r\n#define MAX_STRING_SIZE 10\r\n\r\nconst uint8_t tile[] = {\r\n\t\t_TILE_0, _TILE_1, _TILE_2, _TILE_3, \r\n\t\t_TILE_4, _TILE_5, _TILE_6, _TILE_7, \r\n\t\t_TILE_8, _TILE_9, _TILE_10, _TILE_11, \r\n\t\t_TILE_12, _TILE_13, _TILE_14, _TILE_15, \r\n\t\t_TILE_16, _TILE_17, _TILE_18, _TILE_19,\r\n\t\t_TILE_20, _TILE_21, _TILE_22, _TILE_23, \r\n\t\t_TILE_24, _TILE_25, _TILE_26\r\n\t\t};\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t color_code[NUMBER_OF_COLORS] = \r\n    {_XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE, _XL_MAGENTA};\r\n\r\n#endif\r\n\r\n\r\n#if XSize>=38\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"WHITE   \", \r\n                                \"RED     \", \r\n                                \"CYAN    \", \r\n                                \"GREEN   \", \r\n                                \"YELLOW  \", \r\n                                \"BLUE    \", \r\n                                \"MAGENTA \",\r\n                                };\r\n    #define NAME_SIZE 7\r\n#else\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"WH \", \r\n                                \"RE \", \r\n                                \"CY \", \r\n                                \"GR \", \r\n                                \"YE \", \r\n                                \"BL \", \r\n                                \"MA \",\r\n                                };\r\n    #define NAME_SIZE 2\r\n#endif\r\n\r\n#if YSize<=9\r\n    #define SHORT_X_OFFSET 4\r\n    #define SHOOT_Y_OFFSET 8\r\n#elif YSize<=14\r\n\r\n    #define SHORT_X_OFFSET 5\r\n    #define SHOOT_Y_OFFSET 5\r\n#else\r\n    #define SHORT_X_OFFSET 0\r\n    #define SHOOT_Y_OFFSET 0\r\n#endif\r\n\r\n\r\n#if _XL_NUMBER_OF_TILES>=XSize-NAME_SIZE\r\n    #define DISPLAYED_TILES (XSize-NAME_SIZE-1)-SHORT_X_OFFSET\r\n    #define OFFSET (NAME_SIZE+1)\r\n#else\r\n    #define DISPLAYED_TILES _XL_NUMBER_OF_TILES\r\n    #define OFFSET (NAME_SIZE+1)\r\n#endif\r\n\r\n\r\n\r\n\r\nint main(void)\r\n{        \r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_SOUND();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    // for(;;)\r\n    // {\r\n        _XL_CLEAR_SCREEN();\r\n\r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n            \r\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n            \r\n            // _XL_PRINT(0,0,\"SET COLOR \");\r\n            \r\n\r\n\r\n            \r\n            #if XSize>=16 && YSize>=15\r\n                _XL_PRINT(XSize-1-1,0,\"TX\");\r\n                _XL_PRINT(XSize-1-1,3,\"CL\");\r\n                #if defined(_XL_NO_TEXT_COLOR)\r\n                    _XL_PRINT(XSize-1-2,1,\"OFF\");\r\n                #else\r\n                    _XL_PRINT(XSize-1-1,1,\"ON\");\r\n                #endif\r\n                #if defined(_XL_NO_COLOR)\r\n                    _XL_PRINT(XSize-1-2, 4,\"OFF\");\r\n                #else\r\n                    _XL_PRINT(XSize-1-1, 4,\"ON\");\r\n                #endif \r\n            #endif\r\n            _XL_SET_TEXT_COLOR(color_code[j]);\r\n            \r\n            _XL_PRINT(0,0+j, (char *) color_name[j]);\r\n            _XL_PRINT(NAME_SIZE+1,0+j,\"0123456789\");\r\n            \r\n        }\r\n        \r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n        \r\n            _XL_SET_TEXT_COLOR(color_code[j]);\r\n            _XL_PRINT(0+SHORT_X_OFFSET,NUMBER_OF_COLORS+1+j-SHOOT_Y_OFFSET, (char *) color_name[j]);\r\n            for(i=0;i<DISPLAYED_TILES;++i)\r\n            {   \r\n                _XL_DRAW(OFFSET+i+SHORT_X_OFFSET,NUMBER_OF_COLORS+1+j-SHOOT_Y_OFFSET,tile[i],color_code[j]);   \r\n\r\n            }       \r\n        }\r\n        \r\n\r\n    // }\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/examples/palette/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/examples/palette/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/examples/palette/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape10.txt",
    "content": "........\r\n.#....#.\r\n##...#.#\r\n.#...#.#\r\n.#...#.#\r\n.#...#.#\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape11.txt",
    "content": "........\r\n.#....#.\r\n##...##.\r\n.#....#.\r\n.#....#.\r\n.#....#.\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape12.txt",
    "content": "........\r\n.#....##\r\n##...#.#\r\n.#.....#\r\n.#....#.\r\n.#...#..\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape13.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape14.txt",
    "content": "........\r\n.#...#.#\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape15.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape16.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape17.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#....#.\r\n.#....#.\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape18.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape19.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape20.txt",
    "content": "........\r\n.##...#.\r\n#.#..#.#\r\n..#..#.#\r\n.#...#.#\r\n#....#.#\r\n###...#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape21.txt",
    "content": "........\r\n.##...#.\r\n#.#..##.\r\n..#...#.\r\n.#....#.\r\n#.....#.\r\n###..###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape22.txt",
    "content": "........\r\n.##...##\r\n#.#..#.#\r\n..#....#\r\n.#....#.\r\n#....#..\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape23.txt",
    "content": "........\r\n.##..###\r\n#.#....#\r\n..#....#\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape24.txt",
    "content": "........\r\n.##..#.#\r\n#.#..#.#\r\n..#..#.#\r\n.#...###\r\n#......#\r\n###....#\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape25.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape26.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#....#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/examples/palette/shapes/8x8/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/examples/palette/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/examples/palette/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/examples/palette/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile0.txt",
    "content": "0,66,165,165,165,165,66,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile1.txt",
    "content": "0,66,166,162,162,162,71,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile10.txt",
    "content": "0,66,197,69,69,69,226,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile11.txt",
    "content": "0,66,198,66,66,66,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile12.txt",
    "content": "0,67,197,65,66,68,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile13.txt",
    "content": "0,71,193,65,71,65,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile14.txt",
    "content": "0,69,197,69,71,65,225,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile15.txt",
    "content": "0,71,196,68,71,65,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile16.txt",
    "content": "0,71,196,68,71,69,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile17.txt",
    "content": "0,71,193,65,66,66,226,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile18.txt",
    "content": "0,71,197,69,71,69,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile19.txt",
    "content": "0,71,197,69,71,65,225,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile2.txt",
    "content": "0,67,165,161,162,164,71,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile20.txt",
    "content": "0,98,165,37,69,133,226,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile21.txt",
    "content": "0,98,166,34,66,130,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile22.txt",
    "content": "0,99,165,33,66,132,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile23.txt",
    "content": "0,103,161,33,71,129,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile24.txt",
    "content": "0,101,165,37,71,129,225,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile25.txt",
    "content": "0,103,164,36,71,129,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile26.txt",
    "content": "0,103,164,36,71,133,231,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile3.txt",
    "content": "0,71,161,161,167,161,71,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile4.txt",
    "content": "0,69,165,165,167,161,65,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile5.txt",
    "content": "0,71,164,164,167,161,71,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile6.txt",
    "content": "0,71,164,164,167,165,71,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile7.txt",
    "content": "0,71,161,161,162,162,66,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile8.txt",
    "content": "0,71,165,165,167,165,71,0"
  },
  {
    "path": "src/examples/palette/tiles/8x8/tile9.txt",
    "content": "0,71,165,165,167,161,65,0"
  },
  {
    "path": "src/examples/palette/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/random/Makefile.random",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := random\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/random/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n"
  },
  {
    "path": "src/examples/random/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\nuint8_t random_colors[] = { _XL_WHITE, _XL_RED, _XL_GREEN, _XL_YELLOW };\r\n\r\nint main(void)\r\n{        \r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    _XL_INIT_INPUT();\r\n\r\n    for(j=0;j<9;++j)\r\n    {\r\n        _XL_CLEAR_SCREEN();        \r\n        for(i=1;i<YSize-2;i+=2)\r\n        {\r\n            _XL_SET_TEXT_COLOR(random_colors[_XL_RAND()&3]);\r\n            _XL_PRINTD(XSize/2-3,i,5,_XL_RAND());\r\n        }\r\n        _XL_WAIT_FOR_INPUT();\r\n    }\r\n    \r\n    _XL_CLEAR_SCREEN(); \r\n    _XL_PRINT((XSize-11)/2,YSize/2,\"END OF DEMO\");\r\n\r\n    while(1){};\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/random/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/random/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile25.txt",
    "content": "$7f,$3e,$60,$3c,$06,$7c,$18,$7f"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/random/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/random/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/random/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/sleep/Makefile.sleep",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := sleep\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/sleep/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n"
  },
  {
    "path": "src/examples/sleep/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define COL_OFFSET ((XSize)/2-9)\r\n\r\n#define ITERATIONS 1\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - (uint8_t) strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\n\r\n\r\nint main(void)\r\n{        \r\n    uint16_t i;\r\n    uint8_t j;\r\n    uint8_t k;\r\n    uint8_t m;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_INPUT();\r\n\r\n\r\n    for(j=1;j<5;++j)\r\n    {\r\n        _XL_CLEAR_SCREEN();\r\n        \r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n        \r\n        _XL_PRINT(COL_OFFSET     ,1,\"PAUSE\");\r\n        _XL_PRINTD(COL_OFFSET+7  ,1,1, j);\r\n        _XL_PRINT(COL_OFFSET+10  ,1,\"SECONDS\");\r\n        \r\n        PRINT_CENTERED_ON_ROW(3,\"PRESS FIRE\");\r\n\r\n        _XL_WAIT_FOR_INPUT();\r\n\r\n        PRINT_CENTERED_ON_ROW(3,\"          \");\r\n\r\n        _XL_PRINT(COL_OFFSET     ,5,\"PAUSING\");\r\n\r\n        _XL_SLEEP(j);\r\n        \r\n        _XL_PRINT(COL_OFFSET     ,YSize-3,\"END OF PAUSE\");\r\n\r\n        PRINT_CENTERED_ON_ROW(YSize-1,\"PRESS FIRE\");\r\n        \r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n        _XL_CLEAR_SCREEN();\r\n        \r\n        i = j*_XL_SLOW_DOWN_FACTOR;\r\n\r\n        _XL_PRINT(COL_OFFSET     ,1,\"PAUSE\");\r\n        _XL_PRINTD(COL_OFFSET+7  ,1,5, i);\r\n        _XL_PRINT(COL_OFFSET+14  ,1,\"STEPS\");\r\n        \r\n        PRINT_CENTERED_ON_ROW(3,\"PRESS FIRE\");\r\n        \r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n        PRINT_CENTERED_ON_ROW(3,\"          \");\r\n        \r\n        _XL_PRINT(COL_OFFSET     ,5,\"PAUSING\");\r\n        \r\n        for(m=0;m<ITERATIONS;++m)\r\n        {\r\n            for(k=1+XSize/5;k<XSize-1-XSize/5;++k)\r\n            {\r\n                _XL_DRAW(k,7+m,_TILE_0,_XL_WHITE);\r\n                _XL_SLOW_DOWN(i);\r\n            }\r\n        }\r\n        \r\n        _XL_PRINT(COL_OFFSET     ,YSize-3,\"END OF PAUSE\");\r\n        \r\n        PRINT_CENTERED_ON_ROW(YSize-1,\"PRESS FIRE\");\r\n\r\n        _XL_WAIT_FOR_INPUT();\r\n\r\n    }\r\n    _XL_PRINT(COL_OFFSET,YSize-5, \"END OF DEMO\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/sleep/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile25.txt",
    "content": "$7f,$3e,$60,$3c,$06,$7c,$18,$7f"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/sleep/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/sleep/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/sleep/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/sounds/Makefile.sounds",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := sounds\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/sounds/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n"
  },
  {
    "path": "src/examples/sounds/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if YSize<=15\r\n    #define LINE_SKIP 1\r\n#else\r\n    #define LINE_SKIP 2\r\n#endif    \r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - (uint8_t) strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\n\r\nint main(void)\r\n{        \r\n    uint8_t k;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    _XL_INIT_SOUND();\r\n\r\n    for(k=0;k<3;++k)\r\n    {\r\n\r\n        _XL_CLEAR_SCREEN();\r\n        \r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n        PRINT_CENTERED_ON_ROW(0, \"SOUND\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n        #if defined(_XL_NO_SOUND)\r\n            _XL_PRINT(XSize-1-9,YSize-1,\"SOUND OFF\");\r\n        #else\r\n            _XL_PRINT(XSize-1-8,YSize-1,\"SOUND ON\");\r\n        #endif\r\n\r\n        PRINT_CENTERED_ON_ROW(1+1*LINE_SKIP, \"PING\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_PING_SOUND();\r\n        _XL_WAIT_FOR_INPUT();\r\n\r\n        PRINT_CENTERED_ON_ROW(1+2*LINE_SKIP, \"TICK\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_TOCK_SOUND();\r\n        _XL_WAIT_FOR_INPUT();\r\n\r\n        PRINT_CENTERED_ON_ROW(1+3*LINE_SKIP, \"TOCK\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_TICK_SOUND();\r\n        _XL_WAIT_FOR_INPUT();\r\n     \r\n        PRINT_CENTERED_ON_ROW(1+4*LINE_SKIP, \"ZAP\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_ZAP_SOUND();\r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n        PRINT_CENTERED_ON_ROW(1+5*LINE_SKIP, \"SHOOT\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_SHOOT_SOUND();\r\n        _XL_WAIT_FOR_INPUT();\r\n\r\n        PRINT_CENTERED_ON_ROW(1+6*LINE_SKIP, \"EXPLOSION\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_EXPLOSION_SOUND();\r\n        _XL_WAIT_FOR_INPUT();\r\n\r\n    }\r\n    PRINT_CENTERED_ON_ROW(YSize-3, \"END OF TEST\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/sounds/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile25.txt",
    "content": "$ff,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/sounds/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/sounds/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/sounds/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define _TILE_0 (unsigned char) '0'\r\n#define _TILE_1 (unsigned char) '1'\r\n\r\n#define _TILE_2 (unsigned char) '2'\r\n\r\n#define _TILE_3 (unsigned char) '3'\r\n\r\n// Apple\r\n#define _TILE_4 (unsigned char) '4'\r\n\r\n// Body\r\n#define _TILE_5 (unsigned char) '5'\r\n\r\n#define _TILE_6 (unsigned char) '6'\r\n\r\n#define _TILE_7 (unsigned char) '7'\r\n\r\n#define _TILE_8 (unsigned char) '8'\r\n\r\n#define _TILE_9 (unsigned char) '9'\r\n\r\n#define _TILE_10 (unsigned char) 'A'\r\n\r\n#define _TILE_11 (unsigned char) 'B'\r\n#define _TILE_12 (unsigned char) 'C'\r\n\r\n#define _TILE_13 (unsigned char) 'D'\r\n\r\n#define _TILE_14 (unsigned char) 'E'\r\n\r\n#define _TILE_15 (unsigned char) 'F'\r\n\r\n#define _TILE_16 (unsigned char) 'G'\r\n\r\n#define _TILE_17 (unsigned char) 'H'\r\n\r\n#define _TILE_18 (unsigned char) 'I'\r\n\r\n#define _TILE_19 (unsigned char) 'J'\r\n\r\n#define _TILE_20 (unsigned char) 'K'\r\n\r\n#define _TILE_21 (unsigned char) 'L'\r\n\r\n#define _TILE_22 (unsigned char) 'M'\r\n\r\n#define _TILE_23 (unsigned char) 'N'\r\n\r\n#define _TILE_24 (unsigned char) 'O'\r\n\r\n#define _TILE_25 'P'\r\n\r\n//#define _TILE_25 '$'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/target/Makefile.target",
    "content": "\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c \n\nGAME_NAME := target\n\nPARENT_DIR = examples\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./Makefile_common\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n"
  },
  {
    "path": "src/examples/target/config/project_config.mk",
    "content": "\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n"
  },
  {
    "path": "src/examples/target/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if YSize>=17\r\n    #define LINE_SKIP 2\r\n#else\r\n    #define LINE_SKIP 1\r\n#endif\r\n\r\n#if XSize<=17\r\n    #define ON_OFF_POS 13\r\n\r\n    #define _TARGET_INFORMATION_STRING \"TARGET INFO\"\r\n#else\r\n    #define ON_OFF_POS 14\r\n\r\n    #define _TARGET_INFORMATION_STRING \"TARGET INFORMATION\"\r\n#endif\r\n\r\nint main(void)\r\n{        \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_INPUT();\r\n\r\n    _XL_CLEAR_SCREEN();\r\n    \r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    \r\n    _XL_PRINT(0,   0,_TARGET_INFORMATION_STRING);\r\n\r\n    _XL_PRINT(0,   1*LINE_SKIP,\"XSIZE\");\r\n    _XL_PRINTD(6,  1*LINE_SKIP,2,XSize);\r\n\r\n    #if(XSize<=17)\r\n        _XL_PRINT(8,  1*LINE_SKIP,\"YSIZE\");\r\n        _XL_PRINTD(14, 1*LINE_SKIP,2,YSize);      \r\n    #else\r\n        _XL_PRINT(10,  1*LINE_SKIP,\"YSIZE\");\r\n        _XL_PRINTD(16, 1*LINE_SKIP,2,YSize);     \r\n    #endif\r\n    \r\n    _XL_PRINT(0,   2*LINE_SKIP,\"TILES\");\r\n    _XL_PRINTD(6,  2*LINE_SKIP,2,_XL_NUMBER_OF_TILES);   \r\n    \r\n    #if defined(_XL_NO_UDG)\r\n        _XL_PRINT(10,  2*LINE_SKIP,\"ASCII\");\r\n    #else\r\n        _XL_PRINTD(10, 2*LINE_SKIP,1,_XL_TILE_X_SIZE);\r\n        _XL_CHAR(  11, 2*LINE_SKIP,'X');\r\n        _XL_PRINTD(12, 2*LINE_SKIP,1,_XL_TILE_Y_SIZE);\r\n    #endif\r\n    \r\n    _XL_PRINT(0,     3*LINE_SKIP,\"GRAPHICS\");\r\n    #if !defined(_XL_NO_UDG)\r\n        _XL_PRINT(ON_OFF_POS,3*LINE_SKIP,\"ON\");\r\n    #else\r\n        _XL_PRINT(ON_OFF_POS,3*LINE_SKIP,\"OFF\");\r\n    #endif\r\n\r\n    _XL_PRINT(0,     4*LINE_SKIP,\"COLOR\");\r\n    #if !defined(_XL_NO_COLOR)\r\n        _XL_PRINT(ON_OFF_POS,4*LINE_SKIP,\"ON\");\r\n    #else\r\n        _XL_PRINT(ON_OFF_POS,4*LINE_SKIP,\"OFF\");\r\n    #endif\r\n\r\n    _XL_PRINT(0,     5*LINE_SKIP,\"TEXT COLOR\");\r\n    #if !defined(_XL_NO_TEXT_COLOR)\r\n        _XL_PRINT(ON_OFF_POS,5*LINE_SKIP,\"ON\");\r\n    #else\r\n        _XL_PRINT(ON_OFF_POS,5*LINE_SKIP,\"OFF\");\r\n    #endif\r\n\r\n    _XL_PRINT(0,     6*LINE_SKIP,\"JOYSTICK\");\r\n    #if !defined(_XL_NO_JOYSTICK)\r\n        _XL_PRINT(ON_OFF_POS,6*LINE_SKIP,\"ON\");\r\n    #else\r\n        _XL_PRINT(ON_OFF_POS,6*LINE_SKIP,\"OFF\");\r\n    #endif\r\n\r\n    _XL_PRINT(0,     7*LINE_SKIP,\"SOUND\");\r\n    #if !defined(_XL_NO_SOUND)\r\n        _XL_PRINT(ON_OFF_POS,7*LINE_SKIP,\"ON\");\r\n    #else\r\n        _XL_PRINT(ON_OFF_POS,7*LINE_SKIP,\"OFF\");\r\n    #endif\r\n    \r\n    _XL_PRINT(0,     8*LINE_SKIP,\"SMALL CHARS\");\r\n    #if !defined(_XL_NO_SMALL_LETTERS)\r\n        _XL_PRINT(ON_OFF_POS,8*LINE_SKIP,\"ON\");\r\n    #else\r\n        _XL_PRINT(ON_OFF_POS,8*LINE_SKIP,\"OFF\");\r\n    #endif\r\n    \r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/target/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/target/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile25.txt",
    "content": "$7f,$3e,$60,$3c,$06,$7c,$18,$7f"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/target/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/target/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/target/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/text/Makefile.text",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := text\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/text/config/project_config.mk",
    "content": "\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_COCO3_SLOWDOWN=100\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n\r\n"
  },
  {
    "path": "src/examples/text/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define NUMBER_OF_COLORS 6\r\n#define MAX_STRING_SIZE 10\r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT((uint8_t) (((XSize) - (((uint8_t) strlen(Text))))/2), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW(((YSize)>>1), Text)\r\n\r\n\r\n\r\n#if !defined(_XL_NO_TEXT_COLOR)\r\nstatic const uint8_t text_color[NUMBER_OF_COLORS] = {_XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE};\r\n#endif\r\n\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"WHITE\", \r\n                                \"RED\", \r\n                                \"CYAN\", \r\n                                \"GREEN\", \r\n                                \"YELLOW\", \r\n                                \"BLUE\", \r\n                                };\r\n\r\n\r\nchar *small_letters = \r\n    _XL_a _XL_b _XL_c _XL_d _XL_e _XL_f _XL_g _XL_h _XL_i _XL_j _XL_k _XL_l _XL_m \\\r\n    _XL_n _XL_o _XL_p _XL_q _XL_r _XL_s _XL_t _XL_u _XL_v _XL_w _XL_x _XL_y _XL_z;\r\n\r\n\r\nvoid print_text(uint8_t x, uint8_t y, const char *str)\r\n{\r\n    uint8_t i;\r\n    char ch;\r\n    \r\n    i=0;\r\n    \r\n    while((ch=str[i]))\r\n    {\r\n        if((ch>='a')&&(ch<='z'))\r\n        {\r\n            _XL_CHAR(x+i,y,small_letters[ch-'a']);\r\n        }\r\n        else\r\n        {\r\n            _XL_CHAR(x+i,y,ch);\r\n        }\r\n        ++i;\r\n    }\r\n}\r\n\r\n\r\nvoid small_pause(void)\r\n{\r\n    _XL_SLOW_DOWN(100U);\r\n}\r\n\r\n\r\nint main(void)\r\n{        \r\n    uint8_t i;\r\n    uint8_t j;\r\n    uint8_t k;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_INPUT();\r\n\r\n    for(k=0;k<3;++k)\r\n    {\r\n        for(j=0;j<NUMBER_OF_COLORS;++j)\r\n        {\r\n            _XL_CLEAR_SCREEN();\r\n            #if !defined(_XL_NO_TEXT_COLOR)\r\n            _XL_SET_TEXT_COLOR(text_color[j]);\r\n            #endif\r\n            \r\n            print_text(XSize/2-6,YSize/2-5+0,\"Aa Bb Cc Dd\");\r\n            print_text(XSize/2-6,YSize/2-5+1,\"Ee Ff Gg Hh\");\r\n            print_text(XSize/2-6,YSize/2-5+2,\"Ii Jj Kk Ll\");\r\n            print_text(XSize/2-6,YSize/2-5+3,\"Mm Nn Oo Pp\");\r\n            print_text(XSize/2-6,YSize/2-5+4,\"Qq Rr Ss Tt\");\r\n            print_text(XSize/2-6,YSize/2-5+5,\"Uu Vv Ww Xx\");\r\n            print_text(XSize/2-6,YSize/2-5+6,\"Yy Zz\");\r\n            print_text(XSize/2-6,YSize/2-5+8,\" 0 1 2 3 4\");\r\n            print_text(XSize/2-6,YSize/2-5+9,\" 5 6 7 8 9\");\r\n            \r\n            _XL_SLEEP(1);\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            #if !defined(_XL_NO_TEXT_COLOR)\r\n            _XL_SET_TEXT_COLOR(text_color[j]);\r\n            #endif\r\n            \r\n            _XL_PRINT(0,0, (char *) color_name[j]);\r\n            \r\n            #if defined(_XL_NO_TEXT_COLOR)\r\n                _XL_PRINT(XSize-9,1,\"COLOR OFF\");\r\n            #else\r\n                _XL_PRINT(XSize-8,1,\"COLOR ON\");\r\n            #endif\r\n            \r\n            PRINT_CENTERED_ON_ROW(5,\"CENTERED\");\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n            PRINT_CENTERED(\"0123456789\");\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            PRINT_CENTERED(\"SOME TEXT \");\r\n            \r\n            small_pause(); \r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            for(i=YSize/6+3;i<YSize-2;i+=3)\r\n            {   \r\n                _XL_SET_TEXT_COLOR(text_color[j]);\r\n                _XL_PRINT(0,0, (char *) color_name[j]);\r\n            \r\n                _XL_PRINT(0,2,\"ON ROW\");\r\n\r\n                _XL_PRINTD(7,2,2,i);\r\n                \r\n                _XL_WAIT_FOR_INPUT();\r\n\r\n                PRINT_CENTERED_ON_ROW(i,\"0123456789\");\r\n                small_pause();\r\n                \r\n                _XL_WAIT_FOR_INPUT();\r\n                \r\n                PRINT_CENTERED_ON_ROW(i-1,\"ABCDEFGHIJ\");\r\n                PRINT_CENTERED_ON_ROW(i,  \"KLMNOPQRST\");\r\n                PRINT_CENTERED_ON_ROW(i+1,\"UVWXYZ    \");      \r\n                small_pause();\r\n                _XL_WAIT_FOR_INPUT();\r\n\r\n                PRINT_CENTERED_ON_ROW(i-1,\"          \");\r\n                PRINT_CENTERED_ON_ROW(i,  \"          \");\r\n                PRINT_CENTERED_ON_ROW(i+1,\"          \"); \r\n\r\n                PRINT_CENTERED_ON_ROW(i-1,_XL_a _XL_b _XL_c _XL_d _XL_e _XL_f _XL_g _XL_h _XL_i _XL_j);\r\n                PRINT_CENTERED_ON_ROW(i,  _XL_k _XL_l _XL_m _XL_n _XL_o _XL_p _XL_q _XL_r _XL_s _XL_t);\r\n                PRINT_CENTERED_ON_ROW(i+1,_XL_u _XL_v _XL_w _XL_x _XL_y _XL_z _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE);\r\n                small_pause();\r\n                \r\n                _XL_WAIT_FOR_INPUT();\r\n                \r\n                _XL_CLEAR_SCREEN();\r\n            }    \r\n\r\n            print_text(XSize/2-6,YSize/2-5+0,\"Aa Bb Cc Dd\");\r\n            print_text(XSize/2-6,YSize/2-5+1,\"Ee Ff Gg Hh\");\r\n            print_text(XSize/2-6,YSize/2-5+2,\"Ii Jj Kk Ll\");\r\n            print_text(XSize/2-6,YSize/2-5+3,\"Mm Nn Oo Pp\");\r\n            print_text(XSize/2-6,YSize/2-5+4,\"Qq Rr Ss Tt\");\r\n            print_text(XSize/2-6,YSize/2-5+5,\"Uu Vv Ww Xx\");\r\n            print_text(XSize/2-6,YSize/2-5+6,\"Yy Zz\");\r\n            print_text(XSize/2-6,YSize/2-5+8,\" 0 1 2 3 4\");\r\n            print_text(XSize/2-6,YSize/2-5+9,\" 5 6 7 8 9\");\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n        }\r\n    }\r\n    PRINT_CENTERED_ON_ROW(YSize-5, \"END OF DEMO\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile26.txt",
    "content": "63,0,63,0,63,0,63,0"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/text/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile26.txt",
    "content": "63,0,63,0,63,0,63,0,63"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/text/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile25.txt",
    "content": "$7f,$3e,$60,$3c,$06,$7c,$18,$7f"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile26.txt",
    "content": "127,0,127,0,127,0,127,0"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/examples/text/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile0.txt",
    "content": "24,24,102,189,36,36"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile1.txt",
    "content": "24,24,126,189,36,36\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile10.txt",
    "content": "24,0,102,129,36,36 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile11.txt",
    "content": "0,8,56,28,16,0\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile12.txt",
    "content": "16,48,24,16,48,24\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile13.txt",
    "content": "0,68,255,34,0,0\r\n\r\n "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile14.txt",
    "content": "0,224,127,127,224,0\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile15.txt",
    "content": "0,7,254,254,7,0\r\n\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile16.txt",
    "content": "12,12,12,30,30,18\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile17.txt",
    "content": "126,227,239,231,110,60\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile18.txt",
    "content": "126,219,219,195,90,60\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile19.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile2.txt",
    "content": "24,25,118,188,20,18\r\n\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile20.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile21.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile22.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile23.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile24.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile25.txt",
    "content": "8,62,104,60,10,124\r\n "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile3.txt",
    "content": "24,152,110,61,40,72\r\n\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile4.txt",
    "content": "189,66,165,129,129,126\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile5.txt",
    "content": "126,165,153,153,165,126 "
  },
  {
    "path": "src/examples/text/tiles/8x6/tile6.txt",
    "content": "189,66,165,165,129,126"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile7.txt",
    "content": "126,165,129,90,66,60"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile8.txt",
    "content": "126,227,239,247,70,60\r\n"
  },
  {
    "path": "src/examples/text/tiles/8x6/tile9.txt",
    "content": "0,255,200,240,192,128 "
  },
  {
    "path": "src/examples/text/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile26.txt",
    "content": "255,0,255,0,255,0,255,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/examples/text/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/examples/text/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/examples/zombies/Makefile.zombies",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := zombies\r\n\r\nPARENT_DIR = examples\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/examples/zombies/config/project_config.mk",
    "content": "\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_C16_SLOWDOWN=55\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_COLECO_SLOWDOWN=100\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=30\r\n_PECOM_SLOWDOWN=30\r\n_TMC600_SLOWDOWN=50\r\n_MICRO_SLOWDOWN=60\r\n_CIDELSA_SLOWDOWN=40\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=12\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n\r\n"
  },
  {
    "path": "src/examples/zombies/images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#include \"cross_lib.h\"\n\n\n    #define ZOMBIE_TILE_0 _TILE_0\n    #define ZOMBIE_TILE_1 _TILE_1\n    #define ZOMBIE_TILE_2 _TILE_2\n    #define ZOMBIE_TILE_3 _TILE_3\n    #define ZOMBIE_TILE_4 _TILE_4\n    #define ZOMBIE_TILE_5 _TILE_5\n    #define ZOMBIE_TILE_6 _TILE_6\n    \n    #define ZOMBIE_DEATH_TILE_0 _TILE_7\n    #define ZOMBIE_DEATH_TILE_1 _TILE_8\n    \n    #define FIRE_POWER_TILE _TILE_9\n    #define INVINCIBILITY_TILE _TILE_10\n\n    #define BULLET_TILE _TILE_11\n\n    #define VERTICAL_BRICK_TILE _TILE_12\n    #define HORIZONTAL_BRICK_TILE _TILE_13\n\n\n    #define LEFT_HORIZONTAL_MISSILE_TILE _TILE_14\n    #define RIGHT_HORIZONTAL_MISSILE_TILE _TILE_15\n\n    #define ROCKET_TILE _TILE_16\n\n    #define FREEZE_TILE\t _TILE_17\n    #define SUPER_TILE _TILE_18\n\n    #define EXTRA1_TILE _TILE_19\n    #define EXTRA2_TILE _TILE_20\n    #define EXTRA3_TILE _TILE_21\n    #define EXTRA4_TILE _TILE_22\n    #define EXTRA5_TILE _TILE_23\n    #define EXTRA6_TILE _TILE_24\n    \n    #define EXTRA_POINTS_TILE _DOLLAR_TILE\n\n\n    #define _PLAYER_COLOR _XL_CYAN\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/examples/zombies/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"images.h\"\r\n\r\n#define _PRESS_FIRE__STRING \"PRESS FIRE\"\r\n\r\nstatic uint8_t zombie_pos[XSize];\r\nstatic uint8_t zombie_status[XSize];\r\nstatic uint8_t zombie_index;\r\n\r\n\r\nstatic const uint8_t zombie_tile[7+1] = \r\n{\r\n    ZOMBIE_TILE_0, // 0\r\n    ZOMBIE_TILE_0, // 1\r\n    ZOMBIE_TILE_1, // 2\r\n    ZOMBIE_TILE_2, // 3\r\n    ZOMBIE_TILE_3, \r\n    ZOMBIE_TILE_4, \r\n    ZOMBIE_TILE_5, \r\n    ZOMBIE_TILE_6\r\n};\r\n        \r\nvoid zombie_display(void)\r\n{\r\n    uint8_t status = zombie_status[zombie_index];\r\n    uint8_t pos = zombie_pos[zombie_index];\r\n    \r\n    if(!status)\r\n    {\r\n        _XL_DELETE(zombie_index, pos-1);\r\n        _XL_DRAW(zombie_index, pos, ZOMBIE_TILE_0, _XL_WHITE);\r\n    }\r\n    else\r\n    {\r\n        _XL_DRAW(zombie_index, pos, zombie_tile[status<<1], _XL_WHITE);\r\n        _XL_DRAW(zombie_index,1 + pos, zombie_tile[1+(status<<1)], _XL_WHITE);\r\n    }\r\n}\r\n\r\n\r\nvoid die(void)\r\n{\r\n    uint8_t pos = zombie_pos[zombie_index];\r\n    \r\n    _XL_DELETE(zombie_index,pos-1);    \r\n    _XL_DELETE(zombie_index,pos);\r\n    _XL_DELETE(zombie_index,pos+1);\r\n    _XL_DRAW(zombie_index,pos, ZOMBIE_DEATH_TILE_0, _XL_RED);\r\n    _XL_SHOOT_SOUND();\r\n    _XL_DRAW(zombie_index,pos, ZOMBIE_DEATH_TILE_1, _XL_RED);\r\n    _XL_EXPLOSION_SOUND();\r\n    _XL_DELETE(zombie_index,pos);\r\n    zombie_status[zombie_index]=0;\r\n    zombie_pos[zombie_index]=1;\r\n}\r\n\r\n\r\nint main(void)\r\n{\r\n    uint8_t move_or_die;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n    \r\n    _XL_INIT_SOUND();\r\n    \r\n    for(zombie_index=0;zombie_index<XSize;++zombie_index)\r\n    {\r\n        zombie_pos[zombie_index]=1;\r\n        zombie_status[zombie_index]=0;\r\n    }\r\n    \r\n    _XL_CLEAR_SCREEN();\r\n\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    \r\n    _XL_PRINT((XSize-10)/2,YSize/2,_PRESS_FIRE__STRING);\r\n\r\n    _XL_WAIT_FOR_INPUT();\r\n\r\n    _XL_CLEAR_SCREEN();\r\n\r\n    while(1)\r\n    {\r\n        zombie_index= (uint8_t) _XL_RAND()%XSize;\r\n        \r\n        move_or_die= (uint8_t) _XL_RAND()%XSize;\r\n        \r\n        if(move_or_die>XSize-2)\r\n        {\r\n            die();\r\n        }\r\n        else\r\n        {\r\n            zombie_display();\r\n        }\r\n\r\n        if(zombie_pos[zombie_index]<YSize-1)\r\n        {\r\n            ++zombie_status[zombie_index];\r\n            (zombie_status[zombie_index])&=3;\r\n            if(!zombie_status[zombie_index])\r\n            {\r\n                ++zombie_pos[zombie_index];\r\n            }\r\n        }\r\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n    }\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile1.txt",
    "content": "12,30,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile12.txt",
    "content": "12,12,28,12,12,14,12,12"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile19.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile2.txt",
    "content": "12,22,12,62,13,12,20,20"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile20.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile21.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile22.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile23.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile3.txt",
    "content": "12,26,12,31,44,12,10,10"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile4.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile5.txt",
    "content": "30,33,51,45,45,51,33,30"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile6.txt",
    "content": "45,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile7.txt",
    "content": "30,33,51,33,33,18,18,12"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/examples/zombies/tiles/6x8/tile9.txt",
    "content": "33,18,12,26,22,12,18,33"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,51,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile1.txt",
    "content": "12,30,12,51,45,12,18,51,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0, 0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile12.txt",
    "content": "12,12,28,12,12,14,12,12, 12"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile16.txt",
    "content": "12,30,30,30,63,45,33,33,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile17.txt",
    "content": "0,30,51,55,51,22,20,12,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile18.txt",
    "content": "0,30,43,43,35,42,30,12,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile19.txt",
    "content": "31,21,31,21,31,21,31,21,31"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile2.txt",
    "content": "12,22,12,62,13,12,20,20,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile20.txt",
    "content": "63,49,63,35,63,49,63,35,63"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile21.txt",
    "content": "63,45,63,45,63,45,63,45,63"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile22.txt",
    "content": "63,63,36,9,63,63,0,0,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile23.txt",
    "content": "31,19,31,19,31,25,31,25,31"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile24.txt",
    "content": "63,41,63,37,63,41,63,37,63"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile3.txt",
    "content": "12,26,12,31,44,12,10,10,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile4.txt",
    "content": "12,30,63,45,30,12,30,51,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile5.txt",
    "content": "30,33,51,45,45,51,33,30,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile6.txt",
    "content": "45,30,63,45,30,12,30,51,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile7.txt",
    "content": "30,33,51,33,33,18,18,12,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile8.txt",
    "content": "0,30,51,55,51,26,18,12,0"
  },
  {
    "path": "src/examples/zombies/tiles/6x9/tile9.txt",
    "content": "33,18,12,26,22,12,18,33,0"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile1.txt",
    "content": "12,30,12,51,45,12,18,51"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile12.txt",
    "content": "12,12,28,12,12,14,12,12"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile19.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile2.txt",
    "content": "12,22,12,62,13,12,20,20"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile20.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile21.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile22.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile23.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile3.txt",
    "content": "12,26,12,31,44,12,10,10"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile4.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile5.txt",
    "content": "30,33,51,45,45,51,33,30"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile6.txt",
    "content": "45,30,63,45,30,12,30,51"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile7.txt",
    "content": "30,33,51,33,33,18,18,12"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/examples/zombies/tiles/7x8/tile9.txt",
    "content": "33,18,12,26,22,12,18,33"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile10.txt",
    "content": "24, 36, 24,  0,153,  0, 36,102"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile11.txt",
    "content": "0,  0,  8, 56, 28, 16,  0,  0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile12.txt",
    "content": "24, 24, 24, 48, 24, 12, 24, 24"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,255,  0,  0,  0,  0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile14.txt",
    "content": "0,  0,240, 63, 63,240,  0,  0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile15.txt",
    "content": "0,  0, 15,252,252, 15,  0,  0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile16.txt",
    "content": "24, 60, 60, 60,126, 90, 66, 66"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile17.txt",
    "content": "0,60,66,207,195,102,36,24"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile18.txt",
    "content": "0,60,90,219,195,90,60,24"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile19.txt",
    "content": "126,90,126,90,126,90,126,90"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile20.txt",
    "content": "0,0,0,0,0,170,255,255"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile21.txt",
    "content": "255,153,255,153,255,153,255,153"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile22.txt",
    "content": "255,255,255,192,129,255,255,255"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile23.txt",
    "content": "126,102,126,102,126,102,126,102"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile24.txt",
    "content": "255,165,255,165,255,165,255,165"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile7.txt",
    "content": "0, 36, 0,102,0, 24, 0,102"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile8.txt",
    "content": "24, 0, 24,0,153, 0, 36,0"
  },
  {
    "path": "src/examples/zombies/tiles/8x8/tile9.txt",
    "content": "129,66,24,52,44,24,66,129"
  },
  {
    "path": "src/examples/zombies/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 'X'\r\n#define _TILE_1 'X'\r\n\r\n#define _TILE_2 ' '\r\n\r\n#define _TILE_3 'X'\r\n\r\n#define _TILE_4 ' '\r\n\r\n#define _TILE_5 'X'\r\n\r\n#define _TILE_6 ' '\r\n\r\n#define _TILE_7 '='\r\n\r\n#define _TILE_8 'O'\r\n\r\n#define _TILE_9 'I'\r\n\r\n#define _TILE_10 ' '\r\n\r\n#define _TILE_11 ' '\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 'T' \r\n\r\n#define _TILE_14 'H'\r\n\r\n#define _TILE_15 'L'\r\n\r\n#define _TILE_16 'T'\r\n\r\n#define _TILE_17 'I'\r\n\r\n#define _TILE_18 'I'\r\n\r\n#define _TILE_19 'V'\r\n\r\n#define _TILE_20 'V'\r\n\r\n#define _TILE_21 'V'\r\n\r\n#define _TILE_22 'V'\r\n\r\n#define _TILE_23 '*'\r\n\r\n#define _TILE_24 '-'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/bomber/Makefile.bomber",
    "content": "\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c \n\nGAME_NAME := bomber\n\nPARENT_DIR = games\n\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\ninclude ./Makefile_common\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values"
  },
  {
    "path": "src/games/bomber/config/game_config.mk",
    "content": "#########################\r\n\r\n\r\nZX81_GFX_GAME_OPTS = -DNO_ANIMATION\r\n\r\nVIC20_UNEXPANDED_NO_GFX_GAME_OPTS ?= -DTINY_GAME\r\n\r\nVIC20_UNEXPANDED_GAME_OPTS ?= -DTINY_GAME -DNO_ANIMATION\r\n\r\nHECTOR1_GAME_OPTS ?= -DTINY_GAME -DNO_ANIMATION"
  },
  {
    "path": "src/games/bomber/config/project_config.mk",
    "content": "\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=380\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=300\r\n_APPLE2ENH_HGR_SLOWDOWN=300\r\n_ATARI_SLOWDOWN=450\r\n_ATARI5200_SLOWDOWN=300\r\n_ATARI7800_SLOWDOWN=540\r\n_ATARI7800_NO_COLOR_SLOWDOWN=280\r\n_ATARI_LYNX_SLOWDOWN=1400\r\n_C16_SLOWDOWN=350\r\n_C16_CONIO_SLOWDOWN=450\r\n_C16_DOUBLE_BUFFER_SLOWDOWN=200\r\n_C64_SLOWDOWN=350\r\n_CX16_SLOWDOWN?=380\r\n_C128_8502_80COL_SLOWDOWN=250\r\n_CBM610_SLOWDOWN=400\r\n_CBM510_SLOWDOWN=400\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=550\r\n_ORIC_SLOWDOWN=400\r\n_MEGA65_SLOWDOWN=750\r\n_NES_SLOWDOWN=700\r\n_PET_SLOWDOWN=400\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=1200\r\n_VIC20_SLOWDOWN=550\r\n\r\n\r\n# Z88DK\r\n_ABC80_SLOWDOWN=300\r\n_AGON_SLOWDOWN=4400\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_BEE_SLOWDOWN=10\r\n_BONDWELL2_SLOWDOWN=300\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CAMPUTERS_LYNX_SLOWDOWN=65\r\n_COLECO_SLOWDOWN=100\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_E200_SLOWDOWN=1600\r\n_G850_SLOWDOWN=1600\r\n_G815_SLOWDOWN=800\r\n_GAL_SLOWDOWN=2500\r\n_GAL_GFX_SLOWDOWN=1500\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_GL6000SL_SLOWDOWN=300\r\n_HECTOR1_SLOWDOWN=200\r\n_HECTORHR_SLOWDOWN=100\r\n_KC_SLOWDOWN=60\r\n_LASER500_SLOWDOWN=200\r\n_M100_SLOWDOWN=300\r\n_M5_SLOWDOWN=200\r\n_MC1000_SLOWDOWN=180\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_PHC25_SLOWDOWN=450\r\n_PV1000_SLOWDOWN=40\r\n_SAMCOUPE_SLOWDOWN=280\r\n_SC3000_SLOWDOWN=260\r\n_SMS_SLOWDOWN=160\r\n_SMC777_SLOWDOWN=150\r\n_SPECTRUM_SLOWDOWN=160\r\n_TRS80_SLOWDOWN=120\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_X07_SLOWDOWN=10\r\n_Z1013_SLOWDOWN=120\r\n_Z9001_SLOWDOWN=150\r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=40\r\n_ZX81_WRX128_SLOWDOWN=60\r\n_ZX81_8X6_WRX128_SLOWDOWN=70\r\n_ZX81_WRX64_SLOWDOWN=100\r\n_ZX81_8X6_WRX64_SLOWDOWN=120\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=300\r\n_COCO3_SLOWDOWN=520\r\n_DRAGON_SLOWDOWN=300\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=240\r\n_PECOM_SLOWDOWN=240\r\n_TMC600_SLOWDOWN=180\r\n_MICRO_SLOWDOWN=300\r\n_CIDELSA_SLOWDOWN=200\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=80\r\n\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=360\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n_TERMINAL_SLOWDOWN=17\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=900\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=300"
  },
  {
    "path": "src/games/bomber/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subxect to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"tile_aliases.h\"\r\n\r\n\r\n// #define DEBUG\r\n\r\n\r\n#if !defined(_XL_SLOW_DOWN_FACTOR)\r\n    #define LEVEL_SPEED_UP 0\r\n#elif _XL_SLOW_DOWN_FACTOR<20\r\n    #define LEVEL_SPEED_UP 0\r\n#elif _XL_SLOW_DOWN_FACTOR<100\r\n    #define LEVEL_SPEED_UP 2\r\n#elif _XL_SLOW_DOWN_FACTOR<200\r\n    #define LEVEL_SPEED_UP 4\r\n#elif _XL_SLOW_DOWN_FACTOR<400\r\n    #define LEVEL_SPEED_UP 8\r\n#elif _XL_SLOW_DOWN_FACTOR<800\r\n    #define LEVEL_SPEED_UP 16\r\n#elif _XL_SLOW_DOWN_FACTOR<1600\r\n    #define LEVEL_SPEED_UP 32\r\n#elif _XL_SLOW_DOWN_FACTOR<3200\r\n    #define LEVEL_SPEED_UP 64\r\n#else\r\n    #define LEVEL_SPEED_UP 128\r\n#endif \r\n\r\n#define MAX_Y ((YSize)+(Y_OFFSET))\r\n\r\n#if YSize>=12\r\n\t#define MIN_BUILDING_HEIGHT 2\r\n#else\r\n\t#define MIN_BUILDING_HEIGHT 2\r\n#endif\r\n\r\n#if YSize>=18\r\n\t#define INITIAL_PLANE_Y 2\r\n#else\r\n\t#define INITIAL_PLANE_Y 1\r\n#endif\r\n\r\n#if YSize>=20\r\n    #if XSize>78\r\n        #define BUILDINGS_NUMBER (XSize-24) \r\n        #define FIRST_BULDING_X_POS 12\r\n    #elif XSize>63\r\n        #define BUILDINGS_NUMBER (XSize-22)\r\n        #define FIRST_BULDING_X_POS 10\r\n    #elif XSize>48\r\n        #define BUILDINGS_NUMBER (XSize-18)\r\n        #define FIRST_BULDING_X_POS 9\r\n    #elif XSize>=40\r\n        #define BUILDINGS_NUMBER (XSize-16)\r\n        #define FIRST_BULDING_X_POS 8\r\n    #elif XSize>=30\r\n        #define BUILDINGS_NUMBER (XSize-14)\r\n        #define FIRST_BULDING_X_POS 7\r\n    #elif XSize>16\r\n        #define BUILDINGS_NUMBER (XSize-9)\r\n        #define FIRST_BULDING_X_POS 5\r\n    #else\r\n        #define BUILDINGS_NUMBER (XSize-7)\r\n        #define FIRST_BULDING_X_POS 4\r\n    #endif\r\n#elif YSize>=12\r\n    #define BUILDINGS_NUMBER (XSize/2)\r\n    #define FIRST_BULDING_X_POS (XSize/4)  \r\n#else \r\n    #define BUILDINGS_NUMBER 5\r\n    #define FIRST_BULDING_X_POS ((XSize/2)-2)\t\r\n#endif  \r\n\r\n// String definitions\r\n#define _BOMBER__STRING _XL_B _XL_O _XL_M _XL_B _XL_E _XL_R\r\n#if XSize>=18\r\n    #define _BY_FABRIZIO_CARUSO__STRING _XL_B _XL_Y _XL_SPACE _XL_F _XL_A _XL_B _XL_R _XL_I _XL_Z _XL_I _XL_O _XL_SPACE _XL_C _XL_A _XL_R _XL_U _XL_S _XL_O\r\n#else\r\n    #define _BY_FABRIZIO_CARUSO__STRING _XL_F _XL_A _XL_B _XL_R _XL_I _XL_Z _XL_I _XL_O _XL_SPACE _XL_C _XL_A _XL_R _XL_U _XL_S _XL_O\r\n#endif\r\n#define _DESTROY_ALL__STRING _XL_D _XL_E _XL_S _XL_T _XL_R _XL_O _XL_Y _XL_SPACE _XL_A _XL_L _XL_L\r\n#define _BUILDINGS__STRING _XL_B _XL_U _XL_I _XL_L _XL_D _XL_I _XL_N _XL_G _XL_S\r\n\r\n#if !defined(_XL_NO_JOYSTICK)\r\n    #define _PRESS_FIRE__STRING _XL_P _XL_R _XL_E _XL_S _XL_S _XL_SPACE _XL_F _XL_I _XL_R _XL_E\r\n#else\r\n    #define _PRESS_FIRE__STRING _XL_P _XL_R _XL_E _XL_S _XL_S _XL_SPACE _XL_A _XL_SPACE _XL_K _XL_E _XL_Y\r\n    \r\n#endif\r\n#define _LEVEL__STRING _XL_L _XL_E _XL_V _XL_E _XL_L\r\n#define _LEVEL_COMPLETED__STRING _XL_L _XL_E _XL_V _XL_E _XL_L _XL_SPACE _XL_C _XL_O _XL_M _XL_P _XL_L _XL_E _XL_T _XL_E _XL_D\r\n#define _BONUS__STRING _XL_B _XL_O _XL_N _XL_U _XL_S\r\n#define _GAME_COMPLETED__STRING \"GAME COMPLETED\"\r\n#define _DEL_STR _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE\r\n#define _NEW_HISCORE__STRING _XL_N _XL_E _XL_W _XL_SPACE _XL_H _XL_I _XL_S _XL_C _XL_O _XL_R _XL_E\r\n#define _GAME_OVER__STRING _XL_G _XL_A _XL_M _XL_E _XL_SPACE _XL_O _XL_V _XL_E _XL_R\r\n\r\n\r\n#define drawPlane() \\\r\ndo { \\\r\n    _XL_DRAW(x,y,PLANE_BACK_TILE, _PLANE_COLOR); \\\r\n    _XL_DRAW(x+1,y,PLANE_FRONT_TILE, _PLANE_COLOR); \\\r\n} while(0)\r\n\r\n\r\n#define drawPlaneBack() \\\r\n    _XL_DRAW(x,y,PLANE_BACK_TILE,_PLANE_COLOR);\r\n\r\n#define deletePlaneBack() \\\r\n    _XL_DELETE(x,y);\r\n\r\n#define deletePlaneFront() \\\r\n    _XL_DELETE(x+1,y);\r\n\r\n\r\n#define deleteAnimatedPlaneBack() \\\r\n    _XL_DELETE(x-1,y); \r\n\r\n#define deleteAnimatedPlaneCenter() \\\r\n    deletePlaneBack(); \r\n\r\n\r\n#define deleteAnimatedBombUp() \\\r\n  _XL_DELETE(bomb_x,bomb_y-1);\r\n\r\n        \r\n\r\n#if !defined(NO_ANIMATION)\r\n    #define drawAnimatedPlane() \\\r\n        do { \\\r\n            _XL_DRAW(x-1,y,ANIMATED_PLANE_BACK_TILE,_PLANE_COLOR); \\\r\n            _XL_DRAW(x,y,ANIMATED_PLANE_CENTER_TILE,_PLANE_COLOR); \\\r\n            _XL_DRAW(x+1,y,ANIMATED_PLANE_FRONT_TILE, _PLANE_COLOR); \\\r\n        } while(0)\r\n\r\n\r\n        \r\n    #define drawAnimatedBomb() \\\r\n    do { \\\r\n        _XL_DRAW(bomb_x,bomb_y,ANIMATED_BOMB_UP_TILE, _BOMB_COLOR); \\\r\n        _XL_DRAW(bomb_x,bomb_y+1,ANIMATED_BOMB_DOWN_TILE,_BOMB_COLOR); \\\r\n    } while(0)\r\n\r\n    #define deletePlane() \\\r\n    do  {\\\r\n        deletePlaneBack() ; \\\r\n        deletePlaneFront() ; \\\r\n    } while(0)  \r\n\r\n    #define deleteAnimatedBomb() \\\r\n    do { \\\r\n        _XL_DELETE(bomb_x,bomb_y-1); \\\r\n        _XL_DELETE(bomb_x,bomb_y); \\\r\n    } while(0)\r\n        \r\n#else \r\n    #define drawAnimatedPlane() \r\n\r\n        \r\n    #define drawAnimatedBomb() \r\n\r\n    #define deletePlane() \\\r\n        deletePlaneFront(); \r\n        \r\n    #define deleteAnimatedBomb()\r\n        // _XL_DELETE(bomb_x,bomb_y-1);\r\n    \r\n#endif\r\n\r\n#define drawRoad() \\\r\n    _XL_DRAW(x,MAX_Y-1,ROAD_TILE,_ROAD_COLOR);\r\n\r\n#define drawBuilding() \\\r\n    _XL_DRAW(x,MAX_Y-1-y,buildingType,buildingColor);\r\n\r\n#define drawBomb() \\\r\n    _XL_DRAW(bomb_x,bomb_y,BOMB_TILE,_BOMB_COLOR);\r\n\r\n\r\n#define drawExplosion() \\\r\n    _XL_DRAW(bomb_x,bomb_y,EXPLOSION_TILE,_XL_RED);\r\n\r\n#define deleteExplosion() \\\r\n    _XL_DELETE(bomb_x,bomb_y);\r\n\r\n#define displayScore() \\\r\ndo { \\\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n    _XL_PRINTD(2,0,4,score); \\\r\n} while(0)\r\n\r\n\r\n#if XSize<20\r\n    #define REMAINING_X 8\r\n#else\r\n    #define REMAINING_X 9\r\n#endif\r\n\r\n#if !defined(TINY_GAME)\r\n    #define displayRemainingBuilings() \\\r\n        do { \\\r\n            _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n            _XL_PRINTD(REMAINING_X,0,2,remaining_buildings); \\\r\n        } while(0)\r\n#else\r\n    #define displayRemainingBuilings() \r\n#endif\r\n\r\n#define displayHiScore(xpos) \\\r\ndo { \\\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n    _XL_PRINTD(xpos,0,4,hiscore); \\\r\n} while(0)\r\n\r\n\r\n#define displayLevel() \\\r\ndo { \\\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n    _XL_PRINTD(XSize-7,0,1,level); \\\r\n} while(0)\r\n\r\n#define displayLevelMessage() \\\r\ndo { \\\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n    _XL_PRINTD(XSize/2+2,4,1,level); \\\r\n} while(0)\r\n\r\n#if !defined(TINY_GAME)\r\n    #define displayNewHiScoreMessage() \\\r\n    do { \\\r\n        _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\r\n        _XL_PRINT(1,4,_NEW_HISCORE__STRING); \\\r\n    } while(0)\r\n#else\r\n    #define displayNewHiScoreMessage()\r\n#endif\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n    PRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\nvoid displayGameOverMessage(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_RED);\r\n    PRINT_CENTERED(_GAME_OVER__STRING);\r\n}\r\n\r\n#if !defined(TINY_GAME)\r\n\r\n    #define handle_hiscore() \\\r\n    do { \\\r\n        if(score>hiscore) \\\r\n        { \\\r\n            hiscore = score; \\\r\n            displayNewHiScoreMessage(); \\\r\n            _XL_SLEEP(1); \\\r\n        } \\\r\n    } while(0)\r\n\r\n#else\r\n    #define handle_hiscore() \\\r\n    do { \\\r\n        if(score>hiscore) \\\r\n        { \\\r\n            hiscore = score; \\\r\n        } \\\r\n    } while(0)   \r\n#endif\r\n\r\n#if MAX_Y<24\r\n    #if YSize<=16\r\n        #define LEVEL_FACTOR_SPEED_UP 4\r\n    #else\r\n        #define LEVEL_FACTOR_SPEED_UP 3\r\n    #endif\r\n#else\r\n    #define LEVEL_FACTOR_SPEED_UP 2\r\n#endif \r\n\r\n#if YSize<12\r\n\t#define AND_MASK 1\r\n#elif YSize<=17\r\n    #define AND_MASK 3\r\n#else\r\n    #define AND_MASK 7\r\n#endif\r\n\r\n#define INITIAL_LEVEL 1\r\n#define FINAL_LEVEL 9\r\n\r\nuint16_t building_height[XSize];\r\n\r\n\r\nuint8_t x;\r\nuint8_t y;\r\n\r\nuint8_t bombActive;\r\nuint8_t bomb_x;\r\nuint8_t bomb_y;\r\n\r\nuint8_t level;\r\n\r\nuint16_t score;\r\nuint16_t bonus;\r\nuint16_t bonus_ind;\r\nuint16_t hiscore;\r\n\r\nuint8_t remaining_buildings;\r\n\r\nuint8_t alive;\r\nuint8_t explosion;\r\n\r\nuint8_t buildingType;\r\nuint8_t tile_index;\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nuint8_t buildingColor;\r\nuint8_t color_index;\r\n#endif\r\n\r\nstatic const uint8_t building_tiles[] = {\r\n    WALL_1_TILE, WALL_2_TILE, \r\n    TWO_WINDOW_WALL_1_TILE, TWO_WINDOW_WALL_2_TILE, \r\n    THREE_WINDOW_WALL_1_TILE, THREE_WINDOW_WALL_2_TILE, \r\n    SMALL_TWO_WINDOW_WALL_1_TILE, SMALL_TWO_WINDOW_WALL_2_TILE\r\n    };\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t building_colors[] = {\r\n    _WALL_1_COLOR, _WALL_2_COLOR, \r\n    _TWO_WINDOW_WALL_1_COLOR, _TWO_WINDOW_WALL_2_COLOR, \r\n    _THREE_WINDOW_WALL_1_COLOR, _THREE_WINDOW_WALL_2_COLOR, \r\n    _SMALL_TWO_WINDOW_WALL_1_COLOR, _SMALL_TWO_WINDOW_WALL_2_COLOR\r\n    };\r\n#endif\r\n\r\n\r\n#if defined(DEBUG)\r\n    static const uint8_t tiles[] = {\r\n            _TILE_0, _TILE_1, _TILE_2, _TILE_3, \r\n            _TILE_4, _TILE_5, _TILE_6, _TILE_7, \r\n            _TILE_8, _TILE_9, _TILE_10, _TILE_11, \r\n            _TILE_12, _TILE_13, _TILE_14, _TILE_15, \r\n            _TILE_16, _TILE_17, _TILE_18, _TILE_19,\r\n            _TILE_20, _TILE_21, _TILE_22, _TILE_23, \r\n            _TILE_24, _TILE_25\r\n            };\r\n\r\n    static const static uint8_t tile_color[] = {_XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE};\r\n#endif\r\n\r\n\r\nvoid intro(void)\r\n{\r\n    _XL_CLEAR_SCREEN();\r\n    \r\n    #if !defined(TINY_GAME)\r\n    _XL_DRAW(XSize/2-3,0,HI_TEXT_TILE,_XL_RED);\r\n    #endif\r\n    \r\n    displayHiScore(XSize/2-2);\r\n        \r\n    _XL_SET_TEXT_COLOR(_XL_GREEN);\r\n    PRINT_CENTERED_ON_ROW(2, _BOMBER__STRING);\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    PRINT_CENTERED_ON_ROW(4, _BY_FABRIZIO_CARUSO__STRING);\r\n    \r\n    #if YSize>=16 && !defined(TINY_GAME)\r\n    _XL_SET_TEXT_COLOR(_XL_YELLOW);\r\n    PRINT_CENTERED_ON_ROW(YSize/2, _DESTROY_ALL__STRING);\r\n    PRINT_CENTERED_ON_ROW(YSize/2+1, _BUILDINGS__STRING);\r\n    \r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    PRINT_CENTERED_ON_ROW(YSize-2, _PRESS_FIRE__STRING);\r\n    #endif\r\n\r\n    #if !defined(TINY_GAME)\r\n\r\n    x=XSize/2-1;\r\n    y=6;\r\n    \r\n    drawAnimatedPlane();\r\n    \r\n    _XL_DRAW(XSize/2-2,YSize/2+3,WALL_1_TILE,_XL_RED);\r\n    _XL_DRAW(XSize/2-1,YSize/2+3,TWO_WINDOW_WALL_1_TILE,_XL_YELLOW);\r\n    _XL_DRAW(XSize/2-0,YSize/2+3,THREE_WINDOW_WALL_1_TILE,_XL_WHITE);        \r\n    #endif\r\n    \r\n    _XL_WAIT_FOR_INPUT();\r\n}\r\n\r\n#define INITIALIZE_CROSS_LIB() \\\r\n    _XL_INIT_GRAPHICS(); \\\r\n    _XL_INIT_INPUT(); \\\r\n    _XL_INIT_SOUND();\r\n\r\n\r\nvoid initialize_game(void)\r\n{\r\n    alive = 1;\r\n    score = 0;\r\n    level = INITIAL_LEVEL;\r\n    explosion = 0;\r\n}\r\n\r\n\r\nvoid initialize_buildings(void)\r\n{\r\n    for(x=0;x<XSize-2;++x)\r\n    {\r\n        building_height[x] = 0;\r\n    }\r\n    for(x=FIRST_BULDING_X_POS;x<FIRST_BULDING_X_POS+BUILDINGS_NUMBER;++x)\r\n    {\r\n        #if YSize>=12\r\n        building_height[x] = (uint8_t) MIN_BUILDING_HEIGHT+level/LEVEL_FACTOR_SPEED_UP+(_XL_RAND()&AND_MASK);\r\n        #else\r\n        building_height[x] = (uint8_t) MIN_BUILDING_HEIGHT+(_XL_RAND()&AND_MASK);\r\n        #endif\r\n        tile_index = ((uint8_t) _XL_RAND())&7;\r\n        buildingType=building_tiles[tile_index];\r\n        #if !defined(_XL_NO_COLOR)\r\n        color_index = ((uint8_t) _XL_RAND())&7;\r\n        buildingColor=building_colors[color_index];\r\n        #endif\r\n        for(y=1;y<building_height[x];++y)\r\n        {\r\n            drawBuilding();   \r\n        }\r\n        _XL_PING_SOUND();\r\n    }\r\n}\r\n\r\n#if !defined(TINY_GAME)\r\n\r\n    #define show_level() \\\r\n            _XL_CLEAR_SCREEN(); \\\r\n            _XL_PRINT(XSize/2-4, 4, _LEVEL__STRING); \\\r\n            displayLevelMessage(); \\\r\n            _XL_SLEEP(1); \\\r\n            _XL_WAIT_FOR_INPUT(); \\\r\n\r\n#else\r\n    #define show_level()\r\n#endif\r\n\r\n\r\nvoid initialize_level(void)\r\n{\r\n            bombActive = 0;\r\n            bomb_x = 0;\r\n            bomb_y = MAX_Y-2;\r\n            bonus = 0;\r\n            remaining_buildings = BUILDINGS_NUMBER;\r\n\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            for(x=0;x<XSize;++x)\r\n            {\r\n                drawRoad();\r\n            }\r\n            initialize_buildings();\r\n\r\n            _XL_SLEEP(1);\r\n            y = INITIAL_PLANE_Y;\r\n            x = 1;\r\n            \r\n            displayScore();\r\n            \r\n            #if !defined(TINY_GAME)\r\n            _XL_DRAW(0,0,SCORE_TEXT_LEFT_TILE, _XL_GREEN);\r\n            _XL_DRAW(1,0,SCORE_TEXT_RIGHT_TILE, _XL_GREEN);\r\n            \r\n            _XL_DRAW(XSize-5,0,HI_TEXT_TILE, _XL_RED);\r\n            #endif\r\n            \r\n            #if XSize>=20 && !defined(TINY_GAME)\r\n                _XL_DRAW(XSize-8,0,LV_TEXT_TILE, _XL_GREEN);\r\n                displayLevel();\r\n            #endif\r\n            #if XSize>=16 && !defined(TINY_GAME)\r\n                _XL_DRAW(REMAINING_X-1,0,TWO_WINDOW_WALL_2_TILE, _XL_YELLOW);\r\n                displayRemainingBuilings();\r\n            #endif\r\n            \r\n            \r\n            displayHiScore(XSize-4);\r\n}\r\n\r\n\r\nvoid handle_non_active_bomb(void)\r\n{\r\n    if(explosion)\r\n    {\r\n        deleteExplosion();\r\n        explosion = 0;\r\n    }\r\n    \r\n    if((y<MAX_Y-2) && _XL_KEY_PRESSED())\r\n    {\r\n        _XL_SHOOT_SOUND();\r\n        ++bombActive;\r\n        bomb_x = x;\r\n        bomb_y = y+1;\r\n        \r\n        if(building_height[x])\r\n        {\r\n            building_height[x] = 0;\r\n            score+=10;\r\n            --remaining_buildings;\r\n            if(!remaining_buildings)\r\n            {\r\n                bonus = (uint16_t)20u*(uint16_t)(MAX_Y-y)+(uint16_t)level*20u;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\r\nvoid handle_active_bomb(void)\r\n{\r\n    // Draw animated bomb\r\n    \r\n    drawAnimatedBomb();\r\n    \r\n    ++bomb_y;\r\n\r\n    if(bomb_y>MAX_Y-3) // Bomb reaches the ground\r\n    {\r\n        drawBomb();\r\n        bombActive = 0;\r\n        explosion = 1;\r\n                 \r\n        #if XSize>=16\r\n            displayRemainingBuilings();\r\n        #endif\r\n        displayScore();\r\n\r\n        // Delete animated bomb\r\n        \r\n        deleteAnimatedBombUp();\r\n\r\n        drawExplosion();\r\n\r\n        _XL_SLOW_DOWN(5+_XL_SLOW_DOWN_FACTOR/4);\r\n    }\r\n}\r\n\r\n\r\n#define handle_bomb_movement() \\\r\n    do \\\r\n    { \\\r\n        if(bombActive) \\\r\n        { \\\r\n            drawBomb(); \\\r\n            deleteAnimatedBombUp(); \\\r\n        } \\\r\n    } \\\r\n    while(0)\r\n\r\n#define handle_bomb() \\\r\n    do \\\r\n    { \\\r\n        if(!bombActive ) \\\r\n        { \\\r\n            handle_non_active_bomb(); \\\r\n        } \\\r\n        else \\\r\n        { \\\r\n            handle_active_bomb(); \\\r\n        } \\\r\n    } \\\r\n    while(0)\r\n\r\n\r\n\r\n\r\nvoid handle_plane_movement(void)\r\n{\r\n    // Land safely\r\n    if(!remaining_buildings && (y<MAX_Y-2) && (x<XSize-3) )\r\n    {\r\n        deleteAnimatedPlaneBack();\r\n        deleteAnimatedPlaneCenter();\r\n        ++y;\r\n    }\r\n    _XL_WAIT_VSYNC();\r\n\r\n    drawAnimatedPlane();\r\n    _XL_REFRESH();\r\n\r\n    // _XL_SLEEP(1);\r\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/2-level*LEVEL_SPEED_UP);\r\n    \r\n    handle_bomb();\r\n    \r\n    _XL_WAIT_VSYNC();\r\n\r\n    deleteAnimatedPlaneBack();\r\n    drawPlane();\r\n    _XL_REFRESH();\r\n\r\n    #if defined(DEBUG_GHOST_DISPLAY)\r\n        UNSET_DEBUG_BORDER();\r\n    #endif\r\n    \r\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/2-level*LEVEL_SPEED_UP); // e.g., lv:9, slow-down fact:1800 -> 1800/2-9*32=900-288=612\r\n\r\n    handle_bomb_movement();\r\n\r\n    if(x<XSize-3)\r\n    {\r\n        ++x;\r\n    }\r\n    else if(y<MAX_Y-2)\r\n    {\r\n        #if defined(NO_ANIMATION) // Required because deletePlane() in this case only deletes the front\r\n            deletePlaneBack();\r\n        #endif\r\n        deletePlane();\r\n        x=1;\r\n        ++y;\r\n    }\r\n    \r\n    _XL_WAIT_VSYNC();\r\n    #if !defined(NO_ANIMATION)\r\n    deleteAnimatedPlaneBack();\r\n    #endif\r\n    \r\n}\r\n\r\n\r\nvoid level_completed(void)\r\n{\r\n    #if defined(NO_ANIMATION)                \r\n        _XL_DELETE(x-1,y);\r\n    #endif\r\n    drawPlane();\r\n    \r\n    #if !defined(TINY_GAME)\r\n    _XL_SET_TEXT_COLOR(_XL_YELLOW);\r\n    _XL_PRINT(1,2,_LEVEL_COMPLETED__STRING);\r\n    _XL_SLEEP(1);\r\n    #endif\r\n    ++level;\r\n    score+=bonus;\r\n    \r\n    #if !defined(TINY_GAME)\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINT(1,4,_BONUS__STRING);\r\n    for(bonus_ind=10;bonus_ind<=bonus;bonus_ind+=10)\r\n    {\r\n        _XL_PRINTD(7,4,4,bonus_ind);\r\n        _XL_SHOOT_SOUND();\r\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n    }\r\n    _XL_PRINTD(7,4,4,bonus);\r\n    #endif\r\n    displayScore();\r\n    _XL_SLEEP(1);\r\n}\r\n\r\n\r\nvoid plane_crash(void)\r\n{\r\n    #if defined(NO_ANIMATION)\r\n        deleteAnimatedPlaneBack();\r\n    #endif\r\n    drawPlaneBack();\r\n    _XL_EXPLOSION_SOUND();\r\n    displayScore();\r\n    displayGameOverMessage();\r\n    _XL_SLEEP(2);\r\n    alive = 0;\r\n    handle_hiscore();\r\n}\r\n\r\n#define handle_end_of_level() \\\r\n    do \\\r\n    { \\\r\n        if(!remaining_buildings) \\\r\n        { \\\r\n            level_completed(); \\\r\n        } \\\r\n        else \\\r\n        { \\\r\n            plane_crash(); \\\r\n        } \\\r\n        _XL_WAIT_FOR_INPUT(); \\\r\n    } \\\r\n    while(0)\r\n\r\n#define flying() ((y<MAX_Y-building_height[x+1]) && (y<MAX_Y-2 || x<XSize-3))\r\n\r\n#define game_completed() \\\r\n    _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\r\n    PRINT_CENTERED(_GAME_COMPLETED__STRING); \\\r\n    _XL_SLEEP(1); \\\r\n    _XL_WAIT_FOR_INPUT(); \\\r\n    _XL_PRINT(1,2,_DEL_STR); \\\r\n    for(y=2;y<MAX_Y-1;++y) \\\r\n    { \\\r\n        for(x=1;x<XSize-2;x+=2) \\\r\n        { \\\r\n            drawPlane(); \\\r\n        } \\\r\n    } \\\r\n    _XL_SLEEP(1); \\\r\n    displayGameOverMessage(); \\\r\n    _XL_SLEEP(2); \\\r\n    handle_hiscore(); \\\r\n    _XL_SLEEP(1); \\\r\n    _XL_WAIT_FOR_INPUT(); \\\r\n\r\n\r\nint main(void)\r\n{        \r\n    INITIALIZE_CROSS_LIB();\r\n    \r\n    hiscore = 0;\r\n\r\n    while(1)\r\n    {\r\n        initialize_game();\r\n\r\n        intro();\r\n        while(alive && (level < FINAL_LEVEL+1))\r\n        {\r\n            show_level();\r\n            initialize_level();\r\n            while(flying())\r\n            {\r\n                handle_plane_movement();\r\n            } // while flying\r\n            handle_end_of_level();             // No longer flying\r\n        } // while(alive || (level>FINAL})) -> restart level\r\n        if(alive) // Game completed\r\n        {\r\n            game_completed();\r\n        }\r\n    } // while(1) -> restart from level 1\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/games/bomber/makefiles/Makefile.override",
    "content": ""
  },
  {
    "path": "src/games/bomber/tile_aliases.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#include \"cross_lib.h\"\n\n\n#if _XL_NUMBER_OF_TILES<=6\n    #define ROAD_TILE _TILE_0\n\n    #define PLANE_BACK_TILE _TILE_1\n    #define PLANE_FRONT_TILE _TILE_2\n\n    #define BOMB_TILE _TILE_3\n\n    #define THREE_WINDOW_WALL_1_TILE _TILE_4\n    #define SMALL_TWO_WINDOW_WALL_1_TILE _TILE_4\n    #define WALL_1_TILE _TILE_4\n    #define TWO_WINDOW_WALL_1_TILE _TILE_4\n    #define THREE_WINDOW_WALL_2_TILE _TILE_4\n    #define TWO_WINDOW_WALL_2_TILE _TILE_4\n    #define SMALL_TWO_WINDOW_WALL_2_TILE _TILE_4\n    #define WALL_2_TILE _TILE_4\n    \n    #define EXPLOSION_TILE _TILE_5\n\n#else\n    // Plane\n    #define THREE_WINDOW_WALL_1_TILE _TILE_15\n    #define PLANE_BACK_TILE _TILE_1\n    #define PLANE_FRONT_TILE _TILE_2\n    \n    #define ANIMATED_PLANE_BACK_TILE _TILE_8\n    #define ANIMATED_PLANE_CENTER_TILE _TILE_10\n    #define ANIMATED_PLANE_FRONT_TILE _TILE_17\n    \n\n    // Bomb\n    #define BOMB_TILE _TILE_3\n    #define ANIMATED_BOMB_UP_TILE _TILE_12\n    #define ANIMATED_BOMB_DOWN_TILE _TILE_13\n\n    #define ROAD_TILE _TILE_0\n\n    // WALL\n    #define SMALL_TWO_WINDOW_WALL_1_TILE _TILE_4\n    #define WALL_1_TILE _TILE_18\n    #define TWO_WINDOW_WALL_1_TILE _TILE_7\n    #define THREE_WINDOW_WALL_2_TILE _TILE_15\n    #define TWO_WINDOW_WALL_2_TILE _TILE_7\n    #define SMALL_TWO_WINDOW_WALL_2_TILE _TILE_4\n    #define WALL_2_TILE _TILE_11\n\n    // Score/Hiscore/Level\n    #define SCORE_TEXT_LEFT_TILE _TILE_14\n    #define SCORE_TEXT_RIGHT_TILE _TILE_16\n    \n    #define HI_TEXT_TILE _TILE_6\n    #define LV_TEXT_TILE _TILE_9\n    \n    //\n    #define EXPLOSION_TILE _TILE_5\n\n#endif\n    #define _PLANE_COLOR _XL_CYAN\n    #define _SMALL_TWO_WINDOW_WALL_1_COLOR _XL_WHITE\n    #define _TWO_WINDOW_WALL_1_COLOR _XL_YELLOW\n    #define _WALL_1_COLOR _XL_RED\n    #define _BOMB_COLOR _XL_WHITE\n    #define _ROAD_COLOR _XL_CYAN\n    #define _BRICK_COLOR _XL_GREEN\n    #define _WALL_2_COLOR _XL_YELLOW\n    #define _THREE_WINDOW_WALL_1_COLOR _XL_WHITE\n    #define _THREE_WINDOW_WALL_2_COLOR _XL_WHITE\n    #define _TWO_WINDOW_WALL_2_COLOR _XL_RED\n    #define _SMALL_TWO_WINDOW_WALL_2_COLOR _XL_YELLOW\n\n\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile0.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile1.txt",
    "content": "12,6,51,25,31,15,1,3"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile10.txt",
    "content": "32,48,24,12,63,63,12,24"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile11.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile12.txt",
    "content": "0,0,0,0,0,33,33,45"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile13.txt",
    "content": "63,30,30,30,12,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile14.txt",
    "content": "0,59,41,41,57,33,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile15.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile16.txt",
    "content": "0,46,8,4,2,14,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile17.txt",
    "content": "0,0,0,0,48,56,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile18.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile19.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile2.txt",
    "content": "0,0,0,32,62,63,32,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile20.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile21.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile22.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile23.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile24.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile3.txt",
    "content": "33,33,45,63,30,30,30,12"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile4.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,18,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile6.txt",
    "content": "0,21,21,29,21,21,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile7.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile8.txt",
    "content": "1,0,6,3,3,1,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x8/tile9.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile0.txt",
    "content": "63,63,36,9,63,63,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile1.txt",
    "content": "12,6,51,25,31,15,1,3,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile10.txt",
    "content": "32,48,24,12,63,63,12,24,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile11.txt",
    "content": "31,19,31,19,31,25,31,25,31"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile12.txt",
    "content": "0,0,0,0,0,0,33,33,45"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile13.txt",
    "content": "63,30,30,30,12,0,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile14.txt",
    "content": "0,59,41,41,57,33,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile15.txt",
    "content": "63,41,63,37,63,41,63,37,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile16.txt",
    "content": "0,46,8,4,2,14,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile17.txt",
    "content": "0,0,0,0,48,56,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile18.txt",
    "content": "63,49,63,35,63,49,63,35,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile19.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile2.txt",
    "content": "0,0,0,32,62,63,32,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile20.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile21.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile22.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile23.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile24.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile3.txt",
    "content": "0,33,33,45,63,30,30,30,12"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile4.txt",
    "content": "31,21,31,21,31,21,31,21,31"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,18,63,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile6.txt",
    "content": "0,21,21,29,21,21,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile7.txt",
    "content": "63,45,63,45,63,45,63,45,63"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile8.txt",
    "content": "1,0,6,3,3,1,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/6x9/tile9.txt",
    "content": "0,37,37,37,37,50,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile0.txt",
    "content": "127,127,113,71,127,127,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile1.txt",
    "content": "12,6,51,25,31,15,1,3"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile10.txt",
    "content": "96,48,24,12,127,127,12,24"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile11.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile12.txt",
    "content": "0,0,0,0,0,33,33,45"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile13.txt",
    "content": "63,30,30,30,12,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile14.txt",
    "content": "0,59,41,41,57,33,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile15.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile16.txt",
    "content": "0,92,16,8,4,28,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile17.txt",
    "content": "0,0,0,0,112,120,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile18.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile19.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile2.txt",
    "content": "0,0,0,64,126,127,64,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile20.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile21.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile22.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile23.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile24.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile3.txt",
    "content": "33,33,45,63,30,30,30,12"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile4.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,42,127,127"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile6.txt",
    "content": "0,21,21,29,21,21,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile7.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile8.txt",
    "content": "0,0,6,3,3,1,0,0"
  },
  {
    "path": "src/games/bomber/tiles/7x8/tile9.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile0.txt",
    "content": "255,255,192,129,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile1.txt",
    "content": "6,195,97,127,63,1"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile10.txt",
    "content": "96,48,24,255,255,24"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile11.txt",
    "content": "126,102,126,102,126,102"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile12.txt",
    "content": "0,0,0,66,90,126"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile13.txt",
    "content": "60,60,24,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile14.txt",
    "content": "$db,$92,$d2,$52,$db,$00"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile15.txt",
    "content": "255,165,255,165,255,165"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile16.txt",
    "content": "$b3,$aa,$b3,$aa,$ab,$00"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile17.txt",
    "content": "0,0,0,224,240,0"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile18.txt",
    "content": "126,102,126,102,126,102"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile19.txt",
    "content": "0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile2.txt",
    "content": "0,0,128,254,255,128"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile20.txt",
    "content": "0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile21.txt",
    "content": "255,0,48,48,0,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile22.txt",
    "content": "255,0,48,48,0,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile23.txt",
    "content": "255,0,48,48,0,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile24.txt",
    "content": "255,0,48,48,0,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile3.txt",
    "content": "66,90,126,60,60,24"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile4.txt",
    "content": "126,90,126,90,126,90"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile5.txt",
    "content": "0,0,0,170,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile6.txt",
    "content": "$54,$54,$74,$54,$54,$00"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile7.txt",
    "content": "255,153,255,153,255,153"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile8.txt",
    "content": "0,12,6,7,3,0"
  },
  {
    "path": "src/games/bomber/tiles/8x6/tile9.txt",
    "content": "37,37,37,37,50,0"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile0.txt",
    "content": "255,255,255,192,129,255,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile1.txt",
    "content": "12,6,195,97,127,63,1,3"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile10.txt",
    "content": "192,96,48,24,255,255,24,48"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile11.txt",
    "content": "126,102,126,102,126,102,126,102"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile12.txt",
    "content": "0,0,0,0,66,66,90,126"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile13.txt",
    "content": "60,60,60,24,0,0,0,0"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile14.txt",
    "content": "$db,$92,$92,$d2,$52,$52,$db,$00"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile15.txt",
    "content": "255,165,255,165,255,165,255,165"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile16.txt",
    "content": "$b3,$aa,$aa,$b3,$aa,$aa,$ab,$00"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile17.txt",
    "content": "0,0,0,0,224,240,0,0"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile18.txt",
    "content": "126,102,126,102,126,102,126,102"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile19.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile2.txt",
    "content": "0,0,0,128,254,255,128,0"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile20.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile21.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile22.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile23.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile24.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile3.txt",
    "content": "66,66,90,126,60,60,60,24"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile4.txt",
    "content": "126,90,126,90,126,90,126,90"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,170,255,255"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile6.txt",
    "content": "$54,$54,$54,$74,$54,$54,$54,$00"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile7.txt",
    "content": "255,153,255,153,255,153,255,153"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile8.txt",
    "content": "0,0,12,6,7,3,0,0"
  },
  {
    "path": "src/games/bomber/tiles/8x8/tile9.txt",
    "content": "37,37,37,37,37,37,50,0"
  },
  {
    "path": "src/games/bomber/tiles/ASCII/aquarius/aquarius_char_tiles.h",
    "content": "#ifndef _AQUARIUS_CHAR_TILES_H\r\n#define _AQUARIUS_CHAR_TILES_H\r\n\r\n     // Plane\r\n    #define _TILE_1 154\r\n    #define _TILE_2 172\r\n    // arrow 6\r\n\r\n    // Animated plane\r\n    #define _TILE_0  243\r\n    #define _TILE_3 135\r\n    #define _TILE_17 _TILE_2    \r\n\r\n    // Building\r\n    #define _TILE_4 134\r\n    #define _TILE_5 209\r\n    #define _TILE_7 251\r\n    #define _TILE_11 191\r\n    #define _TILE_15 127\r\n\r\n    // Road\r\n    #define _TILE_8  208   \r\n\r\n    // Explosion\r\n    #define _TILE_18 216\r\n\r\n    // Score/Hiscore/Level\r\n    #define _TILE_6  'H'\r\n    #define _TILE_9  'L'\r\n    #define _TILE_14 'S'\r\n    #define _TILE_16 'C'\r\n\r\n    // Bomb\r\n    #define _TILE_12 208\r\n    //'!'\r\n  \r\n    #define _TILE_10 _TILE_1\r\n    //'o'\r\n\r\n    #define _TILE_13 _TILE_10\r\n    \r\n#endif // _AQUARIUS_CHAR_TILES_H\r\n"
  },
  {
    "path": "src/games/bomber/tiles/ASCII/aquarius/aquarius_quad_char_tiles.h",
    "content": "#ifndef _AQUARIUS_QUAD_CHAR_TILES_H\r\n#define _AQUARIUS_QUAD_CHAR_TILES_H\r\n\r\n    // This macros are indices\r\n\r\n    #define _TILE_0   1\r\n    #define _TILE_1   2\r\n    #define _TILE_2   3\r\n    #define _TILE_3   4\r\n    #define _TILE_4   5\r\n    #define _TILE_5   6\r\n    #define _TILE_6   7\r\n    #define _TILE_7   8\r\n    #define _TILE_8   9\r\n    #define _TILE_9  10\r\n    #define _TILE_10 11\r\n    #define _TILE_11 12\r\n    #define _TILE_12 13\r\n    #define _TILE_13 14\r\n    #define _TILE_14 15\r\n    \r\n    #define _TILE_15 (58-32)\r\n    #define _TILE_16 (59-32)\r\n    #define _TILE_17 (60-32)\r\n    #define _TILE_18 (61-32)\r\n    #define _TILE_19 (62-32)\r\n    #define _TILE_20 (63-32)\r\n    #define _TILE_21 (64-32)\r\n    \r\n    \r\n    #define _TILE_22 (91-32)\r\n    #define _TILE_23 (92-32)\r\n    #define _TILE_24 (93-32)\r\n    #define _TILE_25 (94-32)\r\n    #define _TILE_26 (95-32)\r\n\r\n\r\n    // -------------------------------------------------------------\r\n\r\n    // Animated Plane\r\n    #define _TILE_0_0 'a'\r\n    #define _TILE_0_1 'b'\r\n    #define _TILE_0_2 'c'\r\n    #define _TILE_0_3 'd'\r\n\r\n    #define _TILE_3_0 'a'\r\n    #define _TILE_3_1 'b'\r\n    #define _TILE_3_2 'c'\r\n    #define _TILE_3_3 'd' \r\n\r\n    #define _TILE_17_0 'a'\r\n    #define _TILE_17_1 'b'\r\n    #define _TILE_17_2 'c'\r\n    #define _TILE_17_3 'd' \r\n    \r\n    \r\n    // Plane\r\n    #define _TILE_1_0 'a'\r\n    #define _TILE_1_1 'b'\r\n    #define _TILE_1_2 'c'\r\n    #define _TILE_1_3 'd'    \r\n \r\n    #define _TILE_2_0 'a'\r\n    #define _TILE_2_1 'b'\r\n    #define _TILE_2_2 'c'\r\n    #define _TILE_2_3 'd'\r\n\r\n\r\n    // Building\r\n    #define _TILE_4_0 'a'\r\n    #define _TILE_4_1 'b'\r\n    #define _TILE_4_2 'c'\r\n    #define _TILE_4_3 'd'\r\n    \r\n    #define _TILE_5_0 'a'\r\n    #define _TILE_5_1 'b'\r\n    #define _TILE_5_2 'c'\r\n    #define _TILE_5_3 'd'    \r\n\r\n    #define _TILE_7_0 'a'\r\n    #define _TILE_7_1 'b'\r\n    #define _TILE_7_2 'c'\r\n    #define _TILE_7_3 'd'\r\n\r\n    #define _TILE_11_0 'a'\r\n    #define _TILE_11_1 'b'\r\n    #define _TILE_11_2 'c'\r\n    #define _TILE_11_3 'd'\r\n\r\n    #define _TILE_15_0 'a'\r\n    #define _TILE_15_1 'b'\r\n    #define _TILE_15_2 'c'\r\n    #define _TILE_15_3 'd' \r\n\r\n\r\n    // Road\r\n    #define _TILE_8_0 243\r\n    #define _TILE_8_1 243\r\n    #define _TILE_8_2 243\r\n    #define _TILE_8_3 243\r\n\r\n\r\n    // Explosion\r\n    #define _TILE_18_0 209\r\n    #define _TILE_18_1 209\r\n    #define _TILE_18_2 209\r\n    #define _TILE_18_3 209 \r\n\r\n \r\n    // Bomb\r\n    #define _TILE_12_0 'a'\r\n    #define _TILE_12_1 'b'\r\n    #define _TILE_12_2 'c'\r\n    #define _TILE_12_3 'd' \r\n \r\n \r\n    // Hiscore\r\n    #define _TILE_6_0 'H'\r\n    #define _TILE_6_1 'I'\r\n    #define _TILE_6_2 ' '\r\n    #define _TILE_6_3 ' '\r\n  \r\n  \r\n    // Level\r\n    #define _TILE_9_0 'L'\r\n    #define _TILE_9_1 'V'\r\n    #define _TILE_9_2 ' '\r\n    #define _TILE_9_3 ' '   \r\n    \r\n    \r\n    // Score\r\n    #define _TILE_14_0 'P'\r\n    #define _TILE_14_1 'T'\r\n    #define _TILE_14_2 ' '\r\n    #define _TILE_14_3 ' '\r\n\r\n    #define _TILE_16_0 'S'\r\n    #define _TILE_16_1 ' '\r\n    #define _TILE_16_2 ' '\r\n    #define _TILE_16_3 ' '\r\n    \r\n \r\n    // Unused\r\n    #define _TILE_10_0 'a'\r\n    #define _TILE_10_1 'b'\r\n    #define _TILE_10_2 'c'\r\n    #define _TILE_10_3 'd'   \r\n    \r\n    #define _TILE_13_0 'a'\r\n    #define _TILE_13_1 'b'\r\n    #define _TILE_13_2 'c'\r\n    #define _TILE_13_3 'd'    \r\n\r\n    #define _TILE_19_0 'a'\r\n    #define _TILE_19_1 'b'\r\n    #define _TILE_19_2 'c'\r\n    #define _TILE_19_3 'd' \r\n\r\n    #define _TILE_20_0 'a'\r\n    #define _TILE_20_1 'b'\r\n    #define _TILE_20_2 'c'\r\n    #define _TILE_20_3 'd'\r\n    \r\n    #define _TILE_21_0 'a'\r\n    #define _TILE_21_1 'b'\r\n    #define _TILE_21_2 'c'\r\n    #define _TILE_21_3 'd'    \r\n \r\n    #define _TILE_22_0 'a'\r\n    #define _TILE_22_1 'b'\r\n    #define _TILE_22_2 'c'\r\n    #define _TILE_22_3 'd'\r\n    \r\n    #define _TILE_23_0 'a'\r\n    #define _TILE_23_1 'b'\r\n    #define _TILE_23_2 'c'\r\n    #define _TILE_23_3 'd' \r\n\r\n    #define _TILE_24_0 'a'\r\n    #define _TILE_24_1 'b'\r\n    #define _TILE_24_2 'c'\r\n    #define _TILE_24_3 'd'    \r\n \r\n    #define _TILE_25_0 'a'\r\n    #define _TILE_25_1 'b'\r\n    #define _TILE_25_2 'c'\r\n    #define _TILE_25_3 'd'\r\n    \r\n    #define _TILE_26_0 'a'\r\n    #define _TILE_26_1 'b'\r\n    #define _TILE_26_2 'c'\r\n    #define _TILE_26_3 'd' \r\n           \r\n#endif // _AQUARIUS_QUAD_CHAR_TILES_H\r\n"
  },
  {
    "path": "src/games/bomber/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if defined(__TARGET_SPECIFIC_ASCII) && defined(__AQUARIUS__) && !defined(__QUAD_MEMORY_MAPPED_GRAPHICS) && !defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n    #include \"aquarius/aquarius_char_tiles.h\"\r\n#else\r\n    \r\n    #if !defined(__CIDELSA__)\r\n        // Plane\r\n        #define _TILE_1  '-'\r\n        #define _TILE_2  '>'\r\n\r\n        // Animated plane\r\n        #define _TILE_0  '='\r\n\t\t\r\n\t\t#if defined(__MC10__)\r\n\t\t\t#define _TILE_5 '*'\r\n\t\t#elif defined(__CIDELSA__)\r\n\t\t\t#define _TILE_5 'X'\r\n\t\t#else\r\n\t\t\t#define _TILE_5 '~'\r\n\t\t#endif\r\n\r\n        #define _TILE_8  '='\r\n    #else\r\n         // Plane\r\n        #define _TILE_1  'E'\r\n        #define _TILE_2  'D'\r\n\r\n        // Animated plane\r\n        #define _TILE_0  'H'\r\n        #define _TILE_5 'S'\r\n\r\n        #define _TILE_8  'Z'   \r\n\r\n    #endif\r\n\r\n    #define _TILE_10 _TILE_1\r\n    #define _TILE_17 _TILE_2\r\n\r\n    #if defined(__CIDELSA__)\r\n        #define _TILE_4  'O'\r\n        #define _TILE_18 'X'\r\n        #define _TILE_7  'M'\r\n        #define _TILE_11 'N'\r\n        #define _TILE_15 'X'\r\n        #define _TILE_19 'Q'\r\n        #define _TILE_20 'T'\r\n        #define _TILE_21 'U'\r\n        #define _TILE_22 'B'\r\n        #define _TILE_23 'T'\r\n        #define _TILE_24 'W'\r\n        #define _TILE_25 'I'\r\n    #endif\r\n\r\n    #define _TILE_6  'H'\r\n    #define _TILE_9  'L'\r\n    #define _TILE_14 'S'\r\n    #define _TILE_16 'C'\r\n\r\n    #define _TILE_12 'I'\r\n\r\n    #define _TILE_3 'O'\r\n\r\n    #define _TILE_13 'O'\r\n\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/bomber/tiles/ASCII/quad_char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#if defined(__TARGET_SPECIFIC_ASCII) && defined(__AQUARIUS__) && !defined(__QUAD_MEMORY_MAPPED_GRAPHICS) && !defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n    #include \"aquarius/aquarius_char_tiles.h\"\r\n#elif defined(__TARGET_SPECIFIC_ASCII) && defined(__AQUARIUS__) && defined(__QUAD_MEMORY_MAPPED_GRAPHICS)\r\n    #include \"aquarius/aquarius_quad_char_tiles.h\"\r\n#else\r\n    \r\n    #if !defined(__CIDELSA__)\r\n        // Plane\r\n        #define _TILE_1  '-'\r\n        #define _TILE_2  '>'\r\n\r\n        // Animated plane\r\n        #define _TILE_0  '='\r\n        #define _TILE_5 '~'\r\n\r\n        #define _TILE_8  '='\r\n    #else\r\n         // Plane\r\n        #define _TILE_1  'E'\r\n        #define _TILE_2  'D'\r\n\r\n        // Animated plane\r\n        #define _TILE_0  'H'\r\n        #define _TILE_5 'S'\r\n\r\n        #define _TILE_8  'Z'   \r\n\r\n    #endif\r\n\r\n    #define _TILE_3 'O'\r\n    #define _TILE_17 _TILE_2\r\n\r\n    #if defined(__CIDELSA__)\r\n        #define _TILE_4  'O'\r\n        #define _TILE_18  'X'\r\n        #define _TILE_7  'M'\r\n        #define _TILE_11 'N'\r\n        #define _TILE_15 'X'\r\n        #define _TILE_19 'Q'\r\n        #define _TILE_20 'T'\r\n        #define _TILE_21 'U'\r\n        #define _TILE_22 'B'\r\n        #define _TILE_23 'T'\r\n        #define _TILE_24 'W'\r\n        #define _TILE_25 'I'\r\n        \r\n    #else\r\n        #define _TILE_18  'X'\r\n        #define _TILE_11 'N'\r\n        #define _TILE_7  'M'\r\n        #define _TILE_15 'X'\r\n        #define _TILE_4  'O'\r\n    #endif\r\n\r\n    #define _TILE_6  'H'\r\n    #define _TILE_9  'L'\r\n    #define _TILE_14 'S'\r\n    #define _TILE_16 'C'\r\n\r\n    #define _TILE_12 'I'\r\n\r\n    #define _TILE_10 _TILE_1\r\n\r\n    #define _TILE_13 _TILE_10\r\n\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/chase/Makefile.chase",
    "content": "######################################################################\n# Cross-Chase files\n#\nNO_CHASE_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/split_files/move_player.c \\\n\t$(SOURCE_PATH)/split_files/ghost.c  $(SOURCE_PATH)/split_files/level.c $(SOURCE_PATH)/split_files/character.c $(SOURCE_PATH)/split_files/game_text.c \\\n\t$(SOURCE_PATH)/split_files/main.c \\\n\t$(SOURCE_PATH)/split_files/init_images.c\n\n#\nTINY_FILES ?= $(NO_CHASE_FILES) $(SOURCE_PATH)/split_files/strategy.c\n\n#\nTEST_FILES ?= $(NO_CHASE_FILES)\n\n#\nLIGHT_ONLY_FILES ?= $(SOURCE_PATH)/split_files/item.c $(SOURCE_PATH)/split_files/skull.c $(SOURCE_PATH)/split_files/bullet.c \n\n#\nFULL_ONLY_FILES ?= $(SOURCE_PATH)/split_files/horizontal_missile.c $(SOURCE_PATH)/split_files/rocket.c \n\n#\nLIGHT_FILES ?= $(TINY_FILES) $(LIGHT_ONLY_FILES) \n\n#\n# FULL_FILES ?= $(LIGHT_FILES) $(FULL_ONLY_FILES) $(SOURCE_PATH)/end_screen.c\n\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c\n\nGLOBAL_OPTS =   -D_XL_NO_SMALL_LETTERS\n\n\nGAME_NAME := chase\n\nPARENT_DIR = games\n\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\ninclude ./Makefile_common\n\n\n\n\n\n###########################################################################################\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\n\n\n\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n"
  },
  {
    "path": "src/games/chase/Makefile.chase_BK",
    "content": "######################################################################\n# Makefile for CROSS-CHASE \n\nGAME_NAME = chase\n\ninclude ./games/$(GAME_NAME)/project_config.mk\n\nPARENT_DIR = games\n\nSOURCE_PATH := $(PARENT_DIR)/$(GAME_NAME)\n\nGLOBAL_OPTS =  \n# -D_DEFAULT_ASCII\n# -D_BACKGROUND_COLOR=_XL_WHITE\n\n###################################\n\nSCCZ80_OPTS ?=  $(GLOBAL_OPTS) $(Z88DK_MAKEFILE_COMPILATION_OPTS)\n#-O0\n#-O3\n\nSCCZ80_ROM_OPTS ?= $(GLOBAL_OPTS) $(Z88DK_MAKEFILE_COMPILATION_OPTS)\n#-O0\n#-O3\n\nZSDCC_OPTS ?=  $(ZSDCC_MAKEFILE_COMPILATION_OPTS) $(GLOBAL_OPTS)\n# -SO2\n#-SO0\n# -SO3 --max-allocs-per-node200000\n\nZSDCC_ROM_OPTS ?= $(ZSDCC_MAKEFILE_COMPILATION_OPTS) $(GLOBAL_OPTS)\n# -SO3\n# -SO3 --max-allocs-per-node200000\n\nZ88DK_MAKE_OPTS ?= $(ZSDCC_MAKEFILE_THREADS_OPTS)\n#-j 8\n\n####################################################################################################################\n# COMMON INCLUDES\n\ninclude makefiles.common/auxiliary/Makefile_ALL\n\n#####################################################################\n# Draw skip\nLIGHT_DRAW_SKIP ?= -DBOMB_DRAW_SKIP=1 -DWALL_DRAW_SKIP=3\nDRAW_SKIP ?=       -DBOMB_DRAW_SKIP=1 -DWALL_DRAW_SKIP=7\nEXTRA_DRAW_SKIP ?= -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15\nULTRA_DRAW_SKIP ?= -DBOMB_DRAW_SKIP=7 -DWALL_DRAW_SKIP=15 -DGHOST_DRAW_SKIP=1 \n\n\n######################################################################\n# Cross-Shoot files\n#\nNO_CHASE_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n\t$(SOURCE_PATH)/move_player.c \\\n\t$(SOURCE_PATH)/ghost.c  $(SOURCE_PATH)/level.c $(SOURCE_PATH)/character.c $(SOURCE_PATH)/game_text.c \\\n\t$(SOURCE_PATH)/main.c \\\n\t$(SOURCE_PATH)/init_images.c\n\n#\nTINY_FILES ?= $(NO_CHASE_FILES) $(SOURCE_PATH)/strategy.c\n\n#\nTEST_FILES ?= $(NO_CHASE_FILES)\n\n#\nLIGHT_ONLY_FILES ?= $(SOURCE_PATH)/item.c $(SOURCE_PATH)/skull.c $(SOURCE_PATH)/bullet.c \n\n#\nFULL_ONLY_FILES ?= $(SOURCE_PATH)/horizontal_missile.c $(SOURCE_PATH)/rocket.c \n\n#\nLIGHT_FILES ?= $(TINY_FILES) $(LIGHT_ONLY_FILES) \n\n#\nFULL_FILES ?= $(LIGHT_FILES) $(FULL_ONLY_FILES)\n\n\n\n\n####################################################################################################################\n# COMMON INCLUDES\n\n# include makefiles.common/auxiliary/Makefile_ALL\n\n\n\n\n#############################################################################################################################################\n\n# All vintage and GCC targets that can be compiled under CYGWIN, i.e., not including gcc_z8k_targets and not including emcc_targets\nall_more: \\\n    cc65_targets \\\n    cmoc_targets \\\n    ack_targets \\\n    lcc1802_targets \\\n    xtc68_targets \\\n    gcc_targets \\\n    gcc_atari_st_targets \\\n    gcc_amiga_targets \\\n    gcc_ti99_targets \\\n    z88dk_targets_more\n\nifeq ($(DO_WIN),1)\nall: \\\n    cc65_targets \\\n    cmoc_targets \\\n    lcc1802_targets \\\n    z88dk_targets\nelse\nall: \\\n    cc65_targets \\\n    cmoc_targets \\\n    z88dk_targets\nendif\n\n\n####################################################################################################################\n# TARGETS PER DEV-KIT\n\n\n# ------------------------------------------------------------------------------------------\n# - CC65 \n\ninclude games/chase/makefiles.chase/Makefile.cc65_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - Z88DK \n\ninclude games/chase/makefiles.chase/Makefile.z88dk_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - CMOC\n\ninclude games/chase/makefiles.chase/Makefile.cmoc_targets\n\n# ------------------------------------------------------------------------------------------\n# - ACK\n\ninclude games/chase/makefiles.chase/Makefile.ack_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - GCC\n\ninclude games/chase/makefiles.chase/Makefile.gcc_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - VBCC\n\ninclude games/chase/makefiles.chase/Makefile.vbcc_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - CC6303\n\ninclude games/chase/makefiles.chase/Makefile.cc6303_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - GCC AMIGA\n\ninclude games/chase/makefiles.chase/Makefile.gcc_amiga_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - GCC ATARI_ST\n\ninclude games/chase/makefiles.chase/Makefile.gcc_atari_st_targets\n\n# ------------------------------------------------------------------------------------------\n# - XTC68\n\ninclude games/chase/makefiles.chase/Makefile.xtc68_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - LCC1802\n\ninclude games/chase/makefiles.chase/Makefile.lcc1802_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - GCC Z8K PCOS\n\ninclude games/chase/makefiles.chase/Makefile.gcc_z8k_pcos_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - EMCC\n\ninclude games/chase/makefiles.chase/Makefile.emcc_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - GCC TMS9900\n\ninclude games/chase/makefiles.chase/Makefile.gcc_tms9900_targets\n\n#include games/chase/makefiles.chase/Makefile.gcc_tms9900_test\n\n# ------------------------------------------------------------------------------------------\n# - SDCC\n\ninclude games/chase/makefiles.chase/Makefile.sdcc_targets\n\n\n# ------------------------------------------------------------------------------------------\n# - WINCMOC\n#\n\n#include games/chase/makefiles.chase/Makefile.wincmoc_targets\n\n\n#############################################################################################################################################\n# Cross dev-kit \ninclude games/chase/makefiles.chase/Makefile.cross-dev-kit_targets\n\n\n####################################################################################################################\n# Alternative builds\t\n\n# - Z88DK\ninclude makefiles.other/chase/alt/Makefile.z88dk_alternative_builds\n\n# - CC65\ninclude makefiles.other/chase/alt/Makefile.cc65_alternative_builds\n\n####################################################################################################################\n# WIP\n\n# - Z88DK\ninclude makefiles.other/chase/wip/Makefile.z88dk_wip_targets\n\n# - CC65\ninclude makefiles.other/chase/wip/Makefile.cc65_wip_targets\n\n# - ACK\ninclude makefiles.other/chase/wip/Makefile.ack_wip_targets\n\n####################################################################################################################\n# EXPERIMENTAL\n\ninclude makefiles.other/chase/experimental/Makefile.z88dk_experimental_targets\n\n\n"
  },
  {
    "path": "src/games/chase/bullet.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#ifndef _MISSILE_HEADER\n#define _MISSILE_HEADER\n\n#if !defined(TINY_GAME)\n\n\t#include \"character.h\"\n\t#include \"settings.h\"\n\t#include \"definitions.h\"\n\n\tvoid handle_bullet(void);\n\n\tvoid checkBullet(Character *bulletPtr);\n\n\tvoid bulletVsGhost(Character * bulletPtr,\n\t\t\t\t\t\t\t Character * ghostPtr);\n\t\t\n\tvoid bulletVsGhosts(Character * bulletPtr);\n\n\tvoid bulletVsSkull(register Character *bulletPtr);\n\t\t\t\t\n\tvoid _moveBullet(register Character * bulletPtr);\n\t\t\n\tvoid moveBullet(register Character * bulletPtr);\n\n\n\tvoid reducePowerUpsCoolDowns(void);\n\t\t\n\t#if defined(FULL_GAME)\n\t\tvoid handle_chasing_bullet(void);\n\t#endif\n\t\t\n#endif\t// !defined(TINY_GAME)\n\n#endif //_MISSILE\n\n"
  },
  {
    "path": "src/games/chase/character.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#ifndef _CHARACTER\n#define _CHARACTER\n\n#include \"cross_lib.h\"\n\n#include \"settings.h\"\n\nstruct CharacterStruct\n{\n\t// character coordinates\n\tuint8_t _x;\n\tuint8_t _y;\n\t\n\t// _status decides whether the character is active\n\tuint8_t _status;\n\t\n\tImage* _imagePtr;\n};\n\ntypedef struct CharacterStruct Character;\n\n#if !defined(NO_BLINKING)\nvoid _blink_draw(uint8_t x, uint8_t y, Image * image, uint8_t *blinkCounter);\n#endif\n\n#include \"settings.h\"\n\n#if defined(ANIMATE_PLAYER)\n\t#define PLAYER_IMAGE PLAYER_DOWN_IMAGE\n#endif\n\n#define playerReachedGhosts() sameLocationAsAnyLocation(player._x, player._y, ghosts, GHOSTS_NUMBER)\n\n#define characterReachedBombs(preyPtr) sameLocationAsAnyLocation((preyPtr)->_x, (preyPtr)->_y, bombs, BOMBS_NUMBER)\n\n#define areCharctersAtSamePosition(lhs, rhs)isCharacterAtLocation((lhs)->_x, (lhs)->_y,rhs)\n\nextern uint16_t points;\n\nextern uint8_t ghostCount;\n\nextern Image INVINCIBILITY_IMAGE;\n\n#if defined(FULL_GAME)\n\tuint8_t playerKilledBy(Character *enemyPtr);\n#endif\n\nvoid displayCharacter(Character * characterPtr);\n\nvoid deleteCharacter(Character * characterPtr);\n\n//\n\n#if defined(ANIMATE_PLAYER)\n\textern Image PLAYER_LEFT_IMAGE;\n\textern Image PLAYER_RIGHT_IMAGE;\n\textern Image PLAYER_UP_IMAGE;\n\textern Image PLAYER_DOWN_IMAGE;\n\n\t#define SHOW_LEFT() player._imagePtr = (Image *)&PLAYER_LEFT_IMAGE\n\t#define SHOW_RIGHT() player._imagePtr = (Image *)&PLAYER_RIGHT_IMAGE \n\t#define SHOW_UP() player._imagePtr = (Image *)&PLAYER_UP_IMAGE\n\t#define SHOW_DOWN() player._imagePtr = (Image *)&PLAYER_DOWN_IMAGE\n#else\n\t#define SHOW_LEFT() { }\n\t#define SHOW_RIGHT() { }\n\t#define SHOW_UP() { }\n\t#define SHOW_DOWN() { }\t\t\n#endif\n\n#define DRAW_CHARACTER(x,y,image) _draw(x,y,image)\n\n#define DRAW_PLAYER(x,y,image) DRAW_CHARACTER(x,y,image)\n#define DRAW_GHOST(x,y,image) DRAW_CHARACTER(x,y,image)\n#define DRAW_SKULL(x,y,image) DRAW_CHARACTER(x,y,image)\n#define DRAW_BOMB(x,y,image) DRAW_CHARACTER(x,y,image)\n#define DRAW_MISSILE(x,y,image) DRAW_CHARACTER(x,y,image)\n\n\n#if defined(FULL_GAME) && !defined(_XL_NO_COLOR)\n    void _DRAW_PLAYER(void);\n#else\n    #define _DRAW_PLAYER() DRAW_PLAYER(player._x, player._y, player._imagePtr)\n#endif\n\n\n#define DRAW_BLINKING_PLAYER(x, y, image) _blink_draw(x,y,image, &playerBlink)\n\n#if !defined(_XL_NO_COLOR)\n    #define __DRAW(x,y,image) \\\n        _XL_DRAW(x,y, (image)->_imageData,(image)->_color) \n#else\n    #define __DRAW(x,y,image) \\\n        _XL_DRAW(x,y, (image)->_imageData,0) \n#endif\n\n\n#define _draw_stat(x, y, image) \\\n    __DRAW((x),(y),(image))\n\n#define _XLIB_DRAW(x,y,image) \\\n    _draw_stat(x, y, image) \n\n#define _XLIB_DELETE(x,y) \\\n    _delete_stat(x, y) \n\n#define _draw(x, y, image) \\\n    __DRAW((x),Y_OFFSET+(y),(image))\n\n#define _delete_stat(x, y) \\\n    _XL_DELETE((x),(y))\n\n#define _delete(x, y) \\\n    _XL_DELETE((x),Y_OFFSET+(y))\n\n#define DELETE_CHARACTER(x,y) _delete(x,y)\n#define DELETE_PLAYER(x,y,image) _delete(x,y)\n#define DELETE_GHOST(x,y,image) _delete(x,y)\n#define DELETE_SKULL(x,y,image) _delete(x,y)\t\n#define DELETE_BOMB(x,y,image) _delete(x,y)\n#define DELETE_POWERUP(x,y,image) _delete(x,y)\n#define DELETE_GUN(x,y,image) _delete(x,y)\n#define DELETE_MISSILE(x,y,image) _delete(x,y)\n#define DELETE_EXTRA_POINTS(x,y,image) _delete(x,y)\n#define DELETE_EXTRA_LIFE(x,y,image) _delete(x,y)\n#define DELETE_INVINCIBILITY(x,y,image) _delete(x,y)\t\n\n//\n\n#define displayPlayer(characterPtr) displayCharacter(characterPtr);\n#define displayGhost(characterPtr) displayCharacter(characterPtr);\n#define displayBomb(characterPtr) displayCharacter(characterPtr);\n#define displayHorizontalMissile(characterPtr) displayCharacter(characterPtr);\n#define displayRocket(characterPtr) displayCharacter(characterPtr);\n#define displayBullet(characterPtr) displayCharacter(characterPtr);\n#define displayChasingBullet(characterPtr) displayCharacter(characterPtr);\n#define displaySkull(characterPtr) displayCharacter(characterPtr);\n\n#define deletePlayer(characterPtr) deleteCharacter(characterPtr);\n#define deleteGhost(characterPtr) deleteCharacter(characterPtr);\n#define deleteBomb(characterPtr) deleteCharacter(characterPtr);\n#define deleteHorizontalMissile(characterPtr) deleteCharacter(characterPtr);\n#define deleteRocket(characterPtr) deleteCharacter(characterPtr);\n#define deleteBullet(characterPtr) deleteCharacter(characterPtr);\n#define deleteChasingBullet(characterPtr) deleteCharacter(characterPtr);\n#define deleteSkull(characterPtr) deleteCharacter(characterPtr);\n#define deletePowerUp(characterPtr) deleteCharacter(characterPtr);\n\n\nvoid initializeCharacter(register Character* characterPtr, uint8_t x, uint8_t y, uint8_t status, Image * imagePtr);\n\nuint8_t isCharacterAtLocation(uint8_t x, uint8_t y, Character * characterPtr);\n\nuint8_t wallReached(register Character *characterPtr);\n\nvoid playerDies(void);\n\nvoid checkBombsVsGhost(register Character * ghostPtr);\n\nuint8_t safeLocation(uint8_t x, uint8_t y);\n\nvoid relocateCharacter(register Character * characterPtr);\n\nvoid ghostDies(Character * ghostPtr);\n\nuint8_t sameLocationAsAnyLocation(uint8_t x, uint8_t y, Character *characterList, uint8_t length);\n\n#if defined(FULL_GAME)\n\tuint8_t innerWallReached(register Character *characterPtr);\n\tuint8_t horizWallsReached(void);\n#endif\n\n#if defined(FULL_GAME)\n    void DRAW_BROKEN_BRICK(uint8_t x, uint8_t y);\n#endif\n\n#endif // _CHARACTER\n"
  },
  {
    "path": "src/games/chase/config/game_config.mk",
    "content": "#\r\n\r\n# COCO_COLOR_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DFASTER_WALL_REDRAW -DNUMBER_OF_MISSILES=3\r\n\r\nCREATIVISION_GAME_OPTS ?= -DLESS_TEXT \r\n\r\nGAMATE_GAME_OPTS ?= -DLESS_TEXT -DNO_BLINKING -DSIMPLE_STRATEGY -DNO_HINTS -DNO_CONTROL_INSTRUCTIONS\r\n\r\nC128_Z80_80COL_GAME_OPTS ?= -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15\r\n    \r\n# ZX81_NO_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DNUMBER_OF_MISSILES=4 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL \r\n\r\nZX81_GFX_GAME_OPTS ?= -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DBOMB_DRAW_SKIP=7 -DWALL_DRAW_SKIP=15\r\n\r\n# APPLE2_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DNUMBER_OF_MISSILES=3\r\n\r\nCOMX_GAME_OPTS ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nPECOM_GAME_OPTS ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nTMC600_GAME_OPTS ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nMICRO_GAME_OPTS ?= -DNO_BLINKING -DGHOSTS_NUMBER=7\r\n\r\nCAMPUTERS_LYNX_GAME_OPTS ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nVIC20_EXP_3K_GAME_OPTS ?= -DNO_BLINKING -DNO_HINTS -DLESS_TEXT -DGHOSTS_NUMBER=8\r\n\r\nVIC20_UNEXPANDED_GAME_OPTS ?= -DNO_EXTRA_TITLE \t\\\r\n\t-DROUND_ENEMIES \\\r\n\t-DSIMPLE_RANDOM_LEVEL \\\r\n\t-DNO_END_SCREEN \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-DLESS_TEXT -DNO_BLINKING \\\r\n\t-DNO_STATS \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DNO_DEAD_GHOSTS\r\n\r\nSTDIO_GAME_OPTS      ?= -DEVEN_LOOP_MOVE\r\n\r\nPV1000_GAME_OPTS     ?=  -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nPHC25_MONO_GAME_OPTS ?=  -DNO_BLINKING -DNO_HINTS -DLESS_TEXT -DGHOSTS_NUMBER=8 -DSIMPLE_STRATEGY -DNO_CONTROL_INSTRUCTIONS\r\n\r\nPHC25_GAME_OPTS      ?=  -DNO_BLINKING -DNO_HINTS -DLESS_TEXT -DGHOSTS_NUMBER=8 -DSIMPLE_STRATEGY -DNO_CONTROL_INSTRUCTIONS"
  },
  {
    "path": "src/games/chase/config/project_config.mk",
    "content": "\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=280\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_ATARI7800_SLOWDOWN=210\r\n_ATARI7800_NO_COLOR_SLOWDOWN=150\r\n_ATARI_LYNX_SLOWDOWN=1000\r\n_C128_8502_80COL_SLOWDOWN=90\r\n_C16_SLOWDOWN=55\r\n_C16_CONIO_SLOWDOWN=85\r\n_C64_SLOWDOWN=45\r\n_CX16_SLOWDOWN?=250\r\n_CBM610_SLOWDOWN=300\r\n_CBM510_SLOWDOWN=120\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_MEGA65_SLOWDOWN=700\r\n_NES_SLOWDOWN=280\r\n_PET_SLOWDOWN=100\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=700\r\n_VIC20_SLOWDOWN=200\r\n\r\n\r\n# Z88DK\r\n_AGON_SLOWDOWN=2500\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_BEE_SLOWDOWN=10\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CAMPUTERS_LYNX_SLOWDOWN=0\r\n_COLECO_SLOWDOWN=100\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_E200_SLOWDOWN=900\r\n_G850_SLOWDOWN=900\r\n_G815_SLOWDOWN=400\r\n_GAL_SLOWDOWN=100\r\n_GAL_GFX_SLOWDOWN=70\r\n_GB_SLOWDOWN=200\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_GL6000SL_SLOWDOWN=300\r\n_HECTORHR_SLOWDOWN=45\r\n_LASER500_SLOWDOWN=200\r\n_M100_SLOWDOWN=100\r\n_M5_SLOWDOWN=140\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_PHC25_SLOWDOWN=330\r\n_PV1000_SLOWDOWN=10\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SC3000_SLOWDOWN=200\r\n_SMC777_SLOWDOWN=150\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_TRS80_SLOWDOWN=20\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250\r\n_X07_SLOWDOWN=5\r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=10\r\n_ZX81_WRX128_SLOWDOWN=15\r\n_ZX81_8X6_WRX128_SLOWDOWN=16\r\n_ZX81_WRX64_SLOWDOWN=25\r\n_ZX81_8X6_WRX64_SLOWDOWN=30\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_COCO3_SLOWDOWN=300\r\n_DRAGON_SLOWDOWN=160\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=1\r\n_PECOM_SLOWDOWN=1\r\n_TMC600_SLOWDOWN=1\r\n_MICRO_SLOWDOWN=50\r\n_CIDELSA_SLOWDOWN=30\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=60\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=240\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n_TERMINAL_SLOWDOWN?=15\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=330\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=300"
  },
  {
    "path": "src/games/chase/definitions.h",
    "content": "#ifndef _DEFINITIONS\n#define _DEFINITIONS\n\n\t// Directions\n\t#define RIGHT 0\n\t#define DOWN 1\n\t#define LEFT 2\n\t#define UP 3\n\t\n#endif // _DEFINITIONS\n\n"
  },
  {
    "path": "src/games/chase/end_screen.h",
    "content": "#ifndef _THE_END_HEADER\n#define _THE_END_HEADER\n\n#include \"character.h\"\n\n#if defined(END_SCREEN) || defined(DANCE)\n\tvoid dance(Character *characterPtr);\n#endif\n\n#if defined(END_SCREEN)\n\tvoid gameCompleted(void);\n#endif\n\t\n#endif\n\n\n"
  },
  {
    "path": "src/games/chase/game_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#if !defined(_GAME_SETTINGS)\n#define _GAME_SETTINGS\n\n// #define DEBUG_END\n// #define DEBUG_ITEMS\n// #define DEBUG_ITEMS_IN_GAME\n\n#include \"cross_lib.h\"\n\n#include \"speed_game_settings.h\"\n\n#define INITIAL_LEVEL 1\n\n// Final level \n#define FINAL_LEVEL 20\n\n#define LIVES_NUMBER 5\n\n#define MAX_TURN_BASES_LOOP 400\n\n#if !defined(BOMBS_NUMBER)\n\t#define BOMBS_NUMBER 4\n#endif\n\n#if !defined(GHOSTS_NUMBER)\n    #if defined(_XL_TURN_BASED)\n        #if !defined(TINY_GAME)\n            #define GHOSTS_NUMBER 9\n        #else\n            #define GHOSTS_NUMBER 8\n        #endif\n    #else\t\n        #if XSize>=32 && YSize>=20\n            #define GHOSTS_NUMBER 9\n        #elif XSize>=16 && YSize>=16\n            #define GHOSTS_NUMBER 8\n        #else\n            #define GHOSTS_NUMBER 6\n        #endif\n    #endif\n#endif\n\n#if !defined(ROCKETS_NUMBER)\n    #define ROCKETS_NUMBER 4\n#endif\n\n#define GUNS_NUMBER 3\n\n#define EXTRA_LIFE_THROUGH_POINTS 2000\n\n#define HORIZONTAL_MISSILE_BONUS 50\n\n#define VERTICAL_MISSILE_BONUS 20\n\n#define SKULL_POINTS 200;\n\n// Points given by extra points bonus: \n// EXTRA_POINTS + level X EXTRA_POINTS_LEVEL_INCREASE\n#define EXTRA_POINTS 100\n#define EXTRA_POINTS_LEVEL_INCREASE 5\n\n// If a ghost bumps into a bomb\n#define GHOST_VS_BOMBS_BONUS 25\n\n// Points for shooting a ghost\n#define GHOST_VS_MISSILE 10\n\n// Extra points for the power up\n#define POWER_UP_BONUS 20\n\n// Extra points for the power up\n#define GUN_BONUS 30\n\n// Points gained at the end of each level (to be multipled by level)\n#define LEVEL_BONUS 100\n\n#if defined(WIDE)\n\t#define NON_BOSS_SKULL_HITS 4\n#else\n\t#define NON_BOSS_SKULL_HITS 3\n#endif\t\n\n#define BOSS_SKULL_HITS (NON_BOSS_SKULL_HITS + 4)\n\n\n#if defined(_XL_TURN_BASED)\n\t#define INITIAL_GHOST_SLOWDOWN 16000\n#else\n\t#define INITIAL_GHOST_SLOWDOWN 27000\n#endif\n\n\n#define FIRST_HORIZONTAL_WALLS_LEVEL 6\n\n#define FIRST_MOVING_BOMBS_LEVEL 11\n\n#if defined(WIDE)\n\t#define RELOCATE_RANGE 7\n\t#define HORIZONTAL_WALLS_INITIAL_LENGTH 4\n\t#define HORIZONTAL_WALLS_INCREASE_LOOP 200\n#else\n\t#define RELOCATE_RANGE 5\n\t#define HORIZONTAL_WALLS_INITIAL_LENGTH 2\n\t#define HORIZONTAL_WALLS_INCREASE_LOOP 300\n#endif\n\n#define FIRST_ROCKETS_LEVEL 7 // 8 because of check on levels after missile level\n\n// Maximum number of ghost that co-exist with rockets (in non-boss levels)\n#define MAX_GHOST_COUNT_FOR_ROCKETS 4\n\n#if defined(WIDE)\n\t#define HORIZONTAL_MISSILE_OFFSET 3\n#else\n\t#define HORIZONTAL_MISSILE_OFFSET 2\n#endif\n\n// -----------------------------------------------------------------------------------\n#if GHOSTS_NUMBER>=8\n\t#define SKULL_TRIGGER 4\n#else\n\t#define SKULL_TRIGGER 3\n#endif \n\n#if !defined(TURN_BASED_EFFECT_SCALE)\n    #define TURN_BASED_EFFECT_SCALE 5\n#endif\n\n#if !defined(TURN_BASED_WAIT_SCALE)\n    #define TURN_BASED_WAIT_SCALE 4\n#endif \n#define ACTION_EFFECT_SCALE 1\n#define ACTION_WAIT_SCALE 1\n\n#if defined(_XL_TURN_BASED)\n\t#define EFFECT_SCALE TURN_BASED_EFFECT_SCALE\n\t#define WAIT_SCALE TURN_BASED_WAIT_SCALE\n#else\n\t#define EFFECT_SCALE ACTION_EFFECT_SCALE\n\t#define WAIT_SCALE ACTION_WAIT_SCALE\n#endif\n\t\n#define POWER_UP_COOL_DOWN (150/WAIT_SCALE)\n\n#define POWER_UP2_COOL_DOWN (400/WAIT_SCALE)\n\n#define FREEZE_COOL_DOWN (700/WAIT_SCALE)\n\n#define GUN_COOL_DOWN (200/WAIT_SCALE)\t\n\n#define SUPER_COOL_DOWN (150/WAIT_SCALE)\n\n#define CONFUSE_COOL_DOWN (250/WAIT_SCALE)\n#define SECOND_CONFUSE_COOL_DOWN 20000\n\n#define ZOMBIE_COOL_DOWN (600/WAIT_SCALE)\n#define SECOND_ZOMBIE_COOL_DOWN 20000\n\n#define CHASE_COOL_DOWN (400/WAIT_SCALE)\n\n#define EXTRA_POINTS_COOL_DOWN (2000/WAIT_SCALE)\n#define SECOND_EXTRA_POINTS_COOL_DOWN 20000\n\n#define INVINCIBILITY_COOL_DOWN (3300/WAIT_SCALE)\n\n#define EXTRA_LIFE_COOL_DOWN (1300/WAIT_SCALE)\n\n#define FROZEN_COUNT_DOWN (22/EFFECT_SCALE)\n\n#define INITIAL_FROZEN_COUNT_DOWN FROZEN_COUNT_DOWN\n\n#define CONFUSE_COUNT_DOWN (240/EFFECT_SCALE)\n\n#define INVINCIBILITY_COUNT_DOWN (120/EFFECT_SCALE)\n\n#define INITIAL_INVINCIBILITY_COUNT_DOWN (INVINCIBILITY_COUNT_DOWN/2)\n\n#define ZOMBIE_COUNT_DOWN (255/EFFECT_SCALE)\n\n#define ZOMBIE_BONUS 5\n\n#define TURN_BASED_SKULL_LOOP_TRIGGER_SCALE 4\n#define ACTION_SKULL_LOOP_TRIGGER_SCALE 1\n\n#if defined(_XL_TURN_BASED)\n\t#define SKULL_LOOP_TRIGGER_SCALE TURN_BASED_SKULL_LOOP_TRIGGER_SCALE\n#else\n\t#define SKULL_LOOP_TRIGGER_SCALE ACTION_SKULL_LOOP_TRIGGER_SCALE\n#endif\n\n#define SKULL_LOOP_TRIGGER ((280-(level<<2))/SKULL_LOOP_TRIGGER_SCALE)\n\n#define SKULL_COUNT_DOWN 50\n\n#if !defined(TURN_BASED_SKULL_MIN_SLOWDOWN_SCALE)\n    #define TURN_BASED_SKULL_MIN_SLOWDOWN_SCALE 4\n#endif\n\n#if !defined(TURN_BASED_GHOST_MIN_SLOWDOWN_SCALE)\n    #define TURN_BASED_GHOST_MIN_SLOWDOWN_SCALE 3\n#endif\n\n#define ACTION_SKULL_MIN_SLOWDOWN_SCALE 1\n#define ACTION_GHOST_MIN_SLOWDOWN_SCALE 1\n\n#if defined(_XL_TURN_BASED)\n\t#define SKULL_MIN_SLOWDOWN_SCALE TURN_BASED_SKULL_MIN_SLOWDOWN_SCALE\n\t#define GHOST_MIN_SLOWDOWN_SCALE TURN_BASED_GHOST_MIN_SLOWDOWN_SCALE\n#else\n\t#define SKULL_MIN_SLOWDOWN_SCALE ACTION_SKULL_MIN_SLOWDOWN_SCALE\n\t#define GHOST_MIN_SLOWDOWN_SCALE ACTION_GHOST_MIN_SLOWDOWN_SCALE\t\n#endif\n\n#if !defined(SKULL_MIN_SLOWDOWN)\n    #define SKULL_MIN_SLOWDOWN (3200/SKULL_MIN_SLOWDOWN_SCALE)\n#endif\n\n#if !defined(GHOST_MIN_SLOWDOWN)\n    #define GHOST_MIN_SLOWDOWN (1600/GHOST_MIN_SLOWDOWN_SCALE)\t\n#endif\n\n#if defined(_XL_TURN_BASED)\n\t#define MAX_GHOST_LEVEL_SCALE 3\n\t#define MAX_SKULL_LOOP_SCALE 3\n\t#define MAX_GHOST_LOOP_SCALE 3\n#else\n\t#define MAX_GHOST_LEVEL_SCALE 1\n\t#define MAX_SKULL_LOOP_SCALE 1\n\t#define MAX_GHOST_LOOP_SCALE 1\n#endif\n\n#define MAX_GHOST_LEVEL (600/MAX_GHOST_LEVEL_SCALE)\n\n#define MAX_SKULL_LOOP (1600/MAX_SKULL_LOOP_SCALE)\n\n#define MAX_GHOST_LOOP (1800/MAX_GHOST_LOOP_SCALE)\n\n#define TURN_BASED_MAX_LOOP MAX_SKULL_LOOP\n\n#define GHOST_LEVEL_DECREASE (MAX_GHOST_LEVEL/20)\n\n#define MISSILES_FOR_ZOMBIE 5\n\n#define SKULLS_FOR_SUPER 2\n\n#endif // _GAME_SETTINGS\n"
  },
  {
    "path": "src/games/chase/game_text.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#ifndef _GAME_TEXT\n#define _GAME_TEXT\n\n#include \"settings.h\"\n#include \"cross_lib.h\"\n\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, const char *Text);\n\n\n#define PRINT_CENTERED(Text) \\\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\n\n\n\n// game_stat\nvoid displayScore(void);\n\n#if !defined(TINY_GAME)\n\tvoid displayStatsTitles(void);\n\n\tvoid printGunsStats(void);\n#endif\n\n\n#if !defined(NO_STATS)\n\tvoid printLevelStats(void);\n\tvoid printGhostCountStats(void);\n\tvoid printLivesStats(void);\t\t\n#else\n\t#define printLevelStats()\n\t#define printGhostCountStats()\n\t#define printLivesStats()\n#endif\n\n\n// game_text\n#if !defined(LESS_TEXT)\n\tvoid printLevel(void);\n\n\tvoid printVictoryMessage(void);\n\n#endif\n\n#if !defined(NO_PRINT)\n\tvoid printGameOver(void);\n#else\n\t#define printGameOver()\n#endif\n\nvoid printDefeatMessage(void);\n\nvoid printStartMessage(void);\n\n#if !defined(NO_PRINT)\n\tvoid gameCompleted(void);\n#else\n\t#define gameCompleted()\n#endif\n\n#if !defined(NO_PRINT) && !defined(TINY_GAME)\n\tvoid printPressKeyToStart(void);\n#else\n\t#define printPressKeyToStart()\n#endif\n\n#if !defined(TINY_GAME)\n\tvoid _printScoreOnRow(uint8_t row, uint16_t score);\n\tvoid _printScore(uint16_t score);\n\tvoid printKillTheSkull(void);\n#else\n\t#define _printScoreOnRow(row, score)\n\t#define _printScore(s)\n\t#define printKillTheSkull()\n#endif\n\n#if !defined(TINY_GAME)\n\t#define _printTopScore() _printScoreOnRow(0,highScore)\n#endif\n\n#if defined(TINY_GAME)\n\t#if !defined(NO_PRINT)\n\t\t#define highScoreScreen() _XL_PRINTD((XSize-6)/2, 0, 5, highScore)\n\t#else\n\t\t#define highScoreScreen()\n\t#endif\n#elif defined(LESS_TEXT) \n\t\t#define highScoreScreen() \n\t\t\n#else\n    #define highScoreScreen() _printScore(highScore);\n#endif\n\n#if defined(FULL_GAME) && XSize>=14\n\tvoid printHints(void);\n#endif\n\n\t\n#endif // _GAME_TEXT\n\n\n"
  },
  {
    "path": "src/games/chase/ghost.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#ifndef _GHOST_H\n#define _GHOST_H\n\n#include \"character.h\"\n\nuint16_t computeGhostSlowDown(void);\n\n#if !defined(TINY_GAME)\n\tvoid decreaseGhostLevel(void);\n#endif\n\n#if !defined(TINY_GAME)\nvoid displayBombs(void);\n#else\n    #define displayBombs() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        \\\n        for(i=0;i<BOMBS_NUMBER;++i) \\\n        { \\\n            displayBomb(&bombs[i]); \\\n        } \\\n    } while(0)\n#endif\n\n#if defined(FULL_GAME)\n\tuint8_t firstAlive(void);\n#endif\n\n#endif // _GHOST_H\n\n"
  },
  {
    "path": "src/games/chase/horizontal_missile.h",
    "content": "\n#ifndef _HORIZONTAL_MISSILE_H\n#define _HORIZONTAL_MISSILE_H\n\n\t#define computeArrowRange() ((level)>>3)\n\t\n\tvoid _handle_from_the_left(void);\n\t\n\tvoid _handle_from_the_right(void);\n\t\n\tvoid handle_missiles(void);\n\t\n#endif // _HORIZONTAL_MISSILE_H\n"
  },
  {
    "path": "src/games/chase/images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#include \"cross_lib.h\"\n\n#include \"settings.h\"\n\n#if !defined(ANIMATE_PLAYER)\n\tImage PLAYER_IMAGE;\n#else\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_TINY_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\t\textern Image PLAYER_DOWN_IMAGE;\n\t\textern Image PLAYER_UP_IMAGE;\n\t\textern Image PLAYER_RIGHT_IMAGE;\n\t\textern Image PLAYER_LEFT_IMAGE;\t\n\t#else\n        Image PLAYER_DOWN_IMAGE;\n        Image PLAYER_UP_IMAGE;\n        Image PLAYER_RIGHT_IMAGE;\n        Image PLAYER_LEFT_IMAGE;\n\t#endif\n#endif\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_TINY_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\textern Image GHOST_IMAGE;\n\textern Image BOMB_IMAGE;\n#else\n\tImage GHOST_IMAGE;\n\tImage BOMB_IMAGE;\t\n#endif\n\n#if !defined(NO_DEAD_GHOSTS)\n\tImage DEAD_GHOST_IMAGE;\n#endif\n\n#if !defined(TINY_GAME)\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\t\textern Image POWERUP_IMAGE;\n\t\textern Image BULLET_IMAGE;\n\t\textern Image GUN_IMAGE;\t\n\t\textern Image SKULL_IMAGE;\t\t\n\t\textern Image EXTRA_POINTS_IMAGE;\t\n\t\t\n\t\textern Image HORIZONTAL_BRICK_IMAGE;\n\t\textern Image VERTICAL_BRICK_IMAGE;\t\n\t#else\n\t\tImage POWERUP_IMAGE;\n\t\tImage BULLET_IMAGE;\n\t\tImage GUN_IMAGE;\t\n\t\tImage SKULL_IMAGE;\t\t\n\t\tImage EXTRA_POINTS_IMAGE;\t\n\t\t\n\t\tImage HORIZONTAL_BRICK_IMAGE;\n\t\tImage VERTICAL_BRICK_IMAGE;\t\n\t#endif\n#endif\n\n#if defined(FULL_GAME)\n\t#if defined(USE_MEMORY_BUFFERS)\n\t\n\t\textern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\n\t\textern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\n\t\textern Image ROCKET_IMAGE;\n\n\t\textern Image FREEZE_IMAGE;\t\n\t\t\n\t\textern Image EXTRA_LIFE_IMAGE;\n\t\textern Image INVINCIBILITY_IMAGE;\t\n\t\t\n\t\textern Image CHASE_IMAGE;\n\t\t\n\t\textern Image SUPER_IMAGE;\n\t\textern Image CONFUSE_IMAGE;\n\t\textern Image ZOMBIE_IMAGE;\n\t\t\n\t\textern Image BROKEN_BRICK_IMAGE;\n\n\t#else\t\n\t\t\n\t\tImage LEFT_HORIZONTAL_MISSILE_IMAGE;\n\t\tImage RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\n\t\tImage ROCKET_IMAGE;\n\n\t\tImage FREEZE_IMAGE;\t\n\t\t\n\t\tImage EXTRA_LIFE_IMAGE;\n\t\tImage INVINCIBILITY_IMAGE;\t\n\t\t\n\t\tImage CHASE_IMAGE;\n\t\t\n\t\tImage SUPER_IMAGE;\n\t\tImage CONFUSE_IMAGE;\n\t\tImage ZOMBIE_IMAGE;\n\t\t\n\t\tImage BROKEN_BRICK_IMAGE;\n\t#endif\n#endif\n\n\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/games/chase/init_images.h",
    "content": "#ifndef _INIT_IMAGES_H\r\n#define _INIT_IMAGES_H\r\n\r\n#define _PLAYER_DOWN_TILE      _TILE_0\r\n#define _PLAYER_UP_TILE        _TILE_1\r\n#define _PLAYER_RIGHT_TILE     _TILE_2\r\n#define _PLAYER_LEFT_TILE      _TILE_3\r\n\r\n#define _GHOST_TILE            _TILE_4\r\n#define _BOMB_TILE             _TILE_5\r\n#define _DEAD_GHOST_TILE       _TILE_6\r\n#define _SKULL_TILE            _TILE_7\r\n#define _POWERUP_TILE          _TILE_8\r\n#define _GUN_TILE              _TILE_9\r\n#define _INVINCIBILITY_TILE    _TILE_10\r\n#define _BULLET_TILE           _TILE_11\r\n\r\n#if _XL_NUMBER_OF_TILES<=6\r\n    #define _VERTICAL_BRICK_TILE   _BOMB_TILE\r\n    #define _HORIZONTAL_BRICK_TILE _BOMB_TILE\r\n#else\r\n    #define _VERTICAL_BRICK_TILE   _TILE_12\r\n    #define _HORIZONTAL_BRICK_TILE _TILE_13\r\n#endif\r\n#define _LEFT_MISSILE_TILE     _TILE_14\r\n#define _RIGHT_MISSILE_TILE    _TILE_15\r\n#define _ROCKET_TILE           _TILE_16\r\n#define _FREEZE_TILE           _TILE_17\r\n#define _SUPER_TILE            _TILE_18\r\n\r\n#define _EXTRA_POINTS_TILE     _TILE_25\r\n\r\n#define _PLAYER_COLOR _XL_CYAN\r\n#define _GHOST_COLOR _XL_WHITE\r\n#define _DEAD_GHOST_COLOR _XL_RED\r\n#define _SKULL_COLOR _XL_YELLOW\r\n#define _BOMB_COLOR _XL_RED\r\n#define _MISSILE_COLOR _XL_WHITE\r\n#define _ROCKET_COLOR _XL_WHITE\r\n#define _POWERUP_COLOR _XL_GREEN\r\n#define _FREEZE_COLOR _XL_CYAN\r\n#define _SUPER_COLOR _XL_RED\r\n#define _GUN_COLOR _XL_CYAN\r\n#define _BULLET_COLOR _XL_WHITE\r\n#define _BRICK_COLOR _XL_YELLOW\r\n#define _EXTRA_POINTS_COLOR _XL_YELLOW\r\n#define _EXTRA_LIFE_COLOR _XL_WHITE\r\n#define _INVINCIBILITY_COLOR _XL_YELLOW\r\n#define _CONFUSE_COLOR _XL_RED\r\n#define _ZOMBIE_COLOR _XL_YELLOW\r\n\r\n\r\nvoid INIT_IMAGES(void);\r\n\r\n\r\n\r\n\r\n#endif // _INIT_IMAGES_H\r\n\r\n"
  },
  {
    "path": "src/games/chase/item.h",
    "content": "\n#if !defined(_ITEM_HEADER)\n#define _ITEM_HEADER\n\n#include \"character.h\"\n\n#if !defined(TINY_GAME)\n\n\tstruct ItemStruct\n\t{\n\t\tCharacter _character;\n\t\tvoid (*_effect)(void);\n\t\tuint16_t _coolDown;\n\t\t#if !defined(NO_BLINKING)\n\t\tuint8_t _blink;\n\t\t#endif\n\t};\n\n\ttypedef struct ItemStruct Item;\n\n\tvoid handle_count_down(uint8_t * activeItemFlagPtr, uint8_t * countDownPtr);\t\n\n\tvoid reducePowerUpsCoolDowns(void);\n\t\n\tvoid itemReached(Character * itemPtr);\n\t\n\tvoid relocateItem(Character * itemPtr);\n\t\n\tvoid _commonPowerUpEffect(void);\n\n\tvoid powerUpEffect(void);\n\n\tvoid powerUp2Effect(void);\n\n\t#define handle_freeze_count_down() handle_count_down(&freezeActive,&freeze_count_down)\n\n\tvoid _gunEffect(void);\n\n\tvoid gunEffect(void);\n\n\tvoid extraPointsEffect(void);\n\n\tvoid handle_item(register Item *itemPtr);\n\n\n#endif // !defined(TINY_GAME)\n\t\n#if defined(FULL_GAME)\n\n\tvoid _freezeEffect(void);\n\n\tvoid freezeEffect(void);\n\t\n\tvoid extraLifeEffect(void);\n\n\tvoid _invincibilityEffect(void);\n\t\n\tvoid invincibilityEffect(void);\n\t\n\tvoid superEffect(void);\n\n\tvoid confuseEffect(void);\n\t\n\tvoid zombieEffect(void);\n\t\n\tvoid chaseEffect(void);\n#endif // defined(FULL_GAME)\n\t\n\t#if defined(FULL_GAME)\n\t\t#define handle_invincibility_count_down() handle_count_down(&invincibilityActive, &invincibility_count_down)\t\n\t\t#define handle_confuse_count_down() handle_count_down(&confuseActive, &confuse_count_down)\n\t\t#define handle_zombie_count_down() handle_count_down(&zombieActive,&zombie_count_down)\n\t#endif\t\n\t\n\t#define handle_gun_item() handle_item(&gun);\n\t#define handle_powerup_item() handle_item(&powerUp);\n\t#define handle_powerup2_item() handle_item(&powerUp2);\n\t#define handle_extraPoints_item() handle_item(&extraPoints);\n\t\n\t#define handle_freeze_count_down() handle_count_down(&freezeActive,&freeze_count_down)\n\n\t#if defined(FULL_GAME)\n\t\t#define handle_invincibility_count_down() handle_count_down(&invincibilityActive, &invincibility_count_down)\t\n\t\t#define handle_confuse_count_down() handle_count_down(&confuseActive, &confuse_count_down)\n\t\t#define handle_zombie_count_down() handle_count_down(&zombieActive,&zombie_count_down)\n\n\t\t#define handle_freeze_item() handle_item(&freeze);\t\n\t\t#define handle_invincibility_item() handle_item(&invincibility)\n\t\t\n\t\t#define handle_chase_item() handle_item(&chase);\n\t\t\n\t\t#define handle_super_item() handle_item(&super)\n\t\t#define handle_extraLife_item() handle_item(&extraLife)\n\t\t\n\t\t#define handle_confuse_item() handle_item(&confuse);\n\t\t#define handle_zombie_item() handle_item(&zombie);\n\t\t\n\t#endif\n\n\t\n\t#define handle_gun_item() handle_item(&gun);\n\t#define handle_powerup_item() handle_item(&powerUp);\n\t#define handle_powerup2_item() handle_item(&powerUp2);\n\t#define handle_extraPoints_item() handle_item(&extraPoints);\n\n#endif // _item.h\n\n"
  },
  {
    "path": "src/games/chase/level.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#ifndef _LEVEL\n#define _LEVEL\n\n#include \"character.h\"\n#include \"cross_lib.h\"\n#include \"init_images.h\"\n\n\n// DRAW HORIZONTAL AND VERTICAL LINES\n#if !defined(NO_WALL) && !defined(TINY_GAME)\n    void DRAW_HORIZONTAL_LINE(uint8_t x, uint8_t y, uint8_t length);\n    void DRAW_VERTICAL_LINE(uint8_t x, uint8_t y, uint8_t length);    \n#else\n    #define DRAW_HORIZONTAL_LINE(x,y,length)\n    #define DRAW_VERTICAL_LINE(x,y,length)\n#endif\n\n\n// VERTICAL AND HORIZONTAL BORDER\n#if !defined(TINY_GAME)\n    #define DRAW_VERTICAL_BORDER(x) DRAW_VERTICAL_LINE(x,0,YSize-1)\n    \n    #if !defined(FULL_LOWER_BORDER)\n        #define DRAW_HORIZONTAL_BORDER(y) DRAW_HORIZONTAL_LINE(0,y,XSize-1)\n    #else\n        #define DRAW_HORIZONTAL_BORDER(y) DRAW_HORIZONTAL_LINE(0,y,XSize)\n    #endif\n#else    \n    #define DRAW_VERTICAL_BORDER(x)    \n    #define DRAW_HORIZONTAL_BORDER(y)\n#endif\n\n\n#define WALL_COLOR _XL_YELLOW\n\n\n#define DRAW_HORIZONTAL_WALLS(length) \\\n    _XL_SET_TEXT_COLOR(WALL_COLOR); \\\n    DRAW_HORIZONTAL_LINE(1,YSize/2,length); \\\n    DRAW_HORIZONTAL_LINE(XSize-1-length,YSize/2,length);\n\n#if defined(NO_DEAD_GHOSTS)\n\t#define PLACE_DEAD_GHOST() \\\n\t\tinitializeCharacter(&ghosts[count],(uint8_t) (count),(uint8_t) 1,0,&GHOST_IMAGE);\t\n#else\n\t#define PLACE_DEAD_GHOST() \\\n\t\tinitializeCharacter(&ghosts[count],(uint8_t) (GHOSTS_NUMBER-count),(uint8_t) 1,0,&DEAD_GHOST_IMAGE);\n#endif\n\n\n// Check XSize to avoid overflow\n#if XSize>48\n\t#define ROUND_X_POS (uint8_t) ((2*j+1)*(uint8_t)(XSize/6))\n#else\n\t#if defined(OPTIMIZE_ROUND_ENEMIES)\n\t\t#define ROUND_X_POS (uint8_t) (6*j)\t\t\n\t#else\n\t\t#define ROUND_X_POS (uint8_t) ((2*j+1)*XSize/6)\n\t#endif\n#endif\n\n// Check YSize to avoid overflow\n#if YSize>48\n\t#define ROUND_Y_POS (uint8_t) ((2*i+1)*(uint8_t)(YSize/6))\n#else\n\t#if defined(OPTIMIZE_ROUND_ENEMIES)\n\t\t#define ROUND_Y_POS (uint8_t) (6*i)\n\t#else\n\t\t#define ROUND_Y_POS (uint8_t) ((2*i+1)*YSize/6)\n\t#endif\n#endif\n\n\n#define PLACE_ROUND_GHOST() \\\n\tinitializeCharacter(&ghosts[count], \\\n\t\tROUND_X_POS, \\\n\t\tROUND_Y_POS, \\\n\t\t1 ,&GHOST_IMAGE);\n\n#define PLACE_FLAT_GHOST() \\\n\tinitializeCharacter(&ghosts[count],(uint8_t) (j*(XSize/5)),(i*(YSize/5)),1,&GHOST_IMAGE);\n\n#define PLACE_FLAT_GHOST_6() \\\n\tinitializeCharacter(&ghosts[count],(uint8_t) (j*(XSize>>2)),(i*(YSize/5)),1,&GHOST_IMAGE);\t\n\t\n#define PLACE_NINTH_GHOST() \\\n\tinitializeCharacter(&ghosts[4],(uint8_t) (XSize-4),(uint8_t) (YSize-4),1,&GHOST_IMAGE);\n\n\t\n#define ROUND_NINE_GHOSTS() \\\n\tfor(i=0;i<=2;++i) \\\n\t{ \\\n\t\tfor(j=0;j<=2;++j) \\\n\t\t{ \\\n\t\t\tif(ghostCount>count) \\\n\t\t\t{ \\\n\t\t\t\tif(count!=4) \\\n\t\t\t\t{ \\\n\t\t\t\t\tPLACE_ROUND_GHOST(); \\\n\t\t\t\t} \\\n\t\t\t\telse \\\n\t\t\t\t{ \\\n\t\t\t\t\tPLACE_NINTH_GHOST(); \\\n\t\t\t\t} \\\n\t\t\t} \\\n\t\t\telse \\\n\t\t\t{ \\\n\t\t\t\tPLACE_DEAD_GHOST(); \\\n\t\t\t} \\\n\t\t\t++count; \\\n\t\t} \\\n\t}\n\n\t\n#if defined(OPTIMIZE_ROUND_ENEMIES)\n\t#define OPT_OFFSET 1\n#else\n\t#define OPT_OFFSET 0\n#endif\n\n#define ROUND_EIGHT_GHOSTS() \\\n\tfor(i=0+OPT_OFFSET;i<=2+OPT_OFFSET;++i) \\\n\t{ \\\n\t\tfor(j=0+OPT_OFFSET;j<=2+OPT_OFFSET;++j) \\\n\t\t{ \\\n\t\t\tif(i!=1+OPT_OFFSET || j !=1+OPT_OFFSET) \\\n\t\t\t{ \\\n\t\t\t\tif(ghostCount>count) \\\n\t\t\t\t{ \\\n\t\t\t\t\tPLACE_ROUND_GHOST(); \\\n\t\t\t\t} \\\n\t\t\t\telse \\\n\t\t\t\t{ \\\n\t\t\t\t\tPLACE_DEAD_GHOST(); \\\n\t\t\t\t} \\\n\t\t\t\t++count; \\\n\t\t\t} \\\n\t\t} \\\n\t}\n\n\n#define ROUND_SEVEN_GHOSTS() \\\n\tfor(i=0+OPT_OFFSET;i<=2+OPT_OFFSET;++i) \\\n\t{ \\\n\t\tfor(j=0+OPT_OFFSET;j<=2+OPT_OFFSET;++j) \\\n\t\t{ \\\n\t\t\tif(i!=1+OPT_OFFSET || j !=1+OPT_OFFSET) \\\n\t\t\t{ \\\n\t\t\t\tif(count<7) \\\n                { \\\n                    if(ghostCount>count) \\\n                    { \\\n                        PLACE_ROUND_GHOST(); \\\n                    } \\\n                    else \\\n                    { \\\n                        PLACE_DEAD_GHOST(); \\\n                    } \\\n                    ++count; \\\n                } \\\n\t\t\t} \\\n\t\t} \\\n\t}\n\n\n#define FLAT_EIGHT_GHOSTS() \\\n\tfor(j=1;j<=4;++j) \\\n\t{ \\\n\t\tfor(i=1;i<=4;i+=3) \\\n\t\t{ \\\n\t\t\tif(ghostCount>count) \\\n\t\t\t{ \\\n\t\t\t\tPLACE_FLAT_GHOST(); \\\n\t\t\t} \\\n\t\t\telse \\\n\t\t\t{ \\\n\t\t\t\tPLACE_DEAD_GHOST(); \\\n\t\t\t} \\\n\t\t\t++count; \\\n\t\t} \\\n\t}\n\n\t\n#define FLAT_SIX_GHOSTS() \\\n\tfor(j=1;j<=3;++j) \\\n\t{ \\\n\t\tfor(i=1;i<=4;i+=3) \\\n\t\t{ \\\n\t\t\tif(ghostCount>count) \\\n\t\t\t{ \\\n\t\t\t\tPLACE_FLAT_GHOST_6(); \\\n\t\t\t} \\\n\t\t\telse \\\n\t\t\t{ \\\n\t\t\t\tPLACE_DEAD_GHOST(); \\\n\t\t\t} \\\n\t\t\t++count; \\\n\t\t} \\\n\t}\n\n#if defined(NO_RANDOM_LEVEL)\n\t#define PLACE_BOMB_4() \\\n\t\tinitializeCharacter(&bombs[count],(uint8_t) ((XSize/3)*i), (uint8_t) ((YSize/3)*j),0,&BOMB_IMAGE)\n#elif defined(TINY_GAME) || defined(SIMPLE_RANDOM_LEVEL)\n\t#define PLACE_BOMB_4() \\\n\t\tinitializeCharacter(&bombs[count],(uint8_t) (((XSize/3)*i)+(uint8_t)(_XL_RAND()&1)), \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t  (uint8_t) ((YSize/3)*j),0,&BOMB_IMAGE);\n#else\n\t#define PLACE_BOMB_4() \\\n\t\tinitializeCharacter(&bombs[count],(uint8_t) (((XSize/3)*i)-(uint8_t)(_XL_RAND()&1)), \\\n\t\t\t\t\t\t\t\t\t  (uint8_t) (((YSize/3)*j)+(uint8_t)(_XL_RAND()&1)),0,&BOMB_IMAGE);\t\t\n#endif\n\n\t\n#define FOUR_BOMBS() \\\n\tdo \\\n\t{ \\\n\t\tcount = 0; \\\n\t\tfor(i=1;i<=2;++i) \\\n\t\t{ \\\n\t\t\tfor(j=1;j<=2;++j) \\\n\t\t\t{ \\\n\t\t\t\tPLACE_BOMB_4(); \\\n\t\t\t\t++count; \\\n\t\t\t} \\\n\t\t} \\\n\t} \\\n\twhile(0)\n\n\t\n#if defined(NO_RANDOM_LEVEL)\n\t#define THREE_BOMBS() \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tinitializeCharacter(&bombs[0],(XSize>>1), ((YSize/3)<<1),0,&BOMB_IMAGE); \\\n\t\t\tinitializeCharacter(&bombs[1],XSize/3, (YSize/3),0,&BOMB_IMAGE); \\\n\t\t\tinitializeCharacter(&bombs[2],((XSize/3)<<1), (YSize/3),0,&BOMB_IMAGE);\t\\\n\t\t} \\\n\t\twhile(0)\n#else\n\t#define THREE_BOMBS() \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tuint8_t rnd = _XL_RAND()&1; \\\n\t\t\tinitializeCharacter(&bombs[0],XSize/3+rnd, (YSize/3)+rnd,0,&BOMB_IMAGE); \\\n\t\t\tinitializeCharacter(&bombs[1],(XSize>>1)+rnd, ((YSize/3)*2)+rnd,0,&BOMB_IMAGE); \\\n\t\t\tinitializeCharacter(&bombs[2],2*(XSize/3)+rnd, (YSize/3)-rnd,0,&BOMB_IMAGE); \\\n\t\t} \\\n\t\twhile(0)\n#endif\t\n\n\n#if defined(NO_RANDOM_LEVEL)\n\t#define TWO_BOMBS() \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tinitializeCharacter(&bombs[0],(XSize>>1), ((YSize/3)),0,&BOMB_IMAGE); \\\n\t\t\tinitializeCharacter(&bombs[1],(XSize>>1), ((YSize/3)<<1),0,&BOMB_IMAGE); \\\n\t\t} \\\n\t\twhile(0)\n#else\n\t#define TWO_BOMBS() \\\n\t\tdo \\\n\t\t{ \\\n\t\t\tinitializeCharacter(&bombs[0],(XSize>>1), ((YSize/3))+_XL_RAND()%3,0,&BOMB_IMAGE); \\\n\t\t\tinitializeCharacter(&bombs[1],(XSize>>1)-1+_XL_RAND()%3, ((YSize/3)*2)-1+_XL_RAND()%3,0,&BOMB_IMAGE); \\\n\t\t} \\\n\t\twhile(0)\n#endif\t\n\n\n#if defined(NO_RANDOM_LEVEL)\n\t#define ONE_BOMB() \\\n\t\tinitializeCharacter(&bombs[0],(XSize>>1), (YSize>>1),0,&BOMB_IMAGE);\t\t\t\n#else\n\t#define ONE_BOMB() \\\n\t\tinitializeCharacter(&bombs[0],(XSize>>1)+_XL_RAND()&1, (YSize>>1)+_XL_RAND()&1,0,&BOMB_IMAGE);\n#endif\n\n#if defined(BETWEEN_LEVEL)\n\tvoid spiral(register Character *characterPtr);\n#endif\n\nvoid fillLevelWithCharacters(void);\n\n#if defined(FULL_GAME)\n\tvoid updateInnerWallVerticalData(void);\n\t\n\tuint8_t oneMissileLevel(void);\n\t\n\tuint8_t rocketLevel(void);\n\n\tuint8_t missileLevel(void);\t\n\n\tuint8_t bossLevel(void);\n\t\n\tuint8_t horizWallsLevel(void);\n\t\n\tvoid initializeAwayFromWall(Character * characterPtr, uint8_t x, uint8_t y, uint8_t status, Image *imagePtr);\n\n#endif \n\n\n\n#endif // _LEVEL\n"
  },
  {
    "path": "src/games/chase/makefiles/Makefile.override",
    "content": "\r\ncreativision: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D__NO_COLOR_INIT -D__CREATIVISION__  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__VDP_MODE1_GRAPHICS -DGHOSTS_NUMBER=8 -DLESS_TEXT   \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=2000  -DUSE_TINY_MEMORY_BUFFERS \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k.cfg \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(SOURCE_PATH)/memory/creativision_memory.s \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\n\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=6000   \\\r\n\t-D_XL_NO_SLEEP -D__NO_WAIT    \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(GAMATE_GAME_OPTS) -D__NO_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\n\r\n\r\nvic20_exp_3k: $(ASSETS_PATH)/cc65_udc_vic20_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t--config $(CFG_PATH)/cc65/vic20-3k_GFX.cfg \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DNO_END_SCREEN \\\r\n\t-DLIGHT_GAME \\\r\n\t-D__VIC20_EXP_3K \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-DUSE_LIGHT_MEMORY_BUFFERS \\\r\n\t-DNO_HINTS \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_TEXT_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t-D__NO_SLEEP_SEC -DNO_STATS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__ALT_HIGHSCORE \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_vic20_64_chars.s \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_$@.prg\r\n\r\n\r\nvic20_exp_8k: $(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t--config $(CFG_PATH)/cc65/vic20-8k_memory_mapped_GFX.cfg  -DEXTRA_TITLE \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=2800 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__VIC20__ -D__VIC20_EXP_8K \\\r\n\t \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t-DNO_HINTS \\\r\n\t-DLESS_TEXT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\r\n\t$(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(SOURCE_PATH)/split_files/level.c $(SOURCE_PATH)/split_files/character.c \\\r\n\t$(SOURCE_PATH)/split_files/game_text.c \\\r\n\t$(SOURCE_PATH)/split_files/ghost.c $(CROSS_LIB_PATH)/input/input_macros.c  \\\r\n\t$(SOURCE_PATH)/split_files/strategy.c $(SOURCE_PATH)/split_files/bullet.c \\\r\n\t$(SOURCE_PATH)/split_files/move_player.c \\\r\n\t$(SOURCE_PATH)/split_files/item.c \\\r\n\t$(SOURCE_PATH)/split_files/skull.c \\\r\n\t$(SOURCE_PATH)/split_files/rocket.c \\\r\n\t$(CROSS_LIB_PATH)/display/display_macros.c  \\\r\n\t$(SOURCE_PATH)/split_files/horizontal_missile.c \\\r\n\t--code-name CODE2 \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/split_files/init_images.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(SOURCE_PATH)/split_files/main.c \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t$(SOURCE_PATH)/split_files/end_screen.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n# vic20_unexpanded: $(ASSETS_PATH)/cc65_udc_6chars.s\r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t# -D_XL_NO_TEXT_COLOR \\\r\n\t# -D__VIC20_UNEXPANDED \\\r\n\t# -D_XL_NO_SLEEP \\\r\n\t# -D__NO_COLOR_INIT \\\r\n\t# -DTINY_GAME  -DNO_WALL \\\r\n\t# -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t# -D__ALT_HIGHSCORE \\\r\n\t# -D__ALT_DISPLAY_STATS \\\r\n\t# -D__DEFAULT_CLEAR_SCREEN \\\r\n\t# -DUSE_TINY_MEMORY_BUFFERS \\\r\n    # $(VIC20_UNEXPANDED_GAME_OPTS) \\\r\n\t# --config $(CFG_PATH)/cc65/vic20_unexpanded_gfx.cfg  \\\r\n\t# $(TINY_FILES) \\\r\n\t# $(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_explosion_sound.c \\\r\n\t# $(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t# $(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t# $(ASSETS_PATH)/cc65_udc_6chars.s \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.prg\r\n\r\n# $(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_explosion_sound.c\r\nvic20_unexpanded: $(ASSETS_PATH)/cc65_udc_6chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 -m mapfile.txt \\\r\n\t-D_XL_NO_TEXT_COLOR -D_XL_NUMBER_OF_TILES=6 \\\r\n\t-D__VIC20_UNEXPANDED \\\r\n\t-D_ALT_SLEEP -D__NO_SLEEP_SEC \\\r\n\t-D__NO_COLOR_INIT -DNO_RANDOM_LEVEL \\\r\n\t-DTINY_GAME  -DNO_WALL \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ALT_DISPLAY_STATS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t$(VIC20_UNEXPANDED_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\r\n\t--config $(CFG_PATH)/cc65/vic20_unexpanded_gfx_low_stack.cfg  \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_explosion_sound.c \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t$(ASSETS_PATH)/cc65_udc_6chars.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.prg\r\n\r\n# vic20_test: $(ASSETS_PATH)/cc65_udc_6chars.s\r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 -m mapfile.txt \\\r\n\t# -D_XL_NO_TEXT_COLOR -D_XL_NUMBER_OF_TILES=6 \\\r\n\t# -D__VIC20_UNEXPANDED \\\r\n\t# -D_ALT_SLEEP -D__NO_SLEEP_SEC \\\r\n\t# -D__NO_COLOR_INIT -DNO_RANDOM_LEVEL \\\r\n\t# -DTINY_GAME  -DNO_WALL -DGHOSTS_NUMBER=6 \\\r\n\t# -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t# -D__ALT_DISPLAY_STATS \\\r\n\t# -D__DEFAULT_CLEAR_SCREEN \\\r\n\t# -DUSE_TINY_MEMORY_BUFFERS \\\r\n\t# $(VIC20_UNEXPANDED_GAME_OPTS) \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN)  \\\r\n\t# --config $(CFG_PATH)/cc65/vic20_unexpanded_gfx.cfg  \\\r\n\t# $(TINY_FILES) \\\r\n\t# $(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_explosion_sound.c \\\r\n\t# $(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t# $(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t# $(ASSETS_PATH)/cc65_udc_6chars.s \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.prg\r\n\r\nvic20_targets: vic20_unexpanded vic20_exp_3k vic20_exp_8k vic20_exp_16k\r\n\r\n\r\nc16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16 \\\r\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars.cfg \\\r\n\t \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=2000 \\\r\n\t \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DLESS_TEXT\t\\\r\n\t \\\r\n\t-DNO_HINTS \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DDANCE  \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t$(SOURCE_PATH)/memory/c16_memory.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\t\r\n\r\n#############################################################################################################\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.ack_targets",
    "content": "\r\n# ------------------------------------------------------------------------------------------\r\n# ACK\r\n#\r\n\r\n\r\nack_targets: \\\r\n    pc8086_targets \\\r\n    linux386_targets \\\r\n    linux68k_targets \\\r\n    linuxppc_targets \\\r\n    linuxmips_targets\r\n    \r\n############################################################################################\r\n\r\n\r\npc8086_tiny_buffered:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mpc86 \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=20 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__PC8086__ \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DNO_PRINT \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(TINY_FILES)\r\n\tmv pc86.img $(BUILD_PATH)/TINY_pc8086_turn_based.img\r\n\r\ncpm_8080_buffered_ack:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mcpm \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=23 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__CPM8080__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__STDIO \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv cpm.com $(BUILD_PATH)/X$(GAME_NAME)_cpm8080_buffered.com\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\t\r\ncpm_8080_adm3a_ack:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mcpm \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=22 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__CPM8080__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t$(FULL_FILES)\r\n\tmv cpm.com $(BUILD_PATH)/X$(GAME_NAME)_cpm8080_adm3a.com\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\ncpm_8080_ack_targets: \\\r\n\tcpm_8080_ack_buffered\r\n\r\n\r\n# buffered\r\nmsdos86:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mmsdos86 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=22 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__MSDOS86__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv msdos86.exe $(BUILD_PATH)/X$(GAME_NAME)_$@_turn_based.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\nmsdos86_test:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mmsdos86 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=22 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__MSDOS86__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos86/msdos86_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos86/init_vga.s \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv msdos86.exe $(BUILD_PATH)/X$(GAME_NAME)_$@_turn_based.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n# buffered\t\r\npc8086:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mpc86 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=22 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__PC8086__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv pc86.img $(BUILD_PATH)/X$(GAME_NAME)_pc8086_turn_based.img\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\npc8086_targets: \\\r\n\tpc8086\r\n\r\n\t\r\n# buffered\r\nlinuxppc:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mlinuxppc \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__LINUXPPC__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv linuxppc.exe $(BUILD_PATH)/X$(GAME_NAME)_linuxppc_turn_based.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\nlinuxppc_targets: \\\r\n\tlinuxppc\r\n\r\n\r\n#buffered\r\nlinux68k:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mlinux68k \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__LINUX68K__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv linux68k.exe $(BUILD_PATH)/X$(GAME_NAME)_linux68k_turn_based.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\t\r\nlinux68k_targets: \\\r\n\tlinux68k\r\n\r\n\r\n# buffered\r\nlinux386:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mlinux386 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__LINUX386__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv linux386.exe $(BUILD_PATH)/X$(GAME_NAME)_linux386_turn_based.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\nlinux386_targets: \\\r\n\tlinux386\r\n\r\n\r\n# buffered\r\nlinuxmips:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mlinuxmips \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__LINUXPPC__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv linuxmips.exe $(BUILD_PATH)/X$(GAME_NAME)_linuxmips_turn_based.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\nlinuxmips_targets: \\\r\n\tlinuxmips\r\n\r\n\r\n# no ncurses in ACK\r\ndos:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -pc86 \\\r\n\t-D__DOS__ \\\r\n\t \\\r\n\t  \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-D__ALT_PRINT \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-lncurses\r\n\t# mv a.exe $(BUILD_PATH)/X$(GAME_NAME)_dos_turn_based.exe\r\n\r\ndos_targets: \\\r\n\tdos\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.cc6303_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# CC6303\r\n#\r\n\r\n\r\n\r\nvbcc_targets: \\\r\n\tmc10\r\n    \r\n###############################################################################################\r\n\r\n# mc10: mc10_buffered\r\n\r\n# mc10_buffered:\r\n\t# cc68 -tmc10 $(CC6303_MC10_OPTS) $(INCLUDE_OPTS) \\\r\n\t# -D__NORMALIZED_RAND -D__MC10__ \\\r\n\t# -DXSize=31 \\\r\n\t# -DYSize=15 \\\r\n\t# -D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t#  -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t# -D_XL_NO_COLOR \\\r\n\t#  -D_XL_NO_SLEEP \\\r\n\t# -DTURN_BASED \\\r\n\t# -D__BUFFERED_GRAPHICS \\\r\n\t# -D__NO_INIT_GRAPHICS \\\r\n\t# -D__ALT_PRINT \\\r\n\t# -D__DEFAULT_CLEAR_SCREEN \\\r\n\t# $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t# $(FULL_FILES) -o xchase\r\n\t# mv xchase $(BUILD_PATH)/\r\n\t# mv xchase.inf $(BUILD_PATH)/\r\n\r\n\r\n# -S to produce Assembly \r\nmc10:\r\n\tcc68 -tmc10  $(CC6303_MC10_OPTS) $(INCLUDE_OPTS) $(GLOBAL_OPTS) \\\r\n\t-D__MC10__ \\\r\n\t \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D__ALT_SLEEP \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=1500 \\\r\n\t-D__DEFAULT_CLEAR_SCREEN -D__ALT_PRINT  \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o xchase\r\n\trm xchase\r\n\tmv xchase.c10 $(BUILD_PATH)/X$(GAME_NAME)_$@.c10\r\n\r\nmc10_turn_based:\r\n\tcc68 -tmc10  $(CC6303_MC10_OPTS) $(INCLUDE_OPTS) $(GLOBAL_OPTS) \\\r\n\t-D__MC10__ \\\r\n\t \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DNO_PRINT -D__NO_WAIT  \\\r\n\t-DTURN_BASED \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\r\n\t-o xchase\r\n\tmv xchase $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\tmv xchase.c10 $(BUILD_PATH)/X$(GAME_NAME)_$@.c10\r\n\r\nmc10_tiny: mc10_no_print_tiny\r\n\r\nmc10_no_print_tiny:\r\n\tcc68 -tmc10  $(CC6303_MC10_OPTS) $(INCLUDE_OPTS) $(GLOBAL_OPTS) \\\r\n\t-D__MC10__ \\\r\n\t \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME -D_XL_NO_SLEEP \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DNO_PRINT -D__NO_WAIT \\\r\n\t-DNO_INPUT -DNO_WALL \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\r\n\t-o xchase\r\n\tmv xchase $(BUILD_PATH)/TINY_X$(GAME_NAME)_$@\r\n\tmv xchase.c10 $(BUILD_PATH)/TINY_X$(GAME_NAME)_$@.c10\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.cc65_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# CC65\r\n# \r\n\r\n\r\n################################################################################################\r\n\r\n# KO:\r\n#  \r\n# OK: \r\n#\r\n# No. of systems: 19\r\n# ------------\r\n\r\nifeq ($(DO_WIN),1)\r\ncc65_targets: \\\r\n\tapple2_targets \\\r\n\tapple2enh_targets \\\r\n\tatari_targets \\\r\n\tatari5200_targets \\\r\n\tatari_lynx_targets \\\r\n\tc128_8502_targets \\\r\n\tc16_targets \\\r\n\tc64_targets \\\r\n\tcbm510_targets \\\r\n\tcbm610_targets \\\r\n\tcreativision_targets \\\r\n\tcx16_targets \\\r\n\tgamate_targets\t\\\r\n\tnes_targets \\\r\n\tpce_targets \\\r\n\tpet_targets \\\r\n\toric_targets \\\r\n\tosic1p_targets \\\r\n\tsupervision_targets \\\r\n\ttelestrat_targets \\\r\n\tvic20_targets\r\nelse\r\ncc65_targets: \\\r\n\tapple2_targets \\\r\n\tapple2enh_targets \\\r\n\tatari_targets \\\r\n\tatari5200_targets \\\r\n\tatari_lynx_targets \\\r\n\tc128_8502_targets \\\r\n\tc16_targets \\\r\n\tc64_targets \\\r\n\tcbm510_targets \\\r\n\tcbm610_targets \\\r\n\tcreativision_targets \\\r\n\tcx16_targets \\\r\n\tnes_targets \\\r\n\tpce_targets \\\r\n\tpet_targets \\\r\n\toric_targets \\\r\n\ttelestrat_targets \\\r\n\tvic20_targets\r\nendif\r\n\r\n################################################################################################\r\n\r\n\r\napple2_targets: \\\r\n\tapple2_no_gfx apple2_hgr\r\n\r\n\r\napple2enh_targets: \\\r\n\tapple2enh_no_gfx apple2enh_80col apple2enh_hgr\r\n\r\n\r\natari_targets: \\\r\n\tatari atari_no_color\r\n\r\n\r\natari5200_targets: \\\r\n\tatari5200\r\n\r\n\r\natari_lynx_targets: \\\r\n\tatari_lynx\r\n\r\n\r\nc128_8502_targets: \\\r\n\tc128_40col c128_80col\r\n\r\n\r\nc16_targets: \\\r\n\tc16_16k c16_32k\r\n\r\n\r\nc64_targets: \\\r\n\tc64\r\n\r\n\r\ncbm510_targets: \\\r\n\tcbm510\r\n\r\n\r\ncbm610_targets: \\\r\n\tcbm610\r\n\r\n\r\ncreativision_targets: \\\r\n\tcreativision_16k \\\r\n\tcreativision_8k_light creativision_16k\r\n\r\n\r\ncx16_targets: \\\r\n\tcx16\r\n\r\n\r\ngamate_targets: \\\r\n\tgamate\r\n\r\n\r\nnes_targets: \\\r\n\tnes\r\n\r\n\r\npce_targets: \\\r\n\tpce_8k pce_16k \r\n\r\n\r\npet_targets: \\\r\n\tpet_8k_light pet_16k\r\n\r\n\r\noric_targets: \\\r\n\toric_atmos oric1_16k\r\n\r\n\r\nosic1p_targets: \\\r\n\tosic1p_8k osic1p_32k osic1p_8k_turn_based osic1p_32k_turn_based\r\n\r\n\r\nsupervision_targets: \\\r\n\tsupervision\r\n\r\n\r\ntelestrat_targets: \\\r\n\ttelestrat\r\n\r\nifeq ($(DO_WIN),1)\r\nvic20_targets: \\\r\n\tvic20_unexpanded vic20_exp_3k vic20_exp_8k vic20_exp_16k\r\nelse\r\nvic20_targets: \\\r\n\tvic20_unexpanded vic20_exp_3k vic20_exp_16k\r\nendif\r\n\r\n#######################################################################################\r\n# APPLE2\r\n\r\n# -O breaks bit-banging\r\napple2_no_gfx_v1:\t \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t apple2 -DEXTRA_TITLE \\\r\n\t -D__ALT_SLEEP \\\r\n\t\\\r\n\t   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/apple2.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/apple2.bin\r\n\trm $(BUILD_PATH)/apple2.bin\r\n\r\napple2_no_gfx:\t \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t apple2 -DEXTRA_TITLE \\\r\n\t -D__ALT_SLEEP \\\r\n\t\\\r\n\t   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/apple2.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/apple2.bin\r\n\trm $(BUILD_PATH)/apple2.bin\r\n\r\napple2_v1: apple2_hgr_v1\r\n\r\napple2_hgr_v1: $(ASSETS_PATH)/7x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t apple2 -DEXTRA_TITLE \\\r\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\r\n\t -D__ALT_SLEEP  \\\r\n\t-DXSize=20 -DYSize=24 \\\r\n\t   -D__ALT_PRINT \\\r\n\t-DAPPLE2_HGR -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n    --code-name LOWCODE \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/$@.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/$@.bin\r\n\trm $(BUILD_PATH)/$@.bin\r\n\r\n\r\napple2: apple2_hgr\r\n\r\napple2_hgr: $(ASSETS_PATH)/7x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t apple2 -DEXTRA_TITLE -D_APPLE_YELLOW_IS_PURPLE \\\r\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\r\n\t -D__ALT_SLEEP  $(LIGHT_DRAW_SKIP) -D_XL_SLOW_DOWN_FACTOR=0 \\\r\n\t-DXSize=20 -DYSize=24 \\\r\n\t   -D__ALT_PRINT \\\r\n\t-DAPPLE2_HGR -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n    --code-name LOWCODE \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/$@.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/$@.bin\r\n\trm $(BUILD_PATH)/$@.bin\r\n\r\n\r\n#######################################################################################\r\n# APPLE2ENH\r\n\r\n\r\napple2enh_no_gfx: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t apple2enh -DEXTRA_TITLE \\\r\n\t -D__ALT_SLEEP \\\r\n\t\\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS  \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/apple2enh.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/apple2enh.bin\r\n\trm $(BUILD_PATH)/apple2enh.bin\r\n\r\n\r\napple2enh_v1: apple2enh_hgr_v1\r\n\r\napple2enh_hgr_v1: $(ASSETS_PATH)/7x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t apple2enh -DEXTRA_TITLE  -D_APPLE_YELLOW_IS_PURPLE \\\r\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\r\n\t -D__ALT_SLEEP  \\\r\n\t-DXSize=20 -DYSize=24 \\\r\n\t   -D__ALT_PRINT $(LIGHT_DRAW_SKIP) -D_XL_SLOW_DOWN_FACTOR=0 \\\r\n\t-DAPPLE2_HGR -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n    --code-name LOWCODE \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/$@.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/$@.bin\r\n\trm $(BUILD_PATH)/$@.bin\r\n\r\n\r\napple2enh: apple2enh_hgr\r\n\r\napple2enh_hgr: $(ASSETS_PATH)/7x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t apple2enh -DEXTRA_TITLE  -D_APPLE_YELLOW_IS_PURPLE \\\r\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\r\n\t -D__ALT_SLEEP   \\\r\n\t-DXSize=20 -DYSize=24 \\\r\n\t   -D__ALT_PRINT $(LIGHT_DRAW_SKIP) -D_XL_SLOW_DOWN_FACTOR=0 \\\r\n\t-DAPPLE2_HGR -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n    --code-name LOWCODE \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/$@.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/$@.bin\r\n\trm $(BUILD_PATH)/$@.bin\r\n\r\n\r\n# -O breaks bit-banging\r\napple2enh_80col: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t apple2enh -DEXTRA_TITLE \\\r\n\t -D__ALT_SLEEP \\\r\n\t\\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-DXSize=80 \\\r\n\t-DGHOSTS_NUMBER=9 \\\r\n\t-DAPPLE2ENH_80COL_VIDEO_MODE \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2enh/apple2enh_80col_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/apple2enh_80col.bin\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_apple2enh_80col.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_apple2enh_80col.dsk aschase < $(BUILD_PATH)/apple2enh_80col.bin\r\n\trm $(BUILD_PATH)/apple2enh_80col.bin\t\r\n\r\n\r\n#######################################################################################\r\n# ATARI\r\n\r\natari: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari \\\r\n\t-DEXTRA_TITLE \\\r\n\t--config $(CFG_PATH)/cc65/atari_mode1_redefined_chars.cfg \\\r\n\t-D__ANTIC_MODE6_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/atari_mode1_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari/disable_setcursor.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari/atari_mode1_redefined_chars_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.xex\r\n\r\natari_no_color: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari -DEXTRA_TITLE  \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_atari_no_color.xex\r\n\r\n\r\n#######################################################################################\r\n# ATARI5200\r\n\r\natari5200_fixed_colors: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari5200 -DEXTRA_TITLE \\\r\n\t--config $(CFG_PATH)/cc65/atari5200_redefined_chars.cfg \\\r\n\t-D__ATARI5200__ \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari5200/atari5200_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_atari5200.rom\r\n\r\natari5200: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari5200  -DEXTRA_TITLE \\\r\n\t--config $(CFG_PATH)/cc65/atari5200_redefined_chars_32k.cfg \\\r\n\t-D__ATARI5200__ \\\r\n\t-D__ANTIC_MODE6_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=200 \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari5200/atari5200_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_atari5200.rom\r\n\r\n\r\n\r\n#################################################################\r\n\r\natari7800: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari7800 --force-import __EXEHDR__ \\\r\n\t  -D_XL_NO_UDG \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -DEXTRA_TITLE -D__NO_SCREEN_COLOR_INIT -D_XL_NO_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=1000 -DXSize=20 -DYSize=28 \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78\r\n\r\n\r\natari7800_no_color: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari7800 --force-import __EXEHDR__ atari7800-mono.o \\\r\n\t--config $(CFG_PATH)/cc65/atari7800_more_ram.cfg    -D_XL_NO_UDG -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -DEXTRA_TITLE -D__NO_SCREEN_COLOR_INIT -D_XL_NO_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=1000 -DXSize=40 -DYSize=28 \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78\r\n    \r\n\r\n\r\n#######################################################################################\r\n# ATARI LYNX\r\n\r\natari_lynx: atari_lynx_gfx\r\n\r\n\r\natari_lynx_gfx: $(ASSETS_PATH)/8x6_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t lynx \\\r\n\t-D__ATARI_LYNX__  -D_XL_SLOW_DOWN_FACTOR=4000  -DEXTRA_TITLE \\\r\n\t-D__NO_SCREEN_COLOR_INIT  -DXSize=20 -DYSize=17 -D_XL_NUMBER_OF_TILES=27 \\\r\n\t-D__LYNX_TGI_GRAPHICS \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/tgi_gfx_print.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/atari_lynx/atari_lynx_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/atari_lynx/chibisound.asm \\\r\n\t$(ASSETS_PATH)/8x6_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari_lynx/atari_lynx_gfx_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.lnx\r\n\r\n#######################################################################################\r\n# C128\r\n\r\nc128: c128_8502\r\n\r\nc128_8502: c128_40col\r\n\r\nc128_40col: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c128 -DEXTRA_TITLE \\\r\n\t  \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_c128_40col.prg\r\n\r\nc128_80col: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c128 -DEXTRA_TITLE  \\\r\n\t  \\\r\n\t-DXSize=80 \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-DGHOSTS_NUMBER=9 \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c128/c128_80col_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_c128_80col.prg\r\n\r\n\r\n#######################################################################################\r\n# C16\r\n\r\nplus4: c16_32k\r\n\r\n\r\nc16_32k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16  \\\r\n\t--config $(CFG_PATH)/cc65/c16-32k_GFX_64chars.cfg \\\r\n\t -DEXTRA_TITLE \\\r\n\t \\\r\n\t \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=2000 \\\r\n\t-DDANCE  -D__UDG_BASE_FACTOR=23 \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nc16_32k_included: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t c16 --config $(CFG_PATH)/cc65/c16-32k.cfg \\\r\n\t   -DEXTRA_TITLE \\\r\n\t-DGHOSTS_NUMBER=8 -D_XL_SLOW_DOWN_FACTOR=2000 \\\r\n\t  \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_redefined_chars_init_graphics.c  \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(SOURCE_PATH)/memory/c16_memory.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nc16: c16_16k\r\n\r\nc16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16 \\\r\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars.cfg \\\r\n\t \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=2000 \\\r\n\t \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DLESS_TEXT\t\\\r\n\t \\\r\n\t-DNO_HINTS \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DDANCE  \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t$(SOURCE_PATH)/memory/c16_memory.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\t\r\n\r\n\r\n#######################################################################################\r\n# C64\r\n\r\n# -DDEBUG_GHOST_DISPLAY\r\nc64_wait_vsync: $(ASSETS_PATH)/cc65_udc_arcade.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c64 -DEXTRA_TITLE \\\r\n\t     \\\r\n\t--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg  \\\r\n\t-DCBM_SCREEN_CODES -DGHOSTS_NUMBER=8 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__USE_WAIT_V_SYNC -DDEBUG_GHOST_DISPLAY \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\t$(TOOLS_PATH)/generic/exomizer sfx basic $(BUILD_PATH)/X$(GAME_NAME)_$@.prg -o $(BUILD_PATH)/X$(GAME_NAME)_$@_exomized.prg\r\n\tpython $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/X$(GAME_NAME)_$@_exomized.prg  $(BUILD_PATH)/X$(GAME_NAME)_$@_exomized.crt\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\nc64: $(ASSETS_PATH)/cc65_udc_arcade.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c64 -DEXTRA_TITLE \\\r\n\t     \\\r\n\t--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg  \\\r\n\t-DCBM_SCREEN_CODES -D__ALT_PRINT \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\nc64_exomized: $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\t$(TOOLS_PATH)/generic/exomizer sfx basic $(BUILD_PATH)/X$(GAME_NAME)_c64.prg -o $(BUILD_PATH)/X$(GAME_NAME)_c64_exomized.prg\r\n\r\n# prg2crt not compatible with Python 3\r\nc64_crt: $(BUILD_PATH)/X$(GAME_NAME)_c64_exomized.prg\r\n\tpython $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/X$(GAME_NAME)_c64_exomized.prg  $(BUILD_PATH)/X$(GAME_NAME)_c64_exomized.crt\r\n\t# /usr/bin/python2 $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/X$(GAME_NAME)_c64_exomized.prg  $(BUILD_PATH)/X$(GAME_NAME)_c64_exomized.crt\r\n\r\n\r\n\r\n\r\n\r\n#######################################################################################\r\n# CBM610\r\n\r\ncbm610: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t cbm610 \\\r\n\t \\\r\n\t\\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_cbm610.prg\r\n\r\n\r\n#######################################################################################\r\n# CBM510\r\n\r\ncbm510: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t cbm510 -DEXTRA_TITLE \\\r\n\t \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_cbm510.prg\r\n\r\n\r\n#######################################################################################\r\n# CREATIVISION\r\n\r\n\r\ncreativision: creativision_16k\r\n\r\ncreativision_16k: creativision_16k_color\r\n\r\ncreativision_16k_fixed_colors: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CREATIVISION__  \\\r\n\t   -D__ALT_SLEEP \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -DLESS_TEXT   \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=2000  \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k.cfg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\n\r\ncreativision_16k_color: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CREATIVISION__  \\\r\n\t   -D__ALT_SLEEP \\\r\n\t-DCREATIVISION_COLOR -DGHOSTS_NUMBER=8 -DLESS_TEXT   \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=2000  -DUSE_TINY_MEMORY_BUFFERS \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k.cfg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(SOURCE_PATH)/memory/creativision_memory.s \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\n\r\ncreativision_test: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CREATIVISION__  \\\r\n\t -D__ALT_SLEEP \\\r\n\t-DCREATIVISION_COLOR -DLESS_TEXT   \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=2000 \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k_less_stack.cfg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\n\r\n# dd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin ibs=1 count=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_LOW.bin\r\n# dd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin ibs=1 skip=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_HIGH.bin\r\n# rm $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin \r\n# cat $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_HIGH.bin $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_LOW.bin > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n# rm $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_LOW.bin\r\n# rm $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_HIGH.bin\r\n\r\n\r\ncreativision_8k_light: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t creativision \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DLESS_TEXT \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DFLAT_ENEMIES \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t--config $(CFG_PATH)/cc65/creativision-8k_less_stack.cfg \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_creativision_8k_less_text.bin\t\r\n\r\n\r\n#######################################################################################\r\n# CX16\r\n\r\ncx16: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t cx16 -DEXTRA_TITLE \\\r\n\t-D__CX16__ \\\r\n\t   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_cx16.prg\r\n\r\n\r\n#######################################################################################\r\n# GAMATE\r\n\r\n#sound version is buggy (probably because of a memory issue)\r\ngamate: gamate_no_sound\r\n\r\ngamate_test: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=6000   \\\r\n\t\\\r\n\t-DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DSIMPLE_STRATEGY -DNO_HINTS -DNO_BLINKING -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\n\r\ngamate_no_udg: $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=5000  \\\r\n\t\\\r\n\t-DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate_no_udg.bin\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate_no_udg.bin\r\n\r\ngamate_no_sound: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=6000   \\\r\n\t\\\r\n\t-DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DSIMPLE_STRATEGY -DNO_HINTS -DNO_BLINKING -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\n\r\ngamate_sound: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=6000   \\\r\n\t-DNO_CONTROL_INSTRUCTIONS -DNO_HINTS  -D_XL_NO_SLEEP -D__NO_WAIT    \\\r\n\t-DLESS_TEXT  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DSIMPLE_STRATEGY -DNO_HINTS -DNO_BLINKING -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\n\r\n\r\n#######################################################################################\r\n# NES\r\n\r\nnes: $(ASSETS_PATH)/cc65_nes_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t nes -DEXTRA_TITLE \\\r\n\t--config $(CFG_PATH)/cc65/nes_fx.cfg \\\r\n\t \\\r\n\t  -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/nes/nes_init_graphics.c \\\r\n\t$(ASSETS_PATH)/cc65_nes_tiles.s \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_nes.nes\r\n\r\n\r\n#######################################################################################\r\n# PCE\r\n\r\npce: pce_16k\r\n\r\n# -Or breaks the PCE target\r\npce_16k: $(ASSETS_PATH)/cc65_pce_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t pce -DEXTRA_TITLE \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=3500 \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t--config $(CFG_PATH)/cc65/pce_16k_less_stack.cfg   \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_pce_tiles.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 count=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 skip=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin \r\n\tcat $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin > $(BUILD_PATH)/X$(GAME_NAME)_PCE_SWAPPED.pce\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin\r\n\r\n\r\n# -Or breaks the PCE target\r\npce_8k: $(ASSETS_PATH)/cc65_pce_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t pce \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING -D_XL_NO_COLOR \\\r\n\t -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t--config $(CFG_PATH)/cc65/pce_8k_less_stack.cfg \\\r\n\t$(TINY_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_pce_tiles.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_TINY_PCE_8k.pce\r\n\r\n\r\n#######################################################################################\r\n# PET\r\n\r\npet: pet_16k\r\n\r\npet_16k: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t pet \\\r\n\t \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/pet/pet_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_pet_16k.prg\r\n\r\n\r\npet_8k_light:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t pet -Cl \\\r\n\t--config $(CFG_PATH)/cc65/pet_8k.cfg \\\r\n\t-DLESS_TEXT  \\\r\n\t-DNO_BLINKING -D_XL_NO_COLOR \\\r\n\t-D__NO_SCREEN_COLOR_INIT  \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DUSE_LIGHT_MEMORY_BUFFERS \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(SOURCE_PATH)/memory/pet_memory.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pet_8k_less_text.prg\r\n\r\n\r\n#######################################################################################\r\n# ORIC1\r\n\r\noric: oric1\r\n\r\noric1: oric1_16k\r\n\r\noric1_16k: $(ASSETS_PATH)/6x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -D__ORIC1__  \\\r\n\t  \\\r\n\t-DLESS_TEXT -D_XL_NO_SLEEP \\\r\n\t-DSIMPLE_STRATEGY -DNO_HINTS -DGHOSTS_NUMBER=8 \\\r\n\t-DNO_BLINKING \\\r\n\t-t atmos \\\r\n\t-D__ORIC_COLOR_GRAPHICS \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t--config $(CFG_PATH)/cc65/atmos_better_tap.cfg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atmos/atmos_redefined_characters_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(SOURCE_PATH)/memory/oric1_memory.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_oric1_16k_less_text.tap\r\n\r\natmos: oric_atmos\r\n\r\noric_atmos: $(ASSETS_PATH)/6x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS)  -O       -DEXTRA_TITLE \\\r\n\t-t atmos \\\r\n\t--config $(CFG_PATH)/cc65/atmos_better_tap.cfg \\\r\n\t-D__ORIC_COLOR_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atmos/atmos_redefined_characters_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_atmos_and_oric1_48k.tap\r\n\r\n\r\n#######################################################################################\r\n# OSIC1P\r\n\r\nosic1p: osic1p_32k\r\n\r\nosic1p_32k: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) --start-addr 0x200 -Wl -D,__HIMEM__=0x8000 -O -t osic1p  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k.lod\r\n\t$(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k.lod\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k.c1p $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k.lod\r\n\r\n\r\nosic1p_32k_turn_based: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) --start-addr 0x200 -Wl -D,__HIMEM__=0x8000 -O -t osic1p  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTURN_BASED \\\r\n\t-DGHOSTS_NUMBER=9 \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k_turn_based.lod\r\n\t$(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k_turn_based.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k_turn_based.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k_turn_based.lod\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k_turn_based.c1p $(BUILD_PATH)/X$(GAME_NAME)_osic1p_32k_turn_based.lod\r\n\r\n\r\nosic1p_8k: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Cl --start-addr 0x200 -Wl -D,__HIMEM__=0x2000 -O --config $(CFG_PATH)/cc65/osic1p_less_stack.cfg -t osic1p \\\r\n\t-DROUND_ENEMIES -D_XL_NO_SLEEP  -DNO_RANDOM_LEVEL -DLESS_TEXT -D__NO_SCREEN_COLOR_INIT -DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(TINY_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k.lod\t\r\n\t$(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k.lod\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k.c1p $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k.lod\r\n\r\n\r\nosic1p_8k_turn_based: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Cl --start-addr 0x200 -Wl -D,__HIMEM__=0x2000 -O --config $(CFG_PATH)/cc65/osic1p_less_stack.cfg -t osic1p \\\r\n\t-DROUND_ENEMIES -D_XL_NO_SLEEP  -DNO_RANDOM_LEVEL -DLESS_TEXT -D__NO_SCREEN_COLOR_INIT -DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-DTURN_BASED \\\r\n\t-DGHOSTS_NUMBER=9 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(TINY_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k_turn_based.lod\t\r\n\t$(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k_turn_based.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k_turn_based.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k_turn_based.lod\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k_turn_based.c1p $(BUILD_PATH)/X$(GAME_NAME)_TINY_osic1p_8k_turn_based.lod\r\n\r\n\r\n#######################################################################################\r\n# SUPERVISION\r\n\r\nsupervision_reduced: $(ASSETS_PATH)/cc65_udc.s \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t supervision  \\\r\n\t--config $(CFG_PATH)/cc65/supervision-16k_GFX.cfg \\\r\n\t$(ASSETS_PATH)/cc65_udc.s \\\r\n\t-DNO_PRINT  -D_XL_NO_SLEEP \\\r\n\t-D__BIT_MAPPED_4_GRAPHICS $(LIGHT_DRAW_SKIP) \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/supervision/supervision_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_supervision.sv\r\n\r\nsupervision_no_print: $(ASSETS_PATH)/cc65_udc.s \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t supervision  \\\r\n\t--config $(CFG_PATH)/cc65/supervision-16k_GFX.cfg \\\r\n\t$(ASSETS_PATH)/cc65_udc.s \\\r\n\t-DNO_PRINT    -D_XL_NO_SLEEP \\\r\n\t-D__BIT_MAPPED_4_GRAPHICS $(LIGHT_DRAW_SKIP) \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/supervision/supervision_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_supervision.sv\r\n\r\n\r\nsupervision: $(ASSETS_PATH)/cc65_udc.s \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t supervision  -DEXTRA_TITLE \\\r\n\t--config $(CFG_PATH)/cc65/supervision-16k_GFX.cfg \\\r\n\t$(ASSETS_PATH)/cc65_udc.s \\\r\n\t-D__ALT_PRINT    -D__ALT_SLEEP \\\r\n\t-D__BIT_MAPPED_4_GRAPHICS $(LIGHT_DRAW_SKIP) \\\r\n\t-D__DEFAULT_CLEAR_SCREEN  -D_XL_SLOW_DOWN_FACTOR=300 \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/supervision/supervision_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_supervision.sv\r\n\r\n#######################################################################################\r\n# TELESTRAT\r\n\r\ntelestrat: telestrat_buffered\r\n\r\ntelestrat_buffered: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t telestrat \\\r\n\t-D__TELESTRAT__ \\\r\n\t-D__BUFFERED_GRAPHICS -DTURN_BASED -D__STDIO -DXSize=38 -DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_SLOW_DOWN_FACTOR=800 \\\r\n\t -D__NO_WAIT -D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN \\\r\n\t  \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\t# cp $(BUILD_PATH)/X$(GAME_NAME)_$@ /cygdrive/C/Emulation/Computers/Oricutron_win64-20200515/sdcard/bin/xchase\r\n\r\n\r\ntelestrat_joy_buffered: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t telestrat \\\r\n\t-D__TELESTRAT__ -DCC65_JOYSTICK \\\r\n\t-D__BUFFERED_GRAPHICS -DTURN_BASED -D__STDIO -DXSize=38 -DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_SLOW_DOWN_FACTOR=800 \\\r\n\t -D__NO_WAIT -D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN \\\r\n\t  \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_$@ /cygdrive/C/Emulation/Computers/Oricutron_win64-20200515/sdcard/bin/xchase\r\n\r\ntelestrat_exp: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t telestrat \\\r\n\t-D__TELESTRAT__ -D__INCLUDE_CONIO_H \\\r\n\t-D__NO_WAIT -DCC65_JOYSTICK -DXSize=38 -DYSize=24  \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_SLEEP \\\r\n\t \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_$@ /cygdrive/C/Emulation/Computers/Oricutron_win64-20200515/sdcard/bin/xchase\r\n\r\n\r\n#######################################################################################\r\n# VIC20\r\n\r\nvic20_wait_vsync: vic20_exp_16k_wait_vsync\r\n\r\n# broken with VERSION=2\r\nvic20_exp_16k_wait_vsync: $(ASSETS_PATH)/cc65_udc.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20      \\\r\n\t--config $(CFG_PATH)/cc65/vic20-16k_GFX.cfg \\\r\n\t-D__CONIO_GRAPHICS -D__VIC20_EXP_16K -D_XL_SLOW_DOWN_FACTOR=2600 -DEXTRA_TITLE \\\r\n\t -D__USE_WAIT_V_SYNC -DDEBUG_GHOST_DISPLAY \\\r\n\t\\\r\n\t$(ASSETS_PATH)/cc65_udc.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nvic20: vic20_exp_8k\r\n\r\n# broken with VERSION=2\r\n# vic20_exp_16k: $(ASSETS_PATH)/cc65_udc.s\r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20      \\\r\n\t# --config $(CFG_PATH)/cc65/vic20-16k_GFX.cfg -DEXTRA_TITLE \\\r\n\t# -D__CONIO_GRAPHICS -D__VIC20_EXP_16K -D_XL_SLOW_DOWN_FACTOR=2800 \\\r\n\t#  \\\r\n\t# \\\r\n\t# $(ASSETS_PATH)/cc65_udc.s \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t# $(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t# $(SOURCE_PATH)/end_screen.c \\\r\n\t# $(FULL_FILES) \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n# broken with VERSION=2\r\nvic20_exp_16k: $(ASSETS_PATH)/cc65_udc_arcade_v2.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20      \\\r\n\t--config $(CFG_PATH)/cc65/vic20-16k_CODE2_GFX_ALT_V2.cfg \\\r\n\t-DEXTRA_TITLE \\\r\n\t-D__CONIO_GRAPHICS -D__VIC20_EXP_16K -D_XL_SLOW_DOWN_FACTOR=2800 \\\r\n\t \\\r\n\t\\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_v2.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n# vic20_test2: $(ASSETS_PATH)/cc65_udc_arcade_v2.s\r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS)  -Or -Cl -t vic20    \\\r\n\t# --config $(CFG_PATH)/cc65/vic20-16k_CODE2_GFX_ALT_V2.cfg \\\r\n\t# -D__CONIO_GRAPHICS -D__VIC20_EXP_16K -DEXTRA_TITLE -D__ALT_SLEEP  \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=500  -DGHOSTS_NUMBER=8 \\\r\n\t#    -DTRANSITION_ANIMATION \\\r\n\t# $(ASSETS_PATH)/cc65_udc_arcade_v2.s \\\r\n\t# $(BASIC_CROSS_LIB_FILES) \\\r\n\t# $(SOURCE_PATH)/move_player.c \\\r\n\t# $(SOURCE_PATH)/ghost.c  $(SOURCE_PATH)/level.c $(SOURCE_PATH)/character.c $(SOURCE_PATH)/game_text.c \\\r\n\t# $(SOURCE_PATH)/main.c \\\r\n\t# $(SOURCE_PATH)/init_images.c \\\r\n\t# $(SOURCE_PATH)/strategy.c \\\r\n\t# $(SOURCE_PATH)/item.c $(SOURCE_PATH)/bullet.c  \\\r\n\t# $(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t# $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t# --code-name CODE2 \\\r\n\t# $(SOURCE_PATH)/horizontal_missile.c $(SOURCE_PATH)/rocket.c  $(SOURCE_PATH)/skull.c  \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t# $(SOURCE_PATH)/end_screen.c $(SOURCE_PATH)/sleep.c \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\ntest_vsync:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t vic20 $(TEST_PATH)/test_vsync.c -o $(BUILD_PATH)/test_vsync.prg\r\n\r\nvic20_exp_3k: $(ASSETS_PATH)/cc65_udc_vic20_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t--config $(CFG_PATH)/cc65/vic20-3k_GFX.cfg \\\r\n\t -DGHOSTS_NUMBER=8 \\\r\n\t\\\r\n\t  \\\r\n\t \\\r\n\t \\\r\n\t-D__VIC20_EXP_3K \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-DUSE_LIGHT_MEMORY_BUFFERS \\\r\n\t-DNO_HINTS \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_TEXT_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t-D_XL_NO_SLEEP -DNO_STATS \\\r\n\t-D__ALT_DISPLAY_STATS \\\r\n\t-D__ALT_HIGHSCORE \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_vic20_64_chars.s \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_$@.prg\r\n\r\n\r\n# OK with API version 2\r\nvic20_exp_8k: $(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t--config $(CFG_PATH)/cc65/vic20-8k_memory_mapped_GFX.cfg  -DEXTRA_TITLE \\\r\n\t  \\\r\n\t\\\r\n\t -D_XL_SLOW_DOWN_FACTOR=2800 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__VIC20__ -D__VIC20_EXP_8K \\\r\n\t \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t-DNO_HINTS \\\r\n\t-DLESS_TEXT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t  \\\r\n\t$(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(SOURCE_PATH)/level.c $(SOURCE_PATH)/character.c \\\r\n\t$(SOURCE_PATH)/game_text.c \\\r\n\t$(SOURCE_PATH)/ghost.c $(CROSS_LIB_PATH)/input/input_macros.c  \\\r\n\t$(SOURCE_PATH)/strategy.c $(SOURCE_PATH)/bullet.c \\\r\n\t$(SOURCE_PATH)/move_player.c \\\r\n\t$(SOURCE_PATH)/item.c \\\r\n\t$(SOURCE_PATH)/skull.c \\\r\n\t$(SOURCE_PATH)/rocket.c \\\r\n\t$(CROSS_LIB_PATH)/display/display_macros.c  \\\r\n\t$(SOURCE_PATH)/horizontal_missile.c \\\r\n\t--code-name CODE2 \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/init_images.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(SOURCE_PATH)/main.c \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n# OK with API version 2 ?\r\nvic20_exp_8k_wait_vsync: $(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t--config $(CFG_PATH)/cc65/vic20-8k_memory_mapped_GFX.cfg \\\r\n\t  \\\r\n\t\\\r\n\t -D_XL_SLOW_DOWN_FACTOR=2300 -D__USE_WAIT_V_SYNC -DDEBUG_GHOST_DISPLAY \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__VIC20__ -D__VIC20_EXP_8K \\\r\n\t \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t-DNO_HINTS \\\r\n\t-DLESS_TEXT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t  \\\r\n\t/$(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(SOURCE_PATH)/level.c $(SOURCE_PATH)/character.c \\\r\n\t$(SOURCE_PATH)/game_text.c  $(CROSS_LIB_PATH)/text/text_macros.c \\\r\n\t$(SOURCE_PATH)/ghost.c $(CROSS_LIB_PATH)/input/input_macros.c  \\\r\n\t$(SOURCE_PATH)/strategy.c $(SOURCE_PATH)/bullet.c \\\r\n\t$(SOURCE_PATH)/move_player.c \\\r\n\t$(SOURCE_PATH)/item.c \\\r\n\t$(SOURCE_PATH)/skull.c \\\r\n\t$(SOURCE_PATH)/rocket.c \\\r\n\t$(CROSS_LIB_PATH)/display/display_macros.c  \\\r\n\t$(SOURCE_PATH)/horizontal_missile.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t--code-name CODE2 \\\r\n\t$(SOURCE_PATH)/init_images.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(SOURCE_PATH)/main.c \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n# broken with API version 2\r\nvic20_unexpanded: $(ASSETS_PATH)/cc65_udc_6chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t\\\r\n\t \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-D_XL_NO_TEXT_COLOR \\\r\n\t-D__VIC20_UNEXPANDED \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DLESS_TEXT \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-DNO_STATS \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ALT_HIGHSCORE \\\r\n\t-D__ALT_DISPLAY_STATS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t-DROUND_ENEMIES \\\r\n\t-DSIMPLE_RANDOM_LEVEL \\\r\n\t--config $(CFG_PATH)/cc65/vic20_unexpanded_gfx.cfg  \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_explosion_sound.c \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t$(ASSETS_PATH)/cc65_udc_6chars.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.prg\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.cmoc_targets",
    "content": "\r\n# ------------------------------------------------------------------------------------------\r\n# CMOC\r\n#\r\nCOCO_OPTS_TINY  = $(CMOC_MAKEFILE_COMPILATION_OPTS) -Wno-const  -D__COCO__ -DTINY_GAME \r\n\r\nCOCO_OPTS_LIGHT = $(CMOC_MAKEFILE_COMPILATION_OPTS) -Wno-const -D__COCO__\r\n\r\nCMOC_OPTS       = $(CMOC_MAKEFILE_COMPILATION_OPTS) -Wno-const  -D__DEFAULT_CLEAR_SCREEN -D__CMOC__  -D__ALT_SLEEP -D__ALT_PRINT -DLESS_TEXT    \r\n\r\nNO_UDG_OPS      = $(CMOC_OPTS) -D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS  -D_XL_SLOW_DOWN_FACTOR=4000\r\n\r\nGFX_OPTS        = $(CMOC_OPTS) -D__BIT_MAPPED_GRAPHICS -D_XL_SLOW_DOWN_FACTOR=150\r\n\r\nCOCO_OPTS       = -D__COCO__ $(NO_UDG_OPS) -DEXTRA_TITLE\r\n\r\nCOCO_GFX_OPTS   = -D__COCO__ $(GFX_OPTS) -D_XL_NO_COLOR  -DEXTRA_TITLE\r\n\r\nGFX_COLOR_OPTS          = $(CMOC_OPTS) -D__ALT_PRINT\r\n\r\nCOCO_COLOR_GFX_OPTS     = -D__COCO__ $(GFX_COLOR_OPTS) -D__BIT_MAPPED_4_GRAPHICS -D__BIT_MAPPED_GRAPHICS  -DMAX_ARROWS_ON_SCREEN=7  -DFASTER_WALL_REDRAW -DNUMBER_OF_MISSILES=4 -D_XL_SLOW_DOWN_FACTOR=1800\r\n\r\nCOCO_COLOR_GFX_COMPILE_OPTS = $(COCO_COLOR_GFX_OPTS) -DYSize=24  -DEXTRA_TITLE\r\n\r\nCOCO3_GFX_OPTS  = -D__COCO__ $(CMOC_OPTS)\r\n\r\nDRAGON_OPTS     = --dragon -D__DRAGON__ $(COCO_OPTS) \r\n\r\nDRAGON_GFX_OPTS   = -D__DRAGON__ $(GFX_OPTS) -D_XL_NO_COLOR \r\n\r\nVECTREX_OPTS    ?= -O0 --vectrex  -D_XL_NO_SLEEP -D__NO_WAIT -DNO_INPUT -DNO_PRINT -Wno-const -D__DEFAULT_CLEAR_SCREEN -D__CMOC__ -D__VECTREX__ -D__VECTORIAL_GRAPHICS -D__NO_INIT_GRAPHICS -D__ALT_PRINT -DLESS_TEXT   \r\n\r\n# -D__DEFAULT_CLEAR_SCREEN\r\nMO5_OPTS        ?= $(CMOC_MAKEFILE_COMPILATION_OPTS)  -DEXTRA_TITLE -D_XL_SLOW_DOWN_FACTOR=800   -D__ALT_SLEEP  -Wno-const  -D__CMOC__ -D__MO5__ -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT -DLESS_TEXT   \r\n\r\nTO7_OPTS        ?= $(CMOC_MAKEFILE_COMPILATION_OPTS)  -D_XL_SLOW_DOWN_FACTOR=1000  -D__ALT_SLEEP  -Wno-const  -D__CMOC__ -D__TO7__ -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT -DLESS_TEXT \r\n\r\nTO7_ORG_DATA    ?= --org=a000 \r\n# --data=D400\r\n\r\n################################################################################\r\n\r\n\r\n# cmoc_targets: \\\r\n\t# coco_targets \\\r\n\t# dragon_targets \\\r\n\t# mo5_targets \\\r\n\t# to7_targets\r\n\r\n\r\n#############################################################################################\r\n\r\ndragon: dragon_gfx\r\n\r\ndragon_no_gfx:\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\t\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\t\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c \r\n\t$(CMOC) \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\t\r\n\t$(CMOC) -o $(BUILD_PATH)/xchase.bin \\\r\n\t$(DRAGON_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c sleep_macros.o \\\r\n\tdisplay_macros.o dac_sounds.o \\\r\n\tinit_images.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \tdisplay_macros.o dac_sounds.o sleep_macros.o \\\r\n\tinit_images.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@..cas -D $(BUILD_PATH)/xchase.bin -A\r\n\t$(TOOLS_PATH)/cmoc/dragon/File2VDK.exe $(BUILD_PATH)/xchase.bin\r\n\tmv $(BUILD_PATH)/xchase.bin.vdk $(BUILD_PATH)/X$(GAME_NAME)_$@.vdk\r\n\tmv $(BUILD_PATH)/xchase.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\ndragon_gfx: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco/coco_init_graphics.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\t\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c\r\n\t$(CMOC) \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\r\n\t$(CMOC) -o $(BUILD_PATH)/xchase.bin \\\r\n\t$(DRAGON_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c sleep_macros.o \\\r\n\tdisplay_macros.o \\\r\n\tinit_images.o  coco_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o dac_sounds.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o cmoc_udc_tiles_and_fonts.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \tdisplay_macros.o dac_sounds.o sleep_macros.o \\\r\n\tinit_images.o  coco_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o cmoc_udc_tiles_and_fonts.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@.cas -D $(BUILD_PATH)/xchase.bin -A\r\nifeq ($(DO_WIN),1)\r\n\t$(TOOLS_PATH)/cmoc/dragon/File2VDK.exe $(BUILD_PATH)/xchase.bin\r\n\tmv $(BUILD_PATH)/xchase.bin.vdk $(BUILD_PATH)/X$(GAME_NAME)_$@.vdk\r\nendif\r\n\trm $(BUILD_PATH)/xchase.bin\r\n\r\n\r\n\r\ndragon_targets: \\\r\n\tdragon_gfx\r\n\r\n\r\ncoco: coco_gfx\r\n\t\r\ncoco_no_gfx: $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\t\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\t\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c \r\n\t$(CMOC) \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\t\r\n\t$(CMOC) -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(COCO_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c sleep_macros.o \\\r\n\tdisplay_macros.o dac_sounds.o \\\r\n\tinit_images.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \tdisplay_macros.o dac_sounds.o sleep_macros.o \\\r\n\tinit_images.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_$@.bin XCHASE.BIN\r\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XCHASE.BIN\r\n\tmv XCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@.cas -C XCHASE.BIN -A\r\n\trm XCHASE.BIN\r\n\r\n\r\ncoco_gfx: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco/coco_init_graphics.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\r\n\t$(CMOC) -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c \\\r\n\tdisplay_macros.o sleep_macros.o \\\r\n\tinit_images.o  coco_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o dac_sounds.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o cmoc_udc_tiles_and_fonts.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \tdisplay_macros.o dac_sounds.o sleep_macros.o \\\r\n\tinit_images.o  coco_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o cmoc_udc_tiles_and_fonts.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_$@.bin XCHASE.BIN\r\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XCHASE.BIN\r\n\tmv XCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@.cas -C XCHASE.BIN -A\r\n\trm XCHASE.BIN\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n\r\ncoco_color: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco/coco_init_graphics.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c\r\n\t$(CMOC) \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\r\n\t$(CMOC) -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c sleep_macros.o \\\r\n\tdisplay_macros.o \\\r\n\tinit_images.o  coco_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o dac_sounds.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o cmoc_udc_tiles_and_fonts.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \tdisplay_macros.o dac_sounds.o sleep_macros.o \\\r\n\tinit_images.o  coco_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o cmoc_udc_tiles_and_fonts.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_$@.bin XCHASE.BIN\r\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XCHASE.BIN\r\n\tmv XCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@.cas -C XCHASE.BIN -A\r\n\trm XCHASE.BIN\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n# coco_targets: \\\r\n\t# coco_no_gfx\r\n\r\n\r\ncoco3: coco3_gfx\r\n\t\r\ncoco3_gfx: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco3/coco3_init_graphics.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c\r\n\t$(CMOC) \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\r\n\t$(CMOC) -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c \\\r\n\tdisplay_macros.o dac_sounds.o \\\r\n\tinit_images.o  coco3_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o cmoc_udc_tiles_and_fonts.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \tdisplay_macros.o dac_sounds.o \\\r\n\tinit_images.o  coco3_init_graphics.o \\\r\n\tmemory_mapped_alt_print.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o cmoc_udc_tiles_and_fonts.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_$@.bin XCHASE.BIN\r\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XCHASE.BIN\r\n\tmv XCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\t$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@.cas -C XCHASE.BIN -A\r\n\trm XCHASE.BIN\r\n\r\n\r\ncoco3_targets: \\\r\n\tcoco3_gfx\r\n\r\n\r\n\r\nvectrex:\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\t\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\t\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c \r\n\t$(CMOC) \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\t\r\n\t$(CMOC) -o $(BUILD_PATH)/X$(GAME_NAME)_Vectrex.bin \\\r\n\t$(VECTREX_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c \\\r\n\tdisplay_macros.o \\\r\n\tinit_images.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \tdisplay_macros.o \\\r\n\tinit_images.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\r\nvectrex_targets: \\\r\n\tvectrex\r\n\r\nmo5: $(ASSETS_PATH)/cmoc_udc_tiles.s $(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/mo5_alt_print.c \r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/mo5/mo5_init_graphics.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\t\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\t\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c \r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/end_screen.c\t\r\n\t$(CMOC) \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles.s\t\r\n\t$(CMOC) -o $(BUILD_PATH)/FULL_MO5.bin \\\r\n\t$(MO5_OPTS)  $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c \\\r\n\tmo5_alt_print.o dac_sounds.o \\\r\n\tmo5_init_graphics.o \\\r\n\tdisplay_macros.o \\\r\n\tcmoc_udc_tiles.o \\\r\n\tinit_images.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\trm \\\r\n\tmo5_alt_print.o dac_sounds.o \\\r\n\tcmoc_udc_tiles.o \\\r\n\tmo5_init_graphics.o \\\r\n\tdisplay_macros.o \\\r\n\tinit_images.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o end_screen.o\r\n\t$(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) $(BUILD_PATH)/FULL_MO5.bin\r\n\tmv $(BUILD_PATH)/FULL_MO5.bin .\r\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) -c X$(GAME_NAME)_MO5.sap\r\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) --add X$(GAME_NAME)_MO5.sap FULL_MO5.bin\r\n\tmv ./X$(GAME_NAME)_MO5.sap $(BUILD_PATH)\r\n\tmv ./FILE.K5 $(BUILD_PATH)/X$(GAME_NAME)_MO5.k5\r\n\trm ./FULL_MO5.bin\r\n\r\n\r\nto7: $(ASSETS_PATH)/cmoc_udc_tiles.s $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS) $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/alt_print/mo5_alt_print.c \r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/mo5/mo5_init_graphics.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/init_images.c\t\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(CROSS_LIB_PATH)/input/input_macros.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/move_player.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/ghost.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/level.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/character.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/game_text.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/strategy.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/item.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/bullet.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/skull.c\t\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/horizontal_missile.c\r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(SOURCE_PATH)/rocket.c \r\n\t$(CMOC) \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-c $(ASSETS_PATH)/cmoc_udc_tiles.s\t\r\n\t$(CMOC) $(TO7_ORG_DATA) -o $(BUILD_PATH)/XLIB.bin \\\r\n\t$(TO7_OPTS)  $(INCLUDE_OPTS) \\\r\n\t$(SOURCE_PATH)/main.c \\\r\n\tmo5_alt_print.o dac_sounds.o \\\r\n\tmo5_init_graphics.o \\\r\n\tdisplay_macros.o \\\r\n\tcmoc_udc_tiles.o \\\r\n\tinit_images.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o \r\n\trm \\\r\n\tmo5_alt_print.o dac_sounds.o \\\r\n\tcmoc_udc_tiles.o \\\r\n\tmo5_init_graphics.o \\\r\n\tdisplay_macros.o \\\r\n\tinit_images.o \\\r\n\tghost.o \\\r\n\tmove_player.o \\\r\n\tlevel.o character.o \\\r\n\tgame_text.o \\\r\n\tstrategy.o \\\r\n\tinput_macros.o \\\r\n\titem.o bullet.o skull.o \\\r\n\trocket.o horizontal_missile.o \r\n\tmv $(BUILD_PATH)/XLIB.bin .\r\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) -c XLIB.sap\r\n\t$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) --add XLIB.sap XLIB.bin\r\n\trm ./XLIB.bin\r\n\tmv ./XLIB.sap $(BUILD_PATH)/X$(GAME_NAME)_TO7.sap\r\n\r\n\r\nto7_targets: \\\r\n\tto7\r\n\r\n\r\nmo5_targets: \\\r\n\tmo5"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.cross-dev-kit_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# CROSSS-DEV-KIT\r\n#\r\n\r\nc128_targets: \\\r\n\tc128_8502_targets c128_z80_targets\r\n    \r\ncpm_targets: \\\r\n    cpm_8080_targets cpm_z80_targets\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.emcc_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# EMCC\r\n\r\n\r\nEM_CC ?= emcc\r\nEM_OPTS = \r\n\r\n##############################################################################################\r\n\r\nemcc_targets: \\\r\n    emcc_buffered\r\n\r\n##############################################################################################\r\n\r\nemcc: emcc_buffered\r\n\r\nemcc_buffered:\r\n\t$(EM_CC) $(INCLUDE_OPTS)  \\\r\n\t-D__EMCC__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=9 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT -D__NO_WAIT  \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o FULL_emcc_buffered.html\r\n\tmv FULL_emcc_buffered.js $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.wasm $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.html $(BUILD_PATH)\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_emcc_buffered.* /home/fcaruso/build/emsdk\r\n\r\nemcc_exp:\r\n\t$(EM_CC) $(INCLUDE_OPTS)  \\\r\n\t-D__EMCC__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=24 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_SLEEP -DNO_INPUT -D__NO_WAIT \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o FULL_emcc_buffered.html\r\n\tmv FULL_emcc_buffered.js $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.wasm $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.html $(BUILD_PATH)\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_emcc_buffered.* /home/fcaruso/build/emsdk\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.gcc_amiga_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# GCC AMIGA\r\n\r\n##############################################################################################\r\n\r\namiga_targets: \\\r\n\tamiga_buffered\r\n\r\ngcc_amiga_targets: \\\r\n    amiga_targets\r\n\r\n# -------------------------------------------------------------------------------------------\r\n\r\n\r\namiga_core_test:\r\n\t$(AMIGA_CC) -mcrt=nix13 \\\r\n\t$(SOURCE_PATH)/../test/main_use_amiga_core.c\r\n\r\namiga: amiga_buffered\r\n\r\namiga_buffered:\r\n\t$(AMIGA_CC) $(INCLUDE_OPTS) -mcrt=nix13 \\\r\n\t-D__AMIGA__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv a.out $(BUILD_PATH)/X$(GAME_NAME)_amiga_buffered.exe\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.gcc_atari_st_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# GCC ATARI ST\r\n\r\n\r\n##############################################################################################\r\natari_st_targets: \\\r\n\tatari_st_buffered atari_st_ncurses\r\n\r\ngcc_atari_st_targets: \\\r\n    atari_st_targets\r\n    \r\n#############################################################################################\r\n\r\n\r\natari_st_buffered:\r\n\t$(ATARI_ST_CC) $(INCLUDE_OPTS) \\\r\n\t-D__ATARI_ST__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv a.out $(BUILD_PATH)/X$(GAME_NAME)_atari_st_buffered.tos\r\n\r\natari_st: atari_st_ncurses\r\n\r\natari_st_ncurses:\r\n\t$(ATARI_ST_CC) $(INCLUDE_OPTS) -D__NCURSES__ \\\r\n\t-D__ATARI_ST__ \\\r\n\t \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-lncurses\r\n\tmv a.out $(BUILD_PATH)/X$(GAME_NAME)_atari_st_ncurses.tos\r\n\r\n\r\n\r\n\r\natari_st_ncurses_turn_based:\r\n\t$(ATARI_ST_CC) $(INCLUDE_OPTS) -D__NCURSES__ \\\r\n\t-D__ATARI_ST__ \\\r\n\t-DTURN_BASED \\\r\n\t \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-D_XL_NO_SLEEP  \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-lncurses\r\n\tmv a.out $(BUILD_PATH)/X$(GAME_NAME)_atari_st_ncurses_turn_based.tos\r\n    \r\n    \r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.gcc_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# GCC\r\n#\r\n\r\n\r\n\r\ngcc_targets: \\\r\n\tgcc_buffered ncurses_targets  \r\n    \r\n###############################################################################################\r\n\r\n\r\nGCC_386_OPTS ?= -std=gnu99 -O0 -nostdlib -m32 -march=i386 -ffreestanding\r\n\r\ngcc_386: gcc_386_buffered\r\n\r\ngcc_386_buffered:\r\n\t$(NATIVE_CC) $(GCC_386_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gcc_buffered$(COMPILEDEXT)\r\n\r\n\r\nstdio: stdio_buffered\r\n\r\nstdio_buffered:\r\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)\r\n\r\n\r\ngcc: stdio\r\n\r\ngcc_buffered: stdio_buffered\r\n\r\n\r\ngcc_386_no_print:\r\n\t$(NATIVE_CC) $(GCC_386_OPTS) $(INCLUDE_OPTS) \\\r\n\t-I$(SOURCE_PATH) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DNO_CHASE -DNO_INPUT \\\r\n\t-D_XL_NO_COLOR -DNO_WALL -D__NO_GRAPHICS \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_PRINT \\\r\n\t$(TINY_FILES)\t\r\n\t\r\ngcc_no_print:\r\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-I$(SOURCE_PATH) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_PRINT \\\r\n\t$(TINY_FILES)\t\r\n\r\n\r\ngcc_tiny_buffered:\r\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES)\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/TINY_X$(GAME_NAME)_gcc_buffered$(COMPILEDEXT)\r\n\r\n\r\nncurses_turn_based:\r\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) -D__NCURSES__ \\\r\n\t  \\\r\n\t  \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-D__ALT_PRINT \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-lncurses\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_ncurses_turn_based$(COMPILEDEXT)\r\n\r\n\r\nncurses_debug:\r\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) -D__NCURSES__ \\\r\n\t \\\r\n\t-DXSize=$(XSIZE) -DYSize=$(YSIZE) -D_DEBUG_FLAG=$(_DEBUG_FLAG) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NCURSES_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-lncurses\r\nifeq ($(_DEBUG_FLAG),1)\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_ncurses_debug_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\r\nelse\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_ncurses_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)\r\nendif\r\n\r\n\r\nncurses:\r\n\t$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) -D__NCURSES__ \\\r\n\t  \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NCURSES_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-lncurses\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_ncurses$(COMPILEDEXT)\r\n    \r\n    \r\n\r\n##\r\n\r\nncurses_targets: \\\r\n\tncurses ncurses_turn_based\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.gcc_tms9900_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# TMS9000-GCC\r\n#   \r\n\r\n\r\n# Paths to TMS9900 compilation tools \r\n# ( Set in environment to override paths )\r\nTMS9900_DIR?=/opt/gcc4ti/bin\r\nELF2EA5_DIR?=/home/fabri/Retro/GCC4TI/elf2ea5\r\nEA5_SPLIT_DIR?=/home/fabri/Retro/GCC4TI/ea5split\r\nCLASSIC99_DSK1?=/home/fabri/Retro/GCC4TI/DSK1\r\n\r\n\r\n# Full paths to the executables used\r\nGAS=$(TMS9900_DIR)/tms9900-as\r\nLD=$(TMS9900_DIR)/tms9900-ld\r\nCC=$(TMS9900_DIR)/tms9900-gcc\r\nAR=$(TMS9900_DIR)/tms9900-ar\r\nELF2EA5=$(ELF2EA5_DIR)/elf2ea5\r\nEA5_SPLIT=$(EA5_SPLIT_DIR)/ea5split\r\n\r\nLDFLAGS_EA5=\\\r\n  --section-start .text=a000 --section-start .data=2080 -M\r\n\r\n\r\n\r\nC_FLAGS=\\\r\n  -O2 -std=c99 -s -I./ -fno-builtin\r\n\r\n\r\n\r\nTI99_CC ?= tms9900-gcc \r\n\r\n\r\nTI99_TINY_OPTS ?= \\\r\n\t$(C_FLAGS) $(GLOBAL_OPTS) \\\r\n\t-D__TI99__ -nostdlib -DNO_RANDOM_LEVEL \\\r\n\t-DXSize=32   \\\r\n\t-DYSize=24 -DBUGGY_MOD5 \\\r\n\t-D__ALT_SLEEP  \\\r\n\t-DTINY_GAME -DNO_WALL  \\\r\n\t-D__VDP_MODE1_GRAPHICS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=900\r\n\r\n\r\nTI99_OPTS ?= \\\r\n\t$(C_FLAGS) $(GLOBAL_OPTS) \\\r\n\t-D__TI99__ -nostdlib \\\r\n\t-DXSize=32   \\\r\n\t-DYSize=24 -DBUGGY_MOD5 -DBUGGY_VERTICAL_DRAW \\\r\n\t-D__ALT_SLEEP   -DEXTRA_TITLE \\\r\n\t-D__VDP_MODE1_GRAPHICS  \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=1200\r\n\r\n##################################################################################################\r\n\r\n# Paths to TMS9900 compilation tools\r\nGAS=tms9900-as\r\nLD=tms9900-ld\r\nTI99CC=tms9900-gcc\r\nCXX=tms9900-c++\r\nOBJCOPY=tms9900-objcopy\r\n\r\nLIB_TI99_PATH=$(TMS9900-GCC_PATH)/../lib\r\n\r\n# Flags used during linking\r\n# Refer to the linker rules in an external file\r\nLDFLAGS=\\\r\n  --script=$(CFG_PATH)gcc4ti99/linkfile.cfg \r\n\r\n# List of compiled objects used in executable\r\nOBJECT_TINY_LIST= \\\r\n  $(TOOLS_PATH)/ti99/crt0_ea5.o \\\r\n  $(CROSS_LIB_PATH)/display/display_macros.o \\\r\n  $(CROSS_LIB_PATH)/input/input_macros.o \\\r\n  $(CROSS_LIB_PATH)/text/text_macros.o \\\r\n  $(CROSS_LIB_PATH)/rand/rand.o \\\r\n  $(CROSS_LIB_PATH)/sleep/sleep_macros.o \\\r\n  $(SOURCE_PATH)/init_images.o \\\r\n  $(SOURCE_PATH)/move_player.o \\\r\n  $(SOURCE_PATH)/strategy.o \\\r\n  $(CROSS_LIB_PATH)/display/init_graphics/gcc4ti99/gcc4ti99_init_graphics.o \\\r\n  $(SOURCE_PATH)/ghost.o  $(SOURCE_PATH)/level.o $(SOURCE_PATH)/character.o $(SOURCE_PATH)/game_text.o \\\r\n  $(SOURCE_PATH)/main.o\r\n  \r\n\r\nOBJECT_LIST= \\\r\n  $(TOOLS_PATH)/ti99/crt0_ea5.o \\\r\n  $(CROSS_LIB_PATH)/display/display_macros.o \\\r\n  $(CROSS_LIB_PATH)/input/input_macros.o \\\r\n  $(CROSS_LIB_PATH)/text/text_macros.o \\\r\n  $(CROSS_LIB_PATH)/rand/rand.o \\\r\n  $(CROSS_LIB_PATH)/sleep/sleep_macros.o \\\r\n  $(SOURCE_PATH)/init_images.o \\\r\n  $(SOURCE_PATH)/item.o \\\r\n  $(SOURCE_PATH)/move_player.o \\\r\n  $(SOURCE_PATH)/rocket.o $(SOURCE_PATH)/skull.o $(SOURCE_PATH)/end_screen.o \\\r\n  $(SOURCE_PATH)/bullet.o $(SOURCE_PATH)/horizontal_missile.o \\\r\n  $(SOURCE_PATH)/strategy.o \\\r\n  $(CROSS_LIB_PATH)/display/init_graphics/gcc4ti99/gcc4ti99_init_graphics.o \\\r\n  $(CROSS_LIB_PATH)/sound/gcc4ti99/ti99_sounds.o \\\r\n  $(SOURCE_PATH)/ghost.o  $(SOURCE_PATH)/level.o $(SOURCE_PATH)/character.o $(SOURCE_PATH)/game_text.o \\\r\n  $(SOURCE_PATH)/main.o\r\n\r\n\r\nTI99_INCLUDE_OPTS ?= $(INCLUDE_OPTS) -I$(TMS9900-GCC_PATH)/../include\r\n\r\n# Recipes to compile individual files\r\n%.o: %.asm\r\n\t$(GAS) $< -o $@\r\n%.o: %.c\r\n\t$(TI99CC) $(TI99_INCLUDE_OPTS) $(TI99_OPTS) -c $< -o $@\r\n\r\n# \t$(TI99CC) $(TI99_INCLUDE_OPTS) $(TI99_FULL_OPTS) -c $< -o $@\r\n\r\n\r\n# List of all files needed in executable\r\nTINY_PREREQUISITES=\\\r\n  $(OBJECT_LIST)\r\n\r\nPREREQUISITES=\\\r\n  $(OBJECT_LIST)\r\n\r\n\r\n#####################################################################\r\n\r\n\r\nxchase.ea5.elf: $(PREREQUISITES)\r\n\t$(LD) $(OBJECT_LIST) $(LDFLAGS_EA5) -L$(LIB_TI99_PATH) -lti99 -o xchase.ea5.elf > xchase.map\r\n\t# $(LD) $(OBJECT_LIST) $(LDFLAGS) -o $@ -allow-multiple-definition\r\n\r\n\r\n# Recipe to compile the executable\r\nti99_tiny: xchase.ea5.elf $(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) $(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT)\r\n\t$(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) xchase.ea5.elf xchase.ea5.bin\r\n\t$(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT) xchase.ea5.bin\r\n\trm -rf xchase.map\r\n\trm -rf ea5.map\r\n\trm -rf xchase.ea5.elf\r\n\t# mv XCHASE $(BUILD_PATH)/X$(GAME_NAME)_TINY_ti994a\r\n\tmv XCHAS* $(BUILD_PATH)/\r\n\trm -rf xchase.ea5.bin\r\n\r\n\r\nxchase_tiny.ea5.elf: $(TINY_PREREQUISITES)\r\n\t$(LD) $(OBJECT_TINY_LIST) $(LDFLAGS_EA5) -L$(LIB_TI99_PATH) -lti99 -o xchase_tiny.ea5.elf > xchase.map\r\n\t# $(LD) $(OBJECT_LIST) $(LDFLAGS) -o $@ -allow-multiple-definition\r\n\r\n\r\nti99: $(ASSETS_PATH)/8x8_chars.h xchase.ea5.elf $(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) $(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT)\r\n\t$(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) xchase.ea5.elf x$(GAME_NAME)1.ea5.bin\r\n\t$(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT) x$(GAME_NAME)1.ea5.bin\r\n\trm -rf xchase.map\r\n\trm -rf ea5.map\r\n\trm -rf xchase.ea5.elf\r\n\tmv X$(GAME_NAME,lc)* $(BUILD_PATH)/\r\n\trm -rf x$(GAME_NAME)1.ea5.bin\r\n\r\n\r\nti99_targets: \\\r\n\tti99\r\n\r\ngcc_ti99_targets: \\\r\n\tti99_targets\r\n\r\n\t# $(OBJCOPY) -O binary -j .text -j .data -j .ctors ti99_cross_chase.elf ti99_cross_chase.cart \r\n\t# mv ti99_cross_chase.cart $(BUILD_PATH)\r\n\t# mv ti99_cross_chase.elf $(BUILD_PATH)\r\n\r\n\r\n# Recipe to clean all compiled objects\r\n.phony ti99clean:\r\n\trm -f *.o\r\n\trm -f *.elf\r\n\trm -f *.cart\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.gcc_z8k_pcos_targets",
    "content": "\r\n# ------------------------------------------------------------------------------------------\r\n# Z8K-PCOS-GCC\r\n#\r\n\r\n\r\n# Currently to be compiled in Linux (because the source code of the compiler won't easily compile)\r\nolivetti_m20_targets: \\\r\n\tolivetti_m20_buffered\r\n\r\n\r\ngcc_z8k_targets: \\\r\n    olivetti_m20_targets\r\n\r\n\r\n###################################################################################################\r\n\r\n\r\nm20: olivetti_m20\r\n\r\nolivetti_m20: olivetti_m20_buffered\r\n\r\n\r\nm20_buffered: olivetti_m20_buffered\r\n\r\nolivetti_m20_buffered: $(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT)\r\n\t$(Z8K-PCOS-GCC) $(Z8K-PCOS-GCC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-D__OLIVETTI_M20__ \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tcp $(TOOLS_PATH)/olivetti_m20/pcos20h_empty.img FULL_m20_buffered.img\r\n\t$(TOOLS_PATH)/olivetti_m20/m20 X$(GAME_NAME)_m20_buffered.img put aout.cmd\r\n\trm aout.cmd\r\n\tmv FULL_m20_buffered.img $(BUILD_PATH)\r\n\t\r\n\t\r\nolivetti_m20_no_graphics: $(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT)\r\n\t$(Z8K-PCOS-GCC) $(Z8K-PCOS-GCC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gcc_buffered$(COMPILEDEXT)\t\t\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.lcc1802_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# LCC1802\r\n#    -target=xr18CX\r\n# https://sites.google.com/site/lcc1802/downloads/Quarrantine.zip?attredirects=0&d=1\r\n\r\n\r\n#/cygdrive/c/lcc42/bat/caCX.bat\r\n#/cygdrive/c/lcc42/bin/lcc.exe\r\nLCC1802_OPTS ?= -target=xr18CX \"-Wf-volatile\" -O \"-Wp-D nofloats\" \"-Wa-D LCCNOLONG\"\r\nBASIC_OPTS ?= $(LCC1802_OPTS) \"-Wa-D LCCCX=1\"\r\nCOMX_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x4401\"\r\nPECOM_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x201\" \r\nTMC600_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x6300\" \"-Wf-mulcall\"\r\nCIDELSA_OPTS ?= $(LCC1802_OPTS)  \"-Wa-D CODELOC=0\"  \"-Wa-D NOFILLBSS=1\" \"-Wf-mulcall\"\r\nDRACO_32K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x8000\" \"-Wa-D STACKLOC=0x83ff\"\r\nDRACO_16K_OPTS ?= $(CIDELSA_OPTS)  \"-Wa-D DATALOC=0x4000\" \"-Wa-D STACKLOC=0x43ff\"\r\nALTAIR_24K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x6000\" \"-Wa-D STACKLOC=0x60ff\"\r\nALTAIR_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x3000\" \"-Wa-D STACKLOC=0x30ff\"\r\nDESTROYER_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x3000\" \"-Wa-D STACKLOC=0x30ff\"\r\nDESTROYER_8K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x2000\" \"-Wa-D STACKLOC=0x20ff\"\r\n\r\nMICROBOARD_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x8000\" \"-Wa-D STACKLOC=0x9fff\"\r\nMICROBOARD_PAL_2_OPTS ?= $(MICROBOARD_OPTS) \"-DPAL=2\"\r\n\r\n################################################################################\r\n\r\n_lcc1802_6x9_targets: \\\r\n    _comx \\\r\n    _pecom \\\r\n    _micro\r\n\r\nlcc1802_6x9_targets: \\\r\n    _lcc1802_6x9_targets \\\r\n    clean_combo_files\r\n\r\n_lcc1802_ascii_targets: \\\r\n\t_tmc600 \\\r\n    _cidelsa\r\n\r\nlcc1802_ascii_targets: \\\r\n    _lcc1802_ascii_targets \\\r\n    clean_combo_files\r\n\r\nlcc1802_targets:  \\\r\n    _lcc1802_ascii_targets \\\r\n    _lcc1802_6x9_targets \\\r\n    clean_combo_files\r\n\r\n\r\n\r\n\r\n################################################################################\r\n\r\n\r\n\r\nCOMX_REDUCED_EXTRA_FILES ?= \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/comx_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c \r\n\r\nCOMX_EXTRA_FILES ?= \\\r\n\t$(COMX_REDUCED_EXTRA_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c\r\n\r\nCOMX_EXTRA_FILES_WTIH_END_SCREEN ?= \\\r\n\t$(COMX_EXTRA_FILES) \\\r\n\t$(SOURCE_PATH)/end_screen.c \r\n#\r\n\r\ntiny_combo.c:\r\n\tcat \\\r\n\t$(TINY_FILES) \\\r\n\t> $(SOURCE_PATH)/../tiny_combo.c\r\n\r\n\r\nlight_combo.c: tiny_combo.c\r\n\tcat \\\r\n\t$(SOURCE_PATH)/../tiny_combo.c \\\r\n\t$(LIGHT_ONLY_FILES) \\\r\n\t> $(SOURCE_PATH)/../light_combo.c\r\n\trm $(SOURCE_PATH)/../tiny_combo.c\r\n\r\n\r\nfull_combo.c: light_combo.c\r\n\tcat \\\r\n\t$(SOURCE_PATH)/../light_combo.c \\\r\n\t$(FULL_ONLY_FILES) \\\r\n\t> $(SOURCE_PATH)/../full_combo.c\r\n\trm $(SOURCE_PATH)/../light_combo.c\r\n\r\n\r\ntiny_combo_rand.c: tiny_combo.c\r\n\tcat \\\r\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\r\n\t$(SOURCE_PATH)/../tiny_combo.c \\\r\n\t> $(SOURCE_PATH)/../tiny_combo_rand.c\r\n\trm  $(SOURCE_PATH)/../tiny_combo.c\r\n    \r\nlight_combo_rand.c: light_combo.c\r\n\tcat \\\r\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\r\n\t$(SOURCE_PATH)/../light_combo.c \\\r\n\t> $(SOURCE_PATH)/../light_combo_rand.c\r\n\trm $(SOURCE_PATH)/../light_combo.c\r\n    \r\n    \r\nfull_combo_rand.c: full_combo.c\r\n\tcat \\\r\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\r\n\t$(SOURCE_PATH)/../full_combo.c \\\r\n\t> $(SOURCE_PATH)/../full_combo_rand.c\r\n\trm $(SOURCE_PATH)/../full_combo.c\r\n\r\n#\r\n\r\n\r\nreduced_tiny_lcc1802_combo.c: tiny_combo_rand.c\r\n\tcat \\\r\n\t$(COMX_REDUCED_EXTRA_FILES) \\\r\n\t$(SOURCE_PATH)/../tiny_combo_rand.c > $(SOURCE_PATH)/../reduced_tiny_lcc1802_combo.c\r\n\t# rm $(SOURCE_PATH)/../tiny_combo_rand.c\r\n\r\ntiny_lcc1802_combo.c: tiny_combo_rand.c\r\n\tcat \\\r\n\t$(COMX_EXTRA_FILES) \\\r\n\t$(SOURCE_PATH)/../tiny_combo_rand.c > $(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\t# rm $(SOURCE_PATH)/../tiny_combo_rand.c\r\n\r\nlight_lcc1802_combo.c: light_combo_rand.c\r\n\tcat \\\r\n\t$(COMX_EXTRA_FILES) \\\r\n\t$(SOURCE_PATH)/../light_combo_rand.c > $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# rm $(SOURCE_PATH)/../light_combo_rand.c\r\n\r\nreduced_full_lcc1802_combo_no_sounds.c: full_combo_rand.c\r\n\tcat \\\r\n\t$(COMX_REDUCED_EXTRA_FILES) \\\r\n\t$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_combo_no_sounds.c\r\n\t# rm $(SOURCE_PATH)/../full_combo_rand.c\r\n\r\nreduced_full_lcc1802_combo.c: full_combo_rand.c\r\n\tcat \\\r\n\t$(COMX_EXTRA_FILES) \\\r\n\t$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\r\n\t# rm $(SOURCE_PATH)/../full_combo_rand.c\r\n\r\nfull_lcc1802_combo.c: full_combo_rand.c\r\n\tcat \\\r\n\t$(COMX_EXTRA_FILES_WTIH_END_SCREEN) \\\r\n\t$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm $(SOURCE_PATH)/../full_combo_rand.c\r\n\r\n\r\nclean_combo_files:\r\n\trm -rf $(SOURCE_PATH)/../full_combo_rand.c\r\n\trm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\trm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\r\n\trm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\trm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\r\nLCC1802_BASIC_C_OPTS ?= \\\r\n\t-D__LCC1802__ \\\r\n\t \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DLESS_TEXT \\\r\n\t-D__ALT_RAND \\\r\n\t-DROCKETS_NUMBER=2 \\\r\n\t-D__ALT_PRINT \\\r\n\t\r\n\r\n\r\nLCC1802_C_OPTS ?= \\\r\n\t$(LCC1802_BASIC_C_OPTS) \\\r\n\t \\\r\n\t-D__ALT_SLEEP \\\r\n\r\n\r\nREDUCED_LCC1802_C_OPTS ?= \\\r\n\t$(LCC1802_BASIC_C_OPTS) \\\r\n\t-D_XL__XL_NO_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL\r\n\r\n\r\n###############################################################################\r\n# COMX\r\n\r\n_tiny_comx: tiny_lcc1802_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) \\\r\n\t-D__COMX__   \\\r\n\t-DTINY_GAME  -D__LCC1802_GRAPHICS -DNO_WALL \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_comx.hex\r\n\r\ntiny_comx: \\\r\n    _tiny_comx \\\r\n    clean_combo_files\r\n\r\n\r\n_light_comx: light_lcc1802_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS)  \\\r\n\t-D__COMX__    \\\r\n\t-DLIGHT_GAME   -D__LCC1802_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../a.hex $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_comx.hex\r\n\r\nlight_comx: \\\r\n    _light_comx \\\r\n    clean_combo_files\r\n\r\n\r\n_full_comx: _comx\r\n\r\n_comx: full_lcc1802_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS)  \\\r\n\t-D__COMX__  -D__LCC1802_GRAPHICS -DEXTRA_TITLE \\\r\n\t  \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t$(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_comx.hex\r\n\r\ncomx: \\\r\n    _comx \\\r\n    clean_combo_files\r\n\r\n\r\n_comx_int: full_lcc1802_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS)  \\\r\n\t-D__COMX__  -D__LCC1802_GRAPHICS -DEXTRA_TITLE -DVIS_INT \\\r\n\t  \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t$(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\ncomx_int: \\\r\n    _comx_int \\\r\n    clean_combo_files\r\n\r\n###############################################################################\r\n# PECOM\r\n\r\n_tiny_pecom: tiny_lcc1802_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PECOM_OPTS) \\\r\n\t-D__PECOM__   \\\r\n\t-DTINY_GAME  -D__LCC1802_GRAPHICS -DNO_WALL \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_pecom.hex\r\n\r\ntiny_pecom: \\\r\n    _tiny_comx \\\r\n    clean_combo_files\r\n\r\n\r\n_light_pecom: light_lcc1802_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PECOM_OPTS)  \\\r\n\t-D__PECOM__   -D__LCC1802_GRAPHICS \\\r\n\t-DLIGHT_GAME  \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pecom.hex\r\n\r\nlight_pecom: \\\r\n    _light_pecom \\\r\n    clean_combo_files\r\n\r\n_full_pecom: _pecom\r\n\r\n_pecom: full_lcc1802_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PECOM_OPTS)  \\\r\n\t-D__PECOM__  -D__LCC1802_GRAPHICS -DEXTRA_TITLE \\\r\n\t  \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t$(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_pecom.hex\r\n\r\npecom: \\\r\n    _pecom \\\r\n    clean_combo_files\r\n\r\n###############################################################################\r\n# TMC600\r\n\r\n_tmc600_8k: reduced_tiny_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(TMC600_OPTS) \\\r\n\t-D__TMC600__ \\\r\n\t-DTINY_GAME -DSIMPLE_STRATEGY  -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-DNO_STATS -D_XL_NO_COLOR -DNO_INITIAL_SCREEN -DNO_WALL  \\\r\n\t \\\r\n\t$(REDUCED_LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../reduced_tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_tmc600_8k.hex\r\n\r\n\r\n_tiny_tmc600: tiny_lcc1802_combo.c \r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(TMC600_OPTS) \\\r\n\t-D__TMC600__   -D__MEMORY_MAPPED_GRAPHICS -DNO_WALL \\\r\n\t-DTINY_GAME \\\r\n\t \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_tmc600.hex\r\n\r\ntiny_tmc600: \\\r\n    _tiny_tmc600 \\\r\n    clean_combo_files\r\n\r\n\r\n_light_tmc600: _tmc600_16k\r\n\r\n_tmc600_16k: light_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(TMC600_OPTS)  \\\r\n\t-D__TMC600__   -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-DLIGHT_GAME \\\r\n\t \\\r\n\t-D_XL_NO_COLOR \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_tmc600_16k.hex\r\n\r\nlight_tmc600: \\\r\n    _light_tmc600 \\\r\n    clean_combo_files\r\n\r\n_full_tmc600: _tmc600_37k\r\n_tmc600: _tmc600_37k\r\n\r\n_tmc600_37k: full_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(TMC600_OPTS)  \\\r\n\t-D__TMC600__   -D__MEMORY_MAPPED_GRAPHICS -DEXTRA_TITLE \\\r\n\t \\\r\n\t \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t  \\\r\n\t$(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_tmc600_37k.hex\r\n\r\ntmc600_37k: \\\r\n    _tmc600_37k \\\r\n    clean_combo_files\r\n\r\ntmc600: \\\r\n    _tmc600 \\\r\n    clean_combo_files\r\n\r\n_tmc600_no_end: _tmc600_24k\r\n\r\ntmc600_no_end: \\\r\n    _tmc600_no_end \\\r\n    clean_combo_files\r\n\r\n# -DNO_PRINT  \r\n_tmc600_24k: reduced_full_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(TMC600_OPTS)  \\\r\n\t-D__TMC600__   -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t \\\r\n\t-DNO_BLINKING \\\r\n\t -DNO_HINTS \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8  \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_tmc600_24k.hex\r\n\r\n\r\n###############################################################################\r\n# CIDELSA DRACO\r\n\r\n_tiny_cidelsa_draco: tiny_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DRACO_16K_OPTS)  \\\r\n\t-D__CIDELSA__ -D__DRACO__  -D__MEMORY_MAPPED_GRAPHICS -DNO_WALL \\\r\n\t-DTINY_GAME \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_cidelsa_draco_16K.hex\r\n\r\ntiny_cidelsa_draco: \\\r\n    _tiny_cidelsa_draco \\\r\n    clean_combo_files\r\n\r\n\r\n_cidelsa_draco_16k: _light_cidelsa_draco\r\n\r\n_light_cidelsa_draco: light_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DRACO_16K_OPTS)  \\\r\n\t-D__CIDELSA__ -D__DRACO__  -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_cidelsa_draco_16K.hex\r\n\r\nlight_cidelsa_draco: \\\r\n    _light_cidelsa_draco \\\r\n    clean_combo_files\r\n\r\n_cidelsa: _cidelsa_draco\r\n\r\n_cidelsa_draco_32k: _cidelsa_draco\r\n\r\n# \r\n_cidelsa_draco: full_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DRACO_32K_OPTS)  \\\r\n\t-D__CIDELSA__ -D__DRACO__  -D__MEMORY_MAPPED_GRAPHICS -DEXTRA_TITLE \\\r\n\t  \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_cidelsa_draco_32K.hex\r\n\r\ncidelsa_draco: \\\r\n    _cidelsa_draco \\\r\n    clean_combo_files\r\n    \r\ncidelsa: \\\r\n    _cidelsa \\\r\n    clean_combo_files\r\n\r\n###############################################################################\r\n# CIDELSA ALTAIR\r\n\r\n_cidelsa_altair_12k: _tiny_cidelsa_altair\r\n\r\n_tiny_cidelsa_altair: tiny_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(ALTAIR_12K_OPTS)  \\\r\n\t-D__CIDELSA__ -D__ALTAIR__  -D__MEMORY_MAPPED_GRAPHICS -DNO_WALL \\\r\n\t-DTINY_GAME \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_cidelsa_altair_12K.hex\r\n\r\ncidelsa_altair_12k: \\\r\n    _cidelsa_altair_12k \\\r\n    clean_combo_files\r\n\r\n\r\n_cidelsa_altair: _cidelsa_altair_24k\r\n\r\n_cidelsa_altair_24k: _light_cidelsa_altair\r\n\r\n_light_cidelsa_altair: light_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(ALTAIR_24K_OPTS)  \\\r\n\t-D__CIDELSA__ -D__ALTAIR__  -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_cidelsa_altair_24K.hex\r\n\r\ncidelsa_altair_24k: \\\r\n    _cidelsa_altair_24k \\\r\n    clean_combo_files\r\n\r\n# full_altair: full_lcc1802_combo.c\r\n\t# $(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(ALTAIR_24K_OPTS)  \\\r\n\t# -D__CIDELSA__ -D__DRACO__  \\\r\n\t#  \\\r\n\t# -D_XL_NO_COLOR \\\r\n\t# -DNO_BLINKING \\\r\n\t#  \\\r\n\t# $(LCC1802_C_OPTS) \\\r\n\t# -DGHOSTS_NUMBER=8 \\\r\n\t# $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# mv $(SOURCE_PATH)/../a.hex $(BUILD_PATH)/X$(GAME_NAME)_altair.hex\r\n\r\n\r\n###############################################################################\r\n# CIDELSA DESTTOYER\r\n\r\n_cidelsa_destroyer: _cidelsa_destroyer_12k\r\n\r\ncidelsa_destroyer: \\\r\n    _cidelsa_destroyer \\\r\n    clean_combo_files\r\n\r\n_cidelsa_destroyer_12k: _tiny_cidelsa_destroyer\r\n\r\n_tiny_cidelsa_destroyer: tiny_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DESTROYER_12K_OPTS)  \\\r\n\t-D__CIDELSA__ -D__DESTROYER__  -D__MEMORY_MAPPED_GRAPHICS -DNO_WALL \\\r\n\t-DTINY_GAME \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t$(LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_cidelsa_destroyer_12K.hex\r\n\r\ncidelsa_destroyer_12k: \\\r\n    _cidelsa_destroyer_12k \\\r\n    clean_combo_files\r\n\r\n\r\n_reduced_tiny_cidelsa_destroyer: reduced_tiny_lcc1802_combo.c\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DESTROYER_8K_OPTS)  \\\r\n\t-D__CIDELSA__ -D__DESTROYER__  -D__MEMORY_MAPPED_GRAPHICS -DNO_WALL \\\r\n\t-DTINY_GAME -DSIMPLE_STRATEGY \\\r\n\t-DNO_STATS -D_XL_NO_COLOR -DNO_INITIAL_SCREEN  \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t$(REDUCED_LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t$(SOURCE_PATH)/../reduced_tiny_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_tiny_lcc1802_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_TINY_cidelsa_destroyer_8K.hex\r\n\r\n_cidelsa_destroyer_8k: _reduced_tiny_cidelsa_destroyer\r\n\r\ncidelsa_destroyer_8k: \\\r\n    _cidelsa_destroyer_8k \\\r\n    clean_combo_files\r\n\r\n# full_destroyer: full_lcc1802_combo.c\r\n\t# $(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DESTROYER_12K_OPTS)  \\\r\n\t# -D__CIDELSA__ -D__DRACO__  \\\r\n\t#  \\\r\n\t# -D_XL_NO_COLOR \\\r\n\t# -DNO_BLINKING \\\r\n\t#  \\\r\n\t# $(LCC1802_C_OPTS) \\\r\n\t# -DGHOSTS_NUMBER=8 \\\r\n\t# $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# mv $(SOURCE_PATH)/../a.hex $(BUILD_PATH)/X$(GAME_NAME)_destroyer.hex\r\n\r\n# light_destroyer: light_lcc1802_combo.c\r\n\t# $(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DESTROYER_12K_OPTS)  \\\r\n\t# -D__CIDELSA__ -D__DRACO__  \\\r\n\t# -D_XL_NO_COLOR \\\r\n\t# -DNO_BLINKING \\\r\n\t#  \\\r\n\t# $(LCC1802_C_OPTS) \\\r\n\t# -DGHOSTS_NUMBER=8 \\\r\n\t# $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_lcc1802_combo.c\r\n\t# mv $(SOURCE_PATH)/../a.hex $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_destroyer.hex\r\n\r\n\r\n###############################################################################\r\n\r\n\r\n_microboard: _micro\r\n\r\n_micro: _micro_pal2\r\n\r\n_full_micro_pal2: _micro_pal2\r\n\r\n_micro_pal2: reduced_full_lcc1802_combo_no_sounds.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_PAL_2_OPTS) -DEXTRA_TITLE \\\r\n\t-D__LCC1802_GRAPHICS \\\r\n\t-D__MICRO__ -D_XL_NUMBER_OF_TILES=19 \\\r\n\t  \\\r\n\t-D_XL_NO_COLOR  \\\r\n\t-DNO_BLINKING \\\r\n\t \\\r\n\t  \\\r\n\t$(REDUCED_LCC1802_C_OPTS) \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_combo_no_sounds.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_combo_no_sounds.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_microboard_pal2.hex\r\n\r\n\r\nmicro_pal2: \\\r\n    _micro_pal2 \\\r\n    clean_combo_files\r\n\r\nmicro: micro_pal2\r\n\r\n###############################################################################\r\n\r\ncomx_targets: comx\r\n\r\npecom_targets: pecom\r\n\r\ntmc600_targets:\r\n\t$(MAKE) tmc600_8k\r\n\t$(MAKE) tmc600_16k\r\n\t$(MAKE) tmc600_24k\r\n\t$(MAKE) tmc600_37k\r\n\r\ncidelsa_targets:\r\n\t$(MAKE) cidelsa_draco_16k\r\n\t$(MAKE) cidelsa_draco_32k\r\n\t$(MAKE) cidelsa_altair_12k\r\n\t$(MAKE) cidelsa_altair_24k\r\n\t$(MAKE) cidelsa_destroyer_8k\r\n\t$(MAKE) cidelsa_destroyer_12k\r\n\r\nmicro_targets:\r\n\t$(MAKE) micro_pal2\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.sdcc_targets",
    "content": "# JUST A STUB\r\n\r\n# ------------------------------------------------------------------------------------------\r\n# SDCC\r\n#\r\n\r\nMACROS___NO_GRAPHICS ?= \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_CHASE \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN\r\n\r\nsdcc_display_macros: \r\n\tsdcc -c $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MACROS___NO_GRAPHICS) $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.vbcc_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# VBCC\r\n#\r\n\r\n\r\n\r\nvbcc_targets: \\\r\n\tbbc_buffered\r\n    \r\n###############################################################################################\r\n\r\nbbc: bbc_buffered\r\n\r\n\r\nbbc_test: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT)\r\n\t$(VBCC_COMPILER) +bbc $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND -D__BBC__ -DVBCC \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img xchase\r\n\trm -rf xchase\r\n\trm -rf xchase.inf\r\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\r\n\r\n\r\nbbc_buffered: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT)\r\n\t$(VBCC_COMPILER) +bbc $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND -D__BBC__ -DVBCC \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img xchase\r\n\trm -rf xchase\r\n\trm -rf xchase.inf\r\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\r\n\r\n\r\nbbcmaster: bbcmaster_buffered\r\n\r\nbbcmaster_buffered: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT)\r\n\t$(VBCC_COMPILER) +bbcmaster $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND -D__BBCMASTER__ -DVBCC \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img xchase\r\n\trm -rf xchase \r\n\trm -rf xchase.inf \r\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\r\n\r\n\r\nbbc_buffered_no_print:\r\n\t$(VBCC_COMPILER) +bbc $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-I$(SOURCE_PATH) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_PRINT \\\r\n\t$(TINY_FILES)\t\r\n\r\n\r\n\r\n# -----------------------------------------------------------------------\r\n\r\nm65: m65_buffered\r\n\r\nm65_buffered:\r\n\t$(VBCC_COMPILER) +m65 $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND  -DVBCC -D__MEGA65__ \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\tmv xchase $(BUILD_PATH)/\r\n\t# mv xchase.inf $(BUILD_PATH)/\r\n\t# mv xchase $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered\r\n\t# mv xchase.inf $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered.inf\r\n\r\n\r\n# -----------------------------------------------------------------------\r\n\r\natari_jaguar: atari_jaguar_buffered\r\n\r\natari_jaguar_buffered:\r\n\t$(VBCC_COMPILER) +jaguar $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND -D__ATARI_JAGUAR__ -DVBCC  \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\tmv xchase $(BUILD_PATH)/\r\n\t# mv xchase.inf $(BUILD_PATH)/\r\n\t# mv xchase $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered\r\n\t# mv xchase.inf $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered.inf\r\n\r\n# -----------------------------------------------------------------------\r\n\r\namiga_kick13_buffered:\r\n\t$(VBCC_COMPILER) +kick13 $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND -D__AMIGA_KICK13__ -DVBCC  \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\tmv xchase $(BUILD_PATH)/\r\n\t# mv xchase.inf $(BUILD_PATH)/\r\n\t# mv xchase $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered\r\n\t# mv xchase.inf $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered.inf\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.xtc68_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# XTC68\r\n#\r\n\r\n# xtc86 targets\r\nsinclair_ql_targets: \\\r\n\tsinclair_ql_tiny_buffered\r\n\r\n\r\nXTC68_OPTS = -D__XTC68__ -I$(SOURCE_PATH) \\\r\n\r\n\r\nxtc68_targets: sinclair_ql_targets\r\n\r\n\r\n#############################################################################################\r\n\r\nXTC68_ALL_OPTS ?= \\\r\n\t$(XTC68_OPTS) $(INCLUDE_OPTS)\\\r\n\t-I$(SOURCE_PATH) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_PRINT \t\r\n\r\n\r\nsinclair_ql: sinclair_ql_tiny_buffered\r\n\r\n\r\nsinclair_ql_tiny_buffered:\r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/level.c -o level.o\r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/init_images.c -o init_images.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(CROSS_LIB_PATH)/display/display_macros.c -o display_macros.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(CROSS_LIB_PATH)/input/input_macros.c -o input_macros.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(CROSS_LIB_PATH)/text/text_macros.c -o text_macros.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/move_player.c -o move_player.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/ghost.c  -o ghost.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/character.c -o character.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/game_text.c -o game_test.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/strategy.c -o strategy.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/main.c -o main.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) /usr/local/qdos/lib/crt.o \\\r\n\tlevel.o init_images.o display_macros.o input_macros.o text_macros.o move_player.o ghost.o character.o game_test.o strategy.o main.o \r\n\trm level.o init_images.o display_macros.o input_macros.o text_macros.o move_player.o ghost.o character.o game_test.o strategy.o main.o\r\n\tmv a_out $(BUILD_PATH)/X$(GAME_NAME)_TINY_SinclairQL_buffered.out\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/Makefile.z88dk_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# Z88DK\r\n#\r\n\r\n\r\n\r\n################################################################################\r\n\r\n# missing: abc800, xo7, c7420, rex\r\n# missing 8080: m100\r\n\r\n\r\n\r\n\r\n\r\n\r\n##################################################################\r\n\r\ninclude games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_a-k\r\n\r\ninclude games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_l-p\r\n\r\ninclude games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_q-z\r\n\r\ninclude games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_zsdcc\r\n\r\n# ----------------------------------------------------------------\r\n\r\nz88dk_targets_sccz80: \\\r\n\tz88dk_targets_a-k \\\r\n\tz88dk_targets_l-p \\\r\n\tz88dk_targets_q-z\r\n\r\nz88dk_targets_sccz80_more: \\\r\n\tz88dk_targets_a-k_more \\\r\n\tz88dk_targets_l-p_more \\\r\n\tz88dk_targets_q-z_more\r\n\r\nifeq ($(DO_WIN),1)\r\nz88dk_targets: \\\r\n\tz88dk_targets_sccz80 \\\r\n\tz88dk_targets_zsdcc \r\n\r\nz88dk_targets_more: \\\r\n\tz88dk_targets_sccz80_more \\\r\n\tz88dk_targets_zsdcc_more    \r\n\r\nelse\r\n\r\nz88dk_targets: \\\r\n\tz88dk_targets_sccz80\r\n    \r\nz88dk_targets_more: \\\r\n\tz88dk_targets_sccz80_more\r\nendif\r\n\r\n\r\n\r\n# z88dk_targets_sccz80:\r\n\t# make $(Z88DK_MAKE_OPTS) z88dk_targets_a-k \r\n\t# make $(Z88DK_MAKE_OPTS) z88dk_targets_l-p \r\n\t# make $(Z88DK_MAKE_OPTS) z88dk_targets_q-z\r\n\r\n# z88dk_targets:\r\n\t# make $(Z88DK_MAKE_OPTS) z88dk_targets_sccz80\r\n\t# make $(Z88DK_MAKE_OPTS) z88dk_targets_zsdcc \r\n    \r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_a-k",
    "content": "# ------------------------------------------------------------------------------------------\r\n# Z88DK A-K\r\n#\r\n\r\nifeq ($(DO_WIN),1)\r\n\r\nz88dk_targets_a-k: \\\r\n\tace_targets \\\r\n\tc128_z80_targets \\\r\n\tcoleco_targets \\\r\n\tcoleco_adam_targets \\\r\n\tcpc_targets \\\r\n\tcpm_targets \\\r\n\tgb_targets\r\n\r\nz88dk_targets_a-k_more: \\\r\n\tabc80_targets \\\r\n\tabc800_targets \\\r\n\tace_targets \\\r\n\talphatro_targets \\\r\n\taltair8800_targets \\\r\n\tattache_targets \\\r\n\taussie_targets \\\r\n\tbic_targets \\\r\n\tc128_z80_targets \\\r\n\tcamputers_lynx_targets \\\r\n\tcoleco_targets \\\r\n\tcoleco_adam_targets \\\r\n\tcpc_targets \\\r\n\tcpm_targets \\\r\n\tdai_targets \\\r\n\tdmv_targets \\\r\n \teg2k_targets \\\r\n\teinstein_targets \\\r\n\tenterprise_targets \\\r\n\texcalibur64_targets \\\r\n\tfp1100_targets \\\r\n\tg800_targets \\\r\n\tgb_targets \\\r\n\themc_targets \\\r\n\thgmc_targets \\\r\n\thomelab_targets \\\r\n\thomelab2_targets \\\r\n\tkaypro_targets \\\r\n\tkc_targets \\\r\n\tkramermc_targets\r\n\r\nelse\r\n\r\nz88dk_targets_a-k: \\\r\n\tace_targets \\\r\n\tcoleco_targets \\\r\n\tcoleco_adam_targets \\\r\n\tcpc_targets \\\r\n\tcpm_targets \\\r\n\tgb_targets\r\n\r\nz88dk_targets_a-k_more: \\\r\n\tabc80_targets \\\r\n\tabc800_targets \\\r\n\tace_targets \\\r\n\talphatro_targets \\\r\n\taltair8800_targets \\\r\n\tattache_targets \\\r\n\taussie_targets \\\r\n\tbic_targets \\\r\n\tcamputers_lynx_targets \\\r\n\tcoleco_targets \\\r\n\tcoleco_adam_targets \\\r\n\tcpc_targets \\\r\n\tcpm_targets \\\r\n\tdai_targets \\\r\n\tdmv_targets \\\r\n \teg2k_targets \\\r\n\teinstein_targets \\\r\n\tenterprise_targets \\\r\n\texcalibur64_targets \\\r\n\tfp1100_targets \\\r\n\tg800_targets \\\r\n\tgb_targets \\\r\n\themc_targets \\\r\n\thgmc_targets \\\r\n\thomelab_targets \\\r\n\thomelab2_targets \\\r\n\tkaypro_targets \\\r\n\tkc_targets \\\r\n\tkramermc_targets\r\n\r\nendif\r\n\r\n# z88dk_targets_a-k:\r\n\t# $(MAKE) $(Z88DK_MAKE_OPTS) z88dk_targets_a-k_sequential -f games/$(GAME_NAME)/makefiles.chase/makefiles_z88dk/Makefile_z88dk_a-k\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\nabc80_targets: \\\r\n\tabc80_light abc80\r\n\r\nabc800_targets: \\\r\n\tabc800\r\n\r\nace_targets: \\\r\n\tace_exp_16k\r\n\r\nalphatro_targets: \\\r\n\talphatro\r\n\r\naltair8800_targets: \\\r\n\taltair8800\r\n\r\nattache_targets: \\\r\n\tattache attache_chars\r\n\r\naussie_targets: \\\r\n\taussie\r\n\r\nbic_targets: \\\r\n\tbic\r\n\r\nc128_z80_targets: \\\r\n\tc128_z80_40col c128_z80_80col\r\n\r\ncamputers_lynx_targets: \\\r\n\tcamputers_lynx\r\n\r\ncoleco_targets: \\\r\n\tcoleco bit90\r\n\r\ncoleco_adam_targets: \\\r\n\tcoleco_adam\r\n\r\ncpc_targets: \\\r\n\tcpc\r\n\r\ncpm_z80_targets: \\\r\n\tcpm_z80\r\n\r\ncpm_8080_targets: \\\r\n\tcpm_8080\r\n\r\ndai_targets: \\\r\n\tdai\r\n\r\ndmv_targets: \\\r\n\tdmv\r\n\r\neg2k_targets: \\\r\n\teg2k\r\n\r\neinstein_targets: \\\r\n\teinstein\r\n\r\nenterprise_targets: \\\r\n\tenterprise_buffered\r\n\r\nexcalibur64_targets: \\\r\n\texcalibur64\r\n\r\nfp1100_targets: \\\r\n\tfp1100\r\n\r\ng800_targets: \\\r\n\tg800_turn_based\r\n\r\ngb_targets: \\\r\n\tgb\r\n\r\nhemc_targets: \\\r\n\themc\r\n\r\nhgmc_targets: \\\r\n\thgmc\r\n\r\nhomelab_targets: \\\r\n\thomelab\r\n\r\nhomelab2_targets: \\\r\n\thomelab2\r\n\r\nkaypro_targets: \\\r\n\tkaypro kaypro83\r\n\r\nkc_targets: \\\r\n\tkc_tiny kc_light kc\r\n\r\nkramermc_targets: \\\r\n\tkramermc\r\n\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\n#############################\r\n# ABC80\r\n\r\nabc80:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc80 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-D__ABC80__ -clib=ansi -vn  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-DNO_BLINKING \\\r\n\t-DNO_HINTS \\\r\n\t-D__NO_WAIT \\\r\n\t-DNO_BORDER \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DFLAT_ENEMIES \\\r\n\t-lndos -create-app -o abc80.bin \\\r\n\t$(FULL_FILES)\r\n\t$(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) abc80.bin $(BUILD_PATH)/xchase.bac 49200\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2abc --bac80 -o $(BUILD_PATH)/xchase.bac -s 49200 abc80.bin\t\r\n\t$(TOOLS_PATH)/z88dk/abc80/dosgen$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_abc80.dsk \r\n\t$(TOOLS_PATH)/z88dk/abc80/doscopy$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_abc80.dsk -b $(BUILD_PATH)/xchase.bac\r\n\trm abc80.bin \r\n\tmv $(BUILD_PATH)/xchase.bac $(BUILD_PATH)/X$(GAME_NAME)_abc80.bac\r\n\tmv abc80.ihx $(BUILD_PATH)/X$(GAME_NAME)_abc80.ihx \r\n\r\n\r\nabc80_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc80 $(SCCZ80_OPTS) -lm \\\r\n\t-subtype=hex \\\r\n\t-zorg=49200 $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D__ABC80__ -clib=ansi -vn  -lndos -create-app -o abc80light.bin  \\\r\n\t$(LIGHT_FILES)\r\n\t# mv abc80.bin $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_abc80.bin\r\n\tmv abc80light.ihx $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_abc80.ihx \r\n\t$(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) abc80.bin $(BUILD_PATH)/xchase.bac 49200\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2abc --bac80 -o $(BUILD_PATH)/xchase.bac -s 49200 abc80light.bin\r\n\t$(TOOLS_PATH)/z88dk/abc80/dosgen$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_abc80.dsk \r\n\t$(TOOLS_PATH)/z88dk/abc80/doscopy$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_abc80.dsk -b $(BUILD_PATH)/xchase.bac\r\n\trm abc80light.bin \r\n\tmv $(BUILD_PATH)/xchase.bac $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_abc80.bac\r\n\t# mv abc80light.bin $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_abc80.bin\r\n\r\n\r\n#############################\r\n# ABC800\r\n\r\nabc800: abc800_buffered\r\n\r\nabc800_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-lndos \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR -DNO_BLINKING -DXSize=39 -DYSize=22 \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -oa800.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) a800.bin $(BUILD_PATH)/xc800.bac 49200\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2abc --bac800 -o $(BUILD_PATH)/xchase.bac abc80.bin\t\r\n\t$(TOOLS_PATH)/z88dk/abc80/dosgen$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk \r\n\t$(TOOLS_PATH)/z88dk/abc80/doscopy$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk -b $(BUILD_PATH)/xc800.bac\r\n\trm a800.bin \r\n\trm -rf $(BUILD_PATH)/xc800.bac\r\n\tmv a800.ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx \t\r\n\r\n\r\n#############################\r\n# ACE\r\n\r\nace: ace_exp_16k\r\n\r\nace_exp_16k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ace $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ACE__   \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-clib=default \\\r\n\t \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o ace -Cz--audio -create-app\t\r\n\tcp ace.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tcp ace.tap $(BUILD_PATH)/X$(GAME_NAME)_$@.tap\r\n\trm ace.wav\r\n\trm ace.tap\r\n\trm ace\r\n\r\n\r\n#############################\r\n# ALPHATRO\r\n\r\n# -O3 necessary to build the rom \r\nalphatro:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +alphatro $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ALPHATRO__ \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n\r\n#############################\r\n# ATTACHE\r\nattache_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=attache \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__ADM3A \\\r\n\t-D__CPM_80X24__ \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\nattache: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=attache \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-D__ATTACHE__ \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\t\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# AUSSIE\r\n\r\naussie:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -laussie  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__AUSSIE__ \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__ADM3A \\\r\n\t-D__CPM_80X24__ \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# ALTAIR 8800\r\n\r\naltair8800: altair8800_tiny_buffered\r\n\r\naltair8800_tiny_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +altair8800 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DXSize=16 \\\r\n\t-DYSize=12 \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-D__ALTAIR8800__ \\\r\n\t-vn \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_INITIAL_SCREEN \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-lndos \\\r\n\t-D__BUFFERED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DNO_STATS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__STDIO \\\r\n\t-D__NO_WAIT \\\r\n\t-DTURN_BASED \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -oaltair8800.rom\r\n\trm -rf altair8800_DATA.bin \r\n\trm -rf altair8800_BSS.bin \r\n\tmv altair8800.rom $(BUILD_PATH)/X$(GAME_NAME)_TINY_altair8800_buffered.rom\r\n\tmv altair8800.bin $(BUILD_PATH)/X$(GAME_NAME)_TINY_altair8800_buffered.bin\r\n\r\n\r\n#############################\r\n# BIC\r\n\r\nbic: bic_buffered\r\n\r\nbic_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=bic \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=21 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__STDIO \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# BIT90\r\n\r\n\r\nbit90: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +coleco $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__COLECO__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t  \\\r\n\t \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n#############################\r\n# C128_Z80\r\n\r\nc128_z80_80col: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) -lgfx128hr \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-lndos -subtype=disk \\\r\n\t-D__C128_Z80__ -DEXTRA_TITLE \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS  \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-DNO_BLINKING \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/c128/c128_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oa80.bin\r\n\t$(TOOLS_PATH)/generic/c1541 -format \"crosschase,0\" d64 FULL_c128_z80_80col.d64\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_80col.d64 -write a80.ldr\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_80col.d64 -write a80\r\n\tmv FULL_c128_z80_80col.d64 $(BUILD_PATH)/X$(GAME_NAME)_c128_z80_80col.d64\r\n\trm A80.LDR\r\n\trm A80\r\n\trm a80.bin\r\n\r\n\r\nc128_z80: c128_z80_40col\r\n\r\nc128_z80_40col:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 -compiler=sdcc $(ZSDCC_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lndos -subtype=disk \\\r\n\t-D__C128_Z80__ -DXSize=40 \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-DNO_BLINKING \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oa40.bin\r\n\t$(TOOLS_PATH)/generic/c1541 -format \"crosschase,0\" d64 FULL_c128_z80_40col.d64\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_40col.d64 -write a40.ldr\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_40col.d64 -write a40\r\n\tmv FULL_c128_z80_40col.d64 $(BUILD_PATH)/X$(GAME_NAME)_c128_z80_40col.d64\r\n\trm A40.LDR\r\n\trm A40\r\n\trm a40.bin\r\n\r\n\r\n#############################\r\n# CAMPUTERS_LYNX\r\n\r\ncamputers_lynx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lynx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D__CAMPUTERS_LYNX__ \\\r\n\t-vn \\\r\n\t-D__VT52 \\\r\n\t  \\\r\n\t \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_camputers_lynx.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_camputers_lynx.bin\r\n\r\n\r\n#############################\r\n# COLECO_ADAM\r\n\r\ncoleco_adam:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) $(INCLUDE_OPTS) -subtype=adam \\\r\n\t-D__COLECO_ADAM__ \\\r\n\t  \\\r\n\t \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -DXSize=29 -DYSize=20 \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oxcadam.bin\r\n\trm xcadam.bin\r\n\trm xcadam.com    \r\n\tmv xcadam.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n\r\n\r\n#############################\r\n# COLECO\r\n\r\ncoleco: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +coleco $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__COLECO__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t  \\\r\n\t \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t -DEXTRA_TITLE \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_coleco.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco_BSS.bin\r\n\r\n\r\n#############################\r\n# CPC\r\n\r\ncpc: cpc_mode0\r\n\r\n# broken because of chasedEnemyPtr\r\ncpc_mode0: $(ASSETS_PATH)/z88dk_xchase.asm $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -subtype=dsk $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DYSize=25 -DXSize=20 -D__SCREEN_MODE=0  \\\r\n\t -D__ALT_SLEEP  -DEXTRA_TITLE \\\r\n\t \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=100 \\\r\n\t-D__CPC__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o xbin \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES)\r\n\tmv xbin $(BUILD_PATH)/\r\n\tcp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t$(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT) xbin.dsk  $(BUILD_PATH)/X$(GAME_NAME)_$@_gx4000.cpr   -c 'run\"XBIN.CPC'\r\n\trm os.rom\r\n\trm amsdos.rom\r\n\trm basic.rom\r\n\tmv xbin.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\trm -rf xbin_BANK_7.bin\r\n\trm -rf xbin.cpc\r\n\trm -rf $(BUILD_PATH)/xbin  \r\n\r\n\r\ncpc_cpcrslib: $(ASSETS_PATH)/z88dk_cpc_Chars8.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -subtype=dsk $(SCCZ80_OPTS) $(INCLUDE_OPTS)  -vn  -clib=ansi \\\r\n\t-D__CPC__ -DEXTRA_TITLE \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t -D__PSG_SOUND   \\\r\n\t-D__CPCRSLIB_GRAPHICS -D_XL_SLOW_DOWN_FACTOR=600 \\\r\n\t-lndos -create-app -o \t$(BUILD_PATH)/X$(GAME_NAME)XXX_cpc \\\r\n\t-D__CPCRSLIB_GRAPHICS \\\r\n\t$(ASSETS_PATH)/z88dk_cpc_Chars8.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/cpc/cpc_cpcrslib_init_graphics.c \\\r\n\t$(FULL_FILES)\r\n\t# $(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_chase $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cpc  $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cdt\r\n\t# rm -rf X$(GAME_NAME)XXX_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd X$(GAME_NAME)XXX_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw X$(GAME_NAME)XXX_cpc.dsk -p $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cpc xchase\r\n\t# mv X$(GAME_NAME)XXX_cpc.dsk $(BUILD_PATH)/\r\n\t# cp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t# $(TOOLS_PATH)/z88dk/cpc/nocart/nocart.exe  $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.dsk  $(BUILD_PATH)/X$(GAME_NAME)XXX_gx4000.cpr   -c 'run\"xchase'\r\n\t# rm os.rom\r\n\t# rm amsdos.rom\r\n\t# rm basic.rom\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc_BANK_7.bin    \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cpc \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc\r\n\r\n\r\n#############################\r\n# CPM (Z80)\r\n\r\ncpm_targets: cpm_z80_targets cpm_8080_targets\r\n\r\ncpm: cpm_z80\r\n\r\ncpm_z80_targets: cpm_z80\r\n\r\ncpm_z80: cpm_z80_adm3a\r\n\r\ncpm_z80_adm3a:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__ADM3A \\\r\n\t-D__CPM_80X24__ \\\r\n\t -DLESS_TEXT -D__NO_WAIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\ncpm_8080_targets: cpm_8080 cpm_8080_buffered\r\n\r\n\r\ncpm_8080: cpm_8080_adm3a cpm_8080_buffered\r\n\r\ncpm_8080_adm3a:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -m8080 -clib=8080 \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__ADM3A \\\r\n\t-D__CPM_80X24__ \\\r\n\t -DLESS_TEXT -D__NO_WAIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\ncpm_buffered: cpm_8080_buffered\r\n\r\ncpm_8080_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -m8080 -clib=8080 \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=23 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__STDIO \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# DAI\r\n\r\ndai: dai_buffered\r\n\r\ndai_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +dai $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__DAI__ \\\r\n\t-DXSize=47 \\\r\n\t-DYSize=21 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# DMV\r\n\r\ndmv:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=dmv \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__ADM3A_WITH_UNDEF \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__DMV__ \\\r\n\t -DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# EG2K\r\n\r\neg2k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EG2K__ \\\r\n\t-subtype=eg2000disk \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t$(INCLUDE_OPTS) -D__BIT_BANG_SOUND \\\r\n\t-D__EG2K__ \\\r\n\t  \\\r\n\t \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-DLESS_TEXT  \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# EINSTEIN\r\n\r\neinstein_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=einstein -leinstein \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EINSTEIN__ \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t -DLESS_TEXT \\\r\n\t-clib=ansi \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\neinstein: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=einstein -leinstein \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EINSTEIN__ \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t -DLESS_TEXT \\\r\n\t-clib=ansi \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n#############################\r\n# ENTERPRISE\r\n\r\nenterprise: enterprise_buffered\r\n\r\n# TODO: Try -subtype=com\r\nenterprise_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +enterprise $(SCCZ80_OPTS)  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-vn \\\r\n\t-D__ENTERPRISE__ \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=16 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__STDIO  -D__BIT_BANG_SOUND \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o enterprise.bin\r\n\tmv enterprise.app FULL_enterprise.app\r\n\trm enterprise.bin\r\n\ttar czvf FULL_enterprise.tar.zip FULL_enterprise.app\r\n\trm FULL_enterprise.app\r\n\tmv FULL_enterprise.tar.zip $(BUILD_PATH)/X$(GAME_NAME)_$@.tar.zip\r\n\r\n\r\n#############################\r\n# EXCALIBUR64\r\n\r\nexcalibur64_turn_bsed:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=excali64 -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__EXCALI64__ -D_XL_SLOW_DOWN_FACTOR=2000 -DTURN_BASED \\\r\n\t -DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-create-app -oxcex64tb.bin \\\r\n\t$(FULL_FILES) \r\n\tmv xcex64tb.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n\trm xcex64tb_HIMEM.bin\r\n\trm xcex64tb.bin\r\n\r\n\r\nexcalibur64:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=excali64 -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__EXCALI64__ -D_XL_SLOW_DOWN_FACTOR=1600 \\\r\n\t -DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-create-app -oxcexca64.bin \\\r\n\t$(FULL_FILES) \r\n\tmv xcexca64.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n\trm xcexca64_HIMEM.bin\r\n\trm xcexca64.bin\r\n\trm xcexca64.com    \r\n    \r\n#############################\r\n# FP1100\r\n\r\nfp1100:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +fp1100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__FP1100__ -vn \\\r\n\t-D__VT52 \\\r\n\t  \\\r\n\t \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o fp1100.bin\r\n\tmv fp1100.d88 $(BUILD_PATH)/X$(GAME_NAME)_$@.d88\r\n\trm fp1100.bin\r\n\trm fp1100_BOOTSTRAP.bin\r\n\r\n\r\n#############################\r\n# G800\r\n\r\ng800: g800_turn_based\r\n\r\ng800_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_ROM_OPTS) -clib=g850b $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-DTURN_BASED \\\r\n\t-DNO_BLINKING \\\r\n\t-vn \\\r\n\t \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o g800.bin\r\n\trm g800.bin \r\n\trm g800.rom\r\n\tmv g800.ihx $(BUILD_PATH)/X$(GAME_NAME)_$@_turn_based.ihx\r\n\r\n\r\n\r\n#############################\r\n# GAME GEAR\r\n\r\ngg: gamegear\r\n\r\ngamegear: gamegear_gfx\r\n\r\ngamegear_gfx: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms -subtype=gamegear $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SMS__ -D__GAME_GEAR__ -DEXTRA_TITLE \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=18 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t \\\r\n\t -D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS -D__INCLUDE_CONIO_H -DZ88DK_JOYSTICK \\\r\n\t-lndos -D_XL_SLOW_DOWN_FACTOR=1600 \\\r\n\t $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_gamegear.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_BANK_1F.bin\r\n\r\n\r\ngamegear_tiny_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_OPTS) -subtype=gamegear -clib=sdcc_iy -startup=17 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_sms.inc \\\r\n\t-DXSize=19 \\\r\n\t-DYSize=15 \\\r\n\t-D__SMS__ \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-D__STDIO \\\r\n\t-DLESS_TEXT \\\r\n\t-create-app \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-DTURN_BASED \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__NO_WAIT \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_TINY_gamegear_buffered.bin \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/sms/sms_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_gamegear_buffered_CODE.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_gamegear_buffered_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_gamegear_buffered_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_gamegear_buffered_UNASSIGNED.bin\r\n\r\n\r\n#############################\r\n# GB\r\n\r\n# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \r\n# $(ASSETS_PATH)/z88dk_xchase.asm \r\n\r\ngb: gb_gfx\r\n\r\ngb_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gb $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__GB__ \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=18 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -DZ88DK_JOYSTICK \\\r\n\t-lndos -D_XL_SLOW_DOWN_FACTOR=1200 \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_gb_no_gfx.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb_no_gfx.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb_no_gfx_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb_no_gfx_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb_no_gfx_BANK_1F.bin\r\n\r\n\r\ngb_gfx: $(ASSETS_PATH)/z88dk_gameboy.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gb $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__GB__ -DEXTRA_TITLE \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=18 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR  \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -DZ88DK_JOYSTICK \\\r\n\t-lndos -D_XL_SLOW_DOWN_FACTOR=1400  \\\r\n\t $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_gameboy.asm \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/gb/gb_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_gb.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_gb_BANK_1F.bin\r\n\r\n\r\n#############################\r\n# HOMELAB (4)\r\n\r\nhomelab:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +homelab $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__HOMELAB__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# HOMELAB2\r\n\r\nhomelab2:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +homelab2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__HOMELAB2__ \\\r\n\t-DXSize=40 \\\r\n\t-DYSize=23 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# HEMC\r\n\r\nhemc:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +hemc $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__HEMC__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# HGMC\r\n\r\nhgmc:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +hgmc $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__HGMC__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# KAYPRO\r\n\r\nkaypro: kaypro2x\r\n\r\nkaypro84: kaypro2x\r\n\r\n# kaypro84 (-subtype=kaypro84)\r\nkaypro2x: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=kaypro84 -lgfxkp \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-D__KAYPRO84__ \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DINITIAL_GHOST_FREEZE \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n# kaypro83 (-subtype=kaypro83)\r\nkaypro83: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=kaypro83 -lgfxkp \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-D__KAYPRO__ \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DINITIAL_GHOST_FREEZE \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_HIMEM.bin   \r\n\r\n\r\n#############################\r\n# KC\r\n\r\nkc_light: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +kc $(SCCZ80_OPTS) -subtype=tap $(INCLUDE_OPTS) \\\r\n\t-D__KC__ \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(LIGHT_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_LIGHT_kc.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_kc.bin\r\n\r\n\r\nkc_tiny: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +kc $(SCCZ80_OPTS) -subtype=tap $(INCLUDE_OPTS) \\\r\n\t-D__KC__ \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_TINY_kc.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_kc.bin\r\n\r\n\r\nkc: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +kc $(SCCZ80_OPTS) -subtype=tap $(INCLUDE_OPTS) \\\r\n\t-D__KC__ \\\r\n\t  \\\r\n\t \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_kc.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_kc.bin\r\n\r\n\r\n#############################\r\n# KRAMER-MC\r\n\r\nkramermc:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +kramermc $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__KRAMERMC__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=16 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D__STDIO -DTURN_BASED \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_l-p",
    "content": "# ------------------------------------------------------------------------------------------\r\n# Z88DK L-P\r\n#\r\n\r\nz88dk_targets_l-p: \\\r\n\tlaser500_targets \\\r\n\tm5_targets \\\r\n\tmicrobee_targets \\\r\n\tmsx_targets \\\r\n\tmtx_targets \\\r\n\tmz_targets\r\n\r\n\r\nz88dk_targets_l-p_more: \\\r\n\tlambda_targets \\\r\n\tlaser500_targets \\\r\n\tm5_targets \\\r\n\tmicrobee_targets \\\r\n\tmikro80_targets \\\r\n\tmsx_targets \\\r\n\tmtx_targets \\\r\n\tmulti8_targets \\\r\n\tmyvision_targets \\\r\n\tmz_targets \\\r\n\tmz2500_targets \\\r\n\tnascom_targets \\\r\n\tnc100_targets \\\r\n\tnc200_targets \\\r\n\tnewbrain_targets \\\r\n\tondra_targets \\\r\n\tosborne1_targets \\\r\n\tosca_targets \\\r\n\tpasopia7_targets \\\r\n\tpencil2_targets \\\r\n\tp2000_targets \\\r\n\tpc6001_targets \\\r\n\tpc88_targets \\\r\n\tpcw_targets \\\r\n\tpmd85_targets \\\r\n\tpps_targets \\\r\n\tprimo_targets \\\r\n\tpv2000_targets \\\r\n\tpx4_targets \\\r\n\tpx8_targets\r\n\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\nlambda_targets: \\\r\n\tlambda_16k\r\n\r\nlaser500_targets: \\\r\n\tlaser500\r\n\r\nm5_targets: \\\r\n\tm5\r\n\r\nmicrobee_targets: \\\r\n\tmicrobee_16k_no_gfx microbee_32k\r\n\r\nmikro80_targets: \\\r\n\tmikro80\r\n\r\nmsx_targets: \\\r\n\tmsx_32k_rom\r\n\r\nmtx_targets: \\\r\n\tmtx mtx500\r\n\r\nmulti8_targets: \\\r\n\tmulti8\r\n\r\nmyvision_targets: \\\r\n\tmyvision\r\n\r\nmz_targets: \\\r\n\tmz\r\n\r\nmz2500_targets: \\\r\n\tmz2500\r\n\r\nnc100_targets: \\\r\n\tnc100\r\n\r\nnc200_targets: \\\r\n\tnc200\r\n\r\nnascom_targets: \\\r\n\tnascom_16k nascom_32k\r\n\r\nnewbrain_targets: \\\r\n\tnewbrain\r\n\r\nondra_targets: \\\r\n\tondra ondra_no_gfx\r\n\r\nosborne1_targets: \\\r\n\tosborne1 osborne1_chars\r\n\r\nosca_targets: \\\r\n\tosca\r\n\r\np2000_targets: \\\r\n\tp2000_16k p2000_32k\r\n\r\npasopia7_targets: \\\r\n\tpasopia7\r\n\r\npencil2_targets: \\\r\n\tpencil2 pencil2_no_gfx\r\n\r\npc6001_targets: \\\r\n\tpc6001_16k pc6001_32k\r\n\r\npc88_targets: \\\r\n\tpc88 pc88_32k\r\n\r\npcw_targets: \\\r\n\tpcw40 pcw80\r\n\r\npmd85_targets: \\\r\n\tpmd85 pmd85_no_gfx\r\n\r\npps_targets: \\\r\n\tpps\r\n\r\nprimo_targets: \\\r\n\tprimo primo_no_gfx\r\n\r\npv2000_targets: \\\r\n\tpv2000\r\n\r\npx4_targets: \\\r\n\tpx4 \r\n\r\npx8_targets: \\\r\n\tpx8\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\n\r\n#############################\r\n# LAMBDA\r\n\r\nlambda: lambda_16k\r\n\r\nlambda_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lambda $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-vn -D__LAMBDA__  \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n#############################\r\n# LASER500\r\n\r\nlaser500: laser500_gfx\r\n\r\nlaser500_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +laser500 $(SCCZ80_OPTS) -vn -Cz--audio \\\r\n\t-create-app -o $@.bin \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__LASER500__ \\\r\n\t-D__BIT_BANG_SOUND  \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES)\r\n\tmv laser500.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm laser500.cas\r\n\tmv laser500.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\r\n\r\n\t# -compiler=sdcc \r\nlaser500_gfx: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +laser500 $(SCCZ80_OPTS) -vn -Cz--audio \\\r\n\t-create-app -o $@.bin -DEXTRA_TITLE \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__LASER500__  -DXSize=40 -DYSize=22 -D__SCREEN_MODE=2 \\\r\n\t-D__BIT_BANG_SOUND  \\\r\n\t -DLESS_TEXT \\\r\n\t  -D_XL_SLOW_DOWN_FACTOR=400 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \r\n\tmv $@.bin $(BUILD_PATH)/X$(GAME_NAME)_laser500.bin\r\n\trm $@.cas\r\n\tmv $@.wav $(BUILD_PATH)/X$(GAME_NAME)_laser500.wav\r\n\r\n\r\n#############################\r\n# M5\r\n\r\nm5: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lm -create-app -Cz--audio -subtype=tape \\\r\n\t-pragma-define:REGISTER_SP=65000 \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t -DLESS_TEXT \\\r\n\t  -D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\t\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\r\n\r\n\r\n#############################\r\n# MICROBEE\r\n\r\nmicrobee_16k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ -clib=ansi -vn   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_microbee_16k_no_gfx.prg  \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_microbee_16k_no_gfx.prg\r\n\r\n\r\nmicrobee: microbee_32k\r\n\r\nmicrobee_32k: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) -lgfxnc100 \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__NC100__ \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_microbee_32k.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DINITIAL_GHOST_FREEZE  -D__BIT_BANG_SOUND \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_microbee_32k.bin\r\n\r\n\r\n#############################\r\n# MIKRO80\r\n\r\nmikro80:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mikro80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MIKRO80__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# MSX\r\n\r\nmsx: msx_32k_rom \r\n\r\nmsx_32k_rom_fixed_colors: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +msx $(SCCZ80_OPTS) $(INCLUDE_OPTS) -lmsxbios \\\r\n\t-DUSE_MSX_BIOS -DEXTRA_TITLE \\\r\n\t \\\r\n\t -D__PSG_SOUND  \\\r\n\t-vn -DMSX_VPOKE  -D__MSX__   \\\r\n\t-lndos -subtype=rom \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_msx_32k.rom \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t-DLESS_TEXT \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/msx/msx_redefined_chars_init_graphics.c\t\\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_msx_32k_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_msx_32k_DATA.bin\r\n\r\nmsx_32k_rom: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +msx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t -DEXTRA_TITLE \\\r\n\t -D__PSG_SOUND  \\\r\n\t-vn  -D__MSX__   \\\r\n\t-lndos -subtype=rom \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_msx_32k.rom \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_msx_32k_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_msx_32k_DATA.bin\r\n\r\n\r\n#############################\r\n# MTX\r\n\r\nmtx: mtx512\r\n\r\nmtx512: mtx512_turn_based\r\n\r\nmtx512_turn_based: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) -clib=ansi -startup=2 $(INCLUDE_OPTS) \\\r\n\t-D__MTX__ -D__SCREEN_MODE=2 \\\r\n\t-create-app -oMTX.bin -vn -DEXTRA_TITLE \\\r\n\t     -DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \r\n\trm MTX.bin\r\n\tmv MTX.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv MTX.mtx $(BUILD_PATH)/X$(GAME_NAME)_$@.mtx\r\n    \r\n\t# cp $(BUILD_PATH)/X$(GAME_NAME)_$@.mtx /cygdrive/c/Emulation/TEST/memu/tapes/mtx512.mtx\r\n\r\n\r\nmtx500: mtx500_turn_based\r\n\r\nmtx500_turn_based: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MTX__ \\\r\n\t-create-app -oMTX500.bin -vn -DEXTRA_TITLE \\\r\n\t     -DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \r\n\trm MTX500.bin\r\n\tmv MTX500.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv MTX500.mtx $(BUILD_PATH)/X$(GAME_NAME)_$@.mtx\r\n    \r\n\t# cp $(BUILD_PATH)/X$(GAME_NAME)_$@.mtx /cygdrive/c/Emulation/TEST/memu/tapes/mtx500.mtx\r\n\r\nhtron_mtx: \r\n\tzcc +mtx -pragma-redirect:fputc_cons=fputc_cons_generic -clib=ansi -create-app -startup=2 ./test/htron.c\r\n\r\n#############################\r\n# MULTI8\r\n\r\nmulti8: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +multi8 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t$(CROSS_LIB_PATH)/boot/multi8/bootstrap.c \\\r\n\t-create-app -o bootstrap\r\n\trm bootstrap\r\n\t$(Z88DK_PATH)$(MYZ88DK) +multi8 $(SCCZ80_OPTS) -subtype=64k \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__MULTI8__ \\\r\n\t   -D__PSG_SOUND \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-DNO_HINTS \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-DLESS_TEXT \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o $@\r\n\trm $@\r\n\tcat bootstrap.cas $@.cas > $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\r\n\trm bootstrap.cas\r\n\trm $@.cas\r\n\trm $@_BOOTSTRAP.bin\r\n\r\n\r\n\r\n#############################\r\n# MYVISION\r\n\r\nmyvision: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +myvision $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MYVISION__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t -DZ88DK_JOYSTICK \\\r\n\t-D__VT52  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-lndos  -D__PSG_SOUND \\\r\n\t$(FULL_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\n#############################\r\n# MZ\r\n\r\nmz:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mz $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MZ__ -clib=ansi -pragma-define:ansicolumns=32 -vn \\\r\n\t     \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -DEXTRA_TITLE  \\\r\n\t-pragma-define:REGISTER_SP=0xd000 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_mz.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_mz.prg\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_mz.mzt $(BUILD_PATH)/X$(GAME_NAME)_mz.mzf\r\n\r\n\r\n#############################\r\n# MZ2500\r\n\r\n# mz2500: mz2500_tiny_buffered\r\n\r\nmz2500:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mz2500 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn -lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__MZ2500__ -DXSize=40 -DFORXE_YSIZE=24  \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR -D__NO_INIT_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n#############################\r\n# NASCOM\r\n\r\nnascom_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nascom $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -vn -lndos \\\r\n\t-D__NASCOM__ \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_nascom_16k.prg \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_nascom_16k.prg\r\n\r\n\r\nnascom: nascom_32k\r\n\r\nnascom_32k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nascom $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -vn -lndos \\\r\n\t-D__NASCOM__ \\\r\n\t \\\r\n\t \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n#############################\r\n# NC100\r\n\r\nnc100: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nc $(SCCZ80_ROM_OPTS) -lgfxnc100 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__NC100__ \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DINITIAL_GHOST_FREEZE \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# NC200\r\n\r\nnc200: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nc $(SCCZ80_ROM_OPTS) -lgfxnc200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__NC200__ \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t  \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# NEWBRAIN\r\n\r\nnewbrain:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +newbrain $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NEWBRAIN__ \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=11 \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-vn \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DNO_BLINKING \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_INITIAL_SCREEN \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-lndos \\\r\n\t-D__BUFFERED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DNO_STATS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__STDIO \\\r\n\t-D__NO_WAIT \\\r\n\t-DTURN_BASED \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o newbrain\r\n\ttar czvf FULL_newbrain.tar.zip _dir.txt newbrain.bas newbrain.dat\r\n\tmv FULL_newbrain.tar.zip $(BUILD_PATH)/X$(GAME_NAME)_newbrain.tar.zip\r\n\trm _dir.txt\r\n\trm newbrain.bas\r\n\trm newbrain.dat\r\n\trm newbrain\r\n\r\n\r\n#############################\r\n# ONDRA\r\n\r\nondra: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ondra $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ONDRA__ -DXSize=40 -DYSize=30   \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t -DZ88DK_JOYSTICK \\\r\n\t-D__VT52  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\tmv FULL_$@.tap $(BUILD_PATH)/X$(GAME_NAME)_$@.tap\r\n\tmv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\r\nondra_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ondra $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn -lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__ONDRA__ -DXSize=40 -DYSize=30   \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\tmv FULL_$@.tap $(BUILD_PATH)/X$(GAME_NAME)_$@.tap\r\n\tmv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\r\n#############################\r\n# OSCA\r\n\r\nosca:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +osca $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=ansi -D__OSCA__ -vn \\\r\n\t \\\r\n\t  -lndos \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o osca \\\r\n\t$(FULL_FILES)\r\n\trm osca\r\n\tmv OSCA.EXE $(BUILD_PATH)/X$(GAME_NAME)_OSCA.EXE\r\n\r\n\r\n#############################\r\n# OSBORNE1\r\n\r\nosborne1_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lgfxosborne1 -subtype=osborne1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__OSBORNE1__ \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__ADM3A_WITH_UNDEF \\\r\n\t-D__CPM_80X24__ \\\r\n\t -DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t  \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nosborne1: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lgfxosborne1 -subtype=osborne1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__OSBORNE1__ \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t -DLESS_TEXT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n\r\n#############################\r\n# PACMAN\r\npacman:\r\n\tmkdir $(BUILD_PATH)/puckmod\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pacman $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PACMAN__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered.bin\r\n\tcp $(TOOLS_PATH)/z88dk/pacman/pacman.5e $(BUILD_PATH)/puckmod\r\n\tcp $(TOOLS_PATH)/z88dk/pacman/pacman.5f $(BUILD_PATH)/puckmod\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered.0a $(BUILD_PATH)/puckmod/namcopac.6e\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered.0b $(BUILD_PATH)/puckmod/namcopac.6f\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered.0c $(BUILD_PATH)/puckmod/namcopac.6h\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered.0d $(BUILD_PATH)/puckmod/npacmod.6j\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered.rom\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pacman_buffered_DATA.bin\r\n\r\n\r\n#############################\r\n# P2000\r\n\r\np2000_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +p2000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -D__P2000__ -vn \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_p2000.prg \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_p2000.prg\r\n\r\n\r\np2000: p2000_32k\r\n\r\np2000_32k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +p2000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -D__P2000__ -vn \\\r\n\t     \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n#############################\r\n# PASAPIA7\r\n\r\npasopia7:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pasopia7 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PASOPIA__ \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DXSize=40 -DYSize=23 \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BOOTSTRAP.bin\t\r\n\r\n\r\n#############################\r\n# PC6001\r\n\r\npc6001_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc6001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -Cz--audio -clib=ansi \\\r\n\t-D__PC6001__ \\\r\n\t \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.prg  \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.wav\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.cas $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.cp6\t\r\n\r\n\r\npc6001: pc6001_32k\r\n\r\npc6001_32k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc6001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -Cz--audio -clib=ansi -subtype=32k \\\r\n\t-D__PC6001__  \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS  -D__PSG_SOUND \\\r\n\t  \\\r\n\t-D__SCREEN_MODE=2 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_$@.cas $(BUILD_PATH)/X$(GAME_NAME)_$@.cp6\r\n\r\n\r\n#############################\r\n# PC88\r\n\r\npc88: pc88_tiny\r\n\r\npc88_32k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\r\n\t -D__PC88__    \\\r\n\t-lndos -DXSize=80 -DYSIZE=25 -D_XL_SLOW_DOWN_FACTOR=2500 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app\t\\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\tmv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv FULL_$@.t88 $(BUILD_PATH)/X$(GAME_NAME)_$@.t88\r\n\r\n\r\npc88_32k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\r\n\t -D__PC88__    \\\r\n\t-lndos -DXSize=80 -DYSEIZE=23 -D_XL_SLOW_DOWN_FACTOR=2500 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app\t\\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\tmv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv FULL_$@.t88 $(BUILD_PATH)/X$(GAME_NAME)_$@.t88\r\n\r\npc88_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\r\n\t-D__PC88__ -DTINY_GAME  -DNO_WALL -DNO_BLINKING  \\\r\n\t-lndos -DXSize=80 -DYSEIZE=23 -D_XL_SLOW_DOWN_FACTOR=2500  \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app\t\\\r\n\t-o TINY_$@\r\n\trm TINY_$@\r\n\tmv TINY_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv TINY_$@.t88 $(BUILD_PATH)/X$(GAME_NAME)_$@.t88\r\n\r\n# tar czvf FULL_pc88.tar.zip FULL_pc88.t88 FULL_pc88.wav\r\n# rm FULL_pc88.t88\r\n# rm FULL_pc88.wav\r\n# mv FULL_pc88.tar.zip $(BUILD_PATH)\r\n\r\n\r\n#############################\r\n# PCW\r\n\r\npcw40:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=pcw40 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t -D__PC88__    \\\r\n\t-lndos -DXSize=90 -DYSEIZE=32 -D_XL_SLOW_DOWN_FACTOR=2500 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\trm -rf FULL_$@_HIMEM.bin\r\n\tmv FULL_$@.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tmv FULL_$@.com $(BUILD_PATH)/X$(GAME_NAME)_$@.com\r\n\r\n\r\npcw: pcw80\r\n\r\npcw80:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=pcw80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t -D__PC88__    \\\r\n\t-lndos -DXSize=90 -DYSEIZE=32 -D_XL_SLOW_DOWN_FACTOR=2500 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\trm -rf FULL_$@_HIMEM.bin\r\n\tmv FULL_$@.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tmv FULL_$@.com $(BUILD_PATH)/X$(GAME_NAME)_$@.com\r\n\r\n#############################\r\n# PENCIL2\r\n\r\n# SOUNDS is broken (sound never stops)\r\npencil2_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pencil2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PENCIL2__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\npencil2: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pencil2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PENCIL2__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\n#############################\r\n# PMD85\r\n\r\npmd85_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pmd85 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PMD85__ \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_pmd85_no_gfx.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pmd85_no_gfx.bin\r\n\r\n\r\npmd85: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pmd85 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PMD85__ \\\r\n\t-DXSize=36 \\\r\n\t-DYSize=32 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# PPS\r\n\r\npps:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pps $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__PPS__ -vn \\\r\n\t-o $@ \\\r\n\t-D__VT52 \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES)\r\n\tmv $@ $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\r\n\r\n#############################\r\n# PRIMO\r\n\r\n# primo: primo_no_gfx\r\n\r\nprimo_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +primo $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PRIMO__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nprimo: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +primo $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PRIMO__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND  \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# PV2000\r\n\r\n# -SO3 necessary to build a 16k rom image\r\npv2000: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pv2000 $(SCCZ80_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PV2000__ \\\r\n\t  \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n\r\n#############################\r\n# PX4\r\n\r\npx4: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_ROM_OPTS) -lpx4 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX4__ \\\r\n\t \\\r\n\t-subtype=px4 -Cz--32k \\\r\n\t-create-app -o $@ \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm $@\r\n\tmv $@.ROM $(BUILD_PATH)/X$(GAME_NAME)_$@.ROM\r\n\r\n\r\n#############################\r\n# PX8\r\n\r\npx8: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX8__ \\\r\n\t \\\r\n\t-subtype=px8 \\\r\n\t-create-app -o $@ \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm $@\r\n\tmv $@.ROM $(BUILD_PATH)/X$(GAME_NAME)_$@.ROM\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_q-z",
    "content": "# ------------------------------------------------------------------------------------------\r\n# Z88DK Q-Z\r\n#\r\n\r\nz88dk_targets_q-z: \\\r\n\tsamcoupe_targets \\\r\n\tsc3000_targets \\\r\n\tsms_targets \\\r\n\tspectrum_targets\r\n\r\nz88dk_targets_q-z_more: \\\r\n\tqc10_targets \\\r\n\trc700_targets \\\r\n\trx78_targets \\\r\n\tsamcoupe_targets \\\r\n\tsc3000_targets \\\r\n\tsmc777_targets \\\r\n\tsms_targets \\\r\n\tsos_targets \\\r\n\tspc1000_targets \\\r\n\tspectrum_targets \\\r\n\tsrr_targets \\\r\n\tsuper80_targets \\\r\n\tsv8000_targets \\\r\n\tti82_targets \\\r\n\tti83_targets \\\r\n\tti85_targets \\\r\n\tti86_targets \\\r\n\tti8x_targets \\\r\n\ttiki100_targets \\\r\n\ttrs80_targets \\\r\n\tts2068_targets \\\r\n\ttvc_targets \\\r\n\tvector06c_targets \\\r\n\tgl_targets \\\r\n\tx1_targets \\\r\n\tz1013_targets \\\r\n\tz80tvgame_targets \\\r\n\tz88_targets \\\r\n\tzx80_targets \\\r\n\tzxn_targets\r\n\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\nqc10_targets: \\\r\n\tqc10\r\n\r\nsrr_targets: \\\r\n\tsrr\r\n\r\nsc3000_targets: \\\r\n\tsc3000_16k sc3000_32k sg1000\r\n\r\nsuper80_targets: \\\r\n\tsuper80 super80r\r\n\r\nrx78_targets: \\\r\n\trx78\r\n\r\nsamcoupe_targets: \\\r\n\tsamcoupe\r\n\r\nsos_targets: \\\r\n\tsos_buffered sos_tiny_buffered\r\n\r\nsms_targets: \\\r\n\tsms\r\n\r\nsmc777_targets: \\\r\n\tsmc777\r\n\r\nspc1000_targets: \\\r\n\tspc1000\r\n\r\nspectrum_targets: \\\r\n\tspectrum_16k spectrum_48k\r\n\r\nsv8000_targets: \\\r\n\tsv8000\r\n\r\nrc700_targets: \\\r\n\trc700\r\n\r\nti82_targets: \\\r\n\tti82\r\n\r\nti83_targets: \\\r\n\tti83\r\n\r\nti85_targets: \\\r\n\tti85\r\n\t\r\nti86_targets: \\\r\n\tti86_light\r\n\r\nti8x_targets: \\\r\n\tti8x\r\n\r\ntiki100_targets: \\\r\n\ttiki100\r\n\r\ntrs80_targets: \\\r\n\ttrs80 trs80_chars\r\n\r\nts2068_targets: \\\r\n\tts2068\r\n\r\ntvc_targets: \\\r\n\ttvc\r\n\r\nvector06c_targets: \\\r\n\tvector06c\r\n\r\ngl_targets: \\\r\n\tgl4000 gl6000sl\r\n\r\nx1_targets: \\\r\n\tx1 x1_no_gfx\r\n\r\nz1013_targets: \\\r\n\tz1013\r\n\r\nz80tvgame_targets: \\\r\n\tz80tvgame z80tvgame_no_gfx\r\n\r\nz88_targets: \\\r\n\tz88\r\n\r\nzx80_targets: \\\r\n\tzx80_16k_turn_based\r\n\r\nzxn_targets: \\\r\n\tzxn\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\n\r\n#############################\r\n# QC10\r\n\r\n\r\nqc10: qc10_turn_based\r\n\r\nqc10_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=qc10 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__ADM3A_WITH_UNDEF -D_XL_SLOW_DOWN_FACTOR=1000 -DTURN_BASED \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__QC10__ \\\r\n\t -DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t  \\\r\n\t-create-app -oxcqc10.bin \\\r\n\t$(FULL_FILES)\r\n\trm xcqc10.bin\t\r\n\trm xcqc10.com\r\n\tmv xcqc10.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\r\n\r\n#############################\r\n# RC700\r\n\r\nrc700:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=rc700 $(INCLUDE_OPTS) \\\r\n\t-D__RC700__ \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=23 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_rc700.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rc700.bin\r\n\r\n\r\n#############################\r\n# RX78\r\n\r\nrx78: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +rx78 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__RX78__ \\\r\n\t  \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_rx78.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rx78.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rx78_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rx78_BSS.bin\r\n\r\n\r\n#############################\r\n# SAMCOUPE\r\n\r\nsamcoupe: samcoupe_gfx\r\n\r\n# import as data into ram at 32768 - call 32768\r\nsamcoupe_gfx: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sam $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__SAM__    -DEXTRA_TITLE \\\r\n\t-D__CONIO_GRAPHICS -D_XL_SLOW_DOWN_FACTOR=2000  \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 -vn \\\r\n\t -D__BIT_BANG_SOUND -o $(BUILD_PATH)/FULL_samcoupe.bin -lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm\r\n\tcp $(TOOLS_PATH)/z88dk/samcoupe/samdos2_empty $(TOOLS_PATH)/z88dk/samcoupe/samdos2\r\n\t$(TOOLS_PATH)/z88dk/samcoupe/pyz80.py -I $(TOOLS_PATH)/z88dk/samcoupe/samdos2 $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.asm\r\n\tmv $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.dsk $(BUILD_PATH)/X$(GAME_NAME)_samcoupe.dsk\r\n\trm -rf $(BUILD_PATH)/FULL_samcoupe.bin\r\n\r\n\r\nsamcoupe_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sam $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__SAM__   -DEXTRA_TITLE \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 -vn \\\r\n\t  -o $(BUILD_PATH)/FULL_samcoupe.bin -lndos \\\r\n\t$(FULL_FILES)\r\n\tcp $(TOOLS_PATH)/z88dk/samcoupe/samdos2_empty $(TOOLS_PATH)/z88dk/samcoupe/samdos2\r\n\t$(TOOLS_PATH)/z88dk/samcoupe/pyz80.py -I $(TOOLS_PATH)/z88dk/samcoupe/samdos2 $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.asm\r\n\tmv $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.dsk $(BUILD_PATH)/X$(GAME_NAME)_samcoupe.dsk\r\n\trm -rf $(BUILD_PATH)/FULL_samcoupe.bin\r\n\r\n\r\n#############################\r\n# SC3000\r\n\r\nsc3000_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-clib=ansi \\\r\n\t-D__SC3000__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-vn -lndos -create-app -Cz--audio \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_sc3000_16k.prg \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_sc3000_16k.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_sc3000_16k.tap\r\n\r\n\r\nsc3000: sc3000_32k\r\n\r\nsc3000_32k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_OPTS) -DEXTRA_TITLE \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__SC3000__ \\\r\n\t \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t  \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-vn -lndos -create-app -Cz--audio \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.tap\r\n\r\n\r\n#############################\r\n# SG1000\r\n\r\nsg1000: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_ROM_OPTS) -subtype=rom \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__SC3000__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-vn -lndos -create-app \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_sg1000.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sg1000.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sg1000_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sg1000_DATA.bin\r\n\r\n\r\n#############################\r\n# SMC777\r\n\r\nsmc777: smc777_turn_based\r\n\r\nsmc777_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=smc777 $(INCLUDE_OPTS) \\\r\n\t-D__SMC777__ \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 -DXSize=80 -DYSize=24 \\\r\n\t-D__CONIO_GRAPHICS -D_XL_SLOW_DOWN_FACTOR=1000 -DTURN_BASED \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oxcsmc777.bin\r\n\trm xcsmc777.bin\r\n\trm xcsmc777.com\r\n\tmv xcsmc777.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\r\n\r\n#############################\r\n# SMS\r\n\r\nsms: sms_gfx\r\n\r\n\r\n\r\nsms_gfx: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SMS__ -DEXTRA_TITLE \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__INCLUDE_CONIO_H -DZ88DK_JOYSTICK \\\r\n\t-lndos -D_XL_SLOW_DOWN_FACTOR=1400 \\\r\n\t $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_sms.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_BANK_1F.bin\r\n\r\n\r\nsms_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_OPTS) -clib=sdcc_iy -startup=17 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_sms.inc \\\r\n\t-D__SMS__ -DNEW_LIB \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-D__STDIO \\\r\n\t-DLESS_TEXT \\\r\n\t-create-app \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-DTURN_BASED \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__NO_WAIT \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_sms_buffered.bin \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/sms/sms_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_buffered_CODE.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_buffered_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_buffered_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_buffered_UNASSIGNED.bin\r\n\r\n\r\n#############################\r\n# SOS\r\n\r\nsos: sos_buffered\r\n\r\nsos_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sos $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t-DTURN_BASED \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o sos_buffered \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm sos_buffered\r\n\tmv sos_buffered.obj $(BUILD_PATH)/X$(GAME_NAME)_sos_buffered.obj\r\n\r\n\r\nsos_tiny_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sos $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t-DTURN_BASED \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o sos_tiny_buffered \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES)\r\n\trm sos_tiny_buffered\r\n\tmv sos_tiny_buffered.obj $(BUILD_PATH)/X$(GAME_NAME)_TINY_sos_buffered.obj\r\n\r\n\r\n#############################\r\n# SPC1000\r\n\r\nspc1000: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +spc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__SPC1000__ \\\r\n\t  \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_spc1000.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_spc1000.bin\r\n\r\n\r\n#############################\r\n# SPECIALIST\r\n\r\nspecial:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +special $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SPECIAL__ \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -D_XL_NO_SLEEP -DTURN_BASED -D__STDIO -D__NO_WAIT \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_special.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_special.bin\r\n\r\n\r\n#############################\r\n# SPECTRUM\r\n\r\nspectrum_16k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) -zorg=24055 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t \\\r\n\t \\\r\n\t-D__SPECTRUM__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_TINY_spectrum_16k.prg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(TINY_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_spectrum_16k.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_spectrum_16k_BANK_7.bin\r\n\r\n\r\nspectrum: spectrum_48k\r\n\r\nspectrum_48k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) -v \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-pragma-redirect:getk=getk_inkey -DEXTRA_TITLE \\\r\n\t \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=800 \\\r\n\t  \\\r\n\t-D__SPECTRUM__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\r\n\r\n\r\nspectrum_128k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) -v \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -DEXTRA_TITLE \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t -D__PSG_SOUND -D_XL_SLOW_DOWN_FACTOR=600 \\\r\n\t  \\\r\n\t-D__SPECTRUM__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\r\n\r\n\r\n#############################\r\n# SRR\r\n\r\nsrr: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +srr $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SRR__ -vn \\\r\n\t  \\\r\n\t  -D__NO_WAIT \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app -o srr \\\r\n\t$(FULL_FILES)\r\n\trm srr\r\n\trm srr.srr\r\n\tmv srr.wav $(BUILD_PATH)/X$(GAME_NAME)_srr.wav\r\n\r\n\r\n#############################\r\n# SUPER80\r\n\r\nsuper80: super80_no_col\r\n\r\nsuper80_no_col:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +super80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__SUPER80__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t  \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR \\\r\n\t-D__VT52 \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o super80\r\n\tmv super80.ql $(BUILD_PATH)/X$(GAME_NAME)_super80.ql\r\n\trm super80\r\n\r\n\r\n#############################\r\n# SUPER80R\r\n\r\nsuper80r: super80r_no_gfx_no_col\r\n\r\nsuper80r_no_gfx_no_col:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +super80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=vduem \\\r\n\t-D__SUPER80R__ \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=23 \\\r\n\t  \\\r\n\t -D__BIT_BANG_SOUND  \\\r\n\t -D_XL_NO_COLOR  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__VT52 -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-lndos \\\r\n\t-create-app -o super80r\r\n\tmv super80r.ql $(BUILD_PATH)/X$(GAME_NAME)_super80r.ql\r\n\trm super80r\r\n\r\n\r\nsuper80r_gfx_no_col: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +super80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=vduem \\\r\n\t-D__SUPER80R__ \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=24 \\\r\n\t \\\r\n\t  \\\r\n\t -D__BIT_BANG_SOUND  \\\r\n\t -D_XL_NO_COLOR  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__VT52 \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-lndos \\\r\n\t-create-app -o super80r\r\n\tmv super80r.ql $(BUILD_PATH)/X$(GAME_NAME)_super80r.ql\r\n\trm super80r\r\n\r\n\r\n#############################\r\n# SV8000\r\n\r\nsv8000: sv8000_tiny\r\n\r\nsv8000_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -O3 -pragma-define:CLIB_DISABLE_MODE0=1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-DZ88DK_JOYSTICK -DXSize=24 -DYSize=16  \\\r\n\t-D__SV8000__ -DDED__SCREEN_MODE\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING -DNO_PRINT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_WAIT -D_XL_SLOW_DOWN_FACTOR=2000 -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.bin \\\r\n\t$(TINY_FILES) \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@_DATA.bin\r\n\r\n\r\n# sv8000_tiny:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -O3 $(INCLUDE_OPTS) \\\r\n\t# -D__SV8000__ -pragma-define:CLIB_DISABLE_MODE0=1 \\\r\n\t# -DZ88DK_JOYSTICK \\\r\n\t# -DXSize=23 \\\r\n\t# -DYSize=16 \\\r\n\t# -D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t# -D_XL_NO_COLOR -DNO_PRINT -D__STDIO  \\\r\n\t# -DTINY_GAME  -DNO_WALL -DNO_BLINKING -D__NO_WAIT -D_XL_NO_SLEEP  -DDED__SCREEN_MODE\r\n\t# -D__NO_INIT_GRAPHICS \\\r\n\t# $(TINY_FILES) \\\r\n\t# -create-app -o$(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.bin\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.bin\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@_BSS.bin\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@_DATA.bin\r\n\r\nsv8000_32k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -subtype=32k \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t-D__SV8000__ \\\r\n\t -DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t  \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\n#############################\r\n# TI82\r\n\r\nti82: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti82 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI82__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT  -D__BIT_BANG_SOUND \\\r\n\t-create-app -o ti82 \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../ti82.82p $(BUILD_PATH)/X$(GAME_NAME)_ti82.82p\r\n\trm -rf $(SOURCE_PATH)/../../ti82\r\n\r\n\r\n#############################\r\n# TI82\r\n\r\nti83: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti83 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI83__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT  -D__BIT_BANG_SOUND \\\r\n\t-create-app -oxchase \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../xchase.83p $(BUILD_PATH)/X$(GAME_NAME)_ti83.83p\r\n\trm -rf $(SOURCE_PATH)/../../xchase\r\n\r\n\r\n#############################\r\n# TI85\r\n\r\nti85: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti85 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI85__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT  -D__BIT_BANG_SOUND \\\r\n\t-create-app -oti85 \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../ti85.85s $(BUILD_PATH)/X$(GAME_NAME)_ti85.85s\r\n\trm -rf $(SOURCE_PATH)/../../ti85\r\n\r\n\r\n#############################\r\n# TI86\r\n\r\nti86: ti86_light\r\n\r\nti86_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti86 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI86__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DLESS_TEXT\t\\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_BLINKING \\\r\n\t-DNO_HINTS \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app  -oti86 \\\r\n\t$(LIGHT_FILES)\r\n\tmv $(SOURCE_PATH)/../../ti86.86p $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_ti86.86p\t\r\n\trm -rf $(SOURCE_PATH)/../../ti86\r\n\r\n\r\n#############################\r\n# TI8X\r\n\r\nti8x: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti8x $(SCCZ80_OPTS) -clib=ansi  -subtype=ion -Cz--altfmt \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI8X__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT  -D__BIT_BANG_SOUND \\\r\n\t-create-app -oxchase8x \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../xchase8x.8xp $(BUILD_PATH)/X$(GAME_NAME)_ti8x.8xp\t\r\n\tmv $(SOURCE_PATH)/../../xchase8x $(BUILD_PATH)/X$(GAME_NAME)_ti8x.bin\r\n\r\nti: ti82 ti83 ti85 ti86 ti8x\r\n\r\n\r\n#############################\r\n# TIKI100\r\n\r\ntiki100: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=tiki100 -ltiki100 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TIKI100__ \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-DINITIAL_GHOST_FREEZE \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_HINTS  -D__PSG_SOUND \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o tiki100 \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv $(SOURCE_PATH)/../../tiki100.dsk $(BUILD_PATH)/X$(GAME_NAME)_tiki100.dsk\r\n\trm -rf $(SOURCE_PATH)/../../tiki100\r\n\trm -rf $(SOURCE_PATH)/../../tiki100_HIMEM.bin\r\n\trm -rf $(SOURCE_PATH)/../../tiki100.com\r\n\r\n#############################\r\n# TRS80\r\n\r\ntrs80: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos -subtype=disk \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-pragma-define:REGISTER_SP=0xffb5 \\\r\n\t-D__TRS80__ \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT  -D__BIT_BANG_SOUND \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-create-app \\\r\n\t \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_trs80.bin \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_trs80.bin\r\n\r\n\r\ntrs80_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos -subtype=disk \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lm -create-app \\\r\n\t-D__TRS80__ \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t   \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_trs80_chars.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_trs80_chars.bin\r\n\r\n\r\n#############################\r\n# TS2068\r\n\r\nts2068: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ts2068 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=ansi \\\r\n\t-D__TS2068__ \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-vn \\\r\n\t \\\r\n\t-DLESS_TEXT  -D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t  \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_ts2068.bin \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_ts2068.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_ts2068_BANK_7.bin\r\n\r\n\r\n#############################\r\n# TVC\r\n\r\ntvc: tvc_buffered\r\n\r\n\r\ntvc_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +tvc $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__TVC__ \\\r\n\t-DXSize=31 \\\r\n\t-DYSize=23 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT -D_XL_NO_SLEEP -DDED__SCREEN_MODE\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# VECTOR06C\r\n\r\nvector06c:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vector06c $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__VECTOR06C__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_vector06c.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_vector06c.bin\r\n\r\n\r\n#############################\r\n# V-TECH GENIUS LEADER\r\ngl4000: gl4000_buffered\r\n\r\ngl4000_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gl -clib=gl4000 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__VGL__ \\\r\n\t-DXSize=20 -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=6 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -DDED__SCREEN_MODE\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\ngl6000sl: gl6000sl_buffered\r\n\r\ngl6000sl_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gl -clib=gl6000sl $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__VGL__ \\\r\n\t-DXSize=30 -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=12 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -DDED__SCREEN_MODE\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n#############################\r\n# X1\r\n\r\nx1: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x1 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__X1__ \\\r\n\t  -D__PSG_SOUND \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin -vn -lndos \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nx1_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x1 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__X1__ \\\r\n\t  -D__PSG_SOUND \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin -vn -lndos \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n#############################\r\n# ZX80\r\n\r\nzx80: zx80_16k_turn_based\r\n\r\nzx80_16k_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn \\\r\n\t-D__ZX80__  \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nzx80_v2: zx80_16k_turn_based_v2\r\n\r\nzx80_16k_turn_based_v2:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn \\\r\n\t-D__ZX80__  \\\r\n\t-DTURN_BASED \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n#############################\r\n# Z1013\r\n\r\nz1013:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi \\\r\n\t-vn -lndos \\\r\n\t-D__Z1013__     \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o z1013\r\n\tmv $(SOURCE_PATH)/../../Z1013.Z80 $(BUILD_PATH)/X$(GAME_NAME)_z1013.z80\r\n\trm -rf $(SOURCE_PATH)/../../z1013\r\n\r\n\r\n#############################\r\n# Z80TVGAME\r\n\r\nz80tvgame_no_gfx: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +z80tvgame $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__Z80TVGAME__ \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -DXSize=21 -DYSize=26 -DZ88DK_JOYSTICK \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n\r\nz80tvgame: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z80tvgame $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__Z80TVGAME__ \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -DXSize=21 -DYSize=26 -DZ88DK_JOYSTICK \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n#############################\r\n# Z88\r\n\r\nz88: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z88 $(SCCZ80_OPTS) -subtype=app \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__Z88__ \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t -D__BIT_BANG_SOUND \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/z88/z88_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o z88\r\n\trm z88\r\n\trm z88.ap0\r\n\trm z88_BSS.bin\r\n\trm z88_DATA.bin\r\n\trm z88_bss_fardata.bin\r\n\tmv z88.63 $(BUILD_PATH)/X$(GAME_NAME)_z88.63\r\n\tmv z88.epr $(BUILD_PATH)/X$(GAME_NAME)_z88.epr\r\n\r\n\r\n#############################\r\n# ZXN\r\n\r\nzxn:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zxn $(SCCZ80_OPTS) -clib=classic -subtype=nex $(INCLUDE_OPTS) \\\r\n\t-D__ZXN__ -DEXTRA_TITLE \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t -D_XL_NO_COLOR -D_XL_SLOW_DOWN_FACTOR=9000 \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS  -D__PSG_SOUND \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_zxn.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_zxn.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_zxn_UNASSIGNED.bin\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/makefiles.chase/makefiles_z88dk/Makefile_z88dk_zsdcc",
    "content": "# ------------------------------------------------------------------------------------------\r\n# Z88DK ZSDCC\r\n#\r\n\r\nz88dk_targets_zsdcc: \\\r\n\taquarius_targets \\\r\n\tgal_targets \\\r\n\tmc1000_targets \\\r\n\tsvi_targets \\\r\n\tvg5k_targets \\\r\n\tvz200_targets \\\r\n\tzx81_targets\r\n\r\nz88dk_targets_zsdcc_more: \\\r\n\taquarius_targets \\\r\n\tgal_targets \\\r\n\tmc1000_targets \\\r\n\toz_targets \\\r\n\tpv1000_targets \\\r\n\tsvi_targets \\\r\n\tvg5k_targets \\\r\n\tvz200_targets \\\r\n\tz9001_targets \\\r\n\tzx81_targets\r\n\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\n\r\naquarius_targets: \\\r\n\taquarius_exp_4k aquarius_exp_16k\r\n\r\ngal_targets: \\\r\n\tgal_6k gal_22k gal_plus\r\n\r\nmc1000_targets: \\\r\n\tmc1000_16k mc1000_48k\r\n\r\noz_targets: \\\r\n\toz_tiny_buffered\r\n\r\npv1000_targets: \\\r\n\tpv1000\r\n\r\nsvi_targets: \\\r\n\tsvi_318 svi_328\r\n\r\nvg5k_targets: \\\r\n\tvg5k vg5k_exp_16k\r\n\r\nvz200_targets: \\\r\n\tvz200_18k\r\n\r\nz9001_targets: \\\r\n\tz9001_16k_full z9001_32k_no_gfx z9001_32k\r\n\r\nzx81_targets_ijkl_spc: \\\r\n\tzx81_16k zx81_32k_wrx_turn_based\r\n\r\n\r\nzx81_targets: \\\r\n\tzx81_targets_ijkl_spc\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\n\r\n#############################\r\n# AQUARIUS\r\n\r\naquarius_exp_4k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t\\\r\n\t-D__AQUARIUS__ -DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__ALT_PRINT \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-lndos \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/aquarius/aquarius_init_graphics.c \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@\r\n\r\n\r\n\r\naquarius: aquarius_exp_16k\r\n\r\naquarius_exp_16k: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \\\r\n\t -D__AQUARIUS__    -DEXTRA_TITLE \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app\t\\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\naquarius_alt: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \\\r\n\t -D__AQUARIUS__    \\\r\n\t-lndos -D__TARGET_SPECIFIC_ASCII -DEXTRA_TITLE \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app\t\\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\naquarius_alt_memory_mapped: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \\\r\n\t -D__AQUARIUS__    -D_XL_SLOW_DOWN_FACTOR=1500 \\\r\n\t-lndos -D__TARGET_SPECIFIC_ASCII -DEXTRA_TITLE  \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app\t\\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\naquarius_quad: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \\\r\n\t -D__AQUARIUS__ \\\r\n\t-lndos -D_XL_SLOW_DOWN_FACTOR=1500 -DNO_UDG -DNO_PRINT \\\r\n\t-D__QUAD_MEMORY_MAPPED_GRAPHICS -DXSize=20 -DYSize=12 -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app\t\\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n#############################\r\n# GAL\r\n\r\ngal: gal_22k\r\n\r\ngal_22k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-need=ansiterminal \\\r\n\t-D__GAL__    \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-vn -lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_galaksija.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_galaksija.prg\r\n\r\n\r\n# --opt-code-size \r\ngal_6k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-need=ansiterminal \\\r\n\t--reserve-regs-iy \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-D_XL_NO_SLEEP -DLESS_TEXT \\\r\n\t-D__GAL__ \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DFLAT_ENEMIES \\\r\n\t-D__ALT_HIGHSCORE \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t-lndos -create-app -Cz--audio -o  $(BUILD_PATH)/X$(GAME_NAME)_TINY_galaksija_6k.prg \\\r\n\t$(TINY_FILES) \\\r\n\t$(SOURCE_PATH)/memory/gal_memory.asm\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_galaksija_6k.prg\r\n\t#rm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_galaksija_6k.wav\r\n\r\n\r\ngal_plus_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal -subtype=galaxyp $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-need=ansiterminal -D_XL_SLOW_DOWN_FACTOR=300 \\\r\n\t-D__GAL__ -D__GAL_PLUS__   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-vn -lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_galaksija_plus.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_galaksija_plus.prg\r\n\r\n\r\ngal_plus: gal_plus_no_gfx\r\n\r\ngal_plus_gfx: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal -subtype=galaxyp $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t--generic-console -D_XL_SLOW_DOWN_FACTOR=0 -D__SCREEN_MODE=1 -DEXTRA_TITLE -DYSize=26  \\\r\n\t-D__GAL__ -D__GAL_PLUS__     \\\r\n\t-D__CONIO_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-vn -lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_galaksija_plus.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_galaksija_plus.prg\r\n\r\n\r\n#############################\r\n# MC1000\r\n\r\n\r\n# -compiler=sdcc -SO3  -pragma-define:REGISTER_SP=0x3fff \r\nmc1000_16k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mc1000 -O3 $(SCCZ80_OPTS) $(INCLUDE_OPTS)  \\\r\n\t-subtype=gaming -DYSize=24 -DLESS_TEXT \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=400 \\\r\n\t \\\r\n\t \\\r\n\t-D__MC1000__     \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-vn  -lndos -Cz--audio \\\r\n\t-create-app -o $@.bin \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\tmv $@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\trm $@.bin\r\n\trm $@.cas\r\n\r\n\r\n\r\nmc1000: mc1000_16k\r\n\r\nmc1000_48k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) $(INCLUDE_OPTS) \\\r\n\t-subtype=gaming -DYSize=24 \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=400 \\\r\n\t \\\r\n\t \\\r\n\t-D__MC1000__     \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-vn  -lndos -Cz--audio \\\r\n\t-create-app -o $@.bin \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\tmv $@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\trm $@.bin\r\n\trm $@.cas\r\n\r\n\r\n#############################\r\n# OZ\r\n\r\noz: oz_tiny_buffered\r\n\r\noz_tiny_buffered: $(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT)\r\n\t$(Z88DK_PATH)$(MYZ88DK) +oz $(ZSDCC_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-ooz.bin \\\r\n\t-D__OZ__ \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-DXSize=59 \\\r\n\t-DYSize=9 \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__BUFFERED_GRAPHICS -DTURN_BASED -D__NO_INIT_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT) $(SOURCE_PATH)/../../oz\r\n\trm -rf $(SOURCE_PATH)/../../oz.bin\r\n\tmv oz.wzd $(BUILD_PATH)/X$(GAME_NAME)_TINY_oz_buffered.wzd\r\n\r\n\r\n#############################\r\n# PV1000\r\n\r\n# UDG can be done but differently\r\n# -SO3 necessary to build a 16K rom\r\npv1000:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pv1000 $(ZSDCC_ROM_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PV1000__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t  \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-DLESS_TEXT \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_pv1000.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pv1000.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pv1000_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pv1000_BSS.bin\r\n\r\n\r\n#############################\r\n# SVI\r\n\r\nsvi_318:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +svi $(ZSDCC_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-zorg=49152 \\\r\n\t-clib=ansi \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-vn -lndos \\\r\n\t-D__SVI__ \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o svi_318 \\\r\n\t$(LIGHT_FILES)\r\n\tmv svi_318.cas $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_svi_318.cas\r\n\trm svi_318\r\n\r\n\r\nsvi: svi_328\r\n\r\nsvi_328: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +svi $(SCCZ80_OPTS) \\\r\n\t-DZ88DK_JOYSTICK -DEXTRA_TITLE \\\r\n\t \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic $(INCLUDE_OPTS) \\\r\n\t -vn -lndos \\\r\n\t \\\r\n\t -D__SVI__   \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-create-app -o svi_328 \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c  \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\tmv svi_328.cas $(BUILD_PATH)/X$(GAME_NAME)_svi_328.cas\r\n\trm svi_328\r\n\r\n\r\n#############################\r\n# VG5K\r\n\r\nvg5k_exp_16k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t -vn  -D__VG5K__   -DASM_DISPLAY \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_vg5k_exp_16k.prg \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-clib=default \\\r\n\t \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_vg5k_exp_16k.prg\r\n\r\n\r\nvg5k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t--reserve-regs-iy \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-vn  -D__VG5K__ \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_vg5k_less_text.prg \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_vg5k_less_text.prg\r\n\r\n\r\n#############################\r\n# VZ200\r\n\r\nvz200: vz200_18k\r\n\r\nvz200_18k: \t\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vz -Cz--audio --hardware-keyboard $(SCCZ80_OPTS) --generic-console -vn \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t -D__VZ__ -DHARDWARE_KEYBOARD \\\r\n\t \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -Cz--audio -o $(BUILD_PATH)/X$(GAME_NAME)_vz200_18k.vz \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/vz200/vz200_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_vz200_18k.cas\r\n\r\n\r\nvz200_8k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vz $(ZSDCC_OPTS) \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma.inc \\\r\n\t-compiler=sdcc \\\r\n\t--opt-code-size \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__VZ__ -clib=ansi \\\r\n\t-DLESS_TEXT \\\r\n\t-DNO_BLINKING \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-DGHOSTS_NUMBER=4 \\\r\n\t-DBOMBS_NUMBER=2 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DNO_STATS \\\r\n\t-DNO_INITIAL_SCREEN \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_TINY_vz200_8k.vz \\\r\n\t$(TINY_FILES) \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_vz200_8k.cas\r\n\r\n\r\nvz200_sprites_18k: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t \\\r\n\t \\\r\n\t-D__VZ__ \\\r\n\t \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_vz200_sprites_18k.vz \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_vz200_sprites_18k.cas\r\n\r\n\r\n#############################\r\n# ZX81\r\n\r\nzx81: zx81_v2_16k\r\n\r\nzx81_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t$(INCLUDE_OPTS) -compiler=sdcc  \\\r\n\t--opt-code-size  \\\r\n\t-vn \\\r\n\t-D__ZX81__  \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_zx81_16k.prg\r\n\r\nzx81_v2: zx81_v2_16k\r\n\r\nzx81_v2_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t$(INCLUDE_OPTS)  -pragma-define:ZX_CHAR_XLATE_MODE=1 \\\r\n\t--opt-code-size \\\r\n\t-vn -D_XL_SLOW_DOWN_FACTOR=0 \\\r\n\t-D__ZX81__  \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nzx81_32k_wrx:  $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -O3 -subtype=wrx -clib=wrx \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\r\n\t-pragma-define:hrgpage=36096 \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t \\\r\n\t \\\r\n\t-DNO_BLINKING \\\r\n\t-DXSize=36 \\\r\n\t-DYSize=35 \\\r\n\t-vn \\\r\n\t-D__ZX81__ \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t \\\r\n\t-lndos \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__ALT_MOVE \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-DFEWER_SPRITES \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_zx81_32k_wrx.prg\r\n\r\n\r\nzx81_32k_wrx_turn_based: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -O3 -subtype=wrx -clib=wrx \\\r\n\t$(INCLUDE_OPTS) -D__NO_SPRITE_TRANSPARENCY -DEXTRA_TITLE \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\r\n\t-pragma-define:hrgpage=36096 \\\r\n\t-DGHOSTS_NUMBER=9 \\\r\n\t \\\r\n\t-DNO_BLINKING \\\r\n\t-DTURN_BASED \\\r\n\t-DXSize=36 \\\r\n\t-DYSize=35 \\\r\n\t-vn \\\r\n\t-D__ZX81__ \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t \\\r\n\t-lndos \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-DFEWER_SPRITES \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_zx81_$@.prg \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_zx81_32k_wrx_turn_based.prg\r\n\r\n\r\n#############################\r\n# Z9001\r\n\r\nz9001: z9001_32k_no_gfx\r\n\r\nz9001_16k_full:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z9001 $(ZSDCC_OPTS) -compiler=sdcc $(INCLUDE_OPTS) -clib=ansi \\\r\n\t-D__Z9001__ -vn   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t-DNO_BLINKING \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_HINTS \\\r\n\t-DSIMPLE_STRATEGY  -D__BIT_BANG_SOUND \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.z80 \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.z80\r\n\r\n\r\nz9001_32k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z9001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi \\\r\n\t-D__Z9001__ -vn     \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.z80 \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.z80\r\n\r\n\r\nz9001_32k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z9001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi \\\r\n\t-D__Z9001__ -vn     \\\r\n\t-D__CONIO_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.z80 \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.z80\r\n\r\n"
  },
  {
    "path": "src/games/chase/memory/c16_memory.s",
    "content": "; TAPBUF    $0333-03F2       819-1010   Cassette tape buffer\n; WRLEN     $03F3-03F4      1011-1012   Length of data to be written to tape\n; RDCNT     $03F5-03F6      1013-1014   Length of data to be read from tape\n; INPQUE    $03F7-0436      1015-1078   RS-232 input queue\n; ESTARL    $0437-0454      1079-1108\n; ESTAKH    $0455-0472      1109-1138\n\n.export _ghosts;\n_ghosts = $333\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _skull;\n_skull = _level + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _powerUp2;\n_powerUp2 = _powerUp + $A\n\n.export _gun;\n_gun = _powerUp2 + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _rockets;\n_rockets = _extraPoints + $A\n\n.export _freeze;\n_freeze = _rockets + $14\n\n.export _invincibility;\n_invincibility = _freeze + $A\n\n.export _extraLife;\n_extraLife = _invincibility + $A\n\n.export _super;\n_super = _extraLife + $A\n\n.export _confuse;\n_confuse = _super + $A\n\n.export _zombie;\n_zombie = _confuse + $A\n\n.export _chase;\n_chase = _zombie + $A\n\n.export _ghostCount;\n_ghostCount = _chase + $A\n\n.export _ghostLevel;\n_ghostLevel = _ghostCount + $1\n\n.export _leftHorizontalMissile;\n_leftHorizontalMissile = _ghostLevel + $2\n\n.export _rightHorizontalMissile;\n_rightHorizontalMissile = _leftHorizontalMissile + $5\n\n.export _chasingBullet;\n_chasingBullet = _rightHorizontalMissile + $5\n\n.export _invincibility_count_down;\n_invincibility_count_down = _chasingBullet + $5\n\n.export _confuse_count_down;\n_confuse_count_down = _invincibility_count_down + $2\n\n.export _zombie_count_down;\n_zombie_count_down = _confuse_count_down + $2\n\t\n.export _strategyArray;\n_strategyArray = _zombie_count_down + $2\n\n\n; 241\n\n.export _freeze_count_down;\n_freeze_count_down = _strategyArray + $8\n\n.export _skullSlowDown;\n_skullSlowDown = _freeze_count_down + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _skullSlowDown + $2\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _bulletDirection;\n_bulletDirection = _skullYCountDown + $1\n\n\n.export _chasedEnemyPtr;\n_chasedEnemyPtr = _bulletDirection + $1\n\n.export _chasedByGhosts;\n_chasedByGhosts = _chasedEnemyPtr + $2\n\n.export _rockets_x;\n_rockets_x = _chasedByGhosts + $2\n\n\n.export _extraLife_present_on_level;\n_extraLife_present_on_level = _rockets_x + $4\n\n.export _super_present_on_level;\n_super_present_on_level = _extraLife_present_on_level + $1\n\n.export _zombie_present_on_level;\n_zombie_present_on_level = _super_present_on_level + $1\n\n.export _bases;\n_bases = _zombie_present_on_level + $1\n\n.export _arrowRange;\n_arrowRange = _bases + $1\n\n.export _all_skulls_killed_in_completed_levels;\n_all_skulls_killed_in_completed_levels = _arrowRange + $1\n\n.export _bases_in_completed_levels;\n_bases_in_completed_levels = _all_skulls_killed_in_completed_levels + $1\n\n.export _horizWallsLength;\n_horizWallsLength = _bases_in_completed_levels + $1\n\n.export _invincibilityActive;\n_invincibilityActive = _horizWallsLength + $1\n\n.export _confuseActive;\n_confuseActive = _invincibilityActive + $1\n\n.export _zombieActive;\n_zombieActive = _confuseActive + $1\n\n.export _verticalWallY;\n_verticalWallY = _zombieActive + $1\n\n.export _verticalWallLength;\n_verticalWallLength = _verticalWallY + $1\n\n.export _playerDirection;\n_playerDirection = _verticalWallLength + $1\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullActive;\n_skullActive = _guns + $1\n\n.export _loop;\n_loop = $200\n\n.export _playerBlink;\n_playerBlink = _loop + $2\n\n.export _arrowYPosition;\n_arrowYPosition = _playerBlink + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _arrowYPosition + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $2\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _ind;\n_ind = _BOMB_IMAGE + $2\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + 1\n\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $2\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _BROKEN_BRICK_IMAGE;\n_BROKEN_BRICK_IMAGE = _ZOMBIE_IMAGE + $2\n\n\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t"
  },
  {
    "path": "src/games/chase/memory/creativision_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $100\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _ghostCount + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _BOMB_IMAGE + $2\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _ind;\n_ind = _PLAYER_RIGHT_IMAGE + $2\n\n"
  },
  {
    "path": "src/games/chase/memory/gal_memory.asm",
    "content": "PUBLIC _ghosts, _bombs, _player, _ghostSlowDown, _points, _highScore, _lives, _level, _ghostCount, _GHOST_IMAGE, _BOMB_IMAGE, _ind\n\ndefc _ghosts = 0x2A00\n\ndefc _bombs = _ghosts + $28 \n\ndefc _player = _bombs + $14\n\ndefc _ghostSlowDown = _player + $5\n\ndefc _points = _ghostSlowDown + $2\n\ndefc _highScore = _points + $2\n\ndefc _lives = _highScore + $2\n\ndefc _level = _lives + $1\n\ndefc _ghostCount = _level + $1\n\ndefc _GHOST_IMAGE = _ghostCount + $1\n\ndefc _BOMB_IMAGE = _GHOST_IMAGE + $1\n\ndefc _ind = _BOMB_IMAGE + $1\n\n"
  },
  {
    "path": "src/games/chase/memory/gamate_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $100\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _points;\n_points = _player + $5\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _ghostCount + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $1\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $1\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $1\n\n.export _ind;\n_ind = _BOMB_IMAGE + $1\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + 1\n\t\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $4\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _freeze_count_down;\n_freeze_count_down = _ZOMBIE_IMAGE + $8\n\n.export _loop;\n_loop = $100\n\n.export _bulletDirection;\n_bulletDirection = _loop + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _bulletDirection + $1\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _ghostSlowDown;\n_ghostSlowDown = _skullYCountDown + $1\n\n.export _skullActive;\n_skullActive = _ghostSlowDown + $2\n\n.export _skull;\n_skull = _skullActive + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _gun;\n_gun = _powerUp + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _playerDirection;\n_playerDirection = _extraPoints + $A\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullSlowDown;\n_skullSlowDown = _guns + $2\n"
  },
  {
    "path": "src/games/chase/memory/oric1_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $400\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _skull;\n_skull = _level + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _powerUp2;\n_powerUp2 = _powerUp + $A\n\n.export _gun;\n_gun = _powerUp2 + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _rockets;\n_rockets = _extraPoints + $A\n\n.export _freeze;\n_freeze = _rockets + $14\n\n.export _invincibility;\n_invincibility = _freeze + $A\n\n.export _extraLife;\n_extraLife = _invincibility + $A\n\n.export _super;\n_super = _extraLife + $A\n\n.export _confuse;\n_confuse = _super + $A\n\n.export _zombie;\n_zombie = _confuse + $A\n\n.export _chase;\n_chase = _zombie + $A\n\n.export _ghostCount;\n_ghostCount = _chase + $A\n\n.export _ghostLevel;\n_ghostLevel = _ghostCount + $1\n\n.export _leftHorizontalMissile;\n_leftHorizontalMissile = _ghostLevel + $2\n\n.export _rightHorizontalMissile;\n_rightHorizontalMissile = _leftHorizontalMissile + $5\n\n.export _chasingBullet;\n_chasingBullet = _rightHorizontalMissile + $5\n\n.export _invincibility_count_down;\n_invincibility_count_down = _chasingBullet + $5\n\n.export _confuse_count_down;\n_confuse_count_down = _invincibility_count_down + $2\n\n.export _zombie_count_down;\n_zombie_count_down = _confuse_count_down + $2\n\t\n.export _strategyArray;\n_strategyArray = _zombie_count_down + $2\n\n.export _freeze_count_down;\n;_freeze_count_down = _strategyArray + $8\n_freeze_count_down = $B800\n\n.export _skullSlowDown;\n_skullSlowDown = _freeze_count_down + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _skullSlowDown + $2\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _bulletDirection;\n_bulletDirection = _skullYCountDown + $1\n\n\n.export _chasedEnemyPtr;\n_chasedEnemyPtr = _bulletDirection + $1\n\n.export _chasedByGhosts;\n_chasedByGhosts = _chasedEnemyPtr + $2\n\n.export _rockets_x;\n_rockets_x = _chasedByGhosts + $2\n\n\n.export _extraLife_present_on_level;\n_extraLife_present_on_level = _rockets_x + $4\n\n.export _super_present_on_level;\n_super_present_on_level = _extraLife_present_on_level + $1\n\n.export _zombie_present_on_level;\n_zombie_present_on_level = _super_present_on_level + $1\n\n.export _bases;\n_bases = _zombie_present_on_level + $1\n\n.export _arrowRange;\n_arrowRange = _bases + $1\n\n.export _all_skulls_killed_in_completed_levels;\n_all_skulls_killed_in_completed_levels = _arrowRange + $1\n\n.export _bases_in_completed_levels;\n_bases_in_completed_levels = _all_skulls_killed_in_completed_levels + $1\n\n.export _horizWallsLength;\n_horizWallsLength = _bases_in_completed_levels + $1\n\n.export _invincibilityActive;\n_invincibilityActive = _horizWallsLength + $1\n\n.export _confuseActive;\n_confuseActive = _invincibilityActive + $1\n\n.export _zombieActive;\n_zombieActive = _confuseActive + $1\n\n.export _verticalWallY;\n_verticalWallY = _zombieActive + $1\n\n.export _verticalWallLength;\n_verticalWallLength = _verticalWallY + $1\n\n.export _playerDirection;\n_playerDirection = _verticalWallLength + $1\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullActive;\n_skullActive = _guns + $1\n\n.export _loop;\n_loop = _skullActive + $1\n\n.export _playerBlink;\n_playerBlink = _loop + $2\n\n.export _arrowYPosition;\n_arrowYPosition = _playerBlink + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _arrowYPosition + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $2\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _ind;\n_ind = _BOMB_IMAGE + $2\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + $1\n\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n;_SKULL_IMAGE = _GUN_IMAGE + $2\n_SKULL_IMAGE = $BFE0\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $2\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _BROKEN_BRICK_IMAGE;\n_BROKEN_BRICK_IMAGE = _ZOMBIE_IMAGE + $2\n\n\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t"
  },
  {
    "path": "src/games/chase/memory/pet_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $33A\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _points;\n_points = _player + $5\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _ghostCount + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $1\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $1\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $1\n\n.export _ind;\n_ind = _BOMB_IMAGE + $1\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + 1\n\t\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $4\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _freeze_count_down;\n_freeze_count_down = _ZOMBIE_IMAGE + $8\n\n.export _loop;\n_loop = $100\n\n.export _bulletDirection;\n_bulletDirection = _loop + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _bulletDirection + $1\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _ghostSlowDown;\n_ghostSlowDown = _skullYCountDown + $1\n\n.export _skullActive;\n_skullActive = _ghostSlowDown + $2\n\n.export _skull;\n_skull = _skullActive + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _gun;\n_gun = _powerUp + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _playerDirection;\n_playerDirection = _extraPoints + $A\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullSlowDown;\n_skullSlowDown = _guns + $2\n"
  },
  {
    "path": "src/games/chase/memory/vic20_memory.s",
    "content": "; $334-$3FF  (820-1023)\n;0334-033B    820-827       ??\n;*033C-03FB   828-1019      Cassette buffer\n.export _ghosts;\n_ghosts = $334\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _skull;\n_skull = _level + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _powerUp2;\n_powerUp2 = _powerUp + $A\n\n.export _gun;\n_gun = _powerUp2 + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _rockets;\n_rockets = _extraPoints + $A\n\n.export _freeze;\n_freeze = _rockets + $14\n\n.export _invincibility;\n_invincibility = _freeze + $A\n\n.export _extraLife;\n_extraLife = _invincibility + $A\n\n.export _super;\n_super = _extraLife + $A\n\n.export _confuse;\n_confuse = _super + $A\n\n\n.export _zombie;\n;_zombie = _confuse + $A\n; $200 - $276 (512-630)\n;*0200-0258  512-600  Basic input buffer\n;*0259-0262  601-610  Logical file table\n;*0263-026C  611-620  Device # table\n;*026D-0276  621-630  Secondary Address table\n_zombie = $200\n\n\n.export _chase;\n_chase = _zombie + $A\n\n.export _ghostCount;\n_ghostCount = _chase + $A\n\n.export _ghostLevel;\n_ghostLevel = _ghostCount + $1\n\n.export _leftHorizontalMissile;\n_leftHorizontalMissile = _ghostLevel + $2;\n\n.export _rightHorizontalMissile;\n_rightHorizontalMissile = _leftHorizontalMissile + $5;\n\n.export _chasingBullet;\n_chasingBullet = _rightHorizontalMissile + $5;\n\n.export _invincibility_count_down;\n_invincibility_count_down = _chasingBullet + $5\n\n.export _confuse_count_down;\n_confuse_count_down = _invincibility_count_down + $2\n\n.export _zombie_count_down;\n_zombie_count_down = _confuse_count_down + $2\n\n.export _strategyArray;\n_strategyArray = _zombie_count_down + $2\n\n.export _freeze_count_down;\n_freeze_count_down = _strategyArray + $8\n\n.export _skullSlowDown;\n_skullSlowDown = _freeze_count_down + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _skullSlowDown + $2\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _bulletDirection;\n_bulletDirection = _skullYCountDown + $1\n\n.export _chasedEnemyPtr;\n_chasedEnemyPtr = _bulletDirection + $1\n\n.export _chasedByGhosts;\n_chasedByGhosts = _chasedEnemyPtr + $2\n\n.export _rockets_x;\n_rockets_x = _chasedByGhosts + $2\n\n.export _extraLife_present_on_level;\n_extraLife_present_on_level = _rockets_x + $4\n\n.export _super_present_on_level;\n_super_present_on_level = _extraLife_present_on_level + $1\n\n.export _zombie_present_on_level;\n_zombie_present_on_level = _super_present_on_level + $1\n\n.export _bases;\n_bases = _zombie_present_on_level + $1\n\n.export _arrowRange;\n_arrowRange = _bases + $1\n\n.export _all_skulls_killed_in_completed_levels;\n_all_skulls_killed_in_completed_levels = _arrowRange + $1\n\n.export _bases_in_completed_levels;\n_bases_in_completed_levels = _all_skulls_killed_in_completed_levels + $1\n\n.export _horizWallsLength;\n_horizWallsLength = _bases_in_completed_levels + $1\n\n.export _invincibilityActive;\n_invincibilityActive = _horizWallsLength + $1\n\n.export _confuseActive;\n_confuseActive = _invincibilityActive + $1\n\n.export _zombieActive;\n_zombieActive = _confuseActive + $1\n\n.export _verticalWallY;\n_verticalWallY = _zombieActive + $1\n\n.export _verticalWallLength;\n_verticalWallLength = _verticalWallY + $1\n\n.export _playerDirection;\n_playerDirection = _verticalWallLength + $1\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullActive;\n_skullActive = _guns + $1\n\n.export _loop;\n_loop = _skullActive + $1\n\n.export _playerBlink;\n_playerBlink = _loop + $2\n\n.export _arrowYPosition;\n_arrowYPosition = _playerBlink + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _arrowYPosition + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $2\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _ind;\n_ind = _BOMB_IMAGE + $2\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + 1\n\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n\n; This is the hardware stack. Is it safe?\n; $100-$113 (256-275)\n; broken by keyboard if in $200 area?\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n;_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = $100\n\n; broken by keyboard?\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $2\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _BROKEN_BRICK_IMAGE;\n_BROKEN_BRICK_IMAGE = _ZOMBIE_IMAGE + $2\n\n"
  },
  {
    "path": "src/games/chase/move_player.h",
    "content": "\n\n#ifndef _MOVE_PLAYER\n#define _MOVE_PLAYER\n\n\tvoid MOVE_PLAYER(void);\n\t\n#endif // _MOVE_PLAYER\n\n"
  },
  {
    "path": "src/games/chase/rocket.h",
    "content": "#ifndef ROCKETS_HEADER\n#define ROCKETS_HEADER\n\n\tvoid handle_rockets(void);\n\n#endif // ROCKETS_HEADER\n"
  },
  {
    "path": "src/games/chase/settings.h",
    "content": "\n#ifndef _SETTINGS\n#define _SETTINGS\n\n#if defined(_XL_TURN_BASED)\n\t#if !defined(NO_BLINKING)\n\t\t#define NO_BLINKING\n\t#endif\n#endif\n\n#if !defined(NO_PLAYER_ANIMATION)\n    #define ANIMATE_PLAYER\n#endif\n\n#if !defined(NO_END_SCREEN) && !defined(END_SCREEN)\n\t#define END_SCREEN\n#endif\n\n# if !defined(NO_BETWEEN_LEVEL) && !defined(BEWEEN_LEVEL)\n\t#define BEWEEN_LEVEL\n#endif\n\n#if !defined(TINY_GAME) && !defined(LIGHT_GAME)\n\t#ifndef FULL_GAME\t\n\t\t#define FULL_GAME\n\t#endif\n#endif\n\n#include \"cross_lib.h\"\n\nstruct ImageStruct\n{\n    uint8_t _imageData;\n    #if !defined(_XL_NO_COLOR)\n        uint8_t _color;\n    #endif\n};\n\ntypedef struct ImageStruct Image;\n\n\n#if !defined(NO_BLINKING)\n    void _blink_draw(uint8_t x,uint8_t y,Image * image, uint8_t * blinkCounter);\n#else\n    #define _blink_draw(x,y,image,blinkCounter) _draw(x,y,image)\n#endif\n\n\n#include \"game_settings.h\"\n\n#endif // _SETTINGS\n\n"
  },
  {
    "path": "src/games/chase/shapes/7x8/shape4.txt",
    "content": "#.....#\r\n.#####.\r\n#.....#\r\n#.#.#.#\r\n#.... #\r\n#.###.#\r\n#.....#\r\n.#####.\r\n"
  },
  {
    "path": "src/games/chase/shapes/7x8/shape5.txt",
    "content": ".#####.\r\n#.....#\r\n##.#.##\r\n#.#.#.#\r\n#.#.#.#\r\n##.#.##\r\n#.....#\r\n.#####.\r\n"
  },
  {
    "path": "src/games/chase/shapes/7x8/shape6.txt",
    "content": ".#...#.\r\n.#####.\r\n#.#.#.#\r\n#.#.#.#\r\n#.... #\r\n#.###.#\r\n#.....#\r\n.#####.\r\n"
  },
  {
    "path": "src/games/chase/shapes/7x8/shape7.txt",
    "content": ".#####.\r\n#.....#\r\n#.#.#.#\r\n#.....#\r\n#..#..#\r\n.#.#.#.\r\n.#...#.\r\n..###..\r\n"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape0.txt",
    "content": "...##...\n.. ##...\n.##..##.\n#.####.#\n..#..#..\n..#..#..\n\n"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape1.txt",
    "content": "...##...\n...##...\n.######.\n#.####.#\n..#..#..\n..#..#..\n\n"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape10.txt",
    "content": "...##...\r\n........\r\n.##..##.\r\n#......#\r\n..#..#..\r\n..#..#.."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape11.txt",
    "content": "........\r\n....#...\r\n..###...\r\n...###..\r\n...#....\r\n........"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape12.txt",
    "content": "...#....\r\n..##....\r\n...##...\r\n...#....\r\n..##....\r\n...##..."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape13.txt",
    "content": "........\r\n.#...#..\r\n########\r\n..#...#.\r\n........\r\n........"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape14.txt",
    "content": "........\r\n###.....\r\n.#######\r\n.#######\r\n###.....\r\n........"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape15.txt",
    "content": "........\r\n.....###\r\n#######.\r\n#######.\r\n.....###\r\n........"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape17.txt",
    "content": ".######.\r\n###...##\r\n###.####\r\n###..###\r\n.##.###.\r\n..####.."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape18.txt",
    "content": ".######.\r\n##.##.##\r\n##.##.##\r\n##....##\r\n.#.##.#.\r\n..####.."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape2.txt",
    "content": "...##...\n...##..#\n.###.##.\n#.####..\n...#.#..\n...#..#.\n\n"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape25.txt",
    "content": "....#...\r\n..#####.\r\n.##.#...\r\n..####..\r\n....#.#.\r\n.#####..\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape3.txt",
    "content": "...##...\n#..##...\n.##.###.\n..####.#\n..#.#...\n.#..#..."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape4.txt",
    "content": "#.####.#\n.#....#.\n#.#..#.#\n#......#\n#......#\n.######.\n"
  },
  {
    "path": "src/games/chase/shapes/8x6/shape5.txt",
    "content": ".######.\n#.#..#.#\n#..##..#\n#..##..#\n#.#..#.#\n.######."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape6.txt",
    "content": "#.####.#\n.#....#.\n#.#..#.#\n#.#..#.#\n#......#\n.######."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape7.txt",
    "content": ".######.\r\n#.#..#.#\r\n#......#\r\n.#.##.#.\r\n.#....#.\r\n..####.."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape8.txt",
    "content": ".######.\r\n###...##\r\n###.####\r\n####.###\r\n.#...##.\r\n..####.."
  },
  {
    "path": "src/games/chase/shapes/8x6/shape9.txt",
    "content": "........\r\n########\r\n##..#...\r\n####....\r\n##......\r\n#.......\r\n"
  },
  {
    "path": "src/games/chase/skull.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#ifndef SKULL\n#define SKULL\n\n#if !defined(TINY_GAME)\n\nvoid handle_skull(void);\n\nuint16_t computeSkullSlowDown(void);\n\nvoid computeSkullParameters(void);\n#endif\n\n#endif // SKULL\n\n\n"
  },
  {
    "path": "src/games/chase/speed_game_settings.h",
    "content": "#ifndef _SPEED_TARGET_SETTINGS\n#define _SPEED_TARGET_SETTINGS\n\n\n#if defined(TINY_GAME) || defined(_XL_TURN_BASED) || !defined(BOMB_DRAW_SKIP)\n    #define SKIP_BOMB_DRAW \n#else\n    #define SKIP_BOMB_DRAW if(!(loop&BOMB_DRAW_SKIP))\n#endif\n\n#if defined(_XL_TURN_BASED) || !defined(WALL_DRAW_SKIP)\n    #define SKIP_WALL_DRAW \n#else\n    #define SKIP_WALL_DRAW if(!(loop&WALL_DRAW_SKIP))\n#endif\n\n\n\t\n#if defined(WIDE) && !defined(SLOW_MISSILE)\n\t#define ADVANCED_LEFT_MISSILE()  ++leftHorizontalMissile._x\n\t#define ADVANCED_RIGHT_MISSILE() --rightHorizontalMissile._x\t\n#else\n\t#define ADVANCED_LEFT_MISSILE()  do{if(loop&1)++leftHorizontalMissile._x;}while(0)\n\t#define ADVANCED_RIGHT_MISSILE() do{if(loop&1)--rightHorizontalMissile._x;}while(0)\n#endif\n\t\n\n\n#endif // _SPEED_TARGET_SETTINGS\n\n"
  },
  {
    "path": "src/games/chase/split_files/bullet.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#if !defined(TINY_GAME) \n\n#include \"settings.h\"\n \n#include \"bullet.h\"\n#include \"level.h\"\n#include \"game_text.h\"\n#include \"character.h\"\n#include \"item.h\"\n#include \"ghost.h\"\n#include \"strategy.h\"\n\n#include \"init_images.h\"\n\nextern uint16_t points;\nextern uint8_t ghostCount;\nextern Character ghosts[GHOSTS_NUMBER];\n\nextern uint8_t level;\n\nextern Item extraPoints;\n\nextern Character skull;\nextern uint8_t skullActive;\nextern uint8_t playerFire;\nextern uint8_t guns;\nextern uint8_t playerDirection;\nextern uint8_t bulletDirection;\n\nextern Character bullet;\nextern Character player;\n\n\n\t\n#if defined(FULL_GAME) \n\textern Item freeze;\n\textern Item extraLife;\n\textern Item invincibility;\n\t\n\textern Character chasingBullet;\n\t\n\textern Character leftHorizontalMissile;\n\textern Character rightHorizontalMissile;\n\textern uint8_t rockets_x[ROCKETS_NUMBER];\n\textern Character rockets[ROCKETS_NUMBER];\n\textern uint8_t bases;\n\textern uint8_t bases_in_completed_levels;\n\n\textern Character *chasedEnemyPtr;\t\n    \n    extern uint8_t isBossLevel;\n    extern uint8_t isMissileLevel;\n    extern uint8_t isOneMissileLevel;\n    extern uint8_t isRocketLevel;\n#endif\n\n#if defined(FULL_GAME)\n\tvoid handle_chasing_bullet(void)\n\t{\n\t\tif(chasingBullet._status)\n\t\t{\n\t\t\tdeleteChasingBullet(&chasingBullet);\n\t\t\t#if !defined(SIMPLE_STRATEGY)\n\t\t\t\tmoveTowardCharacter(chasedEnemyPtr, &chasingBullet, 4);\n\t\t\t#else\n\t\t\t\tmoveTowardCharacter(chasedEnemyPtr, &chasingBullet);\t\t\t\t\n\t\t\t#endif\n\t\t\tdisplayChasingBullet(&chasingBullet);\n\t\t\tcheckBullet(&chasingBullet);\n\t\t}\t\n\t}\n#endif\n\t\nvoid handle_bullet(void)\n{\n\t// Check if player has fired the gun\n\tif(playerFire && bullet._status==0 && guns>0)\n\t{\n\t\t_XL_SHOOT_SOUND();\n\t\t--guns;\n\t\t#if !defined(NO_STATS)\n\t\tprintGunsStats();\n\t\t#endif\n\t\tbulletDirection = playerDirection;\n\t\tbullet._status = 1;\n\t\tbullet._x = player._x; \n\t\tbullet._y = player._y;\t\t\n\t\tplayerFire = 0;\t\n\t}\n\t\n\t// Move bullet if fired\n\tif(bullet._status==1)\n\t{\n\t\tmoveBullet(&bullet);\n\t\tcheckBullet(&bullet);\n\t}\n}\n\n\nvoid checkBullet(Character *bulletPtr)\n{\n\tbulletVsSkull(bulletPtr);\n\tbulletVsGhosts(bulletPtr);\n}\n\nvoid bulletVsGhost(Character * bulletPtr,\n\t\t\t\t\t\tCharacter * ghostPtr)\n{\n\tif(ghostPtr->_status && areCharctersAtSamePosition(bulletPtr, ghostPtr))\n\t{\n\t\tpoints+=GHOST_VS_MISSILE;\n\t\tghostDies(ghostPtr);\n\t\t\n\t\tbulletPtr->_status=0;\n\t}\n}\n\t\nvoid bulletVsGhosts(Character * bulletPtr)\n{\n\tuint8_t i = 0;\n\tfor(;i<GHOSTS_NUMBER;++i)\n\t{\n\t\tbulletVsGhost(bulletPtr, &ghosts[i]);\n\t};\n}\n\nvoid bulletVsSkull(register Character *bulletPtr)\n{\n\tif(skullActive && skull._status &&\n\t   areCharctersAtSamePosition(bulletPtr, &skull))\n\t{\n        _XL_DRAW(skull._x,skull._y,_SKULL_TILE, _XL_RED);\n\t\t_XL_PING_SOUND();\n\t\tbulletPtr->_status=0;\n\t\t#if defined(FULL_GAME)\n\t\tdecreaseGhostLevel();\n\t\t#endif\n\t\treducePowerUpsCoolDowns();\n\t\t\n\t\tif(!(--skull._status))\n\t\t{\n\t\t\t_XL_EXPLOSION_SOUND();\n            deleteSkull(&skull);\n\t\t\tpoints+=SKULL_POINTS;\n\t\t\tdisplayScore();\n\t\t}\n\t}\t\n}\n\n\nvoid _moveBullet(register Character *bulletPtr)\n{\n\tdeleteBullet(bulletPtr);\n\tswitch(bulletDirection)\n\t{\n\t\tcase RIGHT:\n\t\t\t++bulletPtr->_x;\n\t\tbreak;\n\t\tcase DOWN:\n\t\t\t++bulletPtr->_y;\n\t\tbreak;\n\t\tcase UP:\n\t\t\t--bulletPtr->_y;\n\t\tbreak;\n        default:\n\t\t// case LEFT:\n\t\t\t--bulletPtr->_x;\n\t\t// break;\n\t}\t\n}\n\n\n#if defined(FULL_GAME)\n\tvoid destroyHorizontalMissile(Character * horizontalMissilePtr)\n\t{\n\t\thorizontalMissilePtr->_status = 0;\n\t\t_XL_EXPLOSION_SOUND();\n\t\tdeleteHorizontalMissile(horizontalMissilePtr);\n\t\tpoints+=HORIZONTAL_MISSILE_BONUS;\n\t\tdisplayScore();\t\t\t\t\n\t\t++bases;\n\t\treducePowerUpsCoolDowns();\t\t\n\t}\n#endif\n\n\nvoid moveBullet(register Character * bulletPtr)\n{\n\t_moveBullet(bulletPtr);\n\tif(wallReached(bulletPtr) && bulletPtr->_status)\n\t{\n\t\tbulletPtr->_status=0;\n\t\t\n\t\tdeleteBullet(bulletPtr);\n\t\t#if defined(FULL_GAME)\n\t\t\t\n\t\t\tif(isOneMissileLevel)\n\t\t\t{\n\t\t\t\tif(bulletPtr->_x==XSize-1 && bulletPtr->_y==YSize/2 && rightHorizontalMissile._status)\n\t\t\t\t{\n\t\t\t\t\tgoto _destroy;\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\t\t\telse if(isMissileLevel || isBossLevel)\n\t\t\t{\n\t\t\t\tif(bulletPtr->_x==XSize-1 && bulletPtr->_y==HORIZONTAL_MISSILE_OFFSET && rightHorizontalMissile._status)\n\t\t\t\t{\n\t\t\t\t\t_destroy: destroyHorizontalMissile(&rightHorizontalMissile);\t\n\t\t\t\t}\n\t\t\t\telse if(bulletPtr->_x==0 && bulletPtr->_y==YSize-1-HORIZONTAL_MISSILE_OFFSET && leftHorizontalMissile._status)\n\t\t\t\t{\n\t\t\t\t\tdestroyHorizontalMissile(&leftHorizontalMissile);\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tif((isRocketLevel || isBossLevel) && bulletPtr->_y==YSize-1)\n\t\t\t{\n\t\t\t\tuint8_t i;\n\t\t\t\tfor(i=0;i<ROCKETS_NUMBER;++i)\n\t\t\t\t{\n\t\t\t\t\tif(bulletPtr->_x==rockets_x[i] && rockets[i]._status)\n\t\t\t\t\t{\n\t\t\t\t\t\trockets[i]._status = 0;\n\t\t\t\t\t\t++bases;\n\t\t\t\t\t\t_XL_EXPLOSION_SOUND();\n\t\t\t\t\t\tdeleteRocket(&rockets[i]);\n\t\t\t\t\t\tpoints+=VERTICAL_MISSILE_BONUS;\n\t\t\t\t\t\tdisplayScore();\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\tDRAW_BROKEN_BRICK(bulletPtr->_x, bulletPtr->_y);\n\t\t#endif\n\t}\n\telse\n\t{\n\t\tdisplayBullet(bulletPtr);\n\t}\n}\n\n#endif\n\n"
  },
  {
    "path": "src/games/chase/split_files/character.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"character.h\"\n#include \"settings.h\"\n#include \"game_text.h\"\n\n#include \"cross_lib.h\"\n\nextern uint16_t points;\n\nextern uint8_t ghostCount;\n#if !defined(TINY_GAME) || defined(_XL_TURN_BASED)\nextern uint16_t loop;\n#endif\nextern uint8_t level;\n\nextern Image DEAD_GHOST_IMAGE;\nextern Image GHOST_IMAGE;\nextern Image BOMB_IMAGE;\nextern Image SKULL_IMAGE;\nextern Image BROKEN_BRICK_IMAGE;\n\nextern Image HORIZONTAL_BRICK_IMAGE;\nextern Image VERTICAL_BRICK_IMAGE;\n\nextern Character ghosts[GHOSTS_NUMBER];\nextern Character bombs[BOMBS_NUMBER];\nextern Character player;\n\nextern uint8_t invincibilityActive;\n\n#if !defined(NO_BLINKING)\nvoid _blink_draw(uint8_t x, uint8_t y, Image * image, uint8_t *blinkCounter) \n{\n    if(*blinkCounter) \n    {\n        _draw(x,y,image);\n        *blinkCounter=0;\n    } \n    else \n    {\n        _delete(x,y);\n        *blinkCounter=1;\n    }    \n}\n#endif\n\n#if defined(FULL_GAME) && !defined(_XL_NO_COLOR)\nvoid _DRAW_PLAYER(void)\n{\n    if(invincibilityActive)\n    {\n        player._imagePtr->_color = _XL_YELLOW;\n    }\n    DRAW_PLAYER(player._x, player._y, player._imagePtr);\n    player._imagePtr->_color = _XL_CYAN;\n}\n#endif\n\nvoid displayCharacter(register Character * characterPtr)\n{\n\tDRAW_CHARACTER(characterPtr->_x, characterPtr->_y, characterPtr->_imagePtr);\n}\n\nvoid deleteCharacter(Character * characterPtr)\n{\n\tDELETE_CHARACTER(characterPtr->_x, characterPtr->_y);\n}\n\n#if defined(FULL_GAME)\n\n    void DRAW_BROKEN_BRICK(uint8_t x, uint8_t y)\n    {\n        _draw(x,y,&BROKEN_BRICK_IMAGE);        \n    }\n#endif\n\n#if defined(FULL_GAME)\n\textern uint8_t invincibilityActive;\n\textern uint8_t verticalWallY;\n\textern uint8_t verticalWallLength;\n\t\n\textern uint8_t horizWallsLength;\n\textern uint8_t zombieActive;\t\n#endif \n\nvoid playerDies(void)\n{\n\t_XL_EXPLOSION_SOUND();\n\tplayer._status=0;\n\t#if !defined(LESS_TEXT)\n\t\tprintDefeatMessage();\n\t#endif\n\t_XL_SLEEP(1);\n}\n\n#if defined(FULL_GAME)\n\tuint8_t playerKilledBy(Character *enemyPtr)\n\t{\n\t\treturn !invincibilityActive && areCharctersAtSamePosition(enemyPtr,&player);\n\t}\n#endif\n\nvoid initializeCharacter(register Character* characterPtr, uint8_t x, uint8_t y, uint8_t status, Image * imagePtr)\n{\n\tcharacterPtr->_x = x;\n\tcharacterPtr->_y = y;\n\tcharacterPtr->_status = status;\n\tcharacterPtr->_imagePtr = imagePtr;\n}\n\n\nuint8_t isCharacterAtLocation(uint8_t x, uint8_t y, Character * characterPtr)\n{\n\treturn(characterPtr->_y==y) && (characterPtr->_x==x);\n}\n\n\nuint8_t wallReached(register Character *characterPtr)\n{\n\treturn (characterPtr->_x==0)||(characterPtr->_x==XSize-1) || \n\t\t   (characterPtr->_y==0)||(characterPtr->_y==YSize-1);\n}\n\n\nvoid ghostDies(Character * ghostPtr)\n{\n\t_XL_EXPLOSION_SOUND();\n\t\n\tghostPtr->_status=0;\n\tdisplayScore();\n\t\n\t#if defined(FULL_GAME)\n\t\tif(level>=FIRST_MOVING_BOMBS_LEVEL)\n\t\t\t{\n\t\t\t\tuint8_t i;\n\n\t\t\t\tfor(i=0;i<BOMBS_NUMBER;++i)\n\t\t\t\t{\n\t\t\t\t\tdeleteCharacter(&bombs[i]);\n\t\t\t\t\tif(ghostCount&1)\n\t\t\t\t\t{\n\t\t\t\t\t\t--bombs[i]._x;\n\t\t\t\t\t\t--bombs[i]._y;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t++bombs[i]._x;\n\t\t\t\t\t\t++bombs[i]._y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\t\n\t#endif\n\t\t\n\t#if !defined(NO_DEAD_GHOSTS)\n\t\tghostPtr->_imagePtr = (Image *)&DEAD_GHOST_IMAGE;\n        #if defined(FULL_GAME)\n        displayCharacter(ghostPtr);\n        #endif\n\t#elif !defined(TINY_GAME)\n\t\tghostPtr->_imagePtr = (Image *)&SKULL_IMAGE;\t\t\t\n\t#endif\n\t\n\t--ghostCount;\n\tprintGhostCountStats();\n}\n\nvoid checkBombsVsGhost(register Character * ghostPtr)\n{\n\t\n\tif(ghostPtr->_status && characterReachedBombs(ghostPtr))\n\t{\t\t\n\t\tpoints+=GHOST_VS_BOMBS_BONUS;\n\t\t\n\n\t\t#\tif defined(TINY_GAME) && defined(MOVE_DEAD_GHOST)\n\t\t\tghostPtr->_y=1;\n\t\t#elif defined(TINY_GAME) && defined(BOMB_DEAD_GHOST)\n\t\t\tghostPtr->_imagePtr = &BOMB_IMAGE;\t\t\t\n\t\t#elif defined(TINY_GAME) && defined(HIDE_DEAD_GHOST)\n\t\t\t//\n\t\t#elif defined(TINY_GAME)\n\t\t\tghostPtr->_x=ghostCount;\n\t\t\tghostPtr->_y=1;\t\t\t\t\n\t\t#else\n\t\t\tghostPtr->_x=1+GHOSTS_NUMBER-ghostCount;\n\t\t\tghostPtr->_y=1;\t\n\t\t#endif\n\t\t\n\t\tghostDies(ghostPtr);\n\t}\n\t\n}\n\t\t\t\t\t\t\n\nuint8_t sameLocationAsAnyLocation(uint8_t x, uint8_t y, Character *characterList, uint8_t length)\n{\n\tuint8_t i;\n\n\tfor(i=0;i<length;++i)\n\t{\n\t\tif(isCharacterAtLocation(x,y,&characterList[i]))\n\t\t\treturn 1;\n\t}\t\n\treturn 0;\n}\n\n\n#if YSize<XSize\n\t#define SAFETY YSize/4\n#else\n\t#define SAFETY XSize/4\n#endif\n\n// TODO: To be replaced with something cleaner\n// also used with things different from global bombs\nuint8_t safeLocation(uint8_t x, uint8_t y)\n{\n\treturn !(sameLocationAsAnyLocation(x,y,ghosts,GHOSTS_NUMBER) \n\t      || sameLocationAsAnyLocation(x,y,bombs, BOMBS_NUMBER)\n\t\t  || (x<SAFETY) || (x>XSize-SAFETY) || (y<=SAFETY) || (y>YSize-SAFETY));\n}\n\n#if !defined(TINY_GAME)\nvoid relocateCharacter(register Character * characterPtr)\n{\n\tuint8_t x; \n\tuint8_t y;  \n\t\n\tdo\n\t{\n\t\tx = characterPtr->_x  + (uint8_t)(_XL_RAND() % RELOCATE_RANGE) - (uint8_t)(RELOCATE_RANGE/2);\n\t\ty = characterPtr->_y  + (uint8_t)(_XL_RAND() % RELOCATE_RANGE) - (uint8_t)(RELOCATE_RANGE/2);\n\n\t} while(!safeLocation(x,y));\n\n\tcharacterPtr->_x = x;\n\tcharacterPtr->_y = y;\n}\n#endif\n\n#if defined(FULL_GAME)\n\tuint8_t innerWallReached(register Character *characterPtr)\n\t{\n\t\treturn (characterPtr->_x==XSize/2) && (characterPtr->_y >= verticalWallY) && (characterPtr->_y<= (verticalWallY + verticalWallLength-1));\n\t}\n\n\tuint8_t horizWallsReached(void)\n\t{\n\t\treturn (player._y==YSize/2) && \n\t\t       ((player._x<=horizWallsLength) ||\n\t\t\t    (player._x>=-1+XSize-horizWallsLength));\n\t}\t\n\t\n#endif\n\n"
  },
  {
    "path": "src/games/chase/split_files/end_screen.c",
    "content": "#if !defined(TINY_GAME)\n\n#include \"settings.h\"\n\n#include \"end_screen.h\"\n#include \"game_text.h\"\n#include \"text_strings.h\"\n#include \"move_player.h\"\n\n#if defined(END_SCREEN)\n\t#include \"strategy.h\"\n\t#include \"level.h\"\n\t#include \"character.h\"\n\t#include \"ghost.h\"\n\t\n\textern Character player;\n\textern Character skull;\n\textern Character ghosts[GHOSTS_NUMBER];\n\textern Character bullet;\n\textern uint8_t playerFire;\n\textern uint8_t level;\n\textern uint8_t guns;\n\textern uint8_t ind;\n#endif\n\n\n\n#if defined(END_SCREEN) || defined(DANCE)\n\textern uint8_t bulletDirection;\n\n\tvoid dance(Character * characterPtr)\n\t{\n\t\tdeleteCharacter(characterPtr);\n\t\tif(!(bulletDirection&3))\n\t\t{\n\t\t\t++(characterPtr->_x);\n\t\t}\n\t\telse if((bulletDirection&3)==1)\n\t\t{\n\t\t\t++(characterPtr->_y);\t\t\t\n\t\t}\n\t\telse if ((bulletDirection&3)==2)\n\t\t{\n\t\t\t--(characterPtr->_x);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\t--(characterPtr->_y);\t\t\t\n\t\t}\n\t\tdisplayCharacter(characterPtr);\t\n\t}\n\n#endif\n\n#if YSize < 20\n\t#define MESSAGE_START 5\n#else\n\t#define MESSAGE_START 6\n#endif\n\n#if defined(END_SCREEN)\n\tvoid gameCompleted(void)\n\t{\n\t\tlevel = 0;\n\t\t\n\t\t_XL_CLEAR_SCREEN();\n        ghostCount = GHOSTS_NUMBER;\n\t\tfillLevelWithCharacters();\n        displayScore();\n\n\t\tplayerFire = 0;\n\t\tskull._x = player._x-4;\n\t\tskull._y = player._y;\t\n\t\tbullet._status = 0;\n\t\tguns = 1;\n\t\twhile(!playerFire && !wallReached(&player))\n\t\t{\n\t\t\t++bulletDirection;\n\t\t\tdisplayBombs();\n\t\t\tfor(ind=0;ind<GHOSTS_NUMBER;++ind)\n\t\t\t{\n\t\t\t\tdance(&ghosts[ind]);\n\t\t\t}\n\t\t\t\n\t\t\tdisplayPlayer(&player);\n\t\t\t\n\t\t\tdance(&skull);\n\t\t\n\t\t\tPRINT_CENTERED_ON_ROW(MESSAGE_START,  YOU_MADE_IT_STRING);\t\t\n\t\t\t#if _XL_SLOW_DOWN_FACTOR>0\n\t\t\t\tfor(ind=0;ind<253U;++ind){};\n\t\t\t#endif\n\t\t\t\t\t\n\t\t\tMOVE_PLAYER();\n\t\t}\n\t}\n#endif\n\n#endif\n\n"
  },
  {
    "path": "src/games/chase/split_files/game_text.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"settings.h\"\n#include \"game_text.h\"\n#include \"character.h\"\n#include \"settings.h\"\n#include \"text_strings.h\"\n\n#include \"cross_lib.h\"\n#include \"init_images.h\"\n\n#define TEXT_COLOR _XL_WHITE\n\nextern uint8_t guns;\nextern Image GUN_IMAGE;\nextern Image SKULL_IMAGE;\n\n#if !defined(_XL_NO_TEXT_COLOR) || defined(__NO_GRAPHICS)\n\t#define SET_COLOR(c) _XL_SET_TEXT_COLOR(c)\n#else\n\t#define SET_COLOR(c)\n#endif\n\n#if XSize<20\n\t#define EXTRA_TINY 1\n#else\n\t#define EXTRA_TINY 0\n#endif\n\n\n#if Y_OFFSET==3\n\t#define SKIP_ROW 1\n#else\n\t#define SKIP_ROW 0\n#endif\n\n#if defined(WIDE) && !defined(TINY_GAME)\n\t#define GUN_IMAGE_X 17\n\t#define GUN_IMAGE_Y 0\n\t#define GHOST_IMAGE_X 13\n\t#define GHOST_IMAGE_Y 0\n\t#define PLAYER_IMAGE_X 16\n\t#define PLAYER_IMAGE_Y (1+SKIP_ROW)\n\t#define LEVEL_X (XSize-2)\n\t#define LEVEL_Y (1+SKIP_ROW)\n#else\n\t#define GUN_IMAGE_X (11-EXTRA_TINY)\n\t#define GUN_IMAGE_Y 0\n\t#define GHOST_IMAGE_X (8-EXTRA_TINY)\n\t#define GHOST_IMAGE_Y 0\n\t#define PLAYER_IMAGE_X (14-EXTRA_TINY)\n\t#define PLAYER_IMAGE_Y 0\n\t#define LEVEL_X (XSize-2)\n\t#define LEVEL_Y 0\n#endif\n\n\n\nextern uint8_t level;\nextern uint8_t lives;\n\nextern uint16_t points;\nextern uint8_t ghostCount;\nextern uint16_t ghostLevel;\nextern uint16_t highScore;\n\nextern Image GHOST_IMAGE;\nextern Image PLAYER_IMAGE;\n\n\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, const char *Text)\n{\n\t_XL_PRINT(((uint8_t) (XSize - strlen((char *)Text))>>1), row, Text);\t\n}\n\n\n#if defined(FULL_GAME)\n\tvoid printKillTheSkull(void)\n\t{\n\t\tPRINT_CENTERED(KILL_THE_SKULL_STRING);\t\n\t\tPRINT_CENTERED_ON_ROW(((uint8_t)YSize)/2+2,DESTROY_MISSILES_STRING);\n\t}\n\t\n#endif\n\n\n\n// TODO: This is SLOW\n#if !defined(TINY_GAME) && !defined(NO_STATS)\n\tvoid displayStatsTitles(void)\n\t{\t\t\t\t\n\t\tSET_COLOR(TEXT_COLOR);\n\n\t\t_draw_stat(GUN_IMAGE_X, GUN_IMAGE_Y, &GUN_IMAGE);\n\t\t_draw_stat(GHOST_IMAGE_X, GHOST_IMAGE_Y, &GHOST_IMAGE);\n\t\t_draw_stat(PLAYER_IMAGE_X, PLAYER_IMAGE_Y, &PLAYER_IMAGE);\n\t}\n\n\t\n\tvoid printGunsStats(void)\n\t{\n\t\tSET_COLOR(TEXT_COLOR);\n\t\t\n\t\t#if defined(WIDE)\n\t\t\t_XL_PRINTD(GUN_IMAGE_X+2,GUN_IMAGE_Y,1,guns);\n\t\t#else\n\t\t\t_XL_PRINTD(GUN_IMAGE_X+1,GUN_IMAGE_Y,1,guns);\n\t\t#endif\n\t}\n#endif\n\n#if !defined(NO_STATS)\n\tvoid printLevelStats(void)\n\t{\t\n\t\tSET_COLOR(TEXT_COLOR);\n\t\n\t\t#if defined(WIDE) && !defined(TINY_GAME)\n\t\t\t_XL_PRINTD(LEVEL_X,LEVEL_Y,2,level);\n\t\t#elif XSize>16\n\t\t\t_XL_PRINTD(LEVEL_X,LEVEL_Y,2,level);\n\t\t#else\n\t\t\t// No space for level\n\t\t#endif\t\n\t}\n\n\n\tvoid printGhostCountStats(void)\n\t{\n\t\tSET_COLOR(TEXT_COLOR);\t\t\n\t\t\n\t\t#if defined(WIDE) && !defined(TINY_GAME)\n\t\t\t_XL_PRINTD(GHOST_IMAGE_X+2,GHOST_IMAGE_Y,1,ghostCount);\n\t\t#else\n\t\t\t_XL_PRINTD(GHOST_IMAGE_X+1,GHOST_IMAGE_Y,1,ghostCount);\t\n\t\t#endif\t\n\t}\n\n\n\tvoid printLivesStats(void)\n\t{\n\t\tSET_COLOR(TEXT_COLOR);\n\t\t\n\t\t#if defined(WIDE) && !defined(TINY_GAME)\n\t\t\t_XL_PRINTD(PLAYER_IMAGE_X+2,PLAYER_IMAGE_Y,2,lives);\n\t\t#else\n\t\t\t_XL_PRINTD(PLAYER_IMAGE_X+1,PLAYER_IMAGE_Y,2,lives);\t\n\t\t#endif\n\t}\t\n\t\n#endif\n\n#if !defined(NO_PRINT) && !defined(TINY_GAME)\n\tvoid printPressKeyToStart(void)\n\t{\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\n\t\tPRINT_CENTERED(PRESS_STRING);\n\t}\t\n#endif\n\n\nvoid displayScore(void)\n{\t\n\tSET_COLOR(TEXT_COLOR);\n\t\n    _XL_PRINTD(!EXTRA_TINY,0,5,points);\t\n}\n\n#if !defined(LESS_TEXT)\t\n\tvoid printLevel(void)\n\t{\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\n\t\t_XL_PRINT(((XSize -7)>>1), (YSize>>1)-2, START_LEVEL_STRING);\n        _XL_PRINTD(((XSize -7)>>1)+6, (YSize>>1)-2, 2, level);\n\t}\n#endif\n\n\n#if !defined(TINY_GAME)\n\tvoid _printScoreOnRow(uint8_t row, uint16_t score)\n\t{\n\t\t_XL_PRINTD((uint8_t) ((XSize)>>1)-3, row, 5, score);\n\t}\t\n\t\n\t#if !defined(LESS_TEXT)\n\tvoid _printScore(uint16_t score)\n\t{\n\t\t_printScoreOnRow((YSize>>1), score);\n\t}\n\t#endif\n#endif\n\n#if !defined(END_SCREEN)\n\tvoid gameCompleted(void)\t\n\t{\n\t\t_XL_CLEAR_SCREEN();\n\t\tPRINT_CENTERED(YOU_MADE_IT_STRING); \n\t}\n#endif\n\n\n#if !defined(LESS_TEXT)\n\tvoid printVictoryMessage(void)\n\t{\n        SET_COLOR(_XL_RED);\n\t\tPRINT_CENTERED(VICTORY_STRING);\n\t}\t\n#endif\n\n\n#if !defined(LESS_TEXT)\t\n\tvoid printDefeatMessage(void)\n\t{\t\t\n        SET_COLOR(_XL_RED);\n\t\tPRINT_CENTERED(DEFEAT_STRING);\n\t}\t\n#endif\n\t\n\t\n#if !defined(TINY_GAME)\nvoid printGameOver(void)\n{\n\tSET_COLOR(_XL_RED);\n\tPRINT_CENTERED(GAME_OVER_STRING);\n}\t\n#endif\n\n\n#if YSize>=21\n    #define AUTHOR_Y_SPACE 1\n#else\n    #define AUTHOR_Y_SPACE 0\n#endif\n\n#if YSize>=20\n\t#define EXTRA_Y 1\n\t#define AUTHOR_Y 4\n\t#define CROSS_CHASE_Y 2\n\t#define INTERLINE 2\n\t#define INSTR_Y_OFFSET 2\n#else\n\t#define EXTRA_Y 0\n\t#define AUTHOR_Y 3\n\t#define CROSS_CHASE_Y 1\n\t#if defined(__Z88DK_SPRITES_GRAPHICS)\n\t\t#define INTERLINE 2\n\t#else\n\t\t#define INTERLINE 1\n\t#endif\n\t#define INSTR_Y_OFFSET 1\n#endif\n\n \n\n\n#if (defined(FULL_GAME) && !defined(NO_HINTS)) || !defined(NO_INITIAL_SCREEN)\n\t#if defined(FULL_GAME) && !defined(NO_HINTS)\n\tvoid _printCrossChase(void)\n\t{\n        SET_COLOR(_XL_RED);\n\t\tPRINT_CENTERED_ON_ROW(CROSS_CHASE_Y, CROSS_CHASE_STRING);\t\t\n\t\tSET_COLOR(TEXT_COLOR);\n\t\t\n\t}\n\t#else\n\t\t#define _printCrossChase() \\\n            SET_COLOR(_XL_RED); \\\n\t\t\tPRINT_CENTERED_ON_ROW(CROSS_CHASE_Y, CROSS_CHASE_STRING);\t\\\n\t\t\tSET_COLOR(TEXT_COLOR);\t\n\t#endif\n#endif\n\n\n#if defined(FULL_GAME) && !defined(NO_HINTS) && XSize>=14\n\tvoid printHints(void)\n\t{\n\t\t_printCrossChase();\n        \n        PRINT_CENTERED_ON_ROW(AUTHOR_Y+1*INTERLINE+EXTRA_Y,  LURE_THE_ENEMIES_STRING);\n        PRINT_CENTERED_ON_ROW(AUTHOR_Y+2*INTERLINE+EXTRA_Y,  INTO_THE_MINES_STRING);\n                    \n\t\tPRINT_CENTERED_ON_ROW(AUTHOR_Y+3*INTERLINE+EXTRA_Y,  USE_THE_GUN_AGAINST_STRING);\n\n\t\tPRINT_CENTERED_ON_ROW(AUTHOR_Y+4*INTERLINE+EXTRA_Y,  THE_SKULL_AND_STRING);\n\n\t\tPRINT_CENTERED_ON_ROW(AUTHOR_Y+5*INTERLINE+EXTRA_Y, MISSILE_BASES_STRING);\t\n\t\t\n\t\t#if YSize>=14\n\t\t\tPRINT_CENTERED_ON_ROW(AUTHOR_Y+6*INTERLINE+EXTRA_Y, FOR_POINTS_AND___STRING);\n\n\t\t\tPRINT_CENTERED_ON_ROW(AUTHOR_Y+7*INTERLINE+EXTRA_Y, EXTRA_POWERUPS__STRING);\n\t\t#endif\n\t}\n#endif\n\n#if !defined(NO_EXTRA_TITLE)\n\n    #define ITEMS_TO_DISPLAY 6\n\n    static const uint8_t item_tile[ITEMS_TO_DISPLAY][2] = \n    {\n        { _GHOST_TILE, _GHOST_COLOR },\n        { _SKULL_TILE, _SKULL_COLOR },\n        { _BOMB_TILE, _BOMB_COLOR },\n        { _GUN_TILE, _GUN_COLOR},\n        { _POWERUP_TILE, _POWERUP_COLOR},\n        { _FREEZE_TILE, _FREEZE_COLOR},\n    };\n\n    static const char item_name[ITEMS_TO_DISPLAY][7] = \n    {\n        _XL_E _XL_N _XL_E _XL_M _XL_Y,\n        _XL_B _XL_O _XL_S _XL_S,\n        _XL_M _XL_I _XL_N _XL_E,\n        _XL_G _XL_U _XL_N,\n        _XL_S _XL_L _XL_O _XL_W,\n        _XL_F _XL_R _XL_E _XL_E _XL_Z _XL_E,\n    };\n\n\n    #define display_items() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        \\\n        for(i=0;i<ITEMS_TO_DISPLAY;++i) \\\n        { \\\n            _XL_DRAW(XSize/2-5,AUTHOR_Y+AUTHOR_Y_SPACE+2+i*INTERLINE, item_tile[i][0], item_tile[i][1]); \\\n            _XL_SET_TEXT_COLOR(_XL_GREEN); \\\n            _XL_PRINT(XSize/2-5+3,AUTHOR_Y+AUTHOR_Y_SPACE+2+i*INTERLINE, (char *)item_name[i]); \\\n        } \\\n    } while(0)\n    \n#endif\n\n#if !defined(NO_INITIAL_SCREEN)\n\tvoid printStartMessage(void)\n\t{\n\t\t_printCrossChase();\n\t\t\n        #if XSize>=16\n\t\tPRINT_CENTERED_ON_ROW(AUTHOR_Y, AUTHOR_STRING);\t\n        #endif\n\n\t\t#if !defined(TINY_GAME)\n\t\t\t_printTopScore();\n\t\t\t\n\t\t\t\n            #if XSize>=16\n                #if !defined(NO_EXTRA_TITLE)\n                    display_items();\n                #else\n                    SET_COLOR(_XL_CYAN);\n\n                    PRINT_CENTERED_ON_ROW(AUTHOR_Y+1*INTERLINE+EXTRA_Y,  LURE_THE_ENEMIES_STRING);\n                    PRINT_CENTERED_ON_ROW(AUTHOR_Y+2*INTERLINE+EXTRA_Y,  INTO_THE_MINES_STRING);\t\t\t\n                #endif\n            #endif\n\t\t\tSET_COLOR(TEXT_COLOR);\t\n\t\t\t\n\t\t#endif\n\n\t\t#if !defined(NO_CONTROL_INSTRUCTIONS) && XSize>=14\n\t\t\tPRINT_CENTERED_ON_ROW(YSize-INSTR_Y_OFFSET, USE_STRING);\n\t\t#endif\n\t}\n#endif\n\n\n\n"
  },
  {
    "path": "src/games/chase/split_files/ghost.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n\n#include \"ghost.h\"\n#include \"settings.h\"\n\nextern uint16_t ghostLevel;\nextern uint8_t level;\nextern uint16_t loop;\n\nextern Character ghosts[GHOSTS_NUMBER];\nextern Character bombs[BOMBS_NUMBER];\n\n\n#if defined(FULL_GAME)\n\nextern uint16_t levelSlowDown;\n\nuint16_t computeGhostSlowDown(void)\n{\n\tif((loop<MAX_GHOST_LOOP) && (ghostLevel<MAX_GHOST_LEVEL))\n\t{\n\t\t#if defined(_XL_TURN_BASED)\n\t\t\treturn levelSlowDown-ghostLevel*8;\t\t\n\t\t#else\n\t\t\treturn levelSlowDown-ghostLevel*16;\n\t\t#endif\n\t}\n\treturn GHOST_MIN_SLOWDOWN;\n}\n#endif\n\n#if defined(FULL_GAME)\n\tvoid decreaseGhostLevel(void)\n\t{\n\t\tif(ghostLevel>GHOST_LEVEL_DECREASE)\n\t\t\tghostLevel-=GHOST_LEVEL_DECREASE;\n\t\telse\n\t\t\tghostLevel=0;\n\t}\n#endif\n\n#if !defined(TINY_GAME)\nvoid displayBombs(void)\n{\n\tuint8_t i;\n\n\tfor(i=0;i<BOMBS_NUMBER;++i)\n\t{\n\t\tdisplayBomb(&bombs[i]);\n\t}\n}\t\n#endif\n\n#if defined(FULL_GAME)\n\tuint8_t firstAlive(void)\n\t{\n\t\tuint8_t i;\n\t\t\n\t\ti=0;\n\t\twhile(i<GHOSTS_NUMBER)\n\t\t{\n\t\t\tif(ghosts[i]._status)\n\t\t\t\treturn i;\n\t\t\t++i;\n\t\t}\n\t\treturn GHOSTS_NUMBER;\n\t}\n#endif\n\n"
  },
  {
    "path": "src/games/chase/split_files/horizontal_missile.c",
    "content": "\n#include \"settings.h\"\n\n#if defined(FULL_GAME) \n\n#include \"level.h\"\n#include \"strategy.h\"\n\n#include \"cross_lib.h\"\n\n#if !defined(TINY_GAME) || defined(_XL_TURN_BASED)\nextern uint16_t loop;\n#endif\nextern uint8_t level;\n\nextern Character leftHorizontalMissile;\nextern Character rightHorizontalMissile;\nextern Character player;\n\nextern uint8_t arrowRange;\nextern uint8_t arrowYPosition;\n\nextern uint8_t isBossLevel;\nextern uint8_t isMissileLevel;\nextern uint8_t isOneMissileLevel;\n\n\tuint8_t _playerInArrowRange(void)\n\t{\n\t\treturn (loop&1 && player._y<=(arrowYPosition+arrowRange) && player._y>=(arrowYPosition-arrowRange));\n\t}\n\t\n\tvoid handle_from_left(void)\n\t{\n\t\tif(leftHorizontalMissile._status)\n\t\t{\n\t\t\tdeleteHorizontalMissile(&leftHorizontalMissile);\n\t\t\tif(leftHorizontalMissile._x==XSize-2)\n\t\t\t{\n\t\t\t\tleftHorizontalMissile._x=0;\n\t\t\t\tleftHorizontalMissile._y =  arrowYPosition;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tADVANCED_LEFT_MISSILE();\n\t\t\t\tif(_playerInArrowRange())\n\t\t\t\t{\n\t\t\t\t\tif(player._x>=leftHorizontalMissile._x)\n\t\t\t\t\t{\n\t\t\t\t\t\t(void) moveCharacter((uint8_t *)&leftHorizontalMissile+Y_MOVE, (uint8_t *)&player+Y_MOVE);\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisplayHorizontalMissile(&leftHorizontalMissile);\n\t\t\t\n\t\t\tif(playerKilledBy(&leftHorizontalMissile))\n\t\t\t{\n\t\t\t\tplayerDies();\n\t\t\t}\n\t\t}\t\t\n\t}\n\t\n\tvoid handle_from_right(void)\n\t{\n\t\tif(rightHorizontalMissile._status)\n\t\t{\n\t\t\tdeleteHorizontalMissile(&rightHorizontalMissile);\n\t\t\tif(rightHorizontalMissile._x==1)\n\t\t\t{\n\t\t\t\trightHorizontalMissile._x= XSize-1;\n\t\t\t\trightHorizontalMissile._y = arrowYPosition;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tADVANCED_RIGHT_MISSILE();\n\t\t\t\tif(_playerInArrowRange())\n\t\t\t\t{\n\t\t\t\t\tif(player._x<= rightHorizontalMissile._x)\t\n\t\t\t\t\t{\n\t\t\t\t\t\t(void) moveCharacter((uint8_t *)&rightHorizontalMissile+Y_MOVE, (uint8_t *)&player+Y_MOVE);\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisplayHorizontalMissile(&rightHorizontalMissile);\t\n\t\t\t\n\t\t\tif(playerKilledBy(&rightHorizontalMissile))\n\t\t\t{\n\t\t\t\tplayerDies();\n\t\t\t}\n\t\t}\t\t\n\t}\n\t\n\tvoid handle_missiles(void)\n\t{\t\n\t\tif(isOneMissileLevel)\n\t\t{\n\t\t\tarrowYPosition = YSize/2;\n\t\t\thandle_from_right();\n\t\t}\t\n\t\telse if(isMissileLevel || isBossLevel)\n\t\t{\n\t\t\tarrowYPosition = HORIZONTAL_MISSILE_OFFSET;\n\t\t\thandle_from_right();\n\t\t\t\n\t\t\tarrowYPosition = YSize-1-HORIZONTAL_MISSILE_OFFSET; \n\t\t\thandle_from_left();\n\t\t}\n\n\t}\n\t\n#endif // defined(FULL_GAME)\n\n"
  },
  {
    "path": "src/games/chase/split_files/init_images.c",
    "content": "\n#include \"tiles.h\"\n#include \"images.h\"\n#include \"init_images.h\"\n\n#include \"settings.h\"\n\n#include \"cross_lib.h\"\n\n\n#if !defined(ANIMATE_PLAYER)\n\textern Image PLAYER_IMAGE;\n#else\n\textern Image PLAYER_DOWN_IMAGE;\n\textern Image PLAYER_UP_IMAGE;\n\textern Image PLAYER_RIGHT_IMAGE;\n\textern Image PLAYER_LEFT_IMAGE;\t\n#endif\n\t\nextern Image GHOST_IMAGE;\nextern Image BOMB_IMAGE;\n\n#if !defined(NO_DEAD_GHOSTS)\n\textern Image DEAD_GHOST_IMAGE;\n#endif\n\n#if !defined(TINY_GAME)\n\textern Image SKULL_IMAGE;\n\textern Image POWERUP_IMAGE;\n\textern Image GUN_IMAGE;\n\textern Image BULLET_IMAGE;\n\textern Image EXTRA_POINTS_IMAGE;\n\t\n\textern Image HORIZONTAL_BRICK_IMAGE;\n\textern Image VERTICAL_BRICK_IMAGE;\n#endif\n\n#if defined(FULL_GAME)\n\textern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\n\textern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\n\textern Image ROCKET_IMAGE;\n\n\textern Image FREEZE_IMAGE;\n\textern Image EXTRA_LIFE_IMAGE;\n\textern Image INVINCIBILITY_IMAGE;\n\textern Image SUPER_IMAGE;\t\n\textern Image CONFUSE_IMAGE;\n\textern Image ZOMBIE_IMAGE;\n\t\n\textern Image BROKEN_BRICK_IMAGE;\n#endif\n\nvoid INIT_IMAGES(void)\n{\n# if !defined(__NO_GRAPHICS)\n\t// Set color data \n\t#if !defined(_XL_NO_COLOR)\n\t\t#if defined(ANIMATE_PLAYER)\n\t\t\tPLAYER_DOWN_IMAGE._color = _PLAYER_COLOR;\n\t\t\tPLAYER_UP_IMAGE._color = _PLAYER_COLOR;\n\t\t\tPLAYER_RIGHT_IMAGE._color = _PLAYER_COLOR;\n\t\t\tPLAYER_LEFT_IMAGE._color = _PLAYER_COLOR;\n\t\t#else\n\t\t\tPLAYER_IMAGE._color = _PLAYER_COLOR;\n\t\t#endif\t\n\t\n\t\tBOMB_IMAGE._color = _BOMB_COLOR;\n\t\tGHOST_IMAGE._color = _GHOST_COLOR;\t\t\n\t\t\n\t\t#if !defined(NO_DEAD_GHOSTS)\n\t\t\tDEAD_GHOST_IMAGE._color = _DEAD_GHOST_COLOR;\n\t\t#endif\n\t\t\n\t\t#if !defined(TINY_GAME)\n\t\t\tSKULL_IMAGE._color = _SKULL_COLOR;\n\t\t\tPOWERUP_IMAGE._color = _POWERUP_COLOR;\n\t\t\tGUN_IMAGE._color = _GUN_COLOR;\n\t\t\tEXTRA_POINTS_IMAGE._color = _EXTRA_POINTS_COLOR;\n\t\t\tBULLET_IMAGE._color = _BULLET_COLOR;\n\t\t\t\n\t\t\tVERTICAL_BRICK_IMAGE._color = _BRICK_COLOR;\n\t\t\tHORIZONTAL_BRICK_IMAGE._color = _BRICK_COLOR;\n\t\t#endif\n\t\t\n\t\t#if defined(FULL_GAME)\n\t\t\tRIGHT_HORIZONTAL_MISSILE_IMAGE._color = _MISSILE_COLOR;\n\t\t\tLEFT_HORIZONTAL_MISSILE_IMAGE._color = _MISSILE_COLOR;\n\t\t\t\n\t\t\tROCKET_IMAGE._color = _ROCKET_COLOR;\n\n\t\t\tFREEZE_IMAGE._color = _FREEZE_COLOR;\n\t\t\tEXTRA_LIFE_IMAGE._color = _EXTRA_LIFE_COLOR;\n\t\t\t\n\t\t\tINVINCIBILITY_IMAGE._color = _INVINCIBILITY_COLOR;\n\t\t\tSUPER_IMAGE._color = _SUPER_COLOR;\n\t\t\tCONFUSE_IMAGE._color = _CONFUSE_COLOR;\n\t\t\tZOMBIE_IMAGE._color = _ZOMBIE_COLOR;\n\t\t\t\n\t\t\tBROKEN_BRICK_IMAGE._color = _BRICK_COLOR;\n\t\t#endif\t\n\t#endif\t\n\n\t// Set Image Data\n\t#if defined(ANIMATE_PLAYER)\n\t\tPLAYER_DOWN_IMAGE._imageData = _PLAYER_DOWN_TILE; //_TILE_0;\n\t\tPLAYER_UP_IMAGE._imageData = _PLAYER_UP_TILE; // _TILE_1;\n\t\tPLAYER_RIGHT_IMAGE._imageData = _PLAYER_RIGHT_TILE; //_TILE_2;\n\t\tPLAYER_LEFT_IMAGE._imageData = _PLAYER_LEFT_TILE; // _TILE_3;\t\n\t#else\n\t\tPLAYER_IMAGE._imageData = _PLAYER_DOWN_TILE;\n\t#endif\n\t\n\tGHOST_IMAGE._imageData = _GHOST_TILE;\n\tBOMB_IMAGE._imageData = _BOMB_TILE;\n\t\n\t#if !defined(NO_DEAD_GHOSTS)\n\t\tDEAD_GHOST_IMAGE._imageData = _DEAD_GHOST_TILE;\n\t#endif\n\t\n\t#if !defined(TINY_GAME)\n\t\tSKULL_IMAGE._imageData = _SKULL_TILE;\n\n\t\tPOWERUP_IMAGE._imageData = _POWERUP_TILE;\n\t\tGUN_IMAGE._imageData = _GUN_TILE;\n\t\tEXTRA_POINTS_IMAGE._imageData = _EXTRA_POINTS_TILE;\n\t\t\n\t\tBULLET_IMAGE._imageData = _BULLET_TILE;\n\t\t\n\t\tVERTICAL_BRICK_IMAGE._imageData = _VERTICAL_BRICK_TILE;\n\t\tHORIZONTAL_BRICK_IMAGE._imageData = _HORIZONTAL_BRICK_TILE;\n\t#endif\n\t\n\t#if defined(FULL_GAME)\n\t\tLEFT_HORIZONTAL_MISSILE_IMAGE._imageData = _LEFT_MISSILE_TILE;\n\t\t\n\t\tRIGHT_HORIZONTAL_MISSILE_IMAGE._imageData = _RIGHT_MISSILE_TILE;\n\t\t\n\t\tROCKET_IMAGE._imageData = _ROCKET_TILE;\n\t\t\n        FREEZE_IMAGE._imageData = _FREEZE_TILE;\n        SUPER_IMAGE._imageData = _SUPER_TILE;\n\n\t\tEXTRA_LIFE_IMAGE._imageData = _PLAYER_DOWN_TILE;\n\t\tINVINCIBILITY_IMAGE._imageData = _INVINCIBILITY_TILE;\n        \n        CONFUSE_IMAGE._imageData = _SKULL_TILE;\n        ZOMBIE_IMAGE._imageData = _GHOST_TILE;\n\t\t\n\t\tBROKEN_BRICK_IMAGE._imageData = _BOMB_TILE;\n\t#endif\n#endif \n}\n\n\n\n"
  },
  {
    "path": "src/games/chase/split_files/item.c",
    "content": "#include \"settings.h\"\n\n#include \"character.h\"\n#include \"item.h\"\n#include \"ghost.h\"\n#include \"game_text.h\"\n\nextern uint16_t points;\n\nextern uint8_t guns;\nextern uint8_t lives;\n\nextern uint8_t level;\n\nextern uint8_t freezeActive;\nextern uint8_t freeze_count_down;\n\n\n#if defined(FULL_GAME)\n\textern uint8_t invincibilityActive;\n\textern uint8_t confuseActive;\n\textern uint8_t zombieActive;\n\t\n\textern uint8_t invincibility_count_down;\n\textern uint8_t confuse_count_down;\n\textern uint8_t zombie_count_down;\n\t\n\textern uint8_t bases_in_completed_levels;\n\textern uint8_t all_skulls_killed_in_completed_levels;\t\n\t\n\textern uint8_t extraLife_present_on_level;\n\textern uint8_t zombie_present_on_level;\n#endif\n\nextern Image DEAD_GHOST_IMAGE;\n\nextern Character ghosts[GHOSTS_NUMBER];\nextern Character bombs[BOMBS_NUMBER];\nextern Character skull;\n\nextern Character player;\n\nextern Item powerUp;\nextern Item gun;\nextern Item extraPoints;\n\n\n#if defined(FULL_GAME)\n\textern Character *chasedEnemyPtr;\n\textern Character chasingBullet;\n\n\textern Item powerUp2;\t\n\t\n\textern Item freeze;\n\n\textern Item invincibility;\n\n\textern Item chase;\n\n\textern Item super;\n\textern Item extraLife;\n\n\textern Item confuse;\n\textern Item zombie;\n#endif\n\t\n#if !defined(TINY_GAME)\n\n\tvoid itemReached(Character * itemPtr)\n\t{\n\t\t_XL_ZAP_SOUND();\n\t\t#if defined(_XL_TURN_BASED)\n\t\t\tdisplayPlayer(&player);\n\t\t#endif\n\t\titemPtr->_status = 0;\n\t\tdisplayScore();\n\t}\n\n\tvoid relocateItem(Character * itemPtr)\n\t{\n\t\t\titemPtr->_status = 1;\n\t\t\t\n\t\t\t#if defined(FULL_GAME)\n\t\t\tdo\n\t\t\t{\n\t\t\t\trelocateCharacter(itemPtr);\n\t\t\t} while(innerWallReached(itemPtr));\t\t\n\t\t\t#else\n\t\t\t\trelocateCharacter(itemPtr);\n\t\t\t#endif\t\n\t}\t\n\t\n\t#if defined(FULL_GAME)\n\t\tvoid _commonPowerUpEffect(void)\n\t\t{\n\t\t\tpoints+=POWER_UP_BONUS;\n\t\t\tdecreaseGhostLevel();\n\t\t\tfreezeActive = 1;\t\n\t\t\tfreeze_count_down += FROZEN_COUNT_DOWN;\t\n\t\t}\n\n\t\tvoid powerUpEffect(void)\n\t\t{\n\t\t\t_commonPowerUpEffect();\n\t\t\tpowerUp._coolDown = POWER_UP_COOL_DOWN;\t\t\n\t\t}\n\n\t\tvoid _gunEffect(void)\n\t\t{\n\t\t\tguns = GUNS_NUMBER;\n\t\t\t#if !defined(NO_STATS)\n\t\t\tprintGunsStats();\t\n\t\t\t#endif\n\t\t\tpoints+=GUN_BONUS;\t\t\n\t\t}\n\n\t\tvoid gunEffect(void)\n\t\t{\n\t\t\t_gunEffect();\n\t\t\tgun._coolDown = GUN_COOL_DOWN;\t\n\t\t}\n\t#else\n\n\t\tvoid powerUpEffect(void)\n\t\t{\n\t\t\tpoints+=POWER_UP_BONUS;\n\t\t\tfreezeActive = 1;\t\n\t\t\tfreeze_count_down += FROZEN_COUNT_DOWN;\t\n\t\t\tpowerUp._coolDown = POWER_UP_COOL_DOWN;\t\t\n\t\t}\n\n\t\tvoid gunEffect(void)\n\t\t{\n\t\t\tguns = GUNS_NUMBER;\n\t\t\t#if !defined(NO_STATS)\n\t\t\tprintGunsStats();\t\n\t\t\t#endif\n\t\t\tpoints+=GUN_BONUS;\t\n\t\t\tgun._coolDown = GUN_COOL_DOWN;\t\n\t\t}\t\t\n\t#endif\n\n\tvoid extraPointsEffect(void)\n\t{\n\t\tpoints+=EXTRA_POINTS+level*EXTRA_POINTS_LEVEL_INCREASE;\n\t\textraPoints._coolDown = SECOND_EXTRA_POINTS_COOL_DOWN;//(EXTRA_POINTS_COOL_DOWN<<4); // second time is harder\t\t\n\t}\n\n\tvoid handle_item(register Item *itemPtr)\n\t{\n\t\t// Manage item\n\t\tif(itemPtr->_character._status == 1)\n\t\t{\t\n\t\t\tif(areCharctersAtSamePosition(&player, (Character *) itemPtr))\n\t\t\t{\n\t\t\t\titemPtr->_effect();\n\t\t\t\titemReached((Character *) itemPtr);\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_blink_draw(itemPtr->_character._x, itemPtr->_character._y, itemPtr->_character._imagePtr, &(itemPtr->_blink));\n\t\t\t}\t\t\n\t\t}\n\t\telse if (itemPtr->_coolDown == 0)\n\t\t{\n\t\t\trelocateItem((Character *) itemPtr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t--(itemPtr->_coolDown);\n\t\t}\n\t}\n\n\tvoid handle_count_down(uint8_t * activeItemFlagPtr, uint8_t * countDownPtr)\n\t{\n\t\tif(*activeItemFlagPtr)\n\t\t{\n\t\t\tif(*countDownPtr<=0)\n\t\t\t{\n\t\t\t\t*activeItemFlagPtr=0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t--(*countDownPtr);\n\t\t\t}\n\t\t}\n\t}\t\n\t\n#endif // !defined(TINY_GAME)\n\n\t\n#if defined(FULL_GAME)\n\tvoid reducePowerUpsCoolDowns(void)\n\t{\n\t\textraPoints._coolDown/=2;\n\t\tinvincibility._coolDown/=2;\n\t\tfreeze._coolDown/=2;\n\t\t_XL_TICK_SOUND();\t\t\n\t}\n#elif !defined(TINY_GAME)\n\tvoid reducePowerUpsCoolDowns(void)\n\t{\n\t\textraPoints._coolDown/=2;\n\t\t_XL_TICK_SOUND();\t\t\n\t}\n#else\t\n#endif\t\n\n\n\t\n#if defined(FULL_GAME)\n\tvoid powerUp2Effect(void)\n\t{\n\t\t_commonPowerUpEffect();\n\t\tpowerUp2._coolDown = POWER_UP2_COOL_DOWN;\t\n\t}\n\n\tvoid _freezeEffect(void)\n\t{\n\t\t_commonPowerUpEffect();\n\t\t_commonPowerUpEffect();\n\t\t_commonPowerUpEffect();\n\t}\n\n\tvoid freezeEffect(void)\n\t{\n\t\t_freezeEffect();\n\t\tfreeze._coolDown = ((uint16_t) (FREEZE_COOL_DOWN)*2);\t\n\t}\n\t\n\t\n\tvoid extraLifeEffect(void)\n\t{\n\t\t++lives;\n\t\tall_skulls_killed_in_completed_levels=1;\n\t\textraLife_present_on_level = 0;\n\t\tprintLivesStats();\t\t\n\t}\n\n\tvoid _invincibilityEffect(void)\n\t{\n\t\tinvincibilityActive = 1;\n\t\tinvincibility_count_down = INVINCIBILITY_COUNT_DOWN;\t\t\t\n\t}\n\t\n\tvoid invincibilityEffect(void)\n\t{\n\t\t_invincibilityEffect();\n\t\tinvincibility._coolDown = ((uint16_t) (INVINCIBILITY_COOL_DOWN)*4);\n\t}\n\t\n\tvoid superEffect(void)\n\t{\n\t\t_freezeEffect();\n\t\t_gunEffect();\n\t\t_invincibilityEffect();\n\t\tsuper._coolDown = ((uint16_t) (SUPER_COOL_DOWN)*8);\n\t}\n\n\tvoid confuseEffect(void)\n\t{\n\t\tconfuseActive = 1;\n\t\tconfuse._coolDown = SECOND_CONFUSE_COOL_DOWN;\n\t\tconfuse_count_down = CONFUSE_COUNT_DOWN;\n\t}\n\t\n\tvoid zombieEffect(void)\n\t{\n\t\tuint8_t i;\n\t\t\n\t\tzombieActive = 1;\n\t\tbases_in_completed_levels = 1;\n\t\tzombie._coolDown = SECOND_ZOMBIE_COOL_DOWN; \n\t\tzombie_count_down = ZOMBIE_COUNT_DOWN;\n\t\tfor(i=0;i<GHOSTS_NUMBER;++i)\n\t\t{\n\t\t\tif(!(ghosts[i]._status))\n\t\t\t{\n\t\t\t\tghosts[i]._imagePtr = &DEAD_GHOST_IMAGE;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid chaseEffect(void)\n\t{\n\t\tunsigned firstAliveIndex;\n\t\t\n\t\tchasingBullet._status = 1;\n\t\tchasingBullet._x = chase._character._x;\n\t\tchasingBullet._y = chase._character._y;\n\t\t\n\t\tchase._coolDown = ((uint16_t)(CHASE_COOL_DOWN)*2);\n\t\t\n\t\tfirstAliveIndex = firstAlive();\n\t\tif(firstAliveIndex == GHOSTS_NUMBER)\n\t\t{\n\t\t\tchasedEnemyPtr = &skull;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tchasedEnemyPtr = &ghosts[firstAliveIndex];\n\t\t}\n\t}\n#endif\n\n"
  },
  {
    "path": "src/games/chase/split_files/level.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#include \"character.h\"\n#include \"item.h\"\n#include \"item.h\"\n#include \"settings.h\"\n#include \"ghost.h\"\n#include \"level.h\"\n\n\n#include \"cross_lib.h\"\n\n\nextern uint8_t level;\n\n#if defined(FULL_GAME)\n    extern uint8_t isBossLevel;\n    extern uint8_t isOneMissileLevel;\n    extern uint8_t isMissileLevel;\n    extern uint8_t isRocketLevel;\n    extern uint8_t isHorizontalWallsLevel;\n#endif\n\nextern Image PLAYER_IMAGE;\nextern Image GHOST_IMAGE;\nextern Image BOMB_IMAGE;\nextern Image DEAD_GHOST_IMAGE;\n\n#if !defined(TINY_GAME)\n    extern Image SKULL_IMAGE;\n    extern Image BULLET_IMAGE;\n    extern Image POWERUP_IMAGE;\n    extern Image GUN_IMAGE;\n    extern Image EXTRA_POINTS_IMAGE;\n#endif\n\nextern Character player; \n\n#if !defined(TINY_GAME)\n    extern Character skull;\n\n    extern Item powerUp;\n    extern Item gun;\n    extern Item extraPoints;\n\n    extern Character bullet;\n\n#endif\n\nextern Character ghosts[GHOSTS_NUMBER];\nextern Character bombs[BOMBS_NUMBER];\n\n\n#if defined(FULL_GAME) \n    extern Item powerUp2;\n\n    extern Item chase;\n    extern Character chasingBullet;\n\n    extern uint8_t verticalWallY;\n    extern uint8_t verticalWallLength;\n\n    extern Image ROCKET_IMAGE;\n\n    extern Image FREEZE_IMAGE;\n    extern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\n    extern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\n    extern Image EXTRA_LIFE_IMAGE;\n    extern Image INVINCIBILITY_IMAGE;\n    extern Image SUPER_IMAGE;\n    extern Image CONFUSE_IMAGE;\n    extern Image ZOMBIE_IMAGE;\n\n    extern Character leftHorizontalMissile;\n    extern Character rightHorizontalMissile;\n\n    extern Item freeze;\n    extern Item extraLife;\n    extern Item invincibility;\n    extern Item super;\n    extern Item confuse;\n    extern Item zombie;\n    \n    extern Character rockets[ROCKETS_NUMBER];\n\n    extern uint8_t rockets_x[ROCKETS_NUMBER];\n    \n    extern uint8_t all_skulls_killed_in_completed_levels;\n#endif\n\n\n#if !defined(NO_WALL) && !defined(TINY_GAME)\n\n    extern Image HORIZONTAL_BRICK_IMAGE;\n    extern Image VERTICAL_BRICK_IMAGE;\n    \n    void DRAW_HORIZONTAL_LINE(uint8_t x,uint8_t y, uint8_t length) \n    {\n        uint8_t i;\n        for(i=0;i<length;++i)\n        {\n            _draw(x+i,y,&HORIZONTAL_BRICK_IMAGE);\n        }\n    }\n\n    void DRAW_VERTICAL_LINE(uint8_t x,uint8_t y, uint8_t length) \n    {\n        uint8_t i;\n        for(i=0;i<length;++i)\n        {\n            _draw(x,y+i,&VERTICAL_BRICK_IMAGE);\n        }        \n    }\n#endif\n\n#if defined(FULL_GAME)\n    void updateInnerWallVerticalData(void)\n    {    \n        uint8_t lvmod = level%5;\n\n        if((lvmod==1)||(lvmod==0))\n        {\n            verticalWallLength = 0;\n        }\n        else\n        {\n            #if defined(WIDE)\n                verticalWallLength = YSize-10+(lvmod-2)*2;\n            #elif YSize<=14\n                verticalWallLength = 4;\n            #else\n                verticalWallLength = YSize-14+(lvmod-2)*2;        \n            #endif\n        }\n\n        verticalWallY = (YSize>>1)-(verticalWallLength>>1);\n    }\n\n    uint8_t oneMissileLevel(void)\n    {\n        return ((level%5)==3) || (level==5);  \n    }\n\n    uint8_t rocketLevel(void)\n    {\n        return (level >= FIRST_ROCKETS_LEVEL) && ((level%5)==2 || (level%5)==3);\n    }\n\n    uint8_t missileLevel(void)\n    {\n        return (level%5)==4;\n    }    \n\n    uint8_t bossLevel(void)\n    {        \n        return !(level%5);\n    }\n    \n    uint8_t horizWallsLevel(void)\n    {\n        return ((level >= FIRST_HORIZONTAL_WALLS_LEVEL) && ((level%5==1) || (level%5==4)));\n    }    \n\n    void initializeAwayFromWall(Character * characterPtr, uint8_t x, uint8_t y, uint8_t status, Image *imagePtr)\n    {\n        do{\n            initializeCharacter(characterPtr, x, y, status, imagePtr);\n            relocateCharacter(characterPtr);\n        } while(innerWallReached(characterPtr));\n    }\n#endif \n\n\n#if defined(BETWEEN_LEVEL)\n\n#if XSize<YSize\n    #define MIN_SIZE XSize\n#else\n    #define MIN_SIZE YSize\n#endif\n\n#if MIN_SIZE>12\n    #define SPIRAL_LOOPS (2*MIN_SIZE-21)\n#else\n    #define SPIRAL_LOOPS (2*MIN_SIZE-18)\n#endif\n\nvoid spiral(register Character *characterPtr)\n{\n    uint8_t i;\n    uint8_t j;\n    \n    characterPtr->_x = XSize/2;\n    characterPtr->_y = YSize/2;\n    for(i=0;i<SPIRAL_LOOPS;++i)\n    {\n        for(j=0;j<i/2;++j)\n            {\n                displayCharacter(characterPtr);        \n                if(i&2)\n                {\n                    ++(*((uint8_t *) characterPtr + (i&1)));\n                }\n                else\n                {\n                    --(*((uint8_t *) characterPtr + (i&1)));                \n                }\n                #if _XL_SLOW_DOWN_FACTOR>0\n                    _XL_SLOW_DOWN(55);\n                #endif\n            }\n    }\n}\n\n#endif\n\n#if defined(TINY_GAME)\n    #define DRAW_BORDERS() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        uint8_t j; \\\n        for(i=0;i<YSize;++i) \\\n        { \\\n            for(j=0;j<XSize;j+=XSize-1) \\\n            { \\\n                _XL_DRAW(j,i,_BOMB_TILE,_XL_YELLOW); \\\n            } \\\n        } \\\n    } \\\n    while(0)\n#else\n    #define DRAW_BORDERS() \\\n        _XL_SET_TEXT_COLOR(WALL_COLOR); \\\n        DRAW_HORIZONTAL_BORDER(0); \\\n        DRAW_HORIZONTAL_BORDER(YSize-1); \\\n        DRAW_VERTICAL_BORDER(0); \\\n        DRAW_VERTICAL_BORDER(XSize-1); \n#endif\n\nvoid fillLevelWithCharacters(void)\n{\n    uint8_t i;\n    uint8_t j;\n    uint8_t count = 0;\n    \n    #if defined(FULL_GAME) && !defined(_XL_NO_COLOR)\n    if(isBossLevel)\n    {\n            HORIZONTAL_BRICK_IMAGE._color = _XL_RED;\n            VERTICAL_BRICK_IMAGE._color = _XL_RED;\n    }\n    else if(level&1)\n    {\n        HORIZONTAL_BRICK_IMAGE._color = _XL_YELLOW;\n        VERTICAL_BRICK_IMAGE._color = _XL_YELLOW;\n    }\n    else\n    {\n        HORIZONTAL_BRICK_IMAGE._color = _XL_CYAN;\n        VERTICAL_BRICK_IMAGE._color = _XL_CYAN;\n    }\n    #endif\n    \n    // #if !defined(TINY_GAME) && !defined(NO_BORDERS)\n        DRAW_BORDERS();\n    // #endif    \n    \n    #if defined(FULL_GAME)\n\n        if(isBossLevel && level) // level 0 is the final screen and ghostCount should remain at GHOSTS_NUMBER\n        {\n            ghostCount = 2+(level>>2);\n            #if !defined(_XL_NO_COLOR)\n                SKULL_IMAGE._color = _XL_CYAN;\n                BOMB_IMAGE._color = _XL_YELLOW;\n            #endif\n        }\n        #if !defined(_XL_NO_COLOR)\n        else\n        {\n            SKULL_IMAGE._color = _XL_YELLOW;\n            BOMB_IMAGE._color = _XL_RED;\n        }\n        #endif\n    \n        if(isRocketLevel || isBossLevel)\n        {\n            for(i=0;i<ROCKETS_NUMBER;i++)\n            {\n                rockets_x[i] = (uint8_t) (i+1)*(XSize/(ROCKETS_NUMBER+1));\n                initializeCharacter(&rockets[i],(uint8_t) rockets_x[i],(uint8_t)(YSize-1),1,&ROCKET_IMAGE);\n                displayRocket(&rockets[i]);\n            }\n        }\n    #endif\n            \n    #if GHOSTS_NUMBER >= 9\n        ROUND_NINE_GHOSTS();\n    #elif GHOSTS_NUMBER==8 \n        #if (!defined(TINY_GAME) || defined(ROUND_ENEMIES)) && !defined(FLAT_ENEMIES)\n            ROUND_EIGHT_GHOSTS();    \n        #else\n            FLAT_EIGHT_GHOSTS();\n        #endif\n    #elif GHOSTS_NUMBER==7\n        ROUND_SEVEN_GHOSTS();\n    #else\n        FLAT_SIX_GHOSTS();\n    #endif\n  \n    #if BOMBS_NUMBER==4\n        FOUR_BOMBS();\n    #elif BOMBS_NUMBER==3    \n        THREE_BOMBS();\n    #elif BOMBS_NUMBER==2\n        TWO_BOMBS();\n    #elif BOMBS_NUMBER==1\n        ONE_BOMB();\n    #endif\n            \n    #if defined(FULL_GAME)\n        initializeAwayFromWall(&(powerUp._character),(XSize>>1),(YSize>>1),1,&POWERUP_IMAGE);\n        initializeAwayFromWall(&(powerUp2._character),(XSize>>1),(YSize>>1),0,&POWERUP_IMAGE);\n        initializeAwayFromWall(&(freeze._character),(XSize>>1),(YSize>>1),0,&FREEZE_IMAGE);\n        initializeAwayFromWall(&(extraPoints._character), (XSize>>1), (YSize>>1), 0, &EXTRA_POINTS_IMAGE);\n        initializeAwayFromWall(&(super._character), (XSize>>1), (YSize>>1), 0, &SUPER_IMAGE);\n        initializeAwayFromWall(&(confuse._character), (XSize>>1), (YSize>>1), 0, &CONFUSE_IMAGE);        \n        initializeAwayFromWall(&(zombie._character), (XSize>>1), (YSize>>1), 0, &ZOMBIE_IMAGE);    \n        \n        initializeAwayFromWall(&(gun._character),(XSize>>1), (YSize>>1), (isBossLevel ? 1 : 0), &GUN_IMAGE);\n\n        initializeAwayFromWall(&player,(uint8_t) ((XSize>>1)+(_XL_RAND()&1)),(uint8_t) ((YSize>>1)+(_XL_RAND()&1)),1,&PLAYER_IMAGE);\n                \n        initializeAwayFromWall(&(extraLife._character), (XSize>>1), (YSize>>1), 0, &EXTRA_LIFE_IMAGE);\n\n        initializeAwayFromWall(&(invincibility._character), (XSize>>1), (YSize>>1), 0, &INVINCIBILITY_IMAGE);\n\n        if(isOneMissileLevel)\n        {\n            initializeCharacter(&rightHorizontalMissile,         XSize-1,                      (YSize>>1), 1,&RIGHT_HORIZONTAL_MISSILE_IMAGE);            \n        }\n        else if(isMissileLevel || isBossLevel)\n        {    \n            initializeCharacter(&rightHorizontalMissile,         XSize-1,         HORIZONTAL_MISSILE_OFFSET, 1,&RIGHT_HORIZONTAL_MISSILE_IMAGE);\n            initializeCharacter(&leftHorizontalMissile,                0, YSize-1-HORIZONTAL_MISSILE_OFFSET, 1,&LEFT_HORIZONTAL_MISSILE_IMAGE);        \n        }        \n        \n        initializeAwayFromWall(&(chase._character), (XSize>>1), (YSize>>1),0,&BULLET_IMAGE);\n        initializeCharacter(&chasingBullet, 0,0, 0, &BULLET_IMAGE);\n    #else\n        #if !defined(TINY_GAME)\n            initializeCharacter(&(powerUp._character),(XSize>>1),(YSize>>1),1,&POWERUP_IMAGE);\n            initializeCharacter(&(gun._character),(XSize>>1), (YSize>>1), 0, &GUN_IMAGE);    \n            initializeCharacter(&(extraPoints._character), (XSize>>1), (YSize>>1), 0, &EXTRA_POINTS_IMAGE);    \n        #endif\n        \n        #if defined(NO_RANDOM_LEVEL) || defined(TINY_GAME) || defined(SIMPLE_RANDOM_LEVEL)\n            initializeCharacter(&player,(uint8_t) ((XSize>>1)),(uint8_t) ((YSize>>1)),1,&PLAYER_IMAGE);            \n        #else\n            initializeCharacter(&player,(uint8_t) ((XSize>>1)+(uint8_t) (_XL_RAND()&1)),\n                                        (uint8_t) ((YSize>>1)+(uint8_t) (_XL_RAND()&1)),1,&PLAYER_IMAGE);    \n        #endif\n    #endif\n    #if !defined(TINY_GAME)\n        displayPlayer(&player);\n            \n        initializeCharacter(&bullet, 0, 0,0,&BULLET_IMAGE);\n\n        #if defined(FULL_GAME)\n            initializeCharacter(&skull,XSize-2,YSize-2, NON_BOSS_SKULL_HITS + (isBossLevel<<3), &SKULL_IMAGE);        \n        #else\n            initializeCharacter(&skull,XSize-2,YSize-2, NON_BOSS_SKULL_HITS, &SKULL_IMAGE);                    \n        #endif\n        \n    #endif\n}\n\n"
  },
  {
    "path": "src/games/chase/split_files/main.c",
    "content": "\n/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"settings.h\"\n\n#include \"character.h\"\n#include \"item.h\"\n#include \"strategy.h\"\n#include \"game_text.h\"\n#include \"level.h\"\n#include \"ghost.h\"\n#include \"move_player.h\"\n#include \"text_strings.h\"\n#include \"init_images.h\"\n#include \"end_screen.h\"\n#include \"variables.h\"\n\n#if !defined(TINY_GAME)\n    #include \"bullet.h\"\n    #include \"skull.h\"\n#endif\n    \n\n#if defined(FULL_GAME)\n    #include \"horizontal_missile.h\"\n    #include \"rocket.h\"\n#endif\n\n\n#if defined(BENCHMARK)\n    #include <stdio.h>\n    #include <time.h>\n#endif\n\n#include \"cross_lib.h\"\n\n// #define DEBUG_ITEMS\n\n#if defined(DEBUG_ITEMS)\n    #if defined(ANIMATE_PLAYER)\n        extern Image PLAYER_DOWN_IMAGE;\n        extern Image PLAYER_UP_IMAGE;\n        extern Image PLAYER_RIGHT_IMAGE;\n        extern Image PLAYER_LEFT_IMAGE;\n    #else\n        extern Image PLAYER_IMAGE;\n    #endif\n    extern Image GHOST_IMAGE;\n    extern Image BOMB_IMAGE;\n    extern Image DEAD_GHOST_IMAGE;\n    extern Image SKULL_IMAGE;\n    extern Image POWERUP_IMAGE;\n    extern Image GUN_IMAGE;\n    extern Image EXTRA_POINTS_IMAGE;\n    extern Image BULLET_IMAGE;\n    extern Image VERTICAL_BRICK_IMAGE;\n    extern Image HORIZONTAL_BRICK_IMAGE;\n    extern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\n    extern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n    extern Image ROCKET_IMAGE;\n    extern Image FREEZE_IMAGE;\n    extern Image SUPER_IMAGE;\n    extern Image EXTRA_LIFE_IMAGE;\n    extern Image INVINCIBILITY_IMAGE;\n    extern Image CONFUSE_IMAGE;\n    extern Image ZOMBIE_IMAGE;\n    extern Image BROKEN_BRICK_IMAGE;\n#endif\n\n// Level\n// The level affects:\n// 1. powerUpCoolDown (how long before a new powerUp is spawned)\n// 2. ghostSlowDown (how much the power up slows the enemies down)\n// 3. skullXCountDown (time needed to activate the skull ghost)\n// 4. skullYCountDown\n// 5. skullSlowDown (how much the skull ghost is slowed-down)\n// 6. skullLoopTrigger (how long before the skull ghost appears)\n\n\n#if !defined(TINY_GAME)\n    void resetItems(void)\n    {\n        gun._coolDown = GUN_COOL_DOWN;\n        powerUp._coolDown = POWER_UP_COOL_DOWN;\n        extraPoints._coolDown = EXTRA_POINTS_COOL_DOWN;        \n        \n        #if defined(FULL_GAME)\n            powerUp2._coolDown = POWER_UP2_COOL_DOWN;\n            freeze._coolDown = FREEZE_COOL_DOWN;                \n            invincibility._coolDown = INVINCIBILITY_COOL_DOWN;\n\n            chase._coolDown = CHASE_COOL_DOWN;\n            \n            super._coolDown = SUPER_COOL_DOWN;\n            extraLife._coolDown = EXTRA_LIFE_COOL_DOWN;\n            \n            confuse._coolDown = CONFUSE_COOL_DOWN;\n            zombie._coolDown = ZOMBIE_COOL_DOWN;                \n        #endif\n    }\n\n    \n    // Constructor for all items\n    void constructItems(void)\n    {\n        powerUp._effect = &powerUpEffect;\n        gun._effect = &gunEffect;\n        extraPoints._effect = &extraPointsEffect;\n        #if defined(FULL_GAME)\n            powerUp2._effect = &powerUp2Effect;        \n            freeze._effect = &freezeEffect;\n            extraLife._effect = &extraLifeEffect;\n            invincibility._effect = &invincibilityEffect;\n            super._effect = &superEffect;\n            confuse._effect = &confuseEffect;\n            zombie._effect = &zombieEffect;\n            chase._effect = &chaseEffect;\n        #endif    \n    }    \n\n#endif\n\n#if !defined(NO_INITIAL_SCREEN)            \nvoid initialScreen(void)\n{    \n    _XL_CLEAR_SCREEN();                    \n    printStartMessage();\n    \n    #if defined(FULL_GAME) && !defined(NO_HINTS) && XSize>=14\n        _XL_WAIT_FOR_INPUT();\n        _XL_CLEAR_SCREEN();\n        printHints();    \n    #endif\n}\n#endif\n\n\n#if defined(FULL_GAME)\n    \n    void handle_special_triggers(void)\n    {\n        // confuse_present_on_level_condition is defined as bases_in_completed_levels\n        zombie_present_on_level = bases_in_completed_levels>=MISSILES_FOR_ZOMBIE;\n        super_present_on_level = all_skulls_killed_in_completed_levels>=SKULLS_FOR_SUPER;\n        // chase_present_on_level_condition is defined as all_skulls_killed_in_completed_levels;\n        extraLife_present_on_level = super_present_on_level && zombie_present_on_level;\n    }\n    \n#endif\n\n#if defined(DEBUG_ITEMS)\n\nvoid DO_DEBUG_ITEMS(void)\n{\n    \n    #if defined(ANIMATE_PLAYER)\n        _draw_stat(1, 0,&PLAYER_DOWN_IMAGE);\n        _draw_stat(1, 1,&PLAYER_UP_IMAGE);\n        _draw_stat(1, 2,&PLAYER_RIGHT_IMAGE);\n        _draw_stat(1, 3,&PLAYER_LEFT_IMAGE);\n    #else\n        _draw_stat(1, 0,&PLAYER_IMAGE);\n    #endif\n    _draw_stat(1, 4,&GHOST_IMAGE);\n    _draw_stat(1, 5,&BOMB_IMAGE);\n    #if !defined(NO_DEAD_GHOST)\n        _draw_stat(1, 6,&DEAD_GHOST_IMAGE);\n    #endif\n    #if !defined(TINY_GAME)\n        _draw_stat(1, 7,&SKULL_IMAGE);\n        _draw_stat(1, 8,&POWERUP_IMAGE);\n        _draw_stat(1, 9,&GUN_IMAGE);\n        _draw_stat(1,10,&EXTRA_POINTS_IMAGE);\n        _draw_stat(1,11,&BULLET_IMAGE);\n        _draw_stat(1,12,&VERTICAL_BRICK_IMAGE);\n        _draw_stat(1,13,&HORIZONTAL_BRICK_IMAGE);\n        #if defined(FULL_GAME)\n            _draw_stat(1,14,&LEFT_HORIZONTAL_MISSILE_IMAGE);\n            _draw_stat(1,15,&RIGHT_HORIZONTAL_MISSILE_IMAGE);\n            #if (YSize+Y_OFFSET)>18\n            _draw_stat(1,16,&ROCKET_IMAGE);\n            _draw_stat(1,17,&FREEZE_IMAGE);\n            _draw_stat(1,18,&SUPER_IMAGE);\n            _draw_stat(1,19,&EXTRA_LIFE_IMAGE);\n            _draw_stat(1,20,&INVINCIBILITY_IMAGE);\n            _draw_stat(1,21,&CONFUSE_IMAGE);\n            _draw_stat(1,22,&ZOMBIE_IMAGE);\n            _draw_stat(1,23,&BROKEN_BRICK_IMAGE);\n            #else\n            _draw_stat(3,7,&ROCKET_IMAGE);\n            _draw_stat(3,8,&FREEZE_IMAGE);\n            _draw_stat(3,9,&SUPER_IMAGE);\n            _draw_stat(3,10,&EXTRA_LIFE_IMAGE);\n            _draw_stat(3,11,&INVINCIBILITY_IMAGE);\n            _draw_stat(3,12,&CONFUSE_IMAGE);\n            _draw_stat(3,13,&ZOMBIE_IMAGE);\n            _draw_stat(3,14,&BROKEN_BRICK_IMAGE);\n            #endif\n        #endif\n    #endif\n    _XL_PRINTD(4,3,5, 1234U);\n    _XL_PRINTD(4,5,5,56789U);\n    // PRINT(4,7,\"abcdefghijklmnopqrstuvwxyz,./|-\");\n    // PRINT(4,9,\"ABCDEFGHIJKLMNOPQRSTUVWXYZ;+{}=\");\n    while(1){};\n}\n#endif\n\n\nint main(void)\n{        \n    _XL_INIT_GRAPHICS();\n\n    _XL_INIT_INPUT();\n\n    _XL_INIT_SOUND();\n\n    highScore = 0;\n    \n    while(1)\n    {\n        INIT_IMAGES();\n        \n        #if !defined(NO_INITIAL_SCREEN)\n            initialScreen();\n            _XL_REFRESH();\n        #else\n            printPressKeyToStart();                \n        #endif\n        // _XL_WAIT_FOR_INPUT();\n        // _XL_CLEAR_SCREEN();\n\n        #if !defined(LESS_TEXT)\n            // highScoreScreen();\n            _XL_REFRESH();\n            _XL_WAIT_FOR_INPUT();\n            _XL_CLEAR_SCREEN();\n        #else\n            highScoreScreen();\n            // _XL_REFRESH();\n            _XL_WAIT_FOR_INPUT();\n            // _XL_CLEAR_SCREEN();\n        #endif\n\n        \n        #if !defined(TINY_GAME)\n            extraLifeThroughPointsCounter = 1;\n        #endif\n        points = 0;\n        level = INITIAL_LEVEL;     \n        lives = LIVES_NUMBER;\n        ghostCount = GHOSTS_NUMBER;\n        #if defined(FULL_GAME)\n            #if defined(DEBUG_ITEMS_IN_GAME)\n                bases_in_completed_levels = 99;\n                all_skulls_killed_in_completed_levels = 99;\n            #else\n                bases_in_completed_levels = 0;\n                all_skulls_killed_in_completed_levels = 0;            \n            #endif            \n        #endif\n        \n        \n        do // Level (Re-)Start\n        {\n            \n            #if defined(FULL_GAME)\n                isBossLevel = bossLevel();\n                isRocketLevel = rocketLevel();\n                isOneMissileLevel = oneMissileLevel();\n                isMissileLevel = missileLevel();\n                ishorizWallsLevel = horizWallsLevel();\n            #endif\n            #if !defined(TINY_GAME) || defined(_XL_TURN_BASED)\n                loop = 0;\n            #endif\n            \n            #if !defined(TINY_GAME)\n        \n                playerFire = 0;\n            #endif\n        \n            #if defined(FULL_GAME)\n                ghostLevel = 0;\n                \n                bases = 0;\n                \n                invincibilityActive = 1;                \n                invincibility_count_down = INITIAL_INVINCIBILITY_COUNT_DOWN;\n                \n                #if !defined(INITIAL_GHOST_FREEZE)\n                    freezeActive = 0;\n                    freeze_count_down = 0;\n                #endif\n                confuseActive = 0;\n                zombieActive = 0; \n                \n                handle_special_triggers();\n                \n                #if !defined(SIMPLE_STRATEGY)\n                    computeStrategy();            \n                #endif\n                                \n            #endif            \n            \n            #if !defined(TINY_GAME)\n                skullActive = 0;\n                \n                guns = 0;\n                \n                resetItems();\n                \n                #if defined(INITIAL_GHOST_FREEZE)\n                    freezeActive = 1;\n                    freeze_count_down = INITIAL_FROZEN_COUNT_DOWN;\n                #endif\n                \n                skullXCountDown = SKULL_COUNT_DOWN;\n                skullYCountDown = SKULL_COUNT_DOWN;        \n                #if !defined(FULL_GAME)\n                    skullSlowDown = INITIAL_GHOST_SLOWDOWN;\n                #endif\n            #endif\n\n            #if !defined(FULL_GAME)\n                #if !defined(TINY_GAME)\n                    ghostSlowDown = INITIAL_GHOST_SLOWDOWN-(uint16_t)level*256;\n                #else\n                    \n                    ghostSlowDown = INITIAL_GHOST_SLOWDOWN;\n                #endif\n            #else\n                levelSlowDown = INITIAL_GHOST_SLOWDOWN-(uint16_t)level*256;\n                ghostSlowDown = computeGhostSlowDown();\n            #endif\n            \n            _XL_CLEAR_SCREEN();\n            #if !defined(LESS_TEXT)\n                // Clear the screen, put cursor in upper left corner\n                printLevel();\n                _XL_SLEEP(1);\n                // _XL_CLEAR_SCREEN();\n            #endif\n                \n            #if defined(FULL_GAME)\n                        \n                arrowRange = computeArrowRange();\n            \n                if(isBossLevel)\n                {\n                    printKillTheSkull();\n                    _XL_SLEEP(1);\n                    _XL_WAIT_FOR_INPUT();\n                }\n                _XL_CLEAR_SCREEN();\n                \n                updateInnerWallVerticalData();\n            #endif\n            \n            printPressKeyToStart();\n            _XL_REFRESH();\n            #if !defined(TINY_GAME)\n            _XL_WAIT_FOR_INPUT();\n            #endif\n            \n            #if !defined(TINY_GAME)\n            _XL_CLEAR_SCREEN();\n            #endif\n            \n            fillLevelWithCharacters();\n            #if !defined(TINY_GAME)\n                constructItems();    \n                \n                #if !defined(NO_STATS)\n                displayStatsTitles();\n                #endif\n            #endif\n            \n            displayScore();        \n            #if !defined(NO_STATS)    \n                printLevelStats();\n                printLivesStats();\n            #endif\n            //\n            #if !defined(TINY_GAME)\n                #if !defined(NO_STATS)\n                printGunsStats();\n                #endif\n                printGhostCountStats();\n\n            #endif        \n            \n            #if defined(DEBUG_ITEMS)\n                DO_DEBUG_ITEMS();\n            #else\n            \n            #if defined(FULL_GAME)\n                #if !defined(BENCHMARK)\n                    while(player._status && ((ghostCount>0 && !isBossLevel) || (skull._status && isBossLevel))) // while alive && there are still ghosts\n                #else\n                    Ticks = clock();\n\n                    while(benchmark_count<BENCHMARK_MAX && player._status && ((ghostCount>0 && isBossLevel) || (skull._status && isBossLevel))) // while alive && there are still ghosts\n                #endif\n            #else\n                while(player._status && (ghostCount>0) )\n            #endif\n            {\n                \n                #if defined(BENCHMARK)\n                    ++benchmark_count;\n                #endif\n                #if defined(DEBUG_END)\n                    //gameCompleted();\n                #endif\n                    \n                #if !defined(_XL_TURN_BASED)\n                    MOVE_PLAYER();                \n                    _DRAW_PLAYER();    \n                #endif\n                        \n                #if defined(FULL_GAME)\n                    handle_rockets();\n                    handle_missiles();\n                #endif\n                \n\n                #if !defined(TINY_GAME)\n                if(points>(extraLifeThroughPointsCounter*EXTRA_LIFE_THROUGH_POINTS))\n                {\n                    ++extraLifeThroughPointsCounter;\n                    _XL_PING_SOUND();\n                    ++lives;\n                    printLivesStats();\n                }\n                #endif\n                \n                #if !defined(FULL_GAME)\n                    if(ghostSlowDown) \n                    {\n                        --ghostSlowDown;\n                    }\n                #endif\n                #if !defined(TINY_GAME)\n                    handle_bullet();\n                #endif\n                #if !defined(TINY_GAME)                        \n\n                    if(!freezeActive)\n                    {\n                        #if defined(FULL_GAME)\n                            if(confuseActive && skullActive && skull._status)\n                            {\n                                chasedByGhosts=&skull;\n                            }\n                            else\n                            {\n                                chasedByGhosts=&player;\n                            }\n                            \n                            chaseCharacter(chasedByGhosts);\n\n                            #if BOMBS_NUMBER==4\n                                if(isBossLevel && ghostCount<=2)\n                                {\n                                    #if defined(SIMPLE_STRATEGY)\n                                        moveTowardCharacter(chasedByGhosts, &bombs[loop&3]);\n                                    #else\n                                        moveTowardCharacter(chasedByGhosts, &bombs[loop&3], (uint8_t) (1+(uint8_t)(loop&3))<<1);\n                                    #endif\n                                }\n                            #endif                            \n                            ++ghostLevel;\n                        #else\n                            chaseCharacter();\n                        #endif\n                        \n                    }\n                    else // Frozen ghosts must be redisplayed anyway\n                    {\n                        // Display ghosts\n\t\t\t\t\t\tfor(ind=0;ind<GHOSTS_NUMBER;++ind)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(!((loop+ind)&7))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdisplayGhost(&ghosts[ind]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n                    }\n                    \n                    if(skull._status)\n                    {\n                        handle_skull();\n                    }\n\n                    // This detects collisions of ghosts that have just moved\n                    if(bullet._status)\n                    {\n                        checkBullet(&bullet);\n                    }\n                    \n                #else\n                    #if !defined(NO_CHASE)\n                        chaseCharacter();\n                    #endif\n                #endif\n                \n                \n                // Check collisions bombs vs ghosts\n                for(ind=0;ind<GHOSTS_NUMBER;++ind)\n                    {\n                        checkBombsVsGhost(&ghosts[ind]);\n                    }\n                \n                #if !defined(TINY_GAME)\n                    handle_extraPoints_item();\n                    handle_gun_item();\n                    handle_powerup_item();\n                    handle_freeze_count_down();                    \n                #endif\n                \n                #if defined(FULL_GAME)\n                    handle_powerup2_item();                    \n                    handle_freeze_item();    \n                    handle_invincibility_item();\n                    handle_invincibility_count_down();                    \n\n                    if(chase_present_on_level_condition)\n                    {\n                        handle_chase_item();\n                        handle_chasing_bullet();                        \n                        if(super_present_on_level)\n                        {\n                            handle_super_item();\n                            if(extraLife_present_on_level)\n                            {\n                                handle_extraLife_item();\n                            }\n                        }\n                    }\n                                        \n                    if(confuse_present_on_level_condition)\n                    {\n                        handle_confuse_item();\n                        handle_confuse_count_down();\n                        if(zombie_present_on_level)\n                        {\n                            handle_zombie_item();\n                            handle_zombie_count_down();    \n                            if(zombieActive && !(loop&15))\n                            {\n                                points+=ZOMBIE_BONUS;\n                                displayScore();\n                                reducePowerUpsCoolDowns();\n                            }\n                        }\n                    }\n                    \n                #endif\n                \n                #if defined(FULL_GAME)\n                    if(wallReached(&player) || \n                       (!invincibilityActive && (playerReachedGhosts() || characterReachedBombs(&player) || innerWallReached(&player) || (ishorizWallsLevel && horizWallsReached())))\n                      )\n                #else\n                    if(wallReached(&player) || playerReachedGhosts() || characterReachedBombs(&player))\n                #endif\n                    {\n                        playerDies();\n                    }\n\n                #if defined(FULL_GAME)\n                    if(invincibilityActive && (loop&1))\n                        {\n                            DELETE_CHARACTER(player._x, player._y);\n                        }    \n                #endif\n                \n                #if defined(FULL_GAME)\n                    SKIP_BOMB_DRAW\n                    {\n                        displayBombs();    \n                    }\n                    SKIP_WALL_DRAW\n                    {                        \n                    \n                        #if defined(FULL_GAME)\n                            ghostSlowDown = computeGhostSlowDown();\n                        #endif\n                        \n                        DRAW_VERTICAL_LINE(XSize/2, YSize/2-(verticalWallLength/2), verticalWallLength);            \n                        if(ishorizWallsLevel)\n                        {                \n                            horizWallsLength = HORIZONTAL_WALLS_INITIAL_LENGTH + (level>>4) + (uint8_t) (loop/HORIZONTAL_WALLS_INCREASE_LOOP);        \n                            DRAW_HORIZONTAL_WALLS(horizWallsLength);    \n                        }                        \n                    }\n                                        \n                #else\n                    SKIP_BOMB_DRAW\n                    {\n                        displayBombs();\n                    }\n                #endif\n                \n\n                #if defined(_XL_TURN_BASED) \n                    #if !defined(EVEN_LOOP_MOVE)\n                    if((loop<TURN_BASED_MAX_LOOP) || loop&1)\n                    #else\n                    if(loop<TURN_BASED_MAX_LOOP)   \n                    #endif\n                    {\n                        MOVE_PLAYER();\n                    }                    \n                    _DRAW_PLAYER();    \n                #endif    \n                #if !defined(TINY_GAME) || defined(_XL_TURN_BASED)\n                    ++loop;\n                #endif\n\n                #if defined(_XL_SLOW_DOWN_FACTOR) && _XL_SLOW_DOWN_FACTOR>0\n                    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n                #endif\n                _XL_REFRESH();\n            }; // end inner while [while (player._alive && ghostCount>0), i.e., exit on death or end of level]\n    \n            #if defined(BENCHMARK)\n                TicksDelta = clock() - Ticks;\n                Sec = (uint16_t) (TicksDelta / CLOCKS_PER_SEC);\n                Milli = ((TicksDelta % CLOCKS_PER_SEC) * 1000) / CLOCKS_PER_SEC;\n                printf (\"\\nTime used: %u.%03u secs = %u ticks\\n\", Sec, Milli, (uint16_t) TicksDelta);    \n                getchar();\n            #endif\n\n            if(player._status) // if level finished\n            {\n                \n                #if defined(FULL_GAME)\n                    _DRAW_PLAYER();\n                    _XL_SLEEP(1);\n                #endif\n                \n                #if defined(BETWEEN_LEVEL)\n                    chasedEnemyPtr = &player;\n                    SHOW_DOWN();\n                #endif\n                \n                #if defined(FULL_GAME)\n                    #if !defined(LESS_TEXT)\n                        printVictoryMessage();\n                    // #else\n                        // _XL_SLEEP(2);\n                        // _XL_CLEAR_SCREEN();\n                    #endif\n                    points+= LEVEL_BONUS;\n                    displayScore();\n                    _XL_SLEEP(1);\n                    // _XL_WAIT_FOR_INPUT();\n\n                #endif            \n\n                ghostCount = GHOSTS_NUMBER;\n\n                #if defined(FULL_GAME)            \n                    if(isBossLevel)\n                    {    \n                        all_skulls_killed_in_completed_levels = 1;\n                        bases_in_completed_levels/=2;\n                    }\n                    else\n                    {\n                        if(!skull._status)\n                        {\n                            ++all_skulls_killed_in_completed_levels;\n                        }\n                        bases_in_completed_levels+=bases;\n                    }\n                #endif\n                #if !defined(TINY_GAME)\n                ++level;\n                #endif\n            }\n            else // if dead\n            {        \n                #if defined(FULL_GAME) && (defined(END_SCREEN) || defined(DANCE))\n                    for(bulletDirection=0;bulletDirection<30;++bulletDirection)\n                    {\n                        for(ind=0;ind<GHOSTS_NUMBER;++ind)\n                        {\n                            if(ghosts[ind]._status)\n                                dance(&ghosts[ind]);\n                        }\n                    }\n                #endif\n                \n                #if defined(BETWEEN_LEVEL)\n                    chasedEnemyPtr = &skull;    \n                #endif\n                \n                if(--lives>0)\n                {\n                    player._status = 1;\n                }\n            }\n            #if defined(BETWEEN_LEVEL)\n                spiral(chasedEnemyPtr);\n                _XL_SLEEP(2);\n            #endif                \n            \n            #endif\n        } while (player._status && (level<(FINAL_LEVEL+1))); // lives left and not completed game game \n            \n        // _XL_SLEEP(2);\n        if(level==FINAL_LEVEL+1) // if completed game\n        {\n            // _XL_WAIT_FOR_INPUT();\n            #if !defined(NO_GAME_COMPLETED)\n\t\t\t\tgameCompleted();\n\t\t\t#endif\n            #if !defined(NO_SLEEP)\n                _XL_SLEEP(2);\n            #else\n                _XL_WAIT_FOR_INPUT();\n            #endif\n        }\n\n        // GAME OVER    \n        _XL_CLEAR_SCREEN();\n        #if !defined(TINY_GAME)\n        displayScore();\n        printGameOver();\n        _XL_WAIT_FOR_INPUT();\n\n        #endif\n\n        \n        if(points>highScore)\n        {\n            highScore = points;\n        }\n        \n    } // while(1) -> restart from the beginning\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "src/games/chase/split_files/move_player.c",
    "content": "\n#include \"settings.h\"\n#include \"move_player.h\"\n#include \"character.h\"\n#include \"skull.h\"\n#include \"definitions.h\"\n\n\nextern Character player;\n\n#if !defined(TINY_GAME)\n    extern uint8_t skullXCountDown;\n    extern uint8_t skullYCountDown;\n    extern uint8_t playerFire;\n    extern Character bullet;\n    extern uint8_t guns;\n    extern uint8_t playerDirection;\n#endif\n\n#if defined(FULL_GAME)\n    extern uint8_t player_invincibility;\n    // extern uint8_t playerBlink;    \n#endif\n\n#if !defined(TINY_GAME) \n    #define _DO_MOVE_UP \\\n        deletePlayer(&player); \\\n        --player._y; \\\n        SHOW_UP(); \\\n        skullYCountDown = SKULL_COUNT_DOWN; \\\n        playerDirection = UP;\n    #define _DO_MOVE_DOWN \\\n        deletePlayer(&player); \\\n        ++player._y; \\\n        SHOW_DOWN(); \\\n        skullYCountDown = SKULL_COUNT_DOWN; \\\n        playerDirection = DOWN;\n    #define _DO_MOVE_LEFT \\\n        deletePlayer(&player); \\\n        --player._x; \\\n        SHOW_LEFT(); \\\n        skullXCountDown = SKULL_COUNT_DOWN; \\\n        playerDirection = LEFT;\n    #define _DO_MOVE_RIGHT \\\n        deletePlayer(&player); \\\n        ++player._x; \\\n        SHOW_RIGHT(); \\\n        skullXCountDown = SKULL_COUNT_DOWN; \\\n        playerDirection = RIGHT;\n#else\n    #define _DO_MOVE_UP \\\n        deletePlayer(&player); \\\n        --player._y; \\\n        SHOW_UP();\n        \n    #define _DO_MOVE_DOWN \\\n        deletePlayer(&player); \\\n        ++player._y; \\\n        SHOW_DOWN();\n        \n    #define _DO_MOVE_LEFT \\\n        deletePlayer(&player); \\\n        --player._x; \\\n        SHOW_LEFT();\n        \n    #define _DO_MOVE_RIGHT \\\n        deletePlayer(&player); \\\n        ++player._x; \\\n        SHOW_RIGHT();\n#endif\n\n#if defined(__NO_PRINT)\n    void MOVE_PLAYER(void) \n    {\n    }\n#else\n    void MOVE_PLAYER(void)\n    {\n        uint8_t input = _XL_INPUT();\n        \n        if(_XL_UP(input))\n        {\n            _DO_MOVE_UP\n        }\n        else if(_XL_DOWN(input))\n        {\n            _DO_MOVE_DOWN\n        }\n        else if(_XL_LEFT(input))\n        {\n            _DO_MOVE_LEFT\n        }\n        else if(_XL_RIGHT(input))\n        {\n            _DO_MOVE_RIGHT\n        }\n        #if !defined(TINY_GAME)\n        else if(_XL_FIRE(input) && guns>0 && !bullet._status)\n        {\n            playerFire = 1;\n        }\n        #endif\n    }\n#endif\n\n"
  },
  {
    "path": "src/games/chase/split_files/rocket.c",
    "content": "\n#include \"settings.h\"\n\n\n#if defined(FULL_GAME)\n\n#include \"character.h\"\n#include \"level.h\"\n\n\n#include \"cross_lib.h\"\n\n\nextern Character rockets[ROCKETS_NUMBER];\n\nextern uint8_t ghostCount;\nextern uint8_t isRocketLevel;\nextern uint8_t isBossLevel;\n\n\tvoid handle_rockets(void)\n\t{\t\n\t\tif((ghostCount<=MAX_GHOST_COUNT_FOR_ROCKETS && isRocketLevel) || isBossLevel)\n\t\t{ \n\t\t\tuint8_t i;\n\n\t\t\tfor(i=0;i<ROCKETS_NUMBER;++i)\n\t\t\t{\n\t\t\t\tif(rockets[i]._status)\n\t\t\t\t{\n\t\t\t\t\tif(playerKilledBy(&rockets[i]))\n\t\t\t\t\t{\n\t\t\t\t\t\tplayerDies();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t#if defined(TURNED_BASED)\n\t\t\t\t\tif(1)\n\t\t\t\t\t#else\n\t\t\t\t\tif(_XL_RAND()&1)\n\t\t\t\t\t#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tdeleteRocket(&rockets[i]);\n\t\t\t\t\t\t--(rockets[i]._y);\n\t\t\t\t\t}\n\n\t\t\t\t\tdisplayRocket(&rockets[i]);\t\t\t\n\t\t\t\t\tif(rockets[i]._y<=1)\n\t\t\t\t\t{\t\n\t\t\t\t\t\tdeleteRocket(&rockets[i]);\n\t\t\t\t\t\trockets[i]._x = (1+i)*(XSize/(ROCKETS_NUMBER+1));\n\t\t\t\t\t\trockets[i]._y = YSize-2;\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n#endif // defined(FULL_GAME)\n\n"
  },
  {
    "path": "src/games/chase/split_files/skull.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n#if !defined(TINY_GAME)\n\n#include \"settings.h\"\n\n#include \"skull.h\"\n#include \"level.h\"\n#include \"strategy.h\"\n\n#include \"cross_lib.h\"\n\nextern uint8_t level;\n#if !defined(TINY_GAME) || defined(_XL_TURN_BASED)\nextern uint16_t loop;\n#endif\nextern uint16_t skullSlowDown;\nextern uint8_t skullXCountDown;\nextern uint8_t skullYCountDown ;\n\nextern uint16_t ghostLevel;\n\nextern Character skull;\nextern Character player;\n\nextern uint8_t skullActive;\n\nextern uint8_t isBossLevel;\n\n#if defined(FULL_GAME)\n\textern uint8_t confuseActive;\n#endif\n\n\n#if defined(FULL_GAME)\n\nextern uint16_t levelSlowDown;\n\n\nuint16_t computeSkullSlowDown(void)\n{\n\tif(loop<MAX_SKULL_LOOP)\n\t{\n\t\t#if defined(_XL_TURN_BASED)\n\t\t\treturn levelSlowDown - ghostLevel*8;\t\t\t\t\n\t\t#else\n\t\t\treturn levelSlowDown - ghostLevel*16;\t\t\n\t\t#endif\n\t}\n\treturn SKULL_MIN_SLOWDOWN; // You must die!\n}\n#endif\n\n\n// Redability macros\n#define INACTIVITY_COUNT_DOWN_REACHED ((skullXCountDown==0) || (skullYCountDown==0))\n#define GHOST_COUNT_TRIGGER_REACHED (ghostCount<=SKULL_TRIGGER)\n#define BOSS_LOOP_TRIGGER_REACHED (loop>=SKULL_LOOP_TRIGGER)\n\n#define NON_BOSS_TRIGGER_REACHED (INACTIVITY_COUNT_DOWN_REACHED || GHOST_COUNT_TRIGGER_REACHED)\n\n#define SKULL_RAND_CONDITION (_XL_RAND()>skullSlowDown)\n\nvoid handle_skull(void)\n{\n\tif(!skullActive)\n\t{\t\t\n\t\t#if defined(FULL_GAME)\n\t\tif(((!isBossLevel && NON_BOSS_TRIGGER_REACHED) || \n\t\t\t (isBossLevel && BOSS_LOOP_TRIGGER_REACHED)))\n\t\t#else\n\t\tif(NON_BOSS_TRIGGER_REACHED)\n\t\t#endif\n\t\t{\n\t\t\tskullActive = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t--skullXCountDown;\n\t\t\t--skullYCountDown;\n\t\t}\n\t}\n\telse\n\t{ \t\n\t\t#if defined(FULL_GAME)\n\t\t\tskullSlowDown = computeSkullSlowDown();\n\t\t#else\n\t\t\t--skullSlowDown;\n\t\t#endif\n\n\t\tif(SKULL_RAND_CONDITION)\n\t\t{\n\t\t\t// _XL_TOCK_SOUND();\n\t\t\t#if defined(FULL_GAME)\n\t\t\t\tif(!confuseActive || !(loop&3))\n\t\t\t\t{\n\t\t\t\t\t#if !defined(SIMPLE_STRATEGY)\n\t\t\t\t\t\tmoveTowardCharacter(&player, &skull, 4);\n\t\t\t\t\t#else\n\t\t\t\t\t\tmoveTowardCharacter(&player, &skull);\t\t\t\t\t\t\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t#else\n\t\t\t\tmoveTowardCharacter(&skull);\n\t\t\t#endif\n\t\t}\n        #if defined(FULL_GAME)\n        else\n        {\n            displayCharacter(&skull);\n        }\n        #endif\n\t\t#if defined(FULL_GAME)\n\t\tif (playerKilledBy(&skull))\n\t\t#else\n\t\tif(areCharctersAtSamePosition(&skull, &player))\n\t\t#endif\n\t\t{\n\t\t\tplayerDies();\n\t\t}\n\t}\n}\n\n\n#endif\n\n"
  },
  {
    "path": "src/games/chase/split_files/strategy.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"settings.h\"\n#include \"character.h\"\n#include \"strategy.h\"\n\n#include \"cross_lib.h\"\n\nextern uint8_t level;\n#if !defined(TINY_GAME) || defined(_XL_TURN_BASED)\nextern uint16_t loop;\n#endif\nextern uint8_t ghostCount;\n\nextern Character player; \nextern Character ghosts[GHOSTS_NUMBER];\n\nextern uint8_t strategyArray[GHOSTS_NUMBER];\n\nextern uint16_t ghostSlowDown;\n\n#if defined(FULL_GAME)\n    extern uint8_t zombieActive;\n#endif\n\n\nuint8_t moveCharacter(register uint8_t *hunterOffsetPtr, register uint8_t *preyOffsetPtr)\n{\n    if((uint8_t) *((uint8_t *)hunterOffsetPtr) < (uint8_t) *((uint8_t *)preyOffsetPtr))\n    {\n        ++(*((uint8_t *) hunterOffsetPtr));\n    }\n    else if((uint8_t) *((uint8_t *) hunterOffsetPtr) > (uint8_t) *((uint8_t *)preyOffsetPtr))\n    {\n        --(*((uint8_t *) hunterOffsetPtr));\n    }    \n    else\n    {\n        return 0;\n    }\n    return 1;\n}\n\n\n#if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\n    uint8_t chaseXStrategy(Character* hunterPtr, Character* preyPtr)\n    {\n        // deleteGhost(hunterPtr);\n\t\tuint8_t x = hunterPtr->_x;\n\t\t// uint8_t y = hunterPtr->_y;\n\n\t\t\n        if(moveCharacter((uint8_t *)hunterPtr + X_MOVE, \n                         (uint8_t *)preyPtr + X_MOVE))\n        {\n\t\t\t_XL_DELETE(x,hunterPtr->_y);\n            return 1;\n        }\n        else \n\t\t{\n\t\t\tuint8_t y = hunterPtr->_y;\n\n\t\t\tif(moveCharacter((uint8_t *)hunterPtr + Y_MOVE, \n                                 (uint8_t *)preyPtr + Y_MOVE))\n\t\t\t{\n\t\t\t\t_XL_DELETE(x,y);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n    }\n\n    uint8_t chaseYStrategy(Character* hunterPtr, Character* preyPtr)\n    {\n        // deleteGhost(hunterPtr);\n\t\tuint8_t y = hunterPtr->_y;\n\n        if(moveCharacter((uint8_t *)hunterPtr + Y_MOVE, \n                         (uint8_t *)preyPtr + Y_MOVE))\n        {\n\t\t\t_XL_DELETE(hunterPtr->_x,y);\n\n            return 1;\n        }\n        else\n        {\n\t\t\tuint8_t x = hunterPtr->_x;\n\n            if(moveCharacter((uint8_t *)hunterPtr + X_MOVE, \n                                 (uint8_t *)preyPtr + X_MOVE))\n\t\t\t{\n\t\t\t\t_XL_DELETE(x,y);\n\t\t\t\treturn 1;\n\t\t\t}\n        }\n\t\treturn 0;\n    }\n#endif\n\n\n// strategy: \n// 4 means do no prefer horizontal to vertical movement\n// 0 means always horizontal\n// 9 means always vertical\n#if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\n    uint8_t moveTowardCharacter(Character* preyPtr, Character *hunterPtr, uint8_t strategy)\n    {\n        if((_XL_RAND()&7) > strategy) // Select blind chase strategy\n            { // 0 - 4\n                if(chaseXStrategy(hunterPtr, preyPtr))\n\t\t\t\t{\n\t\t\t\t\tdisplayGhost(hunterPtr);\n\t\t\t\t}\treturn 1;\n            }\n        else\n            { // 5 - 9\n                if(chaseYStrategy(hunterPtr, preyPtr))\n\t\t\t\t{\n\t\t\t\t\tdisplayGhost(hunterPtr);\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n            }\n\t\treturn 0;\n    }\n#elif defined(FULL_GAME) && defined(SIMPLE_STRATEGY)\n    uint8_t moveTowardCharacter(Character* preyPtr, Character *hunterPtr)\n    {\n        uint8_t offset = (uint8_t) _XL_RAND()&1;\n        \n\n\t\tuint8_t x = hunterPtr->_x;\n\t\tuint8_t y = hunterPtr->_y;\n        if(moveCharacter((uint8_t *)hunterPtr + offset, \n                      (uint8_t *)preyPtr + offset))\n\t\t{\n\t\t\t_XL_DELETE(x,y);\n\t\t\tdisplayGhost(hunterPtr);\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n    }    \n#elif !defined(TINY_GAME)\n    uint8_t moveTowardCharacter(Character *hunterPtr)\n    {\n        uint8_t offset = (uint8_t) _XL_RAND()&1;\n        \n\t\tuint8_t x = hunterPtr->_x;\n\t\tuint8_t y = hunterPtr->_y;\n        if(moveCharacter((uint8_t *)hunterPtr + offset,\n                      (uint8_t *)(&player) + offset))\n\t\t{\n\t\t\t_XL_DELETE(x,y);\n\t\t\tdisplayGhost(hunterPtr);\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t}\n#else\n    void moveTowardCharacter(Character *hunterPtr)\n    {\n        uint8_t offset = (uint8_t) _XL_RAND()&1;\n        \n\t\tdeleteGhost(hunterPtr)\n        moveCharacter((uint8_t *)hunterPtr + offset,(uint8_t *)(&player) + offset);\n\t\t\t// return 1;\n\t\t// }\n\t\t// return 0;\n    }\n#endif\n\n\n// #if !defined(TINY_GAME) \n#if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\nvoid computeStrategy(void)\n{\n    uint8_t i;\n    uint8_t skew = level / 8;\n    \n    for(i=5; i<GHOSTS_NUMBER; ++i) // 3 (if total=8)\n    {\n        strategyArray[i] = 4+skew; // 4,5,6 \n        strategyArray[9-i] = 2-skew; // 2,1,0\n            \n    }\n    strategyArray[0] = 3;\n    strategyArray[1] = 3;                \n}\n#endif\n\n#define GHOST_RANDOM_CONDITION (_XL_RAND()>ghostSlowDown)\n\n\n// #if defined(FULL_GAME)\n// Ghosts move to new positions if they get their chanche\n#if defined(FULL_GAME)\nvoid chaseCharacter(Character *preyPtr)\n#else\nvoid chaseCharacter(void)    \n#endif\n{\n    uint8_t i;\n    \n    _XL_WAIT_VSYNC();\n    #if defined(DEBUG_GHOST_DISPLAY)\n        SET_DEBUG_BORDER();\n    #endif\n    for(i=0;i<GHOSTS_NUMBER;++i)\n    {\n        #if defined(FULL_GAME)\n            if((ghosts[i]._status || (zombieActive && loop&1)) && GHOST_RANDOM_CONDITION)\n        #else\n            if((ghosts[i]._status) && GHOST_RANDOM_CONDITION)    \n        #endif\n            {\n                #if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\n                    if(!moveTowardCharacter(preyPtr, &ghosts[i], strategyArray[i]) || !((loop+i)&7))\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayGhost(&ghosts[i]);\n\t\t\t\t\t}\n                #elif defined(FULL_GAME) && defined(SIMPLE_STRATEGY)\n                    if(!moveTowardCharacter(preyPtr, &ghosts[i]) || !(loop&7))\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayGhost(&ghosts[i]);\n\t\t\t\t\t}\n                #else\n                    moveTowardCharacter(&ghosts[i]);    \n                #endif\n            }\n            #if !defined(TINY_GAME)\n            else\n            {\n\t\t\t\t// Re-display()\n\t\t\t\tif(!((loop+i)&7))\n\t\t\t\t{\n\t\t\t\t\tdisplayGhost(&ghosts[i]);\n\t\t\t\t}\n            }\n            #else\n            displayGhost(&ghosts[i]);\n            #endif\n    }\n    #if defined(DEBUG_GHOST_DISPLAY)\n        UNSET_DEBUG_BORDER();\n    #endif\n}\n\n"
  },
  {
    "path": "src/games/chase/strategy.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n \n#ifndef _STRATEGY\n#define _STRATEGY\n\n\n#define X_MOVE 0\n#define Y_MOVE 1\n\n#include \"character.h\"\n\n// Required by horizontal missile\n\nuint8_t moveCharacter(uint8_t *hunterOffsetPtr, uint8_t *preyOffsetPtr);\n\n#if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\n\tuint8_t chaseXStrategy(Character* hunterPtr, Character* preyPtr);\n\tuint8_t chaseYStrategy(Character* hunterPtr, Character* preyPtr);\n#endif\n\n#if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\n\tuint8_t moveTowardCharacter(Character *preyPtr, Character *hunterPtr, uint8_t strategy);\n#elif defined(FULL_GAME) && defined(SIMPLE_STRATEGY)\n\tuint8_t moveTowardCharacter(Character *preyPtr, Character *hunterPtr);\n#elif !defined(TINY_GAME)\n\tuint8_t moveTowardCharacter(Character *hunterPtr);\n#else\n\tvoid moveTowardCharacter(Character *hunterPtr);\n\n#endif\n\n#if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\n\tvoid computeStrategy(void);\n#endif\n\n#if defined(FULL_GAME)\n\tvoid chaseCharacter(Character *preyPtr);\t\n#else\n\tvoid chaseCharacter(void);\t\n#endif\n\t\n#endif // _STRATEGY\n\n"
  },
  {
    "path": "src/games/chase/text_strings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS CHASE by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n\n#ifndef _TEXT_STRINGS_H\n#define _TEXT_STRINGS_H\n\n#if defined(TINY_GAME)\n    #define AUTHOR_STRING \"FABRIZIO CARUSO\"\n#else\n    #define AUTHOR_STRING \"FABRIZIO CARUSO\"\n#endif\n\n#if defined(TINY_GAME) || XSize<=22\n    #define CROSS_CHASE_STRING \"CHASE\"\n\t// #define CROSS_LEN 11\n#else\n    #define CROSS_CHASE_STRING \"C H A S E\"\n\n\t// #define CROSS_LEN 20\n\n#endif\n#define THE_STRING _XL_t _XL_h _XL_e\n#define SKULL_STRING _XL_s _XL_k _XL_u _XL_l _XL_l\n#define MISSILE_STRING _XL_m _XL_i _XL_s _XL_s _XL_i _XL_l _XL_e\n#define MISSILES_STRING  MISSILE_STRING _XL_s\n#define AND_STRING _XL_a _XL_n _XL_d\n#define KILL_THE_SKULL_STRING _XL_DOWN_KEY _XL_i _XL_l _XL_l _XL_SPACE THE_STRING _XL_SPACE SKULL_STRING\n\n#if XSize<=22\n    #define DESTROY_MISSILES_STRING _XL_D _XL_e _XL_s _XL_t _XL_r _XL_o _XL_y _XL_SPACE MISSILES_STRING\n\t#define DESTROY_LEN 16\n#else\n    #define DESTROY_MISSILES_STRING _XL_D _XL_e _XL_s _XL_t _XL_r _XL_o _XL_y _XL_SPACE THE_STRING _XL_SPACE MISSILES_STRING\n\t#define DESTROY_LEN 20\n#endif\n#define LURE_THE_ENEMIES_STRING \"LURE THE ENEMIES\"\n#define INTO_THE_MINES_STRING   \"INTO THE MINES\"\n#define SCORE_STRING _XL_S _XL_C _XL_O _XL_R _XL_E\n#define LEVEL_STRING _XL_RIGHT_KEY _XL_E _XL_V _XL_E _XL_RIGHT_KEY\n#define START_LEVEL_STRING LEVEL_STRING _XL_SPACE \n#define USE_THE_GUN_AGAINST_STRING _XL_S _XL_h _XL_o _XL_o _XL_t _XL_SPACE _XL_a _XL_t\n#define THE_SKULL_AND_STRING THE_STRING _XL_SPACE SKULL_STRING _XL_SPACE AND_STRING\n#define MISSILE_BASES_STRING MISSILE_STRING _XL_SPACE _XL_b _XL_a _XL_s _XL_e _XL_s\n#define FOR_POINTS_AND___STRING _XL_f _XL_o _XL_r _XL_SPACE _XL_p _XL_o _XL_i _XL_n _XL_t _XL_s\n#define EXTRA_POWERUPS__STRING AND_STRING _XL_SPACE _XL_i _XL_t _XL_e _XL_m _XL_s\n\n\n#if defined(LESS_TEXT)\n    #define PRESS_STRING _XL_G _XL_O\n\t#define PRESS_LEN 2\n#else\n    #if !defined(_XL_NO_JOYSTICK)\n        #define PRESS_STRING _XL_P _XL_r _XL_e _XL_s _XL_s _XL_SPACE _XL_f _XL_i _XL_r _XL_e\n\t\t#define PRESS_LEN 10\n    #else\n        #define PRESS_STRING _XL_P _XL_r _XL_e _XL_s _XL_s _XL_SPACE _XL_k _XL_e _XL_y\n\t\t#define PRESS_LEN 9\n    #endif\n#endif\n\n#define GAME_OVER_STRING _XL_G _XL_A _XL_M _XL_E _XL_SPACE _XL_O _XL_V _XL_E _XL_R\n#define YOU_MADE_IT_STRING THE_STRING _XL_SPACE _XL_E _XL_N _XL_D\n\n#define DEFEAT_STRING _XL_Y _XL_o _XL_u _XL_SPACE _XL_l _XL_o _XL_s _XL_t\n#define VICTORY_STRING _XL_Y _XL_o _XL_u _XL_SPACE _XL_w _XL_o _XL_n\n#define EXTRA_LIFE_STRING _XL_E _XL_x _XL_t _XL_r _XL_a _XL_SPACE _XL_l _XL_i _XL_f _XL_e\n\n#define _USE_STRING _XL_U _XL_s _XL_e\n\n#if defined(_XL_ARROW_KEYS)\n    #define USE_STRING _USE_STRING _XL_SPACE \"ARROWS\"\n\t#define USE_LEN 10\n#elif !defined(_XL_NO_JOYSTICK)\n    #define USE_STRING _USE_STRING _XL_SPACE THE_STRING _XL_SPACE _XL_j _XL_o _XL_y _XL_s _XL_t _XL_i _XL_c _XL_k\n\t#define USE_LEN 16\n#elif defined(TINY_GAME) \n    #define USE_STRING _USE_STRING _XL_SPACE _XL_UP_KEY _XL_LEFT_KEY _XL_DOWN_KEY _XL_RIGHT_KEY\n\t#define USE_LEN 8\n#elif XSize<=16\n    #define USE_STRING _USE_STRING _XL_SPACE _XL_UP_KEY _XL_LEFT_KEY _XL_DOWN_KEY _XL_RIGHT_KEY _XL_SPACE _XL_S _XL_P _XL_A _XL_C _XL_E\t\n\t#define USE_LEN 14\n#else\n    #define USE_STRING \"USE \" _XL_UP_KEY _XL_LEFT_KEY _XL_DOWN_KEY _XL_RIGHT_KEY \"  SPACE\"\n\t#define USE_LEN 17\n#endif\t\n\n\n#endif // _TEXT_STRINGS_H\n\n"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,51"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile1.txt",
    "content": "12,30,12,51,45,12,18,51"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile12.txt",
    "content": "12,12,28,12,12,14,12,12"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile19.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile2.txt",
    "content": "12,26,12,31,44,12,10,10"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile20.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile21.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile22.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile23.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile24.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile3.txt",
    "content": "12,22,12,62,13,12,20,20"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile4.txt",
    "content": "33,30,33,51,33,45,33,30"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile5.txt",
    "content": "30,33,51,45,45,51,33,30"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile6.txt",
    "content": "33,30,33,51,51,45,33,30"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile7.txt",
    "content": "30,33,51,33,33,18,18,12"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/games/chase/tiles/6x8/tile9.txt",
    "content": "0,32,31,40,56,32, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,51,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile1.txt",
    "content": "12,30,12,51,45,12,18,51,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile12.txt",
    "content": "12,12,28,12,12,14,12,12, 12"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile16.txt",
    "content": "12,30,30,30,63,45,33,33,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile17.txt",
    "content": "0,30,51,55,51,22,20,12,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile18.txt",
    "content": "0,30,43,43,35,42,30,12,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile19.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile2.txt",
    "content": "12,26,12,31,44,12,10,10,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile20.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile21.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile22.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile23.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile24.txt",
    "content": "63,63,0,24,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile3.txt",
    "content": "12,22,12,62,13,12,20,20,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile4.txt",
    "content": "33,30,33,51,33,45,33,30,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile5.txt",
    "content": "30,33,51,45,45,51,33,30,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile6.txt",
    "content": "33,30,33,51,51,45,33,30"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile7.txt",
    "content": "30,33,51,33,33,18,18,12,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile8.txt",
    "content": "0,30,51,55,51,26,18,12,0"
  },
  {
    "path": "src/games/chase/tiles/6x9/tile9.txt",
    "content": "0,32,31,40,56,32, 0, 0,0"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile0.txt",
    "content": "28,20,8,62,85,8,20,20"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile1.txt",
    "content": "28,28,8,62,85,8,20,20"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile10.txt",
    "content": "28,20,0,62,0,8,0,20"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile12.txt",
    "content": "12,12,28,12,12,14,12,12"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile13.txt",
    "content": "0, 0, 2,127,127,32,00,00"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile19.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile2.txt",
    "content": "28,24,9,62,84,12,20,18"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile20.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile21.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile22.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile23.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile24.txt",
    "content": "63,63,0,24,24,0,63,63"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile3.txt",
    "content": "28,12,72,62,21,24,20,36"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile4.txt",
    "content": "65,62,65,85,65,93,65,62"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile5.txt",
    "content": "62,65,107,85,85,107,65,62"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile6.txt",
    "content": "34,62,85,85,65,93,65,62"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile7.txt",
    "content": "62,65,85,65,73,42,34,28"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/games/chase/tiles/7x8/tile9.txt",
    "content": "0,32,31,40,56,32, 0, 0"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile0.txt",
    "content": "24,24,102,189,36,36"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile1.txt",
    "content": "24,24,126,189,36,36"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile10.txt",
    "content": "24,0,102,129,36,36"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile11.txt",
    "content": "0,8,56,28,16,0"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile12.txt",
    "content": "16,48,24,16,48,24"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile13.txt",
    "content": "0,68,255,34,0,0"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile14.txt",
    "content": "0,224,127,127,224,0"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile15.txt",
    "content": "0,7,254,254,7,0"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile16.txt",
    "content": "12,12,12,30,30,18\r\n"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile17.txt",
    "content": "126,227,239,231,110,60"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile18.txt",
    "content": "126,219,219,195,90,60"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile19.txt",
    "content": "$54, $38, $EE, $38, $54, $00"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile2.txt",
    "content": "24,25,118,188,20,18"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile20.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/games/chase/tiles/8x6/tile21.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/games/chase/tiles/8x6/tile22.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/games/chase/tiles/8x6/tile23.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/games/chase/tiles/8x6/tile24.txt",
    "content": "$54, $38, $EE, $38, $54, $00 "
  },
  {
    "path": "src/games/chase/tiles/8x6/tile25.txt",
    "content": "8,62,104,60,10,124"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile3.txt",
    "content": "24,152,110,61,40,72"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile4.txt",
    "content": "189,66,165,129,129,126"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile5.txt",
    "content": "126,165,153,153,165,126"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile6.txt",
    "content": "189,66,165,165,129,126"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile7.txt",
    "content": "126,165,129,90,66,60"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile8.txt",
    "content": "126,227,239,247,70,60"
  },
  {
    "path": "src/games/chase/tiles/8x6/tile9.txt",
    "content": "0,255,200,240,192,128"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36, 102"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile1.txt",
    "content": "24, 60, 24,102,153, 24, 36,102"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile10.txt",
    "content": "24, 36, 24,  0,153,  0, 36,102"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile11.txt",
    "content": "0,  0,  8, 56, 28, 16,  0,  0"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile12.txt",
    "content": "24, 24, 24, 48, 24, 12, 24, 24"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile13.txt",
    "content": "0,  0,  32,255,  4,  0,  0,  0"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile14.txt",
    "content": "0,  0,240, 63, 63,240,  0,  0"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile15.txt",
    "content": "0,  0, 15,252,252, 15,  0,  0"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile16.txt",
    "content": "24, 60, 60, 60,126, 90, 66, 66"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile17.txt",
    "content": "0,60,66,207,195,102,36,24"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile18.txt",
    "content": "0,60,90,219,195,90,60,24"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile19.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile2.txt",
    "content": "24, 52, 25,118,152, 24, 20, 20"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile20.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile21.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile22.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile23.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile24.txt",
    "content": "255,255,0,48,48,0,255,255"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile3.txt",
    "content": "24, 44,152,110, 25, 24, 40, 40"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile4.txt",
    "content": "189,66,165,129,129,153,129,126"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile5.txt",
    "content": "60, 66,165,153,153,165, 66, 60"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile6.txt",
    "content": "189,66,165,165,129,153,129,126"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile7.txt",
    "content": "60, 66,165,129, 90, 36, 36, 60"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile8.txt",
    "content": "0, 60, 102,223,231,122, 36, 24"
  },
  {
    "path": "src/games/chase/tiles/8x8/tile9.txt",
    "content": "0,128,126,200,248,192,128,  0"
  },
  {
    "path": "src/games/chase/tiles/ASCII/aquarius/aquarius_char_tiles.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _AQUARIUS_CHAR_TILES_H\r\n#define _AQUARIUS_CHAR_TILES_H\r\n\r\n    #if defined(ANIMATE_PLAYER)\r\n        // UP\r\n        #define _TILE_1 14\r\n        // 138\r\n        // '*'\r\n\r\n        // LEFT\r\n        #define _TILE_3 140\r\n        //155\r\n        // '*'\r\n\r\n        // RIGHT\r\n        #define _TILE_2 23\r\n        //154\r\n        // '*'\r\n\r\n        // DOWN\r\n        #define _TILE_0 19\r\n        //139\r\n        // '*'\r\n    #else\r\n        // UP\r\n        #define _TILE_1 135\r\n        // '*'\r\n\r\n        // LEFT\r\n        #define _TILE_3 135\r\n        // '*'\r\n\r\n        // RIGHT\r\n        #define _TILE_2 135\r\n        // '*'\r\n\r\n        // DOWN\r\n        #define _TILE_0 135\r\n        // '*'\r\n    #endif\r\n\r\n\r\n    // BOMB\r\n    #define _TILE_5 216\r\n    // 211\r\n    // 'X'\r\n\r\n    // GHOST\r\n    #define _TILE_4 157\r\n    // 'o'\r\n\r\n    #define _TILE_6 156\r\n    // '#'\r\n\r\n    #define _TILE_9 167\r\n    // '!'\r\n\r\n    // SKULL\r\n    #define _TILE_7 146\r\n    // 200\r\n    // '+'\r\n\r\n    #define _TILE_25 '$'\r\n\r\n    #define _TILE_8 212\r\n    // 'S'\r\n\r\n    #define _TILE_17 212\r\n    // 'F'\r\n\r\n    #define _TILE_18 212\r\n    // 'H'\r\n\r\n    #define _TILE_10 213\r\n    // 'V'\r\n\r\n    #define _TILE_11 198\r\n    // '.'\r\n    \r\n    #define _TILE_14 6\r\n    // '>'\r\n\r\n\r\n    #define _TILE_15 7\r\n    // '<'\r\n\r\n    // Rocket\r\n    #define _TILE_16 25\r\n    // ('^')\r\n\r\n    #define _TILE_12 214\r\n    // 'I' \r\n\r\n    #define _TILE_13 172\r\n    // '-'\r\n\r\n\r\n#endif // _AQUARIUS_CHAR_TILES_H\r\n\r\n\r\n"
  },
  {
    "path": "src/games/chase/tiles/ASCII/char_tiles.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS CHASE by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#if defined(__TARGET_SPECIFIC_ASCII) && defined(__AQUARIUS__) && !defined(__QUAD_MEMORY_MAPPED_GRAPHICS) && !defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n    #include \"aquarius/aquarius_char_tiles.h\"\r\n#else\r\n\r\n\r\n#if !defined(_TILE_19)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_19 '*'\r\n    #else\r\n        #define _TILE_19 'H'\r\n    #endif\r\n#endif \r\n\r\n#if !defined(_TILE_20)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_20 '*'\r\n    #else\r\n        #define _TILE_20 'H'\r\n    #endif\r\n#endif \r\n\r\n#if !defined(_TILE_21)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_21 '*'\r\n    #else\r\n        #define _TILE_21 'H'\r\n    #endif\r\n#endif \r\n\r\n#if !defined(_TILE_22)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_22 '*'\r\n    #else\r\n        #define _TILE_22 'H'\r\n    #endif\r\n#endif \r\n\r\n#if !defined(_TILE_23)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_23 '*'\r\n    #else\r\n        #define _TILE_23 'H'\r\n    #endif\r\n#endif \r\n\r\n#if !defined(_TILE_24)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_24 'W'\r\n    #else\r\n        #define _TILE_24 'W'\r\n    #endif\r\n#endif \r\n\r\n#if !defined(_TILE_1)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_1 '*'\r\n    #else\r\n        #define _TILE_1 'H'\r\n    #endif\r\n#endif \r\n\r\n#if !defined(_TILE_3)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_3 '*'\r\n    #else\r\n        #define _TILE_3 'H'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_2)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_2 '*'\r\n    #else\r\n        #define _TILE_2 'H'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_0)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_0 '*'\r\n    #else\r\n        #define _TILE_0 'H'\r\n    #endif\r\n#endif\r\n// RED\r\n\r\n#if !defined(_TILE_5)\r\n    #if defined(__ZX81__) || defined(__ZX80__)\r\n        #define _TILE_5 'x'\r\n    #else\r\n        #define _TILE_5 'X'\r\n    #endif\r\n#endif\r\n\r\n// WHITE\r\n#if !defined(_TILE_4)\r\n    #if defined(__LCC1802__) || defined(__SV8000__) || defined(__CIDELSA__) || defined(__MC10__)\r\n        #define _TILE_4 'O'\r\n    #else\r\n        #define _TILE_4 'o'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_6)\r\n    #if defined(__ALPHATRO__)\r\n        #define _TILE_6 'm'\r\n    #elif defined(__CIDELSA__)\r\n        #define _TILE_6 'M'\r\n    #else\r\n        #define _TILE_6 '#'\r\n    #endif\r\n#endif\r\n\r\n// BLUE\r\n#if !defined(_TILE_9)\r\n    #if defined(__ZX80__) || defined(__CIDELSA__)\r\n        #define _TILE_9 'G'\r\n    #else\r\n        #define _TILE_9 '!'\r\n    #endif\r\n#endif\r\n\r\n// YELLOW\r\n#if !defined(_TILE_7)\r\n    #if !defined(__CIDELSA__)\r\n        #define _TILE_7 '+'\r\n    #elif defined(__ZX81__) || defined(__ZX80__)\r\n        #define _TILE_7 'a'\r\n    #else\r\n        #define _TILE_7 'A'\r\n    #endif\r\n#endif\r\n\r\n\r\n#if !defined(_TILE_25)\r\n    #define _TILE_25 '$'\r\n#endif\r\n\r\n// GREEN\r\n#if !defined(_TILE_8)\r\n    #if defined(__ZX81__) || defined(__ZX80__)\r\n        #define _TILE_8 's'\r\n    #else\r\n        #define _TILE_8  'S'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_17)\r\n    #if defined(__ZX81__) || defined(__ZX80__)\r\n        #define _TILE_17 'f'\r\n    #else\r\n        #define _TILE_17 'F'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_18)\r\n    #if defined(__ZX81__) || defined(__ZX80__)\r\n        #define _TILE_18 'h'\r\n    #else\r\n        #define _TILE_18 'H'\r\n    #endif\r\n#endif\r\n\r\n// CYAN\r\n#if !defined(_TILE_10)\r\n    #if defined(__ZX81__) || defined(__ZX80__)\r\n        #define _TILE_10 'v'\r\n    #else\r\n        #define _TILE_10 'V'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_11)\r\n    #if defined(__CIDELSA__)\r\n        #define _TILE_11 'O'\r\n    #else\r\n        #define _TILE_11 '.'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_14)\r\n    #define _TILE_14 '>'\r\n#endif\r\n\r\n#if !defined(_TILE_15)\r\n    #define _TILE_15 '<'\r\n#endif\r\n\r\n#if !defined(_TILE_16)\r\n    #if defined(__ZX80__) || defined(__ZX81__) \r\n        #define _TILE_16 'i'\r\n    #elif defined(__CIDELSA__) || defined(__MC10__)\r\n        #define _TILE_16 'I'\r\n    #else\r\n        #define _TILE_16 ('^')\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_12)\r\n    #if defined(__C128_Z80__) || defined(__GAL__)  || defined(__VZ__) || defined(__COCO__) || defined(__DRAGON__) \r\n        #define _TILE_12 'i'\r\n    #elif defined(__APPLE2__) || defined(__ATARI_LYNX__) || defined(__ABC80__) || defined(__OSIC1P__) || defined(__TMC600__) \\\r\n    || defined(__MIKRO80__) || defined(__BIC__) || defined(__SUPER80__) || defined(__CIDELSA__) \\\r\n    || defined(__ZX80__) || defined(__ZX81__) || defined(__MC10__)\r\n        #define _TILE_12 'I' \r\n    #else\r\n        #define _TILE_12 ('|')\r\n    #endif \r\n#endif\r\n\r\n#if !defined(_TILE_13)\r\n    #if defined(__CIDELSA__)\r\n        #define _TILE_13 'I'\r\n    #else\r\n        #define _TILE_13 '-'\r\n    #endif\r\n#endif\r\n\r\n#if !defined(_TILE_26)\r\n    #if defined(__C128_Z80__) || defined(__GAL__)  || defined(__VZ__) || defined(__COCO__) || defined(__DRAGON__) \r\n        #define _TILE_26 't'\r\n    #else\r\n        #define _TILE_26 'T'\r\n    #endif\r\n#endif\r\n\r\n\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/chase/variables.h",
    "content": "#ifndef _VARIABLES_H\n#define _VARIABLES_H\n\n#if defined(BENCHMARK)\n    #if !defined(BENCHMARK_MAX)\n        #define BENCHMARK_MAX 70\n    #endif\n    \n    clock_t Ticks, TicksDelta;\n    unsigned int Sec;\n    unsigned int Milli; \n\n    uint16_t benchmark_count;\n#endif\n\n\n#if !defined(TINY_GAME) || defined(_XL_TURN_BASED)\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS) || (defined(USE_TINY_MEMORY_BUFFERS) && defined(_XL_TURN_BASED))\n\t\textern uint16_t loop;\n\t#else\n\t\tuint16_t loop;\t\n\t#endif\t\n#endif\n\n\n// #if defined(FULL_GAME) && !defined(NO_BLINKING)\n\t// #if defined(USE_MEMORY_BUFFERS)\n\t\t// extern uint8_t playerBlink;\t\n\t// #else\n\t\t// uint8_t playerBlink;\n\t// #endif\n// #endif\n\n\n#if defined(FULL_GAME) \n\t#if defined(USE_MEMORY_BUFFERS)\n\t\textern uint16_t ghostLevel;\n\t#else\n\t\tuint16_t ghostLevel;\n\t#endif\n#endif\n\n\n#if !defined(TINY_GAME)\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\t\textern uint16_t skullSlowDown;\n\t\textern uint8_t skullXCountDown;\n\t\textern uint8_t skullYCountDown;\n\t\textern uint8_t bulletDirection;\t\t\n\t#else\n\t\tuint16_t skullSlowDown;\t\t\n\t\tuint8_t skullXCountDown;\n\t\tuint8_t skullYCountDown;\n\t\tuint8_t bulletDirection;\n\t#endif\n\n#endif\n\n#if !defined(TINY_GAME)\n\textern Image SKULL_IMAGE;\n\textern Image POWERUP_IMAGE;\n\textern Image BULLET_IMAGE;\n\textern Image GUN_IMAGE;\n\textern Image EXTRA_POINTS_IMAGE;\t\n\textern Image DEAD_GHOST_IMAGE;\n#endif\n\n\n#if !defined(TINY_GAME)\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\t\textern Character skull;\n\t\textern Character bullet;\t\n\n\t\textern Item powerUp;\n\t\textern Item gun;\n\t\textern Item extraPoints;\t\n\t#else\n\t\tCharacter skull;\n\t\tItem powerUp;\n\t\tItem gun;\n\t\tItem extraPoints;\t\n\t\t\n\t\tCharacter bullet;\n\t#endif\n#endif\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_TINY_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\textern Character ghosts[];\n\textern Character bombs[];\n\t\n\textern Character player;\n\t\n\textern uint16_t ghostSlowDown;\n\textern uint16_t points;\n\textern uint16_t highScore;\n\n\textern uint8_t lives;\n\textern uint8_t level;\t\n\t\n\textern uint8_t ghostCount; // = GHOSTS_NUMBER;\n\t\n\textern uint8_t ind;\n\n#else\n\tCharacter ghosts[GHOSTS_NUMBER];\n\tCharacter bombs[BOMBS_NUMBER];\n\n\tCharacter player; \n\n\tuint16_t ghostSlowDown;\n\tuint16_t points;\n\tuint16_t highScore;\t\n\t\n\tuint8_t lives;\n\tuint8_t level;\t\n\t\n\tuint8_t ghostCount; // = GHOSTS_NUMBER;\n\t\n\tuint8_t ind;\n\t\n#endif\n\n#if defined(FULL_GAME)\n\n\t#if defined(USE_MEMORY_BUFFERS)\n\t\textern Item powerUp2;\n\t\textern Item freeze;\n\t\textern Item invincibility;\n\t\textern Item extraLife;\n\t\textern Item super;\n\t\textern Item confuse;\n\t\textern Item zombie;\n\t\textern Item chase;\t\n\n\t\textern Character leftHorizontalMissile;\n\t\textern Character rightHorizontalMissile;\n\t\textern Character chasingBullet;\n\n\t\textern Character * chasedEnemyPtr;\n\t\textern Character * chasedByGhosts;\n\t\textern uint8_t rockets_x[];\n\n\t\textern uint8_t extraLife_present_on_level;\n\t\textern uint8_t super_present_on_level;\n\t\textern uint8_t zombie_present_on_level;\n\t\t\n\t\textern uint8_t bases;\n\t\t\n\t\textern uint8_t arrowRange;\n\t\t\n\t\textern uint8_t all_skulls_killed_in_completed_levels;\n\t\t\n\t\textern uint8_t bases_in_completed_levels;\n\t\t\n\t\textern uint8_t horizWallsLength;\n\t\t\n\t\textern uint8_t invincibilityActive;\n\t\t\n\t\textern uint8_t confuseActive; \n\t\t\n\t\textern uint8_t zombieActive; \t\t\n\t\t\n\t\textern uint8_t verticalWallY; \n\t\textern uint8_t verticalWallX; \n\t\textern uint8_t verticalWallLength;\n\n\t#else\n\t\tItem powerUp2;\t\t\n\t\tItem freeze;\n\t\tItem invincibility;\n\t\tItem extraLife;\n\t\tItem super;\n\t\tItem confuse;\n\t\tItem zombie;\n\t\tItem chase;\n\t\t\n\t\tCharacter leftHorizontalMissile;\n\t\tCharacter rightHorizontalMissile;\n\t\tCharacter chasingBullet;\t\t\t\n\t\t\n\t\tCharacter * chasedEnemyPtr;\n        \n\t\tCharacter * chasedByGhosts;\n\t\tuint8_t rockets_x[ROCKETS_NUMBER];\t\t\n\t\t\n\t\tuint8_t extraLife_present_on_level;\n\t\tuint8_t super_present_on_level;\n\t\tuint8_t zombie_present_on_level;\n\t\t\n\t\tuint8_t bases;\n\t\t\n\t\tuint8_t arrowRange;\n\t\t\n\t\tuint8_t all_skulls_killed_in_completed_levels;\n\t\t\n\t\tuint8_t bases_in_completed_levels;\n\t\t\n\t\tuint8_t horizWallsLength;\n\t\t\n\t\tuint8_t invincibilityActive;\n\t\t\n\t\tuint8_t confuseActive; \n\t\t\n\t\tuint8_t zombieActive; \n\n\n\t\tuint8_t verticalWallY; \n\t\tuint8_t verticalWallX; \n\t\tuint8_t verticalWallLength;\n\t\t\n\t#endif\n\n\t#define chase_present_on_level_condition all_skulls_killed_in_completed_levels\n\t#define confuse_present_on_level_condition bases_in_completed_levels\n\t\n\t#if defined(USE_MEMORY_BUFFERS)\n\t\textern Character rockets[];\n\n\t\textern uint8_t invincibility_count_down;\t\n\t\n\t\textern uint8_t confuse_count_down;\n\t\n\t\textern uint8_t zombie_count_down;\t\t\n\t#else\n\t\tCharacter rockets[ROCKETS_NUMBER];\n\t\n\t\tuint8_t invincibility_count_down;\t\n\t\n\t\tuint8_t confuse_count_down;\n\t\n\t\tuint8_t zombie_count_down;\t\n\t#endif\n\t\n#endif\n\n#if defined(FULL_GAME) && !defined(SIMPLE_STRATEGY)\n\t#if defined(USE_MEMORY_BUFFERS)\n\t\textern uint8_t strategyArray[GHOSTS_NUMBER];\t\n\t#else\n\t\tuint8_t strategyArray[GHOSTS_NUMBER];\n\t#endif\t\n#endif\n\n#if !defined(TINY_GAME)\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\t\textern uint8_t freeze_count_down;\n\t\t\n\t\textern uint8_t playerDirection; // 0: right, 1: down, 2: left, 3: up\n\t\textern uint8_t freezeActive; // freezeActive\t\t\t\n\t\textern uint8_t extraLifeThroughPointsCounter;\t\t\t\n\t#else\n\t\tuint8_t freeze_count_down;\n\t\t\n\t\tuint8_t playerDirection; // 0: right, 1: down, 2: left, 3: up\n\t\tuint8_t freezeActive; // freezeActive\t\n\t\tuint8_t extraLifeThroughPointsCounter;\t\t\t\n\t#endif\n\n\n#endif\n\n\n#if !defined(TINY_GAME)\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\t\textern uint8_t playerFire;\n\t\textern uint8_t guns; \n\t\textern uint8_t skullActive;\t\t\n\t#else\n\t\tuint8_t playerFire;\n\t\tuint8_t guns; \n\t\tuint8_t skullActive;\t\n\t#endif\n#endif\n\n#if defined(FULL_GAME)\n\t#if defined(USE_MEMORY_BUFFERS)\n\t\textern uint8_t arrowYPosition;\n\t#else\n\t\tuint8_t arrowYPosition;\n\t#endif\n#endif\n\n#if defined(FULL_GAME)\n    uint8_t isBossLevel;\n    uint8_t isOneMissileLevel;\n    uint8_t isMissileLevel;\n    uint8_t isRocketLevel;\n    uint8_t ishorizWallsLevel;\n    \n    uint16_t levelSlowDown;\n#endif\n\n#endif // _VARIABLES_H\n"
  },
  {
    "path": "src/games/horde/Makefile.horde",
    "content": "\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c \n\nGAME_NAME := horde\n\nPARENT_DIR = games\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\ninclude ./Makefile_common\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n"
  },
  {
    "path": "src/games/horde/config/game_config.mk",
    "content": "#\r\n\r\nCOCO_COLOR_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DFASTER_WALL_REDRAW -DNUMBER_OF_MISSILES=3\r\n\r\nCREATIVISION_GAME_OPTS ?= -DNUMBER_OF_MISSILES=2 -DMAX_ARROWS_ON_SCREEN=7 -DNO_BOTTOM_WALL_REDRAW\r\n\r\nGAMATE_GAME_OPTS ?= -DNUMBER_OF_MISSILES=1 -DMAX_ARROWS_ON_SCREEN=9 -DNO_BOTTOM_WALL_REDRAW -DNO_EXTRA_TITLE\r\n\r\nC128_Z80_80COL_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=2 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DBULLETS_NUMBER=3\r\n    \r\nZX81_NO_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DNUMBER_OF_MISSILES=4 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL \r\n\r\nZX81_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=2 -DMISSILE_DROP_LOOP_MASK=7 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW\r\n\r\nAPPLE2_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DNUMBER_OF_MISSILES=3\r\n\r\nCOMX_GAME_OPTS ?= \t-DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nPECOM_GAME_OPTS ?= \t-DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nTMC600_GAME_OPTS ?= \t-DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=4 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nCAMPUTERS_LYNX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3\r\n\r\nPV1000_GAME_OPTS  ?=  -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7"
  },
  {
    "path": "src/games/horde/config/project_config.mk",
    "content": "\r\n\r\n# ATARI_COLORS=-D__USE_GREEN\r\n# ATARI5200_COLORS=-D__USE_GREEN\r\n\r\n\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=70\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=100\r\n_ATARI5200_SLOWDOWN=100\r\n_ATARI7800_SLOWDOWN=130\r\n_ATARI_LYNX_SLOWDOWN=400\r\n_C128_8502_80COL_SLOWDOWN=50\r\n_C16_SLOWDOWN=55\r\n_C16_CONIO_SLOWDOWN=85\r\n_C64_SLOWDOWN=45\r\n_CX16_SLOWDOWN?=100\r\n_CBM610_SLOWDOWN=150\r\n_CBM510_SLOWDOWN=80\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_MEGA65_SLOWDOWN=550\r\n_NES_SLOWDOWN=190\r\n_PET_SLOWDOWN=80\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=100\r\n\r\n\r\n# Z88DK\r\n_ABC80_SLOWDOWN=70\r\n_AGON_SLOWDOWN=950\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_BEE_SLOWDOWN=25\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CAMPUTERS_LYNX_SLOWDOWN=10\r\n_COLECO_SLOWDOWN=100\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_E200_SLOWDOWN=600\r\n_G850_SLOWDOWN=320\r\n_G815_SLOWDOWN=200\r\n_GAL_SLOWDOWN=1000\r\n_GAL_GFX_SLOWDOWN=500\r\n_GB_SLOWDOWN=80\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_GL6000SL_SLOWDOWN=70\r\n_HECTORHR_SLOWDOWN=35\r\n_LASER500_SLOWDOWN=200\r\n_M100_SLOWDOWN=100\r\n_M5_SLOWDOWN=35\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=35\r\n_MSX_FIXED_COLORS_SLOWDOWN=35\r\n_MTX500_SLOWDOWN=35\r\n_MTX512_SLOWDOWN=35\r\n_MZ_SLOWDOWN=200\r\n_PHC25_SLOWDOWN=150\r\n_PV1000_SLOWDOWN=10\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SC3000_SLOWDOWN=55\r\n_SMC777_SLOWDOWN=40\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=40\r\n_TRS80_SLOWDOWN=30\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250\r\n_X07_SLOWDOWN=10\r\n_ZX81_SLOWDOWN=3\r\n_ZX81_WRX_SLOWDOWN=2\r\n_ZX81_WRX128_SLOWDOWN=6\r\n_ZX81_8X6_WRX128_SLOWDOWN=8\r\n_ZX81_WRX64_SLOWDOWN=14\r\n_ZX81_8X6_WRX64_SLOWDOWN=18\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=50\r\n_DRAGON_SLOWDOWN=50\r\n_COCO3_SLOWDOWN=80\r\n_COCO_NO_GFX_SLOWDOWN=4000\r\n_DRAGON_NO_GFX_SLOWDOWN=4000\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=0\r\n_PECOM_SLOWDOWN=0\r\n_TMC600_SLOWDOWN=0\r\n_MICRO_SLOWDOWN=10\r\n_CIDELSA_SLOWDOWN=2\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=50\r\n\r\n\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=100\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=9\r\n_TERMINAL_SLOWDOWN=4\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=150\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=160"
  },
  {
    "path": "src/games/horde/images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#include \"cross_lib.h\"\n\n\n    #define MINION_TILE_0 _TILE_0\n    #define MINION_TILE_1 _TILE_1\n    #define MINION_TILE_2 _TILE_2\n    #define MINION_TILE_3 _TILE_3\n    #define MINION_TILE_4 _TILE_4\n    #define MINION_TILE_5 _TILE_5\n    #define MINION_TILE_6 _TILE_6\n    \n    #define ZOMBIE_DEATH_TILE _TILE_7\n    #define POWER_UP_TILE _TILE_8\n    \n    #define LOADED_BOW_LEFT_TILE_0 _TILE_9\n    #define LOADED_BOW_RIGHT_TILE_0 _TILE_10\n\n    #define LOADED_BOW_LEFT_TILE_1 _TILE_11\n    #define LOADED_BOW_RIGHT_TILE_1 _TILE_12\n    \n    #define EMPTY_BOW_LEFT_TILE_0 _TILE_13\n    #define EMPTY_BOW_RIGHT_TILE_0 _TILE_10\n\n    #define EMPTY_BOW_LEFT_TILE_1 _TILE_11\n    #define EMPTY_BOW_RIGHT_TILE_1 _TILE_16\n\n    #define ARROW_TILE_0 _TILE_17\n    #define ARROW_TILE_1 _TILE_18\n    \n    #define BOSS_TILE_0 _TILE_19\n    #define BOSS_TILE_1 _TILE_20\n    #define BOSS_TILE_2 _TILE_2\n    #define BOSS_TILE_3 _TILE_21\n    #define BOSS_TILE_4 _TILE_4\n    #define BOSS_TILE_5 _TILE_22\n    #define BOSS_TILE_6 _TILE_6\n\n    // #define TOP_BORDER_TILE BOSS_TILE_5\n    #define BEAM_TILE _TILE_26\n    \n    #define FREEZE_TILE _TILE_23\n    #define WALL_TILE _TILE_24\n    \n    #define EXTRA_POINTS_TILE _TILE_25\n    \n    #define HI_TILE _TILE_14\n    #define LV_TILE _TILE_15\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/games/horde/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#include \"images.h\"\n\n// #define DEBUG 1\n//#define TRAINER 1\n\n#define INITIAL_LEVEL 0\n\n#define LAST_LEVEL 8\n#define INITIAL_LIVES 3\n#define MAX_LIVES 9\n\n#define NEXT_EXTRA_LIFE 5000U\n\n#if YSize>10\n    #define BOW_Y ((YSize)-3)\n    #define POWER_UPS_Y ((BOW_Y)+2)\n    #define BOTTOM_WALL_Y ((BOW_Y)+1)\n#else\n    #define BOW_Y ((YSize)-1)\n    // #define POWER_UPS_Y (BOW_Y)\n    // #define BOTTOM_WALL_Y (BOW_Y)\n#endif\n#define MAX_BOW_X ((XSize)*2-3)\n\n#if YSize<=10\n    #define WALL_Y ((YSize)/2)\n#elif YSize<=16\n    #define WALL_Y ((YSize)-8)\n#else\n    #define WALL_Y ((YSize)-6)\n#endif\n\n#if YSize>=16\n    #define INITIAL_ZOMBIE_Y (((YSize)/2)-2)\n#elif YSize>10\n    #define INITIAL_ZOMBIE_Y (((YSize)/2)-1)\n#else\n    #define INITIAL_ZOMBIE_Y 2\n#endif\n\n#if YSize>=18\n    #define INITIAL_RESPAWN_ZOMBIE_Y (INITIAL_ZOMBIE_Y)-4\n#elif YSize>=16\n    #define INITIAL_RESPAWN_ZOMBIE_Y (INITIAL_ZOMBIE_Y)-3\n#elif YSize>10\n    #define INITIAL_RESPAWN_ZOMBIE_Y (INITIAL_ZOMBIE_Y)-2\n#else\n    #define INITIAL_RESPAWN_ZOMBIE_Y (INITIAL_ZOMBIE_Y)\n#endif\n\n\n#define POWER_THRESHOLD 4\n\n#if !defined(MAX_ARROWS_ON_SCREEN)\n    #define MAX_ARROWS_ON_SCREEN 12\n#endif\n\n#define AUTO_RECHARGE_COOL_DOWN 45\n#define AUTO_ARROW_RECAHRGE 9\n\n#define MAX_FREEZE 1\n\n#define MINION_POINTS 5\n#define BOSS_1_POINTS 10\n#define BOSS_2_POINTS 20\n#define BOSS_3_POINTS 25\n\n#define EXTRA_POINTS 20\n#define RECHARGE_POINTS 25\n#define POWERUP_POINTS 30\n#define FREEZE_POINTS 50\n#define WALL_POINTS 80\n#define ZOMBIE_ITEM_POINTS 150 \n#define POWER_UP_BONUS 25\n#define LEVEL_BONUS 200\n\n\n#define RED_FIRE_POWER_VALUE 2\n#define YELLOW_FIRE_POWER_VALUE 3\n#define GREEN_FIRE_POWER_VALUE 4\n\n#define INITIAL_BOW_RELOAD_LOOPS 9\n#define RED_SPEED_VALUE INITIAL_BOW_RELOAD_LOOPS\n#define YELLOW_SPEED_VALUE 7\n#define GREEN_SPEED_VALUE 4\n#define HYPER_SPEED_VALUE 3\n\n#define RED_RANGE_VALUE INITIAL_ARROW_RANGE\n#define YELLOW_RANGE_VALUE ((INITIAL_ARROW_RANGE)-2)\n#define GREEN_RANGE_VALUE ((INITIAL_ARROW_RANGE)-4)\n\n#define INITIAL_ARROW_RANGE ((INITIAL_ZOMBIE_Y)+1)\n#define ITEM_SPAWN_CHANCE 11000U\n\n#define MINION_ENERGY 6\n#define BOSS_ENERGY 14\n#define WALL_ENERGY 20\n\n#define MAX_ARROWS 99\n#define HYPER_RECHARGE 50\n#define ARROW_RECHARGE 30\n\n#define FREEZE_COUNTER_MAX 200;\n\n#if XSize<=40\n    #define MAX_OCCUPIED_COLUMNS (3*(XSize)/4)\n#else\n    #define MAX_OCCUPIED_COLUMNS (2*(XSize)/3)\n#endif\n\n#define FEW_ZOMBIES (2*(MAX_OCCUPIED_COLUMNS)/3)\n\n#if !defined(NUMBER_OF_MISSILES)\n    #define NUMBER_OF_MISSILES 5\n#endif\n#define NUMBER_OF_EXTRA_POINTS NUMBER_OF_MISSILES\n\n\n#if XSize<=80\n    #define MINIONS_ON_FIRST_LEVEL (XSize)\n#else\n    #define MINIONS_ON_FIRST_LEVEL 80\n#endif\n\n#if XSize<=80\n    #define BOSSES_ON_FIRST_LEVEL ((XSize)/2)\n#else\n    #define BOSSES_ON_FIRST_LEVEL 40\n#endif\n\n#define LEVEL_2_ZOMBIE_THRESHOLD MAX_OCCUPIED_COLUMNS\n\n#define MAX_HYPER_COUNTER 180\n\n#if YSize>=20\n    #define HEIGHT_SHOOT_THRESHOLD YSize-10\n#else\n    #define HEIGHT_SHOOT_THRESHOLD YSize-11\n#endif\n\nstatic uint8_t missile_randomness_mask;\n\nstatic uint8_t active_wall;\n\nstatic uint16_t next_threshold;\n\nstatic uint8_t main_loop_counter;\n\nstatic uint8_t forced_zombie;\n\nstatic uint8_t forced_zombie_x;\n\nstatic uint8_t hyper_counter;\n\nstatic uint8_t item_counter;\n\nstatic const uint8_t zombie_points[] = \n{ \n    MINION_POINTS, // Skeletons\n    BOSS_1_POINTS, // Ogre\n    BOSS_2_POINTS, // Ghosts\n    BOSS_3_POINTS, // Demons\n};\n\nstatic uint8_t minions_to_kill;\nstatic uint8_t bosses_to_kill;\n\nstatic uint8_t lives;\nstatic uint8_t level;\nstatic uint8_t killed_minions;\nstatic uint8_t killed_bosses;\n\nstatic uint8_t bosses_to_spawn;\nstatic uint8_t minions_to_spawn;\n\nstatic uint8_t auto_recharge_counter;\n\n#if !defined(_XL_NO_COLOR)\n    static uint8_t arrow_display_color;\n#else\n    #define arrow_display_color _DUMMY_\n#endif\n\n#if !defined(_XL_NO_COLOR) && !defined(_XL_NO_TEXT_COLOR) && YSize>10\nstatic const uint8_t power_up_color[3] = {_XL_RED, _XL_YELLOW, _XL_GREEN};\n#endif\n\n#if !defined(_XL_NO_COLOR) && YSize>10\nstatic const uint8_t arrow_color[3] = {_XL_CYAN, _XL_YELLOW, _XL_WHITE};\n#endif\n\nstatic uint8_t freeze;\nstatic uint8_t powerUp;\n\nstatic uint8_t number_of_arrows_per_shot;\n\nstatic uint8_t zombie_y[XSize];\nstatic uint8_t zombie_shape[XSize];\nstatic uint8_t zombie_x;\nstatic uint8_t zombie_speed;\nstatic uint8_t zombie_active[XSize];\n\nstatic uint8_t energy[XSize];\nstatic uint8_t zombie_level[XSize];\n\nstatic uint8_t fire_power;\n\nstatic uint8_t wall_appeared;\nstatic uint8_t freeze_locked;\nstatic uint8_t zombie_locked;\n\n#if !defined(_XL_NO_UDG)\nstatic const uint8_t zombie_tile[7+1] = \n{\n    MINION_TILE_0, // 0\n    MINION_TILE_0, // 1\n    MINION_TILE_1, // 2\n    MINION_TILE_2, // 3\n    MINION_TILE_3, \n    MINION_TILE_4, \n    MINION_TILE_5, \n    MINION_TILE_6\n};\n\nstatic const uint8_t boss_tile[7+1] =\n{\n    BOSS_TILE_0,\n    BOSS_TILE_0,\n    BOSS_TILE_1,\n    BOSS_TILE_2,\n    BOSS_TILE_3,\n    BOSS_TILE_4,\n    BOSS_TILE_5,\n    BOSS_TILE_6,\n};\n#endif\n\nstatic const uint8_t bow_tile[8] =\n{\n    EMPTY_BOW_LEFT_TILE_0,\n    EMPTY_BOW_RIGHT_TILE_0,\n    EMPTY_BOW_LEFT_TILE_1,\n    EMPTY_BOW_RIGHT_TILE_1,\n    LOADED_BOW_LEFT_TILE_0,\n    LOADED_BOW_RIGHT_TILE_0,\n    LOADED_BOW_LEFT_TILE_1,\n    LOADED_BOW_RIGHT_TILE_1,\n};\n\nstatic const uint8_t arrow_tile[2] =\n{\n    ARROW_TILE_0,\n    ARROW_TILE_1,\n};\n\nstatic uint8_t bow_x; // range: 0..2*XSize-2^M\nstatic uint8_t bow_shape_tile;\nstatic uint8_t bow_color;\n\nstatic uint8_t input;\n\nstatic uint8_t loaded_bow;\nstatic uint8_t active_arrow[MAX_ARROWS_ON_SCREEN];\nstatic uint8_t arrow_shape[MAX_ARROWS_ON_SCREEN];\nstatic uint8_t arrow_x[MAX_ARROWS_ON_SCREEN];\nstatic uint8_t arrow_y[MAX_ARROWS_ON_SCREEN];\nstatic uint8_t remaining_arrows;\nstatic uint8_t arrow_range;\n\nstatic uint8_t wall[XSize];\n\nstatic uint8_t bow_reload_loops;\n\nstatic uint8_t next_arrow;\nstatic uint8_t arrows_on_screen;\nstatic uint8_t bow_load_counter;\nstatic uint8_t alive;\n\nstatic uint16_t score;\nstatic uint16_t hiscore;\n\nstruct  ItemStruct\n{\n    uint8_t _x;\n    uint8_t _y;\n    uint8_t _tile;\n    #if !defined(_XL_NO_COLOR)\n    uint8_t _color;\n    #endif\n    uint8_t _active;\n    uint8_t _counter;\n    void(*_effect)(void);\n} ;\ntypedef struct ItemStruct Item;\ntypedef struct ItemStruct Missile;\n\nstatic Item rechargeItem;\nstatic Item freezeItem;\nstatic Item powerUpItem;\nstatic Item wallItem;\nstatic Item zombieItem;\n\n#if !defined(NO_EXTRA_TITLE) && YSize>10\nstatic const uint8_t item_tile[5][2] = \n{\n    { POWER_UP_TILE, _XL_WHITE },\n    { ARROW_TILE_1, _XL_YELLOW },\n    { EXTRA_POINTS_TILE, _XL_GREEN },\n    { FREEZE_TILE, _XL_CYAN },\n    { WALL_TILE, _XL_YELLOW },\n};\n\nstatic const char item_name[5][9] = \n{\n    _XL_P _XL_O _XL_W _XL_E _XL_R _XL_SPACE _XL_U _XL_P,\n    _XL_A _XL_R _XL_R _XL_O _XL_W _XL_S,\n    _XL_P _XL_O _XL_I _XL_N _XL_T _XL_S,\n    _XL_F _XL_R _XL_E _XL_E _XL_Z _XL_E,\n    _XL_W _XL_A _XL_L _XL_L,\n};\n#endif\n\n\nstatic Missile enemyMissile[NUMBER_OF_MISSILES];\nstatic Item extraPointsItem[NUMBER_OF_MISSILES];\n\n\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\n{\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\n}\n\n\n#define PRINT_CENTERED(Text) \\\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\n\n\n\n\n\nvoid sleep_and_wait_for_input(void)\n{\n    _XL_SLEEP(1);\n    _XL_WAIT_FOR_INPUT();\n}\n\n#if XSize>=22\n    #define POWER_UP_X 10\n#elif XSize>=20\n    #define POWER_UP_X 9\n#else\n    #define POWER_UP_X 10\n#endif\n\n\nvoid display_power_up_counter(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(POWER_UP_X+1,0,2,powerUp);\n}\n\n#if XSize>=32\n    #define ZOMBIE_COUNTER_X (POWER_UP_X+4)\n    \n    void display_zombie_counter(void)\n    {\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\n        _XL_PRINTD(ZOMBIE_COUNTER_X+1,0,3,minions_to_kill+bosses_to_kill);\n    }\n#else\n    #define display_zombie_counter()\n#endif\n\n#if !defined(_XL_NO_COLOR)\nvoid display_remaining_arrows(void)\n{\n    uint8_t color;\n    \n    if(remaining_arrows<20)\n    {\n        color = _XL_RED;\n    }\n    else\n    {\n        color = _XL_WHITE;\n    }\n    _XL_SET_TEXT_COLOR(color);\n    _XL_PRINTD(7,0,2,remaining_arrows);\n}\n#else\nvoid display_remaining_arrows(void)\n{\n    _XL_PRINTD(7,0,2,remaining_arrows);\n}\n#endif\n\n\nvoid recharge_arrows(uint8_t value)\n{\n    remaining_arrows+=value;\n    if(remaining_arrows>MAX_ARROWS)\n    {\n        remaining_arrows=MAX_ARROWS;\n    }\n    display_remaining_arrows();\n}\n\n\nvoid display_score(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(0,0,5,score);\n}\n\n#define LIVES_X (XSize-3)\n\n#if YSize<=10\n    #define display_lives(color) \n#elif !defined(_XL_NO_TEXT_COLOR)\n    void display_lives(uint8_t color)\n    {\n        _XL_DRAW(LIVES_X,POWER_UPS_Y,bow_tile[4+0+bow_shape_tile],_XL_CYAN);\n        _XL_DRAW(LIVES_X+1,POWER_UPS_Y,bow_tile[1+4+bow_shape_tile],_XL_CYAN);\n        _XL_SET_TEXT_COLOR(color);\n        _XL_PRINTD(LIVES_X+2,POWER_UPS_Y,1,lives);\n    }\n#else\n    #define display_lives(color) \\\n    { \\\n        _XL_DRAW(LIVES_X,POWER_UPS_Y,bow_tile[4+0+bow_shape_tile],_XL_CYAN); \\\n        _XL_DRAW(LIVES_X+1,POWER_UPS_Y,bow_tile[1+4+bow_shape_tile],_XL_CYAN); \\\n        _XL_PRINTD(LIVES_X+2,POWER_UPS_Y,1,lives); \\\n    } \n#endif\n\n\n#if !defined(_XL_NO_COLOR)\n    #define _extra_life_color_effect(color) display_lives(color) \n#else\n    #define _extra_life_color_effect(color)\n#endif\n\n\nvoid display_bow(void)\n{\n    _XL_DRAW((bow_x>>1),BOW_Y,bow_tile[4*loaded_bow+0+bow_shape_tile],bow_color);\n    _XL_DRAW((bow_x>>1)+1,BOW_Y,bow_tile[1+4*loaded_bow+bow_shape_tile],bow_color);  \n}\n\n\n#if !defined(_XL_NO_COLOR)\nvoid display_zombie(void)\n{\n    uint8_t status = zombie_shape[zombie_x];\n    uint8_t pos = zombie_y[zombie_x];\n    uint8_t color;\n    uint8_t tile0;\n\n    tile0 = BOSS_TILE_0;\n\n    if(zombie_level[zombie_x]==1)\n    {\n        color = _XL_GREEN;\n    }\n    else if(zombie_level[zombie_x]==2)\n    {\n        if(!freeze)\n        {\n            tile0 = ZOMBIE_DEATH_TILE;\n            color = _XL_YELLOW;\n        }\n    }\n    else if(!zombie_level[zombie_x])\n    {\n        tile0 = MINION_TILE_0;\n        color = _XL_WHITE;\n    }\n    else \n    {\n        color = _XL_RED;\n    }\n    if(freeze)\n    {\n        color = _XL_CYAN;  \n    }\n\n    if(!status)\n    {\n        _XL_DELETE(zombie_x, zombie_y[zombie_x]-1);\n        _XL_DRAW(zombie_x, pos, tile0, color);\n    }\n    else\n    {\n        #if !defined(_XL_NO_UDG)\n        uint8_t tile1;\n\n        if(!zombie_level[zombie_x])\n        {\n            tile0 = zombie_tile[status<<1];\n            tile1 = zombie_tile[1+(status<<1)];\n        }\n        else\n        {\n            tile0 = boss_tile[status<<1];\n            tile1 = boss_tile[1+(status<<1)]; \n        }\n        _XL_DRAW(zombie_x, pos, tile0, color);\n        _XL_DRAW(zombie_x,1 + pos, tile1, color);\n        #else\n        // Avoid using the upper border / beam tile in ASCII mode\n\n        if(!zombie_level[zombie_x])\n        {\n            \n            tile0 = MINION_TILE_0;\n        }\n        else\n        {\n            if((zombie_y[zombie_x])&1)\n            {\n                tile0 = BOSS_TILE_0;\n            }\n            else\n            {\n                tile0 = BOSS_TILE_1;\n            }\n        }\n        _XL_DRAW(zombie_x, pos, tile0, color);\n        #endif\n    }\n}\n#else\nvoid display_zombie(void)\n{\n    uint8_t status = zombie_shape[zombie_x];\n    uint8_t pos = zombie_y[zombie_x];\n    uint8_t tile0;\n\n    tile0 = BOSS_TILE_0;\n\n    if(zombie_level[zombie_x]==1)\n    {\n    }\n    else if(zombie_level[zombie_x]==2)\n    {\n        if(!freeze)\n        {\n            tile0 = ZOMBIE_DEATH_TILE;\n        }\n    }\n    else if(!zombie_level[zombie_x])\n    {\n        tile0 = MINION_TILE_0;\n    }\n    else \n    {\n    }\n    if(freeze)\n    {\n    }\n\n    if(!status)\n    {\n        _XL_DELETE(zombie_x, zombie_y[zombie_x]-1);\n        _XL_DRAW(zombie_x, pos, tile0, color);\n    }\n    else\n    {\n        #if !defined(_XL_NO_UDG)\n        uint8_t tile1;\n\n        if(!zombie_level[zombie_x])\n        {\n            tile0 = zombie_tile[status<<1];\n            tile1 = zombie_tile[1+(status<<1)];\n        }\n        else\n        {\n            tile0 = boss_tile[status<<1];\n            tile1 = boss_tile[1+(status<<1)]; \n        }\n        _XL_DRAW(zombie_x, pos, tile0, color);\n        _XL_DRAW(zombie_x,1 + pos, tile1, color);\n        #else\n        // Avoid using the upper border / beam tile in ASCII mode\n\n        if(!zombie_level[zombie_x])\n        {\n            \n            tile0 = MINION_TILE_0;\n        }\n        else\n        {\n            if((zombie_y[zombie_x])&1)\n            {\n                tile0 = BOSS_TILE_0;\n            }\n            else\n            {\n                tile0 = BOSS_TILE_1;\n            }\n        }\n        _XL_DRAW(zombie_x, pos, tile0, color);\n        #endif\n    }\n}\n#endif\n\n\n#define handle_extra_life() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        if(score>=next_threshold) \\\n        { \\\n            if(lives<MAX_LIVES) \\\n            { \\\n                ++lives; \\\n            } \\\n            next_threshold+=NEXT_EXTRA_LIFE; \\\n            _XL_PING_SOUND(); \\\n            \\\n            for(i=0;i<16;++i) \\\n            { \\\n                bow_color = _XL_YELLOW; \\\n                display_bow(); \\\n                _extra_life_color_effect(_XL_RED); \\\n                _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR); \\\n                bow_color = _XL_CYAN; \\\n                display_bow(); \\\n                _extra_life_color_effect(_XL_YELLOW); \\\n                _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR); \\\n            } \\\n            _XL_PING_SOUND(); \\\n            display_lives(_XL_WHITE); \\\n        } \\\n    } while(0)\n\n\nvoid increase_score(uint8_t value)\n{\n    score+=value;\n    display_score();\n    handle_extra_life();\n}\n\n\nvoid recharge_effect(void)\n{\n    recharge_arrows(ARROW_RECHARGE);\n    increase_score(RECHARGE_POINTS);\n}\n\n\n#define RANGE_X 0\n\n#if XSize <= 15\n    #define RANGE_STRING _XL_R \n    #define SPEED_STRING _XL_S \n    #define POWER_STRING _XL_P\n    #define STR_LEN 1\n    #define SPEED_X 3\n    #define POWER_X ((XSize)-5)\n\n#elif XSize <= 19\n    #define RANGE_STRING _XL_R _XL_N\n    #define SPEED_STRING _XL_S _XL_P\n    #define POWER_STRING _XL_P _XL_W\n    #define STR_LEN 2\n    #define SPEED_X 4\n    #define POWER_X ((XSize)-6)\n#elif XSize <= 26\n    #define RANGE_STRING _XL_R _XL_N _XL_G\n    #define SPEED_STRING _XL_S _XL_P _XL_D\n    #define POWER_STRING _XL_P _XL_O _XL_W\n    #define STR_LEN 3\n    #define SPEED_X 5\n    #define POWER_X ((XSize)-7)\n#else\n    #define RANGE_STRING _XL_R _XL_A _XL_N _XL_G _XL_E\n    #define SPEED_STRING _XL_S _XL_P _XL_E _XL_E _XL_D\n    #define POWER_STRING _XL_P _XL_O _XL_W _XL_E _XL_R\n    #define STR_LEN 5    \n    #if XSize>=32\n        #define SPEED_X 9\n    #else\n        #define SPEED_X 8\n    #endif\n    #if XSize>=32\n        #define POWER_X ((XSize)-10)\n    #else\n        #define POWER_X ((XSize)-9)\n    #endif\n#endif \n\n#if XSize>=32\n    #define ARROWS_X POWER_X-6\n#else\n    #define ARROWS_X POWER_X-4\n#endif\n\n\nuint8_t find_inactive(Item* itemArray)\n{\n    uint8_t i;\n    \n    for(i=0;i<NUMBER_OF_MISSILES;++i)\n    {\n        if(!itemArray[i]._active)\n        {\n            return i;\n        }\n    }\n    return i;\n}\n\n#if YSize<=10\n    #define display_power_ups()\n#elif !defined(_XL_NO_COLOR) && !defined(_XL_NO_TEXT_COLOR)\nvoid display_power_ups(void)\n{\n    uint8_t range_color;\n    uint8_t speed_color;\n    uint8_t color;\n\n    uint8_t power_color;\n    \n    uint8_t i;\n    \n    speed_color = _XL_RED;\n    arrow_display_color = _XL_CYAN;\n    power_color = _XL_RED;\n    \n    if(powerUp<3) // range\n    {\n        range_color = power_up_color[powerUp];\n    }\n    else\n    {\n        range_color = _XL_GREEN;\n\n        if(powerUp<5) // speed\n        {\n            speed_color = power_up_color[powerUp-2];\n        }\n        else\n        {\n            speed_color = _XL_GREEN;\n    \n            if(powerUp>6)\n            {\n                if(powerUp<9)\n                {\n                    power_color = power_up_color[powerUp-6];\n                    arrow_display_color = arrow_color[powerUp-6];\n                }\n                else\n                {\n                    power_color = _XL_GREEN;\n                    arrow_display_color = _XL_WHITE;\n                }\n            }\n        }\n    }\n\n    _XL_SET_TEXT_COLOR(range_color);\n    _XL_PRINT(RANGE_X,POWER_UPS_Y,RANGE_STRING);\n    \n    _XL_SET_TEXT_COLOR(speed_color);\n    _XL_PRINT(SPEED_X,POWER_UPS_Y,SPEED_STRING);\n    \n    _XL_SET_TEXT_COLOR(power_color);\n    _XL_PRINT(POWER_X,POWER_UPS_Y,POWER_STRING);\n\n    for(i=0;i<3;++i)\n    {\n        if(i<=number_of_arrows_per_shot-1)\n        {\n           color = arrow_display_color;\n        }\n        else\n        {\n           color = _XL_RED;\n        }\n        _XL_DRAW(ARROWS_X+i,POWER_UPS_Y,ARROW_TILE_0,color);\n    }\n}\n#elif !defined(_XL_NO_COLOR) // COLOR but NO TEXT COLOR\nvoid display_power_ups(void)\n{\n    uint8_t range_value;\n    uint8_t speed_value;\n    uint8_t power_value;\n    uint8_t color;\n    \n    uint8_t i;\n    \n    arrow_display_color = _XL_CYAN;    \n    speed_value = 1;\n    power_value = 1;\n    \n    if(powerUp<3) // range\n    {\n        range_value = powerUp+1;\n    }\n    else\n    {\n        range_value = 3;\n\n        if(powerUp<5) // speed\n        {\n            speed_value = powerUp+1-2;\n        }\n        else\n        {\n            speed_value = 3;\n    \n            if(powerUp>6)\n            {\n                if(powerUp<9)\n                {\n                    power_value = powerUp+1-6;\n                    arrow_display_color = arrow_color[powerUp-6];\n                }\n                else\n                {\n                    power_value = 3;\n                    arrow_display_color = _XL_WHITE;\n                }\n            }\n        }\n    }\n\n    _XL_PRINT(RANGE_X,POWER_UPS_Y,RANGE_STRING);\n    _XL_PRINTD(RANGE_X+STR_LEN,POWER_UPS_Y,1,range_value);\n    \n    _XL_PRINT(SPEED_X,POWER_UPS_Y,SPEED_STRING);\n    _XL_PRINTD(SPEED_X+STR_LEN,POWER_UPS_Y,1,speed_value);\n    \n    _XL_PRINT(POWER_X,POWER_UPS_Y,POWER_STRING);\n    _XL_PRINTD(POWER_X+STR_LEN,POWER_UPS_Y,1,power_value);\n\n    for(i=0;i<3;++i)\n    {\n        if(i<=number_of_arrows_per_shot-1)\n        {\n           color = arrow_display_color;\n        }\n        else\n        {\n           color = _XL_RED;\n        }\n        _XL_DRAW(ARROWS_X+i,POWER_UPS_Y,ARROW_TILE_0,color);\n    }\n}\n#else // NO COLOR and NO TEXT COLOR\nvoid display_power_ups(void)\n{\n    uint8_t range_value;\n    uint8_t speed_value;\n    uint8_t power_value;\n    \n    uint8_t i;\n    \n    speed_value = 1;\n    power_value = 1;\n    \n    if(powerUp<3) // range\n    {\n        range_value = powerUp+1;\n    }\n    else\n    {\n        range_value = 3;\n\n        if(powerUp<5) // speed\n        {\n            speed_value = powerUp+1-2;\n        }\n        else\n        {\n            speed_value = 3;\n    \n            if(powerUp>6)\n            {\n                if(powerUp<9)\n                {\n                    power_value = powerUp+1-6;\n                }\n                else\n                {\n                    power_value = 3;\n                }\n            }\n        }\n    }\n\n    _XL_PRINT(RANGE_X,POWER_UPS_Y,RANGE_STRING);\n    _XL_PRINTD(RANGE_X+STR_LEN,POWER_UPS_Y,1,range_value);\n    \n    _XL_PRINT(SPEED_X,POWER_UPS_Y,SPEED_STRING);\n    _XL_PRINTD(SPEED_X+STR_LEN,POWER_UPS_Y,1,speed_value);\n    \n    _XL_PRINT(POWER_X,POWER_UPS_Y,POWER_STRING);\n    _XL_PRINTD(POWER_X+STR_LEN,POWER_UPS_Y,1,power_value);\n\n    for(i=0;i<number_of_arrows_per_shot;++i)\n    {\n        _XL_DRAW(ARROWS_X+i,POWER_UPS_Y,ARROW_TILE_0,_XL_CYAN);\n    }\n}\n#endif\n\n#if YSize>10\n    #define activate_hyper() \\\n    { \\\n        _XL_ZAP_SOUND(); \\\n        bow_reload_loops=HYPER_SPEED_VALUE; \\\n        recharge_arrows(HYPER_RECHARGE); \\\n        hyper_counter = MAX_HYPER_COUNTER; \\\n        bow_color = _XL_RED; \\\n        _XL_SET_TEXT_COLOR(_XL_RED); \\\n        PRINT_CENTERED_ON_ROW(1,\" HYPER \"); \\\n    }\n#else\n    #define activate_hyper() \\\n    { \\\n        _XL_ZAP_SOUND(); \\\n        bow_reload_loops=HYPER_SPEED_VALUE; \\\n        recharge_arrows(HYPER_RECHARGE); \\\n        hyper_counter = MAX_HYPER_COUNTER; \\\n        bow_color = _XL_RED; \\\n    }\n#endif\n\nvoid power_up_effect(void)\n{\n    uint8_t pmod10;\n    \n    ++powerUp;\n    \n    pmod10 = powerUp%10;    \n\n    switch(pmod10)\n    {\n        case 0:\n            activate_hyper();\n            #if !defined(_XL_NO_COLOR)\n            powerUpItem._color = _XL_WHITE;\n            #endif\n        break;\n        \n        case 4:\n            #if !defined(_XL_NO_COLOR)\n            powerUpItem._color = _XL_CYAN; \n            #endif\n        break;\n        \n        case 5:\n            freeze_locked=0;\n            #if !defined(_XL_NO_COLOR)\n            powerUpItem._color = _XL_WHITE;\n            #endif\n        break;\n        \n        case 9:\n            #if !defined(_XL_NO_COLOR)\n            powerUpItem._color = _XL_RED;\n            #endif\n        break;\n    } \n    \n    display_power_up_counter();\n    increase_score(POWERUP_POINTS);\n    \n    switch(powerUp)\n    {\n        #if !defined(TRAINER)\n            case 1:\n                arrow_range=YELLOW_RANGE_VALUE;\n            break;\n                \n            case 2:\n                arrow_range=GREEN_RANGE_VALUE;\n            break;\n            \n            case 3:\n                bow_reload_loops=YELLOW_SPEED_VALUE;\n            break;\n               \n            case 4:\n                bow_reload_loops=GREEN_SPEED_VALUE;\n            break;\n            \n            case 5:\n                number_of_arrows_per_shot = 2;\n            break;\n            \n            case 6:\n                number_of_arrows_per_shot = 3;\n            break;\n            \n            case 7:\n                fire_power = YELLOW_FIRE_POWER_VALUE;\n            break;\n            \n            case 8:\n                fire_power = GREEN_FIRE_POWER_VALUE;\n                #if !defined(_XL_NO_COLOR)\n                powerUpItem._color = _XL_YELLOW;\n                #endif\n            break;\n       \n        #endif\n        \n        case 19:\n            #if !defined(_XL_NO_COLOR)\n            powerUpItem._color = _XL_GREEN;\n            #endif\n        break;\n        \n        case 20:\n            zombie_locked = 0;\n        break;\n        \n        default:\n        break;\n    }\n    display_power_ups();\n}\n\nvoid extra_points_effect(void)\n{\n    increase_score(EXTRA_POINTS);\n}\n\n\nvoid wall_effect(void)\n{\n    uint8_t i;\n    \n    increase_score(WALL_POINTS);\n\n#if defined(SMALL_WALL)\n    for(i=7*(XSize)/16;i<1+7*(XSize)/16+(XSize)/8;++i)\n#else    \n    for(i=3*(XSize)/8;i<1+3*(XSize)/8+(XSize)/4;++i)\n#endif\n    {\n        if(zombie_y[i]<WALL_Y-1 || !zombie_active[i])\n        {\n            wall[i]=WALL_ENERGY;\n            _XL_DRAW(i,WALL_Y,WALL_TILE,_XL_YELLOW);            \n        }\n        else\n        {\n            wall[i]=0;\n        }\n    }\n    ++wall_appeared;\n    active_wall = 1;\n}\n\n\n\nvoid display_zombies(void)\n{\n    for(zombie_x=0;zombie_x<XSize;++zombie_x)\n    {\n        if(zombie_active[zombie_x])\n        {\n            display_zombie();\n        }\n    }\n}\n\n\nvoid freeze_effect(void)\n{\n    freeze=FREEZE_COUNTER_MAX;\n\n    display_zombies();\n    increase_score(FREEZE_POINTS);\n    ++freeze_locked;\n}\n\n\nvoid zombie_effect(void)\n{\n    for(zombie_x=0;zombie_x<XSize;++zombie_x)\n    {\n        zombie_level[zombie_x]=1;\n    }\n    display_zombies();\n\n    zombie_locked = 1;\n    increase_score(ZOMBIE_ITEM_POINTS);\n}\n\nvoid beam_effect(void)\n{\n    alive=0;\n}\n\n#if !defined(_XL_NO_COLOR)\n    #define initialize_items() \\\n    { \\\n        uint8_t i; \\\n        \\\n        rechargeItem._active = 0; \\\n        rechargeItem._tile = ARROW_TILE_0; \\\n        rechargeItem._color = _XL_YELLOW; \\\n        rechargeItem._effect = recharge_effect; \\\n        \\\n        freezeItem._active = 0; \\\n        freezeItem._tile = FREEZE_TILE; \\\n        freezeItem._color = _XL_CYAN; \\\n        freezeItem._effect = freeze_effect; \\\n        \\\n        powerUpItem._active = 0; \\\n        powerUpItem._tile = POWER_UP_TILE; \\\n        powerUpItem._color = _XL_WHITE; \\\n        powerUpItem._effect = power_up_effect; \\\n        \\\n        wallItem._active = 0; \\\n        wallItem._tile = WALL_TILE; \\\n        wallItem._color = _XL_YELLOW; \\\n        wallItem._effect = wall_effect; \\\n        \\\n        zombieItem._active = 0; \\\n        zombieItem._tile = BOSS_TILE_0; \\\n        zombieItem._color = _XL_GREEN; \\\n        zombieItem._effect = zombie_effect; \\\n        \\\n        for(i=0;i<NUMBER_OF_MISSILES;++i) \\\n        { \\\n            enemyMissile[i]._active = 0; \\\n            enemyMissile[i]._tile = BEAM_TILE; \\\n            enemyMissile[i]._color = _XL_CYAN; \\\n            enemyMissile[i]._effect = beam_effect; \\\n            \\\n            extraPointsItem[i]._active = 0; \\\n            extraPointsItem[i]._tile = EXTRA_POINTS_TILE; \\\n            extraPointsItem[i]._color = _XL_GREEN; \\\n            extraPointsItem[i]._effect = extra_points_effect; \\\n        } \\\n    }\n#else\n    #define initialize_items() \\\n    { \\\n        uint8_t i; \\\n        \\\n        rechargeItem._active = 0; \\\n        rechargeItem._tile = ARROW_TILE_0; \\\n        rechargeItem._effect = recharge_effect; \\\n        \\\n        freezeItem._active = 0; \\\n        freezeItem._tile = FREEZE_TILE; \\\n        freezeItem._effect = freeze_effect; \\\n        \\\n        powerUpItem._active = 0; \\\n        powerUpItem._tile = POWER_UP_TILE; \\\n        powerUpItem._effect = power_up_effect; \\\n        \\\n        wallItem._active = 0; \\\n        wallItem._tile = WALL_TILE; \\\n        wallItem._effect = wall_effect; \\\n        \\\n        zombieItem._active = 0; \\\n        zombieItem._tile = BOSS_TILE_0; \\\n        zombieItem._effect = zombie_effect; \\\n        \\\n        for(i=0;i<NUMBER_OF_MISSILES;++i) \\\n        { \\\n            enemyMissile[i]._active = 0; \\\n            enemyMissile[i]._tile = BEAM_TILE; \\\n            enemyMissile[i]._effect = beam_effect; \\\n            \\\n            extraPointsItem[i]._active = 0; \\\n            extraPointsItem[i]._tile = EXTRA_POINTS_TILE; \\\n            extraPointsItem[i]._effect = extra_points_effect; \\\n        } \\\n    }\n#endif\n\n#define display_level() \\\n{ \\\n    _XL_DRAW(XSize-2,0,LV_TILE,_XL_CYAN); \\\n    _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\n    _XL_PRINTD(XSize-1,0,1,level+1); \\\n}\n\n\n\n#define move_left() \\\n{ \\\n    bow_shape_tile = 2*((--bow_x)&1); \\\n    if(bow_shape_tile) \\\n    { \\\n        _XL_DELETE((bow_x>>1)+2,BOW_Y); \\\n    } \\\n    display_bow(); \\\n}\n\n\n#define move_right() \\\n{ \\\n    bow_shape_tile = 2*((++bow_x)&1); \\\n    if(!bow_shape_tile) \\\n    { \\\n        _XL_DELETE((bow_x>>1)-1,BOW_Y); \\\n    } \\\n    display_bow(); \\\n}\n\n\nvoid drop_item(register Item *item, uint8_t max_counter)\n{\n    uint8_t offset;\n\n    offset = zombie_y[zombie_x]+1;\n    \n    _XL_TICK_SOUND();\n    item->_active = 1;\n    item->_x = zombie_x;\n\n    if(zombie_shape[zombie_x])\n    {\n        ++offset;\n    }\n    item->_y = offset;\n    \n    item->_counter=max_counter;\n}\n\n\nvoid handle_item(register Item* item)\n{\n    if(item->_active)\n    {\n        // TODO: Necessary for GCC for TI99\n        uint8_t item_tile = item->_tile;\n        \n        if(item->_y<BOW_Y)\n        {\n            _XL_DELETE(item->_x,item->_y);\n            if(main_loop_counter&1)\n            {\n                ++(item->_y);\n            }\n                  \n            #if !defined(_XL_NO_COLOR)\n                    // TODO: GCC for TI99 does not display the correct tile with item->_tile\n                    _XL_DRAW(item->_x,item->_y,item_tile,item->_color);\n            #else\n                _XL_DRAW(item->_x,item->_y,item_tile,0);\n            #endif\n        }\n        else\n        {\n            if(item->_counter&1)\n            {\n                _XL_DELETE(item->_x,item->_y);\n            }\n            else\n            {\n                #if !defined(_XL_NO_COLOR)\n                _XL_DRAW(item->_x,item->_y,item_tile,item->_color);\n                #else\n                _XL_DRAW(item->_x,item->_y,item_tile,0);\n                #endif\n            }\n \n            if(item->_x==(bow_x>>1)+(bow_x&1))\n            {\n                item->_effect();\n                _XL_PING_SOUND();\n                item->_active=0;\n            }\n            display_bow();\n            --(item->_counter);\n            if(!(item->_counter))\n            {\n                item->_active=0;\n            }\n        }\n    }   \n}\n\n\n#define handle_items() \\\n{ \\\n    uint8_t i; \\\n    \\\n    handle_item(&rechargeItem); \\\n    handle_item(&freezeItem); \\\n    handle_item(&powerUpItem); \\\n    handle_item(&wallItem); \\\n    handle_item(&zombieItem); \\\n    \\\n    for(i=0;i<NUMBER_OF_MISSILES;++i) \\\n    { \\\n        handle_item(&extraPointsItem[i]); \\\n        handle_item(&enemyMissile[i]); \\\n    } \\\n}\n\n\n#if XSize!=13 && XSize!=26 && XSize!=39 && XSize!=52 && XSize!=65 && XSize!=78\n    #define STEP 13\n#else\n    #define STEP 17\n#endif \n\n#if XSize<=40\n    #define RANDOM_ZOMBIE_RANGE_START (31)\n#else\n    #define RANDOM_ZOMBIE_RANGE_START (63)\n#endif\n\nuint8_t find_random_zombie(uint8_t value)\n{\n    uint8_t i;\n    uint8_t index;\n    \n    index = (uint8_t) (_XL_RAND())&RANDOM_ZOMBIE_RANGE_START;\n\n    for(i=0;i<XSize;++i)\n    {\n        index = (index+STEP)%XSize;\n        if(zombie_active[index]==value)\n        {\n            return index;\n        }\n    }\n    return XSize;\n}\n\n\nvoid activate_zombie(void)\n{\n    uint8_t old_x;\n    \n    old_x = zombie_x;\n    \n    while((old_x==zombie_x) || (old_x+1==zombie_x) || (old_x-1==zombie_x))\n    {\n        zombie_x = find_random_zombie(0);\n    };    \n  \n    zombie_active[zombie_x]=1;    \n    zombie_shape[zombie_x]=0;\n    #if YSize<=16\n        zombie_y[zombie_x]=INITIAL_RESPAWN_ZOMBIE_Y;\n    #else\n        zombie_y[zombie_x]=INITIAL_RESPAWN_ZOMBIE_Y+(level>>1);\n    #endif\n}\n\n\nvoid spawn_minion(void)\n{\n    activate_zombie();\n    zombie_level[zombie_x]=0;\n    energy[zombie_x]=MINION_ENERGY;  \n    --minions_to_spawn;\n}\n\n\nvoid spawn_boss(void)\n{\n    uint8_t rank;\n    \n    do\n    {\n        if(!level) // 0\n        {\n            rank = 1;\n        }\n        else if(level==1) // 1\n        {\n            rank = (uint8_t) (1 + ((_XL_RAND())&1));\n        }\n        else if(level<5) // 2, 3, 4\n        {\n            rank = (uint8_t) (1 + ((_XL_RAND())%3));   \n        }\n        else // 5, 6, 7, 8\n        {\n            rank = (uint8_t) (2 + ((_XL_RAND())&1)); \n        }\n    } while((rank==2)&&(bosses_to_kill<LEVEL_2_ZOMBIE_THRESHOLD));\n\n    activate_zombie();\n    zombie_level[zombie_x]=rank;\n    energy[zombie_x]=BOSS_ENERGY;\n    --bosses_to_spawn;\n}\n\n#if !defined(NORMAL_ZOMBIE_SPEED) && !defined(SLOW_ZOMBIE_SPEED)\n    #if XSize>=32\n        #define NORMAL_ZOMBIE_SPEED 1\n        #define SLOW_ZOMBIE_SPEED 7\n    #else\n        #define NORMAL_ZOMBIE_SPEED 3\n        #define SLOW_ZOMBIE_SPEED 7\n    #endif \n#endif\n\nvoid update_zombie_speed(void)\n{\n    if(minions_to_kill + bosses_to_kill<=FEW_ZOMBIES)\n    {\n        zombie_speed=SLOW_ZOMBIE_SPEED;\n    }\n    else\n    {\n        zombie_speed=NORMAL_ZOMBIE_SPEED;\n    }\n}\n\n\nvoid display_wall(uint8_t y)\n{\n    uint8_t i;\n    \n    for(i=0; i<XSize; ++i)\n    {   \n        _XL_DRAW(i,y,WALL_TILE,_XL_YELLOW); \n    }\n}\n\n\n#define _display_red_zombie(tile) \\\n{ \\\n    _XL_DRAW(zombie_x,zombie_y[zombie_x],tile,_XL_RED); \\\n}\n\n\nvoid display_red_zombie(void)\n{\n    uint8_t tile;\n    \n    if(!zombie_level[zombie_x])\n    {\n        tile=MINION_TILE_0;\n    }\n    else\n    {\n        tile=BOSS_TILE_0;\n    }\n    _display_red_zombie(tile);\n}\n\n\nvoid handle_item_drop(void)\n{\n    if(zombie_level[zombie_x] || ((uint8_t) (_XL_RAND()) <75))\n    {        \n        ++item_counter;\n        item_counter&=3;\n        \n        if((level>=4)&&(powerUp<=3))\n        {\n            item_counter&=1;\n        }\n        \n        if(!item_counter)\n        {\n            if(!rechargeItem._active)\n            {\n                drop_item(&rechargeItem,45);\n            }\n        }\n        else if(item_counter==1)\n        {\n            if(!powerUpItem._active)\n            {\n                drop_item(&powerUpItem,35);\n            } \n        }\n        else if((!freeze_locked)&&(!freeze))\n        {\n            if(!freezeItem._active)\n            {\n                drop_item(&freezeItem,45);\n            }\n        }\n        else if(!wall_appeared&&(powerUp>=9)) \n        {\n            if(!wallItem._active)\n            {\n                drop_item(&wallItem,35);\n            }\n        }\n        else if(!zombie_locked && !zombieItem._active)\n            {\n                drop_item(&zombieItem,50);\n            }\n        else\n        {\n            uint8_t index; \n            \n            index = find_inactive(extraPointsItem);\n            if(index!=NUMBER_OF_EXTRA_POINTS)\n            {\n                drop_item(&extraPointsItem[index],90);\n            }            \n        }  \n    }\n}\n\n\nvoid respawn(void)\n{\n    if(minions_to_spawn || bosses_to_spawn)\n    {\n        if (minions_to_spawn)\n        {\n            spawn_minion();\n        }\n        else \n        {\n            spawn_boss();\n        }\n        display_zombie();\n    }\n\n    update_zombie_speed();\n}\n\n\nvoid zombie_dies(void)\n{\n    uint8_t y_pos = zombie_y[zombie_x];\n    uint8_t i;\n    \n    // _XL_DELETE(zombie_x,y_pos-1);\n    // _XL_DELETE(zombie_x,y_pos);\n\n    _XL_DELETE(zombie_x,y_pos+1);\n    \n    _XL_DRAW(zombie_x,y_pos, ZOMBIE_DEATH_TILE, _XL_RED);\n\n\n    for(i=0;i<17;++i)\n    {\n        _XL_DRAW(zombie_x,y_pos, ZOMBIE_DEATH_TILE, _XL_RED);\n        display_red_zombie();\n    } \n    _XL_SHOOT_SOUND();\n    _XL_DELETE(zombie_x,y_pos);\n    \n    #if defined(NO_BOTTOM_WALL_REDRAW)\n    #elif YSize>10\n        display_wall(BOTTOM_WALL_Y);\n    #endif\n    \n    display_bow();\n        \n    if(zombie_level[zombie_x])\n    {\n        ++killed_bosses;\n        --bosses_to_kill;\n    }\n    else\n    {\n        ++killed_minions;\n        --minions_to_kill;\n    }\n   \n    if(zombie_x==forced_zombie_x)\n    {\n        forced_zombie = 0;\n    }\n    \n    if(y_pos<BOW_Y-2)\n    {\n        handle_item_drop();\n    }\n    \n    zombie_active[zombie_x]=0;\n    \n    display_zombie_counter();\n}\n\n\n#define compute_next_available_arrow_index() \\\n    for(next_arrow=0;next_arrow<MAX_ARROWS_ON_SCREEN;++next_arrow) \\\n    { \\\n        if(!active_arrow[next_arrow]) \\\n        { \\\n            break; \\\n        } \\\n    }\n\n\nvoid handle_arrows(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<MAX_ARROWS_ON_SCREEN;++i)\n    {\n        if(active_arrow[i]) // ACTIVE\n        {    \n            if(arrow_y[i]<(arrow_range))\n            {\n                active_arrow[i]=0;\n                --arrows_on_screen;\n            }\n            else\n            {\n                _XL_DELETE(arrow_x[i],arrow_y[i]);\n                --arrow_y[i];\n                if(arrow_y[i]>=(arrow_range))\n                {\n                    #if !defined(_XL_NO_COLOR)\n                    _XL_DRAW(arrow_x[i],arrow_y[i],arrow_shape[i],arrow_display_color);\n                    #else\n                    _XL_DRAW(arrow_x[i],arrow_y[i],arrow_shape[i],0);\n                    #endif\n                }\n            }\n        }\n    }\n}\n\n\n#define decrease_energy() \\\ndo \\\n{ \\\n    if(energy[zombie_x]<=fire_power) \\\n    { \\\n        energy[zombie_x]=0; \\\n    } \\\n    else \\\n    { \\\n        energy[zombie_x]-=fire_power; \\\n    } \\\n} while(0)\n\n\n#if defined(SMALL_WALL)\n\n    #define redraw_wall() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        \\\n        for(i=7*(XSize)/16;i<1+7*(XSize)/16+(XSize)/8;++i) \\\n        { \\\n            if(wall[i]) \\\n            { \\\n                _XL_DRAW(i,WALL_Y,WALL_TILE,_XL_YELLOW); \\\n            } \\\n        } \\\n    } while(0)\n\n#else\n\n    #define redraw_wall() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        \\\n        for(i=3*(XSize)/8;i<1+3*(XSize)/8+(XSize)/4;++i) \\\n        { \\\n            if(wall[i]) \\\n            { \\\n                _XL_DRAW(i,WALL_Y,WALL_TILE,_XL_YELLOW); \\\n            } \\\n        } \\\n    } while(0)\n\n\n#endif\n\nvoid push_zombie(void)\n{\n    if(!zombie_shape[zombie_x])\n    {\n        --zombie_y[zombie_x];\n        zombie_shape[zombie_x]=3;\n    }\n    else \n    {\n        --zombie_shape[zombie_x];\n        _XL_DELETE(zombie_x,zombie_y[zombie_x]+1);\n    }\n}\n\n/*\nuint8_t zombie_hit(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<MAX_ARROWS_ON_SCREEN;++i)\n    {\n        if(active_arrow[i] && arrow_x[i]==zombie_x\n          && zombie_y[zombie_x]>=arrow_y[i]-1 && zombie_y[zombie_x]<=arrow_y[i]+1)\n           {\n               if(freeze || (zombie_level[zombie_x]!=2) || zombie_shape[zombie_x])\n               {\n                   active_arrow[i]=0;\n                    --arrows_on_screen;\n\n                   _XL_DELETE(arrow_x[i],arrow_y[i]);\n                   return 1;\n               }\n               else // Arrows goes through ghost !free (non-frozen) && zombie_level==2 (i.e., ghost zombie) && !zombie_shape (i.e. invincible shape)\n               {\n                   display_zombie(); // display invincible ghost zombie\n                   return 0; // two arrows cannot be at the same place\n               }\n           }\n    }\n    return 0;\n}\n\n\nvoid handle_zombie_collisions(void)\n{\n    for(zombie_x=0;zombie_x<XSize;++zombie_x)\n    {\n        if(zombie_active[zombie_x] && zombie_hit())\n        {\n            decrease_energy();\n\n            if(energy[zombie_x])\n            {\n                display_red_zombie();\n                _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n                \n                _XL_TOCK_SOUND();\n                push_zombie();\n                display_zombie();\n                #if defined(_XL_NO_UDG)\n                _XL_DELETE(zombie_x,zombie_y[zombie_x]+1);\n                #endif\n            }\n            else\n            {\n                zombie_dies();\n                increase_score(zombie_points[zombie_level[zombie_x]]);\n                respawn();\n            }\n        }\n    }\n}\n*/\n\n#define not_stealth() freeze || (zombie_level[zombie_x]!=2) || zombie_shape[zombie_x]\n\nvoid handle_zombie_collisions(void)\n{\n    uint8_t i;\n\t\n    for(i=0;i<MAX_ARROWS_ON_SCREEN;++i)\n    {\n\t\tif(active_arrow[i])\n\t\t{\n\t\t\tzombie_x = arrow_x[i];\n\t\t\tif(zombie_active[zombie_x])\n\t\t\t{\n\t\t\t\tif(zombie_y[zombie_x]>=arrow_y[i]-1 && zombie_y[zombie_x]<= arrow_y[i]+1)\n\t\t\t\t{\n\t\t\t\t\tif(not_stealth())\n\t\t\t\t\t{\n\t\t\t\t\t\t--arrows_on_screen;\n\n\t\t\t\t\t\t_XL_DELETE(arrow_x[i],arrow_y[i]);\n\t\t\t\t\t\tactive_arrow[i]=0;\n\t\t\t\t\t\tdecrease_energy();\n\n\t\t\t\t\t\tif(energy[zombie_x])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplay_red_zombie();\n\t\t\t\t\t\t\t_XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_XL_TOCK_SOUND();                \n\t\t\t\t\t\t\tpush_zombie();\n\t\t\t\t\t\t\tdisplay_zombie();\n\t\t\t\t\t\t\t#if defined(_XL_NO_UDG)\n\t\t\t\t\t\t\t_XL_DELETE(zombie_x,zombie_y[zombie_x]+1);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tzombie_dies();\n\t\t\t\t\t\t\tincrease_score(zombie_points[zombie_level[zombie_x]]);\n\t\t\t\t\t\t\trespawn();\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplay_zombie();\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n#define _move_zombie() \\\n{ \\\n    ++zombie_shape[zombie_x]; \\\n    (zombie_shape[zombie_x])&=3; \\\n    if(!zombie_shape[zombie_x]) \\\n        { \\\n            ++zombie_y[zombie_x]; \\\n        } \\\n}\n\n\n#if !defined(MISSILE_DROP_LOOP_MASK)\n    #define MISSILE_DROP_LOOP_MASK (1)\n#endif\n\n#if !defined(NO_NASTY_DROP)\n    #define handle_missile_drops() \\\n    { \\\n        if((level>=2)&& !freeze) \\\n        { \\\n            uint8_t missile_index; \\\n            if((missile_index = find_inactive(enemyMissile)) < NUMBER_OF_MISSILES) \\\n            { \\\n                if(!(main_loop_counter&missile_randomness_mask)) \\\n                { \\\n                    zombie_x = (bow_x>>1)+(bow_x&1); \\\n                } \\\n                else \\\n                { \\\n                    zombie_x = (uint8_t) (_XL_RAND())%XSize; \\\n                } \\\n                if((zombie_level[zombie_x]>2) && zombie_active[zombie_x] && zombie_y[zombie_x]<HEIGHT_SHOOT_THRESHOLD) \\\n                { \\\n                    drop_item(&enemyMissile[missile_index],1); \\\n                } \\\n            } \\\n        } \\\n    } \n#else\n    #define handle_missile_drops() \\\n    { \\\n        if((level>=2)&& !freeze) \\\n        { \\\n            uint8_t missile_index; \\\n            if((missile_index = find_inactive(enemyMissile)) < NUMBER_OF_MISSILES) \\\n            { \\\n                zombie_x = (uint8_t) (_XL_RAND())%XSize; \\\n                if((zombie_level[zombie_x]>2) && zombie_active[zombie_x] && zombie_y[zombie_x]<HEIGHT_SHOOT_THRESHOLD) \\\n                { \\\n                    drop_item(&enemyMissile[missile_index],1); \\\n                } \\\n            } \\\n        } \\\n    } \n#endif\n\nvoid move_zombies(void)\n{\n    uint8_t j;\n    \n    if(forced_zombie)\n    {\n        zombie_x = forced_zombie_x;\n    }\n    else\n    {\n        zombie_x=find_random_zombie(1);\n    }\n\n    if((zombie_shape[zombie_x]==3)||(((zombie_level[zombie_x]==2)&&(zombie_shape[zombie_x]&1))&&(zombie_y[zombie_x]!=BOW_Y-1)))\n    {\n        forced_zombie = 0;\n    }\n    else\n    {\n        forced_zombie = 1;\n        forced_zombie_x = zombie_x; \n    }\n    if(wall[zombie_x] && zombie_y[zombie_x]==WALL_Y-1)\n    {\n        --wall[zombie_x];\n        \n        for(j=0;j<3;++j)\n        {\n            _XL_DRAW(zombie_x, WALL_Y, WALL_TILE, _XL_RED);\n            _XL_TICK_SOUND();\n            _XL_DRAW(zombie_x, WALL_Y, WALL_TILE, _XL_YELLOW);\n        }\n        if(!wall[zombie_x])\n        {\n            _XL_DRAW(zombie_x, WALL_Y, WALL_TILE, _XL_RED);\n            _XL_EXPLOSION_SOUND();\n            _XL_DELETE(zombie_x, WALL_Y);\n        }\n    }\n    else\n    {\n        _move_zombie();\n    }\n    display_zombie();\n\n    \n    if(zombie_y[zombie_x]==BOW_Y)\n    {\n        alive = 0;\n        display_red_zombie();\n    }\n}\n\n\n#define handle_bow_load() \\\ndo \\\n{ \\\n    if(!loaded_bow && arrows_on_screen<MAX_ARROWS_ON_SCREEN && !bow_load_counter && remaining_arrows) \\\n    { \\\n        loaded_bow = 1; \\\n        display_bow(); \\\n    } \\\n    if(bow_load_counter) \\\n    { \\\n        --bow_load_counter; \\\n    } \\\n} while(0)\n\n\nvoid fire(void)\n{\n    uint8_t i;\n    uint8_t new_arrow_x;  \n    uint8_t offset;\n    \n    _XL_TICK_SOUND();\n    new_arrow_x = (bow_x>>1)+(bow_x&1);\n    for(i=0;i<number_of_arrows_per_shot;++i)\n    {\n        if(remaining_arrows && arrows_on_screen<MAX_ARROWS_ON_SCREEN)\n        {\n            if((number_of_arrows_per_shot==2)&&i)\n            {\n                offset = i-2*(bow_x&1);\n            }\n            else\n            {\n                offset = i;\n            }\n            new_arrow_x+=offset;\n            if(i==2)\n            {\n                if(new_arrow_x>=4)\n                {\n                    new_arrow_x-=4; \n                }\n                else\n                {\n                    continue;\n                }\n            }\n            if(new_arrow_x<XSize)\n            {\n                compute_next_available_arrow_index();\n\n                active_arrow[next_arrow] = 1;\n                ++arrows_on_screen;\n                if(number_of_arrows_per_shot==2)\n                {\n                    arrow_shape[next_arrow] = arrow_tile[!(bow_x&1)];\n                }\n                else\n                {\n                    arrow_shape[next_arrow] = arrow_tile[bow_x&1];\n                }\n                arrow_y[next_arrow] = BOW_Y-1;\n                arrow_x[next_arrow] = new_arrow_x;\n                #if !defined(TRAINER)\n                    --remaining_arrows;\n                #endif\n            }\n        }\n    }\n    display_remaining_arrows();\n\n    bow_load_counter = bow_reload_loops;\n    loaded_bow = 0;\n    display_bow();\n}\n\n#if defined(_XL_NO_UDG)\n    #define handle_bow_move() \\\n    do \\\n    { \\\n        input = _XL_INPUT(); \\\n        \\\n        if(_XL_LEFT(input) && bow_x) \\\n        { \\\n            move_left(); \\\n            if(bow_x) \\\n            { \\\n                move_left(); \\\n            } \\\n        } \\\n        else if (_XL_RIGHT(input) && bow_x<MAX_BOW_X) \\\n        { \\\n            move_right(); \\\n            if(bow_x<MAX_BOW_X) \\\n            { \\\n                move_right(); \\\n            } \\\n        } \\\n        else if (_XL_FIRE(input) && loaded_bow) \\\n        { \\\n            fire(); \\\n        } \\\n    } while(0)\n#else\n    #define handle_bow_move() \\\n    do \\\n    { \\\n        input = _XL_INPUT(); \\\n        \\\n        if(_XL_LEFT(input) && bow_x) \\\n        { \\\n            move_left(); \\\n        } \\\n        else if (_XL_RIGHT(input) && bow_x<MAX_BOW_X) \\\n        { \\\n            move_right(); \\\n        } \\\n        else if (_XL_FIRE(input) && loaded_bow) \\\n        { \\\n            fire(); \\\n        } \\\n    } while(0)\n#endif\n\n#define game_over() \\\ndo \\\n{ \\\n    _XL_EXPLOSION_SOUND(); \\\n    _XL_SET_TEXT_COLOR(_XL_RED); \\\n    PRINT_CENTERED(_XL_G _XL_A _XL_M _XL_E _XL_SPACE _XL_O _XL_V _XL_E _XL_R); \\\n    sleep_and_wait_for_input(); \\\n    _XL_CLEAR_SCREEN(); \\\n} while(0)\n\n\n#define global_initialization() \\\ndo \\\n{ \\\n    if(score>hiscore) \\\n    { \\\n        hiscore=score; \\\n    } \\\n    score = 0; \\\n    level = INITIAL_LEVEL; \\\n    killed_bosses = 0; \\\n    killed_minions = 0; \\\n    lives = INITIAL_LIVES; \\\n    next_threshold = NEXT_EXTRA_LIFE; \\\n} while(0)\n\n\n#if defined(TRAINER)\n    #define level_initialization() \\\n        do \\\n        {   \\\n            fire_power = GREEN_FIRE_POWER_VALUE; \\\n            active_wall = 0; \\\n            freeze = 0; \\\n            powerUp = 8; \\\n            next_arrow = 0; \\\n            arrows_on_screen = 0; \\\n            bow_load_counter = 0; \\\n            wall_appeared = 0; \\\n            freeze_locked = 1; \\\n            zombie_locked = 1; \\\n            forced_zombie = 0; \\\n            loaded_bow = 1; \\\n            alive = 1; \\\n            bow_reload_loops = GREEN_SPEED_VALUE; \\\n            auto_recharge_counter = AUTO_RECHARGE_COOL_DOWN; \\\n            remaining_arrows = MAX_ARROWS; \\\n            arrow_range = GREEN_RANGE_VALUE; \\\n            bow_x = XSize; \\\n            bow_shape_tile = 2*((bow_x)&1); \\\n            bow_color = _XL_CYAN; \\\n            number_of_arrows_per_shot = 3; \\\n            initialize_items(); \\\n            hyper_counter = 0; \\\n            missile_randomness_mask = 255; \\\n            _XL_CLEAR_SCREEN(); \\\n        } while(0)\n\n#else\n    #define level_initialization() \\\n        do \\\n        {   \\\n            fire_power = RED_FIRE_POWER_VALUE; \\\n            freeze = 0; \\\n            powerUp = 0; \\\n            next_arrow = 0; \\\n            arrows_on_screen = 0; \\\n            bow_load_counter = 0; \\\n            wall_appeared = 0; \\\n            hyper_counter = 0; \\\n            forced_zombie = 0; \\\n            freeze_locked = 1; \\\n            zombie_locked = 1; \\\n            loaded_bow = 1; \\\n            alive = 1; \\\n            missile_randomness_mask = (uint8_t) (255U>>(level-1)); \\\n            bow_reload_loops = RED_SPEED_VALUE; \\\n            auto_recharge_counter = AUTO_RECHARGE_COOL_DOWN; \\\n            remaining_arrows = MAX_ARROWS; \\\n            arrow_range = RED_RANGE_VALUE; \\\n            bow_x = XSize; \\\n            bow_shape_tile = (uint8_t) 2*((bow_x)&1); \\\n            bow_color = _XL_CYAN; \\\n            number_of_arrows_per_shot = 1; \\\n            initialize_items(); \\\n            _XL_CLEAR_SCREEN(); \\\n        } while(0)\n\n#endif\n\n\nvoid initialize_zombie_at_level_restart(void)\n{\n    zombie_y[zombie_x]=INITIAL_ZOMBIE_Y;\n    ++main_loop_counter;\n    display_zombie();\n    _XL_TOCK_SOUND();\n}\n\n#define reset_wall_and_zombies() \\\ndo \\\n{ \\\n    for(zombie_x=0;zombie_x<XSize;++zombie_x) \\\n    { \\\n        wall[zombie_x]=0; \\\n        zombie_active[zombie_x]=0; \\\n    } \\\n} while(0)    \n\n#define spawn_initial_minions() \\\n    minions_to_kill = MINIONS_ON_FIRST_LEVEL-killed_minions;  \\\n    \\\n    if(minions_to_kill<MAX_OCCUPIED_COLUMNS) \\\n    { \\\n        to_spawn_initially=minions_to_kill; \\\n    } \\\n    else \\\n    { \\\n        to_spawn_initially=MAX_OCCUPIED_COLUMNS; \\\n    } \\\n    \\\n    main_loop_counter = 0; \\\n    \\\n    while(main_loop_counter<to_spawn_initially) \\\n    { \\\n        spawn_minion(); \\\n        initialize_zombie_at_level_restart(); \\\n    } \\\n    \\\n    minions_to_spawn = minions_to_kill-to_spawn_initially;\n\n#define spawn_initial_bosses() \\\n    bosses_to_kill = BOSSES_ON_FIRST_LEVEL+(level<<4)-killed_bosses; \\\n    \\\n    if(bosses_to_kill<MAX_OCCUPIED_COLUMNS - to_spawn_initially) \\\n    { \\\n        to_spawn_initially = bosses_to_kill;   \\\n    } \\\n    else \\\n    { \\\n        to_spawn_initially = MAX_OCCUPIED_COLUMNS - to_spawn_initially; \\\n    } \\\n    \\\n    main_loop_counter = 0; \\\n    \\\n    while(main_loop_counter<to_spawn_initially) \\\n    { \\\n        spawn_boss(); \\\n        initialize_zombie_at_level_restart(); \\\n    } \\\n    \\\n    bosses_to_spawn = bosses_to_kill-to_spawn_initially;\n\n\n#define zombie_initialization() \\\n{ \\\n    uint8_t to_spawn_initially; \\\n    \\\n    reset_wall_and_zombies(); \\\n    \\\n    spawn_initial_minions(); \\\n    \\\n    spawn_initial_bosses(); \\\n    \\\n    update_zombie_speed(); \\\n    \\\n    for(zombie_x=0;zombie_x<MAX_ARROWS_ON_SCREEN;++zombie_x) \\\n    { \\\n        active_arrow[zombie_x] = 0; \\\n    } \\\n}\n\n\n#if YSize<=20\n    #define _NEXT_ROW i\n#else\n    #define _NEXT_ROW ((i)<<1)\n#endif\n\n#if defined(_XL_ARROW_KEYS)\n    #define CONTROLS_STRING \"USE ARROWS\"\n\t#define CONTROLS_LEN 10\n#elif defined(_XL_NO_JOYSTICK)\n    #define CONTROLS_STRING \"USE \" _XL_LEFT_KEY \" \" _XL_RIGHT_KEY \" SPACE\"\n\t#define CONTROLS_LEN 13\n#else\n    #if defined(_XL_CURSORS)\n        #if XSize>=21\n            #define CONTROLS_STRING \"USE CURSORS AND SPACE\"\n\t\t\t#define CONTROLS_LEN 21\n        #elif XSize>=19\n            #define CONTROLS_STRING \"USE CURSORS AND SPC\"\n\t\t\t#define CONTROLS_LEN 19\n        #else\n            #define CONTROLS_STRING \"CURSORS AND SPC\"\n\t\t\t#define CONTROLS_LEN 15\n        #endif\n    #else\n        #define CONTROLS_STRING \"USE JOYSTICK\"\n\t\t#define CONTROLS_LEN 12\n    #endif\n#endif\n\n#if YSize<=23\n    #define CONTROLS_Y YSize-2\n#else\n    #define CONTROLS_Y YSize-3\n#endif\n\n#if !defined(NO_EXTRA_TITLE)\n    #if !defined(NO_CONTROL_INSTRUCTIONS) && YSize>=15\n        #define control_instructions() PRINT_CENTERED_ON_ROW(CONTROLS_Y,\\\n                                       CONTROLS_STRING)\n    #else\n        #define control_instructions()\n    #endif\n\n    #define display_items() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        \\\n        for(i=0;i<5;++i) \\\n        { \\\n            _XL_DRAW(XSize/2-5,YSize/3+3+_NEXT_ROW, item_tile[i][0], item_tile[i][1]); \\\n            _XL_SET_TEXT_COLOR(_XL_GREEN); \\\n            _XL_PRINT(XSize/2-5+3,YSize/3+3+_NEXT_ROW, (char *)item_name[i]); \\\n        } \\\n        control_instructions(); \\\n    } while(0)\n#else\n    #define display_items()\n#endif\n\n\n#if YSize<=22\n    #define _HISCORE_Y 1\n#else\n    #define _HISCORE_Y 2\n#endif\n\n#define _HORDE_STRING \"HORDE\"\n\n#if YSize>10\n    #define display_initial_screen() \\\n    { \\\n        _XL_CLEAR_SCREEN(); \\\n        \\\n        display_wall(0); \\\n        display_wall(BOTTOM_WALL_Y+1); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_CYAN); \\\n        PRINT_CENTERED_ON_ROW(_HISCORE_Y, \"HISCORE\"); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINTD(XSize/2-3,_HISCORE_Y+1,5,hiscore); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_RED); \\\n        PRINT_CENTERED_ON_ROW(YSize/3-2,_HORDE_STRING); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        PRINT_CENTERED_ON_ROW(YSize/3, \"FABRIZIO CARUSO\"); \\\n        \\\n        display_items(); \\\n        sleep_and_wait_for_input(); \\\n        _XL_CLEAR_SCREEN(); \\\n    }\n#else\n    #define display_initial_screen() \\\n    { \\\n        _XL_CLEAR_SCREEN(); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_CYAN); \\\n        PRINT_CENTERED_ON_ROW(_HISCORE_Y, \"HISCORE\"); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINTD(XSize/2-3,_HISCORE_Y+1,5,hiscore); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_RED); \\\n        PRINT_CENTERED_ON_ROW(YSize/3-2,_HORDE_STRING); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        PRINT_CENTERED_ON_ROW(YSize/3, \"FABRIZIO CARUSO\"); \\\n        \\\n        sleep_and_wait_for_input(); \\\n        _XL_CLEAR_SCREEN(); \\\n    }\n#endif\n\n#if XSize>=23\n    #define HI_X ((XSize-9))\n    #define HISCORE_STRING _XL_H _XL_I\n#else\n    #define HI_X ((XSize-8))\n    #define HISCORE_STRING _XL_H\n#endif\n\n#if XSize>=32\n    #define draw_zombie_counter_tile() _XL_DRAW(ZOMBIE_COUNTER_X,0,MINION_TILE_0, _XL_WHITE)\n#else\n    #define draw_zombie_counter_tile()\n#endif\n\n\n#if XSize>=20\n    #define display_stats() \\\n    do \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        display_score(); \\\n        _XL_DRAW(HI_X,0,HI_TILE, _XL_GREEN); \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINTD(HI_X+1,0,5, hiscore); \\\n        _XL_DRAW(6,0,ARROW_TILE_1,_XL_CYAN); \\\n        _XL_DRAW(POWER_UP_X,0,POWER_UP_TILE, _XL_WHITE); \\\n        draw_zombie_counter_tile(); \\\n        display_remaining_arrows(); \\\n        display_power_up_counter(); \\\n        display_level(); \\\n        display_lives(_XL_WHITE); \\\n        display_power_ups(); \\\n        display_zombie_counter(); \\\n    } while(0)\n#else\n    #define display_stats() \\\n    do \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        display_score(); \\\n        _XL_DRAW(6,0,ARROW_TILE_1,_XL_CYAN); \\\n        _XL_DRAW(POWER_UP_X,0,POWER_UP_TILE, _XL_WHITE); \\\n        draw_zombie_counter_tile(); \\\n        display_remaining_arrows(); \\\n        display_power_up_counter(); \\\n        display_level(); \\\n        display_lives(_XL_WHITE); \\\n        display_power_ups(); \\\n        display_zombie_counter(); \\\n    } while(0)\n#endif\n\n\n#if YSize>10\nvoid clear_top_border(void)\n{\n\tPRINT_CENTERED_ON_ROW(1,\"       \");\n\tdisplay_zombies();\n}\n#else\n    #define clear_top_border()\n#endif\n\n\n#define handle_auto_recharge() \\\ndo \\\n{ \\\n    if(!remaining_arrows) \\\n    { \\\n        if(auto_recharge_counter) \\\n        { \\\n            --auto_recharge_counter; \\\n        } \\\n        else \\\n        { \\\n            recharge_arrows(AUTO_ARROW_RECAHRGE); \\\n            auto_recharge_counter=AUTO_RECHARGE_COOL_DOWN; \\\n            _XL_PING_SOUND(); \\\n        } \\\n    } \\\n} while(0)\n\n\n#define display_level_at_start_up()  \\\ndo \\\n{ \\\n    _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\n    if(level==LAST_LEVEL) \\\n    { \\\n        _XL_PRINT(XSize/2-4, YSize/2,  \"F I N A L\"); \\\n    } \\\n    _XL_SLEEP(1); \\\n    _XL_SET_TEXT_COLOR(_XL_CYAN); \\\n    _XL_PRINT(XSize/2-4, YSize/2,      \"LEVEL    \" ); \\\n    _XL_PRINTD(XSize/2+2,YSize/2,1,level+1); \\\n    sleep_and_wait_for_input(); \\\n    _XL_PRINT(XSize/2-4, YSize/2,_XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE); \\\n} while(0)\n\n\n#define handle_zombie_movement() \\\n    if(!freeze) \\\n    { \\\n        if(!(main_loop_counter&zombie_speed)) \\\n        { \\\n            move_zombies(); \\\n        } \\\n    } \\\n    else \\\n    { \\\n        --freeze; \\\n    }\n\nvoid display_cleared(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_CYAN);\n    PRINT_CENTERED(_XL_C _XL_SPACE _XL_L _XL_SPACE _XL_E _XL_SPACE _XL_A _XL_SPACE _XL_R _XL_SPACE _XL_E _XL_SPACE _XL_D);\n}\n\n\n#define handle_next_level() \\\ndo \\\n{ \\\n    ++level; \\\n    display_cleared(); \\\n    sleep_and_wait_for_input(); \\\n    _XL_TOCK_SOUND(); \\\n    increase_score(LEVEL_BONUS); \\\n    if(powerUp) \\\n    { \\\n        do \\\n        { \\\n            --powerUp; \\\n            increase_score(POWER_UP_BONUS); \\\n            display_power_up_counter(); \\\n            _XL_TICK_SOUND(); \\\n            _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR*4); \\\n        } while(powerUp); \\\n    } \\\n    \\\n    sleep_and_wait_for_input(); \\\n    killed_bosses = 0; \\\n    killed_minions = 0; \\\n} while(0)\n\n\n#define player_dies() \\\ndo \\\n{ \\\n    --lives; \\\n    bow_color=_XL_RED; \\\n    display_bow(); \\\n    bow_color=_XL_CYAN; \\\n    _XL_EXPLOSION_SOUND(); \\\n    sleep_and_wait_for_input(); \\\n} while(0)\n\n\nvoid zombie_animation(void)\n{\n    zombie_y[zombie_x]=YSize/2-7+(uint8_t) ((_XL_RAND())&15);\n    zombie_level[zombie_x]=0;\n    display_zombie();\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n    zombie_dies();\n    display_cleared();\n}\n\n\n#define victory() \\\ndo \\\n{ \\\n    uint8_t i; \\\n    \\\n    minions_to_kill = XSize*2; \\\n    display_zombie_counter(); \\\n    for(i=0;i<XSize;++i) \\\n    { \\\n        zombie_x = i; \\\n        zombie_animation(); \\\n        zombie_x = XSize-i; \\\n        zombie_animation(); \\\n    } \\\n    sleep_and_wait_for_input(); \\\n    _XL_CLEAR_SCREEN(); \\\n} while(0)\n\n\n#if YSize>10\n    #define display_level_screen() \\\n    do \\\n    { \\\n        display_wall(BOTTOM_WALL_Y); \\\n        display_bow(); \\\n        display_stats(); \\\n        display_level_at_start_up(); \\\n    } while(0)\n#else\n    #define display_level_screen()\n#endif\n\n#define handle_hyper() \\\n{ \\\n    if(hyper_counter) \\\n    { \\\n        --hyper_counter; \\\n        \\\n        if(hyper_counter==1) \\\n        { \\\n            bow_color = _XL_CYAN; \\\n            bow_reload_loops=GREEN_SPEED_VALUE; \\\n            clear_top_border(); \\\n        } \\\n    } \\\n}\n\n#if defined(FASTER_WALL_REDRAW)\n    #define handle_wall() \\\n        do \\\n        { \\\n            if(!(main_loop_counter&3)) \\\n            { \\\n                if(active_wall) \\\n                { \\\n                    redraw_wall(); \\\n                } \\\n            } \\\n        } while(0)\n#else\n    #define handle_wall() \\\n        if(active_wall) \\\n        { \\\n            redraw_wall(); \\\n        }\n#endif\n\nint main(void)\n{           \n    _XL_INIT_GRAPHICS();\n    _XL_INIT_INPUT() \n    _XL_INIT_SOUND();\n\n    hiscore = 0;\n\n    while(1) // Game (re-)start\n    {\n        global_initialization();\n        display_initial_screen();\n        \n        while(lives && level<=LAST_LEVEL) // Level (re)-start \n        {            \n            level_initialization();\n            zombie_initialization();\n            display_level_screen();\n            \n            while(alive && (minions_to_kill || bosses_to_kill) ) // Inner game loop\n            {\n                handle_hyper();\n                handle_bow_move();\n                handle_bow_load();\n                handle_arrows(); \n                handle_wall();\n                handle_auto_recharge();\n                handle_zombie_movement();\n                handle_zombie_collisions();\n                handle_missile_drops();\n                handle_items();\n                _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);     \n                ++main_loop_counter;\n            }\n            if(alive)\n            {\n                handle_next_level();\n            }\n            else\n            {\n                player_dies();\n            }\n        }\n        if(lives)\n        {\n            victory();\n            \n        }\n        game_over();\n    }\n\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/games/horde/makefiles/Makefile.override",
    "content": "\r\nc16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16 \\\r\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars.cfg \\\r\n\t -D__NO_SCREEN_COLOR_INIT \\\r\n\t \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__KERNAL_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=800 \\\r\n\t-D__UDG_BASE_FACTOR=15 \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\ncreativision: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t creativision  \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CREATIVISION__ -DNUMBER_OF_MISSILES=2 -DMAX_ARROWS_ON_SCREEN=7  -DNO_BOTTOM_WALL_REDRAW \\\r\n\t-D__ALT_SLEEP -D__VDP_MODE1_GRAPHICS -DXSize=26 -DX_OFFSET=3  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=1800  \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k_less_stack.cfg \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\n"
  },
  {
    "path": "src/games/horde/shapes/6x8/shape25.txt",
    "content": "......\n......\n......\n..##..\n.##.#.\n####.#\n.##.#.\n..##..\n"
  },
  {
    "path": "src/games/horde/shapes/6x8/shape26.txt",
    "content": "......\n...#..\n..#...\n...#..\n..#...\n...#..\n..#...\n......\n"
  },
  {
    "path": "src/games/horde/shapes/6x9/shape25.txt",
    "content": "......\n......\n......\n......\n..##..\n.##.#.\n####.#\n.##.#.\n..##.."
  },
  {
    "path": "src/games/horde/shapes/6x9/shape26.txt",
    "content": "......\n...#..\n..#...\n...#..\n..#...\n...#..\n..#...\n......\n......\n"
  },
  {
    "path": "src/games/horde/shapes/7x8/shape25.txt",
    "content": ".......\n.......\n.......\n...##..\n..##.#.\n.####.#\n..##.#.\n...##..\n"
  },
  {
    "path": "src/games/horde/shapes/7x8/shape26.txt",
    "content": ".......\n....#..\n...#...\n....#..\n...#...\n....#..\n...#...\n.......\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape0.txt",
    "content": "...##...\r\n...##...\r\n.##..##.\r\n#.####.#\r\n..#..#..\r\n..#..#..\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape1.txt",
    "content": "........\r\n...##...\r\n...##...\r\n.##..###\r\n#.####..\r\n..#..#..\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape10.txt",
    "content": "........\r\n........\r\n###.....\r\n.#.#....\r\n#..#....\r\n........\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape11.txt",
    "content": "........\r\n........\r\n.....###\r\n....#.#.\r\n....#..#\r\n........\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape12.txt",
    "content": "..#.....\r\n..#.....\r\n#######.\r\n..#..#.#\r\n#####..#\r\n.#.#....\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape13.txt",
    "content": "........\r\n........\r\n.#######\r\n#.#.....\r\n#..#####\r\n........\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape14.txt",
    "content": "..#.#.#.\r\n..#.#.#.\r\n..###.#.\r\n..#.#.#.\r\n..#.#.#.\r\n........\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape15.txt",
    "content": ".#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.##..#..\r\n........\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape16.txt",
    "content": "........\r\n........\r\n#######.\r\n.....#.#\r\n#####..#\r\n........\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape17.txt",
    "content": "......#.\r\n......#.\r\n......#.\r\n......#.\r\n......#.\r\n.....#.#\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape18.txt",
    "content": "..#.....\r\n..#.....\r\n..#.....\r\n..#.....\r\n..#.....\r\n.#.#....\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape19.txt",
    "content": "..####..\r\n...##...\r\n.##..##.\r\n#.####.#\r\n..#..#..\r\n..#..#.."
  },
  {
    "path": "src/games/horde/shapes/8x6/shape2.txt",
    "content": "..#..#..\r\n........\r\n........\r\n........\r\n........\r\n........"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape20.txt",
    "content": "........\r\n..####..\r\n...##...\r\n.##..###\r\n#.####..\r\n..#..#.."
  },
  {
    "path": "src/games/horde/shapes/8x6/shape21.txt",
    "content": "........\r\n........\r\n........\r\n..####..\r\n...##...\r\n.##..##.\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape22.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n..####..\r\n...##..."
  },
  {
    "path": "src/games/horde/shapes/8x6/shape23.txt",
    "content": "........\r\n..#.#.#.\r\n...###..\r\n.###.###\r\n...###..\r\n..#.#.#.\r\n\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape24.txt",
    "content": "####....\r\n########\r\n#....#.#\r\n########\r\n#.#....#\r\n########\r\n\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape25.txt",
    "content": "........\n...#....\n..#.#...\n.###.#..\n..#.#...\n...#....\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape26.txt",
    "content": "........\n...#....\n....#...\n...#....\n....#...\n...#....\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape3.txt",
    "content": "........\r\n........\r\n........\r\n...##...\r\n...##...\r\n.##..##."
  },
  {
    "path": "src/games/horde/shapes/8x6/shape4.txt",
    "content": "#.####.#\r\n..#..#..\r\n..#..#..\r\n........\r\n........\r\n........"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape5.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n...##...\r\n...##...\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape6.txt",
    "content": "###..##.\r\n..####.#\r\n..#..#..\r\n..#..#..\r\n........\r\n........"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape7.txt",
    "content": "...##...\r\n........\r\n.##..##.\r\n#......#\r\n..#..#..\r\n..#..#..\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape8.txt",
    "content": "..####..\r\n.##..##.\r\n##....##\r\n##....##\r\n.##..##.\r\n..####..\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x6/shape9.txt",
    "content": "......#.\r\n......#.\r\n.#######\r\n#.#...#.\r\n#..#####\r\n.....#.#\r\n"
  },
  {
    "path": "src/games/horde/shapes/8x8/shape25.txt",
    "content": "........\r\n........\r\n........\r\n...##...\r\n..##.#..\r\n.####.#.\r\n..##.#..\r\n...##..."
  },
  {
    "path": "src/games/horde/shapes/8x8/shape26.txt",
    "content": "........\n....#...\n...#....\n....#...\n...#....\n....#...\n...#....\n........\n"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,45,18,18"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,44"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,45,18,18"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,44"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile24.txt",
    "content": "56,56,63,37,63,41,63,37"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile25.txt",
    "content": "0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile26.txt",
    "content": "0,4,8,4,8,4,8,0"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile4.txt",
    "content": "45,45,18,18,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile6.txt",
    "content": "12,51,45,13,18,18,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/games/horde/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,45,18,18,18"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,44"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,45,18,18,18"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,44"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile24.txt",
    "content": "56,56,63,37,63,41,63,37,63\n"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile25.txt",
    "content": "0,0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile26.txt",
    "content": "0,4,8,4,8,4,8,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile4.txt",
    "content": "45,45,18,18,18,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile6.txt",
    "content": "12,51,45,13,18,18,18,0,0"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/games/horde/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,45,18,18"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,44"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile10.txt",
    "content": "0,0,0,96,16,104,8,8"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile12.txt",
    "content": "16,56,16,124,18,85,57,41"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile16.txt",
    "content": "0,0,0,124,2,5,121,1"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,45,18,18"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,44"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile24.txt",
    "content": "120,120,127,101,127,105,127,101"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile25.txt",
    "content": "0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile26.txt",
    "content": "0,4,8,4,8,4,8,0"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile4.txt",
    "content": "45,45,18,18,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile6.txt",
    "content": "12,51,45,13,18,18,0,0"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/games/horde/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile0.txt",
    "content": "24,24,102,189,36,36"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile1.txt",
    "content": "0,24,24,103,188,36"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile10.txt",
    "content": "0,0,224,80,144,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile11.txt",
    "content": "0,0,7,10,9,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile12.txt",
    "content": "32,32,254,37,249,80"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile13.txt",
    "content": "0,0,127,160,159,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile14.txt",
    "content": "42,42,58,42,42,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile15.txt",
    "content": "74,74,74,74,100,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile16.txt",
    "content": "0,0,254,5,249,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile17.txt",
    "content": "2,2,2,2,2,5"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile18.txt",
    "content": "32,32,32,32,32,80"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile19.txt",
    "content": "60,24,102,189,36,36"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile2.txt",
    "content": "36,0,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile20.txt",
    "content": "0,60,24,103,188,36"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile21.txt",
    "content": "0,0,0,60,24,102"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile22.txt",
    "content": "0,0,0,0,60,24"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile23.txt",
    "content": "0,42,28,119,28,42"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile24.txt",
    "content": "240,255,133,255,161,255"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile25.txt",
    "content": "0,16,40,116,40,16"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile26.txt",
    "content": "0,16,8,16,8,16"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile3.txt",
    "content": "0,0,0,24,24,102"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile4.txt",
    "content": "189,36,36,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile5.txt",
    "content": "0,0,0,0,24,24"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile6.txt",
    "content": "230,61,36,36,0,0"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile7.txt",
    "content": "24,0,102,129,36,36"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile8.txt",
    "content": "60,102,195,195,102,60"
  },
  {
    "path": "src/games/horde/tiles/8x6/tile9.txt",
    "content": "2,2,127,162,159,5"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile25.txt",
    "content": "0,0,0,24,52,122,52,24"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile26.txt",
    "content": "0,8,16,8,16,8,16,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/games/horde/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/games/horde/tiles/ASCII/aquarius/aquarius_char_tiles.h",
    "content": "#ifndef _AQUARIUS_CHAR_TILES_H\r\n#define _AQUARIUS_CHAR_TILES_H\r\n\r\n#define _TILE_0 157\r\n// 'X'\r\n#define _TILE_1 157\r\n\r\n#define _TILE_2 ' '\r\n\r\n#define _TILE_3 157\r\n\r\n#define _TILE_4 ' '\r\n\r\n#define _TILE_5 157\r\n\r\n#define _TILE_6 ' '\r\n\r\n\r\n\r\n#define _TILE_8 'o'\r\n//150\r\n//135\r\n//'O'\r\n\r\n// Bow parts \r\n#define _TILE_10 ' '\r\n#define _TILE_11 ' '\r\n\r\n// Loaded bow\r\n#if defined(__MEMORY_MAPPED_GRAPHICS)\r\n#define _TILE_9  8\r\n#define _TILE_12 8\r\n#endif\r\n\r\n// Empty bow\r\n#define _TILE_13 214 \r\n#define _TILE_16 214\r\n\r\n\r\n\r\n#define _TILE_14 'H'\r\n\r\n#define _TILE_15 'L'\r\n\r\n\r\n#define _TILE_17 94\r\n//124\r\n//'I'\r\n\r\n#define _TILE_18 94\r\n//124\r\n//'I'\r\n\r\n#define _TILE_19 146\r\n//157\r\n//'V'\r\n\r\n#define _TILE_20 147\r\n\r\n#define _TILE_21 146\r\n\r\n// Beam and top border\r\n#define _TILE_22 211\r\n\r\n// Dead\r\n#define _TILE_7 19\r\n//209\r\n//'='\r\n\r\n#define _TILE_23 '*'\r\n\r\n// Wall\r\n#define _TILE_24 253\r\n//134\r\n\r\n\r\n#define _TILE_25 '$'\r\n\r\n\r\n#endif // _AQUARIUS_CHAR_TILES_H\r\n"
  },
  {
    "path": "src/games/horde/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if defined(__TARGET_SPECIFIC_ASCII) && defined(__AQUARIUS__) && !defined(__QUAD_MEMORY_MAPPED_GRAPHICS) && !defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n    #include \"aquarius/aquarius_char_tiles.h\"\r\n#else\r\n    \r\n#define _TILE_0 'X'\r\n#define _TILE_1 'X'\r\n\r\n#define _TILE_2 ' '\r\n\r\n#define _TILE_3 'X'\r\n\r\n#define _TILE_4 ' '\r\n\r\n#define _TILE_5 'X'\r\n\r\n#define _TILE_6 ' '\r\n\r\n\r\n\r\n#define _TILE_8 'O'\r\n\r\n#define _TILE_9 'I'\r\n\r\n#define _TILE_10 ' '\r\n\r\n#define _TILE_11 ' '\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 'T' \r\n\r\n#define _TILE_14 'H'\r\n\r\n#define _TILE_15 'L'\r\n\r\n#define _TILE_16 'T'\r\n\r\n#define _TILE_17 'I'\r\n\r\n#define _TILE_18 'I'\r\n\r\n#define _TILE_19 'V'\r\n\r\n#define _TILE_20 'V'\r\n\r\n#define _TILE_21 'V'\r\n\r\n#define _TILE_22 'V'\r\n\r\n#if !defined(__CIDELSA__)\r\n    #define _TILE_7 '='\r\n    #define _TILE_23 '*'\r\n    #define _TILE_24 '-'\r\n    \r\n#else\r\n    #define _TILE_7  'Z'\r\n    #define _TILE_23 'X'\r\n    #define _TILE_24 'M'\r\n#endif\r\n\r\n#define _TILE_25 'S'\r\n\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/shoot/Makefile.shoot",
    "content": "\nNO_CHASE_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/split_files/move_player.c \\\n\t$(SOURCE_PATH)/split_files/ghost.c  $(SOURCE_PATH)/split_files/level.c $(SOURCE_PATH)/split_files/character.c $(SOURCE_PATH)/split_files/game_text.c \\\n\t$(SOURCE_PATH)/split_files/main.c \\\n\t$(SOURCE_PATH)/split_files/init_images.c\n\n#\nTINY_FILES ?= $(NO_CHASE_FILES) $(SOURCE_PATH)/split_files/strategy.c\n\n#\nTEST_FILES ?= $(NO_CHASE_FILES)\n\n#\nLIGHT_ONLY_FILES ?= $(SOURCE_PATH)/split_files/item.c $(SOURCE_PATH)/split_files/skull.c $(SOURCE_PATH)/split_files/bullet.c \n\n#\nFULL_ONLY_FILES ?= $(SOURCE_PATH)/split_files/horizontal_missile.c $(SOURCE_PATH)/split_files/rocket.c $(SOURCE_PATH)/split_files/sleep.c\n\n#\nLIGHT_FILES ?= $(TINY_FILES) $(LIGHT_ONLY_FILES) \n\n\n#\n# FULL_ONLY_FILES ?= \\\n\t# $(BASIC_CROSS_LIB_FILES) \\\n    # $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t# $(SOURCE_PATH)/move_player.c \\\n\t# $(SOURCE_PATH)/ghost.c  $(SOURCE_PATH)/level.c $(SOURCE_PATH)/character.c $(SOURCE_PATH)/game_text.c \\\n\t# $(SOURCE_PATH)/main.c \\\n\t# $(SOURCE_PATH)/init_images.c \\\n\t# $(SOURCE_PATH)/strategy.c \\\n\t# $(SOURCE_PATH)/item.c $(SOURCE_PATH)/skull.c $(SOURCE_PATH)/bullet.c  \\\n\t# $(SOURCE_PATH)/horizontal_missile.c $(SOURCE_PATH)/rocket.c $(SOURCE_PATH)/sleep.c $(SOURCE_PATH)/end_screen.c\n\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c\n\n\nGLOBAL_OPTS = -DFULL_LOWER_BORDER  -D_DEFAULT_ASCII  -D_XL_NUMBER_OF_TILES=27\n\nGAME_NAME := shoot\n\nPARENT_DIR = games\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\ninclude ./Makefile_common\n\n\n############################################################################\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\n\n\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n"
  },
  {
    "path": "src/games/shoot/bullet.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#ifndef _MISSILE_HEADER\r\n#define _MISSILE_HEADER\r\n\r\n\r\n    #include \"character.h\"\r\n    #include \"settings.h\"\r\n    #include \"definitions.h\"\r\n    #include \"ghost.h\"\r\n\r\n    uint8_t availableBullet(void);\r\n        \r\n    void handle_bullet(uint8_t bulletIndex);\r\n    \r\n    void handle_bullets(void);\r\n\r\n    void handle_bomb(void);\r\n\r\n    void checkBullet(Character *bulletPtr, uint8_t bulletDirection);\r\n\r\n    void checkBullets(void);\r\n    \r\n    void checkBulletVsGhost(Character * bulletPtr, uint8_t bulletDirection,\r\n                            Character * ghostPtr);\r\n        \r\n    void checkBulletVsGhosts(Character * bulletPtr, uint8_t bulletDirection);\r\n\r\n    void checkBulletVsSkull(register Character *bulletPtr, Character *skullPtr);\r\n    \r\n    void checkBulletVsSkulls(Character *bulletPtr);\r\n                \r\n    void _moveBullet(register Character * bulletPtr, uint8_t bulletDirection);\r\n        \r\n    void moveBullet(register Character * bulletPtr, uint8_t bulletDirection);\r\n\r\n    void handle_chasing_bullet(void);\r\n        \r\n    void pushGhost(Character * ghostPtr, uint8_t bulletDirection);    \r\n        \r\n\r\n#endif //_MISSILE\r\n\r\n"
  },
  {
    "path": "src/games/shoot/character.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#ifndef _CHARACTER\r\n#define _CHARACTER\r\n\r\n#include \"../cross_lib/display/display_macros.h\"\r\n\r\n#include \"settings.h\"\r\n\r\n\r\nstruct CharacterStruct\r\n{\r\n    // character coordinates\r\n    uint8_t _x;\r\n    uint8_t _y;\r\n    \r\n    // _status decides whether the character is active\r\n    uint8_t _status;\r\n    \r\n    Image* _imagePtr;\r\n};\r\n\r\ntypedef struct CharacterStruct Character;\r\n\r\n\r\n\r\n\r\n#if defined(ANIMATE_PLAYER)\r\n    #define PLAYER_IMAGE PLAYER_DOWN_IMAGE\r\n#endif\r\n\r\n#define areCharctersAtSamePosition(lhs, rhs)isCharacterAtLocation((lhs)->_x, (lhs)->_y,rhs)\r\n\r\n#define characterReachedBombs(preyPtr) sameLocationAsAnyActiveLocation((preyPtr)->_x, (preyPtr)->_y, bombs, BOMBS_NUMBER)\r\n\r\n\r\nuint8_t sameLocationAsAnyActiveLocation(uint8_t x, uint8_t y, Character *characterList, uint8_t length);\r\n\r\nextern uint16_t points;\r\n\r\nextern uint8_t ghostCount;\r\n\r\nextern Image BROKEN_BRICK_IMAGE;\r\nextern Image DESTROYER_IMAGE;\r\nextern Image INVINCIBILITY_IMAGE;\r\n\r\nuint8_t playerKilledBy(Character *enemyPtr);\r\n\r\nvoid displayCharacter(Character * characterPtr);\r\n\r\nvoid deleteCharacter(Character * characterPtr);\r\n\r\nuint8_t onWall(uint8_t x, uint8_t y);\r\n\r\n//\r\n\r\n\r\n#if defined(ANIMATE_PLAYER)\r\n    extern Image PLAYER_LEFT_IMAGE;\r\n    extern Image PLAYER_RIGHT_IMAGE;\r\n    extern Image PLAYER_UP_IMAGE;\r\n    extern Image PLAYER_DOWN_IMAGE;\r\n\r\n    #define SHOW_LEFT() player._imagePtr = (Image *)&PLAYER_LEFT_IMAGE\r\n    #define SHOW_RIGHT() player._imagePtr = (Image *)&PLAYER_RIGHT_IMAGE \r\n    #define SHOW_UP() player._imagePtr = (Image *)&PLAYER_UP_IMAGE\r\n    #define SHOW_DOWN() player._imagePtr = (Image *)&PLAYER_DOWN_IMAGE\r\n#else\r\n    #define SHOW_LEFT() { }\r\n    #define SHOW_RIGHT() { }\r\n    #define SHOW_UP() { }\r\n    #define SHOW_DOWN() { }        \r\n#endif\r\n\r\n#if !defined(_XL_NO_COLOR)\r\n    #define __DRAW(x,y,image) \\\r\n        _XL_DRAW(x,y, (image)->_imageData,(image)->_color) \r\n#else\r\n    #define __DRAW(x,y,image) \\\r\n        _XL_DRAW(x,y, (image)->_imageData,0)    \r\n#endif\r\n\r\n\r\n#define _draw_stat(x, y, image) \\\r\n    __DRAW((x),(y),(image))\r\n\r\n#define _XLIB_DRAW(x,y,image) \\\r\n    _draw_stat(x, y, image) \r\n\r\n#define _XLIB_DELETE(x,y) \\\r\n    _delete_stat(x, y) \r\n\r\n#define _draw(x, y, image) \\\r\n    __DRAW((x),Y_OFFSET+(y),(image))\r\n\r\n#define _delete_stat(x, y) \\\r\n    _XL_DELETE((x),(y))\r\n\r\n#define _delete(x, y) \\\r\n    _XL_DELETE((x),Y_OFFSET+(y))\r\n\r\n#define DRAW_CHARACTER(x,y,image) _draw(x,y,image)\r\n\r\n#define DRAW_PLAYER(x,y,image) DRAW_CHARACTER(x,y,image)\r\n#define DRAW_GHOST(x,y,image) DRAW_CHARACTER(x,y,image)\r\n#define DRAW_SKULL(x,y,image) DRAW_CHARACTER(x,y,image)\r\n#define DRAW_BOMB(x,y,image) DRAW_CHARACTER(x,y,image)\r\n#define DRAW_MISSILE(x,y,image) DRAW_CHARACTER(x,y,image)\r\n\r\nvoid _DRAW_PLAYER(void);\r\n\r\n#if !defined(NO_BLINKING)\r\nvoid _blink_draw(uint8_t x, uint8_t y, Image * image, uint8_t *blinkCounter);\r\n#endif\r\n\r\n\r\n#define DRAW_BLINKING_PLAYER(x, y, image) _blink_draw(x,y,image, &playerBlink)\r\n\r\n\r\n#define DELETE_CHARACTER(x,y) _delete(x,y)\r\n\r\n#if defined(__GAMATE__)\r\n    #define DELETE_PLAYER(x,y,image) do {textcolor(_XL_CYAN); _delete(x,y);} while(0)\r\n#else\r\n    #define DELETE_PLAYER(x,y,image) _delete(x,y)\r\n#endif\r\n#define DELETE_GHOST(x,y,image) _delete(x,y)\r\n#if defined(__GAMATE__)\r\n    #define DELETE_SKULL(x,y,image) do {textcolor(_XL_YELLOW); _delete(x,y);} while(0)\r\n#else\r\n    #define DELETE_SKULL(x,y,image) _delete(x,y)    \r\n#endif\r\n#define DELETE_BOMB(x,y,image) _delete(x,y)\r\n#define DELETE_ITEM(x,y,image) _delete(x,y)\r\n#define DELETE_GUN(x,y,image) _delete(x,y)\r\n#define DELETE_MISSILE(x,y,image) _delete(x,y)\r\n#define DELETE_EXTRA_POINTS(x,y,image) _delete(x,y)\r\n#define DELETE_EXTRA_LIFE(x,y,image) _delete(x,y)\r\n#define DELETE_INVINCIBILITY(x,y,image) _delete(x,y)    \r\n\r\n\r\n//\r\n\r\n#define displayPlayer(characterPtr) displayCharacter(characterPtr);\r\n#define displayGhost(characterPtr) displayCharacter(characterPtr);\r\n#define displayBomb(characterPtr) displayCharacter(characterPtr);\r\n#define displayHorizontalMissile(characterPtr) displayCharacter(characterPtr);\r\n#define displayRocket(characterPtr) displayCharacter(characterPtr);\r\n#define displayBullet(characterPtr) displayCharacter(characterPtr);\r\n#define displayChasingBullet(characterPtr) displayCharacter(characterPtr);\r\n#define displaySkull(characterPtr) displayCharacter(characterPtr);\r\n\r\n#define deletePlayer(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteGhost(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteBomb(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteHorizontalMissile(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteRocket(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteBullet(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteChasingBullet(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteSkull(characterPtr) deleteCharacter(characterPtr);\r\n#define deleteItem(characterPtr) deleteCharacter(characterPtr);\r\n\r\nvoid increasePoints(uint8_t score);\r\n\r\nvoid initializeCharacter(register Character* characterPtr, uint8_t x, uint8_t y, uint8_t status, Image * imagePtr);\r\n\r\nuint8_t isCharacterAtLocation(uint8_t x, uint8_t y, Character * characterPtr);\r\n\r\nuint8_t wallReached(register Character *characterPtr);\r\n\r\nvoid playerDies(void);\r\n\r\nuint8_t handle_player_killed(Character *characterPtr);\r\n\r\nuint8_t safeLocation(uint8_t x, uint8_t y);\r\n\r\nvoid relocateNearBy(register Character * characterPtr);\r\n\r\nuint8_t sameLocationAsAnyLocation(uint8_t x, uint8_t y, Character *characterList, uint8_t length);\r\n\r\nuint8_t innerVerticalWallReached(uint8_t x, uint8_t y);\r\nuint8_t innerHorizontalWallReached(uint8_t x, uint8_t y);\r\nuint8_t nearInnerVerticalWall(register Character *characterPtr);\r\nuint8_t nearInnerHorizontalWall(register Character *characterPtr);    \r\n\r\nvoid DRAW_BROKEN_BRICK(uint8_t x, uint8_t y);\r\n\r\n#endif // _CHARACTER\r\n"
  },
  {
    "path": "src/games/shoot/config/game_config.mk",
    "content": "#\r\n\r\n# COCO_COLOR_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DFASTER_WALL_REDRAW -DNUMBER_OF_MISSILES=3\r\n\r\nCREATIVISION_GAME_OPTS    ?= -DLESS_TEXT\r\n\r\nGAMATE_GAME_OPTS          ?= -DLESS_TEXT -DNO_BLINKING -DSIMPLE_STRATEGY -DNO_HINTS\r\n\r\nC128_Z80_80COL_GAME_OPTS  ?= -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15\r\n    \r\n# ZX81_NO_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DNUMBER_OF_MISSILES=4 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL \r\n\r\nZX81_GFX_GAME_OPTS        ?= -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15\r\n\r\nAPPLE2_GAME_OPTS          ?= -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DSIMPLE_STRATEGY\r\n\r\nCOMX_GAME_OPTS            ?= -DNO_INITIAL_SCREEN -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nPECOM_GAME_OPTS           ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nTMC600_GAME_OPTS          ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\nMICRO_GAME_OPTS           ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=15 -DGHOSTS_NUMBER=7\r\n\r\n#__VIC20_EXP_3K_GAME_OPTS ?= -DNO_BLINKING -DNO_HINTS -DLESS_TEXT\r\n\r\nCAMPUTERS_LYNX_GAME_OPTS  ?= -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=7 -DGHOSTS_NUMBER=7 -DMAX_ARROWS_ON_SCREEN=7 -DFASTER_WALL_REDRAW -DNUMBER_OF_MISSILES=3\r\n\r\nTI99_GAME_OPTS            ?= -DLESS_TEXT -DNO_HINTS -DSIMPLE_STRATEGY -DNO_BLINKING -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=7 -DGHOSTS_NUMBER=7 -DMAX_ARROWS_ON_SCREEN=7 -DFASTER_WALL_REDRAW -DNUMBER_OF_MISSILES=3\r\n\r\nBBC7_GAME_OPTS            ?= -DLESS_TEXT\r\n\r\nBBCMASTER_GAME_OPTS       ?= -DLESS_TEXT -DNO_HINTS\r\n\r\nPV1000_GAME_OPTS          ?= -DBOMB_DRAW_SKIP=3 -DWALL_DRAW_SKIP=7 -DGHOSTS_NUMBER=7 -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DSIMPLE_STRATEGY -DNO_TRANSICTION_ANIMATION\r\n\r\nPHC25_GAME_OPTS           ?= -DNO_INITIAL_SCREEN -DNO_EXTRA_TITLE -DGHOSTS_NUMBER=7 -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DSIMPLE_STRATEGY -DNO_TRANSICTION_ANIMATION -D_XL_NO_SOUND -DNO_HORIZONTAL_LEVEL \r\n\r\nPHC25_NO_GFX_GAME_OPTS    ?= -DNO_INITIAL_SCREEN -DNO_EXTRA_TITLE -DGHOSTS_NUMBER=7 -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DSIMPLE_STRATEGY -DNO_TRANSICTION_ANIMATION -D_XL_NO_SOUND -DNO_HORIZONTAL_LEVEL \r\n\r\nPHC25_MONO_GAME_OPTS      ?= -DNO_INITIAL_SCREEN -DNO_EXTRA_TITLE -DGHOSTS_NUMBER=7 -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DSIMPLE_STRATEGY -DNO_TRANSICTION_ANIMATION -D_XL_NO_SOUND -DNO_HORIZONTAL_LEVEL -DNO_ROCKETS -DNO_PLAYER_ANIMATION -DNO_ACHIEVEMENTS -DNO_BONUS_ANIMATION\r\n\r\n# VIC_20_EXP_16K_GAME_OPTS  ?= -DNO_INITIAL_SCREEN -DNO_EXTRA_TITLE -DGHOSTS_NUMBER=7 -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DLESS_TEXT -DNO_BLINKING -DNO_HINTS -DSIMPLE_STRATEGY -DNO_TRANSICTION_ANIMATION -D_XL_NO_SOUND -DNO_HORIZONTAL_LEVEL -DNO_ROCKETS -DNO_PLAYER_ANIMATION -DNO_ACHIEVEMENTS -DNO_BONUS_ANIMATION\r\n"
  },
  {
    "path": "src/games/shoot/config/project_config.mk",
    "content": "\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=8\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=35\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=30\r\n_APPLE2_HGR_SLOWDOWN=50\r\n_APPLE2ENH_HGR_SLOWDOWN=50\r\n_ATARI_SLOWDOWN=70\r\n_ATARI5200_SLOWDOWN=70\r\n_ATARI7800_SLOWDOWN=40\r\n_ATARI7800_NO_COLOR_SLOWDOWN=40\r\n_ATARI_LYNX_SLOWDOWN=290\r\n_C16_SLOWDOWN=40\r\n_C16_CONIO_SLOWDOWN=60\r\n_C64_SLOWDOWN=40\r\n_C128_8502_80COL_SLOWDOWN=10\r\n_CX16_SLOWDOWN?=40\r\n_CBM610_SLOWDOWN=80\r\n_CBM510_SLOWDOWN=80\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_MEGA65_SLOWDOWN=200\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=40\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=55\r\n\r\n\r\n# Z88DK\r\n_AGON_SLOWDOWN=800\r\n_AQUARIUS_SLOWDOWN=30\r\n_ACE_SLOWDOWN=100\r\n_BEE_SLOWDOWN=10\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CAMPUTERS_LYNX_SLOWDOWN=0\r\n_COLECO_SLOWDOWN=100\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=20\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_E200_SLOWDOWN=120\r\n_G850_SLOWDOWN=120\r\n_G815_SLOWDOWN=70\r\n_GAL_SLOWDOWN=400\r\n_GAL_GFX_SLOWDOWN=300\r\n_GB_SLOWDOWN=25\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_GL6000SL_SLOWDOWN=300\r\n_HECTORHR_SLOWDOWN=20\r\n_LASER500_SLOWDOWN=200\r\n_M100_SLOWDOWN=40\r\n_M5_SLOWDOWN=11\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=11\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_PHC25_SLOWDOWN=100\r\n_PV1000_SLOWDOWN=10\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SC3000_SLOWDOWN=11\r\n_SMC777_SLOWDOWN=7\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=20\r\n_TRS80_SLOWDOWN=1\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_X07_SLOWDOWN=4\r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=10\r\n_ZX81_WRX128_SLOWDOWN=15\r\n_ZX81_8X6_WRX128_SLOWDOWN=16\r\n_ZX81_WRX64_SLOWDOWN=25\r\n_ZX81_8X6_WRX64_SLOWDOWN=30\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=5\r\n_DRAGON_SLOWDOWN=5\r\n_COCO3_SLOWDOWN=10\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=0\r\n_PECOM_SLOWDOWN=0\r\n_TMC600_SLOWDOWN=0\r\n_MICRO_SLOWDOWN=2\r\n_CIDELSA_SLOWDOWN=2\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=18\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=25\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=1\r\n_TERMINAL_SLOWDOWN=2\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=45\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=60"
  },
  {
    "path": "src/games/shoot/definitions.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _DEFINITIONS\r\n#define _DEFINITIONS\r\n\r\n    // Directions\r\n    #define RIGHT 0\r\n    #define DOWN 1\r\n    #define LEFT 2\r\n    #define UP 3\r\n    \r\n#endif // _DEFINITIONS\r\n\r\n"
  },
  {
    "path": "src/games/shoot/doc/items.txt",
    "content": "\r\nStandard Items\r\n- Calm-down     (decreases enemy speed + very short freeze)\r\n- Freeze        (freeze enemies)\r\n- Fire Power    (increases bullet strength)\r\n- Fire Charge   (+30 bullets)\r\n- Bomb Charge   (3 mines)\r\n\r\nSecret items triggered by hitting the skulls/bases/suicide\r\n- Invincibility (invincible player)\r\n- Extra Points  (extra points that depend on level)\r\n\r\nSecret item triggered by killing 2 times all 4 skulls in non-boss levels \r\n- Super         (Fire Power + Freeze + Invincibility)\\\r\n\r\nSecret items triggered by completing levels with destroyed bases \r\n- Confuse       (Skulls lose some energy and are temporarily much slower)\r\n- Suicide       (All ghots on screen die + constant point increase + standard and some secret items are spawned)\r\n\r\nSecret items triggered by both killing 2 times all 4 skulls in non-boss levels and by completing levels with a total of at least 3 destroyed bases \r\n- Extra Life    (+1 life)\r\n\r\nSecret item triggered by exploding 6 bombs or by destroying 3 missile/rocket bases\r\n- Destroyer     (long invincibility, destroy common enemies)"
  },
  {
    "path": "src/games/shoot/doc/levels.txt",
    "content": "\r\n\r\n         ---------------------------------------------------------------------------------\r\nlevel    | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |\r\n         ---------------------------------------------------------------------------------\r\nwalls    |  V |  H |  V |  H |  V |  H |NONE|  V |  V |  H |  V |  H |  V |  H |NONE|  V |\r\n         ---------------------------------------------------------------------------------\r\nmissiles |  0 |  0 |  1 |  2 |  2 |  2 |  1 |  2 |  1 |  0 |  1 |  2 |  2 |  2 |  1 |  2 |\r\n         ---------------------------------------------------------------------------------\r\nrockets  |  0 |  0 |  2 |  0 |  0 |  3 |  3 |  4 |  2 |  3 |  2 |  3 |  2 |  3 |  3 |  4 |\r\n         ---------------------------------------------------------------------------------\r\nghosts   | 10 | 14 | 16 | 18 | 20 | 22 | 24 | *8 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | *8 |\r\n         ---------------------------------------------------------------------------------\r\n\r\n"
  },
  {
    "path": "src/games/shoot/doc/secrets.txt",
    "content": "\r\n- Secret items\r\n\r\n-- Secret items triggered by hitting the skulls/bases/suicide in current level\r\n1. Invincibility        (invincible player)\r\n2. Extra Points         (extra points that depend on level)\r\n\r\n- Secret items triggered by killing all 4 skulls in previous non-boss levels \r\n3. Super                (Fire Power + Freeze + 1/2 Invincibility duration)\\\r\n\r\n\r\n- Secret items triggered by completing previous levels with destroyed bases \r\n4. Confuse              (Skulls are much slower)\r\n5. Suicide              (All ghots on screen die + constant point increase + standard and some secret items are spawned)\r\n\r\n- Secret items triggered by both killing all 4 skulls in previous non-boss levels and by completing levels with destroyed bases \r\n6. Extra Life           (+1 life)\r\n\r\n\r\n- Secret Ability\r\n\r\n-- Secret ability \r\n\r\n--- Triggered by destroying 3 missile/rocket bases in current level\r\n7. Missile Destroyer    (It spawns a destroyer Item that gives longer invincibility + destroy standard enemies)\r\n\r\n--- Triggered by exploding 6 bombs in current level\r\n8. Bomb Destroyer       (It spawns a destroyer Item that gives longer invincibility + destroy standard enemies)\r\n\r\n\r\n- Secrets activated at the beginning of the next level \r\n\r\n-- Secret initial level increased if fire power reached more than level 5\r\n9. Fire Power Level     (Initial fire power is more than 1)\r\n\r\n-- Secret triggered by reaching fire power 4 in previous level\r\n9. Fire Power Spawn     (Fire Power spawned immediately in next level)\r\n\r\nSecret triggered by reaching 99 bullets in previous level\r\n10. Fire Charge         (Next level starts with 20 bullets instead of zero)\r\n\r\n- Secrets triggered by killing all 4 skulls in previous non-boss levels and leaving several standard enemies\r\n\r\nTriggered by leaving 2 ghosts alive:\r\n11. Calm-down Spawn     (Calm-down spawned immediately in next level)\r\n\r\nTriggered by leaving 3 ghosts alive:\r\n12. Extra Points Spawn  (Extra Points spawned immediately in next level)\r\n\r\nTriggered by leaving 4 ghosts alive:\r\n13. Freeze Spawn        (Freeze spawned immediately in next level)\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shoot/end_screen.h",
    "content": "#ifndef _THE_END_HEADER\n#define _THE_END_HEADER\n\n#include \"character.h\"\n\n#if defined(END_SCREEN) || defined(DANCE)\n\tvoid dance(Character *characterPtr);\n#endif\n\n#if defined(END_SCREEN)\n\tvoid gameCompleted(void);\n#endif\n\t\n#endif // _THE_END_HEADER\n\n"
  },
  {
    "path": "src/games/shoot/game_settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n// #define DEBUG_STRATEGY\r\n// #define DEBUG_ITEMS\r\n// #define DEBUG_END\r\n// #define DEBUG_SECRETS\r\n// #define DEBUG_LEVEL\r\n// #define DEBUG_NO_SKULL\r\n// #define SECRET_LEVEL\r\n\r\n// #define DEBUG_EASY_BOSS_LEVEL\r\n\r\n#if !defined(_GAME_SETTINGS)\r\n#define _GAME_SETTINGS\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"speed_game_settings.h\"\r\n\r\n#if !defined(INITIAL_LEVEL)\r\n    #define INITIAL_LEVEL 1\r\n#endif\r\n\r\n// Final level \r\n#define FINAL_LEVEL 16\r\n\r\n#define SKULLS_NUMBER 4\r\n\r\n#if !defined(BULLETS_NUMBER)\r\n    #define BULLETS_NUMBER 5\r\n#endif\r\n\r\n#define NUMBER_OF_GHOSTS_ON_PART_II 40\r\n\r\n#define SECOND_ROUND_GHOST_COUNT_INCREASE 0\r\n\r\n#define INITIAL_BULLET_COLOR _XL_WHITE\r\n#define FIRST_THRESHOLD_BULLET_COLOR _XL_GREEN\r\n#define SECOND_THRESHOLD_BULLET_COLOR _XL_RED\r\n\r\n//#define FAST_GHOST_COUNT_MAX_THRESHOLD 1\r\n\r\n#define COLOR_BULLET_FIRST_THRESHOLD 4\r\n#define COLOR_BULLET_SECOND_THRESHOLD 6\r\n\r\n#define FAST_GHOST_GUN_THRESHOLD 9\r\n#define FAST_GHOST_COUNT_MIN_THRESHOLD (FIRST_LEVEL_GHOSTS_NUMBER+4)\r\n// #define FAST_GHOST_LEVEL_THRESHOLD 4\r\n\r\n#define MAX_GUNS 99\r\n\r\n#define SECRET_GUNS 20\r\n\r\n#define BULLET_GUNS 30\r\n\r\n#define SKULL_BOMB_DAMAGE 25\r\n\r\n#define CONFUSE_DAMAGE 20\r\n\r\n#define MAX_TURN_BASES_LOOP 400\r\n\r\n#define BOMBS_NUMBER 3\r\n\r\n\r\n#if !defined(GHOSTS_NUMBER)\r\n    #if defined(WIDE)\r\n        #define GHOSTS_NUMBER 10\r\n    #else\r\n        #define GHOSTS_NUMBER 9\r\n    #endif\r\n#endif\r\n\r\n#if !defined(GHOST_DECREASE)\r\n    #define GHOST_DECREASE 1\r\n#endif\r\n\r\n// Bonus for completing the game =  number of lives left X LIVES_LEFT_BONUS\r\n#define LIVES_LEFT_BONUS 2000U\r\n\r\n#define FAST_GHOST_EXTRA_POINTS 20U\r\n\r\n#define BOSS_EXTRA_POINTS 100U\r\n\r\n#define BOSS_LEVEL_SKULL_EXTRA_POINTS 50U\r\n\r\n#define FIRST_LEVEL_GHOSTS_NUMBER 10\r\n\r\n// 65 is the max value that does not exceed 1000 points\r\n// bonus = 20 + 25 * [level] + 15 * [ghosts left]\r\n// level  0: 20 + 25* 0 + 15*65 = 20 +   0 + 975 = 995\r\n// level 15: 20 + 25*15 + 15*40 = 20 + 375 + 600 = 995\r\n// level 16: 20 + 25*16 + 15*10 = 20 + 400 + 150 = 570\r\n#define ZERO_LEVEL_GHOSTS_NUMBER 65\r\n\r\n#if !defined(MAX_ROCKETS_NUMBER)\r\n\t#if XSize<=22\r\n\t\t#define MAX_ROCKETS_NUMBER 4\r\n\t#elif XSisize<=32\r\n\t\t#define MAX_ROCKETS_NUMBER 5\r\n\t#else \r\n\t\t#define MAX_ROCKETS_NUMBER 6\r\n\t#endif\r\n#endif\r\n\r\n#define MISSILE_DESTROYER_TRIGGER 3\r\n#define BOMB_DESTROYER_TRIGGER 6\r\n\r\n#define DESTROYER_COUNT_DOWN 120\r\n\r\n#define LIVES_NUMBER 5\r\n#define GUNS_NUMBER 40\r\n\r\n#define EXTRA_LIFE_THROUGH_POINTS 5000\r\n\r\n#define HORIZONTAL_MISSILE_BONUS 30U\r\n\r\n#define VERTICAL_MISSILE_BONUS 20U\r\n\r\n#define SKULL_POINTS 50U\r\n\r\n#define CALM_DOWN_SECRET_THRESHOLD 3\r\n#define EXTRA_POINTS_SECRET_THRESHOLD 4\r\n#define FREEZE_SECRET_THRESHOLD 5\r\n\r\n#define SECRET_LEVEL_THRESHOLD 7\r\n\r\n#define FIRE_POWER_ITEM_THRESHOLD 4\r\n#define FIRE_POWER_LEVEL_THRESHOLD 7\r\n\r\n// #define FAST_GHOST_FIRE_POWER_THRESHOLD 3\r\n\r\n// Points given by extra points bonus: \r\n// EXTRA_POINTS + level X EXTRA_POINTS_LEVEL_INCREASE\r\n#define EXTRA_POINTS 10U \r\n#define EXTRA_POINTS_LEVEL_INCREASE 5U\r\n#define SECRET_LEVEL_EXTRA_POINTS 25U\r\n\r\n// Points for shooting a ghost\r\n#define GHOST_VS_MISSILE 5U\r\n\r\n// If a ghost bumps into a bomb\r\n#define GHOST_VS_BOMBS_BONUS 15U\r\n\r\n#define GHOST_VS_WALL_BONUS 30U\r\n\r\n#define GHOSTS_VS_SUICIDE_BONUS 10U\r\n\r\n#define GHOSTS_LEFT_BONUS 15U\r\n\r\n// Extra points for fire charge (more bullets)\r\n#define CALM_DOWN_BONUS 10U\r\n\r\n// Extra points for fire charge (more bullets)\r\n#define FIRE_CHARGE_BONUS 20U\r\n\r\n// Extra points for the fire power (more powerful bullets)\r\n#define FIRE_POWER_BONUS 30U\r\n\r\n#define FREEZE_BONUS 15U\r\n\r\n#define BASE_LEVEL_BONUS 20U\r\n\r\n// Points gained at the end of each level (to be multipled by level)\r\n#define LEVEL_BONUS 25U\r\n\r\n#if defined(DEBUG_EASY_BOSS_LEVEL)\r\n    #define MIN_SKULL_HITS 10\r\n    #define BOSS_HITS 30\r\n    #define GHOST_LIFE 5\r\n    #define FAST_GHOST_LIFE ((GHOST_LIFE)/4)\r\n\r\n#else\r\n    #if defined(WIDE)\r\n        #define MIN_SKULL_HITS 60\r\n        #define BOSS_HITS 254\r\n        #define GHOST_LIFE 30\r\n        #define FAST_GHOST_LIFE ((GHOST_LIFE)/2)\r\n    #else\r\n        #define MIN_SKULL_HITS 40\r\n        #define BOSS_HITS 170\r\n        #define GHOST_LIFE 20\r\n        #define FAST_GHOST_LIFE ((GHOST_LIFE)/4)\r\n    #endif    \r\n#endif\r\n\r\n#define BOSS_INDEX 2\r\n\r\n\r\n#define GHOST_SLOW_DOWN_THRESHOLD 5\r\n\r\n#if defined(WIDE) \r\n    #define BOSS_LEVEL_SKULL_INCREASE 5\r\n    #define BOSS_LEVEL_GHOSTS_NUMBER GHOSTS_NUMBER\r\n#else\r\n    #define BOSS_LEVEL_SKULL_INCREASE 4\r\n    #define BOSS_LEVEL_GHOSTS_NUMBER (GHOSTS_NUMBER-3)\r\n#endif\r\n\r\n\r\n#if !defined(INITIAL_GHOST_SLOWDOWN)\r\n    #if defined(WIDE)\r\n        #define INITIAL_GHOST_SLOWDOWN 27000\r\n    #else\r\n        #define INITIAL_GHOST_SLOWDOWN 28000\r\n    #endif\r\n#endif\r\n\r\n#if defined(WIDE)\r\n    #define FAST_GHOST_SLOWDOWN 15000\r\n#else\r\n    #define FAST_GHOST_SLOWDOWN 19000\r\n#endif\r\n\r\n#define FIRST_HORIZONTAL_WALLS_LEVEL 6\r\n\r\n#define FIRST_MOVING_BOMBS_LEVEL 11\r\n\r\n#if XSize>=32\r\n    #define RELOCATE_RANGE 7\r\n    #define HORIZONTAL_WALLS_INITIAL_LENGTH 2\r\n    #define HORIZONTAL_WALLS_INCREASE_LOOP 200\r\n#else\r\n    #define RELOCATE_RANGE 5\r\n    #define HORIZONTAL_WALLS_INITIAL_LENGTH 1\r\n    #define HORIZONTAL_WALLS_INCREASE_LOOP 300\r\n#endif\r\n\r\n#define FIRST_ROCKETS_LEVEL 7 // 8 because of check on levels after missile level\r\n\r\n// Maximum number of ghost that co-exist with rockets (in non-boss levels)\r\n#define MAX_GHOST_COUNT_FOR_ROCKETS 4\r\n\r\n#if XSize>=32\r\n    #define HORIZONTAL_MISSILE_OFFSET 3\r\n#else\r\n    #define HORIZONTAL_MISSILE_OFFSET 2\r\n#endif\r\n\r\n// -----------------------------------------------------------------------------------\r\n\r\n#if GHOSTS_NUMBER>=8\r\n    #define SKULL_TRIGGER 2\r\n#else\r\n    #define SKULL_TRIGGER 2\r\n#endif \r\n\r\n    \r\n#define FIRE_CHARGE_COOL_DOWN 110\r\n\r\n#define BOMB_CHARGE_COOL_DOWN 400\r\n\r\n#define CALM_DOWN_COOL_DOWN 240\r\n\r\n\r\n#define FREEZE_COOL_DOWN 320\r\n\r\n#define FIRE_POWER_COOL_DOWN 190\r\n\r\n#define SUPER_COOL_DOWN 160\r\n\r\n#define CONFUSE_COOL_DOWN 800\r\n#define SECOND_CONFUSE_COOL_DOWN 20000\r\n\r\n#define SUICIDE_COOL_DOWN 120\r\n#define SECOND_SUICIDE_COOL_DOWN 800\r\n\r\n#define CALM_DOWN_EFFECT_FACTOR 50\r\n\r\n#define EXTRA_POINTS_COOL_DOWN 2000\r\n#define SECOND_EXTRA_POINTS_COOL_DOWN 20000\r\n\r\n#define INVINCIBILITY_COOL_DOWN 3300\r\n#define SECRET_LEVEL_INVINCIBILITY_COOL_DOWN 100\r\n\r\n#define EXTRA_LIFE_COOL_DOWN 1400\r\n\r\n#define FREEZE_COUNT_DOWN 28\r\n\r\n#define INITIAL_FROZEN_COUNT_DOWN FROZEN_COUNT_DOWN\r\n\r\n#define CONFUSE_COUNT_DOWN 100\r\n\r\n#define INVINCIBILITY_COUNT_DOWN 88\r\n\r\n#define INITIAL_INVINCIBILITY_COUNT_DOWN (INVINCIBILITY_COUNT_DOWN/2)\r\n\r\n#define SUICIDE_COUNT_DOWN 200\r\n\r\n#define DESTROYER_COOL_DOWN 32000\r\n\r\n#define SUICIDE_BONUS 5\r\n\r\n#define SKULL_LOOP_TRIGGER 40\r\n\r\n#define SKULL_COUNT_DOWN 130\r\n\r\n#if defined(WIDE)\r\n    #define SKULL_MIN_SLOWDOWN 100\r\n    #define GHOST_MIN_SLOWDOWN 500\r\n#else\r\n    #define SKULL_MIN_SLOWDOWN 8000\r\n    #define GHOST_MIN_SLOWDOWN 6000\r\n#endif\r\n\r\n\r\n#if defined(_XL_TURN_BASED)\r\n    #define MAX_GHOST_LEVEL_SCALE 3\r\n    #define MAX_SKULL_LOOP_SCALE 3\r\n#else\r\n    #define MAX_GHOST_LEVEL_SCALE 1\r\n    #define MAX_SKULL_LOOP_SCALE 1\r\n#endif\r\n\r\n#define MAX_GHOST_LEVEL (1400/MAX_GHOST_LEVEL_SCALE)\r\n\r\n#define MAX_SKULL_LOOP (2000/MAX_SKULL_LOOP_SCALE)\r\n\r\n#define TURN_BASED_MAX_LOOP MAX_SKULL_LOOP\r\n\r\n#define GHOST_LEVEL_DECREASE (MAX_GHOST_LEVEL/560)\r\n\r\n#define MISSILES_FOR_SUICIDE 5\r\n\r\n#define SKULLS_FOR_SUPER 2\r\n\r\n\r\n#endif // _GAME_SETTINGS\r\n"
  },
  {
    "path": "src/games/shoot/game_text.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#ifndef _GAME_TEXT\r\n#define _GAME_TEXT\r\n\r\n#include \"settings.h\"\r\n#include \"cross_lib.h\"\r\n\r\n\r\n\r\n#define BULLET_IMAGE_X 10\r\n#define BULLET_IMAGE_Y 0\r\n#define FIRE_POWER_IMAGE_X 17\r\n#define FIRE_POWER_IMAGE_Y 0\r\n#define GHOST_IMAGE_X 6\r\n#define GHOST_IMAGE_Y 0\r\n#define PLAYER_IMAGE_X 14\r\n#define PLAYER_IMAGE_Y 0\r\n#define LEVEL_X (XSize-2)\r\n#define LEVEL_Y 0\r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text);\r\n\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\n// game_stat\r\nvoid displayScoreStats(void);\r\n\r\nvoid displayStatsTitles(void);\r\n\r\nvoid printGunsStats(void);\r\n\r\nvoid printFirePowerStats(void);\r\n\r\nvoid displayStats(void);\r\n\r\n#if XSize>20\r\n\tvoid printLevelStats(void);\r\n#else\r\n\t#define printLevelStats()\r\n#endif\r\nvoid printGhostCountStats(void);\r\nvoid printLivesStats(void);\t\t\r\n\r\n\r\nvoid _printCrossShoot(void);\r\n\r\n// game_text\r\n#if !defined(LESS_TEXT)\r\n\tvoid printLevel(void);\r\n\r\n\tvoid printVictoryMessage(void);\r\n\r\n    // void printSecondRound(void);\r\n#endif\r\n\r\n#if !defined(NO_PRINT)\r\n\tvoid printGameOver(void);\r\n#else\r\n\t#define printGameOver()\r\n#endif\r\n\r\nvoid printDefeatMessage(void);\r\n\r\nvoid printStartMessage(void);\r\n\r\n#if !defined(END_SCREEN)\r\n\tvoid gameCompleted(void);\r\n#endif\r\n\r\n#if !defined(NO_PRINT)\r\n\t// void printPressKeyToStart(void);\r\n    #define printPressKeyToStart() \\\r\n        do \\\r\n        { \\\r\n            _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n            PRINT_CENTERED(PRESS_STRING); \\\r\n        } while(0)\r\n#else\r\n\t#define printPressKeyToStart()\r\n#endif\r\n\r\n#if !defined(LESS_TEXT)\r\n\tvoid printKillTheSkulls(void);\r\n#else\r\n\t#define printKillTheSkulls()\r\n#endif\r\n\r\n\r\n#if !defined(_XL_NO_TEXT_COLOR)\r\n    #define _printTopScore() \\\r\n        do \\\r\n        { \\\r\n            _XL_PRINTD((uint8_t) ((XSize)>>1)-2, 0, 5, highScore); \\\r\n            _XL_SET_TEXT_COLOR(_XL_CYAN); \\\r\n            _XL_PRINT(((XSize)>>1)-4,0,\"HI\"); \\\r\n        } while(0)\r\n#else\r\n    #define _printTopScore() \\\r\n        do \\\r\n        { \\\r\n            _XL_PRINTD((uint8_t) ((XSize)>>1)-2, 0, 5, highScore); \\\r\n        } while(0)\r\n#endif\r\n\r\n\r\n#if defined(LESS_TEXT) \r\n\t\t#define handleLevelBonus(bonus) \\\r\n            do \\\r\n            { \\\r\n                points+=(bonus); \\\r\n            } while(0) \r\n                \r\n\t\t#define finalScore()\r\n\t\t#define highScoreScreen() \r\n\t\t\r\n#else\r\n    void handleLevelBonus(uint16_t score); // _XL_PRINTD(XSize/2-2,YSize/2,3,bonus)\r\n\r\n    // #define printLevelBonus(bonus) _XL_PRINTD(XSize/2-2,YSize/2,3,bonus)\r\n    // #define finalScore() _printScore(points)\r\n    // #define highScoreScreen() _printScore(highScore)  \t\r\n#endif\r\n\r\n#if XSize>=14\r\nvoid printHints(void);\r\n#endif\r\n\r\nvoid printAchievements(void);\r\n\r\n\t\r\n#endif // _GAME_TEXT\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shoot/ghost.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#ifndef _GHOST_H\r\n#define _GHOST_H\r\n\r\n#include \"character.h\"\r\n\r\nuint16_t computeGhostSlowDown(void);\r\n\r\nvoid spawnGhost(Character *ghostPtr, uint8_t ghostIndex);\r\n\r\nvoid ghostDies(Character * ghostPtr);\r\n\r\nvoid ghostDiesAndSpawns(Character * ghostPtr);\r\n\r\nvoid checkBombsVsGhost(register Character * ghostPtr);\r\n\r\nvoid checkBombsVsSkull(register Character * skullPtr);\r\n\r\nvoid checkBombsVsGhosts(void);\r\n\r\nvoid checkBombsVsSkulls(void);\r\n\r\nuint8_t sameLocationAsAnyGhostLocation(uint8_t x, uint8_t y, Character *characterList, uint8_t length);\r\n\r\nvoid decreaseGhostLevel(void);\r\n\r\nvoid displayGhosts(void);\r\n\r\nvoid displayBombs(void);\r\n\r\n#endif // _GHOST_H\r\n\r\n"
  },
  {
    "path": "src/games/shoot/horizontal_missile.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _HORIZONTAL_MISSILE_H\r\n#define _HORIZONTAL_MISSILE_H\r\n\r\n    #define computeArrowRange() ((level)>>2)\r\n    \r\n    void _handle_from_the_left(void);\r\n    \r\n    void _handle_from_the_right(void);\r\n    \r\n    void handle_horizontal_missiles(void);\r\n    \r\n#endif // _HORIZONTAL_MISSILE_H\r\n"
  },
  {
    "path": "src/games/shoot/images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#include \"settings.h\"\n\n#if !defined(ANIMATE_PLAYER)\n\tImage PLAYER_IMAGE;\n#else\n\t#if defined(USE_MEMORY_BUFFERS) || defined(USE_TINY_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\t\textern Image PLAYER_DOWN_IMAGE;\n\t\textern Image PLAYER_UP_IMAGE;\n\t\textern Image PLAYER_RIGHT_IMAGE;\n\t\textern Image PLAYER_LEFT_IMAGE;\t\n\t#else\n        Image PLAYER_DOWN_IMAGE;\n        Image PLAYER_UP_IMAGE;\n        Image PLAYER_RIGHT_IMAGE;\n        Image PLAYER_LEFT_IMAGE;\n\t#endif\n#endif\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_TINY_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\textern Image GHOST_IMAGE;\n\textern Image BOMB_IMAGE;\n#else\n\tImage GHOST_IMAGE;\n\tImage BOMB_IMAGE;\t\n#endif\n\nImage BOSS_IMAGE;\n\n\n#if defined(USE_MEMORY_BUFFERS)\n    extern Image CALM_DOWN_IMAGE;\n    Image FIRE_CHARGE_IMAGE;\n    extern Image BULLET_IMAGE;\n    Image FIRE_POWER_IMAGE;\t\n    extern Image SKULL_IMAGE;\t\t\n    extern Image EXTRA_POINTS_IMAGE;\t\n    \n    extern Image HORIZONTAL_BRICK_IMAGE;\n    extern Image VERTICAL_BRICK_IMAGE;\t\n#else\n    Image CALM_DOWN_IMAGE;\n    Image FIRE_CHARGE_IMAGE;\n    Image BULLET_IMAGE;\n    Image FIRE_POWER_IMAGE;\t\n    Image SKULL_IMAGE;\t\t\n    Image EXTRA_POINTS_IMAGE;\t\n    \n    Image HORIZONTAL_BRICK_IMAGE;\n    Image VERTICAL_BRICK_IMAGE;\t\n#endif\n\n#if defined(USE_MEMORY_BUFFERS)\n\n    extern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\n    extern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\n    extern Image ROCKET_IMAGE;\n\n    extern Image FREEZE_IMAGE;\t\n    \n    extern Image EXTRA_LIFE_IMAGE;\n    extern Image INVINCIBILITY_IMAGE;\t\n    \n    extern Image CHASE_IMAGE;\n    \n    extern Image SUPER_IMAGE;\n    extern Image CONFUSE_IMAGE;\n    Image SUICIDE_IMAGE;\n    \n    extern Image BROKEN_BRICK_IMAGE;\n    Image DESTROYER_IMAGE;\n    Image FAST_GHOST_IMAGE;\n#else\t\n    \n    Image LEFT_HORIZONTAL_MISSILE_IMAGE;\n    Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\n    Image ROCKET_IMAGE;\n\n    Image FREEZE_IMAGE;\t\n    \n    Image EXTRA_LIFE_IMAGE;\n    Image INVINCIBILITY_IMAGE;\t\n    \n    Image CHASE_IMAGE;\n    \n    Image SUPER_IMAGE;\n    Image CONFUSE_IMAGE;\n    Image SUICIDE_IMAGE;\n    \n    #if !defined(_XL_NO_COLOR) && defined(NO_BLINKING)\n    Image BROKEN_BRICK_IMAGE;\n    #endif\n    \n    Image DESTROYER_IMAGE;\n    Image FAST_GHOST_IMAGE;\n#endif\n\n\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/games/shoot/init_images.h",
    "content": "#ifndef _INIT_IMAGES_H\r\n#define _INIT_IMAGES_H\r\n\r\n#define _PLAYER_DOWN_TILE              _TILE_0\r\n#define _PLAYER_UP_TILE                _TILE_1\r\n#define _PLAYER_RIGHT_TILE             _TILE_2\r\n#define _PLAYER_LEFT_TILE              _TILE_3\r\n\r\n#define _GHOST_TILE                    _TILE_4\r\n#define _BOMB_TILE                     _TILE_5\r\n#define _BOSS_TILE                     _TILE_6\r\n#define _SKULL_TILE                    _TILE_7\r\n#define _CALM_DOWN_TILE                _TILE_8\r\n#define _FIRE_POWER_TILE               _TILE_9\r\n#define _INVINCIBILITY_TILE            _TILE_10\r\n#define _BULLET_TILE                   _TILE_11\r\n#define _VERTICAL_BRICK_TILE           _TILE_12\r\n#define _HORIZONTAL_BRICK_TILE         _TILE_13\r\n#define _LEFT_HORIZONTAL_MISSILE_TILE  _TILE_14\r\n#define _RIGHT_HORIZONTAL_MISSILE_TILE _TILE_15\r\n#define _ROCKET_TILE                   _TILE_16\r\n#define _FREEZE_TILE                   _TILE_17\r\n#define _SUPER_TILE                    _TILE_18\r\n#define _PLAYER_DOWN_TOP_TILE          _TILE_19\r\n#define _PLAYER_BOTTOM_TILE            _TILE_20\r\n#define _PLAYER_UP_TOP_TILE            _TILE_21\r\n#define _PLAYER_LEFT_MOVE_TILE         _TILE_22\r\n#define _PLAYER_RIGHT_MOVE_TILE        _TILE_23\r\n#define _DESTROYER_TILE                _TILE_24\r\n#define _EXTRA_POINTS_TILE             _TILE_25\r\n#define _FAST_GHOST_TILE               _TILE_26\r\n\r\n#define _PLAYER_COLOR _XL_CYAN\r\n#define _GHOST_COLOR _XL_WHITE\r\n#define _DEAD_GHOST_COLOR _XL_RED\r\n#define _SKULL_COLOR _XL_YELLOW\r\n#define _BOMB_COLOR _XL_RED\r\n#define _MISSILE_COLOR _XL_WHITE\r\n#define _ROCKET_COLOR _XL_WHITE\r\n#define _CALM_DOWN_COLOR _XL_GREEN\r\n#define _FIRE_CHARGE_COLOR _XL_GREEN\r\n#define _FREEZE_COLOR _XL_CYAN\r\n#define _SUPER_COLOR _XL_RED\r\n#define _FIRE_POWER_COLOR _XL_YELLOW\r\n#define _BULLET_COLOR _XL_WHITE\r\n#define _BRICK_COLOR _XL_GREEN\r\n#define _BROKEN_BRICK_COLOR _XL_YELLOW\r\n#define _EXTRA_POINTS_COLOR _XL_YELLOW\r\n#define _EXTRA_LIFE_COLOR _XL_WHITE\r\n#define _INVINCIBILITY_COLOR _XL_YELLOW\r\n#define _CONFUSE_COLOR _XL_RED\r\n#define _SUICIDE_COLOR _XL_YELLOW\r\n#define _DESTROYER_COLOR _XL_YELLOW\r\n#define _FAST_GHOST_COLOR _XL_GREEN\r\n\r\nvoid INIT_IMAGES(void);\r\n\r\n\r\n\r\n\r\n#endif // _INIT_IMAGES_H\r\n\r\n"
  },
  {
    "path": "src/games/shoot/item.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#if !defined(_ITEM_HEADER)\r\n#define _ITEM_HEADER\r\n\r\n#include \"character.h\"\r\n\r\n\r\nstruct ItemStruct\r\n{\r\n    Character _character;\r\n    void (*_effect)(void);\r\n    uint16_t _coolDown;\r\n    #if !defined(NO_BLINKING)\r\n    uint8_t _blink;\r\n    #endif\r\n};\r\n\r\ntypedef struct ItemStruct Item;\r\n\r\nvoid handle_count_down(uint8_t * flagPtr, uint8_t * countDownPtr);    \r\n\r\nvoid reduceItemCoolDowns(void);\r\n\r\nvoid itemReached(Character * itemPtr);\r\n\r\nvoid relocateAwayFromWalls(Character * itemPtr);\r\n\r\nvoid _freezeEffect(void);\r\n\r\nvoid fireChargeEffect(void);\r\n\r\nvoid bombChargeEffect(void);\r\n\r\nvoid _firePowerEffect(void);\r\n\r\nvoid firePowerEffect(void);\r\n\r\nvoid calmDownEffect(void);\r\n\r\nvoid extraPointsEffect(void);\r\n\r\nvoid handle_item(register Item *itemPtr);\r\n\r\nvoid _freezeEffect(void);\r\n\r\nvoid freezeEffect(void);\r\n\r\nvoid extraLifeEffect(void);\r\n\r\nvoid _invincibilityEffect(void);\r\n\r\nvoid invincibilityEffect(void);\r\n\r\nvoid superEffect(void);\r\n\r\nvoid confuseEffect(void);\r\n\r\nvoid suicideEffect(void);\r\n\r\nvoid destroyerEffect(void);\r\n\r\n#define handle_freeze_count_down() handle_count_down(&freezeActive,&freeze_count_down)\r\n#define handle_invincibility_count_down() handle_count_down(&invincibilityActive, &invincibility_count_down)    \r\n#define handle_confuse_count_down() handle_count_down(&confuseActive, &confuse_count_down)\r\n#define handle_destroyer_count_down() handle_count_down(&destroyerActive,&destroyer_count_down)\r\n\r\n// Standard items\r\n#define handle_calmDown_item() handle_item(&calmDown);\r\n#define handle_freeze_item() handle_item(&freeze);    \r\n#define handle_firePower_item() handle_item(&firePower);\r\n#define handle_fireCharge_item() handle_item(&fireCharge);\r\n#define handle_bombCharge_item() handle_item(&bombCharge);\r\n\r\n// To be Triggered \r\n#define handle_invincibility_item() handle_item(&invincibility)\r\n#define handle_extraPoints_item() handle_item(&extraPoints);\r\n\r\n// Secret\r\n#define handle_super_item() handle_item(&super)\r\n#define handle_confuse_item() handle_item(&confuse)\r\n#define handle_suicide_item() handle_item(&suicide)\r\n#define handle_extraLife_item() handle_item(&extraLife)\r\n#define handle_destroyer_item() handle_item(&destroyer)\r\n\r\nvoid handle_destroyer_triggers(void);\r\n\r\nvoid setSecret(uint8_t secretIndex);\r\n\r\n#define SECRETS_NUMBER 16\r\n\r\n#define EXTRA_POINTS_EFFECT_SECRET_INDEX 0\r\n#define INVINCIBILITY_EFFECT_SECRET_INDEX 1 \r\n#define CONFUSE_EFFECT_SECRET_INDEX 2\r\n#define SUICIDE_EFFECT_SECRET_INDEX 3\r\n#define SUPER_EFFECT_SECRET_INDEX 4\r\n#define EXTRA_LIFE_EFFECT_SECRET_INDEX 5\r\n#define FIRE_CHARGE_AT_START_SECRET_INDEX 6\r\n#define FIRE_POWER_AT_START_SECRET_INDEX 7\r\n#define CALM_DOWN_AT_START_SECRET_INDEX 8\r\n#define EXTRA_POINTS_AT_START_SECRET_INDEX 9\r\n#define FREEZE_AT_START_SECRET_INDEX 10\r\n#define MISSILE_DESTROYER_SECRET_INDEX 11\r\n#define BOMB_DESTROYER_SECRET_INDEX 12\r\n#define FIRE_POWER_LEVEL_SECRET_INDEX 13\r\n#define SKULLS_ACTIVATED_SECRET_INDEX 14\r\n#define ZERO_LEVEL_SECRET_INDEX 15\r\n\r\n#endif // _item.h\r\n\r\n"
  },
  {
    "path": "src/games/shoot/level.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#ifndef _LEVEL\r\n#define _LEVEL\r\n\r\n#include \"character.h\"\r\n#include \"ghost.h\"\r\n\r\n#if XSize<YSize\r\n    #define MIN_SIZE XSize\r\n#else\r\n    #define MIN_SIZE YSize\r\n#endif\r\n\r\n#if MIN_SIZE>12\r\n    #define SPIRAL_LOOPS (2*MIN_SIZE-21)\r\n#else\r\n    #define SPIRAL_LOOPS (2*MIN_SIZE-18)\r\n#endif\r\n\r\n// DRAW HORIZONTAL AND VERTICAL LINES\r\nvoid DRAW_HORIZONTAL_LINE(uint8_t x, uint8_t y, uint8_t length);\r\nvoid DRAW_VERTICAL_LINE(uint8_t x, uint8_t y, uint8_t length);    \r\n\r\n\r\n// VERTICAL AND HORIZONTAL BORDER\r\n#if !defined(TINY_GAME)\r\n    #define DRAW_VERTICAL_BORDER(x) DRAW_VERTICAL_LINE(x,0,YSize-1)\r\n    \r\n    #if !defined(FULL_LOWER_BORDER)\r\n        #define DRAW_HORIZONTAL_BORDER(y) DRAW_HORIZONTAL_LINE(0,y,XSize-1)\r\n    #else\r\n        #define DRAW_HORIZONTAL_BORDER(y) DRAW_HORIZONTAL_LINE(0,y,XSize)\r\n    #endif\r\n#else    \r\n    #define DRAW_VERTICAL_BORDER(x)    \r\n    #define DRAW_HORIZONTAL_BORDER(y)\r\n#endif\r\n\r\n\r\n#define WALL_COLOR _XL_YELLOW\r\n\r\n\r\n#define DRAW_BORDERS() \\\r\n    do \\\r\n    { \\\r\n    _XL_SET_TEXT_COLOR(WALL_COLOR); \\\r\n    DRAW_HORIZONTAL_BORDER(0); \\\r\n    DRAW_HORIZONTAL_BORDER(YSize-1); \\\r\n    DRAW_VERTICAL_BORDER(0); \\\r\n    DRAW_VERTICAL_BORDER(XSize-1); \\\r\n    } while(0)\r\n\r\n\r\n\r\n#define PLACE_DEAD_GHOST() \\\r\n    initializeCharacter(&ghosts[count],(uint8_t) (GHOSTS_NUMBER-count),(uint8_t) 1,0,&DEAD_GHOST_IMAGE);\r\n\r\n\r\n// Check XSize to avoid overflow\r\n#if XSize>48\r\n    #define ROUND_X_POS (uint8_t) ((2*j-1)*(uint8_t)(XSize/6))\r\n#else\r\n    #define ROUND_X_POS (uint8_t) ((2*j-1)*XSize/6)\r\n#endif\r\n\r\n// Check YSize to avoid overflow\r\n#if YSize>48\r\n    #define ROUND_Y_POS (uint8_t) ((2*i-1)*(uint8_t)(YSize/6))\r\n#else\r\n    #define ROUND_Y_POS (uint8_t) ((2*i-1)*YSize/6)\r\n#endif\r\n    \r\n#define PLACE_ROUND_GHOST() \\\r\n    initializeCharacter(&ghosts[count], \\\r\n        ROUND_X_POS, \\\r\n        ROUND_Y_POS, \\\r\n        GHOST_LIFE ,&GHOST_IMAGE);\r\n\r\n#define PLACE_FLAT_GHOST() \\\r\n    initializeCharacter(&ghosts[count],(uint8_t) (j*(XSize/5)),(i*(YSize/5)),GHOST_LIFE,&GHOST_IMAGE);\r\n\r\n#define PLACE_FLAT_GHOST_6() \\\r\n    initializeCharacter(&ghosts[count],(uint8_t) (j*(XSize>>2)),(i*(YSize/5)),GHOST_LIFE,&GHOST_IMAGE);    \r\n    \r\n#define PLACE_NINTH_GHOST() \\\r\n    initializeCharacter(&ghosts[4],(uint8_t) (XSize-4),(uint8_t) (YSize-4),GHOST_LIFE,&GHOST_IMAGE);\r\n\r\n    \r\n#define ROUND_NINE_GHOSTS() \\\r\n    for(i=1;i<=3;++i) \\\r\n    { \\\r\n        for(j=1;j<=3;++j) \\\r\n        { \\\r\n            if(nGhosts>count) \\\r\n            { \\\r\n                if(count!=4) \\\r\n                { \\\r\n                    PLACE_ROUND_GHOST(); \\\r\n                } \\\r\n                else \\\r\n                { \\\r\n                    PLACE_NINTH_GHOST(); \\\r\n                } \\\r\n            } \\\r\n            else \\\r\n            { \\\r\n                PLACE_DEAD_GHOST(); \\\r\n            } \\\r\n            ++count; \\\r\n        } \\\r\n    }\r\n    \r\n    \r\n#define ROUND_EIGHT_GHOSTS() \\\r\n    for(i=1;i<=3;++i) \\\r\n    { \\\r\n        for(j=1;j<=3;++j) \\\r\n        { \\\r\n            if(i!=2 || j !=2) \\\r\n            { \\\r\n                if(nGhosts>count) \\\r\n                { \\\r\n                    PLACE_ROUND_GHOST(); \\\r\n                } \\\r\n                else \\\r\n                { \\\r\n                    PLACE_DEAD_GHOST(); \\\r\n                } \\\r\n                ++count; \\\r\n            } \\\r\n        } \\\r\n    }\r\n\r\n\r\n#define FLAT_EIGHT_GHOSTS() \\\r\n    for(j=1;j<=4;++j) \\\r\n    { \\\r\n        for(i=1;i<=4;i+=3) \\\r\n        { \\\r\n            if(nGhosts>count) \\\r\n            { \\\r\n                PLACE_FLAT_GHOST(); \\\r\n            } \\\r\n            else \\\r\n            { \\\r\n                PLACE_DEAD_GHOST(); \\\r\n            } \\\r\n            ++count; \\\r\n        } \\\r\n    }\r\n\r\n    \r\n#define FLAT_SIX_GHOSTS() \\\r\n    for(j=1;j<=3;++j) \\\r\n    { \\\r\n        for(i=1;i<=4;i+=3) \\\r\n        { \\\r\n            if(nGhosts>count) \\\r\n            { \\\r\n                PLACE_FLAT_GHOST_6(); \\\r\n            } \\\r\n            else \\\r\n            { \\\r\n                PLACE_DEAD_GHOST(); \\\r\n            } \\\r\n            ++count; \\\r\n        } \\\r\n    }\r\n    \r\n#define INITIALIZE_BOMBS() \\\r\n    do \\\r\n    { \\\r\n        for(i=0;i<BOMBS_NUMBER;++i) \\\r\n        { \\\r\n            initializeCharacter(&bombs[i], 1+i, YSize-2,0,&BOMB_IMAGE); \\\r\n        } \\\r\n    } \\\r\n    while(0)\r\n\r\n    \r\n#if defined(NO_RANDOM_LEVEL)\r\n    #define THREE_BOMBS() \\\r\n        do \\\r\n        { \\\r\n            initializeCharacter(&bombs[0],(XSize>>1), ((YSize/3)<<1),0,&BOMB_IMAGE); \\\r\n            initializeCharacter(&bombs[1],XSize/3, (YSize/3),0,&BOMB_IMAGE); \\\r\n            initializeCharacter(&bombs[2],((XSize/3)<<1), (YSize/3),0,&BOMB_IMAGE);    \\\r\n        } \\\r\n        while(0)\r\n#else\r\n    #define THREE_BOMBS() \\\r\n        do \\\r\n        { \\\r\n            uint8_t rnd = _XL_RAND()&1; \\\r\n            initializeCharacter(&bombs[0],XSize/3+rnd, (YSize/3)+rnd,0,&BOMB_IMAGE); \\\r\n            initializeCharacter(&bombs[1],(XSize>>1)+rnd, ((YSize/3)*2)+rnd,0,&BOMB_IMAGE); \\\r\n            initializeCharacter(&bombs[2],2*(XSize/3)+rnd, (YSize/3)-rnd,0,&BOMB_IMAGE); \\\r\n        } \\\r\n        while(0)\r\n#endif    \r\n\r\n\r\n#if defined(NO_RANDOM_LEVEL)\r\n    #define TWO_BOMBS() \\\r\n        do \\\r\n        { \\\r\n            initializeCharacter(&bombs[0],(XSize>>1), ((YSize/3)),0,&BOMB_IMAGE); \\\r\n            initializeCharacter(&bombs[1],(XSize>>1), ((YSize/3)<<1),0,&BOMB_IMAGE); \\\r\n        } \\\r\n        while(0)\r\n#else\r\n    #define TWO_BOMBS() \\\r\n        do \\\r\n        { \\\r\n            initializeCharacter(&bombs[0],(XSize>>1), ((YSize/3))+_XL_RAND()%3,0,&BOMB_IMAGE); \\\r\n            initializeCharacter(&bombs[1],(XSize>>1)-1+_XL_RAND()%3, ((YSize/3)*2)-1+_XL_RAND()%3,0,&BOMB_IMAGE); \\\r\n        } \\\r\n        while(0)\r\n#endif    \r\n\r\n\r\n#if defined(NO_RANDOM_LEVEL)\r\n    #define ONE_BOMB() \\\r\n        initializeCharacter(&bombs[0],(XSize>>1), (YSize>>1),0,&BOMB_IMAGE);            \r\n#else\r\n    #define ONE_BOMB() \\\r\n        initializeCharacter(&bombs[0],(XSize>>1)+_XL_RAND()&1, (YSize>>1)+_XL_RAND()&1,0,&BOMB_IMAGE);\r\n#endif\r\n\r\n#if defined(BETWEEN_LEVEL)\r\n    void spiral(register Character *characterPtr, uint8_t length);\r\n#endif\r\n\r\nvoid fillLevelWithCharacters(void);\r\n\r\nvoid updateInnerVerticalWall(void);\r\n\r\nvoid updateInnerHorizontalWall(void);\r\n\r\nuint8_t innerHorizontalWallLevel(void);\r\n\r\nuint8_t oneMissileLevel(void);\r\n\r\n// uint8_t rocketLevel(void);\r\n\r\nuint8_t missileLevel(void);    \r\n\r\nuint8_t innerVerticalWallLevel(void);\r\n\r\nuint8_t bossLevel(void);\r\n\r\nvoid initializeAwayFromWall(Character * characterPtr, uint8_t x, uint8_t y, uint8_t status, Image *imagePtr);\r\n\r\nvoid initializeBombs(void);\r\n\r\nvoid setNumberOfRocketsOnScreen(void);\r\n\r\n#endif // _LEVEL\r\n"
  },
  {
    "path": "src/games/shoot/makefiles/Makefile.override",
    "content": "\r\n\r\n#######################################################\r\n\r\napple2: apple2_hgr\r\n\r\napple2_hgr: $(ASSETS_PATH)/7x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t apple2 \\\r\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\r\n\t -D__ALT_SLEEP  $(APPLE2_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_APPLE2_HGR_SLOWDOWN) -DXSize=20 -DYSize=24 \\\r\n\t -D__ALT_PRINT -D_XL_NO_SOUND -DNO_TRANSICTION_ANIMATION \\\r\n\t-D__APPLE2_HGR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\r\n\t$(FULL_FILES) \\\r\n\t--code-name LOWCODE \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/$@.bin\r\nifdef USE_TOOLS\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/$@.bin\r\n\trm -rf $(BUILD_PATH)/$@.bin\r\nelse\r\n\tmv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\nendif\r\n\r\n\r\napple2enh: apple2enh_hgr\r\n\r\napple2enh_hgr: $(ASSETS_PATH)/7x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t apple2 \\\r\n\t--config $(CFG_PATH)/cc65/apple2-hgr.cfg \\\r\n\t -D__ALT_SLEEP  $(APPLE2_GAME_OPTS) -D_XL_NO_SOUND \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_APPLE2ENH_HGR_SLOWDOWN) -DXSize=20 -DYSize=24 \\\r\n\t -D__ALT_PRINT -DNO_TRANSICTION_ANIMATION \\\r\n\t-D__APPLE2_HGR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \\\r\n\t$(FULL_FILES)  \\\r\n    --code-name LOWCODE \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/$@.bin\r\nifdef USE_TOOLS\r\n\tcp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tjava -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/$@.bin\r\n\trm -rf $(BUILD_PATH)/$@.bin\r\nelse\r\n\tmv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\nendif\r\n\r\n\r\nvic20: vic20_exp_16k\r\n\r\nvic20_exp_16k: $(ASSETS_PATH)/cc65_udc_arcade_v2.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS)  -Or -Cl -t vic20 -m mapfile.txt   \\\r\n\t--config $(CFG_PATH)/cc65/vic20-16k_CODE2_GFX_ALT_V2.cfg \\\r\n\t-D__CONIO_GRAPHICS -D__VIC20_EXP_16K -DEXTRA_TITLE -D__ALT_SLEEP  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=500 -DGHOSTS_NUMBER=8 \\\r\n\t-DTRANSITION_ANIMATION \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_v2.s \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n\t$(SOURCE_PATH)/split_files/move_player.c \\\r\n\t$(SOURCE_PATH)/split_files/ghost.c  $(SOURCE_PATH)/split_files/level.c $(SOURCE_PATH)/split_files/character.c $(SOURCE_PATH)/split_files/game_text.c \\\r\n\t$(SOURCE_PATH)/split_files/main.c \\\r\n\t$(SOURCE_PATH)/split_files/init_images.c \\\r\n\t$(SOURCE_PATH)/split_files/strategy.c \\\r\n\t$(SOURCE_PATH)/split_files/item.c $(SOURCE_PATH)/split_files/bullet.c  \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t--code-name CODE2 \\\r\n\t$(SOURCE_PATH)/split_files/horizontal_missile.c $(SOURCE_PATH)/split_files/rocket.c  $(SOURCE_PATH)/split_files/skull.c  \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(SOURCE_PATH)/split_files/end_screen.c $(SOURCE_PATH)/split_files/sleep.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n\r\n\r\n\r\n# c16: c16_32k\r\n\r\n# plus4: c16_32k\r\n\r\n# c16_32k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16 \\\r\n\t# --config $(CFG_PATH)/cc65/c16-32k_GFX_64chars.cfg \\\r\n\t # -DEXTRA_TITLE -DTRANSITION_ANIMATION \\\r\n\t# -D__ALT_PRINT \\\r\n\t# -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t# -D__DEFAULT_CLEAR_SCREEN \\\r\n\t# -D__ALT_SLEEP  \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=300 \\\r\n\t# -DDANCE  -D__UDG_BASE_FACTOR=23 \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t# $(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t# $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t# $(FULL_FILES) \\\r\n\t# $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_c16_32k.prg\r\n\r\n\r\n# creativision: creativision_32k\r\n\r\ncreativision: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t creativision \\\r\n\t-D__CREATIVISION__  \\\r\n\t-D__ALT_SLEEP  \\\r\n\t-D__VDP_MODE1_GRAPHICS -DGHOSTS_NUMBER=8 -DBULLETS_NUMBER=4 -DLESS_TEXT  -DTRANSITION_ANIMATION  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=300 -DUSE_LIGHT_MEMORY_BUFFERS -DNO_BLINKING -DEXTRA_TITLE \\\r\n\t--config $(CFG_PATH)/cc65/creativision-32k.cfg \\\r\n\t$(SOURCE_PATH)/memory/creativision_memory_light.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@_32k.bin\r\n\r\n\r\nsupervision: $(ASSETS_PATH)/cc65_udc.s \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t supervision  -DEXTRA_TITLE  \\\r\n\t--config $(CFG_PATH)/cc65/supervision-16k_GFX_3.cfg \\\r\n\t$(ASSETS_PATH)/cc65_udc.s \\\r\n\t-D__ALT_PRINT -D__ALT_SLEEP \\\r\n\t-D__BIT_MAPPED_4_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN  -D_XL_SLOW_DOWN_FACTOR=2500 -DTRANSITION_ANIMATION \\\r\n\t -DNO_EXTRA_TITLE \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_ONLY_FILES) \\\r\n\t--code-name CODE0 \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/supervision/supervision_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_supervision.sv\r\n\r\n\r\nifdef USE_TOOLS\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\nelse\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s\r\nendif\t\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack_2.cfg \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=1000  -DNO_BLINKING  \\\r\n\t-D__ALT_SLEEP -DGHOSTS_NUMBER=5 -DBULLETS_NUMBER=3 -D_XL_NO_COLOR \\\r\n\t-DNO_DISPLAY_LEVEL_ANIMATION \\\r\n\t-DLESS_TEXT -D__NO_COLOR_INIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \\\r\n\t-DNO_HINTS -DNO_SECRET_ANIMATION \\\r\n\t-DNO_CONTROL_INSTRUCTIONS -DNO_EXTRA_TITLE -DNO_BONUS_ANIMATION \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\nifdef USE_TOOLS\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\nendif \r\n\r\n\r\n#################################################################\r\n# LCC1802\r\n\r\n\r\n#################################################################\r\n\r\n\r\n# ------------------------------------------------------------------------------------------\r\n# LCC1802\r\n#    -target=xr18CX\r\n# https://sites.google.com/site/lcc1802/downloads/Quarrantine.zip?attredirects=0&d=1\r\n\r\n\r\n# LCC1802_OPTS ?= -target=xr18CX \"-Wf-volatile\" -O \"-Wp-D nofloats\" \"-Wa-D LCCNOLONG\" \"-Wf-mulcall\" $(GLOBAL_OPTS)\r\n# BASIC_OPTS ?= $(LCC1802_OPTS) \"-Wa-D LCCCX=1\"\r\n# COMX_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x4401\" \r\n# PECOM_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x201\" \r\n# TMC600_OPTS ?= $(BASIC_OPTS) \"-Wa-D CODELOC=0x6300\"\r\n# CIDELSA_OPTS ?= $(LCC1802_OPTS)  \"-Wa-D CODELOC=0\"  \"-Wa-D NOFILLBSS=1\" \"-Wf-mulcall\"\r\n# DRACO_32K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x8000\" \"-Wa-D STACKLOC=0x83ff\"\r\n# DRACO_16K_OPTS ?= $(CIDELSA_OPTS)  \"-Wa-D DATALOC=0x4000\" \"-Wa-D STACKLOC=0x43ff\"\r\n# ALTAIR_24K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x6000\" \"-Wa-D STACKLOC=0x60ff\"\r\n# ALTAIR_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x3000\" \"-Wa-D STACKLOC=0x30ff\"\r\n# DESTROYER_12K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x3000\" \"-Wa-D STACKLOC=0x30ff\"\r\n# DESTROYER_8K_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x2000\" \"-Wa-D STACKLOC=0x20ff\"\r\n\r\n# MICROBOARD_OPTS ?= $(CIDELSA_OPTS) \"-Wa-D DATALOC=0x8000\" \"-Wa-D STACKLOC=0x9fff\"\r\n# MICROBOARD_PAL_2_OPTS ?= $(MICROBOARD_OPTS) \"-DPAL=2\"\r\n\r\n \r\n################################################################################\r\n\r\n\r\n\r\n# COMX_REDUCED_EXTRA_FILES ?= \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/comx_init_graphics.c \\\r\n\t# $(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c \\\r\n\t# $(CROSS_LIB_PATH)/sleep/sleep_macros.c\r\n\r\n# COMX_EXTRA_FILES ?= \\\r\n\t# $(COMX_REDUCED_EXTRA_FILES) \\\r\n\t# $(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c\r\n\r\n# COMX_EXTRA_FILES_WTIH_END_SCREEN ?= \\\r\n\t# $(COMX_EXTRA_FILES) \\\r\n\t# $(SOURCE_PATH)/end_screen.c \r\n\r\n\r\n\r\n\r\n# tiny_combo.c:\r\n\t# cat \\\r\n\t# $(TINY_FILES) \\\r\n\t# > $(SOURCE_PATH)/../tiny_combo.c\r\n\r\n\r\n# light_combo.c: tiny_combo.c\r\n\t# cat \\\r\n\t# $(SOURCE_PATH)/../tiny_combo.c \\\r\n\t# $(LIGHT_ONLY_FILES) \\\r\n\t# > $(SOURCE_PATH)/../light_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../tiny_combo.c\r\n\r\n\r\n# full_combo.c: light_combo.c\r\n\t# cat \\\r\n\t# $(SOURCE_PATH)/../light_combo.c \\\r\n\t# $(FULL_ONLY_FILES) \\\r\n\t# > $(SOURCE_PATH)/../full_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_combo.c\r\n\r\n\r\n# tiny_combo_rand.c: tiny_combo.c\r\n\t# cat \\\r\n\t# $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \\\r\n\t# $(SOURCE_PATH)/../tiny_combo.c \\\r\n\t# > $(SOURCE_PATH)/../tiny_combo_rand.c\r\n\t# rm  $(SOURCE_PATH)/../tiny_combo.c\r\n    \r\n# light_combo_rand.c: light_combo.c\r\n\t# cat \\\r\n\t# $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \\\r\n\t# $(SOURCE_PATH)/../light_combo.c \\\r\n\t# > $(SOURCE_PATH)/../light_combo_rand.c\r\n\t# rm -rf $(SOURCE_PATH)/../light_combo.c\r\n    \r\n    \r\n# full_combo_rand.c: full_combo.c\r\n\t# cat \\\r\n\t# $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \\\r\n\t# $(SOURCE_PATH)/../full_combo.c \\\r\n\t# > $(SOURCE_PATH)/../full_combo_rand.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_combo.c\r\n\r\n\r\n\r\n# reduced_full_lcc1802_combo.c: full_combo_rand.c\r\n\t# cat \\\r\n\t# $(COMX_REDUCED_EXTRA_FILES) \\\r\n\t# $(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\r\n\r\n# full_lcc1802_combo.c: full_combo_rand.c\r\n\t# cat \\\r\n\t# $(COMX_EXTRA_FILES_WTIH_END_SCREEN) \\\r\n\t# $(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\r\n# clean_combo_files:\r\n\t# rm -rf $(SOURCE_PATH)/../full_combo_rand.c\r\n\t# rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\r\n\r\n# LCC1802_BASIC_C_OPTS ?= \\\r\n\t# -D__LCC1802__ \\\r\n\t# -D__NO_COLOR_INIT \\\r\n\t# -D__ALT_PRINT\r\n\r\n# LCC1802_C_OPTS = \\\r\n\t# $(LCC1802_BASIC_C_OPTS) \\\r\n\t# -D__ALT_SLEEP \\\r\n\r\n\r\n# REDUCED_LCC1802_C_OPTS = \\\r\n\t# $(LCC1802_BASIC_C_OPTS) \\\r\n\t# -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t# -DNO_RANDOM_LEVEL\r\n\r\n\r\n\t# -DLESS_TEXT -DNO_HINTS \\\r\n\t# $(REDUCED_LCC1802_C_OPTS) \\\r\n\t# -DGHOSTS_NUMBER=7 \\\r\n\t# $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c\r\n\t# mv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\n\r\n_full_comx: _comx\r\n\r\n\r\n_comx_buffered: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS)  \\\r\n\t-D__COMX__  $(COMX_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\ncomx_buffered: \\\r\n    _comx_buffered \\\r\n    clean_combo_files\r\n\r\n# -D__LCC1802_UNBUFFERED\r\n_comx: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) -D__LCC1802_UNBUFFERED  \\\r\n\t-D__COMX__  $(COMX_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\ncomx: \\\r\n    _comx \\\r\n    clean_combo_files\r\n\r\n\r\n\r\n\r\n# Interrupt-driver graphics\r\n_comx_int: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) -DVIS_INT  \\\r\n\t-D__COMX__  \\\r\n\t$(COMX_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\ncomx_int: \\\r\n    _comx_int \\\r\n    clean_combo_files\r\n\r\n\r\n_comx_ntsc: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x8_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS)  \\\r\n\t-D__COMX__  -DNTSC $(COMX_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\ncomx_ntsc: \\\r\n    _comx_ntsc \\\r\n    clean_combo_files\r\n\r\n\r\n_full_pecom: _pecom\r\n\r\n_pecom: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PECOM_OPTS)  \\\r\n\t-D__PECOM__  $(PECOM_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PECOM_SLOWDOWN) \\\r\n\t$(PECOM_GAME_OPTS)  \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\npecom: \\\r\n    _pecom \\\r\n    clean_combo_files\r\n\r\n\r\n\r\n_micro_pal2: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x9_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_PAL_2_OPTS)  \\\r\n\t-D__MICRO__ \\\r\n\t-D__COMX_COLOR_GRAPHICS  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MICRO_SLOWDOWN) \\\r\n\t$(MICRO_GAME_OPTS)  \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\n_micro_pal1: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x8_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_PAL_1_OPTS)  \\\r\n\t-D__MICRO__ \\\r\n\t-D__COMX_COLOR_GRAPHICS  \\\r\n\t$(MICRO_GAME_OPTS)  \\\r\n\t \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\n\r\n_micro_ntsc1: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x8_chars.h\r\n\t$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_NTSC1_OPTS)  \\\r\n\t-D__MICRO__ -DNTSC \\\r\n\t-D__COMX_COLOR_GRAPHICS  \\\r\n\t$(MICRO_GAME_OPTS)  \\\r\n\t \\\r\n\t$(LCC1802_COLOR_C_OPTS) \\\r\n\t-DSIMPLE_STRATEGY -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t-DNO_BLINKING -DTINY_TEXT -DNO_TRANSICTION_ANIMATION \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t-DLESS_TEXT -DNO_HINTS -DNO_INITIAL_SCREEN \\\r\n\t$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\t# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c\r\n\tmv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_$@.hex\r\n\r\n\r\nmicro_pal1: \\\r\n    _micro_pal1 \\\r\n    clean_combo_files\r\n    \r\nmicro_ntsc1: \\\r\n    _micro_ntsc1 \\\r\n    clean_combo_files\r\n\r\nmicro_pal2: \\\r\n    _micro_pal2 \\\r\n    clean_combo_files\r\n\r\n_micro: _micro_pal2\r\n\r\nmicro: \\\r\n    _micro \\\r\n    clean_combo_files\r\n\r\n\r\n\r\n# _cidelsa_draco: full_lcc1802_combo.c\r\n\t# $(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DRACO_32K_OPTS)  -DEXTRA_TITLE  \\\r\n\t# -D__CIDELSA__ -D__DRACO__  -DNO_INITIAL_SCREEN  -DNO_HINTS -DLESS_TEXT \\\r\n\t  # \\\r\n\t# -D_XL_NO_COLOR -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t# -DNO_BLINKING \\\r\n\t# $(LCC1802_C_OPTS) -D_XL_NO_SLEEP -D_XL_NO_SOUND \\\r\n\t# -DGHOSTS_NUMBER=8 \\\r\n\t# $(SOURCE_PATH)/../full_lcc1802_combo.c\r\n\t# mv $(SOURCE_PATH)/../../a.hex $(BUILD_PATH)/X$(GAME_NAME)_cidelsa_draco_32K.hex\r\n\r\n# cidelsa: \\\r\n    # _cidelsa \\\r\n    # clean_combo_files\r\n\r\n\r\n# comx_targets: comx\r\n\r\n# pecom_targets: pecom\r\n\r\n# tmc600_targets: tmc600_37k\r\n\r\n# cidelsa_targets: cidelsa\r\n\r\n\r\n\r\n#####################\r\n\r\n\r\n# v2\r\n# -DEXTRA_TITLE\r\n# -pragma-define:REGISTER_SP=49151\r\nzx81_no_gfx_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(Z88DK_OPTS) \\\r\n\t$(INCLUDE_OPTS)   \\\r\n\t-pragma-define:ZX_CHAR_XLATE_MODE=1   \\\r\n\t--opt-code-size -D_XL_SLOW_DOWN_FACTOR=0 \\\r\n\t-vn $(ZX81_NO_GFX_GAME_OPTS) -D__NO_INIT_GRAPHICS \\\r\n\t-D__ZX81__ -D_XL_NO_JOYSTICK  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n\r\n\r\n\r\n#############################\r\n# SC3000\r\n\r\n# sc3000: sc3000_32k\r\n\r\n# sc3000_32k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_OPTS) -DEXTRA_TITLE \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -D__SC3000__ \\\r\n\t# -pragma-define:REGISTER_SP=0xFFFF \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \\\r\n\t# -D__BIT_BANG_SOUND \\\r\n\t  # \\\r\n\t# -DZ88DK_JOYSTICK \\\r\n\t# -D__CONIO_GRAPHICS \\\r\n\t# -vn -lndos -create-app -Cz--audio \\\r\n\t# -pragma-define:CRT_ORG_BSS=0x8000 \\\r\n\t # \\\r\n\t# -clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t# $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.prg \\\r\n\t# $(FULL_FILES)\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.prg\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.tap\r\n\r\n\r\n\r\n\r\n# phc25_no_gfx:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +phc25 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t# -D__PHC25__  -pragma-define:CLIB_DISABLE_MODE1=1 -pragma-define:CLIB_DISABLE_MODE2=1 -D__PSG_SOUND \\\r\n\t# -DXSize=32 \\\r\n\t# -DYSize=16 \\\r\n\t# -D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS  -D_XL_NO_COLOR -D_XL_NO_UDG  $(PHC25_NO_GFX_GAME_OPTS) \\\r\n\t# -D_XL_NO_JOYSTICK -D__NO_INIT_GRAPHICS \\\r\n\t# $(FULL_FILES) \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t# $(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t# -o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app \r\n\r\n"
  },
  {
    "path": "src/games/shoot/memory/c16_memory.s",
    "content": "; TAPBUF    $0333-03F2       819-1010   Cassette tape buffer\n; WRLEN     $03F3-03F4      1011-1012   Length of data to be written to tape\n; RDCNT     $03F5-03F6      1013-1014   Length of data to be read from tape\n; INPQUE    $03F7-0436      1015-1078   RS-232 input queue\n; ESTARL    $0437-0454      1079-1108\n; ESTAKH    $0455-0472      1109-1138\n\n.export _ghosts;\n_ghosts = $333\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _skull;\n_skull = _level + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _powerUp2;\n_powerUp2 = _powerUp + $A\n\n.export _gun;\n_gun = _powerUp2 + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _rockets;\n_rockets = _extraPoints + $A\n\n.export _freeze;\n_freeze = _rockets + $14\n\n.export _invincibility;\n_invincibility = _freeze + $A\n\n.export _extraLife;\n_extraLife = _invincibility + $A\n\n.export _super;\n_super = _extraLife + $A\n\n.export _confuse;\n_confuse = _super + $A\n\n.export _zombie;\n_zombie = _confuse + $A\n\n.export _chase;\n_chase = _zombie + $A\n\n.export _ghostCount;\n_ghostCount = _chase + $A\n\n.export _ghostLevel;\n_ghostLevel = _ghostCount + $1\n\n.export _leftHorizontalMissile;\n_leftHorizontalMissile = _ghostLevel + $2\n\n.export _rightHorizontalMissile;\n_rightHorizontalMissile = _leftHorizontalMissile + $5\n\n.export _chasingBullet;\n_chasingBullet = _rightHorizontalMissile + $5\n\n.export _invincibility_count_down;\n_invincibility_count_down = _chasingBullet + $5\n\n.export _confuse_count_down;\n_confuse_count_down = _invincibility_count_down + $2\n\n.export _zombie_count_down;\n_zombie_count_down = _confuse_count_down + $2\n\t\n.export _strategyArray;\n_strategyArray = _zombie_count_down + $2\n\n\n; 241\n\n.export _freeze_count_down;\n_freeze_count_down = _strategyArray + $8\n\n.export _skullSlowDown;\n_skullSlowDown = _freeze_count_down + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _skullSlowDown + $2\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _bulletDirection;\n_bulletDirection = _skullYCountDown + $1\n\n\n.export _chasedEnemyPtr;\n_chasedEnemyPtr = _bulletDirection + $1\n\n.export _chasedByGhosts;\n_chasedByGhosts = _chasedEnemyPtr + $2\n\n.export _rockets_x;\n_rockets_x = _chasedByGhosts + $2\n\n\n.export _extraLife_present_on_level;\n_extraLife_present_on_level = _rockets_x + $4\n\n.export _super_present_on_level;\n_super_present_on_level = _extraLife_present_on_level + $1\n\n.export _zombie_present_on_level;\n_zombie_present_on_level = _super_present_on_level + $1\n\n.export _bases;\n_bases = _zombie_present_on_level + $1\n\n.export _arrowRange;\n_arrowRange = _bases + $1\n\n.export _all_skulls_killed_in_completed_levels;\n_all_skulls_killed_in_completed_levels = _arrowRange + $1\n\n.export _bases_in_completed_levels;\n_bases_in_completed_levels = _all_skulls_killed_in_completed_levels + $1\n\n.export _horizWallsLength;\n_horizWallsLength = _bases_in_completed_levels + $1\n\n.export _invincibilityActive;\n_invincibilityActive = _horizWallsLength + $1\n\n.export _confuseActive;\n_confuseActive = _invincibilityActive + $1\n\n.export _zombieActive;\n_zombieActive = _confuseActive + $1\n\n.export _verticalWallY;\n_verticalWallY = _zombieActive + $1\n\n.export _verticalWallLength;\n_verticalWallLength = _verticalWallY + $1\n\n.export _playerDirection;\n_playerDirection = _verticalWallLength + $1\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullActive;\n_skullActive = _guns + $1\n\n.export _loop;\n_loop = $200\n\n.export _playerBlink;\n_playerBlink = _loop + $2\n\n.export _arrowYPosition;\n_arrowYPosition = _playerBlink + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _arrowYPosition + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $2\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _ind;\n_ind = _BOMB_IMAGE + $2\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + 1\n\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $2\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _BROKEN_BRICK_IMAGE;\n_BROKEN_BRICK_IMAGE = _ZOMBIE_IMAGE + $2\n\n\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t"
  },
  {
    "path": "src/games/shoot/memory/creativision_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $100\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _ghostCount + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _BOMB_IMAGE + $2\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _ind;\n_ind = _PLAYER_RIGHT_IMAGE + $2\n\n"
  },
  {
    "path": "src/games/shoot/memory/creativision_memory_light.s",
    "content": "\n.export _ghosts;\n_ghosts = $100\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _ghostCount + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _BOMB_IMAGE + $2\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _ind;\n_ind = _PLAYER_RIGHT_IMAGE + $2\n\n; LIGHT\n\n.export _skullSlowDown;\n_skullSlowDown = _ind + $1\n\n.export _skullXCountDown;\n_skullXCountDown = _skullSlowDown + $2\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _bulletDirection;\n_bulletDirection = _skullYCountDown + $1\n\n.export _freeze_count_down;\n_freeze_count_down = _bulletDirection + $4\n\n.export _playerDirection;\n_playerDirection = _freeze_count_down + $1\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullActive;\n_skullActive = _guns + $1\n\n.export _loop;\n_loop = _skullActive + $1"
  },
  {
    "path": "src/games/shoot/memory/creativision_memory_tiny.s",
    "content": "\n.export _ghosts;\n_ghosts = $100\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _ghostCount + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _BOMB_IMAGE + $2\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _ind;\n_ind = _PLAYER_RIGHT_IMAGE + $2\n\n"
  },
  {
    "path": "src/games/shoot/memory/gal_memory.asm",
    "content": "PUBLIC _ghosts, _bombs, _player, _ghostSlowDown, _points, _highScore, _lives, _level, _ghostCount, _GHOST_IMAGE, _BOMB_IMAGE, _ind\n\ndefc _ghosts = 0x2A00\n\ndefc _bombs = _ghosts + $28 \n\ndefc _player = _bombs + $14\n\ndefc _ghostSlowDown = _player + $5\n\ndefc _points = _ghostSlowDown + $2\n\ndefc _highScore = _points + $2\n\ndefc _lives = _highScore + $2\n\ndefc _level = _lives + $1\n\ndefc _ghostCount = _level + $1\n\ndefc _GHOST_IMAGE = _ghostCount + $1\n\ndefc _BOMB_IMAGE = _GHOST_IMAGE + $1\n\ndefc _ind = _BOMB_IMAGE + $1\n\n"
  },
  {
    "path": "src/games/shoot/memory/gamate_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $100\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _points;\n_points = _player + $5\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _ghostCount + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $1\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $1\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $1\n\n.export _ind;\n_ind = _BOMB_IMAGE + $1\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + 1\n\t\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $4\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _freeze_count_down;\n_freeze_count_down = _ZOMBIE_IMAGE + $8\n\n.export _loop;\n_loop = $100\n\n.export _bulletDirection;\n_bulletDirection = _loop + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _bulletDirection + $1\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _ghostSlowDown;\n_ghostSlowDown = _skullYCountDown + $1\n\n.export _skullActive;\n_skullActive = _ghostSlowDown + $2\n\n.export _skull;\n_skull = _skullActive + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _gun;\n_gun = _powerUp + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _playerDirection;\n_playerDirection = _extraPoints + $A\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullSlowDown;\n_skullSlowDown = _guns + $2\n"
  },
  {
    "path": "src/games/shoot/memory/oric1_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $400\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _skull;\n_skull = _level + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _powerUp2;\n_powerUp2 = _powerUp + $A\n\n.export _gun;\n_gun = _powerUp2 + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _rockets;\n_rockets = _extraPoints + $A\n\n.export _freeze;\n_freeze = _rockets + $14\n\n.export _invincibility;\n_invincibility = _freeze + $A\n\n.export _extraLife;\n_extraLife = _invincibility + $A\n\n.export _super;\n_super = _extraLife + $A\n\n.export _confuse;\n_confuse = _super + $A\n\n.export _zombie;\n_zombie = _confuse + $A\n\n.export _chase;\n_chase = _zombie + $A\n\n.export _ghostCount;\n_ghostCount = _chase + $A\n\n.export _ghostLevel;\n_ghostLevel = _ghostCount + $1\n\n.export _leftHorizontalMissile;\n_leftHorizontalMissile = _ghostLevel + $2\n\n.export _rightHorizontalMissile;\n_rightHorizontalMissile = _leftHorizontalMissile + $5\n\n.export _chasingBullet;\n_chasingBullet = _rightHorizontalMissile + $5\n\n.export _invincibility_count_down;\n_invincibility_count_down = _chasingBullet + $5\n\n.export _confuse_count_down;\n_confuse_count_down = _invincibility_count_down + $2\n\n.export _zombie_count_down;\n_zombie_count_down = _confuse_count_down + $2\n\t\n.export _strategyArray;\n_strategyArray = _zombie_count_down + $2\n\n.export _freeze_count_down;\n;_freeze_count_down = _strategyArray + $8\n_freeze_count_down = $B800\n\n.export _skullSlowDown;\n_skullSlowDown = _freeze_count_down + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _skullSlowDown + $2\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _bulletDirection;\n_bulletDirection = _skullYCountDown + $1\n\n\n.export _chasedEnemyPtr;\n_chasedEnemyPtr = _bulletDirection + $1\n\n.export _chasedByGhosts;\n_chasedByGhosts = _chasedEnemyPtr + $2\n\n.export _rockets_x;\n_rockets_x = _chasedByGhosts + $2\n\n\n.export _extraLife_present_on_level;\n_extraLife_present_on_level = _rockets_x + $4\n\n.export _super_present_on_level;\n_super_present_on_level = _extraLife_present_on_level + $1\n\n.export _zombie_present_on_level;\n_zombie_present_on_level = _super_present_on_level + $1\n\n.export _bases;\n_bases = _zombie_present_on_level + $1\n\n.export _arrowRange;\n_arrowRange = _bases + $1\n\n.export _all_skulls_killed_in_completed_levels;\n_all_skulls_killed_in_completed_levels = _arrowRange + $1\n\n.export _bases_in_completed_levels;\n_bases_in_completed_levels = _all_skulls_killed_in_completed_levels + $1\n\n.export _horizWallsLength;\n_horizWallsLength = _bases_in_completed_levels + $1\n\n.export _invincibilityActive;\n_invincibilityActive = _horizWallsLength + $1\n\n.export _confuseActive;\n_confuseActive = _invincibilityActive + $1\n\n.export _zombieActive;\n_zombieActive = _confuseActive + $1\n\n.export _verticalWallY;\n_verticalWallY = _zombieActive + $1\n\n.export _verticalWallLength;\n_verticalWallLength = _verticalWallY + $1\n\n.export _playerDirection;\n_playerDirection = _verticalWallLength + $1\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullActive;\n_skullActive = _guns + $1\n\n.export _loop;\n_loop = _skullActive + $1\n\n.export _playerBlink;\n_playerBlink = _loop + $2\n\n.export _arrowYPosition;\n_arrowYPosition = _playerBlink + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _arrowYPosition + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $2\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _ind;\n_ind = _BOMB_IMAGE + $2\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + $1\n\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n;_SKULL_IMAGE = _GUN_IMAGE + $2\n_SKULL_IMAGE = $BFE0\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $2\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _BROKEN_BRICK_IMAGE;\n_BROKEN_BRICK_IMAGE = _ZOMBIE_IMAGE + $2\n\n\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t"
  },
  {
    "path": "src/games/shoot/memory/pet_memory.s",
    "content": "\n.export _ghosts;\n_ghosts = $33A\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _points;\n_points = _player + $5\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _ghostCount;\n_ghostCount = _level + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _ghostCount + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $1\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $1\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $1\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $1\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $1\n\n.export _ind;\n_ind = _BOMB_IMAGE + $1\n\n.export _POWERUP_IMAGE;\n_POWERUP_IMAGE = _ind + 1\n\t\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _POWERUP_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $4\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _freeze_count_down;\n_freeze_count_down = _ZOMBIE_IMAGE + $8\n\n.export _loop;\n_loop = $100\n\n.export _bulletDirection;\n_bulletDirection = _loop + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _bulletDirection + $1\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _ghostSlowDown;\n_ghostSlowDown = _skullYCountDown + $1\n\n.export _skullActive;\n_skullActive = _ghostSlowDown + $2\n\n.export _skull;\n_skull = _skullActive + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _gun;\n_gun = _powerUp + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _playerDirection;\n_playerDirection = _extraPoints + $A\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullSlowDown;\n_skullSlowDown = _guns + $2\n"
  },
  {
    "path": "src/games/shoot/memory/vic20_memory.s",
    "content": "; $334-$3FF  (820-1023)\n;0334-033B    820-827       ??\n;*033C-03FB   828-1019      Cassette buffer\n.export _ghosts;\n_ghosts = $334\n\n.export _bombs;\n_bombs = _ghosts + $28 \n\n.export _player;\n_player = _bombs + $14\n\n.export _ghostSlowDown;\n_ghostSlowDown = _player + $5\n\n.export _points;\n_points = _ghostSlowDown + $2\n\n.export _highScore;\n_highScore = _points + $2\n\n.export _lives;\n_lives = _highScore + $2\n\n.export _level;\n_level = _lives + $1\n\n.export _skull;\n_skull = _level + $1\n\n.export _bullet;\n_bullet = _skull + $5\n\n.export _powerUp;\n_powerUp = _bullet + $5\n\n.export _powerUp2;\n_powerUp2 = _powerUp + $A\n\n.export _gun;\n_gun = _powerUp2 + $A\n\n.export _extraPoints;\n_extraPoints = _gun + $A\n\n.export _rockets;\n_rockets = _extraPoints + $A\n\n.export _freeze;\n_freeze = _rockets + $14\n\n.export _invincibility;\n_invincibility = _freeze + $A\n\n.export _extraLife;\n_extraLife = _invincibility + $A\n\n.export _super;\n_super = _extraLife + $A\n\n.export _confuse;\n_confuse = _super + $A\n\n\n.export _zombie;\n;_zombie = _confuse + $A\n; $200 - $276 (512-630)\n;*0200-0258  512-600  Basic input buffer\n;*0259-0262  601-610  Logical file table\n;*0263-026C  611-620  Device # table\n;*026D-0276  621-630  Secondary Address table\n_zombie = $200\n\n\n.export _chase;\n_chase = _zombie + $A\n\n.export _ghostCount;\n_ghostCount = _chase + $A\n\n.export _ghostLevel;\n_ghostLevel = _ghostCount + $1\n\n.export _leftHorizontalMissile;\n_leftHorizontalMissile = _ghostLevel + $2;\n\n.export _rightHorizontalMissile;\n_rightHorizontalMissile = _leftHorizontalMissile + $5;\n\n.export _chasingBullet;\n_chasingBullet = _rightHorizontalMissile + $5;\n\n.export _invincibility_count_down;\n_invincibility_count_down = _chasingBullet + $5\n\n.export _confuse_count_down;\n_confuse_count_down = _invincibility_count_down + $2\n\n.export _zombie_count_down;\n_zombie_count_down = _confuse_count_down + $2\n\n.export _strategyArray;\n_strategyArray = _zombie_count_down + $2\n\n.export _freeze_count_down;\n_freeze_count_down = _strategyArray + $8\n\n.export _skullSlowDown;\n_skullSlowDown = _freeze_count_down + $2\n\n.export _skullXCountDown;\n_skullXCountDown = _skullSlowDown + $2\n\n.export _skullYCountDown;\n_skullYCountDown = _skullXCountDown + $1\n\n.export _bulletDirection;\n_bulletDirection = _skullYCountDown + $1\n\n.export _chasedEnemyPtr;\n_chasedEnemyPtr = _bulletDirection + $1\n\n.export _chasedByGhosts;\n_chasedByGhosts = _chasedEnemyPtr + $2\n\n.export _rockets_x;\n_rockets_x = _chasedByGhosts + $2\n\n.export _extraLife_present_on_level;\n_extraLife_present_on_level = _rockets_x + $6\n\n.export _super_present_on_level;\n_super_present_on_level = _extraLife_present_on_level + $1\n\n.export _zombie_present_on_level;\n_zombie_present_on_level = _super_present_on_level + $1\n\n.export _bases;\n_bases = _zombie_present_on_level + $1\n\n.export _arrowRange;\n_arrowRange = _bases + $1\n\n.export _all_skulls_killed_in_completed_levels;\n_all_skulls_killed_in_completed_levels = _arrowRange + $1\n\n.export _bases_in_completed_levels;\n_bases_in_completed_levels = _all_skulls_killed_in_completed_levels + $1\n\n.export _horizWallsLength;\n_horizWallsLength = _bases_in_completed_levels + $1\n\n.export _invincibilityActive;\n_invincibilityActive = _horizWallsLength + $1\n\n.export _confuseActive;\n_confuseActive = _invincibilityActive + $1\n\n.export _zombieActive;\n_zombieActive = _confuseActive + $1\n\n.export _verticalWallY;\n_verticalWallY = _zombieActive + $1\n\n.export _verticalWallLength;\n_verticalWallLength = _verticalWallY + $1\n\n.export _playerDirection;\n_playerDirection = _verticalWallLength + $1\n\n.export _freezeActive;\n_freezeActive = _playerDirection + $1\n\n.export _extraLifeThroughPointsCounter;\n_extraLifeThroughPointsCounter = _freezeActive + $1\n\n.export _playerFire;\n_playerFire = _extraLifeThroughPointsCounter + $1\n\n.export _guns;\n_guns = _playerFire + $1\n\n.export _skullActive;\n_skullActive = _guns + $1\n\n.export _loop;\n_loop = _skullActive + $1\n\n.export _playerBlink;\n_playerBlink = _loop + $2\n\n.export _arrowYPosition;\n_arrowYPosition = _playerBlink + $1\n\n.export _PLAYER_DOWN_IMAGE;\n_PLAYER_DOWN_IMAGE = _arrowYPosition + $1\n\n.export _PLAYER_UP_IMAGE;\n_PLAYER_UP_IMAGE = _PLAYER_DOWN_IMAGE + $2\n\n.export _PLAYER_LEFT_IMAGE;\n_PLAYER_LEFT_IMAGE = _PLAYER_UP_IMAGE + $2\n\n.export _PLAYER_RIGHT_IMAGE;\n_PLAYER_RIGHT_IMAGE = _PLAYER_LEFT_IMAGE + $2\n\n.export _GHOST_IMAGE;\n_GHOST_IMAGE = _PLAYER_RIGHT_IMAGE + $2\n\n.export _BOMB_IMAGE;\n_BOMB_IMAGE = _GHOST_IMAGE + $2\n\n.export _ind;\n_ind = _BOMB_IMAGE + $2\n\n.export _CALM_DOWN_IMAGE;\n_CALM_DOWN_IMAGE = _ind + 1\n\n.export _BULLET_IMAGE;\n_BULLET_IMAGE = _CALM_DOWN_IMAGE + $2\n\n.export _GUN_IMAGE;\n_GUN_IMAGE = _BULLET_IMAGE + $2\n\n.export _SKULL_IMAGE;\n_SKULL_IMAGE = _GUN_IMAGE + $2\n\n.export _EXTRA_POINTS_IMAGE;\n_EXTRA_POINTS_IMAGE = _SKULL_IMAGE + $2\n\n.export _HORIZONTAL_BRICK_IMAGE;\n_HORIZONTAL_BRICK_IMAGE = _EXTRA_POINTS_IMAGE + $2\n\n.export _VERTICAL_BRICK_IMAGE;\n_VERTICAL_BRICK_IMAGE = _HORIZONTAL_BRICK_IMAGE + $2\n\n.export _LEFT_HORIZONTAL_MISSILE_IMAGE;\n_LEFT_HORIZONTAL_MISSILE_IMAGE = _VERTICAL_BRICK_IMAGE + $2\n\n\n; This is the hardware stack. Is it safe?\n; $100-$113 (256-275)\n; broken by keyboard if in $200 area?\n.export _RIGHT_HORIZONTAL_MISSILE_IMAGE;\n;_RIGHT_HORIZONTAL_MISSILE_IMAGE = _LEFT_HORIZONTAL_MISSILE_IMAGE + $2\n_RIGHT_HORIZONTAL_MISSILE_IMAGE = $100\n\n; broken by keyboard?\n.export _ROCKET_IMAGE;\n_ROCKET_IMAGE = _RIGHT_HORIZONTAL_MISSILE_IMAGE + $2\n\n.export _FREEZE_IMAGE;\n_FREEZE_IMAGE = _ROCKET_IMAGE + $2\n\n.export _EXTRA_LIFE_IMAGE;\n_EXTRA_LIFE_IMAGE = _FREEZE_IMAGE + $2\n\n.export _INVINCIBILITY_IMAGE;\n_INVINCIBILITY_IMAGE = _EXTRA_LIFE_IMAGE + $2\n\n.export _CHASE_IMAGE;\n_CHASE_IMAGE = _INVINCIBILITY_IMAGE + $2\n\n.export _SUPER_IMAGE;\n_SUPER_IMAGE = _CHASE_IMAGE + $2\n\n.export _CONFUSE_IMAGE;\n_CONFUSE_IMAGE = _SUPER_IMAGE + $2\n\n.export _ZOMBIE_IMAGE;\n_ZOMBIE_IMAGE = _CONFUSE_IMAGE + $2\n\n.export _BROKEN_BRICK_IMAGE;\n_BROKEN_BRICK_IMAGE = _ZOMBIE_IMAGE + $2\n\n"
  },
  {
    "path": "src/games/shoot/move_player.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _MOVE_PLAYER\r\n#define _MOVE_PLAYER\r\n\r\n    void MOVE_PLAYER(void);\r\n    \r\n#endif // _MOVE_PLAYER\r\n\r\n"
  },
  {
    "path": "src/games/shoot/rocket.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef ROCKETS_HEADER\r\n#define ROCKETS_HEADER\r\n\r\n    #if !defined(NO_ROCKETS)\r\n        void handle_rockets(void);\r\n    #else\r\n        #define handle_rockets()\r\n    #endif\r\n\r\n#endif // ROCKETS_HEADER\r\n"
  },
  {
    "path": "src/games/shoot/settings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n\n#ifndef _SETTINGS\n#define _SETTINGS\n\n#if defined(_XL_TURN_BASED)\n\t#if !defined(NO_BLINKING)\n\t\t#define NO_BLINKING\n\t#endif\n#endif\n\n#if !defined(NO_PLAYER_ANIMATION)\n    #define ANIMATE_PLAYER\n#endif\n\n#if !defined(_XL_NO_UDG) && !defined(NO_TRANSICTION_ANIMATION)\n    #define TRANSITION_ANIMATION 1\n#endif\n\n#include \"cross_lib.h\"\n\nstruct ImageStruct\n{\n    uint8_t _imageData;\n    #if !defined(_XL_NO_COLOR)\n        uint8_t _color;\n    #endif\n};\n\ntypedef struct ImageStruct Image;\n\n\n#if !defined(NO_BLINKING)\n    void _blink_draw(uint8_t x,uint8_t y,Image * image, uint8_t * blinkCounter);\n#else\n    #define _blink_draw(x,y,image,blinkCounter) _draw(x,y,image)\n#endif\n\n\n#include \"game_settings.h\"\n\n#endif // _SETTINGS\n"
  },
  {
    "path": "src/games/shoot/shapes/6x8/shape19.txt",
    "content": "......\r\n......\r\n......\r\n..##..\r\n.#..#.\r\n..##..\r\n##..##\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/6x8/shape20.txt",
    "content": "#.##.#\r\n..##..\r\n.#..#.\r\n##..##\r\n......\r\n......\r\n......\r\n......"
  },
  {
    "path": "src/games/shoot/shapes/6x8/shape21.txt",
    "content": "......\r\n......\r\n......\r\n......\r\n..##..\r\n.####.\r\n..##..\r\n##..##\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/6x8/shape22.txt",
    "content": ".....#\r\n....##\r\n.....#\r\n...###\r\n.....#\r\n.....#\r\n....#.\r\n....#.\r\n"
  },
  {
    "path": "src/games/shoot/shapes/6x8/shape23.txt",
    "content": "#.....\r\n##....\r\n#.....\r\n###...\r\n#.....\r\n#.....\r\n.#....\r\n.#....\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/6x8/shape24.txt",
    "content": "#.##.#\r\n.#..#.\r\n##..##\r\n#.##.#\r\n#.##.#\r\n##..##\r\n.#..#.\r\n#.##.#\r\n"
  },
  {
    "path": "src/games/shoot/shapes/6x8/shape26.txt",
    "content": "..##..\r\n.####.\r\n#.##.#\r\n#.##.#\r\n.####.\r\n..##..\r\n.####.\r\n##..##\r\n"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape0.txt",
    "content": "..###..\r\n..#.#..\r\n...#...\r\n.#####.\r\n#.#.#.#\r\n...#...\r\n..#.#..\r\n..#.#.."
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape1.txt",
    "content": "..###..\r\n..###..\r\n...#...\r\n.#####.\r\n#.#.#.#\r\n...#...\r\n..#.#..\r\n..#.#..\r\n"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape10.txt",
    "content": "..###..\r\n..#.#..\r\n.......\r\n.#####.\r\n.......\r\n...#...\r\n.......\r\n..#.#..\r\n"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape19.txt",
    "content": ".......\r\n.......\r\n.......\r\n.......\r\n..###..\r\n..#.#..\r\n...#...\r\n.#####.\r\n"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape2.txt",
    "content": "..###..\r\n..##...\r\n...#..#\r\n.#####.\r\n#.#.#..\r\n.. #...\r\n..#.#..\r\n..#..#.\r\n"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape20.txt",
    "content": "#.#.#.#\r\n...#...\r\n..#.#..\r\n..#.#..\r\n.......\r\n.......\r\n.......\r\n......."
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape21.txt",
    "content": ".......\r\n.......\r\n.......\r\n.......\r\n..###..\r\n..###..\r\n...#...\r\n.#####."
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape22.txt",
    "content": "......#\r\n......#\r\n.......\r\n....###\r\n......#\r\n....... \r\n......#\r\n......#"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape23.txt",
    "content": "##.....\r\n##.....\r\n#......\r\n####...\r\n.#.....\r\n#......\r\n.#.....\r\n.#....."
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape24.txt",
    "content": "#.###.#\r\n.#...#.\r\n#.#.#.#\r\n#.###.#\r\n#.###.#\r\n#.#.#.#\r\n.#...#.\r\n#.###.#\r\n"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape26.txt",
    "content": "..###..\r\n.#####.\r\n#..#..#\r\n#..#..#\r\n.#####.\r\n..#.#..\r\n.#####.\r\n##.#.##\r\n"
  },
  {
    "path": "src/games/shoot/shapes/7x8/shape3.txt",
    "content": "..###..\r\n...##..\r\n#..#...\r\n.#####.\r\n..#.#.#\r\n.. #...\r\n..#.#..\r\n.#..#..\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape14.txt",
    "content": "........\r\n###.....\r\n.#######\r\n.#######\r\n###.....\r\n........"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape15.txt",
    "content": "........\r\n.....###\r\n#######.\r\n#######.\r\n.....###\r\n........"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape19.txt",
    "content": "........\r\n........\r\n........\r\n...##...\r\n...##...\r\n.##..##.\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape20.txt",
    "content": "#.####.#\r\n..#..#..\r\n..#..#..\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape21.txt",
    "content": "........\r\n........\r\n........\r\n...##...\r\n...##...\r\n.######.\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape22.txt",
    "content": ".......#\r\n.......#\r\n....###.\r\n......##\r\n......#.\r\n......#.\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape23.txt",
    "content": "#.......\r\n#..,....\r\n.###....\r\n##......\r\n.#......\r\n.#......\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape24.txt",
    "content": "#.####.#\r\n.##..##.\r\n#..##..#\r\n#..##..#\r\n.##..##.\r\n#.####.#\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape26.txt",
    "content": ".######.\r\n#..##..#\r\n#..##..#\r\n.######.\r\n..#..#..\r\n##.##.##"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape4.txt",
    "content": ".######.\r\n########\r\n#..##..#\r\n.######.\r\n..####..\r\n##.##.##\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape6.txt",
    "content": "#.####.#\r\n########\r\n#..##..#\r\n.######.\r\n..####..\r\n##.##.##\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x6/shape9.txt",
    "content": "#......#\r\n.#.##.#.\r\n..##.#..\r\n..#.##..\r\n.#.##.#.\r\n#......#\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x8/shape19.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n...##...\r\n..#..#..\r\n...##...\r\n.##..##.\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x8/shape20.txt",
    "content": "#..##..#\r\n...##...\r\n..#..#..\r\n.##..##.\r\n........\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x8/shape21.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n...##...\r\n..####..\r\n...##...\r\n.##..##."
  },
  {
    "path": "src/games/shoot/shapes/8x8/shape22.txt",
    "content": ".......#\r\n......##\r\n.......#\r\n....####\r\n.......#\r\n.......#\r\n......#.\r\n......#.\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x8/shape23.txt",
    "content": "#.......\r\n##......\r\n#.......\r\n####....\r\n#.......\r\n#.......\r\n.#......\r\n.#......\r\n\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x8/shape26.txt",
    "content": "..####..\r\n.######.\r\n#..##..#\r\n#..##..#\r\n.######.\r\n..#..#..\r\n.######.\r\n##.##.##\r\n"
  },
  {
    "path": "src/games/shoot/shapes/8x8/shape6.txt",
    "content": "#.####.#\r\n.######.\r\n#..##..#\r\n##.##.##\r\n.######.\r\n..####..\r\n.######.\r\n##.##.##\r\n"
  },
  {
    "path": "src/games/shoot/skull.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#ifndef SKULL\r\n#define SKULL\r\n\r\n#include \"character.h\"\r\n\r\nvoid handle_skull(Character *skullPtr, uint8_t strategy);\r\n\r\nvoid handle_skulls(void);\r\n\r\nuint16_t computeSkullSlowDown(void);\r\n\r\nvoid computeSkullParameters(void);\r\n\r\nvoid checkBombsVsSkull(register Character * skullPtr);\r\n\r\nvoid checkBombsVsSkulls(void);\r\n\r\nvoid displaySkulls(void);\r\n\r\nvoid skullDies(register Character * skullPtr);\r\n\r\n#endif // SKULL\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shoot/sleep.h",
    "content": "#ifndef _SLEEP_H\r\n#define _SLEEP_H\r\n\r\n#include \"standard_libs.h\"\r\n\r\n#if XSize>=32\r\n\r\n    // SLOWER SECRETS FOUND DISPLAY\r\n    #define DISPLAY_SPEED_FACTOR 2\r\n    \r\n    // SLOWER BONUS DISPLAY\r\n    #define DISPLAY_SPEED_RIGHT_SHIFT 5\r\n#else\r\n    #define DISPLAY_SPEED_FACTOR 1\r\n\r\n    #define DISPLAY_SPEED_RIGHT_SHIFT 6\r\n#endif\r\n\r\n\r\n// #if defined(_XL_SLOW_DOWN_FACTOR) && _XL_SLOW_DOWN_FACTOR>0\r\n    void SHORT_SLEEP(uint8_t t);\r\n// #else\r\n    // #define SHORT_SLEEP(t)\r\n// #endif\r\n\r\n#endif // _SLEEP_H\r\n\r\n"
  },
  {
    "path": "src/games/shoot/speed_game_settings.h",
    "content": "#ifndef _SPEED_TARGET_SETTINGS\r\n#define _SPEED_TARGET_SETTINGS\r\n\r\n#if defined(_XL_TURN_BASED) || !defined(BOMB_DRAW_SKIP)\r\n    #define SKIP_BOMB_DRAW \r\n#else\r\n    #define SKIP_BOMB_DRAW if((loop&(BOMB_DRAW_SKIP))==1)\r\n#endif\r\n\r\n#if defined(_XL_TURN_BASED) || !defined(WALL_DRAW_SKIP)\r\n    #define SKIP_WALL_DRAW \r\n#else\r\n    #define SKIP_WALL_DRAW if((loop&(WALL_DRAW_SKIP))==1)\r\n#endif\r\n\r\n\t\r\n#define ADVANCED_LEFT_MISSILE()  ++leftHorizontalMissile._x\r\n#define ADVANCED_RIGHT_MISSILE() --rightHorizontalMissile._x\t\r\n\r\n\r\n#endif // _SPEED_TARGET_SETTINGS\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/bullet.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#include \"settings.h\"\r\n \r\n#include \"bullet.h\"\r\n#include \"level.h\"\r\n#include \"game_text.h\"\r\n#include \"character.h\"\r\n#include \"item.h\"\r\n#include \"ghost.h\"\r\n#include \"strategy.h\"\r\n#include \"skull.h\"\r\n#include \"init_images.h\"\r\n\r\nextern uint8_t bombCount;\r\nextern Character bombs[BOMBS_NUMBER];\r\n\r\nextern uint8_t skullsCount;\r\n\r\nextern uint8_t bulletStrength;\r\n\r\nextern uint16_t points;\r\n\r\nextern uint16_t loop;\r\n\r\nextern uint8_t isOneMissileLevel;\r\nextern uint8_t isMissileLevel;\r\nextern uint8_t isBossLevel;\r\n// extern uint8_t isRocketLevel;\r\n\r\nextern Character ghosts[GHOSTS_NUMBER];\r\n\r\nextern Image DEAD_GHOST_IMAGE;\r\nextern Image VERTICAL_BRICK_IMAGE;\r\nextern Image HORIZONTAL_BRICK_IMAGE;\r\n\r\nextern uint8_t level;\r\n\r\nextern Item extraPoints;\r\n\r\nextern Character skulls[SKULLS_NUMBER];\r\nextern uint8_t skullActive;\r\nextern uint8_t playerFire;\r\nextern uint8_t guns;\r\nextern uint8_t playerDirection;\r\nextern uint8_t bulletDirection[BULLETS_NUMBER];\r\n\r\nextern Character bullets[BULLETS_NUMBER];\r\nextern Character player;\r\n\r\nextern uint8_t maxGhostsOnScreen;\r\n\r\nextern uint8_t rocketsOnScreen;\r\n\r\nextern Item freeze;\r\nextern Item extraLife;\r\nextern Item invincibility;\r\n    \r\nextern Character leftHorizontalMissile;\r\nextern Character rightHorizontalMissile;\r\nextern uint8_t rockets_x[MAX_ROCKETS_NUMBER];\r\nextern Character rockets[MAX_ROCKETS_NUMBER];\r\nextern uint8_t destroyed_bases;\r\nextern uint8_t destroyed_bases_in_completed_levels;\r\nextern uint8_t destroyerActive;\r\n\r\nuint8_t availableBullet(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<BULLETS_NUMBER;++i)\r\n    {\r\n        if(!bullets[i]._status)\r\n        {\r\n            return i;\r\n        }\r\n    }\r\n    return BULLETS_NUMBER;\r\n}\r\n\r\n\r\nuint8_t not_stacked(uint8_t candidate_x, uint8_t candidate_y)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<BOMBS_NUMBER;++i)\r\n    {\r\n        if((candidate_x==bombs[i]._x)&&(candidate_y==bombs[i]._y)&&bombs[i]._status)\r\n        {\r\n            return 0;\r\n        }\r\n    }\r\n    return 1;\r\n}\r\n\r\n\r\nvoid handle_bomb(void)\r\n{\r\n    uint8_t candidate_bomb_x;\r\n    uint8_t candidate_bomb_y;\r\n\r\n    // Check if player has fired the gun\r\n    if(playerFire && bombCount<BOMBS_NUMBER)\r\n    {\r\n        \r\n        // deleteCharacter(&bombs[bombCount]);\r\n\r\n        if(playerDirection==RIGHT)\r\n        {\r\n            candidate_bomb_x = player._x+1; \r\n        }\r\n        else if(playerDirection==LEFT)\r\n        {\r\n            candidate_bomb_x = player._x-1;             \r\n        }\r\n        else\r\n        {\r\n            candidate_bomb_x = player._x;            \r\n        }\r\n        \r\n        if(playerDirection==UP)\r\n        {\r\n            candidate_bomb_y = player._y-1;        \r\n        }\r\n        else if(playerDirection==DOWN)\r\n        {\r\n            candidate_bomb_y = player._y+1;        \r\n        }\r\n        else\r\n        {\r\n            candidate_bomb_y = player._y;        \r\n        }\r\n        \r\n        if(not_stacked(candidate_bomb_x,candidate_bomb_y) && !onWall(candidate_bomb_x,candidate_bomb_y))\r\n        {\r\n            _XL_SHOOT_SOUND();\r\n\r\n            bombs[bombCount]._x = candidate_bomb_x;\r\n            bombs[bombCount]._y = candidate_bomb_y;\r\n            bombs[bombCount]._status=1;\r\n            displayBomb(&bombs[bombCount]);\r\n\r\n            ++bombCount;\r\n            printGunsStats();\r\n        }\r\n        else\r\n        {\r\n            _XL_TICK_SOUND();\r\n        }\r\n        playerFire = 0;\r\n    }\r\n}        \r\n\r\n\r\nvoid handle_bullet_fire(uint8_t bulletIndex)\r\n{\r\n    // Check if player has fired the gun\r\n    if(playerFire && bullets[bulletIndex]._status==0 && guns>0 && bombCount==BOMBS_NUMBER)\r\n    {\r\n        _XL_SHOOT_SOUND();\r\n        --guns;\r\n        printGunsStats();\r\n        bulletDirection[bulletIndex] = playerDirection;\r\n        bullets[bulletIndex]._status = 1;\r\n        \r\n        if(playerDirection==LEFT)\r\n        {\r\n            bullets[bulletIndex]._x = player._x-1;    \r\n            #if !defined(NO_PLAYER_SHOOT_ANIMATION) && defined(ANIMATE_PLAYER)\r\n            if(!destroyerActive)\r\n            {\r\n                _XL_DRAW(player._x, player._y, _PLAYER_RIGHT_TILE, _PLAYER_COLOR);\r\n            }\r\n            #endif            \r\n        }\r\n        else if(playerDirection==RIGHT)\r\n        {\r\n            bullets[bulletIndex]._x = player._x+1;  \r\n            #if !defined(NO_PLAYER_SHOOT_ANIMATION) && defined(ANIMATE_PLAYER)\r\n            if(!destroyerActive)\r\n            {\r\n                _XL_DRAW(player._x, player._y, _PLAYER_LEFT_TILE, _PLAYER_COLOR);\r\n            }\r\n            #endif            \r\n        }\r\n        else\r\n        {\r\n            bullets[bulletIndex]._x = player._x;                            \r\n        }\r\n        \r\n        if(playerDirection==UP)\r\n        {\r\n            bullets[bulletIndex]._y = player._y-1;  \r\n            #if !defined(NO_PLAYER_SHOOT_ANIMATION) && defined(ANIMATE_PLAYER)\r\n            if(!destroyerActive)\r\n            {\r\n                _XL_DRAW(player._x, player._y, _PLAYER_DOWN_TILE, _PLAYER_COLOR);\r\n            }\r\n            #endif            \r\n        }\r\n        else if(playerDirection==DOWN)\r\n        {\r\n            bullets[bulletIndex]._y = player._y+1;    \r\n            #if !defined(NO_PLAYER_SHOOT_ANIMATION) && defined(ANIMATE_PLAYER)\r\n            if(!destroyerActive)\r\n            {\r\n                _XL_DRAW(player._x, player._y, _PLAYER_UP_TILE, _PLAYER_COLOR);\r\n            }\r\n            #endif            \r\n        }\r\n        else\r\n        {\r\n            bullets[bulletIndex]._y = player._y;        \r\n        }\r\n        displayBullet(&bullets[bulletIndex]);\r\n        playerFire = 0;    \r\n        checkBullet(&bullets[bulletIndex],playerDirection);\r\n        // displayCharacter(&player);\r\n    }    \r\n}    \r\n\r\n\r\nvoid handle_bullet(uint8_t bulletIndex)\r\n{\r\n    // Move bullet if fired\r\n    if(bullets[bulletIndex]._status)\r\n    {\r\n        moveBullet(&bullets[bulletIndex], bulletDirection[bulletIndex]);\r\n        checkBullet(&bullets[bulletIndex], bulletDirection[bulletIndex]);\r\n    }\r\n}\r\n\r\n\r\nvoid handle_bullets(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    if(loop&1)\r\n    {\r\n        for(i=0;i<BULLETS_NUMBER;++i)\r\n        {\r\n            handle_bullet_fire(i);\r\n        }        \r\n    }\r\n    for(i=0;i<BULLETS_NUMBER;++i)\r\n    {\r\n        handle_bullet(i);\r\n    }\r\n}\r\n\r\n\r\nvoid pushGhost(Character * ghostPtr, uint8_t bulletDirection)\r\n{\r\n    switch(bulletDirection)\r\n    {\r\n        case UP:\r\n            --(ghostPtr->_y);\r\n        break;\r\n        case DOWN:\r\n            ++(ghostPtr->_y);\r\n        break;\r\n        case LEFT:\r\n            --(ghostPtr->_x);\r\n        break;\r\n        default:\r\n        // case RIGHT:\r\n            ++(ghostPtr->_x);\r\n        // break;        \r\n    }\r\n}\r\n\r\n\r\nvoid checkBullets(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<BULLETS_NUMBER;++i)\r\n    {\r\n        checkBullet(&bullets[i], bulletDirection[i]);\r\n    }\r\n}\r\n\r\n\r\nvoid checkBullet(Character *bulletPtr, uint8_t bulletDirection)\r\n{\r\n    if(bulletPtr->_status)\r\n    {\r\n        if(skullActive)\r\n        {\r\n            checkBulletVsSkulls(bulletPtr);\r\n        }\r\n        checkBulletVsGhosts(bulletPtr, bulletDirection);\r\n    }\r\n}\r\n\r\n\r\n// TODO: Restore missile bases if still active\r\nvoid restoreRocketsOnWall(uint8_t x, uint8_t y)\r\n{\r\n    if((y==0) || (y==YSize-1))\r\n    {\r\n        DRAW_CHARACTER(x,y,&HORIZONTAL_BRICK_IMAGE);\r\n        if(ghostCount>MAX_GHOST_COUNT_FOR_ROCKETS)\r\n        {\r\n            uint8_t i;\r\n            for(i=0;i<rocketsOnScreen;i++)\r\n            {\r\n                if(rockets[i]._status)\r\n                {\r\n                    displayRocket(&rockets[i]);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        DRAW_CHARACTER(x,y,&VERTICAL_BRICK_IMAGE);\r\n    }\r\n}\r\n\r\n\r\nvoid checkBulletVsGhost(Character * bulletPtr,\r\n                        uint8_t bulletDirection,\r\n                        register Character * ghostPtr)\r\n{\r\n    if(ghostPtr->_status &&\r\n       areCharctersAtSamePosition(bulletPtr, ghostPtr))\r\n    {\r\n        uint8_t i;\r\n        \r\n        deleteBullet(bulletPtr);\r\n        bulletPtr->_status=0;\r\n\r\n        if((ghostPtr->_status)<=bulletStrength)\r\n        {\r\n            ghostDiesAndSpawns(ghostPtr);\r\n            // points+=GHOST_VS_MISSILE;\r\n            increasePoints(GHOST_VS_MISSILE);\r\n        }\r\n        else\r\n        {\r\n            (ghostPtr->_status)-=bulletStrength;\r\n            displayGhost(ghostPtr);\r\n        \r\n            for(i=0;i<bulletStrength/2;++i)\r\n            {\r\n\r\n                deleteGhost(ghostPtr);\r\n                pushGhost(ghostPtr, bulletDirection);\r\n                #if !defined(NO_HORIZONTAL_LEVEL)\r\n                if(wallReached(ghostPtr) || innerVerticalWallReached(ghostPtr->_x, ghostPtr->_y) || innerHorizontalWallReached(ghostPtr->_x, ghostPtr->_y))\r\n                #else\r\n                if(wallReached(ghostPtr) || innerVerticalWallReached(ghostPtr->_x, ghostPtr->_y))\r\n                #endif\r\n                {\r\n                    // points+=GHOST_VS_WALL_BONUS;\r\n                    increasePoints(GHOST_VS_WALL_BONUS);\r\n                    ghostDies(ghostPtr);\r\n                    restoreRocketsOnWall(ghostPtr->_x, ghostPtr->_y);\r\n                    if((!isBossLevel) && (ghostCount>=maxGhostsOnScreen))\r\n                        {\r\n                            spawnGhost(ghostPtr,ghostCount);\r\n                        }\r\n                    displayStats();\r\n                    break;\r\n                }\r\n                displayGhost(ghostPtr);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\r\nvoid checkBulletVsGhosts(Character * bulletPtr, uint8_t bulletDirection)\r\n{\r\n    uint8_t i = 0;\r\n    \r\n    for(;i<maxGhostsOnScreen;++i)\r\n    {\r\n        if(ghosts[i]._status)\r\n        {\r\n            checkBulletVsGhost(bulletPtr, bulletDirection, &ghosts[i]);\r\n        }\r\n    };\r\n}\r\n\r\n\r\nvoid checkBulletVsSkull(register Character *bulletPtr, register Character *skullPtr)\r\n{\r\n    if(skullPtr->_status && \r\n       areCharctersAtSamePosition(bulletPtr, skullPtr))\r\n    {\r\n        _XL_DRAW(skullPtr->_x,skullPtr->_y,skullPtr->_imagePtr->_imageData, _XL_RED);\r\n        _XL_PING_SOUND();\r\n        \r\n        bulletPtr->_status=0;\r\n        \r\n        deleteBullet(bulletPtr);\r\n        // bulletPtr->_x = 0; \r\n        // bulletPtr->_y = 0;\r\n        decreaseGhostLevel();\r\n        reduceItemCoolDowns();\r\n        \r\n        if((skullPtr->_status)<=bulletStrength)\r\n        {\r\n            skullDies(skullPtr);\r\n        }\r\n        else\r\n        {\r\n            (skullPtr->_status)-=bulletStrength;\r\n            displaySkull(skullPtr);\r\n        }\r\n    }    \r\n}\r\n\r\n\r\nvoid checkBulletVsSkulls(Character *bulletPtr)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<SKULLS_NUMBER;++i)\r\n    {\r\n        if(skulls[i]._status)\r\n        {\r\n            checkBulletVsSkull(bulletPtr, &skulls[i]);\r\n        }\r\n    }\r\n}\r\n\r\n\r\nvoid _moveBullet(register Character *bulletPtr, uint8_t bulletDirection)\r\n{\r\n    deleteBullet(bulletPtr);\r\n    switch(bulletDirection)\r\n    {\r\n        case RIGHT:\r\n            ++bulletPtr->_x;\r\n        break;\r\n        case DOWN:\r\n            ++bulletPtr->_y;\r\n        break;\r\n        case UP:\r\n            --bulletPtr->_y;\r\n        break;\r\n        default:\r\n        // case LEFT:\r\n            --bulletPtr->_x;\r\n        // break;\r\n    }    \r\n}\r\n\r\n\r\nvoid destroyHorizontalMissile(Character * horizontalMissilePtr)\r\n{\r\n    horizontalMissilePtr->_status = 0;\r\n    _XL_EXPLOSION_SOUND();\r\n    deleteHorizontalMissile(horizontalMissilePtr);\r\n    // points+=HORIZONTAL_MISSILE_BONUS;\r\n    increasePoints(HORIZONTAL_MISSILE_BONUS);\r\n    // displayScoreStats();                \r\n    ++destroyed_bases;\r\n    reduceItemCoolDowns();        \r\n}\r\n\r\n\r\nvoid moveBullet(register Character * bulletPtr, uint8_t bulletDirection)\r\n{\r\n    #if !defined(NO_HORIZONTAL_LEVEL)\r\n    if(bulletPtr->_status && (wallReached(bulletPtr) || innerVerticalWallReached(bulletPtr->_x, bulletPtr->_y) || innerHorizontalWallReached(bulletPtr->_x, bulletPtr->_y)))\r\n    #else\r\n    if(bulletPtr->_status && (wallReached(bulletPtr) || innerVerticalWallReached(bulletPtr->_x, bulletPtr->_y)))\r\n    #endif\r\n    {\r\n        bulletPtr->_status=0;\r\n\r\n        if(isOneMissileLevel)\r\n        {\r\n            if(bulletPtr->_x==XSize-1 && bulletPtr->_y==YSize/2 && rightHorizontalMissile._status)\r\n            {\r\n                destroyHorizontalMissile(&rightHorizontalMissile);\r\n            }\r\n        }                \r\n        else if(isMissileLevel)\r\n        {\r\n            if(bulletPtr->_x==XSize-1 && bulletPtr->_y==HORIZONTAL_MISSILE_OFFSET && rightHorizontalMissile._status)\r\n            {\r\n                destroyHorizontalMissile(&rightHorizontalMissile);    \r\n            }\r\n            else if(bulletPtr->_x==0 && bulletPtr->_y==YSize-1-HORIZONTAL_MISSILE_OFFSET && leftHorizontalMissile._status)\r\n            {\r\n                destroyHorizontalMissile(&leftHorizontalMissile);    \r\n            }\r\n        }\r\n        if(bulletPtr->_y==YSize-1)\r\n        {\r\n            uint8_t i;\r\n            for(i=0;i<rocketsOnScreen;++i)\r\n            {\r\n                if((bulletPtr->_x==rockets_x[i]) && rockets[i]._status)\r\n                {\r\n                    rockets[i]._status = 0;\r\n                    ++destroyed_bases;\r\n                    _XL_EXPLOSION_SOUND();\r\n                    deleteRocket(&rockets[i]);\r\n                    // points+=VERTICAL_MISSILE_BONUS;\r\n                    increasePoints(VERTICAL_MISSILE_BONUS);\r\n                    // displayScoreStats();        \r\n                }\r\n            }\r\n        }            \r\n        restoreRocketsOnWall(bulletPtr->_x, bulletPtr->_y);\r\n        // displayStatsTitles();\r\n        displayStats();\r\n    }\r\n    else\r\n    {\r\n        _moveBullet(bulletPtr, bulletDirection);\r\n        displayBullet(bulletPtr);\r\n    }\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/character.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n\r\n#include \"character.h\"\r\n#include \"settings.h\"\r\n#include \"level.h\"\r\n\r\n#include \"../cross_lib/cross_lib.h\"\r\n\r\n#include \"game_text.h\"\r\n\r\nextern uint16_t points;\r\n\r\nextern uint8_t skullsCount;\r\n\r\nextern uint8_t ghostCount;\r\nextern uint16_t loop;\r\nextern uint8_t level;\r\n\r\nextern Image DEAD_GHOST_IMAGE;\r\nextern Image GHOST_IMAGE;\r\nextern Image BOMB_IMAGE;\r\nextern Image BROKEN_BRICK_IMAGE;\r\n\r\nextern Image HORIZONTAL_BRICK_IMAGE;\r\nextern Image VERTICAL_BRICK_IMAGE;\r\n\r\nextern Character ghosts[GHOSTS_NUMBER];\r\nextern Character bombs[BOMBS_NUMBER];\r\nextern Character skulls[SKULLS_NUMBER];\r\n\r\nextern Character player;\r\n\r\nextern uint8_t maxGhostsOnScreen;\r\n\r\nextern uint8_t isInnerHorizontalWallLevel;\r\nextern uint8_t isInnerVerticalWallLevel;\r\n\r\nextern uint8_t invincibilityActive;\r\nextern uint8_t destroyerActive;\r\n\r\nvoid _DRAW_PLAYER(void)\r\n{\r\n    if(destroyerActive)\r\n    {\r\n        DRAW_PLAYER(player._x, player._y, &DESTROYER_IMAGE);\r\n    }\r\n#if !defined(_XL_NO_COLOR)\r\n    // Color case: player gets a different color when invincible\r\n    else if(invincibilityActive)\r\n    {\r\n        player._imagePtr->_color = _XL_YELLOW;\r\n        DRAW_PLAYER(player._x, player._y, player._imagePtr);\r\n        player._imagePtr->_color = _XL_CYAN;\r\n    }\r\n#endif\r\n    else\r\n    {\r\n        DRAW_PLAYER(player._x, player._y, player._imagePtr);\r\n    }\r\n}\r\n\r\n\r\n#if !defined(NO_BLINKING)\r\nvoid _blink_draw(uint8_t x, uint8_t y, Image * image, uint8_t *blinkCounter) \r\n{\r\n    if(*blinkCounter) \r\n    {\r\n        _draw(x,y,image);\r\n        *blinkCounter=0;\r\n    } \r\n    else \r\n    {\r\n        _delete(x,y);\r\n        *blinkCounter=1;\r\n    }    \r\n}\r\n#endif\r\n\r\n\r\nvoid displayCharacter(register Character * characterPtr)\r\n{\r\n    DRAW_CHARACTER(characterPtr->_x, characterPtr->_y, characterPtr->_imagePtr);\r\n}\r\n\r\nvoid deleteCharacter(Character * characterPtr)\r\n{\r\n    DELETE_CHARACTER(characterPtr->_x, characterPtr->_y);\r\n}\r\n\r\nextern uint8_t invincibilityActive;\r\n\r\nextern uint8_t innerVerticalWallY;\r\nextern uint8_t innerVerticalWallLength;\r\n\r\nextern uint8_t innerHorizontalWallX;\r\n\r\nextern uint8_t innerHorizontalWallLength;\r\n\r\n\r\nvoid increasePoints(uint8_t score)\r\n{\r\n    points+=score;\r\n    displayStats();\r\n}\r\n\r\n\r\nvoid playerDies(void)\r\n{\r\n    _XL_EXPLOSION_SOUND();\r\n    player._status=0;\r\n    #if !defined(LESS_TEXT)\r\n        printDefeatMessage();\r\n    #endif\r\n    _XL_SLEEP(1);    \r\n}\r\n\r\nuint8_t playerKilledBy(Character *enemyPtr)\r\n{\r\n    return (!invincibilityActive) && areCharctersAtSamePosition(enemyPtr,&player);\r\n}\r\n\r\nuint8_t handle_player_killed(Character *enemyPtr)\r\n{\r\n    if(playerKilledBy(enemyPtr))\r\n    {\r\n        playerDies();\r\n        return 1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nvoid initializeCharacter(register Character* characterPtr, uint8_t x, uint8_t y, uint8_t status, Image * imagePtr)\r\n{\r\n    characterPtr->_x = x;\r\n    characterPtr->_y = y;\r\n    characterPtr->_status = status;\r\n    characterPtr->_imagePtr = imagePtr;\r\n    \r\n    #if defined(DEBUG)\r\n        displayCharacter(characterPtr);\r\n    #endif\r\n}\r\n\r\n\r\nuint8_t isCharacterAtLocation(uint8_t x, uint8_t y, Character * characterPtr)\r\n{\r\n    return(characterPtr->_x==x) && (characterPtr->_y==y);\r\n}\r\n\r\n\r\nuint8_t onWall(uint8_t x, uint8_t y)\r\n{\r\n    return(x==0)||(x==XSize-1) || \r\n          (y==0)||(y==YSize-1);\r\n}\r\n\r\nuint8_t wallReached(Character *characterPtr)\r\n{\r\n   return onWall(characterPtr->_x, characterPtr->_y);\r\n}\r\n\r\n\r\nuint8_t sameLocationAsAnyActiveLocation(uint8_t x, uint8_t y, Character *characterList, uint8_t length)\r\n{\r\n    uint8_t i;\r\n\r\n    for(i=0;i<length;++i)\r\n    {\r\n        if(characterList[i]._status && isCharacterAtLocation(x,y,&characterList[i]))\r\n        {\r\n            return i;\r\n        }\r\n    }    \r\n    return length;\r\n}\r\n\r\n\r\n#if YSize<XSize\r\n    #define SAFETY YSize/4\r\n#else\r\n    #define SAFETY XSize/4\r\n#endif\r\n\r\n// TODO: To be replaced with something cleaner\r\n// also used with things different from global bombs\r\nuint8_t safeLocation(uint8_t x, uint8_t y)\r\n{\r\n       return (x>=SAFETY) && (x<=XSize-SAFETY) && (y>SAFETY) && (y<=YSize-SAFETY);\r\n}\r\n\r\n\r\nvoid relocateNearBy(register Character * characterPtr)\r\n{\r\n    uint8_t x; \r\n    uint8_t y;  \r\n    \r\n    do\r\n    {\r\n        x = characterPtr->_x - (uint8_t)(RELOCATE_RANGE/2) + (uint8_t)(_XL_RAND() % RELOCATE_RANGE);\r\n        y = characterPtr->_y - (uint8_t)(RELOCATE_RANGE/2) + (uint8_t)(_XL_RAND() % RELOCATE_RANGE);\r\n\r\n    } while(!safeLocation(x,y));\r\n\r\n    characterPtr->_x = x;\r\n    characterPtr->_y = y;\r\n}\r\n\r\nuint8_t innerVerticalWallReached(uint8_t x, uint8_t y)\r\n{\r\n    return (x==XSize/2) && (y >= innerVerticalWallY) && (y <= (innerVerticalWallY + innerVerticalWallLength-1));\r\n}\r\n\r\n\r\n// uint8_t nearInnerVerticalWall(register Character *characterPtr)\r\n// {\r\n    // return isInnerVerticalWallLevel && (characterPtr->_x>=(XSize/2)-1) && (characterPtr->_x<=(XSize/2)+1) &&\r\n           // (characterPtr->_y >= innerVerticalWallY-1) && (characterPtr->_y<= (innerVerticalWallY + innerVerticalWallLength));\r\n// }\r\n\r\n\r\n#if !defined(NO_HORIZONTAL_LEVEL)\r\nuint8_t innerHorizontalWallReached(uint8_t x, uint8_t y)\r\n{\r\n    return (y==(YSize/2)) && (x >= innerHorizontalWallX) && (x<= (innerHorizontalWallX + innerHorizontalWallLength-1));\r\n}\r\n#endif\r\n\r\n// uint8_t nearInnerHorizontalWall(register Character *characterPtr)\r\n// {\r\n    // return isInnerHorizontalWallLevel && (characterPtr->_y>=(YSize/2)-1) && (characterPtr->_y<=(YSize/2)+1) &&\r\n           // (characterPtr->_x >= innerHorizontalWallX-1) && (characterPtr->_x<= (innerHorizontalWallX + innerHorizontalWallLength));\r\n// }    \r\n\r\n\r\n// void DRAW_BROKEN_BRICK(uint8_t x, uint8_t y)\r\n// {\r\n    // _draw(x,y,&BROKEN_BRICK_IMAGE);        \r\n// }\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/end_screen.c",
    "content": "\n#include \"settings.h\"\n\n#include \"end_screen.h\"\n#include \"game_text.h\"\n#include \"text_strings.h\"\n#include \"move_player.h\"\n\n#if defined(END_SCREEN)\n\t#include \"strategy.h\"\n\t#include \"level.h\"\n\t#include \"character.h\"\n\t#include \"ghost.h\"\n\t\n\textern Character player;\n\textern Character skulls[];\n\textern Character ghosts[GHOSTS_NUMBER];\n\textern Character bullet;\n\textern uint8_t playerFire;\n\textern uint8_t level;\n\textern uint8_t guns;\n\textern uint8_t ind;\n    \n    extern uint8_t maxGhostsOnScreen;\n    \n    extern uint8_t isBossLevel;\n    extern uint8_t innerVerticalWallLength;\n#endif\n\n\n#if YSize < 20\n\t#define MESSAGE_START 3\n\t#define MESSAGE_RANGE 7\n#else\n\t#define MESSAGE_START 7\n\t#define MESSAGE_RANGE 15\n#endif\n\n#if defined(END_SCREEN)\n\tvoid gameCompleted(void)\n\t{\n\t\t\n\t\t_XL_CLEAR_SCREEN();\n        ghostCount = 8;\n        maxGhostsOnScreen = 8;\n        isBossLevel = 0;\n\t\tfillLevelWithCharacters();\n\n\t\t// skulls[0]._x = player._x-4;\n\t\t// skulls[0]._y = player._y;\n\n        for(ind=0;ind<maxGhostsOnScreen;++ind)\n        {\n            displayCharacter(&ghosts[ind]);\n        }\n        \n        displayPlayer(&player);\n        // displaySkull(&skulls[0]);\n    \n        _XL_PRINT(XSize/2-3, MESSAGE_START,  YOU_MADE_IT_STRING);\n\n        _XL_WAIT_FOR_INPUT();\n        \n        #if defined(BETWEEN_LEVEL)\n            spiral(&player, 2*MIN_SIZE-18);\n            // _XL_SLEEP(1);\n        #endif\n\t}\n#endif\n\n\n"
  },
  {
    "path": "src/games/shoot/split_files/game_text.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"settings.h\"\r\n#include \"cross_lib.h\"\r\n\r\n#include \"game_text.h\"\r\n#include \"character.h\"\r\n// #include \"settings.h\"\r\n#include \"text_strings.h\"\r\n#include \"sound_macros.h\"\r\n#include \"sleep_macros.h\"\r\n#include \"item.h\"\r\n#include \"sleep.h\"\r\n#include \"init_images.h\"\r\n\r\nextern Image GHOST_IMAGE;\r\nextern Image BULLET_IMAGE;\r\nextern Image PLAYER_IMAGE;\r\nextern Image FIRE_POWER_IMAGE;\r\n\r\nextern uint8_t guns; \r\n\r\nextern uint8_t bulletStrength;\r\n\r\n#define SET_COLOR(c) _XL_SET_TEXT_COLOR(c)\r\n\r\n#if YSize<=15\r\n    #define LINE_SKIP 1\r\n    #define INIT_HINT_LINE 1\r\n#else\r\n    #define LINE_SKIP 2\r\n    #define INIT_HINT_LINE 1+(YSize/8)\r\n#endif\r\n\r\n\r\nextern uint8_t level;\r\nextern uint8_t lives;\r\n\r\nextern uint16_t points;\r\nextern uint8_t ghostCount;\r\nextern uint16_t ghostLevel;\r\nextern uint16_t highScore;\r\n\r\nextern Image BULLET_IMAGE;\r\nextern Image BOMB_IMAGE;\r\n\r\nextern uint8_t discoveredSecrets[];\r\n\r\nextern uint8_t  secretLevelActivated;\r\n\r\nextern uint8_t bombCount;\r\n\r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n\r\n#if !defined(LESS_TEXT)\r\n\r\nvoid print_destroy_missiles(uint8_t row)\r\n{\r\n    _XL_PRINT(XSize/2-9+1,row, DESTROY_MISSILES__STRING);\r\n    \r\n    _XL_DRAW(XSize/2-3, row+LINE_SKIP, _LEFT_HORIZONTAL_MISSILE_TILE, _XL_WHITE);\r\n    _XL_DRAW(XSize/2-1, row+LINE_SKIP, _ROCKET_TILE, _XL_WHITE);\r\n    _XL_DRAW(XSize/2+1, row+LINE_SKIP, _RIGHT_HORIZONTAL_MISSILE_TILE, _XL_WHITE); \r\n   \r\n}\r\n\r\n#endif\r\n\r\n#if !defined(LESS_TEXT)\r\nvoid printKillTheSkulls(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    _XL_DRAW(XSize/2-4, YSize/2-4, _BOSS_TILE, _XL_RED);\r\n    \r\n    for(i=0;i<3;++i)\r\n    {\r\n        _XL_DRAW(XSize/2-2+(i<<1), YSize/2-4, _SKULL_TILE, _XL_CYAN);\r\n    }\r\n\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    PRINT_CENTERED_ON_ROW(((uint8_t)YSize)/2-2,KILL_THE_BOSS);    \r\n    PRINT_CENTERED_ON_ROW(((uint8_t)YSize)/2,KILL_THE_SKULLS_STRING);   \r\n\r\n    print_destroy_missiles(((uint8_t)YSize)/2+2);\r\n}\r\n#endif\r\n\r\n\r\nvoid displayStatsTitles(void)\r\n{                \r\n    _draw_stat(GHOST_IMAGE_X, GHOST_IMAGE_Y, &GHOST_IMAGE);\r\n    _draw_stat(PLAYER_IMAGE_X, PLAYER_IMAGE_Y, &PLAYER_IMAGE);                    \r\n    _draw_stat(FIRE_POWER_IMAGE_X, FIRE_POWER_IMAGE_Y, &FIRE_POWER_IMAGE); \r\n}\r\n\r\n\r\nvoid displayStats(void)\r\n{\r\n    #if !defined(_XL_NO_COLOR)\r\n    if(bulletStrength>=COLOR_BULLET_SECOND_THRESHOLD)\r\n    {\r\n        BULLET_IMAGE._color = SECOND_THRESHOLD_BULLET_COLOR;\r\n    }    \r\n    else if(bulletStrength>=COLOR_BULLET_FIRST_THRESHOLD)\r\n    {\r\n        BULLET_IMAGE._color = FIRST_THRESHOLD_BULLET_COLOR; \r\n    }\r\n    #endif\r\n    displayScoreStats();\r\n    displayStatsTitles();\r\n    #if XSize>=32\r\n    _XL_SET_TEXT_COLOR(_XL_RED);\r\n    _XL_PRINT(XSize-10,0,\"HI\");\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(XSize-8, 0, 5, highScore );  \r\n    #endif\r\n\r\n    printLevelStats();\r\n    printLivesStats();\r\n    printGunsStats();\r\n    printFirePowerStats();\r\n    printGhostCountStats();\r\n}\r\n\r\n\r\nvoid printGunsStats(void)\r\n{\r\n    SET_COLOR(_XL_WHITE);    \r\n\r\n\r\n    if(bombCount<BOMBS_NUMBER)\r\n    {\r\n\r\n        #if defined(WIDE)\r\n            _XL_PRINTD(BULLET_IMAGE_X+1,BULLET_IMAGE_Y,2,BOMBS_NUMBER-bombCount);\r\n        #else\r\n            _XL_PRINTD(BULLET_IMAGE_X+1,BULLET_IMAGE_Y,2,BOMBS_NUMBER-bombCount);\r\n        #endif\r\n        _draw_stat(BULLET_IMAGE_X, BULLET_IMAGE_Y, &BOMB_IMAGE);\r\n    }\r\n    else\r\n    {\r\n        #if defined(WIDE)\r\n            _XL_PRINTD(BULLET_IMAGE_X+1,BULLET_IMAGE_Y,2,guns);\r\n        #else\r\n            _XL_PRINTD(BULLET_IMAGE_X+1,BULLET_IMAGE_Y,2,guns);\r\n        #endif\r\n        _draw_stat(BULLET_IMAGE_X, BULLET_IMAGE_Y, &BULLET_IMAGE);\r\n    }  \r\n    \r\n\r\n}\r\n\r\n\r\nvoid printFirePowerStats(void)\r\n{\r\n    #if !defined(_XL_NO_TEXT_COLOR)\r\n    if(bulletStrength<COLOR_BULLET_FIRST_THRESHOLD)\r\n    {\r\n        SET_COLOR(INITIAL_BULLET_COLOR);\r\n    }\r\n    else if(bulletStrength<COLOR_BULLET_SECOND_THRESHOLD)\r\n    {\r\n        SET_COLOR(FIRST_THRESHOLD_BULLET_COLOR);\r\n    }\r\n    else\r\n    {\r\n        SET_COLOR(SECOND_THRESHOLD_BULLET_COLOR);\r\n    }\r\n    #endif\r\n    \r\n    #if defined(WIDE)\r\n        _XL_PRINTD(FIRE_POWER_IMAGE_X+2,FIRE_POWER_IMAGE_Y,1,bulletStrength-1);\r\n    #else\r\n        _XL_PRINTD(FIRE_POWER_IMAGE_X+1,FIRE_POWER_IMAGE_Y,1,bulletStrength-1);\r\n    #endif\r\n}\r\n\r\n\r\n#if XSize>20\r\nvoid printLevelStats(void)\r\n{    \r\n\tSET_COLOR(_XL_WHITE);\r\n\r\n\t_XL_PRINTD(LEVEL_X,LEVEL_Y,2,level);\r\n}\r\n#endif\r\n\r\n\r\nvoid printGhostCountStats(void)\r\n{\r\n\tSET_COLOR(_XL_WHITE);        \r\n\t\r\n\t#if defined(WIDE)\r\n\t\t_XL_PRINTD(GHOST_IMAGE_X+1,GHOST_IMAGE_Y,2,ghostCount);\r\n\t#else\r\n\t\t_XL_PRINTD(GHOST_IMAGE_X+1,GHOST_IMAGE_Y,2,ghostCount);    \r\n\t#endif    \r\n}\r\n\r\n\r\nvoid printLivesStats(void)\r\n{\r\n\tSET_COLOR(_XL_WHITE);\r\n\t\r\n\t_XL_PRINTD(PLAYER_IMAGE_X+1,PLAYER_IMAGE_Y,1,lives);    \r\n}    \r\n\r\n\r\n\r\nvoid displayScoreStats(void)\r\n{    \r\n    SET_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(0,0,5,points);  \r\n}\r\n\r\n\r\n#if !defined(LESS_TEXT)    \r\n    void printLevel(void)\r\n    {\r\n        uint8_t i;\r\n        \r\n        SET_COLOR(_XL_YELLOW);\r\n\r\n        if(!level)\r\n        {\r\n            _XL_PRINT(((XSize -7)>>1), (YSize>>1)-2, _XL_S _XL_E _XL_C _XL_R _XL_E _XL_T); \r\n        }\r\n        else if(level==8)//(!(level&7))\r\n        {\r\n            _XL_PRINT(((XSize -7)>>1), (YSize>>1)-2, _XL_B _XL_SPACE _XL_O _XL_SPACE _XL_S _XL_SPACE _XL_S);\r\n\r\n        }\r\n        else if(level==16)\r\n        {\r\n            _XL_PRINT(((XSize -7)>>1), (YSize>>1)-2, _XL_F _XL_I _XL_N _XL_A _XL_L);\r\n        }\r\n        else\r\n        {\r\n            for(i=0;i<(level&7);++i)\r\n            {\r\n                _draw_stat(((XSize -7)>>1)+i,(YSize>>1)-4,&GHOST_IMAGE);\r\n            }\r\n            SET_COLOR(_XL_WHITE);\r\n            \r\n            _XL_PRINT(((XSize -7)>>1), (YSize>>1)-2, _XL_P _XL_A _XL_R _XL_T _XL_SPACE _XL_I);\r\n\r\n\r\n            if(level>8)\r\n            {\r\n                _XL_CHAR(((XSize -7)>>1)+6, (YSize>>1)-2, 'I');\r\n            }\r\n        }\r\n        SET_COLOR(_XL_WHITE);\r\n\r\n        _XL_PRINT(((XSize -7)>>1), (YSize>>1), LEVEL_STRING);\r\n        _XL_PRINTD(((XSize -7)>>1)+6, (YSize>>1), 2, level);\r\n    }\r\n#endif\r\n\r\n\r\n#if !defined(END_SCREEN)\r\n    void gameCompleted(void)    \r\n    {\r\n        _XL_CLEAR_SCREEN();\r\n        PRINT_CENTERED(YOU_MADE_IT_STRING); \r\n        _XL_WAIT_FOR_INPUT();\r\n    }\r\n#endif\r\n\r\n\r\n#if !defined(LESS_TEXT)\r\n\r\n    void printVictoryMessage(void)\r\n    {\r\n        SET_COLOR(_XL_RED);\r\n        _XL_PRINT(XSize/2-3,YSize/2-2,VICTORY_STRING);\r\n    }    \r\n#endif\r\n\r\n\r\n#if !defined(LESS_TEXT)    \r\n    void printDefeatMessage(void)\r\n    {            \r\n        SET_COLOR(_XL_RED);\r\n        PRINT_CENTERED_ON_ROW(YSize/2-2,DEFEAT_STRING);\r\n    }    \r\n#endif\r\n    \r\n    \r\nvoid printGameOver(void)\r\n{\r\n\tSET_COLOR(_XL_RED);\r\n\tPRINT_CENTERED(GAME_OVER_STRING);\r\n}    \r\n\r\n\r\n#if !defined(NO_INITIAL_SCREEN)\r\n\r\nvoid _printCrossShoot(void)\r\n{\r\n    PRINT_CENTERED_ON_ROW(2,  CROSS_SHOOT_STRING);        \r\n    SET_COLOR(_XL_WHITE);\r\n}\r\n#endif\r\n\r\n\r\n#if !defined(NO_HINTS) && !defined(NO_INITIAL_SCREEN) && XSize>=18\r\n    void printHints(void)\r\n    {\r\n        SET_COLOR(_XL_RED);\r\n\r\n        _printCrossShoot();\r\n        \r\n        _XL_PRINT(XSize/2-7+1,INIT_HINT_LINE+2*LINE_SKIP, KILL_SKULLS__STRING);\r\n        _XL_PRINT(XSize/2-10+1, INIT_HINT_LINE+3*LINE_SKIP, BEFORE__TO_UNLOCK__STRING);  \r\n        _XL_PRINT(XSize/2-7+1,INIT_HINT_LINE+4*LINE_SKIP, ITEMS__STRING);    \r\n        _XL_PRINT(XSize/2-9+1,INIT_HINT_LINE+5*LINE_SKIP+1, DESTROY_MISSILES__STRING);\r\n        \r\n        _XL_DRAW(XSize/2-2, INIT_HINT_LINE+6*LINE_SKIP+1, _LEFT_HORIZONTAL_MISSILE_TILE, _XL_WHITE);\r\n        _XL_DRAW(XSize/2-0, INIT_HINT_LINE+6*LINE_SKIP+1, _ROCKET_TILE, _XL_WHITE);\r\n        _XL_DRAW(XSize/2+2, INIT_HINT_LINE+6*LINE_SKIP+1, _RIGHT_HORIZONTAL_MISSILE_TILE, _XL_WHITE);   \r\n\r\n\r\n        _XL_DRAW(XSize/2+5+1,INIT_HINT_LINE+2*LINE_SKIP, _SKULL_TILE, _XL_YELLOW);\r\n        _XL_DRAW(XSize/2-3+1,INIT_HINT_LINE+3*LINE_SKIP, _GHOST_TILE, _XL_WHITE);\r\n        // _XL_DRAW(XSize/2-3+1,INIT_HINT_LINE+3*LINE_SKIP, _FAST_GHOST_TILE, _XL_WHITE);\r\n\r\n        _XL_DRAW(XSize/2-1+1,INIT_HINT_LINE+4*LINE_SKIP, _SUPER_TILE, _XL_RED);\r\n        _XL_DRAW(XSize/2+1+1,INIT_HINT_LINE+4*LINE_SKIP, _FREEZE_TILE, _XL_CYAN);\r\n        _XL_DRAW(XSize/2+3+1,INIT_HINT_LINE+4*LINE_SKIP, _INVINCIBILITY_TILE, _XL_YELLOW);\r\n    }\r\n#endif\r\n\r\n\r\n#if !defined(NO_INITIAL_SCREEN)\r\n    void printStartMessage(void)\r\n    {\r\n        SET_COLOR(_XL_GREEN);\r\n\r\n        _printCrossShoot();\r\n        \r\n        #if XSize>=16\r\n        PRINT_CENTERED_ON_ROW(5, AUTHOR_STRING);    \r\n        #endif\r\n\r\n        _printTopScore();\r\n\r\n        #if XSize>= 14 && defined(NO_EXTRA_TITLE)\r\n        PRINT_CENTERED_ON_ROW((YSize>>1)+1, KILL_THEM_ALL__STRING);\r\n        #endif\r\n        \r\n        SET_COLOR(_XL_WHITE);    \r\n            \r\n\r\n\r\n        #if !defined(NO_CONTROL_INSTRUCTIONS) && XSize>=14\r\n            #if YSize<25\r\n                PRINT_CENTERED_ON_ROW(YSize-1, USE_STRING);\r\n            #else\r\n                PRINT_CENTERED_ON_ROW(YSize-2, USE_STRING);\r\n            #endif\r\n        #endif\r\n    }\r\n#endif\r\n\r\n\r\n#if !defined(LESS_TEXT)\r\n\r\n#define MAX_BONUS 995\r\n\r\nvoid handleLevelBonus(uint16_t bonus)\r\n{\r\n    uint16_t i;\r\n    uint16_t j;\r\n    \r\n    const uint8_t delay = (uint8_t) (MAX_BONUS/bonus); // Minimum bonus = 20. So 995/20<255\r\n    \r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    \r\n    for(i=0;i<=bonus;i+=5)\r\n    {\r\n        // delay = (MAX_DELAY+i-bonus)/(bonus-i+1);\r\n        _XL_PRINTD(XSize/2-1,YSize/2,3,i);\r\n        increasePoints(5);\r\n        \r\n        _XL_TICK_SOUND();\r\n\r\n        for(j=0;j<(i>>DISPLAY_SPEED_RIGHT_SHIFT);++j)\r\n        {\r\n            SHORT_SLEEP(delay);\r\n        }\r\n    }\r\n}\r\n#endif\r\n\r\n#if !defined(NO_ACHIEVEMENTS)\r\nuint8_t countDiscoveredSecrets(void)\r\n{\r\n    uint8_t total;\r\n    uint8_t i;\r\n    \r\n    total = 0;\r\n    #if defined(DEBUG_SECRETS)\r\n    SET_COLOR(_XL_WHITE);    \r\n    #endif\r\n    for(i=0;i<SECRETS_NUMBER;++i)\r\n    {\r\n        #if defined(DEBUG_SECRETS)\r\n        _XL_PRINTD(3,i,2,i);\r\n        #endif\r\n\r\n        if(discoveredSecrets[i])\r\n        {\r\n            ++total;\r\n            #if defined(DEBUG_SECRETS)\r\n                _XL_PRINT(8,i,\"done\");\r\n            #endif\r\n        }\r\n        #if defined(DEBUG_SECRETS)\r\n            else\r\n            {\r\n\r\n                _XL_PRINT(8,i,\"NOPE\");\r\n            }\r\n        #endif\r\n    }\r\n\r\n    return total;\r\n}\r\n\r\nvoid printAchievements(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    uint8_t foundSecrets;\r\n    \r\n    foundSecrets = countDiscoveredSecrets();\r\n    \r\n    SET_COLOR(_XL_RED);    \r\n\r\n    _XL_PRINT(1, (YSize>>1)-4,  HIGH_SCORE_STRING);\r\n\r\n    _XL_PRINT(1, (YSize>>1)-2,  SCORE_STRING);\r\n\r\n    if(level<=FINAL_LEVEL)\r\n    {\r\n        _XL_PRINT(1, (YSize>>1),    LEVEL_STRING);\r\n        _XL_PRINTD(9, (YSize>>1), 2,   level);\r\n    }\r\n    else\r\n    {\r\n        SET_COLOR(_XL_YELLOW);\r\n        _XL_PRINT(1, (YSize>>1), GAME_COMPLETED_STRING);\r\n        SET_COLOR(_XL_RED);    \r\n    }\r\n    _XL_PRINT(1, (YSize>>1)+2,  DISCOVERED_SECRETS_STRING);\r\n    \r\n    _XL_PRINT(12, (YSize>>1)+2, OF_STRING );\r\n    \r\n    _XL_PRINTD(15, (YSize>>1)+2, 2, SECRETS_NUMBER);\r\n\r\n    SET_COLOR(_XL_WHITE);    \r\n\r\n    _XL_PRINTD(9, (YSize>>1)-4, 5, highScore );\r\n\r\n    _XL_PRINTD(9, (YSize>>1)-2, 5, points);\r\n\r\n    // if(level<=FINAL_LEVEL)\r\n    // {\r\n    // }\r\n\r\n    i=0;\r\n    do\r\n    {\r\n        _XL_PRINTD(9, (YSize>>1)+2, 2, i);\r\n        for(j=0;j<i;++j)\r\n        {\r\n            SHORT_SLEEP(DISPLAY_SPEED_FACTOR);\r\n        }\r\n        _XL_SHOOT_SOUND();\r\n        ++i;\r\n    } while(i<=foundSecrets);\r\n    \r\n    // SHORT_SLEEP(10);\r\n    if(secretLevelActivated)\r\n    {\r\n        SET_COLOR(_XL_YELLOW);    \r\n        _XL_PRINT(1, (YSize>>1)+4, SECRET_LEVEL_FOUND_STRING);\r\n    }\r\n}\r\n#endif\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/ghost.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n\r\n#include \"ghost.h\"\r\n#include \"settings.h\"\r\n#include \"game_text.h\"\r\n#include \"level.h\"\r\n#include \"character.h\"\r\n#include \"init_images.h\"\r\n\r\nextern Image DEAD_GHOST_IMAGE;\r\nextern Image GHOST_IMAGE;\r\nextern Image FAST_GHOST_IMAGE;\r\n\r\nextern uint8_t maxGhostsOnScreen;\r\nextern uint16_t ghostLevel;\r\nextern uint8_t level;\r\n\r\nextern Character ghosts[GHOSTS_NUMBER];\r\nextern Character bombs[BOMBS_NUMBER];\r\n\r\nextern uint8_t guns;\r\n\r\nextern uint8_t bulletStrength;\r\n\r\nextern uint8_t isBossLevel;\r\n\r\nextern uint8_t exploded_bombs;\r\n\r\nextern uint8_t restart;\r\n\r\nvoid checkBombsVsGhost(register Character * ghostPtr)\r\n{\r\n    uint8_t reachedBombInd = characterReachedBombs(ghostPtr);\r\n    \r\n    if(ghostPtr->_status && reachedBombInd<BOMBS_NUMBER)\r\n    {\r\n        // points+=GHOST_VS_BOMBS_BONUS;\r\n        increasePoints(GHOST_VS_BOMBS_BONUS);\r\n        bombs[reachedBombInd]._status = 0;\r\n        ghostDiesAndSpawns(ghostPtr);\r\n        ++exploded_bombs;\r\n    }\r\n}\r\n\r\n\r\n\r\nvoid checkBombsVsGhosts(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<maxGhostsOnScreen;++i)\r\n      {\r\n         checkBombsVsGhost(&ghosts[i]);\r\n      }\r\n}\r\n\r\n\r\nvoid spawnGhost(Character *ghostPtr, uint8_t ghostIndex)\r\n{\r\n    if(!isBossLevel)\r\n    {\r\n        if((ghostCount>=FAST_GHOST_COUNT_MIN_THRESHOLD) && (!(ghostIndex % 4)) && (guns>=FAST_GHOST_GUN_THRESHOLD) && !restart)\r\n        {\r\n            if(!(ghostIndex % 8))\r\n            {\r\n                initializeCharacter(ghostPtr  ,  1      ,     1, FAST_GHOST_LIFE, &FAST_GHOST_IMAGE);\r\n            }\r\n            else\r\n            {\r\n                initializeCharacter(ghostPtr  ,XSize-2, YSize-2, FAST_GHOST_LIFE, &FAST_GHOST_IMAGE);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            switch(ghostIndex % 8)\r\n            {\r\n                case 0:\r\n                    initializeCharacter(ghostPtr  , 1      ,     1, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;\r\n                case 1:\r\n                    initializeCharacter(ghostPtr, XSize-2, YSize-2, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;\r\n                case 2:\r\n                    initializeCharacter(ghostPtr, 1      , YSize-2, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;\r\n                case 3:\r\n                    initializeCharacter(ghostPtr, XSize-2,       1, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;\r\n                case 4:\r\n                    initializeCharacter(ghostPtr, XSize-2, YSize/2, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;\r\n                case 5:\r\n                    initializeCharacter(ghostPtr  , 1    , YSize/2, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;\r\n                case 6:\r\n                    initializeCharacter(ghostPtr, XSize/2,       1, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;\r\n                case 7:\r\n                    initializeCharacter(ghostPtr, XSize/2, YSize-2, GHOST_LIFE, &GHOST_IMAGE);\r\n                break;    \r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\r\nvoid ghostDies(register Character * ghostPtr)\r\n{\r\n    _XL_DRAW(ghostPtr->_x, ghostPtr->_y, _GHOST_TILE, _XL_RED);\r\n    _XL_EXPLOSION_SOUND();\r\n    \r\n    if(ghostPtr->_imagePtr==&FAST_GHOST_IMAGE)\r\n    {\r\n        increasePoints(FAST_GHOST_EXTRA_POINTS);\r\n    }\r\n    \r\n    ghostPtr->_status=0;\r\n    // displayScoreStats();\r\n    \r\n    --ghostCount;\r\n    deleteGhost(ghostPtr);\r\n    // printGhostCountStats();\r\n    displayStats();\r\n}\r\n\r\n\r\nvoid ghostDiesAndSpawns(Character * ghostPtr)\r\n{\r\n    ghostDies(ghostPtr);\r\n    if((!isBossLevel) && (ghostCount>=maxGhostsOnScreen))\r\n    {\r\n        spawnGhost(ghostPtr,ghostCount);\r\n    }\r\n}\r\n\r\n\r\nuint16_t computeGhostSlowDown(void)\r\n{\r\n    if(ghostLevel<MAX_GHOST_LEVEL)\r\n    {\r\n        #if !defined(WIDE)\r\n            return INITIAL_GHOST_SLOWDOWN-ghostLevel*4;        \r\n        #else\r\n            return INITIAL_GHOST_SLOWDOWN-ghostLevel*8;\r\n        #endif\r\n    }\r\n    return GHOST_MIN_SLOWDOWN;\r\n}\r\n\r\n\r\nvoid decreaseGhostLevel(void)\r\n{\r\n    if(ghostLevel>GHOST_LEVEL_DECREASE)\r\n        ghostLevel-=GHOST_LEVEL_DECREASE;\r\n    else\r\n        ghostLevel=0;\r\n}\r\n\r\n\r\nvoid displayBombs(void)\r\n{\r\n    uint8_t i;\r\n\r\n    for(i=0;i<BOMBS_NUMBER;++i)\r\n    {\r\n        if(bombs[i]._status)\r\n        {\r\n            displayBomb(&bombs[i]);\r\n        }\r\n    }\r\n}    \r\n\r\n\r\nuint8_t sameLocationAsAnyGhostLocation(uint8_t x, uint8_t y, Character *ghostList, uint8_t length)\r\n{\r\n    uint8_t i;\r\n\r\n    for(i=0;i<length;++i)\r\n    {\r\n        if(ghostList[i]._status && isCharacterAtLocation(x,y,&(ghostList[i])))\r\n        {\r\n            return i;\r\n        }\r\n    }    \r\n    return length;\r\n}\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/horizontal_missile.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"level.h\"\r\n#include \"strategy.h\"\r\n\r\n#include \"../cross_lib/display/display_macros.h\"\r\n\r\nextern uint16_t loop;\r\nextern uint8_t level;\r\n\r\nextern Character leftHorizontalMissile;\r\nextern Character rightHorizontalMissile;\r\nextern Character player;\r\n\r\nextern uint8_t arrowRange;\r\nextern uint8_t arrowYPosition;\r\n\r\nextern uint8_t isOneMissileLevel;\r\nextern uint8_t isMissileLevel;\r\nextern uint8_t isBossLevel;\r\n\r\n\t#if !defined(NO_ARROW_RANGE_CHECK)\r\n    uint8_t _playerInArrowRange(void)\r\n    {\r\n        return (loop&1 && player._y<=(arrowYPosition+arrowRange) && player._y>=(arrowYPosition-arrowRange));\r\n    }\r\n    #endif\r\n    \r\n    void _handle_from_the_left(void)\r\n    {\r\n        if(leftHorizontalMissile._status)\r\n        {\r\n            if(handle_player_killed(&leftHorizontalMissile))\r\n            {\r\n                return;\r\n            }\r\n\r\n            deleteHorizontalMissile(&leftHorizontalMissile);\r\n            if(leftHorizontalMissile._x==XSize-2)\r\n            {\r\n                leftHorizontalMissile._x=0;\r\n                leftHorizontalMissile._y =  arrowYPosition;\r\n            }\r\n            else\r\n            {\r\n                ADVANCED_LEFT_MISSILE();\r\n\t\t\t\t#if !defined(NO_ARROW_RANGE_CHECK)\r\n                if(_playerInArrowRange())\r\n                {\r\n                    if(player._x>=leftHorizontalMissile._x)\r\n                    {\r\n                        (void) moveCharacter((uint8_t *)&leftHorizontalMissile+Y_MOVE, (uint8_t *)&player+Y_MOVE);\t\t\t\r\n                    }\r\n                }\r\n\t\t\t\t#endif\r\n            }\r\n            displayHorizontalMissile(&leftHorizontalMissile);\r\n            \r\n            handle_player_killed(&leftHorizontalMissile);\r\n        }        \r\n    }\r\n    \r\n    void _handle_from_the_right(void)\r\n    {\r\n        if(rightHorizontalMissile._status)\r\n        {\r\n            if(handle_player_killed(&rightHorizontalMissile))\r\n            {\r\n                return;\r\n            }\r\n\r\n            deleteHorizontalMissile(&rightHorizontalMissile);\r\n            if(rightHorizontalMissile._x==1)\r\n            {\r\n                rightHorizontalMissile._x= XSize-1;\r\n                rightHorizontalMissile._y = arrowYPosition;\r\n            }\r\n            else\r\n            {\r\n                ADVANCED_RIGHT_MISSILE();\r\n\r\n\t\t\t\t#if !defined(NO_ARROW_RANGE_CHECK)\r\n                if(_playerInArrowRange())\r\n                {\r\n                    if(player._x<= rightHorizontalMissile._x)    \r\n                    {\r\n                        (void) moveCharacter((uint8_t *)&rightHorizontalMissile+Y_MOVE, (uint8_t *)&player+Y_MOVE);\t\t\t\r\n                    }\r\n                }\r\n\t\t\t\t#endif\r\n            }\r\n            displayHorizontalMissile(&rightHorizontalMissile);    \r\n            \r\n            handle_player_killed(&rightHorizontalMissile);\r\n        }        \r\n    }\r\n    \r\n    void handle_horizontal_missiles(void)\r\n    {    \r\n        if(isOneMissileLevel)\r\n        {\r\n            arrowYPosition = YSize/2;\r\n            _handle_from_the_right();\r\n        }    \r\n        else if(isMissileLevel || isBossLevel)\r\n        {\r\n            arrowYPosition = HORIZONTAL_MISSILE_OFFSET;\r\n            _handle_from_the_right();\r\n            \r\n            arrowYPosition = YSize-1-HORIZONTAL_MISSILE_OFFSET; \r\n            _handle_from_the_left();\r\n        }\r\n\r\n    }\r\n    \r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/init_images.c",
    "content": "#include \"display_macros.h\"\n\n#include \"tiles.h\"\n\n#include \"images.h\"\n\n#include \"init_images.h\"\n\n#if !defined(ANIMATE_PLAYER)\n\textern Image PLAYER_IMAGE;\n#else\n\textern Image PLAYER_DOWN_IMAGE;\n\textern Image PLAYER_UP_IMAGE;\n\textern Image PLAYER_RIGHT_IMAGE;\n\textern Image PLAYER_LEFT_IMAGE;\t\n#endif\n\t\nextern Image GHOST_IMAGE;\nextern Image BOMB_IMAGE;\n\nextern Image DESTROYER_IMAGE;\n\nextern Image BOSS_IMAGE;\n\nextern Image SKULL_IMAGE;\nextern Image FIRE_CHARGE_IMAGE;\nextern Image FIRE_POWER_IMAGE;\nextern Image BULLET_IMAGE;\nextern Image EXTRA_POINTS_IMAGE;\n\nextern Image HORIZONTAL_BRICK_IMAGE;\nextern Image VERTICAL_BRICK_IMAGE;\n\nextern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\nextern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\n\nextern Image ROCKET_IMAGE;\n\nextern Image FREEZE_IMAGE;\nextern Image EXTRA_LIFE_IMAGE;\nextern Image INVINCIBILITY_IMAGE;\nextern Image SUPER_IMAGE;\nextern Image CONFUSE_IMAGE;\nextern Image SUICIDE_IMAGE;\n\nextern Image BROKEN_BRICK_IMAGE;\n\n\n\nvoid INIT_IMAGES(void)\n{\n# if !defined(__NO_GRAPHICS)\n\t// Set color data \n\t#if !defined(_XL_NO_COLOR)\n\t\t\n\t\t#if defined(ANIMATE_PLAYER)\n\t\t\tPLAYER_DOWN_IMAGE._color = _PLAYER_COLOR;\n\t\t\tPLAYER_UP_IMAGE._color = _PLAYER_COLOR;\n\t\t\tPLAYER_RIGHT_IMAGE._color = _PLAYER_COLOR;\n\t\t\tPLAYER_LEFT_IMAGE._color = _PLAYER_COLOR;\n\t\t#else\n\t\t\tPLAYER_IMAGE._color = _PLAYER_COLOR;\n\t\t#endif\t\n\t\n        FAST_GHOST_IMAGE._color = _FAST_GHOST_COLOR;\n\t\tBOMB_IMAGE._color = _BOMB_COLOR;\n\t\tGHOST_IMAGE._color = _GHOST_COLOR;\t\t\n\t\t\n\t\tBOSS_IMAGE._color = _DEAD_GHOST_COLOR;\n\t\t\n        // SKULL_IMAGE._color = _SKULL_COLOR;\n        CALM_DOWN_IMAGE._color = _CALM_DOWN_COLOR;\n        FIRE_CHARGE_IMAGE._color = _FIRE_CHARGE_COLOR;\n        FIRE_POWER_IMAGE._color = _FIRE_POWER_COLOR;\n        EXTRA_POINTS_IMAGE._color = _EXTRA_POINTS_COLOR;\n        BULLET_IMAGE._color = _BULLET_COLOR;\n        \n        // VERTICAL_BRICK_IMAGE._color = _BRICK_COLOR;\n        // HORIZONTAL_BRICK_IMAGE._color = _BRICK_COLOR;\n    \n        RIGHT_HORIZONTAL_MISSILE_IMAGE._color = _MISSILE_COLOR;\t\t\n        LEFT_HORIZONTAL_MISSILE_IMAGE._color = _MISSILE_COLOR;\n        \n        #if !defined(NO_ROCKETS)\n        ROCKET_IMAGE._color = _ROCKET_COLOR;\n        #endif\n        FREEZE_IMAGE._color = _FREEZE_COLOR;\n        EXTRA_LIFE_IMAGE._color = _EXTRA_LIFE_COLOR;\n        \n        INVINCIBILITY_IMAGE._color = _INVINCIBILITY_COLOR;\n        SUPER_IMAGE._color = _SUPER_COLOR;\n        CONFUSE_IMAGE._color = _CONFUSE_COLOR;\n        SUICIDE_IMAGE._color = _SUICIDE_COLOR;\n        \n        #if !defined(_XL_NO_COLOR) && defined(NO_BLINKING)\n        BROKEN_BRICK_IMAGE._color = _BROKEN_BRICK_COLOR;\n        #endif\n        \n        DESTROYER_IMAGE._color = _DESTROYER_COLOR;\n\t#endif\t\n\n\t// Set Image Data\n\t#if defined(ANIMATE_PLAYER)\n\t\tPLAYER_DOWN_IMAGE._imageData = _PLAYER_DOWN_TILE;\n\t\tPLAYER_UP_IMAGE._imageData = _PLAYER_UP_TILE;\n\t\tPLAYER_RIGHT_IMAGE._imageData = _PLAYER_RIGHT_TILE;\n\t\tPLAYER_LEFT_IMAGE._imageData = _PLAYER_LEFT_TILE;\t\n\t#else\n\t\tPLAYER_IMAGE._imageData = _PLAYER_DOWN_TILE;\n\t#endif\n\t\n\tGHOST_IMAGE._imageData = _GHOST_TILE;\n\tBOMB_IMAGE._imageData = _BOMB_TILE;\n\t\n\n\tBOSS_IMAGE._imageData = _BOSS_TILE;\n\t\n    SKULL_IMAGE._imageData = _SKULL_TILE;\n\n    CALM_DOWN_IMAGE._imageData = _CALM_DOWN_TILE;\n    FIRE_CHARGE_IMAGE._imageData = _BULLET_TILE;\n    FIRE_POWER_IMAGE._imageData = _FIRE_POWER_TILE;\n    EXTRA_POINTS_IMAGE._imageData = _EXTRA_POINTS_TILE;\n    \n    BULLET_IMAGE._imageData = _BULLET_TILE;\n    \n    VERTICAL_BRICK_IMAGE._imageData = _VERTICAL_BRICK_TILE;\n    HORIZONTAL_BRICK_IMAGE._imageData = _HORIZONTAL_BRICK_TILE;\n\n    LEFT_HORIZONTAL_MISSILE_IMAGE._imageData = _LEFT_HORIZONTAL_MISSILE_TILE;\n    \n    RIGHT_HORIZONTAL_MISSILE_IMAGE._imageData = _RIGHT_HORIZONTAL_MISSILE_TILE;\n    \n    #if !defined(NO_ROCKETS)\n    ROCKET_IMAGE._imageData = _ROCKET_TILE;\n    #endif\n    \n    FREEZE_IMAGE._imageData = _FREEZE_TILE;\n    SUPER_IMAGE._imageData = _SUPER_TILE;\n\n    EXTRA_LIFE_IMAGE._imageData = _PLAYER_DOWN_TILE;\n    INVINCIBILITY_IMAGE._imageData = _INVINCIBILITY_TILE;\n    \n    CONFUSE_IMAGE._imageData = _SKULL_TILE;\n    SUICIDE_IMAGE._imageData = _GHOST_TILE;\n    \n    #if !defined(_XL_NO_COLOR) && defined(NO_BLINKING)\n    BROKEN_BRICK_IMAGE._imageData = _BOMB_TILE;\n    #endif\n    \n    DESTROYER_IMAGE._imageData = _DESTROYER_TILE;\n    FAST_GHOST_IMAGE._imageData = _FAST_GHOST_TILE;\n#endif \n}\n\n\n\n"
  },
  {
    "path": "src/games/shoot/split_files/item.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"settings.h\"\r\n\r\n#include \"character.h\"\r\n#include \"item.h\"\r\n#include \"ghost.h\"\r\n#include \"game_text.h\"\r\n#include \"level.h\"\r\n#include \"text_strings.h\"\r\n#include \"sleep.h\"\r\n\r\n#include \"cross_lib.h\"\r\n\r\nextern uint16_t points;\r\n\r\nextern uint8_t guns;\r\nextern uint8_t lives;\r\n\r\nextern uint8_t level;\r\n\r\nextern uint8_t freezeActive;\r\nextern uint8_t freeze_count_down;\r\n\r\nextern uint8_t bombCount;\r\n\r\nextern uint8_t bulletStrength;\r\n\r\nextern uint8_t invincibilityActive;\r\nextern uint8_t confuseActive;\r\n\r\nextern uint8_t invincibility_count_down;\r\nextern uint8_t confuse_count_down;\r\n\r\nextern uint8_t destroyed_bases_in_completed_levels;\r\nextern uint8_t all_skulls_killed_in_completed_levels;    \r\n\r\nextern uint8_t extraLife_present_on_level;\r\nextern uint8_t suicide_present_on_level;\r\n\r\nextern Image DEAD_GHOST_IMAGE;\r\n\r\nextern Character ghosts[GHOSTS_NUMBER];\r\nextern Character bombs[BOMBS_NUMBER];\r\nextern Character skull;\r\n\r\nextern Character player;\r\n\r\nextern Item calmDown;\r\nextern Item fireCharge;\r\nextern Item bombCharge;\r\nextern Item firePower;\r\nextern Item extraPoints;\r\n\r\nextern uint8_t maxGhostsOnScreen;\r\n\r\nextern uint8_t isBossLevel;\r\n\r\nextern Character *chasedEnemyPtr;\r\n\r\nextern Item freeze;\r\n\r\nextern Item invincibility;\r\n\r\nextern Item super;\r\nextern Item extraLife;\r\n\r\nextern Item confuse;\r\nextern Item suicide;\r\n\r\nextern Item destroyer;\r\n\r\nextern uint8_t destroyed_bases;\r\nextern uint8_t exploded_bombs;\r\nextern uint8_t missileDestroyerActivated;\r\nextern uint8_t bombDestroyerActivated;\r\nextern uint8_t destroyerActive;\r\nextern uint8_t destroyer_count_down;\r\n\r\nextern uint8_t firePowerItemSecret;\r\nextern uint8_t firePowerLevelSecret;\r\nextern uint8_t fireChargeSecret;\r\n\r\nextern uint8_t discoveredSecrets[];\r\n\r\nextern Character skulls[];\r\n\r\nextern Image SKULL_IMAGE;\r\nextern Image CONFUSE_IMAGE;\r\nextern Image PLAYER_IMAGE;\r\nextern Image BULLET_IMAGE;\r\n\r\nextern uint8_t skullActive;\r\n\r\n\r\nvoid itemReached(Character * itemPtr)\r\n{\r\n    _XL_ZAP_SOUND();\r\n    // deleteItem(itemPtr);\r\n    // displayPlayer(&player);\r\n    itemPtr->_status = 0;\r\n    // displayScoreStats();\r\n}\r\n\r\n\r\nvoid relocateAwayFromWalls(Character * itemPtr)\r\n{        \r\n    do\r\n    {\r\n        relocateNearBy(itemPtr);\r\n    #if !defined(NO_HORIZONTAL_LEVEL)\r\n    } while(innerVerticalWallReached(itemPtr->_x, itemPtr->_y)||innerHorizontalWallReached(itemPtr->_x,itemPtr->_y));        \r\n    #else\r\n    } while(innerVerticalWallReached(itemPtr->_x, itemPtr->_y));        \r\n\r\n    #endif\r\n}    \r\n\r\n\r\nvoid _freezeEffect(void)\r\n{\r\n    decreaseGhostLevel();\r\n    freezeActive = 1;    \r\n    increasePoints(FREEZE_BONUS);\r\n    freeze_count_down += FREEZE_COUNT_DOWN;    \r\n}\r\n\r\n\r\nvoid _increaseBullets(uint8_t bullets)\r\n{\r\n    uint8_t missing = MAX_GUNS - guns;\r\n    \r\n    if(missing>=bullets)\r\n    {\r\n        guns+=bullets;\r\n    }\r\n    else\r\n    {\r\n        guns=MAX_GUNS;\r\n        fireChargeSecret = 1;\r\n    }\r\n    printGunsStats();\r\n}\r\n\r\n\r\nvoid fireChargeEffect(void)\r\n{\r\n    _increaseBullets(BULLET_GUNS);\r\n    // points+=FIRE_CHARGE_BONUS;\r\n    increasePoints(FIRE_CHARGE_BONUS);\r\n    fireCharge._coolDown = FIRE_CHARGE_COOL_DOWN;        \r\n}\r\n\r\n\r\nvoid bombChargeEffect(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<BOMBS_NUMBER;++i)\r\n    {\r\n        deleteBomb(&bombs[i]);\r\n    }\r\n\r\n    initializeBombs();\r\n    bombCount = 0;\r\n    // TODO: delete Bombs\r\n    bombCharge._coolDown = BOMB_CHARGE_COOL_DOWN; \r\n    printGunsStats();\r\n}\r\n\r\n\r\nvoid calmDownEffect(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<CALM_DOWN_EFFECT_FACTOR;++i)\r\n    {\r\n        decreaseGhostLevel();\r\n    }\r\n    // points+=CALM_DOWN_BONUS;\r\n    increasePoints(CALM_DOWN_BONUS);\r\n    freezeActive = 1;\r\n    freeze_count_down += FREEZE_COUNT_DOWN/4;\r\n    calmDown._coolDown = CALM_DOWN_COOL_DOWN*2;    \r\n}\r\n\r\n\r\nvoid _firePowerEffect(void)\r\n{\r\n    if(bulletStrength<9)\r\n    {\r\n        ++bulletStrength;\r\n    }\r\n    if(bulletStrength==FIRE_POWER_ITEM_THRESHOLD)\r\n    {\r\n        firePowerItemSecret = 1;\r\n    }\r\n    if(bulletStrength>=FIRE_POWER_LEVEL_THRESHOLD)\r\n    {\r\n        firePowerLevelSecret = bulletStrength-FIRE_POWER_LEVEL_THRESHOLD+3;\r\n    }\r\n    // points+=FIRE_POWER_BONUS;\r\n    increasePoints(FIRE_POWER_BONUS);\r\n    // #if !defined(_XL_NO_COLOR)\r\n        // displayStats();\r\n    // #else\r\n        // printFirePowerStats();\r\n    // #endif\r\n}\r\n\r\n\r\nvoid firePowerEffect(void)\r\n{\r\n    _firePowerEffect();\r\n    firePower._coolDown = FIRE_POWER_COOL_DOWN*2;    \r\n}\r\n\r\n\r\nvoid extraPointsEffect(void)\r\n{\r\n    \r\n    if(level)\r\n    {\r\n        // points+=EXTRA_POINTS+level*EXTRA_POINTS_LEVEL_INCREASE;\r\n        increasePoints(EXTRA_POINTS+level*EXTRA_POINTS_LEVEL_INCREASE);\r\n        extraPoints._coolDown = SECOND_EXTRA_POINTS_COOL_DOWN;\r\n    }\r\n    else\r\n    {\r\n        // points+=SECRET_LEVEL_EXTRA_POINTS;\r\n        increasePoints(SECRET_LEVEL_EXTRA_POINTS);\r\n        extraPoints._coolDown = 4;\r\n    }\r\n    setSecret(EXTRA_POINTS_EFFECT_SECRET_INDEX);\r\n}\r\n\r\n\r\nvoid handle_item(register Item *itemPtr)\r\n{\r\n    // Manage item\r\n    if(itemPtr->_character._status)\r\n    {    \r\n        if(areCharctersAtSamePosition(&player, (Character *) itemPtr))\r\n        {\r\n            itemPtr->_effect();\r\n            itemReached((Character *) itemPtr);            \r\n        }\r\n        else\r\n        {\r\n            _blink_draw(itemPtr->_character._x, itemPtr->_character._y, itemPtr->_character._imagePtr, &(itemPtr->_blink));\r\n        }        \r\n    }\r\n    else if (itemPtr->_coolDown == 0)\r\n    {\r\n        itemPtr->_character._status = 1;\r\n        relocateAwayFromWalls((Character *) itemPtr);\r\n\r\n        // TODO: Is this really necessary??\r\n        // _blink_draw(itemPtr->_character._x, itemPtr->_character._y, itemPtr->_character._imagePtr, &(itemPtr->_blink));\r\n    }\r\n    else\r\n    {\r\n        --itemPtr->_coolDown;\r\n    }\r\n}\r\n\r\n\r\nvoid handle_count_down(uint8_t * flagPtr, uint8_t * countDownPtr)\r\n{\r\n    if(*flagPtr)\r\n    {\r\n        if(*countDownPtr==0)\r\n        {\r\n            *flagPtr=0;\r\n        }\r\n        else\r\n        {\r\n            --(*countDownPtr);\r\n        }\r\n    }\r\n}    \r\n\r\n\r\nvoid reduceItemCoolDowns(void)\r\n{\r\n    extraPoints._coolDown-=extraPoints._coolDown/4;\r\n    invincibility._coolDown-=invincibility._coolDown/8;\r\n    freeze._coolDown-=freeze._coolDown/16;\r\n    fireCharge._coolDown-=fireCharge._coolDown/32;\r\n    _XL_TICK_SOUND();        \r\n}\r\n\r\n\r\nvoid freezeEffect(void)\r\n{\r\n    _freezeEffect();\r\n    freeze._coolDown = ((uint16_t) (FREEZE_COOL_DOWN));    \r\n}\r\n\r\n\r\nvoid extraLifeEffect(void)\r\n{\r\n    ++lives;\r\n    // all_skulls_killed_in_completed_levels=1;\r\n    // destroyed_bases_in_completed_levels = 0;\r\n    extraLife_present_on_level = 0;\r\n    // extraLife._coolDown = EXTRA_LIFE_COOL_DOWN*10; // second time must be impossible\r\n    printLivesStats();        \r\n    setSecret(EXTRA_LIFE_EFFECT_SECRET_INDEX);\r\n}\r\n\r\n\r\nvoid _invincibilityEffect(void)\r\n{\r\n    invincibilityActive = 1;\r\n    // Remark: The invincibility count-down could be higher than the standard threshold if the destroyer is active\r\n    if(invincibility_count_down<INVINCIBILITY_COUNT_DOWN)\r\n    {\r\n        invincibility_count_down = INVINCIBILITY_COUNT_DOWN;\r\n    }\r\n}\r\n\r\n\r\nvoid invincibilityEffect(void)\r\n{\r\n    _invincibilityEffect();\r\n    if(level)\r\n    {\r\n        invincibility._coolDown = ((uint16_t) (INVINCIBILITY_COOL_DOWN)*4);\r\n    }\r\n    else\r\n    {\r\n        invincibility._coolDown = SECRET_LEVEL_INVINCIBILITY_COOL_DOWN;\r\n    }\r\n    setSecret(INVINCIBILITY_EFFECT_SECRET_INDEX);\r\n}\r\n\r\n\r\nvoid superEffect(void)\r\n{\r\n    _freezeEffect();\r\n    _firePowerEffect();\r\n    _invincibilityEffect();\r\n    super._coolDown = ((uint16_t) (SUPER_COOL_DOWN)*8);\r\n    setSecret(SUPER_EFFECT_SECRET_INDEX);\r\n}\r\n\r\n\r\nvoid confuseEffect(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    if(skullActive)\r\n    {\r\n\r\n        for(i=0;i<SKULLS_NUMBER;++i)\r\n        {\r\n            if(skulls[i]._status)\r\n            {\r\n                for(j=0;j<5;++j)\r\n                {\r\n                    _XL_DRAW(skulls[i]._x,skulls[i]._y,SKULL_IMAGE._imageData,_XL_GREEN);\r\n                    SHORT_SLEEP(3);\r\n                    _XL_DRAW(skulls[i]._x,skulls[i]._y,SKULL_IMAGE._imageData,_XL_RED);\r\n                    _XL_TOCK_SOUND();\r\n                    SHORT_SLEEP(2);\r\n                }\r\n\r\n                if(skulls[i]._status>CONFUSE_DAMAGE)\r\n                {\r\n                    skulls[i]._status-=CONFUSE_DAMAGE;\r\n                }\r\n                // SHORT_SLEEP(3);\r\n                _XL_EXPLOSION_SOUND();\r\n                displaySkull(&skulls[i]);\r\n            }\r\n        }\r\n    }\r\n    confuseActive = 1;\r\n    confuse._coolDown = SECOND_CONFUSE_COOL_DOWN; //20000UL;//(CONFUSE_COOL_DOWN<<4);\r\n    confuse_count_down = CONFUSE_COUNT_DOWN;\r\n\r\n    setSecret(CONFUSE_EFFECT_SECRET_INDEX);\r\n}\r\n\r\n\r\nvoid suicideEffect(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    destroyed_bases_in_completed_levels = 1;\r\n    if(!level)\r\n    {\r\n        suicide._coolDown = SECOND_SUICIDE_COOL_DOWN/2;\r\n    }\r\n    else\r\n    {\r\n        suicide._coolDown = SECOND_SUICIDE_COOL_DOWN;\r\n    }    \r\n    setSecret(SUICIDE_EFFECT_SECRET_INDEX);\r\n    for(i=0;i<maxGhostsOnScreen;++i)\r\n    {\r\n        if(ghosts[i]._status)\r\n        {\r\n            ghostDiesAndSpawns(&ghosts[i]);\r\n            // points+=GHOST_VS_BOMBS_BONUS;\r\n            increasePoints(GHOST_VS_BOMBS_BONUS);\r\n        }\r\n    }\r\n}\r\n\r\n\r\nvoid destroyerEffect(void)\r\n{\r\n    destroyerActive = 1;\r\n    invincibilityActive = 1;\r\n    invincibility_count_down= 255;\r\n    destroyer_count_down = DESTROYER_COUNT_DOWN;\r\n    destroyer._coolDown = DESTROYER_COOL_DOWN;\r\n}\r\n\r\n\r\nvoid handle_destroyer_triggers(void)\r\n{\r\n    if((destroyed_bases>=MISSILE_DESTROYER_TRIGGER)&& !missileDestroyerActivated)\r\n    {\r\n        missileDestroyerActivated = 1;\r\n        destroyer._coolDown = 2;\r\n        setSecret(MISSILE_DESTROYER_SECRET_INDEX);\r\n    }\r\n    \r\n    if((exploded_bombs>=BOMB_DESTROYER_TRIGGER)&& !bombDestroyerActivated)\r\n    {\r\n        bombDestroyerActivated = 1;\r\n        destroyer._coolDown = 2;\r\n        setSecret(BOMB_DESTROYER_SECRET_INDEX);\r\n    }\r\n}\r\n\r\n\r\nvoid setSecret(uint8_t secretIndex)\r\n{   if(!discoveredSecrets[secretIndex])\r\n    {   \r\n        #if !defined(_XL_NO_COLOR)\r\n        uint8_t i;\r\n        \r\n        for(i=0;i<10;++i)\r\n        {\r\n            _XL_SET_TEXT_COLOR(_XL_RED);\r\n            PRINT_CENTERED_ON_ROW(YSize/2-2,SECRET_FOUND_STRING);\r\n            _XL_TOCK_SOUND();\r\n            SHORT_SLEEP(2);\r\n            _XL_SET_TEXT_COLOR(_XL_YELLOW);\r\n            PRINT_CENTERED_ON_ROW(YSize/2-2,SECRET_FOUND_STRING);\r\n            _XL_TICK_SOUND();\r\n        }\r\n        #else\r\n        _XL_SET_TEXT_COLOR(_XL_YELLOW);\r\n        PRINT_CENTERED_ON_ROW(YSize/2-2,SECRET_FOUND_STRING); \r\n        #endif\r\n        _XL_SLEEP(1);\r\n        PRINT_CENTERED_ON_ROW(YSize/2-2,EMPTY_STRING);        \r\n        discoveredSecrets[secretIndex] = 1;\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/level.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#include \"character.h\"\r\n#include \"item.h\"\r\n#include \"item.h\"\r\n#include \"settings.h\"\r\n#include \"ghost.h\"\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"level.h\"\r\n#include \"sleep.h\"\r\n\r\nextern uint8_t level;\r\n\r\nextern uint8_t maxGhostsOnScreen;\r\n\r\nextern Image PLAYER_IMAGE;\r\nextern Image GHOST_IMAGE;\r\nextern Image BOMB_IMAGE;\r\nextern Image BOSS_IMAGE;\r\n\r\nextern Image SKULL_IMAGE;\r\nextern Image BULLET_IMAGE;\r\nextern Image FIRE_CHARGE_IMAGE;\r\nextern Image FIRE_POWER_IMAGE;\r\nextern Image EXTRA_POINTS_IMAGE;\r\n\r\nextern Image DESTROYER_IMAGE;\r\n\r\nextern Character player; \r\n\r\nextern Character skulls[SKULLS_NUMBER];\r\n\r\nextern Item fireCharge;\r\nextern Item bombCharge;\r\nextern Item firePower;\r\nextern Item extraPoints;\r\n\r\nextern Character bullets[BULLETS_NUMBER];\r\n\r\n\r\nextern Character ghosts[GHOSTS_NUMBER];\r\nextern Character bombs[BOMBS_NUMBER];\r\n\r\n\r\nextern Item chase;\r\nextern Character chasingBullet;\r\n\r\n// extern uint8_t innerVerticalWallX;\r\nextern uint8_t innerVerticalWallY;\r\nextern uint8_t innerVerticalWallLength;\r\n\r\nextern uint8_t innerHorizontalWallX;\r\n// extern uint8_t innerHorizontalWallY;\r\nextern uint8_t innerHorizontalWallLength;\r\n\r\nextern Image ROCKET_IMAGE;\r\n\r\nextern Image CALM_DOWN_IMAGE;\r\nextern Image FREEZE_IMAGE;\r\nextern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\r\nextern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\r\n\r\nextern Image EXTRA_LIFE_IMAGE;\r\nextern Image INVINCIBILITY_IMAGE;\r\nextern Image SUPER_IMAGE;\r\nextern Image CONFUSE_IMAGE;\r\nextern Image SUICIDE_IMAGE;\r\nextern Image BROKEN_BRICK_IMAGE;\r\nextern Image VERTICAL_BRICK_IMAGE;\r\n\r\nextern Character leftHorizontalMissile;\r\nextern Character rightHorizontalMissile;\r\n\r\nextern Item calmDown;\r\nextern Item freeze;\r\nextern Item extraLife;\r\nextern Item invincibility;\r\nextern Item super;\r\nextern Item confuse;\r\nextern Item suicide;\r\nextern Item destroyer;\r\n\r\nextern Character rockets[MAX_ROCKETS_NUMBER];\r\n\r\nextern uint8_t rockets_x[MAX_ROCKETS_NUMBER];\r\n\r\nextern uint8_t isBossLevel;\r\nextern uint8_t isOneMissileLevel;\r\nextern uint8_t isMissileLevel;\r\n// extern uint8_t isRocketLevel;\r\nextern uint8_t isInnerHorizontalWallLevel;\r\nextern uint8_t isInnerVerticalWallLevel;\r\n\r\nextern uint8_t rocketsOnScreen;\r\n\r\nextern uint8_t restart;\r\n\r\n\r\nextern Image HORIZONTAL_BRICK_IMAGE;\r\nextern Image VERTICAL_BRICK_IMAGE;\r\n\r\nvoid DRAW_HORIZONTAL_LINE(uint8_t x,uint8_t y, uint8_t length) \r\n{\r\n\tuint8_t i;\r\n\tfor(i=0;i<length;++i)\r\n\t{\r\n\t\t_draw(x+i,y,&HORIZONTAL_BRICK_IMAGE);\r\n\t}\r\n}\r\n\r\nvoid DRAW_VERTICAL_LINE(uint8_t x,uint8_t y, uint8_t length) \r\n{\r\n\tuint8_t i;\r\n\tfor(i=0;i<length;++i)\r\n\t{\r\n\t\t_draw(x,y+i,&VERTICAL_BRICK_IMAGE);\r\n\t}        \r\n}\r\n\r\nvoid updateInnerVerticalWall(void)\r\n{    \r\n    #if YSize>17\r\n    uint8_t lvmod;\r\n    \r\n    lvmod = level&7;\r\n    #endif\r\n    \r\n    if(!isInnerVerticalWallLevel)\r\n    {\r\n        innerVerticalWallLength = 0;\r\n    }\r\n    else\r\n    {\r\n\r\n        #if YSize>17\r\n            innerVerticalWallLength = YSize-11-lvmod;\r\n        #elif YSize>9\r\n        \r\n            innerVerticalWallLength = 6;\r\n        #else\r\n            innerVerticalWallLength = 3;\r\n        #endif\r\n    }\r\n\r\n    // innerVerticalWallX = (XSize>>1);\r\n    innerVerticalWallY = (YSize>>1)-(innerVerticalWallLength>>1);\r\n}\r\n\r\n\r\nvoid updateInnerHorizontalWall(void)\r\n{    \r\n    #if (defined(WIDE) || YSize>12)\r\n    uint8_t lvmod = level&7;\r\n    #endif\r\n    \r\n    if(!isInnerHorizontalWallLevel)\r\n    {\r\n        innerHorizontalWallLength = 0;\r\n    }\r\n    else\r\n    {\r\n        #if defined(WIDE)\r\n            innerHorizontalWallLength = XSize-13-lvmod;\r\n        #elif YSize<=12\r\n            innerHorizontalWallLength = 8;\r\n        #else\r\n            innerHorizontalWallLength = XSize-11-lvmod;            \r\n        #endif\r\n    }\r\n\r\n    innerHorizontalWallX = (XSize>>1)-(innerHorizontalWallLength>>1);\r\n    // innerHorizontalWallY = (YSize>>1);\r\n}\r\n\r\nuint8_t innerHorizontalWallLevel(void)\r\n{\r\n    // 2, 5, 7, 10, 13, 16\r\n    return ((level&7)==2) || ((level&7)==5) || ((level&7)==7);\r\n    // return ((level&7)==2) || ((level&7)==4) || ((level&7)==6);\r\n}\r\n\r\nuint8_t innerVerticalWallLevel(void)\r\n{\r\n    // 0, 1, 4, 8, 9, 12, 16\r\n    return ((level&7)==1) || ((level&7)==4) || ((level&7)==0);\r\n}    \r\n\r\nuint8_t oneMissileLevel(void)\r\n{\r\n    return (level==3) || (level==4);\r\n    // return ((level&7)==3) || ((level&7)==7) || (level==9);\r\n}\r\n\r\n// uint8_t rocketLevel(void)\r\n// {\r\n    // return !level || ((level==3) || (level>=6));\r\n// }\r\n\r\nuint8_t missileLevel(void)\r\n{\r\n    return level>=5;\r\n    // return ((level&7)==0) || ((level&7)==6) || ((level&7)==5) || ((level&7)==4);\r\n}    \r\n\r\nuint8_t bossLevel(void)\r\n{\r\n    return level && !(level&7);\r\n}\r\n\r\nvoid initializeAwayFromWall(Character * characterPtr, uint8_t x, uint8_t y, uint8_t status, Image *imagePtr)\r\n{\r\n    initializeCharacter(characterPtr, x, y, status, imagePtr);\r\n    relocateAwayFromWalls(characterPtr);\r\n}\r\n\r\n\r\n#if defined(BETWEEN_LEVEL)\r\n\r\nvoid spiral(register Character *characterPtr, uint8_t length)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    characterPtr->_x = XSize/2;\r\n    characterPtr->_y = YSize/2;\r\n    for(i=0;i<length;++i)\r\n    {\r\n        for(j=0;j<i/2;++j)\r\n            {\r\n                displayCharacter(characterPtr);        \r\n                if(i&2)\r\n                {\r\n                    ++(*((uint8_t *) characterPtr + (i&1)));\r\n                }\r\n                else\r\n                {\r\n                    --(*((uint8_t *) characterPtr + (i&1)));                \r\n                }\r\n                #if defined(_XL_SLOW_DOWN_FACTOR)\r\n                // SHORT_SLEEP(DISPLAY_SPEED_FACTOR/2);    \r\n                _XL_SLOW_DOWN(180);\r\n                #endif\r\n            }\r\n    }\r\n    _XL_SLEEP(1);\r\n}\r\n\r\n#endif\r\n\r\nvoid initializeBombs(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    INITIALIZE_BOMBS();\r\n}\r\n\r\nvoid setNumberOfRocketsOnScreen(void)\r\n{\r\n    #if MAX_ROCKETS_NUMBER>0\r\n    if(!level)\r\n    {\r\n        #if MAX_ROCKETS_NUMBER<4\r\n        rocketsOnScreen = MAX_ROCKETS_NUMBER;\r\n        #else\r\n        rocketsOnScreen = 4;\r\n        #endif\r\n    }\r\n    else if(level<=4)\r\n    {\r\n        rocketsOnScreen = 0;\r\n    }\r\n    else if(level<=9)\r\n    {\r\n        rocketsOnScreen = 2;\r\n    }\r\n    else if(level<12)\r\n    {\r\n        #if MAX_ROCKETS_NUMBER<4\r\n        rocketsOnScreen = MAX_ROCKETS_NUMBER;\r\n        #else\r\n        rocketsOnScreen = 4;\r\n        #endif\r\n    }\r\n    else\r\n    {\r\n        rocketsOnScreen = MAX_ROCKETS_NUMBER;\r\n    }    \r\n    #endif\r\n}\r\n\r\n// #define DEBUG_LEVEL\r\n\r\nvoid fillLevelWithCharacters(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t count;\r\n    \r\n    #if !defined(_XL_NO_COLOR)\r\n    switch(level&3)\r\n    {\r\n        case 0:\r\n            HORIZONTAL_BRICK_IMAGE._color = _XL_RED;\r\n            VERTICAL_BRICK_IMAGE._color = _XL_RED;\r\n        break;\r\n        case 1:\r\n            HORIZONTAL_BRICK_IMAGE._color = _XL_GREEN;\r\n            VERTICAL_BRICK_IMAGE._color = _XL_GREEN;\r\n        break;\r\n        case 2:\r\n            HORIZONTAL_BRICK_IMAGE._color = _XL_YELLOW;\r\n            VERTICAL_BRICK_IMAGE._color = _XL_YELLOW;\r\n        break;\r\n        default:\r\n            HORIZONTAL_BRICK_IMAGE._color = _XL_CYAN;\r\n            VERTICAL_BRICK_IMAGE._color = _XL_CYAN;  \r\n    }\r\n    \r\n    #endif\r\n    \r\n    #if !defined(NO_BORDERS)\r\n        DRAW_BORDERS();\r\n    #endif\r\n    \r\n\r\n    #if XSize==40\r\n        #define NEXT_ROCKET_INDEX (((i+1)*(XSize))/(rocketsOnScreen+1))\r\n    #else\r\n        #define NEXT_ROCKET_INDEX (i+1)*(XSize/(rocketsOnScreen+1))\r\n    #endif        \r\n        \r\n    for(i=0;i<rocketsOnScreen;i++)\r\n    {\r\n        rockets_x[i] = (uint8_t) NEXT_ROCKET_INDEX;\r\n        initializeCharacter(&rockets[i],(uint8_t) rockets_x[i],(uint8_t)(YSize-1),1,&ROCKET_IMAGE);\r\n        displayRocket(&rockets[i]);\r\n    }\r\n    // }\r\n    \r\n    if(ghostCount>maxGhostsOnScreen)\r\n    {\r\n        count = maxGhostsOnScreen;\r\n    }\r\n    else\r\n    {\r\n        count = ghostCount;\r\n    }\r\n    \r\n    restart = 1;\r\n    for(i=0;i<count;++i)\r\n    {\r\n        spawnGhost(&ghosts[i],i);\r\n        #if defined(DEBUG_LEVEL)\r\n        // _XL_PRINT(0,i,\"ghost spawned.......\");        \r\n        #endif\r\n        #if defined(DEBUG_LEVEL)\r\n            displayCharacter((Character *)&ghosts[i]);\r\n            _XL_WAIT_FOR_INPUT();\r\n        #endif          \r\n    }\r\n    restart = 0;\r\n    \r\n    for(i=count;i<GHOSTS_NUMBER;++i)\r\n    {\r\n        #if defined(DEBUG_LEVEL)\r\n        PRINT(0,i,\"initialized dead ghost.......\"); \r\n        #endif        \r\n        initializeCharacter(&ghosts[i],0,0,0,0);\r\n        #if defined(DEBUG_LEVEL)\r\n            displayCharacter((Character *)&ghosts[i]);\r\n        #endif        \r\n    }\r\n    \r\n    initializeBombs();\r\n    \r\n    initializeAwayFromWall(&(calmDown._character),(XSize>>1),(YSize>>1),0,&CALM_DOWN_IMAGE);\r\n    initializeAwayFromWall(&(fireCharge._character),(XSize>>1),(YSize>>1),1,&BULLET_IMAGE);\r\n    \r\n    #if defined(NO_BLINKING)\r\n        #if !defined(_XL_NO_COLOR)\r\n        initializeAwayFromWall(&(bombCharge._character),(XSize>>1),(YSize>>1),0,&BROKEN_BRICK_IMAGE);\r\n        #else\r\n        initializeAwayFromWall(&(bombCharge._character),(XSize>>1),(YSize>>1),0,&VERTICAL_BRICK_IMAGE);\r\n        #endif\r\n    #else\r\n        initializeAwayFromWall(&(bombCharge._character),(XSize>>1),(YSize>>1),0,&BOMB_IMAGE);\r\n    #endif\r\n    initializeAwayFromWall(&(freeze._character),(XSize>>1),(YSize>>1),0,&FREEZE_IMAGE);\r\n    initializeAwayFromWall(&(extraPoints._character), (XSize>>1), (YSize>>1), 0, &EXTRA_POINTS_IMAGE);\r\n    initializeAwayFromWall(&(super._character), (XSize>>1), (YSize>>1), 0, &SUPER_IMAGE);\r\n    initializeAwayFromWall(&(confuse._character), (XSize>>1), (YSize>>1), 0, &CONFUSE_IMAGE);        \r\n    initializeAwayFromWall(&(suicide._character), (XSize>>1), (YSize>>1), 0, &SUICIDE_IMAGE); \r\n    \r\n    initializeAwayFromWall(&(destroyer._character), (XSize>>1), (YSize>>1), 0, &DESTROYER_IMAGE);    \r\n\r\n    initializeAwayFromWall(&(firePower._character),(XSize>>1), (YSize>>1), 0, &FIRE_POWER_IMAGE);\r\n\r\n    initializeAwayFromWall(&player,(uint8_t) ((XSize>>1)+(_XL_RAND()&1)),(uint8_t) ((YSize>>1)+(_XL_RAND()&1)),1,&PLAYER_IMAGE);\r\n            \r\n    initializeAwayFromWall(&(extraLife._character), (XSize>>1), (YSize>>1), 0, &EXTRA_LIFE_IMAGE);\r\n\r\n    initializeAwayFromWall(&(invincibility._character), (XSize>>1), (YSize>>1), 0, &INVINCIBILITY_IMAGE);\r\n\r\n    if(isOneMissileLevel)\r\n    {\r\n        initializeCharacter(&rightHorizontalMissile,         XSize-1,                      (YSize>>1), 1,&RIGHT_HORIZONTAL_MISSILE_IMAGE);            \r\n    }\r\n    else if(isMissileLevel)\r\n    {    \r\n        initializeCharacter(&rightHorizontalMissile,         XSize-1,         HORIZONTAL_MISSILE_OFFSET, 1,&RIGHT_HORIZONTAL_MISSILE_IMAGE);\r\n        initializeCharacter(&leftHorizontalMissile,                0, YSize-1-HORIZONTAL_MISSILE_OFFSET, 1,&LEFT_HORIZONTAL_MISSILE_IMAGE);        \r\n    }        \r\n        \r\n    displayPlayer(&player);\r\n    \r\n    #if !defined(_XL_NO_COLOR)\r\n    BULLET_IMAGE._color = _XL_WHITE;\r\n    #endif\r\n    for(i=0;i<BULLETS_NUMBER;++i)\r\n    {\r\n        initializeCharacter(&bullets[i], 0, 0,0,&BULLET_IMAGE);\r\n    }\r\n    \r\n    if(isBossLevel)\r\n    {\r\n        initializeCharacter(&skulls[BOSS_INDEX],XSize-3,2, BOSS_HITS, &BOSS_IMAGE);\r\n        #if !defined(_XL_NO_COLOR)\r\n        SKULL_IMAGE._color = _XL_CYAN;\r\n        #endif\r\n    }\r\n    else\r\n    {\r\n        initializeCharacter(&skulls[BOSS_INDEX],XSize-3,2, MIN_SKULL_HITS, &SKULL_IMAGE);\r\n        #if !defined(_XL_NO_COLOR)\r\n        SKULL_IMAGE._color = _XL_YELLOW;\r\n        #endif\r\n    }\r\n    initializeCharacter(&skulls[0],XSize-3,YSize-3, MIN_SKULL_HITS+(isBossLevel<<BOSS_LEVEL_SKULL_INCREASE), &SKULL_IMAGE);\r\n    initializeCharacter(&skulls[1],2,YSize-3, MIN_SKULL_HITS+(isBossLevel<<BOSS_LEVEL_SKULL_INCREASE), &SKULL_IMAGE);\r\n\r\n    initializeCharacter(&skulls[3],2,2, MIN_SKULL_HITS+(isBossLevel<<BOSS_LEVEL_SKULL_INCREASE), &SKULL_IMAGE);\r\n    \r\n}\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/main.c",
    "content": "\r\n/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n// TODO: REMOVE THIS\r\n// #define DEBUG_STRATEGY\r\n// #define DEBUG_ITEMS\r\n// #define DEBUG_END\r\n// #define DEBUG_ITEMS_IN_GAME\r\n// #define DEBUG_EASY_BOSS_LEVEL\r\n// #define NO_CHASE\r\n\r\n#include \"settings.h\"\r\n\r\n#include \"character.h\"\r\n#include \"item.h\"\r\n#include \"strategy.h\"\r\n#include \"game_text.h\"\r\n#include \"level.h\"\r\n#include \"ghost.h\"\r\n#include \"move_player.h\"\r\n#include \"sleep.h\"\r\n\r\n#include \"text_strings.h\"\r\n\r\n#include \"init_images.h\"\r\n\r\n#include \"display_macros.h\"\r\n\r\n#include \"speed_game_settings.h\"\r\n\r\n#include \"sleep_macros.h\"\r\n\r\n#include \"bullet.h\"\r\n#include \"skull.h\"\r\n    \r\n#include \"end_screen.h\"\r\n\r\n#include \"horizontal_missile.h\"\r\n#include \"rocket.h\"\r\n\r\n#include \"variables.h\"\r\n\r\n// #define DEBUG_ITEMS\r\n\r\n#if defined(DEBUG_ITEMS)\r\n\r\n\r\n    #if defined(ANIMATE_PLAYER)\r\n        extern Image PLAYER_DOWN_IMAGE;\r\n        extern Image PLAYER_UP_IMAGE;\r\n        extern Image PLAYER_RIGHT_IMAGE;\r\n        extern Image PLAYER_LEFT_IMAGE;\r\n    #else\r\n        extern Image PLAYER_IMAGE;\r\n    #endif\r\n    extern Image GHOST_IMAGE;\r\n    extern Image BOMB_IMAGE;\r\n    extern Image DEAD_GHOST_IMAGE;\r\n    extern Image SKULL_IMAGE;\r\n    extern Image CALM_DOWN_IMAGE;\r\n    extern Image FIRE_CHARGE_IMAGE;\r\n    extern Image EXTRA_POINTS_IMAGE;\r\n    extern Image BULLET_IMAGE;\r\n    extern Image VERTICAL_BRICK_IMAGE;\r\n    extern Image HORIZONTAL_BRICK_IMAGE;\r\n    extern Image LEFT_HORIZONTAL_MISSILE_IMAGE;\r\n    extern Image RIGHT_HORIZONTAL_MISSILE_IMAGE;\r\n    extern Image ROCKET_IMAGE;\r\n    extern Image FREEZE_IMAGE;\r\n    extern Image SUPER_IMAGE;\r\n    extern Image EXTRA_LIFE_IMAGE;\r\n    extern Image INVINCIBILITY_IMAGE;\r\n    extern Image CONFUSE_IMAGE;\r\n    extern Image SUICIDE_IMAGE;\r\n    extern Image BROKEN_BRICK_IMAGE;\r\n\r\nvoid DO_DEBUG_ITEMS(void)\r\n{\r\n    #if defined(ANIMATE_PLAYER)\r\n        _draw_stat(1, 0,&PLAYER_DOWN_IMAGE);\r\n        _draw_stat(1, 1,&PLAYER_UP_IMAGE);\r\n        _draw_stat(1, 2,&PLAYER_RIGHT_IMAGE);\r\n        _draw_stat(1, 3,&PLAYER_LEFT_IMAGE);\r\n    #else\r\n        _draw_stat(1, 0,&PLAYER_IMAGE);\r\n    #endif\r\n    _draw_stat(1, 4,&GHOST_IMAGE);\r\n    _draw_stat(1, 5,&BOMB_IMAGE);\r\n    #if !defined(NO_DEAD_GHOST)\r\n        _draw_stat(1, 6,&DEAD_GHOST_IMAGE);\r\n    #endif\r\n    #if !defined(TINY_GAME)\r\n        _draw_stat(1, 7,&SKULL_IMAGE);\r\n        _draw_stat(1, 8,&CALM_DOWN_IMAGE);\r\n        _draw_stat(1, 9,&FIRE_CHARGE_IMAGE);\r\n        _draw_stat(1,10,&EXTRA_POINTS_IMAGE);\r\n        _draw_stat(1,11,&BULLET_IMAGE);\r\n        _draw_stat(1,12,&VERTICAL_BRICK_IMAGE);\r\n        _draw_stat(1,13,&HORIZONTAL_BRICK_IMAGE);\r\n        #if defined(FULL_GAME)\r\n            _draw_stat(1,14,&LEFT_HORIZONTAL_MISSILE_IMAGE);\r\n            _draw_stat(1,15,&RIGHT_HORIZONTAL_MISSILE_IMAGE);\r\n            #if (YSize+Y_OFFSET)>18\r\n            _draw_stat(1,16,&ROCKET_IMAGE);\r\n            _draw_stat(1,17,&FREEZE_IMAGE);\r\n            _draw_stat(1,18,&SUPER_IMAGE);\r\n            _draw_stat(1,19,&EXTRA_LIFE_IMAGE);\r\n            _draw_stat(1,20,&INVINCIBILITY_IMAGE);\r\n            _draw_stat(1,21,&CONFUSE_IMAGE);\r\n            _draw_stat(1,22,&SUICIDE_IMAGE);\r\n            _draw_stat(1,23,&BROKEN_BRICK_IMAGE);\r\n            #else\r\n            _draw_stat(3,7,&ROCKET_IMAGE);\r\n            _draw_stat(3,8,&FREEZE_IMAGE);\r\n            _draw_stat(3,9,&SUPER_IMAGE);\r\n            _draw_stat(3,10,&EXTRA_LIFE_IMAGE);\r\n            _draw_stat(3,11,&INVINCIBILITY_IMAGE);\r\n            _draw_stat(3,12,&CONFUSE_IMAGE);\r\n            _draw_stat(3,13,&SUICIDE_IMAGE);\r\n            _draw_stat(3,14,&BROKEN_BRICK_IMAGE);\r\n            #endif\r\n        #endif\r\n    #endif\r\n    _XL_PRINTD(4,3,5, 1234U);\r\n    _XL_PRINTD(4,5,5,56789U);\r\n    _XL_PRINT(4,7,\"abcdefghijklmnopqrstuvwxyz,./|-\");\r\n    _XL_PRINT(4,9,\"ABCDEFGHIJKLMNOPQRSTUVWXYZ;+{}=\");\r\n    while(1){};\r\n}\r\n#endif\r\n\r\n\r\n#if !defined(NO_EXTRA_TITLE) && YSize>=17\r\nstatic const uint8_t item_tile[7][2] = \r\n{\r\n    { _GHOST_TILE      , _XL_WHITE },\r\n    { _FAST_GHOST_TILE , _XL_GREEN },\r\n    { _SKULL_TILE      , _XL_YELLOW },\r\n    { _BOSS_TILE       , _XL_RED },\r\n    { _BULLET_TILE     , _XL_WHITE},\r\n    { _FIRE_POWER_TILE , _FIRE_POWER_COLOR },\r\n    { _BOMB_TILE       , _XL_RED },\r\n};\r\n\r\nstatic const char item_name[7][9] = \r\n{\r\n    _XL_G _XL_H _XL_O _XL_S _XL_T,\r\n    _XL_S _XL_P _XL_E _XL_C _XL_T _XL_E _XL_R,\r\n    _XL_S _XL_K _XL_U _XL_L _XL_L,\r\n    _XL_B _XL_O _XL_S _XL_S,\r\n    _XL_B _XL_U _XL_L _XL_L _XL_E _XL_T _XL_S,\r\n    _XL_P _XL_O _XL_W _XL_E _XL_R _XL_SPACE _XL_U _XL_P,\r\n    _XL_M _XL_I _XL_N _XL_E,\r\n};\r\n\r\n#if XSize>16 && YSize>20\r\n    #define _NEXT_ROW 2\r\n    #define _Y_ITEMS_OFFSET 0\r\n#else\r\n    #define _NEXT_ROW 1\r\n    #define _Y_ITEMS_OFFSET 1\r\n#endif\r\n\r\n\r\n#define display_items() \\\r\ndo \\\r\n{ \\\r\n    uint8_t i; \\\r\n    \\\r\n    for(i=0;i<7;++i) \\\r\n    { \\\r\n        _XL_DRAW(XSize/2-5,YSize/3+1+i*_NEXT_ROW+_Y_ITEMS_OFFSET, item_tile[i][0], item_tile[i][1]); \\\r\n        _XL_SET_TEXT_COLOR(_XL_GREEN); \\\r\n        _XL_PRINT(XSize/2-5+3,YSize/3+1+i*_NEXT_ROW+_Y_ITEMS_OFFSET, (char *)item_name[i]); \\\r\n    } \\\r\n} while(0)\r\n\r\n#endif\r\n\r\n\r\n#define handle_secret_item_at_start_up(secretFlag, item, secretIndex) \\\r\n    if(secretFlag) \\\r\n    { \\\r\n        item._coolDown = 2; \\\r\n        setSecret(secretIndex); \\\r\n        secretFlag = 0; \\\r\n    }\\\r\n\r\n\r\nvoid resetSecrets(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<SECRETS_NUMBER;++i)\r\n    {\r\n        discoveredSecrets[i]=0;\r\n    }\r\n}\r\n\r\n\r\nvoid resetItems(void)\r\n{\r\n\r\n    calmDown._coolDown = CALM_DOWN_COOL_DOWN;\r\n    firePower._coolDown = FIRE_POWER_COOL_DOWN;\r\n    fireCharge._coolDown = FIRE_CHARGE_COOL_DOWN;\r\n    freeze._coolDown = FREEZE_COOL_DOWN;\r\n    bombCharge._coolDown = BOMB_CHARGE_COOL_DOWN;\r\n    \r\n    extraPoints._coolDown = EXTRA_POINTS_COOL_DOWN;\r\n    invincibility._coolDown = INVINCIBILITY_COOL_DOWN;\r\n\r\n    handle_secret_item_at_start_up(calmDownSecret, calmDown, CALM_DOWN_AT_START_SECRET_INDEX);\r\n    handle_secret_item_at_start_up(extraPointsSecret, extraPoints, EXTRA_POINTS_AT_START_SECRET_INDEX);\r\n    handle_secret_item_at_start_up(freezeSecret, freeze, FREEZE_AT_START_SECRET_INDEX);\r\n\r\n    handle_secret_item_at_start_up(firePowerItemSecret, firePower, FIRE_POWER_AT_START_SECRET_INDEX);\r\n\r\n    super._coolDown = SUPER_COOL_DOWN;\r\n    extraLife._coolDown = EXTRA_LIFE_COOL_DOWN;\r\n    \r\n    confuse._coolDown = CONFUSE_COOL_DOWN;\r\n    suicide._coolDown = SUICIDE_COOL_DOWN;                \r\n    destroyer._coolDown = DESTROYER_COOL_DOWN;\r\n    \r\n    if(!level)\r\n    {\r\n        isBossLevel = 0;\r\n        extraPoints._coolDown = 4;\r\n        invincibility._coolDown = 4;\r\n    }\r\n    \r\n    if(isBossLevel)\r\n    {\r\n        firePower._coolDown<<=1;\r\n        freeze._coolDown<<=1;\r\n        bombCharge._coolDown<<=1;\r\n        super._coolDown<<=1;\r\n        confuse._coolDown<<=1;\r\n    }\r\n}\r\n\r\n\r\n// Constructor for all items\r\nvoid constructItems(void)\r\n{\r\n    calmDown._effect = &calmDownEffect;\r\n    fireCharge._effect = &fireChargeEffect;\r\n    bombCharge._effect = &bombChargeEffect;\r\n    firePower._effect = &firePowerEffect;\r\n    extraPoints._effect = &extraPointsEffect;\r\n    freeze._effect = &freezeEffect;\r\n    extraLife._effect = &extraLifeEffect;\r\n    invincibility._effect = &invincibilityEffect;\r\n    super._effect = &superEffect;\r\n    confuse._effect = &confuseEffect;\r\n    suicide._effect = &suicideEffect;\r\n    destroyer._effect = &destroyerEffect;\r\n}    \r\n\r\n\r\n#if !defined(NO_INITIAL_SCREEN)            \r\nvoid initialScreen(void)\r\n{    \r\n    _XL_CLEAR_SCREEN();                    \r\n    printStartMessage();\r\n    \r\n    #if !defined(NO_EXTRA_TITLE) && YSize>=17\r\n    display_items();\r\n    #endif \r\n    \r\n    _XL_WAIT_FOR_INPUT();\r\n    _XL_SET_TEXT_COLOR(_XL_YELLOW);\r\n    _printCrossShoot();\r\n    _XL_ZAP_SOUND();\r\n    SHORT_SLEEP(3);\r\n    \r\n    #if !defined(NO_HINTS) && XSize>=18\r\n        _XL_CLEAR_SCREEN();\r\n        printHints();    \r\n    #endif\r\n}\r\n#endif\r\n\r\nvoid handle_special_triggers(void)\r\n{\r\n    confuse_present_on_level = !level || destroyed_bases_in_completed_levels;\r\n    suicide_present_on_level = !level || (destroyed_bases_in_completed_levels>=2);\r\n    super_present_on_level = all_skulls_killed_in_completed_levels>=2;\r\n    extraLife_present_on_level = super_present_on_level && suicide_present_on_level && !discoveredSecrets[EXTRA_LIFE_EFFECT_SECRET_INDEX];\r\n}\r\n\r\n\r\nvoid handle_player_killed_by_ghost(void)\r\n{\r\n    uint8_t reachedByGhost = sameLocationAsAnyGhostLocation(player._x, player._y, ghosts, maxGhostsOnScreen);\r\n    \r\n    if(destroyerActive && (reachedByGhost < maxGhostsOnScreen))\r\n    {\r\n        points += GHOST_VS_BOMBS_BONUS;\r\n        ghostDiesAndSpawns(&ghosts[reachedByGhost]);\r\n    }\r\n    \r\n    \r\n    if((!invincibilityActive && ((reachedByGhost<maxGhostsOnScreen))))\r\n    {\r\n        playerDies();\r\n    }\r\n}\r\n\r\nint main(void)\r\n{        \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    _XL_INIT_SOUND();\r\n\r\n    highScore = 0;\r\n    \r\n    while(1)\r\n    {\r\n        INIT_IMAGES();\r\n        \r\n        \r\n        #if !defined(NO_INITIAL_SCREEN)\r\n            initialScreen();\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n            _XL_SET_TEXT_COLOR(_XL_YELLOW);\r\n\r\n            _printCrossShoot();\r\n            _XL_ZAP_SOUND();\r\n            SHORT_SLEEP(9);\r\n            _XL_CLEAR_SCREEN();    \r\n        #else\r\n            _XL_CLEAR_SCREEN();    \r\n            \r\n            printPressKeyToStart();                \r\n        #endif\r\n\r\n        #if defined(DEBUG_ITEMS)\r\n            DO_DEBUG_ITEMS();\r\n        #endif\r\n        \r\n        extraLifeThroughPointsCounter = 1;\r\n        points = 0;\r\n        level = INITIAL_LEVEL;     \r\n        lives = LIVES_NUMBER;\r\n        \r\n        ghostCount = FIRST_LEVEL_GHOSTS_NUMBER; \r\n         \r\n        destroyed_bases_in_completed_levels = 0;\r\n        all_skulls_killed_in_completed_levels = 0;\r\n        \r\n        firePowerItemSecret = 0;\r\n        calmDownSecret = 0;\r\n        extraPointsSecret = 0;\r\n        freezeSecret = 0;\r\n        fireChargeSecret = 0;\r\n        \r\n        secretLevelActivated = 0;\r\n        zeroLevelSecret = 0;\r\n        \r\n        resetSecrets();\r\n        \r\n        do // Level (Re-)Start\r\n        {\r\n            isBossLevel = bossLevel();\r\n            // isRocketLevel = rocketLevel();\r\n            isOneMissileLevel = oneMissileLevel();\r\n            isMissileLevel = missileLevel();\r\n            isInnerHorizontalWallLevel = innerHorizontalWallLevel();\r\n            isInnerVerticalWallLevel = innerVerticalWallLevel();\r\n            setNumberOfRocketsOnScreen();\r\n            \r\n            #if defined(DEBUG_STRATEGY)\r\n            maxGhostsOnScreen = 1;\r\n            #else\r\n            if(!level) // TODO: Do I need this check for the zero level?\r\n            {\r\n                maxGhostsOnScreen = GHOSTS_NUMBER;\r\n            }\r\n            else if(isBossLevel)\r\n            {\r\n                maxGhostsOnScreen = BOSS_LEVEL_GHOSTS_NUMBER;\r\n            }\r\n            else if(isInnerHorizontalWallLevel || isInnerVerticalWallLevel)\r\n            {\r\n                maxGhostsOnScreen = GHOSTS_NUMBER-GHOST_DECREASE;\r\n            }\r\n            else\r\n            {\r\n                maxGhostsOnScreen = GHOSTS_NUMBER;\r\n            }\r\n            #endif\r\n            \r\n            skullsCount = SKULLS_NUMBER;\r\n            \r\n            bombCount = BOMBS_NUMBER;\r\n            \r\n            loop = 0;\r\n            \r\n            ghostLevel = 32*level;\r\n        \r\n            \r\n            destroyed_bases = 0;\r\n            exploded_bombs = 0;\r\n            \r\n            invincibilityActive = 1;                \r\n            invincibility_count_down = INITIAL_INVINCIBILITY_COUNT_DOWN;\r\n            \r\n            destroyerActive = 0;\r\n            missileDestroyerActivated = 0;\r\n            bombDestroyerActivated = 0;\r\n            \r\n            #if !defined(INITIAL_GHOST_FREEZE)\r\n                freezeActive = 0;\r\n            #endif\r\n            confuseActive = 0;\r\n\r\n            #if defined(DEBUG_ITEMS_IN_GAME)\r\n                destroyed_bases_in_completed_levels = 2;\r\n                all_skulls_killed_in_completed_levels = 2;\r\n\r\n            #endif\r\n\r\n            handle_special_triggers();\r\n\r\n            #if !defined(SIMPLE_STRATEGY)\r\n                computeStrategy();            \r\n            #endif\r\n                            \r\n            skullActive = 0;\r\n            \r\n            #if defined(INITIAL_GHOST_FREEZE)\r\n                freezeActive = 1;\r\n                freeze_count_down = INITIAL_FROZEN_COUNT_DOWN;\r\n            #endif\r\n            \r\n            computeSkullParameters();                \r\n            \r\n            // levelSlowDown = INITIAL_GHOST_SLOWDOWN;\r\n            ghostSlowDown = computeGhostSlowDown();\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n            #if !defined(LESS_TEXT)\r\n                // Clear the screen, put cursor in upper left corner\r\n\r\n                printLevel();\r\n                _XL_SLEEP(1);\r\n                _XL_WAIT_FOR_INPUT();\r\n                _XL_CLEAR_SCREEN();\r\n            #endif\r\n                  \r\n            arrowRange = computeArrowRange();\r\n            \r\n            if(isBossLevel)\r\n            {\r\n                #if !defined(LESS_TEXT)\r\n                printKillTheSkulls();\r\n                _XL_SLEEP(1);\r\n                _XL_WAIT_FOR_INPUT();\r\n                #endif\r\n                ghostCount = 0;\r\n            }\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            updateInnerVerticalWall();    \r\n            \r\n            #if !defined(NO_HORIZONTAL_LEVEL)\r\n            updateInnerHorizontalWall();\r\n            #endif\r\n            \r\n            playerFire = 0;\r\n\r\n            if(fireChargeSecret)\r\n            {\r\n                guns = SECRET_GUNS;\r\n                setSecret(FIRE_CHARGE_AT_START_SECRET_INDEX);\r\n                fireChargeSecret = 0;\r\n            }\r\n            else\r\n            {\r\n                guns = 0;\r\n            }\r\n\r\n            if(firePowerLevelSecret)\r\n            {\r\n                bulletStrength = firePowerLevelSecret;\r\n                setSecret(FIRE_POWER_LEVEL_SECRET_INDEX);\r\n                firePowerLevelSecret = 0;\r\n            }\r\n            else\r\n            {\r\n                bulletStrength = 2;\r\n            }\r\n\r\n            fillLevelWithCharacters();            \r\n            \r\n            constructItems();    \r\n            \r\n            // displayStatsTitles();\r\n            \r\n            // displayStats();\r\n            \r\n            resetItems();\r\n            \r\n\r\n            displayStats();\r\n\r\n            while(player._status && (( ((ghostCount>0)&&(skullsCount)) && !isBossLevel) || (skullsCount && isBossLevel))) // while alive && there are still ghosts\r\n            {                \r\n                #if defined(DEBUG_END)\r\n                    gameCompleted();\r\n                #endif\r\n                    \r\n                #if !defined(_XL_TURN_BASED)\r\n                    MOVE_PLAYER();  \r\n                    #if !defined(TRANSITION_ANIMATION)\r\n                        _DRAW_PLAYER();    \r\n                    #endif\r\n                #endif\r\n                        \r\n                handle_rockets();\r\n                handle_horizontal_missiles();\r\n                \r\n                ++loop;\r\n                \r\n                if(points>(extraLifeThroughPointsCounter*EXTRA_LIFE_THROUGH_POINTS))\r\n                {\r\n                    ++extraLifeThroughPointsCounter;\r\n                    _XL_PING_SOUND();\r\n                    ++lives;\r\n                    printLivesStats();\r\n                    _XL_TICK_SOUND();\r\n                }\r\n                \r\n                handle_bullets();\r\n                handle_bomb();\r\n\r\n                handle_player_killed_by_ghost();\r\n\r\n                #if !defined(NO_CHASE)\r\n                if(!freezeActive)\r\n                {\r\n                    if(ghostCount)\r\n                    {\r\n                        chaseCharacter();\r\n                    }\r\n                    ++ghostLevel;            \r\n                    \r\n                }\r\n                else // Frozen ghosts have to be displayed anyway\r\n                {\r\n                    for(ind=0;ind<GHOSTS_NUMBER;++ind)\r\n                    {\r\n                        if(ghosts[ind]._status)\r\n                        {\r\n                            displayGhost(&ghosts[ind]);\r\n                        }\r\n                    }\r\n                }\r\n                #else\r\n                    for(ind=0;ind<GHOSTS_NUMBER;++ind)\r\n                    {\r\n                        if(ghosts[ind]._status)\r\n                        {\r\n                            displayGhost(&ghosts[ind]);\r\n                        }\r\n                    }\r\n                #endif\r\n                                \r\n                \r\n                #if !defined(DEBUG_STRATEGY) && !defined(NO_CHASE)\r\n                handle_skulls();\r\n                #endif\r\n            \r\n                // This detects collisions of ghosts that have just moved\r\n                checkBullets();\r\n\r\n                \r\n                #if defined(TRANSITION_ANIMATION)\r\n                    if(moved)\r\n                    {\r\n                        _XL_DELETE(old_x,old_y);\r\n                        moved = 0;\r\n                    }\r\n                    _DRAW_PLAYER();\r\n                #endif                \r\n                \r\n                // Check collisions bombs vs ghosts\r\n                checkBombsVsGhosts();\r\n                if(skullActive)\r\n                {\r\n                    checkBombsVsSkulls();\r\n                }\r\n                \r\n                SHORT_SLEEP(3);\r\n                if(invincibilityActive)\r\n                {\r\n                    #if _XL_SLOW_DOWN_FACTOR>0\r\n                    SHORT_SLEEP(1);\r\n                    #endif\r\n                    _XL_DELETE(player._x, player._y);\r\n                }\r\n\r\n                SHORT_SLEEP(3);\r\n                \r\n                handle_calmDown_item();\r\n                handle_extraPoints_item();\r\n                handle_firePower_item();\r\n                handle_fireCharge_item();\r\n                handle_bombCharge_item();    \r\n                \r\n                handle_freeze_count_down();                    \r\n                \r\n                handle_freeze_item();    \r\n                handle_invincibility_item();\r\n                handle_invincibility_count_down();                    \r\n\r\n                handle_destroyer_triggers();\r\n                handle_destroyer_item();\r\n                handle_destroyer_count_down();\r\n                    \r\n                if(super_present_on_level)\r\n                {\r\n                    handle_super_item();\r\n                    if(extraLife_present_on_level)\r\n                    {\r\n                        handle_extraLife_item();\r\n                    }\r\n                }\r\n                \r\n                                    \r\n                if(confuse_present_on_level)\r\n                {\r\n                    handle_confuse_item();\r\n                    handle_confuse_count_down();\r\n                    if(suicide_present_on_level)\r\n                    {\r\n                        handle_suicide_item();\r\n                    }\r\n                }              \r\n                \r\n                handle_player_killed_by_ghost();\r\n                // reachedByGhost = sameLocationAsAnyGhostLocation(player._x, player._y, ghosts, maxGhostsOnScreen);\r\n                \r\n                // if(destroyerActive && (reachedByGhost < maxGhostsOnScreen))\r\n                // {\r\n                    // points += GHOST_VS_BOMBS_BONUS;\r\n                    // ghostDiesAndSpawns(&ghosts[reachedByGhost]);\r\n                // }\r\n                \r\n                \r\n                // if((!invincibilityActive && ((reachedByGhost<maxGhostsOnScreen))))\r\n                // {\r\n                    // playerDies();\r\n                // }\r\n\r\n                    \r\n                SKIP_WALL_DRAW\r\n                {\r\n                    ghostSlowDown = computeGhostSlowDown();\r\n                    \r\n                    #if !defined(NO_HORIZONTAL_LEVEL)\r\n                    if(isInnerVerticalWallLevel)\r\n                    {\r\n                        DRAW_VERTICAL_LINE(XSize/2, YSize/2-(innerVerticalWallLength/2), innerVerticalWallLength);\r\n                    }\r\n                    else if(isInnerHorizontalWallLevel)\r\n                    {\r\n                        DRAW_HORIZONTAL_LINE((XSize>>1)-(innerHorizontalWallLength>>1), YSize/2, innerHorizontalWallLength);\r\n                    }\r\n                    #else\r\n                    if(isInnerVerticalWallLevel)\r\n                    {\r\n                        DRAW_VERTICAL_LINE(XSize/2, YSize/2-(innerVerticalWallLength/2), innerVerticalWallLength);\r\n                    }\r\n                    #endif\r\n                    \r\n                    displayBombs();                                                        \r\n                }\r\n                \r\n            }; // end inner while [while (player._alive && ghostCount>0), i.e., exit on death or end of level]\r\n\r\n            if(player._status) // if level finished\r\n            {\r\n                _DRAW_PLAYER();\r\n                #if defined(BETWEEN_LEVEL)\r\n                    chasedEnemyPtr = &player;\r\n                    SHOW_DOWN();\r\n                #endif\r\n                \r\n                #if !defined(LESS_TEXT)\r\n                    _XL_SLEEP(1);\r\n                    printVictoryMessage();\r\n                    _XL_WAIT_FOR_INPUT();\r\n\r\n                    // _XL_CLEAR_SCREEN();\r\n                #endif\r\n\r\n                handleLevelBonus(((uint16_t)BASE_LEVEL_BONUS)+((uint16_t) LEVEL_BONUS)*((uint16_t) level)+ghostCount*GHOSTS_LEFT_BONUS);\r\n\r\n                if(!isBossLevel)\r\n                {\r\n                    if(ghostCount>=CALM_DOWN_SECRET_THRESHOLD)\r\n                    {\r\n                        calmDownSecret = 1;\r\n                        if(ghostCount>=EXTRA_POINTS_SECRET_THRESHOLD)\r\n                        {\r\n                            extraPointsSecret = 1;\r\n                            if(ghostCount>=FREEZE_SECRET_THRESHOLD)\r\n                            {\r\n                                freezeSecret = 1;\r\n                                if((ghostCount>=SECRET_LEVEL_THRESHOLD) && !secretLevelActivated)\r\n                                {\r\n                                    zeroLevelSecret = 1;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                _XL_SLEEP(1);\r\n                _XL_WAIT_FOR_INPUT();\r\n                \r\n                if(isBossLevel && level!=FINAL_LEVEL)\r\n                {    \r\n                    all_skulls_killed_in_completed_levels = 1;\r\n                    destroyed_bases_in_completed_levels/=2;\r\n                }\r\n                else\r\n                {\r\n                    if(!skullsCount)\r\n                    {\r\n                        ++all_skulls_killed_in_completed_levels;\r\n                    }\r\n                    destroyed_bases_in_completed_levels+=destroyed_bases;\r\n                }\r\n                \r\n                if(zeroLevelSecret)\r\n                {\r\n                    nextLevel = level+1;\r\n                    level = 0;\r\n                    secretLevelActivated = 1;\r\n                    zeroLevelSecret = 0;\r\n                    setSecret(ZERO_LEVEL_SECRET_INDEX);\r\n                    ghostCount = ZERO_LEVEL_GHOSTS_NUMBER;\r\n                }\r\n                else\r\n                {\r\n                    if(!level)\r\n                    {\r\n                        // Restart at the next level after the one you left when entering the secret zero level\r\n                        level = nextLevel;\r\n                    }\r\n                    else\r\n                    {\r\n                        ++level;\r\n                    }\r\n                    if(level>8)\r\n                    {\r\n                        ghostCount = NUMBER_OF_GHOSTS_ON_PART_II;\r\n                    }\r\n                    else\r\n                    {\r\n                        ghostCount = FIRST_LEVEL_GHOSTS_NUMBER + 2*level;\r\n                    }\r\n                }\r\n                \r\n\r\n            }\r\n            else // if dead\r\n            {        \r\n                #if defined(BETWEEN_LEVEL)\r\n                    chasedEnemyPtr = &skulls[0];    \r\n                #endif\r\n                \r\n                _XL_CLEAR_SCREEN();\r\n                --lives;\r\n                if(lives>0)\r\n                {\r\n                    player._status = 1;\r\n                }\r\n                firePowerItemSecret = 0;\r\n                calmDownSecret = 0;\r\n                extraPointsSecret = 0;\r\n                freezeSecret = 0;\r\n                fireChargeSecret = 0;\r\n                firePowerLevelSecret = 0;\r\n                zeroLevelSecret = 0;\r\n            }\r\n            #if defined(BETWEEN_LEVEL)\r\n                spiral(chasedEnemyPtr, SPIRAL_LOOPS);\r\n                // _XL_SLEEP(1);\r\n            #endif\r\n            \r\n        } while (player._status && (level<(FINAL_LEVEL+1))); // lives left and not completed game game     \r\n\r\n        // GAME OVER    \r\n\r\n        if(level==FINAL_LEVEL+1) // if completed game\r\n        {\r\n            // uint8_t i;\r\n            // uint8_t lives_left = lives;\r\n            do\r\n            {\r\n                points+=LIVES_LEFT_BONUS;\r\n                --lives;\r\n                displayScoreStats();\r\n                printLivesStats();\r\n                _XL_ZAP_SOUND();\r\n                _XL_SLEEP(1);\r\n            } while(lives);\r\n            _XL_SLEEP(2);\r\n            _XL_WAIT_FOR_INPUT();\r\n            gameCompleted();\r\n            _XL_SLEEP(1);\r\n        }\r\n\r\n        if(points>highScore)\r\n        {\r\n            highScore = points;\r\n        }\r\n\r\n        _XL_CLEAR_SCREEN();\r\n\t\t#if !defined(NO_ACHIEVEMENTS)\r\n        printAchievements();\r\n        _XL_SLEEP(1);\r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n        _XL_CLEAR_SCREEN();\r\n\t\t#endif\r\n        printGameOver();\r\n        \r\n        _XL_SLEEP(1);\r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n    } // while(1) -> restart from the beginning\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/move_player.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"settings.h\"\r\n\r\n#include \"move_player.h\"\r\n\r\n#include \"character.h\"\r\n#include \"skull.h\"\r\n\r\n#include \"definitions.h\"\r\n\r\n#include \"bullet.h\"\r\n\r\nextern uint8_t bombCount;\r\n\r\nextern Character player;\r\n\r\nextern uint8_t skullXCountDown;\r\nextern uint8_t skullYCountDown;\r\nextern uint8_t playerFire;\r\nextern Character bullet;\r\nextern uint8_t guns;\r\nextern uint8_t playerDirection;\r\n\r\nextern uint8_t player_invincibility;\r\nextern uint8_t playerBlink;    \r\n\r\n\r\nuint8_t innerWallReached(uint8_t x, uint8_t y)\r\n{\r\n    #if !defined(NO_HORIZONTAL_LEVEL)\r\n    return innerVerticalWallReached(x,y) || innerHorizontalWallReached(x,y);\r\n    #else\r\n    return innerVerticalWallReached(x,y);\r\n    #endif\r\n}\r\n\r\n\r\n#if defined(PLAYER_DIRECTION_CHANGE)    \r\n\r\n    void up_direction(void)\r\n    {\r\n        up_transiction();\r\n        playerDirection = UP;\r\n        SHOW_UP();  \r\n    }\r\n\r\n    void down_direction(void)\r\n    {\r\n        playerDirection = DOWN;\r\n        SHOW_DOWN();  \r\n    }\r\n\r\n    void left_direction(void)\r\n    {\r\n        playerDirection = LEFT;\r\n        SHOW_LEFT();  \r\n    }\r\n\r\n    void right_direction(void)\r\n    {\r\n        playerDirection = RIGHT;\r\n        SHOW_RIGHT();  \r\n    }\r\n\r\n    #define _DO_MOVE_UP \\\r\n        deletePlayer(&player); \\\r\n        --player._y; \\\r\n        skullYCountDown = SKULL_COUNT_DOWN; \\\r\n        playerFire = 0; \\\r\n        up_direction();\r\n    #define _DO_MOVE_DOWN \\\r\n        deletePlayer(&player); \\\r\n        ++player._y; \\\r\n        skullYCountDown = SKULL_COUNT_DOWN; \\\r\n        playerFire = 0; \\\r\n        down_direction();\r\n    #define _DO_MOVE_LEFT \\\r\n        deletePlayer(&player); \\\r\n        --player._x; \\\r\n        skullXCountDown = SKULL_COUNT_DOWN; \\\r\n        playerFire = 0; \\\r\n        left_direction();\r\n    #define _DO_MOVE_RIGHT \\\r\n        deletePlayer(&player); \\\r\n        ++player._x; \\\r\n        skullXCountDown = SKULL_COUNT_DOWN; \\\r\n        playerFire = 0; \\\r\n        right_direction();\r\n\r\n    #if defined(__NO_PRINT)\r\n        void MOVE_PLAYER(void) {}\r\n    #else\r\n        void MOVE_PLAYER(void)\r\n        {\r\n            uint8_t input = _XL_INPUT();\r\n            \r\n            \r\n            if(_XL_UP(input))\r\n            {\r\n                if(playerDirection != UP)\r\n                {\r\n                    up_direction();\r\n                }\r\n                else if((player._y>1) && !innerWallReached(player._x,player._y-1))\r\n                {\r\n                    _DO_MOVE_UP\r\n                }\r\n            }\r\n            else if(_XL_DOWN(input))\r\n            {\r\n                if(playerDirection != DOWN)\r\n                {\r\n                    down_direction();\r\n                }\r\n                else if((player._y<YSize-2) && !innerWallReached(player._x,player._y+1))\r\n                {\r\n                    _DO_MOVE_DOWN\r\n                }\r\n            }\r\n            else if(_XL_LEFT(input))\r\n            {\r\n                if(playerDirection != LEFT)\r\n                {\r\n                    left_direction();\r\n                }\r\n                else if((player._x>1) && !innerWallReached(player._x-1,player._y))\r\n                {\r\n                    _DO_MOVE_LEFT\r\n                }\r\n            }\r\n            else if(_XL_RIGHT(input))\r\n            {\r\n                if(playerDirection != RIGHT)\r\n                {\r\n                    right_direction();\r\n                }\r\n                else if((player._x<XSize-2) && !innerWallReached(player._x+1,player._y))\r\n                {\r\n                    _DO_MOVE_RIGHT\r\n                }\r\n            }\r\n            else if(_XL_FIRE(input) && (bombCount<BOMBS_NUMBER || (guns>0 && availableBullet()<BULLETS_NUMBER)))\r\n            {\r\n                playerFire = 1;\r\n            }\r\n        }\r\n    #endif\r\n#else\r\n    extern uint8_t old_x;\r\n    extern uint8_t old_y;\r\n    extern uint8_t moved;\r\n    #if defined(TRANSITION_ANIMATION)\r\n    \r\n        void _set_old(void)\r\n        {\r\n            old_x = player._x;\r\n            old_y = player._y;\r\n            moved = 1;\r\n        }\r\n        \r\n    \r\n        #include \"init_images.h\"\r\n        \r\n        #define _DO_MOVE_UP \\\r\n            _set_old(); \\\r\n            _XL_DRAW(old_x, old_y-1, _PLAYER_UP_TOP_TILE, _XL_CYAN); \\\r\n            _XL_DRAW(old_x, old_y, _PLAYER_BOTTOM_TILE, _XL_CYAN); \\\r\n            --player._y; \\\r\n            SHOW_UP(); \\\r\n            skullYCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = UP; \\\r\n            playerFire = 0;\r\n\r\n        #define _DO_MOVE_DOWN \\\r\n            _set_old(); \\\r\n            _XL_DRAW(old_x, old_y, _PLAYER_DOWN_TOP_TILE, _XL_CYAN); \\\r\n            _XL_DRAW(old_x, old_y+1, _PLAYER_BOTTOM_TILE, _XL_CYAN); \\\r\n            ++player._y; \\\r\n            SHOW_DOWN(); \\\r\n            skullYCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = DOWN; \\\r\n            playerFire = 0;\r\n\r\n        #define _DO_MOVE_LEFT \\\r\n            _set_old(); \\\r\n            _XL_DRAW(old_x-1, old_y, _PLAYER_LEFT_MOVE_TILE, _XL_CYAN); \\\r\n            _XL_DRAW(old_x, old_y, _PLAYER_RIGHT_MOVE_TILE, _XL_CYAN); \\\r\n            --player._x; \\\r\n            SHOW_LEFT(); \\\r\n            skullXCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = LEFT; \\\r\n            playerFire = 0;\r\n\r\n        #define _DO_MOVE_RIGHT \\\r\n            _set_old(); \\\r\n            _XL_DRAW(old_x, old_y, _PLAYER_LEFT_MOVE_TILE, _XL_CYAN); \\\r\n            _XL_DRAW(old_x+1, old_y, _PLAYER_RIGHT_MOVE_TILE, _XL_CYAN); \\\r\n            ++player._x; \\\r\n            SHOW_RIGHT(); \\\r\n            skullXCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = RIGHT; \\\r\n            playerFire = 0;\r\n\r\n    #else\r\n        #define _DO_MOVE_UP \\\r\n            deletePlayer(&player); \\\r\n            --player._y; \\\r\n            SHOW_UP(); \\\r\n            skullYCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = UP; \\\r\n            playerFire = 0;\r\n        #define _DO_MOVE_DOWN \\\r\n            deletePlayer(&player); \\\r\n            ++player._y; \\\r\n            SHOW_DOWN(); \\\r\n            skullYCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = DOWN; \\\r\n            playerFire = 0;\r\n        #define _DO_MOVE_LEFT \\\r\n            deletePlayer(&player); \\\r\n            --player._x; \\\r\n            SHOW_LEFT(); \\\r\n            skullXCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = LEFT; \\\r\n            playerFire = 0;\r\n        #define _DO_MOVE_RIGHT \\\r\n            deletePlayer(&player); \\\r\n            ++player._x; \\\r\n            SHOW_RIGHT(); \\\r\n            skullXCountDown = SKULL_COUNT_DOWN; \\\r\n            playerDirection = RIGHT; \\\r\n            playerFire = 0;\r\n    #endif\r\n\r\n    #if defined(__NO_PRINT)\r\n        void MOVE_PLAYER(void) {}\r\n    #else\r\n        void MOVE_PLAYER(void)\r\n        {\r\n            uint8_t input = _XL_INPUT();\r\n            \r\n            if(_XL_UP(input) && (player._y>1) && !innerWallReached(player._x,player._y-1))\r\n            {\r\n                _DO_MOVE_UP\r\n            }\r\n            else if(_XL_DOWN(input) && (player._y<YSize-2) && !innerWallReached(player._x,player._y+1))\r\n            {\r\n                _DO_MOVE_DOWN\r\n            }\r\n            else if(_XL_LEFT(input) && (player._x>1) && !innerWallReached(player._x-1,player._y))\r\n            {\r\n                _DO_MOVE_LEFT\r\n            }\r\n            else if(_XL_RIGHT(input) && (player._x<XSize-2) && !innerWallReached(player._x+1,player._y))\r\n            {\r\n                _DO_MOVE_RIGHT\r\n            }\r\n            else if(_XL_FIRE(input) && (bombCount<BOMBS_NUMBER || (guns>0 && availableBullet()<BULLETS_NUMBER)))\r\n            {\r\n                playerFire = 1;\r\n            }\r\n        }\r\n    #endif\r\n#endif\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/rocket.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#if !defined(NO_ROCKETS)\r\n#include \"../cross_lib/display/display_macros.h\"\r\n\r\n#include \"settings.h\"\r\n#include \"character.h\"\r\n#include \"level.h\"\r\n\r\nextern uint8_t rocketsOnScreen;\r\n\r\nextern Character rockets[MAX_ROCKETS_NUMBER];\r\n\r\nextern uint8_t ghostCount;\r\n\r\n// extern uint8_t isRocketLevel;\r\nextern uint8_t isBossLevel;\r\n\r\n    void handle_rockets(void)\r\n    {    \r\n        if((ghostCount<=MAX_GHOST_COUNT_FOR_ROCKETS) || isBossLevel)\r\n        { \r\n            uint8_t i;\r\n\r\n            for(i=0;i<rocketsOnScreen;++i)\r\n            {\r\n                if(rockets[i]._status)\r\n                {\r\n                    if(handle_player_killed(&rockets[i]))\r\n                    {\r\n                        return;\r\n                    }\r\n                    \r\n                    #if defined(TURNED_BASED)\r\n                    if(1)\r\n                    #else\r\n                    if(_XL_RAND()&1)\r\n                    #endif\r\n                    {\r\n                        deleteRocket(&rockets[i]);\r\n                        --(rockets[i]._y);\r\n                    }\r\n\r\n                    displayRocket(&rockets[i]);            \r\n                    if(rockets[i]._y<=1)\r\n                    {    \r\n                        deleteRocket(&rockets[i]);\r\n                        rockets[i]._y = YSize-1;                            \r\n                    }\r\n                    \r\n                    handle_player_killed(&rockets[i]);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n\r\n#endif"
  },
  {
    "path": "src/games/shoot/split_files/skull.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n\r\n#include \"settings.h\"\r\n\r\n#include \"skull.h\"\r\n#include \"level.h\"\r\n#include \"strategy.h\"\r\n#include \"game_text.h\"\r\n#include \"item.h\"\r\n#include \"init_images.h\"\r\n\r\nextern uint8_t level;\r\nextern uint16_t loop;\r\n\r\nextern uint16_t skullSlowDown;\r\nextern uint8_t skullXCountDown;\r\nextern uint8_t skullYCountDown ;\r\n\r\nextern uint16_t ghostLevel;\r\n\r\nextern uint8_t skullsCount;\r\n\r\nextern Character skulls[SKULLS_NUMBER];\r\nextern Character bombs[BOMBS_NUMBER];\r\n\r\nextern Character skull;\r\nextern Character player;\r\n\r\nextern uint8_t skullActive;\r\n\r\nextern uint8_t isBossLevel;\r\n\r\nextern uint8_t confuseActive;\r\n\r\nextern uint8_t freezeActive;\r\n\r\nextern uint8_t maxGhostsOnScreen;\r\n\r\nextern Character ghosts[]; \r\n\r\nextern Image GHOST_IMAGE;\r\nextern Image FAST_GHOST_IMAGE;\r\n\r\nextern Image BOSS_IMAGE;\r\n\r\n// extern uint16_t levelSlowDown;\r\n\r\nextern uint8_t exploded_bombs;\r\n\r\n\r\nuint16_t computeSkullSlowDown(void)\r\n{\r\n    if(loop<MAX_SKULL_LOOP)\r\n    {\r\n        #if !defined(WIDE)\r\n            return INITIAL_GHOST_SLOWDOWN - ghostLevel*4;                \r\n        #else\r\n            return INITIAL_GHOST_SLOWDOWN - ghostLevel*8;        \r\n        #endif\r\n    }\r\n    return SKULL_MIN_SLOWDOWN; // You must die!\r\n}\r\n\r\nvoid computeSkullParameters(void)\r\n{\r\n    skullSlowDown = computeSkullSlowDown();\r\n    skullXCountDown = SKULL_COUNT_DOWN;\r\n    skullYCountDown = SKULL_COUNT_DOWN;\r\n}\r\n\r\n\r\n// Redability macros\r\n#define INACTIVITY_COUNT_DOWN_REACHED ((skullXCountDown==0) || (skullYCountDown==0))\r\n#define GHOST_COUNT_TRIGGER_REACHED (ghostCount<=SKULL_TRIGGER+(level/4))\r\n#define BOSS_LOOP_TRIGGER_REACHED (loop>=SKULL_LOOP_TRIGGER)\r\n\r\n#define NON_BOSS_TRIGGER_REACHED (INACTIVITY_COUNT_DOWN_REACHED || GHOST_COUNT_TRIGGER_REACHED)\r\n\r\n\r\n#define SKULL_RAND_CONDITION (_XL_RAND()>skullSlowDown)\r\n\r\n\r\n\r\nvoid skullDies(register Character * skullPtr)\r\n{\r\n        // DRAW_BROKEN_BRICK(skullPtr->_x, skullPtr->_y);\r\n        _XL_DRAW(skullPtr->_x, skullPtr->_y,_SKULL_TILE, _XL_RED);\r\n        skullPtr->_status=0;\r\n        if(!(--skullsCount))\r\n        {\r\n            skullActive = 0;\r\n        }\r\n        _XL_EXPLOSION_SOUND();\r\n        // points+=SKULL_POINTS;\r\n        increasePoints(SKULL_POINTS);\r\n        if(isBossLevel)\r\n        {\r\n            // points+=SKULL_POINTS;\r\n            increasePoints(BOSS_LEVEL_SKULL_EXTRA_POINTS);\r\n            if(skullPtr->_imagePtr==&BOSS_IMAGE)\r\n            {\r\n                increasePoints(BOSS_EXTRA_POINTS);\r\n            }\r\n        }\r\n\r\n        // displayScoreStats();\r\n        deleteSkull(skullPtr);\r\n}\r\n\r\n\r\nvoid handle_skull(Character *skullPtr, uint8_t strategy)\r\n{\r\n    if(skullPtr->_status)\r\n    {\r\n        if(handle_player_killed(skullPtr))\r\n        {\r\n            return;\r\n        }\r\n\r\n        if(!freezeActive && SKULL_RAND_CONDITION)\r\n        {\r\n            skullMoveTowardCharacter(skullPtr, strategy);\r\n        }\r\n        displaySkull(skullPtr);\r\n        // if (playerKilledBy(skullPtr))\r\n        // {\r\n            // playerDies();\r\n        // }\r\n        handle_player_killed(skullPtr);\r\n    }\r\n}\r\n\r\n// FAST_SPAWN_SPAWN_AND_MASK: frequency (probability) of spawning a fast ghost vs normal ghost\r\n// GHOST_SPAWN_LOOP_END_MASK: frequency of spawning a ghost (or fast ghost)\r\n#if defined(WIDE)\r\n    #define FAST_SPAWN_SPAWN_AND_MASK 1\r\n    #define GHOST_SPAWN_LOOP_END_MASK 31\r\n#else\r\n    #define FAST_SPAWN_SPAWN_AND_MASK 3\r\n    #define GHOST_SPAWN_LOOP_END_MASK 63\r\n#endif\r\n\r\nvoid handle_skulls(void)\r\n{\r\n    if(!skullActive)\r\n    {   \r\n        if((!isBossLevel && NON_BOSS_TRIGGER_REACHED) || \r\n           (isBossLevel && BOSS_LOOP_TRIGGER_REACHED))\r\n        {\r\n            #if !defined(DEBUG_NO_SKULL)\r\n            skullActive = 1;\r\n            #endif\r\n            \r\n            if(!isBossLevel && INACTIVITY_COUNT_DOWN_REACHED)\r\n            {\r\n                setSecret(SKULLS_ACTIVATED_SECRET_INDEX);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            --skullXCountDown;\r\n            --skullYCountDown;\r\n        }\r\n    }\r\n    else\r\n    {     \r\n        uint8_t i;\r\n\r\n        if(!confuseActive || !(loop&3))\r\n        {\r\n            skullSlowDown = computeSkullSlowDown();\r\n\r\n            for(i=0;i<SKULLS_NUMBER;++i)\r\n            {\r\n                handle_skull(&skulls[i],i*2);\r\n            }\r\n        }\r\n        \r\n         // Boss spawns only in boss level and: \r\n         // it spawns only every 32nd loop or 64th loop (non-wide)\r\n         // it spawns only if boss is alive\r\n         // it spawns only if not on vertical wall (always present on boss levels)\r\n        if(isBossLevel && !(loop&GHOST_SPAWN_LOOP_END_MASK) && (ghostCount<BOSS_LEVEL_GHOSTS_NUMBER) && skulls[BOSS_INDEX]._status && skulls[BOSS_INDEX]._x!=XSize/2 )\r\n        {\r\n            i=0;\r\n            while((i<BOSS_LEVEL_GHOSTS_NUMBER)&&(ghosts[i]._status))\r\n            {\r\n                ++i;\r\n            }\r\n            // if(ghostCount<BOSS_LEVEL_GHOSTS_NUMBER)\r\n            // {\r\n            if(!(_XL_RAND()&FAST_SPAWN_SPAWN_AND_MASK))\r\n            {\r\n                initializeCharacter(&ghosts[i],skulls[BOSS_INDEX]._x, skulls[BOSS_INDEX]._y,FAST_GHOST_LIFE,&FAST_GHOST_IMAGE);\r\n            }\r\n            else\r\n            {\r\n                initializeCharacter(&ghosts[i],skulls[BOSS_INDEX]._x, skulls[BOSS_INDEX]._y,GHOST_LIFE,&GHOST_IMAGE);\r\n            }\r\n            ++ghostCount;\r\n            printGhostCountStats();\r\n            // }\r\n            \r\n        }\r\n    }\r\n}\r\n\r\nvoid checkBombsVsSkull(register Character * skullPtr)\r\n{\r\n    uint8_t reachedBombInd = characterReachedBombs(skullPtr);\r\n    \r\n    if(skullPtr->_status && reachedBombInd<BOMBS_NUMBER)\r\n    {        \r\n        // points+=GHOST_VS_BOMBS_BONUS;\r\n        increasePoints(GHOST_VS_BOMBS_BONUS);\r\n        \r\n        bombs[reachedBombInd]._status = 0;\r\n        deleteBomb(&bombs[reachedBombInd]);\r\n        ++exploded_bombs;\r\n        _XL_EXPLOSION_SOUND();\r\n        \r\n        if(skullPtr->_status<=SKULL_BOMB_DAMAGE)\r\n        {\r\n            skullDies(skullPtr);\r\n        }\r\n        else\r\n        {\r\n            skullPtr->_status-=SKULL_BOMB_DAMAGE;\r\n        }\r\n    }\r\n}\r\n\r\nvoid checkBombsVsSkulls(void)\r\n{\r\n    uint8_t i;\r\n    for(i=0;i<SKULLS_NUMBER;++i)\r\n      {\r\n         checkBombsVsSkull(&skulls[i]);\r\n      }\r\n}   \r\n\r\n\r\nvoid displaySkulls(void)\r\n{\r\n    uint8_t i;\r\n\r\n    for(i=0;i<SKULLS_NUMBER;++i)\r\n    {\r\n        if (skulls[i]._status)\r\n        {\r\n            displaySkull(&skulls[i]);\r\n        }\r\n    }\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/sleep.c",
    "content": "\r\n\r\n#include \"sleep.h\"\r\n\r\n#include \"standard_libs.h\"\r\n#include \"sleep_macros.h\"\r\n#include \"cross_lib.h\"\r\n\r\n// #if _XL_SLOW_DOWN_FACTOR>0\r\nvoid SHORT_SLEEP(uint8_t t)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<t;++i)\r\n    {\r\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n    }\r\n}\r\n// #endif\r\n\r\n"
  },
  {
    "path": "src/games/shoot/split_files/strategy.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n\r\n#include \"settings.h\"\r\n#include \"character.h\"\r\n#include \"strategy.h\"\r\n#include \"level.h\"\r\n\r\nextern uint8_t level;\r\nextern uint16_t loop;\r\nextern uint8_t ghostCount;\r\n\r\nextern Character player; \r\nextern Character ghosts[GHOSTS_NUMBER];\r\n\r\nextern uint8_t strategyArray[GHOSTS_NUMBER];\r\n\r\nextern uint8_t innerVerticalWallX;\r\nextern uint8_t innerVerticalWallY;\r\nextern uint8_t innerVerticalWallLength;\r\n\r\nextern uint8_t innerHorizontalWallX;\r\nextern uint8_t innerHorizontalWallY;\r\nextern uint8_t innerHorizontalWallLength;\r\n\r\nextern uint8_t maxGhostsOnScreen;\r\n\r\nextern uint8_t isInnerVerticalWallLevel;\r\n\r\nextern uint16_t ghostSlowDown;\r\n\r\nextern Image FAST_GHOST_IMAGE;\r\n\r\n\r\n#define GHOST_RANDOM_CONDITION() ((_XL_RAND())>ghostSlowDown)\r\n\r\n#define FAST_GHOST_RANDOM_CONDITION() ((_XL_RAND())>FAST_GHOST_SLOWDOWN)\r\n\r\n\r\nuint8_t ghost_move_condition(void)\r\n{\r\n    return GHOST_RANDOM_CONDITION();\r\n}\r\n\r\nuint8_t fast_ghost_move_condition(void)\r\n{\r\n    return FAST_GHOST_RANDOM_CONDITION();\r\n}\r\n\r\n\r\n// Required by horizontal missile\r\nuint8_t moveCharacter(register uint8_t *hunterOffsetPtr, register uint8_t *preyOffsetPtr)\r\n{\r\n    if((uint8_t) *((uint8_t *)hunterOffsetPtr) < (uint8_t) *((uint8_t *)preyOffsetPtr))\r\n    {\r\n        ++(*((uint8_t *) hunterOffsetPtr));\r\n    }\r\n    else if((uint8_t) *((uint8_t *) hunterOffsetPtr) > (uint8_t) *((uint8_t *)preyOffsetPtr))\r\n    {\r\n        --(*((uint8_t *) hunterOffsetPtr));\r\n    }    \r\n    else\r\n    {\r\n        return 0;\r\n    }\r\n    return 1;\r\n}\r\n\r\n\r\nvoid blindChaseCharacterXStrategy(Character* hunterPtr)\r\n{\r\n    deleteGhost(hunterPtr);\r\n    if(moveCharacter((uint8_t *)hunterPtr + X_MOVE, \r\n                     (uint8_t *)&player + X_MOVE))\r\n    {\r\n        return;\r\n    }\r\n    else\r\n    {\r\n        (void) moveCharacter((uint8_t *)hunterPtr + Y_MOVE, \r\n                      (uint8_t *)&player + Y_MOVE);\r\n    }\r\n}\r\n\r\n\r\nvoid blindChaseCharacterYStrategy(Character* hunterPtr)\r\n{\r\n    deleteGhost(hunterPtr);\r\n    if(moveCharacter((uint8_t *)hunterPtr + Y_MOVE, \r\n                     (uint8_t *)&player + Y_MOVE))\r\n    {\r\n        return;\r\n    }\r\n    else\r\n    {\r\n        (void) moveCharacter((uint8_t *)hunterPtr + X_MOVE, \r\n                      (uint8_t *)&player + X_MOVE);\r\n    }\r\n}\r\n\r\n\r\nuint8_t inHorizontalCorridor(Character *hunterPtr)\r\n{\r\n    return (hunterPtr->_y<innerVerticalWallY-1) || (hunterPtr->_y>YSize-innerVerticalWallY);\r\n}\r\n    \r\nuint8_t leftSide(Character *characterPtr)\r\n{\r\n    return characterPtr->_x < (XSize/2);\r\n}    \r\n\r\nuint8_t rightSide(Character *characterPtr)\r\n{\r\n    return characterPtr->_x > (XSize/2);\r\n}\r\n\r\nuint8_t sameSide(Character *hunterPtr)\r\n{\r\n    return ((leftSide(&player) && leftSide(hunterPtr)) || (rightSide(&player) && rightSide(hunterPtr)));\r\n}\r\n\r\n\r\n// strategy: \r\n// 4 means do no prefer horizontal to vertical movement\r\n// 0 means always horizontal\r\n// 9 means always vertical\r\n#if !defined(SIMPLE_STRATEGY)\r\nvoid verticalWallMoveTowardCharacter(register Character *hunterPtr, uint8_t strategy)\r\n{\r\n    if(sameSide(hunterPtr)) // same side\r\n    {\r\n        #if defined(DEBUG_STRATEGY)\r\n        gotoxy(4,1);cprintf(\"same vertical side      \");           \r\n        #endif\r\n        if((_XL_RAND()&7) > strategy) // Select blind chase strategy\r\n            { // 0 - 4\r\n                blindChaseCharacterXStrategy(hunterPtr);    \r\n            }\r\n            else\r\n            { // 5 - 9\r\n                blindChaseCharacterYStrategy(hunterPtr);\r\n            }            \r\n    }\r\n    else if(inHorizontalCorridor(hunterPtr)) // hunter in vertical corridor\r\n    {\r\n        #if defined(DEBUG_STRATEGY)   \r\n        gotoxy(4,1);cprintf(\"in horizontal corridor  \");           \r\n        #endif\r\n        blindChaseCharacterXStrategy(hunterPtr);            \r\n    }\r\n    else if((player._x)!=(XSize/2)) // hunter behind the wall\r\n    {\r\n        #if defined(DEBUG_STRATEGY)        \r\n        gotoxy(4,1);cprintf(\"behind the wall         \");\r\n        #endif\r\n        deleteGhost(hunterPtr);\r\n        if(hunterPtr->_y>(YSize/2))\r\n        {\r\n            ++(hunterPtr->_y);\r\n        } \r\n        else \r\n        {\r\n            --(hunterPtr->_y);\r\n        }                \r\n    }\r\n    else // prey aligned with the wall\r\n    {\r\n        #if defined(DEBUG_STRATEGY)\r\n        gotoxy(4,1);cprintf(\"aligned with the wall  \");          \r\n        #endif\r\n        if(hunterPtr->_x==XSize/2) // both aligned with the wall\r\n        {\r\n            deleteGhost(hunterPtr);\r\n            ++(hunterPtr->_x);\r\n        }\r\n        else\r\n        {\r\n            blindChaseCharacterYStrategy(hunterPtr);\r\n        }            \r\n    }\r\n}\r\n#else\r\nvoid verticalWallMoveTowardCharacter(register Character *hunterPtr)\r\n{\r\n    if(sameSide(hunterPtr)) // same side\r\n    {\r\n        #if defined(DEBUG_STRATEGY)\r\n        gotoxy(4,1);cprintf(\"same vertical side      \");           \r\n        #endif\r\n        if((_XL_RAND()&7) > 3) // Select blind chase strategy\r\n            { // 0 - 4\r\n                blindChaseCharacterXStrategy(hunterPtr);    \r\n            }\r\n            else\r\n            { // 5 - 9\r\n                blindChaseCharacterYStrategy(hunterPtr);\r\n            }            \r\n    }\r\n    else if(inHorizontalCorridor(hunterPtr)) // hunter in vertical corridor\r\n    {\r\n        #if defined(DEBUG_STRATEGY)   \r\n        gotoxy(4,1);cprintf(\"in horizontal corridor  \");           \r\n        #endif\r\n        blindChaseCharacterXStrategy(hunterPtr);            \r\n    }\r\n    else if((player._x)!=(XSize/2)) // hunter behind the wall\r\n    {\r\n        #if defined(DEBUG_STRATEGY)        \r\n        gotoxy(4,1);cprintf(\"behind the wall         \");\r\n        #endif\r\n        deleteGhost(hunterPtr);\r\n        if(hunterPtr->_y>(YSize/2))\r\n        {\r\n            ++(hunterPtr->_y);\r\n        } \r\n        else \r\n        {\r\n            --(hunterPtr->_y);\r\n        }                \r\n    }\r\n    else // prey aligned with the wall\r\n    {\r\n        #if defined(DEBUG_STRATEGY)\r\n        gotoxy(4,1);cprintf(\"aligned with the wall  \");          \r\n        #endif\r\n        if(hunterPtr->_x==XSize/2) // both aligned with the wall\r\n        {\r\n            deleteGhost(hunterPtr);\r\n            ++(hunterPtr->_x);\r\n        }\r\n        else\r\n        {\r\n            blindChaseCharacterYStrategy(hunterPtr);\r\n        }            \r\n    }\r\n    \r\n}\r\n#endif\r\n\r\n\r\n#if !defined(NO_HORIZONTAL_LEVEL)\r\n\r\n    uint8_t inVerticalCorridor(Character *hunterPtr)\r\n    {\r\n        return (hunterPtr->_x<innerHorizontalWallX-1) || (hunterPtr->_x>XSize-innerHorizontalWallX+1); // TODO: To check this\r\n    }\r\n\r\n    uint8_t topSide(Character *characterPtr)\r\n    {\r\n        return characterPtr->_y < (YSize/2);\r\n    }    \r\n\r\n    uint8_t bottomSide(Character *characterPtr)\r\n    {\r\n        return characterPtr->_y > (YSize/2);\r\n    }\r\n\r\n    uint8_t sameHorizontalSide(Character *hunterPtr)\r\n    {\r\n        return ((topSide(&player) && topSide(hunterPtr)) || (bottomSide(&player) && bottomSide(hunterPtr)));\r\n    }\r\n\r\n\r\n    #if !defined(SIMPLE_STRATEGY)\r\n    void horizontalWallMoveTowardCharacter(register Character *hunterPtr, uint8_t strategy)\r\n    {\r\n        if(sameHorizontalSide(hunterPtr))\r\n        {\r\n            #if defined(DEBUG_STRATEGY)\r\n            gotoxy(4,1);cprintf(\"same horizontal side  \");   \r\n            #endif\r\n            if((_XL_RAND()&7) > strategy) // Select blind chase strategy\r\n                { // 0 - 4\r\n                    blindChaseCharacterXStrategy(hunterPtr);    \r\n                }\r\n                else\r\n                { // 5 - 9\r\n                    blindChaseCharacterYStrategy(hunterPtr);\r\n                }            \r\n        }\r\n        else if(inVerticalCorridor(hunterPtr))\r\n        {\r\n            #if defined(DEBUG_STRATEGY) \r\n            gotoxy(4,1);cprintf(\"in vertical corridor  \");        \r\n            #endif\r\n            blindChaseCharacterYStrategy(hunterPtr);            \r\n        }\r\n        else if((player._y)!=(YSize/2))\r\n        {\r\n            #if defined(DEBUG_STRATEGY)        \r\n            gotoxy(4,1);cprintf(\"behind the wall       \");          \r\n            #endif\r\n            deleteGhost(hunterPtr);\r\n            if(hunterPtr->_x>(XSize/2))\r\n            {\r\n                ++(hunterPtr->_x);\r\n            } \r\n            else \r\n            {\r\n                --(hunterPtr->_x);\r\n            }                \r\n        }\r\n        else\r\n        {\r\n            #if defined(DEBUG_STRATEGY)        \r\n            gotoxy(4,1);cprintf(\"aligned with the wall \");         \r\n            #endif\r\n            if(hunterPtr->_y==YSize/2)\r\n            {\r\n                deleteGhost(hunterPtr);\r\n                ++(hunterPtr->_y);\r\n            }\r\n            else\r\n            {\r\n                blindChaseCharacterXStrategy(hunterPtr);\r\n            }            \r\n        }\r\n    }\r\n    #else\r\n    void horizontalWallMoveTowardCharacter(register Character *hunterPtr)\r\n    {\r\n        if(sameHorizontalSide(hunterPtr))\r\n        {\r\n            #if defined(DEBUG_STRATEGY)\r\n            gotoxy(4,1);cprintf(\"same horizontal side  \");   \r\n            #endif\r\n            if((_XL_RAND()&7) > 3) // Select blind chase strategy\r\n                { // 0 - 4\r\n                    blindChaseCharacterXStrategy(hunterPtr);    \r\n                }\r\n                else\r\n                { // 5 - 9\r\n                    blindChaseCharacterYStrategy(hunterPtr);\r\n                }            \r\n        }\r\n        else if(inVerticalCorridor(hunterPtr))\r\n        {\r\n            #if defined(DEBUG_STRATEGY) \r\n            gotoxy(4,1);cprintf(\"in vertical corridor  \");        \r\n            #endif\r\n            blindChaseCharacterYStrategy(hunterPtr);            \r\n        }\r\n        else if((player._y)!=(YSize/2))\r\n        {\r\n            #if defined(DEBUG_STRATEGY)        \r\n            gotoxy(4,1);cprintf(\"behind the wall       \");          \r\n            #endif\r\n            deleteGhost(hunterPtr);\r\n            if(hunterPtr->_x>(XSize/2))\r\n            {\r\n                ++(hunterPtr->_x);\r\n            } \r\n            else \r\n            {\r\n                --(hunterPtr->_x);\r\n            }                \r\n        }\r\n        else\r\n        {\r\n            #if defined(DEBUG_STRATEGY)        \r\n            gotoxy(4,1);cprintf(\"aligned with the wall \");         \r\n            #endif\r\n            if(hunterPtr->_y==YSize/2)\r\n            {\r\n                deleteGhost(hunterPtr);\r\n                ++(hunterPtr->_y);\r\n            }\r\n            else\r\n            {\r\n                blindChaseCharacterXStrategy(hunterPtr);\r\n            }            \r\n        }\r\n    }\r\n    #endif\r\n#endif\r\n\r\n\r\nvoid skullMoveTowardCharacter(Character *hunterPtr, uint8_t strategy)\r\n{\r\n    if((_XL_RAND()&7) > strategy) // Select blind chase strategy\r\n        { // 0 - 4\r\n            blindChaseCharacterXStrategy(hunterPtr);    \r\n        }\r\n        else\r\n        { // 5 - 9\r\n            blindChaseCharacterYStrategy(hunterPtr);\r\n        }\r\n}\r\n\r\n\r\n#if !defined(SIMPLE_STRATEGY)\r\nvoid computeStrategy(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t skew = level / 8;\r\n    \r\n    for(i=0; i<2; ++i) // 3 (if total=8)\r\n    {\r\n        strategyArray[i] = 4+skew; // 5,6,7,8 prefer Y (60%, 70%, 80%, 90)\r\n        strategyArray[3-i] = 2-skew; // 3,2,1,0 prefer X (60%, 70%, 80%, 90%)\r\n            \r\n    }\r\n    for(i=4;i<maxGhostsOnScreen;++i)\r\n    {\r\n        strategyArray[i] = 3;\r\n    }\r\n}\r\n#endif\r\n\r\n\r\n// Ghosts move to new positions if they get their chanche\r\nvoid chaseCharacter(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    _XL_WAIT_VSYNC();\r\n    #if defined(DEBUG_GHOST_DISPLAY)\r\n        SET_DEBUG_BORDER();\r\n    #endif\r\n    for(i=0;i<maxGhostsOnScreen;++i)\r\n    {\r\n        if(ghosts[i]._status)    \r\n        {\r\n            if(((ghosts[i]._imagePtr==&FAST_GHOST_IMAGE)&&(fast_ghost_move_condition())) || ghost_move_condition())\r\n            {\r\n                #if !defined(NO_HORIZONTAL_LEVEL)\r\n                if(isInnerVerticalWallLevel)\r\n                {\r\n                    #if !defined(SIMPLE_STRATEGY)\r\n                        verticalWallMoveTowardCharacter((Character *)&ghosts[i], strategyArray[i]);    \r\n                    #else\r\n                        verticalWallMoveTowardCharacter((Character *)&ghosts[i]);        \r\n                    #endif\r\n                }\r\n                else\r\n                {\r\n                    #if !defined(SIMPLE_STRATEGY)\r\n                        horizontalWallMoveTowardCharacter((Character *)&ghosts[i], strategyArray[i]);    \r\n                    #else\r\n                        horizontalWallMoveTowardCharacter((Character *)&ghosts[i]);        \r\n                    #endif\r\n                }\r\n                #else\r\n                    #if !defined(SIMPLE_STRATEGY)\r\n                        verticalWallMoveTowardCharacter((Character *)&ghosts[i], strategyArray[i]);    \r\n                    #else\r\n                        verticalWallMoveTowardCharacter((Character *)&ghosts[i]);        \r\n                    #endif\r\n                #endif\r\n            }\r\n            displayGhost(&ghosts[i]);\r\n        }\r\n    }\r\n    /*\r\n    \r\n    if(isInnerVerticalWallLevel)\r\n    {\r\n        for(i=0;i<maxGhostsOnScreen;++i)\r\n        {\r\n            if(ghosts[i]._status)    \r\n            {\r\n                if(((ghosts[i]._status==2)&&(fast_ghost_move_condition())) || ghost_move_condition())\r\n                {\r\n                    #if !defined(SIMPLE_STRATEGY)\r\n                        verticalWallMoveTowardCharacter((Character *)&ghosts[i], strategyArray[i]);    \r\n                    #else\r\n                        verticalWallMoveTowardCharacter((Character *)&ghosts[i]);        \r\n                    #endif\r\n                }\r\n                displayGhost(&ghosts[i]);\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        for(i=0;i<maxGhostsOnScreen;++i)\r\n        {\r\n            if(ghosts[i]._status)\r\n            {\r\n                if(((ghosts[i]._status==2)&&(fast_ghost_move_condition())) || ghost_move_condition())\r\n                {\r\n                    #if !defined(SIMPLE_STRATEGY)\r\n                        horizontalWallMoveTowardCharacter((Character *)&ghosts[i], strategyArray[i]);    \r\n                    #else\r\n                        horizontalWallMoveTowardCharacter((Character *)&ghosts[i]);        \r\n                    #endif\r\n                }\r\n                displayGhost(&ghosts[i]);\r\n            }\r\n        }  \r\n    }\r\n    \r\n    */\r\n    #if defined(DEBUG_GHOST_DISPLAY)\r\n        UNSET_DEBUG_BORDER();\r\n    #endif\r\n}\r\n\r\n"
  },
  {
    "path": "src/games/shoot/strategy.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n \r\n#ifndef _STRATEGY\r\n#define _STRATEGY\r\n\r\n\r\n#define X_MOVE 0\r\n#define Y_MOVE 1\r\n\r\n\r\n#include \"character.h\"\r\n\r\nuint8_t innerWallBetween(Character *hunterPtr);\r\n\r\n// Required by horizontal missile\r\nuint8_t moveCharacter(uint8_t *hunterOffsetPtr, uint8_t *preyOffsetPtr);\r\n\r\nvoid blindChaseCharacterXStrategy(Character* hunterPtr);\r\nvoid blindChaseCharacterYStrategy(Character* hunterPtr);\r\n\r\n#if !defined(SIMPLE_STRATEGY)\r\nvoid verticalWallMoveTowardCharacter(register Character *hunterPtr, uint8_t strategy);\r\nvoid horizontalWallMoveTowardCharacter(register Character *hunterPtr, uint8_t strategy);\r\n#else\r\nvoid verticalWallMoveTowardCharacter(register Character *hunterPtr);\r\nvoid horizontalWallMoveTowardCharacter(register Character *hunterPtr);\r\n#endif\r\n\r\n\r\nvoid skullMoveTowardCharacter(Character *hunterPtr, uint8_t strategy);\r\n\r\n\r\n#if !defined(SIMPLE_STRATEGY)\r\n    void computeStrategy(void);\r\n#endif\r\n\r\n\r\nvoid chaseCharacter(void);    \r\n\r\n    \r\n#endif // _STRATEGY\r\n\r\n"
  },
  {
    "path": "src/games/shoot/text_strings.h",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#ifndef _TEXT_STRINGS_H\r\n#define _TEXT_STRINGS_H\r\n\r\n#define AUTHOR_STRING _XL_F _XL_a _XL_b _XL_r _XL_i _XL_z _XL_i _XL_o _XL_SPACE _XL_C _XL_a _XL_r _XL_u _XL_s _XL_o\r\n\r\n\r\n#if defined(TINY_GAME) || XSize<=22\r\n    #define CROSS_SHOOT_STRING _XL_S _XL_H _XL_O _XL_O _XL_T \r\n#else\r\n    #define CROSS_SHOOT_STRING \\\r\n        _XL_S _XL_SPACE _XL_H _XL_SPACE _XL_O _XL_SPACE _XL_O _XL_SPACE _XL_T \r\n#endif\r\n\r\n#define THE_STRING _XL_t _XL_h _XL_e\r\n#define SKULL_STRING _XL_s _XL_k _XL_u _XL_l _XL_l\r\n#define MISSILE_STRING _XL_m _XL_i _XL_s _XL_s _XL_i _XL_l _XL_e\r\n#define MISSILES_STRING  MISSILE_STRING _XL_s\r\n#define AND_STRING _XL_a _XL_n _XL_d\r\n// #define KILL_THE_SKULL_STRING _XL_K _XL_i _XL_l _XL_l _XL_SPACE THE_STRING _XL_SPACE SKULL_STRING\r\n\r\n#if XSize<=22\r\n    #define DESTROY_MISSILES_STRING _XL_D _XL_e _XL_s _XL_t _XL_r _XL_o _XL_y _XL_SPACE MISSILES_STRING\r\n#else\r\n    #define DESTROY_MISSILES_STRING _XL_D _XL_e _XL_s _XL_t _XL_r _XL_o _XL_y _XL_SPACE THE_STRING _XL_SPACE MISSILES_STRING\r\n#endif\r\n#define KILL_THEM_ALL__STRING _XL_K _XL_i _XL_l _XL_l _XL_SPACE _XL_t _XL_h _XL_e _XL_m _XL_SPACE _XL_a _XL_l _XL_l\r\n#define KILL_ALL_SKULLS__STRING _XL_K _XL_I _XL_L _XL_L _XL_SPACE _XL_A _XL_L _XL_L _XL_SPACE _XL_S _XL_K _XL_U _XL_L _XL_L _XL_S\r\n#define KILL_SKULLS__STRING _XL_K _XL_I _XL_L _XL_L _XL_SPACE _XL_S _XL_K _XL_U _XL_L _XL_L _XL_S\r\n\r\n#define SCORE_STRING _XL_S _XL_C _XL_O _XL_R _XL_E\r\n#define LEVEL_STRING _XL_L _XL_E _XL_V _XL_E _XL_L\r\n#define START_LEVEL_STRING LEVEL_STRING _XL_SPACE \r\n#define BEFORE__TO_UNLOCK__STRING _XL_B _XL_E _XL_F _XL_O _XL_R _XL_E _XL_SPACE _XL_SPACE _XL_SPACE _XL_T _XL_O _XL_SPACE _XL_U _XL_N _XL_L _XL_O _XL_C _XL_K\r\n#define ITEMS__STRING _XL_I _XL_T _XL_E _XL_M _XL_S\r\n#define SKULLS___AND__STRING SKULL_STRING _XL_s _XL_SPACE _XL_SPACE _XL_SPACE AND_STRING\r\n#define DESTROY_MISSILES__STRING _XL_D _XL_E _XL_S _XL_T _XL_R _XL_O _XL_Y _XL_SPACE _XL_M _XL_I _XL_S _XL_S _XL_I _XL_L _XL_E _XL_S\r\n#define FOR_POINTS_AND___STRING _XL_f _XL_o _XL_r _XL_SPACE _XL_p _XL_o _XL_i _XL_n _XL_i _XL_s\r\n#define EXTRA_POWERUPS__STRING AND_STRING _XL_SPACE _XL_i _XL_t _XL_e _XL_m _XL_s\r\n\r\n#if defined(LESS_TEXT)\r\n    #define PRESS_STRING _XL_G _XL_O\r\n#else\r\n    #if !defined(_XL_NO_JOYSTICK)\r\n        #define PRESS_STRING _XL_P _XL_r _XL_e _XL_s _XL_s _XL_SPACE _XL_f _XL_i _XL_r _XL_e\r\n    #else\r\n        #define PRESS_STRING _XL_P _XL_r _XL_e _XL_s _XL_s _XL_SPACE _XL_k _XL_e _XL_y\r\n    #endif\r\n#endif\r\n\r\n#define GAME_OVER_STRING _XL_G _XL_A _XL_M _XL_E _XL_SPACE _XL_O _XL_V _XL_E _XL_R\r\n#define YOU_MADE_IT_STRING THE_STRING _XL_SPACE _XL_E _XL_N _XL_D\r\n\r\n#define DEFEAT_STRING _XL_Y _XL_o _XL_u _XL_SPACE _XL_l _XL_o _XL_s _XL_t\r\n#define VICTORY_STRING _XL_Y _XL_o _XL_u _XL_SPACE _XL_w _XL_o _XL_n\r\n#define SECOND_ROUND_STRING _XL_W _XL_E _XL_L _XL_L _XL_SPACE _XL_D _XL_O _XL_N _XL_E\r\n\r\n\r\n#define _USE_STRING _XL_U _XL_s _XL_e\r\n\r\n#if defined(_XL_ARROW_KEYS)\r\n    #define USE_STRING _USE_STRING _XL_SPACE \"ARROWS\"\r\n\t#define USE_LEN 14\r\n#elif !defined(_XL_NO_JOYSTICK)\r\n    #define USE_STRING _USE_STRING _XL_SPACE THE_STRING _XL_SPACE _XL_j _XL_o _XL_y _XL_s _XL_t _XL_i _XL_c _XL_k\r\n\t#define USE_LEN 16\r\n#elif defined(TINY_GAME) \r\n    #define USE_STRING _USE_STRING _XL_SPACE _XL_UP_KEY _XL_LEFT_KEY _XL_DOWN_KEY _XL_RIGHT_KEY\r\n\t#define USE_LEN 8\r\n#elif XSize<=16\r\n    #define USE_STRING _USE_STRING _XL_SPACE _XL_UP_KEY _XL_LEFT_KEY _XL_DOWN_KEY _XL_RIGHT_KEY _XL_SPACE _XL_S _XL_P _XL_A _XL_C _XL_E\t\r\n\t#define USE_LEN 14\r\n#else\r\n    #define USE_STRING _USE_STRING _XL_SPACE _XL_UP_KEY _XL_SPACE _XL_LEFT_KEY _XL_SPACE _XL_DOWN_KEY _XL_SPACE _XL_RIGHT_KEY _XL_SPACE _XL_S _XL_P _XL_A _XL_C _XL_E\t\t\r\n\t#define USE_LEN 17\r\n#endif\t\r\n\r\n#define EMPTY_STRING        _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE _XL_SPACE\r\n\r\n#define _SECRET_STRING _XL_S _XL_E _XL_C _XL_R _XL_E _XL_T\r\n#define DISCOVERED_SECRETS_STRING _SECRET_STRING _XL_S\r\n#define OF_STRING _XL_O _XL_F _XL_SPACE\r\n#define GAME_COMPLETED_STRING _XL_V _XL_I _XL_C _XL_T _XL_O _XL_R _XL_Y\r\n#define FOUND_STRING _XL_F _XL_O _XL_U _XL_N _XL_D\r\n#define SECRET_LEVEL_FOUND_STRING _SECRET_STRING _XL_SPACE LEVEL_STRING _XL_SPACE FOUND_STRING\r\n#define SECRET_FOUND_STRING _SECRET_STRING _XL_SPACE FOUND_STRING\r\n#define _KILL_STRING _XL_K _XL_I _XL_L _XL_L \r\n#define KILL_THE_SKULLS_STRING _KILL_STRING _XL_SPACE THE_STRING _XL_SPACE _XL_S _XL_K _XL_U _XL_L _XL_L _XL_S\r\n#define KILL_THE_BOSS _KILL_STRING _XL_SPACE THE_STRING _XL_SPACE _XL_B _XL_O _XL_S _XL_S\r\n\r\n#define HIGH_SCORE_STRING _XL_H _XL_I _XL_S _XL_C _XL_O _XL_R _XL_E _XL_SPACE\r\n\r\n#endif // _TEXT_STRINGS_H\r\n\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,51"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile1.txt",
    "content": "12,30,12,51,45,12,18,51"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile12.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile13.txt",
    "content": "0,63,21,63,63,21,63,0"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile19.txt",
    "content": "0,0,0,12,18,12,51\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile2.txt",
    "content": "12,26,12,31,44,12,10,10"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile20.txt",
    "content": "45,12,18,51,0,0,0,0\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,12,30,12,51"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile22.txt",
    "content": "1,3,1,7,1,1,2,2\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile23.txt",
    "content": "32,48,32,56,32,32,16,16\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile24.txt",
    "content": "45,18,51,45,45,51,18,45\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile26.txt",
    "content": "12,30,45,45,30,12,30,51\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile3.txt",
    "content": "12,22,12,62,13,12,20,20"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile4.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile5.txt",
    "content": "30,33,51,45,45,51,33,30"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile6.txt",
    "content": "45,30,63,45,30,12,30,51"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile7.txt",
    "content": "30,33,51,33,33,18,18,12"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/games/shoot/tiles/6x8/tile9.txt",
    "content": "33,18,12,26,22,12,18,33"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,51,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile1.txt",
    "content": "12,30,12,51,45,12,18,51,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile10.txt",
    "content": "12,18,12,51, 0,12, 0,51,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0, 0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile12.txt",
    "content": "12,12,28,12,12,14,12,12, 12"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile13.txt",
    "content": "0, 0, 0,63,63,00,00,00,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile16.txt",
    "content": "12,30,30,30,63,45,33,33,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile17.txt",
    "content": "0,30,51,55,51,22,20,12,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile18.txt",
    "content": "0,30,43,43,35,42,30,12,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile19.txt",
    "content": "0,0,0,0,12,18,12,51\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile2.txt",
    "content": "12,26,12,31,44,12,10,10,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile20.txt",
    "content": "45,12,18,51,0,0,0,0,0\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,12,30,12,51"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile22.txt",
    "content": "1,3,1,7,1,1,2,2,2\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile23.txt",
    "content": "32,48,32,56,32,32,16,16,16\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile24.txt",
    "content": "45,18,51,45,45,51,18,45,0\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile26.txt",
    "content": "12,30,45,45,30,12,30,51,0\r\n"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile3.txt",
    "content": "12,22,12,62,13,12,20,20,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile4.txt",
    "content": "12,30,63,45,30,12,30,51,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile5.txt",
    "content": "30,33,51,45,45,51,33,30,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile6.txt",
    "content": "45,30,63,45,30,12,30,51,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile7.txt",
    "content": "30,33,51,33,33,18,18,12,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile8.txt",
    "content": "0,30,51,55,51,26,18,12,0"
  },
  {
    "path": "src/games/shoot/tiles/6x9/tile9.txt",
    "content": "33,18,12,26,22,12,18,33,0"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile0.txt",
    "content": "28,20,8,62,85,8,20,20"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile1.txt",
    "content": "28,28,8,62,85,8,20,20"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile10.txt",
    "content": "28,20,0,62,0,8,0,20"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile11.txt",
    "content": "0, 0, 4,28,14, 8, 0, 0"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile12.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile13.txt",
    "content": "0,127,85,127,85,127,85,0"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile14.txt",
    "content": "0, 0,56,31,31,56, 0, 0"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile15.txt",
    "content": "0, 0, 7,62,62, 7, 0, 0"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile16.txt",
    "content": "12,30,30,30,63,45,33,33"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile17.txt",
    "content": "0,30,51,55,51,22,20,12"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile18.txt",
    "content": "0,30,43,43,35,42,30,12"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile19.txt",
    "content": "0,0,0,0,28,20,8,62\r\n"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile2.txt",
    "content": "28,24,9,62,84,12,20,18"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile20.txt",
    "content": "85,8,20,20,0,0,0,0"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,28,28,8,62\r\n"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile22.txt",
    "content": "1,1,0,7,1,0,1,1"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile23.txt",
    "content": "96,96,64,120,32,64,32,32"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile24.txt",
    "content": "93,34,85,93,93,85,34,93"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile25.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile26.txt",
    "content": "28,62,73,73,62,20,62,107\r\n"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile3.txt",
    "content": "28,12,72,62,21,24,20,36"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile4.txt",
    "content": "12,30,63,45,30,12,30,51"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile5.txt",
    "content": "62,65,107,85,85,107,65,62\r\n"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile6.txt",
    "content": "45,30,63,45,30,12,30,51"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile7.txt",
    "content": "62,65,85,65,73,42,34,28"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile8.txt",
    "content": "0,30,51,55,51,26,18,12"
  },
  {
    "path": "src/games/shoot/tiles/7x8/tile9.txt",
    "content": "33,18,12,26,22,12,18,33"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile0.txt",
    "content": "24,24,102,189,36,36"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile1.txt",
    "content": "24,24,126,189,36,36\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile10.txt",
    "content": "24,0,102,129,36,36 "
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile11.txt",
    "content": "0,8,56,28,16,0\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile12.txt",
    "content": "126,90,126,90,126,90\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile13.txt",
    "content": "0,255,170,255,170,255\r\n\r\n "
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile14.txt",
    "content": "0,224,127,127,224,0"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile15.txt",
    "content": "0,7,254,254,7,0"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile16.txt",
    "content": "12,12,12,30,30,18\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile17.txt",
    "content": "126,227,239,231,110,60\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile18.txt",
    "content": "126,219,219,195,90,60\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile19.txt",
    "content": "0,0,0,24,24,102"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile2.txt",
    "content": "24,25,118,188,20,18\r\n\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile20.txt",
    "content": "189,36,36,0,0,0"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile21.txt",
    "content": "0,0,0,24,24,126"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile22.txt",
    "content": "1,1,14,3,2,2"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile23.txt",
    "content": "128,128,112,192,64,64"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile24.txt",
    "content": "189,102,153,153,102,189"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile25.txt",
    "content": "8,62,104,60,10,124\r\n "
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile26.txt",
    "content": "126,153,153,126,36,219"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile3.txt",
    "content": "24,152,110,61,40,72\r\n\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile4.txt",
    "content": "126,255,153,126,60,219"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile5.txt",
    "content": "126,165,153,153,165,126 "
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile6.txt",
    "content": "189,255,153,126,60,219"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile7.txt",
    "content": "126,165,129,90,66,60"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile8.txt",
    "content": "126,227,239,247,70,60\r\n"
  },
  {
    "path": "src/games/shoot/tiles/8x6/tile9.txt",
    "content": "129,90,52,44,90,129"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,102"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile1.txt",
    "content": "24, 60, 24,102,153, 24, 36,102"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile10.txt",
    "content": "24, 36, 24,  0,153,  0, 36,102"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile11.txt",
    "content": "0,  0,  8, 56, 28, 16,  0,  0"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile12.txt",
    "content": "90,126,90,126,90,126,90,126"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile13.txt",
    "content": "0,255,170,255,255,170,255,0"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile14.txt",
    "content": "0,  0,240, 63, 63,240,  0,  0"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile15.txt",
    "content": "0,  0, 15,252,252, 15,  0,  0"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile16.txt",
    "content": "24, 60, 60, 60,126, 90, 66, 66"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile17.txt",
    "content": "0,60,66,207,195,102,36,24"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile18.txt",
    "content": "0,60,90,219,195,90,60,24"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile19.txt",
    "content": "0,0,0,0,24,36,24,102"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile2.txt",
    "content": "24, 52, 25,118,152, 24, 20, 20"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile20.txt",
    "content": "153,24,36,102,0,0,0,0"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,24,60,24,102"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile22.txt",
    "content": "1,3,1,15,1,1,2,2"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile23.txt",
    "content": "128,192,128,240,128,128,64,64"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile24.txt",
    "content": "189, 66,165,153,153,165, 66, 189"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile26.txt",
    "content": "60,126,153,153,126,36,126,219"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile3.txt",
    "content": "24, 44,152,110, 25, 24, 40, 40"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile4.txt",
    "content": "60,126,255,153,126,60,126,219"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile5.txt",
    "content": "60, 66,165,153,153,165, 66, 60"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile6.txt",
    "content": "189,126,153,219,126,60,126,219"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile7.txt",
    "content": "60, 66,165,129, 90, 36, 36, 60"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile8.txt",
    "content": "0, 60, 102,223,231,122, 36, 24"
  },
  {
    "path": "src/games/shoot/tiles/8x8/tile9.txt",
    "content": "129,66,24,52,44,24,66,129"
  },
  {
    "path": "src/games/shoot/variables.h",
    "content": "#ifndef _VARIABLES_H\n#define _VARIABLES_H\n\n#if defined(BENCHMARK)\n    #if !defined(BENCHMARK_MAX)\n        #define BENCHMARK_MAX 70\n    #endif\n    \n    clock_t Ticks, TicksDelta;\n    unsigned int Sec;\n    unsigned int Milli; \n\n    uint16_t benchmark_count;\n#endif\n\n#if defined(TRANSITION_ANIMATION)\n    uint8_t old_x;\n    uint8_t old_y;\n    uint8_t moved;\n#endif\n\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS) || (defined(USE_TINY_MEMORY_BUFFERS) && defined(_XL_TURN_BASED))\n    extern uint16_t loop;\n#else\n    uint16_t loop;\t\n#endif\t\n\n\n#if !defined(NO_BLINKING)\n\t#if defined(USE_MEMORY_BUFFERS)\n\t\textern uint8_t playerBlink;\t\n\t#else\n\t\tuint8_t playerBlink;\n\t#endif\n#endif\n\n\n#if defined(USE_MEMORY_BUFFERS)\n    extern uint16_t ghostLevel;\n#else\n    uint16_t ghostLevel;\n#endif\n\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n    extern uint16_t skullSlowDown;\n    extern uint8_t skullXCountDown;\n    extern uint8_t skullYCountDown;\n    extern uint8_t bulletDirection[BULLETS_NUMBER];\t\t\n#else\n    uint16_t skullSlowDown;\t\t\n    uint8_t skullXCountDown;\n    uint8_t skullYCountDown;\n    uint8_t bulletDirection[BULLETS_NUMBER];\n#endif\n\n\nextern Image SKULL_IMAGE;\nextern Image FIRE_CHARGE_IMAGE;\nextern Image BULLET_IMAGE;\nextern Image FIRE_POWER_IMAGE;\nextern Image EXTRA_POINTS_IMAGE;\t\nextern Image DEAD_GHOST_IMAGE;\n\n\n#if defined(USE_MEMORY_BUFFERS)\n    extern Character skull;\n    extern Character bullet;\t\n\n    Item fireCharge;\n    Item firePower;\n    extern Item extraPoints;\t\n#else\n    Character skull;\n    Item fireCharge;\n    Item firePower;\n    Item extraPoints;\t\n    \n    Character bullet;\n#endif\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_TINY_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n\textern Character ghosts[];\n\textern Character bombs[];\n\t\n\textern Character player;\n\t\n\textern uint16_t ghostSlowDown;\n\textern uint16_t points;\n\textern uint16_t highScore;\n\n\textern uint8_t lives;\n\textern uint8_t level;\t\n\t\n\textern uint8_t ghostCount; // = GHOSTS_NUMBER;\n\t\n\textern uint8_t ind;\n\n#else\n\tCharacter ghosts[GHOSTS_NUMBER];\n\tCharacter bombs[BOMBS_NUMBER];\n\n\tCharacter player; \n\n\tuint16_t ghostSlowDown;\n\tuint16_t points;\n\tuint16_t highScore;\t\n\t\n\tuint8_t lives;\n\tuint8_t level;\t\n\t\n\tuint8_t ghostCount; // = GHOSTS_NUMBER;\n\t\n\tuint8_t ind;\n\t\n#endif\n\n\n#if defined(USE_MEMORY_BUFFERS)\n    Item calmDown;\n    Item bombCharge;\n    extern Item freeze;\n    extern Item invincibility;\n    extern Item extraLife;\n    extern Item super;\n    extern Item confuse;\n    Item suicide;\n    Item destroyer;\n\n    extern Character leftHorizontalMissile;\n    extern Character rightHorizontalMissile;\n    extern Character chasingBullet;\n\n    extern Character * chasedEnemyPtr;\n    extern Character * chasedByGhosts;\n    extern uint8_t rockets_x[];\n    uint8_t rocketsOnScreen;\n\n    extern uint8_t extraLife_present_on_level;\n    extern uint8_t super_present_on_level;\n    uint8_t confuse_present_on_level;\n    uint8_t suicide_present_on_level;\n    \n    uint8_t destroyed_bases;\n    \n    extern uint8_t arrowRange;\n    \n    extern uint8_t all_skulls_killed_in_completed_levels;\n    \n    uint8_t destroyed_bases_in_completed_levels;\n    \n    extern uint8_t horizontalWallsLength;\n    \n    extern uint8_t invincibilityActive;\n    \n    extern uint8_t confuseActive; \n        \n    uint8_t innerVerticalWallY; \n    // uint8_t innerVerticalWallX; \n    uint8_t innerVerticalWallLength;\n\n    uint8_t missileDestroyerActivated;\n    uint8_t bombDestroyerActivated;\n    uint8_t destroyerActive;\n    uint8_t destroyer_count_down;\n    uint8_t exploded_bombs;\n\n    uint8_t restart;\n#else\n    Item calmDown; \n    Item bombCharge;\t\t\n    Item freeze;\n    Item invincibility;\n    Item extraLife;\n    Item super;\n    Item confuse;\n    Item suicide;\n    Item destroyer;\n    \n    Character leftHorizontalMissile;\n    Character rightHorizontalMissile;\n    Character chasingBullet;\t\t\t\n    \n    Character * chasedEnemyPtr;\n    Character * chasedByGhosts;\n    uint8_t rockets_x[MAX_ROCKETS_NUMBER];\t\t\n    \n    uint8_t extraLife_present_on_level;\n    uint8_t super_present_on_level;\n    uint8_t suicide_present_on_level;\n    uint8_t confuse_present_on_level;\n\n    \n    uint8_t destroyed_bases;\n    uint8_t rocketsOnScreen;\n    \n    uint8_t arrowRange;\n    \n    uint8_t all_skulls_killed_in_completed_levels;\n    \n    uint8_t destroyed_bases_in_completed_levels;\n    \n    uint8_t horizontalWallsLength;\n    \n    uint8_t invincibilityActive;\n    \n    uint8_t confuseActive; \n    \n    uint8_t innerVerticalWallY; \n    // uint8_t innerVerticalWallX; \n    uint8_t innerVerticalWallLength;\n\n    uint8_t missileDestroyerActivated;\n    uint8_t bombDestroyerActivated;\n    uint8_t destroyerActive;\n    uint8_t destroyer_count_down;\n    uint8_t exploded_bombs;\n    uint8_t restart;\n#endif\n\n#if defined(USE_MEMORY_BUFFERS)\n    extern Character rockets[];\n\n    extern uint8_t invincibility_count_down;\t\n\n    extern uint8_t confuse_count_down;\n#else\n    Character rockets[MAX_ROCKETS_NUMBER];\n\n    uint8_t invincibility_count_down;\t\n\n    uint8_t confuse_count_down;\n\n#endif\n\t\n\n#if !defined(SIMPLE_STRATEGY)\n\t#if defined(USE_MEMORY_BUFFERS)\n\t\textern uint8_t strategyArray[GHOSTS_NUMBER];\t\n\t#else\n\t\tuint8_t strategyArray[GHOSTS_NUMBER];\n\t#endif\t\n#endif\n\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n    extern uint8_t freeze_count_down;\n    \n    extern uint8_t playerDirection; // 0: right, 1: down, 2: left, 3: up\n    extern uint8_t freezeActive; // freezeActive\t\t\t\n    extern uint8_t extraLifeThroughPointsCounter;\t\t\t\n#else\n    uint8_t freeze_count_down;\n    \n    uint8_t playerDirection; // 0: right, 1: down, 2: left, 3: up\n    uint8_t freezeActive; // freezeActive\t\n    uint8_t extraLifeThroughPointsCounter;\t\t\t\n#endif\n\n\n#if defined(USE_MEMORY_BUFFERS) || defined(USE_LIGHT_MEMORY_BUFFERS)\n    extern uint8_t playerFire;\n    extern uint8_t guns; \n    extern uint8_t skullActive;\t\t\n#else\n    uint8_t playerFire;\n    uint8_t guns; \n    uint8_t skullActive;\t\n#endif\n#\n\n#if defined(USE_MEMORY_BUFFERS)\n    extern uint8_t arrowYPosition;\n#else\n    uint8_t arrowYPosition;\n#endif\n\nuint8_t isBossLevel;\nuint8_t isOneMissileLevel;\nuint8_t isMissileLevel;\n// uint8_t isRocketLevel;\nuint8_t isInnerHorizontalWallLevel;\nuint8_t isInnerVerticalWallLevel;\n\nuint8_t skullsCount;\n\nuint8_t bulletStrength;\n\nuint8_t bombCount;\n\n// uint8_t reachedByGhost;\n    \nCharacter bullets[BULLETS_NUMBER];\n\nCharacter skulls[SKULLS_NUMBER];\n\n\n// uint8_t innerHorizontalWallY; \nuint8_t innerHorizontalWallX; \nuint8_t innerHorizontalWallLength;\n\nuint8_t maxGhostsOnScreen;\n\nuint8_t firePowerItemSecret;\nuint8_t firePowerLevelSecret;\n\nuint8_t fireChargeSecret;\nuint8_t calmDownSecret;\nuint8_t extraPointsSecret;\nuint8_t freezeSecret;\n\nuint8_t discoveredSecrets[SECRETS_NUMBER];\n\nuint8_t secretLevelActivated;\nuint8_t zeroLevelSecret;\n\nuint8_t nextLevel;\n#endif // _VARIABLES_H\n\n"
  },
  {
    "path": "src/games/shuriken/Makefile.shuriken",
    "content": "######################################################################\n# Makefile for CROSS-SHURIKEN\n\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c \n\nGAME_NAME := shuriken\n\nPARENT_DIR = games\n\nSOURCE_PATH := $(PARENT_DIR)/$(GAME_NAME)\n\n#-D_DEFAULT_ASCII\nDEFAULT_ASCII=\n\nGLOBAL_OPTS = $(DEFAULT_ASCII)\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\n\ninclude ./Makefile_common\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n"
  },
  {
    "path": "src/games/shuriken/config/game_config.mk",
    "content": "#\r\n\r\nCOCO_COLOR_GFX_GAME_OPTS ?= \r\n\r\nCREATIVISION_GAME_OPTS ?=  \r\n\r\nGAMATE_GAME_OPTS ?=\r\n\r\nC128_Z80_80COL_GAME_OPTS ?=  -DFEWER_SHURIKENS\r\n\r\nZX81_NO_GFX_GAME_OPTS ?=\r\n\r\nZX81_GFX_GAME_OPTS ?=  -DFEWER_SHURIKENS\r\n\r\nAPPLE2_GAME_OPTS ?= \r\n\r\nCOMX_GAME_OPTS ?= \r\n\r\nPECOM_GAME_OPTS ?= \r\n\r\nTMC600_GAME_OPTS ?= \r\n\r\nMICRO_GAME_OPTS ?= \r\n\r\nCAMPUTERS_LYNX_GAME_OPTS ?= -DFEWER_SHURIKENS\r\n\r\nVIC20_EXP_3K_GAME_OPTS ?= \r\n\r\nVIC20_UNEXPANDED_GAME_OPTS ?= \r\n\r\nSTDIO_GAME_OPTS ?= \r\n\r\nPV1000_GAME_OPTS ?= -DFEWER_SHURIKENS\r\n\r\nPHC25_GAME_OPTS ?= -DFEWER_SHURIKENS\r\n\r\nPHC25_MONO_GAME_OPTS ?= -DFEWER_SHURIKENS -D_XL_NO_SOUND"
  },
  {
    "path": "src/games/shuriken/config/project_config.mk",
    "content": "\r\n#####################################################################\r\n# DISPLAY FLAGS\r\n\r\nORIC_COLORS=\r\n# __MONO_COLORS\r\n\r\nMC10_COLORS=\r\n# __REVERSE_LETTERS\r\n\r\n\r\n4COLOR_PALETTE=\r\n#-D__USE_GREEN\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=0\r\n_APPLE2_SLOWDOWN=0\r\n_APPLE2ENH_SLOWDOWN=0\r\n_APPLE2_HGR_SLOWDOWN=0\r\n_APPLE2ENH_HGR_SLOWDOWN=0\r\n_ATARI_SLOWDOWN=180\r\n_ATARI5200_SLOWDOWN=180\r\n_ATARI7800_NO_COLOR_SLOWDOWN=100\r\n_ATARI7800_SLOWDOWN=140\r\n_ATARI_LYNX_SLOWDOWN=600\r\n_C128_8502_80COL_SLOWDOWN=40\r\n_C16_SLOWDOWN=70\r\n_C16_CONIO_SLOWDOWN=90\r\n_C64_SLOWDOWN=65\r\n_CX16_SLOWDOWN?=160\r\n_CBM610_SLOWDOWN=250\r\n_CBM510_SLOWDOWN=250\r\n_CREATIVISION_SLOWDOWN=70\r\n_GAMATE_SLOWDOWN=800\r\n_ORIC_SLOWDOWN=90\r\n_MEGA65_SLOWDOWN=650\r\n_NES_SLOWDOWN=140\r\n_PET_SLOWDOWN=60\r\n_PCE_SLOWDOWN=250\r\n_SUPERVISION_SLOWDOWN=500\r\n_VIC20_SLOWDOWN=160\r\n\r\n\r\n# Z88DK\r\n_AGON_SLOWDOWN=1900\r\n_AQUARIUS_SLOWDOWN=150\r\n_ACE_SLOWDOWN=0\r\n_BEE_SLOWDOWN=10\r\n_C128_Z80_40COL_SLOWDOWN=0\r\n_C128_Z80_80COL_SLOWDOWN=0\r\n_CAMPUTERS_LYNX_SLOWDOWN=0\r\n_COLECO_SLOWDOWN=30\r\n_CPC_MODE0_SLOWDOWN=0\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=0\r\n_CPC_MODE2_SLOWDOWN=0\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_E200_SLOWDOWN=500\r\n_G850_SLOWDOWN=500\r\n_G815_SLOWDOWN=500\r\n_GAL_SLOWDOWN=600\r\n_GAL_GFX_SLOWDOWN=500\r\n_GB_SLOWDOWN=60\r\n_GG_SLOWDOWN=70\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_GL6000SL_SLOWDOWN=90\r\n_HECTORHR_SLOWDOWN=2\r\n_LASER500_SLOWDOWN=20\r\n_M100_SLOWDOWN=40\r\n_M5_SLOWDOWN=14\r\n_MC1000_SLOWDOWN=10\r\n_MSX_SLOWDOWN=14\r\n_MTX500_SLOWDOWN=20\r\n_MTX512_SLOWDOWN=20\r\n_MZ_SLOWDOWN=250\r\n_PHC25_SLOWDOWN=130\r\n_PV1000_SLOWDOWN=10\r\n_SAMCOUPE_SLOWDOWN=60\r\n_SC3000_SLOWDOWN=20\r\n_SMC777_SLOWDOWN=8\r\n_SMS_SLOWDOWN=15\r\n_SPECTRUM_SLOWDOWN=15\r\n_TRS80_SLOWDOWN=0\r\n_VG5K_SLOWDOWN=220\r\n_VZ200_SLOWDOWN=220 \r\n_X07_SLOWDOWN=0\r\n_ZX81_SLOWDOWN=60\r\n_ZX81_WRX_SLOWDOWN=0\r\n_ZX81_WRX128_SLOWDOWN=0\r\n_ZX81_8X6_WRX128_SLOWDOWN=0\r\n_ZX81_WRX64_SLOWDOWN=0\r\n_ZX81_8X6_WRX64_SLOWDOWN=0\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=20\r\n_DRAGON_SLOWDOWN=20\r\n_COCO3_SLOWDOWN=20\r\n_MO5_SLOWDOWN=0\r\n_TO7_SLOWDOWN=0\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=0\r\n_PECOM_SLOWDOWN=0\r\n_TMC600_SLOWDOWN=0\r\n_MICRO_SLOWDOWN=1\r\n_CIDELSA_SLOWDOWN=1\r\n\r\n\r\n# MC10\r\n_MC10_SLOWDOWN=110\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=120\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n_TERMINAL_SLOWDOWN?=14\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=220\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=120"
  },
  {
    "path": "src/games/shuriken/docs/12x12_multi_tile_1.txt",
    "content": "...######...\r\n.###....###.\r\n.#..#.....#.\r\n##..##....##\r\n#...######.#\r\n#...#..##..#\r\n#..##..#...#\r\n#.######...#\r\n##....##..##\r\n.#.....#..#.\r\n.###....###.\r\n...######...\r\n\r\n\r\n---------------------\r\n\r\n12x9\r\n\r\n---------------------\r\n.......######...\r\n.....###....###.\r\n....##..#.....##\r\n....#...#####..#\r\n....#...#..#...#\r\n....#..#####...#\r\n....##.....#..##\r\n.....###....###.\r\n.......######...\r\n................\r\n................\r\n................\r\n---------------------\r\n\r\n15\r\n#####...\r\n....###.\r\n#.....##\r\n#####..#\r\n#..#...#\r\n####...#\r\n\r\n\r\n14\r\n.......#\r\n.....###\r\n....##..\r\n....#...\r\n....#...\r\n....#..#\r\n\r\n\r\n13\r\n...#..##\r\n....###.\r\n#####...\r\n........\r\n........\r\n........\r\n\r\n\r\n12\r\n....##..\r\n.....###\r\n.......#\r\n........\r\n........\r\n........\r\n\r\n\r\n\r\n---------------------\r\n................\r\n................\r\n................\r\n...######.......\r\n.###....###.....\r\n##..#.....##....\r\n#...#####..#....\r\n#...#..#...#....\r\n#..#####...#....\r\n##.....#..##....\r\n.###....###.....\r\n...######.......\r\n\r\n\r\n2\r\n........\r\n........\r\n........\r\n...#####\r\n.###....\r\n##..#...\r\n\r\n3\r\n........\r\n........\r\n........\r\n#.......\r\n###.....\r\n..##....\r\n\r\n\r\n0\r\n#...####\r\n#...#..#\r\n#..#####\r\n##.....#\r\n.###....\r\n...#####\r\n\r\n1\r\n#..#....\r\n...#....\r\n...#....\r\n..##....\r\n###.....\r\n#.......\r\n\r\n---------------------\r\n\r\n\r\n\r\n\r\n\r\n---------------------\r\n\r\n..#.....\r\n..##....\r\n..######\r\n..#  ##.\r\n.##  #..\r\n######..\r\n....##..\r\n.....#..\r\n\r\n\r\n----------------------\r\n14x16\r\n\r\n...#####......\r\n.###...###....\r\n.#..#....#....\r\n##..##...##...\r\n#...#####.#...\r\n#...#.##..#...\r\n#..##.#...#...\r\n#.#####...#...\r\n##...##..##...\r\n.#....#..#....\r\n.###...###....\r\n...#####......\r\n..............\r\n..............\r\n..............\r\n..............\r\n\r\n\r\n10\r\n...####\r\n.###...\r\n.#..#..\r\n##..##.\r\n#...###\r\n#...#.#\r\n#..##.#\r\n#.#####\r\n\r\n\r\n8\r\n##...##\r\n.#....#\r\n.###...\r\n...####\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n\r\n11\r\n#......\r\n###....\r\n..#....\r\n..##...\r\n##.#...\r\n#..#...\r\n...#...\r\n...#...\r\n\r\n\r\n9\r\n..##...\r\n..#....\r\n###....\r\n#......\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n\r\n..............\r\n..............\r\n..............\r\n..............\r\n......#####...\r\n....###...###.\r\n....#..#....#.\r\n...##..##...##\r\n...#...#####.#\r\n...#...#.##..#\r\n...#..##.#...#\r\n...#.#####...#\r\n...##...##..##\r\n....#....#..#.\r\n....###...###.\r\n......#####...\r\n\r\n\r\n6\r\n.......\r\n.......\r\n.......\r\n.......\r\n......#\r\n....###\r\n....#..\r\n...##..\r\n\r\n\r\n4\r\n...#...\r\n...#...\r\n...#..#\r\n...#.##\r\n...##..\r\n....#..\r\n....###\r\n......#\r\n\r\n\r\n7\r\n.......\r\n.......\r\n.......\r\n.......\r\n####...\r\n...###.\r\n#....#.\r\n##...##\r\n\r\n\r\n5\r\n#####.#\r\n#.##..#\r\n#.#...#\r\n###...#\r\n.##..##\r\n..#..#.\r\n...###.\r\n####...\r\n\r\n\r\n\r\n..............\r\n..............\r\n..............\r\n..............\r\n...#####......\r\n.###...###....\r\n.#...#...#....\r\n##...##..##...\r\n#..####...#...\r\n#.###.#...#...\r\n#...#.###.#...\r\n#...####..#...\r\n##..##...##...\r\n.#...#...#....\r\n.###...###....\r\n...#####......\r\n\r\n2\r\n.......\r\n.......\r\n.......\r\n.......\r\n...####\r\n.###...\r\n.#...#.\r\n##...##\r\n\r\n\r\n0\r\n#..####\r\n#.###.#\r\n#...#.#\r\n#...###\r\n##..##.\r\n.#...#.\r\n.###...\r\n...####\r\n\r\n\r\n3\r\n.......\r\n.......\r\n.......\r\n.......\r\n#......\r\n###....\r\n..#....\r\n..##...\r\n\r\n\r\n1\r\n...#...\r\n...#...\r\n##.#...\r\n#..#...\r\n..##...\r\n..#....\r\n###....\r\n#......\r\n\r\n\r\n\r\n......#####...\r\n....###...###.\r\n....#...#...#.\r\n...##...##..##\r\n...#..####...#\r\n...#.###.#...#\r\n...#...#.###.#\r\n...#...####..#\r\n...##..##...##\r\n....#...#...#.\r\n....###...###.\r\n......#####...\r\n..............\r\n..............\r\n..............\r\n..............\r\n\r\n\r\n14\r\n......#\r\n....###\r\n....#..\r\n...##..\r\n...#..#\r\n...#.##\r\n...#...\r\n...#...\r\n\r\n\r\n12\r\n...##..\r\n....#..\r\n....###\r\n......#\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n\r\n15\r\n####...\r\n...###.\r\n.#...#.\r\n.##..##\r\n###...#\r\n#.#...#\r\n#.###.#\r\n####..#\r\n\r\n\r\n13\r\n##...##\r\n.#...#.\r\n...###.\r\n####...\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/docs/12x12_multi_tile_2.txt",
    "content": "...######...\r\n.###....###.\r\n.#....#...#.\r\n##....##..##\r\n#..#####...#\r\n#.###..#...#\r\n#...#..###.#\r\n#...#####..#\r\n##..##....##\r\n.#...#....#.\r\n.###....###.\r\n...######...\r\n\r\n\r\n----------------------------------\r\n\r\n12x9 inside 16x12 2x2 tiles\r\n------------------\r\n...######.......\r\n.###....###.....\r\n##.....#..##....\r\n#..#####...#....\r\n#...#..#...#....\r\n#...#####..#....\r\n##..#.....##....\r\n.###....###.....\r\n...######.......\r\n................\r\n................\r\n................\r\n------------------\r\n\r\n\r\n10\r\n...#####\r\n.###....\r\n##.....#\r\n#..#####\r\n#...#..#\r\n#...####\r\n\r\n11\r\n#.......\r\n.###....\r\n..##....\r\n...#....\r\n...#....\r\n#..#....\r\n\r\n8\r\n##..#...\r\n.###....\r\n...#####\r\n........\r\n........\r\n........\r\n\r\n9\r\n..##....\r\n###.....\r\n#.......\r\n........\r\n........\r\n........\r\n\r\n------------------\r\n................\r\n................\r\n................\r\n.......######...\r\n.....###....###.\r\n....##.....#..##\r\n....#..#####...#\r\n....#...#..#...#\r\n....#...#####..#\r\n....##..#.....##\r\n.....###....###.\r\n.......######...\r\n------------------\r\n\r\n6\r\n........\r\n........\r\n........\r\n.......#\r\n.....###\r\n....##..\r\n\r\n\r\n7\r\n........\r\n........\r\n........\r\n#####...\r\n....###.\r\n...#..##\r\n\r\n\r\n4\r\n....#..#\r\n....#...\r\n....#...\r\n....##..\r\n.....###\r\n.......#\r\n\r\n\r\n5\r\n####...#\r\n#..#...#\r\n#####..#\r\n#.....##\r\n....###.\r\n#####...\r\n\r\n\r\n----------------------------------\r\n\r\n\r\n\r\n\r\n\r\n....#...\r\n....##..\r\n.#####..\r\n###  #..\r\n..#  ###\r\n..#####.\r\n..##....\r\n...#....\r\n"
  },
  {
    "path": "src/games/shuriken/docs/12x16_multi_tile.txt",
    "content": "...###......\r\n.##...##....\r\n.#.#...#....\r\n##.#...##...\r\n#..####.#...\r\n#..#.#..#...\r\n#..#.#..#...\r\n#.####..#...\r\n##...#.##...\r\n.#.....#....\r\n.##...##....\r\n...###......\r\n............\r\n............\r\n............\r\n............"
  },
  {
    "path": "src/games/shuriken/docs/14x16_multi_tile.txt",
    "content": "...#####......\r\n.###...###....\r\n.#..#....#....\r\n##..##...##...\r\n#...#####.#...\r\n#...#.##..#...\r\n#..##.#...#...\r\n#.#####...#...\r\n##...##..##...\r\n.#....#..#....\r\n.###...###....\r\n...#####......\r\n..............\r\n..............\r\n..............\r\n..............\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/docs/14x16_multi_tile_2.txt",
    "content": "..............\r\n..............\r\n..............\r\n..............\r\n......#####...\r\n....###...###.\r\n....#..#....#.\r\n...##..##...##\r\n...#...#####.#\r\n...#...#.##..#\r\n...#..##.#...#\r\n...#.#####...#\r\n...##...##..##\r\n....#....#..#.\r\n....###...###.\r\n......#####...\r\n"
  },
  {
    "path": "src/games/shuriken/docs/14x16_multi_tile_3.txt",
    "content": "..............\r\n..............\r\n..............\r\n..............\r\n...#####......\r\n.###...###....\r\n.#...#...#....\r\n##...##..##...\r\n#..####...#...\r\n#.###.#...#...\r\n#...#.###.#...\r\n#...####..#...\r\n##..##...##...\r\n.#...#...#....\r\n.###...###....\r\n...#####......\r\n"
  },
  {
    "path": "src/games/shuriken/docs/14x16_multi_tile_4.txt",
    "content": "......#####...\r\n....###...###.\r\n....#...#...#.\r\n...##...##..##\r\n...#..####...#\r\n...#.###.#...#\r\n...#...#.###.#\r\n...#...####..#\r\n...##..##...##\r\n....#...#...#.\r\n....###...###.\r\n......#####...\r\n..............\r\n..............\r\n..............\r\n.............."
  },
  {
    "path": "src/games/shuriken/docs/14x16_shapes.txt",
    "content": "\r\n----------------------\r\n14x16\r\n\r\n...#####......\r\n.###...###....\r\n.#..#....#....\r\n##..##...##...\r\n#...#####.#...\r\n#...#.##..#...\r\n#..##.#...#...\r\n#.#####...#...\r\n##...##..##...\r\n.#....#..#....\r\n.###...###....\r\n...#####......\r\n..............\r\n..............\r\n..............\r\n..............\r\n\r\n\r\n10\r\n...####\r\n.###...\r\n.#..#..\r\n##..##.\r\n#...###\r\n#...#.#\r\n#..##.#\r\n#.#####\r\n\r\n\r\n8\r\n##...##\r\n.#....#\r\n.###...\r\n...####\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n\r\n11\r\n#......\r\n###....\r\n..#....\r\n..##...\r\n##.#...\r\n#..#...\r\n...#...\r\n...#...\r\n\r\n\r\n9\r\n..##...\r\n..#....\r\n###....\r\n#......\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n\r\n..............\r\n..............\r\n..............\r\n..............\r\n......#####...\r\n....###...###.\r\n....#..#....#.\r\n...##..##...##\r\n...#...#####.#\r\n...#...#.##..#\r\n...#..##.#...#\r\n...#.#####...#\r\n...##...##..##\r\n....#....#..#.\r\n....###...###.\r\n......#####...\r\n\r\n\r\n6\r\n.......\r\n.......\r\n.......\r\n.......\r\n......#\r\n....###\r\n....#..\r\n...##..\r\n\r\n\r\n4\r\n...#...\r\n...#...\r\n...#..#\r\n...#.##\r\n...##..\r\n....#..\r\n....###\r\n......#\r\n\r\n\r\n7\r\n.......\r\n.......\r\n.......\r\n.......\r\n####...\r\n...###.\r\n#....#.\r\n##...##\r\n\r\n\r\n5\r\n#####.#\r\n#.##..#\r\n#.#...#\r\n###...#\r\n.##..##\r\n..#..#.\r\n...###.\r\n####...\r\n\r\n\r\n\r\n..............\r\n..............\r\n..............\r\n..............\r\n...#####......\r\n.###...###....\r\n.#...#...#....\r\n##...##..##...\r\n#..####...#...\r\n#.###.#...#...\r\n#...#.###.#...\r\n#...####..#...\r\n##..##...##...\r\n.#...#...#....\r\n.###...###....\r\n...#####......\r\n\r\n2\r\n.......\r\n.......\r\n.......\r\n.......\r\n...####\r\n.###...\r\n.#...#.\r\n##...##\r\n\r\n\r\n0\r\n#..####\r\n#.###.#\r\n#...#.#\r\n#...###\r\n##..##.\r\n.#...#.\r\n.###...\r\n...####\r\n\r\n\r\n3\r\n.......\r\n.......\r\n.......\r\n.......\r\n#......\r\n###....\r\n..#....\r\n..##...\r\n\r\n\r\n1\r\n...#...\r\n...#...\r\n##.#...\r\n#..#...\r\n..##...\r\n..#....\r\n###....\r\n#......\r\n\r\n\r\n\r\n......#####...\r\n....###...###.\r\n....#...#...#.\r\n...##...##..##\r\n...#..####...#\r\n...#.###.#...#\r\n...#...#.###.#\r\n...#...####..#\r\n...##..##...##\r\n....#...#...#.\r\n....###...###.\r\n......#####...\r\n..............\r\n..............\r\n..............\r\n..............\r\n\r\n\r\n14\r\n......#\r\n....###\r\n....#..\r\n...##..\r\n...#..#\r\n...#.##\r\n...#...\r\n...#...\r\n\r\n\r\n12\r\n...##..\r\n....#..\r\n....###\r\n......#\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n\r\n15\r\n####...\r\n...###.\r\n.#...#.\r\n.##..##\r\n###...#\r\n#.#...#\r\n#.###.#\r\n####..#\r\n\r\n\r\n13\r\n##...##\r\n.#...#.\r\n...###.\r\n####...\r\n.......\r\n.......\r\n.......\r\n.......\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/docs/16x12_multi_tile.txt",
    "content": "...######.......\r\n.###....###.....\r\n##.....#..##....\r\n#..#####...#....\r\n#...#..#...#....\r\n#...#####..#....\r\n##..#.....##....\r\n.###....###.....\r\n...######.......\r\n................\r\n................\r\n................"
  },
  {
    "path": "src/games/shuriken/docs/16x16_multi_tile.txt",
    "content": "...######.......\r\n.###....###.....\r\n.#..#.....#.....\r\n##..##....##....\r\n#...######.#....\r\n#...#..##..#....\r\n#..##..#...#....\r\n#.######...#....\r\n##....##..##....\r\n.#.....#..#.....\r\n.###....###.....\r\n...######.......\r\n................\r\n................\r\n................\r\n................"
  },
  {
    "path": "src/games/shuriken/docs/7x8.txt",
    "content": "...#...\r\n...##..\r\n.####..\r\n### #..\r\n..# ###\r\n..####.\r\n..##...\r\n...#..."
  },
  {
    "path": "src/games/shuriken/docs/mine_shape1.txt",
    "content": "..#.....\r\n..##....\r\n..######\r\n..#  ##.\r\n.##  #..\r\n######..\r\n....##..\r\n.....#..\r\n"
  },
  {
    "path": "src/games/shuriken/docs/mine_shape2.txt",
    "content": "....#...\r\n....##..\r\n.#####..\r\n###  #..\r\n..#  ###\r\n..#####.\r\n..##....\r\n...#....\r\n"
  },
  {
    "path": "src/games/shuriken/level_00_horiz.h",
    "content": "\r\n// LEVEL 0 SHOWN AS 1\r\n\r\n#if XSize>=20\r\n    #define MINI_WALL_SIZE 4\r\n    #define MINI_WALL_OFFSET 0\r\n#else\r\n    #define MINI_WALL_SIZE 3\r\n    #define MINI_WALL_OFFSET 1\r\n#endif\r\n\r\n#define LV_HORIZ_NO_OF_OBJECTS 18\r\n\r\n#define LV_HORIZ_OBJECTS \\\r\n    LV_HORIZ_NO_OF_OBJECTS, \\\r\n\t\\\r\n\tXSize/2-6+MINI_WALL_OFFSET,YSize-2,MINI_WALL_SIZE,1,WALL, \\\r\n\tXSize/2-6+MINI_WALL_OFFSET,2,MINI_WALL_SIZE,1,WALL, \\\r\n\t\\\r\n\tXSize/2+2,YSize-2,MINI_WALL_SIZE,1,WALL, \\\r\n\tXSize/2+2,2,MINI_WALL_SIZE,1,WALL, \\\r\n\t\\\r\n\tXSize-2,2,1,1,FREEZE, \\\r\n\tXSize-2,YSize-2,1,1,RING, \\\r\n    \\\r\n\t1,2,1,1,RING, \\\r\n\t1,YSize-2,1,1,FREEZE, \\\r\n    \\\r\n    (XSize-4)/2-2,5,2,1,WALL, \\\r\n    (XSize-4)/2+4,5,2,1,WALL, \\\r\n    \\\r\n    (XSize-4)/2-3,5,1,1,FREEZE, \\\r\n    (XSize-4)/2+6,5,1,1,RING, \\\r\n    \\\r\n    (XSize-4)/2-2,YSize-5,2,1,WALL, \\\r\n    (XSize-4)/2+4,YSize-5,2,1,WALL, \\\r\n\t\\\r\n    XSize-2,4,1,YSize-1-2-4,DIAMOND, \\\r\n    1,4,1,YSize-1-2-4,DIAMOND, \\\r\n\t\\\r\n\tXSize/2-2,YSize-2,4,1,DIAMOND, \\\r\n\tXSize/2-2,2,4,1,DIAMOND\r\n\r\n#define LV_HORIZ_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_HORIZ_NO_OF_OBJECTS)\r\n\r\n//\r\n\r\n#if !defined(FEWER_SHURIKENS) & XSize>=20\r\n    #define LV_HORIZ_SHURIKENS \\\r\n        12, 0, 0, \\\r\n        \\\r\n        2,4, \\\r\n        2,7, \\\r\n        2,10, \\\r\n        2,YSize-9, \\\r\n        2,YSize-6, \\\r\n        2,YSize-3, \\\r\n        \\\r\n        XSize-3,3, \\\r\n        XSize-3,6, \\\r\n        XSize-3,9, \\\r\n        XSize-3,YSize-10, \\\r\n        XSize-3,YSize-7, \\\r\n        XSize-3,YSize-4\r\n    \r\n    #define LV_HORIZ_SHURIKENS_SIZE LV_SHURIKENS_SIZE(12,0,0)\r\n \r\n#else\r\n\t#define LV_HORIZ_SHURIKENS \\\r\n\t\t8, 0, 0, \\\r\n\t\t\\\r\n\t\t2,4, \\\r\n\t\t2,7, \\\r\n\t\t2,YSize-9, \\\r\n\t\t2,YSize-3, \\\r\n\t\t\\\r\n\t\tXSize-3,3, \\\r\n\t\tXSize-3,6, \\\r\n\t\tXSize-3,YSize-10, \\\r\n\t\tXSize-3,YSize-4 \r\n\t\t\r\n\t#define LV_HORIZ_SHURIKENS_SIZE LV_SHURIKENS_SIZE(8,0,0)\r\n\r\n#endif\r\n\r\n\r\n\r\n// \r\n\r\n#define LV_HORIZ_WALLS 0\r\n#define LV_HORIZ_WALLS_SIZE LC_WALLS_SIZE(LV_HORIZ_WALLS)\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_01_vert_bars.h",
    "content": "\r\n// LEVEL 1 SHOWN AS 2\r\n\r\n#if XSize<=20\r\n    #define LV_VERT_BARS_WIDTH 2\r\n#elif XSize<32\r\n    #define LV_VERT_BARS_WIDTH (XSize/7-1)\r\n#else\r\n    #define LV_VERT_BARS_WIDTH (XSize/4-1)\r\n#endif\r\n\r\n\r\n#if XSize>=20\r\n    #if YSize>25\r\n        #define LV_VERT_BARS_NO_OF_OBJECTS 14\r\n\r\n        #define LV_VERT_BARS_OBJECTS \\\r\n            LV_VERT_BARS_NO_OF_OBJECTS, \\\r\n            \\\r\n            5+LV_VERT_BARS_WIDTH,4,1,YSize-7,WALL, \\\r\n            XSize-6-LV_VERT_BARS_WIDTH,4,1,YSize-7,WALL, \\\r\n            \\\r\n            3,4,1,YSize-7,WALL, \\\r\n            XSize-4,4,1,YSize-7,WALL, \\\r\n            \\\r\n            XSize-3,4,1,1,RING, \\\r\n            XSize-3,YSize-4,1,1,FREEZE, \\\r\n            2,4,1,1,RING, \\\r\n            2,YSize-4,1,1,FREEZE, \\\r\n            \\\r\n            2,5,1,YSize-9,DIAMOND, \\\r\n            4,5,1,YSize-9,DIAMOND, \\\r\n            6+LV_VERT_BARS_WIDTH,7+4,1,YSize-7-6-8,DIAMOND, \\\r\n            XSize-7-LV_VERT_BARS_WIDTH,7+4,1,YSize-7-6-8,DIAMOND, \\\r\n            XSize-5,5,1,YSize-9,DIAMOND,  \\\r\n            XSize-3,5,1,YSize-9,DIAMOND\r\n    #elif YSize>=16\r\n\r\n        #define LV_VERT_BARS_NO_OF_OBJECTS 14\r\n\r\n        #define LV_VERT_BARS_OBJECTS \\\r\n            LV_VERT_BARS_NO_OF_OBJECTS, \\\r\n            \\\r\n            5+LV_VERT_BARS_WIDTH,4,1,YSize-7,WALL, \\\r\n            XSize-6-LV_VERT_BARS_WIDTH,4,1,YSize-7,WALL, \\\r\n            \\\r\n            3,4,1,YSize-7,WALL, \\\r\n            XSize-4,4,1,YSize-7,WALL, \\\r\n            \\\r\n            XSize-3,4,1,1,RING, \\\r\n            XSize-3,YSize-4,1,1,FREEZE, \\\r\n            2,4,1,1,RING, \\\r\n            2,YSize-4,1,1,FREEZE, \\\r\n            \\\r\n            2,5,1,YSize-9,DIAMOND, \\\r\n            4,5,1,YSize-9,DIAMOND, \\\r\n            6+LV_VERT_BARS_WIDTH,7,1,YSize-7-6,DIAMOND, \\\r\n            XSize-7-LV_VERT_BARS_WIDTH,7,1,YSize-7-6,DIAMOND, \\\r\n            XSize-5,5,1,YSize-9,DIAMOND,  \\\r\n            XSize-3,5,1,YSize-9,DIAMOND\r\n    #else\r\n        #define LV_VERT_BARS_NO_OF_OBJECTS 14\r\n\r\n        #define LV_VERT_BARS_OBJECTS \\\r\n            LV_VERT_BARS_NO_OF_OBJECTS, \\\r\n            \\\r\n            5+LV_VERT_BARS_WIDTH,4,1,YSize-7,WALL, \\\r\n            XSize-6-LV_VERT_BARS_WIDTH,4,1,YSize-7,WALL, \\\r\n            \\\r\n            3,4,1,YSize-7,WALL, \\\r\n            XSize-4,4,1,YSize-7,WALL, \\\r\n            \\\r\n            XSize-3,4,1,1,RING, \\\r\n            XSize-3,YSize-4,1,1,FREEZE, \\\r\n            2,4,1,1,RING, \\\r\n            2,YSize-4,1,1,FREEZE, \\\r\n            \\\r\n            2,5,1,3,DIAMOND, \\\r\n            4,5,1,3,DIAMOND, \\\r\n            6+LV_VERT_BARS_WIDTH,7,1,3,DIAMOND, \\\r\n            XSize-7-LV_VERT_BARS_WIDTH,7,1,3,DIAMOND, \\\r\n            XSize-5,5,1,3,DIAMOND,  \\\r\n            XSize-3,5,1,3,DIAMOND\r\n\r\n    #endif\r\n\r\n#else\r\n    #if YSize>=16\r\n        #define LV_VERT_BARS_NO_OF_OBJECTS 10\r\n\r\n        #define LV_VERT_BARS_OBJECTS \\\r\n            LV_VERT_BARS_NO_OF_OBJECTS, \\\r\n            \\\r\n            3,4,1,YSize-7,WALL, \\\r\n            XSize-4,4,1,YSize-7,WALL, \\\r\n            \\\r\n            XSize-3,4,1,1,RING, \\\r\n            XSize-3,YSize-4,1,1,FREEZE, \\\r\n            2,4,1,1,RING, \\\r\n            2,YSize-4,1,1,FREEZE, \\\r\n            \\\r\n            2,5,1,YSize-9,DIAMOND, \\\r\n            4,5,1,YSize-9,DIAMOND, \\\r\n            \\\r\n            XSize-5,5,1,YSize-9,DIAMOND,  \\\r\n            XSize-3,5,1,YSize-9,DIAMOND    \r\n    #else\r\n        #define LV_VERT_BARS_NO_OF_OBJECTS 10\r\n\r\n        #define LV_VERT_BARS_OBJECTS \\\r\n            LV_VERT_BARS_NO_OF_OBJECTS, \\\r\n            \\\r\n            3,4,1,YSize-7,WALL, \\\r\n            XSize-4,4,1,YSize-7,WALL, \\\r\n            \\\r\n            XSize-3,4,1,1,RING, \\\r\n            XSize-3,YSize-4,1,1,FREEZE, \\\r\n            2,4,1,1,RING, \\\r\n            2,YSize-4,1,1,FREEZE, \\\r\n            \\\r\n            2,5,1,2,DIAMOND, \\\r\n            4,5,1,2,DIAMOND, \\\r\n            \\\r\n            XSize-5,5,1,2,DIAMOND,  \\\r\n            XSize-3,5,1,2,DIAMOND    \r\n    #endif\r\n#endif\r\n\r\n#define LV_VERT_BARS_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_VERT_BARS_NO_OF_OBJECTS)\r\n\r\n\r\n//\r\n\r\n#define LV_VERT_BARS_SHURIKENS \\\r\n    2, 4, 0, \\\r\n\t\\\r\n    3,3, \\\r\n    3,YSize-3, \\\r\n    \\\r\n    \\\r\n\t\\\r\n    6,3, \\\r\n    1,3, \\\r\n    XSize-2,6, \\\r\n    XSize-2-5,6 \\\r\n\t\\\r\n\t\\\r\n\r\n#define LV_VERT_BARS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(2,4,0)\r\n\r\n\r\n\r\n#define LV_VERT_BARS_NO_OF_WALLS 2\r\n\r\n#if XSize>=20\r\n    #define LV_VERT_BARS_WALLS \\\r\n        LV_VERT_BARS_NO_OF_WALLS, \\\r\n        \\\r\n        6+LV_VERT_BARS_WIDTH,5, \\\r\n        XSize-12-2*LV_VERT_BARS_WIDTH, 1, \\\r\n        \\\r\n        6+LV_VERT_BARS_WIDTH,YSize-5, \\\r\n        XSize-12-2*LV_VERT_BARS_WIDTH,1\r\n\r\n#else\r\n    #define LV_VERT_BARS_WALLS \\\r\n        LV_VERT_BARS_NO_OF_WALLS, \\\r\n        \\\r\n        5,5, \\\r\n        XSize-8-2*1, 1, \\\r\n        \\\r\n        5,YSize-5, \\\r\n        XSize-8-2*1,1\r\n#endif\r\n\r\n#define LV_VERT_BARS_WALLS_SIZE LC_WALLS_SIZE(LV_VERT_BARS_NO_OF_WALLS)\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_02_cross.h",
    "content": "\r\n\r\n// LEVEL 2\r\n\r\n#define LV_CROSS_OFFSET XSize/3\r\n\r\n\r\n#if XSize>40\r\n    #define LV_CROSS_WIDTH XSize/7\r\n\r\n#elif XSize>=20 && YSize>=16\r\n    #define LV_CROSS_WIDTH XSize/5\r\n    \r\n#else\r\n    #define LV_CROSS_WIDTH (LV_CROSS_OFFSET-2)\r\n#endif\r\n\r\n\r\n#if YSize>=22\r\n    #define LV_CROSS_HEIGHT YSize/4\r\n#else\r\n    #define LV_CROSS_HEIGHT YSize/5\r\n#endif\r\n\r\n\r\n#if XSize>=20 && YSize>=17\r\n\r\n    #define LV_CROSS_NO_OF_OBJECTS 30\r\n\r\n    #define LV_CROSS_OBJECTS \\\r\n        LV_CROSS_NO_OF_OBJECTS, \\\r\n        \\\r\n        LV_CROSS_OFFSET,4,1,LV_CROSS_HEIGHT,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,4,1,LV_CROSS_HEIGHT,WALL, \\\r\n        \\\r\n        LV_CROSS_OFFSET,YSize-4-LV_CROSS_HEIGHT,1,LV_CROSS_HEIGHT+1,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,YSize-4-LV_CROSS_HEIGHT+1,1,LV_CROSS_HEIGHT,WALL, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,4+LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,4+LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,YSize-4-LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,YSize-4-LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        \\\r\n        \\\r\n        LV_CROSS_OFFSET+1+1,YSize-4-LV_CROSS_HEIGHT+1+2,2,1,BLOCK, \\\r\n        LV_CROSS_OFFSET+1+1,4+LV_CROSS_HEIGHT-1-2   ,2,1,BLOCK, \\\r\n        LV_CROSS_OFFSET+1+1+XSize-2*(LV_CROSS_OFFSET)-6,YSize-4-LV_CROSS_HEIGHT+1+2,2,1,BLOCK, \\\r\n        LV_CROSS_OFFSET+1+1+XSize-2*(LV_CROSS_OFFSET)-6,4+LV_CROSS_HEIGHT-1-2   ,2,1,BLOCK, \\\r\n        \\\r\n        \\\r\n        LV_CROSS_OFFSET+1+1+2,YSize-4-LV_CROSS_HEIGHT+1+2,XSize-2U*(LV_CROSS_OFFSET)-8U,1,WALL, \\\r\n        LV_CROSS_OFFSET+1+1+2,4+LV_CROSS_HEIGHT-1-2   ,XSize-2U*(LV_CROSS_OFFSET)-8U,1,WALL, \\\r\n        \\\r\n        LV_CROSS_OFFSET-1,4,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+1,4,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET-1,YSize-4-LV_CROSS_HEIGHT+1,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+1,YSize-4-LV_CROSS_HEIGHT+1,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        \\\r\n        XSize-2,2,1,1,FREEZE, \\\r\n        XSize-2,YSize-2,1,1,RING, \\\r\n        \\\r\n        1,2,1,1,RING, \\\r\n        1,YSize-2,1,1,FREEZE, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,4+LV_CROSS_HEIGHT-1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+2,4+LV_CROSS_HEIGHT-1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,YSize-4-LV_CROSS_HEIGHT+1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+2,YSize-4-LV_CROSS_HEIGHT+1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET+1,4,1,LV_CROSS_HEIGHT+1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET-1,4,1,LV_CROSS_HEIGHT+1,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET+1,YSize-4-LV_CROSS_HEIGHT,1,LV_CROSS_HEIGHT+1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET-1,YSize-4-LV_CROSS_HEIGHT,1,LV_CROSS_HEIGHT+1,DIAMOND \\\r\n        \\\r\n\r\n#else\r\n\r\n    #define LV_CROSS_NO_OF_OBJECTS 28\r\n\r\n    #define LV_CROSS_OBJECTS \\\r\n        LV_CROSS_NO_OF_OBJECTS, \\\r\n        \\\r\n        LV_CROSS_OFFSET,4,1,LV_CROSS_HEIGHT,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,4,1,LV_CROSS_HEIGHT,WALL, \\\r\n        \\\r\n        LV_CROSS_OFFSET,YSize-4-LV_CROSS_HEIGHT,1,LV_CROSS_HEIGHT+1,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,YSize-4-LV_CROSS_HEIGHT+1,1,LV_CROSS_HEIGHT,WALL, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,4+LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,4+LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,YSize-4-LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        XSize-1-LV_CROSS_OFFSET,YSize-4-LV_CROSS_HEIGHT,LV_CROSS_WIDTH,1,WALL, \\\r\n        \\\r\n        \\\r\n        LV_CROSS_OFFSET+1+1,YSize-4-LV_CROSS_HEIGHT+1+2,2,1,BLOCK, \\\r\n        LV_CROSS_OFFSET+1+1,4+LV_CROSS_HEIGHT-1-2   ,2,1,BLOCK, \\\r\n        LV_CROSS_OFFSET+1+1+XSize-2*(LV_CROSS_OFFSET)-6,YSize-4-LV_CROSS_HEIGHT+1+2,2,1,BLOCK, \\\r\n        LV_CROSS_OFFSET+1+1+XSize-2*(LV_CROSS_OFFSET)-6,4+LV_CROSS_HEIGHT-1-2   ,2,1,BLOCK, \\\r\n        \\\r\n        \\\r\n        \\\r\n        LV_CROSS_OFFSET-1,4,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+1,4,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET-1,YSize-4-LV_CROSS_HEIGHT+1,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+1,YSize-4-LV_CROSS_HEIGHT+1,1,LV_CROSS_HEIGHT,DIAMOND, \\\r\n        \\\r\n        XSize-2,2,1,1,FREEZE, \\\r\n        XSize-2,YSize-2,1,1,RING, \\\r\n        \\\r\n        1,2,1,1,RING, \\\r\n        1,YSize-2,1,1,FREEZE, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,4+LV_CROSS_HEIGHT-1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+2,4+LV_CROSS_HEIGHT-1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,YSize-4-LV_CROSS_HEIGHT+1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET+2,YSize-4-LV_CROSS_HEIGHT+1,LV_CROSS_WIDTH-2,1,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET+1,4,1,LV_CROSS_HEIGHT+1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET-1,4,1,LV_CROSS_HEIGHT+1,DIAMOND, \\\r\n        \\\r\n        LV_CROSS_OFFSET+1,YSize-4-LV_CROSS_HEIGHT,1,LV_CROSS_HEIGHT+1,DIAMOND, \\\r\n        XSize-1-LV_CROSS_OFFSET-1,YSize-4-LV_CROSS_HEIGHT,1,LV_CROSS_HEIGHT+1,DIAMOND \\\r\n        \\\r\n    \r\n\r\n#endif\r\n\r\n\r\n#define LV_CROSS_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_CROSS_NO_OF_OBJECTS)\r\n\r\n\r\n//\r\n\r\n\r\n#if !defined(FEWER_SHURIKENS)\r\n    #define LV_CROSS_SHURIKENS \\\r\n        4,4,2, \\\r\n        2,2,\\\r\n        XSize-3,3, \\\r\n        2,YSize-2, \\\r\n        XSize-3,YSize-3, \\\r\n        \\\r\n        LV_CROSS_OFFSET-3,2, \\\r\n        XSize-1-LV_CROSS_OFFSET+3,2, \\\r\n        LV_CROSS_OFFSET-3,YSize-2, \\\r\n        XSize-1-LV_CROSS_OFFSET+3,YSize-2, \\\r\n        \\\r\n        2, \\\r\n        XSize-3\r\n    #define LV_CROSS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,4,2)\r\n\r\n#else\r\n    #define LV_CROSS_SHURIKENS \\\r\n        2,2,2, \\\r\n        2,2,\\\r\n        XSize-3,YSize-3, \\\r\n        \\\r\n        LV_CROSS_OFFSET-3,2, \\\r\n        XSize-1-LV_CROSS_OFFSET+3,YSize-2, \\\r\n        \\\r\n        2, \\\r\n        XSize-3\r\n    #define LV_CROSS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(2,2,2)\r\n\r\n#endif    \r\n\r\n\r\n\r\n\r\n#define LV_CROSS_NO_OF_WALLS 4\r\n\r\n#define LV_CROSS_WALLS \\\r\n    LV_CROSS_NO_OF_WALLS, \\\r\n    LV_CROSS_OFFSET+1+1,YSize-4-YSize/4+1, \\\r\n    XSize-2*(LV_CROSS_OFFSET)-4,1,\\\r\n    \\\r\n    LV_CROSS_OFFSET+1+1,4+YSize/4-1,\\\r\n    XSize-2*(LV_CROSS_OFFSET)-4,1,\\\r\n    \\\r\n    LV_CROSS_OFFSET-LV_CROSS_WIDTH+1,4+YSize/4+1,\\\r\n    1,YSize-9-2*(YSize/4),\\\r\n    \\\r\n    XSize-1-LV_CROSS_OFFSET+LV_CROSS_WIDTH-1,4+YSize/4+1,\\\r\n    1,YSize-9-2*(YSize/4)\r\n\r\n#define LV_CROSS_WALLS_SIZE LC_WALLS_SIZE(LV_CROSS_NO_OF_WALLS)\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_03_07_11_boss.h",
    "content": "// BOSS LEVELS: 3, 7, 11 SHOWN AS 4, 8, 12\r\n\r\n\r\n#if YSize>=20\r\n\t#define LV_CHALLENGE_OBJECTS \\\r\n\t\t4, \\\r\n\t\t\\\r\n\t\tXSize/2-3,YSize/2-2,1,5,WALL, \\\r\n\t\tXSize/2+2,YSize/2-2,1,5,WALL, \\\r\n\t\t\\\r\n\t\t(XSize-4)/2-3,YSize-5,1,1,RING, \\\r\n\t\t(XSize-4)/2+6,YSize-5,1,1,FREEZE\r\n#elif YSize>=18\r\n\t#define LV_CHALLENGE_OBJECTS \\\r\n\t\t4, \\\r\n\t\t\\\r\n\t\tXSize/2-3,YSize/2-1,1,3,WALL, \\\r\n\t\tXSize/2+2,YSize/2-1,1,3,WALL, \\\r\n\t\t\\\r\n\t\t(XSize-4)/2-3,YSize-5,1,1,RING, \\\r\n\t\t(XSize-4)/2+6,YSize-5,1,1,FREEZE\r\n\r\n#else\r\n\t#define LV_CHALLENGE_OBJECTS \\\r\n\t\t4, \\\r\n\t\t\\\r\n\t\tXSize/2-3,YSize/2,1,1,WALL, \\\r\n\t\tXSize/2+2,YSize/2,1,1,WALL, \\\r\n\t\t\\\r\n\t\t(XSize-4)/2-3,YSize-5,1,1,RING, \\\r\n\t\t(XSize-4)/2+6,YSize-5,1,1,FREEZE\r\n\r\n#endif\r\n\r\n\r\n#define LV_CHALLENGE_NO_OF_WALLS 2\r\n\r\n#define LV_CHALLENGE_WALLS \\\r\n\tLV_CHALLENGE_NO_OF_WALLS, \\\r\n\t\\\r\n\t(XSize-4)/2,5, \\\r\n\t4, 1, \\\r\n\t\\\r\n\t(XSize-4)/2,YSize-5, \\\r\n\t4,1\r\n\r\n\r\n#define LV_CHALLENGE_WALLS_SIZE LC_WALLS_SIZE(LV_CHALLENGE_NO_OF_WALLS)\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_04_horiz_walls.h",
    "content": "\r\n\r\n// LEVEL 4 SHOWN AS 5\r\n\r\n#if YSize>24\r\n    #define LV_HORIZ_WALLS_WIDTH ((XSize)/2+2)\r\n    #define LV_HORIZ_WALLS_ADJUST 1\r\n#elif YSize>21\r\n    #define LV_HORIZ_WALLS_WIDTH ((XSize)/2)\r\n    #define LV_HORIZ_WALLS_ADJUST 0\r\n#else\r\n    #define LV_HORIZ_WALLS_WIDTH ((XSize)/2-2)\r\n    #define LV_HORIZ_WALLS_ADJUST 0\r\n#endif\r\n\r\n\r\n#if YSize>=17\r\n\r\n    #define LV_HORIZ_WALLS_NO_OF_OBJECTS 14\r\n\r\n    #define LV_HORIZ_WALLS_OBJECTS \\\r\n        LV_HORIZ_WALLS_NO_OF_OBJECTS, \\\r\n        \\\r\n        1,1+YSize/5,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        XSize-1-LV_HORIZ_WALLS_WIDTH,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        \\\r\n        XSize-1-LV_HORIZ_WALLS_WIDTH,YSize-1-YSize/5,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        1,YSize-1-2*(YSize/5)+LV_HORIZ_WALLS_ADJUST,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        \\\r\n        2,YSize-2,1,1,RING, \\\r\n        XSize-3,2,1,1,FREEZE, \\\r\n        \\\r\n        1,2,1,YSize/5-1,DIAMOND, \\\r\n        XSize-2,YSize-YSize/5,1,YSize/5-1,DIAMOND, \\\r\n        1,2+YSize/5,1,YSize-3*(YSize/5)-3+LV_HORIZ_WALLS_ADJUST,DIAMOND, \\\r\n        XSize-2,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST+1,1,YSize-3*(YSize/5)-3+LV_HORIZ_WALLS_ADJUST,DIAMOND, \\\r\n        1,YSize-1-2*(YSize/5)+LV_HORIZ_WALLS_ADJUST+1,1,2*(YSize/5)-LV_HORIZ_WALLS_ADJUST-1,DIAMOND, \\\r\n        XSize-2,2,1,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST-2,DIAMOND, \\\r\n        2,YSize-1-2*(YSize/5)+LV_HORIZ_WALLS_ADJUST-1,LV_HORIZ_WALLS_WIDTH/3,1,DIAMOND, \\\r\n        XSize-1-LV_HORIZ_WALLS_WIDTH/3-1,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST-1,LV_HORIZ_WALLS_WIDTH/3,1,DIAMOND\r\n\r\n#else\r\n    \r\n    #define LV_HORIZ_WALLS_NO_OF_OBJECTS 13\r\n\r\n    #define LV_HORIZ_WALLS_OBJECTS \\\r\n        LV_HORIZ_WALLS_NO_OF_OBJECTS, \\\r\n        \\\r\n        1,1+YSize/5,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        XSize-1-LV_HORIZ_WALLS_WIDTH,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        \\\r\n        XSize-1-LV_HORIZ_WALLS_WIDTH,YSize-1-YSize/5,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        1,YSize-1-2*(YSize/5)+LV_HORIZ_WALLS_ADJUST,LV_HORIZ_WALLS_WIDTH,1,WALL, \\\r\n        \\\r\n        2,YSize-2,1,1,RING, \\\r\n        XSize-3,2,1,1,FREEZE, \\\r\n        \\\r\n        1,2,1,YSize/5-1,DIAMOND, \\\r\n        XSize-2,YSize-YSize/5,1,YSize/5-1,DIAMOND, \\\r\n        1,2+YSize/5,1,YSize-3*(YSize/5)-3+LV_HORIZ_WALLS_ADJUST,DIAMOND, \\\r\n        XSize-2,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST+1,1,YSize-3*(YSize/5)-3+LV_HORIZ_WALLS_ADJUST,DIAMOND, \\\r\n        1,YSize-1-2*(YSize/5)+LV_HORIZ_WALLS_ADJUST+1,1,2*(YSize/5)-LV_HORIZ_WALLS_ADJUST-1,DIAMOND, \\\r\n        XSize-2,2,1,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST-2,DIAMOND, \\\r\n        XSize-1-LV_HORIZ_WALLS_WIDTH/3-1,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST-1,LV_HORIZ_WALLS_WIDTH/3,1,DIAMOND\r\n\r\n#endif\r\n\r\n#define LV_HORIZ_WALLS_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_HORIZ_WALLS_NO_OF_OBJECTS)\r\n\r\n\r\n//\r\n\r\n#define LV_HORIZ_WALLS_SHURIKENS \\\r\n    4,4,0, \\\r\n    \\\r\n    XSize-3,1+YSize/5,\\\r\n    2,1+2*(YSize/5)-LV_HORIZ_WALLS_ADJUST+1, \\\r\n    2,YSize-1-YSize/5, \\\r\n    XSize-3,YSize-1-2*(YSize/5)+LV_HORIZ_WALLS_ADJUST-1, \\\r\n    \\\r\n    1+LV_HORIZ_WALLS_WIDTH,2, \\\r\n    XSize-LV_HORIZ_WALLS_WIDTH-2,YSize-2, \\\r\n    1+LV_HORIZ_WALLS_WIDTH/2,1+YSize/5+1, \\\r\n    XSize-1-1-LV_HORIZ_WALLS_WIDTH/2-LV_HORIZ_WALLS_ADJUST,YSize-1-YSize/5-1\r\n\r\n\r\n#define LV_HORIZ_WALLS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,4,0)\r\n\r\n\r\n\r\n#define LV_HORIZ_WALLS_NO_OF_WALLS 0\r\n\r\n#define LV_HORIZ_WALLS_WALLS \\\r\n    LV_HORIZ_WALLS_NO_OF_WALLS\r\n\r\n\r\n#define LV_HORIZ_WALLS_WALLS_SIZE LC_WALLS_SIZE(LV_HORIZ_WALLS_NO_OF_WALLS)\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_05_h_barriers.h",
    "content": "\r\n// LEVEL 3\r\n\r\n#define LV_H_BARRIERS_NO_OF_OBJECTS 24\r\n\r\n#define LV_H_BARRIERS_BAR_SIZE XSize/7\r\n\r\n#if YSize>=16\r\n    #define LV_H_BARRIERS_OBJECTS \\\r\n        LV_H_BARRIERS_NO_OF_OBJECTS, \\\r\n        \\\r\n        XSize-2,4,1,YSize-1-2-4,WALL, \\\r\n        1,4,1,YSize-1-2-4,WALL, \\\r\n        \\\r\n        5,YSize-2,3,1,WALL, \\\r\n        5,2,3,1,WALL, \\\r\n        XSize-8,YSize-2,3,1,WALL, \\\r\n        XSize-8,2,3,1,WALL, \\\r\n        \\\r\n        \\\r\n        XSize-2,3,1,1,FREEZE, \\\r\n        XSize-2,YSize-2,1,1,RING, \\\r\n        1,3,1,1,FREEZE, \\\r\n        1,YSize-2,1,1,RING, \\\r\n        \\\r\n        8,4,1,2,BLOCK, \\\r\n        XSize-9,4,1,2,BLOCK, \\\r\n        \\\r\n        5,8, 1,1, WALL, \\\r\n        6+LV_H_BARRIERS_BAR_SIZE,8, 1,1, WALL, \\\r\n        5,YSize-6,1,1,WALL, \\\r\n        6+LV_H_BARRIERS_BAR_SIZE,YSize-6,1,1,WALL, \\\r\n        \\\r\n        XSize-7-LV_H_BARRIERS_BAR_SIZE,8, 1,1, WALL, \\\r\n        XSize-6,8, 1,1, WALL, \\\r\n        XSize-7-LV_H_BARRIERS_BAR_SIZE,YSize-6,1,1,WALL, \\\r\n        XSize-6,YSize-6,1,1,WALL, \\\r\n        \\\r\n        8,YSize-2,XSize-16,1,DIAMOND, \\\r\n        8,2,XSize-16,1,DIAMOND, \\\r\n        \\\r\n        XSize-2-1,7,1,YSize-1-2-4-6,DIAMOND, \\\r\n        2,7,1,YSize-1-2-4-6,DIAMOND \\\r\n        \r\n\r\n#else\r\n    #define LV_H_BARRIERS_OBJECTS \\\r\n        LV_H_BARRIERS_NO_OF_OBJECTS, \\\r\n        \\\r\n        XSize-2,4,1,YSize-1-2-4,WALL, \\\r\n        1,4,1,YSize-1-2-4,WALL, \\\r\n        \\\r\n        5,YSize-2,3,1,WALL, \\\r\n        5,2,3,1,WALL, \\\r\n        XSize-8,YSize-2,3,1,WALL, \\\r\n        XSize-8,2,3,1,WALL, \\\r\n        \\\r\n        \\\r\n        XSize-2,3,1,1,FREEZE, \\\r\n        XSize-2,YSize-2,1,1,RING, \\\r\n        1,3,1,1,FREEZE, \\\r\n        1,YSize-2,1,1,RING, \\\r\n        \\\r\n        8,4,1,2,BLOCK, \\\r\n        XSize-9,4,1,2,BLOCK, \\\r\n        \\\r\n        5,8, 1,1, WALL, \\\r\n        6+LV_H_BARRIERS_BAR_SIZE,8, 1,1, WALL, \\\r\n        5,3,1,1,WALL, \\\r\n        6+LV_H_BARRIERS_BAR_SIZE,3,1,1,WALL, \\\r\n        \\\r\n        XSize-7-LV_H_BARRIERS_BAR_SIZE,8, 1,1, WALL, \\\r\n        XSize-6,8, 1,1, WALL, \\\r\n        XSize-7-LV_H_BARRIERS_BAR_SIZE,3,1,1,WALL, \\\r\n        XSize-6,3,1,1,WALL, \\\r\n        \\\r\n        8,YSize-2,XSize-16,1,DIAMOND, \\\r\n        8,2,XSize-16,1,DIAMOND, \\\r\n        \\\r\n        XSize-2-1,7,1,3,DIAMOND, \\\r\n        2,7,1,3,DIAMOND \\\r\n\r\n#endif\r\n\r\n#define LV_H_BARRIERS_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_H_BARRIERS_NO_OF_OBJECTS)\r\n\r\n\r\n//\r\n\r\n#if XSize>=20  && !defined(FEWER_SHURIKENS)\r\n    #define LV_H_BARRIERS_SHURIKENS \\\r\n        3,8,0, \\\r\n        \\\r\n        3,YSize-3, \\\r\n        XSize-5,6, \\\r\n        5,3, \\\r\n        \\\r\n        \\\r\n        3,3, \\\r\n        XSize-4,4, \\\r\n        7,5, \\\r\n        XSize-8,6, \\\r\n        6,YSize-3, \\\r\n        XSize-7,YSize-3, \\\r\n        4,7, \\\r\n        XSize-5,YSize-6 \\\r\n        \\\r\n        \\\r\n\r\n    #define LV_H_BARRIERS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(3,8,0)\r\n\r\n\r\n#else\r\n    \r\n    #define LV_H_BARRIERS_SHURIKENS \\\r\n        3,6,0, \\\r\n        \\\r\n        3,YSize-3, \\\r\n        XSize-5,6, \\\r\n        5,3, \\\r\n        \\\r\n        \\\r\n        3,3, \\\r\n        XSize-4,4, \\\r\n        6,YSize-3, \\\r\n        XSize-7,YSize-3, \\\r\n        4,7, \\\r\n        XSize-5,YSize-6 \\\r\n        \\\r\n        \\\r\n\r\n    #define LV_H_BARRIERS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(3,6,0)\r\n\r\n#endif\r\n\r\n\r\n\r\n\r\n//\r\n\r\n#define LV_H_BARRIERS_NO_OF_WALLS 4\r\n\r\n#define LV_H_BARRIERS_WALLS \\\r\n    LV_H_BARRIERS_NO_OF_WALLS, \\\r\n\t\\\r\n    6,8, \\\r\n    LV_H_BARRIERS_BAR_SIZE,1, \\\r\n    \\\r\n    6,YSize-6, \\\r\n    LV_H_BARRIERS_BAR_SIZE,1,\\\r\n    \\\r\n    XSize-7-XSize/7+1,8, \\\r\n    LV_H_BARRIERS_BAR_SIZE,1, \\\r\n    \\\r\n    XSize-7-XSize/7+1,YSize-6, \\\r\n    LV_H_BARRIERS_BAR_SIZE,1\r\n\r\n#define LV_H_BARRIERS_WALLS_SIZE LC_WALLS_SIZE(LV_H_BARRIERS_NO_OF_WALLS)\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_06_rain.h",
    "content": "\r\n// LEVEL 6 SHOWN AS 7\r\n\r\n#define LV_RAIN_NO_OF_OBJECTS 13\r\n\r\n#define LV_RAIN_OBJECTS \\\r\n\tLV_RAIN_NO_OF_OBJECTS, \\\r\n\t\\\r\n\tXSize-2,3,1,1,RING, \\\r\n\tXSize-2,YSize-2,1,1,FREEZE, \\\r\n\t\\\r\n\t1,3,1,1,RING, \\\r\n\t1,YSize-2,1,1,FREEZE, \\\r\n\t\\\r\n    4,YSize-4,4,1,WALL, \\\r\n    XSize-8,YSize-4,4,1,WALL, \\\r\n\t\\\r\n    8,4,1,4,BLOCK, \\\r\n    XSize-9,4,1,4,BLOCK, \\\r\n\t\\\r\n    XSize-2,8,1,YSize-1-2-8,DIAMOND, \\\r\n    1,8,1,YSize-1-2-8,DIAMOND, \\\r\n\t\\\r\n\t8,YSize-2,XSize-1-3-12,1,DIAMOND, \\\r\n\t\\\r\n    4,YSize-5,4,1,DIAMOND, \\\r\n    XSize-8,YSize-5,4,1,DIAMOND \\\r\n\r\n#define LV_RAIN_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_RAIN_NO_OF_OBJECTS)\r\n\r\n//\r\n\r\n#if XSize>=20\r\n    #define LV_RAIN_SHURIKENS \\\r\n        5, 0, 6, \\\r\n        \\\r\n        3,8, \\\r\n        XSize-3,YSize-6, \\\r\n        4,YSize-3, \\\r\n        5,YSize/2+3, \\\r\n        XSize-5,3, \\\r\n        \\\r\n        7, \\\r\n        2, \\\r\n        XSize-3, \\\r\n        XSize-8, \\\r\n        5, \\\r\n        XSize-6\r\n\r\n    #define LV_RAIN_SHURIKENS_SIZE LV_SHURIKENS_SIZE(5,0,6)\r\n#elif YSize>=20\r\n    #define LV_RAIN_SHURIKENS \\\r\n        5, 0, 4, \\\r\n        \\\r\n        3,8, \\\r\n        XSize-3,YSize-6, \\\r\n        4,YSize-3, \\\r\n        5,YSize/2+3, \\\r\n        XSize-5,3, \\\r\n        \\\r\n        2, \\\r\n        XSize-3, \\\r\n        4, \\\r\n        XSize-5\r\n\r\n    #define LV_RAIN_SHURIKENS_SIZE LV_SHURIKENS_SIZE(5,0,4)  \r\n#else\r\n    #define LV_RAIN_SHURIKENS \\\r\n        4, 0, 4, \\\r\n        \\\r\n        3,8, \\\r\n        XSize-3,YSize-6, \\\r\n        4,YSize-3, \\\r\n        XSize-5,3, \\\r\n        \\\r\n        2, \\\r\n        XSize-3, \\\r\n        4, \\\r\n        XSize-5\r\n\r\n    #define LV_RAIN_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,0,4)      \r\n#endif\r\n\r\n\r\n// \r\n\r\n#define LV_RAIN_NO_OF_WALLS 0\r\n\r\n\r\n#define LV_RAIN_WALLS \\\r\n\t0\r\n\t\r\n\r\n#define LV_RAIN_WALLS_SIZE LC_WALLS_SIZE(LV_RAIN_NO_OF_WALLS)\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_08_vert_walls.h",
    "content": "\r\n\r\n\r\n// LEVEL 8 SHOWN AS 9\r\n\r\n#define LV_VERT_WALLS_WIDTH (XSize/4)\r\n\r\n\r\n#define LV_VERT_WALLS_NO_OF_OBJECTS 12\r\n\r\n#if YSize>=16\r\n    #define LV_VERT_WALLS_OBJECTS \\\r\n        LV_VERT_WALLS_NO_OF_OBJECTS, \\\r\n        \\\r\n        LV_VERT_WALLS_WIDTH,2,1,YSize-7,WALL, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH,6,1,YSize-7,WALL, \\\r\n        \\\r\n        1,YSize-2,1,1,RING, \\\r\n        XSize-2,2,1,1,RING, \\\r\n        \\\r\n        LV_VERT_WALLS_WIDTH+1,2,1,1,FREEZE, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH-1,YSize-2,1,1,FREEZE, \\\r\n        \\\r\n        XSize/2+1,YSize/2-1,1,4,BLOCK, \\\r\n        XSize/2-2,YSize/2-1,1,4,BLOCK, \\\r\n        \\\r\n        LV_VERT_WALLS_WIDTH-1,2,1,YSize-7,DIAMOND, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH+1,6,1,YSize-7,DIAMOND, \\\r\n        \\\r\n        2,YSize-2,LV_VERT_WALLS_WIDTH-2,1,DIAMOND, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH+1,2,LV_VERT_WALLS_WIDTH-2,1,DIAMOND\r\n#else\r\n    #define LV_VERT_WALLS_OBJECTS \\\r\n        LV_VERT_WALLS_NO_OF_OBJECTS, \\\r\n        \\\r\n        LV_VERT_WALLS_WIDTH,2,1,3,WALL, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH,6,1,3,WALL, \\\r\n        \\\r\n        1,YSize-2,1,1,RING, \\\r\n        XSize-2,2,1,1,RING, \\\r\n        \\\r\n        LV_VERT_WALLS_WIDTH+1,2,1,1,FREEZE, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH-1,YSize-2,1,1,FREEZE, \\\r\n        \\\r\n        XSize/2+1,YSize/2-1,1,4,BLOCK, \\\r\n        XSize/2-2,YSize/2-1,1,4,BLOCK, \\\r\n        \\\r\n        LV_VERT_WALLS_WIDTH-1,2,1,3,DIAMOND, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH+1,6,1,3,DIAMOND, \\\r\n        \\\r\n        2,YSize-2,LV_VERT_WALLS_WIDTH-2,1,DIAMOND, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH+1,2,LV_VERT_WALLS_WIDTH-2,1,DIAMOND\r\n\r\n#endif\r\n\r\n#define LV_VERT_WALLS_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_VERT_WALLS_NO_OF_OBJECTS)\r\n\r\n\r\n//\r\n#if XSize>=20\r\n\r\n    #define LV_VERT_WALLS_SHURIKENS \\\r\n        4, 6, 0, \\\r\n        \\\r\n        XSize-3,3, \\\r\n        3,YSize-3, \\\r\n        XSize-5,4, \\\r\n        5,YSize-4, \\\r\n        \\\r\n        \\\r\n        \\\r\n        2,3, \\\r\n        LV_VERT_WALLS_WIDTH+1,3, \\\r\n        XSize-3,6, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH-1,6, \\\r\n        LV_VERT_WALLS_WIDTH+2,3, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH-1-1,6  \r\n\r\n    #define LV_VERT_WALLS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,6,0)\r\n\r\n#else\r\n    \r\n    #define LV_VERT_WALLS_SHURIKENS \\\r\n        4, 4, 0, \\\r\n        \\\r\n        XSize-3,3, \\\r\n        3,YSize-3, \\\r\n        XSize-5,4, \\\r\n        5,YSize-4, \\\r\n        \\\r\n        \\\r\n        \\\r\n        1,3, \\\r\n        LV_VERT_WALLS_WIDTH+1,3, \\\r\n        XSize-2,6, \\\r\n        XSize-1-LV_VERT_WALLS_WIDTH-1,6\r\n\r\n    #define LV_VERT_WALLS_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,4,0)\r\n#endif\r\n\r\n\r\n#define LV_VERT_WALLS_NO_OF_WALLS 2\r\n\r\n\r\n#define LV_VERT_WALLS_WALLS \\\r\n    LV_VERT_WALLS_NO_OF_WALLS, \\\r\n\t\\\r\n    LV_VERT_WALLS_WIDTH,YSize-5, \\\r\n    1, 4, \\\r\n    \\\r\n    XSize-1-LV_VERT_WALLS_WIDTH,2, \\\r\n    1, 4 \\\r\n\r\n#define LV_VERT_WALLS_WALLS_SIZE LC_WALLS_SIZE(LV_VERT_WALLS_NO_OF_WALLS)\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_09_squares.h",
    "content": "\r\n// LEVEL 9 SHOWN AS 10\r\n\r\n\r\n#if XSize>20\r\n    #define LV_SQUARES_WIDTH (1+(XSize/3))\r\n#elif XSize>16 \r\n\t#define LV_SQUARES_WIDTH (1+(XSize/4))\r\n#else\r\n\t#define LV_SQUARES_WIDTH XSize/5\r\n#endif\r\n\r\n#if YSize>40\r\n    #define LV_SQUARES_HEIGHT YSize/4\r\n#elif YSize>20\r\n    #define LV_SQUARES_HEIGHT YSize/4\r\n#elif YSize>16 \r\n\t#define LV_SQUARES_HEIGHT YSize/5\r\n#else\r\n\t#define LV_SQUARES_HEIGHT YSize/6\r\n#endif\r\n\r\n#define LV_SQUARES_POS ((XSize-LV_SQUARES_WIDTH)/2)\r\n\r\n#define LV_SQUARES_NO_OF_OBJECTS 16\r\n\r\n#define LV_SQUARES_OBJECTS \\\r\n    LV_SQUARES_NO_OF_OBJECTS, \\\r\n\t\\\r\n    LV_SQUARES_POS,2,LV_SQUARES_WIDTH,LV_SQUARES_HEIGHT,WALL, \\\r\n    LV_SQUARES_POS,YSize-LV_SQUARES_HEIGHT-1,LV_SQUARES_WIDTH,LV_SQUARES_HEIGHT,WALL, \\\r\n\t\\\r\n    1,2,1,1,RING, \\\r\n    XSize-2,2,1,1,RING, \\\r\n    \\\r\n    LV_SQUARES_POS-1,YSize-2,1,1,FREEZE, \\\r\n    LV_SQUARES_POS+LV_SQUARES_WIDTH,YSize-2,1,1,FREEZE, \\\r\n    LV_SQUARES_POS-1,2,1,1,FREEZE, \\\r\n    LV_SQUARES_POS+LV_SQUARES_WIDTH,2,1,1,FREEZE, \\\r\n    \\\r\n    LV_SQUARES_POS-4,YSize-LV_SQUARES_HEIGHT-1,3,1,BLOCK, \\\r\n    LV_SQUARES_POS+LV_SQUARES_WIDTH+1,YSize-LV_SQUARES_HEIGHT-1,3,1,BLOCK, \\\r\n    \\\r\n    LV_SQUARES_POS-4,YSize-LV_SQUARES_HEIGHT-1-4,3,1,BLOCK, \\\r\n    LV_SQUARES_POS+LV_SQUARES_WIDTH+1,YSize-LV_SQUARES_HEIGHT-1-4,3,1,BLOCK, \\\r\n    \\\r\n\t1,3,1,YSize-4,DIAMOND, \\\r\n\tXSize-2,3,1,YSize-4,DIAMOND, \\\r\n    \\\r\n    LV_SQUARES_POS,2+LV_SQUARES_HEIGHT,LV_SQUARES_WIDTH,1,DIAMOND, \\\r\n    LV_SQUARES_POS,YSize-LV_SQUARES_HEIGHT-2    ,LV_SQUARES_WIDTH,1,DIAMOND   \r\n    \r\n\r\n\r\n\r\n#define LV_SQUARES_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_SQUARES_NO_OF_OBJECTS)\r\n\r\n\r\n//\r\n\r\n\r\n#if XSize>=20\r\n    #define LV_SQUARES_SHURIKENS \\\r\n        4,4,4, \\\r\n        3,1+2+LV_SQUARES_HEIGHT, \\\r\n        XSize-4,YSize-LV_SQUARES_HEIGHT-1-2, \\\r\n        XSize-4,1+2+LV_SQUARES_HEIGHT+1, \\\r\n        3,YSize-LV_SQUARES_HEIGHT-1-2-1, \\\r\n        \\\r\n        LV_SQUARES_POS,1+2+LV_SQUARES_HEIGHT, \\\r\n        LV_SQUARES_POS+LV_SQUARES_WIDTH-1,YSize-LV_SQUARES_HEIGHT-1-2-1, \\\r\n        LV_SQUARES_POS-1,1+2+LV_SQUARES_HEIGHT, \\\r\n        LV_SQUARES_POS+1+LV_SQUARES_WIDTH-1,YSize-LV_SQUARES_HEIGHT-1-2-1, \\\r\n        \\\r\n        LV_SQUARES_POS-2, \\\r\n        LV_SQUARES_POS+LV_SQUARES_WIDTH-1+2, \\\r\n        2, \\\r\n        XSize-1-2    \r\n        \r\n    #define LV_SQUARES_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,4,4)\r\n#else\r\n    #define LV_SQUARES_SHURIKENS \\\r\n        4,4,2, \\\r\n        3,1+2+LV_SQUARES_HEIGHT, \\\r\n        XSize-4,YSize-LV_SQUARES_HEIGHT-1-2, \\\r\n        XSize-4,1+2+LV_SQUARES_HEIGHT+1, \\\r\n        3,YSize-LV_SQUARES_HEIGHT-1-2-1, \\\r\n        \\\r\n        LV_SQUARES_POS,1+2+LV_SQUARES_HEIGHT, \\\r\n        LV_SQUARES_POS+LV_SQUARES_WIDTH-1,YSize-LV_SQUARES_HEIGHT-1-2-1, \\\r\n        LV_SQUARES_POS-1,1+2+LV_SQUARES_HEIGHT, \\\r\n        LV_SQUARES_POS+1+LV_SQUARES_WIDTH-1,YSize-LV_SQUARES_HEIGHT-1-2-1, \\\r\n        \\\r\n        2, \\\r\n        XSize-1-2    \r\n        \r\n    #define LV_SQUARES_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,4,2)\r\n#endif\r\n\r\n\r\n#define LV_SQUARES_NO_OF_WALLS 0\r\n\r\n#define LV_SQUARES_WALLS \\\r\n\tLV_SQUARES_NO_OF_WALLS\r\n\r\n\r\n#define LV_SQUARES_WALLS_SIZE LC_WALLS_SIZE(LV_SQUARES_NO_OF_WALLS)\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/level_10_many.h",
    "content": "\r\n// LEVEL 10 SHOWN AS 11\r\n\r\n\r\n#if XSize>=20\r\n    #define _MINI_WALL_OFFSET 0\r\n    #define _MINI_WALL_SIZE 4\r\n#else\r\n    #define _MINI_WALL_OFFSET 2\r\n    #define _MINI_WALL_SIZE 2\r\n#endif\r\n\r\n\r\n#define LV_MANY_NO_OF_OBJECTS 18\r\n\r\n#define LV_MANY_OBJECTS \\\r\n    LV_MANY_NO_OF_OBJECTS, \\\r\n\t\\\r\n\tXSize/2-6+_MINI_WALL_OFFSET,YSize-3,_MINI_WALL_SIZE,2,WALL, \\\r\n\tXSize/2-6+_MINI_WALL_OFFSET,2,_MINI_WALL_SIZE,2,WALL, \\\r\n\t\\\r\n\tXSize/2+2,YSize-3,_MINI_WALL_SIZE,2,WALL, \\\r\n\tXSize/2+2,2,_MINI_WALL_SIZE,2,WALL, \\\r\n\t\\\r\n    XSize/2-5,YSize/2,2,2,WALL, \\\r\n    XSize/2+3,YSize/2,2,2,WALL, \\\r\n    \\\r\n    XSize/2-4,YSize/2-2,2,1,BLOCK, \\\r\n    XSize/2+2,YSize/2-2,2,1,BLOCK, \\\r\n    \\\r\n    XSize/2-5+1,YSize/2+3,2,1,BLOCK, \\\r\n    XSize/2+2,YSize/2+3,2,1,BLOCK, \\\r\n\t\\\r\n\tXSize-2,2,1,1,FREEZE, \\\r\n\tXSize-2,YSize-2,1,1,RING, \\\r\n    \\\r\n\t1,2,1,1,FREEZE, \\\r\n\t1,YSize-2,1,1,RING, \\\r\n    \\\r\n    XSize-2,4,1,YSize-1-2-4,DIAMOND, \\\r\n    1,4,1,YSize-1-2-4,DIAMOND, \\\r\n\t\\\r\n\tXSize/2-2,YSize-3,4,2,DIAMOND, \\\r\n\tXSize/2-2,2,4,2,DIAMOND\r\n\r\n#define LV_MANY_OBJECTS_SIZE LV_OBJECTS_SIZE(LV_MANY_NO_OF_OBJECTS)\r\n\r\n\r\n#if XSize>=20 && YSize>=21\r\n    #if !defined(FEWER_SHURIKENS)\r\n        #define LV_MANY_SHURIKENS \\\r\n            8, 4, 4, \\\r\n            \\\r\n            3,1+3, \\\r\n            3,1+5, \\\r\n            XSize-4,1+6, \\\r\n            3,YSize-1-6, \\\r\n            3,YSize-1-4, \\\r\n            XSize-4,1+4, \\\r\n            XSize-4,YSize-1-5, \\\r\n            XSize-4,YSize-1-3, \\\r\n            \\\r\n            2,4, \\\r\n            XSize-1-2,4, \\\r\n            4,4, \\\r\n            XSize-1-4,5, \\\r\n            \\\r\n            2, \\\r\n            XSize-1-2, \\\r\n            3, \\\r\n            XSize-1-3\r\n\r\n        #define LV_MANY_SHURIKENS_SIZE LV_SHURIKENS_SIZE(8,4,4)\r\n    #else\r\n        #define LV_MANY_SHURIKENS \\\r\n            4, 2, 4, \\\r\n            \\\r\n            3,1+3, \\\r\n            3,YSize-1-6, \\\r\n            XSize-4,1+4, \\\r\n            XSize-4,YSize-1-3, \\\r\n            \\\r\n            2,4, \\\r\n            XSize-1-2,4, \\\r\n            \\\r\n            2, \\\r\n            XSize-1-2, \\\r\n            3, \\\r\n            XSize-1-3\r\n\r\n\r\n        #define LV_MANY_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,2,4)\r\n    #endif\r\n\r\n\r\n#elif YSize>=21\r\n    #if !defined(FEWER_SHURIKENS)\r\n        #define LV_MANY_SHURIKENS \\\r\n            8, 2, 4, \\\r\n            \\\r\n            3,1+3, \\\r\n            3,1+5, \\\r\n            XSize-4,1+6, \\\r\n            3,YSize-1-6, \\\r\n            3,YSize-1-4, \\\r\n            XSize-4,1+4, \\\r\n            XSize-4,YSize-1-5, \\\r\n            XSize-4,YSize-1-3, \\\r\n            \\\r\n            2,4, \\\r\n            XSize-1-2,4, \\\r\n            \\\r\n            2, \\\r\n            XSize-1-2, \\\r\n            3, \\\r\n            XSize-1-3\r\n\r\n\r\n        #define LV_MANY_SHURIKENS_SIZE LV_SHURIKENS_SIZE(8,2,4)\r\n    #else\r\n        #define LV_MANY_SHURIKENS \\\r\n            4, 2, 4, \\\r\n            \\\r\n            3,1+3, \\\r\n            3,YSize-1-6, \\\r\n            XSize-4,1+4, \\\r\n            XSize-4,YSize-1-3, \\\r\n            \\\r\n            2,4, \\\r\n            XSize-1-2,4, \\\r\n            \\\r\n            2, \\\r\n            XSize-1-2, \\\r\n            3, \\\r\n            XSize-1-3\r\n\r\n\r\n        #define LV_MANY_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,2,4)\r\n\r\n    #endif\r\n\r\n#elif YSize>=17\r\n    #define LV_MANY_SHURIKENS \\\r\n        5, 2, 4, \\\r\n        \\\r\n        3,1+3, \\\r\n        XSize-4,1+6, \\\r\n        3,YSize-1-4, \\\r\n        XSize-4,1+4, \\\r\n        XSize-4,YSize-1-3, \\\r\n        \\\r\n        2,4, \\\r\n        XSize-1-2,4, \\\r\n        \\\r\n        2, \\\r\n        XSize-1-2, \\\r\n        3, \\\r\n        XSize-1-3\r\n\r\n\r\n    #define LV_MANY_SHURIKENS_SIZE LV_SHURIKENS_SIZE(5,2,4) \r\n#else\r\n    #define LV_MANY_SHURIKENS \\\r\n        4, 2, 4, \\\r\n        \\\r\n        3,1+3, \\\r\n        XSize-4,1+6, \\\r\n        XSize-4,1+4, \\\r\n        XSize-4,YSize-1-3, \\\r\n        \\\r\n        2,4, \\\r\n        XSize-1-2,4, \\\r\n        \\\r\n        2, \\\r\n        XSize-1-2, \\\r\n        3, \\\r\n        XSize-1-3\r\n\r\n\r\n    #define LV_MANY_SHURIKENS_SIZE LV_SHURIKENS_SIZE(4,2,4) \r\n#endif\r\n\r\n// \r\n\r\n#define LV_MANY_WALLS 0\r\n#define LV_MANY_WALLS_SIZE LC_WALLS_SIZE(LV_MANY_WALLS)\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/levels.h",
    "content": "#include \"cross_lib.h\"\r\n#include \"screen_types.h\"\r\n\r\n#if !defined(FEWER_SHURIKENS) && (YSize<=16 || XSize<=16)\r\n    #define FEWER_SHURIKENS\r\n#endif\r\n\r\n// ------------------------------------------------------------\r\n// Helper macros to compute sizes and offsets\r\n#define LV_OBJECTS_SIZE(no_of_rect) (1+(no_of_rect*5))\r\n\r\n#define LV_SHURIKENS_SIZE(horiz,vert,mini) (1+(horiz)*2+ 1+(vert)*2+ 1+(mini))\r\n\r\n#define LC_WALLS_SIZE(walls) (1+(walls*4))\r\n//\r\n\r\n#include \"level_00_horiz.h\"        // level 0\r\n#include \"level_01_vert_bars.h\"    // level 1\r\n#include \"level_02_cross.h\"        // level 2\r\n\r\n#include \"level_04_horiz_walls.h\"  // level 4\r\n#include \"level_05_h_barriers.h\"   // level 5\r\n#include \"level_06_rain.h\"         // level 6\r\n\r\n#include \"level_08_vert_walls.h\"   // level 8\r\n#include \"level_09_squares.h\"      // level 9\r\n#include \"level_10_many.h\"         // level 10\r\n\r\n#include \"level_03_07_11_boss.h\"   // level 3, 7, 11\r\n\r\n\r\n// Level 0 - shown as 1\r\n#define LV_0_OBJECTS LV_HORIZ_OBJECTS\r\n#define LV_0_OBJECTS_SIZE LV_HORIZ_OBJECTS_SIZE\r\n#define LV_0_SHURIKENS LV_HORIZ_SHURIKENS\r\n#define LV_0_SHURIKENS_SIZE LV_HORIZ_SHURIKENS_SIZE\r\n#define LV_0_WALLS LV_HORIZ_WALLS \r\n#define LV_0_WALLS_SIZE LV_HORIZ_WALLS_SIZE\r\n\r\n\r\n// Level 1 - shown as 2\r\n#define LV_1_OBJECTS LV_VERT_BARS_OBJECTS\r\n#define LV_1_OBJECTS_SIZE LV_VERT_BARS_OBJECTS_SIZE\r\n#define LV_1_SHURIKENS LV_VERT_BARS_SHURIKENS\r\n#define LV_1_SHURIKENS_SIZE LV_VERT_BARS_SHURIKENS_SIZE\r\n#define LV_1_WALLS LV_VERT_BARS_WALLS \r\n#define LV_1_WALLS_SIZE LV_VERT_BARS_WALLS_SIZE\r\n\r\n// Level 2 - shown as 3\r\n#define LV_2_OBJECTS LV_CROSS_OBJECTS\r\n#define LV_2_OBJECTS_SIZE LV_CROSS_OBJECTS_SIZE\r\n#define LV_2_SHURIKENS LV_CROSS_SHURIKENS\r\n#define LV_2_SHURIKENS_SIZE LV_CROSS_SHURIKENS_SIZE\r\n#define LV_2_WALLS LV_CROSS_WALLS \r\n#define LV_2_WALLS_SIZE LV_CROSS_WALLS_SIZE\r\n\r\n\r\n// [boss level] Level 3 - shown as 4\r\n//\r\n\r\n// Level 4 - shown as 5\r\n#define LV_4_OBJECTS LV_HORIZ_WALLS_OBJECTS\r\n#define LV_4_OBJECTS_SIZE LV_HORIZ_WALLS_OBJECTS_SIZE\r\n#define LV_4_SHURIKENS LV_HORIZ_WALLS_SHURIKENS\r\n#define LV_4_SHURIKENS_SIZE LV_HORIZ_WALLS_SHURIKENS_SIZE\r\n#define LV_4_WALLS LV_HORIZ_WALLS_WALLS \r\n#define LV_4_WALLS_SIZE LV_HORIZ_WALLS_WALLS_SIZE\r\n\r\n\r\n// Level 5 - shown as 6\r\n#define LV_5_OBJECTS LV_H_BARRIERS_OBJECTS\r\n#define LV_5_OBJECTS_SIZE LV_H_BARRIERS_OBJECTS_SIZE\r\n#define LV_5_SHURIKENS LV_H_BARRIERS_SHURIKENS\r\n#define LV_5_SHURIKENS_SIZE LV_H_BARRIERS_SHURIKENS_SIZE\r\n#define LV_5_WALLS LV_H_BARRIERS_WALLS \r\n#define LV_5_WALLS_SIZE LV_H_BARRIERS_WALLS_SIZE\r\n\r\n\r\n// Level 6 - shown as 7\r\n#define LV_6_OBJECTS LV_RAIN_OBJECTS\r\n#define LV_6_OBJECTS_SIZE LV_RAIN_OBJECTS_SIZE\r\n#define LV_6_SHURIKENS LV_RAIN_SHURIKENS\r\n#define LV_6_SHURIKENS_SIZE LV_RAIN_SHURIKENS_SIZE\r\n#define LV_6_WALLS LV_RAIN_WALLS \r\n#define LV_6_WALLS_SIZE LV_RAIN_WALLS_SIZE\r\n\r\n\r\n// [boss level] Level 7 - shown as 8\r\n//\r\n\r\n// Level 8 - shown as 9\r\n#define LV_8_OBJECTS LV_VERT_WALLS_OBJECTS\r\n#define LV_8_OBJECTS_SIZE LV_VERT_WALLS_OBJECTS_SIZE\r\n#define LV_8_SHURIKENS LV_VERT_WALLS_SHURIKENS\r\n#define LV_8_SHURIKENS_SIZE LV_VERT_WALLS_SHURIKENS_SIZE\r\n#define LV_8_WALLS LV_VERT_WALLS_WALLS \r\n#define LV_8_WALLS_SIZE LV_VERT_WALLS_WALLS_SIZE\r\n\r\n\r\n// Level 9 - shown as 10\r\n#define LV_9_OBJECTS LV_SQUARES_OBJECTS\r\n#define LV_9_OBJECTS_SIZE LV_SQUARES_OBJECTS_SIZE\r\n#define LV_9_SHURIKENS LV_SQUARES_SHURIKENS\r\n#define LV_9_SHURIKENS_SIZE LV_SQUARES_SHURIKENS_SIZE\r\n#define LV_9_WALLS LV_SQUARES_WALLS \r\n#define LV_9_WALLS_SIZE LV_SQUARES_WALLS_SIZE\r\n\r\n// Level 10 - shown as 11\r\n#define LV_10_OBJECTS LV_MANY_OBJECTS\r\n#define LV_10_OBJECTS_SIZE LV_MANY_OBJECTS_SIZE\r\n#define LV_10_SHURIKENS LV_MANY_SHURIKENS\r\n#define LV_10_SHURIKENS_SIZE LV_MANY_SHURIKENS_SIZE\r\n#define LV_10_WALLS LV_MANY_WALLS \r\n#define LV_10_WALLS_SIZE LV_MANY_WALLS_SIZE\r\n\r\n\r\n// [boss level] Level 11 - shown as 12 \r\n//\r\n\r\n// ----------------------------------------------------------\r\n// Objects: static walls and collectable items\r\nconst uint8_t objects_map[] =\r\n{\r\n\r\n\tLV_0_OBJECTS,\r\n\t\r\n\tLV_1_OBJECTS,\r\n    \r\n\tLV_2_OBJECTS,\r\n\t\r\n\tLV_4_OBJECTS,\r\n    \r\n    LV_5_OBJECTS,\r\n    \r\n    LV_6_OBJECTS,\r\n\t\r\n    LV_8_OBJECTS,\r\n    \r\n    LV_9_OBJECTS,\r\n    \r\n    LV_10_OBJECTS,\r\n\t\r\n\tLV_CHALLENGE_OBJECTS\r\n};\r\n\r\n\r\nconst uint16_t objects_index[] = \r\n{\r\n\t0, // level 0\r\n\tLV_0_OBJECTS_SIZE, // level 1\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE, // level 2\r\n    0,    // level 3  (challenge)\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE+LV_2_OBJECTS_SIZE, // level 4\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE+LV_2_OBJECTS_SIZE+LV_4_OBJECTS_SIZE, // level 5\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE+LV_2_OBJECTS_SIZE+LV_4_OBJECTS_SIZE+LV_5_OBJECTS_SIZE, // level 6\r\n    0,    // level 7  (challenge)\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE+LV_2_OBJECTS_SIZE+LV_4_OBJECTS_SIZE+LV_5_OBJECTS_SIZE+LV_6_OBJECTS_SIZE, // level 8\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE+LV_2_OBJECTS_SIZE+LV_4_OBJECTS_SIZE+LV_5_OBJECTS_SIZE+LV_6_OBJECTS_SIZE+LV_8_OBJECTS_SIZE, // level 9\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE+LV_2_OBJECTS_SIZE+LV_4_OBJECTS_SIZE+LV_5_OBJECTS_SIZE+LV_6_OBJECTS_SIZE+LV_8_OBJECTS_SIZE+LV_9_OBJECTS_SIZE,\r\n\t0,\r\n\tLV_0_OBJECTS_SIZE+LV_1_OBJECTS_SIZE+LV_2_OBJECTS_SIZE+LV_4_OBJECTS_SIZE+LV_5_OBJECTS_SIZE+LV_6_OBJECTS_SIZE+LV_8_OBJECTS_SIZE+LV_9_OBJECTS_SIZE+LV_10_OBJECTS_SIZE,\r\n    // 0, // level 11 (challenge)\r\n};\r\n\r\n\r\n// ----------------------------------------------------------\r\n// Shurikens: horizontal, vertical and mini-shurikens\r\nconst uint8_t shurikens_map[] =\r\n{\r\n\r\n\tLV_0_SHURIKENS,\r\n\t\r\n\t// level=1\r\n   \tLV_1_SHURIKENS,\r\n\r\n    // level=2\r\n   \tLV_2_SHURIKENS,\r\n        \r\n    // level=3\r\n\tLV_4_SHURIKENS,\r\n    \r\n    //\r\n    LV_5_SHURIKENS,\r\n  \r\n    //\r\n    LV_6_SHURIKENS,\r\n\t\r\n\t//\r\n\tLV_8_SHURIKENS,\r\n    \r\n    //\r\n    LV_9_SHURIKENS,\r\n    \r\n    //\r\n    LV_10_SHURIKENS,\r\n    \r\n};\r\n\r\n// cross, squares, many\r\nconst uint8_t shurikens_index[] = \r\n{\r\n\t0,\r\n\tLV_0_SHURIKENS_SIZE,\r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE,\r\n    LV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE, // challenge (same as CROSS level)\r\n    \r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE,\r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE+LV_4_SHURIKENS_SIZE,\r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE+LV_4_SHURIKENS_SIZE+LV_5_SHURIKENS_SIZE,\r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE+LV_4_SHURIKENS_SIZE+LV_5_SHURIKENS_SIZE+LV_6_SHURIKENS_SIZE+LV_8_SHURIKENS_SIZE, // challenge (same as squares)\r\n    \r\n    LV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE+LV_4_SHURIKENS_SIZE+LV_5_SHURIKENS_SIZE+LV_6_SHURIKENS_SIZE,\r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE+LV_4_SHURIKENS_SIZE+LV_5_SHURIKENS_SIZE+LV_6_SHURIKENS_SIZE+LV_8_SHURIKENS_SIZE,\r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE+LV_4_SHURIKENS_SIZE+LV_5_SHURIKENS_SIZE+LV_6_SHURIKENS_SIZE+LV_8_SHURIKENS_SIZE+LV_9_SHURIKENS_SIZE,\r\n\tLV_0_SHURIKENS_SIZE+LV_1_SHURIKENS_SIZE+LV_2_SHURIKENS_SIZE+LV_4_SHURIKENS_SIZE+LV_5_SHURIKENS_SIZE+LV_6_SHURIKENS_SIZE+LV_8_SHURIKENS_SIZE+LV_9_SHURIKENS_SIZE, // This is CORRECT - challenge\r\n    // 1+2*12+1+1,\r\n    // 1+2*12+1+1+ 1+2*2+1+1+4*1,\r\n    // 1+2*12+1+1+ 1+2*2+1+1+4*1+ 1+2*2+ 1+4*2+ 1,    \r\n    // TODO: ....\r\n};\r\n\r\n\r\n\r\n// ----------------------------------------------------------\r\n// Walls: dynamic walls\r\nconst uint8_t walls_map[] =\r\n{\r\n\tLV_0_WALLS,\r\n\tLV_1_WALLS,\r\n\tLV_2_WALLS,\r\n\tLV_4_WALLS,\r\n    LV_5_WALLS,\r\n    LV_6_WALLS,\r\n\tLV_8_WALLS,\r\n    LV_9_WALLS,\r\n    LV_10_WALLS,\r\n\tLV_CHALLENGE_WALLS,\r\n};\r\n\r\nconst uint8_t walls_index[] =\r\n{\r\n\t0,\r\n\tLV_0_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE+LV_5_WALLS_SIZE+LV_6_WALLS_SIZE+LV_8_WALLS_SIZE+LV_9_WALLS_SIZE+LV_10_WALLS_SIZE, // challenge walls\r\n\t\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE+LV_5_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE+LV_5_WALLS_SIZE+LV_6_WALLS_SIZE+LV_8_WALLS_SIZE+LV_9_WALLS_SIZE+LV_10_WALLS_SIZE, // challenge walls\r\n\t\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE+LV_5_WALLS_SIZE+LV_6_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE+LV_5_WALLS_SIZE+LV_6_WALLS_SIZE+LV_8_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE+LV_5_WALLS_SIZE+LV_6_WALLS_SIZE+LV_8_WALLS_SIZE+LV_9_WALLS_SIZE,\r\n\tLV_0_WALLS_SIZE+LV_1_WALLS_SIZE+LV_2_WALLS_SIZE+LV_4_WALLS_SIZE+LV_5_WALLS_SIZE+LV_6_WALLS_SIZE+LV_8_WALLS_SIZE+LV_9_WALLS_SIZE+LV_10_WALLS_SIZE, // challenge walls\r\n\r\n    // 0,\r\n    // 1,\r\n    // 1+1+2*8,\r\n};\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHURIKEN by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#include \"screen_types.h\"\n#include \"levels.h\"\n\n#define INITIAL_LEVEL 0\n#define FINAL_LEVEL 11\n\n#define INITIAL_LIVES 5\n\n// DEBUG\n// #define SHOW_LEVELS\n// #define INVINCIBLE\n\n// TILES\n\n#if XSize>=20\n   #define MAX_NUMBER_OF_SHURIKENS 12\n#else\n   #define MAX_NUMBER_OF_SHURIKENS 10\n#endif\n\n\n#define MAX_TIME 5\n\n// Left low player in the 2x2 multi-tile\n#define LEFT_LOW_TILE0      _TILE_2\n#define LEFT_LOW_TILE1      _TILE_6\n#define LEFT_LOW_TILE2      _TILE_10\n#define LEFT_LOW_TILE3      _TILE_14\n\n#define RIGHT_LOW_TILE0     _TILE_3\n#define RIGHT_LOW_TILE1     _TILE_7\n#define RIGHT_LOW_TILE2     _TILE_11\n#define RIGHT_LOW_TILE3     _TILE_15\n\n#define LEFT_UP_TILE0       _TILE_0\n#define LEFT_UP_TILE1       _TILE_4\n#define LEFT_UP_TILE2       _TILE_8\n#define LEFT_UP_TILE3       _TILE_12\n\n#define RIGHT_UP_TILE0      _TILE_1\n#define RIGHT_UP_TILE1      _TILE_5\n#define RIGHT_UP_TILE2      _TILE_9\n#define RIGHT_UP_TILE3      _TILE_13\n\n#define SHURIKEN_TILE       _TILE_16\n#define SHURIKEN_TILE_DOWN  _TILE_17\n#define SHURIKEN_TILE_UP    _TILE_18\n#define SHURIKEN_TILE_LEFT  _TILE_19\n#define SHURIKEN_TILE_RIGHT _TILE_20\n\n#define WALL_TILE           _TILE_21\n\n#define BLOCK_TILE          _TILE_22\n\n#define FREEZE_TILE         _TILE_23\n\n#define MINI_SHURIKEN_TILE  _TILE_24\n\n#define RING_TILE           _TILE_25\n\n#define DIAMOND_TILE        _TILE_26\n\n#define RINGS_X XSize/2-3\n\n#define SHURIKEN_LEFT 0\n#define SHURIKEN_RIGHT 1\n#define SHURIKEN_UP 0\n#define SHURIKEN_DOWN 1\n\n#define PLAYER_LEFT 0\n#define PLAYER_RIGHT 1\n#define PLAYER_UP 2\n#define PLAYER_DOWN 3\n\n#define MIN_PLAYER_Y 3\n#define MAX_PLAYER_Y (2*YSize-6)\n#define MIN_PLAYER_X 2\n#define MAX_PLAYER_X (2*XSize-5)\n\n#define MOVE_FORCE 3U\n#define DESTROY_FORCE 14U\n\n#if XSize>=20\n#define MAX_NUMBER_OF_MINI_SHURIKENS 6\n#else\n#define MAX_NUMBER_OF_MINI_SHURIKENS 4\n#endif\n\n#define MAX_NUMBER_OF_BARRIERS 4\n\n#define DIAMOND_POINTS 10U\n#define FREEZE_POINTS 30U\n#define RING_POINTS 50U\n#define SHURIKEN_POINTS 100U\n\n#define ITEM_BONUS 50U\n\n#if XSize<32\n    #define BASE_RING_EFFECT 40U\n#else\n    #define BASE_RING_EFFECT 30U\n#endif\n\n#define START_RING_EFFECT 35U\n\n#define EXTRA_LIFE_THRESHOLD 5000U\n\n#define BARRIER_THRESHOLD 25\n\nuint8_t player_x;\nuint8_t player_y;\n\nuint8_t screen_x;\nuint8_t screen_y;\n\nuint8_t alive;\nuint8_t lives;\nuint8_t level;\nuint8_t remaining_diamonds;\n\nuint8_t shuriken_x[MAX_NUMBER_OF_SHURIKENS];\nuint8_t shuriken_y[MAX_NUMBER_OF_SHURIKENS];\nuint8_t shuriken_direction[MAX_NUMBER_OF_SHURIKENS];\nuint8_t shuriken_transition[MAX_NUMBER_OF_SHURIKENS];\n#define shuriken_status shuriken_x\n\nuint8_t shuriken_axis[MAX_NUMBER_OF_SHURIKENS];\n\n#define SHURIKEN_HORIZONTAL 0\n#define SHURIKEN_VERTICAL   1\n\nuint8_t mini_shuriken_x[MAX_NUMBER_OF_MINI_SHURIKENS];\nuint8_t mini_shuriken_y[MAX_NUMBER_OF_MINI_SHURIKENS];\n\nuint8_t map[XSize][YSize];\n\nuint8_t force;\n\nuint8_t player_cell[4];\n\nuint16_t score;\nuint16_t hiscore;\n\n#if !defined(_XL_NO_COLOR)\nuint8_t player_color;   \n#else\n#define player_color 0\n#endif\n\nuint8_t level_shurikens;\nuint8_t level_mini_shurikens;\n\nuint8_t barrier_x[MAX_NUMBER_OF_BARRIERS];\nuint8_t barrier_y[MAX_NUMBER_OF_BARRIERS];\nuint8_t barrier_width[MAX_NUMBER_OF_BARRIERS];\nuint8_t barrier_height[MAX_NUMBER_OF_BARRIERS];\nuint8_t barrier_counter;\nuint8_t barrier_triggered[MAX_NUMBER_OF_BARRIERS];\n\nuint8_t number_of_barriers;\n\nuint8_t freeze_active;\nuint8_t freeze_counter;\n\nuint8_t ring_active;\nuint8_t ring_counter;\n\nuint8_t counter;\n\nuint8_t shuriken_counter;\n\nuint8_t new_level;\n\nuint8_t tile_group;\n\nuint8_t time_counter;\n\nuint8_t player_direction;\n\nuint8_t extra_life_counter;\n\nuint8_t shuriken_challenge;\n\nuint8_t barrier_type;\n\nuint8_t challenge_level;\n\nuint8_t remaining_shurikens;\n\nuint8_t barrier_threshold;\n\nuint8_t input;\n    \n\nstatic const uint8_t screen_tile[7+1] =\n{\n    0, // unused\n    RING_TILE,\n    FREEZE_TILE,\n    DIAMOND_TILE,\n    BLOCK_TILE,\n    WALL_TILE,\n    SHURIKEN_TILE,\n    MINI_SHURIKEN_TILE,\n};  \n\n\n#if !defined(_XL_NO_COLOR)\nstatic uint8_t screen_color[7+1] =\n{\n    0, // unused\n    _XL_WHITE,\n    _XL_CYAN,\n    _XL_GREEN,\n    _XL_GREEN,\n    _XL_RED,\n    _XL_CYAN,\n    _XL_YELLOW,\n};  \n\n\nstatic const uint8_t border_colors[] = {   _XL_RED,   _XL_CYAN, _XL_YELLOW, _XL_CYAN};\n    \nstatic const uint8_t wall_colors[] =   {_XL_YELLOW, _XL_YELLOW,   _XL_CYAN, _XL_RED};\n#endif\n\n\n#define SHURIKEN_COLOR _XL_CYAN\n\nstatic const uint8_t player_tile[4][4] =\n{\n    { // left lower 12x12 multi-tile inside a 16x16 quad tile\n        LEFT_UP_TILE0,\n        RIGHT_UP_TILE0,\n        LEFT_LOW_TILE0,\n        RIGHT_LOW_TILE0,\n    },\n    { // right lower 12x12 multi-tile inside a 16x16 quad tile\n        LEFT_UP_TILE1,\n        RIGHT_UP_TILE1,\n        LEFT_LOW_TILE1,\n        RIGHT_LOW_TILE1,\n    },\n    { // left upper 12x12 multi-tile inside a 16x16 quad tile\n        LEFT_UP_TILE2,\n        RIGHT_UP_TILE2,\n        LEFT_LOW_TILE2,\n        RIGHT_LOW_TILE2,\n    },\n    { // right upper 12x12 multi-tile inside a 16x16 quad tile \n        LEFT_UP_TILE3,\n        RIGHT_UP_TILE3,\n        LEFT_LOW_TILE3,\n        RIGHT_LOW_TILE3,\n    },\n};\n\n\nvoid short_pause(void)\n{\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n}\n\n\nvoid one_second_pause(void)\n{\n    _XL_SLEEP(1);\n}\n\n\n\nvoid build_element(uint8_t type, uint8_t x, uint8_t y)\n{\n    map[x][y] = type;\n    #if !defined(_XL_NO_COLOR)\n    _XL_DRAW(x,y,screen_tile[type], screen_color[type]);\n    #else\n    _XL_DRAW(x,y,screen_tile[type], 0);\n    #endif\n}\n\n\nvoid delete_element(uint8_t x, uint8_t y)\n{\n    map[x][y] = EMPTY;\n    _XL_DELETE(x,y);\n}\n\n\n#define update_screen_xy() \\\ndo { \\\n    screen_x = player_x>>1; \\\n    screen_y = (player_y+1)>>1; \\\n} while(0)\n    \n\n#define update_score_display() \\\ndo \\\n{ \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    _XL_PRINTD(0,0,5,score); \\\n} while(0)\n\n\n#if XSize>=20\n    #define update_remaining_display() \\\n    do \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINTD(7,0,2,remaining_diamonds); \\\n    } while(0)\n#else\n    #define update_remaining_display() \n#endif\n\n\nvoid delete_player_down(void)\n{\n    _XL_DELETE(screen_x,screen_y+1);\n    _XL_DELETE(screen_x+1,screen_y+1);      \n}\n\n\nvoid delete_player_up(void)\n{\n    _XL_DELETE(screen_x,screen_y);\n    _XL_DELETE(screen_x+1,screen_y);   \n}\n\n\n#define delete_player_left() \\\ndo \\\n{ \\\n    _XL_DELETE(screen_x,screen_y); \\\n    _XL_DELETE(screen_x,screen_y+1); \\\n} while(0)\n\n\n#define delete_player_right() \\\ndo \\\n{ \\\n    _XL_DELETE(screen_x+1,screen_y); \\\n    _XL_DELETE(screen_x+1,screen_y+1); \\\n} while(0)\n\n\nvoid delete_player(void)\n{\n    delete_player_down();\n    delete_player_up();\n}\n\n\nvoid display_player(void)\n{\n    // #if !defined(_XL_NO_COLOR)\n    _XL_DRAW(screen_x,screen_y,player_tile[tile_group][2],player_color);\n    _XL_DRAW(screen_x+1,screen_y,player_tile[tile_group][3],player_color);  \n    _XL_DRAW(screen_x,screen_y+1,player_tile[tile_group][0],player_color);\n    _XL_DRAW(screen_x+1,screen_y+1,player_tile[tile_group][1],player_color);  \n    // #else\n    // if(!ring_active || (counter&1))\n    // {\n        // _XL_DRAW(screen_x,screen_y,player_tile[tile_group][2],player_color);\n        // _XL_DRAW(screen_x+1,screen_y,player_tile[tile_group][3],player_color);  \n        // _XL_DRAW(screen_x,screen_y+1,player_tile[tile_group][0],player_color);\n        // _XL_DRAW(screen_x+1,screen_y+1,player_tile[tile_group][1],player_color);     \n    // }\n    // else\n    // {\n        // delete_player();\n    // }\n    \n    // #endif\n}\n\n\n#define update_freeze_display() \\\n    _XL_PRINTD(4,YSize-1,1,freeze_counter)\n\n\n#define update_ring_display() \\\ndo \\\n{ \\\n    _XL_SET_TEXT_COLOR(_XL_GREEN); \\\n    _XL_PRINTD(1,YSize-1,1,ring_counter); \\\n} while(0)\n\n\n#define update_shuriken_display() \\\n    _XL_PRINTD(7,YSize-1,2,shuriken_counter)\n\n\nvoid update_time_counter_display(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(11,YSize-1,1,time_counter);    \n}\n\n\nvoid update_item_display(void)\n{\n    update_score_display();\n    \n    update_remaining_display();\n    \n    update_time_counter_display();\n    \n    update_freeze_display();\n    update_shuriken_display();\n    \n    update_ring_display();\n\n}\n\n\nvoid increase_time_counter_if_not_max(void)\n{\n    if(time_counter<MAX_TIME)\n    {\n        ++time_counter;\n    }\n    else\n    {\n        counter=0;\n    }\n    update_item_display();\n}\n\n\nvoid delete_player_cells(void)\n{\n    map[screen_x][screen_y]=EMPTY;\n    map[screen_x+1][screen_y]=EMPTY;\n    map[screen_x][screen_y+1]=EMPTY;\n    map[screen_x+1][screen_y+1]=EMPTY;\n}\n\n\nvoid handle_collisions(void)\n{\n    uint8_t i;\n    uint8_t cell_value;\n    \n    player_cell[0] = map[screen_x][screen_y];\n    player_cell[1] = map[screen_x+1][screen_y];\n    player_cell[2] = map[screen_x][screen_y+1];\n    player_cell[3] = map[screen_x+1][screen_y+1];\n    \n    for(i=0;i<4;++i)\n    {\n        cell_value = player_cell[i];\n\n        if(cell_value)\n        {\n            if(cell_value==DIAMOND)\n            {\n                _XL_PING_SOUND();\n                score+=DIAMOND_POINTS;\n                --remaining_diamonds;\n                update_item_display();\n            }\n            else if(cell_value==FREEZE)\n            {\n                _XL_ZAP_SOUND();\n                score+=FREEZE_POINTS;\n                ++freeze_counter;\n                freeze_active=freeze_counter<<4;\n                increase_time_counter_if_not_max();\n            }\n            else if(cell_value==RING)\n            {\n                _XL_ZAP_SOUND();\n                score+=RING_POINTS;\n                ++ring_counter;\n                #if !defined(_XL_NO_COLOR)\n                player_color = _XL_CYAN;\n                #endif\n                ring_active=BASE_RING_EFFECT+(ring_counter<<4);\n                increase_time_counter_if_not_max();\n            }\n            else if(cell_value>=DEADLY)\n            {\n                if(ring_active)\n                {\n                    display_player();\n                }\n                else\n                {\n                    alive=0;\n                }\n            }\n            else if(cell_value==BLOCK) // Useful in challenge levels to avoid visually deleting blocks \n            {\n                delete_player_cells();\n            }\n        }\n    } \n}\n\n\nvoid update_player(void)\n{\n    tile_group = (player_x&1)+2*(player_y&1);\n    \n    update_screen_xy();\n    \n    display_player();\n    \n    handle_collisions();\n    \n    delete_player_cells();\n}\n\n\nuint8_t allowed(uint8_t cell1, uint8_t cell2, uint8_t beyond_cell1, uint8_t beyond_cell2)\n{\n    if((cell1==BLOCK)||(cell2==BLOCK))\n    {     \n        ++force;\n    }\n\n    if((cell1==WALL)||(cell2==WALL))\n    {\n        return 0;\n    }\n\n    // From here on, the player is not against any wall\n    if(force>=DESTROY_FORCE)\n    {\n        force=0;\n        _XL_EXPLOSION_SOUND();\n        return 1;\n    }\n\n    // If no wall and no block, you can always move\n    if((cell1!=BLOCK) && (cell2!=BLOCK))\n    {\n        return 1;\n    }\n\n    // From here on, the player is against at least one block and no wall and force<DESTROY_FORCE\n    if(force<MOVE_FORCE)\n    {\n        // If there is a block, you can't move\n        return 0;\n    }\n    else \n    {   // You can push blocks but you cannot destroy them\n        return ((!cell1)||(!beyond_cell1)) && ((!cell2)||(!beyond_cell2));\n    }\n}\n\n\nuint8_t allowed_down(void)\n{\n    return allowed(map[screen_x][screen_y+2],map[screen_x+1][screen_y+2],map[screen_x][screen_y+3],map[screen_x+1][screen_y+3]);\n\n}\n\n\nuint8_t allowed_up(void)\n{\n    return allowed(map[screen_x][screen_y-1],map[screen_x+1][screen_y-1],map[screen_x][screen_y-2],map[screen_x+1][screen_y-2]);\n}\n\n\nuint8_t allowed_left(void)\n{\n    return allowed(map[screen_x-1][screen_y],map[screen_x-1][screen_y+1],map[screen_x-2][screen_y],map[screen_x-2][screen_y+1]);\n}\n\n\nuint8_t allowed_right(void)\n{\n    return allowed(map[screen_x+2][screen_y],map[screen_x+2][screen_y+1],map[screen_x+3][screen_y],map[screen_x+3][screen_y+1]);\n}\n\n\nvoid _if_block_push_down(uint8_t x)\n{\n    if((map[x][screen_y+2]==BLOCK)&&!map[x][screen_y+3])\n    {\n        build_element(BLOCK, x,screen_y+3);\n        force=1;    \n    }\n}\n\n\n#define if_block_push_down() \\\ndo \\\n{ \\\n    _if_block_push_down(screen_x); \\\n    _if_block_push_down(screen_x+1); \\\n} while(0)\n\n\nvoid _if_block_push_up(uint8_t x)\n{\n    if((map[x][screen_y-1]==BLOCK)&&!map[x][screen_y-2])\n    {\n        build_element(BLOCK, x,screen_y-2);\n        force=1;\n    }\n}\n\n\n#define if_block_push_up() \\\ndo \\\n{ \\\n    _if_block_push_up(screen_x); \\\n    _if_block_push_up(screen_x+1); \\\n} while(0)\n\n\nvoid _if_block_push_left(uint8_t y)\n{\n    if((map[screen_x-1][y]==BLOCK)&&!map[screen_x-2][y])\n    {\n        build_element(BLOCK,screen_x-2,y);\n        force=1;\n    }\n}\n\n\n#define if_block_push_left() \\\ndo \\\n{ \\\n    _if_block_push_left(screen_y); \\\n    _if_block_push_left(screen_y+1); \\\n} while(0)\n\n\nvoid _if_block_push_right(uint8_t y)\n{\n    if((map[screen_x+2][y]==BLOCK)&&!map[screen_x+3][y])\n    {\n        build_element(BLOCK,screen_x+3,y);\n        force=1;\n    }\n}\n\n\n#define if_block_push_right() \\\ndo \\\n{ \\\n    _if_block_push_right(screen_y); \\\n    _if_block_push_right(screen_y+1); \\\n} while(0)\n\n\nvoid init_map(void)\n{\n    uint8_t i;\n    uint8_t j;\n    \n    #if !defined(_XL_NO_COLOR)\n    screen_color[WALL]=border_colors[(level)&3];\n    #endif\n    \n    _XL_CLEAR_SCREEN();\n    for(i=0;i<XSize-1;++i)\n    {\n        for(j=0;j<YSize-1;++j)\n        {\n            map[i][j]=EMPTY;\n        }\n    }\n    \n    for(i=0;i<XSize;++i)\n    {\n        build_element(WALL,i,1);\n        build_element(WALL,i,YSize-1);\n    }\n    for(i=1;i<YSize-1;++i)\n    {\n        build_element(WALL,0,i);\n        build_element(WALL,XSize-1,i);\n    }\n}\n\n\nvoid update_lives_display(void)\n{     \n    _XL_SET_TEXT_COLOR(_XL_CYAN);\n    \n    _XL_PRINTD(XSize-9,0,1,lives);\n}\n\n\n#if XSize>=20\n    #define _display_diamond_icon_if_possible() \\\n            build_element(DIAMOND,6,0); \\\n\n#else\n    #define _display_diamond_icon_if_possible()\n#endif\n\n#define initialize_level_display() \\\ndo \\\n{ \\\n    _XL_DRAW(XSize-10,0,SHURIKEN_TILE,_XL_WHITE); \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_RED); \\\n    _XL_PRINT(XSize-7,0,\"HI\"); \\\n    \\\n    _display_diamond_icon_if_possible(); \\\n    \\\n    update_lives_display(); \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    _XL_PRINTD(XSize-5,0,5,hiscore); \\\n    _XL_PRINTD(XSize-2,YSize-1,2,level+1); \\\n    \\\n    _XL_DRAW(0,YSize-1,RING_TILE,_XL_WHITE); \\\n    _XL_DRAW(3,YSize-1,FREEZE_TILE,_XL_CYAN); \\\n    _XL_DRAW(6,YSize-1,SHURIKEN_TILE,_XL_CYAN); \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_GREEN); \\\n    _XL_CHAR(10,YSize-1,'T'); \\\n    \\\n    update_item_display(); \\\n} while(0)\n\n\n\n// too many parameters\nvoid build_rectangle(uint8_t type, uint8_t x, uint8_t y, uint8_t width, uint8_t height)\n{\n    uint8_t i;\n    uint8_t j;\n    \n    for(i=x;i<x+width;++i)\n    {\n        for(j=y;j<y+height;++j)\n        {\n            \n            if(type)\n            {\n                build_element(type,i,j);\n            }\n            else // REMARK: Necessary to switch walls\n            {\n                delete_element(i,j);\n            }\n        }\n    }\n}\n\n\nvoid build_objects(uint8_t level)\n{\n    uint16_t index = objects_index[level];\n    uint8_t no_of_objects = objects_map[index];\n    uint8_t i;\n    uint8_t x;\n    uint8_t y;\n    uint8_t x_size;\n    uint8_t y_size;\n    uint8_t type;\n\n\n\n    #if !defined(_XL_NO_COLOR)\n    screen_color[WALL]=wall_colors[(level)&3];\n    #endif\n    \n    for(i=0;i<no_of_objects;++i)\n    {        \n        x = objects_map[++index];\n        y = objects_map[++index];\n        x_size = objects_map[++index];\n        y_size = objects_map[++index];\n        type = objects_map[++index];\n\n        if(type==DIAMOND)\n        {\n            remaining_diamonds +=x_size*y_size;;\n        }\n\n        build_rectangle(type,x,y,x_size,y_size);\n    }    \n}\n\n\n#define build_barriers() \\\ndo \\\n{ \\\n    uint8_t index = walls_index[level]; \\\n    uint8_t i; \\\n    \\\n    number_of_barriers = walls_map[index];  \\\n    \\\n    for(i=0;i<number_of_barriers;++i) \\\n    { \\\n        ++index; \\\n        barrier_x[i] = walls_map[index]; \\\n        ++index; \\\n        barrier_y[i] = walls_map[index]; \\\n        ++index; \\\n        barrier_width[i] = walls_map[index]; \\\n        ++index; \\\n        barrier_height[i] = walls_map[index]; \\\n        barrier_triggered[i] = 0; \\\n    } \\\n    if(challenge_level) \\\n    { \\\n        barrier_counter = BARRIER_THRESHOLD*4; \\\n    } \\\n    else \\\n    { \\\n        barrier_counter = 0; \\\n    } \\\n} while(0)\n\n\nvoid build_shurikens(void)\n{\n    uint8_t index = shurikens_index[level];\n    uint8_t i;\n\n    uint8_t level_horizontal_shurikens;\n    \n    \n    // _XL_PRINTD(0,0,5,index);\n    \n    level_horizontal_shurikens = shurikens_map[index];\n    \n    // _XL_PRINTD(0,1,5,level_horizontal_shurikens);\n    \n    ++index;\n    level_shurikens = level_horizontal_shurikens + shurikens_map[index];;\n\n    // _XL_PRINTD(0,2,5,level_shurikens);\n\n    ++index;\n    level_mini_shurikens = shurikens_map[index];\n\n    // _XL_PRINTD(0,3,5,level_mini_shurikens);\n\n    // _XL_WAIT_FOR_INPUT();\n    \n    for(i=0;i<level_shurikens;++i)\n    {\n        if(shuriken_status[i])\n        {\n            ++index;\n            shuriken_x[i]=shurikens_map[index];\n            ++index;\n            shuriken_y[i]=shurikens_map[index];\n            shuriken_direction[i]=0;\n            shuriken_transition[i]=0;\n            build_element(SHURIKEN,shuriken_x[i],shuriken_y[i]);\n            if(i<level_horizontal_shurikens)\n            {\n                shuriken_axis[i]=SHURIKEN_HORIZONTAL;\n            }\n            else\n            {\n                shuriken_axis[i]=SHURIKEN_VERTICAL;\n            }\n        }\n        else\n        {\n            index+=2;\n        }\n    }\n    for(i=level_shurikens;i<MAX_NUMBER_OF_SHURIKENS;++i)\n    {\n        shuriken_status[i]=0;\n    }\n    \n    for(i=0;i<level_mini_shurikens;++i)\n    {\n        ++index;\n        mini_shuriken_x[i]=shurikens_map[index];\n        build_element(WALL,mini_shuriken_x[i],1);\n        mini_shuriken_y[i]=2;\n        build_element(MINI_SHURIKEN,mini_shuriken_x[i],mini_shuriken_y[i]);\n    }\n}\n\n\nuint8_t safe_area(uint8_t x, uint8_t y, uint8_t x_size, uint8_t y_size)\n{\n    uint8_t j;\n    uint8_t k;\n    \n    for(j=x;j<x+x_size;++j)\n    {\n        for(k=y;k<y+y_size;++k)\n        {\n            if(map[j][k])\n            {\n                return 0;\n            }\n        }\n    }\n    return 1;\n}\n\n\nvoid handle_barriers(void)\n{\n    uint8_t i;\n    uint8_t barrier;\n\n    if(barrier_counter<barrier_threshold)\n    {\n        ++barrier_counter;\n    }\n    else\n    {\n        barrier_counter=0;\n        for(i=0;i<number_of_barriers;++i)\n        {\n            if(!barrier_triggered[i])\n            {\n                if(safe_area(barrier_x[i],barrier_y[i],barrier_width[i], barrier_height[i]))\n                {\n                    _XL_TOCK_SOUND();\n                    barrier = barrier_type;\n                    ++barrier_triggered[i];\n                }\n                else\n                {\n                    continue;\n                }\n            }\n            else if(!challenge_level)\n            {\n                barrier = EMPTY;\n                barrier_triggered[i] = 0;\n            }\n            else\n            {\n                barrier = barrier_type;\n            }\n            \n            build_rectangle(barrier,barrier_x[i],barrier_y[i],barrier_width[i], barrier_height[i]);\n        }\n    }\n}\n\n\nvoid activate_shurikens(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<MAX_NUMBER_OF_SHURIKENS;++i)\n    {\n        shuriken_status[i]=1;\n    }\n}\n\n\nvoid initialize_level_parameters(void)\n{\n    counter = 0;\n    \n    if(!((level+1)&3)) // challenge level\n    {\n        challenge_level = 1;\n        barrier_type = BLOCK;\n        #if !defined(_XL_NO_COLOR)\n        screen_color[DIAMOND]=_XL_YELLOW;\n        screen_color[SHURIKEN]=_XL_YELLOW;\n        screen_color[MINI_SHURIKEN]=_XL_RED;\n        #endif\n        barrier_threshold=BARRIER_THRESHOLD*5U;\n    }\n    else\n    {\n        challenge_level = 0;\n        barrier_type = SHURIKEN;\n        #if !defined(_XL_NO_COLOR)\n        screen_color[DIAMOND]=_XL_GREEN;\n        screen_color[SHURIKEN]=_XL_CYAN;\n        screen_color[MINI_SHURIKEN]=_XL_YELLOW;\n        #endif\n        barrier_threshold=BARRIER_THRESHOLD;\n    }\n}\n\n\n#if YSize>=20\n    #define SHURIKEN_Y 5\n    #define AUTHOR_Y 8\n    #define COLLECT_Y YSize-8\n    #define USE_AGAINST_Y YSize-5\n#else\n    #define SHURIKEN_Y 2\n    #define AUTHOR_Y 5\n    #define COLLECT_Y YSize-5\n    #define USE_AGAINST_Y YSize-2\n#endif\n\n\nvoid print_use_block_against_shurikens(uint8_t y)\n{\n    _XL_PRINT(XSize/2-7,y, \"USE   AGAINST\");\n\n    _XL_DRAW(XSize/2-6+3,y,BLOCK_TILE, _XL_GREEN);\n\n    _XL_DRAW(XSize/2-6+13,y,SHURIKEN_TILE, _XL_CYAN);\n}\n\n\nvoid initialize_new_level(void)\n{    \n\n    initialize_level_parameters();    \n\n    if(challenge_level)\n    {\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\n        _XL_CLEAR_SCREEN();\n        print_use_block_against_shurikens(YSize/2);\n        _XL_WAIT_FOR_INPUT();    \n    }\n    \n    init_map();    \n    \n    remaining_diamonds = 0; // build_objects increases remaining_diamonds\n\n    if(challenge_level)\n    {\n        build_objects(FINAL_LEVEL+1);\n    }    \n    \n    build_objects(level);\n    \n    time_counter = MAX_TIME;\n\n    activate_shurikens();\n\n    build_shurikens();\n    \n    remaining_shurikens = level_shurikens;\n    \n    build_barriers();\n    \n    // REMARK: Initialize counter *only* at level start (not after losing a life)\n    counter = 0;\n}\n\n\nvoid display_horizontal_transition_shuriken(uint8_t x, uint8_t y)\n{\n    _XL_DRAW(x-1,y,SHURIKEN_TILE_LEFT, SHURIKEN_COLOR);\n    _XL_DRAW(x,y,SHURIKEN_TILE_RIGHT, SHURIKEN_COLOR);\n}\n\n\nvoid shuriken_death(uint8_t index)\n{\n    _XL_SHOOT_SOUND();\n    score+=SHURIKEN_POINTS;\n    ++shuriken_counter;\n    --remaining_shurikens;\n    increase_time_counter_if_not_max();\n    shuriken_status[index]=0;\n}\n\n\nvoid block_explosion(uint8_t x, uint8_t y)\n{\n    _XL_DRAW(x,y,BLOCK_TILE,_XL_RED);\n    short_pause();\n    _XL_SHOOT_SOUND();\n    short_pause();\n    delete_element(x,y);\n}\n\n\n#if XSize<31\n    #define CHASE_BIT_MASK 15\n#else\n    #define CHASE_BIT_MASK 7\n#endif\n\n\nuint8_t player_chased(void)\n{\n    return (challenge_level)&&(!(_XL_RAND()&CHASE_BIT_MASK));\n}\n\n\n#define display_shuriken(x,y,index) \\\n    build_element(SHURIKEN,x,y)\n\n\nvoid chase_vertically(uint8_t index)\n{\n    shuriken_axis[index]=SHURIKEN_VERTICAL;\n    \n    if(screen_y<shuriken_y[index])\n    {\n        shuriken_direction[index]=SHURIKEN_UP;\n    }\n    else\n    {\n        shuriken_direction[index]=SHURIKEN_DOWN; \n    }\n}\n\n\nvoid handle_horizontal_shuriken(register uint8_t index)\n{\n    register uint8_t x = shuriken_x[index];\n    register uint8_t y = shuriken_y[index];\n    \n    if(shuriken_direction[index]==SHURIKEN_LEFT)\n    {\n        if(!shuriken_transition[index]) // transition not performed, yet\n        {\n            \n            if(player_chased())\n            {\n                chase_vertically(index);\n            }                \n            else\n            {\n                if(!map[x-1][y])\n                {\n                    // Do left transition\n                    display_horizontal_transition_shuriken(x,y);\n                    map[x-1][y]=SHURIKEN;\n                    ++shuriken_transition[index];\n                }\n                else if(map[x-1][y]==BLOCK)\n                {\n                    delete_element(x,y);\n                    shuriken_death(index);\n                    block_explosion(x-1,y);\n                }\n                else\n                {\n                    shuriken_direction[index]=SHURIKEN_RIGHT;\n                }\n            }\n        }\n        else // transition already performed\n        {\n            shuriken_transition[index]=0;\n            delete_element(x,y);\n            --shuriken_x[index];\n            display_shuriken(shuriken_x[index],y,index);\n        }\n\n    }\n    else // direction is RIGHT\n    {\n        if(!shuriken_transition[index]) // transition not performed, yet\n        {\n            if(player_chased())\n            {\n                chase_vertically(index);\n            }                \n            else\n            {\n                if(!map[x+1][y])\n                {\n                    // Do right transition\n                    display_horizontal_transition_shuriken(x+1,y);\n                    map[x+1][y]=SHURIKEN;\n                    ++shuriken_transition[index];\n                }\n                else if(map[x+1][y]==BLOCK)\n                {\n                    delete_element(x,y);\n                    shuriken_death(index);\n                    block_explosion(x+1,y);\n                }\n                else\n                {\n                    shuriken_direction[index]=SHURIKEN_LEFT;\n                    \n                }\n            }\n        }\n        else // transition already performed\n        {\n            shuriken_transition[index]=0;\n            delete_element(x,y);\n            ++shuriken_x[index];\n            display_shuriken(shuriken_x[index],y,index);\n        }\n    }\n}\n\n\n\nvoid delete_shurikens(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<level_shurikens;++i)\n    {\n        if(shuriken_status[i])\n        {\n            delete_element(shuriken_x[i],shuriken_y[i]);\n            \n            if(shuriken_transition[i])\n            {\n                if(shuriken_axis[i]==SHURIKEN_HORIZONTAL)\n                {\n                    if(shuriken_direction[i]==SHURIKEN_RIGHT)\n                    {\n                        delete_element(shuriken_x[i]+1,shuriken_y[i]);\n                    }\n                    else\n                    {\n                        delete_element(shuriken_x[i]-1,shuriken_y[i]);\n                    }\n                }\n                else\n                {\n                    if(shuriken_direction[i]==SHURIKEN_DOWN)\n                    {\n                        delete_element(shuriken_x[i],shuriken_y[i]+1);\n                    }\n                    else\n                    {\n                        delete_element(shuriken_x[i],shuriken_y[i]-1);\n                    }\n                }\n            }\n        }\n    }\n    \n    for(i=0;i<level_mini_shurikens;++i)\n    {\n        delete_element(mini_shuriken_x[i],mini_shuriken_y[i]);\n    }\n}\n\n\n\nvoid display_vertical_transition_shuriken(uint8_t x, uint8_t y)\n{\n    _XL_DRAW(x,y-1,SHURIKEN_TILE_UP,SHURIKEN_COLOR);\n    _XL_DRAW(x,y,SHURIKEN_TILE_DOWN,SHURIKEN_COLOR);\n}\n\n\nvoid chase_horizontally(uint8_t index)\n{\n    shuriken_axis[index] = SHURIKEN_HORIZONTAL;\n        \n    if(screen_x<shuriken_x[index])\n    {\n        shuriken_direction[index]=SHURIKEN_LEFT;\n    }\n    else\n    {\n        shuriken_direction[index]=SHURIKEN_RIGHT; \n    }    \n}\n\n\nvoid handle_vertical_shuriken(register uint8_t index)\n{\n    register uint8_t x = shuriken_x[index];\n    register uint8_t y = shuriken_y[index];\n    \n    if(shuriken_direction[index]==SHURIKEN_UP)\n    {\n        if(!shuriken_transition[index]) // transition not performed, yet\n        {\n            if(player_chased())\n            {\n                chase_horizontally(index);\n            }                \n            else\n            {\n                if(!map[x][y-1])\n                {\n                    // Do up transition\n                    display_vertical_transition_shuriken(x,y);\n                    map[x][y-1]=SHURIKEN;\n                    ++shuriken_transition[index];\n                }\n                else if(map[x][y-1]==BLOCK)\n                {\n                    delete_element(x,y);\n                    shuriken_death(index);\n                    block_explosion(x,y-1);\n                }\n                else\n                {\n                    shuriken_direction[index]=SHURIKEN_DOWN;\n                }\n            }\n        }\n        else // transition already performed\n        {\n            shuriken_transition[index]=0;\n            delete_element(x,y);\n            --shuriken_y[index];\n            display_shuriken(x,shuriken_y[index],index);\n        }\n    }\n    else // direction is DOWN\n    {\n        if(!shuriken_transition[index]) // transition not performed, yet\n        {\n            if(player_chased())\n            {\n                chase_horizontally(index);\n            }                \n            else\n            {\n                if(!map[x][y+1])\n                {\n                    // Do right transition\n                    display_vertical_transition_shuriken(x,y+1);\n                    map[x][y+1]=SHURIKEN;\n                    ++shuriken_transition[index];\n                }\n                else if(map[x][y+1]==BLOCK)\n                {\n                    delete_element(x,y);\n                    shuriken_death(index);\n                    block_explosion(x,y+1);\n                }\n                else\n                {\n                    shuriken_direction[index]=SHURIKEN_UP;\n                }\n            }\n        }\n        else // transition already performed\n        {\n            shuriken_transition[index]=0;\n            delete_element(x,y);    \n            ++shuriken_y[index];\n            display_shuriken(x,shuriken_y[index],index);\n        }\n    }\n}\n\n\n\nvoid handle_shurikens(void)\n{\n    uint8_t i;\n    uint8_t x;\n    uint8_t y;\n    \n    for(i=0;i<MAX_NUMBER_OF_SHURIKENS;++i)\n    {\n        if(shuriken_status[i])\n        {\n            if(!shuriken_axis[i])\n            {\n                handle_horizontal_shuriken(i);\n            }\n            else\n            {\n                handle_vertical_shuriken(i);\n            }\n        }\n    }\n    \n    for(i=0;i<level_mini_shurikens;++i)\n    {\n        x = mini_shuriken_x[i];\n        \n        delete_element(x,mini_shuriken_y[i]);\n        \n        y=++(mini_shuriken_y[i]);\n\n        if(!map[x][y] && y<YSize-2)\n        {\n            build_element(MINI_SHURIKEN, x, y);\n        }\n        else\n        {    \n            if(!map[x][y])\n            {\n                delete_element(x,y);\n            }\n            mini_shuriken_y[i] = 2;                            \n        }\n        \n    }\n}\n\n\nvoid update_player_direction(uint8_t direction)\n{\n    update_player();\n    if(player_direction!=direction)\n    {\n        force=0;\n    }\n    else\n    {\n        player_direction=direction;\n    }\n}\n\n\nvoid handle_player(void)\n{\n    input = _XL_INPUT();\n    \n    if(_XL_UP(input) && (!(player_y&1) || allowed_up()))\n    {\n        if(player_y&1)\n        {\n            delete_player_down();\n            if_block_push_up();\n        }\n        --player_y;\n\n        update_player_direction(PLAYER_UP);\n    }\n    else if(_XL_DOWN(input) && ((player_y&1) || allowed_down()))\n    {    \n        if(!(player_y&1))\n        {\n            delete_player_up();\n            if_block_push_down();\n        }\n        ++player_y;\n\n        update_player_direction(PLAYER_DOWN);\n\n    }\n    else if(_XL_LEFT(input) && ((player_x&1) || allowed_left()))\n    {\n        if(!(player_x&1))\n        {\n            delete_player_right();\n            if_block_push_left();\n        }\n        --player_x;\n\n        update_player_direction(PLAYER_LEFT);\n\n    }\n    else if(_XL_RIGHT(input) && (!(player_x&1) || allowed_right()))\n    {    \n        if(player_x&1)\n        {\n            delete_player_left();\n            if_block_push_right();\n        }\n        ++player_x;\n\n        update_player_direction(PLAYER_RIGHT);\n\n    }\n    // REMARK: We need this because shuriken do delete the player despite handle_collisions\n    else \n    {\n        // force=0;\n        if((ring_active&7)==1)\n        {\n            display_player();\n        }\n    }\n}\n\n\n#if !defined(_XL_NO_COLOR)\n    #define initialize_player() \\\n    do { \\\n        alive = 1; \\\n        player_x = XSize-1; \\\n        player_y = YSize-1; \\\n        \\\n        force = 0; \\\n        ring_active = START_RING_EFFECT; \\\n        \\\n        player_color = _XL_CYAN; \\\n    } while(0)\n#else\n    #define initialize_player() \\\n    do { \\\n        alive = 1; \\\n        player_x = XSize-1; \\\n        player_y = YSize-1; \\\n        \\\n        force = 0; \\\n        ring_active = START_RING_EFFECT; \\\n        \\\n    } while(0)\n#endif\n\n\n#define initialize_global_game() \\\ndo \\\n{ \\\n    score = 0; \\\n    lives = INITIAL_LIVES; \\\n    level = INITIAL_LEVEL; \\\n    extra_life_counter = 1; \\\n    new_level = 1; \\\n    initialize_level_parameters(); \\\n} while(0)\n\n\nvoid handle_freeze_and_shurikens(void)\n{\n    if((!freeze_active) || (counter&1))\n    {\n        handle_shurikens();\n    }\n    else if(freeze_active)\n    {\n        --freeze_active;\n    }\n}\n\n\n#if defined(INVINCIBLE)\n    #define handle_ring()\n#elif !defined(_XL_NO_COLOR)\n    #define handle_ring() \\\n    do \\\n    { \\\n        if(ring_active) \\\n        { \\\n            --ring_active; \\\n            if(!ring_active) \\\n            { \\\n                player_color = _XL_WHITE; \\\n                display_player(); \\\n            } \\\n        } \\\n    } while(0)\n#else\n    #define handle_ring() \\\n    do \\\n    { \\\n        if(ring_active) \\\n        { \\\n            --ring_active; \\\n            if(!ring_active) \\\n            { \\\n                display_player(); \\\n            } \\\n        } \\\n    } while(0)\n#endif\n\n\n#if !defined(_XL_NO_COLOR)\n    #define handle_lose_life() \\\n    do \\\n    { \\\n        player_color=_XL_RED; \\\n        display_player(); \\\n        _XL_EXPLOSION_SOUND(); \\\n        \\\n        --lives; \\\n        one_second_pause(); \\\n        _XL_WAIT_FOR_INPUT(); \\\n        \\\n        delete_player(); \\\n        \\\n        delete_shurikens(); \\\n    } while(0)\n#else\n    #define handle_lose_life() \\\n    do \\\n    { \\\n        display_player(); \\\n        _XL_EXPLOSION_SOUND(); \\\n        \\\n        --lives; \\\n        one_second_pause(); \\\n        _XL_WAIT_FOR_INPUT(); \\\n        \\\n        delete_player(); \\\n        \\\n        delete_shurikens(); \\\n    } while(0)  \n#endif\n\nvoid item_bonus(uint8_t *item_counter_ptr)\n{\n    if(*item_counter_ptr)\n    {\n        do\n        {\n        score+=ITEM_BONUS;\n        --(*item_counter_ptr);\n        update_item_display();\n        _XL_ZAP_SOUND();\n        short_pause();\n        } while(*item_counter_ptr);\n        one_second_pause();\n    }\n}\n\n\n#define handle_next_level() \\\ndo \\\n{ \\\n    ++level; \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    _XL_PRINT(XSize/2-2,YSize/2,\"GREAT\"); \\\n    new_level = 1; \\\n    \\\n    one_second_pause(); \\\n    item_bonus(&time_counter); \\\n    item_bonus(&shuriken_counter); \\\n    item_bonus(&freeze_counter); \\\n    item_bonus(&ring_counter); \\\n} while(0)\n\n\n#define initialize_player_achievements() \\\ndo \\\n{ \\\n    freeze_counter=0; \\\n    freeze_active=0; \\\n    \\\n    ring_counter=0; \\\n    ring_active=0; \\\n    \\\n    shuriken_counter=0; \\\n} while(0)\n\n\n#if XSize>=63\n    #define TIME_MASK 127\n#else\n    #define TIME_MASK 63\n#endif\n\n\n#define handle_time() \\\ndo \\\n{ \\\n    ++counter; \\\n    \\\n    if(!(counter&TIME_MASK)) \\\n    { \\\n        if(time_counter) \\\n        { \\\n            --time_counter; \\\n            update_time_counter_display(); \\\n        } \\\n    } \\\n} while(0)\n\n\n#define handle_extra_life() \\\ndo \\\n{ \\\n    if(score>=EXTRA_LIFE_THRESHOLD*extra_life_counter) \\\n    { \\\n        ++extra_life_counter; \\\n        _XL_PING_SOUND(); \\\n        ++lives; \\\n        update_lives_display(); \\\n        _XL_PING_SOUND(); \\\n    } \\\n} while(0)\n\n\n#if defined(SHOW_LEVELS)\n    #define continue_level_condition() 0\n#else\n    #define continue_level_condition() \\\n        alive && (remaining_diamonds || (remaining_shurikens && challenge_level))\n#endif\n\n\nvoid animate_shurikens(void)\n{\n    activate_shurikens();\n    build_shurikens();\n    counter=XSize/4;\n    // #if defined(_XL_NO_TEXT_COLOR)\n        // _XL_SET_TEXT_COLOR(_XL_WHITE);\n        // #if !defined(_XL_NO_JOYSTICK)\n        // _XL_PRINT(XSize/2-5,YSize-1,\"PRESS FIRE\");\n        // #else\n        // _XL_PRINT(XSize/2-5,YSize-1,\"PRESS SPACE\");\n        // #endif\n    // #endif\n    do\n    {\n        if(counter)\n        {\n            --counter;\n            #if defined(_XL_NO_TEXT_COLOR) || defined(_XL_NO_COLOR)\n                if(!counter)\n                {\n\t\t\t\t\t_XL_SET_TEXT_COLOR(_XL_WHITE);\n\t\t\t\t\t#if !defined(_XL_NO_JOYSTICK)\n\t\t\t\t\t_XL_PRINT(XSize/2-5,YSize-1,\"PRESS FIRE\");\n\t\t\t\t\t#else\n\t\t\t\t\t_XL_PRINT(XSize/2-5,YSize-1,\"PRESS SPACE\");\n\t\t\t\t\t#endif\n                }\n            #endif\n        }\n        else\n        {\n            #if !defined(_XL_NO_TEXT_COLOR) \n                _XL_SET_TEXT_COLOR(_XL_WHITE);\n                #if !defined(_XL_NO_JOYSTICK)\n                _XL_PRINT(XSize/2-5,YSize-1,\"PRESS FIRE\");\n                #else\n                _XL_PRINT(XSize/2-5,YSize-1,\"PRESS SPACE\");\n                #endif\n            #endif\n        }\n        input = _XL_INPUT();\n        \n        handle_freeze_and_shurikens();\n        short_pause();\n    } while((!_XL_FIRE(input) || counter));\n    _XL_ZAP_SOUND();\n    one_second_pause();\n}\n\n\n#if !defined(_XL_NO_COLOR)\n\n    #define title() \\\n    do \\\n    { \\\n        init_map(); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        \\\n        _XL_PRINT(XSize/2-7,AUTHOR_Y, \"FABRIZIO CARUSO\"); \\\n        \\\n        _XL_PRINTD(XSize/2-2,1,5,hiscore); \\\n        \\\n        _XL_PRINT(XSize/2-8+4,COLLECT_Y, \"COLLECT\"); \\\n        \\\n        print_use_block_against_shurikens(USE_AGAINST_Y); \\\n        \\\n        _XL_DRAW(XSize/2-7+11,COLLECT_Y,DIAMOND_TILE, _XL_GREEN); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_CYAN); \\\n        \\\n        _XL_PRINT(XSize/2-7,SHURIKEN_Y, \"S H U R I K E N\"); \\\n        \\\n        screen_color[SHURIKEN]=_XL_YELLOW; \\\n        animate_shurikens(); \\\n    } while(0)\n\n        \n    #define the_end() \\\n    do \\\n    { \\\n        level=2; \\\n        challenge_level=0; \\\n        init_map(); \\\n        screen_color[SHURIKEN]=_XL_GREEN; \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINT(XSize/2-3,YSize/2,\"THE END\"); \\\n        \\\n        animate_shurikens(); \\\n    } while(0)\n\n#else\n        #define title() \\\n    do \\\n    { \\\n        init_map(); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        \\\n        _XL_PRINT(XSize/2-7,AUTHOR_Y, \"FABRIZIO CARUSO\"); \\\n        \\\n        _XL_PRINTD(XSize/2-2,1,5,hiscore); \\\n        \\\n        _XL_PRINT(XSize/2-8+4,COLLECT_Y, \"COLLECT\"); \\\n        \\\n        print_use_block_against_shurikens(USE_AGAINST_Y); \\\n        \\\n        _XL_DRAW(XSize/2-7+11,COLLECT_Y,DIAMOND_TILE, _XL_GREEN); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_CYAN); \\\n        \\\n        _XL_PRINT(XSize/2-7,SHURIKEN_Y, \"S H U R I K E N\"); \\\n        \\\n        animate_shurikens(); \\\n    } while(0)\n\n        \n    #define the_end() \\\n    do \\\n    { \\\n        level=2; \\\n        challenge_level=0; \\\n        init_map(); \\\n        \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINT(XSize/2-3,YSize/2,\"THE END\"); \\\n        \\\n        animate_shurikens(); \\\n    } while(0)\n#endif\n\n\n#define initialize_level() \\\ndo \\\n{ \\\n    initialize_player_achievements(); \\\n    \\\n    if(new_level) \\\n    { \\\n        initialize_new_level(); \\\n    } \\\n    initialize_level_display(); \\\n    initialize_player(); \\\n    update_player(); \\\n    \\\n    new_level = 0; \\\n    one_second_pause();  \\\n    _XL_WAIT_FOR_INPUT(); \\\n} while(0)\n\n\n#define handle_speed() \\\ndo \\\n{ \\\n    short_pause(); \\\n} while(0)\n\n\n#define handle_end_game() \\\ndo \\\n{ \\\n    if(alive) \\\n    { \\\n        the_end(); \\\n    } \\\n    _XL_SET_TEXT_COLOR(_XL_RED); \\\n    _XL_PRINT(XSize/2-4,YSize/2,\"GAME OVER\"); \\\n    \\\n    if(score>hiscore) \\\n    { \\\n        hiscore = score; \\\n    } \\\n    one_second_pause(); \\\n    _XL_WAIT_FOR_INPUT(); \\\n} while(0)\n\n\n#define initialize_cross_lib() \\\n    _XL_INIT_GRAPHICS(); \\\n    _XL_INIT_INPUT();  \\\n    _XL_INIT_SOUND();\n\n\n#define continue_game_condition() \\\n    lives && (level<=FINAL_LEVEL)\n\n\nint main(void)\n{        \n    initialize_cross_lib();\n\n    hiscore = 0;\n        \n    while(1)\n    {\n        initialize_global_game();\n\n        title();\n                        \n        while(continue_game_condition())\n        {            \n            initialize_level();\n            \n            while(continue_level_condition())\n            {\n                handle_player();\n                \n                if(alive)\n                {\n                    handle_freeze_and_shurikens();\n                    handle_barriers();                    \n                    handle_ring();\n                    handle_collisions();                    \n                    handle_speed();\n                    handle_extra_life();\n                    handle_time();\n                }\n            }\n            if(alive)\n            {\n                handle_next_level();\n            }\n            else\n            {\n                handle_lose_life();\n            }\n        }; \n        handle_end_game();\n    }\n    \n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/games/shuriken/makefiles/Makefile.override",
    "content": "\r\n#######################################\r\n\r\n\r\ncreativision: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D__CREATIVISION__ -DX_OFFSET=7  -DXSize=15 -DY_OFFSET=4 -DYSize=12  \\\r\n\t-D__ALT_SLEEP $(CREATIVISION_GAME_OPTS) \\\r\n\t-D__VDP_MODE1_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CREATIVISION_SLOWDOWN) \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k_less_stack.cfg \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\n\r\n#-DXSize=16 -DX_OFFSET=2 -DY_OFFSET=1  -DYSize=16 \r\n# YSize=17 maybe possible\r\nifdef USE_TOOLS\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\nelse\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s\r\nendif\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t gamate -m mapfile.txt  --config $(CFG_PATH)/cc65/gamate_reduced_stack_2.cfg \\\r\n\t-DXSize=16 -DX_OFFSET=2 -DY_OFFSET=1  -DYSize=16 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAMATE_SLOWDOWN) \\\r\n\t $(GAMATE_GAME_OPTS) -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\nifdef USE_TOOLS\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\nendif    \r\n\r\n\r\nc16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16 -m mapfile.txt \\\r\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30.cfg \\\r\n\t-D__NO_SCREEN_COLOR_INIT  \\\r\n\t-D__ALT_PRINT -DSIMPLE_SLOWDOWN \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ASSEMBLY_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \\\r\n\t-D__UDG_BASE_FACTOR=15 \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n    \r\n    \r\n\r\n#################################################################\r\n\r\n\r\n#############################\r\n# SG1000\r\n\r\n\r\nsg1000: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_ROM_OPTS) -subtype=rom \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__SC3000__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DXSize=16 -DX_OFFSET=8 -DYSize=16 -DY_OFFSET=4 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-vn -lndos -create-app \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_sg1000.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/screen_types.h",
    "content": "\r\n#ifndef _SCREEN_TYPES_H\r\n#define _SCREEN_TYPES_H\r\n\r\n#define EMPTY 0\r\n#define RING 1\r\n\r\n#define FREEZE 2\r\n#define DIAMOND 3\r\n\r\n#define BLOCK 4\r\n\r\n#define WALL  5\r\n#define SHURIKEN 6\r\n#define MINI_SHURIKEN 7\r\n\r\n#define DEADLY 5\r\n\r\n#endif // _SCREEN_TYPES_H\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape0.txt",
    "content": "...###\n...#..\n..##..\n.#####\n#....#\n#.....\n###...\n..####\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape1.txt",
    "content": "#.#...\n..#...\n..#...\n..#...\n.##...\n.#....\n##....\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape10.txt",
    "content": "..####\n###...\n#....#\n#....#\n..####\n.###..\n...#..\n...###\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape11.txt",
    "content": "......\n##....\n.#....\n.##...\n..#...\n..#...\n#.#...\n..#...\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape12.txt",
    "content": "...##.\n....#.\n....##\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape13.txt",
    "content": ".##..#\n..#..#\n...###\n####..\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape14.txt",
    "content": "......\n....##\n....#.\n...##.\n...#..\n...#..\n...#..\n...#.#\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape15.txt",
    "content": "####..\n...###\n.....#\n#....#\n#####.\n..##..\n..#...\n###...\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape16.txt",
    "content": ".#....\n.##...\n.#####\n.#  ##\n##  #.\n#####.\n...##.\n....#.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape17.txt",
    "content": ".#  ##\n.#####\n.##...\n..#...\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape18.txt",
    "content": "......\n......\n......\n......\n...#..\n...##.\n#####.\n##  #.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape19.txt",
    "content": "......\n......\n....##\n...###\n.....#\n.....#\n.....#\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape2.txt",
    "content": "......\n......\n......\n......\n..####\n###...\n#..#..\n#..##.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape20.txt",
    "content": "......\n#.....\n#.....\n#.....\n###...\n##....\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape21.txt",
    "content": "######\n######\n##.###\n##...#\n#...##\n###.##\n######\n######\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape22.txt",
    "content": "######\n...###\n.#####\n.#####\n#####.\n#####.\n###...\n######\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape23.txt",
    "content": "..##..\n.####.\n####.#\n#####.\n####.#\n.####.\n..##..\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape24.txt",
    "content": "......\n......\n..#...\n..###.\n.###..\n...#..\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape25.txt",
    "content": ".####.\n######\n##..##\n#....#\n#....#\n##..##\n######\n.####.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape26.txt",
    "content": "......\n..##..\n.##.#.\n####.#\n.##.#.\n..##..\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape3.txt",
    "content": "......\n......\n......\n......\n......\n##....\n.#....\n.##...\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape4.txt",
    "content": "...#..\n...#.#\n...#..\n...#..\n...##.\n....#.\n....##\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape5.txt",
    "content": "###...\n..#...\n..###.\n####..\n#....#\n#....#\n...###\n####..\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape6.txt",
    "content": "......\n......\n......\n......\n......\n....##\n....#.\n...##.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape7.txt",
    "content": "......\n......\n......\n......\n####..\n...###\n.#...#\n.##..#\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape8.txt",
    "content": "#..##.\n#...#.\n###...\n..####\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x8/shape9.txt",
    "content": ".##...\n.#....\n##....\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape0.txt",
    "content": "...###\n...#..\n..##..\n.#####\n#....#\n#.....\n###...\n..####\n..####\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape1.txt",
    "content": "#.#...\n..#...\n..#...\n..#...\n.##...\n.#....\n##....\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape10.txt",
    "content": "..####\n###...\n#....#\n#....#\n..####\n.###..\n...#..\n...###\n...###\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape11.txt",
    "content": "......\n##....\n.#....\n.##...\n..#...\n..#...\n#.#...\n..#...\n..#...\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape12.txt",
    "content": "...##.\n....#.\n....##\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape13.txt",
    "content": ".##..#\n..#..#\n...###\n####..\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape14.txt",
    "content": "......\n....##\n....#.\n...##.\n...#..\n...#..\n...#..\n...#.#\n...#.#\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape15.txt",
    "content": "####..\n...###\n.....#\n#....#\n#####.\n..##..\n..#...\n###...\n###...\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape16.txt",
    "content": ".#....\n.##...\n.#####\n.#  ##\n##  #.\n#####.\n...##.\n....#.\n....#.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape17.txt",
    "content": ".#  ##\n.#####\n.##...\n..#...\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape18.txt",
    "content": "......\n......\n......\n......\n...#..\n...##.\n#####.\n##  #.\n##  #.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape19.txt",
    "content": "......\n......\n....##\n...###\n.....#\n.....#\n.....#\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape2.txt",
    "content": "......\n......\n......\n......\n..####\n###...\n#..#..\n#..##.\n#..##.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape20.txt",
    "content": "......\n#.....\n#.....\n#.....\n###...\n##....\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape21.txt",
    "content": "######\n######\n##.###\n##...#\n#...##\n###.##\n######\n######\n######\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape22.txt",
    "content": "######\n...###\n.#####\n.#####\n#####.\n#####.\n###...\n######\n######\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape23.txt",
    "content": "..##..\n.####.\n####.#\n#####.\n####.#\n.####.\n..##..\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape24.txt",
    "content": "......\n......\n..#...\n..###.\n.###..\n...#..\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape25.txt",
    "content": ".####.\n######\n##..##\n#....#\n#....#\n##..##\n######\n.####.\n.####.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape26.txt",
    "content": "......\n..##..\n.##.#.\n####.#\n.##.#.\n..##..\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape3.txt",
    "content": "......\n......\n......\n......\n......\n##....\n.#....\n.##...\n.##...\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape4.txt",
    "content": "...#..\n...#.#\n...#..\n...#..\n...##.\n....#.\n....##\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape5.txt",
    "content": "###...\n..#...\n..###.\n####..\n#....#\n#....#\n...###\n####..\n####..\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape6.txt",
    "content": "......\n......\n......\n......\n......\n....##\n....#.\n...##.\n...##.\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape7.txt",
    "content": "......\n......\n......\n......\n####..\n...###\n.#...#\n.##..#\n.##..#\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape8.txt",
    "content": "#..##.\n#...#.\n###...\n..####\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/6x9/shape9.txt",
    "content": ".##...\n.#....\n##....\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape0.txt",
    "content": "#..####\n#.###.#\n#...#.#\n#...###\n##..##.\n.#...#.\n.###...\n...####"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape1.txt",
    "content": "...#...\n...#...\n##.#...\n#..#...\n..##...\n..#....\n###....\n#......"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape10.txt",
    "content": "...####\n.###...\n.#..#..\n##..##.\n#...###\n#...#.#\n#..##.#\n#.#####"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape11.txt",
    "content": "#......\n###....\n..#....\n..##...\n##.#...\n#..#...\n...#...\n...#..."
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape12.txt",
    "content": "...##..\n....#..\n....###\n......#\n.......\n.......\n.......\n......."
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape13.txt",
    "content": "##...##\n.#...#.\n...###.\n####...\n.......\n.......\n.......\n......."
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape14.txt",
    "content": "......#\n....###\n....#..\n...##..\n...#..#\n...#.##\n...#...\n...#..."
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape15.txt",
    "content": "####...\n...###.\n.#...#.\n.##..##\n###...#\n#.#...#\n#.###.#\n####..#"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape16.txt",
    "content": "..#....\n..##...\n..#####\n..#.##.\n.##.#..\n#####..\n...##..\n....#..\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape17.txt",
    "content": "..#.###\n..####.\n..##...\n...#...\n.......\n.......\n.......\n.......\n\n\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape18.txt",
    "content": ".......\n.......\n.......\n.......\n...#...\n...##..\n.####..\n###.#..\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape19.txt",
    "content": ".......\n.......\n.....##\n....###\n......#\n......#\n......#\n.......\n\n\n\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape2.txt",
    "content": ".......\n.......\n.......\n.......\n...####\n.###...\n.#...#.\n##...##"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape20.txt",
    "content": "#......\n##.....\n##.....\n.#.....\n.###...\n###....\n#......\n#......\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape21.txt",
    "content": "#######\n#######\n###.###\n###...#\n##...##\n####.##\n#######\n#######\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape22.txt",
    "content": "#######\n#...###\n#.#####\n#.#####\n#####.#\n#####.#\n###...#\n#######\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape23.txt",
    "content": "...#...\n..###..\n.###.#.\n#####.#\n.###.#.\n..###..\n...#...\n.......\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape24.txt",
    "content": ".......\n.......\n...#...\n...###.\n..###..\n....#..\n.......\n.......\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape25.txt",
    "content": ".......\n..###..\n.##.##.\n##...##\n##...##\n.##.##.\n..###..\n.......\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape26.txt",
    "content": ".......\n...##..\n..##.#.\n.####.#\n..##.#.\n...##..\n.......\n.......\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape3.txt",
    "content": ".......\n.......\n.......\n.......\n#......\n###....\n..#....\n..##..."
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape4.txt",
    "content": "...#...\n...#...\n...#..#\n...#.##\n...##..\n....#..\n....###\n......#"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape5.txt",
    "content": "#####.#\n#.##..#\n#.#...#\n###...#\n.##..##\n..#..#.\n...###.\n####...\n"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape6.txt",
    "content": ".......\n.......\n.......\n.......\n......#\n....###\n....#..\n...##.."
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape7.txt",
    "content": ".......\n.......\n.......\n.......\n####...\n...###.\n#....#.\n##...##"
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape8.txt",
    "content": "##...##\n.#....#\n.###...\n...####\n.......\n.......\n.......\n......."
  },
  {
    "path": "src/games/shuriken/shapes/7x8/shape9.txt",
    "content": "..##...\n..#....\n###....\n#......\n.......\n.......\n.......\n......."
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape0.txt",
    "content": "#...####\n#...#..#\n#..#####\n##.....#\n.###....\n...#####\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape1.txt",
    "content": "#..#....\n...#....\n...#....\n..##....\n###.....\n#......."
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape10.txt",
    "content": "...#####\n.###....\n##.....#\n#..#####\n#...#..#\n#...####\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape11.txt",
    "content": "#.......\n###.....\n..##....\n...#....\n...#....\n#..#....\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape12.txt",
    "content": "....##..\n.....###\n.......#\n........\n........\n........"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape13.txt",
    "content": "...#..##\n....###.\n#####...\n........\n........\n........"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape14.txt",
    "content": ".......#\n.....###\n....##..\n....#...\n....#...\n....#..#\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape15.txt",
    "content": "#####...\n....###.\n#.....##\n#####..#\n#..#...#\n####...#\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape16.txt",
    "content": "..##....\n..######\n..#  ##.\n.##  #..\n######..\n....##..\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape17.txt",
    "content": "..#  ###\n..#####.\n..##....\n........\n........\n........\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape18.txt",
    "content": "........\n........\n........\n....##..\n######..\n.##  #..\n\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape19.txt",
    "content": "........\n.....###\n....### \n......# \n......##\n......##\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape2.txt",
    "content": "........\n........\n........\n...#####\n.###....\n##..#...\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape20.txt",
    "content": "##......\n##......\n #......\n ###....\n###.....\n........\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape21.txt",
    "content": "########\n###.####\n###...##\n##...###\n####.###\n########\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape22.txt",
    "content": "########\n#...####\n#.####.#\n#.####.#\n####...#\n########\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape23.txt",
    "content": "...##...\n..##.#..\n.####.#.\n.####.#.\n..##.#..\n...##...\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape24.txt",
    "content": "........\n...#....\n...###..\n..###...\n....#...\n........\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape25.txt",
    "content": "..####..\n.##..##.\n##....##\n##....##\n.##..##.\n..####..\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape26.txt",
    "content": "...##...\n..##.#..\n.####.#.\n..##.#..\n...##...\n........\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape3.txt",
    "content": "........\n........\n........\n#.......\n###.....\n..##...."
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape4.txt",
    "content": "....#..#\n....#...\n....#...\n....##..\n.....###\n.......#"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape5.txt",
    "content": "####...#\n#..#...#\n#####..#\n#.....##\n....###.\n#####..."
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape6.txt",
    "content": "........\n........\n........\n.......#\n.....###\n....##..\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape7.txt",
    "content": "........\n........\n........\n#####...\n....###.\n...#..##"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape8.txt",
    "content": "##..#...\n.###....\n...#####\n........\n........\n........\n\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x6/shape9.txt",
    "content": "..##....\n###.....\n#.......\n........\n........\n........\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape0.txt",
    "content": "#...####\r\n#...#..#\r\n#..##..#\r\n#.######\r\n##....##\r\n.#.....#\r\n.###....\r\n...#####"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape1.txt",
    "content": "##.#....\r\n#..#....\r\n...#....\r\n...#....\r\n..##....\r\n..#.....\r\n###.....\r\n#.......\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape10.txt",
    "content": "...#####\r\n.###....\r\n.#....#.\r\n##....##\r\n#..#####\r\n#.###..#\r\n#...#..#\r\n#...####\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape11.txt",
    "content": "#.......\r\n###.....\r\n..#.....\r\n..##....\r\n...#....\r\n...#....\r\n##.#....\r\n#..#....\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape12.txt",
    "content": "....##..\r\n.....#..\r\n.....###\r\n.......#\r\n........\r\n........\r\n........\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape13.txt",
    "content": "..##..##\r\n...#..#.\r\n....###.\r\n#####...\r\n........\r\n........\r\n........\r\n........\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape14.txt",
    "content": ".......#\r\n.....###\r\n.....#..\r\n....##..\r\n....#...\r\n....#...\r\n....#..#\r\n....#.##\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape15.txt",
    "content": "#####...\r\n....###.\r\n#.....#.\r\n##....##\r\n######.#\r\n#..##..#\r\n#..#...#\r\n####...#\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape16.txt",
    "content": "..#.....\r\n..##....\r\n..######\r\n..#  ##.\r\n.##  #..\r\n######..\r\n....##..\r\n.....#..\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape17.txt",
    "content": "..#  ###\r\n..#####.\r\n..##....\r\n...#....\r\n........\r\n........\r\n........\r\n........"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape18.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n....#...\r\n....##..\r\n.#####..\r\n###  #..\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape19.txt",
    "content": "........\r\n........\r\n.....###\r\n....### \r\n......# \r\n......##\r\n......##\r\n.......#\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape2.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n...#####\r\n.###....\r\n.#..#...\r\n##..##..\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape20.txt",
    "content": "#.......\r\n##......\r\n##......\r\n #......\r\n ###....\r\n###.....\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape21.txt",
    "content": "########\r\n########\r\n###.####\r\n###...##\r\n##...###\r\n####.###\r\n########\r\n########"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape22.txt",
    "content": "########\r\n#...####\r\n#.######\r\n#.####.#\r\n#.####.#\r\n######.#\r\n####...#\r\n########\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape23.txt",
    "content": "...##...\r\n..####..\r\n.####.#.\r\n######.#\r\n.####.#.\r\n..####..\r\n...##...\r\n........\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape24.txt",
    "content": "........\r\n........\r\n...#....\r\n...###..\r\n..###...\r\n....#...\r\n........\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape25.txt",
    "content": "..####..\r\n.######.\r\n###..###\r\n##....##\r\n##....##\r\n###..###\r\n.######.\r\n..####..\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape26.txt",
    "content": "........\r\n...##...\r\n..##.#..\r\n.####.#.\r\n..##.#..\r\n...##...\r\n........\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape3.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n#.......\r\n###.....\r\n..#.....\r\n..##....\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape4.txt",
    "content": "....#..#\r\n....#.##\r\n....#...\r\n....#...\r\n....##..\r\n.....#..\r\n.....###\r\n.......#\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape5.txt",
    "content": "####...#\r\n#..#...#\r\n#..###.#\r\n#####..#\r\n##....##\r\n.#....#.\r\n....###.\r\n#####...\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape6.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n.......#\r\n.....###\r\n.....#..\r\n....##..\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape7.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n#####...\r\n....###.\r\n..#...#.\r\n..##..##\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape8.txt",
    "content": "##..##..\r\n.#...#..\r\n.###....\r\n...#####\r\n........\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/shuriken/shapes/8x8/shape9.txt",
    "content": "..##....\r\n..#.....\r\n###.....\r\n#.......\r\n........\r\n........\r\n........\r\n........"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile0.txt",
    "content": "7,4,12,31,33,32,56,15,15"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile1.txt",
    "content": "40,8,8,8,24,16,48,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile10.txt",
    "content": "15,56,33,33,15,28,4,7,7"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile11.txt",
    "content": "0,48,16,24,8,8,40,8,8"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile12.txt",
    "content": "6,2,3,0,0,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile13.txt",
    "content": "25,9,7,60,0,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile14.txt",
    "content": "0,3,2,6,4,4,4,5,5"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile15.txt",
    "content": "60,7,1,33,62,12,8,56,56"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile16.txt",
    "content": "16,24,31,19,50,62,6,2,2"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile17.txt",
    "content": "19,31,24,8,0,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile18.txt",
    "content": "0,0,0,0,4,6,62,50,50"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile19.txt",
    "content": "0,0,3,7,1,1,1,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile2.txt",
    "content": "0,0,0,0,15,56,36,38,38"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile20.txt",
    "content": "0,32,32,32,56,48,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile21.txt",
    "content": "63,63,55,49,35,59,63,63,63"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile22.txt",
    "content": "63,7,31,31,62,62,56,63,63"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile23.txt",
    "content": "12,30,61,62,61,30,12,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile24.txt",
    "content": "0,0,8,14,28,4,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile25.txt",
    "content": "30,63,51,33,33,51,63,30,30"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile26.txt",
    "content": "0,12,26,61,26,12,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,48,16,24,24"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile4.txt",
    "content": "4,5,4,4,6,2,3,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile5.txt",
    "content": "56,8,14,60,33,33,7,60,60"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile6.txt",
    "content": "0,0,0,0,0,3,2,6,6"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile7.txt",
    "content": "0,0,0,0,60,7,17,25,25"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile8.txt",
    "content": "38,34,56,15,0,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/6x9/tile9.txt",
    "content": "24,16,48,0,0,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile0.txt",
    "content": "79,93,69,71,102,34,56,15"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile1.txt",
    "content": "8,8,104,72,24,16,112,64"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile10.txt",
    "content": "15,56,36,102,71,69,77,95"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile11.txt",
    "content": "64,112,16,24,104,72,8,8"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile12.txt",
    "content": "12,4,7,1,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile13.txt",
    "content": "99,34,14,120,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile14.txt",
    "content": "1,7,4,12,9,11,8,8"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile15.txt",
    "content": "120,14,34,51,113,81,93,121"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile16.txt",
    "content": "16,24,31,22,52,124,12,4"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile17.txt",
    "content": "23,30,24,8,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile18.txt",
    "content": "0,0,0,0,8,12,60,116"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile19.txt",
    "content": "0,0,3,7,1,1,1,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile2.txt",
    "content": "0,0,0,0,15,56,34,99"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile20.txt",
    "content": "64,96,96,32,56,112,64,64"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile21.txt",
    "content": "127,127,119,113,99,123,127,127"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile22.txt",
    "content": "127,71,95,95,125,125,113,127"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile23.txt",
    "content": "8,28,58,125,58,28,8,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile24.txt",
    "content": "0,0,8,14,28,4,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile25.txt",
    "content": "0,28,54,99,99,54,28,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile26.txt",
    "content": "0,12,26,61,26,12,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,64,112,16,24"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile4.txt",
    "content": "8,8,9,11,12,4,7,1"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile5.txt",
    "content": "125,89,81,113,51,18,14,120"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile6.txt",
    "content": "0,0,0,0,1,7,4,12"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile7.txt",
    "content": "0,0,0,0,120,14,66,99"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile8.txt",
    "content": "99,33,56,15,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/7x8/tile9.txt",
    "content": "24,16,112,64,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile0.txt",
    "content": "143,137,159,193,112,31"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile1.txt",
    "content": "144,16,16,48,224,128"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile10.txt",
    "content": "31,112,193,159,137,143"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile11.txt",
    "content": "128,224,48,16,16,144"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile12.txt",
    "content": "12,7,1,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile13.txt",
    "content": "19,14,248,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile14.txt",
    "content": "1,7,12,8,8,9"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile15.txt",
    "content": "248,14,131,249,145,241"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile16.txt",
    "content": "48,63,38,100,252,12"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile17.txt",
    "content": "39,62,48,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile18.txt",
    "content": "0,0,0,12,252,100"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile19.txt",
    "content": "0,7,14,2,3,3"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile2.txt",
    "content": "0,0,0,31,112,200"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile20.txt",
    "content": "192,192,64,112,224,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile21.txt",
    "content": "255,239,227,199,247,255"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile22.txt",
    "content": "255,143,189,189,241,255"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile23.txt",
    "content": "24,52,122,122,52,24"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile24.txt",
    "content": "0,16,28,56,8,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile25.txt",
    "content": "60,102,195,195,102,60"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile26.txt",
    "content": "24,52,122,52,24,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile3.txt",
    "content": "0,0,0,128,224,48"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile4.txt",
    "content": "9,8,8,12,7,1"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile5.txt",
    "content": "241,145,249,131,14,248"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile6.txt",
    "content": "0,0,0,1,7,12"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile7.txt",
    "content": "0,0,0,248,14,19"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile8.txt",
    "content": "200,112,31,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x6/tile9.txt",
    "content": "48,224,128,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile0.txt",
    "content": "143,137,153,191,195,65,112,31"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile1.txt",
    "content": "208,144,16,16,48,32,224,128"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile10.txt",
    "content": "31,112,66,195,159,185,137,143"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile11.txt",
    "content": "128,224,32,48,16,16,208,144"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile12.txt",
    "content": "12,4,7,1,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile13.txt",
    "content": "51,18,14,248,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile14.txt",
    "content": "1,7,4,12,8,8,9,11"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile15.txt",
    "content": "248,14,130,195,253,153,145,241"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile16.txt",
    "content": "32,48,63,38,100,252,12,4"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile17.txt",
    "content": "39,62,48,16,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile18.txt",
    "content": "0,0,0,0,8,12,124,228"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile19.txt",
    "content": "0,0,7,14,2,3,3,1"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile2.txt",
    "content": "0,0,0,0,31,112,72,204"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile20.txt",
    "content": "128,192,192,64,112,224,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile21.txt",
    "content": "255,255,239,227,199,247,255,255"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile22.txt",
    "content": "255,143,191,189,189,253,241,255"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile23.txt",
    "content": "24,60,122,253,122,60,24,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile24.txt",
    "content": "0,0,16,28,56,8,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile25.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile26.txt",
    "content": "0,24,52,122,52,24,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,128,224,32,48"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile4.txt",
    "content": "9,11,8,8,12,4,7,1"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile5.txt",
    "content": "241,145,157,249,195,66,14,248"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile6.txt",
    "content": "0,0,0,0,1,7,4,12"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile7.txt",
    "content": "0,0,0,0,248,14,34,51"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile8.txt",
    "content": "204,68,112,31,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/8x8/tile9.txt",
    "content": "48,32,224,128,0,0,0,0"
  },
  {
    "path": "src/games/shuriken/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if defined(__MC10__) || defined(__CIDELSA__) \r\n\t#define _VERTICAL_BAR 'I'\r\n#else\r\n\t#define _VERTICAL_BAR '|'\r\n#endif\r\n\r\n#define _TILE_0 _VERTICAL_BAR\r\n#define _TILE_1 '-'\r\n#define _TILE_2 '-'\r\n#define _TILE_3 _VERTICAL_BAR\r\n\r\n#define _TILE_4 '-'\r\n#define _TILE_5 _VERTICAL_BAR\r\n#define _TILE_6 _VERTICAL_BAR\r\n#define _TILE_7 '-'\r\n\r\n#define _TILE_8 '-'\r\n#define _TILE_9 _VERTICAL_BAR\r\n#define _TILE_10 _VERTICAL_BAR\r\n#define _TILE_11 '-'\r\n\r\n#define _TILE_12 _VERTICAL_BAR\r\n#define _TILE_13 '-'\r\n#define _TILE_14 '-'\r\n#define _TILE_15 _VERTICAL_BAR\r\n\r\n#define _TILE_16 '*'\r\n\r\n#define _TILE_17 _VERTICAL_BAR\r\n#define _TILE_18 _VERTICAL_BAR\r\n\r\n#define _TILE_19 '-'\r\n#define _TILE_20 '-'\r\n\r\n#define _TILE_21 'X'\r\n\r\n#if !defined(__ATARI7800__)\r\n    #define _TILE_22 '='\r\n#else\r\n    #define _TILE_22 '0' \r\n#endif\r\n\r\n#define _TILE_23 'S'\r\n\r\n#define _TILE_24 _VERTICAL_BAR\r\n\r\n#define _TILE_25 'O'\r\n\r\n#define _TILE_26 '.'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/Makefile.snake",
    "content": "\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n\t$(SOURCE_PATH)/main.c \\\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c\n\t# $(SOURCE_PATH)/control_player.c \\\n\t# $(SOURCE_PATH)/move_snake.c \\\n\t# $(SOURCE_PATH)/snake.c \\\n\t# $(SOURCE_PATH)/game_text.c \\\n\t# $(SOURCE_PATH)/variables.c \\\n\n\n# FULL_FILES ?= \\\n\t# $(BASIC_CROSS_LIB_FILES) \\\n\t# $(SOURCE_PATH)/main.c \\\n\t# $(SOURCE_PATH)/control_player.c \\\n\t# $(SOURCE_PATH)/move_snake.c \\\n\t# $(SOURCE_PATH)/snake.c \\\n\t# $(SOURCE_PATH)/game_text.c \\\n\t# $(SOURCE_PATH)/variables.c \\\n\t# $(CROSS_LIB_PATH)/sleep/sleep_macros.c\n\n\nGAME_NAME := snake\n\nPARENT_DIR = games\n\nGLOBAL_OPTS = -D_XL_NO_SMALL_LETTERS\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\ninclude ./Makefile_common\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n\n"
  },
  {
    "path": "src/games/snake/config/game_config.mk",
    "content": "#\r\n\r\n# COCO_COLOR_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DFASTER_WALL_REDRAW -DNUMBER_OF_MISSILES=3\r\n\r\n# CREATIVISION_GAME_OPTS ?= -DNUMBER_OF_MISSILES=2 -DMAX_ARROWS_ON_SCREEN=7 -DNO_BOTTOM_WALL_REDRAW\r\n\r\nGAMATE_GAME_OPTS ?= -DLESS_TEXT -DNO_BLINKING -DSIMPLE_STRATEGY -DNO_HINTS\r\n\r\nGAL_PLUS_GAME_OPTS ?= -DNO_DISPLAY_LEVEL_ANIMATION\r\n\r\n# C128_Z80_80COL_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=2 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DBULLETS_NUMBER=3\r\n    \r\n# ZX81_NO_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DNUMBER_OF_MISSILES=4 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL \r\n\r\n# ZX81_GFX_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=2 -DMISSILE_DROP_LOOP_MASK=7 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW\r\n\r\n# APPLE2_GAME_OPTS ?= -DMAX_ARROWS_ON_SCREEN=7 -DNUMBER_OF_MISSILES=3\r\n\r\n# COMX_GAME_OPTS ?= \t-DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\n# PECOM_GAME_OPTS ?= \t-DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=3 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\n# TMC600_GAME_OPTS ?= \t-DMAX_ARROWS_ON_SCREEN=6 -DNUMBER_OF_MISSILES=4 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nPHC25_GAME_OPTS             ?= -DREPEAT_MINES -DNO_DISPLAY_LEVEL_ANIMATION -DLESS_TEXT -DNO_BLINKING -DSIMPLE_STRATEGY -DNO_HINTS -D_XL_NO_SOUND\r\n\r\nPHC25_MONO_GAME_OPTS        ?= -DREPEAT_MINES -DNO_DISPLAY_LEVEL_ANIMATION -DLESS_TEXT -DNO_BLINKING -DSIMPLE_STRATEGY -DNO_HINTS -D_XL_NO_SOUND\r\n\r\nPHC25_NO_GFX_GAME_OPTS      ?= -DREPEAT_MINES -DNO_DISPLAY_LEVEL_ANIMATION -DLESS_TEXT -DNO_BLINKING -DSIMPLE_STRATEGY -DNO_HINTS"
  },
  {
    "path": "src/games/snake/config/project_config.mk",
    "content": "\r\n4COLOR_PALETTE=-D__USE_GREEN\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=250\r\n_APPLE2_SLOWDOWN=55\r\n_APPLE2ENH_SLOWDOWN=55\r\n_APPLE2_HGR_SLOWDOWN=200\r\n_APPLE2ENH_HGR_SLOWDOWN=200\r\n_ATARI_SLOWDOWN=170\r\n_ATARI5200_SLOWDOWN=170\r\n_ATARI7800_SLOWDOWN=170\r\n_ATARI7800_NO_COLOR_SLOWDOWN=80\r\n_ATARI_LYNX_SLOWDOWN=1200\r\n_C128_8502_80COL_SLOWDOWN=160\r\n_C16_SLOWDOWN=55\r\n_C16_CONIO_SLOWDOWN=85\r\n_C64_SLOWDOWN=45\r\n_CX16_SLOWDOWN?=260\r\n_CBM610_SLOWDOWN=240\r\n_CBM510_SLOWDOWN=120\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=120\r\n_ORIC_SLOWDOWN=40\r\n_MEGA65_SLOWDOWN=800\r\n_NES_SLOWDOWN=320\r\n_PET_SLOWDOWN=100\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=140\r\n_VIC20_SLOWDOWN=330\r\n\r\n\r\n# Z88DK\r\n_AGON_SLOWDOWN=4200\r\n_AQUARIUS_SLOWDOWN=105\r\n_ACE_SLOWDOWN=100\r\n_BEE_SLOWDOWN=40\r\n_C128_Z80_40COL_SLOWDOWN=20\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CAMPUTERS_LYNX_SLOWDOWN=42\r\n_COLECO_SLOWDOWN=100\r\n_CPC_MODE0_SLOWDOWN=100\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=90\r\n_CPC_MODE2_SLOWDOWN=90\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_E200_SLOWDOWN=400\r\n_G850_SLOWDOWN=200\r\n_G815_SLOWDOWN=160\r\n_GAL_SLOWDOWN=1800\r\n_GAL_GFX_SLOWDOWN=1400\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=300\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_GL6000SL_SLOWDOWN=300\r\n_HECTORHR_SLOWDOWN=100\r\n_LASER500_SLOWDOWN=200\r\n_M100_SLOWDOWN=100\r\n_M5_SLOWDOWN=140\r\n_MC1000_SLOWDOWN=75\r\n_MSX_SLOWDOWN=200\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=200\r\n_MTX512_SLOWDOWN=200\r\n_MZ_SLOWDOWN=200\r\n_PHC25_SLOWDOWN=300\r\n_PV1000_SLOWDOWN=5\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SC3000_SLOWDOWN=200\r\n_SMC777_SLOWDOWN=90\r\n_SMS_SLOWDOWN=160\r\n_SPECTRUM_SLOWDOWN=160\r\n_TRS80_SLOWDOWN=30\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=250 \r\n_X07_SLOWDOWN=4\r\n_ZX81_SLOWDOWN=10\r\n_ZX81_WRX_SLOWDOWN=12\r\n_ZX81_WRX128_SLOWDOWN=20\r\n_ZX81_8X6_WRX128_SLOWDOWN=30\r\n_ZX81_WRX64_SLOWDOWN=40\r\n_ZX81_8X6_WRX64_SLOWDOWN=50\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=160\r\n_DRAGON_SLOWDOWN=160\r\n_COCO3_SLOWDOWN=260\r\n_MO5_SLOWDOWN=160\r\n_TO7_SLOWDOWN=160\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=100\r\n_PECOM_SLOWDOWN=100\r\n_TMC600_SLOWDOWN=120\r\n_MICRO_SLOWDOWN=150\r\n_CIDELSA_SLOWDOWN=130\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=80\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=200\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n_TERMINAL_SLOWDOWN?=14\r\n\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=600\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=300"
  },
  {
    "path": "src/games/snake/control_player.h",
    "content": "#ifndef _CONTROL_PLAYER\r\n#define _CONTROL_PLAYER\r\n\r\n\r\n\r\n\r\n#include \"cross_lib.h\"\r\n\r\n    \r\n\r\nuint8_t MOVE_PLAYER(void);\r\n\r\n\r\n#endif // _CONTROL_PLAYER\r\n\r\n\r\n"
  },
  {
    "path": "src/games/snake/doc/game_play.txt",
    "content": "\r\n\r\nGAME PLAY:\r\n\r\nThe game concept is inspired by Nibbler (arcade game by Rock-Ola) and Snake (arcade and cell phone game).\r\n\r\n1. GOAL\r\nEat all apples on each level while avoiding being killed by:\r\n- biting yourself\r\n- consuming all energy (if you do not eat apples for too long)\r\n- bumping into mines\r\n\r\n2. SUB-GOALS\r\n- Collect the rings for points\r\n- Collect 3 or more rings on the same level without being killed, to spawn an \"energy\" item\r\n- Find secrets and the secret level\r\n\r\nRemark: When you die you lose all the collected rings but you keep the apples.\r\n\r\n3. ENERGY\r\nYou start with maximum energy and a slow snake. \r\nIf you do not eat apples, the snake starts moving faster. \r\nOnce the snake has reached maximum speed, its energy starts decreasing.\r\nHint: Keep an eye on the energy before you decide to go collect bonus items instead of apples.\r\n\r\n4. COLLECTABLE ITEMS\r\n- Apple: slows you down and avoids energy from decreasing;\r\n- Ring: bonus points + secrets unlocked if you collect many;\r\n- $: extra points and maybe some secrets;\r\n- Energy: restore 10 points of energy and freeze mines;\r\n- Extra life: secret extra life item.\r\nIMPORTANT: eating items (usually) makes your snake grow, which may make your life harder.\r\n\r\n5. ENEMIES\r\nThe mines are your enemy. They can be both fixed or moving.\r\nMoving mines bounce any time that bump into anything.\r\nIf the snake's HEAD touches the mine, the snake dies instantly.\r\nThe body of the snake CAN touch the mines. The snake's body CAN be used as a shield against mines.\r\nHint: collecting several rings may help you against the mines.\r\n\r\n6. WALLS\r\nHitting against walls or magic walls (walls that constantly disappear and reappear) pauses the snake and the game.\r\nThis gives you the time to think about your next move. Your snake does NOT starve while paused on a wall.\r\n\r\n7. LEVELS\r\nThe game has 32 normal levels + 1 secret level. The game has an end.\r\nThere are 17 different maps. Normal levels use 16 different maps. The secret level has its own map.\r\nLevels 17-32 use the same maps as levels 1-16 but have more mines and apples to collect.\r\nCompleting a level gives you a bonus that depends on:\r\n- snake length\r\n- energy left\r\n- number of rings collected\r\n- level\r\n\r\n8. SCORE\r\n\r\n- time         :   1 point (score slowly increases by 1 point)\r\n- $            :   5 points\r\n- Apple        :  20 points\r\n- first ring   :  10 points\r\n- second ring  :  20 points\r\n- third ring   :  40 points\r\n- energy       :  50 points\r\n- fourth ring  :  80 points\r\n- fifth ring   : 160 points\r\n- level bonus  : (snake length X 2) + (energy X 8) + (32 X rings) + (level X 4) \r\n\r\n\r\n9. EXTRA LIVES\r\nEvery 5000 points you are awarded an extra life.\r\nHint: Collecting the rings and keeping maximum energy is a good strategy to maximize your score.\r\n\r\n10. SECRETS\r\nThe game has 50 secrets most of which are only found on specific levels.\r\nHint 1: collect rings wihout dying;\r\nHint 2: on bonus levels, collect as many $ items as possible;\r\nHint 3: examine horizontal walls.\r\n\r\n11. ACHIEVEMENTS\r\nAt the end of your match, you get a screen with your achievements:\r\n- Points/Record\r\n- Number of total items obtained at the end of each completed level\r\n- Number of secrets found\r\n- Number of completed levels / Secret Level\r\n\r\n\r\n"
  },
  {
    "path": "src/games/snake/doc/info.txt",
    "content": "CROSS SNAKE\r\n\r\nThis is an original concept by Fabrizio Caruso written in C + Cross-Lib for hundreds of different computer and console systems.\r\n\r\nThe game concept is inspired by Nibbler (arcade game by Rock-Ola) and Snake (arcade and cell phone game).\r\n\r\nFor more details on CROSS_LIB, we refer to https://github.com/Fabrizio-Caruso/CROSS-LIB\r\n\r\nThe game-specific source code for ALL 8-bit targets (the VERY SAME code is used for all computers, consoles, handheld consoles and scientific calculators) is in:\r\nhttps://github.com/Fabrizio-Caruso/CROSS-LIB/tree/master/src/games/snake\r\n\r\n\r\nCREDITS:\r\nThe fonts used are rips taken from CharPad arcade fonts.\r\n\r\n"
  },
  {
    "path": "src/games/snake/doc/levels.txt",
    "content": "\r\nlevel  $       hm       vm        hw       vw       4th O\r\n============================================================\r\n 0     Y        2        1         Y        N        N\r\n\r\n------------------------------------------------------------\r\n\r\n 1     N        0        1         N        N        N\r\n 2     N        0        1         Y        N        N\r\n 3     N        2        0         N        Y        N\r\n 4     Y        3        0         N        N        Y\r\n \r\n 5     N        0        2         N        Y        N\r\n 6     N        3        1         Y        N        Y\r\n 7     N        0        2         Y        N        N\r\n 8     Y        2        1         Y        N        N\r\n\r\n 9     N        1        2         N        Y        N\r\n10     N        2        1         N        N        N\r\n11     N        2        0         N        N        N\r\n12     Y        3        0         N        N        Y\r\n\r\n13     N        2        1         Y        N        N\r\n14     N        4        0         N        Y        Y\r\n15     N        3        1         N        N        Y\r\n16     Y        3        1         N        N        Y\r\n\r\n------------------------------------------------------------\r\n\r\n17     N        2        1         N        N        N\r\n18     N        2        1         Y        N        N\r\n19     N        4        0         N        Y        Y\r\n20     Y        4        0         N        N        Y\r\n\r\n21     N        2        2         N        Y        N\r\n22     N        4        1         Y        N        Y\r\n23     N        2        2         Y        N        N\r\n24     Y        3        1         Y        N        Y\r\n\r\n25     N        2        2         N        Y        N\r\n26     N        4        1         N        N        Y\r\n27     N        4        0         N        N        Y\r\n28     Y        4        0         N        N        Y\r\n\r\n29     N        2        2         Y        N        N\r\n30     N        4        1         N        Y        Y\r\n31     N        4        1         N        N        Y\r\n32     Y        4        2         N        N        Y\r\n\r\n------------------------------------------------------------\r\n\r\n$  = bonus level\r\nhm = horizontal mines\r\nvm = vertical mines\r\nhw = transparent horizontal wall\r\nvm = transparent vertical wall\r\n"
  },
  {
    "path": "src/games/snake/doc/whatsnew.txt",
    "content": "WHAT'S NEW \r\nCross Snake 2.0\r\n\r\n- Improved game mechanics: the snake against the wall does not prevent mines from bouncing\r\n- 50 secrets to discover (Hint 1: collect many rings and $ items without dying; Hint 2: some horizontal walls are special)\r\n- Achievements final screen: game ends with the number of different achievements and secrets obtained during the game\r\n- More rings to collect with visible effects after 3, 4 and 5 rings collected without dying\r\n- Improved levels (many more mines, some walls have been re-designed)\r\n- SECRET and OPEN00 strings shown when a secret is found and when the secret level is unlocked\r\n- New secret extra life item can be unlocked on bonus and secret levels\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/snake/game_text.h",
    "content": "#ifndef _GAME_TEXT_H\r\n#define _GAME_TEXT_H\r\n\r\n#define MAX_ENERGY 20\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text);\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\n#if XSize<22\r\n    #define HISCORE_OFFSET 2\r\n#else\r\n    #define HISCORE_OFFSET 0\r\n#endif\r\n\r\n#define ACHIEVEMENTS_X_OFFSET (((XSize)/2)-5)\r\n#define ACHIEVEMENTS_Y_OFFSET ((YSize)/6)\r\n\r\n#if YSize>=20\r\n    #define STAT_OFFSET 4\r\n#else\r\n    #define STAT_OFFSET 2\r\n#endif\r\n\r\n\r\n#if YSize>=15\r\n    #define LEVEL_OFFSET 2\r\n#else\r\n    #define LEVEL_OFFSET 0\r\n#endif\r\n\r\n#if !defined(NO_DISPLAY_RINGS)\r\n    void DISPLAY_RINGS(void);\r\n\r\n    #define DELETE_RINGS() \\\r\n        _XL_PRINT(ACHIEVEMENTS_X_OFFSET+3, ACHIEVEMENTS_Y_OFFSET+3, \"     \")\r\n#else\r\n    #define DISPLAY_RINGS()\r\n\r\n    #define DELETE_RINGS()\r\n#endif\r\n\r\n\r\n\r\n#define _NO_ENERGY_STRING _XL_N _XL_O _XL_SPACE _XL_E _XL_N _XL_E _XL_R _XL_G _XL_Y\r\n#define _CLEARED_STRING _XL_C _XL_L _XL_E _XL_A _XL_R _XL_E _XL_D\r\n#define _BONUS_STRING _XL_B _XL_O _XL_N _XL_U _XL_S\r\n#define _THE_END_STRING _XL_T _XL_H _XL_E _XL_SPACE _XL_E _XL_N _XL_D\r\n#define _GAME_OVER_STRING _XL_G _XL_A _XL_M _XL_E _XL_SPACE _XL_O _XL_V _XL_E _XL_R\r\n\r\n#if XSize<20\r\n    #define _SECRET_STRING _XL_W _XL_O _XL_W\r\n\t#define _SECRET_LEN 3\r\n#else\r\n    #define _SECRET_STRING _XL_S _XL_E _XL_C _XL_R _XL_E _XL_T\r\n\t#define _SECRET_LEN 6\r\n#endif\r\n#define _LEVEL_STRING _XL_L _XL_E _XL_V _XL_E _XL_L\r\n#define _SNAKE_STRING _XL_S _XL_N _XL_A _XL_K _XL_E\r\n#define _Fabrizio_Caruso_STRING _XL_F _XL_a _XL_b _XL_r _XL_i _XL_z _XL_i _XL_o _XL_SPACE _XL_C _XL_a _XL_r _XL_u _XL_s _XL_o\r\n#define _PRESS_FIRE_STRING _XL_P _XL_R _XL_E _XL_S _XL_S _XL_SPACE _XL_F _XL_I _XL_R _XL_E\r\n\r\n#if YSize>=20\r\n    #define LINE_SKIP 2\r\n    #define LINE_OFFSET 8\r\n    #define SNAKE_LINE_OFFSET 5\r\n#else\r\n    #define SNAKE_LINE_OFFSET 4\r\n    #define LINE_OFFSET 6\r\n    #define LINE_SKIP 1\r\n#endif\r\n\r\n// Adding this sensical line _XL_PRINT(0,i,\"\"); fixes a bug for GCC for TI99\r\n#if !defined(NO_EXTRA_TITLE) && YSize>=16\r\n    #if !defined(_XL_NO_COLOR)\r\n        #define extra_title() \\\r\n        { \\\r\n            uint8_t i; \\\r\n            show_intro_snake(); \\\r\n            _XL_DRAW(XSize/4+XSize/2,YSize/8+SNAKE_LINE_OFFSET,APPLE_TILE,_XL_RED); \\\r\n            for(i=0;i<NUMBER_OF_STRINGS;++i) \\\r\n            { \\\r\n                _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n                _XL_PRINT(XSize/2-4,YSize/8+LINE_OFFSET+LINE_SKIP*i, (char *) strings[NUMBER_OF_STRINGS-1-i] ); \\\r\n                _XL_DRAW(XSize/2-6,YSize/8+LINE_OFFSET+LINE_SKIP*i, images[NUMBER_OF_STRINGS-i], image_colors[NUMBER_OF_STRINGS-i]); \\\r\n            } \\\r\n        }\r\n    #else\r\n        #define extra_title() \\\r\n        { \\\r\n            uint8_t i; \\\r\n            show_intro_snake(); \\\r\n            _XL_DRAW(XSize/4+XSize/2,YSize/8+SNAKE_LINE_OFFSET,APPLE_TILE,_XL_RED); \\\r\n            for(i=0;i<NUMBER_OF_STRINGS;++i) \\\r\n            { \\\r\n                _XL_DRAW(XSize/2-6,YSize/8+LINE_OFFSET+LINE_SKIP*i, images[NUMBER_OF_STRINGS-i], 0); \\\r\n                _XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n                _XL_PRINT(XSize/2-4,YSize/8+LINE_OFFSET+LINE_SKIP*i, (char *) strings[NUMBER_OF_STRINGS-1-i] ); \\\r\n            } \\\r\n        }\r\n    #endif\r\n#else\r\n    #define extra_title() \\\r\n    { \\\r\n        show_intro_snake(); \\\r\n        _XL_DRAW(XSize/4+XSize/2,YSize/8+SNAKE_LINE_OFFSET,APPLE_TILE,_XL_RED); \\\r\n    }\r\n#endif\r\n\r\n#if !defined(NO_CONTROL_INSTRUCTIONS)\r\n    #define TILE_PRESS_KEY() CONTROL_INSTRUCTIONS()\r\n#else\r\n    #define TILE_PRESS_KEY() PRESS_KEY()\r\n#endif\r\n\r\n#if !defined(_XL_NO_COLOR)\r\n\t#define title() \\\r\n\t\t_XL_CLEAR_SCREEN(); \\\r\n\t\t_XL_DRAW(XSize/2-4,0,HI_TEXT_TILE,_XL_RED); \\\r\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n\t\t_XL_PRINTD(XSize/2-3,0,5,record); \\\r\n\t\t_XL_SET_TEXT_COLOR(_XL_RED); \\\r\n\t\tPRINT_CENTERED_ON_ROW(YSize/8, _SNAKE_STRING); \\\r\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n\t\tPRINT_CENTERED_ON_ROW(YSize/8+2, _Fabrizio_Caruso_STRING); \\\r\n\t\textra_title(); \\\r\n\t\tTILE_PRESS_KEY();\r\n#else\r\n\t#define title() \\\r\n\t\t_XL_CLEAR_SCREEN(); \\\r\n\t\t_XL_DRAW(XSize/2-3,0,HI_TEXT_TILE,0); \\\r\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n\t\t_XL_PRINTD(XSize/2-2,0,5,record); \\\r\n\t\t_XL_SET_TEXT_COLOR(_XL_RED); \\\r\n\t\tPRINT_CENTERED_ON_ROW(YSize/8, _SNAKE_STRING); \\\r\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\r\n\t\tPRINT_CENTERED_ON_ROW(YSize/8+2, _Fabrizio_Caruso_STRING); \\\r\n\t\textra_title(); \\\r\n\t\tTILE_PRESS_KEY();\r\n#endif\r\n\r\n\r\n#define RED_ENERGY_THRESHOLD ((MAX_ENERGY)/2)\r\n\r\n\r\nvoid DISPLAY_ENERGY(void);\r\n\r\nvoid PRESS_KEY(void);\r\n\r\nvoid DISPLAY_POINTS(void);\r\n\r\nvoid DISPLAY_REMAINING_APPLES_COUNT(void);\r\n\r\nvoid DISPLAY_LIVES(void);\r\n\r\nvoid show_intro_snake(void);\r\n\r\n#if !defined(NO_CONTROL_INSTRUCTIONS)\r\nvoid CONTROL_INSTRUCTIONS(void);\r\n#endif\r\n\r\n#endif // _GAME_TEXT_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/init_images.h",
    "content": "#ifndef _INIT_IMAGES_H\r\n#define _INIT_IMAGES_H\r\n\r\n#include \"tiles.h\"\r\n\r\n#define _SNAKE_COLOR _XL_GREEN\r\n\r\n#define _WALL_COLOR _XL_YELLOW\r\n\r\n\r\n#define VERTICAL_HEAD_TILE  _TILE_0\r\n#define HORIZONTAL_HEAD_TILE _TILE_1\r\n#define LEFT_MINE_TILE _TILE_2\r\n#define RIGHT_MINE_TILE _TILE_3\r\n#define BODY_TILE _TILE_4\r\n#define APPLE_TILE _TILE_5\r\n#define HI_TEXT_TILE _TILE_6\r\n#define CENTRAL_BRICK_TILE _TILE_7\r\n#define RING_TILE _TILE_8\r\n#define LV_TEXT_TILE _TILE_9\r\n#define TRANSPARENT_BRICK_TILE _TILE_10\r\n#define UP_MINE_TILE _TILE_11\r\n#define VERTICAL_BRICK_TILE _TILE_12\r\n#define HORIZONTAL_BRICK_TILE _TILE_13\r\n#define SCORE_TEXT_LEFT_TILE _TILE_14\r\n#define DOWN_MINE_TILE _TILE_15\r\n#define SCORE_TEXT_RIGHT_TILE _TILE_16\r\n#define MINE_TILE _TILE_17\r\n#define SUPER_RING_TILE _TILE_18\r\n#define EXTRA_TILE _TILE_25\r\n\r\n\r\n\r\n\r\n#endif // _INIT_IMAGES_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/levels.h",
    "content": "#ifndef _LEVELS_H\r\n#define _LEVELS_H\r\n\r\n#if YSize<12\r\n    #define REPEAT_MINES\r\n#endif\r\n\r\n\r\n// MAP WALLS\r\nconst uint8_t map_walls[] = \r\n{\r\n// map 0 (0)\r\n    0,\r\n    0,\r\n    0,\r\n// map 1 (3) \r\n    2, \r\n\r\n    #if YSize<=9\r\n        XSize/3-1,       YSize/3+1,     3,\r\n    #elif YSize<=17\r\n        XSize/3,       YSize/3+1,     3,\r\n    #elif YSize<=20\r\n        XSize/3,       YSize/3+1,     XSize/3,\r\n    #else\r\n        XSize/3,       YSize/3,     XSize/3,\r\n    #endif\r\n    #if YSize<=9\r\n        XSize/3+8,   2*YSize/3,     3,\r\n    #elif YSize<=17\r\n        XSize/3+6,   2*YSize/3-1,     3,\r\n    #else\r\n        XSize/3,     2*YSize/3,     XSize/3,\r\n    #endif\r\n    2,  \r\n        XSize/5,             1,     YSize/4,\r\n        4*XSize/5,   3*YSize/4,     YSize/4,\r\n    0,\r\n\r\n// map 2 (18) \r\n    0, \r\n    #if YSize>=12\r\n    \r\n    2,\r\n        XSize/3,                      0,    4*YSize/5,\r\n       2*XSize/3,               YSize/5,    4*YSize/5,\r\n    #else\r\n    2,\r\n        XSize/3,                      0,    4*YSize/5,\r\n       2*XSize/3,               YSize/5,    YSize-3,\r\n    #endif\r\n    0,\r\n\r\n// map 3 (27)\r\n    #if YSize>=13\r\n    4,\r\n        0,                      YSize/4,      XSize/4,\r\n       3*XSize/4,               YSize/4,      XSize/4,\r\n        0,                    3*YSize/4,      XSize/4,\r\n       3*XSize/4,             3*YSize/4,      XSize/4,\r\n    #else\r\n    4,\r\n        2,                      YSize/2-1,      XSize/4-2,\r\n       3*XSize/4,               YSize/2-1,      XSize/4-2,\r\n        2,                      (YSize/2)+1,    XSize/4-2,\r\n       3*XSize/4,               (YSize/2)+1,    XSize/4-2,\r\n    #endif\r\n    2,\r\n        XSize/2,                      1,      YSize/4,\r\n        XSize/2,        YSize-1-YSize/4,      YSize/4,\r\n    0,\r\n        \r\n// map 4 (48)\r\n    0,\r\n    #if YSize>=12\r\n    2,\r\n        XSize/3,                      0,    YSize-YSize/5,\r\n       2*XSize/3,               YSize/5,  YSize-YSize/5-1,\r\n    #else\r\n    2,\r\n        XSize/3,                      0,    YSize-3,\r\n       2*XSize/3,               3,  YSize-YSize/5-1,\r\n    #endif\r\n    2,\r\n        1,1,XSize/8,YSize/8,DEADLY,\r\n        XSize-1-XSize/8,YSize-1-YSize/8,XSize/8,YSize/8,DEADLY,\r\n\r\n// map 5 (67)\r\n    #if YSize>=16\r\n    4,\r\n             0,                 YSize/5,      XSize/2,\r\n       XSize-1-XSize/2,       2*YSize/5,      XSize/2,\r\n             0,               3*YSize/5,      XSize/2,\r\n       XSize-1-XSize/2,       4*YSize/5,      XSize/2,\r\n    #else\r\n    4,\r\n             2,               2,      3,\r\n       XSize-5,       2,      3,\r\n             2,               YSize-3,      3,\r\n       XSize-5,       YSize-3,      3,\r\n    #endif\r\n    0,\r\n    0,\r\n\r\n// map 6 (82) (Z88DK partial work-around for preprocessor bug on division with integer litterals)\r\n    4,\r\n        ((uint8_t) (XSize/4)),                ((uint8_t) (YSize/4)),              ((uint8_t) (XSize/5))+1,\r\n        XSize-((uint8_t) (XSize/4))-((uint8_t) (XSize/5)),        ((uint8_t) (YSize/4)),      ((uint8_t) (XSize/5))+1, // (1)\r\n        ((uint8_t) (XSize/4)),        YSize-1-((uint8_t) (YSize/4)),              ((uint8_t) (XSize/5))+1,\r\n        XSize-((uint8_t) (XSize/4))-((uint8_t) (XSize/5)),YSize-1-((uint8_t) (YSize/4)),      ((uint8_t) (XSize/5))+1, // (2)\r\n    4,  \r\n        ((uint8_t) (XSize/4)),                ((uint8_t) (YSize/4)),              ((uint8_t) (YSize/5)),\r\n        XSize-((uint8_t) (XSize/4)),((uint8_t) (YSize/4)),                      ((uint8_t) (YSize/5)), // (1)\r\n        ((uint8_t) (XSize/4)),        YSize-((uint8_t) (YSize/4))-((uint8_t) (YSize/5)),        ((uint8_t) (YSize/5)),\r\n        XSize-((uint8_t) (XSize/4)),YSize-((uint8_t) (YSize/4))-((uint8_t) (YSize/5)),        ((uint8_t) (YSize/5)), // (2)\r\n    0,\r\n\r\n// map 7 (109)\r\n    2,\r\n        0, YSize/2, XSize/4,\r\n        XSize-XSize/4, YSize/2, XSize/4,\r\n    0,\r\n    2,\r\n        XSize/2-XSize/10,1,XSize/5,YSize/5,DEADLY,\r\n        XSize/2-XSize/10,YSize-1-YSize/5,XSize/5,YSize/5,DEADLY,\r\n// map 8\r\n    0,\r\n    4, \r\n    #if YSize>=12\r\n        XSize/6, 3, YSize-1-6,\r\n        2*XSize/6, 3, YSize-1-6,\r\n        XSize-1-2*XSize/6, 3, YSize-1-6,\r\n        XSize-1-XSize/6, 3, YSize-1-6,\r\n    #else\r\n        XSize/6, 3, 2,\r\n        2*XSize/6, 3, 2,\r\n        XSize-1-2*XSize/6, 3, 2,\r\n        XSize-1-XSize/6, 3, 2,\r\n    #endif\r\n    0,\r\n// map 9 (143)\r\n    0,\r\n    0,\r\n    #if YSize<12\r\n    4,\r\n        2,2,XSize/4,1,WALL,\r\n        2,YSize-2-YSize/4,XSize/4,1,WALL,\r\n        XSize-2-XSize/4,YSize-2-YSize/4,XSize/4,1,WALL,\r\n        XSize-2-XSize/4,2,XSize/4,1,WALL,\r\n    #elif YSize<20\r\n    4,\r\n        2,2,XSize/4,YSize/4,WALL,\r\n        2,YSize-2-YSize/4,XSize/4,YSize/4,WALL,\r\n        XSize-2-XSize/4,YSize-2-YSize/4,XSize/4,YSize/4,WALL,\r\n        XSize-2-XSize/4,2,XSize/4,YSize/4,WALL,\r\n    #else\r\n    4,\r\n        2,2,XSize/3,YSize/3,WALL,\r\n        2,YSize-2-YSize/3,XSize/3,YSize/3,WALL,\r\n        XSize-2-XSize/3,YSize-2-YSize/3,XSize/3,YSize/3,WALL,\r\n        XSize-2-XSize/3,2,XSize/3,YSize/3,WALL,\r\n    #endif\r\n// map 10\r\n    2, \r\n        XSize/3-1,       YSize/3,     XSize/2-1,\r\n        XSize/3-1,     2*YSize/3,     XSize/2-1,\r\n    0,\r\n    0,\r\n// map 11\r\n    #if YSize<12\r\n    2,\r\n        XSize/4, YSize/2-2,2,\r\n        XSize/4, YSize-3,2,\r\n    0,\r\n    #else\r\n    2,\r\n        XSize/4, YSize/2-2,XSize/2,\r\n        XSize/4, YSize/2+2,XSize/2,\r\n    0,\r\n    #endif\r\n    \r\n    #if YSize<20\r\n    4,\r\n        2,2,2,2,DEADLY,\r\n        2,YSize-2-2,2,2,DEADLY,\r\n        XSize-4,YSize-2-2,2,2,DEADLY,\r\n        XSize-4,2,2,2,DEADLY,\r\n    #else\r\n    4,\r\n        2,2,XSize/5,YSize/5,DEADLY,\r\n        2,YSize-2-YSize/5,XSize/5,YSize/5,DEADLY,\r\n        XSize-2-XSize/5,YSize-2-YSize/5,XSize/5,YSize/5,DEADLY,\r\n        XSize-2-XSize/5,2,XSize/5,YSize/5,DEADLY,\r\n    #endif\r\n// map 12(204)\r\n    0,\r\n    #if YSize<16\r\n    2,\r\n         XSize/5,                      1,   3,\r\n       4*XSize/5,                      YSize-4,   3,\r\n    #else\r\n    2,\r\n         XSize/5,                      1,   YSize-YSize/5,\r\n       4*XSize/5,                      YSize/5,   YSize-YSize/5-1,\r\n    #endif\r\n    0,\r\n// map 13 (213)\r\n    1,\r\n    #if YSize>=12\r\n        2,YSize/2-2,XSize-4,\r\n    #else\r\n        XSize/2-2,YSize/2-2,4,\r\n    #endif\r\n    0,\r\n    0,\r\n\r\n// map 14 (219)\r\n    #if YSize<16\r\n    4,\r\n        2,                      2,      3,\r\n       XSize-1-5,               2,      3,\r\n        2,                    YSize-3,      3,\r\n       XSize-1-5,             YSize-3,      3,\r\n    #else\r\n    4,\r\n        0,                      YSize/4,      XSize/4+1,\r\n       3*XSize/4,               YSize/4,      XSize/4,\r\n        0,                    3*YSize/4,      XSize/4+1,\r\n       3*XSize/4,             3*YSize/4,      XSize/4,\r\n    #endif\r\n    0,\r\n    0,\r\n// map 15 (234)\r\n    1,\r\n        5,YSize/2+1,XSize-10,\r\n    0,\r\n    \r\n    #if YSize<16\r\n    1,\r\n        XSize/2-1,YSize/2+3,2,2,DEADLY,\r\n    #elif YSize<20\r\n    1,\r\n        XSize/2-1,YSize/2+3,3,3,DEADLY,\r\n    #else\r\n    1,\r\n        XSize/2-3,YSize/2+4,6,6,DEADLY,\r\n    #endif\r\n// map 16 (245)\r\n    0,\r\n    2,\r\n        XSize/3, YSize-1-YSize/3, YSize/3,\r\n        XSize-1-XSize/3, YSize-1-YSize/3, YSize/3,\r\n    0,\r\n};\r\n\r\n\r\nconst uint8_t map_walls_index[] = \r\n    {\r\n        0,   // 0\r\n        3,   // 1\r\n        18,  // 2\r\n        27,  // 3\r\n        48,  // 4\r\n        67,  // 5\r\n        82,  // 6\r\n        109, // 7\r\n        128, // 8\r\n        143, // 9\r\n        166, // 10\r\n        175, // 11\r\n        204, // 12\r\n        213, // 13\r\n        219, // 14\r\n        234, // 15\r\n        245, // 16\r\n        };\r\n\r\n\r\n// HORIZONTAL MINES\r\nconst uint8_t horizontal_mines_on_level[] = \r\n    {\r\n        2, // 0  (0)\r\n            YSize/5,\r\n            4*YSize/5,\r\n        0, // 1  (3)\r\n        0, // 2  (4)\r\n        2, // 3  (5)\r\n        #if YSize>10\r\n            YSize/2 - 3,\r\n            YSize/2 + 3,\r\n        #else\r\n            1,\r\n            YSize-2,\r\n        #endif\r\n        2, // 4 (8)\r\n            2,\r\n            YSize-3,\r\n        3, // 5 (11)\r\n            YSize/2 - 1,\r\n            2,\r\n            YSize-3,\r\n        0, // 6  (15)\r\n        0, // 7  (16)\r\n        2, // 8  (17)\r\n            2,\r\n            YSize-3,\r\n        1, // 9  (20)\r\n            YSize/2-1,\r\n        2, // 10 (22)\r\n            YSize/3 - 2,\r\n            2*YSize/3+2,\r\n        2, // 11 (25)\r\n            YSize/2 - 3,\r\n            YSize/2 + 3,\r\n        2, // 12 (28)\r\n            2,\r\n            YSize-3,\r\n        3, // 13 (31)\r\n        #if YSize>=12\r\n            YSize/2 - 5,\r\n            YSize/2 + 3,\r\n            YSize/2 + 6,\r\n        #else\r\n            1,\r\n            YSize-4,\r\n            YSize-3,\r\n        #endif\r\n        4, // 14 (35)\r\n            YSize/2 - 2,\r\n            YSize/2 + 2,\r\n            YSize/2 - 4,\r\n            YSize/2 + 4,\r\n        3, // 15 (40)\r\n        #if YSize>=12\r\n            YSize/2 - 3,\r\n            YSize/2 - 4,\r\n            YSize/2 - 5,\r\n        #else\r\n            1,\r\n            2,\r\n            3,\r\n        #endif\r\n        3, // 16 (44)\r\n        #if YSize>=12\r\n            YSize/2 - 4,\r\n            YSize/2 - 5,\r\n            YSize/2 - 6,\r\n        #else\r\n            1,\r\n            2,\r\n            3,\r\n        #endif\r\n        \r\n        \r\n        #if !defined(REPEAT_MINES)\r\n        2, // 17 (48)\r\n            YSize/2 - 3,\r\n            YSize/2 + 3,\r\n        2, // 18 (51)\r\n            3,\r\n            YSize - 3,\r\n        4, // 19 (54)\r\n            YSize/2 - 3,\r\n            YSize/2 + 3,\r\n            YSize/2 - 2,\r\n            YSize/2 + 2,\r\n        4, // 20 (59)\r\n            2,\r\n            YSize-3,\r\n            YSize/2-3,\r\n            YSize/2+3,\r\n        4, // 21(64)\r\n            YSize/2 - 1,\r\n            YSize/2 + 1,\r\n            2,\r\n            YSize-3,\r\n        2, // 22(69)\r\n            3,\r\n            YSize - 3,\r\n        2, // 23 (72)\r\n            YSize/2 - 3,\r\n            YSize/2 + 2,\r\n        3, // 24 (75)\r\n            2,\r\n            YSize-3,\r\n            YSize/2 - 3,\r\n        2, // 25 (79)\r\n            YSize/2+1,\r\n            YSize/2-1,\r\n        4, // 26 (82)\r\n            2,\r\n            YSize-3,\r\n            4,\r\n            YSize-5,\r\n        4, // 27 (87)\r\n            YSize/2 - 3,\r\n            YSize/2-1,\r\n            YSize/2+1,\r\n            YSize/2 + 3,\r\n        2, // 28 (92)\r\n            2,\r\n            YSize-3,\r\n        4, // 29 (95)\r\n            3,\r\n            3*YSize/5,\r\n            5,\r\n            4*YSize/5,\r\n        4, // 30 (100)\r\n            YSize/2 - 2,\r\n            YSize/2 + 2,\r\n            YSize/2 - 4,\r\n            YSize/2 + 4,\r\n        4, // 31 (105)\r\n            YSize/2 - 4,\r\n            YSize/2 - 5,\r\n            YSize/2 - 6,\r\n            YSize/2 - 7,\r\n        4, // 32 (110)\r\n            YSize/2 - 5,\r\n            YSize/2 - 6,\r\n            YSize/2 - 7,\r\n            YSize/2 - 8,\r\n        #endif\r\n    };\r\n\r\n\r\nconst uint8_t horizontal_mines_on_level_index[] =\r\n    {\r\n        0,  //  0\r\n        3,  //  1\r\n        4,  //  2\r\n        5,  //  3\r\n        8,  //  4\r\n        11, //  5\r\n        15, //  6\r\n        16, //  7\r\n        17, //  8\r\n        20, //  9\r\n        22, // 10\r\n        25, // 11\r\n        28, // 12\r\n        31, // 13\r\n        35, // 14\r\n        40, // 15\r\n        44, // 16\r\n        #if !defined(REPEAT_MINES)\r\n        48, // 17\r\n        51, // 18\r\n        54, // 19\r\n        59, // 20\r\n        64, // 21\r\n        69, // 22\r\n        72, // 23\r\n        75, // 24\r\n        79, // 25\r\n        82, // 26\r\n        87, // 27\r\n        92, // 28\r\n        95, // 29\r\n       100, // 30\r\n       105, // 31\r\n       110  // 32\r\n       #endif\r\n    };\r\n\r\n\r\n// VERTICAL MINES\r\nconst uint8_t vertical_mines_on_level[] = \r\n    {\r\n        1, //  0 (0)\r\n            XSize/2,\r\n        1, //  1 (2)\r\n            XSize/2-1,\r\n        1, //  2 (4)\r\n            XSize/2-1,\r\n        0, //  3 (6) \r\n        0, //  6 -> 4(7)\r\n        0, //  4 -> 5(8)\r\n        2, //  5 -> 6(9)\r\n            XSize/2,\r\n            XSize/2-1,\r\n        2, //  7 (12)\r\n            XSize/2+1,\r\n            XSize/2-2,\r\n        1, //  8 (15)\r\n            XSize/2,\r\n        2, //  9 (17)\r\n            XSize/2+1,\r\n            XSize/2-1,\r\n        1, // 10 (20)\r\n            XSize/2-1,\r\n        0, // 11 (22)\r\n        1, // 13 (23)\r\n            XSize/2+1,\r\n        2, // 13 (25)\r\n            XSize/4,\r\n            3*XSize/4,\r\n        0, // 14 (28)\r\n        1, // 15 (29)\r\n            XSize/2-1,\r\n        1, // 16 (31),\r\n            XSize/2-1,\r\n        #if !defined(REPEAT_MINES)\r\n        1, // 17 (33)\r\n            XSize/2-1,\r\n        1, // 18 (35)\r\n            XSize/2,\r\n        0, // 19 (37)\r\n        1, // 22 -> 20 (38)\r\n            XSize/2-1,        \r\n        0, // 20 -> 21 (40)\r\n        2, // 21 -> 22 (41)\r\n            XSize/2,\r\n            XSize/2-1,\r\n        2, // 23 (44)\r\n            XSize/2+1,\r\n            XSize/2-1,\r\n        1, // 24 (47)\r\n            XSize/2,\r\n        2, // 25 (49)\r\n            XSize/2,\r\n            XSize/2-1,\r\n        1, // 26 (52)\r\n            XSize/2,\r\n        0, // 27 (54)\r\n        2, // 28 (55)\r\n            XSize/2+1,\r\n            XSize/2-1,\r\n        2, // 29 (58)\r\n            XSize/4,\r\n            3*XSize/4,\r\n        1, // 30 (61)\r\n            XSize/2,\r\n        1, // 31 (63)\r\n            XSize/2,\r\n        2, // 32 (65),\r\n            XSize/6,\r\n            XSize-1-XSize/6\r\n        #endif\r\n    };\r\n\r\n\r\nconst uint8_t vertical_mines_on_level_index[] =\r\n    {\r\n         0,\r\n         2,\r\n         4,\r\n         6,\r\n         7,\r\n         8,\r\n         9,\r\n        12, // 7\r\n        15, // 8\r\n        17, // 9\r\n        20, // 10\r\n        22, // 11\r\n        23, // 12\r\n        25, // 13\r\n        28, // 14\r\n        29, // 15\r\n        31, // 16\r\n        #if !defined(REPEAT_MINES)\r\n\r\n        33, // 17\r\n        35, // 18\r\n        37, // 19\r\n        38, // 20\r\n        40, // 21\r\n        41, // 22\r\n        44, // 23\r\n        47, // 24\r\n        49, // 25\r\n        52, // 26\r\n        54, // 27\r\n        55, // 28\r\n        58, // 29\r\n        61, // 30\r\n        63, // 31\r\n        65  // 32\r\n        #endif\r\n    };\r\n\r\n\r\n#endif // _LEVELS_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/makefiles/Makefile.override",
    "content": "\r\n\r\n\r\ncreativision: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t creativision -DNO_EXTRA_TITLE \\\r\n\t-D__NO_SCREEN_INIT -D__CREATIVISION__  -DNO_CONTROL_INSTRUCTIONS \\\r\n\t-D__ALT_SLEEP -DX_OFFSET=6  -DXSize=20 -DY_OFFSET=3 -DYSize=16 -DMAX_SNAKE_LENGTH=12 \\\r\n\t-D__VDP_MODE1_GRAPHICS -DLESS_TEXT   \\\r\n\t-DNO_SECRET_ANIMATION -DNO_EXTRA_LIFE_ANIMATION -DNO_BONUS_ANIMATION \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=12000 -DNO_DISPLAY_LEVEL_ANIMATION \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k_less_stack.cfg \\\r\n\t-DUSE_MEMORY_BUFFERS  \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(SOURCE_PATH)/memory/creativision_memory.s \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\n\r\nifdef USE_TOOLS\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\nelse\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s\r\nendif\t\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\r\n\t -D_XL_SLOW_DOWN_FACTOR=10000   \\\r\n\t-D__ALT_SLEEP  \\\r\n\t-DXSize=17 -DX_OFFSET=1 -DY_OFFSET=1 -DNO_DISPLAY_LEVEL_ANIMATION -DYSize=16 -DMAX_SNAKE_LENGTH=12 \\\r\n\t-DLESS_TEXT -DUSE_MEMORY_BUFFERS -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  \\\r\n\t$(SOURCE_PATH)/memory/gamate_memory.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \\\r\n\t-DNO_HINTS -DNO_SECRET_ANIMATION \\\r\n\t-DNO_CONTROL_INSTRUCTIONS -DNO_EXTRA_TITLE -DNO_BONUS_ANIMATION \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\nifdef USE_TOOLS\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\nendif \r\n\r\n\r\n# TODO: FIX c16_16k\r\nc16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16 \\\r\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30.cfg \\\r\n\t-DNO_EXTRA_LIFE_ANIMATION  \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t-DSOUNDS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ASSEMBL_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=4000 \\\r\n\t-D__UDG_BASE_FACTOR=15 \\\r\n\t$(SOURCE_PATH)/memory/c16_memory.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nvic20_exp_8k: $(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t--config $(CFG_PATH)/cc65/vic20-8k_memory_mapped_GFX.cfg \\\r\n\t-DSOUNDS  -D__ALT_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__VIC20__ -D__VIC20_EXP_8K \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t-DLESS_TEXT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t$(BASIC_CROSS_LIB_FILES) $(SOURCE_PATH)/split_files/main.c   \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t--code-name CODE2 \\\r\n\t$(SOURCE_PATH)/split_files/game_text.c  \\\r\n\t$(SOURCE_PATH)/split_files/variables.c \\\r\n\t$(SOURCE_PATH)/split_files/control_player.c \\\r\n\t$(SOURCE_PATH)/split_files/snake.c  \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c  \\\r\n\t$(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s \\\r\n\t$(SOURCE_PATH)/split_files/move_snake.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\n#############################\r\n# SC3000\r\n\r\n# sc3000: sc3000_32k\r\n\r\n# sc3000_32k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_OPTS) -DEXTRA_TITLE \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -D__SC3000__ \\\r\n\t # \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \\\r\n\t# -D__BIT_BANG_SOUND \\\r\n\t  # \\\r\n\t# -DZ88DK_JOYSTICK \\\r\n\t# -D__CONIO_GRAPHICS \\\r\n\t# -vn -lndos -create-app -Cz--audio \\\r\n\t # \\\r\n\t # \\\r\n\t# -clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t# $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.prg \\\r\n\t# $(FULL_FILES)\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.prg\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sc3000_32k.tap\r\n\r\n\r\n#############################\r\n# SG1000\r\n\r\nsg1000: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_ROM_OPTS) -subtype=rom \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__SC3000__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DXSize=16 -DX_OFFSET=8 -DYSize=13 -DY_OFFSET=4 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-vn -lndos -create-app \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_sg1000.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sg1000.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sg1000_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_sg1000_DATA.bin\r\n\r\n\r\n\r\n\r\n\r\nphc25_mono: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc25 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__ -pragma-define:CLIB_DISABLE_MODE2=1 -D__SCREEN_MODE=1 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DX_OFFSET=3 \\\r\n\t-DY_OFFSET=2 \\\r\n\t-DXSize=26 \\\r\n\t-DYSize=20 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS $(PHC25_MONO_GAME_OPTS)  -D__PSG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app "
  },
  {
    "path": "src/games/snake/memory/c16_memory.s",
    "content": "; TAPBUF    $0333-03F2       819-1010   Cassette tape buffer\n; WRLEN     $03F3-03F4      1011-1012   Length of data to be written to tape\n; RDCNT     $03F5-03F6      1013-1014   Length of data to be read from tape\n; INPQUE    $03F7-0436      1015-1078   RS-232 input queue\n; ESTARL    $0437-0454      1079-1108\n; ESTAKH    $0455-0472      1109-1138\n\n; ZP candidates: $D0-$E8 \n\n.export _snake_x;\n_snake_x = $333\n\n.export _snake_y;\n_snake_y = _snake_x + 60 \n\n.export _snake_copy_x;\n_snake_copy_x = _snake_y + 60\n\n.export _snake_copy_y;\n_snake_copy_y = _snake_copy_x + 60\n\n.export _extra_life_achievement;\n_extra_life_achievement = _snake_copy_y + 60\n\n.export _magic_wall_achievement;\n_magic_wall_achievement = _extra_life_achievement + 9\n\n.export _coin_achievement;\n_coin_achievement = _magic_wall_achievement + 9\n\n.export _horizontal_mine_x;\n_horizontal_mine_x = _coin_achievement + 9\n\n.export _horizontal_mine_y;\n_horizontal_mine_y = _horizontal_mine_x + 4\n\n.export _horizontal_mine_direction;\n_horizontal_mine_direction = _horizontal_mine_y + 4\n\n.export _horizontal_mine_transition;\n_horizontal_mine_transition = _horizontal_mine_direction + 4\n\n.export _secret_passage;\n_secret_passage = _horizontal_mine_transition + 4\n\n.export _extra_count;\n_extra_count = $100\n\n.export _third_coin_achievement;\n_third_coin_achievement = _extra_count + 1\n\n.export _fourth_coin_achievement;\n_fourth_coin_achievement = _third_coin_achievement + 1\n\n.export _i;\n_i = _fourth_coin_achievement + 1\n\n.export _j;\n_j = _i + 1\n\n\n.segment \"ZEROPAGE\"\n\n.exportzp _snake_head_x;\n_snake_head_x = 43\n\n.exportzp _snake_head_y;\n_snake_head_y = 44\n\n.exportzp _speed_increase_counter;\n_speed_increase_counter = 45\n\n.exportzp _spawned_apples;\n_spawned_apples = 46\n\n.exportzp _remaining_apples;\n_remaining_apples = 47\n\n.exportzp _level;\n_level = 48\n\n.exportzp _energy;\n_energy = 49\n\n.exportzp _lives;\n_lives = 50\n\n.exportzp _snake_head;\n_snake_head = 51\n\n.exportzp _snake_length;\n_snake_length = 52\n\n.exportzp _snake_direction;\n_snake_direction = 53\n\n.exportzp _apples_on_screen_count;\n_apples_on_screen_count = 54\n\n.exportzp _coin_count;\n_coin_count = 55\n\n.exportzp _extra_life_counter;\n_extra_life_counter = 56\n\n.exportzp _active_mines;\n_active_mines = 57\n\n.exportzp _horizontal_mines_on_current_level;\n_horizontal_mines_on_current_level = 58\n\n.exportzp _vertical_mines_on_current_level;\n_vertical_mines_on_current_level = 59\n\n.exportzp _transparent_vertical_wall_triggered;\n_transparent_vertical_wall_triggered = 60\n\n.exportzp _transparent_horizontal_wall_triggered;\n_transparent_horizontal_wall_triggered = 61\n\n.exportzp _secret_level_active;\n_secret_level_active = 62\n\n.exportzp _secret_level_never_activated;\n_secret_level_never_activated = 63\n\n.exportzp _next_level;\n_next_level = 64\n\n.exportzp _transparent_vertical_wall_level_flag;\n_transparent_vertical_wall_level_flag = 65\n\n.exportzp _transparent_horizontal_wall_level_flag;\n_transparent_horizontal_wall_level_flag = 66\n\n\n.exportzp _head_tile;\n_head_tile = 67;\n\n.exportzp _rings;\n_rings = 69\n\n.export _vertical_mine_x;\n_vertical_mine_x = $D0\n\n.exportzp _vertical_mine_y;\n_vertical_mine_y = $D2\n\n.exportzp _vertical_mine_direction;\n_vertical_mine_direction = $D4\n\n.exportzp _vertical_mine_transition;\n_vertical_mine_transition = $D6\n\n.exportzp _points;\n_points = $D8\n\n.exportzp _slow_down;\n_slow_down = $DA\n\n.exportzp _record;\n_record = $DC\n\n.exportzp _level_bonus;\n_level_bonus = $DE\n\n\n"
  },
  {
    "path": "src/games/snake/memory/creativision_memory.s",
    "content": "\r\n.export _snake_x;\r\n_snake_x = $0100\r\n\r\n.export _snake_y;\r\n_snake_y = _snake_x + 12\r\n\r\n.export _snake_copy_x;\r\n_snake_copy_x = _snake_y + 12\r\n\r\n.export _snake_copy_y;\r\n_snake_copy_y = _snake_copy_x + 12\r\n\r\n.export _extra_life_achievement;\r\n_extra_life_achievement = _snake_copy_y + 12\r\n\r\n.export _magic_wall_achievement;\r\n_magic_wall_achievement = _extra_life_achievement + 9\r\n\r\n.export _coin_achievement;\r\n_coin_achievement = _magic_wall_achievement + 9\r\n\r\n.export _horizontal_mine_x;\r\n_horizontal_mine_x = _coin_achievement + 9\r\n\r\n.export _horizontal_mine_y;\r\n_horizontal_mine_y = _horizontal_mine_x + 4\r\n\r\n.export _horizontal_mine_direction;\r\n_horizontal_mine_direction = _horizontal_mine_y + 4\r\n\r\n.export _horizontal_mine_transition;\r\n_horizontal_mine_transition = _horizontal_mine_direction + 4\r\n\r\n.export _secret_passage;\r\n_secret_passage = _horizontal_mine_transition + 4\r\n\r\n.export _extra_count;\r\n_extra_count = _secret_passage + 32\r\n\r\n.export _third_coin_achievement;\r\n_third_coin_achievement = _extra_count + 1\r\n\r\n.export _fourth_coin_achievement;\r\n_fourth_coin_achievement = _third_coin_achievement + 1\r\n\r\n.export _i;\r\n_i = _fourth_coin_achievement + 1\r\n\r\n.export _j;\r\n_j = _i + 1\r\n\r\n\r\n\r\n.segment \"ZEROPAGE\"\r\n\r\n.exportzp _snake_head_x;\r\n_snake_head_x = $E9\r\n\r\n.exportzp _snake_head_y;\r\n_snake_head_y = $E8\r\n\r\n.exportzp _speed_increase_counter;\r\n_speed_increase_counter = 45\r\n\r\n.exportzp _spawned_apples;\r\n_spawned_apples = $D5\r\n\r\n.exportzp _remaining_apples;\r\n_remaining_apples = $EE\r\n\r\n.exportzp _level;\r\n_level = $EF\r\n\r\n.exportzp _energy;\r\n_energy = $ED\r\n\r\n.exportzp _lives;\r\n_lives = 50\r\n\r\n.exportzp _snake_head;\r\n_snake_head = $EC\r\n\r\n.exportzp _snake_length;\r\n_snake_length = $EB\r\n\r\n.exportzp _snake_direction;\r\n_snake_direction = $EA\r\n\r\n.exportzp _apples_on_screen_count;\r\n_apples_on_screen_count = 54\r\n\r\n.exportzp _coin_count;\r\n_coin_count = $D6\r\n\r\n.exportzp _extra_life_counter;\r\n_extra_life_counter = 56\r\n\r\n.exportzp _active_mines;\r\n_active_mines = $E7\r\n\r\n.exportzp _horizontal_mines_on_current_level;\r\n_horizontal_mines_on_current_level = $E6\r\n\r\n.exportzp _vertical_mines_on_current_level;\r\n_vertical_mines_on_current_level = $E5\r\n\r\n.exportzp _transparent_vertical_wall_triggered;\r\n_transparent_vertical_wall_triggered = $D4\r\n\r\n.exportzp _transparent_horizontal_wall_triggered;\r\n_transparent_horizontal_wall_triggered = $D3\r\n\r\n.exportzp _secret_level_active;\r\n_secret_level_active = 62\r\n\r\n.exportzp _secret_level_never_activated;\r\n_secret_level_never_activated = 63\r\n\r\n.exportzp _next_level;\r\n_next_level = 64\r\n\r\n.exportzp _transparent_vertical_wall_level_flag;\r\n_transparent_vertical_wall_level_flag = 65\r\n\r\n.exportzp _transparent_horizontal_wall_level_flag;\r\n_transparent_horizontal_wall_level_flag = 66\r\n\r\n.exportzp _head_tile;\r\n_head_tile = 67;\r\n\r\n.exportzp _rings;\r\n_rings = $D7\r\n\r\n.export _vertical_mine_x;\r\n_vertical_mine_x = $C1\r\n\r\n.exportzp _vertical_mine_y;\r\n_vertical_mine_y = $C3\r\n\r\n.exportzp _vertical_mine_direction;\r\n_vertical_mine_direction = $C5\r\n\r\n.exportzp _vertical_mine_transition;\r\n_vertical_mine_transition = $C7\r\n\r\n.exportzp _points;\r\n_points = $D8\r\n\r\n.exportzp _slow_down;\r\n_slow_down = $DA\r\n\r\n.exportzp _record;\r\n_record = $DC\r\n\r\n.exportzp _level_bonus;\r\n_level_bonus = $DE\r\n\r\n"
  },
  {
    "path": "src/games/snake/memory/gamate_memory.s",
    "content": "\r\n.export _snake_x;\r\n_snake_x = $0100\r\n\r\n.export _snake_y;\r\n_snake_y = _snake_x + 12\r\n\r\n.export _snake_copy_x;\r\n_snake_copy_x = _snake_y + 12\r\n\r\n.export _snake_copy_y;\r\n_snake_copy_y = _snake_copy_x + 12\r\n\r\n.export _extra_life_achievement;\r\n_extra_life_achievement = _snake_copy_y + 12\r\n\r\n.export _magic_wall_achievement;\r\n_magic_wall_achievement = _extra_life_achievement + 9\r\n\r\n.export _coin_achievement;\r\n_coin_achievement = _magic_wall_achievement + 9\r\n\r\n.export _horizontal_mine_x;\r\n_horizontal_mine_x = _coin_achievement + 9\r\n\r\n.export _horizontal_mine_y;\r\n_horizontal_mine_y = _horizontal_mine_x + 4\r\n\r\n.export _horizontal_mine_direction;\r\n_horizontal_mine_direction = _horizontal_mine_y + 4\r\n\r\n.export _horizontal_mine_transition;\r\n_horizontal_mine_transition = _horizontal_mine_direction + 4\r\n\r\n.export _secret_passage;\r\n_secret_passage = _horizontal_mine_transition + 4\r\n\r\n.export _extra_count;\r\n_extra_count = _secret_passage + 32\r\n\r\n.export _third_coin_achievement;\r\n_third_coin_achievement = _extra_count + 1\r\n\r\n.export _fourth_coin_achievement;\r\n_fourth_coin_achievement = _third_coin_achievement + 1\r\n\r\n.export _i;\r\n_i = _fourth_coin_achievement + 1\r\n\r\n.export _j;\r\n_j = _i + 1\r\n\r\n\r\n\r\n.segment \"ZEROPAGE\"\r\n\r\n.exportzp _snake_head_x;\r\n_snake_head_x = $E9\r\n\r\n.exportzp _snake_head_y;\r\n_snake_head_y = $E8\r\n\r\n.exportzp _speed_increase_counter;\r\n_speed_increase_counter = $B4\r\n\r\n.exportzp _spawned_apples;\r\n_spawned_apples = $B3\r\n\r\n.exportzp _remaining_apples;\r\n_remaining_apples = $B2\r\n\r\n.exportzp _level;\r\n_level = $EF\r\n\r\n.exportzp _energy;\r\n_energy = $ED\r\n\r\n.exportzp _lives;\r\n_lives = $B5\r\n\r\n.exportzp _snake_head;\r\n_snake_head = $EC\r\n\r\n.exportzp _snake_length;\r\n_snake_length = $EB\r\n\r\n.exportzp _snake_direction;\r\n_snake_direction = $EA\r\n\r\n.exportzp _apples_on_screen_count;\r\n_apples_on_screen_count = $B0\r\n\r\n.exportzp _coin_count;\r\n_coin_count = $D6\r\n\r\n.exportzp _extra_life_counter;\r\n_extra_life_counter = $B1\r\n\r\n.exportzp _active_mines;\r\n_active_mines = $E7\r\n\r\n.exportzp _horizontal_mines_on_current_level;\r\n_horizontal_mines_on_current_level = $E6\r\n\r\n.exportzp _vertical_mines_on_current_level;\r\n_vertical_mines_on_current_level = $E5\r\n\r\n.exportzp _transparent_vertical_wall_triggered;\r\n_transparent_vertical_wall_triggered = $D4\r\n\r\n.exportzp _transparent_horizontal_wall_triggered;\r\n_transparent_horizontal_wall_triggered = $D3\r\n\r\n.exportzp _secret_level_active;\r\n_secret_level_active = $B6\r\n\r\n.exportzp _secret_level_never_activated;\r\n_secret_level_never_activated = $B7\r\n\r\n.exportzp _next_level;\r\n_next_level = $B8\r\n\r\n.exportzp _transparent_vertical_wall_level_flag;\r\n_transparent_vertical_wall_level_flag = $B9\r\n\r\n.exportzp _transparent_horizontal_wall_level_flag;\r\n_transparent_horizontal_wall_level_flag = $BA\r\n\r\n.exportzp _head_tile;\r\n_head_tile = 67;\r\n\r\n.exportzp _rings;\r\n_rings = $D7\r\n\r\n.export _vertical_mine_x;\r\n_vertical_mine_x = $C1\r\n\r\n.exportzp _vertical_mine_y;\r\n_vertical_mine_y = $C3\r\n\r\n.exportzp _vertical_mine_direction;\r\n_vertical_mine_direction = $C5\r\n\r\n.exportzp _vertical_mine_transition;\r\n_vertical_mine_transition = $C7\r\n\r\n.exportzp _points;\r\n_points = $D8\r\n\r\n.exportzp _slow_down;\r\n_slow_down = $DA\r\n\r\n.exportzp _record;\r\n_record = $DC\r\n\r\n.exportzp _level_bonus;\r\n_level_bonus = $DE\r\n\r\n"
  },
  {
    "path": "src/games/snake/memory/vic20_memory.s",
    "content": "; $334-$3FF  (820-1023)\n;0334-033B    820-827       ??\n;*033C-03FB   828-1019      Cassette buffer\n\n; $200 - $276 (512-630)\n;*0200-0258  512-600  Basic input buffer\n;*0259-0262  601-610  Logical file table\n;*0263-026C  611-620  Device # table\n;*026D-0276  621-630  Secondary Address table\n.export _snake_x;\n_snake_x = $33C\n\n.export _snake_y;\n_snake_y = _snake_x + 40\n\n.export _snake_copy_x;\n_snake_copy_x = _snake_y + 40\n\n.export _snake_copy_y;\n_snake_copy_y = _snake_copy_x + 40\n\n.export _extra_life_achievement;\n_extra_life_achievement = _snake_copy_y + 40\n\n.export _magic_wall_achievement;\n_magic_wall_achievement =  $200\n\n.export _coin_achievement;\n_coin_achievement = _magic_wall_achievement + 9\n\n.export _horizontal_mine_x;\n_horizontal_mine_x = _coin_achievement + 9\n\n.export _horizontal_mine_y;\n_horizontal_mine_y = _horizontal_mine_x + 4\n\n.export _horizontal_mine_direction;\n_horizontal_mine_direction = _horizontal_mine_y + 4\n\n.export _horizontal_mine_transition;\n_horizontal_mine_transition = _horizontal_mine_direction + 4\n\n.export _secret_passage;\n_secret_passage = _horizontal_mine_transition + 4\n\n.export _extra_count;\n_extra_count = $100\n\n.export _third_coin_achievement;\n_third_coin_achievement = _extra_count + 1\n\n.export _fourth_coin_achievement;\n_fourth_coin_achievement = _third_coin_achievement + 1\n\n.export _i;\n_i = _fourth_coin_achievement + 1\n\n.export _j;\n_j = _i + 1\n\n.segment \"ZEROPAGE\"\n\n.exportzp _snake_head_x;\n_snake_head_x = 43\n\n.exportzp _snake_head_y;\n_snake_head_y = 44\n\n.exportzp _speed_increase_counter;\n_speed_increase_counter = 45\n\n.exportzp _spawned_apples;\n_spawned_apples = 46\n\n.exportzp _remaining_apples;\n_remaining_apples = 47\n\n.exportzp _level;\n_level = 48\n\n.exportzp _energy;\n_energy = 49\n\n.exportzp _lives;\n_lives = 50\n\n.exportzp _snake_head;\n_snake_head = 51\n\n.exportzp _snake_length;\n_snake_length = 52\n\n.exportzp _snake_direction;\n_snake_direction = 53\n\n.exportzp _apples_on_screen_count;\n_apples_on_screen_count = 54\n\n.exportzp _coin_count;\n_coin_count = 55\n\n.exportzp _extra_life_counter;\n_extra_life_counter = 56\n\n.exportzp _active_mines;\n_active_mines = 57\n\n.exportzp _horizontal_mines_on_current_level;\n_horizontal_mines_on_current_level = 58\n\n.exportzp _vertical_mines_on_current_level;\n_vertical_mines_on_current_level = 59\n\n.exportzp _transparent_vertical_wall_triggered;\n_transparent_vertical_wall_triggered = 60\n\n.exportzp _transparent_horizontal_wall_triggered;\n_transparent_horizontal_wall_triggered = 61\n\n.exportzp _secret_level_active;\n_secret_level_active = 62\n\n.exportzp _secret_level_never_activated;\n_secret_level_never_activated = 63\n\n.exportzp _next_level;\n_next_level = 64\n\n.exportzp _transparent_vertical_wall_level_flag;\n_transparent_vertical_wall_level_flag = 65\n\n.exportzp _transparent_horizontal_wall_level_flag;\n_transparent_horizontal_wall_level_flag = 66\n\n.exportzp _head_tile;\n_head_tile = 67;\n\n\n\n.export _vertical_mine_x;\n_vertical_mine_x = 69\n\n.exportzp _vertical_mine_y;\n_vertical_mine_y = 71\n\n.exportzp _vertical_mine_direction;\n_vertical_mine_direction = 73\n\n.exportzp _vertical_mine_transition;\n_vertical_mine_transition = 75\n\n.exportzp _points;\n_points = 77\n\n.exportzp _slow_down;\n_slow_down = 79\n\n.exportzp _record;\n_record = 81\n\n.exportzp _level_bonus;\n_level_bonus = 83\n\n\n.exportzp _rings;\n_rings = 85\n"
  },
  {
    "path": "src/games/snake/move_snake.h",
    "content": "#ifndef _MOVE_SNAKE_H\r\n#define _MOVE_SNAKE_H\r\n\r\n#include \"init_images.h\"\r\n\r\n#define SNAKE_UP 0\r\n#define SNAKE_DOWN 1\r\n#define SNAKE_LEFT 2\r\n#define SNAKE_RIGHT 3\r\n\r\n#define HORIZONTAL(movement) ((movement)>SNAKE_DOWN)\r\n#define VERTICAL(movement) ((movement)<SNAKE_LEFT)\r\n\r\n#define hits_wall(x,y) \\\r\n    (map[x][y]>=WALL)\r\n\r\n#define hits_deadly_item(x,y) \\\r\n    (map[x][y]==DEADLY)\r\n\r\nuint8_t move_snake(uint8_t wished_direction);\r\n\r\n#endif // _MOVE_SNAKE_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/settings.h",
    "content": "#ifndef _SETTINGS_H\r\n#define _SETTINGS_H\r\n\r\n\r\n#define INITIAL_LEVEL 1\r\n// #define DEBUG_LEVELS\r\n// #define DEBUG_SLOWDOWN\r\n// #define DEBUG_APPLES\r\n// #define DEBUG_ACHIEVEMENTS\r\n// #define NO_EXTRA_TITLE\r\n// #define DEBUG_FREEZE\r\n// #define NO_ACHIEVEMENTS_SCREEN\r\n// #define NO_DISPLAY_LEVEL_ANIMATION\r\n// #define DEBUG_SECRET_HOLE\r\n\r\n#define FINAL_LEVEL 32\r\n\r\n#define INITIAL_LIVES       5U\r\n\r\n#if XSize>27\r\n    #define INITIAL_SNAKE_LENGTH (XSize/7)\r\n#else\r\n    #define INITIAL_SNAKE_LENGTH (XSize/5)\r\n#endif\r\n\r\n#define EXTRA_POINTS        5U\r\n#define RING_POINTS        10U\r\n#define APPLE_POINTS       20U\r\n#define SUPER_RING_POINTS  50U\r\n\r\n#define EXTRA_LIFE_THRESHOLD 5000U\r\n\r\n#define INITIAL_APPLE_COUNT 10U\r\n\r\n#define APPLE_COUNT_INCREASE 2U\r\n\r\n#define SOME_EXTRA 10\r\n#define MANY_EXTRA (15+(XSize)+(XSize)/2)\r\n\r\n// #if XSize<=40\r\n    // #define SPEED_INCREASE_THRESHOLD 18U\r\n// #else\r\n    // #define SPEED_INCREASE_THRESHOLD 25U\r\n// #endif\r\n\r\n#if XSize<=40\r\n    #define SPEED_INCREASE_THRESHOLD 7U\r\n#else\r\n    #define SPEED_INCREASE_THRESHOLD 10U\r\n#endif\r\n\r\n\r\n#define SPAWNED_APPLE_START 2U\r\n\r\n#define EXTRA_RING_SPAWN_THRESHOLD 7U\r\n\r\n// BONUS/SECRET LEVELS THRESHOLD\r\n#define MAGIC_WALL_THRESHOLD 12\r\n#define RING_THRESHOLD ((MAGIC_WALL_THRESHOLD)+((XSize)/3)+15)\r\n#define EXTRA_1UP_THRESHOLD ((RING_THRESHOLD)+15+((XSize)/3))\r\n\r\n#define TRANSPARENT_TRIGGER 20\r\n\r\n#define FEW_MINES_SLOWDOWN ((_XL_SLOW_DOWN_FACTOR)/8)\r\n\r\n#define MAX_APPLES 24\r\n\r\n// This is to accout for extra length gained by eating extra points ($)\r\n#define EXTRA_LENGTH 4\r\n\r\n#if !defined(MAX_SNAKE_LENGTH)\r\n    #define MAX_SNAKE_LENGTH ((XSize)-2+(YSize)-2-1)\r\n    \r\n    //((XSize/2)+((NUMBER_OF_MAPS-1)/4)+(MAX_APPLES)+((MAX_APPLES)/8)+EXTRA_LENGTH)\r\n#endif\r\n\r\n#define MAX_NUMBER_OF_HORIZONTAL_MINES 4\r\n#define MAX_NUMBER_OF_VERTICAL_MINES 2\r\n\r\n#define NUMBER_OF_MAPS 16\r\n\r\n#define NUMBER_OF_STRINGS 5\r\n\r\n#define MAX_STRING_SIZE (6+1)\r\n\r\n#define EMPTY 0\r\n#define DEADLY 1\r\n#define SUPER_RING 2\r\n#define RING 3\r\n#define EXTRA 4\r\n#define APPLE 5\r\n#define EXTRA_LIFE 6\r\n#define SECRET 7\r\n#define WALL  8\r\n#define HORIZONTAL_WALL 9\r\n#define VERTICAL_WALL 10\r\n#define TRANSPARENT 11\r\n\r\n\r\n#endif // _SETTINGS_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/shapes/6x8/shape25.txt",
    "content": "......\n......\n......\n..##..\n.##.#.\n####.#\n.##.#.\n..##..\n"
  },
  {
    "path": "src/games/snake/shapes/6x9/shape25.txt",
    "content": "......\n......\n......\n......\n..##..\n.##.#.\n####.#\n.##.#.\n..##.."
  },
  {
    "path": "src/games/snake/shapes/7x8/shape25.txt",
    "content": ".......\n.......\n.......\n...##..\n..##.#.\n.####.#\n..##.#.\n...##..\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape0.txt",
    "content": "..####..\r\n.######.\r\n##.##.##\r\n##.##.##\r\n.######.\r\n..####.."
  },
  {
    "path": "src/games/snake/shapes/8x6/shape1.txt",
    "content": "..####..\r\n.##..##.\r\n########\r\n########\r\n.##..##.\r\n..####.."
  },
  {
    "path": "src/games/snake/shapes/8x6/shape10.txt",
    "content": "#.#.#.#.\r\n........\r\n#.#.#.#.\r\n........\r\n#.#.#.#.\r\n........\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape11.txt",
    "content": "........\r\n........\r\n........\r\n....#...\r\n..####..\r\n##...#..\r\n\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape12.txt",
    "content": ".#.##.#.\r\n.######.\r\n.#.##.#.\r\n.######.\r\n.#.##.#.\r\n.######.\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape13.txt",
    "content": "########\r\n#.#.#.#.\r\n########\r\n#.#.#.#.\r\n########\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape15.txt",
    "content": "..#...##\r\n..####..\r\n...#....\r\n........\r\n........\r\n........"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape17.txt",
    "content": "...#....\r\n..#.##..\r\n..#...##\r\n##...#..\r\n..##.#..\r\n....#...\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape18.txt",
    "content": "..####..\r\n.##..##.\r\n##.##.##\r\n##.##.##\r\n.##..##.\r\n..####..\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape2.txt",
    "content": "........\r\n......##\r\n....##..\r\n......#.\r\n......##\r\n.......#\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape25.txt",
    "content": "........\n...#....\n..#.#...\n.###.#..\n..#.#...\n...#....\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape3.txt",
    "content": "#.......\r\n##......\r\n.#......\r\n..##....\r\n##......\r\n........\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape4.txt",
    "content": "..####..\r\n.######.\r\n########\r\n########\r\n.######.\r\n..####..\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape5.txt",
    "content": "..##....\r\n....#...\r\n.######.\r\n#####.##\r\n#####.##\r\n.######.\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape7.txt",
    "content": "#.#.#.#.\r\n########\r\n#.#.#.#.\r\n########\r\n#.#.#.#.\r\n########\r\n"
  },
  {
    "path": "src/games/snake/shapes/8x6/shape8.txt",
    "content": "..####..\r\n.##..##.\r\n##....##\r\n##....##\r\n.##..##.\r\n..####.."
  },
  {
    "path": "src/games/snake/shapes/8x8/shape25.txt",
    "content": "........\r\n........\r\n........\r\n...##...\r\n..##.#..\r\n.####.#.\r\n..##.#..\r\n...##..."
  },
  {
    "path": "src/games/snake/snake.h",
    "content": "#ifndef _SNAKE_H\r\n#define _SNAKE_H\r\n\r\n\r\n#include \"cross_lib.h\"\r\n#include \"settings.h\"\r\n\r\n\r\nvoid draw_head(void);\r\n\r\nvoid draw_body_part(uint8_t i);\r\n\r\nvoid delete_body_part(uint8_t i);\r\n\r\nvoid draw_snake(void);\r\n\r\nvoid init_snake(void);\r\n\r\nvoid init_map(void);\r\n\r\n#if !defined(NO_GROWTH)\r\n    void snake_grows(void);\r\n#else\r\n    #define snake_grows()\r\n#endif\r\n\r\n#endif // _SNAKE_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/split_files/control_player.c",
    "content": "#include \"cross_lib.h\"\r\n#include \"snake.h\"\r\n#include \"move_snake.h\"\r\n\r\n#include \"settings.h\"\r\n\r\n#include \"variables.h\"\r\n\r\n\r\nuint8_t _MOVE_PLAYER(uint8_t control_input)\r\n{\r\n    if(_XL_LEFT(control_input) && (snake_direction != SNAKE_RIGHT))\r\n    {\r\n        return move_snake(SNAKE_LEFT);\r\n    }\r\n    else if(_XL_RIGHT(control_input) && (snake_direction != SNAKE_LEFT))\r\n    {\r\n        return move_snake(SNAKE_RIGHT);\r\n    }\r\n    else if(_XL_UP(control_input) && (snake_direction != SNAKE_DOWN))\r\n    {\r\n        return move_snake(SNAKE_UP);\r\n    }\r\n    else if(_XL_DOWN(control_input) && (snake_direction != SNAKE_UP))\r\n    {\r\n        return move_snake(SNAKE_DOWN);\r\n    }\r\n    else\r\n    {\r\n        return move_snake(snake_direction);\r\n    }\r\n}\r\n\r\nuint8_t MOVE_PLAYER(void)\r\n{\r\n    return _MOVE_PLAYER(_XL_INPUT());\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/snake/split_files/game_text.c",
    "content": "\r\n#include \"cross_lib.h\"\r\n#include \"game_text.h\"\r\n\r\n#include \"variables.h\"\r\n\r\n#include \"init_images.h\"\r\n\r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n\r\n\r\n#if !defined(NO_DISPLAY_RINGS) \r\nvoid DISPLAY_RINGS(void)\r\n{\r\n    _XL_DRAW(ACHIEVEMENTS_X_OFFSET+3, ACHIEVEMENTS_Y_OFFSET+3, RING_TILE, _XL_WHITE); \r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(ACHIEVEMENTS_X_OFFSET+5,ACHIEVEMENTS_Y_OFFSET+3,3,rings);\r\n}\r\n#endif\r\n\r\n#if !defined(NO_EXTRA_TITLE)\r\nconst char strings[NUMBER_OF_STRINGS][MAX_STRING_SIZE] = \r\n{\r\n    _XL_M _XL_i _XL_n _XL_e,\r\n    _XL_E _XL_n _XL_e _XL_r _XL_g _XL_y,\r\n    _XL_B _XL_o _XL_n _XL_u _XL_s,\r\n    _XL_P _XL_o _XL_i _XL_n _XL_t _XL_s,\r\n    _XL_A _XL_p _XL_p _XL_l _XL_e,\r\n};\r\n#endif\r\n\r\nvoid show_intro_snake(void)\r\n{\r\n    for(i=0;i<XSize/2-2;++i)\r\n    {\r\n        _XL_DRAW(XSize/4+i,YSize/8+SNAKE_LINE_OFFSET,BODY_TILE, _XL_GREEN);\r\n        \r\n    }\r\n    _XL_DRAW(XSize/4+XSize/2-2,YSize/8+SNAKE_LINE_OFFSET,HORIZONTAL_HEAD_TILE, _XL_GREEN);\r\n\r\n}\r\n\r\n\r\nvoid DISPLAY_ENERGY(void)\r\n{\r\n   if(energy<RED_ENERGY_THRESHOLD)\r\n   {\r\n       _XL_SET_TEXT_COLOR(_XL_RED);\r\n   }\r\n   else\r\n   {\r\n       _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n   }\r\n   _XL_PRINTD(XSize/2-1,YSize-1,2,energy); \r\n}\r\n\r\nvoid PRESS_KEY(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    PRINT_CENTERED_ON_ROW(YSize-2, _PRESS_FIRE_STRING);\r\n    _XL_WAIT_FOR_INPUT();\r\n}\r\n\r\n#if defined(_XL_ARROW_KEYS)\r\n    #define CONTROLS_STRING _XL_U _XL_S _XL_E _XL_SPACE \"ARROWS\"\r\n\t#define CONTROLS_LEN 10\r\n#elif defined(_XL_NO_JOYSTICK)\r\n    #define CONTROLS_STRING _XL_U _XL_S _XL_E _XL_SPACE _XL_UP_KEY _XL_LEFT_KEY _XL_DOWN_KEY _XL_RIGHT_KEY _XL_SPACE _XL_S _XL_P _XL_A _XL_C _XL_E\r\n\t#define CONTROLS_LEN 14\r\n#else\r\n    #define CONTROLS_STRING _XL_U _XL_S _XL_E _XL_SPACE _XL_J _XL_O _XL_Y _XL_S _XL_T _XL_I _XL_C _XL_K\r\n\t#define CONTROLS_LEN 12\r\n#endif\r\n\r\n#define CONTROLS_Y (YSize-2)\r\n\r\n#if defined(NO_CONTROL_INSTRUCTIONS) && XSize>=14\r\n\r\n    #define CONTROL_INSTRUCTIONS()\r\n#else\r\n    void CONTROL_INSTRUCTIONS(void)\r\n        {\r\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n            PRINT_CENTERED_ON_ROW(CONTROLS_Y, CONTROLS_STRING);\r\n            _XL_WAIT_FOR_INPUT();\r\n        }\r\n#endif\r\n\r\nvoid DISPLAY_POINTS(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(2,0,5,points);\r\n}\r\n\r\nvoid DISPLAY_REMAINING_APPLES_COUNT(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(9,0,2,remaining_apples);\r\n}\r\n\r\nvoid DISPLAY_LIVES(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(XSize-1,0,1,lives);\r\n}\r\n\r\n"
  },
  {
    "path": "src/games/snake/split_files/main.c",
    "content": "\n/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#include \"init_images.h\"\n#include \"snake.h\"\n#include \"move_snake.h\"\n#include \"control_player.h\"\n#include \"game_text.h\"\n#include \"levels.h\"\n#include \"settings.h\"\n#include \"variables.h\"\n\n/*\n#define EMPTY 0\n#define DEADLY 1\n#define SUPER_RING 2\n#define RING 3\n#define EXTRA 4\n#define APPLE 5\n#define EXTRA_LIFE 6\n#define WALL  7\n#define HORIZONTAL_WALL 8\n#define VERTICAL_WALL 9\n#define TRANSPARENT 10\n\n*/\n\n\n#if XSize<22\n    #define SECRET_X 3\n#else\n    #define SECRET_X 4\n#endif\n\n#if !defined(NO_SECRET_ANIMATION)\n    void display_secret_string(void)\n    {\n        _XL_PRINT(SECRET_X,YSize-1,_SECRET_STRING);\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n    }\n\n    void set_secret(uint8_t *secret_ptr)\n    {   \n        if(!(*secret_ptr))\n        {            \n            (*secret_ptr)=1;\n            \n            _XL_EXPLOSION_SOUND();\n\n            for(i=0;i<5;++i)\n            {\n                #if defined(_XL_NO_TEXT_COLOR)\n                _XL_PRINT(SECRET_X,YSize-1,\"      \");\n                _XL_SLOW_DOWN(10);\n                #else\n                _XL_SET_TEXT_COLOR(_XL_YELLOW);\n                display_secret_string();\n                #endif\n\n                _XL_SET_TEXT_COLOR(_XL_CYAN);\n                display_secret_string();\n            }\n        }\n    }\n#else\n    void set_secret(uint8_t *secret_ptr)\n    {\n        if(!(*secret_ptr))\n        {\n            (*secret_ptr)=1;\n            _XL_SET_TEXT_COLOR(_XL_CYAN);\n            _XL_PRINT(SECRET_X,YSize-1,_SECRET_STRING);\n            _XL_SHOOT_SOUND();\n        }\n    }  \n#endif\n\n\n\nstatic const uint8_t images[] = {\n    0, \n    MINE_TILE, \n    SUPER_RING_TILE, \n    RING_TILE, \n    EXTRA_TILE, \n    APPLE_TILE,\n    VERTICAL_HEAD_TILE,\n    0,\n    CENTRAL_BRICK_TILE, \n    HORIZONTAL_BRICK_TILE, \n    VERTICAL_BRICK_TILE, \n    TRANSPARENT_BRICK_TILE,\n    };\n\n#if !defined(_XL_NO_COLOR)\nstatic const uint8_t image_colors[] = {\n    0, \n    _XL_CYAN, \n    _XL_CYAN, \n    _XL_WHITE, \n    _XL_CYAN, \n    _XL_RED,\n    _XL_GREEN,\n    0,\n    _XL_YELLOW, \n    _XL_YELLOW, \n    _XL_YELLOW, \n    _XL_YELLOW,\n    };\n\n#endif\n\n#define transparent_vertical_wall_level()   (((level&15)==3)||((level&15)==6)||((level&15)==9)||((level&15)==14))\n#define transparent_horizontal_wall_level() (((level&15)==2)||((level&15)==4)||((level&15)==7)||((level&15)== 8)||((level&15)==12)||(!level))\n\n\n#define hits_coin(x,y) \\\n    (map[x][y]==RING)\n\n#define hits_secret(x,y) \\\n    (map[x][y]==SECRET)\n\n#define hits_super_coin(x,y) \\\n    (map[x][y]==SUPER_RING)\n\n#define hits_apple(x,y) \\\n    (map[x][y]==APPLE)\n    \n#define hits_extra_points(x,y) \\\n    (map[x][y]==EXTRA)\n\n#define hits_extra_life(x,y) \\\n    (map[x][y]==EXTRA_LIFE)\n\n#define IF_POSSIBLE_INCREASE_SPEED() \\\n    do \\\n    { \\\n        if(slow_down>(2*_XL_SLOW_DOWN_FACTOR/3)) \\\n        { \\\n            slow_down -= 1 + (_XL_SLOW_DOWN_FACTOR/16); \\\n        } \\\n        else \\\n        { \\\n           --energy; \\\n           DISPLAY_ENERGY(); \\\n        } \\\n    } \\\n    while(0)\n\n\n#define IF_POSSIBLE_DECREASE_SPEED() \\\n    do \\\n    { \\\n        if(slow_down<_XL_SLOW_DOWN_FACTOR) \\\n        { \\\n            slow_down += _XL_SLOW_DOWN_FACTOR/5; \\\n        } \\\n        speed_increase_counter=0; \\\n    } while(0)\n    \n\n// TODO: Maybe only horizontal and vertical checks are necessary\n#define safe_around(i,j) \\\n    (!map[i][j] && \\\n       (map[i][(j)-1]!=DEADLY) && (map[(i)-1][j]!=DEADLY) && (map[(i)+1][j]!=DEADLY) && (map[i][(j)+1]!=DEADLY))\n\n\nvoid spawn(uint8_t type)\n{\n    _XL_PING_SOUND();\n    while(1)\n    {\n        i = (uint8_t)(_XL_RAND()%(XSize-2)+1);\n        j = (uint8_t)(_XL_RAND()%(YSize-2)+1);\n        \n        if(safe_around(i,j))\n        {\n            break;\n        }\n    }\n    map[i][j]=type;\n    \n    #if !defined(_XL_NO_COLOR)\n    _XL_DRAW(i,j,images[type],image_colors[type]);\n    #else\n    _XL_DRAW(i,j,images[type],0);\n    #endif\n\n}\n\n\nvoid build_box_wall(uint8_t x, uint8_t y, uint8_t x_length, uint8_t y_length, uint8_t type)\n{   \n    for(i=0;i<x_length;++i)\n    {\n        for(j=0;j<y_length;++j)\n        {\n            map[x+i][y+j]=type;\n            if(type)\n            {\n                #if !defined(_XL_NO_COLOR)\n                _XL_DRAW(x+i,y+j,images[type],image_colors[type]);\n                #else\n                _XL_DRAW(x+i,y+j,images[type],0);\n                #endif\n            }\n            else\n            {\n                _XL_DELETE(x+i,y+j);\n            }\n        }\n    }\n}\n\n#define build_horizontal_wall(x,y,length) \\\n    build_box_wall(x, y, length, 1, HORIZONTAL_WALL)\n\n#define build_vertical_wall(x,y,length) \\\n    build_box_wall(x, y, 1, length, VERTICAL_WALL)\n\nvoid DRAW_MAP_BORDERS(void)\n{\n    build_horizontal_wall(0,0,XSize);\n    build_horizontal_wall(0,YSize-1,XSize);\n    build_vertical_wall(0,0,YSize);\n    build_vertical_wall(XSize-1,0,YSize);\n}\n\n#include \"variables.h\"\n\n#define MINE_RIGHT 0\n#define MINE_LEFT 1\n#define MINE_UP 0\n#define MINE_DOWN 1\n\n\n#define TRANSPARENT_VERTICAL_WALL_LENGTH (YSize - 2*(YSize/4) - 4)\n#define TRANSPARENT_VERTICAL_WALL_X ((XSize)/2)\n#define TRANSPARENT_VERTICAL_WALL_Y (((YSize)/4)+2)\n\n#if XSize<=16\n    #define TRANSPARENT_HORIZONTAL_WALL_LENGTH 2\n#else\n    #define TRANSPARENT_HORIZONTAL_WALL_LENGTH ((XSize)/5)\n#endif\n#define TRANSPARENT_HORIZONTAL_WALL_X (((XSize)/2)-((TRANSPARENT_HORIZONTAL_WALL_LENGTH)/2))\n#define TRANSPARENT_HORIZONTAL_WALL_Y (((YSize)/2))\n\nvoid DRAW_MINE(uint8_t x, uint8_t y)\n{\n    _XL_DRAW(x,y,MINE_TILE, _XL_CYAN);\n    map[x][y] = DEADLY;\n}\n\nvoid build_horizontal_mines(uint8_t level)\n{\n    i = horizontal_mines_on_level_index[level];\n    \n    horizontal_mines_on_current_level = horizontal_mines_on_level[i];\n    \n    ++i;\n    #if defined(DEBUG_LEVELS)\n        _XL_PRINTD(4,4,1,horizontal_mines_on_current_level);\n    #endif\n    for(j=0;j<horizontal_mines_on_current_level;++j)\n    {\n        horizontal_mine_x[j] = XSize/2;\n        horizontal_mine_y[j] = horizontal_mines_on_level[i+j];\n        DRAW_MINE(XSize/2,horizontal_mine_y[j]);\n        horizontal_mine_direction[j] = j&1;\n        horizontal_mine_transition[j] = 0;\n    }\n}\n\nvoid build_vertical_mines(uint8_t level)\n{\n    i = vertical_mines_on_level_index[level];\n    \n    vertical_mines_on_current_level = vertical_mines_on_level[i];\n    \n    #if defined(DEBUG_LEVELS)\n        _XL_PRINTD(4,8,1,vertical_mines_on_current_level);\n    #endif\n    ++i;\n    for(j=0;j<vertical_mines_on_current_level;++j)\n    {\n        vertical_mine_y[j] = YSize/2-1;\n        vertical_mine_x[j] = vertical_mines_on_level[i+j];\n        DRAW_MINE(vertical_mine_x[j],YSize/2-1);\n        vertical_mine_direction[j] = j&1;\n        vertical_mine_transition[j] = 0;\n    }\n}\n\n\nvoid init_map_to_empty(void)\n{\n    for(i=0;i<XSize;++i)\n    {\n        for(j=0;j<YSize;++j)\n        {\n            map[i][j]=EMPTY;\n        }\n    }\n}\n\n\nvoid build_level(void)\n{\n    register uint8_t index;\n    uint8_t i;\n    uint8_t number_of_elements;\n    uint8_t j;\n    uint8_t x;\n    uint8_t y;\n    uint8_t length;\n    uint8_t wall_index;\n    uint8_t secret_wall_index;\n    \n    init_map_to_empty();\n    _XL_CLEAR_SCREEN();\n    index = map_walls_index[level-((level>16)<<4)];\n    \n    for(j=0;j<2;++j)\n    {\n        number_of_elements = map_walls[index]; // Number of horizontal walls\n        \n        if(number_of_elements)\n        {\n            secret_wall_index = (uint8_t) (_XL_RAND()%(number_of_elements));\n            for(i=1, wall_index=0;i<3*number_of_elements;i+=3,++wall_index)\n            {\n                x=map_walls[index+i];\n                y=map_walls[index+1+i];\n                length=map_walls[index+2+i];\n                if(j)\n                {\n                    build_vertical_wall(x,y,length);\n                }\n                else\n                {\n                    build_horizontal_wall(x,y,length);\n                    if(secret_wall_index==wall_index)\n                    {\n                        #if defined(DEBUG_SECRET_HOLE)\n                        {\n                            \n                            // uint8_t k = x+1+_XL_RAND()%(length-2);\n                            // map[k][y] = SECRET;\n                            // _XL_DRAW(k,y,CENTRAL_BRICK_TILE, _XL_YELLOW);\n                            uint8_t k;\n                            for(k=0;k<length;++k)\n                            {\n                                _XL_DRAW(x+1+k%(length-2),y,CENTRAL_BRICK_TILE, _XL_YELLOW);\n                            }\n                        }\n                        #endif\n                        // #else\n                        map[x+1+_XL_RAND()%(length-2)][y] = SECRET;\n                        // #endif\n                    }\n                }\n            }\n        }\n        index += number_of_elements*3+1;\n    }\n    \n    number_of_elements = map_walls[index];\n    ++index;\n    for(j=0;j<5*number_of_elements;j+=5,index+=5)\n    {\n        build_box_wall(map_walls[index],map_walls[1u+index],\n                       map_walls[2u+index],map_walls[3u+index],\n                       map_walls[4u+index]);\n    }\n    \n    #if defined(REPEAT_MINES)\n    if(level>16)\n    {\n        level-=16;\n    }\n    #endif\n    build_horizontal_mines(level%16);\n    build_vertical_mines(level%16);\n    \n}\n\nvoid display_horizontal_transition_mine(uint8_t x, uint8_t y)\n{\n    _XL_DRAW(x-1,y,LEFT_MINE_TILE, _XL_CYAN);\n    _XL_DRAW(x,y,RIGHT_MINE_TILE, _XL_CYAN);\n}\n\nvoid handle_horizontal_mine(register uint8_t index)\n{\n    register uint8_t x = horizontal_mine_x[index];\n    register uint8_t y = horizontal_mine_y[index];\n    \n    if(horizontal_mine_direction[index]==MINE_LEFT)\n    {\n        \n        if(!horizontal_mine_transition[index]) // transition not performed, yet\n        {\n            if(!map[x-1][y])\n            {\n                // Do left transition\n                display_horizontal_transition_mine(x,y);\n                map[x-1][y]=DEADLY;\n                ++horizontal_mine_transition[index];\n            }\n            else\n            {\n                horizontal_mine_direction[index]=MINE_RIGHT;\n            }\n        }\n        else // transition already performed\n        {\n            horizontal_mine_transition[index]=0;\n            map[x][y]=EMPTY;\n            _XL_DELETE(x,y);\n            --horizontal_mine_x[index];\n            DRAW_MINE(horizontal_mine_x[index],y);\n        }\n    }\n    else // direction is RIGHT\n    {\n        if(!horizontal_mine_transition[index]) // transition not performed, yet\n        {\n            if(!map[x+1][y])\n            {\n                // Do right transition\n                display_horizontal_transition_mine(x+1,y);\n                map[x+1][y]=DEADLY;\n                ++horizontal_mine_transition[index];\n            }\n            else\n            {\n                horizontal_mine_direction[index]=MINE_LEFT;\n            }\n        }\n        else // transition already performed\n        {\n            horizontal_mine_transition[index]=0;\n            map[x][y]=EMPTY;\n            _XL_DELETE(x,y);\n            ++horizontal_mine_x[index];\n            DRAW_MINE(horizontal_mine_x[index],y);\n        }\n    }\n}\n\n\nvoid handle_horizontal_mines(void)\n{\n    for(i=0;i<horizontal_mines_on_current_level;++i)\n    {\n        handle_horizontal_mine(i);\n    }\n}\n\n\nvoid display_vertical_transition_mine(uint8_t x, uint8_t y)\n{\n    _XL_DRAW(x,y-1,UP_MINE_TILE,_XL_CYAN);\n    _XL_DRAW(x,y,DOWN_MINE_TILE,_XL_CYAN);\n}\n\n\nvoid handle_vertical_mine(register uint8_t index)\n{\n    register uint8_t x = vertical_mine_x[index];\n    register uint8_t y = vertical_mine_y[index];\n    \n    if(vertical_mine_direction[index]==MINE_UP)\n    {\n        \n        if(!vertical_mine_transition[index]) // transition not performed, yet\n        {\n            if(!map[x][y-1])\n            {\n                // Do up transition\n                display_vertical_transition_mine(x,y);\n                map[x][y-1]=DEADLY;\n                ++vertical_mine_transition[index];\n            }\n            else\n            {\n                vertical_mine_direction[index]=MINE_DOWN;\n            }\n        }\n        else // transition already performed\n        {\n            vertical_mine_transition[index]=0;\n            map[x][y]=EMPTY;\n            _XL_DELETE(x,y);\n            --vertical_mine_y[index];\n            DRAW_MINE(x,vertical_mine_y[index]);\n        }\n    }\n    else // direction is DOWN\n    {\n        if(!vertical_mine_transition[index]) // transition not performed, yet\n        {\n            if(!map[x][y+1])\n            {\n                // Do right transition\n                display_vertical_transition_mine(x,y+1);\n                map[x][y+1]=DEADLY;\n                ++vertical_mine_transition[index];\n            }\n            else\n            {\n                vertical_mine_direction[index]=MINE_UP;\n            }\n        }\n        else // transition already performed\n        {\n            vertical_mine_transition[index]=0;\n            map[x][y]=EMPTY;\n            _XL_DELETE(x,y);\n            ++vertical_mine_y[index];\n            DRAW_MINE(x,vertical_mine_y[index]);\n        }\n    }\n}\n\n\nvoid handle_vertical_mines(void)\n{\n    for(i=0;i<vertical_mines_on_current_level;++i)\n    {\n        handle_vertical_mine(i);\n    }\n}\n\n\nuint8_t empty_vertical_wall_area(void)\n{\n    i = 0;\n    \n    while(i<TRANSPARENT_VERTICAL_WALL_LENGTH)\n    {\n        if(map[TRANSPARENT_VERTICAL_WALL_X][TRANSPARENT_VERTICAL_WALL_Y+i])\n        {\n            return 0;\n        }\n        ++i;\n    }\n    return (TRANSPARENT_VERTICAL_WALL_X!=snake_head_x)||\n           !((snake_head_y>=TRANSPARENT_VERTICAL_WALL_Y)&&(snake_head_y<=TRANSPARENT_VERTICAL_WALL_Y+TRANSPARENT_VERTICAL_WALL_LENGTH-1));\n}\n\n\nuint8_t empty_horizontal_wall_area(void)\n{\n    i = 0;\n    \n    while(i<TRANSPARENT_HORIZONTAL_WALL_LENGTH)\n    {\n        if(map[TRANSPARENT_HORIZONTAL_WALL_X+i][TRANSPARENT_HORIZONTAL_WALL_Y])\n        {\n            return 0;\n        }\n        ++i;\n    }\n    return (TRANSPARENT_HORIZONTAL_WALL_Y!=snake_head_y)||\n           !((snake_head_x>=TRANSPARENT_HORIZONTAL_WALL_X)&&(snake_head_x<=TRANSPARENT_HORIZONTAL_WALL_X+TRANSPARENT_HORIZONTAL_WALL_LENGTH-1));\n}\n\n\nvoid handle_transparent_vertical_wall(void)\n{   \n    if(!transparent_vertical_wall_triggered)\n    {\n        if(empty_vertical_wall_area())\n        {\n            _XL_TOCK_SOUND();\n            transparent_vertical_wall_triggered = TRANSPARENT;\n        }\n        else\n        {\n            return;\n        }\n    }\n    else\n    {   \n        transparent_vertical_wall_triggered = EMPTY;\n    }\n    build_box_wall(TRANSPARENT_VERTICAL_WALL_X,TRANSPARENT_VERTICAL_WALL_Y,1,TRANSPARENT_VERTICAL_WALL_LENGTH,transparent_vertical_wall_triggered);\n}\n\nvoid handle_transparent_horizontal_wall(void)\n{\n    if(!transparent_horizontal_wall_triggered)\n    {\n        if(empty_horizontal_wall_area())\n        {\n            _XL_TOCK_SOUND();\n            transparent_horizontal_wall_triggered = TRANSPARENT;\n        }\n        else\n        {\n            return;\n        }\n    }\n    else\n    {   \n        transparent_horizontal_wall_triggered = EMPTY;\n    }\n    build_box_wall(TRANSPARENT_HORIZONTAL_WALL_X,TRANSPARENT_HORIZONTAL_WALL_Y,TRANSPARENT_HORIZONTAL_WALL_LENGTH,1,transparent_horizontal_wall_triggered);\n\n}\n\n\n#define handle_transparent_walls() \\\n    if(transparent_vertical_wall_level_flag) \\\n    { \\\n        handle_transparent_vertical_wall(); \\\n    } \\\n    if(transparent_horizontal_wall_level_flag) \\\n    { \\\n        handle_transparent_horizontal_wall(); \\\n    }\n\n#if INITIAL_LEVEL!=1\n    #if INITIAL_LEVEL<8\n        #define initialize_remaining_apples() \\\n            remaining_apples = INITIAL_APPLE_COUNT + level * APPLE_COUNT_INCREASE;\n    #else\n        #define initialize_remaining_apples() \\\n            remaining_apples = MAX_APPLES;\n    #endif\n#else\n    #define initialize_remaining_apples() \\\n        remaining_apples = INITIAL_APPLE_COUNT+1*APPLE_COUNT_INCREASE;\n#endif\n\n\n#define initialize_variables() \\\n    extra_life_counter = 1; \\\n    points = 0; \\\n    rings = 0; \\\n    lives = INITIAL_LIVES; \\\n    level = INITIAL_LEVEL; \\\n    secret_level_never_activated = 1; \\\n    for(i=0;i<9;++i) \\\n    { \\\n        extra_life_achievement[i] = 0; \\\n        coin_achievement[i] = 0; \\\n        magic_wall_achievement[i] = 0; \\\n    } \\\n    for(i=0;i<32;++i) \\\n    { \\\n        secret_passage[i] = 0; \\\n    } \\\n    third_coin_achievement = 0; \\\n    fourth_coin_achievement = 0; \\\n    initialize_remaining_apples();\n\n\n#define DISPLAY_LEVEL_SCREEN() \\\n    _XL_CLEAR_SCREEN(); \\\n    DISPLAY_RINGS(); \\\n    if(!level) \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\n        _XL_PRINT(XSize/2-4,YSize/2, _SECRET_STRING); \\\n    } \\\n    else if(!(level&3)) \\\n    { \\\n        for(i=0;i<10;++i) \\\n        { \\\n            build_box_wall(XSize/2-5,YSize/2,10,1,EXTRA); \\\n        } \\\n    } \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    _XL_PRINT(XSize/2-4,YSize/2+2,       _LEVEL_STRING); \\\n    _XL_PRINTD(XSize/2-4+6,YSize/2+2,2,level); \\\n    _XL_WAIT_FOR_INPUT(); \\\n    DELETE_RINGS(); \n\n#define initialize_level_variables() \\\n    energy = MAX_ENERGY; \\\n    coin_count = 0; \\\n    speed_increase_counter = 0; \\\n    slow_down = _XL_SLOW_DOWN_FACTOR; \\\n    apples_on_screen_count = 1+(remaining_apples>>3); \\\n    spawned_apples = 0; \\\n    transparent_vertical_wall_level_flag = transparent_vertical_wall_level(); \\\n    transparent_vertical_wall_triggered = EMPTY; \\\n    transparent_horizontal_wall_triggered = EMPTY; \\\n    transparent_horizontal_wall_level_flag = transparent_horizontal_wall_level(); \\\n    secret_level_active = 0; \\\n    extra_count = 0\n\n\n#define spawn_items_at_level_startup() \\\n    for(i=0;i<apples_on_screen_count;++i) \\\n    { \\\n        spawn(APPLE); \\\n    } \\\n    if(level>=EXTRA_RING_SPAWN_THRESHOLD) \\\n    { \\\n        spawn(RING); \\\n    } \\\n    if(!level) \\\n    { \\\n        spawn(RING); \\\n        spawn(RING); \\\n    }\n\n#define debug_transparent_walls() \\\n    _XL_WAIT_FOR_INPUT(); \\\n    if(transparent_horizontal_wall_level()) \\\n    { \\\n        build_box_wall(TRANSPARENT_HORIZONTAL_WALL_X,TRANSPARENT_HORIZONTAL_WALL_Y,TRANSPARENT_HORIZONTAL_WALL_LENGTH,1,TRANSPARENT); \\\n    } \\\n    if(transparent_vertical_wall_level()) \\\n    { \\\n        build_box_wall(TRANSPARENT_VERTICAL_WALL_X,TRANSPARENT_VERTICAL_WALL_Y,1,TRANSPARENT_VERTICAL_WALL_LENGTH,TRANSPARENT); \\\n    }\n\n#if !defined(NO_EXTRA_LIFE_ANIMATION)\n    void one_up(void)\n    {\n        uint16_t i;\n        \n        ++lives;\n        DISPLAY_LIVES();\n        \n        for(i=0;i<10;++i)\n        {\n            _XL_TOCK_SOUND();\n            _XL_SLOW_DOWN(32*i);\n\n            _XL_DRAW(XSize-2,0,HORIZONTAL_HEAD_TILE,_XL_RED);\n            _XL_TICK_SOUND();\n            _XL_SLOW_DOWN(32*i);\n            _XL_DRAW(XSize-2,0,VERTICAL_HEAD_TILE, _XL_YELLOW);\n        }\n        _XL_DRAW(XSize-2,0,VERTICAL_HEAD_TILE, _XL_GREEN);\n\n    }\n#else\n    void one_up(void)\n    {\n        ++lives;\n        DISPLAY_LIVES();\n        _XL_PING_SOUND();\n        _XL_DRAW(XSize-2,0,HORIZONTAL_HEAD_TILE,_XL_RED);\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR*5U);\n        _XL_DRAW(XSize-2,0,VERTICAL_HEAD_TILE, _XL_GREEN);\n\n        _XL_PING_SOUND();\n    }\n#endif\n\n\n#define handle_extra_life() \\\n    if(points>extra_life_counter*EXTRA_LIFE_THRESHOLD) \\\n    { \\\n        ++extra_life_counter; \\\n        one_up(); \\\n    }\n\n#define handle_mines() \\\n    if(active_mines) \\\n    { \\\n        handle_horizontal_mines(); \\\n        handle_vertical_mines(); \\\n    }\n\n\n#define handle_items_to_spawn() \\\n    if(!(level&3)) \\\n    { \\\n        spawn(EXTRA); \\\n        spawn(EXTRA); \\\n    } \\\n    if((!apples_on_screen_count || (_XL_RAND()&1)) && (apples_on_screen_count<remaining_apples)) \\\n    { \\\n        ++apples_on_screen_count; \\\n        if((spawned_apples&7)==SPAWNED_APPLE_START) \\\n            { \\\n                spawn(RING); \\\n            } \\\n        spawn(APPLE); \\\n        ++spawned_apples; \\\n    }\n\n\n#if !defined(NO_HOLE_ANIMATION)\n    #define handle_secret_hole() \\\n        _XL_DRAW(snake_head_x,snake_head_y,TRANSPARENT_BRICK_TILE,_XL_YELLOW); \\\n        spawn_extra(SOME_EXTRA); \\\n        spawn(RING); \\\n        _XL_DRAW(snake_head_x,snake_head_y,VERTICAL_HEAD_TILE,_XL_GREEN); \\\n        set_secret(&secret_passage[level]);\n#else\n    #define handle_secret_hole() \\\n        spawn_extra(SOME_EXTRA); \\\n        spawn(RING); \\\n        set_secret(&secret_passage[level]); \n#endif\n\n\n#if XSize<30\n    #define OPEN_X SECRET_X\n    #define OPEN_Y ((YSize)-1)\n#else\n    #define OPEN_X (((XSize)/2)-3)\n    #define OPEN_Y 0\n#endif \n\n\n#define handle_coin_effect() \\\n    do \\\n    { \\\n        snake_grows(); \\\n        increase_points(RING_POINTS<<coin_count); \\\n        _XL_ZAP_SOUND(); \\\n        _XL_DRAW(XSize-6+coin_count,YSize-1,RING_TILE,_XL_WHITE); \\\n        if(coin_count>=2) \\\n        { \\\n            set_secret(&third_coin_achievement); \\\n            spawn(SUPER_RING); \\\n        } \\\n        if(coin_count>=3) \\\n        { \\\n            set_secret(&fourth_coin_achievement); \\\n            spawn_extra(SOME_EXTRA); \\\n        } \\\n        if(coin_count>=4) \\\n        { \\\n            if(secret_level_never_activated) \\\n            { \\\n                secret_level_active = 1; \\\n                _XL_SET_TEXT_COLOR(_XL_RED); \\\n                _XL_PRINT(OPEN_X,OPEN_Y,_XL_O _XL_P _XL_E _XL_N \"00\"); \\\n            } \\\n        } \\\n        ++coin_count; \\\n    } while(0)\n\n\n\nvoid spawn_extra(uint8_t quantity)\n{\n    uint8_t i;\n    \n    for(i=0;i<quantity;++i)\n    {\n        spawn(EXTRA);\n    }\n}\n\nvoid build_magic_column(uint8_t x, uint8_t y, uint8_t length)\n{\n    build_box_wall(x,y,1,length,EXTRA);\n}\n\n\nvoid magic_wall(void)\n{\n    set_secret(&magic_wall_achievement[level>>2]);\n    switch(level)\n    {\n        case 0:\n            spawn_extra(MANY_EXTRA);\n        break;\n        case 4: \n        case 20:\n            build_magic_column(XSize/3, 1, YSize-YSize/5);\n            build_magic_column(2*XSize/3, YSize/5, YSize-YSize/5-1);\n        break;\n        case 8: \n        case 24:\n            build_magic_column(XSize/6,3,YSize-1-6);\n            build_magic_column(XSize-1-XSize/6, 3, YSize-1-6);\n        break;\n        case 12: \n        case 28:\n            build_magic_column(XSize/5, 1, YSize-YSize/5);\n            build_magic_column(4*XSize/5, YSize/5, YSize-YSize/5-1);\n        break;\n        case 16: \n        case 32:\n            build_magic_column(XSize/3, YSize-1-YSize/3,YSize/3);\n            build_magic_column(XSize-1-XSize/3, YSize-1-YSize/3, YSize/3);\n        break;\n    } \n}\n\n\n#define handle_extra_points_effect() \\\n    do \\\n    { \\\n        snake_grows(); \\\n        _XL_TICK_SOUND(); \\\n        increase_points(EXTRA_POINTS); \\\n        speed_increase_counter = 0; \\\n        if(!(level&3)) \\\n        { \\\n            if(extra_count==MAGIC_WALL_THRESHOLD) \\\n            { \\\n                magic_wall(); \\\n            } \\\n            if(extra_count==RING_THRESHOLD) \\\n            { \\\n                set_secret(&(coin_achievement[level>>2])); \\\n                spawn(RING); \\\n            } \\\n            if(extra_count==EXTRA_1UP_THRESHOLD) \\\n            { \\\n                if(!(extra_life_achievement[level>>2])) \\\n                { \\\n                    spawn(EXTRA_LIFE); \\\n                } \\\n            } \\\n            ++extra_count; \\\n        } \\\n    } while(0)\n\n\n#define handle_super_coin_effect() \\\n    _XL_ZAP_SOUND(); \\\n    increase_points(SUPER_RING_POINTS); \\\n    slow_down = _XL_SLOW_DOWN_FACTOR + _XL_SLOW_DOWN_FACTOR/5; \\\n    if(energy>10) \\\n    { \\\n        energy = MAX_ENERGY; \\\n    } \\\n    else \\\n    { \\\n        energy+= 10; \\\n    } \\\n    DISPLAY_ENERGY(); \\\n    active_mines = 0; \\\n\n\n#define handle_apple_effect() \\\n    --apples_on_screen_count; \\\n    snake_grows(); \\\n    --remaining_apples; \\\n    DISPLAY_REMAINING_APPLES_COUNT(); \\\n    increase_points(APPLE_POINTS); \\\n    _XL_ZAP_SOUND(); \\\n    IF_POSSIBLE_DECREASE_SPEED();\n\n\n#define handle_extra_life_effect() \\\n    _XL_ZAP_SOUND(); \\\n    one_up(); \\\n    set_secret(&extra_life_achievement[level>>2]);\n\n\n#define handle_collisions_with_objects() \\\n    if(hits_coin(snake_head_x,snake_head_y)) \\\n    { \\\n        handle_coin_effect(); \\\n    } \\\n    else if(hits_extra_points(snake_head_x,snake_head_y)) \\\n    { \\\n        handle_extra_points_effect(); \\\n    } \\\n    else if(hits_super_coin(snake_head_x,snake_head_y)) \\\n    { \\\n        handle_super_coin_effect(); \\\n    } \\\n    else if(hits_apple(snake_head_x,snake_head_y)) \\\n    { \\\n        handle_apple_effect(); \\\n    } \\\n    else if(hits_extra_life(snake_head_x,snake_head_y)) \\\n    { \\\n        handle_extra_life_effect(); \\\n    } \\\n    else if(hits_secret(snake_head_x,snake_head_y)) \\\n    { \\\n        handle_secret_hole(); \\\n    }\n\n#define update_snake_head() \\\n    snake_head_x = snake_x[snake_head]; \\\n    snake_head_y = snake_y[snake_head];\n\n#define handle_mine_reactivation() \\\n    if(slow_down<_XL_SLOW_DOWN_FACTOR) \\\n    { \\\n        active_mines = 1; \\\n    }\n\n#define update_remaining_apples() \\\n    remaining_apples=INITIAL_APPLE_COUNT+level*APPLE_COUNT_INCREASE; \\\n    if(remaining_apples>MAX_APPLES) \\\n    { \\\n        remaining_apples = MAX_APPLES; \\\n    }\n\n#define handle_no_energy() \\\n    if(!energy) \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_RED); \\\n        PRINT_CENTERED_ON_ROW(YSize/2, _NO_ENERGY_STRING); \\\n        break; \\\n    }\n\n#if YSize>=12\n    #define BONUS_Y YSize/2\n#else\n    #define BONUS_Y YSize/6\n#endif\n\n#define handle_level_cleared() \\\n    _XL_SET_TEXT_COLOR(_XL_RED); \\\n    PRINT_CENTERED_ON_ROW(BONUS_Y, _CLEARED_STRING); \\\n    level_bonus = (uint16_t) (((uint16_t) snake_length)<<1)+(((uint16_t) energy)<<3) +(((uint16_t) coin_count)<<5) + (((uint16_t) level)<<2); \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    PRINT_CENTERED_ON_ROW(BONUS_Y+2, _BONUS_STRING); \\\n    _XL_PRINTD(XSize/2-3,BONUS_Y+4,5,level_bonus); \\\n    rings+=coin_count;\n\n\nvoid increase_points(uint16_t value)\n{\n    points+=value;\n    DISPLAY_POINTS();\n}\n\n\n#if !defined(NO_BONUS_ANIMATION)\n    void get_level_bonus(uint16_t level_bonus) \n    {\n        uint16_t i;\n        \n        _XL_WAIT_FOR_INPUT();\n        increase_points(level_bonus%8);\n        for(i=level_bonus%8;i<level_bonus;i+=8)\n        {\n            increase_points(8);\n            _XL_TICK_SOUND();\n            _XL_SLOW_DOWN(2*i);\n        }\n    }\n\n#else\n    #define get_level_bonus(level_bonux)  increase_points(level_bonus)\n#endif\n\n#define handle_next_level() \\\n    if(level) \\\n    { \\\n        if(!secret_level_active) \\\n        { \\\n            ++level; \\\n        } \\\n        else \\\n        { \\\n            secret_level_never_activated = 0; \\\n            next_level = level + 1; \\\n            level = 0; \\\n        } \\\n    } \\\n    else \\\n    { \\\n        level = next_level; \\\n    } \\\n    update_remaining_apples(); \\\n    get_level_bonus(level_bonus); \\\n    _XL_WAIT_FOR_INPUT();\n\n#define handle_final_screen() \\\n    _XL_CLEAR_SCREEN(); \\\n    build_box_wall(0,1,XSize-2,YSize-2,APPLE); \\\n    show_intro_snake(); \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    PRINT_CENTERED_ON_ROW(YSize/8+3, _THE_END_STRING);\n\n#define handle_lost_life() \\\n    --lives; \\\n    _XL_EXPLOSION_SOUND(); \\\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR*4U); \\\n    PRESS_KEY();\n\n\n\n#if XSize<32\n    #define ANIMATION_SLOW_FACTOR 4\n#elif XSize<64\n    #define ANIMATION_SLOW_FACTOR 8\n#else\n    #define ANIMATION_SLOW_FACTOR 16\n#endif \n\n#define DISPLAY_LEVEL_ANIMATION() \\\n{ \\\n    uint8_t i; \\\n    \\\n    active_mines = 1; \\\n    init_map_to_empty(); \\\n    DRAW_MAP_BORDERS(); \\\n    build_horizontal_mines(31); \\\n    for(i=0;i<XSize*2-5;++i) \\\n    { \\\n        handle_horizontal_mines(); \\\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/ANIMATION_SLOW_FACTOR); \\\n    }; \\\n}\n\n#if XSize<=19\n    #define display_hi() \n    #define print_record() \n#else\n    #define display_hi()  _XL_DRAW(XSize-10+HISCORE_OFFSET,0,HI_TEXT_TILE, _XL_GREEN);\n    #define print_record()     _XL_PRINTD(XSize-9+HISCORE_OFFSET,0,5,record);\n#endif\n\n#define initialize_map() \\\n{ \\\n    DRAW_MAP_BORDERS(); \\\n    _XL_DRAW(XSize-2,0,VERTICAL_HEAD_TILE,_XL_GREEN); \\\n    _XL_DRAW(0,0,SCORE_TEXT_LEFT_TILE,_XL_GREEN); \\\n    _XL_DRAW(1,0,SCORE_TEXT_RIGHT_TILE,_XL_GREEN); \\\n    display_hi(); \\\n    _XL_DRAW(8,0,APPLE_TILE,_XL_RED); \\\n    _XL_DRAW(0,YSize-1,LV_TEXT_TILE,_XL_GREEN); \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    DISPLAY_LIVES(); \\\n    _XL_PRINTD(1,YSize-1,2,level); \\\n    DISPLAY_REMAINING_APPLES_COUNT(); \\\n    print_record(); \\\n    DISPLAY_ENERGY(); \\\n    init_snake(); \\\n    DISPLAY_POINTS(); \\\n}\n\n#if !defined(NO_ACHIEVEMENTS_SCREEN)\n\n\nvoid display_achievements(uint8_t row, uint8_t achievements, uint8_t max)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINT(ACHIEVEMENTS_X_OFFSET+5,row,_XL_O _XL_F);\n    _XL_PRINTD(ACHIEVEMENTS_X_OFFSET+8,row,2,max);\n    for(i=0;i<=achievements;++i)\n    {\n        _XL_PRINTD(ACHIEVEMENTS_X_OFFSET+2,row,2,i);\n        _XL_SHOOT_SOUND();\n        _XL_SLOW_DOWN((_XL_SLOW_DOWN_FACTOR/2));\n    }\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR*4U);\n}\n\n\n\n#define handle_record() \\\n    if(points>record) \\\n    { \\\n        record = points; \\\n        _XL_SET_TEXT_COLOR(_XL_RED); \\\n        _XL_PRINT(ACHIEVEMENTS_X_OFFSET+9,ACHIEVEMENTS_Y_OFFSET, _XL_R _XL_E _XL_C _XL_O _XL_R _XL_D); \\\n    }\n\n    \nvoid display_stats(void)\n{    \n    _XL_CLEAR_SCREEN();\n    \n    _XL_SET_TEXT_COLOR(_XL_GREEN);\n    PRINT_CENTERED_ON_ROW(ACHIEVEMENTS_Y_OFFSET-2, _XL_A _XL_C _XL_H _XL_I _XL_E _XL_V _XL_E _XL_M _XL_E _XL_N _XL_T _XL_S);\n    \n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(ACHIEVEMENTS_X_OFFSET+3,ACHIEVEMENTS_Y_OFFSET,5,points);\n    _XL_DRAW(ACHIEVEMENTS_X_OFFSET,ACHIEVEMENTS_Y_OFFSET,SCORE_TEXT_LEFT_TILE,_XL_GREEN);\n    _XL_DRAW(ACHIEVEMENTS_X_OFFSET+1,ACHIEVEMENTS_Y_OFFSET,SCORE_TEXT_RIGHT_TILE, _XL_GREEN);\n\n    handle_record();\n    \n    DISPLAY_RINGS();\n    \n    lives = 0; // re-used variable\n    \n    for(i=0;i<9;++i)\n    {\n        #if defined(DEBUG_ACHIEVEMENTS)\n        _XL_PRINTD(2,1+i,3,extra_life_achievement[i]); _XL_PRINTD(6,1+i,3, coin_achievement[i]); _XL_PRINTD(10,1+i,3,magic_wall_achievement[i]);\n        _XL_WAIT_FOR_INPUT();\n        #endif\n        lives+=extra_life_achievement[i]+coin_achievement[i]+magic_wall_achievement[i];\n    }\n    \n    for(i=0;i<32;++i)\n    {\n        lives+=secret_passage[i];\n        #if defined(DEBUG_ACHIEVEMENTS)\n        _XL_PRINTD(2+i,10,2,secret_passage[i]);\n        #endif\n    }\n    \n\n\n    #if defined(DEBUG_ACHIEVEMENTS)\n        _XL_PRINTD(2,12,3,!secret_level_never_activated); _XL_PRINTD(6,1+i,3, third_coin_achievement); _XL_PRINTD(10,1+i,3,fourth_coin_achievement);\n    #endif\n\n    lives+=(!secret_level_never_activated)+third_coin_achievement+fourth_coin_achievement;\n    \n    \n    _XL_SET_TEXT_COLOR(_XL_YELLOW);\n    _XL_PRINT(ACHIEVEMENTS_X_OFFSET+2,ACHIEVEMENTS_Y_OFFSET+STAT_OFFSET+3,_SECRET_STRING _XL_S);\n\n    display_achievements(ACHIEVEMENTS_Y_OFFSET+STAT_OFFSET+5,lives, 50);\n    \n    if(!level)\n    {\n        level = next_level;\n    }\n    --level;\n\n    _XL_DRAW(ACHIEVEMENTS_X_OFFSET, ACHIEVEMENTS_Y_OFFSET+STAT_OFFSET+LEVEL_OFFSET+7,LV_TEXT_TILE,_XL_GREEN);    \n    display_achievements(ACHIEVEMENTS_Y_OFFSET+STAT_OFFSET+LEVEL_OFFSET+7,level,32);\n    \n    \n    if(!secret_level_never_activated)\n    {\n        _XL_SET_TEXT_COLOR(_XL_RED);\n        _XL_PRINT(ACHIEVEMENTS_X_OFFSET-1,ACHIEVEMENTS_Y_OFFSET+STAT_OFFSET+LEVEL_OFFSET+8,_SECRET_STRING _XL_SPACE _LEVEL_STRING);\n    }\n}\n#endif\n\n#define INITIALIZE() \\\n    uint8_t i; \\\n    _XL_INIT_GRAPHICS(); \\\n    _XL_INIT_INPUT(); \\\n    _XL_INIT_SOUND(); \\\n    record = 0;\n\n\nint main(void)\n{\n    INITIALIZE();\n    while(1)\n    {\n        title();\n        initialize_variables();\n        \n        while(lives && (level<FINAL_LEVEL+1))\n        {\n            #if defined(DEBUG_LEVELS)\n            debug_levels:\n            #endif\n            \n            DISPLAY_LEVEL_SCREEN();\n            \n            #if !defined(NO_DISPLAY_LEVEL_ANIMATION) && YSize>=16\n                DISPLAY_LEVEL_ANIMATION();\n            #else\n                active_mines = 1;\n            #endif\n            build_level();\n            initialize_level_variables();\n            initialize_map();\n            spawn_items_at_level_startup();\n            \n            _XL_WAIT_FOR_INPUT();\n            #if defined(DEBUG_FREEZE)\n                spawn(SUPER_RING);\n            #endif\n            \n            #if defined(DEBUG_LEVELS)\n                debug_transparent_walls();\n                _XL_WAIT_FOR_INPUT();\n                ++level;\n                goto debug_levels;\n            #endif\n            \n            while(remaining_apples)\n            {\n                handle_extra_life();\n                \n                _XL_SLOW_DOWN(slow_down);\n                if(MOVE_PLAYER())\n                {\n                    ++speed_increase_counter;\n                    update_snake_head();\n                    \n                    if(speed_increase_counter>SPEED_INCREASE_THRESHOLD)\n                    {\n                        handle_transparent_walls();\n                        handle_mine_reactivation();\n                        speed_increase_counter = 0;\n                        handle_items_to_spawn();\n                        increase_points(1);\n                        IF_POSSIBLE_INCREASE_SPEED();\n                    }\n                    \n                    \n                    handle_collisions_with_objects();\n                    \n                    #if defined(DEBUG_SLOWDOWN)\n                    _XL_PRINTD(XSize-1-5,YSize-1,5,slow_down);\n                    _XL_PRINTD(XSize-1-5-6,YSize-1,5,speed_increase_counter);\n                    #endif\n                }\n                handle_mines();\n\n                if(hits_deadly_item(snake_head_x,snake_head_y) || !remaining_apples)\n                {\n                    break;\n                }\n                handle_no_energy();\n            }\n            if(remaining_apples)\n            {\n                handle_lost_life();\n            }\n            else\n            {\n                handle_level_cleared();\n                handle_next_level();\n            }\n        }\n        if(level>FINAL_LEVEL)\n        {\n            handle_final_screen();\n        }\n        PRINT_CENTERED_ON_ROW(YSize/2, _GAME_OVER_STRING);\n        _XL_WAIT_FOR_INPUT();\n        #if !defined(NO_ACHIEVEMENTS_SCREEN)\n        display_stats();\n        #endif\n        _XL_WAIT_FOR_INPUT();\n    }\n    \n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/games/snake/split_files/move_snake.c",
    "content": "#include \"cross_lib.h\"\r\n#include \"snake.h\"\r\n#include \"move_snake.h\"\r\n#include \"settings.h\"\r\n\r\n#include \"variables.h\"\r\n\r\n#include \"tiles.h\"\r\n\r\nuint8_t move_snake(uint8_t wished_direction)\r\n{\r\n    uint8_t candidate_x;\r\n    uint8_t candidate_y;\r\n    \r\n    i = (snake_head+snake_length-1)%snake_length;\r\n\r\n    candidate_selection:\r\n    \r\n    candidate_x = snake_head_x;\r\n    candidate_y = snake_head_y;\r\n    switch(wished_direction)\r\n    {\r\n        \r\n        case SNAKE_RIGHT:\r\n            ++candidate_x; \r\n        break;\r\n        case SNAKE_LEFT:\r\n            --candidate_x; \r\n        break;\r\n        case SNAKE_UP:\r\n            --candidate_y;\r\n        break;\r\n        case SNAKE_DOWN:\r\n            ++candidate_y;\r\n        break;\r\n    }\r\n    if(!hits_wall(candidate_x,candidate_y)) // can move\r\n    {\r\n        snake_direction = wished_direction;\r\n        delete_body_part(i);\r\n        snake_x[i] = candidate_x;\r\n        snake_y[i] = candidate_y;\r\n        \r\n        if(HORIZONTAL(snake_direction))\r\n        {\r\n            head_tile = HORIZONTAL_HEAD_TILE;\r\n        }\r\n        else\r\n        {\r\n            head_tile = VERTICAL_HEAD_TILE;\r\n        }\r\n        \r\n        draw_body_part(snake_head); // Draw old head as body part\r\n        \r\n        snake_head = i; // new head uses tail index\r\n        \r\n        draw_head(); // draw new head\r\n        return 1;\r\n    }\r\n    if (wished_direction != snake_direction)\r\n    {\r\n        wished_direction = snake_direction;\r\n        goto candidate_selection;\r\n    }\r\n    return 0;\r\n}\r\n\r\n"
  },
  {
    "path": "src/games/snake/split_files/snake.c",
    "content": "#include \"cross_lib.h\"\r\n#include \"snake.h\"\r\n#include \"move_snake.h\"\r\n#include \"settings.h\"\r\n\r\n#include \"variables.h\"\r\n\r\nvoid draw_head(void)\r\n{\r\n    _XL_DRAW(snake_x[snake_head],snake_y[snake_head],head_tile,_XL_GREEN);\r\n}\r\n\r\nvoid delete_body_part(uint8_t i)\r\n{\r\n    _XL_DELETE(snake_x[i],snake_y[i]);\r\n    map[snake_x[i]][snake_y[i]] = EMPTY;\r\n}\r\n\r\nvoid draw_body_part(uint8_t i)\r\n{\r\n    _XL_DRAW(snake_x[i],snake_y[i],BODY_TILE,_XL_GREEN);\r\n    map[snake_x[i]][snake_y[i]] = DEADLY;\r\n}\r\n\r\n\r\nvoid init_snake(void)\r\n{    \r\n    snake_length = INITIAL_SNAKE_LENGTH;\r\n    \r\n    snake_head = 0;\r\n    \r\n    for(i=0;i<snake_length;++i)\r\n    {\r\n        j = (i+snake_head)%snake_length;\r\n        snake_x[j] = XSize/2+snake_length/2-i-1;\r\n        snake_y[j] = YSize/2;\r\n        draw_body_part(j);\r\n    }\r\n    \r\n    head_tile = HORIZONTAL_HEAD_TILE;\r\n    \r\n    snake_direction = SNAKE_RIGHT;\r\n    \r\n    draw_head();\r\n    \r\n    snake_head_x = snake_x[snake_head];\r\n    snake_head_y = snake_y[snake_head];\r\n    \r\n}\r\n\r\n#if !defined(NO_GROWTH)\r\nvoid snake_grows(void)\r\n{\r\n    uint8_t x;\r\n    uint8_t y;\r\n    \r\n    if(snake_length<MAX_SNAKE_LENGTH)\r\n    {\r\n        // Generate head at index 0\r\n        \r\n        x = snake_head_x; \r\n        y = snake_head_y;\r\n\r\n        switch(snake_direction)\r\n        {\r\n            case SNAKE_RIGHT:\r\n                ++x;\r\n            break;\r\n            case SNAKE_LEFT:\r\n                --x;\r\n            break;\r\n            case SNAKE_UP:\r\n                --y;\r\n            break;\r\n            case SNAKE_DOWN:\r\n                ++y;\r\n            break;\r\n        }\r\n        \r\n        if(!(map[x][y]))\r\n        {\r\n            snake_copy_x[0] = x;\r\n            snake_copy_y[0] = y;\r\n        \r\n            // Copy snake body starting at index 1\r\n            for(i=0;i<snake_length;++i)\r\n            {   \r\n                x = (i+snake_head)%snake_length; // store\r\n                snake_copy_x[i+1]=snake_x[x];\r\n                snake_copy_y[i+1]=snake_y[x];\r\n            }\r\n            \r\n            // New head is at index 0\r\n            snake_head = 0;\r\n            \r\n            // New length = old length + 1\r\n            ++snake_length;\r\n            \r\n            // Copy the new snake into snake array\r\n            for(i=0;i<snake_length;++i)\r\n            {\r\n                snake_x[i] = snake_copy_x[i];\r\n                snake_y[i] = snake_copy_y[i];\r\n                \r\n                if(i)\r\n                {\r\n                    draw_body_part(i);\r\n                }\r\n            }\r\n            draw_head();\r\n            snake_head_x = snake_x[0];\r\n            snake_head_y = snake_y[0];\r\n        }\r\n    }\r\n}\r\n#endif\r\n\r\n"
  },
  {
    "path": "src/games/snake/split_files/variables.c",
    "content": "#include \"cross_lib.h\"\r\n#include \"settings.h\"\r\n\r\n#if !defined(USE_MEMORY_BUFFERS)\r\nuint8_t snake_head_x;\r\nuint8_t snake_head_y;\r\nuint8_t speed_increase_counter;\r\nuint8_t spawned_apples;\r\nuint8_t remaining_apples;\r\nuint8_t level;\r\n\r\nuint8_t snake_x[MAX_SNAKE_LENGTH];\r\nuint8_t snake_y[MAX_SNAKE_LENGTH];\r\nuint8_t snake_copy_x[MAX_SNAKE_LENGTH];\r\nuint8_t snake_copy_y[MAX_SNAKE_LENGTH];\r\n\r\nuint16_t points;\r\nuint16_t slow_down;\r\nuint16_t record;\r\nuint16_t level_bonus;\r\n\r\n\r\nuint8_t horizontal_mine_x[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\nuint8_t horizontal_mine_y[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\nuint8_t horizontal_mine_direction[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\nuint8_t horizontal_mine_transition[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\n\r\nuint8_t vertical_mine_x[MAX_NUMBER_OF_VERTICAL_MINES];\r\nuint8_t vertical_mine_y[MAX_NUMBER_OF_VERTICAL_MINES];\r\nuint8_t vertical_mine_direction[MAX_NUMBER_OF_VERTICAL_MINES];\r\nuint8_t vertical_mine_transition[MAX_NUMBER_OF_VERTICAL_MINES];\r\n\r\n\r\n// It records if one extra life was taken in bonus/secret levels\r\nuint8_t extra_life_achievement[9];\r\n\r\n// It records if the magic wall was created in bonus/secret levels\r\nuint8_t magic_wall_achievement[9];\r\n\r\n// It records if the super coin was spawned in bonus/secret/levels\r\nuint8_t coin_achievement[9];\r\n\r\nuint8_t energy;\r\n\r\nuint8_t lives;\r\n\r\nuint8_t snake_length;\r\nuint8_t snake_head;\r\nuint8_t snake_direction;\r\n\r\nuint8_t apples_on_screen_count;\r\nuint8_t coin_count;\r\nuint8_t extra_life_counter;\r\nuint8_t active_mines;\r\n\r\n\r\nuint8_t horizontal_mines_on_current_level;\r\nuint8_t vertical_mines_on_current_level;\r\nuint8_t transparent_vertical_wall_triggered;\r\nuint8_t transparent_horizontal_wall_triggered;\r\nuint8_t secret_level_active;\r\nuint8_t secret_level_never_activated;\r\nuint8_t next_level;\r\nuint8_t transparent_vertical_wall_level_flag;\r\nuint8_t transparent_horizontal_wall_level_flag;\r\nuint8_t head_tile;\r\nuint8_t secret_passage[2*NUMBER_OF_MAPS];\r\n\r\nuint8_t rings;\r\n\r\nuint8_t extra_count;\r\nuint8_t third_coin_achievement;\r\nuint8_t fourth_coin_achievement;\r\nuint8_t i;\r\nuint8_t j;\r\n\r\n#endif\r\n\r\n\r\n\r\nuint8_t map[XSize][YSize];\r\n\r\n\r\n"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile0.txt",
    "content": "12,30,63,45,45,63,30,12"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile1.txt",
    "content": "12,30,51,63,63,51,30,12"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile10.txt",
    "content": "42,21,42,21,42,21,42,21"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile11.txt",
    "content": "0,0,0,0,0,6,58,34"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile12.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile13.txt",
    "content": "0,63,21,63,63,21,63,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile14.txt",
    "content": "0,59,41,41,57,33,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile15.txt",
    "content": "17,23,24,0,0,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile16.txt",
    "content": "0,46,8,4,2,14,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile17.txt",
    "content": "0,6,58,34,17,23,24,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile18.txt",
    "content": "0,12,18,45,45,18,12,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile19.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile2.txt",
    "content": "0,0,7,4,2,2,3,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile20.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile21.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile22.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile23.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile25.txt",
    "content": "0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile3.txt",
    "content": "0,48,16,16,8,56,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile4.txt",
    "content": "12,30,63,63,63,63,30,12"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile5.txt",
    "content": "0,24,4,30,61,61,63,30"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile6.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile7.txt",
    "content": "63,42,63,42,63,42,63,42"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/games/snake/tiles/6x8/tile9.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile0.txt",
    "content": "12,30,63,45,45,45,63,30,12"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile1.txt",
    "content": "12,30,51,63,63,63,51,30,12"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile10.txt",
    "content": "42,21,42,21,42,21,42,21,42"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,0,0,6,58,34"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile12.txt",
    "content": "63,45,63,45,63,45,63,45,63"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile13.txt",
    "content": "0,63,21,63,63,63,21,63,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile14.txt",
    "content": "0,59,41,41,57,33,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile15.txt",
    "content": "17,23,24,0,0,0,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile16.txt",
    "content": "0,46,8,4,2,14,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile17.txt",
    "content": "0,6,58,34,17,23,24,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile18.txt",
    "content": "0,12,18,45,45,18,12,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile19.txt",
    "content": "31,21,31,21,31,21,31,21,31"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile2.txt",
    "content": "0,0,7,4,2,2,3,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile20.txt",
    "content": "63,49,63,35,63,49,63,35,63"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile21.txt",
    "content": "63,45,63,45,63,45,63,45,63"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile22.txt",
    "content": "63,63,36,9,63,63,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile23.txt",
    "content": "31,19,31,19,31,25,31,25,31"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile24.txt",
    "content": "63,41,63,37,63,41,63,37,63"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile25.txt",
    "content": "0,0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile3.txt",
    "content": "0,48,16,16,8,56,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile4.txt",
    "content": "12,30,63,63,63,63,63,30,12"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile5.txt",
    "content": "0,24,4,30,61,61,61,63,30"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile6.txt",
    "content": "0,42,42,58,42,42,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile7.txt",
    "content": "63,42,63,42,63,42,63,42,63"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile8.txt",
    "content": "0,12,18,33,33,18,12,0,0"
  },
  {
    "path": "src/games/snake/tiles/6x9/tile9.txt",
    "content": "0,37,37,37,37,50,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile0.txt",
    "content": "28,62,127,73,73,127,62,28"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile1.txt",
    "content": "28,34,99,127,127,99,34,28"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile10.txt",
    "content": "42,85,42,85,42,85,42,85"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile11.txt",
    "content": "0,0,0,0,0,6,58,34"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile12.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile13.txt",
    "content": "0,127,85,127,127,85,127,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile14.txt",
    "content": "0,59,41,41,57,33,0,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile15.txt",
    "content": "17,23,24,0,0,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile16.txt",
    "content": "0,92,16,8,4,28,0,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile17.txt",
    "content": "0,6,58,34,17,23,24,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile18.txt",
    "content": "0,12,18,45,45,18,12,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile19.txt",
    "content": "31,21,31,21,31,21,31,21"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile2.txt",
    "content": "0,0,7,4,2,2,3,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile20.txt",
    "content": "63,49,63,35,63,49,63,35"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile21.txt",
    "content": "63,45,63,45,63,45,63,45"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile22.txt",
    "content": "63,63,36,9,63,63,0,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile23.txt",
    "content": "31,19,31,19,31,25,31,25"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile25.txt",
    "content": "0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile3.txt",
    "content": "0,96,32,32,16,112,0,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile4.txt",
    "content": "28,62,127,127,127,127,62,28"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile5.txt",
    "content": "0,24,4,30,61,61,63,30"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile6.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile7.txt",
    "content": "63,42,63,42,63,42,63,42"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/games/snake/tiles/7x8/tile9.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile0.txt",
    "content": "60,126,219,219,126,60"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile1.txt",
    "content": "60,102,255,255,102,60"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile10.txt",
    "content": "170,0,170,0,170,0"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile11.txt",
    "content": "0,0,0,8,60,196"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile12.txt",
    "content": "90,126,90,126,90,126"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile13.txt",
    "content": "255,170,255,170,255,0"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile14.txt",
    "content": "$db,$92,$d2,$52,$db,$00"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile15.txt",
    "content": "35,60,16,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile16.txt",
    "content": "$b3,$aa,$b3,$aa,$ab,$00"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile17.txt",
    "content": "16,44,35,196,52,8"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile18.txt",
    "content": "60,102,219,219,102,60"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile19.txt",
    "content": "16,56,46,99,198,116"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile2.txt",
    "content": "0,3,12,2,3,1"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile20.txt",
    "content": "153,255,126,60,60,126"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile21.txt",
    "content": "255,255,126,60,60,126"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile22.txt",
    "content": "195,103,127,255,255,127"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile23.txt",
    "content": "195,230,254,255,255,254"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile24.txt",
    "content": "255,255,126,60,0,0"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile25.txt",
    "content": "0,16,40,116,40,16"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile3.txt",
    "content": "128,192,64,48,192,0"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile4.txt",
    "content": "60,126,255,255,126,60"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile5.txt",
    "content": "48,8,126,251,251,126"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile6.txt",
    "content": "$54,$54,$74,$54,$54,$00"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile7.txt",
    "content": "170,255,170,255,170,255"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile8.txt",
    "content": "60,102,195,195,102,60"
  },
  {
    "path": "src/games/snake/tiles/8x6/tile9.txt",
    "content": "37,37,37,37,50,0"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile0.txt",
    "content": "60,126,255,153,153,255,126,60"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile1.txt",
    "content": "60,102,231,255,255,231,102,60"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile10.txt",
    "content": "170,0,170,0,170,0,170,0"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile11.txt",
    "content": "0,0,0,0,8,28,116,198"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile12.txt",
    "content": "90,126,90,126,90,126,90,126"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile13.txt",
    "content": "0,255,170,255,255,170,255,0"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile14.txt",
    "content": "$db,$92,$92,$d2,$52,$52,$db,$00"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile15.txt",
    "content": "99,46,56,16,0,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile16.txt",
    "content": "$b3,$aa,$aa,$b3,$aa,$aa,$ab,$00"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile17.txt",
    "content": "16,56,46,99,198,116,28,8"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile18.txt",
    "content": "60,126,231,219,219,231,126,60"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile19.txt",
    "content": "16,56,46,99,198,116,28,8"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile2.txt",
    "content": "0,1,7,12,6,2,3,1"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile20.txt",
    "content": "153,255,126,60,60,126,255,255"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile21.txt",
    "content": "255,255,126,60,60,126,255,153"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile22.txt",
    "content": "195,103,127,255,255,127,103,195"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile23.txt",
    "content": "195,230,254,255,255,254,230,195"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile24.txt",
    "content": "255,255,126,60,0,0,0,0"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile25.txt",
    "content": "0,0,0,24,52,122,52,24"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile3.txt",
    "content": "128,192,64,96,48,224,128,0"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile4.txt",
    "content": "60,126,255,255,255,255,126,60"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile5.txt",
    "content": "48,8,126,255,253,253,255,126"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile6.txt",
    "content": "$54,$54,$54,$74,$54,$54,$54,$00"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile7.txt",
    "content": "170,255,170,255,170,255,170,255"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/games/snake/tiles/8x8/tile9.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/games/snake/tiles/ASCII/aquarius/aquarius_char_tiles.h",
    "content": "#ifndef _AQUARIUS_CHAR_TILES_H\r\n#define _AQUARIUS_CHAR_TILES_H\r\n\r\n// Head\r\n#define _TILE_0 150\r\n//'*'\r\n#define _TILE_1 150\r\n//'*'\r\n\r\n#define _TILE_2 172\r\n#define _TILE_3 172\r\n\r\n// Body\r\n#define _TILE_4 197\r\n//'O'\r\n\r\n// Apple\r\n#define _TILE_5 135\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 255\r\n//'='\r\n\r\n// Ring\r\n#define _TILE_8 'o'\r\n//'O'\r\n\r\n\r\n#define _TILE_9 'L'\r\n\r\n// Transparent brick\r\n#define _TILE_10 134\r\n\r\n\r\n\r\n// Vertical wall\r\n#define _TILE_12 255\r\n//'I'\r\n\r\n// Horizontal wall\r\n#define _TILE_13 255\r\n//'-'\r\n\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_11 214\r\n#define _TILE_15 214\r\n\r\n#define _TILE_16 'C'\r\n\r\n// Mine\r\n#define _TILE_17 216\r\n//'X'\r\n\r\n\r\n// Super ring\r\n#define _TILE_18 '*'\r\n\r\n\r\n#define _TILE_25 '$'\r\n\r\n\r\n#endif //_AQUARIUS_CHAR_TILES_H\r\n"
  },
  {
    "path": "src/games/snake/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if defined(__TARGET_SPECIFIC_ASCII) && defined(__AQUARIUS__) && !defined(__QUAD_MEMORY_MAPPED_GRAPHICS) && !defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n    #include \"aquarius/aquarius_char_tiles.h\"\r\n#else\r\n    \r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_25 '$'\r\n\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/snake/variables.h",
    "content": "#ifndef _VARIABLES_H\r\n#define _VARIABLES_H\r\n\r\n#include \"settings.h\"\r\n\r\n\r\nextern uint8_t snake_head_x;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"snake_head_x\")\r\n#endif\r\n\r\nextern uint8_t snake_head_y;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"snake_head_y\")\r\n#endif\r\n\r\nextern uint8_t speed_increase_counter;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"speed_increase_counter\")\r\n#endif\r\n\r\nextern uint8_t spawned_apples;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"spawned_apples\")\r\n#endif\r\n\r\nextern uint8_t remaining_apples;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"remaining_apples\")\r\n#endif\r\n\r\nextern uint8_t level;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"level\")\r\n#endif\r\n\r\nextern uint8_t energy;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"energy\")\r\n#endif\r\n\r\nextern uint8_t lives;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"lives\")\r\n#endif\r\n\r\nextern uint8_t snake_length;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"snake_length\")\r\n#endif\r\n\r\nextern uint8_t snake_head;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"snake_head\")\r\n#endif\r\n\r\nextern uint8_t snake_direction;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"snake_direction\")\r\n#endif\r\n\r\nextern uint8_t apples_on_screen_count;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"apples_on_screen_count\")\r\n#endif\r\n\r\nextern uint8_t coin_count;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"coin_count\")\r\n#endif\r\n\r\nextern uint8_t extra_life_counter;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"extra_life_counter\")\r\n#endif\r\n\r\nextern uint8_t active_mines;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"active_mines\")\r\n#endif\r\n\r\nextern uint8_t horizontal_mines_on_current_level;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"horizontal_mines_on_current_level\")\r\n#endif\r\n\r\nextern uint8_t vertical_mines_on_current_level;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"vertical_mines_on_current_level\")\r\n#endif\r\n\r\nextern uint8_t transparent_vertical_wall_triggered;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"transparent_vertical_wall_triggered\")\r\n#endif\r\n\r\nextern uint8_t transparent_horizontal_wall_triggered;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"transparent_horizontal_wall_triggered\")\r\n#endif\r\n\r\nextern uint8_t secret_level_active;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"secret_level_active\")\r\n#endif\r\n\r\nextern uint8_t secret_level_never_activated;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"secret_level_never_activated\")\r\n#endif\r\n\r\nextern uint8_t next_level;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"next_level\")\r\n#endif\r\n\r\nextern uint8_t transparent_vertical_wall_level_flag;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"transparent_vertical_wall_level_flag\")\r\n#endif\r\n\r\nextern uint8_t transparent_horizontal_wall_level_flag;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"transparent_horizontal_wall_level_flag\")\r\n#endif\r\n\r\nextern uint8_t head_tile;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"head_tile\")\r\n#endif\r\n\r\nextern const char strings[NUMBER_OF_STRINGS][MAX_STRING_SIZE];\r\n\r\nextern uint8_t snake_x[MAX_SNAKE_LENGTH];\r\nextern uint8_t snake_y[MAX_SNAKE_LENGTH];\r\nextern uint8_t snake_copy_x[MAX_SNAKE_LENGTH];\r\nextern uint8_t snake_copy_y[MAX_SNAKE_LENGTH];\r\n\r\nextern uint16_t points;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"points\")\r\n#endif\r\n\r\nextern uint16_t slow_down;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"slow_down\")\r\n#endif\r\n\r\nextern uint16_t record;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"record\")\r\n#endif\r\n\r\nextern uint16_t level_bonus;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"level_bonus\")\r\n#endif\r\n\r\n\r\nextern uint8_t horizontal_mine_x[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\nextern uint8_t horizontal_mine_y[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\nextern uint8_t horizontal_mine_direction[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\nextern uint8_t horizontal_mine_transition[MAX_NUMBER_OF_HORIZONTAL_MINES];\r\n\r\n\r\nextern uint8_t vertical_mine_x[MAX_NUMBER_OF_VERTICAL_MINES];\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"vertical_mine_x\")\r\n#endif\r\n\r\nextern uint8_t vertical_mine_y[MAX_NUMBER_OF_VERTICAL_MINES];\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"vertical_mine_y\")\r\n#endif\r\n\r\nextern uint8_t vertical_mine_direction[MAX_NUMBER_OF_VERTICAL_MINES];\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"vertical_mine_direction\")\r\n#endif\r\n\r\nextern uint8_t vertical_mine_transition[MAX_NUMBER_OF_VERTICAL_MINES];\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"vertical_mine_transition\")\r\n#endif\r\n\r\n\r\nextern uint8_t rings;\r\n#if defined(USE_MEMORY_BUFFERS)\r\n#pragma zpsym(\"rings\")\r\n#endif\r\n\r\n// It records if one extra life was taken in bonus/secret levels\r\nextern uint8_t extra_life_achievement[9];\r\n\r\n// It records if the magic wall was created in bonus/secret levels\r\nextern uint8_t magic_wall_achievement[9];\r\n\r\n// It records if the super coin was spawned in bonus/secret/levels\r\nextern uint8_t coin_achievement[9];\r\n\r\n\r\nextern uint8_t map[XSize][YSize];\r\n\r\nextern uint8_t extra_count;\r\nextern uint8_t third_coin_achievement;\r\nextern uint8_t fourth_coin_achievement;\r\nextern uint8_t i;\r\nextern uint8_t j;\r\n\r\nextern uint8_t secret_passage[2*NUMBER_OF_MAPS];\r\n\r\n\r\n#endif // _VARIABLES_H\r\n\r\n"
  },
  {
    "path": "src/games/stinger/Makefile.stinger",
    "content": "\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c \n\nGAME_NAME := stinger\n\nPARENT_DIR = games\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\ninclude ./Makefile_common\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values"
  },
  {
    "path": "src/games/stinger/config/game_config.mk",
    "content": "#\r\n\r\nCOCO_COLOR_GFX_GAME_OPTS ?= \r\n#-DMAX_ROCKETS_ON_SCREEN=7 -DFASTER_WALL_REDRAW -DMAX_NUMBER_OF_MISSILES=3\r\n\r\nCREATIVISION_GAME_OPTS ?= -DMAX_NUMBER_OF_MISSILES=2 -DMAX_ROCKETS_ON_SCREEN=7 -DNO_BOTTOM_WALL_REDRAW\r\n\r\nGAMATE_GAME_OPTS ?= -DMAX_NUMBER_OF_MISSILES=3 -DMAX_ROCKETS_ON_SCREEN=4 \r\n#-DNO_BOTTOM_WALL_REDRAW -DNO_EXTRA_TITLE\r\n\r\nC128_Z80_80COL_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=4  -DNO_BOTTOM_WALL_REDRAW \r\n    \r\nZX81_NO_GFX_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=7 -DMAX_NUMBER_OF_MISSILES=4 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL \r\n\r\nZX81_GFX_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=2 -DMISSILE_DROP_LOOP_MASK=7 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNO_EXTRA_TITLE\r\n\r\nAPPLE2_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=4\r\n\r\nCOMX_GAME_OPTS ?= \t-DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nPECOM_GAME_OPTS ?= \t-DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=3 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nTMC600_GAME_OPTS ?= \t-DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=4 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nCPC_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=4\r\n\r\nCAMPUTERS_LYNX_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=5 -DMAX_NUMBER_OF_MISSILES=3\r\n\r\nNCURSES_GAME_OPTS ?= -DNO_EXTRA_TITLE \r\n\r\nPV1000_GAME_OPTS        ?=  -DNO_EXTRA_TITLE -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nPHC25_GAME_OPTS         ?= -DNO_DISPLAY_ITEMS -DNO_TANK_INTRO -DNO_DISPLAY_LEVEL_AT_START_UP -DNO_EXTRA_TITLE -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7 -D_XL_NO_SOUND\r\n\r\nPHC25_MONO_GAME_OPTS    ?= -DNO_DISPLAY_ITEMS -DNO_TANK_INTRO -DNO_DISPLAY_LEVEL_AT_START_UP -DNO_EXTRA_TITLE -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\nPHC25_NO_GFX_GAME_OPTS  ?= -DNO_DISPLAY_ITEMS -DNO_TANK_INTRO -DNO_DISPLAY_LEVEL_AT_START_UP -DNO_EXTRA_TITLE -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=3 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7"
  },
  {
    "path": "src/games/stinger/config/project_config.mk",
    "content": "\r\n\r\n# ATARI_COLORS=-D__USE_GREEN\r\n# ATARI5200_COLORS=-D__USE_GREEN\r\n# ATARI7800_COLORS=-D__USE_GREEN\r\n\r\n\r\nORIC_COLORS=-D__MONO_COLOR\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=130\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=25\r\n_APPLE2_HGR_SLOWDOWN=25\r\n_APPLE2ENH_HGR_SLOWDOWN=25\r\n_ATARI_SLOWDOWN=130\r\n_ATARI5200_SLOWDOWN=130\r\n_ATARI7800_SLOWDOWN=100\r\n_ATARI7800_NO_COLOR_SLOWDOWN=70\r\n_ATARI_LYNX_SLOWDOWN=480\r\n_C128_8502_80COL_SLOWDOWN=55\r\n_C16_SLOWDOWN=90\r\n_C16_CONIO_SLOWDOWN=110\r\n_C64_SLOWDOWN=90\r\n_CX16_SLOWDOWN?=100\r\n_CBM610_SLOWDOWN=100\r\n_CBM510_SLOWDOWN=100\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=300\r\n_ORIC_SLOWDOWN=60\r\n_MEGA65_SLOWDOWN=520\r\n_NES_SLOWDOWN=160\r\n_PET_SLOWDOWN=80\r\n_PCE_SLOWDOWN=650\r\n_SUPERVISION_SLOWDOWN=450\r\n_VIC20_SLOWDOWN=115\r\n\r\n\r\n# Z88DK\r\n_ABC80_SLOWDOWN=70\r\n_AQUARIUS_SLOWDOWN=35\r\n_ACE_SLOWDOWN=35\r\n_AGON_SLOWDOWN=1300\r\n_BEE_SLOWDOWN=40\r\n_C128_Z80_40COL_SLOWDOWN=16\r\n_C128_Z80_80COL_SLOWDOWN=0\r\n_CAMPUTERS_LYNX_SLOWDOWN=0\r\n_COLECO_SLOWDOWN=13\r\n_CPC_MODE0_SLOWDOWN=20\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=20\r\n_CPC_MODE2_SLOWDOWN=20\r\n_CPM_Z80_SLOWDOWN=30\r\n_CPM_INTEL8080_SLOWDOWN=30\r\n_E200_SLOWDOWN=600\r\n_G850_SLOWDOWN=200\r\n_G815_SLOWDOWN=150\r\n_GAL_SLOWDOWN=30\r\n_GAL_GFX_SLOWDOWN=20\r\n_GB_SLOWDOWN=55\r\n_GG_SLOWDOWN=50\r\n_GB_WAIT_VSYNC_SLOWDOWN=40\r\n_GL6000SL_SLOWDOWN=70\r\n_HECTORHR_SLOWDOWN=30\r\n_KC_SLOWDOWN=0\r\n_LASER500_SLOWDOWN=25\r\n_M100_SLOWDOWN=40\r\n_M5_SLOWDOWN=19\r\n_MC1000_SLOWDOWN=25\r\n_MSX_SLOWDOWN=19\r\n_MSX_FIXED_COLORS_SLOWDOWN=25\r\n_MTX500_SLOWDOWN=25\r\n_MTX512_SLOWDOWN=25\r\n_MZ_SLOWDOWN=25\r\n_PC88_SLOWDOWN=30\r\n_PHC25_SLOWDOWN=180\r\n_PV1000_SLOWDOWN=10\r\n_SAMCOUPE_SLOWDOWN=60\r\n_SC3000_SLOWDOWN=50\r\n_SMC777_SLOWDOWN=20\r\n_SMS_SLOWDOWN=40\r\n_SPECTRUM_SLOWDOWN=30\r\n_TRS80_SLOWDOWN=20\r\n_VG5K_SLOWDOWN=75\r\n_VZ200_SLOWDOWN=40 \r\n_X07_SLOWDOWN=10\r\n_Z1013_SLOWDOWN=12\r\n_Z9001_SLOWDOWN=20\r\n_ZX81_SLOWDOWN=6\r\n_ZX81_WRX_SLOWDOWN=1\r\n_ZX81_WRX128_SLOWDOWN=3\r\n_ZX81_8X6_WRX128_SLOWDOWN=4\r\n_ZX81_WRX64_SLOWDOWN=5\r\n_ZX81_8X6_WRX64_SLOWDOWN=6\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=45\r\n_DRAGON_SLOWDOWN=45\r\n_COCO3_SLOWDOWN=50\r\n_COCO_NO_GFX_SLOWDOWN=40\r\n_DRAGON_NO_GFX_SLOWDOWN=40\r\n_MO5_SLOWDOWN=50\r\n_TO7_SLOWDOWN=50\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=0\r\n_PECOM_SLOWDOWN=0\r\n_TMC600_SLOWDOWN=5\r\n_MICRO_SLOWDOWN=30\r\n_CIDELSA_SLOWDOWN=20\r\n\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN=40\r\n\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=100\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=4\r\n_TERMINAL_SLOWDOWN=5\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=150\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=160"
  },
  {
    "path": "src/games/stinger/docs/empty_stinger1.txt",
    "content": "................\r\n................\r\n................\r\n................\r\n..########......\r\n.#.......#.#....\r\n###.......#.....\r\n.#.......#.#...."
  },
  {
    "path": "src/games/stinger/docs/empty_stinger2.txt",
    "content": "................\r\n................\r\n................\r\n................\r\n......########..\r\n....#.#.......#.\r\n.....#.......###\r\n....#.#.......#."
  },
  {
    "path": "src/games/stinger/docs/score.txt",
    "content": "\r\n\r\n#define EXTRA_POINTS 100 -> 80 (**)\r\n#define RECHARGE_POINTS 25\r\n#define POWERUP_POINTS 30\r\n#define FREEZE_POINTS 60 -> 100       (more than extra points)\r\n#define SECRET_ITEM_POINTS 250 -> 500 (to compensate for the loss of points due to conversion)\r\n\r\n#define POWER_UP_BONUS 25 -> 100 (*)\r\n#define LEVEL_BONUS 200\r\n\r\n#define LIGHT_TANK_POINTS 10\r\n#define HEAVY_TANK_1_POINTS 15\r\n#define HEAVY_TANK_2_POINTS 25\r\n#define HEAVY_TANK_3_POINTS 30\r\n#define ARTILLERY_POINTS 50\r\n\r\n// level 1:  40 = 40 +   0 -> light \r\n// level 2:  60 = 32 +  28 -> light,  medium 100% \r\n// level 3:  70 = 24 +  46 -> light,  medium  50%, stealth 50%\r\n// level 4:  80 = 16 +  64 -> light,  medium  25%, stealth 25%, heavy 50%\r\n// level 5:  99 =  8 +  92 -> light,  medium  25%, stealth 25%, heavy 25%, artillery 25%\r\n// level 6:  99 =  0 +  99 -> light,  medium   0%, stealth 25%, heavy 50%, artillery 25% (medium if secret item is taken)\r\n\r\nmedium   = 28 + 0.5 46 + 0.25 64 + 0.25 92           = 28 + 23 + 16 + 23      =  90 ->  90  15 = 1350\r\nstealth  =      0.5 46 + 0.25 64 + 0.25 92 + 0.25 99 =      23 + 16 + 23 + 24 =  86 ->  86  25 = 2150\r\nheavy    =             + 0.5  64 + 0.25 92 + 0.50 99 =           32 + 23 + 48 = 103 -> 103  30 = 3090\r\nhowitzer =                       + 0.25 92 + 0.25 99 =                23 + 24 =  47 ->  47  50 = 2350\r\n                                                                                                  ----\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  8940\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \r\nheavy-type tanks = 90 + 86 + 103 + 47 = 326 -> 326 / 4 = 81.5\r\n\r\nPoints from items dropped from heavy-like tanks:\r\n81 100 + 81 100 + 81 25 + 81 30 = 20655 -> 17515 (**)\r\n\r\nLevel bonus from rings: \r\nrings: 81 -> 81 25 = 2025 -> 8100 (*)\r\n\r\nLevel bonus = 200 x 6 = 1200\r\n\r\nlight   = 40 + 32 + 24 + 16 + 8 = 120 x 10 = 1200\r\n\r\nTotal points estimate excluding freeze, secret, final bonus, items dropped from light tanks = 34020\r\n\r\n\r\nMax possible number of items dropped from light: 120\r\n\r\n\r\n-----------\r\n\r\n\r\n#define RED_FIRE_POWER_VALUE 2\r\n#define YELLOW_FIRE_POWER_VALUE 3\r\n#define GREEN_FIRE_POWER_VALUE 4\r\n\r\n#define LIGHT_TANK_ENERGY 4 -> 3 (*)\r\n\r\nconst uint8_t rank_energy[5] = {LIGHT_TANK_ENERGY,7,11,17,12}; // \r\n\r\n\r\n\r\nRED:\r\nHits: 2, 4, 6, 9, 6\r\n\r\nYELLOW:\r\nHits: 1, 3, 4, 6, 4\r\n\r\nGREEN:\r\nHits: 1, 2, 3, 5, 3\r\n\r\n\r\nYELLOW CHANGE:\r\nHits: 2 -> 1 (*), 3, 4, 9 ,6 , 4\r\n"
  },
  {
    "path": "src/games/stinger/docs/stinger.txt",
    "content": ".....##.....\r\n....####....\r\n....####....\r\n.....##.....\r\n..########..\r\n.#...##..#.#\r\n###..##...#.\r\n.#.......#.#\r\n\r\n\r\n.....##.....\r\n....####....\r\n....####....\r\n.....##.....\r\n..########..\r\n#.#..##...#.\r\n.#...##..###\r\n#.#.......#.\r\n\r\n\r\n............\r\n............\r\n............\r\n............\r\n..########..\r\n.#.......#.#\r\n###.......#.\r\n.#.......#.#\r\n\r\n\r\n............\r\n............\r\n............\r\n............\r\n..########..\r\n#.#.......#.\r\n.#.......###\r\n#.#.......#."
  },
  {
    "path": "src/games/stinger/docs/stinger1.txt",
    "content": ".....##.........\r\n....####........\r\n....####........\r\n.....##.........\r\n..########......\r\n.#...##..#.#....\r\n###..##...#.....\r\n.#.......#.#...."
  },
  {
    "path": "src/games/stinger/docs/stinger2.txt",
    "content": ".........##.....\r\n........####....\r\n........####....\r\n.........##.....\r\n......########..\r\n....#.#..##...#.\r\n.....#...##..###\r\n....#.#.......#."
  },
  {
    "path": "src/games/stinger/images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n#include \"cross_lib.h\"\n\n\n    #define LIGHT_TANK_TILE_0 _TILE_0\n    #define LIGHT_TANK_TILE_1 _TILE_1\n    #define LIGHT_TANK_TILE_2 _TILE_2\n    #define LIGHT_TANK_TILE_3 _TILE_3\n    #define LIGHT_TANK_TILE_4 _TILE_4\n    #define LIGHT_TANK_TILE_5 _TILE_5\n    #define LIGHT_TANK_TILE_6 _TILE_6\n    \n    #define TANK_DEATH_TILE _TILE_7\n    #define POWER_UP_TILE _TILE_8\n    \n    #define LOADED_STINGER_LEFT_TILE_0 _TILE_9\n    #define LOADED_STINGER_RIGHT_TILE_0 _TILE_10\n\n    #define LOADED_STINGER_LEFT_TILE_1 _TILE_11\n    #define LOADED_STINGER_RIGHT_TILE_1 _TILE_12\n    \n    #define EMPTY_STINGER_LEFT_TILE_0 _TILE_13\n    #define EMPTY_STINGER_RIGHT_TILE_0 _TILE_10\n\n    #define EMPTY_STINGER_LEFT_TILE_1 _TILE_11\n    #define EMPTY_STINGER_RIGHT_TILE_1 _TILE_16\n\n    #define ROCKET_TILE_0 _TILE_17\n    #define ROCKET_TILE_1 _TILE_18\n    \n    #define HEAVY_TANK_TILE_0 _TILE_19\n    \n\t#define HEAVY_TANK_TILE_1 _TILE_1\n    #define HEAVY_TANK_TILE_2 _TILE_22\n\t\n    #define HEAVY_TANK_TILE_3 _TILE_3\n    #define HEAVY_TANK_TILE_4 _TILE_21\n    \n\t#define HEAVY_TANK_TILE_5 _TILE_5\n    #define HEAVY_TANK_TILE_6 _TILE_20\n\n    #define BULLET_TILE _TILE_26\n    \n    #define FREEZE_TILE _TILE_23\n    #define WALL_TILE _TILE_24\n    \n    #define EXTRA_POINTS_TILE _TILE_25\n    \n    #define SECRET_TILE HEAVY_TANK_TILE_0\n\t\n\t#define MORTAR_TILE _TILE_14\n    #define EXPLOSION_TILE _TILE_15\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/games/stinger/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS STINGER by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#include \"images.h\"\n\n// #define TRAINER 1\n//#define BENCHMARK\n\n#define INITIAL_LEVEL 0\n\n#define LAST_LEVEL 5\n#define INITIAL_LIVES 3\n#define MAX_LIVES 9\n\n#if !defined(MAX_NUMBER_OF_MISSILES)\n\t#if _XL_SLOW_DOWN_FACTOR<=1\n\t\t#define MAX_NUMBER_OF_MISSILES 3\n\t#elif _XL_SLOW_DOWN_FACTOR<=30\n\t\t#define MAX_NUMBER_OF_MISSILES 4\n\t#elif _XL_SLOW_DOWN_FACTOR<=50\n\t\t#define MAX_NUMBER_OF_MISSILES 5\n\t#else\n\t\t#define MAX_NUMBER_OF_MISSILES 6\n\t#endif\n#endif\n#define MAX_NUMBER_OF_EXTRA_POINTS MAX_NUMBER_OF_MISSILES\n\n\n#if !defined(MAX_ROCKETS_ON_SCREEN)\n\t#if _XL_SLOW_DOWN_FACTOR<=1\n\t\t#define MAX_ROCKETS_ON_SCREEN 5\n\t#elif _XL_SLOW_DOWN_FACTOR<=30\n\t\t#define MAX_ROCKETS_ON_SCREEN 6\t\t\n\t#elif _XL_SLOW_DOWN_FACTOR<=50\n\t\t#define MAX_ROCKETS_ON_SCREEN 7\n\t#else\n\t\t#define MAX_ROCKETS_ON_SCREEN 8\n\t#endif\t\n#endif\n\n\n#if !defined(DEATH_LOOP)\n\t#if _XL_SLOW_DOWN_FACTOR<=1\n\t\t#define DEATH_LOOP 1\n\t#elif _XL_SLOW_DOWN_FACTOR<=10\n\t\t#define DEATH_LOOP 2\n\t#elif _XL_SLOW_DOWN_FACTOR<=30\n\t\t#define DEATH_LOOP 3\n\t#elif _XL_SLOW_DOWN_FACTOR<=50\n\t\t#define DEATH_LOOP 4\n\t#else\n\t\t#define DEATH_LOOP 5\n\t#endif\n#endif\n\n\n#define LIGHT_TANKS_ON_FIRST_LEVEL 40\n\n#define HEAVY_TANKS_0 0\n#define HEAVY_TANKS_1 28\n#define HEAVY_TANKS_2 46\n#define HEAVY_TANKS_3 64\n#define HEAVY_TANKS_4 91\n#define HEAVY_TANKS_5 99\n\n// #define HEAVY_TANKS_5 1\n\n\n#define NEXT_EXTRA_LIFE 5000U\n\n#if YSize>10\n    #define STINGER_Y ((YSize)-3)\n    #define POWER_UPS_Y ((STINGER_Y)+2)\n    #define BOTTOM_WALL_Y ((STINGER_Y)+1)\n\n#else\n    #define STINGER_Y ((YSize)-1)\n    // #define POWER_UPS_Y ((STINGER_Y))\n    // #define BOTTOM_WALL_Y ((STINGER_Y))\n#endif\n#define MAX_STINGER_X ((XSize)*2-3)\n// #define POWER_UPS_Y ((STINGER_Y)+2)\n\n// #if YSize<=10\n    // #define WALL_Y ((YSize)/2)\n// #elif YSize<=16\n    // #define WALL_Y ((YSize)-8)\n// #else\n    // #define WALL_Y ((YSize)-6)\n// #endif\n\n\n#if YSize>=18\n    #define INITIAL_RESPAWN_TANK_Y (((YSize)/2)-5)\n#elif YSize>=16\n    #define INITIAL_RESPAWN_TANK_Y (((YSize)/2)-4)\n#elif YSize>10\n    #define INITIAL_RESPAWN_TANK_Y (((YSize)/2)-3)\n#else \n    #define INITIAL_RESPAWN_TANK_Y (((YSize)/2)-2)\n#endif\n\n// #define BOTTOM_WALL_Y ((STINGER_Y)+1)\n\n#define POWER_THRESHOLD 4\n\n\n#define AUTO_RECHARGE_COOL_DOWN 50\n#define AUTO_ROCKET_RECAHRGE 9\n\n#define MAX_FREEZE 1\n\n#define LIGHT_TANK_POINTS 10\n#define HEAVY_TANK_1_POINTS 15\n#define HEAVY_TANK_2_POINTS 25\n#define HEAVY_TANK_3_POINTS 30\n#define ARTILLERY_POINTS 50\n\n#define EXTRA_POINTS 80\n#define RECHARGE_POINTS 25\n#define POWERUP_POINTS 30\n#define FREEZE_POINTS 100\n#define SECRET_ITEM_POINTS 250U\n\n#define POWER_UP_BONUS 100\n// #define LEVEL_BONUS 200\n\n\n#define RED_FIRE_POWER_VALUE 2\n#define YELLOW_FIRE_POWER_VALUE 3\n#define GREEN_FIRE_POWER_VALUE 4\n\n#define INITIAL_STINGER_RELOAD_LOOPS 8\n#define RED_SPEED_VALUE INITIAL_STINGER_RELOAD_LOOPS\n#define YELLOW_SPEED_VALUE 5\n#define GREEN_SPEED_VALUE 3\n// #define HYPER_SPEED_VALUE 2\n\n// #define RED_RANGE_VALUE INITIAL_ROCKET_RANGE\n// #define YELLOW_RANGE_VALUE ((INITIAL_ROCKET_RANGE)-2)\n\n#if YSize>10\n    #define MAX_RANGE_VALUE ((INITIAL_RESPAWN_TANK_Y)-1)\n#else\n    #define MAX_RANGE_VALUE ((INITIAL_RESPAWN_TANK_Y)-0)\n#endif\n\n// #define INITIAL_ROCKET_RANGE ((INITIAL_TANK_Y)+1)\n#define ITEM_SPAWN_CHANCE 11000U\n\n// (2 basic hits)\n#define LIGHT_TANK_ENERGY 3\n\n// Boss energy: 7 (4 basic hits), 9 (5 basic hits), 11 (6 basic hits)\n#define HEAVY_TANK_BASE_ENERGY 5\n\n#define MAX_ROCKETS 99\n#define HYPER_RECHARGE 40\n#define ROCKET_RECHARGE 20\n\n#define FREEZE_COUNTER_MAX 150\n\n#define WALL_COLOR _XL_GREEN\n#define FREEZE_COLOR _XL_CYAN\n#define SECRET_COLOR _XL_GREEN\n\n#define LEFT_DIRECTION 0\n#define RIGHT_DIRECTION 1\n#define ACCELERATION_THRESHOLD 10\n\nuint8_t fire_pressed;\nuint8_t time_counter;\n\nuint8_t level_count_down;\n\nuint8_t max_occupied_columns;\n\nuint8_t heavy_tank_counter;\n\nuint8_t rank;\n\nuint8_t direction;\n\n// uint8_t switch_counter\n// uint8_t acceleration;\n// uint8_t acceleration_counter;\n\n// Re-use variables used in intro\n#define switch_counter direction\n#define acceleration fire_pressed\n#define acceleration_counter time_counter\n#define speed_value fire_pressed\n#define power_value time_counter\n\n#if !defined(_XL_NO_COLOR)\nuint8_t wall_color;\n#endif\n\n#if !defined(_XL_NO_COLOR)\n\t#define set_wall_color(color) wall_color=color\n#else\n\t#define set_wall_color(color)\n#endif\n\nuint8_t extra_points_counter;\n\nconst uint8_t level_color[2] = {_XL_GREEN, _XL_YELLOW};\n\n#if XSize<=40\n    #define MAX_SPARSELY_OCCUPIED_COLUMNS (3*(XSize)/5)\n#else\n    #define MAX_SPARSELY_OCCUPIED_COLUMNS (2*(XSize)/3)\n#endif\n\n#if XSize<=40\n    #define MAX_DENSILY_OCCUPIED_COLUMNS ((XSize-2-3)-LAST_LEVEL)\n#else\n    #define MAX_DENSILY_OCCUPIED_COLUMNS ((XSize-2-6)-LAST_LEVEL)\n#endif\n\n\n#define HELP_ITEM_LEVEL_THRESHOLD 3\n#define HELP_ITEM_POWER_THRESHOLD 1\n#define HELP_ITEM_POWER_UPPER_THRESHOLD 15\n\n#if XSize<64\n    #define HEAVY_TANKS_ON_FIRST_LEVEL (XSize)\n#else\n    #define HEAVY_TANKS_ON_FIRST_LEVEL 50\n#endif\n\n\n// level 1:  40 = 40 +   0 -> light \n// level 2:  60 = 32 +  28 -> light,  medium 100% \n// level 3:  70 = 24 +  46 -> light,  medium  50%, stealth 50%\n// level 4:  80 = 16 +  64 -> light,  medium  25%, stealth 25%, heavy 50%\n// level 5:  99 =  8 +  92 -> light,  medium  25%, stealth 25%, heavy 25%, artillery 25%\n// level 6:  99 =  0 +  99 -> light,  medium   0%, stealth 25%, heavy 50%, artillery 25% (medium if secret item is taken)\nconst uint8_t heavy_tanks_on_level[LAST_LEVEL+1] = {HEAVY_TANKS_0,HEAVY_TANKS_1,HEAVY_TANKS_2,HEAVY_TANKS_3,HEAVY_TANKS_4,HEAVY_TANKS_5};//99};//91,99}; //99};\n\n#define LEVEL_2_TANK_THRESHOLD 8\n\n#define MAX_HYPER_COUNTER 200\n\n\n\n#if YSize>=20\n    #define HEIGHT_SHOOT_THRESHOLD YSize-10\n#elif YSize>=16\n    #define HEIGHT_SHOOT_THRESHOLD YSize-9\n#elif YSize>10\n    #define HEIGHT_SHOOT_THRESHOLD YSize-8\n#else\n    #define HEIGHT_SHOOT_THRESHOLD 3\n#endif\n\n#define VERY_FAST_TANK_SHOOT_MASK 1\n\n#define FAST_TANK_SHOOT_MASK 3\n\n#define SLOW_TANK_SHOOT_MASK 15\n\n#define MAX_TANK_LEVEL 3\n\n#define INITIAL_ARTILLERY_LEVEL 3\n\nuint8_t tank_shoot_speed_mask;\n\nuint16_t next_threshold;\n\nuint8_t main_loop_counter;\n\nuint8_t forced_tank;\n\nuint8_t forced_tank_x;\n\nuint8_t hyper_counter;\n\nuint8_t item_counter;\n\nconst uint8_t tank_points[] = \n{ \n    LIGHT_TANK_POINTS, // Skeletons\n    HEAVY_TANK_1_POINTS, // Ogre\n    HEAVY_TANK_2_POINTS, // Ghosts\n    HEAVY_TANK_3_POINTS, // Demons\n    ARTILLERY_POINTS,\n};\n\n uint8_t light_tanks_to_kill;\n uint8_t heavy_tanks_to_kill;\n // uint8_t artillery_to_kill;\n\n uint8_t lives;\n uint8_t level;\n uint8_t killed_light_tanks;\n uint8_t killed_heavy_tanks;\n uint8_t killed_artillery;\n\n uint8_t heavy_tanks_to_spawn;\n uint8_t light_tanks_to_spawn;\n\n uint8_t auto_recharge_counter;\n\n#if !defined(_XL_NO_COLOR)\n     uint8_t rocket_display_color;\n#endif\n\n#if !defined(_XL_NO_COLOR) && !defined(_XL_NO_TEXT_COLOR)\n const uint8_t power_up_color[3] = {_XL_RED, _XL_YELLOW, _XL_GREEN};\n#endif\n\n#if !defined(_XL_NO_COLOR)\n const uint8_t rocket_color[3] = {_XL_CYAN, _XL_WHITE, _XL_YELLOW };\n#endif\n\n uint8_t freeze;\n uint8_t powerUp;\n\n uint8_t number_of_rockets_per_shot;\n\n uint8_t tank_y_array[XSize];\n uint8_t tank_shape[XSize];\n uint8_t tank_x; // To be used as an index to the current tank\n // uint8_t tank_active[XSize];\n\n#define tank_active tank_y_array\n\n uint8_t energy[XSize];\n uint8_t tank_level[XSize];\n \n // Red hits    (2): 2, 4, 6, 9, 6\n // Yellow hits (3): 1, 3, 4, 6, 4\n // Green hits  (4): 1, 2, 3, 5, 3\n const uint8_t rank_energy[5] = {LIGHT_TANK_ENERGY,7,11,17,12};\n\n uint8_t fire_power;\n\n uint8_t freeze_locked;\n uint8_t secret_locked;\n\n\nuint8_t tank_move_speed_mask;\n\n// #if !defined(_XL_NO_UDG)\n const uint8_t tank_tile[7+1] = \n{\n    LIGHT_TANK_TILE_0, // 0\n    LIGHT_TANK_TILE_0, // 1\n    LIGHT_TANK_TILE_1, // 2\n    LIGHT_TANK_TILE_2, // 3\n    LIGHT_TANK_TILE_3, \n    LIGHT_TANK_TILE_4, \n    LIGHT_TANK_TILE_5, \n    LIGHT_TANK_TILE_6\n};\n\n const uint8_t heavy_tank_tile[7+1] =\n{\n    HEAVY_TANK_TILE_0,\n    HEAVY_TANK_TILE_0,\n    HEAVY_TANK_TILE_1,\n    HEAVY_TANK_TILE_2,\n    HEAVY_TANK_TILE_3,\n    HEAVY_TANK_TILE_4,\n    HEAVY_TANK_TILE_5,\n    HEAVY_TANK_TILE_6,\n};\n// #endif\n\n const uint8_t stinger_tile[8] =\n{\n    EMPTY_STINGER_LEFT_TILE_0,\n    EMPTY_STINGER_RIGHT_TILE_0,\n    EMPTY_STINGER_LEFT_TILE_1,\n    EMPTY_STINGER_RIGHT_TILE_1,\n    LOADED_STINGER_LEFT_TILE_0,\n    LOADED_STINGER_RIGHT_TILE_0,\n    LOADED_STINGER_LEFT_TILE_1,\n    LOADED_STINGER_RIGHT_TILE_1,\n};\n\n const uint8_t rocket_tile[2] =\n{\n    ROCKET_TILE_0,\n    ROCKET_TILE_1,\n};\n\n uint8_t stinger_x; // range: 0..2*XSize-2^M\n uint8_t stinger_shape_tile;\n uint8_t stinger_color;\n\n uint8_t input;\n\n uint8_t loaded_stinger;\n // uint8_t active_rocket[MAX_ROCKETS_ON_SCREEN];\n uint8_t rocket_shape[MAX_ROCKETS_ON_SCREEN];\n uint8_t rocket_x[MAX_ROCKETS_ON_SCREEN];\n uint8_t rocket_y[MAX_ROCKETS_ON_SCREEN];\n uint8_t remaining_rockets;\n \n #define active_rocket rocket_y\n // uint8_t rocket_range;\n\n uint8_t stinger_reload_loops;\n\n uint8_t next_rocket;\n uint8_t rockets_on_screen;\n uint8_t stinger_load_counter;\n uint8_t alive;\n\n uint16_t score;\n uint16_t hiscore;\n\nstruct  ItemStruct\n{\n    uint8_t _x;\n    uint8_t _y;\n    uint8_t _tile;\n    #if !defined(_XL_NO_COLOR)\n    uint8_t _color;\n    #endif\n    uint8_t _active;\n    uint8_t _counter;\n    void(*_effect)(void);\n} ;\ntypedef struct ItemStruct Item;\ntypedef struct ItemStruct Missile;\n\n Item rechargeItem;\n Item freezeItem;\n Item powerUpItem;\n Item secretItem;\n\n// #if !defined(NO_EXTRA_TITLE)\n\n#define NUMBER_OF_ITEMS 4\n\n const uint8_t item_tile[NUMBER_OF_ITEMS][2] = \n{\n    { POWER_UP_TILE, _XL_WHITE },\n    { ROCKET_TILE_0, _XL_YELLOW },\n    { EXTRA_POINTS_TILE, _XL_YELLOW },\n    { FREEZE_TILE, _XL_CYAN },\n};\n\n const char item_name[NUMBER_OF_ITEMS][9] = \n{\n    _XL_P _XL_O _XL_W _XL_E _XL_R _XL_SPACE _XL_U _XL_P,\n    _XL_R _XL_O _XL_C _XL_K _XL_E _XL_T _XL_S,\n    _XL_P _XL_O _XL_I _XL_N _XL_T _XL_S,\n    _XL_F _XL_R _XL_E _XL_E _XL_Z _XL_E,\n};\n// #endif\n\n// #if !defined(NO_EXTRA_TITLE)\n const uint8_t enemy_tile[5][2] = \n{\n    { LIGHT_TANK_TILE_0, _XL_WHITE },\n    { HEAVY_TANK_TILE_0, _XL_GREEN },\n    { TANK_DEATH_TILE, _XL_YELLOW },\n    { HEAVY_TANK_TILE_0, _XL_RED },\n    { MORTAR_TILE, _XL_GREEN },\n};\n\n const char enemy_name[5][9] = \n{\n    \"LIGHT\",\n    \"MEDIUM\",\n    \"STEALTH\",\n    \"HEAVY\",\n    \"HOWITZER\",\n};\n// #endif\n\n\nMissile enemyMissile[MAX_NUMBER_OF_MISSILES];\nItem extraPointsItem[MAX_NUMBER_OF_EXTRA_POINTS];\n\n// uint8_t artillery_shell_active;\nuint8_t artillery_shell_x;\nuint8_t artillery_shell_y;\n\n#define artillery_shell_active artillery_shell_y\n\nvoid short_sleep(void)\n{\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n}\n\nvoid less_short_sleep(void)\n{\n    _XL_SLOW_DOWN(3*_XL_SLOW_DOWN_FACTOR);\n}\n\n\nvoid one_second(void)\n{\n    _XL_SLEEP(1);\n}\n\n\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\n{\n    _XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);    \n}\n\n\n#define PRINT_CENTERED(Text) \\\n    PRINT_CENTERED_ON_ROW((YSize>>1), Text)\n\n\n\n\nvoid sleep_and_wait_for_input(void)\n{\n    less_short_sleep();\n    _XL_WAIT_FOR_INPUT();\n}\n\n#if XSize>=26\n    #define POWER_X 8\n#else\n    #define POWER_X 6\n#endif\n\n#if XSize>=22\n    #define POWER_UP_X 10\n#elif XSize>=20\n    #define POWER_UP_X 9\n#else\n    #define POWER_UP_X 10\n#endif\n\n\nvoid display_power_up_counter(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(POWER_UP_X+1,0,2,powerUp);\n}\n\n#if XSize>=28\n    #define TANK_COUNTER_X (POWER_UP_X+4)\n    #define TANK_COUNTER_Y 0\n#elif XSize>=26\n    #define TANK_COUNTER_X (POWER_X+7)\n    #define TANK_COUNTER_Y (YSize-1)\n#elif XSize>=22\n    #define TANK_COUNTER_X (POWER_X+6)\n    #define TANK_COUNTER_Y (YSize-1)\n#else\n    #define TANK_COUNTER_X (POWER_X+5)\n    #define TANK_COUNTER_Y (YSize-1)\n#endif\n\n#if XSize>=20   \n    void display_enemy_counter(void)\n    {\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\n        _XL_PRINTD(TANK_COUNTER_X+1,TANK_COUNTER_Y,2,light_tanks_to_kill+heavy_tanks_to_kill);\n    }\n#else\n     #define display_enemy_counter()\n#endif\n\nvoid display_remaining_rockets(void)\n{\n\t#if !defined(_XL_NO_COLOR)\n    uint8_t color;\n    \n    if(remaining_rockets<20)\n    {\n        color = _XL_RED;\n    }\n    else\n    {\n        color = _XL_WHITE;\n    }\n    _XL_SET_TEXT_COLOR(color);\n\t#endif\n    _XL_PRINTD(7,0,2,remaining_rockets);\n}\n\n\nvoid recharge_rockets(uint8_t value)\n{\n    remaining_rockets+=value;\n    if(remaining_rockets>MAX_ROCKETS)\n    {\n        remaining_rockets=MAX_ROCKETS;\n    }\n    display_remaining_rockets();\n}\n\n\nvoid display_score(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(0,0,5,score);\n}\n\n#define LIVES_X (XSize-3)\n\n#if YSize<=10\n    #define display_lives(color)\n#elif !defined(_XL_NO_TEXT_COLOR)\n    void display_lives(uint8_t color)\n    {\n        _XL_DRAW(LIVES_X,POWER_UPS_Y,stinger_tile[4+0+stinger_shape_tile],_XL_CYAN);\n        _XL_DRAW(LIVES_X+1,POWER_UPS_Y,stinger_tile[1+4+stinger_shape_tile],_XL_CYAN);\n        _XL_SET_TEXT_COLOR(color);\n        _XL_PRINTD(LIVES_X+2,POWER_UPS_Y,1,lives);\n    }\n#else\n    #define display_lives(color) \\\n    { \\\n        _XL_DRAW(LIVES_X,POWER_UPS_Y,stinger_tile[4+0+stinger_shape_tile],_XL_CYAN); \\\n        _XL_DRAW(LIVES_X+1,POWER_UPS_Y,stinger_tile[1+4+stinger_shape_tile],_XL_CYAN); \\\n        _XL_PRINTD(LIVES_X+2,POWER_UPS_Y,1,lives); \\\n    } \n#endif\n\n\n#if !defined(_XL_NO_COLOR)\n    #define _extra_life_color_effect(color) display_lives(color) \n#else\n    #define _extra_life_color_effect(color)\n#endif\n\n\nvoid display_stinger(void)\n{\n    _XL_DRAW((stinger_x>>1),STINGER_Y,stinger_tile[4*loaded_stinger+0+stinger_shape_tile],stinger_color);\n    _XL_DRAW((stinger_x>>1)+1,STINGER_Y,stinger_tile[1+4*loaded_stinger+stinger_shape_tile],stinger_color);  \n}\n\n\n#if !defined(_XL_NO_COLOR)\n\t#define set_tank_color(tank_color) color=tank_color\n#else\n\t#define set_tank_color(tank_color)\n#endif\n\nvoid display_tank(void)\n{\n    uint8_t status = tank_shape[tank_x];\n    uint8_t pos = tank_y_array[tank_x];\n\t#if !defined(_XL_NO_COLOR)\n    uint8_t color;\n\t#endif\n    uint8_t tile0;\n\n    tile0 = HEAVY_TANK_TILE_0;\n\n    if(tank_level[tank_x]==1)\n    {\n        set_tank_color(_XL_GREEN);\n    }\n    else if(tank_level[tank_x]==2)\n    {\n        if(!freeze)\n        {\n            tile0 = TANK_DEATH_TILE;\n            set_tank_color(_XL_YELLOW);\n        }\n    }\n    else if(!tank_level[tank_x])\n    {\n        tile0 = LIGHT_TANK_TILE_0;\n        set_tank_color(_XL_WHITE);\n    }\n    else if(tank_level[tank_x]==3)\n    {\n        set_tank_color(_XL_RED);\n    }\n    else \n    {\n        // tile0 = MORTAR_TILE;\n        if(tank_level[tank_x]==4)\n        {\n            set_tank_color(_XL_GREEN);\n        }\n        else\n        {\n            set_tank_color(_XL_RED);\n        }\n    }\n    if(freeze)\n    {\n        set_tank_color(_XL_CYAN);  \n    }\n\n    if(tank_level[tank_x]<=MAX_TANK_LEVEL)\n    {\n        if(!status)\n        {\n            _XL_DELETE(tank_x, tank_y_array[tank_x]-1);\n            _XL_DRAW(tank_x, pos, tile0, color);\n        }\n        else\n        {\n            // #if !defined(_XL_NO_UDG)\n            uint8_t tile1;\n\n            if(!tank_level[tank_x])\n            {\n                tile0 = tank_tile[status<<1];\n                tile1 = tank_tile[1+(status<<1)];\n            }\n            else\n            {\n                tile0 = heavy_tank_tile[status<<1];\n                tile1 = heavy_tank_tile[1+(status<<1)]; \n            }\n            _XL_DRAW(tank_x, pos, tile0, color);\n            _XL_DRAW(tank_x,1 + pos, tile1, color);\n            // #else\n\n            // if(!tank_level[tank_x])\n            // {\n                \n                // tile0 = LIGHT_TANK_TILE_0;\n            // }\n            // else\n            // {\n                // if((tank_y_array[tank_x])&1)\n                // {\n                    // tile0 = HEAVY_TANK_TILE_0;\n                // }\n                // else\n                // {\n                    // tile0 = HEAVY_TANK_TILE_1;\n                // }\n            // }\n            // _XL_DRAW(tank_x, pos, tile0, color);\n            // #endif\n        }\n    }\n    else\n    {\n        _XL_DRAW(tank_x, pos, MORTAR_TILE, color);\n    }\n}\n\n\n#define handle_extra_life() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        if(score>=next_threshold) \\\n        { \\\n            if(lives<MAX_LIVES) \\\n            { \\\n                ++lives; \\\n            } \\\n            next_threshold+=NEXT_EXTRA_LIFE; \\\n            _XL_PING_SOUND(); \\\n            \\\n            for(i=0;i<16;++i) \\\n            { \\\n                stinger_color = _XL_YELLOW; \\\n                display_stinger(); \\\n                _extra_life_color_effect(_XL_RED); \\\n                short_sleep(); \\\n                stinger_color = _XL_CYAN; \\\n                display_stinger(); \\\n                _extra_life_color_effect(_XL_YELLOW); \\\n                short_sleep(); \\\n            } \\\n            _XL_PING_SOUND(); \\\n            display_lives(_XL_WHITE); \\\n        } \\\n    } while(0)\n\n\nvoid increase_score(uint8_t value)\n{\n    score+=value;\n    display_score();\n    handle_extra_life();\n}\n\nvoid recharge_effect(void)\n{\n    recharge_rockets(ROCKET_RECHARGE);\n    increase_score(RECHARGE_POINTS);\n    #if YSize>10\n    PRINT_CENTERED_ON_ROW(2,\"        \");\n    #endif\n}\n\n\n#define RANGE_X 0\n\n#if defined(_XL_NO_TEXT_COLOR)\n\t#if XSize<=20\n\t\t#define SPEED_STRING \"SPD\"\n\t\t#define POWER_STRING \"PWR\"\n\t#else\n\t\t#define SPEED_STRING \"SPEED\"\n\t\t#define POWER_STRING \"POWER\"\n\t#endif\n#else\n\t#if XSize<=17\n\t\t#define SPEED_STRING \"SPD\"\n\t\t#define POWER_STRING \"PWR\"\n\t#else\n\t\t#define SPEED_STRING \"SPEED\"\n\t\t#define POWER_STRING \"POWER\"\n\t#endif\n#endif\n\n\n#if XSize>=31\n    #define ROCKETS_X (XSize-7)\n#else\n    #define ROCKETS_X (XSize-6)\n#endif\n\n#define SPEED_X 0\n\n\nuint8_t find_inactive(Item* itemArray)\n{\n    uint8_t i;\n    \n    for(i=0;i<MAX_NUMBER_OF_MISSILES;++i)\n    {\n        // _XL_PRINTD(i*3,YSize-5,1,itemArray[i]._active);\n        \n        if(!itemArray[i]._active)\n        {\n            return i;\n        }\n\n    }\n    return MAX_NUMBER_OF_MISSILES;\n}\n\n#if YSize<=10\n    #define display_power_ups()\n#elif !defined(_XL_NO_COLOR) && !defined(_XL_NO_TEXT_COLOR)\nvoid display_power_ups(void)\n{\n    uint8_t speed_color;\n    uint8_t color;\n\n    uint8_t power_color;\n    \n    uint8_t i;\n    \n    speed_color = _XL_RED;\n    rocket_display_color = _XL_CYAN;\n    power_color = _XL_RED;\n    \n    if(powerUp<2) // speed\n    {\n        speed_color = power_up_color[powerUp];\n    }\n    else\n    {\n        speed_color = _XL_GREEN;\n\n        if(powerUp<4)\n        {\n            power_color = power_up_color[powerUp-2];\n            rocket_display_color = rocket_color[powerUp-2];\n        }\n        else\n        {\n            power_color = _XL_GREEN;\n            rocket_display_color = _XL_YELLOW;\n        }\n\n    }\n\n    _XL_SET_TEXT_COLOR(speed_color);\n    _XL_PRINT(SPEED_X,POWER_UPS_Y,SPEED_STRING);\n    \n    _XL_SET_TEXT_COLOR(power_color);\n    _XL_PRINT(POWER_X,POWER_UPS_Y,POWER_STRING);\n\n    for(i=0;i<3;++i)\n    {\n        if(i<=number_of_rockets_per_shot-1)\n        {\n           color = rocket_display_color;\n        }\n        else\n        {\n           color = _XL_RED;\n        }\n        _XL_DRAW(ROCKETS_X+i,POWER_UPS_Y,ROCKET_TILE_0,color);\n    }\n}\n#elif !defined(_XL_NO_COLOR) // COLOR but NO TEXT COLOR\n\n#if XSize<=20\n\t#define STR_LEN 3\n#else\n\t#define STR_LEN 5\n#endif\n\n#if YSize>10\nvoid display_power_ups(void)\n{\n    uint8_t color;\n    \n    uint8_t i;\n    \n    rocket_display_color = _XL_CYAN;    \n    speed_value = 1;\n    power_value = 1;\n    \n    {\n\n        if(powerUp<2) // speed\n        {\n            speed_value = powerUp+1;\n        }\n        else\n        {\n            speed_value = 3;\n    \n            if(powerUp<4)\n            {\n\t\t\t\tpower_value = powerUp-1;\n            }\n\t\t\telse\n\t\t\t{\n\t\t\t\tpower_value = 3;\n\t\t\t}\n        }\n    }\n\n    _XL_PRINT(SPEED_X,POWER_UPS_Y,SPEED_STRING);\n    _XL_PRINTD(SPEED_X+STR_LEN,POWER_UPS_Y,1,speed_value);\n    \n    _XL_PRINT(POWER_X,POWER_UPS_Y,POWER_STRING);\n    _XL_PRINTD(POWER_X+STR_LEN,POWER_UPS_Y,1,power_value);\n\n    for(i=0;i<3;++i)\n    {\n        if(i<=number_of_rockets_per_shot-1)\n        {\n           color = rocket_display_color;\n        }\n        else\n        {\n           color = _XL_RED;\n        }\n        _XL_DRAW(ROCKETS_X+i,POWER_UPS_Y,ROCKET_TILE_0,color);\n    }\n}\n#endif\n#else // NO COLOR and NO TEXT COLOR\n#if XSize<=20\n\t#define STR_LEN 3\n#else\n\t#define STR_LEN 5\n#endif\nvoid display_power_ups(void)\n{    \n    uint8_t i;\n    \n    speed_value = 1;\n    power_value = 1;\n    \n    {\n\n        if(powerUp<2) // speed\n        {\n            speed_value = powerUp+1;\n        }\n        else\n        {\n            speed_value = 3;\n    \n            if(powerUp<4)\n            {\n\t\t\t\tpower_value = powerUp-1;\n            }\n\t\t\telse\n\t\t\t{\n\t\t\t\tpower_value = 3;\n\t\t\t}\n        }\n    }\n\n    _XL_PRINT(SPEED_X,POWER_UPS_Y,SPEED_STRING);\n    _XL_PRINTD(SPEED_X+STR_LEN,POWER_UPS_Y,1,speed_value);\n    \n    _XL_PRINT(POWER_X,POWER_UPS_Y,POWER_STRING);\n    _XL_PRINTD(POWER_X+STR_LEN,POWER_UPS_Y,1,power_value);\n\n    for(i=0;i<3;++i)\n    {\n\t\tif(i<number_of_rockets_per_shot)\n\t\t{\n\t\t\t_XL_DRAW(ROCKETS_X+i,POWER_UPS_Y,ROCKET_TILE_0,0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_XL_DELETE(ROCKETS_X+i,POWER_UPS_Y);\n\t\t}\n    }\n}\n#endif\n\n#if YSize>10\n    #define activate_hyper() \\\n    do \\\n    { \\\n        _XL_ZAP_SOUND(); \\\n        recharge_rockets(HYPER_RECHARGE); \\\n        hyper_counter = MAX_HYPER_COUNTER; \\\n        stinger_color = level_color[(level+1)&1]; \\\n        _XL_SET_TEXT_COLOR(_XL_CYAN); \\\n        if(powerUp>5) \\\n        { \\\n            number_of_rockets_per_shot=3; \\\n            PRINT_CENTERED_ON_ROW(1,\"TRIPLE\"); \\\n        } \\\n        else \\\n        { \\\n            number_of_rockets_per_shot=2; \\\n            PRINT_CENTERED_ON_ROW(1,\"DOUBLE\"); \\\n        } \\\n    } while(0)\n#else\n    #define activate_hyper() \\\n    do \\\n    { \\\n        _XL_ZAP_SOUND(); \\\n        recharge_rockets(HYPER_RECHARGE); \\\n        hyper_counter = MAX_HYPER_COUNTER; \\\n        stinger_color = level_color[(level+1)&1]; \\\n        if(powerUp>5) \\\n        { \\\n            number_of_rockets_per_shot=3; \\\n        } \\\n        else \\\n        { \\\n            number_of_rockets_per_shot=2; \\\n        } \\\n    } while(0)\n#endif\n\nvoid power_up_effect(void)\n{    \n    ++powerUp;\n    \n    if(!(powerUp%5))\n    {\n        activate_hyper();\n    }\n    \n    display_power_up_counter();\n    increase_score(POWERUP_POINTS);\n    \n    switch(powerUp)\n    {    \n        case 1:\n            stinger_reload_loops=YELLOW_SPEED_VALUE;\n        break;\n           \n        case 2:\n            stinger_reload_loops=GREEN_SPEED_VALUE;\n        break;\n        \n        case 3:\n            fire_power = YELLOW_FIRE_POWER_VALUE;\n        break;\n        \n        case 4:\n            fire_power = GREEN_FIRE_POWER_VALUE;\n        break;\n        \n        // case 5:\n        // break;\n        \n        case 17:\n            #if !defined(_XL_NO_COLOR)\n            powerUpItem._color = SECRET_COLOR;\n            #endif\n        break;\n        \n        case 18:\n            secret_locked = 0;\n\t\t\t#if !defined(_XL_NO_COLOR)\n            powerUpItem._color = _XL_WHITE;\n\t\t\t#endif\n\n        break;\n        \n        default:\n        break;\n    }\n    #if YSize>10\n    display_power_ups();\n    #endif\n}\n\n\nvoid extra_points_effect(void)\n{\n    increase_score(EXTRA_POINTS);\n    ++extra_points_counter;\n    if(!(extra_points_counter&15))\n    {\n        freeze_locked=0;\n    }\n}\n\n\nvoid display_tanks(void)\n{\n    for(tank_x=0;tank_x<XSize;++tank_x)\n    {\n        if(tank_active[tank_x])\n        {\n            display_tank();\n        }\n    }\n}\n\n\nvoid freeze_effect(void)\n{\n    freeze=FREEZE_COUNTER_MAX;\n\n    display_tanks();\n    increase_score(FREEZE_POINTS);\n    ++freeze_locked;\n}\n\n\nvoid tank_effect(void)\n{\n    for(tank_x=0;tank_x<XSize;++tank_x)\n    {\n        tank_level[tank_x]=1;\n        if(energy[tank_x]>HEAVY_TANK_1_POINTS)\n        {\n            energy[tank_x]=HEAVY_TANK_1_POINTS;\n        }\n    }\n    display_tanks();\n\n    secret_locked = 1;\n    increase_score(SECRET_ITEM_POINTS);\n    increase_score(SECRET_ITEM_POINTS);\n}\n\n\n\nvoid player_hit(void)\n{\n\tuint8_t i;\n\tuint8_t player_x = (stinger_x>>1)+(stinger_x&1);\n\t\n\t_XL_DRAW(player_x,STINGER_Y, EXPLOSION_TILE,_XL_RED);\n\n\t_XL_EXPLOSION_SOUND();\n\tfor(i=0;i<3;++i)\n\t{\n\t\tdisplay_stinger();\n\t\tshort_sleep();\t\n\t\t_XL_DRAW(player_x,STINGER_Y, EXPLOSION_TILE,_XL_RED);\n\t\tshort_sleep();\n\t}\n\n}\n\nvoid bullet_effect(void)\n{\n    alive=0;\n\tplayer_hit();\n}\n\n#if !defined(_XL_NO_COLOR)\n    #define initialize_items() \\\n    { \\\n        uint8_t i; \\\n        \\\n        rechargeItem._active = 0; \\\n        rechargeItem._tile = ROCKET_TILE_0; \\\n        rechargeItem._color = _XL_YELLOW; \\\n        rechargeItem._effect = recharge_effect; \\\n        \\\n        freezeItem._active = 0; \\\n        freezeItem._tile = FREEZE_TILE; \\\n        freezeItem._color = FREEZE_COLOR; \\\n        freezeItem._effect = freeze_effect; \\\n        \\\n        powerUpItem._active = 0; \\\n        powerUpItem._tile = POWER_UP_TILE; \\\n        powerUpItem._color = _XL_WHITE; \\\n        powerUpItem._effect = power_up_effect; \\\n        \\\n        secretItem._active = 0; \\\n        secretItem._tile = SECRET_TILE; \\\n        secretItem._color = SECRET_COLOR; \\\n        secretItem._effect = tank_effect; \\\n        \\\n        for(i=0;i<MAX_NUMBER_OF_MISSILES;++i) \\\n        { \\\n            enemyMissile[i]._active = 0; \\\n            enemyMissile[i]._tile = BULLET_TILE; \\\n            enemyMissile[i]._color = _XL_CYAN; \\\n            enemyMissile[i]._effect = bullet_effect; \\\n            \\\n            extraPointsItem[i]._active = 0; \\\n            extraPointsItem[i]._tile = EXTRA_POINTS_TILE; \\\n            extraPointsItem[i]._color = level_color[(level+1)&1]; \\\n            extraPointsItem[i]._effect = extra_points_effect; \\\n        } \\\n    }\n#else\n    #define initialize_items() \\\n    { \\\n        uint8_t i; \\\n        \\\n        rechargeItem._active = 0; \\\n        rechargeItem._tile = ROCKET_TILE_0; \\\n        rechargeItem._effect = recharge_effect; \\\n        \\\n        freezeItem._active = 0; \\\n        freezeItem._tile = FREEZE_TILE; \\\n        freezeItem._effect = freeze_effect; \\\n        \\\n        powerUpItem._active = 0; \\\n        powerUpItem._tile = POWER_UP_TILE; \\\n        powerUpItem._effect = power_up_effect; \\\n        \\\n        secretItem._active = 0; \\\n        secretItem._tile = HEAVY_TANK_TILE_0; \\\n        secretItem._effect = tank_effect; \\\n        \\\n        for(i=0;i<MAX_NUMBER_OF_MISSILES;++i) \\\n        { \\\n            enemyMissile[i]._active = 0; \\\n            enemyMissile[i]._tile = BULLET_TILE; \\\n            enemyMissile[i]._effect = bullet_effect; \\\n            \\\n            extraPointsItem[i]._active = 0; \\\n            extraPointsItem[i]._tile = EXTRA_POINTS_TILE; \\\n            extraPointsItem[i]._effect = extra_points_effect; \\\n        } \\\n    }\n#endif\n\n#define display_level() \\\n{ \\\n    _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\n    _XL_PRINTD(XSize-1,0,1,level+1); \\\n}\n\n\n\nvoid move_left(void)\n{\n    stinger_shape_tile = 2*((--stinger_x)&1);\n    if(stinger_shape_tile)\n    {\n        _XL_DELETE((stinger_x>>1)+2,STINGER_Y);\n    }\n    display_stinger();\n}\n\n\nvoid move_right(void)\n{\n    stinger_shape_tile = 2*((++stinger_x)&1);\n    if(!stinger_shape_tile)\n    {\n        _XL_DELETE((stinger_x>>1)-1,STINGER_Y);\n    }\n    display_stinger();\n}\n\n\nvoid drop_item(register Item *item, uint8_t max_counter)\n{\n    uint8_t offset;\n\n    offset = tank_y_array[tank_x]+1;\n    \n    // _XL_TICK_SOUND();\n    item->_active = 1;\n    item->_x = tank_x;\n\n    if(tank_shape[tank_x])\n    {\n        ++offset;\n    }\n    item->_y = offset;\n    \n    item->_counter=max_counter;\n}\n\n\nvoid artillery_fire(void)\n{\n    _XL_DRAW(tank_x,tank_y_array[tank_x],MORTAR_TILE,_XL_WHITE);\n    artillery_shell_y = tank_y_array[tank_x]+1;\n    _XL_TOCK_SOUND();\n    // artillery_shell_active = 1;\n    artillery_shell_x = tank_x;\n    _XL_DRAW(tank_x,tank_y_array[tank_x],MORTAR_TILE,_XL_GREEN);\n\n}\n\n\n#define EXPLOSION_THRESHOLD 4U\n\nvoid handle_item(register Item* item)\n{\n    if(item->_active)\n    {\n        // TODO: Necessary for GCC for TI99\n\n        \n        if(item->_y<STINGER_Y)\n        {\n            _XL_DELETE(item->_x,item->_y);\n            if(main_loop_counter&1)\n            {\n                ++(item->_y);\n            }\n                  \n            #if !defined(_XL_NO_COLOR)\n                    // TODO: GCC for TI99 does not display the correct tile with item->_tile\n                    _XL_DRAW(item->_x,item->_y,item->_tile,item->_color);\n            #else\n                _XL_DRAW(item->_x,item->_y,item->_tile,0);\n            #endif\n        }\n        else\n        {\n            if(item->_counter&1)\n            {\n                _XL_DELETE(item->_x,item->_y);\n            }\n            else\n            {\n\t\t\t\tuint8_t item_tile;\n\n\t\t\t\tif(item->_counter<EXPLOSION_THRESHOLD)\n\t\t\t\t{\n\t\t\t\t\titem_tile = EXPLOSION_TILE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\titem_tile = item->_tile;\n\t\t\t\t}\n                #if !defined(_XL_NO_COLOR)\n                _XL_DRAW(item->_x,item->_y,item_tile,item->_color);\n                #else\n                _XL_DRAW(item->_x,item->_y,item_tile,0);\n                #endif\n            }\n\n// TODO: Use uint8_t player_x = (stinger_x>>1)+(stinger_x&1);\n// TODO: compare item_x with player_x to decide whether the player has to be redisplayed\n            if((item->_counter>=EXPLOSION_THRESHOLD)&&(item->_x==(stinger_x>>1)+(stinger_x&1)))\n            {\n                item->_effect();\n                _XL_PING_SOUND();\n                item->_active=0;\n            }\n            --(item->_counter);\n            if(!(item->_counter))\n            {\n                item->_active=0;\n                _XL_DELETE(item->_x,item->_y);\n                \n            }\n            display_stinger();\n        }\n    }   \n}\n\n\nvoid handle_artillery_shell(void)\n{\n    if(artillery_shell_active) \n    {\n        if(artillery_shell_y<=STINGER_Y-1)\n        {\n            _XL_DELETE(artillery_shell_x,artillery_shell_y);\n\n            ++artillery_shell_y;\n\n                  \n            #if !defined(_XL_NO_COLOR)\n                    // TODO: GCC for TI99 does not display the correct tile with item->_tile\n                _XL_DRAW(artillery_shell_x,artillery_shell_y,BULLET_TILE,_XL_WHITE);\n            #else\n                _XL_DRAW(artillery_shell_x,artillery_shell_y,BULLET_TILE,0);\n            #endif\n        }\n        else\n        {\n            uint8_t player_x = (stinger_x>>1)+(stinger_x&1);\n            // _XL_DRAW(artillery_shell_x-1,artillery_shell_y,EXPLOSION_TILE,_XL_RED);\n            _XL_DRAW(artillery_shell_x,artillery_shell_y,EXPLOSION_TILE,_XL_RED);\n            // _XL_DRAW(artillery_shell_x+1,artillery_shell_y,EXPLOSION_TILE,_XL_RED);\n            less_short_sleep();\n            if(artillery_shell_x==player_x) // || artillery_shell_x==player_x-1 || artillery_shell_x==player_x+1)\n            {\n               alive=0;\n\t\t\t   player_hit();\n            }    \n            // _XL_DELETE(artillery_shell_x-1,artillery_shell_y);\n            _XL_DELETE(artillery_shell_x,artillery_shell_y);\n\t\t\tartillery_shell_active = 0;\n            // _XL_DELETE(artillery_shell_x+1,artillery_shell_y);\n            display_stinger();\n        }\n    }\n}\n\n\n#define handle_items() \\\n{ \\\n    uint8_t i; \\\n    \\\n    handle_item(&rechargeItem); \\\n    handle_item(&freezeItem); \\\n    handle_item(&powerUpItem); \\\n    handle_item(&secretItem); \\\n    \\\n    for(i=0;i<MAX_NUMBER_OF_MISSILES;++i) \\\n    { \\\n        handle_item(&extraPointsItem[i]); \\\n    } \\\n    for(i=0;i<MAX_NUMBER_OF_MISSILES;++i) \\\n    { \\\n        handle_item(&enemyMissile[i]); \\\n    } \\\n}\n\n\n#if (XSize-2)!=13 && (XSize-2)!=26 && (XSize-2)!=39 && (XSize-2)!=52 && (XSize-2)!=65 && (XSize-2)!=78\n    #define STEP 13\n#else\n    #define STEP 17\n#endif \n\n#if XSize<=40\n    #define RANDOM_TANK_RANGE_START (31)\n#else\n    #define RANDOM_TANK_RANGE_START (63)\n#endif\n\nuint8_t find_random_active_tank(void)\n{\n    uint8_t i;\n    uint8_t index;\n\n    index = (uint8_t) (_XL_RAND())%(XSize-2);\n\n    for(i=1;i<XSize-1;++i)\n    {\n        index%=(XSize-2);\n        ++index;\n        if(tank_active[index])\n        {\n            return index;\n        }\n    }    \n    \n    return 1;\n}\n\n\nuint8_t find_random_inactive_tank(void)\n{\n    uint8_t i;\n    uint8_t index;\n\n    index = (uint8_t) (_XL_RAND())%(XSize-2);\n\n    for(i=1;i<XSize-1;++i)\n    {\n        index%=(XSize-2);\n        ++index;\n        if(!tank_active[index])\n        {\n            return index;\n        }\n    }    \n    \n    return 1;\n}\n\n\nvoid activate_tank(void)\n{\n    uint8_t old_x;\n    \t\n    old_x = tank_x;\n    \n    do\n    {\n        tank_x = find_random_inactive_tank();\n        \n    } while((old_x==tank_x) || (old_x+1==tank_x) || (old_x-1==tank_x));\n    // tank_active[tank_x]=1;    \n\n\n    if(rank==4)\n    {\n        tank_y_array[tank_x]=INITIAL_RESPAWN_TANK_Y-1;\n    }\n    else\n    {\n        tank_y_array[tank_x]=INITIAL_RESPAWN_TANK_Y+(level>>1);\n    }\n    _XL_DRAW(tank_x, tank_y_array[tank_x], TANK_DEATH_TILE, _XL_WHITE);\n    _XL_TOCK_SOUND();\n    less_short_sleep();\n    tank_shape[tank_x]=0;\n}\n\n\nvoid spawn_light_tank(void)\n{\n    rank=0;\n    activate_tank();\n    tank_level[tank_x]=0;\n    energy[tank_x]=LIGHT_TANK_ENERGY;  \n    --light_tanks_to_spawn;\n}\n\n\nvoid spawn_heavy_tank(void)\n{\n\n    if(!level) // TODO: Not necessary\n    {\n        return;\n    }\n    else if(level==1)\n    {\n        rank = 1;\n    }\n    else if(level==2)\n    {\n        rank = 1+(heavy_tank_counter&1);        \n    }\n    else if(level==3) // 3\n    {\n        switch(heavy_tank_counter&3)\n        {\n            case 0 :\n                rank = 1;\n            break;\n            case 1 :\n                rank = 2;\n            break;\n            default:\n                rank = 3;\n        }\n    }\n    else if(level==4) // 4\n    {\n        rank = 1+(heavy_tank_counter&3);\n    }\n    else // 5\n    {\n        switch(heavy_tank_counter&3)\n        {\n            case 0 :\n                rank = 2;\n            break;\n            case 1 :\n                rank = 4;\n            break;\n            default:\n                rank = 3;\n        }\n    }\n    ++heavy_tank_counter;\n\n    activate_tank();\n    tank_level[tank_x]=rank;\n    energy[tank_x]=rank_energy[rank];//HEAVY_TANK_BASE_ENERGY+rank*2;\n    --heavy_tanks_to_spawn;\n}\n\n// #if !defined(NORMAL_TANK_SPEED) && !defined(SLOW_TANK_SPEED)\n    // #if XSize>=32\n        // #define NORMAL_TANK_SPEED 3\n        // #define SLOW_TANK_SPEED 7\n    // #else\n#define NORMAL_TANK_SPEED 3\n#define SLOW_TANK_SPEED 7\n    // #endif \n// #endif\n\n#define FEW_TANKS 5\n// #define MANY_TANKS 60\n// #define FASTER_TANK_MOVE_LEVEL_THRESHOLD 1\n\nvoid update_tank_move_speed_mask(void)\n{\n    if(!powerUp || (light_tanks_to_kill+heavy_tanks_to_kill<=FEW_TANKS))\n    {\n        tank_move_speed_mask=SLOW_TANK_SPEED;\n    }\n    else\n    {\n        tank_move_speed_mask=NORMAL_TANK_SPEED;\n    }\n\t// _XL_PRINTD(0,YSize-1,1,tank_move_speed_mask);\n}\n\n#if YSize>10\n    void display_wall(uint8_t y)\n    {\n        uint8_t i;\n        \n        for(i=0; i<XSize; ++i)\n        {   \n            _XL_DRAW(i,y,WALL_TILE,wall_color); \n        }\n    }\n#else\n    #define display_wall(y)\n#endif\n\n#define _display_red_tank(tile) \\\n{ \\\n    _XL_DRAW(tank_x,tank_y_array[tank_x],tile,_XL_RED); \\\n}\n\n\nvoid display_red_tank(void)\n{\n    uint8_t tile;\n    \n    if(!tank_level[tank_x])\n    {\n        tile=LIGHT_TANK_TILE_0;\n    }\n    else if(tank_level[tank_x]<=MAX_TANK_LEVEL)\n    {\n        tile=HEAVY_TANK_TILE_0;\n    }\n    else\n    {\n        tile=MORTAR_TILE;\n    }\n    _display_red_tank(tile);\n}\n\n#define POWER_UP_COOL_DOWN 38\n#define EXTRA_POINTS_COOL_DOWN 60\n#define SECRET_COOL_DOWN 55\n#define FREEZE_COOL_DOWN 45\n#define RECHARGE_COOL_DOWN 53\n\nvoid handle_item_drop(void)\n{\n    if(tank_level[tank_x] || (!(main_loop_counter&3)) )\n    {        \n        ++item_counter;\n        item_counter&=3;\n        \n        if(((level>=HELP_ITEM_LEVEL_THRESHOLD)&&(powerUp<=HELP_ITEM_POWER_THRESHOLD)))\n        {\n            item_counter&=1;\n        }\n        \n        if(!item_counter)\n        {\n            if(!rechargeItem._active)\n            {\n                drop_item(&rechargeItem,RECHARGE_COOL_DOWN);\n            }\n        }\n        else if(item_counter==1)\n        {\n            if(!powerUpItem._active)\n            {\n                drop_item(&powerUpItem,POWER_UP_COOL_DOWN);\n            } \n        }\n        else if((!freeze_locked)&&(!freeze))\n        {\n            if(!freezeItem._active)\n            {\n                drop_item(&freezeItem,FREEZE_COOL_DOWN);\n            }\n        }\n        else if(!secret_locked && !secretItem._active)\n            {\n                drop_item(&secretItem,SECRET_COOL_DOWN);\n            }\n        else\n        {\n            uint8_t index; \n            \n            index = find_inactive(extraPointsItem);\n            if(index!=MAX_NUMBER_OF_EXTRA_POINTS)\n            {\n                drop_item(&extraPointsItem[index],EXTRA_POINTS_COOL_DOWN);\n            }            \n        }  \n    }\n}\n\n\n// void handle_tank_shoot_speed_mask(void) // TODO: Necessary??\n// {\n    // if(heavy_tanks_to_kill<heavy_tanks_on_level[level]/4)\n    // {\n        // tank_shoot_speed_mask = FAST_TANK_SHOOT_MASK; \n    // }\n// }\n\n\nvoid respawn(void)\n{\n    if(light_tanks_to_spawn || heavy_tanks_to_spawn)\n    {\n        if (light_tanks_to_spawn)\n        {\n            spawn_light_tank();\n        }\n        else\n        {\n            spawn_heavy_tank();\n        }\n        display_tank();\n        \n        // handle_tank_shoot_speed_mask();\n    }\n    // else\n    // {\n        // _XL_PRINT(0,YSize-1,\"NOTHING TO SPAWN\");\n    // }\n\n}\n\n\nvoid tank_dies(void)\n{\n    uint8_t y_pos = tank_y_array[tank_x];\n    uint8_t i;\n\n    _XL_DELETE(tank_x,y_pos+1);\n    \n    _XL_DRAW(tank_x,y_pos, TANK_DEATH_TILE, _XL_RED);\n\n    for(i=0;i<DEATH_LOOP+1;++i)\n    {\n\t\tdisplay_red_tank();\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/4);\n\t\t_XL_DRAW(tank_x,y_pos, TANK_DEATH_TILE, _XL_RED);\n    } \n    for(i=0;i<DEATH_LOOP;++i)\n    {\n        _XL_DRAW(tank_x,y_pos, EXPLOSION_TILE, _XL_WHITE);\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/8);\n        _XL_DRAW(tank_x,y_pos, TANK_DEATH_TILE, _XL_RED);\n    }     \n    _XL_SHOOT_SOUND();\n    _XL_DELETE(tank_x,y_pos);\n    \n    #if defined(NO_BOTTOM_WALL_REDRAW)\n    #elif YSize>10\n        display_wall(BOTTOM_WALL_Y);\n    #endif\n    \n    display_stinger();\n        \n    if(!tank_level[tank_x])\n    {\n        ++killed_light_tanks;\n        --light_tanks_to_kill;\n    }\n    else //if(tank_level[tank_x]<=MAX_TANK_LEVEL)\n    {\n        ++killed_heavy_tanks;\n        --heavy_tanks_to_kill;\n    }\n\n   \n    if(tank_x==forced_tank_x)\n    {\n        forced_tank = 0;\n    }\n    \n    if(y_pos<STINGER_Y-2)\n    {\n        handle_item_drop();\n    }\n    \n    tank_active[tank_x]=0;\n    \n    display_enemy_counter();\n    update_tank_move_speed_mask();\n}\n\n\n#define compute_next_available_rocket_index() \\\n    for(next_rocket=0;next_rocket<MAX_ROCKETS_ON_SCREEN;++next_rocket) \\\n    { \\\n        if(!active_rocket[next_rocket]) \\\n        { \\\n            break; \\\n        } \\\n    }\n\n\nvoid handle_rockets(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<MAX_ROCKETS_ON_SCREEN;++i)\n    {\n        if(active_rocket[i]) // ACTIVE\n        {    \n            if(rocket_y[i]<MAX_RANGE_VALUE)\n            {\n                active_rocket[i]=0;\n                --rockets_on_screen;\n            }\n            else\n            {\n                _XL_DELETE(rocket_x[i],rocket_y[i]);\n                --rocket_y[i];\n                if(rocket_y[i]>=MAX_RANGE_VALUE)\n                {\n                    #if !defined(_XL_NO_COLOR)\n                    _XL_DRAW(rocket_x[i],rocket_y[i],rocket_shape[i],rocket_display_color);\n                    #else\n                    _XL_DRAW(rocket_x[i],rocket_y[i],rocket_shape[i],0);\n                    #endif\n                }\n            }\n        }\n    }\n}\n\n\n\n\nvoid decrease_energy(void)\n{\n    if(energy[tank_x]<=fire_power)\n    {\n        energy[tank_x]=0;\n    }\n    else\n    {\n        energy[tank_x]-=fire_power;\n    }\n}\n\n\nvoid push_tank(void)\n{\n    if(!tank_shape[tank_x])\n    {\n        --tank_y_array[tank_x];\n        tank_shape[tank_x]=3;\n    }\n    else \n    {\n        --tank_shape[tank_x];\n        _XL_DELETE(tank_x,tank_y_array[tank_x]+1);\n    }\n}\n\n\nvoid push_display_tank(void)\n{\n    push_tank();\n    display_tank();\n}\n\n\n#define not_stealth() freeze || (tank_level[tank_x]!=2) || tank_shape[tank_x]\n\nvoid handle_tank_collisions(void)\n{\n    uint8_t i;\n\t\n    for(i=0;i<MAX_ROCKETS_ON_SCREEN;++i)\n    {\n\t\tif(active_rocket[i])\n\t\t{\n\t\t\ttank_x = rocket_x[i];\n\t\t\tif(tank_active[tank_x])\n\t\t\t{\n\t\t\t\tif(tank_y_array[tank_x]>=rocket_y[i]-1 && tank_y_array[tank_x]<= rocket_y[i]+1)\n\t\t\t\t{\n\t\t\t\t\tif(not_stealth())\n\t\t\t\t\t{\n\t\t\t\t\t\t--rockets_on_screen;\n\n\t\t\t\t\t\t_XL_DELETE(rocket_x[i],rocket_y[i]);\n\t\t\t\t\t\tactive_rocket[i]=0;\n\t\t\t\t\t\tdecrease_energy();\n\n\n\t\t\t\t\t\tif(energy[tank_x])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplay_red_tank();\n\t\t\t\t\t\t\tshort_sleep();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_XL_TOCK_SOUND();                \n\t\t\t\t\t\t\tif(tank_level[tank_x]<=MAX_TANK_LEVEL)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// push_tank();\n\t\t\t\t\t\t\t\t// display_tank();\n\t\t\t\t\t\t\t\tpush_display_tank();\n\t\t\t\t\t\t\t\t// #if defined(_XL_NO_UDG)\n\t\t\t\t\t\t\t\t// _XL_DELETE(tank_x,tank_y_array[tank_x]+1);\n\t\t\t\t\t\t\t\t// #endif\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdisplay_tank();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttank_dies();\n\t\t\t\t\t\t\tincrease_score(tank_points[tank_level[tank_x]]);\n\t\t\t\t\t\t\trespawn();\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplay_tank();\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// uint8_t tank_hit(void)\n// {\n    // uint8_t i;\n    \n    // for(i=0;i<MAX_ROCKETS_ON_SCREEN;++i)\n    // {\n        // if(active_rocket[i] && rocket_x[i]==tank_x\n          // && tank_y_array[tank_x]>=rocket_y[i]-1 && tank_y_array[tank_x]<=rocket_y[i]+1)\n           // {\n               // if(freeze || (tank_level[tank_x]!=2) || tank_shape[tank_x])\n               // {\n                   // active_rocket[i]=0;\n                    // --rockets_on_screen;\n\n                   // _XL_DELETE(rocket_x[i],rocket_y[i]);\n\n               // }\n               // else // rockets goes through ghost !free (non-frozen) && tank_level==2 (i.e., ghost tank) && !tank_shape (i.e. invincible shape)\n               // {\n                   // display_tank(); // display invincible ghost tank\n                   // return 0; // two rockets cannot be at the same place\n               // }\n           // }\n    // }\n    // return 0;\n// }\n\n\n// void handle_tank_collisions(void)\n// {\n    // for(tank_x=0;tank_x<XSize;++tank_x)\n    // {\n        \n        // if(tank_active[tank_x] && tank_hit())\n        // {\n            // decrease_energy();\n\n\n            // if(energy[tank_x])\n            // {\n                // display_red_tank();\n                // short_sleep();\n                \n                // _XL_TOCK_SOUND();                \n                // if(tank_level[tank_x]<=MAX_TANK_LEVEL)\n                // {\n                    // push_display_tank();\n                    // #if defined(_XL_NO_UDG)\n                    // _XL_DELETE(tank_x,tank_y_array[tank_x]+1);\n                    // #endif\n                // }\n                // else\n                // {\n                    // display_tank();\n                // }\n            // }\n            // else\n            // {\n                // tank_dies();\n                // increase_score(tank_points[tank_level[tank_x]]);\n                // respawn();\n            // }\n        // }\n    // }\n// }\n\n\nvoid move_tank(void)\n{ \n    ++tank_shape[tank_x];\n    (tank_shape[tank_x])&=3;\n    if(!tank_shape[tank_x])\n        {\n            ++tank_y_array[tank_x];\n        }\n}\n\n\nvoid move_display_tank(void)\n{\n    move_tank();\n    display_tank();\n}\n\n\n#if !defined(MISSILE_DROP_LOOP_MASK)\n    #define MISSILE_DROP_LOOP_MASK (1)\n#endif\n\nvoid handle_missile_drops(void)\n{\n    if(!freeze && !(main_loop_counter&1))\n    {\n        uint8_t missile_index;\n        \n        if((missile_index = find_inactive(enemyMissile)) < MAX_NUMBER_OF_MISSILES)\n        {\n            \n            tank_x = (uint8_t) (stinger_x>>1)+(stinger_x&1)-1U+ (uint8_t)(_XL_RAND()%3);\n            \n            if(tank_active[tank_x])\n            {\n                if(tank_level[tank_x]<=MAX_TANK_LEVEL)\n                {\n                    if(tank_y_array[tank_x]<HEIGHT_SHOOT_THRESHOLD && ((tank_level[tank_x]==3) || (!(main_loop_counter&tank_shoot_speed_mask))))\n                    {\n                        drop_item(&enemyMissile[missile_index],EXPLOSION_THRESHOLD+1);\n                    }\n                }\n                else\n                {\n                    if(!artillery_shell_active)\n                    {\n                        artillery_fire();\n                    }\n                }\n            }\n        }\n    }\n} \n\n\n#define FORCED_TANK_MASK 15\n\nvoid move_tanks(void)\n{    \n    if(forced_tank) // There is a tank that should keep on moving\n    {\n        tank_x = forced_tank_x;\n\t\t// _XL_PRINT(0,YSize-3,\"FORCED\");\n    }\n    else\n    {\n        tank_x=find_random_active_tank();\n\t\t// _XL_PRINT(0,YSize-3,\"RAMDOM\");\n\t\t// _XL_SLEEP(1);\n\n    }\n\t\n\t// _XL_PRINTD(7,YSize-3,2,tank_x);\n\t\n\tif(tank_level[tank_x]>MAX_TANK_LEVEL)\n\t{\n\t\t// _XL_PRINT(0,YSize-2,\"HOWITZER\");\n\n\t\treturn;\n\t}\n\t// else\n\t// {\n\t\t// _XL_PRINT(0,YSize-2,\"TANK    \");\n\n\t// }\n\t\t\n    if (((tank_level[tank_x]==2)&&(tank_shape[tank_x]&1))&&(tank_y_array[tank_x]!=STINGER_Y-1))\n    {\n        forced_tank = 0;\n    }\n    else if((tank_y_array[tank_x]>=HEIGHT_SHOOT_THRESHOLD) || (_XL_RAND()&FORCED_TANK_MASK))\n    {\n        forced_tank = 1;\n        forced_tank_x = tank_x;\n    }\n    else\n    {\n        forced_tank = 0;\n    }\n\n    move_display_tank();\n\n    if(tank_y_array[tank_x]==STINGER_Y)\n    {\n        alive = 0;\n        display_red_tank();\n    }\n}\n\n\n#define handle_stinger_load() \\\ndo \\\n{ \\\n    if(!loaded_stinger && rockets_on_screen<MAX_ROCKETS_ON_SCREEN && !stinger_load_counter && remaining_rockets) \\\n    { \\\n        loaded_stinger = 1; \\\n        display_stinger(); \\\n    } \\\n    if(stinger_load_counter) \\\n    { \\\n        --stinger_load_counter; \\\n    } \\\n} while(0)\n\n\nvoid fire(void)\n{\n    uint8_t i;\n    uint8_t new_rocket_x;  \n    uint8_t offset;\n    \n    _XL_TICK_SOUND();\n    new_rocket_x = (stinger_x>>1)+(stinger_x&1);\n    for(i=0;i<number_of_rockets_per_shot;++i)\n    {\n        if(remaining_rockets && rockets_on_screen<MAX_ROCKETS_ON_SCREEN)\n        {\n            if((number_of_rockets_per_shot==2)&&i)\n            {\n                offset = i-2*(stinger_x&1);\n            }\n            else\n            {\n                offset = i;\n            }\n            new_rocket_x+=offset;\n            if(i==2)\n            {\n                if(new_rocket_x>=4)\n                {\n                    new_rocket_x-=4; \n                }\n                else\n                {\n                    continue;\n                }\n            }\n            if(new_rocket_x<XSize-1 && new_rocket_x)\n            {\n                compute_next_available_rocket_index();\n\n                // active_rocket[next_rocket] = 1;\n                ++rockets_on_screen;\n                if(number_of_rockets_per_shot==2)\n                {\n                    rocket_shape[next_rocket] = rocket_tile[!(stinger_x&1)];\n                }\n                else\n                {\n                    rocket_shape[next_rocket] = rocket_tile[stinger_x&1];\n                }\n                rocket_y[next_rocket] = STINGER_Y-1;\n                rocket_x[next_rocket] = new_rocket_x;\n                #if !defined(TRAINER)\n                    --remaining_rockets;\n                #endif\n            }\n        }\n    }\n    display_remaining_rockets();\n\n    stinger_load_counter = stinger_reload_loops;\n    loaded_stinger = 0;\n    display_stinger();\n}\n\n\n#if defined(_XL_NO_UDG)\n    void handle_stinger_move(void)\n    {\n        input = _XL_INPUT();\n       \n        if(_XL_LEFT(input) && stinger_x>2)\n        {\n            if(direction==LEFT_DIRECTION)\n            {\n                ++acceleration_counter;\n                if(acceleration_counter>=ACCELERATION_THRESHOLD)\n                {\n                    acceleration=1;\n                }\n            }\n            else\n            {\n                acceleration_counter=0;\n                acceleration=0;\n            }\n            direction = LEFT_DIRECTION;\t\t\t\n            move_left();\n            if(stinger_x)\n            {\n                move_left();\n            }\n            if(acceleration && stinger_x>1)\n            {\n                move_left();\n            }\n        }\n        else if (_XL_RIGHT(input) && stinger_x<MAX_STINGER_X-1)\n        {\n            if(direction==RIGHT_DIRECTION)\n            {\n                ++acceleration_counter;\n                if(acceleration_counter>=ACCELERATION_THRESHOLD)\n                {\n                    acceleration=1;\n                }\n            }\n            else\n            {\n                acceleration_counter=0;\n                acceleration=0;\n            }\n            direction = RIGHT_DIRECTION;  \t\t\t\n            move_right();\n            if(stinger_x<MAX_STINGER_X)\n            {\n                move_right();\n            }\n            if(acceleration && (stinger_x<MAX_STINGER_X-1))\n            {\n                move_right();\n            }\n        }\n        else if (_XL_FIRE(input) && loaded_stinger)\n        {\n            fire();\n            acceleration_counter=0;\n            acceleration=0;\n        }\n        else\n        {\n            acceleration_counter=0;\n            acceleration=0;\n        }\n    }\n#else\n    void handle_stinger_move(void)\n    {\n        input = _XL_INPUT();\n        \n        if(_XL_LEFT(input) && stinger_x>1)\n        {\n            if(direction==LEFT_DIRECTION)\n            {\n                ++acceleration_counter;\n                if(acceleration_counter>=ACCELERATION_THRESHOLD)\n                {\n                    acceleration=1;\n                }\n            }\n            else\n            {\n                acceleration_counter=0;\n                acceleration=0;\n            }\n            direction = LEFT_DIRECTION;\n            move_left();\n            if(acceleration && stinger_x>1)\n            {\n                move_left();\n            }\n        }\n        else if (_XL_RIGHT(input) && (stinger_x<MAX_STINGER_X-1))\n        {\n            if(direction==RIGHT_DIRECTION)\n            {\n                ++acceleration_counter;\n                if(acceleration_counter>=ACCELERATION_THRESHOLD)\n                {\n                    acceleration=1;\n                }\n            }\n            else\n            {\n                acceleration_counter=0;\n                acceleration=0;\n            }\n            direction = RIGHT_DIRECTION;            \n            move_right();\n            if(acceleration && (stinger_x<MAX_STINGER_X-1))\n            {\n                move_right();\n            }\n        }\n        else if (_XL_FIRE(input) && loaded_stinger)\n        {\n            fire();\n            acceleration_counter=0;\n            acceleration=0;\n        }\n        else\n        {\n            acceleration_counter=0;\n            acceleration=0;\n        }\n    }\n#endif\n\n\n#define game_over() \\\ndo \\\n{ \\\n    _XL_EXPLOSION_SOUND(); \\\n    _XL_SET_TEXT_COLOR(_XL_RED); \\\n    PRINT_CENTERED(\"GAME OVER\"); \\\n    one_second(); \\\n    control_instructions(); \\\n    freeze=1; \\\n    tank_intro_animation(); \\\n    _XL_CLEAR_SCREEN(); \\\n} while(0)\n\n\n#define global_initialization() \\\ndo \\\n{ \\\n    if(score>hiscore) \\\n    { \\\n        hiscore=score; \\\n    } \\\n    score = 0; \\\n    level = INITIAL_LEVEL; \\\n    killed_heavy_tanks = 0; \\\n    killed_light_tanks = 0; \\\n    killed_artillery = 0; \\\n    freeze = 0; \\\n    lives = INITIAL_LIVES; \\\n    next_threshold = NEXT_EXTRA_LIFE; \\\n} while(0)\n\n#if defined(_XL_NO_COLOR)\n    #define init_rocket_display_color()\n#else\n    #define init_rocket_display_color() \\\n        rocket_display_color = _XL_CYAN;\n#endif\n\n\n#define level_initialization() \\\ndo \\\n{   \\\n    level_count_down=LEVEL_COUNT_DOWN+level*32; \\\n    extra_points_counter = 6; \\\n    fire_power = RED_FIRE_POWER_VALUE; \\\n    freeze = 0; \\\n    acceleration = 0; \\\n    acceleration_counter = 0; \\\n    powerUp = 0; \\\n    next_rocket = 0; \\\n    rockets_on_screen = 0; \\\n    stinger_load_counter = 0; \\\n    hyper_counter = 0; \\\n    forced_tank = 0; \\\n    freeze_locked = 1; \\\n    secret_locked = 1; \\\n    loaded_stinger = 1; \\\n    alive = 1; \\\n    if(level>=2) \\\n    { \\\n        max_occupied_columns = MAX_DENSILY_OCCUPIED_COLUMNS+level; \\\n    } \\\n    else \\\n    { \\\n        max_occupied_columns = MAX_SPARSELY_OCCUPIED_COLUMNS; \\\n    } \\\n    stinger_reload_loops = RED_SPEED_VALUE; \\\n    auto_recharge_counter = AUTO_RECHARGE_COOL_DOWN; \\\n    remaining_rockets = MAX_ROCKETS; \\\n    stinger_x = XSize; \\\n    stinger_shape_tile = (uint8_t) 2*((stinger_x)&1); \\\n    stinger_color = _XL_CYAN; \\\n    number_of_rockets_per_shot = 1; \\\n    if(level>=4) \\\n    { \\\n        tank_shoot_speed_mask = VERY_FAST_TANK_SHOOT_MASK; \\\n    } \\\n    else if(level>=2) \\\n    { \\\n        tank_shoot_speed_mask = FAST_TANK_SHOOT_MASK; \\\n    } \\\n    else \\\n    { \\\n        tank_shoot_speed_mask = SLOW_TANK_SHOOT_MASK; \\\n    } \\\n    initialize_items(); \\\n    artillery_shell_active = 0; \\\n    heavy_tank_counter = 0; \\\n    _XL_CLEAR_SCREEN(); \\\n    set_wall_color(level_color[level&1]); \\\n    display_wall(BOTTOM_WALL_Y); \\\n    _XL_DRAW(0,HEIGHT_SHOOT_THRESHOLD,WALL_TILE,_XL_CYAN); \\\n    _XL_DRAW(XSize-1,HEIGHT_SHOOT_THRESHOLD,WALL_TILE,_XL_CYAN); \\\n    init_rocket_display_color(); \\\n} while(0)\n\n\n#define tank_counter main_loop_counter\n\nvoid initialize_tank_at_level_restart(void)\n{\n    // tank_y_array[tank_x]=INITIAL_RESPAWN_TANK_Y;\n    ++tank_counter;\n    display_tank();\n    // _XL_TOCK_SOUND();\n}\n\n\n\nvoid reset_tanks(void)\n{ \n    for(tank_x=0;tank_x<XSize;++tank_x)\n    {\n        tank_active[tank_x]=0;\n    }\n} \n\n\n#define spawn_initial_light_tanks() \\\n    light_tanks_to_kill = LIGHT_TANKS_ON_FIRST_LEVEL-killed_light_tanks-(level<<3);  \\\n    \\\n    if(light_tanks_to_kill<max_occupied_columns) \\\n    { \\\n        spawned_light=light_tanks_to_kill; \\\n    } \\\n    else \\\n    { \\\n        spawned_light=max_occupied_columns; \\\n    } \\\n    \\\n    tank_counter = 0; \\\n    \\\n    while(tank_counter<spawned_light) \\\n    { \\\n        spawn_light_tank(); \\\n        initialize_tank_at_level_restart(); \\\n    } \\\n    \\\n    light_tanks_to_spawn = light_tanks_to_kill-spawned_light;\n\n\n#define spawn_initial_heavy_tanks() \\\n    heavy_tanks_to_kill = heavy_tanks_on_level[level]-killed_heavy_tanks; \\\n    \\\n    if(heavy_tanks_to_kill<max_occupied_columns - spawned_light) \\\n    { \\\n        spawned_heavy = heavy_tanks_to_kill;   \\\n    } \\\n    else \\\n    { \\\n        spawned_heavy = max_occupied_columns - spawned_light; \\\n    } \\\n    \\\n    tank_counter = 0; \\\n    \\\n    while(tank_counter<spawned_heavy) \\\n    { \\\n        spawn_heavy_tank(); \\\n        initialize_tank_at_level_restart(); \\\n    } \\\n    \\\n    heavy_tanks_to_spawn = heavy_tanks_to_kill-spawned_heavy;\n\n/*\n    _XL_PRINTD(0,1,3,spawned_light); \\\n    _XL_PRINTD(0,0,3,spawned_heavy); \\\n    _XL_WAIT_FOR_INPUT(); \\\n*/\n\n\n\n#define tank_initialization() \\\n{ \\\n    uint8_t spawned_light; \\\n    uint8_t spawned_heavy; \\\n    \\\n    reset_tanks(); \\\n    \\\n    spawn_initial_light_tanks(); \\\n    \\\n    spawn_initial_heavy_tanks(); \\\n    \\\n    update_tank_move_speed_mask(); \\\n    \\\n    \\\n    for(tank_x=0;tank_x<MAX_ROCKETS_ON_SCREEN;++tank_x) \\\n    { \\\n        active_rocket[tank_x] = 0; \\\n    } \\\n}\n\n\n#if YSize<=20\n    #define _NEXT_ROW i\n#else\n    #define _NEXT_ROW ((i)<<1)\n#endif\n\n#if defined(_XL_NO_JOYSTICK)\n    #define CONTROLS_STRING \"PRESS A KEY\"\n    #define CONTROLS_LEN 13\n    #define DELETE_CONTROLS \"           \"\n#else\n    #if defined(_XL_CURSORS)\n        #if XSize>=21\n            #define CONTROLS_STRING \"PRESS A KEY\"\n            #define CONTROLS_LEN 21\n        #elif XSize>=19\n            #define CONTROLS_STRING \"PRESS A KEY\"\n            #define CONTROLS_LEN 19\n        #else\n            #define CONTROLS_STRING \"PRESS A KEY\"\n            #define CONTROLS_LEN 15\n        #endif\n    #else\n        #define CONTROLS_STRING     \"PRESS FIRE\"\n        #define CONTROLS_LEN 12\n        #define DELETE_CONTROLS     \"          \"\n\n    #endif\n#endif\n\n// #if YSize<=23\n#define CONTROLS_Y YSize-2\n// #else\n    // #define CONTROLS_Y YSize-3\n// #endif\n\n\n\n#if YSize<=22\n    #define _HISCORE_Y 1\n#else\n    #define _HISCORE_Y 2\n#endif\n\n#if XSize>=20\n    #define _STINGER_STRING \\\n        \"S T I N G E R\"\n#else\n    #define _STINGER_STRING \\\n        \"STINGER\"\n#endif\n\nvoid display_cleared(void)\n{\n\t_XL_SET_TEXT_COLOR(_XL_CYAN);\n\tPRINT_CENTERED(\"C L E A R E D\");\n\n}\n\t\n#if !defined(_XL_NO_TEXT_COLOR) && !defined(_XL_NO_COLOR)\n\tvoid display_stinger_string(uint8_t color)\n\t{\n\t\t_XL_SET_TEXT_COLOR(color);\n\t\tPRINT_CENTERED_ON_ROW(YSize/3-2,_STINGER_STRING);\n\t}\n\n\n\t#if !defined(NO_EXTRA_TITLE)\n\tvoid display_enemies_string(uint8_t color)\n\t{\n\t\t_XL_SET_TEXT_COLOR(color);\n\t\tPRINT_CENTERED_ON_ROW(YSize/3-2, \"ENEMIES\");\n\t}\n\t#endif\n\n\tvoid display_victory_string(uint8_t color)\n\t{\n\t\t_XL_SET_TEXT_COLOR(color);\n\t\tPRINT_CENTERED_ON_ROW(YSize/2,\"V I C T O R Y\");\n\t}\t\n#else\n\tvoid _display_stinger_string(void)\n\t{\n\t\tPRINT_CENTERED_ON_ROW(YSize/3-2,_STINGER_STRING);\n\t}\n\n\t#if !defined(NO_EXTRA_TITLE)\n\n\tvoid _display_enemies_string(void)\n\t{\n\t\tPRINT_CENTERED_ON_ROW(YSize/3-2, \"ENEMIES\");\n\t}\n\t#endif\n\n\tvoid _display_victory_string(void)\n\t{\n\t\tPRINT_CENTERED_ON_ROW(YSize/2,\"V I C T O R Y\");\n\t}\t\n\n\t#define display_stinger_string(color) \\\n\t\t_display_stinger_string();\n\n\t#define display_enemies_string(color) \\\n\t    _display_enemies_string();\n\n\t#define display_victory_string(color) \\\n\t\t_display_victory_string();\n\n#endif\n\n\nuint8_t fire_pressed_after_time(void)\n{\n\treturn (!time_counter) && (fire_pressed = _XL_FIRE(_XL_INPUT()));\n}\n\n\n#if !defined(NO_EXTRA_TITLE) || YSize<15\n    // #if YSize>=15\n        void control_instructions(void) \n        {\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\n            PRINT_CENTERED_ON_ROW(CONTROLS_Y,\\\n                                       CONTROLS_STRING);\n        }\n        void delete_instructions(void)\n        {\n            PRINT_CENTERED_ON_ROW(CONTROLS_Y,\\\n                                       DELETE_CONTROLS);\n        }\n#else\n        #define control_instructions()\n        #define delete_instructions()\n    // #endif\n#endif\n\n#if YSize<=10 || defined(NO_DISPLAY_ITEMS)\n    #define display_items()\n#else\n    #define display_items() \\\n    do \\\n    { \\\n        uint8_t i; \\\n        \\\n        for(i=0;i<NUMBER_OF_ITEMS;++i) \\\n        { \\\n            _XL_DRAW(XSize/2-5,YSize/3+4+_NEXT_ROW, item_tile[i][0], item_tile[i][1]); \\\n            _XL_SET_TEXT_COLOR(_XL_GREEN); \\\n            _XL_PRINT(XSize/2-5+3,YSize/3+4+_NEXT_ROW, (char *)item_name[i]); \\\n        } \\\n    } while(0)\n#endif\n\nvoid display_enemies(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<5;++i)\n    {\n        _XL_DRAW(XSize/2-5,YSize/3+1+_NEXT_ROW, enemy_tile[i][0], enemy_tile[i][1]);\n        _XL_SET_TEXT_COLOR(_XL_GREEN);\n        _XL_PRINT(XSize/2-5+3,YSize/3+1+_NEXT_ROW, (char *)enemy_name[i]);\n    }\n}\n\n\n\n#if !defined(NO_EXTRA_TITLE)\nvoid mortar_intro_animation(void)\n{\n    uint8_t i;\n    // uint8_t fire = 0;\n    // uint8_t time_counter = 25;\n    switch_counter = 0;\n\n\tfire_pressed = 0;\n\ttime_counter = 5;\n\n    tank_active[1]=1;    \n    tank_shape[1]=0;\n    tank_y_array[1]=2;\n    tank_level[1]=2;\n\n    \n    tank_active[XSize-2]=1;    \n    tank_shape[XSize-2]=0;    \n    tank_y_array[XSize-2]=2;\n    tank_level[XSize-2]=2;\n\n    \n    _XL_DRAW(0,4,MORTAR_TILE,_XL_GREEN);\n    _XL_DRAW(XSize-1,4,MORTAR_TILE,_XL_GREEN);\n    \n    do\n    {\n        // _XL_SET_TEXT_COLOR(_XL_WHITE);\n\n        for(i=5;i<YSize-2;++i)\n        {\n\t\t\t\n            if(fire_pressed_after_time())\n            {\n                break;\n            }\n\t\t\t\n            if(!(i&3))\n            {\n                tank_x=1;\n                move_display_tank();\n\n                tank_x=XSize-2;\n                move_display_tank();     \n\n                if(tank_y_array[1]>=YSize-2)\n                {\n                    tank_y_array[1]=2;\n                    tank_y_array[XSize-2]=2;\n                    _XL_DELETE(1,YSize-2);\n                    _XL_DELETE(XSize-2,YSize-2);    \n                }                \n                delete_instructions(); \n            }\n            else\n            {\n                control_instructions();\n            }\n\n            // if(fire_pressed_after_time())\n            // {\n                // break;\n            // }\n\n            if(time_counter)\n            {\n                --time_counter;\n            }\n            \n            _XL_DRAW(0,i,BULLET_TILE,_XL_WHITE);\n            _XL_DRAW(XSize-1,i,BULLET_TILE,_XL_WHITE);\n            display_enemies_string(_XL_CYAN);\n\n            // if(fire_pressed_after_time())\n            // {\n                // break;\n            // }\n            // short_sleep();\n\n            short_sleep();\n\t\t\t#if!defined (_XL_NO_TEXT_COLOR)\n            display_enemies_string(_XL_RED);\n\t\t\t#endif\n\n            _XL_DELETE(0,i);\n            _XL_DELETE(XSize-1,i);\n\n        }\n\n        _XL_DRAW(0,YSize-2,EXPLOSION_TILE,_XL_RED);\n        _XL_DRAW(XSize-1,YSize-2,EXPLOSION_TILE,_XL_RED);\n        less_short_sleep();\n        _XL_DELETE(0,YSize-2);\n        _XL_DELETE(XSize-1,YSize-2);\n\n        ++switch_counter;\n    }\n    while(!fire_pressed);\n    _XL_ZAP_SOUND();\n    one_second();\n}\n#else\n#define mortar_intro_animation()\n#endif\n\n#if defined(_XL_NO_COLOR) || defined(_XL_NO_TEXT_COLOR)\n\t#define display_initial_screen() \\\n\tdo \\\n\t{ \\\n\t\t_XL_CLEAR_SCREEN(); \\\n\t\t\\\n\t\tset_wall_color(_XL_GREEN); \\\n\t\tdisplay_wall(0); \\\n\t\tdisplay_wall(BOTTOM_WALL_Y+1); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_CYAN); \\\n\t\tPRINT_CENTERED_ON_ROW(_HISCORE_Y, \"HISCORE\"); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\n\t\t_XL_PRINTD(XSize/2-3,_HISCORE_Y+1,5,hiscore); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\n\t\tPRINT_CENTERED_ON_ROW(YSize/3, \"FABRIZIO CARUSO\"); \\\n\t\t\\\n\t\tdisplay_items(); \\\n\t\ttank_intro_animation(); \\\n\t\t_XL_ZAP_SOUND(); \\\n\t\tone_second();    \\\n\t} while(0)\n#elif XSize>=18\n\t#define display_initial_screen() \\\n\tdo \\\n\t{ \\\n\t\t_XL_CLEAR_SCREEN(); \\\n\t\t\\\n\t\tset_wall_color(_XL_GREEN); \\\n\t\tdisplay_wall(0); \\\n\t\tdisplay_wall(BOTTOM_WALL_Y+1); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_CYAN); \\\n\t\tPRINT_CENTERED_ON_ROW(_HISCORE_Y, \"HISCORE\"); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\n\t\t_XL_PRINTD(XSize/2-3,_HISCORE_Y+1,5,hiscore); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\n\t\tPRINT_CENTERED_ON_ROW(YSize/3, \"FABRIZIO CARUSO\"); \\\n\t\t\\\n\t\tdisplay_items(); \\\n\t\ttank_intro_animation(); \\\n\t\t_XL_ZAP_SOUND(); \\\n\t\tdisplay_stinger_string(_XL_CYAN); \\\n\t\tone_second();    \\\n\t} while(0)\n#else\n\t#define display_initial_screen() \\\n\tdo \\\n\t{ \\\n\t\t_XL_CLEAR_SCREEN(); \\\n\t\t\\\n\t\tset_wall_color(_XL_GREEN); \\\n\t\tdisplay_wall(0); \\\n\t\tdisplay_wall(BOTTOM_WALL_Y+1); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_CYAN); \\\n\t\tPRINT_CENTERED_ON_ROW(_HISCORE_Y, \"HISCORE\"); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\n\t\t_XL_PRINTD(XSize/2-3,_HISCORE_Y+1,5,hiscore); \\\n\t\t\\\n\t\t_XL_SET_TEXT_COLOR(_XL_WHITE); \\\n\t\tPRINT_CENTERED_ON_ROW(YSize/3, \"FABRIZIO\"); \\\n\t\tPRINT_CENTERED_ON_ROW(YSize/3+1, \"CARUSO\"); \\\n\t\t\\\n\t\tdisplay_items(); \\\n\t\ttank_intro_animation(); \\\n\t\t_XL_ZAP_SOUND(); \\\n\t\tdisplay_stinger_string(_XL_CYAN); \\\n\t\tone_second();    \\\n\t} while(0)\t\n#endif\n\n#if defined(NO_TANK_INTRO)\n    #define tank_intro_animation()\n#else\nvoid tank_intro_animation(void)\n{\n    uint8_t i;\n    switch_counter = 0;\n\n\tfire_pressed = 0;\n\ttime_counter = 5;\n\n    reset_tanks();\n    \n    tank_active[0]=1;    \n    tank_shape[0]=0;\n    tank_y_array[0]=2;\n    tank_level[0]=3;\n    \n    tank_active[XSize-1]=1;    \n    tank_shape[XSize-1]=0;    \n    tank_y_array[XSize-1]=2;\n    tank_level[XSize-1]=3;\n\n    tank_active[1]=1;    \n    tank_shape[1]=0;\n    tank_y_array[1]=YSize-3;\n    tank_level[1]=1;\n    \n    tank_active[XSize-2]=1;    \n    tank_shape[XSize-2]=0;    \n    tank_y_array[XSize-2]=YSize-3;\n    tank_level[XSize-2]=1;\n\n\t#if defined(_XL_NO_TEXT_COLOR) || defined(_XL_NO_COLOR)\n\tdisplay_stinger_string(_XL_RED);\n\t#endif\n    do\n    {\n        for(i=3;i<(YSize-5)*4;++i)\n        {\n\t\t\t#if !defined(_XL_NO_TEXT_COLOR) && !defined(_XL_NO_COLOR)\n            display_stinger_string(_XL_RED);\n\t\t\t#endif\n\t\t\t// if(fire_pressed_after_time())\n            // {\n                // break;\n            // }\n            if(!(i&3))\n            {\n                delete_instructions(); \n            }\n            else\n            {\n                control_instructions();\n            }            \n            if(time_counter)\n            {\n                --time_counter;\n            }\n            if(fire_pressed_after_time())\n            {\n\t\t\t\t// _XL_PRINT(0,YSize-3,\"FIRST\");\n\t\t\t\t// _XL_SLEEP(1);\n                break;\n            }\n            if(!(switch_counter&1))\n            {\n                tank_x=0;\n                move_display_tank();\n                \n                tank_x=XSize-1;\n                move_display_tank();\n                \n\t\t\t\t// if(fire_pressed_after_time())\n\t\t\t\t// {\n\t\t\t\t\t// break;\n\t\t\t\t// }\n\t\t\t\t\n                tank_x=1;\n                push_display_tank();\n                \n                tank_x=XSize-2;\n                push_display_tank();\n            }\n            else\n            {\n                tank_x=1;\n                move_display_tank();\n                \n                tank_x=XSize-2;\n                move_display_tank();\n                \n\t\t\t\t// if(fire_pressed_after_time())\n\t\t\t\t// {\n\t\t\t\t\t// break;\n\t\t\t\t// }\n\t\t\t\t\n                tank_x=0;\n                push_display_tank();\n                \n                tank_x=XSize-1;\n                push_display_tank();\n            }\n            \n\t\t\t#if!defined (_XL_NO_TEXT_COLOR)\n            display_stinger_string(_XL_YELLOW);\n            #endif\n\t\t\tshort_sleep();\n\n            if(fire_pressed_after_time())\n            {\n\t\t\t\t// _XL_PRINT(0,YSize-3,\"SECOND\");\n\t\t\t\t// _XL_SLEEP(1);\n                break;\n            }\n        }\n        ++switch_counter;\n        if(!fire_pressed)\n        {\n            for(i=0;i<3;++i)\n            {\n                _XL_DELETE(0,YSize-3-i);\n                _XL_DELETE(XSize-1,YSize-3-i);\n                _XL_DELETE(1,1+i);\n                _XL_DELETE(XSize-2,1+i);\n            }\n        }\n\n    }\n    while(!fire_pressed);    \n}\n#endif\n\n#if !defined(NO_EXTRA_TITLE) && YSize>10\nvoid display_second_screen(void) \n{\n    _XL_CLEAR_SCREEN();\n    \n    set_wall_color(_XL_YELLOW);\n    display_wall(0);\n    display_wall(BOTTOM_WALL_Y+1);\n    display_enemies();\n    mortar_intro_animation();\n    _XL_CLEAR_SCREEN(); \\\n}\n#else\n#define display_second_screen() \n\n#endif\n\n#if XSize>=31\n    #define HI_X ((XSize-10))\n#elif XSize>=23\n    #define HI_X ((XSize-9))\n#else\n    #define HI_X ((XSize-8))\n#endif\n\n#if XSize>=20\n    #define draw_tank_counter_tile() _XL_DRAW(TANK_COUNTER_X,TANK_COUNTER_Y,HEAVY_TANK_TILE_0, level_color[(level+1)&1])\n\n#else\n    #define draw_tank_counter_tile()\n#endif\n\n\n#if XSize>=31\n    #define display_stats() \\\n    do \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        display_score(); \\\n        _XL_SET_TEXT_COLOR(_XL_GREEN); \\\n        _XL_PRINT(HI_X,0,\"HI\"); \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINTD(HI_X+2,0,5, hiscore); \\\n        _XL_DRAW(6,0,ROCKET_TILE_1,_XL_CYAN); \\\n        _XL_DRAW(POWER_UP_X,0,POWER_UP_TILE, _XL_WHITE); \\\n        draw_tank_counter_tile(); \\\n        display_remaining_rockets(); \\\n        display_power_up_counter(); \\\n        display_level(); \\\n        display_lives(_XL_WHITE); \\\n        display_power_ups(); \\\n        display_enemy_counter(); \\\n    } while(0)\n#elif XSize>=20\n    #define display_stats() \\\n    do \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        display_score(); \\\n        _XL_SET_TEXT_COLOR(_XL_GREEN); \\\n        _XL_CHAR(HI_X,0,'H'); \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        _XL_PRINTD(HI_X+1,0,5, hiscore); \\\n        _XL_DRAW(6,0,ROCKET_TILE_1,_XL_CYAN); \\\n        _XL_DRAW(POWER_UP_X,0,POWER_UP_TILE, _XL_WHITE); \\\n        draw_tank_counter_tile(); \\\n        display_remaining_rockets(); \\\n        display_power_up_counter(); \\\n        display_level(); \\\n        display_lives(_XL_WHITE); \\\n        display_power_ups(); \\\n        display_enemy_counter(); \\\n    } while(0)\n#else\n    #define display_stats() \\\n    do \\\n    { \\\n        _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n        display_score(); \\\n        _XL_DRAW(6,0,ROCKET_TILE_1,_XL_CYAN); \\\n        _XL_DRAW(POWER_UP_X,0,POWER_UP_TILE, _XL_WHITE); \\\n        draw_tank_counter_tile(); \\\n        display_remaining_rockets(); \\\n        display_power_up_counter(); \\\n        display_level(); \\\n        display_lives(_XL_WHITE); \\\n        display_power_ups(); \\\n        display_enemy_counter(); \\\n    } while(0)\n#endif\n\n\n\nvoid handle_auto_recharge(void)\n{\n    if(!remaining_rockets)\n    {\n        _XL_SET_TEXT_COLOR(_XL_RED);\n        #if YSize>10\n        PRINT_CENTERED_ON_ROW(2,\"RECHARGE\");\n        #endif\n        if(auto_recharge_counter)\n        {\n            --auto_recharge_counter;\n        }\n        else if(!rechargeItem._active)\n        {\n            if(stinger_x<XSize)\n            {\n                rechargeItem._x = XSize-2;\n            }\n            else\n            {\n                rechargeItem._x = 1;\n            }\n                \n            rechargeItem._y = STINGER_Y;\n            rechargeItem._active = 1;\n            rechargeItem._counter = 2*XSize+XSize/2;\n            \n            auto_recharge_counter=AUTO_RECHARGE_COOL_DOWN;\n            _XL_PING_SOUND();\n        }\n    }\n}\n\n\n#if YSize>10 && !defined(NO_DISPLAY_LEVEL_AT_START_UP)\nvoid display_level_at_start_up(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_CYAN);\n    \n    if(level==LAST_LEVEL)\n    {\n        _XL_PRINT(XSize/2-6, YSize/2,    \"FINAL LEVEL\" );\n    }\n    else\n    {\n        _XL_PRINT(XSize/2-4, YSize/2,      \"LEVEL \" );\n        _XL_PRINTD(XSize/2+2,YSize/2,1,level+1);\n    }\n    if(level<LAST_LEVEL)\n    {\n        uint8_t i;\n        \n        _XL_PRINT(XSize/2-2-level, YSize/2+2, \"VS\");\n        for(i=0;i<=level;++i)\n        {\n            _XL_DRAW(XSize/2+1-level+i*2, YSize/2+2, enemy_tile[i][0], enemy_tile[i][1]);\n        }\n    }\n    one_second();\n    control_instructions();\n    sleep_and_wait_for_input();\n    _XL_PRINT(XSize/2-6, YSize/2,   \"           \");\n    {\n        uint8_t i;\n        for(i=0;i<=2+2*level+1;++i)\n        {\n            _XL_DELETE(XSize/2-2-level+i, YSize/2+2);\n        }\n    }\n    display_wall(CONTROLS_Y);\n}\n#else\n    #define display_level_at_start_up()\n#endif\n\nvoid handle_tank_movement(void)\n{\n    if(!freeze)\n    {\n        if(!(main_loop_counter&tank_move_speed_mask))\n        {\n            move_tanks();\n        }\n    }\n    else\n    {\n        --freeze;\n        if(!freeze)\n        {\n            display_tanks();\n        }\n    }\n}\n\n\n#define handle_next_level() \\\ndo \\\n{ \\\n    ++level; \\\n    PRINT_CENTERED_ON_ROW(1,\"      \"); \\\n    display_cleared(); \\\n    _XL_TOCK_SOUND(); \\\n    if(powerUp) \\\n    { \\\n        do \\\n        { \\\n            --powerUp; \\\n            increase_score(POWER_UP_BONUS); \\\n            display_power_up_counter(); \\\n            _XL_TICK_SOUND(); \\\n            less_short_sleep(); \\\n        } while(powerUp); \\\n    } \\\n    \\\n    control_instructions();    \\\n    sleep_and_wait_for_input(); \\\n    display_wall(CONTROLS_Y); \\\n    killed_heavy_tanks = 0; \\\n    killed_light_tanks = 0; \\\n} while(0)\n\n\n#define player_dies() \\\ndo \\\n{ \\\n    --lives; \\\n    stinger_color=_XL_RED; \\\n    display_stinger(); \\\n    stinger_color=_XL_CYAN; \\\n    _XL_EXPLOSION_SOUND(); \\\n    one_second(); \\\n    control_instructions(); \\\n    sleep_and_wait_for_input(); \\\n} while(0)\n\n\nvoid tank_animation(void)\n{\n    uint8_t i;\n    \n    tank_y_array[tank_x]=YSize/2-7+(uint8_t) ((_XL_RAND())&15);\n    tank_level[tank_x]=1;\n    tank_shape[tank_x]=0;\n\n    display_victory_string(_XL_YELLOW);\n\n    for(i=0;i<3;++i)\n    {\n        display_tank();\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/4);            \n        _XL_DRAW(tank_x,tank_y_array[tank_x],TANK_DEATH_TILE,_XL_RED);\n        _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/4);            \n    }\n    _XL_EXPLOSION_SOUND();\n    _XL_DELETE(tank_x,tank_y_array[tank_x]);\n    display_victory_string(_XL_GREEN);\n    short_sleep();\n}\n\n\nvoid victory_animation(void)\n{\n    uint8_t i;\n    uint8_t j;\n    uint8_t k;\n\n    for(i=1;i<XSize-1;++i)\n    {\n        tank_x = i;\n        tank_animation();\n        tank_x = XSize-1-i;\n        tank_animation();\n    }\n    \n    for(i=0;i<XSize;++i)\n    {\n        _XL_DRAW(i,YSize/2-1,WALL_TILE,_XL_CYAN);\n        _XL_DRAW(XSize-1-i,YSize/2+1,WALL_TILE,_XL_CYAN);\n        _XL_TICK_SOUND();\n        short_sleep();\n    }    \n    less_short_sleep();        \n\n\t// #if !defined(NO_EXTRA_TITLE)\n    for(i=0;i<=4;++i)\n    {\n        _XL_DRAW(XSize/2+1-level+i*2, YSize/2+2, enemy_tile[i][0], enemy_tile[i][1]);\n        _XL_TOCK_SOUND();\n        less_short_sleep();\n    }    \n\t// #endif\n\n    for(j=0;j<5;++j)\n    {\n        for(i=0;i<XSize-2;++i)\n        {\n            for(k=0;k<3;++k)\n            {\n                _XL_DRAW(i+k,YSize/2-1,WALL_TILE,_XL_YELLOW);\n                _XL_DRAW(XSize-1-i-k,YSize/2+1,WALL_TILE,_XL_YELLOW);\n            }\n            short_sleep();\n            display_victory_string(_XL_RED);\n\n            for(k=0;k<3;++k)\n            {\n                _XL_DRAW(i+k,YSize/2-1,WALL_TILE,_XL_CYAN);\n                _XL_DRAW(XSize-1-i-k,YSize/2+1,WALL_TILE,_XL_CYAN);\n            }        \n            short_sleep();\n\n            display_victory_string(_XL_GREEN);\n\n        }\n    }        \n    \n    one_second();\n    for(i=0;i<=4;++i)\n    {\n\t\tk=XSize/2+1-level+i*2;\n\n\t\t// #if !defined(NO_EXTRA_TITLE)\n        for(j=0;j<9;++j)\n        {\n            _XL_DRAW(k, YSize/2+2, enemy_tile[i][0], enemy_tile[i][1]);\n            short_sleep();\n            _XL_DRAW(k, YSize/2+2, EXPLOSION_TILE, _XL_RED);\n            short_sleep();\n        }\n\t\t// #endif\n        _XL_EXPLOSION_SOUND();\n        _XL_SLOW_DOWN(12U*_XL_SLOW_DOWN_FACTOR);        \n        _XL_DELETE(k, YSize/2+2);\n    }\n    short_sleep();\n    \n    control_instructions();\n    sleep_and_wait_for_input();\n    _XL_CLEAR_SCREEN();\n}\n\n#define display_level_screen() \\\ndo \\\n{ \\\n    display_stinger(); \\\n    display_stats(); \\\n    display_level_at_start_up(); \\\n} while(0)\n\n\n#define handle_hyper() \\\n{ \\\n    if(hyper_counter) \\\n    { \\\n        --hyper_counter; \\\n        \\\n        if(!hyper_counter) \\\n        { \\\n            stinger_color = _XL_CYAN; \\\n            number_of_rockets_per_shot=1; \\\n            PRINT_CENTERED_ON_ROW(1,\"      \"); \\\n            display_power_ups(); \\\n        } \\\n    } \\\n}\n\n\n#define INITIALIZE_CROSS_LIB() \\\n    _XL_INIT_GRAPHICS(); \\\n    _XL_INIT_INPUT() \\\n    _XL_INIT_SOUND() \\\n\n\n#define LEVEL_COUNT_DOWN 95\n#define BONUS_DROP_THRESHOLD 55\n#define SECRET_ITEM_DROP_THRESHOLD 128\n\nvoid handle_level_end(void)\n{\n\tif(level_count_down==(uint8_t) LEVEL_COUNT_DOWN+(uint8_t) level*32U)\n\t{\n\t\tuint8_t i;\n\t   \n\t\tfor(i=0;i<25;++i)\n\t\t{\n\t\t\t_XL_SET_TEXT_COLOR(_XL_RED);\n\t\t\tPRINT_CENTERED_ON_ROW(YSize/2,\"BONUS \");\n\t\t\tshort_sleep();\n\t\t\t_XL_TICK_SOUND();\n\t\t\t#if !defined(_XL_NO_TEXT_COLOR)\n\t\t\t_XL_SET_TEXT_COLOR(_XL_YELLOW);\n\t\t\tPRINT_CENTERED_ON_ROW(YSize/2,\"BONUS \");\n\t\t\t#else\n\t\t\tPRINT_CENTERED_ON_ROW(YSize/2,\"      \");\n\t\t\t#endif\n\t\t\tshort_sleep();\n\t\t}\n\t\t_XL_PING_SOUND();\n\t\tless_short_sleep();\n\t\tPRINT_CENTERED_ON_ROW(YSize/2,\"     \");\n\t\t// _XL_SET_TEXT_COLOR(_XL_WHITE);\n\t\t// PRINT_CENTERED_ON_ROW(YSize-2,\"BONUS\");\n\t}\n   \n\tif(level_count_down>BONUS_DROP_THRESHOLD)\n\t{\n\t\tuint8_t index;\n\t   \n\t    // if(!(level_count_down&7))\n\t\t// {\n\t\t\t// _XL_SET_TEXT_COLOR(_XL_RED);\n\t\t\t// PRINT_CENTERED_ON_ROW(1,\"BONUS \");\n\t\t// }\n\t\t// else if(((level_count_down&7)==1))\n\t\t// {\n\t\t\t// _XL_SET_TEXT_COLOR(_XL_YELLOW);\n\t\t\t// PRINT_CENTERED_ON_ROW(1,\"BONUS \");\n\t\t// }\n\t   \n\t\tfor(index=0;(index<lives) && (index<MAX_NUMBER_OF_EXTRA_POINTS);++index)\n\t\t{\n\t\t\tif(!extraPointsItem[index]._active)\n\t\t\t{\n\t\t\t\ttank_x = (uint8_t) 1U+(uint8_t) (_XL_RAND()%(XSize-2));\n\t\t\t\tdrop_item(&extraPointsItem[index],EXTRA_POINTS_COOL_DOWN);\n\t\t\t}\n\t\t}\n\t   \n\t\tif(level>=2)\n\t\t{\n\t\t\tif((lives>2) && (!freezeItem._active))\n\t\t\t{\n\t\t\t\ttank_x = 1U+(uint8_t) (_XL_RAND()%(XSize-2));\n\t\t\t\tdrop_item(&freezeItem,FREEZE_COOL_DOWN);\n\t\t\t}\n\t\t   \n\n\t\t\tif((lives>5) && (!powerUpItem._active))\n\t\t\t{\n\t\t\t\ttank_x = 1+(uint8_t) (_XL_RAND()%(XSize-2));\n\t\t\t\tdrop_item(&powerUpItem,POWER_UP_COOL_DOWN);\n\t\t\t}\n\t\t   \n\t\t\tif(level==LAST_LEVEL)\n\t\t\t{\n\t\t\t\tif((lives>8) && (!secretItem._active) && (level_count_down<SECRET_ITEM_DROP_THRESHOLD) )\n\t\t\t\t{\n\t\t\t\t\ttank_x = 1+(uint8_t) (_XL_RAND()%(XSize-2));\n\t\t\t\t\tdrop_item(&secretItem,SECRET_COOL_DOWN);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n   \n\t--level_count_down;\n}\n\n#if defined(BENCHMARK)\n\t#define BENCHMARK_CODE() \\\n\t\tTicksDelta = clock() - Ticks; \\\n\t\tMilli = ((TicksDelta % CLOCKS_PER_SEC) * 1000) / CLOCKS_PER_SEC; \\\n\t\tCumulative+=Milli; \\\n\t\tif((main_loop_counter&31)==31) \\\n\t\t{ \\\n\t\t\tif(Average!=0) \\\n\t\t\t{ \\\n\t\t\t\tAverage=Cumulative/32; \\\n\t\t\t} \\\n\t\t\telse \\\n\t\t\t{ \\\n\t\t\t\tAverage=Cumulative; \\\n\t\t\t} \\\n\t\t\tCumulative = 0; \\\n\t\t\t_XL_PRINTD(0,YSize-6,4,Average); \\\n\t\t} \\\n\t\t_XL_PRINTD(0,YSize-7,4,Milli);\n#else\n\t#define BENCHMARK_CODE()\n#endif\n\n\n#if defined(BENCHMARK)\n\t#define INIT_BENCHMARK_CODE() \\\n\t\tTicks = clock();\n#else\n\t#define INIT_BENCHMARK_CODE()\n#endif\n\nint main(void)\n{\n    #if defined(BENCHMARK)\n    clock_t Ticks, TicksDelta;\n    // unsigned int Sec;\n    unsigned int Milli, Cumulative, Average;    \n    Cumulative = 0;\n    Average = 0;\n    #endif\n    \n    INITIALIZE_CROSS_LIB();\n\n    hiscore = 0;\n\n\t#if defined(_XL_NO_COLOR) || defined(_XL_NO_TEXT_COLOR)\n\t\tdisplay_stinger_string(_XL_CYAN);\n\t#endif\n    while(1) // Game (re-)start\n    {\n        global_initialization();\n\n        display_initial_screen();\n        display_second_screen();\n        \n        while(lives && level<=LAST_LEVEL) // Level (re)-start \n        {            \n            level_initialization();\n            tank_initialization();\n            display_level_screen();\n            \n            while(alive && level_count_down) // Inner game loop\n            {            \n                INIT_BENCHMARK_CODE();\n            \n                // _XL_PRINTD(0,YSize-4,2,MAX_ROCKETS_ON_SCREEN);\n                // _XL_PRINTD(4,YSize-4,2,MAX_NUMBER_OF_MISSILES);\n                // _XL_PRINTD(9,YSize-6,2,DEATH_LOOP);\n                \n                handle_hyper();\n                handle_stinger_move();\n                handle_stinger_load();\n                handle_rockets(); \n                handle_auto_recharge();\n                if(!light_tanks_to_kill && !heavy_tanks_to_kill)\n                {\n                    handle_level_end();\n                }\n                else\n                {\n                    handle_tank_movement();\n                }\n                handle_tank_collisions();\n\t\t\t\tshort_sleep();     \n\n                handle_missile_drops();\n                handle_items();\n\t\t\t\t// if(!alive)\n\t\t\t\t// {\n\t\t\t\t\t// break;\n\t\t\t\t// }\n                handle_artillery_shell();\n                ++main_loop_counter;\n                \n\t\t\t\tBENCHMARK_CODE();\n            \n            }\n            if(alive)\n            {\n                handle_next_level();\n            }\n            else\n            {\n                player_dies();\n            }\n        }\n        if(lives)\n        {\n            victory_animation();\n        }\n        else\n        {\n            display_wall(CONTROLS_Y);\n        }\n        game_over();\n    }\n\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/games/stinger/makefiles/Makefile.override",
    "content": "\r\n# c16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 -m mapfile.txt \\\r\n\t# --config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30.cfg \\\r\n\t# -D__NO_SCREEN_COLOR_INIT -DYSize=17 \\\r\n\t# -D__ALT_PRINT \\\r\n\t# -D__MEMORY_MAPPED_GRAPHICS \\\r\n\t# -D__ASSEMBLY_CLEAR_SCREEN \\\r\n\t# -D__ALT_SLEEP \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \\\r\n\t# -D__UDG_BASE_FACTOR=15 \\\r\n\t# $(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t# $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t# $(FULL_FILES) \\\r\n\t# $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\ncreativision: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t creativision  \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CREATIVISION__ -DMAX_NUMBER_OF_MISSILES=5 -DMAX_ROCKETS_ON_SCREEN=8  -DNO_BOTTOM_WALL_REDRAW \\\r\n\t-D__ALT_SLEEP -D__VDP_MODE1_GRAPHICS -DXSize=26 -DX_OFFSET=3  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=1800  \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k_less_stack.cfg \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin\r\n\r\nifdef USE_TOOLS\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\nelse\r\ngamate: $(ASSETS_PATH)/cc65_gamate_tiles.s\r\nendif\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t gamate   --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \\\r\n\t \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAMATE_SLOWDOWN) \\\r\n\t $(GAMATE_GAME_OPTS) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -DXSize=18 -DX_OFFSET=1 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_gamate_tiles.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\nifdef USE_TOOLS\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin\r\nendif    \r\n\r\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape0.txt",
    "content": "#...#.\n.###..\n#####.\n.#.#..\n##.##.\n.###..\n.#.#..\n..#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape1.txt",
    "content": "......\n......\n#...#.\n.###..\n#####.\n.#.#..\n##.##.\n.###..\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape10.txt",
    "content": "......\n......\n......\n......\n......\n#.#...\n.#....\n#.#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape11.txt",
    "content": "......\n......\n......\n......\n.....#\n...#.#\n....#.\n...#.#\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape12.txt",
    "content": ".#....\n###...\n###...\n.#....\n####..\n.#..#.\n.#.###\n....#.\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape13.txt",
    "content": "......\n......\n......\n......\n..####\n.#....\n###...\n.#....\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape14.txt",
    "content": "#...#.\n.###..\n#...#.\n#.#.#.\n.###..\n#.#.#.\n..#...\n..#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape15.txt",
    "content": "......\n......\n......\n..#...\n#...#.\n..#...\n.#.#..\n..#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape16.txt",
    "content": "......\n......\n......\n......\n####..\n....#.\n...###\n....#.\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape17.txt",
    "content": "....#.\n...###\n...###\n....#.\n....#.\n....#.\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape18.txt",
    "content": ".#....\n###...\n###...\n.#....\n.#....\n.#....\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape19.txt",
    "content": "#...#.\n.###..\n#####.\n.#.#..\n##.##.\n.###..\n#.#.#.\n..#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape2.txt",
    "content": ".#.#..\n..#...\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape20.txt",
    "content": "#####.\n.#.#..\n##.##.\n.###..\n#.#.#.\n..#...\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape21.txt",
    "content": "##.##.\n.###..\n#.#.#.\n..#...\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape22.txt",
    "content": "#.#.#.\n..#...\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape23.txt",
    "content": "......\n..##..\n.####.\n###.##\n####.#\n###.##\n.####.\n..##..\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape24.txt",
    "content": ".###..\n#####.\n######\n#..#.#\n######\n# #..#\n######\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape25.txt",
    "content": "......\n......\n......\n..##..\n.##.#.\n####.#\n.##.#.\n..##..\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape26.txt",
    "content": "......\n......\n......\n......\n......\n..#...\n..#...\n..#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape3.txt",
    "content": "......\n......\n......\n......\n#...#.\n.###..\n#####.\n.#.#..\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape4.txt",
    "content": "##.##.\n.###..\n.#.#..\n..#...\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape5.txt",
    "content": "......\n......\n......\n......\n......\n......\n#...#.\n.###..\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape6.txt",
    "content": "#####.\n.#.#..\n##.##.\n.###..\n.#.#..\n..#...\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape7.txt",
    "content": "#...#.\n.###..\n......\n#.#.#.\n......\n.###..\n#.#.#.\n..#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape8.txt",
    "content": ".####.\n######\n##..##\n#....#\n#....#\n##..##\n######\n.####.\n"
  },
  {
    "path": "src/games/stinger/shapes/6x8/shape9.txt",
    "content": "....#.\n...###\n...###\n....#.\n..####\n.#..#.\n###.#.\n.#....\n"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape0.txt",
    "content": "......\n#...#.\n.###..\n#####.\n.#.#..\n##.##.\n.###..\n.#.#..\n..#...\n"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape1.txt",
    "content": "......\n......\n......\n#...#.\n.###..\n#####.\n.#.#..\n##.##.\n.###.."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape10.txt",
    "content": "......\n......\n......\n......\n......\n......\n#.#...\n.#....\n#.#..."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape11.txt",
    "content": "......\n......\n......\n......\n......\n.....#\n...#.#\n....#.\n...#.#"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape12.txt",
    "content": "......\n.#....\n###...\n###...\n.#....\n####..\n.#..#.\n.#.###\n....#.\n"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape13.txt",
    "content": "......\n......\n......\n......\n......\n..####\n.#....\n###...\n.#...."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape14.txt",
    "content": "......\n#...#.\n.###..\n#...#.\n#.#.#.\n.###..\n#.#.#.\n..#...\n..#..."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape15.txt",
    "content": "......\n......\n......\n......\n..#...\n#...#.\n..#...\n.#.#..\n..#..."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape16.txt",
    "content": "......\n......\n......\n......\n......\n####..\n....#.\n...###\n....#."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape17.txt",
    "content": "......\n....#.\n...###\n...###\n....#.\n....#.\n....#.\n......\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape18.txt",
    "content": "......\n.#....\n###...\n###...\n.#....\n.#....\n.#....\n......\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape19.txt",
    "content": "......\n#...#.\n.###..\n#####.\n.#.#..\n##.##.\n.###..\n#.#.#.\n..#..."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape2.txt",
    "content": ".#.#..\n..#...\n......\n......\n......\n......\n......\n......\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape20.txt",
    "content": "#####.\n.#.#..\n##.##.\n.###..\n#.#.#.\n..#...\n......\n......\n......\n"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape21.txt",
    "content": "##.##.\n.###..\n#.#.#.\n..#...\n......\n......\n......\n......\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape22.txt",
    "content": "#.#.#.\n..#...\n......\n......\n......\n......\n......\n......\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape23.txt",
    "content": "......\n......\n..##..\n.####.\n###.##\n####.#\n###.##\n.####.\n..##.."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape24.txt",
    "content": "......\n.###..\n#####.\n######\n#..#.#\n######\n# #..#\n######\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape25.txt",
    "content": "......\n......\n......\n......\n..##..\n.##.#.\n####.#\n.##.#.\n..##.."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape26.txt",
    "content": "......\n......\n......\n......\n......\n......\n..#...\n..#...\n..#..."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape3.txt",
    "content": "......\n......\n......\n......\n......\n#...#.\n.###..\n#####.\n.#.#.."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape4.txt",
    "content": "##.##.\n.###..\n.#.#..\n..#...\n......\n......\n......\n......\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape5.txt",
    "content": "......\n......\n......\n......\n......\n......\n......\n#...#.\n.###.."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape6.txt",
    "content": "#####.\n.#.#..\n##.##.\n.###..\n.#.#..\n..#...\n......\n......\n......"
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape7.txt",
    "content": "......\n#...#.\n.###..\n......\n#.#.#.\n......\n.###..\n#.#.#.\n..#..."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape8.txt",
    "content": "......\n.####.\n######\n##..##\n#....#\n#....#\n##..##\n######\n.####."
  },
  {
    "path": "src/games/stinger/shapes/6x9/shape9.txt",
    "content": "......\n....#.\n...###\n...###\n....#.\n..####\n.#..#.\n###.#.\n.#...."
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape0.txt",
    "content": "##...##\n#.###.#\n#######\n#.#.#.#\n###.###\n#.###.#\n#.#.#.#\n...#...\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape1.txt",
    "content": ".......\n.......\n##...##\n#.###.#\n#######\n#.#.#.#\n###.###\n#.###.#\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape10.txt",
    "content": ".......\n.......\n.......\n.......\n#......\n#.#....\n.#.....\n#.#....\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape11.txt",
    "content": ".......\n.......\n.......\n.......\n......#\n....#.#\n.....#.\n....#.#\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape12.txt",
    "content": ".#.....\n###....\n###....\n.#.....\n#####..\n.#...#.\n.#..###\n.....#.\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape13.txt",
    "content": ".......\n.......\n.......\n.......\n..#####\n.#.....\n###....\n.#.....\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape14.txt",
    "content": "##...##\n#.###.#\n.#...#.\n.#.#.#.\n#.###.#\n##.#.##\n...#...\n...#...\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape15.txt",
    "content": ".......\n.......\n.......\n...#...\n#.....#\n...#...\n.#.#.#.\n...#...\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape16.txt",
    "content": ".......\n.......\n.......\n.......\n#####..\n.....#.\n....###\n.....#.\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape17.txt",
    "content": ".....#.\n....###\n....###\n.....#.\n.....#.\n.....#.\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape18.txt",
    "content": ".#.....\n###....\n###....\n.#.....\n.#.....\n.#.....\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape19.txt",
    "content": "##...##\n#.###.#\n#######\n#.#.#.#\n###.###\n#.###.#\n##.#.##\n...#...\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape2.txt",
    "content": "#.#.#.#\n...#...\n.......\n.......\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape20.txt",
    "content": "#######\n#.#.#.#\n###.###\n#.###.#\n##.#.##\n...#...\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape21.txt",
    "content": "###.###\n#.###.#\n##.#.##\n...#...\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape22.txt",
    "content": "##.#.##\n...#...\n.......\n.......\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape23.txt",
    "content": ".......\n...#...\n..###..\n.###.#.\n#####.#\n.###.#.\n..###..\n...#...\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape24.txt",
    "content": ".####..\n######.\n#######\n#....#.\n#######\n#.#....\n#######\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape25.txt",
    "content": ".......\n.......\n.......\n...##..\n..##.#.\n.####.#\n..##.#.\n...##..\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape26.txt",
    "content": ".......\n.......\n.......\n.......\n.......\n...#...\n...#...\n...#...\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape3.txt",
    "content": ".......\n.......\n.......\n.......\n##...##\n#.###.#\n#######\n#.#.#.#\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape4.txt",
    "content": "###.###\n#.###.#\n#.#.#.#\n...#...\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape5.txt",
    "content": ".......\n.......\n.......\n.......\n.......\n.......\n##...##\n#.###.#\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape6.txt",
    "content": "#######\n#.#.#.#\n###.###\n#.###.#\n#.#.#.#\n...#...\n.......\n.......\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape7.txt",
    "content": "##...##\n#.###.#\n.......\n#.#.#.#\n.......\n#.###.#\n##.#.##\n...#...\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape8.txt",
    "content": ".......\n..###..\n.#####.\n###.###\n##...##\n###.###\n.#####.\n..###..\n"
  },
  {
    "path": "src/games/stinger/shapes/7x8/shape9.txt",
    "content": ".....#.\n....###\n....###\n.....#.\n..#####\n.#...#.\n###..#.\n.#.....\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape0.txt",
    "content": "##...##.\n#.###.#.\n###.###.\n#.#.#.#.\n...#....\n........\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape1.txt",
    "content": "........\n........\n##...##.\n#.###.#.\n###.###.\n#.#.#.#.\n\n\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape10.txt",
    "content": "........\n........\n........\n#.......\n#.#.....\n.#......\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape11.txt",
    "content": "........\n........\n........\n......##\n....#.#.\n.....#..\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape12.txt",
    "content": ".#......\n###.....\n###.....\n#####...\n.#...#..\n.#..###.\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape13.txt",
    "content": "........\n........\n........\n..######\n.#......\n###.....\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape14.txt",
    "content": "##...##.\n#.###.#.\n.#.#.#..\n#.###.#.\n##.#.##.\n...#....\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape15.txt",
    "content": "........\n........\n...#....\n#.....#.\n...#....\n.#.#.#..\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape16.txt",
    "content": "........\n........\n........\n#####...\n.....#..\n....###.\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape17.txt",
    "content": ".....#..\n....###.\n....###.\n.....#..\n.....#..\n........\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape18.txt",
    "content": ".#......\n###.....\n###.....\n.#......\n.#......\n........\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape19.txt",
    "content": "##...##.\n#.###.#.\n###.###.\n#.#.#.#.\n##.#.##.\n...#....\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape2.txt",
    "content": "...#....\n........\n........\n........\n........\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape20.txt",
    "content": "###.###.\n#.#.#.#.\n##.#.##.\n...#....\n........\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape21.txt",
    "content": "#.#.#.#.\n##.#.##.\n...#....\n........\n........\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape22.txt",
    "content": "##.#.##.\n...#....\n........\n........\n........\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape23.txt",
    "content": "........\n...##...\n..##.#..\n.####.#.\n..##.#..\n...##...\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape24.txt",
    "content": ".#####..\n########\n#....#.#\n########\n#.#....#\n########\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape25.txt",
    "content": "........\n...#....\n..#.#...\n.###.#..\n..#.#...\n...#....\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape26.txt",
    "content": "........\n........\n...#....\n...#....\n...#....\n........\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape3.txt",
    "content": "........\n........\n........\n##...##.\n#.###.#.\n###.###."
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape4.txt",
    "content": "#.#.#.#.\n...#....\n........\n........\n........\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape5.txt",
    "content": "........\n........\n........\n........\n##...##.\n#.###.#.\n\n\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape6.txt",
    "content": "###.###.\n#.#.#.#.\n...#....\n........\n........\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape7.txt",
    "content": "##...##.\n........\n###.###.\n........\n##.#.##.\n...#...."
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape8.txt",
    "content": ".######.\n###..###\n##....##\n##....##\n###..###\n.######.\n"
  },
  {
    "path": "src/games/stinger/shapes/8x6/shape9.txt",
    "content": ".....#..\n....###.\n....###.\n..######\n.#...#..\n###..#..\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape0.txt",
    "content": "##...##.\r\n#.###.#.\r\n#######.\r\n#.#.#.#.\r\n###.###.\r\n#.###.#.\r\n#.#.#.#.\r\n...#...."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape1.txt",
    "content": "........\r\n........\r\n##...##.\r\n#.###.#.\r\n#######.\r\n#.#.#.#.\r\n###.###.\r\n#.###.#.\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape10.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n#.......\r\n#.#.....\r\n.#......\r\n#.#.....\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape11.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n......##\r\n....#.#.\r\n.....#..\r\n....#.#.\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape12.txt",
    "content": ".#......\r\n###.....\r\n###.....\r\n.#......\r\n#####...\r\n.#...#..\r\n.#..###.\r\n.....#..\r\n\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape13.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n..######\r\n.#......\r\n###.....\r\n.#......\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape14.txt",
    "content": "##...##.\r\n#.###.#.\r\n.#...#..\r\n.#.#.#..\r\n#.###.#.\r\n##.#.##.\r\n...#....\r\n...#...."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape15.txt",
    "content": "........\r\n........\r\n........\r\n...#....\r\n#.....#.\r\n...#....\r\n.#.#.#..\r\n...#....\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape16.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n#####...\r\n.....#..\r\n....###.\r\n.....#..\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape17.txt",
    "content": ".....#..\r\n....###.\r\n....###.\r\n.....#..\r\n.....#..\r\n.....#..\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape18.txt",
    "content": ".#......\r\n###.....\r\n###.....\r\n.#......\r\n.#......\r\n.#......\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape19.txt",
    "content": "##...##.\r\n#.###.#.\r\n#######.\r\n#.#.#.#.\r\n###.###.\r\n#.###.#.\r\n##.#.##.\r\n...#...."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape2.txt",
    "content": "#.#.#.#.\r\n...#....\r\n........\r\n........\r\n........\r\n........\r\n........\r\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape20.txt",
    "content": "#######.\r\n#.#.#.#.\r\n###.###.\r\n#.###.#.\r\n##.#.##.\r\n...#....\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape21.txt",
    "content": "###.###.\r\n#.###.#.\r\n##.#.##.\r\n...#....\r\n........\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape22.txt",
    "content": "##.#.##.\r\n...#....\r\n........\r\n........\r\n........\r\n........\r\n........\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape23.txt",
    "content": "........\r\n...##...\r\n..####..\r\n.####.#.\r\n######.#\r\n.####.#.\r\n..####..\r\n...##..."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape24.txt",
    "content": ".####...\r\n######..\r\n########\r\n#....#.#\r\n########\r\n#.#....#\r\n########\r\n........\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape25.txt",
    "content": "........\r\n........\r\n........\r\n...##...\r\n..##.#..\r\n.####.#.\r\n..##.#..\r\n...##..."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape26.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n........\r\n...#....\r\n...#....\r\n...#...."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape3.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n##...##.\r\n#.###.#.\r\n#######.\r\n#.#.#.#."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape4.txt",
    "content": "###.###.\r\n#.###.#.\r\n#.#.#.#.\r\n...#....\r\n........\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape5.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n........\r\n........\r\n##...##.\r\n#.###.#.\r\n\r\n\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape6.txt",
    "content": "#######.\r\n#.#.#.#.\r\n###.###.\r\n#.###.#.\r\n#.#.#.#.\r\n...#....\r\n........\r\n........"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape7.txt",
    "content": "##...##.\r\n#.###.#.\r\n........\r\n#.#.#.#.\r\n........\r\n#.###.#.\r\n##.#.##.\r\n...#...."
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape8.txt",
    "content": "..####..\r\n.######.\r\n###..###\r\n##....##\r\n##....##\r\n###..###\r\n.######.\r\n..####..\r\n"
  },
  {
    "path": "src/games/stinger/shapes/8x8/shape9.txt",
    "content": ".....#..\r\n....###.\r\n....###.\r\n.....#..\r\n..######\r\n.#...#..\r\n###..#..\r\n.#......\r\n"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile0.txt",
    "content": "34,28,62,20,54,28,20,8"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile1.txt",
    "content": "0,0,34,28,62,20,54,28"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile10.txt",
    "content": "0,0,0,0,0,40,16,40"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile11.txt",
    "content": "0,0,0,0,1,5,2,5"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile12.txt",
    "content": "16,56,56,16,60,18,23,2"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile13.txt",
    "content": "0,0,0,0,15,16,56,16"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile14.txt",
    "content": "34,28,34,42,28,42,8,8"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile15.txt",
    "content": "0,0,0,8,34,8,20,8"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile16.txt",
    "content": "0,0,0,0,60,2,7,2"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile17.txt",
    "content": "2,7,7,2,2,2,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile18.txt",
    "content": "16,56,56,16,16,16,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile19.txt",
    "content": "34,28,62,20,54,28,42,8"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile2.txt",
    "content": "20,8,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile20.txt",
    "content": "62,20,54,28,42,8,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile21.txt",
    "content": "54,28,42,8,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile22.txt",
    "content": "42,8,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile23.txt",
    "content": "0,12,30,59,61,59,30,12"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile24.txt",
    "content": "28,62,63,37,63,41,63,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile25.txt",
    "content": "0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile26.txt",
    "content": "0,0,0,0,0,8,8,8"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,34,28,62,20"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile4.txt",
    "content": "54,28,20,8,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,34,28"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile6.txt",
    "content": "62,20,54,28,20,8,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile7.txt",
    "content": "34,28,0,42,0,28,42,8"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile8.txt",
    "content": "30,63,51,33,33,51,63,30"
  },
  {
    "path": "src/games/stinger/tiles/6x8/tile9.txt",
    "content": "2,7,7,2,15,18,58,16"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile0.txt",
    "content": "0,34,28,62,20,54,28,20,8"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile1.txt",
    "content": "0,0,0,34,28,62,20,54,28"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,0,0,40,16,40"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,0,1,5,2,5"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile12.txt",
    "content": "0,16,56,56,16,60,18,23,2"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,0,15,16,56,16"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile14.txt",
    "content": "0,34,28,34,42,28,42,8,8"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile15.txt",
    "content": "0,0,0,0,8,34,8,20,8"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,0,60,2,7,2"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile17.txt",
    "content": "0,2,7,7,2,2,2,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile18.txt",
    "content": "0,16,56,56,16,16,16,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile19.txt",
    "content": "0,34,28,62,20,54,28,42,8"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile2.txt",
    "content": "20,8,0,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile20.txt",
    "content": "62,20,54,28,42,8,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile21.txt",
    "content": "54,28,42,8,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile22.txt",
    "content": "42,8,0,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile23.txt",
    "content": "0,0,12,30,59,61,59,30,12"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile24.txt",
    "content": "0,28,62,63,37,63,41,63,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile25.txt",
    "content": "0,0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile26.txt",
    "content": "0,0,0,0,0,0,8,8,8"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,34,28,62,20"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile4.txt",
    "content": "54,28,20,8,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,34,28"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile6.txt",
    "content": "62,20,54,28,20,8,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile7.txt",
    "content": "0,34,28,0,42,0,28,42,8"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile8.txt",
    "content": "0,30,63,51,33,33,51,63,30"
  },
  {
    "path": "src/games/stinger/tiles/6x9/tile9.txt",
    "content": "0,2,7,7,2,15,18,58,16"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile0.txt",
    "content": "99,93,127,85,119,93,85,8"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile1.txt",
    "content": "0,0,99,93,127,85,119,93"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile10.txt",
    "content": "0,0,0,0,64,80,32,80"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile11.txt",
    "content": "0,0,0,0,1,5,2,5"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile12.txt",
    "content": "32,112,112,32,124,34,39,2"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile13.txt",
    "content": "0,0,0,0,31,32,112,32"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile14.txt",
    "content": "99,93,34,42,93,107,8,8"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile15.txt",
    "content": "0,0,0,8,65,8,42,8"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile16.txt",
    "content": "0,0,0,0,124,2,7,2"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile17.txt",
    "content": "2,7,7,2,2,2,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile18.txt",
    "content": "32,112,112,32,32,32,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile19.txt",
    "content": "99,93,127,85,119,93,107,8"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile2.txt",
    "content": "85,8,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile20.txt",
    "content": "127,85,119,93,107,8,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile21.txt",
    "content": "119,93,107,8,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile22.txt",
    "content": "107,8,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile23.txt",
    "content": "0,8,28,58,125,58,28,8"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile24.txt",
    "content": "60,126,127,66,127,80,127,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile25.txt",
    "content": "0,0,0,12,26,61,26,12"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile26.txt",
    "content": "0,0,0,0,0,8,8,8"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,99,93,127,85"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile4.txt",
    "content": "119,93,85,8,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,99,93"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile6.txt",
    "content": "127,85,119,93,85,8,0,0"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile7.txt",
    "content": "99,93,0,85,0,93,107,8"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile8.txt",
    "content": "0,28,62,119,99,119,62,28"
  },
  {
    "path": "src/games/stinger/tiles/7x8/tile9.txt",
    "content": "2,7,7,2,31,34,114,32"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile0.txt",
    "content": "198,186,238,170,16,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile1.txt",
    "content": "0,0,198,186,238,170"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile10.txt",
    "content": "0,0,0,128,160,64"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile11.txt",
    "content": "0,0,0,3,10,4"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile12.txt",
    "content": "64,224,224,248,68,78"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile13.txt",
    "content": "0,0,0,63,64,224"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile14.txt",
    "content": "198,186,84,186,214,16"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile15.txt",
    "content": "0,0,16,130,16,84"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile16.txt",
    "content": "0,0,0,248,4,14"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile17.txt",
    "content": "4,14,14,4,4,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile18.txt",
    "content": "64,224,224,64,64,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile19.txt",
    "content": "198,186,238,170,214,16"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile2.txt",
    "content": "16,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile20.txt",
    "content": "238,170,214,16,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile21.txt",
    "content": "170,214,16,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile22.txt",
    "content": "214,16,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile23.txt",
    "content": "0,24,52,122,52,24"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile24.txt",
    "content": "124,255,133,255,161,255"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile25.txt",
    "content": "0,16,40,116,40,16"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile26.txt",
    "content": "0,0,16,16,16,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile3.txt",
    "content": "0,0,0,198,186,238"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile4.txt",
    "content": "170,16,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile5.txt",
    "content": "0,0,0,0,198,186"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile6.txt",
    "content": "238,170,16,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile7.txt",
    "content": "198,0,238,0,214,16"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile8.txt",
    "content": "126,231,195,195,231,126"
  },
  {
    "path": "src/games/stinger/tiles/8x6/tile9.txt",
    "content": "4,14,14,63,68,228"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile0.txt",
    "content": "198,186,254,170,238,186,170,16"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile1.txt",
    "content": "0,0,198,186,254,170,238,186"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile10.txt",
    "content": "0,0,0,0,128,160,64,160"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile11.txt",
    "content": "0,0,0,0,3,10,4,10"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile12.txt",
    "content": "64,224,224,64,248,68,78,4"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile13.txt",
    "content": "0,0,0,0,63,64,224,64"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile14.txt",
    "content": "198,186,68,84,186,214,16,16"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile15.txt",
    "content": "0,0,0,16,130,16,84,16"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile16.txt",
    "content": "0,0,0,0,248,4,14,4"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile17.txt",
    "content": "4,14,14,4,4,4,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile18.txt",
    "content": "64,224,224,64,64,64,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile19.txt",
    "content": "198,186,254,170,238,186,214,16"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile2.txt",
    "content": "170,16,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile20.txt",
    "content": "254,170,238,186,214,16,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile21.txt",
    "content": "238,186,214,16,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile22.txt",
    "content": "214,16,0,0,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile23.txt",
    "content": "0,24,60,122,253,122,60,24"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile24.txt",
    "content": "120,252,255,133,255,161,255,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile25.txt",
    "content": "0,0,0,24,52,122,52,24"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile26.txt",
    "content": "0,0,0,0,0,16,16,16"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,198,186,254,170"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile4.txt",
    "content": "238,186,170,16,0,0,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,198,186"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile6.txt",
    "content": "254,170,238,186,170,16,0,0"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile7.txt",
    "content": "198,186,0,170,0,186,214,16"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/games/stinger/tiles/8x8/tile9.txt",
    "content": "4,14,14,4,63,68,228,64"
  },
  {
    "path": "src/games/stinger/tiles/ASCII/aquarius/aquarius_char_tiles.h",
    "content": "#ifndef _AQUARIUS_CHAR_TILES_H\r\n#define _AQUARIUS_CHAR_TILES_H\r\n\r\n#define _TILE_0 157\r\n// 'X'\r\n#define _TILE_1 157\r\n\r\n#define _TILE_2 ' '\r\n\r\n#define _TILE_3 157\r\n\r\n#define _TILE_4 ' '\r\n\r\n#define _TILE_5 157\r\n\r\n#define _TILE_6 ' '\r\n\r\n\r\n\r\n#define _TILE_8 'o'\r\n//150\r\n//135\r\n//'O'\r\n\r\n// Bow parts \r\n#define _TILE_10 ' '\r\n#define _TILE_11 ' '\r\n\r\n// Loaded bow\r\n#if defined(__MEMORY_MAPPED_GRAPHICS)\r\n#define _TILE_9  8\r\n#define _TILE_12 8\r\n#endif\r\n\r\n// Empty bow\r\n#define _TILE_13 214 \r\n#define _TILE_16 214\r\n\r\n\r\n\r\n#define _TILE_14 'H'\r\n\r\n#define _TILE_15 'L'\r\n\r\n\r\n#define _TILE_17 94\r\n//124\r\n//'I'\r\n\r\n#define _TILE_18 94\r\n//124\r\n//'I'\r\n\r\n#define _TILE_19 146\r\n//157\r\n//'V'\r\n\r\n#define _TILE_20 147\r\n\r\n#define _TILE_21 146\r\n\r\n// Beam and top border\r\n#define _TILE_22 211\r\n\r\n// Dead\r\n#define _TILE_7 19\r\n//209\r\n//'='\r\n\r\n#define _TILE_23 '*'\r\n\r\n// Wall\r\n#define _TILE_24 253\r\n//134\r\n\r\n\r\n#define _TILE_25 '$'\r\n\r\n\r\n#endif // _AQUARIUS_CHAR_TILES_H\r\n"
  },
  {
    "path": "src/games/stinger/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if defined(__TARGET_SPECIFIC_ASCII) && defined(__AQUARIUS__) && !defined(__QUAD_MEMORY_MAPPED_GRAPHICS) && !defined(__DUAL_MEMORY_MAPPED_GRAPHICS)\r\n    #include \"aquarius/aquarius_char_tiles.h\"\r\n#else\r\n    \r\n#define _TILE_0 'X'\r\n#define _TILE_1 ' '\r\n\r\n#define _TILE_2 'X'\r\n\r\n#define _TILE_3 ' '\r\n\r\n#define _TILE_4 'X'\r\n\r\n#define _TILE_5 ' '\r\n\r\n#define _TILE_6 'X'\r\n\r\n#define _TILE_8 'O'\r\n\r\n#define _TILE_9 'I'\r\n\r\n#define _TILE_10 ' '\r\n\r\n#define _TILE_11 ' '\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 'T' \r\n\r\n#define _TILE_14 'H'\r\n\r\n#define _TILE_16 'T'\r\n\r\n#define _TILE_19 'V'\r\n\r\n#define _TILE_20 'V'\r\n\r\n#define _TILE_21 'V'\r\n\r\n#define _TILE_22 'V'\r\n\r\n#define _TILE_23 'F'\r\n\r\n#if !defined(__CIDELSA__) && !defined(__ATARI7800__)\r\n    #define _TILE_7  '='\r\n\t#define _TILE_15 '*'\r\n    #define _TILE_24 '-'\r\n\t#define _TILE_25 '$' \r\n#else\r\n    #define _TILE_7  'S'\r\n\t#define _TILE_15 'X'\r\n    #define _TILE_24 'M'\r\n\t#define _TILE_25 'S'\r\n\r\n#endif\r\n\r\n\r\n#if defined(__CIDELSA__) || defined(__MC10__)\r\n\t#define _TILE_17 'I'\r\n\t#define _TILE_18 'I'\r\n\t#if defined(__MC10__)\r\n\t#define _TILE_26 '.'\r\n\t#else\r\n\t#define _TILE_26 'I'\r\n\t#endif\r\n#else\r\n\t#define _TILE_17 '|'\r\n\t#define _TILE_18 '|'\t\r\n\t#define _TILE_26 '.'\r\n#endif\r\n\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/trex/Makefile.trex",
    "content": "\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := trex\r\n\r\nPARENT_DIR = games\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\r\n\r\ninclude ./Makefile_common\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/games/trex/config/game_config.mk",
    "content": "#\r\n\r\n# COCO_COLOR_GFX_GAME_OPTS ?= \r\n\r\n# CREATIVISION_GAME_OPTS ?= -DMAX_NUMBER_OF_MISSILES=2 -DMAX_ROCKETS_ON_SCREEN=7 -DNO_BOTTOM_WALL_REDRAW\r\n\r\n# GAMATE_GAME_OPTS ?= -DMAX_NUMBER_OF_MISSILES=3 -DMAX_ROCKETS_ON_SCREEN=4 \r\n\r\nC128_Z80_80COL_GAME_OPTS ?= -DNO_CACTUS_TRANSITION -DSLOWER_FEET -DFEWER_DISPLAYS\r\n    \r\n# ZX81_NO_GFX_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=7 -DMAX_NUMBER_OF_MISSILES=4 -DMISSILE_DROP_LOOP_MASK=1 -DSMALL_WALL \r\n\r\nZX81_GFX_GAME_OPTS ?= -DNO_CACTUS_TRANSITION -DSLOWER_FEET -DFEWER_DISPLAYS\r\n\r\n# APPLE2_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=4\r\n\r\nCOMX_GAME_OPTS ?= \t-DNO_CACTUS_TRANSITION\r\n\r\nPECOM_GAME_OPTS ?= \t-DNO_CACTUS_TRANSITION\r\n\r\n# TMC600_GAME_OPTS ?= \t-DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=4 -DSMALL_WALL -DNO_BOTTOM_WALL_REDRAW -DNORMAL_ZOMBIE_SPEED=1 -DSLOW_ZOMBIE_SPEED=7\r\n\r\n# CPC_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=6 -DMAX_NUMBER_OF_MISSILES=4\r\n\r\n# CAMPUTERS_LYNX_GAME_OPTS ?= -DMAX_ROCKETS_ON_SCREEN=5 -DMAX_NUMBER_OF_MISSILES=3\r\n\r\n# NCURSES_GAME_OPTS ?= -DNO_EXTRA_TITLE\r\n\r\nVIC20_UNEXPANDED_NO_GFX_GAME_OPTS ?= -DTINY_GAME -DNO_CACTUS_TRANSITION -DFEWER_DISPLAYS\r\n\r\nVIC20_UNEXPANDED_GAME_OPTS ?= -DTINY_GAME \t-DNO_CACTUS_TRANSITION  -DFEWER_DISPLAYS\r\n\r\nHECTOR1_GAME_OPTS          ?= -DTINY_GAME \t-DNO_CACTUS_TRANSITION  -DFEWER_DISPLAYS"
  },
  {
    "path": "src/games/trex/config/project_config.mk",
    "content": "#####################################################################\r\n# DISPLAY FLAGS\r\n\r\n\r\n4COLOR_PALETTE=\r\n# __USE_GREEN\r\n\r\nORIC_COLORS=\r\n# __MONO_COLORS\r\n\r\nMC10_COLORS=\r\n# __REVERSE_LETTERS\r\n\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=5\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=10\r\n_APPLE2_SLOWDOWN=12\r\n_APPLE2ENH_SLOWDOWN=16\r\n_APPLE2_HGR_SLOWDOWN=12\r\n_APPLE2ENH_HGR_SLOWDOWN=12\r\n_ATARI_SLOWDOWN=44\r\n_ATARI5200_SLOWDOWN=44\r\n_ATARI7800_SLOWDOWN=52\r\n_ATARI7800_NO_COLOR_SLOWDOWN=20\r\n_ATARI_LYNX_SLOWDOWN=100\r\n_C128_8502_80COL_SLOWDOWN=10\r\n_C16_SLOWDOWN=20\r\n_C16_CONIO_SLOWDOWN=24\r\n_C16_DOUBLE_BUFFER_SLOWDOWN=2\r\n_C64_SLOWDOWN=24\r\n_C64_CONIO_SLOWDOWN=30\r\n_CBM610_SLOWDOWN=26\r\n_CBM510_SLOWDOWN=18\r\n_CX16_SLOWDOWN?=38\r\n_CREATIVISION_SLOWDOWN=40\r\n_GAMATE_SLOWDOWN=80\r\n_MEGA65_SLOWDOWN=130\r\n_NES_SLOWDOWN=60\r\n_ORIC_SLOWDOWN=20\r\n_PET_SLOWDOWN=18\r\n_PCE_SLOWDOWN=80\r\n_SUPERVISION_SLOWDOWN=68\r\n_VIC20_SLOWDOWN=48\r\n\r\n\r\n# Z88DK\r\n_ABC80_SLOWDOWN=12\r\n_AQUARIUS_SLOWDOWN=20\r\n_ACE_SLOWDOWN=8\r\n_AGON_SLOWDOWN=100\r\n_BEE_SLOWDOWN=8\r\n_BONDWELL2_SLOWDOWN=12\r\n_C128_Z80_40COL_SLOWDOWN=2\r\n_C128_Z80_80COL_SLOWDOWN=1\r\n_CAMPUTERS_LYNX_SLOWDOWN=2\r\n_COLECO_SLOWDOWN=8\r\n_CPC_MODE0_SLOWDOWN=4\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=4\r\n_CPC_MODE2_SLOWDOWN=4\r\n_CPM_Z80_SLOWDOWN=20\r\n_CPM_INTEL8080_SLOWDOWN=8\r\n_E200_SLOWDOWN=40\r\n_G850_SLOWDOWN=40\r\n_G815_SLOWDOWN=10\r\n_GAL_SLOWDOWN=60\r\n_GAL_GFX_SLOWDOWN=40\r\n_GB_SLOWDOWN=8\r\n_GG_SLOWDOWN=8\r\n_GB_WAIT_VSYNC_SLOWDOWN=6\r\n_GL6000SL_SLOWDOWN=6\r\n_HECTOR1_SLOWDOWN=2\r\n_HECTORHR_SLOWDOWN=2\r\n_KC_SLOWDOWN=6\r\n_LASER500_SLOWDOWN=4\r\n_M5_SLOWDOWN=8\r\n_M100_SLOWDOWN=8\r\n_MC1000_SLOWDOWN=150\r\n_MSX_SLOWDOWN=8\r\n_MSX_FIXED_COLORS_SLOWDOWN=16\r\n_MTX500_SLOWDOWN=8\r\n_MTX512_SLOWDOWN=8\r\n_MZ_SLOWDOWN=20\r\n_NC100_SLOWDOWN=12\r\n_NC200_SLOWDOWN=12\r\n_PC88_SLOWDOWN=8\r\n_PHC25_SLOWDOWN=30\r\n_PX4_SLOWDOWN=14\r\n_PX8_SLOWDOWN=22\r\n_SAMCOUPE_SLOWDOWN=10\r\n_SC3000_SLOWDOWN=8\r\n_SMC777_SLOWDOWN=6\r\n_SMS_SLOWDOWN=6\r\n_SPECTRUM_SLOWDOWN=8\r\n_TRS80_SLOWDOWN=40\r\n_VG5K_SLOWDOWN=20\r\n_VZ200_SLOWDOWN=20\r\n_X07_SLOWDOWN=4\r\n_Z1013_SLOWDOWN=24\r\n_Z9001_SLOWDOWN=40\r\n_Z88_SLOWDOWN=8\r\n_ZX81_SLOWDOWN=2\r\n_ZX81_WRX_SLOWDOWN=4\r\n_ZX81_WRX64_SLOWDOWN=6\r\n_ZX81_WRX128_SLOWDOWN=6\r\n_ZX81_8X6_WRX64_SLOWDOWN=6\r\n_ZX81_8X6_WRX128_SLOWDOWN=6\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=8\r\n_DRAGON_SLOWDOWN=8\r\n_COCO3_SLOWDOWN=20\r\n_COCO_NO_GFX_SLOWDOWN=18\r\n_DRAGON_NO_GFX_SLOWDOWN=18\r\n_MO5_SLOWDOWN=12\r\n_TO7_SLOWDOWN=12\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=4\r\n_PECOM_SLOWDOWN=2\r\n_TMC600_SLOWDOWN=3\r\n_MICRO_SLOWDOWN=4\r\n_CIDELSA_SLOWDOWN=4\r\n\r\n\r\n# MC10\r\n_MC10_SLOWDOWN=20\r\n\r\n# TI99\r\n\r\n_TI99_SLOWDOWN=24\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=1\r\n_TERMINAL_SLOWDOWN=2\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=65\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=20"
  },
  {
    "path": "src/games/trex/docs/dino.txt",
    "content": "..........#####.\r\n.........##.####\r\n.........#######\r\n.........###....\r\n.........#####..\r\n........###.....\r\n\r\n\r\n##..#########...\r\n##########..#...\r\n.#########......\r\n....#...#.......\r\n....#...#.......\r\n....##..##......\r\n\r\n->\r\ntile0\r\n..#####.\r\n.##.####\r\n.#######\r\n.###....\r\n.#####..\r\n###.....\r\n\r\ntile3\r\n#####...\r\n##..#...\r\n##......\r\n#.......\r\n#.......\r\n##......\r\n\r\ntile2\r\n##..####\r\n########\r\n.#######\r\n....#...\r\n....#...\r\n....##..\r\n\r\n\r\n---------------------------------\r\n..........#####.\r\n.........##.####\r\n.........#######\r\n.........###....\r\n.........#####..\r\n........###.....\r\n\r\n\r\n##..#########...\r\n##########..#...\r\n.#########......\r\n....#...#.......\r\n....##..##......\r\n................\r\n->\r\n\r\ntile1\r\n#####...\r\n##..#...\r\n##......\r\n#.......\r\n##......\r\n........\r\n\r\ntile4\r\n##..####\r\n########\r\n.#######\r\n....#...\r\n....##..\r\n........\r\n-------------------------------\r\n\r\n................\r\n................\r\n................\r\n..........#####.\r\n.........##.####\r\n.........#######\r\n\r\n\r\n.........###....\r\n.........#####..\r\n........###.....\r\n##..#########...\r\n##########..#...\r\n.#########......\r\n\r\n....#...#.......\r\n....#...#.......\r\n....##..##......\r\n................\r\n................\r\n................\r\n\r\n->\r\ntile5\r\n........\r\n........\r\n........\r\n..#####.\r\n.##.####\r\n.#######\r\n\r\n\r\ntile 6\r\n.###....\r\n.#####..\r\n###.....\r\n#####...\r\n##..#...\r\n##......\r\n\r\n\r\ntile8\r\n........\r\n........\r\n........\r\n##..####\r\n########\r\n.#######\r\n\r\ntile7\r\n#.......\r\n#.......\r\n##......\r\n........\r\n........\r\n........\r\n\r\ntile9\r\n....#...\r\n....#...\r\n....##..\r\n........\r\n........\r\n........\r\n\r\n------------------\r\n\r\ntile26\r\n..#####.\r\n.##...##\r\n.#######\r\n.###....\r\n.#####..\r\n###....."
  },
  {
    "path": "src/games/trex/docs/shape2x8left.txt",
    "content": "..#.....\n.###....\n########\n...#####\n.....###\n.....##.\n"
  },
  {
    "path": "src/games/trex/docs/shape2x8right.txt",
    "content": "......#.\n.....###\n....####\n.......#\n........\n........\n"
  },
  {
    "path": "src/games/trex/docs/tile2x8left.txt",
    "content": "0,32,112,255,31,7,6,4"
  },
  {
    "path": "src/games/trex/docs/tile2x8right.txt",
    "content": "0,2,7,15,1,0,0,0"
  },
  {
    "path": "src/games/trex/images.h",
    "content": "#ifndef _IMAGES_H\n#define _IMAGES_H\n\n\n#include \"cross_lib.h\"\n\n#if !defined(TINY_GAME)\n\n    // Initial/jump dino \n    #define TOP_DINO_0            _TILE_0\n    #define TAIL_DINO_0           _TILE_2\n    #define BOTTOM_DINO_0         _TILE_3\n\n    // Dino lower feet\n    #define TAIL_RAISED_DINO      _TILE_17\n    #define BOTTOM_RAISED_DINO    _TILE_16\n\n    // Dino with +4 pixel offset\n    #define TOP_DINO_1            _TILE_15\n    #define MIDDLE_DINO_1         _TILE_6\n    #define BOTTOM_DINO_1         _TILE_7\n    \n    #define TAIL_DINO_1           _TILE_8\n    #define FOOT_DINO_1           _TILE_9\n    \n\n    #define TERRAIN_2             _TILE_13\n    #define TERRAIN_3             _TILE_14\n    \n\n    #define TOP_CACTUS_2          _TILE_10\n    #define BOTTOM_CACTUS_2       _TILE_4\n\n    #define TOP_LEFT_CACTUS_2     _TILE_11\n    #define BOTTOM_LEFT_CACTUS_2  _TILE_20\n    #define TOP_RIGHT_CACTUS_2    _TILE_12\n    #define BOTTOM_RIGHT_CACTUS_2 _TILE_21\n    \n\n    #define TERRAIN               _TILE_5\n    \n    #define TOP_CACTUS            _TILE_1\n    #define BOTTOM_CACTUS         _TILE_4\n\n    #define TOP_LEFT_CACTUS       _TILE_18\n    #define BOTTOM_LEFT_CACTUS    _TILE_20\n    #define TOP_RIGHT_CACTUS      _TILE_19\n    #define BOTTOM_RIGHT_CACTUS   _TILE_21\n\n    #define LEFT_BIRD_0           _TILE_22\n    #define LEFT_BIRD_1           _TILE_23\n\n    #define RIGHT_BIRD_0          _TILE_24\n    #define RIGHT_BIRD_1          _TILE_25\n\n    #define TOP_DEAD_DINO_0       _TILE_26\n    \n#else\n\n    // Initial/jump dino \n    #define TOP_DINO_0            _TILE_0\n    #define TAIL_DINO_0           _TILE_2\n    #define BOTTOM_DINO_0         _TILE_3\n\n    #define TOP_CACTUS            _TILE_1\n    #define BOTTOM_CACTUS         _TILE_4\n\n    #define TERRAIN               _TILE_5\n  \n#endif\n\n#endif // _IMAGES_H\n\n"
  },
  {
    "path": "src/games/trex/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#include \"images.h\"\r\n\r\n#define INITIAL_LEVEL 1\r\n\r\n#if XSize<=21\r\n    #define LEFT_END_OF_TERRAIN 1\r\n\r\n    #define SIZE_OF_TERRAIN ((XSize)-2)\r\n#elif XSize<=28\r\n    #define LEFT_END_OF_TERRAIN 1\r\n\r\n    #define SIZE_OF_TERRAIN ((XSize)-3)\r\n#elif XSize<=40\r\n    #define LEFT_END_OF_TERRAIN ((XSize)/6)\r\n\r\n    #define SIZE_OF_TERRAIN (2*((XSize)/3))\r\n#else\r\n    #define LEFT_END_OF_TERRAIN ((XSize)/4)\r\n\r\n    #define SIZE_OF_TERRAIN (((XSize)/2))\r\n#endif\r\n\r\n#define RIGHT_END_OF_TERRAIN (LEFT_END_OF_TERRAIN+SIZE_OF_TERRAIN)\r\n\r\n#if XSize>=22\r\n    #define X_DINO ((XSize/8)+LEFT_END_OF_TERRAIN)\r\n#else\r\n    #define X_DINO (1+LEFT_END_OF_TERRAIN) \r\n#endif\r\n\r\n// TODO: ((YSize/2)+4) crashes on the Vic 20 when a cactus reaches LEFT_END_OF_TERRAIN\r\n\r\n#if YSize>=20\r\n\r\n    #define Y_DINO ((YSize/2)+4)\r\n#elif YSize>=8\r\n    #define Y_DINO ((YSize/2)+2)\r\n#else\r\n    #define Y_DINO (YSize-3)\r\n#endif\r\n\r\n#define Y_TERRAIN ((Y_DINO)+2)\r\n#define Y_CACTUS ((Y_TERRAIN)-1)\r\n\r\n\r\n#if YSize>17 && XSize>=20\r\n    #define LEVEL_Y 5\r\n#else\r\n    #define LEVEL_Y 3\r\n#endif\r\n\r\n#if YSize<=10\r\n    #define NO_RECORD_LEVEL\r\n#endif\r\n\r\n#define LEVEL_X ((XSize)/2-4)\r\n\r\n#define NUMBER_OF_CACTI 3\r\n\r\n#define MAX_LEVEL 99u\r\n#define MAX_POINTS 9999u\r\n\r\n#if defined(_XL_NO_UDG) && !defined(NO_CACTUS_TRANSITION)\r\n    #define NO_CACTUS_TRANSITION\r\n#endif \r\n\r\n\r\nuint8_t input;\r\n\r\n\r\nuint8_t state;\r\n\r\nuint8_t x_cactus[NUMBER_OF_CACTI];\r\nuint8_t active_cactus[NUMBER_OF_CACTI];\r\nuint8_t cactus_cooldown[NUMBER_OF_CACTI];\r\nuint8_t number_of_active_cactus;\r\nuint8_t last_active_cactus = 1;\r\n\r\n#if !defined(TINY_GAME)\r\nuint8_t x_bird;\r\nuint8_t active_bird;\r\nuint8_t y_bird;\r\nuint8_t bird_cooldown;\r\n\r\nuint8_t hilevel;\r\n\r\n#endif\r\n\r\nuint8_t dead;\r\n\r\nuint16_t slowdown;\r\n\r\nuint8_t set_speed;\r\n\r\nuint16_t score;\r\nuint16_t hiscore;\r\n\r\nuint8_t level;\r\n\r\nuint8_t level_cacti;\r\nuint8_t level_bird;\r\n\r\nuint16_t slowdown_factor;\r\n\r\nuint8_t counter;\r\n\r\n\r\nvoid draw_jump_dino_0(uint8_t height)\r\n{\r\n\r\n    // Initial tiles\r\n    _XL_DRAW(X_DINO+1,Y_DINO-height,TOP_DINO_0,_XL_WHITE);\r\n    _XL_DRAW(X_DINO+1,Y_DINO+1-height,BOTTOM_DINO_0,_XL_WHITE);\r\n    _XL_DRAW(X_DINO,Y_DINO+1-height,TAIL_DINO_0,_XL_WHITE);\r\n\r\n}    \r\n\r\n#if !defined(TINY_GAME)\r\nvoid draw_dead_dino_0(void)\r\n{\r\n    // Initial tiles\r\n    _XL_DRAW(X_DINO+1,Y_DINO,TOP_DEAD_DINO_0,_XL_WHITE);\r\n    _XL_DRAW(X_DINO+1,Y_DINO+1,BOTTOM_DINO_0,_XL_WHITE);\r\n    _XL_DRAW(X_DINO,Y_DINO+1,TAIL_DINO_0,_XL_WHITE);\r\n}   \r\n#else\r\n#define draw_dead_dino_0() \r\n#endif\r\n\r\n\r\n#if !defined(TINY_GAME) && !defined(_XL_NO_UDG)\r\nvoid draw_jump_dino_1(uint8_t height)\r\n{\r\n    _XL_DRAW(X_DINO+1,Y_DINO-1-height,TOP_DINO_1,_XL_WHITE);\r\n    _XL_DRAW(X_DINO+1,Y_DINO-height,MIDDLE_DINO_1,_XL_WHITE);    \r\n    _XL_DRAW(X_DINO+1,Y_DINO+1-height,BOTTOM_DINO_1,_XL_WHITE);\r\n    _XL_DRAW(X_DINO,Y_DINO+1-1-height,TAIL_DINO_1,_XL_WHITE);\r\n    _XL_DRAW(X_DINO,Y_DINO+1-height,FOOT_DINO_1,_XL_WHITE);    \r\n\r\n}   \r\n#else\r\n    #define draw_jump_dino_1(height)\r\n#endif\r\n\r\nvoid delete_feet(uint8_t height)\r\n{\r\n    _XL_DELETE(X_DINO+1,Y_DINO+1-height);\r\n    _XL_DELETE(X_DINO,Y_DINO+1-height); \r\n}\r\n\r\nvoid delete_top(uint8_t height)\r\n{\r\n    _XL_DELETE(X_DINO+1,Y_DINO-1-height);\r\n    _XL_DELETE(X_DINO,Y_DINO-height);\r\n\r\n}\r\n\r\n#if !defined(TINY_GAME)\r\nvoid draw_dino_feet_0(void)\r\n{\r\n    _XL_DRAW(X_DINO+1,Y_DINO+1,BOTTOM_DINO_0,_XL_WHITE);\r\n    _XL_DRAW(X_DINO,Y_DINO+1,TAIL_RAISED_DINO,_XL_WHITE);\r\n}\r\n\r\n\r\nvoid draw_dino_feet_1(void)\r\n{\r\n    _XL_DRAW(X_DINO+1,Y_DINO+1,BOTTOM_RAISED_DINO,_XL_WHITE);\r\n    _XL_DRAW(X_DINO,Y_DINO+1,TAIL_DINO_0,_XL_WHITE);\r\n}\r\n#else\r\nvoid draw_dino_feet_0(void)\r\n{    \r\n    _XL_DRAW(X_DINO+1,Y_DINO+1,BOTTOM_DINO_0,_XL_WHITE);\r\n    _XL_DRAW(X_DINO,Y_DINO+1,TAIL_DINO_0,_XL_WHITE);\r\n}    \r\n\r\n#define draw_dino_feet_1() draw_dino_feet_0()\r\n\r\n#endif\r\n\r\n// #define RUN_SLOW_DOWN 4\r\n\r\n\r\n#define JUMP 10\r\n\r\n#define END_JUMP 17\r\n\r\nvoid handle_state_behavior(void)\r\n{\r\n\r\n    switch(state)\r\n    {\r\n\r\n        case 0:  \r\n            draw_dino_feet_1();\r\n        break;\r\n        \r\n        case 1:\r\n            draw_dino_feet_0();\r\n        break;\r\n        \r\n        case JUMP+1:\r\n            delete_feet(0);\r\n            delete_feet(1);\r\n            draw_jump_dino_0(1+1);\r\n                \r\n        break;\r\n        \r\n        case JUMP+2:\r\n            delete_feet(2);\r\n            draw_jump_dino_0(2+1);\r\n                \r\n        break;\r\n\r\n        case JUMP+3:\r\n            delete_feet(3);        \r\n            draw_jump_dino_0(3+1);\r\n                \r\n        break;\r\n        \r\n        case JUMP+4:\r\n            delete_feet(4);   \r\n            draw_jump_dino_0(4+1);\r\n        break;\r\n\r\n        case JUMP+5:\r\n            draw_jump_dino_1(4+1);\r\n        break;\r\n\r\n#if YSize<10\r\n        case JUMP+6:\r\n            // delete_feet(5);\r\n            // draw_jump_dino_0(5+1);\r\n        break;\r\n        \r\n        case JUMP+7:\r\n            // delete_feet(5);\r\n            // draw_jump_dino_1(5+1);\r\n        break;\r\n\r\n        case JUMP+8:\r\n\r\n        break;\r\n        \r\n        case JUMP+9:\r\n        break;\r\n\r\n        case JUMP+10: // 7\r\n            // draw_jump_dino_1(5+1);\r\n        break;\r\n        \r\n        case JUMP+11: // 6\r\n            // delete_top(6);\r\n            // draw_jump_dino_0(5+1);\r\n        break;\r\n\r\n        case JUMP+12: // 5\r\n            // draw_jump_dino_1(4+1);\r\n        break;\r\n#else\r\n        case JUMP+6:\r\n            delete_feet(5);\r\n            draw_jump_dino_0(5+1);\r\n        break;\r\n        \r\n        case JUMP+7:\r\n            delete_feet(5);\r\n            draw_jump_dino_1(5+1);\r\n        break;\r\n\r\n        case JUMP+8:\r\n\r\n        break;\r\n        \r\n        case JUMP+9:\r\n        break;\r\n\r\n        case JUMP+10: // 7\r\n            draw_jump_dino_1(5+1);\r\n        break;\r\n        \r\n        case JUMP+11: // 6\r\n            delete_top(6);\r\n            draw_jump_dino_0(5+1);\r\n        break;\r\n\r\n        case JUMP+12: // 5\r\n            draw_jump_dino_1(4+1);\r\n        break;\r\n#endif\r\n        case JUMP+13: // 4\r\n            delete_top(5);\r\n            draw_jump_dino_0(4+1);\r\n        break;\r\n        \r\n        case JUMP+14: // 3\r\n            delete_top(4);\r\n            draw_jump_dino_0(3+1);\r\n        break;\r\n        \r\n        case JUMP+15: // 2\r\n            delete_top(3);\r\n            draw_jump_dino_0(2+1);\r\n        break;\r\n        \r\n        case JUMP+16:\r\n            delete_top(2);\r\n            draw_jump_dino_0(1+1);\r\n        break;\r\n\r\n        case JUMP+END_JUMP:\r\n\r\n            delete_top(0);\r\n            delete_top(1);            \r\n            draw_jump_dino_0(0);\r\n        break;\r\n        \r\n        case 99: // like case 1\r\n            draw_jump_dino_0(0);\r\n            \r\n        break;\r\n    }\r\n}\r\n\r\nvoid handle_fire(void)\r\n{\r\n    input = _XL_INPUT();\r\n    \r\n    if(_XL_FIRE(input))\r\n    {\r\n        state = JUMP+1;\r\n    }\r\n}\r\n\r\nvoid handle_state_transition(void)\r\n{\r\n    switch(state)\r\n    {     \r\n        case 0:\r\n\r\n            state = 90;\r\n            handle_fire();\r\n        break;\r\n        \r\n        case 1:\r\n            state = 91;\r\n            handle_fire();\r\n        break;\r\n        \r\n        case JUMP+END_JUMP:\r\n            // draw_jump_dino_0(0);\r\n            state=1;\r\n        break;\r\n\r\n        case 90:\r\n            #if !defined(SLOWER_FEET)\r\n            if(counter&1)\r\n            #else\r\n            if(!(counter&7))\r\n            #endif\r\n            {\r\n                state = 1;\r\n            }\r\n            handle_fire();\r\n\r\n        break;\r\n        \r\n        case 91:           \r\n            #if !defined(SLOWER_FEET)\r\n            if(counter&1)\r\n            #else\r\n            if(!(counter&7))\r\n            #endif\r\n            {\r\n                state = 0;\r\n            }\r\n            handle_fire();\r\n        break;\r\n        \r\n        default:\r\n            ++state;\r\n        break;\r\n        \r\n    }\r\n}\r\n\r\n\r\n#if YSize<10\r\n    #define SCORE_X ((LEVEL_X)+1)\r\n#else\r\n    #define SCORE_X 0\r\n#endif\r\n\r\nvoid display_score(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(SCORE_X,0,4,score);\r\n}\r\n\r\n\r\nvoid display_hiscore(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINT(XSize-4-2,0,\"HI\");\r\n    _XL_PRINTD(XSize-4,0,4,hiscore);\r\n\r\n}\r\n\r\n\r\n#if YSize >= 19\r\n    #define HILEVEL_Y YSize-3\r\n#else\r\n    #define HILEVEL_Y YSize-2\r\n#endif\r\n\r\n#if !defined(TINY_GAME) && !defined(NO_RECORD_LEVEL)\r\nvoid display_hilevel(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINT(XSize/2-8,HILEVEL_Y,\"RECORD LEVEL\");\r\n    _XL_PRINTD(XSize/2-8+13,HILEVEL_Y,2,hilevel);\r\n\r\n}\r\n#else\r\n#define display_hilevel()\r\n#endif\r\n\r\n\r\n#if !defined(NO_CACTUS_TRANSITION)\r\nvoid handle_cactus_half_transition(uint8_t i)\r\n{\r\n    if(active_cactus[i])// && x_cactus[i])\r\n    {\r\n        if(i&1)\r\n        {\r\n            _XL_DRAW(x_cactus[i]-1,Y_CACTUS-1,TOP_LEFT_CACTUS,_XL_WHITE);\r\n            _XL_DRAW(x_cactus[i],Y_CACTUS-1,TOP_RIGHT_CACTUS,_XL_WHITE);\r\n            _XL_DRAW(x_cactus[i]-1,Y_CACTUS,BOTTOM_LEFT_CACTUS,_XL_WHITE);\r\n            _XL_DRAW(x_cactus[i],Y_CACTUS,BOTTOM_RIGHT_CACTUS,_XL_WHITE);\r\n        }\r\n        else\r\n        {\r\n            _XL_DRAW(x_cactus[i]-1,Y_CACTUS-1,TOP_LEFT_CACTUS_2,_XL_WHITE);\r\n            _XL_DRAW(x_cactus[i],Y_CACTUS-1,TOP_RIGHT_CACTUS_2,_XL_WHITE);\r\n            _XL_DRAW(x_cactus[i]-1,Y_CACTUS,BOTTOM_LEFT_CACTUS_2,_XL_WHITE);\r\n            _XL_DRAW(x_cactus[i],Y_CACTUS,BOTTOM_RIGHT_CACTUS_2,_XL_WHITE);\r\n        }\r\n    }\r\n}\r\n#endif\r\n\r\n#if !defined(TINY_GAME)\r\n    void handle_bird_half_transition(void)\r\n    {\r\n        if(active_bird)\r\n        {\r\n            _XL_DRAW(x_bird,y_bird,LEFT_BIRD_0,_XL_WHITE);\r\n            _XL_DRAW(x_bird+1,y_bird,LEFT_BIRD_1,_XL_WHITE);\r\n        }\r\n    }\r\n#else\r\n    #define handle_bird_half_transition() \r\n#endif\r\n\r\n#define INITIAL_LOW_COLLISION_THRESHOLD (JUMP+3)\r\n#define FINAL_LOW_COLLISION_THRESHOLD ((JUMP)+END_JUMP-2)\r\n\r\nvoid one_point(void)\r\n{\r\n    if(score<=MAX_POINTS)\r\n    {\r\n        ++score;\r\n        display_score();\r\n    }\r\n    _XL_PING_SOUND();\r\n}\r\n\r\n#define BIRD_COOLDOWN_MASK 63U\r\n#define CACTUS_COOLDOWN_MASK 31U\r\n\r\nvoid draw_cactus_1(uint8_t x)\r\n{\r\n    _XL_DRAW(x,Y_CACTUS-1,TOP_CACTUS,_XL_WHITE);\r\n    _XL_DRAW(x,Y_CACTUS,BOTTOM_CACTUS,_XL_WHITE);\r\n}\r\n\r\n#if !defined(TINY_GAME)\r\nvoid draw_cactus_2(uint8_t x)\r\n{\r\n    _XL_DRAW(x,Y_CACTUS-1,TOP_CACTUS_2,_XL_WHITE);\r\n    _XL_DRAW(x,Y_CACTUS,BOTTOM_CACTUS_2,_XL_WHITE);\r\n}\r\n#else\r\n    #define draw_cactus_2(x) draw_cactus_1(x)\r\n#endif\r\n\r\nvoid update_cactus(uint8_t i)\r\n{\r\n    if(active_cactus[i])\r\n    {\r\n        _XL_DELETE(x_cactus[i],Y_CACTUS-1);\r\n        _XL_DELETE(x_cactus[i],Y_CACTUS);\r\n        if(x_cactus[i]==LEFT_END_OF_TERRAIN)\r\n        {\r\n            _XL_DELETE(LEFT_END_OF_TERRAIN-1,Y_CACTUS-1);            \r\n            _XL_DELETE(LEFT_END_OF_TERRAIN-1,Y_CACTUS);\r\n\r\n            x_cactus[i]=0;\r\n\r\n            // while(1){};\r\n            one_point();\r\n            if(!(_XL_RAND()&3))\r\n            {\r\n                cactus_cooldown[i] = SIZE_OF_TERRAIN;\r\n            }\r\n            else\r\n            {\r\n                cactus_cooldown[i] = (uint8_t) (_XL_RAND()&CACTUS_COOLDOWN_MASK);\r\n            }\r\n            active_cactus[i]=0;\r\n            --number_of_active_cactus;\r\n            return;\r\n        }\r\n        else\r\n        {\r\n            --x_cactus[i];\r\n\r\n            if(i&1)\r\n            {\r\n                draw_cactus_1(x_cactus[i]);\r\n            }\r\n            else\r\n            {\r\n                draw_cactus_2(x_cactus[i]);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\r\n#if !defined(TINY_GAME)\r\n    void update_bird(void)\r\n    {\r\n\r\n        if(active_bird)\r\n        {\r\n            _XL_DELETE(x_bird,y_bird);\r\n            _XL_DELETE(x_bird+1,y_bird);\r\n            if(x_bird == LEFT_END_OF_TERRAIN)\r\n            {\r\n                x_bird = 0;\r\n\r\n                one_point();\r\n                bird_cooldown = (uint8_t) (_XL_RAND()&BIRD_COOLDOWN_MASK);\r\n                active_bird = 0;\r\n                return;\r\n            }\r\n            else\r\n            {\r\n                --x_bird;\r\n                _XL_DRAW(x_bird,y_bird,RIGHT_BIRD_0,_XL_WHITE);\r\n                _XL_DRAW(x_bird+1,y_bird,RIGHT_BIRD_1,_XL_WHITE);\r\n            }\r\n        }\r\n    }\r\n#else\r\n    #define update_bird()\r\n#endif\r\n\r\n\r\n\r\nvoid handle_cactus(uint8_t i)\r\n{\r\n    if(cactus_cooldown[i])\r\n    {\r\n        --cactus_cooldown[i];\r\n    }       \r\n    else\r\n    {\r\n        update_cactus(i);\r\n    }\r\n}\r\n\r\n#if !defined(TINY_GAME)\r\n    void handle_bird(void)\r\n    {\r\n        if(bird_cooldown)\r\n        {\r\n            --bird_cooldown;\r\n        }       \r\n        else\r\n        {\r\n            update_bird();\r\n        }\r\n    }\r\n#else\r\n    #define handle_bird()\r\n#endif\r\n\r\nuint8_t first_non_active_cactus(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<level_cacti;++i)\r\n    {\r\n        if((!cactus_cooldown[i])&&(!active_cactus[i]))\r\n        {   \r\n            return i;\r\n        }\r\n    }\r\n    \r\n    return NUMBER_OF_CACTI;\r\n}\r\n\r\n#if XSize>=22\r\n    #define CACTUS_SAFE_DISTANCE ((XSize/2)+1)\r\n    #define BIRD_SAFE_DISTACE (XSize/2)\r\n#else\r\n    #define CACTUS_SAFE_DISTANCE 10\r\n    #define BIRD_SAFE_DISTACE 9\r\n#endif\r\n\r\n#define last_is_far() (x_cactus[last_active_cactus]<CACTUS_SAFE_DISTANCE)\r\n#define last_is_very_close()(x_cactus[last_active_cactus]>RIGHT_END_OF_TERRAIN-3)\r\n\r\n#define is_cactus_available() (first_available_cactus<NUMBER_OF_CACTI)\r\n\r\nvoid spawn_cacti(void)\r\n{\r\n\r\n   if(last_is_far()||last_is_very_close())\r\n   {\r\n        uint8_t first_available_cactus = first_non_active_cactus();\r\n\r\n        if(is_cactus_available())\r\n        {\r\n            x_cactus[first_available_cactus] = RIGHT_END_OF_TERRAIN;\r\n            active_cactus[first_available_cactus]=1;\r\n            ++number_of_active_cactus;\r\n            last_active_cactus = first_available_cactus;\r\n        }\r\n   }\r\n}\r\n\r\n#if !defined(TINY_GAME)\r\n    void spawn_bird(void)\r\n    {\r\n        if((!bird_cooldown)&&(!active_bird) && (x_cactus[last_active_cactus]<BIRD_SAFE_DISTACE))\r\n        {\r\n            y_bird = (uint8_t) (Y_DINO-2*(_XL_RAND()&1));\r\n\r\n            active_bird = 1;\r\n            x_bird = RIGHT_END_OF_TERRAIN-1;\r\n        }  \r\n    }\r\n#else\r\n    #define spawn_bird()\r\n#endif\r\n\r\n\r\n#if defined(_XL_NO_JOYSTICK)\r\n    #define PRESS_TO_FIRE \"PRESS SPACE\"\r\n#else\r\n    #define PRESS_TO_FIRE \"PRESS FIRE\"\r\n#endif\r\n#define DELETE_PRESS       \"           \"\r\n\r\n#define INITIAL_CACTUS_COOLDOWN 3\r\n\r\n#if !defined(TINY_GAME)\r\nvoid handle_enemy_spawn(void)\r\n{\r\n    if(!(counter&3) && (number_of_active_cactus<level_cacti) && (x_bird<XSize/2) &&(!set_speed) )\r\n    {\r\n        spawn_cacti();\r\n    }\r\n    else if(level_bird && !set_speed)\r\n    {\r\n        spawn_bird();\r\n    }\r\n}\r\n#else\r\nvoid handle_enemy_spawn(void)\r\n{\r\n    if(!(counter&3) && (number_of_active_cactus<level_cacti))\r\n    {\r\n        spawn_cacti();\r\n    }\r\n}    \r\n#endif\r\n\r\n// TODO: Optimize for space\r\nvoid handle_enemies(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    if(counter&1)\r\n    {\r\n        for(i=0;i<level_cacti;++i)\r\n        {\r\n            handle_cactus(i);\r\n        }\r\n        #if !defined(TINY_GAME)\r\n        if (level_bird)\r\n        {\r\n            handle_bird();\r\n        }\r\n        #endif\r\n    }\r\n    else\r\n    {\r\n        #if !defined(NO_CACTUS_TRANSITION)\r\n        for(i=0;i<level_cacti;++i)\r\n        {\r\n            handle_cactus_half_transition(i);\r\n        }\r\n        #endif\r\n        if (level_bird)\r\n        {\r\n            handle_bird_half_transition();\r\n        }\r\n    }\r\n}\r\n\r\n\r\n// TODO: y_bird has only 2 values\r\n#if !defined(TINY_GAME)\r\nvoid handle_collisions(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    if ((state<INITIAL_LOW_COLLISION_THRESHOLD)||(state>FINAL_LOW_COLLISION_THRESHOLD))\r\n    {\r\n        i=0;\r\n        while((i<NUMBER_OF_CACTI)&&(!dead))\r\n        {\r\n            dead = x_cactus[i++]==X_DINO;\r\n        }\r\n        dead |= (x_bird==X_DINO) && ((y_bird==Y_DINO));\r\n    }\r\n    else\r\n    {\r\n        dead = (x_bird==X_DINO) && ((y_bird==Y_DINO-2));\r\n    }\r\n}\r\n#else\r\nvoid handle_collisions(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    if ((state<INITIAL_LOW_COLLISION_THRESHOLD)||(state>FINAL_LOW_COLLISION_THRESHOLD))\r\n    {\r\n        i=0;\r\n        while((i<NUMBER_OF_CACTI)&&(!dead))\r\n        {\r\n            dead = x_cactus[i++]==X_DINO;\r\n        }\r\n    }\r\n}  \r\n#endif\r\n\r\n#if !defined(TINY_GAME)\r\nvoid draw_terrain(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t r;\r\n    \r\n    for(i=LEFT_END_OF_TERRAIN;i<RIGHT_END_OF_TERRAIN;++i)\r\n    {\r\n        r = (uint8_t)(_XL_RAND()&3);\r\n        \r\n        if(!r)\r\n        {\r\n            _XL_DRAW(i,Y_TERRAIN,TERRAIN_2,_XL_WHITE);\r\n        }\r\n        else if(r==1)\r\n        {\r\n            _XL_DRAW(i,Y_TERRAIN,TERRAIN_3,_XL_WHITE);\r\n        }\r\n        else if(!(i&1))\r\n        {\r\n            _XL_DRAW(i,Y_TERRAIN,TERRAIN_3,_XL_WHITE);\r\n        }\r\n        else\r\n        {\r\n            _XL_DRAW(i,Y_TERRAIN,TERRAIN,_XL_WHITE);\r\n        }\r\n    }       \r\n}\r\n#else\r\n    \r\nvoid draw_terrain(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=LEFT_END_OF_TERRAIN;i<RIGHT_END_OF_TERRAIN;++i)\r\n    {\r\n        _XL_DRAW(i,Y_TERRAIN,TERRAIN,_XL_WHITE);\r\n    }       \r\n}\r\n#endif\r\n\r\n#if !defined(TINY_GAME)\r\nvoid draw_cacti(void)\r\n{\r\n    draw_cactus_1(RIGHT_END_OF_TERRAIN-2);\r\n    draw_cactus_2(RIGHT_END_OF_TERRAIN-4);\r\n    draw_cactus_1(RIGHT_END_OF_TERRAIN-6);\r\n}\r\n\r\nvoid delete_cacti(void)\r\n{\r\n    _XL_DELETE(RIGHT_END_OF_TERRAIN-2,Y_CACTUS-1);\r\n    _XL_DELETE(RIGHT_END_OF_TERRAIN-4,Y_CACTUS-1);\r\n    _XL_DELETE(RIGHT_END_OF_TERRAIN-6,Y_CACTUS-1);\r\n    \r\n    _XL_DELETE(RIGHT_END_OF_TERRAIN-2,Y_CACTUS);\r\n    _XL_DELETE(RIGHT_END_OF_TERRAIN-4,Y_CACTUS);\r\n    _XL_DELETE(RIGHT_END_OF_TERRAIN-6,Y_CACTUS);\r\n}\r\n#else\r\n    #define draw_cacti() \r\n\r\n    #define delete_cacti()\r\n#endif\r\n\r\nvoid initialize_enemies(void)\r\n{\r\n    uint8_t i;\r\n    \r\n    for(i=0;i<NUMBER_OF_CACTI;++i)\r\n    {\r\n        x_cactus[i] = 0;\r\n        active_cactus[i] = 0;\r\n        cactus_cooldown[i] = (uint8_t) (INITIAL_CACTUS_COOLDOWN);\r\n    }\r\n    number_of_active_cactus = 0;\r\n    \r\n    #if !defined(TINY_GAME)\r\n    x_bird = 0;\r\n    active_bird = 0;\r\n    bird_cooldown = (uint8_t) (INITIAL_CACTUS_COOLDOWN);\r\n    #endif\r\n}\r\n\r\n\r\n    #if XSize>18\r\n        #if !defined(TINY_GAME)\r\n            #define GAME_OVER_X XSize/2-9\r\n        \r\n        #else\r\n            #define GAME_OVER_X XSize/2-9\r\n        #endif\r\n    #else\r\n        #define GAME_OVER_X 0\r\n    #endif \r\n\r\n\r\n#define GAME_OVER_Y 4\r\n\r\n\r\n#if XSize>=20\r\n    #define GAME_OVER_STRING \"G A M E  O V E R\"\r\n#else\r\n    #define GAME_OVER_STRING \"GAME OVER\"\r\n#endif\r\n\r\n\r\n#if YSize>=10\r\n    #define ABOVE_DINO 8\r\n#elif YSize>=8\r\n    #define ABOVE_DINO 6\r\n#else\r\n    #define ABOVE_DINO 3\r\n#endif\r\n\r\nvoid handle_game_over(void)\r\n{\r\n    uint8_t i;\r\n    uint8_t j;\r\n    \r\n    // _XL_DELETE(X_DINO,Y_DINO);\r\n\r\n    for(i=1;i<ABOVE_DINO;++i)\r\n    {\r\n        for(j=1;j<3;++j)\r\n        {\r\n            _XL_DELETE(X_DINO-1+j,Y_DINO-i);\r\n        }\r\n    }\r\n\r\n    #if !defined(TINY_GAME)\r\n    draw_dead_dino_0();\r\n    _XL_REFRESH();\r\n    _XL_SHOOT_SOUND();\r\n    _XL_SLEEP(1);\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINT(GAME_OVER_X, GAME_OVER_Y, GAME_OVER_STRING);\r\n    _XL_REFRESH();\r\n    _XL_SLEEP(1);\r\n    _XL_WAIT_FOR_INPUT();\r\n    #else\r\n    _XL_SHOOT_SOUND();\r\n    _XL_PRINT(GAME_OVER_X, GAME_OVER_Y, GAME_OVER_STRING);\r\n    _XL_REFRESH();\r\n    _XL_WAIT_FOR_INPUT();\r\n    #endif\r\n    if(score>hiscore)\r\n    {\r\n        hiscore = score;\r\n    }\r\n    #if !defined(TINY_GAME)\r\n    if(level>hilevel)\r\n    {\r\n        hilevel = level;\r\n    }\r\n    #endif\r\n}\r\n\r\n\r\nvoid initialize_player(void)\r\n{\r\n    // last_state = 0;\r\n    state = 0;\r\n    dead = 0;\r\n    score = 0;\r\n}\r\n\r\n\r\nvoid display_level(void)\r\n{\r\n    _XL_PRINTD(LEVEL_X+6, LEVEL_Y,2,level);\r\n}\r\n\r\n#if !defined(TINY_GAME)\r\nvoid handle_game_start(void)\r\n{\r\n    uint8_t start;\r\n    // uint8_t input;\r\n    \r\n    start = 0;\r\n    counter = 0;\r\n    \r\n    _XL_CLEAR_SCREEN();\r\n    _XL_REFRESH();\r\n    \r\n    display_score();\r\n    display_hiscore();\r\n    #if YSize>=10\r\n    draw_terrain();\r\n    #endif\r\n    \r\n    draw_cacti();\r\n    \r\n    \r\n    _XL_SLOW_DOWN(10*_XL_SLOW_DOWN_FACTOR);\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINT(LEVEL_X+1,  0,     \"TREX\");\r\n    _XL_PRINT(LEVEL_X+1+1,1,      \"BY\");\r\n    _XL_PRINT(LEVEL_X+1-4,2, \"FABRIZIO CARUSO\");\r\n\r\n    display_hilevel();\r\n    \r\n    _XL_SLOW_DOWN(10*_XL_SLOW_DOWN_FACTOR);\r\n    _XL_PRINT(XSize/2-6, YSize/2-3, PRESS_TO_FIRE);\r\n    _XL_SLOW_DOWN(10*_XL_SLOW_DOWN_FACTOR);\r\n    draw_jump_dino_0(0);\r\n    _XL_REFRESH();\r\n    x_bird = RIGHT_END_OF_TERRAIN;\r\n    y_bird = Y_DINO-1;\r\n    while(!start || x_bird>LEFT_END_OF_TERRAIN)\r\n    {\r\n        ++counter;\r\n        // input = _XL_INPUT();\r\n        // if(_XL_FIRE(input))\r\n        if(_XL_FIRE(_XL_INPUT()))\r\n        {\r\n            start = 1;\r\n        }\r\n        if(x_bird>LEFT_END_OF_TERRAIN)\r\n        {\r\n            if(counter&1)\r\n            {\r\n                --x_bird;\r\n            }\r\n            if(counter&1)\r\n            {\r\n                _XL_DELETE(x_bird+2,y_bird);\r\n\r\n                _XL_DRAW(x_bird,y_bird,RIGHT_BIRD_0,_XL_WHITE);\r\n                _XL_DRAW(x_bird+1,y_bird,RIGHT_BIRD_1,_XL_WHITE);\r\n            }\r\n            else\r\n            {\r\n                _XL_DRAW(x_bird,y_bird,LEFT_BIRD_0,_XL_WHITE);\r\n                _XL_DRAW(x_bird+1,y_bird,LEFT_BIRD_1,_XL_WHITE);\r\n            }\r\n        }\r\n        else\r\n        {  \r\n            _XL_DELETE(x_bird,y_bird);\r\n            _XL_DELETE(x_bird+1,y_bird);\r\n\r\n            x_bird = RIGHT_END_OF_TERRAIN;\r\n            y_bird = (uint8_t) (Y_DINO-1-2*((_XL_RAND())&1));\r\n        }\r\n        \r\n        if(start)\r\n        {\r\n            _XL_SLOW_DOWN(2*_XL_SLOW_DOWN_FACTOR);\r\n        }\r\n        else\r\n        {\r\n            _XL_SLOW_DOWN(6*_XL_SLOW_DOWN_FACTOR);\r\n        }\r\n        _XL_WAIT_VSYNC();\r\n        _XL_REFRESH();\r\n    }\r\n    _XL_DELETE(x_bird,y_bird);\r\n    _XL_DELETE(x_bird+1,y_bird);\r\n    \r\n    delete_cacti();\r\n    \r\n    _XL_PRINT(LEVEL_X+1+1,1,      \"  \");\r\n\r\n    _XL_PRINT(LEVEL_X+1-4,2, \"               \");\r\n\r\n    _XL_PRINT(XSize/2-6, YSize/2-3, DELETE_PRESS);\r\n    _XL_PRINT(LEVEL_X,LEVEL_Y, \"LEVEL\");\r\n    display_level();\r\n    _XL_REFRESH();\r\n}\r\n#else\r\n    void handle_game_start(void)\r\n    {\r\n        _XL_CLEAR_SCREEN();\r\n        _XL_REFRESH();\r\n        counter = 0;\r\n\r\n        display_score();\r\n        display_hiscore();\r\n        draw_terrain();\r\n        \r\n        // draw_cacti();\r\n        \r\n        \r\n        _XL_SLOW_DOWN(10*_XL_SLOW_DOWN_FACTOR);\r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n        _XL_PRINT(LEVEL_X+1,  0,     \"TREX\");\r\n        // _XL_PRINT(LEVEL_X+1+1,1,      \"BY\");\r\n        _XL_PRINT(LEVEL_X+1-4,2, \"FABRIZIO CARUSO\");\r\n        \r\n        _XL_PRINT(LEVEL_X,LEVEL_Y, \"LEVEL\");\r\n        display_level();\r\n        _XL_WAIT_FOR_INPUT();\r\n        _XL_PRINT(LEVEL_X+1+1,1,      \"  \");\r\n\r\n        _XL_PRINT(LEVEL_X+1-4,2, \"               \");\r\n        _XL_REFRESH();\r\n    }\r\n#endif\r\n\r\n#define LEVEL_SIZE  256U\r\n\r\n#if !defined(TINY_GAME)\r\nvoid birdAndTwoCacti(void)\r\n{\r\n    level_bird = 1;\r\n    level_cacti = 2;\r\n}\r\n\r\nvoid birdAndThreeCacti(void)\r\n{\r\n    level_bird = 1;\r\n    level_cacti = 3;\r\n}\r\n#endif\r\n\r\n#if !defined(TINY_GAME)\r\nvoid activate_level(void)\r\n{\r\n    set_speed = 1;\r\n    switch(level)\r\n    {\r\n        case 1:\r\n            level_bird = 0;\r\n            level_cacti = 1;\r\n            slowdown_factor = 20;\r\n            break;\r\n        case 2:\r\n            level_bird = 1;\r\n            level_cacti = 1;\r\n            slowdown_factor = 19;\r\n            break;\r\n        case 3:\r\n            birdAndTwoCacti();\r\n            slowdown_factor = 18; \r\n            break;\r\n        case 4:\r\n            birdAndTwoCacti();\r\n            slowdown_factor = 16;\r\n            break;\r\n        case 5:\r\n            birdAndTwoCacti();\r\n            slowdown_factor = 15;\r\n            break;\r\n        case 6:\r\n            birdAndTwoCacti();\r\n            slowdown_factor = 14;\r\n            break;\r\n        case 7:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 14;\r\n            break;\r\n        case 8:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 13;\r\n            break;\r\n        case 9:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 12;\r\n            break;\r\n        case 10:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 11;\r\n            break;\r\n        case 11:\r\n        case 12:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 10;\r\n            break;\r\n        case 13:\r\n        case 14:\r\n        case 15:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 9;\r\n            break;\r\n        case 16: \r\n        case 17:\r\n        case 18:\r\n        case 19:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 8;\r\n            break;\r\n        case 20:\r\n        case 21:\r\n        case 22:\r\n        case 23:\r\n        case 24:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 7;\r\n            break;\r\n        case 25:\r\n        case 26:\r\n        case 27:\r\n        case 28:\r\n        case 29:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 6;\r\n            break;\r\n        default:\r\n            birdAndThreeCacti();\r\n            slowdown_factor = 5;\r\n\r\n            // counter = 0;\r\n    }\r\n}\r\n#else\r\n    void activate_level(void)\r\n    {\r\n        set_speed = 1;\r\n        if(level<3)\r\n        {\r\n            level_cacti = 2;\r\n            slowdown_factor = 16;\r\n        }\r\n        else if(level<=11)\r\n        {\r\n            level_cacti = 3;\r\n            slowdown_factor = 17-level; \r\n        }\r\n        else\r\n        {\r\n            level_cacti=3;\r\n            slowdown_factor = 5;\r\n        }\r\n        // slowdown_factor = 20;\r\n        \r\n    }\r\n#endif\r\n\r\n\r\nvoid handle_level(void)\r\n{\r\n    if(!counter) \r\n    {\r\n        if(level<MAX_LEVEL)\r\n        {\r\n            ++level;\r\n        \r\n            display_level();\r\n            \r\n            activate_level();\r\n        }\r\n    }\r\n}\r\n\r\n\r\n#if !defined(TINY_GAME)\r\nvoid handle_speed(void)\r\n{\r\n    if(set_speed)\r\n    {\r\n        if(!active_bird && !number_of_active_cactus)\r\n        {\r\n            slowdown = ((uint16_t) slowdown_factor)*((uint16_t)_XL_SLOW_DOWN_FACTOR/2);\r\n            set_speed = 0;\r\n        }            \r\n    }\r\n}\r\n#else\r\nvoid handle_speed(void)\r\n{\r\n    if(set_speed)\r\n    {\r\n        if(!number_of_active_cactus)\r\n        {\r\n            slowdown = ((uint16_t) slowdown_factor)*((uint16_t)_XL_SLOW_DOWN_FACTOR/2);\r\n            set_speed = 0;\r\n        }            \r\n    }\r\n}   \r\n#endif\r\n\r\n\r\nint main(void)\r\n{            \r\n    _XL_INIT_GRAPHICS();\r\n    \r\n    _XL_INIT_SOUND();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    hiscore = 0;\r\n    #if !defined(TINY_GAME)\r\n    hilevel = 1;\r\n    #endif\r\n    \r\n    while(1)\r\n    {\r\n\r\n        level = INITIAL_LEVEL;\r\n        \r\n        initialize_player();\r\n\r\n        handle_game_start();\r\n\r\n        initialize_enemies();\r\n\r\n\r\n        activate_level();\r\n        while(!dead)\r\n        {\r\n            // _XL_PRINTD(0,4,2,counter);\r\n            \r\n            handle_state_behavior();\r\n\r\n            handle_state_transition();\r\n            \r\n            ++counter;\r\n      \r\n            handle_enemy_spawn();\r\n            \r\n            handle_enemies();\r\n\r\n            _XL_SLOW_DOWN(slowdown);\r\n                        \r\n            handle_collisions();\r\n            \r\n            handle_level();\r\n            \r\n            handle_speed();\r\n            \r\n            _XL_WAIT_VSYNC();\r\n            _XL_REFRESH();\r\n            \r\n        }\r\n        _XL_REFRESH();\r\n        // while(1){};\r\n        handle_game_over();\r\n    }\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape0.txt",
    "content": ".#####\n## ###\n######\n######\n###...\n#####.\n##....\n##....\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape1.txt",
    "content": "......\n..##..\n..##.#\n..##.#\n#.##.#\n#.##.#\n#.##.#\n#.##.#\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape10.txt",
    "content": "......\n..##..\n#.##..\n#.##..\n#.##.#\n#.##.#\n#.##.#\n#.##.#\n\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape11.txt",
    "content": "......\n.....#\n...#.#\n...#.#\n...#.#\n...#.#\n...#.#\n...#.#\n\n\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape12.txt",
    "content": "......\n#.....\n#.....\n#.....\n#.#...\n#.#...\n#.#...\n#.#...\n\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape13.txt",
    "content": "######\n######\n......\n..##..\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape14.txt",
    "content": "######\n######\n......\n......\n....#.\n......\n......\n......"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape15.txt",
    "content": "......\n......\n......\n......\n.#####\n## ###\n######\n######\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape16.txt",
    "content": "#.....\n####..\n#..#..\n#.....\n......\n......\n#.....\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape17.txt",
    "content": ".....#\n#..###\n######\n######\n.#####\n...#..\n...##.\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape18.txt",
    "content": "......\n.....#\n.....#\n.....#\n...#.#\n...#.#\n...#.#\n...#.#\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape19.txt",
    "content": "......\n#.....\n#.#...\n#.#...\n#.#...\n#.#...\n#.#...\n#.#...\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape2.txt",
    "content": ".....#\n#..###\n######\n######\n.#####\n...#..\n...#..\n...##.\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape20.txt",
    "content": "...##.\n...###\n....##\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape21.txt",
    "content": ".##...\n##....\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape22.txt",
    "content": "......\n.#....\n###...\n######\n..####\n....##\n....##\n....#.\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape23.txt",
    "content": "......\n......\n......\n###...\n#.....\n.##...\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape24.txt",
    "content": "......\n.....#\n....##\n...###\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape25.txt",
    "content": "#.....\n##....\n####..\n######\n#####.\n.....#\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape26.txt",
    "content": ".#####\n#.#.##\n##.###\n#.#.##\n###...\n#####.\n##....\n##....\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape2x8left.txt",
    "content": "......\n.#....\n###...\n######\n..####\n....##\n....##\n....#.\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape2x8right.txt",
    "content": "......\n.....#\n....##\n...###\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape3.txt",
    "content": "#.....\n####..\n#..#..\n#.....\n......\n......\n......\n#.....\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape4.txt",
    "content": "#.##.#\n######\n####..\n..##..\n..##..\n..##..\n..##..\n..##..\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape5.txt",
    "content": "######\n######\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape6.txt",
    "content": "###...\n#####.\n##....\n##....\n#.....\n####..\n#..#..\n#.....\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape7.txt",
    "content": "......\n......\n......\n#.....\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape8.txt",
    "content": "......\n......\n......\n......\n.....#\n#..###\n######\n######\n"
  },
  {
    "path": "src/games/trex/shapes/6x8/shape9.txt",
    "content": ".#####\n...#..\n...#..\n...##.\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape0.txt",
    "content": ".#####\n## ###\n######\n######\n###...\n#####.\n##....\n##....\n##....\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape1.txt",
    "content": "......\n..##..\n..##.#\n..##.#\n#.##.#\n#.##.#\n#.##.#\n#.##.#\n#.##.#\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape10.txt",
    "content": "......\n..##..\n#.##..\n#.##..\n#.##.#\n#.##.#\n#.##.#\n#.##.#\n#.##.#\n\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape11.txt",
    "content": "......\n.....#\n...#.#\n...#.#\n...#.#\n...#.#\n...#.#\n...#.#\n...#.#"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape12.txt",
    "content": "......\n#.....\n#.....\n#.....\n#.#...\n#.#...\n#.#...\n#.#...\n#.#...\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape13.txt",
    "content": "######\n######\n......\n..##..\n......\n......\n......\n......\n......"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape14.txt",
    "content": "######\n######\n......\n......\n....#.\n......\n......\n......\n......"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape15.txt",
    "content": "......\n......\n......\n......\n.#####\n## ###\n######\n######\n######\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape16.txt",
    "content": "#.....\n####..\n#..#..\n#.....\n......\n......\n#.....\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape17.txt",
    "content": ".....#\n#..###\n######\n######\n.#####\n...#..\n...##.\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape18.txt",
    "content": "......\n.....#\n.....#\n.....#\n...#.#\n...#.#\n...#.#\n...#.#\n...#.#\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape19.txt",
    "content": "......\n#.....\n#.#...\n#.#...\n#.#...\n#.#...\n#.#...\n#.#...\n#.#...\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape2.txt",
    "content": ".....#\n#..###\n######\n######\n.#####\n...#..\n...#..\n...##.\n...##.\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape20.txt",
    "content": "...##.\n...###\n....##\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape21.txt",
    "content": ".##...\n##....\n......\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape22.txt",
    "content": "......\n.#....\n###...\n######\n..####\n....##\n....##\n....#.\n....#.\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape23.txt",
    "content": "......\n......\n......\n###...\n#.....\n.##...\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape24.txt",
    "content": "......\n.....#\n....##\n...###\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape25.txt",
    "content": "#.....\n##....\n####..\n######\n#####.\n.....#\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape26.txt",
    "content": ".#####\n#.#.##\n##.###\n#.#.##\n###...\n#####.\n##....\n##....\n##....\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape2x8left.txt",
    "content": "......\n.#....\n###...\n######\n..####\n....##\n....##\n....#.\n....#.\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape2x8right.txt",
    "content": "......\n.....#\n....##\n...###\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape3.txt",
    "content": "#.....\n####..\n#..#..\n#.....\n......\n......\n......\n#.....\n#.....\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape4.txt",
    "content": "#.##.#\n######\n####..\n..##..\n..##..\n..##..\n..##..\n..##..\n..##..\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape5.txt",
    "content": "######\n######\n......\n......\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape6.txt",
    "content": "###...\n#####.\n##....\n##....\n#.....\n####..\n#..#..\n#.....\n#.....\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape7.txt",
    "content": "......\n......\n......\n#.....\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape8.txt",
    "content": "......\n......\n......\n......\n.....#\n#..###\n######\n######\n######\n"
  },
  {
    "path": "src/games/trex/shapes/6x9/shape9.txt",
    "content": ".#####\n...#..\n...#..\n...##.\n......\n......\n......\n......\n......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape0.txt",
    "content": "..#####\n.## ###\n.######\n.######\n.###...\n.#####.\n###....\n###....\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape1.txt",
    "content": ".......\n..##...\n..##.##\n..##.##\n#.##.##\n#.##.##\n#.##.##\n#.##.##\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape10.txt",
    "content": ".......\n...##..\n##.##..\n##.##..\n##.##.#\n##.##.#\n##.##.#\n##.##.#\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape11.txt",
    "content": ".......\n.......\n....##.\n....##.\n....##.\n....##.\n....##.\n....##.\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape12.txt",
    "content": ".......\n#......\n#......\n#......\n#.#....\n#.#....\n#.#....\n#.#....\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape13.txt",
    "content": "#######\n#######\n.......\n....##.\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape14.txt",
    "content": "#######\n#######\n.......\n.......\n..#....\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape15.txt",
    "content": ".......\n.......\n.......\n.......\n..#####\n.## ###\n.######\n.######\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape16.txt",
    "content": "##.....\n#####..\n##..#..\n##.....\n#......\n#......\n##.....\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape17.txt",
    "content": "#.....#\n##..###\n#######\n.######\n..#####\n....#..\n....##.\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape18.txt",
    "content": ".......\n.......\n.......\n.......\n.....#.\n.....#.\n.....#.\n.....#.\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape19.txt",
    "content": ".......\n#......\n#.##...\n#.##...\n#.##...\n#.##...\n#.##...\n#.##...\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape2.txt",
    "content": "#.....#\n##..###\n#######\n.######\n..#####\n....#..\n....#..\n....##.\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape20.txt",
    "content": "...####\n....###\n......#\n......#\n......#\n......#\n......#\n......#\n\n\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape21.txt",
    "content": "###....\n##.....\n#......\n#......\n#......\n#......\n#......\n#......"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape22.txt",
    "content": ".......\n..#....\n.###...\n#######\n...####\n.....##\n.....##\n.....#.\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape23.txt",
    "content": ".......\n.......\n.......\n####...\n##.....\n..##...\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape24.txt",
    "content": ".......\n......#\n.....##\n....###\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape25.txt",
    "content": ".#.....\n.##....\n.####..\n#######\n######.\n......#\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape26.txt",
    "content": "..#####\n.#.#.##\n.##.###\n.#.#.##\n.###...\n.#####.\n###....\n###....\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape2x8left.txt",
    "content": ".......\n..#....\n.###...\n#######\n...####\n.....##\n.....##\n.....#.\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape2x8right.txt",
    "content": ".......\n......#\n.....##\n....###\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape3.txt",
    "content": "##.....\n#####..\n##..#..\n##.....\n#......\n#......\n#......\n##.....\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape4.txt",
    "content": "#######\n.#####.\n...##..\n...##..\n...##..\n...##..\n...##..\n...##..\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape5.txt",
    "content": "#######\n#######\n.......\n.......\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape6.txt",
    "content": ".###...\n.#####.\n###....\n###....\n##.....\n#####..\n##..#..\n##.....\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape7.txt",
    "content": "#......\n#......\n#......\n##.....\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape8.txt",
    "content": ".......\n.......\n.......\n.......\n#.....#\n##..###\n#######\n.######\n"
  },
  {
    "path": "src/games/trex/shapes/7x8/shape9.txt",
    "content": "..#####\n....#..\n....#..\n....##.\n.......\n.......\n.......\n.......\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape0.txt",
    "content": "..#####.\n.## ####\n.#######\n.###....\n.#####..\n###.....\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape1.txt",
    "content": "...##...\n...##.##\n...##.##\n##.##.##\n##.##.##\n##.##.##\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape10.txt",
    "content": "...##...\n##.##...\n##.##...\n##.##.##\n##.##.##\n##.##.##\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape11.txt",
    "content": ".......#\n....##.#\n....##.#\n....##.#\n....##.#\n....##.#\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape12.txt",
    "content": "#.......\n#.......\n#.......\n#.##....\n#.##....\n#.##....\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape13.txt",
    "content": "########\n........\n....##..\n........\n........\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape14.txt",
    "content": "########\n........\n........\n..#.....\n........\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape15.txt",
    "content": "........\n........\n........\n..#####.\n.##.####\n.#######\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape16.txt",
    "content": "#####...\n##..#...\n##......\n#.......\n##......\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape17.txt",
    "content": "##..####\n########\n.#######\n....#...\n....##..\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape18.txt",
    "content": ".......#\n.......#\n.......#\n....##.#\n....##.#\n....##.#\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape19.txt",
    "content": "#.......\n#.##....\n#.##....\n#.##....\n#.##....\n#.##....\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape2.txt",
    "content": "##..####\n########\n.#######\n....#...\n....#...\n....##..\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape20.txt",
    "content": "....####\n.....###\n.......#\n.......#\n.......#\n.......#\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape21.txt",
    "content": "###.....\n#.......\n#.......\n#.......\n#.......\n#.......\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape22.txt",
    "content": "..#.....\n.###....\n########\n...#####\n.....###\n.....##.\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape23.txt",
    "content": "........\n........\n####....\n##......\n..##....\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape24.txt",
    "content": "......#.\n.....###\n....####\n.......#\n........\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape25.txt",
    "content": ".##.....\n.####...\n########\n######..\n......##\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape26.txt",
    "content": "..#####.\n.##...##\n.#######\n.###....\n.#####..\n###.....\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape2x8left.txt",
    "content": "..#.....\n.###....\n########\n...#####\n.....###\n.....##.\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape2x8right.txt",
    "content": "......#.\n.....###\n....####\n.......#\n........\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape3.txt",
    "content": "#####...\n##..#...\n##......\n#.......\n#.......\n##......\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape4.txt",
    "content": "#######.\n.####...\n...##...\n...##...\n...##...\n...##...\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape5.txt",
    "content": "########\n........\n........\n........\n........\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape6.txt",
    "content": ".###....\n.#####..\n###.....\n#####...\n##..#...\n##......\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape7.txt",
    "content": "#.......\n#.......\n##......\n........\n........\n........"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape8.txt",
    "content": "........\n........\n........\n##..####\n########\n.#######\n"
  },
  {
    "path": "src/games/trex/shapes/8x6/shape9.txt",
    "content": "....#...\n....#...\n....##..\n........\n........\n........"
  },
  {
    "path": "src/games/trex/shapes/8x8/bird12x8left.txt",
    "content": "................\r\n..#.............\r\n.###............\r\n############....\r\n...#######......\r\n.....###..##....\r\n.....##.........\r\n.....#.........."
  },
  {
    "path": "src/games/trex/shapes/8x8/bird12x8right.txt",
    "content": ".........#......\r\n......#..##.....\r\n.....###.####...\r\n....############\r\n.......#######..\r\n..............##\r\n................\r\n................\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape0.txt",
    "content": "..#####.\n.## ####\n.#######\n.#######\n.###....\n.#####..\n###.....\n###.....\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape1.txt",
    "content": "........\r\n...##...\r\n...##.##\r\n...##.##\r\n##.##.##\r\n##.##.##\r\n##.##.##\r\n##.##.##\r\n\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape10.txt",
    "content": "........\n...##...\n##.##...\n##.##...\n##.##.##\n##.##.##\n##.##.##\n##.##.##\n\n\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape11.txt",
    "content": "........\n.......#\n....##.#\n....##.#\n....##.#\n....##.#\n....##.#\n....##.#\n\n\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape12.txt",
    "content": "........\r\n#.......\r\n#.......\r\n#.......\r\n#.##....\r\n#.##....\r\n#.##....\r\n#.##....\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape13.txt",
    "content": "########\r\n########\r\n........\r\n....##..\r\n........\r\n........\r\n........\r\n........\r\n\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape14.txt",
    "content": "########\r\n########\r\n........\r\n........\r\n..#.....\r\n........\r\n........\r\n........\r\n\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape15.txt",
    "content": "........\n........\n........\n........\n..#####.\n.## ####\n.#######\n.#######\n\n\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape16.txt",
    "content": "##......\n#####...\n##..#...\n##......\n#.......\n#.......\n##......\n........\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape17.txt",
    "content": "#.....##\n##..####\n########\n.#######\n..######\n....#...\n....##..\n........\n\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape18.txt",
    "content": "........\r\n.......#\r\n.......#\r\n.......#\r\n....##.#\r\n....##.#\r\n....##.#\r\n....##.#\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape19.txt",
    "content": "........\r\n#.......\r\n#.##....\r\n#.##....\r\n#.##....\r\n#.##....\r\n#.##....\r\n#.##...."
  },
  {
    "path": "src/games/trex/shapes/8x8/shape2.txt",
    "content": "#.....##\n##..####\n########\n.#######\n..######\n....#...\n....#...\n....##..\n\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape20.txt",
    "content": "....##.#\r\n....####\r\n.....###\r\n.......#\r\n.......#\r\n.......#\r\n.......#\r\n.......#\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape21.txt",
    "content": "\r\n#.##....\r\n###.....\r\n#.......\r\n#.......\r\n#.......\r\n#.......\r\n#.......\r\n#.......\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape22.txt",
    "content": "........\r\n..#.....\r\n.###....\r\n########\r\n...#####\r\n.....###\r\n.....##.\r\n.....#..\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape23.txt",
    "content": "........\r\n........\r\n........\r\n####....\r\n##......\r\n..##....\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape24.txt",
    "content": "........\r\n......#.\r\n.....###\r\n....####\r\n.......#\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape25.txt",
    "content": ".#......\r\n.##.....\r\n.####...\r\n########\r\n######..\r\n......##\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape26.txt",
    "content": "..#####.\r\n.#.#.###\r\n.##.###.\r\n.#.#.###\r\n.###....\r\n.#####..\r\n###.....\r\n###.....\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape3.txt",
    "content": "##......\n#####...\n##..#...\n##......\n#.......\n#.......\n#.......\n##......\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape4.txt",
    "content": "##.##.##\r\n#######.\r\n.####...\r\n...##...\r\n...##...\r\n...##...\r\n...##...\r\n...##..."
  },
  {
    "path": "src/games/trex/shapes/8x8/shape5.txt",
    "content": "########\r\n########\r\n........\r\n........\r\n........\r\n........\r\n........\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape6.txt",
    "content": ".###....\n.#####..\n###.....\n###.....\n##......\n#####...\n##..#...\n##......\n\n\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape7.txt",
    "content": "#.......\r\n#.......\r\n#.......\r\n##......\r\n........\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape8.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n#.....##\r\n##..####\r\n########\r\n.#######\r\n\r\n"
  },
  {
    "path": "src/games/trex/shapes/8x8/shape9.txt",
    "content": "..######\r\n....#...\r\n....#...\r\n....##..\r\n........\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile0.txt",
    "content": "31,55,63,63,56,62,48,48"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile1.txt",
    "content": "0,12,13,13,45,45,45,45"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile10.txt",
    "content": "0,12,44,44,45,45,45,45"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile11.txt",
    "content": "0,1,5,5,5,5,5,5"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile12.txt",
    "content": "0,32,32,32,40,40,40,40"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile13.txt",
    "content": "63,63,0,12,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile14.txt",
    "content": "63,63,0,0,2,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile15.txt",
    "content": "0,0,0,0,31,55,63,63"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile16.txt",
    "content": "32,60,36,32,0,0,32,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile17.txt",
    "content": "1,39,63,63,31,4,6,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile18.txt",
    "content": "0,1,1,1,5,5,5,5"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile19.txt",
    "content": "0,32,40,40,40,40,40,40"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile2.txt",
    "content": "1,39,63,63,31,4,4,6"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile20.txt",
    "content": "6,7,3,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile21.txt",
    "content": "24,48,0,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile22.txt",
    "content": "0,16,56,63,15,3,3,2"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile23.txt",
    "content": "0,0,0,56,32,24,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile24.txt",
    "content": "0,1,3,7,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile25.txt",
    "content": "32,48,60,63,62,1,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile26.txt",
    "content": "31,43,55,43,56,62,48,48"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile2x8left.txt",
    "content": "0,16,56,63,15,3,3,2"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile2x8right.txt",
    "content": "0,1,3,7,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile3.txt",
    "content": "32,60,36,32,0,0,0,32"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile4.txt",
    "content": "45,63,60,12,12,12,12,12"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile5.txt",
    "content": "63,63,0,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile6.txt",
    "content": "56,62,48,48,32,60,36,32"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile7.txt",
    "content": "0,0,0,32,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile8.txt",
    "content": "0,0,0,0,1,39,63,63"
  },
  {
    "path": "src/games/trex/tiles/6x8/tile9.txt",
    "content": "31,4,4,6,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile0.txt",
    "content": "31,55,63,63,56,62,48,48,48"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile1.txt",
    "content": "0,12,13,13,45,45,45,45,45"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile10.txt",
    "content": "0,12,44,44,45,45,45,45,45"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile11.txt",
    "content": "0,1,5,5,5,5,5,5,5"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile12.txt",
    "content": "0,32,32,32,40,40,40,40,40"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile13.txt",
    "content": "63,63,0,12,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile14.txt",
    "content": "63,63,0,0,2,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile15.txt",
    "content": "0,0,0,0,31,55,63,63,63"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile16.txt",
    "content": "32,60,36,32,0,0,32,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile17.txt",
    "content": "1,39,63,63,31,4,6,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile18.txt",
    "content": "0,1,1,1,5,5,5,5,5"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile19.txt",
    "content": "0,32,40,40,40,40,40,40,40"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile2.txt",
    "content": "1,39,63,63,31,4,4,6,6"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile20.txt",
    "content": "6,7,3,0,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile21.txt",
    "content": "24,48,0,0,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile22.txt",
    "content": "0,16,56,63,15,3,3,2,2"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile23.txt",
    "content": "0,0,0,56,32,24,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile24.txt",
    "content": "0,1,3,7,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile25.txt",
    "content": "32,48,60,63,62,1,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile26.txt",
    "content": "31,43,55,43,56,62,48,48,48"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile2x8left.txt",
    "content": "0,16,56,63,15,3,3,2,2"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile2x8right.txt",
    "content": "0,1,3,7,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile3.txt",
    "content": "32,60,36,32,0,0,0,32,32"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile4.txt",
    "content": "45,63,60,12,12,12,12,12,12"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile5.txt",
    "content": "63,63,0,0,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile6.txt",
    "content": "56,62,48,48,32,60,36,32,32"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile7.txt",
    "content": "0,0,0,32,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile8.txt",
    "content": "0,0,0,0,1,39,63,63,63"
  },
  {
    "path": "src/games/trex/tiles/6x9/tile9.txt",
    "content": "31,4,4,6,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile0.txt",
    "content": "31,55,63,63,56,62,112,112"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile1.txt",
    "content": "0,24,27,27,91,91,91,91"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile10.txt",
    "content": "0,12,108,108,109,109,109,109"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile11.txt",
    "content": "0,0,6,6,6,6,6,6"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile12.txt",
    "content": "0,64,64,64,80,80,80,80"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile13.txt",
    "content": "127,127,0,6,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile14.txt",
    "content": "127,127,0,0,16,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile15.txt",
    "content": "0,0,0,0,31,55,63,63"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile16.txt",
    "content": "96,124,100,96,64,64,96,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile17.txt",
    "content": "65,103,127,63,31,4,6,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile18.txt",
    "content": "0,0,0,0,2,2,2,2"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile19.txt",
    "content": "0,64,88,88,88,88,88,88"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile2.txt",
    "content": "65,103,127,63,31,4,4,6"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile20.txt",
    "content": "15,7,1,1,1,1,1,1"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile21.txt",
    "content": "112,96,64,64,64,64,64,64"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile22.txt",
    "content": "0,16,56,127,15,3,3,2"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile23.txt",
    "content": "0,0,0,120,96,24,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile24.txt",
    "content": "0,1,3,7,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile25.txt",
    "content": "32,48,60,127,126,1,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile26.txt",
    "content": "31,43,55,43,56,62,112,112"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile2x8left.txt",
    "content": "0,16,56,127,15,3,3,2"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile2x8right.txt",
    "content": "0,1,3,7,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile3.txt",
    "content": "96,124,100,96,64,64,64,96"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile4.txt",
    "content": "127,62,12,12,12,12,12,12"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile5.txt",
    "content": "127,127,0,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile6.txt",
    "content": "56,62,112,112,96,124,100,96"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile7.txt",
    "content": "64,64,64,96,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile8.txt",
    "content": "0,0,0,0,65,103,127,63"
  },
  {
    "path": "src/games/trex/tiles/7x8/tile9.txt",
    "content": "31,4,4,6,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile0.txt",
    "content": "62,111,127,112,124,224"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile1.txt",
    "content": "24,27,27,219,219,219"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile10.txt",
    "content": "24,216,216,219,219,219"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile11.txt",
    "content": "1,13,13,13,13,13"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile12.txt",
    "content": "128,128,128,176,176,176"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile13.txt",
    "content": "255,0,12,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile14.txt",
    "content": "255,0,0,32,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile15.txt",
    "content": "0,0,0,62,111,127"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile16.txt",
    "content": "248,200,192,128,192,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile17.txt",
    "content": "207,255,127,8,12,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile18.txt",
    "content": "1,1,1,13,13,13"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile19.txt",
    "content": "128,176,176,176,176,176"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile2.txt",
    "content": "207,255,127,8,8,12"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile20.txt",
    "content": "15,7,1,1,1,1"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile21.txt",
    "content": "224,128,128,128,128,128"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile22.txt",
    "content": "32,112,255,31,7,6"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile23.txt",
    "content": "0,0,240,192,48,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile24.txt",
    "content": "2,7,15,1,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile25.txt",
    "content": "96,120,255,252,3,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile26.txt",
    "content": "62,99,127,112,124,224"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile2x8left.txt",
    "content": "32,112,255,31,7,6"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile2x8right.txt",
    "content": "2,7,15,1,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile3.txt",
    "content": "248,200,192,128,128,192"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile4.txt",
    "content": "254,120,24,24,24,24"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile5.txt",
    "content": "255,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile6.txt",
    "content": "112,124,224,248,200,192"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile7.txt",
    "content": "128,128,192,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile8.txt",
    "content": "0,0,0,207,255,127"
  },
  {
    "path": "src/games/trex/tiles/8x6/tile9.txt",
    "content": "8,8,12,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile0.txt",
    "content": "62,111,127,127,112,124,224,224"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile1.txt",
    "content": "0,24,27,27,219,219,219,219"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile10.txt",
    "content": "0,24,216,216,219,219,219,219"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile11.txt",
    "content": "0,1,13,13,13,13,13,13"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile12.txt",
    "content": "0,128,128,128,176,176,176,176"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile13.txt",
    "content": "255,255,0,12,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile14.txt",
    "content": "255,255,0,0,32,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile15.txt",
    "content": "0,0,0,0,62,111,127,127"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile16.txt",
    "content": "192,248,200,192,128,128,192,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile17.txt",
    "content": "131,207,255,127,63,8,12,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile18.txt",
    "content": "0,1,1,1,13,13,13,13"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile19.txt",
    "content": "0,128,176,176,176,176,176,176"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile2.txt",
    "content": "131,207,255,127,63,8,8,12"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile20.txt",
    "content": "13,15,7,1,1,1,1,1"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile21.txt",
    "content": "176,224,128,128,128,128,128,128"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile22.txt",
    "content": "0,32,112,255,31,7,6,4"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile23.txt",
    "content": "0,0,0,240,192,48,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile24.txt",
    "content": "0,2,7,15,1,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile25.txt",
    "content": "64,96,120,255,252,3,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile26.txt",
    "content": "62,87,110,87,112,124,224,224"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile3.txt",
    "content": "192,248,200,192,128,128,128,192"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile4.txt",
    "content": "219,254,120,24,24,24,24,24"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile5.txt",
    "content": "255,255,0,0,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile6.txt",
    "content": "112,124,224,224,192,248,200,192"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile7.txt",
    "content": "128,128,128,192,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile8.txt",
    "content": "0,0,0,0,131,207,255,127"
  },
  {
    "path": "src/games/trex/tiles/8x8/tile9.txt",
    "content": "63,8,8,12,0,0,0,0"
  },
  {
    "path": "src/games/trex/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 'O'\r\n#define _TILE_2 'L'\r\n#define _TILE_3 'L'\r\n\r\n#define _TILE_17 'I'\r\n#define _TILE_16 'I'\r\n\r\n#define _TILE_15 'O'\r\n#define _TILE_6 'L'\r\n#define _TILE_7 ' '\r\n\r\n#define _TILE_8 'L'\r\n#define _TILE_9 'L'\r\n\r\n#if defined(__ATARI7800__) && !defined(_XL_NO_COLOR)\r\n    #define _TILE_13 '.'\r\n    #define _TILE_14 '.'\r\n#else\r\n    #define _TILE_13 '-'\r\n    #define _TILE_14 '-'\r\n#endif\r\n#define _TILE_10 'W'\r\n#define _TILE_4  'I'\r\n\r\n// #define _TILE_11 'U'\r\n// #define _TILE_20 'I'\r\n// #define _TILE_12 'U'\r\n// #define _TILE_21 'I'\r\n\r\n\r\n#define _TILE_1  'U'\r\n#define _TILE_4  'I'\r\n#if defined(__ATARI7800__) && !defined(_XL_NO_COLOR)\r\n    #define _TILE_5  '.'\r\n\r\n\r\n    #define _TILE_22 'C'\r\n    #define _TILE_23 '.'\r\n\r\n    #define _TILE_24 'C'\r\n    #define _TILE_25 'B'\r\n\r\n    #define _TILE_26 '+'\r\n    \r\n#else\r\n\r\n    #define _TILE_5  '-'\r\n\r\n    #define _TILE_22 '<'\r\n    #define _TILE_23 '='\r\n\r\n    #define _TILE_24 '<'\r\n    #define _TILE_25 '-'\r\n\r\n    #define _TILE_26 '+'\r\n\r\n\r\n#endif\r\n\r\n/*\r\n#ifndef _IMAGES_H\r\n#define _IMAGES_H\r\n\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#if !defined(TINY_GAME)\r\n\r\n    // Initial/jump dino \r\n    #define TOP_DINO_0            _TILE_0\r\n    #define TAIL_DINO_0           _TILE_2\r\n    #define BOTTOM_DINO_0         _TILE_3\r\n\r\n    // Dino lower feet\r\n    #define TAIL_RAISED_DINO      _TILE_17\r\n    #define BOTTOM_RAISED_DINO    _TILE_16\r\n\r\n    // Dino with +4 pixel offset\r\n    #define TOP_DINO_1            _TILE_15\r\n    #define MIDDLE_DINO_1         _TILE_6\r\n    #define BOTTOM_DINO_1         _TILE_7\r\n    \r\n    #define TAIL_DINO_1           _TILE_8\r\n    #define FOOT_DINO_1           _TILE_9\r\n    \r\n\r\n    #define TERRAIN_2             _TILE_13\r\n    #define TERRAIN_3             _TILE_14\r\n    \r\n\r\n    #define TOP_CACTUS_2          _TILE_10\r\n    #define BOTTOM_CACTUS_2       _TILE_4\r\n\r\n    #define TOP_LEFT_CACTUS_2     _TILE_11\r\n    #define BOTTOM_LEFT_CACTUS_2  _TILE_20\r\n    #define TOP_RIGHT_CACTUS_2    _TILE_12\r\n    #define BOTTOM_RIGHT_CACTUS_2 _TILE_21\r\n    \r\n\r\n    #define TERRAIN               _TILE_5\r\n    \r\n    #define TOP_CACTUS            _TILE_1\r\n    #define BOTTOM_CACTUS         _TILE_4\r\n\r\n    #define TOP_LEFT_CACTUS       _TILE_18\r\n    #define BOTTOM_LEFT_CACTUS    _TILE_20\r\n    #define TOP_RIGHT_CACTUS      _TILE_19\r\n    #define BOTTOM_RIGHT_CACTUS   _TILE_21\r\n\r\n    #define LEFT_BIRD_0           _TILE_22\r\n    #define LEFT_BIRD_1           _TILE_23\r\n\r\n    #define RIGHT_BIRD_0          _TILE_24\r\n    #define RIGHT_BIRD_1          _TILE_25\r\n\r\n    #define TOP_DEAD_DINO_0       _TILE_26\r\n    \r\n#else\r\n\r\n    // Initial/jump dino \r\n    #define TOP_DINO_0            _TILE_0\r\n    #define TAIL_DINO_0           _TILE_2\r\n    #define BOTTOM_DINO_0         _TILE_3\r\n\r\n    #define TOP_CACTUS            _TILE_1\r\n    #define BOTTOM_CACTUS         _TILE_4\r\n\r\n    #define TERRAIN               _TILE_5\r\n  \r\n#endif\r\n\r\n#endif // _IMAGES_H\r\n\r\n\r\n*/\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/verbix/Makefile.verbix",
    "content": "\nFULL_FILES ?= \\\n\t$(BASIC_CROSS_LIB_FILES) \\\n    $(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\n\t$(SOURCE_PATH)/main.c \n\nGAME_NAME := verbix\n\nPARENT_DIR = games\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\n\ninclude ./Makefile_common\n\n\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/makefiles/Makefile.override\n\ninclude ./makefiles.common/auxiliary/Makefile_default_values\n"
  },
  {
    "path": "src/games/verbix/config/game_config.mk",
    "content": "############################\r\n\r\nC128_Z80_80COL_GAME_OPTS      = -DNO_LEVEL_END \r\n\r\nZX81_GFX_GAME_OPTS            = -DNO_LEVEL_END\r\n\r\nPHC25_GAME_OPTS               = -DNO_LEVEL_END -DNO_LETTER_VALUES -DNO_DISPLAY_BORDERS -D_XL_NO_SOUND\r\n\r\nPHC25_MONO_GAME_OPTS          = -DNO_LEVEL_END -DNO_LETTER_VALUES -DNO_DISPLAY_BORDERS -D_XL_NO_SOUND"
  },
  {
    "path": "src/games/verbix/config/project_config.mk",
    "content": "\r\n\r\n# ATARI_COLORS=-D__USE_GREEN\r\n# ATARI5200_COLORS=-D__USE_GREEN\r\n\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_AGAT_SLOWDOWN=100\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=250\r\n_APPLE2_HGR_SLOWDOWN=250\r\n_APPLE2ENH_HGR_SLOWDOWN=250\r\n_ATARI_SLOWDOWN=200\r\n_ATARI5200_SLOWDOWN=200\r\n_ATARI_LYNX_SLOWDOWN=230\r\n_ATARI7800_NO_COLOR_SLOWDOWN=280\r\n_ATARI7800_SLOWDOWN=400\r\n_ATARI_LYNX_SLOWDOWN=600\r\n_C128_8502_80COL_SLOWDOWN=200\r\n_C16_SLOWDOWN=350\r\n_C16_CONIO_SLOWDOWN=400\r\n_C64_SLOWDOWN=300\r\n_CBM610_SLOWDOWN=250\r\n_CBM510_SLOWDOWN=300\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=800\r\n_MEGA65_SLOWDOWN=800\r\n_NES_SLOWDOWN=400\r\n_MEGA65_SLOWDOWN=800\r\n_PET_SLOWDOWN=250\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=1400\r\n_VIC20_SLOWDOWN=500\r\n\r\n\r\n# Z88DK\r\n_ABC80_SLOWDOWN=300\r\n_AGON_SLOWDOWN=3500\r\n_AQUARIUS_SLOWDOWN=150\r\n_ACE_SLOWDOWN=130\r\n_BEE_SLOWDOWN=30\r\n_C128_Z80_40COL_SLOWDOWN=200\r\n_C128_Z80_80COL_SLOWDOWN=50\r\n_CAMPUTERS_LYNX_SLOWDOWN=120\r\n_COLECO_SLOWDOWN=230\r\n_CPC_MODE0_SLOWDOWN=250\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=240\r\n_CPC_MODE2_SLOWDOWN=240\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_E200_SLOWDOWN=300\r\n_G850_SLOWDOWN=150\r\n_G815_SLOWDOWN=100\r\n_GAL_SLOWDOWN=2500\r\n_GAL_GFX_SLOWDOWN=1500\r\n_GB_SLOWDOWN=200    \r\n_GG_SLOWDOWN=260\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_GL6000SL_SLOWDOWN=100\r\n_HECTORHR_SLOWDOWN=150\r\n_LASER500_SLOWDOWN=250\r\n_MC1000_SLOWDOWN=220\r\n_M100_SLOWDOWN=200\r\n_M5_SLOWDOWN=250\r\n_MSX_SLOWDOWN=250\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=250\r\n_MTX512_SLOWDOWN=250\r\n_MZ_SLOWDOWN=250\r\n_PHC25_SLOWDOWN=320\r\n_PV1000_SLOWDOWN=20\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SC3000_SLOWDOWN=250\r\n_SMC777_SLOWDOWN=180\r\n_SMS_SLOWDOWN=260\r\n_SPECTRUM_SLOWDOWN=160\r\n_TRS80_SLOWDOWN=30\r\n_VG5K_SLOWDOWN=220\r\n_VZ200_SLOWDOWN=220 \r\n_X07_SLOWDOWN=10\r\n_ZX81_SLOWDOWN=60\r\n_ZX81_WRX_SLOWDOWN=22\r\n_ZX81_WRX128_SLOWDOWN=35\r\n_ZX81_8X6_WRX128_SLOWDOWN=45\r\n_ZX81_WRX64_SLOWDOWN=60\r\n_ZX81_8X6_WRX64_SLOWDOWN=70\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=150\r\n_DRAGON_SLOWDOWN=150\r\n_COCO3_SLOWDOWN=280\r\n_MO5_SLOWDOWN=180\r\n_TO7_SLOWDOWN=180\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=100\r\n_PECOM_SLOWDOWN=100\r\n_TMC600_SLOWDOWN=120\r\n_MICRO_SLOWDOWN=240\r\n_CIDELSA_SLOWDOWN=100\r\n\r\n\r\n# MC10\r\n_MC10_SLOWDOWN=110\r\n\r\n\r\n# TI99\r\n_TI99_SLOWDOWN=200\r\n\r\n\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n_TERMINAL_SLOWDOWN?=12\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN=550\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=400"
  },
  {
    "path": "src/games/verbix/dictionary.h",
    "content": "\r\n\r\n#ifndef _DICTIONARY_H\r\n#define _DICTIONARY_H\r\n\r\n#define ALPHABET_SIZE 16\r\n\r\n\r\n#define DICTIONARY_SIZE (2656+1)\r\n\r\n\r\n// E A R I O T N S L C U D P M H Y\r\n\r\n\r\n\r\nconst uint16_t dictionary_index[ALPHABET_SIZE+1] = \r\n    {\r\n           0+1,   72+1,  235+1,  397+1, \r\n         448+1,  503+1,  752+1,  827+1, \r\n        1263+1, 1431+1, 1727+1, 1775+1,\r\n        1966+1, 2243+1, 2469+1, 2630+1,\r\n        2656+1\r\n    };\r\n    \r\n\r\n// TODO: Buckets need to be ordered in the encoding\r\nconst uint16_t dictionary[DICTIONARY_SIZE] = \r\n    {\r\n        0, // dummy value to have binary search work with unsigned indices\r\n        \r\n        // E 72 (0-71)    +1 dummy value\r\n        560u, 4619u, 4702u, 4711u, 4743u, 4751u, 5378u, 5382u, 5895u, 5896u, 5899u, 5975u, 8341u, 8560u, 8715u, 8770u, 9392u, 10901u, \r\n        10949u, 15106u, 23216u, 24066u, 24121u, 24135u, 24312u, 24785u, 24799u, 24981u, 25160u, 25858u, 25903u, 26275u, 26528u, 27394u, \r\n        27403u, 27552u, 29954u, 30028u, 30471u, 30495u, 32917u, 33104u, 33127u, 33131u, 33616u, 33712u, 33984u, 35504u, 35586u, 38933u, \r\n        40519u, 45265u, 45911u, 45973u, 47760u, 49159u, 49557u, 50071u, 50334u, 51021u, 52766u, 52811u, 53295u, 53355u, 53560u, 54055u, \r\n        54103u, 54352u, 55552u, 56415u, 61479u, 62000u,\r\n\r\n    \r\n        // A 163 (72-234) +1 dummy value\r\n        560u, 8215u, 8216u, 8289u, 8727u, 8735u, 8983u, 9055u, 9072u, 9328u, 9425u, 9599u, 9991u, 10054u, 10507u, 10967u, 11074u, 11531u, \r\n        11586u, 12802u, 12811u, 13443u, 13726u, 14208u, 14347u, 15106u, 15111u, 15115u, 15618u, 15627u, 16977u, 21041u, 21381u, 21600u, \r\n        21640u, 21719u, 21778u, 21817u, 22551u, 24677u, 25414u, 25456u, 25472u, 25553u, 25728u, 25776u, 25863u, 25867u, 25911u, 25913u, \r\n        25983u, 26135u, 26191u, 26280u, 26285u, 27403u, 29025u, 29616u, 29954u, 29988u, 30002u, 30469u, 30471u, 30475u, 30483u, 30495u, \r\n        31045u, 31750u, 31801u, 32262u, 32263u, 32805u, 32974u, 33069u, 33542u, 33559u, 33799u, 33888u, 33963u, 34017u, 34050u, 34066u, \r\n        34119u, 34276u, 34831u, 34847u, 34885u, 34895u, 35543u, 35586u, 36065u, 37383u, 37435u, 37815u, 37926u, 38155u, 38198u, 38210u, \r\n        38407u, 38411u, 39504u, 40199u, 40455u, 40459u, 40516u, 41488u, 41495u, 41496u, 41529u, 42311u, 42583u, 43828u, 43829u, 45253u, \r\n        45509u, 45834u, 45895u, 46112u, 46118u, 46277u, 47749u, 47874u, 47883u, 48000u, 48390u, 48406u, 48437u, 49191u, 49445u, 49552u, \r\n        49734u, 49942u, 50046u, 50213u, 50575u, 50689u, 50951u, 51015u, 52352u, 52367u, 52791u, 52795u, 53351u, 53355u, 53623u, 53735u, \r\n        54111u, 54112u, 54116u, 54135u, 54192u, 54434u, 55920u, 56331u, 56448u, 56463u, 56647u, 57223u, 57371u, 58507u, 58615u, 61166u, \r\n        62311u,\r\n        \r\n\r\n        // R 162 (235-396)    +1 dummy value    \r\n        135u, 183u, 191u, 295u, 301u, 391u, 397u, 405u, 414u, 439u, 447u, 455u, 471u, 534u, 678u, 871u, 1316u, 1327u, 1438u, 1560u, 1616u, \r\n        1623u, 1719u, 1797u, 1823u, 1846u, 1879u, 2053u, 2079u, 2105u, 2332u, 2385u, 2388u, 2466u, 2469u, 2672u, 2875u, 2876u, 2959u, \r\n        3080u, 3103u, 3108u, 3215u, 3350u, 3356u, 3381u, 4610u, 4967u, 4975u, 4976u, 4999u, 5047u, 5378u, 5383u, 5387u, 5428u, 5471u, \r\n        5607u, 5719u, 5790u, 5815u, 5823u, 5904u, 6087u, 6095u, 6287u, 6402u, 6407u, 6411u, 6930u, 6963u, 6964u, 6982u, 7170u, 7175u, \r\n        7179u, 7227u, 7623u, 7947u, 8006u, 12679u, 13399u, 13575u, 13936u, 14007u, 14082u, 14086u, 14087u, 14343u, 14347u, 14464u, 14471u, \r\n        14594u, 14599u, 14603u, 15106u, 15111u, 15362u, 15366u, 15618u, 15623u, 15627u, 16679u, 16743u, 16757u, 16798u, 16823u, 16855u, \r\n        17287u, 17295u, 17335u, 17495u, 17503u, 17525u, 17591u, 17623u, 17631u, 17730u, 18100u, 18183u, 18230u, 18439u, 18567u, 19024u, \r\n        19031u, 19051u, 19056u, 19061u, 19204u, 19458u, 19463u, 19467u, 19734u, 19911u, 20248u, 41496u, 41831u, 42335u, 42503u, 42553u, \r\n        42583u, 42591u, 42607u, 42759u, 42839u, 42847u, 42864u, 43010u, 43015u, 43019u, 43488u, 43778u, 43967u, 44032u, 44294u, 44354u, \r\n        44487u, 44511u, 57367u, 57517u, 58212u, 61392u,\r\n\r\n\r\n        // I 51 (397-447)    +1 dummy value    \r\n        8528u, 9319u, 9327u, 17687u, 17977u, 18776u, 19257u, 20695u, 23023u, 24613u, 24773u, 24928u, 25029u, 25776u, 25858u, 25889u, \r\n        25892u, 26114u, 26373u, 26629u, 26655u, 27042u, 27168u, 27440u, 27813u, 30624u, 30725u, 30727u, 32935u, 32941u, 33561u, 33709u, \r\n        36903u, 37634u, 37775u, 37991u, 40514u, 45079u, 45080u, 45893u, 45901u, 46215u, 47106u, 47111u, 47115u, 49031u, 49032u, 53719u, \r\n        56328u, 56356u, 56463u,\r\n        \r\n\r\n        // O 55 (448-502)   +1 dummy value\r\n        4619u, 5382u, 5607u, 5895u, 5943u, 8528u, 8583u, 9700u, 10310u, 10519u, 11010u, 14338u, 14347u, 19328u, 19918u, 21762u, 24066u, \r\n        25414u, 26373u, 26885u, 29442u, 32839u, 33607u, 35586u, 35590u, 35632u, 36886u, 38149u, 38168u, 39330u, 40450u, 40480u, 42242u, \r\n        42246u, 42321u, 42420u, 42640u, 42760u, 42839u, 45997u, 46119u, 46242u, 47874u, 48015u, 49185u, 49255u, 49543u, 50016u, 50093u, \r\n        50443u, 50489u, 53351u, 54103u, 60729u, 61166u,\r\n        \r\n\r\n        // T 249 (503-751)    +1 dummy value   \r\n        94u, 103u, 111u, 215u, 295u, 303u, 343u, 368u, 391u, 414u, 471u, 545u, 559u, 615u, 624u, 656u, 727u, 1313u, 1541u, 1602u, 1606u, 1623u, \r\n        1630u, 1648u, 1694u, 1719u, 1879u, 1887u, 1921u, 2183u, 2191u, 2477u, 2535u, 2543u, 3007u, 3072u, 3131u, 3523u, 3524u, 3525u, 3527u, \r\n        4231u, 4615u, 4619u, 4655u, 4677u, 4679u, 4695u, 4711u, 4799u, 4807u, 4965u, 4999u, 5378u, 5471u, 5759u, 5968u, 5983u, 6151u, 6214u, \r\n        6287u, 6295u, 6311u, 6405u, 6453u, 6471u, 6487u, 6757u, 6848u, 7170u, 7175u, 7179u, 7218u, 7223u, 7426u, 7431u, 7435u, 7623u, 8199u, \r\n        8203u, 8213u, 8219u, 8220u, 8299u, 8311u, 8439u, 8501u, 8502u, 8504u, 8551u, 8574u, 8592u, 8597u, 8624u, 8647u, 8663u, 8668u, 8695u, \r\n        8962u, 8967u, 8971u, 8984u, 8987u, 9031u, 9040u, 9096u, 9104u, 9152u, 9159u, 9175u, 9292u, 9303u, 9310u, 9352u, 9381u, 9436u, 10754u, \r\n        10759u, 10763u, 10846u, 10869u, 10871u, 10895u, 10896u, 10972u, 12149u, 12327u, 12577u, 12807u, 12811u, 12871u, 13570u, 13590u, 13600u, \r\n        13663u, 13696u, 13792u, 13831u, 13911u, 13935u, 14338u, 14343u, 14347u, 14423u, 14430u, 14471u, 14512u, 15111u, 15115u, 15128u, 15487u, \r\n        15567u, 15618u, 15623u, 15627u, 15675u, 16757u, 16823u, 16831u, 16926u, 16953u, 16976u, 16983u, 17011u, 17012u, 17054u, 17063u, 17280u, \r\n        17287u, 17495u, 17502u, 17511u, 17543u, 17666u, 17671u, 17675u, 17677u, 17688u, 17759u, 17922u, 17927u, 17931u, 17944u, 17977u, 18567u, \r\n        18983u, 19031u, 19102u, 19231u, 19391u, 19458u, 19463u, 19467u, 19513u, 19523u, 19527u, 19719u, 19935u, 20226u, 20235u, 20294u, 28967u, \r\n        41319u, 41575u, 41655u, 41663u, 41671u, 42306u, 42323u, 42407u, 42498u, 42503u, 42507u, 42519u, 42553u, 42607u, 43068u, 43136u, 44160u, \r\n        44354u, 44511u, 57351u, 57376u, 57389u, 57394u, 57425u, 57447u, 57456u, 57552u, 57687u, 57696u, 57856u, 57920u, 58029u, 58155u, 58208u, \r\n        58215u, 58406u, 58480u, 58535u, 60087u, 60124u, 61392u, 61959u, 62023u, 64519u, 64523u, 64536u, 64583u,\r\n\r\n\r\n        // N 75 (752-826)    +1 dummy value\r\n        183u, 191u, 295u, 340u, 350u, 599u, 695u, 703u, 1127u, 1879u, 4615u, 4756u, 4759u, 4791u, 4891u, 4999u, 5383u, 5400u, 5471u, 5534u, 5743u, \r\n        5912u, 5983u, 6628u, 6962u, 7175u, 7375u, 7426u, 7431u, 7435u, 12432u, 13570u, 13604u, 13663u, 13831u, 13918u, 13935u, 14083u, 14594u, \r\n        14619u, 14816u, 15567u, 15928u, 16519u, 16990u, 17111u, 17184u, 17264u, 17279u, 17511u, 17520u, 17666u, 17671u, 17675u, 17822u, 17927u, \r\n        18031u, 18064u, 18183u, 18187u, 18191u, 19047u, 19207u, 19224u, 19391u, 19739u, 41584u, 42335u, 42367u, 43143u, 43778u, 43783u, 43824u, \r\n        63558u, 64974u,\r\n\r\n\r\n        // S 436 (827-1262)   +1 dummy value\r\n        39u, 94u, 117u, 183u, 191u, 199u, 215u, 295u, 343u, 391u, 471u, 479u, 685u, 864u, 1452u, 1648u, 1719u, 2078u, 2183u, 2391u, 2452u, 2818u, \r\n        2838u, 2989u, 3096u, 3121u, 3151u, 3153u, 3334u, 3383u, 4630u, 4663u, 4958u, 4965u, 4999u, 5383u, 5387u, 5430u, 5618u, 5634u, 5815u, 5823u, \r\n        6015u, 6151u, 6171u, 6214u, 6231u, 6239u, 6257u, 6287u, 6736u, 6753u, 6800u, 6815u, 7055u, 7375u, 7938u, 12800u, 12806u, 12807u, 12811u, \r\n        12972u, 13575u, 13579u, 13586u, 13735u, 13831u, 13968u, 13991u, 14104u, 14207u, 14407u, 14423u, 14431u, 14471u, 14479u, 15111u, 15115u, \r\n        15232u, 16679u, 16839u, 16847u, 16898u, 16903u, 16943u, 16977u, 16983u, 17287u, 17495u, 17502u, 17503u, 17938u, 17977u, 18031u, 18063u, \r\n        18439u, 18443u, 18450u, 18491u, 18502u, 18503u, 18605u, 18816u, 18983u, 19038u, 19051u, 19056u, 19079u, 19143u, 19151u, 19223u, 19663u, \r\n        19735u, 20247u, 20482u, 20488u, 20491u, 20492u, 20504u, 20507u, 20509u, 20518u, 20534u, 20567u, 20580u, 20608u, 20609u, 20679u, 20695u, \r\n        20768u, 20773u, 20775u, 20786u, 20790u, 20795u, 20816u, 20823u, 20843u, 20862u, 20864u, 20872u, 20942u, 20956u, 20983u, 21004u, 21020u, \r\n        21023u, 21052u, 21068u, 21157u, 21165u, 21255u, 21259u, 21287u, 21349u, 21376u, 21381u, 21384u, 21520u, 21525u, 21527u, 21536u, 21549u, \r\n        21551u, 21561u, 21576u, 21579u, 21580u, 21600u, 21615u, 21632u, 21669u, 21676u, 21703u, 21713u, 21724u, 23141u, 23143u, 23223u, 23231u, \r\n        23260u, 24327u, 24448u, 24451u, 24578u, 24864u, 24872u, 24888u, 25031u, 25431u, 25520u, 25536u, 25543u, 25632u, 25637u, 25669u, 25675u, \r\n        25676u, 25687u, 25765u, 32773u, 32780u, 32951u, 32965u, 33078u, 33104u, 33111u, 33125u, 33150u, 33223u, 33239u, 33271u, 33538u, 33623u, \r\n        33679u, 33680u, 33712u, 33735u, 33744u, 33751u, 33759u, 33799u, 33868u, 33879u, 33886u, 33918u, 33984u, 33991u, 34004u, 35335u, 35339u, \r\n        35367u, 35372u, 35415u, 35454u, 35543u, 35548u, 36610u, 36751u, 36960u, 36965u, 37152u, 37159u, 37164u, 37167u, 37207u, 37221u, 37223u, \r\n        37248u, 37259u, 37260u, 37263u, 37303u, 37335u, 37340u, 37404u, 37405u, 37436u, 37437u, 37451u, 37549u, 37702u, 37920u, 37926u, 37957u, \r\n        37964u, 37984u, 38027u, 38050u, 38053u, 38080u, 38087u, 39536u, 39560u, 39603u, 39604u, 39607u, 39639u, 40660u, 40999u, 41047u, 41055u, \r\n        41136u, 41474u, 41495u, 41615u, 41655u, 41808u, 41815u, 42273u, 42607u, 42668u, 42979u, 43151u, 43903u, 44034u, 44039u, 44065u, 44313u, \r\n        44487u, 44497u, 49163u, 49170u, 49197u, 49253u, 49259u, 49285u, 49288u, 49303u, 49440u, 49447u, 49488u, 49495u, 49511u, 49533u, 49552u, \r\n        49567u, 49584u, 49655u, 49664u, 49685u, 49695u, 49717u, 49824u, 49922u, 49927u, 49928u, 49931u, 49952u, 50000u, 50007u, 50016u, 50017u, \r\n        50023u, 50031u, 50053u, 50056u, 50064u, 50071u, 50079u, 50208u, 50213u, 50232u, 50242u, 50246u, 50248u, 50263u, 50341u, 51221u, 51231u, \r\n        51253u, 51723u, 51749u, 51750u, 51751u, 51793u, 51895u, 51920u, 51935u, 53266u, 53381u, 53384u, 53541u, 53630u, 53640u, 54096u, 54110u, \r\n        54144u, 54352u, 55895u, 57346u, 57349u, 57350u, 57356u, 57362u, 57387u, 57480u, 57527u, 57632u, 57643u, 57644u, 57728u, 57733u, 57736u, \r\n        57776u, 57783u, 57791u, 57792u, 57808u, 57815u, 57831u, 57847u, 57867u, 58114u, 58119u, 58123u, 58144u, 58146u, 58149u, 58199u, 58208u, \r\n        58215u, 58223u, 58238u, 58248u, 58311u, 58327u, 58370u, 58375u, 58379u, 58389u, 58392u, 58400u, 58405u, 58406u, 58437u, 58439u, 58455u, \r\n        58464u, 58533u, 58567u, 58946u, 59404u, 59984u, 59991u, 60005u, 60007u, 60030u, 60740u, 61186u, 61327u, 62124u, 63051u, 63127u, 63134u, \r\n        63694u,\r\n        \r\n        \r\n        // L 168 (1263-1430)   +1 dummy value\r\n        39u, 47u, 158u, 294u, 357u, 359u, 368u, 373u, 382u, 414u, 439u, 453u, 455u, 1452u, 1620u, 1719u, 3074u, 3153u, 3398u, 3490u, 3536u, 3537u, \r\n        4766u, 4791u, 4799u, 4903u, 4907u, 4959u, 5378u, 5430u, 5534u, 5543u, 5600u, 5607u, 5639u, 5651u, 5776u, 5815u, 5890u, 5895u, 5899u, 5975u, \r\n        6004u, 6402u, 6407u, 6411u, 6415u, 6832u, 6839u, 6918u, 6919u, 6923u, 7040u, 7176u, 7222u, 7223u, 7280u, 7426u, 7431u, 7435u, 7447u, 7623u, \r\n        7938u, 8108u, 12327u, 12382u, 12391u, 12405u, 12583u, 12823u, 13415u, 13570u, 13575u, 13600u, 13792u, 13796u, 13826u, 13830u, 13831u, 13835u, \r\n        13911u, 13919u, 14167u, 14208u, 14279u, 14361u, 14423u, 14431u, 14645u, 15419u, 15567u, 15622u, 15623u, 15627u, 15631u, 15669u, 15687u, 15719u, \r\n        15815u, 16503u, 16734u, 16743u, 16823u, 16855u, 16863u, 16903u, 16943u, 17079u, 17087u, 17255u, 17495u, 17511u, 17519u, 17520u, 17607u, 17615u, \r\n        17623u, 17745u, 17748u, 17777u, 17831u, 17922u, 18178u, 18183u, 18303u, 18567u, 18575u, 18712u, 18759u, 18855u, 18919u, 18999u, 19031u, 19056u, \r\n        19071u, 19207u, 19458u, 19463u, 19467u, 19663u, 20248u, 33233u, 41383u, 41474u, 41479u, 41483u, 41531u, 41630u, 42247u, 42251u, 42503u, 42514u, \r\n        42654u, 42839u, 42847u, 43143u, 43175u, 43296u, 43323u, 44199u, 44294u, 44487u, 44495u, 61959u, 62009u, 63134u, 63777u, 64974u,\r\n\r\n        \r\n        // C 296 (1431-1726)   +1 dummy value\r\n        368u, 903u, 1620u, 1623u, 2180u, 2183u, 2818u, 2823u, 2827u, 2834u, 4610u, 4613u, 4615u, 4619u, 4629u, 4655u, 4678u, 4680u, 4685u, 4688u, \r\n        4695u, 4704u, 4719u, 4791u, 4807u, 4815u, 4902u, 5378u, 5471u, 5534u, 5634u, 5639u, 5643u, 5656u, 5696u, 5702u, 5716u, 5719u, 5729u, 5743u, \r\n        5749u, 5823u, 5895u, 5899u, 5911u, 5968u, 5975u, 6055u, 6273u, 6279u, 6359u, 6420u, 6483u, 6624u, 6768u, 6791u, 6917u, 6944u, 7103u, 7170u, \r\n        7175u, 7179u, 7238u, 7239u, 7428u, 7432u, 7620u, 7623u, 7631u, 8200u, 8203u, 8204u, 8221u, 8309u, 8311u, 8372u, 8384u, 8389u, 8400u, 8528u, \r\n        8544u, 8567u, 8574u, 8647u, 8663u, 8668u, 8962u, 8967u, 8971u, 9047u, 9084u, 9168u, 9180u, 9286u, 9312u, 9327u, 9335u, 9367u, 9388u, 9415u, \r\n        10757u, 10760u, 10864u, 10869u, 10878u, 10928u, 10935u, 10972u, 12229u, 12835u, 12945u, 13575u, 13579u, 13982u, 14385u, 14471u, 15106u, 16567u, \r\n        16723u, 16727u, 16757u, 16775u, 16798u, 16898u, 16903u, 16907u, 16920u, 16999u, 17002u, 17007u, 17079u, 17087u, 17095u, 17111u, 17255u, 17287u, \r\n        17419u, 17495u, 17511u, 17543u, 17566u, 17607u, 17671u, 17745u, 17927u, 17931u, 17935u, 17977u, 18078u, 18100u, 18181u, 18257u, 18263u, 18455u, \r\n        18489u, 18498u, 18502u, 18519u, 18615u, 18711u, 18753u, 18759u, 18835u, 18981u, 19038u, 19045u, 19083u, 19102u, 19136u, 19143u, 19202u, 19207u, \r\n        19211u, 19223u, 19270u, 19458u, 19463u, 19467u, 19489u, 19568u, 19714u, 19717u, 19719u, 19735u, 19769u, 19911u, 19921u, 20039u, 20226u, 20367u, \r\n        20426u, 32786u, 32789u, 32790u, 33085u, 33127u, 33143u, 33148u, 33150u, 33207u, 33223u, 33239u, 33244u, 33271u, 33735u, 33744u, 33879u, 33886u, \r\n        33888u, 33904u, 33957u, 33963u, 33975u, 33991u, 34012u, 34039u, 35335u, 35339u, 35548u, 41474u, 41479u, 41483u, 41519u, 41520u, 41521u, 41524u, \r\n        41584u, 41607u, 41615u, 41655u, 41663u, 42242u, 42288u, 42412u, 42583u, 42951u, 42959u, 42991u, 43095u, 43143u, 43201u, 44091u, 44225u, 44239u, \r\n        44342u, 57346u, 57356u, 57365u, 57372u, 57381u, 57461u, 57463u, 57637u, 57639u, 57643u, 57645u, 57647u, 57650u, 57654u, 57671u, 57687u, 57701u, \r\n        57712u, 57725u, 57799u, 57820u, 58156u, 58199u, 58208u, 58209u, 58212u, 58215u, 58240u, 58243u, 58248u, 58251u, 58288u, 58311u, 58320u, 58332u, \r\n        58400u, 58411u, 58418u, 58439u, 58480u, 58567u, 58588u, 59942u, 59944u, 59984u, 60119u, 60124u, 63033u, 63319u, 63771u, 63872u,\r\n\r\n\r\n        // U 48 (1727-1774)   +1 dummy value\r\n        8215u, 9056u, 20515u, 20516u, 21762u, 24873u, 24877u, 24879u, 24912u, 25029u, 25414u, 25424u, 25431u, 25439u, 25904u, 25912u, 26368u, 26373u, \r\n        26399u, 26677u, 26908u, 27008u, 27045u, 27394u, 27451u, 27552u, 27702u, 27909u, 27926u, 27932u, 28213u, 28220u, 28711u, 31256u, 31276u, 31279u, \r\n        32258u, 34081u, 34322u, 34327u, 35074u, 47874u, 49259u, 50949u, 52226u, 52235u, 56331u, 56415u,\r\n        \r\n        \r\n        // D 191 (1775-1965)   +1 dummy value\r\n        183u, 199u, 215u, 295u, 303u, 350u, 359u, 389u, 391u, 439u, 863u, 885u, 893u, 912u, 1282u, 1597u, 1623u, 1648u, 2079u, 2103u, 2129u, 2183u, \r\n        2328u, 2335u, 2351u, 2370u, 2383u, 2704u, 3141u, 3166u, 3381u, 3398u, 3399u, 3490u, 4610u, 4615u, 4619u, 4695u, 4711u, 4911u, 4991u, 5007u, \r\n        5378u, 5383u, 5387u, 5549u, 5776u, 5823u, 6127u, 6151u, 6287u, 6625u, 6757u, 6983u, 7103u, 7431u, 7527u, 7623u, 8210u, 8219u, 8221u, 8311u, \r\n        8502u, 8640u, 8657u, 8663u, 8695u, 8962u, 8967u, 8971u, 9096u, 9103u, 9159u, 9275u, 9288u, 9292u, 9312u, 9335u, 9352u, 9415u, 10811u, 10967u, \r\n        12034u, 12059u, 12175u, 12375u, 12382u, 12405u, 12503u, 12591u, 12679u, 12802u, 12887u, 12895u, 13488u, 13652u, 13663u, 13726u, 13826u, 13831u, \r\n        13835u, 13842u, 13911u, 14228u, 14231u, 14319u, 14471u, 14479u, 14516u, 14594u, 14599u, 14603u, 14607u, 14661u, 14673u, 14682u, 14757u, 15173u, \r\n        15175u, 15221u, 15295u, 15476u, 15567u, 15618u, 15623u, 15759u, 16423u, 16478u, 16501u, 17111u, 17295u, 17447u, 17623u, 17666u, 17671u, 17675u, \r\n        17759u, 17920u, 17986u, 18017u, 18085u, 18178u, 18183u, 18187u, 18439u, 18443u, 18498u, 18519u, 18567u, 18575u, 18576u, 19056u, 19271u, 19458u, \r\n        19463u, 19467u, 19471u, 19719u, 19723u, 20230u, 41047u, 41095u, 41351u, 41589u, 42196u, 42398u, 42503u, 42596u, 42640u, 42839u, 42847u, 43120u, \r\n        43143u, 43151u, 43271u, 43285u, 43288u, 43351u, 43503u, 43783u, 43967u, 44034u, 44039u, 44043u, 44160u, 44487u, 44495u, 44511u, 61479u, 61879u, \r\n        62983u,\r\n\r\n        \r\n        // P 277 (1966-2242)   +1 dummy value\r\n        39u, 103u, 135u, 199u, 295u, 296u, 343u, 351u, 368u, 391u, 400u, 414u, 568u, 670u, 698u, 727u, 1127u, 1135u, 1282u, 1304u, 1315u, 1333u, 1375u, \r\n        1543u, 1560u, 1591u, 1647u, 1680u, 1719u, 1863u, 1876u, 1879u, 2135u, 2326u, 2840u, 3279u, 4118u, 4610u, 4614u, 4615u, 4619u, 4631u, 4655u, \r\n        4695u, 4703u, 4720u, 4766u, 4791u, 4903u, 4965u, 4967u, 4999u, 5378u, 5382u, 5383u, 5428u, 5471u, 5503u, 5534u, 5607u, 5639u, 5640u, 5643u, \r\n        5689u, 5719u, 5727u, 5759u, 5809u, 5968u, 5969u, 5975u, 5983u, 6000u, 6113u, 6146u, 6151u, 6155u, 6271u, 6279u, 6287u, 6359u, 6367u, 6402u, \r\n        6407u, 6411u, 6487u, 6768u, 6944u, 7103u, 7170u, 7191u, 7192u, 7375u, 7617u, 7936u, 7938u, 7947u, 8198u, 8309u, 8311u, 8391u, 8439u, 8528u, \r\n        8535u, 8663u, 8695u, 8962u, 8967u, 8971u, 9026u, 9061u, 9072u, 9085u, 9104u, 9136u, 9168u, 9169u, 9172u, 9175u, 9180u, 9229u, 9312u, 9328u, \r\n        9343u, 9387u, 9399u, 9415u, 9428u, 9431u, 10833u, 10848u, 10928u, 12034u, 12327u, 12369u, 12383u, 12432u, 12644u, 13415u, 13479u, 13591u, \r\n        13638u, 13726u, 13799u, 13807u, 13831u, 13835u, 13839u, 13908u, 13911u, 13982u, 13996u, 14292u, 14343u, 14347u, 14362u, 14405u, 14471u, 14615u, \r\n        14661u, 15362u, 15365u, 15367u, 15371u, 15815u, 16471u, 16511u, 16599u, 16798u, 16903u, 16907u, 16983u, 16996u, 17054u, 17253u, 17264u, 17423u, \r\n        17543u, 17566u, 17607u, 17639u, 17759u, 17927u, 18103u, 18178u, 18181u, 18183u, 18187u, 18229u, 18256u, 18263u, 18288u, 18434u, 18439u, 18443u, \r\n        18450u, 18484u, 18487u, 18503u, 18567u, 18575u, 18684u, 18983u, 19031u, 19051u, 19102u, 19249u, 19463u, 19663u, 19911u, 28843u, 29069u, 29719u, \r\n        30581u, 32670u, 32789u, 32791u, 32795u, 32822u, 32865u, 33077u, 33078u, 33083u, 33104u, 33111u, 33120u, 33125u, 33127u, 33149u, 33150u, 33168u, \r\n        33265u, 33271u, 33543u, 33547u, 33879u, 33975u, 33991u, 34039u, 35454u, 35536u, 35543u, 35548u, 35551u, 36610u, 41472u, 41474u, 41511u, 41567u, \r\n        41584u, 41607u, 42327u, 42335u, 42583u, 42607u, 42654u, 42879u, 42991u, 43120u, 43143u, 43207u, 43215u, 44048u, 44055u, 44056u, 44088u, 44239u, \r\n        44311u, 44487u, 57712u, 58136u, 58452u, 58464u, 58479u, 61313u, 61959u, 63558u,\r\n\r\n        \r\n        // M 226 (2243-2468)   +1 dummy value\r\n        87u, 343u, 351u, 357u, 359u, 367u, 391u, 399u, 439u, 559u, 565u, 624u, 671u, 1282u, 1287u, 1291u, 1304u, 1312u, 1316u, 1703u, 1719u, 1815u, \r\n        1862u, 1888u, 1919u, 2048u, 2118u, 2135u, 2231u, 2449u, 2477u, 2840u, 2865u, 2873u, 3335u, 3399u, 4615u, 4655u, 4657u, 4695u, 4734u, 4743u, \r\n        4766u, 4967u, 4999u, 5047u, 5079u, 5378u, 5383u, 5387u, 5391u, 5456u, 5534u, 5607u, 5639u, 5643u, 5681u, 5689u, 5698u, 5713u, 5729u, 5744u, \r\n        5775u, 5890u, 5958u, 5975u, 6000u, 6127u, 6151u, 6231u, 6239u, 6279u, 6402u, 6407u, 6411u, 6436u, 6628u, 6791u, 6941u, 7055u, 7296u, 7447u, \r\n        7633u, 7647u, 7841u, 8002u, 8053u, 8631u, 12391u, 12807u, 12811u, 12894u, 13570u, 13575u, 13600u, 13655u, 13826u, 13831u, 13835u, 13847u, \r\n        13879u, 13885u, 13890u, 13911u, 13968u, 13991u, 14007u, 14082u, 14167u, 14175u, 14207u, 14338u, 14343u, 14471u, 14494u, 14615u, 14628u, \r\n        15159u, 15221u, 15295u, 15618u, 15620u, 15623u, 15627u, 15673u, 15743u, 16727u, 16743u, 16903u, 16904u, 16920u, 16927u, 16966u, 16983u, \r\n        16999u, 17102u, 17184u, 17269u, 17419u, 17447u, 17495u, 17511u, 17519u, 17520u, 17537u, 17566u, 17591u, 17599u, 17669u, 17671u, 17672u, \r\n        17730u, 17748u, 17895u, 17903u, 17935u, 17947u, 17977u, 18000u, 18014u, 18100u, 18191u, 18263u, 18303u, 18439u, 18450u, 18455u, 18456u, \r\n        18516u, 18519u, 18567u, 18575u, 18615u, 18623u, 18913u, 18982u, 19038u, 19045u, 19051u, 19056u, 19071u, 19077u, 19083u, 19207u, 19208u, \r\n        19213u, 19224u, 19367u, 19458u, 19463u, 19467u, 19921u, 19935u, 19976u, 41496u, 42087u, 42242u, 42247u, 42251u, 42327u, 42654u, 42754u, \r\n        42759u, 42763u, 42809u, 42823u, 42833u, 42839u, 42847u, 42879u, 42991u, 43015u, 43023u, 43143u, 43157u, 43166u, 43431u, 43492u, 43967u, \r\n        44487u, 44511u, 61998u, 62951u, 62999u, 63006u, 63506u,\r\n\r\n        \r\n        // H 161 (2469-2629)   +1 dummy value\r\n        43u, 135u, 183u, 293u, 295u, 299u, 343u, 350u, 391u, 439u, 447u, 455u, 519u, 525u, 582u, 583u, 695u, 807u, 885u, 1583u, 1633u, 1680u, 2180u, \r\n        2183u, 2247u, 2263u, 3527u, 3535u, 4615u, 4621u, 4655u, 4695u, 4734u, 4781u, 4799u, 4807u, 4815u, 4823u, 4903u, 4911u, 4999u, 5378u, 5383u, \r\n        5387u, 5534u, 5815u, 5823u, 5968u, 5983u, 6087u, 6146u, 6151u, 6155u, 6215u, 6231u, 6276u, 6279u, 6353u, 6736u, 6757u, 6791u, 6919u, 7029u, \r\n        7089u, 7311u, 7375u, 7431u, 7647u, 7938u, 7947u, 7951u, 12802u, 12807u, 12811u, 13726u, 13911u, 14007u, 14354u, 14423u, 14471u, 14479u, 14509u, \r\n        15106u, 15111u, 15556u, 15567u, 16423u, 16679u, 16683u, 16687u, 16999u, 17007u, 17008u, 17023u, 17072u, 17269u, 17423u, 17495u, 17566u, 17591u, \r\n        17607u, 17672u, 17807u, 17922u, 17927u, 17931u, 17935u, 17986u, 18183u, 18187u, 18263u, 18434u, 18439u, 18443u, 18447u, 18502u, 18575u, 18615u, \r\n        18855u, 18979u, 18983u, 19051u, 19056u, 19227u, 19458u, 19463u, 19467u, 19663u, 19714u, 19719u, 19723u, 19727u, 19783u, 19920u, 41519u, 41559u, \r\n        41607u, 41615u, 42398u, 42583u, 42654u, 42879u, 43031u, 43140u, 43143u, 44310u, 44347u, 44354u, 44455u, 44487u, 44494u, 44495u, 61537u, 64289u, \r\n        64292u, 64514u, 64519u, 64523u, 64583u, 64774u, 64871u,\r\n\r\n        \r\n        // Y 26 (2630-2655)   +1 dummy value\r\n        294u, 295u, 373u, 1617u, 1799u, 2177u, 2183u, 2247u, 2462u, 4711u, 4791u, 6629u, 7748u, 12427u, 15367u, 16903u, 18982u, 18983u, 19038u, 19056u, \r\n        19208u, 20295u, 41559u, 43015u, 43409u, 44511u,\r\n\r\n\r\n    };\r\n#endif // _DICTIONARY_H\r\n"
  },
  {
    "path": "src/games/verbix/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \n// \n// CROSS SHOOT by Fabrizio Caruso\n//\n// Fabrizio_Caruso@hotmail.com\n//\n// This software is provided 'as-is', without any express or implied warranty.\n// In no event will the authors be held liable for any damages arising from\n// the use of this software.\n\n// Permission is granted to anyone to use this software for non-commercial applications, \n// subject to the following restrictions:\n\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software in\n// a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n\n// 2. Altered source versions must be plainly marked as such, and must not\n// be misrepresented as being the original software.\n\n// 3. This notice may not be removed or altered from any source distribution.\n/* --------------------------------------------------------------------------------------- */ \n\n#include \"cross_lib.h\"\n\n#define WORD_SIZE 5\n\n\n#if YSize<12\n    #define MAX_HEIGHT (YSize-2)\n#else\n    #define MAX_HEIGHT ((YSize/2)-1)\n#endif\n\n#define START_X ((XSize)/2-4)\n#define START_Y ((YSize)-3)\n\n#define MIN_PLAYER_X 0\n#define MAX_PLAYER_X (1+WORD_SIZE)\n\n#define PLAYER_Y (START_Y+2)\n\n#define END_Y (START_Y+10)\n\n#define VERTICAL_PLAYER_TILE         _TILE_0\n#define EMPTY_SLOT_TILE              _TILE_1\n#define HORIZONTAL_LEFT_PLAYER_TILE  _TILE_2\n#define LEFT_ARROW_TILE              _TILE_3 \n#define RIGHT_ARROW_TILE             _TILE_4\n#define UP_ARROW_TILE                _TILE_5\n#define HI_TILE                      _TILE_6\n#define DOWN_ARROW_TILE              _TILE_7\n#define HORIZONTAL_RIGHT_PLAYER_TILE _TILE_8\n#define LV_TILE                      _TILE_9\n#define LEFT_LHS_TILE                _TILE_10\n#define HORIZONTAL_BAR_TILE          _TILE_11\n#define VERTICAL_WALL_TILE           _TILE_12\n#define HORIZONTAL_WALL_TILE         _TILE_13\n#define SCORE_LHS_TILE               _TILE_14\n#define VERTICAL_BAR_TILE            _TILE_15\n#define SCORE_RHS_TILE               _TILE_16\n#define LEFT_RHS_TILE                _TILE_17\n#define BORDER_TILE1                 _TILE_18\n#define CROSS_TILE                   _TILE_19\n#define RING_TILE                    _TILE_20\n#define BONUS_LINE_TILE              _TILE_21\n#define VERTICAL_BONUS_WALL_TILE     _TILE_22\n#define HORIZONTAL_BONUS_WALL_TILE   _TILE_23\n#define BORDER_TILE2                 _TILE_24\n#define BORDER_TILE0                 _TILE_25\n#define BORDER_TILE3                 _TILE_26\n\n\n#define PLAYER_COLOR _XL_WHITE\n#define EMPTY_SLOT_COLOR _XL_WHITE\n#define WALL_COLOR _XL_RED\n\n#if YSize<12\n    #define INITIAL_ROWS 1\n#elif YSize<=18\n    #define INITIAL_ROWS 2\n#else\n    #define INITIAL_ROWS 3\n#endif\n\n\n#if YSize<20\n    #define SMALL_SCREEN_REDUCTION 1\n#else\n    #define SMALL_SCREEN_REDUCTION 0\n#endif\n\n#define MIN_INITIAL_DROP ((((WORD_SIZE)*INITIAL_ROWS))+SMALL_SCREEN_REDUCTION)\n\n#if !defined(NO_OF_PRECOMPUTED_WORDS)\n    #define NO_OF_PRECOMPUTED_WORDS 8U\n#endif\n\n#define SIZE_OF_PRECOMPUTED_WORDS ((NO_OF_PRECOMPUTED_WORDS)*(WORD_SIZE))\n\n#if !defined(NO_OF_RANDOM_LETTERS)\n    #define NO_OF_RANDOM_LETTERS ((NO_OF_PRECOMPUTED_WORDS/2))\n#endif\n//SIZE_OF_PRECOMPUTED_WORDS\n\n#define NO_OF_PRECOMPUTED_LETTERS ((SIZE_OF_PRECOMPUTED_WORDS)+(NO_OF_RANDOM_LETTERS))\n\n\n#define LEVEL_X ((XSize)-2)\n#define LEVEL_Y 0U\n\n    #define REMAINING_WORD_Y 0U\n\n#if XSize>=17\n    #define REMAINING_WORD_X ((LEVEL_X)-4)\n#else\n    #define REMAINING_WORD_X ((LEVEL_X)-3)\n#endif\n\n#if XSize<17\n    #define HI_X 6\n#elif XSize<22\n    #define HI_X (REMAINING_WORD_X-6)\n#else\n    #define HI_X (((REMAINING_WORD_X)/2))\n#endif\n\n#define HI_Y 0U\n\n#define SLOT_X_SPACING 2U\n\n#if YSize>=12\n    #define SLOT_Y_SPACING 2U\n#else\n    #define SLOT_Y_SPACING 1U\n#endif\n\n#define BONUS_HEIGHT 2U\n\n// TODO: Maybe this should depend on the parity of XSize\n#define SCORE_X 1U\n\n#define BONUS_POINTS 100U\n\n// remaining = 9 -> max_level_count = INITIAL_MAX_LEVEL_COUNT/level + (remaining x 8)\n// level 1 with 3 remaining words: (240-72)/1 + (3x8) = 168 + 27 = 195\n// level 1 with 1 remaining word : (240-72)/1 + (1x8) = 168 +  9 = 177\n//\n// level 2 with 4 remaining words: (240-72)/2 + (4x8) =  84 + 32 = 116\n// level 2 with 1 remaining word : (240-72)/2 + (1x8) =  84 +  9 =  93\n//\n// level 3 with 9 remaining words: (240-72)/3 + (5x8) =  56 + 40 = 106\n// level 3 with 1 remaining word : (240-72)/3 + (1x8) =  56 +  9 =  65\n// .....\n// level 9 with 9 remaining words: (240-72)/9 + (9x8) =  18 + 72 =  90\n// level 9 with 1 remaining word : (240-72)/9 + (1x8) =  18 +  9 =  27\n#define INITIAL_MAX_LEVEL_COUNT (240U-72U)\n\n#define INITIAL_LEVEL 1U\n#define LAST_LEVEL 9U\n\n#include \"dictionary.h\"\n\nuint8_t player_x;\nuint8_t alive;\nuint8_t slot_index;\nuint8_t matrix[WORD_SIZE][MAX_HEIGHT];\nuint8_t matrix_height[WORD_SIZE];\nuint8_t counter;\nuint8_t first_index;\nuint8_t last_index;\nuint16_t points;\nuint16_t record;\nuint8_t level;\nuint8_t remaining_words;\nuint8_t max_level_counter;\nuint8_t low_letter_bonus;\nuint8_t player_display_refresh;\n\n\nuint8_t precomputed_letter[NO_OF_PRECOMPUTED_LETTERS];\nuint8_t next_letter_index;\n\nuint8_t aux; // Used to swap values in several functions\n\n// First letter position indices\nextern const uint16_t dictionary_index[ALPHABET_SIZE+1];\n\n\nconst uint8_t border_tile[4] = {BORDER_TILE0, BORDER_TILE1, BORDER_TILE2, BORDER_TILE3};\n\n// 16 most common letters in English 5-letter words\n// E A R I O T N S L C U D P M H Y\nconst char *letter = \"EARIOTNSLCUDPMHY\";\n\nconst uint8_t LETTER_COLOR[ALPHABET_SIZE/4] = {_XL_WHITE, _XL_YELLOW, _XL_CYAN, _XL_GREEN };\n\n\n// TODO: Better compute LETTERS_X\n// #if XSize>=40\n    // #define LETTERS_X 2\n// #else\n    // #define LETTERS_X 2  \n// #endif\n#if XSize>17\n    #define LETTERS_X XSize/2-7\n#else\n    #define LETTERS_X 0\n#endif\n\n\n#if YSize<=18\n    #define LETTERS_Y 1\n#else\n    #define LETTERS_Y 3\n#endif\n\n#if XSize>40\n    #define LETTERS_BIT_MASK 7\n#elif XSize>=24\n    #define LETTERS_BIT_MASK 3\n#else\n    #define LETTERS_BIT_MASK 1\n#endif\n\n\n#define player_slot() \\\n    player_x-1\n\nvoid short_pause(void)\n{\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\n}\n\n\nvoid tiny_pause(void)\n{\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR/8);\n}\n\n\nvoid one_second_pause(void)\n{\n    _XL_SLEEP(1);\n}\n\n\n#if XSize>17 && YSize>16\n    #define DISPLAY_LETTERS_X 2\n\n    void display_letters(void)\n    {\n        uint8_t i;\n        // aux: offset\n        \n        _XL_SET_TEXT_COLOR(_XL_YELLOW);\n        for(i=0;i<ALPHABET_SIZE;++i)\n        {\n            aux = DISPLAY_LETTERS_X+(i&LETTERS_BIT_MASK);\n            _XL_CHAR(aux,i+LETTERS_Y,letter[i]);\n            _XL_CHAR(XSize-aux,i+LETTERS_Y,letter[i]); \n        }\n    }\n\n#else\n    \n    #define display_letters()\n#endif\n\nuint8_t x_slot(uint8_t x)\n{\n    return START_X+SLOT_X_SPACING*x;\n}\n\n#if YSize>=12\n    #define LOWER_SPACING 0\n#else\n    #define LOWER_SPACING 1\n#endif\n\n//  \nuint8_t y_slot(uint8_t y)\n{\n    return START_Y-SLOT_Y_SPACING*y+LOWER_SPACING;\n}\n\n\nvoid draw_letter(uint8_t x, uint8_t y)\n{\n    uint8_t letter_index = matrix[x][y];\n    \n    _XL_SET_TEXT_COLOR(LETTER_COLOR[letter_index>>2]);\n    _XL_CHAR(x_slot(x),y_slot(y),letter[letter_index]);\n}\n\n\n// TODO: Maybe this could be optimized\n#define draw_cross(x) \\\ndo \\\n{ \\\n    _XL_DRAW(x_slot(x),START_Y+LOWER_SPACING,CROSS_TILE,_XL_RED); \\\n} while(0)\n\n\n// TODO: Maybe this could be optimized\nvoid draw_crosses(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<WORD_SIZE;++i)\n    {\n        draw_cross(i);\n    }\n}\n\n\n#define draw_empty_slot(x,y) \\\ndo \\\n{ \\\n    _XL_DRAW(x_slot(x),y_slot(y),EMPTY_SLOT_TILE,EMPTY_SLOT_COLOR); \\\n} while(0)\n\n\nvoid display_rings(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<WORD_SIZE;++i)\n    {\n        _XL_DRAW(x_slot(i),START_Y+LOWER_SPACING,RING_TILE,_XL_WHITE);\n        short_pause();\n        _XL_PING_SOUND();\n    }\n}\n\n\n\nvoid display_bottom_row(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<WORD_SIZE;++i)\n    {\n        draw_letter(i,0);\n    }\n    player_display_refresh = 1;\n}\n\n\nvoid display_column(uint8_t row)\n{\n    uint8_t i;\n    \n    for(i=0;i<matrix_height[row];++i)\n    {\n        draw_letter(row,i);\n    }  \n    for(;i<MAX_HEIGHT-1;++i)\n    {\n        draw_empty_slot(row,i);\n    }\n}\n\n\nvoid display_player_column(void)\n{\n    display_column(player_slot());\n}\n\n\nvoid display_matrix(void)\n{\n    uint8_t i;\n    \n    for(i=0;i<WORD_SIZE;i++)\n    {\n        display_column(i);\n    }\n}\n\n\nvoid display_remaining_words(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(REMAINING_WORD_X+2,REMAINING_WORD_Y,1,remaining_words);\n}\n\n\n\nvoid drop_letter(void)\n{\n    uint8_t height;\n    uint8_t new_letter;\n    \n    _XL_PING_SOUND();\n\n    max_level_counter = ((INITIAL_MAX_LEVEL_COUNT)/level+(remaining_words>>3));\n    \n    height = matrix_height[slot_index];\n    \n    if(next_letter_index<NO_OF_PRECOMPUTED_LETTERS)\n    {\n        new_letter = precomputed_letter[next_letter_index];\n        ++next_letter_index;\n    }\n    else\n    {\n        new_letter = (uint8_t) _XL_RAND()%ALPHABET_SIZE;\n    }\n\n    matrix[slot_index][height]= new_letter;\n    draw_letter(slot_index,height);\n    if(height==MAX_HEIGHT-1)\n    {\n        alive = 0;\n    }\n    \n    ++matrix_height[slot_index];\n                \n    slot_index = (slot_index + 1U) % WORD_SIZE;\n}\n\n\nuint8_t player_slot_x(void)\n{\n    return START_X-SLOT_X_SPACING+SLOT_X_SPACING*player_x;\n}\n\n\n// Player display routines\nvoid delete_player(void)\n{\n    if(player_x==MIN_PLAYER_X)\n    {\n        _XL_DELETE(START_X-SLOT_X_SPACING+MIN_PLAYER_X, START_Y+LOWER_SPACING);\n    }\n    else if(player_x==MAX_PLAYER_X)\n    {\n        _XL_DELETE(START_X-SLOT_X_SPACING+SLOT_X_SPACING*MAX_PLAYER_X, START_Y+LOWER_SPACING);\n    }\n    else\n    {\n        _XL_DELETE(player_slot_x(), PLAYER_Y);\n    }\n}\n\n\nvoid display_vertical_player(uint8_t player_tile)\n{\n    player_display_refresh = 1;\n    _XL_DRAW(player_slot_x(), PLAYER_Y, player_tile, PLAYER_COLOR);\n\n}\n\n\nvoid display_horizontal_left_player(uint8_t player_tile)\n{\n    _XL_DRAW(START_X-SLOT_X_SPACING+MIN_PLAYER_X, START_Y+LOWER_SPACING, player_tile, PLAYER_COLOR);\n}\n\n\nvoid display_horizontal_right_player(uint8_t player_tile)\n{\n    _XL_DRAW(START_X-SLOT_X_SPACING+SLOT_X_SPACING*MAX_PLAYER_X, START_Y+LOWER_SPACING, player_tile, PLAYER_COLOR); \n}\n\n\nvoid display_player(void)\n{\n    // short_pause();\n    if(player_x==MIN_PLAYER_X)\n    {\n        display_horizontal_left_player(HORIZONTAL_LEFT_PLAYER_TILE);\n    }\n    else if(player_x==MAX_PLAYER_X)\n    {\n        display_horizontal_right_player(HORIZONTAL_RIGHT_PLAYER_TILE);\n    }\n    else\n    {\n        display_vertical_player(VERTICAL_PLAYER_TILE);\n    }   \n    player_display_refresh = 0;    \n}\n    \n//\n\nvoid right_rotate_row(void)\n{\n    //uint8_t old_first;\n    // aux: old_first\n    uint8_t i;\n    \n    \n    _XL_TICK_SOUND();\n\n\t++counter;\n\t\n    aux = matrix[0][0];\n    \n    for(i=0;i<WORD_SIZE-1;++i)\n    {\n        matrix[i][0] = matrix[i+1][0];\n    }\n  \n    matrix[WORD_SIZE-1][0] = aux;\n    \n}\n\n\nvoid left_rotate_row(void)\n{\n    // uint8_t old_last;\n    // aux: old_last\n    uint8_t i;\n    \n    _XL_TICK_SOUND();\n    \n\t++counter;\n\t\n    aux = matrix[WORD_SIZE-1][0];\n    \n    for(i=WORD_SIZE-1;i>0;--i)\n    {\n        matrix[i][0] = matrix[i-1][0];\n    }\n  \n    matrix[0][0] = aux;\n}\n\n\nvoid up_rotate_column(void)\n{\n    // uint8_t old_top;\n    // aux: old_top\n    uint8_t i;\n    \n    _XL_TICK_SOUND();    \n    \n\tcounter+=4;\t\n\t\n    aux = matrix[player_slot()][matrix_height[player_slot()]-1];\n    \n    for(i=matrix_height[player_slot()]-1;i>0;--i)\n    {\n        matrix[player_slot()][i] = matrix[player_slot()][i-1];\n    }\n  \n    matrix[player_slot()][0] = aux;    \n}\n\n\nvoid down_rotate_column(void)\n{\n    // uint8_t old_bottom;\n    // aux: old_bottom\n    uint8_t i;\n\n    _XL_TICK_SOUND();\n\t\n\tcounter+=4;\n    \n    aux = matrix[player_slot()][0];\n    \n    for(i=0;i<matrix_height[player_slot()]-1;++i)\n    {\n        matrix[player_slot()][i] = matrix[player_slot()][i+1];\n    }\n  \n    matrix[player_slot()][matrix_height[player_slot()]-1] = aux;\n    \n}\n\n\n// 'E', 'A', 'R', 'I', \n// 'O', 'T', 'N', 'S' ,\n// 'L', 'C', 'U', 'D', \n// 'P', 'M', 'H', 'Y'\n\n\nuint8_t letter_index(uint8_t letter_to_check)\n{\n    uint8_t i = 0;\n    \n    while(1) // We exit this loop with return\n    {\n        if(letter_to_check==letter[i])\n        {\n            return i;\n        }\n    }\n    return 0U; // Never reached\n}\n\n\n// Score for guessed word (less common letters give more points)\n// 'E', 'A', 'R', 'I',  ->   3 point\n// 'O', 'T', 'N', 'S' , ->   7 points\n// 'L', 'C', 'U', 'D',  ->  11 points\n// 'P', 'M', 'H', 'Y'   ->  15 points\nuint8_t word_score(void)\n{\n    uint8_t score = 0;\n    uint8_t i;\n    \n    for(i=0;i<WORD_SIZE;++i)\n    {       \n        score+=3+(((matrix[i][0])>>2)<<1);\n\n    }\n    \n    return score;\n}\n\n\nuint8_t first_letter(uint16_t index)\n{\n    uint8_t i=0;\n    \n    while(1) // We know that we will exit with return\n    {\n        if(index<dictionary_index[i+1])\n        {\n            return i;\n        }\n        ++i;\n    }\n    return 0; // Impossible case\n}\n\n\n// It compresses the last 4 letters of the bottom matrix in 4-bit per letter format\nuint16_t compress_bottom_word(void)\n{    \n    return (uint16_t)matrix[4][0]+(((uint16_t)matrix[3][0])<<4)+(((uint16_t)matrix[2][0])<<8)+(((uint16_t)matrix[1][0])<<12);\n}\n\n\n// Indices are unsigned and the minimum input for last_index is 1\n// If last_index becomes 0, then first_index>last_index and it returns 0\nuint8_t binary_search(uint16_t search_word, uint16_t first_index, uint16_t last_index)\n{\n    uint16_t middle_index;\n    uint16_t middle_word;\n    \n    while(last_index>=first_index)\n    {    \n        middle_index = (first_index+last_index)/2;\n        \n        middle_word = dictionary[middle_index];\n        \n        if(dictionary[middle_index]==search_word)\n        {\n            return 1;\n        }\n        else if(middle_word<search_word)\n        {\n            first_index = middle_index + 1U;\n        }\n        else\n        {\n            last_index = middle_index - 1U;\n        }\n    }\n\n    return 0;\n}\n\n\nuint8_t word_in_dictionary(void)\n{\n    // uint8_t first_char_index = matrix[0][0];    \n    // return binary_search(compress_bottom_word(),dictionary_index[first_char_index], dictionary_index[first_char_index+1]-1);\n    return binary_search(compress_bottom_word(),dictionary_index[matrix[0][0]], dictionary_index[matrix[0][0]+1]-1U);\n}\n\n#if XSize>17\n    #define SCORE_X_OFFSET 2\n#else\n    #define SCORE_X_OFFSET 0\n#endif\n\nvoid display_score(void)\n{\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \n    _XL_PRINTD(SCORE_X+SCORE_X_OFFSET,0,4,points);\n}\n\n\nvoid increase_score(uint8_t value)\n{\n    _XL_ZAP_SOUND();\n    points+=value;\n    display_score();\n}\n\n\nvoid remove_bottom_word(void)\n{\n    uint8_t i;\n    uint8_t j;\n    // uint8_t height  ;\n    \n    low_letter_bonus = remaining_words;\n    for(i=0;i<WORD_SIZE;++i)\n    {\n        // height = matrix_height[i];\n        for(j=0;j<matrix_height[i]-1;++j)\n        {\n            matrix[i][j]=matrix[i][j+1];\n        }\n        \n        // _XL_PRINTD(0,YSize-3,1,i);\n\n        \n        // _XL_PRINTD(0,YSize-1,2,matrix_height[i]);\n        // _XL_WAIT_FOR_INPUT();\n        \n        --matrix_height[i]; \n        \n        // One single letter above BONUS_HEIGHT prevents disables the bonus\n        if(matrix_height[i]>BONUS_HEIGHT) \n        {\n            low_letter_bonus = 0;\n        }\n        // _XL_PRINTD(XSize-3,YSize-1,2,matrix_height[i]);\n        // _XL_WAIT_FOR_INPUT();\n    }\n    display_matrix();\n}\n\n\nvoid handle_input(void)\n{\n    uint8_t input;\n    \n    input = _XL_INPUT();\n        \n    if(_XL_LEFT(input))\n    {\n        if(player_x > MIN_PLAYER_X)\n        {\n            delete_player();\n            --player_x;\n            display_player();\n            tiny_pause();\n        }\n        else\n        {\n            display_horizontal_left_player(LEFT_ARROW_TILE);\n\n            right_rotate_row();\n            display_bottom_row();\n        }\n    }\n    else if(_XL_RIGHT(input))\n    {\n        if((player_x < MAX_PLAYER_X))\n        {\n            delete_player();\n            ++player_x;\n            display_player();\n            tiny_pause();\n        }\n        else\n        {\n            display_horizontal_right_player(RIGHT_ARROW_TILE);\n    \n            left_rotate_row();\n            display_bottom_row();\n        }\n    }\n\n    else if(_XL_UP(input) && player_x>MIN_PLAYER_X && player_x<MAX_PLAYER_X)\n    {\n        display_vertical_player(UP_ARROW_TILE);\n\n        up_rotate_column();\n        display_player_column();\n    }\n    else if(_XL_DOWN(input) && player_x>MIN_PLAYER_X && player_x<MAX_PLAYER_X)\n    {\n        display_vertical_player(DOWN_ARROW_TILE);\n\n        down_rotate_column();   \n        display_player_column();\n    }\n    else if(_XL_FIRE(input))\n    {\n        if(word_in_dictionary())\n        {\n            // _XL_ZAP_SOUND();\n            display_rings();\n            \n            increase_score(word_score());\n\n            --remaining_words;\n            remove_bottom_word();\n            display_remaining_words();\n            max_level_counter = INITIAL_MAX_LEVEL_COUNT; // slow down next drop\n            counter = 0;                                 // re-start counter to slow down next drop\n        }\n        else\n        {\n            draw_crosses();\n            _XL_PING_SOUND();\n            short_pause();\n            display_bottom_row();\n            \n            drop_letter();\n        }\n    }\n    else if(player_display_refresh)\n    {\n        display_player();\n    }\n    short_pause();\n}\n\n\n#if defined(_XL_ARROW_KEYS)\n    #define control_instructions() \\\n    do \\\n    { \\\n        _XL_PRINT(XSize/2-6+2, YSize/2+6, \"USE ARROWS\"); \\\n    } while(0)\n#elif defined(_XL_NO_JOYSTICK)\n    #define control_instructions() \\\n    do \\\n    { \\\n        _XL_PRINT(XSize/2-6, YSize/2+6, \"USE \" _XL_UP_KEY _XL_LEFT_KEY _XL_DOWN_KEY _XL_RIGHT_KEY \" SPACE\"); \\\n    } while(0)\n#else\n    #define control_instructions() \\\n    do \\\n    { \\\n        _XL_PRINT(XSize/2-5, YSize/2+6, \"USE JOYSTICK\"); \\\n    } while(0)\n#endif\n\n\n#if defined(NO_RANDOMIZE)\n#define wait_for_input() \\\ndo \\\n{ \\\n    _XL_WAIT_FOR_INPUT(); \\\n} while(0)\n#else\n#define wait_for_input() \\\ndo \\\n{ \\\n    while(!_XL_KEY_PRESSED()) \\\n    { \\\n        points=_XL_RAND(); \\\n    } \\\n} while(0)\n#endif\n\n\n#if !defined(NO_DISPLAY_BORDERS)\nvoid display_borders(uint8_t offset, uint8_t tile)\n{\n    uint8_t i;\n    \n    for(i=2;i<YSize-1;++i)\n    {\n        _XL_DRAW(1+offset,i,tile, _XL_CYAN);\n        _XL_DRAW(XSize-1-offset,i,tile, _XL_CYAN);  \n    }        \n}\n#else\n    #define display_borders(offset,tile)\n#endif\n#if XSize<=20\n    #define BORDER_OFFSET 0\n#elif XSize<=22\n    #define BORDER_OFFSET 0\n#elif XSize<=32\n    #define BORDER_OFFSET 3\n#elif XSize<=40\n    #define BORDER_OFFSET 5\n#else\n    #define BORDER_OFFSET ((XSize)/10)\n#endif\n\n\n#if XSize>17\n    #define title_borders() display_borders(BORDER_OFFSET, BORDER_TILE1)\n#else\n    #define title_borders()\n#endif\n\n\n#define title_screen() \\\ndo \\\n{ \\\n    _XL_CLEAR_SCREEN(); \\\n    \\\n    display_record((XSize/2)-2); \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\n    \\\n    _XL_PRINT(XSize/2-5,YSize/2-7,\"V E R B I X\"); \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    _XL_PRINT(XSize/2-7,YSize/2-5,\"FABRIZIO CARUSO\"); \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_RED); \\\n    _XL_PRINT(XSize/2-7,YSize/2-1, \"FIND WORDS WITH\"); \\\n    _XL_SET_TEXT_COLOR(_XL_CYAN); \\\n    _XL_PRINT(LETTERS_X,YSize/2+2,letter); \\\n    \\\n    title_borders(); \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    control_instructions(); \\\n    wait_for_input(); \\\n    _XL_CLEAR_SCREEN(); \\\n    display_letter_values(); \\\n} while(0)\n\n\n#define initialize_input_output() \\\ndo \\\n{ \\\n    _XL_INIT_GRAPHICS(); \\\n    \\\n    _XL_INIT_INPUT(); \\\n    \\\n    _XL_INIT_SOUND(); \\\n} while(0)\n\n\n#define initialize_game() \\\ndo \\\n{ \\\n    points = 0; \\\n    level = INITIAL_LEVEL; \\\n    alive = 1; \\\n} while(0)\n\n\n#define display_level() \\\ndo \\\n{ \\\n    _XL_DRAW(LEVEL_X,LEVEL_Y,LV_TILE,_XL_CYAN); \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    _XL_PRINTD(LEVEL_X+1,LEVEL_Y,1,level); \\\n} while(0)\n\n\n// #if defined(DEBUG)\n// void print_word(uint8_t x, uint8_t y, uint16_t dictionary_index)\n// {\n    // uint8_t i;\n    \n    // _XL_CHAR(x,y,letter[first_letter(dictionary_index)]);\n    // for(i=1;i<WORD_SIZE;++i)\n    // {\n        // _XL_CHAR(x+i,y,letter[(dictionary[dictionary_index]>>((4-i)*4))&0x000F]);\n    // }\n// }\n// #endif\n\n\n// TODO: check whether XOR trick is better\nvoid swap(uint8_t i, uint8_t j)\n{\n    // aux: swap variable\n    \n    aux = precomputed_letter[i];\n    precomputed_letter[i] = precomputed_letter[j];\n    precomputed_letter[j] = aux;\n}\n\n\n// Shuffle with Fisher-Yates algorithm\nvoid shuffle(void)\n{\n    uint8_t i;\n    \n    for(i=NO_OF_PRECOMPUTED_LETTERS-1;i>0;--i)\n    {\n        swap(i,(uint8_t) (_XL_RAND())%i);\n    }\n}\n\n\nvoid display_record(uint8_t x)\n{\n    _XL_DRAW(x,HI_Y,HI_TILE, _XL_RED);\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    _XL_PRINTD(x+1,HI_Y,4,record);\n}\n\n\n// Score for guessed word (less common letters give more points)\n// 'E', 'A', 'R', 'I',  ->  1 point\n// 'O', 'T', 'N', 'S' , ->  4 points\n// 'L', 'C', 'U', 'D',  ->  7 points\n// 'P', 'M', 'H', 'Y'   -> 10 points\n\n\n#define INSTRUCTIONS_START_Y ((YSize)/2-3)\n\n#define INSTRUCTIONS_START_X ((XSize)/2-3)\n\n\n#if XSize>17\n    #define letter_values_borders() display_borders(BORDER_OFFSET+4,BORDER_TILE3);\n#else\n    #define letter_values_borders() display_borders(2,BORDER_TILE3);\n#endif\n\n#if defined(NO_LETTER_VALUES)\n    #define display_letter_values()\n#else\nvoid display_letter_values(void)\n{\n    \n    letter_values_borders();\n    \n    _XL_SET_TEXT_COLOR(_XL_WHITE);\n    \n    _XL_PRINTD(INSTRUCTIONS_START_X+6,INSTRUCTIONS_START_Y,  1, 3U);\n    _XL_PRINTD(INSTRUCTIONS_START_X+6,INSTRUCTIONS_START_Y+2,1, 7U);\n    _XL_PRINTD(INSTRUCTIONS_START_X+5,INSTRUCTIONS_START_Y+4,2,11U);\n    _XL_PRINTD(INSTRUCTIONS_START_X+5,INSTRUCTIONS_START_Y+6,2,15U);\n    \n    \n    _XL_PRINT(INSTRUCTIONS_START_X,INSTRUCTIONS_START_Y,   \"EARI\");\n    \n    _XL_SET_TEXT_COLOR(_XL_YELLOW);\n    _XL_PRINT(INSTRUCTIONS_START_X,INSTRUCTIONS_START_Y+2, \"OTNS\");\n    \n    _XL_SET_TEXT_COLOR(_XL_CYAN);\n        \n    _XL_PRINT(INSTRUCTIONS_START_X,INSTRUCTIONS_START_Y+4, \"LCUD\");\n\n    _XL_SET_TEXT_COLOR(_XL_GREEN);\n    _XL_PRINT(INSTRUCTIONS_START_X,INSTRUCTIONS_START_Y+6, \"PMHY\");        \n    \n    _XL_PRINT(INSTRUCTIONS_START_X, INSTRUCTIONS_START_Y-2, \"POINTS\");\n    \n    _XL_WAIT_FOR_INPUT();\n    _XL_CLEAR_SCREEN();    \n}\n#endif\n\n\n#if XSize>17\n    #define display_score_text() \\\n    do \\\n    { \\\n        _XL_DRAW(SCORE_X,0,SCORE_LHS_TILE,_XL_GREEN); \\\n        _XL_DRAW(SCORE_X+1,0,SCORE_RHS_TILE,_XL_GREEN); \\\n    } while(0)\n#else\n    #define display_score_text()\n#endif\n\n#define display_score_glyphs() \\\ndo \\\n{ \\\n    display_score_text(); \\\n    _XL_DRAW(REMAINING_WORD_X,REMAINING_WORD_Y,LEFT_LHS_TILE,_XL_YELLOW); \\\n    _XL_DRAW(REMAINING_WORD_X+1,REMAINING_WORD_Y,LEFT_RHS_TILE,_XL_YELLOW); \\\n} while(0)\n\n\n#if XSize>40\n    #define BONUS_LINE_SIZE 6\n#elif XSize>=40\n    #define BONUS_LINE_SIZE 5\n#elif XSize>=32\n    #define BONUS_LINE_SIZE 4\n#elif XSize>20\n    #define BONUS_LINE_SIZE 3\n#elif XSize>17\n    #define BONUS_LINE_SIZE 2\n#else\n    #define BONUS_LINE_SIZE 1 \n#endif\n\n\nvoid display_walls(void)\n{\n    uint8_t i;\n    #if YSize>=12\n    uint8_t j;\n\n    uint8_t horizontal_wall_tile;\n    #endif\n    uint8_t vertical_wall_tile;\n\t\n\t#if !defined(_XL_NO_COLOR)\n    uint8_t wall_color;\n\t#endif\n    \n    #if YSize>=12\n        #define HEIGHT_FACTOR 2\n    #else\n        #define HEIGHT_FACTOR 1\n    #endif\n    \n    for(i=0;i<MAX_HEIGHT*HEIGHT_FACTOR;++i)\n    {\n        \n        if(i>4)\n        {\n            #if YSize>=12\n            horizontal_wall_tile = HORIZONTAL_WALL_TILE;\n            #endif\n            vertical_wall_tile = VERTICAL_WALL_TILE;\n\t\t\t#if !defined(_XL_NO_COLOR)\n            wall_color = _XL_GREEN;\n\t\t\t#endif\n        }\n        else if(i>2)\n        {\n            #if YSize>=12\n            horizontal_wall_tile = HORIZONTAL_BONUS_WALL_TILE;\n            #endif\n            vertical_wall_tile = VERTICAL_BONUS_WALL_TILE;\n\t\t\t#if !defined(_XL_NO_COLOR)\n            wall_color = _XL_YELLOW;\n\t\t\t#endif\n        }\n        else\n        {\n            #if YSize>=12\n            horizontal_wall_tile = HORIZONTAL_BAR_TILE;\n            #endif\n            vertical_wall_tile = VERTICAL_BAR_TILE;\n\t\t\t#if !defined(_XL_NO_COLOR)\n            wall_color = _XL_RED;  \n\t\t\t#endif\n        }\n        _XL_DRAW(START_X-1,START_Y-i+1,vertical_wall_tile, wall_color);\n        _XL_DRAW(START_X-1+WORD_SIZE*2,START_Y-i+1,vertical_wall_tile, wall_color);\n             \n        \n        #if YSize>=12\n        for(j=0;j<WORD_SIZE*2-1;++j)\n        {\n            if(!(i&1))\n            {\n                _XL_DRAW(START_X+j,START_Y-i+1,horizontal_wall_tile, wall_color);\n            }\n        }\n        \n        if(i&1)\n        {\n            for(j=0;j<WORD_SIZE*2-2;j+=2)\n            {  \n                _XL_DRAW(START_X+j+1,START_Y-i+1,vertical_wall_tile, wall_color);\n            }\n        }\n        #endif\n    }\n    \n    // Draw bonus limit\n    for(i=0;i<BONUS_LINE_SIZE;++i)\n    {\n        _XL_DRAW(START_X-2-i,START_Y-SLOT_Y_SPACING*BONUS_HEIGHT+1,BONUS_LINE_TILE,_XL_WHITE);\n        _XL_DRAW(START_X-1+WORD_SIZE*2+1+i,START_Y-SLOT_Y_SPACING*BONUS_HEIGHT+1,BONUS_LINE_TILE,_XL_WHITE);\n    }\n}\n\n\n// TODO: nearly all display elements do not need to be redisplayed\nvoid initialize_level(void)\n{\n    uint8_t i;\n    uint8_t j;\n    \n    uint16_t random_dictionary_index;\n    uint16_t compressed_code;\n    \n    alive = 1U;\n    slot_index = 0U;\n    player_x = 3U;\n    counter = 1U;\n    next_letter_index = 0U;\n    \n    if(level<=6)\n    {\n        remaining_words = 2+level;\n    }\n    else\n    {\n        remaining_words = 9;\n    }\n    // remaining_words = level;\n    low_letter_bonus = 0;\n    \n    _XL_CLEAR_SCREEN();\n    \n    display_player();\n    \n    for(i=0;i<WORD_SIZE;++i)\n    {\n        matrix_height[i]=0;\n    }\n\n    for(i=0;i<NO_OF_PRECOMPUTED_WORDS;++i)\n    {\n        random_dictionary_index = _XL_RAND()%DICTIONARY_SIZE;\n        \n        compressed_code = dictionary[random_dictionary_index];\n        \n        precomputed_letter[WORD_SIZE*i] = first_letter(random_dictionary_index);\n        for(j=1;j<WORD_SIZE;++j)\n        {\n            // Extract the nibble from compressed_code corresponding to the letters starting from second (j=1) till fifth position (j=4)\n            precomputed_letter[WORD_SIZE*i+j]=(uint8_t) ((compressed_code>>((4U-j)*4U))&0x000F);\n        }\n    }\n\n    for(i=SIZE_OF_PRECOMPUTED_WORDS;i<NO_OF_PRECOMPUTED_LETTERS;++i)\n    {\n        // No need to apply cast to the full operation as ALPHABET_SIZE is 16, which is a divisor of 256\n        precomputed_letter[i]=(uint8_t) _XL_RAND()%ALPHABET_SIZE; \n    }\n\n    // Fisher-Yates shuffle on precomputed words\n    shuffle();\n\n    display_level();\n    \n    display_score();\n\n    display_borders(0,border_tile[level&3]);\n\n    display_walls();\n\n    display_letters();\n\n    display_matrix();\n        \n    display_score_glyphs();        \n        \n    display_record(HI_X);\n    \n    display_remaining_words();\n}\n\n\nvoid restart_game(void)\n{\n    title_screen();\n    \n    initialize_game();    \n}\n\n\n// TODO: Verify offset\n#if defined(NO_LEVEL_END)\n    #define level_end() \n#else\n\n    void level_end(void)\n    {\n        for(aux=1;aux<XSize/2;++aux)\n        {\n            display_borders(aux, BORDER_TILE3);\n            short_pause();\n        }\n    }\n#endif\n\n\n#define end_game() \\\ndo \\\n{ \\\n    _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n    _XL_PRINT(START_X, START_Y+2, \"GAME OVER\"); \\\n    one_second_pause(); \\\n    _XL_WAIT_FOR_INPUT(); \\\n    level_end(); \\\n} while(0)\n\n\n// #define MAX_LEVEL_COUNT_INCREASE 10\n\n#define handle_drop() \\\ndo \\\n{ \\\n    if(counter>=max_level_counter) \\\n    { \\\n        drop_letter(); \\\n        counter=0; \\\n    } \\\n} while(0)\n\n\n#define handle_record_update() \\\ndo \\\n{ \\\n    if(points>record) \\\n    { \\\n        record = points; \\\n    } \\\n} while(0)\n\n\n// CC65 produces broken code with an infinite loop if we use (level>>SMALL_SCREEN_REDUCTION) \n#define initial_letter_drop() \\\ndo \\\n{ \\\n    uint8_t i; \\\n    \\\n    for(i=0;i<(uint8_t) MIN_INITIAL_DROP + (level/(1+SMALL_SCREEN_REDUCTION));++i) \\\n    { \\\n        drop_letter(); \\\n        short_pause(); \\\n    } \\\n} while(0)\n\n\n\n#define handle_level_end() \\\ndo \\\n{ \\\n    \\\n    if(alive) \\\n    { \\\n        if(low_letter_bonus) \\\n        { \\\n            _XL_EXPLOSION_SOUND(); \\\n            _XL_SET_TEXT_COLOR(_XL_WHITE); \\\n            _XL_PRINT(START_X-1, START_Y+2, \"EXTRA BONUS\"); \\\n            one_second_pause(); \\\n            _XL_WAIT_FOR_INPUT(); \\\n        } \\\n        \\\n        for(aux=0;aux<low_letter_bonus;++aux) \\\n        { \\\n            --remaining_words; \\\n            display_remaining_words(); \\\n            increase_score(BONUS_POINTS); \\\n            _XL_PING_SOUND(); \\\n            short_pause(); \\\n            short_pause(); \\\n        } \\\n        ++level; \\\n        _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\n        _XL_PRINT(START_X-1, START_Y+2, \" LEVEL  UP \"); \\\n        one_second_pause(); \\\n        _XL_WAIT_FOR_INPUT(); \\\n        level_end(); \\\n    } \\\n} while(0)\n\n\n// TODO: Use _XL_DRAW\n// TODO: Implement some animation\n#define victory_message() \\\ndo \\\n{ \\\n    \\\n    _XL_SET_TEXT_COLOR(_XL_YELLOW); \\\n    _XL_PRINT(START_X,YSize/2,\" THE END \"); \\\n    one_second_pause(); \\\n    _XL_WAIT_FOR_INPUT(); \\\n    level_end(); \\\n} while(0)\n\n\n//\nint main(void)\n{        \n    initialize_input_output();\n    \n    // record is already set to zero because it is a global variable\n    \n    // main loop\n    while(1)\n    {\n        restart_game();\n\n        // game main loop\n        while((level<LAST_LEVEL+1) && alive)\n        {\n            initialize_level();\n\n            initial_letter_drop();\n\n            // level main loop\n            while(alive && remaining_words && !low_letter_bonus)\n            {    \n\t\t\t\t// _XL_PRINTD(0,YSize-1,4,counter);\n\t\t\t\t\n                handle_drop();\n                \n                handle_input();\n                                \n                ++counter;                \n            }\n            handle_level_end();\n        }\n        if(alive) // game completed alive\n        {\n            victory_message();\n        }\n        end_game();\n        handle_record_update();\n    }\n\n    return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/games/verbix/makefiles/Makefile.override",
    "content": "\r\n#######################################\r\n\r\nmc10:\r\n\tcc68 -tmc10  $(CC6303_MC10_OPTS) $(INCLUDE_OPTS) $(GLOBAL_OPTS) \\\r\n\t-D__MC10__ \\\r\n\t-D__REVERSE_LETTERS \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 -D_XL_NO_JOYSTICK \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D_XL_NO_COLOR -D__TARGET_SPECIFIC_ASCII \\\r\n\t-D__ALT_SLEEP -D__ALT_RAND \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MC10_SLOWDOWN) \\\r\n\t-D__DEFAULT_CLEAR_SCREEN -D__ALT_PRINT  \\\r\n\t$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/rand/rand.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o xchase\r\n\trm xchase\r\n\tmv xchase.c10 $(BUILD_PATH)/X$(GAME_NAME)_$@.c10\r\n\r\n\r\nc16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t c16  \\\r\n\t--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30_less_hd_stack.cfg \\\r\n\t-D__NO_SCREEN_COLOR_INIT  \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ASSEMBLY_CLEAR_SCREEN \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \\\r\n\t-D__UDG_BASE_FACTOR=15 \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape0.txt",
    "content": "#.##.#\r\n.####.\r\n..##..\r\n..##..\r\n..##..\r\n..##..\r\n..##..\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape1.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n......\r\n.#.#.#\r\n......\r\n.#.#.#\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape10.txt",
    "content": "......\r\n#..###\r\n#..#..\r\n#..#..\r\n#..##.\r\n#..#..\r\n##.###\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape11.txt",
    "content": "......\r\n######\r\n######\r\n.###.#\r\n##.###\r\n######\r\n######\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape12.txt",
    "content": "#.#.#.\r\n#####.\r\n#.#.#.\r\n#####.\r\n#.#.#.\r\n#####.\r\n#.#.#.\r\n#####.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape13.txt",
    "content": "......\r\n######\r\n.#.#.#\r\n######\r\n######\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape14.txt",
    "content": "......\r\n##..##\r\n#.#..#\r\n##...#\r\n#....#\r\n#....#\r\n#....#\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape15.txt",
    "content": "#####.\r\n##.##.\r\n#####.\r\n###.#.\r\n#####.\r\n##.##.\r\n#####.\r\n###.#.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape16.txt",
    "content": "......\r\n#.###.\r\n..#...\r\n...#..\r\n....#.\r\n....#.\r\n..###.\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape17.txt",
    "content": "......\r\n##.###\r\n#...#.\r\n##..#.\r\n#...#.\r\n#...#.\r\n#...#.\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape18.txt",
    "content": ".####.\r\n#.###.\r\n##.##.\r\n##..#.\r\n###.#.\r\n#####.\r\n##.##.\r\n#.###.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape19.txt",
    "content": "......\r\n#....#\r\n.#..#.\r\n..##..\r\n..##..\r\n.#..#.\r\n#....#\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape2.txt",
    "content": "......\r\n.....#\r\n....#.\r\n######\r\n######\r\n....#.\r\n.....#\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape20.txt",
    "content": ".####.\r\n######\r\n##..##\r\n#....#\r\n#....#\r\n##..##\r\n######\r\n.####.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape21.txt",
    "content": "#.#.#.\r\n.#.#.#\r\n......\r\n......\r\n......\r\n......\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape22.txt",
    "content": "#.#.#.\r\n#####.\r\n#...#.\r\n#####.\r\n#.#.#.\r\n#####.\r\n#...#.\r\n#####.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape23.txt",
    "content": "......\r\n######\r\n.#.#.#\r\n.###.#\r\n##.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape24.txt",
    "content": "##.##.\r\n#..##.\r\n.####.\r\n#..##.\r\n##.##.\r\n###.#.\r\n##.##.\r\n##.##.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape25.txt",
    "content": "##.##.\r\n...##.\r\n.####.\r\n...##.\r\n##..#.\r\n###.#.\r\n##..#.\r\n##.##.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape26.txt",
    "content": "##.##.\r\n#.###.\r\n##.##.\r\n###.#.\r\n##.##.\r\n#.###.\r\n##.##.\r\n###.#.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape3.txt",
    "content": "......\r\n..#...\r\n.#....\r\n######\r\n######\r\n.#....\r\n..#...\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape4.txt",
    "content": "......\r\n...#..\r\n....#.\r\n######\r\n######\r\n....#.\r\n...#..\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape5.txt",
    "content": "..##..\r\n.####.\r\n#.##.#\r\n..##..\r\n..##..\r\n..##..\r\n..##..\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape6.txt",
    "content": "......\r\n#.#.#.\r\n#.#.#.\r\n###.#.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape7.txt",
    "content": "..##..\r\n..##..\r\n..##..\r\n..##..\r\n#.##.#\r\n.####.\r\n..##..\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape8.txt",
    "content": "......\r\n#.....\r\n.#....\r\n######\r\n######\r\n.#....\r\n#.....\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x8/shape9.txt",
    "content": "......\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n##.#..\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape0.txt",
    "content": "#.##.#\r\n.####.\r\n..##..\r\n..##..\r\n..##..\r\n..##..\r\n..##..\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n......\r\n.#.#.#\r\n......\r\n.#.#.#\r\n......\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape10.txt",
    "content": "......\r\n#..###\r\n#..#..\r\n#..#..\r\n#..##.\r\n#..#..\r\n##.###\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape11.txt",
    "content": "......\r\n######\r\n######\r\n.###.#\r\n##.###\r\n######\r\n######\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape12.txt",
    "content": "#.#.#.\r\n#####.\r\n#.#.#.\r\n#####.\r\n#.#.#.\r\n#####.\r\n#.#.#.\r\n#####.\r\n#####."
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape13.txt",
    "content": "......\r\n######\r\n.#.#.#\r\n######\r\n######\r\n.#.#.#\r\n######\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape14.txt",
    "content": "......\r\n##..##\r\n#.#..#\r\n##...#\r\n#....#\r\n#....#\r\n#....#\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape15.txt",
    "content": "#####.\r\n##.##.\r\n#####.\r\n###.#.\r\n#####.\r\n##.##.\r\n#####.\r\n###.#.\r\n#.###."
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape16.txt",
    "content": "......\r\n#.###.\r\n..#...\r\n...#..\r\n....#.\r\n....#.\r\n..###.\r\n......\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape17.txt",
    "content": "......\r\n##.###\r\n#...#.\r\n##..#.\r\n#...#.\r\n#...#.\r\n#...#.\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape18.txt",
    "content": ".####.\r\n#.###.\r\n##.##.\r\n###.#.\r\n###.#.\r\n#####.\r\n##.##.\r\n#.###.\r\n#.###.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape19.txt",
    "content": "......\r\n#....#\r\n.#..#.\r\n..##..\r\n..##..\r\n.#..#.\r\n#....#\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape2.txt",
    "content": "......\r\n.....#\r\n....#.\r\n######\r\n######\r\n....#.\r\n.....#\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape20.txt",
    "content": ".####.\r\n######\r\n##..##\r\n#....#\r\n#....#\r\n##..##\r\n######\r\n.####.\r\n......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape21.txt",
    "content": "#.#.#.\r\n.#.#.#\r\n......\r\n......\r\n......\r\n......\r\n......\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape22.txt",
    "content": "#.#.#.\r\n#####.\r\n#...#.\r\n#####.\r\n#.#.#.\r\n#.#.#.\r\n#####.\r\n#...#.\r\n#####.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape23.txt",
    "content": "......\r\n######\r\n.#.#.#\r\n.###.#\r\n##.###\r\n.#.#.#\r\n######\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape24.txt",
    "content": "##.##.\r\n#..##.\r\n.####.\r\n#..##.\r\n##..#.\r\n#..##.\r\n###.#.\r\n##.##.\r\n##.##.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape25.txt",
    "content": "##.##.\r\n...##.\r\n.####.\r\n...##.\r\n##.##.\r\n##..#.\r\n###.#.\r\n##..#.\r\n##.##.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape26.txt",
    "content": "##.##.\r\n#.###.\r\n##.##.\r\n###.#.\r\n###.#.\r\n##.##.\r\n#.###.\r\n##.##.\r\n###.#.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape3.txt",
    "content": "......\r\n..#...\r\n.#....\r\n######\r\n######\r\n.#....\r\n..#...\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape4.txt",
    "content": "......\r\n...#..\r\n....#.\r\n######\r\n######\r\n....#.\r\n...#..\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape5.txt",
    "content": "..##..\r\n.####.\r\n#.##.#\r\n..##..\r\n..##..\r\n..##..\r\n..##..\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape6.txt",
    "content": "......\r\n#.#.#.\r\n#.#.#.\r\n###.#.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape7.txt",
    "content": "..##..\r\n..##..\r\n..##..\r\n..##..\r\n#.##.#\r\n.####.\r\n..##..\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape8.txt",
    "content": "......\r\n#.....\r\n.#....\r\n######\r\n######\r\n.#....\r\n#.....\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/6x9/shape9.txt",
    "content": "......\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n##.#..\r\n......\r\n......"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape0.txt",
    "content": "#..#..#\r\n.#.#.#.\r\n..###..\r\n...#...\r\n...#...\r\n...#...\r\n...#...\r\n...#..."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape1.txt",
    "content": ".......\r\n.......\r\n.#.#.#.\r\n.......\r\n.#.#.#.\r\n.......\r\n.#.#.#.\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape10.txt",
    "content": ".......\r\n#..###.\r\n#..#...\r\n#..#...\r\n#..##..\r\n#..#...\r\n##.###.\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape11.txt",
    "content": ".......\r\n#######\r\n#######\r\n#.##.##\r\n##.##.#\r\n#######\r\n#######\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape12.txt",
    "content": ".#.#.#.\r\n.#####.\r\n.#.#.#.\r\n.#####.\r\n.#.#.#.\r\n.#####.\r\n.#.#.#.\r\n.#####.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape13.txt",
    "content": ".......\r\n#######\r\n#.##.#.\r\n#######\r\n#######\r\n#.##.#.\r\n#######\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape14.txt",
    "content": ".......\r\n##..###\r\n#.#...#\r\n##....#\r\n#.....#\r\n#.....#\r\n#.....#\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape15.txt",
    "content": ".######\r\n.##.###\r\n.######\r\n.###.##\r\n.######\r\n.##.###\r\n.######\r\n.###.##\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape16.txt",
    "content": ".......\r\n##.###.\r\n...#...\r\n....#..\r\n.....#.\r\n.....#.\r\n...###.\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape17.txt",
    "content": ".......\r\n###.###\r\n#....#.\r\n##...#.\r\n#....#.\r\n#....#.\r\n#....#.\r\n......."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape18.txt",
    "content": "#.#####\r\n##.####\r\n###.###\r\n####.##\r\n#####.#\r\n####.##\r\n###.###\r\n##.####\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape19.txt",
    "content": "#.....#\r\n.#...#.\r\n..#.#..\r\n...#...\r\n...#...\r\n..#.#..\r\n.#...#.\r\n#.....#"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape2.txt",
    "content": "......#\r\n.....#.\r\n....#..\r\n#######\r\n....#..\r\n.....#.\r\n......#\r\n......."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape20.txt",
    "content": "..###..\r\n.#####.\r\n###.###\r\n##...##\r\n##...##\r\n###.###\r\n.#####.\r\n..###..\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape21.txt",
    "content": "#.##.#.\r\n.#.##.#\r\n.......\r\n.......\r\n.......\r\n.......\r\n.......\r\n......."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape22.txt",
    "content": ".#..#.#\r\n.######\r\n.#.#..#\r\n.######\r\n.#..#.#\r\n.######\r\n.#.#..#\r\n.######\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape23.txt",
    "content": ".......\r\n#######\r\n#.#.#.#\r\n#.###.#\r\n###.###\r\n#.#.#.#\r\n#######\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape24.txt",
    "content": "###.###\r\n##..###\r\n#.#####\r\n##..###\r\n###..##\r\n#####.#\r\n###..##\r\n###.###\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape25.txt",
    "content": "###.###\r\n#...###\r\n#.#####\r\n#...###\r\n###...#\r\n#####.#\r\n###...#\r\n###.###\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape26.txt",
    "content": "###.###\r\n##.####\r\n###.###\r\n####.##\r\n###.###\r\n##.####\r\n###.###\r\n####.##\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape3.txt",
    "content": "...#...\r\n..#....\r\n.##....\r\n#######\r\n.##....\r\n..#....\r\n...#...\r\n......."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape4.txt",
    "content": "...#...\r\n....#..\r\n....##.\r\n#######\r\n....##.\r\n....#..\r\n...#...\r\n......."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape5.txt",
    "content": "...#...\r\n..###..\r\n.#####.\r\n#..#..#\r\n...#...\r\n...#...\r\n...#...\r\n...#..."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#.#.#.\r\n.#.#.#.\r\n.#.#.#.\r\n.###.#.\r\n.#.#.#.\r\n.#.#.#.\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape7.txt",
    "content": "...#...\r\n...#...\r\n...#...\r\n...#...\r\n#..#..#\r\n.#####.\r\n..###..\r\n...#..."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape8.txt",
    "content": "#......\r\n.#.....\r\n..#....\r\n#######\r\n..#....\r\n.#.....\r\n#......\r\n......."
  },
  {
    "path": "src/games/verbix/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#.#.#.\r\n.#.#.#.\r\n.#.#.#.\r\n.#.#.#.\r\n.#.#.#.\r\n.##.#..\r\n.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape0.txt",
    "content": "#..##..#\r\n.#.##.#.\r\n..####..\r\n...##...\r\n...##...\r\n...##...\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape1.txt",
    "content": "........\r\n..#.#.#.\r\n........\r\n..#.#.#.\r\n........\r\n..#.#.#."
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape10.txt",
    "content": "#...###.\r\n#...#...\r\n#...##..\r\n#...#...\r\n###.###.\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape11.txt",
    "content": "........\r\n########\r\n#.###.##\r\n###.###.\r\n########\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape12.txt",
    "content": ".#.##.#.\r\n.######.\r\n.#.##.#.\r\n.######.\r\n.#.##.#.\r\n.######."
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape13.txt",
    "content": "########\r\n#.#.#.#.\r\n########\r\n#.#.#.#.\r\n########\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape14.txt",
    "content": "##.##.##\r\n#..#..#.\r\n##.#..#.\r\n.#.#..#.\r\n##.##.##\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape15.txt",
    "content": ".######.\r\n.##.###.\r\n.###.##.\r\n.######.\r\n.##.###.\r\n.###.##."
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape16.txt",
    "content": "#.##..##\r\n#.#.#.#.\r\n#.##..##\r\n#.#.#.#.\r\n#.#.#.##\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape17.txt",
    "content": "###.###.\r\n#....#..\r\n##...#..\r\n#....#..\r\n#....#..\r\n........"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape18.txt",
    "content": "##.#####\r\n###.####\r\n####.###\r\n#####.##\r\n####.###\r\n###.####\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape19.txt",
    "content": ".#....#.\r\n..#..#..\r\n...##...\r\n...##...\r\n..#..#..\r\n.#....#.\r\n\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape2.txt",
    "content": "......#.\r\n.....#..\r\n########\r\n########\r\n.....#..\r\n......#.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape20.txt",
    "content": "..####..\r\n.##..##.\r\n##....##\r\n##....##\r\n.##..##.\r\n..####..\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape21.txt",
    "content": "#.#.#.#.\r\n.#.#.#.#\r\n........\r\n........\r\n........\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape22.txt",
    "content": ".#..#.#.\r\n.######.\r\n.#.#..#.\r\n.######.\r\n.#..#.#.\r\n.######.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape23.txt",
    "content": "########\r\n#.#.#.#.\r\n###.###.\r\n#.#.#.#.\r\n########\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape24.txt",
    "content": "###.###.\r\n##..###.\r\n#.##.##.\r\n##.##.#.\r\n###..##.\r\n###.###."
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape25.txt",
    "content": "###.###.\r\n#...###.\r\n#.##.##.\r\n##.##.#.\r\n###...#.\r\n###.###."
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape26.txt",
    "content": "###.###.\r\n##.####.\r\n###.###.\r\n##.####.\r\n###.###.\r\n####.##."
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape3.txt",
    "content": "\r\n...#....\r\n.##.....\r\n########\r\n########\r\n.##.....\r\n...#....\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape4.txt",
    "content": "\r\n....#...\r\n.....##.\r\n########\r\n########\r\n.....##.\r\n....#...\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape5.txt",
    "content": "...##...\r\n..####..\r\n.######.\r\n#..##..#\r\n...##...\r\n...##...\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape6.txt",
    "content": "..#.#.#.\r\n..#.#.#.\r\n..###.#.\r\n..#.#.#.\r\n..#.#.#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape7.txt",
    "content": "...##...\r\n...##...\r\n#..##..#\r\n.######.\r\n..####..\r\n...##...\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape8.txt",
    "content": "#.......\r\n.#......\r\n########\r\n########\r\n.#......\r\n#.......\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x6/shape9.txt",
    "content": ".#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.###.#..\r\n........\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape0.txt",
    "content": "#..##..#\r\n.#.##.#.\r\n..####..\r\n...##...\r\n...##...\r\n...##...\r\n...##...\r\n...##..."
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape1.txt",
    "content": "........\r\n........\r\n..#.#.#.\r\n........\r\n..#.#.#.\r\n........\r\n..#.#.#.\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape10.txt",
    "content": "........\r\n#...###.\r\n#...#...\r\n#...#...\r\n#...##..\r\n#...#...\r\n###.###.\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape11.txt",
    "content": "........\r\n########\r\n########\r\n#.###.##\r\n###.###.\r\n########\r\n########\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape12.txt",
    "content": ".#.##.#.\r\n.######.\r\n.#.##.#.\r\n.######.\r\n.#.##.#.\r\n.######.\r\n.#.##.#.\r\n.######.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape13.txt",
    "content": "........\r\n########\r\n#.#.#.#.\r\n########\r\n########\r\n#.#.#.#.\r\n########\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape14.txt",
    "content": "##.##.##\r\n#..#..#.\r\n#..#..#.\r\n##.#..#.\r\n.#.#..#.\r\n.#.#..#.\r\n##.##.##\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape15.txt",
    "content": ".######.\r\n.##.###.\r\n.######.\r\n.###.##.\r\n.######.\r\n.##.###.\r\n.######.\r\n.###.##.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape16.txt",
    "content": "#.##..##\r\n#.#.#.#.\r\n#.#.#.#.\r\n#.##..##\r\n#.#.#.#.\r\n#.#.#.#.\r\n#.#.#.##\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape17.txt",
    "content": "........\r\n###.###.\r\n#....#..\r\n##...#..\r\n#....#..\r\n#....#..\r\n#....#..\r\n........"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape18.txt",
    "content": "#.#####.\r\n##.####.\r\n###.###.\r\n####.##.\r\n#####.#.\r\n####.##.\r\n###.###.\r\n##.####.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape19.txt",
    "content": "#......#\r\n.#....#.\r\n..#..#..\r\n...##...\r\n...##...\r\n..#..#..\r\n.#....#.\r\n#......#"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape2.txt",
    "content": ".......#\r\n......#.\r\n.....#..\r\n########\r\n########\r\n.....#..\r\n......#.\r\n.......#"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape20.txt",
    "content": "..####..\r\n.######.\r\n###..###\r\n##....##\r\n##....##\r\n###..###\r\n.######.\r\n..####..\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape21.txt",
    "content": "#.#.#.#.\r\n.#.#.#.#\r\n........\r\n........\r\n........\r\n........\r\n........\r\n........"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape22.txt",
    "content": ".#..#.#.\r\n.######.\r\n.#.#..#.\r\n.######.\r\n.#..#.#.\r\n.######.\r\n.#.#..#.\r\n.######.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape23.txt",
    "content": "........\r\n########\r\n#.#.#.#.\r\n#.###.##\r\n###.###.\r\n#.#.#.#.\r\n########\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape24.txt",
    "content": "###.###.\r\n##..###.\r\n#.#####.\r\n##..###.\r\n###..##.\r\n#####.#.\r\n###..##.\r\n###.###.\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape25.txt",
    "content": "###.###.\r\n#...###.\r\n#.#####.\r\n#...###.\r\n###...#.\r\n#####.#.\r\n###...#.\r\n###.###.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape26.txt",
    "content": "###.###.\r\n##.####.\r\n###.###.\r\n####.##.\r\n###.###.\r\n##.####.\r\n###.###.\r\n####.##.\r\n\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape3.txt",
    "content": "...#....\r\n..#.....\r\n.##.....\r\n########\r\n########\r\n.##.....\r\n..#.....\r\n...#...."
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape4.txt",
    "content": "....#...\r\n.....#..\r\n.....##.\r\n########\r\n########\r\n.....##.\r\n.....#..\r\n....#..."
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape5.txt",
    "content": "...##...\r\n..####..\r\n.######.\r\n#..##..#\r\n...##...\r\n...##...\r\n...##...\r\n...##..."
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape6.txt",
    "content": ".#.#.#..\r\n.#.#.#..\r\n.#.#.#..\r\n.###.#..\r\n.#.#.#..\r\n.#.#.#..\r\n.#.#.#..\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape7.txt",
    "content": "...##...\r\n...##...\r\n...##...\r\n...##...\r\n#..##..#\r\n.######.\r\n..####..\r\n...##..."
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape8.txt",
    "content": "#.......\r\n.#......\r\n..#.....\r\n########\r\n########\r\n..#.....\r\n.#......\r\n#......."
  },
  {
    "path": "src/games/verbix/shapes/8x8/shape9.txt",
    "content": ".#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.#..#.#.\r\n.##..#..\r\n........\r\n"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile0.txt",
    "content": "45,30,12,12,12,12,12,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile1.txt",
    "content": "0,0,21,0,21,0,21,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile10.txt",
    "content": "0,39,36,36,38,36,55,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile11.txt",
    "content": "0,63,63,29,55,63,63,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile12.txt",
    "content": "42,62,42,62,42,62,42,62"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile13.txt",
    "content": "0,63,21,63,63,21,63,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile14.txt",
    "content": "0,51,41,49,33,33,33,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile15.txt",
    "content": "62,54,62,58,62,54,62,58"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile16.txt",
    "content": "0,46,8,4,2,2,14,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile17.txt",
    "content": "0,55,34,50,34,34,34,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile18.txt",
    "content": "30,46,54,50,58,62,54,46"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile19.txt",
    "content": "0,33,18,12,12,18,33,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile2.txt",
    "content": "0,1,2,63,63,2,1,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile20.txt",
    "content": "30,63,51,33,33,51,63,30"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile21.txt",
    "content": "42,21,0,0,0,0,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile22.txt",
    "content": "42,62,34,62,42,62,34,62"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile23.txt",
    "content": "0,63,21,29,55,21,63,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile24.txt",
    "content": "54,38,30,38,54,58,54,54"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile25.txt",
    "content": "54,6,30,6,50,58,50,54"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile26.txt",
    "content": "54,46,54,58,54,46,54,58"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile3.txt",
    "content": "0,8,16,63,63,16,8,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile4.txt",
    "content": "0,4,2,63,63,2,4,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile5.txt",
    "content": "12,30,45,12,12,12,12,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile6.txt",
    "content": "0,42,42,58,42,42,42,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile7.txt",
    "content": "12,12,12,12,45,30,12,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile8.txt",
    "content": "0,32,16,63,63,16,32,0"
  },
  {
    "path": "src/games/verbix/tiles/6x8/tile9.txt",
    "content": "0,42,42,42,42,42,52,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile0.txt",
    "content": "45,30,12,12,12,12,12,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile1.txt",
    "content": "0,0,21,0,21,0,21,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile10.txt",
    "content": "0,39,36,36,38,36,55,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile11.txt",
    "content": "0,63,63,29,55,63,63,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile12.txt",
    "content": "42,62,42,62,42,62,42,62,62"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile13.txt",
    "content": "0,63,21,63,63,21,63,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile14.txt",
    "content": "0,51,41,49,33,33,33,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile15.txt",
    "content": "62,54,62,58,62,54,62,58,46"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile16.txt",
    "content": "0,46,8,4,2,2,14,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile17.txt",
    "content": "0,55,34,50,34,34,34,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile18.txt",
    "content": "30,46,54,58,58,62,54,46,46"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile19.txt",
    "content": "0,33,18,12,12,18,33,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile2.txt",
    "content": "0,1,2,63,63,2,1,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile20.txt",
    "content": "30,63,51,33,33,51,63,30,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile21.txt",
    "content": "42,21,0,0,0,0,0,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile22.txt",
    "content": "42,62,34,62,42,42,62,34,62"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile23.txt",
    "content": "0,63,21,29,55,21,63,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile24.txt",
    "content": "54,38,30,38,50,38,58,54,54"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile25.txt",
    "content": "54,6,30,6,54,50,58,50,54"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile26.txt",
    "content": "54,46,54,58,58,54,46,54,58"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile3.txt",
    "content": "0,8,16,63,63,16,8,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile4.txt",
    "content": "0,4,2,63,63,2,4,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile5.txt",
    "content": "12,30,45,12,12,12,12,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile6.txt",
    "content": "0,42,42,58,42,42,42,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile7.txt",
    "content": "12,12,12,12,45,30,12,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile8.txt",
    "content": "0,32,16,63,63,16,32,0,0"
  },
  {
    "path": "src/games/verbix/tiles/6x9/tile9.txt",
    "content": "0,42,42,42,42,42,52,0,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile0.txt",
    "content": "73,42,28,8,8,8,8,8"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile1.txt",
    "content": "0,0,42,0,42,0,42,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile10.txt",
    "content": "0,78,72,72,76,72,110,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile11.txt",
    "content": "0,127,127,91,109,127,127,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile12.txt",
    "content": "42,62,42,62,42,62,42,62"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile13.txt",
    "content": "0,127,90,127,127,90,127,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile14.txt",
    "content": "0,103,81,97,65,65,65,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile15.txt",
    "content": "63,55,63,59,63,55,63,59"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile16.txt",
    "content": "0,110,8,4,2,2,14,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile17.txt",
    "content": "0,119,66,98,66,66,66,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile18.txt",
    "content": "95,111,119,123,125,123,119,111"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile19.txt",
    "content": "65,34,20,8,8,20,34,65"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile2.txt",
    "content": "1,2,4,127,4,2,1,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile20.txt",
    "content": "28,62,119,99,99,119,62,28"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile21.txt",
    "content": "90,45,0,0,0,0,0,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile22.txt",
    "content": "37,63,41,63,37,63,41,63"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile23.txt",
    "content": "0,127,85,93,119,85,127,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile24.txt",
    "content": "119,103,95,103,115,125,115,119"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile25.txt",
    "content": "119,71,95,71,113,125,113,119"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile26.txt",
    "content": "119,111,119,123,119,111,119,123"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile3.txt",
    "content": "8,16,48,127,48,16,8,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile4.txt",
    "content": "8,4,6,127,6,4,8,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile5.txt",
    "content": "8,28,62,73,8,8,8,8"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile6.txt",
    "content": "0,42,42,42,58,42,42,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile7.txt",
    "content": "8,8,8,8,73,62,28,8"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile8.txt",
    "content": "64,32,16,127,16,32,64,0"
  },
  {
    "path": "src/games/verbix/tiles/7x8/tile9.txt",
    "content": "0,42,42,42,42,42,52,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile0.txt",
    "content": "153,90,60,24,24,24"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile1.txt",
    "content": "0,42,0,42,0,42"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile10.txt",
    "content": "142,136,140,136,238,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile11.txt",
    "content": "0,255,187,238,255,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile12.txt",
    "content": "90,126,90,126,90,126"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile13.txt",
    "content": "255,170,255,170,255,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile14.txt",
    "content": "219,146,210,82,219,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile15.txt",
    "content": "126,110,118,126,110,118"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile16.txt",
    "content": "179,170,179,170,171,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile17.txt",
    "content": "238,132,196,132,132,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile18.txt",
    "content": "223,239,247,251,247,239"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile19.txt",
    "content": "66,36,24,24,36,66"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile2.txt",
    "content": "2,4,255,255,4,2"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile20.txt",
    "content": "60,102,195,195,102,60"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile21.txt",
    "content": "170,85,0,0,0,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile22.txt",
    "content": "74,126,82,126,74,126"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile23.txt",
    "content": "255,170,238,170,255,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile24.txt",
    "content": "238,206,182,218,230,238"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile25.txt",
    "content": "238,142,182,218,226,238"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile26.txt",
    "content": "238,222,238,222,238,246"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile3.txt",
    "content": "16,96,255,255,96,16"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile4.txt",
    "content": "8,6,255,255,6,8"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile5.txt",
    "content": "24,60,126,153,24,24"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile6.txt",
    "content": "42,42,58,42,42,0"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile7.txt",
    "content": "24,24,153,126,60,24"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile8.txt",
    "content": "128,64,255,255,64,128"
  },
  {
    "path": "src/games/verbix/tiles/8x6/tile9.txt",
    "content": "74,74,74,74,116,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile0.txt",
    "content": "153,90,60,24,24,24,24,24"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile1.txt",
    "content": "0,0,42,0,42,0,42,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile10.txt",
    "content": "0,142,136,136,140,136,238,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile11.txt",
    "content": "0,255,255,187,238,255,255,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile12.txt",
    "content": "90,126,90,126,90,126,90,126"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile13.txt",
    "content": "0,255,170,255,255,170,255,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile14.txt",
    "content": "219,146,146,210,82,82,219,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile15.txt",
    "content": "126,110,126,118,126,110,126,118"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile16.txt",
    "content": "179,170,170,179,170,170,171,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile17.txt",
    "content": "0,238,132,196,132,132,132,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile18.txt",
    "content": "190,222,238,246,250,246,238,222"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile19.txt",
    "content": "129,66,36,24,24,36,66,129"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile2.txt",
    "content": "1,2,4,255,255,4,2,1"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile20.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile21.txt",
    "content": "170,85,0,0,0,0,0,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile22.txt",
    "content": "74,126,82,126,74,126,82,126"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile23.txt",
    "content": "0,255,170,187,238,170,255,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile24.txt",
    "content": "238,206,190,206,230,250,230,238"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile25.txt",
    "content": "238,142,190,142,226,250,226,238"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile26.txt",
    "content": "238,222,238,246,238,222,238,246"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile3.txt",
    "content": "16,32,96,255,255,96,32,16"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile4.txt",
    "content": "8,4,6,255,255,6,4,8"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile5.txt",
    "content": "24,60,126,153,24,24,24,24"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile6.txt",
    "content": "84,84,84,116,84,84,84,0"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile7.txt",
    "content": "24,24,24,24,153,126,60,24"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile8.txt",
    "content": "128,64,32,255,255,32,64,128"
  },
  {
    "path": "src/games/verbix/tiles/8x8/tile9.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/games/verbix/tiles/ASCII/atari7800/atari7800_char_tiles.h",
    "content": "#ifndef _ATARI7800_CHAR_TILES_H\r\n#define _ATARI7800_CHAR_TILES_H\r\n\r\n\r\n#define DIAMOND 42\r\n\r\n#define _TILE_0 (unsigned char) '|'\r\n#define _TILE_1 (unsigned char) '.'\r\n\r\n#define _TILE_2 (unsigned char) '-'\r\n\r\n#define _TILE_3 (unsigned char) '-'\r\n//'<'\r\n\r\n#define _TILE_4 (unsigned char) '-'\r\n//'>'\r\n\r\n#define _TILE_5 (unsigned char) '|'\r\n\r\n#define _TILE_6 (unsigned char) 'H'\r\n\r\n#define _TILE_7 (unsigned char) '|'\r\n\r\n#define _TILE_8 (unsigned char) '-'\r\n\r\n#define _TILE_9 (unsigned char) 'L'\r\n\r\n#define _TILE_10 (unsigned char) 'W'\r\n\r\n#define _TILE_11 (unsigned char) '-'\r\n\r\n#define _TILE_12 (unsigned char) '|'\r\n\r\n#define _TILE_13 (unsigned char) '-'\r\n\r\n#define _TILE_14 (unsigned char) 'S'\r\n\r\n#define _TILE_15 (unsigned char) '|'\r\n\r\n#define _TILE_16 (unsigned char) 'C'\r\n\r\n#define _TILE_17 (unsigned char) 'D'\r\n\r\n#define _TILE_18 (unsigned char) '|'\r\n\r\n#define _TILE_19 (unsigned char) 'X'\r\n\r\n#define _TILE_20 (unsigned char) '$'\r\n\r\n#define _TILE_21 (unsigned char) '-'\r\n\r\n#define _TILE_22 (unsigned char) '|'\r\n\r\n#define _TILE_23 (unsigned char) '-'\r\n\r\n#define _TILE_24 (unsigned char) '|'\r\n\r\n#define _TILE_25 (unsigned char) '|'\r\n\r\n#define _TILE_26 (unsigned char) '*'\r\n\r\n\r\n\r\n#endif // _ATARI7800_CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/verbix/tiles/ASCII/atari7800/atari7800_no_color_char_tiles.h",
    "content": "#ifndef _ATARI7800_NO_COLOR_CHAR_TILES_H\r\n#define _ATARI7800_NO_COLOR_CHAR_TILES_H\r\n\r\n\r\n#define _ATARI_7800_VERTICAL_LINE 179\r\n#define _ATARI_7800_BORDER_0 176\r\n#define _ATARI_7800_BORDER_1 177\r\n#define _ATARI_7800_BORDER_2 178\r\n#define _ATARI_7800_BORDER_3 15\r\n#define _ATARI_7800_EMPTY 240\r\n\r\n#define _ATARI_7800_HORIZONTAL_LINE 196\r\n\r\n#define DIAMOND 42\r\n\r\n#define _TILE_0 (unsigned char) _ATARI_7800_VERTICAL_LINE\r\n#define _TILE_1 (unsigned char) _ATARI_7800_EMPTY\r\n\r\n#define _TILE_2 (unsigned char) '-'\r\n\r\n#define _TILE_3 (unsigned char) 27\r\n\r\n#define _TILE_4 (unsigned char) 26\r\n\r\n#define _TILE_5 (unsigned char) 24\r\n//'^'\r\n\r\n#define _TILE_6 (unsigned char) 'H'\r\n\r\n#define _TILE_7 (unsigned char) 25\r\n\r\n#define _TILE_8 (unsigned char) '-'\r\n\r\n#define _TILE_9 (unsigned char) 'L'\r\n\r\n#define _TILE_10 (unsigned char) 'W'\r\n\r\n#define _TILE_11 (unsigned char) _ATARI_7800_HORIZONTAL_LINE\r\n//'-'\r\n\r\n#define _TILE_12 (unsigned char) _ATARI_7800_VERTICAL_LINE\r\n\r\n#define _TILE_13 (unsigned char) _ATARI_7800_HORIZONTAL_LINE\r\n//'-'\r\n\r\n#define _TILE_14 (unsigned char) 'S'\r\n\r\n#define _TILE_15 (unsigned char) _ATARI_7800_VERTICAL_LINE\r\n\r\n#define _TILE_16 (unsigned char) 'C'\r\n\r\n#define _TILE_17 (unsigned char) 'D'\r\n\r\n#define _TILE_18 (unsigned char) _ATARI_7800_BORDER_0\r\n\r\n#define _TILE_19 (unsigned char) 'X'\r\n\r\n#define _TILE_20 (unsigned char) '$'\r\n\r\n#define _TILE_21 (unsigned char) '-'\r\n\r\n#define _TILE_22 (unsigned char) _ATARI_7800_VERTICAL_LINE\r\n\r\n#define _TILE_23 (unsigned char) _ATARI_7800_HORIZONTAL_LINE\r\n//'-'\r\n\r\n#define _TILE_24 (unsigned char) _ATARI_7800_BORDER_1\r\n\r\n#define _TILE_25 (unsigned char) _ATARI_7800_BORDER_2\r\n\r\n#define _TILE_26 (unsigned char) _ATARI_7800_BORDER_3\r\n\r\n\r\n\r\n#endif // _ATARI7800_NO_COLOR_CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/verbix/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#if defined(__TARGET_SPECIFIC_ASCII)\r\n\r\n    #if defined(__ZX81__)\r\n        #include \"zx81/zx81_char_tiles.h\"\r\n    #elif defined(__MC10__)\r\n        #include \"mc10/mc10_char_tiles.h\"\r\n    #elif defined(__VZ__)\r\n        #include \"vz/vz_char_tiles.h\"\r\n    #elif defined(__ATARI7800__) && !defined(_XL_NO_COLOR)\r\n        #include \"atari7800/atari7800_char_tiles.h\"\r\n    #elif defined(__ATARI7800__) && defined(_XL_NO_COLOR)\r\n        #include \"atari7800/atari7800_no_color_char_tiles.h\" \r\n    #else\r\n        ERROR\r\n    #endif\r\n#else\r\n    #define _TILE_0 (unsigned char) '|'\r\n    #define _TILE_1 (unsigned char) '.'\r\n\r\n    #define _TILE_2 (unsigned char) '-'\r\n\r\n    #define _TILE_3 (unsigned char) '<'\r\n\r\n    #define _TILE_4 (unsigned char) '>'\r\n\r\n    #define _TILE_5 (unsigned char) '^'\r\n\r\n    #define _TILE_6 (unsigned char) 'H'\r\n\r\n    #define _TILE_7 (unsigned char) 'V'\r\n\r\n    #define _TILE_8 (unsigned char) '-'\r\n\r\n    #define _TILE_9 (unsigned char) 'L'\r\n\r\n    #define _TILE_10 (unsigned char) 'W'\r\n\r\n    #define _TILE_11 (unsigned char) '='\r\n\r\n    #define _TILE_12 (unsigned char) '|'\r\n\r\n    #define _TILE_13 (unsigned char) '-'\r\n\r\n    #define _TILE_14 (unsigned char) 'S'\r\n\r\n    #define _TILE_15 (unsigned char) '|'\r\n\r\n    #define _TILE_16 (unsigned char) 'C'\r\n\r\n    #define _TILE_17 (unsigned char) 'D'\r\n\r\n    #define _TILE_18 (unsigned char) 'I'\r\n\r\n    #define _TILE_19 (unsigned char) 'X'\r\n\r\n    #define _TILE_20 (unsigned char) '$'\r\n\r\n    #define _TILE_21 (unsigned char) '-'\r\n\r\n    #define _TILE_22 (unsigned char) '|'\r\n\r\n    #define _TILE_23 (unsigned char) '='\r\n\r\n    #define _TILE_24 (unsigned char) '|'\r\n\r\n    #define _TILE_25 (unsigned char) '|'\r\n\r\n    #define _TILE_26 (unsigned char) '|'\r\n\r\n#endif\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/verbix/tiles/ASCII/mc10/mc10_char_tiles.h",
    "content": "#ifndef _MC10_CHAR_TILES_H\r\n#define _MC10_CHAR_TILES_H\r\n\r\n\r\n#define MC10_GREEN_OFFSET 0\r\n#define MC10_YELLOW_OFFSET 16\r\n#define MC10_BLUE_OFFSET 32\r\n#define MC10_RED_OFFSET 48\r\n#define MC10_WHITE_OFFSET 64\r\n#define MC10_CYAN_OFFSET 80\r\n#define MC10_PURPLE_OFFSET 96\r\n#define MC10_ORANGE_OFFSET 112\r\n\r\n#define CHEQUERED_BASE 137\r\n#define BLOCK_BASE 143\r\n\r\n#define GREEN_CHEQUERED (CHEQUERED_BASE+MC10_GREEN_OFFSET)\r\n#define YELLOW_CHEQUERED (CHEQUERED_BASE+MC10_YELLOW_OFFSET)\r\n#define BLUE_CHEQUERED (CHEQUERED_BASE+MC10_BLUE_OFFSET)\r\n#define RED_CHEQUERED (CHEQUERED_BASE+MC10_RED_OFFSET)\r\n#define WHITE_CHEQUERED (CHEQUERED_BASE+MC10_WHITE_OFFSET)\r\n#define CYAN_CHEQUERED (CHEQUERED_BASE+MC10_CYAN_OFFSET)\r\n\r\n\r\n#define RED_BLOCK (BLOCK_BASE+MC10_RED_OFFSET)\r\n#define CYAN_BLOCK (BLOCK_BASE+MC10_CYAN_OFFSET)\r\n#define ORANGE_BLOCK (BLOCK_BASE+MC10_ORANGE_OFFSET)\r\n#define YELLOW_BLOCK (BLOCK_BASE+MC10_YELLOW_OFFSET)\r\n\r\n\r\n#define T_LETTER 20\r\n#define V_LETTER 22\r\n#define EXPLAMATION_MARK 33\r\n#define DOUBLE_QUOTES 34\r\n#define COLUMNS 58\r\n\r\n#define DIAMOND 42\r\n\r\n    #define _TILE_0 (unsigned char) EXPLAMATION_MARK\r\n    #define _TILE_1 (unsigned char) COLUMNS\r\n\r\n    #define _TILE_2 (unsigned char) '-'\r\n\r\n    #define _TILE_3 (unsigned char) '<'\r\n\r\n    #define _TILE_4 (unsigned char) '>'\r\n\r\n    #define _TILE_5 (unsigned char) T_LETTER\r\n\r\n    #define _TILE_6 (unsigned char) 'H'\r\n\r\n    #define _TILE_7 (unsigned char) V_LETTER\r\n\r\n    #define _TILE_8 (unsigned char) '-'\r\n\r\n    #define _TILE_9 (unsigned char) 'L'\r\n\r\n    #define _TILE_10 (unsigned char) 'W'\r\n\r\n    #define _TILE_11 (unsigned char) RED_BLOCK\r\n\r\n    #define _TILE_12 (unsigned char) CYAN_BLOCK\r\n\r\n    #define _TILE_13 (unsigned char) CYAN_BLOCK\r\n\r\n    #define _TILE_14 (unsigned char) 'S'\r\n\r\n    #define _TILE_15 (unsigned char) RED_BLOCK\r\n\r\n    #define _TILE_16 (unsigned char) 'C'\r\n\r\n    #define _TILE_17 (unsigned char) 'D'\r\n\r\n    #define _TILE_18 (unsigned char) 217\r\n\r\n    #define _TILE_19 (unsigned char) ORANGE_BLOCK\r\n\r\n    #define _TILE_20 (unsigned char) DIAMOND\r\n\r\n    #define _TILE_21 (unsigned char) 150\r\n\r\n    #define _TILE_22 (unsigned char) YELLOW_BLOCK\r\n\r\n    #define _TILE_23 (unsigned char) YELLOW_BLOCK\r\n\r\n    #define _TILE_24 (unsigned char) 137\r\n\r\n    #define _TILE_25 (unsigned char) 166\r\n\r\n    #define _TILE_26 (unsigned char) 233\r\n\r\n\r\n\r\n#endif // _MC10_CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/verbix/tiles/ASCII/vz/vz_char_tiles.h",
    "content": "#ifndef _VZ_CHAR_TILES_H\r\n#define _VZ_CHAR_TILES_H\r\n\r\n\r\n#define MC10_GREEN_OFFSET 0\r\n#define MC10_YELLOW_OFFSET 16\r\n#define MC10_BLUE_OFFSET 32\r\n#define MC10_RED_OFFSET 48\r\n#define MC10_WHITE_OFFSET 64\r\n#define MC10_CYAN_OFFSET 80\r\n#define MC10_PURPLE_OFFSET 96\r\n#define MC10_ORANGE_OFFSET 112\r\n\r\n#define CHEQUERED_BASE 137\r\n#define BLOCK_BASE 143\r\n\r\n#define GREEN_CHEQUERED (CHEQUERED_BASE+MC10_GREEN_OFFSET)\r\n#define YELLOW_CHEQUERED (CHEQUERED_BASE+MC10_YELLOW_OFFSET)\r\n#define BLUE_CHEQUERED (CHEQUERED_BASE+MC10_BLUE_OFFSET)\r\n#define RED_CHEQUERED (CHEQUERED_BASE+MC10_RED_OFFSET)\r\n#define WHITE_CHEQUERED (CHEQUERED_BASE+MC10_WHITE_OFFSET)\r\n#define CYAN_CHEQUERED (CHEQUERED_BASE+MC10_CYAN_OFFSET)\r\n\r\n\r\n#define RED_BLOCK (BLOCK_BASE+MC10_RED_OFFSET)\r\n#define CYAN_BLOCK (BLOCK_BASE+MC10_CYAN_OFFSET)\r\n#define ORANGE_BLOCK (BLOCK_BASE+MC10_ORANGE_OFFSET)\r\n#define YELLOW_BLOCK (BLOCK_BASE+MC10_YELLOW_OFFSET)\r\n\r\n\r\n#define T_LETTER 20\r\n#define V_LETTER 22\r\n#define EXPLAMATION_MARK 33\r\n#define DOUBLE_QUOTES 34\r\n#define COLUMNS 58\r\n\r\n#define DIAMOND 42\r\n\r\n    #define _TILE_0 (unsigned char) EXPLAMATION_MARK\r\n    #define _TILE_1 (unsigned char) COLUMNS\r\n\r\n    #define _TILE_2 (unsigned char) '-'\r\n\r\n    #define _TILE_3 (unsigned char) '<'\r\n\r\n    #define _TILE_4 (unsigned char) '>'\r\n\r\n    #define _TILE_5 (unsigned char) T_LETTER\r\n\r\n    #define _TILE_6 (unsigned char) 'H'\r\n\r\n    #define _TILE_7 (unsigned char) V_LETTER\r\n\r\n    #define _TILE_8 (unsigned char) '-'\r\n\r\n    #define _TILE_9 (unsigned char) 'L'\r\n\r\n    #define _TILE_10 (unsigned char) 'W'\r\n\r\n    #define _TILE_11 (unsigned char) RED_BLOCK\r\n\r\n    #define _TILE_12 (unsigned char) CYAN_BLOCK\r\n\r\n    #define _TILE_13 (unsigned char) CYAN_BLOCK\r\n\r\n    #define _TILE_14 (unsigned char) 'S'\r\n\r\n    #define _TILE_15 (unsigned char) RED_BLOCK\r\n\r\n    #define _TILE_16 (unsigned char) 'C'\r\n\r\n    #define _TILE_17 (unsigned char) 'D'\r\n\r\n    #define _TILE_18 (unsigned char) 217\r\n\r\n    #define _TILE_19 (unsigned char) ORANGE_BLOCK\r\n\r\n    #define _TILE_20 (unsigned char) DIAMOND\r\n\r\n    #define _TILE_21 (unsigned char) 150\r\n\r\n    #define _TILE_22 (unsigned char) YELLOW_BLOCK\r\n\r\n    #define _TILE_23 (unsigned char) YELLOW_BLOCK\r\n\r\n    #define _TILE_24 (unsigned char) 137\r\n\r\n    #define _TILE_25 (unsigned char) 166\r\n\r\n    #define _TILE_26 (unsigned char) 233\r\n\r\n\r\n\r\n#endif // _VZ_CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/games/verbix/tiles/ASCII/zx81/zx81_char_tiles.h",
    "content": "#ifndef _ZX81_CHAR_TILES_H\r\n#define _ZX81_CHAR_TILES_H\r\n\r\n#define _BLACK_BLOCK 64u\r\n#define _BOTTOM_GREY_BLOCK 95u\r\n#define _GREY_BLOCK 35u\r\n#define _INVERSE_PLUS 38u\r\n\r\n\r\n#define _TILE_0 (unsigned char) 'I'\r\n\r\n#define _TILE_1 (unsigned char) '.'\r\n\r\n#define _TILE_2 (unsigned char) '-'\r\n\r\n#define _TILE_3 (unsigned char) '<'\r\n\r\n#define _TILE_4 (unsigned char) '>'\r\n\r\n#define _TILE_5 (unsigned char) 'T'\r\n\r\n#define _TILE_6 (unsigned char) 'H'\r\n\r\n#define _TILE_7 (unsigned char) 'V'\r\n\r\n#define _TILE_8 (unsigned char) '-'\r\n\r\n#define _TILE_9 (unsigned char) 'L'\r\n\r\n#define _TILE_10 (unsigned char) 'W'\r\n\r\n#define _TILE_11 (unsigned char) _INVERSE_PLUS\r\n\r\n#define _TILE_12 (unsigned char) _BLACK_BLOCK\r\n\r\n#define _TILE_13 (unsigned char) _BLACK_BLOCK\r\n\r\n#define _TILE_14 (unsigned char) 'S'\r\n\r\n#define _TILE_15 (unsigned char) _BLACK_BLOCK\r\n\r\n#define _TILE_16 (unsigned char) 'C'\r\n\r\n#define _TILE_17 (unsigned char) 'D'\r\n\r\n#define _TILE_18 (unsigned char) _GREY_BLOCK\r\n\r\n#define _TILE_19 (unsigned char) 'X'\r\n\r\n#define _TILE_20 (unsigned char) '$'\r\n\r\n#define _TILE_21 (unsigned char) '-'\r\n\r\n#define _TILE_22 (unsigned char) _BLACK_BLOCK\r\n\r\n#define _TILE_23 (unsigned char) _INVERSE_PLUS\r\n\r\n#define _TILE_24 (unsigned char) _GREY_BLOCK\r\n\r\n#define _TILE_25 (unsigned char) _GREY_BLOCK\r\n\r\n#define _TILE_26 (unsigned char) _GREY_BLOCK\r\n\r\n\r\n#endif // _ZX81_CHAR_TILES_H\r\n\r\n\r\n"
  },
  {
    "path": "src/games/verbix/words_16/a.txt",
    "content": "\r\nached\r\naches\r\nachoo\r\nacids\r\nacmes\r\nacned\r\nacnes\r\nacorn\r\nacres\r\nacrid\r\nacted\r\nactin\r\nactor\r\nacute\r\nadapt\r\nadded\r\nadder\r\naddle\r\nadept\r\nadieu\r\nadios\r\nadman\r\nadmen\r\nadmit\r\nadopt\r\nadore\r\nadorn\r\nadult\r\naerie\r\nahead\r\nahhhh\r\nahold\r\nahoys\r\naided\r\naider\r\naides\r\nailed\r\naimed\r\naimer\r\naioli\r\naired\r\nairer\r\naisle\r\naitch\r\nalarm\r\nalder\r\naleph\r\nalert\r\nalias\r\nalien\r\nallay\r\nalley\r\nallot\r\nalloy\r\naloes\r\naloha\r\nalone\r\naloud\r\nalpha\r\naltar\r\nalter\r\naltho\r\naltos\r\nalums\r\namahs\r\namass\r\namend\r\namens\r\namide\r\namine\r\namino\r\namiss\r\namity\r\nammos\r\namour\r\namped\r\nample\r\namply\r\namuse\r\namyls\r\nanded\r\nanent\r\nanile\r\nanima\r\nanion\r\nanise\r\nannas\r\nannoy\r\nannul\r\nannum\r\nanode\r\nanole\r\nanted\r\nantes\r\nantic\r\nantis\r\nantsy\r\naorta\r\napace\r\napart\r\napers\r\naphid\r\naphis\r\napian\r\napish\r\napnea\r\naport\r\napple\r\napply\r\napron\r\napses\r\napsos\r\naptly\r\narced\r\nardor\r\nareal\r\nareas\r\narena\r\narias\r\narise\r\narity\r\narmed\r\narmor\r\naroma\r\narose\r\narras\r\narray\r\narses\r\narson\r\nartsy\r\narums\r\nasana\r\nascot\r\nashen\r\nashes\r\naside\r\naspen\r\naspic\r\nassai\r\nassay\r\nassed\r\nasses\r\nasset\r\naster\r\nastir\r\nastro\r\natilt\r\natlas\r\natoll\r\natoms\r\natone\r\natria\r\nattar\r\nattic\r\naudio\r\naudit\r\naunts\r\naurae\r\naural\r\nauras\r\nauric\r\nautos\r\nayins"
  },
  {
    "path": "src/games/verbix/words_16/c.txt",
    "content": "\r\ncacao\r\ncache\r\ncacti\r\ncaddy\r\ncadet\r\ncadre\r\ncairn\r\ncalla\r\ncalls\r\ncalms\r\ncamel\r\ncameo\r\ncampo\r\ncamps\r\ncampy\r\ncanal\r\ncandy\r\ncaned\r\ncaner\r\ncanes\r\ncanna\r\ncanny\r\ncanoe\r\ncanon\r\ncanst\r\ncanto\r\ncants\r\ncaped\r\ncaper\r\ncapes\r\ncapon\r\ncapos\r\ncarat\r\ncards\r\ncared\r\ncarer\r\ncares\r\ncaret\r\ncarne\r\ncarny\r\ncarol\r\ncarom\r\ncaron\r\ncarps\r\ncarpy\r\ncarry\r\ncarte\r\ncarts\r\ncasas\r\ncased\r\ncases\r\ncaste\r\ncasts\r\ncasus\r\ncatch\r\ncater\r\ncatty\r\ncauls\r\ncause\r\ncease\r\ncedar\r\nceded\r\nceder\r\ncedes\r\nceils\r\ncello\r\ncells\r\ncento\r\ncents\r\nchain\r\nchair\r\nchamp\r\nchant\r\nchaos\r\nchaps\r\nchard\r\ncharm\r\nchars\r\nchart\r\nchary\r\nchase\r\nchasm\r\nchats\r\ncheap\r\ncheat\r\ncheep\r\ncheer\r\nchert\r\nchess\r\nchest\r\nchide\r\nchild\r\nchile\r\nchili\r\nchill\r\nchime\r\nchimp\r\nchina\r\nchine\r\nchino\r\nchins\r\nchips\r\nchirp\r\nchits\r\nchoir\r\nchomp\r\nchoos\r\nchops\r\nchord\r\nchore\r\nchose\r\nchump\r\nchums\r\nchurl\r\nchurn\r\nchute\r\ncider\r\ncilia\r\ncills\r\ncinch\r\ncirca\r\ncirri\r\ncited\r\ncites\r\nclads\r\nclaim\r\nclamp\r\nclams\r\nclans\r\nclaps\r\nclash\r\nclasp\r\nclass\r\nclays\r\nclean\r\nclear\r\ncleat\r\nclime\r\nclips\r\nclods\r\nclomp\r\nclone\r\nclops\r\nclose\r\ncloth\r\nclots\r\ncloud\r\nclout\r\ncloys\r\nclued\r\nclues\r\nclump\r\ncoach\r\ncoals\r\ncoast\r\ncoati\r\ncoats\r\ncocas\r\ncocci\r\ncocoa\r\ncocos\r\ncodas\r\ncoded\r\ncoder\r\ncodes\r\ncodon\r\ncoeds\r\ncohos\r\ncoils\r\ncoins\r\ncolas\r\ncolds\r\ncolic\r\ncolon\r\ncolor\r\ncolts\r\ncomas\r\ncomer\r\ncomes\r\ncomet\r\ncomic\r\ncomma\r\ncomps\r\nconch\r\ncondo\r\nconed\r\ncones\r\nconey\r\nconic\r\ncooch\r\ncooed\r\ncools\r\ncoons\r\ncoops\r\ncoots\r\ncoped\r\ncoper\r\ncopes\r\ncopra\r\ncopse\r\ncoral\r\ncords\r\ncordy\r\ncored\r\ncorer\r\ncores\r\ncorms\r\ncorns\r\ncornu\r\ncorny\r\ncorps\r\ncoset\r\ncosta\r\ncosts\r\ncotes\r\ncotta\r\ncouch\r\ncould\r\ncount\r\ncoupe\r\ncoups\r\ncourt\r\ncouth\r\ncoyer\r\ncoyly\r\ncoypu\r\ncramp\r\ncrams\r\ncrane\r\ncraps\r\ncrash\r\ncrass\r\ncrate\r\ncream\r\ncredo\r\ncreed\r\ncreel\r\ncreep\r\ncreme\r\ncrepe\r\ncrept\r\ncress\r\ncrest\r\ncried\r\ncrier\r\ncries\r\ncrime\r\ncrimp\r\ncrisp\r\ncrits\r\ncrocs\r\ncrone\r\ncrony\r\ncroon\r\ncrops\r\ncross\r\ncroup\r\ncrude\r\ncruds\r\ncruel\r\ncruet\r\ncrump\r\ncruse\r\ncrush\r\ncrust\r\ncrypt\r\nculls\r\nculpa\r\ncults\r\ncumin\r\ncunts\r\ncupid\r\ncuppa\r\ncuppy\r\ncurds\r\ncurdy\r\ncured\r\ncurer\r\ncures\r\ncuria\r\ncurie\r\ncurio\r\ncurls\r\ncurly\r\ncurry\r\ncurse\r\ncushy\r\ncusps\r\ncuspy\r\ncuter\r\ncutie\r\ncutup\r\ncycad\r\ncycle\r\ncynic\r\ncysts"
  },
  {
    "path": "src/games/verbix/words_16/compress.py",
    "content": "import sys\r\n\r\n\r\n\r\ndef letter_index(letter):\r\n        if letter=='e':\r\n            return 0\r\n        elif letter=='a':\r\n            return 1\r\n        elif letter=='r':\r\n            return 2\r\n        elif letter=='i':\r\n            return 3\r\n        elif letter=='o':\r\n            return 4\r\n        elif letter=='t':\r\n            return 5\r\n        elif letter=='n':\r\n            return 6\r\n        elif letter=='s':\r\n            return 7\r\n        elif letter=='l':\r\n            return 8\r\n        elif letter=='c':\r\n            return 9\r\n        elif letter=='u':\r\n            return 10\r\n        elif letter=='d':\r\n            return 11\r\n        elif letter=='p':\r\n            return 12\r\n        elif letter=='m':\r\n            return 13\r\n        elif letter=='h':\r\n            return 14\r\n        elif letter=='y':\r\n            return 15\r\n        else:\r\n            return 16\r\n\r\n\r\ndef compress(word):\r\n    return letter_index(word[3])+letter_index(word[2])*16+letter_index(word[1])*16*16+letter_index(word[0])*16*16*16\r\n\r\n\r\n# MAIN FUNCTION\r\nif __name__ == '__main__':\r\n\r\n    file_name = sys.argv[1]\r\n    \r\n    # Count valid words for example excluding empty lines\r\n    word_count = 0\r\n    \r\n    words = []\r\n    word_strings = []\r\n    \r\n    # res = \"\"\r\n    \r\n    print(\"file name: \" + file_name)\r\n\r\n    with open(file_name) as f:\r\n        lines = f.readlines()\r\n        \r\n    for line in lines:\r\n        word = line[1:]\r\n        if(len(word)>=4):\r\n            compressed_word = compress(word)\r\n            print(word[0:4] + \"->\" + str(compressed_word))\r\n            # print(compress(word))\r\n            # res = res + \", \" + str(compressed_word)\r\n            word_count+=1\r\n            words += [compressed_word]\r\n            #print()\r\n\r\n    print()   \r\n    # print(res[2:])\r\n    words.sort()\r\n    \r\n    for word in words:\r\n        word_strings += [str(word)+\"u\"]\r\n    \r\n    print(str(word_strings)[1:-1].replace(\"'\",\"\")+\",\")\r\n    print()\r\n    print(\"Number of compressed words: \" + str(word_count))\r\n    "
  },
  {
    "path": "src/games/verbix/words_16/d.txt",
    "content": "\r\ndacha\r\ndaddy\r\ndados\r\ndaily\r\ndairy\r\ndaisy\r\ndales\r\ndally\r\ndames\r\ndamns\r\ndamps\r\ndance\r\ndandy\r\ndared\r\ndarer\r\ndares\r\ndarns\r\ndarts\r\ndashy\r\ndated\r\ndater\r\ndates\r\ndatum\r\ndaunt\r\ndeads\r\ndeals\r\ndealt\r\ndeans\r\ndears\r\ndeary\r\ndeath\r\ndecal\r\ndecay\r\ndecor\r\ndecoy\r\ndecry\r\ndeeds\r\ndeems\r\ndeeps\r\ndeice\r\ndeism\r\ndeist\r\ndeity\r\ndelay\r\ndelis\r\ndells\r\ndelta\r\ndemit\r\ndemon\r\ndemos\r\ndemur\r\ndenim\r\ndense\r\ndents\r\ndepot\r\ndepth\r\ndeter\r\ndeuce\r\ndials\r\ndiary\r\ndiced\r\ndicer\r\ndices\r\ndicey\r\ndicot\r\ndicta\r\ndictu\r\ndicut\r\ndiddy\r\ndidos\r\ndidot\r\ndidst\r\ndiems\r\ndiest\r\ndieth\r\ndiets\r\ndildo\r\ndills\r\ndilly\r\ndimer\r\ndimes\r\ndimly\r\ndinar\r\ndined\r\ndiner\r\ndines\r\ndints\r\ndiode\r\ndippy\r\ndipso\r\ndirer\r\ndirts\r\ndirty\r\ndisco\r\ndiscs\r\ndishy\r\nditch\r\nditto\r\nditty\r\ndodos\r\ndoers\r\ndoest\r\ndoeth\r\ndoily\r\ndolce\r\ndoled\r\ndoles\r\ndolls\r\ndolly\r\ndolor\r\ndolts\r\ndomed\r\ndomes\r\ndonee\r\ndonna\r\ndonor\r\ndonut\r\ndooms\r\ndoors\r\ndoped\r\ndoper\r\ndopes\r\ndopey\r\ndorms\r\ndosed\r\ndoser\r\ndoses\r\ndoted\r\ndoter\r\ndotes\r\ndotty\r\ndouse\r\ndoyen\r\ndrain\r\ndrama\r\ndrams\r\ndrape\r\ndrays\r\ndread\r\ndream\r\ndrear\r\ndress\r\ndried\r\ndrier\r\ndries\r\ndrill\r\ndrily\r\ndrips\r\ndroid\r\ndroll\r\ndrone\r\ndrool\r\ndroop\r\ndrops\r\ndross\r\ndruid\r\ndrums\r\ndryad\r\ndryer\r\ndryly\r\nduals\r\nducal\r\nducat\r\nduces\r\nduchy\r\nducts\r\nduddy\r\ndudes\r\nduels\r\nduets\r\ndulls\r\ndully\r\ndulse\r\ndummy\r\ndumps\r\ndumpy\r\ndunce\r\ndunes\r\ndunno\r\nduomo\r\nduped\r\nduper\r\ndupes\r\nduple\r\ndurst\r\ndusts\r\ndusty\r\ndutch\r\ndyads\r\ndyers\r\ndynes"
  },
  {
    "path": "src/games/verbix/words_16/e.txt",
    "content": "\r\neared\r\nearls\r\nearly\r\nearns\r\nearth\r\neased\r\neasel\r\neases\r\neasts\r\neaten\r\neater\r\nechos\r\neclat\r\nedema\r\nedict\r\nedits\r\neduce\r\neerie\r\neider\r\neland\r\nelans\r\nelate\r\nelder\r\nelect\r\nelide\r\nelite\r\nelope\r\nelude\r\nemail\r\nemcee\r\nemend\r\nemery\r\nemirs\r\nemits\r\nemote\r\nempty\r\nenact\r\nended\r\nender\r\nendue\r\nenema\r\nenemy\r\nennui\r\nenrol\r\nensue\r\nenter\r\nentry\r\nepact\r\nepees\r\nephah\r\nephod\r\nepics\r\nepoch\r\nepsom\r\nerase\r\nerect\r\nerode\r\nerred\r\nerror\r\neruct\r\nerupt\r\nessay\r\nesses\r\nester\r\nestop\r\nether\r\nethic\r\nethos\r\nethyl\r\netude\r\neyers\r\neyrie"
  },
  {
    "path": "src/games/verbix/words_16/h.txt",
    "content": "\r\nhadda\r\nhades\r\nhadst\r\nhails\r\nhairs\r\nhairy\r\nhaled\r\nhaler\r\nhales\r\nhallo\r\nhalls\r\nhalma\r\nhalos\r\nhalts\r\nhames\r\nhammy\r\nhands\r\nhandy\r\nhaply\r\nhappy\r\nhardy\r\nharem\r\nhares\r\nharms\r\nharps\r\nharpy\r\nharry\r\nharsh\r\nharts\r\nharum\r\nhasps\r\nhaste\r\nhasty\r\nhatch\r\nhated\r\nhater\r\nhates\r\nhauls\r\nhaunt\r\nhaute\r\nhayed\r\nhayer\r\nhayey\r\nheads\r\nheady\r\nheals\r\nheaps\r\nheard\r\nhears\r\nheart\r\nheath\r\nheats\r\nheeds\r\nheels\r\nheerd\r\nheirs\r\nheist\r\nhello\r\nhells\r\nhelms\r\nhelps\r\nhemps\r\nhempy\r\nhence\r\nhenna\r\nhenry\r\nherds\r\nherem\r\nheres\r\nheron\r\nheros\r\nhider\r\nhides\r\nhilar\r\nhills\r\nhilly\r\nhilts\r\nhilum\r\nhinds\r\nhints\r\nhippo\r\nhippy\r\nhired\r\nhirer\r\nhires\r\nhitch\r\nhoard\r\nhoars\r\nhoary\r\nhocus\r\nhodad\r\nhoers\r\nhoist\r\nholds\r\nholed\r\nholer\r\nholes\r\nholey\r\nholly\r\nholon\r\nhomed\r\nhomer\r\nhomes\r\nhomey\r\nhomme\r\nhomos\r\nhoned\r\nhoner\r\nhones\r\nhoney\r\nhonor\r\nhooch\r\nhoods\r\nhooey\r\nhoops\r\nhoots\r\nhoped\r\nhoper\r\nhopes\r\nhoppy\r\nhorde\r\nhorns\r\nhorny\r\nhorse\r\nhorsy\r\nhosed\r\nhoses\r\nhosts\r\nhotel\r\nhotly\r\nhound\r\nhouri\r\nhours\r\nhouse\r\nhulas\r\nhullo\r\nhulls\r\nhuman\r\nhumid\r\nhumor\r\nhumph\r\nhumps\r\nhumpy\r\nhumus\r\nhunch\r\nhunts\r\nhurls\r\nhurly\r\nhurry\r\nhurts\r\nhussy\r\nhutch\r\nhydra\r\nhydro\r\nhyena\r\nhymen\r\nhymns\r\nhyped\r\nhyper\r\nhypes\r\nhypos"
  },
  {
    "path": "src/games/verbix/words_16/i.txt",
    "content": "\r\nicers\r\nichor\r\nicier\r\nicily\r\nicons\r\nideal\r\nideas\r\nidiom\r\nidiot\r\nidled\r\nidler\r\nidles\r\nidols\r\nidyll\r\nidyls\r\nileum\r\nileus\r\niliac\r\nilium\r\nimams\r\nimpel\r\nimply\r\nimpro\r\ninane\r\ninapt\r\nincur\r\nindie\r\ninept\r\ninert\r\ninlay\r\ninlet\r\ninner\r\ninode\r\ninput\r\ninset\r\ninter\r\nintra\r\nintro\r\ninure\r\nioctl\r\niodic\r\nionic\r\niotas\r\nirate\r\nirons\r\nirony\r\nisles\r\nislet\r\nissue\r\nitchy\r\nitems"
  },
  {
    "path": "src/games/verbix/words_16/l.txt",
    "content": "\r\nlaced\r\nlacer\r\nlaces\r\nlacey\r\nladed\r\nladen\r\nlades\r\nladle\r\nlaird\r\nlairs\r\nlaity\r\nlamas\r\nlamed\r\nlamer\r\nlames\r\nlamps\r\nlanai\r\nlance\r\nlands\r\nlanes\r\nlapel\r\nlapin\r\nlapis\r\nlapse\r\nlarch\r\nlards\r\nlardy\r\nlased\r\nlaser\r\nlases\r\nlasso\r\nlasts\r\nlatch\r\nlater\r\nlathe\r\nlaths\r\nlatin\r\nlatus\r\nlaude\r\nlauds\r\nlayer\r\nlayup\r\nleach\r\nleads\r\nleans\r\nleant\r\nleaps\r\nleapt\r\nlearn\r\nlease\r\nleash\r\nleast\r\nleech\r\nleers\r\nleery\r\nlemma\r\nlemme\r\nlemon\r\nlemur\r\nlends\r\nlento\r\nleper\r\nlepta\r\nletup\r\nliars\r\nlicit\r\nliens\r\nliers\r\nliest\r\nlieth\r\nlilac\r\nlilts\r\nlilty\r\nlimed\r\nlimen\r\nlimes\r\nlimey\r\nlimit\r\nlimns\r\nlimos\r\nlimps\r\nlined\r\nlinen\r\nliner\r\nlines\r\nlints\r\nlinty\r\nlions\r\nlipid\r\nlippy\r\nliras\r\nlisle\r\nlisps\r\nlists\r\nliter\r\nlites\r\nlithe\r\nlitho\r\nlitre\r\nllama\r\nloads\r\nloams\r\nloamy\r\nloans\r\nloath\r\nlocal\r\nlochs\r\nlocos\r\nlocus\r\nlodes\r\nloess\r\nloins\r\nlolls\r\nlolly\r\nloner\r\nlooms\r\nloons\r\nloony\r\nloops\r\nloopy\r\nloose\r\nloots\r\nloped\r\nloper\r\nlopes\r\nloppy\r\nlords\r\nlordy\r\nlores\r\nlorry\r\nloser\r\nloses\r\nlossy\r\nlotsa\r\nlotta\r\nlotto\r\nlotus\r\nlouis\r\nlouse\r\nlousy\r\nlouts\r\nloyal\r\nluaus\r\nlucid\r\nlucre\r\nlulls\r\nlulus\r\nlumen\r\nlumps\r\nlumpy\r\nlunar\r\nlunch\r\nlunes\r\nlupus\r\nlurch\r\nlured\r\nlurer\r\nlures\r\nlurid\r\nlusts\r\nlusty\r\nluted\r\nlutes\r\nlycra\r\nlymph\r\nlynch\r\nlyres\r\nlyric"
  },
  {
    "path": "src/games/verbix/words_16/m.txt",
    "content": "\r\nmaced\r\nmacer\r\nmaces\r\nmacho\r\nmacro\r\nmadam\r\nmadly\r\nmahua\r\nmaids\r\nmails\r\nmaims\r\nmains\r\nmales\r\nmalls\r\nmalts\r\nmalty\r\nmamas\r\nmamma\r\nmammy\r\nmaned\r\nmanes\r\nmania\r\nmanic\r\nmanly\r\nmanna\r\nmanor\r\nmanse\r\nmanta\r\nmaple\r\nmarch\r\nmares\r\nmaria\r\nmarls\r\nmarry\r\nmarsh\r\nmarts\r\nmaser\r\nmashy\r\nmason\r\nmasse\r\nmasts\r\nmatch\r\nmated\r\nmater\r\nmates\r\nmatey\r\nmaths\r\nmatte\r\nmauls\r\nmayor\r\nmayst\r\nmeads\r\nmeals\r\nmealy\r\nmeans\r\nmeant\r\nmeany\r\nmeats\r\nmeaty\r\nmecca\r\nmecum\r\nmedal\r\nmedia\r\nmedic\r\nmeets\r\nmelds\r\nmelee\r\nmelon\r\nmelts\r\nmemes\r\nmemos\r\nmends\r\nmenus\r\nmercy\r\nmerit\r\nmerry\r\nmerse\r\nmesas\r\nmesne\r\nmeson\r\nmessy\r\nmetal\r\nmeted\r\nmeter\r\nmetes\r\nmetre\r\nmetro\r\nmicas\r\nmicro\r\nmiddy\r\nmidis\r\nmidst\r\nmiens\r\nmilch\r\nmiler\r\nmiles\r\nmills\r\nmimed\r\nmimeo\r\nmimer\r\nmimes\r\nmimic\r\nmimsy\r\nminas\r\nmince\r\nminds\r\nmined\r\nminer\r\nmines\r\nminim\r\nminis\r\nminor\r\nmints\r\nminus\r\nmired\r\nmires\r\nmirth\r\nmiser\r\nmissy\r\nmists\r\nmisty\r\nmiter\r\nmites\r\nmitre\r\nmitts\r\nmoans\r\nmoats\r\nmocha\r\nmodal\r\nmodel\r\nmodem\r\nmodes\r\nmodus\r\nmohel\r\nmoire\r\nmoist\r\nmolal\r\nmolar\r\nmolas\r\nmolds\r\nmoldy\r\nmoles\r\nmolls\r\nmolly\r\nmolto\r\nmolts\r\nmomma\r\nmommy\r\nmonad\r\nmondo\r\nmoney\r\nmonic\r\nmonte\r\nmonth\r\nmooch\r\nmoods\r\nmoody\r\nmooed\r\nmoola\r\nmoons\r\nmoony\r\nmoors\r\nmoose\r\nmoots\r\nmoped\r\nmoper\r\nmopes\r\nmoral\r\nmoray\r\nmorel\r\nmores\r\nmorns\r\nmoron\r\nmorph\r\nmorts\r\nmosey\r\nmossy\r\nmosts\r\nmotel\r\nmotes\r\nmotet\r\nmoths\r\nmothy\r\nmotor\r\nmotto\r\nmould\r\nmoult\r\nmound\r\nmount\r\nmourn\r\nmouse\r\nmousy\r\nmouth\r\nmrads\r\nmucho\r\nmucus\r\nmuddy\r\nmulch\r\nmulct\r\nmules\r\nmuley\r\nmulls\r\nmummy\r\nmumps\r\nmunch\r\nmuons\r\nmural\r\nmused\r\nmuser\r\nmuses\r\nmushy\r\nmusic\r\nmusos\r\nmussy\r\nmusta\r\nmusts\r\nmusty\r\nmuted\r\nmuter\r\nmutes\r\nmutts\r\nmylar\r\nmynah\r\nmynas\r\nmyrrh\r\nmyths"
  },
  {
    "path": "src/games/verbix/words_16/missing_words.txt",
    "content": "HINDI\r\nMAMES\r\nMAMED\r\nDIDNT\r\nSAMOA\r\nNORSE\r\nMORSE\r\nSCUMM\r\n\r\nCountry names\r\n"
  },
  {
    "path": "src/games/verbix/words_16/n.txt",
    "content": "\r\nnacho\r\nnadir\r\nnaiad\r\nnails\r\nnamed\r\nnamer\r\nnames\r\nnanny\r\nnapes\r\nnappy\r\nnarco\r\nnarcs\r\nnards\r\nnares\r\nnasal\r\nnasty\r\nnatal\r\nnatch\r\nnates\r\nnatty\r\nnears\r\nneath\r\nneato\r\nneeds\r\nneedy\r\nneons\r\nnerds\r\nnerdy\r\nnerts\r\nnests\r\nnicad\r\nnicer\r\nniche\r\nniece\r\nnihil\r\nnines\r\nninny\r\nninth\r\nnippy\r\nnisei\r\nniter\r\nnitro\r\nnitty\r\nnodal\r\nnoddy\r\nnodes\r\nnoels\r\nnoire\r\nnoise\r\nnoisy\r\nnomad\r\nnonce\r\nnones\r\nnonny\r\nnoons\r\nnoose\r\nnorms\r\nnorth\r\nnosed\r\nnoses\r\nnosey\r\nnotch\r\nnoted\r\nnoter\r\nnotes\r\nnouns\r\nnuder\r\nnudes\r\nnudie\r\nnulls\r\nnurse\r\nnutsy\r\nnutty\r\nnylon\r\nnymph"
  },
  {
    "path": "src/games/verbix/words_16/o.txt",
    "content": "\r\noared\r\noases\r\noasis\r\noaten\r\noaths\r\noccur\r\nocean\r\nocher\r\nochre\r\noctal\r\noctet\r\nodder\r\noddly\r\nodium\r\nodors\r\nodour\r\nohhhh\r\nohmic\r\noiled\r\noiler\r\nolden\r\nolder\r\noldie\r\noleos\r\nolios\r\nomens\r\nomits\r\noncet\r\nonion\r\nonset\r\noodle\r\noomph\r\nopals\r\nopens\r\nopera\r\nopine\r\nopium\r\nopted\r\noptic\r\norals\r\norate\r\norcas\r\norder\r\norlon\r\northo\r\nosier\r\nother\r\notter\r\nounce\r\nousel\r\nousts\r\noutdo\r\nouten\r\nouter\r\noutta"
  },
  {
    "path": "src/games/verbix/words_16/p.txt",
    "content": "\r\npaced\r\npacer\r\npaces\r\npacts\r\npaddy\r\npadre\r\npaean\r\npails\r\npains\r\npaint\r\npairs\r\npaled\r\npaler\r\npales\r\npalls\r\npally\r\npalms\r\npalmy\r\npalsy\r\npampa\r\npanda\r\npaned\r\npanel\r\npanes\r\npanic\r\npansy\r\npants\r\npanty\r\npapal\r\npapas\r\npaper\r\npappy\r\nparas\r\nparch\r\npards\r\npared\r\nparen\r\nparer\r\npares\r\nparry\r\nparse\r\nparts\r\nparty\r\npasha\r\npasse\r\npasta\r\npaste\r\npasts\r\npasty\r\npatch\r\npaten\r\npater\r\npates\r\npaths\r\npatio\r\npatsy\r\npatty\r\npause\r\npayed\r\npayee\r\npayer\r\npeace\r\npeach\r\npeals\r\npearl\r\npears\r\npease\r\npeats\r\npeaty\r\npecan\r\npedal\r\npeels\r\npeens\r\npeeps\r\npeers\r\npelts\r\npenal\r\npence\r\npends\r\npenes\r\npenis\r\npenny\r\npeons\r\npeony\r\npeppy\r\nperch\r\nperdu\r\nperil\r\nperms\r\npesos\r\npesto\r\npests\r\npetal\r\npeter\r\npetit\r\npetri\r\npetty\r\nphase\r\nphial\r\nphone\r\nphony\r\nphoto\r\nphyla\r\npiano\r\npicas\r\npicot\r\npiece\r\npiers\r\npieta\r\npiety\r\npilau\r\npiled\r\npiles\r\npills\r\npilot\r\npimps\r\npinch\r\npined\r\npines\r\npiney\r\npinto\r\npints\r\npinup\r\npions\r\npious\r\npiped\r\npiper\r\npipes\r\npipet\r\npismo\r\npitas\r\npitch\r\npiths\r\npithy\r\npiton\r\nplace\r\nplaid\r\nplain\r\nplait\r\nplane\r\nplans\r\nplant\r\nplash\r\nplasm\r\nplate\r\nplats\r\nplaya\r\nplays\r\nplead\r\npleas\r\npleat\r\nplein\r\nplena\r\nplied\r\nplies\r\nplods\r\nplops\r\nplots\r\nploys\r\nplume\r\nplump\r\nplums\r\nplumy\r\nplush\r\nplyer\r\npoach\r\npodia\r\npoems\r\npoesy\r\npoets\r\npoint\r\npoise\r\npolar\r\npoled\r\npoler\r\npoles\r\npolio\r\npolis\r\npolls\r\npolly\r\npolos\r\npolyp\r\npomps\r\nponds\r\npones\r\npooch\r\npooey\r\npoohs\r\npools\r\npoops\r\npopes\r\npoppy\r\nporch\r\npored\r\npores\r\nporno\r\nports\r\nposed\r\nposer\r\nposes\r\nposet\r\nposit\r\nposse\r\nposte\r\nposts\r\npotty\r\npouch\r\npound\r\npours\r\npouts\r\nprams\r\nprate\r\nprats\r\nprays\r\npreen\r\npreps\r\npress\r\nprest\r\npreys\r\nprice\r\npride\r\npried\r\nprier\r\npries\r\nprima\r\nprime\r\nprimo\r\nprimp\r\nprims\r\nprint\r\nprior\r\nprise\r\nprism\r\nprods\r\nproem\r\npromo\r\nproms\r\nprone\r\nprops\r\nprose\r\nprosy\r\nproud\r\nprude\r\nprune\r\npruta\r\npryer\r\npsalm\r\npseud\r\npsoas\r\npssst\r\npsych\r\npulls\r\npulps\r\npulpy\r\npulse\r\npumas\r\npumps\r\npunch\r\npunny\r\npunts\r\npupae\r\npupal\r\npupas\r\npupil\r\npuppy\r\npuree\r\npurer\r\npurls\r\npurrs\r\npurse\r\npurty\r\npushy\r\npussy\r\nputts\r\nputty\r\npylon\r\npyres"
  },
  {
    "path": "src/games/verbix/words_16/r.txt",
    "content": "\r\nraced\r\nracer\r\nraces\r\nradar\r\nradii\r\nradio\r\nradon\r\nraids\r\nrails\r\nrains\r\nrainy\r\nraise\r\nrally\r\nramps\r\nranch\r\nrands\r\nrandy\r\nrants\r\nraped\r\nraper\r\nrapes\r\nrapid\r\nrarer\r\nrasae\r\nrasps\r\nraspy\r\nrated\r\nrater\r\nrates\r\nraths\r\nratio\r\nratty\r\nrayed\r\nrayon\r\nreach\r\nreact\r\nreads\r\nready\r\nrealm\r\nreals\r\nreams\r\nreaps\r\nrearm\r\nrears\r\nrecap\r\nrecta\r\nrecto\r\nrecur\r\nrecut\r\nredid\r\nredip\r\nredly\r\nreeds\r\nreedy\r\nreels\r\nreins\r\nrelay\r\nrelet\r\nrelic\r\nreman\r\nremap\r\nremit\r\nrenal\r\nrends\r\nrente\r\nrents\r\nrepay\r\nrepel\r\nreply\r\nrepro\r\nreran\r\nrerun\r\nresay\r\nreset\r\nresin\r\nrests\r\nretch\r\nretro\r\nretry\r\nreuse\r\nrheas\r\nrheum\r\nrhino\r\nrhyme\r\nrials\r\nriced\r\nricer\r\nrices\r\nrider\r\nrides\r\nriled\r\nriles\r\nrille\r\nrills\r\nrimed\r\nrimer\r\nrimes\r\nrinds\r\nrinse\r\nriots\r\nripen\r\nriper\r\nrisen\r\nriser\r\nrises\r\nrites\r\nroach\r\nroads\r\nroams\r\nroans\r\nroars\r\nroast\r\nrodeo\r\nroids\r\nroils\r\nroily\r\nroles\r\nrolls\r\nroman\r\nromps\r\nrondo\r\nroods\r\nrooms\r\nroomy\r\nroost\r\nroots\r\nrooty\r\nroped\r\nroper\r\nropes\r\nroses\r\nrosin\r\nrotor\r\nround\r\nrouse\r\nroust\r\nroute\r\nrouts\r\nroyal\r\nruche\r\nruddy\r\nruder\r\nruins\r\nruled\r\nruler\r\nrules\r\nrumen\r\nrummy\r\nrumor\r\nrumps\r\nrunes\r\nrunic\r\nrunny\r\nrunts\r\nrunty\r\nrupee\r\nrural\r\nruses\r\nrusse\r\nrusts\r\nrusty\r\nrutty"
  },
  {
    "path": "src/games/verbix/words_16/s.txt",
    "content": "\r\nsadly\r\nsails\r\nsaint\r\nsaith\r\nsalad\r\nsales\r\nsally\r\nsalon\r\nsalsa\r\nsalts\r\nsalty\r\nsands\r\nsandy\r\nsaner\r\nsappy\r\nsaran\r\nsaris\r\nsassy\r\nsated\r\nsates\r\nsatin\r\nsatyr\r\nsauce\r\nsaucy\r\nsauna\r\nsaute\r\nsayer\r\nscads\r\nscald\r\nscale\r\nscalp\r\nscaly\r\nscamp\r\nscams\r\nscans\r\nscant\r\nscare\r\nscarp\r\nscars\r\nscary\r\nscats\r\nscene\r\nscent\r\nschmo\r\nscion\r\nscold\r\nscone\r\nscoop\r\nscoot\r\nscope\r\nscops\r\nscore\r\nscorn\r\nscour\r\nscout\r\nscram\r\nscrap\r\nscrim\r\nscrip\r\nscrod\r\nscrum\r\nscudi\r\nscudo\r\nscuds\r\nscull\r\nscums\r\nscuse\r\nseals\r\nseams\r\nseamy\r\nsears\r\nseats\r\nsecco\r\nsects\r\nsedan\r\nseder\r\nsedum\r\nseeds\r\nseedy\r\nseems\r\nseeps\r\nseers\r\nseest\r\nseeth\r\nseine\r\nselah\r\nsells\r\nsemen\r\nsemis\r\nsends\r\nsense\r\nsepal\r\nsepia\r\nsepoy\r\nsepta\r\nserum\r\nsetup\r\nshade\r\nshads\r\nshady\r\nshahs\r\nshale\r\nshall\r\nshalt\r\nshame\r\nshams\r\nshape\r\nshard\r\nshare\r\nsharp\r\nshays\r\nshear\r\nsheds\r\nsheen\r\nsheep\r\nsheer\r\nsheet\r\nshell\r\nsherd\r\nshied\r\nshier\r\nshies\r\nshill\r\nshims\r\nshine\r\nshins\r\nshiny\r\nships\r\nshire\r\nshirr\r\nshirt\r\nshish\r\nshits\r\nshlep\r\nshmoo\r\nshnor\r\nshoal\r\nshoat\r\nshoed\r\nshoer\r\nshoes\r\nshone\r\nshoos\r\nshoot\r\nshops\r\nshore\r\nshorn\r\nshort\r\nshots\r\nshout\r\nshred\r\nshuns\r\nshunt\r\nshush\r\nshute\r\nshuts\r\nshyer\r\nshyly\r\nsided\r\nsides\r\nsidle\r\nsills\r\nsilly\r\nsilos\r\nsilts\r\nsilty\r\nsince\r\nsines\r\nsinus\r\nsired\r\nsiree\r\nsiren\r\nsires\r\nsirup\r\nsisal\r\nsissy\r\nsitar\r\nsited\r\nsites\r\nsitus\r\nslain\r\nslams\r\nslant\r\nslaps\r\nslash\r\nslate\r\nslats\r\nslays\r\nsleds\r\nsleep\r\nsleet\r\nslept\r\nslice\r\nslide\r\nslier\r\nslily\r\nslime\r\nslims\r\nslimy\r\nslips\r\nslits\r\nsloes\r\nslomo\r\nsloop\r\nslope\r\nslops\r\nslosh\r\nsloth\r\nslots\r\nslued\r\nslues\r\nslump\r\nslums\r\nslurp\r\nslurs\r\nslush\r\nsluts\r\nslyer\r\nslyly\r\nsmall\r\nsmart\r\nsmash\r\nsmear\r\nsmell\r\nsmelt\r\nsmile\r\nsmite\r\nsmith\r\nsmote\r\nsmuts\r\nsnail\r\nsnaps\r\nsnare\r\nsnarl\r\nsneer\r\nsnide\r\nsnipe\r\nsnips\r\nsnits\r\nsnood\r\nsnoop\r\nsnoot\r\nsnore\r\nsnort\r\nsnots\r\nsnout\r\nsoaps\r\nsoapy\r\nsoars\r\nsocle\r\nsodas\r\nsoils\r\nsolar\r\nsoled\r\nsoles\r\nsolid\r\nsolon\r\nsolos\r\nsolum\r\nsomas\r\nsonar\r\nsonic\r\nsonly\r\nsonny\r\nsooth\r\nsoots\r\nsooty\r\nsoppy\r\nsorer\r\nsores\r\nsorry\r\nsorta\r\nsorts\r\nsouls\r\nsound\r\nsoups\r\nsoupy\r\nsours\r\nsouse\r\nsouth\r\nsoyas\r\nspace\r\nspacy\r\nspade\r\nspans\r\nspare\r\nspars\r\nspasm\r\nspate\r\nspats\r\nspays\r\nspear\r\nspecs\r\nspeed\r\nspell\r\nspelt\r\nspend\r\nspent\r\nsperm\r\nspice\r\nspics\r\nspicy\r\nspied\r\nspiel\r\nspier\r\nspies\r\nspill\r\nspilt\r\nspina\r\nspine\r\nspins\r\nspiny\r\nspire\r\nspite\r\nspits\r\nsplat\r\nsplay\r\nsplit\r\nspoil\r\nspool\r\nspoon\r\nspoor\r\nspore\r\nsport\r\nspots\r\nspout\r\nsprat\r\nspray\r\nspree\r\nsprit\r\nsprue\r\nspuds\r\nspued\r\nspume\r\nspumy\r\nspurn\r\nspurs\r\nspurt\r\nsputa\r\nstaid\r\nstain\r\nstair\r\nstale\r\nstall\r\nstamp\r\nstand\r\nstaph\r\nstare\r\nstars\r\nstart\r\nstash\r\nstate\r\nstats\r\nstays\r\nstead\r\nsteal\r\nsteam\r\nsteed\r\nsteel\r\nsteep\r\nsteer\r\nstein\r\nstela\r\nstele\r\nstems\r\nsteno\r\nsteps\r\nstern\r\nstets\r\nstied\r\nsties\r\nstile\r\nstill\r\nstilt\r\nstint\r\nstirs\r\nstoae\r\nstoas\r\nstoat\r\nstoic\r\nstole\r\nstoma\r\nstomp\r\nstone\r\nstony\r\nstood\r\nstool\r\nstoop\r\nstops\r\nstore\r\nstorm\r\nstory\r\nstoup\r\nstout\r\nstrap\r\nstray\r\nstrep\r\nstrip\r\nstrop\r\nstrum\r\nstrut\r\nstuds\r\nstudy\r\nstump\r\nstuns\r\nstunt\r\nstyes\r\nstyle\r\nstyli\r\nsudsy\r\nsuede\r\nsuers\r\nsuets\r\nsuety\r\nsuite\r\nsuits\r\nsully\r\nsumac\r\nsumma\r\nsumps\r\nsunny\r\nsunup\r\nsuper\r\nsupes\r\nsupra\r\nsuras\r\nsurds\r\nsurer\r\nsurly\r\nsushi\r\nsutra\r\nsylph\r\nsynch\r\nsyncs\r\nsynod\r\nsyrup"
  },
  {
    "path": "src/games/verbix/words_16/t.txt",
    "content": "\r\ntacet\r\ntacit\r\ntacos\r\ntacts\r\ntaels\r\ntails\r\ntaint\r\ntalcs\r\ntales\r\ntally\r\ntalon\r\ntalus\r\ntamed\r\ntamer\r\ntames\r\ntamps\r\ntansy\r\ntaped\r\ntaper\r\ntapes\r\ntapir\r\ntapis\r\ntardy\r\ntared\r\ntares\r\ntarns\r\ntaros\r\ntarot\r\ntarps\r\ntarry\r\ntarts\r\ntaste\r\ntasty\r\ntater\r\ntatty\r\ntaunt\r\ntaupe\r\nteach\r\nteals\r\nteams\r\ntears\r\nteary\r\ntease\r\nteats\r\ntechs\r\ntechy\r\ntecum\r\nteddy\r\nteems\r\nteens\r\nteeny\r\nteeth\r\ntells\r\ntelly\r\ntempi\r\ntempo\r\ntemps\r\ntempt\r\ntench\r\ntends\r\ntenet\r\ntenon\r\ntenor\r\ntense\r\ntenth\r\ntents\r\ntepee\r\ntepid\r\nterce\r\nterms\r\nterns\r\nterra\r\nterry\r\nterse\r\ntesla\r\ntests\r\ntesty\r\ntetra\r\nthane\r\nthats\r\nthees\r\ntheir\r\ntheme\r\nthens\r\nthere\r\ntherm\r\nthese\r\ntheta\r\nthine\r\nthins\r\nthird\r\nthorn\r\nthose\r\nthous\r\nthree\r\nthroe\r\nthrum\r\nthuds\r\nthump\r\nthyme\r\ntiara\r\ntidal\r\ntided\r\ntides\r\ntiers\r\ntilde\r\ntiled\r\ntiler\r\ntiles\r\ntills\r\ntilth\r\ntilts\r\ntimed\r\ntimer\r\ntimes\r\ntimid\r\ntines\r\ntinny\r\ntints\r\ntippy\r\ntipsy\r\ntired\r\ntires\r\ntiros\r\ntitan\r\ntiter\r\ntithe\r\ntitle\r\ntitre\r\ntitty\r\ntoads\r\ntoady\r\ntoast\r\ntoday\r\ntoddy\r\ntoile\r\ntoils\r\ntolls\r\ntomes\r\ntommy\r\ntonal\r\ntoned\r\ntoner\r\ntones\r\ntonic\r\ntools\r\ntoons\r\ntooth\r\ntoots\r\ntoped\r\ntoper\r\ntopes\r\ntopic\r\ntopoi\r\ntopos\r\ntorah\r\ntorch\r\ntoric\r\ntorsi\r\ntorso\r\ntorte\r\ntorts\r\ntorus\r\ntotal\r\ntoted\r\ntotem\r\ntoter\r\ntotes\r\ntotty\r\ntouch\r\ntours\r\ntouts\r\ntoyed\r\ntoyer\r\ntoyon\r\ntrace\r\ntract\r\ntrade\r\ntrail\r\ntrain\r\ntrait\r\ntramp\r\ntrams\r\ntrans\r\ntraps\r\ntrash\r\ntrays\r\ntread\r\ntreap\r\ntreat\r\ntreed\r\ntrees\r\ntrend\r\ntress\r\ntreys\r\ntriad\r\ntrial\r\ntrice\r\ntried\r\ntrier\r\ntries\r\ntrill\r\ntrims\r\ntrios\r\ntripe\r\ntrips\r\ntrite\r\ntroll\r\ntromp\r\ntroop\r\ntroth\r\ntrots\r\ntrout\r\ntruce\r\ntrued\r\ntruer\r\ntrues\r\ntruly\r\ntrump\r\ntruss\r\ntrust\r\ntruth\r\ntryst\r\ntsars\r\ntuans\r\ntulip\r\ntulle\r\ntummy\r\ntumor\r\ntunas\r\ntuned\r\ntuner\r\ntunes\r\ntunic\r\ntunny\r\ntuple\r\nturds\r\nturdy\r\nturns\r\nturps\r\ntutor\r\ntutti\r\ntutus\r\ntypal\r\ntyped\r\ntypes\r\ntypos\r\ntyres\r\ntyros"
  },
  {
    "path": "src/games/verbix/words_16/u.txt",
    "content": "\r\nudder\r\nulcer\r\nulnar\r\nulnas\r\nultra\r\numped\r\numpty\r\nunapt\r\nunarc\r\nunarm\r\nunary\r\nunate\r\nuncap\r\nuncle\r\nuncut\r\nunder\r\nundid\r\nundue\r\nunhip\r\nunhit\r\nunion\r\nunite\r\nunits\r\nunity\r\nunlit\r\nunman\r\nunmap\r\nunmet\r\nunpin\r\nunsay\r\nunsee\r\nunset\r\nuntie\r\nuntil\r\nupend\r\nupped\r\nupper\r\nupset\r\nureas\r\nurine\r\nusers\r\nusher\r\nusual\r\nusurp\r\nusury\r\nuteri\r\nutero\r\nutter"
  },
  {
    "path": "src/games/verbix/words_16/word_frequency.txt",
    "content": "https://www3.nd.edu/~busiforc/handouts/cryptography/letterfrequencies.html\r\n\r\n \t\r\nE \t11.1607% \t56.88 \tM \t3.0129% \t15.36\r\nA \t8.4966% \t43.31 \tH \t3.0034% \t15.31\r\nR \t7.5809% \t38.64 \tG \t2.4705% \t12.59\r\nI \t7.5448% \t38.45 \tB \t2.0720% \t10.56\r\nO \t7.1635% \t36.51 \tF \t1.8121% \t9.24\r\nT \t6.9509% \t35.43 \tY \t1.7779% \t9.06\r\nN \t6.6544% \t33.92 \tW \t1.2899% \t6.57\r\nS \t5.7351% \t29.23 \tK \t1.1016% \t5.61\r\nL \t5.4893% \t27.98 \tV \t1.0074% \t5.13\r\nC \t4.5388% \t23.13 \tX \t0.2902% \t1.48\r\nU \t3.6308% \t18.51 \tZ \t0.2722% \t1.39\r\nD \t3.3844% \t17.25 \tJ \t0.1965% \t1.00\r\nP \t3.1671% \t16.14 \tQ \t0.1962% \t(1)\r\n\r\n\r\nE A R I O T N S L C U D P M H (G->Y)\r\n[eariotnslcudpmhy]{5} -> 2656\r\n\r\nE 3009\r\nA 2348\r\n\r\nR 1910\r\nI 1592\r\n\r\n\r\nU 1089\r\nD 1191\r\nP 955\r\n----\r\nM 843\r\nH 814\r\nG 679\r\nB 715\r\nF 561\r\nY 886\r\nW 505\r\nK 596\r\nV 318"
  },
  {
    "path": "src/games/verbix/words_16/words_16letters.txt",
    "content": "there\r\ntheir\r\nthese\r\nother\r\ncould\r\nthree\r\nyears\r\nplace\r\nsound\r\nstill\r\nsmall\r\nthose\r\nunder\r\nhouse\r\nuntil\r\nshall\r\nearth\r\nsince\r\nstudy\r\npaper\r\nparts\r\nstory\r\npoint\r\ntimes\r\nheard\r\nmeans\r\nmusic\r\nmiles\r\ntoday\r\nlater\r\nmoney\r\nlines\r\norder\r\nlearn\r\nspace\r\nearly\r\ntrees\r\nshort\r\nhands\r\nstate\r\nstood\r\ncomes\r\nclose\r\nheart\r\nready\r\nclass\r\nround\r\nhorse\r\npiece\r\nstand\r\nstart\r\ntried\r\nleast\r\nadded\r\ncolor\r\nthird\r\nhours\r\nplant\r\nnames\r\nideas\r\ncried\r\nalone\r\nplane\r\nspell\r\ncarry\r\nclear\r\nnamed\r\nchild\r\nhuman\r\nparty\r\nseems\r\nsides\r\nmouth\r\nnorth\r\ndeath\r\nhappy\r\ntells\r\nshape\r\nsteps\r\nareas\r\nsense\r\nocean\r\nspeed\r\nmetal\r\nsouth\r\nscale\r\ncells\r\nsleep\r\nships\r\nneeds\r\ntotal\r\nahead\r\nreach\r\nstars\r\nstore\r\nterms\r\ncatch\r\nstone\r\ndance\r\ncause\r\nradio\r\nlands\r\ntrade\r\nmeant\r\nspent\r\nlocal\r\ntrain\r\nhomes\r\nteeth\r\ncoast\r\nclean\r\nsteel\r\nrules\r\nnotes\r\nunits\r\npeace\r\nmonth\r\nseeds\r\nhelps\r\nsharp\r\ncross\r\ncases\r\ncrops\r\nsheep\r\nnouns\r\nplain\r\napart\r\nturns\r\ntouch\r\ntired\r\nolder\r\nspend\r\nshoes\r\nchair\r\ncents\r\nempty\r\nstyle\r\npairs\r\ncount\r\nscore\r\nshore\r\nroots\r\npaint\r\nheads\r\ndress\r\nshare\r\nnoise\r\nsolid\r\ncloth\r\nhills\r\ntypes\r\npiano\r\nupper\r\nusual\r\nproud\r\ncourt\r\nmodel\r\nprime\r\nplans\r\nyards\r\ntools\r\nprice\r\nsheet\r\nsmell\r\nraise\r\nmatch\r\ntruth\r\nroads\r\nenemy\r\nlunch\r\nchart\r\nscene\r\ntopic\r\nplate\r\ntitle\r\ncloud\r\nplays\r\nenter\r\nsteam\r\natoms\r\npress\r\ntaste\r\nstorm\r\nsmile\r\nhurry\r\nsorry\r\ntrail\r\ndaily\r\ncream\r\nteach\r\ndream\r\noccur\r\nended\r\nchord\r\nholes\r\napple\r\nouter\r\npitch\r\nruler\r\nholds\r\ncosts\r\ncalls\r\neaten\r\nyouth\r\ntones\r\nhonor\r\ndoors\r\npoles\r\nloose\r\napply\r\ntears\r\nchest\r\nlayer\r\nminor\r\ntests\r\nitems\r\nhoped\r\nstrip\r\naside\r\ndepth\r\ncandy\r\nshell\r\nrooms\r\nranch\r\naloud\r\ndried\r\nmotor\r\npound\r\nchain\r\nshirt\r\ndrops\r\nspite\r\nshoot\r\nslept\r\nshade\r\nclaim\r\ntheme\r\nunion\r\nhence\r\nentry\r\nissue\r\nrhyme\r\nyours\r\nnoted\r\nroute\r\nuncle\r\nroyal\r\ntrial\r\ncards\r\nopera\r\nchose\r\nmouse\r\nmeter\r\ninner\r\npoems\r\nsolar\r\ntruly\r\ntense\r\nsplit\r\nrises\r\nhotel\r\nstems\r\npride\r\npilot\r\nsales\r\nacres\r\nsteep\r\nslide\r\nerror\r\nporch\r\nmines\r\nmarry\r\nraced\r\ntrust\r\nmills\r\nspots\r\nadult\r\nnails\r\nhorns\r\nrates\r\ndrill\r\ntrace\r\nseats\r\nratio\r\nminds\r\ndirty\r\nsilly\r\ncoins\r\nhello\r\ntrips\r\nleads\r\nhopes\r\nshine\r\nmoral\r\nmeals\r\nshops\r\ncycle\r\nslope\r\ncanoe\r\nteams\r\nshout\r\ncanal\r\nreply\r\nruled\r\ncrust\r\nmidst\r\nprint\r\ntales\r\ncoach\r\nmarch\r\nlimit\r\nreads\r\ndairy\r\nlists\r\nstops\r\nrapid\r\nlions\r\ntries\r\narmed\r\ntreat\r\nhoney\r\nmoist\r\npenny\r\naltar\r\npulls\r\nsport\r\ndrums\r\ndates\r\ntails\r\npause\r\nherds\r\narose\r\nhated\r\nclues\r\nshame\r\nraces\r\nheels\r\ncoats\r\nspare\r\nshiny\r\nalarm\r\ndimes\r\nmercy\r\nsunny\r\nshone\r\npipes\r\nsuits\r\nsmart\r\nupset\r\nrains\r\nsandy\r\nrainy\r\nsadly\r\nrider\r\nunity\r\nrolls\r\ncrash\r\nhatch\r\npaths\r\ntides\r\nadmit\r\nsails\r\npupil\r\ncruel\r\ndrama\r\npatch\r\nnests\r\nacted\r\narise\r\nropes\r\nshots\r\nmerry\r\nphone\r\nideal\r\ncries\r\nashes\r\nstall\r\nyield\r\nmayor\r\nopens\r\ninput\r\ntooth\r\npoets\r\napron\r\nspear\r\nstamp\r\npaste\r\nrural\r\nchase\r\nslice\r\nslant\r\nnoisy\r\nsorts\r\nstays\r\npiled\r\ncheer\r\ntenth\r\nhides\r\ncomma\r\nspoon\r\nstern\r\ncrept\r\nmaple\r\ndeeds\r\nrides\r\nmuddy\r\ncrime\r\ndusty\r\ntempo\r\nhumor\r\nsends\r\nsteal\r\ntents\r\nroses\r\ncheap\r\ndense\r\nlinen\r\nposts\r\nhired\r\nsalad\r\ntires\r\npolar\r\ntends\r\npearl\r\nloads\r\nhears\r\nloses\r\nhosts\r\nphase\r\ntoads\r\nalert\r\nseams\r\ncoral\r\npuppy\r\nspoil\r\nmacro\r\nsteer\r\nspray\r\ndecay\r\nports\r\nminus\r\ntunes\r\nstare\r\ndared\r\ncrude\r\npants\r\ntonal\r\nradar\r\nhairs\r\ndolls\r\ncared\r\nscent\r\npanel\r\nprism\r\nlamps\r\npeach\r\nruins\r\nrally\r\nsells\r\ncools\r\ncharm\r\ndelay\r\narray\r\nharsh\r\ncamel\r\npurse\r\ntoast\r\nsoils\r\nsauce\r\nponds\r\npools\r\nreeds\r\nsheer\r\nmelts\r\nrisen\r\narmor\r\npiles\r\naimed\r\nlemon\r\nditch\r\nrests\r\nchill\r\nslain\r\npanic\r\ncords\r\ntuned\r\ncrisp\r\nstole\r\nmolds\r\nyarns\r\nstool\r\ndiary\r\nrails\r\ntrend\r\nactor\r\nhandy\r\nhaste\r\nscope\r\ndeals\r\nmoons\r\nessay\r\nthump\r\ndealt\r\npalms\r\ncones\r\nroast\r\ntidal\r\nchant\r\nacids\r\ncamps\r\nmales\r\ncocoa\r\npunch\r\nreins\r\nninth\r\nnoses\r\ndrain\r\nnylon\r\nlunar\r\npulse\r\nsites\r\nmoths\r\nmeats\r\nmined\r\nattic\r\nmount\r\nrusty\r\nscare\r\ntraps\r\nreact\r\ncease\r\nprior\r\npolio\r\nloyal\r\nsalty\r\nmarsh\r\nmound\r\nseals\r\nmules\r\nscout\r\nacute\r\nstout\r\nhilly\r\nlords\r\ndunes\r\ntrout\r\nhalls\r\ncoals\r\nsouls\r\nelect\r\npumps\r\nloans\r\nspins\r\npains\r\nphoto\r\nsyrup\r\nrodeo\r\nsands\r\nmoose\r\npints\r\ncurly\r\ncomic\r\nonion\r\nclams\r\nscrap\r\ndidst\r\ncouch\r\ncodes\r\nounce\r\nutter\r\nalley\r\ntiles\r\ncrest\r\nelder\r\nyeast\r\nerect\r\nmedal\r\nroles\r\nhound\r\nsnail\r\nalter\r\nrelay\r\nloops\r\nmodes\r\nrealm\r\nrayon\r\nstray\r\nlumps\r\ndread\r\nmasts\r\npours\r\ncurse\r\nplump\r\ncedar\r\ncurls\r\nmyths\r\npedal\r\nanode\r\nslash\r\ncreep\r\nchips\r\ncares\r\nmotel\r\nclamp\r\nalien\r\nstrap\r\nstump\r\nidols\r\ncarts\r\nalloy\r\nlasts\r\noddly\r\ncrane\r\nslips\r\ntroop\r\nsuite\r\ntramp\r\natlas\r\nodors\r\nspine\r\nleaps\r\nprose\r\nsnare\r\nmoods\r\nhumid\r\ndimly\r\nchina\r\npines\r\nlathe\r\nscalp\r\nadopt\r\nclump\r\nperch\r\ntumor\r\nteens\r\ntract\r\nunite\r\neased\r\ndarts\r\nchoir\r\npouch\r\npinch\r\nhairy\r\ntorch\r\nheats\r\nusers\r\nmadam\r\naided\r\nnurse\r\nchaos\r\ncured\r\nample\r\nlease\r\nmerit\r\ncolts\r\nshear\r\nsleds\r\nmaids\r\nmeets\r\nhymns\r\nhints\r\ncoils\r\nspied\r\nstead\r\ntamed\r\nthorn\r\ntease\r\narena\r\nstunt\r\nshady\r\nnotch\r\notter\r\npears\r\nached\r\nspout\r\nsmote\r\nadapt\r\ntasty\r\nstoop\r\nclips\r\nlanes\r\nimply\r\ndemon\r\nsuper\r\nhardy\r\ntyped\r\nhates\r\ntimid\r\nserum\r\nrotor\r\ncasts\r\nplots\r\ntrait\r\nresin\r\nslums\r\nlyric\r\nmourn\r\nheaps\r\nsaint\r\nsonar\r\naunts\r\ntonic\r\ncorps\r\nrepay\r\nniece\r\ncello\r\nneedy\r\nstony\r\nmedia\r\nhurts\r\nrepel\r\ndated\r\nhunts\r\nmists\r\ndries\r\nmates\r\nspice\r\noasis\r\nspurs\r\npaces\r\ncolon\r\nstrum\r\ndrier\r\ncacao\r\nhumus\r\npiped\r\nnasty\r\nrinse\r\namuse\r\ncited\r\ndelta\r\nladen\r\nrents\r\nyells\r\nspool\r\nspill\r\ncrush\r\nsnaps\r\nstain\r\nslits\r\nrated\r\neerie\r\nsmash\r\nplums\r\nearns\r\nscary\r\ntutor\r\nsnout\r\nperil\r\nyacht\r\nliner\r\ncomet\r\nscars\r\nchops\r\nraids\r\neater\r\nslate\r\nsoles\r\nmisty\r\nurine\r\nsleet\r\nholly\r\npests\r\ntrays\r\npails\r\ntenor\r\ncarol\r\ncanon\r\nminer\r\npolls\r\nnasal\r\nscorn\r\nchess\r\ncrate\r\nshyly\r\ntulip\r\nnymph\r\ndepot\r\noases\r\nasses\r\nsheds\r\npills\r\nthine\r\ntimed\r\ninert\r\ntrash\r\nclash\r\nspore\r\nmadly\r\npaced\r\nmotto\r\nspies\r\nmucus\r\ndiscs\r\nerase\r\nposed\r\nasset\r\ncider\r\ntaper\r\nchurn\r\nsatin\r\nslots\r\nsloth\r\nshale\r\ntread\r\ncurds\r\nmanor\r\naisle\r\nloins\r\nstair\r\ntapes\r\nleans\r\nlance\r\npanes\r\nheirs\r\ncaste\r\ndummy\r\npores\r\npoise\r\nepoch\r\npelts\r\nirony\r\nirons\r\ndiets\r\ntally\r\nriots\r\nroars\r\nlooms\r\nscold\r\ndandy\r\npupae\r\nducts\r\nlends\r\nscoop\r\nrouse\r\nsalts\r\nhitch\r\nleash\r\ndined\r\nchute\r\nsnort\r\nmelon\r\ncheat\r\nllama\r\nlasso\r\noaths\r\nprone\r\nstale\r\ninlet\r\npinto\r\nuntie\r\nchore\r\nstirs\r\nonset\r\npaddy\r\nlaced\r\npoppy\r\nnicer\r\nundue\r\nsnarl\r\ndoses\r\ndaddy\r\nroost\r\npetty\r\ncolds\r\ncurry\r\nmessy\r\ncores\r\nripen\r\namino\r\nplaid\r\nspiny\r\npeers\r\npious\r\nidiom\r\nchili\r\nrites\r\nhasty\r\nlatch\r\nmirth\r\nplead\r\nmummy\r\nhotly\r\nchaps\r\nmumps\r\nemery\r\ndrone\r\nidiot\r\nannoy\r\nroped\r\nscant\r\nlousy\r\nspurt\r\neasel\r\nlaces\r\nhumps\r\nrumor\r\naroma\r\nhorde\r\nleapt\r\nopium\r\nslime\r\npansy\r\nmares\r\nsoaps\r\nsnips\r\nlined\r\npiers\r\nsteed\r\nmossy\r\npsalm\r\ntours\r\nlaser\r\ntruss\r\nhares\r\ncreed\r\nlilac\r\nsiren\r\ntarry\r\nmuted\r\ncures\r\nhoops\r\nhoods\r\nniche\r\nyucca\r\ndroop\r\nmails\r\nclasp\r\nstint\r\nchamp\r\npiety\r\nchirp\r\npleat\r\nposse\r\nsunup\r\nmenus\r\nerupt\r\nolden\r\ncramp\r\nposes\r\nmanly\r\nslump\r\nstrut\r\nsloop\r\nroach\r\ndials\r\nplume\r\nslaps\r\nsoups\r\ndully\r\nsolos\r\ntotem\r\nmused\r\nmains\r\nmyrrh\r\nsisal\r\nshuts\r\nhoses\r\ndryly\r\nseeps\r\ndenim\r\nputty\r\nspans\r\nadorn\r\nhaunt\r\ndares\r\nsmelt\r\naches\r\nclaps\r\nundid\r\nspicy\r\nhoist\r\nacorn\r\npussy\r\nmusty\r\ntarts\r\nhunch\r\ntruce\r\ndryer\r\nloser\r\nmoles\r\nlapse\r\nautos\r\ndomes\r\nsheen\r\nspade\r\nslyly\r\nstuds\r\ndonor\r\naspen\r\nhomer\r\ntithe\r\nhalts\r\nruddy\r\nladle\r\ntaunt\r\nsnore\r\nprops\r\nprune\r\npesos\r\nradii\r\ntiled\r\ndaisy\r\nheron\r\ncites\r\nhyena\r\nlusty\r\nsonic\r\nsmith\r\nusher\r\nmolts\r\nsects\r\nspars\r\ndumps\r\nscaly\r\nsores\r\nmince\r\npanda\r\nplied\r\npatio\r\npetal\r\npolyp\r\ntints\r\ntroll\r\ntolls\r\nrelic\r\nphony\r\naptly\r\nulcer\r\nsoapy\r\ndiner\r\ntaped\r\ncadet\r\nnoose\r\nmores\r\nslimy\r\naides\r\nspasm\r\nlymph\r\nsaucy\r\nliter\r\nenact\r\nlured\r\nomens\r\nnears\r\nmoody\r\nalder\r\nsassy\r\nprays\r\nhauls\r\ntilts\r\nstomp\r\ntempt\r\ncapes\r\nmesas\r\nomits\r\ntepee\r\nharry\r\nlimes\r\ncanes\r\nlithe\r\nloath\r\noutdo\r\ndeter\r\nastir\r\nspire\r\nlucid\r\nhulls\r\nslats\r\ncinch\r\ncalms\r\ncoded\r\nmason\r\nisles\r\nclods\r\nadept\r\nsedan\r\nclays\r\nmanes\r\nadore\r\nsneer\r\nroomy\r\nplush\r\npaled\r\nscamp\r\nrarer\r\namend\r\nnines\r\npecan\r\npence\r\nsills\r\nnomad\r\nmiter\r\ndomed\r\nheath\r\nmoors\r\naorta\r\ncheep\r\nlures\r\ntunic\r\nslams\r\ndumpy\r\nmania\r\nspits\r\ntrots\r\nnosed\r\nmiddy\r\nstile\r\nsperm\r\ncopra\r\namiss\r\nlurch\r\npopes\r\nchins\r\ntines\r\nshoal\r\ncache\r\ntapir\r\natoll\r\ndeity\r\ntoils\r\nspree\r\nscans\r\nshorn\r\nhoary\r\nreels\r\nmimic\r\ncorny\r\ntruer\r\ntorso\r\nedict\r\nrecur\r\nsurer\r\nmoldy\r\nliars\r\ninept\r\nleper\r\nsoars\r\ncater\r\nsided\r\nyearn\r\ndecoy\r\nheals\r\npleas\r\nspilt\r\ncarat\r\nchimp\r\nsodas\r\nclout\r\nmites\r\nsurly\r\npurer\r\nmired\r\npaler\r\nmamma\r\nteddy\r\nmoans\r\nallot\r\nlouse\r\nerred\r\nardor\r\npored\r\nrondo\r\nloped\r\nhires\r\nthuds\r\nester\r\nlyres\r\nlotus\r\nlurid\r\nhutch\r\nthyme\r\ntommy\r\nepics\r\ntrill\r\ncaper\r\nchime\r\nleech\r\nsmite\r\nerode\r\nhoard\r\nconic\r\nmushy\r\nrumps\r\nshalt\r\ntoots\r\ncooed\r\nrusts\r\nshred\r\nclots\r\ndents\r\npoled\r\nreams\r\ntepid\r\ntaint\r\nopals\r\nmiser\r\ncoyly\r\nslosh\r\naphid\r\nhydra\r\nchide\r\nallay\r\naltos\r\neases\r\nmeted\r\nchasm\r\nimpel\r\nduets\r\ntardy\r\nultra\r\nmeaty\r\nsuede\r\narson\r\nchums\r\nhalos\r\nscour\r\nenema\r\nharps\r\ncoupe\r\nmolar\r\nmints\r\nashen\r\nmunch\r\nacrid\r\nclans\r\nslurs\r\nemits\r\npumas\r\nmends\r\nplies\r\ncanny\r\nhoots\r\nlamed\r\nmated\r\nditty\r\nthins\r\neider\r\nmulch\r\namass\r\ndamps\r\nmorns\r\npalsy\r\ncroon\r\nconch\r\nudder\r\ntacos\r\npreen\r\naster\r\nadder\r\npulpy\r\noptic\r\nshins\r\ntotes\r\nscoot\r\ndears\r\nmutes\r\ntrims\r\ndoted\r\nshuns\r\nlulls\r\nseers\r\npined\r\nmooed\r\ndines\r\ntripe\r\ndrips\r\nodder\r\nantic\r\nsidle\r\npithy\r\nyelps\r\nscram\r\ntiers\r\ndoled\r\nirate\r\ncoped\r\nhails\r\nelude\r\naired\r\ncocci\r\npacts\r\nsilos\r\ndusts\r\nyodel\r\nterse\r\nslays\r\npreys\r\nassay\r\ntrite\r\nlutes\r\ndosed\r\nsnipe\r\nteems\r\nupped\r\ndoped\r\nshush\r\nrinds\r\nslush\r\nmoron\r\ntoted\r\nsaner\r\ndrape\r\npatty\r\ntiara\r\nhomey\r\nmoped\r\nrunts\r\nrills\r\ncorns\r\npries\r\nloons\r\ntsars\r\ndatum\r\nicily\r\nlemur\r\nsilts\r\nplods\r\nramps\r\ntress\r\nearls\r\ndudes\r\npeons\r\nhorny\r\npales\r\nlairs\r\nlynch\r\nidler\r\nensue\r\natone\r\nscald\r\nadios\r\ncynic\r\ndulls\r\nmemos\r\ndales\r\npeels\r\npeals\r\nsinus\r\ncrone\r\nhinds\r\nenrol\r\nroams\r\nduped\r\ncysts\r\nmitts\r\nspats\r\ncoops\r\ntalcs\r\nheeds\r\nduels\r\nlapel\r\ncleat\r\nedits\r\nmoats\r\nsmear\r\nprods\r\nrasps\r\ntames\r\nceded\r\nlarch\r\ndoles\r\nmamas\r\npried\r\naspic\r\nmealy\r\npenis\r\npupas\r\npeony\r\ndouse\r\ndarns\r\nchats\r\ninane\r\nstilt\r\nshyer\r\nslops\r\ndolts\r\ndrool\r\ndells\r\nhippy\r\nether\r\ncocos\r\ntrios\r\nsirup\r\nlaths\r\nleers\r\npasta\r\nlopes\r\nalias\r\ndiced\r\nlodes\r\nidled\r\nplait\r\nmalts\r\ntoyed\r\nsties\r\nracer\r\netude\r\nmicas\r\ncopse\r\nailed\r\ncroup\r\npalls\r\nmopes\r\ndoily\r\ntamer\r\npoach\r\ndamns\r\ndaunt\r\nheres\r\nidles\r\nrouts\r\nremit\r\ncopes\r\nculls\r\ndodos\r\nshams\r\nicons\r\nusurp\r\ndooms\r\nhells\r\nsoled\r\ncomas\r\nmaths\r\nlimps\r\nsours\r\nstuns\r\ncased\r\nmusts\r\ncoeds\r\nrummy\r\ndeans\r\nreaps\r\ntills\r\ntoned\r\npared\r\nscull\r\npunts\r\nsnoop\r\ndames\r\nlores\r\nmarts\r\nharms\r\nrears\r\nsatyr\r\ncolic\r\nhurls\r\nplops\r\ncruet\r\nrends\r\nloams\r\nsires\r\ncarps\r\nmuses\r\nlisps\r\npeeps\r\nsorer\r\nlolls\r\nprude\r\nscums\r\ndopes\r\nscads\r\nyeses\r\ncaned\r\nromps\r\ndunce\r\ncrony\r\ntunas\r\nmalls\r\nparch\r\ncrams\r\npares\r\ndally\r\nleach\r\npooch\r\nslyer\r\nmires\r\narced\r\nacnes\r\nneons\r\ndints\r\npouts\r\ncored\r\nyules\r\nlilts\r\nmutts\r\nspuds\r\nlames\r\ndupes\r\ndeads\r\nnoons\r\nclued\r\nmetes\r\ncuter\r\nmaims\r\ndroll\r\ncupid\r\nmauls\r\npapas\r\nloots\r\nhilts\r\ndices\r\npeppy\r\nriper\r\ncedes\r\nalums\r\nelope\r\nsoots\r\nmulls\r\nhosed\r\ncress\r\nruder\r\nousts\r\nsuets\r\nlints\r\nteals\r\nhelms\r\nnapes\r\nicier\r\npyres\r\nlards\r\ntalon\r\nmedic\r\nputts\r\ndotes\r\ntippy\r\npiths\r\nheros\r\ndirts\r\nhemps\r\nshoos\r\nparry\r\ndecal\r\ncilia\r\nsears\r\nslues\r\nlamer\r\nsaris\r\npurrs\r\ndills\r\nmeany\r\nruses\r\npulps\r\nlauds\r\nmocha\r\noiled\r\nroman\r\nethyl\r\ncacti\r\npapal\r\nelite\r\nadieu\r\nannum\r\nrhino\r\nnorms\r\nsetup\r\nterns\r\nalpha\r\nspelt\r\nephod\r\naudio\r\nmodal\r\nrosin\r\ndoers\r\nhumph\r\nmould\r\ncrepe\r\naloha\r\nriser\r\nlocus\r\nlumpy\r\ntuner\r\nmural\r\ntimer\r\ncanst\r\nlemme\r\ntriad\r\ntenon\r\namply\r\ndeeps\r\npadre\r\nleant\r\npacer\r\noctal\r\ndolly\r\ntrans\r\nsumac\r\nlolly\r\nmanna\r\nsalon\r\nduple\r\ncrier\r\ninter\r\ndilly\r\ncults\r\nreset\r\nloess\r\ndecor\r\nethic\r\ndunno\r\nsissy\r\nincur\r\nreedy\r\npiper\r\ncoons\r\nseine\r\npiney\r\nlemma\r\ntrams\r\nsaith\r\nionic\r\nheady\r\nharem\r\ntummy\r\nsally\r\nshied\r\ndross\r\ntilde\r\ninset\r\nsooty\r\ncredo\r\nyella\r\nhymen\r\nethos\r\nterra\r\nscrip\r\naleph\r\ntinny\r\nitchy\r\ntrice\r\nhenry\r\nspurn\r\npenal\r\nsonny\r\ntacit\r\nhullo\r\nhadst\r\nuncut\r\naloes\r\nlouis\r\nraped\r\ndiode\r\nmatey\r\napace\r\npeter\r\ncohos\r\nsorta\r\nnutty\r\nnatal\r\nclomp\r\nsiree\r\nrunic\r\nrupee\r\nstaid\r\nochre\r\nyummy\r\nsoupy\r\nroper\r\ncameo\r\nspate\r\ntheta\r\ndeems\r\ntelly\r\ntares\r\ncumin\r\nteeny\r\ncomer\r\nsired\r\nmammy\r\ndeary\r\nsprit\r\nrunes\r\ncadre\r\nannul\r\nanion\r\nnodes\r\nstein\r\naudit\r\nechos\r\nletup\r\neyrie\r\ncaped\r\nriled\r\npetit\r\nmiler\r\nmater\r\nmanic\r\numped\r\nstrep\r\nslurp\r\npylon\r\npuree\r\ncaret\r\ntemps\r\nseedy\r\ntreed\r\ncoups\r\nloner\r\ncirca\r\nmommy\r\ntiter\r\ncarne\r\nmotes\r\namity\r\nhippo\r\nanise\r\nimams\r\ntulle\r\nhallo\r\nopted\r\ncanto\r\nidyll\r\ncurio\r\ndotty\r\ndemur\r\ncusps\r\nspecs\r\nlaity\r\ntoner\r\ndecry\r\nsaute\r\ntipsy\r\nnatty\r\nducal\r\nmetre\r\nlusts\r\nunary\r\nsited\r\nshies\r\nhasps\r\nholed\r\nmelee\r\nloamy\r\npimps\r\ntitan\r\nshunt\r\nseder\r\nhoned\r\nannas\r\ncoypu\r\nshims\r\nnadir\r\nmonic\r\nmaned\r\nmousy\r\nprima\r\npicas\r\nmecca\r\nreals\r\ntroth\r\ntesty\r\ncrimp\r\nsplat\r\ncutie\r\npasty\r\nmoray\r\nratty\r\nislet\r\nmotet\r\nmetro\r\nchine\r\naerie\r\nemirs\r\ncoati\r\nducat\r\noomph\r\nminim\r\nstoic\r\nsynod\r\nrunty\r\ninlay\r\nlouts\r\npeaty\r\norlon\r\nhumpy\r\nradon\r\nraspy\r\nnappy\r\nyipes\r\nsitar\r\ndyers\r\ncotta\r\ncrass\r\ndacha\r\ndicta\r\nrunny\r\nunpin\r\nnudes\r\nsushi\r\nhulas\r\nachoo\r\nnodal\r\nspiel\r\nlapis\r\ncoots\r\ncaddy\r\ndrear\r\nmoult\r\narias\r\nnosey\r\npaean\r\nlacey\r\nretch\r\ntenet\r\nrumen\r\ncruse\r\nsines\r\nennui\r\nunset\r\nsated\r\nodium\r\nlatin\r\nmoire\r\nscion\r\nhenna\r\naural\r\ntempi\r\nhooch\r\nrapes\r\nharts\r\ntechs\r\nemend\r\nninny\r\nscarp\r\nsepia\r\ntomes\r\nemcee\r\nprams\r\nposer\r\nscrim\r\nrearm\r\nliens\r\nlumen\r\nchump\r\nnanny\r\ntrump\r\nchomp\r\nhomos\r\npurty\r\nmaser\r\npatsy\r\nshill\r\nahhhh\r\nnatch\r\nshish\r\ntansy\r\nsnoot\r\npayer\r\naltho\r\nsappy\r\nriles\r\nditto\r\nsepta\r\nlorry\r\nheerd\r\npayee\r\nseamy\r\napses\r\nchary\r\nphyla\r\nclime\r\nsumps\r\ncrypt\r\ninure\r\nnonce\r\nouten\r\nhooey\r\nanole\r\nunlit\r\nrecap\r\nsynch\r\ndicey\r\ncaron\r\ntypos\r\nrerun\r\npolly\r\nsurds\r\nnulls\r\nhater\r\npates\r\nsplay\r\ntalus\r\nporno\r\nmoola\r\nsnide\r\nhorsy\r\ncreel\r\npater\r\niotas\r\ncurie\r\nnutsy\r\nhilum\r\ntryst\r\ncodon\r\nrheas\r\nmynah\r\ndonut\r\nhayed\r\ncushy\r\nspacy\r\nleery\r\namens\r\ntesla\r\nintro\r\ncapos\r\nopine\r\ncoder\r\nnamer\r\nhaled\r\nchard\r\nreuse\r\ntoons\r\nsilty\r\ncutup\r\nnisei\r\nneato\r\nloony\r\nshoed\r\nreran\r\nepact\r\npotty\r\nconed\r\nupend\r\nnarco\r\nposit\r\nclops\r\nhocus\r\nhammy\r\nadman\r\nsouse\r\nnacho\r\nmimed\r\nmelds\r\npinup\r\nrandy\r\neduce\r\nauras\r\npesto\r\nantsy\r\nsnits\r\nthane\r\nmylar\r\nesses\r\npaned\r\ndruid\r\noctet\r\nhomed\r\neared\r\nanted\r\nelide\r\nsitus\r\nscone\r\ndrily\r\nhyper\r\nsalsa\r\nmooch\r\nlipid\r\nmitre\r\ntorus\r\ndimer\r\nrecut\r\nmeson\r\npanty\r\nroans\r\nhones\r\nestop\r\nsully\r\nsooth\r\nahold\r\nraper\r\nprimp\r\nemote\r\nshahs\r\nrutty\r\nsemis\r\nacmes\r\npiton\r\nhussy\r\ntorts\r\ndisco\r\namour\r\nsoppy\r\ndurst\r\ntutus\r\nperms\r\ncatty\r\nnerds\r\nsayer\r\nmolls\r\nshard\r\ncomps\r\ncorer\r\ncolas\r\nmatte\r\ndroid\r\nploys\r\ncairn\r\ndeism\r\nprosy\r\ncraps\r\nclone\r\nmacho\r\nrecto\r\ndrams\r\ndoyen\r\nnoels\r\nharpy\r\noldie\r\ncodas\r\ndeist\r\norcas\r\nretro\r\nparse\r\nrants\r\ntoddy\r\nmicro\r\ndemos\r\nantes\r\nlulus\r\nepees\r\ntromp\r\nyoyos\r\nhales\r\nroust\r\npampa\r\nmosey\r\nunmet\r\ncuspy\r\nhypes\r\ndynes\r\nnards\r\nlanai\r\nsepal\r\nprate\r\nayins\r\ndoper\r\nlinty\r\nmondo\r\nstash\r\ncapon\r\ntarot\r\nredid\r\nmimeo\r\nheist\r\ntarps\r\nlamas\r\nsutra\r\ndinar\r\nspays\r\npreps\r\nodour\r\ndados\r\nhouri\r\npushy\r\nretry\r\nchits\r\nlotto\r\ndeuce\r\nclads\r\nduper\r\nscams\r\nmimes\r\nthroe\r\npromo\r\ncoset\r\nminis\r\nsauna\r\nusury\r\nstats\r\ncondo\r\nloopy\r\ndorms\r\nascot\r\ndippy\r\ndopey\r\numpty\r\nstrop\r\nslims\r\nsonly\r\nluaus\r\ncampy\r\noodle\r\nproms\r\ntouts\r\ntoady\r\nnaiad\r\nhider\r\nsluts\r\nnarcs\r\ntyros\r\ndelis\r\nhyped\r\nposet\r\nscrod\r\ntorte\r\ntuple\r\ncarom\r\ntamps\r\nduals\r\nartsy\r\nrepro\r\nmodem\r\ntoped\r\npsych\r\ntarns\r\ndrays\r\ncloys\r\nanded\r\naimer\r\nsuras\r\nlimos\r\ndutch\r\nshire\r\nstaph\r\nlayup\r\ntoper\r\naddle\r\nsudsy\r\nsuety\r\npitas\r\ndeice\r\ntaupe\r\ntopes\r\nduchy\r\nnitro\r\ncarny\r\nlimey\r\norals\r\nhirer\r\nroils\r\nelate\r\ndolor\r\nsnots\r\nminas\r\nmanta\r\niliac\r\nadmen\r\ncills\r\nlotta\r\ndonna\r\nlocos\r\nmimsy\r\nhilar\r\noutta\r\nraths\r\nrenal\r\ndyads\r\ncrocs\r\nculpa\r\nteats\r\nthats\r\nohhhh\r\naphis\r\neclat\r\nperdu\r\nmayst\r\nmolly\r\nsupra\r\nplasm\r\nsemen\r\nparas\r\nstoat\r\nsecco\r\ncarte\r\nhaute\r\nmolal\r\nshads\r\npions\r\nmodus\r\nrheum\r\nparer\r\nephah\r\ndoest\r\nsprue\r\nmolto\r\ndieth\r\nchoos\r\nplumy\r\nmoony\r\nmorts\r\nyourn\r\nspume\r\nmucho\r\nspued\r\nharum\r\nlaude\r\nthrum\r\npappy\r\noncet\r\nrimed\r\nlimed\r\nplein\r\nredly\r\nlites\r\nseest\r\nplats\r\npayed\r\nareal\r\ntilth\r\nyouse\r\nthees\r\nlento\r\nsprat\r\ncornu\r\namahs\r\nmecum\r\nedema\r\nmrads\r\ndicot\r\nastro\r\ndidos\r\nsumma\r\npurls\r\nteary\r\nmasse\r\npssst\r\nsylph\r\northo\r\nlucre\r\ncooch\r\ntyres\r\nsolon\r\ndidot\r\nrayed\r\nchile\r\nnippy\r\nlitre\r\nhydro\r\nmilch\r\ninapt\r\ncasus\r\nscrum\r\nscuse\r\nohmic\r\norate\r\nmusta\r\nlardy\r\nintra\r\nepsom\r\nneath\r\nocher\r\ntared\r\nhomme\r\ncorms\r\npsoas\r\nterry\r\ntuans\r\nanima\r\nmahua\r\nscops\r\nmanse\r\ntitre\r\ncuria\r\ncycad\r\ntapis\r\namide\r\ndolce\r\nsloes\r\nrusse\r\ntutti\r\npruta\r\ntench\r\nherem\r\nmissy\r\nmerse\r\nlimen\r\nchert\r\nunsee\r\ntiros\r\nileum\r\nnoire\r\nlaird\r\nshute\r\npoesy\r\nuncap\r\ncosta\r\nturps\r\nsolum\r\nconey\r\npolis\r\ndictu\r\nsherd\r\nchars\r\nslued\r\nhades\r\nsyncs\r\nmuser\r\nhoars\r\npasse\r\nlotsa\r\nlepta\r\nshays\r\nendue\r\ndarer\r\nnones\r\nileus\r\nplash\r\nrooty\r\nlicit\r\nterce\r\nhayey\r\nsaran\r\nloppy\r\ndiems\r\npolos\r\nunman\r\napers\r\nroids\r\nulnas\r\ntacts\r\ntreap\r\nchurl\r\nmomma\r\narras\r\nmarls\r\ntiler\r\nmemes\r\nmidis\r\ntided\r\nhaler\r\nduces\r\nposte\r\nprise\r\nspier\r\nremap\r\ntrier\r\nsteno\r\nstoma\r\nairer\r\ntorah\r\napian\r\nsmuts\r\nyurts\r\nnuder\r\nmothy\r\npards\r\nhoppy\r\ncotes\r\ndishy\r\npismo\r\ncasas\r\nscudi\r\nmuons\r\nureas\r\nioctl\r\nunhip\r\ncento\r\nlippy\r\nlordy\r\nshoat\r\ncarer\r\nrater\r\nrente\r\nunapt\r\npoops\r\neyers\r\nspina\r\nstoae\r\nyenta\r\npooey\r\noared\r\npryer\r\ntitty\r\nsepoy\r\npenes\r\nnihil\r\nrille\r\nousel\r\ncuppy\r\nhames\r\nshits\r\ntacet\r\ncoyer\r\nidyls\r\nlupus\r\nsnood\r\nschmo\r\nnoter\r\npipet\r\nstets\r\nseeth\r\nriced\r\nhalma\r\ntreys\r\nmimer\r\ncaner\r\ncuppa\r\nunarm\r\nstyes\r\nmaces\r\nrimes\r\nliras\r\nscuds\r\naider\r\nprier\r\nmonte\r\npieta\r\ncampo\r\nloper\r\nindie\r\ntater\r\nichor\r\nlochs\r\nsupes\r\ntorsi\r\nrelet\r\ntherm\r\nshnor\r\ntrued\r\nliest\r\nroily\r\npunny\r\ndipso\r\ncalla\r\npseud\r\nlurer\r\natria\r\npalmy\r\npends\r\nrecta\r\nnicad\r\npones\r\nmosts\r\nulnar\r\ncocas\r\neruct\r\noiler\r\ndater\r\narums\r\nassai\r\nlades\r\nactin\r\nmeads\r\ncreme\r\nemail\r\nduddy\r\nhoper\r\nlapin\r\npetri\r\nphial\r\nholon\r\nduomo\r\nmusos\r\nshier\r\nhayer\r\nlitho\r\nmaria\r\nasana\r\nslomo\r\namine\r\nplyer\r\nniter\r\nunate\r\ntotty\r\nhoner\r\ndicer\r\nmonad\r\namped\r\nshlep\r\nyahoo\r\ndryad\r\nmoper\r\nlunes\r\nnudie\r\nlimns\r\nmynas\r\nstoup\r\ntaels\r\nrands\r\noleos\r\nmaced\r\ncrits\r\nscats\r\nsputa\r\nacned\r\nresay\r\nthous\r\nhaply\r\nantis\r\ntecum\r\nshoer\r\ncouth\r\ntrues\r\nhurly\r\nhodad\r\niodic\r\nutero\r\nunsay\r\nliers\r\ncunts\r\nanile\r\ntatty\r\nplena\r\ntoyer\r\nattar\r\naioli\r\nanent\r\nredip\r\nprats\r\nmesne\r\nmuter\r\nlossy\r\nhoers\r\nslier\r\nilium\r\naport\r\nmulct\r\ncanna\r\nscudo\r\npease\r\nuteri\r\nlases\r\npaten\r\nrasae\r\nstoas\r\nstyli\r\nahoys\r\nammos\r\nparen\r\nnitty\r\ntechy\r\nlieth\r\nsomas\r\ncants\r\nsocle\r\nslily\r\nricer\r\nhadda\r\nrices\r\nnerts\r\ncauls\r\nlilty\r\narity\r\npasha\r\ntetra\r\npicot\r\nroods\r\nmorel\r\nelans\r\nlatus\r\nnates\r\ndonee\r\nmohel\r\nceder\r\nunmap\r\ntopoi\r\nceils\r\nyores\r\ndiest\r\npomps\r\nturdy\r\npoohs\r\nmuley\r\ntunny\r\nauric\r\ncordy\r\ncurdy\r\nlisle\r\ntoric\r\nsoyas\r\nreman\r\ncarpy\r\napish\r\noaten\r\naurae\r\nproem\r\nimpro\r\nmashy\r\nmiens\r\nnonny\r\nolios\r\nsates\r\ndashy\r\ndoser\r\ndildo\r\napsos\r\nplaya\r\nselah\r\nmalty\r\ndulse\r\ndemit\r\nrials\r\nspics\r\nicers\r\nsuers\r\ntopos\r\nshirr\r\nladed\r\nlased\r\nturds\r\neasts\r\nunhit\r\npally\r\naitch\r\nsedum\r\ncoper\r\nruche\r\nholer\r\ndoter\r\ntoter\r\ndicut\r\nmacer\r\npeens\r\npoler\r\nyecch\r\ndoeth\r\ncruds\r\nstele\r\npilau\r\nlacer\r\ninode\r\nluted\r\narses\r\ncrump\r\nspoor\r\ntoyon\r\nmorph\r\ntypal\r\nmussy\r\nrimer\r\nmolas\r\ncirri\r\npeats\r\ntoile\r\nholey\r\namyls\r\npodia\r\nchino\r\napnea\r\nprims\r\nlycra\r\nprimo\r\nhempy\r\nmoots\r\nunarc\r\ndirer\r\neland\r\nnares\r\nnoddy\r\natilt\r\nender\r\nthens\r\ndiddy\r\nshmoo\r\nprest\r\ncurer\r\npasts\r\ntaros\r\nnerdy\r\nstela\r\nstied\r\nhypos\r\nassed\r\nspumy\r\nosier\r\npupal\r\n"
  },
  {
    "path": "src/games/verbix/words_16/y.txt",
    "content": "\r\nyacht\r\nyahoo\r\nyards\r\nyarns\r\nyearn\r\nyears\r\nyeast\r\nyecch\r\nyella\r\nyells\r\nyelps\r\nyenta\r\nyeses\r\nyield\r\nyipes\r\nyodel\r\nyores\r\nyourn\r\nyours\r\nyouse\r\nyouth\r\nyoyos\r\nyucca\r\nyules\r\nyummy\r\nyurts"
  },
  {
    "path": "src/makefiles.common/auxiliary/Makefile_ALL",
    "content": "\r\n\r\n\r\n#####################################################################\r\n# Auxiliary targets\r\n\r\n# - Combine source files\r\ninclude makefiles.common/auxiliary/Makefile_combo\r\n\r\n\r\n#####################################################################\r\n# Compilers variables\r\ninclude makefiles.common/auxiliary/Makefile_compilers\r\n\r\n\r\n#####################################################################\r\n# Common includes and targets\r\ninclude makefiles.common/auxiliary/Makefile_common\r\n\r\n\r\n#####################################################################\r\n# Assets\r\ninclude makefiles.common/auxiliary/Makefile_assets\r\n\r\n\r\n# Tools\r\ninclude makefiles.common/auxiliary/Makefile_tools\r\n"
  },
  {
    "path": "src/makefiles.common/auxiliary/Makefile_assets",
    "content": "\r\nTILES_PATH ?= $(SOURCE_PATH)/tiles\r\n\r\n8X8_TILES ?= $(TILES_PATH)/8x8\r\n7X8_TILES_PATH ?= $(TILES_PATH)/7x8\r\n6X8_TILES_PATH ?= $(TILES_PATH)/6x8\r\n6X9_TILES_PATH ?= $(TILES_PATH)/6x9\r\n8x6_TILES_PATH ?= $(TILES_PATH)/8x6\r\n\r\n\r\n######################################\r\n\r\nASSETS_PATH := $(SOURCE_PATH)/generated_assets\r\n\r\nSRC_PATH := .\r\n\r\nCREATE_ASSET := cd ./assets && python ./generate_assets.py $(GAME_NAME) $(PARENT_DIR) && python ./copy_assets.py $(GAME_NAME) $(PARENT_DIR)\r\n\r\ngame_assets:\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s: $(ASSETS_PATH)/cc65_udc_atari7800_160A.s\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_atari7800_160A.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_agat.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/z88dk_gameboy.asm: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/6x8_chars.h: $(wildcard $(6X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n# $(ASSETS_PATH)/z88dk_6x8.asm: $(wildcard $(6X8_TILES)/*.txt)\r\n\t# $(CREATE_ASSET)\r\n\r\n\r\n$(ASSETS_PATH)/z88dk_6x8_pmd85.asm: $(wildcard $(6X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/6x9_chars.h: $(wildcard $(6X9_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/7x8_chars.h: $(wildcard $(7X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/8x8_chars.h: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/4x4_chars.h: $(wildcard $(4X4_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_nes_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cc65_nes_color_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_pce_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cc65_gamate_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cc65_udc.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cc65_udc_arcade.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_arcade_conio.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_arcade_27_tiles_v2.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_arcade_v2.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_vic20_64_chars.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cc65_udc_63_chars.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cc65_udc_64_chars.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s:$(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_6chars.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n    \r\n$(ASSETS_PATH)/cc65_udc_vic20_19_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cc65_udc_vic20_25_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/cmoc_udc_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/z88dk_cpc_Chars8.asm: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/z88dk_sprites_definitions.h: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/z88dk_xchase.asm: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\n\r\n$(ASSETS_PATH)/cmoc_udc_25_tiles.s: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/z88dk_pv1000.asm: $(wildcard $(8X8_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/8x6_tiles.s: $(wildcard $(8X6_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n    \r\n$(ASSETS_PATH)/8x6_chars.h: $(wildcard $(8X6_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n\r\n$(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h: $(wildcard $(8X6_TILES)/*.txt)\r\n\t$(CREATE_ASSET)\r\n"
  },
  {
    "path": "src/makefiles.common/auxiliary/Makefile_combo",
    "content": "# ------------------------------------------------------------------------------------------\r\n# Combine all .c source files into one for cross-compilers that only handle single files, e.g., LCC1802, WINCMOC\r\n\r\n\t\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/auxiliary/Makefile_common",
    "content": "\r\n###########################################################################\r\nifneq ($(COMSPEC),)\r\nDO_WIN:=1\r\nendif\r\nifneq ($(ComSpec),)\r\nDO_WIN:=1\r\nendif \r\n\r\nifeq ($(DO_WIN),1)\r\nEXEEXT = .exe\r\nendif\r\n\r\n# MacOS only has \"ncurses\"\r\n# MSYS2 only has \"ncursesw\"\r\n# Linux, Cygwin, FreeBSD, WSL have both \"ncurses\" and \"ncursesw\"\r\n\r\nifeq ($(DO_WIN),1)\r\nCOMPILEDEXT = .exe\r\nNCURSES     = ncursesw\r\nelse\r\nCOMPILEDEXT = .out\r\nNCURSES     = ncurses\r\nIF_POSIX    = _posix\r\nendif\r\n\r\nCROSS_LIB_PATH := cross_lib\r\n\r\nBUILD_PATH ?= ../build\r\n\r\n######################################\r\n\r\n\r\n#######################################################################\r\n# Cross Lib includes + game's graphics data\r\n\r\nINCLUDE_OPTS ?= \\\r\n-I$(CROSS_LIB_PATH) -I$(CROSS_LIB_PATH)/sleep \\\r\n-I$(CROSS_LIB_PATH)/display \\\r\n-I$(CROSS_LIB_PATH)/display/graphics_mode \\\r\n-I$(CROSS_LIB_PATH)/display/alt_print \\\r\n-I$(CROSS_LIB_PATH)/include \\\r\n-I$(CROSS_LIB_PATH)/sound \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/atmos \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/c264 \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/pokey \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/sid \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/vic20 \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/gamate \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/creativision \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/atari_lynx \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/atari7800 \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/pet \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/supervision \\\r\n-I$(CROSS_LIB_PATH)/sound/cc65/cx16 \\\r\n-I$(CROSS_LIB_PATH)/sound/z88dk/bit_bang \\\r\n-I$(CROSS_LIB_PATH)/sound/z88dk/gb \\\r\n-I$(CROSS_LIB_PATH)/sound/z88dk/psg \\\r\n-I$(CROSS_LIB_PATH)/sound/lcc1802/comx   \\\r\n-I$(CROSS_LIB_PATH)/sound/cmoc/mo5 \\\r\n-I$(CROSS_LIB_PATH)/sound/generic \\\r\n-I$(CROSS_LIB_PATH)/sound/gcc4ti99 \\\r\n-I$(CROSS_LIB_PATH)/sound/vbcc/bbc \\\r\n-I$(CROSS_LIB_PATH)/sound/ack/msdos86 \\\r\n-I$(CROSS_LIB_PATH)/text \\\r\n-I$(CROSS_LIB_PATH)/input \\\r\n-I$(CROSS_LIB_PATH)/rand \\\r\n-I$(CROSS_LIB_PATH)/display/redefine_characters \\\r\n-I$(CROSS_LIB_PATH)/display/tiles \\\r\n-I$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc \\\r\n-I$(ASSETS_PATH) \\\r\n-I$(SOURCE_PATH)\r\n\r\nTOOLS_PATH ?= ../tools\r\n\r\nCFG_PATH ?= $(CROSS_LIB_PATH)/cfg/\r\n\r\n\r\n#####################################################################\r\n# CrossLib files\r\n# BASIC_CROSS_LIB_FILES ?= \\\r\n\t# $(CROSS_LIB_PATH)/display/display_macros.c \\\r\n\t# $(CROSS_LIB_PATH)/input/input_macros.c \\\r\n\t# $(CROSS_LIB_PATH)/text/text_macros.c\r\n\r\nBASIC_CROSS_LIB_FILES ?= \\\r\n\t$(CROSS_LIB_PATH)/display/display_macros.c \\\r\n\t$(CROSS_LIB_PATH)/input/input_macros.c\r\n\t\r\n#################################################################\r\n# Clean targets\r\nclean_chase_obj:\r\n\trm -rf $(SOURCE_PATH)/*.o\r\n\r\nclean_game_assets: \r\n\tif [ -d $(ASSETS_PATH) ]; then echo \"generated assets dir exists\"; cd $(ASSETS_PATH); pwd; ls -l; rm -rf *.s; rm -rf *.h; rm -rf *.asm; else echo \"generated assets dir does NOT exist\"; fi\r\n\r\nclean_assets: clean_game_assets\r\n\r\nclean_chase_temp:\r\n\trm -rf $(SOURCE_PATH)/wincmoc_main.c\r\n\trm -rf $(SOURCE_PATH)/wincmoc_main.asm\r\n\trm -rf $(SOURCE_PATH)/wincmoc_main.coco.bin\r\n\trm -rf $(SOURCE_PATH)/../full_comx_combo.c\r\n\trm -rf $(SOURCE_PATH)/../light_comx_combo.c\r\n\trm -rf $(SOURCE_PATH)/../tiny_comx_combo.c\r\n\trm -rf $(SOURCE_PATH)/../full_comx_combo.asm\r\n\trm -rf $(SOURCE_PATH)/../light_comx_combo.asm\r\n\trm -rf $(SOURCE_PATH)/../tiny_comx_combo.asm\r\n\trm -rf $(SOURCE_PATH)/../full_pecom_combo.c\r\n\trm -rf $(SOURCE_PATH)/../light_pecom_combo.c\r\n\trm -rf $(SOURCE_PATH)/../tiny_pecom_combo.c\r\n\trm -rf $(SOURCE_PATH)/../full_pecom_combo.asm\r\n\trm -rf $(SOURCE_PATH)/../light_pecom_combo.asm\r\n\trm -rf $(SOURCE_PATH)/../tiny_pecom_combo.asm\r\n\r\nclean_lib_obj:\r\n\tfind . -type f -name '*.o' -delete\r\n\r\nclean_i_files:\r\n\tfind . -type f -name '*.i' -delete\r\n    \r\nclean_lis:\r\n\tfind . -type f -name '*.lis' -delete\r\n\r\n\r\nclean_obj: \\\r\n\tclean_chase_obj \\\r\n\tclean_chase_temp \\\r\n\tclean_lib_obj \\\r\n    clean_lis\r\n\r\nclean_build:\r\n\trm -rf $(BUILD_PATH)/*\r\n\r\nclean_generic_combo:\r\n\trm -rf games/reduced_full_lcc1802_color_combo.c\r\n\trm -rf games/reduced_full_lcc1802_combo_no_sounds.*\r\n\trm -rf games/full_lcc1802_combo.*\r\n\trm -rf games/full_combo_rand.c  \r\n\trm -rf examples/reduced_full_lcc1802_color_combo.c\r\n\trm -rf examples/reduced_full_lcc1802_combo_no_sounds.*\r\n\trm -rf examples/full_lcc1802_combo.*\r\n\trm -rf examples/full_combo_rand.c \r\n\trm -rf *.stackdump\r\n\r\nclean_generic_no_built_in: \\\r\n    clean_generic_combo \\\r\n    clean_lib_obj \\\r\n    clean_lis\r\n\r\nclean_generic: \\\r\n    clean_generic_combo \\\r\n    clean_build \\\r\n    clean_lib_obj \\\r\n    clean_lis\r\n\r\nclean: \\\r\n    clean_generic_combo \\\r\n\tclean_obj \\\r\n\tclean_build \\\r\n\tclean_game_assets\r\n\r\nclean_no_built_in: \\\r\n    clean_generic_combo \\\r\n\tclean_obj \\\r\n\tclean_game_assets\r\n\r\nhelp:\r\n\tcat ../docs/BUILD.md\r\n\r\nlist:\r\n\tcat ../docs/SYSTEMS.md\r\n    \r\nstatus:\r\n\tcat ../docs/STATUS.md\r\n"
  },
  {
    "path": "src/makefiles.common/auxiliary/Makefile_compilers",
    "content": "\r\n\r\n###########################\r\n\r\n###########################\r\n# ACK\r\n_ACK ?= ack $(GLOBAL_OPTS)\r\n_ACK_OPTS ?=  \r\n\r\n\r\n\r\n###########################\r\n# CC65\r\nCC65_PATH ?= \r\n#/home/fabri/CC65_FIX/cc65/bin/\r\n\r\nMYCC65 ?= cl65$(EXEEXT) $(GLOBAL_OPTS)\r\nAR65   ?= ar65$(EXEEXT)\r\nCA65   ?= ca65$(EXEEXT)\r\n\r\n\r\n###########################\r\n# CMOC\r\nCMOC ?= cmoc $(GLOBAL_OPTS)\r\n\r\n\r\n\r\n###########################\r\n# GCC AMIGA\r\nAMIGA_CC ?= m68k-amigaos-gcc $(GLOBAL_OPTS)\r\nAMIGA_OPTS ?= \r\n\r\n\r\n\r\n###########################\r\n# GCC ATARI ST\r\nATARI_ST_CC ?= m68k-atari-mint-gcc $(GLOBAL_OPTS)\r\nATARI_ST_OPTS ?=\r\n\r\n\r\n###########################\r\n# GCC \r\n\r\n# For cygwin build use gcc\r\n# For windows build use mingw, e.g., x86_64-w64-mingw32-gcc\r\n_CC ?= gcc $(GLOBAL_OPTS)\r\n_CC_OPTS ?= \r\n\r\n#############\r\n\r\n\r\n# GCC ?= gcc $(GLOBAL_OPTS)\r\n# GCC_OPTS ?= -Wpedantic -Wall\r\n\r\nNATIVE_CC ?= $(_NATIVE_CC) $(GLOBAL_OPTS)\r\n\r\n# TOOL_CC ?= $(GCC)\r\n\r\n#############\r\n\r\n\r\nCC6303_COMPILER ?= cc68  $(GLOBAL_OPTS) \r\nCC6303_MC10_OPTS ?=\r\n\r\n#############\r\n\r\n\r\nVBCC_COMPILER ?= vc  $(GLOBAL_OPTS) \r\nVBCC_OPTS ?= +bbc\r\n\r\n\r\n###########################\r\n# GCC TMS9900 \r\nTMS9900-GCC_PATH ?= /opt/gcc4ti/bin\r\nLIB_TI99_PATH=/opt/gcc4ti/lib\r\n\r\n\r\n\r\n###########################\r\n# GCC Z8K_PCOS \r\nZ8K-PCOS-GCC ?= /opt/z8kgcc-jan-19-2009/bin/z8k-pcos-gcc $(GLOBAL_OPTS)\r\nZ8K-PCOS-GCC_OPTS ?= -Wno-cpg \r\n\r\n\r\n\r\n###########################\r\n# LCC1802 \r\n# LCC1802_PATH ?= /cygdrive/c/lcc42/bin/\r\nLCC1802_PATH ?= \r\nLCC1802_EXE ?= lcc$(EXEEXT) $(GLOBAL_OPTS)\r\nLCC1802 ?= $(LCC1802_PATH)$(LCC1802_EXE)\r\n\r\n\r\n\r\n###########################\r\n# XTC68 \r\nXTC68 ?= qcc $(GLOBAL_OPTS)\r\n\r\n\r\n###########################\r\n# Z88DK\r\n# Z88DK_PATH ?= /cygdrive/c/z88dk/bin/\r\nZ88DK_PATH ?=\r\n# Z88DK_INCLUDE ?= /cygdrive/c/z88dk/include  \r\nZ88DK_INCLUDE ?= \r\n\r\n\r\nSCCZ80_OPTS ?= $(GLOBAL_OPTS)\r\n#-O0\r\n#-O3\r\n\r\nSCCZ80_ROM_OPTS ?= -O2 $(GLOBAL_OPTS)\r\n#-O0\r\n#-O3\r\n\r\nZSDCC_OPTS ?= -SO3 $(GLOBAL_OPTS)\r\n#-SO0\r\n# -SO3 --max-allocs-per-node200000\r\n\r\nZSDCC_ROM_OPTS ?= -SO3 $(GLOBAL_OPTS)\r\n# -SO3\r\n# -SO3 --max-allocs-per-node200000\r\n\r\n\r\nZ88DK_MAKE_OPTS ?= -j 8\r\n\r\n\r\nMYZ88DK ?= zcc$(EXEEXT)\r\nMYZ88DKASM ?= z80asm$(EXEEXT)\r\n# MYZ88DK ?= zcc.exe\r\n# MYZ88DKASM ?= z80asm.exe\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/auxiliary/Makefile_default_values",
    "content": "######################\r\n\r\n# No forced slowdown\r\nSLOWDOWN?=-1\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR?=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN?=0\r\n_APPLE2ENH_SLOWDOWN?=0\r\n_APPLE2_HGR_SLOWDOWN?=0\r\n_APPLE2ENH_HGR_SLOWDOWN?=0\r\n_ATARI_SLOWDOWN?=0\r\n_ATARI5200_SLOWDOWN?=0\r\n_ATARI7800_SLOWDOWN?=0\r\n_ATARI7800_NO_COLOR_SLOWDOWN?=0\r\n_ATARI_LYNX_SLOWDOWN?=0\r\n_C128_8502_40COL_SLOWDOWN?=0\r\n_C128_8502_80COL_SLOWDOWN?=0\r\n_C16_SLOWDOWN?=0\r\n_C64_SLOWDOWN?=0\r\n_C65_SLOWDOWN?=500\r\n_CBM610_SLOWDOWN?=0\r\n_CBM510_SLOWDOWN?=0\r\n_CX16_SLOWDOWN?=200\r\n_CREATIVISION_SLOWDOWN?=0\r\n_GAMATE_SLOWDOWN?=0\r\n_ORIC_SLOWDOWN?=0\r\n_MEGA65_SLOWDOWN?=650\r\n_NES_SLOWDOWN?=0\r\n_PET_SLOWDOWN?=0\r\n_PCE_SLOWDOWN?=0\r\n_SUPERVISION_SLOWDOWN?=0\r\n_TELESTRAT_SLOWDOWN?=0\r\n_VIC20_SLOWDOWN?=0\r\n\r\n\r\n# Z88DK\r\n_ABC80_SLOWDOWN?=0\r\n_ABC800_SLOWDOWN?=0\r\n_ALPHATRO_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_ALTAIR8800_SLOWDOWN?=0\r\n_ACE_SLOWDOWN?=0\r\n_ACTRIX_SLOWDOWN?=0\r\n_AGAT_SLOWDOWN?=0\r\n_AGAT_GFX_SLOWDOWN?=0\r\n_AGON_SLOWDOWN?=0\r\n_ALPHATP2_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_ALTOS5_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_ALTOS580_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_AMPRO_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_AMUST_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_AMUSTOLD_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_APPLE2_Z80_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_AQUARIUS_SLOWDOWN?=0\r\n_ARCHIVE_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_ATMTURBO_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_ATTACHE_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_ATTACHE_NO_GFX_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_AUSSIE_SLOWDOWN?=0\r\n_BEE_SLOWDOWN?=0\r\n_BEEHIVE_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_BIC_SLOWDOWN?=0\r\n_BIT90_SLOWDOWN?=0\r\n_BONDWELL_SLOWDOWN?=0\r\n_BONDWELL2_SLOWDOWN?=0\r\n_C128_Z80_40COL_SLOWDOWN?=0\r\n_C128_Z80_80COL_SLOWDOWN?=0\r\n_CAMPUTERS_LYNX_SLOWDOWN?=0\r\n_COLECO_SLOWDOWN?=0\r\n_COLECO_ADAM_SLOWDOWN?=0\r\n_CORVETTE_SLOWDOWN?=0\r\n_CPC_MODE0_SLOWDOWN?=0\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN?=0\r\n_CPC_MODE2_SLOWDOWN?=0\r\n_CPM_Z80_SLOWDOWN?=0\r\n_CPM_INTEL8080_SLOWDOWN?=0\r\n_DAI_SLOWDOWN?=0\r\n_DISKFACE_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_DMV_SLOWDOWN?=0\r\n_EAGLE2_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_E200_SLOWDOWN?=0\r\n_EG2K_SLOWDOWN?=0\r\n_EINSTEIN_SLOWDOWN?=0\r\n_ENTERPRISE_SLOWDOWN?=0\r\n_EXCALIBUR64_SLOWDOWN?=0\r\n_FP1100_SLOWDOWN?=0\r\n_G815_SLOWDOWN?=0\r\n_G850_SLOWDOWN?=0\r\n_GNAT10_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_GAL_SLOWDOWN?=0\r\n_GAL_GFX_SLOWDOWN?=0\r\n_GB_SLOWDOWN?=0\r\n_GB_WAIT_VSYNC_SLOWDOWN?=0\r\n_GG_SLOWDOWN?=0\r\n_GEMINI_SLOWDOWN?=0\r\n_GL4000_SLOWDOWN?=0\r\n_GL6000SL_SLOWDOWN?=0\r\n_HC2000_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_HC91_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_HEMC_SLOWDOWN?=0\r\n_HECTOR_SLOWDOWN?=180\r\n_HECTORHR_SLOWDOWN?=180\r\n_HGMC_SLOWDOWN?=0\r\n_HOMELAB_SLOWDOWN?=0\r\n_HOMELAB2_SLOWDOWN?=0\r\n_HP125_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_HZ100_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_HZ89?=$(_CPM_Z80_SLOWDOWN)\r\n_KAYPRO_SLOWDOWN?=0\r\n_KAYPRO83_SLOWDOWN?=0\r\n_KRAMERMC_SLOWDOWN?=0\r\n_KROKHA_SLOWDOWN?=0\r\n_KC_SLOWDOWN?=0\r\n_LASER500_SLOWDOWN?=0\r\n_LAMBDA_SLOWDOWN?=0\r\n_LEC80T_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_LM80C_SLOWDOWN?=0\r\n_LVIV_SLOWDOWN?=0\r\n_M5_SLOWDOWN?=0\r\n_M100_SLOWDOWN?=0\r\n_MAGNOLIA_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_MICROMATE_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_MBC200_SLOWDOWN?=0\r\n_MBC2000_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_MC1000_SLOWDOWN?=0\r\n_MICRO8085_SLOWDOWN?=0\r\n_MIKRO80_SLOWDOWN?=0\r\n_MULTI8_SLOWDOWN?=0\r\n_MYVISION_SLOWDOWN?=0\r\n_MSX_SLOWDOWN?=0\r\n_MSX_FIXED_COLORS_SLOWDOWN?=0\r\n_MTX500_SLOWDOWN?=0\r\n_MTX512_SLOWDOWN?=0\r\n_MZ_SLOWDOWN?=0\r\n_MZ2500_SLOWDOWN?=0\r\n_MZ3500_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_NABU_SLOWDOWN?=0\r\n_NASCOM_SLOWDOWN?=0\r\n_NC100_SLOWDOWN?=0\r\n_NC200_SLOWDOWN?=0\r\n_NEWBRAIN_SLOWDOWN?=0\r\n_ONDRA_SLOWDOWN?=0\r\n_OZ_SLOWDOWN?=0\r\n_P2000_SLOWDOWN?=0\r\n_PASOPIA7_SLOWDOWN?=0\r\n_PC6001_SLOWDOWN?=0\r\n_PCW40_SLOWDOWN?=0\r\n_PCW80_SLOWDOWN?=0\r\n_PENCIL2_SLOWDOWN?=0\r\n_PHC25_SLOWDOWN?=0\r\n_PMD85_SLOWDOWN?=0\r\n_PPS_SLOWDOWN?=0\r\n_PRIMO_SLOWDOWN?=0\r\n_PV1000_SLOWDOWN?=0\r\n_PV2000_SLOWDOWN?=0\r\n_PC88_SLOWDOWN?=0\r\n_PX4_SLOWDOWN?=0\r\n_PX8_SLOWDOWN?=0\r\n_QC10_SLOWDOWN?=0\r\n_QUORUM_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_RADIO86_SLOWDOWN?=0\r\n_RAINBOW_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_RC700_SLOWDOWN?=0\r\n_RX78_SLOWDOWN?=0\r\n_SAGAFOX_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_SCORPION_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_SEEQUA_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_SMC777_SLOWDOWN?=0\r\n_SOL20_SLOWDOWN?=0\r\n_SOS_SLOWDOWN?=0\r\n_SPC1000_SLOWDOWN?=0\r\n_SPECIAL_SLOWDOWN?=0\r\n_SRR_SLOWDOWN?=0\r\n_SUPER80_SLOWDOWN?=0\r\n_SUPER80R_SLOWDOWN?=0\r\n_SV8000_SLOWDOWN?=0\r\n_SC3000_SLOWDOWN?=0\r\n_SAMCOUPE_SLOWDOWN?=0\r\n_SMS_SLOWDOWN?=0\r\n_SPECTRUM_SLOWDOWN?=0\r\n_SVI_SLOWDOWN?=0\r\n_TELEVIDEO_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_TI82_SLOWDOWN?=0\r\n_TI83_SLOWDOWN?=0\r\n_TI83P_SLOWDOWN?=0\r\n_TI85_SLOWDOWN?=0\r\n_TI86_SLOWDOWN?=0\r\n_TIKI100_SLOWDOWN?=0\r\n_TIM011_SLOWDOWN?=0\r\n_TS2068_SLOWDOWN?=0\r\n_TVC_SLOWDOWN?=0\r\n_V1050_SLOWDOWN?=0\r\n_VECTOR06C_SLOWDOWN?=0\r\n_X1_SLOWDOWN?=0\r\n_TRS80_SLOWDOWN?=250\r\n_VT180_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_VG5K_SLOWDOWN?=0\r\n_VZ200_SLOWDOWN?=0\r\n_X07_SLOWDOWN?=0\r\n_X820_SLOWDOWN?=0\r\n_Z80PACK_SLOWDOWN?=$(_CPM_Z80_SLOWDOWN)\r\n_ZX80_SLOWDOWN?=0\r\n_Z80TVGAME_SLOWDOWN?=0\r\n_Z88_SLOWDOWN?=0\r\n_ZXN_SLOWDOWN?=0\r\n_Z1013_SLOWDOWN?=0 \r\n_Z9001_SLOWDOWN?=0\r\n_ZX81_SLOWDOWN?=0\r\n_ZX81_WRX_SLOWDOWN?=0\r\n_ZX81_8X6_WRX_SLOWDOWN?=0\r\n_ZX81_WRX64_SLOWDOWN?=0\r\n_ZX81_8X6_WRX64_SLOWDOWN?=0\r\n_ZX81_WRX128_SLOWDOWN?=0\r\n_ZX81_8X6_WRX128_SLOWDOWN?=0\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN?=0\r\n_DRAGON_SLOWDOWN?=0\r\n_COCO3_SLOWDOWN?=0\r\n_COCO_NO_GFX_SLOWDOWN?=0\r\n_DRAGON_NO_GFX_SLOWDOWN?=0\r\n_MO5_SLOWDOWN?=0\r\n_TO7_SLOWDOWN?=0\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN?=0\r\n_PECOM_SLOWDOWN?=0\r\n_TMC600_SLOWDOWN?=0\r\n_MICRO_SLOWDOWN?=0\r\n_CIDELSA_SLOWDOWN?=0\r\n_VIP_SLOWDOWN?=0\r\n\r\n# CC6303\r\n_MC10_SLOWDOWN?=0\r\n\r\n\r\n# GCC FOR TI\r\n_TI99_SLOWDOWN?=120\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN?=0\r\n_TERMINAL_SLOWDOWN?=10\r\n\r\n\r\n# MINT ATARI ST GCC\r\n_ATARI_ST_SLOWDOWN?=0\r\n\r\n\r\n# VBCC\r\n_BBC_SLOWDOWN?=0\r\n_BBCMASTER_SLOWDOWN?=0\r\n_M65_SLOWDOWN?=0\r\n_AMIGA_SLOWDOWN?=0\r\n_ATARI_JAGUAR_SLOWDOWN?=0\r\n\r\n\r\n# ACK\r\n_MSDOS86_SLOWDOWN?=250\r\n"
  },
  {
    "path": "src/makefiles.common/auxiliary/Makefile_tools",
    "content": "\r\n\r\n# GCC ?= gcc $(GLOBAL_OPTS)\r\n# GCC_OPTS ?= -Wpedantic -Wall\r\n\r\n# NATIVE_CC ?= $(GCC)\r\n# include ./games/chase/Makefile.chase\r\n# include ./makefiles.common/auxiliary/Makefile_ALL\r\n\r\n# include ./makefiles.common/auxiliary/Makefile_common\r\n\r\nifneq ($(COMSPEC),)\r\nDO_WIN:=1\r\nendif\r\nifneq ($(ComSpec),)\r\nDO_WIN:=1\r\nendif \r\n\r\nifeq ($(DO_WIN),1)\r\nEXEEXT = .exe\r\nendif\r\n\r\nifeq ($(DO_WIN),1)\r\nCOMPILEDEXT = .exe\r\nelse\r\nCOMPILEDEXT = .out\r\nendif\r\n\r\nTOOLS_PATH ?= ../tools\r\n\r\n# GNU_MAKE=make\r\n\r\n# Number of threads used by make\r\nMAKE_THREADS = 8\r\n\r\n\r\n$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT): $(TOOLS_PATH)/cc65/gamate/gamate-fixcart.c\r\n\t$(TOOL_CC) $(TOOLS_PATH)/cc65/gamate/gamate-fixcart.c -o $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\n    \r\n$(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT): $(TOOLS_PATH)/cmoc/mo5/f2k5.c\r\n\t$(TOOL_CC) $(TOOLS_PATH)/cmoc/mo5/f2k5.c  -o $(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT): $(TOOLS_PATH)/bbc/bbcim-1.0.1/src/bbcim.c\r\n\tcd $(TOOLS_PATH)/bbc/bbcim-1.0.1/ && $(GNU_MAKE)\r\n\tmv $(TOOLS_PATH)/bbc/bbcim-1.0.1/bbcim$(EXT) $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT): $(TOOLS_PATH)/z88dk/oz/makewzd.c\r\n\t$(TOOL_CC) $(TOOLS_PATH)/z88dk/oz/makewzd.c -o $(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT): $(TOOLS_PATH)/cmoc/coco/file2dsk/Source/file2dsk.c\r\n\tcd $(TOOLS_PATH)/cmoc/coco/file2dsk/Source && $(GNU_MAKE)\r\n\tmv $(TOOLS_PATH)/cmoc/coco/file2dsk/Source/file2dsk$(COMPILEDEXT) $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT): $(TOOLS_PATH)/cmoc/mo5/sap/sapfs.c\r\n\tcd $(TOOLS_PATH)/cmoc/mo5/sap/ && $(GNU_MAKE)\r\n\tmv $(TOOLS_PATH)/cmoc/mo5/sap/sapfs $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT): $(TOOLS_PATH)/z88dk/cpc/nocart/src/main.cpp\r\n\tcd $(TOOLS_PATH)/z88dk/cpc/nocart/src/ && $(GNU_MAKE) && mv nocart ../nocart$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT):\r\n\tcd $(TOOLS_PATH)/olivetti_m20/m20floppy-0.61/ && $(GNU_MAKE) && mv m20$(EXEEXT) ../m20$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT):\r\n\tcd $(TOOLS_PATH)/ti99/elf2ea5/ && $(GNU_MAKE) && mv elf2ea5$(EXEEXT) ../elf2ea5$(COMPILEDEXT)\r\n\r\n$(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT):\r\n\tcd $(TOOLS_PATH)/ti99/ea5split/ && $(GNU_MAKE) && mv ea5split$(EXEEXT) ../ea5split$(COMPILEDEXT)\r\n\r\n#  -j$(MAKE_THREADS)\r\n$(TOOLS_PATH)/generic/exomizer/exomizer$(EXEEXT):\r\n\tcd $(TOOLS_PATH)/generic/exomizer/src && $(GNU_MAKE) exomizer && mv exomizer$(EXEEXT) ..\r\n\r\n$(TOOLS_PATH)/generic/CC1541/cc1541$(EXEEXT):\r\n\tcd $(TOOLS_PATH)/generic/CC1541 && $(GNU_MAKE)\r\n\r\n$(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(EXEEXT):\r\n\tcd $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/ && ./configure --with-z88dk=z88dk-z80asm && $(GNU_MAKE) CFLAGS=-Wno-error=implicit-function-declaration\r\n\r\n$(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc$(EXEEXT): $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(EXEEXT)\r\n\tcd $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/ && $(GNU_MAKE) bin2abc$(EXEEXT)\r\n\r\n# -j$(MAKE_THREADS)\r\n$(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr$(EXEEXT):\r\n\tcd $(TOOLS_PATH)/cc65/atari/mkatr-master && $(GNU_MAKE) \r\n\r\n$(TOOLS_PATH)/cc65/telestrat/tap2dsk$(EXEEXT):\r\n\tcd $(TOOLS_PATH)/cc65/telestrat/ && gcc tap2dsk.c -o tap2dsk$(EXEEXT)\r\n\r\n$(TOOLS_PATH)/cc65/telestrat/old2mfm$(EXEEXT):\r\n\tcd $(TOOLS_PATH)/cc65/telestrat/ && gcc old2mfm.c -o old2mfm$(EXEEXT)\r\n\r\n\r\ntools: \\\r\n    $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cc65/telestrat/tap2dsk$(EXEEXT) \\\r\n    $(TOOLS_PATH)/cc65/telestrat/old2mfm$(EXEEXT) \\\r\n    $(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/generic/exomizer/exomizer$(EXEEXT) \\\r\n    $(TOOLS_PATH)/generic/CC1541/cc1541$(EXEEXT) \\\r\n    $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr$(EXEEXT) \\\r\n    $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(EXEEXT) \\\r\n    $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc$(EXEEXT) \\\r\n\r\n\r\n# exomizer has several deps\r\n# abc80write and bin2abc have several deps\r\n# nocart (cpc) requires g++\r\n\r\neasy_tools: \\\r\n    $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/cc65/telestrat/tap2dsk$(EXEEXT) \\\r\n    $(TOOLS_PATH)/cc65/telestrat/old2mfm$(EXEEXT) \\\r\n    $(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT) \\\r\n    $(TOOLS_PATH)/generic/CC1541/cc1541$(EXEEXT) \\\r\n    $(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr$(EXEEXT) \\\r\n\r\ncpc_tools: \\\r\n    $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT) \\\r\n\r\n\r\noric_tools: \\\r\n    $(TOOLS_PATH)/cc65/telestrat/tap2dsk$(EXEEXT) \\\r\n    $(TOOLS_PATH)/cc65/telestrat/old2mfm$(EXEEXT) \\\r\n\r\n\r\natari_tools: \\\r\n    $(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr$(EXEEXT) \\\r\n\r\n\r\nabc80_tools: \\\r\n    $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(EXEEXT) \\\r\n    $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc$(EXEEXT) \\\r\n\r\n\r\nabcwrite_tools: \\\r\n    $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(EXEEXT)\r\n\r\nbin2abc_tools: \\\r\n    $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc$(EXEEXT) \\\r\n\r\n# TODO: $(GNU_MAKE) here seems not to be defined\r\n\r\nclean_tools:\r\n\trm -rf $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/cmoc/mo5/sap/*.o\r\n\trm -rf $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/z88dk/cpc/nocart/src/*.o\r\n\trm -rf $(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/olivetti_m20/m20floppy-0.61/*.o\r\n\trm -rf $(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/ti99/crt0.o\r\n\trm -rf $(TOOLS_PATH)/ti99/crt0_ea5.o\r\n\trm -rf $(TOOLS_PATH)/ti99/cart_header.o\r\n\tcd $(TOOLS_PATH)/generic/exomizer/src && $(GNU_MAKE) clean\r\n\trm -rf $(TOOLS_PATH)/generic/exomizer/exomizer$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/generic/exomizer/exomizer\r\n\trm -rf $(TOOLS_PATH)/generic/CC1541/cc1541$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/generic/CC1541/cc1541\r\n\trm -rf $(TOOLS_PATH)/generic/CC1541/cc1541.out\r\n\trm -rf $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/*.o\r\n\trm -rf $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcread$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc$(COMPILEDEXT)\r\n\trm -rf $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite\r\n\trm -rf $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcread\r\n\trm -rf $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc\r\n\trm -rf $(TOOLS_PATH)/cc65/telestrat/tap2dsk$(EXEEXT)\r\n\trm -rf $(TOOLS_PATH)/cc65/telestrat/old2mfm$(EXEEXT)\r\n\tcd $(TOOLS_PATH)/cc65/atari/mkatr-master && $(GNU_MAKE) clean\r\n\trm -rf $(TOOLS_PATH)/cc65/atari/mkatr-master/*.exe\r\n\trm -rf $(TOOLS_PATH)/cc65/atari/mkatr-master/*.out\r\n\trm -rf $(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr\r\n    \r\nclean_logs:\r\n\trm -rf ../logs/*.log"
  },
  {
    "path": "src/makefiles.common/debug/Makefile.cc6303_debug",
    "content": "# CC6303 debugging\r\n\r\nmc10_test:\r\n\tcc68 -tmc10 -D__MC10__ $(SOURCE_PATH)/../../test/mc10_test1.c -o $(BUILD_PATH)/$@\r\n\r\n\r\nvic20_test: \r\n\tcl65 -tvic20 -D__VIC20__ $(SOURCE_PATH)/../../test/mc10_test1.c -o$(BUILD_PATH)/$@.prg\r\n\r\n\r\nc64_test: \r\n\tcl65  -D__C64__ $(SOURCE_PATH)/../../test/mc10_test1.c -o$(BUILD_PATH)/$@.prg\r\n    \r\n    \r\nmc10_test2:\r\n\tcc68 -tmc10 -D__MC10__ $(SOURCE_PATH)/../../test/mc10_test2.c -o $(BUILD_PATH)/$@\r\n    \r\nvic20_test2: \r\n\tcl65 -tvic20 -D__VIC20__ $(SOURCE_PATH)/../../test/mc10_test2.c -o$(BUILD_PATH)/$@.prg\r\n\r\n\r\nc64_test2: \r\n\tcl65  -D__C64__ $(SOURCE_PATH)/../../test/mc10_test2.c -o$(BUILD_PATH)/$@.prg\r\n    \r\n\r\nmc10_test3:\r\n\tcc68 -tmc10 -D__MC10__ $(SOURCE_PATH)/../../test/mc10_test3.c -o $(BUILD_PATH)/$@\r\n    \r\nvic20_test3: \r\n\tcl65 -tvic20 -D__VIC20__ $(SOURCE_PATH)/../../test/mc10_test3.c -o$(BUILD_PATH)/$@.prg\r\n\r\n\r\nc64_test3: \r\n\tcl65  -D__C64__ $(SOURCE_PATH)/../../test/mc10_test3.c -o$(BUILD_PATH)/$@.prg\r\n\r\n\r\nmc10_test4:\r\n\tcc68 -tmc10 -D__MC10__ $(SOURCE_PATH)/../../test/mc10_test4.c $(SOURCE_PATH)/../../test/mc10_getk.s -o $(BUILD_PATH)/$@\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/debug/Makefile.cc65_debug",
    "content": "# CC65 Debugging Tests\r\n\r\n\r\n\r\nTEST_PATH ?= $(SOURCE_PATH)/../../test\r\n\r\n\r\ncreativision_hello:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t$(SOURCE_PATH)/../experiments/hello.c \\\r\n\t-o $(BUILD_PATH)/creativision_hello.bin\r\n\r\npointerToFunction:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t pce \\\r\n\t$(SOURCE_PATH)/../experiments/pointerToFunction.c \\\r\n\t-o $(BUILD_PATH)/pointerToFunctions.pce\r\n\t\r\n\r\n\r\nconio:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t gamate experiments/conio.c -o  $(BUILD_PATH)/conio.bin\r\n\t$(TOOLS_PATH)/gamate-fixcart $(BUILD_PATH)/conio.bin\r\n\r\nc64_joy-test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c64 -DJOYSTICK_DRIVER=c64_hitjoy_joy experiments/joy-test.c -o $(BUILD_PATH)/joy-test.prg\r\n\t\r\n\t\r\njoy-test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t gamate experiments/joy-test.c -o  $(BUILD_PATH)/joy-test.bin\r\n\t$(TOOLS_PATH)/gamate-fixcart $(BUILD_PATH)/joy-test.bin\r\n\r\n\r\n\r\n\r\nnone_no_graphics:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t none -c \\\r\n\t-D__BBC__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__NO_PRINT \\\r\n\t-DTINY_GAME \\\r\n\t-D__NO_WAIT \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(TINY_FILES)\r\n\t$(CC65_PATH)/ld65$(EXE) -t none \\\r\n\t--obj-path $(SOURCE_PATH) \\\r\n\t-m $(BUILD_PATH)/none_no_graphics.map \\\r\n\t-o $(BUILD_PATH)/none_no_graphics.bin \\\r\n\t$(TINY_OBJ)\r\n\r\nsupervision_dummy:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t supervision  \\\r\n\t-D__NO_PRINT -D_XL_NO_SLEEP \\\r\n\t-D__BIT_MAPPED_4_GRAPHICS_DUMMY -D__NO_INIT_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/FULL_supervision_dummy.sv\r\n\t\r\n\r\natari_lynx_hello_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t lynx $(SOURCE_PATH)/../debug/tgi_lynx_test.c \\\r\n\t-o $(BUILD_PATH)/ATARI_LYNX_HELLO_TEST.lnx\r\n    \r\natari_lynx_black_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t lynx $(SOURCE_PATH)/../test/tgi_lynx_black_test.c \\\r\n\t-o $(BUILD_PATH)/ATARI_LYNX_BLACK_TEST.lnx\r\n\r\natari_lynx_cgetc_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t lynx $(SOURCE_PATH)/../test/tgi_lynx_cgetc_test.c \\\r\n\t-o $(BUILD_PATH)/ATARI_LYNX_CGETC_TEST.lnx\r\n\r\n\r\nerror_cc65:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t vic20 $(SOURCE_PATH)/../experiments/error.c -o $(BUILD_PATH)/error_cc65.prg\r\n\r\n\r\nsupervision_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t supervision  \\\r\n\t--config $(CFG_PATH)/cc65/supervision-16k.cfg \\\r\n\t$(SOURCE_PATH)/../test/supervision_test.c \\\r\n\t-o $(BUILD_PATH)/TEST_supervision.sv\r\n\r\n\r\nsupervision_cc65_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t supervision  \\\r\n\t/home/fabri/CC65_FIX/cc65/samples/supervisionhello.c \\\r\n\t-o $(BUILD_PATH)/TEST_hellosupervision.sv\r\n\r\n\r\nbbc_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t bbc -c \\\r\n\t-o $(BUILD_PATH)/bbc_test.o \\\r\n\t-D__BBC__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__NO_PRINT \\\r\n\t-DTINY_GAME \\\r\n\t-D__NO_WAIT \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(SOURCE_PATH)/main.c\r\n\r\ngamate_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t gamate \\\r\n\t$(SOURCE_PATH)/../test/gamate_test.c \\\r\n\t-o $(BUILD_PATH)/gamate_test.bin \r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart $(BUILD_PATH)/gamate_test.bin\r\n\r\n\r\nc64_hello_test:\r\n\t$(CC65_PATH)$(MYCC65) -O -t c64 \\\r\n\t$(TEST_PATH)/helloworld_getchar.c -o $(BUILD_PATH)/$@.prg\r\n\r\n\r\ntelestrat_hello_test:\r\n\t$(CC65_PATH)$(MYCC65) -O -t telestrat \\\r\n\t$(TEST_PATH)/helloworld_getchar.c -o $(BUILD_PATH)/$@\r\n\r\ntelestrat_hello_cgetc_test:\r\n\t$(CC65_PATH)$(MYCC65) -O -t telestrat \\\r\n\t$(TEST_PATH)/hello_cgetc.c -o $(BUILD_PATH)/$@\r\n\r\n\r\ntelestrat_hello_test0:\r\n\t$(CC65_PATH)$(MYCC65) -O -t telestrat \\\r\n\t$(TEST_PATH)/helloworld.c -o $(BUILD_PATH)/$@\r\n\r\ntelestrat_conio:\r\n\t$(CC65_PATH)$(MYCC65) -O -t telestrat \\\r\n\t$(TEST_PATH)/conio.c -o $(BUILD_PATH)/$@\r\n\r\ntelestrat_conio0:\r\n\t$(CC65_PATH)$(MYCC65) -O -t telestrat \\\r\n\t$(TEST_PATH)/conio0.c -o $(BUILD_PATH)/$@\r\n\r\nc64_conio:\r\n\t$(CC65_PATH)$(MYCC65) -O -t c64 \\\r\n\t$(TEST_PATH)/conio.c -o $(BUILD_PATH)/$@\r\n"
  },
  {
    "path": "src/makefiles.common/debug/Makefile.cmoc_debug",
    "content": "\r\ncoco_test_rand: \r\n\tcmoc -O0 -c $(SOURCE_PATH)/../experiments/coco_rand_test.c\r\n\tcmoc -O0 -o $(BUILD_PATH)/coco_rand_test.bin $(SOURCE_PATH)/../coco_rand_test.o\r\n\r\nhello_vec:\r\n\tcmoc --vectrex -Wno-const -c $(SOURCE_PATH)/../experiments/hello_vec.c \r\n\tcmoc --vectrex -o $(BUILD_PATH)/hello_vec.bin $(SOURCE_PATH)/../hello_vec.o\r\n\trm $(SOURCE_PATH)/../hello_vec.o\r\n\t\r\nhello_coco:\r\n\tcmoc -D__CMOC__ -Wno-const -c $(SOURCE_PATH)/../experiments/hello.c \r\n\tcmoc -o $(BUILD_PATH)/hello_coco.bin $(SOURCE_PATH)/../hello.o\r\n\trm $(SOURCE_PATH)/../hello.o\r\n\r\ncoco_strings_test: \r\n\tcmoc -c $(MO5_OPTS) $(INCLUDE_OPTS) ./test/coco_strings_test.c\r\n\tcmoc  $(MO5_OPTS) $(INCLUDE_OPTS) -o $(BUILD_PATH)/coco_strings_test.bin ./coco_strings_test.o\r\n\t# rm ./mo5.o\r\n\t# $(TOOLS_PATH)/cmoc/mo5/f2k5 $(BUILD_PATH)/mo5.bin\r\n\t# mv $(BUILD_PATH)/mo5.bin .\r\n\t# $(TOOLS_PATH)/cmoc/mo5/sapfs.exe -c mo5.sap\r\n\t# $(TOOLS_PATH)/cmoc/mo5/sapfs.exe --add mo5.sap mo5.bin\r\n\t# mv ./mo5.bin $(BUILD_PATH)\r\n\t# mv ./mo5.sap $(BUILD_PATH)\r\n\t# mv ./FILE.k5 $(BUILD_PATH)/mo5.k5\r\n\t\r\n\r\ncoco3_test:\r\n\tcmoc -c ./test/coco3_test.c\r\n\tcmoc -o $(BUILD_PATH)/coco3_test.bin coco3_test.o\r\n\trm coco3_test.o\r\n\tcp $(BUILD_PATH)/coco3_test.bin XCHASE.BIN\r\n\t$(TOOLS_PATH)/cmoc/coco/file2dsk XCHASE.BIN\r\n\tmv XCHASE.DSK $(BUILD_PATH)/$@.dsk\r\n\trm XCHASE.BIN\r\n    \r\n\r\n"
  },
  {
    "path": "src/makefiles.common/debug/Makefile.lcc1802_debug",
    "content": "# ------------------------------------------------------------------------------------------\r\n# LCC1802\r\n#    -target=xr18CX\r\n# https://sites.google.com/site/lcc1802/downloads/Quarrantine.zip?attredirects=0&d=1\r\n\r\n\r\ncomx_hello0: \r\n\t$(LCC1802)  $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/hwcomx.c\r\n\tmv a.hex $(BUILD_PATH)/comx_hello0.hex\r\n\r\n\r\ncomx_hello: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/hwcomx.c\r\n\tmv a.hex $(BUILD_PATH)/comx_hello.hex\r\n\r\n\r\npecom_hello: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(PECOM_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/hwpecom.c\r\n\tmv a.hex $(BUILD_PATH)/pecom_hello.hex\r\n\r\n\r\ncomx_hello1: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/hwcomx1.c\r\n\tmv a.hex $(BUILD_PATH)/comx_hello1.hex\r\n\r\n\r\ncomx_hello2: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/hwcomx2.c\r\n\tmv a.hex $(BUILD_PATH)/comx_hello2.hex\r\n\r\ncomx_hello_integer: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/comx_hello_integer.c\r\n\tmv a.hex $(BUILD_PATH)/comx_hello_integer.hex\r\n\r\n\r\ncomx_gotoxy: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/hwcomx_gotoxy.c\r\n\tmv a.hex $(BUILD_PATH)/hwcomx_gotoxy.hex\r\n\r\n\r\ncomx_gotoxy2: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/hwcomx_gotoxy2.c\r\n\tmv a.hex $(BUILD_PATH)/hwcomx_gotoxy2.hex\r\n\r\n\r\ncomx_mod: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/comx_mod.c\r\n\tmv a.hex $(BUILD_PATH)/comx_mod.hex\r\n\r\n\r\ncomx_pp_debug0: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) -D_FOO_DEF \\\r\n\t$(SOURCE_PATH)/../test/hwcomx_pp_debug.c\r\n\tmv a.hex $(BUILD_PATH)/comx_pp_debug0.hex\r\n\r\n\r\ncomx_size_debug:\r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) -D_FOO_DEF \\\r\n\t$(SOURCE_PATH)/../test/comx_size_debug.c\r\n\tmv a.hex $(BUILD_PATH)/comx_size_debug.hex\r\n\r\n\r\ncomx_conv_debug:\r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/comx_conv_debug.c\r\n\tmv a.hex $(BUILD_PATH)/comx_conv_debug.hex\r\n\r\n\r\ncomx_class:\r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/comx_class.c\r\n\tmv a.hex $(BUILD_PATH)/comx_class.hex\r\n\r\n\r\ncomx_simple_class:\r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/comx_simple_class.c\r\n\tmv a.hex $(BUILD_PATH)/comx_simple_class.hex\r\n\r\n\r\ncomx_simplest_class:\r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/comx_simplest_class.c\r\n\tmv a.hex $(BUILD_PATH)/comx_simplest_class.hex\r\n\r\n\r\ncomx_pointer2func:\r\n\t$(LCC1802) $(LCC1802_OPTS) $(COMX_OPTS) \\\r\n\t$(SOURCE_PATH)/../test/comx_pointer2func.c\r\n\tmv a.hex $(BUILD_PATH)/comx_pointer2func.hex\r\n\r\ncomx_pp_debug: \r\n\t$(LCC1802)  $(LC1802_OPTS) $(COMX_OPTS) \\\r\n\t-DXSize=40 \\\r\n\t-DYSize=24 \\\r\n\t-D__COMX__ \\\r\n\t \\\r\n\t-D__ALT_CLEAR_SCREEN \\\r\n\t$(COMX_MACROS) \\\r\n\t$(SOURCE_PATH)/../test/comx_pp_debug.c\r\n\tmv a.hex $(BUILD_PATH)/comx_pp_debug.hex\r\n\r\n\r\nlcc1802_debug : tiny_combo_rand.cat\r\n\tmv tiny_combo_rand.cat tiny_combo_rand.c\r\n\t$(LCC1802)  $(LC1802_OPTS) $(INCLUDE_OPTS) -Wf-volatile \\\r\n\t$(DEBUG_MACROS) \\\r\n\t-D__ALT_RAND \\\r\n\ttiny_combo_rand.c\r\n\trm tiny_combo_rand.c\r\n\tmv a.hex $(BUILD_PATH)/TINY_lcc1802_debug.hex\r\n\r\ndraco_hello: \r\n\t$(LCC1802) $(LCC1802_OPTS) $(DRACO_OPTS) -D__CIDELSA__ \\\r\n\t$(SOURCE_PATH)/../test/lcc1802_test.c\r\n\tmv a.hex $(BUILD_PATH)/draco_hello.hex\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/debug/Makefile.z88dk_debug",
    "content": "# Z88DK Debugging Tests\r\n\r\n# include ./games/chase/Makefile.chase\r\n\r\nTEST_PATH ?= $(SOURCE_PATH)/../../debug\r\n\r\n\r\nnewbrain_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +newbrain $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t$(TEST_PATH)/helloworld.c \\\r\n\t-create-app\r\n\ttar czvf xchase.tar.zip _dir.txt a.bas a.dat\r\n\tmv xchase.tar.zip $(BUILD_PATH)\r\n\trm _dir.txt\r\n\trm a.bas\r\n\trm a.dat\r\n\trm a.bin\r\n\r\nspectrum_litterals:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS)  \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t$(TEST_PATH)/litterals.c \\\r\n\t-create-app\r\n\r\nspectrum_extern:\r\n\t$(Z88DK_PATH)$(MYZ88DK)  +zx -compiler=sdcc \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t$(TEST_PATH)/foo.c \\\r\n\t$(TEST_PATH)/bar.c \\\r\n\t-create-app\r\n\r\nmsx_mode1_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +msx $(SCCZ80_OPTS) -subtype=rom \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t$(TEST_PATH)//msx_test.c \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_msx.prg\r\n\trm $(BUILD_PATH)/TEST_msx.prg\r\n\r\nmsx_mode2_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +msx $(SCCZ80_OPTS) -subtype=rom \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t$(TEST_PATH)//msx_test2.c \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_msx2.prg\r\n\trm $(BUILD_PATH)/TEST_msx2.prg\r\n\r\nc7420_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c7420 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t$(TEST_PATH)/helloworld.c \\\r\n\t-create-app\r\n\tmv a.bin $(BUILD_PATH)\r\n\tmv _a.bas $(BUILD_PATH)\r\n\r\n\r\noz_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +oz $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(TEST_PATH)/helloworld.c \r\n\t$(TOOLS_PATH)/z88dk/oz/makewzd.exe a\r\n\trm a.bin\r\n\tmv a.wzd $(BUILD_PATH)/oz_hello.wzd\r\n\r\n\r\nz88_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z88 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -D__Z88__ -create-app -subtype=app \\\r\n\t$(TEST_PATH)/helloworld.c \r\n\trm a.bin\r\n\trm a_BSS.bin\r\n\trm a_DATA.bin\r\n\tmv a.63 $(BUILD_PATH)/\r\n\tmv a.epr $(BUILD_PATH)/\r\n\r\n\r\nx07_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x07 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-Cz--audio \\\r\n\t$(TEST_PATH)/helloworld.c \\\r\n\t-create-app \r\n\r\n\r\ncpm_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(TEST_PATH)/hello.c \\\r\n\t-create-app\r\n\trm a.bin\r\n\tmv A.COM $(BUILD_PATH)/CPMHELLO.COM\r\n\t\r\nc128_z80_background_color:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 -subtype=disk \\\r\n\t$(TEST_PATH)/helloworld_background_color.c \\\r\n\t-create-app -oa40.bin\r\n\t$(TOOLS_PATH)/generic/c1541 -format \"crosschase,0\" d64 FULL_c128_z80_40col.d64\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_40col.d64 -write a40.ldr\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_40col.d64 -write a40\r\n\tmv FULL_c128_z80_40col.d64 $(BUILD_PATH)/c128_z80_background_color.d64\r\n\trm A40.LDR\r\n\trm A40\r\n\trm a40.bin\r\n\r\nspectrum_background_color:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx -lndos \\\r\n\t$(TEST_PATH)/helloworld_background_color.c -create-app\r\n\trm -f a.bin\r\n\trm -f a_BANK_7.bin\r\n\tmv a.tap $(BUILD_PATH)/spectrum_background_color.tap\r\n\r\naquarius_hello_world:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \\\r\n\t$(TEST_PATH)/hello_conio.c \\\r\n\t-create-app\r\n\r\n\r\naquarius_hello_stack:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic -pragma-output:STACKPTR=20000 $(INCLUDE_OPTS) -vn \\\r\n\t$(TEST_PATH)/hello_fputc.c \\\r\n\t-create-app -o minimal_hello\r\n\r\n    \r\ngetk_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-create-app -o  $(BUILD_PATH)/getk_test.prg \\\r\n\t$(TEST_PATH)/getk_test.c\r\n\r\ngetk_test_x07:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x07 $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-create-app -o  $(BUILD_PATH)/getk_test.prg \\\r\n\t$(TEST_PATH)/getk_test.c\r\n\r\nsms_libctest:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_OPTS) \\\r\n\t-vn -lndos \\\r\n\t-create-app \\\r\n\t-o $(BUILD_PATH)/sms_libctest.sms \\\r\n\t$(TEST_PATH)/libctest.c\r\n\r\nm5_sounds:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) -create-app \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/sounds.c\r\n\trm -f a.bin\r\n\trm -f A_BSS.bin\r\n\trm -f A_DATA.bin\r\n\tmv a.rom $(BUILD_PATH)/m5_sounds.rom\r\n\r\nmz2500_getchar:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mz2500 $(SCCZ80_OPTS) -create-app \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/getchar_test.c\r\n\trm -f a.bin\r\n\tmv a.2D $(BUILD_PATH)/mz2500_getchar.2D\r\n\t\r\nspectrum_sounds:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) -create-app \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/sounds.c\r\n\trm -f a.bin\r\n\trm -f a_BANK_7.bin\r\n\tmv a.tap $(BUILD_PATH)/spectrum_sounds.tap\r\n\t\r\n   \r\n\t\r\nsms_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_OPTS) -startup=1 -clib=new -O3 \\\r\n\t-vn -pragma-include:$(CFG_PATH)/z88dk/zpragma_sms.inc \\\r\n\t-create-app\t\\\r\n\t$(TEST_PATH)/z88dk_hello.c \r\n\trm a_BSS.bin\r\n\trm a_CODE.bin\r\n\trm a_DATA.bin\r\n\trm a_UNASSIGNED.bin\r\n\tmv a.sms $(BUILD_PATH)\r\n\r\n\r\nsamcoupe_wait_for_key:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sam $(SCCZ80_OPTS) -O3 \\\r\n\t-vn  \\\r\n\t-create-app -o $(BUILD_PATH)/FULL_samcoupe.bin\t\\\r\n\t$(TEST_PATH)/wait_for_key.c\r\n\tcp $(TOOLS_PATH)/z88dk/samcoupe/samdos2_empty $(TOOLS_PATH)/z88dk/samcoupe/samdos2\r\n\t$(TOOLS_PATH)/z88dk/samcoupe/pyz80.py -I $(TOOLS_PATH)/z88dk/samcoupe/samdos2 $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.asm\r\n\tmv $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.dsk $(BUILD_PATH)/X$(GAME_NAME)_samcoupe.dsk\r\n\trm $(BUILD_PATH)/FULL_samcoupe.bin\r\n\r\n\r\nabc80_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc80 $(SCCZ80_OPTS) \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/hello.c\r\n\tperl $(TOOLS_PATH)/z88dk/abc80/bin2bac.pl $(SOURCE_PATH)/../a.bin > a.bac\t\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) a.bin $(BUILD_PATH)/abc80_hello.bac 49200\r\n\trm a.bin\t\r\n\t\r\nabc800_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -Ca --reloc-info \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/hello.c\r\n\tperl $(TOOLS_PATH)/z88dk/abc80/bin2bac.pl -800 $(SOURCE_PATH)/../a.bin $(SOURCE_PATH)/../a.reloc > a.bac\r\n\tmv a.bac $(BUILD_PATH)/abc800_hello.bac\r\n\trm a.reloc\r\n\trm a.bin\r\n\t\r\nrex_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +rex $(SCCZ80_OPTS) \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/hello.c \\\r\n\t-create-app\t\r\n\t\r\nmtx_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/hello.c \\\r\n\t-create-app\t\r\n\tmv a.wav $(BUILD_PATH)/hello.wav\r\n\tmv a $(BUILD_PATH)/hello.mtx\r\n\t\r\n\t\r\nc128_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/hello.c \\\r\n\t-create-app\r\n\r\n# -pragma-redirect:getk=getk_inkey\r\ntrs80_test_getch:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos \\\r\n\t-lm -create-app \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-vn -lndos \\\r\n\t$(SOURCE_PATH)/../../notes/tests/trs80_test.c\r\n\r\nvg5k_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k $(ZSDCC_OPTS) -compiler=sdcc \\\r\n\t-vn -lndos \\\r\n\t$(TEST_PATH)/vg5k_hello.c \\\r\n\t-create-app\r\n\r\nsms_chicken:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_OPTS) \\\r\n\t-vn -lndos \\\r\n\t-create-app \\\r\n\t-o $(BUILD_PATH)/sms_chicken.sms \\\r\n\t$(TEST_PATH)/chicken/chicken.c \\\r\n\t$(TEST_PATH)/chicken/chicken_graphics.asm\t\r\n\r\nsms_joy_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_OPTS) -clib=sdcc_iy -startup=17 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_sms.inc \\\r\n\t-create-app \\\r\n\t$(TEST_PATH)/sms_joy_test.c \\\r\n\t-o $(BUILD_PATH)/sms_joy_test.bin\r\n\trm $(BUILD_PATH)/sms_joy_test_CODE.bin\r\n\trm $(BUILD_PATH)/sms_joy_test_DATA.bin\r\n\trm $(BUILD_PATH)/sms_joy_test_BSS.bin\r\n\trm $(BUILD_PATH)/sms_joy_test_UNASSIGNED.bin\t\r\n\r\n\r\nm5_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t-create-app -vn -o$(BUILD_PATH)/m5_hello -lndos \\\r\n\t$(TEST_PATH)/hello.c\r\n\r\n\r\ntrs80_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) \\\r\n\t-create-app -vn -o$(BUILD_PATH)/trs80_hello -lndos \\\r\n\t$(TEST_PATH)/hello.c\t\r\n\t\r\nx1_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x1 $(SCCZ80_OPTS) \\\r\n\t-o $(BUILD_PATH)/x1_hello.bin -vn -lndos \\\r\n\t$(TEST_PATH)/hello.c\r\n\t\r\n\r\nx1_wait_press:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x1 $(SCCZ80_OPTS) \\\r\n\t-o $(BUILD_PATH)/x1_wait_press.bin -vn -lndos \\\r\n\t$(TEST_PATH)/wait_press.c\r\n\r\nz1013_getk:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS) \\\r\n\t-o $(BUILD_PATH)/z1013_getk.bin -vn -lndos \\\r\n\t$(TEST_PATH)/wait_press.c\t\r\n\t\r\nx1_getk:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x1 $(SCCZ80_OPTS) \\\r\n\t-o $(BUILD_PATH)/x1_getk.bin -vn -lndos \\\r\n\t$(TEST_PATH)/test_getk.c\r\n    \r\n\r\n\r\ngal_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-need=ansiterminal \\\r\n\t-pragma-include:$(SOURCE_PATH)/../cfg/z88dk/zpragma.inc \\\r\n\t-vn -lndos -create-app -Cz--audio \\\r\n\t$(TEST_PATH)/hello.c \\\r\n\t-o  $(BUILD_PATH)/hello.prg\r\n\trm $(BUILD_PATH)/hello.prg\r\n\t\r\n\t\r\nti85_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti85 $(SCCZ80_OPTS) $(TEST_PATH)/hello.c \\\r\n\t-lndos \\\r\n\t-create-app -o $(BUILD_PATH)/ti85_hello.bin\r\n\trm $(BUILD_PATH)/ti85_hello.bin\r\n\t\r\n# load \"hello.cpc\",&1200\r\n    \r\ncpc_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -lndos -clib=ansi  -create-app -subtype=dsk -o$(BUILD_PATH)/HELLO  -vn \\\r\n\t$(TEST_PATH)/helloworld.c\r\n\t# $(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_chase $(BUILD_PATH)/HELLO_cpc.cpc  $(BUILD_PATH)/HELLO_cpc.cdt\r\n\t# rm -rf HELLO_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd HELLO_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw HELLO_cpc.dsk -p $(BUILD_PATH)/HELLO_cpc.cpc xchase\r\n\t# mv HELLO_cpc.dsk $(BUILD_PATH)/\r\n\t# cp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t# $(TOOLS_PATH)/z88dk/cpc/nocart/nocart.exe  $(BUILD_PATH)/HELLO_cpc.dsk  $(BUILD_PATH)/HELLO_gx4000.cpr   -c 'run\"xchase'\r\n\t# rm os.rom\r\n\t# rm amsdos.rom\r\n\t# rm basic.rom\r\n\t# rm $(BUILD_PATH)/HELLO_cpc.cpc \r\n\r\n# memory &11ff\r\n# load \"color.cpc\",&1200\r\n# call &1200\r\ncpc_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -lndos -pragma-define:REGISTER_SP=-1 -clib=ansi  -create-app -subtype=dsk -o$(BUILD_PATH)/COLOR  -vn \\\r\n\t$(TEST_PATH)/cpc_test.c\r\n\t# $(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_chase $(BUILD_PATH)/HELLO_cpc.cpc  $(BUILD_PATH)/HELLO_cpc.cdt\r\n\t# rm -rf HELLO_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd HELLO_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw HELLO_cpc.dsk -p $(BUILD_PATH)/HELLO_cpc.cpc xchase\r\n\t# mv HELLO_cpc.dsk $(BUILD_PATH)/\r\n\t# cp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t# $(TOOLS_PATH)/z88dk/cpc/nocart/nocart.exe  $(BUILD_PATH)/HELLO_cpc.dsk  $(BUILD_PATH)/HELLO_gx4000.cpr   -c 'run\"xchase'\r\n\t# rm os.rom\r\n\t# rm amsdos.rom\r\n\t# rm basic.rom\r\n\t# rm $(BUILD_PATH)/HELLO_cpc.cpc \r\n\r\n\r\nmsx_bgcolor:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +msx -lndos -pragma-redirect:fputc_cons=fputc_cons_generic   -create-app -subtype=rom -o$(BUILD_PATH)/bgcolor  -vn \\\r\n\t$(TEST_PATH)/helloworld_background_color.c\r\n    \r\ncpc_bgcolor:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -lndos -pragma-define:REGISTER_SP=-1 \t-pragma-redirect:fputc_cons=fputc_cons_generic   -create-app -subtype=dsk -o$(BUILD_PATH)/bgcolor  -vn \\\r\n\t$(TEST_PATH)/helloworld_background_color.c\r\n\t# $(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_chase $(BUILD_PATH)/HELLO_cpc.cpc  $(BUILD_PATH)/HELLO_cpc.cdt\r\n\t# rm -rf HELLO_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd HELLO_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw HELLO_cpc.dsk -p $(BUILD_PATH)/HELLO_cpc.cpc xchase\r\n\t# mv HELLO_cpc.dsk $(BUILD_PATH)/\r\n\t# cp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t# $(TOOLS_PATH)/z88dk/cpc/nocart/nocart.exe  $(BUILD_PATH)/HELLO_cpc.dsk  $(BUILD_PATH)/HELLO_gx4000.cpr   -c 'run\"xchase'\r\n\t# rm os.rom\r\n\t# rm amsdos.rom\r\n\t# rm basic.rom\r\n\t# rm $(BUILD_PATH)/bgcolor\r\n\r\npps_vt52_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pps $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(TEST_PATH)/vt52_test.c \\\r\n\t-lndos -vn\r\n\t\r\ng800_vt52_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(TEST_PATH)/vt52_test.c \\\r\n\t-lndos -vn  \\\r\n\t-create-app -o\t\r\n\t\r\nsrr_vt52_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +srr $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(TEST_PATH)/vt52_test.c \\\r\n\t-lndos -vn  \\\r\n\t-create-app -o\r\n\trm a.srr \r\n\tmv a.wav $(BUILD_PATH)/srr_vt52_test.wav\r\n\r\neg2k_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -subtype=eg2000disk -create-app $(INCLUDE_OPTS) \\\r\n\t$(TEST_PATH)/hello.c\r\n\tmv a.cmd $(BUILD_PATH)/eg2k_hello.cmd\r\n\t\r\nz1013_hello:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS) $(INCLUDE_OPTS) $(TEST_PATH)/hello.c \\\r\n\t-lndos -vn -clib=ansi \\\r\n\t-create-app -o\r\n\tmv $(BUILD_PATH)/../A.Z80 $(BUILD_PATH)/z1013_hello.z80\r\n\trm $(BUILD_PATH)/../a.bin\r\n\r\nvg5k_wait_press:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k $(SCCZ80_OPTS) $(TEST_PATH)/wait_press.c \\\r\n\t-lndos -vn  -zorg=19000 \\\r\n\t-create-app -o $(BUILD_PATH)/vg5k_wait_press.prg\r\n\r\n\r\nz1013_wait_press:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS)  $(TEST_PATH)/wait_press.c \\\r\n\t-lndos -vn -clib=ansi \\\r\n\t-create-app -o\r\n\tmv $(BUILD_PATH)/../A.Z80 $(BUILD_PATH)/z1013_wait_press.z80\r\n\trm $(BUILD_PATH)/../a.bin\t\r\n\r\nsound_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +svi $(SCCZ80_OPTS) \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 -vn -lndos \\\r\n\t-create-app -o $(BUILD_PATH)/sound_test \\\r\n\ttest/sound_test.c\r\n\r\nconio_nascom:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nascom $(SCCZ80_OPTS) test/coniotest.c -create-app -o  $(BUILD_PATH)/conio.nas\r\n\t\t\t\r\n\r\nerror_z88dk:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k $(SCCZ80_OPTS) $(TEST_PATH)/error.c -o $(BUILD_PATH)/error_z88dk.prg\r\n\r\n\r\ncoleco_sound_test: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=adam -lndos -create-app  -vn \\\r\n\t$(TEST_PATH)/psg_test.c\r\n\r\nspectrum_sound_test: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx -lndos -create-app  -vn \\\r\n\t$(TEST_PATH)/psg_test.c\r\n\trm a.bin\r\n\trm a_BANK_7.bin\r\n\tmv a.tap $(BUILD_PATH)/spectrum_sound_test.tap\r\n\r\ncpc_sound_test: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -lndos -create-app -o$(BUILD_PATH)/SOUND_cpc.cpc  -vn \\\r\n\t$(TEST_PATH)/psg_test.c\r\n\t$(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_chase $(BUILD_PATH)/SOUND_cpc.cpc  $(BUILD_PATH)/SOUND_cpc.cdt\r\n\trm -rf SOUND_cpc.dsk\r\n\t$(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd SOUND_cpc.dsk\r\n\t$(TOOLS_PATH)/z88dk/cpc/cpcxfsw SOUND_cpc.dsk -p $(BUILD_PATH)/SOUND_cpc.cpc xchase\r\n\tmv SOUND_cpc.dsk $(BUILD_PATH)/\r\n\tcp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t$(TOOLS_PATH)/z88dk/cpc/nocart/nocart.exe  $(BUILD_PATH)/SOUND_cpc.dsk  $(BUILD_PATH)/SOUND_gx4000.cpr   -c 'run\"xchase'\r\n\trm os.rom\r\n\trm amsdos.rom\r\n\trm basic.rom\r\n\trm $(BUILD_PATH)/SOUND_cpc.cpc \r\n\r\n\r\nspectrum_bitbang:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t \\\r\n\t \\\r\n\t \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=200 \\\r\n\t-D__SPECTRUM__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_spectrum_48k.prg \\\r\n\t$(SOURCE_PATH)/../../test/bitbang.c \\\r\n\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_spectrum_48k.prg\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_spectrum_48k_BANK_7.bin\r\n\r\nzx_bit_bang: \r\n\tzcc.exe +zx -clib=default -lndos $(SOURCE_PATH)/../../test/fx.c -create-app\r\n\r\nsms_bit_bang: \r\n\tzcc.exe +sms -clib=default -lndos $(SOURCE_PATH)/../../test/fx.c -create-app\r\n\r\nsms_bitbang: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_OP TS) -clib=default \\\r\n\t-lndos \\\r\n\t$(SOURCE_PATH)/../../test/bitbang.c\r\n\t-create-app -osms_bitbang.sms\r\n    \r\nc128_bitbang: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS)  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos -subtype=disk \\\r\n\t-D__C128_Z80__ -DXSize=40 \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS -D__INCLUDE_CONIO_H  \\\r\n\t$(SOURCE_PATH)/../../test/bitbang.c \\\r\n\t-create-app -oa40.bin\r\n\t$(TOOLS_PATH)/generic/c1541 -format \"crosschase,0\" d64 FULL_c128_z80_40col.d64\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_40col.d64 -write a40.ldr\r\n\t$(TOOLS_PATH)/generic/c1541 -attach FULL_c128_z80_40col.d64 -write a40\r\n\tmv FULL_c128_z80_40col.d64 $(BUILD_PATH)/X$(GAME_NAME)_c128_z80_40col.d64\r\n\trm A40.LDR\r\n\trm A40\r\n\trm a40.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/ack/Makefile.ack_targets",
    "content": "\r\n# ------------------------------------------------------------------------------------------\r\n# ACK\r\n#\r\n\r\n# TODO:     minix68k  may required a recent ack version\r\nack_targets: \\\r\n    pc8086 \\\r\n    linux386 \\\r\n    linux68k \\\r\n    linuxppc \\\r\n    linuxmips \\\r\n    msdos86 \\\r\n    msdos386 \\\r\n    osx386 \\\r\n    osxppc\r\n    \r\n############################################################################################\r\n\r\n\r\n\r\ncpm_8080_buffered_ack:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mcpm \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=23 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__CPM8080__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__STDIO \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\tmv cpm.com $(BUILD_PATH)/X$(GAME_NAME)_cpm8080_buffered.com\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\ncpm_8080_adm3a_ack:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mcpm \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=22 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__CPM8080__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t$(FULL_FILES)\r\n\tmv cpm.com $(BUILD_PATH)/X$(GAME_NAME)_$@.com\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\ncpm_8080_ack_targets: \\\r\n\tcpm_8080_buffered_ack\r\n\r\n\r\n# \t-D__KEY_POLL_FROM_BUFFER \r\nmsdos: msdos86\r\n\r\nmsdos86:   $(ASSETS_PATH)/8x8_chars.h\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS)  -mmsdos86 \\\r\n\t-DXSize=40 \\\r\n\t-DYSize=25 \\\r\n\t-DACK \\\r\n\t-D__MSDOS86__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSDOS86_SLOWDOWN) \\\r\n\t-D__VGA_GRAPHICS \\\r\n\t-D__ALT_SLEEP -D__NO_SLEEP_SEC \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_NO_SMALL_LETTERS \\\r\n\t-D__KEY_POLL_FROM_BUFFER \\\r\n\t-D__SPEAKER_SOUNDS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos86/msdos86_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos86/init_vga.s \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o ../build/X$(GAME_NAME)_$@.com\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\npc8088: pc86\r\n\r\npc8086: pc86\r\n\r\npc86:  $(ASSETS_PATH)/8x8_chars.h\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mpc86 \\\r\n\t-DXSize=40 \\\r\n\t-DYSize=25 \\\r\n\t-DACK \\\r\n\t-D__MSDOS86__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSDOS86_SLOWDOWN) \\\r\n\t-D__VGA_GRAPHICS \\\r\n\t-D__ALT_SLEEP -D__NO_SLEEP_SEC \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_NO_SMALL_LETTERS \\\r\n\t-D__KEY_POLL_FROM_BUFFER \\\r\n\t-D__SPEAKER_SOUNDS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos86/msdos86_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos86/init_vga.s \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o ../build/X$(GAME_NAME)_$@.img\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\n# BROKEN\r\nmsdos386:  $(ASSETS_PATH)/8x8_chars.h\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mmsdos386 \\\r\n\t-DXSize=40 \\\r\n\t-DYSize=25 \\\r\n\t-DACK \\\r\n\t-D__MSDOS86__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSDOS86_SLOWDOWN) \\\r\n\t-D__VGA_GRAPHICS \\\r\n\t-D__ALT_SLEEP -D__NO_SLEEP_SEC \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_NO_SMALL_LETTERS \\\r\n\t-D__KEY_POLL_FROM_BUFFER \\\r\n\t-D__SPEAKER_SOUNDS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos386/msdos386_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/ack/msdos386/init386_vga.s \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o ../build/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\npc8086_targets: \\\r\n\tpc8086\r\n\r\n\r\n# buffered\r\nlinuxppc:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mlinuxppc \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\n\r\n#buffered\r\nlinux68k:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mlinux68k \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\n\r\n# buffered\r\nlinux386:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mlinux386 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\nlinuxmips:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mlinuxmips \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\nosx386:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mosx386 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\nosxppc:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mosxppc \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n\r\n\r\npdpv7:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mpdpv7 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\nminix68k:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mminix68k \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\nrpi:\r\n\t$(_ACK) $(_ACK_OPTS) $(ACK_MAKEFILE_COMPILATION_OPTS) $(INCLUDE_OPTS) -mrpi \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=21 \\\r\n\t-D__ADM3A \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURNED_BASED \\\r\n\t-DACK \\\r\n\t-D__STDIO \\\r\n\t-D__LINUXPPC__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\trm $(SOURCE_PATH)/../../*.o\r\n"
  },
  {
    "path": "src/makefiles.common/targets/amiga_gcc/Makefile.gcc_amiga_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# GCC AMIGA\r\n\r\n##############################################################################################\r\n\r\namiga_targets: \\\r\n\tamiga_buffered\r\n\r\ngcc_amiga_targets: \\\r\n    amiga_targets\r\n\r\n# -------------------------------------------------------------------------------------------\r\n\r\n\r\namiga_core_test:\r\n\t$(AMIGA_CC) -mcrt=nix13 \\\r\n\t$(SOURCE_PATH)/../test/main_use_amiga_core.c\r\n\r\namiga: amiga_buffered\r\n\r\namiga_buffered:\r\n\t$(AMIGA_CC) $(INCLUDE_OPTS) -mcrt=nix13 \\\r\n\t-D__AMIGA__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv a.out $(BUILD_PATH)/X$(GAME_NAME)_amiga_buffered.exe\r\n"
  },
  {
    "path": "src/makefiles.common/targets/atari_mint_gcc/Makefile_atari_st",
    "content": "###############################################################################################\r\n\r\natari_st: atari_st_ncurses\r\n\r\natari_st_ncurses:\r\n\t$(ATARI_ST_CC) $(INCLUDE_OPTS) -D__NCURSES__ \\\r\n\t-D__ATARI_ST__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI_ST_SLOWDOWN) \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D_XL_NO_JOYSTICK  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-lncurses\r\n\tmv a.out $(BUILD_PATH)/X$(GAME_NAME)_atari_st_ncurses.tos\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/cc65/Makefile_c128_8502",
    "content": "#######################################################################################\r\n# C128_8502\r\n\r\nc128_8502: c128_8502_40col\r\n\r\nc128_8502_40col: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c128 -DEXTRA_TITLE \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_8502_40COL_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/cc65/Makefile_c65",
    "content": "c65: c65_40_col_no_gfx\r\n\r\n# c65_no_gfx: \r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c65 \\\r\n\t# -D__C65__ -DXSize=80 -DYSize=25 \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C65_SLOWDOWN) \\\r\n\t# -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG \\\r\n\t# -D_XL_NO_JOYSTICK -D__NO_SLEEP -D__NO_WAIT -D__NO_INPUT -D_XL_NO_SOUND \\\r\n\t# $(FULL_FILES) \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\nifdef USE_TOOLS\r\n\r\nc65_crt: c65_80_col_no_gfx\r\n\tpython $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/X$(GAME_NAME)_$<.prg  $(BUILD_PATH)/X$(GAME_NAME)_$@.crt\r\nendif\r\n\r\n\r\n\r\n\r\nc65_80_col_no_gfx:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c65 \\\r\n\t-D__MEGA16__ -DXSize=80 -DYSize=25 -D__CRAM2K \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MEGA65_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__ALT_SLEEP -D__NO_SLEEP_SEC -D_XL_NO_JOYSTICK \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c65/c65_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nc65_40_col_no_gfx:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c65 \\\r\n\t-D__MEGA16__ -DXSize=40 -DYSize=25 -D__MEGA65_40COL \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MEGA65_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__ALT_SLEEP -D__NO_SLEEP_SEC -D_XL_NO_JOYSTICK \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c65/c65_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n# mega65: mega65_no_gfx\r\nmega65: mega65_40col_no_gfx\r\n\r\nmega65_40col: mega65_40col_no_gfx\r\nmega65_80col: mega65_80col_no_gfx\r\n\r\n# -D__NO_SLEEP -D__NO_WAIT\r\n# -D__DEFAULT_CLEAR_SCREEN\r\n# -DXSize=80 -DYSize=25\r\n# -D__NO_CLEAR_SCREEN\r\n# -D__NO_SLEEP -D_XL_NO_SLEEP -D__NO_WAIT -D__NO_INPUT -D_XL_NO_COLOR\r\n# -D_XL_NO_JOYSTICK   \\\r\n\r\n# -D_XL_NO_SOUND\r\nmega65_80col_no_gfx: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t mega65 \\\r\n\t-D__MEGA16__ -DXSize=80 -DYSize=25 -D__CRAM2K \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MEGA65_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__ALT_SLEEP -D__NO_SLEEP_SEC -D_XL_NO_JOYSTICK \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/mega65/mega65_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n# -D_XL_NO_SOUND\r\nmega65_40col_no_gfx: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t mega65 \\\r\n\t-D__MEGA16__ -DXSize=40 -DYSize=25  -D__MEGA65_40COL \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MEGA65_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__ALT_SLEEP -D__NO_SLEEP_SEC  \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/mega65/mega65_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n"
  },
  {
    "path": "src/makefiles.common/targets/cc65/Makefile_cx16",
    "content": "cx16_no_gfx: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t cx16 \\\r\n\t-D__CX16__ -DXSize=80 -DYSize=60 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CX16_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n    \r\ncx16: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t cx16 \\\r\n\t-D__CX16__ -DXSize=20 -DYSize=30 -D_XL_NO_SMALL_LETTERS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CX16_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/cx16/cx16_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/cx16/cx16_init_graphics.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg"
  },
  {
    "path": "src/makefiles.common/targets/cc65/Makefile_kim1",
    "content": "\r\nkim1_buffered: kim1_turn_based\r\n\r\n# start ay $0200\r\nkim1:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t kim1  \\\r\n\t$(INCLUDE_OPTS) -D__VT100 -D__NO_INPUT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t-DXSize=36 -DYSize=16 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SLEEP -D__NO_SLEEP_SEC  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__NO_CLEAR_SCREEN -D__NO_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n# start at $2000\r\nkim1_60k:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t kim1 --config kim1-60k.cfg \\\r\n\t$(INCLUDE_OPTS) -D__VT100 -D__NO_INPUT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t-DXSize=36 -DYSize=16 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SLEEP -D__NO_SLEEP_SEC \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__NO_CLEAR_SCREEN -D__NO_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n# for expanded KIM-1 w/ K-1008 Graphics and 60K RAM\r\n# start at $2000\r\nkim1_mtu60k: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t kim1 --config kim1-mtu60k.cfg \\\r\n\t$(INCLUDE_OPTS) -D__VT100 -D__NO_INPUT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t-DXSize=36 -DYSize=16 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SLEEP -D__NO_SLEEP_SEC  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__NO_CLEAR_SCREEN -D__NO_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nkim1_turn_based: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t kim1  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTURN_BASED -D_XL_NO_JOYSTICK  -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES)\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\t# $(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_$@.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\t# rm $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\t# mv $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n"
  },
  {
    "path": "src/makefiles.common/targets/cc65/Makefile_osic1p",
    "content": "osic1p: osic1p_32k\r\nosic1p_buffered: osic1p_32k_turn_based\r\n\r\nosic1p_32k:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) --start-addr 0x200 -Wl -D,__HIMEM__=0x8000 -O -t osic1p  \\\r\n\t-D__ALT_SLEEP -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\t$(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_$@.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\r\n\r\nosic1p_32k_turn_based: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) --start-addr 0x200 -Wl -D,__HIMEM__=0x8000 -O -t osic1p  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTURN_BASED -D_XL_NO_JOYSTICK  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\t$(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_$@.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n"
  },
  {
    "path": "src/makefiles.common/targets/cc65/Makefile_sym1",
    "content": "\r\nsym1_buffered: sym1_turn_based\r\n\r\nsym1:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t sym1  \\\r\n\t$(INCLUDE_OPTS) -D__VT100 -D__NO_INPUT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t-DXSize=36 -DYSize=16 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SLEEP -D__NO_SLEEP_SEC  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__NO_CLEAR_SCREEN -D__NO_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nsym1_32k:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t sym1 --config sym1-32k.cfg  \\\r\n\t$(INCLUDE_OPTS) -D__VT100 -D__NO_INPUT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t-DXSize=36 -DYSize=16 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SLEEP -D__NO_SLEEP_SEC  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__NO_CLEAR_SCREEN -D__NO_PRINT \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nsym1_turn_based: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t sym1  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTURN_BASED -D_XL_NO_JOYSTICK  -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES)\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\t# $(TOOLS_PATH)/cc65/osic1p/srec_cat $(BUILD_PATH)/X$(GAME_NAME)_$@.lod -binary -offset 0x200 -o $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p -Ohio_Scientific -execution-start-address=0x200\t\r\n\t# rm $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n\t# mv $(BUILD_PATH)/X$(GAME_NAME)_$@.c1p $(BUILD_PATH)/X$(GAME_NAME)_$@.lod\r\n"
  },
  {
    "path": "src/makefiles.common/targets/cc65/Makefile_telestrat",
    "content": "#######################################################################################\r\n# TELESTRAT\r\n\r\ntelestrat: telestrat_buffered\r\n\r\ntelestrat_buffered: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t telestrat \\\r\n\t-D__TELESTRAT__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TELESTRAT_SLOWDOWN) \\\r\n\t-D__BUFFERED_GRAPHICS -DTURN_BASED -D__STDIO -DXSize=38 -DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__NO_WAIT -D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n# cp $(BUILD_PATH)/X$(GAME_NAME)_$@ /cygdrive/C/Emulation/Computers/Oricutron_win64-20200515/sdcard/bin/xchase\r\n\r\n\r\ntelestrat_joy_buffered: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t telestrat \\\r\n\t-D__TELESTRAT__ -DCC65_JOYSTICK \\\r\n\t-D__BUFFERED_GRAPHICS -DTURN_BASED -D__STDIO -DXSize=38 -DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_SLOW_DOWN_FACTOR=800 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TELESTRAT_SLOWDOWN) \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n# cp $(BUILD_PATH)/X$(GAME_NAME)_$@ /cygdrive/C/Emulation/Computers/Oricutron_win64-20200515/sdcard/bin/xchase\r\n"
  },
  {
    "path": "src/makefiles.common/targets/emcc/Makefile.emcc_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# EMCC\r\n\r\n\r\nEM_CC ?= emcc\r\nEM_OPTS = \r\n\r\n##############################################################################################\r\n\r\nemcc_targets: \\\r\n    emcc_buffered\r\n\r\n##############################################################################################\r\n\r\nemcc: emcc_buffered\r\n\r\nemcc_buffered:\r\n\t$(EM_CC) $(INCLUDE_OPTS)  \\\r\n\t-D__EMCC__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=9 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT -D__NO_WAIT  \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o FULL_emcc_buffered.html\r\n\tmv FULL_emcc_buffered.js $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.wasm $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.html $(BUILD_PATH)\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_emcc_buffered.* /home/fcaruso/build/emsdk\r\n\r\nemcc_exp:\r\n\t$(EM_CC) $(INCLUDE_OPTS)  \\\r\n\t-D__EMCC__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=24 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_SLEEP -D__NO_PRINT -D__NO_WAIT \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o FULL_emcc_buffered.html\r\n\tmv FULL_emcc_buffered.js $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.wasm $(BUILD_PATH)\r\n\tmv FULL_emcc_buffered.html $(BUILD_PATH)\r\n\tcp $(BUILD_PATH)/X$(GAME_NAME)_emcc_buffered.* /home/fcaruso/build/emsdk\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/gcc4ti/Makefile_ti99",
    "content": "###############################################################################################\r\n\r\n# ------------------------------------------------------------------------------------------\r\n# TMS9000-GCC\r\n#   \r\n\r\n\r\n# Paths to TMS9900 compilation tools \r\n# ( Set in environment to override paths )\r\nTMS9900_DIR?=$(TMS9900-GCC_PATH)\r\n#/opt/gcc4ti/bin\r\nELF2EA5_DIR?=$(CFG_PATH)gcc4ti99/elf2ea5\r\nEA5_SPLIT_DIR?=$(CFG_PATH)gcc4ti99/ea5split\r\nCLASSIC99_DSK1?=$(CFG_PATH)gcc4ti99/DSK1\r\n# ELF2EA5_DIR?=/home/fabri/Retro/GCC4TI/elf2ea5\r\n# EA5_SPLIT_DIR?=/home/fabri/Retro/GCC4TI/ea5split\r\n# CLASSIC99_DSK1?=/home/fabri/Retro/GCC4TI/DSK1\r\n\r\n\r\n# Full paths to the executables used\r\nGAS=$(TMS9900_DIR)/tms9900-as\r\nLD=$(TMS9900_DIR)/tms9900-ld\r\nCC=$(TMS9900_DIR)/tms9900-gcc\r\nAR=$(TMS9900_DIR)/tms9900-ar\r\nELF2EA5=$(ELF2EA5_DIR)/elf2ea5\r\nEA5_SPLIT=$(EA5_SPLIT_DIR)/ea5split\r\n\r\nLDFLAGS_EA5=\\\r\n  --section-start .text=a000 --section-start .data=2080 -M\r\n\r\n\r\n#  -fno-peephole2 -fno-function-cse\r\nC_FLAGS=\\\r\n   -std=c99 $(GCC4TI99_MAKEFILE_COMPILATION_OPTS) $(TI99_GAME_OPTS) -s -I./ -fno-builtin\r\n\r\n\r\n\r\nTI99_CC ?= tms9900-gcc \r\n\r\n# -DBUGGY_MOD5\r\nTI99_TINY_OPTS ?= \\\r\n\t$(C_FLAGS) $(GLOBAL_OPTS) \\\r\n\t-D__TI99__ -nostdlib -DNO_RANDOM_LEVEL \\\r\n\t-DXSize=32   \\\r\n\t-DYSize=24  \\\r\n\t-D__ALT_SLEEP -D__ALT_RAND \\\r\n\t-DTINY_GAME -DNO_WALL  \\\r\n\t-D__VDP_MODE1_GRAPHICS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=10*$(_TI99_SLOWDOWN)\r\n\r\n\r\n# -DBUGGY_MOD5 -DBUGGY_VERTICAL_DRAW -DBUGGY_GCC_TI99\r\nTI99_OPTS ?= \\\r\n\t$(C_FLAGS) $(GLOBAL_OPTS) \\\r\n\t-D__TI99__ -nostdlib \\\r\n\t-DXSize=32   \\\r\n\t-DYSize=23  \\\r\n\t-D__ALT_SLEEP    -D__ALT_RAND \\\r\n\t-D__VDP_MODE1_GRAPHICS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=10*$(_TI99_SLOWDOWN)\r\n\r\n\r\nTI99_KEY_OPTS ?= \\\r\n\t$(C_FLAGS) $(GLOBAL_OPTS) \\\r\n\t-D__TI99__ -nostdlib \\\r\n\t-DXSize=32   \\\r\n\t-DYSize=23  \\\r\n\t-D__ALT_SLEEP    -D__ALT_RAND \\\r\n\t-D__VDP_MODE1_GRAPHICS -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=10*$(_TI99_SLOWDOWN)\r\n\r\n\r\n# TI99_OPTS = TI99_JOY_OPTS\r\n\r\n\r\nTI99_DEBUG_OPTS ?= \\\r\n\t$(C_FLAGS) $(GLOBAL_OPTS) \\\r\n\t-D__TI99__ -nostdlib \\\r\n\t-DXSize=32 -DYSize=23  \\\r\n\t-DBUGGY_MOD5 -DBUGGY_VERTICAL_DRAW -DBUGGY_GCC_TI99 \\\r\n\t-D__ALT_SLEEP    -D__ALT_RAND \\\r\n\t-D__VDP_MODE1_GRAPHICS -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=10*$(_TI99_SLOWDOWN)\r\n\r\n##################################################################################################\r\n\r\n# Paths to TMS9900 compilation tools\r\nGAS=tms9900-as\r\nLD=tms9900-ld\r\nTI99CC=tms9900-gcc\r\nCXX=tms9900-c++\r\nOBJCOPY=tms9900-objcopy\r\n\r\n\r\n# Flags used during linking\r\n# Refer to the linker rules in an external file\r\nLDFLAGS=\\\r\n  --script=$(CFG_PATH)gcc4ti99/linkfile.cfg \r\n\r\n\r\nOBJECT_LIST= \\\r\n  $(TOOLS_PATH)/ti99/crt0_ea5.o \\\r\n  $(CROSS_LIB_PATH)/display/display_macros.o \\\r\n  $(CROSS_LIB_PATH)/input/input_macros.o \\\r\n  $(CROSS_LIB_PATH)/rand/rand.o \\\r\n  $(CROSS_LIB_PATH)/sleep/sleep_macros.o \\\r\n  $(CROSS_LIB_PATH)/display/init_graphics/gcc4ti99/gcc4ti99_init_graphics.o \\\r\n  $(CROSS_LIB_PATH)/sound/gcc4ti99/ti99_sounds.o \\\r\n  $(SOURCE_PATH)/main.o\r\n\r\n\r\nOBJECT_DEBUG_LIST= \\\r\n  $(TOOLS_PATH)/ti99/crt0_ea5.o \\\r\n  $(SOURCE_PATH)/main.o\r\n\r\n\r\n\r\nTI99_INCLUDE_OPTS ?= $(INCLUDE_OPTS) -I$(TMS9900-GCC_PATH)/../include\r\n\r\n# Recipes to compile individual files\r\n%.o: %.asm\r\n\t$(GAS) $< -o $@\r\n%.o: %.c\r\n\t$(TI99CC) $(TI99_INCLUDE_OPTS) $(TI99_OPTS) -c $< -o $@\r\n\r\n# %.o:\r\n\t# $(GAS) $< -o $@\r\n# %.o:\r\n\t# $(TI99CC) $(TI99_INCLUDE_OPTS) $(TI99_OPTS) -c $< -o $@\r\n\r\n.PHONY: %.o xchase.ea5.elf\r\n\r\nti99clean:\r\n\trm -f *.o\r\n\trm -f *.elf\r\n\trm -f *.cart\r\n\r\n# \t$(TI99CC) $(TI99_INCLUDE_OPTS) $(TI99_FULL_OPTS) -c $< -o $@\r\n\r\n\r\n# List of all files needed in executable\r\nTINY_PREREQUISITES=\\\r\n  $(OBJECT_LIST)\r\n\r\nPREREQUISITES=\\\r\n  $(OBJECT_LIST)\r\n\r\nPREREQUISITES_DEBUG=\\\r\n  $(OBJECT_DEBUG_LIST)\r\n  \r\n#####################################################################\r\n\r\n\r\nxchase.ea5.elf: $(PREREQUISITES)\r\n\t$(LD) $(OBJECT_LIST) $(LDFLAGS_EA5) -L$(LIB_TI99_PATH) -lti99 -o xchase.ea5.elf > xchase.map\r\n\t# $(LD) $(OBJECT_LIST) $(LDFLAGS) -o $@ -allow-multiple-definition\r\n\r\nxchase.ea5.debug.elf: $(PREREQUISITES_DEBUG)\r\n\t$(LD) $(OBJECT_DEBUG_LIST) $(LDFLAGS_EA5) -L$(LIB_TI99_PATH) -lti99 -o xchase.ea5.debug.elf > xchase.map\r\n\t# $(LD) $(OBJECT_LIST) $(LDFLAGS) -o $@ -allow-multiple-definition\r\n\r\nti99: ti\r\n\r\n# lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))\r\n# $(shell echo $VAR | tr A-Z a-z)\r\n# $(shell echo $VAR | tr a-z A-Z)\r\n\r\nti: $(ASSETS_PATH)/8x8_chars.h xchase.ea5.elf $(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) $(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT)\r\n\t$(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) xchase.ea5.elf x$(GAME_NAME)1.ea5.bin\r\n\t$(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT) x$(GAME_NAME)1.ea5.bin\r\n\tjava -jar $(TOOLS_PATH)/ti99/ea5tocart.jar  X$(shell echo $(GAME_NAME) | tr a-z A-Z)1 X$(GAME_NAME)_$@\r\n\trm -rf xchase.map\r\n\trm -rf ea5.map\r\n\trm -rf xchase.ea5.elf\r\n\trm -rf $(SOURCE_PATH)/main.o $(CROSS_LIB_PATH)/sound/gcc4ti99/ti99_sounds.o $(CROSS_LIB_PATH)/display/display_macros.o $(CROSS_LIB_PATH)/input/input_macros.o $(CROSS_LIB_PATH)/rand/rand.o $(CROSS_LIB_PATH)/sleep/sleep_macros.o $(CROSS_LIB_PATH)/display/init_graphics/gcc4ti99/gcc4ti99_init_graphics.o \r\n\tmv X$(shell echo $(GAME_NAME) | tr a-z A-Z)* $(BUILD_PATH)/\r\n\tmv $(BUILD_PATH)/X$(shell echo $(GAME_NAME) | tr a-z A-Z)18.bin $(BUILD_PATH)/X$(shell echo $(GAME_NAME) | tr a-z A-Z)ti.bin\r\n\trm -rf x$(GAME_NAME)1.ea5.bin\r\n\r\n\r\nti99debug: $(ASSETS_PATH)/8x8_chars.h xchase.ea5.debug.elf $(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) $(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT)\r\n\t$(TOOLS_PATH)/ti99/elf2ea5$(COMPILEDEXT) xchase.ea5.debug.elf x$(GAME_NAME)1.ea5.bin\r\n\t$(TOOLS_PATH)/ti99/ea5split$(COMPILEDEXT) x$(GAME_NAME)1.ea5.bin\r\n\trm -rf xchase.map\r\n\trm -rf ea5.map\r\n\trm -rf xchase.ea5.debug.elf\r\n\tmv X$(GAME_NAME)* $(BUILD_PATH)/\r\n\trm -rf x$(GAME_NAME)1.ea5.bin\r\n\r\n\r\nti99_targets: \\\r\n\tti99\r\n\r\ngcc_ti99_targets: \\\r\n\tti99_targets\r\n\r\n\t# $(OBJCOPY) -O binary -j .text -j .data -j .ctors ti99_cross_chase.elf ti99_cross_chase.cart \r\n\t# mv ti99_cross_chase.cart $(BUILD_PATH)\r\n\t# mv ti99_cross_chase.elf $(BUILD_PATH)\r\n\r\n\r\n# Recipe to clean all compiled objects\r\n# .phony ti99clean:\r\n\t# rm -f *.o\r\n\t# rm -f *.elf\r\n\t# rm -f *.cart\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/gcc_z8k_pcos/Makefile.gcc_z8k_pcos_targets",
    "content": "\r\n# ------------------------------------------------------------------------------------------\r\n# Z8K-PCOS-GCC\r\n#\r\n\r\n\r\n# Currently to be compiled in Linux (because the source code of the compiler won't easily compile)\r\nolivetti_m20_targets: \\\r\n\tolivetti_m20_buffered\r\n\r\n\r\ngcc_z8k_targets: \\\r\n    olivetti_m20_targets\r\n\r\n\r\n###################################################################################################\r\n\r\n\r\nm20: olivetti_m20\r\n\r\nolivetti_m20: olivetti_m20_buffered\r\n\r\n\r\nm20_buffered: olivetti_m20_buffered\r\n\r\nolivetti_m20_buffered: $(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT)\r\n\t$(Z8K-PCOS-GCC) $(Z8K-PCOS-GCC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-D__OLIVETTI_M20__ \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tcp $(TOOLS_PATH)/olivetti_m20/pcos20h_empty.img FULL_m20_buffered.img\r\n\t$(TOOLS_PATH)/olivetti_m20/m20 X$(GAME_NAME)_m20_buffered.img put aout.cmd\r\n\trm aout.cmd\r\n\tmv FULL_m20_buffered.img $(BUILD_PATH)\r\n\t\r\n\t\r\nolivetti_m20_no_graphics: $(TOOLS_PATH)/olivetti_m20/m20$(COMPILEDEXT)\r\n\t$(Z8K-PCOS-GCC) $(Z8K-PCOS-GCC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gcc_buffered$(COMPILEDEXT)\t\t\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/sdcc/Makefile.sdcc_targets",
    "content": "# JUST A STUB\r\n\r\n# ------------------------------------------------------------------------------------------\r\n# SDCC\r\n#\r\n\r\nMACROS___NO_GRAPHICS ?= \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_CHASE \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN\r\n\r\nsdcc_display_macros: \r\n\tsdcc -c $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MACROS___NO_GRAPHICS) $(CROSS_LIB_PATH)/display/display_macros.c\r\n\t"
  },
  {
    "path": "src/makefiles.common/targets/vbcc/Makefile_amiga",
    "content": "\r\n# -----------------------------------------------------------------------\r\namiga: amiga_kick13_buffered\r\n\r\namiga_kick13_buffered:\r\n\t$(VBCC_COMPILER) +kick13 $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND -D__AMIGA_KICK13__ -DVBCC  \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AMIGA_SLOWDOWN) \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/vbcc/Makefile_atari_jaguar",
    "content": "# -----------------------------------------------------------------------\r\n\r\natari_jaguar: atari_jaguar_buffered\r\n\r\natari_jaguar_buffered:\r\n\t$(VBCC_COMPILER) +jaguar $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND -D__ATARI_JAGUAR__ -DVBCC  \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI_JAGUAR_SLOWDOWN) \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\tmv xchase $(BUILD_PATH)/\r\n\t# mv xchase.inf $(BUILD_PATH)/\r\n\t# mv xchase $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered\r\n\t# mv xchase.inf $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered.inf\r\n"
  },
  {
    "path": "src/makefiles.common/targets/vbcc/Makefile_bbc",
    "content": "\nbbcmaster: bbcmaster130\n\n\nbbcmaster130: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) $(ASSETS_PATH)/8x8_chars.h\n\t$(VBCC_COMPILER) +$(CROSS_LIB_PATH)/cfg/vbcc/bbc/bbc7$(IF_POSIX) -v $(VBCC_MAKEFILE_COMPILATION_OPTS) $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NORMALIZED_RAND -D__BBC__ -D_XL_NO_JOYSTICK \\\n\t-DXSize=20 -D__BBC_MODE=130 -D__BBC_GRAPHICS \\\n\t-DYSize=31 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BBC_SLOWDOWN) \\\n\t-D__ALT_SLEEP $(4COLOR_PALETTE) \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc/bbc_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/vbcc/bbc/bbc_sounds.c \\\n\t$(FULL_FILES) -o $(GAME_NAME)\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img $(GAME_NAME)\n\tmv $(GAME_NAME).inf $(BUILD_PATH)/X$(GAME_NAME)_$@.inf\n\tmv $(GAME_NAME) $(BUILD_PATH)/X$(GAME_NAME)_$@\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\n\n# KO\nbbcmastertest: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) $(ASSETS_PATH)/8x8_chars.h\n\t$(VBCC_COMPILER) +$(CROSS_LIB_PATH)/cfg/vbcc/bbc/bbc7$(IF_POSIX) -v $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NORMALIZED_RAND -D__BBC__ -D_XL_NO_JOYSTICK \\\n\t-DXSize=20 -D__BBC_MODE=130 -D__BBC_GRAPHICS \\\n\t-DYSize=31 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BBC_SLOWDOWN) \\\n\t-D__ALT_SLEEP $(4COLOR_PALETTE) \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc/bbc_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/vbcc/bbc/bbc_sounds.c \\\n\t$(FULL_FILES) -o $(GAME_NAME)\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img $(GAME_NAME)\n\tmv $(GAME_NAME).inf $(BUILD_PATH)/X$(GAME_NAME)_$@.inf\n\tmv $(GAME_NAME) $(BUILD_PATH)/X$(GAME_NAME)_$@\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\n\n# OK\nbbcmastertest1: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) $(ASSETS_PATH)/8x8_chars.h\n\t$(VBCC_COMPILER) +$(CROSS_LIB_PATH)/cfg/vbcc/bbc/bbc7$(IF_POSIX) -O1 -v $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NORMALIZED_RAND -D__BBC__ -D_XL_NO_JOYSTICK \\\n\t-DXSize=20 -D__BBC_MODE=130 -D__BBC_GRAPHICS \\\n\t-DYSize=31 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BBC_SLOWDOWN) \\\n\t-D__ALT_SLEEP $(4COLOR_PALETTE) \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc/bbc_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/vbcc/bbc/bbc_sounds.c \\\n\t$(FULL_FILES) -o $(GAME_NAME)\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img $(GAME_NAME)\n\tmv $(GAME_NAME).inf $(BUILD_PATH)/X$(GAME_NAME)_$@.inf\n\tmv $(GAME_NAME) $(BUILD_PATH)/X$(GAME_NAME)_$@\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\n\n\n\n# OK\nbbctest1: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) $(ASSETS_PATH)/8x8_chars.h\n\t$(VBCC_COMPILER) +$(CROSS_LIB_PATH)/cfg/vbcc/bbc/bbc5$(IF_POSIX) -O1 -v $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NORMALIZED_RAND -D__BBC__ -D_XL_NO_JOYSTICK \\\n\t-DXSize=20 -D__BBC_MODE=5 -D__BBC_GRAPHICS \\\n\t-DYSize=31 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BBC_SLOWDOWN) \\\n\t-D__ALT_SLEEP $(4COLOR_PALETTE) \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc/bbc_init_graphics_test.c \\\n\t$(CROSS_LIB_PATH)/sound/vbcc/bbc/bbc_sounds.c \\\n\t$(FULL_FILES) -o $(GAME_NAME)\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img $(GAME_NAME)\n\tmv $(GAME_NAME).inf $(BUILD_PATH)/X$(GAME_NAME)_$@.inf\n\tmv $(GAME_NAME) $(BUILD_PATH)/X$(GAME_NAME)_$@\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\n\n\n\n\nbbc: bbc5\n\nbbc7: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT)\n\t$(VBCC_COMPILER) +$(CROSS_LIB_PATH)/cfg/vbcc/bbc/bbc7$(IF_POSIX) -v $(VBCC_MAKEFILE_COMPILATION_OPTS) $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NORMALIZED_RAND -D__BBC__ \\\n\t-DXSize=40 -D__BBC_MODE=7 -D__BBC_GRAPHICS -D_XL_NO_UDG \\\n\t-DYSize=24 $(4COLOR_PALETTE) $(BBC7_GAME_OPTS) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BBC_SLOWDOWN) \\\n\t-D_XL_NO_COLOR \\\n\t-D__ALT_SLEEP \\\n\t-D_XL_NO_JOYSTICK \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc/bbc_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/vbcc/bbc/bbc_sounds.c \\\n\t$(FULL_FILES) -o $(GAME_NAME)\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img $(GAME_NAME)\n\tmv $(GAME_NAME).inf $(BUILD_PATH)/X$(GAME_NAME)_$@.inf\n\tmv $(GAME_NAME) $(BUILD_PATH)/X$(GAME_NAME)_$@\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\n\n\nbbc2: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) $(ASSETS_PATH)/8x8_chars.h\n\t$(VBCC_COMPILER) +$(CROSS_LIB_PATH)/cfg/vbcc/bbc/bbc2$(IF_POSIX) -v $(VBCC_MAKEFILE_COMPILATION_OPTS) $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NORMALIZED_RAND -D__BBC__ -D_XL_NO_JOYSTICK \\\n\t-DXSize=20 -D__BBC_MODE=2 -D__BBC_GRAPHICS \\\n\t-DYSize=31 $(4COLOR_PALETTE) \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BBC_SLOWDOWN) \\\n\t-D__ALT_SLEEP \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc/bbc_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/vbcc/bbc/bbc_sounds.c \\\n\t$(FULL_FILES) -o $(GAME_NAME)\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img $(GAME_NAME)\n\tmv $(GAME_NAME).inf $(BUILD_PATH)/X$(GAME_NAME)_$@.inf\n\tmv $(GAME_NAME) $(BUILD_PATH)/X$(GAME_NAME)_$@\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\n\n\nbbc5: $(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) $(ASSETS_PATH)/8x8_chars.h\n\t$(VBCC_COMPILER) +$(CROSS_LIB_PATH)/cfg/vbcc/bbc/bbc5$(IF_POSIX) -v $(VBCC_MAKEFILE_COMPILATION_OPTS) $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\n\t-D__NORMALIZED_RAND -D__BBC__ -D_XL_NO_JOYSTICK \\\n\t-DXSize=20 -D__BBC_MODE=5 -D__BBC_GRAPHICS \\\n\t-DYSize=31 \\\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BBC_SLOWDOWN) \\\n\t-D__ALT_SLEEP $(4COLOR_PALETTE) \\\n\t-D__DEFAULT_CLEAR_SCREEN \\\n\t$(CROSS_LIB_PATH)/display/init_graphics/vbcc/bbc/bbc_init_graphics.c \\\n\t$(CROSS_LIB_PATH)/sound/vbcc/bbc/bbc_sounds.c \\\n\t$(FULL_FILES) -o $(GAME_NAME)\n\t$(TOOLS_PATH)/bbc/bbcim$(COMPILEDEXT) -a X$(GAME_NAME)_$@.img $(GAME_NAME)\n\tmv $(GAME_NAME).inf $(BUILD_PATH)/X$(GAME_NAME)_$@.inf\n\tmv $(GAME_NAME) $(BUILD_PATH)/X$(GAME_NAME)_$@\n\tmv X$(GAME_NAME)_$@.img $(BUILD_PATH)\n\n"
  },
  {
    "path": "src/makefiles.common/targets/vbcc/Makefile_m65",
    "content": "# -----------------------------------------------------------------------\r\n\r\nm65: m65_buffered\r\n\r\nm65_buffered:\r\n\t$(VBCC_COMPILER) +m65 $(VBCC_BBC_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NORMALIZED_RAND  -DVBCC -D__MEGA65__ \\\r\n\t-DXSize=39 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO -DEVEN_LOOP_MOVE -DTURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -DTURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t -DTURN_BASED_EFFECT_SCALE=1 -DTURN_BASED_WAIT_SCALE=1 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t -D_XL_NO_SLEEP \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M65_SLOWDOWN) \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) -o xchase\r\n\tmv xchase $(BUILD_PATH)/\r\n\t# mv xchase.inf $(BUILD_PATH)/\r\n\t# mv xchase $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered\r\n\t# mv xchase.inf $(BUILD_PATH)/X$(GAME_NAME)_bbc_buffered.inf\r\n"
  },
  {
    "path": "src/makefiles.common/targets/xtc68/Makefile.xtc68_targets",
    "content": "# ------------------------------------------------------------------------------------------\r\n# XTC68\r\n#\r\n\r\n# xtc86 targets\r\nsinclair_ql_targets: \\\r\n\tsinclair_ql_tiny_buffered\r\n\r\n\r\nXTC68_OPTS = -D__XTC68__ -I$(SOURCE_PATH) \\\r\n\r\n\r\nxtc68_targets: sinclair_ql_targets\r\n\r\n\r\n#############################################################################################\r\n\r\nXTC68_ALL_OPTS ?= \\\r\n\t$(XTC68_OPTS) $(INCLUDE_OPTS)\\\r\n\t-I$(SOURCE_PATH) \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_PRINT \t\r\n\r\n\r\nsinclair_ql: sinclair_ql_tiny_buffered\r\n\r\n\r\nsinclair_ql_tiny_buffered:\r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/level.c -o level.o\r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/init_images.c -o init_images.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(CROSS_LIB_PATH)/display/display_macros.c -o display_macros.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(CROSS_LIB_PATH)/input/input_macros.c -o input_macros.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(CROSS_LIB_PATH)/text/text_macros.c -o text_macros.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/move_player.c -o move_player.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/ghost.c  -o ghost.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/character.c -o character.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/game_text.c -o game_test.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/strategy.c -o strategy.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) -c $(SOURCE_PATH)/main.c -o main.o \r\n\t$(XTC68) $(XTC68_ALL_OPTS) /usr/local/qdos/lib/crt.o \\\r\n\tlevel.o init_images.o display_macros.o input_macros.o text_macros.o move_player.o ghost.o character.o game_test.o strategy.o main.o \r\n\trm level.o init_images.o display_macros.o input_macros.o text_macros.o move_player.o ghost.o character.o game_test.o strategy.o main.o\r\n\tmv a_out $(BUILD_PATH)/X$(GAME_NAME)_TINY_SinclairQL_buffered.out\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_abc80",
    "content": "\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) abc80.bin $(BUILD_PATH)/xchase.bac 49200\r\n\r\n\r\n# abc80_old:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +abc80 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t# -D__ABC80__ -clib=ansi -vn  \\\r\n\t# -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ABC80_SLOWDOWN) \\\r\n\t# -D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\r\n\t# -lndos -create-app -o abc80.bin \\\r\n\t# $(FULL_FILES)\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2abc --bac80 -o $(BUILD_PATH)/xchase.bac -s 49200 abc80.bin\r\n\t# $(TOOLS_PATH)/z88dk/abc80/dosgen$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_abc80.dsk \r\n\t# $(TOOLS_PATH)/z88dk/abc80/doscopy$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_abc80.dsk -b $(BUILD_PATH)/xchase.bac\r\n\t# rm abc80.bin \r\n\t# mv $(BUILD_PATH)/xchase.bac $(BUILD_PATH)/X$(GAME_NAME)_abc80.bac\r\n\t# mv abc80.ihx $(BUILD_PATH)/X$(GAME_NAME)_abc80.ihx\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_abc80\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_abc80.bin\r\n    \r\n    \r\n# abc80_test0: $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(COMPILEDEXT)\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +abc80 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t# -D__ABC80__ -clib=ansi -vn  \\\r\n\t# -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ABC80_SLOWDOWN) \\\r\n\t# -D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\r\n\t# -lndos -create-app -o mo0 \\\r\n\t# $(FULL_FILES)\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2abc --bac80 -o $(BUILD_PATH)/xchase.bac -s 49200 mo0\r\n\t# rm -rf mo0\r\n\t# rm -rf mo0.ihx\r\n\t# $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(COMPILEDEXT) abc830 $(BUILD_PATH) $(BUILD_PATH)/X$(GAME_NAME)_abc80.dsk\r\n\t# rm -rf $(BUILD_PATH)/xchase.bac\r\n\r\n\r\n# TODO: Use a temp directory to create disk images\r\nabc80: $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite$(EXEEXT) $(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc$(EXEEXT)\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc80 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-D__ABC80__ -clib=ansi -vn  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ABC80_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\r\n\t-lndos -create-app -o mo0 \\\r\n\t$(FULL_FILES)\r\n\t$(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/bin2abc --bac80 -o $(BUILD_PATH)/xl.bac -s 49200 mo0\r\n\trm -rf mo0\r\n\trm -rf mo0.ihx\r\n\tmkdir $(BUILD_PATH)/tmp\r\n\tmv $(BUILD_PATH)/xl.bac $(BUILD_PATH)/tmp\r\n\t$(TOOLS_PATH)/z88dk/abc80/abcdisk-2.7/abcwrite abc830 $(BUILD_PATH)/tmp $(BUILD_PATH)/X$(GAME_NAME)_abc80.dsk\r\n\trm -rf $(BUILD_PATH)/tmp"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_abc800",
    "content": "##############################################################################\r\n\r\n# Can we do unbuffered/conio graphics?\r\n\r\nabc800: abc800_buffered\r\n\r\nabc800_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ABC800_SLOWDOWN) \\\r\n\t-D__STDIO -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -DNO_BLINKING -DXSize=39 -DYSize=22 \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t-D_XL_NO_SLEEP -D__NO_WAIT -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o a800.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) a800.bin $(BUILD_PATH)/xc800.bac 49200\r\n\t#$(TOOLS_PATH)/z88dk/abc80/bin2abc --bac800 -o $(BUILD_PATH)/xchase.bac abc80.bin\r\n\t# $(TOOLS_PATH)/z88dk/abc80/bin2abc --bac800 -o $(BUILD_PATH)/xc800.bac a800.bin\r\n\t# $(TOOLS_PATH)/z88dk/abc80/dosgen$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk \r\n\t# $(TOOLS_PATH)/z88dk/abc80/doscopy$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk -b $(BUILD_PATH)/xc800.bac\r\n\trm a800.bin \r\n\t# rm -rf $(BUILD_PATH)/xc800.bac\r\n\tmv a800.ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx \t\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_alphatro",
    "content": "##############################################################################\r\n\r\n\r\nalphatro:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +alphatro $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ALPHATRO__ -DXSize=40 -DYSize=24 \\\r\n\t-D__VT52 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALPHATRO_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_altair8800",
    "content": "#############################\r\n# ALTAIR 8800\r\n\r\n# altair8800: altair8800_buffered\r\n\r\naltair8800_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +altair8800 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=23 \\\r\n\t-D__ALTAIR8800__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t-vn -D_XL_NO_COLOR -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-lndos \\\r\n\t-D__BUFFERED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__STDIO \\\r\n\t-DTURN_BASED \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$@.rom\r\n\trm -rf $@_DATA.bin \r\n\trm -rf $@_BSS.bin \r\n\tmv $@.rom $(BUILD_PATH)/X$(GAME_NAME)_$@.rom\r\n\tmv $@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n# pet_16k: \r\n\t# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t pet -m mapfile.txt \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PET_SLOWDOWN) \\\r\n\t# -D__NO_INIT_GRAPHICS -D__CONIO_GRAPHICS -D_XL_NO_UDG  \\\r\n\t# $(FULL_FILES) \\\r\n\t# $(CROSS_LIB_PATH)/sound/cc65/pet/pet_sounds.c \\\r\n\t# -o $(BUILD_PATH)/X$(GAME_NAME)_pet_16k.prg\r\n\r\n# altair8800:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +altair8800 $(SCCZ80_OPTS) -v \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -DXSize=79 \\\r\n\t# -DYSize=23 \\\r\n\t# -D__ALTAIR8800__ \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t# -vn -D_XL_NO_COLOR -D_XL_NO_JOYSTICK \\\r\n\t# -D__NO_SCREEN_COLOR_INIT -D_XL_NO_UDG \\\r\n\t# -lndos __VT100 -D__INCLUDE_CONIO \\\r\n\t# -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t# -D__INCLUDE_STDIO \\\r\n\t# $(FULL_FILES) \\\r\n\t# -create-app -o$@.rom\r\n\t# rm -rf $@_DATA.bin \r\n\t# rm -rf $@_BSS.bin \r\n\t# mv $@.rom $(BUILD_PATH)/X$(GAME_NAME)_$@.rom\r\n\t# mv $@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n    \r\n    \r\naltair8800:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +altair8800 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -D__VT100 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTAIR8800_SLOWDOWN) \\\r\n\t-DXSize=79 -DYSize=23 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_attache",
    "content": "\r\n\r\n\r\n#############################\r\n# ATTACHE\r\n\r\nattache_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=attache \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__ADM3A \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATTACHE_GFX_SLOWDOWN) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\nattache: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=attache \\\r\n\t$(INCLUDE_OPTS) -DXSize=40 -DYSize=30 \\\r\n\t-D__ATTACHE__ \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATTACHE_SLOWDOWN) \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\t\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_aussie",
    "content": "\r\n#############################\r\n# AUSSIE\r\n\r\n# aussie:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -laussie  \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -D__AUSSIE__ \\\r\n\t# -D__BIT_BANG_SOUND \\\r\n\t# -D__ADM3A \\\r\n\t# -D__CPM_80X24__ \\\r\n\t# -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t# -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t# -create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t# $(FULL_FILES)\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\naussie:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -laussie \\\r\n\t$(INCLUDE_OPTS) --generic-console \\\r\n\t-pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AUSSIE_SLOWDOWN) \\\r\n\t-D__BIT_BANG_SOUND -DXSize=80 -DYSize=24 \\\r\n\t-D__AUSSIE__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_bee",
    "content": "\r\n\r\n#############################\r\n# MICROBEE\r\n\r\nbee_keyboard: bee_40col_gfx_mode2\r\nbee_standard_keyboard: bee_40col_standard_gfx_mode2\r\n\r\nbee_premium: bee\r\nbee: bee_40col_gfx_mode2_joystick\r\nbee_standard: bee_40col_standard_gfx_mode2_joystick\r\n\r\nbee_no_gfx: bee_40col_no_gfx\r\n\r\nbee_no_gfx_wav: bee_40col_no_gfx_wav\r\n\r\n\r\nbee_40col: bee_40col_no_gfx\r\n\r\nbee_40col_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ -clib=ansi40  -vn  -DXSize=40 -DYSize=25 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\nbee_40col_no_gfx_joystick:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ -clib=ansi40  -vn  -DXSize=40 -DYSize=25 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nbee_80col_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ --generic-console -DXSize=80 -DYSize=24 -vn  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nbee_80col_no_gfx_wav:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ --generic-console -DXSize=80 -DYSize=24 -vn -subtype=wav  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\nbee_40col_wav: bee_40col_no_gfx_wav\r\n\r\nbee_40col_no_gfx_wav:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ -clib=ansi40  -vn  -DXSize=40 -DYSize=25 -subtype=wav \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nbee_gfx: bee_40col_gfx_mode2\r\n\r\n\r\nbee_gfx_wav: bee_40col_gfx_mode2_wav\r\n\r\n\r\nbee_40col_gfx_mode2: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ --generic-console -vn -DXSize=40 -DYSize=25 -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS -D__SCREEN_MODE=2 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nbee_40col_gfx_mode2_joystick: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ --generic-console -vn -DXSize=40 -DYSize=25 \\\r\n\t-D__CONIO_GRAPHICS -D__SCREEN_MODE=2 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nbee_40col_standard_gfx_mode2: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-define:CLIB_BEE_PREMIUM=0 \\\r\n\t-D__BEE__ --generic-console -vn -DXSize=40 -DYSize=25 -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS -D__SCREEN_MODE=2 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n\r\nbee_40col_standard_gfx_mode2_joystick: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-define:CLIB_BEE_PREMIUM=0 \\\r\n\t-D__BEE__ --generic-console -vn -DXSize=40 -DYSize=25 \\\r\n\t-D__CONIO_GRAPHICS -D__SCREEN_MODE=2 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\nbee_40col_gfx_mode2_wav: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ --generic-console -vn -subtype=wav -DXSize=40 -DYSize=25 -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS -D__SCREEN_MODE=2 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg  \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEE_SLOWDOWN) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_bic",
    "content": "\r\n#############################\r\n# BIC\r\n\r\n\r\nbic_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=bic \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=21 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BIC_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTURN_BASED -D_XL_NO_COLOR -D_XL_NO_JOYSTICK \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__STDIO \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\nbic:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=bic \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=21 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BIC_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_bit90",
    "content": "#############################\r\n# BIT90\r\n\r\n\r\nbit90_joystick: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +coleco $(SCCZ80_OPTS) $(INCLUDE_OPTS) -subtype=bit90 \\\r\n\t-D__COLECO__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BIT90_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\t\r\n\t\r\nbit90: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +coleco $(SCCZ80_OPTS) $(INCLUDE_OPTS) -subtype=bit90 \\\r\n\t-D__COLECO__ \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BIT90_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_bondwell",
    "content": "bondwell:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=bondwell \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BONDWELL_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_bondwell2",
    "content": "# UDG may be possible\r\n\r\nbondwell2_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=bondwell2 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BONDWELL2_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR -D_XL_NO_JOYSTICK \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_bss_himem.bin\r\n\r\n\r\nbondwell2: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=bondwell2 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BONDWELL2_SLOWDOWN) \\\r\n\t-DXSize=80 -DYSize=24 \\\r\n\t-D__CONIO_GRAPHICS  -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR -D_XL_NO_JOYSTICK \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/a.bin \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/a.bin\r\n\trm -rf $(BUILD_PATH)/a_HIMEM.bin\r\n\tmv $(BUILD_PATH)/a.com $(BUILD_PATH)/X$(GAME_NAME)_$@.com\r\n\tmv $(BUILD_PATH)/a.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_c7420",
    "content": "#############################\r\n# VideoPAC - C7420\r\nc7420: c7420_buffered\r\n\r\nc7420_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c7420  $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__VGL__ \\\r\n\t-DXSize=39 -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=20 -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GL4000_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__NO_INIT_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_coleco_adam",
    "content": "#############################\r\n# COLECO_ADAM\r\n\r\ncoleco_adam_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) $(INCLUDE_OPTS) -subtype=adam \\\r\n\t-D__COLECO_ADAM__ \\\r\n\t--generic-console -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COLECO_ADAM_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -DXSize=29 -DYSize=20 \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oxcadam.bin\r\n\trm xcadam.bin\r\n\trm xcadam.com    \r\n\tmv xcadam.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n\r\n\r\ncoleco_adam: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) $(INCLUDE_OPTS) -subtype=adam \\\r\n\t-D__COLECO_ADAM__ \\\r\n\t--generic-console -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COLECO_ADAM_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -DXSize=29 -DYSize=20 \\\r\n\t-lndos \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oxcadam.bin\r\n\trm xcadam.bin\r\n\trm xcadam.com    \r\n\tmv xcadam.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_corvette",
    "content": "#TODO: generic console\r\n# UDG ????\r\n\r\ncorvette: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=corvette $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__RADIO86__ \\\r\n\t-D__VT52 -DXSize=64 -DYSize=16  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CORVETTE_SLOWDOWN) \\\r\n\t-lndos -D_XL_NO_JOYSTICK \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\t# rm $@\r\n\t# cat bootstrap.cas $@.cas > $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\r\n\t# rm bootstrap.cas\r\n\t# rm $@.cas\r\n\t# rm $@_BOOTSTRAP.bin\r\n\r\n\r\n\r\ncorvette_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=corvette $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__STDIO $(STDIO_GAME_OPTS) -D_XL_TURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -D_XL_TURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t-D_XL_TURN_BASED_EFFECT_SCALE=1 -D_XL_TURN_BASED_WAIT_SCALE=1 -D_XL_NO_JOYSTICK \\\r\n\t-DXSize=64 -DYSize=16 -create-app \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURN_BASED -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_dai",
    "content": "#############################\r\n# DAI\r\n\r\ndai: dai_buffered\r\n\r\ndai_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +dai $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__DAI__ \\\r\n\t-DXSize=47 \\\r\n\t-DYSize=21 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_DAI_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t-D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_dmv",
    "content": "#############################\r\n# DMV\r\n\r\n# dmv:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=dmv \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -D__CPM_80X24__ \\\r\n\t# -D__ADM3A_WITH_UNDEF \\\r\n\t# -D__INCLUDE_CONIO_H \\\r\n\t# -D__DMV__ \\\r\n\t# -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t # \\\r\n\t# -create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t# $(FULL_FILES)\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n# -D__BIT_BANG_SOUND \r\n\r\ndmv:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=dmv \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_DMV_SLOWDOWN) \\\r\n\t-D__DMV__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_eg2k",
    "content": "\r\n\r\n##############################################################################\r\n\r\n\r\neg2k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EG2K__ \\\r\n\t-subtype=eg2000disk \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EG2K_SLOWDOWN) \\\r\n\t$(INCLUDE_OPTS) -D__BIT_BANG_SOUND \\\r\n\t-D__EG2K__ \\\r\n\t-D__SCREEN_MODE=0 \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t--generic-console -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\neg2k_mono: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EG2K__ \\\r\n\t-subtype=eg2000disk \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EG2K_SLOWDOWN) \\\r\n\t$(INCLUDE_OPTS) -D__BIT_BANG_SOUND \\\r\n\t-D__EG2K__ \\\r\n\t-D__SCREEN_MODE=0 \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR \\\r\n\t-lndos \\\r\n\t--generic-console -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_einstein",
    "content": "\r\n\r\n##############################################################################\r\n\r\n\r\neinstein: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=einstein -leinstein \\\r\n\t-pragma-define:ansicolumns=32 -DXSize=32 -DYSize=24 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EINSTEIN__ \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EINSTEIN_SLOWDOWN) \\\r\n\t--generic-console -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n\r\n\r\neinstein256: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=einstein -leinstein -subtype=einstein256 \\\r\n\t-pragma-define:ansicolumns=32 -DXSize=32 -DYSize=24 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EINSTEIN__ \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EINSTEIN_SLOWDOWN) \\\r\n\t--generic-console -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_enterprise",
    "content": "#############################\r\n# ENTERPRISE\r\n\r\nenterprise: enterprise_buffered\r\n\r\n# TODO: Try -subtype=com\r\nenterprise_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +enterprise $(SCCZ80_OPTS)  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-vn \\\r\n\t-D__ENTERPRISE__ \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=16 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ENTERPRISE_SLOWDOWN) \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__STDIO  -D__BIT_BANG_SOUND \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\t# -create-app -o enterprise.bin\r\n\t# mv enterprise.app FULL_enterprise.app\r\n\t# rm enterprise.bin\r\n\t# tar czvf FULL_enterprise.tar.zip FULL_enterprise.app\r\n\t# rm FULL_enterprise.app\r\n\t# mv FULL_enterprise.tar.zip $(BUILD_PATH)/X$(GAME_NAME)_$@.tar.zip"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_excalibur64",
    "content": "#############################\r\n# EXCALIBUR64\r\n\r\nexcalibur64_turn_bsed:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=excali64 -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__EXCALI64__ -DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EXCALIBUR64_SLOWDOWN) \\\r\n\t-create-app -oxcex64tb.bin \\\r\n\t$(FULL_FILES) \r\n\tmv xcex64tb.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n\trm -rf xcex64tb_HIMEM.bin\r\n\trm -rf xcexca64_bss_himem.bin\r\n\trm -rf xcex64tb.bin\r\n\r\n\r\nexcalibur64_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=excali64 -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__EXCALI64__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EXCALIBUR64_SLOWDOWN) \\\r\n\t-create-app -oxcexca64.bin \\\r\n\t$(FULL_FILES) \r\n\tmv xcexca64.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n\trm -rf xcexca64_HIMEM.bin\r\n\trm -rf xcexca64_bss_himem.bin\r\n\trm -rf xcexca64.bin\r\n\trm -rf xcexca64.com    \r\n\r\n\r\nexcalibur64: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=excali64 -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DXSize=80 -DYSize=24 \\\r\n\t-D__EXCALI64__ \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EXCALIBUR64_SLOWDOWN) \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -oxcexca64.bin\r\n\tmv xcexca64.img $(BUILD_PATH)/X$(GAME_NAME)_$@.img\r\n\trm -rf xcexca64_HIMEM.bin\r\n\trm -rf xcexca64_bss_himem.bin\r\n\trm -rf xcexca64.bin\r\n\trm -rf xcexca64.com    \r\n\r\n#################"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_fp1100",
    "content": "#############################\r\n# FP1100\r\n\r\nfp1100: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +fp1100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__FP1100__ -vn \\\r\n\t-D__VT52 -DYSize=24 -DXSize=39 \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_FP1100_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(FULL_FILES) -D_XL_NO_JOYSTICK \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app -o fp1100_X$(GAME_NAME).bin\r\n\tmv fp1100_X$(GAME_NAME).d88 $(BUILD_PATH)/X$(GAME_NAME)_$@.d88\r\n\trm -rf fp1100_X$(GAME_NAME).bin\r\n\trm -rf fp1100_X$(GAME_NAME)_BOOTSTRAP.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_g800",
    "content": "#############################\r\n# G800\r\n\r\ng800: g850\r\n\r\ne200:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_ROM_OPTS) -clib=e200 $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG -D_XL_NO_COLOR \\\r\n\t-DXSize=24 -DYSize=4 \\\r\n\t-vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_E200_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o g800$(GAME_NAME).bin\r\n\trm g800$(GAME_NAME).bin \r\n\trm g800$(GAME_NAME).rom\r\n\tmv g800$(GAME_NAME).ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx\r\n\r\n\r\ng815:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_ROM_OPTS) -clib=g815c $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG -D_XL_NO_COLOR \\\r\n\t-DXSize=28 -DYSize=8 -DX_OFFSET=4 \\\r\n\t-vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_G815_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o g800$(GAME_NAME).bin\r\n\trm g800$(GAME_NAME).bin \r\n\trm g800$(GAME_NAME).rom\r\n\tmv g800$(GAME_NAME).ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx\r\n\r\n\r\ng850_8:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_ROM_OPTS) -clib=g850 $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG -D_XL_NO_COLOR \\\r\n\t-DXSize=28 -DYSize=8 -DX_OFFSET=4 \\\r\n\t-vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_G850_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/g850/g850_init_graphics.c \\\r\n\t-create-app -o g800$(GAME_NAME).bin\r\n\trm g800$(GAME_NAME).bin \r\n\trm g800$(GAME_NAME).rom\r\n\tmv g800$(GAME_NAME).ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx\r\n\r\n\r\ng850_12: g850\r\n\r\ng850:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_ROM_OPTS) -clib=g850c $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG -D_XL_NO_COLOR \\\r\n\t-DXSize=28 -DYSize=12 -DX_OFFSET=4 \\\r\n\t-vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_G850_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/g850/g850_init_graphics.c \\\r\n\t-create-app -o g800$(GAME_NAME).bin\r\n\trm g800$(GAME_NAME).bin \r\n\trm g800$(GAME_NAME).rom\r\n\tmv g800$(GAME_NAME).ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx\r\n\r\n\r\ng850_6:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_ROM_OPTS) -clib=g850b $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-D__G800__ \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG -D_XL_NO_COLOR \\\r\n\t-DXSize=36 -DYSize=6 \\\r\n\t-vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_G850_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o g800$(GAME_NAME).bin\r\n\trm g800$(GAME_NAME).bin \r\n\trm g800$(GAME_NAME).rom\r\n\tmv g800$(GAME_NAME).ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx\r\n\r\n\r\n\r\ng815_5:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_ROM_OPTS) -clib=g815 $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG -D_XL_NO_COLOR \\\r\n\t-DXSize=18 -DYSize=5 \\\r\n\t-vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_G815_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o g800$(GAME_NAME).bin\r\n\trm g800$(GAME_NAME).bin \r\n\trm g800$(GAME_NAME).rom\r\n\tmv g800$(GAME_NAME).ihx $(BUILD_PATH)/X$(GAME_NAME)_$@.ihx\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_gemini",
    "content": "gemini:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=gemini \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GEMINI_SLOWDOWN) \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_gl4000",
    "content": "#############################\r\n# V-TECH GENIUS LEADER\r\ngl4000: gl4000_buffered\r\n\r\ngl4000_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gl -clib=gl4000 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__VGL__ \\\r\n\t-DXSize=20 -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=6 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GL4000_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__NO_INIT_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_gl6000sl",
    "content": "\r\n\r\ngl6000sl_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gl -clib=gl6000sl $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__VGL__ \\\r\n\t-DXSize=30 -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=12 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__NO_INIT_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GL6000SL_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\ngl6000sl: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gl -clib=gl6000sl $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__VGL__ \\\r\n\t-DXSize=30 -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=12 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GL6000SL_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_hemc",
    "content": "#############################\r\n# HEMC\r\n\r\nhemc:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +hemc $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__HEMC__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HEMC_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR -D_XL_NO_JOYSTICK \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_hgmc",
    "content": "#############################\r\n# HGMC\r\n\r\nhgmc: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +hgmc $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__HGMC__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HGMC_SLOWDOWN) \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\nhgmc_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +hgmc $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__HGMC__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=30 \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HGMC_SLOWDOWN) \\\r\n\t-D__VT52 -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_homelab",
    "content": "#############################\r\n# HOMELAB (4)\r\n\r\nhomelab:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +homelab $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__HOMELAB__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HOMELAB_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_homelab2",
    "content": "\r\n#############################\r\n# HOMELAB2\r\n\r\nhomelab2:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +homelab2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__HOMELAB2__ \\\r\n\t-DXSize=40 \\\r\n\t-DYSize=23 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HOMELAB2_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_kaypro",
    "content": "#############################\r\n# KAYPRO\r\n\r\nkaypro: kaypro2x\r\n\r\nkaypro84: kaypro2x\r\n\r\n# kaypro84 (-subtype=kaypro84)\r\nkaypro2x: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=kaypro84 -lgfxkp \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-D__KAYPRO__ \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_KAYPRO_SLOWDOWN) \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_kaypro83",
    "content": "\r\n# kaypro83 (-subtype=kaypro83)\r\nkaypro83: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=kaypro83 -lgfxkp \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-D__KAYPRO83__ \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_KAYPRO83_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_bss_himem.bin   \r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_kramermc",
    "content": "#############################\r\n# KRAMER-MC\r\n\r\nkramermc:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +kramermc $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__KRAMERMC__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=16 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_KRAMERMC_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__VT52 -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__STDIO -DTURN_BASED \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_krokha",
    "content": "# -pragma-define:CRT_ENABLE_STDIO=0\r\n\r\nkrokha:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +krokha $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) --generic-console -DXSize=48 -DYSize=32 -lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_KROKHA_SLOWDOWN) \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_lambda",
    "content": "\r\n#############################\r\n# LAMBDA\r\n\r\nlambda: lambda_16k\r\n\r\nlambda_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lambda $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-vn -D__LAMBDA__  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LAMBDA_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_lm80c",
    "content": "\r\n\r\nlm80c: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lm80c $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__LM80C__ \\\r\n\t-D__VT52 -DXSize=32 -DYSize=24  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LM80C_SLOWDOWN) \\\r\n\t-lndos -D_XL_NO_JOYSTICK \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_lviv",
    "content": "lviv: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lviv $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__LVIV__ -DXSize=32 -DYSize=32 \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LVIV_SLOWDOWN) \\\r\n\t$(INCLUDE_OPTS) -D_XL_NO_SOUND \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t--generic-console -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_HIMEM.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_m5",
    "content": "#############################\r\n# M5\r\n\r\nm5_4k: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lm -create-app -Cz--audio -subtype=tape \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M5_SLOWDOWN) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\nm5: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lm -create-app -Cz--audio -subtype=tape \\\r\n\t-pragma-define:REGISTER_SP=65000 \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M5_SLOWDOWN) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\nm5_4k_rom: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lm -create-app -Cz--audio \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M5_SLOWDOWN) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\nm5_rom: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lm -create-app -Cz--audio \\\r\n\t-pragma-define:REGISTER_SP=65000 \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M5_SLOWDOWN) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n\r\n\r\nm5_keyboard: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lm -create-app -Cz--audio -subtype=tape \\\r\n\t-pragma-define:REGISTER_SP=65000 \\\r\n\t-D__M5__ -D_XL_NO_JOYSTICK \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M5_SLOWDOWN) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n    \r\n    \r\nm5_keyboard_rom: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-lm -create-app -Cz--audio \\\r\n\t-pragma-define:REGISTER_SP=65000 \\\r\n\t-D__M5__ -D_XL_NO_JOYSTICK  \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M5_SLOWDOWN) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_mbc200",
    "content": "#############################\r\n# MBC200\r\n\r\nmbc200:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=mbc200 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t -D__PC88__    \\\r\n\t-lndos -DXSize=80 -DYSize=33 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MBC200_SLOWDOWN) \\\r\n\t-create-app \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_micro8085",
    "content": "micro8085: micro8085_buffered\r\n\r\nmicro8085_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +micro8085 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__STDIO $(STDIO_GAME_OPTS) -D_XL_TURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -D_XL_TURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t-D_XL_TURN_BASED_EFFECT_SCALE=1 -D_XL_TURN_BASED_WAIT_SCALE=1 -D_XL_NO_JOYSTICK \\\r\n\t-DXSize=32 -DYSize=24 -create-app \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_TURN_BASED -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MICRO8085_SLOWDOWN) \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.lis\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@.map\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_mikro80",
    "content": "\r\n#############################\r\n# MIKRO80\r\n\r\nmikro80:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mikro80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MIKRO80__ \\\r\n\t-DXSize=64 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MIKRO80_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_misc_cpm",
    "content": "#############################\r\n# QC10 and others\r\n\r\n# https://github.com/z88dk/z88dk/blob/master/lib/config/cpm.cfg\r\n\r\nqc10_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=qc10 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_QC10_SLOWDOWN) \\\r\n\t-D__ADM3A_WITH_UNDEF -DTURN_BASED \\\r\n\t-D__QC10__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -oxcqc10.bin \\\r\n\t$(FULL_FILES)\r\n\trm xcqc10.bin\t\r\n\trm xcqc10.com\r\n\tmv xcqc10.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\r\n\r\nqc10:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=qc10 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_QC10_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nactrixss:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=actrixss \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ACTRIX_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nactrix:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=actrix \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ACTRIX_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n# --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24\r\napple2_z80:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=apple2 \\\r\n\t$(INCLUDE_OPTS)  -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_APPLE2_Z80_SLOWDOWN) -D__APPLE2_Z80__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-D_XL_NO_UDG -D_XL_NO_JOYSTICK -DXSize=79 -DYSize=24 \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nalphatp2:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=alphatp2 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALPHATP2_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\naltos5:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=altos5 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTOS5_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\naltos580:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=altos580 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ALTOS580_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\nampro:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=ampro \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AMPRO_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\namust:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=amust \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AMUST_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\namustold:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=amustold \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AMUSTOLD_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n    \r\n\r\narchive:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=archive \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ARCHIVE_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nbeehive:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=beehive \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_BEEHIVE_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\n\r\neagle2:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=eagle2 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_EAGLE2_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n    \r\n\r\ngnat10:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=gnat10 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GNAT10_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n    \r\n\r\nhp125:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=hp125 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HP125_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nmicromate:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=micromate \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MICROMATE_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\nmbc2000:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=mbc2000 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MBC2000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nmz3500:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=mz3500 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MZ3500_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nscorpion:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=scorpion \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SCORPION_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\natmturbo:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=atmturbo \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATMTURBO_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\ndiskface:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=diskface \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_DISKFACE_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nhc91:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=hc91 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HC91_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nhc2000:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=hc2000 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HC2000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nlec80t:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=lec80t \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LEC80T_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nquorum:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=quorum \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_QUORUM_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nrainbow:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=rainbow \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_RAINBOW_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nsagafox:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=sagafox \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SAGAFOX_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nseequa:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=seequa \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SEEQUA_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\ntelevideo:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=televideo \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TELEVIDEO_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nvt180:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=vt180 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VT180_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nhz89:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=hz89 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HZ89_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nhz100:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=hz100 \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HZ100_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nmagnolia:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=magnolia \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MAGNOLIA_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nz80pack:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=z80pack \\\r\n\t$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z80PACK_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_multi8",
    "content": "#############################\r\n# MULTI8\r\n\r\n# TODO: Fix sound\r\n\r\nmulti8: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +multi8 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -D_XL_NO_JOYSTICK \\\r\n\t-D__MULTI8__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MULTI8_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o $@\r\n\trm $@\r\n\tmv $@.cas $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\r\n\r\n\r\n\r\nmulti8_64k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +multi8 $(SCCZ80_OPTS) -subtype=64k \\\r\n\t$(INCLUDE_OPTS) -D_XL_NO_JOYSTICK \\\r\n\t-D__MULTI8__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MULTI8_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o $@\r\n\trm $@\r\n\tmv $@.cas $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_myvision",
    "content": "#############################\r\n# MYVISION\r\n\r\n# \r\nmyvision: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +myvision $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MYVISION__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__VT52  \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MYVISION_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_mz2500",
    "content": "\r\n#############################\r\n# MZ2500\r\n\r\n\r\nmz2500:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mz2500 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn -lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__MZ2500__ -DXSize=40 -DFORXE_YSIZE=24  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MZ2500_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR -D_XL_NO_JOYSTICK -D__NO_INIT_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_nabu",
    "content": "nabu: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=nabu $(SCCZ80_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__NABU__ -DXSize=32 -DYSize=24 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NABU_SLOWDOWN) \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos -lnabu_int \\\r\n\t--generic-console \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\nnabu_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nabu $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NABU__  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\n# nabu: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +nabu $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\r\n\t # -D__NABU__    \\\r\n\t# -lndos -DXSize=32 -DYSize=24 -D_XL_NO_JOYSTICK \\\r\n\t# -clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t# -D__CONIO_GRAPHICS -D_XL_NO_SOUND -D__DEFAULT_CLEAR_SCREEN \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \\\r\n\t# $(FULL_FILES) \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t# $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t# -create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\t# rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_nascom",
    "content": "#############################\r\n# NASCOM\r\n\r\nnascom_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nascom $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -vn -lndos \\\r\n\t-D__NASCOM__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NASCOM_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_nascom_16k.prg \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_nascom_16k.prg\r\n\r\n\r\nnascom: nascom_32k\r\n\r\nnascom_32k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nascom $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -vn -lndos \\\r\n\t-D__NASCOM__ \\\r\n\t \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NASCOM_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_nc100",
    "content": "#############################\r\n# NC100\r\n\r\nnc100_sprites: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nc $(SCCZ80_ROM_OPTS) -lgfxnc100 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__NC100__ \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NC100_SLOWDOWN) \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DINITIAL_GHOST_FREEZE \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nnc100: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nc $(SCCZ80_ROM_OPTS) -lgfxnc100 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__NC100__ -DXSize=60 -DYSize=8 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NC100_SLOWDOWN) \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t--generic-console \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_HIMEM.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_nc200",
    "content": "\r\n#############################\r\n# NC200\r\n\r\nnc200_sprites: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nc $(SCCZ80_ROM_OPTS) -lgfxnc200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__NC200__ \\\r\n\t-D__ALT_PRINT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NC200_SLOWDOWN) \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-D_XL_NO_JOYSTICK -D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\nnc200: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nc $(SCCZ80_ROM_OPTS) -lgfxnc200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__NC200__ -DXSize=60 -DYSize=16 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NC100_SLOWDOWN) \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t--generic-console \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_HIMEM.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_newbrain",
    "content": "#############################\r\n# NEWBRAIN\r\n\r\nnewbrain:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +newbrain $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NEWBRAIN__ \\\r\n\t-DXSize=20 \\\r\n\t-DYSize=11 \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-vn \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NEWBRAIN_SLOWDOWN) \\\r\n\t-DNO_BLINKING \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DNO_INITIAL_SCREEN \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-lndos \\\r\n\t-D__BUFFERED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DNO_STATS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__STDIO \\\r\n\t-D__NO_WAIT \\\r\n\t-DTURN_BASED \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\t# tar czvf FULL_newbrain.tar.zip _dir.txt newbrain.bas newbrain.dat\r\n\t# mv FULL_newbrain.tar.zip $(BUILD_PATH)/X$(GAME_NAME)_newbrain.tar.zip\r\n\trm -rf _dir.txt\r\n\t# rm newbrain.bas\r\n\t# rm newbrain.dat\r\n\t# rm newbrain\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_ondra",
    "content": "#############################\r\n# ONDRA\r\n\r\nondra: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ondra $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ONDRA__ -DXSize=40 -DYSize=30   \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t -DZ88DK_JOYSTICK \\\r\n\t--generic-console -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ONDRA_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\tmv FULL_$@.tap $(BUILD_PATH)/X$(GAME_NAME)_$@.tap\r\n\tmv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\r\nondra_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ondra $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn -lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__ONDRA__ -DXSize=40 -DYSize=30   \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ONDRA_SLOWDOWN) \\\r\n\t--generic-console -D_XL_NO_JOYSTICK \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\tmv FULL_$@.tap $(BUILD_PATH)/X$(GAME_NAME)_$@.tap\r\n\tmv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_osborne1",
    "content": "#############################\r\n# OSBORNE1\r\n\r\nosborne1_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lgfxosborne1 -subtype=osborne1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__OSBORNE1__ \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__ADM3A_WITH_UNDEF \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nosborne1: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lgfxosborne1 -subtype=osborne1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__OSBORNE1__ \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_osca",
    "content": "#############################\r\n# OSCA\r\n\r\nosca:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +osca $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=ansi -D__OSCA__ -vn \\\r\n\t \\\r\n\t  -lndos \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o osca \\\r\n\t$(FULL_FILES)\r\n\trm osca\r\n\tmv OSCA.EXE $(BUILD_PATH)/X$(GAME_NAME)_OSCA.EXE\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_oz",
    "content": "#############################\r\n# OZ\r\n\r\noz: oz_buffered\r\n\r\noz_buffered: $(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT)\r\n\t$(Z88DK_PATH)$(MYZ88DK) +oz $(ZSDCC_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-o$@.bin \\\r\n\t-D__OZ__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_OZ_SLOWDOWN) \\\r\n\t-DXSize=59 \\\r\n\t-DYSize=9 \\\r\n\t-vn -lndos \\\r\n\t-D__BUFFERED_GRAPHICS -DTURN_BASED -D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(TOOLS_PATH)/z88dk/oz/makewzd$(COMPILEDEXT) $(SOURCE_PATH)/../../$@\r\n\trm -rf $(SOURCE_PATH)/../../$@.bin\r\n\tmv $@.wzd $(BUILD_PATH)/X$(GAME_NAME)_$@.wzd\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_p2000",
    "content": "#############################\r\n# P2000\r\n\r\np2000_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +p2000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -D__P2000__ -vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_P2000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_p2000.prg \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_p2000.prg\r\n\r\n\r\np2000: p2000_32k\r\n\r\np2000_32k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +p2000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -D__P2000__ -vn \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_P2000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pasopia7",
    "content": "\r\n#############################\r\n# PASAPIA7\r\n\r\npasopia7:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pasopia7 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PASOPIA__ \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DXSize=40 -DYSize=23 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PASOPIA7_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BOOTSTRAP.bin\t\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pc6001",
    "content": "#############################\r\n# PC6001\r\n\r\npc6001_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc6001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -Cz--audio -clib=ansi \\\r\n\t-D__PC6001__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PC6001_SLOWDOWN) \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.prg  \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(LIGHT_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.wav\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.cas $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_pc6001.cp6\t\r\n\r\n\r\npc6001: pc6001_32k\r\n\r\npc6001_32k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc6001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -Cz--audio -clib=ansi -subtype=32k \\\r\n\t-D__PC6001__  \\\r\n\t-D__CONIO_GRAPHICS  -D__PSG_SOUND \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PC6001_SLOWDOWN) \\\r\n\t-D__SCREEN_MODE=2  -D_XL_NO_JOYSTICK \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv $(BUILD_PATH)/X$(GAME_NAME)_$@.cas $(BUILD_PATH)/X$(GAME_NAME)_$@.cp6\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pcw40",
    "content": "#############################\r\n# PCW\r\n\r\npcw40:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=pcw40 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PCW40__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PCW40_SLOWDOWN) \\\r\n\t-lndos -DXSize=90 -DYSize=32 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\trm -rf FULL_$@_HIMEM.bin\r\n\tmv FULL_$@.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tmv FULL_$@.com $(BUILD_PATH)/X$(GAME_NAME)_$@.com\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pcw80",
    "content": "pcw: pcw80\r\n\r\npcw80:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=pcw80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PCW80__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PCW80_SLOWDOWN) \\\r\n\t-lndos -DXSize=90 -DYSize=32 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app \\\r\n\t-o FULL_$@\r\n\trm FULL_$@\r\n\trm -rf FULL_$@_HIMEM.bin\r\n\tmv FULL_$@.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\tmv FULL_$@.com $(BUILD_PATH)/X$(GAME_NAME)_$@.com\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pencil2",
    "content": "#############################\r\n# PENCIL2\r\n\r\n# SOUNDS is broken (sound never stops)\r\npencil2_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pencil2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PENCIL2__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PENCIL2_SLOWDOWN) \\\r\n\t-D__VT52 -D_XL_NO_JOYSTICK  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\npencil2: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pencil2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PENCIL2__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PENCIL2_SLOWDOWN) \\\r\n\t-D__VT52 -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_phc25",
    "content": "\r\n\r\nphc25_mono: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc25 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__ -pragma-define:CLIB_DISABLE_MODE2=1 -D__SCREEN_MODE=1 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS $(PHC25_MONO_GAME_OPTS)  -D__PSG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app \r\n\r\n\r\nphc25: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc25 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__ -pragma-define:CLIB_DISABLE_MODE1=1 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DXSize=16 \\\r\n\t-DYSize=24 \\\r\n\t-D_XL_NO_JOYSTICK -D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS $(PHC25_GAME_OPTS)  -D__PSG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app \r\n\r\n\r\nphc25_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc25 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__  -pragma-define:CLIB_DISABLE_MODE1=1 -pragma-define:CLIB_DISABLE_MODE2=1 -D__PSG_SOUND \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS  -D_XL_NO_COLOR -D_XL_NO_UDG  $(PHC25_NO_GFX_GAME_OPTS) \\\r\n\t-D_XL_NO_JOYSTICK -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app \r\n\r\n\r\nmap1010_mono: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc25 -clib=map1010 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__ -pragma-define:CLIB_DISABLE_MODE2=1 -D__SCREEN_MODE=1 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D_XL_NO_JOYSTICK -D_XL_NO_COLOR -D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS $(PHC25_MONO_GAME_OPTS)  -D__PSG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app \r\n\r\n\r\nmap1010: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc25 -clib=map1010 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__ -pragma-define:CLIB_DISABLE_MODE1=1 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DXSize=16 \\\r\n\t-DYSize=24 \\\r\n\t-D_XL_NO_JOYSTICK -D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS $(PHC25_GAME_OPTS)  -D__PSG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app \r\n\r\n\r\nmap1010_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc25 -clib=map1010 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__  -pragma-define:CLIB_DISABLE_MODE1=1 -pragma-define:CLIB_DISABLE_MODE2=1 -D__PSG_SOUND \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS  -D_XL_NO_COLOR -D_XL_NO_UDG  $(PHC25_NO_GFX_GAME_OPTS) \\\r\n\t-D_XL_NO_JOYSTICK -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc -create-app \r\n\r\n\r\nphc20: phc20_no_gfx\r\nphc20_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +phc20 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__PHC25__  -pragma-define:CLIB_DISABLE_MODE1=1 -pragma-define:CLIB_DISABLE_MODE2=1 -D__PSG_SOUND \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-D__NO_INPUT \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS  -D_XL_NO_COLOR -D_XL_NO_UDG  $(PHC25_NO_GFX_GAME_OPTS) \\\r\n\t-D_XL_NO_JOYSTICK -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PHC25_SLOWDOWN) \\\r\n\t-o$(BUILD_PATH)/X$(GAME_NAME)_$@.phc "
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pmd85",
    "content": "#############################\r\n# PMD85\r\n\r\npmd85_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pmd85 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PMD85__ \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PMD85_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_pmd85_no_gfx.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_pmd85_no_gfx.bin\r\n\r\n\r\npmd85: $(ASSETS_PATH)/z88dk_6x8_pmd85.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pmd85 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PMD85__ \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=32 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PMD85_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_6x8_pmd85.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\npmd85_mono: $(ASSETS_PATH)/z88dk_6x8_pmd85.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pmd85 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PMD85__ \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=32 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PMD85_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_6x8_pmd85.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pps",
    "content": "#############################\r\n# PPS\r\n\r\npps:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pps $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__PPS__ -vn \\\r\n\t-o $@ \\\r\n\t-D__VT52 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PPS_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES)\r\n\tmv $@ $(BUILD_PATH)/X$(GAME_NAME)_$@.exe\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_primo",
    "content": "\r\n#############################\r\n# PRIMO\r\n\r\n# primo: primo_no_gfx\r\n\r\nprimo_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +primo $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PRIMO__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 --generic-console \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PRIMO_SLOWDOWN) \\\r\n\t-D__VT52 -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nprimo: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +primo $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PRIMO__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 --generic-console \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__VT52 -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PRIMO_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND  \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pv1000",
    "content": "\r\n#############################\r\n# PV1000\r\n\r\n# UDG can be done but differently\r\n# -SO3 necessary to build a 16K rom\r\npv1000_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pv1000 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) $(PV1000_GAME_OPTS) \\\r\n\t-D__PV1000__ \\\r\n\t-DZ88DK_JOYSTICK -DYSize=23 \\\r\n\t-D__VT52 -D_XL_NO_COLOR -D_XL_NO_UDG \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PV1000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n\r\npv1000: $(ASSETS_PATH)/z88dk_pv1000.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pv1000 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) $(PV1000_GAME_OPTS) -pragma-define:PV1000_CUSTOM_TILESET=2 -s $(ASSETS_PATH)/z88dk_pv1000.asm -subtype=32k \\\r\n\t-D__PV1000__ \\\r\n\t-DZ88DK_JOYSTICK -DYSize=23 \\\r\n\t-D__VT52 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PV1000_SLOWDOWN) \\\r\n\t-D__PV1000_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.sym\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_pv2000",
    "content": "#############################\r\n# PV2000\r\n\r\n# -SO3 necessary to build a 16k rom image\r\npv2000: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pv2000 $(SCCZ80_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PV2000__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PV2000_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_px4",
    "content": "\r\n#############################\r\n# PX4\r\n\r\npx4: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_ROM_OPTS) -lpx4 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX4__ \\\r\n\t-D__NO_SPRITE_TRANSPARENCY \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PX4_SLOWDOWN) \\\r\n\t-subtype=px4 -Cz--32k \\\r\n\t-create-app -o $@  -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -DYSize=8 \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm $@\r\n\tmv $@.ROM $(BUILD_PATH)/X$(GAME_NAME)_$@.ROM\r\n\r\n\r\npx4k: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_ROM_OPTS) -lpx4 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX4__ -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_SPRITE_TRANSPARENCY \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PX4_SLOWDOWN) \\\r\n\t-subtype=px4 -Cz--32k \\\r\n\t-create-app -o $@  -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -DYSize=8 \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm $@\r\n\tmv $@.ROM $(BUILD_PATH)/X$(GAME_NAME)_$@.ROM"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_px8",
    "content": "#############################\r\n# PX8\r\n\r\npx8: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX8__ \\\r\n\t-D__NO_SPRITE_TRANSPARENCY \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PX8_SLOWDOWN) \\\r\n\t-subtype=px8 \\\r\n\t-create-app -o $@  -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -DYSize=8 \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm $@\r\n\tmv $@.ROM $(BUILD_PATH)/X$(GAME_NAME)_$@.ROM\r\n\r\n\r\npx8k: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_ROM_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX8__ -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_SPRITE_TRANSPARENCY \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PX8_SLOWDOWN) \\\r\n\t-subtype=px8 \\\r\n\t-create-app -o $@  -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -DYSize=8 \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm $@\r\n\tmv $@.ROM $(BUILD_PATH)/X$(GAME_NAME)_$@.ROM\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_radio86",
    "content": "#TODO: generic console\r\n\r\n\r\nradio86: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +radio86 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__RADIO86__ \\\r\n\t-D__VT52 -DXSize=64 -DYSize=25  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_RADIO86_SLOWDOWN) \\\r\n\t-lndos -D_XL_NO_JOYSTICK \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\t# cat bootstrap.cas $@.cas > $(BUILD_PATH)/X$(GAME_NAME)_$@.cas\r\n\t# rm bootstrap.cas\r\n\t# rm $@.cas\r\n\t# rm $@_BOOTSTRAP.bin\r\n\r\n\r\n\r\nradio86_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +radio86 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__STDIO $(STDIO_GAME_OPTS) -D_XL_TURN_BASED_SKULL_MIN_SLOWDOWN_SCALE=1 -D_XL_TURN_BASED_GHOST_MIN_SLOWDOWN_SCALE=1 \\\r\n\t-D_XL_TURN_BASED_EFFECT_SCALE=1 -D_XL_TURN_BASED_WAIT_SCALE=1 -D_XL_NO_JOYSTICK \\\r\n\t-DXSize=64 -DYSize=25 -create-app \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_RADIO86_SLOWDOWN) \\\r\n\t-D_XL_TURN_BASED -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_rc700",
    "content": "#############################\r\n# RC700\r\n\r\nrc700:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=rc700 $(INCLUDE_OPTS) \\\r\n\t-D__RC700__ \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=23 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_RC700_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_rc700.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rc700.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_rx78",
    "content": "\r\n#############################\r\n# RX78\r\n\r\nrx78: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +rx78 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__RX78__ \\\r\n\t-D__VT52 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_RX78_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos -D__BIT_BANG_SOUND \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_rx78.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rx78.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rx78_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_rx78_BSS.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_smc777",
    "content": "#############################\r\n# SMC777\r\n\r\n\r\nsmc777_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=smc777 $(INCLUDE_OPTS) \\\r\n\t-D__SMC777__ \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SMC777_SLOWDOWN) \\\r\n\t-D__VT52 -DXSize=80 -DYSize=24 \\\r\n\t-D__CONIO_GRAPHICS -DTURN_BASED \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oxcsmc777.bin\r\n\trm xcsmc777.bin\r\n\trm xcsmc777.com\r\n\tmv xcsmc777.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\r\n\r\n\r\nsmc777_80: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +smc777 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SMC777__ -vn \\\r\n\t-D__VT52 -DYSize=25 -DXSize=80 -D__SCREEN_MODE=4 \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SMC777_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(FULL_FILES) -D_XL_NO_JOYSTICK \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app -o fp1100_X$(GAME_NAME).bin\r\n\tmv fp1100_X$(GAME_NAME).d88 $(BUILD_PATH)/X$(GAME_NAME)_$@.d88\r\n\trm -rf fp1100_X$(GAME_NAME).bin\r\n\trm -rf fp1100_X$(GAME_NAME)_BOOTSTRAP.bin\r\n\r\n\r\nsmc777: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +smc777 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SMC777__ -vn \\\r\n\t-D__VT52 -DYSize=25 -DXSize=40 -D__SCREEN_MODE=3 \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SMC777_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(FULL_FILES) -D_XL_NO_JOYSTICK \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app -o fp1100_X$(GAME_NAME).bin\r\n\tmv fp1100_X$(GAME_NAME).d88 $(BUILD_PATH)/X$(GAME_NAME)_$@.d88\r\n\trm -rf fp1100_X$(GAME_NAME).bin\r\n\trm -rf fp1100_X$(GAME_NAME)_BOOTSTRAP.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_sol20",
    "content": "\r\nsol20:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sol20  $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t -D__SOL20__    \\\r\n\t-lndos -DXSize=64 -DYSize=16 \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SOL20_SLOWDOWN) \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_sos",
    "content": "# SOS\r\n\r\nsos: sos_buffered\r\n\r\nsos_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sos $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SOS_SLOWDOWN) \\\r\n\t-D__STDIO -D__INCLUDE_CONIO_H \\\r\n\t-D_XL_NO_COLOR -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t-DTURN_BASED -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o sos_buffered \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm sos_buffered\r\n\tmv sos_buffered.obj $(BUILD_PATH)/X$(GAME_NAME)_sos_buffered.obj\r\n\r\n\r\nsos_tiny_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sos $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SOS_SLOWDOWN) \\\r\n\t-D__STDIO -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t-DTURN_BASED \\\r\n\t-DTINY_GAME -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \\\r\n\t-create-app -o sos_tiny_buffered \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES)\r\n\trm sos_tiny_buffered\r\n\tmv sos_tiny_buffered.obj $(BUILD_PATH)/X$(GAME_NAME)_TINY_sos_buffered.obj\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_spc1000",
    "content": "\r\n#############################\r\n# SPC1000\r\n\r\nspc1000: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +spc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__SPC1000__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPC1000_SLOWDOWN) \\\r\n\t-D__VT52 -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS  -D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_spc1000.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_spc1000.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_special",
    "content": "#############################\r\n# SPECIALIST\r\n\r\nspecial:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +special $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SPECIAL__ \\\r\n\t-DXSize=48 \\\r\n\t-DYSize=30 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPECIAL_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -D_XL_NO_SLEEP -DTURN_BASED -D__STDIO -D__NO_WAIT \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_special.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_special.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_srr",
    "content": "#############################\r\n# SRR\r\n\r\nsrr: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +srr $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SRR__ -vn \\\r\n\t-D__NO_WAIT -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SRR_SLOWDOWN) \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app -o srr \\\r\n\t$(FULL_FILES)\r\n\trm srr\r\n\trm srr.srr\r\n\tmv srr.wav $(BUILD_PATH)/X$(GAME_NAME)_srr.wav\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_super80",
    "content": "#############################\r\n# SUPER80\r\n\r\nsuper80: super80_no_col\r\n\r\nsuper80_no_col:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +super80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__SUPER80__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=16 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SUPER80_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_COLOR \\\r\n\t-D__VT52 \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o super80\r\n\tmv super80.ql $(BUILD_PATH)/X$(GAME_NAME)_super80.ql\r\n\trm super80\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_super80r",
    "content": "\r\n#############################\r\n# SUPER80R\r\n\r\nsuper80r: super80r_no_gfx_no_col\r\n\r\nsuper80r_no_gfx_no_col:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +super80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=vduem \\\r\n\t-D__SUPER80R__ \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=23 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SUPER80R_SLOWDOWN) \\\r\n\t -D__BIT_BANG_SOUND  \\\r\n\t -D_XL_NO_COLOR  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__VT52 -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-lndos \\\r\n\t-create-app -o super80r\r\n\tmv super80r.ql $(BUILD_PATH)/X$(GAME_NAME)_super80r.ql\r\n\trm super80r\r\n\r\n\r\nsuper80r_gfx_no_col: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +super80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=vduem \\\r\n\t-D__SUPER80R__ \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=24 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SUPER80R_SLOWDOWN) \\\r\n\t -D__BIT_BANG_SOUND  \\\r\n\t -D_XL_NO_COLOR  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__VT52 \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-lndos \\\r\n\t-create-app -o super80r\r\n\tmv super80r.ql $(BUILD_PATH)/X$(GAME_NAME)_super80r.ql\r\n\trm super80r\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_sv8000",
    "content": "#############################\r\n# SV8000\r\n\r\nsv8000: sv8000_mode1\r\n\r\nsv8000_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -O3 -pragma-define:CLIB_DISABLE_MODE0=1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-DZ88DK_JOYSTICK -DXSize=24 -DYSize=16  \\\r\n\t-D__SV8000__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SV8000_SLOWDOWN) \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING -D__NO_PRINT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_WAIT -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.bin \\\r\n\t$(TINY_FILES) \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@_DATA.bin\r\n\r\n\r\n\r\nsv8000_32k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -subtype=32k \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__SV8000__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SV8000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\nsv8000_mode0: sv8000_32k_mode0\r\n\r\nsv8000_32k_mode0:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -subtype=32k \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__SV8000__ \\\r\n\t-D__SCREEN_MODE=0 -D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SV8000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\nsv8000_mode1: sv8000_32k_mode1\r\n\r\nsv8000_32k_mode1: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -compiler=sdcc -SO3  --max-allocs-per-node200000 -subtype=32k -pragma-define:CLIB_DISABLE_MODE0=1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__SV8000__ \\\r\n\t-D__SCREEN_MODE=1 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SV8000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t-pragma-redirect:CRT_FONT=_font_8x8_zx_system \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\nsv8000_4k: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -compiler=sdcc -SO3  --max-allocs-per-node200000 -pragma-define:CLIB_DISABLE_MODE0=1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__SV8000__ \\\r\n\t-D__SCREEN_MODE=1 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SV8000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_SOUND \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\r\n\r\nsv8000_4k_mode0:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sv8000 $(SCCZ80_OPTS) -compiler=sdcc -SO3  --max-allocs-per-node200000 -pragma-define:CLIB_DISABLE_MODE1=1 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__SV8000__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SV8000_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_SOUND \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \\\r\n\t$(FULL_FILES) \\\r\n\t-D__NO_INIT_GRAPHICS\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_svi",
    "content": "#############################\r\n# SVI\r\n\r\nsvi_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +svi $(ZSDCC_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-zorg=49152 \\\r\n\t-clib=ansi \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SVI_SLOWDOWN) \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-vn -lndos \\\r\n\t-D__SVI__ \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@ \\\r\n\t$(LIGHT_FILES)\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\nsvi: svi_328\r\n\r\nsvi_328: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +svi $(SCCZ80_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic $(INCLUDE_OPTS) \\\r\n\t-vn -lndos \\\r\n\t-D__SVI__   \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SVI_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@ \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c  \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_ti82",
    "content": "#############################\r\n# TI82\r\n\r\nti82: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti82 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI82__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TI82_SLOWDOWN) \\\r\n\t-vn -lndos -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-create-app -o ti82 \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../ti82.82p $(BUILD_PATH)/X$(GAME_NAME)_ti82.82p\r\n\trm -rf $(SOURCE_PATH)/../../ti82\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_ti83",
    "content": "#############################\r\n# TI83\r\n\r\nti83: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti83 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI83__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TI83_SLOWDOWN) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-vn -lndos -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-create-app -oxchase \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../xchase.83p $(BUILD_PATH)/X$(GAME_NAME)_ti83.83p\r\n\trm -rf $(SOURCE_PATH)/../../xchase\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_ti83p",
    "content": "#############################\r\n# TI83P\r\n\r\nti83p: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti83p $(SCCZ80_OPTS) -clib=ansi  -subtype=ion -Cz--altfmt \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI83P__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TI83P_SLOWDOWN) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-vn -lndos -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-create-app -oxchase8x \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../xchase8x.8xp $(BUILD_PATH)/X$(GAME_NAME)_$@.8xp\t\r\n\trm $(SOURCE_PATH)/../../xchase8x\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_ti85",
    "content": "\r\n#############################\r\n# TI85\r\n\r\nti85: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti85 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI85__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TI85_SLOWDOWN) \\\r\n\t-vn -lndos -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-create-app -oti85 \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../ti85.85s $(BUILD_PATH)/X$(GAME_NAME)_ti85.85s\r\n\trm -rf $(SOURCE_PATH)/../../ti85\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_ti86",
    "content": "\r\n#############################\r\n# TI86\r\n\r\nti86: ti86_light\r\n\r\nti86_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti86 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI86__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TI86_SLOWDOWN) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn -lndos -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app  -oti86 \\\r\n\t$(FULL_FILES)\r\n\tmv $(SOURCE_PATH)/../../ti86.86p $(BUILD_PATH)/X$(GAME_NAME)_LIGHT_ti86.86p\t\r\n\trm -rf $(SOURCE_PATH)/../../ti86\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_tiki100",
    "content": "#############################\r\n# TIKI100\r\n\r\ntiki100: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=tiki100 -ltiki100 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TIKI100__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TIKI100_SLOWDOWN) \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__PSG_SOUND \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@ \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_bss_himem.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_tim011",
    "content": "#TODO: generic console\r\n\r\n\r\ntim011: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=tim011 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TIM011__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TIM011_SLOWDOWN) \\\r\n\t-D__VT52 -DXSize=64 -DYSize=32  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos -D_XL_NO_JOYSTICK \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_ts2068",
    "content": "#############################\r\n# TS2068\r\n\r\nts2068_sprites: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ts2068 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=ansi \\\r\n\t-D__TS2068__ \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t-D_XL_NO_JOYSTICK  \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TS2068_SLOWDOWN) \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\r\n\r\n\r\nts2068: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ts2068 $(SCCZ80_OPTS)  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TS2068__ \\\r\n\t-vn \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t--generic-console -DXSize=32 -DYSize=24 \\\r\n\t-D_XL_NO_JOYSTICK  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TS2068_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\r\n\r\n\r\nts2068_mode1: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ts2068 $(SCCZ80_OPTS)  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TS2068__  -D__SCREEN_MODE=1 \\\r\n\t-vn \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t--generic-console -DXSize=32 -DYSize=24 \\\r\n\t-D_XL_NO_JOYSTICK  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TS2068_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin\r\n\r\n\r\n\r\nts2068_mode6: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ts2068 $(SCCZ80_OPTS)  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TS2068__  -D__SCREEN_MODE=6 \\\r\n\t-vn -D_XL_NO_COLOR \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-lndos \\\r\n\t--generic-console -DXSize=64 -DYSize=24 \\\r\n\t-D_XL_NO_JOYSTICK  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TS2068_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_tvc",
    "content": "#############################\r\n# TVC\r\n\r\ntvc: tvc_buffered\r\n\r\n# TODO: Non-buffered may be possible\r\ntvc_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +tvc $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__TVC__ \\\r\n\t-DXSize=31 \\\r\n\t-DYSize=23 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TVC_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT -D_XL_NO_SLEEP -D_XL_NO_JOYSTICK \\\r\n\t-D__NO_INIT_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\ntvc_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +tvc $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__TVC__ --generic-console \\\r\n\t-DXSize=31 \\\r\n\t-DYSize=23 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TVC_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -D__VT52 \\\r\n\t-D__NO_WAIT -D_XL_NO_JOYSTICK -D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_v1050",
    "content": "\r\n\r\nv1050: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=v1050 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__V1050__ \\\r\n\t-D__VT52 -DXSize=80 -DYSize=25  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_V1050_SLOWDOWN) \\\r\n\t-lndos -D_XL_NO_JOYSTICK \\\r\n\t--generic-console -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_vector06c",
    "content": "#############################\r\n# VECTOR06C\r\n\r\nvector06c:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vector06c $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__VECTOR06C__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=30 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VECTOR06C_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_vector06c.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_vector06c.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_x07",
    "content": "#############################\r\n# Canon X-07\r\n# x07: x07_buffered\r\n\r\nx07_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x07  $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__X07__ \\\r\n\t-DXSize=20 -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=4 -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X07_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__NO_INIT_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n# -pragma-redirect:getk=getk_inkey\r\nx07:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x07  $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__X07__ --generic-console   -D_XL_NO_JOYSTICK \\\r\n\t-DXSize=30 -D_XL_NO_UDG \\\r\n\t-DYSize=8 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X07_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS  \\\r\n\t-D_XL_NO_COLOR -D__NO_SCREEN_COLOR_INIT \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/x07/x07_init_graphics.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nx07_Size4:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x07  $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__X07__ -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-DXSize=20 -D_XL_NO_LOWER_BORDER -D_XL_NO_UDG \\\r\n\t-DYSize=4 -D_XL_NO_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X07_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS  \\\r\n\t-D_XL_NO_COLOR -D__NO_SCREEN_COLOR_INIT  \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\nx07_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x07  $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__X07__ -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-DXSize=16 -D__NO_PRINT -D_XL_NO_LOWER_BORDER \\\r\n\t-DYSize=5 -D_XL_NO_JOYSTICK -D_XL_NO_UDG \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X07_SLOWDOWN) \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CONIO_GRAPHICS  \\\r\n\t-D_XL_NO_COLOR -D__NO_SCREEN_COLOR_INIT  \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_x1",
    "content": "x1: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x1 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DEXTRA_TITLE \\\r\n\t-D__X1__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X1_SLOWDOWN) \\\r\n\t-D__PSG_SOUND -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin -vn -lndos \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_x820",
    "content": "\r\n# TODO: This target does not have graphics\r\nx820: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=x820 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__X820__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X820_SLOWDOWN) \\\r\n\t-D__VT52 -DXSize=80 -DYSize=24  \\\r\n\t-D__CONIO_GRAPHICS -D_XL_NO_UDG \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X820_SLOWDOWN) \\\r\n\t-lndos -D_XL_NO_JOYSTICK \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_bss_himem.bin\r\n\r\n\r\n# x820_gfx: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=x820 $(SCCZ80_OPTS) \\\r\n\t# $(INCLUDE_OPTS) \\\r\n\t# -D__X820__ \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X820_SLOWDOWN) \\\r\n\t# -D__VT52 -DXSize=80 -DYSize=24  \\\r\n\t# -D__CONIO_GRAPHICS \\\r\n\t# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_X820_SLOWDOWN) \\\r\n\t# -lndos -D_XL_NO_JOYSTICK \\\r\n\t# -clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t# $(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t# $(FULL_FILES) \\\r\n\t# -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\t# rm $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\t# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_bss_himem.bin\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_z80tvgame",
    "content": "\r\n#############################\r\n# Z80TVGAME\r\n\r\nz80tvgame_no_gfx: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +z80tvgame $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__Z80TVGAME__ \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -DXSize=21 -DYSize=26 -DZ88DK_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z80TVGAME_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n\r\n\r\nz80tvgame: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z80tvgame $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__Z80TVGAME__ \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR -DXSize=21 -DYSize=26 -DZ88DK_JOYSTICK \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z80TVGAME_SLOWDOWN) \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos  -D__BIT_BANG_SOUND \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_z88",
    "content": "#############################\r\n# Z88\r\n\r\nz88_sprites: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z88 $(SCCZ80_OPTS) -subtype=app \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__Z88__ \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z88_SLOWDOWN) \\\r\n\t-vn -lndos -D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D_XL_NO_COLOR \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/z88/z88_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o z88\r\n\trm z88\r\n\trm z88.ap0\r\n\trm z88_BSS.bin\r\n\trm z88_DATA.bin\r\n\trm z88_bss_fardata.bin\r\n\tmv z88.63 $(BUILD_PATH)/X$(GAME_NAME)_$@.63\r\n\tmv z88.epr $(BUILD_PATH)/X$(GAME_NAME)_$@.epr\r\n\r\n\r\nz88: z88_mode2\r\n\r\nz88_mode1: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z88 $(SCCZ80_ROM_OPTS) -subtype=app \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__Z88__ -DXSize=60 -DYSize=8 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z88_SLOWDOWN) \\\r\n\t-D_XL_NO_JOYSTICK -D__SCREEN_MODE=1 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-pragma-redirect:CRT_FONT=_font_8x8_zx_system \\\r\n\t-vn -lndos \\\r\n\t--generic-console \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D_XL_NO_COLOR \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/z88/z88_udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o z88\r\n\trm z88\r\n\trm z88.ap0\r\n\trm z88_BSS.bin\r\n\trm z88_DATA.bin\r\n\trm z88_bss_fardata.bin\r\n\tmv z88.63 $(BUILD_PATH)/X$(GAME_NAME)_$@.63\r\n\tmv z88.epr $(BUILD_PATH)/X$(GAME_NAME)_$@.epr\r\n\r\n\r\nz88_mode2: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z88 $(SCCZ80_ROM_OPTS) -subtype=app \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__Z88__ -DXSize=60 -DYSize=8 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z88_SLOWDOWN) \\\r\n\t-D_XL_NO_JOYSTICK -D__SCREEN_MODE=2 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-pragma-redirect:CRT_FONT=_font_8x8_zx_system \\\r\n\t-vn -lndos \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D_XL_NO_COLOR \\\r\n\t--generic-console \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/z88/z88_udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o z88\r\n\trm z88\r\n\trm z88.ap0\r\n\trm z88_BSS.bin\r\n\trm z88_DATA.bin\r\n\trm z88_bss_fardata.bin\r\n\tmv z88.63 $(BUILD_PATH)/X$(GAME_NAME)_$@.63\r\n\tmv z88.epr $(BUILD_PATH)/X$(GAME_NAME)_$@.epr"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_zx80",
    "content": "#############################\r\n# ZX80\r\n\r\nzx80: zx80_16k_turn_based\r\n\r\n\r\nzx80_16k_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx80 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -DZX80_GEN_TV_FIELD -DTURN_BASED -DTURN_BASED \\\r\n\t--opt-code-size -pragma-define:ZX_CHAR_XLATE_MODE=1 \\\r\n\t-vn  \\\r\n\t-D__ZX80__  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_SLOWDOWN) $(ZX81_NO_GFX_GAME_OPTS) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \\\r\n\t$(FULL_FILES)\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/Makefile_zxn",
    "content": "#############################\r\n# ZXN\r\n\r\nzxn: zxn_mode66\r\n\r\nzxn_mono: zxn_mode67\r\n\r\nzxn_mode64: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zxn $(SCCZ80_OPTS) -clib=classic -subtype=nex $(INCLUDE_OPTS) \\\r\n\t-D__ZXN__ --generic-console \\\r\n\t-DXSize=40 \\\r\n\t-DYSize=32 -D__SCREEN_MODE=64 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS  -D__PSG_SOUND \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZXN_SLOWDOWN) \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_UNASSIGNED.bin\r\n\r\n\r\nzxn_mode65: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zxn $(SCCZ80_OPTS) -clib=classic -subtype=nex $(INCLUDE_OPTS) \\\r\n\t-D__ZXN__ --generic-console \\\r\n\t-DXSize=40 -D_XL_NO_COLOR \\\r\n\t-DYSize=32 -D__SCREEN_MODE=65 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS  -D__PSG_SOUND \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZXN_SLOWDOWN) \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_UNASSIGNED.bin\r\n\r\n\r\nzxn_mode66: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zxn $(SCCZ80_OPTS) -clib=classic -subtype=nex $(INCLUDE_OPTS) \\\r\n\t-D__ZXN__ --generic-console \\\r\n\t-DXSize=80 \\\r\n\t-DYSize=32 -D__SCREEN_MODE=66 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS  -D__PSG_SOUND \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZXN_SLOWDOWN) \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_UNASSIGNED.bin\r\n\r\n\r\nzxn_mode67: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zxn $(SCCZ80_OPTS) -clib=classic -subtype=nex $(INCLUDE_OPTS) \\\r\n\t-D__ZXN__ --generic-console \\\r\n\t-DXSize=80 -D_XL_NO_COLOR \\\r\n\t-DYSize=32 -D__SCREEN_MODE=67 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \\\r\n\t-D__CONIO_GRAPHICS  -D__PSG_SOUND \\\r\n\t-lndos \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZXN_SLOWDOWN) \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_UNASSIGNED.bin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/extras/Makefile_agon",
    "content": "agon_mode0: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +agon $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__AGON__ -D_XL_NO_JOYSTICK \\\r\n\t-D__SCREEN_MODE=0 -pragma-define:CRT_ENABLE_COMMANDLINE=0 \\\r\n\t-D__CONIO_GRAPHICS -DXSize=128 -DYSize=97 -D_XL_NO_COLOR \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGON_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\nagon_mode1: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +agon $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__AGON__ -D_XL_NO_JOYSTICK \\\r\n\t-D__SCREEN_MODE=1 -pragma-define:CRT_ENABLE_COMMANDLINE=0 \\\r\n\t-D__CONIO_GRAPHICS -DXSize=64 -DYSize=47  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGON_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@\r\n\r\n\r\nagon_mode3: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +agon $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__AGON__ -D_XL_NO_JOYSTICK -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SCREEN_MODE=3 -pragma-define:CRT_ENABLE_COMMANDLINE=0 \\\r\n\t-D__CONIO_GRAPHICS -DXSize=80 -DXSize=59 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGON_SLOWDOWN) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/X$(GAME_NAME)_$@"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/extras/Makefile_c128",
    "content": "c128_z80_40col_zsdcc: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 -compiler=sdcc $(ZSDCC_OPTS)  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos -subtype=disk -clib=gencon \\\r\n\t-D__C128_Z80__ -DXSize=40 \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND   \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_40COL_SLOWDOWN) \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o\"a40.bin\"\r\nifdef USE_TOOLS\r\n\t$(C1541) -format \"crosschase,0\" d64 FULL_$@.d64\r\n\t$(C1541) -attach FULL_$@.d64 -write a40.ldr\r\n\t$(C1541) -attach FULL_$@.d64 -write a40\r\n\tmv FULL_$@.d64 $(BUILD_PATH)/X$(GAME_NAME)_$@.d64\r\n\trm a40.bin\r\nelse\r\n\tmv a40.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\nendif\r\n\trm a40.ldr\r\n\trm a40\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/extras/Makefile_camputers_lynx",
    "content": "camputers_lynx_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lynx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D__CAMPUTERS_LYNX__ -D_XL_NO_UDG -D_XL_NO_JOYSTICK -D__BIT_BANG_SOUND \\\r\n\t-vn \\\r\n\t$(CAMPUTERS_LYNX_GAME_OPTS) \\\r\n\t-D__VT52 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CAMPUTERS_LYNX_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\r\n\r\ncamputers_lynx_zsdcc: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lynx $(ZSDCC_OPTS) -compiler=sdcc $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D__CAMPUTERS_LYNX__ -D_XL_NO_JOYSTICK  -D__BIT_BANG_SOUND \\\r\n\t-vn \\\r\n\t$(CAMPUTERS_LYNX_GAME_OPTS) \\\r\n\t-D__VT52 \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CAMPUTERS_LYNX_SLOWDOWN) \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS  \\\r\n\t$(FULL_FILES) \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/extras/Makefile_cpc",
    "content": "\r\nifdef USE_TOOLS\r\ncpc_cpcrslib_mode1: $(ASSETS_PATH)/z88dk_cpc_Chars8.asm $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)\r\nelse\r\ncpc_cpcrslib_mode1: $(ASSETS_PATH)/z88dk_cpc_Chars8.asm\r\nendif\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc $(SCCZ80_OPTS) $(INCLUDE_OPTS)  -vn  -clib=ansi \\\r\n\t-D__CPC__  \\\r\n\t-D__CPCRSLIB_GRAPHICS \\\r\n\t \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPC_CPCRSLIB_MODE1_SLOWDOWN) \\\r\n\t-pragma-define:REGISTER_SP=-1 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.prg \\\r\n\t-D__CPCRSLIB_GRAPHICS \\\r\n\t$(ASSETS_PATH)/z88dk_cpc_Chars8.asm \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/cpc/cpc_cpcrslib_init_graphics.c \\\r\n\t$(FULL_FILES)\r\nifdef USE_TOOLS\r\n\t$(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_$(GAME_NAME)XXX $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cpc  $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cdt\r\n\trm -rf X$(GAME_NAME)XXX_cpc.dsk\r\n\t$(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd X$(GAME_NAME)XXX_cpc.dsk\r\n\t$(TOOLS_PATH)/z88dk/cpc/cpcxfsw X$(GAME_NAME)XXX_cpc.dsk -p $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cpc x$(GAME_NAME)XXX\r\n\tmv X$(GAME_NAME)XXX_cpc.dsk $(BUILD_PATH)/\r\n\tcp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t$(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)  $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.dsk  $(BUILD_PATH)/X$(GAME_NAME)XXX_gx4000.cpr   -c 'run\"x$(GAME_NAME)XXX'\r\n\trm os.rom\r\n\trm amsdos.rom\r\n\trm basic.rom\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.cpc \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)XXX_cpc.prg\r\nendif\r\n\r\n\r\n\r\nifdef USE_TOOLS\r\ncpc_mode2: $(ASSETS_PATH)/z88dk_xchase.asm $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)\r\nelse\r\ncpc_mode2: $(ASSETS_PATH)/z88dk_xchase.asm\r\nendif\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -subtype=dsk $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc  \\\r\n\t-DYSize=25 -DXSize=80 -D__SCREEN_MODE=2 -D_XL_NO_COLOR \\\r\n\t \\\r\n\t   \\\r\n\t$(CPC_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPC_MODE0_SLOWDOWN) \\\r\n\t-D__CPC__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o xbin \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES)\r\n\tmv xbin $(BUILD_PATH)/\r\nifdef USE_TOOLS\r\n\tcp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t$(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT) xbin.dsk  $(BUILD_PATH)/X$(GAME_NAME)_$@_gx4000.cpr   -c 'run\"XBIN.CPC'\r\n\trm os.rom\r\n\trm amsdos.rom\r\n\trm basic.rom\r\nendif\r\n\tmv xbin.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\trm -rf xbin_BANK_7.bin\r\n\trm -rf xbin.cpc\r\n\trm -rf $(BUILD_PATH)/xbin\r\n\trm -rf xbin\r\n\r\n\r\nifdef USE_TOOLS\r\ncpc_mode1: $(ASSETS_PATH)/z88dk_xchase.asm $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)\r\nelse\r\ncpc_mode1: $(ASSETS_PATH)/z88dk_xchase.asm\r\nendif\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc -subtype=dsk $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc  \\\r\n\t-DYSize=25 -DXSize=40 -D__SCREEN_MODE=1 \\\r\n\t \\\r\n\t   \\\r\n\t$(CPC_GAME_OPTS) \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPC_MODE0_SLOWDOWN) \\\r\n\t-D__CPC__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o xbin \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FULL_FILES)\r\n\tmv xbin $(BUILD_PATH)/\r\nifdef USE_TOOLS\r\n\tcp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t$(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT) xbin.dsk  $(BUILD_PATH)/X$(GAME_NAME)_$@_gx4000.cpr   -c 'run\"XBIN.CPC'\r\n\trm os.rom\r\n\trm amsdos.rom\r\n\trm basic.rom\r\nendif\r\n\tmv xbin.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk\r\n\trm -rf xbin_BANK_7.bin\r\n\trm -rf xbin.cpc\r\n\trm -rf $(BUILD_PATH)/xbin\r\n\trm -rf xbin\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/extras/Makefile_gal",
    "content": "# --opt-code-size \r\ngal_6k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-need=ansiterminal \\\r\n\t--reserve-regs-iy \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-DTINY_GAME  -DNO_WALL -DNO_BLINKING \\\r\n\t-D_XL_NO_SLEEP -DLESS_TEXT \\\r\n\t-D__GAL__ \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DFLAT_ENEMIES \\\r\n\t-D__ALT_HIGHSCORE \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAL_SLOWDOWN) \\\r\n\t-lndos -create-app -Cz--audio -o  $(BUILD_PATH)/X$(GAME_NAME)_TINY_galaksija_6k.prg \\\r\n\t$(TINY_FILES) \\\r\n\t$(SOURCE_PATH)/memory/gal_memory.asm\r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_TINY_$@.prg\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/extras/Makefile_gal_plus",
    "content": "\r\ngal_plus_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal -subtype=galaxyp $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-need=ansiterminal \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAL_SLOWDOWN) \\\r\n\t-D__GAL__ -D__GAL_PLUS__   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-vn -lndos -create-app -o  $(BUILD_PATH)/X$(GAME_NAME)_galaksija_plus.prg \\\r\n\t$(FULL_FILES) \r\n\trm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg\r\n\r\n"
  },
  {
    "path": "src/makefiles.common/targets/z88dk/extras/Makefile_pc88",
    "content": "#############################\r\n# PC88\r\n\r\n# pc88: pc88_32k\r\n\r\n# pc88_wav: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\r\n\r\n\r\n# pc88_no_gfx:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\r\n\t # -D__PC88__    \\\r\n\t# -lndos -DXSize=80 -DYSize=23 -D_XL_SLOW_DOWN_FACTOR=2500 \\\r\n\t# -clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t# -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND -D__DEFAULT_CLEAR_SCREEN \\\r\n\t# $(FULL_FILES) \\\r\n\t# -create-app\t\\\r\n\t# -o FULL_$@\r\n\t# rm FULL_$@\r\n\t# mv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\t# mv FULL_$@.t88 $(BUILD_PATH)/X$(GAME_NAME)_$@.t88\r\n\r\npc88_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS)  -Cz--audio $(INCLUDE_OPTS) -vn \\\r\n\t-D__PC88__ -DTINY_GAME  -DNO_WALL -DNO_BLINKING  \\\r\n\t-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PC88_SLOWDOWN) \\\r\n\t-lndos -DXSize=80 -DYSize=23 -DTINY_GAME \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app\t\\\r\n\t-o TINY_$@\r\n\trm TINY_$@\r\n\tmv TINY_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav\r\n\tmv TINY_$@.t88 $(BUILD_PATH)/X$(GAME_NAME)_$@.t88\r\n"
  },
  {
    "path": "src/makefiles.other/chase/alt/Makefile.cc65_alternative_builds",
    "content": "# -----------------------------------------------\r\n# CC65\r\n\r\n#     oric1_alt_targets \r\ncc65_alt_targets: \\\r\n    atari_alt_targets \\\r\n    atari_lynx_alt_targets \\\r\n    c16_alt_targets \\\r\n    creativision_alt_targets \\\r\n    gamate_alt_targets \\\r\n    nes_alt_targets \\\r\n    pet_alt_targets \\\r\n    vic20_alt_targets\r\n\r\n\r\n#############################\r\n# ATARI 8-bit\r\n\r\natari_alt_targets: \\\r\n    atari_no_color_16k_full \\\r\n    atari_no_color_16k\r\n\r\n\r\n#############################\r\n# ATARI LYNX\r\n\r\natari_lynx_alt_targets: \\\r\n    atari_lynx_light \r\n\r\n\r\n#############################\r\n# C16\r\n\r\n# All tested OK\r\n# except INIT overflow by 21 for    c16_16k_full_no_gfx \r\nc16_alt_targets: \\\r\n    c16_16k_light\r\n\r\n\r\n#############################\r\n# C64\r\n\r\n# Tested OK\r\nc64_alt_targets: \\\r\n    c64_8k_cart\r\n\r\n#############################\r\n# CREATIVISION\r\ncreativision_alt_targets: \\\r\n    creativision_24k \\\r\n    creativision_8k_tiny \\\r\n    creativision_16k_no_gfx\r\n\r\n#############################\r\n# GAMATE\r\n\r\ngamate_alt_targets: \\\r\n    gamate_tiny \\\r\n    gamate_light\r\n\r\n\r\n#############################\r\n# CREATIVISION\r\n\r\nnes_alt_targets: \\\r\n    nes_no_fx\r\n\r\n\r\n#############################\r\n# ORIC1\r\n# KO: undefined tiles 17 and 18 \r\noric1_alt_targets: \\\r\n    oric1_16k_light\r\n\r\n\r\n#############################\r\n# PET\r\n\r\n# All tested OK\r\npet_alt_targets: \\\r\n    pet_8k \\\r\n\r\n\r\n#############################\r\n# VIC 20\r\n\r\n# All tested OK\r\n# vic20_unexpanded_turn_based\r\nvic20_alt_targets: \\\r\n    vic20_exp_3k_tiny \\\r\n    vic20_exp_3k_light_no_gfx \\\r\n    vic20_exp_8k_full \\\r\n    vic20_unexpanded_no_gfx \r\n\r\n\r\n\r\n###############################################################\r\n\r\n\r\n#############################\r\n# ATARI 8-BIT\r\n\r\natari_no_color_16k_full: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t atari \\\r\n\t \\\r\n\t-DNO_HINTS \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-DFLAT_ENEMIES \\\r\n\t-D__ALT_SLEEP \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_PRINT -D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES) -o $(BUILD_PATH)/ALT_FULL_atari_no_color_16k.xex\t\r\n\r\n\r\natari_no_color_16k: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -Cl -t atari \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_PRINT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(LIGHT_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_LIGHT_atari_no_color_16k.xex\r\n\r\n\r\n\r\n#############################\r\n# C16\r\n\r\nc16_16k_full_no_gfx:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t c16 -Cl \\\r\n\t--config $(CFG_PATH)/cc65/c16-16k.cfg \\\r\n\t \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS  \\\r\n\t \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c  \\\r\n\t$(SOURCE_PATH)/memory/c16_memory.s \\\r\n\t$(FULL_FILES) -o $(BUILD_PATH)/ALT_FULL_c16_16k_no_gfx.prg\r\n\r\nc16_16k_light: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t c16 \\\r\n\t--config $(CFG_PATH)/cc65/c16-32k.cfg \\\r\n\t   \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_redefined_chars_init_graphics.c  \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(SOURCE_PATH)/memory/c16_memory.s \\\r\n\t-o $(BUILD_PATH)/ALT_LIGHT_c16_16k.prg\r\n\r\n\r\n#############################\r\n# C64\r\n\r\nc64_8k_cart: $(ASSETS_PATH)/cc65_udc.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c64 \\\r\n\t   \\\r\n\t-DLESS_TEXT \\\r\n\t-DGHOSTS_NUMBER=9 \\\r\n\t \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-DROUND_ENEMIES \\\r\n\t-DCBM_SCREEN_CODES \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(ASSETS_PATH)/cc65_udc.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_FULL_c64_8k_cart.prg\r\n\t$(TOOLS_PATH)/generic/exomizer sfx basic  $(BUILD_PATH)/ALT_FULL_c64_8k_cart.prg -o $(BUILD_PATH)/ALT_FULL_c64_8k_exomized.prg\r\n\tpython $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/ALT_FULL_c64_8k_exomized.prg  $(BUILD_PATH)/ALT_FULL_c64_8k_exomized.crt\r\n\trm $(BUILD_PATH)/ALT_FULL_c64_8k_cart.prg\r\n\trm $(BUILD_PATH)/ALT_FULL_c64_8k_exomized.prg\r\n\r\n\r\n#############################\r\n# CREATIVISION\r\n\r\ncreativision_16k_no_gfx:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t   -D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t--config $(CFG_PATH)/cc65/creativision-16k.cfg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_FULL_creativision_16k.bin\t\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_16k.bin ibs=1 count=8192 of=$(BUILD_PATH)/ALT_FULL_creativision_16k_LOW.bin\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_16k.bin ibs=1 skip=8192 of=$(BUILD_PATH)/ALT_FULL_creativision_16k_HIGH.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_creativision_16k.bin \r\n\tcat $(BUILD_PATH)/ALT_FULL_creativision_16k_HIGH.bin $(BUILD_PATH)/ALT_FULL_creativision_16k_LOW.bin > $(BUILD_PATH)/ALT_FULL_creativision_16k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_creativision_16k_LOW.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_creativision_16k_HIGH.bin\t\r\n\r\ncreativision_18k:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__CREATIVISION__  \\\r\n\t   -D__ALT_SLEEP \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -DLESS_TEXT   \\\r\n\t--config $(CFG_PATH)/cc65/creativision-18k.cfg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_init_graphics.c \\\r\n\t-o $(BUILD_PATH)/ALT_FULL_creativision_18k.bin\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_18k.bin bs=8k skip=1 > $(BUILD_PATH)/ALT_FULL_creativision_18k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_18k.bin bs=8k count=1 >> $(BUILD_PATH)/ALT_FULL_creativision_18k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_creativision_18k.bin\r\n\r\ncreativision_24k:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D_XL_NO_SLEEP -DLESS_TEXT    -D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t--config $(CFG_PATH)/cc65/creativision-24k.cfg \\\r\n\t$(FULL_FILES) \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t-o $(BUILD_PATH)/ALT_FULL_creativision_24k.bin\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_24k.bin bs=8k skip=1 > $(BUILD_PATH)/ALT_FULL_creativision_24k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_24k.bin bs=8k count=1 >> $(BUILD_PATH)/ALT_FULL_creativision_24k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_creativision_24k.bin\r\n\r\ncreativision_32k:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t-D_XL_NO_SLEEP -DLESS_TEXT    -D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t--config $(CFG_PATH)/cc65/creativision-32k.cfg \\\r\n\t$(FULL_FILES) \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t-o $(BUILD_PATH)/ALT_FULL_creativision_32k.bin\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_32k.bin bs=16k skip=1 > $(BUILD_PATH)/ALT_FULL_creativision_32k_SWAPPED.bin\r\n\tdd if=$(BUILD_PATH)/ALT_FULL_creativision_32k.bin bs=16k count=1 >> $(BUILD_PATH)/ALT_FULL_creativision_32k_SWAPPED.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_creativision_32k.bin\r\n\r\ncreativision_8k_tiny: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t creativision \\\r\n\t--config $(CFG_PATH)/cc65/creativision-8k.cfg \\\r\n\t-DTINY_GAME -D_XL_NO_SLEEP \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(TINY_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_TINY_creativision_8k.bin\r\n\r\n\r\n#############################\r\n# GAMATE\r\n\r\ngamate_light: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t gamate \\\r\n\t-DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t$(LIGHT_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_LIGHT_gamate.bin\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart $(BUILD_PATH)/ALT_LIGHT_gamate.bin\r\n\t\r\ngamate_tiny: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t gamate \\\r\n\t-DTINY_GAME \\\r\n\t-DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DGHOSTS_NUMBER=7 \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t$(TINY_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_TINY_gamate.bin\r\n\t$(TOOLS_PATH)/cc65/gamate/gamate-fixcart $(BUILD_PATH)/ALT_TINY_gamate.bin\r\n\r\n\r\n#############################\r\n# NES\r\n\r\nnes_no_fx: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t nes \\\r\n\t \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_FULL_nes_no_fx.nes\t\r\n\r\n\r\n#############################\r\n# ORIC1\r\n\r\noric1_16k_light: $(ASSETS_PATH)/6x8_chars.h\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS)  -O -D__ORIC1__   \\\r\n\t-t atmos \\\r\n\t--config $(CFG_PATH)/cc65/atmos_better_tap.cfg \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ALT_MOVE \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/atmos/atmos_redefined_characters_init_graphics.c \\\r\n\t$(LIGHT_FILES) \\\r\n\t-o $(BUILD_PATH)/ALT_LIGHT_oric1_16k.tap\r\n\r\n\r\n#############################\r\n# PET\r\n\r\npet_8k: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t pet -Cl \\\r\n\t-DTINY_GAME -D__NO_INIT_GRAPHICS -D__CONIO_GRAPHICS \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t$(TINY_FILES) \\\r\n\t$(SOURCE_PATH)/memory/pet_memory.s \\\r\n\t-o $(BUILD_PATH)/ALT_TINY_pet_8k.prg\r\n\r\n\r\n#############################\r\n# VIC 20\r\n\r\nvic20_exp_3k_light_no_gfx:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t--config $(CFG_PATH)/cc65/alt/vic20-3k.cfg  \\\r\n\t -DGHOSTS_NUMBER=8 \\\r\n\t \\\r\n\t \\\r\n\t-D__VIC20_EXP_3K \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-DCBM_SCREEN_CODES \\\r\n\t-DUSE_LIGHT_MEMORY_BUFFERS \\\r\n\t-DNO_HINTS \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_TEXT_COLOR \\\r\n\t \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__ALT_DISPLAY_STATS \\\r\n\t-D__ALT_HIGHSCORE \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t-o $(BUILD_PATH)/ALT_LIGHT_vic20_exp_3k_no_gfx.prg\r\n\r\n\r\nvic20_exp_3k_tiny: $(ASSETS_PATH)/cc65_udc_vic20_64_chars.s\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t \\\r\n\t -DLESS_TEXT -D__NO_SCREEN_COLOR_INIT -DNO_DEAD_GHOSTS -DGHOSTS_NUMBER=8 \\\r\n\t-DROUND_ENEMIES \\\r\n\t-DTINY_GAME  \\\r\n\t--config $(CFG_PATH)/cc65/vic20-3k_GFX.cfg \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__VIC20_EXP_3K \\\r\n\t-D__ALT_PRINT \\\r\n\t-DCBM_SCREEN_CODES \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds_3k.c \\\r\n\t$(ASSETS_PATH)/cc65_udc_vic20_64_chars.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(TINY_FILES) \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t-o $(BUILD_PATH)/ALT_TINY_vic20_exp_3k.prg\r\n\r\n\r\nvic20_exp_8k_full:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 --config $(CFG_PATH)/cc65/alt/vic20-8k.cfg \\\r\n\t \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-DLESS_TEXT\t\\\r\n\t-D__ALT_PRINT \\\r\n\t-DNO_HINTS \\\r\n\t \\\r\n\t-D__ALT_SLEEP \\\r\n\t \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__VIC20_EXP_8K \\\r\n\t \\\r\n\t-DUSE_MEMORY_BUFFERS \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t-o $(BUILD_PATH)/ALT_FULL_vic20_exp_8k_no_gfx.prg\r\n\r\n\r\nvic20_unexpanded_no_gfx:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t \\\r\n\t \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-D_XL_NO_TEXT_COLOR \\\r\n\t-D__VIC20_UNEXPANDED \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DLESS_TEXT \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTINY_GAME \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ALT_DISPLAY_STATS \\\r\n\t-D__ALT_HIGHSCORE \\\r\n\t-DROUND_ENEMIES \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t--config $(CFG_PATH)/cc65/alt/vic20_unexpanded.cfg  \\\r\n\t$(TINY_FILES) \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds_3k.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t-o $(BUILD_PATH)/ALT_TINY_vic20_unexpanded_no_gfx.prg\r\n\r\n\r\nvic20_unexpanded_turn_based:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -Cl -t vic20 \\\r\n\t \\\r\n\t-D_XL_NO_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-D_XL_NO_TEXT_COLOR \\\r\n\t-D__VIC20_UNEXPANDED \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DLESS_TEXT \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DTINY_GAME \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_STATS \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-DBOMBS_NUMBER=4 \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ALT_DISPLAY_STATS \\\r\n\t-DFLAT_ENEMIES \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t--config $(CFG_PATH)/cc65/alt/vic20_unexpanded.cfg  \\\r\n\t$(TINY_FILES) \\\r\n\t$(SOURCE_PATH)/memory/vic20_memory.s \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds_3k.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/simple_alt_stats.c \\\r\n\t-o $(BUILD_PATH)/ALT_TINY_vic20_unexpanded_turn_based.prg\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/alt/Makefile.z88dk_alternative_builds",
    "content": "# ALTERNATIVE VERSIONS\r\n\r\n\r\n\r\n# -----------------------------------------------------\r\n# Z88DK\r\n\r\n\r\ninclude makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_a-n\r\n\r\ninclude makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_o-z\r\n\r\ninclude makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_zsdcc\r\n\r\ninclude makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_qaopm\r\n\r\nz88dk_alt_targets_sccz80:\r\n\tmake $(Z88DK_MAKE_OPTS) z88dk_alt_targets_a-n\r\n\tmake $(Z88DK_MAKE_OPTS) z88dk_alt_targets_o-z\r\n\r\nz88dk_alt_targets:\r\n\tmake $(Z88DK_MAKE_OPTS) z88dk_alt_targets_zsdcc\r\n\tmake $(Z88DK_MAKE_OPTS) z88dk_alt_targets_sccz80\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_a-n",
    "content": "# -----------------------------------------------\r\n# Z88DK\r\n\r\nz88dk_alt_targets_a-n: \\\r\n    abc80_alt_targets \\\r\n    ace_alt_targets \\\r\n    aussie_alt_targets \\\r\n    c128_z80_alt_targets \\\r\n    camputers_alt_targets \\\r\n    cpm_z80_alt_targets \\\r\n    eg2k_alt_targets \\\r\n    fp1100_alt_targets \\\r\n    g800_alt_targets \\\r\n    lambda_alt_targets \\\r\n    m5_alt_targets \\\r\n    mc1000_alt_targets \\\r\n    microbee_alt_targets \\\r\n    msx_alt_targets \\\r\n    mtx_alt_targets \\\r\n    multi8_alt_targets \\\r\n    nascom_alt_targets \r\n\r\n\r\n#############################\r\n\r\nabc80_alt_targets: \\\r\n    abc80_tiny\r\n\r\n\r\nace_alt_targets: \\\r\n    ace_exp_16k_no_gfx\r\n\r\naussie_alt_targets: \\\r\n    aussie_buffered\r\n\r\nc128_z80_alt_targets: \\\r\n    c128_z80_40col_turn_based\r\n\r\ncamputers_alt_targets: \\\r\n    camputers_lynx_tiny\r\n\r\ncpm_z80_alt_targets: \\\r\n    cpm_z80_tiny_buffered \\\r\n    cpm_z80_buffered \\\r\n    cpm_z80_vt52 \\\r\n    cpm_z80_vt100\r\n\r\ncpc_alt_targets: \\\r\n    cpc_no_udg\r\n\r\neg2k_alt_targets: \\\r\n    eg2k_no_gfx\r\n\r\nfp1100_alt_targets: \\\r\n    fp1100_tiny\r\n\r\ng800_alt_targets: \\\r\n    g800_tiny_turn_based\r\n\r\nlambda_alt_targets: \\\r\n    lambda_8k \\\r\n    lambda_light\r\n\r\nm5_alt_targets: \\\r\n    m5_no_gfx \\\r\n    m5_tiny_no_gfx\r\n\r\nmc1000_alt_targets: \\\r\n    mc1000_16k_light\r\n\r\nmicrobee_alt_targets: \\\r\n    microbee_32k_no_gfx \\\r\n    microbee_32k_wav\r\n\r\nmsx_alt_targets: \\\r\n    msx_32k_cas\r\n\r\nmtx_alt_targets: \\\r\n    mtx_no_gfx \\\r\n    mtx_16k_no_gfx\r\n\r\nmulti8_alt_targets: \\\r\n    multi8_light_udg \\\r\n    multi8_tiny_udg\r\n\r\nnascom_alt_targets: \\\r\n    nascom_32k_turn_based\r\n\r\n\r\n#############################\r\n# ABC80\r\n\r\nabc80_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc80 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DTINY_GAME -DNO_WALL \\\r\n\t-D__NO_WAIT \\\r\n\t-D__ABC80__ -clib=ansi -vn  -lndos -create-app -o abc80t.bin \\\r\n\t$(TINY_FILES)\r\n\trm abc80t.bin\r\n\tmv abc80t.ihx $(BUILD_PATH)/ALT_TINY_abc80.ihx \r\n\r\n\r\n#############################\r\n# ACE\r\nace_exp_16k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ace $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ACE__    \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi -o acengfx.bin -Cz--audio -create-app \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\tcp acengfx.wav $(BUILD_PATH)/ALT_FULL_ace_exp_16k_no_gfx.wav\r\n\trm acengfx.wav\r\n\trm acengfx.tap\r\n\trm acengfx.bin\r\n\r\n\r\n#############################\r\n# AUSSIE\r\naussie_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -laussie  \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-vn \\\r\n\t-D__AUSSIE__ \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-DXSize=16 \\\r\n\t-DYSize=12 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o aussieb.bin\r\n\trm aussieb.bin\r\n\tmv aussieb.COM $(BUILD_PATH)/ALT_FULL_aussie_buffered.COM\r\n\r\n\r\n#############################\r\n# C128 Z80\r\nc128_z80_40col_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos -subtype=disk \\\r\n\t-D__C128_Z80__ -DXSize=40 \\\r\n\t  \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oa80tb.bin\r\n\t$(TOOLS_PATH)/generic/c1541 -format \"crosschase,0\" d64 ALT_FULL_c128_z80_40col_turn_based.d64\r\n\t$(TOOLS_PATH)/generic/c1541 -attach ALT_FULL_c128_z80_40col_turn_based.d64 -write a80tb.ldr\r\n\t$(TOOLS_PATH)/generic/c1541 -attach ALT_FULL_c128_z80_40col_turn_based.d64 -write a80tb\r\n\tmv ALT_FULL_c128_z80_40col_turn_based.d64 $(BUILD_PATH)/\r\n\trm A80TB.LDR\r\n\trm A80TB\r\n\trm a80tb.bin\r\n\r\n\r\n\r\n#############################\r\n# CAMPUTERS LYNX\r\ncamputers_lynx_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lynx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D__CAMPUTERS_LYNX__ \\\r\n\t-vn \\\r\n\t-D__VT52 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME -DNO_WALL \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/ALT_TINY_camputers_lynx.bin\r\n\trm $(BUILD_PATH)/ALT_TINY_camputers_lynx.bin\r\n\r\n\r\n#############################\r\n# CPM\r\n\r\n\r\ncpm_z80_tiny_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__STDIO \\\r\n\t-DXSize=24 \\\r\n\t-DYSize=16 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME -DNO_WALL \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/ALT_FULL_cpm_z80_tiny_buffered.bin \r\n\trm $(BUILD_PATH)/ALT_FULL_cpm_z80_tiny_buffered.bin \r\n\r\n\r\n# cannot run in Mame (Kaypro 2x)\r\ncpm_z80_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__STDIO \\\r\n\t-DXSize=24 \\\r\n\t-DYSize=16 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/ALT_FULL_cpm_z80_buffered.bin \r\n\trm $(BUILD_PATH)/ALT_FULL_cpm_z80_buffered.bin \r\n\r\n\r\ncpm_z80_vt52:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__VT52 \\\r\n\t-D__CPM_80X24__ \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t  \\\r\n\t-create-app -o$(BUILD_PATH)/ALT_FULL_cpm_vt52.bin \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_cpm_vt52.bin\t\r\n\r\n\r\ncpm_z80_vt100:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__VT100 \\\r\n\t-D__CPM_80X24__ \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t  \\\r\n\t-create-app -o$(BUILD_PATH)/ALT_FULL_cpm_vt100.bin \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_cpm_vt100.bin\t\r\n\r\n\r\n#############################\r\n# EG2K\r\neg2k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__EG2K__ \\\r\n\t-subtype=eg2000disk \\\r\n\t-lndos \\\r\n\t-lm \\\r\n\t-D__TRS80__ \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t   \\\r\n\t-D__VT52 \\\r\n\t-create-app -o eg2kngfx.bin \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\tmv eg2kngfx.cmd $(BUILD_PATH)/ALT_FULL_eg2k_no_gfx.cmd\r\n\trm eg2kngfx.bin\r\n\r\n\r\n#############################\r\n# FP1100\r\nfp1100_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +fp1100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__FP1100__ -vn \\\r\n\t-D__VT52 \\\r\n\t-DTINY_GAME -DNO_WALL  \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o fp1100t.bin\r\n\tmv fp1100t.d88 $(BUILD_PATH)/ALT_TINY_fp1100.d88\r\n\trm fp1100t.bin\r\n\trm fp1100t_BOOTSTRAP.bin\r\n\r\n\r\n#############################\r\n# G800\r\ng800_tiny_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +g800 $(SCCZ80_OPTS) -clib=g850b $(INCLUDE_OPTS) \\\r\n\t-D__G800__ \\\r\n\t-DTURN_BASED \\\r\n\t \\\r\n\t-vn \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-DTINY_GAME -DNO_WALL \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o g800ttb.bin\r\n\trm g800ttb.bin\r\n\trm g800ttb.rom\r\n\tmv g800ttb.ihx $(BUILD_PATH)/ALT_TINY_g800_turn_based.ihx\r\n\r\n\r\n#############################\r\n# LAMBDA\r\nlambda_8k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lambda $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn -D__LAMBDA__ -DTINY_GAME -DNO_WALL -D__NO_SCREEN_COLOR_INIT \\\r\n\t-DLESS_TEXT -D_XL_NO_SLEEP -lndos -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_TINY_lambda_8k.prg \\\r\n\t$(TINY_FILES)\r\n\trm $(BUILD_PATH)/ALT_TINY_lambda_8k.prg\r\n\r\n\r\nlambda_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lambda $(SCCZ80_OPTS) -vn -D__LAMBDA__ -lndos -create-app -o  $(BUILD_PATH)/ALT_LIGHT_lambda.prg \\\r\n\t$(INCLUDE_OPTS) $(LIGHT_FILES) -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS\r\n\trm $(BUILD_PATH)/ALT_LIGHT_lambda.prg\r\n\r\n\r\n#############################\r\n# M5\r\nm5_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lm -create-app -Cz--audio -subtype=tape \\\r\n\t-pragma-define:REGISTER_SP=65000 \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-o$(BUILD_PATH)/ALT_FULL_m5_no_gfx.bin \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_m5_no_gfx.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_m5_no_gfx.cas\r\n\r\n\r\nm5_tiny_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lm -create-app -Cz--audio -subtype=tape \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-DTINY_GAME -DNO_WALL -DLESS_TEXT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-o$(BUILD_PATH)/ALT_TINY_m5_no_gfx.bin \\\r\n\t$(TINY_FILES)\r\n\trm $(BUILD_PATH)/ALT_TINY_m5_no_gfx.bin\r\n\trm $(BUILD_PATH)/ALT_TINY_m5_no_gfx.cas\r\n\r\n\r\n#############################\r\n# MC1000\r\nmc1000_16k_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-pragma-define:ansicolumns=32 -subtype=gaming -clib=ansi -D__MC1000__  -vn \\\r\n\t-lndos \\\r\n\t-create-app -o mc1000l.bin \\\r\n\t-Cz--audio -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(LIGHT_FILES)\r\n\tmv mc1000l.wav $(BUILD_PATH)/ALT_LIGHT_mc1000_16k.wav\r\n\trm mc1000l.bin\r\n\trm mc1000l.cas\r\n\r\n\r\n#############################\r\n# MICRO\r\nmicrobee_32k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__BEE__ \\\r\n\t-clib=ansi \\\r\n\t-vn \\\r\n\t     \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/ALT_FULL_microbee_32k_no_gfx.prg  \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_microbee_32k_no_gfx.prg\r\n\r\n\r\nmicrobee_32k_wav:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee $(SCCZ80_OPTS) $(INCLUDE_OPTS) -subtype=wav \\\r\n\t-D__BEE__ \\\r\n\t-clib=ansi \\\r\n\t-vn \\\r\n\t     \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/ALT_FULL_microbee_32k_wav.prg  \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_microbee_32k_wav.prg\r\n\r\n\r\n#############################\r\n# MSX\r\nmsx_32k_cas: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +msx $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -lmsxbios \\\r\n\t-DUSE_MSX_BIOS \\\r\n\t-vn -DMSX_VPOKE  -D__MSX__   \\\r\n\t-lndos \\\r\n\t-create-app -o $(BUILD_PATH)/ALT_FULL_msx_32k.prg \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-DLESS_TEXT \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/msx/msx_redefined_chars_init_graphics.c\t\\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_msx_32k.prg \r\n\r\n\r\n#############################\r\n# MTX\r\nmtx_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) -startup=2 $(INCLUDE_OPTS) \\\r\n\t-D__MTX__ -clib=ansi -pragma-define:ansicolumns=32 -create-app -o ALT_FULL_mtx_no_gfx.bin \\\r\n\t     \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm ALT_FULL_mtx_no_gfx\r\n\trm ALT_FULL_mtx_no_gfx.bin\r\n\tmv ALT_FULL_mtx_no_gfx.wav $(BUILD_PATH)/\r\n\r\n\r\n\r\n# it may work\r\nmtx_16k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) -startup=2 $(INCLUDE_OPTS) -D__MTX__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 -vn -D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -lndos -create-app -o ALT_LIGHT_mtx_no_gfx.bin \\\r\n\t$(LIGHT_FILES)\r\n\trm ALT_LIGHT_mtx_no_gfx\r\n\trm ALT_LIGHT_mtx_no_gfx.bin\r\n\tmv ALT_LIGHT_mtx_no_gfx.wav $(BUILD_PATH)\r\n\r\n\r\n#############################\r\n# MULTI\r\nmulti8_light_udg: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +multi8 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MULTI8__ \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(LIGHT_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/ALT_LIGHT_multi8.bin\r\n\trm $(BUILD_PATH)/ALT_LIGHT_multi8.bin\r\n\r\n\r\nmulti8_tiny_udg: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +multi8 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MULTI8__ \\\r\n\t-DTINY_GAME -DNO_WALL  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t \\\r\n\t \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/ALT_TINY_multi8.bin\r\n\trm $(BUILD_PATH)/ALT_TINY_multi8.bin\r\n\r\n\r\n#############################\r\n# NASCOM\r\nnascom_32k_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nascom $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi -vn -lndos \\\r\n\t-D__NASCOM__ \\\r\n\t-DTURN_BASED \\\r\n\t \\\r\n\t \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/ALT_FULL_nascom_32k_turn_based.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_nascom_32k_turn_based.prg\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_o-z",
    "content": "# -----------------------------------------------\r\n# Z88DK\r\n\r\nz88dk_alt_targets_o-z: \\\r\n    oz_alt_targets \\\r\n    pc6001_alt_targets \\\r\n    pps_alt_targets \\\r\n    pv1000_alt_targets \\\r\n    px4_alt_targets \\\r\n    px8_alt_targets \\\r\n    ti82_alt_targets \\\r\n    ti83_alt_targets \\\r\n    ti85_alt_targets \\\r\n    ti86_alt_targets \\\r\n    trs80_alt_targets \\\r\n    ts2068_alt_targets \\\r\n    vz200_alt_targets \\\r\n    z88_alt_targets \\\r\n    z9001_alt_targets \\\r\n\r\n#############################\r\n\r\n\r\noz_alt_targets: \\\r\n    oz_tiny\r\n\r\npc6001_alt_targets: \\\r\n    pc6001_32k_no_gfx\r\n\r\npps_alt_targets: \\\r\n    pps_turn_based\r\n\r\npv1000_alt_targets: \\\r\n    pv1000_light\r\n\r\npx4_alt_targets: \\\r\n    px4_chars\r\n\r\npx8_alt_targets: \\\r\n    px8_chars \\\r\n    px8_chars_ansi\r\n\r\nti82_alt_targets: \\\r\n    ti82_chars \r\n\r\nti83_alt_targets: \\\r\n    ti83_chars \\\r\n    ti83_turn_based\r\n\r\nti85_alt_targets: \\\r\n    ti85_chars \\\r\n    ti85_turn_based\r\n\r\nti86_alt_targets: \\\r\n    ti86_full\r\n\r\ntrs80_alt_targets: \\\r\n    trs80_chars_cas \\\r\n    trs80_tiny_cas \\\r\n    trs80_wav\r\n\r\nts2068_alt_targets: \\\r\n    ts2068_turn_based\r\n\r\nvz200_alt_targets: \\\r\n    vz200_24k\r\n\r\nz88_alt_targets: \\\r\n    z88_tiny \\\r\n    z88_tiny_buffered\r\n\r\nz9001_alt_targets: \\\r\n    z9001_16k\r\n\r\n\r\n#############################\r\n# OZ\r\noz_tiny:  $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +oz $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__OZ__ \\\r\n\t-DTINY_GAME -DNO_WALL \\\r\n\t-vn -lndos \\\r\n\t-DXSize=59 \\\r\n\t-DYSize=9 \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__ALT_MOVE \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__ALT_PRINT \\\r\n\t-o ozt.bin \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\t$(TOOLS_PATH)/z88dk/oz/makewzd.exe ozt\r\n\trm ozt.bin\r\n\tmv ozt.wzd $(BUILD_PATH)/ALT_TINY_oz.wzd\r\n\r\n\r\n#############################\r\n# PC6001\r\npc6001_32k_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc6001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -Cz--audio -clib=ansi -subtype=32k \\\r\n\t-D__PC6001__ \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/ALT_FULL_pc6001_32k_no_gfx.prg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_pc6001_32k_no_gfx.prg\r\n\trm $(BUILD_PATH)/ALT_FULL_pc6001_32k_no_gfx.wav\r\n\tmv $(BUILD_PATH)/ALT_FULL_pc6001_32k_no_gfx.cas $(BUILD_PATH)/ALT_FULL_pc6001_32k_no_gfx.cp6\r\n\r\n\r\n#############################\r\n# PPS\r\npps_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pps $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__PPS__ -vn \\\r\n\t-D__VT52 \\\r\n\t-DTURN_BASED \\\r\n\t  \\\r\n\t  \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-o ppstb.bin \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\tmv ppstb.bin $(BUILD_PATH)/ALT_FULL_pps_turn_based.exe\r\n\r\n\r\n#############################\r\n# PV1000\r\n# UDG can be done but differently\r\npv1000_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pv1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PV1000__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t$(LIGHT_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/ALT_LIGHT_pv1000.bin\r\n\trm $(BUILD_PATH)/ALT_LIGHT_pv1000.bin\r\n\trm $(BUILD_PATH)/ALT_LIGHT_pv1000_DATA.bin\r\n\trm $(BUILD_PATH)/ALT_LIGHT_pv1000_BSS.bin\r\n\r\n\r\n#############################\r\n# PX4\r\npx4_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lpx4 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX4__ \\\r\n\t-D__ADM3A_WITH_UNDEF \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-create-app  -o px4ch.bin \\\r\n\t$(FULL_FILES)\r\n\trm px4ch.bin\r\n\tmv PX4CH.COM $(BUILD_PATH)/ALT_FULL_px4.ROM\t\r\n\r\n\r\n#############################\r\n# PX8\r\npx8_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=px8 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX8__ \\\r\n\t-D__ADM3A_WITH_UNDEF \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-create-app  -o px8ch.bin \\\r\n\t$(FULL_FILES)\r\n\trm px8ch.bin\r\n\tmv PX8CH.ROM $(BUILD_PATH)/ALT_FULL_px8_chars.ROM\r\n\r\n\r\npx8_chars_ansi:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -subtype=px8ansi \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__PX8__ \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t-create-app  -o px8cha.bin \\\r\n\t$(FULL_FILES)\r\n\trm px8cha.bin\r\n\tmv PX8CHA.ROM $(BUILD_PATH)/ALT_FULL_px8_chars.ROM\t\r\n\r\n\r\n#############################\r\n# TI82\r\nti82_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti82 $(SCCZ80_OPTS) \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t$(INCLUDE_OPTS) -D__TI82__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t  \\\r\n\t-DLESS_TEXT -DSIMPLE_STRATEGY -DNO_HINTS  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app  -o ti82ch.bin \\\r\n\t$(FULL_FILES)\r\n\tmv ti82ch.82p $(BUILD_PATH)/ALT_FULL_ti82_chars.82p\r\n\trm ti82ch.bin\r\n\r\n\r\n#############################\r\n# TI83\r\nti83_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti83 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -D__TI83__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DXSize=32 \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t  \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -oxchasetc \\\r\n\t$(FULL_FILES)\r\n\tmv xchasetc.83p $(BUILD_PATH)/ALT_FULL_ti83_chars.83p\t\r\n\trm xchasetc\r\n\r\n\r\nti83_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti83 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -D__TI83__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t  \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_WAIT \\\r\n\t-DLESS_TEXT -DNO_HINTS  -D_XL_NO_COLOR \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -oxchasett\r\n\tmv xchasett.83p $(BUILD_PATH)/ALT_FULL_ti83_turn_based.83p\r\n\trm xchasett\r\n\r\n\r\n#############################\r\n# TI85\r\nti85_chars:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti85 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) -D__TI85__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DXSize=32 \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t  \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o ti85ch \\\r\n\t$(FULL_FILES)\r\n\tmv ti85ch.85s $(BUILD_PATH)/ALT_FULL_ti85_chars.85s\r\n\trm ti85ch\r\n\r\n\r\nti85_turn_based:  $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti85 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI85__ \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-create-app -o ti85tb \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\tmv ti85tb.85s $(BUILD_PATH)/ALT_FULL_ti85_turn_based.85s\r\n\trm ti85tb\r\n\r\n\r\n#############################\r\n# TI86\r\nti86_full:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti86 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__TI86__ \\\r\n\t \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DLESS_TEXT\t\\\r\n\t-D_XL_NO_COLOR \\\r\n\t \\\r\n\t-DNO_HINTS \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app  -o ti86fu \\\r\n\t$(FULL_FILES)\r\n\tmv ti86fu.86p $(BUILD_PATH)/ALT_FULL_ti86.86p\t\r\n\trm ti86fu\r\n\r\n\r\n#############################\r\n# TRS80\r\ntrs80_chars_cas:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-pragma-define:REGISTER_SP=0xffb5 \\\r\n\t-lm -create-app \\\r\n\t-D__TRS80__ \\\r\n\t   \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-o$(BUILD_PATH)/ALT_FULL_trs80_chars.bin \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_trs80_chars.bin\r\n\r\n\r\ntrs80_tiny_cas:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-lm -create-app \\\r\n\t-D__TRS80__ \\\r\n\t-D__VT52 \\\r\n\t-DTINY_GAME -DNO_WALL -DLESS_TEXT -D_XL_NO_SLEEP \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-o$(BUILD_PATH)/ALT_TINY_trs80.bin \\\r\n\t$(TINY_FILES)\r\n\trm $(BUILD_PATH)/ALT_TINY_trs80.bin\r\n\r\n\r\ntrs80_wav:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos -subtype=wav \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-pragma-define:REGISTER_SP=0xffb5 \\\r\n\t-lm -create-app \\\r\n\t-D__TRS80__ \\\r\n\t   \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-o$(BUILD_PATH)/ALT_FULL_trs80.bin \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_trs80.bin\t\r\n\r\n\r\n#############################\r\n# TS2068\r\nts2068_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ts2068 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=ansi \\\r\n\t-DTURN_BASED \\\r\n\t-D__TS2068__ \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-vn \\\r\n\t \\\r\n\t-lndos \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/ALT_FULL_ts2068_turn_based.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_ts2068_turn_based.bin\r\n\trm $(BUILD_PATH)/ALT_FULL_ts2068_turn_based_BANK_7.bin\r\n\r\n\r\n#############################\r\n# VZ200\r\nvz200_24k: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn \\\r\n\t -D__VZ__    \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi -lndos -create-app -o  $(BUILD_PATH)/ALT_FULL_vz200_24k.vz \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_vz200_24k.cas\r\n\r\n\r\n#############################\r\n# Z88\r\nz88_tiny: $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z88 $(SCCZ80_OPTS) -subtype=app \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__Z88__ \\\r\n\t-DTINY_GAME -DNO_WALL \\\r\n\t-vn -lndos \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-D__NO_WAIT -DBAD_PAGES=1 \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DBOMBS_NUMBER=2 \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/z88/z88_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o z88tiny.bin\r\n\trm -rf z88tiny_bss_fardata.bin\r\n\trm z88tiny.bin\r\n\trm z88tiny_BSS.bin\r\n\trm z88tiny_DATA.bin\r\n\tmv z88tiny.63 $(BUILD_PATH)/ALT_TINY_z88.63\r\n\tmv z88tiny.epr $(BUILD_PATH)/ALT_TINY_z88.epr\r\n\r\n\r\n# it fails with sdcc\r\nz88_tiny_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z88 $(SCCZ80_OPTS) -subtype=app \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-D__Z88__ \\\r\n\t-DTINY_GAME -DNO_WALL \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=6 \\\r\n\t \\\r\n\t-vn -lndos \\\r\n\t-D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/z88/z88_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o z88tinyt.bin\r\n\trm z88tinyt.bin\r\n\trm z88tinyt_BSS.bin\r\n\trm z88tinyt_DATA.bin\r\n\trm -rf z88tinyt_bss_fardata.bin\r\n\tmv z88tinyt.63 $(BUILD_PATH)/ALT_TINY_z88_buffered.63\r\n\tmv z88tinyt.epr $(BUILD_PATH)/ALT_TINY_z88_buffered.epr\r\n\r\n\r\n#############################\r\n# Z9001\r\nz9001_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z9001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi \\\r\n\t-D__Z9001__ -vn   \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/ALT_LIGHT_z9001.z80 \\\r\n\t$(LIGHT_FILES)\r\n\trm $(BUILD_PATH)/ALT_LIGHT_z9001.z80\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_qaopm",
    "content": "# ------------------------------------------------------------------------------------------\r\n# Z88DK QAOPM\r\n#\r\n\r\nz88dk_alt_targets_qaopm: \\\r\n    zx80_alt_targets_qaopm \\\r\n    zx81_alt_targets_qaopm\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\nzx80_alt_targets_qaopm: \\\r\n    zx80_16k_turn_based_qaopm\r\n\r\nzx81_alt_targets_qaopm: \\\r\n    zx81_16k_qaopm \\\r\n    zx81_16k_turn_based_qaopm \\\r\n    zx81_16k_wrx_qaopm \\\r\n    zx81_32k_wrx_qaopm \\\r\n    zx81_32k_wrx_turn_based_qaopm\r\n\r\n\r\n\r\n###################################################################\r\n# ZX80 QAOPM\r\n\r\nzx80_16k_turn_based_qaopm:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn \\\r\n\t-D__ZX80__  \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_FULL_zx80_16k_turn_based_qaopm.prg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_zx80_16k_turn_based_qaopm.prg\r\n\r\n\r\n###################################################################\r\n# ZX81 QAOPM\r\n\r\nzx81_16k_turn_based_qaopm:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t\\\r\n\t-D__ZX81__  \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_FULL_zx81_16k_turn_based_qaopm.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_zx81_16k_turn_based_qaopm.prg\r\n\r\n\r\nzx81_16k_qaopm:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t--opt-code-size \\\r\n\t-vn \\\r\n\t-D__ZX81__  \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DQAOPM \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_FULL_zx81_16k_qaopm.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_zx81_16k_qaopm.prg\r\n\r\n\r\nzx81_16k_wrx_qaopm:  $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\r\n\t$(INCLUDE_OPTS) -O3  \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-DXSize=36 \\\r\n\t-DYSize=35 \\\r\n\t-vn \\\r\n\t-D__ZX81__ \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DQAOPM \\\r\n\t-lndos \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-DFEWER_SPRITES \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_LIGHT_zx81_16k_wrx_qaopm.prg \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm $(BUILD_PATH)/ALT_LIGHT_zx81_16k_wrx_qaopm.prg\r\n\r\n\r\nzx81_32k_wrx_qaopm:  $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\r\n\t$(INCLUDE_OPTS) -O3  \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\r\n\t-pragma-define:hrgpage=36096 \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t \\\r\n\t-DXSize=36 \\\r\n\t-DYSize=35 \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DQAOPM \\\r\n\t-vn \\\r\n\t-D__ZX81__ \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-lndos \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-DFEWER_SPRITES \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_FULL_zx81_32k_wrx_qaopm.prg \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm $(BUILD_PATH)/ALT_FULL_zx81_32k_wrx_qaopm.prg\r\n\r\n\r\nzx81_32k_wrx_turn_based_qaopm:  $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\r\n\t$(INCLUDE_OPTS) -O3 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\r\n\t-pragma-define:hrgpage=36096 \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DQAOPM \\\r\n\t-DGHOSTS_NUMBER=9 \\\r\n\t-DTURN_BASED \\\r\n\t-DXSize=36 \\\r\n\t-DYSize=35 \\\r\n\t-vn \\\r\n\t-D__ZX81__ \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-lndos \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-DFEWER_SPRITES \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_FULL_zx81_32k_wrx_turn_based_qaopm.prg \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm $(BUILD_PATH)/ALT_FULL_zx81_32k_wrx_turn_based_qaopm.prg\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/alt/z88dk_alternative_builds/Makefile.z88dk_alternative_builds_zsdcc",
    "content": "\r\n# ------------------------------------------------------------------------------------------\r\n# Z88DK ALT ZSDCC\r\n#\r\n\r\nz88dk_alt_targets_zsdcc: \\\r\n    zx81_alt_targets\r\n\r\n# ------------------------------------------------------------------------------------------\r\n\r\n\r\nzx81_alt_targets: \\\r\n    zx81_light \\\r\n    zx81_8k \\\r\n    zx81_16k_turn_based \\\r\n    zx81_16k_wrx \\\r\n    zx81_32k_wrx \\\r\n\r\n\r\n###################################################################\r\n# ZX81\r\n\r\nzx81_16k_wrx:  $(ASSETS_PATH)/z88dk_sprites_definitions.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \\\r\n\t-D__ALT_MODE \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-DXSize=36 \\\r\n\t-DYSize=35 \\\r\n\t-vn \\\r\n\t-D__ZX81__ \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_PRINT \\\r\n\t-lndos \\\r\n\t \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__ALT_PRINT \\\r\n\t-DFEWER_SPRITES \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_LIGHT_zx81_16k_wrx.prg \\\r\n\t$(LIGHT_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c\r\n\trm $(BUILD_PATH)/ALT_LIGHT_zx81_16k_wrx.prg\r\n\r\n\r\nzx81_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-vn \\\r\n\t-D__ZX81__ -DLIGHT_GAME \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_LIGHT_zx81_8k.prg \\\r\n\t$(LIGHT_FILES)\r\n\trm $(BUILD_PATH)/ALT_LIGHT_zx81_8k.prg\r\n\r\n\r\nzx81_8k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-vn \\\r\n\t-D__ZX81__ -DTINY_GAME -DROUND_ENEMIES \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__ALT_SLEEP \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_TINY_zx81_8k.prg \\\r\n\t$(TINY_FILES)\r\n\trm $(BUILD_PATH)/ALT_TINY_zx81_8k.prg\r\n\r\n\r\n# ZX81_IJKL EXTRA\r\n\r\nzx81_16k_turn_based:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 $(ZSDCC_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t\\\r\n\t-D__ZX81__  \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/ALT_FULL_zx81_16k_turn_based.prg \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/ALT_FULL_zx81_16k_turn_based.prg\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/bench/Makefile.cc65_bench",
    "content": "c64_bench: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c64 \\\r\n\t-DBENCHMARK -DBENCHMARK_MAX=40 \\\r\n\t  \\\r\n\t--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg  \\\r\n\t-DCBM_SCREEN_CODES \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/udc.s \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES) \\\r\n\t-o $(BUILD_PATH)/FULL_c64.prg\r\n\t$(TOOLS_PATH)/generic/exomizer sfx basic $(BUILD_PATH)/FULL_c64.prg -o $(BUILD_PATH)/FULL_c64_exomized.prg\r\n\tpython $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/FULL_c64_exomized.prg  $(BUILD_PATH)/FULL_c64_exomized.crt\r\n\trm $(BUILD_PATH)/FULL_c64.prg"
  },
  {
    "path": "src/makefiles.other/chase/experimental/Makefile.z88dk_experimental_targets",
    "content": "# -----------------------------------------------------------------------\r\n# EXPERIMENTAL\r\n# Targets which are either impossible to test or that are known to be broken because of bugs in their respective dev-kit\r\n\r\nDEBUG_MACROS ?= \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D__STDIO \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_WAIT \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_PRINT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DNO_CHASE \\\r\n\t-DTINY_GAME \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \r\n\r\n\r\n# # No full support in Z88DK / Untestable\r\nabc800_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -zorg=40000 \\\r\n\t-D__ABC800__ \\\r\n\t-D__ADM3A \\\r\n\t-DTINY_GAME -DLESS_TEXT -D_XL_NO_SLEEP \\\r\n\t-o$(BUILD_PATH)/TINY_abc800.bin \\\r\n\t$(SOURCE_PATH)/display_macros.c \\\r\n\t$(SOURCE_PATH)/enemy.c \\\r\n\t$(SOURCE_PATH)/level.c $(SOURCE_PATH)/character.c $(SOURCE_PATH)/game_text.c  \\\r\n\t$(SOURCE_PATH)/strategy.c $(SOURCE_PATH)/input_macros.c \\\r\n\t$(SOURCE_PATH)/main.c\r\n\r\n\r\n# No full support in Z88DK / Untestable\r\nabc800_light:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -lm \\\r\n\t-zorg=49200 $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-D__VT100 \\\r\n\t-D__NO_WAIT \\\r\n\t-D__ABC80__ -vn  -lndos  \\\r\n\t$(LIGHT_FILES)\r\n\t$(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) -800 a.bin $(BUILD_PATH)/LIGHT_ABC800.bac 49200\t\r\n\tmv a.bin $(BUILD_PATH)/LIGHT_abc800.bin \r\n\r\n\r\n# No full support in Z88DK / Untestable\r\nhello_abc800:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t-lndos -create-app \\\r\n\t./test/helloworld_getchar.c\r\n\t$(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) a.bin $(BUILD_PATH)/hello.bac 49200\r\n\t$(TOOLS_PATH)/z88dk/abc80/dosgen$(COMPILEDEXT) $(BUILD_PATH)/HELLO_abc800.dsk \r\n\t$(TOOLS_PATH)/z88dk/abc80/doscopy$(COMPILEDEXT) $(BUILD_PATH)/HELLO_abc800.dsk -b $(BUILD_PATH)/hello.bac\r\n    \r\n\r\n# hello_mtx512:\r\n\t# $(Z88DK_PATH)$(MYZ88DK) +mtx -clib=ansi -startup=2 $(SCCZ80_OPTS)  \\\r\n\t# -lndos -create-app \\\r\n\t# ./test/helloworld_getchar.c\r\n\t# mv a $(BUILD_PATH)\r\n\t# mv a.wav $(BUILD_PATH)\r\n\t# rm a.bin\r\n# zcc +mtx world.c -startup=2 -create-app\r\n\r\nhello_mtx512:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx -startup=2 $(SCCZ80_OPTS)  \\\r\n\t./test/helloworld.c \\\r\n\t-create-app\r\n\tmv a $(BUILD_PATH)\r\n\tmv a.wav $(BUILD_PATH)\r\n\trm a.bin\r\n\tcp $(BUILD_PATH)/a /cygdrive/c/Emulation/TEST/memu/tapes/HELLO512.MTX\r\n\tcp $(BUILD_PATH)/a /cygdrive/c/Emulation/TEST/mess0118b/A\r\n\r\nhello_mtx500:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS)  \\\r\n\t./test/helloworld.c \\\r\n\t-create-app\r\n\tmv a $(BUILD_PATH)\r\n\tmv a.wav $(BUILD_PATH)\r\n\trm a.bin\r\n\tcp $(BUILD_PATH)/a /cygdrive/c/Emulation/TEST/memu/tapes/HELLO500.MTX\r\n\tcp $(BUILD_PATH)/a /cygdrive/c/Emulation/TEST/mess0118b/A\r\n\r\n\r\nabc800_conio:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -lm -subtype=hex -zorg=49200 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__ABC800__  -vn  \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t \\\r\n\t-DNO_HINTS \\\r\n\t-D__NO_WAIT \\\r\n\t-DNO_BORDER \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-DFLAT_ENEMIES \\\r\n\t-lndos -create-app \\\r\n\t$(FULL_FILES)\r\n\t$(TOOLS_PATH)/z88dk/abc80/bin2bac2$(COMPILEDEXT) a.bin $(BUILD_PATH)/xchase.bac 49200\r\n\t$(TOOLS_PATH)/z88dk/abc80/dosgen$(COMPILEDEXT) $(BUILD_PATH)/FULL_$@.dsk \r\n\t$(TOOLS_PATH)/z88dk/abc80/doscopy$(COMPILEDEXT) $(BUILD_PATH)/FULL_$@.dsk -b $(BUILD_PATH)/xchase.bac\r\n\trm a.bin \r\n\trm $(BUILD_PATH)/xchase.bac\r\n\tmv a.ihx $(BUILD_PATH)/FULL_$@.ihx \t\r\n\r\n\r\n# No full support in Z88DK / Untestable\r\nabc800_32k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc800 $(SCCZ80_OPTS) -lm  $(INCLUDE_OPTS) \\\r\n\t-D__ABC80__ -vn \\\r\n\t-D__CONIO_GRAPHICS -D__INCLUDE_CONIO_H -D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\r\n\r\n# No resl support in CC65\r\natari2600_graphics_test:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari2600 \\\r\n\t-D__ATARI2600__ \\\r\n\t$(DEBUG_MACROS) \\\r\n\t-DTINY_GAME \\\r\n\t$(SOURCE_PATH)/../test/atari2600_graphics_test.c \\\r\n\t-o $(BUILD_PATH)/atari2600_graphics_test.rom\t\r\n\r\n# No resl support in CC65\r\natari2600_tiny:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t atari2600 \\\r\n\t-D__ATARI2600__ \\\r\n\t$(DEBUG_MACROS) \\\r\n\t-DTINY_GAME \\\r\n\t$(TINY_FILES) \\\r\n\t-o $(BUILD_PATH)/TINY_atari2600.rom\r\n\r\n\r\n# Z88DK target is broken\r\nc7420:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c7420 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-create-app \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(FULL_FILES)\r\n\trm a.bin\r\n\tmv _a.bas $(BUILD_PATH)/FULL_c7420.bas\t\r\n\r\n\r\n# Z88DK target is broken\r\nc7420_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c7420 $(SCCZ80_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__BUFFERED_GRAPHICS -D__ALT_PRINT \\\r\n\t-DTINY_GAME -DLESS_TEXT -D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-create-app \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TINY_FILES)\r\n\trm a.bin\r\n\tmv _a.bas $(BUILD_PATH)/TINY_c7420.bas\r\n\r\n\r\n# Z88DK target is broken\r\nm100:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__M100__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=24 \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app -o$(BUILD_PATH)/FULL_m100.bin\r\n\trm $(BUILD_PATH)/FULL_m100.bin\r\n\r\n\r\n# No emulator exixts\r\nrex:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +rex -O0 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__REX__ \\\r\n\t-DTURN_BASED \\\r\n\t-v \\\r\n\t-D__REX_GRAPHICS \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-lndos \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__NO_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/rex/rex_init_graphics.c \\\r\n\t-create-app -o $(BUILD_PATH)/FULL_rex.bin\r\n\trm $(BUILD_PATH)/FULL_rex_BSS.bin\r\n\trm $(BUILD_PATH)/FULL_rex.bin\r\n\r\n\r\n# 'fputc_callee' not defined\r\nrex_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +rex $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__REX__ \\\r\n\t-DTURN_BASED \\\r\n\t-vn \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__STDIO \\\r\n\t-D_XL_NO_COLOR \\\r\n\t  \\\r\n\t-lndos \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/rex/rex_init_graphics.c \\\r\n\t-create-app -o $(BUILD_PATH)/FULL_rex_buffered.bin\r\n\trm $(BUILD_PATH)/FULL_rex_buffered_BSS.bin\r\n\trm $(BUILD_PATH)/FULL_rex_buffered.bin\r\n\r\n\r\n\r\n# Z88DK target is broken\r\nx07: x07_tiny\r\n\r\nx07_tiny:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x07 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-Cz--audio \\\r\n\t-DBOMBS_NUMBER=2 \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-DNO_CONTROL_INSTRUCTIONS \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-D__X07__ \\\r\n\t-vn \\\r\n\t-D__VT52 \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DTINY_GAME \\\r\n\t-lndos \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(TINY_FILES) \\\r\n\t-create-app -o $(BUILD_PATH)/TINY_x07.bin\r\n\trm $(BUILD_PATH)/TINY_x07.bin\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/tests/Makefile.tests",
    "content": "#########################################################\r\n# (FAST) SIMPLE TESTS\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_compilers\r\n\r\ninclude ./games/chase/Makefile.chase\r\n\r\n\r\n#######################################################\r\n# (LONG) TESTS\r\n# Compilers and Dev-kits covered:\r\n# - gcc\r\n\r\n# TODO: gcc_buffered no longer available\r\nsimple_test: gcc_buffered\r\n\r\n\r\ntest_stdio_extra: gcc_full_tests\r\n\r\n#######################################################\r\n# TESTS EXCLUDING Z88DK\r\n# Compilers and Dev-kits covered:\r\n# - gcc\r\n# - cmoc\r\n# - cc65\r\n# - ack\r\n# - gcc_amiga\r\n# - gcc_atari_st\r\n# - xtc68\r\n# - lcc1802\r\n\r\nno_z88dk_test: \\\r\n    gcc_full_tests \\\r\n    cc65_full_tests \\\r\n    cmoc_full_tests \\\r\n    ack_full_tests \\\r\n    lcc1802_full_tests \\\r\n    mod_gcc_full_tests \\\r\n    xtc68_full_tests \r\n\r\n    \r\n\r\nmod_gcc_full_tests: \\\r\n    gcc_amiga_extra \\\r\n    gcc_atari_st_extra \\\r\n\r\ntest_xtc68_extra: \\\r\n    xtc68_extra\r\n\r\n\r\ntest_cmoc_extra: \\\r\n    coco \\\r\n    coco3 \\\r\n    mo5\r\n\r\n# to fix\r\n#     oric_extra \r\n#     gamate_extra \r\ntest_cc65_extra: \\\r\n    vic20 \\\r\n    supervision \\\r\n    atari \\\r\n    atari_lynx \\\r\n    creativision \\\r\n    pet \\\r\n    c64 \\\r\n    oric\r\n\r\ntest_ack_extra: \\\r\n    pc8086_extra \\\r\n    cpm_8080_adm3a \r\n    \r\ntest_ncurses_extra: \\\r\n\tncurses\r\n\r\ngcc_full_tests: \\\r\n    ncurses\r\n\r\ntest_lcc1802_extra: \\\r\n    comx\r\n\r\n\r\n\r\n#######################################################\r\n# (LONG) TESTS\r\n# Compilers and Dev-kits covered:\r\n# - gcc\r\n# - cmoc\r\n# - cc65\r\n# - ack\r\n# - gcc_amiga\r\n# - gcc_atari_st\r\n# - xtc68\r\n# - lcc1802\r\n# - z88dk \r\n\r\n.PHONY: test z88dk_test\r\n\r\n\r\n    # gal_6k \r\n    # msx_32k_rom \r\n    # spectrum_48k \r\n    # zx81_32k_wrx_turn_based \r\n\r\n#     tiki100 \r\ntest_z88dk_extra: \\\r\n    c128_z80_80col \\\r\n    cpm_z80_adm3a \\\r\n    spectrum_48k \\\r\n    msx \\\r\n    zx81_32k_wrx \r\n\r\ntest:\r\n\tmake z88dk_test\r\n\tmake no_z88dk_test \r\n\r\n\r\n\r\n\r\n\r\n\r\n####################################################################################################################\r\n# Z88DK Compilation Tests with several minimal versions of the game\r\n# \r\n# include makefiles.other/chase/tests/Makefile.z88dk_quick_tests\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/tests/Makefile.z88dk_quick_tests",
    "content": "####################################################################################################################\r\n\r\n# TESTS\r\n\r\n\r\n\r\nFAST_TEST_OPTS ?= \\\r\n-D_DEFAULT_ASCII \\\r\n-DTINY_GAME -DLESS_TEXT -D_XL_NO_SLEEP \\\r\n-DNO_CHASE -DNO_GAME_COMPLETED \\\r\n-DNO_INITIAL_SCREEN -D__NO_SCREEN_COLOR_INIT \\\r\n-DNO_DEAD_GHOSTS \\\r\n-DNO_RANDOM_LEVEL -DFLAT_ENEMIES -DGHOSTS_NUMBER=8 \\\r\n-DNO_STATS -DNO_WALL\r\n\r\nFAST_SCCZ80_TEST_OPTS ?= -O0 $(FAST_TEST_OPTS)\r\n\r\nFAST_ZSDCC_TEST_OPTS ?= -SO0 $(FAST_TEST_OPTS)\r\n\r\n# include makefiles.common/auxiliary/Makefile_ALL\r\n\r\nNO_CHASE_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n\t$(SOURCE_PATH)/split_files/move_player.c \\\r\n\t$(SOURCE_PATH)/split_files/ghost.c  $(SOURCE_PATH)/split_files/level.c $(SOURCE_PATH)/split_files/character.c $(SOURCE_PATH)/split_files/game_text.c \\\r\n\t$(SOURCE_PATH)/split_files/main.c \\\r\n\t$(SOURCE_PATH)/split_files/init_images.c\r\n\r\n#\r\nTINY_FILES ?= $(NO_CHASE_FILES) $(SOURCE_PATH)/strategy.c\r\n\r\n#\r\nTEST_FILES ?= $(NO_CHASE_FILES)\r\n\r\ninclude ./games/chase/Makefile.chase\r\n\r\n# include Makefile\r\n\r\n####################################################################################################################\r\n# TODO: Fix\r\n# \tc128_z80_zsdcc_quick_test\r\n# \taquarius_zsdcc_quick_test \r\nzsdcc_quick_test: \\\r\n\tmc1000_zsdcc_quick_test \\\r\n\tspectrum_zsdcc_quick_test \\\r\n\tsvi_zsdcc_quick_test \\\r\n\tvz200_zsdcc_quick_test \\\r\n\tvg5k_zsdcc_quick_test \\\r\n\tzx81_zsdcc_quick_test \r\n\r\n# TODO: Fix\r\n# \tc128_z80_quick_test \r\n#\tmsx_quick_test \r\n#   \tnc100_quick_test \r\n# \tcpm_quick_test \r\n# \tx1_quick_test \r\n# \tcpc_quick_test (Unix)\r\n\r\n\r\n\r\n\r\nsccz80_quick_test: \\\r\n\tabc80_quick_test \\\r\n\tace_quick_test \\\r\n\taquarius_quick_test \\\r\n \teg2k_quick_test \\\r\n\teinstein_quick_test \\\r\n\tgal_quick_test \\\r\n\tkc_quick_test \\\r\n\tlambda_quick_test \\\r\n\tm5_quick_test \\\r\n\tmc1000_quick_test \\\r\n\tmicrobee_quick_test \\\r\n\tmtx_quick_test \\\r\n\tmz_quick_test \\\r\n\tnascom_quick_test \\\r\n\tp2000_quick_test \\\r\n\tpc6001_quick_test \\\r\n\tpps_quick_test \\\r\n\tpv2000_quick_test \\\r\n\tpx4_quick_test \\\r\n\tpx8_quick_test \\\r\n\tsamcoupe_quick_test \\\r\n\tsc3000_quick_test \\\r\n\tsg1000_quick_test \\\r\n\tspectrum_quick_test \\\r\n\tsrr_quick_test \\\r\n\tsvi_quick_test \\\r\n\tti82_quick_test \\\r\n\tti83_quick_test \\\r\n\tti85_quick_test \\\r\n\ttrs80_quick_test \\\r\n\tvg5k_quick_test \\\r\n\tvz200_quick_test \\\r\n\tz1013_quick_test \\\r\n\tz9001_quick_test \\\r\n\tzx80_quick_test \\\r\n\tzx81_quick_test \r\n\r\n\r\n# \tzsdcc_quick_test\t\r\n\r\nz88dk_quick_test: \\\r\n\tsccz80_quick_test\r\n\t\r\n\r\n####################################################################################################################\r\n\r\n\r\nabc80_quick_test: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +abc80 -lm -subtype=hex -zorg=49200 \\\r\n\t-D__ABC80__ -clib=ansi -vn   -lndos \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o abc80t.bin \\\r\n\t-lndos \\\r\n\t$(TEST_FILES)\r\n\trm -rf abc80t.bin\r\n\tmv abc80t.ihx $(BUILD_PATH)/TEST_abc80.ihx \t\r\n\r\n\r\nace_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ace \\\r\n\t-D__ACE__ \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-clib=default -o acet.bin \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-Cz--audio -create-app \\\r\n\t$(TEST_FILES)\r\n\tcp acet.wav $(BUILD_PATH)/TEST_ace_exp_16k.wav\r\n\trm acet.wav\r\n\trm acet.tap\r\n\trm acet.bin\r\n\r\n\r\naquarius_quick_test: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius -clib=ansi -vn \\\r\n\t -D__AQUARIUS__  -DTINY_GAME \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lndos \\\r\n\t-o TEST_aquarius -create-app \\\r\n\t$(TEST_FILES)\r\n\trm TEST_aquarius\r\n\tmv TEST_aquarius.caq $(BUILD_PATH)\r\n\tmv _TEST_aquarius.caq $(BUILD_PATH)\t\r\n\r\n\r\nc128_z80_quick_test:\t\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 \\\r\n\t-lndos -subtype=disk \\\r\n\t-D__C128_Z80__ -DXSize=40 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(TEST_FILES) \\\r\n\t-create-app -o c128t.bin\r\n\t$(TOOLS_PATH)/generic/c1541 -format \"crosschase,0\" d64 TEST_c128_z80.d64\r\n\t$(TOOLS_PATH)/generic/c1541 -attach TEST_c128_z80.d64 -write c128t.ldr\r\n\t$(TOOLS_PATH)/generic/c1541 -attach TEST_c128_z80.d64 -write c128t\r\n\tmv TEST_c128_z80.d64 $(BUILD_PATH)/\r\n\trm C128T.LDR\r\n\trm C128T\r\n\trm c128t.bin\r\n\r\n\r\ncpc_quick_test: $(ASSETS_PATH)/z88dk_cpc_Chars8.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc  -vn  -clib=ansi \\\r\n\t-D__CPC__  \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CPCRSLIB_GRAPHICS \\\r\n\t-pragma-define:REGISTER_SP=-1 \\\r\n\t-lndos -create-app -o \t$(BUILD_PATH)/TEST_cpc.prg \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/cpc/cpc_cpcrslib_init_graphics.c \\\r\n\t$(TEST_FILES) $(ASSETS_PATH)/z88dk_cpc_Chars8.asm\r\n\t$(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_chase $(BUILD_PATH)/TEST_cpc.cpc  $(BUILD_PATH)/TEST_cpc.cdt\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd TEST_cpc.dsk\r\n\t# $(TOOLS_PATH)/z88dk/cpc/cpcxfsw TEST_cpc.dsk -p $(BUILD_PATH)/TEST_cpc.cpc xchase\r\n\t# mv TEST_cpc.dsk $(BUILD_PATH)/\r\n\trm $(BUILD_PATH)/TEST_cpc.cpc \r\n\trm $(BUILD_PATH)/TEST_cpc.prg\t\r\n\r\n\r\ncpm_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm \\\r\n\t-D__ADM3A \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__CPM_80X24__ \\\r\n\t-D_XL_NO_SLEEP -D__NO_WAIT \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app -o$(BUILD_PATH)/TEST_cpm.bin \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_cpm.bin\r\n\r\n\r\neg2k_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 \\\r\n\t-D__EG2K__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-subtype=eg2000disk \\\r\n\t-lndos \\\r\n\t-lm \\\r\n\t-D__TRS80__ \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app -o eg2kt.bin \\\r\n\t-D__VT52 \\\r\n\t$(TEST_FILES)\r\n\tmv eg2kt.cmd $(BUILD_PATH)/TEST_eg2k.cmd\t\r\n\trm eg2kt.bin\r\n\r\n\r\neinstein_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -leinstein  \\\r\n\t-D__EINSTEIN__ \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=ansi \\\r\n\t-create-app -o$(BUILD_PATH)/TEST_einstein.bin \\\r\n\t$(TEST_FILES) \r\n\trm $(BUILD_PATH)/TEST_einstein.bin\r\n\r\n\r\ngal_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +gal \\\r\n\t-pragma-need=ansiterminal \\\r\n\t-D__GAL__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-vn -lndos -create-app -o  $(BUILD_PATH)/TEST_galaksija.prg \\\r\n\t$(TEST_FILES) \r\n\trm $(BUILD_PATH)/TEST_galaksija.prg\t\r\n\trm $(BUILD_PATH)/TEST_galaksija.wav\r\n\r\n\r\nkc_quick_test: $(ASSETS_PATH)/z88dk_xchase.asm \r\n\t$(Z88DK_PATH)$(MYZ88DK) +kc -subtype=tap \\\r\n\t-D__KC__ \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__NO_WAIT \\\r\n\t \\\r\n\t-create-app -o$(BUILD_PATH)/TEST_kc_sprites.bin \\\r\n\t$(TEST_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \r\n\trm $(BUILD_PATH)/TEST_kc_sprites.bin\t\r\n\r\n\r\nlambda_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +lambda \\\r\n\t-vn -D__LAMBDA__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos -create-app -o  $(BUILD_PATH)/TEST_lambda.prg \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_lambda.prg\t\t\r\n\r\n\r\nm5_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +m5 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-lm -create-app -Cz--audio -subtype=tape \\\r\n\t-D__M5__ \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-o$(BUILD_PATH)/TEST_m5.bin \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_m5.bin \r\n\trm $(BUILD_PATH)/TEST_m5.cas\r\n\r\n\r\nmc1000_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mc1000 \\\r\n\t-subtype=gaming -pragma-define:ansicolumns=32 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi \\\r\n\t-D__MC1000__  \\\r\n\t-vn  -lndos -create-app -Cz--audio -o mc1kt.bin \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(TEST_FILES)\r\n\tmv mc1kt.wav $(BUILD_PATH)/TEST_mc1000.wav\r\n\trm mc1kt.bin\r\n\trm mc1kt.cas\t\r\n\r\n\r\nmicrobee_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +bee \\\r\n\t-D__BEE__ -clib=ansi -vn   \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/TEST_microbee.prg  \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_microbee.prg\r\n\r\n\r\nmsx_quick_test: $(ASSETS_PATH)/8x8_chars.h\r\n\t$(Z88DK_PATH)$(MYZ88DK) +msx -zorg=49200 \\\r\n\t  -create-app -vn -DMSX_VPOKE -D__MSX__ -lndos \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS -D__INCLUDE_CONIO_H \\\r\n\t-DUSE_MSX_BIOS \\\r\n\t \\\r\n\t-vn \\\r\n\t-lndos \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_msx.prg \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/msx/msx_redefined_chars_init_graphics.c \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_msx.prg \t\r\n\r\n\r\nmtx_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mtx -startup=2 \\\r\n\t-D__MTX__ -clib=ansi -pragma-define:ansicolumns=32 -create-app -o TEST_mtx.bin -vn \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t$(TEST_FILES)\r\n\trm TEST_mtx.bin\r\n\tmv TEST_mtx.wav $(BUILD_PATH)/TEST_mtx.wav\r\n\tmv TEST_mtx.mtx $(BUILD_PATH)/TEST_mtx.mtx\r\n\r\n\r\nmz_quick_test:\t\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mz \\\r\n\t-D__MZ__ -clib=ansi -pragma-define:ansicolumns=32 -vn \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/TEST_mz.prg \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_mz.prg\r\n\tmv $(BUILD_PATH)/TEST_mz.mzt $(BUILD_PATH)/TEST_mz.mzf\r\n\r\n\r\nnascom_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nascom -clib=ansi -vn -lndos \\\r\n\t-D__NASCOM__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_nascom.prg \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_nascom.prg\r\n\r\n\r\nnc100_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +nc -lgfxnc100 \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NC100__ \\\r\n\t-D__NO_PRINT  \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS \\\r\n\t-DLESS_TEXT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__NO_WAIT \\\r\n\t \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app -o$(BUILD_PATH)/TEST_nc100.bin \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_nc100.bin\t\r\n\r\n\r\np2000_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +p2000 -clib=ansi -D__P2000__ -vn \\\r\n\t  \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/TEST_p2000.prg \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_p2000.prg\r\n\r\n\r\npc6001_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pc6001 -Cz--audio -clib=ansi -subtype=32k \\\r\n\t-D__PC6001__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/TEST_pc6001_32k.prg \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_pc6001_32k.prg\r\n\trm $(BUILD_PATH)/TEST_pc6001_32k.wav\r\n\tmv $(BUILD_PATH)/TEST_pc6001_32k.cas $(BUILD_PATH)/TEST_pc6001_32k.cp6\t\r\n\r\n\r\npps_quick_test:\t\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pps -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__PPS__ -vn \\\r\n\t-D__VT52 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__NO_WAIT \\\r\n\t-lndos -o ppst.bin \\\r\n\t$(TEST_FILES) \r\n\tmv ppst.bin $(BUILD_PATH)/TEST_pps.exe\t\t\r\n\r\n\r\npv2000_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pv2000 -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SRR__ -vn \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-D__NO_WAIT \\\r\n\t-D__VT52 \\\r\n\t-lndos \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app -o pv2kt.bin \\\r\n\t$(TEST_FILES)\r\n\tmv pv2kt.rom $(BUILD_PATH)/TEST_pv2000.rom\r\n\trm pv2kt.bin\r\n\trm pv2kt_BSS.bin\r\n\trm pv2kt_DATA.bin\r\n\r\n\r\npx4_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -lpx4 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PX4__ \\\r\n\t-subtype=px4 -Cz--32k \\\r\n\t-create-app \\\r\n\t-vn -lndos -o px4.bin \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(TEST_FILES)\r\n\trm px4.bin\r\n\tmv PX4.ROM $(BUILD_PATH)/TEST_px4.ROM\r\n\r\n\r\npx8_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm -subtype=px8 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__PX8__ \\\r\n\t-create-app \\\r\n\t-vn -lndos -o px8.bin \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t$(TEST_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \r\n\trm px8.bin\r\n\tmv PX8.ROM $(BUILD_PATH)/TEST_px8.ROM\r\n\r\n\r\nsamcoupe_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sam \\\r\n\t-D__SAM__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 -vn \\\r\n\t-o $(BUILD_PATH)/FULL_samcoupe.bin -lndos \\\r\n\t$(TEST_FILES)\r\n\tcp $(TOOLS_PATH)/z88dk/samcoupe/samdos2_empty $(TOOLS_PATH)/z88dk/samcoupe/samdos2\r\n\t$(TOOLS_PATH)/z88dk/samcoupe/pyz80.py -I $(TOOLS_PATH)/z88dk/samcoupe/samdos2 $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.asm\r\n\tmv $(TOOLS_PATH)/z88dk/samcoupe/sam_wrapper.dsk $(BUILD_PATH)/TEST_samcoupe.dsk\r\n\trm $(BUILD_PATH)/FULL_samcoupe.bin\r\n\r\n\r\nsc3000_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-vn -lndos -create-app -Cz--audio \\\r\n\t-o $(BUILD_PATH)/TEST_sc3000_16k.prg \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_sc3000_16k.prg\r\n\trm $(BUILD_PATH)/TEST_sc3000_16k.tap\t\r\n\r\n\r\nsg1000_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +sc3000 -subtype=rom \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-vn -lndos -create-app -Cz--audio \\\r\n\t-o $(BUILD_PATH)/TEST_sg1000.prg \\\r\n\t$(TEST_FILES) \r\n\trm $(BUILD_PATH)/TEST_sg1000.prg\r\n\trm $(BUILD_PATH)/TEST_sg1000_BSS.bin\r\n\trm $(BUILD_PATH)/TEST_sg1000_DATA.bin\r\n\r\n\r\nspectrum_quick_test: \r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx -clib=ansi -vn  \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t -DCLIB_ANSI -D__SPECTRUM__ \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/TEST_spectrum.prg \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_spectrum.prg\r\n\trm -rf $(BUILD_PATH)/TEST_spectrum_BANK_7.bin\r\n\r\n\r\nsrr_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +srr -pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-D__SRR__ -vn \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-D__NO_WAIT \\\r\n\t-D__VT52 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-create-app -o srrt.bin \\\r\n\t$(TEST_FILES)\r\n\trm srrt.srr\r\n\trm srrt.bin\r\n\tmv srrt.wav $(BUILD_PATH)/TEST_srr.wav\r\n\r\n\r\nsvi_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +svi \\\r\n\t -vn -lndos \\\r\n\t \\\r\n\t-D__SVI__ -o svit.bin \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 -vn -lndos \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__SVI__ \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c  \\\r\n\t$(TEST_FILES)\r\n\tmv svit.cas $(BUILD_PATH)/TEST_svi.cas\r\n\trm svit.bin\r\n\r\n\r\nti82_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti82 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) -D__TI82__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t-DTURN_BASED -D__NO_WAIT \\\r\n\t-lndos \\\r\n\t-create-app -o ti82t.bin \\\r\n\t$(TEST_FILES)\r\n\tmv ti82t.82p $(BUILD_PATH)/TEST_ti82.82p\r\n\trm ti82t.bin\r\n\r\n\r\nti83_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti83 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) -D__TI83__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t-DTURN_BASED -D__NO_WAIT \\\r\n\t-lndos \\\r\n\t-create-app -o ti83t.bin \\\r\n\t$(TEST_FILES)\r\n\tmv ti83t.83p $(BUILD_PATH)/TEST_ti83.83p\r\n\trm ti83t.bin\r\n\r\n\r\nti85_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +ti85 \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) -D__TI85__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-clib=ansi -pragma-define:ansicolumns=32 \\\r\n\t-vn \\\r\n\t-DTURN_BASED -D__NO_WAIT \\\r\n\t-lndos \\\r\n\t-create-app -o ti85t.bin \\\r\n\t$(TEST_FILES)\r\n\tmv ti85t.85s $(BUILD_PATH)/TEST_ti85.85s\r\n\trm ti85t.bin\r\n\r\n\r\ntrs80_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +trs80 -lndos \\\r\n\t-lm -create-app \\\r\n\t-D__TRS80__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__VT52 \\\r\n\t-o$(BUILD_PATH)/TEST_trs80.bin \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_trs80.bin\t\r\n\r\n\r\nvg5k_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t -vn -D__VG5K__ -DASM_DISPLAY \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/TEST_vg5k.prg \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_vg5k.prg\t\r\n\r\n\r\nvz200_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vz -vn \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma.inc \\\r\n\t-D__VZ__ -clib=ansi \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_vz200.vz \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_vz200.cas\t\r\n\r\n\r\nx1_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +x1 \\\r\n\t-D__X1__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_x1.bin -vn -lndos \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_x1.bin\r\n\r\n\r\nz1013_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z1013 -clib=ansi \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-vn -lndos \\\r\n\t-D__Z1013__ \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(TEST_FILES) \\\r\n\t-create-app -o z1013t.bin\r\n\tmv Z1013T.Z80 $(BUILD_PATH)/TEST_z1013.z80\r\n\trm z1013t.bin\r\n\r\n\r\nz9001_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +z9001 -clib=ansi \\\r\n\t-D__Z9001__ -vn   \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/TEST_z9001.z80 \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_z9001.z80\t\r\n\r\n\r\nzx80_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx80 -vn \\\r\n\t-D__ZX80__ \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-DTURN_BASED \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ALT_SLEEP \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/TEST_zx80.prg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(TEST_FILES) \r\n\trm $(BUILD_PATH)/TEST_zx80.prg\r\n\r\n\r\nzx81_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 -vn \\\r\n\t-D__ZX81__ \\\r\n\t-DTURN_BASED \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_SCCZ80_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__ALT_SLEEP \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/TEST_zx81.prg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(TEST_FILES) \r\n\trm $(BUILD_PATH)/TEST_zx81.prg\r\n\r\n\r\n###############################################################################\r\n\r\n\r\nzx81_zsdcc_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx81 \\\r\n\t-compiler=sdcc \\\r\n\t-vn \\\r\n\t-D__ZX81__ -DTINY_GAME \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/TEST_ZSDCC_zx81.prg \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_ZSDCC_zx81.prg\r\n\r\n\r\naquarius_zsdcc_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +aquarius \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma.inc \\\r\n\t-compiler=sdcc \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-vn \\\r\n\t-D__ALT_PRINT -D__AQUARIUS__ -DTINY_GAME \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-lndos -o TEST_ZSDCC_aquarius -create-app \\\r\n\t-D__MEMORY_MAPPED_GRAPHICS \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/aquarius/aquarius_init_graphics.c \\\r\n\t$(TEST_FILES) \r\n\trm TEST_ZSDCC_aquarius\r\n\tmv TEST_ZSDCC_aquarius.caq $(BUILD_PATH)\r\n\tmv _TEST_ZSDCC_aquarius.caq $(BUILD_PATH)\t\r\n\r\n\r\nvz200_zsdcc_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vz -vn \\\r\n\t-DTINY_GAME \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma.inc \\\r\n\t-compiler=sdcc \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__VZ__ -clib=ansi \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DNO_DEAD_GHOSTS \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-DNO_STATS \\\r\n\t-DNO_INITIAL_SCREEN \\\r\n\t-lndos \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_ZSDCC_vz200.vz \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_ZSDCC_vz200.cas\r\n\r\n\r\nspectrum_zsdcc_quick_test: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx  -zorg=24055 \\\r\n\t-compiler=sdcc \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-DZ88DK_JOYSTICK \\\r\n\t-DTINY_GAME \\\r\n\t \\\r\n\t \\\r\n\t-D__SPECTRUM__ \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_ZSDCC_spectrum.prg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_ZSDCC_spectrum.prg \r\n\t# rm $(BUILD_PATH)/TEST_ZSDCC_spectrum_BANK_7.bin\r\n\r\n\r\nsvi_zsdcc_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +svi \\\r\n\t-compiler=sdcc \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-zorg=49152 \\\r\n\t-clib=ansi \\\r\n\t-pragma-define:ansicolumns=32 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-vn -lndos -o svizt.bin \\\r\n\t-D__SVI__ \\\r\n\t \\\r\n\t-D__BIT_BANG_SOUND \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-create-app \\\r\n\t-create-app \\\r\n\t$(TEST_FILES) \r\n\tmv svizt.cas $(BUILD_PATH)/TEST_ZSDCC_svi.cas\r\n\trm svizt.bin\r\n\t\r\n\t\r\nvg5k_zsdcc_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +vg5k \\\r\n\t-compiler=sdcc \\\r\n\t--reserve-regs-iy \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t \\\r\n\t-vn -D__VG5K__ \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-create-app -o $(BUILD_PATH)/TEST_ZSDCC_vg5k.prg \\\r\n\t$(TEST_FILES)\r\n\trm $(BUILD_PATH)/TEST_ZSDCC_vg5k.prg\r\n\r\n\r\nmc1000_zsdcc_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mc1000 -compiler=sdcc \\\r\n\t-subtype=gaming -pragma-define:ansicolumns=32 \\\r\n\t-DLESS_TEXT \\\r\n\t \\\r\n\t-DNO_HINTS \\\r\n\t-clib=ansi \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__MC1000__  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-vn  -lndos -create-app -Cz--audio -o mc1kzt.bin \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(TEST_FILES) \r\n\tmv mc1kzt.wav $(BUILD_PATH)/TEST_ZSDCC_mc1000.wav\r\n\trm mc1kzt.bin\r\n\trm mc1kzt.cas\r\n\r\n\r\nc128_z80_zsdcc_quick_test:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +c128 \\\r\n\t-compiler=sdcc \\\r\n\t-lndos -subtype=disk \\\r\n\t-D__C128_Z80__ -DXSize=40 \\\r\n\t-D__INCLUDE_CONIO_H \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FAST_ZSDCC_TEST_OPTS) $(INCLUDE_OPTS) \\\r\n\t$(TEST_FILES) \\\r\n\t-create-app -o c128zt.bin\r\n\t$(TOOLS_PATH)/generic/c1541 -format \"crosschase,0\" d64 TEST_c128_z80.d64\r\n\t$(TOOLS_PATH)/generic/c1541 -attach TEST_c128_z80.d64 -write c128zt.ldr\r\n\t$(TOOLS_PATH)/generic/c1541 -attach TEST_c128_z80.d64 -write c128zt\r\n\tmv TEST_c128_z80.d64 $(BUILD_PATH)/\r\n\trm C128ZT.LDR\r\n\trm C128ZT\r\n\trm c128zt.bin\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/wip/Makefile.ack_wip_targets",
    "content": "# -----------------------------------------------\r\n# ACK\r\n\r\nack_wip_targets: \\\r\n\tpdp11v7 \\\r\n\tpdp11v7_buffered\r\n\r\npdp11v7_wip_targets: \\\r\n\tpdp11v7 \\\r\n\tpdp11v7_buffered\r\n\r\n\r\n# buffered\r\npdp11v7_buffered:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mpdpv7 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=22 \\\r\n\t-D__PDP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__PDP11V7__ \\\r\n\t \\\r\n\t-DTURN_BASED \\\r\n\t-D__BUFFERED_GRAPHICS -D__STDIO \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES)\r\n\tmv a.out $(BUILD_PATH)/WIP_FULL_pdp11v7_turn_based.bin\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\npdp11v7:\r\n\t$(_ACK) $(_ACK_OPTS) $(INCLUDE_OPTS) -mpdpv7 \\\r\n\t-DXSize=78 \\\r\n\t-DYSize=22 \\\r\n\t-D__PDP \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-DACK \\\r\n\t-D__PDP11V7__ \\\r\n\t \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_WAIT \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(FULL_FILES)\r\n\tmv a.out $(BUILD_PATH)/WIP_FULL_pdp11v7.bin\r\n\trm $(SOURCE_PATH)/../../*.o\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/wip/Makefile.cc65_wip_targets",
    "content": "\r\n\r\n\r\nTINY_OBJ ?= character.o game_text.o level.o main.o move_player.o strategy.o\r\nbbc_no_graphics:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -t bbc -c \\\r\n\t-D__BBC__ \\\r\n\t-D__NORMALIZED_RAND \\\r\n\t-DXSize=79 \\\r\n\t-DYSize=22 \\\r\n\t-D_XL_NO_SLEEP \\\r\n\t-D_XL_NO_COLOR \\\r\n\t-D__NO_PRINT \\\r\n\t-DTINY_GAME \\\r\n\t-D__NO_WAIT \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_GRAPHICS \\\r\n\t-D__NO_PRINT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__DEFAULT_CLEAR_SCREEN \\\r\n\t$(TINY_FILES)\r\n\t$(CC65_PATH)/ld65$(EXE) -t bbc \\\r\n\t--obj-path $(SOURCE_PATH) \\\r\n\t-m $(BUILD_PATH)/bbc_no_graphics.map \\\r\n\t-o $(BUILD_PATH)/WIP_bbc_no_graphics.bin \\\r\n\t$(TINY_OBJ)\r\n\r\n\r\npce_light:\r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t pce -Cl \\\r\n\t--config $(CFG_PATH)cc65/pce_8k_less_stack.cfg \\\r\n\t-DLESS_TEXT -D__NO_PRINT \\\r\n\t \\\r\n\t-DNO_CONTROL_INSTRUCTIONS -DNO_INITIAL_SCREEN \\\r\n\t-DNO_DEAD_GHOSTS -D__NO_SCREEN_COLOR_INIT -DNO_RANDOM_LEVEL \\\r\n\t-DGHOSTS_NUMBER=6 \\\r\n\t \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-DNO_STATS \\\r\n\t$(LIGHT_FILES) \\\r\n\t-o $(BUILD_PATH)/WIP_LIGHT_pce.pce\r\n\r\n\r\npet_8k_buffered: \r\n\t$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -Or -t pet -Cl \\\r\n\t-DTINY_GAME -D__NO_INIT_GRAPHICS \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-DUSE_TINY_MEMORY_BUFFERS \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t$(SOURCE_PATH)/memory/pet_memory.s \\\r\n\t-o $(BUILD_PATH)/WIP_TINY_pet_8k_buffered.prg\r\n\r\n\r\n"
  },
  {
    "path": "src/makefiles.other/chase/wip/Makefile.z88dk_wip_targets",
    "content": "# -----------------------------------------------------------------------\r\n# WIP\r\n# Targets that are in a work in progress status\r\n\r\n\r\n#############################\r\n# CPC\r\ncpc_no_gfx:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpc $(SCCZ80_OPTS) $(INCLUDE_OPTS)  -vn  -clib=ansi \\\r\n\t-D__CPC__   -D__NO_INIT_GRAPHICS -D__CONIO_GRAPHICS \\\r\n\t-pragma-define:REGISTER_SP=-1 \\\r\n\t-lndos -create-app -o $(BUILD_PATH)/WIP_FULL_cpc_no_gfx.prg \\\r\n\t$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \\\r\n\t$(FULL_FILES) \r\n\t$(TOOLS_PATH)/z88dk/cpc/2cdt.exe -n -r cross_chase $(BUILD_PATH)/WIP_FULL_cpc_no_gfx.cpc  $(BUILD_PATH)/WIP_FULL_cpc_no_gfx.cdt\r\n\trm -rf WIP_FULL_cpc_no_gfx.dsk\r\n\t$(TOOLS_PATH)/z88dk/cpc/cpcxfsw -nd WIP_FULL_cpc_no_gfx.dsk\r\n\t$(TOOLS_PATH)/z88dk/cpc/cpcxfsw WIP_FULL_cpc_no_gfx.dsk -p $(BUILD_PATH)/WIP_FULL_cpc_no_gfx.cpc xchase\r\n\tmv WIP_FULL_cpc_no_gfx.dsk $(BUILD_PATH)/\r\n\tcp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .\r\n\t$(TOOLS_PATH)/z88dk/cpc/nocart/nocart.exe  $(BUILD_PATH)/WIP_FULL_cpc_no_gfx.dsk  $(BUILD_PATH)/FULL_gx4000_no_gfx.cpr   -c 'run\"xchase'\r\n\trm os.rom\r\n\trm amsdos.rom\r\n\trm basic.rom\r\n\trm $(BUILD_PATH)/WIP_FULL_cpc_no_gfx.cpc \r\n\trm $(BUILD_PATH)/WIP_FULL_cpc_no_gfx.prg\r\n\r\n\r\nkc_tiny_putc4x6:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +kc $(SCCZ80_OPTS) $(INCLUDE_OPTS) -subtype=tap \\\r\n\t\\\r\n\t-D__KC__ \\\r\n\t-DTINY_GAME -DLESS_TEXT -D_XL_NO_SLEEP \\\r\n\t-DZ88DK_PUTC4X6 \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-D__ALT_PRINT \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-create-app -o$(BUILD_PATH)/WIP_TINY_kc_putc4x6_.bin \\\r\n\t$(TINY_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/z88dk_putc4x6_alt_print.c\r\n\trm $(BUILD_PATH)/WIP_TINY_kc_putc4x6_.bin\r\n\r\n\r\nmz2500_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +mz2500 $(ZSDCC_OPTS) \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-compiler=sdcc \\\r\n\t-DXSize=16 \\\r\n\t-DYSize=12 \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-D__MZ2500__ \\\r\n\t-v \\\r\n\t \\\r\n\t-D__NO_SCREEN_COLOR_INIT \\\r\n\t-lndos \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t \\\r\n\t-D__INCLUDE_CONIO_H -D__CONIO_GRAPHICS \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t$(FULL_FILES) \\\r\n\t-create-app \r\n\tmv a.dsk $(BUILD_PATH)/WIP_FULL_mz2500_buffered.dsk\r\n\trm a.bin\r\n\r\n\r\npx4_putc4x6:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lpx4 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-define:ansicolumns=40 \\\r\n\t-pragma-define:ansipixels=240 -pragma-define:ansicolumns=60 \\\r\n \t-subtype=px4ansi \\\r\n\t-D__PX4__ \\\r\n\t \\\r\n\t-D__NO_WAIT \\\r\n\t-DZ88DK_PUTC4X6 \\\r\n\t-D__NO_PRINT \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-Cz–-32k \\\r\n\t-create-app \\\r\n\t-vn -lndos \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm a.bin\r\n\tmv A.ROM $(BUILD_PATH)/WIP_FULL_px4_putc4x6.ROM\r\n\r\n\r\npx4_tiny_putc4x6:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lpx4 \\\r\n\t$(INCLUDE_OPTS) \\\r\n\t-pragma-define:ansicolumns=40 \\\r\n\t-pragma-define:ansipixels=240 -pragma-define:ansicolumns=60 \\\r\n \t-subtype=px4ansi \\\r\n\t-D__PX4__ \\\r\n\t-DTINY_GAME \\\r\n\t-D__NO_WAIT \\\r\n\t-DZ88DK_PUTC4X6 \\\r\n\t-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \\\r\n\t-Cz–-32k \\\r\n\t-create-app \\\r\n\t-vn -lndos \\\r\n\t$(TINY_FILES)\r\n\trm a.bin\r\n\tmv A.ROM $(BUILD_PATH)/WIP_TINY_px4_putc4x6.ROM\r\n\r\nnew_retro_targets: rc2014 yaz180 hbios rcmx000 scz180\r\n\r\nrc2014:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +rc2014 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__RC2014__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/FULL_$@_buffered.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_BSS.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_CODE.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_UNASSIGNED.bin\r\n\r\n\r\nyaz180:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +yaz180 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__YAZ80__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/FULL_$@_buffered.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_BSS.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_CODE.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_UNASSIGNED.bin\r\n\r\n\r\nhbios:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +hbios $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__HBIOS__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/FULL_$@_buffered.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_BSS.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_CODE.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_UNASSIGNED.bin\r\n\r\n\r\nrcmx000:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +rcmx000 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__RCMX000__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/FULL_rcmx000_buffered.bin\r\n\r\n\r\nscz180:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +scz180 $(SCCZ80_OPTS)  $(INCLUDE_OPTS) \\\r\n\t-D__SCZ180__ \\\r\n\t-DXSize=32 \\\r\n\t-DYSize=22 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-create-app -o$(BUILD_PATH)/FULL_$@_buffered.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_BSS.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_CODE.bin\r\n\trm $(BUILD_PATH)/FULL_$@_buffered_UNASSIGNED.bin\r\n\r\n\r\nhello_s1mp3:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +s1mp3 \\\r\n\t./test/helloworld.c \\\r\n\t-o$(BUILD_PATH)/hello_s1mp3.bin\r\n\r\n\r\nhello_getchar_pacman:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +pacman \\\r\n\t./test/helloworld_getchar.c \\\r\n\t-o$(BUILD_PATH)/$@.bin\r\n\r\nhello_getchar_s1mp3:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +s1mp3 \\\r\n\t./test/helloworld_getchar.c \\\r\n\t-o$(BUILD_PATH)/hello_getchar_s1mp3.bin\r\n\r\ns1mp3:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +s1mp3 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \\\r\n\t-D__S1MP3__ \\\r\n\t-DXSize=12 \\\r\n\t-DYSize=9 \\\r\n\t-D__NO_SCREEN_COLOR_INIT -D__BUFFERED_GRAPHICS -DTURN_BASED  \\\r\n\t-D_XL_NO_COLOR -D__ALT_PRINT -D__STDIO  \\\r\n\t -D__NO_WAIT  -D_XL_NO_SLEEP -D__NO_WAIT -D__NO_PRINT -D__DEFAULT_CLEAR_SCREEN \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t$(FULL_FILES) \\\r\n\t$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \\\r\n\t-o$(BUILD_PATH)/FULL_s1mp3_buffered.bin\r\n\r\n\r\n# --list -m --c-code-in-asm\r\n# -compiler=sdcc -SO0\r\n#  --peep-file \"\" --list -m --c-code-in-asm\r\n# -compiler=sdcc -SO0\r\n#spectrum_16k_light\r\nspectrum_test_sdcc: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx -v -compiler=sdcc -SO0  \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-zorg=24055 --reserve-regs-iy \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-DLESS_TEXT  \\\r\n\t  \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-D_XL_NO_SLEEP -DNO_WALL \\\r\n\t-DNO_HINTS -DNO_CONTROL_INSTRUCTIONS -D__NO_SCREEN_COLOR_INIT \\\r\n\t -DNO_INITIAL_SCREEN \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__SPECTRUM__ \\\r\n\t-D__ALT_MOVE \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o $(BUILD_PATH)/WIP_LIGHT_$@.prg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(LIGHT_FILES)\r\n\trm $(BUILD_PATH)/WIP_LIGHT_$@.prg\r\n\trm $(BUILD_PATH)/WIP_LIGHT_$@_BANK_7.bin\r\n\r\nspectrum_test_sccz80: $(ASSETS_PATH)/z88dk_xchase.asm\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx -v  \\\r\n\t$(INCLUDE_OPTS)  \\\r\n\t-zorg=24055 \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-DLESS_TEXT  \\\r\n\t  \\\r\n\t-DGHOSTS_NUMBER=8 \\\r\n\t-D_XL_NO_SLEEP -DNO_WALL \\\r\n\t-DNO_HINTS -DNO_CONTROL_INSTRUCTIONS -D__NO_SCREEN_COLOR_INIT \\\r\n\t -DNO_INITIAL_SCREEN \\\r\n\t-DNO_RANDOM_LEVEL \\\r\n\t-DSIMPLE_STRATEGY \\\r\n\t-D__SPECTRUM__ \\\r\n\t-D__ALT_MOVE \\\r\n\t-lndos -create-app \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o $(BUILD_PATH)/WIP_LIGHT_$@.prg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \\\r\n\t$(ASSETS_PATH)/z88dk_xchase.asm \\\r\n\t$(LIGHT_FILES)\r\n\trm $(BUILD_PATH)/WIP_LIGHT_$@.prg\r\n\trm $(BUILD_PATH)/WIP_LIGHT_$@_BANK_7.bin\r\n\r\n\r\nspectrum_buffered:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn  \\\r\n\t-DTINY_GAME \\\r\n\t-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \\\r\n\t-pragma-redirect:getk=getk_inkey \\\r\n\t-D__BUFFERED_GRAPHICS \\\r\n\t-DXSize=29 \\\r\n\t-DYSize=19 \\\r\n\t-DTURN_BASED \\\r\n\t-D__NO_INIT_GRAPHICS \\\r\n\t-D__SPECTRUM__ \\\r\n\t-lndos -create-app \\\r\n\t-pragma-redirect:fputc_cons=fputc_cons_generic \\\r\n\t-o $(BUILD_PATH)/WIP_TINY_spectrum_buffered.prg \\\r\n\t$(TINY_FILES)\t\r\n\trm $(BUILD_PATH)/WIP_TINY_spectrum_buffered.prg\r\n\trm $(BUILD_PATH)/WIP_TINY_spectrum_buffered_BANK_7.bin\r\n\r\n\r\n\r\nzx80_16k:\r\n\t$(Z88DK_PATH)$(MYZ88DK) +zx80 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn \\\r\n\t-D__ZX80__  \\\r\n\t-D__ALT_SLEEP \\\r\n\t-D__CONIO_GRAPHICS \\\r\n\t-DZX80_GEN_TV_FIELD \\\r\n\t-lndos \\\r\n\t-create-app -o  $(BUILD_PATH)/FULL_zx80_16k.prg \\\r\n\t$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx80/zx80_init_graphics.c \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/end_screen.c \\\r\n\t$(FULL_FILES)\r\n\trm $(BUILD_PATH)/WIP_FULL_zx80_16k.prg\r\n\r\n\r\n"
  },
  {
    "path": "src/modules/LoggerSingleton.py",
    "content": "import logging\r\nimport datetime\r\n\r\n\r\n# global logger \r\n\r\n# logger = None\r\n\r\nclass LoggerSingleton:\r\n    \r\n    @staticmethod\r\n    def initLogger(name, path):\r\n        if name in logging.Logger.manager.loggerDict:\r\n            logger = logging.getLogger(name)\r\n            # print(\"Logger already exists\")\r\n            # print(str(logging.Logger.manager.loggerDict))\r\n        else:\r\n            # print(\"Logger does not exists, yet\")\r\n            # print(str(logging.Logger.manager.loggerDict))\r\n            logger = logging.getLogger(name)\r\n            logger.setLevel(logging.DEBUG)\r\n            if not logger.handlers:\r\n                # file_name='/cygdrive/c/Retro/CROSS-LIB/logs/log_'+datetime.datetime.now().strftime(\"%Y-%m-%d_%H_%M_%S\")+'.log'\r\n                \r\n                # file_name=path+'/log_'+name+'_'+datetime.datetime.now().strftime(\"%Y-%m-%d_%H_%M_%S\")+'.log'\r\n                file_name=path+'/log.log'\r\n                file_handler = logging.FileHandler(file_name,mode='a+', encoding=\"utf-8\")\r\n                formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)s - %(message)s')\r\n                file_handler.setFormatter(formatter)\r\n                logger.addHandler(file_handler)\r\n        return logger\r\n\r\n        \r\n    # @staticmethod\r\n    # def initConsoleLogger(name):\r\n        # if name in logging.Logger.manager.loggerDict:\r\n            # logger = logging.getLogger(name)\r\n        # else:\r\n            # logger = logging.getLogger(name)\r\n            # logger.setLevel(logging.DEBUG)\r\n            # if not logger.handlers:\r\n                # console_handler = logging.StreamHandler()\r\n                # formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)s - %(message)s')\r\n                # console_handler.setFormatter(formatter)\r\n                # logger.addHandler(console_handler)\r\n        # return logger  "
  },
  {
    "path": "src/modules/__init__.py",
    "content": "# assets"
  },
  {
    "path": "src/modules/build_functions.py",
    "content": "#!/usr/bin/env python\r\n\r\nfrom __future__ import print_function\r\n\r\nimport datetime\r\nimport shutil\r\nimport os\r\nimport sys\r\nimport time\r\n\r\nfrom os import walk\r\n\r\nsys.path.append(\"modules\")\r\n\r\nfrom modules.strings import *\r\nfrom modules.import_from_source import *\r\nfrom modules.tiles import *\r\nfrom modules.LoggerSingleton import LoggerSingleton\r\nfrom modules.init import *\r\nfrom modules.default_values import insert_default_sizes\r\nfrom modules.params import \\\r\n    handle_two_letter_params, full_params, COMMANDS_LIST, get_size_params\r\nfrom modules.help_functions import help_command, manual\r\nfrom modules.file_functions import files, convert_makefile, files_in_path, dirs_in_path, built_files_in_path, list_of_projects, list_projects\r\nfrom modules.tests import *\r\nfrom modules.split_projects import *\r\nfrom modules.run import run_command, run\r\nfrom modules.commands import commands\r\nfrom modules.input_functions import generic_input, are_you_sure\r\nfrom modules.option_functions import *\r\nfrom modules.project_functions import rename, clone, create, delete\r\nfrom modules.target_defs import *\r\nfrom modules.shape_functions import *\r\nfrom modules.clean_functions import clean, clean_test\r\n\r\nDEFAULT_COMPILATION_THREADS = 4\r\n\r\nlogger = LoggerSingleton.initLogger('xl', '../logs')\r\n\r\nlogger.info('Started')\r\n\r\n\r\n\r\ndef multiple_project_reset(option_config, mypath):\r\n    projects = []\r\n    for (_, dirnames, _) in walk(mypath):\r\n        projects.extend(dirnames)\r\n        break\r\n\r\n    for project_name in projects:\r\n        print(\"PROJECT: \" + project_name)\r\n        reset(option_config, [mypath, project_name])\r\n        print(\"\\n\")\r\n\r\n\r\ndef multiple_size_build(option_config, mypath,target,xsize,ysize,debug):\r\n\r\n    GNU_MAKE, \\\r\n    compilation_threads, \\\r\n    compilation_threads_string, \\\r\n    parallelize_multi_build, \\\r\n    z88dk_compiler, \\\r\n    z88dk_compiler_opts, \\\r\n    sccz80_compiler_opts, \\\r\n    zsdcc_compiler_opts, \\\r\n    cmoc_compiler_opts, \\\r\n    cc65_compiler_opts, \\\r\n    lcc1802_compiler_opts, \\\r\n    gcc4ti99_compiler_opts, \\\r\n    vbcc_compiler_opts, \\\r\n    ack_compiler_opts, \\\r\n    native_compiler_opts, \\\r\n    native_compiler, \\\r\n    tool_compiler, \\\r\n    use_tools \\\r\n    = option_config.build_config.get_opts()\r\n    \r\n    if option_config.build_config.parallelize_multi_build:\r\n        # print(\"Parallelize_multi_build is ON\")\r\n        logger.info(\"Parallelize_multi_build is ON\")\r\n        from multiprocessing import Pool\r\n    else:\r\n        logger.info(\"Parallelize_multi_build is OFF\")\r\n\r\n    projects = []\r\n    for (_, dirnames, _) in walk(mypath):\r\n        projects.extend(dirnames)\r\n        break\r\n\r\n    if use_tools:\r\n        use_tools_str = \" USE_TOOLS=1 \"\r\n    else:\r\n        use_tools_str = \"\"\r\n\r\n    target_to_check = target.replace(\"_sized\", \"\")\r\n    if (parallelize_multi_build==1) and (target_to_check in PARALLEL_TARGETS):\r\n        logger.info(\"Parallelize multi build with %s\", compilation_threads)\r\n        pool = Pool(processes=int(compilation_threads))\r\n        \r\n        for project_name in projects:\r\n\r\n            if is_project_split(project_name):\r\n                project_type = project_category(project_name)\r\n                create_main(project_name,project_type)\r\n            make_command = \\\r\n                GNU_MAKE + \" \" + target + use_tools_str + \" XSIZE=\" + xsize +  \\\r\n                \" YSIZE=\" + ysize + \" _DEBUG_FLAG=\" + str(debug) + \\\r\n                \" _NATIVE_CC=\" + native_compiler + \" \" + all_compilers_opts(option_config, \"\",\"\") + \\\r\n                \" GNU_MAKE=\" + GNU_MAKE + \\\r\n                \" TOOL_CC=\" + tool_compiler + \\\r\n                \" -f \" + mypath+\"/\"+project_name+\"/Makefile.\"+project_name\r\n\r\n            # run_command(option_config, make_command)\r\n            # if is_project_split(project_name):\r\n                # delete_main(option_config, project_name,project_type)\r\n            pool.apply_async(run_command, [option_config, make_command])\r\n\r\n        pool.close()\r\n        pool.join()\r\n        for project_name in projects:\r\n            if is_project_split(project_name):\r\n                delete_main(option_config, project_name,project_type)\r\n    else:\r\n        for project_name in projects:\r\n\r\n            if is_project_split(project_name):\r\n                project_type = project_category(project_name)\r\n                create_main(project_name,project_type)\r\n            make_command = \\\r\n                GNU_MAKE + \" \" + target + use_tools_str + \" XSIZE=\" + xsize +  \\\r\n                \" YSIZE=\" + ysize + \" _DEBUG_FLAG=\" + str(debug) + \\\r\n                \" _NATIVE_CC=\" + native_compiler + \" \" + all_compilers_opts(option_config, \"\",\"\") + \\\r\n                \" GNU_MAKE=\" + GNU_MAKE + \\\r\n                \" TOOL_CC=\" + tool_compiler + \\\r\n                \" -f \" + mypath+\"/\"+project_name+\"/Makefile.\"+project_name\r\n\r\n            run_command(option_config, make_command)\r\n            if is_project_split(project_name):\r\n                delete_main(option_config, project_name,project_type)\r\n\r\n\r\ndef multiple_build(option_config, mypath,target,threads,zsdcc_extra_optimization, reset_flag=False):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n\r\n    if option_config.build_config.parallelize_multi_build:\r\n        # print(\"Parallelize_multi_build is ON\")\r\n        logger.info(\"Parallelize_multi_build is ON\")\r\n        from multiprocessing import Pool\r\n    else:\r\n        logger.info(\"Parallelize_multi_build is OFF\")\r\n\r\n    projects = []\r\n\r\n    verbose = option_config.terminal_config.verbose\r\n\r\n    gnu_make, \\\r\n    compilation_threads, \\\r\n    compilation_threads_string, \\\r\n    parallelize_multi_build, \\\r\n    z88dk_compiler, \\\r\n    z88dk_compiler_opts, \\\r\n    sccz80_compiler_opts, \\\r\n    zsdcc_compiler_opts, \\\r\n    cmoc_compiler_opts, \\\r\n    cc65_compiler_opts, \\\r\n    lcc1802_compiler_opts, \\\r\n    gcc4ti99_compiler_opts, \\\r\n    vbcc_compiler_opts, \\\r\n    ack_compiler_opts, \\\r\n    native_compiler_opts, \\\r\n    native_compiler, \\\r\n    tool_compiler, \\\r\n    use_tools \\\r\n    = option_config.build_config.get_opts()\r\n\r\n    if use_tools:\r\n        use_tools_str = \" USE_TOOLS=1 \"\r\n    else:\r\n        use_tools_str = \"\"\r\n\r\n    for (_, dirnames, _) in walk(mypath):\r\n        projects.extend(dirnames)\r\n        break\r\n\r\n    projects_to_build = len(projects)\r\n\r\n    if verbose:\r\n        print(\"Building \" + str(projects_to_build) + \" projects: \", end=\"\")\r\n        for project_name in projects:\r\n            printc(option_config, bcolors.OKCYAN,project_name+\" \")\r\n        print(\"\")\r\n\r\n    if (parallelize_multi_build==1) and (target in PARALLEL_TARGETS):\r\n        logger.info(\"Parallelize multi build with %s\", threads)\r\n        pool = Pool(processes=int(threads))\r\n\r\n        for project_name in projects:\r\n            if verbose:\r\n                print(\"project name: \" + project_name)\r\n            if reset_flag:\r\n                reset(option_config, [\"\",project_name])\r\n            if is_project_split(project_name):\r\n                project_type = project_category(project_name)\r\n                create_main(project_name,project_type)\r\n            make_command = \\\r\n                GNU_MAKE + \" \" + target + use_tools_str + \\\r\n                    \" ZSDCC_MAKEFILE_THREADS_OPTS=\\'-j \" + threads + \"'\" \\\r\n                    + all_compilers_opts(option_config, zsdcc_extra_optimization, \"\") + \\\r\n                    \" _NATIVE_CC=\" + native_compiler + \\\r\n                    \" TOOL_CC=\" + tool_compiler + \" GNU_MAKE=\" + GNU_MAKE + \\\r\n                    \" -f \" + mypath+\"/\"+project_name+\"/Makefile.\"+project_name\r\n            pool.apply_async(run_command, [option_config, make_command])\r\n\r\n        pool.close()\r\n        pool.join()\r\n\r\n        for project_name in projects:\r\n            if is_project_split(project_name):\r\n                delete_main(option_config, project_name,project_type)\r\n    else:\r\n        for project_name in projects:\r\n            if reset_flag:\r\n                reset(option_config, [\"\",project_name])\r\n            if verbose:\r\n                print(\"project name: \" + project_name)\r\n            if is_project_split(project_name):\r\n                project_type = project_category(project_name)\r\n                create_main(project_name,project_type)\r\n            make_command = \\\r\n                GNU_MAKE + \" \" + target + use_tools_str + \\\r\n                    \" ZSDCC_MAKEFILE_THREADS_OPTS=\\'-j \" + threads + \"'\" \\\r\n                    + all_compilers_opts(option_config, zsdcc_extra_optimization, \"\") + \\\r\n                    \" _NATIVE_CC=\" + native_compiler + \\\r\n                    \" TOOL_CC=\" + tool_compiler + \" GNU_MAKE=\" + GNU_MAKE + \\\r\n                    \" -f \" + mypath+\"/\"+project_name+\"/Makefile.\"+project_name\r\n\r\n            run_command(option_config, make_command)\r\n            if is_project_split(project_name):\r\n                delete_main(option_config, project_name,project_type)\r\n\r\n\r\n# Run a project natively (terminal with ncurses) with a given XSize and YSize\r\ndef size(option_config, params, debug = False):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n\r\n    verbose = option_config.terminal_config.verbose\r\n    if len(params)<2:\r\n        game_dir = \"helloworld\"\r\n    else:\r\n        game_dir = params[1]\r\n\r\n    project_type = project_category(game_dir)\r\n\r\n    parent_dir = project_type + \"s\"\r\n\r\n    target, xsize, ysize = get_size_params(params)\r\n\r\n    if verbose:\r\n        print(\"Project name       : \" + game_dir)\r\n        print(\"Project type       : \" + project_type)\r\n        print(\"XSize: \" + xsize)\r\n        print(\"YSize: \" + ysize)\r\n        print(\"target: \" + target)\r\n\r\n    parent_and_game_dir = parent_dir + \"/\" + game_dir\r\n\r\n    files_before = len(files_in_path(\"../build\"))-1\r\n\r\n    if game_dir not in [\"games\", \"examples\", \"projects\", \"all\"]:\r\n        if not os.path.exists(parent_and_game_dir):\r\n            print(\"Project not found!\")\r\n            return\r\n        native_compiler = option_config.build_config.native_compiler\r\n        tool_compiler   = option_config.build_config.tool_compiler\r\n        if is_project_split(game_dir):\r\n            if verbose:\r\n                printc(option_config, bcolors.OKBLUE,\"Create main.c from split source files\\n\")\r\n            create_main(game_dir, project_type)\r\n        make_command = \\\r\n            GNU_MAKE + \" \" + target + \" XSIZE=\" + xsize +  \" YSIZE=\" + ysize + \\\r\n                \" _DEBUG_FLAG=\" + str(debug) + \" \" \\\r\n                + all_compilers_opts(option_config, \"\",\"\") + \\\r\n                \" _NATIVE_CC=\" + native_compiler + \\\r\n                \" TOOL_CC=\" + tool_compiler + \\\r\n                \" -f \" + parent_dir+\"/\"+game_dir+\"/Makefile.\"+game_dir\r\n        run_command(option_config, make_command)\r\n\r\n        if is_project_split(game_dir):\r\n            if verbose:\r\n                printc(option_config, bcolors.OKBLUE,\"Delete main.c (because of split source files)\\n\")\r\n            delete_main(option_config, game_dir, project_type)\r\n    else:\r\n        if game_dir in[\"games\",\"examples\",\"projects\"]:\r\n            multiple_size_build(option_config, game_dir,target,xsize,ysize,debug)\r\n        elif game_dir in[\"new\"]:\r\n            multiple_size_build(option_config, \"projects\",target,xsize,ysize,debug)\r\n        elif game_dir in[\"builtin\",\"built-in\"]:\r\n            multiple_size_build(option_config, \"games\",target,xsize,ysize,debug)\r\n            multiple_size_build(option_config, \"examples\",target,xsize,ysize,debug)\r\n        elif game_dir==\"all\":\r\n            multiple_size_build(option_config, \"games\",target,xsize,ysize,debug)\r\n            multiple_size_build(option_config, \"examples\",target,xsize,ysize,debug)\r\n            multiple_size_build(option_config, \"projects\",target,xsize,ysize,debug)\r\n        else:\r\n            return\r\n\r\n    files_after = len(files_in_path(\"../build\"))-1\r\n\r\n    if verbose:\r\n        print(\"New binaries built: \" + str(files_after-files_before)+\"\\n\")\r\n\r\n\r\n# Rebuild a project, i.e., also rebuilds assets\r\ndef rebuild(option_config, params):\r\n    build(option_config, params, reset_flag=True)\r\n\r\n\r\nBUILD_TOOLS_THREADS = str(1)\r\n\r\n# Generate tools from source code\r\ndef tools(option_config):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n    # compilation_threads = option_config.build_config.compilation_threads\r\n    tool_compiler = option_config.build_config.tool_compiler\r\n    make_command = \\\r\n        GNU_MAKE + \" -j \" + BUILD_TOOLS_THREADS + \" tools TOOL_CC=\" + tool_compiler + \\\r\n        \" GNU_MAKE=\" + GNU_MAKE + \" -f makefiles.common/auxiliary/Makefile_tools\"\r\n    run_command(option_config, make_command)\r\n\r\ndef partial_tools(option_config, tools_to_build):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n    # compilation_threads = option_config.build_config.compilation_threads\r\n    tool_compiler = option_config.build_config.tool_compiler\r\n    make_command = \\\r\n        GNU_MAKE + \" \" + tools_to_build + \" -j \" + BUILD_TOOLS_THREADS + \" TOOL_CC=\" + tool_compiler + \\\r\n        \" GNU_MAKE=\" + GNU_MAKE + \" -f makefiles.common/auxiliary/Makefile_tools\"\r\n    run_command(option_config, make_command)\r\n\r\n# Build a project (for a target or multiple targets)\r\ndef build(option_config, params, reset_flag = False):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n\r\n    params = insert_default_sizes(option_config, params)\r\n\r\n    # sized terminal\r\n    if len(params)>=4 and params[2].startswith(\"terminal\") and params[3].isnumeric() \\\r\n                      and params[4].isnumeric():\r\n        if reset_flag:\r\n            reset(option_config, params)\r\n        size(option_config, [\"size\"] + params[1:],0)\r\n        return\r\n\r\n    if len(params)<2:\r\n        game_dir = \"helloworld\"\r\n    else:\r\n        game_dir = params[1]\r\n\r\n    if len(params)>=1 and game_dir==\"tools\":\r\n        tools(option_config)\r\n    elif len(params)>=1 and game_dir.endswith(\"_tools\"):\r\n        partial_tools(option_config, game_dir)\r\n\r\n    else:\r\n\r\n        files_before = len(files_in_path(\"../build\"))-1\r\n\r\n        project_type = project_category(game_dir)\r\n        parent_dir = project_type + \"s\"\r\n\r\n        if len(params)<3:\r\n            target = \"ncurses\"\r\n        else:\r\n            target = params[2]\r\n\r\n        if target in [\"cc65\", \"z88dk\", \"cmoc\", \"lcc1802\", \"cc6303\", \"gcc4ti\", \"vbcc\"]:\r\n            target = target + \"_targets\"\r\n\r\n        gnu_make, \\\r\n        compilation_threads, \\\r\n        compilation_threads_string, \\\r\n        parallelize_multi_build, \\\r\n        z88dk_compiler, \\\r\n        z88dk_compiler_opts, \\\r\n        sccz80_compiler_opts, \\\r\n        zsdcc_compiler_opts, \\\r\n        cmoc_compiler_opts, \\\r\n        cc65_compiler_opts, \\\r\n        lcc1802_compiler_opts, \\\r\n        gcc4ti99_compiler_opts, \\\r\n        vbcc_compiler_opts, \\\r\n        ack_compiler_opts, \\\r\n        native_compiler_opts, \\\r\n        native_compiler, \\\r\n        tool_compiler, \\\r\n        use_tools \\\r\n        = option_config.build_config.get_opts()\r\n\r\n\r\n        # compilation_threads = option_config.build_config.compilation_threads\r\n        if len(params)<4:\r\n            threads = str(compilation_threads)\r\n        else:\r\n            threads = params[3]\r\n\r\n        # zsdcc_extra_optimization = option_config.build_config.zsdcc_extra_optimization\r\n        if len(params)>=5 and params[4]==\"on\":\r\n            zsdcc_extra_optimization = \"--max-allocs-per-node200000\"\r\n        else:\r\n            zsdcc_extra_optimization = \"\"\r\n\r\n        # compiler_opts = option_config.build_config.compiler_opts\r\n        if len(params)>=6:\r\n            compiler_opts = \" \" + params[5]\r\n        else:\r\n            compiler_opts = \"\"\r\n\r\n        color_terminal = option_config.terminal_config.color_terminal\r\n\r\n        verbose = option_config.terminal_config.verbose\r\n\r\n        if verbose:\r\n\r\n            print(\"Project name       : \", end=\"\")\r\n            printc(option_config, bcolors.BOLD, game_dir+\"\\n\")\r\n\r\n            print(\"Target name        : \", end=\"\")\r\n            printc(option_config, bcolors.UNDERLINE, target+\"\\n\")\r\n\r\n            print(\"Project type       : \" + project_type)\r\n            print(\"Number of threads  : \" + threads)\r\n            print(\"Extra optimization : \" + zsdcc_extra_optimization)\r\n            print(\"Compiler's options : \" + compiler_opts)\r\n\r\n            print(\"--------------------------\")\r\n            print(\"z88dk_compiler_opts     : \" + z88dk_compiler_opts)\r\n            print(\"zsdcc_compiler_opts     : \" + zsdcc_compiler_opts)\r\n            print(\"cmoc_compiler_opts      : \" + cmoc_compiler_opts)\r\n            print(\"cc65_compiler_opts      : \" + cc65_compiler_opts)\r\n            print(\"lcc1802_compiler_opts   : \" + lcc1802_compiler_opts)\r\n            print(\"gcc4ti99_compiler_opts  : \" + gcc4ti99_compiler_opts)\r\n            print(\"vbcc_compiler_opts      : \" + vbcc_compiler_opts)\r\n            print(\"ack_compiler_opts       : \" + ack_compiler_opts)\r\n            print(\"native_compiler_opts    : \" + native_compiler_opts)\r\n\r\n            print(\"\")\r\n\r\n        parent_and_game_dir = parent_dir + \"/\" + game_dir\r\n\r\n        if os.path.exists(parent_and_game_dir + \"/config.ini\"):\r\n            print(\"Local config.ini detected\")\r\n            read_config(parent_and_game_dir + \"/config.ini\")\r\n\r\n        if game_dir not in [\"games\", \"examples\", \"projects\", \"all\"]:\r\n            if reset_flag:\r\n                reset(option_config, params)\r\n            if not os.path.exists(parent_and_game_dir):\r\n                print(\"Project not found!\")\r\n                return\r\n            if use_tools:\r\n                use_tools_str = \" USE_TOOLS=1 \"\r\n            else:\r\n                use_tools_str = \"\"\r\n\r\n            if is_project_split(game_dir):\r\n                if verbose:\r\n                    printc(option_config, bcolors.OKBLUE,\"Create main.c from split source files\\n\")\r\n                create_main(game_dir, project_type)\r\n                \r\n                \r\n            # print(\"DEBUG: \" + target)\r\n            # short_target = target.replace(\"_targets\",\"\")\r\n            # if short_target in [\"cc65\",\"z88dk\",\"ncurses\"]:\r\n                # print(get_targets(\"cc65\"))\r\n                # print(len(get_targets(\"cc65\")))\r\n\r\n            make_command = \\\r\n                GNU_MAKE + \" \" + target + \\\r\n                    use_tools_str + \\\r\n                    \" ZSDCC_MAKEFILE_THREADS_OPTS=\\'-j \" + threads + \"' \" \\\r\n                    + all_compilers_opts(option_config, zsdcc_extra_optimization, compiler_opts) +  \\\r\n                    \" _NATIVE_CC=\" + native_compiler + \\\r\n                    \" TOOL_CC=\" + tool_compiler + \" GNU_MAKE=\" + GNU_MAKE + \\\r\n                    \" -f \" + parent_dir+\"/\"+game_dir+\"/Makefile.\"+game_dir\r\n\r\n            run_command(option_config, make_command)\r\n\r\n            if is_project_split(game_dir):\r\n                if verbose:\r\n                    printc(option_config, bcolors.OKBLUE,\"Delete main.c because of split source files\\n\")\r\n                delete_main(option_config, game_dir, project_type)\r\n\r\n        else:\r\n            if game_dir in [\"games\",\"examples\",\"projects\"]:\r\n                multiple_build(option_config, game_dir,target,threads,zsdcc_extra_optimization, reset_flag)\r\n            elif game_dir==\"new\":\r\n                multiple_build(option_config, \"projects\",target,threads,zsdcc_extra_optimization, reset_flag)\r\n            elif game_dir in [\"builtin\",\"built-in\"]:\r\n                multiple_build(option_config, \"games\",target,threads,zsdcc_extra_optimization, reset_flag)\r\n                multiple_build(option_config, \"examples\",target,threads,zsdcc_extra_optimization, reset_flag)\r\n            elif game_dir==\"all\":\r\n                multiple_build(option_config, \"games\",target,threads,zsdcc_extra_optimization, reset_flag)\r\n                multiple_build(option_config, \"examples\",target,threads,zsdcc_extra_optimization, reset_flag)\r\n                multiple_build(option_config, \"projects\",target,threads,zsdcc_extra_optimization, reset_flag)\r\n            else:\r\n                return\r\n\r\n        files_after = len(files_in_path(\"../build\"))-1\r\n\r\n        if verbose:\r\n            printc(option_config, bcolors.OKBLUE, \"New binaries built: \" + str(files_after-files_before)+\"\\n\")\r\n\r\n\r\ndef slow(option_config, params):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n\r\n    verbose = option_config.terminal_config.verbose\r\n    game_dir = params[1]\r\n\r\n    project_type = project_category(game_dir)\r\n    parent_dir = project_type + \"s\"\r\n\r\n    if len(params)>=4:\r\n        target = params[2]\r\n        slowdown = params[3]\r\n    elif len(params)==3:\r\n        target = NATIVE_TARGET\r\n        slowdown = params[2]\r\n    else:\r\n        printc(option_config, bcolors.FAIL, \"Wrong number of arguments\")\r\n        sys.exit(-1)\r\n    parent_and_game_dir = parent_dir + \"/\" + game_dir\r\n\r\n    if os.path.exists(parent_and_game_dir + \"/config.ini\"):\r\n        print(\"Local config.ini detected\")\r\n        read_config(parent_and_game_dir + \"/config.ini\")\r\n\r\n    if not os.path.exists(parent_and_game_dir):\r\n        print(\"Project not found!\")\r\n        return\r\n\r\n    if is_project_split(game_dir):\r\n        if verbose:\r\n            printc(option_config, bcolors.OKBLUE,\"Create main.c from split source files\\n\")\r\n        create_main(game_dir, project_type)\r\n\r\n    make_command = \\\r\n        GNU_MAKE + \" \" + target + \\\r\n            \" SLOWDOWN=\" + slowdown + \\\r\n            all_compilers_opts(option_config, \"\", \"\") +  \\\r\n            \" -f \" + parent_dir+\"/\"+game_dir+\"/Makefile.\"+game_dir\r\n\r\n    run_command(option_config, make_command)\r\n\r\n    if is_project_split(game_dir):\r\n        if verbose:\r\n            printc(option_config, bcolors.OKBLUE,\"Delete main.c because of split source files\\n\")\r\n        delete_main(option_config, game_dir, project_type)\r\n\r\n\r\n# Delete temporary project files If a project is specified, it also deletes generated assets.\r\ndef reset(option_config, params):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n\r\n    verbose = option_config.terminal_config.verbose\r\n    par_len = len(params)\r\n\r\n    if par_len>1:\r\n        game_dir = params[1]\r\n    else:\r\n        game_dir=\"\"\r\n\r\n    if game_dir in [\"games\",\"examples\",\"projects\"]:\r\n        multiple_project_reset(option_config, game_dir)\r\n        return\r\n    if game_dir==\"new\":\r\n        multiple_project_reset(option_config, \"projects\")\r\n        return\r\n    if game_dir in [\"builtin\",\"built-in\"]:\r\n        multiple_project_reset(option_config, \"games\")\r\n        multiple_project_reset(option_config, \"examples\")\r\n        return\r\n    if game_dir==\"all\":\r\n        multiple_project_reset(option_config, \"games\")\r\n        multiple_project_reset(option_config, \"examples\")\r\n        multiple_project_reset(option_config, \"projects\")\r\n        return\r\n\r\n    if len(params)<2:\r\n        make_command = GNU_MAKE + \\\r\n                       \" clean_generic_no_built_in -f makefiles.common/auxiliary/Makefile_common\"\r\n        if verbose:\r\n            print(\"Delete all non-project-specific temporary files\")\r\n        run_command(option_config, make_command)\r\n        return\r\n\r\n    game_dir = params[1]\r\n\r\n    project_type = project_category(game_dir)\r\n\r\n    parent_dir = project_type + \"s\"\r\n\r\n    if verbose:\r\n\r\n        print(\"Project name: \" + game_dir)\r\n\r\n    parent_and_game_dir = parent_dir + \"/\" + game_dir\r\n\r\n    if not os.path.exists(parent_and_game_dir):\r\n        print(\"Project not found!\")\r\n        return\r\n\r\n    if verbose:\r\n        print(\"Delete all temporary files including generated assets for '\"+game_dir+\"'\")\r\n\r\n    make_command = GNU_MAKE + \" clean_no_built_in -f \" + \\\r\n                   parent_dir+\"/\"+game_dir+\"/Makefile.\"+game_dir\r\n\r\n    run_command(option_config,make_command)\r\n\r\n\r\ndef make(option_config, params):\r\n    tiles(option_config, params)\r\n    rebuild(option_config, params)\r\n    \r\ndef assets(option_config, params):\r\n    tiles(option_config, params)\r\n    make_assets_from_tiles(option_config, params)"
  },
  {
    "path": "src/modules/clean_functions.py",
    "content": "import os\r\nfrom print_functions import printc, bcolors\r\nfrom project_functions import project_category\r\nfrom file_functions import files_in_path\r\nfrom modules.init import *\r\nfrom run import run_command\r\n\r\ndef clean_test(option_config):\r\n    clean(option_config, [\"clean\"])\r\n    files_after_clean = len(files_in_path(\"../build\"))\r\n\r\n    if files_after_clean>1:\r\n        # printc(option_config, bcolors.FAIL, \"[xl clean]          KO\\n\")\r\n        return 0\r\n    # printc(option_config, bcolors.OKGREEN, \"[xl clean]          OK\\n\")\r\n    return 1\r\n    \r\n    \r\n\r\n# Clean project data\r\ndef clean(option_config, params):\r\n\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n    \r\n    verbose = option_config.terminal_config.verbose\r\n\r\n    if len(params)>=2:\r\n        if params[1]==\"tools\":\r\n            make_command = GNU_MAKE + \" clean_tools GNU_MAKE=\" + GNU_MAKE + \" -f makefiles.common/auxiliary/Makefile_tools\"\r\n\r\n            run_command(option_config, make_command)\r\n            return\r\n        if params[1]==\"log\" or params[1]==\"logs\":\r\n            make_command = GNU_MAKE + \" clean_logs GNU_MAKE=\"  + GNU_MAKE + \" -f makefiles.common/auxiliary/Makefile_tools\"\r\n\r\n            run_command(option_config, make_command)\r\n            return\r\n\r\n    if len(params)<2:\r\n        make_command = GNU_MAKE + \" clean_generic -f makefiles.common/auxiliary/Makefile_common\"\r\n\r\n        if verbose:\r\n            print(\"Delete all built binaries and non-project-specific temporary files\")\r\n\r\n        run_command(option_config, make_command)\r\n        return\r\n\r\n    game_dir = params[1]\r\n\r\n    project_type = project_category(game_dir)\r\n\r\n    parent_dir = project_type + \"s\"\r\n\r\n    print(\"Project name: \" + game_dir)\r\n\r\n    parent_and_game_dir = parent_dir + \"/\" + game_dir\r\n\r\n    if not os.path.exists(parent_and_game_dir):\r\n        print(\"Project not found!\")\r\n        return\r\n\r\n    print(\"Delete all built binaries and temporary files (also specific to '\"+ \\\r\n          game_dir+\"', e.g., generated assets)\")\r\n\r\n    make_command = GNU_MAKE + \" clean -f \" + parent_dir+\"/\"+game_dir+\"/Makefile.\"+game_dir\r\n\r\n    run_command(option_config, make_command)\r\n"
  },
  {
    "path": "src/modules/commands.py",
    "content": "from __future__ import print_function\r\n\r\n\r\nfrom collections import OrderedDict\r\nfrom print_functions import printc, bcolors\r\n\r\n\r\nCOMMANDS_DESCRIPTIONS = OrderedDict( \\\r\n    {\r\n    \"assets\": \"builds assets from tile and/or shape files\", \\\r\n    \"build\": \"builds a project\", \\\r\n    \"check\": \"it checks dependencies\", \\\r\n    \"clean\": \"cleans binary files generated by a project\", \\\r\n    \"clone\": \"clones a project\", \\\r\n    \"commands\" :\"list all commands\",  \\\r\n    \"compilers\": \"check present compilers\", \\\r\n    \"config\": \"displays the configuration\", \\\r\n    \"create\": \"creates a new project\",  \\\r\n    \"delete\": \"completely deletes a project\", \\\r\n    \"extend\": \"generates non-8x8 shapes from 8x8 shapes\", \\\r\n    \"files\": \"shows all generated binary files\", \\\r\n    \"help\": \"provides help on a command or topic\", \\\r\n    \"import\": \"imports tiles from (Assembly/BASIC) files\", \\\r\n    \"info\": \"displays some target info\", \\\r\n    \"list\": \"lists all projects\", \\\r\n    \"make\": \"build project using shape files\", \\\r\n    \"manual\": \"prints the manual\", \\\r\n    \"rebuild\": \"generates assets and builds a project\", \\\r\n    \"rename\": \"renames a project\", \\\r\n    \"reset\": \"deletes graphics assets\", \\\r\n    \"rip\": \"rips Assembly or BASIC listings to produce tiles\", \\\r\n    \"rotate\": \"rips Assembly or BASIC listings to produce rotated tiles\", \\\r\n    \"run\": \"runs a project\", \\\r\n    \"self\": \"test xl script\", \\\r\n    \"show\": \"shows tiles of a project as shapes\", \\\r\n    \"size\": \"builds the native version of a project with a given size\", \\\r\n    \"slow\": \"builds a project for a target with a given slowdown\", \\\r\n    \"split\": \"splits a shape file in left and right shape\", \\\r\n    \"string\": \"produces case-sensitive strings as Cross-Lib characters macros\", \\\r\n    \"test\": \"runs some tests\", \\\r\n    \"tile\": \"converts a shape file into a tile\", \\\r\n    \"tiles\": \"generates all tiles from shapes\", \\\r\n    \"tools\": \"builds the tools\", \\\r\n    \"unit_tests\": \"run unit-tests\",\r\n    })\r\n\r\nCOMMANDS_LIST = COMMANDS_DESCRIPTIONS.keys()\r\n\r\n\r\nSHORT_COMMANDS_LIST = OrderedDict( \\\r\n    { \\\r\n        \"c\": \"clean\", \\\r\n        \"f\": \"files\", \\\r\n        \"h\": \"help\", \\\r\n        \"l\": \"list\", \\\r\n        \"m\": \"make\", \\\r\n        \"r\": \"rebuild\", \\\r\n        \"s\": \"slow\", \\\r\n        \"t\": \"test\", \\\r\n        \"u\": \"unit_tests\", \\\r\n        \"x\": \"run\",\r\n    })\r\n\r\n\r\n# Show all commands\r\ndef commands(option_config):\r\n    # Show full length commands\r\n    for command, description in COMMANDS_DESCRIPTIONS.items():\r\n        printc(option_config, bcolors.BOLD, command)\r\n        spaces = \" \" * (10-len(command))\r\n        print(spaces + \" -> \" + description)\r\n\r\n    # Show short-hands\r\n    print(\"\")\r\n    for short_command in SHORT_COMMANDS_LIST.items():\r\n        printc(option_config, bcolors.BOLD, short_command[0])\r\n        print(\" -> \",end=\"\")\r\n        printc(option_config, bcolors.BOLD, short_command[1]+\"\\n\")\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/modules/default_values.py",
    "content": "DEFAULT_TERMINAL_X_SIZE = 20\r\nDEFAULT_TERMINAL_Y_SIZE = 17\r\n\r\n\r\ndef default_tile_size(target):\r\n        if target in [\"atari_lynx\", \"terminal8x6\"]:\r\n            xtile = 8\r\n            ytile = 6\r\n        elif target in [\"apple2\", \"apple2enh\", \"terminal7x8\"]:\r\n            xtile = 7\r\n            ytile = 8\r\n        elif target in [\"oric1\", \"atmos\", \"oric\", \"comx_ntsc\", \"terminal6x8\"]:\r\n            xtile = 6\r\n            ytile = 8\r\n        elif target in ['comx', 'pecom', 'micro', \"terminal6x9\"]:\r\n            xtile = 6\r\n            ytile = 9\r\n        else:\r\n            xtile = 8\r\n            ytile = 8\r\n\r\n        return xtile, ytile\r\n\r\n# TODO: mz\r\ndef default_screen_size(target):\r\n        if target in (\"terminal\", \"terminal8x8\", \"terminal8x6\", \"atari_lynx\"):\r\n            xsize = 20\r\n            ysize = 17\r\n        elif target == \"pc6001\":\r\n            xsize = 24\r\n            ysize = 16\r\n        elif target in ['ti82', 'ti83', 'ti8x']:\r\n            xsize = 12\r\n            ysize = 8\r\n        elif target in ['ti85', 'ti86','z88']:\r\n            xsize = 16\r\n            ysize = 8\r\n        elif target in (\"oric1\", \"oric\", \"atmos\"):\r\n            xsize = 38\r\n            ysize = 28\r\n        elif target == \"supervision\":\r\n            xsize = 20\r\n            ysize = 20\r\n        elif target == \"gamate\":\r\n            xsize = 20\r\n            ysize = 19\r\n        elif target in [\"apple2\", \"apple2enh\", \"atari\", \"atari5200\", \"terminal7x8\"]:\r\n            xsize = 20\r\n            ysize = 24\r\n        elif target in ['comx', 'comx_ntsc', 'pecom', 'micro', 'comc_ntsc', 'laser500', \"terminal6x9\", \"terminal6x8\", \"aquarius\"]:\r\n            xsize = 40\r\n            ysize = 24\r\n        elif target in [\"c64\", \"c16\", \"plus4\", \"c128\", \"vg5k\", \"cbm510\", \"msdos\", \"bee\"]:\r\n            xsize = 40\r\n            ysize = 25\r\n        elif target in [\"sam\"]:\r\n            xsize = 32\r\n            ysize = 22\r\n        elif target in [\"camputers_lynx\"]:\r\n            xsize = 32\r\n            ysize = 32\r\n        elif target == \"vic20\":\r\n            xsize = 22\r\n            ysize = 23\r\n        elif target in [\"mo5\",\"to7\"]:\r\n            xsize = 39\r\n            ysize = 25\r\n        elif target in [\"coco\",\"dragon\", \"mc1000\"]:\r\n            xsize = 16\r\n            ysize = 24\r\n        elif target in [\"sms\", \"spectrum\", \"creativision\", \"msx\", \"mtx\", \\\r\n                        \"zx81\", \"zx80\", \"mtx512\", \"mtx500\", \"svi\", \"sg1000\", \\\r\n                        \"sc3000\", \"einstein\", \"m5\", \"ace\", \"coleco\", \\\r\n                        \"vz\", \"vz200\", \"coco3\"]:\r\n            xsize = 32\r\n            ysize = 24\r\n        elif target in [\"nes\"]:\r\n            xsize = 32\r\n            ysize = 28\r\n        elif target in [\"pet\", \"cbm610\"]:\r\n            xsize = 80\r\n            ysize = 25\r\n        elif target in [\"ncurses\", \"cpm\"]:\r\n            xsize = 80\r\n            ysize = 24\r\n        elif target in [\"pce\"]:\r\n            xsize = 60\r\n            ysize = 25\r\n        elif target in [\"ti99\"]:\r\n            xsize = 32\r\n            ysize = 23\r\n        elif target == \"cpc\":\r\n            xsize = 20\r\n            ysize = 25\r\n        elif target in [\"gb\", \"gg\", \"gamegear\"]:\r\n            xsize = 20\r\n            ysize = 18\r\n        elif target == \"atari7800\":\r\n            xsize = 20\r\n            ysize = 28\r\n        else:\r\n            xsize = None\r\n            ysize = None\r\n        return xsize, ysize\r\n\r\n\r\ndef default_terminal_size_string(target):\r\n    xsize, ysize = default_screen_size(target)\r\n    \r\n    if xsize == None:\r\n        xsize = DEFAULT_TERMINAL_X_SIZE\r\n        ysize = DEFAULT_TERMINAL_Y_SIZE\r\n    \r\n    xsize = str(xsize)\r\n    ysize = str(ysize)\r\n    return xsize, ysize\r\n\r\n\r\ndef get_terminal_target(target):\r\n    xtile, ytile = default_tile_size(target)\r\n    \r\n    return \"terminal\"+str(xtile)+'x'+str(ytile)\r\n\r\n\r\ndef insert_default_sizes(option_config, params):\r\n\r\n    if len(params)==4 and params[2].startswith('terminal'):\r\n        target = params[3]\r\n\r\n        terminal_target = get_terminal_target(target)\r\n\r\n        xsize, ysize = default_terminal_size_string(target)\r\n\r\n        return [params[0], params[1], terminal_target, xsize, ysize]\r\n\r\n    if len(params)==3 and params[2].startswith('terminal'):\r\n        terminal_target = params[2]\r\n        xsize, ysize = default_terminal_size_string(terminal_target)\r\n\r\n        return [params[0], params[1], terminal_target, xsize, ysize]\r\n    return params"
  },
  {
    "path": "src/modules/execute.py",
    "content": "from __future__ import print_function\r\n\r\ntry:\r\n    from inspect import signature\r\nexcept:\r\n    # from inspect import name_of\r\n    # import inspect2 \r\n    # signature = inspect2.signature(initializer)\r\n\r\n    \r\n    # import funcsigs\r\n    # signature = funcsigs.signature(initializer)\r\n    \r\n    # Dummy signature to get xl build to work under Python 2.7\r\n    from collections import namedtuple\r\n    Param = namedtuple('Param', 'parameters')\r\n    \r\n    def signature(name):\r\n        return Param([1,2])\r\n\r\n\r\nfrom modules.strings import *\r\nfrom modules.import_from_source import *\r\nfrom modules.tiles import *\r\nfrom modules.LoggerSingleton import LoggerSingleton\r\nfrom modules.init import *\r\nfrom modules.params import handle_two_letter_params, full_params, COMMANDS_LIST, get_size_params, get_params\r\nfrom modules.help_functions import help_command, manual\r\nfrom modules.file_functions import files, convert_makefile, files_in_path, dirs_in_path, built_files_in_path, list_of_projects, list_projects\r\nfrom modules.tests import *\r\nfrom modules.split_projects import *\r\nfrom modules.run import run_command, run\r\nfrom modules.commands import commands\r\nfrom modules.input_functions import generic_input, are_you_sure\r\nfrom modules.option_functions import *\r\nfrom modules.project_functions import rename, clone, create, delete\r\nfrom modules.target_defs import *\r\nfrom modules.clean_functions import clean, clean_test\r\nfrom modules.build_functions import *\r\nfrom modules.print_functions import bcolors, printc\r\n\r\ndef normalize_command(command_name):\r\n    return command_name.replace(\"list\",\"list_projects\").replace(\"help\", \"help_command\").replace(\"import\", \"import_from_source\")\r\n    \r\n    \r\n\r\ndef execute_command(option_config, params):\r\n    command_name = params[1]\r\n    if command_name in COMMANDS_LIST:\r\n        normalized_name = normalize_command(command_name)\r\n        params_string = \", params[1:]\" if len(signature(eval(normalized_name)).parameters)>1 else \"\"\r\n        print(normalized_name+\"(option_config\" + params_string + \")\")\r\n        print(params[1:])\r\n        eval(normalized_name+\"(option_config\" + params_string + \")\")\r\n    elif command_name in list_of_projects(\"all\") + [\"examples\"] + [\"games\"] + [\"projects\"] + [\"all\"]:\r\n        build(option_config, params)\r\n    else:\r\n        manual(option_config, params)\r\n\r\n\r\ndef execute_command(option_config, params):\r\n    command_name = params[1]\r\n    if command_name in COMMANDS_LIST:\r\n        normalized_name = normalize_command(command_name)\r\n        params_string = \", params[1:]\" if len(signature(eval(normalized_name)).parameters)>1 else \"\"\r\n        eval(normalized_name+\"(option_config\" + params_string + \")\")\r\n    elif command_name in list_of_projects(\"all\") + [\"examples\"] + [\"games\"] + [\"projects\"] + [\"all\"]:\r\n        build(option_config, params)\r\n    else:\r\n        manual(option_config, params)\r\n\r\n\r\ndef execute_string(option_config, command_line, silent = True):\r\n    params = command_line.split()\r\n\r\n    max_command_length = 0\r\n    for command in COMMANDS_LIST:\r\n        if len(command)>max_command_length:\r\n            max_command_length = len(command)\r\n\r\n    if not silent:\r\n        spaces_before = max_command_length + 1 - len(params[1]) \r\n        spaces_after = 40 - len(command_line)\r\n        printc(option_config, bcolors.OKBLUE, \"[\"+ params[1] +\"] \")\r\n        printc(option_config, bcolors.OKCYAN, (spaces_before * \" \") + command_line + (spaces_after * \" \") + \"\\n\")\r\n    execute_command(option_config, params)\r\n\r\n\r\n"
  },
  {
    "path": "src/modules/file_functions.py",
    "content": "from os import walk\r\n\r\nimport os\r\n\r\nfrom print_functions import printc, bcolors\r\n\r\ndef files_in_path(mypath):\r\n    files = []\r\n    for (_, _, filenames) in walk(mypath):\r\n        files.extend(filenames)\r\n        break\r\n    return files\r\n    \r\n\r\n\r\ndef dirs_in_path(mypath):\r\n    dirs = []\r\n    for (dirpath, dirnames, filenames) in walk(mypath):\r\n        dirs.extend(dirnames)\r\n        break\r\n    return dirs\r\n\r\n\r\n\r\n\r\ndef built_files_in_path(mypath):\r\n    files = []\r\n    for (_, _, filenames) in walk(mypath):\r\n        built_files = []\r\n        for filename in filenames:\r\n            if not filename.startswith('.'):\r\n                built_files.append(filename)\r\n\r\n        files.extend(built_files)\r\n        break\r\n    return files\r\n\r\n\r\ndef list_of_projects(project_category):\r\n    if project_category in [\"examples\", \"projects\", \"games\"]:\r\n        res = dirs_in_path(\"./\"+project_category)\r\n    else:\r\n        res = dirs_in_path(\"./examples\")+dirs_in_path(\"./games\")+dirs_in_path(\"./projects\")\r\n    return res\r\n\r\n\r\n# List all projects\r\ndef list_projects(option_config, params):\r\n\r\n    if len(params)<2:\r\n        project_dirs = [\"examples\", \"games\", \"projects\"]\r\n    elif params[1]==\"all\":\r\n        project_dirs = [\"examples\", \"games\", \"projects\"]\r\n    elif params[1] in [\"games\", \"examples\", \"projects\"]:\r\n        project_dirs = [params[1]]\r\n    elif params[1] in [\"new\"]:\r\n        project_dirs = [\"projects\"]\r\n    elif params[1] in [\"built-in\", \"builtin\"]:\r\n        project_dirs = [\"games\", \"examples\"]\r\n    else:\r\n        return\r\n\r\n    count = 0\r\n\r\n    for mypath in project_dirs:\r\n        if not option_config.terminal_config.test:\r\n            printc(option_config, bcolors.BOLD, \"[\"+mypath+\"]\\n\")\r\n        for (_, dirnames, _) in walk(mypath):\r\n            # projects.extend(dirnames)\r\n            for project in dirnames:\r\n                if not option_config.terminal_config.test:\r\n                    print(\"  \"+str(project))\r\n                count+=1\r\n            break\r\n        if not option_config.terminal_config.test:\r\n            print(\"\")\r\n\r\n    if option_config.terminal_config.verbose:\r\n        print(\"Projects found: \" + str(count))\r\n        print(\"\")\r\n\r\n    return count\r\n\r\n\r\n\r\n\r\ndef convert_makefile(option_config, dir,old_type,old_name,new_name):\r\n\r\n    dest_path = \"projects/\"+dir\r\n    source_game_dir = old_name\r\n    target_game_dir = new_name\r\n    source_parent_dir = old_type\r\n    target_parent_dir = \"projects\"\r\n\r\n    if option_config.terminal_config.verbose:\r\n        print(\"- dir: \" + dir)\r\n        print(\"- old_type: \" + old_type)\r\n        print(\"- old_name: \" + old_name)\r\n        print(\"- new_game: \" + new_name)\r\n\r\n    fin = open(\"./\"+dest_path+\"/Makefile.\"+source_game_dir, \"rt\")\r\n    data = fin.read()\r\n    data = data.replace('CROSS-' + source_game_dir.upper(),'CROSS-'+target_game_dir.upper())\r\n    data = data.replace('GAME_NAME := ' + source_game_dir, 'GAME_NAME := '+target_game_dir)\r\n    data = data.replace('PARENT_DIR = ' + source_parent_dir + \"s\", \\\r\n           'PARENT_DIR = ' + target_parent_dir)\r\n\r\n    data = data.replace('include ./' + old_type + \"s/\" + source_game_dir, \\\r\n           'include ./projects/' + target_game_dir)\r\n    fin.close()\r\n    fin = open(\"./\"+dest_path+\"/Makefile.\"+target_game_dir, \"wt\")\r\n    fin.write(data)\r\n    fin.close()\r\n\r\n    os.remove(\"./\"+dest_path+\"/Makefile.\"+source_game_dir)\r\n\r\n\r\n# Show all generated files\r\ndef files(option_config):\r\n    make_command = \"ls -ls ../build\"\r\n    os.system(make_command)\r\n"
  },
  {
    "path": "src/modules/help_functions.py",
    "content": "from __future__ import print_function\r\n\r\n\r\nimport os\r\n\r\nfrom params import COMMANDS_LIST, COMMANDS_DESCRIPTIONS, commands, full_params\r\nfrom import_from_source import printc, bcolors\r\nfrom file_functions import *\r\nfrom input_functions import generic_input\r\n\r\nimport time\r\nimport sys\r\n\r\n\r\ndef list_of_documented_routines():\r\n    manual_files = files_in_path(\"../docs/manual/\")\r\n    documented_routines = []\r\n    for manual_file in manual_files:\r\n        documented_routines.append(manual_file.replace(\".txt\",\"\"))\r\n    return documented_routines\r\n\r\ndef list_documented_routines():\r\n    documented_routines = list_of_documented_routines()\r\n    for documented_routine in documented_routines:\r\n        print(documented_routine)\r\n\r\ndef manual(option_config, params):\r\n    if len(params)==1:\r\n        printc(option_config, bcolors.OKCYAN, \"DOCUMENTED ROUTINES\\n\")\r\n        list_documented_routines()\r\n        print(\"\")\r\n        print(\"Use\")\r\n        printc(option_config, bcolors.BOLD,\"xl manual <routine>\\n\")\r\n        return\r\n    if params[1].startswith(\"_XL\") or params[1] in [\"XSize\", \"YSize\"]:\r\n        command_string = \"cat ../docs/manual/\" + params[1] + \".txt\"\r\n    else:\r\n        command_string = \"cat ../docs/manual/_XL_\" + params[1] + \".txt\"\r\n    res = os.system(command_string)\r\n    if res:\r\n        printc(option_config, bcolors.WARNING,\"\\nCommand/topic not found\\n\")\r\n\r\n\r\ndef help_help(option_config):\r\n    print(\"Possible values for <command>:\")\r\n    print(' '.join(str(cmd) for cmd in COMMANDS_LIST))\r\n    print(\"\")\r\n    printc(option_config, bcolors.BOLD,\"xl help <command or routine>\\n\")\r\n    print(\"for <command>-specific help\")\r\n    print(\"\\nExample:\")\r\n    print(\"\\nxl help create              \\n  It displays the help page for the 'create' xl script command\")\r\n    print(\"\")\r\n    print(\"\\nxl help _XL_DRAW              \\n  It displays the help page for the '_XL_DRAW' C routine\")\r\n    print(\"\")\r\n    printc(option_config, bcolors.OKCYAN,\"POSSIBLE COMMANDS\")\r\n    print(\"\")\r\n    commands(option_config)\r\n    print(\"\\nUse\")\r\n    printc(option_config, bcolors.BOLD,\"xl help manual\")\r\n    print(\"\\nto get the list of documented C routines.\")\r\n    print(\"\\nUse\")\r\n    printc(option_config, bcolors.BOLD,\"xl manual\")\r\n    print(\"\\nto get the full manual for the C routines.\")\r\n    \r\n\r\n\r\ndef help_command(option_config, params):\r\n    if len(params)<2:\r\n        printc(option_config, bcolors.BOLD,\"\\nxl <command> <[optional] parameters>\")\r\n        print(\"\\n(or xl <project> <[optional] parameters> as a shorthand for \\n xl build <project> <[optional] parameters>)\")\r\n        print(\"\")\r\n        help_help(option_config)\r\n    elif params[1] in COMMANDS_DESCRIPTIONS.keys():\r\n\r\n        print(\"Help on \", end=\"\")\r\n        printc(option_config, bcolors.OKCYAN, params[1]+\"\\n\")\r\n        print(\"It \" + COMMANDS_DESCRIPTIONS[params[1]] + \"\\n\")\r\n        params = full_params(params)\r\n        if params[1]==\"assets\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl assets <project>\\n\")\r\n            print(\"\")\r\n            print(\"It generates assets files for <project> (new or existing project) by using tile or shape files.\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"Edit any shape file in ./projects/foo/shapes/8x8/\")\r\n            print(\"xl assets foo\")\r\n            print(\"xl show foo (to check the result)\")\r\n            print(\"The output will be in ./projects/foo/generated_assets/\")\r\n\r\n        elif params[1]==\"split\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl split <file>\\n\")\r\n            print(\"\")\r\n            print(\"It displays a shape file as two shapes, one for the left and one for the right side.\")\r\n            print(\"Example:\")\r\n            print(\"xl split games/shuriken/docs/16x12_multi_tile.txt\")\r\n            print(\"\")\r\n            print(\"...#####\")\r\n            print(\".###....\")\r\n            print(\"##.....#\")\r\n            print(\"#..#####\")\r\n            print(\"#...#..#\")\r\n            print(\"#...####\")\r\n            print(\"##..#...\")\r\n            print(\".###....\")\r\n            print(\"...#####\")\r\n            print(\"........\")\r\n            print(\"........\")\r\n            print(\"........\")\r\n            print(\"\")\r\n            print(\"#.......\")\r\n            print(\"###.....\")\r\n            print(\"..##....\")\r\n            print(\"...#....\")\r\n            print(\"...#....\")\r\n            print(\"#..#....\")\r\n            print(\"..##....\")\r\n            print(\"###.....\")\r\n            print(\"#.......\")\r\n            print(\"........\")\r\n            print(\"........\")\r\n            print(\"........\")\r\n\r\n        elif params[1]==\"config\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl config\\n\")\r\n            print(\"\")\r\n            print(\"It displays the configuration as read from config.ini\")\r\n            print(\"Example:\")\r\n            print(\"xl config\")\r\n        elif params[1]==\"extend\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl extend <project>\\n\")\r\n            print(\"\")\r\n            print(\"It generates candidate shapes of different sizes from the 8x8 shapes of <project>.\")\r\n            print(\"Example:\")\r\n            print(\"In order to generate candidate shapes for foo using 8x8 shapes, you can do:\")\r\n            print(\"xl extend foo\")\r\n        elif params[1]==\"make\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl make <project> <target>\\n\")\r\n            print(\"\")\r\n            print(\"It re-builds <project> for <target> and its assets by using the pictorial text files in the shapes directory.\")\r\n            print(\"It is equivalent to:\")\r\n            print(\"xl tiles <project> <target>\")\r\n            print(\"xl rebuild <project> <target>\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"xl make foo vic20\")\r\n            print(\"builds the project foo and its assets from the pictorial text file for the Vic 20\")\r\n        elif params[1]==\"tools\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl tools\\n\")\r\n            print(\"\\n(or xl build tools)\")\r\n            print(\"\")\r\n            print(\"It builds some post-processing tools from their source code.\")\r\n            print(\"\")\r\n            print(\"This command has to be run only once to build the tools. The tools are used by few targets to generate ready to use images.\")\r\n        elif params[1]==\"rename\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl rename <old project name> <new project name>\\n\")\r\n            print(\"It renames an existing user-defined project <old project name> to <new project name>.\")\r\n            print(\"\")\r\n            print(\"Remark: No matter the type of source project, the target project will be in the 'src/projects' directory\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"If you have previously created a new project 'foo'\")\r\n            print(\"(e.g., by cloning it with 'xl clone bomber foo'),\")\r\n            print(\"then you can rename it to 'bar' with\")\r\n            print(\"xl rename foo bar\")\r\n        elif params[1]==\"clone\":\r\n            printc(option_config, bcolors.BOLD,\"\\nxl clone <source project> <target project>\\n\")\r\n            print(\"It clones an existing project of any type to create a new user-defined project.\")\r\n            print(\"\")\r\n            print(\"Remark: No matter the type of source project, the target project will be in the 'src/projects' directory\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"If you want to clone the built-in game Cross Horde you can just do:\")\r\n            print(\"xl clone horde foo\")\r\n            print(\"\")\r\n            print(\"If you have previously created a user-defined project 'foo',\")\r\n            print(\"you can further clone it with:\")\r\n            print(\"xl clone foo bar\")\r\n        elif params[1]==\"show\":\r\n            printc(option_config, bcolors.BOLD,\"xl show <project> <[optional] TileIndex> <[optional] XTileSize> <[optional] YTileSize> .\\n\")\r\n            print(\"It displays the shape of graphics tiles of a given project.\")\r\n            print(\"\")\r\n            print(\"<project>\")\r\n            print(\"Use this mandatory parameter to specify the project whose tiles you want to display\")\r\n            print(\"\")\r\n            print(\"<TileIndex>\")\r\n            print(\"This optional parameter specifies which tile we want to display.\")\r\n            print(\"When no index is specified, then all tiles of the given shape are displayed.\")\r\n            print(\"\")\r\n            print(\"<XTileSize> <YTileSize>\")\r\n            print(\"These optional parameters specify the size of the tiles we want to see\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"xl show chase 5 8 8\")\r\n            print(\"Decoding file tile: ./games/chase/tiles/8x6/tile5.txt\")\r\n            print(\"\")\r\n            print(\".######.\")\r\n            print(\"#.#..#.#\")\r\n            print(\"#..##..#\")\r\n            print(\"#..##..#\")\r\n            print(\"#.#..#.#\")\r\n            print(\".######.\")\r\n\r\n\r\n        elif params[1]==\"size\":\r\n            printc(option_config, bcolors.BOLD,\"xl size <project> <XSize> <YSize>\\n\")\r\n            print(\"It builds <project> for the native host with screen size provided by <XSize> and <YSize>.\")\r\n            print(\"The built binaries will be in the 'build' directory.\")\r\n\r\n            print(\"\\n<project>\")\r\n            print(\"<project> can also be 'games'/'examples'/'projects'/'all' to build multiple projects.\")\r\n\r\n            print(\"\\nxl size bomber 20 20       \\n  It builds Cross Bomber for the native host with screen size 20x20.\")\r\n            print(\"\\nxl size examples 16 12     \\n  It builds all examples for the native host with screen size 16x12.\")\r\n\r\n        elif params[1]==\"run\":\r\n            printc(option_config, bcolors.BOLD,\"xl run <project> <[optional] xsize> <[optional] ysize>\\n\")\r\n            printc(option_config, bcolors.BOLD,\"xl run <project> <[optional] target>\\n\")\r\n            print(\"If no target is specified, it runs the previously compiled native version of <project>.\")\r\n            print(\"If integer parameters <xsize> and <ysize> are provided, then it runs the version of those sizes.\")\r\n            print(\"\")\r\n            print(\"<project>\")\r\n            print(\"This parameter is the name of the project that we want to run.\")\r\n            print(\"\")\r\n            print(\"<xsize> <ysize>\")\r\n            print(\"These parameters are the size of the native version that we want to run.\")\r\n            print(\"\")\r\n            print(\"<target>\")\r\n            print(\"This parameter is the target for which we want to run <project>.\")\r\n            print(\"This parameter only works for a restricted set of targets and it requires an emulator.\")\r\n            print(\"\")\r\n            print(\"Examples:\")\r\n            print(\"xl run snake\")\r\n            print(\"It runs the previously built (e.g., with 'xl build snake') native version of Cross Snake.\")\r\n            print(\"\")\r\n            print(\"xl run snake 16 16\")\r\n            print(\"It runs the previously built with size 16X16 (with 'xl size snake 16 16') native version of Cross Snake.\")\r\n        elif params[1]==\"manual\":\r\n            printc(option_config, bcolors.BOLD,\"xl manual <[optional] routine>\\n\")\r\n            print(\"If no optional parameter is passed it displays a list of documented CROSS-LIB APIs.\")\r\n            print(\"If a Cross-Lib C rouine is passed as an optional parameter, it displays its description and usage\")\r\n            print(\"\")\r\n            print(\"Documented commands:\")\r\n            list_documented_routines()\r\n        elif params[1]==\"string\":\r\n            printc(option_config, bcolors.BOLD,\"xl string <string>\\n\")\r\n            print(\"It converts a string litteral into a concatenation of\")\r\n            print('_XL_A,..., _XL_Z, _XL_a, ..., _XL_z, _XL_SPACE, \"0\", ..., \"9\"')\r\n            print(\"<string>\")\r\n            print(\"This parameter is the string to convert. It has to match the regular expression '[A-Za-z0-9 ]*'.\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print('xl string \"1 Hello World 2\"')\r\n            print('\"1\" _XL_SPACE _XL_H _XL_e _XL_l _XL_l _XL_o _XL_SPACE _XL_W _XL_o _XL_r _XL_l _XL_d _XL_SPACE \"2\"')\r\n        elif params[1]==\"rebuild\":\r\n            printc(option_config, bcolors.BOLD,\"xl rebuild <project> <[optional] target>\\n\")\r\n            print(\"It rebuilds <project>.\")\r\n            # print(\"Remark: The 'build' command can be omitted.\")\r\n\r\n            print(\"It is equivalent to 'xl reset' followed by 'xl build <project> <target>'\")\r\n            print(\"Use 'xl help reset' and 'xl help build' for more information\")\r\n        elif params[1]==\"import\":\r\n            printc(option_config, bcolors.BOLD,\"xl import <source_file> <[optional] project>\\n\")\r\n            print(\"\")\r\n            print(\"<source_file>\")\r\n            print(\"It is an Assembly or BASIC file (e.g., an Assembly file exported from CharPad or VChar64).\")\r\n            print(\"For example in CharPad you can export the tile data with:\")\r\n            print(\"File->Import/Export->Text/Asm->Export All or File->Import/Export->Text/Asm->Export All\")\r\n            print(\"\")\r\n            print(\"<project>\")\r\n            print(\"If a project name is passed then the tiles are imported into <project> as 8x8 tiles\")\r\n            print(\"\")\r\n            print(\"Remark: For extra heuristics useful on some BASIC files use 'xl rip'\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"If you create a new project 'myname' with\")\r\n            print(\"xl create myname\")\r\n            print(\"You can import a tile into it from an Assembly file with something like this:\")\r\n            print(\"xl import ./assets/examples/tile_sets/asm/tile_8x6_shapeA.txt myname\")\r\n        elif params[1]==\"rip\":\r\n            printc(option_config, bcolors.BOLD,\"xl rip <source_file> <[optional] project>\\n\")\r\n            print(\"\")\r\n            print(\"<source_file>\")\r\n            print(\"It is an Assembly or BASIC file (e.g., an Assembly file exported from CharPad or VChar64).\")\r\n            print(\"For example in CharPad you can export the tile data with:\")\r\n            print(\"File->Import/Export->Text/Asm->Export All or File->Import/Export->Text/Asm->Export All\")\r\n            print(\"\")\r\n            print(\"<project>\")\r\n            print(\"If a project name is passed then the tiles are imported into <project> as 8x8 tiles\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"If you create a new project 'myname' with\")\r\n            print(\"xl create myname\")\r\n            print(\"You can import a tile into it from an Assembly file with something like this:\")\r\n            print(\"xl rip ./assets/examples/tile_sets/asm/tile_8x6_shapeA.txt myname\")\r\n        elif params[1]==\"info\":\r\n            printc(option_config, bcolors.BOLD,\"xl info <target>/<project>\\n\")\r\n            print(\"\")\r\n            print(\"If the parameter is a target, it displays some information on the target <target> and how it is supported in `terminal` mode.\") \r\n            print(\"\")\r\n            print(\"If the parameter is a project, it displays some information on the project <project>.\")\r\n        elif params[1]==\"rotate\":\r\n            printc(option_config, bcolors.BOLD,\"xl rotate <source_file> <[optional] project>\\n\")\r\n            print(\"\")\r\n            print(\"It works similarly to 'xl import <source> <[optional] project>' but rotates the result.\")\r\n            print(\"\")\r\n            print(\"<source_file>\")\r\n            print(\"It is an Assembly or BASIC file (e.g., an Assembly file exported from CharPad or VChar64).\")\r\n            print(\"For example in CharPad you can export the tile data with:\")\r\n            print(\"File->Import/Export->Text/Asm->Export All or File->Import/Export->Text/Asm->Export All\")\r\n            print(\"\")\r\n            print(\"<project>\")\r\n            print(\"If a project name is passed then the tiles are imported into <project> as 8x8 tiles\")\r\n            print(\"\")\r\n            print(\"Example:\")\r\n            print(\"If you create a new project 'myname' with\")\r\n            print(\"xl create myname\")\r\n            print(\"You can import a tile into it from an Assembly file with something like this:\")\r\n            print(\"xl rotate ./modules/examples/tile_sets/asm/tile_8x6_shapeA.txt myname\")\r\n        elif params[1]==\"tile\":\r\n            printc(option_config, bcolors.BOLD,\"xl tile <shape_file> <[optional] project> <[optional] tile_index>\\n\")\r\n            print(\"It converts the pictorial text file file <shape_file> into a line that can be used as an asset file.\")\r\n            print(\"\")\r\n            print(\"<shape_file>\")\r\n            print(\"The file <shape_file> describes with '#' and '.' the shape of a tile.\")\r\n            print(\"\")\r\n            print(\"<project>\")\r\n            print(\"This optional parameter specifies the project whose tile we want to modify\")\r\n            print(\"\")\r\n            print(\"<tile_index>\")\r\n            print(\"This parameter is the index of the tile we want to modify\")\r\n\r\n            print(\"\\nPress ENTER to continue...\")\r\n            time.sleep(1)\r\n\r\n            generic_input(\"\")\r\n\r\n            print(\"\\nExample in 'src/examples/tiles/tile_shape0.txt':\")\r\n            print(\"...##...\")\r\n            print(\"..#..#..\")\r\n            print(\"...##...\")\r\n            print(\".##..##.\")\r\n            print(\"#.####.#\")\r\n            print(\"# ####.#\")\r\n            print(\"..#..#..\")\r\n            print(\"..#..#..\")\r\n            print(\"\")\r\n            print(\"xl tile ./modules/examples/single_tiles/tile_shape0.txt\")\r\n            print(\"produces: \")\r\n            print(\"24,36,24,102,189,189,36,36\")\r\n            print(\"\")\r\n            print(\"To be copied in 'tile_<index>.txt' in '<project>/tiles/8x8' to modify the shape.\")\r\n            print(\"Remark: run 'xl reset <project>' before rebuilding <project> with modified tiles.\")\r\n\r\n        elif params[1]==\"tiles\":\r\n            printc(option_config, bcolors.BOLD,\"xl tiles <project> <[optional] xsize> <[optional] ysize>\\n\")\r\n            printc(option_config, bcolors.BOLD,\"xl tiles <project> <[optional] target>\\n\")\r\n            print(\"It converts all shape files into tiles and stores them as such in the project.\")\r\n            print(\"It imports from files named 'shape<number>.txt' inside the directories in the 'shapes' directory of a given project\")\r\n            print(\"The shape file format is the one used by 'xl tile'. Run 'xl help tile' for more information.\")\r\n            print(\"If no optional parameter is passed, then 8x8 shape is assumed\")\r\n            print(\"If a target is passed as parameter it will guess xsize and ysize for that target.\")\r\n            print(\"\")\r\n            print(\"Example: \")\r\n            print(\"Provided that you have a project named 'foo', the command\")\r\n            print(\"xl tiles foo 6 8\")\r\n            print(\"will import as tiles from all shape files 'shape<number>.txt' (found in './projects/foo/shapes/6x8') into './projects/foo/tiles/6x8/'\")\r\n\r\n        elif params[1]==\"self\":\r\n            printc(option_config, bcolors.BOLD,\"xl self\\n\")\r\n            print(\"It tests itself by performing a sequence of 'xl' commands.\")\r\n            print(\"\")\r\n        elif params[1]==\"unit-tests\":\r\n            printc(option_config, bcolors.BOLD,\"xl self\\n\")\r\n            print(\"It runs unit-tests on the script code.\")\r\n        elif params[1]==\"compilers\":\r\n            printc(option_config, bcolors.BOLD,\"xl self\\n\")\r\n            print(\"It checks the presence of the most common compilers.\")\r\n        elif params[1]==\"check\":\r\n            printc(option_config, bcolors.BOLD,\"xl check <[optional] params>\\n\")\r\n            print(\"It runs some check on the dependencies.\")\r\n            print(\"\")\r\n            print(\"<params>\")\r\n            print(\"If nothing is passed to <params>, then it performs several checks.\")\r\n            print(\"If <params> is 'compilers', then it checks the presence of the most common compilers.\")\r\n            print(\"If <params> is 'tools', then it checks the presence of the most common tools.\")\r\n            print(\"If <params> is 'emulators', then it checks the presence of the emulators used by xl.\")\r\n            print(\"If <params> is 'interpreters', then it checks the presence of the interpreters used by xl.\")\r\n            print(\"If <params> is 'libraries', then it checks the presence of the libraries used by xl.\")\r\n        elif params[1]==\"test\":\r\n            printc(option_config, bcolors.BOLD,\"xl test <[optional] params> <[optional] target>\\n\")\r\n            print(\"It runs some operations to test 'xl'.\")\r\n            print(\"\")\r\n            print(\"<params>\")\r\n            print(\"If nothing is passed to <params>, then it performs several tests including the self-test.\")\r\n            print(\"If 'self' is passed to <params>, then it tests itself by performing a sequence of 'xl' commands.\")\r\n            print(\"If <params> is 'compilers', then it checks the presence of the most common compilers.\")\r\n            print(\"If <params> is 'tools', then it checks the presence of the most common tools.\")\r\n            print(\"If <params> is 'emulators', then it checks the presence of the emulators used by xl.\")\r\n            print(\"If <params> is 'interpreters', then it checks the presence of the interpreters used by xl.\")\r\n            print(\"If <params> is 'libraries', then it checks the presence of the libraries used by xl.\")\r\n            print(\"If <params> is a game/example/project, it checks if a binary for <target> (native if no <target>), can be built for the project.\")\r\n            print('If <params> is \"games\" or \"examples\", it checks if binaries for <target> (native if no <target>) can be built for all games/examples.')\r\n            print(\"If 'cc65', 'z88dk, 'cmoc', 'ack', 'cc6303', 'vbcc', 'lcc1802' or 'native' is passed to <params>, it compiles a test program using the corresponding compiler.\")\r\n            print(\"If 'z88dk_alt' is passed to <params>, then it compiles a different test program using both Z88DK compilers.\")\r\n            print(\"If 'unit-tests' is passed to <params>, then it runs unit-tests on the script code.\")\r\n        elif params[1]==\"files\" or params[1]==\"f\":\r\n            printc(option_config, bcolors.BOLD,\"xl files\\n\")\r\n            print(\"It shows the built binary files (the conent of the `build` directory).\\n\")\r\n            print(\"Remark: 'xl files' can be shorten with `xl f`.\")\r\n        elif params[1]==\"slow\":\r\n            printc(option_config, bcolors.BOLD,\"xl slow <project> <target> <slowdown>\\n\")\r\n            print(\"It builds <project> for <target> with (total) slowdown given by <slowdown>\")\r\n            print(\"\\nExamples:\")\r\n            print(\"\\nxl slow horde vic20 800     \\n  It builds Horde for the Commodore Vic 20 using CC65 with (total) slowdown equal to 800.\")\r\n        elif params[1]==\"build\":\r\n            printc(option_config, bcolors.BOLD,\"xl build <project> <[optional] target> or xl <project> <[optional] target>\\n\")\r\n            print(\"It builds <project> for <target>.\")\r\n            print(\"The built binaries will be in the 'build' directory.\")\r\n\r\n            print(\"\\n<project>\")\r\n            print(\"<project> can also be 'games'/'examples'/'projects'/'all' to build multiple projects\")\r\n\r\n            print(\"\\n<target>\")\r\n            print(\"REMARK 1: If no <target> is passed, then the native target 'ncurses' (terminal console with ASCII tiles) is considered.\")\r\n            print(\"REMARK 2: If 'terminal' or 'terminal<N><M>' is passed as target, then the native terminal 'graphics' is considered with tiles with NxM pixels.\\nThis target requires you to reduce the font size to discern the graphics.\")\r\n            print(\"The 'terminal<N><M>' keyword  can be followed by <xsize> and <ysize> to specify the screen shape.\")\r\n            print(\"\\nIf '<dev-kit>_targets' is passed as <target> (e.g., 'cc65_targets'), \\nthen the given project/s is/are built for all targets that use <dev-kit> to be compiled.\")\r\n            print(\"Possible dev-kits are: 'cc65', 'z88dk', 'cmoc', 'lcc1802'.\")\r\n            print(\"\\n[NOT recommended] If 'all' is passed as <target>, then the given project/s is/are built for all targets (it may take very long and it requires all supported compilers.\")\r\n\r\n            print(\"\\nPress ENTER to continue...\")\r\n            time.sleep(1)\r\n\r\n            generic_input(\"\")\r\n\r\n            print(\"\\nExamples:\")\r\n            print(\"\\nxl build bomber vic20       \\n  It builds Cross Bomber for the Commodore Vic 20 using CC65.\")\r\n            print(\"\\nxl snake                    \\n  It builds Cross Snake for the native target (terminal console).\")\r\n            print(\"\\nxl chase cc65_targets       \\n  It builds Cross Chase for all targets that use CC65 to be built.\")\r\n            print(\"\\nxl games cpc                \\n  It builds all games for the Amstrad CPC using Z88DK.\")\r\n            print(\"\\nxl examples c64             \\n  It builds all examples for the Commodore 64 using CC65.\")\r\n            print(\"\\nxl horde all                \\n  It builds Cross Horde for all its supported targets using all supported necessary compilers.\")\r\n            print(\"\\nxl projects all             \\n  It builds all built-in projects for all supported targets using all supported necessary compilers.\")\r\n            print(\"\\nxl all c16                  \\n  It builds all projects (games and examples and user-defined projects) for the Commodore 264 series using CC65.\")\r\n        elif params[1]==\"create\":\r\n            printc(option_config, bcolors.BOLD,\"xl create <project> <[optional] type>\\n\")\r\n            print(\"It creates <project>.\")\r\n\r\n            print(\"\\n<type>\")\r\n            print(\"If no <type> is passed, then the initial code will just display 'hello world'\")\r\n            print(\"If 'game' is passed as <type>, then the project is build with some initial template game code.\")\r\n            print(\"If 'apis' is passed as <type>, then the project is build with some code that shows how to use all APIs.\")\r\n\r\n            print(\"\\nExamples:\")\r\n            print(\"\\nxl create foo               \\n  It builds a new project 'foo' with some initial code that display 'hello world' on the screen.\")\r\n            print(\"\\nxl create bar game          \\n  It builds a new project 'bar' with some initial game code (main loop, level loop, etc.).\")\r\n        elif params[1]==\"delete\":\r\n            printc(option_config, bcolors.BOLD,\"xl delete <project> <[optiona] interactive>\\n\")\r\n            print(\"It removes <project>, i.e., it deletes its folder with its content (source code, graphics assets, makefile).\")\r\n\r\n            print(\"\\n<project>\")\r\n            print(\"<project> cannot be a built-in project.\")\r\n\r\n            print(\"\\n<interactive>\")\r\n            print(\"If '-y' is passed as <interactive>, then the command won't ask for confirmation.\")\r\n\r\n            print(\"\\nExample:\")\r\n            print(\"\\nxl delete foo               \\n  It deletes the project 'foo'.\")\r\n            print(\"\\nxl delete foo -y            \\n  Same as above but no confirmation is asked.\")\r\n        elif params[1]==\"reset\":\r\n            printc(option_config, bcolors.BOLD,\"xl reset <[optional] project>\\n\")\r\n            print(\"It deletes temporary files created during the build process.\")\r\n            print(\"\\n<project>\")\r\n            print(\"If no <project> is passed, only non-project specific temporary files are deleted.\")\r\n            print(\"If the <project> parameter is used, then also project-specific temporary files are deleted (and in particular generated graphics assets).\")\r\n\r\n\r\n            print(\"\\nExamples:\")\r\n            print(\"\\nxl reset                    \\n  It deletes non-project specific temporary files.\")\r\n            print(\"\\nxl reset foo                \\n  It deletes all temporary files (both generic and project-specific).\")\r\n        elif params[1]==\"clean\":\r\n            printc(option_config, bcolors.BOLD,\"xl clean <[optional] project>\\n\")\r\n            print(\"It deletes both built binaries and temporary files created during the build process.\")\r\n            print(\"\\n<project>\")\r\n            print(\"If no <project> is passed, only built binaries and non-project specific temporary files are deleted.\")\r\n            print(\"If the <project> parameter is used, then also project-specific temporary files are deleted (e.g., generated graphics assets).\")\r\n\r\n            print(\"\\nExamples:\")\r\n            print(\"\\nxl clean                    \\n  It deletes all built binaries and non-project specific temporary files.\")\r\n            print(\"\\nxl clean foo                \\n  It deletes all built-in binaries and all temporary files (both generic and project-specific).\")\r\n\r\n        elif params[1]==\"list\" or params[1]==\"l\":\r\n            printc(option_config, bcolors.BOLD,\"xl list <[optional] params>\\n\")\r\n            print(\"It lists current projects in a given category or all projects.\")\r\n            print(\"\")\r\n            print(\"<params>\")\r\n            print(\"If nothing is passed as <params> then all projects are built\")\r\n            print(\"If 'games','examples' or 'projects' is passed as <params> then only projects in the respective directory are listed\")\r\n            print(\"\\nExamples:\")\r\n            print(\"xl list                       \\n  It lists all projects (games, examples and new projects)\")\r\n            print(\"xl list projects              \\n  It lists all user-defined projects\")\r\n\r\n        elif params[1]==\"commands\":\r\n            printc(option_config, bcolors.BOLD,\"xl commands\\n\")\r\n            print(\"It displays the available commands.\")\r\n\r\n        elif params[1]==\"help\" or params[1]==\"h\":\r\n            printc(option_config, bcolors.BOLD,\"xl help <[optional] command>\\n\")\r\n            print(\"It displays help instructions.\")\r\n\r\n\r\n            print(\"\\n<command>\")\r\n            help_help(option_config)\r\n    elif params[1] in list_of_documented_routines():\r\n        manual(option_config, params)\r\n\r\n    else:\r\n        print(\"Command not recognized\")\r\n        help_help(option_config)\r\n\r\n"
  },
  {
    "path": "src/modules/import_from_source.py",
    "content": "from __future__ import print_function\r\n\r\nimport sys\r\nimport os\r\n\r\nfrom print_functions import *\r\nfrom project_functions import project_category\r\nfrom shape_functions import read_shape, compute_shape, compute_rotated_shape\r\nfrom init import NUMBER_OF_TILES\r\n\r\n\r\n\r\n# Patterns used to rip and import tile data\r\nONE_REPPRESENTATIONS = [\"#\",\"*\",\"X\",\"x\",\"1\",\"+\",\"@\",\"$\",\"O\",\"o\"]\r\nASSEMBLY_EXTENSIONS = [\".s\",\".asm\",\".a99\",\".as\", \".acme\"]\r\nBASIC_EXTENSIONS    = [\".bas\", \".lb\", \".b\", \".lst\"]\r\nBYTE_PATTERN_LIST = [\".byte\",\"!byte\",\"defb\",\"fcb\",\"db\",\"dc.b\",\"byte\",\".BYTE\",\"!BYTE\",\"DEFB\",\"FCB\",\"DB\",\"DC.B\",\"BYTE\",\"!Byte\",\".Byte\"]\r\nWORD_PATTERN_LIST = [\".word\",\"!word\",\"defw\",\"fcw\",\"dw\",\"dc.w\",\"data\",\".WORD\",\"!WORD\",\"DEFW\",\"FCW\",\"DW\",\"DC.W\",\"DATA\",\"!Word\",\".Word\"]\r\nASSEMBLY_PATTERN_LIST = BYTE_PATTERN_LIST + WORD_PATTERN_LIST\r\nBASIC_ONLY_NO_SKIP_PATTERN_LIST = [\"dA\", \"BIN\", \"d.\", \"D.\"]\r\nBASIC_ONLY_SKIP_PATTERN_LIST = [ \"symbol\", \"SYMBOL\", \"vdu 23,\", \"VDU 23,\", \"vdu23,\", \"VDU23,\"]\r\nBASIC_ONLY_PATTERN_LIST = BASIC_ONLY_NO_SKIP_PATTERN_LIST + BASIC_ONLY_SKIP_PATTERN_LIST\r\nPATTERN_LIST = ASSEMBLY_PATTERN_LIST + BASIC_ONLY_PATTERN_LIST\r\nSKIP_PATTERN_LIST = BASIC_ONLY_SKIP_PATTERN_LIST\r\n\r\n\r\n# Detect Assembly extension\r\ndef has_extension(string, patterns):\r\n    for i in range(len(patterns)):\r\n        if string.endswith(patterns[i]) or string.endswith(patterns[i].upper()):\r\n            return True\r\n    return False\r\n\r\n\r\n# BASIC if nothing is found between commas in BASIC than insert a \"0\" character\r\ndef fill_empty_slots_with_zero(data_list):\r\n    new_list = []\r\n    for i in range(len(data_list)):\r\n        if data_list[i]==\"\":\r\n            new_list.append(\"0\")\r\n        else:\r\n            new_list.append(data_list[i])\r\n\r\n    return new_list\r\n\r\n\r\n# Try to detect hex data without hex prefixes\r\ndef has_headless_hex(trimmed_lines):\r\n    if \"$\" not in str(trimmed_lines) and \"&\" not in str(trimmed_lines):\r\n        for i in range(len(trimmed_lines)):\r\n            data = trimmed_lines[i].split(\",\")\r\n            for j in range(len(data)):\r\n                if len(data[j])!=2:\r\n                    return False\r\n        return True\r\n    else:\r\n        return False\r\n\r\n\r\ndef has_nine_byte_lines(trimmed_lines):\r\n    for i in range(len(trimmed_lines)):\r\n        length = len(trimmed_lines[i].split(\",\"))\r\n        if length!=9:\r\n            return False\r\n    return True\r\n\r\n\r\ndef normalize_basic_line(line):\r\n    # Convert hex notation to $\r\n    line = line.replace(\"&H\",\"$\").replace(\"&h\",\"$\")\r\n\r\n    # Capture binary BIN UDG in Sinclair BASIC\r\n    line = line.replace(\"BIN\", \"\\nBIN@\")\r\n\r\n    if(\"symbolafter\" in line) or (\"symbol after\" in line):\r\n        line = \"\"\r\n    if(\"SYMBOLAFTER\" in line) or (\"SYMBOL AFTER\" in line):\r\n        line = \"\"\r\n\r\n    return line\r\n\r\n\r\ndef normalize_assembly_line(line):\r\n    # Convert hex notation to $\r\n    line = line.replace(\">\",\"$\").replace(\"#\",\"$\").replace(\"0x\",\"$\").replace(\"&H\",\"$\").replace(\"&h\",\"$\")\r\n\r\n    # Convert bin notation to @\r\n    line = line.replace(\"%\",\"@\").replace(\"0b\",\"@\")\r\n\r\n    return line\r\n\r\n\r\ndef normalize_line(line, basic_extension, assembly_extension):\r\n    # Remove spaces and new lines\r\n    line = line.replace(\" \",\"\").replace(\"\\n\",\"\")\r\n\r\n    if assembly_extension:\r\n        return normalize_assembly_line(line)\r\n    elif basic_extension:\r\n        return normalize_basic_line(line)\r\n    else:\r\n        return normalize_assembly_line(normalize_basic_line(line))\r\n\r\n\r\ndef remove_basic_comments(line):\r\n    line = line.split(\":REM\")[0]\r\n    line = line.split(\":rem\")[0]\r\n    line = line.split(\": REM\")[0]\r\n    line = line.split(\": rem\")[0]\r\n    line = line.split(\":'\")[0]\r\n    line = line.split(\": '\")[0]\r\n    line = line.split(\"'\")[0]\r\n    line = line.replace(\"{\",\"\").replace('}\"',\"\").replace(\"}\",\",\").replace('\"',\"\")\r\n    return line\r\n\r\n\r\ndef remove_assembly_comments(line):\r\n    line = line.split(\" ;\")[0]\r\n    line = line.split(\";\")[0]\r\n    return line\r\n\r\n\r\ndef display_data_type(word_data, verbose=False):\r\n    if verbose:\r\n\r\n        if word_data:\r\n            data_type = \"16-bit\"\r\n        else:\r\n            data_type = \"8-bit\"\r\n\r\n        print(\"Data type detected   : \" + data_type)\r\n\r\n\r\ndef display_code_type(basic_code, verbose=False):\r\n    if verbose:\r\n        if basic_code:\r\n            code_type = \"BASIC\"\r\n        else:\r\n            code_type = \"Assembly\"\r\n\r\n        print(\"Code type            : \" + code_type)\r\n\r\n\r\ndef display_extension_type(assembly_extension, basic_code, verbose=False):\r\n    if verbose:\r\n\r\n        if assembly_extension:\r\n            extension_type = \"Assembly\"\r\n        elif basic_code:\r\n            extension_type = \"BASIC\"\r\n        else:\r\n            extension_type = \"Undefined\"\r\n\r\n        print(\"\\nFile extension type  : \" + extension_type)\r\n\r\n\r\ndef is_basic_code(directive,assembly_extension):\r\n    return (directive in BASIC_ONLY_PATTERN_LIST) or ((directive==\"data\" or directive==\"DATA\") and not assembly_extension)\r\n\r\n\r\n# Which if any pattern is the line matching?\r\ndef line_pattern(line):\r\n    for i in range(len(PATTERN_LIST)):\r\n        if PATTERN_LIST[i] in line:\r\n            return i\r\n\r\n    return -1\r\n\r\n\r\ndef remove_comments(line,basic_code):\r\n    if basic_code:\r\n        line = remove_basic_comments(line)\r\n    else:\r\n        # Remove comments\r\n        line = remove_assembly_comments(line)\r\n\r\n    return line\r\n\r\n\r\ndef split(option_config, params):\r\n    import_split_tiles(option_config, params[1])\r\n\r\n\r\ndef rip_tiles(option_config, filename, xsize, ysize, rip = False, rotate = False):\r\n\r\n    try:\r\n        fin = open(filename, \"rt\")\r\n\r\n        assembly_extension = has_extension(filename,ASSEMBLY_EXTENSIONS)\r\n\r\n        basic_extension = has_extension(filename,BASIC_EXTENSIONS)\r\n\r\n        lines = fin.readlines()\r\n\r\n        # Only take patten lines if Magellan extension is detected\r\n        if has_extension(filename, ['a99','A99']):\r\n            filtered_lines = []\r\n            for line in lines:\r\n                if line.startswith(\"PAT\"):\r\n                    filtered_lines.append(line)\r\n            lines = filtered_lines\r\n\r\n        return aux_rip_tiles(option_config, lines, assembly_extension, basic_extension, xsize, ysize, rip, rotate)\r\n    except ValueError as valueError:\r\n        print(str(valueError.args[0]))\r\n    except Exception as exception:\r\n        print(\"Sorry! Failed to extract tile data from file: \\n\" + str(exception.args))\r\n\r\n\r\n# It rips `xsize` X `ysize` tiles from an Assembly or BASIC source file\r\ndef aux_rip_tiles(option_config, lines, assembly_extension, basic_extension, xsize, ysize, rip = False, rotate = False, verbose = False):\r\n\r\n        # fin = open(filename, \"rt\")\r\n\r\n        # assembly_extension = has_extension(filename,ASSEMBLY_EXTENSIONS)\r\n\r\n        # basic_extension = has_extension(filename,BASIC_EXTENSIONS)\r\n\r\n        # lines = fin.readlines()\r\n        # print(\"DEBUG\"+str(lines))\r\n        trimmed_lines = []\r\n        filtered_lines = []\r\n\r\n        pattern_count = [0] * len(PATTERN_LIST)\r\n\r\n        # Do some filtering and count most common candidate directive\r\n        for line in lines:\r\n            line = normalize_line(line, basic_extension, assembly_extension)\r\n\r\n            trimmed_lines.append(line)\r\n            pattern_index = line_pattern(line)\r\n            if pattern_index>=0:\r\n                pattern_count[pattern_index]+=1\r\n\r\n        max_directive_count = max(pattern_count)\r\n\r\n        if max_directive_count==0:\r\n            raise ValueError(\"No pattern found\")\r\n\r\n        display_extension_type(assembly_extension,basic_extension)\r\n\r\n        max_index = pattern_count.index(max_directive_count)\r\n        directive = PATTERN_LIST[max_index]\r\n\r\n        # Guess if file is BASIC and if data are 8-bit or 16-bit values\r\n        # Remark: DATA can be both an Assembly (TMS9900) directive or a BASIC command\r\n        basic_code = is_basic_code(directive, assembly_extension)\r\n        word_data =  directive in WORD_PATTERN_LIST and not basic_code\r\n\r\n        # print(\"Pattern count: \" + str(pattern_count))\r\n        if verbose:\r\n            print(\"Detected pattern     : \" + directive)\r\n\r\n        display_data_type(word_data)\r\n        display_code_type(basic_code)\r\n\r\n        for line in trimmed_lines:\r\n            if (directive in line or directive.upper() in line):\r\n                line = remove_comments(line,basic_code)\r\n                filtered_lines.append(line)\r\n\r\n        res = \"\"\r\n        tiles = []\r\n        tile_count = 0\r\n        line_index = 0\r\n        new_tile=\"\"\r\n        single_byte_count = 0\r\n\r\n        trimmed_lines = []\r\n\r\n        while line_index<len(filtered_lines):\r\n            trimmed_lines.append(filtered_lines[line_index].split(directive)[1])\r\n            line_index+=1\r\n\r\n        if(rip):\r\n            # Heuristic to guess BASIC code with hex data without a hex prefix\r\n            headless_hex = has_headless_hex(trimmed_lines)\r\n\r\n            # Heuristic to guess the presence of an initial header byte (to be skipped)\r\n            header_byte = has_nine_byte_lines(trimmed_lines)\r\n            skip_first = header_byte or (directive in SKIP_PATTERN_LIST)\r\n        else:\r\n            headless_hex = False\r\n            header_byte = False\r\n            skip_first = False\r\n\r\n        if verbose:\r\n            print(\"Skip first item      : \" + str(skip_first))\r\n            print(\"Headless hex data    : \" + str(headless_hex))\r\n\r\n        line_index = 0\r\n\r\n        if verbose:\r\n            print(\"\")\r\n\r\n        while tile_count<NUMBER_OF_TILES and line_index<len(filtered_lines):\r\n            trimmed_line = trimmed_lines[line_index]\r\n\r\n            line_index+=1\r\n            data_list = trimmed_line.split(\",\")\r\n\r\n            if skip_first:\r\n                data_list = data_list[1:]\r\n\r\n            if basic_code:\r\n                data_list = fill_empty_slots_with_zero(data_list)\r\n\r\n            # Remark: It only works for hex notation: Split word into two bytes\r\n            if word_data:\r\n                new_data_list = []\r\n                for i in range(len(data_list)):\r\n                    new_data_list += [data_list[i][0:3],\"$\"+data_list[i][3:5]]\r\n                data_list = new_data_list\r\n\r\n            for data in data_list:\r\n                # TODO: This should be done at the beginning: Interpret as hex\r\n                if headless_hex and data[0]!= \"$\":\r\n                    data = \"$\" + data\r\n                if data.startswith(\"@\"):\r\n                    data = str(int(data[1:],2))\r\n                new_tile+=data\r\n                single_byte_count+=1\r\n                if single_byte_count==ysize:\r\n                    single_byte_count=0\r\n                    tiles.append(new_tile)\r\n\r\n                    shape = compute_shape(new_tile,xsize)\r\n\r\n\r\n                    if rotate:\r\n                        new_tile = str(compute_rotated_shape(shape)).replace('[','').replace(']','')\r\n                        shape = compute_shape(new_tile,ysize)\r\n\r\n                    if not option_config.terminal_config.test:\r\n                        print(new_tile)\r\n                        print_shape(option_config, shape)\r\n\r\n                    tile_count+=1\r\n                    new_tile=\"\"\r\n                else:\r\n                    new_tile+=\",\"\r\n        return tiles\r\n\r\n\r\ndef store_tiles(option_config, project, tiles, xsize, ysize):\r\n\r\n    print(\"project          : \" + project)\r\n\r\n    category = project_category(project)\r\n\r\n    main_path = \"./\" + category + \"s/\" + project + \"/tiles/\"+str(xsize)+\"x\"+str(ysize)+\"/tile\"\r\n    print(\"main_path: \" + main_path)\r\n    for index in range(len(tiles)):\r\n        store_tile(option_config, project,tiles[index],xsize,ysize,str(index))\r\n\r\n\r\ndef store_tile(option_config, project, tile, xsize, ysize, index):\r\n\r\n    verbose = option_config.terminal_config.verbose\r\n    # test    = option_config.terminal_config.test\r\n    \r\n    if verbose:\r\n        print(\"(store tile) project    : \" + project)\r\n        print(\"tile index : \" + str(index))\r\n    dir = str(xsize)+\"x\"+str(ysize)\r\n    \r\n    if verbose:\r\n        print(\"directory: \" + dir)\r\n\r\n    category = project_category(project)\r\n\r\n    if verbose:\r\n        print(\"project category : \" + category)\r\n\r\n    dest = \"./\" + category + \"s/\" + project + \"/tiles/\" + dir + \"/tile\" + index + \".txt\"\r\n    \r\n    if verbose:\r\n        print(\"Copy/Overwrite : \" + dest)\r\n\r\n    fin = open(dest, \"wt\")\r\n    fin.write(tile)\r\n    fin.close()\r\n\r\n\r\ndef compute_split_tiles(option_config, lines,verbose=False):\r\n\r\n    xsize = 16\r\n    for line in lines:\r\n        xsize = min(xsize,len(line))\r\n    if verbose:\r\n        print(\"Detected xsize: \" + str(xsize))\r\n\r\n    filtered_lines_group = [[],[]]\r\n    for line in lines:\r\n        if verbose:\r\n            print(\"processing line: \", line, end=\"\")\r\n\r\n        if not(line==\"\\n\" or line==\"\\r\" or line== \"\\r\\n\"):\r\n            filtered_lines_group[0].append(line.replace('\\n','').replace('\\r','')[0:int(xsize/2)])\r\n        if not(line==\"\\n\" or line==\"\\r\" or line== \"\\r\\n\"):\r\n            filtered_lines_group[1].append(line.replace('\\n','').replace('\\r','')[int(xsize/2):xsize])\r\n\r\n    if verbose:\r\n        print(\"\")\r\n\r\n    if not option_config.terminal_config.test:\r\n        print(\"\")\r\n        for filtered_lines in filtered_lines_group:\r\n            display_simple_shape(filtered_lines)\r\n            print(\"\")\r\n\r\n    return filtered_lines_group\r\n\r\n\r\ndef import_split_tiles(option_config, file_name):\r\n    fin = open(file_name, \"rt\")\r\n    lines = fin.readlines()\r\n\r\n    filtered_lines_group = compute_split_tiles(option_config, lines)\r\n    # print(str(lines))\r\n\r\n    fin.close()\r\n\r\n\r\ndef compute_tile(lines, verbose=False):\r\n    # print(str(lines))\r\n\r\n    tile = \"\"\r\n\r\n    filtered_lines = []\r\n    for line in lines:\r\n        if verbose:\r\n            print(\"processing line: \", line, end=\"\")\r\n        if not(line==\"\\n\" or line==\"\\r\" or line== \"\\r\\n\"):\r\n            filtered_lines.append(line.replace('\\n','').replace('\\r',''))\r\n\r\n    xsize = 8\r\n    for line in filtered_lines:\r\n        xsize = min(xsize,len(line))\r\n\r\n    trimmed_lines = []\r\n    for line in filtered_lines:\r\n        trimmed_lines.append(line[:xsize])\r\n    ysize = len(trimmed_lines)\r\n\r\n    dir = str(xsize)+\"X\"+str(ysize)\r\n\r\n    if verbose:\r\n        print(\"Tile shape: \" + dir)\r\n    for line_index in range(ysize):\r\n        number_of_bits = len(trimmed_lines[line_index])\r\n        if number_of_bits>8:\r\n            print(\"WARNING: more than 8 bits detected in line \" + line_index)\r\n            number_of_bits=8\r\n\r\n        value = 0\r\n        for i in range(number_of_bits):\r\n            if trimmed_lines[line_index][i] in ONE_REPPRESENTATIONS:\r\n                value+=2**(number_of_bits-1-i)\r\n        tile += str(value)\r\n        if line_index!=ysize-1:\r\n            tile += \",\"\r\n    return tile, xsize, ysize\r\n\r\n\r\ndef import_tile(file_name):\r\n    fin = open(file_name, \"rt\")\r\n    lines = fin.readlines()\r\n    tile,xsize,ysize = compute_tile(lines)\r\n    fin.close()\r\n\r\n    return tile,xsize,ysize\r\n\r\n\r\n# It should be able to import from\r\n# - Assembly files that use byte directives with either decimal and hex notation\r\n# - Assembly files that use word directives with ONLY hex notation\r\ndef _import_from_source(option_config, params, rotate = False, rip_option = False):\r\n    filename = params[1]\r\n\r\n    xsize = 8\r\n    ysize = 8\r\n\r\n    tiles = rip_tiles(option_config, filename, xsize, ysize, rip_option, rotate)\r\n\r\n    try:\r\n        if(len(params)>=3) and \"-\" not in params[2]:\r\n            store_tiles(option_config, params[2],tiles, xsize, ysize)\r\n    except Exception as exception:\r\n        print(\"Sorry! Failed to store tiles: \\n\" + str(exception.args))\r\n\r\n\r\ndef rotate(option_config, params):\r\n    _import_from_source(option_config, params, rotate = True, rip_option = False)\r\n    \r\n\r\n\r\ndef import_from_source(option_config, params):\r\n    _import_from_source(option_config, params, rotate = False, rip_option = False)\r\n    \r\n    \r\n\r\n# It should be able to import from\r\n# - Assembly files that use byte directives with either decimal and hex notation\r\n# - Assembly files that use word directives with ONLY hex notation\r\n# - BASIC files that use decimal, hex notation or \"headless\" hex notation (by guessing)\r\n# Remark: This function is like \"import_from_source\" with the \"-rip\" option\r\ndef rip(option_config, params, rotate = False):\r\n    _import_from_source(option_config, params, rotate = False, rip_option = True)\r\n"
  },
  {
    "path": "src/modules/init.py",
    "content": "from __future__ import print_function\r\n\r\n\r\nfrom os import walk\r\n\r\nimport sys\r\n\r\n\r\nfrom file_functions import dirs_in_path\r\nfrom LoggerSingleton import LoggerSingleton\r\n\r\n\r\nplatform = sys.platform\r\n\r\n\r\nNUMBER_OF_TILES = 27\r\n\r\n\r\nif(platform in [\"cygwin\", \"msys\"]):\r\n    NATIVE_EXTENSION=\"exe\"\r\nelse:\r\n    NATIVE_EXTENSION=\"out\"\r\n\r\n\r\npython_version = sys.version_info[0]\r\npython_subversion = sys.version_info[1]\r\n\r\ngame_projects = dirs_in_path(\"./games\")\r\nexample_projects = dirs_in_path(\"./examples\")\r\n\r\n    \r\n\r\nclass bcolors:\r\n    HEADER = '\\033[95m'\r\n    OKBLUE = '\\033[94m'\r\n    OKCYAN = '\\033[96m'\r\n    OKGREEN = '\\033[92m'\r\n    WARNING = '\\033[93m'\r\n    FAIL = '\\033[91m'\r\n    ENDC = '\\033[0m'\r\n    BOLD = '\\033[1m'\r\n    UNDERLINE = '\\033[4m'\r\n\r\n\r\nlogger = LoggerSingleton.initLogger('xl', '../logs')\r\n\r\ndef handle_parallelism(option_config):\r\n    if option_config.build_config.parallelize_multi_build:\r\n        if option_config.terminal_config.verbose:\r\n            print(\"Parallelize_multi_build is ON\")\r\n        logger.info(\"Parallelize_multi_build is ON\")\r\n        from multiprocessing import Pool\r\n    else:\r\n        logger.info(\"Parallelize_multi_build is OFF\")\r\n\r\n\r\ndef show_python_version(option_config):\r\n    if option_config.terminal_config.verbose:\r\n        logger.info(\"Verbose mode ON\")\r\n        print(\"----------------------------\")\r\n        print(\"----------------------------\")\r\n        print(\"Platform: \" + platform)\r\n        print(\"Python:   \" + str(python_version) + \".\" + str(python_subversion))\r\n        logger.info(\"Using Python version %s.%s\", str(python_version), str(python_subversion))\r\n        print(\"GNU MAKE command: \" + option_config.build_config.gnu_make)\r\n        print(\"----------------------------\")\r\n        print(\"\")\r\n\r\n"
  },
  {
    "path": "src/modules/input_functions.py",
    "content": "import sys\r\n\r\ndef generic_input(string):\r\n    if sys.version_info[0] < 3:\r\n        return raw_input(string)\r\n    return input(string)\r\n    \r\ndef are_you_sure():\r\n    return generic_input(\"Are you sure [Y/N]? \").lower()\r\n"
  },
  {
    "path": "src/modules/option_functions.py",
    "content": "from __future__ import print_function\r\n\r\n\r\nimport sys\r\nimport os\r\n\r\nfrom print_functions import printc, bcolors\r\nfrom LoggerSingleton import LoggerSingleton\r\nfrom init import *\r\n\r\nlogger = LoggerSingleton.initLogger('xl', '../logs')\r\n\r\n\r\nclass TerminalConfig():\r\n    def __init__(\r\n        self,\r\n        verbose = \"0\",\r\n        color_terminal = \"0\",\r\n        test = \"0\",\r\n        native_console = \"\",\r\n        fast_test = \"1\",\r\n        interactive_test = \"0\"\r\n        ):\r\n        # terminal\r\n        self.verbose = verbose\r\n        self.color_terminal = color_terminal\r\n        self.test = test\r\n        self.native_console = native_console\r\n        self.fast_test = fast_test\r\n        self.interactive_test = interactive_test\r\n\r\n\r\nclass RomConfig():\r\n    def __init__(\r\n        self,\r\n        vice_path = \"\",\r\n        vice_rom_path = \"\",\r\n        mame_path = \"\",\r\n        mame_rom_path = \"\"\r\n        ):\r\n        self.vice_path = vice_path\r\n        self.vice_rom_path = vice_rom_path\r\n        self.mame_path = mame_path\r\n        self.mame_rom_path = mame_rom_path\r\n\r\nclass ExtendConfig():\r\n    def __init__(\r\n        self,\r\n        extend_algorithm = \"\",\r\n        replace_shapes = \"\"\r\n        ):\r\n        self.extend_algorithm = extend_algorithm\r\n        self.replace_shapes = replace_shapes\r\n\r\n\r\nclass BuildConfig():\r\n    def __init__(\r\n        self,\r\n        gnu_make = \"make\",\r\n        compilation_threads = \"4\",\r\n        compilation_threads_string = \"\",\r\n        parallelize_multi_build = \"0\",\r\n        z88dk_compiler = \"sccz80\",\r\n        z88dk_compiler_opts = \"\",\r\n        sccz80_compiler_opts = \"\",\r\n        zsdcc_compiler_opts = \"zsdcc\",\r\n        cmoc_compiler_opts = \"\",\r\n        cc65_compiler_opts = \"\",\r\n        lcc1802_compiler_opts = \"\",\r\n        gcc4ti99_compiler_opts = \"\",\r\n        vbcc_compiler_opts = \"\",\r\n        ack_compiler_opts = \"\",\r\n        native_compiler_opts = \"\",\r\n        native_compiler = \"gcc\",\r\n        tool_compiler = \"gcc\",\r\n        use_tools = \"1\"\r\n        ):\r\n\r\n        # build\r\n        self.gnu_make                   = gnu_make\r\n        self.compilation_threads        = compilation_threads\r\n        self.compilation_threads_string = compilation_threads_string\r\n        self.parallelize_multi_build    = parallelize_multi_build\r\n        self.z88dk_compiler             = z88dk_compiler\r\n        self.z88dk_compiler_opts        = z88dk_compiler_opts\r\n        self.sccz80_compiler_opts       = sccz80_compiler_opts\r\n        self.zsdcc_compiler_opts        = zsdcc_compiler_opts\r\n        self.cmoc_compiler_opts         = cmoc_compiler_opts\r\n        self.cc65_compiler_opts         = cc65_compiler_opts\r\n        self.lcc1802_compiler_opts      = lcc1802_compiler_opts\r\n        self.gcc4ti99_compiler_opts     = gcc4ti99_compiler_opts\r\n        self.vbcc_compiler_opts         = vbcc_compiler_opts\r\n        self.ack_compiler_opts          = ack_compiler_opts\r\n        self.native_compiler_opts       = native_compiler_opts\r\n        self.native_compiler            = native_compiler\r\n        self.tool_compiler              = tool_compiler\r\n        self.use_tools                  = use_tools\r\n\r\n    def get_opts(self):\r\n        return \\\r\n            self.gnu_make, \\\r\n            self.compilation_threads, \\\r\n            self.compilation_threads_string, \\\r\n            self.parallelize_multi_build, \\\r\n            self.z88dk_compiler, \\\r\n            self.z88dk_compiler_opts, \\\r\n            self.sccz80_compiler_opts, \\\r\n            self.zsdcc_compiler_opts, \\\r\n            self.cmoc_compiler_opts, \\\r\n            self.cc65_compiler_opts, \\\r\n            self.lcc1802_compiler_opts, \\\r\n            self.gcc4ti99_compiler_opts, \\\r\n            self.vbcc_compiler_opts, \\\r\n            self.ack_compiler_opts, \\\r\n            self.native_compiler_opts, \\\r\n            self.native_compiler, \\\r\n            self.tool_compiler, \\\r\n            self.use_tools\r\n\r\n\r\nclass OptionConfig:\r\n    def __init__(\r\n        self,\r\n        \r\n        terminal_config = TerminalConfig(),\r\n        build_config    = BuildConfig(), \r\n        rom_config      = RomConfig(),\r\n        extend_config   = ExtendConfig(),  \r\n\r\n    ):\r\n        self.terminal_config = terminal_config\r\n               \r\n        self.build_config = build_config\r\n               \r\n        # rom\r\n        self.rom_config = rom_config\r\n\r\n        # extend\r\n        self.extend_config = extend_config\r\n\r\n\r\ndef all_compilers_opts(option_config, zsdcc_extra_optimization, compiler_opts):\r\n\r\n    gnu_make, \\\r\n    compilation_threads, \\\r\n    compilation_threads_string, \\\r\n    parallelize_multi_build, \\\r\n    z88dk_compiler, \\\r\n    z88dk_compiler_opts, \\\r\n    sccz80_compiler_opts, \\\r\n    zsdcc_compiler_opts, \\\r\n    cmoc_compiler_opts, \\\r\n    cc65_compiler_opts, \\\r\n    lcc1802_compiler_opts, \\\r\n    gcc4ti99_compiler_opts, \\\r\n    vbcc_compiler_opts, \\\r\n    ack_compiler_opts, \\\r\n    native_compiler_opts, \\\r\n    native_compiler, \\\r\n    tool_compiler, \\\r\n    use_tools \\\r\n    = option_config.build_config.get_opts()\r\n    \r\n    if z88dk_compiler in ('zsdcc','sdcc'):\r\n        compiler_selection = \" -compiler=sdcc \"\r\n        compiler_opts = compiler_opts + \" \" + zsdcc_compiler_opts\r\n    elif z88dk_compiler in ('ez80clang', 'clang'):\r\n        compiler_selection = \" -compiler=ez80clang \"\r\n    else:\r\n        compiler_selection = \"\"\r\n        compiler_opts = compiler_opts + \" \" + sccz80_compiler_opts\r\n\r\n\r\n    return \" ZSDCC_MAKEFILE_COMPILATION_OPTS='\" + zsdcc_compiler_opts + \" \" + \\\r\n                                                  zsdcc_extra_optimization + \"'\" + \\\r\n           \" Z88DK_MAKEFILE_COMPILATION_OPTS='\" + z88dk_compiler_opts + compiler_opts + \\\r\n                                                  compiler_selection + \"'\" + \\\r\n           \" GCC4TI99_MAKEFILE_COMPILATION_OPTS='\" + gcc4ti99_compiler_opts + \"'\" + \\\r\n           \" VBCC_MAKEFILE_COMPILATION_OPTS='\" + vbcc_compiler_opts + \"'\" + \\\r\n           \" ACK_MAKEFILE_COMPILATION_OPTS='\" + ack_compiler_opts + \"'\" + \\\r\n           \" NATIVE_MAKEFILE_COMPILATION_OPTS='\" + native_compiler_opts + \"'\" + \\\r\n           \" CMOC_MAKEFILE_COMPILATION_OPTS='\" + cmoc_compiler_opts + \"'\" + \\\r\n           \" CC65_MAKEFILE_COMPILATION_OPTS='\" + cc65_compiler_opts + \"'\" + \\\r\n           \" LCC1802_MAKEFILE_COMPILATION_OPTS='\" + lcc1802_compiler_opts + \"'\"\r\n\r\n\r\ndef config(option_config):\r\n\r\n    printc(option_config, bcolors.BOLD,\"[terminal]\\n\")\r\n\r\n    verbose = option_config.terminal_config.verbose\r\n    color_terminal = option_config.terminal_config.color_terminal\r\n    fast_test = option_config.terminal_config.fast_test\r\n    interactive_test = option_config.terminal_config.interactive_test\r\n    \r\n    print(\"verbose:                 \" + str(verbose))\r\n    print(\"color_terminal:          \" + str(color_terminal))\r\n    print(\"fast_test:               \" + str(fast_test))\r\n    print(\"interactive_test:        \" + str(interactive_test))\r\n\r\n    print(\"\")\r\n\r\n    gnu_make, \\\r\n    compilation_threads, \\\r\n    compilation_threads_string, \\\r\n    parallelize_multi_build, \\\r\n    z88dk_compiler, \\\r\n    z88dk_compiler_opts, \\\r\n    sccz80_compiler_opts, \\\r\n    zsdcc_compiler_opts, \\\r\n    cmoc_compiler_opts, \\\r\n    cc65_compiler_opts, \\\r\n    lcc1802_compiler_opts, \\\r\n    gcc4ti99_compiler_opts, \\\r\n    vbcc_compiler_opts, \\\r\n    ack_compiler_opts, \\\r\n    native_compiler_opts, \\\r\n    native_compiler, \\\r\n    tool_compiler, \\\r\n    use_tools \\\r\n    = option_config.build_config.get_opts()\r\n\r\n    compilation_threads = option_config.build_config.compilation_threads\r\n\r\n    printc(option_config, bcolors.BOLD,\"[build]\\n\")\r\n    if not compilation_threads_string.isnumeric():\r\n        print(\"compilation_threads:     \" + str(compilation_threads_string) + \" (\" + compilation_threads + \")\" )\r\n\r\n    else:\r\n        print(\"compilation_threads:     \" + str(compilation_threads))\r\n    print(\"parallelize_multi_build: \" + str(parallelize_multi_build))\r\n\r\n    print(\"z88dk_compiler:          \" + z88dk_compiler)\r\n    print(\"z88dk_compiler_opts:     \" + z88dk_compiler_opts)\r\n    print(\"sccz80_compiler_opts:    \" + sccz80_compiler_opts)\r\n    print(\"zsdcc_compiler_opts:     \" + zsdcc_compiler_opts)\r\n    print(\"cmoc_compiler_opts:      \" + cmoc_compiler_opts)\r\n    print(\"cc65_compiler_opts:      \" + cc65_compiler_opts)\r\n    print(\"lcc1802_compiler_opts:   \" + lcc1802_compiler_opts)\r\n    print(\"gcc4ti99_compiler_opts:  \" + gcc4ti99_compiler_opts)\r\n    print(\"vbcc_compiler_opts:      \" + vbcc_compiler_opts)\r\n    print(\"ack_compiler_opts:       \" + ack_compiler_opts)\r\n    print(\"native_compiler_opts:    \" + native_compiler_opts)\r\n\r\n    print(\"native_compiler:         \" + native_compiler)\r\n    print(\"use_tools:               \" + str(use_tools))\r\n\r\n    print(\"tool_compiler:           \" + tool_compiler)\r\n\r\n    print(\"\")\r\n    printc(option_config, bcolors.BOLD,\"[run]\\n\")\r\n    print(\"vice_path:               \" + option_config.rom_config.vice_path)\r\n    print(\"vice_rom_path:           \" + option_config.rom_config.vice_rom_path)\r\n    print(\"mame_path:               \" + option_config.rom_config.mame_path)\r\n    print(\"mame_rom_path:           \" + option_config.rom_config.mame_rom_path)\r\n\r\n    print(\"\")\r\n    printc(option_config, bcolors.BOLD,\"[extend]\\n\")\r\n    print(\"extend_algorithm:        \" + option_config.extend_config.extend_algorithm)\r\n    print(\"replace_shapes:          \" + str(option_config.extend_config.replace_shapes))\r\n    \r\n    \r\n# ---------------------------------------------\r\n\r\n\r\n# ---------------------------------------------\r\n#  System               Value\r\n# ---------------------------------------------\r\n#  Linux                linux or linux2 (*)\r\n#  Windows              win32\r\n#  Windows/Cygwin       cygwin\r\n#  Windows/MSYS2        msys\r\n#  Mac OS X             darwin\r\n#  OS/2                 os2\r\n#  OS/2 EMX             os2emx\r\n#  RiscOS               riscos\r\n#  AtheOS               atheos\r\n#  FreeBSD 7            freebsd7\r\n#  FreeBSD 8            freebsd8\r\n#  FreeBSD N            freebsdN\r\n#  OpenBSD 6            openbsd6\r\n# ---------------------------------------------\r\n\r\ndef read_config_option(config, section, option):\r\n    if config.has_option(section,option):\r\n        return config.get(section,option)\r\n    return \"\"\r\n\r\ndef read_config(config_file=\"./config.ini\"):\r\n    if not os.path.exists(config_file):\r\n        raise Exception\r\n    try:\r\n        import configparser\r\n    except ImportError:\r\n        # Python 2.x fallback\r\n        print(\"Python 2.x configuration\")\r\n        import ConfigParser as configparser\r\n\r\n    config = configparser.ConfigParser()\r\n\r\n    try:\r\n\r\n        config.read(config_file)\r\n\r\n        verbose = read_config_option(config,\"terminal\",\"verbose\")\r\n\r\n        if verbose!=\"\":\r\n            verbose=int(verbose)\r\n        else:\r\n            verbose=0\r\n        if verbose:\r\n            print(\"----------------------------\")\r\n            print(\"Verbose Mode ON\")\r\n\r\n        color_terminal = read_config_option(config,\"terminal\",\"color_terminal\")\r\n        if color_terminal!=\"\":\r\n            color_terminal=int(color_terminal)\r\n        else:\r\n            color_terminal=0\r\n\r\n        logger.info(\"Color terminal: %s\", str(color_terminal))\r\n\r\n        fast_test = read_config_option(config,\"terminal\",\"fast_test\")\r\n        if fast_test!=\"\":\r\n            fast_test=int(fast_test)\r\n        else:\r\n            fast_test=1\r\n            \r\n        interactive_test = read_config_option(config,\"terminal\",\"interactive_test\")\r\n        if interactive_test!=\"\":\r\n            interactive_test=int(interactive_test)\r\n        else:\r\n            interactive_test=0\r\n\r\n        terminal_config = TerminalConfig(verbose=verbose, color_terminal=color_terminal, test=0, native_console=0, fast_test=fast_test, interactive_test=interactive_test)\r\n\r\n        if verbose:\r\n            print(\"Config file found with: \" + str(config.sections()))\r\n\r\n        gnu_make = read_config_option(config,\"build\",\"gnu_make\")\r\n\r\n\r\n        compilation_threads_string = read_config_option(config,\"build\",\"compilation_threads\")\r\n\r\n\r\n        if compilation_threads_string in (\"auto\", \"automatic\"):\r\n            if verbose:\r\n                print(\"----------------------------\")\r\n            import multiprocessing\r\n            compilation_threads = str(multiprocessing.cpu_count())\r\n            if verbose:\r\n                print(\"Detected \" + compilation_threads + \" threads...\")\r\n                print(\"----------------------------\")\r\n        elif compilation_threads_string == \"default\":\r\n            compilation_threads = str(DEFAULT_COMPILATION_THREADS)\r\n        else:\r\n            compilation_threads = compilation_threads_string\r\n        logger.info(\"Compilation threads: %s\", str(compilation_threads))\r\n\r\n        parallelize_multi_build = read_config_option(config,\"build\",\"parallelize_multi_build\")\r\n\r\n        if parallelize_multi_build!=\"\":\r\n            parallelize_multi_build=int(parallelize_multi_build)\r\n        else:\r\n            parallelize_multi_build=0\r\n\r\n        z88dk_compiler_opts     = read_config_option(config,\"build\",\"z88dk_compiler_opts\")\r\n        z88dk_compiler          = read_config_option(config,\"build\",\"z88dk_compiler\")\r\n        sccz80_compiler_opts    = read_config_option(config,\"build\",\"sccz80_compiler_opts\")\r\n        zsdcc_compiler_opts     = read_config_option(config,\"build\",\"zsdcc_compiler_opts\")\r\n        cmoc_compiler_opts      = read_config_option(config,\"build\",\"cmoc_compiler_opts\")\r\n        cc65_compiler_opts      = read_config_option(config,\"build\",\"cc65_compiler_opts\")\r\n        lcc1802_compiler_opts   = read_config_option(config,\"build\",\"lcc1802_compiler_opts\")\r\n        gcc4ti99_compiler_opts  = read_config_option(config,\"build\",\"gcc4ti99_compiler_opts\")\r\n        vbcc_compiler_opts      = read_config_option(config,\"build\",\"vbcc_compiler_opts\")\r\n        ack_compiler_opts       = read_config_option(config,\"build\",\"ack_compiler_opts\")\r\n        native_compiler_opts    = read_config_option(config,\"build\",\"native_compiler_opts\")\r\n        native_compiler         = read_config_option(config,\"build\", \"native_compiler\")\r\n        \r\n        tool_compiler           = read_config_option(config,\"build\", \"tool_compiler\")\r\n\r\n        vice_path               = read_config_option(config,\"run\", \"vice_path\")\r\n        vice_rom_path           = read_config_option(config,\"run\", \"vice_rom_path\")\r\n\r\n        mame_path               = read_config_option(config,\"run\", \"mame_path\")\r\n        mame_rom_path           = read_config_option(config,\"run\", \"mame_rom_path\")\r\n\r\n\r\n        rom_config = RomConfig(vice_path=vice_path, vice_rom_path=vice_rom_path, mame_path=mame_path, mame_rom_path=mame_rom_path)\r\n        \r\n        extend_algorithm        = read_config_option(config,\"extend\", \"extend_algorithm\")\r\n        replace_shapes          = read_config_option(config,\"extend\", \"replace_shapes\")\r\n        \r\n\r\n        use_tools               = read_config_option(config,\"build\", \"use_tools\")\r\n\r\n        if replace_shapes!=\"\":\r\n            replace_shapes = int(replace_shapes)\r\n\r\n        extend_config = ExtendConfig(extend_algorithm=extend_algorithm, replace_shapes=replace_shapes)\r\n\r\n\r\n        if use_tools!=\"\":\r\n            use_tools = int(use_tools)\r\n\r\n        build_config = BuildConfig( \\\r\n            gnu_make,\r\n            compilation_threads,\r\n            compilation_threads_string,\r\n            parallelize_multi_build,\r\n            z88dk_compiler,\r\n            z88dk_compiler_opts,\r\n            sccz80_compiler_opts,\r\n            zsdcc_compiler_opts,\r\n            cmoc_compiler_opts,\r\n            cc65_compiler_opts,\r\n            lcc1802_compiler_opts,\r\n            gcc4ti99_compiler_opts,\r\n            vbcc_compiler_opts,\r\n            ack_compiler_opts,\r\n            native_compiler_opts,\r\n            native_compiler,\r\n            tool_compiler,\r\n            use_tools\r\n            )\r\n\r\n        option_config = OptionConfig(terminal_config, build_config, rom_config, extend_config)\r\n\r\n        if verbose:\r\n            if color_terminal:\r\n                print(\"Color terminal ON\\n\")\r\n                # printc(option_config, bcolors.OKCYAN, \"Color terminal ON\\n\")\r\n            else:\r\n                print(\"Color terminal OFF\")\r\n\r\n        return option_config\r\n    except Exception as e:\r\n        print(\"An exception occurred while reading the configuration: \" + str(e))\r\n        logger.debug(\"Error while reading configuration file\")\r\n        exc_type, exc_obj, exc_tb = sys.exc_info()\r\n        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]\r\n        print(\"exc_type: %s, fname: %s, exc_tb.tb_lineno: %s\", exc_type, fname, exc_tb.tb_lineno)\r\n\r\n        raise e\r\n\r\n\r\ndef default_config():\r\n    try:\r\n        terminal_config = TerminalConfig( \\\r\n            verbose=0, \r\n            color_terminal=0, \r\n            test=0, \r\n            native_console=0, \r\n            fast_test=1, \r\n            interactive_test=0\r\n        )\r\n\r\n        rom_config = RomConfig( \\\r\n            vice_path=\"\", \r\n            vice_rom_path=\"../roms/vice/\", \r\n            mame_path=\"\", \r\n            mame_rom_path=\"../roms/mame/\"\r\n        )\r\n\r\n        extend_config = ExtendConfig( \\\r\n            extend_algorithm=\"duplicate\", \r\n            replace_shapes=1\r\n        )\r\n\r\n        build_config = BuildConfig( \\\r\n            gnu_make = \"make\",\r\n            compilation_threads = str(DEFAULT_COMPILATION_THREADS),\r\n            compilation_threads_string = \"default\",\r\n            parallelize_multi_build = \"0\",\r\n            z88dk_compiler = \"sccz80\",\r\n            z88dk_compiler_opts = \"\",\r\n            sccz80_compiler_opts = \"\",\r\n            zsdcc_compiler_opts = \"\",\r\n            cmoc_compiler_opts = \"\",\r\n            cc65_compiler_opts = \"-Or -Cl\",\r\n            lcc1802_compiler_opts = '\"-Wf-volatile\" -O \"-Wp-D nofloats\" \"-Wa-D LCCNOLONG\" \"-Wf-mulcall\"',\r\n            gcc4ti99_compiler_opts = \"-O2 -fno-peephole2 -fno-function-cse\",\r\n            vbcc_compiler_opts = \"\",\r\n            ack_compilers_opts = \"\",\r\n            native_compiler_opts = \"\",\r\n            native_compiler = \"gcc\",\r\n            tool_compiler = \"gcc\",\r\n            use_tools = \"0\"\r\n        )\r\n        \r\n        option_config = OptionConfig(terminal_config, build_config, rom_config, extend_config)\r\n        \r\n    except:\r\n        logger.warning(\"Error in default config\")\r\n        print(\"Error in default config\")\r\n        sys.exit(-1)\r\n    return option_config\r\n\r\n\r\ndef get_config():\r\n    if python_version<2 or (python_version<=2 and python_subversion<7):\r\n        print(\"Python version not supported\")\r\n        logger.error(\"Python version not supported\")\r\n        sys.exit(-1)\r\n    try:\r\n        option_config = read_config()\r\n        logger.info(\"(read_config) Configuration file read\")\r\n    except:\r\n        if option_config.terminal_config.verbose:\r\n            print(\"Failed to read config.ini\")\r\n        logger.warning(\"Reverting to default configuration\")\r\n        option_config = default_config()\r\n        print(\"WARNING: Using default config\")\r\n    return option_config\r\n\r\n\r\ndef handle_make(option_config, make_test):\r\n    if option_config.build_config.gnu_make == \"auto\":\r\n        if option_config.terminal_config.verbose:\r\n            print(\"automatic detection of GNU make\")\r\n        if make_test['gmake']:\r\n            option_config.build_config.gnu_make = \"gmake\"\r\n        else:\r\n            option_config.build_config.gnu_make = \"make\"\r\n    return option_config.build_config.gnu_make"
  },
  {
    "path": "src/modules/params.py",
    "content": "\r\n\r\nfrom init import *\r\nfrom collections import OrderedDict\r\nfrom import_from_source import printc, bcolors\r\nfrom commands import *\r\nfrom target_defs import *\r\nfrom LoggerSingleton import LoggerSingleton\r\nfrom file_functions import list_of_projects\r\nfrom input_functions import generic_input\r\n\r\nlogger = LoggerSingleton.initLogger('xl', '../logs')\r\n\r\nDEFAULT_PROJECT = \"hello\"\r\n\r\ndef full_params(params):\r\n    full_command = SHORT_COMMANDS_LIST.get(params[1])\r\n    if full_command is not None:\r\n        return [\"\", full_command] + params[2:]\r\n    return params\r\n\r\n\r\ndef handle_two_letter_params(params):\r\n    command = params[1]\r\n    if (len(command)==2) and command not in COMMANDS_LIST and command not in SHORT_COMMANDS_LIST:\r\n        first_short_command = params[1][0]\r\n        second_short_command = params[1][1]\r\n        first_command = SHORT_COMMANDS_LIST[first_short_command]\r\n        second_command = SHORT_COMMANDS_LIST[second_short_command]\r\n        new_params = ['', first_command, second_command]\r\n        if len(params)>2:\r\n            new_params.extend(params[2:])\r\n        # print(\"Interpreting two-letter command as: \" + str(new_params))\r\n        return new_params\r\n    return params\r\n    \r\n\r\ndef get_size_params(params):\r\n    if len(params)<5:\r\n        xsize = params[2]\r\n        ysize = params[3]\r\n        target = NATIVE_TARGET\r\n    else:\r\n        xsize = params[3]\r\n        ysize = params[4]\r\n        target = params[2]\r\n\r\n    if target == 'terminal':\r\n        target = 'terminal8x8'\r\n\r\n    if target in [NATIVE_TARGET,'stdio'] or target.startswith('terminal'):\r\n        target = target + '_sized'\r\n        \r\n    return target, xsize, ysize\r\n\r\n\r\ndef get_params_from_keyboard_input(option_config):\r\n    logger.info(\"Interactive mode ON\")\r\n    print(\"For more commands, use the non-interactive mode.\")\r\n    printc(option_config, bcolors.BOLD, \"xl help\")\r\n    print(\" for instructions.\")\r\n    print(\"\")\r\n    print(\"--------------------------------------------------\")\r\n    printc(option_config, bcolors.OKCYAN, \"Interactive mode\\n\")\r\n    print(\"--------------------------------------------------\")\r\n    print(\"\")\r\n    project_name = generic_input(\"Insert project to build\\n\")\r\n    if project_name in (\"\", \"\\n\"):\r\n        project_name=DEFAULT_PROJECT\r\n        printc(option_config, bcolors.WARNING,\"Defaulting to helloworld\\n\")\r\n    print(\"\")\r\n    target_name = generic_input(\"Insert target name\\n\")\r\n    if target_name in (\"\", \"\\n\"):\r\n        target_name=\"ncurses\"\r\n        printc(option_config, bcolors.WARNING, \"Defaulting to ncurses\\n\")\r\n    print(\"\")\r\n    return [\"\", \"rebuild\", project_name, target_name]\r\n\r\n\r\ndef get_params_from_command_line():\r\n    logger.info(\"Interactive mode OFF\")\r\n    params = sys.argv\r\n    params = handle_two_letter_params(params)\r\n    if params[1] in list_of_projects(\"all\") + [\"examples\"] + [\"games\"] + [\"projects\"] + [\"all\"]:\r\n        params = [\"\",\"build\"]+params[1:]\r\n    return full_params(params)\r\n\r\n\r\ndef get_params(option_config):\r\n   return get_params_from_keyboard_input(option_config) if (len(sys.argv)<2) else get_params_from_command_line()"
  },
  {
    "path": "src/modules/print_functions.py",
    "content": "from __future__ import print_function\r\n\r\nclass bcolors:\r\n    HEADER = '\\033[95m'\r\n    OKBLUE = '\\033[94m'\r\n    OKCYAN = '\\033[96m'\r\n    OKGREEN = '\\033[92m'\r\n    WARNING = '\\033[93m'\r\n    FAIL = '\\033[91m'\r\n    ENDC = '\\033[0m'\r\n    BOLD = '\\033[1m'\r\n    UNDERLINE = '\\033[4m'\r\n\r\n\r\ndef printc(option_config, print_color,text):\r\n\r\n    if(option_config.terminal_config.color_terminal):\r\n        print(print_color + text + bcolors.ENDC, end=\"\")\r\n    else:\r\n        print(text, end=\"\")\r\n\r\n\r\n\r\ndef print_shape(option_config, items):\r\n    if not option_config.terminal_config.test:\r\n        for i in range(len(items)):\r\n            printc(option_config, bcolors.BOLD,items[i]+\"\\n\") # + \"  \") # + \"{:3d}\".format(values[i]))\r\n        print(\"\")\r\n        print(\"\")\r\n\r\n\r\n# It displays a shape from a list of strings (rows)\r\ndef display_shape(option_config, tile_vect):\r\n    for row in tile_vect:\r\n        printc(option_config, bcolors.BOLD, row)\r\n        print(\"\")\r\n\r\ndef display_simple_shape(tile_vect):\r\n    for row in tile_vect:\r\n        print(row)\r\n\r\n"
  },
  {
    "path": "src/modules/project_functions.py",
    "content": "import os\r\nimport shutil\r\n\r\nfrom file_functions import convert_makefile\r\nfrom init import game_projects, example_projects\r\nfrom strings import only_upper_digits_and_space, no_space\r\nfrom commands import COMMANDS_LIST\r\nfrom input_functions import are_you_sure\r\n\r\n# It computes the type of project\r\ndef project_category(game_dir):\r\n    if(game_dir in example_projects):\r\n        return \"example\"\r\n    elif game_dir in game_projects:\r\n        return \"game\"\r\n    else:\r\n        return \"project\"\r\n\r\n\r\n# Rename a project\r\ndef rename(option_config, params):\r\n    if len(params)<2:\r\n        source_game_dir = \"helloworld\"\r\n    else:\r\n        source_game_dir = params[1]\r\n\r\n    if len(params)<3:\r\n        print(\"ERROR: You need to provide more paramaters\")\r\n        return\r\n\r\n    target_game_dir = params[2]\r\n\r\n    source_project_type = project_category(source_game_dir)\r\n\r\n    if source_project_type != \"project\":\r\n        print(\"This is a built-in project.\")\r\n        return\r\n\r\n    target_project_type = \"project\"\r\n    target_parent_dir = target_project_type + \"s\"\r\n    target_parent_dir_and_game_dir = target_parent_dir + \"/\" + target_game_dir\r\n\r\n    if option_config.terminal_config.verbose:\r\n        print(\"source_project_type: \" + source_project_type)\r\n\r\n    convert_makefile(option_config, source_game_dir, source_project_type, source_game_dir, target_game_dir)\r\n\r\n    os.rename(target_parent_dir + \"/\" +source_game_dir, target_parent_dir_and_game_dir)\r\n\r\n\r\n# Clone a project to create a new one\r\ndef clone(option_config, params):\r\n    verbose = option_config.terminal_config.verbose\r\n    if len(params)<2:\r\n        source_game_dir = \"helloworld\"\r\n    else:\r\n        source_game_dir = params[1]\r\n\r\n    if len(params)<3:\r\n        return\r\n\r\n    target_game_dir = params[2]\r\n\r\n    source_project_type = project_category(source_game_dir)\r\n    if verbose:\r\n        print(\"source project category: \" + source_project_type)\r\n    source_parent_dir = source_project_type + \"s\"\r\n    source_parent_and_game_dir = source_parent_dir + \"/\" + source_game_dir\r\n\r\n    target_project_type = \"project\"\r\n    target_parent_dir = target_project_type + \"s\"\r\n    target_parent_dir_and_game_dir = target_parent_dir + \"/\" + target_game_dir\r\n\r\n    if verbose:\r\n        print(\"Source project name    : \" + source_game_dir)\r\n        print(\"Source Project type    : \" + source_project_type)\r\n        print(\"Path to source project : \" + source_parent_and_game_dir)\r\n        print(\"\")\r\n        print(\"Target project name    : \" + target_game_dir)\r\n        print(\"target Project type    : \" + target_project_type)\r\n        print(\"Path to target project : \" + target_parent_dir_and_game_dir)\r\n\r\n    source_path = source_parent_and_game_dir\r\n    if verbose:\r\n        print(\"source_path: \" + source_path)\r\n    dest_path = target_parent_dir_and_game_dir\r\n    if verbose:\r\n        print(\"dest_path: \" + dest_path)\r\n\r\n    if not os.path.exists(dest_path+\"/tiles\"):\r\n        if verbose:\r\n            print(\"Copying tiles...\")\r\n        shutil.copytree(source_path, dest_path)\r\n\r\n    if not os.path.exists(dest_path+\"/generated_assets\"):\r\n        if verbose:\r\n            print(\"Create empty generated_assets directory...\")\r\n        os.makedirs(dest_path+\"/generated_assets\")\r\n\r\n    convert_makefile(option_config, target_game_dir, source_project_type, source_game_dir, target_game_dir)\r\n\r\n\r\n# Create a new project\r\ndef create(option_config, params):\r\n    verbose = option_config.terminal_config.verbose\r\n    if len(params)<2:\r\n        game_dir = \"helloworld\"\r\n    else:\r\n        game_dir = params[1]\r\n    game_dir_capital = game_dir.upper()\r\n    game_dir_capital_without_special_chars = \\\r\n        only_upper_digits_and_space(game_dir.upper().replace(\"-\",\" \").replace(\"_\",\" \"))\r\n\r\n    game_dir = no_space(game_dir)\r\n\r\n    if game_dir in example_projects or game_dir in game_projects or game_dir in COMMANDS_LIST:\r\n        print(\"invalid name!\")\r\n        return\r\n\r\n    if len(params)<3:\r\n        project_type = \"helloworld\"\r\n    else:\r\n        if params[2]==\"game\" or params[2]==\"arcade\":\r\n            project_type = \"arcade_game\"\r\n        elif params[2]==\"text\":\r\n            project_type = \"text_game\"\r\n        elif params[2]==\"test\":\r\n            project_type = \"test\"\r\n        else:\r\n            if params[2] in [\"apis\",\"show_apis\",\"example\",\"show\",\"demo\"]:\r\n                project_type = \"demo\"\r\n            else:\r\n                project_type = \"helloworld\"\r\n\r\n    parent_dir = \"projects\"\r\n\r\n    if verbose:\r\n        print(\"New project name: \" + game_dir)\r\n        print(\"Project type: \" + project_type)\r\n\r\n    parent_and_game_dir = parent_dir + \"/\" + game_dir\r\n\r\n    if not os.path.exists(parent_and_game_dir):\r\n        if verbose:\r\n            print(\"Creating project dir...\")\r\n        os.makedirs(parent_and_game_dir)\r\n\r\n    source_path = \"./template_projects/\"+project_type+\"_code.template\"\r\n    if verbose:\r\n        print(\"source_path: \" + source_path)\r\n    dest_path = parent_and_game_dir\r\n    if verbose:\r\n        print(\"dest_path: \" + dest_path)\r\n\r\n    if not os.path.exists(dest_path+\"/tiles\"):\r\n        if verbose:\r\n            print(\"Copying tiles...\")\r\n        shutil.copytree(source_path+\"/tiles\", dest_path+\"/tiles\")\r\n\r\n    if not os.path.exists(dest_path+\"/shapes\"):\r\n        if verbose:\r\n            print(\"Copying shapes...\")\r\n        if not os.path.exists(source_path+\"/shapes\"):\r\n            os.makedirs(dest_path+\"/shapes\")\r\n        else:\r\n            shutil.copytree(source_path+\"/shapes\", dest_path+\"/shapes\")\r\n\r\n    if not os.path.exists(dest_path+\"/generated_assets\"):\r\n        if verbose:\r\n            print(\"Create empty generated_assets directory...\")\r\n        os.makedirs(dest_path+\"/generated_assets\")\r\n\r\n    if not os.path.exists(dest_path+\"/config\"):\r\n        if verbose:\r\n            print(\"Create empty config directory...\")\r\n        os.makedirs(dest_path+\"/config\")\r\n\r\n    file_names = [\"main.c\"]\r\n\r\n    for file_name in file_names:\r\n        if verbose:\r\n            print(\"Copying file_name: \" + file_name)\r\n        shutil.copy(source_path+\"/\"+file_name, dest_path)\r\n\r\n    # Replace _GAME_NAME_CAPITAL with the capitalized game name without special characters\r\n    fin = open(\"./\"+dest_path+\"/main.c\", \"rt\")\r\n    data = fin.read()\r\n    data = data.replace('_GAME_NAME_CAPITAL',game_dir_capital_without_special_chars)\r\n    fin.close()\r\n    fin = open(\"./\"+dest_path+\"/main.c\", \"wt\")\r\n    #overrite the input file with the resulting data\r\n    fin.write(data)\r\n\r\n    templated_makefile_path = \"./template_projects\"\r\n\r\n    shutil.copy(templated_makefile_path+\"/\"+\"Makefile_game.template\", \\\r\n                \"./\"+dest_path+\"/Makefile.\"+game_dir)\r\n\r\n    shutil.copy(templated_makefile_path+\"/\"+\"/config/project_config.mk.template\", \\\r\n                \"./\"+dest_path+\"/config/project_config.mk\")\r\n    shutil.copy(templated_makefile_path+\"/\"+\"/config/game_config.mk.template\", \\\r\n                \"./\"+dest_path+\"/config/game_config.mk\")\r\n\r\n    #read input file\r\n    fin = open(\"./\"+dest_path+\"/Makefile.\"+game_dir, \"rt\")\r\n    #read file contents to string\r\n    data = fin.read()\r\n    #replace all occurrences of the required string\r\n    data = data.replace('_GAME_NAME_CAPITAL',game_dir_capital)\r\n    data = data.replace('_GAME_NAME_', game_dir)\r\n    data = data.replace('_PARENT_DIR_', parent_dir)\r\n    #close the input file\r\n    fin.close()\r\n    #open the file in write mode\r\n    fin = open(\"./\"+dest_path+\"/Makefile.\"+game_dir, \"wt\")\r\n    #overrite the input file with the resulting data\r\n    fin.write(data)\r\n    #close the file\r\n    fin.close()\r\n\r\n\r\n# Delete project\r\ndef delete(option_config, params):\r\n    if(len(params)>=2) and params[1]==\"tools\":\r\n        make_command = GNU_MAKE + \" clean_tools\"\r\n\r\n        run_command(option_config, make_command)\r\n        return\r\n\r\n    if len(params)<2:\r\n        game_dir=\"helloworld\"\r\n    else:\r\n        candidate_name = params[1]\r\n        if candidate_name in example_projects or candidate_name in game_projects or \\\r\n            candidate_name in COMMANDS_LIST:\r\n            print(\"invalid name!\")\r\n            return\r\n        game_dir = candidate_name\r\n\r\n    if (len(params)>2) and (params[2]==\"-y\"):\r\n        interactive = False\r\n    else:\r\n        interactive = True\r\n\r\n    parent_dir = \"projects\"\r\n    verbose = option_config.terminal_config.verbose\r\n    if verbose:\r\n        print(\"Project name: \" + game_dir)\r\n\r\n    parent_and_game_dir = parent_dir + \"/\" + game_dir\r\n    if verbose:\r\n        print(\"Remove the project '\"+game_dir+ \\\r\n              \"' with all its files (source, graphics assets, makefile)\")\r\n    if (not interactive) or (are_you_sure()==\"y\"):\r\n        if os.path.exists(parent_and_game_dir):\r\n            if verbose:\r\n                print(\"Deleting directory \" + parent_and_game_dir)\r\n            shutil.rmtree(parent_and_game_dir)\r\n\r\n        makefile_name = \"Makefile.\"+game_dir\r\n        if os.path.exists(makefile_name):\r\n            if verbose:\r\n                print(\"Deleting...\" + makefile_name)\r\n            os.remove(makefile_name)\r\n        if verbose:\r\n            print(\"'\" + game_dir + \"' deleted\")\r\n    else:\r\n        return\r\n\r\n"
  },
  {
    "path": "src/modules/run.py",
    "content": "import os\r\nfrom import_from_source import printc, bcolors\r\nfrom LoggerSingleton import LoggerSingleton\r\nfrom default_values import insert_default_sizes\r\nfrom target_defs import *\r\nfrom init import NATIVE_EXTENSION\r\n\r\nC64_EMULATOR = \"x64\"\r\nVIC20_EMULATOR = \"xvic\"\r\nPLUS4_EMULATOR = \"xplus4\"\r\nPET_EMULATOR = \"xpet\"\r\n\r\nMAME_EMULATOR = \"mame\"\r\n\r\nlogger = LoggerSingleton.initLogger('xl', '../logs')\r\n\r\ndef run_command(option_config, command_string):\r\n    logger.info(\"Running command: %s\", command_string)\r\n    test = option_config.terminal_config.test           # run instde test_self makes test      = False\r\n    verbose = option_config.terminal_config.verbose\r\n    native_console = option_config.terminal_config.native_console # run inside test_self makes native_console = False\r\n    \r\n    if verbose:\r\n        printc(option_config, bcolors.BOLD, command_string+\"\\n\")\r\n    if not native_console and (test or not verbose):\r\n        command_string+= \" > /dev/null 2>&1\"\r\n\r\n    res = os.system(command_string)\r\n\r\n    if not native_console and res:\r\n        printc(option_config, bcolors.FAIL, \"return code: \" + str(res)+\"\\n\")\r\n        \r\n\r\ndef run_native(option_config, params, target):\r\n    command_prefix = \"../build/X\" + params[1] + \"_\" + target\r\n\r\n    if len(params)>=4:\r\n        xsize = params[2]\r\n        ysize = params[3]\r\n        command_string = command_prefix + \"_\" + xsize + \"X\" + ysize + \".\" + NATIVE_EXTENSION\r\n    else:\r\n        command_string = command_prefix + \".\" + NATIVE_EXTENSION\r\n    option_config.terminal_config.native_console = 1\r\n    run_command(option_config, command_string)\r\n    option_config.terminal_config.native_console = 0\r\n\r\n\r\ndef run_stdio(option_config, params):\r\n    run_native(option_config, params, \"stdio\")\r\n\r\n\r\n# Run a project by using an emulator if necessary. Only few emulators are supported.\r\ndef run(option_config, params):\r\n\r\n    if len(params)==2:\r\n        run_native(option_config, params, \"ncurses\")\r\n\r\n    if len(params)>=3:\r\n        params = insert_default_sizes(option_config, params)\r\n\r\n        target = params[2]\r\n        if target in DEFAULT_TARGET_MAP:\r\n            target = DEFAULT_TARGET_MAP[target]\r\n            if option_config.terminal_config.verbose:\r\n                print(\"defaulting to target: \" + target)\r\n\r\n        if target==\"stdio\":\r\n            run_stdio(option_config, params)\r\n        elif target==\"ncurses\":\r\n            run_native(option_config, params[0:2]+params[3:], \"ncurses\")\r\n        elif target==\"terminal\":\r\n            run_native(option_config, params[0:2]+params[3:], \"terminal8x8\")\r\n        elif target.startswith(\"terminal\"):\r\n            run_native(option_config, params[0:2]+params[3:], target)\r\n\r\n        # e.g. xl run bomber 20 30\r\n        elif(len(params)>=3 and params[2].isnumeric() and params[3].isnumeric()):\r\n            run_native(option_config, params, \"ncurses\")\r\n\r\n        # TODO: replace this with a check on prefixes\r\n        elif target in VICE_TARGETS:\r\n            \r\n            extension = \"prg\"\r\n            rom_directory = option_config.rom_config.vice_rom_path\r\n            if target==\"c64\":\r\n                rom_directory += \"c64\"\r\n\r\n                emulator = C64_EMULATOR\r\n            elif target.startswith(\"vic20\"):\r\n                rom_directory += \"vic20\"\r\n\r\n                if target==\"vic20_exp_3k\":\r\n                    emulator = VIC20_EMULATOR + \" -memory 3k\"\r\n                elif target==\"vic20_unexpanded\":\r\n                    emulator = VIC20_EMULATOR + \" -memory none\"\r\n                else:\r\n                    emulator = VIC20_EMULATOR + \" -memory 24k\"\r\n            elif target.startswith(\"c16\") or target==\"plus4\":\r\n                rom_directory += \"plus4\"\r\n\r\n                emulator = PLUS4_EMULATOR\r\n            elif target.startswith(\"pet\"):\r\n                rom_directory += \"pet\"\r\n                emulator = PET_EMULATOR\r\n            else:\r\n                print(\"'xl run' does not support this target\")\r\n                return\r\n            command_string = option_config.rom_config.vice_path + emulator + \" -directory \" + \\\r\n                             rom_directory + \" -autostartprgmode 1  ../build/X\" + \\\r\n                             params[1] + \"_\" + target + \".\" + extension\r\n\r\n            run_command(option_config, command_string)\r\n\r\n        elif target in MAME_TARGETS:\r\n            emulator = MAME_EMULATOR\r\n\r\n            if target.startswith(\"msx\"):\r\n                extension = \"rom\"\r\n                mame_sub_target = \"canonv20\"\r\n                command_string = option_config.rom_config.mame_path + emulator + \" \" + mame_sub_target + \\\r\n                \" -rompath \" + option_config.rom_config.mame_rom_path + \\\r\n                \" -window -uimodekey DEL  -skip_gameinfo  -cart1 ../build/X\" + \\\r\n                params[1] + \"_\" + target + \".\" + extension\r\n                run_command(option_config, command_string)\r\n        else:\r\n            print(\"'xl run' does not support this target\")\r\n            return\r\n"
  },
  {
    "path": "src/modules/shape_functions.py",
    "content": "import os \r\nimport sys\r\n\r\nfrom project_functions import project_category\r\nfrom file_functions import files_in_path\r\nfrom print_functions import display_shape, print_shape\r\nfrom init import NUMBER_OF_TILES\r\n# from import_from_source import import_split_tiles\r\n\r\n\r\n# General strategies:\r\n# xsize or ysize < 8 -> cut left/right or top/bottom columns/rows\r\n# ysize > 8          -> repeat top/bottom rows \r\ndef resize_shape(tile_vect,xsize,ysize, extend_algorithm):\r\n\r\n    if xsize==7:\r\n        tile_vect = [vect[:-1] for vect in tile_vect]\r\n    if xsize==6:\r\n        tile_vect = [(vect[:-1])[1:] for vect in tile_vect]\r\n\r\n    if(ysize==6):\r\n        tile_vect = (tile_vect[:-1])[1:]\r\n\r\n    # TODO: Implement zero\r\n    if extend_algorithm==\"duplicate\":\r\n        if(ysize==9):\r\n            tile_vect = tile_vect + [ tile_vect[-1]]\r\n        if(ysize==10):\r\n            tile_vect = tile_vect[0:1] + tile_vect + [ tile_vect[-1]]\r\n    elif extend_algorithm==\"zero\":\r\n        zero_row = [ \".\" * xsize ]\r\n        if(ysize==9):\r\n            tile_vect = tile_vect + zero_row\r\n        if(ysize==10):\r\n            tile_vect = zero_row + tile_vect + zero_row\r\n    return tile_vect\r\n\r\n\r\n\r\ndef trim_newline_from_shape(lines):\r\n    tile = \"\"\r\n\r\n    filtered_lines = []\r\n    for line in lines:\r\n        if not(line==\"\\n\" or line==\"\\r\" or line== \"\\r\\n\"):\r\n            filtered_lines.append(line.replace('\\n','').replace('\\r',''))\r\n\r\n    xsize = 8\r\n    for line in filtered_lines:\r\n        xsize = min(xsize,len(line))\r\n\r\n    trimmed_lines = []\r\n    for line in filtered_lines:\r\n        trimmed_lines.append(line[:xsize])\r\n    return trimmed_lines,xsize,len(trimmed_lines)\r\n\r\n\r\ndef read_shape(file_name):\r\n    fin = open(file_name, \"rt\")\r\n    lines = fin.readlines()\r\n\r\n    # print(lines)\r\n\r\n    trimmed_lines = trim_newline_from_shape(lines)\r\n    fin.close()\r\n    return trimmed_lines\r\n\r\n# It returns the path to the shape directory for a given project and dimension\r\ndef path_to_shapes(project, xsize, ysize):\r\n\r\n    project_cat = project_category(project)\r\n    # print(project_cat)\r\n    return project_cat + \"s/\" + project + \"/shapes/\" + str(xsize) + \"x\" + str(ysize) + \"/\"\r\n\r\n\r\n# replace_shapes:\r\n# 0 -> write in _shapes directory,\r\n# 1 -> write in shapes directory but avoid overwriting existing shapes or tiles\r\ndef write_shapes(option_config, project, shapes, xsize,ysize):\r\n    verbose = option_config.terminal_config.verbose\r\n    replace_shapes = option_config.extend_config.replace_shapes\r\n    path = path_to_shapes(project,xsize,ysize)\r\n    if not replace_shapes:\r\n        path = path.replace(\"shapes\",\"_shapes\")\r\n    if verbose:\r\n        print(\"Writing shapes in: \" + path)\r\n    if os.path.exists(path):\r\n        if verbose:\r\n            print(\"Directory exists\")\r\n    else:\r\n        if verbose:\r\n            print(\"Directory does not exist\")\r\n        os.makedirs(path)\r\n    for tile_number, shape in shapes.items():\r\n        #print(tile_number,shape)\r\n        path_to_shape = path+\"shape\"+tile_number+\".txt\"\r\n        if verbose:\r\n            print(\"Path to shape file: \" + path_to_shape)\r\n        path_to_tile = path.replace(\"shapes\",\"tiles\")+\"tile\"+tile_number+\".txt\"\r\n        if verbose:\r\n            print(\"Path to tile file: \" + path_to_tile)\r\n        if replace_shapes and (os.path.exists(path_to_shape) or \\\r\n           os.path.exists(path_to_tile)):\r\n            if os.path.exists(path_to_shape):\r\n                if verbose:\r\n                    print(\"shape \"+ tile_number +\" already exists\")\r\n            elif os.path.exists(path_to_tile):\r\n                if verbose:\r\n                    print(\"tile \"+ tile_number +\" already exists\")\r\n        else:\r\n            with open(path_to_shape,\"w\") as file:\r\n                for row in shape:\r\n                    if verbose:\r\n                        print(row)\r\n                    file.write(row+\"\\n\")\r\n        if verbose:\r\n            print(\"\")\r\n\r\n\r\n# Extand 8x8 shapes by reshaping them into shapes with other dimensions\r\ndef extend(option_config, params):\r\n    verbose = option_config.terminal_config.verbose\r\n    extend_algorithm = option_config.extend_config.extend_algorithm\r\n    project = params[1]\r\n\r\n    path_to_8x8_files = path_to_shapes(project,8,8)\r\n    if verbose:\r\n        print(\"Path to shape files: \" + path_to_8x8_files)\r\n        print(\"\")\r\n    shape_files = files_in_path(path_to_8x8_files)\r\n\r\n    dict7x8 = {}\r\n    dict6x8 = {}\r\n    dict8x6 = {}\r\n    dict6x9 = {}\r\n    for shape_file in shape_files:\r\n        path_to_shape_file = path_to_8x8_files + \"/\" + shape_file\r\n\r\n        if verbose:\r\n            print(\"shape file: \" + shape_file)\r\n\r\n        tile_number_str = shape_file[5:].replace(\".txt\",\"\")\r\n\r\n        if verbose:\r\n            print(\"---tile number: \" + tile_number_str)\r\n\r\n            print(\"\")\r\n\r\n        tile,xsize,ysize = read_shape(path_to_shape_file)\r\n        if xsize!=8 or ysize!=8:\r\n            print(\"Shape in file \" + path_to_shape_file + \" has wrong dimensions!\")\r\n            print(tile)\r\n            return\r\n\r\n        if verbose:\r\n            print(tile)\r\n\r\n        if verbose:\r\n            print(\"\")\r\n            print(\"7x8\")\r\n        shape7x8 = resize_shape(tile,7,8,extend_algorithm)\r\n        if verbose:\r\n            display_shape(option_config, shape7x8)\r\n        dict7x8[tile_number_str]=shape7x8\r\n\r\n        if verbose:\r\n            print(\"\")\r\n            print(\"6x8\")\r\n        shape6x8 = resize_shape(tile,6,8,extend_algorithm)\r\n        if verbose:\r\n            display_shape(option_config, shape6x8)\r\n        dict6x8[tile_number_str]=shape6x8\r\n\r\n        if verbose:\r\n            print(\"\")\r\n            print(\"8x6\")\r\n        shape8x6 = resize_shape(tile,8,6,extend_algorithm)\r\n        if verbose:\r\n            display_shape(option_config, shape8x6)\r\n        dict8x6[tile_number_str]=shape8x6\r\n\r\n        if verbose:\r\n            print(\"\")\r\n            print(\"6x9\")\r\n        shape6x9 = resize_shape(tile,6,9,extend_algorithm)\r\n        if verbose:\r\n            display_shape(option_config, shape6x9)\r\n        dict6x9[tile_number_str]=shape6x9\r\n        if verbose:\r\n            print(\"\")\r\n    # print(str(dict7x8))\r\n    write_shapes(option_config, project,dict7x8,7,8)\r\n    write_shapes(option_config, project,dict6x8,6,8)\r\n    write_shapes(option_config, project,dict8x6,8,6)\r\n    write_shapes(option_config, project,dict6x9,6,9)\r\n    return\r\n\r\n\r\n# Show tile shapes of a given project\r\ndef show(option_config, params):\r\n    parent_dir = project_category(params[1])+\"s\"\r\n\r\n    if len(params)<3:\r\n        xsize = \"8\"\r\n        ysize = \"8\"\r\n        index = \"\"\r\n    elif len(params)<4:\r\n        index = params[2]\r\n        xsize = \"8\"\r\n        ysize = \"8\"\r\n    elif len(params)==4:\r\n        xsize = params[2]\r\n        ysize = params[3]\r\n        index = \"\"\r\n    else:\r\n        xsize = params[3]\r\n        ysize = params[4]\r\n        if len(params)>=5:\r\n            index = params[2]\r\n        else:\r\n            index = \"\"\r\n\r\n\r\n    if index!=\"\":\r\n        print_shape_from_file(option_config, parent_dir, params[1], xsize, ysize, index)\r\n\r\n    else:\r\n        for i in range(NUMBER_OF_TILES):\r\n            if not option_config.terminal_config.test:\r\n                print(i)\r\n            print_shape_from_file(option_config, parent_dir, params[1], xsize, ysize, i)\r\n\r\n\r\n# It computes the shape from the tile file (not directly from the shapes if available)\r\ndef print_shape_from_file(option_config, parent_dir, project_name, xsize, ysize, index):\r\n    dir = xsize+\"x\"+ysize\r\n    dest = \"./\" + parent_dir + \"/\" + project_name + \"/tiles/\" + dir + \"/tile\" + str(index) + \".txt\"\r\n    \r\n    if option_config.terminal_config.verbose:\r\n        print(\"Decoding file tile: \" + dest)\r\n        print(\"\")\r\n    try:\r\n        if os.path.exists(dest):\r\n            fin = open(dest, \"rt\")\r\n\r\n            tile_data = fin.read()\r\n            # computed_shape = compute_shape(tile_data,xsize)\r\n            # print(\"computed shape: \" + str(computed_shape))\r\n            print_shape(option_config, compute_shape(tile_data,xsize))\r\n        else:\r\n            print(\"NOT FOUND\")\r\n    except Exception as error:\r\n        print(\"File skipped\")\r\n        print(\"An exception occurred:\", type(error).__name__, error)\r\n        exc_type, exc_obj, exc_tb = sys.exc_info()\r\n        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]\r\n        print(exc_type, fname, exc_tb.tb_lineno)\r\n\r\n# It outputs a list of strings\r\ndef compute_shape(string, xsize):\r\n    string_items = string.split(\",\")\r\n    items = []\r\n    values = []\r\n    for string_item in string_items:\r\n        string_item = string_item.replace(\"$\",\"0x\").replace(\" \",\"\")\r\n        if string_item.startswith(\"0x\"):\r\n            base = 16\r\n        elif string_item.startswith(\"@\"):\r\n            string_item = string_item[1:]\r\n            base = 2\r\n        else:\r\n            base = 10\r\n        value = int(string_item,base)\r\n        values.append(value)\r\n        bin_string=bin(value)[2:]\r\n        missing_zeros = int(xsize) - len(bin_string)\r\n        padded_bin_string = \"\"\r\n        for i in range(missing_zeros):\r\n            padded_bin_string += \"0\"\r\n        padded_bin_string+=bin_string\r\n\r\n        padded_bin_string = padded_bin_string.replace(\"0\",\".\").replace(\"1\",\"#\")\r\n\r\n        items.append(padded_bin_string)\r\n        # print(\"items :\" + str(items))\r\n    return(items)\r\n\r\n\r\n# It takes the output of print_shape\r\ndef compute_rotated_shape(items):\r\n    # print(str(items))\r\n    # return(items)\r\n    xsize = len(items[0])\r\n    ysize = len(items)\r\n    val = [0]*xsize\r\n    for j in range(xsize):\r\n        tmp = 0\r\n        for i in range(ysize):\r\n            if(items[i][j]=='#'):\r\n                tmp+=2**i\r\n        val[j] = tmp\r\n\r\n    str_res = []\r\n    for i in range(xsize):\r\n        str_res.append(val[i])\r\n\r\n    return(str_res)\r\n"
  },
  {
    "path": "src/modules/split_projects.py",
    "content": "import os\r\nfrom project_functions import project_category\r\n\r\nfrom run import run_command\r\n\r\nDELETE_MERGED_MAIN = True\r\n\r\ndef create_main(game_dir, project_type):\r\n    parent_dir_path = \"./\" + project_type + \"s/\"\r\n    project_dir_path = parent_dir_path + game_dir + \"/\"\r\n    split_dir_path = project_dir_path + \"split_files/\"\r\n    os.system(\"cat \" + split_dir_path + \"*.c > \" + project_dir_path + \"main.c\")\r\n\r\n# TODO: Implement flag to keep main.c\r\ndef delete_main(option_config, game_dir, project_type):\r\n    if DELETE_MERGED_MAIN:\r\n        parent_dir_path = \"./\" + project_type + \"s/\"\r\n        project_dir_path = parent_dir_path + game_dir + \"/\"\r\n        run_command(option_config, \"rm -rf \" + project_dir_path + \"main.c\")\r\n    else:\r\n        print(\"Keeping merged main.c\")\r\n\r\ndef is_project_split(game_dir):\r\n    project_type = project_category(game_dir)\r\n    parent_dir_path = \"./\" + project_type + \"s/\"\r\n    project_dir_path = parent_dir_path + game_dir + \"/\"\r\n    return os.path.isdir(project_dir_path+\"split_files\")"
  },
  {
    "path": "src/modules/strings.py",
    "content": "\r\nimport re\r\n\r\n\r\n# def only_upper_and_digits(s):\r\n    # return \"\".join(c for c in s if c.isupper() or c in [\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"])\r\n\r\n\r\ndef only_upper_digits_and_space(s):\r\n    return \"\".join(c for c in s if c.isupper() or c in [\" \", \"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"])\r\n\r\n\r\ndef no_space(s):\r\n    return \"\".join(c for c in s if c!=\" \")\r\n    \r\n\r\n# Convert a string into a sequence of macros that can be used in the code (only necessary for small letters)\r\ndef compute_string(string):\r\n    # string = params[1]\r\n    m = re.search('[a-zA-Z0-9 ]*',string)\r\n    string = m.group(0)\r\n    \r\n    string = string.replace(\" \", \"@\")\r\n    converted_string = \"\"\r\n    \r\n    for ch in string:\r\n        converted_string+= \"_XL_\"+ch+\" \"\r\n    \r\n    converted_string = converted_string.replace(\"_XL_@\", \"_XL_SPACE\")\r\n    \r\n    for i in range(9):\r\n        converted_string = converted_string.replace(\"_XL_\"+str(i),'\"'+str(i)+'\"')\r\n    \r\n    converted_string = converted_string[:-1]\r\n    \r\n    return  converted_string\r\n\r\ndef string(option_config, params):\r\n    if not option_config.terminal_config.test:\r\n        print(compute_string(params[1]))"
  },
  {
    "path": "src/modules/target_defs.py",
    "content": "from __future__ import print_function\r\n\r\n\r\nimport os\r\nimport sys\r\n\r\nfrom default_values import default_tile_size, default_screen_size, default_terminal_size_string, get_terminal_target\r\nfrom file_functions import list_of_projects\r\nfrom project_functions import project_category\r\nfrom print_functions import bcolors, printc\r\n\r\nDEBUG_TARGET  = \"ncurses_debug\"\r\nNATIVE_TARGET = \"ncurses\"\r\n\r\n\r\ndef binary_factor(target):\r\n    platform = sys.platform\r\n    if platform in [\"cygwin\", \"msys\"]:\r\n        TARGETS_WITH_2_BINARIES = ['atari', 'aquarius', 'cpc', 'coco3', 'mo5', 'ace', 'mtx500', \\\r\n                                   'mtx512', 'laser500']\r\n        TARGETS_WITH_3_BINARIES = ['bbc', 'bbcmaster', 'coco']\r\n    else:\r\n        TARGETS_WITH_2_BINARIES = ['atari', 'aquarius', 'cpc', 'coco3', 'mo5', 'ace', 'mtx500', \\\r\n                                   'mtx512', 'laser500', 'coco']\r\n        TARGETS_WITH_3_BINARIES = ['bbc', 'bbcmaster']\r\n    if target in TARGETS_WITH_2_BINARIES:\r\n        return 2\r\n    elif target in TARGETS_WITH_3_BINARIES:\r\n        return 3\r\n    else:\r\n        return 1\r\n\r\n\r\ndef retrieve_targets():\r\n    with open(\"../docs/STATUS.md\", \"r\") as f:\r\n        raw_lines = [line for line in f if line.lstrip().startswith(\"*\")]\r\n        lines = []\r\n        for raw_line in raw_lines:\r\n            line = raw_line.replace('\\n','').split('|')\r\n            lines.append(line)\r\n    return lines\r\n\r\n\r\ndef filter_targets(lines, compiler=\"\", cpu=\"\", working=\"\"):\r\n    if compiler!='':\r\n        lines = [line for line in lines if line[4].lower().strip()==compiler]\r\n\r\n    if cpu!='':\r\n        lines = [line for line in lines if cpu.lower() in line[3].lower().strip()]\r\n    \r\n    if working!='':\r\n        lines = [line for line in lines if working.lower() in line[2].lower().strip()]\r\n    return lines\r\n\r\n\r\ndef display_targets(lines):\r\n    print(\"target name         | long target name                            | working  |   CPU family  | dev-kit | real-time input |    graphics    |  sound  | notes      \")\r\n    for line in lines:\r\n        print(line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7], line[8])\r\n\r\n    print(\"Targets found: \" + str(len(lines)))\r\n\r\n\r\ndef display_filtered_targets(lines, compiler=\"\", cpu=\"\", working=\"\"):\r\n    \r\n    lines = filter_targets(lines, compiler, cpu, working)\r\n    \r\n    display_targets(lines)\r\n\r\n\r\ndef get_targets(compiler=\"\", cpu=\"\", working=\"\"):\r\n    lines = retrieve_targets()\r\n    filtered_lines=filter_targets(lines,compiler, cpu, working)\r\n    target_map = get_target_map(filtered_lines)\r\n    return target_map.keys()\r\n    \r\n\r\ndef get_target_map(lines):\r\n    target_map = {}\r\n    for line in lines:\r\n        target_map[line[0].replace('*','').strip()]=[line[1].strip(), line[2].strip(), line[3].strip(), line[4].strip(), line[5].strip(), line[6].strip(), line[7].strip(), line[8].strip()]\r\n    return target_map\r\n\r\n\r\ndef info(option_config, params):\r\n    \r\n    lines = retrieve_targets()\r\n    target_map = get_target_map(lines)\r\n    \r\n    # target= params[1].lstrip()\r\n    # print(target_map[target][0].lstrip())\r\n\r\n    # print(str(target_map))\r\n    if len(params)==1 or params[1]==\"targets\":\r\n        display_filtered_targets(lines)\r\n        return\r\n    \r\n    if params[1] in (\"cc65\", \"z88dk\", \"cmoc\", \"lcc1802\", \"cc6303\", \"ack\", \"tms9900-gcc\", \"vbcc\", \"xtc68\"):\r\n        display_filtered_targets(lines, params[1])\r\n        return\r\n    \r\n    if params[1] in (\"6502\", \"z80\", \"6809\", \"1802\", \"6803\", \"8080\", \"8085\", \"8086\", \"8088\", \"386\", \"tms9900\", \"68000\", \"68020\", \"gbz80\"):\r\n        to_check = params[1].replace(\"z80\", \"Zilog 80\").replace(\"8088\",\"8086\").replace(\"tms9900\", \"TMS 9900\").replace(\"6502\",\"MOS 6502\")\r\n        display_filtered_targets(lines, \"\", cpu=to_check)\r\n        return\r\n\r\n    if params[1] in(\"yes\",\"ok\",\"no\",\"ko\",\"?\"):\r\n        to_check = params[1].replace(\"ok\", \"yes\").replace(\"ko\",\"no\")\r\n        display_filtered_targets(lines, \"\", cpu=\"\", working=to_check)\r\n        return\r\n    \r\n\r\n    if params[1] in list_of_projects(\"all\"):\r\n        project = params[1]\r\n        category = project_category(project)\r\n\r\n        project_dir = category+\"s/\"+project\r\n        split = os.path.exists(project_dir+\"/split_files\")\r\n        shapes = os.path.exists(project_dir+\"/shapes\")\r\n        if shapes:\r\n            shape_dirs = str(os.listdir(project_dir+\"/shapes\"))[:-1][1:]\r\n        else:\r\n            shape_dirs = None\r\n        \r\n        game_config = os.path.exists(project_dir+\"/config/game_config.mk\")\r\n        \r\n        tiles = os.listdir(project_dir+\"/tiles/8x8\")\r\n        \r\n        override = os.path.exists(project_dir+\"/makefiles\") and os.path.exists(project_dir+\"/makefiles/Makefile.override\")\r\n        \r\n        memory = os.path.exists(project_dir+\"/memory\")\r\n        \r\n        print(\"project            :      \", end=\"\"); printc(option_config, bcolors.BOLD, project); print(\"\")\r\n\r\n        print(\"\")\r\n        print(\"category           :      \", end=\"\"); printc(option_config, bcolors.OKBLUE, category); print(\"\")\r\n\r\n        print(\"\")\r\n        print(\"split project      :      \" + str(split))\r\n        print(\"\")\r\n        print(\"no. of tiles       :      \" + str(len(tiles)))\r\n        print(\"shapes             :      \" + str(shape_dirs))\r\n        print(\"\")\r\n        print(\"code configuration :      \" + str(game_config))\r\n        print(\"override           :      \" + str(override))\r\n        print(\"memory optimizer   :      \" + str(memory))\r\n    elif params[1] in target_map.keys():\r\n        target = params[1]\r\n        xsize, ysize = default_screen_size(target)\r\n        xtile, ytile = default_tile_size(target)\r\n        \r\n        if xsize==None:\r\n            xsize = \"not available\"\r\n            ysize = \"not available\"\r\n        else:\r\n            xsize = str(xsize)\r\n            ysize = str(ysize)\r\n            \r\n        xtile = str(xtile)\r\n        ytile = str(ytile)\r\n        \r\n        if target in PARALLEL_TARGETS:\r\n            parallel = \"supported\"\r\n        else:\r\n            parallel  = \"not supported\"\r\n        \r\n        print(\"target          :         \", end=\"\"); printc(option_config, bcolors.BOLD,target); print(\"\")\r\n        print(\"name            :         \" + target_map[target][0])\r\n        print(\"working         :         \" + target_map[target][1])\r\n        print(\"cpu             :         \" + target_map[target][2])\r\n        print(\"compiler        :         \" + target_map[target][3])\r\n        print(\"real-time       :         \" + target_map[target][4])\r\n        print(\"graphics        :         \" + target_map[target][5])\r\n        print(\"sound           :         \" + target_map[target][6])\r\n\r\n        print(\"\")\r\n        print(\"x size          :         \" + xsize)\r\n        print(\"y size          :         \" + ysize)\r\n        print(\"\")\r\n        print(\"x tile          :         \" + xtile)\r\n        print(\"y tile          :         \" + ytile)\r\n        print(\"\")\r\n        print(\"parallelism     :         \" + parallel)\r\n        print(\"\")\r\n        print(\"no. of binaries :         \" + str(binary_factor(target)))\r\n    else:\r\n        print(\"No information found\")\r\n\r\n#TODO: cc65 targets\r\n#TODO: cmoc targets\r\n#TODO: lcc1802 targets\r\n#TODO: mc10 (6303)\r\n#TODO: c128 (complicated because of c1541)\r\n#TODO: cpc (complicated because of nocart)\r\nPARALLEL_TARGETS = \\\r\n    [\r\n    'stdio',\r\n\r\n    'atari',\r\n    'atari_lynx',\r\n    'atari5200',\r\n    'atari7800',\r\n    'atmos',\r\n    'c16',\r\n    'c64',\r\n    'c65',\r\n    'cbm610',\r\n    'cbm510',\r\n    'creativision',\r\n    'cx16',\r\n    'gamate',\r\n    'oric',\r\n    'oric1',\r\n    'mega65',\r\n    'nes',\r\n    'pet',\r\n    'pce',\r\n    'supervision',\r\n    'vic20',\r\n\r\n    'ncurses',\r\n    'terminal',\r\n    'terminal8x8',\r\n    'terminal8x6',\r\n    'terminal7x8',\r\n    'terminal6x9',\r\n    'terminal6x8',\r\n\r\n    'ace',\r\n    'agon',\r\n    'aquarius',\r\n    'aussie',\r\n    'bit90',\r\n    'camputers_lynx',\r\n    'cpm',\r\n    'coleco',\r\n    'eg2k',\r\n    'einstein',\r\n    'fp1100',\r\n    'g850',\r\n    \r\n    'g815',\r\n    'g800',\r\n    'e200',\r\n    'g815',\r\n    \r\n    'gb',\r\n    'gal',\r\n    'gl6000sl',\r\n    'gamegear',\r\n    'hector',\r\n    'hector1',\r\n    'hectorhr',\r\n    'interact',\r\n    'kaypro',\r\n    'kaypro83',\r\n    'kc',\r\n    'kc85',\r\n    'lambda',\r\n    'laser500',\r\n    'm5',\r\n    'm5_rom',\r\n    'm5_keyboard',\r\n    'm5_keyboard_rom',\r\n    'm100',\r\n    'map1010',\r\n    'map1010_mono',\r\n    'map1010_no_gfx',\r\n    'mc1000',\r\n    'mc1000_mono',\r\n    'microbee',\r\n    'msx',\r\n    'mtx500',\r\n    'mtx512',\r\n    'mz',\r\n    'mz2500',\r\n    'newbrain',\r\n    'nc100',\r\n    'nc200',\r\n    'pc8201',\r\n    'pc88',\r\n    'phc25',\r\n    'phc25_mono',\r\n    'phc25_no_gfx',\r\n    'pv1000',\r\n    'pv1000_no_gfx',\r\n    'px4',\r\n    'px8',\r\n    'samcoupe',\r\n    'sc3000',\r\n    'sc3000_rom',\r\n    'sg1000',\r\n    'smc777',\r\n    'sms',\r\n    'spectrum',\r\n    'svi',\r\n    't200',\r\n    'trs80',\r\n    'vg5k',\r\n    'vz',\r\n    'vz200',\r\n    'x1',\r\n    'zx81',\r\n    'zx81_wrx',\r\n    'zx81_8x6',\r\n    'zx81_wrx64',\r\n    'zx81_8x6_wrx64',\r\n    'zx81_wrx128',\r\n    'zx81_8x6_wrx128',\r\n    'z9001',\r\n    'x07',\r\n    'z1013',\r\n    'zx80',\r\n    'zxn'\r\n    ]\r\n\r\n\r\nDEFAULT_TARGET_MAP = {\\\r\n                     \"vic20\":\"vic20_exp_16k\", \\\r\n                     \"c16\":\"c16_16k\", \\\r\n                     \"plus4\":\"c16_32k\", \\\r\n                     \"pet\":\"pet_16k\", \\\r\n                     \"msx\": \"msx_16k\" \\\r\n                     }\r\n\r\nVICE_TARGETS = [\"c64\",\r\n                \"vic20\", \r\n                \"vic20_unexpanded\", \r\n                \"vic20_exp_3k\", \r\n                \"vic20_exp_8k\", \r\n                \"vic20_exp_16k\",\r\n                \"c16\", \r\n                \"plus4\", \r\n                \"c16_16k\", \r\n                \"c16_32k\",\r\n                \"pet\", \r\n                \"pet_8k\", \r\n                \"pet_16k\"\r\n               ]\r\n\r\nMAME_TARGETS = [\"msx\", \"msx_16k\"]\r\n\r\n\r\n\r\n    "
  },
  {
    "path": "src/modules/test_self_defs.py",
    "content": "DEFAULT_CLEANUP_COMMANDS = \\\r\n    [ \\\r\n        \"xl clean tools\", \\\r\n        \"xl clean\", \\\r\n    ]\r\n\r\n\r\nNO_CLEANUP = []\r\n\r\n\r\n# ---------------------------------------------------------\r\n\r\nCLEAN_TEST = \\\r\n    [ \\\r\n        \"xl delete _cloned_test_project -y\", \\\r\n        \"xl delete _foo_test -y\", \\\r\n        \"xl clean\", \\\r\n    ]\r\n\r\n\r\n# ---------------------------------------------------------\r\n\r\nTOOLS_TEST = \\\r\n    [ \\\r\n        \"xl clean tools\", \\\r\n        \"xl build easy_tools\", \\\r\n    ]\r\n\r\n\r\nCLEANUP_TOOLS_TEST = \\\r\n    [ \\\r\n        \"xl clean tools\",\r\n    ]\r\n\r\n# ---------------------------------------------------------\r\nCREATE_TEST = \\\r\n    [ \\\r\n        \"xl create _test_project1 game\", \\\r\n        \"xl create _test_project2 demo\", \\\r\n        \"xl create _test_project3 text\", \\\r\n        \"xl create _test_project4 helloworld\", \\\r\n        \"xl build _test_project1 __target__ \", \\\r\n        \"xl build _test_project2 __target__ \", \\\r\n        \"xl build _test_project3 __target__ \", \\\r\n        \"xl build _test_project4 __target__ \", \\\r\n    ]\r\n\r\nCLEANUP_CREATE_TEST = \\\r\n    [ \\\r\n        \"xl delete _test_project1 -y\", \\\r\n        \"xl delete _test_project2 -y\", \\\r\n        \"xl delete _test_project3 -y\", \\\r\n        \"xl delete _test_project4 -y\", \\\r\n    ]\r\n\r\n# ---------------------------------------------------------\r\n\r\nCOMPLEX_TEST = \\\r\n    [ \\\r\n        \"xl delete _foo_test -y\", \\\r\n        \"xl clean tools\", \\\r\n        \"xl delete _test_project -y\", \\\r\n        \"xl clean\", \\\r\n        \"xl create _foo_test\", \\\r\n        \"xl slow _foo_test __target__ 42\", \\\r\n        \"xl clean\" , \\\r\n        \"xl tiles _foo_test\", \\\r\n        \"xl size _foo_test stdio_sized 12 12\", \\\r\n        \"xl reset\", \\\r\n        \"xl size _foo_test stdio_sized 32 24\", \\\r\n        \"xl reset\", \\\r\n        \"xl tiles _foo_test 8 8\", \\\r\n        \"xl tiles _foo_test 6 8\", \\\r\n        \"xl tiles _foo_test 6 9\", \\\r\n        \"xl tiles _foo_test 7 8\", \\\r\n        \"xl tiles _foo_test 8 8\", \\\r\n        ]\r\n\r\nCLEANUP_COMPLEX_TEST = \\\r\n    [ \\\r\n        \"xl delete _foo_test -y\"\r\n    ]\r\n\r\n# ---------------------------------------------------------\r\n\r\nRENAME_TEST = \\\r\n    [ \\\r\n        \"xl delete _test_project -y\", \\\r\n        \"xl delete _foo_test -y\", \\\r\n        \"xl create _test_project test\", \\\r\n        \"xl list\", \\\r\n        \"xl clean\", \\\r\n        \"xl build _test_project __target__\", \\\r\n        \"xl rename _test_project _foo_test\", \\\r\n        \"xl build _foo_test __target__\", \\\r\n        \"xl rename _foo_test _test_project\", \\\r\n    ]\r\n\r\n\r\nCLEANUP_RENAME_TEST = \\\r\n    [ \\\r\n        \"xl delete _test_project -y\", \\\r\n    ]\r\n\r\n# ---------------------------------------------------------\r\n\r\nMAKE_TEST = \\\r\n    [ \\\r\n        \"xl create _foo_test\", \\\r\n        \"xl make _foo_test __target__\", \\\r\n        \"xl reset _foo_test\", \\\r\n        \"xl rebuild _foo_test __target__\", \\\r\n        \"xl show _foo_test\", \\\r\n        \"xl extend _foo_test\", \\\r\n    ]\r\n\r\n\r\n# ---------------------------------------------------------\r\n\r\nEXAMPLES_TEST = \\\r\n    [ \\\r\n        \"xl examples __target__\", \\\r\n    ]\r\n\r\n\r\n# ---------------------------------------------------------\r\n\r\nGAMES_TEST = \\\r\n    [ \\\r\n        \"xl games __target__\", \\\r\n    ]\r\n\r\n\r\n# ---------------------------------------------------------\r\n\r\nRUN_TEST = \\\r\n    [ \\\r\n        \"xl create _test_project\", \\\r\n        \"xl build _test_project __target__\", \\\r\n        \"xl run _test_project __target__\", \\\r\n        \"xl clone _test_project _cloned_test_project\", \\\r\n        \"xl build _cloned_test_project __target__\", \\\r\n        \"xl run _cloned_test_project __target__\", \\\r\n    ]\r\n\r\nCLEANUP_RUN_TEST = \\\r\n    [ \\\r\n            \"xl delete _test_project -y\", \\\r\n            \"xl delete _cloned_test_project -y\", \\\r\n    ]\r\n\r\n\r\n# ---------------------------------------------------------\r\n# No clean-up necessary\r\nDEV_TOOLS_TEST = \\\r\n    [ \\\r\n        \"xl tile ./assets/examples/single_tiles/tile_shape0.txt\", \\\r\n        \"xl string abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ\", \\\r\n        \"xl split games/shuriken/docs/16x12_multi_tile.txt\", \\\r\n        \"xl import ./assets/examples/tile_sets/asm/tile_8x6_shapeA.txt\", \\\r\n        \"xl rip ./assets/examples/tile_sets/asm/tile_8x6_shapeA.txt\", \\\r\n        \"xl rotate ./assets/examples/tile_sets/asm/tile_8x6_shapeA.txt\", \\\r\n    ]\r\n\r\n\r\n# ---------------------------------------------------------\r\nGAMES_TERMINAL_TEST = \\\r\n    [ \\\r\n        \"xl games terminal __target__\", \\\r\n    ]"
  },
  {
    "path": "src/modules/tests.py",
    "content": "import sys\r\nimport os\r\n\r\n\r\nfrom init import *\r\nfrom import_from_source import printc\r\nfrom file_functions import files_in_path\r\nfrom run import run_command\r\nfrom print_functions import printc, bcolors\r\nfrom test_self_defs import *\r\n\r\n\r\nfrom build_functions import *\r\n\r\nfrom execute import execute_string\r\n\r\nTERMINAL_TESTS = False\r\n\r\nCROSS_COMPILER_COMMAND = \\\r\n    {\r\n    'cc65'        : 'cl65',\r\n    'z88dk'       : 'zcc',\r\n    'cmoc'        : 'cmoc',\r\n    'cc6303'      : 'cc68 -h',\r\n    'lcc1802'     : 'lcc',\r\n    'vbcc'        : 'vc -h',\r\n    'ack'         : 'ack -h',\r\n    'tms9900-gcc' : 'tms9900-gcc -h'\r\n    }\r\n\r\nCROSS_COMPILER_COMMAND_EXPECTED = \\\r\n    {\r\n    'cc65'   : 0,\r\n    'z88dk'  : 0,\r\n    'cmoc'   : 256,\r\n    'cc6303' : 256,\r\n    'lcc1802': 0,\r\n    'vbcc'   : 256,\r\n    'ack'    : 0,\r\n    'tms9900-gcc': 256\r\n    }\r\n\r\n\r\nNATIVE_COMPILER_COMMAND = \\\r\n    {\r\n    'gcc'         : 'gcc',\r\n    'g++'         : 'g++',\r\n    }\r\n\r\nNATIVE_COMPILER_COMMAND_EXPECTED = \\\r\n    {\r\n    'gcc'    : 256,\r\n    'g++'    : 256,\r\n    }\r\n\r\n\r\nTOOL_COMMAND = \\\r\n    {\r\n    'abcwrite' : '../tools/z88dk/abc80/abcdisk-2.7/abcwrite -h',\r\n    'bbcim'    : '../tools/bbc/bbcim.' + NATIVE_EXTENSION + ' -h',\r\n    'bin2abc'  : '../tools/z88dk/abc80/abcdisk-2.7/bin2abc -h',\r\n    'cc1541'   : '../tools/generic/CC1541/cc1541 -h',\r\n    'f2k5'     : '../tools/cmoc/mo5/f2k5.' + NATIVE_EXTENSION + '',\r\n    'file2dsk' : '../tools/cmoc/coco/file2dsk/file2dsk.' + NATIVE_EXTENSION + ' -h',\r\n    'fixcart'  : '../tools/cc65/gamate/gamate-fixcart.' + NATIVE_EXTENSION + '',\r\n    'm20'      : '../tools/olivetti_m20/m20.' + NATIVE_EXTENSION + ' -h',\r\n    'mkatr'    : '../tools/cc65/atari/mkatr-master/mkatr -h',\r\n    'makewzd'  : '../tools/z88dk/oz/makewzd.' + NATIVE_EXTENSION + ' -h',\r\n    'nocart'   : '../tools/z88dk/cpc/nocart/nocart.' + NATIVE_EXTENSION + ' -h',\r\n    'old2mfm'  : '../tools/cc65/telestrat/old2mfm',\r\n    'ea5split' : '../tools/ti99/ea5split.' + NATIVE_EXTENSION + ' -h',\r\n    'elf2ea5'  : '../tools/ti99/elf2ea5.' + NATIVE_EXTENSION + ' -h',\r\n    'exomizer' : '../tools/generic/exomizer/exomizer -h',\r\n    'sapfs'    : '../tools/cmoc/mo5/sapfs.' + NATIVE_EXTENSION + '',\r\n    'tap2dsk'  : '../tools/cc65/telestrat/tap2dsk',\r\n    }\r\n\r\nTOOL_COMMAND_EXPECTED = \\\r\n    {\r\n    'abcwrite' : 256,\r\n    'bin2abc'  : 0,\r\n    'cc1541'   : 65280,\r\n    'f2k5'     : 0,\r\n    'sapfs'    : 256,\r\n    'file2dsk' : 256,\r\n    'makewzd'  : 256,\r\n    'fixcart'  : 65280,\r\n    'bbcim'    : 256,\r\n    'nocart'   : 256,\r\n    'm20'      : 256,\r\n    'mkatr'    : 0,\r\n    'elf2ea5'  : 256,\r\n    'ea5split' : 256,\r\n    'exomizer' : 256,\r\n    'tap2dsk'  : 256,\r\n    'old2mfm'  : 256,\r\n    }\r\n\r\n\r\nEMULATOR_COMMAND = \\\r\n    {\r\n    'c1541'    : 'c1541 -h',\r\n    'x64'      : 'x64 -h',\r\n    'xvic'     : 'xvic -h',\r\n    'xplus4'   : 'xplus4 -h',\r\n    'xpet'     : 'xpet -h',\r\n    'mame'     : 'mame -h',\r\n    }\r\n\r\nEMULATOR_COMMAND_EXPECTED = \\\r\n    {\r\n    'java'     : 0,\r\n    'perl'     : 0,\r\n    'c1541'    : 0,\r\n    'x64'      : 0,\r\n    'xvic'     : 0,\r\n    'xplus4'   : 0,\r\n    'xpet'     : 0,\r\n    'mame'     : 0,\r\n    }\r\n\r\n\r\nBUILDABLE_TOOLS = \\\r\n{\r\n    'abcwrite',\r\n    'bin2abc',\r\n    'cc1541',\r\n    'f2k5',\r\n    'sapfs',\r\n    'file2dsk',\r\n    'makewzd',\r\n    'mkatr',\r\n    'fixcart',\r\n    'bbcim',\r\n    'nocart',\r\n    'm20',\r\n    'elf2ea5',\r\n    'ea5split',\r\n    'exomizer',\r\n    'tap2dsk',\r\n    'old2mfm',\r\n}\r\n\r\n\r\nINTERPRETER_COMMAND = \\\r\n    {\r\n    'java'     : 'java -h',\r\n    'perl'     : 'perl -h',\r\n    }\r\n\r\nINTERPRETER_COMMAND_EXPECTED = \\\r\n    {\r\n    'java'     : 0,\r\n    'perl'     : 0,\r\n    }\r\n\r\nLIBRARY_COMMAND = \\\r\n    {\r\n    'ncurses'  : \"ls /usr/include/ncurses.h\",\r\n    }\r\n\r\nLIBRARY_COMMAND_EXPECTED = \\\r\n    {\r\n    'ncurses'  : 0,\r\n    }\r\n\r\nROM_COMMAND = \\\r\n    {\r\n    'msx/msx.zip'      : 'ls ../roms/mame/msx.zip',\r\n    'msx/canon20.zip'  : 'ls ../roms/mame/canonv20.zip',\r\n\r\n    'c16/kernal'     : 'ls ../roms/vice/plus4/kernal',\r\n    'c16/basic'     : 'ls ../roms/vice/plus4/basic',\r\n    'c16/3plus1hi'     : 'ls ../roms/vice/plus4/3plus1hi',\r\n    'c16/3plus1lo'     : 'ls ../roms/vice/plus4/3plus1lo',\r\n\r\n    'c64/basic'     : 'ls ../roms/vice/c64/basic',\r\n    'c64/chargen'     : 'ls ../roms/vice/c64/chargen',\r\n    'c64/kernal'     : 'ls ../roms/vice/c64/kernal',\r\n\r\n    'pet/basic1'     : 'ls ../roms/vice/pet/basic1',\r\n    'pet/kernal1'     : 'ls ../roms/vice/pet/kernal1',\r\n\r\n    'pet/basic2'     : 'ls ../roms/vice/pet/basic2',\r\n    'pet/kernal2'     : 'ls ../roms/vice/pet/kernal2',\r\n\r\n    'pet/basic4'     : 'ls ../roms/vice/pet/basic4',\r\n    'pet/kernal4'     : 'ls ../roms/vice/pet/kernal4',\r\n\r\n    'pet/chargen'     : 'ls ../roms/vice/pet/chargen',\r\n    'pet/characters.901640-01.bin'     : 'ls ../roms/vice/pet/characters.901640-01.bin',\r\n\r\n    'pet/edit1g'     :'ls ../roms/vice/pet/edit1g',\r\n    'pet/edit2b'     :'ls ../roms/vice/pet/edit2b',\r\n    'pet/edit2g'     :'ls ../roms/vice/pet/edit2g',\r\n\r\n    'pet/edit4b40'     :'ls ../roms/vice/pet/edit4b40',\r\n    'pet/edit4b80'     :'ls ../roms/vice/pet/edit4b80',\r\n    'pet/edit4g40'     :'ls ../roms/vice/pet/edit4g40',\r\n\r\n    'vic20/basic'     : 'ls ../roms/vice/vic20/basic',\r\n    'vic20/chargen'     : 'ls ../roms/vice/vic20/chargen',\r\n    'vic20/kernal'     : 'ls ../roms/vice/vic20/kernal',\r\n    }\r\n\r\n\r\nROM_COMMAND_EXPECTED = \\\r\n    {\r\n    'msx/msx.zip'        : 0,\r\n    'msx/canon20.zip'    : 0,\r\n\r\n    'c16/kernal'     : 0,\r\n    'c16/basic'      : 0,\r\n    'c16/3plus1hi'   : 0,\r\n    'c16/3plus1lo'   : 0,\r\n\r\n    'c64/kernal'     : 0,\r\n    'c64/chargen'     :0,\r\n    'c64/basic'     : 0,\r\n\r\n    'pet/kernal1'     : 0,\r\n    'pet/basic1'     : 0,\r\n\r\n    'pet/kernal2'     : 0,\r\n    'pet/basic2'     : 0,\r\n\r\n    'pet/kernal4'     : 0,\r\n    'pet/basic4'     : 0,\r\n\r\n    'pet/chargen'     :0,\r\n    'pet/characters.901640-01.bin'     :0,\r\n    'pet/chargen'     :0,\r\n\r\n    'pet/edit1g'     :0,\r\n    'pet/edit2b'     :0,\r\n    'pet/edit2g'     :0,\r\n\r\n    'pet/edit4b40'     :0,\r\n    'pet/edit4b80'     :0,\r\n    'pet/edit4g40'     :0,\r\n\r\n\r\n\r\n    'vic20/kernal'     : 0,\r\n    'vic20/chargen'     :0,\r\n    'vic20/basic'     : 0,\r\n    }\r\n\r\nMAKE_COMMAND = \\\r\n    {\r\n    'make'     : 'make -h',\r\n    'gmake'     : 'gmake -h',\r\n    }\r\n\r\nMAKE_COMMAND_EXPECTED = \\\r\n    {\r\n    'make'  : 0,\r\n    'gmake' : 0,\r\n    }\r\n\r\ndef check_programs(option_config, title, command_list, expected_list, silent=False):\r\n    total_result = {}\r\n\r\n    max_len = 0\r\n    for compiler in command_list.keys():\r\n        if len(compiler)>max_len:\r\n            max_len = len(compiler)\r\n    max_len = 28\r\n\r\n    for compiler in command_list.keys():\r\n        # print(\"Executing: \" + command_list[compiler])\r\n        result = os.system(command_list[compiler] + \" > /dev/null 2>&1\")\r\n        # print(\"result: \" + str(result))\r\n        spaces = \" \" * (max_len+1-len(compiler))\r\n        if result==expected_list[compiler]:\r\n            # print(\"[\" + compiler + \"] found\")\r\n            res = \"found\\n\"\r\n            res_color = bcolors.OKGREEN\r\n            res_color2 = bcolors.OKGREEN\r\n            total_result[compiler]=True\r\n        else:\r\n\r\n            total_result[compiler]=False\r\n            if compiler in BUILDABLE_TOOLS:\r\n                res = \"NOT built\\n\"\r\n                res_color = bcolors.OKBLUE\r\n                res_color2 = bcolors.OKCYAN\r\n            else:\r\n                res = \"NOT found\\n\"\r\n                res_color = bcolors.WARNING\r\n                res_color2 = bcolors.WARNING\r\n        if not silent:\r\n            printc(option_config, res_color,\"[\" + compiler + \"]\")\r\n            printc(option_config, res_color2, spaces + res)\r\n    return total_result\r\n\r\n\r\n\r\ndef test_cross_compilers(option_config):\r\n    return check_programs(option_config, \"CROSS_COMPILERS\", CROSS_COMPILER_COMMAND, \\\r\n                          CROSS_COMPILER_COMMAND_EXPECTED)\r\n\r\ndef test_native_compilers(option_config):\r\n    return check_programs(option_config, \"NATIVE_COMPILERS\", NATIVE_COMPILER_COMMAND, \\\r\n                          NATIVE_COMPILER_COMMAND_EXPECTED)\r\n\r\ndef test_make(option_config, silent):\r\n    return check_programs(option_config, \"MAKE\", MAKE_COMMAND,MAKE_COMMAND_EXPECTED, silent)\r\n\r\ndef test_tools(option_config, silent=False):\r\n    return check_programs(option_config, \"TOOLS\", TOOL_COMMAND, TOOL_COMMAND_EXPECTED, silent)\r\n\r\ndef test_emulators(option_config):\r\n    return check_programs(option_config, \"EMULATORS\", EMULATOR_COMMAND,EMULATOR_COMMAND_EXPECTED)\r\n\r\ndef test_interpreters(option_config):\r\n    return check_programs(option_config, \"INTERPRETERS\", INTERPRETER_COMMAND,INTERPRETER_COMMAND_EXPECTED)\r\n\r\ndef test_libraries(option_config):\r\n    return check_programs(option_config, \"LIBRARIES\", LIBRARY_COMMAND, LIBRARY_COMMAND_EXPECTED)\r\n\r\ndef test_roms(option_config):\r\n    return check_programs(option_config, \"ROMS\", ROM_COMMAND, ROM_COMMAND_EXPECTED)\r\n\r\n\r\ndef test_compilers(option_config):\r\n    test_native_compilers(option_config)\r\n    test_cross_compilers(option_config)\r\n\r\n\r\ndef run_single_unit_test(option_config, test_file_name, path=\"unit_tests\"):\r\n    command_string = \"python -t \" + path + \"/\" + test_file_name\r\n    printc(option_config, bcolors.OKBLUE,\"----------------------------------------\\n\")\r\n    printc(option_config, bcolors.OKCYAN,test_file_name + \"\\n\")\r\n    printc(option_config, bcolors.OKBLUE,\"--------------------------------\\n\")\r\n    verbosity = option_config.terminal_config.verbose\r\n    option_config.terminal_config.verbose = 1\r\n    run_command(option_config, command_string)\r\n    option_config.terminal_config.verbose = verbosity\r\n\r\n\r\ndef _unit_tests(option_config, path=\"./\"):\r\n    printc(option_config, bcolors.OKBLUE,\"----------------------------------------\\n\")\r\n    printc(option_config, bcolors.OKCYAN, \"UNIT-TESTS\")\r\n    printc(option_config, bcolors.OKBLUE,\"\\n----------------------------------------\\n\")\r\n\r\n    assets_tests = files_in_path(\"assets/unit_tests\")\r\n    \r\n    for test in assets_tests:\r\n        run_single_unit_test(option_config, test, \"assets/unit_tests\")\r\n    \r\n    main_tests = files_in_path(\"./unit_tests\")\r\n\r\n    for test in main_tests:\r\n        run_single_unit_test(option_config, test)\r\n\r\n\r\n\r\n\r\n# TODO: Handle aliases such as dragon->coco\r\n\r\n# TODO: Handle Windows vs Linux and targets with 3 binaries\r\n\r\n\r\n\r\n# LoggerSingleton.initLogger(__name__)\r\nlogger = LoggerSingleton.initLogger('xl', '../logs')\r\n\r\n# console_logger = LoggerSingleton.initConsoleLogger('console')\r\n\r\n# console_logger.info('Console logger started')\r\n\r\nlogger.info('Started')\r\n\r\n\r\n\r\ndef test_projects(option_config, projects, target=\"stdio\"):\r\n\r\n    compilation_threads = option_config.build_config.compilation_threads\r\n    verbose = option_config.terminal_config.verbose\r\n    clean_test(option_config)\r\n\r\n    if projects in [\"examples\", \"projects\", \"games\"]:\r\n        number_of_projects = len(dirs_in_path(\"./\"+projects))\r\n    elif projects == \"all\":\r\n        number_of_projects = \\\r\n        len(dirs_in_path(\"./examples\")) + \\\r\n        len(dirs_in_path(\"./games\")) + \\\r\n        len(dirs_in_path(\"./projects\"))\r\n    else:\r\n        number_of_projects = 1\r\n    if verbose:\r\n        print(\"number of projects: \" + str(number_of_projects))\r\n    #multiple_build\r\n    build(option_config, [\"build\",projects,target,compilation_threads,\"\"])\r\n    built_files = built_files_in_path(\"../build\")\r\n\r\n    # TODO: Handle target=*_targets and all\r\n    if target.endswith(\"_targets\") or target==\"all\":\r\n        if verbose:\r\n            print(\"Test on the number of binaries for all these targets is not supported\")\r\n\r\n    files_per_project = binary_factor(target)\r\n\r\n    if verbose:\r\n        print(\"Expected binaries per project: \" + str(files_per_project))\r\n\r\n    if len(built_files)<files_per_project*number_of_projects:\r\n        printc(option_config, bcolors.FAIL, \"[xl build]  KO\\n\")\r\n        print(\"Built files: \" +str(built_files))\r\n        print(\"Expected number : \" + str(number_of_projects))\r\n        print(\"No. Built files : \" + str(len(built_files)))\r\n\r\n        # success=0\r\n        return False\r\n    printc(option_config, bcolors.OKGREEN, \"[xl build]        OK\\n\")\r\n    return True\r\n\r\n\r\ndef test_clean_tools(option_config):\r\n    pass\r\n\r\ndef no_check(option_config, target):\r\n    return 1\r\n\r\ndef execute_commands(option_config, command_strings, target, silent = True):\r\n    for command_string in command_strings:\r\n        execute_string(option_config, command_string.replace(\"__target__\", target), silent)\r\n\r\n\r\ndef display_ok_ko(option_config, result):\r\n    if result:\r\n        printc(option_config, bcolors.OKGREEN,\"OK\"+\"\\n\")\r\n    else:\r\n        printc(option_config, bcolors.FAIL,   \"KO\"+\"\\n\")\r\n\r\n\r\n\r\ndef check_clean(option_config, target):    \r\n    files = files_in_path(\"../build\")\r\n    return not(len(files)-1)\r\n\r\ndef check_tools(option_config, target):\r\n    tools_result_map=test_tools(option_config, silent=True)\r\n    number_of_tools = len(tools_result_map.keys())\r\n\r\n    built_tools = 0\r\n    for _, result in tools_result_map.items():\r\n        if result:\r\n            built_tools+=1\r\n    return built_tools\r\n\r\ndef check_complex(option_config, target):\r\n    number_files = len(files_in_path(\"../build\"))-1\r\n    # print(str(files_in_path(\"../build\")))\r\n    return number_files==2\r\n\r\n\r\ndef check_examples(option_config, target):\r\n    number_files = len(files_in_path(\"../build\"))-1\r\n    number_of_examples = len(dirs_in_path(\"./examples\"))\r\n\r\n    return number_files == number_of_examples*binary_factor(target)\r\n\r\n\r\ndef check_games(option_config, target):\r\n    number_files = len(files_in_path(\"../build\"))-1\r\n    number_of_games = len(dirs_in_path(\"./games\"))\r\n\r\n    return number_files == number_of_games*binary_factor(target)\r\n\r\n\r\ndef check_games_terminal(option_config, target):\r\n    number_files = len(files_in_path(\"../build\"))-1\r\n    number_of_games = len(dirs_in_path(\"./games\"))\r\n    return number_files == number_of_games*binary_factor(\"terminal\")\r\n\r\n\r\ndef check_rename(option_config, target):\r\n    number_files = len(files_in_path(\"../build\"))-1\r\n    return number_files==2*binary_factor(target)\r\n\r\n\r\ndef check_create(option_config, target):\r\n    number_files = len(files_in_path(\"../build\"))-1\r\n    return number_files==4*binary_factor(target)\r\n\r\ndef check_make(option_config, target):\r\n    success = 1\r\n    dirs_in_proj_after = len(dirs_in_path(\"./projects/_foo_test\"))\r\n\r\n    if dirs_in_proj_after != 4:\r\n        success=0\r\n\r\n    dirs_in_shapes_after = len(dirs_in_path(\"./projects/_foo_test/shapes\"))\r\n\r\n    if dirs_in_shapes_after != 5:\r\n        success=0\r\n    return success\r\n\r\n\r\n\r\ndef test_execute(option_config, target, test_name, commands, check = no_check, cleanup_commands = DEFAULT_CLEANUP_COMMANDS):\r\n    print(\"-----------------------------------\")\r\n    print(\"TEST: \" + bcolors.BOLD + test_name + bcolors.ENDC)\r\n    print(\"-----------------------------------\")\r\n\r\n    # Execute list of commands\r\n    execute_commands(option_config, commands, target, silent = False)\r\n    \r\n    # Check result and display OK/KO\r\n    result = check(option_config, target)\r\n    display_ok_ko(option_config, result)\r\n    print(\"\")\r\n\r\n    # Clean-up commands\r\n    execute_commands(option_config, cleanup_commands, target, silent = True)\r\n    return result\r\n\r\n# ---------------------------------------------------------\r\n# DEFAULT SELF TESTS\r\n# ---------------------------------------------------------\r\n\r\nSTANDARD_SELF_TESTS = \\\r\n    [ \\\r\n        (\"test xl clean\",            CLEAN_TEST,          check_clean), \\\r\n        (\"test xl tools\",            TOOLS_TEST,          check_tools,   CLEANUP_TOOLS_TEST), \\\r\n        (\"test several xl commands\", COMPLEX_TEST,        check_complex, CLEANUP_COMPLEX_TEST), \\\r\n        (\"test xl dev tools\",        DEV_TOOLS_TEST), \\\r\n        (\"test xl create\",           CREATE_TEST,         check_create,  CLEANUP_CREATE_TEST), \\\r\n        (\"test xl make\",             MAKE_TEST,           check_make), \\\r\n        (\"test xl rename\",           RENAME_TEST,         check_rename,  CLEANUP_RENAME_TEST) \\\r\n    ]\r\n\r\n\r\nPARALLEL_BUILD_TESTS = \\\r\n    [ \\\r\n        (\"test xl examples\",         EXAMPLES_TEST,       check_examples), \\\r\n        (\"test xl games\",            GAMES_TEST,          check_games), \\\r\n        # (\"test xl games terminal\",   GAMES_TERMINAL_TEST, check_games_terminal), \\\r\n    ]\r\n\r\nPARALLEL_TERMINAL_BUILD_TESTS = \\\r\n    [\r\n\t\t(\"test xl games terminal\",   GAMES_TERMINAL_TEST, check_games_terminal),\r\n\t]\r\n  \r\nINTERACTIVE_TESTS = \\\r\n    [ \\\r\n        (\"test xl run\",              RUN_TEST,       no_check,      CLEANUP_RUN_TEST), \\\r\n    ]\r\n    \r\n\r\ndef test_self(option_config, target = \"stdio\"):\r\n    option_config.terminal_config.test = 1\r\n\r\n    printc(option_config, bcolors.OKCYAN,\"----------------------------------------\\n\")\r\n    printc(option_config, bcolors.OKCYAN, \"XL SCRIPT TEST\")\r\n    printc(option_config, bcolors.OKCYAN,\"\\n----------------------------------------\\n\")\r\n    success = 1\r\n    printc(option_config, bcolors.BOLD,  \"target: \")\r\n    printc(option_config, bcolors.OKBLUE,target+\"\\n\")\r\n    printc(option_config, bcolors.OKCYAN,\"----------------------------------------\\n\")\r\n\r\n    self_tests = STANDARD_SELF_TESTS\r\n    if option_config.terminal_config.interactive_test:\r\n        self_tests += INTERACTIVE_TESTS\r\n    if not option_config.terminal_config.fast_test:\r\n        self_tests += PARALLEL_BUILD_TESTS\r\n\r\n    if TERMINAL_TESTS:\r\n        self_tests += PARALLEL_TERMINAL_BUILD_TESTS\r\n\r\n    for test in self_tests:\r\n        execute_string(option_config, \"xl clean\", silent = True)\r\n        success *= test_execute(option_config, target, *test)\r\n\r\n    execute_string(option_config, \"xl clean\", silent = True)\r\n\r\n    option_config.terminal_config.test = 0\r\n    return success\r\n\r\n\r\ndef test_all(option_config, params):\r\n\r\n    test_compilers(option_config)\r\n    test_tools(option_config)\r\n    test_libraries(option_config)\r\n    test_interpreters(option_config)\r\n    _unit_tests(option_config)\r\n    return test_self(option_config, params)\r\n\r\n\r\nTEST_FILES = {\r\n    \"native\"      : [\"stdio\", \"ncurses\", \"terminal\"],\r\n    \"cc65\"        : [\"vic20\", \"supervision\", \"atari\", \"atari_lynx\", \"creativision\", \"pet\", \"c64\", \"oric\"],\r\n    \"z88dk\"       : [\"c128_z80_80col\", \"cpm_z80_adm3a\", \"spectrum_48k\", \"msx\", \"zx81_32k_wrx\"],\r\n    \"cmoc\"        : [\"coco\", \"coco3\", \"mo5\"],\r\n    \"lcc1802\"     : [\"comx\", \"tmc600\"],\r\n    \"ack\"         : [\"msdos\", \"pc86\"],\r\n    \"cc6303\"      : [\"mc10\"],\r\n    \"vbcc\"        : [\"bbc\", \"bbcmaster\"],\r\n    # \"tms9900-gcc\" : [\"ti99\"] # Variable number\r\n    }\r\n\r\n\r\nZ88DK_ALT_EXPECTED_FILES = 38\r\n\r\ndef targets_test(option_config, params):\r\n\r\n    verbose = option_config.terminal_config.verbose\r\n    success = clean_test(option_config)\r\n    compilation_threads = option_config.build_config.compilation_threads\r\n    native_compiler = option_config.build_config.native_compiler\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n    if params[1] == \"z88dk_alt\":\r\n        parallel = \" -j \" + compilation_threads\r\n    else:\r\n        parallel = \"\"\r\n\r\n    game_dir = \"chase\"\r\n    project_type = \"game\"\r\n    if is_project_split(game_dir):\r\n        if verbose:\r\n            printc(option_config, bcolors.OKBLUE,\"Create main.c from split source files\\n\")\r\n        create_main(game_dir, project_type)\r\n    if params[1] in TEST_FILES.keys():\r\n        devkit_test_files = TEST_FILES[params[1]]\r\n        print(\"Testing: \" + str(devkit_test_files)[1:][:-1])\r\n        \r\n        expected_files = 0\r\n        for test_file in devkit_test_files:\r\n            # TODO: Parameters should be read from config.ini\r\n            _use_tools = option_config.build_config.use_tools\r\n            _tool_compiler = option_config.build_config.tool_compiler\r\n            make_command = GNU_MAKE + parallel + \" \" + test_file + \\\r\n                           \" GNU_MAKE=\" + GNU_MAKE + \" _NATIVE_CC=\"+ native_compiler + \" \" + \\\r\n                           \" USE_TOOLS=\" + str(_use_tools) + \" TOOL_CC=\" + _tool_compiler + \" \" + \\\r\n                           all_compilers_opts(option_config, \"\",\"\") + \\\r\n                           \" -f makefiles.other/chase/tests/Makefile.tests\"\r\n            expected_files += binary_factor(test_file)\r\n            run_command(option_config, make_command)\r\n    elif params[1]==\"z88dk_alt\":\r\n        make_command = GNU_MAKE + parallel + \" GNU_MAKE=\" + GNU_MAKE + \\\r\n                       \" z88dk_quick_test -f makefiles.other/chase/tests/Makefile.z88dk_quick_tests\"\r\n        run_command(option_config, make_command)\r\n        expected_files = Z88DK_ALT_EXPECTED_FILES # TODO: Remove this hardcoded value\r\n    else:\r\n        printc(option_config, bcolors.FAIL, \"Parameter not recognized\\n\")\r\n        if is_project_split(game_dir):\r\n            if verbose:\r\n                printc(option_config, bcolors.OKBLUE,\"Delete main.c (because of split source files)\\n\")\r\n            delete_main(option_config, game_dir, project_type)\r\n        sys.exit(-1)\r\n    if is_project_split(\"chase\"):\r\n        if verbose:\r\n            printc(option_config, bcolors.OKBLUE,\"Delete main.c (because of split source files)\\n\")\r\n        delete_main(option_config, game_dir, project_type)\r\n\r\n    built_files = len(files_in_path(\"../build\"))-1\r\n    if verbose:\r\n        print(\"Number of built files: \" + str(built_files))\r\n\r\n    if params[1] in TEST_FILES.keys() or params[1] in (\"z88dk_alt\"):\r\n        printc(option_config, bcolors.OKCYAN, \"Built files: \" + str(built_files)+\"\\n\")\r\n        printc(option_config, bcolors.OKBLUE, \"Expected files: \" + str(expected_files)+\"\\n\")\r\n        if built_files != expected_files:\r\n            printc(option_config, bcolors.FAIL, \"binaries KO\\n\")\r\n            success=0\r\n\r\n        else:\r\n            printc(option_config, bcolors.OKGREEN, \"binaries OK\\n\")\r\n\r\n    return success\r\n\r\n\r\n# Self-test xl and native build\r\ndef test(option_config, params):\r\n    if (len(params)<=1) or ((len(params)==2) and (params[1]==\"check\")):\r\n        if test_all(option_config, \"stdio\"):\r\n            printc(option_config, bcolors.OKGREEN, \"TEST OK\\n\")\r\n        else:\r\n            printc(option_config, bcolors.FAIL, \"TEST KO\\n\")\r\n        return\r\n    if params[1]==\"self\":\r\n        if len(params)<3:\r\n            test_self(option_config)\r\n        else:\r\n            test_self(option_config, params[2])\r\n    elif params[1]==\"compilers\":\r\n        test_compilers(option_config)\r\n    elif params[1]==\"tools\":\r\n        test_tools(option_config)\r\n    elif params[1]==\"emulators\":\r\n        test_emulators(option_config)\r\n    elif params[1]==\"cross-compilers\" or params[1]==\"cross_compilers\":\r\n        test_cross_compilers(option_config)\r\n    elif params[1]==\"native_compilers\" or params[1]==\"native-compilers\":\r\n        test_native_compilers(option_config)\r\n    elif params[1]==\"libraries\":\r\n        test_libraries(option_config)\r\n    elif params[1]==\"interpreters\":\r\n        test_interpreters(option_config)\r\n    elif params[1]==\"roms\":\r\n        test_roms(option_config)\r\n    elif params[1]==\"make\":\r\n        test_make(option_config, silent=False)\r\n    elif params[1] in (\"unit-tests\", \"unit_tests\", \"unit-test\", \"unit_test\", \"u\"):\r\n        _unit_tests(option_config)\r\n    elif params[1] in TEST_FILES.keys() or params[1].endswith('_alt'):\r\n        if targets_test(option_config, params):\r\n            printc(option_config, bcolors.OKGREEN, \"TEST OK\\n\")\r\n        else:\r\n            printc(option_config, bcolors.FAIL, \"TEST KO\\n\")\r\n        return\r\n    else:\r\n        projects = []\r\n        for (_, dirnames, _) in walk(\"./projects\"):\r\n            projects.extend(dirnames)\r\n            break\r\n\r\n        games = []\r\n        for (_, dirnames, _) in walk(\"./games\"):\r\n            games.extend(dirnames)\r\n            break\r\n\r\n        examples = []\r\n        for (_, dirnames, _) in walk(\"./examples\"):\r\n            examples.extend(dirnames)\r\n            break\r\n\r\n        if params[1] in projects + games + examples or params[1] in \\\r\n           ['examples','games','projects','all']:\r\n            if len(params)>=3:\r\n                par1 = params[1]\r\n                par2 = params[2]\r\n            else:\r\n                par1 = params[1]\r\n                par2 = \"stdio\"\r\n            if test_projects(option_config, par1,par2):\r\n                printc(option_config, bcolors.OKGREEN, \"TEST OK\\n\")\r\n            else:\r\n                printc(option_config, bcolors.FAIL, \"TEST KO\\n\")\r\n        else:\r\n            test_all(option_config, params[1])\r\n        return\r\n\r\n\r\n# Self-test xl and native build\r\ndef check(option_config, params, silent=False):\r\n    if len(params)<=1:\r\n        tools = test_tools(option_config, silent)\r\n        native_compilers =test_native_compilers(option_config)\r\n        cross_compilers = test_cross_compilers(option_config)\r\n        libraries = test_libraries(option_config)\r\n        make = test_make(option_config, silent=True)\r\n        emulators = test_emulators(option_config)\r\n        roms = test_roms(option_config)\r\n\r\n        print(\"\")\r\n\r\n        printc(option_config, bcolors.BOLD, \"SUMMARY\\n\")\r\n        tools = True\r\n        xl_run_cross_target = True\r\n        native_target = True\r\n        cross_target = True\r\n\r\n        if not make['make'] and not make['gmake']:\r\n            printc(option_config, bcolors.FAIL, \"No make command detected!\\n\")\r\n\r\n        if not native_compilers['gcc']:\r\n            tools = False\r\n            native_target = False\r\n\r\n        if not native_compilers['g++']:\r\n            xl_run_cross_target = True\r\n            tools = False\r\n\r\n        if not libraries['ncurses']:\r\n            printc(option_config, bcolors.WARNING, \\\r\n                   \"No ncurses library detected -> Native target impacted\\n\")\r\n            native_target = False\r\n\r\n        for _, present in cross_compilers.items():\r\n            if not present:\r\n                cross_target = False\r\n\r\n        for _, present in emulators.items():\r\n            if not present:\r\n                xl_run_cross_target = False\r\n                break\r\n\r\n        for _, present in roms.items():\r\n            if not present:\r\n                xl_run_cross_target = False\r\n                break\r\n\r\n        if not tools:\r\n            printc(option_config, bcolors.WARNING, \"'xl tools' may be KO for some targets\\n\")\r\n\r\n        if not native_target:\r\n            printc(option_config, bcolors.WARNING, \"'xl build <project>' may be KO (no native build)\\n\")\r\n\r\n        if not cross_target:\r\n            printc(option_config, bcolors.WARNING, \"'xl build <project> <target>' may be KO for some targets\\n\")\r\n\r\n        if not xl_run_cross_target:\r\n            printc(option_config, bcolors.WARNING, \"'xl run <project> <target>' may be KO for some targets\\n\")\r\n\r\n        if tools and native_target and xl_run_cross_target and cross_target:\r\n            printc(option_config, bcolors.OKCYAN, \"No issue found\\n\")\r\n\r\n    elif params[1]==\"compilers\":\r\n        test_compilers(option_config)\r\n    elif params[1]==\"tools\":\r\n        test_tools(option_config)\r\n    elif params[1]==\"emulators\":\r\n        test_emulators(option_config)\r\n    elif params[1]==\"cross-compilers\" or params[1]==\"cross_compilers\":\r\n        test_cross_compilers(option_config)\r\n    elif params[1]==\"native_compilers\" or params[1]==\"native-compilers\":\r\n        test_native_compilers(option_config)\r\n    elif params[1]==\"libraries\":\r\n        test_libraries(option_config)\r\n    elif params[1]==\"interpreters\":\r\n        test_interpreters(option_config)\r\n    elif params[1]==\"make\":\r\n        test_make(option_config, silent=False)\r\n    elif params[1]==\"roms\":\r\n        test_roms(option_config)\r\n\r\n\r\ndef compilers(option_config):\r\n    test(option_config, [\"test\",\"compilers\"])\r\n    \r\ndef unit_tests(option_config):\r\n    # test(option_config, [\"test\",\"unit-tests\"])\r\n    _unit_tests(option_config)\r\n    \r\n\r\ndef self(option_config, params):\r\n    if len(params)<2:\r\n        test_self(option_config, )\r\n    else:\r\n        test_self(option_config, params[1])"
  },
  {
    "path": "src/modules/tiles.py",
    "content": "from print_functions import printc, bcolors, print_shape\r\nfrom project_functions import project_category\r\nfrom file_functions import files_in_path\r\nfrom import_from_source import import_tile, store_tile, compute_shape\r\nfrom run import run_command\r\n\r\n# global extend_algorithm\r\n\r\n\r\nTARGETS_WITH_XSIZE_6 = {\"oric\", \"atmos\", \"comx_ntsc\", \"comx\", \"pecom\", \"micro\"}\r\nTARGETS_WITH_XSIZE_7 = {\"apple2\", \"apple2enh\"}\r\n\r\nTARGETS_WITH_YSIZE_6 = {\"atari_lynx\"}\r\nTARGETS_WITH_YSIZE_9 = {\"comx\", \"micro\", \"pecom\"}\r\nTARGETS_WITH_YSIZE_8 = {\"comx_ntsc\", \"micro_ntsc\"} # Necessary to avoid comx and micro\r\n\r\n\r\ndef detect_xsize(target):\r\n    for target_6_xsize in TARGETS_WITH_XSIZE_6:\r\n        if target.startswith(target_6_xsize):\r\n            return 6\r\n    for target_7_xsize in TARGETS_WITH_XSIZE_7:\r\n        if target.startswith(target_7_xsize):\r\n            return 7\r\n    return 8\r\n\r\n\r\n# TODO: VG-5000 has 8x10 characters but it is currently treated as 8x8\r\n# TODO: Cidelsa has 8x6 (rotated 6x8 in reality)\r\n# comx_ntsc : 6x8\r\n# comx (pal): 6x9\r\ndef detect_ysize(target):\r\n    for target_8_ysize in TARGETS_WITH_YSIZE_8: # Necessary to have this before size 9 for NTSC case (comx, micro)\r\n        if target.startswith(target_8_ysize):\r\n            return 8\r\n    for target_6_ysize in TARGETS_WITH_YSIZE_6:\r\n        if target.startswith(target_6_ysize):\r\n            return 6\r\n    for target_9_ysize in TARGETS_WITH_YSIZE_9:\r\n        if target.startswith(target_9_ysize):\r\n            return 9\r\n    return 8\r\n\r\n\r\n\r\n# Import a shape as single tile from a text file that describes its shape with characters\r\ndef tile(option_config, params):\r\n\r\n    tile,xsize,ysize = import_tile(params[1])\r\n\r\n    if option_config.terminal_config.verbose:\r\n        print_shape(option_config, compute_shape(tile,xsize))\r\n\r\n    if len(params)>=3:\r\n        store_tile(option_config, params[2], tile, xsize, ysize, params[3])\r\n    elif not option_config.terminal_config.test:\r\n        printc(option_config, bcolors.OKCYAN, tile+\"\\n\")\r\n\r\n\r\n# Import as tiles all shapes from files named \"shape<number>.txt\" inside the directories in the \"shapes\" directory of a given project\r\ndef tiles(option_config, params):\r\n    verbose = option_config.terminal_config.verbose\r\n    project_name = params[1]\r\n\r\n    project_cat = project_category(project_name)\r\n\r\n    if len(params)>3:   # xsize, ysize parameters\r\n        xsize_str,ysize_str = params[2:]\r\n    elif len(params)==3: # target parameter\r\n        detected_xsize = detect_xsize(params[2])\r\n        detected_ysize = detect_ysize(params[2])\r\n        xsize_str = str(detected_xsize)\r\n        ysize_str = str(detected_ysize)\r\n    else:                # no parameter\r\n        xsize_str = \"8\"\r\n        ysize_str = \"8\"\r\n    if verbose:\r\n        print(\"xsize: \" + xsize_str)\r\n        print(\"ysize: \" + ysize_str)\r\n    path_to_files = project_cat + \"s/\" + params[1] + \\\r\n                    \"/shapes/\" + xsize_str + \"x\" + ysize_str + \"/\"\r\n    if verbose:\r\n        print(\"Path to shape files: \" + path_to_files)\r\n    shape_files = files_in_path(path_to_files)\r\n    if verbose:\r\n        print(\"shape files: \", shape_files)\r\n    for shape_file in shape_files:\r\n        if verbose:\r\n            print(\"processing file: \", shape_file)\r\n\r\n        path_to_shape_file = path_to_files + str(shape_file)\r\n        if verbose:\r\n            print(\"processing path file: \", path_to_shape_file)\r\n        tile_number_str = shape_file[5:].replace(\".txt\",\"\")\r\n        \r\n        if verbose:\r\n            print(\"tile number: \" + tile_number_str)\r\n\r\n        tile,xsize,ysize = import_tile(path_to_shape_file)\r\n\r\n        if str(xsize)!=xsize_str or str(ysize)!=ysize_str:\r\n            print(\"Shape in file \" + path_to_shape_file + \" has wrong dimensions!\")\r\n            print(tile)\r\n            return\r\n        \r\n        if not option_config.terminal_config.test:\r\n            print(tile)\r\n        if verbose:\r\n            print_shape(option_config, compute_shape(tile,xsize))\r\n\r\n        store_tile(option_config, project_name, tile, xsize, ysize, tile_number_str)\r\n        if verbose:\r\n            print(\"\")\r\n\r\n\r\ndef make_assets_from_tiles(option_config, params):\r\n    GNU_MAKE = option_config.build_config.gnu_make\r\n    game_dir = params[1]\r\n\r\n    project_type = project_category(game_dir)\r\n    parent_dir = project_type + \"s\"\r\n\r\n    run_command(option_config, GNU_MAKE+\" GAME_NAME=\" + game_dir + \\\r\n                          \" PARENT_DIR=\" + parent_dir + \\\r\n                          \" -f ./makefiles.common/auxiliary/Makefile_assets\")\r\n\r\n"
  },
  {
    "path": "src/patches/move_globals.py",
    "content": "#!/bin/python\r\n\r\n\r\nimport shutil\r\n\r\nimport os,sys\r\n\r\nimport re\r\n\r\nif len(sys.argv)<2:\r\n    game_dir = \"chase\"\r\nelse:\r\n    game_dir = sys.argv[1]\r\n\r\nif len(sys.argv)<3:\r\n    parent_dir = \"games\"\r\nelse:\r\n    parent_dir = sys.argv[2]\r\n\r\nfile_name = \"../\"+parent_dir+\"/\"+game_dir+\"/main.c\"\r\n\r\nfile = open(file_name)\r\n\r\nfile_content = file.read()\r\n\r\nfile.close()\r\n\r\n# print(file_content)\r\n\r\n\r\npattern = '<global>(.*)</global>'\r\n\r\ninit_code = re.search(pattern, file_content, re.DOTALL).group(1)\r\n\r\nwithout_global_init = re.sub(pattern, '', file_content, flags=re.DOTALL)\r\n\r\n\r\nprint(without_global_init)\r\n\r\nprint(init_code)\r\n\r\nindex = without_global_init.find('main(void)')+14\r\n\r\nprint(without_global_init[:index]+init_code+without_global_init[index:])\r\n"
  },
  {
    "path": "src/template_projects/Makefile_game.template",
    "content": "######################################################################\r\n# Makefile for CROSS-_GAME_NAME_CAPITAL\r\n\r\nFULL_FILES ?= \\\r\n\t$(BASIC_CROSS_LIB_FILES) \\\r\n\t$(CROSS_LIB_PATH)/sleep/sleep_macros.c \\\r\n\t$(SOURCE_PATH)/main.c \r\n\r\nGAME_NAME := _GAME_NAME_\r\n\r\nPARENT_DIR = projects\r\n\r\nSOURCE_PATH := $(PARENT_DIR)/$(GAME_NAME)\r\n\r\n#-D_DEFAULT_ASCII\r\nDEFAULT_ASCII=\r\n\r\nGLOBAL_OPTS = $(DEFAULT_ASCII)\r\n\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/project_config.mk\r\n\r\ninclude ./$(PARENT_DIR)/$(GAME_NAME)/config/game_config.mk\r\n\r\n\r\ninclude ./Makefile_common\r\n\r\n\r\ninclude ./makefiles.common/auxiliary/Makefile_default_values\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subxect to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define INITIAL_LEVEL 1\r\n#define FINAL_LEVEL 8\r\n\r\nuint16_t hiscore;\r\nuint16_t score;\r\nuint8_t level;\r\nuint8_t alive;\r\nuint8_t lives;\r\nuint8_t input;\r\nuint8_t level_completed;\r\nuint8_t counter;\r\n\r\n\r\nuint8_t x;\r\nuint8_t y;\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\nvoid display_xy(void)\r\n{\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n    _XL_PRINTD(0,YSize-1,2,x);\r\n    _XL_PRINTD(4,YSize-1,2,y);\r\n}\r\n\r\nint main(void)\r\n{        \r\n\r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n    \r\n    _XL_INIT_SOUND();\r\n    \r\n    hiscore = 0;\r\n\r\n    // MAIN END-LESS LOOP\r\n    while(1)\r\n    {\r\n        score = 0;\r\n        level = INITIAL_LEVEL;\r\n        lives = 3;\r\n\r\n        _XL_CLEAR_SCREEN();\r\n            \r\n        _XL_SET_TEXT_COLOR(_XL_RED);\r\n        PRINT_CENTERED_ON_ROW(4, \"_GAME_NAME_CAPITAL\");\r\n        _XL_SET_TEXT_COLOR(_XL_CYAN);\r\n        PRINT_CENTERED_ON_ROW(6, \"BY AUTHOR\");\r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n        \r\n        PRINT_CENTERED_ON_ROW(0, \"HISCORE\");\r\n        _XL_PRINTD(XSize/2-3,1,5,hiscore);\r\n        \r\n        PRINT_CENTERED_ON_ROW(YSize-1, \"PRESS FIRE\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n        _XL_CLEAR_SCREEN();\r\n        \r\n        // GAME LOOP\r\n        while(lives && (level<FINAL_LEVEL+1))\r\n        {\r\n            x = XSize/2;\r\n            y = YSize/2;\r\n            // (RE-)START LEVEL\r\n            level_completed = 0;\r\n            alive = 1;\r\n            counter = 0;\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            _XL_PRINT(0,0,\"LEVEL\");\r\n            _XL_PRINTD(7,0,1,level);\r\n            \r\n            _XL_PRINT(0,2,\"LIVES\");\r\n            _XL_PRINTD(7,2,1,lives);       \r\n            \r\n            _XL_SLEEP(1);\r\n            PRINT_CENTERED_ON_ROW(14, \"PRESS FIRE\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            _XL_PRINT(0,0, \"SCORE\");\r\n            _XL_PRINTD(7,0,5,score);\r\n            _XL_PRINTD(XSize-6,YSize-1,5,0);\r\n            display_xy();\r\n\r\n            // LEVEL LOOP\r\n            while(!level_completed && alive)\r\n            {\r\n                input = _XL_INPUT();\r\n                \r\n                if(x<1 || x> XSize-2 || y<2 || y>YSize-3)\r\n                {\r\n                    alive=0;\r\n                    _XL_EXPLOSION_SOUND();                    \r\n                }\r\n                _XL_DRAW(x,y,_TILE_0, _XL_WHITE);\r\n                _XL_SLEEP(1);\r\n\r\n                if(_XL_DOWN(input))\r\n                {\r\n                    _XL_DELETE(x,y);\r\n                    ++y;\r\n                    display_xy();\r\n                }\r\n                else if (_XL_RIGHT(input))\r\n                {\r\n                    _XL_DELETE(x,y);\r\n                    ++x;\r\n                    display_xy();\r\n                } \r\n                else if (_XL_LEFT(input))\r\n                {\r\n                    _XL_DELETE(x,y);\r\n                    --x;\r\n                    display_xy();\r\n                } \r\n                else if (_XL_UP(input))\r\n                {\r\n                    _XL_DELETE(x,y);\r\n                    --y;\r\n                    display_xy();\r\n                }                 \r\n                else if(_XL_FIRE(input))\r\n                {\r\n                    _XL_TOCK_SOUND();\r\n                    ++counter;\r\n                    score+=50;\r\n                    _XL_PRINTD(7,0,5,score);\r\n                    _XL_PRINTD(XSize-6,YSize-1,5,counter);\r\n                }\r\n                if(counter>=100)\r\n                {\r\n                    level_completed = 1;\r\n                    _XL_ZAP_SOUND();\r\n                }\r\n            }\r\n                        \r\n            // ALIVE OR LEVEL_COMPLETED?\r\n            if(alive)\r\n            {\r\n                ++level;\r\n                PRINT_CENTERED(\"LEVEL COMPLETED\");\r\n            }\r\n            else\r\n            {\r\n                --lives;\r\n                PRINT_CENTERED(\"YOU DIED\");\r\n                _XL_SLEEP(1);\r\n            }\r\n        } // (lives && (level<FINAL_LEVEL+1)) \r\n        if(lives) // Game completed\r\n        {\r\n            // GAME COMPLETED\r\n            _XL_CLEAR_SCREEN();\r\n            PRINT_CENTERED(\"GAME COMPLETED\");\r\n            _XL_SLEEP(1);\r\n            _XL_WAIT_FOR_INPUT();\r\n        }\r\n        _XL_CLEAR_SCREEN();\r\n        PRINT_CENTERED(\"GAME OVER\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        if(score>hiscore) \r\n        {\r\n            hiscore = score;\r\n        }\r\n    } // while(1) -> restart from level 1\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape10.txt",
    "content": "........\r\n.#....#.\r\n##...#.#\r\n.#...#.#\r\n.#...#.#\r\n.#...#.#\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape11.txt",
    "content": "........\r\n.#....#.\r\n##...##.\r\n.#....#.\r\n.#....#.\r\n.#....#.\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape12.txt",
    "content": "........\r\n.#....##\r\n##...#.#\r\n.#.....#\r\n.#....#.\r\n.#...#..\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape13.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape14.txt",
    "content": "........\r\n.#...#.#\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape15.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape16.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape17.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#....#.\r\n.#....#.\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape18.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape19.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape20.txt",
    "content": "........\r\n.##...#.\r\n#.#..#.#\r\n..#..#.#\r\n.#...#.#\r\n#....#.#\r\n###...#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape21.txt",
    "content": "........\r\n.##...#.\r\n#.#..##.\r\n..#...#.\r\n.#....#.\r\n#.....#.\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape22.txt",
    "content": "........\r\n.##...##\r\n#.#..#.#\r\n..#....#\r\n.#....#.\r\n#....#..\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape23.txt",
    "content": "........\r\n.##..###\r\n#.#....#\r\n..#....#\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape24.txt",
    "content": "........\r\n.##..#.#\r\n#.#..#.#\r\n..#..#.#\r\n.#...###\r\n#......#\r\n###....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape25.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape26.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#....#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/shapes/8x8/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile0.txt",
    "content": "0,66,165,165,165,165,66,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile1.txt",
    "content": "0,66,166,162,162,162,71,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile10.txt",
    "content": "0,66,197,69,69,69,226,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile11.txt",
    "content": "0,66,198,66,66,66,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile12.txt",
    "content": "0,67,197,65,66,68,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile13.txt",
    "content": "0,71,193,65,71,65,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile14.txt",
    "content": "0,69,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile15.txt",
    "content": "0,71,196,68,71,65,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile16.txt",
    "content": "0,71,196,68,71,69,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile17.txt",
    "content": "0,71,193,65,66,66,226,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile18.txt",
    "content": "0,71,197,69,71,69,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile19.txt",
    "content": "0,71,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile2.txt",
    "content": "0,67,165,161,162,164,71,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile20.txt",
    "content": "0,98,165,37,69,133,226,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile21.txt",
    "content": "0,98,166,34,66,130,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile22.txt",
    "content": "0,99,165,33,66,132,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile23.txt",
    "content": "0,103,161,33,71,129,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile24.txt",
    "content": "0,101,165,37,71,129,225,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile25.txt",
    "content": "0,103,164,36,71,129,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile26.txt",
    "content": "0,103,164,36,71,133,231,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile3.txt",
    "content": "0,71,161,161,167,161,71,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile4.txt",
    "content": "0,69,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile5.txt",
    "content": "0,71,164,164,167,161,71,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile6.txt",
    "content": "0,71,164,164,167,165,71,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile7.txt",
    "content": "0,71,161,161,162,162,66,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile8.txt",
    "content": "0,71,165,165,167,165,71,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/8x8/tile9.txt",
    "content": "0,71,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/arcade_game_code.template/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/template_projects/config/game_config.mk.template",
    "content": "#\r\n\r\nCOCO_COLOR_GFX_GAME_OPTS ?= \r\n\r\nCREATIVISION_GAME_OPTS ?=  \r\n\r\nGAMATE_GAME_OPTS ?=\r\n\r\nC128_Z80_80COL_GAME_OPTS ?= \r\n\r\nZX81_NO_GFX_GAME_OPTS ?=\r\n\r\nZX81_GFX_GAME_OPTS ?= \r\n\r\nAPPLE2_GAME_OPTS ?= \r\n\r\nCOMX_GAME_OPTS ?= \r\n\r\nPECOM_GAME_OPTS ?= \r\n\r\nTMC600_GAME_OPTS ?= \r\n\r\nMICRO_GAME_OPTS ?= \r\n\r\nCAMPUTERS_LYNX_GAME_OPTS ?=\r\n\r\nVIC_20_EXP_3K_GAME_OPTS ?= \r\n\r\nVIC20_UNEXPANDED_GAME_OPTS ?= \r\n\r\nSTDIO_GAME_OPTS ?= \r\n\r\nBBC7_GAME_OPTS ?="
  },
  {
    "path": "src/template_projects/config/project_config.mk.template",
    "content": "#####################################################################\r\n# DISPLAY FLAGS\r\n\r\n4COLOR_PALETTE=\r\n# As of 2024/11/24, impacted targets are: bbc, nes, atari7800, hectorhr\r\n# Default: Black, White, Red, Cyan\r\n#-D__USE_GREEN\r\n\r\n5COLOR_PALETTE=\r\n# As of 2024/11/24, impacted targets are: atari, atari5200\r\n# Default: Black, White, Red, Cyan, Green\r\n#-D__USE_CYAN_YELLOW\r\n#-D__USE_GREEN_YELLOW\r\n\r\nORIC_COLORS=\r\n# -D__MONO_COLORS\r\n\r\nMC10_COLORS=\r\n# -D__REVERSE_LETTERS\r\n\r\n\r\n#####################################################################\r\n# SLOWDOWN VALUES\r\n\r\n# Common factor\r\n_COMMON_SLOWDOWN_FACTOR=10\r\n\r\n\r\n# CC65\r\n_APPLE2_SLOWDOWN=30\r\n_APPLE2ENH_SLOWDOWN=70\r\n_APPLE2_HGR_SLOWDOWN=70\r\n_APPLE2ENH_HGR_SLOWDOWN=70\r\n_ATARI_SLOWDOWN=120\r\n_ATARI5200_SLOWDOWN=120\r\n_ATARI_LYNX_SLOWDOWN=230\r\n_ATARI7800_NO_COLOR_SLOWDOWN=300\r\n_ATARI7800_SLOWDOWN=400\r\n_ATARI_LYNX_SLOWDOWN=400\r\n_C16_SLOWDOWN=55\r\n_C16_CONIO_SLOWDOWN=85\r\n_C64_SLOWDOWN=45\r\n_CREATIVISION_SLOWDOWN=100\r\n_GAMATE_SLOWDOWN=800\r\n_ORIC_SLOWDOWN=90\r\n_NES_SLOWDOWN=80\r\n_PET_SLOWDOWN=60\r\n_PCE_SLOWDOWN=550\r\n_SUPERVISION_SLOWDOWN=1400\r\n_VIC20_SLOWDOWN=500\r\n\r\n\r\n# Z88DK\r\n_AQUARIUS_SLOWDOWN=150\r\n_ACE_SLOWDOWN=130\r\n_AGON_SLOWDOWN=600\r\n_BEE_SLOWDOWN=150\r\n_C128_Z80_40COL_SLOWDOWN=200\r\n_C128_Z80_80COL_SLOWDOWN=50\r\n_CAMPUTERS_LYNX_SLOWDOWN=0\r\n_COLECO_SLOWDOWN=230\r\n_CPC_MODE0_SLOWDOWN=250\r\n_CPC_CPCRSLIB_MODE1_SLOWDOWN=240\r\n_CPC_MODE2_SLOWDOWN=240\r\n_CPM_Z80_SLOWDOWN=90\r\n_CPM_INTEL8080_SLOWDOWN=80\r\n_GAL_SLOWDOWN=100\r\n_GAL_GFX_SLOWDOWN=50\r\n_GB_SLOWDOWN=280\r\n_GG_SLOWDOWN=260\r\n_GB_WAIT_VSYNC_SLOWDOWN=150\r\n_KC_SLOWDOWN=200\r\n_LASER500_SLOWDOWN=250\r\n_MC1000_SLOWDOWN=220\r\n_MSX_SLOWDOWN=250\r\n_MSX_FIXED_COLORS_SLOWDOWN=300\r\n_MTX500_SLOWDOWN=250\r\n_MTX512_SLOWDOWN=250\r\n_MZ_SLOWDOWN=250\r\n_SAMCOUPE_SLOWDOWN=300\r\n_SC3000_SLOWDOWN=250\r\n_SMS_SLOWDOWN=260\r\n_SPECTRUM_SLOWDOWN=160\r\n_VG5K_SLOWDOWN=220\r\n_VZ200_SLOWDOWN=220\r\n_Z1013_SLOWDOWN=100\r\n_Z9001_SLOWDOWN=100\r\n_ZX81_SLOWDOWN=60\r\n_ZX81_WRX_SLOWDOWN=1\r\n\r\n\r\n# CMOC\r\n_COCO_SLOWDOWN=150\r\n_COCO3_SLOWDOWN=300\r\n_DRAGON_SLOWDOWN=150\r\n_MO5_SLOWDOWN=180\r\n_TO7_SLOWDOWN=180\r\n\r\n\r\n# LCC1802\r\n_COMX_SLOWDOWN=100\r\n_PECOM_SLOWDOWN=100\r\n_TMC600_SLOWDOWN=120\r\n_MICRO_SLOWDOWN=130\r\n_CIDELSA_SLOWDOWN=100\r\n\r\n\r\n# MC10\r\n_MC10_SLOWDOWN=110\r\n\r\n# GCC FOR TI99\r\n_TI99_SLOWDOWN=120\r\n\r\n# GCC\r\n_NCURSES_SLOWDOWN=12\r\n_TERMINAL_SLOWDOWN=8\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n\r\n#if ((YSize)+(Y_OFFSET)-1)>19\r\n    #define MAX_TILES 19\r\n#else\r\n    #define MAX_TILES ((YSize)+(Y_OFFSET)-1)\r\n#endif\r\n\r\n\r\n#define NUMBER_OF_COLORS 6\r\n#define MAX_STRING_SIZE 10\r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\n\r\n \r\nconst uint8_t tiles[] = {\r\n\t\t_TILE_0, _TILE_1, _TILE_2, _TILE_3, \r\n\t\t_TILE_4, _TILE_5, _TILE_6, _TILE_7, \r\n\t\t_TILE_8, _TILE_9, _TILE_10, _TILE_11, \r\n\t\t_TILE_12, _TILE_13, _TILE_14, _TILE_15, \r\n\t\t_TILE_16, _TILE_17, _TILE_18, _TILE_19,\r\n\t\t_TILE_20, _TILE_21, _TILE_22, _TILE_23, \r\n        _TILE_24, _TILE_25, _TILE_26\r\n\t\t};\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t tile_color[NUMBER_OF_COLORS] = {_XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE};\r\n#endif\r\n\r\n\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"WHITE\", \r\n                                \"RED\", \r\n                                \"CYAN\", \r\n                                \"GREEN\", \r\n                                \"YELLOW\", \r\n                                \"BLUE\", \r\n                                };\r\n\r\n\r\n#define COL_OFFSET ((XSize-16)/2-1)\r\n#define ROW_OFFSET 3\r\n\r\nint main(void)\r\n{        \r\n\r\n    uint8_t i;\r\n    uint8_t j;\r\n    uint8_t k;\r\n    uint8_t counter;\r\n    uint8_t input;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    _XL_INIT_SOUND();\r\n\r\n    for(k=0;k<3;++k)\r\n    {\r\n        for(j=0;j<6;++j)\r\n        {\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n            \r\n            _XL_PRINT(COL_OFFSET,   4, \"PRINTD\");\r\n            _XL_PRINTD(COL_OFFSET  ,5,5, 1234U);\r\n            _XL_PRINTD(COL_OFFSET+5,5,5,56789U);\r\n\r\n            _XL_SET_TEXT_COLOR(tile_color[j]);\r\n            \r\n            _XL_PRINT(COL_OFFSET, 7, (char *) color_name[j]);\r\n            \r\n            _XL_PRINT(COL_OFFSET, 9, _XL_a _XL_b _XL_c _XL_d _XL_e _XL_f _XL_g _XL_h _XL_i _XL_j);\r\n            _XL_PRINT(COL_OFFSET,10, _XL_k _XL_l _XL_m _XL_n _XL_o _XL_p _XL_q _XL_r _XL_s _XL_t);\r\n            _XL_PRINT(COL_OFFSET,11, _XL_u _XL_v _XL_w _XL_x _XL_y _XL_z);\r\n            _XL_PRINT(COL_OFFSET,13, _XL_A _XL_B _XL_C _XL_D _XL_E _XL_F _XL_G _XL_H _XL_I _XL_J);\r\n            _XL_PRINT(COL_OFFSET,14, _XL_K _XL_L _XL_M _XL_N _XL_O _XL_P _XL_Q _XL_R _XL_S _XL_T);\r\n            _XL_PRINT(COL_OFFSET,15, _XL_U _XL_V _XL_W _XL_X _XL_Y _XL_Z);\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n            PRINT_CENTERED_ON_ROW(0, \"SOUND\");\r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n            PRINT_CENTERED_ON_ROW(3, \"PING\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            _XL_PING_SOUND();\r\n            _XL_WAIT_FOR_INPUT();\r\n   \r\n            PRINT_CENTERED_ON_ROW(5, \"TICK\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            _XL_TOCK_SOUND();\r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n            PRINT_CENTERED_ON_ROW(7, \"TOCK\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            _XL_TICK_SOUND();\r\n            _XL_WAIT_FOR_INPUT();\r\n         \r\n            PRINT_CENTERED_ON_ROW(9, \"ZAP\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            _XL_ZAP_SOUND();\r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            PRINT_CENTERED_ON_ROW(11, \"SHOOT\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            _XL_SHOOT_SOUND();\r\n            _XL_WAIT_FOR_INPUT();\r\n\r\n            PRINT_CENTERED_ON_ROW(13, \"EXPLOSITION\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            _XL_EXPLOSION_SOUND();\r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            for(i=0;i<_XL_NUMBER_OF_TILES;++i)\r\n            {\r\n                _XL_DRAW((i&7)*2+COL_OFFSET,(i/8)*2+ROW_OFFSET,tiles[i],tile_color[j]);\r\n                _XL_TICK_SOUND();\r\n                _XL_WAIT_FOR_INPUT();\r\n            }\r\n            \r\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n            _XL_PRINT(COL_OFFSET,YSize-5, \"PRESS FIRE\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n            \r\n            PRINT_CENTERED_ON_ROW(0, \"INPUT\");\r\n            counter = 0;\r\n            while(counter<200)\r\n            {\r\n                input = _XL_INPUT();\r\n                \r\n                if(_XL_FIRE(input))\r\n                {\r\n                    PRINT_CENTERED(\"FIRE \");\r\n                    ++counter;\r\n                }\r\n                else if(_XL_LEFT(input))\r\n                {\r\n                    PRINT_CENTERED(\"LEFT \");\r\n                    ++counter;\r\n                }\r\n                else if(_XL_RIGHT(input))\r\n                {\r\n                    PRINT_CENTERED(\"RIGHT\");\r\n                    ++counter;\r\n                }\r\n                else if(_XL_DOWN(input))\r\n                {\r\n                    PRINT_CENTERED(\"DOWN \");\r\n                    ++counter;\r\n                }\r\n                else if(_XL_UP(input))\r\n                {\r\n                    PRINT_CENTERED(\"UP   \");\r\n                    ++counter;\r\n                }\r\n\r\n                _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n            }\r\n        }\r\n    }\r\n    _XL_PRINT(COL_OFFSET,YSize-5, \"END OF DEMO\");\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape10.txt",
    "content": "........\r\n.#....#.\r\n##...#.#\r\n.#...#.#\r\n.#...#.#\r\n.#...#.#\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape11.txt",
    "content": "........\r\n.#....#.\r\n##...##.\r\n.#....#.\r\n.#....#.\r\n.#....#.\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape12.txt",
    "content": "........\r\n.#....##\r\n##...#.#\r\n.#.....#\r\n.#....#.\r\n.#...#..\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape13.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape14.txt",
    "content": "........\r\n.#...#.#\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape15.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape16.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape17.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#....#.\r\n.#....#.\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape18.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape19.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape20.txt",
    "content": "........\r\n.##...#.\r\n#.#..#.#\r\n..#..#.#\r\n.#...#.#\r\n#....#.#\r\n###...#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape21.txt",
    "content": "........\r\n.##...#.\r\n#.#..##.\r\n..#...#.\r\n.#....#.\r\n#.....#.\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape22.txt",
    "content": "........\r\n.##...##\r\n#.#..#.#\r\n..#....#\r\n.#....#.\r\n#....#..\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape23.txt",
    "content": "........\r\n.##..###\r\n#.#....#\r\n..#....#\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape24.txt",
    "content": "........\r\n.##..#.#\r\n#.#..#.#\r\n..#..#.#\r\n.#...###\r\n#......#\r\n###....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape25.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape26.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#....#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/demo_code.template/shapes/8x8/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile0.txt",
    "content": "0,66,165,165,165,165,66,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile1.txt",
    "content": "0,66,166,162,162,162,71,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile10.txt",
    "content": "0,66,197,69,69,69,226,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile11.txt",
    "content": "0,66,198,66,66,66,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile12.txt",
    "content": "0,67,197,65,66,68,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile13.txt",
    "content": "0,71,193,65,71,65,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile14.txt",
    "content": "0,69,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile15.txt",
    "content": "0,71,196,68,71,65,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile16.txt",
    "content": "0,71,196,68,71,69,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile17.txt",
    "content": "0,71,193,65,66,66,226,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile18.txt",
    "content": "0,71,197,69,71,69,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile19.txt",
    "content": "0,71,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile2.txt",
    "content": "0,67,165,161,162,164,71,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile20.txt",
    "content": "0,98,165,37,69,133,226,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile21.txt",
    "content": "0,98,166,34,66,130,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile22.txt",
    "content": "0,99,165,33,66,132,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile23.txt",
    "content": "0,103,161,33,71,129,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile24.txt",
    "content": "0,101,165,37,71,129,225,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile25.txt",
    "content": "0,103,164,36,71,129,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile26.txt",
    "content": "0,103,164,36,71,133,231,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile3.txt",
    "content": "0,71,161,161,167,161,71,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile4.txt",
    "content": "0,69,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile5.txt",
    "content": "0,71,164,164,167,161,71,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile6.txt",
    "content": "0,71,164,164,167,165,71,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile7.txt",
    "content": "0,71,161,161,162,162,66,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile8.txt",
    "content": "0,71,165,165,167,165,71,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/8x8/tile9.txt",
    "content": "0,71,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/demo_code.template/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\n\r\n\r\nint main(void)\r\n{        \r\n\r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n    \r\n    _XL_INIT_SOUND();\r\n\r\n    _XL_CLEAR_SCREEN();\r\n\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n\r\n    PRINT_CENTERED(\"HELLO WORLD\");\r\n\r\n\t_XL_REFRESH();\r\n\r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape10.txt",
    "content": "........\r\n.#....#.\r\n##...#.#\r\n.#...#.#\r\n.#...#.#\r\n.#...#.#\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape11.txt",
    "content": "........\r\n.#....#.\r\n##...##.\r\n.#....#.\r\n.#....#.\r\n.#....#.\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape12.txt",
    "content": "........\r\n.#....##\r\n##...#.#\r\n.#.....#\r\n.#....#.\r\n.#...#..\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape13.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape14.txt",
    "content": "........\r\n.#...#.#\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape15.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape16.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape17.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#....#.\r\n.#....#.\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape18.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape19.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape20.txt",
    "content": "........\r\n.##...#.\r\n#.#..#.#\r\n..#..#.#\r\n.#...#.#\r\n#....#.#\r\n###...#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape21.txt",
    "content": "........\r\n.##...#.\r\n#.#..##.\r\n..#...#.\r\n.#....#.\r\n#.....#.\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape22.txt",
    "content": "........\r\n.##...##\r\n#.#..#.#\r\n..#....#\r\n.#....#.\r\n#....#..\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape23.txt",
    "content": "........\r\n.##..###\r\n#.#....#\r\n..#....#\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape24.txt",
    "content": "........\r\n.##..#.#\r\n#.#..#.#\r\n..#..#.#\r\n.#...###\r\n#......#\r\n###....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape25.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape26.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#....#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/helloworld_code.template/shapes/8x8/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile0.txt",
    "content": "0,66,165,165,165,165,66,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile1.txt",
    "content": "0,66,166,162,162,162,71,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile10.txt",
    "content": "0,66,197,69,69,69,226,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile11.txt",
    "content": "0,66,198,66,66,66,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile12.txt",
    "content": "0,67,197,65,66,68,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile13.txt",
    "content": "0,71,193,65,71,65,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile14.txt",
    "content": "0,69,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile15.txt",
    "content": "0,71,196,68,71,65,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile16.txt",
    "content": "0,71,196,68,71,69,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile17.txt",
    "content": "0,71,193,65,66,66,226,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile18.txt",
    "content": "0,71,197,69,71,69,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile19.txt",
    "content": "0,71,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile2.txt",
    "content": "0,67,165,161,162,164,71,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile20.txt",
    "content": "0,98,165,37,69,133,226,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile21.txt",
    "content": "0,98,166,34,66,130,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile22.txt",
    "content": "0,99,165,33,66,132,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile23.txt",
    "content": "0,103,161,33,71,129,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile24.txt",
    "content": "0,101,165,37,71,129,225,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile25.txt",
    "content": "0,103,164,36,71,129,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile26.txt",
    "content": "0,103,164,36,71,133,231,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile3.txt",
    "content": "0,71,161,161,167,161,71,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile4.txt",
    "content": "0,69,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile5.txt",
    "content": "0,71,164,164,167,161,71,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile6.txt",
    "content": "0,71,164,164,167,165,71,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile7.txt",
    "content": "0,71,161,161,162,162,66,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile8.txt",
    "content": "0,71,165,165,167,165,71,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/8x8/tile9.txt",
    "content": "0,71,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/helloworld_code.template/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subject to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n\r\n#if ((YSize)+(Y_OFFSET)-1)>19\r\n    #define MAX_TILES 19\r\n#else\r\n    #define MAX_TILES ((YSize)+(Y_OFFSET)-1)\r\n#endif\r\n\r\n\r\n#define NUMBER_OF_COLORS 6\r\n#define MAX_STRING_SIZE 10\r\n\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n    _XL_PRINT(((uint8_t) (XSize - strlen(Text))>>1), row, Text);    \r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n    PRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\n\r\n \r\nconst uint8_t tiles[] = {\r\n        _TILE_0, _TILE_1, _TILE_2, _TILE_3, \r\n        _TILE_4, _TILE_5, _TILE_6, _TILE_7, \r\n        _TILE_8, _TILE_9, _TILE_10, _TILE_11, \r\n        _TILE_12, _TILE_13, _TILE_14, _TILE_15, \r\n        _TILE_16, _TILE_17, _TILE_18, _TILE_19,\r\n        _TILE_20, _TILE_21, _TILE_22, _TILE_23, \r\n        _TILE_24, _TILE_25, _TILE_26\r\n        };\r\n\r\n\r\n#if !defined(_XL_NO_COLOR)\r\nstatic const uint8_t tile_color[NUMBER_OF_COLORS] = {_XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE};\r\n#endif\r\n\r\n\r\nconst char color_name[NUMBER_OF_COLORS][MAX_STRING_SIZE] = { \r\n                                \"WHITE\", \r\n                                \"RED\", \r\n                                \"CYAN\", \r\n                                \"GREEN\", \r\n                                \"YELLOW\", \r\n                                \"BLUE\", \r\n                                };\r\n\r\n\r\n#define COL_OFFSET 4\r\n#define ROW_OFFSET 12\r\n\r\nint main(void)\r\n{        \r\n\r\n    uint8_t i;\r\n    \r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n\r\n    _XL_INIT_SOUND();\r\n\r\n\r\n    _XL_CLEAR_SCREEN();\r\n\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n\r\n    _XL_PRINT(COL_OFFSET,   1, \"PRINTD\");\r\n    _XL_PRINTD(COL_OFFSET  ,2,5, 1234U);\r\n    _XL_PRINTD(COL_OFFSET+5,2,5,56789U);\r\n\r\n\r\n    _XL_PRINT(COL_OFFSET, 4, _XL_a _XL_b _XL_c _XL_d _XL_e _XL_f _XL_g _XL_h _XL_i _XL_j);\r\n    _XL_PRINT(COL_OFFSET, 5, _XL_k _XL_l _XL_m _XL_n _XL_o _XL_p _XL_q _XL_r _XL_s _XL_t);\r\n    _XL_PRINT(COL_OFFSET, 6, _XL_u _XL_v _XL_w _XL_x _XL_y _XL_z);\r\n    _XL_PRINT(COL_OFFSET, 8, _XL_A _XL_B _XL_C _XL_D _XL_E _XL_F _XL_G _XL_H _XL_I _XL_J);\r\n    _XL_PRINT(COL_OFFSET, 9, _XL_K _XL_L _XL_M _XL_N _XL_O _XL_P _XL_Q _XL_R _XL_S _XL_T);\r\n    _XL_PRINT(COL_OFFSET,10, _XL_U _XL_V _XL_W _XL_X _XL_Y _XL_Z);\r\n\r\n    \r\n    for(i=0;i<_XL_NUMBER_OF_TILES;++i)\r\n    {\r\n        _XL_DRAW((i&7)*2+COL_OFFSET,(i/8)+ROW_OFFSET,tiles[i],tile_color[i%NUMBER_OF_COLORS]);\r\n       \r\n    }\r\n    \r\n    for(i=0;i<YSize;++i)\r\n    {\r\n        _XL_DRAW(0,i,tiles[0],0);\r\n        _XL_DRAW(XSize-1,i,tiles[0],0);\r\n    }\r\n    for(i=0;i<XSize;++i)\r\n    {\r\n        _XL_DRAW(i,0,tiles[1],0);\r\n        _XL_DRAW(i,YSize-1,tiles[1],0);\r\n    }\r\n    _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n\r\n    _XL_SLOW_DOWN(_XL_SLOW_DOWN_FACTOR);\r\n\r\n    _XL_PRINT(COL_OFFSET,YSize-2, \"END OF TEST\");\r\n    _XL_REFRESH();\r\n    \r\n    while(1){};\r\n    \r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/shapes/8x8/shape19.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n...##...\r\n..#..#..\r\n...##...\r\n.##..##.\r\n\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/shapes/8x8/shape20.txt",
    "content": "#..##..#\r\n...##...\r\n..#..#..\r\n.##..##.\r\n........\r\n........\r\n........\r\n........\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/shapes/8x8/shape21.txt",
    "content": "........\r\n........\r\n........\r\n........\r\n...##...\r\n..####..\r\n...##...\r\n.##..##."
  },
  {
    "path": "src/template_projects/test_code.template/shapes/8x8/shape22.txt",
    "content": ".......#\r\n......##\r\n.......#\r\n....####\r\n.......#\r\n.......#\r\n......#.\r\n......#.\r\n\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/shapes/8x8/shape23.txt",
    "content": "#.......\r\n##......\r\n#.......\r\n####....\r\n#.......\r\n#.......\r\n.#......\r\n.#......\r\n\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/shapes/8x8/shape26.txt",
    "content": "..####..\r\n.######.\r\n#..##..#\r\n#..##..#\r\n.######.\r\n..#..#..\r\n.######.\r\n##.##.##\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/shapes/8x8/shape6.txt",
    "content": "#.####.#\r\n.######.\r\n#..##..#\r\n##.##.##\r\n.######.\r\n..####..\r\n.######.\r\n##.##.##\r\n"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  63"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile25_ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile0.txt",
    "content": "12,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile1.txt",
    "content": "0,0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile10.txt",
    "content": "0,0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile11.txt",
    "content": "0,0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile12.txt",
    "content": "0,16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile13.txt",
    "content": "0,0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile14.txt",
    "content": "0,0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile15.txt",
    "content": "0,0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile16.txt",
    "content": "0,0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile17.txt",
    "content": "2,2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile18.txt",
    "content": "16,16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile19.txt",
    "content": "45,18,12,51,45,12,18,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile2.txt",
    "content": "18,18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile20.txt",
    "content": "0,0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile21.txt",
    "content": "0,0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile22.txt",
    "content": "0,0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile23.txt",
    "content": "0,0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile24.txt",
    "content": "0,63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile25 _ORIG.txt",
    "content": "0,8, 31, 16, 30,  2,62,  4,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile25.txt",
    "content": "63,8, 31, 16, 30,  2,62,  4,63"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile3.txt",
    "content": "0,0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile4.txt",
    "content": "45,12,18,18,0,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile5.txt",
    "content": "0,0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile6.txt",
    "content": "12,51,45,12,18,18,18,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile8.txt",
    "content": "0,0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/6x9/tile9.txt",
    "content": "0,2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile0.txt",
    "content": "12,18,12,51,45,12,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile1.txt",
    "content": "0,0,12,18,12,51,45,12"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile10.txt",
    "content": "0,0,0,32,16,40,8,8"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile11.txt",
    "content": "0,0,0,1,2,5,4,4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile12.txt",
    "content": "16,56,16,60,18,21,57,41"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile13.txt",
    "content": "0,0,0,15,16,40,39,32"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile14.txt",
    "content": "0,42,42,58,42,42,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile15.txt",
    "content": "0,37,37,37,37,50,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile16.txt",
    "content": "0,0,0,60,2,5,57,1"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile18.txt",
    "content": "16,56,16,16,16,16,16,40"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile19.txt",
    "content": "45,18,12,51,45,12,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile2.txt",
    "content": "18,18,0,0,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile20.txt",
    "content": "0,0,45,18,12,51,45,12"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile21.txt",
    "content": "0,0,0,0,45,18,12,51"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile22.txt",
    "content": "0,0,0,0,0,0,45,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile23.txt",
    "content": "0,4,21,14,27,14,21,4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile24.txt",
    "content": "63,41,63,37,63,41,63,37"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile25.txt",
    "content": "$ff,$3e,$60,$3c,$06,$7c,$18,$ff"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile25_ORIG.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile3.txt",
    "content": "0,0,0,0,12,18,12,51"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile4.txt",
    "content": "45,12,18,18,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile5.txt",
    "content": "0,0,0,0,0,0,12,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile6.txt",
    "content": "12,51,45,12,18,18,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile7.txt",
    "content": "12,18,12,0,45,0,18,18"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile8.txt",
    "content": "0,12,18,33,33,18,12,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/7x8/tile9.txt",
    "content": "2,7,2,15,18,42,39,37"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile0.txt",
    "content": "198,186,238,170,16,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile1.txt",
    "content": "0,0,198,186,238,170"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile10.txt",
    "content": "0,0,0,128,160,64"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile11.txt",
    "content": "0,0,0,3,10,4"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile12.txt",
    "content": "64,224,224,248,68,78"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile13.txt",
    "content": "0,0,0,63,64,224"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile14.txt",
    "content": "198,186,84,186,214,16"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile15.txt",
    "content": "0,0,16,130,16,84"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile16.txt",
    "content": "0,0,0,248,4,14"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile17.txt",
    "content": "4,14,14,4,4,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile18.txt",
    "content": "64,224,224,64,64,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile19.txt",
    "content": "198,186,238,170,214,16"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile2.txt",
    "content": "16,0,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile20.txt",
    "content": "238,170,214,16,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile21.txt",
    "content": "170,214,16,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile22.txt",
    "content": "214,16,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile23.txt",
    "content": "0,24,52,122,52,24"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile24.txt",
    "content": "124,255,133,255,161,255"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile25.txt",
    "content": "0,16,40,116,40,16"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile26.txt",
    "content": "0,0,16,16,16,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile3.txt",
    "content": "0,0,0,198,186,238"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile4.txt",
    "content": "170,16,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile5.txt",
    "content": "0,0,0,0,198,186"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile6.txt",
    "content": "238,170,16,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile7.txt",
    "content": "198,0,238,0,214,16"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile8.txt",
    "content": "126,231,195,195,231,126"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x6/tile9.txt",
    "content": "4,14,14,63,68,228"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile0.txt",
    "content": "24, 36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile1.txt",
    "content": "0,0,24, 36, 24,102,89, 24"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile10.txt",
    "content": "0,0,0,192,32,80,144,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile11.txt",
    "content": "0,0,0,3,4,10,9,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile12.txt",
    "content": "32,112,32,252,34,37,249,80"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile13.txt",
    "content": "0,  0,  0,63,64,160,159,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile14.txt",
    "content": "$2A,$2A,$2A,$3A,$2A,$2A,$2A,$00"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile15.txt",
    "content": "74,74,74,74,74,74,100,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile16.txt",
    "content": "0,0,0,252,2,5,249,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile17.txt",
    "content": "2,7,2,2,2,2,2,5"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile18.txt",
    "content": "32,112,32,32,32,32,32,80"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile19.txt",
    "content": "90,36, 24,102,153, 24, 36,36"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile2.txt",
    "content": "36,36,0,0,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile20.txt",
    "content": "0,0,90,36, 24,102,89, 24"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile21.txt",
    "content": "0,0,0,0,90,36, 24,102"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile22.txt",
    "content": "0,0,0,0,0,0,90,36"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile23.txt",
    "content": "8,42,28,119,28,42,8,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile24.txt",
    "content": "240,240,255,133,255,161,255,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile25.txt",
    "content": "$18,$3e,$60,$3c,$06,$7c,$18,$00"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile3.txt",
    "content": "0,0,0,0,24, 36, 24,102"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile4.txt",
    "content": "153, 24, 36,36,0,0,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile5.txt",
    "content": "0,0,0,0,0,0,24, 36"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile6.txt",
    "content": "24,102,154, 24, 36,36,0,0"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile7.txt",
    "content": "24, 36, 24,  0,153,  0, 36,36"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile8.txt",
    "content": "60,126,231,195,195,231,126,60"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/8x8/tile9.txt",
    "content": "2,7,2,63,66,162,159,5"
  },
  {
    "path": "src/template_projects/test_code.template/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n#define _TILE_0 (unsigned char) '0'\r\n\r\n#define _TILE_1 (unsigned char) '1'\r\n\r\n#define _TILE_2 (unsigned char) '2'\r\n\r\n#define _TILE_3 (unsigned char) '3'\r\n\r\n#define _TILE_4 (unsigned char) '4'\r\n\r\n#define _TILE_5 (unsigned char) '5'\r\n\r\n#define _TILE_6 (unsigned char) '6'\r\n\r\n#define _TILE_7 (unsigned char) '7'\r\n\r\n#define _TILE_8 (unsigned char) '8'\r\n\r\n#define _TILE_9 (unsigned char) '9'\r\n\r\n#define _TILE_10 (unsigned char) 'A'\r\n\r\n#define _TILE_11 (unsigned char) 'B'\r\n\r\n#define _TILE_12 (unsigned char) 'C'\r\n\r\n#define _TILE_13 (unsigned char) 'D'\r\n\r\n#define _TILE_14 (unsigned char) 'E'\r\n\r\n#define _TILE_15 (unsigned char) 'F'\r\n\r\n#define _TILE_16 (unsigned char) 'G'\r\n\r\n#define _TILE_17 (unsigned char) 'H'\r\n\r\n#define _TILE_18 (unsigned char) 'I'\r\n\r\n#define _TILE_19 (unsigned char) 'J'\r\n\r\n#define _TILE_20 (unsigned char) 'K'\r\n\r\n#define _TILE_21 (unsigned char) 'L'\r\n\r\n#define _TILE_22 (unsigned char) 'M'\r\n\r\n#define _TILE_23 (unsigned char) 'N'\r\n\r\n#define _TILE_24 (unsigned char) 'O'\r\n\r\n#define _TILE_25 (unsigned char) 'P'\r\n\r\n#define _TILE_26 (unsigned char) 'Q'\r\n\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/main.c",
    "content": "/* --------------------------------------------------------------------------------------- */ \r\n// \r\n// CROSS SHOOT by Fabrizio Caruso\r\n//\r\n// Fabrizio_Caruso@hotmail.com\r\n//\r\n// This software is provided 'as-is', without any express or implied warranty.\r\n// In no event will the authors be held liable for any damages arising from\r\n// the use of this software.\r\n\r\n// Permission is granted to anyone to use this software for non-commercial applications, \r\n// subxect to the following restrictions:\r\n\r\n// 1. The origin of this software must not be misrepresented; you must not\r\n// claim that you wrote the original software. If you use this software in\r\n// a product, an acknowledgment in the product documentation would be\r\n// appreciated but is not required.\r\n\r\n// 2. Altered source versions must be plainly marked as such, and must not\r\n// be misrepresented as being the original software.\r\n\r\n// 3. This notice may not be removed or altered from any source distribution.\r\n/* --------------------------------------------------------------------------------------- */ \r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define INITIAL_LEVEL 1\r\n#define FINAL_LEVEL 4\r\n\r\n\r\nuint16_t score;\r\nuint8_t level;\r\nuint8_t alive;\r\nuint8_t input;\r\n\r\n\r\nchar *small_letters = \r\n    _XL_a _XL_b _XL_c _XL_d _XL_e _XL_f _XL_g _XL_h _XL_i _XL_j _XL_k _XL_l _XL_m \\\r\n    _XL_n _XL_o _XL_p _XL_q _XL_r _XL_s _XL_t _XL_u _XL_v _XL_w _XL_x _XL_y _XL_z;\r\n\r\n\r\nuint8_t mystrlen(char *cstr)\r\n{\r\n\tuint8_t i;\r\n\twhile(cstr[i++]!='\\0')\r\n\t{\r\n\t}\r\n\treturn --i;\r\n}\r\n\r\nvoid PRINT_CENTERED_ON_ROW(uint8_t row, char *Text)\r\n{\r\n\t_XL_PRINT(((uint8_t) (XSize - (uint8_t) mystrlen(Text))>>1), row, Text);\t\r\n}\r\n\r\n#define PRINT_CENTERED(Text) \\\r\n\tPRINT_CENTERED_ON_ROW((YSize>>1), Text)\r\n\r\n\r\nvoid print_text(uint8_t x, uint8_t y, const char *str)\r\n{\r\n    uint8_t i;\r\n    char ch;\r\n    \r\n    i=0;\r\n    \r\n    while((ch=str[i]))\r\n    {\r\n        if((ch>='a')&&(ch<='z'))\r\n        {\r\n            _XL_CHAR(x+i,y,small_letters[ch-'a']);\r\n        }\r\n        else\r\n        {\r\n            _XL_CHAR(x+i,y,ch);\r\n        }\r\n        ++i;\r\n    }\r\n}\r\n\r\nint main(void)\r\n{        \r\n\r\n    _XL_INIT_GRAPHICS();\r\n\r\n    _XL_INIT_INPUT();\r\n    \r\n    _XL_INIT_SOUND();\r\n    \r\n\r\n    // MAIN END-LESS LOOP\r\n    while(1)\r\n    {\r\n        score = 0;\r\n        alive = 1;\r\n        level = INITIAL_LEVEL;\r\n\r\n        _XL_CLEAR_SCREEN();\r\n            \r\n        _XL_SET_TEXT_COLOR(_XL_RED);\r\n        PRINT_CENTERED_ON_ROW(4, \"_GAME_NAME_CAPITAL\");\r\n        _XL_SET_TEXT_COLOR(_XL_CYAN);\r\n        print_text(XSize/2-5,6, \"by author\");\r\n        _XL_SET_TEXT_COLOR(_XL_WHITE);\r\n        \r\n        print_text(XSize/2-6,YSize-1, \"Press FIRE\");\r\n        _XL_WAIT_FOR_INPUT();\r\n        \r\n        _XL_CLEAR_SCREEN();\r\n        \r\n        alive = 1; \r\n        // GAME LOOP\r\n        while(alive && (level<FINAL_LEVEL+1))\r\n        {\r\n\r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            print_text(0,0,\"Level\");\r\n            _XL_PRINTD(7,0,1,level);\r\n                  \r\n            \r\n            _XL_SLEEP(1);\r\n            print_text(XSize/2-6,14, \"Press FIRE\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            _XL_CLEAR_SCREEN();\r\n            \r\n            print_text(0,0, \"Score\");\r\n            _XL_PRINTD(7,0,5,score);\r\n            \r\n            score+=100;\r\n            \r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            print_text(0,0, \"Score\");\r\n            _XL_PRINTD(7,0,5,score);\r\n            \r\n            print_text(XSize/2-6,14, \"Press FIRE\");\r\n            _XL_WAIT_FOR_INPUT();\r\n            \r\n            ++level;\r\n\r\n        }\r\n    } // while(1) -> restart from level 1\r\n\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape0.txt",
    "content": "......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape1.txt",
    "content": "......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape10.txt",
    "content": "......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape11.txt",
    "content": "......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape12.txt",
    "content": "......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape13.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape14.txt",
    "content": "......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape15.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape16.txt",
    "content": "......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape17.txt",
    "content": "......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape18.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape19.txt",
    "content": "......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape2.txt",
    "content": "......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape20.txt",
    "content": "......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape21.txt",
    "content": "......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape22.txt",
    "content": "......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape23.txt",
    "content": "......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape24.txt",
    "content": "......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape25.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape26.txt",
    "content": "......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape3.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape4.txt",
    "content": "......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape5.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape6.txt",
    "content": "......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape7.txt",
    "content": "......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape8.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x8/shape9.txt",
    "content": "......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape0.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n#.##.#\r\n.#..#.\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape1.txt",
    "content": "......\r\n......\r\n.#..#.\r\n#.###.\r\n#.#.#.\r\n#.#.#.\r\n#.#.#.\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape10.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.#.#\r\n.#.#.#\r\n.#.#.#\r\n.#.#.#\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape11.txt",
    "content": "......\r\n......\r\n.#..#.\r\n##.##.\r\n.#..#.\r\n.#..#.\r\n.#..#.\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape12.txt",
    "content": "......\r\n......\r\n.#..##\r\n##.#.#\r\n.#...#\r\n.#..#.\r\n.#.#..\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape13.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape14.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape15.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#...#\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape16.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#..\r\n.#.#..\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape17.txt",
    "content": "......\r\n......\r\n.#.###\r\n##...#\r\n.#...#\r\n.#..#.\r\n.#..#.\r\n###.#.\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape18.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#.#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape19.txt",
    "content": "......\r\n......\r\n.#.###\r\n##.#.#\r\n.#.#.#\r\n.#.###\r\n.#...#\r\n###..#\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape2.txt",
    "content": "......\r\n......\r\n.#..##\r\n#.##.#\r\n#.#..#\r\n#.#.#.\r\n#.##..\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape20.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.##.#\r\n..##.#\r\n.#.#.#\r\n#..#.#\r\n###.#.\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape21.txt",
    "content": "......\r\n......\r\n.##.#.\r\n#.###.\r\n..#.#.\r\n.#..#.\r\n#...#.\r\n######\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape22.txt",
    "content": "......\r\n......\r\n.##.##\r\n#.##.#\r\n..#..#\r\n.#..#.\r\n#..#..\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape23.txt",
    "content": "......\r\n......\r\n.#####\r\n#.#..#\r\n..#..#\r\n.#.###\r\n#....#\r\n######\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape24.txt",
    "content": "......\r\n......\r\n.###.#\r\n#.##.#\r\n..##.#\r\n.#.###\r\n#....#\r\n###..#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape25.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#....#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape26.txt",
    "content": "......\r\n......\r\n.#####\r\n#.##..\r\n..##..\r\n.#.###\r\n#..#.#\r\n######\r\n......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape3.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape4.txt",
    "content": "......\r\n......\r\n.#.#.#\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape5.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.#..#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape6.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##..\r\n#.##..\r\n#.####\r\n#.##.#\r\n.#.###\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape7.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.#..#\r\n#.#..#\r\n#.#.#.\r\n#.#.#.\r\n.#..#.\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape8.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.##.#\r\n.#.###\r\n......"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/6x9/shape9.txt",
    "content": "......\r\n......\r\n.#.###\r\n#.##.#\r\n#.##.#\r\n#.####\r\n#.#..#\r\n.#...#\r\n......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape0.txt",
    "content": ".......\r\n.#...#.\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.#.#\r\n.#...#.\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape1.txt",
    "content": ".......\r\n.#...#.\r\n#.#.##.\r\n#.#..#.\r\n#.#..#.\r\n#.#..#.\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape10.txt",
    "content": ".......\r\n.#...#.\r\n##..#.#\r\n.#..#.#\r\n.#..#.#\r\n.#..#.#\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape11.txt",
    "content": ".......\r\n.#...#.\r\n##..##.\r\n.#...#.\r\n.#...#.\r\n.#...#.\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape12.txt",
    "content": ".......\r\n.#...##\r\n##..#.#\r\n.#....#\r\n.#...#.\r\n.#..#..\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape13.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape14.txt",
    "content": ".......\r\n.#..#.#\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape15.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#....#\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape16.txt",
    "content": ".......\r\n.#..###\r\n##..#..\r\n.#..#..\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape17.txt",
    "content": ".......\r\n.#..###\r\n##....#\r\n.#....#\r\n.#...#.\r\n.#...#.\r\n###..#.\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape18.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#..#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape19.txt",
    "content": ".......\r\n.#..###\r\n##..#.#\r\n.#..#.#\r\n.#..###\r\n.#....#\r\n###...#\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape2.txt",
    "content": ".......\r\n.#...##\r\n#.#.#.#\r\n#.#...#\r\n#.#..#.\r\n#.#.#..\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape20.txt",
    "content": ".......\r\n.##..#.\r\n#.#.#.#\r\n..#.#.#\r\n.#..#.#\r\n#...#.#\r\n###..#.\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape21.txt",
    "content": ".......\r\n.##..#.\r\n#.#.##.\r\n..#..#.\r\n.#...#.\r\n#....#.\r\n###.###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape22.txt",
    "content": ".......\r\n.##..##\r\n#.#.#.#\r\n..#...#\r\n.#...#.\r\n#...#..\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape23.txt",
    "content": ".......\r\n.##.###\r\n#.#...#\r\n..#...#\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape24.txt",
    "content": ".......\r\n.##.#.#\r\n#.#.#.#\r\n..#.#.#\r\n.#..###\r\n#.....#\r\n###...#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape25.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#.....#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape26.txt",
    "content": ".......\r\n.##.###\r\n#.#.#..\r\n..#.#..\r\n.#..###\r\n#...#.#\r\n###.###\r\n.......\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape3.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape4.txt",
    "content": ".......\r\n.#..#.#\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape5.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#...#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape6.txt",
    "content": ".......\r\n.#..###\r\n#.#.#..\r\n#.#.#..\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape7.txt",
    "content": ".......\r\n.#..###\r\n#.#...#\r\n#.#...#\r\n#.#..#.\r\n#.#..#.\r\n.#...#.\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape8.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#.#.#\r\n.#..###\r\n......."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/7x8/shape9.txt",
    "content": ".......\r\n.#..###\r\n#.#.#.#\r\n#.#.#.#\r\n#.#.###\r\n#.#...#\r\n.#....#\r\n.......\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape0.txt",
    "content": ".#....#.\n#.#..#.#\n#.#..#.#\n#.#..#.#\n#.#..#.#\n.#....#.\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape1.txt",
    "content": ".#....#.\n#.#..##.\n#.#...#.\n#.#...#.\n#.#...#.\n.#...###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape10.txt",
    "content": ".#....#.\n##...#.#\n.#...#.#\n.#...#.#\n.#...#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape11.txt",
    "content": ".#....#.\n##...##.\n.#....#.\n.#....#.\n.#....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape12.txt",
    "content": ".#....##\n##...#.#\n.#.....#\n.#....#.\n.#...#..\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape13.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape14.txt",
    "content": ".#...#.#\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape15.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#.....#\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape16.txt",
    "content": ".#...###\n##...#..\n.#...#..\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape17.txt",
    "content": ".#...###\n##.....#\n.#.....#\n.#....#.\n.#....#.\n###...#.\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape18.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#...#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape19.txt",
    "content": ".#...###\n##...#.#\n.#...#.#\n.#...###\n.#.....#\n###....#\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape2.txt",
    "content": ".#....##\n#.#..#.#\n#.#....#\n#.#...#.\n#.#..#..\n.#...###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape20.txt",
    "content": ".##...#.\n#.#..#.#\n..#..#.#\n.#...#.#\n#....#.#\n###...#.\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape21.txt",
    "content": ".##...#.\n#.#..##.\n..#...#.\n.#....#.\n#.....#.\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape22.txt",
    "content": ".##...##\n#.#..#.#\n..#....#\n.#....#.\n#....#..\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape23.txt",
    "content": ".##..###\n#.#....#\n..#....#\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape24.txt",
    "content": ".##..#.#\n#.#..#.#\n..#..#.#\n.#...###\n#......#\n###....#\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape25.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#......#\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape26.txt",
    "content": ".##..###\n#.#..#..\n..#..#..\n.#...###\n#....#.#\n###..###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape3.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape4.txt",
    "content": ".#...#.#\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape5.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#....#\n.#...###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape6.txt",
    "content": ".#...###\n#.#..#..\n#.#..#..\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape7.txt",
    "content": ".#...###\n#.#....#\n#.#....#\n#.#...#.\n#.#...#.\n.#....#.\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape8.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#..#.#\n.#...###\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x6/shape9.txt",
    "content": ".#...###\n#.#..#.#\n#.#..#.#\n#.#..###\n#.#....#\n.#.....#\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape0.txt",
    "content": "........\r\n.#....#.\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..#.#\r\n.#....#.\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape1.txt",
    "content": "........\r\n.#....#.\r\n#.#..##.\r\n#.#...#.\r\n#.#...#.\r\n#.#...#.\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape10.txt",
    "content": "........\r\n.#....#.\r\n##...#.#\r\n.#...#.#\r\n.#...#.#\r\n.#...#.#\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape11.txt",
    "content": "........\r\n.#....#.\r\n##...##.\r\n.#....#.\r\n.#....#.\r\n.#....#.\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape12.txt",
    "content": "........\r\n.#....##\r\n##...#.#\r\n.#.....#\r\n.#....#.\r\n.#...#..\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape13.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape14.txt",
    "content": "........\r\n.#...#.#\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape15.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#.....#\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape16.txt",
    "content": "........\r\n.#...###\r\n##...#..\r\n.#...#..\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape17.txt",
    "content": "........\r\n.#...###\r\n##.....#\r\n.#.....#\r\n.#....#.\r\n.#....#.\r\n###...#.\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape18.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#...#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape19.txt",
    "content": "........\r\n.#...###\r\n##...#.#\r\n.#...#.#\r\n.#...###\r\n.#.....#\r\n###....#\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape2.txt",
    "content": "........\r\n.#....##\r\n#.#..#.#\r\n#.#....#\r\n#.#...#.\r\n#.#..#..\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape20.txt",
    "content": "........\r\n.##...#.\r\n#.#..#.#\r\n..#..#.#\r\n.#...#.#\r\n#....#.#\r\n###...#.\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape21.txt",
    "content": "........\r\n.##...#.\r\n#.#..##.\r\n..#...#.\r\n.#....#.\r\n#.....#.\r\n###..###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape22.txt",
    "content": "........\r\n.##...##\r\n#.#..#.#\r\n..#....#\r\n.#....#.\r\n#....#..\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape23.txt",
    "content": "........\r\n.##..###\r\n#.#....#\r\n..#....#\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape24.txt",
    "content": "........\r\n.##..#.#\r\n#.#..#.#\r\n..#..#.#\r\n.#...###\r\n#......#\r\n###....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape25.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#......#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape26.txt",
    "content": "........\r\n.##..###\r\n#.#..#..\r\n..#..#..\r\n.#...###\r\n#....#.#\r\n###..###\r\n........\r\n\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape3.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape4.txt",
    "content": "........\r\n.#...#.#\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape5.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#....#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape6.txt",
    "content": "........\r\n.#...###\r\n#.#..#..\r\n#.#..#..\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape7.txt",
    "content": "........\r\n.#...###\r\n#.#....#\r\n#.#....#\r\n#.#...#.\r\n#.#...#.\r\n.#....#.\r\n........."
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape8.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#..#.#\r\n.#...###\r\n........"
  },
  {
    "path": "src/template_projects/text_game_code.template/shapes/8x8/shape9.txt",
    "content": "........\r\n.#...###\r\n#.#..#.#\r\n#.#..#.#\r\n#.#..###\r\n#.#....#\r\n.#.....#\r\n........\r\n"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile0.txt",
    "content": "0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile1.txt",
    "content": "0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile10.txt",
    "content": "0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile11.txt",
    "content": "0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile12.txt",
    "content": "0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile13.txt",
    "content": "0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile14.txt",
    "content": "0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile15.txt",
    "content": "0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile16.txt",
    "content": "0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile17.txt",
    "content": "0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile18.txt",
    "content": "0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile19.txt",
    "content": "0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile2.txt",
    "content": "0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile20.txt",
    "content": "0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile21.txt",
    "content": "0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile22.txt",
    "content": "0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile23.txt",
    "content": "0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile24.txt",
    "content": "0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile25.txt",
    "content": "0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile26.txt",
    "content": "0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile3.txt",
    "content": "0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile4.txt",
    "content": "0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile5.txt",
    "content": "0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile6.txt",
    "content": "0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile7.txt",
    "content": "0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile8.txt",
    "content": "0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x8/tile9.txt",
    "content": "0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile0.txt",
    "content": "0,0,18,45,45,45,45,18,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile1.txt",
    "content": "0,0,18,46,42,42,42,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile10.txt",
    "content": "0,0,18,53,21,21,21,58,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile11.txt",
    "content": "0,0,18,54,18,18,18,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile12.txt",
    "content": "0,0,19,53,17,18,20,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile13.txt",
    "content": "0,0,23,49,17,23,17,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile14.txt",
    "content": "0,0,21,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile15.txt",
    "content": "0,0,23,52,20,23,17,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile16.txt",
    "content": "0,0,23,52,20,23,21,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile17.txt",
    "content": "0,0,23,49,17,18,18,58,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile18.txt",
    "content": "0,0,23,53,21,23,21,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile19.txt",
    "content": "0,0,23,53,21,23,17,57,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile2.txt",
    "content": "0,0,19,45,41,42,44,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile20.txt",
    "content": "0,0,26,45,13,21,37,58,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile21.txt",
    "content": "0,0,26,46,10,18,34,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile22.txt",
    "content": "0,0,27,45,9,18,36,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile23.txt",
    "content": "0,0,31,41,9,23,33,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile24.txt",
    "content": "0,0,29,45,13,23,33,57,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile25.txt",
    "content": "0,0,31,44,12,23,33,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile26.txt",
    "content": "0,0,31,44,12,23,37,63,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile3.txt",
    "content": "0,0,23,41,41,47,41,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile4.txt",
    "content": "0,0,21,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile5.txt",
    "content": "0,0,23,44,44,47,41,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile6.txt",
    "content": "0,0,23,44,44,47,45,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile7.txt",
    "content": "0,0,23,41,41,42,42,18,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile8.txt",
    "content": "0,0,23,45,45,47,45,23,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/6x9/tile9.txt",
    "content": "0,0,23,45,45,47,41,17,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile0.txt",
    "content": "0,34,85,85,85,85,34,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile1.txt",
    "content": "0,34,86,82,82,82,39,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile10.txt",
    "content": "0,34,101,37,37,37,114,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile11.txt",
    "content": "0,34,102,34,34,34,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile12.txt",
    "content": "0,35,101,33,34,36,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile13.txt",
    "content": "0,39,97,33,39,33,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile14.txt",
    "content": "0,37,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile15.txt",
    "content": "0,39,100,36,39,33,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile16.txt",
    "content": "0,39,100,36,39,37,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile17.txt",
    "content": "0,39,97,33,34,34,114,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile18.txt",
    "content": "0,39,101,37,39,37,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile19.txt",
    "content": "0,39,101,37,39,33,113,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile2.txt",
    "content": "0,35,85,81,82,84,39,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile20.txt",
    "content": "0,50,85,21,37,69,114,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile21.txt",
    "content": "0,50,86,18,34,66,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile22.txt",
    "content": "0,51,85,17,34,68,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile23.txt",
    "content": "0,55,81,17,39,65,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile24.txt",
    "content": "0,53,85,21,39,65,113,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile25.txt",
    "content": "0,55,84,20,39,65,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile26.txt",
    "content": "0,55,84,20,39,69,119,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile3.txt",
    "content": "0,39,81,81,87,81,39,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile4.txt",
    "content": "0,37,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile5.txt",
    "content": "0,39,84,84,87,81,39,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile6.txt",
    "content": "0,39,84,84,87,85,39,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile7.txt",
    "content": "0,39,81,81,82,82,34,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile8.txt",
    "content": "0,39,85,85,87,85,39,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/7x8/tile9.txt",
    "content": "0,39,85,85,87,81,33,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile0.txt",
    "content": "66,165,165,165,165,66"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile1.txt",
    "content": "66,166,162,162,162,71"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile10.txt",
    "content": "66,197,69,69,69,226"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile11.txt",
    "content": "66,198,66,66,66,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile12.txt",
    "content": "67,197,65,66,68,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile13.txt",
    "content": "71,193,65,71,65,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile14.txt",
    "content": "69,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile15.txt",
    "content": "71,196,68,71,65,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile16.txt",
    "content": "71,196,68,71,69,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile17.txt",
    "content": "71,193,65,66,66,226"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile18.txt",
    "content": "71,197,69,71,69,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile19.txt",
    "content": "71,197,69,71,65,225"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile2.txt",
    "content": "67,165,161,162,164,71"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile20.txt",
    "content": "98,165,37,69,133,226"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile21.txt",
    "content": "98,166,34,66,130,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile22.txt",
    "content": "99,165,33,66,132,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile23.txt",
    "content": "103,161,33,71,129,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile24.txt",
    "content": "101,165,37,71,129,225"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile25.txt",
    "content": "103,164,36,71,129,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile26.txt",
    "content": "103,164,36,71,133,231"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile3.txt",
    "content": "71,161,161,167,161,71"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile4.txt",
    "content": "69,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile5.txt",
    "content": "71,164,164,167,161,71"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile6.txt",
    "content": "71,164,164,167,165,71"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile7.txt",
    "content": "71,161,161,162,162,66"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile8.txt",
    "content": "71,165,165,167,165,71"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x6/tile9.txt",
    "content": "71,165,165,167,161,65"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile0.txt",
    "content": "0,66,165,165,165,165,66,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile1.txt",
    "content": "0,66,166,162,162,162,71,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile10.txt",
    "content": "0,66,197,69,69,69,226,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile11.txt",
    "content": "0,66,198,66,66,66,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile12.txt",
    "content": "0,67,197,65,66,68,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile13.txt",
    "content": "0,71,193,65,71,65,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile14.txt",
    "content": "0,69,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile15.txt",
    "content": "0,71,196,68,71,65,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile16.txt",
    "content": "0,71,196,68,71,69,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile17.txt",
    "content": "0,71,193,65,66,66,226,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile18.txt",
    "content": "0,71,197,69,71,69,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile19.txt",
    "content": "0,71,197,69,71,65,225,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile2.txt",
    "content": "0,67,165,161,162,164,71,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile20.txt",
    "content": "0,98,165,37,69,133,226,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile21.txt",
    "content": "0,98,166,34,66,130,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile22.txt",
    "content": "0,99,165,33,66,132,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile23.txt",
    "content": "0,103,161,33,71,129,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile24.txt",
    "content": "0,101,165,37,71,129,225,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile25.txt",
    "content": "0,103,164,36,71,129,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile26.txt",
    "content": "0,103,164,36,71,133,231,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile3.txt",
    "content": "0,71,161,161,167,161,71,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile4.txt",
    "content": "0,69,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile5.txt",
    "content": "0,71,164,164,167,161,71,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile6.txt",
    "content": "0,71,164,164,167,165,71,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile7.txt",
    "content": "0,71,161,161,162,162,66,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile8.txt",
    "content": "0,71,165,165,167,165,71,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/8x8/tile9.txt",
    "content": "0,71,165,165,167,161,65,0"
  },
  {
    "path": "src/template_projects/text_game_code.template/tiles/ASCII/char_tiles.h",
    "content": "#ifndef _CHAR_TILES_H\r\n#define _CHAR_TILES_H\r\n\r\n#include \"cross_lib.h\"\r\n\r\n\r\n#define _TILE_0 '*'\r\n#define _TILE_1 '*'\r\n\r\n#define _TILE_2 '-'\r\n\r\n#define _TILE_3 '-'\r\n\r\n// Apple\r\n#define _TILE_4 'O'\r\n\r\n// Body\r\n#define _TILE_5 'O'\r\n\r\n#define _TILE_6 'H'\r\n\r\n#define _TILE_7 '='\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_8 'R'\r\n#else\r\n    #define _TILE_8 'O'\r\n#endif\r\n\r\n#define _TILE_9 'L'\r\n\r\n#define _TILE_10 '='\r\n\r\n#define _TILE_11 'I'\r\n#define _TILE_12 'I'\r\n\r\n#define _TILE_13 '-'\r\n\r\n#define _TILE_14 'S'\r\n\r\n#define _TILE_15 'I'\r\n\r\n#define _TILE_16 'C'\r\n\r\n#define _TILE_17 'X'\r\n\r\n#if defined(_XL_NO_COLOR)\r\n    #define _TILE_18 'S'\r\n#else\r\n    #define _TILE_18 'O'\r\n#endif\r\n\r\n#define _TILE_26 'J'\r\n\r\n#endif // _CHAR_TILES_H\r\n\r\n"
  },
  {
    "path": "src/unit_tests/testDefaults.py",
    "content": "import unittest\r\nimport sys\r\n\r\n\r\nsys.path.append(\"modules\")\r\n\r\nfrom option_functions import OptionConfig\r\nfrom default_values import *\r\n\r\ndefault_option_config = OptionConfig()\r\n\r\nclass testDefaults(unittest.TestCase):\r\n\r\n    # no_default\r\n    def test_no_defaults_1(self):\r\n        params = (\"build\", \"helloworld\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,params)\r\n\r\n    def test_no_defaults_2(self):\r\n        params = (\"build\", \"tiles\", \"vic20\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,params)\r\n\r\n    def test_terminal_1(self):\r\n        params = (\"build\", \"helloworld\", \"terminal\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal', '20', '17'])\r\n\r\n    def test_terminal_2(self):\r\n        params = (\"build\", \"helloworld\",\"terminal\", \"vic20\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x8', '22', '23'])\r\n\r\n    def test_terminal_3(self):\r\n        params = (\"build\", \"helloworld\",\"terminal\", \"atari\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x8', '20', '24'])\r\n\r\n    def test_terminal_4(self):\r\n        params = (\"build\", \"helloworld\",\"terminal6x8\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal6x8', '40', '24'])\r\n\r\n    def test_terminal_5(self):\r\n        params = (\"build\", \"helloworld\",\"terminal8x6\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x6', '20', '17'])\r\n\r\n    def test_terminal_6(self):\r\n        params = (\"build\", \"helloworld\",\"terminal7x8\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal7x8', '20', '24'])\r\n\r\n    def test_terminal_7(self):\r\n        params = (\"build\", \"helloworld\",\"terminal6x9\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal6x9', '40', '24'])\r\n\r\n    def test_terminal_8(self):\r\n        params = (\"build\", \"helloworld\",\"terminal8x8\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x8', '20', '17'])\r\n\r\n    def test_terminal_9(self):\r\n        params = (\"build\", \"helloworld\",\"terminal8x6\", \"atari_lynx\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x6', '20', '17'])\r\n\r\n    def test_terminal_10(self):\r\n        params = (\"build\", \"helloworld\", \"terminal\", \"c64\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x8', '40', '25'])\r\n\r\n    def test_terminal_11(self):\r\n        params = (\"build\", \"helloworld\",\"terminal\", \"msx\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x8', '32', '24'])\r\n\r\n    def test_terminal_12(self):\r\n        params = (\"build\", \"helloworld\",\"terminal\", \"cpc\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x8', '20', '25'])\r\n\r\n    def test_terminal_13(self):\r\n        params = (\"build\", \"helloworld\",\"terminal\", \"spectrum\")\r\n        result = insert_default_sizes(default_option_config, params)\r\n        \r\n        self.assertEqual(result,['build', 'helloworld', 'terminal8x8', '32', '24'])\r\n\r\n\r\nif __name__ == '__main__':\r\n    \r\n    unittest.main()\r\n"
  },
  {
    "path": "src/unit_tests/testImport.py",
    "content": "import unittest\r\nimport sys\r\n\r\nsys.path.append(\"modules\")\r\nfrom option_functions import *\r\n\r\nfrom import_from_source import *\r\n\r\noption_config = OptionConfig()\r\n\r\n\r\nclass testImport(unittest.TestCase):\r\n\r\n    # fill_empty_slots_with_zero\r\n    def test_fill_empty_slots_with_zero_1(self):\r\n        filled_slots = fill_empty_slots_with_zero([\"\",\"1\",\"2\",\"\", \"3\",\"\",\"\"])\r\n        self.assertEqual(filled_slots,['0', '1', '2', '0', '3', '0', '0'])\r\n\r\n\r\n    # has_headless_hex\r\n    def test_has_headless_hex_1(self):\r\n        has_headless_hex_check = has_headless_hex([\"AB,CD,EF,01,23,45,67,89\",\"AF\"])\r\n        self.assertTrue(has_headless_hex_check)\r\n\r\n    def test_has_headless_hex_2(self):\r\n        has_headless_hex_check = has_headless_hex([\"ABC,CD,EF,01,23,45,67,89\",\"AF\"])\r\n        self.assertFalse(has_headless_hex_check)\r\n\r\n    def test_has_headless_hex_2(self):\r\n        has_headless_hex_check = has_headless_hex([\"AB,$CD,EF,01,23,45,67,89\",\"AF\"])\r\n        self.assertFalse(has_headless_hex_check)\r\n\r\n\r\n    # has_nine_byte_lines\r\n    def test_has_nine_byte_lines_1(self):\r\n        has_headless_hex_check = has_nine_byte_lines([\"AB,CD,EF,01,23,45,67,89,AF\"])\r\n        self.assertTrue(has_headless_hex_check)\r\n\r\n    def test_has_nine_byte_lines_2(self):\r\n        has_headless_hex_check = has_nine_byte_lines([\"AB,CD,EF,01,23,45,67,89\"])\r\n        self.assertFalse(has_headless_hex_check)\r\n\r\n    def test_has_nine_byte_lines_3(self):\r\n        has_headless_hex_check = has_nine_byte_lines([\"A,CD,EF,1,23,45,67,89,AF\"])\r\n        self.assertTrue(has_headless_hex_check)\r\n\r\n\r\n    # remove_basic_comments\r\n    def test_remove_basic_comments_1(self):\r\n        cleaned_string = remove_basic_comments('10 PRINT 42:REM ABC')\r\n        self.assertEqual(cleaned_string,\"10 PRINT 42\")\r\n\r\n    def test_remove_basic_comments_2(self):\r\n        cleaned_string = remove_basic_comments('10 ? 42:rem ABC')\r\n        self.assertEqual(cleaned_string,\"10 ? 42\")\r\n\r\n    def test_remove_basic_comments_3(self):\r\n        cleaned_string = remove_basic_comments('10 PRINT 42: REM DEF')\r\n        self.assertEqual(cleaned_string,\"10 PRINT 42\")\r\n\r\n    def test_remove_basic_comments_4(self):\r\n        cleaned_string = remove_basic_comments('10 ? 42: rem DEF')\r\n        self.assertEqual(cleaned_string,\"10 ? 42\")\r\n\r\n    def test_remove_basic_comments_5(self):\r\n        cleaned_string = remove_basic_comments(\"10 ? 42:' DEF\")\r\n        self.assertEqual(cleaned_string,\"10 ? 42\")\r\n\r\n    def test_remove_basic_comments_6(self):\r\n        cleaned_string = remove_basic_comments(\"10 ? 42: ' DEF\")\r\n        self.assertEqual(cleaned_string,\"10 ? 42\")\r\n\r\n\r\n    # remove_assembly_comments\r\n    def test_remove_assembly_comments_1(self):\r\n        cleaned_string = remove_assembly_comments(\"!BYTE $FF ; FOO\")\r\n        self.assertEqual(cleaned_string,\"!BYTE $FF\")\r\n\r\n\r\n    # normalize_assembly_line\r\n    def test_normalize_assembly_line_1(self):\r\n        normalized_line = normalize_assembly_line(\"0x2A\")\r\n        self.assertEqual(normalized_line,\"$2A\")\r\n        \r\n    def test_normalize_assembly_line_2(self):\r\n        normalized_line = normalize_assembly_line(\"#2A\")\r\n        self.assertEqual(normalized_line,\"$2A\")\r\n\r\n    def test_normalize_assembly_line_3(self):\r\n        normalized_line = normalize_assembly_line(\">2A\")\r\n        self.assertEqual(normalized_line,\"$2A\")\r\n\r\n    def test_normalize_assembly_line_4(self):\r\n        normalized_line = normalize_assembly_line(\"&H2A &h2B\")\r\n        self.assertEqual(normalized_line,\"$2A $2B\")\r\n\r\n    def test_normalize_assembly_line_5(self):\r\n        normalized_line = normalize_assembly_line(\"#2A\")\r\n        self.assertEqual(normalized_line,\"$2A\")\r\n\r\n    def test_normalize_assembly_line_6(self):\r\n        normalized_line = normalize_assembly_line(\"0b01010101\")\r\n        self.assertEqual(normalized_line,\"@01010101\")\r\n\r\n    def test_normalize_assembly_line_7(self):\r\n        normalized_line = normalize_assembly_line(\"%10101010\")\r\n        self.assertEqual(normalized_line,\"@10101010\")\r\n\r\n\r\n    # normalize_basic_line\r\n    def test_normalize_basic_line_1(self):\r\n        normalized_line = normalize_basic_line(\"20 SYMBOL AFTER 32\")\r\n        self.assertEqual(normalized_line,\"\")\r\n\r\n    def test_normalize_basic_line_2(self):\r\n        normalized_line = normalize_basic_line(\"20 SYMBOL 32\")\r\n        self.assertEqual(normalized_line,\"20 SYMBOL 32\")\r\n\r\n    def test_normalize_basic_line_3(self):\r\n        normalized_line = normalize_basic_line('30 POKE USR \"a\"+3,BIN 0111110')\r\n        self.assertEqual(normalized_line,'30 POKE USR \"a\"+3,\\nBIN@ 0111110')\r\n\r\n    # compute_shape\r\n    def test_compute_shape_xsize_8_1(self):\r\n        csv_string = \"255,255,255,255,255,255,255,255\"\r\n        self.assertEqual(compute_shape(csv_string, 8),[\"########\",\"########\",\"########\",\"########\",\"########\",\"########\",\"########\",\"########\",])\r\n\r\n    def test_compute_shape_xsize_8_2(self):\r\n        csv_string = \"0,0,0,0,0,0,0,0\"\r\n        self.assertEqual(compute_shape(csv_string, 8),[\"........\",\"........\",\"........\",\"........\",\"........\",\"........\",\"........\",\"........\",])\r\n\r\n    def test_compute_shape_xsize_8_3(self):        \r\n        csv_string = \"1,2,3,4,5,6,7,8\"\r\n        self.assertEqual(compute_shape(csv_string, 8),[\".......#\",\"......#.\",\"......##\",\".....#..\",\".....#.#\",\".....##.\",\".....###\",\"....#...\",])\r\n\r\n    def test_compute_shape_xsize_8_4(self):       \r\n        csv_string = \"1,  2,3,4,  5,6  ,7,8\"\r\n        self.assertEqual(compute_shape(csv_string, 8),[\".......#\",\"......#.\",\"......##\",\".....#..\",\".....#.#\",\".....##.\",\".....###\",\"....#...\",])       \r\n\r\n    def test_compute_shape_xsize_8_5(self):        \r\n        csv_string = \"254,253,252,251,250,249,248,247\"\r\n        self.assertEqual(compute_shape(csv_string, 8),[\"#######.\",\"######.#\",\"######..\",\"#####.##\",\"#####.#.\",\"#####..#\",\"#####...\",\"####.###\",])   \r\n\r\n    def test_compute_shape_xsize_7_1(self):\r\n        csv_string = \"127,127,127,127,127,127,127,127\"\r\n        self.assertEqual(compute_shape(csv_string, 7),[\"#######\",\"#######\",\"#######\",\"#######\",\"#######\",\"#######\",\"#######\",\"#######\",])\r\n\r\n    def test_compute_shape_xsize_7_2(self):\r\n        csv_string = \"0,0,0,0,0,0,0,0\"\r\n        self.assertEqual(compute_shape(csv_string, 7),[\".......\",\".......\",\".......\",\".......\",\".......\",\".......\",\".......\",\".......\",])\r\n\r\n    def test_compute_shape_xsize_7_3(self):        \r\n        csv_string = \"1,2,3,4,5,6,7,8\"\r\n        self.assertEqual(compute_shape(csv_string, 7),[\"......#\",\".....#.\",\".....##\",\"....#..\",\"....#.#\",\"....##.\",\"....###\",\"...#...\",])\r\n\r\n    def test_compute_shape_xsize_7_4(self):       \r\n        csv_string = \"1,  2,3,4,  5,6  ,7,8\"\r\n        self.assertEqual(compute_shape(csv_string, 7),[\"......#\",\".....#.\",\".....##\",\"....#..\",\"....#.#\",\"....##.\",\"....###\",\"...#...\",])       \r\n\r\n    def test_compute_shape_xsize_7_5(self):        \r\n        csv_string = \"126,125,124,123,122,121,120,119\"\r\n        self.assertEqual(compute_shape(csv_string, 7),[\"######.\",\"#####.#\",\"#####..\",\"####.##\",\"####.#.\",\"####..#\",\"####...\",\"###.###\",])   \r\n\r\n    def test_compute_shape_xsize_6_1(self):\r\n        csv_string = \"63,63,63,63,63,63,63,63\"\r\n        self.assertEqual(compute_shape(csv_string, 6),[\"######\",\"######\",\"######\",\"######\",\"######\",\"######\",\"######\",\"######\",])\r\n\r\n    def test_compute_shape_xsize_6_2(self):\r\n        csv_string = \"0,0,0,0,0,0,0,0\"\r\n        self.assertEqual(compute_shape(csv_string, 6),[\"......\",\"......\",\"......\",\"......\",\"......\",\"......\",\"......\",\"......\",])\r\n\r\n    def test_compute_shape_xsize_6_3(self):        \r\n        csv_string = \"1,2,3,4,5,6,7,8\"\r\n        self.assertEqual(compute_shape(csv_string, 6),[\".....#\",\"....#.\",\"....##\",\"...#..\",\"...#.#\",\"...##.\",\"...###\",\"..#...\",])\r\n\r\n    def test_compute_shape_xsize_6_4(self):       \r\n        csv_string = \"1,  2,3,4,  5,6  ,7,8\"\r\n        self.assertEqual(compute_shape(csv_string, 6),[\".....#\",\"....#.\",\"....##\",\"...#..\",\"...#.#\",\"...##.\",\"...###\",\"..#...\",])       \r\n\r\n    def test_compute_shape_xsize_6_5(self):        \r\n        csv_string = \"62,61,60,59,58,57,56,55\"\r\n        self.assertEqual(compute_shape(csv_string, 6),[\"#####.\",\"####.#\",\"####..\",\"###.##\",\"###.#.\",\"###..#\",\"###...\",\"##.###\",])   \r\n\r\n\r\n    # compute_rotated_shape\r\n    @staticmethod\r\n    def intListToString(intList):\r\n        res = \"\"\r\n        for value in intList:\r\n            res+=str(value)+\",\"\r\n        res=res[:-1]\r\n        return res  \r\n\r\n\r\n    # compute_rotated_shape\r\n    def test_compute_rotated_shape_1(self):\r\n       \r\n        initial_list = [1,2,3,4,5,6,7,8]\r\n            # .......#\r\n            # ......#.\r\n            # ......##\r\n            # .....#..\r\n            # .....#.#\r\n            # .....##.\r\n            # .....###\r\n            #....#...\r\n        \r\n        initial_list_string = testImport.intListToString(initial_list)\r\n        \r\n        shape0 = compute_shape(initial_list_string,8)\r\n        expected_result = [0, 0, 0, 0, 128, 120, 102, 85]   \r\n        self.assertEqual(compute_rotated_shape(shape0),expected_result)\r\n        expected_result_string = testImport.intListToString(expected_result)\r\n\r\n        shape1 = compute_shape(expected_result_string,8)\r\n        expected_result = [16, 224, 96, 160, 32, 192, 64, 128]\r\n        self.assertEqual(compute_rotated_shape(shape1), expected_result)\r\n        expected_result_string = testImport.intListToString(expected_result)       \r\n        \r\n        shape2 = compute_shape(expected_result_string,8)\r\n        expected_result = [170, 102, 30, 1, 0, 0, 0, 0]\r\n        self.assertEqual(compute_rotated_shape(shape2), expected_result)\r\n        expected_result_string = testImport.intListToString(expected_result)\r\n        \r\n        shape3 = compute_shape(expected_result_string,8)\r\n        expected_result = initial_list \r\n        self.assertEqual(compute_rotated_shape(shape3), expected_result)  \r\n        expected_result_string = testImport.intListToString(expected_result)\r\n\r\n    def test_compute_rotated_shape_2(self):\r\n       \r\n        initial_list = [255,0,255,0,255,0,255,0]\r\n        \r\n        initial_list_string = testImport.intListToString(initial_list)\r\n        \r\n        shape0 = compute_shape(initial_list_string,8)\r\n        expected_result = [85, 85, 85, 85, 85, 85, 85, 85]   \r\n        self.assertEqual(compute_rotated_shape(shape0),expected_result)\r\n        expected_result_string = testImport.intListToString(expected_result)\r\n\r\n        shape1 = compute_shape(expected_result_string,8)\r\n        expected_result = [0,255,0,255,0,255,0,255]\r\n        self.assertEqual(compute_rotated_shape(shape1), expected_result)\r\n        expected_result_string = testImport.intListToString(expected_result)       \r\n        \r\n        shape2 = compute_shape(expected_result_string,8)\r\n        expected_result = [170, 170, 170, 170, 170, 170, 170, 170]\r\n        self.assertEqual(compute_rotated_shape(shape2), expected_result)\r\n        expected_result_string = testImport.intListToString(expected_result)\r\n        \r\n        shape3 = compute_shape(expected_result_string,8)\r\n        expected_result = initial_list \r\n        self.assertEqual(compute_rotated_shape(shape3), expected_result)  \r\n        expected_result_string = testImport.intListToString(expected_result)\r\n\r\n\r\n    # aux_rip_tiles\r\n    def test_rip_tiles_asm_1(self):\r\n        source_lines = ['!byte 0,0,60,98,126,98,98,98\\n']\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,False,False)\r\n        \r\n        self.assertEqual(ripped_lines,['0,0,60,98,126,98,98,98'])\r\n\r\n    def test_rip_tiles_asm_2(self):\r\n        source_lines = ['!byte 0x00, 0x1F, 0x28, 0x28, 0x28, 0x3F, 0x1F, 0x00\\n']\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,False,False)\r\n        \r\n        self.assertEqual(ripped_lines,['$00,$1F,$28,$28,$28,$3F,$1F,$00'])\r\n        \r\n    def test_rip_tiles_asm_3(self):\r\n        rip_flag = True\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            '; CHARSET IMAGE DATA...',\r\n            '; 48 images, 8 bytes per image, total size is 384 ($180) bytes.',\r\n            '\\n',\r\n            'charset_data',\r\n            '\\n',\r\n            '.byte $00,$00,$00,$00,$00,$00,$00,$00,$7C,$EE,$C6,$C6,$FE,$C6,$C6,$00',\r\n            '.byte $FC,$C6,$C6,$FC,$C6,$C6,$FE,$00,$7E,$E6,$C0,$C0,$C0,$E6,$7E,$00',\r\n            '.byte $FC,$CE,$C6,$C6,$C6,$CE,$FC,$00,$FE,$C6,$C0,$F8,$C0,$C6,$FE,$00',\r\n            '.byte $FE,$C6,$C0,$F8,$C0,$C0,$C0,$00,$7E,$E6,$C0,$CE,$C6,$E6,$7E,$00',\r\n            '.byte $C6,$C6,$C6,$C6,$FE,$C6,$C6,$00,$3C,$18,$18,$18,$18,$18,$3C,$00',\r\n            '.byte $06,$06,$06,$06,$C6,$EE,$7C,$00,$CE,$DC,$F8,$F8,$DC,$CE,$C6,$00',\r\n            '.byte $C0,$C0,$C0,$C0,$C0,$C6,$FE,$00,$C6,$EE,$FE,$FE,$C6,$C6,$C6,$00',\r\n            '.byte $C6,$E6,$F6,$FE,$DE,$CE,$C6,$00,$FC,$CE,$C6,$C6,$C6,$E6,$7E,$00',\r\n            '.byte $FC,$CE,$C6,$C6,$FE,$C0,$C0,$00,$FC,$CE,$C6,$C6,$E6,$7C,$0E,$00',\r\n            '.byte $FC,$CE,$C6,$C6,$FE,$DC,$CE,$00,$FE,$C6,$C0,$7C,$06,$C6,$FE,$00',\r\n            '.byte $FE,$36,$30,$30,$30,$30,$30,$00,$C6,$C6,$C6,$C6,$C6,$EE,$7C,$00',\r\n            '.byte $C6,$C6,$C6,$EE,$7C,$38,$10,$00,$C6,$C6,$C6,$C6,$FE,$EE,$C6,$00',\r\n            '.byte $C6,$6C,$38,$38,$6C,$C6,$C6,$00,$C6,$EC,$78,$30,$30,$30,$30,$00',\r\n            '.byte $FE,$CE,$1C,$38,$70,$E6,$FE,$00,$7C,$EE,$C6,$C6,$C6,$EE,$7C,$00',\r\n            '.byte $38,$18,$18,$18,$18,$18,$18,$00,$FC,$C6,$06,$1C,$70,$E0,$FE,$00',\r\n            '.byte $FC,$C6,$06,$3C,$06,$C6,$FC,$00,$C0,$C0,$C0,$D8,$FE,$18,$18,$00',\r\n            '.byte $FE,$C6,$C0,$FE,$06,$C6,$7C,$00,$1C,$38,$70,$EC,$C6,$E6,$7E,$00',\r\n            '.byte $FE,$C6,$0C,$18,$30,$30,$30,$00,$7C,$C6,$C6,$7C,$C6,$C6,$7C,$00',\r\n            '.byte $7E,$67,$63,$37,$0E,$1C,$38,$00,$00,$00,$00,$00,$00,$30,$30,$00',\r\n            '.byte $00,$00,$00,$00,$00,$18,$30,$00,$7E,$66,$06,$1C,$18,$00,$18,$00',\r\n            '.byte $18,$18,$18,$18,$18,$00,$18,$00,$18,$18,$18,$00,$00,$00,$00,$00',\r\n            '.byte $6C,$6C,$6C,$00,$00,$00,$00,$00,$18,$30,$30,$30,$30,$30,$18,$00',\r\n            '.byte $18,$0C,$0C,$0C,$0C,$0C,$18,$00,$00,$00,$FC,$7E,$00,$00,$00,$00',\r\n            '.byte $00,$18,$18,$7E,$18,$18,$00,$00,$00,$00,$18,$00,$00,$18,$00,$00',\r\n            '\\n',\r\n            '\\n',\r\n            '; CHARSET IMAGE ATTRIBUTE DATA...',\r\n            '; 48 attributes, 1 attribute per image, 8 bits per attribute, total size is 48 ($30) bytes.',\r\n            '; nb. Upper nybbles = material, lower nybbles = colour.',\r\n            '\\n',\r\n            'charset_attrib_data',\r\n            '\\n',\r\n            '.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03',\r\n            '.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03',\r\n            '.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [ \\\r\n            '$00,$00,$00,$00,$00,$00,$00,$00',\r\n            '$7C,$EE,$C6,$C6,$FE,$C6,$C6,$00',\r\n            '$FC,$C6,$C6,$FC,$C6,$C6,$FE,$00',\r\n            '$7E,$E6,$C0,$C0,$C0,$E6,$7E,$00',\r\n            '$FC,$CE,$C6,$C6,$C6,$CE,$FC,$00',\r\n            '$FE,$C6,$C0,$F8,$C0,$C6,$FE,$00',\r\n            '$FE,$C6,$C0,$F8,$C0,$C0,$C0,$00',\r\n            '$7E,$E6,$C0,$CE,$C6,$E6,$7E,$00',\r\n            '$C6,$C6,$C6,$C6,$FE,$C6,$C6,$00',\r\n            '$3C,$18,$18,$18,$18,$18,$3C,$00',\r\n            '$06,$06,$06,$06,$C6,$EE,$7C,$00',\r\n            '$CE,$DC,$F8,$F8,$DC,$CE,$C6,$00',\r\n            '$C0,$C0,$C0,$C0,$C0,$C6,$FE,$00',\r\n            '$C6,$EE,$FE,$FE,$C6,$C6,$C6,$00',\r\n            '$C6,$E6,$F6,$FE,$DE,$CE,$C6,$00',\r\n            '$FC,$CE,$C6,$C6,$C6,$E6,$7E,$00',\r\n            '$FC,$CE,$C6,$C6,$FE,$C0,$C0,$00',\r\n            '$FC,$CE,$C6,$C6,$E6,$7C,$0E,$00',\r\n            '$FC,$CE,$C6,$C6,$FE,$DC,$CE,$00',\r\n            '$FE,$C6,$C0,$7C,$06,$C6,$FE,$00',\r\n            '$FE,$36,$30,$30,$30,$30,$30,$00',\r\n            '$C6,$C6,$C6,$C6,$C6,$EE,$7C,$00',\r\n            '$C6,$C6,$C6,$EE,$7C,$38,$10,$00',\r\n            '$C6,$C6,$C6,$C6,$FE,$EE,$C6,$00',\r\n            '$C6,$6C,$38,$38,$6C,$C6,$C6,$00',\r\n            '$C6,$EC,$78,$30,$30,$30,$30,$00',\r\n            '$FE,$CE,$1C,$38,$70,$E6,$FE,$00',\r\n            '$7C,$EE,$C6,$C6,$C6,$EE,$7C,$00'\r\n            ]\r\n        )\r\n\r\n\r\n    def test_rip_tiles_asm_4(self):\r\n        rip_flag = True\r\n        assembly_extension = True\r\n\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            \"PAT0   DATA >1824,>1866,>BD3C,>2424\"\r\n            \"PAT1   DATA >0000,>0000,>0000,>0000\"\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,assembly_extension,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [ \\\r\n            '$18,$24,$18,$66,$BD,$3C,$24,$24',\r\n            ]\r\n        )\r\n           \r\n\r\n\r\n    def test_rip_tiles_asm_5(self):\r\n        rip_flag = True\r\n        assembly_extension = False\r\n\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            '.byte %01010101',\r\n            '.byte %11111111',\r\n            '.byte %10101010',\r\n            '.byte %00110011',\r\n            '.byte %11001100',\r\n            '.byte %01010101',\r\n            '.byte %10101010',\r\n            '.byte %11111111',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,assembly_extension,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [ \\\r\n            '85,255,170,51,204,85,170,255',\r\n            ]\r\n        )\r\n\r\n    def test_rip_tiles_asm_6(self):\r\n        rip_flag = True\r\n        assembly_extension = False\r\n\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            '; Exported using VChar64 v0.2.4',\r\n            '; Total bytes: 2048',\r\n            'charset:',\r\n            'foo .byte $3c,$66,$6e,$6e,$60,$62,$3c',\r\n            '.byte $00,$18,$3c,$66,$7e,$66,$66,$66,$00       ; 0',\r\n            'bar .byte $7c,$66,$66,$7c,$66,$66,$7c,$00,$3c,$66,$60,$60,$60,$66,$3c,$00       ; 16',\r\n            'toto .byte $78,$6c,$66,$66,$66,$6c,$78,$00,$7e,$60,$60,$78,$60,$60,$7e,$00      ; 32',\r\n            '.byte $7e,$60,$60,$78,$60,$60,$60,$00,$3c,$66,$60,$6e,$66,$66,$3c,$00   ; 48',\r\n            '.byte $66,$66,$66,$7e,$66,$66,$66,$00,$3c,$18,$18,$18,$18,$18,$3c,$00   ; 64',\r\n            '.byte $1e,$0c,$0c,$0c,$0c,$6c,$38,$00,$66,$6c,$78,$70,$78,$6c,$66,$00   ; 80',\r\n            '.byte $60,$60,$60,$60,$60,$60,$7e,$00,$63,$77,$7f,$6b,$63,$63,$63,$00   ; 96',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,assembly_extension,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [ \\\r\n            '$3c,$66,$6e,$6e,$60,$62,$3c,$00',\r\n            '$18,$3c,$66,$7e,$66,$66,$66,$00',\r\n            '$7c,$66,$66,$7c,$66,$66,$7c,$00',\r\n            '$3c,$66,$60,$60,$60,$66,$3c,$00',\r\n            '$78,$6c,$66,$66,$66,$6c,$78,$00',\r\n            '$7e,$60,$60,$78,$60,$60,$7e,$00',\r\n            '$7e,$60,$60,$78,$60,$60,$60,$00',\r\n            '$3c,$66,$60,$6e,$66,$66,$3c,$00',\r\n            '$66,$66,$66,$7e,$66,$66,$66,$00',\r\n            '$3c,$18,$18,$18,$18,$18,$3c,$00',\r\n            '$1e,$0c,$0c,$0c,$0c,$6c,$38,$00',\r\n            '$66,$6c,$78,$70,$78,$6c,$66,$00',\r\n            '$60,$60,$60,$60,$60,$60,$7e,$00',\r\n            '$63,$77,$7f,$6b,$63,$63,$63,$00'\r\n            ]\r\n        )\r\n\r\n\r\n    def test_rip_tiles_cbm_basic_1(self):\r\n        rip_flag = False\r\n        source_lines = [ \\\r\n            '000 REM ** USER DEFINED GRAPHICS **',\r\n            '001 REM ** BY SHANE JOLLY **',\r\n            '100 PRINT CHR$(147): PRINT TAB(12)\"PLEASE WAIT...\"',\r\n            '110 PRINT CHR$(142)',\r\n            '120 POKE 52, 48: POKE 56, 48',\r\n            '130 POKE UG=12288;CG=53248',\r\n            '140 POKE 56334, PEEK(56334) AND 254',\r\n            '150 POKE 1, PEEK(1) AND 251',\r\n            '160 FOR K=1 TO 2047',\r\n            '170 POKE UG+K, PEEK(CG+K)',\r\n            '180 NEXT',\r\n            '190 POKE 1, PEEK(1) OR 4',\r\n            '200 POKE 56334, PEEK(6334) OR 1',\r\n            '210 POKE 53272, (PEEK(53272) AND 240)+12',\r\n            '220 FOR CC=1 TO 9',\r\n            '230 FOR J=0 TO 7',\r\n            '240 READ A: POKE UG+8*CC+J, A',\r\n            '250 NEXT J',\r\n            '260 NEXT CC',\r\n            '270 FOR N=65 TO 90',\r\n            '280 PRINT CHR$(N);\" \";',\r\n            '290 NEXT N',\r\n            '300 DATA 000, 016, 040, 068, 124, 068, 068, 000',\r\n            '310 DATA 000, 120, 072, 124, 068, 068, 124, 000',\r\n            '320 DATA 000, 124, 068, 064, 064, 068, 124, 000',\r\n            '330 DATA 000, 120, 068, 068, 068, 068, 120, 000',\r\n            '340 DATA 000, 124, 068, 112, 112, 068, 124, 000',\r\n            '350 DATA 000, 124, 068, 112, 064, 064, 064, 000',\r\n            '360 DATA 000, 124, 068, 064, 064, 078, 124, 000',\r\n            '370 DATA 000, 068, 068, 124, 124, 068, 068, 000',\r\n            '380 DATA 000, 056, 016, 016, 016, 016, 056, 000',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n        [ \\\r\n            '000,016,040,068,124,068,068,000',\r\n            '000,120,072,124,068,068,124,000',\r\n            '000,124,068,064,064,068,124,000',\r\n            '000,120,068,068,068,068,120,000',\r\n            '000,124,068,112,112,068,124,000',\r\n            '000,124,068,112,064,064,064,000',\r\n            '000,124,068,064,064,078,124,000',\r\n            '000,068,068,124,124,068,068,000',\r\n            '000,056,016,016,016,016,056,000' \\\r\n        ] \\\r\n        )\r\n\r\n    def test_rip_tiles_cbm_basic_2(self):\r\n        rip_flag = False\r\n        source_lines = [ \\\r\n            '0l=32:v=36878:fOk=.to4:rEb$:fOi=1to8:pO7167+i+k*8,aS(mI(b$,i)):pO7421+i,.:nE:nE',\r\n            '1pO52,26:pO56,26:n=1:t=30720:pOv-9,255:pOv+1,8:?\"{clear}{reverse on}{yellow}ijkl\":x=3:p=7955:ifj>rtHr=j',\r\n            '2wA198,1:g(0)=211:g(1)=209:g(2)=215:g(3)=218:pO650,128:u=22:k=7745:y=7732:z=y-8',\r\n            '3gEa$:b=z+rN(.)*464:q=rN(1)*4:pOb,g(q):pOb+t,q+2:ifj>=100*ntHx=x-(x<9):n=n+1',\r\n            '4pOk+i,l:pOy+i*u,l:i=i+1:ifi<=utHpOk+i,4:pOk+i+t,6:pOy+i*u,4:pOy+i*u+t,7:m=pE(p)',\r\n            '5g=.:x=x+(m=4):e=saN1:c=s-1+e:ifi>utHi=.:y=z+rN(.)*u-1:k=z+u*int((p-z)/u)-1',\r\n            '6ifc=sG(c)tHg=1:h=s+1:pOp,l:p=p+c*21*e+c:d=pE(p):ifd=ftHw=w-(d>l):j=j-(w>1)*w',\r\n            '7pOp+t,7:?\"{home}{reverse on}{red}g{green}e{cyan}m{purple}s{white}\"j\" {blue}hi{cyan}\"r\" {yellow}{reverse off}b{green}{reverse on}\"x:ifd>ltHifgtHpOv,9:pOv,.:dA\"{24}{60}{24}{102}{153}{24}{36}{102}\"',\r\n            '8pOp,h:w=-w*(d=f):s=aS(a$+\"@\")-74:dA\"{24}{44}{152}{110}{25}{24}{40}{40}\",\"{24}{36}{24}{102}{153}{24}{36}{102}\",\"{24}{52}{25}{118}{152}{24}{40}{40}\",\"{ 24}{ 36}{ 90}{189}{189}{ 90}{ 36}{ 24}\"',\r\n            '9f=d:on-(x>.aNp<8186aNp>=z)gO3:?sP7)\"{reverse on}{red}game over\":fOa=.tov/9:nE:pO198,0:j=.:gO1',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n        [ \\\r\n            '24,60,24,102,153,24,36,102',\r\n            '24,44,152,110,25,24,40,40',\r\n            '24,36,24,102,153,24,36,102',\r\n            '24,52,25,118,152,24,40,40',\r\n            '24,36,90,189,189,90,36,24' \r\n        ] \\\r\n        )\r\n\r\n    def test_rip_tiles_cbm_basic_3(self):\r\n        rip_flag = False\r\n        source_lines = [ \\\r\n            '0pO56,26:pO52,26:v=36878:x=132:pOv-9,255:fOp=.to39:rEb:pO7168+p,b:pO7421+p,.:nE',\r\n            '1e=22:z=218:o=4:y=3:b=7:p=8174:pO650,z:?\"{clear}{black}{reverse on}jl\":l$=\"{green}{68*2}{black}{66}\":r$=\"{black}{67}{green}{68*2}\":ifi>rtHr=i',\r\n            '2n=v+1:t=30720:pOn,59:wA198,1:?\"{clear}\":fOi=3toe:?tA4)\"{green}{68}{black}{reverse on}{230}{191}\"sP8)\"{191}{230}{reverse off}{green}{68}\":nE:d=1:i=.',\r\n            '3b=b+f:i=i+1:if(iaNy)=ytHd=int(rN(.)*3):ifb<4tHifo<6tHb=4:y=7:dA24,189,255,165',\r\n            '4s=int(rN(.)*(b+1)):ifpE(p-e)<>32tHpOn,42:pOv,15:pOv,.:l=l+1:fOf=-9tox:nE:pOn,59',\r\n            '5c$=\" \":gEa$:ifiaN1tHc$=\"{31}@\":ifl<.tHl=.:dA36,189,255,165,90,102,90,60,36,219,255',\r\n            '6?\"{home}{down}{left}{148}\":pOz,x:pOp+t,2:pOp,1:ifpE(p-e)=4tHl=9:dA195,93,114,101,66,93,114,101,66',\r\n            '7?sPo)l$sPs)c$sPb-s)r$:ifa$<>\"\"tHk=aS(a$):p=p+(k=74)-(k=76):dA93,39,83,33,93,39',\r\n            '8?\"{home}{red}a{reverse on}\"l\" {purple}\"i\" {black}\"r:f=(iaN127)=.:l=l+f:ifo>1-dtHifo+d+b<17tHo=o-1+d:dA83,33,8,28',\r\n            '9on-(l<9)gO3:?\"{home}{down*2}\"sP8)\"{black}{reverse on}{191} {red}end {black}{191}\":fOs=ttov:nE:l=.:pO198,0:gO1:dA62,28,62,8,8,',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [\r\n            '24,189,255,165,36,189,255,165',\r\n            '90,102,90,60,36,219,255,195',\r\n            '93,114,101,66,93,114,101,66',\r\n            '93,39,83,33,93,39,83,33',\r\n            '8,28,62,28,62,8,8,0'\r\n            ]\r\n\r\n        )\r\n\r\n    def test_rip_tiles_oric_basic_1(self):\r\n        rip_flag = True\r\n        source_lines = [ \\\r\n            '10 REM Golf',\r\n            '20 CH=46080',\r\n            '30 FOR Q=1 TO 3',\r\n            '40 READ C',\r\n            '50 FOR I=0 TO 7',\r\n            '60 READ D',\r\n            '70 POKE CH+C+I,D',\r\n            '80 NEXT I',\r\n            '90 NEXT Q',\r\n            '100 DATA 264,8,12,14,8,8,8,8,62',\r\n            '110 DATA 512,12,30,45,30,12,18,18,33',\r\n            '120 DATA 280,12,30,31,46,62,60,28,24',\r\n            '130 DIM T(9)',\r\n            '140 XH =0:XC=0',\r\n            '150 YH=0:HT=0:YC=0',\r\n            '170 FOR H=1 TO 9',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [ \\\r\n            '8,12,14,8,8,8,8,62', \r\n            '12,30,45,30,12,18,18,33', \r\n            '12,30,31,46,62,60,28,24'\r\n            ]\r\n        )\r\n\r\n    def test_rip_tiles_msx_basic_1(self):\r\n        rip_flag = True\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            \"490 DATA 22,63,F7,B7,FF,7E,3C,3C ' a\",\r\n            \"491 DATA 38,6C,FF,3F,0F,3F,FC,38 ' b\",\r\n            \"492 DATA 3C,3C,7E,FF,ED,EF,C6,44 ' c\",\r\n            \"493 DATA 1C,36,FF,FC,F0,FC,3F,1C ' d\",\r\n            \"494 DATA 3C,7E,FF,FF,FF,FF,7E,3C ' e\",\r\n            \"495 DATA 08,10,54,FE,FE,FE,FE,7C ' f\",\r\n            \"496 DATA 06,08,10,10,38,7C,7C,38 ' g\",\r\n            \"497 DATA 00,28,FE,AA,FE,54,38,10 ' h\",\r\n            \"500 DATA 08,1C,2A,7F,77,3E,36,63 ' i\",\r\n            \"501 DATA FF,D5,AB,D5,AB,D5,AB,FF ' j\",\r\n            \"502 DATA 00,00,00,18,18,00,00,00 ' k\",\r\n            \"503 DATA 00,00,18,24,24,18,00,00 ' l\",\r\n            \"504 DATA 00,18,3C,66,66,3C,18,00 ' m\",\r\n            \"505 DATA 3C,7E,E7,C3,C3,E7,7E,3C ' n\",\r\n            \"510 DATA 00,01,06,1D,2A,2A,2A,1F ' o\",\r\n            \"511 DATA 1B,8F,65,11,C9,A9,B1,F3 ' p\",\r\n            \"512 DATA 4C,F7,F0,18,07,02,3E,FE ' q\",\r\n            \"513 DATA 7F,9F,31,41,81,81,F9,FD ' r\",\r\n            \"515 DATA 7E,C3,9F,9F,9F,C3,7E,00 ' s\",\r\n            '520 FORF%=&H2000+ASC(\"a\")*8TO&H2097+ASC(\"a\")*8:READA$:VPOKEF%,VAL(\"&H\"+A$):NEXTF%:F%=USR2(0):F%=USR3(0)',\r\n            \"530 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' a\",\r\n            \"531 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' b\",\r\n            \"532 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' c\",\r\n            \"533 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' d\",\r\n            \"534 DATA D1,D1,41,71,71,41,D1,D1 ' e\",\r\n            \"535 DATA A1,A1,A1,A1,A1,A1,A1,A1 ' f\",\r\n            \"536 DATA F1,F1,F1,F1,D1,D1,D1,D1 ' g\",\r\n            \"537 DATA D1,D1,D1,D1,D1,D1,D1,D1 ' h\",\r\n            \"540 DATA D1,D1,21,21,21,21,41,41 ' i\",\r\n            \"541 DATA 31,31,D1,D1,81,81,51,51 ' j\",\r\n            \"542 DATA F1,F1,F1,21,21,F1,F1,F1 ' k\",\r\n            \"543 DATA F1,F1,F1,F1,F1,F1,F1,F1 ' l\",\r\n            \"544 DATA F1,41,41,F1,F1,41,41,F1 ' m\",\r\n            \"545 DATA D1,D1,81,81,81,81,D1,D1 ' n\",\r\n            \"546 DATA 21,21,21,21,21,21,21,21 ' o\",\r\n            \"547 DATA 21,21,21,21,21,21,21,21 ' p\",\r\n            \"548 DATA 21,21,21,21,21,21,21,21 ' q\",\r\n            \"550 DATA 21,21,21,21,21,21,21,21 ' r\",\r\n            \"551 DATA 90,90,90,90,90,90,90,00 ' s\",\r\n            \"552 DATA 91,91,91,91,91,91,91,91 ' t\",\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [\r\n            '$22,$63,$F7,$B7,$FF,$7E,$3C,$3C',\r\n            '$38,$6C,$FF,$3F,$0F,$3F,$FC,$38',\r\n            '$3C,$3C,$7E,$FF,$ED,$EF,$C6,$44',\r\n            '$1C,$36,$FF,$FC,$F0,$FC,$3F,$1C',\r\n            '$3C,$7E,$FF,$FF,$FF,$FF,$7E,$3C',\r\n            '$08,$10,$54,$FE,$FE,$FE,$FE,$7C',\r\n            '$06,$08,$10,$10,$38,$7C,$7C,$38',\r\n            '$00,$28,$FE,$AA,$FE,$54,$38,$10',\r\n            '$08,$1C,$2A,$7F,$77,$3E,$36,$63',\r\n            '$FF,$D5,$AB,$D5,$AB,$D5,$AB,$FF',\r\n            '$00,$00,$00,$18,$18,$00,$00,$00',\r\n            '$00,$00,$18,$24,$24,$18,$00,$00',\r\n            '$00,$18,$3C,$66,$66,$3C,$18,$00',\r\n            '$3C,$7E,$E7,$C3,$C3,$E7,$7E,$3C',\r\n            '$00,$01,$06,$1D,$2A,$2A,$2A,$1F',\r\n            '$1B,$8F,$65,$11,$C9,$A9,$B1,$F3',\r\n            '$4C,$F7,$F0,$18,$07,$02,$3E,$FE',\r\n            '$7F,$9F,$31,$41,$81,$81,$F9,$FD',\r\n            '$7E,$C3,$9F,$9F,$9F,$C3,$7E,$00',\r\n            '$C1,$C1,$C1,$C1,$C1,$C1,$C1,$C1',\r\n            '$C1,$C1,$C1,$C1,$C1,$C1,$C1,$C1',\r\n            '$C1,$C1,$C1,$C1,$C1,$C1,$C1,$C1',\r\n            '$C1,$C1,$C1,$C1,$C1,$C1,$C1,$C1',\r\n            '$D1,$D1,$41,$71,$71,$41,$D1,$D1',\r\n            '$A1,$A1,$A1,$A1,$A1,$A1,$A1,$A1',\r\n            '$F1,$F1,$F1,$F1,$D1,$D1,$D1,$D1',\r\n            '$D1,$D1,$D1,$D1,$D1,$D1,$D1,$D1'\r\n            ]\r\n        )\r\n\r\n    def test_rip_tiles_cpc_basic_1(self):\r\n        rip_flag = True\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            \"20 SYMBOL AFTER 32\",\r\n            \"30 REM Upper case chars\",\r\n            \"40 SYMBOL 65,126,66,66,126,98,98,98,0\",\r\n            \"50 SYMBOL 66,126,66,66,126,98,98,126,0\",\r\n            \"60 SYMBOL 67,126,64,64,96,96,96,126,0\",\r\n            \"70 SYMBOL 68,254,66,66,98,98,98,254,0\",\r\n            \"80 SYMBOL 69,126,64,64, 120,96,96,126,0\",\r\n            \"90 SYMBOL 70,126,64,64,120,96,96,96,0\",\r\n            \"100 SYMBOL 71,126,64,64,102,98,98,126,0\",\r\n            \"110 SYMBOL 72,66,66,66,126,98,98,98,0\",\r\n            \"120 SYMBOL 73,60,16,16,24,24,24,60,0\",\r\n            \"130 SYMBOL 74,126,8,8,24,24,24,120,0\",\r\n            \"140 SYMBOL 75,68,68,68, 120,100,100,100,0\",\r\n            \"150 SYMBOL 76,64,64,64,96,96,96, 126,0\",\r\n            \"160 SYMBOL 77,126,74,74,98,98,98,98,0\",\r\n            \"170 SYMBOL 78,98,82,74,102,98,98,98,0\",\r\n            \"180 SYMBOL 79,126,66,66,98,98,98,126,0\",\r\n            \"190 SYMBOL 80,126,66,66,126,96,96,96,0\",\r\n            \"200 SYMBOL 81,126,66,66,98,98,106,126,4\",\r\n            \"210 SYMBOL 82,126,66,66,126,106,100,98,0\",\r\n            \"220 SYMBOL 83,126,64,64,126,6,6,126,0\",\r\n            \"230 SYMBOL 84,126,16,16,24,24,24,24,0\",\r\n            \"240 SYMBOL 85,66,66,66,98,98,98,126,0\",\r\n            \"250 SYMBOL 86,66,66,66,66,66,36,24,0\",\r\n            \"260 SYMBOL 87,66,66,66,98,106,106,126,0\",\r\n            \"270 SYMBOL 88,102,102,36,24,36,102,102,0\",\r\n            \"280 SYMBOL 89,66,66,126,16,24,24,24,0\",\r\n            \"290 SYMBOL 90,126,4,8,16,32,64,126,0\",\r\n            \"295 REM Lower case chars\",\r\n            \"300 SYMBOL 97,0,0,126,6,126,70,126,0\",\r\n            \"310 SYMBOL 98,96,96,96,126,98,98,126,0\",\r\n            \"320 SYMBOL 99,0,0,126,96,96,96,126,0\",\r\n            \"330 SYMBOL 100,6,6,6,126,70,70,126,0\",\r\n            \"340 SYMBOL 101,0,0,126,98,126,96,126,0\",\r\n            \"350 SYMBOL 102,60,48,48,120,48,48,48,0\",\r\n            \"360 SYMBOL 103,0,0,126,70,70,126,6,126\",\r\n            \"370 SYMBOL 104,96,96,96,126,98,98,98,0\",\r\n            \"380 SYMBOL 105,24,0,24,24,24,24,24,0\",\r\n            \"390 SYMBOL 106,6,0,6,6,6,6,6,126\",\r\n            \"400 SYMBOL 107,96,96,102,108,120,108, 102,0\",\r\n            \"410 SYMBOL 108,24,24,24,24,24,24,24,0\",\r\n            \"420 SYMBOL 109,0,0,126,90,90,66,66,0\",\r\n            \"430 SYMBOL 110,0,0,108,114,98,98,98,0\",\r\n            \"440 SYMBOL 111,0,0,126,102,102,102,126,0\",\r\n            \"450 SYMBOL 112,0,0,126,98,98,126,96,96\",\r\n            \"460 SYMBOL 113,8,0,126,70,70,126,6,6\",\r\n            \"470 SYMBOL 114,0,0,108,114,96,96,96,0\",\r\n            \"480 SYMBOL 115,0,0,126,96,126,6,126,0\",\r\n            \"490 SYMBOL 116,24,62,24,24,24,24,30,0\",\r\n            \"500 SYMBOL 117,0,0,102,102,102,102,126,0\",\r\n            \"510 SYMBOL 118,0,0,102,102,102,60,24,0\",\r\n            \"520 SYMBOL 119,0,0,66,66,90,90,126,0\",\r\n            \"530 SYMBOL 120,0,0,198,104,16,104,198,0\",\r\n            \"540 SYMBOL 121,0,0,102,102,102,126,6,126\",\r\n            \"550 SYMBOL 122,0,0,126,12,24,48,126,0\",\r\n            \"555 REM Numbers\",\r\n            \"560 SYMBOL 48,126,102,110,118,102,102,126,0\",\r\n            \"570 SYMBOL 49,24,56,24,24,24,24,126,0\",\r\n            \"580 SYMBOL 50,126,2,2,126,96,96,126,0\",\r\n            \"590 SYMBOL 51,126,2,2,30,6,6,126,0\",\r\n            \"600 SYMBOL 52,96,96,96,96,104,126,8,8\",\r\n            \"610 SYMBOL 53,126,64,126,6,6,6,126,0\",\r\n            \"620 SYMBOL 54,126,64,64,126,98,98,126,0\",\r\n            \"630 SYMBOL 55,126,2,4,62,16,32,64,0\",\r\n            \"640 SYMBOL 56,126,66,66,126,66,66,126,0\",\r\n            \"650 SYMBOL 57,126,66,66,126,6,6,6,0\",\r\n            \"680 SYMBOL 95,0,255,0,0,0,0,0,0\",\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [\r\n            '126,66,66,126,98,98,98,0',\r\n            '126,66,66,126,98,98,126,0',\r\n            '126,64,64,96,96,96,126,0',\r\n            '254,66,66,98,98,98,254,0',\r\n            '126,64,64,120,96,96,126,0',\r\n            '126,64,64,120,96,96,96,0',\r\n            '126,64,64,102,98,98,126,0',\r\n            '66,66,66,126,98,98,98,0',\r\n            '60,16,16,24,24,24,60,0',\r\n            '126,8,8,24,24,24,120,0',\r\n            '68,68,68,120,100,100,100,0',\r\n            '64,64,64,96,96,96,126,0',\r\n            '126,74,74,98,98,98,98,0',\r\n            '98,82,74,102,98,98,98,0',\r\n            '126,66,66,98,98,98,126,0',\r\n            '126,66,66,126,96,96,96,0',\r\n            '126,66,66,98,98,106,126,4',\r\n            '126,66,66,126,106,100,98,0',\r\n            '126,64,64,126,6,6,126,0',\r\n            '126,16,16,24,24,24,24,0',\r\n            '66,66,66,98,98,98,126,0',\r\n            '66,66,66,66,66,36,24,0',\r\n            '66,66,66,98,106,106,126,0',\r\n            '102,102,36,24,36,102,102,0',\r\n            '66,66,126,16,24,24,24,0',\r\n            '126,4,8,16,32,64,126,0',\r\n            '0,0,126,6,126,70,126,0'\r\n            ]\r\n        )\r\n\r\n\r\n    def test_rip_tiles_atari_basic_1(self):\r\n        rip_flag = True\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            '0A=PEEK(106)-4:POK.106,A:GR.17:U=256*A:F.I=28TO432:POK.U+I,PEEK(57344+I):N.I:F.I=64TO79:REA.J:POK.U+I,J:N.I:H=400',\r\n            '1DIMN(255):POK.756,A:M=47:F.I=0TO4:REA.L:POK.708+I,L:N.I:B=PEEK(88)+PEEK(89)*256:O=B+59:Z=125:D=B+460:T=B+210:E=10',\r\n            '2P=T:L=26:?#6;CHR$(Z);\"USE IJKL SPC\":K=1:Q=.9:G=B:U=3:J=0:F.I=0TO127:N(I)=0:N(I+128)=0:POK.O+1+INT(RND(0)*H),M:N.I',\r\n            '3N(0)=1:N(5)=20:N(13)=-20:N(1)=-1:W=132:POS.6,1:?#6;\" MINES+ \":F.I=0TO19:POK.O-I,73:POK.D+I,73:N.I:D.0,60,126,126',\r\n            '4R=J*(J>R)+R*(J<=R):POS.1,0:?#6;9-F;\" \";CHR$(136);U;\"  \";J;\"  hi \";R:IFPEEK(P)=W THENJ=J+9:F=F-(F>0):SO.0,Z,E,E',\r\n            '5SE.4,0,0:Y=0:IFQ<RND(0)THENPOK.P-4+2*INT(RND(1)*5)+40*INT(RND(1)*3)-40,M:IFJ>=K*500 THENU=U+(U<9):K=K+1:F=0:L=74',\r\n            '6POK.P,200:S=PEEK(764):SO.0,0,0,0:IFS<>9THENPOK.764,9:IFN(S)THENPOK.P,M:P=P+N(S):J=J+1:Y=1:Q=Q-.0005:SO.0,99,E,E',\r\n            '7POK.G,W:G=B:POK.729,0:IFY*(INT(J/4)=J/4)THENG=O+1+INT(RND(1)*H):POK.G,68:D.126,126,60,0,0,170,85,170,85,170,85',\r\n            '8U=(P>O)*(P<D)*U:IFS=33ANDF<9THENPOK.P-1,0:POK.P+1,0:POK.P-20,0:POK.P+20,0:F=F+1:SE.4,33,0:G.3:D.0,14,120,30,30,0',\r\n            '9POK.711,L:ON((PEEK(P)<>M)*(U>0))GOTO4:SO.0,99,8,9:POK.P,138:U=U-1:F=0:ON(U>0)GOTO4:SO.0,0,0,0:F.I=0TO2600:N.I:G.2',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [\r\n            '0,60,126,126,126,126,60,0', \r\n            '0,170,85,170,85,170,85,0'\r\n            ]\r\n        )\r\n\r\n\r\n    def test_rip_tiles_bbc_basic_1(self):\r\n        rip_flag = True\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            '10 REM Walking alien',\r\n            '20 MODE 6',\r\n            '30 VDU 23,240,153,189,219,126,36,60,36,36',\r\n            '40 PRINT TAB(0,10);CHR$(240)',\r\n            '50 FOR I%=1 TO 19',\r\n            '60   PRINT TAB(I%-1,10);\" \"',\r\n            '70  PRINT TAB(I%,10);CHR$(240)',\r\n            '80  FOR J%=1 TO 500: NEXT J%',\r\n            '90 NEXT I%',\r\n            '100 END',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [\r\n            '153,189,219,126,36,60,36,36'\r\n            ]\r\n        )\r\n\r\n\r\n    def test_rip_tiles_sinclair_basic_1(self):\r\n        rip_flag = True\r\n        self.maxDiff = None\r\n        source_lines = [ \\\r\n            '5 POKE USR \"a\"+0,BIN 0000000',\r\n            '10 POKE USR \"a\"+1,BIN 0001000',\r\n            '20 POKE USR \"a\"+2,BIN 0011100',\r\n            '30 POKE USR \"a\"+3,BIN 0111110',\r\n            '40 POKE USR \"a\"+4,BIN 1111111',\r\n            '50 POKE USR \"a\"+5,BIN 0111110',\r\n            '60 POKE USR \"a\"+6,BIN 0011100',\r\n            '70 POKE USR \"a\"+7,BIN 0001000',\r\n            ]\r\n        ripped_lines = aux_rip_tiles(option_config, source_lines,False,False,8,8,rip_flag,False)\r\n        \r\n        self.assertEqual(ripped_lines, \\\r\n            [\r\n            '0,8,28,62,127,62,28,8'\r\n            ]\r\n        )\r\n\r\n    # compute tile\r\n    def test_compute_tile_1(self):\r\n        source_lines = [ \\\r\n        '...##...\\n', \r\n        '..#..#..\\n', \r\n        '...##...\\n', \r\n        '.##..##.\\n', \r\n        '#.####.#\\n', \r\n        '# ####.#\\n', \r\n        '..#..#..\\n', \r\n        '..#..#..\\n'\r\n        ]\r\n        tile,xsize,ysize = compute_tile(source_lines)\r\n        self.assertEqual(tile, \\\r\n            '24,36,24,102,189,189,36,36'\r\n        )\r\n        self.assertEqual(xsize,8)\r\n        self.assertEqual(ysize,8)\r\n\r\n\r\n    # compute split tile\r\n    def test_compute_split_tile_1(self):\r\n        self.maxDiff = None\r\n\r\n        source_lines = [ \\\r\n        '...######.......\\n', \r\n        '.###....###.....\\n', \r\n        '##.....#..##....\\n', \r\n        '#..#####...#....\\n', \r\n        '#...#..#...#....\\n', \r\n        '#...#####..#....\\n', \r\n        '##..#.....##....\\n', \r\n        '.###....###.....\\n', \r\n        '...######.......\\n', \r\n        '................\\n', \r\n        '................\\n', \r\n        '................'\r\n        ]\r\n    \r\n        split_tiles = compute_split_tiles(option_config, source_lines,False)\r\n        self.assertEqual(split_tiles, \\\r\n        [\r\n            [\r\n            '...#####',\r\n            '.###....',\r\n            '##.....#',\r\n            '#..#####',\r\n            '#...#..#',\r\n            '#...####',\r\n            '##..#...',\r\n            '.###....',\r\n            '...#####',\r\n            '........',\r\n            '........',\r\n            '........'\r\n            ],\r\n            [\r\n            '#.......',\r\n            '###.....',\r\n            '..##....',\r\n            '...#....',\r\n            '...#....',\r\n            '#..#....',\r\n            '..##....',\r\n            '###.....',\r\n            '#.......',\r\n            '........',\r\n            '........',\r\n            '........'\r\n            ]\r\n        ]      \r\n        )\r\n\r\n\r\n    def test_compute_split_tile_2(self):\r\n        self.maxDiff = None\r\n\r\n        source_lines = [ \\\r\n        '...######.......\\n', \r\n        '.###....###.....\\n', \r\n        '.#..#.....#.....\\n', \r\n        '##..##....##....\\n', \r\n        '#...######.#....\\n', \r\n        '#...#..##..#....\\n', \r\n        '#..##..#...#....\\n', \r\n        '#.######...#....\\n', \r\n        '##....##..##....\\n', \r\n        '.#.....#..#.....\\n', \r\n        '.###....###.....\\n', \r\n        '...######.......\\n', \r\n        '................\\n', \r\n        '................\\n', \r\n        '................\\n', \r\n        '................'\r\n        ]\r\n        split_tiles = compute_split_tiles(option_config, source_lines,False)\r\n        self.assertEqual(split_tiles, \\\r\n        [\r\n            [\r\n            '...#####',\r\n            '.###....',\r\n            '.#..#...',\r\n            '##..##..',\r\n            '#...####',\r\n            '#...#..#',\r\n            '#..##..#',\r\n            '#.######',\r\n            '##....##',\r\n            '.#.....#',\r\n            '.###....',\r\n            '...#####',\r\n            '........',\r\n            '........',\r\n            '........',\r\n            '........'\r\n            ],\r\n            [\r\n            '#.......',\r\n            '###.....',\r\n            '..#.....',\r\n            '..##....',\r\n            '##.#....',\r\n            '#..#....',\r\n            '...#....',\r\n            '...#....',\r\n            '..##....',\r\n            '..#.....',\r\n            '###.....',\r\n            '#.......',\r\n            '........',\r\n            '........',\r\n            '........',\r\n            '........'\r\n            ]\r\n        ]\r\n        )\r\n\r\n\r\nif __name__ == '__main__':\r\n    unittest.main()\r\n"
  },
  {
    "path": "src/unit_tests/testParams.py",
    "content": "import unittest\r\nimport sys\r\n\r\n\r\n\r\nsys.path.append(\"modules\")\r\n\r\nfrom params import *\r\n\r\n\r\n\r\nclass testParams(unittest.TestCase):\r\n\r\n    def test_handle_two_letter_params_1(self):\r\n        params = (\"./xl\", \"tu\")\r\n        result = handle_two_letter_params(params)\r\n        \r\n        self.assertEqual(result,['', 'test', 'unit_tests'])\r\n\r\n    def test_handle_two_letter_params_2(self):\r\n        params = (\"./xl\", \"hu\")\r\n        result = handle_two_letter_params(params)\r\n        \r\n        self.assertEqual(result,['', 'help', 'unit_tests'])\r\n\r\n    def test_get_size_params_1(self):\r\n        params = (\"size\", \"helloworld\", \"25\", \"32\")\r\n        result = get_size_params(params)\r\n        \r\n        self.assertEqual(result,(\"ncurses_sized\", \"25\", \"32\"))\r\n\r\n    def test_get_size_params_2(self):\r\n        params = ['size', 'helloworld', 'terminal', '20', '40']\r\n        result = get_size_params(params)\r\n        \r\n        self.assertEqual(result,('terminal8x8_sized', '20', '40') )\r\n\r\n\r\n\r\n\r\nif __name__ == '__main__':\r\n    \r\n    unittest.main()\r\n"
  },
  {
    "path": "src/unit_tests/testShapes.py",
    "content": "import unittest\r\nimport sys\r\n\r\n\r\nsys.path.append(\"modules\")\r\n\r\nfrom shape_functions import *\r\n\r\n\r\n\r\nclass testShapes(unittest.TestCase):\r\n\r\n\r\n    # trim_newline_from_shape\r\n    def test_trim_newline_from_shape_1(self):\r\n        source_lines = ['#.####.#\\n', '.######.\\n', '#..##..#\\n', '##.##.##\\n', '.######.\\n', '..####..\\n', '.######.\\n', '##.##.##\\n']\r\n        \r\n        trimmed_lines,xsize,ysize = trim_newline_from_shape(source_lines)\r\n\r\n        self.assertEqual(trimmed_lines, ['#.####.#', '.######.', '#..##..#', '##.##.##', '.######.', '..####..', '.######.', '##.##.##'])\r\n        self.assertEqual(xsize,8)\r\n        self.assertEqual(ysize,8)\r\n\r\n\r\n    def test_trim_newline_from_shape_2(self):\r\n        source_lines = ['\\n', '#.####.#\\n', '.######.\\n', '#..##..#\\n', '##.##.##\\n', '.######.\\n', '..####..\\n', '.######.\\n', '##.##.##\\n', '\\n', '#############']\r\n        \r\n        trimmed_lines,xsize,ysize = trim_newline_from_shape(source_lines)\r\n\r\n        self.assertEqual(trimmed_lines, ['#.####.#', '.######.', '#..##..#', '##.##.##', '.######.', '..####..', '.######.', '##.##.##','########'])\r\n        self.assertEqual(xsize,8)\r\n        self.assertEqual(ysize,9)\r\n\r\n\r\n    # convert\r\n    def test_convert_1(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,8,6,\"zero\")\r\n        \r\n        expected = \\\r\n        [\r\n        '..#..#..', \r\n        '...##...', \r\n        '.##..##.', \r\n        '#..##..#', \r\n        '...##...', \r\n        '..#..#..'\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_2(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,8,6,\"duplicate\")\r\n        \r\n        expected = \\\r\n        [\r\n        '..#..#..', \r\n        '...##...', \r\n        '.##..##.', \r\n        '#..##..#', \r\n        '...##...', \r\n        '..#..#..'\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_3(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,6,9,\"zero\")\r\n        \r\n        expected = \\\r\n        [\r\n        '..##..',\r\n        '.#..#.',\r\n        '..##..',\r\n        '##..##',\r\n        '..##..',\r\n        '..##..',\r\n        '.#..#.',\r\n        '##..##',\r\n        '......'\r\n        ]\r\n\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_4(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,6,9,\"duplicate\")\r\n        \r\n        expected = \\\r\n        [\r\n        '..##..',\r\n        '.#..#.',\r\n        '..##..',\r\n        '##..##',\r\n        '..##..',\r\n        '..##..',\r\n        '.#..#.',\r\n        '##..##',\r\n        '##..##'\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_5(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,6,8,\"duplicate\")\r\n        \r\n        expected = \\\r\n        [\r\n        '..##..',\r\n        '.#..#.',\r\n        '..##..',\r\n        '##..##',\r\n        '..##..',\r\n        '..##..',\r\n        '.#..#.',\r\n        '##..##',\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_6(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,7,8,\"duplicate\")\r\n        \r\n        expected = \\\r\n        [\r\n        '...##..',\r\n        '..#..#.',\r\n        '...##..',\r\n        '.##..##',\r\n        '#..##..',\r\n        '...##..',\r\n        '..#..#.',\r\n        '.##..##'\r\n        ]\r\n\r\n        self.assertEqual(res,expected)\r\n        \r\n\r\n    def test_convert_7(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,6,10,\"duplicate\")\r\n        \r\n        expected = \\\r\n        [\r\n        '..##..',\r\n        '..##..',\r\n        '.#..#.',\r\n        '..##..',\r\n        '##..##',\r\n        '..##..',\r\n        '..##..',\r\n        '.#..#.',\r\n        '##..##',\r\n        '##..##'\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_8(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,6,10,\"zero\")\r\n        \r\n        expected = \\\r\n        [\r\n        '......',\r\n        '..##..',\r\n        '.#..#.',\r\n        '..##..',\r\n        '##..##',\r\n        '..##..',\r\n        '..##..',\r\n        '.#..#.',\r\n        '##..##',\r\n        '......'\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_9(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,8,10,\"duplicate\")\r\n        \r\n        expected = \\\r\n        [\r\n        '...##...',\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\",\r\n        '.##..##.'\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_convert_10(self):\r\n    \r\n        tile_shape = \\\r\n        [\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\"\r\n        ]\r\n\r\n        res = resize_shape(tile_shape,8,10,\"zero\")\r\n        \r\n        expected = \\\r\n        [\r\n        '........',\r\n        \"...##...\",\r\n        \"..#..#..\", \r\n        \"...##...\", \r\n        \".##..##.\", \r\n        \"#..##..#\",\r\n        \"...##...\",\r\n        \"..#..#..\",\r\n        \".##..##.\",\r\n        '........'\r\n        ]\r\n        self.assertEqual(res,expected)\r\n\r\n\r\nif __name__ == '__main__':\r\n\r\n    unittest.main()\r\n"
  },
  {
    "path": "src/unit_tests/testStrings.py",
    "content": "import unittest\r\nimport sys\r\n\r\n\r\n\r\nsys.path.append(\"modules\")\r\n\r\nfrom strings import *\r\n\r\n\r\n\r\nclass testStrings(unittest.TestCase):\r\n\r\n    # no_space\r\n    def test_no_space_1(self):\r\n        res = no_space(\" ABCDEF GH IJ K L MNOP Q R STUVWXYZ  \")\r\n        expected = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\r\n        self.assertEqual(res,expected)\r\n\r\n    # only_upper_digits_and_space\r\n    def test_only_upper_digits_and_space_1(self):\r\n        res = only_upper_digits_and_space(\" ABCDEF GH IJ K L MNOP Q R STUVWXYZ  \")\r\n        expected = \" ABCDEF GH IJ K L MNOP Q R STUVWXYZ  \"\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_only_upper_digits_and_space_2(self):\r\n        res = only_upper_digits_and_space(\" AB45678CDEF GH I0123J K L MNOP Q R STUVWXYZ 9 \")\r\n        expected = \" AB45678CDEF GH I0123J K L MNOP Q R STUVWXYZ 9 \"\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_only_upper_digits_and_space_3(self):\r\n        res = only_upper_digits_and_space(\"123\")\r\n        expected = \"123\"\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_only_upper_digits_and_space_4(self):\r\n        res = only_upper_digits_and_space(\"ABC\")\r\n        expected = \"ABC\"\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_only_upper_digits_and_space_5(self):\r\n        res = only_upper_digits_and_space(\"1_23\")\r\n        expected = \"123\"\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_only_upper_digits_and_space_6(self):\r\n        res = only_upper_digits_and_space(\"ABabcC\")\r\n        expected = \"ABC\"\r\n        self.assertEqual(res,expected)\r\n\r\n    # compute_string\r\n    def test_compute_string_1(self):\r\n        res = compute_string(\"ABC\")\r\n        expected = \"_XL_A _XL_B _XL_C\"\r\n        self.assertEqual(res,expected)\r\n        \r\n    def test_compute_string_2(self):\r\n        res = compute_string(\"abc\")\r\n        expected = \"_XL_a _XL_b _XL_c\"\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_compute_string_3(self):\r\n        res = compute_string(\"A 1 b\")\r\n        expected = '_XL_A _XL_SPACE \"1\" _XL_SPACE _XL_b'\r\n        self.assertEqual(res,expected)\r\n        \r\n    def test_compute_string_4(self):\r\n        res = compute_string(\"123\")\r\n        expected = '\"1\" \"2\" \"3\"'\r\n        self.assertEqual(res,expected)\r\n\r\n    def test_compute_string_5(self):\r\n        res = compute_string(\" A 1 b 7\")\r\n        expected = '_XL_SPACE _XL_A _XL_SPACE \"1\" _XL_SPACE _XL_b _XL_SPACE \"7\"'\r\n        self.assertEqual(res,expected)\r\n\r\n\r\nif __name__ == '__main__':\r\n\r\n    unittest.main()\r\n"
  },
  {
    "path": "src/unit_tests/testTiles.py",
    "content": "import unittest\r\nimport sys\r\n\r\n\r\nsys.path.append(\"modules\")\r\n\r\nfrom tiles import *\r\n\r\n\r\n\r\nclass testTiles(unittest.TestCase):\r\n\r\n\r\n    # detect_xsize\r\n    def test_detect_xsize_1(self):\r\n        res = detect_xsize(\"vic20\")\r\n        self.assertEqual(res,8)\r\n\r\n    def test_detect_xsize_2(self):\r\n        res = detect_xsize(\"oric\")\r\n        self.assertEqual(res,6)\r\n\r\n    def test_detect_xsize_3(self):\r\n        res = detect_xsize(\"pecom\")\r\n        self.assertEqual(res,6)\r\n\r\n    def test_detect_xsize_4(self):\r\n        res = detect_xsize(\"comx\")\r\n        self.assertEqual(res,6)\r\n\r\n    def test_detect_xsize_5(self):\r\n        res = detect_xsize(\"micro\")\r\n        self.assertEqual(res,6)\r\n\r\n    def test_detect_xsize_6(self):\r\n        res = detect_xsize(\"atari_lynx\")\r\n        self.assertEqual(res,8)\r\n\r\n    def test_detect_xsize_7(self):\r\n        res = detect_xsize(\"apple2\")\r\n        self.assertEqual(res,7)\r\n\r\n    def test_detect_xsize_8(self):\r\n        res = detect_xsize(\"apple2enh\")\r\n        self.assertEqual(res,7)\r\n        \r\n    def test_detect_xsize_9(self):\r\n        res = detect_xsize(\"comx_ntsc\")\r\n        self.assertEqual(res,6)\r\n\r\n    def test_detect_xsize_10(self):\r\n        res = detect_xsize(\"micro_ntsc\")\r\n        self.assertEqual(res,6)\r\n\r\n    def test_detect_xsize_11(self):\r\n        res = detect_xsize(\"atmos\")\r\n        self.assertEqual(res,6)\r\n\r\n\r\n    # detect_ysize\r\n    def test_detect_ysize_1(self):\r\n        res = detect_ysize(\"vic20\")\r\n        self.assertEqual(res,8)\r\n\r\n    def test_detect_ysize_2(self):\r\n        res = detect_ysize(\"oric\")\r\n        self.assertEqual(res,8)\r\n\r\n    def test_detect_ysize_3(self):\r\n        res = detect_ysize(\"pecom\")\r\n        self.assertEqual(res,9)\r\n\r\n    def test_detect_ysize_4(self):\r\n        res = detect_ysize(\"comx\")\r\n        self.assertEqual(res,9)\r\n\r\n    def test_detect_ysize_5(self):\r\n        res = detect_ysize(\"micro\")\r\n        self.assertEqual(res,9)\r\n\r\n    def test_detect_ysize_6(self):\r\n        res = detect_ysize(\"atari_lynx\")\r\n        self.assertEqual(res,6)\r\n\r\n    def test_detect_ysize_7(self):\r\n        res = detect_ysize(\"apple2\")\r\n        self.assertEqual(res,8)\r\n\r\n    def test_detect_ysize_8(self):\r\n        res = detect_ysize(\"apple2enh\")\r\n        self.assertEqual(res,8)\r\n        \r\n    def test_detect_ysize_9(self):\r\n        res = detect_ysize(\"comx_ntsc\")\r\n        self.assertEqual(res,8)\r\n\r\n    def test_detect_ysize_10(self):\r\n        res = detect_ysize(\"micro_ntsc\")\r\n        self.assertEqual(res,8)\r\n\r\n    def test_detect_ysize_11(self):\r\n        res = detect_ysize(\"atmos\")\r\n        self.assertEqual(res,8)\r\n\r\n\r\n\r\nif __name__ == '__main__':\r\n\r\n    unittest.main()\r\n"
  },
  {
    "path": "src/xl",
    "content": "#!/usr/bin/env python\n\n'''\nMain script:\n- It initialize the configuration object.\n- It reads the parameters from either the command line or keyboard\n- It executes the received command\n'''\n\nimport sys\nimport datetime\nimport os\n\n#pylint: disable=wrong-import-position\nsys.path.append(\"modules\")\n\nfrom modules.LoggerSingleton import LoggerSingleton\nfrom modules.params import get_params\nfrom modules.commands import COMMANDS_LIST\nfrom modules.tests import test_make\nfrom modules.option_functions import get_config, handle_make\nfrom modules.init import handle_parallelism, show_python_version\nfrom modules.execute import execute_command\nfrom modules.file_functions import list_of_projects\nfrom modules.build_functions import build\nfrom modules.help_functions import manual\n#pylint: enable=wrong-import-position\n\nlogger = LoggerSingleton.initLogger('xl', '../logs')\nlogger.info('Started')\n\n\ndef get_gnu_make(config):\n    '''\n    It determines which make command is available.\n    It modifies the config object.\n    It returns the name of the make executable\n    '''\n    make_test = test_make(config, silent=True)\n    handle_make(config, make_test)\n    return config.build_config.gnu_make\n\n\nif __name__ == \"__main__\":\n    option_config = get_config()\n    GNU_MAKE = get_gnu_make(option_config)\n    handle_parallelism(option_config)\n    show_python_version(option_config)\n\n    params = get_params(option_config)\n\n    execute_command(option_config, params)\n\n    logger.info('Finished')\n    os.system('mv ../logs/log.log ../logs/log_' + \\\n              datetime.datetime.now().strftime(\"%Y-%m-%d_%H_%M_%S\")+'.log 2>/dev/null' )\n"
  },
  {
    "path": "tools/README.txt",
    "content": "TOOLS\r\n\r\nAll the programs here are third-party tools:\r\n\r\n- cc65/apple2\r\nac.jar https://github.com/AppleCommander\r\n\r\n- cc65/c64\r\nprg2crt.py http://www.frank-buss.de/c64/prg2crt/index.html\r\n\r\n- cc65/gamate\r\ngamate-fixcart.exe https://github.com/cc65/cc65/blob/master/util/gamate/gamate-fixcart.c\r\n\r\n- cc65/osic1p\r\nsrec_cat.exe http://srecord.sourceforge.net/\r\n\r\n- cmoc/coco\r\nfile2dsk.exe http://www.colorcomputerarchive.com/coco/Utilities/?fbclid=IwAR2BOfF9KYC1hE8OaBU2vad_Y1iWDCbtX6lvLNIpns7OcpgJlWuqguybH5U\r\n\r\n- cmoc/dragon\r\nbin2cas.pl https://www.6809.org.uk/dragon/\r\nFile2VDK.exe https://github.com/rolfmichelsen/dragontools\r\n\r\n- cmoc/mo5\r\nf2k5.exe  http://pulkomandy.tk/projects/thomson/browser/Thomson/tools/\r\nsapfs.exe https://sourceforge.net/p/teoemulator/code/ci/default/tree/tools/sap/ (also in http://pulkomandy.tk/projects/thomson/browser/Thomson/tools/)\r\n\r\n- gcc\r\nlibncurses https://www.gnu.org/software/ncurses/\r\n\r\n- generic\r\nexomizer.exe (my Magnus Lind) https://bitbucket.org/magli143/exomizer/wiki/Home\r\nc1541.exe http://vice-emu.sourceforge.net/\r\n\r\n- olivetti_m20\r\nm20 ftp://ftp.groessler.org/pub/chris/olivetti_m20/imgtools/m20floppy-0.61.tar.gz\r\n\r\n- xtc68\r\n424frun1.zip  http://www.dilwyn.me.uk/c/index.html \r\n\r\n- z88dk/abc80\r\nbin2bac2.exe\r\ndosgen\r\ndoscopy\r\n\r\n- z88dk/cpc\r\nnocart/nocart.exe http://www.cpcwiki.eu/index.php/Nocart\r\n\r\n- z88dk/oz \r\nmakewzd.exe https://github.com/z88dk/z88dk/blob/master/support/oz/makewzd.c\r\n\r\n- z88dk/samcoupe \r\npyz80.py https://github.com/simonowen/pyz80\r\n\r\n- ea5tocart\r\n\r\nea5tocart by Asmusr (from AtariAge)\r\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/Makefile",
    "content": "SHELL=/bin/sh\n\n# bbcim (Acorn BBC computer disk image manipulation)\n#\n# This file is public domain, by W.H.Scholten 1996 - 2001, 2014, 2017\n#\n# -Wall -Wfatal-errors -Wstrict-prototypes -Wmissing-prototypes\nALL_CFLAGS=-O2  -g -w\n\nINSTALL=$(HOME)\n\nall:\tbbcim\n\nbbcim:\tsrc/*.c src/*.h\n\t$(CC) $(ALL_CFLAGS) -o bbcim src/bbcim.c\n\nclean:\n\trm -f bbcim src/*.o doc/bbcim.ps doc/bbcim.pdf\n\trm -f *~ src/*~ doc/*~ core *.core\n\ninstall: all\n\tmkdir -p $(INSTALL)/bin/\n\tcp -f bbcim $(INSTALL)/bin/\n\tmkdir -p $(INSTALL)/man/man1/\n\tcp -fp doc/bbcim.1 $(INSTALL)/man/man1/\n\n\nuninstall:\n\trm -f $(INSTALL)/bin/bbcim $(INSTALL)/man/man1/bbcim.1\n\npostscript: doc/bbcim.ps\n\npdf: doc/bbcim.pdf\n\n\n# // Compile C files to object files.\n.c.o:\n\t$(CC) $(ALL_CFLAGS) -c -o $@ $<\n\n\n# // Compile man pages to postscript/pdf\n.SUFFIXES: .1 .2 .3 .4 .5 .6 .7 .8 .9 .ps .pdf\n.1.ps:\n\tgroff -t -e -mandoc -Tps $< > $@\n\n.ps.pdf: doc/bbcim.ps\n\tps2pdf $< $@\n\n# EOF\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/READ_ME",
    "content": "bbcim: BBC microcomputer diskimage manipulation program\n-------------------------------------------------------\nVersion 1.0.1, 16-4-2017.\n\nThis is the final version of the original bbcim program that was released way back in 1996, and which was based on a combination of a few separate utility programs that I had released in 1995 to do BBC micro computer diskimage manipulation on a PC which when combined into a single program I expanded with lots of functions.\n\nIn 2009 I revised the old and trusted 0.95-beta 5 to fix several small issues, the last update being bbcim 0.95-beta 11 which I released on 20 May 2009. After those 6 updates I should have named it 1.0, which after some more cleanups is what I did in 2014, and now I finally decided to support long filenames in the 1.0 branch of bbcim, so this is version 1.0.1\n\nSee the file src/bbcim.c for a version history and you can select some compile time changes there too, such as to give messages in Dutch instead of English. For a unix like OS you don't need to change anything there.\n\n\n\nMaking and installing the program:\n----------------------------------\nTo make the program, type:\n   make\n\nTo make a postscript version of the manual page (directory doc/), type:\n   make postscript\n\nTo make a pdf version of the manual page (directory doc/), type:\n   make pdf\n\nTo install in $(HOME)/bin, $(HOME)/man/man1, type:\n   make install\n\nTo install in a system location such as /usr/local/bin, /usr/local/man, change the Makefile or copy things by hand (e.g.: cp bbcim /usr/local/bin/)\n\n\nLicence:\n--------\nBasically you can do what you want with it as long as you keep the copyright notices in tact, see doc/LICENCE.\n\n\nEmail & website:\n----------------\nW.H.Scholten (swhs-web@xs4all.nl)\nwebsite: http://wouter.bbcmicro.net/\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/doc/ARCHIVE_FORMAT-0.83",
    "content": "../../../_shared/_archive_format/ARCHIVE_FORMAT-0.83"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/doc/LICENCE",
    "content": "All files not explicitly licenced otherwise are licenced thus:\n\n// Copyright (c) W.H. Scholten 1996, 1997, 2009, 2014\n// \n// Permission to use, copy, modify, distribute, and sell this software\n// and its documentation for any purpose is hereby granted without fee,\n// provided that the above copyright notice appear in all copies and\n// that both that copyright notice and this permission notice appear in\n// supporting documentation, and that the name of the copyright holder\n// not be used in advertising or publicity pertaining to distribution\n// of the software without specific, written prior permission. The\n// copyright holder makes no representations about the suitability of\n// this software for any purpose. It is provided \"as is\" without express\n// or implied warranty.\n//\n// THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n// SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n// SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n// RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n// CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/doc/bbcim.1",
    "content": ".\\\" -*- nroff -*-\n.\\\"\n.\\\" bbcim.\n.\\\" Copyright (C) 1996,2009,2014,2017 W.H.Scholten.\n.\\\"\n.\\\" This program is free; you may redistribute it and/or modified\n.\\\" versions of it if you give me due credit.\n.\\\" You may not use part or whole of the source code for any commercial product.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful, but\n.\\\" WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n.\\\"\n.\\\"\n.\\\" bbcim.1 - nroff -man source for  bbcim  man page.\n.\\\"\n.\\\"\n.\\\"\n.TH bbcim 1 \"1 Sept 1996 - 16 April 2017\" \"Version 1.0.1\" \"Utilities\"\n.\\\"\n.\\\"------------------------------------------------------------------\n.\\\"\n.SH NAME\nbbcim - bbc computer file conversion utility\n.\\\"\n.\\\"------------------------------------------------------------------\n.\\\"\n.SH SYNOPSIS\n.B bbcim [options] [file(s)]\n.\\\"\n.\\\"------------------------------------------------------------------\n.\\\"\n.SH DESCRIPTION\nbbcim is a file conversion utility to help in transferring files and for use with emulators (Acorn DFS disk image manipulation and more)\n.SH USE\nbbcim  option [file [{filelist}]]\n\nNote that any extension is allowed for disk images.\n\noptions:\n.TP\n.B \\-e[s/d,#,b,r] <disk image> [{list}]\nextracts files.\nWithout the d or s or # the option -e extracts files from a disk image with filenames like 'imagefile.$.!BOOT'. With every 'bare' file an info file is created containing load- and execution addresses (archive format).\n.B d\nextracts the files in a directory named after the disk image: eg. 'imagefile/$.ELITE'.\n.B s\ngives short filenames (no leading disk image name).\n.B #\nremoves the bbc root directory $ and glues other directories to the filename. (name clash is possible but unlikely, eg. E.E and EE, in that case you will be asked whether to rename, overwrite, etc.). Note that I've chosen # instead of $ as this is used as a wildcard character in unix.\n.B b\nwith this option -e only produces the bare files, and no info files.\n.B r\nremoves the disk image after extracting files.\n\nIn all cases a catalogue file 'imagefile.cat' is made except when a list of file names is given, in which case:\n - only the files in the list are extracted from the disk image\n - \n.B r\nis ignored\n(change? only remove that file from the disk image?)\n - a catalogue is not produced.\n.TP\n.B  -c   <disk image>\nshow catalogue (files in image).\n.TP\n.B \\-40  <disk image>\nexpand a disk image to 40 tracks (if current size is smaller than 40 tracks). This changes the disk image size, but more importantly also the DFS filing system size (the number with the number of sectors that's stored in the disk image). So shrinking an 80 track image to 40 track is possible by first using -min, then -40 (if the files fit on 40 tracks).\n.TP\n.B \\-80  <disk image>\nexpand a disk image to 80 tracks (if current size is smaller than 80 tracks). This changes the disk image size, but more importantly also the DFS filing system size (see above).\n.TP\n.B \\-max <disk image>\nexpand disk image to (almost) 256 K. This changes the disk image size, but more importantly also the DFS filing system size (see above).\n.TP\n.B \\-min <disk image>\nminimise disk image (equal to *COMPACT and cutting off after the last used sector).\n.TP\n.B \\-crc <disk image>\ncalculates crc's for all the files in the disk image.\n.TP\n.B \\-new <disk image>\nmakes a new (empty) disk image (512 bytes, bootoption EXEC).\nOBSOLETE (-a creates a new disk image if needed).\n.TP\n.B \\-a[b,r] <disk image> {list}\nadd files (in archive format) to the disk image:\nAutomatically skips '.inf' files so bbcim -a disk.bbc * (unix) gives no problems. If the disk image didn't exist a new one will be created. The option 'r' removes the archive files after adding them to the disk image.\n.I The option 'b' adds files without .inf file\n(setting load/exec addresses to 0).\n.TP\n.B \\-d <disk image> {list}\ndelete the list of files from the disk image.\nNOTE: files without a bbcdir are assumed to have the root dir, eg. ELITE is assumed to be $.ELITE\n.TP\n.B \\-interss (sd,dd) <image_0> <image_1> <image_2>\ninterleaves single sided disk images image_0 and image_1 to image_2.\n.TP\n.B \\-splitds (sd,dd) <image>\nsplits interleaved disk image image to image.0 & image.1. The new names are made by appending .0 and .1.\n.TP\n.B \\-ddos2dfs <ddos disk image>\nsplits a single sided DDOS diskdump into several DFS disk images.\nEg. myfiles.dd > myfilesA.bbc,..., myfilesH.bbc. The new names are made by appending .A ... .H\n.TP\n.B \\-w62dfs file[.ext]\nsplits a single sided watford 62 file disk image into 2 DFS disk images (one image if there are less than 32 files on the image) file.w1 & file.w2.\n\n.TP\n.B \\-x {list}\nxbeeb conversion of archive files in the list.\n.TP\n.B \\-s[#] <file>\nsplits a text file with file information similar to a DFS catalogue, into .inf files. Lines not starting with a bbc (DFS) file name (i.e. dir.name) are skipped. The option # removes the DFS directory $ and glues others to the file name. This can be used to make archive files from an xbeeb directory.\n.TP\n.B \\-y {list}\nrenames archive/info files to standard format (as produced with # in -e), add's crc's if not found, checks crc's if found.\n.TP\n.B \\-icrc {list}\ncheck crc's of given archive files.\n.TP\n.B \\-xcrc\ncheck crc's of Xbeeb files?\n.TP\n.B \\-V\nprint version no.\n.TP\n.B \\-H\nhelp (command overview).\n\n\n.SH CURRENT VERSION\n 1.0.1\n\n.SH NOTES\n1. options and files can be entered after starting the programs for all options that do not require a file list.\n\n2. for option -d and -e with a list:\n  2.1 wildcards are not possible\n  2.2 names are case sensitive.\n\n3. (see also 2) several files in a disk image can have the same name when using -a (actually useful to get things back to a beeb, no need to rename).\n\n.SH POSSIBLE FEATURES OF LATER VERSIONS:\n.TP\n.B -e with suboption r\nshould suboption 'r' remove the extracted files? (using -d)\n.TP\n.B -id\nidentify diskformat (single/doublesided, dfs/ddos). It's not possible to do this foolproof so I'm not sure.\n.TP\n.B -ren\nrename a file in a diskimage.\n.TP\n.B -boot <bootoption>\nSet the bootoption (to one of: none, LOAD, RUN, EXEC)\n.TP\n.B -sect <nn>: custom disksize (for DDOS)\n\n.P\nSee the website mentioned at the end of this document, for later versions of bbcim. This 1.0 version is the final version of the older 0.95b5 and has been updated to fix a few bugs and cleanup the documentation, esp. the current email address and website, but it will not be enhanced with new features. For those see the later branch 1.1 which is less well tested but has some neat improvements.\n\n\n.SH DESCRIPTION OF THE ARCHIVE FORMAT\nI.e. the standard format for/of files in the BBC micro archive of software on my website.\n\n[ N.B.  At the  time of writing  this down  (1997), my BBC  archive of\nsoftware was  almost all the software  for the BBC  micro available on\nthe internet (Robert  Schmidt's archive was mostly a  mirror of what I\nput up), and I  wanted to get rid of diskimages so  you could pick and\nchoose software to put into a  disk yourself. So, 'the archive' was my\narchive of BBC software. ]\n\nComplementing the bare bbc file\n.B $.ELITE\nis the info file\n.B $.ELITE.inf\n, a text file containing '$.ELITE   FF0E00 FF8023 Locked CRC=XXXX NEXT $.ELITE2'\n\nThe name $.ELITE in the info file is optional but if present the files may be renamed to say a and a.inf and $.ELITE is then the real filename.\n\nA CRC is included for various reasons (to check fileconversion software, serial- or disk- file transfer to/from a bbc, etc.) The CRC is calculated with the algorithm from the BBC user guide p. 399 (The same algorithm as used in the cassettte and rom filing system).\n\n'Locked' may be abbreviated to 'L'.\n\nNEXT may be used for CHAIN\"\" or *RUN as used on cassette systems. Cassette names are translated to $.cassette_name, (i.e. max 12 chars), otherwise a tape identifier would be needed (e.g. TAPE= at the start of the info file)\n\nfile length may be included (after the execution address) but is unnecessary.\n\ni.e.:\n[TAPE=tfs_filename / dfs_filename] loadaddress exec address [locked] crc=xxxx [NEXT name]]\nas tape emulation is only implemented by 6502em (with custom cassette formats?)  and as custom cassette formats should  be possible (eg. ELITE, FORTRESS), the tape section is mostly irrelevant for the moment (useful for preservation of real names though).\n\n\n\n.SH BUGS\nhmm, none? ;-)\n\n.SH AUTHOR\nWouter Scholten (swhs-web@xs4all.nl)\n\nWeb page: http://wouter.bbcmicro.net/\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/doc/bbcim.ps",
    "content": "%!PS-Adobe-3.0\n%%Creator: groff version 1.19.2\n%%CreationDate: Sun Apr 16 15:05:12 2017\n%%DocumentNeededResources: font Times-Roman\n%%+ font Times-Bold\n%%+ font Times-Italic\n%%DocumentSuppliedResources: procset grops 1.19 2\n%%Pages: 4\n%%PageOrder: Ascend\n%%DocumentMedia: Default 612 792 0 () ()\n%%Orientation: Portrait\n%%EndComments\n%%BeginDefaults\n%%PageMedia: Default\n%%EndDefaults\n%%BeginProlog\n%%BeginResource: procset grops 1.19 2\n/setpacking where{\npop\ncurrentpacking\ntrue setpacking\n}if\n/grops 120 dict dup begin\n/SC 32 def\n/A/show load def\n/B{0 SC 3 -1 roll widthshow}bind def\n/C{0 exch ashow}bind def\n/D{0 exch 0 SC 5 2 roll awidthshow}bind def\n/E{0 rmoveto show}bind def\n/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def\n/G{0 rmoveto 0 exch ashow}bind def\n/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def\n/I{0 exch rmoveto show}bind def\n/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def\n/K{0 exch rmoveto 0 exch ashow}bind def\n/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def\n/M{rmoveto show}bind def\n/N{rmoveto 0 SC 3 -1 roll widthshow}bind def\n/O{rmoveto 0 exch ashow}bind def\n/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def\n/Q{moveto show}bind def\n/R{moveto 0 SC 3 -1 roll widthshow}bind def\n/S{moveto 0 exch ashow}bind def\n/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def\n/SF{\nfindfont exch\n[exch dup 0 exch 0 exch neg 0 0]makefont\ndup setfont\n[exch/setfont cvx]cvx bind def\n}bind def\n/MF{\nfindfont\n[5 2 roll\n0 3 1 roll\nneg 0 0]makefont\ndup setfont\n[exch/setfont cvx]cvx bind def\n}bind def\n/level0 0 def\n/RES 0 def\n/PL 0 def\n/LS 0 def\n/MANUAL{\nstatusdict begin/manualfeed true store end\n}bind def\n/PLG{\ngsave newpath clippath pathbbox grestore\nexch pop add exch pop\n}bind def\n/BP{\n/level0 save def\n1 setlinecap\n1 setlinejoin\n72 RES div dup scale\nLS{\n90 rotate\n}{\n0 PL translate\n}ifelse\n1 -1 scale\n}bind def\n/EP{\nlevel0 restore\nshowpage\n}def\n/DA{\nnewpath arcn stroke\n}bind def\n/SN{\ntransform\n.25 sub exch .25 sub exch\nround .25 add exch round .25 add exch\nitransform\n}bind def\n/DL{\nSN\nmoveto\nSN\nlineto stroke\n}bind def\n/DC{\nnewpath 0 360 arc closepath\n}bind def\n/TM matrix def\n/DE{\nTM currentmatrix pop\ntranslate scale newpath 0 0 .5 0 360 arc closepath\nTM setmatrix\n}bind def\n/RC/rcurveto load def\n/RL/rlineto load def\n/ST/stroke load def\n/MT/moveto load def\n/CL/closepath load def\n/Fr{\nsetrgbcolor fill\n}bind def\n/setcmykcolor where{\npop\n/Fk{\nsetcmykcolor fill\n}bind def\n}if\n/Fg{\nsetgray fill\n}bind def\n/FL/fill load def\n/LW/setlinewidth load def\n/Cr/setrgbcolor load def\n/setcmykcolor where{\npop\n/Ck/setcmykcolor load def\n}if\n/Cg/setgray load def\n/RE{\nfindfont\ndup maxlength 1 index/FontName known not{1 add}if dict begin\n{\n1 index/FID ne{def}{pop pop}ifelse\n}forall\n/Encoding exch def\ndup/FontName exch def\ncurrentdict end definefont pop\n}bind def\n/DEFS 0 def\n/EBEGIN{\nmoveto\nDEFS begin\n}bind def\n/EEND/end load def\n/CNT 0 def\n/level1 0 def\n/PBEGIN{\n/level1 save def\ntranslate\ndiv 3 1 roll div exch scale\nneg exch neg exch translate\n0 setgray\n0 setlinecap\n1 setlinewidth\n0 setlinejoin\n10 setmiterlimit\n[]0 setdash\n/setstrokeadjust where{\npop\nfalse setstrokeadjust\n}if\n/setoverprint where{\npop\nfalse setoverprint\n}if\nnewpath\n/CNT countdictstack def\nuserdict begin\n/showpage{}def\n/setpagedevice{}def\n}bind def\n/PEND{\ncountdictstack CNT sub{end}repeat\nlevel1 restore\n}bind def\nend def\n/setpacking where{\npop\nsetpacking\n}if\n%%EndResource\n%%BeginFeature: *PageSize Default\n<< /PageSize [ 612 792 ] /ImagingBBox null >> setpagedevice\n%%EndFeature\n%%IncludeResource: font Times-Roman\n%%IncludeResource: font Times-Bold\n%%IncludeResource: font Times-Italic\ngrops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72\ndef/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron\n/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef\n/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent\n/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen\n/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon\n/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O\n/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex\n/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y\n/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft\n/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl\n/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut\n/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash\n/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen\n/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft\n/logicalnot/minus/registered/macron/degree/plusminus/twosuperior\n/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior\n/ordmasculine/guilsinglright/onequarter/onehalf/threequarters\n/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE\n/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex\n/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis\n/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn\n/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla\n/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis\n/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash\n/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def\n/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE\n/Times-Roman@0 ENC0/Times-Roman RE\n%%EndProlog\n%%Page: 1 1\n%%BeginPageSetup\nBP\n%%EndPageSetup\n/F0 10/Times-Roman@0 SF 178.725(bbcim\\(1\\) Utilities bbcim\\(1\\))72 48 R\n/F1 10.95/Times-Bold@0 SF -.219(NA)72 84 S(ME).219 E F0\n(bbcim - bbc computer \\214le con)108 96 Q -.15(ve)-.4 G(rsion utility)\n.15 E F1(SYNOPSIS)72 112.8 Q/F2 10/Times-Bold@0 SF -.1(bb)108 124.8 S\n(cim [options] [\\214le\\(s\\)]).1 E F1(DESCRIPTION)72 141.6 Q F0 .823\n(bbcim is a \\214le con)108 153.6 R -.15(ve)-.4 G .822(rsion utility to \\\nhelp in transferring \\214les and for use with emulators \\(Acorn DFS dis\\\nk).15 F(image manipulation and more\\))108 165.6 Q F1(USE)72 182.4 Q F0\n2.5(bbcim option)108 194.4 R([\\214le [{\\214lelist}]])2.5 E(Note that an)\n108 218.4 Q 2.5(ye)-.15 G(xtension is allo)-2.65 E(wed for disk images.)\n-.25 E(options:)108 242.4 Q F2(\\255e[s/d,#,b,r] <disk image> [{list}])\n108 259.2 Q F0 -.15(ex)144 271.2 S .34(tracts \\214les.).15 F -.4(Wi)5.34\nG .34(thout the d or s or # the option -e e).4 F .34\n(xtracts \\214les from a disk image with \\214lenames)-.15 F(lik)144 283.2\nQ 2.792(e')-.1 G(image\\214le.$.!BOO)-2.792 E .292(T'. W)-.4 F .292\n(ith e)-.4 F -.15(ve)-.25 G .291\n(ry 'bare' \\214le an info \\214le is created containing load- and e).15 F\n-.15(xe)-.15 G(cu-).15 E .51(tion addresses \\(archi)144 295.2 R .81 -.15\n(ve f)-.25 H(ormat\\).).15 E F2(d)5.51 E F0 -.15(ex)3.01 G .511\n(tracts the \\214les in a directory named after the disk image: e).15 F\n(g.)-.15 E('image\\214le/$.ELITE'.)144 307.2 Q F2(s)6.118 E F0(gi)3.618 E\n-.15(ve)-.25 G 3.618(ss).15 G 1.118\n(hort \\214lenames \\(no leading disk image name\\).)-3.618 F F2(#)6.117 E\nF0(remo)3.617 E -.15(ve)-.15 G 3.617(st).15 G 1.117(he bbc)-3.617 F .929\n(root directory $ and glues other directories to the \\214lename. \\(name\\\n clash is possible b)144 319.2 R .93(ut unlik)-.2 F(ely)-.1 E(,)-.65 E\n-.15(eg)144 331.2 S 3.075(.E).15 G .575\n(.E and EE, in that case you will be ask)-3.075 F .575\n(ed whether to rename, o)-.1 F -.15(ve)-.15 G .575\n(rwrite, etc.\\). Note that I').15 F -.15(ve)-.5 G .036\n(chosen # instead of $ as this is used as a wildcard character in unix.)\n144 343.2 R F2(b)5.037 E F0 .037(with this option -e only pro-)2.537 F\n(duces the bare \\214les, and no info \\214les.)144 355.2 Q F2(r)5 E F0\n(remo)2.5 E -.15(ve)-.15 G 2.5(st).15 G(he disk image after e)-2.5 E\n(xtracting \\214les.)-.15 E 1.109\n(In all cases a catalogue \\214le 'image\\214le.cat' is made e)144 379.2 R\n1.108(xcept when a list of \\214le names is gi)-.15 F -.15(ve)-.25 G\n1.108(n, in).15 F(which case:)144 391.2 Q 2.5(-o)146.5 403.2 S\n(nly the \\214les in the list are e)-2.5 E(xtracted from the disk image)\n-.15 E(-)146.5 415.2 Q F2(r)2.5 E F0(is ignored \\(change? only remo)2.5\nE .3 -.15(ve t)-.15 H(hat \\214le from the disk image?\\)).15 E 2.5(-ac)\n146.5 427.2 S(atalogue is not produced.)-2.5 E F2(-c <disk image>)108\n444 Q F0(sho)144 456 Q 2.5(wc)-.25 G(atalogue \\(\\214les in image\\).)-2.5\nE F2(\\25540 <disk image>)108 472.8 Q F0 -.15(ex)144 484.8 S .546(pand a\\\n disk image to 40 tracks \\(if current size is smaller than 40 tracks\\).\\\n This changes the disk).15 F .476(image size, b)144 496.8 R .476(ut mor\\\ne importantly also the DFS \\214ling system size \\(the number with the n\\\number of)-.2 F .597(sectors that')144 508.8 R 3.097(ss)-.55 G .597(tore\\\nd in the disk image\\). So shrinking an 80 track image to 40 track is po\\\nssible by)-3.097 F\n(\\214rst using -min, then -40 \\(if the \\214les \\214t on 40 tracks\\).)144\n520.8 Q F2(\\25580 <disk image>)108 537.6 Q F0 -.15(ex)144 549.6 S .546(\\\npand a disk image to 80 tracks \\(if current size is smaller than 80 tra\\\ncks\\). This changes the disk).15 F(image size, b)144 561.6 Q\n(ut more importantly also the DFS \\214ling system size \\(see abo)-.2 E\n-.15(ve)-.15 G(\\).).15 E F2(\\255max <disk image>)108 578.4 Q F0 -.15(ex)\n144 590.4 S .191(pand disk image to \\(almost\\) 256 K. This changes the \\\ndisk image size, b).15 F .191(ut more importantly also)-.2 F\n(the DFS \\214ling system size \\(see abo)144 602.4 Q -.15(ve)-.15 G(\\).)\n.15 E F2(\\255min <disk image>)108 619.2 Q F0\n(minimise disk image \\(equal to *COMP)144 631.2 Q -.4(AC)-.92 G 2.5(Ta)\n.4 G(nd cutting of)-2.5 E 2.5(fa)-.25 G(fter the last used sector\\).)\n-2.5 E F2(\\255cr)108 648 Q 2.5(c<)-.18 G(disk image>)-2.5 E F0\n(calculates crc')144 660 Q 2.5(sf)-.55 G\n(or all the \\214les in the disk image.)-2.5 E F2(\\255new <disk image>)\n108 676.8 Q F0(mak)144 688.8 Q .814(es a ne)-.1 F 3.314(w\\()-.25 G .814\n(empty\\) disk image \\(512 bytes, bootoption EXEC\\).)-3.314 F .813\n(OBSOLETE \\(-a creates a ne)5.813 F(w)-.25 E(disk image if needed\\).)144\n700.8 Q -1.11(Ve)72 768 S(rsion 1.0.1)1.11 E 2.5(1S)124.84 G\n(ept 1996 - 16 April 2017)-2.5 E(1)172.89 E 0 Cg EP\n%%Page: 2 2\n%%BeginPageSetup\nBP\n%%EndPageSetup\n/F0 10/Times-Roman@0 SF 178.725(bbcim\\(1\\) Utilities bbcim\\(1\\))72 48 R\n/F1 10/Times-Bold@0 SF(\\255a[b,r] <disk image> {list})108 84 Q F0 .02\n(add \\214les \\(in archi)144 96 R .32 -.15(ve f)-.25 H .021\n(ormat\\) to the disk image: Automatically skips '.inf).15 F 2.521<278c>\n.55 G .021(les so bbcim -a disk.bbc)-2.521 F 2.707(*\\()144 108 S .207\n(unix\\) gi)-2.707 F -.15(ve)-.25 G 2.707(sn).15 G 2.707(op)-2.707 G .207\n(roblems. If the disk image didn')-2.707 F 2.707(te)-.18 G .207\n(xist a ne)-2.857 F 2.707(wo)-.25 G .207\n(ne will be created. The option ')-2.707 F(r')-.5 E(remo)144 120 Q -.15\n(ve)-.15 G 2.508(st).15 G .008(he archi)-2.508 F .308 -.15(ve \\214)-.25\nH .009(les after adding them to the disk image.).15 F/F2 10\n/Times-Italic@0 SF .009(The option 'b' adds \\214les without .inf)4.919 F\n(\\214le)144 132 Q F0(\\(setting load/e)2.68 E -.15(xe)-.15 G 2.5(ca).15 G\n(ddresses to 0\\).)-2.5 E F1(\\255d <disk image> {list})108 148.8 Q F0 .47\n(delete the list of \\214les from the disk image.)144 160.8 R(NO)5.47 E\n.47(TE: \\214les without a bbcdir are assumed to ha)-.4 F .77 -.15(ve t)\n-.2 H(he).15 E(root dir)144 172.8 Q 2.5(,e)-.4 G\n(g. ELITE is assumed to be $.ELITE)-2.65 E F1\n(\\255interss \\(sd,dd\\) <image_0> <image_1> <image_2>)108 189.6 Q F0\n(interlea)144 201.6 Q -.15(ve)-.2 G 2.5(ss).15 G\n(ingle sided disk images image_0 and image_1 to image_2.)-2.5 E F1\n(\\255splitds \\(sd,dd\\) <image>)108 218.4 Q F0 .184(splits interlea)144\n230.4 R -.15(ve)-.2 G 2.684(dd).15 G .185\n(isk image image to image.0 & image.1. The ne)-2.684 F 2.685(wn)-.25 G\n.185(ames are made by appending)-2.685 F(.0 and .1.)144 242.4 Q F1\n(\\255ddos2dfs <ddos disk image>)108 259.2 Q F0 4.096\n(splits a single sided DDOS diskdump into se)144 271.2 R -.15(ve)-.25 G\n4.096(ral DFS disk images.).15 F 4.096(Eg. my\\214les.dd >)9.096 F\n(my\\214lesA.bbc,..., my\\214lesH.bbc. The ne)144 283.2 Q 2.5(wn)-.25 G\n(ames are made by appending .A ... .H)-2.5 E F1(\\255w62dfs \\214le[.ext])\n108 300 Q F0 .191(splits a single sided w)144 312 R .191(atford 62 \\214\\\nle disk image into 2 DFS disk images \\(one image if there are less)-.1 F\n(than 32 \\214les on the image\\) \\214le.w1 & \\214le.w2.)144 324 Q F1\n(\\255x {list})108 352.8 Q F0(xbeeb con)144 364.8 Q -.15(ve)-.4 G\n(rsion of archi).15 E .3 -.15(ve \\214)-.25 H(les in the list.).15 E F1\n(\\255s[#] <\\214le>)108 381.6 Q F0 .59(splits a te)144 393.6 R .59(xt \\\n\\214le with \\214le information similar to a DFS catalogue, into .inf \\\n\\214les. Lines not starting)-.15 F .39\n(with a bbc \\(DFS\\) \\214le name \\(i.e. dir)144 405.6 R .39\n(.name\\) are skipped. The option # remo)-.55 F -.15(ve)-.15 G 2.89(st)\n.15 G .39(he DFS directory $)-2.89 F\n(and glues others to the \\214le name. This can be used to mak)144 417.6\nQ 2.5(ea)-.1 G(rchi)-2.5 E .3 -.15(ve \\214)-.25 H\n(les from an xbeeb directory).15 E(.)-.65 E F1(\\255y {list})108 434.4 Q\nF0 .752(renames archi)144 446.4 R -.15(ve)-.25 G .752\n(/info \\214les to standard format \\(as produced with # in -e\\), add').15\nF 3.252(sc)-.55 G(rc')-3.252 E 3.252(si)-.55 G 3.251(fn)-3.252 G .751\n(ot found,)-3.251 F(checks crc')144 458.4 Q 2.5(si)-.55 G 2.5(ff)-2.5 G\n(ound.)-2.5 E F1(\\255icr)108 475.2 Q 2.5(c{)-.18 G(list})-2.5 E F0\n(check crc')144 487.2 Q 2.5(so)-.55 G 2.5(fg)-2.5 G -2.15 -.25(iv e)-2.5\nH 2.5(na).25 G(rchi)-2.5 E .3 -.15(ve \\214)-.25 H(les.).15 E F1(\\255xcr)\n108 504 Q(c)-.18 E F0(check crc')12.16 E 2.5(so)-.55 G 2.5(fX)-2.5 G\n(beeb \\214les?)-2.5 E F1<ad56>108 520.8 Q F0(print v)23.08 E(ersion no.)\n-.15 E F1<ad48>108 537.6 Q F0(help \\(command o)22.52 E -.15(ve)-.15 G\n(rvie).15 E(w\\).)-.25 E/F3 10.95/Times-Bold@0 SF(CURRENT VERSION)72\n578.4 Q F0(1.0)110.5 590.4 Q F3(NO)72 619.2 Q(TES)-.438 E F0(1. options\\\n and \\214les can be entered after starting the programs for all options\\\n that do not require a \\214le list.)108 631.2 Q\n(2. for option -d and -e with a list:)108 655.2 Q\n(2.1 wildcards are not possible)113 667.2 Q(2.2 names are case sensiti)\n113 679.2 Q -.15(ve)-.25 G(.).15 E .77(3. \\(see also 2\\) se)108 703.2 R\n-.15(ve)-.25 G .77(ral \\214les in a disk image can ha).15 F 1.07 -.15\n(ve t)-.2 H .77(he same name when using -a \\(actually useful to get).15\nF(things back to a beeb, no need to rename\\).)108 715.2 Q -1.11(Ve)72\n768 S(rsion 1.0.1)1.11 E 2.5(1S)124.84 G(ept 1996 - 16 April 2017)-2.5 E\n(2)172.89 E 0 Cg EP\n%%Page: 3 3\n%%BeginPageSetup\nBP\n%%EndPageSetup\n/F0 10/Times-Roman@0 SF 178.725(bbcim\\(1\\) Utilities bbcim\\(1\\))72 48 R\n/F1 10.95/Times-Bold@0 SF(POSSIBLE FEA)72 84 Q(TURES OF LA)-1.04 E\n(TER VERSIONS:)-1.04 E/F2 10/Times-Bold@0 SF(-e with suboption r)108 96\nQ F0(should suboption ')144 108 Q(r' remo)-.5 E .3 -.15(ve t)-.15 H\n(he e).15 E(xtracted \\214les? \\(using -d\\))-.15 E F2(-id)108 124.8 Q F0\n.313(identify diskformat \\(single/doublesided, dfs/ddos\\). It')24.33 F\n2.812(sn)-.55 G .312(ot possible to do this foolproof so I'm not)-2.812\nF(sure.)144 136.8 Q F2(-r)108 153.6 Q(en)-.18 E F0\n(rename a \\214le in a diskimage.)18.41 E F2(-boot <bootoption>)108 170.4\nQ F0(Set the bootoption \\(to one of: none, LO)144 182.4 Q(AD, R)-.35 E\n(UN, EXEC\\))-.4 E F2(-sect <nn>: custom disksize \\(f)108 199.2 Q\n(or DDOS\\))-.25 E F0 .503\n(See the website mentioned at the end of this document, for later v)108\n228 R .504(ersions of bbcim. This 1.0 v)-.15 F .504(ersion is the)-.15 F\n.951(\\214nal v)108 240 R .951\n(ersion of the older 0.95b5 and has been updated to \\214x a fe)-.15 F\n3.45(wb)-.25 G .95(ugs and cleanup the documentation,)-3.65 F .345\n(esp. the current email address and website, b)108 252 R .346\n(ut it will not be enhanced with ne)-.2 F 2.846(wf)-.25 G .346\n(eatures. F)-2.846 F .346(or those see the)-.15 F\n(later branch 1.1 which is less well tested b)108 264 Q\n(ut has some neat impro)-.2 E -.15(ve)-.15 G(ments.).15 E F1\n(DESCRIPTION OF THE ARCHIVE FORMA)72 304.8 Q(T)-1.04 E F0\n(I.e. the standard format for/of \\214les in the BBC micro archi)108\n316.8 Q .3 -.15(ve o)-.25 H 2.5(fs).15 G(oftw)-2.5 E(are on my website.)\n-.1 E 2.57([N)108 340.8 S 2.57(.B. At)-2.57 F 2.57(the time)2.57 F .07\n(of writing)2.57 F .07(this do)5.07 F 2.57(wn \\(1997\\),)-.25 F .07\n(my BBC)2.57 F(archi)5.07 E .37 -.15(ve o)-.25 H 2.57(fs).15 G(oftw)\n-2.57 E .07(are w)-.1 F 2.57(as almost)-.1 F .07(all the softw)2.57 F\n(are)-.1 E .428(for the BBC)108 352.8 R .429(micro a)5.429 F -.25(va)-.2\nG .429(ilable on the internet \\(Robert).25 F(Schmidt')5.429 E 2.929(sa)\n-.55 G(rchi)-2.929 E .729 -.15(ve w)-.25 H .429(as mostly a).05 F .429\n(mirror of what I put)5.429 F .316(up\\), and I)108 364.8 R -.1(wa)5.316\nG .315(nted to get rid of diskimages so).1 F .315\n(you could pick and choose softw)5.315 F .315(are to put into a)-.1 F\n.315(disk your)5.315 F(-)-.2 E(self. So, ')108 376.8 Q(the archi)-.18 E\n-.15(ve)-.25 G 2.5('w).15 G(as my archi)-2.6 E .3 -.15(ve o)-.25 H 2.5\n(fB).15 G(BC softw)-2.5 E(are. ])-.1 E 1.088\n(Complementing the bare bbc \\214le)108 400.8 R F2($.ELITE)3.589 E F0\n1.089(is the info \\214le)3.589 F F2($.ELITE.inf)3.589 E F0 3.589(,at)\n3.589 G -.15(ex)-3.589 G 3.589<748c>.15 G 1.089(le containing '$.ELITE)\n-3.589 F(FF0E00 FF8023 Lock)108 412.8 Q(ed CRC=XXXX NEXT $.ELITE2')-.1 E\n.28(The name $.ELITE in the info \\214le is optional b)108 436.8 R .279\n(ut if present the \\214les may be renamed to say a and a.inf and)-.2 F\n($.ELITE is then the real \\214lename.)108 448.8 Q 4.587(AC)108 472.8 S\n2.087(RC is included for v)-4.587 F 2.087\n(arious reasons \\(to check \\214lecon)-.25 F -.15(ve)-.4 G 2.087\n(rsion softw).15 F 2.088(are, serial- or disk- \\214le transfer)-.1 F\n.605(to/from a bbc, etc.\\) The CRC is calculated with the algorithm fro\\\nm the BBC user guide p. 399 \\(The same)108 484.8 R\n(algorithm as used in the cassettte and rom \\214ling system\\).)108 496.8\nQ .744(NEXT may be used for CHAIN\"\" or *R)108 532.8 R .744\n(UN as used on cassette systems. Cassette names are translated to)-.4 F\n.048($.cassette_name, \\(i.e. max 12 chars\\), otherwise a tape identi\\\n\\214er w)108 544.8 R .048(ould be needed \\(e.g. T)-.1 F .048\n(APE= at the start of)-.93 F(the info \\214le\\))108 556.8 Q\n(\\214le length may be included \\(after the e)108 580.8 Q -.15(xe)-.15 G\n(cution address\\) b).15 E(ut is unnecessary)-.2 E(.)-.65 E 1.483\n(i.e.: [T)108 604.8 R 1.483\n(APE=tfs_\\214lename / dfs_\\214lename] loadaddress e)-.93 F -.15(xe)-.15\nG 3.984(ca).15 G 1.484(ddress [lock)-3.984 F 1.484\n(ed] crc=xxxx [NEXT name]] as)-.1 F 1.198(tape emulation is only implem\\\nented by 6502em \\(with custom cassette formats?\\))108 616.8 R 1.197\n(and as custom cassette)6.198 F .459(formats should)108 628.8 R .459\n(be possible \\(e)5.459 F .459(g. ELITE, FOR)-.15 F .459\n(TRESS\\), the tape section is mostly irrele)-.6 F -.25(va)-.25 G .46\n(nt for the moment).25 F(\\(useful for preserv)108 640.8 Q\n(ation of real names though\\).)-.25 E F1 -.11(BU)72 693.6 S(GS).11 E F0\n(hmm, none? ;-\\))108 705.6 Q -1.11(Ve)72 768 S(rsion 1.0.1)1.11 E 2.5\n(1S)124.84 G(ept 1996 - 16 April 2017)-2.5 E(3)172.89 E 0 Cg EP\n%%Page: 4 4\n%%BeginPageSetup\nBP\n%%EndPageSetup\n/F0 10/Times-Roman@0 SF 178.725(bbcim\\(1\\) Utilities bbcim\\(1\\))72 48 R\n/F1 10.95/Times-Bold@0 SF -.548(AU)72 84 S(THOR).548 E F0 -.8(Wo)108 96\nS(uter Scholten \\(swhs-web@xs4all.nl\\)).8 E -.8(We)108 120 S 2.5(bp).8 G\n(age: http://w)-2.5 E(outer)-.1 E(.bbcmicro.net/)-.55 E -1.11(Ve)72 768\nS(rsion 1.0.1)1.11 E 2.5(1S)124.84 G(ept 1996 - 16 April 2017)-2.5 E(4)\n172.89 E 0 Cg EP\n%%Trailer\nend\n%%EOF\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/archief.c",
    "content": "/* archief.c, Copyright (c) W.H.Scholten 1996-2014, 2017\n * Deel van bbcim >=0.80\n * cleans up the info file and renames (should rename be optional?)\n *last update 23/6/96.\n */\n\nvoid cleanup(int argc, char *argv[], int options) {\n\tFILE *fpadd, *fpinfo;\n\tchar infofile[256];\n\tunsigned long loadaddress, execaddress;\n\tint  addfiles,l, antwoord;\n\tchar bbcfile_naam[13], unix_bbcfile_naam[13], nieuwe_info[256];\n\tchar nieuwe_naam[256];\n\tchar rest_string[256];\n\tint  found, len_s, i;\n\tunsigned int crc;\n\n/* archive file conversion without list not implemented:\n//   if ((argc-options)<3)\n//    {\n//     #ifdef MESSAGES_NL\n//     printf(\"Naam van het om te zetten archief bestand?\");\n//     #else\n//     printf(\"Name of the archive file to be ?\");\n//     #endif\n//     scanf(\"%50s\", addfile);\n//     } else strcpy(addfile, argv[2+options]);\n*/\n\n\tif ((argc-options) < 2) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Geen lijst van archief bestanden meegegeven\\n\");\n#else\n\t\tprintf(\"No archive file list given\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\n\n\tfor(addfiles=2; addfiles<argc; addfiles++) {\n\n\n\t\t/*.inf bestanden overslaan:*/\n\t\tl=strlen(argv[addfiles]);\n\t\tif (l>4) {\n\t\t\tif (!strncmp(argv[addfiles]+l-4,\".inf\",4))\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tstrcpy(infofile,argv[addfiles]);\n\t\tstrcat(infofile,\".inf\");\n\n\n\n\t\t/* BESTAAT HET INFO BESTAND? */\n\t\tfpinfo=fopen(infofile, \"r\");\n\t\tif (fpinfo==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Info bestand %s kan niet geopend worden, sla over\\n\", infofile);\n#else\n\t\t\tprintf(\"Info file %s cannot be opened, skipping file\\n\", infofile);\n#endif\n\t\t\tcontinue;\n\t\t}\n\n\n\t\t/* BESTAAT HET ARCHIEF BESTAND? */\n\t\tfpadd=fopen(argv[addfiles], \"rb\");\n\t\tif (fpadd==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Archief bestand %s kan niet geopend worden\\n\", argv[addfiles]);\n#else\n\t\t\tprintf(\"Archive file %s cannot be opened\\n\", argv[addfiles]);\n#endif\n\t\t\tcontinue;\n\t\t}\n\t\tfclose(fpadd);\n\n\t\t/* UIT HET inf BESTAND (EVT) DE BESTANDSNAAM HALEN. */\n#if 0 \n\t\tfscanf(fpinfo,\"%12s %lx %lx\", bbcfile_naam, &loadaddress, &execaddress);\n\n\t\tfseek(fpinfo,0L,0);\n\t\tfgets(rest_string, 99, fpinfo);\n\t\tfclose(fpinfo);\n\n\t\tbbcfile_naam[9]=0;\n\n\t\tif (bbcfile_naam[1]!='.') {\n\t\t\tstrcpy(bbcfile_naam, argv[addfiles]);\n\t\t\tfseek(fpinfo, 0L, SEEK_SET);\n\t\t\tfscanf(fpinfo,\"%lx %lx\", &loadaddress, &execaddress);\n\t\t}\n#else\n\t\tfscanf(fpinfo,\"%12s\", bbcfile_naam);\n\t\tif (bbcfile_naam[1]!='.') {\n\t\t\tstrncpy(bbcfile_naam, argv[addfiles],12);\n\t\t\tfseek(fpinfo, 0L, SEEK_SET);\n\t\t}\n\t\tbbcfile_naam[9]=0;\n\t\tfscanf(fpinfo,\"%lx %lx\", &loadaddress, &execaddress);\n\n\t\tfgets(rest_string, 99, fpinfo);\n\t\tfclose(fpinfo);\n#endif\n\n\t\treduceer_unix_naam(unix_bbcfile_naam, bbcfile_naam);\n\n\t\t/* HERNOEMEN ETC ALS NAAM AL BESTAAT */\n\t\tstrcpy(nieuwe_naam, unix_bbcfile_naam);\n\n\t\tif (strcmp(argv[addfiles], unix_bbcfile_naam)) {\n\t\t\tif ((fpadd=fopen(unix_bbcfile_naam, \"rb\"))!=NULL) {\n\t\t\t\tfclose(fpadd);\n\t\t\t\tantwoord=overschrijf_vraag(argv[addfiles], nieuwe_naam);\n\n\t\t\t\tswitch(antwoord) {\n\n\t\t\t\tcase OVERSCHRIJVEN:\n\t\t\t\t\trename(argv[addfiles], unix_bbcfile_naam); break;\n\n\t\t\t\tcase HERNOEM_NIEUW:\n\t\t\t\t\tstrcpy(unix_bbcfile_naam, nieuwe_naam);\n\t\t\t\t\trename(argv[addfiles], unix_bbcfile_naam); break;\n\n\t\t\t\tcase HERNOEM_BESTAAND:\n\t\t\t\t\trename(unix_bbcfile_naam, nieuwe_naam);\n\t\t\t\t\tstrcat(nieuwe_naam, \".inf\"); rename(infofile, nieuwe_naam);\n\t\t\t\t\trename(argv[addfiles], unix_bbcfile_naam); break;\n\n\t\t\t\tcase SLA_OVER: continue;\n\t\t\t\t} /*switch*/\n\n\t\t\t}\n\t\t\telse\n\t\t\t\trename(argv[addfiles], unix_bbcfile_naam);\n\t\t} /*if*/\n\n\t\tstrcpy(nieuwe_info,unix_bbcfile_naam); strcat(nieuwe_info,\".inf\");\n\n\n\n\t\tfound=0;\n\t\tlen_s=strlen(rest_string);\n\t\tprintf(\"Bestand %-9s (%-9s) CRC \", argv[addfiles], bbcfile_naam);\n\t\tfor (i=0; i<len_s-4; i++) {\n\t\t\tif (!strncmp(rest_string+i,\"CRC=\",4)) {\n\t\t\t\tfound=1;\n\t\t\t\tsscanf(rest_string+i+4, \" %x\", &crc);\n\t\t\t\tif (crc!=fcrc(unix_bbcfile_naam)) {\n#ifdef MESSAGES_NL\n\t\t\t\t\tprintf(\"fout, gevonden: %X\", crc);\n\t\t\t\t\tcrc=fcrc(unix_bbcfile_naam);\n\t\t\t\t\tprintf(\", berekend: %X\", crc);\n#else\n\t\t\t\t\tprintf(\"wrong, found: %X\", crc);\n\t\t\t\t\tcrc=fcrc(unix_bbcfile_naam);\n\t\t\t\t\tprintf(\", calculated: %X\", crc);\n#endif\n\t\t\t\t}\n\n#ifdef MESSAGES_NL\n\t\t\t\telse printf(\"in orde\");\n#else\n\t\t\t\telse printf(\"in orde\");\n#endif\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t/*CRC toevoegen, alleen als er nog geen was: */\n\t\tif (!found) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"toegevoegd\");\n#else\n\t\t\tprintf(\"added\");\n#endif\n\t\t\tcrc=fcrc(unix_bbcfile_naam);\n\t\t}\n\t\tremove(infofile);\n\n\t\tfpinfo=fopen(nieuwe_info,\"w\");\n\t\tfprintf(fpinfo, \"%-9s %6lX %6lX  CRC=%4X\", bbcfile_naam, loadaddress, execaddress, (unsigned int) crc);\n\t\tfclose(fpinfo);\n\n\n\t\t/* Did the name actually change? */\n\t\tif (strcmp(argv[addfiles], unix_bbcfile_naam)) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\", hernoemd tot %s\\n\", unix_bbcfile_naam);\n#else\n\t\t\tprintf(\", renamed to %s\\n\", unix_bbcfile_naam);\n#endif\n\t\t}\n\t\telse printf(\"\\n\");\n\t} /* for */\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/bbc_crc.c",
    "content": "/* bbc_crc.c,  Copyright (C) W.H.Scholten 1996-2014\n *\n * check/make 16 bit CRCs of files, see the BBC micro user guide p.399\n *\n * Laatste verandering 30-6-96\n *\n * Part of bbcim.\n */\n\nunsigned int fcrc(char *bestand) {\n\tunsigned long length=0;\n\tunsigned char byte;\n\tFILE *fp;\n\n\tunsigned int crc=0;\n\tint k;\n\n\n\tlength=0; crc=0;\n\n\tfp=fopen(bestand,\"rb\");\n\n\tif (fp==NULL) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Bestand %s kan niet geopend worden\\n\", bestand);\n#else\n\t\tprintf(\"File %s couldn't be opened\\n\", bestand);\n#endif\n\n\t\treturn crc;\n\t}\n\n\twhile (1) {\n\t\tif (!fread(&byte,1,1,fp)) break;\n\t\t/* if (feof(fp)) break; */\n\t\tlength++;\n\t\tcrc ^=(byte << 8);\n\t\tfor(k=0; k<8; k++) {\n\t\t\tif (crc & 32768) crc=(((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\telse crc <<= 1;\n\t\t}\n\t}\n\tfclose(fp);\n\n\treturn crc;\n}\n\n\n\n\n\n\n\n/* CRC controle voor archief formaat */\nvoid icrc(int argc, char *argv[], int options) {\n\tFILE *fparchive, *fpinfo;\n\tchar infofile[100];\n\tint  archivefile,l, found, len_s, i;\n\tchar bbc_naam[12];\n\n\tchar read_line[100];\n\tunsigned int crc;\n\n\n\n/* Niet gebruikt: (CRC zonder lijst bestanden niet geimplementeerd)\n   if ((argc-options)<3){\n   #ifdef MESSAGES_NL\n   printf(\"Naam van het te controleren archief bestand?\");\n   #else\n   printf(\"Name of the archive file to be checked?\");\n   #endif\n   scanf(\"%50s\", archivefile);\n   } else strcpy(archivefile, argv[2+options]);\n*/\n\n\n\tif ((argc-options)<2) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Geen lijst van archief bestanden meegegeven\\n\");\n#else\n\t\tprintf(\"No archive file list given\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\n\n\tfor(archivefile=2; archivefile<argc; archivefile++) {\n\n\n\t\t/* .inf bestanden overslaan: */\n\t\tl=strlen(argv[archivefile]);\n\t\tif (l>4)\n\t\t\tif (!strncmp(argv[archivefile]+l-4,\".inf\",4)) continue;\n\n\t\tstrcpy(infofile,argv[archivefile]);\n\t\tstrcat(infofile,\".inf\");\n\n\n\n\t\t/* Bestaat het info bestand? */\n\t\tfpinfo=fopen(infofile, \"r\");\n\t\tif (fpinfo==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Info bestand %s kan niet geopend worden, sla over\\n\", infofile);\n#else\n\t\t\tprintf(\"Info file %s cannot be opened, skipping file\\n\", infofile);\n#endif\n\t\t\tcontinue;\n\t\t}\n\n\n\t\t/* Bestaat het archief bestand? */\n\t\tfparchive=fopen(argv[archivefile], \"rb\");\n\t\tif (fparchive==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Archief bestand %s kan niet geopend worden\\n\", argv[archivefile]);\n#else\n\t\t\tprintf(\"Archive file %s cannot be opened\\n\", argv[archivefile]);\n#endif\n\t\t\tcontinue;\n\t\t}\n\t\tfclose(fparchive);\n\n\n\t\t/* uit het .inf bestand de bestandsnaam halen. */\n\t\tfscanf(fpinfo,\"%12s\", bbc_naam);\n\t\tif (bbc_naam[1]!='.') strncpy(bbc_naam, argv[archivefile],12);\n\t\tbbc_naam[9]=0;\n\n\t\t/* CRC zoeken */\n\t\tfseek(fpinfo,0L,0);\n\t\tfgets(read_line, 99, fpinfo);\n\n\t\tfound=0;\n\t\tlen_s=strlen(read_line);\n\t\tprintf(\"bestand %-9s (%-9s) CRC \", argv[archivefile],bbc_naam);\n\t\tfor (i=0; i<len_s-4; i++) {\n\t\t\tif (!strncmp(read_line+i,\"CRC=\",4)) {\n\t\t\t\tfound=1;\n\t\t\t\tfseek(fpinfo, i+4L,0); fscanf(fpinfo, \"%x\", &crc);\n\t\t\t\tif (crc!=fcrc(argv[archivefile])) {\n#ifdef MESSAGES_NL\n\t\t\t\t\tprintf(\"fout, gevonden: %4X\", crc);\n#else\n\t\t\t\t\tprintf(\"wrong, found: %4X\", crc);\n#endif\n\t\t\t\t\tcrc=fcrc(argv[archivefile]);\n\n#ifdef MESSAGES_NL\n\t\t\t\t\tprintf(\", berekend: %4X\\n\", crc);\n#else\n\t\t\t\t\tprintf(\", calculated: %4X\\n\", crc);\n#endif\n\t\t\t\t}\n\t\t\t\telse printf(\"in orde\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!found) printf(\"ontbreekt\\n\");\n\n\t\tfclose(fpinfo);\n\t} /*FOR */\n}\n\n\n\n\n\n\n/* Controleer CRC's in __CATALOG__ ($.ELITE 00E00 FF8023 ... CRC=xxxx) */\nvoid xcrc(int argc, char *argv[], int options) {\n\tFILE *fpcat;\n\tunsigned int crc;\n\tint found, len_s, i;\n\n\tchar bbc_file[15], read_line[100];\n\n\n\tfpcat=fopen(\"__CATALOG__\", \"r\");\n\tif (fpcat==NULL) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"__CATALOG__ kon niet geopend worden\\n\");\n#else\n\t\tprintf(\"__CATALOG__ couldn't be opened\\n\");\n#endif\n\t\texit (1);\n\t}\n\n\twhile (1) {\n\t\tif (fgets(read_line, 99, fpcat)==NULL) break;\n\t\tif (read_line[1]=='.') {\n\t\t\tstrncpy(bbc_file, read_line, 9); bbc_file[9]=0;\n\t\t\t/* Spaties aan einde weghalen */\n\t\t\tfor (i=8;i>0;i--) {\n\t\t\t\tif (bbc_file[i]!=' ') break;\n\t\t\t\tbbc_file[i]=0;\n\t\t\t}\n\n\t\t\tfound=0;\n\t\t\tlen_s=strlen(read_line);\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"bestand %-9s CRC \", bbc_file);\n\t\t\tfor (i=0; i<len_s-4; i++) {\n\t\t\t\tif (!strncmp(read_line+i,\"CRC=\",4)) {\n\t\t\t\t\tfound=1;\n\t\t\t\t\tsscanf(read_line+i+4L, \"%x\", &crc);\n\t\t\t\t\tif (crc!=fcrc(bbc_file)) {\n\t\t\t\t\t\tprintf(\"fout, gevonden: %4X\", crc);\n\t\t\t\t\t\tcrc=fcrc(bbc_file);\n\t\t\t\t\t\tprintf(\", berekend: %4X\\n\", crc);\n\t\t\t\t\t}\n\t\t\t\t\telse printf(\"in orde\\n\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found) printf(\"ontbreekt\\n\");\n#else\n\t\t\tprintf(\"file %-9s CRC \", bbc_file);\n\t\t\tfor (i=0; i<len_s-4; i++) {\n\t\t\t\tif (!strncmp(read_line+i,\"CRC=\",4)) {\n\t\t\t\t\tfound=1;\n\t\t\t\t\tsscanf(read_line+i+4L, \"%x\", &crc);\n\t\t\t\t\tif (crc!=fcrc(bbc_file)) {\n\t\t\t\t\t\tprintf(\"wrong, found: %4X\", crc);\n\t\t\t\t\t\tcrc=fcrc(bbc_file);\n\t\t\t\t\t\tprintf(\", calculated: %4X\\n\", crc);\n\t\t\t\t\t}\n\t\t\t\t\telse printf(\"all right\\n\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found) printf(\"missing\\n\");\n#endif\n\t\t}\n\t} /*while*/   \n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/bbcim.c",
    "content": "/*\n// bbcim.c (bbc disk image manipulation):\n//\n//    Diskimage manipulation for single density Acorn DFS, Watford DFS 62 file,\n//    Double density extensions and much more.\n//\n// Copyright (c) W.H. Scholten 1996, 1997, 2009, 2014, 2017\n//\n// Permission to use, copy, modify, distribute, and sell this software\n// and its documentation for any purpose is hereby granted without fee,\n// provided that the above copyright notice appear in all copies and\n// that both that copyright notice and this permission notice appear in\n// supporting documentation, and that the name of the copyright holder\n// not be used in advertising or publicity pertaining to distribution\n// of the software without specific, written prior permission. The\n// copyright holder makes no representations about the suitability of\n// this software for any purpose. It is provided \"as is\" without express\n// or implied warranty.\n//\n// THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n// SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n// SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n// RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n// CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n//\n//\n// Send comments and bug-reports to:\n//\n//    swhs-web@xs4all.nl\n//\n*/\n\n/* Overview of changes in bbcim:\n   The first bbcim version was 0.60 (I think) in 1996, a combination of seperate programs I put on my webpages\n   in 1995 and 1996 (my website was at that time at: http://www.cistron.nl/~wouters/)\n\n   Changes in 0.83 (from 0.70):\n   +  xcrc implemented\n   +  -ed may work on a mac (LET ME KNOW): uncomment #define MAC\n   +  -e options now in any order\n   +  -e, -x and -y: if a file exists, you can choose whether to overwrite or rename.\n   c  seeks immediately before read/write in add-loop, otherwise segmentation faults sometimes (bug in GCC?).\n   c  fixed small mistake in xcrc.\n\n   Changes in 0.91 (from 0.83):\n   +  'use' added.\n   +  -s file overwrite choice.\n   +  -e file {list}\n\n   c  -x : rename file to itself fixed (no overwrite question)\n   c  -xcrc: filenames < 7 char's now OK.\n   c  -s : L before load address (as in xbeeb's __CATALOG__) is now acceptable.\n\n   Changes in 0.92:\n   +  -ab : adds bare files, otherwise info file is used by default.\n   c : -e; b->s, info file is now added by default, b=bare.\n\n   Changes in 0.93-beta (9-3-97):\n   + code cleaned up with explicit type conversions\n   + added code to replace characters in filenames (usually not needed in linux); e.g. '/' gives problems.\n   + Help in english\n\n   Changes in 0.94-beta (16-3-97):\n   c w62 conversion now included in bbcim.\n\n\n   Changes in 0.95-beta (30-6-97 - 4-7-97):\n   c w62 conversion: if there are less than 32 files, only one diskimage is made.\n   c disknames without a . didn't extract with -ed (as the dir name was equal to the diskimage name). Added a rename.\n   c cleaned up 'mkdir' selection. You now have 3 choices.\n   + Config additions: bbcim now compiles on other OS'es without changes.\n   c bugfix: -s# works again (no idea when it got broken).\n\n\n   Bugs and 'features':\n   - several files in a diskimage can have the same name (can be useful)\n   (i.e. -a doesn't overwrite)\n   - -e: name checking in diskimage is case dependant.\n\n   If in doubt: it's not a bug, it is a feature!\n\n   0.95-beta6 (20-4-2009):\n   c various message/documentation cleanups and references to the new webpages, some fixes for newer compilers, etc.:\n   + Makefile added\n   c naming scheme as in bbcim 0.105. No more removal of a file extension to be replaced by a new one, which was\n     useful for DOS. E.g. 'bbcim -ed alpha.ssd' puts files in a directory 'alpha.ssd.d/'. bbcim -e alpha.ssd gives names\n     such as alpha.ssd.$.!BOOT\n   c source code indentation cleanups (from old gnu style 2-spaces to 1 tab) and some message changes.\n\n   0.95-beta7 (21-4-2009):\n   c -splitds checks for the correct density (sectors/track) argument.\n\n   0.95-beta8 (3-5-2009):\n   c small improvements to the man page and cleanup of the source code (all re-indented with tabs).\n   c Makefile target 'install' also includes 'all' so 'make install' works if you haven't done a 'make' first.\n\n   0.95-beta9 (6-5-2009):\n   c small source cleanups.\n\n   0.95-beta10 (14-5-2009):\n   c a few changes using string literals in fprintf as suggested by clang's output.\n\n   0.95-beta11 (21-5-2009):\n   c a few changes in the Makefile. Installation locations are now local in $(HOME)/bin/ and $(HOME)/man/man1/\n\n   1.0 (26-1-2014):\n   c Put the source code files into a directory src/\n   c Added a note about the experimental branch (renamed the latest version at this time from 0.107 to 1.1) in the man page.\n   c Changed the define NL to MESSAGES_NL in case you want the text output in Dutch.\n   c Licence is now MIT type, so basically you can do what you want with the software. See doc/LICENCE.\n   c Cleaned up some of the comments in the code and translated a few from Dutch to English.\n   c Before an error print the BBCIM version number and website.\n   c Changed the version number from 0.95b11 to 1.0\n\n   1.0.1 (16-4-2017):\n   c support long filenames (up to 255 chars)\n*/\n\n\n#define VERSION \"1.0.1 (16 April 2017)\"\n\n\n\n/*************** CONFIGURATION *********************/\n/* Set this define for Dutch messages: */\n/*#define MESSAGES_NL*/\n\n#define UNIX_MKDIR\n\n/* Make directory: UNIX_MKDIR, MAC_MKDIR, or SYSTEM_MKDIR (using system(\"mkdir..\"); ) */\n\n\n/* #define NO_COMMAND_LINE */\n/* If you can't give parameters on the command line use this (this was meant, in 1997) for Macs. However\n   now that Macs use a unix-like system with terminals available, this may be useless. */\n\n\n/* Characters to be replaced in filenames (on the host system, not the original BBC filenames in the .inf files):\n   Most filing systems can't handle all characters from bbc filenames (esp. '/' and '\\'). Replacing them\n   and a few more to make it easier seems prudent :)\n\n   Add whatever you need for your system.\n*/\n\nchar filenamechar_bad[]     = { '\\\\', '/', ':', '*', '?', '\\\"', '<', '>', '|', '`', '\\'' };\nchar filenamechar_replace[] = { '_' , '_', '_', '_', '_', '_' , '_', '_', '_', '_', '_'  };\n\n\n\n/************ END OF CONFIGURATION ***********************/\n\n\n\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef MAC_MKDIR\n#include <unix.h>\n#endif\n\n#ifdef UNIX_MKDIR\n#include <sys/stat.h>\n// #include <fcntl.h>\n// #include <unistd.h>\n#endif\n\n#ifdef SYSTEM_MKDIR\n#endif\n\n/* Should use this in various places:\n   #include <sys/stat.h>\n   struct stat file_stat;\n   if (stat(filename, file_stat)<0) perror(\"can't open file\\n\");\n*/\n\n\n\n/* Defines */\n/* Byte offsets in disk image */\n#define DFStitle0_7    0\n#define DFStitle8_11   256\n#define DFSaccessct    (256+4)\n#define DFSentries     (256+5)\n#define DFSbootsec     (256+6)\n#define DFSsectondiskL (256+7)\n\n/*next offsets +n*8 for each file */\n#define DFSfilename    8\n#define DFSdirectory   0x0f\n#define DFSloadaddrL   (256+8)\n#define DFSloadaddrM   (256+9)\n#define DFSexecaddrL   (256+0x0a)\n#define DFSexecaddrM   (256+0x0b)\n#define DFSlengthL     (256+0x0c)\n#define DFSlengthM     (256+0x0d)\n#define DFSeellddss    (256+0x0e)\n#define DFSstartsecL   (256+0x0f)\n\n\n\n\n\n\n/* Prototypes: */\nint  rename_sequential(char *naam);\nint  overschrijf_vraag(char *oude_naam, char *nieuwe_naam);\n\n\nvoid cleanup(int argc, char *argv[], int options);\nunsigned int fcrc(char *bestand);\nvoid icrc(int argc, char *argv[], int options);\nvoid xcrc(int argc, char *argv[], int options);\n\nvoid ddos2dfs(int argc, char *argv[], int options);\nvoid add_to_image(char *disk, int options, int argc, char *argv[], int remove_file, int use_infofiles);\nvoid del_from_image(int argc, char *argv[], int options);\nvoid expand_image(char *disk, int expand);\nvoid interss(int argc, char *argv[], int options);\nvoid splitds(int argc, char *argv[], int options);\nvoid minimise_image(char *disk);\nvoid new_image(char *disk, unsigned int size);\nvoid split_cat(int argc, char *argv[],int options, char *optread_line);\nint  w62dfs(int argc, char *argv[], int options);\nvoid xbeeb(int argc, char *argv[], int options);\n\n\n/* NB invoer en bbcnaam mogen niet zelfde string zijn */\n/*\n  void invoer_naar_bbcnaam(char *invoer, char *bbcnaam) {\n  if (invoer[1]=='.')\n  strncpy(bbcnaam, invoer,9);\n  else {\n  bbcnaam[0]='$'; bbcnaam[1]='.'; strncpy(bbcnaam+2, invoer, 7);\n  }\n  bbcnaam[9]=0;\n  }\n*/\n\nvoid reduceer_unix_naam(char *unixnaam, char *bbcnaam);\n\n\nvoid reduceer_unix_naam(char *unixnaam, char *bbcnaam) {\n\tif (bbcnaam[0]=='$')\n\t\tstrcpy(unixnaam,bbcnaam+2);\n\telse {\n\t\tunixnaam[0]=bbcnaam[0];\n\t\tstrcpy(unixnaam+1,bbcnaam+2);\n\t}\n}\n\n\n\n#include \"overschrijf.c\"\n\n#include \"nieuw_diskb.c\"\n#include \"diskb_add.c\"\n#include \"diskb_del.c\"\n#include \"expand_im.c\"\n#include \"minimaliseer.c\"\n\n#include \"intersplits.c\"\n#include \"ddos2dfs.c\"\n#include \"w62.c\"\n\n#include \"splits_cat.c\"\n#include \"bbc_crc.c\"\n#include \"xbeeb.c\"\n#include \"archief.c\"\n\n\nint  filenamechar_no=sizeof(filenamechar_bad)/sizeof(char);\t/* number of char's to be checked for replacement */\n\nvoid print_version(void);\nvoid use(void);\n\n\n\n\nvoid print_version(void) {\n\tprintf(\"\\nbbcim \"VERSION\" (C) W.H.Scholten 1996-2014 (http://wouter.bbcmicro.net/)\\n\");\n}\n\n\nvoid use(void) {\n\tprint_version();\n#ifdef MESSAGES_NL\n\tprintf(\"Opties: -e[s/d,#,b,r] -a[b,r] -d -c -crc -min -40/80/max\\n\" \\\n\t\t   \"        -y -icrc -s[#]\\n\" \\\n\t\t   \"        -x -xcrc\\n\" \\\n\t\t   \"        -splitds -interss -ddos2dfs -w62dfs\\n\" \\\n\t\t   \"        -V -H\\n\"\n\t\t   \"Doe bbcim -H voor nadere informatie of zie de 'man' pagina\\n\"\n\t\t);\n#else\n\tprintf(\"Options: -e[s/d,#,b,r] -a[b,r] -d -c -crc -min -40/80/max\\n\" \\\n\t\t   \"        -y -icrc -s[#]\\n\" \\\n\t\t   \"        -x -xcrc\\n\" \\\n\t\t   \"        -splitds -interss -ddos2dfs -w62dfs\\n\" \\\n\t\t   \"        -V -H\\n\"\n\t\t   \"Try bbcim -H for more information or see the man page\\n\"\n\t\t);\n#endif\n}\n\n\n\nint main(int argc, char *argv[]) {\n\tFILE *fpdisk, *fpcat, *fpextract, *fpinfo;\n\tchar disk[256], catalogus[256], extract[256], info_naam[256], basisnaam[256];\n\tchar bbcdisk_naam[15], bbcfile_naam[15];\n\tchar unix_bbcfile_naam[15];\n\tchar testnaam[15];\n\tchar optstring[20];\n\n\tunsigned char byte,H;\n\n\tlong filesizesum=0;\n\n\tint extr=0, extr_dir=0, cat=0, expand=0, min=0, bcrc=0, short_name=0;\n\tint add=0, info=0 /* don't use info files */, no_bbc_dir=0, remove_file=0, remove_disk=0;\n\tint extr_list=0;\n\n\tint bad_option=1;\n\tint options=1;\n\n\tint i, j, rfiles, bootoption, antwoord, k;\n\tunsigned char files=0;\n\tunsigned int sectorsondisk;\n\tlong file;\n\tint locked;\n\tunsigned char eellddss; \n\n\tlong startsector;\n\tunsigned long loadaddress, execaddress, length;\n\n\tunsigned int crc;\n\n#ifdef UNIX_MKDIR\n\tmode_t dir_mode;\n#endif\n\n#if defined(MAC_MKDIR) || defined(SYSTEM_MKDIR)\n\tchar actie[256];\n#endif\n\n#ifdef NO_COMMAND_LINE\n\targc=1;\n#endif\n\n\n\tif (argc < 2) {\n\t\tchar optstring2 [ 21 ];\n\t\tprint_version();\n\n#ifdef MESSAGES_NL\n\t\tprintf(\"Interactive modus (meer informatie over de opties: bbcim -H of zie de man pagina)\\n\");\n\t\tprintf(\"Welke optie?\");\n#else\n\t\tprintf(\"Interactive mode (for more information on the options: bbcim -H or see the man page)\\n\");\n\t\tprintf(\"Which option?\");\n#endif\n\t\tscanf(\"%20s\", optstring2);\n\t\tif (optstring2[0]=='-') strcpy(optstring, optstring2);\n\t\telse { strcpy(optstring, \"-\"); strcat(optstring, optstring2); }\n\n\t\toptions=0;\n\t}\n\telse strcpy(optstring, argv[1]);\n\n\n\n\t/* 1e selectie */\n\tif (!strcmp(optstring,\"-V\")){\n\t\tprint_version();\n\t\texit(0);\n\t}\n\n\tif (!strcmp(optstring,\"-H\")) {\n#define CONSOLE_INVERT        \"\\033[7m\"\n#define CONSOLE_RESTORE       \"\\033[m\"\n#ifdef MESSAGES_NL\n\t\tprintf(\"bbcim \"VERSION\"\\nCommando overzicht:\\n\" \\\n\t\t\t   \" -c <diskbeeld> : toon bestanden in diskbeeld\\n\" \\\n\n\t\t\t   \" -e[s/d,#,b,r] <diskbeeld> [{lijst}]: bestanden uit diskbeeld halen\\n\" \\\n\t\t\t   \" -a[b,r] <diskbeeld> {lijst} : bestanden in diskbeeld plaatsen\\n\" \\\n\t\t\t   \" -d <diskbeeld> {lijst} : verwijder bestanden uit diskbeeld\\n\" \\\n\t\t\t   \" -40/-80/-max <diskbeeld> : wijzig grootte van diskbeeld\\n\" \\\n\t\t\t   \" -min <diskbeeld> : minimaliseer diskbeeld\\n\" \\\n\t\t\t   \" -crc <diskbeeld> : bereken CRC's van bestanden in diskbeeld\\n\" \\\n\n\t\t\t   \" -y {lijst} : archief bestanden bijwerken\\n\" \\\n\t\t\t   \" -s[#] <bestand> : splits DFS catalogue-achtig tekst bestand in .inf bestanden\\n\" \\\n\t\t\t   \" -x {lijst} : archief bestanden omzetten naar xbeeb formaat\\n\" \\\n\n\t\t\t   \" -icrc {lijst} : controleer CRC's van archief bestanden\\n\"\\\n\t\t\t   \" -xcrc : controleer CRC's in xbeeb dir (de huidige dir)\\n\"\\\n\n\t\t\t   \" -interss (sd/dd) <B0> <B1> <B2> : combineer 2 enkelzijdige diskbeelden to 1 dubbelzijdig diskbeeld (B0+B1 -> B2)\\n\"\\\n\t\t\t   \" -splitds (sd/dd) <B> : splits een dubbelzijdig diskbeeld naar 2 enkelzijdige diskbeelden\\n\"\\\n\n\t\t\t   \" -ddos2dfs <ddos diskbeeld> : splits enkelzijdig DDOS diskbeeld in DFS diskbeelden\\n\"\\\n\t\t\t   \" -w62dfs <watford 62 bestands beeld> : splits een watford 62 bestanden diskbeeld in 2 DFS diskbeelden\\n\"\\\n\n\t\t\t   \" -V : toon versie\\n\"\n\t\t\t   CONSOLE_INVERT\"Zie http://wouter.bbcmicro.net/ voor de nieuwste versie van bbcim.\\n\"CONSOLE_RESTORE\n\t\t\t);\n#else\n\t\tprintf(\"bbcim \"VERSION\"\\nCommand overview:\\n\" \\\n\t\t\t   \" -c <disk image> : show files in disk image\\n\" \\\n\n\t\t\t   \" -e[s/d,#,b,r] <disk image> [{list}]: extract files from disk image\\n\" \\\n\t\t\t   \" -a[b,r] <disk image> {list} : put files in disk image\\n\" \\\n\t\t\t   \" -d <disk image> {list} : remove files from disk image\\n\" \\\n\t\t\t   \" -40/-80/-max <disk image> : change size of disk image\\n\" \\\n\t\t\t   \" -min <disk image> : minimise disk image\\n\" \\\n\t\t\t   \" -crc <disk image> : calculate CRC's of files in disk image\\n\" \\\n\n\t\t\t   \" -y {list} : cleanup archive file information\\n\" \\\n\t\t\t   \" -s[#] <file> : split a DFS catalogue-like text file in .inf files\\n\" \\\n\t\t\t   \" -x {list} : convert archive files to xbeeb format\\n\" \\\n\n\t\t\t   \" -icrc {list} : check CRC's of archive files\\n\"\\\n\t\t\t   \" -xcrc : check CRC's in xbeeb dir (the current dir)\\n\"\\\n\n\t\t\t   \" -interss (sd/dd) B0 B1 B2 : combine 2 single sided disk images to a double sided disk image (B0+B1 -> B2)\\n\"\\\n\t\t\t   \" -splitds (sd/dd) B : split a double sided disk image into 2 single sided disk images\\n\"\\\n\n\t\t\t   \" -ddos2dfs <ddos image> : split a single sided DDOS disk image into DFS disk images\\n\"\\\n\t\t\t   \" -w62dfs <watford 62 file image> : split a watford 62 file disk image into 2 DFS disk images\\n\"\\\n\n\t\t\t   \" -V : show version\\n\"\n\t\t\t   CONSOLE_INVERT\"See http://wouter.bbcmicro.net/ for the latest version of bbcim.\\n\"CONSOLE_RESTORE\n\t );\n#endif\n\t\texit(0);\n\t}\n\n\tif (!strcmp(optstring,\"-interss\")) {interss(argc, argv, options); exit(0);}\n\tif (!strcmp(optstring,\"-splitds\")) {splitds(argc, argv, options); exit(0);}\n\tif (!strcmp(optstring,\"-ddos2dfs\")) {ddos2dfs(argc, argv, options); exit(0);}\n\tif (!strcmp(optstring,\"-w62dfs\")) {w62dfs(argc, argv, options); exit(0);}\n\tif (!strcmp(optstring,\"-d\")) {del_from_image(argc, argv, options); exit(0);}\n\tif (!strncmp(optstring,\"-s\",2)) {split_cat(argc, argv, options, optstring); exit(0);}\n\tif (!strcmp(optstring,\"-x\")) {xbeeb(argc, argv, options); exit(0);}\n\tif (!strcmp(optstring,\"-y\")) {cleanup(argc, argv, options); exit(0);}\n\tif (!strcmp(optstring,\"-icrc\")) {icrc(argc, argv, options); exit(0);}\n\tif (!strcmp(optstring,\"-xcrc\")) {xcrc(argc, argv, options); exit(0);}\n\n\n\n\n\t/* Bekijk nu de resterende opties */\n\tif (!strcmp(optstring,\"-c\")) {\n\t\tcat=1;\n\t\tbad_option=0;\n\t}\n\n\tif (!strncmp(optstring,\"-e\", 2)) {\n\t\textr=1;\n\t\tbad_option=0;\n\t\tinfo=1;\n\t\tfor (i=2; i<strlen(optstring); i++) {\n\t\t\tswitch (optstring[i]) {\n\t\t\tcase 'd' : extr_dir=1; break;\n\t\t\tcase 's' : short_name=1; break;\n\t\t\tcase 'b' : info=0; break;\n\t\t\tcase '#' : no_bbc_dir=1; break;\n\t\t\tcase 'r' : remove_disk=1; break;\n\t\t\tdefault : bad_option=1;\n\t\t\t}\n\t\t\tif (short_name & extr_dir) {\n#ifdef MESSAGES_NL\n\t\t\t\tfprintf(stderr, \"sd = slechte optie\\n\");\n#else\n\t\t\t\tfprintf(stderr, \"sd = bad option\\n\");\n#endif\n\t\t\t\texit(1);\n\t\t\t}\n\t\t} /*for*/\n\t}\n\n\n\tif (!strcmp(optstring,\"-crc\")) {bcrc=1; cat=1; bad_option=0;}\n\tif (!strcmp(optstring,\"-40\"))  {expand=40*10; bad_option=0;}\n\tif (!strcmp(optstring,\"-80\"))  {expand=80*10; bad_option=0;}\n\tif (!strcmp(optstring,\"-max\")) {expand=1023;  bad_option=0;}\n\tif (!strcmp(optstring,\"-min\")) {min=1; \tbad_option=0;}\n\n\tif (!strncmp(optstring,\"-a\", 2)) {\n\t\tadd=1;\n\t\tbad_option=0;\n\t\tinfo=1;\n\t\tfor (i=2; i<strlen(optstring); i++) {\n\t\t\tswitch (optstring[i]) {\n\t\t\tcase 'r' : remove_file=1; break;\n\t\t\tcase 'b' : info=0; break;\n\t\t\tdefault  : bad_option=1;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tif (!strcmp(optstring,\"-new\")) {\n\t\tbad_option=0;\n\t}\n\n\t/* Einde opties */\n\n\tif (bad_option) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Slechte optie\\n\");\n#else\n\t\tprintf(\"Bad option\\n\");\n#endif\n\t\tuse();\n\t\texit(1);\n\t}\n\n\tif ((argc-options)<2) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Naam van het bbc diskbeeld?\");\n#else\n\t\tprintf(\"Name of the bbc disk image?\");\n#endif\n\t\tscanf(\"%250s\", disk);\n\t} else {\n\t\tstrncpy(disk, argv[1+options], 250);\n\t\tdisk[250]=0;\n\t}\n\n\tfprintf(stderr, \"Disk=%s\\n\", disk);\n\t/* NU UITVOEREN VAN DE OPTIE:*/\n\n\t/* Make empty disk image.................. */\n\tif (!strcmp(optstring,\"-new\")) {\n\t\tnew_image(disk, 800);\n\t\texit(0);\n\t}\n\n\n\tstrcpy(basisnaam, disk);\n/*\tbasisnaam[strcspn(disk,\".\")]=0; */ /* At some time this was useful for DOS, irrrelevant in 2009. */\n\tstrcpy(catalogus, basisnaam);\n\tstrcat(catalogus,\".cat\");\n \n\n\n\tfpdisk=fopen(disk,\"rb\");\n\n\n\n\t/* Add files to disk image...............\n\t   Only for add the disk image doesn't need to exist yet */\n\tif (add) {\n\t\tif (fpdisk==NULL) {\n\t\t\tnew_image(disk, 800); /*DEFAULT size=80 track*/\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Nieuw diskbeeld gemaakt\\n\");\n#else\n\t\t\tprintf(\"New disk image made\\n\");\n#endif\n\t\t}\n\t\telse fclose(fpdisk);\n\n\t\tadd_to_image(disk, options, argc,  argv, remove_file, info);\n\t\texit(0);\n\t}\n\t/* end of add-files.............. */\n\n\n\n\t/* For other options the disk image must exist */\n\tif (fpdisk==NULL) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Bestand %s is niet te openen\\n\",disk);\n#else\n\t\tprintf(\"File %s cannot be opened\\n\",disk);\n#endif\n\t\texit(1);\n\t}\n\n\tif (extr_dir) {\n\t\tstrcat(basisnaam, \".d\"); /* as in experimental branch of bbcim, 0.105 and later */\n\n\t\trename_sequential(basisnaam); /* in case a file (dir too?)  already exists named basis_naam */\n#ifdef MAC_MKDIR\n\t\tstrcpy(actie, \":\"); /* Might need to be \"volume:\" where volume is ? */\n\t\tstrcat(actie, basisnaam);\n\t\tmkdir(actie,0);\n#endif\n#ifdef UNIX_MKDIR\n\t\tdir_mode=0777; /* CHANGE */\n\t\tmkdir(basisnaam, dir_mode);\n#endif\n#ifdef SYSTEM_MKDIR\n\t\tsprintf(actie, \"mkdir %s\", basisnaam);\n\t\tsystem(actie);\n#endif\n\t}\n\n#ifdef DEBUG\n\tif (no_bbc_dir) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"geen bbc dir\\n\");\n#else\n\t\tprintf(\"no bbcdir\\n\");\n#endif\n\t}\n#endif\n\n\n\t/* Expand diskbeeld ................. */\n\tif (expand) {\n\t\tfclose(fpdisk);\n\t\texpand_image(disk,expand);\n\t\texit(0);\n\t}\n\n \n\n\n\t/* CRC, CAT, Extract, Minimise ................*/\n\n\t/* Only do something if the disk image has more than 2 sectors */\n\tfseek(fpdisk,0L, SEEK_END);\n\tif (ftell(fpdisk)<512) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"niets op het diskbeeld\\n\");\n#else\n\t\tprintf(\"nothing on the disk image\\n\");\n#endif\n\n\t\texit(1);\n\t}\n\n\t/* Minimise */\n\tif (min) {\n\t\tfclose(fpdisk); minimise_image(disk);\n\t\texit(0);\n\t}\n\n\n\t/* Determine disk name (voor cat, crc, extract) */\n\tfseek(fpdisk,0L,SEEK_SET);\n\tfor (i=0; i<8; i++) {\n\t\tfread (&byte,1,1,fpdisk);\n\t\tbbcdisk_naam[i]=byte;\n\t\tif (byte==0) break;\n\t}\n\tfseek(fpdisk,256L,SEEK_SET);\n\tfor (i=0; i<4; i++) {\n\t\tfread (&byte,1,1,fpdisk);\n\t\tbbcdisk_naam[i+8]=byte;\n\t\tif (byte==0) break;\n\t}\n\n\n\n\n\n\n\tfseek(fpdisk,256+5L,SEEK_SET);\n\tfread(&files,1,1,fpdisk);\n\n\n\t/* Sanity check on disk image: */\n\tif (files % 8) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"corrupt diskbeeld (bestand-aantal byte)\\n\");\n#else\n\t\tprintf(\"bad disk image (fileno byte)\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\n\trfiles=files/8;\n\textr_list=(extr && (argc-options>2));\n\n\n\tfread(&byte,1,1,fpdisk);\n\tbootoption=byte >> 4;\n\tH=byte & 3;\n\tfread(&byte,1,1,fpdisk);\n\tsectorsondisk=byte+H*256L;\n\n\n\tif (extr && !extr_list) fpcat=fopen(catalogus,\"w\"); else fpcat=stdout;\n\n\t/*if (extr_list) fpcat=NULL;*/\n\n\tif (extr_list) goto skip_diskinfo;\n\n#ifdef MESSAGES_NL\n\tfprintf(fpcat,\"\\nDiskette :%s\",bbcdisk_naam);\n\tif (strlen(bbcdisk_naam)==0) fprintf(fpcat, \"(geen naam)\");\n\tfprintf(fpcat,\"\\n%d sectoren op de diskette\\n\",sectorsondisk);\n#else\n\tfprintf(fpcat,\"\\nDisk :%s\",bbcdisk_naam);\n\tif (strlen(bbcdisk_naam)==0) fprintf(fpcat, \"(no name)\");\n\tfprintf(fpcat,\"\\n%d sectors on disk\\n\",sectorsondisk);\n#endif\n\n#ifdef MESSAGES_NL\n\tfprintf(fpcat, \"bootoptie: \");\n#else\n\tfprintf(fpcat, \"bootoption: \");\n#endif\n\n\tswitch(bootoption) {\n\tcase 0 :\n#ifdef MESSAGES_NL\n\t\tfprintf(fpcat, \"geen\");\n#else\n\t\tfprintf(fpcat, \"none\");\n#endif\n\t\tbreak;\n\tcase 1 : fprintf(fpcat, \"*LOAD !BOOT\");break;\n\tcase 2 : fprintf(fpcat, \"*RUN !BOOT\");break;\n\tcase 3 : fprintf(fpcat, \"*EXEC !BOOT\");\n\t}\n\tfprintf(fpcat,\"\\n\");\n\n#ifdef MESSAGES_NL\n\tfprintf(fpcat, \"Bestand    Laad  Start  Lengte Toegang startsector\\n\");\n#else\n\tfprintf(fpcat, \"File       Load   Exec  Length Access  startsector\\n\");\n#endif\n\n\n  skip_diskinfo:\n\n\t/* Main loop: find all files */\n\tif (files>0) {\n\n\t\tint extr_list_no=0;\n\n\t\tfor(file=0;file<files; file +=8) {\n\n\t\t\tstrcpy(extract, basisnaam);\n\t\t\tif (extr_dir) strcat(extract,\"/\"); else strcat(extract,\".\");\n\n\t\t\tif (short_name) extract[0]=0;\n\n\t\t\tfseek(fpdisk,file+15L,SEEK_SET);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tlocked=byte >>7;\n\t\t\tbbcfile_naam[0]=(byte & 0x7F);\n\t\t\tbbcfile_naam[1]='.';\n    \n\n\t\t\tfseek(fpdisk,file+8L,SEEK_SET);\n/*    for(i=0; i<7; i++) {\n\t  fread(&byte,1,1,fpdisk);\n\t  bbcfile_naam[i+2]=byte;\n      }\n*/\n\t\t\tfread(bbcfile_naam+2,1,7,fpdisk);\n\t\t\tbbcfile_naam[9]=0;\n\n\n\t\t\t/* spaties aan het einde van bbc naam weghalen: geeft anders bestands namen\n\t\t\t   met spaties (in linux). */\n\t\t\tfor (i=8;i>0 && (bbcfile_naam[i]==' '); i--);\n\t\t\tbbcfile_naam[i+1]=0;\n\n#if DEBUG\n\t\t\tprintf(bbcfile_naam);\n#endif\n\n\t\t\t/* If a file list is given, see if the name is in the disk image */\n\t\t\tif (extr_list) {\n\t\t\t\tint found=0;\n\t\t\t\tfor (i=options+2; i<argc;i++) {\n\t\t\t\t\tif (argv[i][1]=='.')\n\t\t\t\t\t\tstrncpy(testnaam, argv[i],9);\n\t\t\t\t\telse {\n\t\t\t\t\t\ttestnaam[0]='$'; testnaam[1]='.';\n\t\t\t\t\t\tstrncpy(testnaam+2, argv[i],7);\n\t\t\t\t\t}\n\t\t\t\t\ttestnaam[9]=0;\n\t\t\t\t\tif (!strcmp(bbcfile_naam, testnaam)) found=1;\n\t\t\t\t}\n\t\t\t\tif (!found) continue;\n\t\t\t\textr_list_no++;\n\t\t\t}\n\n\n\n\n\n\n\n\n\t\t\t/* load/exec  adressen + lengte bepalen */\n\t\t\tfseek(fpdisk,256+file+14,SEEK_SET);\n\n\t\t\tfread(&eellddss,1,1,fpdisk);\n\n\t\t\t/* Start sector */\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tstartsector=byte+(eellddss & 3)*256L;\n\n\t\t\t/* Sanity check on diskimage? (check that startsec>1, but this disallows viewing dos cat of\n\t\t\t   vol 0A with standard dfs routines. */\n\n\n\t\t\t/* Load address */\n\t\t\tfseek(fpdisk,file+256L+8L,0);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tfread(&H,1,1,fpdisk);\n\t\t\tloadaddress=H*256L+byte+(eellddss & 0x0C)*16384L;\n\t\t\tif (loadaddress & 0x30000) loadaddress |=0xFF0000;\n\n\t\t\t/* Exec address */\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tfread(&H,1,1,fpdisk);\n\t\t\texecaddress=H*256L+byte+(eellddss & 0xC0)*4L*256L;\n\t\t\tif (execaddress & 0x30000) execaddress |=0xFF0000;\n\n\t\t\t/* File length */\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tfread(&H,1,1,fpdisk);\n\t\t\tlength=H*256L+byte+(eellddss & 0x30)*16L*256L;\n\n\t\t\tfilesizesum +=length;\n\n\n\t\t\t/* Uitvoer van deze gegevens naar catalogus */\n\t\t\tif (!extr_list) {\n\t\t\t\tfprintf(fpcat,\"%-9s %6lX %6lX %6lX\", bbcfile_naam, loadaddress, execaddress, length);\n\t\t\t\tif (locked) fprintf(fpcat,\" Locked\");\n\t\t\t\telse        fprintf(fpcat,\"       \"); /* Voor crc uitlijnen */\n\t\t\t}\n\n\t\t\tstrcpy(unix_bbcfile_naam, bbcfile_naam);\n\n\t\t\t/* Name check: replace certain characters in filenames (most filesystems can't\n\t\t\t   handle all characters from bbc filenames) */\n\t\t\tfor (i=0; i<filenamechar_no; i++) {\n\t\t\t\tfor (j=0; j<strlen(unix_bbcfile_naam); j++) {\n\t\t\t\t\tif (unix_bbcfile_naam[j]==filenamechar_bad[i])\n\t\t\t\t\t\tunix_bbcfile_naam[j]=filenamechar_replace[i];\n\t\t\t\t}\n\t\t\t}\n\n\n\n\t\t\tif (no_bbc_dir){\n/*      if (bbcfile_naam[0]=='$') strcat(extract, unix_bbcfile_naam+2);\n\t\telse {\n\t\tbbcfile_naam[1]=bbcfile_naam[0]; strcat(extract, unix_bbcfile_naam+1);\n\t\t}\n*/\n\t\t\t\treduceer_unix_naam(extract+strlen(extract), unix_bbcfile_naam);\n\t\t\t}\n\t\t\telse strcat(extract, unix_bbcfile_naam);\n\n\t\t\tif (extr) {\n\n\t\t\t\t/* Name check: does it already exist? */\n\t\t\t\tchar nieuwe_naam[55];\n\n\t\t\t\tstrcpy(nieuwe_naam, extract);\n\t\t\t\tif ((fpextract=fopen(extract, \"rb\"))!=NULL) {\n\t\t\t\t\tfclose(fpextract);\n\t\t\t\t\tantwoord=overschrijf_vraag(extract, nieuwe_naam);\n\n\t\t\t\t\tswitch(antwoord) {\n\t\t\t\t\tcase OVERSCHRIJVEN:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase HERNOEM_NIEUW:\n\t\t\t\t\t\tstrcpy(extract, nieuwe_naam); break;\n\t\t\t\t\tcase HERNOEM_BESTAAND:\n\t\t\t\t\t\trename(extract, nieuwe_naam);\n\t\t\t\t\t\t/* altijd ook info bestand hernoemen: */\n\t\t\t\t\t\tstrcpy(info_naam, extract); strcat(info_naam, \".inf\");\n\t\t\t\t\t\tstrcat(nieuwe_naam, \".inf\"); rename(info_naam, nieuwe_naam);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase SLA_OVER:\n\t\t\t\t\t\tcontinue; /*to for*/\n\t\t\t\t\t} /*switch */\n\t\t\t\t}\n\t\t\t\t/* End of name check */\n\n\n\t\t\t\tfpextract=fopen(extract, \"wb\");\n\n\t\t\t\tfseek(fpdisk,startsector*256, SEEK_SET);\n\t\t\t\tfor (i=0; i<length; i++) {\n\t\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\t\tif (feof(fpdisk)) {\n#ifdef MESSAGES_NL\n\t\t\t\t\t\tprintf(\"onverwacht einde van het diskbeeld\" \\\n\t\t\t\t\t\t\t   \" bij bestand %s\\n\", bbcfile_naam);\n#else\n\t\t\t\t\t\tprintf(\"unexpected end of the disk image\" \\\n\t\t\t\t\t\t\t   \" at file %s\\n\", bbcfile_naam);\n#endif\n\t\t\t\t\t\texit(1);\n\t\t\t\t\t}\n\t\t\t\t\tfwrite(&byte,1,1,fpextract);\n\t\t\t\t}\n\t\t\t\tfclose(fpextract);\n\t\t\t}\n\n\n\t\t\tif (info) {\n\t\t\t\tstrcpy(info_naam, extract);\n\t\t\t\tstrcat(info_naam, \".inf\");\n\n\t\t\t\tfpinfo=fopen(info_naam, \"w\");\n\t\t\t\tif (fpinfo ==NULL) {\n\t\t\t\t\tfprintf(stderr, \"can't write to %s\\n\", info_naam);\n\t\t\t\t\texit(1);\n\t\t\t\t}\n\n\t\t\t\t/* Evt volgende regel weg. (FILENAAM, bv $.ELITE) */\n\t\t\t\tfprintf(fpinfo, \"%-9s\", bbcfile_naam);\n\n\t\t\t\t/* I no longer include the (superfluous) file length in the INFO file. */\n\t\t\t\tfprintf(fpinfo,\" %6lX %6lX\", loadaddress, execaddress);\n\n\t\t\t\tif (locked) fprintf(fpinfo,\" Locked\");\n\n\t\t\t} /*N.B. info bestand wordt in crc deel gesloten*/\n\n\n\t\t\tcrc=0;\n\t\t\tif (bcrc || info) {\n\t\t\t\tfseek(fpdisk,startsector*256, SEEK_SET);\n\t\t\t\tfor (i=0; i<length; i++) {\n\t\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\t\tif (feof(fpdisk)) {\n#ifdef MESSAGES_NL\n\t\t\t\t\t\tprintf(\"onverwacht einde van het diskbeeld\" \\\n\t\t\t\t\t\t\t   \" bij bestand %s\\n\", bbcfile_naam);\n#else\n\t\t\t\t\t\tprintf(\"unexpected end of the disk image\" \\\n\t\t\t\t\t\t\t   \" at file %s\\n\", bbcfile_naam);\n#endif\n\t\t\t\t\t\texit(1);\n\t\t\t\t\t}\n\n\t\t\t\t\tcrc ^=(byte << 8);\n\t\t\t\t\tfor(k=0;k<8;k++) {\n\t\t\t\t\t\tif (crc & 32768)\n\t\t\t\t\t\t\tcrc=(((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcrc =crc <<1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (info) {\n\t\t\t\t\tfprintf(fpinfo, \" CRC=%04X\", crc); fclose(fpinfo);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (extr_list)\n\t\t\t\tprintf(\" %s\\n\",extract);\n\t\t\telse\n\t\t\t\tfprintf(fpcat,\"   %4d\", (int) startsector);\n\n\t\t\tif (bcrc)\n\t\t\t\tfprintf(fpcat, \"       CRC= %04X\\n\", crc);\n\t\t\telse\n\t\t\t\tfprintf(fpcat, \"\\n\");\n\t\t}\n\n\t\t/* Show no of (extracted) files */\n\t\tif (extr_list){\n\t\t\trfiles=extr_list_no;\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"aantal bestanden: %d\\n\",rfiles);\n#else\n\t\t\tprintf(\"number of files: %d\\n\",rfiles);\n#endif\n\t\t}\n#ifdef MESSAGES_NL\n\t\tfprintf(fpcat,\"\\n%d bestand%s\\n\", rfiles, (rfiles !=1) ? \"en\" : \"\");\n#else\n\t\tfprintf(fpcat,\"\\n%d file%s\\n\", rfiles, (rfiles !=1) ? \"s\" : \"\");\n#endif\n\n\n\t\tfclose(fpdisk);\n\t\tif (remove_disk && !extr_list) remove(disk);\n\t}\n#ifdef MESSAGES_NL\n\tfprintf(fpcat,\"Totaal %ld bytes\\n\", filesizesum);\n#else\n\tfprintf(fpcat,\"Total %ld bytes\\n\",  filesizesum);\n#endif\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/ddos2dfs.c",
    "content": "/* ddos2dfs.c, Copyright (c) W.H. Scholten 1996, 2014, 2017\n *\n * Split DDOS disk images into separate Acorn DFS disk images\n *\n * 14-5-1996, Deel van bbcim >=0.70\n */\n\n\n#ifdef MESSAGES_NL\n#define fout byte=ddos_no+65; printf(\"onverwacht einde van het diskbeeld\" \\\n\t\t\t\t\t\t\t\t\t \" bij ddos drive %c \",byte);\n#else\n#define fout byte=ddos_no+65; printf(\"Unexpected end of DDOS disk image\" \\\n\t\t\t\t\t\t\t\t\t \" at ddos drive %c \",byte);\n#endif\n\n\n\nvoid ddos2dfs(int argc, char *argv[], int options) {\n\tFILE *fpdfs, *fpdisk;\n\tchar  dfs_image[256], disk[256], basisnaam[256];\n\tunsigned char byte=0,H=0;\n\tlong ddos_no, i, sectors_on_volume, length;\n\tint  starttrack, startsector, l;\n\n\tif (argc-options==1) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Naam van het DD bbc diskbeeld?\");\n#else\n\t\tprintf(\"Name of the DD bbc disk image?\");\n#endif\n\t\tscanf(\"%50s\", disk);\n\t}\n\telse strcpy(disk, argv[2]);\n\n\n\tstrcpy(basisnaam, disk);\n\tl=strlen(disk);\n\tif (!strcmp(disk+l-3,\".dd\"))\n\t\tbasisnaam[l-3]=0;\n\n\n\tfpdisk=fopen(disk,\"rb\");\n\n\tif (fpdisk==NULL) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Bestand  %s is niet te openen\\n\", disk);\n#else\n\t\tprintf(\"File %s cannot be opened\\n\", disk);\n#endif\n\t\texit(1);\n\t}\n\t/* bestand_open_fout(disk); */\n\n\n\t/* Hoofdlus: alle catalogi */\n\tfor (ddos_no=0; ddos_no<8; ddos_no++) {\n\t\tfseek(fpdisk,16*256L+8L+2*ddos_no,SEEK_SET);\n\t\tfread(&byte,1,1,fpdisk);\n\t\tstarttrack=byte;\n\n\t\tif (starttrack !=0) {\n\t\t\tstrcpy(dfs_image, basisnaam);\n\t\t\tbyte=ddos_no+65;\n\t\t\tl=strlen(basisnaam);\n\t\t\tdfs_image[l]=byte;\n\t\t\tstrcpy(dfs_image+l+1, \".bbc\");\n\n\t\t\t/* Nu een test of er ueberhaupt iets op de DDOS catalogus staat: */\n\t\t\tfseek(fpdisk, (ddos_no*2+1)*256+5, SEEK_SET);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tif (byte==0) {\n\t\t\t\tbyte=65+ddos_no;\n\t\t\t\tprintf(\" Catalogus %c is leeg\\n\", byte);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t/* (dus geen lege diskbeelden) */\n\n\t\t\tprintf(\"%s\\n\",dfs_image);\n\n\t\t\t/* Uitvoer bestand openen. */\n\t\t\tfpdfs=fopen(dfs_image, \"wb\");\n\n\t\t\tfseek(fpdisk, (ddos_no*2+1)*256+6, SEEK_SET);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tH=byte & 0x03;\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t/*long*/ sectors_on_volume=byte+H*256;\n\n\t\t\t/*long*/ length=sectors_on_volume*256;\n\n\t\t\t/* First sector & second sector: */\n\t\t\tfseek(fpdisk, (ddos_no*2+0)*256, SEEK_SET);\n\t\t\tfor(i=0; i<512; i++) {\n\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\tif (feof(fpdisk)) {\n\t\t\t\t\tfout\n\t\t\t\t\t\texit(1);\n\t\t\t\t}\n\t\t\t\tfwrite(&byte,1,1,fpdfs);\n\t\t\t}\n\n\t\t\t/* In the second sector, adjust the sector start addresses. */\n\t\t\t/* NB: mag voor allemaal?? (ook als bv 2 best. gebruikt?) Denk wel. */\n\t\t\tfor(i=0; i<31; i++) {\n\t\t\t\tfseek(fpdisk, (ddos_no*2+1)*256+14L+i*8, SEEK_SET);\n\t\t\t\tfseek(fpdfs, 256L+i*8+14, SEEK_SET);\n\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\tH=byte;\n/*  printf(\"H=%X\",H); */\n\t\t\t\tfread(&byte,1,1,fpdisk);\n/* printf(\"byte=%X\",byte); */\n\t\t\t\tstartsector=byte+H*256+2;\n\t\t\t\tH=startsector >>8;\n\t\t\t\tbyte=startsector & 0xFF;\n\t\t\t\tfwrite(&H,1,1,fpdfs);\n\t\t\t\tfwrite(&byte,1,1,fpdfs);\n\t\t\t}\n\n\t\t\t/* Nu de rest: */\n\t\t\tfseek(fpdisk,starttrack*18*256, SEEK_SET);\n\t\t\tfor (i=0; i<length; i++) {\n\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\tif (feof(fpdisk)) {\n\t\t\t\t\tfout\n\t\t\t\t\t\texit(1);\n\t\t\t\t}\n\n\t\t\t\tfwrite(&byte,1,1,fpdfs);\n\t\t\t}\n\t\t\tfclose(fpdfs);\n\t\t}\n\t}\n\tprintf(\"\\n\");\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/diskb_add.c",
    "content": "/* diskb_add.c, Copyright (C) W.H.Scholten 1996, 2014, 2017\n *\n * Put files into a disk image\n * \n * part of bbcim.\n */\n\n\nvoid add_to_image(char *disk, int options, int argc, char *argv[], int remove_file, int use_infofiles) {\n\tFILE *fpdisk, *fpinfo, *fpadd;\n\tunsigned char byte,H;\n\tchar infofile[256];\n\tchar bbcfile_naam[15];\n\tunsigned char afiles=0;\n\tint  addfiles;\n\tunsigned long loadaddress, execaddress;\n\tchar read_line[256];\n\tint  l,i, len_s;\n\tlong startsector, length;\n\tunsigned char eellddss, locked;\n\tunsigned int  sectorsondisk;\n\n\tfpdisk=fopen(disk,\"rb+\");\n\n/* Adding files without command line list not implemented\n//   if ((argc-options)<3)\n//    {\n//     #ifdef MESSAGES_NL\n//     printf(\"Naam van het toe te voegen archief bestand?\");\n//     #else\n//     printf(\"Name of the archive file to be added?\");\n//     #endif\n//     scanf(\"%50s\", addfile);\n//     } else {strcpy(addfile, argv[2+options]); options +=1;}\n*/\n\n\tif ((argc-options)<3) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Geen lijst van toe te voegen bestanden meegegeven\\n\");\n#else\n\t\tprintf(\"No archive file list given\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\n\n\t/* Aantal bestanden (afiles=8*echt aantal): */\n\tfseek(fpdisk,256+5L,SEEK_SET);\n\tfread(&afiles,1,1,fpdisk);\n\n\t/* Nu bestanden toevoegen: */\n\tfor(addfiles=3; addfiles<argc; addfiles++) {\n\t\tif (afiles==31*8) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Er zijn al 31 bestanden op het diskbeeld\\n\");\n#else\n\t\t\tprintf(\"There are already 31 files on the disk image\\n\");\n#endif\n\t\t\texit(1);\n\t\t}\n\n\t\t/* .inf bestanden overslaan: */\n\t\tl=strlen(argv[addfiles]);\n\t\tif (l>4)\n\t\t\tif (!strncmp(argv[addfiles]+l-4,\".inf\",4))\n\t\t\t\tcontinue;\n\n\t\tstrcpy(infofile,argv[addfiles]);\n\t\tstrcat(infofile,\".inf\");\n\n\t\t/* Archief bestand & bijbehorend info bestand moeten bestaan: */\n\t\tfpinfo=NULL;\n\t\tif (use_infofiles) {\n\t\t\tfpinfo=fopen(infofile, \"r\");\n\t\t\tif (fpinfo==NULL) {\n#ifdef MESSAGES_NL\n\t\t\t\tprintf(\"%s: attributenbestand %s kan niet geopend worden. Gebruik -ab om toevoegen te forceren.\\n\", argv[addfiles], infofile);\n#else\n\t\t\t\tprintf(\"%s: attribute file %s cannot be opened. Use -ab to force inclusion of bare files.\\n\", argv[addfiles], infofile);\n#endif\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tfpadd=fopen(argv[addfiles], \"rb\");\n\t\tif (fpadd==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Archief bestand %s kan niet geopend worden\\n\", argv[addfiles]);\n#else\n\t\t\tprintf(\"Archive file %s cannot be opened\\n\", argv[addfiles]);\n#endif\n\t\t\tif (fpinfo)\n\t\t\t\tfclose(fpinfo);\n\t\t\tcontinue;\n\t\t}\n\n\n\n\t\t/* uit het inf bestand de bestandsnaam halen en de adressen. */\n\t\tlocked=0;\n\t\tif (use_infofiles) {\n//      fscanf(fpinfo,\"%12s %x %x\", bbcfile_naam, (int*) &loadaddress, (int*) &execaddress);\n#if 1\n\t\t\tfscanf(fpinfo,\"%12s\", bbcfile_naam);\n\t\t\tif (bbcfile_naam[1]!='.') {\n\t\t\t\tstrncpy(bbcfile_naam, argv[addfiles], 12);\n\t\t\t\tfseek(fpinfo, 0L, SEEK_SET);\n\t\t\t}\n\t\t\tbbcfile_naam[9]=0;\n\t\t\tfscanf(fpinfo,\"%lx %lx\", &loadaddress, &execaddress);\n\n#else\n\t\t\tfscanf(fpinfo,\"%12s %lx %lx\", bbcfile_naam, &loadaddress, &execaddress);\n\t\t\tif (bbcfile_naam[1]!='.') {\n\t\t\t\tstrncpy(bbcfile_naam, argv[addfiles],12);\n\t\t\t\tfseek(fpinfo, 0L, SEEK_SET);\n\t\t\t\tfscanf(fpinfo,\" %lx %lx\", &loadaddress, &execaddress);\n\t\t\t}\n\t\t\tbbcfile_naam[9]=0;\n#endif\n\n\t\t\tfgets(read_line, 99, fpinfo); len_s=strlen(read_line);\n\t\t\tfor (i=0; i<len_s; i++)\n\t\t\t\tif (read_line[i]=='L') {\n\t\t\t\t\tlocked=1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n/*      const int len_locked=6;\n *      for (int i=0; i<len_s-len_locked; i++)\n *        {if (!strncmp(read_line+i, \"Locked\", len_locked))\n *      NOTE: 'Locked' may be abbreviated to 'L': */\n\n\t\t\tfclose(fpinfo);\n\t\t} /* use_infofiles */\n\t\telse {\n\t\t\tloadaddress=0; execaddress=0;\n\t\t\tstrncpy(bbcfile_naam, argv[addfiles],12);\n\t\t\tbbcfile_naam[9]=0;\n\t\t}\n\n\t\t/* Should check that second char is '.' else use $.name */\n\t\tif (bbcfile_naam[1]!='.') {\n\t\t\tfor (i=9; i>=0; i--) bbcfile_naam[i+2]=bbcfile_naam[i];\n\t\t\tbbcfile_naam[0]='$'; bbcfile_naam[1]='.';\n\t\t}\n\t\tbbcfile_naam[9]=0;\n\n\n\t\t/* Get previous startsector and file length */\n\t\tif (afiles) {\n\t\t\tfseek(fpdisk,256L+14L,SEEK_SET);\n\t\t\tfread(&eellddss,1,1,fpdisk);\n\t\t\t/* Start sector */\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tstartsector=byte+(long)(eellddss & 0x3)*256L;\n\n\t\t\t/* File length */\n\t\t\tfseek(fpdisk,256L+12L,SEEK_SET);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tfread(&H,1,1,fpdisk);\n\t\t\tlength=H*256L+byte+(eellddss & 0x30)*16L*256L;\n\n\t\t\tstartsector +=(length +255)>>8;\n\t\t}\n\t\telse startsector=2;\n\n\n\t\t/* Nu testen of bestanden binnen sectors-on-disk blijft: */\n\t\tfseek(fpdisk,256+6L,SEEK_SET);\n\t\tfread(&byte,1,1,fpdisk);\n\t\tH=byte & 3;\n\t\tfread(&byte,1,1,fpdisk);\n\t\tsectorsondisk=byte+H*256L;\n\n\t\tfseek(fpadd, 0L, SEEK_END);\n\t\tlength=ftell(fpadd);\n\n\t\tif (startsector+((length+255)>>8)> sectorsondisk) {\n\t\t\tfclose(fpadd);\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Niet genoeg ruimte op het diskbeeld\\n\");\n#else\n\t\t\tprintf(\"Not enough space on the disk image\\n\");\n#endif\n\t\t\tbreak;\n\t\t}\n\n\n\n\n#ifdef MESSAGES_NL\n\t\tprintf(\"bestand %s toegevoegd\\n\", argv[addfiles]);\n#else\n\t\tprintf(\"adding file %s\\n\", argv[addfiles]);\n#endif\n\n\n/*    fseek(fpadd, 0L, SEEK_SET); */\n/*    fseek(fpdisk,startsector*256L,SEEK_SET); */\n\n\t\t/* Copy file: */\n\t\t{long j;\n\t\t\tfor(j=0; j<(((length+255) >>8)*256); j++) {\n\t\t\t\tfseek(fpadd, j, SEEK_SET);\n\t\t\t\tif (!fread(&byte,1,1,fpadd)) byte=0;\n\n\t\t\t\t/* 2009: This superfluous seek was to prevent segmentation faults (ca. 1996,\n\t\t\t\t * using at that time Linux 1.2.x and gcc 2.7.2 IIRC). I'm keeping it as\n\t\t\t\t * I don't want to change the code. */\n\t\t\t\tfseek(fpdisk,startsector*256L+j,SEEK_SET);\n\t\t\t\tfwrite(&byte,1,1,fpdisk);\n\t\t\t}\n\t\t}\n\n\t\tfclose(fpadd);\n\n\t\tif (remove_file) {\n\t\t\tremove(argv[addfiles]);\n\t\t\tremove(infofile);\n\t\t}\n\n\t\t/* add filename to catalogue */\n\t\t/* Eerst de catalogus ingangen verplaatsen (8 bytes opschuiven) */\n\t\t{\n\t\t\tlong j;\n\t\t\tfor (j=255-8; j>7; j--) {\n\t\t\t\tfseek(fpdisk, j, SEEK_SET);\n\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\tfseek(fpdisk, j+8, SEEK_SET);\n\t\t\t\tfwrite(&byte,1,1,fpdisk);\n\t\t\t\tfseek(fpdisk, j+256L, SEEK_SET);\n\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\tfseek(fpdisk, j+8+256L, SEEK_SET);\n\t\t\t\tfwrite(&byte,1,1,fpdisk);\n\t\t\t}\n\t\t}\n\n\n\n\t\tbyte=bbcfile_naam[0]+(locked<<7);\n\t\tfseek(fpdisk,15L,SEEK_SET);\n\t\tfwrite(&byte,1,1,fpdisk);\n    \n\t\tfseek(fpdisk,8L,SEEK_SET);\n\t\tfor(i=0; i<7; i++) {\n\t\t\tbyte=bbcfile_naam[i+2];\n\t\t\tif (byte==0)\n\t\t\t\t{byte=' '; bbcfile_naam[i+3]=0;}\n\t\t\tfwrite(&byte,1,1,fpdisk);\n\t\t}\n\n\n\n\t\tafiles +=8;\n\t\tfseek(fpdisk,256+5L,SEEK_SET);\n\t\tfwrite(&afiles,1,1,fpdisk);\n\n\n\t\t/* load/exec  adressen + lengte schrijven */\n\t\tfseek(fpdisk,256L+14L,SEEK_SET);\n\t\teellddss=((startsector >>8) & 0x3)+((loadaddress >>14) &0xC);\n\t\teellddss +=((execaddress >>10) &0xC0);\n\t\teellddss +=((length >>12) &0x30);\n\t\tfwrite(&eellddss,1,1,fpdisk);\n\n\t\t/* Start sector */\n\t\tbyte=startsector & 0xFF;\n\t\tfwrite(&byte,1,1,fpdisk);\n\n\n\t\t/* Load address */\n\t\tfseek(fpdisk,256L+8L,0);\n\t\tbyte=loadaddress & 0xFF;\n\t\tH=(loadaddress >>8) & 0xFF;\n\t\tfwrite(&byte,1,1,fpdisk);\n\t\tfwrite(&H,1,1,fpdisk);\n\n\t\t/* Exec address */\n\t\tbyte=execaddress & 0xFF;\n\t\tH=(execaddress >>8) & 0xFF;\n\t\tfwrite(&byte,1,1,fpdisk);\n\t\tfwrite(&H,1,1,fpdisk);\n\n\n\t\t/* File length */\n\t\tbyte= length & 0xFF;\n\t\tH=(length >>8) & 0xFF;\n\t\tfwrite(&byte,1,1,fpdisk);\n\t\tfwrite(&H,1,1,fpdisk);\n\n\t}/* for */\n\tprintf(\"\\n\");\n\tfclose(fpdisk);\n}\n\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/diskb_del.c",
    "content": "/* diskb_del.c, Copyright (C) W.H.Scholten 1996-2014\n *\n * Remove a file from a disk image\n *\n * 16-4-1996\n * For bbcim version >=0.60\n */\n\n\nvoid del_from_image(int argc, char *argv[], int options) {\n\tFILE *fpdisk;\n\tchar bbcfile_naam[15];\n\tunsigned char byte;\n\tunsigned char files;\n\tint  rfiles;\n\tlong file,k;\n\tint  locked;\n\tint  removed;\n\tint  i,j;\n\tchar testnaam[15];\n\n\n\t/* DEL moet met lijst */\n\tif ((argc-options)<2) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"niet voldoende argumenten\\n\");\n#else\n\t\tprintf(\"Not enough arguments (interactive mode not finished for -d)\\n\");\n#endif\n\t\texit(1);\n\t}\n/*   #ifdef MESSAGES_NL\n\t printf(\"Naam van het bbc diskbeeld?\");\n\t #else\n\t printf(\"Name of the bbc disk image?\");\n\t #endif\n\t scanf(\"%50s\", disk);\n\t } else {strcpy(disk, argv[1+options]); options++;}\n*/\n\n\tfpdisk=fopen(argv[1+options],\"rb+\");\n\n\n\tif (fpdisk==NULL) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Bestand %s is niet te openen\\n\",argv[1+options]);\n#else\n\t\tprintf(\"File %s cannot be opened\\n\",argv[1+options]);\n#endif\n\t\texit(1);\n\t}\n\n\n\n\t/*Doe alleen iets als het diskbeeld meer dan 2 sectoren bevat. */\n\tfseek(fpdisk,0L, SEEK_END);\n\tif (ftell(fpdisk)<512) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"niets op het diskbeeld\\n\");\n#else\n\t\tprintf(\"Nothing on the disk image\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\n\n\tfseek(fpdisk,256+5L,SEEK_SET);\n\tfread(&files,1,1,fpdisk);\n\n\trfiles=files/8;\n#ifdef MESSAGES_NL\n\tprintf(\"aantal bestanden: %d\\n\",rfiles);\n#else\n\tprintf(\"number of files: %d\\n\",rfiles);\n#endif\n\n\tremoved=0;\n\n\t/*Hoofdlus: alle bestanden opzoeken. */\n\tif (files>0) {\n\n/* EVT om backup te maken:\n//    {fclose(fpdisk);\n//     strcpy(backupnaam, disk);strcat(backupnaam,\"%\");\n\n//     remove(backupnaam);\n//     rename(disk,backupnaam);\n\n//     fpdisk=fopen(backupnaam,\"r\");\n//     fpdisk2=fopen(disk,\"w\");\n*/\n\n\n\n\t\tfor(file=0;file<files; file +=8) {\n\t\t\tfseek(fpdisk,file+15L,SEEK_SET);\n\t\t\tfread(&byte,1,1,fpdisk);\n\n\t\t\tlocked=byte >>7;\n\n\t\t\tbbcfile_naam[0]=(byte & 0x7F);\n\t\t\tbbcfile_naam[1]='.';    \n\n\t\t\tfseek(fpdisk,file+8L,SEEK_SET);\n/*    for(i=0; i<7; i++) {\n\t  fread(&byte,1,1,fpdisk);\n\t  bbcfile_naam[i+2]=byte;\n      }\n*/\n\t\t\tfread(bbcfile_naam+2,1,7,fpdisk);\n\n\t\t\tbbcfile_naam[9]=0;\n\n\n\t\t\t/*spaties aan het einde van extract weghalen: geeft anders bestands namen\n\t\t\t  met spaties aan het einde */\n\t\t\tfor(i=8; i>0 && (bbcfile_naam[i]==' '); i--);\n\t\t\tbbcfile_naam[i+1]=0;\n\n\t\t\tfor (j=options+1; j<argc; j++) {\n\t\t\t\tif (argv[j][1]=='.')\n\t\t\t\t\tstrncpy(testnaam, argv[j],9);\n\t\t\t\telse {\n\t\t\t\t\ttestnaam[0]='$'; testnaam[1]='.';\n\t\t\t\t\tstrncpy(testnaam+2, argv[j],7);\n\t\t\t\t}\n\t\t\t\ttestnaam[9]=0;\n\n\t\t\t\tif (!strcmp(bbcfile_naam, testnaam)) {\n\t\t\t\t\tfor (k=(file+8)+8; k<256; k++) {\n\t\t\t\t\t\tfseek(fpdisk,k, SEEK_SET);\n\t\t\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\t\t\tfseek(fpdisk,k-8L, SEEK_SET);\n\t\t\t\t\t\tfwrite(&byte,1,1,fpdisk);\n\n\t\t\t\t\t\tfseek(fpdisk,k+256L, SEEK_SET);\n\t\t\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\t\t\tfseek(fpdisk,k-8L+256L, SEEK_SET);\n\t\t\t\t\t\tfwrite(&byte,1,1,fpdisk);\n\t\t\t\t\t}\n#ifdef MESSAGES_NL\n\t\t\t\t\tprintf(\"Bestand %s verwijderd\\n\",testnaam);\n#else\n\t\t\t\t\tprintf(\"File %s removed\\n\",testnaam);\n#endif\n\t\t\t\t\tremoved++;\n/*          continue;*/\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}/*for*/\n\n\t\tfiles -=removed*8;\n\t\tfseek(fpdisk,256+5L,SEEK_SET);\n\t\tfwrite(&files,1,1,fpdisk);\n\n\t\tfclose(fpdisk);\n\n#ifdef MESSAGES_NL\n\t\tprintf(\"  %d bestand%s verwijderd\\n\", removed, (removed!=1) ? \"en\" : \"\");\n#else\n\t\tprintf(\"  %d file%s removed\\n\", removed, (removed!=1) ? \"s\" : \"\");\n#endif\n\n\t}/*if files>0 */\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/expand_im.c",
    "content": "/* expand_im.c, Copyright (C) 1996-2014 W.H. Scholten\n *\n * Part of bbcim.\n */\n\nvoid expand_image(char *disk, int expand) {\n\tFILE *fpdisk;\n\tunsigned char byte, bootoption;\n\tlong i, length, expand_length;\n\n\tfpdisk=fopen(disk,\"rb+\");\n\tfseek(fpdisk,0,SEEK_END);\n\tlength=ftell(fpdisk);\n\texpand_length=expand*256;\n\n\tif (expand_length>=length) {\n\t\tbyte=0;\n\t\tfor (i=0; i<(expand_length-length); i++)\n\t\t\tfwrite(&byte,1,1,fpdisk);\n\n\t\t/* 'sectors on disk' aanpassen */\n\t\tfseek(fpdisk,256L+6L,SEEK_SET);\n\t\tfread(&bootoption,1,1,fpdisk); /*rescue bootoption*/\n\t\tbootoption &=3<<4;\n\n\t\tbyte=((expand >>8)&3)|bootoption;\n\t\tfseek(fpdisk,256L+6L,SEEK_SET);\n\t\tfwrite(&byte,1,1,fpdisk);\n\t\tbyte=(expand & 0xFF);\n\t\tfwrite(&byte,1,1,fpdisk);\n\t}\n\n\t/* Netjes afsluiten */\n\tfclose(fpdisk);\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/intersplits.c",
    "content": "/* intersplit.c, Copyright (C) W.H.Scholten 1996-2014, 2017\n *\n * make or split an interleaved disk image, single/double density\n * functions: interss & splitds\n *\n * original version 11-3-1996\n *\n * Deel van bbcim.\n */\n\n\n/* Samenvoegen van 2 enkelzijdige diskbeelden tot een dubbelzijdig om-en-om diskbeeld */\nvoid interss(int argc, char *argv[], int options) {\n\tchar  side0[256],  side1[256], interleaved[256]; \n\tchar option2[5];\n\tunsigned char byte;\n\tFILE *fp0, *fp1, *fp_inter;\n\tint sec_per_track, track, i;\n\n\tint dd=0;\n\n\tif ((argc-options)==1) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Single density (sd) of double density (dd)?\");\n#else\n\t\tprintf(\"Single density (sd) or double density (dd)?\");\n#endif\n\t\tscanf(\"%2s\", option2);\n\t} else {strcpy(option2, argv[1+options]); options++;}\n\n\tif (!strcmp(option2, \"dd\")) dd=1;\n\n\n\tif ((argc-options)==1) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Naam van het diskbeeld voor zijde 0?\");\n#else\n\t\tprintf(\"Name of the disk image for side 0?\");\n#endif\n\t\tscanf(\"%50s\", side0);\n\t} else strcpy(side0, argv[1+options]);\n\n\n\tif ((argc-options)<=2) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Naam van het diskbeeld voor zijde 1?\");\n#else\n\t\tprintf(\"Name of the disk image for side 1?\");\n#endif\n\t\tscanf(\"%50s\", side1);\n\t} else strcpy(side1, argv[2+options]);\n\n\n\tif ((argc-options)<=3) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Naam van om-en-om beeld?\");\n#else\n\t\tprintf(\"Name of the interleaved disk image?\");\n#endif\n\t\tscanf(\"%50s\", interleaved);\n\t} else strcpy(interleaved, argv[3+options]);\n\n\n\n\tfp0=fopen(side0,\"rb\");\n\tif (fp0==NULL) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Bestand %s is niet te openen\\n\", side0);\n#else\n\t\tprintf(\"File %s cannot be opened\\n\", side0);\n#endif\n\t\texit(1);\n\t}\n\n\tif (strcmp(side0,side1)) {\n\t\t/*alleen als twee verschillende bestanden */\n\t\tfp1=fopen(side1,\"rb\");\n\t\tif (fp1==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Bestand %s is niet te openen\\n\", side1);\n#else\n\t\t\tprintf(\"File %s cannot be opened\\n\", side1);\n#endif\n\t\t\texit(1);\n\t\t}\n\t} else fp1=fp0;\n\n\n\tfp_inter=fopen(interleaved, \"wb\");\n\n\tprintf(\"  %s + %s > %s\\n\", side0, side1, interleaved);\n\n\n\tsec_per_track=10;\n\tif (dd) sec_per_track=18;\n\n\n\tfseek(fp0, 0L, SEEK_SET);\n\tfseek(fp1, 0L, SEEK_SET);\n\tfseek(fp_inter,0L, SEEK_SET);\n\tfor (track=0; track<80;track++) {\n\t\tfseek(fp0,0L+track*256L*sec_per_track, SEEK_SET);\n\t\tfor (i=0; i<256*sec_per_track; i++) {\n\t\t\tif (feof(fp0) && feof(fp1)) exit(0);\n\t\t\tif (feof(fp0)) byte=0; else fread(&byte,1,1,fp0);\n\t\t\tfwrite(&byte,1,1,fp_inter);\n\t\t}\n\t\tfseek(fp1,0L+track*256L*sec_per_track, SEEK_SET);\n\t\tfor (i=0; i<256*sec_per_track; i++) {\n\t\t\tif (feof(fp1) && feof(fp0)) exit(0);\n\t\t\tif (feof(fp1)) byte=0; else fread(&byte,1,1,fp1);\n\t\t\tfwrite(&byte,1,1,fp_inter);\n\t\t}\n\t}\n}\n/*einde samenvoegen*/\n\n\n/* Splits om-en-om diskbeeld: */\nvoid splitds(int argc, char *argv[], int options) {\n\tchar  side0[250],  side1[250], interleaved[250]; \n\tchar option2[5];\n\tunsigned char byte;\n\tFILE *fp0, *fp1, *fp_inter;\n\tint sec_per_track, track;\n\n\tint dd=0;\n\n\tif ((argc-options)==1) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Single density (sd) of double density 18 sectoren per track (dd)?\");\n#else\n\t\tprintf(\"Single density (sd) or double density 18 sectors per track (dd)?\");\n#endif\n\t\tscanf(\"%2s\", option2);\n\t} else {\n\t\tstrncpy(option2, argv[1+options], 4);\n\t\toption2[4] = 0;\n\t\tif (strcmp(option2, \"sd\") && strcmp(option2, \"dd\")) {\n\t\t\tfprintf(stderr, \"-splitds {sd|dd} <disk>\\n\");\n\t\t\texit(1);\n\t\t}\n\t\toptions++;\n\t}\n\n\tif (!strcmp(option2, \"dd\")) dd=1;\n\n\n\tif ((argc-options)==1) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Naam van de om-en-om diskdump?\");\n#else\n\t\tprintf(\"Name of the interleaved diskdump?\");\n#endif\n\t\tscanf(\"%50s\", interleaved);\n\t} else strcpy(interleaved, argv[1+options]);\n\n\tstrcpy(side0, interleaved);\n/*  side0[strcspn(side0,\".\")]=0; */ /* This was useful for DOS, but that's irrelevant these days */\n\tstrcpy(side1, interleaved);\n\tstrcat(side0,\".0\");\n\tstrcat(side1,\".1\");\n\n\tprintf(\" %s > %s + %s\\n\",interleaved, side0, side1);\n\n\tfp_inter=fopen(interleaved, \"rb\");\n\tif (fp_inter==NULL) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Bestand %s is niet te openen\\n\", interleaved);\n#else\n\t\tprintf(\"File %s cannot be opened\\n\", interleaved);\n#endif\n\t\texit(1);\n\t}\n\n\n\tfp0=fopen(side0,\"wb\");\n\tfp1=fopen(side1,\"wb\");\n\n\n\tsec_per_track=10;\n\tif (dd) sec_per_track=18;\n\n\tfseek(fp_inter,0L, SEEK_SET);\n\tfor (track=0; track<80;track++) {\n\t\tint i;\n\t\tfor (i=0; i<256*sec_per_track; i++) {\n\t\t\tif (!fread(&byte,1,1,fp_inter)) exit(0);\n\t\t\tfwrite(&byte,1,1,fp0);\n\t\t}\n\t\tfor (i=0; i<256*sec_per_track; i++) {\n\t\t\tif (!fread(&byte,1,1,fp_inter)) exit(0);\n\t\t\tfwrite(&byte,1,1,fp1);\n\t\t}\n\t}\n} /*einde splitsen */\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/minimaliseer.c",
    "content": "/* minimaliseer.c, Copyright (C) W.H.Scholten 1996-2014, 2017\n *\n * minimse a bbc disk image (single density)\n * first version: 17-4-1996 for bbcim versie >=0.61\n */\n\nvoid minimise_image(char *disk) {\n\tFILE *fpdisk, *fpdisk2;\n\tchar backupnaam[256];\n\tchar bbcfile_naam[12];\n\tunsigned char byte, H, eellddss;\n\n\n\tlong startsector, file;\n\tlong startsector2=2;\n\tunsigned char files;\n\tlong length;\n\tint  i;\n\n\n\n\n\tfpdisk=fopen(disk, \"rb\");\n\n\tfseek(fpdisk,256L+5L,SEEK_SET);\n\n\tfread(&files,1,1,fpdisk);\n\n/*\n// int rfiles=files/8;\n// #ifdef MESSAGES_NL\n//  printf(\"aantal bestanden: %d\\n\",rfiles);\n// #else\n//  printf(\"number of files: %d\\n\",rfiles);\n// #endif\n*/\n\n\tif (files>0){\n\t\tfclose(fpdisk);\n\t\tstrcpy(backupnaam, disk);strcat(backupnaam,\"~\");\n\n\t\tremove(backupnaam);\n\t\trename(disk,backupnaam);\n\n\t\tfpdisk=fopen(backupnaam,\"rb\");\n\t\tfpdisk2=fopen(disk,\"wb\");\n\n\n\t\t/* Catalogus kopieeren */\n\t\tfor(i=0;i<512;i++){\n\t\t\tfread (&byte,1,1,fpdisk);\n\t\t\tfwrite (&byte,1,1,fpdisk2);\n\t\t}\n\n\n\t\t/* Hoofdlus: alle bestanden opzoeken. */\n\t\tfor(file=files;file>0; file -=8){\n\n\t\t\t/* The following is only needed for filename printing */\n\t\t\tfseek(fpdisk,file+15L,SEEK_SET);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tbbcfile_naam[0]=(byte & 0x7F);\n\t\t\tbbcfile_naam[1]='.';\n    \n\t\t\tfseek(fpdisk,file,SEEK_SET);\n\t\t\tfor(i=0; i<7; i++){\n\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\tbbcfile_naam[i+2]=byte;\n\t\t\t}\n\n/*          fread(bbcfile_naam+2,1,7,fpdisk);*/\n\n\t\t\tbbcfile_naam[9]=0;\n\n\n\t\t\t/* File lengte */\n\t\t\tfseek(fpdisk,file+256L+4L,0);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tfread(&H,1,1,fpdisk);\n\t\t\tfread(&eellddss,1,1,fpdisk);\n\t\t\tlength=H*256L+byte+(eellddss & 0x30)*16L*256L;\n\n\t\t\t/* Start sector */\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tstartsector=byte+(eellddss & 3)*256L;\n\n\n\n\n\t\t\t/* nieuwe startsector */\n\t\t\tfseek(fpdisk2,256+file+6,SEEK_SET);\n\t\t\teellddss =(eellddss & 0xFC)+(startsector2>>8);\n\t\t\tfwrite(&eellddss,1,1,fpdisk2);\n\t\t\tbyte=startsector2 & 0xFF;\n\t\t\tfwrite(&byte,1,1,fpdisk2);\n\n\t\t\tprintf(\"startsector %3d > %3d\\n\", (int) startsector, (int) startsector2);\n\n\n\t\t\tfseek(fpdisk,startsector*256, SEEK_SET);\n\t\t\tfseek(fpdisk2,startsector2*256, SEEK_SET);\n\t\t\tfor (i=0; i<((length+255)>>8)*256; i++){\n\t\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\t\tif (feof(fpdisk) && (i<length)){\n#ifdef MESSAGES_NL\n\t\t\t\t\tprintf(\"onverwacht einde van het diskbeeld\" \\\n\t\t\t\t\t\t   \" bij bestand %s\\n\", bbcfile_naam);\n#else\n\t\t\t\t\tprintf(\"unexpected end of the disk image\" \\\n\t\t\t\t\t\t   \" at file %s\\n\", bbcfile_naam);\n#endif\n\t\t\t\t\texit(1);\n\t\t\t\t}\n\t\t\t\tfwrite(&byte,1,1,fpdisk2);\n\t\t\t}\n\t\t\tstartsector2=startsector2+((length+255)>>8);\n\n\t\t} /* FOR file */\n\n\t}/* if */\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/nieuw_diskb.c",
    "content": "/* nieuw_diskb.c, Copyright (c) 1996-2014 W.H. Scholten\n *\n * Deel van bbcim.\n */\n\n\nvoid new_image(char *disk, unsigned int size) {\n\tFILE *fpdisk;\n\tunsigned char byte;\n\tlong i;\n\n\tsize &=0xFFF;\n\t/* not allowed in true DFS but might be useful for big disks in beebem. */\n\n\tfpdisk=fopen(disk,\"wb\");\n\tbyte=0;\n\n\tfor (i=0; i<512; i++)\n\t\tfwrite(&byte,1,1,fpdisk);\n\n\t/* Set default disk size to 80 track */\n\tbyte=(size>>8);\n\tfseek(fpdisk,256+6L,SEEK_SET);\n\tbyte |=3<<4;\n\tfwrite(&byte,1,1,fpdisk);  /*i.e. bootoption=*EXEC, sect on disk='size' */\n\tbyte=(size & 0xFF);\n\tfwrite(&byte,1,1,fpdisk);\n\n\t/* Netjes afsluiten*/\n\tfclose(fpdisk);\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/overschrijf.c",
    "content": "/* overschrijf.c, Copyright (C) W.H.Scholten 1996,1997,2014, 2017\n *\n * Part of bbcim.\n */\n\n\n#include \"overschrijf.h\"\n\nint  rename_sequential(char *naam) {\n\tFILE *fp;\n\tstatic char new_name[256];\n\tint i=0;\n\n\tstrcpy(new_name, naam);\n\tfor(;;) {\n\t\tfp=fopen(new_name, \"r\");\n\t\tif (fp == NULL) break;\n\t\tfclose(fp);\n\t\tstrcpy(new_name, naam);\n\t\tsprintf(new_name+strlen(new_name), \"%d\", i);\n\t\ti++;\n\t}\n\tstrcpy(naam,new_name);\n\treturn 1;\n}\n\nint  overschrijf_vraag(char *oude_naam, char *nieuwe_naam) {\n\tchar string;\n\tint antwoord=0;\n\n\tprintf(\"bestand %s -> %s:\\n\", oude_naam, nieuwe_naam);\n\n\twhile (!antwoord) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"  overschrijven/hernoem nieuw/hernoem bestaand/sla over?(o/n/b/s)\");\n\t\tscanf(\" %c\",&string);\n\t\tswitch(string) {\n\t\tcase 'o': antwoord=OVERSCHRIJVEN;break;\n\t\tcase 'n': antwoord=HERNOEM_NIEUW;break;\n\t\tcase 'b': antwoord=HERNOEM_BESTAAND;break;\n\t\tcase 's': antwoord=SLA_OVER;}\n#else\n\t\tprintf(\"  overwrite/rename new file/rename existing file/skip?(o/n/e/s)\");\n\t\tscanf(\" %c\",&string);\n\t\tswitch(string) {\n\t\tcase 'o': antwoord=OVERSCHRIJVEN;break;\n\t\tcase 'n': antwoord=HERNOEM_NIEUW;break;\n\t\tcase 'b': antwoord=HERNOEM_BESTAAND;break;\n\t\tcase 's': antwoord=SLA_OVER;}\n#endif\n\t}\n\n\tif (antwoord==HERNOEM_NIEUW || antwoord==HERNOEM_BESTAAND) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"nieuwe naam?\");\n#else\n\t\tprintf(\"new name?\");\n#endif\n\t\tscanf(\"%49s\", nieuwe_naam);\n\t}\n\n\treturn antwoord;\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/overschrijf.h",
    "content": "/* overschrijf.h, Copyright (C) W.H.Scholten 1996-2014\n *\n * Part of bbcim.\n */\n\n#define OVERSCHRIJVEN 1\n#define HERNOEM_NIEUW 2\n#define HERNOEM_BESTAAND 3\n#define SLA_OVER 4\n\n\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/splits_cat.c",
    "content": "/* splits_cat.c, Copyright (C) W.H.Scholten 1996-2014, 2017\n *\n * Part of bbcim\n */\n\n\nvoid split_cat(int argc, char *argv[],int options, char *optread_line) {\n\tFILE *fpcat, *fpinfo;\n\tchar infofile[256];\n\tchar read_line[256], bbcfile_naam[15];\n\tchar cat_naam[256], nieuwe_naam[256];\n\tint i, args;\n\n\tint no_bbc_dir=0;\n\tint antwoord;\n\n\tunsigned int load, exec, crc;\n\n\tif ((argc-options)<2) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Naam van de te splitsen catalogus?\");\n#else\n\t\tprintf(\"Name of the catalogue to be split?\");\n#endif\n\t\tscanf(\"%50s\", cat_naam);\n\t} else strcpy(cat_naam, argv[1+options]);\n\n\n\tif (optread_line[2]=='#') no_bbc_dir=1;\n\n\tfpcat=fopen(cat_naam,\"r\");\n\tif (fpcat == NULL) {\n#ifdef MESSAGES_NL\n\t\tfprintf(stderr, \"Bestand niet gevonden\\n\");\n#else\n        fprintf(stderr, \"File not found\\n\");\n#endif\n\t\treturn; }\n\n\twhile (fscanf(fpcat,\"%12s\", bbcfile_naam)!=EOF) {\n\t\tbbcfile_naam[9]=0;\n\n#if DEBUG\n\t\tprintf(\"bbcfile=%s\", bbcfile_naam);\n#endif\n\n\t\tfgets(read_line, 99, fpcat); /* Get remainder of line */\n\n\n\t\tif (bbcfile_naam[1]=='.') {\n\t\t\tif (no_bbc_dir)\n/*         {if (bbcfile_naam[0]=='$') strcpy(infofile,bbcfile_naam+2);\n\t\t   else {infofile[0]=bbcfile_naam[0];\n\t\t   strcpy(infofile+1,bbcfile_naam+2);\n\t\t   }\n\t\t   }\n*/\n\t\t\t\treduceer_unix_naam(infofile, bbcfile_naam);\n\n\t\t\telse strcpy(infofile,bbcfile_naam);\n\t\t\tstrcat(infofile,\".inf\");\n\n\t\t\t/* Check if file exists (can be opened) */\n\t\t\tif ((fpinfo=fopen(infofile, \"r\"))!=NULL) {\n\t\t\t\tfclose(fpinfo);\n\t\t\t\tantwoord=overschrijf_vraag(bbcfile_naam, infofile);\n\n\t\t\t\tswitch(antwoord) {\n\t\t\t\tcase OVERSCHRIJVEN:\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HERNOEM_NIEUW:\n\t\t\t\t\tstrcpy(infofile, nieuwe_naam); break;\n\n\t\t\t\tcase HERNOEM_BESTAAND:\n\t\t\t\t\trename(infofile, nieuwe_naam); break;\n\n\t\t\t\tcase SLA_OVER:\n\t\t\t\t\tcontinue; /*next in while loop*/\n\t\t\t\t} /* switch */\n\t\t\t}\n\t\t\t/* End name check */\n\n\n\n\t\t\tfpinfo=fopen(infofile, \"w\");\n\t\t\tfprintf(fpinfo, \"%s\", bbcfile_naam);\n\n\t\t\tfor (i=0; i<99; i++) {\n\t\t\t\tif (read_line[i]>' ') break;\n\t\t\t}\n\n\t\t\targs =sscanf(read_line,\"%*[ L\\x09]%x %x %*[^=]=%x\", &load, &exec, (unsigned int *) &crc);\n\t\t\tfprintf(fpinfo, \"  %6X  %6X\", load, exec);\n\t\t\tif (read_line[i]=='L') fprintf(fpinfo, \" Locked\");\n\t\t\tif (args==3) fprintf(fpinfo, \"  CRC=%4X\", (unsigned int) crc);\n\t\t\tfclose(fpinfo);\n\t\t}\n    \n\t}\n\t/* netjes afsluiten */\n\tfclose(fpcat);\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/w62.c",
    "content": "/* w62.c, Copyright (C) 1996-2014,2017 W.H. Scholten\n *\n * Converts a Watford 62 file diskimage into 2 Acorn DFS diskimages\n *\n * Part of bbcim.\n */\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\nint  w62dfs(int argc, char *argv[], int options) {\n\tFILE *fpdisk, *fpdisk2;\n\tunsigned char byte;\n\tchar disk1[256], disk2[256];\n\tint  i;\n\n\tif (argc<3) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Diskbeeld naam afwezig\\n\");\n#else\n\t\tprintf(\"Diskimage name missing\\n\");\n#endif\n\t\treturn 1;\n\t}\n\n  \n\tstrcpy(disk1, argv[2]);\n\tdisk1[strcspn(disk1,\".\")]=0;\n\tstrcpy(disk2, disk1);\n\tstrcat(disk1,\".w1\");\n\tstrcat(disk2,\".w2\");\n\n\tfpdisk=fopen(argv[2],\"rb\");\n\tif (!fpdisk) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Watford 62 bestand diskbeeld niet te openen\\n\");\n#else\n\t\tprintf(\"Failed to open watford 62 file image\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* are there files on image 2? */\n\tfseek(fpdisk,512+DFSentries,SEEK_SET);\n\tfread(&byte,1,1,fpdisk);\n\tif (byte) {\n\n\t\tfpdisk2=fopen(disk2,\"wb\");\n\n\t\t/* Move 2 sectors down */\n\t\tfor (i=0; i<512; i++) {\n\t\t\tfseek(fpdisk,512+i,SEEK_SET);\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tfseek(fpdisk,0+i,SEEK_SET);\n\t\t\tfwrite(&byte,1,1,fpdisk2);\n\t\t}\n\n\t\tfseek(fpdisk,512,SEEK_SET);\n\n\t\tfor (i=512; i<200*1024; i++) {\n\t\t\tfread(&byte,1,1,fpdisk);\n\t\t\tif (feof(fpdisk)) break;\n\t\t\tfwrite(&byte,1,1,fpdisk2);\n\t\t}\n\t\tfclose(fpdisk2);\n\t}\n\n\t/* Netjes afsluiten */\n\tfclose(fpdisk);\n\trename(argv[2], disk1);\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/bbc/bbcim-1.0.1/src/xbeeb.c",
    "content": "/* xbeeb.c, Copyright (C) W.H.Scholten 1996-2014, 2017\n *\n * Laatste verandering: 30-6-96\n * Alles werkt maar code is zeer lelijk (dubbel etc). VERBETER.\n *\n * part of bbcim.\n */\n\n#include \"overschrijf.h\"\n\nvoid xbeeb(int argc, char *argv[], int options) {\n\tFILE *fparchief, *fpinfo, *fpcat, *fp_oude_cat;\n\tchar infofile[256];\n\n\tconst char* catalogus=\"__CATALOG__\";\n\tconst char* oude_catalogus=\"__CATALOG__%\";\n\n\n\tint archief_bestand, l;\n\tchar bbcfile_naam[15], xbeeb_naam[15];\n\tunsigned int loadaddress, execaddress;\n\tchar read_line[256];\n\tchar locked;\n\tchar nieuwe_naam[256];\n\tint antwoord, len_s,i;\n\tint length;\n\tunsigned int crc;\n\n/* Conversion without command line list not implemented:\n//   if ((argc-options)<3)\n//    {\n//     #ifdef MESSAGES_NL\n//     printf(\"Naam van het toe te voegen archief bestand?\");\n//     #else\n//     printf(\"Name of the archive file to be added?\");\n//     #endif\n//     scanf(\"%50s\", addfile);\n//     } else strcpy(addfile, argv[2+options]);\n*/\n\n\tif ((argc-options)<2) {\n#ifdef MESSAGES_NL\n\t\tprintf(\"Geen lijst van archief bestanden meegegeven\\n\");\n#else\n\t\tprintf(\"No archive file list given\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\n\n\n\n\tfor(archief_bestand=2; archief_bestand<argc; archief_bestand++) {\n\t\t/* .inf bestanden overslaan: */\n\t\t/*int */l=strlen(argv[archief_bestand]);\n\t\tif (l>4) {\n\t\t\tif (!strncmp(argv[archief_bestand]+l-4,\".inf\",4))\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tstrcpy(infofile,argv[archief_bestand]);\n\t\tstrcat(infofile,\".inf\");\n\n\n\t\t/* Bestaat het archief bestand? */\n\t\tfparchief=fopen(argv[archief_bestand], \"rb\");\n\t\tif (fparchief==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Archief bestand %s kan niet geopend worden\\n\", argv[archief_bestand]);\n#else\n\t\t\tprintf(\"Archive file %s cannot be opened\\n\", argv[archief_bestand]);\n#endif\n\t\t\tcontinue;\n\t\t}\n\t\tfclose(fparchief);\n\n\t\t/* Bestaat het .inf bestand? */\n\t\tfpinfo=fopen(infofile, \"r\");\n\t\tif (fpinfo==NULL) {\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"Info bestand %s kan niet geopend worden, sla over\\n\", infofile);\n#else\n\t\t\tprintf(\"Info file %s cannot be opened, skipping file\\n\", infofile);\n#endif\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Uit het inf bestand de bestandsnaam halen en de adressen. */\n#if 1\n\t\tfscanf(fpinfo,\"%12s\", bbcfile_naam);\n\t\tif (bbcfile_naam[1]!='.') {\n\t\t\tstrncpy(bbcfile_naam, argv[archief_bestand], 12);\n\t\t\tfseek(fpinfo, 0L, SEEK_SET);\n\t\t}\n\t\tbbcfile_naam[9]=0;\n\t\tfscanf(fpinfo,\"%x %x\", &loadaddress, &execaddress);\n#else\n\t\tfscanf(fpinfo,\"%12s %x %x\", bbcfile_naam, &loadaddress, &execaddress);\n\t\tbbcfile_naam[9]=0;\n\n\t\tif (bbcfile_naam[1]!='.') {\n\t\t\tstrcpy(bbcfile_naam, argv[archief_bestand]);\n\t\t\tfseek(fpinfo, 0L, SEEK_SET);\n\t\t\tfscanf(fpinfo,\" %x %x\", &loadaddress, &execaddress);\n\t\t}\n#endif\n\n\n\t\t/* 'Locked' wordt nu behandeld: */\n\t\tfgets(read_line, 49, fpinfo);\n\t\tfclose(fpinfo);\n \n\t\tlen_s=strlen(read_line);\n\n\t\t/*      NOTE: 'Locked' may be abbreviated to 'L':*/\n\t\tlocked=' ';\n\t\tfor (i=0; i<len_s; i++)\n\t\t\tif (read_line[i]=='L')\n\t\t\t\t{locked='L'; break;}\n\n\n\n\t\t/* Hernoemen etc als naam al bestaat (en alleen als de nieuwe naam anders is) */\n\t\tstrcpy(nieuwe_naam, bbcfile_naam);\n\n\t\tif (strcmp(argv[archief_bestand], bbcfile_naam)) {\n\n\t\t\tif ((fparchief=fopen(bbcfile_naam, \"rb\"))!=NULL) {\n\t\t\t\tfclose(fparchief);\n\t\t\t\tantwoord=overschrijf_vraag(argv[archief_bestand], nieuwe_naam);\n\t\t\t\t/* If new name has no bbcdir assume $ */\n\t\t\t\t/* will work correctly if no new name is given (overwrite/skip)*/\n\t\t\t\tif (nieuwe_naam[1]!='.') {\n\t\t\t\t\tfor(i=12; i>1; i--)\n\t\t\t\t\t\tnieuwe_naam[i]=nieuwe_naam[i-2];\n\t\t\t\t\tnieuwe_naam[0]='$'; nieuwe_naam[1]='.';\n\t\t\t\t}\n\t\t\t\tnieuwe_naam[9]=0; /*maximale naam lengte*/\n\n\t\t\t\tswitch(antwoord) {\n\t\t\t\tcase OVERSCHRIJVEN:\n\t\t\t\t\trename(catalogus, oude_catalogus);\n\t\t\t\t\tfp_oude_cat=fopen(oude_catalogus,\"r\");\n\t\t\t\t\tif (fp_oude_cat != NULL) { /*EXISTS ??*/\n\t\t\t\t\t\t/* verwijder oude catalogus ingang: */\n\t\t\t\t\t\tfpcat=fopen(catalogus,\"w\");\n\n\t\t\t\t\t\twhile (fgets(read_line, 49, fp_oude_cat)) {\n\t\t\t\t\t\t\tsscanf(read_line, \"%12s\", xbeeb_naam);\n\t\t\t\t\t\t\tif (!strcmp(bbcfile_naam, xbeeb_naam))\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\tfputs(read_line, fpcat);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfclose(fpcat); fclose(fp_oude_cat);\n\t\t\t\t\t} /* if (exists) */\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HERNOEM_NIEUW:\n\t\t\t\t\tstrcpy(bbcfile_naam, nieuwe_naam);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HERNOEM_BESTAAND:\n\t\t\t\t\t/* verander oude catalogus ingang: */\n\t\t\t\t\trename(catalogus, oude_catalogus);\n\n\t\t\t\t\tfp_oude_cat=fopen(oude_catalogus,\"r\");\n\t\t\t\t\tif (fp_oude_cat != NULL) { /*exists ??? */\n\t\t\t\t\t\t/* it might not if creating an xbeeb dir and files have xbeeb like names */\n\t\t\t\t\t\tfpcat=fopen(catalogus,\"w\");\n\t\t\t\t\t\twhile(fgets(read_line, 49, fp_oude_cat)) {\n\t\t\t\t\t\t\tsscanf(read_line, \"%9s\", xbeeb_naam);\n\t\t\t\t\t\t\tif (!strcmp(bbcfile_naam, xbeeb_naam)) {\n\t\t\t\t\t\t\t\tfprintf(fpcat, \"%-9s\", nieuwe_naam);\n\t\t\t\t\t\t\t\tfputs(read_line+9, fpcat);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tfputs(read_line, fpcat);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfclose(fpcat); fclose(fp_oude_cat);\n\t\t\t\t\t}/*if (exists) */\n\t\t\t\t\trename(bbcfile_naam, nieuwe_naam);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SLA_OVER:\n\t\t\t\t\tcontinue;\n\t\t\t\t} /*switch*/\n\t\t\t} /*if*/\n\n\n\n\n\n#ifdef MESSAGES_NL\n\t\t\tprintf(\"bestand %s hernoemd tot %s\\n\", argv[archief_bestand], bbcfile_naam);\n#else\n\t\t\tprintf(\"renamed file %s to %s\\n\", argv[archief_bestand], bbcfile_naam);\n#endif\n\n\t\t} /*einde test of de 'hernoem naam' anders is.*/\n\n\t\tfparchief=fopen(argv[archief_bestand], \"rb\");\n\t\tfseek(fparchief, 0L, SEEK_END);\n\t\tlength=ftell(fparchief);\n\t\tfclose(fparchief);\n\n\t\trename(argv[archief_bestand], bbcfile_naam);\n\n\t\tremove(infofile);\n\n/* if CRC was bad, should that one be put in the __CATALOG__ ??\n   Probably. For now, I recalculate. FIX (if crc is bad say so in __CATALOG__)\n*/\n\n\t\tcrc=fcrc(bbcfile_naam);\n\n\n\t\t/* Add filename & information to __CATALOG__ */\n\t\tfpcat=fopen(catalogus,\"a\");\n\t\tfprintf(fpcat,\"%-9s  %c  %6X %6X %6X     CRC=%04X\\n\", bbcfile_naam, locked, loadaddress, execaddress, length, (unsigned int) crc);\n\t\tfclose(fpcat);\n\t} /* FOR */\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/.clang-format",
    "content": "# We'll use defaults from the LLVM style, but with 4 columns indentation.\nBasedOnStyle: LLVM\nIndentWidth: 4\nAlignAfterOpenBracket: true\nAllowShortFunctionsOnASingleLine: Inline\nAllowShortCaseLabelsOnASingleLine: true\nAlignConsecutiveAssignments: true\nBreakBeforeBraces: Allman\nSpaceBeforeParens: Never\nColumnLimit: 90\nSpacesInConditionalStatement: true\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/.gitignore",
    "content": "obj/\nmkatr\nlsatr\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/Makefile",
    "content": "#\n#  Copyright (C) 2016 Daniel Serpell\n#\n#  This program is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation, either version 2 of the License, or\n#  (at your option) any later version.\n#\n#  This program is distributed in the hope that it will be useful,\n#  but WITHOUT ANY WARRANTY; without even the implied warranty of\n#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#  GNU General Public License for more details.\n#\n#  You should have received a copy of the GNU General Public License along\n#  with this program.  If not, see <http://www.gnu.org/licenses/>\n#\n\n# Folder to place compiled programs\nPROG_DIR=.\n\n# Folder to place the build files\nBUILD_DIR=obj\n\n\nPROGS=\\\n mkatr\\\n lsatr\\\n\nSOURCES_mkatr=\\\n crc32.c\\\n compat.c\\\n darray.c\\\n flist.c\\\n mkatr.c\\\n msg.c\\\n spartafs.c\\\n\nSOURCES_lsatr=\\\n atr.c\\\n compat.c\\\n crc32.c\\\n lsatr.c\\\n lssfs.c\\\n lsdos.c\\\n lsextra.c\\\n lshowfen.c\\\n msg.c\\\n\nCFLAGS=-O2 -w\n# -Wall\nLDFLAGS=\n\n# Default rule\nall: $(PROGS:%=$(PROG_DIR)/%)\n\n# Rule template\ndefine PROG_template\n # Objects from sources\n OBJS_$(1)=$(addprefix $(BUILD_DIR)/,$(SOURCES_$(1):%.c=%.o))\n # All SOURCES/OBJECTS\n SOURCES+=$$(SOURCES_$(1))\n OBJS+=$$(OBJS_$(1))\n # Link rule\n$(PROG_DIR)/$(1): $$(OBJS_$(1))\n\t$$(CC) $$(CFLAGS) $$(LDFLAGS) $$^ $$(LDLIBS) -o $$@\nendef\n\n# Generate all rules\n$(foreach prog,$(PROGS),$(eval $(call PROG_template,$(prog))))\n\nDEPS=$(OBJS:%.o=%.d)\n\n# Cleanup\n.PHONY: clean\nclean:\n\t-rm -f $(OBJS) $(DEPS)\n\t-rmdir $(BUILD_DIR)\n\n.PHONY: distclean\ndistclean: clean\n\t-rm -f $(PROGS:%=$(PROG_DIR)/%)\n\n# Create output dirs\n$(BUILD_DIR):\n\tmkdir -p $@\n\n$(OBJS): | $(BUILD_DIR)\n$(DEPS): | $(BUILD_DIR)\n\n# Compilation\n$(BUILD_DIR)/%.o: src/%.c\n\t$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<\n\n# Dependencies\n$(BUILD_DIR)/%.d: src/%.c\n\t@$(CC) -MM -MP -MF $@ -MT \"$(@:.d=.o) $@\" $(CFLAGS) $(CPPFLAGS) $<\n\nifneq \"$(MAKECMDGOALS)\" \"clean\"\n ifneq \"$(MAKECMDGOALS)\" \"distclean\"\n  -include $(DEPS)\n endif\nendif\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/README.md",
    "content": "Atri ATR disk image tools\n-------------------------\n\nTools to create, list and extract Atari `ATR` disk images.\n\nmkatr: Create ATR images from list of files\n-------------------------------------------\n\nThis program creates Atari `ATR` disk images from a list of files given\nin the command line, in the SpartaDOS / BW-DOS disk format.\n\nUsage:\n\n    mkatr [options] output [+attributes] filenames\n\nOptions:\n\n- `-b`  Selects the next file in the command line as the _boot_ file,\n        the file will be loaded when the computer boots, and must be\n        in the standard Atari binary file format.\n        The bootloader for 128 bytes per sector needs 613 bytes, from $700 to\n        $965, and the bootloader for 256 bytes per sector needs 848 bytes, from\n        $700 to $A50, both can be relocated with the `-B` option.\n\n- `-x`  Output image with exact sector count for all available content.\n        This will use non-standard sector counts, and return images with\n        128 bytes per sector if the image is smaller than about 8MB.\n\n- `-s`  Specify the minimum size of the output image, in bytes. The image\n        will be of this size or larger instead of the smaller possible.\n        This allows creating images with available free space.\n        Using this option with the `-x` option allows generating images of\n        specific sizes (up to the sector size).\n\n- `-B`  Specify the page (high part of address) of the start of the bootloader.\n        Use this option to load games or other software with a low loading\n        address that conflicts with the standard address of the bootloader.  A\n        safe value is from page 6 instead of the default page 7, but page 4 or\n        5 is also possible.\n\n- `-h`  Shows a brief help.\n\n- `-v`  Shows version information.\n\nAlso, in front of each file name you can optionally add a list of attributes to\nbe set for that file:\n\n- `+p`  Marks this file as protected (read-only).\n\n- `+h`  Hide file from directory. This only works in SpartaDOS-X.\n\n- `+a`  Marks the file as \"archived\". This only works in SpartaDOS-X.\n\nTo place files inside a sub-directory, simply add the directory *before*\nall the files inside that directory.\n\nThe resulting image will be the smaller size that fits all the given files (or\nthe minimum specified with `-s`), from the following list (except when the `-x`\noption is used):\n\n| Sector Count | Sector Size | Total Size | Name                     |\n|         ---: |        ---: |       ---: | :---                     |\n|       720    |       128   |      90k   | SD                       |\n|      1040    |       128   |     130k   | ED                       |\n|       720    |       256   |     180k   | DD                       |\n|      1440    |       256   |     360k   | DSDD                     |\n|      2048    |       256   |     512k   | hard disk                |\n|      4096    |       256   |       1M   | hard disk                |\n|      8192    |       256   |       2M   | hard disk                |\n|     16384    |       256   |       4M   | hard disk                |\n|     32768    |       256   |       8M   | hard disk                |\n|     65535    |       256   |      16M   | biggest possible image   |\n\nlsatr: List and extract contents of ATR images\n----------------------------------------------\n\nThis program list or extracts the contents of an Atari `ATR` disk image.\n\nThe supported formats are:\n\n- Atari DOS 1, single density.\n- Atari DOS 2.0, single and double density.\n- Atari DOS 2.5, enhanced density.\n- MyDOS, up to 16MB images.\n- SpartaDOS and BW-DOS, up to 16MB images.\n- LiteDOS 2.x and LiteDOS-SE.\n- BAS2BOOT images, extracts the BAS file inside.\n- Howfen DOS images, extracting the raw BOOT images.\n- K-file boot images, extracts the XEX file inside.\n\n\nUsage:\n\n    lsatr [options] filenames.atr\n\nOptions:\n\n- `-a`  Shows the listing in the same format of native Atari tools,\n        this is the file name separated by spaces to the file extension,\n        followed by the size, date and time (if available), and each\n        sub-directory in a separate listing.\n        Standard listing format shows the size, the date, time (if available)\n        and the full path at the end.\n\n- `-l`  Show or extract all filenames in lowercase.\n\n- `-x`  Extract all files in the current directory.\n\n- `-X`  Extract all files in the directory given as argument to the option. If\n        the directory does not exists, it will be created first.\n\n- `-h`  Shows a brief help.\n\n- `-v`  Shows version information.\n\nUsage Examples\n--------------\n\nTo create an image named `disk1.atr` with all the files in the \"atari\"\ndirectory:\n\n    mkatr disk1.atr atari/*\n\nTo create a bootable BW-DOS image with a hidden and protected DOS file inside\na subdirectory and a protected `startup.bat` file outside:\n\n    mkatr bwdos.atr dos/ -b +ph dos/xbw130.dos +p startup.bat\n\nTo create an image with only one file that will be loaded at boot:\n\n    mkatr game.atr -b mygame.com\n\nTo list the files inside an image:\n\n    lsatr bwdos.atr\n\nTo extract all files from the image to a folder `out`:\n\n    lsatr -X out/ bwdos.atr\n\nCompilation\n-----------\n\nCompile with `make` and copy the resulting `mkatr` and `lsatr` programs to your\nbin folder.\n\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/asm/boot128.asm",
    "content": "; Bootloader for 128byte sectors\n;\n        opt     h-\n\nDATA_INDEX      equ     $0043\nMAP_INDEX       equ     $0044\nIO_ADDRESS      equ     $0045\nIO_LENGTH       equ     $0047\nPTR             equ     $0049\n\nRUNAD           equ     $02E0\nINITAD          equ     $02E2\nDCB             equ     $0300\nICCOM           equ     $0342\nICSTA           equ     $0343\nICBAL           equ     $0344\nICBAH           equ     $0345\nICBLL           equ     $0348\nICBLH           equ     $0349\nICAX1           equ     $034A\nICAX2           equ     $034B\nCIOV            equ     $E456\nSIOV            equ     $E459\n\n\n; Specify BASE_ADDRESS in command line, as -d:BASE_ADDRESS=\\$2100\n;BASE_ADDRESS    equ     $2000\n\nMAP_BUFFER      equ     BASE_ADDRESS\nDATA_BUFFER     equ     BASE_ADDRESS + $80\nLOAD_ADDRESS    equ     BASE_ADDRESS + $100\n\n        org     LOAD_ADDRESS\n\n        .byte   0\n        .byte   3       ; Number of sectors to load\n        .word   LOAD_ADDRESS   ; Load address\n        .word   $0000\n        jmp     START   ; Jump to START (must be XX80 for SDX compatibility)\n\n        .word   $0000   ; MAIN DIR MAP SECTOR\n        .word   $0000   ; MAX SECTOR\n        .word   $0000   ; FREE SECTORS\n        .byte   $00     ; SECTORS PER BITMAP\n        .word   $0000   ; BITMAP START SECTOR\n        .word   $0000   ; LAST ALLOCATED FILE SECTOR\n        .word   $0000   ; LAST ALLOCATED DIR SECTOR\n        .byte   'DSKLABEL' ; DISK LABEL\n        .byte   40      ; NUMBER OF TRACKS\n        .byte   $80     ; SECTOR SIZE\n        .byte   $20     ; DISK FORMAT VERSION (2.0)\n        .byte   $00,$00,$00,$00,$00 ; RESERVED\n        .byte   $00     ; DISK SEQ NUMBER\n        .byte   $00     ; DISK RANDOM ID\nBOOT_MAP:\n        .word   $0000   ; BOOT FILE MAP SECTOR\n        .byte   $00,$00,$00,$00,$00,$00 ; RESERVED\n\nERROR_MSG:\n        .byte   'DOS Error', $9B\nERROR_MSG_LEN   equ     * - ERROR_MSG\n\nSIO_READ_BUF:\n        .if     >MAP_BUFFER != >DATA_BUFFER\n        .error  \"Error, MAP_BUFFER and DATA_BUFFER must be on same page\"\n        .endif\n        ldx     #>MAP_BUFFER\n\nSIO_READ:\n        sty     DCB+4           ; Store address\n        stx     DCB+5\n        sta     DCB+10          ; Store and check sector number\n        ora     DCB+11\n        beq     READ_BLANK      ; If sector == 0, read zeroes\n        lda     #$40\n        sta     DCB+3\n        jsr     SIOV\n        bpl     RTS_OK\n\nDOS_ERROR:\n        lda     #<ERROR_MSG\n        sta     ICBAL\n        .if     <ERROR_MSG < ERROR_MSG_LEN\n        .error  \"Error, low byte of message address should be bigger than message length\"\n        .endif\n        sta     ICBLL\n        lda     #>ERROR_MSG\n        sta     ICBAH\n        lda     #$09\n        sta     ICCOM\n        ldx     #$00\n        jsr     CIOV\n@loop:  jmp     @loop\n\nREAD_BLANK:\n        stx     PTR+1   ; Store destination address\n        sty     PTR\n        tay             ; A is already 0\n@copy:\n        sta     (PTR),y\n        iny\n        bpl     @copy\nRTS_OK:\n        rts\n\nGO_INITAD:\n        jmp     (INITAD)\n\nEND_LOAD:\n        jmp     (RUNAD)\n\n        ; START must be at $XX80\n        .align  $80, $ea\n        .if     START != LOAD_ADDRESS + $80\n        .error  \"Error, START symbol must be at $XX80, currently at \", START\n        .endif\nSTART:\n        ; Set index to end of sector data\n        lda     #$80\n        sta     MAP_INDEX\n        sta     DATA_INDEX\n        ; Set read size to sector size\n        sta     DCB+8\n        asl\n        sta     DCB+9\n\n        ; Read binary header: \"FF FF\"\n        jsr     GET_2_BYTES\n        inx\n        bne     DOS_ERROR\n        cmp     #$FF\n        bne     DOS_ERROR\n\n        ; Read first address, copy to RUNAD\n        jsr     GET_2_BYTES\n        sta     RUNAD\n        stx     RUNAD+1\n        jmp     FIRST_SEG\n\n        ; Reads a data block\nREAD_DATA_BLOCK:\n        ; Get start address\n        jsr     GET_2_BYTES\nFIRST_SEG:\n        sta     IO_ADDRESS\n        stx     IO_ADDRESS+1\n        ora     IO_ADDRESS+1\n        beq     END_LOAD\n\n        ; Skip $FFFF header in the middle of file\n        txa\n        and     IO_ADDRESS\n        cmp     #$FF\n        beq     READ_DATA_BLOCK\n\n        ; Get end address\n        jsr     GET_2_BYTES\n        sec\n        sbc     IO_ADDRESS\n        sta     IO_LENGTH\n        txa\n        sbc     IO_ADDRESS+1\n        sta     IO_LENGTH+1\n\n        ; Setup INITAD to an \"rts\" instruction.\n        lda     #<RTS_OK\n        sta     INITAD\n        lda     #>RTS_OK\n        sta     INITAD+1\n\n        ; Read data\n        jsr     GET_DATA\n        ; Execute INITAD\n        jsr     GO_INITAD\n        ; GO to next block\n        jmp     READ_DATA_BLOCK\n\nGET_2_BYTES:\n        jsr     GET_BYTE\n        pha\n        jsr     GET_BYTE\n        tax\n        pla\n        rts\n\n\nDEC_IO_LENGTH_1:\n        dec     IO_LENGTH+1\nDEC_IO_LENGTH:\n        dec     IO_LENGTH\n\nGET_DATA:\n        jsr     GET_BYTES\n        ldy     #$00\n        sta     (IO_ADDRESS),y\n        inc     IO_ADDRESS\n        bne     @skip\n        inc     IO_ADDRESS+1\n@skip:  lda     IO_LENGTH\n        bne     DEC_IO_LENGTH\n        lda     IO_LENGTH+1\n        bne     DEC_IO_LENGTH_1\n        rts\n\nGET_BYTE:\n        lda     #$00\n        sta     IO_LENGTH+1\n        sta     IO_LENGTH\nGET_BYTES:\n        ldx     DATA_INDEX\n        bmi     NEXT_SECTOR\nGET_BYTE_X:\n        lda     DATA_BUFFER,x\n        inx\n        stx     DATA_INDEX\n        rts\n\nGET_FULL_SECTOR:\n        ldy     IO_ADDRESS\n        ldx     IO_ADDRESS+1\n        jsr     SIO_READ\n        lda     IO_ADDRESS\n        eor     #$80\n        sta     IO_ADDRESS\n        bmi     @skip1\n        inc     IO_ADDRESS+1\n@skip1:\n        lda     IO_LENGTH\n        eor     #$80\n        sta     IO_LENGTH\n        bpl     @skip2\n        dec     IO_LENGTH+1\n@skip2:\n        ; Fall through\n;;;        jmp     NEXT_SECTOR\n\nNEXT_SECTOR:\n        ldy     MAP_INDEX\n        bmi     NEXT_MAP\nNEXT_SECTOR_Y:\n        lda     MAP_BUFFER,y\n        ldx     MAP_BUFFER+1,y\n        stx     DCB+11\n        iny\n        iny\n        sty     MAP_INDEX\n\n        ldy     IO_LENGTH+1\n        bne     GET_FULL_SECTOR\n        ldy     IO_LENGTH\n        bmi     GET_FULL_SECTOR\n        ldy     #<DATA_BUFFER\n        jsr     SIO_READ_BUF\n        ldx     #0\n        beq    GET_BYTE_X\n\nNEXT_MAP:\n        lda     BOOT_MAP\n        ldx     BOOT_MAP+1\n        stx     DCB+11\n        ldy     #<MAP_BUFFER\n        jsr     SIO_READ_BUF\n        lda     MAP_BUFFER\n        sta     BOOT_MAP\n        lda     MAP_BUFFER+1\n        sta     BOOT_MAP+1\n        ldy     #$04\n        bne     NEXT_SECTOR_Y\n\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/asm/boot128.h",
    "content": "#pragma once\n\n/*\n * Autogenerated file from boot128.asm\n * Do not edit.\n */\n\nstatic unsigned char boot128_bin[384] = {\n   0,   3,   0,  17,   0,   0,  76, 128,  17,   0,   0,   0,   0,   0,   0,   0,\n   0,   0,   0,   0,   0,   0,  68,  83,  75,  76,  65,  66,  69,  76,  40, 128,\n  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n  68,  79,  83,  32,  69, 114, 114, 111, 114, 155, 162,  16, 140,   4,   3, 142,\n   5,   3, 141,  10,   3,  13,  11,   3, 240,  36, 169,  64, 141,   3,   3,  32,\n  89, 228,  16,  36, 169,  48, 141,  68,   3, 141,  72,   3, 169,  17, 141,  69,\n   3, 169,   9, 141,  66,   3, 162,   0,  32,  86, 228,  76, 107,  17, 134,  74,\n 132,  73, 168, 145,  73, 200,  16, 251,  96, 108, 226,   2, 108, 224,   2, 234,\n 169, 128, 133,  68, 133,  67, 141,   8,   3,  10, 141,   9,   3,  32, 213,  17,\n 232, 208, 193, 201, 255, 208, 189,  32, 213,  17, 141, 224,   2, 142, 225,   2,\n  76, 166,  17,  32, 213,  17, 133,  69, 134,  70,   5,  70, 240, 206, 138,  37,\n  69, 201, 255, 240, 238,  32, 213,  17,  56, 229,  69, 133,  71, 138, 229,  70,\n 133,  72, 169, 120, 141, 226,   2, 169,  17, 141, 227,   2,  32, 227,  17,  32,\n 121,  17,  76, 163,  17,  32, 249,  17,  72,  32, 249,  17, 170, 104,  96, 198,\n  72, 198,  71,  32, 255,  17, 160,   0, 145,  69, 230,  69, 208,   2, 230,  70,\n 165,  71, 208, 237, 165,  72, 208, 231,  96, 169,   0, 133,  72, 133,  71, 166,\n  67,  48,  34, 189, 128,  16, 232, 134,  67,  96, 164,  69, 166,  70,  32,  60,\n  17, 165,  69,  73, 128, 133,  69,  48,   2, 230,  70, 165,  71,  73, 128, 133,\n  71,  16,   2, 198,  72, 164,  68,  48,  30, 185,   0,  16, 190,   1,  16, 142,\n  11,   3, 200, 200, 132,  68, 164,  72, 208, 208, 164,  71,  48, 204, 160, 128,\n  32,  58,  17, 162,   0, 240, 188, 173,  40,  17, 174,  41,  17, 142,  11,   3,\n 160,   0,  32,  58,  17, 173,   0,  16, 141,  40,  17, 173,   1,  16, 141,  41,\n  17, 160,   4, 208, 196,\n};\n\nstatic unsigned boot128_reloc[] = {\n  4,  9, 60, 94,110,144,154,163,166,184,201,207,210,213,216,220,230,262,273,300,303,323,330,333,341,344,347,350,353\n};\n\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/asm/boot256.asm",
    "content": "; Bootloader for 256byte sectors\n;\n        opt     h-\n\nDATA_INDEX      equ     $0043\nMAP_INDEX       equ     $0044\nIO_ADDRESS      equ     $0045\nIO_LENGTH       equ     $0047\nPTR             equ     $0049\n\nRUNAD           equ     $02E0\nINITAD          equ     $02E2\nDCB             equ     $0300\nICCOM           equ     $0342\nICSTA           equ     $0343\nICBAL           equ     $0344\nICBAH           equ     $0345\nICBLL           equ     $0348\nICBLH           equ     $0349\nICAX1           equ     $034A\nICAX2           equ     $034B\nCIOV            equ     $E456\nSIOV            equ     $E459\n\n\n; Specify BASE_ADDRESS in command line, as -d:BASE_ADDRESS=\\$2100\n;BASE_ADDRESS    equ     $2000\n\nMAP_BUFFER      equ     BASE_ADDRESS\nDATA_BUFFER     equ     BASE_ADDRESS + $100\nLOAD_ADDRESS    equ     BASE_ADDRESS + $200\n\n        org     LOAD_ADDRESS\n\n        .byte   0\n        .byte   3       ; Number of sectors to load\n        .word   LOAD_ADDRESS   ; Load address\n        .word   $0000\n        jmp     START   ; Jump to START (must be XX80 for SDX compatibility)\n\n        .word   $0000   ; MAIN DIR MAP SECTOR\n        .word   $0000   ; MAX SECTOR\n        .word   $0000   ; FREE SECTORS\n        .byte   $00     ; SECTORS PER BITMAP\n        .word   $0000   ; BITMAP START SECTOR\n        .word   $0000   ; LAST ALLOCATED FILE SECTOR\n        .word   $0000   ; LAST ALLOCATED DIR SECTOR\n        .byte   'DSKLABEL' ; DISK LABEL\n        .byte   40      ; NUMBER OF TRACKS\n        .byte   $80     ; SECTOR SIZE\n        .byte   $20     ; DISK FORMAT VERSION (2.0)\n        .byte   $00,$00,$00,$00,$00 ; RESERVED\n        .byte   $00     ; DISK SEQ NUMBER\n        .byte   $00     ; DISK RANDOM ID\nBOOT_MAP:\n        .word   $0000   ; BOOT FILE MAP SECTOR\n        .byte   $00,$00,$00,$00,$00,$00 ; RESERVED\n\nERROR_MSG:\n        .byte   'DOS Error', $9B\nERROR_MSG_LEN   equ     * - ERROR_MSG\n\nSIO_READ_BUF:\n        .if     <MAP_BUFFER != <DATA_BUFFER\n        .error  \"Error, MAP_BUFFER and DATA_BUFFER must be $XX00\"\n        .endif\n        ldy     #<MAP_BUFFER\n\nSIO_READ:\n        sty     DCB+4           ; Store address\n        stx     DCB+5\n        sta     DCB+10          ; Store and check sector number\n        ora     DCB+11\n        beq     READ_BLANK      ; If sector == 0, read zeroes\n        lda     #$40\n        sta     DCB+3\n        jsr     SIOV\n        bpl     RTS_OK\n\nDOS_ERROR:\n        lda     #<ERROR_MSG\n        sta     ICBAL\n        .if     <ERROR_MSG < ERROR_MSG_LEN\n        .error  \"Error, low byte of message address should be bigger than message length\"\n        .endif\n        sta     ICBLL\n        lda     #>ERROR_MSG\n        sta     ICBAH\n        lda     #$09\n        sta     ICCOM\n        ldx     #$00\n        jsr     CIOV\n@loop:  jmp     @loop\n\nREAD_BLANK:\n        stx     PTR+1   ; Store destination address\n        sty     PTR\n        tay             ; A is already 0\n@copy:\n        sta     (PTR),y\n        iny\n        bne     @copy\nRTS_OK:\n        rts\n\nGO_INITAD:\n        jmp     (INITAD)\n\nEND_LOAD:\n        jmp     (RUNAD)\n\n        ; START must be at $XX80\n        .align  $80, $ea\n        .if     START != LOAD_ADDRESS + $80\n        .error  \"Error, START symbol must be at $XX80, currently at \", START\n        .endif\nSTART:\n        ; Set index to end of sector data\n        ldx     #$0\n        stx     MAP_INDEX\n        stx     DATA_INDEX\n        ; Set read size to sector size\n        stx     DCB+8\n        inx\n        stx     DCB+9\n\n        ; Read binary header: \"FF FF\"\n        jsr     GET_2_BYTES\n        inx\n        bne     DOS_ERROR\n        cmp     #$FF\n        bne     DOS_ERROR\n\n        ; Read first address, copy to RUNAD\n        jsr     GET_2_BYTES\n        sta     RUNAD\n        stx     RUNAD+1\n        jmp     FIRST_SEG\n\n        ; Reads a data block\nREAD_DATA_BLOCK:\n        ; Get start address\n        jsr     GET_2_BYTES\nFIRST_SEG:\n        sta     IO_ADDRESS\n        stx     IO_ADDRESS+1\n        ora     IO_ADDRESS+1\n        beq     END_LOAD\n\n        ; Skip $FFFF header in the middle of file\n        txa\n        and     IO_ADDRESS\n        cmp     #$FF\n        beq     READ_DATA_BLOCK\n\n        ; Get end address\n        jsr     GET_2_BYTES\n        sec\n        sbc     IO_ADDRESS\n        sta     IO_LENGTH\n        txa\n        sbc     IO_ADDRESS+1\n        sta     IO_LENGTH+1\n\n        ; Setup INITAD to an \"rts\" instruction.\n        lda     #<RTS_OK\n        sta     INITAD\n        lda     #>RTS_OK\n        sta     INITAD+1\n\n        ; Read data\n        jsr     GET_DATA\n        ; Execute INITAD\n        jsr     GO_INITAD\n        ; GO to next block\n        jmp     READ_DATA_BLOCK\n\nGET_2_BYTES:\n        jsr     GET_BYTE\n        pha\n        jsr     GET_BYTE\n        tax\n        pla\n        rts\n\n\nDEC_IO_LENGTH_1:\n        dec     IO_LENGTH+1\nDEC_IO_LENGTH:\n        dec     IO_LENGTH\n\nGET_DATA:\n        jsr     GET_BYTES\n        ldy     #$00\n        sta     (IO_ADDRESS),y\n        inc     IO_ADDRESS\n        bne     @skip\n        inc     IO_ADDRESS+1\n@skip:  lda     IO_LENGTH\n        bne     DEC_IO_LENGTH\n        lda     IO_LENGTH+1\n        bne     DEC_IO_LENGTH_1\n        rts\n\nGET_BYTE:\n        lda     #$00\n        sta     IO_LENGTH+1\n        sta     IO_LENGTH\nGET_BYTES:\n        ldx     DATA_INDEX\n        beq     NEXT_SECTOR\nGET_BYTE_X:\n        lda     DATA_BUFFER,x\n        inc     DATA_INDEX\n        rts\n\nGET_FULL_SECTOR:\n        ldy     IO_ADDRESS\n        ldx     IO_ADDRESS+1\n        jsr     SIO_READ\n        inc     IO_ADDRESS+1\n        dec     IO_LENGTH+1\n\n        ; Fall through\n;;;        jmp     NEXT_SECTOR\n\nNEXT_SECTOR:\n        ldy     MAP_INDEX\n        beq     NEXT_MAP\nNEXT_SECTOR_Y:\n        lda     MAP_BUFFER,y\n        ldx     MAP_BUFFER+1,y\n        stx     DCB+11\n        iny\n        iny\n        sty     MAP_INDEX\n\n        ldy     IO_LENGTH+1\n        bne     GET_FULL_SECTOR\n        ldx     #>DATA_BUFFER\n        jsr     SIO_READ_BUF\n        ldx     #0\n        beq     GET_BYTE_X\n\nNEXT_MAP:\n        lda     BOOT_MAP\n        ldx     BOOT_MAP+1\n        stx     DCB+11\n        ldx     #>MAP_BUFFER\n        jsr     SIO_READ_BUF\n        lda     MAP_BUFFER\n        sta     BOOT_MAP\n        lda     MAP_BUFFER+1\n        sta     BOOT_MAP+1\n        ldy     #$04\n        bne     NEXT_SECTOR_Y\n\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/asm/boot256.h",
    "content": "#pragma once\n\n/*\n * Autogenerated file from boot256.asm\n * Do not edit.\n */\n\nstatic unsigned char boot256_bin[384] = {\n   0,   3,   0,  18,   0,   0,  76, 128,  18,   0,   0,   0,   0,   0,   0,   0,\n   0,   0,   0,   0,   0,   0,  68,  83,  75,  76,  65,  66,  69,  76,  40, 128,\n  32,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n  68,  79,  83,  32,  69, 114, 114, 111, 114, 155, 160,   0, 140,   4,   3, 142,\n   5,   3, 141,  10,   3,  13,  11,   3, 240,  36, 169,  64, 141,   3,   3,  32,\n  89, 228,  16,  36, 169,  48, 141,  68,   3, 141,  72,   3, 169,  18, 141,  69,\n   3, 169,   9, 141,  66,   3, 162,   0,  32,  86, 228,  76, 107,  18, 134,  74,\n 132,  73, 168, 145,  73, 200, 208, 251,  96, 108, 226,   2, 108, 224,   2, 234,\n 162,   0, 134,  68, 134,  67, 142,   8,   3, 232, 142,   9,   3,  32, 213,  18,\n 232, 208, 193, 201, 255, 208, 189,  32, 213,  18, 141, 224,   2, 142, 225,   2,\n  76, 166,  18,  32, 213,  18, 133,  69, 134,  70,   5,  70, 240, 206, 138,  37,\n  69, 201, 255, 240, 238,  32, 213,  18,  56, 229,  69, 133,  71, 138, 229,  70,\n 133,  72, 169, 120, 141, 226,   2, 169,  18, 141, 227,   2,  32, 227,  18,  32,\n 121,  18,  76, 163,  18,  32, 249,  18,  72,  32, 249,  18, 170, 104,  96, 198,\n  72, 198,  71,  32, 255,  18, 160,   0, 145,  69, 230,  69, 208,   2, 230,  70,\n 165,  71, 208, 237, 165,  72, 208, 231,  96, 169,   0, 133,  72, 133,  71, 166,\n  67, 240,  17, 189,   0,  17, 230,  67,  96, 164,  69, 166,  70,  32,  60,  18,\n 230,  70, 198,  72, 164,  68, 240,  26, 185,   0,  16, 190,   1,  16, 142,  11,\n   3, 200, 200, 132,  68, 164,  72, 208, 224, 162,  17,  32,  58,  18, 162,   0,\n 240, 209, 173,  40,  18, 174,  41,  18, 142,  11,   3, 162,  16,  32,  58,  18,\n 173,   0,  16, 141,  40,  18, 173,   1,  16, 141,  41,  18, 160,   4, 208, 200,\n};\n\nstatic unsigned boot256_reloc[] = {\n  4,  9, 94,110,144,154,163,166,184,201,207,210,213,216,220,230,262,272,283,286,299,302,309,312,317,320,323,326,329,332\n};\n\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/asm/get_boot.sh",
    "content": "#!/bin/sh\n# Assemble bootloaders and generate C code\n#\n\nBOOTASM=\"$1.asm\"\nBOOTBIN1=\"$1.10.bin\"\nBOOTBIN2=\"$1.20.bin\"\nBOOTH=\"$1.h\"\n\nif [ ! -f \"$BOOTASM\" ]; then\n    echo \"ERROR, specify bootloader file name\"\n    exit 1\nfi\n\n# Assemble at two different addresses:\nmads $BOOTASM -d:BASE_ADDRESS='$1000' -l -o:$BOOTBIN1\nmads $BOOTASM -d:BASE_ADDRESS='$2000' -l -o:$BOOTBIN2\n\n# Generate header file\ncat > $BOOTH <<EOF\n#pragma once\n\n/*\n * Autogenerated file from $BOOTASM\n * Do not edit.\n */\n\nstatic unsigned char $1_bin[384] = {\n$(od $BOOTBIN1 -An -tu1 -v | sed -e 's/\\([0-9][0-9]*\\)/\\1,/g')\n};\n\nstatic unsigned $1_reloc[] = {\n$(cmp -l $BOOTBIN1 $BOOTBIN2  |\n  sed -e 's/^\\( *[0-9][0-9]*\\).*$/\\1,/' |\n  sed -e ':a;N;s/\\n//;ta' |\n  sed -e 's/,$//' )\n};\n\nEOF\n\nrm -f $BOOTBIN1 $BOOTBIN2\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/atr.c",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Load ATR files.\n */\n\n#include \"atr.h\"\n#include \"msg.h\"\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n// Load disk image from file\nstruct atr_image *load_atr_image(const char *file_name)\n{\n    FILE *f = fopen(file_name, \"rb\");\n    if( !f )\n    {\n        show_error(\"can´t open disk image '%s': %s\", file_name, strerror(errno));\n        return 0;\n    }\n\n    // Get header\n    uint8_t hdr[16];\n    if( 1 != fread(hdr, 16, 1, f) )\n    {\n        show_error(\"%s: can´t read ATR header\", file_name);\n        fclose(f);\n        return 0;\n    }\n    if( hdr[0] != 0x96 || hdr[1] != 0x02 )\n    {\n        // Check if we can open as a raw SS/SD or SD/ED image\n        uint8_t *data = check_calloc(1, 128 * 1040 + 16);\n        // Move header\n        memcpy(data, hdr, 16);\n        // Read the rest of the file\n        size_t num = 16 + fread(data + 16, 1, 1040 * 128, f);\n        // Accept only exact sizes\n        if( num != 720 * 128 && num != 1040 * 128 )\n        {\n            show_error(\"%s: not an ATR image\", file_name);\n            fclose(f);\n            free(data);\n            return 0;\n        }\n        fclose(f);\n        struct atr_image *atr = check_malloc(sizeof(struct atr_image));\n        atr->data             = data;\n        atr->sec_size         = 128;\n        atr->sec_count        = num / 128;\n        return atr;\n    }\n    unsigned ssz = hdr[4] | (hdr[5] << 8);\n    if( ssz != 128 && ssz != 256 )\n    {\n        show_error(\"%s: unsupported ATR sector size (%d)\", file_name, ssz);\n        fclose(f);\n        return 0;\n    }\n    unsigned isz = (hdr[2] << 4) | (hdr[3] << 12) | (hdr[6] << 20);\n    // Some images store full size fo the first 3 sectors, others store\n    // 128 bytes for those:\n    unsigned pad_size    = isz % ssz == 0 ? 0 : (ssz - 128) * 3;\n    unsigned num_sectors = (isz + pad_size) / ssz;\n    if( isz >= 0x1000000 || num_sectors * ssz - pad_size != isz )\n    {\n        // If image size is invalid, assume sector padding:\n        pad_size    = 3 * (ssz - 128);\n        num_sectors = (isz + pad_size) / ssz;\n        if( num_sectors > 65535 )\n            num_sectors = 65535;\n        if( num_sectors < 3 )\n            show_error(\"%s: invalid ATR image size (%d), too small.\", file_name, isz);\n        show_msg(\"%s: invalid ATR image size (%d), rounding down to (%d)\", file_name, isz,\n                 num_sectors * ssz - pad_size);\n    }\n    // Allocate new storage\n    uint8_t *data = check_calloc(ssz, num_sectors);\n    // Read 3 first sectors\n    for( unsigned i = 0; i < num_sectors; i++ )\n    {\n        if( 1 != fread(data + ssz * i, (i < 3 && pad_size) ? 128 : ssz, 1, f) )\n        {\n            show_msg(\"%s: ATR file too short at sector %d\", file_name, i + 1);\n            break;\n        }\n    }\n    // Check that sector paddings are 0\n    if( ssz == 256 && num_sectors > 3 )\n    {\n        int chk = 0;\n        for( unsigned i = 0; i < 3; i++ )\n        {\n            chk = 0;\n            for( unsigned j = 0; j < 128; j++ )\n                chk += data[i * 256 + j + 128];\n            if( chk != 0 )\n            {\n                show_msg(\"%s: ATR suspect - sector %d has data over 128 bytes, fixing.\",\n                         file_name, i + 1);\n                break;\n            }\n        }\n        if( chk )\n        {\n            // Try to detect and fixing bad image\n            // Check zeros at end:\n            int chk1 = 0;\n            for( unsigned i = 0; i < 384; i++ )\n                chk1 += data[ssz * num_sectors - 384 + i];\n            // Check zeros after first 3 sectors:\n            int chk2 = 0;\n            for( unsigned i = 0; i < 384; i++ )\n                chk2 += data[384 + i];\n\n            if( !chk1 && chk2 )\n            {\n                memmove(data + 3 * 256, data + 3 * 128, ssz * (num_sectors - 3));\n                memmove(data + 2 * 256, data + 2 * 128, 128);\n                memmove(data + 1 * 256, data + 1 * 128, 128);\n            }\n            else if( !chk2 )\n            {\n                memmove(data + 3 * 256, data + 3 * 128, 128);\n                memmove(data + 2 * 256, data + 2 * 128, 128);\n                memmove(data + 1 * 256, data + 1 * 128, 128);\n            }\n            // Clear remaining space\n            memset(data + 2 * 256 + 128, 0, 128);\n            memset(data + 1 * 256 + 128, 0, 128);\n            memset(data + 0 * 256 + 128, 0, 128);\n        }\n    }\n    fclose(f);\n    // Ok, copy to image\n    struct atr_image *atr = check_malloc(sizeof(struct atr_image));\n    atr->data             = data;\n    atr->sec_size         = ssz;\n    atr->sec_count        = num_sectors;\n    return atr;\n}\n\nvoid atr_free(struct atr_image *atr)\n{\n    if( atr->data )\n        free((uint8_t *)(atr->data));\n    free(atr);\n}\n\nconst uint8_t *atr_data(const struct atr_image *atr, unsigned sector)\n{\n    if( sector < 1 || sector > atr->sec_count )\n        return 0;\n    else\n        return atr->data + (sector - 1) * atr->sec_size;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/atr.h",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Load ATR files.\n */\n#pragma once\n#include <stdint.h>\n\nstruct atr_image\n{\n    const uint8_t *data;\n    unsigned sec_size;\n    unsigned sec_count;\n};\n\nstruct atr_image *load_atr_image(const char *file_name);\nvoid atr_free(struct atr_image *atr);\nconst uint8_t *atr_data(const struct atr_image *atr, unsigned sector);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/compat.c",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Common compatibility functions.\n */\n#include <sys/stat.h>\n\nint compat_mkdir(const char *path)\n{\n#if( defined(_WIN32) || defined(__WIN32__) )\n    return mkdir(path);\n#else\n    return mkdir(path, 0777);\n#endif\n}\n\nint is_separator(char c)\n{\n#if( defined(_WIN32) || defined(__WIN32__) )\n    return c == '/' || c == '\\\\' || c == ':';\n#else\n    return c == '/';\n#endif\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/compat.h",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Common compatibility functions.\n */\n#pragma once\n\n// Checks if given character is a PATH separator\nint is_separator(char c);\n\n// Wrapper for mkdir\nint compat_mkdir(const char *path);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/crc32.c",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * CRC32\n */\n\n#include \"crc32.h\"\n\nconst unsigned crc_table[256] = {\n    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535,\n    0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd,\n    0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,\n    0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,\n    0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,\n    0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,\n    0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac,\n    0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,\n    0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab,\n    0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,\n    0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb,\n    0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,\n    0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce,\n    0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,\n    0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,\n    0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409,\n    0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,\n    0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739,\n    0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268,\n    0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0,\n    0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,\n    0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,\n    0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703,\n    0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,\n    0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,\n    0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae,\n    0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6,\n    0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,\n    0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,\n    0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5,\n    0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,\n    0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};\n\nunsigned crc32(unsigned crc, const uint8_t *buf, unsigned len)\n{\n    crc = crc ^ 0xffffffffL;\n    while( len-- )\n        crc = crc_table[(crc ^ (*buf++)) & 0xff] ^ (crc >> 8);\n    return crc ^ 0xffffffffL;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/crc32.h",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * CRC32\n */\n#pragma once\n#include <stdint.h>\n\nunsigned crc32(unsigned crc, const uint8_t *buf, unsigned len);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/darray.c",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\n#include \"darray.h\"\n#include \"msg.h\"\n#include <stdio.h>\n\nvoid darray_fill_ptr(void *arr, size_t sz, size_t init)\n{\n    darray(char) *ret = arr;\n    if( !ret )\n        memory_error();\n    ret->data = check_malloc(sz * init);\n    ret->len  = 0;\n    ret->size = init;\n}\n\nvoid *darray_alloc(size_t sz, size_t init)\n{\n    darray(char) *ret = check_malloc(sizeof(darray(char)));\n    darray_fill_ptr(ret, sz, init);\n    return ret;\n}\n\nvoid darray_grow(void *arr, size_t sz, size_t newsize)\n{\n    darray(char) *p = arr;\n    while( newsize > p->size )\n    {\n        p->size *= 2;\n        if( !p->size || !(p->data = check_realloc(p->data, sz * p->size)) )\n            memory_error();\n    }\n}\n\nvoid darray_free(void *arr)\n{\n    darray(char) *p = arr;\n    free(p->data);\n    free(p);\n}\n\nvoid darray_delete_ptr(void *arr)\n{\n    darray(char) *p = arr;\n    free(p->data);\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/darray.h",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n#pragma once\n\n#include <stdlib.h>\n// This code is inspired by \"darray.h\" by Joseph Adams <joeyadams3.14159@gmail.com>\n\n// Define a dynamic array with struct name, of the given element type.\n#define darray_struct(type, name)                                                        \\\n    struct name                                                                          \\\n    {                                                                                    \\\n        type *data;                                                                      \\\n        size_t len;                                                                      \\\n        size_t size;                                                                     \\\n    }\n\n// Define a dynamic array as unnamed struct, with the given element type.\n#define darray(type) darray_struct(type, )\n\n// Internal interface - don't call those directly.\nvoid darray_fill_ptr(void *, size_t, size_t);\nvoid *darray_alloc(size_t, size_t);\nvoid darray_grow(void *, size_t, size_t);\nvoid darray_delete_ptr(void *);\n\n// Allocate a new dynamic array of the given type with the given initial size\n#define darray_new(type, init_size) darray_alloc(sizeof(type), init_size)\n// Frees a dynamic array allocated with darray_new()\nvoid darray_free(void *);\n\n// Initialize an already allocated dynamic array with the given initial size\n#define darray_init(arr, init_size)                                                      \\\n    darray_fill_ptr(&(arr), sizeof((arr).data[0]), init_size)\n// Deallocates memory for a dynamic array initialized with darray_init()\n#define darray_delete(arr) darray_delete_ptr(&(arr))\n\n// Adds one element \"val\" to the dynamic array \"arr\".\n#define darray_add(arr, val)                                                             \\\n    do                                                                                   \\\n    {                                                                                    \\\n        darray_grow((arr), sizeof((arr)->data[0]), (arr)->len + 1);                      \\\n        (arr)->data[(arr)->len] = val;                                                   \\\n        (arr)->len++;                                                                    \\\n    } while( 0 )\n\n// Returns the current length (number of elements) of the dynamic array.\n#define darray_len(arr) ((arr)->len)\n\n// Access the i-eth element of the dynamic array.\n#define darray_i(arr, i) ((arr)->data[i])\n\n// Traverses all elements in the array\n#define darray_foreach(itm, arr)                                                         \\\n    for( (itm) = &darray_i(arr, 0); (itm) < &darray_i(arr, darray_len(arr)); (itm)++ )\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/disksizes.h",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n#pragma once\n\n// Standard disk sizes\nstatic struct\n{\n    int size;\n    int num;\n} sectors[] = {{128, 720},   //   720 sectors of 128 bytes, 90k  (SD)\n               {128, 1040},  //  1040 sectors of 128 bytes, 130k (ED)\n               {256, 720},   //   720 sectors of 256 bytes, 180k (DD)\n               {256, 1440},  //  1440 sectors of 256 bytes, 360k (HD)\n               {256, 2048},  //  2048 sectors of 256 bytes, 512k (hard disk)\n               {256, 4096},  //  4096 sectors of 256 bytes,   1M (hard disk)\n               {256, 8192},  //  8192 sectors of 256 bytes,   2M (hard disk)\n               {256, 16384}, // 16384 sectors of 256 bytes,   4M (hard disk)\n               {256, 32768}, // 32768 sectors of 256 bytes,   8M (hard disk)\n               {256, 65535}, // 65536 sectors of 256 bytes,  16M (biggest possible image)\n               {0, 0}};\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/flist.c",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Manages the list of files & directories\n */\n#include \"flist.h\"\n#include \"msg.h\"\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\nstatic char *read_file(const char *fname, size_t size)\n{\n    char *data;\n    FILE *f = fopen(fname, \"rb\");\n    if( !f )\n        show_error(\"can't open file '%s': %s\", fname, strerror(errno));\n    data = check_malloc(size);\n    if( size != fread(data, 1, size, f) )\n        show_error(\"error reading file '%s': %s\", fname, strerror(errno));\n    fclose(f);\n    return data;\n}\n\n// Checks if given character is a PATH separator\nstatic int is_separator(char c)\n{\n#ifdef _WIN32\n    return c == '/' || c == '\\\\' || c == ':';\n#else\n    return c == '/';\n#endif\n}\n\nstatic char *atari_name(const char *fname)\n{\n    // Convert to 8+3 filename\n    char *out = strdup(\"           \");\n    if( !out )\n        memory_error();\n\n    // Search last part of filename (similar to \"basename\")\n    const char *in, *p;\n    in = p = fname;\n    while( p[0] && p[1] )\n    {\n        while( is_separator(p[0]) && p[1] )\n            p++;\n        if( p[0] && !is_separator(p[0]) )\n            in = p;\n        while( p[0] && !is_separator(p[0]) )\n            p++;\n    }\n\n    // Copy up to 8 characters\n    int pos = 0, dot = 0;\n    while( *in )\n    {\n        char c = *in++;\n        if( !c )\n            break;\n        else if( c == '.' && !dot )\n        {\n            pos = 8;\n            dot = 1;\n            continue;\n        }\n        else if( pos > 7 && !dot )\n            continue;\n        else if( pos > 10 )\n            break;\n        else if( is_separator(c) )\n            break;\n        else if( c >= 'a' && c <= 'z' )\n            out[pos] = c - 'a' + 'A';\n        else if( (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') )\n            out[pos] = c;\n        else\n            out[pos] = '_';\n        pos++;\n    }\n    return out;\n}\n\nstatic char *path_name(const char *dir, const char *name)\n{\n    size_t n  = strlen(dir);\n    char *ret = check_malloc(n + 14);\n    strcpy(ret, dir);\n    ret[n++] = '>';\n    int i;\n    for( i = 0; i < 11; i++ )\n    {\n        if( name[i] != ' ' )\n        {\n            if( i == 8 )\n                ret[n++] = '.';\n            ret[n++] = name[i];\n        }\n    }\n    ret[n] = 0;\n    return ret;\n}\n\nvoid flist_add_main_dir(file_list *flist)\n{\n    // Creates MAIN directory\n    struct afile *dir = check_malloc(sizeof(struct afile));\n    // Convert time to broken time\n    time_t ttim    = time(0);\n    struct tm *tim = localtime(&ttim);\n\n    dir->date[0]   = tim->tm_mday;\n    dir->date[1]   = tim->tm_mon + 1;\n    dir->date[2]   = tim->tm_year % 100;\n    dir->time[0]   = tim->tm_hour;\n    dir->time[1]   = tim->tm_min;\n    dir->time[2]   = tim->tm_sec;\n    dir->fname     = \"\";\n    dir->aname     = \"MAIN       \";\n    dir->pname     = \"\";\n    dir->dir       = 0;\n    dir->size      = 23;\n    dir->is_dir    = 1;\n    dir->boot_file = 0;\n    dir->data      = check_malloc(SFS_MAX_DIR_SIZE);\n    dir->level     = 0;\n\n    darray_add(flist, dir);\n}\n\nvoid flist_add_file(file_list *flist, const char *fname, int boot_file,\n                    enum fattr attribs)\n{\n    struct stat st;\n\n    if( 0 != stat(fname, &st) )\n        show_error(\"reading input file '%s': %s\", fname, strerror(errno));\n\n    if( S_ISREG(st.st_mode) || S_ISDIR(st.st_mode) )\n    {\n        struct afile *f = check_malloc(sizeof(struct afile));\n\n        // Search in the file list if the path is inside an added directory\n        struct afile *dir = 0, **ptr;\n        darray_foreach(ptr, flist)\n        {\n            struct afile *af = *ptr;\n            if( af->is_dir && fname == strstr(fname, af->fname) &&\n                (!dir || strlen(dir->fname) < strlen(af->fname)) )\n                dir = af;\n        }\n\n        if( !dir )\n            show_error(\"internal error - no main directory\");\n\n        // Convert time to broken time\n        struct tm *tim = localtime(&st.st_mtime);\n\n        f->date[0] = tim->tm_mday;\n        f->date[1] = tim->tm_mon + 1;\n        f->date[2] = tim->tm_year % 100;\n        f->time[0] = tim->tm_hour;\n        f->time[1] = tim->tm_min;\n        f->time[2] = tim->tm_sec;\n        f->fname   = fname;\n        f->aname   = atari_name(fname);\n        f->pname   = path_name(dir->pname, f->aname);\n        f->dir     = dir;\n        f->level   = dir->level + 1;\n        f->attribs = attribs;\n\n        if( !f->aname || !strcmp(f->aname, \"           \") )\n            show_error(\"can't add file/directory named '%s'\", fname);\n\n        // Search for repeated files\n        darray_foreach(ptr, flist)\n        {\n            struct afile *af = *ptr;\n            if( af->dir == f->dir && !strncmp(af->aname, f->aname, 11) )\n                show_error(\"repeated file/directory named '%s'\", f->pname);\n        }\n\n        if( S_ISDIR(st.st_mode) )\n        {\n            f->size      = 23;\n            f->is_dir    = 1;\n            f->boot_file = 0;\n            f->data      = check_malloc(SFS_MAX_DIR_SIZE);\n\n            show_msg(\"added dir  '%-20s', from '%s'.\", f->pname, f->fname);\n        }\n        else\n        {\n            if( st.st_size > 0x1000000 )\n                show_error(\"file size too big '%s'\", fname);\n\n            f->size      = st.st_size;\n            f->is_dir    = 0;\n            f->boot_file = boot_file;\n            f->data      = read_file(f->fname, f->size);\n\n            show_msg(\"added file '%-20s', %5ld bytes, from '%s'%s%s%s%s.\", f->pname,\n                     (long)f->size, f->fname, attribs & at_protected ? \", +p\" : \"\",\n                     attribs & at_hidden ? \", +h\" : \"\",\n                     attribs & at_archived ? \", +a\" : \"\", boot_file ? \", (boot)\" : \"\");\n        }\n        darray_add(flist, f);\n    }\n    else\n        show_error(\"invalid file type '%s'\", fname);\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/flist.h",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * List of files to add.\n */\n#pragma once\n\n#include \"darray.h\"\n\n/* File attributes */\nenum fattr\n{\n    at_protected = 1,\n    at_hidden    = 2,\n    at_archived  = 4\n};\n\n/* One file or directory */\nstruct afile\n{\n    const char *fname;\n    const char *aname;\n    const char *pname; // Full path name\n    char *data;\n    size_t size;\n    struct afile *dir; // Parent directory\n    int level;         // Level inside directory structure, 0 = root\n    int is_dir;\n    enum fattr attribs;\n    int boot_file;\n    int map_sect;\n    char date[3];\n    char time[3];\n};\n\n/* Max directory size in bytes, 32kb */\n#define SFS_MAX_DIR_SIZE 32768\n\ntypedef darray(struct afile *) file_list;\n\nvoid flist_add_main_dir(file_list *flist);\nvoid flist_add_file(file_list *flist, const char *fname, int boot_file,\n                    enum fattr attribs);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lsatr.c",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Loads an ATR with a SpartaDOS file-system and list contents.\n */\n#include \"atr.h\"\n#include \"compat.h\"\n#include \"lsdos.h\"\n#include \"lsextra.h\"\n#include \"lshowfen.h\"\n#include \"lssfs.h\"\n#include \"msg.h\"\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n//---------------------------------------------------------------------\nstatic void show_usage(void)\n{\n    printf(\"Usage: %s [options] <atr_image_file>\\n\"\n           \"Options:\\n\"\n           \"\\t-a\\tShow listing in Atari instead of UNIX format.\\n\"\n           \"\\t-l\\tConvert filenames to lower-case.\\n\"\n           \"\\t-x\\tExtract listed files to current path.\\n\"\n           \"\\t-X path\\tExtract listed files to given path.\\n\"\n           \"\\t-h\\tShow this help.\\n\"\n           \"\\t-v\\tShow version information.\\n\",\n           prog_name);\n    exit(EXIT_SUCCESS);\n}\n\n//---------------------------------------------------------------------\nint main(int argc, char **argv)\n{\n    const char *atr_name = 0;\n    const char *ext_path = 0;\n    int lower_case       = 0;\n    int atari_list       = 0;\n    int extract_files    = 0;\n    prog_name            = argv[0];\n    for( int i = 1; i < argc; i++ )\n    {\n        char *arg = argv[i];\n        if( arg[0] == '-' )\n        {\n            char op;\n            while( 0 != (op = *++arg) )\n            {\n                if( op == 'h' || op == '?' )\n                    show_usage();\n                else if( op == 'l' )\n                    lower_case = 1;\n                else if( op == 'a' )\n                    atari_list = 1;\n                else if( op == 'x' )\n                    extract_files = 1;\n                else if( op == 'X' )\n                {\n                    if( i + 1 >= argc )\n                        show_opt_error(\"option '-X' needs an argument\");\n                    i++;\n                    extract_files = 1;\n                    ext_path      = argv[i];\n                }\n                else if( op == 'v' )\n                    show_version();\n                else\n                    show_opt_error(\"invalid command line option '-%c'\", op);\n            }\n        }\n        else if( !atr_name )\n            atr_name = arg;\n        else\n            show_opt_error(\"multiple ATR files in command line\");\n    }\n    if( !atr_name )\n        show_opt_error(\"ATR file name expected\");\n\n    if( extract_files && atari_list )\n        show_opt_error(\"options '-x' and '-a' not compatible\");\n\n    // Load ATR image file\n    struct atr_image *atr = load_atr_image(atr_name);\n\n    // Open target directory\n    if( ext_path && chdir(ext_path) )\n    {\n        // If path does not exists, check if we can make it\n        if( errno == ENOENT )\n        {\n            // Try to create the path\n            show_msg(\"creating output path '%s'.\", ext_path);\n            if( compat_mkdir(ext_path) || chdir(ext_path) )\n                show_error(\"can't create path, '%s': %s\", ext_path, strerror(errno));\n        }\n        else\n            show_error(\"%s: invalid extract path, %s\", ext_path, strerror(errno));\n    }\n\n    int e = sfs_read(atr, atr_name, atari_list, lower_case, extract_files);\n    if( e )\n        e = howfen_read(atr, atr_name, atari_list, lower_case, extract_files);\n    if( e )\n        e = dos_read(atr, atr_name, atari_list, lower_case, extract_files);\n    if( e )\n        e = extra_read(atr, atr_name, atari_list, lower_case, extract_files);\n    if( e )\n        show_msg(\"%s: ATR image format not supported.\", atr_name);\n    atr_free(atr);\n\n    return e;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lsdos.c",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Reads a DOS 2 or DOS 2.5 file-system.\n */\n#define _GNU_SOURCE\n#include \"lsdos.h\"\n#include \"atr.h\"\n#include \"compat.h\"\n#include \"msg.h\"\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <time.h>\n#include <unistd.h>\n#include <utime.h>\n\n//---------------------------------------------------------------------\n// Global state\nstruct lsdos\n{\n    struct atr_image *atr;\n    int atari_list;\n    int lower_case;\n    int extract_files;\n    int dir_size;\n    int ldos_csize;\n    int fix_bibo;\n};\n\n//---------------------------------------------------------------------\nstatic uint16_t read16(const uint8_t *p)\n{\n    return p[0] | (p[1] << 8);\n}\n\n// Read data and write a UNIX filename and an \"Atari\" filename.\nstatic unsigned get_name(char *name, char *aname, const uint8_t *data, int max,\n                         int lower_case)\n{\n    unsigned l = 0;\n    int dot    = 0;\n    memset(aname, ' ', max + 1);\n    aname[max + 1] = 0;\n    for( int i = 0; i < max; i++ )\n    {\n        uint8_t c = data[i];\n        if( (c >= 0xB0 && c <= 0xB9) || (c >= 0xC1 && c <= 0xDA) ||\n            (c >= 0xE1 && c <= 0xFA) )\n            c = c & 0x7F;\n        if( c >= 'A' && c <= 'Z' && lower_case )\n            c = c - 'A' + 'a';\n        if( c < ' ' || c == '/' || c == '.' || c == '?' || c == '\\\\' || c == 96 ||\n            c > 'z' )\n            c = '_';\n        else if( c == ' ' )\n            continue;\n        if( i > 7 && !dot )\n        {\n            dot       = 1;\n            name[l++] = '.';\n        }\n        name[l++]      = c;\n        aname[i + dot] = c;\n    }\n    name[l] = 0;\n    return l;\n}\n\n// Read up to size bytes from file at given map sector\nstatic unsigned read_file(struct atr_image *atr, unsigned sect, unsigned size,\n                          uint8_t *data, int dos2, int mdos)\n{\n    // To avoid circular references, keep a bitmap with all the sectors already used\n    uint8_t *visited = check_calloc(65536, 1);\n    unsigned lst     = atr->sec_size - 3;\n    unsigned pos     = 0;\n    while( sect )\n    {\n        const uint8_t *m = atr_data(atr, sect);\n        if( sect < 2 || !m )\n        {\n            show_msg(\"invalid sector link\");\n            break;\n        }\n        unsigned len  = m[lst + 2];\n        unsigned link = (m[lst] << 8) | m[lst + 1];\n\n        // DOS 1.0, only last sector has a size field\n        if( !dos2 && !mdos )\n        {\n            len  = (len & 0x80) ? len & 0x7F : lst;\n            link = (len & 0x80) ? 0 : link;\n        }\n        // Only MyDOS stores full sector number\n        if( !mdos || atr->sec_count < 1023 )\n            link = link & 0x3FF;\n\n        if( visited[sect & 0xFFFF] )\n        {\n            show_msg(\"loop in sector link at sector %d\", sect);\n            break;\n        }\n        else\n            visited[sect & 0xFFFF] = 1;\n\n        if( size > pos )\n        {\n            unsigned rem = size - pos > len ? len : size - pos;\n            memcpy(data + pos, m, rem);\n        }\n        pos += len;\n        sect = link;\n    }\n    free(visited);\n    return pos;\n}\n\nstatic const uint8_t *dir_data(struct lsdos *ls, unsigned dir, unsigned fn)\n{\n    if( ls->ldos_csize )\n    {\n        int cluster = dir / ls->ldos_csize;\n        int pos     = (dir + fn / 8) % ls->ldos_csize;\n        int sector  = cluster * ls->ldos_csize + pos;\n        return atr_data(ls->atr, sector);\n    }\n    else if( ls->fix_bibo )\n    {\n        const uint8_t *data = atr_data(ls->atr, dir + fn / 16);\n        return fn & 8 ? data + 0x80 : data;\n    }\n    else\n        return atr_data(ls->atr, dir + fn / 8);\n}\n\nstatic void read_dir(struct lsdos *ls, unsigned dir, const char *name)\n{\n    unsigned ssize = ls->atr->sec_size;\n\n    if( ls->atari_list )\n        printf(\"Directory of %s\\n\\n\", *name ? name : \"/\");\n\n    for( int fn = 0; fn < ls->dir_size; fn++ )\n    {\n        const uint8_t *data = dir_data(ls, dir, fn);\n        if( !data )\n            break;\n        const uint8_t *entry = data + (fn & 7) * 16;\n        int flags            = entry[0];\n        unsigned size        = read16(entry + 1);\n        unsigned sect        = read16(entry + 3);\n        if( !flags ) // End of directory\n            break;\n        if( flags & 0x80 ) // Deleted\n            continue;\n        char fname[32], aname[32];\n        if( !get_name(fname, aname, entry + 5, 11, ls->lower_case) || !*fname )\n        {\n            show_msg(\"%s: invalid file name, skip\", name);\n            continue;\n        }\n        if( sect < 2 )\n        {\n            show_msg(\"%s: invalid file sector, skip\", name);\n            continue;\n        }\n        char *new_name;\n        asprintf(&new_name, \"%s/%s\", name, fname);\n\n        if( flags == 0x10 )\n        {\n            if( ls->extract_files )\n            {\n                struct stat st;\n                const char *path = new_name + 1;\n                fprintf(stderr, \"%s/\\n\", path);\n                // Check if directory already exists:\n                if( stat(path, &st) || !S_ISDIR(st.st_mode) )\n                {\n                    // Create new directory\n                    if( compat_mkdir(path) )\n                        show_error(\"%s: can´t create directory, %s\", path,\n                                   strerror(errno));\n                }\n                // Extract files inside\n                read_dir(ls, sect, new_name);\n            }\n            else if( ls->atari_list )\n            {\n                // Print entry, but don´t recurse\n                printf(\"%-12s  <DIR>\\n\", aname);\n            }\n            else\n            {\n                printf(\"%8u\\t\\t%s/\\n\", size * ssize, new_name);\n                read_dir(ls, sect, new_name);\n            }\n        }\n        else if( 0 != (flags & 0x41) )\n        {\n            int mdos       = flags & 0x04;\n            int dos2       = flags & 0x02;\n            int max_size   = size * ssize;\n            uint8_t *fdata = check_malloc(max_size);\n            unsigned fsize = 0;\n            // Skip files of size 0\n            if( max_size > 0 )\n            {\n                fsize = read_file(ls->atr, sect, max_size, fdata, dos2, mdos);\n                if( fsize > max_size )\n                    show_msg(\"%s: file too long in disk\", new_name);\n            }\n            if( ls->extract_files )\n            {\n                struct stat st;\n                const char *path = new_name + 1;\n                fprintf(stderr, \"%s\\n\", path);\n                // Check if file already exists:\n                if( 0 == stat(path, &st) )\n                    show_error(\"%s: file already exists.\", path);\n                // Create new file\n                int fd = creat(path, 0666);\n                if( fd == -1 )\n                    show_error(\"%s: can´t create file, %s\", path, strerror(errno));\n                if( fsize != write(fd, fdata, fsize) )\n                    show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n                if( close(fd) )\n                    show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n            }\n            else if( ls->atari_list )\n                printf(\"%-12s %7u\\n\", aname, fsize);\n            else\n                printf(\"%8u\\t\\t%s\\n\", fsize, new_name);\n            free(fdata);\n        }\n        else\n        {\n            show_msg(\"%s: invalid file type %02x\", new_name, flags);\n        }\n        free(new_name);\n    }\n    // traverse dir again if listing in Atari format, to show sub directories\n    if( ls->atari_list )\n    {\n        printf(\"\\n\");\n        for( int fn = 0; fn < ls->dir_size; fn++ )\n        {\n            const uint8_t *data = dir_data(ls, dir, fn);\n            if( !data )\n                break;\n            const uint8_t *entry = data + (fn & 7) * 16;\n            int flags            = entry[0];\n            unsigned sect        = read16(entry + 3);\n            if( !flags )\n                break;          // End of directory\n            if( flags != 0x10 ) // Not directory\n                continue;\n\n            char fname[32], aname[32];\n            if( !get_name(fname, aname, entry + 5, 11, ls->lower_case) || !*fname )\n                continue;\n            char *new_name;\n            asprintf(&new_name, \"%s/%s\", name, fname);\n            read_dir(ls, sect, new_name);\n            free(new_name);\n        }\n    }\n}\n\n// Detect Bibo-DOS directory format, it uses the full sector in DD for the\n// directory data, instead of the first 128 bytes of MyDOS and DOS 2.0D.\n// Note that Bibo-DOS 7.0 fixes this, so it will be detected ad MyDOS.\nint detect_bibo(struct atr_image *atr, int dir_sect)\n{\n    const uint8_t *data = atr_data(atr, dir_sect);\n    if( !data )\n        return 0;\n\n    // Check if this directory has any entries above 128 bytes\n    for( int i = 0; i < 16; i++ )\n    {\n        int flags = data[i * 16];\n        // End of directory?\n        if( !flags )\n            break;\n        // Invalid entry?\n        if( 0 == (flags & 0xC1) )\n            continue;\n        if( flags == 0xFF )\n            continue;\n        int siz = read16(data + i * 16 + 1);\n        int sec = read16(data + i * 16 + 3);\n        if( sec < 1 || sec > atr->sec_count || siz < 1 || siz + 12 > atr->sec_count )\n            continue;\n        // Valid and more than 7, it is Bibo-DOS\n        if( i > 7 )\n            return 1;\n    }\n\n    // Bibo-DOS does not support sub-directories, so we only need to examine\n    // the main directory.\n    return 0;\n}\n\nint dos_read(struct atr_image *atr, const char *atr_name, int atari_list, int lower_case,\n             int extract_files)\n{\n    // Check DOS filesystem\n    // Read VTOC\n    const uint8_t *vtoc = atr_data(atr, 360);\n    if( !vtoc )\n        return 1;\n\n    unsigned signature  = vtoc[0];\n    unsigned alloc_sect = read16(vtoc + 1);\n    unsigned free_sect  = read16(vtoc + 3);\n    unsigned bitmap_0   = vtoc[10]; // Bitmap for sectors 0 to 7\n    unsigned bitmap_360 = vtoc[55]; // Bitmap for sectors 360 to 367\n    unsigned dir_size   = 64;       // Entries per directory\n    unsigned ldos_csize = 0;        // LiteDOS cluster size\n    unsigned fix_bibo   = 0;        // Fix Bibo-DOS DD directories.\n    char *bad_sig       = \"\";       // Message for corrected bad signature\n\n    // Calculate signature for MyDOS image format:\n    unsigned mydos_sig = 2;\n    if( (atr->sec_size == 128 && atr->sec_count > 943) ||\n        (atr->sec_size == 256 && atr->sec_count > 1023) )\n        mydos_sig = 2 + (atr->sec_count / 8 + 266) / 256;\n\n    // Check for LiteDOS\n    if( signature & 0x80 )\n    {\n        // Check rest of signature\n        if( memcmp(vtoc + 3, \"LiteDOS\", 7) )\n            return 1;\n        free_sect  = read16(vtoc + 0x71);\n        ldos_csize = 1 + (signature & 0x7F);\n        dir_size   = 8 * ldos_csize - 8;\n    }\n    else if( 0x40 == (signature & 0xC0) )\n    {\n        // Check rest of signature\n        if( memcmp(vtoc + 5, \"\\0\\0\\0\\0\\0\", 5) )\n            return 1;\n        if( bitmap_0 & 0x80 )\n            return 1;\n        ldos_csize = 2 + 2 * (signature & 0x3F);\n        dir_size   = 8 * ldos_csize - 8;\n    }\n    else\n    {\n        // Check for malformed signatures\n        if( !signature )\n        {\n            if( 0 != (bitmap_0 & 0xC0) || 0 != (bitmap_360 & 0xC0) )\n                return 1;\n            if( memcmp(vtoc + 5, \"\\0\\0\\0\\0\\0\", 5) )\n                return 1;\n            if( atr->sec_count > 720 || free_sect > alloc_sect ||\n                (alloc_sect < 707 || alloc_sect > 709) )\n                return 1;\n            // Assume DOS 2\n            signature = alloc_sect != 709 ? 2 : 1;\n            bad_sig   = \" (with bad signature)\";\n        }\n        // Detect MyDOS images with bad signature, this happens in 720 DD images\n        if( signature == 3 && mydos_sig == 2 &&\n            ((alloc_sect == 707 && atr->sec_size == 128) ||\n             (alloc_sect == 708 && atr->sec_size == 256)) )\n        {\n            // Detect as MyDOS signature to 3\n            mydos_sig = 3;\n            bad_sig   = \" (with bad signature)\";\n        }\n        // Patch bad VTOC\n        if( !*bad_sig && signature == 2 && (alloc_sect == 707 || alloc_sect == 708) &&\n            alloc_sect >= free_sect && 0 != (bitmap_0 & 0xF0) )\n        {\n            bitmap_0 &= 0x0F;\n            bitmap_360 = 0x7F;\n            bad_sig    = \" (with bad VTOC)\";\n        }\n\n        if( (signature == 1 && atr->sec_size != 128) ||  // DOS 1 only supports SD,\n            (signature == 1 && atr->sec_count > 720) ||  // 720 sectors of 128 bytes.\n            (signature > 2 && signature != mydos_sig) || // MyDOS signature for >944 secs\n            (signature == 2 && atr->sec_count > 1120) || // DOS 2.x only up to 1040\n                                                         // sectors, but there are images\n                                                         // with 1120 sectors.\n            0 != (bitmap_0 & 0x80) )                     // Sector 0 allocated\n        {\n            return 1;\n        }\n        // DOS 1 bitmap should reserve sector 1, DOS 2 reserves 1, 2 and 3\n        if( 0 != (bitmap_0 & 0xC0) || (signature == 2 && 0 != (bitmap_0 & 0xF0)) ||\n            0 != (bitmap_360 & 0x80) )\n        {\n            show_msg(\"%s: invalid DOS file system, bitmap not ok.\", atr_name);\n            return 1;\n        }\n    }\n\n    if( alloc_sect > atr->sec_count )\n        show_msg(\"%s: DOS sectors (%d) more than ATR image (%d).\", atr_name, alloc_sect,\n                 atr->sec_count);\n    if( free_sect > alloc_sect )\n        show_msg(\"%s: DOS free sectors more than allocated.\", atr_name);\n\n    const char *dosver = \"DOS 1\";\n    if( signature == 2 && atr->sec_count > 943 )\n        dosver = \"DOS 2.5\";\n    else if( signature == 2 && atr->sec_size == 128 )\n        dosver = \"DOS 2.0s\";\n    else if( signature == 2 )\n        dosver = \"DOS 2.0D\";\n    else if( signature & 0x80 )\n        dosver = \"LiteDOS\";\n    else if( signature & 0x40 )\n        dosver = \"LiteDOS-SE\";\n    else if( signature > 2 )\n        dosver = \"MyDOS\";\n\n    if( atr->sec_size == 256 && !ldos_csize && detect_bibo(atr, 361) )\n    {\n        dosver   = \"Bibo-DOS\";\n        fix_bibo = 1;\n    }\n\n    if( atari_list )\n        printf(\"ATR image: %s\\n\"\n               \"Image size: %u sectors of %u bytes\\n\"\n               \"DOS size: %u sectors free of %u total\\n\"\n               \"Volume: %s%s\\n\",\n               atr_name, atr->sec_count, atr->sec_size, free_sect, alloc_sect, dosver,\n               bad_sig);\n    else\n        printf(\"%s: %u sectors of %u bytes, %s%s, %d sectors free of %d total.\\n\",\n               atr_name, atr->sec_count, atr->sec_size, dosver, bad_sig, free_sect,\n               alloc_sect);\n\n    struct lsdos *ls  = check_malloc(sizeof(struct lsdos));\n    ls->atr           = atr;\n    ls->atari_list    = atari_list;\n    ls->lower_case    = lower_case;\n    ls->extract_files = extract_files;\n    ls->dir_size      = dir_size;\n    ls->ldos_csize    = ldos_csize;\n    ls->fix_bibo      = fix_bibo;\n    read_dir(ls, 361, \"\");\n\n    free(ls);\n    return 0;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lsdos.h",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Reads an Atari DOS file-system.\n */\n#pragma once\n#include \"atr.h\"\n\nint dos_read(struct atr_image *atr, const char *atr_name, int atari_list, int lower_case,\n             int extract_files);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lsextra.c",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Extracts various simple boot formats.\n */\n#define _GNU_SOURCE\n#include \"crc32.h\"\n#include \"lsextra.h\"\n#include \"msg.h\"\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\n\n\nstatic unsigned get_name(char *name, char *aname, const uint8_t *data, int max,\n                         int lower_case)\n{\n    unsigned l = 0;\n    unsigned a = 0;\n    int dot    = 0;\n    memset(aname, ' ', max + 1);\n    aname[max + 1] = 0;\n    for( int i = 0; i < max; i++ )\n    {\n        uint8_t c = data[i];\n        if( c >= 'A' && c <= 'Z' && lower_case )\n            c = c - 'A' + 'a';\n        if( c == '.' )\n        {\n            // Store dot\n            dot       = 1;\n            name[l++] = c;\n            while( a < 8 )\n                aname[a++] = ' ';\n            continue;\n        }\n        if( c < ' ' || c == '/' || c == '.' || c == '?' || c == '\\\\' || c == 96 ||\n            c > 'z' )\n            c = '_';\n        else if( c == ' ' )\n            continue;\n        if( i > 7 && !dot )\n        {\n            dot        = 1;\n            name[l++]  = '.';\n            aname[a++] = ' ';\n        }\n        name[l++]  = c;\n        aname[a++] = c;\n    }\n    name[l] = 0;\n    return l;\n}\n\nstatic uint16_t read16(const uint8_t *p)\n{\n    return (p == NULL) ? 0 : (p[0] | (p[1] << 8));\n}\n\nstatic int check_bas2boot(struct atr_image *atr)\n{\n    // BAS2BOOT only supports 128 bytes per sector, and we must have\n    // at least one data sector\n    if( atr->sec_size != 128 || atr->sec_count < 2 )\n        return 0;\n\n    const uint8_t *sec1 = atr_data(atr, 1);\n    const uint8_t *sec2 = atr_data(atr, 2);\n\n    // Check boot count == 2 and load address == $700\n    if( read16(sec1) != 0x200 || read16(sec1 + 2) != 0x700 )\n        return 0;\n\n    // Check ID\n    if( memcmp(sec2 + 0x3C, \"BAS2BOOT\", 8) )\n        return 0;\n\n    // Ok, we have a BAS2BOOT file\n    return 1;\n}\n\nstatic void extract_bas2boot(struct atr_image *atr, int atari_list, int lower_case,\n                             int extract_files)\n{\n    // Get headers\n    const uint8_t *sec1 = atr_data(atr, 1);\n    const uint8_t *sec2 = atr_data(atr, 2);\n    // Get filename\n    char path[32], aname[32];\n    if( !get_name(path, aname, sec2 + 0x60, 12, lower_case) || !*path )\n    {\n        strcpy(path, \"noname.bas\");\n        strcpy(aname, \"NONAME  BAS\");\n    }\n    // Adds '.BAS' if no extension is present\n    if( !strchr(path, '.') )\n    {\n        const char *ext = lower_case ? \".bas\" : \".BAS\";\n        strcat(path, ext);\n        memcpy(aname + 9, ext + 1, 3);\n    }\n\n    // Get data and length\n    unsigned fsize = read16(sec1 + 8);\n    uint8_t *fdata = check_malloc(fsize < 16 ? 16 : fsize);\n\n    // Read header and undo bad conversion for certain files\n    memcpy(fdata, sec2 + 0x72, 14);\n    for( int i = 2; i < 14; i += 2 )\n    {\n        int x        = fdata[0] + fdata[1] * 256;\n        int y        = fdata[i] + fdata[i + 1] * 256 + x;\n        fdata[i]     = y & 0xFF;\n        fdata[i + 1] = y >> 8;\n    }\n    // Read rest of file\n    unsigned secnum = 3;\n    for( unsigned pos = 14; pos < fsize; pos += 128, secnum++ )\n    {\n        unsigned len     = fsize - pos < 128 ? fsize - pos : 128;\n        const uint8_t *s = atr_data(atr, secnum);\n        if( !s )\n            memset(fdata + pos, 0, len);\n        else\n            memcpy(fdata + pos, s, len);\n    }\n\n    if( extract_files )\n    {\n        struct stat st;\n        fprintf(stderr, \"%s\\n\", path);\n        // Check if file already exists:\n        if( 0 == stat(path, &st) )\n            show_error(\"%s: file already exists.\", path);\n        // Create new file\n        int fd = creat(path, 0666);\n        if( fd == -1 )\n            show_error(\"%s: can´t create file, %s\", path, strerror(errno));\n        if( fsize != write(fd, fdata, fsize) )\n            show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n        if( close(fd) )\n            show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n    }\n    else if( atari_list )\n        printf(\"%-12s %7u\\n\", aname, fsize);\n    else\n        printf(\"%8u\\t\\t%s\\n\", fsize, path);\n\n    free(fdata);\n}\n\nstatic int check_kboot(struct atr_image *atr)\n{\n    // K-File stucture:\n    // 0000 : $00 / $03 / $00 / $07 / $14 / $07 / $4c / $14 / $07\n    // 0009 : LSB / MSB / HSB (24 bits) of file length\n    // 000C : 00\n    // 000D : a9 46 8d c6 02 d0 fe ...\n\n    // Only supports 128 bytes per sector, and the first 3 sectors are the boot\n    // loader:\n    if( atr->sec_size != 128 || atr->sec_count < 3 )\n        return 0;\n\n    const uint8_t *sec = atr_data(atr, 1);\n\n    // Check \"signature\"\n    return 0 == memcmp(\"\\x00\\x03\\x00\\x07\\x14\\x07\\x4c\\x14\\x07\", sec, 9);\n}\n\nstatic void extract_kboot(struct atr_image *atr, const char *atr_name, int atari_list,\n                          int lower_case, int extract_files)\n{\n\n    const uint8_t *sec = atr_data(atr, 1);\n    unsigned fsize     = sec[9] + (sec[10] << 8) + (sec[11] << 16);\n    if( !fsize )\n    {\n        if( atari_list )\n            printf(\"<EMPTY>\\n\");\n        else\n            printf(\"%8u\\t\\t/\\n\", 0);\n        return;\n    }\n    // Get file data\n    unsigned max_len     = atr->sec_count * 128 - 3 * 128;\n    const uint8_t *fdata = atr_data(atr, 4);\n    if( !fdata )\n    {\n        show_error(\"%s: missing file data\", atr_name);\n        return;\n    }\n    if( max_len < fsize )\n    {\n        show_msg(\"%s: data shorter than expected, truncating\", atr_name);\n        fsize = max_len;\n    }\n\n    unsigned crc = crc32(0, fdata, fsize);\n    if( extract_files )\n    {\n        char *path;\n        asprintf(&path, \"kboot-%08x.xex\", crc);\n        struct stat st;\n        fprintf(stderr, \"%s\\n\", path);\n        // Check if file already exists:\n        if( 0 == stat(path, &st) )\n            show_error(\"%s: file already exists.\", path);\n        // Create new file\n        int fd = creat(path, 0666);\n        if( fd == -1 )\n            show_error(\"%s: can´t create file, %s\", path, strerror(errno));\n        if( fsize != write(fd, fdata, fsize) )\n            show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n        if( close(fd) )\n            show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n        free(path);\n    }\n    else if( atari_list )\n        printf(\"%08X COM %7u\\n\", crc, fsize);\n    else\n    {\n        printf(\"%8u\\t\\t/kboot-%08x.xex\\n\", fsize, crc);\n    }\n}\n\nstatic void show_header(struct atr_image *atr, const char *atr_name, int atari_list,\n                        const char *volname)\n{\n    if( atari_list )\n        printf(\"ATR image: %s\\n\"\n               \"Image size: %u sectors of %u bytes\\n\"\n               \"Volume: %s\\n\",\n               atr_name, atr->sec_count, atr->sec_size, volname);\n    else\n        printf(\"%s: %u sectors of %u bytes, %s.\\n\", atr_name, atr->sec_count,\n               atr->sec_size, volname);\n}\n\nint extra_read(struct atr_image *atr, const char *atr_name, int atari_list,\n               int lower_case, int extract_files)\n{\n    // Check BAS2BOOT\n    if( check_bas2boot(atr) )\n    {\n        show_header(atr, atr_name, atari_list, \"BAS2BOOT\");\n        extract_bas2boot(atr, atari_list, lower_case, extract_files);\n        return 0;\n    }\n    else if( check_kboot(atr) )\n    {\n        show_header(atr, atr_name, atari_list, \"K-BOOT\");\n        extract_kboot(atr, atr_name, atari_list, lower_case, extract_files);\n        return 0;\n    }\n\n    return 1;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lsextra.h",
    "content": "/*\n *  Copyright (C) 2024 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Extracts various simple boot formats.\n */\n#pragma once\n#include \"atr.h\"\n\nint extra_read(struct atr_image *atr, const char *atr_name, int atari_list,\n               int lower_case, int extract_files);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lshowfen.c",
    "content": "/*\n *  Copyright (C) 2024 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Reads a HOWFEN DOS menu disk.\n */\n#define _GNU_SOURCE\n#include \"lshowfen.h\"\n\n#include \"atr.h\"\n#include \"compat.h\"\n#include \"msg.h\"\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\n// Read data and write a UNIX filename and an \"Atari\" filename.\nstatic unsigned get_name(char *name, char *aname, const uint8_t *data, int max,\n                         int lower_case)\n{\n    unsigned len = 0, last = 0;\n    memset(aname, ' ', max + 1);\n    for( int i = 0; i < max; i++ )\n    {\n        uint8_t c = data[i];\n        if( (c & 0x40) == 0 )\n            c = c + 0x20;\n        else if( (c & 0x60) == 0x40 )\n            c = c - 0x40;\n        if( (c >= 0xB0 && c <= 0xB9) || (c >= 0xC1 && c <= 0xDA) ||\n            (c >= 0xE1 && c <= 0xFA) )\n            c = c & 0x7F;\n        if( c >= 'A' && c <= 'Z' && lower_case )\n            c = c - 'A' + 'a';\n        if( c < ' ' || c == '/' || c == '.' || c == '?' || c == '\\\\' || c == 96 ||\n            c > 'z' )\n            c = '_';\n        name[len++] = c;\n        aname[i]    = c;\n        if( c != ' ' )\n            last = len;\n    }\n    name[last]  = 0;\n    aname[last] = 0;\n    return last;\n}\n\n// Decode decimal length\nint get_len(const uint8_t *p)\n{\n    int len = 0;\n    for( int i = 0; i < 4; i++ )\n    {\n        if( p[i] > 0x0F && p[i] < 0x1A )\n            len = len * 10 + p[i] - 0x10;\n    }\n    return len;\n}\n\nint howfen_read(struct atr_image *atr, const char *atr_name, int atari_list,\n                int lower_case, int extract_files)\n{\n    const uint8_t *sec1 = atr_data(atr, 1);\n    if( !sec1 )\n        return 1;\n    // Minimal number of sectors is 10\n    if( atr->sec_count < 10 )\n        return 1;\n\n    // Check signature: ' HOWFEN DOS ', in internal codes\n    if( memcmp(sec1 + 0x58, \"\\x80\\x28\\x2f\\x37\\x26\\x25\\x2e\\x00\\x24\\x2f\\x33\\x00\", 12) )\n        return 1;\n\n    // Get menu version\n    char ver[6];\n    memcpy(ver, sec1 + 0x64, 5);\n    if( ver[0] == 0x36 )\n    {\n        for( int i = 0; i < 5; i++ )\n            ver[i] = (ver[i] & 0x3F) + 0x20;\n        ver[5] = 0;\n    }\n    else\n    {\n        ver[0] = 0;\n    }\n\n    if( atari_list )\n        printf(\"ATR image: %s\\n\"\n               \"Image size: %u sectors of %u bytes\\n\"\n               \"Volume: HOWFEN DOS %s\\n\",\n               atr_name, atr->sec_count, atr->sec_size, ver);\n    else\n        printf(\"%s: %u sectors of %u bytes, HOWFEN DOS %s.\\n\", atr_name, atr->sec_count,\n               atr->sec_size, ver);\n\n    // This is the actual tables in the loader:\n    // $89 + N*$20 : line with letter, name and size\n    // $329     : number of files in the menu\n    // $32A + N : LSB of starting sector of file N\n    // $33E + N : MSB of starting sector of file N\n    //\n    // Files are stored ass boot sectors:\n    //   $00 : if 1, high part of number of sectors, ignored otherwise.\n    //   $01 : number of sectors\n    // $02/$03 : Load address\n    // $04/$05 : Address copied to DOSINI\n    // $06 ... : Run data\n\n    // Read directory\n    char fname[32];\n    char aname[32];\n    for( int i = 0; i < 20; i++ )\n    {\n        const uint8_t *pos = sec1 + 0x8A + i * 0x20;\n        if( *pos == (0x21 + i) )\n        {\n            // Get file size\n            int slen = get_len(pos + 0x1B);\n            // Check filename\n            if( get_name(fname, aname, pos + 2, 25, lower_case) )\n            {\n                // Get sector number\n                uint16_t snum = sec1[0x32A + i] + (sec1[0x33E + i] << 8);\n                // Data is contiguos on disk, just read\n                const uint8_t *fdata = atr_data(atr, snum);\n                if( fdata )\n                {\n                    int ilen = fdata[1] + (fdata[0] == 1 ? 0x100 : 0);\n                    if( ilen != slen )\n                        show_msg(\"length does not match\");\n                    // Check that we have all the data\n                    if( snum + slen - 1 > atr->sec_count )\n                    {\n                        show_msg(\"truncated file\");\n                        slen = atr->sec_count - snum + 1;\n                    }\n                }\n                else\n                {\n                    show_msg(\"invalid sector number\");\n                    slen = 0;\n                }\n                unsigned fsize = slen * atr->sec_size;\n                if( extract_files )\n                {\n                    struct stat st;\n                    fprintf(stderr, \"%s\\n\", fname);\n                    // Check if file already exists:\n                    if( 0 == stat(fname, &st) )\n                        show_error(\"%s: file already exists.\", fname);\n                    // Create new file\n                    int fd = creat(fname, 0666);\n                    if( fd == -1 )\n                        show_error(\"%s: can´t create file, %s\", fname, strerror(errno));\n                    if( fsize != write(fd, fdata, fsize) )\n                        show_error(\"%s: can´t write file, %s\", fname, strerror(errno));\n                    if( close(fd) )\n                        show_error(\"%s: can´t write file, %s\", fname, strerror(errno));\n                }\n                else if( atari_list )\n                    printf(\"%-20s %7u\\n\", aname, fsize);\n                else\n                    printf(\"%8u\\t\\t/%s\\n\", fsize, fname);\n            }\n        }\n        else\n            show_msg(\"invalid entry at pos %c\", 'A' + i);\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lshowfen.h",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Reads a HOWFEN DOS menu disk.\n */\n#pragma once\n#include \"atr.h\"\n\nint howfen_read(struct atr_image *atr, const char *atr_name, int atari_list, int lower_case,\n                int extract_files);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lssfs.c",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Reads a SpartaDOS file-system.\n */\n#define _GNU_SOURCE\n#include \"lssfs.h\"\n#include \"atr.h\"\n#include \"compat.h\"\n#include \"msg.h\"\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <time.h>\n#include <unistd.h>\n#include <utime.h>\n\n//---------------------------------------------------------------------\n// Global state\nstruct lssfs\n{\n    struct atr_image *atr;\n    int atari_list;\n    int lower_case;\n    int extract_files;\n};\n\n//---------------------------------------------------------------------\nstatic uint16_t read16(const uint8_t *p)\n{\n    return p[0] | (p[1] << 8);\n}\n\nstatic unsigned read24(const uint8_t *p)\n{\n    return p[0] | (p[1] << 8) | (p[2] << 16);\n}\n\n// Get maximum size of file at given map sector\nstatic unsigned file_msize(struct atr_image *atr, unsigned map)\n{\n    if( map < 2 || map > atr->sec_count )\n    {\n        show_msg(\"invalid sector map\");\n        return 0;\n    }\n    unsigned size = 0;\n    const uint8_t *m;\n    while( 0 != (m = atr_data(atr, map)) )\n    {\n        // Iterate all sectors of map\n        for( unsigned s = 4; s < atr->sec_size; s += 2 )\n            if( read16(m + s) )\n                size += atr->sec_size;\n        // next map\n        map = read16(m);\n    }\n    return size;\n}\n\n// Read up to size bytes from file at given map sector\nstatic unsigned read_file(struct atr_image *atr, unsigned map, unsigned size,\n                          uint8_t *data)\n{\n    const uint8_t *m = atr_data(atr, map);\n    unsigned s       = 4;\n    unsigned pos     = 0;\n    if( map < 2 || !m )\n    {\n        show_msg(\"invalid sector map\");\n        return 0;\n    }\n\n    while( size )\n    {\n        if( s >= atr->sec_size )\n        {\n            // next map\n            map = read16(m);\n            if( !map )\n                return pos;\n            m = atr_data(atr, map);\n            s = 4;\n            if( map < 2 || !m )\n            {\n                show_msg(\"invalid next sector map\");\n                return pos;\n            }\n        }\n        unsigned rem = size > atr->sec_size ? atr->sec_size : size;\n        unsigned sec = read16(m + s);\n        s += 2;\n        if( !sec )\n            memset(data + pos, 0, rem);\n        else if( sec < 2 || sec > atr->sec_count )\n        {\n            show_msg(\"invalid data sector\");\n            return pos;\n        }\n        else\n            memcpy(data + pos, atr_data(atr, sec), rem);\n        pos += rem;\n        size -= rem;\n    }\n    return pos;\n}\n\n// Read data and write a UNIX filename and an \"Atari\" filename.\nstatic unsigned get_name(char *name, char *aname, const uint8_t *data, int max,\n                         int lower_case)\n{\n    unsigned l = 0;\n    int dot    = 0;\n    memset(aname, ' ', max + 1);\n    aname[max + 1] = 0;\n    for( int i = 0; i < max; i++ )\n    {\n        uint8_t c = data[i];\n        if( c >= 'A' && c <= 'Z' && lower_case )\n            c = c - 'A' + 'a';\n        if( c < ' ' || c == '/' || c == '.' || c == '?' || c == '\\\\' || c == 96 ||\n            c > 'z' )\n            c = '_';\n        else if( c == ' ' )\n            continue;\n        if( i > 7 && !dot )\n        {\n            dot       = 1;\n            name[l++] = '.';\n        }\n        name[l++]      = c;\n        aname[i + dot] = c;\n    }\n    name[l] = 0;\n    return l;\n}\n\nstatic void set_times(const char *path, int d_day, int d_mon, int d_yea, int t_hh,\n                      int t_mm, int t_ss)\n{\n    struct utimbuf tb;\n    struct tm t;\n    memset(&t, 0, sizeof(t));\n    t.tm_sec   = t_ss;\n    t.tm_min   = t_mm;\n    t.tm_hour  = t_hh;\n    t.tm_mday  = d_day;\n    t.tm_mon   = d_mon;\n    t.tm_year  = d_yea > 83 ? d_yea : d_yea + 100;\n    t.tm_isdst = -1;\n    tb.actime = tb.modtime = mktime(&t);\n    utime(path, &tb);\n}\n\nstatic void read_dir(struct lssfs *ls, unsigned map, const char *name)\n{\n    if( ls->atari_list )\n        printf(\"Directory of %s\\n\\n\", *name ? name : \"/\");\n\n    uint8_t *data = check_malloc(65536); // max directory size (2848 entries)\n    unsigned len  = read_file(ls->atr, map, 65536, data);\n    if( !len )\n    {\n        show_msg(\"%s: can´t get directory data\", name);\n        free(data);\n        return;\n    }\n    else if( len == 65536 )\n        show_msg(\"%s: directory too big\", name);\n\n    // traverse dir\n    for( unsigned i = 23; i < len; i += 23 )\n    {\n        unsigned flags = data[i];\n        if( !flags )\n            break; // no more entries\n        if( 0 == (flags & 0x08) )\n            continue; // unused\n        if( 0x10 == (flags & 0x10) )\n            continue; // erased\n        int is_dir     = flags & 0x20;\n        unsigned fmap  = read16(data + i + 1);\n        unsigned fsize = read24(data + i + 3);\n        int fd_day     = data[i + 17];\n        int fd_mon     = data[i + 18];\n        int fd_yea     = data[i + 19];\n        int ft_hh      = data[i + 20];\n        int ft_mm      = data[i + 21];\n        int ft_ss      = data[i + 22];\n        char fname[32], aname[32];\n        if( !get_name(fname, aname, data + i + 6, 11, ls->lower_case) || !*fname )\n        {\n            show_msg(\"%s: invalid file name, skip\", name);\n            continue;\n        }\n        char *new_name;\n        asprintf(&new_name, \"%s/%s\", name, fname);\n        if( is_dir )\n        {\n            if( ls->extract_files )\n            {\n                struct stat st;\n                const char *path = new_name + 1;\n                fprintf(stderr, \"%s/\\n\", path);\n                // Check if directory already exists:\n                if( stat(path, &st) || !S_ISDIR(st.st_mode) )\n                {\n                    // Create new directory\n                    if( compat_mkdir(path) )\n                        show_error(\"%s: can´t create directory, %s\", path,\n                                   strerror(errno));\n                }\n                // Extract files inside\n                read_dir(ls, fmap, new_name);\n                // Set time/date\n                set_times(path, fd_day, fd_mon, fd_yea, ft_hh, ft_mm, ft_ss);\n            }\n            else if( ls->atari_list )\n            {\n                // Print entry, but don´t recurse\n                printf(\"%-12s  <DIR>  %02d-%02d-%02d %02d:%02d\\n\", aname, fd_day, fd_mon,\n                       fd_yea, ft_hh, ft_mm);\n            }\n            else\n            {\n                unsigned dirsz = file_msize(ls->atr, fmap);\n                printf(\"%8u\\t%02d-%02d-%02d %02d:%02d:%02d\\t%s/\\n\", dirsz, fd_day, fd_mon,\n                       fd_yea, ft_hh, ft_mm, ft_ss, new_name);\n                read_dir(ls, fmap, new_name);\n            }\n        }\n        else\n        {\n            uint8_t *fdata = check_malloc(fsize);\n            unsigned r     = read_file(ls->atr, fmap, fsize, fdata);\n            if( r != fsize )\n                show_msg(\"%s: short file in disk\", new_name);\n            if( ls->extract_files )\n            {\n                struct stat st;\n                const char *path = new_name + 1;\n                fprintf(stderr, \"%s\\n\", path);\n                // Check if file already exists:\n                if( 0 == stat(path, &st) )\n                    show_error(\"%s: file already exists.\", path);\n                // Create new file\n                int fd = creat(path, 0666);\n                if( fd == -1 )\n                    show_error(\"%s: can´t create file, %s\", path, strerror(errno));\n                if( fsize != write(fd, fdata, fsize) )\n                    show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n                if( close(fd) )\n                    show_error(\"%s: can´t write file, %s\", path, strerror(errno));\n                // Set time/date\n                set_times(path, fd_day, fd_mon, fd_yea, ft_hh, ft_mm, ft_ss);\n            }\n            else if( ls->atari_list )\n                printf(\"%-12s %7u %02d-%02d-%02d %02d:%02d\\n\", aname, fsize, fd_day,\n                       fd_mon, fd_yea, ft_hh, ft_mm);\n            else\n                printf(\"%8u\\t%02d-%02d-%02d %02d:%02d:%02d\\t%s\\n\", fsize, fd_day, fd_mon,\n                       fd_yea, ft_hh, ft_mm, ft_ss, new_name);\n            free(fdata);\n        }\n        free(new_name);\n    }\n    // traverse dir again if listing in Atari format, to show sub directories\n    if( ls->atari_list )\n    {\n        printf(\"\\n\");\n        for( unsigned i = 23; i < len; i += 23 )\n        {\n            unsigned flags = data[i];\n            if( !flags )\n                break; // no more entries\n            if( 0 == (flags & 0x08) )\n                continue; // unused\n            if( 0x10 == (flags & 0x10) )\n                continue; // erased\n            if( 0 == (flags & 0x20) )\n                continue; // not directory\n            unsigned fmap = read16(data + i + 1);\n            char fname[32], aname[32];\n            if( !get_name(fname, aname, data + i + 6, 11, ls->lower_case) )\n                continue;\n            char *new_name;\n            asprintf(&new_name, \"%s/%s\", name, fname);\n            read_dir(ls, fmap, new_name);\n            free(new_name);\n        }\n    }\n    free(data);\n}\n\nint sfs_read(struct atr_image *atr, const char *atr_name, int atari_list, int lower_case,\n             int extract_files)\n{\n    // Check SFS filesystem\n    // Read superblock\n    const uint8_t *boot  = atr_data(atr, 1);\n    unsigned signature   = boot[7];\n    unsigned rootdir_map = read16(boot + 9);\n    unsigned num_sect    = read16(boot + 11);\n    unsigned bitmap_sect = read16(boot + 16);\n    unsigned sector_size = boot[31] ? boot[31] : 256;\n    char vol_name[32], aname[32];\n    if( !get_name(vol_name, aname, boot + 22, 8, lower_case) )\n        vol_name[0] = 0;\n\n    if( signature != 0x80 )\n        return 1;\n    if( sector_size != atr->sec_size )\n    {\n        show_msg(\"%s: invalid SpartaDOS file system, mismatch sector sizes (%d!=%d).\",\n                 atr_name, sector_size, atr->sec_size);\n        return 1;\n    }\n    if( num_sect < atr->sec_count )\n        show_msg(\"%s: ATR image is bigger than file system.\", atr_name);\n    if( num_sect > atr->sec_count )\n        show_msg(\"%s: WARNING: ATR image is smaller than file system.\", atr_name);\n    if( rootdir_map < 2 || rootdir_map > atr->sec_count )\n    {\n        show_msg(\"%s: invalid SpartaDOS file system, root dir map outside disk.\",\n                 atr_name);\n        return 1;\n    }\n    if( bitmap_sect < 2 || bitmap_sect > atr->sec_count )\n    {\n        show_msg(\"%s: invalid SpartaDOS file system, bitmap outside disk.\", atr_name);\n        return 1;\n    }\n\n    if( atr->sec_count < 6 )\n    {\n        show_msg(\"%s: ATR image with too few sectors.\", atr_name);\n        return 1;\n    }\n\n    if( atari_list )\n        printf(\"ATR image: %s\\n\"\n               \"Image size: %u sectors of %u bytes\\n\"\n               \"Volume Name: %s\\n\",\n               atr_name, atr->sec_count, atr->sec_size, *vol_name ? vol_name : \"NONE\");\n    else\n        printf(\"%s: %u sectors of %u bytes, volume name '%s'.\\n\", atr_name,\n               atr->sec_count, atr->sec_size, vol_name);\n\n    struct lssfs *ls  = check_malloc(sizeof(struct lssfs));\n    ls->atr           = atr;\n    ls->atari_list    = atari_list;\n    ls->lower_case    = lower_case;\n    ls->extract_files = extract_files;\n    read_dir(ls, rootdir_map, \"\");\n\n    free(ls);\n    return 0;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/lssfs.h",
    "content": "/*\n *  Copyright (C) 2023 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Reads a SpartaDOS file-system.\n */\n#pragma once\n#include \"atr.h\"\n\nint sfs_read(struct atr_image *atr, const char *atr_name, int atari_list, int lower_case,\n             int extract_files);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/mkatr.c",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Creates an ATR with the given files as contents.\n */\n#include \"disksizes.h\"\n#include \"flist.h\"\n#include \"msg.h\"\n#include \"spartafs.h\"\n#include <errno.h>\n#include <stdio.h>\n#include <string.h>\n\nstatic void show_usage(void)\n{\n    printf(\"Usage: %s [options] <output_atr> [+attributes] <file_1> [... <file_n>]\\n\"\n           \"Options:\\n\"\n           \"\\t-b\\tNext file added will be loaded at boot.\\n\"\n           \"\\t-x\\tOutput image with exact sector count for all available content.\\n\"\n           \"\\t  \\tThis will use non-standard sector counts and 128 byte sector size.\\n\"\n           \"\\t-s size\\tSpecify the minimal image size to the given size in bytes.\\n\"\n           \"\\t-B page\\tRelocate the bootloader to this page address. Please, read\\n\"\n           \"\\t       \\tthe documentation before using this option.\\n\"\n           \"\\t-h\\tShow this help.\\n\"\n           \"\\t-v\\tShow version information.\\n\"\n           \"\\n\"\n           \"In front of each file, you can also add attributes:\\n\"\n           \"\\t+h\\tHidden from directory.\\n\"\n           \"\\t+p\\tRead-only (protected) file.\\n\"\n           \"\\t+a\\tArchived file.\\n\",\n           prog_name);\n    exit(EXIT_SUCCESS);\n}\n\nstatic void write_atr(const char *out, const uint8_t *data, int ssec, int nsec)\n{\n    int size = (nsec > 3) ? ssec * (nsec - 3) + 128 * 3 : 128 * nsec;\n    show_msg(\"writing image with %d sectors of %d bytes, total %d bytes.\", nsec, ssec,\n             size);\n    FILE *f = fopen(out, \"wb\");\n    if( !f )\n        show_error(\"can't open output file '%s': %s\", out, strerror(errno));\n    putc(0x96, f);\n    putc(0x02, f);\n    putc(size >> 4, f);\n    putc(size >> 12, f);\n    putc(ssec, f);\n    putc(ssec >> 8, f);\n    putc(size >> 20, f);\n    putc(0, f);\n    putc(0, f);\n    putc(0, f);\n    putc(0, f);\n    putc(0, f);\n    putc(0, f);\n    putc(0, f);\n    putc(0, f);\n    putc(0, f);\n\n    for( int i = 0; i < nsec; i++ )\n    {\n        // First three sectors are 128 bytes\n        if( i < 3 )\n            fwrite(data + ssec * i, 128, 1, f);\n        else\n            fwrite(data + ssec * i, ssec, 1, f);\n    }\n    if( 0 != fclose(f) )\n        show_error(\"can't write output fil '%s': %s\", out, strerror(errno));\n}\n\n// Get image size given number of sectors and sector size, taking account for\n// first 3 sectors of 128 bytes.\nstatic int image_size(int nsec, int ssec)\n{\n    if( ssec == 256 )\n    {\n        if( nsec < 3 )\n            return nsec * 128;\n        else\n            return nsec * ssec - 3 * 128;\n    }\n    else\n        return nsec * ssec;\n}\n\n// Get number of sectors needed to hold the given size.\nstatic int image_sect(int size, int ssec)\n{\n    if( ssec == 256 )\n    {\n        if( size < 3 * 128 )\n            return (size + 127) / 128;\n        else\n            return (size + 3 * 128 + 255) / 256;\n    }\n    else\n        return (size + ssec - 1) / ssec;\n}\n\nint main(int argc, char **argv)\n{\n    char *out = 0;\n    int i;\n    unsigned boot_addr = 0x07;                   // Standard boot address: $800\n    int boot_file      = 0;                      // Next file is boot file\n    enum fattr attribs = 0;                      // Next file attributes\n    int exact_size     = 0;                      // Use image of exact size\n    int min_size       = 0;                      // Minimum image size\n    const int max_size = image_size(65535, 256); // Maximum image size\n\n    prog_name = argv[0];\n\n    file_list flist;\n    darray_init(flist, 1);\n    flist_add_main_dir(&flist);\n\n    for( i = 1; i < argc; i++ )\n    {\n        char *arg = argv[i];\n        if( arg[0] == '-' )\n        {\n            char op;\n            while( 0 != (op = *++arg) )\n            {\n                if( op == 'h' || op == '?' )\n                    show_usage();\n                else if( op == 'b' )\n                {\n                    if( boot_file )\n                        show_error(\"can specify only one boot file.\");\n                    boot_file = 1;\n                }\n                else if( op == 'x' )\n                    exact_size = 1;\n                else if( op == 'B' )\n                {\n                    char *ep;\n                    if( i + 1 >= argc )\n                        show_opt_error(\"option '-B' needs an argument\");\n                    i++;\n                    boot_addr = strtol(argv[i], &ep, 0);\n                    if( boot_addr <= 3 || boot_addr >= 0xF0 || !ep || *ep )\n                        show_error(\"argument for option '-B' must be from 3 to 240.\");\n                }\n                else if( op == 's' )\n                {\n                    char *ep;\n                    if( i + 1 >= argc )\n                        show_opt_error(\"option '-s' needs an argument\");\n                    i++;\n                    min_size = strtol(argv[i], &ep, 0);\n                    if( min_size <= 0 || !ep || *ep )\n                        show_error(\"argument for option '-s' must be positive.\");\n                    if( min_size > max_size )\n                        show_error(\"maximum image size is %d bytes.\", max_size);\n                }\n                else if( op == 'v' )\n                    show_version();\n                else\n                    show_opt_error(\"invalid command line option '-%c'\", op);\n            }\n        }\n        else if( arg[0] == '+' )\n        {\n            char op;\n            while( 0 != (op = *++arg) )\n            {\n                if( op == '+' )\n                    continue;\n                if( op == 'h' || op == 'H' )\n                    attribs |= at_hidden;\n                else if( op == 'p' || op == 'P' )\n                    attribs |= at_protected;\n                else if( op == 'a' || op == 'A' )\n                    attribs |= at_archived;\n                else\n                    show_opt_error(\"invalid attribute '+%c'\", op);\n            }\n        }\n        else if( !out && boot_file != 1 )\n            out = arg;\n        else\n        {\n            flist_add_file(&flist, arg, boot_file == 1, attribs);\n            if( boot_file )\n                boot_file = -1;\n            attribs = 0;\n        }\n    }\n    if( !out )\n        show_opt_error(\"missing output file name\");\n\n    struct sfs *sfs = 0;\n    if( exact_size )\n    {\n        // Try biggest size and the try reducing:\n        if( min_size <= image_size(65535, 128) )\n            sfs = build_spartafs(128, 65535, boot_addr, &flist);\n        if( !sfs )\n            sfs = build_spartafs(256, 65535, boot_addr, &flist);\n        if( sfs )\n        {\n            int nsec = 65535 - sfs_get_free_sectors(sfs);\n            int ssec = sfs_get_sector_size(sfs);\n\n            if( image_size(nsec, ssec) < min_size )\n                nsec = image_sect(min_size, ssec);\n\n            for( ; nsec > 5 && image_size(nsec, ssec) >= min_size; nsec-- )\n            {\n                struct sfs *n = build_spartafs(ssec, nsec, boot_addr, &flist);\n                if( !n )\n                    break;\n                sfs_free(sfs);\n                sfs = n;\n                if( sfs_get_free_sectors(sfs) > 0 &&\n                    image_size(nsec - 1, ssec) > min_size )\n                {\n                    nsec = nsec - sfs_get_free_sectors(sfs) + 1;\n                    if( image_size(nsec, ssec) < min_size )\n                        nsec = 1 + image_sect(min_size, ssec);\n                }\n            }\n        }\n    }\n    else\n    {\n        for( i = 0; !sfs && sectors[i].size; i++ )\n        {\n            if( image_size(sectors[i].size, sectors[i].num) < min_size )\n                continue;\n            sfs = build_spartafs(sectors[i].size, sectors[i].num, boot_addr, &flist);\n        }\n    }\n    if( sfs )\n        write_atr(out, sfs_get_data(sfs), sfs_get_sector_size(sfs),\n                  sfs_get_num_sectors(sfs));\n    else\n        show_error(\"can't create an image big enough.\");\n    return 0;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/msg.c",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Shows error messages.\n */\n#include \"msg.h\"\n#include \"version.h\"\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nconst char *prog_name;\n\nvoid show_error(const char *format, ...)\n{\n    va_list ap;\n    fprintf(stderr, \"%s: Error, \", prog_name);\n    va_start(ap, format);\n    vfprintf(stderr, format, ap);\n    va_end(ap);\n    fprintf(stderr, \"\\n\");\n    exit(EXIT_FAILURE);\n}\n\nvoid show_msg(const char *format, ...)\n{\n    va_list ap;\n    fprintf(stderr, \"%s: \", prog_name);\n    va_start(ap, format);\n    vfprintf(stderr, format, ap);\n    va_end(ap);\n    fprintf(stderr, \"\\n\");\n}\n\nvoid show_opt_error(const char *format, ...)\n{\n    va_list ap;\n    fprintf(stderr, \"%s: Error, \", prog_name);\n    va_start(ap, format);\n    vfprintf(stderr, format, ap);\n    va_end(ap);\n    fprintf(stderr, \". Try '%s -h' for help.\\n\", prog_name);\n    exit(EXIT_FAILURE);\n}\n\nvoid show_version(void)\n{\n    printf(\"mkatr version %s, Copyright (C) 2016-2023 Daniel Serpell\\n\\n\"\n           \"This is free software under the GNU GENERAL PUBLIC LICENSE.\\n\"\n           \"There is NO warranty; not even for MERCHANTABILITY or FITNESS\\n\"\n           \"FOR A PARTICULAR PURPOSE.\\n\",\n           prog_version);\n    exit(EXIT_SUCCESS);\n}\n\nvoid memory_error(void)\n{\n    show_error(\"memory error!\\n\");\n}\n\nvoid *check_malloc(size_t size)\n{\n    void *ret = malloc(size);\n    if( !ret )\n        memory_error();\n    return ret;\n}\n\nvoid *check_calloc(size_t nmemb, size_t size)\n{\n    void *ret = calloc(nmemb, size);\n    if( !ret )\n        memory_error();\n    return ret;\n}\n\nvoid *check_realloc(void *ptr, size_t size)\n{\n    void *ret = realloc(ptr, size);\n    if( !ret )\n        memory_error();\n    return ret;\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/msg.h",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Shows error messages.\n */\n#pragma once\n#include <stddef.h>\n\nextern const char *prog_name;\n\nvoid show_error(const char *format, ...) __attribute__((noreturn, format(printf, 1, 2)));\nvoid show_opt_error(const char *format, ...)\n    __attribute__((noreturn, format(printf, 1, 2)));\nvoid show_msg(const char *format, ...) __attribute__((format(printf, 1, 2)));\nvoid show_version(void);\nvoid memory_error(void) __attribute__((noreturn));\nvoid *check_malloc(size_t size);\nvoid *check_calloc(size_t nmemb, size_t size);\nvoid *check_realloc(void *ptr, size_t size);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/spartafs.c",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Sparta FS\n */\n#include \"spartafs.h\"\n#include \"asm/boot128.h\"\n#include \"asm/boot256.h\"\n#include \"crc32.h\"\n#include \"msg.h\"\n#include <stdint.h>\n#include <string.h>\n\nstatic char hex(int x)\n{\n    return (\"0123456789ABCDEF\")[x & 0x0F];\n}\n\nstruct sfs\n{\n    uint8_t *data;\n    int nsec;\n    int bmap;\n    int nbmp;\n    int csec;\n    int boot_map;\n    int sec_size;\n};\n\nstatic uint8_t *sfs_ptr(struct sfs *sfs, int sec)\n{\n    return sfs->data + sfs->sec_size * (sec - 1);\n}\n\nstatic void sfs_free_sec(struct sfs *sfs, int sec)\n{\n    sfs_ptr(sfs, sfs->bmap)[sec >> 3] |= (128 >> (sec & 7));\n}\n\nstatic int sfs_used(struct sfs *sfs, int sec)\n{\n    return 0 == (sfs_ptr(sfs, sfs->bmap)[sec >> 3] & (128 >> (sec & 7)));\n}\n\nstatic int sfs_alloc(struct sfs *sfs)\n{\n    int sec = sfs->csec;\n    while( sec <= sfs->nsec && sfs_used(sfs, sec) )\n        sec++;\n    if( sec <= sfs->nsec )\n    {\n        sfs_ptr(sfs, sfs->bmap)[sec >> 3] &= ~(128 >> (sec & 7));\n        sfs->csec = sec + 1;\n        return sec;\n    }\n    else\n        return -1;\n}\n\nstatic int get_word(const uint8_t *data)\n{\n    return (data[0] & 0xFF) + ((data[1] & 0xFF) << 8);\n}\n\nstatic int sfs_patch_byte(struct sfs *sfs, int smap, int pos, int byte)\n{\n    int mpos = 4;\n    while( pos >= sfs->sec_size )\n    {\n        pos -= sfs->sec_size;\n        mpos += 2;\n        if( mpos >= sfs->sec_size )\n        {\n            mpos = 4;\n            smap = get_word(sfs_ptr(sfs, smap));\n            if( smap < 1 || smap > sfs->nsec )\n                return -1;\n        }\n    }\n    int sect = get_word(sfs_ptr(sfs, smap) + mpos);\n    if( sect < 1 || sect > sfs->nsec )\n        return -1;\n    uint8_t *data = sfs_ptr(sfs, sect);\n    data[pos]     = byte;\n    return 0;\n}\n\nstatic int sfs_add_data(struct sfs *sfs, char *data, int size)\n{\n    int sec_size = sfs->sec_size;\n    int last = 0, first = 0;\n    uint8_t *pmap = 0;\n    do\n    {\n        // Alloc a sector map\n        int smap = sfs_alloc(sfs);\n        if( smap < 0 )\n            return smap;\n\n        if( pmap )\n        {\n            pmap[0] = smap & 0xFF;\n            pmap[1] = smap >> 8;\n        }\n        else\n            first = smap;\n\n        pmap    = sfs_ptr(sfs, smap);\n        pmap[2] = last & 0xFF;\n        pmap[3] = last >> 8;\n        // Copy data\n        int i;\n        for( i = 4; i < sec_size && size > 0; i += 2 )\n        {\n            int num = size > sec_size ? sec_size : size;\n            int sec = sfs_alloc(sfs);\n            if( sec < 0 )\n                return sec;\n            pmap[i]     = sec & 0xFF;\n            pmap[i + 1] = sec >> 8;\n            memcpy(sfs_ptr(sfs, sec), data, num);\n            size -= num;\n            data += num;\n        }\n        last = smap;\n    } while( size );\n    return first;\n}\n\n// Write the boot sectors, relocated to the given address\nstatic void write_boot(struct sfs *sfs, int address)\n{\n    unsigned char data[384];\n    unsigned char *boot;\n    unsigned *reloc;\n    unsigned rsize, i;\n\n    if( sfs->nsec < 3 )\n        return;\n\n    if( sfs->sec_size == 128 )\n    {\n        boot  = boot128_bin;\n        reloc = boot128_reloc;\n        rsize = sizeof(boot128_reloc) / sizeof(boot128_reloc[0]);\n    }\n    else if( sfs->sec_size == 256 )\n    {\n        boot  = boot256_bin;\n        reloc = boot256_reloc;\n        rsize = sizeof(boot256_reloc) / sizeof(boot256_reloc[0]);\n    }\n    else\n        return;\n\n    // Relocate code using reloc table:\n    memcpy(data, boot, 384);\n    for( i = 0; i < rsize; i++ )\n        data[reloc[i] - 1] = data[reloc[i] - 1] + address - 16;\n\n    // Copy boot sectors, always 128 byte size:\n    for( i = 0; i < 3; i++ )\n        memcpy(sfs->data + sfs->sec_size * i, data + 128 * i, 128);\n}\n\n// Sorting function: sort by level, then directories first and last by file name\nstatic int compare_level(const void *a, const void *b)\n{\n    const struct afile *fa = *(const struct afile *const *)a;\n    const struct afile *fb = *(const struct afile *const *)b;\n    if( fb->level != fa->level )\n        return fb->level - fa->level;\n    if( fb->is_dir != fa->is_dir )\n        return fb->is_dir - fa->is_dir;\n    return strncmp(fa->aname, fb->aname, 11);\n}\n\nstruct sfs *build_spartafs(int sector_size, int num_sectors, unsigned boot_addr,\n                           file_list *flist)\n{\n    struct sfs *sfs = check_malloc(sizeof(struct sfs));\n    sfs->data       = check_calloc(sector_size, num_sectors);\n    sfs->nsec       = num_sectors;\n    sfs->bmap       = 4;\n    sfs->nbmp       = ((num_sectors + 8) / 8 + sector_size - 1) / sector_size;\n    sfs->csec       = 4 + sfs->nbmp;\n    sfs->sec_size   = sector_size;\n\n    write_boot(sfs, boot_addr);\n\n    int i;\n    for( i = sfs->csec; i <= sfs->nsec; i++ )\n        sfs_free_sec(sfs, i);\n\n    // Sort the entries by the level - higher level first\n    qsort(&darray_i(flist, 0), darray_len(flist), sizeof(darray_i(flist, 0)),\n          compare_level);\n\n    // Cleanup all directories\n    struct afile **ptr;\n    darray_foreach(ptr, flist)\n    {\n        struct afile *af = *ptr;\n        if( af->is_dir )\n        {\n            af->size = 23;\n            memset(af->data, 0, 23);\n        }\n    }\n\n    // Add each file\n    int dsec = -1;\n    darray_foreach(ptr, flist)\n    {\n        struct afile *af = *ptr;\n        if( af->is_dir )\n        {\n            int dsize   = af->size;\n            af->data[0] = 0x28;\n            af->data[1] = 0; // Parent dir map,\n            af->data[2] = 0; // written later\n            af->data[3] = dsize & 0xFF;\n            af->data[4] = (dsize >> 8) & 0xFF;\n            af->data[5] = dsize >> 16;\n            memcpy(&af->data[6], af->aname, 11);\n            memcpy(&af->data[17], &af->date, 3);\n            memcpy(&af->data[20], &af->time, 3);\n        }\n        // Add data\n        int msec = sfs_add_data(sfs, af->data, af->size);\n        if( msec < 0 )\n        {\n            sfs_free(sfs);\n            return 0;\n        }\n        // Set map sector\n        af->map_sect = msec;\n        // Add to directory\n        struct afile *dir = af->dir;\n        if( dir )\n        {\n            char *cdir = dir->data + dir->size;\n\n            cdir[0] = 0x08 | (af->is_dir ? 0x20 : 0x00) | af->attribs;\n            cdir[1] = msec & 0xFF;\n            cdir[2] = msec >> 8;\n            cdir[3] = af->size & 0xFF;\n            cdir[4] = (af->size >> 8) & 0xFF;\n            cdir[5] = af->size >> 16;\n            memcpy(&cdir[6], af->aname, 11);\n            memcpy(&cdir[17], &af->date, 3);\n            memcpy(&cdir[20], &af->time, 3);\n\n            dir->size += 23;\n            if( dir->size > SFS_MAX_DIR_SIZE )\n                show_error(\"too many files in directory %s.\", dir->pname);\n        }\n        else\n            // This is the main directory, remember location\n            dsec = msec;\n\n        if( af->boot_file )\n            sfs->boot_map = msec;\n    }\n\n    // Set the \"parent\" directory to all sub-directories\n    darray_foreach(ptr, flist)\n    {\n        struct afile *af = *ptr;\n        if( af->is_dir && af->dir )\n        {\n            int parent = af->dir->map_sect;\n            sfs_patch_byte(sfs, af->map_sect, 1, parent & 0xFF);\n            sfs_patch_byte(sfs, af->map_sect, 2, parent >> 8);\n        }\n    }\n\n    // Check main directory\n    if( dsec < 0 )\n        show_error(\"internal error - no main directory.\");\n\n    // Get's CRC32 of current data\n    unsigned crc = crc32(0, sfs->data, sfs->sec_size * sfs->nsec);\n\n    sfs->data[1]  = 0x03;\n    sfs->data[7]  = 0x80;\n    sfs->data[9]  = dsec & 0xFF;\n    sfs->data[10] = dsec >> 8;\n    sfs->data[11] = sfs->nsec & 0xFF;\n    sfs->data[12] = sfs->nsec >> 8;\n    sfs->data[13] = (sfs->nsec - sfs->csec + 1) & 0xFF;\n    sfs->data[14] = (sfs->nsec - sfs->csec + 1) >> 8;\n    sfs->data[15] = sfs->nbmp;\n    sfs->data[16] = sfs->bmap & 0xFF;\n    sfs->data[17] = sfs->bmap >> 8;\n    sfs->data[18] = sfs->csec & 0xFF;\n    sfs->data[19] = sfs->csec >> 8;\n    sfs->data[20] = sfs->csec & 0xFF;\n    sfs->data[21] = sfs->csec >> 8;\n    sfs->data[22] = 'D';\n    sfs->data[23] = 'S';\n    sfs->data[24] = 'K';\n    sfs->data[25] = '_';\n    sfs->data[26] = hex(crc >> 8);\n    sfs->data[27] = hex(crc >> 12);\n    sfs->data[28] = hex(crc >> 16);\n    sfs->data[29] = hex(crc >> 20);\n    sfs->data[30] = 0x28;\n    sfs->data[31] = sfs->sec_size > 128 ? 0 : 128;\n    sfs->data[32] = 0x20;\n    sfs->data[39] = crc & 0xFF;\n    sfs->data[40] = sfs->boot_map & 0xFF;\n    sfs->data[41] = sfs->boot_map >> 8;\n\n    return sfs;\n}\n\nuint8_t *sfs_get_data(const struct sfs *sfs)\n{\n    return sfs->data;\n}\n\nint sfs_get_num_sectors(const struct sfs *sfs)\n{\n    return sfs->nsec;\n}\n\nint sfs_get_sector_size(const struct sfs *sfs)\n{\n    return sfs->sec_size;\n}\n\nint sfs_get_free_sectors(const struct sfs *sfs)\n{\n    return sfs->nsec - sfs->csec + 1;\n}\n\nvoid sfs_free(struct sfs *sfs)\n{\n    if( sfs )\n    {\n        free(sfs->data);\n        free(sfs);\n    }\n}\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/spartafs.h",
    "content": "/*\n *  Copyright (C) 2016 Daniel Serpell\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License along\n *  with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n/*\n * Sparta FS\n */\n#pragma once\n#include \"flist.h\"\n#include <stdint.h>\n\nstruct sfs;\n\nstruct sfs *build_spartafs(int sector_size, int num_sectors, unsigned boot_addr,\n                           file_list *flist);\n\nuint8_t *sfs_get_data(const struct sfs *);\nint sfs_get_num_sectors(const struct sfs *);\nint sfs_get_sector_size(const struct sfs *);\nint sfs_get_free_sectors(const struct sfs *);\nvoid sfs_free(struct sfs *);\n"
  },
  {
    "path": "tools/cc65/atari/mkatr-master/src/version.h",
    "content": "#pragma once\nconst char *prog_version = \"1.4~beta\";\n"
  },
  {
    "path": "tools/cc65/atari7800/extzp.inc",
    "content": ";\n; extzp.inc for the Atari 7800\n;\n; Karri Kaksonen, 2022-04-05\n;\n; Assembler include file that imports the runtime zero page locations used\n; by the atari7800 runtime, ready for usage in asm code.\n;\n\n        ; .global         ptr7800: zp\n        ; .global         ptrtmp: zp\n        ; .global         cursorzone: zp\n        .global         sfxptr: zp\n\n"
  },
  {
    "path": "tools/cc65/atari7800/extzp.s",
    "content": ";\n; Karri Kaksonen, 2022-04-05\n;\n; zeropage locations for exclusive use by the library\n;\n\n        .include \"extzp.inc\"\n\n        .segment \"EXTZP\" : zeropage\n\nptr7800:        .res 2\nptrtmp:         .res 2\ncursorzone:     .res 2\nsfxptr:         .res 2\n"
  },
  {
    "path": "tools/cc65/atari7800/sfx.s",
    "content": "\t.include \"atari7800.inc\"\n\t.include \"extzp.inc\"\n\t.interruptor playsfx\n\t.constructor silence\n\t.export\t_playsfx0\n\t.import\t_zonecounter\n\n\t.bss\nframes:\t.res\t1\ncnt:\t.res\t1\n\n\t.code\n\n_playsfx0:\n\tsta\tsfxptr\n\tstx\tsfxptr+1\n\tinc\tsfxptr\n\tbne\t@L11\n\tinc\tsfxptr+1\n@L11:\tinc\tsfxptr\n\tbne\t@L12\n\tinc\tsfxptr+1\n@L12:\tldy\t#0\n\tlda\t(sfxptr),y\n\tsta\tframes\n\ttya\n\tsta\tcnt\n\tinc\tsfxptr\n\tbne\t@L13\n\tinc\tsfxptr+1\n@L13:\trts\n\nsilence:\n\tlda\t#0\n\tsta\tsfxptr\n\tsta\tsfxptr+1\n\trts\n\nplaysfx:\n\tlda\t_zonecounter\n\tand\t#$01\n\tbeq\t@L9\t\t; Process audio while MARIA draws on screen\n\tlda\tsfxptr+1\n\tbeq\t@L9\t\t; Skip audio if high byte of address is zero\n\n\tlda\tcnt\n\tbne\t@L1\n\tlda\tframes\n\tsta\tcnt\n\tjmp\t@L2\n@L1:\n\tsec\n\tsbc\t#1\n\tsta\tcnt\n\tjmp\t@L9\n\n@L2:\tldx\t#0\t\t; Use X to detect end of sfx\n\tldy\t#0\t\t; freq\n\tlda\t(sfxptr),y\n\tsta\tAUDF0\n\tbeq\t@L3\n\tinx\t\t\t; Not end of sfx\n@L3:\tiny\t\t\t; Channel\n\tlda\t(sfxptr),y\n\tsta\tAUDC0\n\tbeq\t@L4\n\tinx\t\t\t; Not end of sfx\n@L4:\tiny\t\t\t; Volume\n\tlda\t(sfxptr),y\n\tsta\tAUDV0\n\tbeq\t@L5\n\tinx\t\t\t; Not end of sfx\n@L5:\ttxa\t\t\t; Check for end of sfx\n\tbeq\t@L8\n\n\tlda\tsfxptr\t\t; Increment sfx pointer by 3\n\tldx\tsfxptr+1\n\tclc\n\tadc\t#3\n\tbcc\t@L6\n\tinx\n@L6:\tsta\tsfxptr\n\tstx\tsfxptr+1\n\tjmp\t@L9\n@L8:\tsta\tsfxptr+1\t; Stop sfx processing\n@L9:\tclc\n\trts\n"
  },
  {
    "path": "tools/cc65/atari7800/sfx_monolythic.s",
    "content": "\t.include \"atari7800.inc\"\r\n\t.include \"extzp.inc\"\r\n\t.interruptor playsfx\r\n\t.constructor silence\r\n\t.export\t_playsfx0\r\n\t.import\t_zonecounter\r\n\r\n        .include \"extzp.inc\"\r\n\r\n        .segment \"EXTZP\" : zeropage\r\n\r\nptr7800:        .res 2\r\nptrtmp:         .res 2\r\ncursorzone:     .res 2\r\nsfxptr:         .res 2\r\n\r\n\t.bss\r\nframes:\t.res\t1\r\ncnt:\t.res\t1\r\n\r\n\t.code\r\n\r\n_playsfx0:\r\n\tsta\tsfxptr\r\n\tstx\tsfxptr+1\r\n\tinc\tsfxptr\r\n\tbne\t@L11\r\n\tinc\tsfxptr+1\r\n@L11:\tinc\tsfxptr\r\n\tbne\t@L12\r\n\tinc\tsfxptr+1\r\n@L12:\tldy\t#0\r\n\tlda\t(sfxptr),y\r\n\tsta\tframes\r\n\ttya\r\n\tsta\tcnt\r\n\tinc\tsfxptr\r\n\tbne\t@L13\r\n\tinc\tsfxptr+1\r\n@L13:\trts\r\n\r\nsilence:\r\n\tlda\t#0\r\n\tsta\tsfxptr\r\n\tsta\tsfxptr+1\r\n\trts\r\n\r\nplaysfx:\r\n\tlda\t_zonecounter\r\n\tand\t#$01\r\n\tbeq\t@L9\t\t; Process audio while MARIA draws on screen\r\n\tlda\tsfxptr+1\r\n\tbeq\t@L9\t\t; Skip audio if high byte of address is zero\r\n\r\n\tlda\tcnt\r\n\tbne\t@L1\r\n\tlda\tframes\r\n\tsta\tcnt\r\n\tjmp\t@L2\r\n@L1:\r\n\tsec\r\n\tsbc\t#1\r\n\tsta\tcnt\r\n\tjmp\t@L9\r\n\r\n@L2:\tldx\t#0\t\t; Use X to detect end of sfx\r\n\tldy\t#0\t\t; freq\r\n\tlda\t(sfxptr),y\r\n\tsta\tAUDF0\r\n\tbeq\t@L3\r\n\tinx\t\t\t; Not end of sfx\r\n@L3:\tiny\t\t\t; Channel\r\n\tlda\t(sfxptr),y\r\n\tsta\tAUDC0\r\n\tbeq\t@L4\r\n\tinx\t\t\t; Not end of sfx\r\n@L4:\tiny\t\t\t; Volume\r\n\tlda\t(sfxptr),y\r\n\tsta\tAUDV0\r\n\tbeq\t@L5\r\n\tinx\t\t\t; Not end of sfx\r\n@L5:\ttxa\t\t\t; Check for end of sfx\r\n\tbeq\t@L8\r\n\r\n\tlda\tsfxptr\t\t; Increment sfx pointer by 3\r\n\tldx\tsfxptr+1\r\n\tclc\r\n\tadc\t#3\r\n\tbcc\t@L6\r\n\tinx\r\n@L6:\tsta\tsfxptr\r\n\tstx\tsfxptr+1\r\n\tjmp\t@L9\r\n@L8:\tsta\tsfxptr+1\t; Stop sfx processing\r\n@L9:\tclc\r\n\trts\r\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_70stvcomputer.s",
    "content": "\t.rodata\n\t.export\t_sfx_70stvcomputer\n_sfx_70stvcomputer:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte  $01,$08,$06\n\t.byte  $01,$08,$08\n\t.byte  $0c,$01,$08\n\t.byte  $0b,$09,$06\n\t.byte  $03,$01,$08\n\t.byte  $04,$0f,$08\n\t.byte  $10,$01,$08\n\t.byte  $16,$04,$08\n\t.byte  $06,$07,$08\n\t.byte  $01,$08,$08\n\t.byte  $1f,$04,$08\n\t.byte  $01,$06,$08\n\t.byte  $0b,$0c,$08\n\t.byte  $01,$08,$08\n\t.byte  $0e,$09,$08\n\t.byte  $0e,$0c,$08\n\t.byte  $00,$0e,$08\n\t.byte  $01,$08,$08\n\t.byte  $08,$09,$08\n\t.byte  $0c,$09,$08\n\t.byte  $0c,$0c,$08\n\t.byte  $0c,$01,$08\n\t.byte  $01,$08,$08\n\t.byte  $0a,$0c,$08\n\t.byte  $06,$01,$08\n\t.byte  $0c,$09,$08\n\t.byte  $10,$04,$08\n\t.byte  $0f,$09,$08\n\t.byte  $03,$01,$08\n\t.byte  $1c,$01,$08\n\t.byte  $15,$01,$08\n\t.byte  $0c,$09,$08\n\t.byte  $07,$07,$08\n\t.byte  $01,$08,$08\n\t.byte  $00,$07,$08\n\t.byte  $01,$08,$08\n\t.byte  $01,$0f,$08\n\t.byte  $0d,$0c,$08\n\t.byte  $0b,$0c,$08\n\t.byte  $01,$08,$08\n\t.byte  $01,$0f,$08\n\t.byte  $0d,$0c,$08\n\t.byte  $0b,$0c,$08\n\t.byte  $01,$08,$08\n\t.byte  $1a,$01,$08\n\t.byte  $0d,$09,$06\n\t.byte  $08,$01,$06\n\t.byte  $1b,$01,$06\n\t.byte  $04,$0f,$06\n\t.byte  $02,$0f,$06\n\t.byte  $08,$01,$06\n\t.byte  $04,$07,$06\n\t.byte  $1f,$04,$06\n\t.byte  $1a,$01,$06\n\t.byte  $02,$07,$06\n\t.byte  $04,$01,$06\n\t.byte  $04,$01,$04\n\t.byte  $07,$07,$04\n\t.byte  $0c,$0c,$02\n\t.byte  $0a,$0c,$02\n\t.byte  $0a,$0c,$01\n\t.byte  0,0,0\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_activate.s",
    "content": "\t.rodata\n\t.export\t_sfx_activate\n_sfx_activate:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte   $0b, $07, $01  ; first chunk of freq,channel,volume\n\t.byte   $1f, $07, $06\n\t.byte   $13, $0c, $07\n\t.byte   $15, $04, $0d\n\t.byte   $1c, $04, $0e\n\t.byte   $16, $04, $0d\n\t.byte   $0d, $0c, $0d\n\t.byte   $12, $0c, $0b\n\t.byte   $14, $04, $0d\n\t.byte   $1f, $04, $0f\n\t.byte   $1b, $04, $0d\n\t.byte   $1b, $04, $0d\n\t.byte   $1b, $04, $06\n\t.byte   $15, $0c, $05\n\t.byte   $1e, $07, $07\n\t.byte   $0e, $07, $0d\n\t.byte   $01, $06, $0e\n\t.byte   $13, $04, $0d\n\t.byte   $1e, $07, $0d\n\t.byte   $10, $0c, $0b\n\t.byte   $14, $04, $0d\n\t.byte   $0b, $0c, $0e\n\t.byte   $1b, $04, $0d\n\t.byte   $1a, $04, $0c\n\t.byte   $12, $0f, $05\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_advbite.s",
    "content": "\t.rodata\n\t.export\t_sfx_advbite\n_sfx_advbite:\n\t.byte   $10,$10,$02 ; version, priority, frames per chunk\n\t.byte   $1F,$03,$0F ; first chunk of freq,channel,volume data \n\t.byte   $1F,$08,$0E \n\t.byte   $1F,$03,$0D \n\t.byte   $1F,$08,$0C \n\t.byte   $1F,$03,$0B \n\t.byte   $1F,$08,$0A \n\t.byte   $1F,$03,$09 \n\t.byte   $1F,$08,$08 \n\t.byte   $1F,$03,$07 \n\t.byte   $1F,$08,$06 \n\t.byte   $1F,$03,$05 \n\t.byte   $1F,$08,$04 \n\t.byte   $1F,$03,$03 \n\t.byte   $1F,$08,$02 \n\t.byte   $1F,$03,$01 \n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_advdragonslain.s",
    "content": "\t.rodata\n\t.export\t_sfx_advdragonslain\n_sfx_advdragonslain:\n\t.byte   $10,$10,$02 ; version, priority, frames per chunk\n\t.byte   $10,$04,$0F ; first chunk of freq,channel,volume data \n\t.byte   $11,$04,$0E \n\t.byte   $12,$04,$0D \n\t.byte   $13,$04,$0C \n\t.byte   $14,$04,$0B \n\t.byte   $15,$04,$0A \n\t.byte   $16,$04,$09 \n\t.byte   $17,$04,$08 \n\t.byte   $18,$04,$07 \n\t.byte   $19,$04,$06 \n\t.byte   $1A,$04,$05 \n\t.byte   $1B,$04,$04 \n\t.byte   $1C,$04,$03 \n\t.byte   $1D,$04,$02 \n\t.byte   $1E,$04,$01 \n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_advdrop.s",
    "content": "\t.rodata\n\t.export\t_sfx_advdrop\n_sfx_advdrop:\n\t.byte   $10,$04,$02 ; version, priority, frames per chunk\n\t.byte   $00,$06,$08 ; first chunk of freq,channel,volume data \n\t.byte   $01,$06,$08 \n\t.byte   $02,$06,$08 \n\t.byte   $03,$06,$08 \n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_advpickup.s",
    "content": "\t.rodata\n\t.export\t_sfx_advpickup\n_sfx_advpickup:\n\t.byte   $10,$04,$02 ; version, priority, frames per chunk\n\t.byte   $03,$06,$08 ; first chunk of freq,channel,volume data \n\t.byte   $02,$06,$08 \n\t.byte   $01,$06,$08 \n\t.byte   $00,$06,$08 \n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_alienaggressor.s",
    "content": "\t.rodata\n\t.export\t_sfx_alienaggressor\n_sfx_alienaggressor:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1b,$0c,$01\n\t.byte  $0f,$06,$02\n\t.byte  $0f,$06,$03\n\t.byte  $1e,$06,$02\n\t.byte  $1e,$06,$01\n\t.byte  $1b,$0c,$02\n\t.byte  $17,$0c,$06\n\t.byte  $17,$0c,$09\n\t.byte  $17,$0c,$0d\n\t.byte  $07,$06,$0d\n\t.byte  $16,$04,$06\n\t.byte  $17,$0c,$0d\n\t.byte  $17,$0c,$0f\n\t.byte  $1c,$04,$0d\n\t.byte  $1c,$04,$0f\n\t.byte  $07,$0c,$08\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$09\n\t.byte  $03,$0c,$0a\n\t.byte  $03,$0c,$0c\n\t.byte  $0c,$04,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $06,$0c,$08\n\t.byte  $18,$04,$0c\n\t.byte  $0a,$0c,$09\n\t.byte  $07,$06,$05\n\t.byte  $07,$06,$05\n\t.byte  $08,$06,$03\n\t.byte  $09,$06,$01\n\t.byte  $00,$06,$00\n\t.byte  $07,$06,$02\n\t.byte  $08,$06,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_alienbuzz.s",
    "content": "\t.rodata\n\t.export\t_sfx_alienbuzz\n_sfx_alienbuzz:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0d,$0c,$04 ; first chunk of freq,channel,volume\n\t.byte  $0c,$0c,$08\n\t.byte  $0c,$0c,$0b\n\t.byte  $12,$0c,$05\n\t.byte  $12,$0c,$0a\n\t.byte  $0d,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $0c,$0c,$0e\n\t.byte  $0c,$0c,$0f\n\t.byte  $0d,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0f,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0d\n\t.byte  $0d,$0c,$09\n\t.byte  $0d,$0c,$0f\n\t.byte  $0d,$0c,$06\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$05\n\t.byte  $0d,$0c,$01\n\t.byte  $0d,$0c,$01\n\t.byte  $0c,$0c,$01\n\t.byte  $0d,$0c,$00\n\t.byte  $0c,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_aliencoo.s",
    "content": "\t.rodata\n\t.export\t_sfx_aliencoo\n_sfx_aliencoo:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $1c,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1c,$04,$0e\n\t.byte  $1e,$04,$0f\n\t.byte  $1e,$04,$05\n\t.byte  $1c,$04,$0f\n\t.byte  $1e,$04,$03\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$04\n\t.byte  $1e,$04,$0f\n\t.byte  $1c,$04,$02\n\t.byte  $1e,$04,$0e\n\t.byte  $1e,$04,$03\n\t.byte  $1e,$04,$05\n\t.byte  $1e,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_alienkitty.s",
    "content": "\t.rodata\n\t.export\t_sfx_alienkitty\n_sfx_alienkitty:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $01, $06, $01\n\t.byte   $16, $01, $03\n\t.byte   $18, $04, $06\n\t.byte   $19, $04, $0f\n\t.byte   $0e, $07, $0e\n\t.byte   $19, $04, $0c\n\t.byte   $19, $04, $0c\n\t.byte   $18, $04, $0c\n\t.byte   $17, $04, $0a\n\t.byte   $15, $01, $0a\n\t.byte   $06, $04, $0a\n\t.byte   $19, $0f, $0a\n\t.byte   $06, $04, $06\n\t.byte   $17, $04, $04\n\t.byte   $17, $04, $04\n\t.byte   $17, $04, $03\n\t.byte   $1a, $0c, $03\n\t.byte   $0c, $04, $02\n\t.byte   $19, $04, $02\n\t.byte   $17, $04, $01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_alienklaxon.s",
    "content": "\t.rodata\n\t.export\t_sfx_alienklaxon\n_sfx_alienklaxon:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0e\n\t.byte  $1e,$06,$07\n\t.byte  $1c,$04,$0c\n\t.byte  $00,$06,$0c\n\t.byte  $1e,$04,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $1e,$06,$0d\n\t.byte  $16,$04,$09\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0b\n\t.byte  $1e,$06,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $1e,$06,$0a\n\t.byte  $0c,$0c,$0d\n\t.byte  $13,$04,$0c\n\t.byte  $0d,$0c,$0f\n\t.byte  $1e,$06,$08\n\t.byte  $02,$0c,$04\n\t.byte  $12,$04,$07\n\t.byte  $07,$06,$03\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0e\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0d\n\t.byte  $1e,$06,$07\n\t.byte  $1e,$06,$06\n\t.byte  $1e,$06,$08\n\t.byte  $1e,$06,$07\n\t.byte  $12,$0c,$0f\n\t.byte  $03,$06,$0f\n\t.byte  $1e,$04,$07\n\t.byte  $12,$0c,$0f\n\t.byte  $12,$0c,$0d\n\t.byte  $0e,$0c,$07\n\t.byte  $1e,$06,$01\n\t.byte  $1e,$06,$02\n\t.byte  $1e,$06,$04\n\t.byte  $0a,$0c,$04\n\t.byte  $0a,$0c,$09\n\t.byte  $1e,$04,$08\n\t.byte  $1c,$04,$08\n\t.byte  $1b,$04,$06\n\t.byte  $19,$04,$05\n\t.byte  $1e,$06,$02\n\t.byte  $04,$04,$01\n\t.byte  $1e,$06,$00\n\t.byte  $04,$04,$01\n\t.byte  $06,$0c,$02\n\t.byte  $06,$0c,$04\n\t.byte  $06,$0c,$01\n\t.byte  $12,$04,$04\n\t.byte  $1e,$06,$02\n\t.byte  $05,$0c,$01\n\t.byte  $04,$04,$00\n\t.byte  $1e,$06,$01\n\t.byte  $1e,$06,$00\n\t.byte  $00,$06,$00\n\t.byte  $04,$0c,$01\n\t.byte  $04,$0c,$01\n\t.byte  $04,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_alienlife.s",
    "content": "\t.rodata\n\t.export\t_sfx_alienlife\n_sfx_alienlife:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte  $16,$04,$04 ; first chunk of freq,channel,volume\n\t.byte  $16,$04,$07\n\t.byte  $16,$04,$0f\n\t.byte  $16,$04,$0e\n\t.byte  $04,$0c,$07\n\t.byte  $0d,$04,$07\n\t.byte  $03,$0c,$04\n\t.byte  $03,$0c,$04\n\t.byte  $04,$0c,$02\n\t.byte  $05,$0c,$04\n\t.byte  $12,$04,$04\n\t.byte  $12,$04,$02\n\t.byte  $05,$0c,$04\n\t.byte  $05,$0c,$02\n\t.byte  $05,$0c,$02\n\t.byte  $10,$04,$02\n\t.byte  $00,$06,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_alientrill1.s",
    "content": "\t.rodata\n\t.export\t_sfx_alientrill1\n_sfx_alientrill1:\n\t.byte   $10,$05,$01 ; version, priority, frames per chunk\n\t.byte   $1B,$04,$08 ; first chunk of freq,channel,volume data \n\t.byte   $1E,$04,$08\n\t.byte   $1B,$04,$08\n\t.byte   $1E,$04,$08\n\t.byte   $18,$04,$08\n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_alientrill2.s",
    "content": "\t.rodata\n\t.export\t_sfx_alientrill2\n_sfx_alientrill2:\n\t.byte   $10,$05,$01 ; version, priority, frames per chunk\n\t.byte   $18,$04,$08 ; first chunk of freq,channel,volume data \n\t.byte   $1E,$04,$08\n\t.byte   $18,$04,$08\n\t.byte   $1E,$04,$08\n\t.byte   $14,$04,$08\n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_anotherjumpdies.s",
    "content": "\t.rodata\n\t.export\t_sfx_anotherjumpdies\n_sfx_anotherjumpdies:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0f,$04,$03\n\t.byte  $10,$04,$07\n\t.byte  $10,$04,$05\n\t.byte  $0f,$04,$02\n\t.byte  $0a,$04,$02\n\t.byte  $0c,$04,$06\n\t.byte  $0c,$04,$03\n\t.byte  $0d,$04,$05\n\t.byte  $0d,$04,$04\n\t.byte  $07,$06,$02\n\t.byte  $04,$0c,$04\n\t.byte  $04,$0c,$07\n\t.byte  $04,$0c,$03\n\t.byte  $09,$04,$02\n\t.byte  $09,$04,$01\n\t.byte  $10,$04,$03\n\t.byte  $0f,$04,$07\n\t.byte  $0f,$04,$04\n\t.byte  $0a,$04,$02\n\t.byte  $0a,$04,$02\n\t.byte  $10,$04,$06\n\t.byte  $10,$04,$06\n\t.byte  $05,$0c,$02\n\t.byte  $03,$0c,$01\n\t.byte  $03,$0c,$01\n\t.byte  $12,$04,$03\n\t.byte  $12,$04,$04\n\t.byte  $12,$04,$04\n\t.byte  $0c,$04,$04\n\t.byte  $0c,$04,$05\n\t.byte  $13,$04,$07\n\t.byte  $13,$04,$07\n\t.byte  $13,$04,$01\n\t.byte  $0c,$04,$02\n\t.byte  $0d,$04,$03\n\t.byte  $15,$04,$08\n\t.byte  $15,$04,$06\n\t.byte  $16,$04,$04\n\t.byte  $0d,$04,$02\n\t.byte  $04,$0c,$06\n\t.byte  $04,$0c,$05\n\t.byte  $07,$0c,$05\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$09\n\t.byte  $07,$06,$03\n\t.byte  $00,$06,$02\n\t.byte  $04,$0c,$02\n\t.byte  $18,$04,$03\n\t.byte  $18,$04,$0b\n\t.byte  $18,$04,$0a\n\t.byte  $1b,$04,$03\n\t.byte  $10,$04,$04\n\t.byte  $10,$04,$05\n\t.byte  $10,$04,$03\n\t.byte  $19,$04,$08\n\t.byte  $1b,$04,$0a\n\t.byte  $1b,$04,$08\n\t.byte  $05,$0c,$02\n\t.byte  $12,$04,$07\n\t.byte  $12,$04,$06\n\t.byte  $1c,$04,$07\n\t.byte  $1c,$04,$0d\n\t.byte  $1e,$04,$09\n\t.byte  $13,$04,$05\n\t.byte  $13,$04,$0c\n\t.byte  $13,$04,$06\n\t.byte  $0b,$0c,$04\n\t.byte  $1e,$04,$0e\n\t.byte  $1e,$04,$0d\n\t.byte  $0a,$0c,$06\n\t.byte  $15,$04,$04\n\t.byte  $15,$04,$0c\n\t.byte  $15,$04,$0a\n\t.byte  $15,$04,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_anotherjumpman.s",
    "content": "\t.rodata\n\t.export\t_sfx_anotherjumpman\n_sfx_anotherjumpman:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0c,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0d,$0c,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$0c\n\t.byte  $18,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$0d\n\t.byte  $18,$04,$09\n\t.byte  $1b,$04,$0e\n\t.byte  $1e,$04,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $0b,$0c,$07\n\t.byte  $0a,$0c,$0f\n\t.byte  $1b,$04,$0e\n\t.byte  $19,$04,$0d\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1e,$04,$0a\n\t.byte  $0b,$0c,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $1c,$04,$0b\n\t.byte  $19,$04,$08\n\t.byte  $18,$04,$09\n\t.byte  $18,$04,$07\n\t.byte  $1e,$04,$04\n\t.byte  $1e,$04,$03\n\t.byte  $0c,$0c,$01\n\t.byte  $0c,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_anotherup.s",
    "content": "\t.rodata\n\t.export\t_sfx_anotherup\n_sfx_anotherup:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $06,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $06,$0c,$08\n\t.byte  $06,$0c,$0f\n\t.byte  $06,$0c,$0f\n\t.byte  $06,$0c,$0a\n\t.byte  $15,$04,$0a\n\t.byte  $06,$0c,$09\n\t.byte  $10,$04,$0f\n\t.byte  $02,$0c,$07\n\t.byte  $10,$04,$0f\n\t.byte  $10,$04,$0d\n\t.byte  $10,$04,$09\n\t.byte  $10,$04,$0b\n\t.byte  $0d,$04,$0d\n\t.byte  $06,$04,$06\n\t.byte  $0d,$04,$0c\n\t.byte  $0d,$04,$0a\n\t.byte  $0d,$04,$06\n\t.byte  $0d,$04,$0c\n\t.byte  $06,$0c,$0c\n\t.byte  $06,$0c,$0f\n\t.byte  $06,$0c,$0f\n\t.byte  $06,$0c,$0a\n\t.byte  $06,$0c,$06\n\t.byte  $06,$0c,$0f\n\t.byte  $10,$04,$0d\n\t.byte  $10,$04,$0d\n\t.byte  $10,$04,$0a\n\t.byte  $10,$04,$0a\n\t.byte  $10,$04,$06\n\t.byte  $04,$0c,$04\n\t.byte  $0d,$04,$08\n\t.byte  $0d,$04,$08\n\t.byte  $06,$04,$03\n\t.byte  $0d,$04,$09\n\t.byte  $0d,$04,$05\n\t.byte  $04,$0c,$04\n\t.byte  $06,$0c,$05\n\t.byte  $06,$0c,$05\n\t.byte  $06,$0c,$09\n\t.byte  $06,$0c,$0b\n\t.byte  $06,$0c,$09\n\t.byte  $06,$0c,$04\n\t.byte  $10,$04,$04\n\t.byte  $10,$04,$03\n\t.byte  $10,$04,$02\n\t.byte  $10,$04,$04\n\t.byte  $10,$04,$03\n\t.byte  $10,$04,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_arfarf.s",
    "content": "\t.rodata\n\t.export\t_sfx_arfarf\n_sfx_arfarf:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte   $0d, $0c, $01 ; first chunk of freq,channel,volume\n\t.byte   $0c, $0c, $07\n\t.byte   $12, $04, $0d\n\t.byte   $08, $07, $0c\n\t.byte   $1b, $04, $0c\n\t.byte   $1b, $04, $0d\n\t.byte   $19, $04, $0f\n\t.byte   $12, $04, $0d\n\t.byte   $12, $04, $0e\n\t.byte   $12, $04, $0e\n\t.byte   $07, $01, $0d\n\t.byte   $0a, $0c, $0d\n\t.byte   $1f, $04, $02\n\t.byte   $09, $01, $00\n\t.byte   $0b, $0c, $03\n\t.byte   $0b, $0c, $09\n\t.byte   $12, $0f, $0d\n\t.byte   $0f, $04, $0d\n\t.byte   $1c, $04, $0c\n\t.byte   $1b, $04, $0d\n\t.byte   $1a, $04, $0e\n\t.byte   $19, $04, $0d\n\t.byte   $19, $04, $0e\n\t.byte   $06, $01, $0d\n\t.byte   $01, $06, $0d\n\t.byte   $0a, $0c, $0d\n\t.byte   $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_babyribbit.s",
    "content": "\t.rodata\n\t.export\t_sfx_babyribbit\n_sfx_babyribbit:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0e\n\t.byte  $0c,$04,$0e\n\t.byte  $1c,$04,$0e\n\t.byte  $0a,$0c,$06\n\t.byte  $0e,$0c,$00\n\t.byte  $1e,$06,$00\n\t.byte  $18,$04,$06\n\t.byte  $18,$04,$0b\n\t.byte  $16,$04,$0b\n\t.byte  $08,$04,$07\n\t.byte  $04,$04,$04\n\t.byte  $00,$04,$02\n\t.byte  $00,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_babyribbithop.s",
    "content": "\t.rodata\n\t.export\t_sfx_babyribbithop\n_sfx_babyribbithop:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0c,$0c,$04 ; first chunk of freq,channel,volume\n\t.byte  $17,$0c,$04\n\t.byte  $04,$0c,$06\n\t.byte  $0d,$04,$0d\n\t.byte  $0d,$04,$0c\n\t.byte  $0a,$04,$0f\n\t.byte  $09,$04,$09\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $09,$04,$0d\n\t.byte  $10,$0c,$09\n\t.byte  $09,$04,$07\n\t.byte  $0a,$06,$06\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_babywah.s",
    "content": "\t.rodata\n\t.export\t_sfx_babywah\n_sfx_babywah:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0d,$04,$0b ; first chunk of freq,channel,volume\n\t.byte  $0d,$04,$0f\n\t.byte  $0d,$04,$05\n\t.byte  $19,$04,$0c\n\t.byte  $19,$04,$0d\n\t.byte  $0c,$04,$0f\n\t.byte  $19,$04,$0f\n\t.byte  $0c,$04,$07\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $03,$0c,$07\n\t.byte  $03,$0c,$09\n\t.byte  $03,$0c,$06\n\t.byte  $18,$04,$0c\n\t.byte  $18,$04,$0c\n\t.byte  $18,$04,$0c\n\t.byte  $1b,$04,$04\n\t.byte  $0d,$04,$06\n\t.byte  $1c,$04,$04\n\t.byte  $0a,$06,$03\n\t.byte  $12,$04,$02\n\t.byte  $10,$04,$05\n\t.byte  $05,$0c,$06\n\t.byte  $12,$04,$07\n\t.byte  $06,$0c,$04\n\t.byte  $07,$0c,$03\n\t.byte  $19,$04,$02\n\t.byte  $1c,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_bassbump.s",
    "content": "\t.rodata\n\t.export\t_sfx_bassbump\n_sfx_bassbump:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1b,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $0f,$06,$0c\n\t.byte  $07,$06,$0e\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $07,$06,$06\n\t.byte  $0f,$06,$0f\n\t.byte  $1b,$0c,$04\n\t.byte  $0f,$06,$05\n\t.byte  $0f,$06,$06\n\t.byte  $07,$06,$01\n\t.byte  $0f,$06,$03\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_bassbump2.s",
    "content": "\t.rodata\n\t.export\t_sfx_bassbump2\n_sfx_bassbump2:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $17,$0c,$05\n\t.byte  $1e,$06,$0c\n\t.byte  $1e,$06,$08\n\t.byte  $07,$06,$07\n\t.byte  $1e,$0c,$06\n\t.byte  $12,$0c,$03\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$01\n\t.byte  $1e,$06,$01\n\t.byte  $1e,$06,$01\n\t.byte  $1e,$06,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_berzerkrobotdeath.s",
    "content": "\t.rodata\n\t.export\t_sfx_berzerkrobotdeath\n_sfx_berzerkrobotdeath:\n\t.byte   $10,$10,$00 ; version, priority, frames per chunk\n\t.byte   $00,$08,$0F ; first chunk of freq,channel,volume data \n\t.byte   $01,$08,$0E\n\t.byte   $02,$08,$0D\n\t.byte   $03,$08,$0C\n\t.byte   $04,$08,$0B\n\t.byte   $05,$08,$0A\n\t.byte   $06,$08,$09\n\t.byte   $07,$08,$08\n\t.byte   $08,$08,$07\n\t.byte   $09,$08,$06\n\t.byte   $0a,$08,$05\n\t.byte   $0b,$08,$04\n\t.byte   $0c,$08,$03\n\t.byte   $0d,$08,$02\n\t.byte   $0e,$08,$01\n\t.byte   $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_bling.s",
    "content": "\t.rodata\n\t.export\t_sfx_bling\n_sfx_bling:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1c,$04,$07\n\t.byte  $1b,$04,$07\n\t.byte  $04,$0f,$05\n\t.byte  $15,$04,$09\n\t.byte  $16,$04,$07\n\t.byte  $03,$0f,$04\n\t.byte  $11,$04,$08\n\t.byte  $11,$04,$08\n\t.byte  $11,$04,$04\n\t.byte  $0e,$04,$09\n\t.byte  $0e,$04,$07\n\t.byte  $0e,$04,$04\n\t.byte  $1c,$04,$07\n\t.byte  $1b,$04,$05\n\t.byte  $1c,$04,$04\n\t.byte  $1b,$04,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_bubbleup.s",
    "content": "\t.rodata\n\t.export\t_sfx_bubbleup\n_sfx_bubbleup:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $1e,$04,$0f\n\t.byte  $12,$0c,$0e\n\t.byte  $19,$04,$06\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0d\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0e\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0f\n\t.byte  $1b,$04,$0a\n\t.byte  $1b,$04,$0e\n\t.byte  $1b,$04,$0b\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0e\n\t.byte  $10,$0c,$07\n\t.byte  $19,$04,$0c\n\t.byte  $19,$04,$08\n\t.byte  $0d,$0c,$07\n\t.byte  $0e,$0c,$07\n\t.byte  $0d,$0c,$0d\n\t.byte  $0d,$0c,$08\n\t.byte  $18,$04,$06\n\t.byte  $07,$0c,$04\n\t.byte  $0d,$0c,$07\n\t.byte  $0d,$0c,$0b\n\t.byte  $13,$04,$01\n\t.byte  $16,$04,$04\n\t.byte  $16,$04,$06\n\t.byte  $16,$04,$03\n\t.byte  $0c,$0c,$04\n\t.byte  $0c,$0c,$06\n\t.byte  $0c,$0c,$04\n\t.byte  $15,$04,$03\n\t.byte  $15,$04,$03\n\t.byte  $06,$0c,$01\n\t.byte  $0b,$0c,$02\n\t.byte  $0b,$0c,$04\n\t.byte  $0b,$0c,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_buzzbomb.s",
    "content": "\t.rodata\n\t.export\t_sfx_buzzbomb\n_sfx_buzzbomb:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $03,$06,$05 ; first chunk of freq,channel,volume\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $07,$06,$0b\n\t.byte  $07,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $07,$06,$0e\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0a\n\t.byte  $0f,$06,$0f\n\t.byte  $1b,$0c,$0a\n\t.byte  $0f,$06,$08\n\t.byte  $03,$06,$07\n\t.byte  $07,$06,$06\n\t.byte  $03,$06,$07\n\t.byte  $0f,$06,$05\n\t.byte  $07,$06,$05\n\t.byte  $0f,$06,$04\n\t.byte  $07,$06,$04\n\t.byte  $07,$06,$02\n\t.byte  $0f,$06,$02\n\t.byte  $1b,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_cabwhistle.s",
    "content": "\t.rodata\n\t.export\t_sfx_cabwhistle\n_sfx_cabwhistle:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0a,$04,$03 ; first chunk of freq,channel,volume\n\t.byte  $09,$04,$04\n\t.byte  $02,$0c,$04\n\t.byte  $07,$04,$04\n\t.byte  $06,$04,$05\n\t.byte  $06,$04,$05\n\t.byte  $06,$04,$06\n\t.byte  $06,$04,$07\n\t.byte  $06,$04,$06\n\t.byte  $06,$04,$05\n\t.byte  $07,$04,$06\n\t.byte  $02,$0c,$04\n\t.byte  $02,$0c,$0a\n\t.byte  $09,$04,$0a\n\t.byte  $0a,$04,$0b\n\t.byte  $0a,$04,$0b\n\t.byte  $0a,$04,$0f\n\t.byte  $03,$0c,$0b\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$08\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$09\n\t.byte  $0a,$04,$0d\n\t.byte  $0a,$04,$0a\n\t.byte  $09,$04,$06\n\t.byte  $09,$04,$07\n\t.byte  $02,$0c,$04\n\t.byte  $02,$0c,$03\n\t.byte  $07,$04,$03\n\t.byte  $07,$04,$02\n\t.byte  $06,$04,$03\n\t.byte  $06,$04,$03\n\t.byte  $06,$04,$06\n\t.byte  $06,$04,$06\n\t.byte  $06,$04,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_cavalry.s",
    "content": "\t.rodata\n\t.export\t_sfx_cavalry\n_sfx_cavalry:\n\t.byte   $10,$07,$05 ; version, priority, frames per chunk\n\t.byte   $1D,$04,$08 ; first chunk of freq,channel,volume data \n\t.byte   $1A,$04,$08\n\t.byte   $17,$04,$08\n\t.byte   $13,$04,$08\n\t.byte   $17,$04,$08\n\t.byte   $13,$04,$08\n\t.byte   $13,$04,$08\n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_chirp.s",
    "content": "\t.rodata\n\t.export\t_sfx_chirp\n_sfx_chirp:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $07, $04, $0e ; first chunk of freq,channel,volume\n\t.byte  $0a, $04, $0e\n\t.byte  $0c, $04, $0e\n\t.byte  $09, $04, $0f\n\t.byte  $0a, $04, $0e\n\t.byte  $07, $04, $01\n\t.byte  $09, $04, $00\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_crystalchimes.s",
    "content": "\t.rodata\n\t.export\t_sfx_crystalchimes\n_sfx_crystalchimes:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $03,$04,$05 ; first chunk of freq,channel,volume\n\t.byte  $03,$04,$0f\n\t.byte  $0c,$04,$05\n\t.byte  $0c,$04,$0d\n\t.byte  $0c,$04,$0f\n\t.byte  $0c,$04,$0b\n\t.byte  $0c,$04,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $06,$04,$0b\n\t.byte  $0c,$04,$0c\n\t.byte  $0c,$04,$0b\n\t.byte  $06,$04,$0a\n\t.byte  $03,$0c,$0d\n\t.byte  $03,$0c,$0b\n\t.byte  $03,$0c,$0a\n\t.byte  $03,$0c,$08\n\t.byte  $06,$04,$09\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0d\n\t.byte  $06,$04,$08\n\t.byte  $03,$0c,$0c\n\t.byte  $0a,$04,$07\n\t.byte  $0a,$04,$0a\n\t.byte  $0a,$04,$0d\n\t.byte  $03,$0c,$04\n\t.byte  $0a,$04,$07\n\t.byte  $06,$04,$06\n\t.byte  $0a,$04,$08\n\t.byte  $0a,$04,$0c\n\t.byte  $06,$04,$07\n\t.byte  $0a,$04,$04\n\t.byte  $0a,$04,$05\n\t.byte  $06,$04,$06\n\t.byte  $1e,$06,$02\n\t.byte  $06,$04,$05\n\t.byte  $0a,$04,$06\n\t.byte  $0a,$04,$06\n\t.byte  $06,$04,$05\n\t.byte  $0a,$04,$07\n\t.byte  $06,$04,$04\n\t.byte  $0a,$04,$05\n\t.byte  $0a,$04,$06\n\t.byte  $06,$04,$05\n\t.byte  $1e,$06,$01\n\t.byte  $06,$04,$04\n\t.byte  $0a,$04,$04\n\t.byte  $0a,$04,$04\n\t.byte  $0a,$04,$02\n\t.byte  $0a,$04,$02\n\t.byte  $06,$04,$03\n\t.byte  $0a,$04,$03\n\t.byte  $0a,$04,$05\n\t.byte  $06,$04,$02\n\t.byte  $0a,$04,$04\n\t.byte  $0a,$04,$03\n\t.byte  $0a,$04,$02\n\t.byte  $0a,$04,$03\n\t.byte  $0a,$04,$02\n\t.byte  $0a,$04,$03\n\t.byte  $0a,$04,$03\n\t.byte  $06,$04,$01\n\t.byte  $0a,$04,$03\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$02\n\t.byte  $0a,$04,$01\n\t.byte  $06,$04,$01\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_deeproar.s",
    "content": "\t.rodata\n\t.export\t_sfx_deeproar\n_sfx_deeproar:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0f,$06,$02 ; first chunk of freq,channel,volume\n\t.byte  $0b,$06,$0a\n\t.byte  $1f,$06,$0f\n\t.byte  $14,$0f,$0f\n\t.byte  $0c,$06,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $0d,$06,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $16,$06,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $14,$0f,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $16,$06,$0f\n\t.byte  $13,$0f,$0f\n\t.byte  $16,$06,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $13,$0f,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $14,$0f,$0f\n\t.byte  $16,$06,$0f\n\t.byte  $0d,$06,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $13,$0f,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $14,$0f,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $0d,$06,$0f\n\t.byte  $14,$0f,$0f\n\t.byte  $14,$0f,$0f\n\t.byte  $0d,$06,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $14,$0f,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $13,$06,$0f\n\t.byte  $0d,$06,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $13,$0f,$0c\n\t.byte  $14,$0f,$0a\n\t.byte  $14,$0f,$0a\n\t.byte  $17,$06,$0a\n\t.byte  $17,$06,$0a\n\t.byte  $13,$0f,$0a\n\t.byte  $0d,$06,$07\n\t.byte  $13,$06,$07\n\t.byte  $17,$06,$07\n\t.byte  $13,$06,$07\n\t.byte  $13,$06,$07\n\t.byte  $0d,$06,$07\n\t.byte  $0d,$06,$05\n\t.byte  $17,$06,$05\n\t.byte  $17,$06,$02\n\t.byte  $0d,$06,$02\n\t.byte  $0d,$06,$02\n\t.byte  $0d,$06,$02\n\t.byte  $1c,$0f,$02\n\t.byte  $1d,$0f,$02\n\t.byte  $0d,$06,$02\n\t.byte  $0d,$06,$02\n\t.byte  $0c,$06,$02\n\t.byte  $0d,$06,$02\n\t.byte  $1b,$0f,$02\n\t.byte  $17,$06,$02\n\t.byte  $0d,$06,$02\n\t.byte  $13,$0f,$02\n\t.byte  $13,$0f,$02\n\t.byte  $0c,$06,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_denied.s",
    "content": "\t.rodata\n\t.export\t_sfx_denied\n_sfx_denied:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0e,$0c,$0d ; first chunk of freq,channel,volume\n\t.byte  $10,$0c,$0a\n\t.byte  $10,$0c,$0c\n\t.byte  $1e,$06,$05\n\t.byte  $1e,$06,$09\n\t.byte  $12,$0c,$07\n\t.byte  $12,$0c,$0b\n\t.byte  $12,$0c,$0f\n\t.byte  $12,$0c,$0b\n\t.byte  $12,$0c,$07\n\t.byte  $03,$06,$05\n\t.byte  $03,$06,$04\n\t.byte  $03,$06,$09\n\t.byte  $1e,$06,$03\n\t.byte  $12,$0c,$07\n\t.byte  $12,$0c,$07\n\t.byte  $12,$0c,$05\n\t.byte  $1e,$06,$05\n\t.byte  $1f,$0c,$03\n\t.byte  $1f,$0c,$02\n\t.byte  $1f,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_distressed.s",
    "content": "\t.rodata\n\t.export\t_sfx_distressed\n_sfx_distressed:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $00,$06,$02 ; first chunk of freq,channel,volume\n\t.byte  $00,$06,$01\n\t.byte  $0f,$04,$09\n\t.byte  $00,$06,$0a\n\t.byte  $04,$0c,$0b\n\t.byte  $0f,$04,$0b\n\t.byte  $12,$04,$09\n\t.byte  $0c,$04,$0b\n\t.byte  $15,$04,$0f\n\t.byte  $15,$04,$0f\n\t.byte  $03,$0c,$0e\n\t.byte  $0c,$04,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0d,$04,$0b\n\t.byte  $04,$0c,$07\n\t.byte  $00,$06,$05\n\t.byte  $00,$06,$04\n\t.byte  $00,$06,$03\n\t.byte  $00,$06,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_distressed2.s",
    "content": "\t.rodata\n\t.export\t_sfx_distressed2\n_sfx_distressed2:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $12,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $12,$0c,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $1e,$06,$0b\n\t.byte  $1e,$06,$0c\n\t.byte  $03,$0c,$08\n\t.byte  $0c,$04,$0e\n\t.byte  $0c,$04,$0a\n\t.byte  $0c,$04,$0a\n\t.byte  $1e,$06,$08\n\t.byte  $1e,$06,$08\n\t.byte  $1e,$06,$09\n\t.byte  $1e,$06,$05\n\t.byte  $04,$0c,$09\n\t.byte  $1e,$06,$03\n\t.byte  $00,$06,$06\n\t.byte  $0f,$04,$03\n\t.byte  $10,$04,$03\n\t.byte  $10,$04,$01\n\t.byte  $05,$0c,$01\n\t.byte  $12,$04,$01\n\t.byte  $12,$04,$01\n\t.byte  $13,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_distressed3.s",
    "content": "\t.rodata\n\t.export\t_sfx_distressed3\n_sfx_distressed3:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $05,$0c,$0c ; first chunk of freq,channel,volume\n\t.byte  $1b,$04,$0e\n\t.byte  $1b,$04,$0d\n\t.byte  $1b,$04,$06\n\t.byte  $0d,$04,$07\n\t.byte  $1b,$04,$05\n\t.byte  $1b,$04,$0b\n\t.byte  $1b,$04,$06\n\t.byte  $1c,$04,$09\n\t.byte  $0d,$04,$07\n\t.byte  $1c,$04,$0b\n\t.byte  $1c,$04,$0e\n\t.byte  $1c,$04,$09\n\t.byte  $07,$06,$08\n\t.byte  $07,$06,$07\n\t.byte  $1c,$04,$05\n\t.byte  $1e,$04,$0b\n\t.byte  $1e,$04,$0b\n\t.byte  $1e,$04,$0a\n\t.byte  $1e,$04,$09\n\t.byte  $0a,$06,$04\n\t.byte  $1e,$04,$03\n\t.byte  $0a,$0c,$03\n\t.byte  $0a,$06,$03\n\t.byte  $0a,$0c,$02\n\t.byte  $0a,$0c,$03\n\t.byte  $0b,$0c,$01\n\t.byte  $0a,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_distressed4.s",
    "content": "\t.rodata\n\t.export\t_sfx_distressed4\n_sfx_distressed4:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1b,$04,$04 ; first chunk of freq,channel,volume\n\t.byte  $1c,$04,$0a\n\t.byte  $1c,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $19,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$09\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$09\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$09\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1d,$04,$08\n\t.byte  $1d,$04,$02\n\t.byte  $1d,$04,$01\n\t.byte  $1d,$04,$00\n\t.byte  $1d,$04,$02\n\t.byte  $1d,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_doorpound.s",
    "content": "\t.rodata\n\t.export\t_sfx_doorpound\n_sfx_doorpound:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0f,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $1e,$0c,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $0a,$06,$0f\n\t.byte  $07,$06,$0b\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0c\n\t.byte  $07,$06,$0a\n\t.byte  $07,$06,$09\n\t.byte  $0f,$06,$0b\n\t.byte  $1e,$06,$07\n\t.byte  $0a,$06,$06\n\t.byte  $0a,$06,$08\n\t.byte  $0f,$06,$06\n\t.byte  $0a,$06,$05\n\t.byte  $1e,$06,$03\n\t.byte  $0f,$06,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_downthepipe.s",
    "content": "\t.rodata\n\t.export\t_sfx_downthepipe\n_sfx_downthepipe:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $1e,$06,$0f\n\t.byte  $18,$04,$08\n\t.byte  $0c,$0c,$0d\n\t.byte  $12,$0c,$0b\n\t.byte  $0a,$06,$06\n\t.byte  $18,$04,$0a\n\t.byte  $0c,$0c,$0b\n\t.byte  $03,$06,$0f\n\t.byte  $1e,$0c,$0e\n\t.byte  $1e,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $1e,$06,$02\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $07,$06,$00\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $18,$04,$08\n\t.byte  $0c,$0c,$0d\n\t.byte  $12,$0c,$0b\n\t.byte  $0a,$06,$06\n\t.byte  $18,$04,$0a\n\t.byte  $0c,$0c,$0b\n\t.byte  $03,$06,$0f\n\t.byte  $1e,$0c,$0e\n\t.byte  $1e,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $1e,$06,$02\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $07,$06,$00\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $18,$04,$08\n\t.byte  $0c,$0c,$0d\n\t.byte  $12,$0c,$0b\n\t.byte  $0a,$06,$06\n\t.byte  $18,$04,$0a\n\t.byte  $0c,$0c,$0b\n\t.byte  $03,$06,$0f\n\t.byte  $1e,$0c,$0e\n\t.byte  $1e,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $1e,$06,$02\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $07,$06,$00\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_dragit.s",
    "content": "\t.rodata\n\t.export\t_sfx_dragit\n_sfx_dragit:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1c,$07,$02 ; first chunk of freq,channel,volume\n\t.byte  $02,$07,$06\n\t.byte  $1e,$08,$09\n\t.byte  $11,$08,$09\n\t.byte  $1e,$08,$09\n\t.byte  $11,$07,$06\n\t.byte  $1e,$08,$09\n\t.byte  $11,$07,$06\n\t.byte  $0e,$07,$03\n\t.byte  $06,$07,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_drip.s",
    "content": "\t.rodata\n\t.export\t_sfx_drip\n_sfx_drip:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $17,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $17,$0c,$0a\n\t.byte  $0d,$0c,$0a\n\t.byte  $1e,$06,$07\n\t.byte  $12,$0c,$01\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$02\n\t.byte  $03,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $03,$06,$01\n\t.byte  $03,$06,$02\n\t.byte  $12,$0c,$01\n\t.byte  $10,$0c,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_dropmedium.s",
    "content": "\t.rodata\n\t.export\t_sfx_dropmedium\n_sfx_dropmedium:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $00,$04,$00 ; first chunk of freq,channel,volume\n\t.byte  $03,$06,$0c\n\t.byte  $0d,$0c,$0f\n\t.byte  $1b,$04,$04\n\t.byte  $06,$0c,$00\n\t.byte  $00,$06,$00\n\t.byte  $07,$06,$00\n\t.byte  $10,$0c,$00\n\t.byte  $0d,$0c,$00\n\t.byte  $10,$0c,$00\n\t.byte  $03,$06,$00\n\t.byte  $10,$0c,$00\n\t.byte  $1b,$04,$00\n\t.byte  $10,$0c,$00\n\t.byte  $10,$0c,$00\n\t.byte  $03,$06,$00\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_dropped.s",
    "content": "\t.rodata\n\t.export\t_sfx_dropped\n_sfx_dropped:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0a,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $0a,$06,$0f\n\t.byte  $0a,$06,$06\n\t.byte  $0c,$04,$02\n\t.byte  $1b,$0c,$01\n\t.byte  $07,$06,$0f\n\t.byte  $0a,$06,$0f\n\t.byte  $0a,$06,$0f\n\t.byte  $0a,$06,$07\n\t.byte  $07,$04,$06\n\t.byte  $07,$04,$04\n\t.byte  $07,$06,$0f\n\t.byte  $07,$06,$0d\n\t.byte  $07,$04,$0e\n\t.byte  $07,$04,$06\n\t.byte  $07,$04,$03\n\t.byte  $0a,$06,$09\n\t.byte  $0a,$06,$0f\n\t.byte  $07,$04,$0f\n\t.byte  $07,$04,$05\n\t.byte  $07,$04,$05\n\t.byte  $1b,$0c,$08\n\t.byte  $07,$04,$0d\n\t.byte  $07,$04,$07\n\t.byte  $07,$04,$07\n\t.byte  $07,$04,$03\n\t.byte  $07,$04,$07\n\t.byte  $07,$04,$05\n\t.byte  $07,$04,$03\n\t.byte  $07,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_dunno.s",
    "content": "\t.rodata\n\t.export\t_sfx_dunno\n_sfx_dunno:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0b,$0c,$04 ; first chunk of freq,channel,volume\n\t.byte  $0a,$0c,$0b\n\t.byte  $0a,$0c,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $0a,$0c,$0d\n\t.byte  $0a,$0c,$0f\n\t.byte  $0b,$0c,$0c\n\t.byte  $0b,$0c,$0f\n\t.byte  $0b,$0c,$0d\n\t.byte  $0b,$0c,$07\n\t.byte  $0b,$0c,$0b\n\t.byte  $0b,$0c,$08\n\t.byte  $08,$0c,$03\n\t.byte  $0b,$0c,$06\n\t.byte  $0b,$0c,$08\n\t.byte  $0b,$0c,$09\n\t.byte  $0b,$0c,$06\n\t.byte  $0c,$0c,$05\n\t.byte  $0b,$0c,$04\n\t.byte  $0b,$0c,$03\n\t.byte  $0b,$0c,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_echo1.s",
    "content": "\t.rodata\n\t.export\t_sfx_echo1\n_sfx_echo1:\n\t.byte   $10,$08,$08 ; version, priority, frames per chunk\n\t.byte   $18,$06,$0a ; first chunk of freq,channel,volume data \n\t.byte   $08,$06,$0a\n\t.byte   $01,$00,$00 \n\t.byte   $18,$06,$05\n\t.byte   $08,$06,$05\n\t.byte   $01,$00,$00 \n\t.byte   $18,$06,$02\n\t.byte   $08,$06,$02\n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_echo2.s",
    "content": "\t.rodata\n\t.export\t_sfx_echo2\n_sfx_echo2:\n\t.byte   $10,$05,$04 ; version, priority, frames per chunk\n\t.byte   $1F,$04,$0A ; first chunk of freq,channel,volume data \n\t.byte   $01,$00,$00\n\t.byte   $1F,$04,$05\n\t.byte   $01,$00,$00\n\t.byte   $1F,$04,$02\n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_echobang.s",
    "content": "\t.rodata\n\t.export\t_sfx_echobang\n_sfx_echobang:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $19,$07,$0f ; first chunk of freq,channel,volume\n\t.byte  $13,$07,$0f\n\t.byte  $1a,$06,$0f\n\t.byte  $1a,$01,$0f\n\t.byte  $17,$07,$0f\n\t.byte  $10,$0c,$0f\n\t.byte  $14,$07,$0f\n\t.byte  $04,$07,$0f\n\t.byte  $0e,$07,$0f\n\t.byte  $1b,$01,$0f\n\t.byte  $1b,$01,$0f\n\t.byte  $1e,$07,$0f\n\t.byte  $12,$07,$0f\n\t.byte  $09,$06,$0f\n\t.byte  $17,$0f,$0f\n\t.byte  $11,$06,$0f\n\t.byte  $09,$07,$0b\n\t.byte  $09,$07,$0e\n\t.byte  $0b,$0f,$0b\n\t.byte  $0e,$0f,$0c\n\t.byte  $1a,$07,$09\n\t.byte  $13,$0f,$09\n\t.byte  $14,$0f,$0b\n\t.byte  $0c,$0e,$07\n\t.byte  $18,$07,$07\n\t.byte  $19,$07,$07\n\t.byte  $0b,$0f,$06\n\t.byte  $1a,$07,$07\n\t.byte  $1a,$07,$03\n\t.byte  $1f,$07,$03\n\t.byte  $18,$06,$06\n\t.byte  $17,$06,$04\n\t.byte  $14,$06,$04\n\t.byte  $15,$07,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_eek.s",
    "content": "\t.rodata\n\t.export\t_sfx_eek\n_sfx_eek:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$06,$04 ; first chunk of freq,channel,volume\n\t.byte  $10,$0c,$03\n\t.byte  $1e,$04,$0b\n\t.byte  $1c,$04,$0f\n\t.byte  $0d,$04,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$08\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$07\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0c\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $04,$0c,$06\n\t.byte  $0c,$04,$02\n\t.byte  $06,$0c,$01\n\t.byte  $06,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_eek2.s",
    "content": "\t.rodata\n\t.export\t_sfx_eek2\n_sfx_eek2:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$06,$01 ; first chunk of freq,channel,volume\n\t.byte  $0a,$04,$0a\n\t.byte  $0a,$04,$0f\n\t.byte  $09,$04,$0f\n\t.byte  $13,$04,$0e\n\t.byte  $09,$04,$0f\n\t.byte  $09,$04,$0f\n\t.byte  $09,$04,$0f\n\t.byte  $09,$04,$0a\n\t.byte  $09,$04,$0f\n\t.byte  $09,$04,$0c\n\t.byte  $09,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0c\n\t.byte  $03,$0c,$0f\n\t.byte  $0c,$04,$0a\n\t.byte  $0d,$04,$05\n\t.byte  $09,$04,$02\n\t.byte  $03,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_electrobump.s",
    "content": "\t.rodata\n\t.export\t_sfx_electrobump\n_sfx_electrobump:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte  $08,$08,$0a\n\t.byte  $08,$0c,$0a\n\t.byte  $08,$06,$0a\n\t.byte  $08,$0e,$0a\n\t.byte  $08,$06,$08\n\t.byte  $08,$06,$08\n\t.byte  $08,$0e,$06\n\t.byte  $08,$06,$04\n\t.byte  $08,$06,$02\n\t.byte  0,0,0\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_electropunch.s",
    "content": "\t.rodata\n\t.export\t_sfx_electropunch\n_sfx_electropunch:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $07,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $0f,$06,$08\n\t.byte  $1e,$04,$0a\n\t.byte  $0f,$06,$08\n\t.byte  $12,$04,$06\n\t.byte  $0f,$06,$05\n\t.byte  $0f,$06,$06\n\t.byte  $0c,$04,$03\n\t.byte  $07,$06,$01\n\t.byte  $0a,$04,$03\n\t.byte  $02,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_electrosplosion.s",
    "content": "\t.rodata\n\t.export\t_sfx_electrosplosion\n_sfx_electrosplosion:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte  $0f,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $07,$06,$0a\n\t.byte  $07,$06,$0f\n\t.byte  $03,$06,$06\n\t.byte  $07,$06,$0f\n\t.byte  $0f,$06,$08\n\t.byte  $07,$06,$06\n\t.byte  $0f,$06,$0a\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$06\n\t.byte  $07,$06,$05\n\t.byte  $0f,$06,$0d\n\t.byte  $0f,$06,$0a\n\t.byte  $1b,$0c,$05\n\t.byte  $0f,$06,$0c\n\t.byte  $0f,$06,$09\n\t.byte  $0f,$06,$0d\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$04\n\t.byte  $0f,$06,$06\n\t.byte  $0f,$06,$0f\n\t.byte  $07,$06,$05\n\t.byte  $0f,$06,$06\n\t.byte  $0f,$06,$01\n\t.byte  $07,$06,$01\n\t.byte  $0f,$06,$00\n\t.byte  $0f,$06,$03\n\t.byte  $0f,$06,$01\n\t.byte  $0f,$06,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_electroswitch.s",
    "content": "\t.rodata\n\t.export\t_sfx_electroswitch\n_sfx_electroswitch:\n\t.byte   $10,$01,$02 ; version, priority, frames per chunk\n\t.byte   $06,$04,$0F ; first chunk of freq,channel,volume data\n\t.byte   $0C,$04,$08 ; first chunk of freq,channel,volume data\n\t.byte   $18,$04,$04 ; first chunk of freq,channel,volume data\n\t.byte   $31,$04,$02 ; first chunk of freq,channel,volume data\n\t.byte   $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_electroswitch2.s",
    "content": "\t.rodata\n\t.export\t_sfx_electroswitch2\n_sfx_electroswitch2:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $05,$0c,$0b ; first chunk of freq,channel,volume\n\t.byte  $17,$0c,$0c\n\t.byte  $0c,$04,$0b\n\t.byte  $07,$04,$0b\n\t.byte  $0c,$04,$0f\n\t.byte  $0c,$04,$08\n\t.byte  $12,$04,$09\n\t.byte  $12,$04,$0f\n\t.byte  $1b,$0c,$08\n\t.byte  $0a,$06,$09\n\t.byte  $0a,$06,$02\n\t.byte  $1b,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_explosion.s",
    "content": "\t.rodata\n\t.export\t_sfx_explosion\n_sfx_explosion:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $01,$08,$02\n\t.byte  $0b,$0c,$05\n\t.byte  $04,$06,$08\n\t.byte  $03,$0e,$0f\n\t.byte  $09,$06,$0f\n\t.byte  $0d,$06,$0f\n\t.byte  $04,$0e,$0f\n\t.byte  $0f,$06,$08\n\t.byte  $09,$06,$04\n\t.byte  $16,$01,$03\n\t.byte  $0c,$06,$04\n\t.byte  $09,$06,$05\n\t.byte  $0a,$06,$03\n\t.byte  $09,$06,$05\n\t.byte  $0d,$06,$08\n\t.byte  $09,$06,$04\n\t.byte  $04,$0e,$06\n\t.byte  $0f,$06,$05\n\t.byte  $0f,$06,$07\n\t.byte  $04,$0e,$07\n\t.byte  $08,$06,$06\n\t.byte  $03,$0e,$08\n\t.byte  $0f,$06,$06\n\t.byte  $09,$06,$05\n\t.byte  $06,$06,$05\n\t.byte  $03,$0e,$05\n\t.byte  $0e,$06,$06\n\t.byte  $02,$0e,$05\n\t.byte  $0f,$06,$03\n\t.byte  $0e,$06,$06\n\t.byte  $09,$06,$05\n\t.byte  $0c,$06,$05\n\t.byte  $0f,$06,$03\n\t.byte  $04,$0e,$08\n\t.byte  $0c,$06,$03\n\t.byte  $0f,$06,$03\n\t.byte  $0c,$06,$06\n\t.byte  $0f,$06,$04\n\t.byte  $0f,$06,$05\n\t.byte  $0f,$06,$03\n\t.byte  $0a,$06,$04\n\t.byte  $0f,$06,$03\n\t.byte  $08,$06,$03\n\t.byte  $0c,$06,$03\n\t.byte  $0e,$06,$03\n\t.byte  $08,$06,$03\n\t.byte  0,0,0\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_falling.s",
    "content": "\t.rodata\n\t.export\t_sfx_falling\n_sfx_falling:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0f,$04,$00 ; first chunk of freq,channel,volume\n\t.byte  $03,$0c,$03\n\t.byte  $0c,$04,$04\n\t.byte  $0c,$04,$0b\n\t.byte  $0c,$04,$0b\n\t.byte  $0d,$04,$0a\n\t.byte  $0d,$04,$0f\n\t.byte  $04,$0c,$0f\n\t.byte  $04,$0c,$0f\n\t.byte  $04,$0c,$0a\n\t.byte  $00,$06,$0f\n\t.byte  $0f,$04,$0b\n\t.byte  $10,$04,$08\n\t.byte  $00,$06,$0c\n\t.byte  $04,$0c,$0f\n\t.byte  $04,$0c,$0d\n\t.byte  $0d,$04,$08\n\t.byte  $04,$0c,$0c\n\t.byte  $05,$0c,$0b\n\t.byte  $05,$0c,$07\n\t.byte  $06,$0c,$06\n\t.byte  $12,$04,$0c\n\t.byte  $12,$04,$0f\n\t.byte  $12,$04,$0f\n\t.byte  $10,$04,$0f\n\t.byte  $10,$04,$0f\n\t.byte  $10,$04,$09\n\t.byte  $13,$04,$07\n\t.byte  $13,$04,$07\n\t.byte  $15,$04,$0b\n\t.byte  $06,$0c,$0f\n\t.byte  $13,$04,$0f\n\t.byte  $13,$04,$0f\n\t.byte  $12,$04,$08\n\t.byte  $05,$0c,$0c\n\t.byte  $05,$0c,$07\n\t.byte  $16,$04,$06\n\t.byte  $16,$04,$05\n\t.byte  $07,$0c,$02\n\t.byte  $07,$0c,$05\n\t.byte  $15,$04,$08\n\t.byte  $15,$04,$0f\n\t.byte  $15,$04,$0b\n\t.byte  $13,$04,$07\n\t.byte  $16,$04,$06\n\t.byte  $16,$04,$04\n\t.byte  $18,$04,$06\n\t.byte  $19,$04,$05\n\t.byte  $1b,$04,$02\n\t.byte  $18,$04,$01\n\t.byte  $16,$04,$02\n\t.byte  $16,$04,$06\n\t.byte  $06,$0c,$01\n\t.byte  $16,$04,$05\n\t.byte  $16,$04,$01\n\t.byte  $1c,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_gooditem.s",
    "content": "\t.rodata\n\t.export\t_sfx_gooditem\n_sfx_gooditem:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $07,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $06,$0c,$04\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $06,$0c,$08\n\t.byte  $06,$0c,$09\n\t.byte  $06,$0c,$0c\n\t.byte  $07,$0c,$0d\n\t.byte  $06,$0c,$0e\n\t.byte  $06,$0c,$0c\n\t.byte  $12,$04,$0d\n\t.byte  $12,$04,$0d\n\t.byte  $1b,$04,$04\n\t.byte  $06,$0c,$06\n\t.byte  $12,$04,$0c\n\t.byte  $12,$04,$0b\n\t.byte  $10,$04,$04\n\t.byte  $04,$0c,$04\n\t.byte  $12,$04,$0c\n\t.byte  $12,$04,$0c\n\t.byte  $10,$04,$0a\n\t.byte  $12,$04,$03\n\t.byte  $06,$0c,$09\n\t.byte  $12,$04,$0e\n\t.byte  $10,$04,$0d\n\t.byte  $04,$0c,$07\n\t.byte  $04,$0c,$06\n\t.byte  $0d,$04,$07\n\t.byte  $10,$04,$0a\n\t.byte  $10,$04,$0a\n\t.byte  $10,$04,$05\n\t.byte  $04,$0c,$04\n\t.byte  $10,$04,$06\n\t.byte  $10,$04,$0b\n\t.byte  $10,$04,$05\n\t.byte  $0d,$04,$08\n\t.byte  $03,$0c,$07\n\t.byte  $04,$0c,$09\n\t.byte  $04,$0c,$05\n\t.byte  $0c,$04,$0a\n\t.byte  $0a,$04,$07\n\t.byte  $09,$04,$04\n\t.byte  $0d,$04,$08\n\t.byte  $0d,$04,$05\n\t.byte  $03,$0c,$07\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_gotthecoin.s",
    "content": "\t.rodata\n\t.export\t_sfx_gotthecoin\n_sfx_gotthecoin:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $04,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $04,$0c,$0f\n\t.byte  $0a,$04,$0e\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0d\n\t.byte  $0a,$04,$09\n\t.byte  $0a,$04,$09\n\t.byte  $0a,$04,$08\n\t.byte  $0a,$04,$07\n\t.byte  $0a,$04,$06\n\t.byte  $0a,$04,$05\n\t.byte  $0a,$04,$03\n\t.byte  $0a,$04,$07\n\t.byte  $0a,$04,$09\n\t.byte  $0a,$04,$03\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$00\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_gotthering.s",
    "content": "\t.rodata\n\t.export\t_sfx_gotthering\n_sfx_gotthering:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $09,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $09,$04,$0a\n\t.byte  $09,$04,$08\n\t.byte  $09,$04,$04\n\t.byte  $0a,$04,$0a\n\t.byte  $0a,$04,$08\n\t.byte  $0a,$04,$04\n\t.byte  $0a,$04,$02\n\t.byte  $0a,$04,$01\n\t.byte  $0a,$04,$01\n\t.byte  $06,$04,$0a\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$0b\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$09\n\t.byte  $06,$04,$04\n\t.byte  $06,$04,$0c\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$05\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$03\n\t.byte  $06,$04,$0a\n\t.byte  $06,$04,$08\n\t.byte  $06,$04,$01\n\t.byte  $06,$04,$05\n\t.byte  $06,$04,$0a\n\t.byte  $06,$04,$01\n\t.byte  $06,$04,$0a\n\t.byte  $06,$04,$05\n\t.byte  $06,$04,$04\n\t.byte  $06,$04,$05\n\t.byte  $06,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_hahaha.s",
    "content": "\t.rodata\n\t.export\t_sfx_hahaha\n_sfx_hahaha:\n\t.byte   $10,$10,$00 ; version, priority, frames per chunk\n\t.byte   $0a, $07, $01 ; first chunk of freq,channel,volume\n\t.byte   $07, $01, $01\n\t.byte   $09, $07, $02\n\t.byte   $1f, $0f, $01\n\t.byte   $07, $07, $01\n\t.byte   $12, $0f, $01\n\t.byte   $08, $07, $01\n\t.byte   $0b, $04, $01\n\t.byte   $08, $06, $01\n\t.byte   $12, $04, $01\n\t.byte   $0b, $04, $01\n\t.byte   $16, $06, $01\n\t.byte   $07, $06, $01\n\t.byte   $12, $04, $0c\n\t.byte   $11, $04, $0d\n\t.byte   $10, $04, $0d\n\t.byte   $13, $04, $0d\n\t.byte   $15, $04, $05\n\t.byte   $07, $07, $03\n\t.byte   $13, $04, $01\n\t.byte   $1c, $04, $06\n\t.byte   $17, $04, $0b\n\t.byte   $15, $04, $08\n\t.byte   $17, $01, $08\n\t.byte   $01, $06, $09\n\t.byte   $0a, $07, $05\n\t.byte   $0d, $0c, $04\n\t.byte   $16, $07, $01\n\t.byte   $04, $01, $07\n\t.byte   $1d, $04, $0b\n\t.byte   $00, $06, $09\n\t.byte   $1b, $0f, $0d\n\t.byte   $04, $01, $0d\n\t.byte   $19, $01, $06\n\t.byte   $0a, $0f, $01\n\t.byte   $02, $06, $03\n\t.byte   $0c, $0c, $07\n\t.byte   $0a, $0c, $0c\n\t.byte   $1f, $04, $0f\n\t.byte   $11, $04, $07\n\t.byte   $0b, $0c, $0a\n\t.byte   $09, $01, $0b\n\t.byte   $0a, $0c, $07\n\t.byte   $12, $01, $01\n\t.byte   $0a, $07, $00\n\t.byte   $0c, $0c, $08\n\t.byte   $11, $04, $0d\n\t.byte   $0a, $0c, $0c\n\t.byte   $11, $04, $0a\n\t.byte   $0b, $0c, $09\n\t.byte   $12, $04, $09\n\t.byte   $04, $01, $09\n\t.byte   $1c, $0f, $07\n\t.byte   $13, $04, $08\n\t.byte   $14, $04, $07\n\t.byte   $14, $04, $07\n\t.byte   $0c, $0c, $06\n\t.byte   $14, $04, $06\n\t.byte   $0c, $0c, $05\n\t.byte   $09, $01, $06\n\t.byte   $02, $07, $08\n\t.byte   $09, $07, $04\n\t.byte   $02, $06, $02\n\t.byte   $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_hahaha2.s",
    "content": "\t.rodata\n\t.export\t_sfx_hahaha2\n_sfx_hahaha2:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte  $14,$0f,$00 ; first chunk of freq,channel,volume\n\t.byte  $06,$07,$02\n\t.byte  $0a,$04,$0e\n\t.byte  $0b,$04,$0f\n\t.byte  $00,$06,$0f\n\t.byte  $0b,$04,$07\n\t.byte  $10,$04,$04\n\t.byte  $0d,$04,$02\n\t.byte  $10,$04,$02\n\t.byte  $10,$04,$0f\n\t.byte  $0f,$04,$0f\n\t.byte  $0d,$04,$07\n\t.byte  $00,$06,$02\n\t.byte  $10,$04,$04\n\t.byte  $00,$06,$02\n\t.byte  $00,$06,$0f\n\t.byte  $00,$06,$0f\n\t.byte  $00,$06,$0f\n\t.byte  $10,$04,$09\n\t.byte  $0c,$04,$08\n\t.byte  $00,$06,$07\n\t.byte  $11,$04,$06\n\t.byte  $10,$04,$05\n\t.byte  $00,$06,$04\n\t.byte  $10,$04,$03\n\t.byte  $00,$06,$02\n\t.byte  $0b,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_hophip.s",
    "content": "\t.rodata\n\t.export\t_sfx_hophip\n_sfx_hophip:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $12,$04,$0d\n\t.byte  $12,$04,$0f\n\t.byte  $05,$0c,$0c\n\t.byte  $10,$04,$0a\n\t.byte  $05,$0c,$0f\n\t.byte  $05,$0c,$0f\n\t.byte  $05,$0c,$04\n\t.byte  $05,$0c,$07\n\t.byte  $05,$0c,$0f\n\t.byte  $05,$0c,$0f\n\t.byte  $05,$0c,$03\n\t.byte  $10,$04,$0c\n\t.byte  $10,$04,$01\n\t.byte  $10,$04,$09\n\t.byte  $10,$04,$0b\n\t.byte  $10,$04,$05\n\t.byte  $10,$04,$02\n\t.byte  $10,$04,$07\n\t.byte  $10,$04,$07\n\t.byte  $10,$04,$03\n\t.byte  $10,$04,$02\n\t.byte  $10,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_hophipquick.s",
    "content": "\t.rodata\n\t.export\t_sfx_hophipquick\n_sfx_hophipquick:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $12,$04,$0f\n\t.byte  $05,$0c,$0c\n\t.byte  $05,$0c,$0f\n\t.byte  $05,$0c,$0f\n\t.byte  $05,$0c,$07\n\t.byte  $05,$0c,$0f\n\t.byte  $05,$0c,$03\n\t.byte  $10,$04,$0c\n\t.byte  $10,$04,$09\n\t.byte  $10,$04,$0b\n\t.byte  $10,$04,$02\n\t.byte  $10,$04,$07\n\t.byte  $10,$04,$03\n\t.byte  $10,$04,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_hophop.s",
    "content": "\t.rodata\n\t.export\t_sfx_hophop\n_sfx_hophop:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $04,$0c,$02 ; first chunk of freq,channel,volume\n\t.byte  $0f,$06,$03\n\t.byte  $10,$04,$06\n\t.byte  $04,$0c,$09\n\t.byte  $00,$06,$09\n\t.byte  $1e,$06,$0b\n\t.byte  $1e,$06,$09\n\t.byte  $0c,$0c,$09\n\t.byte  $15,$04,$0b\n\t.byte  $03,$0c,$07\n\t.byte  $04,$0c,$0a\n\t.byte  $15,$04,$0c\n\t.byte  $0c,$04,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0c\n\t.byte  $1e,$06,$09\n\t.byte  $13,$04,$0c\n\t.byte  $10,$04,$0f\n\t.byte  $10,$04,$0f\n\t.byte  $10,$04,$0f\n\t.byte  $0c,$0c,$0a\n\t.byte  $0c,$0c,$08\n\t.byte  $0e,$0c,$02\n\t.byte  $1e,$06,$04\n\t.byte  $1e,$06,$02\n\t.byte  $1e,$06,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_humanoid.s",
    "content": "\t.rodata\n\t.export\t_sfx_humanoid\n_sfx_humanoid:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $01,$02,$05\n\t.byte  $0f,$06,$03\n\t.byte  $15,$04,$06\n\t.byte  $19,$04,$06\n\t.byte  $0a,$01,$05\n\t.byte  $14,$04,$08\n\t.byte  $17,$04,$08\n\t.byte  $04,$0f,$07\n\t.byte  $13,$04,$07\n\t.byte  $16,$04,$0a\n\t.byte  $1b,$04,$09\n\t.byte  $15,$01,$07\n\t.byte  $15,$04,$09\n\t.byte  $18,$04,$09\n\t.byte  $15,$04,$07\n\t.byte  $14,$04,$08\n\t.byte  $17,$04,$08\n\t.byte  $1b,$04,$07\n\t.byte  $13,$04,$09\n\t.byte  $16,$04,$0b\n\t.byte  $1a,$04,$09\n\t.byte  $03,$0f,$06\n\t.byte  $15,$04,$06\n\t.byte  $18,$04,$06\n\t.byte  $04,$0f,$05\n\t.byte  $09,$04,$04\n\t.byte  $0b,$04,$06\n\t.byte  $0d,$04,$06\n\t.byte  $09,$04,$05\n\t.byte  $0b,$04,$05\n\t.byte  $0d,$04,$05\n\t.byte  $0a,$04,$06\n\t.byte  $15,$04,$06\n\t.byte  $18,$04,$06\n\t.byte  $1c,$04,$06\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_jump1.s",
    "content": "\t.rodata\n\t.export\t_sfx_jump1\n_sfx_jump1:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $03,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $12,$0c,$0f\n\t.byte  $12,$0c,$0f\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$05\n\t.byte  $0d,$0c,$09\n\t.byte  $0e,$0c,$05\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0c\n\t.byte  $0b,$0c,$0c\n\t.byte  $0b,$0c,$03\n\t.byte  $1e,$04,$05\n\t.byte  $1c,$04,$04\n\t.byte  $1c,$04,$03\n\t.byte  $1c,$04,$02\n\t.byte  $19,$04,$02\n\t.byte  $18,$04,$02\n\t.byte  $07,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_jump2.s",
    "content": "\t.rodata\n\t.export\t_sfx_jump2\n_sfx_jump2:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $10,$0c,$0c ; first chunk of freq,channel,volume\n\t.byte  $10,$0c,$0f\n\t.byte  $0f,$0c,$0f\n\t.byte  $0f,$0c,$0f\n\t.byte  $00,$06,$07\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0d\n\t.byte  $0e,$0c,$07\n\t.byte  $0f,$0c,$0f\n\t.byte  $0f,$0c,$08\n\t.byte  $11,$0c,$08\n\t.byte  $12,$0c,$06\n\t.byte  $03,$06,$08\n\t.byte  $15,$0c,$07\n\t.byte  $15,$0c,$04\n\t.byte  $17,$0c,$06\n\t.byte  $04,$06,$06\n\t.byte  $04,$06,$01\n\t.byte  $17,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_jump3.s",
    "content": "\t.rodata\n\t.export\t_sfx_jump3\n_sfx_jump3:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte  $17,$0c,$07 ; first chunk of freq,channel,volume\n\t.byte  $1b,$0c,$0f\n\t.byte  $1b,$0c,$09\n\t.byte  $17,$0c,$0d\n\t.byte  $17,$0c,$0f\n\t.byte  $0d,$0c,$0b\n\t.byte  $0c,$0c,$0d\n\t.byte  $0a,$0c,$0a\n\t.byte  $1c,$04,$09\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$07\n\t.byte  $18,$04,$04\n\t.byte  $1b,$04,$0c\n\t.byte  $0a,$0c,$04\n\t.byte  $0b,$0c,$03\n\t.byte  $0c,$0c,$03\n\t.byte  $0d,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_jumpman.s",
    "content": "\t.rodata\n\t.export\t_sfx_jumpman\n_sfx_jumpman:\n\t.byte   $10,$05,$04 ; version, priority, frames per chunk\n\t.byte   $1E,$04,$08 ; first chunk of freq,channel,volume data \n\t.byte   $1B,$04,$08\n\t.byte   $18,$04,$08\n\t.byte   $11,$04,$08\n\t.byte   $16,$04,$08\n\t.byte   $00,$00,$00 \n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_jumpo.s",
    "content": "\t.rodata\n\t.export\t_sfx_jumpo\n_sfx_jumpo:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$0c,$03 ; first chunk of freq,channel,volume\n\t.byte  $1e,$0c,$01\n\t.byte  $1e,$0c,$06\n\t.byte  $1e,$0c,$06\n\t.byte  $1e,$0c,$04\n\t.byte  $1e,$06,$03\n\t.byte  $1e,$0c,$05\n\t.byte  $1e,$0c,$0a\n\t.byte  $1e,$0c,$06\n\t.byte  $1e,$06,$06\n\t.byte  $1e,$0c,$06\n\t.byte  $1b,$0c,$04\n\t.byte  $1b,$0c,$02\n\t.byte  $1b,$0c,$08\n\t.byte  $1b,$0c,$0b\n\t.byte  $1b,$0c,$0c\n\t.byte  $1b,$0c,$0a\n\t.byte  $1b,$0c,$04\n\t.byte  $1b,$0c,$05\n\t.byte  $1e,$0c,$07\n\t.byte  $1e,$0c,$07\n\t.byte  $10,$0c,$02\n\t.byte  $1e,$0c,$04\n\t.byte  $1e,$0c,$03\n\t.byte  $10,$0c,$01\n\t.byte  $1e,$0c,$06\n\t.byte  $1e,$0c,$06\n\t.byte  $07,$06,$04\n\t.byte  $07,$06,$05\n\t.byte  $07,$06,$0b\n\t.byte  $07,$06,$0e\n\t.byte  $07,$06,$0e\n\t.byte  $07,$06,$0a\n\t.byte  $17,$0c,$05\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_laserrecoil.s",
    "content": "\t.rodata\n\t.export\t_sfx_laserrecoil\n_sfx_laserrecoil:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $06,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $16,$04,$0f\n\t.byte  $16,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $1e,$06,$0c\n\t.byte  $16,$04,$09\n\t.byte  $1e,$04,$09\n\t.byte  $1e,$04,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0d,$0c,$04\n\t.byte  $07,$0c,$05\n\t.byte  $1b,$04,$03\n\t.byte  $0b,$0c,$02\n\t.byte  $10,$0c,$03\n\t.byte  $03,$06,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_longgongsilver.s",
    "content": "\t.rodata\n\t.export\t_sfx_longgongsilver\n_sfx_longgongsilver:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1b,$0c,$0b ; first chunk of freq,channel,volume\n\t.byte  $06,$0c,$07\n\t.byte  $1b,$0c,$0f\n\t.byte  $0a,$06,$0d\n\t.byte  $1b,$0c,$0b\n\t.byte  $0a,$06,$0f\n\t.byte  $0a,$06,$0c\n\t.byte  $12,$0c,$0a\n\t.byte  $1b,$0c,$0f\n\t.byte  $12,$0c,$0b\n\t.byte  $1b,$0c,$0f\n\t.byte  $1b,$0c,$0f\n\t.byte  $12,$0c,$0c\n\t.byte  $1b,$0c,$0f\n\t.byte  $0a,$06,$0d\n\t.byte  $12,$0c,$07\n\t.byte  $0a,$06,$0f\n\t.byte  $1b,$0c,$0f\n\t.byte  $0a,$06,$07\n\t.byte  $1b,$0c,$0f\n\t.byte  $0a,$06,$06\n\t.byte  $1b,$0c,$0f\n\t.byte  $0a,$06,$0f\n\t.byte  $06,$0c,$07\n\t.byte  $0a,$06,$0e\n\t.byte  $1b,$0c,$0f\n\t.byte  $12,$0c,$08\n\t.byte  $1b,$0c,$0f\n\t.byte  $1b,$0c,$0c\n\t.byte  $1b,$0c,$0f\n\t.byte  $1b,$0c,$0e\n\t.byte  $12,$0c,$08\n\t.byte  $0a,$06,$0c\n\t.byte  $1b,$0c,$0d\n\t.byte  $12,$0c,$08\n\t.byte  $1b,$0c,$0f\n\t.byte  $1b,$0c,$0f\n\t.byte  $1b,$0c,$0a\n\t.byte  $1b,$0c,$0f\n\t.byte  $0a,$06,$0a\n\t.byte  $0a,$06,$08\n\t.byte  $0a,$06,$0f\n\t.byte  $1b,$0c,$09\n\t.byte  $0a,$06,$0c\n\t.byte  $1b,$0c,$0f\n\t.byte  $06,$0c,$05\n\t.byte  $1b,$0c,$0f\n\t.byte  $0a,$06,$0b\n\t.byte  $12,$0c,$06\n\t.byte  $0a,$06,$0c\n\t.byte  $1b,$0c,$08\n\t.byte  $12,$0c,$0a\n\t.byte  $1b,$0c,$0d\n\t.byte  $1b,$0c,$06\n\t.byte  $1b,$0c,$0c\n\t.byte  $1b,$0c,$0b\n\t.byte  $1b,$0c,$04\n\t.byte  $0a,$06,$06\n\t.byte  $0a,$06,$07\n\t.byte  $0a,$06,$04\n\t.byte  $1b,$0c,$09\n\t.byte  $1b,$0c,$07\n\t.byte  $1b,$0c,$06\n\t.byte  $1b,$0c,$07\n\t.byte  $12,$0c,$07\n\t.byte  $1b,$0c,$06\n\t.byte  $12,$0c,$07\n\t.byte  $12,$0c,$05\n\t.byte  $0a,$06,$05\n\t.byte  $1b,$0c,$06\n\t.byte  $0a,$0c,$02\n\t.byte  $1b,$0c,$08\n\t.byte  $0a,$06,$03\n\t.byte  $1b,$0c,$04\n\t.byte  $0a,$06,$06\n\t.byte  $12,$0c,$02\n\t.byte  $1b,$0c,$02\n\t.byte  $1b,$0c,$05\n\t.byte  $12,$0c,$02\n\t.byte  $1b,$0c,$05\n\t.byte  $0a,$06,$04\n\t.byte  $1b,$0c,$02\n\t.byte  $1b,$0c,$04\n\t.byte  $1b,$0c,$01\n\t.byte  $12,$0c,$03\n\t.byte  $0a,$06,$04\n\t.byte  $1b,$0c,$02\n\t.byte  $1b,$0c,$01\n\t.byte  $1b,$0c,$04\n\t.byte  $0a,$06,$02\n\t.byte  $1b,$0c,$02\n\t.byte  $0a,$06,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_maser.s",
    "content": "\t.rodata\n\t.export\t_sfx_maser\n_sfx_maser:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte    $14, $04, $0a\n\t.byte   $16, $04, $0f\n\t.byte   $19, $04, $0d\n\t.byte   $0b, $07, $0f\n\t.byte   $0c, $07, $0f\n\t.byte   $00, $07, $0d\n\t.byte   $0f, $04, $0e\n\t.byte   $06, $01, $0a\n\t.byte   $17, $04, $0b\n\t.byte   $0a, $07, $0a\n\t.byte   $16, $01, $0a\n\t.byte   $19, $07, $03\n\t.byte   $10, $0c, $02\n\t.byte   $17, $0c, $00\n\t.byte   $15, $0f, $02\n\t.byte   $1f, $07, $02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_nonobounce.s",
    "content": "\t.rodata\n\t.export\t_sfx_nonobounce\n_sfx_nonobounce:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte  $0f,$0c,$04\n\t.byte  $00,$0e,$08\n\t.byte  $10,$0c,$08\n\t.byte  $02,$06,$06\n\t.byte  $10,$0c,$06\n\t.byte  $02,$06,$06\n\t.byte  $00,$0e,$08\n\t.byte  $10,$0c,$08\n\t.byte  $02,$06,$08\n\t.byte  $0f,$0c,$06\n\t.byte  $10,$0c,$06\n\t.byte  $02,$06,$06\n\t.byte  $10,$0c,$06\n\t.byte  $0f,$0c,$04\n\t.byte  $10,$0c,$04\n\t.byte  $0f,$0c,$04\n\t.byte  $00,$0e,$04\n\t.byte  $10,$0c,$04\n\t.byte  $10,$0c,$02\n\t.byte  0,0,0\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_oneup.s",
    "content": "\t.rodata\n\t.export\t_sfx_oneup\n_sfx_oneup:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $16,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $16,$04,$0f\n\t.byte  $16,$04,$08\n\t.byte  $13,$04,$04\n\t.byte  $13,$04,$02\n\t.byte  $12,$06,$01\n\t.byte  $12,$06,$01\n\t.byte  $12,$04,$0f\n\t.byte  $12,$04,$0f\n\t.byte  $12,$04,$08\n\t.byte  $11,$04,$04\n\t.byte  $10,$04,$02\n\t.byte  $10,$04,$01\n\t.byte  $10,$04,$01\n\t.byte  $0a,$04,$08\n\t.byte  $0a,$04,$08\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $0d,$04,$08\n\t.byte  $0d,$04,$08\n\t.byte  $0d,$04,$08\n\t.byte  $0d,$04,$06\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $0c,$04,$08\n\t.byte  $0c,$04,$04\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $09,$04,$06\n\t.byte  $01,$04,$02\n\t.byte  $09,$04,$04\n\t.byte  $09,$04,$02\n\t.byte  $09,$04,$04\n\t.byte  $09,$04,$04\n\t.byte  $01,$04,$02\n\t.byte  $09,$04,$04\n\t.byte  $01,$04,$00\n\t.byte  $09,$04,$04\n\t.byte  $01,$04,$02\n\t.byte  $09,$04,$04\n\t.byte  $09,$04,$02\n\t.byte  $09,$04,$02\n\t.byte  $09,$04,$04\n\t.byte  $01,$04,$02\n\t.byte  $01,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_ouch.s",
    "content": "\t.rodata\n\t.export\t_sfx_ouch\n_sfx_ouch:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $07,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $18,$04,$07\n\t.byte  $19,$04,$04\n\t.byte  $07,$0c,$09\n\t.byte  $19,$04,$0f\n\t.byte  $19,$04,$0d\n\t.byte  $19,$04,$0f\n\t.byte  $19,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$09\n\t.byte  $1b,$04,$05\n\t.byte  $1b,$04,$03\n\t.byte  $1b,$04,$02\n\t.byte  $1c,$04,$01\n\t.byte  $1c,$04,$01\n\t.byte  $1c,$04,$01\n\t.byte  $1b,$04,$02\n\t.byte  $19,$04,$00\n\t.byte  $1b,$04,$00\n\t.byte  $19,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_pewpew.s",
    "content": "\t.rodata\n\t.export\t_sfx_pewpew\n_sfx_pewpew:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1c,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $1c,$04,$0f\n\t.byte  $09,$04,$0b\n\t.byte  $03,$0c,$0a\n\t.byte  $04,$0c,$0e\n\t.byte  $12,$04,$0c\n\t.byte  $19,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $07,$04,$05\n\t.byte  $09,$04,$05\n\t.byte  $0d,$04,$06\n\t.byte  $0c,$04,$05\n\t.byte  $18,$04,$06\n\t.byte  $1c,$04,$05\n\t.byte  $1e,$04,$03\n\t.byte  $07,$04,$03\n\t.byte  $09,$04,$03\n\t.byte  $0c,$04,$02\n\t.byte  $04,$0c,$02\n\t.byte  $06,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_pickupprize.s",
    "content": "\t.rodata\n\t.export\t_sfx_pickupprize\n_sfx_pickupprize:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0a,$0c,$0c ; first chunk of freq,channel,volume\n\t.byte  $1e,$06,$0f\n\t.byte  $0b,$0c,$0e\n\t.byte  $1e,$06,$0d\n\t.byte  $0c,$0c,$0f\n\t.byte  $1e,$06,$0e\n\t.byte  $1e,$06,$0c\n\t.byte  $0b,$0c,$05\n\t.byte  $16,$04,$05\n\t.byte  $13,$04,$0a\n\t.byte  $09,$04,$03\n\t.byte  $13,$04,$0a\n\t.byte  $13,$04,$06\n\t.byte  $13,$04,$03\n\t.byte  $09,$04,$02\n\t.byte  $12,$04,$0a\n\t.byte  $12,$04,$06\n\t.byte  $12,$04,$07\n\t.byte  $12,$04,$02\n\t.byte  $09,$04,$01\n\t.byte  $13,$04,$03\n\t.byte  $12,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_pitfalljump.s",
    "content": "\t.rodata\n\t.export\t_sfx_pitfalljump\n_sfx_pitfalljump:\n\t.byte   $10,$05,$03 ; version, priority, frames per chunk\n\t.byte   $06,$01,$04 ; first chunk of freq,channel,volume data \n\t.byte   $04,$01,$04 ; first chunk of freq,channel,volume data \n\t.byte   $03,$01,$04 ; first chunk of freq,channel,volume data \n\t.byte   $02,$01,$04 ; first chunk of freq,channel,volume data \n\t.byte   $04,$01,$04 ; first chunk of freq,channel,volume data \n\t.byte   $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_plainlaser.s",
    "content": "\t.rodata\n\t.export\t_sfx_plainlaser\n_sfx_plainlaser:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $10,$04,$06 ; first chunk of freq,channel,volume\n\t.byte  $13,$04,$08\n\t.byte  $16,$04,$08\n\t.byte  $16,$04,$07\n\t.byte  $1c,$04,$09\n\t.byte  $0b,$0c,$0f\n\t.byte  $0d,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $12,$0c,$0f\n\t.byte  $03,$06,$0d\n\t.byte  $1e,$0c,$0a\n\t.byte  $1e,$0c,$0c\n\t.byte  $0a,$06,$04\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_plonk.s",
    "content": "\t.rodata\n\t.export\t_sfx_plonk\n_sfx_plonk:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $13, $01, $0d ; first chunk of freq,channel,volume\n\t.byte   $12, $01, $0f\n\t.byte   $0d, $04, $0d\n\t.byte   $12, $01, $0b\n\t.byte   $12, $01, $05\n\t.byte   $06, $07, $03\n\t.byte   $0a, $0f, $02\n\t.byte   $09, $07, $01\n\t.byte   $10, $0f, $00\n\t.byte   $1b, $0c, $00\n\t.byte   $0b, $0e, $00\n\t.byte   $09, $06, $00\n\t.byte   $12, $01, $01\n\t.byte   $0a, $07, $01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_poof1.s",
    "content": "\t.rodata\n\t.export\t_sfx_poof1\n_sfx_poof1:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $07,$08,$04 ; first chunk of freq,channel,volume\n\t.byte  $07,$08,$06\n\t.byte  $07,$08,$08\n\t.byte  $09,$08,$08\n\t.byte  $0c,$08,$0a\n\t.byte  $09,$08,$0a\n\t.byte  $0c,$08,$0a\n\t.byte  $09,$08,$0a\n\t.byte  $0d,$08,$08\n\t.byte  $0e,$08,$06\n\t.byte  $09,$08,$04\n\t.byte  $09,$08,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_poof2.s",
    "content": "\t.rodata\n\t.export\t_sfx_poof2\n_sfx_poof2:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0a,$08,$04 ; first chunk of freq,channel,volume\n\t.byte  $12,$08,$06\n\t.byte  $09,$08,$08\n\t.byte  $11,$08,$08\n\t.byte  $08,$08,$0a\n\t.byte  $10,$08,$0a\n\t.byte  $07,$08,$0a\n\t.byte  $0F,$08,$0a\n\t.byte  $06,$08,$08\n\t.byte  $0E,$08,$06\n\t.byte  $05,$08,$04\n\t.byte  $0D,$08,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_powerup.s",
    "content": "\t.rodata\n\t.export\t_sfx_powerup\n_sfx_powerup:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$06,$0f ; first chunk of freq,channel,volume\n\t.byte  $1c,$04,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1b,$04,$0a\n\t.byte  $16,$04,$09\n\t.byte  $12,$04,$07\n\t.byte  $12,$04,$0e\n\t.byte  $12,$04,$08\n\t.byte  $0d,$04,$03\n\t.byte  $12,$04,$08\n\t.byte  $12,$04,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $0b,$0c,$0c\n\t.byte  $1c,$04,$06\n\t.byte  $1c,$04,$0c\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$09\n\t.byte  $05,$0c,$0a\n\t.byte  $18,$04,$07\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0a\n\t.byte  $05,$0c,$0c\n\t.byte  $05,$0c,$05\n\t.byte  $1e,$06,$03\n\t.byte  $03,$0c,$04\n\t.byte  $03,$0c,$04\n\t.byte  $03,$0c,$04\n\t.byte  $02,$0c,$08\n\t.byte  $03,$0c,$04\n\t.byte  $1e,$06,$02\n\t.byte  $0a,$0c,$0e\n\t.byte  $0a,$0c,$0f\n\t.byte  $1e,$04,$0d\n\t.byte  $19,$04,$08\n\t.byte  $15,$04,$0b\n\t.byte  $15,$04,$0f\n\t.byte  $15,$04,$08\n\t.byte  $0f,$04,$07\n\t.byte  $15,$04,$07\n\t.byte  $15,$04,$0c\n\t.byte  $06,$0c,$07\n\t.byte  $0f,$04,$02\n\t.byte  $00,$06,$04\n\t.byte  $01,$0c,$00\n\t.byte  $0a,$04,$04\n\t.byte  $0a,$04,$08\n\t.byte  $0a,$04,$03\n\t.byte  $07,$04,$03\n\t.byte  $0a,$04,$03\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_pulsecannon.s",
    "content": "\t.rodata\n\t.export\t_sfx_pulsecannon\n_sfx_pulsecannon:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$0c,$0a ; first chunk of freq,channel,volume\n\t.byte  $07,$06,$0f\n\t.byte  $07,$06,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $17,$0c,$0b\n\t.byte  $1b,$0c,$0b\n\t.byte  $1e,$0c,$0f\n\t.byte  $07,$06,$0f\n\t.byte  $07,$06,$0f\n\t.byte  $1e,$06,$08\n\t.byte  $17,$0c,$06\n\t.byte  $1b,$0c,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $07,$06,$0f\n\t.byte  $07,$06,$0f\n\t.byte  $0a,$06,$0a\n\t.byte  $17,$0c,$0a\n\t.byte  $1e,$0c,$04\n\t.byte  $1e,$06,$09\n\t.byte  $1b,$04,$05\n\t.byte  $07,$06,$0f\n\t.byte  $0a,$06,$09\n\t.byte  $17,$0c,$0d\n\t.byte  $1b,$0c,$09\n\t.byte  $0a,$06,$05\n\t.byte  $17,$0c,$03\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_quack.s",
    "content": "\t.rodata\n\t.export\t_sfx_quack\n_sfx_quack:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte   $15, $06, $08 ; first chunk of freq,channel,volume\n\t.byte   $15, $06, $09\n\t.byte   $15, $06, $0A\n\t.byte   $14, $06, $0B\n\t.byte   $14, $06, $0C\n\t.byte   $14, $06, $0D\n\t.byte   $14, $06, $0E\n\t.byte   $13, $06, $0F\n\t.byte   $13, $06, $0F\n\t.byte   $13, $06, $0F\n\t.byte   $13, $06, $0F\n\t.byte   $13, $06, $0F\n\t.byte   $00, $00, $00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_ribbit.s",
    "content": "\t.rodata\n\t.export\t_sfx_ribbit\n_sfx_ribbit:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0c,$06,$04 ; first chunk of freq,channel,volume\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0f\n\t.byte  $0c,$06,$09\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0f\n\t.byte  $08,$06,$06\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0f\n\t.byte  $08,$06,$07\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0d\n\t.byte  $19,$06,$0f\n\t.byte  $19,$06,$0c\n\t.byte  $19,$06,$0d\n\t.byte  $19,$06,$05\n\t.byte  $19,$06,$09\n\t.byte  $19,$06,$03\n\t.byte  $19,$06,$04\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_roarcheep.s",
    "content": "\t.rodata\n\t.export\t_sfx_roarcheep\n_sfx_roarcheep:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0a,$06,$00 ; first chunk of freq,channel,volume\n\t.byte  $0e,$0f,$01\n\t.byte  $12,$0e,$09\n\t.byte  $0a,$0e,$07\n\t.byte  $0a,$0f,$0e\n\t.byte  $1b,$07,$0f\n\t.byte  $1b,$06,$0c\n\t.byte  $13,$0f,$0e\n\t.byte  $15,$0f,$0d\n\t.byte  $0f,$0e,$0f\n\t.byte  $19,$0f,$0f\n\t.byte  $0d,$0f,$07\n\t.byte  $0e,$0e,$08\n\t.byte  $0f,$0f,$08\n\t.byte  $0a,$01,$09\n\t.byte  $0d,$0e,$0b\n\t.byte  $19,$07,$0c\n\t.byte  $10,$0f,$0f\n\t.byte  $16,$07,$0f\n\t.byte  $10,$04,$0f\n\t.byte  $17,$04,$0f\n\t.byte  $15,$04,$0e\n\t.byte  $1b,$07,$0f\n\t.byte  $1f,$06,$0c\n\t.byte  $12,$0f,$0b\n\t.byte  $1a,$06,$04\n\t.byte  $1f,$01,$04\n\t.byte  $0a,$0e,$09\n\t.byte  $0f,$0e,$0b\n\t.byte  $0f,$0e,$07\n\t.byte  $0f,$0e,$06\n\t.byte  $0f,$0e,$05\n\t.byte  $0f,$0e,$03\n\t.byte  $0f,$0e,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_roarroar.s",
    "content": "\t.rodata\n\t.export\t_sfx_roarroar\n_sfx_roarroar:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1d,$0f,$00 ; first chunk of freq,channel,volume\n\t.byte  $07,$06,$03\n\t.byte  $13,$0f,$06\n\t.byte  $05,$06,$09\n\t.byte  $1e,$0c,$0c\n\t.byte  $06,$06,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $05,$06,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $1f,$0c,$0f\n\t.byte  $1f,$0c,$0f\n\t.byte  $1f,$0c,$0f\n\t.byte  $0f,$0f,$0f\n\t.byte  $05,$06,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $1a,$07,$0f\n\t.byte  $05,$06,$0f\n\t.byte  $17,$0c,$0f\n\t.byte  $0a,$0f,$0f\n\t.byte  $18,$0c,$0f\n\t.byte  $18,$0c,$0f\n\t.byte  $05,$06,$0f\n\t.byte  $08,$06,$0f\n\t.byte  $04,$06,$0f\n\t.byte  $05,$06,$0c\n\t.byte  $1d,$0c,$06\n\t.byte  $05,$06,$03\n\t.byte  $17,$0c,$03\n\t.byte  $17,$0c,$03\n\t.byte  $17,$0c,$03\n\t.byte  $1c,$0c,$02\n\t.byte  $1c,$0c,$02\n\t.byte  $17,$0c,$02\n\t.byte  $06,$06,$01\n\t.byte  $0c,$0f,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_rubberhammer.s",
    "content": "\t.rodata\n\t.export\t_sfx_rubberhammer\n_sfx_rubberhammer:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $00,$06,$08 ; first chunk of freq,channel,volume\n\t.byte  $1c,$04,$0f\n\t.byte  $1e,$06,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $1e,$06,$0b\n\t.byte  $0a,$0c,$08\n\t.byte  $0a,$0c,$05\n\t.byte  $1e,$04,$06\n\t.byte  $1c,$04,$05\n\t.byte  $1c,$04,$03\n\t.byte  $0e,$0c,$01\n\t.byte  $1b,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_rubbermallet.s",
    "content": "\t.rodata\n\t.export\t_sfx_rubbermallet\n_sfx_rubbermallet:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte   $1c, $07, $0f\n\t.byte   $1b, $07, $0f\n\t.byte   $1c, $07, $0f\n\t.byte   $1a, $0c, $0f\n\t.byte   $12, $0c, $0f\n\t.byte   $1e, $07, $0e\n\t.byte   $17, $0c, $0e\n\t.byte   $1d, $07, $08\n\t.byte   $12, $0c, $08\n\t.byte   $18, $07, $09\n\t.byte   $17, $0c, $08\n\t.byte   $12, $0c, $07\n\t.byte   $1b, $0c, $04\n\t.byte   $14, $0c, $01\n\t.byte   $13, $01, $01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_salvolasershot.s",
    "content": "\t.rodata\n\t.export\t_sfx_salvolasershot\n_sfx_salvolasershot:\n\t.byte   $10,$18,$01 ; version, priority, frames per chunk\n\t.byte   $04,$08,$08 ; first chunk of freq,channel,volume data \n\t.byte   $05,$08,$07\n\t.byte   $04,$08,$07\n\t.byte   $05,$08,$07\n\t.byte   $06,$08,$07\n\t.byte   $07,$08,$06\n\t.byte   $06,$08,$06\n\t.byte   $07,$08,$06\n\t.byte   $08,$08,$06\n\t.byte   $09,$08,$06\n\t.byte   $08,$08,$06\n\t.byte   $09,$08,$06\n\t.byte   $0a,$08,$04\n\t.byte   $09,$08,$04\n\t.byte   $0a,$08,$04\n\t.byte   $0b,$08,$04\n\t.byte   $0a,$08,$04\n\t.byte   $0b,$08,$04\n\t.byte   $0c,$08,$04\n\t.byte   $0b,$08,$02\n\t.byte   $0c,$08,$02\n\t.byte   $0d,$08,$02\n\t.byte   $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_simplebuzz.s",
    "content": "\t.rodata\n\t.export\t_sfx_simplebuzz\n_sfx_simplebuzz:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$06,$00 ; first chunk of freq,channel,volume\n\t.byte  $0a,$06,$01\n\t.byte  $1e,$06,$02\n\t.byte  $1e,$06,$04\n\t.byte  $1e,$06,$05\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0d\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $07,$06,$08\n\t.byte  $07,$06,$06\n\t.byte  $0f,$06,$06\n\t.byte  $0f,$06,$04\n\t.byte  $0f,$06,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_snore.s",
    "content": "\t.rodata\n\t.export\t_sfx_snore\n_sfx_snore:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0c,$0c,$01 ; first chunk of freq,channel,volume\n\t.byte  $17,$0c,$03\n\t.byte  $03,$06,$06\n\t.byte  $0a,$06,$04\n\t.byte  $0a,$06,$04\n\t.byte  $07,$06,$03\n\t.byte  $1e,$06,$0c\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0a,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0d,$04,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0f,$06,$0f\n\t.byte  $0a,$06,$0e\n\t.byte  $00,$06,$0c\n\t.byte  $0d,$04,$0d\n\t.byte  $0a,$06,$04\n\t.byte  $0f,$06,$03\n\t.byte  $0a,$06,$04\n\t.byte  $1e,$06,$01\n\t.byte  $0a,$06,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_spaceinvshoot.s",
    "content": "\t.rodata\n\t.export\t_sfx_spaceinvshoot\n_sfx_spaceinvshoot:\n\t.byte   $10,$10,$03 ; version, priority, frames per chunk\n\t.byte   $18,$08,$08 ; first chunk of freq,channel,volume data \n\t.byte   $19,$08,$05\n\t.byte   $19,$08,$05\n\t.byte   $19,$08,$05\n\t.byte   $19,$08,$05\n\t.byte   $1C,$08,$02\n\t.byte   $1C,$08,$02\n\t.byte   $1C,$08,$02\n\t.byte   $1C,$08,$02\n\t.byte   $1C,$08,$02\n\t.byte   $1E,$08,$01\n\t.byte   $1E,$08,$01\n\t.byte   $1E,$08,$01\n\t.byte   $1E,$08,$01\n\t.byte   $1E,$08,$01\n\t.byte   $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_spawn.s",
    "content": "\t.rodata\n\t.export\t_sfx_spawn\n_sfx_spawn:\n\t.byte  $10,$10,$01 ; version, priority, frames per chunk\n\t.byte   $16, $04, $0e\n\t.byte   $15, $04, $0e\n\t.byte   $15, $04, $0e\n\t.byte   $12, $04, $0e\n\t.byte   $0e, $04, $0e\n\t.byte   $0c, $04, $0e\n\t.byte   $0e, $04, $0e\n\t.byte   $12, $04, $0e\n\t.byte   $15, $04, $0a\n\t.byte   $15, $04, $08\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_spring.s",
    "content": "\t.rodata\n\t.export\t_sfx_spring\n_sfx_spring:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0d,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $0d,$0c,$0d\n\t.byte  $10,$0c,$0b\n\t.byte  $10,$0c,$0f\n\t.byte  $1e,$0c,$06\n\t.byte  $0e,$0c,$05\n\t.byte  $0e,$0c,$0c\n\t.byte  $12,$0c,$0f\n\t.byte  $12,$0c,$0d\n\t.byte  $10,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0d,$0c,$0f\n\t.byte  $12,$0c,$0a\n\t.byte  $07,$06,$0b\n\t.byte  $1e,$0c,$07\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0e\n\t.byte  $0e,$0c,$0d\n\t.byte  $17,$0c,$07\n\t.byte  $07,$06,$08\n\t.byte  $1e,$0c,$07\n\t.byte  $10,$0c,$08\n\t.byte  $0e,$0c,$0a\n\t.byte  $0d,$0c,$0d\n\t.byte  $0d,$0c,$06\n\t.byte  $1e,$0c,$05\n\t.byte  $1c,$04,$03\n\t.byte  $0d,$0c,$08\n\t.byte  $0c,$0c,$0b\n\t.byte  $0c,$0c,$06\n\t.byte  $0e,$0c,$08\n\t.byte  $1b,$0c,$04\n\t.byte  $0c,$0c,$0a\n\t.byte  $0c,$0c,$03\n\t.byte  $0a,$0c,$07\n\t.byte  $0d,$0c,$04\n\t.byte  $0d,$0c,$07\n\t.byte  $0b,$0c,$05\n\t.byte  $0a,$0c,$05\n\t.byte  $1e,$04,$03\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_squeek.s",
    "content": "\t.rodata\n\t.export\t_sfx_squeek\n_sfx_squeek:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $06,$0c,$0f ; first chunk of freq,channel,volume\n\t.byte  $15,$04,$0f\n\t.byte  $06,$0c,$0f\n\t.byte  $06,$0c,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $0d,$04,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $06,$0c,$0d\n\t.byte  $03,$0c,$07\n\t.byte  $0d,$04,$06\n\t.byte  $06,$0c,$04\n\t.byte  $15,$04,$08\n\t.byte  $06,$0c,$03\n\t.byte  $06,$0c,$05\n\t.byte  $15,$04,$04\n\t.byte  $15,$04,$04\n\t.byte  $06,$0c,$04\n\t.byte  $06,$0c,$03\n\t.byte  $03,$0c,$01\n\t.byte  $15,$04,$02\n\t.byte  $06,$0c,$03\n\t.byte  $06,$0c,$03\n\t.byte  $0c,$04,$00\n\t.byte  $15,$04,$02\n\t.byte  $15,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_strum.s",
    "content": "\t.rodata\n\t.export\t_sfx_strum\n_sfx_strum:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0c,$0c,$09 ; first chunk of freq,channel,volume\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $0c,$0c,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1e,$04,$0e\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$0b\n\t.byte  $1e,$04,$0b\n\t.byte  $07,$0c,$0c\n\t.byte  $0c,$0c,$09\n\t.byte  $07,$0c,$07\n\t.byte  $07,$0c,$06\n\t.byte  $07,$0c,$05\n\t.byte  $07,$0c,$04\n\t.byte  $07,$0c,$04\n\t.byte  $07,$0c,$03\n\t.byte  $07,$0c,$03\n\t.byte  $07,$0c,$02\n\t.byte  $07,$0c,$02\n\t.byte  $07,$0c,$01\n\t.byte  $07,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_teleported.s",
    "content": "\t.rodata\n\t.export\t_sfx_teleported\n_sfx_teleported:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1c,$04,$0f ; first chunk of freq,channel,volume\n\t.byte  $00,$06,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $03,$0c,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $04,$0c,$0f\n\t.byte  $10,$04,$0f\n\t.byte  $07,$04,$0f\n\t.byte  $06,$0c,$0f\n\t.byte  $06,$0c,$0f\n\t.byte  $05,$0c,$0f\n\t.byte  $0f,$04,$0f\n\t.byte  $01,$0c,$0d\n\t.byte  $15,$04,$0f\n\t.byte  $0d,$04,$0d\n\t.byte  $03,$0c,$0f\n\t.byte  $03,$0c,$0d\n\t.byte  $03,$0c,$0d\n\t.byte  $0d,$04,$0f\n\t.byte  $04,$0c,$0e\n\t.byte  $10,$04,$0f\n\t.byte  $10,$04,$0f\n\t.byte  $05,$0c,$0a\n\t.byte  $15,$04,$0f\n\t.byte  $12,$04,$0f\n\t.byte  $12,$04,$0f\n\t.byte  $05,$0c,$0d\n\t.byte  $16,$04,$0b\n\t.byte  $16,$04,$0b\n\t.byte  $0d,$04,$0b\n\t.byte  $12,$04,$0a\n\t.byte  $10,$04,$07\n\t.byte  $0d,$04,$09\n\t.byte  $03,$0c,$0a\n\t.byte  $0d,$04,$0c\n\t.byte  $0d,$04,$0a\n\t.byte  $05,$0c,$0a\n\t.byte  $0f,$04,$09\n\t.byte  $12,$04,$09\n\t.byte  $00,$06,$09\n\t.byte  $10,$04,$0c\n\t.byte  $10,$04,$0b\n\t.byte  $15,$04,$06\n\t.byte  $15,$04,$08\n\t.byte  $1c,$04,$05\n\t.byte  $03,$0c,$05\n\t.byte  $03,$0c,$05\n\t.byte  $0a,$04,$04\n\t.byte  $03,$0c,$04\n\t.byte  $0d,$04,$06\n\t.byte  $0d,$04,$06\n\t.byte  $02,$0c,$03\n\t.byte  $07,$04,$04\n\t.byte  $06,$0c,$04\n\t.byte  $12,$04,$05\n\t.byte  $12,$04,$03\n\t.byte  $01,$0c,$02\n\t.byte  $01,$0c,$03\n\t.byte  $0d,$04,$04\n\t.byte  $0d,$04,$05\n\t.byte  $07,$04,$01\n\t.byte  $02,$0c,$01\n\t.byte  $0a,$04,$01\n\t.byte  $03,$0c,$02\n\t.byte  $03,$0c,$03\n\t.byte  $0d,$04,$02\n\t.byte  $02,$0c,$00\n\t.byte  $03,$0c,$01\n\t.byte  $0a,$04,$01\n\t.byte  $07,$04,$01\n\t.byte  $02,$0c,$01\n\t.byte  $07,$04,$01\n\t.byte  $01,$0c,$01\n\t.byte  $0d,$04,$01\n\t.byte  $0d,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_tom.s",
    "content": "\t.rodata\n\t.export\t_sfx_tom\n_sfx_tom:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $19,$06,$04 ; first chunk of freq,channel,volume\n\t.byte  $0b,$0e,$04\n\t.byte  $1a,$06,$08\n\t.byte  $18,$0f,$0f\n\t.byte  $15,$0f,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $1e,$0c,$0f\n\t.byte  $10,$0f,$0f\n\t.byte  $12,$0f,$0f\n\t.byte  $1e,$0c,$0c\n\t.byte  $1e,$0c,$08\n\t.byte  $1e,$0c,$08\n\t.byte  $1e,$0c,$04\n\t.byte  $1e,$0c,$04\n\t.byte  $06,$06,$04\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_transporter.s",
    "content": "\t.rodata\n\t.export\t_sfx_transporter\n_sfx_transporter:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $00,$04,$00 ; first chunk of freq,channel,volume\n\t.byte  $09,$04,$02\n\t.byte  $02,$0c,$01\n\t.byte  $02,$0c,$04\n\t.byte  $02,$0c,$02\n\t.byte  $06,$04,$0a\n\t.byte  $06,$04,$04\n\t.byte  $01,$0c,$03\n\t.byte  $04,$04,$03\n\t.byte  $04,$04,$06\n\t.byte  $0a,$04,$04\n\t.byte  $03,$04,$04\n\t.byte  $01,$0c,$05\n\t.byte  $06,$04,$08\n\t.byte  $01,$0c,$04\n\t.byte  $06,$04,$02\n\t.byte  $04,$04,$04\n\t.byte  $04,$04,$09\n\t.byte  $0a,$04,$05\n\t.byte  $03,$04,$07\n\t.byte  $06,$04,$06\n\t.byte  $06,$04,$07\n\t.byte  $06,$04,$03\n\t.byte  $04,$04,$08\n\t.byte  $03,$04,$0a\n\t.byte  $03,$04,$06\n\t.byte  $00,$0c,$06\n\t.byte  $0a,$04,$05\n\t.byte  $00,$0c,$05\n\t.byte  $02,$0c,$0f\n\t.byte  $07,$04,$05\n\t.byte  $09,$04,$07\n\t.byte  $07,$04,$0a\n\t.byte  $0d,$04,$04\n\t.byte  $10,$04,$0c\n\t.byte  $02,$0c,$0a\n\t.byte  $07,$04,$02\n\t.byte  $00,$06,$05\n\t.byte  $02,$0c,$0b\n\t.byte  $0c,$04,$06\n\t.byte  $0c,$04,$03\n\t.byte  $00,$0c,$01\n\t.byte  $06,$04,$04\n\t.byte  $07,$04,$02\n\t.byte  $06,$04,$01\n\t.byte  $06,$04,$02\n\t.byte  $04,$0c,$01\n\t.byte  $07,$04,$03\n\t.byte  $01,$0c,$01\n\t.byte  $06,$04,$01\n\t.byte  $06,$04,$01\n\t.byte  $07,$04,$01\n\t.byte  $07,$04,$00\n\t.byte  $05,$0c,$00\n\t.byte  $07,$04,$00\n\t.byte  $0c,$04,$00\n\t.byte  $0f,$06,$00\n\t.byte  $00,$04,$00\n\t.byte  $00,$04,$00\n\t.byte  $00,$04,$00\n\t.byte  $00,$04,$00\n\t.byte  $00,$04,$00\n\t.byte  $00,$04,$00\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_twinkle.s",
    "content": "\t.rodata\n\t.export\t_sfx_twinkle\n_sfx_twinkle:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $00,$04,$00 ; first chunk of freq,channel,volume\n\t.byte  $02,$0c,$03\n\t.byte  $0d,$04,$0e\n\t.byte  $10,$04,$0d\n\t.byte  $1b,$04,$08\n\t.byte  $04,$0c,$0d\n\t.byte  $0a,$04,$0a\n\t.byte  $09,$04,$0f\n\t.byte  $0c,$04,$0b\n\t.byte  $10,$04,$0d\n\t.byte  $02,$0c,$02\n\t.byte  $1b,$04,$07\n\t.byte  $1b,$04,$06\n\t.byte  $0c,$04,$08\n\t.byte  $02,$0c,$08\n\t.byte  $0a,$04,$0b\n\t.byte  $00,$06,$09\n\t.byte  $16,$04,$07\n\t.byte  $1b,$04,$0b\n\t.byte  $18,$04,$08\n\t.byte  $03,$0c,$05\n\t.byte  $09,$04,$0b\n\t.byte  $09,$04,$0a\n\t.byte  $00,$06,$07\n\t.byte  $16,$04,$0c\n\t.byte  $1b,$04,$0a\n\t.byte  $18,$04,$0b\n\t.byte  $04,$0c,$07\n\t.byte  $09,$04,$08\n\t.byte  $0c,$04,$05\n\t.byte  $05,$0c,$0f\n\t.byte  $06,$0c,$0d\n\t.byte  $0b,$0c,$08\n\t.byte  $12,$04,$0b\n\t.byte  $0d,$04,$0c\n\t.byte  $09,$04,$0b\n\t.byte  $0c,$04,$07\n\t.byte  $05,$0c,$0b\n\t.byte  $06,$0c,$08\n\t.byte  $0b,$0c,$04\n\t.byte  $12,$04,$06\n\t.byte  $0c,$04,$05\n\t.byte  $09,$04,$02\n\t.byte  $0c,$04,$04\n\t.byte  $12,$04,$02\n\t.byte  $18,$04,$02\n\t.byte  $1e,$04,$01\n\t.byte  $12,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_uhoh.s",
    "content": "\t.rodata\n\t.export\t_sfx_uhoh\n_sfx_uhoh:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $07,$06,$01 ; first chunk of freq,channel,volume\n\t.byte  $1e,$0c,$03\n\t.byte  $1e,$0c,$04\n\t.byte  $17,$0c,$04\n\t.byte  $0a,$06,$06\n\t.byte  $0a,$0c,$0a\n\t.byte  $07,$06,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $19,$04,$0f\n\t.byte  $19,$04,$0f\n\t.byte  $1b,$04,$07\n\t.byte  $18,$04,$07\n\t.byte  $18,$04,$04\n\t.byte  $07,$0c,$02\n\t.byte  $16,$04,$00\n\t.byte  $16,$04,$00\n\t.byte  $16,$04,$00\n\t.byte  $0f,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $19,$04,$00\n\t.byte  $1e,$04,$01\n\t.byte  $1e,$04,$0a\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1b,$0c,$0f\n\t.byte  $0d,$0c,$0f\n\t.byte  $0d,$0c,$0e\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0f\n\t.byte  $0e,$0c,$0d\n\t.byte  $1b,$0c,$0a\n\t.byte  $04,$0c,$0a\n\t.byte  $1b,$0c,$0b\n\t.byte  $0e,$0c,$0a\n\t.byte  $0e,$0c,$0a\n\t.byte  $1b,$0c,$0a\n\t.byte  $0d,$0c,$0a\n\t.byte  $0d,$0c,$06\n\t.byte  $0e,$0c,$04\n\t.byte  $0e,$0c,$04\n\t.byte  $0e,$0c,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_uncovered.s",
    "content": "\t.rodata\n\t.export\t_sfx_uncovered\n_sfx_uncovered:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1e,$0c,$02 ; first chunk of freq,channel,volume\n\t.byte  $1b,$0c,$06\n\t.byte  $1b,$0c,$0c\n\t.byte  $1b,$0c,$0e\n\t.byte  $1b,$0c,$0c\n\t.byte  $0c,$0c,$04\n\t.byte  $17,$0c,$0f\n\t.byte  $17,$0c,$05\n\t.byte  $1b,$0c,$07\n\t.byte  $17,$0c,$05\n\t.byte  $17,$0c,$0f\n\t.byte  $17,$0c,$0f\n\t.byte  $17,$0c,$0f\n\t.byte  $03,$06,$0f\n\t.byte  $03,$06,$0f\n\t.byte  $1e,$06,$0a\n\t.byte  $17,$0c,$0c\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$0f\n\t.byte  $10,$0c,$07\n\t.byte  $10,$0c,$03\n\t.byte  $17,$0c,$03\n\t.byte  $12,$0c,$07\n\t.byte  $03,$06,$04\n\t.byte  $03,$06,$02\n\t.byte  $0e,$0c,$01\n\t.byte  $12,$0c,$02\n\t.byte  $12,$0c,$03\n\t.byte  $03,$06,$01\n\t.byte  $03,$06,$01\n\t.byte  $10,$0c,$01\n\t.byte  $12,$0c,$01\n\t.byte  $10,$0c,$01\n\t.byte  $10,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_warcry.s",
    "content": "\t.rodata\n\t.export\t_sfx_warcry\n_sfx_warcry:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $0f,$06,$04 ; first chunk of freq,channel,volume\n\t.byte  $0a,$0c,$03\n\t.byte  $1c,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $02,$0c,$0b\n\t.byte  $0c,$04,$08\n\t.byte  $18,$04,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $02,$0c,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $07,$04,$0f\n\t.byte  $0c,$04,$0c\n\t.byte  $02,$0c,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $02,$0c,$0f\n\t.byte  $0c,$04,$0f\n\t.byte  $0c,$04,$09\n\t.byte  $19,$04,$0f\n\t.byte  $02,$0c,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $02,$0c,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $0d,$04,$0b\n\t.byte  $09,$04,$0f\n\t.byte  $04,$0c,$08\n\t.byte  $1e,$04,$0e\n\t.byte  $1e,$04,$0f\n\t.byte  $1e,$04,$0b\n\t.byte  $1e,$04,$0a\n\t.byte  $1e,$04,$08\n\t.byte  $1e,$04,$07\n\t.byte  $1e,$04,$06\n\t.byte  $1f,$04,$04\n\t.byte  $1f,$04,$03\n\t.byte  $1f,$04,$02\n\t.byte  $1f,$04,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_whoa.s",
    "content": "\t.rodata\n\t.export\t_sfx_whoa\n_sfx_whoa:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $10,$0c,$06 ; first chunk of freq,channel,volume\n\t.byte  $0e,$0c,$07\n\t.byte  $0c,$0c,$0a\n\t.byte  $0b,$0c,$0e\n\t.byte  $1e,$04,$0f\n\t.byte  $04,$0c,$0c\n\t.byte  $1b,$04,$0e\n\t.byte  $0d,$04,$09\n\t.byte  $0d,$04,$0b\n\t.byte  $19,$04,$08\n\t.byte  $0c,$04,$0b\n\t.byte  $18,$04,$05\n\t.byte  $0c,$04,$0e\n\t.byte  $0c,$04,$09\n\t.byte  $07,$0c,$0a\n\t.byte  $03,$0c,$08\n\t.byte  $16,$04,$0d\n\t.byte  $16,$04,$0a\n\t.byte  $0a,$04,$0b\n\t.byte  $16,$04,$0f\n\t.byte  $16,$04,$0c\n\t.byte  $16,$04,$0c\n\t.byte  $07,$0c,$0d\n\t.byte  $07,$0c,$0f\n\t.byte  $07,$0c,$09\n\t.byte  $0c,$04,$0a\n\t.byte  $19,$04,$0e\n\t.byte  $1b,$04,$0b\n\t.byte  $1c,$04,$0b\n\t.byte  $1e,$04,$0f\n\t.byte  $0a,$0c,$08\n\t.byte  $0c,$0c,$09\n\t.byte  $0d,$0c,$0f\n\t.byte  $0d,$0c,$09\n\t.byte  $10,$0c,$0d\n\t.byte  $12,$0c,$0f\n\t.byte  $03,$06,$0c\n\t.byte  $03,$06,$04\n\t.byte  $1e,$06,$02\n\t.byte  $17,$0c,$01\n\t.byte  $1e,$0c,$02\n\t.byte  $1b,$0c,$01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_wilhelm.s",
    "content": "\t.rodata\n\t.export\t_sfx_wilhelm\n_sfx_wilhelm:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $1d,$07,$02 ; first chunk of freq,channel,volume\n\t.byte  $05,$06,$0c\n\t.byte  $07,$07,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $08,$07,$0f\n\t.byte  $07,$06,$0f\n\t.byte  $00,$06,$0f\n\t.byte  $02,$07,$0f\n\t.byte  $06,$07,$0f\n\t.byte  $0b,$04,$0f\n\t.byte  $17,$06,$0f\n\t.byte  $0e,$01,$0f\n\t.byte  $07,$07,$0f\n\t.byte  $0d,$06,$0f\n\t.byte  $0c,$07,$0f\n\t.byte  $07,$07,$0f\n\t.byte  $03,$07,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$01,$0f\n\t.byte  $05,$07,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0c,$06,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $09,$01,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $1b,$06,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$01,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $13,$0f,$0f\n\t.byte  $00,$06,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $10,$01,$0f\n\t.byte  $13,$04,$0f\n\t.byte  $08,$07,$0f\n\t.byte  $09,$01,$0f\n\t.byte  $18,$01,$0f\n\t.byte  $0a,$04,$0f\n\t.byte  $15,$04,$0f\n\t.byte  $13,$04,$0f\n\t.byte  $15,$04,$0f\n\t.byte  $15,$04,$0f\n\t.byte  $15,$04,$0f\n\t.byte  $15,$04,$0f\n\t.byte  $16,$04,$0f\n\t.byte  $17,$04,$0f\n\t.byte  $0e,$01,$0f\n\t.byte  $19,$04,$09\n\t.byte  $0a,$07,$07\n\t.byte  $15,$04,$07\n\t.byte  $00,$06,$04\n\t.byte  $13,$04,$09\n\t.byte  $12,$04,$0c\n\t.byte  $12,$04,$04\n\t.byte  $16,$04,$04\n\t.byte  $08,$07,$04\n\t.byte  $07,$07,$04\n\t.byte  $08,$07,$04\n\t.byte  $1b,$0f,$02\n\t.byte  $13,$04,$02\n\t.byte  $09,$07,$02\n\t.byte  $0b,$07,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_wolfwhistle.s",
    "content": "\t.rodata\n\t.export\t_sfx_wolfwhistle\n_sfx_wolfwhistle:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $12,$04,$02 ; first chunk of freq,channel,volume\n\t.byte  $12,$04,$04\n\t.byte  $12,$04,$03\n\t.byte  $12,$04,$05\n\t.byte  $05,$0c,$06\n\t.byte  $10,$04,$07\n\t.byte  $0f,$04,$05\n\t.byte  $0f,$04,$06\n\t.byte  $0d,$04,$07\n\t.byte  $0c,$04,$06\n\t.byte  $03,$0c,$08\n\t.byte  $0a,$04,$06\n\t.byte  $09,$04,$09\n\t.byte  $09,$04,$09\n\t.byte  $02,$0c,$09\n\t.byte  $02,$0c,$0c\n\t.byte  $02,$0c,$08\n\t.byte  $02,$0c,$0d\n\t.byte  $07,$04,$0a\n\t.byte  $07,$04,$0a\n\t.byte  $07,$04,$0b\n\t.byte  $07,$04,$0f\n\t.byte  $07,$04,$0a\n\t.byte  $06,$04,$0f\n\t.byte  $06,$04,$08\n\t.byte  $06,$04,$05\n\t.byte  $06,$04,$04\n\t.byte  $06,$04,$04\n\t.byte  $06,$04,$01\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1e,$06,$00\n\t.byte  $1c,$04,$0b\n\t.byte  $0b,$0c,$0f\n\t.byte  $0d,$0c,$0f\n\t.byte  $0d,$0c,$04\n\t.byte  $0c,$0c,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $0a,$0c,$0f\n\t.byte  $1e,$04,$0f\n\t.byte  $1b,$04,$0f\n\t.byte  $16,$04,$0f\n\t.byte  $13,$04,$0f\n\t.byte  $10,$04,$0e\n\t.byte  $0c,$04,$0b\n\t.byte  $0a,$04,$09\n\t.byte  $0a,$04,$09\n\t.byte  $02,$0c,$08\n\t.byte  $02,$0c,$0a\n\t.byte  $02,$0c,$0a\n\t.byte  $02,$0c,$08\n\t.byte  $02,$0c,$01\n\t.byte  $02,$0c,$07\n\t.byte  $02,$0c,$07\n\t.byte  $02,$0c,$08\n\t.byte  $02,$0c,$04\n\t.byte  $09,$04,$03\n\t.byte  $03,$0c,$03\n\t.byte  $04,$0c,$03\n\t.byte  $13,$04,$02\n\t.byte  $18,$04,$02\n\t.byte  $0b,$0c,$02\n\t.byte  $1b,$0c,$02\n\t.byte  $0a,$06,$02\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_yahoo.s",
    "content": "\t.rodata\n\t.export\t_sfx_yahoo\n_sfx_yahoo:\n\t.byte  $10,$10,$00 ; version, priority, frames per chunk\n\t.byte  $01,$0c,$02 ; first chunk of freq,channel,volume\n\t.byte  $18,$04,$08\n\t.byte  $07,$0c,$0f\n\t.byte  $16,$04,$0f\n\t.byte  $03,$0c,$05\n\t.byte  $0a,$04,$06\n\t.byte  $15,$04,$08\n\t.byte  $18,$04,$04\n\t.byte  $18,$04,$04\n\t.byte  $1c,$04,$04\n\t.byte  $1c,$04,$04\n\t.byte  $1c,$04,$02\n\t.byte  $0b,$0c,$02\n\t.byte  $19,$04,$01\n\t.byte  $19,$04,$00\n\t.byte  $1c,$04,$01\n\t.byte  $1b,$04,$03\n\t.byte  $19,$04,$06\n\t.byte  $18,$04,$04\n\t.byte  $1e,$04,$06\n\t.byte  $19,$04,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$0b\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$0f\n\t.byte  $18,$04,$05\n\t.byte  $18,$04,$08\n\t.byte  $19,$04,$0f\n\t.byte  $1b,$04,$08\n\t.byte  $1b,$04,$06\n\t.byte  $1c,$04,$0f\n\t.byte  $1c,$04,$0f\n\t.byte  $1e,$04,$08\n\t.byte  $1e,$04,$0e\n\t.byte  $1e,$04,$0b\n\t.byte  $0a,$0c,$08\n\t.byte  $0a,$0c,$0f\n\t.byte  $0b,$0c,$0f\n\t.byte  $0b,$0c,$0e\n\t.byte  $0b,$0c,$09\n\t.byte  $0c,$0c,$06\n\t.byte  $0c,$0c,$02\n\t.byte  $0d,$0c,$03\n\t.byte  $0d,$0c,$03\n\t.byte  $0d,$0c,$01\n\t.byte  $0e,$0c,$00\n\t.byte  $17,$0c,$00\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/atari7800/sfxlib/sfx_yeah.s",
    "content": "\t.rodata\n\t.export\t_sfx_yeah\n_sfx_yeah:\n\t.byte   $10,$10,$00 ; version, priority, frames per chunk\n\t.byte   $15, $0c, $03 ; first chunk of freq,channel,volume\n\t.byte   $12, $0c, $03\n\t.byte   $14, $0c, $03\n\t.byte   $1a, $07, $04\n\t.byte   $02, $06, $0a\n\t.byte   $1c, $04, $0e\n\t.byte   $18, $04, $0e\n\t.byte   $17, $04, $0f\n\t.byte   $13, $06, $0f\n\t.byte   $0d, $06, $0e\n\t.byte   $0e, $07, $0e\n\t.byte   $0f, $0e, $0d\n\t.byte   $12, $06, $0b\n\t.byte   $11, $07, $09\n\t.byte   $0e, $07, $07\n\t.byte   $09, $07, $02\n\t.byte   $02, $06, $03\n\t.byte   $16, $0c, $03\n\t.byte   $17, $0c, $03\n\t.byte   $15, $0c, $02\n\t.byte   $17, $0c, $02\n\t.byte   $18, $0c, $01\n\t.byte   $18, $0c, $01\n\t.byte  $00,$00,$00\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/Makefile",
    "content": "SHELL=/bin/sh\n\n# bbcim (Acorn BBC computer disk image manipulation)\n#\n# This file is public domain, by W.H.Scholten 1996 - 2009\n#\n\nINSTALL=$(HOME)\n\nall:\tlibbbcim bbcim\n\nbbcim:\n\tcd prog; $(MAKE) all\n\nlibbbcim:\n\tcd lib; $(MAKE) all\n\npostscript: doc/bbcim.ps\n\nlibtest:\n\tcd test; $(MAKE) all\n\n\nclean:\n\trm -f *~ doc/*~\n\tcd lib; $(MAKE) clean\n\tcd prog; $(MAKE) clean\n\trm -f doc/bbcim.ps\n\trm -f core *.core\n\tcd test; $(MAKE) clean\n\ninstall.lib:\n\tcd lib; $(MAKE) INSTALL=$(HOME) install.lib\n\ninstall: all\n\tcd prog; $(MAKE) INSTALL=$(HOME) install\n\tmkdir -p $(INSTALL)/man/man1/\n\tcp -fp doc/bbcim.1 $(INSTALL)/man/man1/\n\nuninstall:\n\tcd prog; $(MAKE) INSTALL=$(HOME) uninstall\n\trm -f $(INSTALL)/man/man1/bbcim.1\n\n\n# // Compile man pages to postscript\n.SUFFIXES: .1 .2 .3 .4 .5 .6 .7 .8 .9 .ps\n.1.ps:\n\tgroff -t -e -mandoc -Tps $< > $@\n\n\n# EOF\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/READ_ME",
    "content": "bbcim (BBC computer file conversion utility) (C) 1995-2016 W.H.Scholten\n-----------------------------------------------------------------------\nThis is version 1.2\n\n       bbcim  is  a  file conversion utility to help in transferring files and\n       for use with emulators, like creating disk images (Acorn DFS  and other\n       formats),  adding  files  to them, extracting files from them, minimise\n       the size of these images etc.\n\nFor more information, see the manual page: 'man bbcim'. The manual page is\nalso included in the help function. Start with 'bbcim -h' and then e.g.\n'bbcim -help -c' will give more information on the catalogue option -c.\n\n\nCompiling and installing bbcim:\n-------------------------------\nYou need an ansi C-compiler. I used: pcc 1.1.0, clang 3.4.1 and gcc 4.8.5.\nSet the environment variable CC to the compiler you want to use, e.g.\n\n  export CC=pcc\n\nEdit prog/_config.h and lib/_config.h before compiling, then:\n\n'make'\t\t\tcompiles bbcim, linked against a static library.\n'make clean'\t\tremoves objects, libraries and executables.\n'make install'\t\tinstalls bbcim in $(HOME)/bin/, and the manpage in\n\t\t\t$(HOME)/man/.\n'make uninstall'\tremoves bbcim from $(HOME)/bin/, and the manpage from\n\t\t\t$(HOME)/man/.\n\n\nIf you want to make/install shared libraries, go to the directory lib:\n\n'make shared'\t\tcompiles the shared library.\n'make install.lib'\tinstalls the shared library libbbcim.so.1.0 and the\n\t\t\theader file bbcim.h\n'make uninstall.lib'\tremoves the library and header file.\n\n\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/ARCHIVE_FORMAT-0.83",
    "content": "Standard formats for BBC files and disk images v 0.83\n-----------------------------------------------------\n[ N.B. This specification was originally included with bbcim v0.83 ]\n\nNote: optional arguments are in square  brackets, '|' denotes a choice\nbetween arguments.\n\n\nTHE ARCHIVE FILE FORMAT:\n------------------------\n(i.e. the standard format for/of files in the BBC micro archive of\nsoftware on my website)\n\n[ N.B.  At the  time of writing  this down  (1997), my BBC  archive of\nsoftware was  almost all the software  for the BBC  micro available on\nthe internet (Robert  Schmidt's archive was mostly a  mirror of what I\nput up), and I  wanted to get rid of diskimages so  you could pick and\nchoose software to put into a  disk yourself. So, 'the archive' was my\narchive of BBC software. ]\n\n\n  Complementing  a  bare  BBC  file  'ELITE'  is  the  attribute  file\n'ELITE.inf' , which  is a text file containing  '$.ELITE FF0E00 FF8023\nLocked CRC=XXXX NEXT  ELITEdata'.  ELITE is just the  name used on the\nhost  system  (as  BBC  files  often  contain  characters  that  other\nfilesystems can't  handle such  as '/') and  $.ELITE in  the attribute\nfile is the real name.\n\n  In general we have:\n  - A BBC file, 'myprog'\n  - A text file 'myprog.inf' which contains:\n\n{TAPE <tfs_filename> | <dfs_filename>} <load address> <exec address> [<file length>] ['Locked'] CRC=<xxxx> [NEXT <next filename>]\n\n  Arguments are separated by spaces.\n\n  Cassette names can be used in 2 ways;\n  1. translated to $.<cassette_name> (i.e.  max 12 chars)\n  2. TAPE <cassette name>\n\n  Note that for complete  accuracy, TAPE <cassette name> is preferable\nas it identifies a file as a TAPE file, where 'Locked' has a different\nmeaning to that for disks, and NEXT can be used (see below).\n\n  Programs  handling  archive  format  files  should be  aware  of  12\ncharacter filenames from tapes ($.tape-name) and should rename them if\nnecessary.\n\n  NEXT gives the next expected filename on the tape, which may be used\nfor  CHAIN\"\" or  *RUN  as used  on  cassette systems,  or  to put  the\nprograms back  on a tape  in the correct  order, so a  file containing\nTAPE should contain  NEXT too (unless it's the  last file).  Note that\n<next  filename> used for  NEXT must  be a  host filename,  as several\nfiles can have the same name on tape!\n\n  <load address> and <exec address> are hexadecimal strings (without a\nlanguage dependant identifier), e.g. FFFF8023.\n\n  <file length> is also a hexadecimal string and may be included after\n<exec address>) but is unnecessary.\n\n  The file attribute 'Locked' may be abbreviated to 'L'.\n\n  After 'CRC=' follows the bare file's CRC, as a hexadecimal string of\nup to four digits.\n  The CRC  is calculated  with the algorithm  from the BBC  user guide\np. 399  (The same  algorithm as  used in the  cassette and  rom filing\nsystem).  It is included for various reasons (to check file conversion\nsoftware, serial- or disk- file transfer to/from a BBC, etc.). See the\nappendix for a sample implementation.\n\n  Host filenames: It is recommended that files only use ASCII and none\nof the following  characters (due to the way they are  used in various\noperating systems): \\ / : * ? \" < > | . ` '\n\n\nTHE ARCHIVE DISK FORMAT:\n------------------------\n  Given a BBC  disk image, e.g. 'games', we have an accompanying  file\n('games.dsk'), which contains the following information:\n\n '<disktype> <sides> <tracks>T <sectorspertrack>S <bytespersector>B'\n\ne.g. DFS SS 40T 10S 256B.\n\n  After this line, any information about the disk image can be placed.\nThis should  be ignored by utilities  that only need  the disk format.\n\n=> Suggestions of useful standard information to put there?\n\n  If there's  no '.dsk' file, utilities should consider the disk image\nto be 'DFS SS 80T 10S 256B', i.e. standard Acorn DFS.\n\n\nAppendix: The CRC algorithm, example C code:\n--------------------------------------------\n\nlong bbcim_data_crc(void *data, int length) {\n\tint  i;\n\tunsigned char *d = (unsigned char *) data;\n\tunsigned int crc;\n\n\tcrc = 0;\n\n\tfor (i=0; i<length; i++) {\n\t\tint  k;\n\n\t\tcrc ^= ((*d++) << 8);\n\t\tfor(k=0; k<8; k++) {\n\t\t\tif (crc & 32768) crc = (((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\telse crc <<= 1;\n\t\t}\n\t}\n\n\treturn crc;\n}\n\n----\n\nWouter Scholten , 16-8-1997 & 18-4-2001\n\nEmail: swhs-web@xs4all.nl\nWeb page: http://wouter.bbcmicro.net/\n\n(previous email addresses:\n   whs@hccnet.nl,\n   wouter.scholten@wanadoo.nl,\n   whs@xs4all.nl,\n   wouters@cistron.nl)\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/CHANGES",
    "content": "Overview of changes in bbcim:\n-----------------------------\nc denotes a change, + denotes a new feature, - denotes a removed feature:\n\nThe first bbcim version was  0.60 (I think), a combination of separate\nprograms that I first put on my website in 1995.\n\n   Changes in 0.83 (from 0.70):\n    +  xcrc implemented\n    +  -ed may work on a mac (LET ME KNOW): uncomment #define MAC\n    +  -e options now in any order\n    +  -e, -x and  -y: if  a file  exists, you  can choose  whether to\n       overwrite or rename.\n    c  seeks  immediately  before  read/write in  add-loop,  otherwise\n       segmentation faults sometimes (bug in GCC?).\n    c  fixed small mistake in xcrc.\n\n   Changes in 0.91 (from 0.83):\n    +  'use' added.\n    +  -s file overwrite choice.\n    +  -e file {list}\n    c  -x : rename file to itself fixed (no overwrite question)\n    c  -xcrc: filenames < 7 char's now OK.\n    c  -s : L before load  address (as in xbeeb's  __CATALOG__) is now\n       acceptable.\n\n   Changes in 0.92:\n    +  -ab : adds bare files, otherwise info file is used by default.\n    c  -e; b->s, info file is now added by default, b=bare.\n\n   Changes in 0.93-beta (9-3-97):\n    +  code cleaned up with explicit type conversions\n    +  added code  to  replace characters  in  filenames (usually  not\n       needed in linux); e.g. '/' gives problems.\n    +  Help in english\n\n   Changes in 0.94 (16-3-97):\n    c  w62 conversion now included in bbcim.\n\n   Changes in 0.95 (30-6-97 - 4-7-97):\n    c  w62 conversion to Acorn DFS:  if there are less  than 32 files,\n       only one disk image is made.\n    c  disknames without a . didn't extract with -ed  (as the dir name\n       was equal to the disk image name). Added a rename.\n    c  Cleaned up 'mkdir' selection. You now have 3 choices.\n    +  Config additions:  bbcim now  compiles on  other  OS'es without\n       changes.\n    c  bugfix: -s# works again (no idea when it got broken).\n\n   Changes in 0.96 (31-7-1997 & 1-8-1997):\n    c  char's 1-31 are replaced by _ in the check for bad char's.\n    +  ADFS catalogue & file extraction.\n    +  ADFS  interleaved disk  image  into  usable  linear disk  image\n       conversion.\n    c  option decoding separated from functions.\n    +  set bootoption (unfinished).\n    +  identify disk type (unfinished).\n    +  compilable as a separate library.\n\n   Changes in 0.97-a28 (ca. 25-10-1997):\n    c  uniform format of functions for use with any disk image type.\n    c  files and functions renamed for the lib.\n    c  ADFS code debugged.\n    +  standard disk format: file + file.dsk.\n\n   Changes in 0.98 (dd 1999, 2000, 2001; Not released):\n    c  proper library organisation.\n    c  removed need for gmake.\n    c  cleaned up the code.\n    c  cleaned up the man page.\n\n   Changes in 0.99 (2001, 2003; Not released):\n    -  removed xbeeb support.\n    c  large parts  rewritten, e.g. for use of  -c/-e/-a/-d with double\n       sided disk images.\n    c  disk attributes are set with -type/-sides/-tracks/-sectors/-bytes.\n    c  side of double sided image is selected with -side.\n    c  no more considerations for short host file names or 16 bit compilers.\n    c  path lengths increased to 256.\n\n   Changes in 0.100 (2003; Not released):\n    c  DFS: extract doesn't produce a catalogue file.\n    c  Various code sections tested.\n\n   Changes in 0.101 (6 jun 2003; yes that's nearly 6 YEARS after 0.97-a28!):\n    c  ADFS cat/extract fixed for double sided (interleaved) images.\n\n   Changes in 0.102 (10 jun 2003):\n    +  -e and -s: suboption '@' implemented.\n    +  disk attributes created for interleave/split/ddos->dfs/w62->dfs.\n    c  updated various documentation and Makefiles.\n    c  ADFS: extract doesn't produce a catalogue file.\n\n    +  more  error  messages,  esp.  for as  yet  unsupported  actions\n       (e.g. -c on a W62/DDOS format disk).\n\n    c  renamed the options  ddos2dfs /  w62dfs /  ds2ss to  ddos_dfs /\n       w62_dfs / adfs_ss.\n\n    +  -help <option> implemented  for all options, giving  an extract\n        of the bbcim man page for a given option. Very useful!\n\n   Changes in 0.103 (12 jun 2003):\n    c  fixed the filemode to rb+ for disk expansion (-40/-80/-max).\n\n    c  -40/-80/-max also set the filing system size if the filesize is\n       equal to the required size  (this is useful for reducing images\n       in  size,   together  with  -min).   Also   added  the  missing\n       bbcim_disk_write().\n\n    c  -adfs_ss/-min rename the old .dsk file (if it exists) along with\n       the disk image, and makes a new one.\n\n    c  -40/-80/-max/-new create a .dsk file.\n    c  free 'inf_file' in archive_cleanup.c.\n    c  options -y/-icrc renamed to -inf_clean/-inf_crc.\n    c  various man page improvements.\n\n   Changes in 0.104 (2003- 26 feb 2009, not released):\n    +  made a start with -id.\n    -  removed TURBOC/WIN32/MAC  code which  was  all  old and  barely\n       tested (by  others) since the  late 1990s. The TURBOC  code may\n       not have been used at all.\n\n   Changes in 0.105 (22 apr 2009):\n    -  I only used ADFS a few times to extract files from a disk image\n       and I didn't like working with ADFS on the BBC micro itself, so\n       I've decided not to waste any more energy  on supporting it. If\n       you want ADFS, help me with  the ADFS code  in bbcim, otherwise\n       it's not coming back.\n    c Many changes and cleanups related to using the separate archive-\n      format code. This also removed a lot of duplicate code/defines.\n    c Updated the w62_dfs and ddos_dfs code and more.\n    c DFS: Added  disk title terminator. A disk  title shorter than 12\n      characters ends  with 0, but a  12 character one  has none. This\n      gave some garbage in catalogue output.\n    c .ssd  and .dsd  suffixes  are  recognized  and  disk  sides  set\n      accordingly. A .dsk file will override this.\n    c Naming scheme changes: no more considerations  meant for old DOS\n      filenames.   E.g.   mydisk.bbc  with  A  file  $.ELITE  gave  an\n      extracted filename  mydisk.$.ELITE or mydisk/$_ELITE  instead of\n      mydisk.bbc.$.ELITE or mydisk.bbc.d/$.ELITE which is what happens\n      now.   DOS was  also  the main  reason  for the  option to  make\n      hostnames without  a dot as character  2, from the  bbc name, by\n      glueing  the directory  name  to the  file  name (A.ELITE  would\n      become  AELITE).  This  is not  needed except  for DOS  which is\n      really an  obsolete OS. So,  option # removed, option  @ changed\n      behaviour to keep the root dir '$'.\n    c Manpage  updated to  fix various typos  and also the  new naming\n      behaviour.  The  help <option>  function  of  course  too as  it\n      consists essentially of sections of the man page.\n    c Tested & debugged the minimise function.\n    c Much more checking in the sanity check for diskimages.\n    c Invalid arguments now show the syntax of the given option.\n    c Check there is at least 1 filename given for inf_clean, inf_crc.\n\n   Changes in 0.106 (14 may 2009)\n    c Changes to always use fprintf with a literal format string.\n\n    c Some  changes to the  archived format  function that  reads file\n      attributes.  CRC reading was  not ok  in particular  which means\n      some files weren't recognized as archive format.\n\n   Changes in 0.107 (21 may 2009)\n    c INSTALL  in  the top  Makefile is  used to  select where  to put\n      files.  By  default, this  is now in  the home directory  of the\n      user (i.e. $(HOME)/bin/ and $(HOME)/man/man1/)\n    c 2  includes in bbcimlib.c changed  from ../../archive_format/ to\n      archive_format/ as the  former only exist in the  source tree on\n      my PC in which I use symbolic links to shared files.\n    c fixed DFS -c with list, DFS -ab\n\n   Changes in 1.1 (2014-1-26)\n    c small changes in READ_ME\n    c Version number changed from 0.107 to 1.1 to signify that this is\n      the new development branch that  came after the original version\n      of which  the  last  number was 0.95b11  (which I renamed to 1.0 \n      because of its stability).\n\n   Changes in 1.2 (2016-7-28)\n    c code reorganised.\n\n    c Colour output to the console didn't work with pcc because of colour codes using \\e (escape sequence) in the front end. Instead I now use my shared _ansi_console.h (which uses \\033) there as I already did for a long time in the library.\n\n    c char subopties[] had 1 entry too few in prog/bbcim.c\n\nWouter Scholten\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/EMAIL",
    "content": "Wouter Scholten:\n----------------\nemail: swhs-web@xs4all.nl\n\n\nprevious email addresses:\n - whs@hccnet.nl (23 jul 2003 - mid 2006)\n - wouter.scholten@wanadoo.nl (6 may 2001 - 22 jul 2003)\n - s_whs@hotmail.com (18 mar 2001 - 5 may 2001)\n - whs@xs4all.nl (23 mar 1999 - 22 mar 2001)\n - wouters@cistron.nl (jun 1995 - 22 mar 1999)\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/LICENCE",
    "content": "All files not explicitly licenced otherwise are licenced thus:\n\n// Copyright (C) W.H. Scholten 1996, 1997, 1999, 2000, 2001, 2003, 2009, 2014\n \n// Permission to use, copy, modify, distribute, and sell this software\n// and its documentation for any purpose is hereby granted without fee,\n// provided that the above copyright notice appear in all copies and\n// that both that copyright notice and this permission notice appear in\n// supporting documentation, and that the name of the copyright holder\n// not be used in advertising or publicity pertaining to distribution\n// of the software without specific, written prior permission. The\n// copyright holder makes no representations about the suitability of\n// this software for any purpose. It is provided \"as is\" without express\n// or implied warranty.\n//\n// THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n// SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n// SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n// RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n// CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/TO_DO",
    "content": "What needs to be done in the current version:\n---------------------------------------------\n\nReorganise code:\n----------------\nThese should be moved from the library to the main bbcim program (=interface to the library) as they are not much of interest as library functions?:\nDONE   catalogue_to_inf.c\nDONE   archive_cleanup.c\nDONE   crc.c\n?   disk_id.c\n\n\nFunctions that need testing:\n----------------------------\n  - ddos -> dfs\n  - w62 -> dfs\n\n\nDesired changes/fixes/improvements:\n-----------------------------------\n\nNeeded fixes:\n?\n\n\nDesired improvements:\n- Add: -id : identify diskformat (single/doublesided, dfs/ddos). It's not possible to do this in a foolproof way...\n\n- disk_catalogue_extract__dfs.c : add LOAD_FILE function.\n\n- Add: bbcim_ddos_to_dfs: double sided DDOS disk images.\n- Add: bbcim_w62_to_dfs: ditto\n\n- Add: DDOS/W62 catalogue/extract/delete/add/crc using the dfs functions with an offset.\n- Add: -rename <disk> [-dir <dir>] <filename> <new filename>\n\n -sectors nn: custom disksize (for DDOS)\n\n\n\nPossible changes:\n-----------------\nQ -e with list, should suboption 'r'  remove  the  extracted files? (using -d)\nQ - Rename? disk_combine_ss -> disk_ss_to_ds\n    disk_split_ds   -> disk_ds_to_ss\nQ - Allow .w62 and .ddos to identify watford 62 file and DDOS disk formats?\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/USE_AS_LIBRARY",
    "content": "Using the bbcim library\n-----------------------\n\nPut\n\t#include <bbcim.h>\nin your C/C++ source, and link the objects with -lbbcim (and  possibly\n-L<install location of libbbcim>)\n\nAll functions  return 0 if there  was no error,  otherwise, a negative\nvalue is returned (docs on this will come later). Use verbose=1 to let\nthe library print out errors to stderr.\n\nIn both  cases 'bbcim_error' is  a pointer to  a string with  the last\nerror message, and 'bbcim_errno' the corresponding error number.\n\nSee lib/include/bbcim.h  for all structs  and error messages  (this is\nnot yet complete).\n\nWouter Scholten\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/WatfordDFS_format.txt",
    "content": "Watford DFS\n\n\n...\n\n9.2 Disc Catalogue\n\nIn Watford Electronics DFS there can be either one or two catalogues on \nthe disc.  They are both in track 0, one occupying sectors 0 and 1, the\nother occubying 2 and 3.  The two catalogues are identical in structure:\n\nSector 00:\n00-07 First 8 bytes of the 12 byte disc title\n08-0E First filename\n0F    Directory of the first filename, top bit set if file is locked\n10-1E Second filename\n1F    Directory of second filename\n.\n.\n.\nRepeated for up to 31 files\n\nSector 01:\n((H) indicates high order two bits of a number that doesn't fit one\nor two bytes.)\n00-03 Last 4 bytes of disc title\n04    Count of total number of writes to disc in packed BCD\n05    Number of catalogue entries * 8\n06    bits 0,1 - number of sectors (H)\n      bits 4,5 - !BOOT start option (*OPT4 value)\n07    Number of sectors on the disc\n08-09 First file's load address (Low byte, High byte)\n0A-0B First file's execute address\n0C-0D First file's length in bytes\n0E    bits 0,1 - First file's start sector (H)\n      bits 2,3 - First file's load address (H)\n      bits 4,5 - First file's length (H)\n      bits 6,7 - First file's start sector (H)\n0F    First file's start sector, 8 low bits of a 10 bit number\n.\n.\n.\nRepeated for up to 31 files\n\nSector 02:\nThis will contain the first file on a 31 file disc.  If this is a 62\nfile disc then it will contain:\n00-07 8 * &AA recognition bytes\n08..... As for sector 00\n\nSector 03:\nIf this is a 62 file disc:\n00-03 5 * nulls\n04..... As for sector 01\n\n\nThe disc is recognized as being a 62 file disc by the 8 &AA recognition \nbytes in the disc title area of the second catalogue.  This area would\notherwise be unused.\n\nStandard DFS will not recognize the second catalogue, and will allow it\nto be overwritten.\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/doc/bbcim.1",
    "content": ".\\\" -*- nroff -*-\n.\\\"\n.\\\" bbcim.1\n.\\\" Copyright (C) 1996-2016 W.H.Scholten.\n.\\\"\n.\\\" Permission to use, copy, modify, distribute, and sell this software\n.\\\" and its documentation for any purpose is hereby granted without fee,\n.\\\" provided that the above copyright notice appear in all copies and\n.\\\" that both that copyright notice and this permission notice appear in\n.\\\" supporting documentation, and that the name of the copyright holder\n.\\\" not be used in advertising or publicity pertaining to distribution\n.\\\" of the software without specific, written prior permission. The\n.\\\" copyright holder makes no representations about the suitability of\n.\\\" this software for any purpose. It is provided \"as is\" without express\n.\\\" or implied warranty.\n.\\\"\n.\\\" THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n.\\\" SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n.\\\" FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n.\\\" SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n.\\\" RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n.\\\" CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n.\\\" CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n.\\\"\n.\\\"\n.\\\" bbcim.1 - nroff -man source for  bbcim  man page.\n.\\\"\n.\\\"\n.\\\"\n.TH bbcim 1 \"17 August 2016\" \"Version 1.2\" \"Utilities\"\n.\\\"\n.\\\"------------------------------------------------------------------\n.\\\"\n.SH NAME\nbbcim - BBC computer file conversion utility\n.\\\"\n.\\\"------------------------------------------------------------------\n.\\\"\n.SH SYNOPSIS\n.B bbcim [options] [file(s)] ...\n.\\\"\n.\\\"------------------------------------------------------------------\n.\\\"\n.SH DESCRIPTION\nbbcim is a file conversion utility to help in transferring files and for use with emulators, like creating disk images (Acorn DFS and other formats), adding files to them, extracting files from them, minimise the size of these images etc.\n.SH USE\nbbcim  option [file [{filelist}]]  (any extension is allowed for disk images)\n\nIn the following listing of options, diskoptions are: \n [-type DFS|W62|DDOS|ADFS|HDFS] [-bytes <no>] [-sectors <no>] [-tracks <no>] [-sides <no>]\ni.e. they identify the exact disk type (except for non-standard or protected types); the default is DFS, 40 tracks (or whatever it really is, as the DFS disk image stores the disk size in total number of sectors), single sided, 256 bytes/sector (standard), 10 sectors/track (this latter number is only of interest for interleaving/splitting double sided disk images, and varies from 10 for DFS, 16 for ADFS and some double density DFS'es such as Solidisk DDFS, to 18 for Opus DDOS).\n\nTwo special cases are for filenames ending in .ssd and .dsd which have been used (robert Schmidt) to identify single sided and double sided DFS disks (which are the most common type of disk image).\n\nOptions are:\n.TP\n.B  -c[R] [<diskoptions>] <disk> [-side <side>]\nshow catalogue (files in image). R is for hierarchical filing system images, recursively showing all files from the root or given directory.\n.TP\n.B \\-e[s|d,@,b,r] [<diskoptions>] <disk> [-side <side>] [{list}]\nextracts files.\nWithout d,s or @ the option, -e extracts files from a disk image 'imagefile' with filenames such as 'imagefile.D.DATA' but acorn DFS root dirs are removed, so '$.!BOOT' is extracted to 'imagefile.!BOOT'. With every 'bare' file, an info file is created containing in particular the load- and execution addresses (i.e. the archive format).\n.br\nThe suboptions produce the following results:\n\n.B d\nextracts the files in a directory named after the disk image (appending \".d\"): eg. 'imagefile.d/$.ELITE'.\n\n.B s\ngives short filenames (no leading disk image name nor is a directory created to put the files in).\nNote that \n.B d\nand\n.B s\nare mutually exclusive.\n\n.B @\nkeeps the Acorn DFS root directory $, so $.ELITE doesn't become ELITE.\n\n.B b\nonly the bare files are created, and no info files (with file attributes).\n\n.B r\nNOT IMPLEMENTED: remove the extracted files from the disk image.\n\nWhen a list of file names is given, only the files in the list are extracted from the disk image.\n\n.TP\n.B \\-a[b,r] [<diskoptions>] <disk> [-side <side>] {list}\nadd files (in archive format) to the disk image:\nAutomatically skips '.inf' files so bbcim -a <disk> * (on unix) gives no problems. If the disk image didn't exist a new one will be created. The option 'r' removes the archive files after adding them to the disk image. Side can be 0 or 1 (for double sided disk images)\n.I The option 'b' adds files without .inf file\n(setting load/exec addresses to 0).\n.TP\n.B \\-d [<diskoptions>] <disk> [-side <side>] {list}\ndelete the list of files from the disk image.\nNOTE: files without a BBC (Acorn DFS) directory are assumed to have the root directory $, eg. ELITE is assumed to be $.ELITE\n.TP\n.B \\-40 [<diskoptions>] <disk>\nexpand a disk image to 40 tracks (if current size is smaller than 40 tracks). This changes the disk image size, but more importantly also the DFS filing system size (the number with the number of sectors that's stored in the disk image). So shrinking an 80 track image to 40 track is possible by first using -min, then -40 (if the files fit on 40 tracks).\n.TP\n.B \\-80 [<diskoptions>] <disk>\nexpand a disk image to 80 tracks (if current size is smaller than 80 tracks). This changes the disk image size, but more importantly also the DFS filing system size (see above).\n.TP\n.B \\-max [<diskoptions>] <disk>\nexpand a single or double sided DFS disk image to almost 256K per side. This changes the disk image size, but more importantly also the DFS filing system size (see above).\n.TP\n.B \\-min [<diskoptions>] <disk>\nminimise a disk image (equal to *COMPACT and cutting off after the last used sector). In case of double sided images, both sides are minimised.\n.TP\n.B \\-crc [<diskoptions>] <disk> [-side <side>]\ncalculates crc's for all the files in the disk image.\n.TP\n.B \\-new [<diskoptions>] <disk>\nmakes a new (empty) disk image (for Acorn DFS: 512 bytes, bootoption EXEC).\n.TP\n.B \\-boot [<diskoptions>] <disk> [-side <side>] <bootoption>\nSets the bootoption of the disk image: none, LOAD, RUN, EXEC.\n.TP\n.B \\-interss [<diskoptions 0>] <disk0> [<diskoptions 1>] <disk1> <disk2>\ninterleaves two single sided disk images <disk0> and <disk1> to <disk2>.\n.TP\n.B \\-splitds [<diskoptions>] <disk>\nsplits an interleaved disk image <disk> to <disk>.0 and <disk>.1.\n.TP\n.B \\-ddos_dfs [<diskoptions>] <disk>\nsplits a single sided DDOS disk image into several DFS disk images.\nEg. myfiles > myfiles.A,..., myfiles.H.\n.TP\n.B \\-w62_dfs [<diskoptions>] <disk>\nsplits a single sided watford 62 file disk image into two DFS disk images (one image if there are less than 32 files on the image) <disk>.1 and <disk>.2.\n.TP\n.B \\-id <disk>\ntries to identify a disk image (type/sides).\n\n.TP\n.B \\-s[@] <file>\nsplits a text file with file information (catalogue) into .inf files. Lines not starting with a BBC (Acorn DFS) file name (i.e. dir.name) are skipped. This can be used for example to make archive files from an xbeeb directory file (__CATALOG__).\n\nIn DFS use, one is usually in directoy '$' (the root dir), and the current directory is not displayed. This means, it's useful to remove the root dir '$' in host file names. If you don't want this, use option '@' which keeps the root directory $.\n.TP\n.B \\-inf_clean {list}\nrenames archive/info files to standard format (as produced with '#' in -e (XXX update this as '#' was removed XXX)), add's crc's if not found, checks crc's if found.\n.TP\n.B \\-inf_crc {list}\ncheck crc's of the given archive files.\n.TP\n.B \\-V\nprint bbcim version.\n.TP\n.B \\-H\ngives general help (command overview).\n.TP\n.B \\-help <option>\nGives an extract of the man page pertaining to option <option>.\n\n\n.TP\nDisk and boot type are set as follows:\n.B <disk options> is :\n.br\n [-type <DFS | W62 | DDOS | ADFS | HDFS>] [-bytes <no>] [-sectors <no>] [-tracks <no>] [-sides <no>]\n.TP\nand\n.B <boot option> is :\n.br\n [ none | LOAD | RUN | EXEC ]\n\n\n.SH CURRENT VERSION\n 1.2\n\n.SH NOTES\nImplementation weirdness that should be fixed to conform to Acorn DFS:\n.br\nFor options -d, -e, and -a:\n  * names are case sensitive.\n\nFor options -d, -e:\n  * wildcards are not possible\n\nFor option -a:\n  * There is no check for existing files with a given name, and none are deleted. All files are appended in the directory so several files in a disk image can have the same name (actually useful to get things back to a beeb, no need to rename, by extracting the files and deleting them one at a time you can get at all the files...).\n\nIf in doubt: it's not a bug, it is a feature!\n\n\n\n.SH THE STANDARD ARCHIVE FILE & DISK FORMAT (version 0.83)\n[ N.B. This specification was originally included with bbcim v0.83 ]\n\nNote: optional arguments are in square  brackets, '|' denotes a choice\nbetween arguments.\n\nTHE ARCHIVE FILE FORMAT:\n.br\nI.e. the standard format for/of files in the BBC micro archive of\nsoftware on my website.\n\n[ N.B.  At the  time of writing  this down  (1997), my BBC  archive of\nsoftware was  almost all the software  for the BBC  micro available on\nthe internet (Robert  Schmidt's archive was mostly a  mirror of what I\nput up), and I  wanted to get rid of diskimages so  you could pick and\nchoose software to put into a  disk yourself. So, 'the archive' was my\narchive of BBC software. ]\n\n  Complementing  a  bare  BBC  file  'ELITE'  is  the  attribute  file\n'ELITE.inf' , which  is a text file containing  '$.ELITE FF0E00 FF8023\nLocked CRC=XXXX NEXT  ELITEdata'.  ELITE is just the  name used on the\nhost  system  (as  BBC  files  often  contain  characters  that  other\nfilesystems can't  handle such  as '/') and  $.ELITE in  the attribute\nfile is the real name.\n\n  In general we have:\n  - A BBC file, 'myprog'\n  - A text file 'myprog.inf' which contains:\n{<TAPE <tfs_filename> | <dfs_filename>} <load address> <exec address> [<file length>] ['Locked'] CRC=<xxxx> [NEXT <next filename>]\n\n  Arguments are separated by spaces.\n\n  Cassette names can be used in 2 ways;\n  1. translated to $.<cassette_name> (i.e.  max 12 chars)\n  2. TAPE <cassette name>\n\n  Note that for complete  accuracy, TAPE <cassette name> is preferable\nas it identifies a file as a TAPE file, where 'Locked' has a different\nmeaning to that for disks, and NEXT can be used (see below).\n\n  Programs  handling  archive  format  files  should be  aware  of  12\ncharacter filenames from tapes ($.tape-name) and should rename them if\nnecessary.\n\n  NEXT gives the next expected filename on the tape, which may be used\nfor  CHAIN\"\" or  *RUN  as used  on  cassette systems,  or  to put  the\nprograms back  on a tape  in the correct  order, so a  file containing\nTAPE should contain  NEXT too (unless it's the  last file).  Note that\n<next  filename> used for  NEXT must  be a  host filename,  as several\nfiles can have the same name on tape!\n\n  <load address> and <exec address> are hexadecimal strings (without a\nlanguage dependant identifier), e.g. FFFF8023.\n\n  <file length> is also a hexadecimal string and may be included after\n<exec address>) but is unnecessary.\n\n  The file attribute 'Locked' may be abbreviated to 'L'.\n\n  After 'CRC=' follows the bare file's CRC, as a hexadecimal string of\nup to four digits.\n  The CRC  is calculated  with the algorithm  from the BBC  user guide\np. 399  (The same  algorithm as  used in the  cassette and  rom filing\nsystem).  It is included for various reasons (to check file conversion\nsoftware, serial- or disk- file transfer to/from a BBC, etc.). See the\nappendix for a sample implementation.\n\n  Host filenames: It is recommended that files only use ASCII and none\nof the following  characters (due to the way they are  used in various\noperating systems): \\\\ \\/ : * ? \\< \\> \\| . \\` \\' \"\\\"\"\n\n\n.B THE ARCHIVE DISK FORMAT:\n  Given a BBC  disk image, e.g.  'games', we have an accompanying  file\n('games.dsk'), which contains the following information:\n\n '<disktype> <sides> <tracks>T <sectorspertrack>S <bytespersector>B'\n\ne.g. DFS SS 40T 10S 256B.\n\n  After this line, any information  about the disk image can be placed.\nThis should  be ignored by utilities  that only need  the disk format.\n\n=> Suggestions of useful standard information to put there?\n\n  If there's  no '.dsk' file, utilities should  consider the disk image\nto be 'DFS SS 80T 10S 256B', i.e. standard Acorn DFS.\n\n\n.B Appendix: The CRC algorithm, example C code:\n\nint bbcim_data_crc(void *data, int length) {\n.br\n\tint  i;\n.br\n\tunsigned char *d = (unsigned char *) data;\n.br\n\tint crc;\n\n\tcrc = 0;\n\n\tfor (i=0; i<length; i++) {\n.br\n\t\tint  k;\n\n\t\tcrc ^= ((*d++) << 8);\n.br\n\t\tfor(k=0; k<8; k++) {\n.br\n\t\t\tif (crc & 32768) crc = (((crc ^ 0x0810) & 32767) << 1)+1;\n.br\n\t\t\telse crc <<= 1;\n.br\n\t\t}\n.br\n\t}\n\n\treturn crc;\n.br\n}\n\nThis is the same algorithm as used in the BBC micro's operating system, in particular in tape blocks. See the BBC microcomputer user guide p. 397.\n\n\n.SH BUGS\nSome areas need testing, especially related to double sided diskimages to see if all works well. If you find a bug, send me a report please.\n\n.SH AUTHOR\nWouter Scholten, email: swhs-web@xs4all.nl\n\nWeb page: http://wouter.bbcmicro.net/\n\n(previous email addresses:\n   whs@hccnet.nl,\n   wouter.scholten@wanadoo.nl,\n   whs@xs4all.nl,\n   wouters@cistron.nl)\n\nThis man page was created & updated: 1 September 1996, 22 October 1996, 14 November 1996, June 1997, April 2000, Februari 2001, April 2001, May 2001, June 2003, February 2009, April 2009, May 2009, 26 January 2014, 28 July 2016, 17 August 2016\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/Makefile",
    "content": "SHELL = /bin/sh\n\n# LIBBBCIM: Acorn BBC computer disk image manipulation and more\n#\n# This file is released to the public domain, by W.H.Scholten 1996,1997,1999,2001,2003,2009,2014\n#\n\n\nSHELL=/bin/sh\n\nINCLUDES=-Iinclude -Ishared -Ishared/archive_format\nWARN\t= -Wall -Wfatal-errors -Wstrict-prototypes -Wmissing-prototypes\nALL_CFLAGS=$(WARN) $(INCLUDES) -g -O2 -std=c99\n\nall: static\n\nstatic: libbbcim.a\n\nshared: libbbcim.so.1.0\n\nlibbbcim.so.1.0: *.c include/*.h\n\t$(MAKE) libbbcim.o.shared\n\nlibbbcim.a: *.c include/*.h\n\t$(MAKE) libbbcim.o.static\n\nlibbbcim.o.shared: *.c include/*.h\n\t$(CC) $(ALL_CFLAGS) -shared -fPIC -o libbbcim.o -c bbcimlib.c\n\t$(CC) -O2 -Wl,-shared,-soname,libbbcim.so.1.0 -o libbbcim.so.1.0 libbbcim.o\n\tln -s libbbcim.so.1.0 libbbcim.so\n\nlibbbcim.o.static: bbcimlib.c include/bbcim.h\n\t$(CC) $(ALL_CFLAGS) -o libbbcim.o -c bbcimlib.c\n\tar cru libbbcim.a libbbcim.o\n\tranlib libbbcim.a\n\n\nclean:\n\trm -f libbbcim.so.1.0 libbbcim.so libbbcim.a *.o *~ */*~\n\n\ninstall: all\n\n#install:\tstatic\n\n\ninstall.lib: libbbcim.so.1.0\n\tcp include/bbcim.h /usr/local/include\n\tcp -f libbbcim.so.1.0 /usr/local/lib\n\trm -f /usr/local/lib/libbbcim.so\n\tln -s /usr/local/lib/libbbcim.so.1.0 /usr/local/lib/libbbcim.so\n#\tldconfig -m /usr/local/lib/\t# merge new entries\n\n#install.shared: shared\n#\tcp bbcim /usr/local/bin\n\n\nuninstall.lib:\n\trm -f /usr/local/lib/libbbcim.so* /usr/local/include/bbcim.h\n\n\n#Depend\nlibbbcim.o\t: *.c *.h\n\n# // Compile C files to object files.\n.c.o:\n\t$(CC) $(ALL_CFLAGS) -c -o $@ $<\n\n# EOF\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/NOT_USED/d_write_cat.c",
    "content": "/* BBCIM: Acorn BBC computer diskimage manipulation\n *\n * d_write_cat.c:\n * ENGLISH:  write catalogue entry in diskimage\n *\n * Copyright (C) W.H.Scholten 1996,1997\n */\n\n\nint bbcim_d_write_cat_entry(struct bbcim_diskimage *image, struct bbcim_file *file, struct bbcim_disk_data *disk_data) {\n\tFILE *fpdisk;\n\tunsigned char filebyte,H;\n//\tchar inf_file[100];\n\tchar bbcfile_naam[15];\n\tunsigned char afiles = 0;\n//\tstatic int  addfiles;\n\tunsigned int loadaddress, execaddress;\n\tint  i;\n\tint startsector, length;\n\tunsigned char eellddss, locked;\n//\tunsigned int  sectorsondisk;\n\n\n\t/* file pointer struct in diskimage struct ?? */\n\tint  tracksize = image->sectors_per_track*image->bytes_per_sector;\n//\tint  sides = image->sides;\n\n\n\tif (!(fpdisk = fopen(image->archive_name, \"wb\")))\n\t\treturn BBCIM_ERROR__OPEN_FAILED;\n\n\n\t/* XXX locked: init MISSING */\n\n\t/* Put name in diskimage */\n\tfilebyte = bbcfile_naam[0]+(locked << 7);\n\tfseek(fpdisk, 15L, SEEK_SET);\n\tfwrite(&filebyte, 1, 1, fpdisk);\n\n\tfseek(fpdisk, 8L, SEEK_SET);\n\tfor(i=0; i<7; i++) {\n\t\tfilebyte = bbcfile_naam[i+2];\n\t\tif (filebyte == 0) {\n\t\t\tfilebyte = ' '; bbcfile_naam[i+3] = 0;\n\t\t}\n\t\tfwrite(&filebyte, 1, 1, fpdisk);\n\t}\n\n\tafiles += 8;\n\tfseek(fpdisk, 256+5L, SEEK_SET);\n\tfwrite(&afiles, 1, 1, fpdisk);\n\n\n\n\n\t/* load/exec  adressen + lengte schrijven */\n\tfseek(fpdisk, 256L+14L+tracksize*image->sides, SEEK_SET);\n\n\t/* XXX UNINITIALISED: */\n\t/*   startsector loadaddress execaddress length */\n\n\n\teellddss = ((startsector >> 8) & 0x3)+((loadaddress >> 14) & 0xC);\n\teellddss += ((execaddress >> 10) & 0xC0);\n\teellddss += ((length >> 12) & 0x30);\n\tfwrite(&eellddss, 1, 1, fpdisk);\n\n\t/* STARTSECTOR */\n\tfilebyte = startsector & 0xFF;\n\tfwrite(&filebyte, 1, 1, fpdisk);\n\n\t/* LOADADDRESS */\n\tfseek(fpdisk, 256L+8L, SEEK_SET);\n\tfilebyte = loadaddress & 0xFF;\n\tH = (loadaddress >> 8) & 0xFF;\n\tfwrite(&filebyte, 1, 1, fpdisk);\n\tfwrite(&H, 1, 1, fpdisk);\n\n\t/* EXECADDRESS */\n\tfilebyte = execaddress & 0xFF;\n\tH = (execaddress >> 8) & 0xFF;\n\tfwrite(&filebyte, 1, 1, fpdisk);\n\tfwrite(&H, 1, 1, fpdisk);\n\n\t/* FILELENGTE */\n\tfilebyte = length & 0xFF;\n\tH = (length >> 8) & 0xFF;\n\tfwrite(&filebyte, 1, 1, fpdisk);\n\tfwrite(&H, 1, 1, fpdisk);\n\n\tfclose(fpdisk);\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/_config.h",
    "content": "/* Libbcim CONFIGURATION\n */\n\n#ifndef _bbcim__config_h\n#define _bbcim__config_h\n\n\n/*************** CONFIGURATION ************************/\n/* Comment out for english messages from the library */\n//#define LANGUAGE_DUTCH\n\n/*************** END OF CONFIGURATION *****************/\n\n\n/* Characters to be replaced in filenames for BBC filename -> host filename\n * which could give problems, such as '/','\\'. Add more if needed for you OS.\n * The following is for unix:\n */\nchar bbcim_filename_chars_bad[]     = { '\\\\', '/', ':', '*', '?', '\\\"', '<', '>', '|', '`', '\\'', ' ' };\nchar bbcim_filename_chars_replace[] = { '_' , '_', '_', '_', '_', '_' , '_', '_', '_', '_', '_' , '_' };\n\n\n#ifdef LANGUAGE_DUTCH\n#  define TEKST_NL(x) x\n#  define TEKST_ENG(x)\n#else\n#  define TEKST_NL(x)\n#  define TEKST_ENG(x) x\n#endif\n\n#endif /* _bbcim__config_h */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/bbcim_internal.h",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * bbcim.h (bbcim; bbc diskbeeld manipulatie): Functies.\n *\n * Copyright (C) W.H. Scholten 1996, 1997, 1999, 2000, 2003\n */\n\n#ifndef _BBCIM__bbcim_internal_h\n#define _BBCIM__bbcim_internal_h\n\n#ifdef DEBUG\n#  define DEB(x) x\n#else\n#  define DEB(x)\n#endif\n\n/* Multi-byte reading functions: */\nint bbcim_read4lsb(unsigned char *data);\nint bbcim_read3lsb(unsigned char *data);\nint bbcim_read2lsb(unsigned char *data);\n\n\n/* Byte offsets in disk image for Acorn DFS */\n#define OFFSET__DFS_title0_7     0\n#define OFFSET__DFS_title8_11    256\n#define OFFSET__DFS_accessct    (256+0x04)\n#define OFFSET__DFS_entries     (256+5)\n#define OFFSET__DFS_bootsec     (256+6)\n#define OFFSET__DFS_sectondiskL (256+0x07)\n\n/* The next list of offsets are +n*8 for each file */\n#define OFFSET__DFS_filename   8\n#define OFFSET__DFS_directory  15\n#define OFFSET__DFS_loadaddrL (256+8)\n#define OFFSET__DFS_loadaddrM (256+9)\n#define OFFSET__DFS_execaddrL (256+0x0a)\n#define OFFSET__DFS_execaddrM (256+0x0b)\n#define OFFSET__DFS_lengthL   (256+0x0c)\n#define OFFSET__DFS_lengthM   (256+0x0d)\n#define OFFSET__DFS_eellddss  (256+0x0e)\n#define OFFSET__DFS_startsecL (256+0x0f)\n\n\n#endif /* _BBCIM__bbcim_internal_h */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/bbcimlib.c",
    "content": "/* BBCIM: bbcimlib.c: bbc disk image manipulation functies.\n\n   Copyright (C) W.H. Scholten 1996, 1997, 1999, 2000, 2001, 2003\n  \n   Permission to use, copy, modify, distribute, and sell this software\n   and its documentation for any purpose is hereby granted without fee,\n   provided that the above copyright notice appear in all copies and\n   that both that copyright notice and this permission notice appear in\n   supporting documentation, and that the name of the copyright holder\n   not be used in advertising or publicity pertaining to distribution\n   of the software without specific, written prior permission. The\n   copyright holder makes no representations about the suitability of\n   this software for any purpose. It is provided \"as is\" without express\n   or implied warranty.\n  \n   THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n   SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n   FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n   SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n   RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n   CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n  \n  \n   Send comments and bug-reports to \n  \n      swhs-web@xs4all.nl\n  \n  \n*/\n\n\n/*__________________INCLUDES___________________*/\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"_config.h\"\n\n/* mkdir etc.: */\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <unistd.h>\n\n\n//#include <bbcim_types.h>\n#include <bbcim.h>\n#include \"bbcim_internal.h\"\n\nint   bbcim_errno = 0;\nchar *bbcim_error = NULL; /* points to the last error */\n\nint   bbcim_debug = 0;\n\n#include \"overschrijf.c\"\n\n#include \"utils.c\"\n\n//#include \"catalogue_to_inf.c\"\n//#include \"archive_crc_check.c\"\n//#include \"archive_cleanup.c\"\n\n#include \"_bbc_crc.c\"\n#include \"_bbc_filenames.c\"\n\n#include \"archive_format/_bbc_archive_write_attributes.c\"\n#include \"archive_format/_bbc_archive_read_attributes.c\"\n\n\n#include \"disk_convert_ddos_to_dfs.c\"\n\n#include \"disk_catalogue_extract.c\"\n#include \"disk_add_file.c\"\n#include \"disk_delete_file.c\"\n#include \"disk_expand.c\"\n#include \"disk_minimise.c\"\n#include \"disk_set_boot.c\"\n#include \"disk_new.c\"\n\n#include \"disk_combine_ss.c\"\n#include \"disk_split_ds.c\"\n\n#include \"disk_convert_w62_to_dfs.c\"\n\n#include \"disk_id.c\"\n\n#include \"error.c\"\n\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_add_file.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_add_file.c:\n * NEDERLANDS: voeg bestanden aan Acorn DFS diskbeeld toe.\n * ENGLISH:\n *\n * Copyright (C) W.H.Scholten 1996,1997, 2003\n */\n\n\n/* Prototypes */\nint d_add_file(struct bbc_archive__diskimage *image, int side, struct bbc_archive__file *beeb_file, int flags, int verbose);\n\n\n\n/* voor Acorn DFS */\nint bbcim_disk_add_file(struct bbc_archive__diskimage *image, int side, char *hostfilename, struct bbc_archive__file *beeb_file, int flags, int verbose) {\n\tint st;\n\tFILE *fpadd;\n\tstruct bbc_archive__file_attr *attr = beeb_file->attr;\n\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tif (side < 0 || (side >= image->attr->sides))\n\t\treturn bbcim_print_error_bad_side(\"bbcim_disk_add_file\", image, side, verbose);\n\n\tif (image->attr->type != BBC_ARCHIVE__DFS_DISK)\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_disk_add_file\", image, verbose);\n\n\n\t/* .inf bestanden overslaan: */\n\tif (bbc_archive__is_inf_file(image->filename)) goto leave_add_file;\n\n\tst = bbc_archive__read_file_attributes(hostfilename, beeb_file->attr, verbose);\n\n//\tprintf(\"bbcim_errno=%d\\n\", bbcim_errno);\n//\tif (bbcim_errno) {\n\tif (st) {\n\t\tif (!(flags & BBCIM_DISK_INFO)) {\n\t\t\tattr->load_address = 0;\n\t\t\tattr->exec_address = 0;\n\t\t\tattr->name = malloc(strlen(hostfilename)+1+2);\n\t\t\tif (attr->name == NULL) {\n\t\t\t\tfprintf(stderr, \"Out of memory\\n\");\n\t\t\t\texit(1);\n\t\t\t}\n\t\t\tif (strlen(hostfilename) >= 2 && hostfilename[1] == '.') {\n\t\t\t\tstrncpy(attr->name, hostfilename, 9);\n\t\t\t\tattr->name[9] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstrcpy(attr->name, \"$.\"); strncat(attr->name, hostfilename, 7);\n\t\t\t\tattr->name[9] = 0;\n\t\t\t}\n\t\t}\n\t\telse {\n\n\n\n\t\t\tif (verbose) {\n\t\t\t\tfprintf(stderr, \n\t\t\t\t\t\tTEKST_NL(\"Info bestand voor %s kan niet geopend worden, sla over\\n\")\n\t\t\t\t\t\tTEKST_ENG(\"Info file for %s cannot be opened, skipping file\\n\")\n\t\t\t\t\t\t, hostfilename);\n\t\t\t}\n\t\t\tgoto leave_add_file;\n\t\t}\n\t}\n\n\t/* Moet nu inladen in beeb_file.data OF bbcfile uitbreiden met FILE *fpdata */\n\tfpadd = fopen(hostfilename, \"rb\");\n\tif (fpadd == NULL) {\n\t\tTEKST_NL(fprintf(stderr, \"Archief bestand %s kan niet geopend worden\\n\", hostfilename));\n\t\tTEKST_ENG(fprintf(stderr, \"Archive file %s cannot be opened\\n\", hostfilename));\n\t\tgoto leave_add_file;\n\t}\n\n\tfseek(fpadd, 0L, SEEK_END);\n\tattr->length = ftell(fpadd);\n\n//\t    beeb_file->data = malloc(length);\n/* Temp: */\n//\t\tbeeb_file->data = NULL;\n\tbeeb_file->filename = hostfilename;\n\n//\t    fread(beeb_file->data, beeb_file->length, 1, fpadd);\n\tfclose(fpadd);\n\n\td_add_file(image, side, beeb_file, flags, verbose);\n//\t    free(beeb_file->data);\n\n  leave_add_file:\n\n\treturn 0;\n}\n\n\n\n\nint d_add_file(struct bbc_archive__diskimage *image, int side, struct bbc_archive__file *beeb_file, int flags, int verbose) {\n\tFILE *fpdisk, *fpadd;\n\tunsigned char filebyte,H;\n\tchar inf_file[100];\n//    char bbcfile_naam[15];\n\tunsigned char afiles = 0;\n//    static int  addfiles;\n\tunsigned int loadaddress, execaddress;\n\tint  i;\n\tint startsector, length, j;\n\tunsigned char eellddss, locked;\n\tunsigned int  sectorsondisk;\n\tchar *disk;\n\tstruct bbcim_disk_data disk_data;\n\tstruct bbc_archive__file_attr *attr = beeb_file->attr;\n\n\tloadaddress = attr->load_address;\n\texecaddress = attr->exec_address;\n\n//\tif (beeb_file->data == NULL) {\n\t{\n//\t\tif (bbcim_debug) printf(\"add open\\n\");\n\t\tfpadd = fopen(beeb_file->filename, \"rb\");\n\t}\n\tif (bbcim_debug) printf(\"add 2\\n\");\n\n\tif (bbcim_debug) printf(\"file length=%d\\n\", attr->length);\n\n\tdisk = image->filename;\n\n\tfpdisk = fopen(disk, \"rb+\");\n\tif (bbcim_debug) printf(\"disk=%s\\n\", disk);\n\t/* number of files (afiles = 8*'real number'): */\n\tbbcim_disk_read(image, fpdisk, 256L+5L, side, &afiles);\n\n\n\tif (afiles == 31*8) {\n\t\tbbcim_error = \n\t\t\tTEKST_NL(\"Er zijn al 31 bestanden in het diskbeeld\")\n\t\t\tTEKST_ENG(\"There are already 31 files in the disk image\");\n\t\tif (verbose) fprintf(stderr, \"%s\\n\", bbcim_error);\n\t\tbbcim_errno = BBCIM_ERROR__DISK_FULL;\n\t\treturn bbcim_errno;\n\t}\n\n\n\n\t/* GET PREVIOUS STARTSECTOR AND FILE LENGTH */\n\tif (afiles) {\n\t\tbbcim_disk_read(image, fpdisk, 256L+14L, side, &eellddss);\n\t\t/* STARTSECTOR */\n\t\tbbcim_disk_read(image, fpdisk, 256L+15L, side, &filebyte);\n\n\t\tstartsector = filebyte + (int)(eellddss & 0x3)*256L;\n\n\t\t/* FILELENGTE */\n\t\tbbcim_disk_read(image, fpdisk, 256L+12L, side, &filebyte);\n\t\tbbcim_disk_read(image, fpdisk, 256L+13L, side, &H);\n\n\t\tlength = H*256L+filebyte+(eellddss & 0x30)*16L*256L;\n\n\t\tstartsector += (length + 255) >> 8;\n\t}\n\telse startsector = 2;\n\tif (bbcim_debug) printf(\"start sector=%d\\n\", startsector);\n\n\t/* Now test if the files stay within sectors-on-disk: */\n\tbbcim_disk_read(image, fpdisk, 256L+6L, side, &filebyte);\n\n\tH = filebyte & 3;\n\tbbcim_disk_read(image, fpdisk, 256L+12L, side, &filebyte);\n\n\tsectorsondisk = filebyte + H*256L;\n\n\tfseek(fpadd, 0L, SEEK_END);\n\tlength = ftell(fpadd);\n\tif (bbcim_debug) printf(\"length=%d\\n\", length);\n\tif (bbcim_debug) printf(\"sectorsondisk=%d\\n\", sectorsondisk);\n\n\tif (startsector + ((length+255) >> 8) > sectorsondisk) {\n\t\tfclose(fpadd);\n\t\tTEKST_NL(fprintf(stderr, \"Niet genoeg ruimte in het diskbeeld\\n\"));\n\t\tTEKST_ENG(fprintf(stderr, \"Not enough space in the disk image\\n\"));\n\t\tbbcim_errno = BBCIM_ERROR__DISK_FULL;\n\t\treturn bbcim_errno;\n\t}\n\n\n\t/* Copy the file: */\n\tfor (j=0; j<(((length+255) >> 8)*256); j++) {\n\t\tfseek(fpadd, j, SEEK_SET);\n\t\tif (!fread(&filebyte, 1, 1, fpadd)) filebyte = 0;\n\n\t\tbbcim_disk_write(image, fpdisk, startsector*256L+j, side, &filebyte);\n\t}\n\n\tfclose(fpadd);\n\n\tif (flags & BBCIM_REMOVE_FILE) {\n\t\tremove(beeb_file->filename);\n\t\tremove(inf_file);\n\t}\n\n\t/* Add filename to catalogue */\n\t/* First move the catalogue entries (shift them 8 bytes) */\n\tfor (j=255-8; j>7; j--) {\n\t\tbbcim_disk_read(image, fpdisk, j, side, &filebyte);\n\t\tbbcim_disk_write(image, fpdisk, j+8L, side, &filebyte);\n\n\t\tbbcim_disk_read(image, fpdisk, j+256L, side, &filebyte);\n\t\tbbcim_disk_write(image, fpdisk, j+8L+256L, side, &filebyte);\n\t}\n\n\n\n\t/*tmp: */\n\tlocked = 0;\n\n\tfilebyte = attr->name[0] + (locked << 7);\n\tbbcim_disk_write(image, fpdisk, 15L, side, &filebyte);\n\n\tfor(i=0; i<7; i++) {\n\t\tfilebyte = attr->name[i+2];\n\t\tif (filebyte == 0) {\n\t\t\tfilebyte = ' '; attr->name[i+3] = 0;\n\t\t}\n\t\tbbcim_disk_write(image, fpdisk, 8L+i, side, &filebyte);\n\t}\n\n\n\t/* OLD */\n\tafiles += 8;\n\tbbcim_disk_write(image, fpdisk, 256L+5L, side, &afiles);\n\n\n/* MISSING INIT'S : */\n/* load address == ?? */\n/* exec address == ?? */\n\t/* load/exec  adressen + lengte schrijven */\n\teellddss  = ((startsector >>  8) & 0x03) + ((loadaddress >> 14) & 0x0C);\n\teellddss += ((execaddress >> 10) & 0xC0);\n\teellddss += ((length >> 12) & 0x30);\n\tbbcim_disk_write(image, fpdisk, 256L+14L, side, &eellddss);\n\n\n\t/* Start sector */\n\tfilebyte = startsector & 0xFF;\n\tbbcim_disk_write(image, fpdisk, 256L+15L, side, &filebyte);\n\n\t/* Load address */\n\tfilebyte = loadaddress & 0xFF;\n\tH = (loadaddress >> 8) & 0xFF;\n\tbbcim_disk_write(image, fpdisk, 256L+8L, side, &filebyte);\n\tbbcim_disk_write(image, fpdisk, 256L+9L, side, &H);\n\n\t/* Exec address */\n\tfilebyte = execaddress & 0xFF;\n\tH = (execaddress >> 8) & 0xFF;\n\tbbcim_disk_write(image, fpdisk, 256L+10L, side, &filebyte);\n\tbbcim_disk_write(image, fpdisk, 256L+11L, side, &H);\n\n\t/* File length */\n\tfilebyte = length & 0xFF;\n\tH = (length >> 8) & 0xFF;\n\tbbcim_disk_write(image, fpdisk, 256L+12L, side, &filebyte);\n\tbbcim_disk_write(image, fpdisk, 256L+13L, side, &H);\n\n\tfclose(fpdisk);\n\n\n\tdisk_data.file_address = 0; /* Change */\n\tdisk_data.cat_address = 2*256;\n\n\t/* d_seek_file(image, file, disk_data); */\n\n\t/* d_write_catalogue_entry(image, beeb_file, &disk_data);*/\n\n\n\tif (verbose) {\n\t\tTEKST_NL(printf(\"bestand %s toegevoegd\\n\", beeb_file->filename));\n\t\tTEKST_ENG(printf(\"added file %s\\n\", beeb_file->filename));\n\t}\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_catalogue_extract.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_catalogue_extract.c:\n * NEDERLANDS: toon catalogus van bestanden etc in diskbeeld (DFS/ADFS).\n * ENGLISH:    Show catalogue & extract files & calculate CRC's (Acorn DFS)\n *\n * Copyright (C) W.H.Scholten 1996,1997,1999,2000,2001,2003,2004, 2009\n */\n\n\n\nint  _bbcim__disk_dfscat_extract_crc(struct bbc_archive__diskimage *image, int side, struct bbc_archive__file* beeb_file, int flags, int verbose);\n\n\n\nint  bbcim_disk_cat_extract_crc (struct bbc_archive__diskimage *image, int side, struct bbc_archive__file* beeb_file, int flags, int verbose) {\n\tint i;\n\n\n//\tstruct bbc_archive__file_attr *attr;\n//\tif (beeb_file) attr = beeb_file->attr;\n\n\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tif (side < 0 || (side >= image->attr->sides))\n\t\treturn bbcim_print_error_bad_side(\"bbcim_cat_extract_crc\", image, side, verbose);\n\n\tif (bbcim_debug) { printf(\"Cat/extr flags:\\n\"); for (i=0; i<16; i++) { if (flags & (1<<i)) printf(\"Flag %d\\n\", 1<<i); } }\n\n\tbbcim_errno = 0;\n\n\tif (verbose && (flags & BBCIM_EXTRACT_FILES)) flags |= BBCIM_SHOW_FILES;\n\n\tif (image->attr->type == BBC_ARCHIVE__DFS_DISK) {\n\t\t/* int  st =*/ _bbcim__disk_dfscat_extract_crc(image, side, beeb_file, flags, verbose);\n\t}\n\telse if (image->attr->type == BBC_ARCHIVE__ADFS_DISK) {\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_cat_extract_crc\", image, verbose);\n\t}\n\telse {\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_cat_extract_crc\", image, verbose);\n\t}\n\n\treturn bbcim_errno;\n}\n\n#include \"disk_catalogue_extract__dfs.c\"\n\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_catalogue_extract__dfs.c",
    "content": "int  _bbcim__disk_dfscat_extract_crc(struct bbc_archive__diskimage *image, int side, struct bbc_archive__file* beeb_file, int flags, int verbose) {\n\tFILE *fpdisk = NULL;\n\tFILE *fpcat = NULL;\n\tFILE *fpextract = NULL;\n\tFILE *fpinf = NULL;\n//\tchar catalogus[256];\n\tchar extract[256];\n\tchar inf_file[256], basisnaam[256];\n\tchar bbcdisk_naam[15], bbcfile_naam[15];\n\tchar unix_bbcfile_naam[15];\n\tchar testnaam[15];\n\tchar *disk;\n\n\tunsigned char filebyte, H;\n\n\tint  filesizesum = 0;\n\tint  extr_list = False; /* list of files given ? */\n\tint  extr_list_no, antwoord;\n\n\tint  i, k;\n\tint  rfiles, bootoption;\n\tunsigned char files = 0;\n\tunsigned int sectorsondisk;\n\tint  file;\n\tint  locked;\n\tunsigned char eellddss; \n\n\tint  startsector;\n\tunsigned int loadaddress, execaddress, length;\n\n\tunsigned int crc;\n\tstatic int find_file_infoaddr; /* for BBCIM_GET_ATTRIBUTES */\n\tmode_t dir_mode;\n\n\n\tif (flags & BBCIM_NEW_DISK) {\n\t\tfind_file_infoaddr = -1;\n\t\treturn 0;\n\t}\n\tfind_file_infoaddr = -1; //DEBUG\n\n\tdisk = image->filename;\n\n\tif (bbcim_debug) printf(\"DFS disk type (%s)\\n\", disk);\n\t/* -- DFS diskbeelden -- */\n\t/* Naming scheme: file 'a.f' in disk image 'disk' (i.e. DFS directory 'a', DFS file name 'f') becomes:\n\t * -ed         disk.d/a.f\n\t * -ed@        disk.d/a.f  -> except if a='$' then the name becomes disk.d/f\n\t * -e@         disk.a.f  -> except if a='$' then the name becomes disk.f\n\t * -e          disk.a.f\n\t * -es         a.f\n\t * -es@        af  -> except if a='$' then the name becomes f\n\t */\n\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\tif (bbcim_debug) printf(\"DFS sanity ok\\n\");\n\n\tstrcpy(basisnaam, disk);\n//OLD This was useful for DOS, e.g. disk file.bbc gives a directory: mydisk/\n//OLD\tbasisnaam[strcspn(disk, \".\")] = 0;\n\n//\t\tstrcpy(catalogus, basisnaam);\n//\t\tstrcat(catalogus, \".cat\");\n\n\tfpdisk = fopen(disk, \"rb\");\n\n\n\tif (flags & BBCIM_EXTRACT_DIR) {\n\t\tif (image->attr->sides == 2) {\n\t\t\tif (side == 0)\n\t\t\t\tstrcat(basisnaam, \".0\");\n\t\t\telse\n\t\t\t\tstrcat(basisnaam, \".1\");\n\t\t}\n\t\tstrcat(basisnaam, \".d\");\n\n\t\tbbc_rename_sequential(basisnaam); /* in case a file (dir too?)  already exists named basisnaam */\n\n\t\tdir_mode = 0777; /* CHANGE */\n\t\tmkdir(basisnaam, dir_mode);\n\t}\n\n\n\t/* What is the disk title? (for cat, crc, extract) */\n\tfor (i=0; i<8; i++) {\n\t\tif (bbcim_disk_read(image, fpdisk, i, side, &filebyte)) return -1;\n\t\tbbcdisk_naam[i] = filebyte;\n\t\tif (filebyte == 0) break;\n\t}\n\tfor (i=0; i<4; i++) {\n\t\tif (bbcim_disk_read(image, fpdisk, 256L+i, side, &filebyte)) return -1;\n\t\tbbcdisk_naam[i+8] = filebyte;\n\t\tif (filebyte == 0) break;\n\t}\n\tbbcdisk_naam[12] = 0; /* terminate just in case the title is the full 12 chars */\n\n\n\tif (bbcim_disk_read(image, fpdisk, 256L+5L, side, &files)) return -1;\n\n\trfiles = files/8;\n//\t\textr_list = ((flags & BBCIM_EXTRACT_FILES) && (args >0 ));\n\textr_list = (beeb_file != NULL);\n\tif (bbcim_debug) printf(\"extr_list=%d\\n\", extr_list);\n\n\tif (bbcim_disk_read(image, fpdisk, 256L+6L, side, &filebyte)) return -1;\n\n\tbootoption = filebyte >> 4;\n\tH = filebyte & 3;\n\tif (bbcim_disk_read(image, fpdisk, 256L+7L, side, &filebyte)) return -1;\n\n\tsectorsondisk = filebyte+H*256L;\n\n\n//\t\tif ((flags & BBCIM_EXTRACT_FILES) && !extr_list)\n//\t\t\tfpcat = fopen(catalogus, \"w\");\n//\t\telse\n\tfpcat = stdout;\n\n\n//    if (flags & BBCIM_SHOW_FILES) goto skip_diskinfo;\n\n\tTEKST_NL(fprintf(fpcat, \"\\nDiskette :%s\", strlen(bbcdisk_naam) == 0 ? \"(geen naam)\" : bbcdisk_naam));\n\tTEKST_NL(fprintf(fpcat, \"\\n%d sectoren op de diskette\\n\", sectorsondisk));\n\tTEKST_NL(fprintf(fpcat, \"bootoptie: \"));\n\n\tTEKST_ENG(fprintf(fpcat, \"\\nDisk :%s\", strlen(bbcdisk_naam) == 0 ? \"(no name)\" : bbcdisk_naam));\n\tTEKST_ENG(fprintf(fpcat, \"\\n%d sectors on disk\\n\", sectorsondisk));\n\tTEKST_ENG(fprintf(fpcat, \"bootoption: \"));\n\n\tswitch(bootoption) {\n\tcase 0 :\n\t\tTEKST_NL(fprintf(fpcat, \"geen\"));\n\t\tTEKST_ENG(fprintf(fpcat, \"none\"));\n\t\tbreak;\n\n\tcase 1 :\n\t\tfprintf(fpcat, \"*LOAD !BOOT\");\n\t\tbreak;\n\n\tcase 2 :\n\t\tfprintf(fpcat, \"*RUN !BOOT\");\n\t\tbreak;\n\n\tcase 3 :\n\t\tfprintf(fpcat, \"*EXEC !BOOT\");\n\t\tbreak;\n\t}\n\tfprintf(fpcat, \"\\n\");\n\n\tTEKST_NL(fprintf(fpcat, \"Bestand    Laad  Start  Lengte Toegang startsector\\n\"));\n\tTEKST_ENG(fprintf(fpcat, \"File       Load   Exec  Length Access  startsector\\n\"));\n\n\n//\t  skip_diskinfo:\n\n\t/* Hoofdlus: alle bestanden opzoeken */\n\tif (files > 0) {\n\t\textr_list_no = 0;\n\n\t\tfor (file=0; file<files; file +=8) {\n\t\t\tstrcpy(extract, basisnaam);\n\t\t\tif (flags & BBCIM_EXTRACT_DIR) strcat(extract, \"/\"); else strcat(extract, \".\");\n\t\t\tif (flags & BBCIM_SHORT_NAME) extract[0] = 0;\n\n\t\t\tif (bbcim_disk_read(image, fpdisk, file+15L, side, &filebyte)) return -1;\n\t\t\tlocked = filebyte >> 7;\n\n\t\t\tbbcfile_naam[0] = (filebyte & 0x7F);\n\t\t\tbbcfile_naam[1] = '.';\n\t\t\tfor (i=0; i<7; i++) {\n\t\t\t\tif (bbcim_disk_read(image, fpdisk, file+8L+i, side, &filebyte)) return -1;\n\t\t\t\tbbcfile_naam[i+2] = filebyte;\n\t\t\t}\n\t\t\tbbcfile_naam[9] = 0;\n\n\t\t\t/* spaties aan het einde van BBC naam weghalen: geeft anders\n\t\t\t * bestands namen met spaties (in unix). */\n\t\t\tfor (i=8; i>0 && (bbcfile_naam[i] == ' '); i--);\n\t\t\tbbcfile_naam[i+1] = 0;\n\n\n\t\t\t/* If file list given, see if name is in disk image */\n\t\t\tif (extr_list) {\n\t\t\t\tif (beeb_file->attr->name[1]=='.')\n\t\t\t\t\tstrncpy(testnaam, beeb_file->attr->name, 9);\n\t\t\t\telse {\n\t\t\t\t\ttestnaam[0] = '$'; testnaam[1] = '.';\n\t\t\t\t\tstrncpy(testnaam+2, beeb_file->attr->name, 7);\n\t\t\t\t}\n\t\t\t\ttestnaam[9] = 0;\n\t\t\t\t//printf(\"DEBUG: testnaam %s\\n\", testnaam);\n\t\t\t\tif (strcmp(bbcfile_naam, testnaam)) continue; /* not found yet */\n\n\t\t\t\textr_list_no++;\n\t\t\t}\n\n\n\t\t\t/* load/exec  adressen + lengte bepalen */\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+14L, side, &eellddss)) return -1;\n\n\n\t\t\t/* STARTSECTOR */\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+15L, side, &filebyte)) return -1;\n\t\t\tstartsector = filebyte+(eellddss & 3)*256L;\n\n\n\t\t\t/* LOADADDRESS */\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+8L, side, &filebyte)) return -1;\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+9L, side, &H)) return -1;\n\n\t\t\tloadaddress = H*256L+filebyte+(eellddss & 0x0C)*16384L;\n\t\t\tif (loadaddress & 0x30000) loadaddress |= 0xFF0000;\n\n\t\t\t/* EXECADDRESS */\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+10L, side, &filebyte)) return -1;\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+11L, side, &H)) return -1;\n\n\t\t\texecaddress = H*256L+filebyte+(eellddss & 0xC0)*4L*256L;\n\t\t\tif (execaddress & 0x30000) execaddress |= 0xFF0000;\n\n\t\t\t/* FILELENGTE */\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+12L, side, &filebyte)) return -1;\n\t\t\tif (bbcim_disk_read(image, fpdisk, 256L+file+13L, side, &H)) return -1;\n\n\t\t\tlength = H*256L+filebyte+(eellddss & 0x30)*16L*256L;\n\n\t\t\tfilesizesum += length;\n\n\t\t\tif (flags & BBCIM_GET_ATTRIBUTES) {\n\t\t\t\tif (file > find_file_infoaddr) {\n\t\t\t\t\t/* new file found */\n\t\t\t\t\tstrcpy(beeb_file->attr->name, bbcfile_naam);\n\t\t\t\t\tbeeb_file->attr->load_address = loadaddress;\n\t\t\t\t\tbeeb_file->attr->exec_address = execaddress;\n\t\t\t\t\tbeeb_file->attr->length = length;\n\t\t\t\t\tbeeb_file->attr->attributes = locked;\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (flags & BBCIM_LOAD_FILE) {\n\t\t\t\t//fseek(fpdisk, startsector*256, SEEK_SET);\n\t\t\t\t//fread(beeb_file->data, length, 1, fpdisk);\n\n\t\t\t\tfprintf(stderr, \"LOAD file not implemented\\n\");\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t/* Uitvoer van deze gegevens naar catalogus */\n\t\t\tif (flags & BBCIM_SHOW_FILES) {\n\t\t\t\tfprintf(fpcat, \"%-9s %6X %6X %6X\", bbcfile_naam, loadaddress, execaddress, length);\n\t\t\t\tif (locked) fprintf(fpcat, \" Locked\");\n\t\t\t\telse        fprintf(fpcat, \"       \"); /* To line up for CRC */\n\t\t\t}\n\n\t\t\tstrcpy(unix_bbcfile_naam, bbcfile_naam);\n\t\t\tbbc_replace_bad_chars(unix_bbcfile_naam);\n//\t\t\t\tif (bbcim_debug) printf(\"flags=0x%x\\n\", flags);\n\t\t\tif (!(flags & (BBCIM__NAME__KEEP_ROOT_DIR | BBCIM__NAME__KEEP_NONROOT_DIR)))\n\t\t\t\tbbcim_reduce_bbcname__no_dir(extract+strlen(extract), unix_bbcfile_naam);\n\t\t\telse if (flags & BBCIM__NAME__KEEP_ROOT_DIR)\n\t\t\t\tbbcim_reduce_bbcname__no_rootdir(extract+strlen(extract), unix_bbcfile_naam);\n\t\t\telse {\n\t\t\t\tstrcpy(extract+strlen(extract), unix_bbcfile_naam);\n\t\t\t}\n\n\n\t\t\tif (flags & BBCIM_EXTRACT_FILES) {\n\t\t\t\t/* Name check: does it already exist? */\n #warning \"Remove overwrite question from the library?\"\n\t\t\t\tchar nieuwe_naam[55];\n\n\t\t\t\tstrcpy(nieuwe_naam, extract);\n\t\t\t\tif ((fpextract = fopen(extract, \"rb\")) != NULL) {\n\t\t\t\t\tfclose(fpextract);\n\t\t\t\t\tantwoord = bbcim_overschrijf_vraag(extract, nieuwe_naam);\n\n\t\t\t\t\tswitch(antwoord) {\n\t\t\t\t\tcase BBCIM_OVERSCHRIJVEN:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BBCIM_HERNOEM_NIEUW:\n\t\t\t\t\t\tstrcpy(extract, nieuwe_naam); break;\n\t\t\t\t\tcase BBCIM_HERNOEM_BESTAAND:\n\t\t\t\t\t\trename(extract, nieuwe_naam);\n\t\t\t\t\t\t/* altijd ook info bestand hernoemen: */\n\t\t\t\t\t\tstrcpy(inf_file, extract);\n\t\t\t\t\t\tstrcat(inf_file, \".inf\");\n\n\t\t\t\t\t\tstrcat(nieuwe_naam, \".inf\");\n\n\t\t\t\t\t\trename(inf_file, nieuwe_naam);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase BBCIM_SLA_OVER:\n\t\t\t\t\t\tcontinue; /*to for*/\n\t\t\t\t\t} /*switch */\n\t\t\t\t}\n\t\t\t\t/* End name check */\n\n\n\t\t\t\tfpextract = fopen(extract, \"wb\");\n\n\t\t\t\tfor (i=0; i<length; i++) {\n\t\t\t\t\tif (bbcim_disk_read(image, fpdisk, startsector*256+i, side, &filebyte)) {\n\t\t\t\t\t\tif (feof(fpdisk)) {\n\t\t\t\t\t\t\treturn bbcim_print_error_diskimage_truncated(\"dfs cat/extr/crc\", image, NULL, verbose);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\tfwrite(&filebyte, 1, 1, fpextract);\n\t\t\t\t}\n\t\t\t\tfclose(fpextract);\n\t\t\t}\n\n\n\t\t\tif (flags & BBCIM_DISK_INFO) { /* should be INFO_FILE */ \n\t\t\t\tstrcpy(inf_file, extract);\n\t\t\t\tstrcat(inf_file, \".inf\");\n\t\t\t\tfpinf = fopen(inf_file, \"w\");\n\t\t\t\tfprintf(fpinf, \"%-9s\", bbcfile_naam);\n\t\t\t\t/* I no longer include the (superfluous) file length in\n\t\t\t\t * the .inf file. */\n\t\t\t\tfprintf(fpinf, \" %6X %6X\", loadaddress, execaddress);\n\t\t\t\tif (locked) fprintf(fpinf, \" Locked\");\n\t\t\t} /* N.B. info bestand wordt in crc deel gesloten */\n\n\n\t\t\tcrc = 0;\n\t\t\tif (flags & (BBCIM_CALC_CRC | BBCIM_DISK_INFO)) {\n\t\t\t\tfor (i=0; i<length; i++) {\n\t\t\t\t\tif (bbcim_disk_read(image, fpdisk, startsector*256+i, side, &filebyte)) return -1;\n\n\t\t\t\t\tif (feof(fpdisk)) {\n\t\t\t\t\t\treturn bbcim_print_error_diskimage_truncated(\"dfs cat/extr/crc\", image, NULL, verbose);\n\t\t\t\t\t}\n\n\t\t\t\t\tcrc ^= (filebyte << 8);\n\t\t\t\t\tfor (k=0; k<8; k++) {\n\t\t\t\t\t\tif (crc & 32768)\n\t\t\t\t\t\t\tcrc = (((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcrc = crc << 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (flags & BBCIM_DISK_INFO) {\n\t\t\t\t\tfprintf(fpinf, \" CRC=%04X\", crc); fclose(fpinf);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (extr_list)\n\t\t\t\tfprintf(fpcat, \" %s\\n\", extract);\n\t\t\telse\n\t\t\t\tfprintf(fpcat, \"   %4d\", (int) startsector);\n\n\t\t\tif (flags & BBCIM_CALC_CRC)\n\t\t\t\tfprintf(fpcat, \"       CRC= %04X\\n\", crc);\n\t\t\telse\n\t\t\t\tfprintf(fpcat, \"\\n\");\n\t\t}\n\n\t\t/* Show no of (extracted) files */\n\t\tif (extr_list) {\n\t\t\trfiles = extr_list_no;\n\t\t\tfprintf(fpcat, \n\t\t\t\tTEKST_NL(\"aantal bestanden: %d\\n\")\n\t\t\t\tTEKST_ENG(\"number of files: %d\\n\")\n\t\t\t\t, rfiles);\n\t\t}\n\t\tfprintf(fpcat, TEKST_NL(\"\\n%d bestand%s\\n\") TEKST_ENG(\"\\n%d file%s\\n\"), rfiles, (rfiles != 1) ? TEKST_NL(\"en\") TEKST_ENG(\"s\") : \"\");\n\n\n\t\tfclose(fpdisk);\n//OBSOLETE\t\tif ((flags & BBCIM_REMOVE_DISK) && !extr_list) remove(disk);\n\t}\n\tfprintf(fpcat,\n\t\t\tTEKST_NL(\"Totaal %d bytes\\n\")\n\t\t\tTEKST_ENG(\"Total %d bytes\\n\")\n\t\t\t, filesizesum);\n\n\tif (flags & BBCIM_LOAD_FILE) return BBCIM_ERROR__FILE_NOT_FOUND; /* Not found */\n\n\tif (fpcat != stdout) fclose(fpcat);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_combine_ss.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_combine_ss.c:\n *   NEDERLANDS: maak om-en-om diskbeeld, single/double density\n *   ENGLISH: interleave single sided disk images\n *\n * Copyright (C) W.H.Scholten 1996, 1997, 1999, 2000, 2001, 2003\n */\n\n\n#include <errno.h>\n\n\n/* Interleave 2 single sided disk images (with identical bytes/sector and\n * sectors/track) into a double sided disk image.\n */\nint bbcim_interleave_singlesided(struct bbc_archive__diskimage *image0, struct bbc_archive__diskimage *image1, char *interleaved, int verbose) {\n\tFILE *fp0, *fp1, *fp_inter;\n\tint  track;\n\tint  track_size;\n\n//\tstruct bbc_archive__diskimage image; /* interleaved image */\n\n\tif (bbcim_file_sanitycheck(image0->filename, verbose))\n\t\treturn bbcim_errno;\n\tif (bbcim_file_sanitycheck(image1->filename, verbose))\n\t\treturn bbcim_errno;\n\n\tif (image0->attr->sides != 1 || image1->attr->sides != 1) {\n\t\tbbcim_error = \"bbcim_interleave_singlesided: disk images must be single sided\";\n\t\tbbcim_errno = -1;\n\t\tif (verbose) fprintf(stderr, \"%s\\n\", bbcim_error);\n\t\treturn bbcim_errno;\n\t}\n\tif ((image0->attr->bytes_per_sector != image1->attr->bytes_per_sector) || (image0->attr->sectors_per_track != image1->attr->sectors_per_track)) {\n\t\tbbcim_error = \"bbcim_interleave_singlesided: disk images must have same no. of bytes/sectors\";\n\t\tbbcim_errno = -1;\n\t\tif (verbose) fprintf(stderr, \"%s\\n\", bbcim_error);\n\t\treturn bbcim_errno;\n\t}\n\n\tfp_inter = fopen(interleaved, \"wb\");\n\tif (fp_inter == NULL) return -1; //goto leave_bbcim_interleave_singlesided\n\n//\tif (bbcim_debug) printf(\"  %s + %s > %s\\n\\n\", image0->filename, image1->filename, interleaved);\n\n\n\tfp0 = fopen(image0->filename, \"rb\");\n\tfp1 = fopen(image1->filename, \"rb\");\n\n\tfseek(fp0, 0L, SEEK_SET);\n\tfseek(fp1, 0L, SEEK_SET);\n\tfseek(fp_inter, 0L, SEEK_SET);\n\n\ttrack_size = (image0->attr->bytes_per_sector * image0->attr->sectors_per_track);\n\n\tfor (track=0; track< image0->attr->tracks;track++) {\n\t\tint  i;\n\t\tunsigned char filebyte;\n\n\t\tfseek(fp0, 0L + track * track_size, SEEK_SET);\n\t\tfor (i=0; i<track_size; i++) {\n\t\t\tif (feof(fp0) && feof(fp1)) return 0;\n\n\t\t\tif (feof(fp0)) filebyte = 0; else fread(&filebyte, 1, 1, fp0);\n\t\t\tfwrite(&filebyte, 1, 1, fp_inter);\n\t\t}\n\t\tfseek(fp1, 0L + track * track_size, SEEK_SET);\n\t\tfor (i=0; i<track_size; i++) {\n\t\t\tif (feof(fp1) && feof(fp0)) return 0;\n\n\t\t\tif (feof(fp1)) filebyte = 0; else fread(&filebyte, 1, 1, fp1);\n\t\t\tfwrite(&filebyte, 1, 1, fp_inter);\n\t\t}\n\t}\n\tfclose(fp0);\n\tfclose(fp1);\n\tfclose(fp_inter);\n\n\t/* Now write a .dsk file */\n\tbbc_archive__write_disk_attributes2(\n\t\tinterleaved,\n\t\t2, image0->attr->tracks, image0->attr->sectors_per_track, image0->attr->bytes_per_sector, image0->attr->type, 1);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_convert_ddos_to_dfs.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_convert_ddos_to_dfs.c:\n * NEDERLANDS: Splitst DDOS diskdumps in aparte DFS diskbeelden\n *\n * Copyright (C) W.H. Scholten 1996, 1999, 2001, 2003\n */\n\nint bbcim_ddos_disk_error(int drive, int verbose);\n\nint bbcim_ddos_disk_error(int drive, int verbose) {\n\tbbcim_errno = BBCIM_ERROR__DISK_TRUNCATED;\n\tbbcim_error = TEKST_NL(\"onverwacht einde van DDOS diskbeeld\") TEKST_ENG(\"Unexpected end of DDOS disk image\");\n\tif (verbose) fprintf(stderr, TEKST_NL(\"%s bij ddos drive %c \")TEKST_ENG(\"%s at ddos drive %c \"), bbcim_error, drive);\n\n\treturn bbcim_errno;\n}\n\n\nint bbcim_ddos_to_dfs(struct bbc_archive__diskimage *image, int verbose) {\n\tchar  dfs_image_name[256];\n\tunsigned char filebyte = 0, H = 0;\n\tint  ddos_no;\n\tint  i;\n\tint  sectors_on_volume, length;\n\tint  starttrack, startsector;\n\tint  s;\n\tFILE *fp_dfs, *fp_ddos;\n\n\tstruct bbc_archive__diskimage image_dfs;\n\tstruct bbc_archive__diskimage_attr image_dfs_attr;\n\n\timage_dfs.attr = &image_dfs_attr;\n\timage_dfs_attr.type = BBC_ARCHIVE__DFS_DISK;\n\timage_dfs_attr.sides = 1;\n\timage_dfs_attr.tracks = 80;\n\timage_dfs_attr.sectors_per_track = 10;\n\timage_dfs_attr.bytes_per_sector = 256;\n\n\n\n\t//bbcim_errno = 0;\n\t/* not necessary as we call bbcim_diskimage_sanitycheck */\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tif (image->attr->type != BBC_ARCHIVE__DDOS_DISK) {\n\t\tbbcim_error = \"Not a DDOS disk image\";\n\t\tbbcim_errno = -1;\n\t\tif (verbose) fprintf(stderr, \"%s: %s\\n\", image->filename, bbcim_error);\n\t\treturn -1;\n\t}\n\n\n\tfp_ddos = fopen(image->filename, \"rb\");\n\n\t/* Alle kanten van de diskette: */\n#warning \"ddos_dfs: all returns must be removed, close files, next side, etc.\"\n\n\tfor (s=0; s < image->attr->sides; s++) {\n\t\t/* Alle catalogi */\n\t\tfor (ddos_no=0; ddos_no < 8; ddos_no++) {\n//OLD\t\t\tfseek(fp_ddos, 16*256L+8L+2*ddos_no, SEEK_SET);\n//OLD\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\tif (bbcim_disk_read(image, fp_ddos, 16*256L+8L+2*ddos_no, s, &filebyte)) return -1;\n\n\t\t\tstarttrack = filebyte;\n\n\t\t\tif (starttrack != 0) {\n\t\t\t\tstrcpy(dfs_image_name, image->filename);\n\t\t\t\tif (image->attr->sides > 1) sprintf(dfs_image_name+strlen(dfs_image_name), \".%d\", s);\n\n\n\t\t\t\tfilebyte = ddos_no+'A';\n\t\t\t\tdfs_image_name[ strlen(dfs_image_name) ] = filebyte;\n\n\t\t\t\t/* Nu een test of er uberhaupt iets op de ddos catalogus staat: */\n//OLD\t\t\t\tfseek(fp_ddos, (ddos_no*2+1)*256+5, SEEK_SET);\n//OLD\t\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\t\tif (bbcim_disk_read(image, fp_ddos, (ddos_no*2+1)*256+5, s, &filebyte)) return -1;\n\n\n\t\t\t\tif (filebyte == 0) {\n\t\t\t\t\tfilebyte = 'A'+ddos_no;\n\t\t\t\t\tif (verbose) printf(\" Catalogus %c is leeg\\n\", filebyte);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t/* (Dus geen lege diskbeelden) */\n\n\n\t\t\t\t/* Open the dfs image file. */\n\t\t\t\tfp_dfs = fopen(dfs_image_name, \"wb\");\n\t\t\t\tif (fp_dfs == NULL) return -1;\n\n//OLD\t\t\t\tfseek(fp_ddos, (ddos_no*2+1)*256+6, SEEK_SET);\n//OLD\t\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\t\tif (bbcim_disk_read(image, fp_ddos, (ddos_no*2+1)*256+6, s, &filebyte)) return -1;\n\n\n\t\t\t\tH = filebyte & 0x03;\n//OLD\t\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\t\tif (bbcim_disk_read(image, fp_ddos, (ddos_no*2+1)*256+7, s, &filebyte)) return -1;\n\n\t\t\t\tsectors_on_volume = filebyte + H*256;\n\n\t\t\t\tlength = sectors_on_volume*256;\n\n\t\t\t\t/* First sector & second sector: */\n//OLD\t\t\t\tfseek(fp_ddos, (ddos_no*2+0)*256, SEEK_SET);\n\t\t\t\tfor (i=0; i<512; i++) {\n//OLD\t\t\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\t\t\tif (bbcim_disk_read(image, fp_ddos, (ddos_no*2+0)*256+i, s, &filebyte)) {\n\t\t\t\t\t\tif (feof(fp_ddos)) {\n\t\t\t\t\t\t\treturn bbcim_ddos_disk_error(ddos_no + 'A', verbose);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n//OLDWRITE\t\t\t\t\tfwrite(&filebyte, 1, 1, fp_dfs);\n\t\t\t\t\tif (bbcim_disk_write(&image_dfs, fp_dfs, 256L+i*8+14+2+i, 0, &filebyte)) return -1;\n\t\t\t\t}\n\n\t\t\t\t/* In the second sector, adjust the sector start addresses. */\n\t\t\t\t/* NB: mag voor allemaal?? (ook als bv 2 best. gebruikt?) Denk wel. */\n\t\t\t\tfor (i=0; i<31; i++) {\n//OLD\t\t\t\t\tfseek(fp_ddos, (ddos_no*2+1)*256+14L+i*8, SEEK_SET);\n//OLD\t\t\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\t\t\tif (bbcim_disk_read(image, fp_ddos, (ddos_no*2+1)*256+14L+i*8, s, &filebyte)) return -1;\n\n\t\t\t\t\tH = filebyte;\n//OLD\t\t\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\t\t\tif (bbcim_disk_read(image, fp_ddos, (ddos_no*2+1)*256+14L+i*8+1, s, &filebyte)) return -1;\n\n\t\t\t\t\tstartsector = filebyte+H*256+2;\n\t\t\t\t\tH = startsector >> 8;\n\t\t\t\t\tfilebyte = startsector & 0xFF;\n\n//OLDWRITE\t\t\t\t\tfseek(fp_dfs, 256L+i*8+14, SEEK_SET);\n//OLDWRITE\t\t\t\t\tfwrite(&H, 1, 1, fp_dfs);\n//OLDWRITE\t\t\t\t\tfwrite(&filebyte, 1, 1, fp_dfs);\n\t\t\t\t\tif (bbcim_disk_write(image, fp_dfs, 256L+i*8+14, 0, &H)) return -1;\n\t\t\t\t\tif (bbcim_disk_write(image, fp_dfs, 256L+i*8+14+1, 0, &filebyte)) return -1;\n\t\t\t\t}\n\n\t\t\t\t/* Nu de rest: */\n//OLD\t\t\t\tfseek(fp_ddos,starttrack*18*256, SEEK_SET);\n\t\t\t\tfor (i=0; i<length; i++) {\n//OLD\t\t\t\t\tfread(&filebyte, 1, 1, fp_ddos);\n\t\t\t\t\tif (bbcim_disk_read(image, fp_ddos, starttrack*18*256+i, s, &filebyte)) {\n\t\t\t\t\t\tif (feof(fp_ddos)) {\n\t\t\t\t\t\t\treturn bbcim_ddos_disk_error(ddos_no + 'A', verbose);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\n//OLDWRITE\t\t\t\t\tfwrite(&filebyte, 1, 1, fp_dfs);\n\t\t\t\t\tif (bbcim_disk_write(&image_dfs, fp_dfs, 256L+i*8+14+2+i, 0, &filebyte)) return -1;\n\n\t\t\t\t}\n\t\t\t\tfclose(fp_dfs);\n\n\t\t\t\t/* Now write a .dsk file */\n\t\t\t\tbbc_archive__write_disk_attributes2(\n\t\t\t\t\tdfs_image_name,\n\t\t\t\t\timage->attr->sides, image->attr->tracks, image->attr->sectors_per_track, image->attr->bytes_per_sector, BBC_ARCHIVE__DFS_DISK, verbose);\n\t\t\t}\n\t\t}\n\t} /* sides */\n\n\tif (verbose) printf(\"\\n\");\n\tfclose(fp_ddos);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_convert_w62_to_dfs.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_convert_w62_to_dfs.c\n *\n * Copyright (C) 1997, 2000, 2003 W.H. Scholten\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n\nint bbcim_w62_to_dfs(struct bbc_archive__diskimage *image,  int verbose) {\n\tint  i;\n\tint st = 0;\n\tunsigned char filebyte;\n\tchar disk1[256], disk2[256];\n\tFILE *fp_w62, *fp_dfs;\n\n\tint s = 0; /* side, the code currently only does side 0 */\n\n\tstruct bbc_archive__diskimage image_dfs;\n\tstruct bbc_archive__diskimage_attr image_dfs_attr;\n\n\timage_dfs.attr = &image_dfs_attr;\n\timage_dfs_attr.type = BBC_ARCHIVE__DFS_DISK;\n\timage_dfs_attr.sides = 1;\n\timage_dfs_attr.tracks = 80;\n\timage_dfs_attr.sectors_per_track = 10;\n\timage_dfs_attr.bytes_per_sector = 256;\n\n\n\tstrcpy(disk1, image->filename);\n\tstrcpy(disk2, image->filename);\n//OLD, useful for DOS etc. with limited length filenames:\n//OLD\tdisk1[ strcspn(disk1, \".\") ] = 0;\n\tstrcat(disk1, \".w1\");\n\tstrcat(disk2, \".w2\");\n\n\tif (image->attr->type != BBC_ARCHIVE__W62_DISK) {\n\t\t/* Perhaps allow .w62 to identify this format? */\n\t\tbbcim_error = \"Bad disk format\";\n\t\tbbcim_errno = -1;\n\t\tif (verbose) fprintf(stderr, \"%s: %s\\n\", image->filename, bbcim_error);\n\t\treturn -1;\n\t}\n\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tfp_w62 = fopen(image->filename, \"rb\");\n\tif (fp_w62 == NULL) {\n\t\tif (verbose) fprintf(stderr, \"Can't open %s\\n\", image->filename);\n\t\treturn -1;\n\t}\n\n\t/* Put this in bbcim_diskimage_sanitycheck ?*/\n\t/* Verify it's a Watford 62 file image */\n\tfor (i=0; i<7; i++) {\n\t\tif (bbcim_disk_read(image, fp_w62, 512 + OFFSET__DFS_entries, s, &filebyte)) return -1;\n\t\tif (filebyte != 0xAA) {\n\t\t\tif (verbose) fprintf(stderr, \"%s is not a Watford 62 file image (there should be 8 bytes AA at positions 512-519)\\n\", image->filename);\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/* are there files on image 2? */\n\tif (bbcim_disk_read(image, fp_w62, 512 + OFFSET__DFS_entries, s, &filebyte)) return -1;\n\n\tif ((filebyte %8) != 0) {\n\t\t/* Not a valid 2nd catalogue */\n\t\tif (verbose) fprintf(stderr, \"%s: not a valid 2nd catalogue\\n\", image->filename);\n\t\treturn -1;\n\t}\n\n\tif (filebyte) {\n\t\tfp_dfs = fopen(disk2, \"wb\");\n\t\tif (fp_dfs == NULL) {\n\t\t\tif (verbose) fprintf(stderr, \"Can't write to %s\\n\", disk2);\n\t\t\treturn -1;\n\t\t}\n\n\t\t/* Move the 2nd catalogue 2 sectors down for the new disk */\n\t\tfor (i=0; i<512; i++) {\n\t\t\tif (bbcim_disk_read(image, fp_w62, 512+i, s, &filebyte)) return -1;\n\t\t\tif (bbcim_disk_write(&image_dfs, fp_dfs, 0+i, 0, &filebyte)) return -1;\n\t\t}\n\n\t\t/* Copy the rest of the diskimage to the new diskimage, sectors etc. are correct if the sectors\n\t\t * are copied and not moved up/down. Use -min to gain back space, afterwards. */\n\t\tfor (i=512; i<200*1024; i++) {\n\t\t\tst |= bbcim_disk_read(image, fp_w62, 512+i, s, &filebyte);\n\t\t\tif (feof(fp_w62)) break;\n\t\t\tst |= bbcim_disk_write(&image_dfs, fp_dfs, 0+i, 0, &filebyte);\n\t\t}\n\t\tfclose(fp_dfs);\n\n\t\t/* Now write a .dsk file for DFS disk image 2 */\n\t\tst |= bbc_archive__write_disk_attributes2(\n\t\t\tdisk2,\n\t\t\timage->attr->sides, image->attr->tracks, image->attr->sectors_per_track, image->attr->bytes_per_sector, BBC_ARCHIVE__DFS_DISK, verbose);\n\t}\n\n\t{ /* first diskimage */\n\t\tfp_dfs = fopen(disk2, \"wb\");\n\t\tif (fp_dfs == NULL) {\n\t\t\tif (verbose) fprintf(stderr, \"Can't write to %s\\n\", disk1);\n\t\t\treturn -1;\n\t\t}\n\n\t\tfseek(fp_w62, 0, SEEK_SET);\n\t\tfor (i=0; i<200*1024; i++) {\n\t\t\tst |= bbcim_disk_read(image, fp_w62, i, s, &filebyte);\n\t\t\tif (feof(fp_w62)) break;\n\t\t\tst |= bbcim_disk_write(&image_dfs, fp_dfs, i, 0, &filebyte);\n\t\t}\n\t\tfilebyte = 0x00; /* for W62 these bytes are 0xAA, DFS anything else. So by zeroing the diskimage will be DFS. */\n\t\tfor (i=0; i<8; i++) {\n\t\t\tst |= bbcim_disk_write(&image_dfs, fp_dfs, 512+i, 0, &filebyte);\n\t\t}\n\t\tfclose(fp_dfs);\n\n\t\t/* Now write a .dsk file for DFS disk image 1 */\n\t\tbbc_archive__write_disk_attributes2(\n\t\t\tdisk1,\n\t\t\timage->attr->sides, image->attr->tracks, image->attr->sectors_per_track, image->attr->bytes_per_sector, BBC_ARCHIVE__DFS_DISK, verbose);\n\t}\n\n\tfclose(fp_w62);\n\n\treturn st;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_delete_file.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_delete_file.c:\n *\n * NEDERLANDS: verwijder bestand uit diskbeeld\n *\n * Copyright (C) W.H.Scholten 1996, 1999, 2000, 2003\n */\n\n// Er zou een file-link ipv side gebruikt moeten worden die voor vanaalles gebruikt kan worden\n// struct { offset, side, }\n\n/* For Acorn DFS at the moment */\nint bbcim_disk_del_file(struct bbc_archive__diskimage *image, int side, char *del_bbcfilename, int flags, int verbose) {\n\tFILE *fpdisk;\n\tchar bbcfile_naam[15];\n\tunsigned char filebyte;\n\tunsigned char files;\n\tint  rfiles;\n\tint  file, k;\n\tint  locked;\n\tint  removed;\n\tint  i;\n\tchar testnaam[15];\n\tchar *disk;\n\n\n\tdisk = image->filename;\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tif (side < 0 || (side >= image->attr->sides))\n\t\treturn bbcim_print_error_bad_side(\"bbcim_disk_del_file\", image, side, verbose);\n\n\tif (image->attr->type != BBC_ARCHIVE__DFS_DISK)\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_disk_del_file\", image, verbose);\n\n\tfpdisk = fopen(disk, \"rb+\");\n\n\tbbcim_disk_read(image, fpdisk, 256L+5L, side, &files);\n\n\trfiles = files/8;\n\n\tDEB(printf(\"aantal bestanden op diskbeeld: %d\\n\", rfiles));\n\n\tremoved = 0;\n\n\t/* Hoofdlus: alle bestanden opzoeken. */\n\tif (files > 0) {\n\t\tfor (file=0; file<files; file +=8) {\n\t\t\tbbcim_disk_read(image, fpdisk, file+15L, side, &filebyte);\n\n\t\t\tlocked = filebyte >> 7;\n\n\t\t\tbbcfile_naam[0] = (filebyte & 0x7F);\n\t\t\tbbcfile_naam[1] = '.';\n\n\t\t\tfor (i=0; i<7; i++) {\n\t\t\t\tbbcim_disk_read(image, fpdisk, file+8L+i, side, &filebyte);\n\t\t\t\tbbcfile_naam[i+2] = filebyte;\n\t\t\t}\n\t\t\tbbcfile_naam[9] = 0;\n\n\t\t\t/* Spaties aan het einde van extract weghalen: geeft anders\n\t\t\t * bestands namen met spaties aan het einde. */\n\t\t\tfor (i=8; i>0 && (bbcfile_naam[i]==' '); i--) ;\n\t\t\tbbcfile_naam[i+1] = 0;\n\n\t\t\tif (del_bbcfilename[1] == '.')\n\t\t\t\tstrncpy(testnaam, del_bbcfilename, 9);\n\t\t\telse {\n\t\t\t\ttestnaam[0] = '$'; testnaam[1] = '.';\n\t\t\t\tstrncpy(testnaam+2, del_bbcfilename, 7);\n\t\t\t}\n\t\t\ttestnaam[9] = 0;\n\n\t\t\tif (!strcasecmp(bbcfile_naam, testnaam)) {\n\t\t\t\tfor (k=(file+8)+8; k<256; k++) {\n\t\t\t\t\tbbcim_disk_read(image, fpdisk, k, side, &filebyte);\n\t\t\t\t\tbbcim_disk_write(image, fpdisk, k-8L, side, &filebyte);\n\n\t\t\t\t\tbbcim_disk_read(image, fpdisk, k+256L, side, &filebyte);\n\t\t\t\t\tbbcim_disk_write(image, fpdisk, k-8L+256L, side, &filebyte);\n\t\t\t\t}\n\t\t\t\tTEKST_NL(printf(\"Bestand %s verwijderd\\n\", testnaam));\n\t\t\t\tTEKST_ENG(printf(\"File %s removed\\n\", testnaam));\n\t\t\t\tremoved++;\n\t\t\t\t//continue;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} /*for*/\n\n\t\tfiles -= removed*8;\n\t\tbbcim_disk_write(image, fpdisk, 256L+5L, side, &files);\n\n\n\t\tTEKST_NL(printf(\"  %d bestand%s verwijderd\\n\", removed, (removed != 1) ? \"en\" : \"\"));\n\t\tTEKST_ENG(printf(\"  %d file%s removed\\n\", removed, (removed != 1) ? \"s\" : \"\"));\n\n\t} /* files > 0 */\n\n\tfclose(fpdisk);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_expand.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation and more\n *\n * disk_expand.c\n *\n * Copyright (C) 1996,2003 W.H. Scholten\n */\n\n\n/* For Acorn DFS only */\nint bbcim_disk_expand(struct bbc_archive__diskimage *image, int sectors, int verbose) {\n\tFILE *fpdisk;\n\tint file_length;\n\tint expand_length;\n\n\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tif (image->attr->type != BBC_ARCHIVE__DFS_DISK)\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_disk_expand\", image, verbose);\n\n\tswitch(image->attr->type) {\n\tcase BBC_ARCHIVE__DFS_DISK:\n\t\tfpdisk = fopen(image->filename, \"rb+\");\n\t\tfseek(fpdisk, 0, SEEK_END);\n\t\tfile_length = ftell(fpdisk);\n\t\texpand_length = sectors * 256 * image->attr->sides;\n\n\t\tif (expand_length >= file_length) {\n\t\t\tunsigned char bootoption;\n\t\t\tunsigned char filebyte;\n\t\t\tint  i, side;\n\n\t\t\tfilebyte = 0; /* What about E5? Acorn uses that for formatting */\n\t\t\tfor (i=0; i<(expand_length - file_length); i++)\n\t\t\t\tfwrite(&filebyte, 1, 1, fpdisk);\n\n\n\t\t\t/* Adjust sectors-on-disk */\n\t\t\tfor (side=0; side<image->attr->sides; side++) {\n\t\t\t\t/* Rescue the bootoption: */\n\t\t\t\tbbcim_disk_read(image, fpdisk, 256L+6L, side, &filebyte);\n\t\t\t\tbootoption = filebyte  & (3 << 4);\n\n\t\t\t\t/* Write new disk size and old bootoption */\n\t\t\t\tfilebyte = ((sectors >> 8) & 3) | bootoption;\n\t\t\t\tbbcim_disk_write(image, fpdisk, 256L+6L, side, &bootoption);\n\t\t\t\tfilebyte = (sectors & 0xFF);\n\t\t\t\tbbcim_disk_write(image, fpdisk, 256L+7L, side, &filebyte);\n\t\t\t}\n\t\t}\n\t\tfclose(fpdisk);\n\t\tbreak;\n\n\tdefault:\n//\t\tbbcim_errno = BBCIM_ERROR__NOT_IMPLEMENTED;\n\t\tbreak;\n\t}\n\n\t/* Now write a .dsk file */\n\tbbc_archive__write_disk_attributes(image->filename, image->attr, verbose);\n\n\treturn bbcim_errno;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_id.c",
    "content": "/* Try to identify a disk image type */\n\n#include <_bbc_archive.h>\n\nint verify_watford_id(FILE *fp, int offset);\n\nint bbcim_disk_identify(char *filename, int *possible_disktypes, int verbose) {\n//\tint i;\n\tFILE * fp;\n\tunsigned char mybyte;\n\tint  st;\n\tunsigned int side__type_bits;\n\tunsigned int side0__type_bits;\n\tunsigned int side1__type_bits;\n\tunsigned int sides__bits;\n\n\tif (bbcim_file_sanitycheck (filename, verbose)) return bbcim_errno;\n\n\tfp = fopen(filename, \"rb\");\n\tside__type_bits = 0xff; /* all bits set */\n\tside0__type_bits = 0xff; /* all bits set */\n\tside1__type_bits = 0xff; /* all bits set */\n\tsides__bits = 0x3;\n\n//\tbbcim_disk_read(image, fp, 256L+5L, side, &mybte);\n\tfseek(fp, 256L+5L, SEEK_SET);\n\tst = fread(&mybyte, 1, 1, fp);\n\tif (st == 1) {\n\t\tif ((mybyte % 8) != 0) {\n\t\t\tside0__type_bits &= ~((1<<BBC_ARCHIVE__DFS_DISK) | (1<<BBC_ARCHIVE__DDOS_DISK) | (1<<BBC_ARCHIVE__W62_DISK));\n\t\t}\n\t}\n//\tbbcim_disk_read(image, fp, 256*10+256L+5L, side, &mybte);\n\tfseek(fp, 256*10+256L+5L, SEEK_SET);\n\tst = fread(&mybyte, 1, 1, fp);\n\tif (st == 1) {\n\t\tif ((mybyte % 8) != 0) {\n\t\t\tside1__type_bits &= ~((1<<BBC_ARCHIVE__DFS_DISK) | (1<<BBC_ARCHIVE__DDOS_DISK) | (1<<BBC_ARCHIVE__W62_DISK));\n\t\t}\n\t}\n\n\n\t/* Verify it's a Watford 62 file image */\n\tif (verify_watford_id(fp, 512L)) {\n\t\tside__type_bits = (1<<BBC_ARCHIVE__W62_DISK); side0__type_bits = (1<<BBC_ARCHIVE__W62_DISK);\n\t}\n\telse {\n\t\tside__type_bits &= ~(1<<BBC_ARCHIVE__W62_DISK); side0__type_bits &= ~(1<<BBC_ARCHIVE__W62_DISK);\n\t}\n\tif (verify_watford_id(fp, 10*256+512L)) {\n\t\tside1__type_bits = (1<<BBC_ARCHIVE__W62_DISK);\n\t}\n\telse {\n\t\tside1__type_bits &= ~(1<<BBC_ARCHIVE__W62_DISK);\n\t}\n\n\n\n\tif (verbose) {\n\t\tint t;\n\n\t\tprintf(\"It looks like one of these possiblities:\\n\");\n\t\tif (sides__bits & 1) {\n\t\t\tprintf(\" 1 side: it can be: \");\n\t\t\tfor (t=0; t<BBC_ARCHIVE__HDFS_DISK+1; t++) {\n\t\t\t\tif (side0__type_bits & (1<<t)) printf(\"%s \", bbc_archive__dfs_names[t]);\n\t\t\t}\n\t\t\tprintf(\"\\n\");\n\t\t}\n\t\tif (sides__bits & 2) {\n\t\t\tprintf(\" 2 sides: side 0 can be: \");\n\t\t\tfor (t=0; t<BBC_ARCHIVE__HDFS_DISK+1; t++) {\n\t\t\t\tif (side0__type_bits & (1<<t)) printf(\"%s \", bbc_archive__dfs_names[t]);\n\t\t\t}\n\t\t\tprintf(\"\\n\");\n\t\t\tprintf(\"          side 1 can be: \");\n\t\t\tfor (t=0; t<BBC_ARCHIVE__HDFS_DISK+1; t++) {\n\t\t\t\tif (side1__type_bits & (1<<t)) printf(\"%s \", bbc_archive__dfs_names[t]);\n\t\t\t}\n\t\t\tprintf(\"\\n\");\n\t\t}\n\t}\n\n\treturn bbcim_errno;\n}\n\n\nint verify_watford_id(FILE *fp, int offset) {\n\tint i, st;\n\tunsigned char mybyte;\n\n\t/* Verify it's a Watford 62 file image */\n\tfseek(fp, offset, SEEK_SET);\n\tfor (i=0; i<7; i++) {\n//\t\tif (bbcim_disk_read(image, fp, 512 + OFFSET__DFS_entries, s, &mybyte)) return -1;\n\t\tst = fread(&mybyte, 1, 1, fp);\n\t\tif (st != 1) break;\n\t\tif (mybyte != 0xAA) break;\n\t}\n\n\tif (i != 8) return 0;\n\n\tfseek(fp, offset+OFFSET__DFS_entries, SEEK_SET);\n\tst = fread(&mybyte, 1, 1, fp);\n\tif (st != 1) return 0;\n\tif ((mybyte % 8) != 0) return 0;\n\n\treturn 1;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_minimise.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_minimise.c:\n * NEDERLANDS: minimaliseer bbc diskbeeld (SINGLE DENSITY, DFS)\n *\n * Copyright (C) W.H.Scholten 1996 - 2001, 2003\n */\n\n\n/* Acorn DFS */\nint bbcim_disk_minimise(struct bbc_archive__diskimage *image, int verbose) {\n\tFILE *fpdisk, *fpdisk2;\n\tchar backupnaam[256];\n\tchar bbcfile_naam[12];\n\tunsigned char filebyte, H, eellddss;\n\n\tint startsector, file;\n\tunsigned char files;\n\tint length;\n//\tint max_sectors = INT_MAX;\n\tint side;\n\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tif (image->attr->type != BBC_ARCHIVE__DFS_DISK)\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_disk_minimise\", image, verbose);\n\n//\tfpdisk = fopen(image->filename, \"rb\");\n//\tfclose(fpdisk);\n\n\tstrcpy(backupnaam, image->filename); strcat(backupnaam, \"~\");\n\n//OLD\tremove(backupnaam);\n//OLD\trename(image->filename, backupnaam);\n//\tfprintf(stderr, \"min, before rename\\n\");\n\tif (bbcim_rename_diskimage(image->filename, backupnaam, verbose)) return bbcim_errno;\n//\tfprintf(stderr, \"min, after rename\\n\");\n\n\tfpdisk = fopen(backupnaam, \"rb\");\n\tfpdisk2 = fopen(image->filename, \"wb\");\n\n\n\n\tfor (side=0; side<image->attr->sides; side++) {\n\t\tint startsector2 = 2;\n\t\tint i;\n\n\t\tbbcim_disk_read(image, fpdisk, OFFSET__DFS_entries /*256L+5L*/, side, &files);\n//\t\tif (files > 0) {\n\t\t\t/* Copy the catalogue */\n\t\t\tfor (i=0; i<512; i++) {\n\t\t\t\tbbcim_disk_read(image, fpdisk, i, side, &filebyte);\n\t\t\t\tbbcim_disk_write(image, fpdisk2, i, side, &filebyte);\n\t\t\t}\n\n\n\t\t\t/* Main loop: find all files. */\n\t\t\tfor (file=files; file>0; file-=8) {\n\t\t\t\t/* The following is only needed for filename printing: */\n\t\t\t\tbbcim_disk_read(image, fpdisk, file+15L, side, &filebyte);\n\t\t\t\tbbcfile_naam[0] = (filebyte & 0x7F);\n\t\t\t\tbbcfile_naam[1] = '.';\n\t\t\t\tfor (i=0; i<7; i++) {\n//FOUT?\t\t\t\t\tbbcim_disk_read(image, fpdisk, file+8L+i, side, &filebyte);\n\t\t\t\t\tbbcim_disk_read(image, fpdisk, file+i, side, &filebyte); //ok?\n\n\t\t\t\t\tbbcfile_naam[i+2] = filebyte;\n\t\t\t\t}\n\t\t\t\tbbcfile_naam[9] = 0;\n\t\t\t\tfprintf(stderr, \"DEBUG filenaam=%s\\n\", bbcfile_naam);\n\n\t\t\t\t/* File length */\n\t\t\t\tbbcim_disk_read(image, fpdisk, file+256L+4L, side, &filebyte);\n\t\t\t\tbbcim_disk_read(image, fpdisk, file+256L+5L, side, &H);\n\t\t\t\tbbcim_disk_read(image, fpdisk, file+256L+6L, side, &eellddss);\n\n\t\t\t\tlength = H*256L+filebyte+(eellddss & 0x30)*16L*256L;\n\n\n\n\t\t\t\t/* Start sector */\n//FOUT?\t\t\t\tbbcim_disk_read(image, fpdisk, file+256L+7L, side, &eellddss);\n\t\t\t\tbbcim_disk_read(image, fpdisk, file+256L+7L, side, &filebyte);\n\t\t\t\tstartsector = filebyte+(eellddss & 3)*256L;\n\n\t\t\t\t/* New startsector */\n\t\t\t\teellddss = (eellddss & 0xFC)+(startsector2>>8);\n\t\t\t\tbbcim_disk_write(image, fpdisk2, file+256L+6L, side, &eellddss);\n\n\t\t\t\tfilebyte = startsector2 & 0xFF;\n\t\t\t\tbbcim_disk_write(image, fpdisk2, file+256L+7L, side, &filebyte);\n\n\t\t\t\tif (bbcim_debug) printf(\"startsector %3d > %3d\\n\", (int) startsector, (int) startsector2);\n\n\n\t\t\t\tfor (i=0; i< ((length+255) >> 8)*256; i++) {\n//FOUT?\t\t\t\t\tbbcim_disk_read(image, fpdisk, file+startsector*256+i, side, &filebyte);\n\t\t\t\t\tbbcim_disk_read(image, fpdisk, startsector*256+i, side, &filebyte);\n\t\t\t\t\tif (feof(fpdisk) && (i < length)) {\n//\t\t\t\t\t\treturn bbcim_print_error_diskimage_truncated(\"disk_minimize\", image, bbcfile_naam, verbose);\n\t\t\t\t\t\tbbcim_print_error_diskimage_truncated(\"disk_minimize\", image, bbcfile_naam, verbose);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbbcim_disk_write(image, fpdisk2, startsector2*256+i, side, &filebyte);\n\t\t\t\t}\n\t\t\t\tstartsector2 = startsector2 + ((length+255) >> 8);\n\t\t\t} /* loop over all files */\n//\t\t} /* files > 0 */\n\t} /* loop over all sides */\n\tfclose(fpdisk);\n\tfclose(fpdisk2);\n\n\t/* Now write a .dsk file */\n\tbbc_archive__write_disk_attributes(image->filename, image->attr, verbose);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_new.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_new.c\n *\n * Copyright (C) 1996 - 2003 W.H. Scholten\n */\n\n\n/* Acorn DFS only at the moment */\nint bbcim_disk_new(struct bbc_archive__diskimage *image, int verbose) {\n\tFILE *fpdisk;\n\tunsigned char filebyte;\n\tint i;\n\tint side, sectors;\n\n\tbbcim_errno = 0;\n\tif (image->attr->type != BBC_ARCHIVE__DFS_DISK)\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_disk_new\", image, verbose);\n\n\n\tfpdisk = fopen(image->filename, \"wb\");\n\n\tswitch(image->attr->type) {\n\tcase BBC_ARCHIVE__DFS_DISK:\n//\t\tif (image->attr->sectors_per_track != 10 /* SD */ && image->attr->sectors_per_track != 18 /* DD */) return -1;\n//\t\tif (image->attr->bytes_per_sectors != 256) return -1;\n\t\tsectors = image->attr->sectors_per_track * image->attr->tracks;\n\t\tif (sectors > 0xFFF) sectors = 0xFFF; /* not allowed in true DFS but might be useful for big disks in beebem. */\n\n\t\tfor (side = 0; side < image->attr->sides; side++) {\n\n\t\t\tfilebyte = 0;\n\t\t\tfor (i=0; i<512; i++) {\n\t\t\t\tbbcim_disk_write(image, fpdisk, i, side, &filebyte);\n\t\t\t}\n\n\t\t\t/* Set disk size (sectors) & default boot option */\n\t\t\tfilebyte = (sectors >> 8);\n\t\t\tfilebyte |= 3 << 4;  /* i.e. bootoption = *EXEC, sectors-on-disk = 'sectors' */\n\t\t\tbbcim_disk_write(image, fpdisk, 256+6, side, &filebyte);\n\t\t\tfilebyte = (sectors & 0xFF);\n\t\t\tbbcim_disk_write(image, fpdisk, 256+6 + 1, side, &filebyte);\n\t\t}\n\n\t\timage->attr->tracks = sectors / image->attr->sectors_per_track;\n\t\tbreak;\n\n\tcase BBC_ARCHIVE__ADFS_DISK:\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\t/* Now write a .dsk file */\n\tbbc_archive__write_disk_attributes(image->filename, image->attr, verbose);\n\n\treturn bbcim_errno;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_set_boot.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_set_boot.c\n *\n * Copyright (C) 1997, 2001, 2003 W.H. Scholten\n */\n\n\n/* Acorn DFS */\nint bbcim_disk_set_boot(struct bbc_archive__diskimage *image, int side, int bootoption, int verbose) {\n\tFILE *fpdisk;\n\tunsigned char filebyte;\n\n\tif (bbcim_diskimage_sanitycheck(image, verbose)) return bbcim_errno;\n\n\tif (side < 0 || (side >= image->attr->sides))\n\t\treturn bbcim_print_error_bad_side(\"bbcim_disk_set_boot\", image, side, verbose);\n\n\tif (image->attr->type != BBC_ARCHIVE__DFS_DISK)\n\t\treturn bbcim_print_error_unsupported_disktype(\"bbcim_disk_set_boot\", image, verbose);\n\n\n\tfpdisk = fopen(image->filename, \"rb+\");\n\tfilebyte = 0;\n\n\tswitch(image->attr->type) {\n\tcase BBC_ARCHIVE__DFS_DISK:\n\t\tbbcim_disk_read(image, fpdisk, 256L+6L, side, &filebyte);\n\t\tfilebyte &= 0x0f;\n\t\tfilebyte |= bootoption << 4;\n\t\tbbcim_disk_write(image, fpdisk, 256L+6L, side, &filebyte);\n\t\tbreak;\n\n\tdefault:\n//\t\tbbcim_errno = BBCIM_ERROR__NOT_IMPLEMENTED;\n\t\tbreak;\n\t}\n\n\tfclose(fpdisk);\n\n\treturn bbcim_errno;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/disk_split_ds.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * disk_split_ds.c:\n *   NEDERLANDS: splits om-en-om diskbeelden, voor single/double density\n *   ENGLISH: split double sided disk images, for single/double density\n *\n * Copyright (C) W.H.Scholten 1996, 1997, 1999, 2001, 2003\n */\n\n\n#include <errno.h>\n\n\n/* Split an interleaved (double sided) disk image into 2 separate single sided\n * diskimages.\n */\n\nint bbcim_split_doublesided(struct bbc_archive__diskimage *image, int verbose) {\n\tchar  side0 [ 256 ];\n\tchar  side1 [ 256 ];\n\tFILE *fp0 = NULL, *fp1 = NULL, *fp_inter = NULL;\n\n\tunsigned char filebyte;\n\tint  track;\n\n\tif (bbcim_debug) printf(\"DEBUG: bbcim_split_doublesided: %s\\n\", image->filename);\n\tstrcpy(side0, image->filename);\n\tstrcpy(side1, image->filename);\n\tstrcat(side0, \".0\");\n\tstrcat(side1, \".1\");\n\n\tif (bbcim_file_sanitycheck(image->filename, verbose)) return bbcim_errno;\n\n\tif (image->attr->sides != 2) {\n\t\tbbcim_error = \"Bad number of sides\";\n\t\tbbcim_errno = BBCIM_ERROR__BAD_DISK_TYPE_ARGUMENT;\n\t\tgoto leave_split_ds;\n\t}\n\n\tfp_inter = fopen(image->filename, \"rb\");\n\tfp0 = fopen(side0, \"wb\");\n\tfp1 = fopen(side1, \"wb\");\n\n\tif (fp_inter == NULL || fp0 == NULL || fp1 == NULL) {\n\t\tbbcim_error = \"Open failed\";\n\t\tbbcim_errno = BBCIM_ERROR__OPEN_FAILED;\n\t\tgoto leave_split_ds;\n\t}\n\n\n\tfseek(fp_inter, 0L, SEEK_SET);\n\tfor (track=0; track<image->attr->tracks; track++) {\n\t\tint  i;\n\t\tint  track_size = image->attr->sectors_per_track * image->attr->bytes_per_sector;\n\n\t\tfor (i=0; i<track_size; i++) {\n\t\t\tif (!fread(&filebyte, 1, 1, fp_inter)) {\n\t\t\t\tbbcim_error = \"Disk truncated\"; bbcim_errno = BBCIM_ERROR__DISK_TRUNCATED;\n\t\t\t\tgoto leave_split_ds;\n\t\t\t}\n\t\t\tfwrite(&filebyte, 1, 1, fp0);\n\t\t}\n\t\tfor (i=0; i<track_size; i++) {\n\t\t\tif (!fread(&filebyte, 1, 1, fp_inter)) {\n\t\t\t\tbbcim_error = \"Disk truncated\"; bbcim_errno = BBCIM_ERROR__DISK_TRUNCATED;\n\t\t\t\tgoto leave_split_ds;\n\t\t\t}\n\t\t\tfwrite(&filebyte, 1, 1, fp1);\n\t\t}\n\t}\n\n  leave_split_ds:\n\tif (fp0) {\n\t\tfclose(fp0);\n\n\t\t/* Now write a .dsk file */\n\t\tbbc_archive__write_disk_attributes2(\n\t\t\tside0,\n\t\t\t1, image->attr->tracks, image->attr->sectors_per_track, image->attr->bytes_per_sector, image->attr->type, verbose);\n\t}\n\n\tif (fp1) {\n\t\tfclose(fp1);\n\n\t\t/* Now write a .dsk file */\n\t\tbbc_archive__write_disk_attributes2(\n\t\t\tside1,\n\t\t\t1, image->attr->tracks, image->attr->sectors_per_track, image->attr->bytes_per_sector, image->attr->type, verbose);\n\t}\n\n\tif (fp_inter) fclose(fp_inter);\n\n\n\tif (verbose && bbcim_errno) fprintf(stderr, \"%s: %s\\n\", image->filename, bbcim_error);\n\n\treturn bbcim_errno;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/error.c",
    "content": "int bbcim_set_error(int errorno, int verbose) {\n\tswitch (errorno) {\n\tcase BBCIM_ERROR__OPEN_FAILED:\n\t\tbbcim_error = \"Open file failed\";\n\t\tbreak;\n\tcase BBCIM_ERROR__OUT_OF_MEMORY:\n\t\tbbcim_error = \"Out of memory\";\n\t\tbreak;\n\n\tcase BBCIM_ERROR__GENERIC:\n\tdefault:\n\t\tbbcim_error = \"Unspecified error\";\n\t\terrorno = -1;\n\t\tbreak;\n\t}\n\tbbcim_errno = errorno;\n\n\tif (verbose) fprintf(stderr, \"%s\\n\", bbcim_error);\n\n\treturn bbcim_errno;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/include/bbcim.h",
    "content": "/* BBCIM: Acorn BBC computer diskimage manipulation\n *\n * bbcim.h (bbcim; bbc diskbeeld manipulatie): Functies.\n *\n * Copyright (C) W.H. Scholten 1996, 1997, 1999, 2000, 2001, 2003, 2009, 2014, 2016\n */\n\n\n\n#ifndef _BBCIM__bbcim_h\n#define _BBCIM__bbcim_h\n\n#define BBCIM_VERSION \"1.2\"\n#define BBCIM_COPYRIGHT \"(C) W.H.Scholten 1996-2016\"\n\n#include <_bbc_archive.h>\n\n\n\nextern int bbcim_debug;\nextern int bbcim_lib_version;\n\n\n/* Used in the frontend: */\n#define BBCIM__SD_SECTORSIZE       (256)\n#define BBCIM__DD_SECTORSIZE       (256)\n#define BBCIM__ADFS_SECTORSIZE     (256)\n\n#define BBCIM__SD_SECTORSPERTRACK   (10)\n#define BBCIM__DD_SECTORSPERTRACK   (18)\n#define BBCIM__ADFS_SECTORSPERTRACK (16)\n\n\n/* Foutmeldingen (error messages) */\n#define BBCIM__OK                             0\n#define BBCIM_ERROR__GENERIC                 -1\n#define BBCIM_ERROR__OUT_OF_MEMORY           -2\n#define BBCIM_ERROR__OPEN_FAILED             -3\n\n#define BBCIM_ERROR__NO_ROOT_DIR             -10\n#define BBCIM_ERROR__BAD_DISK_TYPE_ARGUMENT  -11\n#define BBCIM_ERROR__BAD_DISK_SIDE           -12\n\n#define BBCIM_ERROR__DISK_TRUNCATED         -20\n\n#define BBCIM_ERROR__NO_INF_FOUND           -30\n#define BBCIM_ERROR__BAD_DSK_FORMAT         -31\n#define BBCIM_ERROR__BAD_INF_FORMAT         -32\n\n\n/* BBC like errors: */\n#define BBCIM_ERROR__BAD_DISK               -50\n#define BBCIM_ERROR__DISK_FULL              -51\n#define BBCIM_ERROR__LOCKED_FILE            -52\n#define BBCIM_ERROR__FILE_NOT_FOUND         -53\n#define BBCIM_ERROR__DIR_NOT_FOUND          -54\n\n#define BBCIM_ERROR__NOT_IMPLEMENTED       -128\n\n\n/*__________________VARIABELEN___________________*/\nextern char *bbcim_error; /* points to the last error */\nextern int  bbcim_errno;\n\n\n//struct bbcim_diskimage_attr {\n//    int  type; /* DFS_DISK, W62_DISK, DDOS_DISK, ADFS_DISK, HDFS_DISK */\n//    int  sides;\n//    int  tracks;\n//    int  sectors_per_track;\n//    int  bytes_per_sector;\n//};\n//struct bbcim_diskimage {\n//\tstruct bbcim_diskimage_attr *attr;\n//\tchar *filename;\n//\tchar *dsk_filename;\n//};\n\nstruct bbcim_tapeimage_attr {\n\tint  type; /* RAW, BLOCKS */\n\tint  nblocks;\n};\nstruct bbcim_tapeimage {\n\tstruct bbcim_tapeimage_attr *attr;\n\tchar *filename;\n\tchar *dsk_filename;\n};\n\n//#define BBCIM_ATTR__LOCKED   1 /* DFS & TAPE */\n//\n//#define BBCIM_ATTR__R        1 /* ADFS */\n//#define BBCIM_ATTR__W        2\n//#define BBCIM_ATTR__E        4\n//#define BBCIM_ATTR__D        8\n//\n//#define BBCIM_FILETYPE__TAPE  1\n//#define BBCIM_FILETYPE__DISK  2\n\n//struct bbcim_file_attr {\n//\t/* BBC filename/attributes */\n//\tint  type; /* BBCCIM_FILETYPE_TAPE etc. */\n//    char *name; /* malloced */\n//    int loadaddr;\n//    int execaddr;\n//    int length;\n//    unsigned char attributes;\n//\tint crc; /* 0-65535 for a valid crc, any other value denotes an invalid or no crc found; bbcim returns -1 in such a case */\n//\tchar *next_tape_file; /* host filename! (malloced) */\n//};\n\n//struct bbcim_file {\n//\tstruct bbcim_file_attr *attr;\n//\tchar *filename;\n//\tchar *inf_filename;\n//};\n\n\n\nstruct bbcim_disk_data {\n/* should this be in diskimage struct ? */\n/* NB only file address and cat address really needed. All else can be calculated from the data in the diskimage struct\n   tracksize=image->sectors*image->bytes\n   track=addr /(tracksize*sides); side =(addr /tracksize)&(sides-1);\n   */\n    int file_address;\n    int cat_address;\n    int file_no; /* index into catalogue at 'cat_address' */\n\n#if 0 /* Not needed: */\n    int side;\n    int file_track; /* file address */\n    int file_sector;\n    int file_byte;\n    int cat_track;  /* catalogue entry address */\n    int cat_sector;\n    int cat_byte;\n#endif\n#if 0\n    /* might be useful: */\n    int  bootoption;\n    char *diskname;\n    char dirname[50]; /* current dir */\n    int fileptr;\n    char filename[50];\n    int  status; /* bad image, error? */\n#endif\n\tunsigned char *data;\n};\n\nstruct bbcim_file_data {\n    char *filename;\n    unsigned char *data;\n};\n\n\n/* vlaggen voor cat-extract-crc-add */\n//#define BBCIM_VERBOSE             1\n#define BBCIM_EXTRACT_FILES       2\n#define BBCIM_EXTRACT_DIR         4\n#define BBCIM_SHOW_FILES          8\n#define BBCIM_CALC_CRC           16\n#define BBCIM__NAME__KEEP_NONROOT_DIR    32\n#define BBCIM__NAME__KEEP_ROOT_DIR        1\n//#define BBCIM_REMOVE_DISK        64\n#define BBCIM_SHORT_NAME        128\n#define BBCIM_DISK_INFO         256\n#define BBCIM_REMOVE_FILE       512\n#define BBCIM_FILE_INFO        1024\n\n/* Low level reading */\n#define BBCIM_GET_ATTRIBUTES   2048\n#define BBCIM_LOAD_FILE        4096\n#define BBCIM_SAVE_FILE        8192\n#define BBCIM_NEW_DISK        16384\n#define BBCIM_ADD_FILES       32768\n\n\n/*__________________FUNCTIES___________________*/\nint  bbcim_disk_cat_extract_crc (struct bbc_archive__diskimage *image, int side, struct bbc_archive__file* file, int flags, int verbose);\n\nint  bbcim_disk_add_file (struct bbc_archive__diskimage *image, int side, char *filename, struct bbc_archive__file *file, int flags, int verbose);\n\nint  bbcim_disk_del_file (struct bbc_archive__diskimage *image, int side, char *del_bbcfilename, int flags, int verbose);\n\nint  bbcim_disk_minimise (struct bbc_archive__diskimage *image, int verbose);\nint  bbcim_disk_expand (struct bbc_archive__diskimage *image, int expand, int verbose);\nint  bbcim_disk_new (struct bbc_archive__diskimage *image, int verbose);\nint  bbcim_disk_set_boot (struct bbc_archive__diskimage *image, int side, int bootoption, int verbose);\n//int  bbcim_disk_identify (struct bbc_archive__diskimage *image, int verbose);\nint  bbcim_disk_identify (char *filename, int *possible_disktypes, int verbose);\n\nint  bbcim_interleave_singlesided (struct bbc_archive__diskimage *image0, struct bbc_archive__diskimage *image1, char *interleaved, int verbose);\nint  bbcim_split_doublesided (struct bbc_archive__diskimage *image, int verbose);\n\n\nint  bbcim_ddos_to_dfs (struct bbc_archive__diskimage *image, int verbose);\nint  bbcim_w62_to_dfs (struct bbc_archive__diskimage *image, int verbose);\n\n\n/* Reading from/writing to diskimages taking interleaved images into acount: */\nint bbcim_disk_offset(struct bbc_archive__diskimage *image, int side_offset, int side);\nint bbcim_disk_write(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *byte);\nint bbcim_disk_read(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *byte);\nint bbcim_disk_write_multi(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *bytes, int nbytes);\nint bbcim_disk_read_multi(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *bytes, int nbytes);\n\n\n/* ================= Internal functions: ===================== */\n/* Utility functions: */\nvoid bbcim_reduce_bbcname__no_dir (char *unixnaam, char *bbcnaam);\nvoid bbcim_reduce_bbcname__no_rootdir (char *unixnaam, char *bbcnaam);\n\n\n\n/* Printing/setting error: */\nint  bbcim_print_error_unsupported_disktype(char *function, struct bbc_archive__diskimage *image, int verbose);\nint  bbcim_print_error_bad_side(char *function, struct bbc_archive__diskimage *image, int side, int verbose);\nint  bbcim_print_error_diskimage_truncated(char *function, struct bbc_archive__diskimage *image, char *file, int verbose);\n\nint  bbcim_set_error(int errno, int verbose);\n\n\n/* Other */\nint  bbcim_rename_diskimage(char *from, char *to, int verbose);\nint  bbcim_file_sanitycheck(char *filename, int verbose);\nint  bbcim_diskimage_sanitycheck(struct bbc_archive__diskimage *image, int verbose);\n\n\n/* Should go to the main program: */\nint  bbcim_overschrijf_vraag (char *oude_naam, char *nieuwe_naam);\n\n\n\n/* ========= Low level, to be added: loading files in memory, getting file attributes etc. ========= */\n/*\nint  bbcim_d_read_first_catalogue_entry (struct bbc_archive__diskimage *image, struct bbc_archive__file *file);\n\nint  bbcim_d_read_catalogue_entry (struct bbc_archive__diskimage *image, struct bbc_archive__file *file);\nint  bbcim_d_write_catalogue_entry (struct bbc_archive__diskimage *image, struct bbc_archive__file *file);\n\nint  bbcim_d_write_cat_entry (struct bbc_archive__diskimage *image, struct bbc_archive__file *file, struct bbcim_disk_data *disk_data);\n\nint  bbcim_d_read_first_file (struct bbc_archive__diskimage *image, struct bbc_archive__file *file, byte *data);\nint  bbcim_d_read_file (struct bbc_archive__diskimage *image, struct bbc_archive__file *file, byte *data);\nint  bbcim_d_read_next_file (struct bbc_archive__diskimage *image, struct bbc_archive__file *file, byte *data);\nint  bbcim_d_write_file (struct bbc_archive__diskimage *image, struct bbc_archive__file *file);\n*/\n\n#endif /* _BBCIM__bbcim_h */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/overschrijf.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * overschrijf.c\n *\n * Copyright (C) W.H.Scholten 1996, 1997, 2001\n */\n\n#include \"overschrijf.h\"\n\n\nint bbcim_overschrijf_vraag(char *oude_naam, char *nieuwe_naam) {\n\tchar string;\n\tint antwoord = 0;\n\n\tprintf(\"bestand %s -> %s:\\n\", oude_naam, nieuwe_naam);\n\n\twhile (!antwoord) {\n\t\tprintf(TEKST_NL(\"  overschrijven/hernoem nieuw/hernoem bestaand/sla over?(o/n/b/s)\")\n\t\t\t   TEKST_ENG(\"  overwrite/rename new file/rename existing file/skip?(o/n/e/s)\")\n\t\t\t);\n\t\tscanf(\" %c\", &string);\n\t\tswitch(string) {\n\t\tcase 'o': antwoord = BBCIM_OVERSCHRIJVEN; break;\n\t\tcase 'n': antwoord = BBCIM_HERNOEM_NIEUW; break;\n\n#ifdef LANGUAGE_DUTCH\n\t\tcase 'b': antwoord = BBCIM_HERNOEM_BESTAAND; break;\n#else\n\t\tcase 'e': antwoord = BBCIM_HERNOEM_BESTAAND; break;\n#endif\n\t\tcase 's': antwoord = BBCIM_SLA_OVER; break;\n\t\t}\n\t}\n\n\tif (antwoord == BBCIM_HERNOEM_NIEUW || antwoord == BBCIM_HERNOEM_BESTAAND) {\n\t\tprintf(\n\t\t\tTEKST_NL(\"nieuwe naam?\")\n\t\t\tTEKST_ENG(\"new name?\")\n\t\t\t);\n\t\tscanf(\"%49s\", nieuwe_naam);\n\t}\n\n\treturn antwoord;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/overschrijf.h",
    "content": "/* BBCIM: Acorn BBC computer diskimage manipulation\n *\n * overschrijf.h\n * Copyright (C) W.H.Scholten 1996\n */\n\n#define BBCIM_OVERSCHRIJVEN     1\n#define BBCIM_HERNOEM_NIEUW     2\n#define BBCIM_HERNOEM_BESTAAND  3\n#define BBCIM_SLA_OVER          4\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/_ansi_console.h",
    "content": "#ifndef _whs_console_h\n#define _whs_console_h\n\n/* Comment out if your console has no ANSI colours or you don't want to use colours: */\n#ifndef USE_ANSI_COLOURS\n#  error \"define USE_ANSI_COLOURS 1 or 0\"\n#endif\n\n#if USE_ANSI_COLOURS==1\n\n/* ANSI colour sequences */\n#define CONSOLE_RESTORE       \"\\033[0m\"\n#define CONSOLE_BOLD          \"\\033[1m\"\n#define CONSOLE_ITALIC        \"\\033[3m\" /* Usually not supported */\n#define CONSOLE_UNDERLINE     \"\\033[4m\" /* Not supported on standard FreeBSD terminal for example */\n#define CONSOLE_INVERT        \"\\033[7m\"\n#define CONSOLE_BLINK         \"\\033[5m\"\n#define CONSOLE_BLINK_OFF     \"\\033[25m\"\n\n\n#define CONSOLE_BLACK         \"\\033[30m\"\n#define CONSOLE_RED           \"\\033[31m\"\n#define CONSOLE_GREEN         \"\\033[32m\"\n#define CONSOLE_YELLOW        \"\\033[33m\"\n#define CONSOLE_BLUE          \"\\033[34m\"\n#define CONSOLE_MAGENTA       \"\\033[35m\"\n#define CONSOLE_CYAN          \"\\033[36m\"\n#define CONSOLE_WHITE         \"\\033[37m\"\n\n\n#define CONSOLE_GRAY          \"\\033[1;30m\" /* bright black */\n\n\n#define CONSOLE_BG_BLACK      \"\\033[40m\"\n#define CONSOLE_BG_RED        \"\\033[41m\"\n#define CONSOLE_BG_GREEN      \"\\033[42m\"\n#define CONSOLE_BG_YELLOW     \"\\033[43m\"\n#define CONSOLE_BG_BLUE       \"\\033[44m\"\n#define CONSOLE_BG_MAGENTA    \"\\033[45m\"\n#define CONSOLE_BG_CYAN       \"\\033[46m\"\n#define CONSOLE_BG_WHITE      \"\\033[47m\"\n\n\n\n#else /* No ANSI colours */\n#define CONSOLE_RESTORE       \"\"\n#define CONSOLE_BOLD          \"\"\n#define CONSOLE_ITALIC        \"\"\n#define CONSOLE_UNDERLINE     \"\"\n#define CONSOLE_INVERT        \"\"\n#define CONSOLE_BLINK         \"\"\n#define CONSOLE_BLINK_OFF     \"\"\n\n#define CONSOLE_BLACK         \"\"\n#define CONSOLE_RED           \"\"\n#define CONSOLE_GREEN         \"\"\n#define CONSOLE_YELLOW        \"\"\n#define CONSOLE_BLUE          \"\"\n#define CONSOLE_MAGENTA       \"\"\n#define CONSOLE_CYAN          \"\"\n#define CONSOLE_WHITE         \"\"\n#define CONSOLE_GRAY          \"\"\n\n\n#define CONSOLE_GRAY          \"\"\n\n\n#define CONSOLE_BG_BLACK      \"\"\n#define CONSOLE_BG_RED        \"\"\n#define CONSOLE_BG_GREEN      \"\"\n#define CONSOLE_BG_YELLOW     \"\"\n#define CONSOLE_BG_BLUE       \"\"\n#define CONSOLE_BG_MAGENTA    \"\"\n#define CONSOLE_BG_CYAN       \"\"\n#define CONSOLE_BG_WHITE      \"\"\n\n\n#endif\n\n#endif /*  _whs_console_h */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/_bbc_crc.c",
    "content": "/* bbc_crc.h, Copyright (C) W.H.Scholten 2009-2014\n *\n * Calculates CRCs using the algorithm from the BBC microcomputer user guide p.399\n */\n\n#include <stdio.h>\n\n#include \"_bbc_crc.h\"\n\nint bbc_fcrc(char *bestand, int verbose) {\n\tFILE *fp;\n\tunsigned long length;\n\tunsigned int crc;\n\n\n\tlength = 0;\n\tcrc = 0;\n\n\tfp = fopen(bestand, \"rb\");\n\tif (fp == NULL) {\n\t\tif (verbose) printf(\"Unable to open %s\\n\", bestand);\n\t\treturn -1;\n\t}\n\n\twhile (1) {\n\t\tunsigned char filebyte;\n\t\tint  k;\n\n\t\tif (!fread(&filebyte, 1, 1, fp)) break;\n\t\t/* if (feof(fp)) break; */\n\t\tlength++;\n\t\tcrc ^= (filebyte << 8);\n\t\tfor(k=0; k<8; k++) {\n\t\t\tif (crc & 32768) crc = (((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\telse crc <<= 1;\n\t\t}\n\t}\n\tfclose(fp);\n\n\treturn crc;\n}\n\n\nint bbc_data_crc(void *data, int length) {\n\tint  i;\n\tunsigned char *d = (unsigned char *) data;\n\tunsigned int crc;\n\n\tcrc = 0;\n\n\tfor (i=0; i<length; i++) {\n\t\tint  k;\n\n\t\tcrc ^= ((*d++) << 8);\n\t\tfor(k=0; k<8; k++) {\n\t\t\tif (crc & 32768) crc = (((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\telse crc <<= 1;\n\t\t}\n\t}\n\n\treturn crc;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/_bbc_crc.h",
    "content": "/* bbc_crc.h, by W.H.Scholten 2009-2014\n *\n * Calculates CRCs using the algorithm from the BBC microcomputer user guide p.399\n */\n\nint bbc_fcrc(char *bestand, int verbose);\nint bbc_data_crc(void *data, int length);\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/_bbc_filenames.c",
    "content": "/* _bbc_filenames.c\n *\n * By W.H.Scholten 1996-2001,2009\n * This file is released to the public domain.\n */\n\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"_bbc_filenames.h\"\n\n/* Following code is from bbcim 0.99: */\nchar _bbc_filename_chars_bad[]     = { '\\\\', '/', ':', '*', '?', '\\\"', '<', '>', '|', '`', '\\'' };\nchar _bbc_filename_chars_replace[] = { '_' , '_', '_', '_', '_', '_' , '_', '_', '_', '_', '_'  };\n\n/* Number of char's to be checked for replacement */\n#define  no_filename_chars  (sizeof(_bbc_filename_chars_bad) / sizeof(char))\n\nvoid bbc_replace_bad_chars(char *unix_bbcfile_naam) {\n\t/* Name check: replace certain characters in filenames (most filesystems\n\t * can't handle all characters from bbc filenames)\n\t */\n\tint i,j;\n\n\tfor (j=0; j<strlen(unix_bbcfile_naam); j++) {\n\t\tif (unix_bbcfile_naam[j] < 32 || unix_bbcfile_naam[j] > 126)\n\t\t\tunix_bbcfile_naam[j] = '_';\n\t\telse {\n\t\t\tfor (i=0; i<no_filename_chars; i++) {\n\t\t\t\tif (unix_bbcfile_naam[j] == _bbc_filename_chars_bad[i]) {\n\t\t\t\t\tunix_bbcfile_naam[j] = _bbc_filename_chars_replace[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/* returns True if all chars are printable (>=32 and <=126), False if not;\n * Unprintable characters are replaced by '?' */\nint bbc_printable_bbcfilename(char *name) {\n\tint printable = True;\n\tint i;\n\n\tfor (i=strlen(name)-1; i>=0; i--) {\n\t\tif (((unsigned char)name[i]) < 32 || ((unsigned char)name[i]) > 126) {\n\t\t\tname[i] = '?';\n\t\t\tprintable = False;\n\t\t}\n\t}\n\n\treturn printable;\n}\n\n\n/* Rename a file by appending a number.\n * The function checks to see whether that file exists, if not it returns with value 1.\n * If the file name is too long it returns with value -1 without completing the task.\n */\nint bbc_rename_sequential(char *name) {\n\tFILE *fp;\n\tstatic char new_name[ 256 ];\n\tint i = 0;\n\n\tif (strlen(name) > 250) return -1;\n\n\tstrcpy(new_name, name);\n\tfor(;;) {\n\t\tfp = fopen(new_name, \"r\");\n\t\tif (fp == NULL) break;\n\t\tfclose(fp);\n\t\tstrcpy(new_name, name);\n\t\tsprintf(new_name+strlen(new_name), \"%d\", i);\n\t\ti++;\n\t\tif (i > 100000) return -1; /* resulting name is too long */\n\t}\n\tstrcpy(name, new_name);\n\n\treturn 1;\n}\n\n\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/_bbc_filenames.h",
    "content": "/* bbc_filenames.h, by W.H.Scholten 2009-2014\n *\n * This is about renaming files due to issues with BBC micro file names\n * having characters that can't be represented on other systems, etc.\n */\n\nvoid bbc_replace_bad_chars(char *unix_bbcfile_naam);\nint bbc_printable_bbcfilename(char *name);\nint bbc_rename_sequential(char *name);\n\n#if !defined(True)\n# define True  1\n# define False 0\n#endif\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/_read_write_wrappers.c",
    "content": "/* _read_write_wrappers.c, Copyright (C) W.H.Scholten 2001,2002,2014\n *\n * Read/write wrappers (signals etc. can cause short read/write counts)\n */\n\n#ifndef _whs__read_write_wrappers_c\n#define _whs__read_write_wrappers_c\n\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/uio.h>\n#include <unistd.h>\n#include <stdlib.h>\n\n#include <errno.h>\n/* Prototypes: */\nint my_write(int fd, void *data, int nbytes);\nint my_read(int fd, void *data, int nbytes);\nint my_fwrite(FILE *fp, void *data, int length, char *fn);\nint my_fread(FILE *fp, void *data, int length, char *fn);\n\n\n/* low level io: write/read wrappers: */\nint my_write(int fd, void *data, int nbytes) {\n\tint bytes_written = 0;\n\tint bytes_left = nbytes;\n\n\tfor (;;) {\n\t\tint st = write(fd, data, bytes_left);\n\t\tif (st < 0 && errno != EINTR) {\n\t\t\t//perror(write_file);\n\t\t\t//exit(1);\n\t\t\treturn -1;\n\t\t}\n\t\tbytes_written += st;\n\t\tbytes_left -= st;\n\t\tif (bytes_written == nbytes) break;\n\t}\n\n\treturn bytes_written;\n}\n\n\nint my_read(int fd, void *data, int nbytes) {\n\tint bytes_read = 0;\n\tint bytes_left = nbytes;\n\n\tfor (;;) {\n\t\tint st = read(fd, data, bytes_left);\n\t\tif (st < 0 && errno != EINTR) {\n\t\t\tperror(\"my_read\");\n\t\t\t//perror(write_file);\n\t\t\t//exit(1);\n\t\t\treturn -1;\n\t\t}\n\t\tbytes_read += st;\n\t\tbytes_left -= st;\n\t\tif (bytes_read == nbytes || st == 0) break; /* done or EOF */\n\t}\n\n\treturn bytes_read;\n}\n\n#if 0\nint my_read_byte(int fd) {\n\tunsigned char my_byte;\n\tfor (;;) {\n\t\tint st = read(fd, &my_byte, 1);\n\t\tif (st < 0 && errno != EINTR) {\n\t\t\tperror(\"write byte\");\n\t\t\texit(1);\n\t\t}\n\t\tif (st == 1) break;\n\t}\n\n\treturn my_byte;\n}\n#endif\n\n\n/* stdio: fwrite/fread wrappers: */\nint my_fwrite(FILE *fp, void *data, int length, char *fn) {\n\tint  st;\n\tst = fwrite(data, 1, length, fp);\n\n\tif (st != length) {\n\t\tperror(fn);\n\t\texit(1);\n\t}\n\n\treturn 0;\n}\n\n/*  -> returns the number of bytes NOT read */\nint my_fread(FILE *fp, void *data, int length, char *fn) {\n\tint  st;\n\tst = fread(data, 1, length, fp);\n\n\tif (st != length) {\n\t\tif (!feof(fp)) {\n\t\t\tperror(fn);\n\t\t\texit(1);\n\t\t}\n\t}\n\n\treturn length-st;\n}\n\n#endif /* _whs__read_write_wrappers_c */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/_read_write_wrappers.h",
    "content": "/* _read_write_wrappers.h, by W.H.Scholten 2001,2002,2014\n *\n * Read/write wrappers (signals etc. can cause short read/write counts)\n */\n#ifndef _whs__read_write_wrappers_h\n#define _whs__read_write_wrappers_h\n\n#include <stdio.h>\nint my_write(int fd, void *data, int nbytes);\nint my_read(int fd, void *data, int nbytes);\nint my_fwrite(FILE *fp, void *data, int length, char *fn);\nint my_fread(FILE *fp, void *data, int length, char *fn);\n\n#endif /* _whs__read_write_wrappers_h */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/ARCHIVE_FORMAT-0.83",
    "content": "Standard formats for BBC files and disk images v 0.83\n-----------------------------------------------------\n[ N.B. This specification was originally included with bbcim v0.83 ]\n\nNote: optional arguments are in square  brackets, '|' denotes a choice\nbetween arguments.\n\n\nTHE ARCHIVE FILE FORMAT:\n------------------------\n(i.e. the standard format for/of files in the BBC micro archive of\nsoftware on my website)\n\n[ N.B.  At the  time of writing  this down  (1997), my BBC  archive of\nsoftware was  almost all the software  for the BBC  micro available on\nthe internet (Robert  Schmidt's archive was mostly a  mirror of what I\nput up), and I  wanted to get rid of diskimages so  you could pick and\nchoose software to put into a  disk yourself. So, 'the archive' was my\narchive of BBC software. ]\n\n\n  Complementing  a  bare  BBC  file  'ELITE'  is  the  attribute  file\n'ELITE.inf' , which  is a text file containing  '$.ELITE FF0E00 FF8023\nLocked CRC=XXXX NEXT  ELITEdata'.  ELITE is just the  name used on the\nhost  system  (as  BBC  files  often  contain  characters  that  other\nfilesystems can't  handle such  as '/') and  $.ELITE in  the attribute\nfile is the real name.\n\n  In general we have:\n  - A BBC file, 'myprog'\n  - A text file 'myprog.inf' which contains:\n\n{TAPE <tfs_filename> | <dfs_filename>} <load address> <exec address> [<file length>] ['Locked'] CRC=<xxxx> [NEXT <next filename>]\n\n  Arguments are separated by spaces.\n\n  Cassette names can be used in 2 ways;\n  1. translated to $.<cassette_name> (i.e.  max 12 chars)\n  2. TAPE <cassette name>\n\n  Note that for complete  accuracy, TAPE <cassette name> is preferable\nas it identifies a file as a TAPE file, where 'Locked' has a different\nmeaning to that for disks, and NEXT can be used (see below).\n\n  Programs  handling  archive  format  files  should be  aware  of  12\ncharacter filenames from tapes ($.tape-name) and should rename them if\nnecessary.\n\n  NEXT gives the next expected filename on the tape, which may be used\nfor  CHAIN\"\" or  *RUN  as used  on  cassette systems,  or  to put  the\nprograms back  on a tape  in the correct  order, so a  file containing\nTAPE should contain  NEXT too (unless it's the  last file).  Note that\n<next  filename> used for  NEXT must  be a  host filename,  as several\nfiles can have the same name on tape!\n\n  <load address> and <exec address> are hexadecimal strings (without a\nlanguage dependant identifier), e.g. FFFF8023.\n\n  <file length> is also a hexadecimal string and may be included after\n<exec address>) but is unnecessary.\n\n  The file attribute 'Locked' may be abbreviated to 'L'.\n\n  After 'CRC=' follows the bare file's CRC, as a hexadecimal string of\nup to four digits.\n  The CRC  is calculated  with the algorithm  from the BBC  user guide\np. 399  (The same  algorithm as  used in the  cassette and  rom filing\nsystem).  It is included for various reasons (to check file conversion\nsoftware, serial- or disk- file transfer to/from a BBC, etc.). See the\nappendix for a sample implementation.\n\n  Host filenames: It is recommended that files only use ASCII and none\nof the following  characters (due to the way they are  used in various\noperating systems): \\ / : * ? \" < > | . ` '\n\n\nTHE ARCHIVE DISK FORMAT:\n------------------------\n  Given a BBC  disk image, e.g. 'games', we have an accompanying  file\n('games.dsk'), which contains the following information:\n\n '<disktype> <sides> <tracks>T <sectorspertrack>S <bytespersector>B'\n\ne.g. DFS SS 40T 10S 256B.\n\n  After this line, any information about the disk image can be placed.\nThis should  be ignored by utilities  that only need  the disk format.\n\n=> Suggestions of useful standard information to put there?\n\n  If there's  no '.dsk' file, utilities should consider the disk image\nto be 'DFS SS 80T 10S 256B', i.e. standard Acorn DFS.\n\n\nAppendix: The CRC algorithm, example C code:\n--------------------------------------------\n\nlong bbcim_data_crc(void *data, int length) {\n\tint  i;\n\tunsigned char *d = (unsigned char *) data;\n\tunsigned int crc;\n\n\tcrc = 0;\n\n\tfor (i=0; i<length; i++) {\n\t\tint  k;\n\n\t\tcrc ^= ((*d++) << 8);\n\t\tfor(k=0; k<8; k++) {\n\t\t\tif (crc & 32768) crc = (((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\telse crc <<= 1;\n\t\t}\n\t}\n\n\treturn crc;\n}\n\n----\n\nWouter Scholten , 16-8-1997 & 18-4-2001\n\nEmail: swhs-web@xs4all.nl\nWeb page: http://wouter.bbcmicro.net/\n\n(previous email addresses:\n   whs@hccnet.nl,\n   wouter.scholten@wanadoo.nl,\n   whs@xs4all.nl,\n   wouters@cistron.nl)\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/EMAIL",
    "content": "Wouter Scholten:\n----------------\nemail: swhs-web@xs4all.nl\n\n\nprevious email addresses:\n - whs@hccnet.nl (23 jul 2003 - mid 2006)\n - wouter.scholten@wanadoo.nl (6 may 2001 - 22 jul 2003)\n - s_whs@hotmail.com (18 mar 2001 - 5 may 2001)\n - whs@xs4all.nl (23 mar 1999 - 22 mar 2001)\n - wouters@cistron.nl (jun 1995 - 22 mar 1999)\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/Makefile",
    "content": "SHELL=/bin/sh\n\nall:\n\tcd test; $(MAKE) all\n\nclean:\n\trm -f *~\n\tcd test; $(MAKE) clean\n\n\nALL_CFLAGS= -I/usr/local/include -O2 -g -Wall -Wfatal-errors\n\n# // Compile C files to object files.\n.c.o:\n\t$(CC) $(ALL_CFLAGS) -c -o $@ $<\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/READ_ME",
    "content": "Functions to read and write Acorn BBC microcomputer file and disk image attributes on a PC.\nCopyright (C) W.H.Scholten 1996-2014\n\n\nThe directory test contains a program to show these functions in action.\n\n\nFiles:\n------\nStructs:\n  struct bbc_archive__file_attr\n  struct bbc_archive__file\n\nFunctions:\n  int   bbc_archive__read_file_attributes(char *filename, struct bbc_archive__file_attr *file, int verbose);\n  void  bbc_archive__free_file_attributes(struct bbc_archive__file_attr *file);\n  char* bbc_archive__new_inf_filename(char *filename, int verbose); /* make .inf filename */\n  int   bbc_archive__is_inf_file(char *filename); /* Is the file a .inf file? */\n  int   bbc_archive__write_file_attributes(char *filename, struct bbc_archive__file_attr *file, int verbose);\n\n\n\nDiskimages:\n-----------\nDefinitions/types (integers):\n  bbc_archive__dfs_bootoption: BBCIM_DFS_BOOTOPTION_NONE, BBCIM_DFS_BOOTOPTION_LOAD, BBCIM_DFS_BOOTOPTION_RUN, BBCIM_DFS_BOOTOPTION_EXEC };\n\n  bbc_archive__disktype: BBC_ARCHIVE__UNKNOWN_DISK, BBC_ARCHIVE__DFS_DISK, BBC_ARCHIVE__DDOS_DISK, BBC_ARCHIVE__W62_DISK, BBC_ARCHIVE__SOLIDISK_DDFS_DISK, BBC_ARCHIVE__ADFS_DISK, BBC_ARCHIVE__HDFS_DISK };\n\nStructures:\n  struct bbc_archive__diskimage_attr\n  struct bbc_archive__diskimage\n\nFunctions:\n  int   bbc_archive__read_disk_attributes(char *diskname, struct bbc_archive__diskimage_attr *image, int verbose);\n  void  bbc_archive__free_disk_attributes(struct bbc_archive__diskimage_attr *disk);\n\n  char* bbc_archive__new_dsk_filename(char *diskname, int verbose); /* make .dsk filename */\n\n  int   bbc_archive__write_disk_attributes(char *diskname, struct bbc_archive__diskimage_attr *image, int verbose);\n  int   bbc_archive__write_disk_attributes2(char *diskname, int sides, int tracks, int sectors, int bytes, int type, int verbose);\n\n  int   bbc_archive__diskinfo_from_string(char *string, struct bbc_archive__diskimage_attr *image); /* Should be internal? But used in bbcim for command line processing */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/_bbc_archive.h",
    "content": "/* archive read attributes.h\n *\n * This file is public domain, by W.H.Scholten 1997-2001, 2009\n */\n\n#ifndef _BBC_ARCHIVE__archive_h\n#define _BBC_ARCHIVE__archive_h\n\n\n\n#define BBC_ARCHIVE__FILETYPE__TAPE  1\n#define BBC_ARCHIVE__FILETYPE__DFS   2\n\n\n#define BBC_ARCHIVE__ATTR__LOCKED   1 /* DFS & TAPE */\n\n#define BBC_ARCHIVE__ATTR__R        1 /* ADFS */\n#define BBC_ARCHIVE__ATTR__W        2\n#define BBC_ARCHIVE__ATTR__E        4\n#define BBC_ARCHIVE__ATTR__D        8\n\nstruct bbc_archive__file_attr {\n\t/* BBC filename/attributes */\n\tint  type; /* BBC_ARCHIVE__FILETYPE__TAPE etc. */\n    char *name; /* malloced */\n    unsigned int load_address;\n    unsigned int exec_address;\n    unsigned int length;\n    unsigned char attributes;\n\tint crc; /* 0-65535 for a valid crc, any other value denotes an invalid or no crc found; bbcim returns -1 in such a case */\n\tchar *next_tape_file; /* host filename! (malloced) */\n};\n\nstruct bbc_archive__file {\n\tstruct bbc_archive__file_attr *attr;\n\tchar *filename;\n\tchar *inf_filename;\n};\n\nenum bbc_archive__dfs_bootoption { BBCIM_DFS_BOOTOPTION_NONE, BBCIM_DFS_BOOTOPTION_LOAD, BBCIM_DFS_BOOTOPTION_RUN, BBCIM_DFS_BOOTOPTION_EXEC };\n\nenum bbc_archive__disktype { BBC_ARCHIVE__UNKNOWN_DISK, BBC_ARCHIVE__DFS_DISK, BBC_ARCHIVE__DDOS_DISK, BBC_ARCHIVE__W62_DISK, BBC_ARCHIVE__SOLIDISK_DDFS_DISK, BBC_ARCHIVE__ADFS_DISK, BBC_ARCHIVE__HDFS_DISK };\n\n//OLDstruct bbc_archive__disk_image {\n//OLD\tint  type; /* one of the above 'Disktype' */\n//OLD\tint  sides;\n//OLD\tint  tracks;\n//OLD\tint  sectors_per_track;\n//OLD\tint  bytes_per_sector;\n//OLD};\n\n\n\nstruct bbc_archive__diskimage_attr {\n    int  type; /* BBC_ARCHIVE__DFS_DISK, BBC_ARCHIVE__DDOS_DISK, BBC_ARCHIVE__W62_DISK, BBC_ARCHIVE__SOLIDISK_DDFS_DISK, BBC_ARCHIVE__ADFS_DISK, BBC_ARCHIVE__HDFS_DISK */\n    int  sides;\n    int  tracks;\n    int  sectors_per_track;\n    int  bytes_per_sector;\n};\n\nstruct bbc_archive__diskimage {\n\tstruct bbc_archive__diskimage_attr *attr;\n\tchar *filename;\n\tchar *dsk_filename;\n};\n\n\nint  bbc_archive__read_file_attributes(char *filename, struct bbc_archive__file_attr *file, int verbose);\nvoid bbc_archive__free_file_attributes(struct bbc_archive__file_attr *file);\n\nint  bbc_archive__read_disk_attributes(char *diskname, struct bbc_archive__diskimage_attr *image, int verbose);\nvoid bbc_archive__free_disk_attributes(struct bbc_archive__diskimage_attr *disk);\n\nchar *bbc_archive__new_inf_filename(char *filename, int verbose); /* make .inf filename */\nint bbc_archive__is_inf_file(char *filename); /* Is the file a .inf file? */\nchar *bbc_archive__new_dsk_filename(char *diskname, int verbose); /* make .dsk filename */\nint bbc_archive__write_file_attributes(char *filename, struct bbc_archive__file_attr *file, int verbose);\nint bbc_archive__write_disk_attributes(char *diskname, struct bbc_archive__diskimage_attr *image, int verbose);\nint bbc_archive__write_disk_attributes2(char *diskname, int sides, int tracks, int sectors, int bytes, int type, int verbose);\n\nint bbc_archive__diskinfo_from_string(char *string, struct bbc_archive__diskimage_attr *image); /* Should be internal? But used in bbcim for command line processing */\n\nextern char *bbc_archive__dfs_names[];\nextern char *bbc_archive__dfs_sides[];\n\n//extern int bbc_archive__errno;\n//extern char *bbc_archive__error;\n\n\n#endif /* _BBC_ARCHIVE__archive_h */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/_bbc_archive_read_attributes.c",
    "content": "/* _bbc_archive_read_attributes.c\n *\n * Functions to read Acorn BBC computer file attributes (.inf) and disk image attributes (.dsk)\n * These functions originated in 'bbcim'. Later separated for use in 'bbctape', 'bbccom' and other programs.\n\n\n   Copyright (C) W.H. Scholten 1996, 1997, 2001, 2003, 2009, 2014\n \n   Permission to use, copy, modify, distribute, and sell this software\n   and its documentation for any purpose is hereby granted without fee,\n   provided that the above copyright notice appear in all copies and\n   that both that copyright notice and this permission notice appear in\n   supporting documentation, and that the name of the copyright holder\n   not be used in advertising or publicity pertaining to distribution\n   of the software without specific, written prior permission. The\n   copyright holder makes no representations about the suitability of\n   this software for any purpose. It is provided \"as is\" without express\n   or implied warranty.\n  \n   THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n   SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n   FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n   SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n   RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n   CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n\n#include <_bbc_archive.h>\n\n/* Prototypes for internal functions: */\nint bbc_archive__string_to_hex(char *string, unsigned int *hex);\nvoid skip_whitespace(char *string, int *ptr);\nvoid skip_nonwhitespace(char *string, int *ptr);\nint bbc_archive__diskinfo_from_string(char *string, struct bbc_archive__diskimage_attr *image);\n\n\n/* Returns 0 if ok, anything else if not */\nint bbc_archive__string_to_hex(char *string, unsigned int *hex) {\n\tunsigned int  i = 0;\n\tint  st;\n\n\tfor (i=0; i<strlen(string); i++) {\n\t\tif (string [ i ] != ' ') break;\n\t}\n\n\tst = 0;\n\tfor (   ; i<strlen(string); i++) {\n\t\tif (!isxdigit(string [ i ])) { st = -1; break; }\n\t}\n\tif (st == 0) st = sscanf(string, \"%x\", hex) - 1;\n\n\treturn st;\n}\n\n\nvoid skip_whitespace(char *string, int *ptr) {\n\twhile(string[*ptr] == ' ' || string[*ptr] == '\\t' || string[*ptr] == '\\n' || string[*ptr] == '\\r')\n\t\t(*ptr)++;\n}\n\n\nvoid skip_nonwhitespace(char *string, int *ptr) {\n\twhile(string[*ptr] != ' ' && string[*ptr] != '\\t' && string[*ptr] != '\\n' && string[*ptr] != '\\r' && string[*ptr] != 0)\n\t\t(*ptr)++;\n}\n\n\nint bbc_archive__read_file_attributes(char *filename, struct bbc_archive__file_attr *file_attr, int verbose) {\n\tchar *info_arg[] = {\n\t\t\"TAPE\", \"filename\", \"load address\", \"exec address\", \"length\", \"locked\", \"CRC=\", \"crc\", \"NEXT\", \"next tapefile\"\n\t};\n//\tint  info_optional[] = { 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1 };\n\tint  info_optional[] = { 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; /* Optional CRC */\n\tint  st;\n\tchar *filename_inf = NULL;\n\tFILE *fp_inf = NULL;\n\tchar line[ 257 ];\n\tint  item_wanted;\n\tint  status = -1; /* function's return status */\n\n\tfile_attr->name = NULL;\n\tfile_attr->next_tape_file = NULL;\n\tfile_attr->crc = -1;\n\n\tfilename_inf = (char *) malloc(strlen(filename)+1+4);\n\tif (filename_inf == NULL) {\n\t\tfprintf(stderr, \"Out of memory\\n\");\n\t\treturn -1;\n\t}\n\n\tstrcpy(filename_inf, filename);\n\tstrcat(filename_inf, \".inf\");\n\n\tfp_inf = fopen(filename_inf, \"r\");\n\tif (fp_inf == NULL) {\n\t\tif (verbose) printf(\"Unable to open %s\\n\", filename_inf);\n\t\tgoto leave_read_file_attributes;\n\t}\n\n#define BBC_ARCHIVE_ATTR_TAPE          0\n#define BBC_ARCHIVE_ATTR_NAME          1\n#define BBC_ARCHIVE_ATTR_LOADADDR      2\n#define BBC_ARCHIVE_ATTR_EXECADDR      3\n#define BBC_ARCHIVE_ATTR_LENGTH        4\n#define BBC_ARCHIVE_ATTR_LOCKED        5\n#define BBC_ARCHIVE_ATTR_CRCEQUALS     6\n#define BBC_ARCHIVE_ATTR_CRC           7\n#define BBC_ARCHIVE_ATTR_NEXT          8\n#define BBC_ARCHIVE_ATTR_NEXTTAPEFILE  9\n\n\titem_wanted = BBC_ARCHIVE_ATTR_TAPE;\n\n\n\tfgets(line, 256, fp_inf);\n\tline[256] = 0;\n\n\tint str_start = 0;\n\tint str_end = 0;\n\tchar string[256];\n\n\tfor (;;) {\n\t\tstr_start = str_end;\n\t\tskip_whitespace(line, &str_start);\n\t\tstr_end = str_start;\n\t\tskip_nonwhitespace(line, &str_end);\n\t\tif (str_end == str_start) {\n\t\t\twhile (info_optional[ item_wanted ] && item_wanted <= BBC_ARCHIVE_ATTR_NEXTTAPEFILE) item_wanted ++;\n\t\t\tif (item_wanted >= BBC_ARCHIVE_ATTR_NEXTTAPEFILE) break;\n\n\t\t\tif (verbose) fprintf(stderr, \"%s: missing argument (%d: %s)\\n\", filename_inf, item_wanted, info_arg[ item_wanted ]);\n\t\t\tgoto leave_read_file_attributes;\n\t\t}\n\t\tstrncpy(string, line+str_start, str_end - str_start);\n\t\tstring[str_end - str_start] = 0;\n\t\t//printf(\"string=%s (len=%d)\\n\", string, strlen(string));\n\n\n\t\tswitch (item_wanted) {\n\t\tcase BBC_ARCHIVE_ATTR_TAPE:\n\t\t\tif (!strcmp(string, \"TAPE\")) {\n\t\t\t\titem_wanted ++;\n\t\t\t\tfile_attr->type = BBC_ARCHIVE__FILETYPE__TAPE;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* Disk file */\n\t\t\tfile_attr->type = BBC_ARCHIVE__FILETYPE__DFS;\n\t\t\t/* Fall through .. */\n\t\t\titem_wanted ++;\n\n\t\tcase BBC_ARCHIVE_ATTR_NAME:\n\t\t\tif (file_attr->type == BBC_ARCHIVE__FILETYPE__DFS) {\n\t\t\t\tfile_attr->name = strdup(string);\n\t\t\t\tif (file_attr->name == NULL) {\n\t\t\t\t\tfprintf(stderr, \"Out of memory\\n\");\n\t\t\t\t\texit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (file_attr->type == BBC_ARCHIVE__FILETYPE__TAPE) {\n\t\t\t\tint  i;\n\n\t\t\t\tfile_attr->name = (char *) malloc(strlen(string)+1+2);\n\n\t\t\t\tif (strlen(string) > 10) {\n\t\t\t\t\tif (verbose) fprintf(stderr, \"%s: tape name %s: too long\\n\", filename_inf, string);\n\t\t\t\t\tgoto leave_read_file_attributes;\n\t\t\t\t}\n\n\t\t\t\t/* Tape filenames converted to $.<tapename> for uniform\n\t\t\t\t * handling of tape/disk. */\n\t\t\t\tfile_attr->name[0] = '$';\n\t\t\t\tfile_attr->name[1] = '.';\n\t\t\t\tfor (i=strlen(string); i>=0; i--) file_attr->name[i+2] = string[i];\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase BBC_ARCHIVE_ATTR_LOADADDR:\n\t\t\tst = bbc_archive__string_to_hex(string, &file_attr->load_address);\n\n\t\t\tif (st != 0) {\n\t\t\t\tif (verbose) fprintf(stderr, \"%s: read load address failed\\n\", filename_inf);\n\t\t\t\tgoto leave_read_file_attributes;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BBC_ARCHIVE_ATTR_EXECADDR:\n\t\t\tst = bbc_archive__string_to_hex(string, &file_attr->exec_address);\n\t\t\tif (st != 0) {\n\t\t\t\tif (verbose) fprintf(stderr, \"%s: read exec address failed\\n\", filename_inf);\n\t\t\t\tgoto leave_read_file_attributes;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BBC_ARCHIVE_ATTR_LENGTH:\n\t\t\tst = bbc_archive__string_to_hex(string, &file_attr->length);\n\t\t\tif (st == 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/* Fall through .. */\n\t\t\titem_wanted ++;\n\n\t\tcase BBC_ARCHIVE_ATTR_LOCKED:\n\t\t\tfile_attr->attributes = 0;\n\t\t\tif ((!strcmp(string, \"L\")) || (!strcmp(string, \"Locked\"))) {\n\t\t\t\tfile_attr->attributes |= BBC_ARCHIVE__ATTR__LOCKED;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* Fall through .. */\n\t\t\titem_wanted ++;\n\n\t\tcase BBC_ARCHIVE_ATTR_CRCEQUALS:\n\t\t\t//printf(\"BBC_ARCHIVE_ATTR_CRCEQUALS:\\n\");\n\t\t\tif (!strncmp(string, \"CRC=\", 4)) {\n\t\t\t\tstr_end = str_start+4;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t//if (debug) printf(\"CRC not found\\n\");\n\t\t\t\t/* Crc not found */\n\t\t\t\t//file_attr->crc = -1;\n\t\t\t\t/* should be a fatal error */\n\t\t\t\t//goto leave_read_file_attributes;\n\t\t\t\titem_wanted ++; /* skip BBC_ARCHIVE_ATTR_CRC */\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BBC_ARCHIVE_ATTR_CRC:\n\t\t\t//printf(\"BBC_ARCHIVE_ATTR_CRC:\\n\");\n\t\t{\n\t\t\tunsigned int tmp_crc;\n\t\t\tst = bbc_archive__string_to_hex(string, &tmp_crc);\n\t\t\tfile_attr->crc = (int) tmp_crc;\n\t\t}\n\t\t\tif (st != 0) {\n\t\t\t\tfile_attr->crc = -1;\n\t\t\t\t/* not a fatal error */\n\t\t\t\t//goto leave_read_file_attributes;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t/* Check the range */\n\t\t\t\tif (file_attr->crc < 0 || file_attr->crc > 65535) {\n\t\t\t\t\tfile_attr->crc = -1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BBC_ARCHIVE_ATTR_NEXT:\n\t\t\tif (strcmp(string, \"NEXT\")) item_wanted ++; /* no NEXT so skip NEXTTAPEFILE */\n\t\t\tbreak;\n\t\tcase BBC_ARCHIVE_ATTR_NEXTTAPEFILE:\n\t\t\tfile_attr->next_tape_file=strdup(string);\n\t\t\tbreak;\n\t\t} /* case */\n\n\t\titem_wanted ++;\n\n\t}\n\n\tstatus = 0;\n\n  leave_read_file_attributes:\n\tif (filename_inf) free(filename_inf);\n\tif (fp_inf) fclose(fp_inf);\n\n\treturn status;\n}\n\n\nvoid bbc_archive__free_file_attributes(struct bbc_archive__file_attr *file_attr) {\n\tif (file_attr->name)\n\t\tfree(file_attr->name);\n\n\tif (file_attr->next_tape_file)\n\t\tfree(file_attr->next_tape_file);\n}\n\n\n/* Should be internal? But used in bbcim for command line processing */\nint bbc_archive__diskinfo_from_string(char *string, struct bbc_archive__diskimage_attr *image) {\n\tif (!strncmp(string, \"DFS\", 10)) image->type = BBC_ARCHIVE__DFS_DISK;\n\telse if (!strncmp(string, \"W62\", 10)) image->type = BBC_ARCHIVE__W62_DISK;\n\telse if (!strncmp(string, \"DDOS\", 10)) image->type = BBC_ARCHIVE__DDOS_DISK;\n\telse if (!strncmp(string, \"SOLIDISK_DDFS\", 20)) image->type = BBC_ARCHIVE__SOLIDISK_DDFS_DISK;\n\telse if (!strncmp(string, \"ADFS\", 10)) image->type = BBC_ARCHIVE__ADFS_DISK;\n\telse if (!strncmp(string, \"HDFS\", 10)) image->type = BBC_ARCHIVE__HDFS_DISK;\n\telse if (!strncmp(string, \"DS\", 10)) image->sides = 2;\n\telse if (!strncmp(string, \"SS\", 10)) image->sides = 1;\n\telse return -1;\n\n\treturn 0;\n}\n\n\nint bbc_archive__read_disk_attributes(char *diskname, struct bbc_archive__diskimage_attr *image_attr, int verbose) {\n\tFILE *fpdsk;\n\tchar *dsk;\n\tchar type [ 11 ];\n\tchar sides [ 11 ];\n\tint  status = -1;\n\n\tdsk = (char *) malloc(strlen(diskname)+1+4);\n\tif (dsk == NULL) {\n\t\tfprintf(stderr, \"Out of memory\\n\");\n\t\treturn -1;\n\t}\n\tstrcpy(dsk, diskname);\n\tstrcat(dsk, \".dsk\");\n\n\tfpdsk = fopen(dsk, \"r\");\n\tif (fpdsk == NULL) {\n\t\tif (verbose) fprintf(stderr, \"Unable to open %s\\n\", dsk);\n\t\treturn -1;\n\t}\n\n\t/* Read disk attributes */\n\tif (fscanf(fpdsk, \"%10s %10s %dT %dS %dB\", type, sides, &image_attr->tracks, &image_attr->sectors_per_track, &image_attr->bytes_per_sector) != 5) {\n\t\tif (verbose) fprintf(stderr, \"Bad .dsk format\\n\");\n\t\tgoto leave_read_disk_attributes;\n\t}\n\n\tif (bbc_archive__diskinfo_from_string(type, image_attr) || bbc_archive__diskinfo_from_string(sides, image_attr)) {\n\t\tif (verbose) fprintf(stderr, \"Bad .dsk format\\n\");\n\t\tgoto leave_read_disk_attributes;\n\t}\n\tstatus = 0;\n\n  leave_read_disk_attributes:\n\tif (dsk) free(dsk);\n\tif (fpdsk) fclose(fpdsk);\n\n\treturn status;\n}\n\n\nvoid bbc_archive__free_disk_attributes(struct bbc_archive__diskimage_attr *disk) {\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/_bbc_archive_write_attributes.c",
    "content": "/*  _bbc_archive_write_attributes.c\n *\n * Functions to write Acorn BBC computer file attributes (.inf) and disk image attributes (.dsk)\n * These functions originated in 'bbcim'. Later separated for use in 'bbctape', 'bbccom' and other programs.\n \n \n   Copyright (C) W.H. Scholten 1996, 1997, 2001, 2003, 2009, 2014\n \n   Permission to use, copy, modify, distribute, and sell this software\n   and its documentation for any purpose is hereby granted without fee,\n   provided that the above copyright notice appear in all copies and\n   that both that copyright notice and this permission notice appear in\n   supporting documentation, and that the name of the copyright holder\n   not be used in advertising or publicity pertaining to distribution\n   of the software without specific, written prior permission. The\n   copyright holder makes no representations about the suitability of\n   this software for any purpose. It is provided \"as is\" without express\n   or implied warranty.\n  \n   THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n   SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n   FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n   SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n   RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n   CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n\n\n#include <_bbc_archive.h>\n\n/* Return 1 if a file is a bbc attributes file, 0 if not */\nint bbc_archive__is_inf_file(char *filename) {\n\tint l = strlen(filename);\n\tif (l > 4)\n\t\tif (!strncmp(filename+l-4, \".inf\", 4)) return 1;\n\n\treturn 0;\n}\n\n\n/* Allocate space for and make a .inf filename corresponding to the given\n * bare file's filename. */\n\n//char *bbc_archive__new_inf_filename(char *filename, struct bbc_error *error) {\n\n\nchar *bbc_archive__new_inf_filename(char *filename, int verbose) {\n\tchar *inf_file = malloc(strlen(filename) + 1 + 4);\n\tif (inf_file) {\n\t\tstrcpy(inf_file, filename);\n\t\tstrcat(inf_file, \".inf\");\n\t}\n\telse {\n//\t\tbbc_error__set_error(BBC_ERROR__OUT_OF_MEMORY, 0);\n//\t\tif (verbose) fprintf(stderr, \"create .inf file with %s: %s\\n\", filename, bbc_archive__error);\n\t\tif (verbose) fprintf(stderr, \"create .inf file with %s: Out of memory\\n\", filename);\n\t}\n\n\treturn inf_file;\n}\n\n\n/* Allocate space for and make a .dsk filename corresponding to the given\n * bare diskimage's filename. */\nchar *bbc_archive__new_dsk_filename(char *diskname, int verbose) {\n\tchar *dsk_file = malloc(strlen(diskname) + 1 + 4);\n\tif (dsk_file) {\n\t\tstrcpy(dsk_file, diskname);\n\t\tstrcat(dsk_file, \".dsk\");\n\t}\n\telse {\n//\t\tbbc_error__set_error(BBC_ERROR__OUT_OF_MEMORY, 0);\n//\t\tif (verbose) fprintf(stderr, \"create .dsk file with %s: %s\\n\", diskname, bbc_archive__error);\n\t\tif (verbose) fprintf(stderr, \"create .dsk file with %s: Out of memory\\n\", diskname);\n\t}\n\n\treturn dsk_file;\n}\n\n\n/* */\n//int bbc_archive__write_file_attributes(char *filename, struct bbcim_file *file, int verbose)\nint bbc_archive__write_file_attributes(char *filename, struct bbc_archive__file_attr *file, int verbose) {\n\tchar *inf = bbc_archive__new_inf_filename(filename, verbose);\n\n\tif (inf) {\n\t\tFILE *fpinf = fopen(inf, \"wb\");\n\t\tif (fpinf) {\n//\t\t\tfprintf(fpinf, \"%s %8X %8X %s CRC=%4X\\n\", file->attributes->name, file->attributes->load_address, file->attributes->exec_address, (file->attributes->attributes & BBC_ARCHIVE__ATTR__LOCKED) ? \"Locked\" : \"\",  file->attributes->crc);\n\t\t\tfprintf(fpinf, \"%s %8X %8X%s\", file->name, file->load_address, file->exec_address, (file->attributes & BBC_ARCHIVE__ATTR__LOCKED) ? \" Locked\" : \"\");\n\t\t\tif (file->crc >= 0) fprintf(fpinf, \" CRC=%4X\", file->crc);\n\t\t\tfprintf(fpinf, \"\\n\");\n\t\t\tfclose(fpinf);\n\t\t}\n\t\telse {\n\t\t\tif (verbose) fprintf(stderr, \"create .inf file failed\\n\");\n\t\t\tfree(inf);\n\t\t\treturn -1;\n\t\t}\n\t\tfree (inf);\n\t}\n\telse return -1;\n\n\treturn 0;\n}\n\nchar *bbc_archive__dfs_names[] = { \"Unknown\", \"DFS\", \"DDOS\", \"W62\", \"SOLIDISK_DDFS\", \"ADFS\", \"HDFS\" };\nchar *bbc_archive__dfs_sides[] = { \"SS\", \"DS\" };\n\nint bbc_archive__write_disk_attributes2(char *diskname, int sides, int tracks, int sectors, int bytes, int type, int verbose) {\n\tstruct bbc_archive__diskimage image;\n\tstruct bbc_archive__diskimage_attr image_attr;\n\n\timage.attr = &image_attr;\n\n\timage.attr->type = type;\n\timage.attr->sides = sides;\n\timage.attr->tracks = tracks;\n\timage.attr->sectors_per_track = sectors;\n\timage.attr->bytes_per_sector = bytes;\n\n\timage.filename = diskname;\n\n\treturn bbc_archive__write_disk_attributes(diskname, &image_attr, verbose);\n}\n\n\n//int bbc_archive__write_disk_attributes(struct bbc_archive__diskimage *image, int verbose) {\nint bbc_archive__write_disk_attributes(char *filename, struct bbc_archive__diskimage_attr *image_attr, int verbose) {\n\tchar *dsk = bbc_archive__new_dsk_filename(filename, verbose);\n\n\tif (dsk) {\n\t\tFILE *fpdsk = fopen(dsk, \"wb\");\n\t\tif (fpdsk) {\n//\t\t\tfprintf(fpdsk, \"%s %s %dT %dS %dB\\n\", bbc_archive__dfs_names[ image->attributes->type ], bbc_archive__dfs_sides[ image->attributes->sides ], image->attributes->tracks, image->attributes->sectors_per_track, image->attributes->bytes_per_sector);\n\t\t\tfprintf(fpdsk, \"%s %s %dT %dS %dB\\n\", bbc_archive__dfs_names[ image_attr->type ], bbc_archive__dfs_sides[ image_attr->sides-1 ], image_attr->tracks, image_attr->sectors_per_track, image_attr->bytes_per_sector);\n\t\t\tfclose(fpdsk);\n\t\t}\n\t\telse {\n\t\t\tif (verbose) fprintf(stderr, \"create .dsk file failed\\n\");\n\t\t\tfree(dsk);\n\t\t\treturn -1;\n\t\t}\n\t\tfree (dsk);\n\t}\n\telse return -1;\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/_weg/archive_error.c",
    "content": "int bbc_error__errno;\nchar *bbc_error__message;\n\n\nstruct bbc_error {\n\tint type;\n\tchar *message;\n\tint verbose;\n}\n\nint bbc_error__set_error(int errorno, int verbose) {\n\tswitch (errorno) {\n\tcase BBC_ERROR__OPEN_FAILED:\n\t\tbbc_error__message = \"Open file failed\";\n\t\tbreak;\n\tcase BBC_ERROR__OUT_OF_MEMORY:\n\t\tbbc_error__message = \"Out of memory\";\n\t\tbreak;\n\n\tcase BBC_ERROR__GENERIC:\n\tdefault:\n\t\tbbc_error__message = \"Unspecified error\";\n\t\terrorno = -1;\n\t\tbreak;\n\t}\n\tbbc_error__errno = errorno;\n\n\tif (verbose) fprintf(stderr, \"%s\\n\", bbc_error__message);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/test/Makefile",
    "content": "SHELL=/bin/sh\n\nWARN\t= -Wall -Wstrict-prototypes -Wmissing-prototypes\n\nINCLUDES=-I.. -I/usr/local/include -I../../shared\n\nALL_CFLAGS=$(WARN) $(INCLUDES) -O2 -g\n\nall: archive_test\n\narchive_test: archive_test.o _bbc_archive_read_attributes.o ../_bbc_archive.h\n\t$(CC) $(WARN) -o archive_test archive_test.o _bbc_archive_read_attributes.o \n\n_bbc_archive_read_attributes.o: ../_bbc_archive_read_attributes.c\n\nclean:\n\trm -f archive_test *.o *~ core *.core\n\n\n# // Compile C files to object files.\n.c.o:\n\t$(CC) $(ALL_CFLAGS) -c -o $@ $<\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/shared/archive_format/test/archive_test.c",
    "content": "/* BBCIM: Acorn BBC computer diskimage manipulation\n *\n * archive_test.c\n * ENGLISH: reads file attributes from the inf/dsk files\n *\n * this file is public domain, by W.H.Scholten 2001, 2009\n */\n\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <_bbc_archive.h>\n\nint main(int argc, char **argv) {\n\tint  st;\n//\tstruct bbc_archive__file file;\n\tstruct bbc_archive__file_attr file_attr;\n\n//\tstruct bbc_archive__diskimage disk;\n\tstruct bbc_archive__diskimage_attr disk_attr;\n\n\tif (argc < 2) {\n\t\tfprintf(stderr, \"use: test <filename>\\n\");\n\t\texit(1);\n\t}\n\n//\tfile.filename = argv[1];\n//\tst = bbc_archive__read_file_attributes(file.filename, &file_attr, 1);\n\n\tst = bbc_archive__read_file_attributes(argv[1], &file_attr, 1);\n\tif (st < 0) {\n\t\tfprintf(stderr, \"bbc_archive__read_file_attributes returned error\\n\");\n\t\tbbc_archive__free_file_attributes(&file_attr);\n\t}\n\telse {\n\t\tint  i;\n\t\tchar printable_name [ 16 ];\n\t\tint  printable_all = 1;\n\n//\t\tfile.attr = file_attr;\n\n\t\tstrcpy(printable_name, file_attr.name);\n\t\tfor (i=0; i<strlen(file_attr.name); i++) {\n\t\t\tif (printable_name[i] < 32 || printable_name[i] >= 127) {\n\t\t\t\tprintable_name[i] = '?';\n\t\t\t\tprintable_all = 0;\n\t\t\t}\n\t\t}\n\n\t\tprintf(\"info gives: %s %s %6X %6X %s CRC=%4X\\n\", printable_name, printable_all ? \"\" : \" (contains unprintable characters) \", file_attr.load_address, file_attr.exec_address, ((file_attr.attributes & BBC_ARCHIVE__ATTR__LOCKED) ? \"Locked\" : \"Not locked\"), file_attr.crc);\n\t\tprintf(\"file_attr.type=%d\\n\", file_attr.type);\n\t\tprintf(\"file_attr.attributes=%d\\n\", file_attr.attributes);\n\t\tbbc_archive__free_file_attributes(&file_attr);\n\t}\n\n\tprintf(\"\\n\");\n\n\tst = bbc_archive__read_disk_attributes(argv[1], &disk_attr, 1);\n\tif (st < 0) {\n\t\tfprintf(stderr, \"bbc_archive__read_disk_attributes returned error\\n\");\n\t\t//bbc_archive__free_disk_attributes(&disk_attr);\n\t}\n\telse {\n\t\tprintf(\".dsk gives:\\n\"\n\t\t\t   \" type=%d, sides=%d, tracks=%d, sec per track=%d, bps=%d\\n\", disk_attr.type, disk_attr.sides, disk_attr.tracks, disk_attr.sectors_per_track, disk_attr.bytes_per_sector);\n\t}\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/lib/utils.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation and more\n *\n * utils.c:\n *\n * Copyright (C) W.H. Scholten 1996, 1997, 2001, 2003\n */\n\n\n\n/* Prototypes: */\nint bbcim_rename_diskimage(char *from, char *to, int verbose);\nint bbcim_file_sanitycheck(char *filename, int verbose);\nint bbcim_diskimage_sanitycheck(struct bbc_archive__diskimage *image, int verbose);\n\n\n/* Functions: */\nint bbcim_rename_diskimage(char *from, char *to, int verbose) {\n\tchar *dsk_from, *dsk_to;\n\tint  st;\n\n\tbbcim_errno = 0;\n\n\tst = rename(from, to);\n\tif (st < 0) {\n\t\tbbcim_errno = -1;\n\t\tbbcim_error = \"Rename failed\";\n\t\tif (verbose) fprintf(stderr, \"%s: %s (to %s)\\n\", from, bbcim_error, to);\n\t\treturn bbcim_errno;\n\t}\n\n\n\tdsk_from = bbc_archive__new_dsk_filename(from, verbose);\n\tif (dsk_from == NULL) return bbcim_errno;\n\n\n\tdsk_to = bbc_archive__new_dsk_filename(to, verbose);\n\tif (dsk_to == NULL) { free (dsk_from); return bbcim_errno; }\n\n\n\tif (bbcim_file_sanitycheck(dsk_from, verbose) == 0) {\n\n\t\tst = rename(dsk_from, dsk_to);\n\t\tif (st < 0) {\n\t\t\tbbcim_errno = -1;\n\t\t\tbbcim_error = \"Rename failed\";\n\t\t\tif (verbose) fprintf(stderr, \"%s: %s (to %s)\\n\", dsk_from, bbcim_error, dsk_to);\n\t\t}\n\t} else bbcim_errno = 0; /* ignore non-existing dsk files, as they are not compulsory */\n\n\treturn bbcim_errno;\n}\n\n\n\n\nvoid bbcim_reduce_bbcname__no_dir(char *unix_naam, char *bbc_naam) {\n//\tprintf(\"no dir\\n\");\n\tif (bbc_naam[0] == '$')\n\t\tstrcpy(unix_naam, bbc_naam+2);\n\telse {\n\t\tunix_naam[0] = bbc_naam[0];\n\t\tstrcpy(unix_naam+1, bbc_naam+2);\n\t}\n}\nvoid bbcim_reduce_bbcname__no_rootdir(char *unix_naam, char *bbc_naam) {\n//\tprintf(\"no rootdir\\n\");\n\tif (bbc_naam[0] == '$')\n\t\tstrcpy(unix_naam, bbc_naam+2);\n\telse {\n\t\tstrcpy(unix_naam, bbc_naam);\n\t}\n}\n\n\n\n/* Reading numbers from a buffer */\nint bbcim_read4lsb(unsigned char *data) {\n\treturn (int) data[0] | ( ((int) data[1]) <<8) | ( ((int) data[2]) <<16) | ( ((int) data[3]) <<24);\n}\n\nint bbcim_read3lsb(unsigned char *data) {\n\treturn (int) data[0] | ( ((int) data[1]) <<8) | ( ((int) data[2]) <<16);\n}\n\nint bbcim_read2lsb(unsigned char *data) {\n\treturn (int) data[0] | ( ((int) data[1]) <<8);\n}\n\n\n\nint bbcim_file_sanitycheck(char *filename, int verbose) {\n\tFILE *fp;\n\n\tbbcim_errno = 0;\n\n\tfp = fopen(filename, \"rb\");\n\tif (fp == NULL) {\n\t\tbbcim_error =\n\t\t\tTEKST_NL(\"Kan bestand niet openen\")\n\t\t\tTEKST_ENG(\"Cannot open file\")\n\t\t\t;\n\t\tif (verbose) fprintf(stderr, \"%s: %s\\n\", filename, bbcim_error);\n\t\tbbcim_errno = BBCIM_ERROR__OPEN_FAILED;\n\t\treturn bbcim_errno;\n\t}\n\tfclose(fp);\n\n\treturn 0;\n}\n\n\nint bbcim_diskimage_sanitycheck(struct bbc_archive__diskimage *image, int verbose) {\n\tint i,s;\n\tFILE *fpdisk;\n\tunsigned char files = 0;\n\tunsigned char filebyte = 0;\n\n\tbbcim_errno = 0;\n\n\tfpdisk = fopen(image->filename, \"rb\");\n\tif (fpdisk == NULL) {\n\t\tbbcim_error =\n\t\t\tTEKST_NL(\"Kan diskbeeld niet openen\\n\\n\")\n\t\t\tTEKST_ENG(\"Cannot open disk image\\n\\n\")\n\t\t\t;\n\t\tif (verbose) fprintf(stderr, \"%s: %s\\n\", image->filename, bbcim_error);\n\t\tbbcim_errno = BBCIM_ERROR__OPEN_FAILED;\n\t\treturn bbcim_errno;\n\t}\n\n\n\tswitch(image->attr->type) {\n\tcase BBC_ARCHIVE__DFS_DISK:\n\t\t//for (side=0; side<image.sides; side++) {\n\t\t/* Doe alleen iets als het diskbeeld meer dan 2 sectoren bevat. */\n\t\tfseek(fpdisk, 0L, SEEK_END);\n\t\tif (ftell(fpdisk) < 512 * image->attr->sides - 1) {\n\t\t\t/* Minimum must be (sides*catalogue size) */\n\t\t\tbbcim_error =\n\t\t\t\tTEKST_NL(\"niets op het diskbeeld\\n\\n\")\n\t\t\t\tTEKST_ENG(\"nothing on the disk image\\n\\n\")\n\t\t\t\t;\n\t\t\tbbcim_errno = BBCIM_ERROR__NO_ROOT_DIR;\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (s=0; s<image->attr->sides; s++) {\n\t\t\tif (bbcim_disk_read(image, fpdisk, OFFSET__DFS_entries, s, &files)) return -1;\n//OLD\t\tfseek(fpdisk, 256+5L, SEEK_SET);\n//OLD\t\tfread(&files, 1, 1, fpdisk);\n\t\t\tif (files % 8) {\n\t\t\t\tbbcim_error =\n\t\t\t\t\tTEKST_NL(\"corrupt diskbeeld (bestand-aantal byte)\\n\")\n\t\t\t\t\tTEKST_ENG(\"bad disk image (fileno byte)\\n\")\n\t\t\t\t\t;\n\t\t\t\tbbcim_errno = BBCIM_ERROR__BAD_DISK;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t/* SANITY CHECK startsec>1 ? */\n\t\tbreak;\n\n\tcase BBC_ARCHIVE__W62_DISK:\n\t\t/* Verify it's a Watford 62 file image */\n\t\tfor (s=0; s<image->attr->sides; s++) {\n\t\t\tfor (i=0; i<7; i++) {\n\t\t\t\tif (bbcim_disk_read(image, fpdisk, 512 + OFFSET__DFS_entries, s, &filebyte)) return -1;\n\t\t\t\tif (filebyte != 0xAA) {\n\t\t\t\t\t//if (verbose) fprintf(stderr, \"%s is not a Watford 62 file image (there should be 8 bytes AA at positions 512-519)\\n\", image->filename);\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* are there files on image 2? */\n//OLD\tfseek(fp_w62, 512+DFSentries, SEEK_SET);\n//OLD\tfread(&filebyte, 1, 1, fp_w62);\n\t\t\tif (bbcim_disk_read(image, fpdisk, OFFSET__DFS_entries, s, &filebyte)) return -1;\n\t\t\tif ((filebyte %8) != 0) {\n\t\t\t\t/* Not a valid catalogue */\n\t\t\t\t//if (verbose) fprintf(stderr, \"%s: not a valid 2nd catalogue\\n\", image->filename);\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (bbcim_disk_read(image, fpdisk, 512 + OFFSET__DFS_entries, s, &filebyte)) return -1;\n\t\t\tif ((filebyte %8) != 0) {\n\t\t\t\t/* Not a valid 2nd catalogue */\n\t\t\t\t//if (verbose) fprintf(stderr, \"%s: not a valid 2nd catalogue\\n\", image->filename);\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase BBC_ARCHIVE__DDOS_DISK:\n\t\tbreak;\n\n\tcase BBC_ARCHIVE__ADFS_DISK:\n\t\tbreak;\n\n\tdefault:\n\t\tbbcim_error = \n\t\t\tTEKST_NL(\"slecht disk type\\n\")\n\t\t\tTEKST_ENG(\"bad disktype\\n\")\n\t\t\t;\n\t\tbbcim_errno = BBCIM_ERROR__BAD_DISK_TYPE_ARGUMENT;\n\t\tbreak;\n\t}\n\n\tfclose(fpdisk);\n\n\tif (verbose && bbcim_errno) fprintf(stderr, \"%s\\n\", bbcim_error);\n\n\treturn bbcim_errno;\n}\n\n\n/* Write a byte to a disk image, this will take into account double sided\n * (interleaved) images! */\nint bbcim_disk_write(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *byte) {\n\tint st;\n\tint new_offset = bbcim_disk_offset(image, offset, side);\n\tif (new_offset >= 0) {\n\t\tfseek(fp, new_offset, SEEK_SET);\n\t\tst = fwrite(byte, 1, 1, fp);\n\t\tif (st != 1) return -1;\n\t}\n\telse return -1;\n\n\treturn 0;\n}\nint bbcim_disk_read(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *byte) {\n\tint st;\n\tint new_offset = bbcim_disk_offset(image, offset, side);\n\tif (new_offset >= 0) {\n\t\tfseek(fp, new_offset, SEEK_SET);\n\t\tst = fread(byte, 1, 1, fp);\n\t\tif (st != 1) return -1;\n\t}\n\telse return -1;\n\n\treturn 0;\n}\n\n/* These are somewhat ugly and should take into account track size to reduce the number of reads/writes */\nint bbcim_disk_write_multi(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *bytes, int nbytes) {\n\tint i;\n\tint st;\n\tint new_offset;\n\tint bytes_written = 0;\n\n\tfor (i=0; i<nbytes; i++) {\n\t\tnew_offset = bbcim_disk_offset(image, offset+i, side);\n\t\tif (new_offset >= 0) {\n\t\t\tfseek(fp, new_offset, SEEK_SET);\n\t\t\tst = fwrite(bytes+bytes_written, 1, 1, fp);\n\t\t\tif (st != 1) return bytes_written; /* -1; */\n\t\t}\n\t\telse return bytes_written; /* -1; */\n\t}\n\n\treturn bytes_written; /* 0; */\n}\n\n\nint bbcim_disk_read_multi(struct bbc_archive__diskimage *image, FILE *fp, int offset, int side, unsigned char *bytes, int nbytes) {\n\tint i;\n\tint st;\n\tint new_offset;\n\tint bytes_read = 0;\n\n\tfor (i=0; i<nbytes; i++) {\n\t\tnew_offset = bbcim_disk_offset(image, offset+i, side);\n\t\tif (new_offset >= 0) {\n\t\t\tfseek(fp, new_offset, SEEK_SET);\n\t\t\tst = fread(bytes+bytes_read, 1, 1, fp);\n\t\t\tif (st != 1) return bytes_read; /*-1;*/\n\t\t\tbytes_read++;\n\t\t}\n\t\telse return bytes_read; /*-1;*/\n\t}\n\n\treturn bytes_read;\n}\n\n\n/* Returns value > 0 if ok, -1 on error (side 1 of a single sided disk image) */\nint bbcim_disk_offset(struct bbc_archive__diskimage *image, int side_offset, int side) {\n\tint  track_size;\n\tint  track_no;\n\tint  new_offset;\n\n\ttrack_size = image->attr->sectors_per_track * image->attr->bytes_per_sector;\n\n\tif (image->attr->type != BBC_ARCHIVE__ADFS_DISK) {\n\t\tif (side < 0 || side > 1) return -1;\n\n\t\tif (side_offset >= track_size*image->attr->tracks) return -1; /* offset out of range */\n\n//\t\tif (side == 1 && image->attr->sides == 1) return -1; /* can't write to second side of a single sided disk image */\n\t\tif (side >= image->attr->sides) return -1; /* can't write to second side of a single sided disk image */\n\n\t\ttrack_no = side_offset / track_size;\n\n\t\tnew_offset = (image->attr->sides * track_no * track_size) + (side * track_size) + (side_offset % track_size);\n\t}\n\telse return -1;\n\n\treturn new_offset;\n}\n\n\nint bbcim_print_error_bad_side(char *function, struct bbc_archive__diskimage *image, int side, int verbose) {\n\tbbcim_errno = BBCIM_ERROR__BAD_DISK_SIDE;\n\tbbcim_error = \"Bad side\";\n\tif (verbose) fprintf(stderr, \"%s: %s: %s %d\\n\", function, image->filename, bbcim_error, side);\n\n\treturn bbcim_errno;\n}\n\n\nint bbcim_print_error_unsupported_disktype(char *function, struct bbc_archive__diskimage *image, int verbose) {\n\tbbcim_errno = BBCIM_ERROR__NOT_IMPLEMENTED;\n\tbbcim_error = \"Unsupported disk type\";\n\tif (verbose) fprintf(stderr, \"%s: %s: %s\\n\", function, image->filename, bbcim_error);\n\n\treturn bbcim_errno;\n}\n\n\nint bbcim_print_error_diskimage_truncated(char *function, struct bbc_archive__diskimage *image, char *file, int verbose) {\n\tbbcim_errno = BBCIM_ERROR__DISK_TRUNCATED;\n\tbbcim_error = \"Unexpected end of the disk image\";\n\tif (verbose) {\n\t\tfprintf(stderr, \"%s: %s: %s\", function, image->filename, bbcim_error);\n\t\tif (file == NULL) {\n\t\t\tfprintf(stderr, \"\\n\");\n\t\t}\n\t\telse {\n\t\t\tfprintf(stderr, \" at file %s\\n\", file);\n\t\t}\n\t}\n\n\treturn bbcim_errno;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/Makefile",
    "content": "SHELL = /bin/sh\n\n# bbcim (Acorn BBC computer disk image manipulation and more)\n#\n# This file is released to the public domain, by W.H.Scholten 1996-2001,2009,2014\n#\n\n\nWARN\t= -Wall -Wfatal-errors -Wstrict-prototypes -Wmissing-prototypes\n\nINCLUDES=-I../lib -I../lib/include -I../lib/shared -I../lib/shared/archive_format -I../lib\nALL_CFLAGS = $(WARN) $(INCLUDES) -O2 -g\n\nall:\tbbcim\n\nbbcim:\tbbcim.o utils.o\n\t$(CC) -L../lib -o bbcim bbcim.o utils.o -lbbcim\n\nbbcim.o: *.c _config.h\n\n#\t$(CC) $(WARN) -I../lib/include -O2 -o bbcim.o -c bbcim.c\n\n\nclean:\n\trm -f bbcim *.o *~ */*~ core *.core\n\n\ninstall:\tbbcim\n\tcp -f bbcim $(INSTALL)/bin/\n#\tmkdir -p $(HOME)/bin/\n#\tcp -f bbcim $(HOME)/bin/\n\n\n\ninstall.shared:\n\tcp -f bbcim $(INSTALL)/bin/\n\n\nuninstall:\n\trm -f $(INSTALL)/bin/bbcim\n\n\n# // Compile C files to object files.\n.c.o:\n\t$(CC) $(ALL_CFLAGS) -c -o $@ $<\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/_config.h",
    "content": "/* bbcim configuration\n */\n\n/*************** CONFIGURATION ************************/\n/* Comment out for english messages */\n//#define LANGUAGE_DUTCH\n\n/* Console output: */\n#define USE_ANSI_COLOURS 1\n\n/* See lib/config.h for all other configuration */\n/*************** END OF CONFIGURATION *****************/\n\n#ifdef LANGUAGE_DUTCH\n#  define TEKST_NL(x) x\n#  define TEKST_ENG(x)\n#else\n#  define TEKST_NL(x)\n#  define TEKST_ENG(x) x\n#endif\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/_help.c",
    "content": "\n#include \"shared/_ansi_console.h\"\n\nextern int optie;\n\n/* Prototypes: */\nvoid use_option(void);\nvoid show_version_copyright(void);\nvoid show_help(void);\nvoid use(void);\nvoid show_options(void);\n\n\n/* Functions: */\nvoid show_help() {\n\tprintf(\n\t\tTEKST_NL(\n\"\\nbbcim, versie \"BBCIM_VERSION\", \"BBCIM_COPYRIGHT\" (\" CONSOLE_GRAY \"\\http://wouter.bbcmicro.net/\" CONSOLE_RESTORE \")\\n\"\n\"Optie overzicht:\\n\"\n\"  -c : toon bestanden in een diskbeeld\\n\"\n\"  -e : haal bestanden uit een diskbeeld\\n\"\n\"  -a : plaats bestanden in een diskbeeld\\n\"\n\"  -d : verwijder bestanden uit een diskbeeld\\n\"\n\"  -40|-80|-max : wijzig grootte van een Acorn DFS diskbeeld\\n\"\n\"  -min : minimaliseer een Acorn DFS diskbeeld\\n\"\n\"  -crc : bereken CRC's van bestanden in een diskbeeld\\n\"\n\"  -boot : wijzig boot-optie van de gegeven zijde van een diskbeeld\\n\"\n\"  -id : probeer een diskbeeld type te identificeren\\n\"\n\"  -inf_clean : archief bestanden bijwerken (naam en crc)\\n\"\n\"  OUD -inf_crc : controleer CRC's van archief bestanden\\n\"\n\"  -s : splits een tekst bestand in .inf bestanden\\n\"\n\"  -interss : combineer enkelzijdige diskbeelden\\n\"\n\"  -splitds : splits een dubbelzijdig diskbeeld\\n\"\n\"  -ddos_dfs : splits een enkelzijdig DDOS diskbeeld in Acorn DFS diskbeelden\\n\"\n\"  -w62_dfs : splits een watford 62-bestanden diskbeeld in Acorn DFS diskbeelden\\n\"\n\"  -help : geeft meer informatie over gebruik van een optie\\n\"\n\"  -H : toon deze help tekst\\n\"\n\"  -V : toon het bbcim versie nummer\\n\"\n\"Zie de 'man' pagina of  bbcim -help <optie>  voor nog meer informatie.\\n\"\n\t\t\t)\n\n\t\tTEKST_ENG(\n\"\\nbbcim, version \"BBCIM_VERSION\", \"BBCIM_COPYRIGHT\" (\" CONSOLE_GRAY \"http://wouter.bbcmicro.net/\" CONSOLE_RESTORE \"\\n\"\n\"Overview of options:\\n\"\n\"  -c : show files in disk image\\n\"\n\"  -e : extract files from disk image\\n\"\n\"  -a : add files to disk image\\n\"\n\"  -d : delete files from a disk image\\n\"\n\"  -40|-80|-max : change the size of a DFS disk image\\n\"\n\"  -min : minimize a DFS disk image\\n\"\n\"  -crc : calculate CRC's of files in a disk image\\n\"\n\"  -inf_clean : cleanup archive file information (name and crc)\\n\"\n\"  OLD -inf_crc : check CRC's of archive files\\n\"\n\"  -s : split a text file with file attributes into .inf files\\n\"\n\"  -interss : combine 2 single sided disimages\\n\"\n\"  -splitds : split a double sided disk image\\n\"\n\"  -ddos_dfs : split single sided DDOS disk image into Acorn DFS disk images\\n\"\n\"  -w62_dfs : split a watford 62-file disk image into Acorn DFS disk images\\n\"\n\"  -boot : set boot option of the given side of a disk image\\n\"\n\"  -id : try to identify the disk image type\\n\"\n\"  -help : gives more information on how to use an option\\n\"\n\"  -H : show this help text\\n\"\n\"  -V : show bbcim version number\\n\"\n\"See the 'man' page or  bbcim -help <option>  for even more information.\\n\"\n\t\t\t)\n\t\t);\n}\n\n\nvoid use_option() {\n\tprintf(\"Use: bbcim \");\n\tswitch(optie) {\n\tcase VERSIE:\n\t\tprintf(\"-V\\n\");\n\t\tbreak;\n\n\tcase HELP:\n\t\tprintf(\"-H\\n\");\n\t\tbreak;\n\n    case HELP2:\n\t\tprintf(\"-help <option>\\n\");\n\t\tbreak;\n\n\tcase INTERSS:\n\t\tprintf(\"-interss <disk1> <disk2> <new disk>\\n\");\n\t\tbreak;\n\n\tcase SPLITDS:\n\t\tprintf(\"-splitds <disk>\\n\");\n\t\tbreak;\n\n\tcase DDOS_DFS:\n\t\tprintf(\"-ddos_dfs <disk>\\n\");\n\t\tbreak;\n\n\tcase W62_DFS:\n\t\tprintf(\"-w62_dfs <disk>\\n\");\n\t\tbreak;\n\n\tcase SPLIT_CAT:\n\t\tprintf(\"-s[@] <text file>\\n\");\n\t\tbreak;\n\n\tcase EXTRACT:\n\t\tprintf(\"-e[s|d,@,b,r] <disk> [<file 1>...<file n>]\\n\");\n\t\tbreak;\n\n\tcase ADD:\n\t\tprintf(\"-a[b,r] [<diskoptions>] <disk> [-side <side>] {list of files}\\n\");\n\t\tbreak;\n\n\tcase DEL:\n\t\tprintf(\"bbcim -d <disk> [-side <side>] {list of files}\\n\");\n\t\tbreak;\n\n\tcase CAT:\n\t\tprintf(\"-c <disk> [-side <side>]\\n\");\n\t\tbreak;\n\n\tcase CRC:\n\t\tprintf(\"-crc <disk> [-side <side>]\\n\");\n\t\tbreak;\n\n\tcase ARCHIVE_CLEANUP:\n\t\tprintf(\"bbcim -inf_clean {list}\\n\");\n\t\tbreak;\n\n\tcase ARCHIVE_CRC:\n\t\tprintf(\"-inf_crc {list}\\n\");\n\t\tbreak;\n\n\tcase DISKSIZE40:\n\t\tprintf(\"-40 <disk>\\n\");\n\t\tbreak;\n\n\tcase DISKSIZE80:\n\t\tprintf(\"-80 <disk>\\n\");\n\t\tbreak;\n\n\tcase MINIMISE:\n\t\tprintf(\"-min <disk>\\n\");\n\t\tbreak;\n\n\tcase MAXIMISE:\n\t\tprintf(\"-max <disk>\\n\");\n\t\tbreak;\n\n\tcase NEW_DISK:\n\t\tprintf(\"-new <disk>\\n\");\n\t\tbreak;\n\n\tcase BOOT:\n\t\tprintf(\"-boot <disk> {NONE|LOAD|RUN|EXEC}\\n\");\n\t\tbreak;\n\n\tcase ID:\n\t\tprintf(\"-id <disk>\\n\");\n\t\tbreak;\n\n\tdefault:\n\t\tprintf(\"Error\\n\");\n\t\tbreak;\n\t}\n}\n\n\nvoid use() {\n\tshow_version_copyright();\n\tshow_options();\n}\n\n\nvoid show_version_copyright() {\n\tprintf(\"\\n\"\n\t\tTEKST_NL(\"bbcim, versie \"BBCIM_VERSION\", \"BBCIM_COPYRIGHT\" (\" CONSOLE_GRAY \"\\http://wouter.bbcmicro.net/\" CONSOLE_RESTORE \")\\n\")\n\t\tTEKST_ENG(\"bbcim, version \"BBCIM_VERSION\", \"BBCIM_COPYRIGHT\" (\" CONSOLE_GRAY \"http://wouter.bbcmicro.net/\" CONSOLE_RESTORE \")\\n\")\n\t\t);\n}\n\n\nvoid show_options() {\n\tprintf(\n\t\tTEKST_NL(\"Opties:\\n\")\n\t\tTEKST_ENG(\"Options:\\n\")\n\t\t\"        -e[s|d,@,b,r] -a[b,r] -d -c -crc -min -40 -80 -max -id -boot\\n\"\n\t\t\"        -inf_clean -inf_crc -s[@]\\n\"\n\t\t\"        -splitds -interss -ddos_dfs -w62_dfs\\n\"\n\t\t\"        -V -H -help\\n\"\n\t\tTEKST_NL(\"Probeer opties -H of -help <optie> voor meer informatie\\n\")\n\t\tTEKST_ENG(\"For more information try option -H or -help <option>\\n\")\n\t\t);\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/_help_man.c",
    "content": "/* Prototypes: */\nvoid help2_diskoptions(void);\nvoid help2_bootoption(void);\nvoid help2(char *optstring);\n\n\n/* Functions: */\nvoid help2_diskoptions() {\n\tprintf(\"\\n\"\n\t\t   \" <disk options>: [-type <DFS | W62 | DDOS | ADFS | HDFS>] [-bytes <no>]  [-sectors <no>] [-tracks <no>] [-sides <no>]\\n\");\n\n}\n\nvoid help2_bootoption() {\n\tprintf(\"\\n <boot option>: [ none | LOAD | RUN | EXEC ]\\n\");\n}\n\nvoid help2(char *optstring) {\n\tint optie;\n\tint i;\n\n\tif (optstring[0] == '-') optstring = optstring+1;\n\n\toptie = -1;\n\n\tfor (i=0; i<_NUM_TYPES_; i++) {\n\t\tif (!strcmp(optstring, optie_strings[i])) {\n\t\t\toptie = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (optie == -1) {\n\t\tfprintf(stderr, \n\t\t\t\tTEKST_NL(\"Er is alleen hulp beschikbaar voor:\\n\")\n\t\t\t\tTEKST_ENG(\"Help can only be provided for:\\n\")\n\t\t\t);\n\t\tshow_options();\n\t\texit(1);\n\t}\n\n\tswitch (optie) {\n\tcase HELP2:\n\t\tprintf(\n\t\t\tTEKST_NL(\" bbcim -help <optie>:\\n\"\n\t\t\t\t\t \"              Geeft een  uittreksel  uit de man  pagina  over het\\n\"\n\t\t\t\t\t \"              gebruik van optie <optie>.\\n\")\n\t\t\tTEKST_ENG(\" bbcim -help <option>:\\n\"\n\t\t\t\t\t  \"              Gives an extract of the man page pertaining to option <option>\\n\")\n\t\t\t\t);\n\t\tbreak;\n\tcase VERSIE:\n\t\tprintf(\" bbcim -V:\\n\"\n\"              print bbcim version.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase HELP:\n\t\tprintf(\" bbcim -H:\\n\"\n\"              gives general help (command overview).\"\n\"\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase INTERSS:\n\t\tprintf(\n\" bbcim -interss  [<diskoptions  0>]  <disk0>  [<diskoptions   1>]\\n\"\n\"       <disk1> <disk2>\\n\"\n\"\t      interleaves  two single  sided disk  images  <disk0> and\\n\"\n\"\t      <disk1> to <disk2>.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase SPLITDS:\n\t\tprintf(\n\" bbcim -splitds [<diskoptions>] <disk>\\n\"\n\"\t      splits an interleaved disk  image <disk> to <disk>.0 and\\n\"\n\"\t      <disk>.1.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase DDOS_DFS:\n\t\tprintf(\n\" bbcim -ddos_dfs [<diskoptions>] <disk>\\n\"\n\"\t      splits a  single sided DDOS disk image  into several DFS\\n\"\n\"\t      disk images.  Eg. myfiles > myfiles.A,..., myfiles.H.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase W62_DFS:\n\t\tprintf(\n\" bbcim -w62_dfs [<diskoptions>] <disk>\\n\"\n\"\t      splits a  single sided watford  62 file disk  image into\\n\"\n\"\t      two DFS disk images (one image if there are less than 32\\n\"\n\"\t      files on the image) <disk>.1 and <disk>.2.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase SPLIT_CAT:\n\t\tprintf(\n\" bbcim -s[@] <file>\\n\"\n\"\t      splits  a text  file with  file  information (catalogue)\\n\"\n\"\t      into .inf  files. Lines not  starting with a  BBC (Acorn\\n\"\n\"\t      DFS) file name (i.e.  dir.name) are skipped. This can be\\n\"\n\"\t      used  for example to  make archive  files from  an xbeeb\\n\"\n\"\t      directory file (__CATALOG__).\\n\"\n\"\\n\"\n\"\t      In DFS  use, one  is usually in  directoy '$'  (the root\\n\"\n\"\t      dir), and  the current directory is  not displayed. This\\n\"\n\"\t      means, it's  useful to remove  the root dir '$'  in host\\n\"\n\"\t      file names. If you don't want this, use option '@' which\\n\"\n\"\t      keeps the root directory $.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase EXTRACT:\n\t\tprintf(\n\" bbcim -e[s|d,@,b,r]  [<diskoptions>]  <disk>  [-side   <side>]\\n\"\n\"       [{list}]\\n\"\n\"\t      extracts files. Without d,s or @ the option, -e extracts\\n\"\n\"\t      files from a disk  image 'imagefile' with filenames such\\n\"\n\"\t      as  'imagefile.D.DATA'  but  acorn  DFS  root  dirs  are\\n\"\n\"\t      removed,       so      '$.!BOOT'       is      extracted\\n\"\n\"\t      to  'imagefile.!BOOT'. With every  'bare' file,  an info\\n\"\n\"\t      file is  created containing in particular  the load- and\\n\"\n\"\t      execution  addresses (i.e.   the  archive format).   The\\n\"\n\"\t      suboptions produce the following results:\\n\"\n\"\\n\"\n\"\t      d extracts the files in a directory named after the disk\\n\"\n\"\t      image (appending \\\".d\\\"): eg. 'imagefile.d/$.ELITE'.\\n\"\n\"\\n\"\n\"\t      s gives short filenames  (no leading disk image name nor\\n\"\n\"\t      is a directory created to  put the files in).  Note that\\n\"\n\"\t      d and s are mutually exclusive.\\n\"\n\"\\n\"\n\"\t      @  keeps the  Acorn  DFS root  directory  $, so  $.ELITE\\n\"\n\"\t      doesn't become ELITE.\\n\"\n\"\\n\"\n\"\t      b only  the bare  files are created,  and no  info files\\n\"\n\"\t      (with file attributes).\\n\"\n\"\\n\"\n\"\t      r NOT  IMPLEMENTED: remove the extracted  files from the\\n\"\n\"\t      disk image\\n\"\n\"\\n\"\n\"\t      When a  list of file names  is given, only  the files in\\n\"\n\"\t      the list are extracted from the disk image.\\n\"\n\t\t\t);\n\t\thelp2_diskoptions();\n\t\tbreak;\n\tcase ADD:\n\t\tprintf(\n\" bbcim -a[b,r] [<diskoptions>] <disk> [-side <side>]\\n\"\n\"       {list}\\n\"\n\"\t      add  files  (in  archive  format)  to  the  disk  image:\\n\"\n\"\t      Automatically skips  '.inf' files  so bbcim -a  <disk> *\\n\"\n\"\t      (on unix)  gives no problems.  If the  disk image didn't\\n\"\n\"\t      exist a new one will be created.  The option 'r' removes\\n\"\n\"\t      the archive  files after adding them to  the disk image.\\n\"\n\"\t      The  option 'b'  adds files  without .inf  file (setting\\n\"\n\"\t      load/exec addresses to 0).\\n\"\n\t\t\t);\n\t\thelp2_diskoptions();\n\t\tbreak;\n\tcase DEL:\n\t\tprintf(\n\" bbcim -d  [<diskoptions>]  <disk>  [-side  <side>]\\n\"\n\"       {list}\\n\"\n\"\t      delete  the list of  files from  the disk  image.  NOTE:\\n\"\n\"\t      files without a BBC (Acorn DFS) directory are assumed to\\n\"\n\"\t      have the  root directory $,  eg. ELITE is assumed  to be\\n\"\n\"\t      $.ELITE\\n\"\n\t\t\t);\n\t\thelp2_diskoptions();\n\t\tbreak;\n\tcase CAT:\n\t\tprintf(\n\" bbcim -c[R] [<diskoptions>] <disk> [-side <side>]\\n\"\n\"\t      show catalogue  (files in image). R  is for hierarchical\\n\"\n\"\t      filing system images, recursively showing all files from\\n\"\n\"\t      the root or given directory.\\n\"\n\t\t\t);\n\t\thelp2_diskoptions();\n\t\tbreak;\n\tcase CRC:\n\t\tprintf(\n\" bbcim -crc [<diskoptions>] <disk> [-side <side>]\\n\"\n\"\t      calculates crc's for all the files in the disk image.\\n\"\n\t\t\t);\n\t\tbreak;\n\n\tcase NEW_DISK:\n\t\tprintf(\n\" bbcim -new [<diskoptions>] <disk>\\n\"\n\"\t      makes  a new  (empty)  disk image  (for  Acorn DFS:  512\\n\"\n\"\t      bytes, boot option EXEC).\\n\"\n\t\t\t);\n\t\tbreak;\n\n\tcase ARCHIVE_CLEANUP:\n\t\tprintf(\n\" bbcim -inf_clean {list}\\n\"\n\"\t      renames  archive/info  files   to  standard  format  (as\\n\"\n\"\t      produced  with '#'  in -e  (XXX update  this as  '#' was\\n\"\n\"\t      removed XXX)), add's crc's if not found, checks crc's if\\n\"\n\"\t      found.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase ARCHIVE_CRC:\n\t\tprintf(\n\" bbcim -inf_crc {list}\"\n\"\t      check crc's of the given archive files.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase DISKSIZE40:\n\t\tprintf(\n\" bbcim -40 [<diskoptions>] <disk>\\n\"\n\"\t      expand a  disk image  to 40 tracks  (if current  size is\\n\"\n\"\t      smaller than  40 tracks).   This changes the  disk image\\n\"\n\"\t      size, but  more importantly  also the DFS  filing system\\n\"\n\"\t      size  (the  number with  the  number  of sectors  that's\\n\"\n\"\t      stored  in the disk  image).  So  shrinking an  80 track\\n\"\n\"\t      image to 40 track is  possible by first using -min, then\\n\"\n\"\t      -40 (if the files fit on 40 tracks).\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase DISKSIZE80:\n\t\tprintf(\n\" bbcim -80 [<diskoptions>] <disk>\\n\"\n\"\t      expand a  disk image  to 80 tracks  (if current  size is\\n\"\n\"\t      smaller than  80 tracks).   This changes the  disk image\\n\"\n\"\t      size, but  more importantly  also the DFS  filing system\\n\"\n\"\t      size (see above).\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase MINIMISE:\n\t\tprintf(\n\" bbcim -min [<diskoptions>] <disk>\\n\"\n\"\t      minimise a disk image (equal to *COMPACT and cutting off\\n\"\n\"\t      after  the last  used sector). In  case of double  sided\\n\"\n\"         images, both sides are minimised.\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase MAXIMISE:\n\t\tprintf(\n\" bbcim -max [<diskoptions>] <disk>\\n\"\n\"\t      expand a single or double sided DFS disk image to almost\\n\"\n\"\t      256K  per side. This  changes the  disk image  size, but\\n\"\n\"\t      more importantly  also the  DFS filing system  size (see\\n\"\n\"\t      above).\\n\"\n\t\t\t);\n\t\tbreak;\n\tcase BOOT:\n\t\tprintf(\n\" bbcim -boot [<diskoptions>] <disk> [-side <side>] <boot option>\\n\"\n\"\t      Sets the boot option of the disk image: none, LOAD, RUN,\\n\"\n\"\t      EXEC.\\n\"\n\t\t\t);\n\t\thelp2_diskoptions();\n\t\thelp2_bootoption();\n\t\tbreak;\n\tcase ID:\n\t\tprintf(\n\" bbcim -id <disk>\\n\"\n\"              tries to identify a disk image (type/sides).\\n\"\n\t\t\t);\n\t\tbreak;\n\tdefault:\n\t\tfprintf(stderr, \"hmm, shouldn't get here\\n\");\n\t\texit(1);\n\t\tbreak;\n\t}\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/bbcim.c",
    "content": "/* BBCIM: bbcim.c: Frontend to the bbcim library\n\n   Copyright (C) W.H.Scholten 1996, 1997, 1999, 2001, 2003, 2009, 2016\n\n   Permission to use, copy, modify, distribute, and sell this software\n   and its documentation for any purpose is hereby granted without fee,\n   provided that the above copyright notice appear in all copies and\n   that both that copyright notice and this permission notice appear in\n   supporting documentation, and that the name of the copyright holder\n   not be used in advertising or publicity pertaining to distribution\n   of the software without specific, written prior permission. The\n   copyright holder makes no representations about the suitability of\n   this software for any purpose. It is provided \"as is\" without express\n   or implied warranty.\n  \n   THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n   SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n   FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n   SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n   RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n   CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n  \n  \n   Send comments and bug-reports to \n  \n      swhs-web@xs4all.nl\n  \n*/\n\n\n\n/*__________________INCLUDES___________________*/\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"_config.h\"\n//#include <bbcim_types.h>\n#include <bbcim.h>\n\n//#include \"../lib/bbcim_internal.h\" /* temp */\n\n\n/* From utils.c: */\nextern int  set_disktype(struct bbc_archive__diskimage *image, char *arg, int verbose);\nextern void set_diskimage_defaults(struct bbc_archive__diskimage *image);\nextern int  copy_disktype(struct bbc_archive__diskimage *from_image1, struct bbc_archive__diskimage *to_image2);\nextern int  side_from_args(char *argv, int argc);\nextern int  get_disk_type_name_side(char **argv, int argc, struct bbc_archive__diskimage *image, int *side);\n\nenum optie_type { VERSIE, HELP, INTERSS, SPLITDS, DDOS_DFS, W62_DFS, SPLIT_CAT, EXTRACT, ADD, DEL, CAT, CRC, ARCHIVE_CLEANUP, ARCHIVE_CRC, DISKSIZE40, DISKSIZE80, MINIMISE, MAXIMISE, BOOT, NEW_DISK, ID, HELP2, _NUM_TYPES_ };\n\nchar *optie_strings[] = {\n\t\"V\", \"H\", \"interss\", \"splitds\", \"ddos_dfs\", \"w62_dfs\", \"s\", \"e\", \"a\", \"d\", \"c\", \"crc\", \"inf_clean\", \"inf_crc\", \"40\", \"80\", \"min\", \"max\", \"boot\", \"new\", \"id\", \"help\"\n};\n\nchar subopties[] = { 0,0,0,0,0,0, 1,4,2,0,0, 0,0,0,0,0,0,0,0,0,0,0 };\n\n//char min_args[]  = { 0,0,4,2,1,1, 1,1,2,2,1, 1,1,1,1,1,1,1,1,1,1,0 };\n\n\n#include \"_help.c\"\n#include \"_help_man.c\"\n#include \"../lib/overschrijf.h\"\n#include \"functions/archive_cleanup.c\"\n#include \"functions/archive_crc_check.c\"\n#include \"functions/catalogue_to_inf.c\"\n\n\n\n/*__________________PROGRAMMA___________________*/\n/* Prototypes: */\nvoid argc_check(int argc, int options, int required);\n\n\n\n/* Functions: */\nvoid argc_check(int argc, int options, int required) {\n\tif (argc-options < required) {\n\t\tfprintf(stderr,\n\t\t\t\tTEKST_NL(\"Niet genoeg parameters\\n\\n\")\n\t\t\t\tTEKST_ENG(\"Missing parameters\\n\\n\"));\n\t\tuse_option();\n\t\tprintf(TEKST_NL(\"Gebruik -help <optie> voor meer informatie\\n\\n\")\n\t\t\t   TEKST_ENG(\"For more information use -help <option>\\n\\n\"));\n\t\texit(1);\n\t}\n}\n\n\n\tint  optie;\nint main(int argc, char *argv[]) {\n\tFILE *fpdisk;\n\tchar optstring[21];\n\tint  bad_option;\n\tint  options = 1;\n\n\tint  flags;\n\n\tchar cat_naam[256];\n\n\tstruct bbc_archive__diskimage image;\n\tstruct bbc_archive__diskimage_attr image_attr;\n\tchar disk[256];\n\n\tstruct bbc_archive__file file; /* dummy argument to general functions */\n\tstruct bbc_archive__file_attr file_attr;\n\n\tint  side = 0;\n\n\tstruct bbc_archive__diskimage image1, image2;\n\tstruct bbc_archive__diskimage_attr image_attr1, image_attr2;\n\tchar side0[256],  side1[256];\n\n\tint  i;\n\n\n\tbbcim_debug = 0; /* libbbcim & frontend */\n\n\timage.attr = &image_attr;\n\timage.filename = disk;\n\n\tfile.attr = &file_attr;\n\n\timage1.attr = &image_attr1;\n\timage1.filename = side0;\n\timage2.attr = &image_attr2;\n\timage2.filename = side1;\n\n\tset_diskimage_defaults(&image);\n\tset_diskimage_defaults(&image1);\n\tset_diskimage_defaults(&image2);\n\n\n\tbbcim_errno = 0;\n\n\n\t/* ------------------------------------ */\n\t/* Process options and arguments        */\n\tif (argc <= 1) { use(); exit(1); }\n\n\tstrncpy(optstring, argv[1], 20);\n\tif (bbcim_debug) printf(\"optstring=%s\\n\", optstring);\n\n\n\t/*  for (;;) options = saved_options; */\n\t/* to check all options that completely/partially resemble? */\n\t/* i.e. if -extr is checked as for -e it gives bad option, but -extr could be another command */\n\n\toptie = -1;\n\tif (optstring[0] == '-') {\n\t\tint  i;\n\n\t\t/* First check exact fit with options that have no suboptions */\n\t\tfor (i=0; i<_NUM_TYPES_; i++) {\n\t\t\tif (!subopties[i]) {\n\t\t\t\tif (!strcmp(optstring+1, optie_strings[i])) {\n\t\t\t\t\toptie = i; options++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (bbcim_debug) printf(\"optie=%d, options=%d\\n\", optie, options);\n\n\t\tif (optie == -1) {\n\t\t\tfor (i=0; i<_NUM_TYPES_; i++) {\n\t\t\t\tif (subopties[i]) {\n\t\t\t\t\tif (!strncmp(optstring+1, optie_strings[i], strlen(optie_strings[i]))) {\n\t\t\t\t\t\toptie = i; options++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//if (optie == -1) { use(); exit(1); }\n\t} else use();\n\n\n\tbad_option = 0;\n\n\tif (bbcim_debug) printf(\"optie=%d (\\\"%s\\\"), 'options'=%d\\n\", optie, optie_strings[optie], options);\n\n\n\n\n\t/* --------------------------------------------------------- */\n\t/* The option should now be known, so execute the command */\n\tswitch (optie) {\n\tcase VERSIE:\n\t\tprintf(\"bbcim \"BBCIM_VERSION\"\\n\");\n\t\tbreak;\n\n\tcase HELP:\n\t\tshow_help();\n\t\tbreak;\n\n    case HELP2:\n\t\t//argc_check(argc, options, 1);\n\t\tif (argc-options < 1) { use(); exit(1); }\n\t\thelp2(argv[2]);\n\t\tbreak;\n\n\tcase INTERSS:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image1, &side);\n\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image2, &side);\n\n\t\targc_check(argc, options, 1);\n\t\tstrcpy(disk, argv [ options ]); options++;\n\n\t\tbbcim_interleave_singlesided(&image1, &image2, disk, 1);\n\t\tbreak;\n\n\tcase SPLITDS:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\n\t\tbbcim_split_doublesided(&image, 1);\n\t\tbreak;\n\n\tcase DDOS_DFS:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\t\tbbcim_ddos_to_dfs(&image, 1);\n\t\tbreak;\n\n\tcase W62_DFS:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\t\tbbcim_w62_to_dfs(&image, 1);\n\t\tbreak;\n\n\tcase SPLIT_CAT:\n\t\targc_check(argc, options, 1);\n\t\tstrcpy(cat_naam, argv [ options ]); options++;\n\n\t\tflags = BBCIM__NAME__KEEP_ROOT_DIR | BBCIM__NAME__KEEP_NONROOT_DIR;\n\t\tfor (i=/*2*/strlen(optie_strings [ optie ])+1; i<strlen(optstring); i++) {\n\t\t\tswitch (optstring[i]) {\n\t\t\tcase '@' : flags &= ~BBCIM__NAME__KEEP_ROOT_DIR; break;\n//\t\t\tcase '#' : flags &= ~(BBCIM__NAME__KEEP_NONROOT_DIR | BBCIM__NAME__KEEP_ROOT_DIR); break;\n\t\t\tdefault  : bad_option = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (bad_option == 1) { break; }\n\n\t\tbbcim_catalogue_to_inf(cat_naam, flags, 1);\n\t\tbreak;\n\n\tcase EXTRACT:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\n\t\tflags = BBCIM_EXTRACT_FILES | BBCIM_DISK_INFO | BBCIM__NAME__KEEP_ROOT_DIR | BBCIM__NAME__KEEP_NONROOT_DIR;\n\n\t\tfor (i=/*2*/strlen(optie_strings [ optie ])+1; i<strlen(optstring); i++) {\n\t\t\tswitch (optstring[i]) {\n\t\t\tcase 'd' : flags |=  BBCIM_EXTRACT_DIR; break;\n\t\t\tcase 's' : flags |=  BBCIM_SHORT_NAME; break;\n\t\t\tcase 'b' : flags &= ~BBCIM_DISK_INFO; break;\n\t\t\tcase '@' : flags &= ~BBCIM__NAME__KEEP_ROOT_DIR; break;\n//\t\t\tcase 'r' : flags |=  BBCIM_REMOVE_FILE; break;\n\t\t\tdefault  : bad_option = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tprintf(\"flags=0x%x\\n\", flags);\n\t\t\tif ((flags & BBCIM_SHORT_NAME) && (flags & BBCIM_EXTRACT_DIR)) {\n\t\t\t\tbad_option = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!bad_option) {\n\t\t\tint extract_given = 0;\n\t\t\tfor (i=options; i<argc; i++) {\n\t\t\t\tfile.attr->name = argv[i];\n\t\t\t\tbbcim_disk_cat_extract_crc(&image, side, &file, flags, 1);\n\t\t\t\textract_given++;\n\t\t\t}\n\t\t\tif (extract_given == 0) {\n\t\t\t\tif (bbcim_debug) printf(\"DEBUG: extract all\\n\");\n\t\t\t\tbbcim_disk_cat_extract_crc(&image, side, NULL, flags, 1);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase ADD:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\n\t\tflags = BBCIM_DISK_INFO;\n\t\tfor (i=2; i<strlen(optstring); i++) {\n\t\t\tswitch (optstring[i]) {\n\t\t\tcase 'r' : flags |=  BBCIM_REMOVE_FILE; break;\n\t\t\tcase 'b' : flags &= ~BBCIM_DISK_INFO;   break;\n\t\t\tdefault  : bad_option = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t/* Het volgende moet naar add_to_image() code (of NIET?). */\n\t\tfpdisk = fopen(disk, \"rb\");\n\t\tif (fpdisk == NULL) {\n\t\t\timage.attr->tracks = 80;\n\t\t\tbbcim_disk_new(&image, 1);\n\t\t\tprintf(TEKST_NL(\"Nieuw diskbeeld gemaakt\\n\")\n\t\t\t\t   TEKST_ENG(\"New disk image made\\n\"));\n\t\t}\n\t\telse fclose(fpdisk);\n\n\t\tfor (i=options; i<argc; i++) {\n\t\t\tif (!bbcim_disk_add_file(&image, side, argv[i], &file, flags, 1))\n\t\t\t\tprintf(\"%s: added\\n\", argv[i]);\n\t\t}\n\t\tbreak;\n\n\tcase DEL:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\n\t\tflags = 0;\n\t\targc_check(argc, options, 1); /* at least one! */\n\t\tfor (i=options; i<argc; i++) {\n\t\t\tbbcim_disk_del_file(&image, side, argv[i], flags, 1);\n\t\t}\n\t\tbreak;\n\n\tcase CAT:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\n\t\tflags = BBCIM_SHOW_FILES;\n\t\t{\n\t\t\tint extract_given = 0;\n\t\t\tfor (i=options; i<argc; i++) {\n\t\t\t\tfile.attr->name = argv[i];\n\t\t\t\tbbcim_disk_cat_extract_crc(&image, side, &file, flags, 1);\n\t\t\t\textract_given++;\n\t\t\t}\n\t\t\tif (extract_given == 0) {\n\t\t\t\tif (bbcim_debug) printf(\"DEBUG: extract all\\n\");\n\t\t\t\tbbcim_disk_cat_extract_crc(&image, side, NULL, flags, 1);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase CRC:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\n\t\tflags = BBCIM_CALC_CRC | BBCIM_SHOW_FILES;\n\t\tfor (i=options; i<argc; i++) {\n\t\t\tfile.attr->name = argv[i];\n\t\t\tbbcim_disk_cat_extract_crc(&image, side, &file, flags, 1);\n\t\t}\n\t\tif (options == argc)\n\t\t\tbbcim_disk_cat_extract_crc(&image, side, NULL, flags, 1);\n\t\tbreak;\n\n\tcase ARCHIVE_CLEANUP:\n\t\targc_check(argc, options, 1); /* at least one! */\n\t\tfor (i=options; i<argc; i++) {\n\t\t\tbbcim_archive_cleanup(argv[i], 1);\n\t\t}\n\t\tbreak;\n\n\tcase ARCHIVE_CRC:\n\t\targc_check(argc, options, 1); /* at least one! */\n\t\tfor (i=options; i<argc; i++) {\n\t\t\tbbcim_archive_crc_check(argv[i], 1);\n\t\t}\n\t\tbreak;\n\n\tcase DISKSIZE40:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\t\tbbcim_disk_expand(&image, 40*10, 1);\n\t\tbreak;\n\n\tcase DISKSIZE80:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\t\tbbcim_disk_expand(&image, 80*10, 1);\n\t\tbreak;\n\n\tcase MINIMISE:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\t\tbbcim_disk_minimise(&image, 1);\n\t\tbreak;\n\n\tcase MAXIMISE:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\t\tbbcim_disk_expand(&image, 1023, 1);\n\t\tbreak;\n\n\tcase NEW_DISK:\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\t\tbbcim_disk_new(&image, 1);\n\t\tbreak;\n\n\tcase BOOT:\n\t{\tint bootoption = 0;\n\t\toptions += get_disk_type_name_side(argv+options, argc-options, &image, &side);\n\n\t\targc_check(argc, options, 1);\n\t\tif (!strcmp(argv[options], \"none\")) bootoption = BBCIM_DFS_BOOTOPTION_NONE;\n\t\telse if (!strcmp(argv[options], \"EXEC\")) bootoption = BBCIM_DFS_BOOTOPTION_EXEC;\n\t\telse if (!strcmp(argv[options], \"RUN\")) bootoption = BBCIM_DFS_BOOTOPTION_RUN;\n\t\telse if (!strcmp(argv[options], \"LOAD\")) bootoption = BBCIM_DFS_BOOTOPTION_LOAD;\n\t\telse { bad_option = 1; break; }\n\n\t\tbbcim_disk_set_boot(&image, side, bootoption, 1);\n\t\tbreak;\n\t}\n\n\tcase ID:\n\t{\tint type_side0;\n\t\targc_check(argc, options, 1);\n\t\tbbcim_disk_identify(argv[options], &type_side0, 1);\n\t}\n\t\tbreak;\n\n\tdefault: bad_option = 1;\n\t\tbreak;\n\t}\n\n\tif (bad_option) {\n\t\t/* Don't do this again buddy! */\n\t\tfprintf(stderr,\n\t\t\t\tTEKST_NL(\"Foutieve optie %s\\n\")\n\t\t\t\tTEKST_ENG(\"Bad option %s\\n\"), argv[1]);\n\t\tuse();\n\t}\n\n\treturn bbcim_errno;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/functions/archive_cleanup.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * archive_cleanup.c\n * ENGLISH: cleans up the info file and renames (should rename be optional?)\n *\n * Copyright (C) W.H.Scholten 1996, 2001, 2003\n */\n\n#include <_bbc_filenames.h>\n#include <_bbc_crc.h>\nint bbcim_archive_cleanup(char *filename, int verbose);\n\n\nint bbcim_archive_cleanup(char *filename, int verbose) {\n\tFILE *fpadd, *fpinf;\n\tchar *inf_file = NULL;\n\tunsigned int crc;\n\tint  antwoord;\n\tchar bbcfile_naam [ 13 ];\n\tchar host_bbc_filename [ 15 ];\n\tchar nieuwe_inf [ 256 ];\n\tchar nieuwe_naam [ 256 ];\n\tint  found;\n\n\tstruct bbc_archive__file bbcfile;\n\tstruct bbc_archive__file_attr attr;\n\tbbcfile.attr = &attr;\n\n\t/*.inf bestanden overslaan:*/\n\tif (bbc_archive__is_inf_file(filename)) return 1;\n\n\t/* Bestaat het archief bestand? */\n\tfpadd = fopen(filename, \"rb\");\n\tif (fpadd == NULL) {\n\t\tfprintf(stderr, TEKST_NL(\"Archief bestand %s kan niet geopend worden\") TEKST_ENG(\"Archive file %s cannot be opened\") \"\\n\", filename);\n\t\treturn -1;\n\t}\n\tfclose(fpadd);\n\n\tif (bbc_archive__read_file_attributes(filename, &attr, 1)) return -1;\n\n\tinf_file = bbc_archive__new_inf_filename(filename, verbose);\n\tif (inf_file == NULL) return bbcim_errno;\n\n\tbbcim_reduce_bbcname__no_rootdir(host_bbc_filename, bbcfile_naam);\n#warning \"flags to choose between no_dir/no_rootdir?\"\n\tbbc_replace_bad_chars(host_bbc_filename);\n\n\t/* Hernoemen etc als naam al bestaat */\n\tstrcpy(nieuwe_naam, host_bbc_filename);\n\n\tif (strcmp(filename, host_bbc_filename)) {\n\t\tif ((fpadd = fopen(host_bbc_filename, \"rb\")) != NULL) {\n\t\t\tfclose(fpadd);\n\t\t\tantwoord = bbcim_overschrijf_vraag(filename, nieuwe_naam);\n\n\t\t\tswitch(antwoord) {\n\n\t\t\tcase BBCIM_OVERSCHRIJVEN:\n\t\t\t\trename(filename, host_bbc_filename);\n\t\t\t\tbreak;\n\n\t\t\tcase BBCIM_HERNOEM_NIEUW:\n\t\t\t\tstrcpy(host_bbc_filename, nieuwe_naam);\n\t\t\t\trename(filename, host_bbc_filename);\n\t\t\t\tbreak;\n\n\t\t\tcase BBCIM_HERNOEM_BESTAAND:\n\t\t\t\trename(host_bbc_filename, nieuwe_naam);\n\t\t\t\tstrcat(nieuwe_naam, \".inf\");\n\t\t\t\trename(inf_file, nieuwe_naam);\n\t\t\t\trename(filename, host_bbc_filename);\n\t\t\t\tbreak;\n\n\t\t\tcase BBCIM_SLA_OVER:\n\t\t\t\tif (inf_file) free(inf_file);\n\t\t\t\treturn -1;\n\t\t\t} /*switch*/\n\n\t\t}\n\t\telse\n\t\t\trename(filename, host_bbc_filename);\n\t} /*if*/\n\n\tstrcpy(nieuwe_inf, host_bbc_filename);\n\tstrcat(nieuwe_inf, \".inf\");\n\n\n\tfound = 0;\n\tif (bbcfile.attr->crc != -1) {\n\t\tint  recalculated_crc = bbc_fcrc(host_bbc_filename, 1);\n\t\tfound = 1;\n\t\tif (bbcfile.attr->crc != recalculated_crc) {\n\t\t\t\tprintf(TEKST_NL(\"fout, gevonden: %X, berekend: %X\")TEKST_ENG(\"wrong, found: %X, calculated: %X\"), (unsigned int) bbcfile.attr->crc, recalculated_crc);\n\t\t}\n\t\telse {\n\t\t\tprintf(TEKST_NL(\"in orde\") TEKST_ENG(\"ok\"));\n\t\t}\n\t}\n\telse {\n\t\t/* Add a CRC only if there wasnt one yet: */\n\t\tprintf(TEKST_NL(\"toegevoegd\") TEKST_ENG(\"added\"));\n\t}\n\tcrc = bbc_fcrc(host_bbc_filename, 0);\n\n\tremove(inf_file);\n\n\tfpinf = fopen(nieuwe_inf, \"w\");\n\tfprintf(fpinf, \"%-10s %8X %8X  CRC=%4X\", bbcfile_naam, attr.load_address, attr.exec_address, (unsigned int) crc);\n\tfclose(fpinf);\n\n\n\t/* Did the name actually change? */\n\tif (strcmp(filename, host_bbc_filename)) {\n\t\tprintf(TEKST_NL(\", hernoemd tot %s\\n\") TEKST_ENG(\", renamed to %s\\n\"), host_bbc_filename);\n\t}\n\telse printf(\"\\n\");\n\n\tif (inf_file) free(inf_file);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/functions/archive_crc_check.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * crc.c: check or make 16 bit crc's of files (see BBC user guide p.399)\n *\n * Copyright (C) W.H.Scholten 1996 - 2001\n */\n\n\n#include \"_bbc_crc.h\"\nint bbcim_archive_crc_check(char *filename, int verbose);\n\n\n/* CRC check for the archive format. Returns 0 = ok, -1 if a bad crc or no crc\n * was found, 1 if the file is an .inf file accompanying a real file.\n */\nint bbcim_archive_crc_check(char *filename, int verbose) {\n\tFILE *fp, *fp_inf;\n\tchar *filename_inf;\n\tint  found_crc;\n\tint  len_s;\n\tint  i;\n\n\tchar read_line[100];\n\tunsigned int crc;\n\tint  result = 0;\n\n\tstruct bbc_archive__file_attr bbcfile_attr;\n\tstruct bbc_archive__file bbcfile;\n\n\tbbcfile.filename = filename;\n\tbbcfile.attr = &bbcfile_attr;\n\n\t/* .inf bestanden overslaan: */\n\tif (bbc_archive__is_inf_file(filename)) return 1;\n\n\t/* Bestaat het archief bestand? */\n\tfp = fopen(filename, \"rb\");\n\tif (fp == NULL) {\n\t\tif (verbose) fprintf(stderr, TEKST_NL(\"Archief bestand %s kan niet geopend worden\\n\")\n\t\t\t   TEKST_ENG(\"Archive file %s cannot be opened\\n\")\n\t\t\t   , filename);\n\t\treturn -1;\n\t}\n\tfclose(fp);\n\n\tif (bbc_archive__read_file_attributes(filename, &bbcfile_attr, 1)) {\n\t\tbbc_archive__free_file_attributes(&bbcfile_attr);\n\t\treturn -1;\n\t}\n\n\tfilename_inf = bbc_archive__new_inf_filename(filename, verbose);\n\tif (filename_inf == NULL) return bbcim_errno;\n\n\tfp_inf = fopen(filename_inf, \"r\");\n\tif (fp_inf == NULL) { free(filename_inf); return -1; }\n\n\t/* CRC zoeken */\n\tfseek(fp_inf, 0L, SEEK_SET);\n\tfgets(read_line, 99, fp_inf);\n\n\tfound_crc = 0;\n\tlen_s = strlen(read_line);\n\tprintf(TEKST_NL(\"bestand %-9s (%-9s) CRC \")\n\t\t   TEKST_ENG(\"file %-9s (%-9s) CRC \")\n\t\t   , filename, (&bbcfile)->attr->name);\n\n\tfor (i=0; i<len_s-4; i++) {\n\t\tif (!strncmp(read_line+i, \"CRC=\", 4)) {\n\t\t\tfound_crc = 1;\n\t\t\tfseek(fp_inf, i+4L, SEEK_SET);\n\t\t\tfscanf(fp_inf, \"%x\", &crc);\n\t\t\tif (crc != bbc_fcrc(filename, 1)) {\n\t\t\t\tresult = -1;\n\t\t\t\tprintf(TEKST_NL(\"fout, gevonden: %4X\")\n\t\t\t\t\t   TEKST_ENG(\"wrong, found: %4X\")\n\t\t\t\t\t   , crc);\n\t\t\t\tcrc = bbc_fcrc(filename, 0);\n\t\t\t\tprintf(TEKST_NL(\", berekend: %4X\\n\")\n\t\t\t\t\t   TEKST_ENG(\", calculated: %4X\\n\")\n\t\t\t\t\t   , crc);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tprintf(TEKST_NL(\"in orde\\n\")\n\t\t\t\t\t   TEKST_ENG(\"OK\\n\"));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!found_crc)\n\t\tprintf(TEKST_NL(\"ontbreekt\\n\")\n\t\t\t   TEKST_ENG(\"missing\\n\"));\n\n\tfree(filename_inf);\n\tfclose(fp_inf);\n\n\treturn result;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/functions/catalogue_to_inf.c",
    "content": "/* BBCIM: Acorn BBC computer disk image manipulation\n *\n * catalogue_to_inf.c\n *\n * Copyright (C) W.H.Scholten 1996, 1997, 2000, 2001, 2003\n */\n\n#include <_bbc_filenames.h>\nint bbcim_catalogue_to_inf(char *cat_naam, int flags, int verbose);\n\n\n/* Convert entries from a catalogue file (a file with information as *CAT would\n * give on a BBC computer) to seperate .inf files for each catalogue entry.\n * Useful to convert xbeeb files to archive format for example.\n */\nint bbcim_catalogue_to_inf(char *cat_naam, int flags, int verbose) {\n\tFILE *fpcat, *fpinf;\n\tchar inf_file [256];\n\tchar nieuwe_naam [256];\n\tchar read_line [256];\n\tchar bbcfile_naam [ 15 ];\n\n\tif (bbcim_file_sanitycheck(cat_naam, verbose)) return bbcim_errno;\n\n\tfpcat = fopen(cat_naam, \"r\");\n\twhile (fscanf(fpcat, \"%12s\", bbcfile_naam) != EOF) {\n\t\tbbcfile_naam[9] = 0;\n\t\tfgets(read_line, 99, fpcat); /* Get remainder of line. */\n\t\tif (bbcfile_naam[1] == '.') { /* It's a line with file information */\n\t\t\tunsigned int load, exec, crc;\n\t\t\tint  i, args;\n\n\t\t\tbbc_replace_bad_chars(bbcfile_naam);\n\n\t\t\tif (!(flags & (BBCIM__NAME__KEEP_ROOT_DIR | BBCIM__NAME__KEEP_NONROOT_DIR)))\n\t\t\t\tbbcim_reduce_bbcname__no_dir(inf_file, bbcfile_naam);\n\t\t\telse if (flags & BBCIM__NAME__KEEP_ROOT_DIR)\n\t\t\t\tbbcim_reduce_bbcname__no_rootdir(inf_file, bbcfile_naam);\n\t\t\telse strcpy(inf_file, bbcfile_naam);\n\n\t\t\tstrcat(inf_file, \".inf\");\n\n\t\t\t/* Check if file exists (can be opened) */\n\t\t\tif ((fpinf = fopen(inf_file, \"r\")) != NULL) {\n\t\t\t\tint  antwoord;\n\n\t\t\t\tfclose(fpinf);\n\t\t\t\tantwoord = bbcim_overschrijf_vraag(inf_file, nieuwe_naam);\n\n\t\t\t\tswitch(antwoord) {\n\t\t\t\tcase BBCIM_OVERSCHRIJVEN:\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase BBCIM_HERNOEM_NIEUW:\n\t\t\t\t\tstrcpy(inf_file, nieuwe_naam); break;\n\n\t\t\t\tcase BBCIM_HERNOEM_BESTAAND:\n\t\t\t\t\trename(inf_file, nieuwe_naam); break;\n\n\t\t\t\tcase BBCIM_SLA_OVER:\n\t\t\t\t\tcontinue; /* next in while loop */\n\t\t\t\t} /* switch */\n\t\t\t}\n\t\t\t/* end of name check */\n\n\t\t\tfpinf = fopen(inf_file, \"w\");\n\t\t\tfprintf(fpinf, \"%s\", bbcfile_naam);\n\n\t\t\tfor (i=0; i<99; i++) {\n\t\t\t\tif (read_line[i] > ' ') break;\n\t\t\t}\n\n\t\t\targs = sscanf(read_line, \"%*[ L\\x09]%x %x %*[^=]=%x\", &load, &exec, (unsigned int *) &crc);\n\t\t\tfprintf(fpinf, \"  %6X  %6X\", load, exec);\n\t\t\tif (read_line[i] == 'L') fprintf(fpinf, \" Locked\");\n\t\t\tif (args == 3) fprintf(fpinf, \"  CRC=%4X\", (unsigned int) crc);\n\t\t\tfclose(fpinf);\n\t\t}\n\t\n\t}\n\tfclose(fpcat);\n\n\treturn 0;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/shared/_ansi_console.h",
    "content": "#ifndef _whs_console_h\n#define _whs_console_h\n\n/* Comment out if your console has no ANSI colours or you don't want to use colours: */\n#ifndef USE_ANSI_COLOURS\n#  error \"define USE_ANSI_COLOURS 1 or 0\"\n#endif\n\n#if USE_ANSI_COLOURS==1\n\n/* ANSI colour sequences */\n#define CONSOLE_RESTORE       \"\\033[0m\"\n#define CONSOLE_BOLD          \"\\033[1m\"\n#define CONSOLE_ITALIC        \"\\033[3m\" /* Usually not supported */\n#define CONSOLE_UNDERLINE     \"\\033[4m\" /* Not supported on standard FreeBSD terminal for example */\n#define CONSOLE_INVERT        \"\\033[7m\"\n#define CONSOLE_BLINK         \"\\033[5m\"\n#define CONSOLE_BLINK_OFF     \"\\033[25m\"\n\n\n#define CONSOLE_BLACK         \"\\033[30m\"\n#define CONSOLE_RED           \"\\033[31m\"\n#define CONSOLE_GREEN         \"\\033[32m\"\n#define CONSOLE_YELLOW        \"\\033[33m\"\n#define CONSOLE_BLUE          \"\\033[34m\"\n#define CONSOLE_MAGENTA       \"\\033[35m\"\n#define CONSOLE_CYAN          \"\\033[36m\"\n#define CONSOLE_WHITE         \"\\033[37m\"\n\n\n#define CONSOLE_GRAY          \"\\033[1;30m\" /* bright black */\n\n\n#define CONSOLE_BG_BLACK      \"\\033[40m\"\n#define CONSOLE_BG_RED        \"\\033[41m\"\n#define CONSOLE_BG_GREEN      \"\\033[42m\"\n#define CONSOLE_BG_YELLOW     \"\\033[43m\"\n#define CONSOLE_BG_BLUE       \"\\033[44m\"\n#define CONSOLE_BG_MAGENTA    \"\\033[45m\"\n#define CONSOLE_BG_CYAN       \"\\033[46m\"\n#define CONSOLE_BG_WHITE      \"\\033[47m\"\n\n\n\n#else /* No ANSI colours */\n#define CONSOLE_RESTORE       \"\"\n#define CONSOLE_BOLD          \"\"\n#define CONSOLE_ITALIC        \"\"\n#define CONSOLE_UNDERLINE     \"\"\n#define CONSOLE_INVERT        \"\"\n#define CONSOLE_BLINK         \"\"\n#define CONSOLE_BLINK_OFF     \"\"\n\n#define CONSOLE_BLACK         \"\"\n#define CONSOLE_RED           \"\"\n#define CONSOLE_GREEN         \"\"\n#define CONSOLE_YELLOW        \"\"\n#define CONSOLE_BLUE          \"\"\n#define CONSOLE_MAGENTA       \"\"\n#define CONSOLE_CYAN          \"\"\n#define CONSOLE_WHITE         \"\"\n#define CONSOLE_GRAY          \"\"\n\n\n#define CONSOLE_GRAY          \"\"\n\n\n#define CONSOLE_BG_BLACK      \"\"\n#define CONSOLE_BG_RED        \"\"\n#define CONSOLE_BG_GREEN      \"\"\n#define CONSOLE_BG_YELLOW     \"\"\n#define CONSOLE_BG_BLUE       \"\"\n#define CONSOLE_BG_MAGENTA    \"\"\n#define CONSOLE_BG_CYAN       \"\"\n#define CONSOLE_BG_WHITE      \"\"\n\n\n#endif\n\n#endif /*  _whs_console_h */\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/prog/utils.c",
    "content": "/* BBCIM: utils: utilities for the bbcim program\n\n   Copyright (C) W.H.Scholten 1996, 1997, 1999, 2001, 2003\n\n   Permission to use, copy, modify, distribute, and sell this software\n   and its documentation for any purpose is hereby granted without fee,\n   provided that the above copyright notice appear in all copies and\n   that both that copyright notice and this permission notice appear in\n   supporting documentation, and that the name of the copyright holder\n   not be used in advertising or publicity pertaining to distribution\n   of the software without specific, written prior permission. The\n   copyright holder makes no representations about the suitability of\n   this software for any purpose. It is provided \"as is\" without express\n   or implied warranty.\n  \n   THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS\n   SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n   FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY\n   SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n   RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF\n   CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n   CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n  \n  \n   Send comments and bug-reports to \n  \n      swhs-web@xs4all.nl\n  \n*/\n\n\n\n/*__________________INCLUDES___________________*/\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"_config.h\"\n#include <bbcim.h>\n\n#include \"../lib/bbcim_internal.h\" /* temp */\n\n\n/*__________________DATA___________________*/\n\n\n\n/*__________________PROGRAMMA___________________*/\nextern void argc_check(int argc, int options, int required);\n\n/* Prototypes: */\nvoid set_diskimage_defaults(struct bbc_archive__diskimage *image);\nvoid set_diskimage_invalid(struct bbc_archive__diskimage *image);\nint copy_disktype(struct bbc_archive__diskimage *from_image1, struct bbc_archive__diskimage *to_image2);\nint get_side(char **argv, int argc);\nint set_disktype(struct bbc_archive__diskimage *image, char **argv, int argc, int verbose);\nint get_disk_type_name_side(char **argv, int argc, struct bbc_archive__diskimage *image, int *side);\n\n\n/* Functions: */\n\n/* Disk defaults: */\nvoid set_diskimage_defaults(struct bbc_archive__diskimage *image) {\n//\timage->filename = disk;\n\n\timage->attr->type = BBC_ARCHIVE__DFS_DISK;\n\timage->attr->sides = 1;\n\timage->attr->tracks = 80;\n\timage->attr->sectors_per_track = BBCIM__SD_SECTORSPERTRACK;\n\timage->attr->bytes_per_sector = BBCIM__SD_SECTORSIZE;\n}\nvoid set_diskimage_invalid(struct bbc_archive__diskimage *image) {\n//\timage->filename = disk;\n\n\timage->attr->type = BBC_ARCHIVE__UNKNOWN_DISK;\n\timage->attr->sides = 0;\n\timage->attr->tracks = 0;\n\timage->attr->sectors_per_track = 0;\n\timage->attr->bytes_per_sector = 0;\n}\n\nint copy_disktype(struct bbc_archive__diskimage *from_image1, struct bbc_archive__diskimage *to_image2) {\n\tto_image2->attr->type = from_image1->attr->type;\n\tto_image2->attr->sides = from_image1->attr->sides;\n\tto_image2->attr->tracks = from_image1->attr->tracks;\n\tto_image2->attr->sectors_per_track = from_image1->attr->sectors_per_track;\n\tto_image2->attr->bytes_per_sector = from_image1->attr->bytes_per_sector;\n\n\treturn 0;\n}\n\n\nint get_side(char **argv, int argc) {\n\tint side = -1;\n\n\tif (argc < 2) return -1;\n\tif (!strcmp(argv[0], \"-side\")) {\n\t\tside = atol(argv[1]);\n\t}\n\n\treturn side;\n}\n\n\nint set_disktype(struct bbc_archive__diskimage *image, char **argv, int argc, int verbose) {\n//\tint i;\n\tint option = 0;\n\n\tfor (;;) {\n\t\tchar *arg = argv[option];\n\t\tif (argc - option < 2) break;\n\n\t\tif (bbcim_debug) fprintf(stderr, \"set_disktype: option %s\\n\", arg);\n\n\t\tif (arg == NULL) break;\n\t\tif (arg[0] != '-') break;\n\n\t\tif (!strcmp(arg, \"-type\")) {\n\t\t\tif (bbc_archive__diskinfo_from_string(argv[option+1], image->attr)) {\n\t\t\t\tbbcim_error = \"Bad option\\n\";\n\t\t\t\tbbcim_errno = BBCIM_ERROR__NO_INF_FOUND;\n\t\t\t\tif (verbose) fprintf(stderr, \"set_disktype: bad option %s\\n\", arg);\n//\t\t\t\treturn bbcim_errno;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\toption += 2;\n\t\t}\n\t\telse if (!strcmp(arg, \"-bytes\")) {\n\t\t\timage->attr->bytes_per_sector = atol(argv[option+1]);\n\t\t\toption += 2;\n\t\t}\n\t\telse if (!strcmp(arg, \"-sectors\")) {\n\t\t\timage->attr->sectors_per_track = atol(argv[option+1]);\n\t\t\toption += 2;\n\t\t}\n\t\telse if (!strcmp(arg, \"-tracks\")) {\n\t\t\timage->attr->tracks = atol(argv[option+1]);\n\t\t\toption += 2;\n\t\t}\n\t\telse if (!strcmp(arg, \"-sides\")) {\n\t\t\timage->attr->sides = atol(argv[option+1]);\n\t\t\toption += 2;\n\t\t}\n\t\telse break;\n\t}\n\n\treturn option;\n}\n\n\nint get_disk_type_name_side(char **argv, int argc, struct bbc_archive__diskimage *image, int *side) {\n\tstruct bbc_archive__diskimage image1;\n\tstruct bbc_archive__diskimage_attr image_attr1;\n\tint  options;\n\tint  tmp_side;\n\tint  st;\n\n\n\toptions = 0;\n\timage1.attr = &image_attr1;\n//\tset_diskimage_defaults(&image1);\n\tset_diskimage_invalid(&image1);\n\n\tst = set_disktype(&image1, argv+options, argc-options, 1);\n\tif (st > 0) { options += st; }\n\n\targc_check(argc, options, 1);\n\tstrcpy(image->filename, argv [ options ]); options++;\n\tif (strlen(image->filename) >= 4) {\n\t\tif (!strcmp(image->filename + strlen(image->filename)-4, \".ssd\")) {\n\t\t\tset_diskimage_defaults(&image1);\n\t\t\timage1.attr->sides = 1;\n\t\t}\n\t\telse if (!strcmp(image->filename + strlen(image->filename)-4, \".dsd\")) {\n\t\t\tset_diskimage_defaults(&image1);\n\t\t\timage1.attr->sides = 2;\n\t\t}\n\t}\n\tif (bbcim_debug) printf(\"DEBUG: image->filename=%s\\n,      image1->sides=%d\\n\", image->filename, image1.attr->sides);\n\n\tcopy_disktype(&image1, image);\n\tif (bbcim_debug) printf(\"DEBUG: image->sides=%d\\n\", image->attr->sides);\n\tif (bbc_archive__read_disk_attributes(image->filename, image->attr, 1)) {\n\t\tif (bbcim_debug) printf(\"no attributes found\\n\");\n//\t\tcopy_disktype(&image1, image);\n//\t\tprintf(\"image->attr->type=%d\\n\", image->attr->type);\n\t}\n\n\n\t/* Now set defaults for things not set by options/filename: */\n\tif (image->attr->type == BBC_ARCHIVE__UNKNOWN_DISK)\n\t\timage->attr->type = BBC_ARCHIVE__DFS_DISK;\n\tif (image->attr->sides == 0)\n\t\timage->attr->sides = 1;\n\tif (image->attr->tracks == 0)\n\t\timage->attr->tracks = 80;\n\tif (image->attr->sectors_per_track == 0)\n\t\timage->attr->sectors_per_track = BBCIM__SD_SECTORSPERTRACK;\n\tif (image->attr->bytes_per_sector == 0)\n\t\timage->attr->bytes_per_sector = BBCIM__SD_SECTORSIZE;\n\n//\targc_check(argc, options, 1);\n\n\ttmp_side = get_side(argv+options, argc-options);\n\tif (tmp_side >= 0) {\n\t\t*side = tmp_side;\n\t\toptions += 2;\n\t}\n\n\tif (options == 0) {\n\t\tfprintf(stderr,\n\t\t\t\tTEKST_NL(\"Disk?\\n\")\n\t\t\t\tTEKST_ENG(\"Disk?\"));\n\t\texit(1);\n\t}\n\n\treturn options;\n}\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/test/Makefile",
    "content": "SHELL = /bin/sh\n\n# Test for libbbcim\n#\n# This file is public domain, by W.H.Scholten 1996-2003\n#\n\n\nWARN\t= -Wall -Wstrict-prototypes -Wmissing-prototypes\n\nALL_CFLAGS = $(WARN) -I../lib/include -I../lib/archive_format -O2 -g\n\nall:\tlibtest\n\nlibtest:\tlibtest.o\n\t$(CC) -L../lib -o libtest libtest.o -lbbcim\n\nlibtest.o: libtest.c\n\n#\t$(CC) $(WARN) -I../lib/include -O2 -o bbcim.o -c bbcim.c\n\n\nclean:\n\trm -f libtest *.o *~ core *.core\n\n\n# // Compile C files to object files.\n.c.o:\n\tcc $(ALL_CFLAGS) -c -o $@ $<\n"
  },
  {
    "path": "tools/cc65/bbc/INSTALL/bbcim-1.2/test/libtest.c",
    "content": "/* libtest.c,  Copyright (C) 1997-2001, 2009 W.H. Scholten\n *\n * BBCIM: Acorn BBC computer disk image manipulation\n *\n * Tests libbbcim\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <bbcim.h>\n#include <_bbc_archive.h>\n\n\nvoid bbcimtest_list_bbc_files(char *dir);\nvoid bbcimtest_list_bbc_disks(char *dir);\n\nint  bbcimtest_find_file(char *dirname, char *filename, int action);\n#define BBCIM_FIND_FILE           1\n#define BBCIM_CLOSE_DIR           2\n\nint main(int argc, char **argv) {\n    struct bbc_archive__diskimage image;\n    struct bbc_archive__diskimage_attr image_attr;\n\n\tstruct bbc_archive__file file;\n\tstruct bbc_archive__file_attr file_attr;\n\tstruct bbcim_file_data file_data;\n\n\tint  i, crc;\n\tint  st;\n\n\tchar *mydisk;\n\n\tif (argc > 1) mydisk=argv[1]; else mydisk=\"ttt.w62\";\n\n\tprintf(\"mydisk=%s\\n\", mydisk);\n\n\tprintf(\"libbbcim test\\n\");\n\n\tprintf(\"listing all bbc disks:\\n\");\n\tbbcimtest_list_bbc_disks(\".\");\n\n\tprintf(\"\\nlisting all bbc files:\\n\");\n\tbbcimtest_list_bbc_files(\".\");\n\tprintf(\"\\n\");\n\n\timage.attr = &image_attr;\n\tfile.attr = &file_attr;\n\n\timage_attr.type = BBC_ARCHIVE__DFS_DISK;\n\timage_attr.sides = 1;\n\timage.filename = mydisk;\n\tprintf(\"image.filename=%s\\n\", image.filename);\n\n//\tdisk_catalogue_extract_crc(&image, 0, NULL, &file, SHOW_FILES | VERBOSE);\n\tst = bbcim_disk_cat_extract_crc(&image, 0 /*side*/, &file, BBCIM_NEW_DISK, 1);\n\tif (st) exit(1);\n\tst = bbcim_disk_cat_extract_crc(&image, 0 /*side*/, &file, BBCIM_GET_ATTRIBUTES, 1);\n\tif (st) exit(1);\n\tprintf(\"Attributes\\n\");\n\tprintf(\" file %s, %d bytes\\n\", file.attr->name, file.attr->length);\n\tprintf(\" load=%6x exec=%6x\\n\", file.attr->load_address, file.attr->exec_address);\n\n\tfile_data.data = (unsigned char *) malloc(file.attr->length + 1);\n\tst = bbcim_disk_cat_extract_crc(&image, 0 /*side*/, &file, BBCIM_LOAD_FILE, 1);\n\tif (st) exit(1);\n\tprintf(\"Loaded file %s, %d bytes\\n\", file.attr->name, file.attr->length);\n\tprintf(\" load=%6x exec=%6x\\n\", file.attr->load_address, file.attr->exec_address);\n\n\t/* 'Proof': calculate crc from data */\n\tcrc = 0;\n\n\tfor (i=0; i<file.attr->length; i++) {\n\t\tint k;\n\t\tint filebyte = file_data.data[i];\n\n\t\tcrc ^= (filebyte << 8);\n\t\tfor (k=0; k<8; k++) {\n\t\t\tif (crc & 32768)\n\t\t\t\tcrc = (((crc ^ 0x0810) & 32767) << 1)+1;\n\t\t\telse\n\t\t\t\tcrc = crc << 1;\n\t\t}\n\t}\n\n\tprintf(\"crc from data is %x\\n\", crc);\n\tfree(file_data.data);\n\n\n\treturn 0;\n}\n\n\n/* ------------------------------------------------------------------------- */\n/* DEMO...  Tests all files and tells if they are bbc files */\nvoid bbcimtest_list_bbc_files(char *dir) {\n\tchar filename[256];\n\tstruct bbc_archive__file file;\n\tstruct bbc_archive__file_attr file_attr;\n\n\tfile.attr = &file_attr;\n\n\tprintf(\"checking all bbc files\\n\");\n\twhile (bbcimtest_find_file(dir, filename, BBCIM_FIND_FILE) != -1) {\n\t\tfile.filename = filename;\n\t\tif (!bbc_archive__read_file_attributes(filename, file.attr, 0)) {\n\t\t\tprintf(\" %s is a bbc file\\n\", filename);\n\t\t}\n\t}\n}\n\n\n/* DEMO...  Tests all files and tells if they are bbc disks */\nvoid bbcimtest_list_bbc_disks(char *dir) {\n\tchar filename[256];\n\tstruct bbc_archive__diskimage image;\n\tstruct bbc_archive__diskimage_attr image_attr;\n\n\timage.attr = &image_attr;\n\n\tprintf(\"checking all bbc disks\\n\");\n\twhile (bbcimtest_find_file(dir, filename, BBCIM_FIND_FILE) != -1) {\n\t\timage.filename = filename;\n\t\tif (!bbc_archive__read_disk_attributes(filename, image.attr, 0))\n\t\t\tprintf(\" %s is a bbc disk\\n\", filename);\n\t}\n}\n\n\n#  include <sys/types.h>\n#  include <dirent.h>\n\n\n/* A readdir wrapper: returns 0 if ok, -1 if no more files */\nint bbcimtest_find_file(char *dirname, char *filename, int action) {\n\tstatic struct dirent *currentdirentry;\n\tstatic DIR *thisdir;\n\tstatic int dir_open;\n\n\tswitch(action) {\n\tcase BBCIM_FIND_FILE:\n\t\tif (!dir_open)\n\t\t\tthisdir = opendir(dirname);\n\t\tdir_open = 1;\n\t\tfor (;;) {\n\t\t\tcurrentdirentry = readdir(thisdir); /* next entry */\n\t\t\tif (currentdirentry == NULL) { /* last entry */\n\t\t\t\tclosedir(thisdir);\n\t\t\t\tdir_open = 0;\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (strcmp(currentdirentry->d_name, \".\") && strcmp(currentdirentry->d_name, \"..\")) break;\n\t\t}\n\t\tstrcpy(filename, currentdirentry->d_name);\n\t\t/* printf(\"Filename %s\\n\", currentdirentry->d_name); */\n\t\tbreak;\n\tcase BBCIM_CLOSE_DIR:\n\t\tif (dir_open)\n\t\t\tclosedir(thisdir);\n\t\tdir_open = 0;\n\t}\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tools/cc65/c64/prg2crt.py",
    "content": "import argparse\r\nimport binascii\r\nimport array\r\n\r\n# command line parsing\r\nparser = argparse.ArgumentParser(description='Converts C64 PRG to a CRT file.')\r\nparser.add_argument('input.prg', action = 'store')\r\nparser.add_argument('output.crt', action = 'store')\r\nargs = parser.parse_args()\r\ninputFilename = args.__dict__['input.prg']\r\noutputFilename = args.__dict__['output.crt']\r\n\r\n# open PRG file and read into array\r\ninputFile = open(inputFilename, 'rb')\r\nprg = bytearray(inputFile.read())\r\n\r\n# output data array\r\ncrtData = bytearray()\r\n\r\n# helper function to write binary data to the CRT file\r\ndef writeHex(string):\r\n\tglobal crtData\r\n\tcrtData += bytearray.fromhex(string)\r\n\r\n# CRT signature\r\nwriteHex('43 36 34 20 43 41 52 54 52 49 44 47 45 20 20 20')\r\n\r\n# header length\r\nwriteHex('00 00 00 40')\r\n\r\n# cartridge version\r\nwriteHex('01 00')\r\n\r\n# cartridge hardware type: Magic Desk\r\nwriteHex('00 13')\r\n\r\n# EXROM status\r\nwriteHex('00')\r\n\r\n# GAME status\r\nwriteHex('01')\r\n\r\n# reserved\r\nwriteHex('00 00 00 00 00 00')\r\n\r\n# cartridge name\r\nwriteHex('00'*32)\r\n\r\n\r\n# ROM content\r\ncontent = bytearray()\r\n\r\n# add loader (from \"loader.bin\" file)\r\n#loaderFile = open('loader.bin', 'rb')\r\n#loader = loaderFile.read()\r\n#content += bytearray(loader)\r\n#print ''.join( [ \"%02X \" % ord( x ) for x in loader ] ).strip()\r\n\r\n# add loader inline\r\ncontent += bytearray.fromhex(\r\n\t'09 80 09 80 C3 C2 CD 38 30 78 8E 16 D0 20 A3 FD 20 50 FD A9 A0 8D 84 02 20 15' +\r\n\t'FD 20 5B FF 58 20 53 E4 20 BF E3 20 22 E4 A2 FB 9A A9 00 85 57 AD 9A 80 85 58' +\r\n\t'AD 9B 80 85 59 AD 9C 80 85 2D AD 9D 80 85 2E A9 9E 85 5A A9 80 85 5B A2 00 BD' +\r\n\t'59 80 9D 00 06 E8 D0 F7 4C 00 06 78 A2 00 A5 57 8D 00 DE A1 5A 81 2D E6 5A D0' +\r\n\t'13 E6 5B A5 5B C9 A0 D0 0B A9 80 85 5B E6 57 A5 57 8D 00 DE E6 2D D0 02 E6 2E' +\r\n\t'C6 58 D0 DB C6 59 A5 59 C9 FF D0 D3 A9 80 8D 00 DE 20 63 A6 58 4C AE A7')\r\n\r\n# add program size, minus the first two bytes for start address\r\nsize = len(prg) - 2\r\ncontent.append(size & 0xff)\r\ncontent.append(int(size / 0x100))\r\n\r\n# add program, with start address\r\ncontent += prg\r\n\r\n# align to 0x2000 bytes\r\nwhile (len(content) & 0x1fff) != 0:\r\n\tcontent.append(0)\r\n\r\n\r\n# save content as Chip blocks\r\nbanks = int(len(content) / 0x2000)\r\nfor bank in range(0, banks):\r\n\t# CHIP\r\n\twriteHex('43484950')\r\n\t\r\n\t# total packet length: 0x2010 (ROM image size + CHIP header)\r\n\twriteHex('00 00 20 10')\r\n\t\r\n\t# chip type: ROM\r\n\twriteHex('00 00')\r\n\t\r\n\t# bank number\r\n\tcrtData.append(0)\r\n\tcrtData.append(bank)\r\n\t\r\n\t# starting load address\r\n\twriteHex('80 00')\r\n\t\r\n\t# ROM image size\r\n\twriteHex('20 00')\r\n\t\r\n\t# 0x2000 bytes ROM image\r\n\tstart = 0x2000 * bank\r\n\tend = start + 0x2000\r\n\tcrtData += content[start:end]\r\n\r\n# save module\r\ncrt = open(outputFilename, 'wb')\r\ncrt.write(crtData)\r\ncrt.close()\r\n"
  },
  {
    "path": "tools/cc65/gamate/gamate-fixcart.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n\nFILE *in;\nunsigned int n, i, c;\n\nvoid usage(char *arg)\n{\n    printf(\"usage: %s [file]\\n\", arg);\n    exit(-1);\n}\n\nint main(int argc, char *argv[]) {\n    if (argc < 2) {\n        usage(argv[0]);\n        exit(-1);\n    }\n\n    if (!(in = fopen(argv[1], \"r+b\"))) {\n        fprintf(stderr, \"couldnt open: '%s'\\n\", argv[1]);\n        exit(-1);\n    }\n    /* read 0x1000 bytes from 0x7000-0x7fff (offset 0x1000) */\n    fseek(in, 0x1000, SEEK_SET);\n    n = 0; for (i = 0; i < 0x1000; i++) {\n        c =  fgetc(in);\n        n += c;\n    }\n    /* write checksum to header */\n    fseek(in, 0, SEEK_SET);\n    fputc(n & 0xff, in);\n    fputc((n >> 8) & 0xff, in);\n\n    fclose(in);\n    return (0);\n}\n\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/AUTHORS",
    "content": "Copyright (C) 2014 Scott Finneran <scottfinneran@yahoo.com.au>\nCopyright (C) 1998-2014 Peter Miller <pmiller@opensource.org.au>\n                   David Kozub <zub@linux.fjfi.cvut.cz>, MsBin\nCopyright (C) 2008 Torsten Sadowski <tsadowski@gmx.net>, Forth\nCopyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>, [L]GPL\nCopyright (C) 2000 Hendrik De Vloed <hendrik.devloed@ugent.be>, vhdl\nCopyright (C) 1986 Gary S Brown, crc32\n                   Stefan Schauer <s-schauer1@ti.com>, ti-txt\n                   Jim Holt <Jim.Holt@motorola.com>, vmem\n                   David Fenyes <dave@fenyes.net>, os65v\n                   Holger Mueller <hmueller@sitronic.com>, bit-not\n\nvim: set ts=8 sw=4 et\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/BUILDING",
    "content": "Build(SRecord)                                                  Build(SRecord)\n\n\n\nNAME\n        How to build SRecord\n\nSPACE REQUIREMENTS\n        You will need about 3MB to unpack and build the SRecord package.  Your\n        milage may vary.\n\nBEFORE YOU START\n        There are a few pieces of software you may want to fetch and install\n        before you proceed with your installation of SRecord.\n\n        Boost Library\n                You will need the C++ Boost Library.  If you are using a\n                package based system, you will need the libboost-devel\n                package, or one named something very similar.\n                http://boost.org/\n\n        Libgcrypt Library\n                You will need the GNU Crypt library.  If you are using a\n                package based system, you will need the libgcrypt-devel\n                package, or one named something very similar.\n                http://directory.fsf.org/project/libgcrypt/\n\n        GNU Libtool\n                You will need the GNU Libtool software, used to build shared\n                libraries on a variety of systems.\n                http://www.gnu.org/software/libtool/\n\n        GNU Groff\n                The documentation for the SRecord package was prepared using\n                the GNU Groff package (version 1.14 or later).  This\n                distribution includes full documentation, which may be\n                processed into PostScript or DVI files at install time - if\n                GNU Groff has been installed.\n\n        GCC     You may also want to consider fetching and installing the GNU\n                C Compiler if you have not done so already.  This is not\n                essential.  SRecord was developed using the GNU C++ compiler,\n                and the GNU C++ libraries.\n\n        The GNU FTP archives may be found at ftp.gnu.org, and are mirrored\n        around the world.\n\nSITE CONFIGURATION\n        The SRecord package is configured using the configure program included\n        in this distribution.\n\n        The configure shell script attempts to guess correct values for\n        various system-dependent variables used during compilation, and\n        creates the Makefile and lib/config.h files.  It also creates a shell\n        script config.status that you can run in the future to recreate the\n        current configuration.\n\n        Normally, you just cd to the directory containing SRecord's source\n        code and then type\n                % ./configure\n                ...lots of output...\n                %\n        If you're using csh on an old version of System V, you might need to\n        type\n                % sh configure\n                ...lots of output...\n                %\n        instead to prevent csh from trying to execute configure itself.\n\n        Running configure takes a minute or two.  While it is running, it\n        prints some messages that tell what it is doing.  If you don't want to\n        see the messages, run configure using the quiet option; for example,\n                % ./configure --quiet\n                %\n\n        To compile the SRecord package in a different directory from the one\n        containing the source code, you must use a version of make that\n        supports the VPATH variable, such as GNU make.  cd to the directory\n        where you want the object files and executables to go and run the\n        configure script.  configure automatically checks for the source code\n        in the directory that configure is in and in ..  (the parent\n        directory).  If for some reason configure is not in the source code\n        directory that you are configuring, then it will report that it can't\n        find the source code.  In that case, run configure with the option\n        --srcdir=DIR, where DIR is the directory that contains the source\n        code.\n\n        By default, configure will arrange for the make install command to\n        install the SRecord package's files in /usr/local/bin, and\n        /usr/local/man.  There are options which allow you to control the\n        placement of these files.\n\n        --prefix=PATH\n                This specifies the path prefix to be used in the installation.\n                Defaults to /usr/local unless otherwise specified.\n\n        --exec-prefix=PATH\n                You can specify separate installation prefixes for\n                architecture-specific files files.  Defaults to ${prefix}\n                unless otherwise specified.\n\n        --bindir=PATH\n                This directory contains executable programs.  On a network,\n                this directory may be shared between machines with identical\n                hardware and operating systems; it may be mounted read-only.\n                Defaults to ${exec_prefix}/bin unless otherwise specified.\n\n        --mandir=PATH\n                This directory contains the on-line manual entries.  On a\n                network, this directory may be shared between all machines; it\n                may be mounted read-only.  Defaults to ${prefix}/man unless\n                otherwise specified.\n\n        configure ignores most other arguments that you give it; use the\n        --help option for a complete list.\n\n        On systems that require unusual options for compilation or linking\n        that the SRecord package's configure script does not know about, you\n        can give configure initial values for variables by setting them in the\n        environment.  In Bourne-compatible shells, you can do that on the\n        command line like this:\n                $ CXX='g++ -traditional' LIBS=-lposix ./configure\n                ...lots of output...\n                $\n        Here are the make variables that you might want to override with\n        environment variables when running configure.\n\n        Variable: CXX\n                C++ compiler program.  The default is c++.\n\n        Variable: CPPFLAGS\n                Preprocessor flags, commonly defines and include search paths.\n                Defaults to empty.  It is common to use\n                CPPFLAGS=-I/usr/local/include to access other installed\n                packages.\n\n        Variable: INSTALL\n                Program to use to install files.  The default is install if\n                you have it, cp otherwise.\n\n        Variable: LIBS\n                Libraries to link with, in the form -lfoo -lbar.  The\n                configure script will append to this, rather than replace it.\n                It is common to use LIBS=-L/usr/local/lib to access other\n                installed packages.\n\n        If you need to do unusual things to compile the package, the author\n        encourages you to figure out how configure could check whether to do\n        them, and mail diffs or instructions to the author so that they can be\n        included in the next release.\n\nBUILDING SRECORD\n        All you should need to do is use the\n                % make\n                ...lots of output...\n                %\n        command and wait.  When this finishes you should see a directory\n        called bin containing three files: srec_cat, srec_cmp and srec_info.\n\n        srec_cat\n                srec_cat program is used to manipulate and convert EPROM load\n                files.  For more information, see srec_cat(1).\n\n        srec_cmp\n                The srec_cmp program is used to compare EPROM load files.  For\n                more information, see srec_cmp(1).\n\n        srec_info\n                The srec_info program is used to print information about EPROM\n                load files.  For more information, see srec_info(1).\n\n        If you have GNU Groff installed, the build will also create a\n        etc/reference.ps file.  This contains the README file, this BUILDING\n        file, and all of the man pages.\n\n        You can remove the program binaries and object files from the source\n        directory by using the\n                % make clean\n                ...lots of output...\n                %\n        command.  To remove all of the above files, and also remove the\n        Makefile and lib/config.h and config.status files, use the\n                % make distclean\n                ...lots of output...\n                %\n        command.\n\n        The file etc/configure.in is used to create configure by a GNU program\n        called autoconf.  You only need to know this if you want to regenerate\n        configure using a newer version of autoconf.\n\n   Windows NT\n        It is possible to build SRecord on MS Windows platforms, using the\n        Cygwin (see www.cygwin.com) or DJGPP (see www.delorie.com/djgpp)\n        environments.  This provides the \"porting layer\" necessary to run Unix\n        programs on Windows.  The build process is exactly as described above.\n\n        You may need to pass in the include path to the Boost library.  This\n        is most simply done as\n                CC='gcc -no-cygwin' \\\n                CXX='g++ -mno-cygwin -I/usr/include/boost-1_33_1' \\\n\n        DJGPP always produces native binaries, however if you want to make\n        native binaries with Cygwin (i.e. ones which work outside Cygwin)\n        there is one extra step you need after running ./configure and before\n        you run make.  You need to edit the Makefile file, and add -mno-cygwin\n        to the end of the CXX=g++ line.\n\n        Once built (using either tool set) Windows binaries should be testable\n        in the same way as described in the next section.  However, there may\n        be some CRLF issues in the text file comparisons which give false\n        negatives, depending on the CRLF setting of your Cygwin file system\n        when you unpacked the tarball.\n\nTESTING SRECORD\n        The SRecord package comes with a test suite.  To run this test suite,\n        use the command\n                % make sure\n                ...lots of output...\n                Passed All Tests\n                %\n\n        The tests take a few seconds each, with a few very fast, and a couple\n        very slow, but it varies greatly depending on your CPU.\n\n        If all went well, the message\n                Passed All Tests\n        should appear at the end of the make.\n\nINSTALLING SRECORD\n        As explained in the SITE CONFIGURATION section, above, the SRecord\n        package is installed under the /usr/local tree by default.  Use the\n        --prefix=PATH option to configure if you want some other path.  More\n        specific installation locations are assignable, use the --help option\n        to configure for details.\n\n        All that is required to install the SRecord package is to use the\n                % make install\n                ...lots of output...\n                %\n        command.  Control of the directories used may be found in the first\n        few lines of the Makefile file and the other files written by the\n        configure script; it is best to reconfigure using the configure\n        script, rather than attempting to do this by hand.\n\nGETTING HELP\n        If you need assistance with the SRecord package, please post to the\n        srecord-users mailing list\n                srecord-users@lists.sourceforge.net\n        For information obout the srecord-users mailing list.\n        http://srecord.sourceforge.net/mailing-list.html\n\n        When reporting problems, please include the version number given by\n        the\n                % srec_cat -version\n                srecord version 1.64.D001\n                ...warranty disclaimer...\n                %\n        command.  Please do not send this example; run the program for the\n        exact version number.\n\nCOPYRIGHT\n        srecord version 1.64\n        Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,\n        2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Peter Miller\n        Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,\n        2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 SCott Finneran\n\n        The SRecord package is distributed in the hope that it will be useful,\n        but WITHOUT ANY WARRANTY; without even the implied warranty of\n        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n        General Public License for more details.\n\n        It should be in the LICENSE file included with this distribution.\n\nAUTHOR\n        Scott Finneran   E-Mail:   scottfinneran@yahoo.com.au\n        Peter Miller     E-Mail:   pmiller@opensource.org.au\n\n\n\nReference Manual                    SRecord                     Build(SRecord)\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/LICENSE",
    "content": "GPL(GNU)                   Free Software Foundation                   GPL(GNU)\n\n\n\n                             GNU GENERAL PUBLIC LICENSE\n                               Version 3, 29 June 2007\n\n       Copyright  (C)  2007  Free  Software Foundation, Inc. <http://fsf.org/>\n       Everyone is permitted to copy and distribute verbatim  copies  of  this\n       license document, but changing it is not allowed.\n\n                                      Preamble\n\n       The GNU General Public License is a free, copyleft license for software\n       and other kinds of works.\n\n       The licenses for most software and other practical works  are  designed\n       to  take away your freedom to share and change the works.  By contrast,\n       the GNU General Public License is intended to guarantee your freedom to\n       share  and  change  all versions of a program - to make sure it remains\n       free software for all its users.  We, the Free Software Foundation, use\n       the  GNU  General  Public  License for most of our software; it applies\n       also to any other work released this way by its authors.  You can apply\n       it to your programs, too.\n\n       When we speak of free software, we are referring to freedom, not price.\n       Our General Public Licenses are designed to make sure that you have the\n       freedom  to  distribute copies of free software (and charge for them if\n       you wish), that you receive source code or can get it if you  want  it,\n       that  you  can change the software or use pieces of it in new free pro-\n       grams, and that you know you can do these things.\n\n       To protect your rights, we need to  prevent  others  from  denying  you\n       these  rights  or  asking  you to surrender the rights.  Therefore, you\n       have certain responsibilities if you distribute copies of the software,\n       or if you modify it: responsibilities to respect the freedom of others.\n\n       For example, if you distribute copies of such a program, whether gratis\n       or for a fee, you must pass on to the recipients the same freedoms that\n       you  received.   You  must make sure that they, too, receive or can get\n       the source code.  And you must show them these terms so they know their\n       rights.\n\n       Developers that use the GNU GPL protect your rights with two steps: (1)\n       assert copyright on the software, and (2) offer you this License giving\n       you legal permission to copy, distribute and/or modify it.\n\n       For  the  developers' and authors' protection, the GPL clearly explains\n       that there is no warranty for this free software.  For both users'  and\n       authors'  sake,  the  GPL  requires that modified versions be marked as\n       changed, so that their problems will not be attributed  erroneously  to\n       authors of previous versions.\n\n       Some  devices are designed to deny users access to install or run modi-\n       fied versions of the software inside them,  although  the  manufacturer\n       can do so.  This is fundamentally incompatible with the aim of protect-\n       ing users' freedom to change the software.  The systematic  pattern  of\n       such abuse occurs in the area of products for individuals to use, which\n       is precisely  where  it  is  most  unacceptable.   Therefore,  we  have\n       designed  this  version  of  the GPL to prohibit the practice for those\n       products.  If such problems arise substantially in  other  domains,  we\n       stand  ready  to  extend this provision to those domains in future ver-\n       sions of the GPL, as needed to protect the freedom of users.\n\n       Finally, every program is threatened constantly  by  software  patents.\n       States  should  not  allow  patents  to restrict development and use of\n       software on general-purpose computers, but in those that do, we wish to\n       avoid  the  special danger that patents applied to a free program could\n       make it effectively proprietary.  To prevent this, the GPL assures that\n       patents cannot be used to render the program non-free.\n\n       The  precise terms and conditions for copying, distribution and modifi-\n       cation follow.\n\n                                TERMS AND CONDITIONS\n\n       0. Definitions.\n\n       \"This License\" refers to version 3 of the GNU General Public License.\n\n       \"Copyright\" also means copyright-like laws that apply to other kinds of\n       works, such as semiconductor masks.\n\n       \"The  Program\"  refers  to  any  copyrightable work licensed under this\n       License.  Each licensee is addressed as \"you\".  \"Licensees\" and \"recip-\n       ients\" may be individuals or organizations.\n\n       To  \"modify\" a work means to copy from or adapt all or part of the work\n       in a fashion requiring copyright permission, other than the  making  of\n       an  exact  copy.   The resulting work is called a \"modified version\" of\n       the earlier work or a work \"based on\" the earlier work.\n\n       A \"covered work\" means either the unmodified Program or a work based on\n       the Program.\n\n       To  \"propagate\"  a work means to do anything with it that, without per-\n       mission, would make you directly or secondarily liable for infringement\n       under  applicable  copyright  law, except executing it on a computer or\n       modifying a private copy.  Propagation includes  copying,  distribution\n       (with  or without modification), making available to the public, and in\n       some countries other activities as well.\n\n       To \"convey\" a work means any kind of  propagation  that  enables  other\n       parties  to  make  or  receive  copies.   Mere  interaction with a user\n       through a computer network, with no transfer of a copy, is not  convey-\n       ing.\n\n       An  interactive  user interface displays \"Appropriate Legal Notices\" to\n       the extent that it includes a convenient and prominently  visible  fea-\n       ture  that  (1) displays an appropriate copyright notice, and (2) tells\n       the user that there is no warranty for the work (except to  the  extent\n       that warranties are provided), that licensees may convey the work under\n       this License, and how to view a copy of this License.  If the interface\n       presents  a  list of user commands or options, such as a menu, a promi-\n       nent item in the list meets this criterion.\n\n       1. Source Code.\n\n       The \"source code\" for a work means the preferred form of the  work  for\n       making modifications to it.  \"Object code\" means any non-source form of\n       a work.\n\n       A \"Standard Interface\" means an interface that either  is  an  official\n       standard  defined  by  a  recognized standards body, or, in the case of\n       interfaces specified for a particular programming language, one that is\n       widely used among developers working in that language.\n\n       The  \"System  Libraries\"  of an executable work include anything, other\n       than the work as a whole, that (a) is included in the  normal  form  of\n       packaging a Major Component, but which is not part of that Major Compo-\n       nent, and (b) serves only to enable use of the  work  with  that  Major\n       Component,  or to implement a Standard Interface for which an implemen-\n       tation is available to the public in source code form.  A \"Major Compo-\n       nent\", in this context, means a major essential component (kernel, win-\n       dow system, and so on) of the specific operating  system  (if  any)  on\n       which the executable work runs, or a compiler used to produce the work,\n       or an object code interpreter used to run it.\n\n       The \"Corresponding Source\" for a work in object code form means all the\n       source  code  needed to generate, install, and (for an executable work)\n       run the object code and to modify the work, including scripts  to  con-\n       trol  those activities.  However, it does not include the work's System\n       Libraries, or general-purpose tools or generally  available  free  pro-\n       grams  which  are  used  unmodified  in performing those activities but\n       which are not part of the  work.   For  example,  Corresponding  Source\n       includes  interface  definition  files associated with source files for\n       the work, and the source code  for  shared  libraries  and  dynamically\n       linked  subprograms  that the work is specifically designed to require,\n       such as by intimate data communication or control  flow  between  those\n       subprograms and other parts of the work.\n\n       The  Corresponding  Source  need  not  include  anything that users can\n       regenerate automatically from other parts of the Corresponding Source.\n\n       The Corresponding Source for a work in source code form  is  that  same\n       work.\n\n       2. Basic Permissions.\n\n       All rights granted under this License are granted for the term of copy-\n       right on the Program, and are irrevocable provided  the  stated  condi-\n       tions  are met.  This License explicitly affirms your unlimited permis-\n       sion to run the unmodified Program.  The output from running a  covered\n       work  is covered by this License only if the output, given its content,\n       constitutes a covered work.  This License acknowledges your  rights  of\n       fair use or other equivalent, as provided by copyright law.\n\n       You  may  make, run and propagate covered works that you do not convey,\n       without conditions so long as your license otherwise remains in  force.\n       You  may  convey covered works to others for the sole purpose of having\n       them make modifications exclusively for you, or provide you with facil-\n       ities  for running those works, provided that you comply with the terms\n       of this License in conveying all material for which you do not  control\n       copyright.  Those thus making or running the covered works for you must\n       do so exclusively on your behalf, under your direction and control,  on\n       terms  that  prohibit  them  from making any copies of your copyrighted\n       material outside their relationship with you.\n\n       Conveying under any other circumstances is permitted solely  under  the\n       conditions stated below.  Sublicensing is not allowed; section 10 makes\n       it unnecessary.\n\n       3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n       No covered work shall be deemed part of an effective technological mea-\n       sure  under  any applicable law fulfilling obligations under article 11\n       of the WIPO copyright treaty adopted on 20 December  1996,  or  similar\n       laws prohibiting or restricting circumvention of such measures.\n\n       When  you  convey  a  covered work, you waive any legal power to forbid\n       circumvention of technological measures to the extent  such  circumven-\n       tion  is  effected by exercising rights under this License with respect\n       to the covered work, and you disclaim any intention to limit  operation\n       or modification of the work as a means of enforcing, against the work's\n       users, your or third parties' legal rights to forbid  circumvention  of\n       technological measures.\n\n       4. Conveying Verbatim Copies.\n\n       You  may  convey  verbatim  copies  of the Program's source code as you\n       receive it, in any medium, provided that you conspicuously  and  appro-\n       priately  publish  on  each  copy an appropriate copyright notice; keep\n       intact all notices stating that this  License  and  any  non-permissive\n       terms added in accord with section 7 apply to the code; keep intact all\n       notices of the absence of any warranty; and give all recipients a  copy\n       of this License along with the Program.\n\n       You may charge any price or no price for each copy that you convey, and\n       you may offer support or warranty protection for a fee.\n\n       5. Conveying Modified Source Versions.\n\n       You may convey a work based on the Program,  or  the  modifications  to\n       produce it from the Program, in the form of source code under the terms\n       of section 4, provided that you also meet all of these conditions:\n\n       a)  The work must carry prominent notices stating that you modified it,\n           and giving a relevant date.\n\n       b)  The  work  must carry prominent notices stating that it is released\n           under this License and any conditions added under section 7.   This\n           requirement  modifies  the requirement in section 4 to \"keep intact\n           all notices\".\n\n       c)  You must license the entire work, as a whole, under this License to\n           anyone  who  comes  into  possession  of a copy.  This License will\n           therefore apply, along with any  applicable  section  7  additional\n           terms,  to  the whole of the work, and all its parts, regardless of\n           how they are packaged.  This License gives no permission to license\n           the  work in any other way, but it does not invalidate such permis-\n           sion if you have separately received it.\n\n       d)  If the work has interactive  user  interfaces,  each  must  display\n           Appropriate  Legal Notices; however, if the Program has interactive\n           interfaces that do not display Appropriate Legal Notices, your work\n           need not make them do so.\n\n       A  compilation  of  a  covered work with other separate and independent\n       works, which are not by their nature extensions of  the  covered  work,\n       and which are not combined with it such as to form a larger program, in\n       or on a volume of a  storage  or  distribution  medium,  is  called  an\n       \"aggregate\" if the compilation and its resulting copyright are not used\n       to limit the access or legal rights of the compilation's  users  beyond\n       what  the  individual  works permit.  Inclusion of a covered work in an\n       aggregate does not cause this License to apply to the  other  parts  of\n       the aggregate.\n\n       6. Conveying Non-Source Forms.\n\n       You  may  convey  a covered work in object code form under the terms of\n       sections 4 and 5, provided that you also  convey  the  machine-readable\n       Corresponding  Source  under the terms of this License, in one of these\n       ways:\n\n       a)  Convey the object code in,  or  embodied  in,  a  physical  product\n           (including a physical distribution medium), accompanied by the Cor-\n           responding Source fixed on a durable  physical  medium  customarily\n           used for software interchange.\n\n       b)  Convey  the  object  code  in,  or  embodied in, a physical product\n           (including a physical distribution medium), accompanied by a  writ-\n           ten  offer, valid for at least three years and valid for as long as\n           you offer spare parts or customer support for that  product  model,\n           to  give  anyone who possesses the object code either (1) a copy of\n           the Corresponding Source for all the software in the  product  that\n           is  covered by this License, on a durable physical medium customar-\n           ily used for software interchange, for a price no  more  than  your\n           reasonable  cost of physically performing this conveying of source,\n           or (2) access to copy  the  Corresponding  Source  from  a  network\n           server at no charge.\n\n       c)  Convey  individual  copies  of  the  object code with a copy of the\n           written offer to provide the Corresponding Source.   This  alterna-\n           tive  is allowed only occasionally and noncommercially, and only if\n           you received the object code with such an  offer,  in  accord  with\n           subsection 6b.\n\n       d)  Convey  the  object code by offering access from a designated place\n           (gratis or for a charge), and offer equivalent access to the Corre-\n           sponding  Source  in the same way through the same place at no fur-\n           ther charge.  You need not require recipients to  copy  the  Corre-\n           sponding  Source  along with the object code.  If the place to copy\n           the object code is a network server, the Corresponding  Source  may\n           be  on  a  different server (operated by you or a third party) that\n           supports equivalent copying facilities, provided you maintain clear\n           directions  next to the object code saying where to find the Corre-\n           sponding Source.  Regardless of what server hosts the Corresponding\n           Source,  you remain obligated to ensure that it is available for as\n           long as needed to satisfy these requirements.\n\n       e)  Convey the object code using  peer-to-peer  transmission,  provided\n           you  inform  other  peers  where  the object code and Corresponding\n           Source of the work are being offered to the general  public  at  no\n           charge under subsection 6d.\n\n       A  separable  portion of the object code, whose source code is excluded\n       from the Corresponding Source as a System Library, need not be included\n       in conveying the object code work.\n\n       A  \"User  Product\"  is either (1) a \"consumer product\", which means any\n       tangible personal property which is normally used for personal, family,\n       or  household purposes, or (2) anything designed or sold for incorpora-\n       tion into a dwelling.  In determining whether a product is  a  consumer\n       product,  doubtful cases shall be resolved in favor of coverage.  For a\n       particular product received  by  a  particular  user,  \"normally  used\"\n       refers  to a typical or common use of that class of product, regardless\n       of the status of the particular user or of the way in which the partic-\n       ular user actually uses, or expects or is expected to use, the product.\n       A product is a consumer product regardless of whether the  product  has\n       substantial  commercial,  industrial  or non-consumer uses, unless such\n       uses represent the only significant mode of use of the product.\n\n       \"Installation Information\" for a User Product means any methods, proce-\n       dures, authorization keys, or other information required to install and\n       execute modified versions of a covered work in that User Product from a\n       modified  version  of  its  Corresponding Source.  The information must\n       suffice to ensure that the continued functioning of the modified object\n       code  is in no case prevented or interfered with solely because modifi-\n       cation has been made.\n\n       If you convey an object code work under this section in,  or  with,  or\n       specifically  for  use  in, a User Product, and the conveying occurs as\n       part of a transaction in which the right of possession and use  of  the\n       User  Product  is  transferred  to the recipient in perpetuity or for a\n       fixed term (regardless of how the transaction  is  characterized),  the\n       Corresponding Source conveyed under this section must be accompanied by\n       the Installation Information.  But this requirement does not  apply  if\n       neither you nor any third party retains the ability to install modified\n       object code on the  User  Product  (for  example,  the  work  has  been\n       installed in ROM).\n\n       The  requirement to provide Installation Information does not include a\n       requirement to  continue  to  provide  support  service,  warranty,  or\n       updates  for  a work that has been modified or installed by the recipi-\n       ent, or for  the  User  Product  in  which  it  has  been  modified  or\n       installed.   Access  to  a  network may be denied when the modification\n       itself materially and adversely affects the operation of the network or\n       violates the rules and protocols for communication across the network.\n\n       Corresponding  Source  conveyed, and Installation Information provided,\n       in accord with this section must be in a format that is publicly  docu-\n       mented  (and  with  an implementation available to the public in source\n       code form), and must require no special password or key for  unpacking,\n       reading or copying.\n\n       7. Additional Terms.\n\n       \"Additional  permissions\"  are  terms that supplement the terms of this\n       License by making exceptions from one or more of its conditions.  Addi-\n       tional  permissions  that are applicable to the entire Program shall be\n       treated as though they were included in this  License,  to  the  extent\n       that  they  are  valid under applicable law.  If additional permissions\n       apply only to part of the Program, that part  may  be  used  separately\n       under  those  permissions,  but  the entire Program remains governed by\n       this License without regard to the additional permissions.\n\n       When you convey a copy of a covered work, you may at your option remove\n       any  additional  permissions  from  that  copy, or from any part of it.\n       (Additional permissions may be written to require their own removal  in\n       certain cases when you modify the work.)  You may place additional per-\n       missions on material, added by you to a covered  work,  for  which  you\n       have or can give appropriate copyright permission.\n\n       Notwithstanding  any  other provision of this License, for material you\n       add to a covered work, you may (if authorized by the copyright  holders\n       of that material) supplement the terms of this License with terms:\n\n       a)  Disclaiming  warranty  or  limiting  liability differently from the\n           terms of sections 15 and 16 of this License; or\n\n       b)  Requiring preservation of specified  reasonable  legal  notices  or\n           author  attributions  in  that material or in the Appropriate Legal\n           Notices displayed by works containing it; or\n\n       c)  Prohibiting misrepresentation of the origin of  that  material,  or\n           requiring that modified versions of such material be marked in rea-\n           sonable ways as different from the original version; or\n\n       d)  Limiting the use for publicity purposes of names  of  licensors  or\n           authors of the material; or\n\n       e)  Declining to grant rights under trademark law for use of some trade\n           names, trademarks, or service marks; or\n\n       f)  Requiring indemnification of licensors and authors of that material\n           by  anyone  who  conveys  the material (or modified versions of it)\n           with contractual assumptions of liability to the recipient, for any\n           liability  that  these  contractual  assumptions directly impose on\n           those licensors and authors.\n\n       All other  non-permissive  additional  terms  are  considered  \"further\n       restrictions\"  within the meaning of section 10.  If the Program as you\n       received it, or any part of it, contains a notice stating  that  it  is\n       governed  by  this License along with a term that is a further restric-\n       tion, you may remove that term.  If a license document contains a  fur-\n       ther  restriction  but  permits  relicensing  or  conveying  under this\n       License, you may add to a covered work material governed by  the  terms\n       of  that  license  document, provided that the further restriction does\n       not survive such relicensing or conveying.\n\n       If you add terms to a covered work in accord  with  this  section,  you\n       must place, in the relevant source files, a statement of the additional\n       terms that apply to those files, or a notice indicating where  to  find\n       the applicable terms.\n\n       Additional  terms,  permissive  or non-permissive, may be stated in the\n       form of a separately written license,  or  stated  as  exceptions;  the\n       above requirements apply either way.\n\n       8. Termination.\n\n       You may not propagate or modify a covered work except as expressly pro-\n       vided under this License.  Any attempt otherwise to propagate or modify\n       it  is  void,  and  will automatically terminate your rights under this\n       License (including any patent licenses granted under  the  third  para-\n       graph of section 11).\n\n       However,  if you cease all violation of this License, then your license\n       from a particular copyright holder  is  reinstated  (a)  provisionally,\n       unless and until the copyright holder explicitly and finally terminates\n       your license, and (b) permanently, if the  copyright  holder  fails  to\n       notify  you  of the violation by some reasonable means prior to 60 days\n       after the cessation.\n\n       Moreover, your license from a particular copyright holder is reinstated\n       permanently  if  the  copyright holder notifies you of the violation by\n       some reasonable means, this is the first time you have received  notice\n       of violation of this License (for any work) from that copyright holder,\n       and you cure the violation prior to 30 days after your receipt  of  the\n       notice.\n\n       Termination  of  your  rights under this section does not terminate the\n       licenses of parties who have received copies or rights from  you  under\n       this  License.  If your rights have been terminated and not permanently\n       reinstated, you do not qualify to receive new  licenses  for  the  same\n       material under section 10.\n\n       9. Acceptance Not Required for Having Copies.\n\n       You  are not required to accept this License in order to receive or run\n       a copy of the Program.  Ancillary propagation of a covered work  occur-\n       ring  solely  as  a  consequence  of using peer-to-peer transmission to\n       receive a copy likewise does not require acceptance.  However,  nothing\n       other  than  this  License grants you permission to propagate or modify\n       any covered work.  These actions  infringe  copyright  if  you  do  not\n       accept  this License.  Therefore, by modifying or propagating a covered\n       work, you indicate your acceptance of this License to do so.\n\n       10. Automatic Licensing of Downstream Recipients.\n\n       Each time you  convey  a  covered  work,  the  recipient  automatically\n       receives  a  license  from  the  original licensors, to run, modify and\n       propagate that work, subject to this License.  You are not  responsible\n       for enforcing compliance by third parties with this License.\n\n       An  \"entity  transaction\"  is  a transaction transferring control of an\n       organization, or substantially all assets of  one,  or  subdividing  an\n       organization,  or  merging  organizations.  If propagation of a covered\n       work results from an entity transaction, each party to that transaction\n       who  receives a copy of the work also receives whatever licenses to the\n       work the party's predecessor in interest had or could  give  under  the\n       previous  paragraph,  plus  a  right to possession of the Corresponding\n       Source of the work from the predecessor in interest, if the predecessor\n       has it or can get it with reasonable efforts.\n\n       You  may  not  impose  any  further restrictions on the exercise of the\n       rights granted or affirmed under this License.  For  example,  you  may\n       not  impose  a  license  fee,  royalty, or other charge for exercise of\n       rights granted under this License, and you may not initiate  litigation\n       (including  a  cross-claim  or counterclaim in a lawsuit) alleging that\n       any patent claim is infringed by making, using, selling,  offering  for\n       sale, or importing the Program or any portion of it.\n\n       11. Patents.\n\n       A  \"contributor\"  is  a  copyright holder who authorizes use under this\n       License of the Program or a work on which the Program  is  based.   The\n       work thus licensed is called the contributor's \"contributor version\".\n\n       A  contributor's  \"essential patent claims\" are all patent claims owned\n       or controlled by the contributor, whether already acquired or hereafter\n       acquired,  that  would  be  infringed by some manner, permitted by this\n       License, of making, using, or selling its contributor version,  but  do\n       not  include  claims  that  would be infringed only as a consequence of\n       further modification of the contributor version.  For purposes of  this\n       definition, \"control\" includes the right to grant patent sublicenses in\n       a manner consistent with the requirements of this License.\n\n       Each contributor grants you a  non-exclusive,  worldwide,  royalty-free\n       patent  license  under  the  contributor's  essential patent claims, to\n       make, use, sell, offer for sale, import and otherwise run,  modify  and\n       propagate the contents of its contributor version.\n\n       In  the  following  three paragraphs, a \"patent license\" is any express\n       agreement or commitment, however denominated, not to enforce  a  patent\n       (such  as an express permission to practice a patent or covenant not to\n       sue for patent infringement).  To \"grant\" such a patent  license  to  a\n       party  means  to  make such an agreement or commitment not to enforce a\n       patent against the party.\n\n       If you convey a covered work, knowingly relying on  a  patent  license,\n       and the Corresponding Source of the work is not available for anyone to\n       copy, free of charge and under the terms of  this  License,  through  a\n       publicly  available  network  server or other readily accessible means,\n       then you must either (1) cause the Corresponding Source to be so avail-\n       able,  or  (2) arrange to deprive yourself of the benefit of the patent\n       license for this particular work, or (3) arrange, in a  manner  consis-\n       tent  with  the  requirements  of  this  License,  to extend the patent\n       license to downstream recipients.  \"Knowingly relying\" means  you  have\n       actual  knowledge  that, but for the patent license, your conveying the\n       covered work in a country, or your recipient's use of the covered  work\n       in  a  country, would infringe one or more identifiable patents in that\n       country that you have reason to believe are valid.\n\n       If, pursuant to or in connection with a single transaction or  arrange-\n       ment,  you  convey,  or propagate by procuring conveyance of, a covered\n       work, and grant a patent license to some of the parties  receiving  the\n       covered  work  authorizing  them  to use, propagate, modify or convey a\n       specific copy of the covered work, then the patent license you grant is\n       automatically  extended to all recipients of the covered work and works\n       based on it.\n\n       A patent license is \"discriminatory\" if it does not include within  the\n       scope  of its coverage, prohibits the exercise of, or is conditioned on\n       the non-exercise of one or more of the  rights  that  are  specifically\n       granted  under  this License.  You may not convey a covered work if you\n       are a party to an arrangement with a third party that is in  the  busi-\n       ness  of  distributing  software,  under  which you make payment to the\n       third party based on the extent of your activity of conveying the work,\n       and under which the third party grants, to any of the parties who would\n       receive the covered work from you, a discriminatory patent license  (a)\n       in  connection  with  copies  of  the  covered work conveyed by you (or\n       copies made from those copies), or (b) primarily for and in  connection\n       with  specific  products or compilations that contain the covered work,\n       unless you entered into that arrangement, or that  patent  license  was\n       granted, prior to 28 March 2007.\n\n       Nothing in this License shall be construed as excluding or limiting any\n       implied license or other defenses to infringement that may otherwise be\n       available to you under applicable patent law.\n\n       12. No Surrender of Others' Freedom.\n\n       If  conditions are imposed on you (whether by court order, agreement or\n       otherwise) that contradict the conditions of this License, they do  not\n       excuse you from the conditions of this License.  If you cannot convey a\n       covered work so as to satisfy  simultaneously  your  obligations  under\n       this License and any other pertinent obligations, then as a consequence\n       you may not convey it at all.  For example, if you agree to terms  that\n       obligate  you  to collect a royalty for further conveying from those to\n       whom you convey the Program, the only way you could satisfy both  those\n       terms  and this License would be to refrain entirely from conveying the\n       Program.\n\n       13. Use with the GNU Affero General Public License.\n\n       Notwithstanding any other provision of this License, you  have  permis-\n       sion  to  link  or  combine any covered work with a work licensed under\n       version 3 of the GNU Affero General Public License into a  single  com-\n       bined  work,  and  to  convey  the  resulting  work.  The terms of this\n       License will continue to apply to the part which is the  covered  work,\n       but  the special requirements of the GNU Affero General Public License,\n       section 13, concerning interaction through a network will apply to  the\n       combination as such.\n\n       14. Revised Versions of this License.\n\n       The Free Software Foundation may publish revised and/or new versions of\n       the GNU General Public License from time to time.   Such  new  versions\n       will  be  similar  in  spirit to the present version, but may differ in\n       detail to address new problems or concerns.\n\n       Each version is given a distinguishing version number.  If the  Program\n       specifies  that  a  certain  numbered version of the GNU General Public\n       License \"or any later version\" applies to it, you have  the  option  of\n       following  the  terms and conditions either of that numbered version or\n       of any later version published by the Free Software Foundation.  If the\n       Program  does  not  specify  a version number of the GNU General Public\n       License, you may choose any version ever published by the Free Software\n       Foundation.\n\n       If  the Program specifies that a proxy can decide which future versions\n       of the GNU General Public License can  be  used,  that  proxy's  public\n       statement  of  acceptance  of  a  version permanently authorizes you to\n       choose that version for the Program.\n\n       Later license versions may give you  additional  or  different  permis-\n       sions.  However, no additional obligations are imposed on any author or\n       copyright holder as a result of your choosing to follow  a  later  ver-\n       sion.\n\n       15. Disclaimer of Warranty.\n\n       THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLI-\n       CABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLD-\n       ERS  AND/OR  OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\n       OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,  BUT  NOT  LIMITED\n       TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTIC-\n       ULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\n       PROGRAM  IS  WITH  YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME\n       THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n       16. Limitation of Liability.\n\n       IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO  IN  WRITING\n       WILL  ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CON-\n       VEYS THE PROGRAM AS PERMITTED ABOVE, BE  LIABLE  TO  YOU  FOR  DAMAGES,\n       INCLUDING  ANY  GENERAL,  SPECIAL,  INCIDENTAL OR CONSEQUENTIAL DAMAGES\n       ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM  (INCLUDING  BUT\n       NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES\n       SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO  OPER-\n       ATE  WITH  ANY  OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS\n       BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n       17. Interpretation of Sections 15 and 16.\n\n       If the disclaimer of warranty  and  limitation  of  liability  provided\n       above  cannot  be  given  local  legal effect according to their terms,\n       reviewing courts shall apply local law that most  closely  approximates\n       an  absolute  waiver of all civil liability in connection with the Pro-\n       gram, unless a warranty or assumption of liability accompanies  a  copy\n       of the Program in return for a fee.\n\n                             END OF TERMS AND CONDITIONS\n\n                    How to Apply These Terms to Your New Programs\n\n       If  you  develop  a  new program, and you want it to be of the greatest\n       possible use to the public, the best way to achieve this is to make  it\n       free  software  which  everyone can redistribute and change under these\n       terms.\n\n       To do so, attach the following notices to the program.  It is safest to\n       attach  them to the start of each source file to most effectively state\n       the exclusion of warranty; and each  file  should  have  at  least  the\n       \"copyright\" line and a pointer to where the full notice is found.\n\n           <  one  line to give the program's name and a brief idea of what it\n           does.  >\n           Copyright (C) < year > < name of author >\n\n           This program is free software: you can redistribute it and/or  mod-\n           ify  it  under  the terms of the GNU General Public License as pub-\n           lished by the Free Software Foundation, either  version  3  of  the\n           License, or (at your option) any later version.\n\n           This program is distributed in the hope that it will be useful, but\n           WITHOUT ANY WARRANTY; without even the  implied  warranty  of  MER-\n           CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Gen-\n           eral Public License for more details.\n\n           You should have received a copy of the GNU General  Public  License\n           along      with      this      program.       If      not,      see\n           <http://www.gnu.org/licenses/>.\n\n       Also add information on how to contact  you  by  electronic  and  paper\n       mail.\n\n       If the program does terminal interaction, make it output a short notice\n       like this when it starts in an interactive mode:\n\n           <program>  Copyright (C) <year>  <name of author>\n           This program comes with ABSOLUTELY NO WARRANTY;  for  details  type\n           \"show  w\".   This  is  free software, and you are welcome to redis-\n           tribute it under certain conditions; type \"show c\" for details.\n\n       The hypothetical commands \"show w\" and \"show c\" should show the  appro-\n       priate  parts of the General Public License.  Of course, your program's\n       commands might be different; for a GUI  interface,  you  would  use  an\n       \"about box\".\n\n       You  should  also  get  your  employer (if you work as a programmer) or\n       school, if any, to sign a \"copyright disclaimer\" for  the  program,  if\n       necessary.   For  more information on this, and how to apply and follow\n       the GNU GPL, see <http://www.gnu.org/licenses/>.\n\n       The GNU General Public License does not permit incorporating your  pro-\n       gram  into  proprietary  programs.   If  your  program  is a subroutine\n       library, you may consider it more useful to permit linking  proprietary\n       applications with the library.  If this is what you want to do, use the\n       GNU Lesser General Public License instead of this License.  But  first,\n       please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n\n\nGNU                                   GPL                             GPL(GNU)\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/Makefile.in",
    "content": "#\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#\n#    W   W    A    RRRR   N   N   III  N   N  III  N   N   GGG\n#    W   W   A A   R   R  NN  N    I   NN  N   I   NN  N  G   G\n#    W   W  A   A  RRRR   N N N    I   N N N   I   N N N  G\n#    W W W  AAAAA  R R    N  NN    I   N  NN   I   N  NN  G  GG\n#    W W W  A   A  R  R   N   N    I   N   N   I   N   N  G   G\n#     W W   A   A  R   R  N   N   III  N   N  III  N   N   GGG\n#\n# Warning: DO NOT send patches which fix this file. IT IS NOT the original\n# source file. This file is GENERATED from the Aegis repository file manifest.\n# If you find a bug in this file, it could well be an Aegis bug.\n#\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#\n\n#\n# @configure_input@\n#\n# The configure script generates 2 files:\n# 1. This Makefile\n# 2. srecord/config.h\n# If you change this Makefile, you may also need to change these files. To see\n# what is configured by the configure script, search for @ in the Makefile.in\n# file.\n#\n# If you wish to reconfigure the installations directories it is RECOMMENDED\n# that you re-run the configure script.\n#\n# Use \"./configure --help\" for a list of options.\n#\n\n#\n# directory containing the source\n#\nsrcdir = @srcdir@\nVPATH = @srcdir@\n\n#\n# the name of the install program to use\n#\nINSTALL = @INSTALL@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_DIR = @INSTALL@ -m 0755 -d\n\n#\n# The name of the C++ compiler to use.\n#\nCXX = @CXX@\n\n#\n# The C++ compiler flags to use.\n#\nCXXFLAGS = @CXXFLAGS@\n\n#\n# The C++ preprocessor flags to use.\n#\nCPPFLAGS = @CPPFLAGS@\n\n#\n# The linker flags to use\n#\nLDFLAGS = @LDFLAGS@\n\n#\n# prefix for installation path\n#\nprefix = @prefix@\nexec_prefix = @exec_prefix@\n\n#\n# Where to put the executables.\n#\n# On a network, this would only be shared between machines of identical\n# cpu-hw-os flavour. It can be read-only.\n#\n# The $(DESTDIR) is for packaging.\n#\nbindir = $(DESTDIR)@bindir@\n\n#\n# Where to put the manuals.\n#\n# On a network, this would be shared between all machines on the network. It can\n# be read-only.\n#\n# The $(DESTDIR) is for packaging.\n#\nmandir = $(DESTDIR)@mandir@\n\n# define this to silence ./configure warning\ndatarootdir = $(DESTDIR)@datarootdir@\n\n#\n# Where to put the supplementary package executables.\n#\n# On a network, this would be shared between all machines of identical\n# architecture. It can be read-only.\n#\n# The $(DESTDIR) is for packaging.\n#\nlibdir = $(DESTDIR)@libdir@\n\n#\n# Where to put the include files for the library.\n#\n# On a network, this would be shared between all machines of identical\n# architecture. It can be read-only.\n#\n# The $(DESTDIR) is for packaging.\n#\nincludedir = $(DESTDIR)@includedir@\n\n#\n# The name of the GNU Libtool command.\n#\nLIBTOOL = @LIBTOOL@\n\n#\n# extra libraries required for your system\n#\nLIBS = @LIBS@\n\n#\n# shell to use to run tests and commands\n#\nSH = @SH@\n\n#\n# Set GROFF to the name of the roff command on your system, usually \"groff\" or\n# \"troff\" or \"nroff\".\n#\nGROFF = @GROFF@\n\n#\n# Set SOELIM to the name of the roff proprocessor command on your system,\n# usually \"soelim\" or \"gsoelim\".\n#\nSOELIM = @SOELIM@\n\n# ---------------------------------------------------------\n# You should not need to change anything below this line.\n\n#\n# The default target\n#\nthe-default-target: all\n\netc/BUILDING.pdf: etc/BUILDING.man\n\t$(GROFF) -Tps -s -I. -t -man etc/BUILDING.man > etc/BUILDING.ps\n\tps2pdf etc/BUILDING.ps $@\n\trm etc/BUILDING.ps\n\n$(datarootdir)/doc/srecord/BUILDING.pdf: .mkdir.__datarootdir__doc_srecord \\\n\t\tetc/BUILDING.pdf\n\t$(INSTALL_DATA) etc/BUILDING.pdf $@\n\netc/Howto.conf: config.status etc/Howto.conf.in\n\tCONFIG_FILES=$@:etc/Howto.conf.in CONFIG_HEADERS= $(SH) config.status\n\netc/README.pdf: etc/README.man etc/new.1.1.so etc/new.1.10.so etc/new.1.11.so \\\n\t\tetc/new.1.12.so etc/new.1.13.so etc/new.1.14.so \\\n\t\tetc/new.1.15.so etc/new.1.16.so etc/new.1.17.so \\\n\t\tetc/new.1.18.so etc/new.1.19.so etc/new.1.2.so etc/new.1.20.so \\\n\t\tetc/new.1.21.so etc/new.1.22.so etc/new.1.23.so \\\n\t\tetc/new.1.24.so etc/new.1.25.so etc/new.1.26.so \\\n\t\tetc/new.1.27.so etc/new.1.28.so etc/new.1.29.so etc/new.1.3.so \\\n\t\tetc/new.1.30.so etc/new.1.31.so etc/new.1.32.so \\\n\t\tetc/new.1.33.so etc/new.1.34.so etc/new.1.35.so \\\n\t\tetc/new.1.36.so etc/new.1.37.so etc/new.1.38.so \\\n\t\tetc/new.1.39.so etc/new.1.4.so etc/new.1.40.so etc/new.1.41.so \\\n\t\tetc/new.1.42.so etc/new.1.43.so etc/new.1.44.so \\\n\t\tetc/new.1.45.so etc/new.1.46.so etc/new.1.47.so \\\n\t\tetc/new.1.48.so etc/new.1.49.so etc/new.1.5.so etc/new.1.50.so \\\n\t\tetc/new.1.51.so etc/new.1.52.so etc/new.1.53.so \\\n\t\tetc/new.1.54.so etc/new.1.55.so etc/new.1.56.so \\\n\t\tetc/new.1.57.so etc/new.1.58.so etc/new.1.59.so etc/new.1.6.so \\\n\t\tetc/new.1.60.so etc/new.1.61.so etc/new.1.62.so \\\n\t\tetc/new.1.63.so etc/new.1.64.so etc/new.1.7.so etc/new.1.8.so \\\n\t\tetc/new.1.9.so\n\t$(GROFF) -Tps -s -I. -t -man etc/README.man > etc/README.ps\n\tps2pdf etc/README.ps $@\n\trm etc/README.ps\n\n$(datarootdir)/doc/srecord/README.pdf: .mkdir.__datarootdir__doc_srecord \\\n\t\tetc/README.pdf\n\t$(INSTALL_DATA) etc/README.pdf $@\n\netc/change_log.pdf: etc/change_log.man etc/new.1.1.so etc/new.1.10.so \\\n\t\tetc/new.1.11.so etc/new.1.12.so etc/new.1.13.so \\\n\t\tetc/new.1.14.so etc/new.1.15.so etc/new.1.16.so \\\n\t\tetc/new.1.17.so etc/new.1.18.so etc/new.1.19.so etc/new.1.2.so \\\n\t\tetc/new.1.20.so etc/new.1.21.so etc/new.1.22.so \\\n\t\tetc/new.1.23.so etc/new.1.24.so etc/new.1.25.so \\\n\t\tetc/new.1.26.so etc/new.1.27.so etc/new.1.28.so \\\n\t\tetc/new.1.29.so etc/new.1.3.so etc/new.1.30.so etc/new.1.31.so \\\n\t\tetc/new.1.32.so etc/new.1.33.so etc/new.1.34.so \\\n\t\tetc/new.1.35.so etc/new.1.36.so etc/new.1.37.so \\\n\t\tetc/new.1.38.so etc/new.1.39.so etc/new.1.4.so etc/new.1.40.so \\\n\t\tetc/new.1.41.so etc/new.1.42.so etc/new.1.43.so \\\n\t\tetc/new.1.44.so etc/new.1.45.so etc/new.1.46.so \\\n\t\tetc/new.1.47.so etc/new.1.48.so etc/new.1.49.so etc/new.1.5.so \\\n\t\tetc/new.1.50.so etc/new.1.51.so etc/new.1.52.so \\\n\t\tetc/new.1.53.so etc/new.1.54.so etc/new.1.55.so \\\n\t\tetc/new.1.56.so etc/new.1.57.so etc/new.1.58.so \\\n\t\tetc/new.1.59.so etc/new.1.6.so etc/new.1.60.so etc/new.1.61.so \\\n\t\tetc/new.1.62.so etc/new.1.63.so etc/new.1.64.so etc/new.1.7.so \\\n\t\tetc/new.1.8.so etc/new.1.9.so\n\t$(GROFF) -Tps -s -I. -t -man etc/change_log.man > etc/change_log.ps\n\tps2pdf etc/change_log.ps $@\n\trm etc/change_log.ps\n\n$(datarootdir)/doc/srecord/change_log.pdf: .mkdir.__datarootdir__doc_srecord \\\n\t\tetc/change_log.pdf\n\t$(INSTALL_DATA) etc/change_log.pdf $@\n\netc/debian.png: etc/debian.png.uue\n\tuudecode -o $@ etc/debian.png.uue\n\netc/doc_cat.png: etc/doc_cat.png.uue\n\tuudecode -o $@ etc/doc_cat.png.uue\n\netc/doc_chip.png: etc/doc_chip.png.uue\n\tuudecode -o $@ etc/doc_chip.png.uue\n\netc/doc_gen.png: etc/doc_gen.png.uue\n\tuudecode -o $@ etc/doc_gen.png.uue\n\netc/doc_lens.png: etc/doc_lens.png.uue\n\tuudecode -o $@ etc/doc_lens.png.uue\n\netc/doc_lib.png: etc/doc_lib.png.uue\n\tuudecode -o $@ etc/doc_lib.png.uue\n\netc/reference.pdf: etc/BUILDING.man etc/README.man etc/coding-style.so \\\n\t\tetc/new-file-format.so etc/new-filter.so etc/new.1.1.so \\\n\t\tetc/new.1.10.so etc/new.1.11.so etc/new.1.12.so \\\n\t\tetc/new.1.13.so etc/new.1.14.so etc/new.1.15.so \\\n\t\tetc/new.1.16.so etc/new.1.17.so etc/new.1.18.so \\\n\t\tetc/new.1.19.so etc/new.1.2.so etc/new.1.20.so etc/new.1.21.so \\\n\t\tetc/new.1.22.so etc/new.1.23.so etc/new.1.24.so \\\n\t\tetc/new.1.25.so etc/new.1.26.so etc/new.1.27.so \\\n\t\tetc/new.1.28.so etc/new.1.29.so etc/new.1.3.so etc/new.1.30.so \\\n\t\tetc/new.1.31.so etc/new.1.32.so etc/new.1.33.so \\\n\t\tetc/new.1.34.so etc/new.1.35.so etc/new.1.36.so \\\n\t\tetc/new.1.37.so etc/new.1.38.so etc/new.1.39.so etc/new.1.4.so \\\n\t\tetc/new.1.40.so etc/new.1.41.so etc/new.1.42.so \\\n\t\tetc/new.1.43.so etc/new.1.44.so etc/new.1.45.so \\\n\t\tetc/new.1.46.so etc/new.1.47.so etc/new.1.48.so \\\n\t\tetc/new.1.49.so etc/new.1.5.so etc/new.1.50.so etc/new.1.51.so \\\n\t\tetc/new.1.52.so etc/new.1.53.so etc/new.1.54.so \\\n\t\tetc/new.1.55.so etc/new.1.56.so etc/new.1.57.so \\\n\t\tetc/new.1.58.so etc/new.1.59.so etc/new.1.6.so etc/new.1.60.so \\\n\t\tetc/new.1.61.so etc/new.1.62.so etc/new.1.63.so \\\n\t\tetc/new.1.64.so etc/new.1.7.so etc/new.1.8.so etc/new.1.9.so \\\n\t\tetc/ref-toc.so etc/reference.man man/man1/o_at.so \\\n\t\tman/man1/o_ignore_checksums.so man/man1/o_input.so \\\n\t\tman/man1/o_multiple.so man/man1/o_sequence.so \\\n\t\tman/man1/srec_cat.1 man/man1/srec_cmp.1 \\\n\t\tman/man1/srec_examples.1 man/man1/srec_info.1 \\\n\t\tman/man1/srec_input.1 man/man1/srec_license.1 \\\n\t\tman/man1/z_copyright.so man/man1/z_exit.so \\\n\t\tman/man1/z_options.so man/man3/srecord.3 \\\n\t\tman/man3/srecord_license.3 man/man5/srec_aomf.5 \\\n\t\tman/man5/srec_ascii_hex.5 man/man5/srec_atmel_generic.5 \\\n\t\tman/man5/srec_binary.5 man/man5/srec_brecord.5 \\\n\t\tman/man5/srec_coe.5 man/man5/srec_cosmac.5 \\\n\t\tman/man5/srec_dec_binary.5 man/man5/srec_emon52.5 \\\n\t\tman/man5/srec_fairchild.5 man/man5/srec_fastload.5 \\\n\t\tman/man5/srec_formatted_binary.5 man/man5/srec_forth.5 \\\n\t\tman/man5/srec_fpc.5 man/man5/srec_idt.5 man/man5/srec_intel.5 \\\n\t\tman/man5/srec_intel16.5 man/man5/srec_logisim.5 \\\n\t\tman/man5/srec_mem.5 man/man5/srec_mif.5 \\\n\t\tman/man5/srec_mips_flash.5 man/man5/srec_mos_tech.5 \\\n\t\tman/man5/srec_motorola.5 man/man5/srec_msbin.5 \\\n\t\tman/man5/srec_needham.5 man/man5/srec_os65v.5 \\\n\t\tman/man5/srec_ppb.5 man/man5/srec_ppx.5 \\\n\t\tman/man5/srec_signetics.5 man/man5/srec_spasm.5 \\\n\t\tman/man5/srec_spectrum.5 man/man5/srec_stewie.5 \\\n\t\tman/man5/srec_tektronix.5 man/man5/srec_tektronix_extended.5 \\\n\t\tman/man5/srec_ti_tagged.5 man/man5/srec_ti_tagged_16.5 \\\n\t\tman/man5/srec_ti_txt.5 man/man5/srec_trs80.5 \\\n\t\tman/man5/srec_vmem.5 man/man5/srec_wilson.5\n\t$(GROFF) -Tps -s -I. -t -man etc/reference.man > etc/reference.ps\n\tps2pdf etc/reference.ps $@\n\trm etc/reference.ps\n\n$(datarootdir)/doc/srecord/reference.pdf: .mkdir.__datarootdir__doc_srecord \\\n\t\tetc/reference.pdf\n\t$(INSTALL_DATA) etc/reference.pdf $@\n\netc/srecord.png: etc/srecord.png.uue\n\tuudecode -o $@ etc/srecord.png.uue\n\netc/whining.png: etc/whining.png.uue\n\tuudecode -o $@ etc/whining.png.uue\n\nlibdir/pkgconfig/srecord.pc: config.status libdir/pkgconfig/srecord.pc.in\n\tCONFIG_FILES=$@:libdir/pkgconfig/srecord.pc.in CONFIG_HEADERS= $(SH) \\\n\t\tconfig.status\n\n$(libdir)/pkgconfig/srecord.pc: .mkdir.__libdir__pkgconfig \\\n\t\tlibdir/pkgconfig/srecord.pc\n\t$(INSTALL_DATA) libdir/pkgconfig/srecord.pc $@\n\nman/cat1/srec_cat.1: man/man1/o_at.so man/man1/o_ignore_checksums.so \\\n\t\tman/man1/o_input.so man/man1/o_sequence.so man/man1/srec_cat.1 \\\n\t\tman/man1/z_copyright.so man/man1/z_exit.so man/man1/z_options.so\n\t@mkdir -p man/cat1\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man1/srec_cat.1 > $@\n\n$(mandir)/man1/srec_cat.1: .mkdir.__mandir__man1 man/man1/o_at.so \\\n\t\tman/man1/o_ignore_checksums.so man/man1/o_input.so \\\n\t\tman/man1/o_sequence.so man/man1/srec_cat.1 \\\n\t\tman/man1/z_copyright.so man/man1/z_exit.so man/man1/z_options.so\n\t$(SOELIM) -I. man/man1/srec_cat.1 | sed '/^[.]XX ./d' > \\\n\t\tman/man1/srec_cat.1.tmp\n\t$(INSTALL_DATA) man/man1/srec_cat.1.tmp $@\n\t@rm -f man/man1/srec_cat.1.tmp\n\nman/cat1/srec_cmp.1: man/man1/o_at.so man/man1/o_ignore_checksums.so \\\n\t\tman/man1/o_input.so man/man1/o_multiple.so \\\n\t\tman/man1/o_sequence.so man/man1/srec_cmp.1 \\\n\t\tman/man1/z_copyright.so man/man1/z_exit.so man/man1/z_options.so\n\t@mkdir -p man/cat1\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man1/srec_cmp.1 > $@\n\n$(mandir)/man1/srec_cmp.1: .mkdir.__mandir__man1 man/man1/o_at.so \\\n\t\tman/man1/o_ignore_checksums.so man/man1/o_input.so \\\n\t\tman/man1/o_multiple.so man/man1/o_sequence.so \\\n\t\tman/man1/srec_cmp.1 man/man1/z_copyright.so man/man1/z_exit.so \\\n\t\tman/man1/z_options.so\n\t$(SOELIM) -I. man/man1/srec_cmp.1 | sed '/^[.]XX ./d' > \\\n\t\tman/man1/srec_cmp.1.tmp\n\t$(INSTALL_DATA) man/man1/srec_cmp.1.tmp $@\n\t@rm -f man/man1/srec_cmp.1.tmp\n\nman/cat1/srec_examples.1: man/man1/srec_examples.1 man/man1/z_copyright.so\n\t@mkdir -p man/cat1\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man1/srec_examples.1 \\\n\t\t> $@\n\n$(mandir)/man1/srec_examples.1: .mkdir.__mandir__man1 man/man1/srec_examples.1 \\\n\t\tman/man1/z_copyright.so\n\t$(SOELIM) -I. man/man1/srec_examples.1 | sed '/^[.]XX ./d' > \\\n\t\tman/man1/srec_examples.1.tmp\n\t$(INSTALL_DATA) man/man1/srec_examples.1.tmp $@\n\t@rm -f man/man1/srec_examples.1.tmp\n\nman/cat1/srec_info.1: man/man1/o_at.so man/man1/o_ignore_checksums.so \\\n\t\tman/man1/o_input.so man/man1/o_multiple.so \\\n\t\tman/man1/o_sequence.so man/man1/srec_info.1 \\\n\t\tman/man1/z_copyright.so man/man1/z_exit.so man/man1/z_options.so\n\t@mkdir -p man/cat1\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man1/srec_info.1 > $@\n\n$(mandir)/man1/srec_info.1: .mkdir.__mandir__man1 man/man1/o_at.so \\\n\t\tman/man1/o_ignore_checksums.so man/man1/o_input.so \\\n\t\tman/man1/o_multiple.so man/man1/o_sequence.so \\\n\t\tman/man1/srec_info.1 man/man1/z_copyright.so \\\n\t\tman/man1/z_exit.so man/man1/z_options.so\n\t$(SOELIM) -I. man/man1/srec_info.1 | sed '/^[.]XX ./d' > \\\n\t\tman/man1/srec_info.1.tmp\n\t$(INSTALL_DATA) man/man1/srec_info.1.tmp $@\n\t@rm -f man/man1/srec_info.1.tmp\n\nman/cat1/srec_input.1: man/man1/o_ignore_checksums.so man/man1/o_multiple.so \\\n\t\tman/man1/srec_input.1 man/man1/z_copyright.so \\\n\t\tman/man1/z_options.so\n\t@mkdir -p man/cat1\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man1/srec_input.1 > $@\n\n$(mandir)/man1/srec_input.1: .mkdir.__mandir__man1 \\\n\t\tman/man1/o_ignore_checksums.so man/man1/o_multiple.so \\\n\t\tman/man1/srec_input.1 man/man1/z_copyright.so \\\n\t\tman/man1/z_options.so\n\t$(SOELIM) -I. man/man1/srec_input.1 | sed '/^[.]XX ./d' > \\\n\t\tman/man1/srec_input.1.tmp\n\t$(INSTALL_DATA) man/man1/srec_input.1.tmp $@\n\t@rm -f man/man1/srec_input.1.tmp\n\nman/cat1/srec_license.1: man/man1/srec_license.1\n\t@mkdir -p man/cat1\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man1/srec_license.1 > \\\n\t\t$@\n\n$(mandir)/man1/srec_license.1: .mkdir.__mandir__man1 man/man1/srec_license.1\n\tsed '/^[.]XX ./d' < man/man1/srec_license.1 > \\\n\t\tman/man1/srec_license.1.tmp\n\t$(INSTALL_DATA) man/man1/srec_license.1.tmp $@\n\t@rm -f man/man1/srec_license.1.tmp\n\nman/cat3/srecord.3: man/man1/z_copyright.so man/man3/srecord.3\n\t@mkdir -p man/cat3\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man3/srecord.3 > $@\n\n$(mandir)/man3/srecord.3: .mkdir.__mandir__man3 man/man1/z_copyright.so \\\n\t\tman/man3/srecord.3\n\t$(SOELIM) -I. man/man3/srecord.3 > man/man3/srecord.3.tmp\n\t$(INSTALL_DATA) man/man3/srecord.3.tmp $@\n\t@rm -f man/man3/srecord.3.tmp\n\nman/cat3/srecord_license.3: man/man3/srecord_license.3\n\t@mkdir -p man/cat3\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man \\\n\t\tman/man3/srecord_license.3 > $@\n\n$(mandir)/man3/srecord_license.3: .mkdir.__mandir__man3 \\\n\t\tman/man3/srecord_license.3\n\tsed '/^[.]XX ./d' < man/man3/srecord_license.3 > \\\n\t\tman/man3/srecord_license.3.tmp\n\t$(INSTALL_DATA) man/man3/srecord_license.3.tmp $@\n\t@rm -f man/man3/srecord_license.3.tmp\n\nman/cat5/srec_aomf.5: man/man1/z_copyright.so man/man5/srec_aomf.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_aomf.5 > $@\n\n$(mandir)/man5/srec_aomf.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_aomf.5\n\t$(SOELIM) -I. man/man5/srec_aomf.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_aomf.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_aomf.5.tmp $@\n\t@rm -f man/man5/srec_aomf.5.tmp\n\nman/cat5/srec_ascii_hex.5: man/man1/z_copyright.so man/man5/srec_ascii_hex.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_ascii_hex.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_ascii_hex.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_ascii_hex.5\n\t$(SOELIM) -I. man/man5/srec_ascii_hex.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_ascii_hex.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_ascii_hex.5.tmp $@\n\t@rm -f man/man5/srec_ascii_hex.5.tmp\n\nman/cat5/srec_atmel_generic.5: man/man1/z_copyright.so \\\n\t\tman/man5/srec_atmel_generic.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man \\\n\t\tman/man5/srec_atmel_generic.5 > $@\n\n$(mandir)/man5/srec_atmel_generic.5: .mkdir.__mandir__man5 \\\n\t\tman/man1/z_copyright.so man/man5/srec_atmel_generic.5\n\t$(SOELIM) -I. man/man5/srec_atmel_generic.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_atmel_generic.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_atmel_generic.5.tmp $@\n\t@rm -f man/man5/srec_atmel_generic.5.tmp\n\nman/cat5/srec_binary.5: man/man1/z_copyright.so man/man5/srec_binary.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_binary.5 > $@\n\n$(mandir)/man5/srec_binary.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_binary.5\n\t$(SOELIM) -I. man/man5/srec_binary.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_binary.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_binary.5.tmp $@\n\t@rm -f man/man5/srec_binary.5.tmp\n\nman/cat5/srec_brecord.5: man/man1/z_copyright.so man/man5/srec_brecord.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_brecord.5 > \\\n\t\t$@\n\n$(mandir)/man5/srec_brecord.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_brecord.5\n\t$(SOELIM) -I. man/man5/srec_brecord.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_brecord.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_brecord.5.tmp $@\n\t@rm -f man/man5/srec_brecord.5.tmp\n\nman/cat5/srec_coe.5: man/man1/z_copyright.so man/man5/srec_coe.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_coe.5 > $@\n\n$(mandir)/man5/srec_coe.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_coe.5\n\t$(SOELIM) -I. man/man5/srec_coe.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_coe.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_coe.5.tmp $@\n\t@rm -f man/man5/srec_coe.5.tmp\n\nman/cat5/srec_cosmac.5: man/man1/z_copyright.so man/man5/srec_cosmac.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_cosmac.5 > $@\n\n$(mandir)/man5/srec_cosmac.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_cosmac.5\n\t$(SOELIM) -I. man/man5/srec_cosmac.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_cosmac.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_cosmac.5.tmp $@\n\t@rm -f man/man5/srec_cosmac.5.tmp\n\nman/cat5/srec_dec_binary.5: man/man1/z_copyright.so man/man5/srec_dec_binary.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man \\\n\t\tman/man5/srec_dec_binary.5 > $@\n\n$(mandir)/man5/srec_dec_binary.5: .mkdir.__mandir__man5 \\\n\t\tman/man1/z_copyright.so man/man5/srec_dec_binary.5\n\t$(SOELIM) -I. man/man5/srec_dec_binary.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_dec_binary.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_dec_binary.5.tmp $@\n\t@rm -f man/man5/srec_dec_binary.5.tmp\n\nman/cat5/srec_emon52.5: man/man5/srec_emon52.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_emon52.5 > $@\n\n$(mandir)/man5/srec_emon52.5: .mkdir.__mandir__man5 man/man5/srec_emon52.5\n\tsed '/^[.]XX ./d' < man/man5/srec_emon52.5 > man/man5/srec_emon52.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_emon52.5.tmp $@\n\t@rm -f man/man5/srec_emon52.5.tmp\n\nman/cat5/srec_fairchild.5: man/man1/z_copyright.so man/man5/srec_fairchild.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_fairchild.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_fairchild.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_fairchild.5\n\t$(SOELIM) -I. man/man5/srec_fairchild.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_fairchild.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_fairchild.5.tmp $@\n\t@rm -f man/man5/srec_fairchild.5.tmp\n\nman/cat5/srec_fastload.5: man/man1/z_copyright.so man/man5/srec_fastload.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_fastload.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_fastload.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_fastload.5\n\t$(SOELIM) -I. man/man5/srec_fastload.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_fastload.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_fastload.5.tmp $@\n\t@rm -f man/man5/srec_fastload.5.tmp\n\nman/cat5/srec_formatted_binary.5: man/man1/z_copyright.so \\\n\t\tman/man5/srec_formatted_binary.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man \\\n\t\tman/man5/srec_formatted_binary.5 > $@\n\n$(mandir)/man5/srec_formatted_binary.5: .mkdir.__mandir__man5 \\\n\t\tman/man1/z_copyright.so man/man5/srec_formatted_binary.5\n\t$(SOELIM) -I. man/man5/srec_formatted_binary.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_formatted_binary.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_formatted_binary.5.tmp $@\n\t@rm -f man/man5/srec_formatted_binary.5.tmp\n\nman/cat5/srec_forth.5: man/man1/z_copyright.so man/man5/srec_forth.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_forth.5 > $@\n\n$(mandir)/man5/srec_forth.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_forth.5\n\t$(SOELIM) -I. man/man5/srec_forth.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_forth.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_forth.5.tmp $@\n\t@rm -f man/man5/srec_forth.5.tmp\n\nman/cat5/srec_fpc.5: man/man5/srec_fpc.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_fpc.5 > $@\n\n$(mandir)/man5/srec_fpc.5: .mkdir.__mandir__man5 man/man5/srec_fpc.5\n\tsed '/^[.]XX ./d' < man/man5/srec_fpc.5 > man/man5/srec_fpc.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_fpc.5.tmp $@\n\t@rm -f man/man5/srec_fpc.5.tmp\n\nman/cat5/srec_idt.5: man/man1/z_copyright.so man/man5/srec_idt.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_idt.5 > $@\n\n$(mandir)/man5/srec_idt.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_idt.5\n\t$(SOELIM) -I. man/man5/srec_idt.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_idt.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_idt.5.tmp $@\n\t@rm -f man/man5/srec_idt.5.tmp\n\nman/cat5/srec_intel.5: man/man1/z_copyright.so man/man5/srec_intel.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_intel.5 > $@\n\n$(mandir)/man5/srec_intel.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_intel.5\n\t$(SOELIM) -I. man/man5/srec_intel.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_intel.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_intel.5.tmp $@\n\t@rm -f man/man5/srec_intel.5.tmp\n\nman/cat5/srec_intel16.5: man/man1/z_copyright.so man/man5/srec_intel16.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_intel16.5 > \\\n\t\t$@\n\n$(mandir)/man5/srec_intel16.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_intel16.5\n\t$(SOELIM) -I. man/man5/srec_intel16.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_intel16.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_intel16.5.tmp $@\n\t@rm -f man/man5/srec_intel16.5.tmp\n\nman/cat5/srec_logisim.5: man/man1/z_copyright.so man/man5/srec_logisim.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_logisim.5 > \\\n\t\t$@\n\n$(mandir)/man5/srec_logisim.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_logisim.5\n\t$(SOELIM) -I. man/man5/srec_logisim.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_logisim.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_logisim.5.tmp $@\n\t@rm -f man/man5/srec_logisim.5.tmp\n\nman/cat5/srec_mem.5: man/man1/z_copyright.so man/man5/srec_mem.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_mem.5 > $@\n\n$(mandir)/man5/srec_mem.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_mem.5\n\t$(SOELIM) -I. man/man5/srec_mem.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_mem.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_mem.5.tmp $@\n\t@rm -f man/man5/srec_mem.5.tmp\n\nman/cat5/srec_mif.5: man/man1/z_copyright.so man/man5/srec_mif.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_mif.5 > $@\n\n$(mandir)/man5/srec_mif.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_mif.5\n\t$(SOELIM) -I. man/man5/srec_mif.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_mif.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_mif.5.tmp $@\n\t@rm -f man/man5/srec_mif.5.tmp\n\nman/cat5/srec_mips_flash.5: man/man1/z_copyright.so man/man5/srec_mips_flash.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man \\\n\t\tman/man5/srec_mips_flash.5 > $@\n\n$(mandir)/man5/srec_mips_flash.5: .mkdir.__mandir__man5 \\\n\t\tman/man1/z_copyright.so man/man5/srec_mips_flash.5\n\t$(SOELIM) -I. man/man5/srec_mips_flash.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_mips_flash.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_mips_flash.5.tmp $@\n\t@rm -f man/man5/srec_mips_flash.5.tmp\n\nman/cat5/srec_mos_tech.5: man/man1/z_copyright.so man/man5/srec_mos_tech.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_mos_tech.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_mos_tech.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_mos_tech.5\n\t$(SOELIM) -I. man/man5/srec_mos_tech.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_mos_tech.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_mos_tech.5.tmp $@\n\t@rm -f man/man5/srec_mos_tech.5.tmp\n\nman/cat5/srec_motorola.5: man/man1/z_copyright.so man/man5/srec_motorola.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_motorola.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_motorola.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_motorola.5\n\t$(SOELIM) -I. man/man5/srec_motorola.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_motorola.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_motorola.5.tmp $@\n\t@rm -f man/man5/srec_motorola.5.tmp\n\nman/cat5/srec_msbin.5: man/man1/z_copyright.so man/man5/srec_msbin.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_msbin.5 > $@\n\n$(mandir)/man5/srec_msbin.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_msbin.5\n\t$(SOELIM) -I. man/man5/srec_msbin.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_msbin.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_msbin.5.tmp $@\n\t@rm -f man/man5/srec_msbin.5.tmp\n\nman/cat5/srec_needham.5: man/man1/z_copyright.so man/man5/srec_needham.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_needham.5 > \\\n\t\t$@\n\n$(mandir)/man5/srec_needham.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_needham.5\n\t$(SOELIM) -I. man/man5/srec_needham.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_needham.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_needham.5.tmp $@\n\t@rm -f man/man5/srec_needham.5.tmp\n\nman/cat5/srec_os65v.5: man/man1/z_copyright.so man/man5/srec_os65v.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_os65v.5 > $@\n\n$(mandir)/man5/srec_os65v.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_os65v.5\n\t$(SOELIM) -I. man/man5/srec_os65v.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_os65v.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_os65v.5.tmp $@\n\t@rm -f man/man5/srec_os65v.5.tmp\n\nman/cat5/srec_ppb.5: man/man1/z_copyright.so man/man5/srec_ppb.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_ppb.5 > $@\n\n$(mandir)/man5/srec_ppb.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_ppb.5\n\t$(SOELIM) -I. man/man5/srec_ppb.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_ppb.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_ppb.5.tmp $@\n\t@rm -f man/man5/srec_ppb.5.tmp\n\nman/cat5/srec_ppx.5: man/man1/z_copyright.so man/man5/srec_ppx.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_ppx.5 > $@\n\n$(mandir)/man5/srec_ppx.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_ppx.5\n\t$(SOELIM) -I. man/man5/srec_ppx.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_ppx.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_ppx.5.tmp $@\n\t@rm -f man/man5/srec_ppx.5.tmp\n\nman/cat5/srec_signetics.5: man/man5/srec_signetics.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_signetics.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_signetics.5: .mkdir.__mandir__man5 man/man5/srec_signetics.5\n\tsed '/^[.]XX ./d' < man/man5/srec_signetics.5 > \\\n\t\tman/man5/srec_signetics.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_signetics.5.tmp $@\n\t@rm -f man/man5/srec_signetics.5.tmp\n\nman/cat5/srec_spasm.5: man/man1/z_copyright.so man/man5/srec_spasm.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_spasm.5 > $@\n\n$(mandir)/man5/srec_spasm.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_spasm.5\n\t$(SOELIM) -I. man/man5/srec_spasm.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_spasm.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_spasm.5.tmp $@\n\t@rm -f man/man5/srec_spasm.5.tmp\n\nman/cat5/srec_spectrum.5: man/man1/z_copyright.so man/man5/srec_spectrum.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_spectrum.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_spectrum.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_spectrum.5\n\t$(SOELIM) -I. man/man5/srec_spectrum.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_spectrum.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_spectrum.5.tmp $@\n\t@rm -f man/man5/srec_spectrum.5.tmp\n\nman/cat5/srec_stewie.5: man/man1/z_copyright.so man/man5/srec_stewie.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_stewie.5 > $@\n\n$(mandir)/man5/srec_stewie.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_stewie.5\n\t$(SOELIM) -I. man/man5/srec_stewie.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_stewie.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_stewie.5.tmp $@\n\t@rm -f man/man5/srec_stewie.5.tmp\n\nman/cat5/srec_tektronix.5: man/man1/z_copyright.so man/man5/srec_tektronix.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_tektronix.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_tektronix.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_tektronix.5\n\t$(SOELIM) -I. man/man5/srec_tektronix.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_tektronix.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_tektronix.5.tmp $@\n\t@rm -f man/man5/srec_tektronix.5.tmp\n\nman/cat5/srec_tektronix_extended.5: man/man1/z_copyright.so \\\n\t\tman/man5/srec_tektronix_extended.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man \\\n\t\tman/man5/srec_tektronix_extended.5 > $@\n\n$(mandir)/man5/srec_tektronix_extended.5: .mkdir.__mandir__man5 \\\n\t\tman/man1/z_copyright.so man/man5/srec_tektronix_extended.5\n\t$(SOELIM) -I. man/man5/srec_tektronix_extended.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_tektronix_extended.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_tektronix_extended.5.tmp $@\n\t@rm -f man/man5/srec_tektronix_extended.5.tmp\n\nman/cat5/srec_ti_tagged.5: man/man1/z_copyright.so man/man5/srec_ti_tagged.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_ti_tagged.5 \\\n\t\t> $@\n\n$(mandir)/man5/srec_ti_tagged.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_ti_tagged.5\n\t$(SOELIM) -I. man/man5/srec_ti_tagged.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_ti_tagged.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_ti_tagged.5.tmp $@\n\t@rm -f man/man5/srec_ti_tagged.5.tmp\n\nman/cat5/srec_ti_tagged_16.5: man/man1/z_copyright.so \\\n\t\tman/man5/srec_ti_tagged_16.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man \\\n\t\tman/man5/srec_ti_tagged_16.5 > $@\n\n$(mandir)/man5/srec_ti_tagged_16.5: .mkdir.__mandir__man5 \\\n\t\tman/man1/z_copyright.so man/man5/srec_ti_tagged_16.5\n\t$(SOELIM) -I. man/man5/srec_ti_tagged_16.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_ti_tagged_16.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_ti_tagged_16.5.tmp $@\n\t@rm -f man/man5/srec_ti_tagged_16.5.tmp\n\nman/cat5/srec_ti_txt.5: man/man1/z_copyright.so man/man5/srec_ti_txt.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_ti_txt.5 > $@\n\n$(mandir)/man5/srec_ti_txt.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_ti_txt.5\n\t$(SOELIM) -I. man/man5/srec_ti_txt.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_ti_txt.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_ti_txt.5.tmp $@\n\t@rm -f man/man5/srec_ti_txt.5.tmp\n\nman/cat5/srec_trs80.5: man/man1/z_copyright.so man/man5/srec_trs80.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_trs80.5 > $@\n\n$(mandir)/man5/srec_trs80.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_trs80.5\n\t$(SOELIM) -I. man/man5/srec_trs80.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_trs80.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_trs80.5.tmp $@\n\t@rm -f man/man5/srec_trs80.5.tmp\n\nman/cat5/srec_vmem.5: man/man1/z_copyright.so man/man5/srec_vmem.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_vmem.5 > $@\n\n$(mandir)/man5/srec_vmem.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_vmem.5\n\t$(SOELIM) -I. man/man5/srec_vmem.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_vmem.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_vmem.5.tmp $@\n\t@rm -f man/man5/srec_vmem.5.tmp\n\nman/cat5/srec_wilson.5: man/man1/z_copyright.so man/man5/srec_wilson.5\n\t@mkdir -p man/cat5\n\tGROFF_NO_SGR=-c $(GROFF) -I. -Tascii -t -man man/man5/srec_wilson.5 > $@\n\n$(mandir)/man5/srec_wilson.5: .mkdir.__mandir__man5 man/man1/z_copyright.so \\\n\t\tman/man5/srec_wilson.5\n\t$(SOELIM) -I. man/man5/srec_wilson.5 | sed '/^[.]XX ./d' > \\\n\t\tman/man5/srec_wilson.5.tmp\n\t$(INSTALL_DATA) man/man5/srec_wilson.5.tmp $@\n\t@rm -f man/man5/srec_wilson.5.tmp\n\nscript/test_prelude.sh: config.status script/test_prelude.sh.in\n\tCONFIG_FILES=$@:script/test_prelude.sh.in CONFIG_HEADERS= $(SH) \\\n\t\tconfig.status\n\nbin/test_prelude: .bin script/test_prelude.sh\n\tcp script/test_prelude.sh $@\n\tchmod a+rx $@\n\nsrec_cat/arglex3.lo srec_cat/arglex3.o: srec_cat/arglex3.cc srec_cat/arglex3.h \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srec_cat/arglex3.cc -o srec_cat/arglex3.lo\n\nsrec_cat/main.lo srec_cat/main.o: srec_cat/arglex3.h srec_cat/main.cc \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/catenate.h srecord/input/file.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/writer.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/filter.h \\\n\t\tsrecord/output/filter/reblock.h srecord/record.h \\\n\t\tsrecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srec_cat/main.cc -o srec_cat/main.lo\n\nsrec_cmp/main.lo srec_cmp/main.o: srec_cmp/main.cc srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/memory.h srecord/memory/chunk.h \\\n\t\tsrecord/memory/walker.h srecord/output.h srecord/record.h \\\n\t\tsrecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srec_cmp/main.cc -o srec_cmp/main.lo\n\nsrec_info/main.lo srec_info/main.o: srec_info/main.cc srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/interval.h srecord/memory.h srecord/memory/chunk.h \\\n\t\tsrecord/memory/walker.h srecord/output.h srecord/record.h \\\n\t\tsrecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srec_info/main.cc -o srec_info/main.lo\n\nsrecord/adler16.lo srecord/adler16.o: srecord/adler16.cc srecord/adler16.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/adler16.cc -o srecord/adler16.lo\n\n$(includedir)/srecord/adler16.h: .mkdir.__includedir__srecord srecord/adler16.h\n\t$(INSTALL_DATA) srecord/adler16.h $@\n\nsrecord/adler32.lo srecord/adler32.o: srecord/adler32.cc srecord/adler32.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/adler32.cc -o srecord/adler32.lo\n\n$(includedir)/srecord/adler32.h: .mkdir.__includedir__srecord srecord/adler32.h\n\t$(INSTALL_DATA) srecord/adler32.h $@\n\nsrecord/arglex.lo srecord/arglex.o: srecord/arglex.cc srecord/arglex.h \\\n\t\tsrecord/format_printf.h srecord/progname.h srecord/quit.h \\\n\t\tsrecord/versn_stamp.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex.cc -o srecord/arglex.lo\n\nsrecord/arglex/abbreviate.lo srecord/arglex/abbreviate.o: srecord/arglex.h \\\n\t\tsrecord/arglex/abbreviate.cc srecord/format_printf.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/abbreviate.cc -o srecord/arglex/abbreviate.lo\n\nsrecord/arglex/test_ambiguous.lo srecord/arglex/test_ambiguous.o: \\\n\t\tsrecord/arglex.h srecord/arglex/test_ambiguous.cc \\\n\t\tsrecord/format_printf.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/test_ambiguous.cc -o \\\n\t\tsrecord/arglex/test_ambiguous.lo\n\nsrecord/arglex/tool.lo srecord/arglex/tool.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.cc srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/tool.cc -o srecord/arglex/tool.lo\n\nsrecord/arglex/tool/get_interval.lo srecord/arglex/tool/get_interval.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h \\\n\t\tsrecord/arglex/tool/get_interval.cc srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/interval.h srecord/interval.h srecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/tool/get_interval.cc -o \\\n\t\tsrecord/arglex/tool/get_interval.lo\n\nsrecord/arglex/tool/get_interval_small.lo \\\n\t\tsrecord/arglex/tool/get_interval_small.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h \\\n\t\tsrecord/arglex/tool/get_interval_small.cc srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/interval.h srecord/output.h srecord/pretty_size.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/tool/get_interval_small.cc -o \\\n\t\tsrecord/arglex/tool/get_interval_small.lo\n\nsrecord/arglex/tool/get_number.lo srecord/arglex/tool/get_number.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h \\\n\t\tsrecord/arglex/tool/get_number.cc srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/interval.h srecord/interval.h srecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/tool/get_number.cc -o \\\n\t\tsrecord/arglex/tool/get_number.lo\n\nsrecord/arglex/tool/get_string.lo srecord/arglex/tool/get_string.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h \\\n\t\tsrecord/arglex/tool/get_string.cc srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/tool/get_string.cc -o \\\n\t\tsrecord/arglex/tool/get_string.lo\n\nsrecord/arglex/tool/input.lo srecord/arglex/tool/input.o: srecord/adler16.h \\\n\t\tsrecord/adler32.h srecord/arglex.h srecord/arglex/tool.h \\\n\t\tsrecord/arglex/tool/input.cc srecord/crc16.h srecord/crc32.h \\\n\t\tsrecord/defcon.h srecord/endian.h srecord/fletcher16.h \\\n\t\tsrecord/fletcher32.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/catenate.h srecord/input/file.h \\\n\t\tsrecord/input/file/aomf.h srecord/input/file/ascii_hex.h \\\n\t\tsrecord/input/file/atmel_generic.h srecord/input/file/binary.h \\\n\t\tsrecord/input/file/brecord.h srecord/input/file/cosmac.h \\\n\t\tsrecord/input/file/dec_binary.h srecord/input/file/emon52.h \\\n\t\tsrecord/input/file/fairchild.h srecord/input/file/fastload.h \\\n\t\tsrecord/input/file/formatted_binary.h \\\n\t\tsrecord/input/file/four_packed_code.h \\\n\t\tsrecord/input/file/hexdump.h srecord/input/file/idt.h \\\n\t\tsrecord/input/file/intel.h srecord/input/file/intel16.h \\\n\t\tsrecord/input/file/logisim.h srecord/input/file/mif.h \\\n\t\tsrecord/input/file/mips_flash.h srecord/input/file/mos_tech.h \\\n\t\tsrecord/input/file/motorola.h srecord/input/file/msbin.h \\\n\t\tsrecord/input/file/needham.h srecord/input/file/os65v.h \\\n\t\tsrecord/input/file/ppb.h srecord/input/file/ppx.h \\\n\t\tsrecord/input/file/signetics.h srecord/input/file/spasm.h \\\n\t\tsrecord/input/file/spectrum.h srecord/input/file/stewie.h \\\n\t\tsrecord/input/file/tektronix.h \\\n\t\tsrecord/input/file/tektronix_extended.h \\\n\t\tsrecord/input/file/ti_tagged.h \\\n\t\tsrecord/input/file/ti_tagged_16.h srecord/input/file/ti_txt.h \\\n\t\tsrecord/input/file/trs80.h srecord/input/file/vmem.h \\\n\t\tsrecord/input/file/wilson.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/and.h srecord/input/filter/bitrev.h \\\n\t\tsrecord/input/filter/byte_swap.h \\\n\t\tsrecord/input/filter/checksum.h \\\n\t\tsrecord/input/filter/checksum/bitnot.h \\\n\t\tsrecord/input/filter/checksum/negative.h \\\n\t\tsrecord/input/filter/checksum/positive.h \\\n\t\tsrecord/input/filter/crop.h srecord/input/filter/fill.h \\\n\t\tsrecord/input/filter/interval.h \\\n\t\tsrecord/input/filter/interval/length.h \\\n\t\tsrecord/input/filter/interval/maximum.h \\\n\t\tsrecord/input/filter/interval/minimum.h \\\n\t\tsrecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/adler16.h \\\n\t\tsrecord/input/filter/message/adler32.h \\\n\t\tsrecord/input/filter/message/crc16.h \\\n\t\tsrecord/input/filter/message/crc32.h \\\n\t\tsrecord/input/filter/message/fletcher16.h \\\n\t\tsrecord/input/filter/message/fletcher32.h \\\n\t\tsrecord/input/filter/message/gcrypt.h \\\n\t\tsrecord/input/filter/message/stm32.h \\\n\t\tsrecord/input/filter/not.h srecord/input/filter/offset.h \\\n\t\tsrecord/input/filter/or.h srecord/input/filter/random_fill.h \\\n\t\tsrecord/input/filter/sequence.h srecord/input/filter/split.h \\\n\t\tsrecord/input/filter/unfill.h srecord/input/filter/unsplit.h \\\n\t\tsrecord/input/filter/xor.h srecord/input/generator.h \\\n\t\tsrecord/input/interval.h srecord/interval.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/output.h srecord/quit.h srecord/record.h \\\n\t\tsrecord/stm32.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/tool/input.cc -o srecord/arglex/tool/input.lo\n\nsrecord/arglex/tool/output.lo srecord/arglex/tool/output.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/arglex/tool/output.cc \\\n\t\tsrecord/defcon.h srecord/endian.h srecord/format_printf.h \\\n\t\tsrecord/input.h srecord/interval.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/aomf.h \\\n\t\tsrecord/output/file/ascii_hex.h srecord/output/file/asm.h \\\n\t\tsrecord/output/file/atmel_generic.h \\\n\t\tsrecord/output/file/basic.h srecord/output/file/binary.h \\\n\t\tsrecord/output/file/brecord.h srecord/output/file/c.h \\\n\t\tsrecord/output/file/coe.h srecord/output/file/cosmac.h \\\n\t\tsrecord/output/file/dec_binary.h srecord/output/file/emon52.h \\\n\t\tsrecord/output/file/fairchild.h srecord/output/file/fastload.h \\\n\t\tsrecord/output/file/formatted_binary.h \\\n\t\tsrecord/output/file/forth.h \\\n\t\tsrecord/output/file/four_packed_code.h \\\n\t\tsrecord/output/file/hexdump.h srecord/output/file/idt.h \\\n\t\tsrecord/output/file/intel.h srecord/output/file/intel16.h \\\n\t\tsrecord/output/file/logisim.h srecord/output/file/mem.h \\\n\t\tsrecord/output/file/mif.h srecord/output/file/mips_flash.h \\\n\t\tsrecord/output/file/mos_tech.h srecord/output/file/motorola.h \\\n\t\tsrecord/output/file/msbin.h srecord/output/file/needham.h \\\n\t\tsrecord/output/file/os65v.h srecord/output/file/ppb.h \\\n\t\tsrecord/output/file/ppx.h srecord/output/file/signetics.h \\\n\t\tsrecord/output/file/spasm.h srecord/output/file/spectrum.h \\\n\t\tsrecord/output/file/stewie.h srecord/output/file/tektronix.h \\\n\t\tsrecord/output/file/tektronix_extended.h \\\n\t\tsrecord/output/file/ti_tagged.h \\\n\t\tsrecord/output/file/ti_tagged_16.h \\\n\t\tsrecord/output/file/ti_txt.h srecord/output/file/trs80.h \\\n\t\tsrecord/output/file/vhdl.h srecord/output/file/vmem.h \\\n\t\tsrecord/output/file/wilson.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/arglex/tool/output.cc -o \\\n\t\tsrecord/arglex/tool/output.lo\n\nsrecord/bitrev.lo srecord/bitrev.o: srecord/bitrev.cc srecord/bitrev.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/bitrev.cc -o srecord/bitrev.lo\n\nsrecord/crc16.lo srecord/crc16.o: srecord/bitrev.h srecord/crc16.cc \\\n\t\tsrecord/crc16.h srecord/format_printf.h srecord/quit.h \\\n\t\tsrecord/sizeof.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/crc16.cc -o srecord/crc16.lo\n\n$(includedir)/srecord/crc16.h: .mkdir.__includedir__srecord srecord/crc16.h\n\t$(INSTALL_DATA) srecord/crc16.h $@\n\nsrecord/crc32.lo srecord/crc32.o: srecord/crc32.cc srecord/crc32.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/crc32.cc -o srecord/crc32.lo\n\n$(includedir)/srecord/crc32.h: .mkdir.__includedir__srecord srecord/crc32.h\n\t$(INSTALL_DATA) srecord/crc32.h $@\n\nsrecord/defcon.lo srecord/defcon.o: srecord/defcon.cc srecord/defcon.h \\\n\t\tsrecord/sizeof.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/defcon.cc -o srecord/defcon.lo\n\n$(includedir)/srecord/defcon.h: .mkdir.__includedir__srecord srecord/defcon.h\n\t$(INSTALL_DATA) srecord/defcon.h $@\n\nsrecord/endian.lo srecord/endian.o: srecord/endian.cc srecord/endian.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/endian.cc -o srecord/endian.lo\n\n$(includedir)/srecord/endian.h: .mkdir.__includedir__srecord srecord/endian.h\n\t$(INSTALL_DATA) srecord/endian.h $@\n\nsrecord/endian/decode_word.lo srecord/endian/decode_word.o: srecord/endian.h \\\n\t\tsrecord/endian/decode_word.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/endian/decode_word.cc -o \\\n\t\tsrecord/endian/decode_word.lo\n\nsrecord/fletcher16.lo srecord/fletcher16.o: srecord/endian.h \\\n\t\tsrecord/fletcher16.cc srecord/fletcher16.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/fletcher16.cc -o srecord/fletcher16.lo\n\n$(includedir)/srecord/fletcher16.h: .mkdir.__includedir__srecord \\\n\t\tsrecord/fletcher16.h\n\t$(INSTALL_DATA) srecord/fletcher16.h $@\n\nsrecord/fletcher32.lo srecord/fletcher32.o: srecord/fletcher32.cc \\\n\t\tsrecord/fletcher32.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/fletcher32.cc -o srecord/fletcher32.lo\n\n$(includedir)/srecord/fletcher32.h: .mkdir.__includedir__srecord \\\n\t\tsrecord/fletcher32.h\n\t$(INSTALL_DATA) srecord/fletcher32.h $@\n\n$(includedir)/srecord/format_printf.h: .mkdir.__includedir__srecord \\\n\t\tsrecord/format_printf.h\n\t$(INSTALL_DATA) srecord/format_printf.h $@\n\nsrecord/input.lo srecord/input.o: srecord/endian.h srecord/format_printf.h \\\n\t\tsrecord/input.cc srecord/input.h srecord/quit.h \\\n\t\tsrecord/quit/prefix.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input.cc -o srecord/input.lo\n\n$(includedir)/srecord/input.h: .mkdir.__includedir__srecord srecord/input.h\n\t$(INSTALL_DATA) srecord/input.h $@\n\nsrecord/input/catenate.lo srecord/input/catenate.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/catenate.cc srecord/input/catenate.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/catenate.cc -o srecord/input/catenate.lo\n\n$(includedir)/srecord/input/catenate.h: .mkdir.__includedir__srecord_input \\\n\t\tsrecord/input/catenate.h\n\t$(INSTALL_DATA) srecord/input/catenate.h $@\n\nsrecord/input/file.lo srecord/input/file.o: srecord/format_printf.h \\\n\t\tsrecord/input.h srecord/input/file.cc srecord/input/file.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file.cc -o srecord/input/file.lo\n\n$(includedir)/srecord/input/file.h: .mkdir.__includedir__srecord_input \\\n\t\tsrecord/input/file.h\n\t$(INSTALL_DATA) srecord/input/file.h $@\n\nsrecord/input/file/aomf.lo srecord/input/file/aomf.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/aomf.cc srecord/input/file/aomf.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/aomf.cc -o srecord/input/file/aomf.lo\n\n$(includedir)/srecord/input/file/aomf.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/aomf.h\n\t$(INSTALL_DATA) srecord/input/file/aomf.h $@\n\nsrecord/input/file/ascii_hex.lo srecord/input/file/ascii_hex.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/ascii_hex.cc \\\n\t\tsrecord/input/file/ascii_hex.h srecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/ascii_hex.cc -o \\\n\t\tsrecord/input/file/ascii_hex.lo\n\n$(includedir)/srecord/input/file/ascii_hex.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/ascii_hex.h\n\t$(INSTALL_DATA) srecord/input/file/ascii_hex.h $@\n\nsrecord/input/file/atmel_generic.lo srecord/input/file/atmel_generic.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/atmel_generic.cc \\\n\t\tsrecord/input/file/atmel_generic.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/atmel_generic.cc -o \\\n\t\tsrecord/input/file/atmel_generic.lo\n\n$(includedir)/srecord/input/file/atmel_generic.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/atmel_generic.h\n\t$(INSTALL_DATA) srecord/input/file/atmel_generic.h $@\n\nsrecord/input/file/binary.lo srecord/input/file/binary.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/binary.cc srecord/input/file/binary.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/binary.cc -o srecord/input/file/binary.lo\n\n$(includedir)/srecord/input/file/binary.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/binary.h\n\t$(INSTALL_DATA) srecord/input/file/binary.h $@\n\nsrecord/input/file/brecord.lo srecord/input/file/brecord.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/brecord.cc srecord/input/file/brecord.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/brecord.cc -o \\\n\t\tsrecord/input/file/brecord.lo\n\n$(includedir)/srecord/input/file/brecord.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/brecord.h\n\t$(INSTALL_DATA) srecord/input/file/brecord.h $@\n\nsrecord/input/file/cosmac.lo srecord/input/file/cosmac.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/cosmac.cc srecord/input/file/cosmac.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/cosmac.cc -o srecord/input/file/cosmac.lo\n\n$(includedir)/srecord/input/file/cosmac.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/cosmac.h\n\t$(INSTALL_DATA) srecord/input/file/cosmac.h $@\n\nsrecord/input/file/dec_binary.lo srecord/input/file/dec_binary.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/dec_binary.cc \\\n\t\tsrecord/input/file/dec_binary.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/dec_binary.cc -o \\\n\t\tsrecord/input/file/dec_binary.lo\n\n$(includedir)/srecord/input/file/dec_binary.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/dec_binary.h\n\t$(INSTALL_DATA) srecord/input/file/dec_binary.h $@\n\nsrecord/input/file/emon52.lo srecord/input/file/emon52.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/emon52.cc srecord/input/file/emon52.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/emon52.cc -o srecord/input/file/emon52.lo\n\n$(includedir)/srecord/input/file/emon52.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/emon52.h\n\t$(INSTALL_DATA) srecord/input/file/emon52.h $@\n\nsrecord/input/file/fairchild.lo srecord/input/file/fairchild.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/fairchild.cc \\\n\t\tsrecord/input/file/fairchild.h srecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/fairchild.cc -o \\\n\t\tsrecord/input/file/fairchild.lo\n\n$(includedir)/srecord/input/file/fairchild.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/fairchild.h\n\t$(INSTALL_DATA) srecord/input/file/fairchild.h $@\n\nsrecord/input/file/fastload.lo srecord/input/file/fastload.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/fastload.cc srecord/input/file/fastload.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/fastload.cc -o \\\n\t\tsrecord/input/file/fastload.lo\n\n$(includedir)/srecord/input/file/fastload.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/fastload.h\n\t$(INSTALL_DATA) srecord/input/file/fastload.h $@\n\nsrecord/input/file/formatted_binary.lo srecord/input/file/formatted_binary.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/formatted_binary.cc \\\n\t\tsrecord/input/file/formatted_binary.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/formatted_binary.cc -o \\\n\t\tsrecord/input/file/formatted_binary.lo\n\n$(includedir)/srecord/input/file/formatted_binary.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/formatted_binary.h\n\t$(INSTALL_DATA) srecord/input/file/formatted_binary.h $@\n\nsrecord/input/file/four_packed_code.lo srecord/input/file/four_packed_code.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/four_packed_code.cc \\\n\t\tsrecord/input/file/four_packed_code.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/four_packed_code.cc -o \\\n\t\tsrecord/input/file/four_packed_code.lo\n\n$(includedir)/srecord/input/file/four_packed_code.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/four_packed_code.h\n\t$(INSTALL_DATA) srecord/input/file/four_packed_code.h $@\n\nsrecord/input/file/guess.lo srecord/input/file/guess.o: srecord/arglex.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/aomf.h \\\n\t\tsrecord/input/file/ascii_hex.h \\\n\t\tsrecord/input/file/atmel_generic.h srecord/input/file/binary.h \\\n\t\tsrecord/input/file/brecord.h srecord/input/file/dec_binary.h \\\n\t\tsrecord/input/file/emon52.h srecord/input/file/fairchild.h \\\n\t\tsrecord/input/file/fastload.h \\\n\t\tsrecord/input/file/formatted_binary.h \\\n\t\tsrecord/input/file/four_packed_code.h \\\n\t\tsrecord/input/file/guess.cc srecord/input/file/hexdump.h \\\n\t\tsrecord/input/file/idt.h srecord/input/file/intel.h \\\n\t\tsrecord/input/file/intel16.h srecord/input/file/logisim.h \\\n\t\tsrecord/input/file/mif.h srecord/input/file/mips_flash.h \\\n\t\tsrecord/input/file/mos_tech.h srecord/input/file/motorola.h \\\n\t\tsrecord/input/file/msbin.h srecord/input/file/needham.h \\\n\t\tsrecord/input/file/os65v.h srecord/input/file/ppb.h \\\n\t\tsrecord/input/file/ppx.h srecord/input/file/signetics.h \\\n\t\tsrecord/input/file/spasm.h srecord/input/file/spectrum.h \\\n\t\tsrecord/input/file/stewie.h srecord/input/file/tektronix.h \\\n\t\tsrecord/input/file/tektronix_extended.h \\\n\t\tsrecord/input/file/ti_tagged.h srecord/input/file/ti_txt.h \\\n\t\tsrecord/input/file/trs80.h srecord/input/file/vmem.h \\\n\t\tsrecord/input/file/wilson.h srecord/quit.h \\\n\t\tsrecord/quit/exception.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/guess.cc -o srecord/input/file/guess.lo\n\nsrecord/input/file/hexdump.lo srecord/input/file/hexdump.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/hexdump.cc srecord/input/file/hexdump.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/hexdump.cc -o \\\n\t\tsrecord/input/file/hexdump.lo\n\nsrecord/input/file/idt.lo srecord/input/file/idt.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/idt.cc srecord/input/file/idt.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/idt.cc -o srecord/input/file/idt.lo\n\nsrecord/input/file/intel.lo srecord/input/file/intel.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/intel.cc srecord/input/file/intel.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/intel.cc -o srecord/input/file/intel.lo\n\n$(includedir)/srecord/input/file/intel.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/intel.h\n\t$(INSTALL_DATA) srecord/input/file/intel.h $@\n\nsrecord/input/file/intel16.lo srecord/input/file/intel16.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/intel16.cc srecord/input/file/intel16.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/intel16.cc -o \\\n\t\tsrecord/input/file/intel16.lo\n\nsrecord/input/file/logisim.lo srecord/input/file/logisim.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/logisim.cc srecord/input/file/logisim.h \\\n\t\tsrecord/output.h srecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/logisim.cc -o \\\n\t\tsrecord/input/file/logisim.lo\n\n$(includedir)/srecord/input/file/logisim.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/logisim.h\n\t$(INSTALL_DATA) srecord/input/file/logisim.h $@\n\nsrecord/input/file/mif.lo srecord/input/file/mif.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/mif.cc srecord/input/file/mif.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/mif.cc -o srecord/input/file/mif.lo\n\n$(includedir)/srecord/input/file/mif.h: \\\n\t\t.mkdir.__includedir__srecord_input_file srecord/input/file/mif.h\n\t$(INSTALL_DATA) srecord/input/file/mif.h $@\n\nsrecord/input/file/mips_flash.lo srecord/input/file/mips_flash.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/mips_flash.cc \\\n\t\tsrecord/input/file/mips_flash.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/mips_flash.cc -o \\\n\t\tsrecord/input/file/mips_flash.lo\n\n$(includedir)/srecord/input/file/mips_flash.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/mips_flash.h\n\t$(INSTALL_DATA) srecord/input/file/mips_flash.h $@\n\nsrecord/input/file/mos_tech.lo srecord/input/file/mos_tech.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/mos_tech.cc srecord/input/file/mos_tech.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/mos_tech.cc -o \\\n\t\tsrecord/input/file/mos_tech.lo\n\n$(includedir)/srecord/input/file/mos_tech.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/mos_tech.h\n\t$(INSTALL_DATA) srecord/input/file/mos_tech.h $@\n\nsrecord/input/file/motorola.lo srecord/input/file/motorola.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/motorola.cc srecord/input/file/motorola.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/motorola.cc -o \\\n\t\tsrecord/input/file/motorola.lo\n\nsrecord/input/file/msbin.lo srecord/input/file/msbin.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/msbin.cc srecord/input/file/msbin.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/msbin.cc -o srecord/input/file/msbin.lo\n\n$(includedir)/srecord/input/file/msbin.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/msbin.h\n\t$(INSTALL_DATA) srecord/input/file/msbin.h $@\n\nsrecord/input/file/needham.lo srecord/input/file/needham.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/needham.cc srecord/input/file/needham.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/needham.cc -o \\\n\t\tsrecord/input/file/needham.lo\n\n$(includedir)/srecord/input/file/needham.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/needham.h\n\t$(INSTALL_DATA) srecord/input/file/needham.h $@\n\nsrecord/input/file/os65v.lo srecord/input/file/os65v.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/os65v.cc srecord/input/file/os65v.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/os65v.cc -o srecord/input/file/os65v.lo\n\n$(includedir)/srecord/input/file/os65v.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/os65v.h\n\t$(INSTALL_DATA) srecord/input/file/os65v.h $@\n\nsrecord/input/file/ppb.lo srecord/input/file/ppb.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/ppb.cc srecord/input/file/ppb.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/ppb.cc -o srecord/input/file/ppb.lo\n\n$(includedir)/srecord/input/file/ppb.h: \\\n\t\t.mkdir.__includedir__srecord_input_file srecord/input/file/ppb.h\n\t$(INSTALL_DATA) srecord/input/file/ppb.h $@\n\nsrecord/input/file/ppx.lo srecord/input/file/ppx.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/ppx.cc srecord/input/file/ppx.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/ppx.cc -o srecord/input/file/ppx.lo\n\n$(includedir)/srecord/input/file/ppx.h: \\\n\t\t.mkdir.__includedir__srecord_input_file srecord/input/file/ppx.h\n\t$(INSTALL_DATA) srecord/input/file/ppx.h $@\n\nsrecord/input/file/signetics.lo srecord/input/file/signetics.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/signetics.cc \\\n\t\tsrecord/input/file/signetics.h srecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/signetics.cc -o \\\n\t\tsrecord/input/file/signetics.lo\n\n$(includedir)/srecord/input/file/signetics.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/signetics.h\n\t$(INSTALL_DATA) srecord/input/file/signetics.h $@\n\nsrecord/input/file/spasm.lo srecord/input/file/spasm.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/spasm.cc srecord/input/file/spasm.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/spasm.cc -o srecord/input/file/spasm.lo\n\n$(includedir)/srecord/input/file/spasm.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/spasm.h\n\t$(INSTALL_DATA) srecord/input/file/spasm.h $@\n\nsrecord/input/file/spectrum.lo srecord/input/file/spectrum.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/spectrum.cc srecord/input/file/spectrum.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/spectrum.cc -o \\\n\t\tsrecord/input/file/spectrum.lo\n\n$(includedir)/srecord/input/file/spectrum.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/spectrum.h\n\t$(INSTALL_DATA) srecord/input/file/spectrum.h $@\n\nsrecord/input/file/stewie.lo srecord/input/file/stewie.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/stewie.cc srecord/input/file/stewie.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/stewie.cc -o srecord/input/file/stewie.lo\n\n$(includedir)/srecord/input/file/stewie.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/stewie.h\n\t$(INSTALL_DATA) srecord/input/file/stewie.h $@\n\nsrecord/input/file/tektronix.lo srecord/input/file/tektronix.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/tektronix.cc \\\n\t\tsrecord/input/file/tektronix.h srecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/tektronix.cc -o \\\n\t\tsrecord/input/file/tektronix.lo\n\n$(includedir)/srecord/input/file/tektronix.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/tektronix.h\n\t$(INSTALL_DATA) srecord/input/file/tektronix.h $@\n\nsrecord/input/file/tektronix_extended.lo \\\n\t\tsrecord/input/file/tektronix_extended.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/tektronix_extended.cc \\\n\t\tsrecord/input/file/tektronix_extended.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/tektronix_extended.cc -o \\\n\t\tsrecord/input/file/tektronix_extended.lo\n\n$(includedir)/srecord/input/file/tektronix_extended.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/tektronix_extended.h\n\t$(INSTALL_DATA) srecord/input/file/tektronix_extended.h $@\n\nsrecord/input/file/ti_tagged.lo srecord/input/file/ti_tagged.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/ti_tagged.cc \\\n\t\tsrecord/input/file/ti_tagged.h srecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/ti_tagged.cc -o \\\n\t\tsrecord/input/file/ti_tagged.lo\n\n$(includedir)/srecord/input/file/ti_tagged.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/ti_tagged.h\n\t$(INSTALL_DATA) srecord/input/file/ti_tagged.h $@\n\nsrecord/input/file/ti_tagged_16.lo srecord/input/file/ti_tagged_16.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/file.h srecord/input/file/ti_tagged_16.cc \\\n\t\tsrecord/input/file/ti_tagged_16.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/ti_tagged_16.cc -o \\\n\t\tsrecord/input/file/ti_tagged_16.lo\n\n$(includedir)/srecord/input/file/ti_tagged_16.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/ti_tagged_16.h\n\t$(INSTALL_DATA) srecord/input/file/ti_tagged_16.h $@\n\nsrecord/input/file/ti_txt.lo srecord/input/file/ti_txt.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/ti_txt.cc srecord/input/file/ti_txt.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/ti_txt.cc -o srecord/input/file/ti_txt.lo\n\n$(includedir)/srecord/input/file/ti_txt.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/ti_txt.h\n\t$(INSTALL_DATA) srecord/input/file/ti_txt.h $@\n\nsrecord/input/file/trs80.lo srecord/input/file/trs80.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/trs80.cc srecord/input/file/trs80.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/trs80.cc -o srecord/input/file/trs80.lo\n\n$(includedir)/srecord/input/file/trs80.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/trs80.h\n\t$(INSTALL_DATA) srecord/input/file/trs80.h $@\n\nsrecord/input/file/vmem.lo srecord/input/file/vmem.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/vmem.cc srecord/input/file/vmem.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/vmem.cc -o srecord/input/file/vmem.lo\n\n$(includedir)/srecord/input/file/vmem.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/vmem.h\n\t$(INSTALL_DATA) srecord/input/file/vmem.h $@\n\nsrecord/input/file/wilson.lo srecord/input/file/wilson.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/file.h \\\n\t\tsrecord/input/file/wilson.cc srecord/input/file/wilson.h \\\n\t\tsrecord/output.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/file/wilson.cc -o srecord/input/file/wilson.lo\n\n$(includedir)/srecord/input/file/wilson.h: \\\n\t\t.mkdir.__includedir__srecord_input_file \\\n\t\tsrecord/input/file/wilson.h\n\t$(INSTALL_DATA) srecord/input/file/wilson.h $@\n\nsrecord/input/filter.lo srecord/input/filter.o: srecord/format_printf.h \\\n\t\tsrecord/input.h srecord/input/filter.cc srecord/input/filter.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter.cc -o srecord/input/filter.lo\n\n$(includedir)/srecord/input/filter.h: .mkdir.__includedir__srecord_input \\\n\t\tsrecord/input/filter.h\n\t$(INSTALL_DATA) srecord/input/filter.h $@\n\nsrecord/input/filter/and.lo srecord/input/filter/and.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/and.cc srecord/input/filter/and.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/and.cc -o srecord/input/filter/and.lo\n\n$(includedir)/srecord/input/filter/and.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/and.h\n\t$(INSTALL_DATA) srecord/input/filter/and.h $@\n\nsrecord/input/filter/bitrev.lo srecord/input/filter/bitrev.o: srecord/bitrev.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/bitrev.cc \\\n\t\tsrecord/input/filter/bitrev.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/bitrev.cc -o \\\n\t\tsrecord/input/filter/bitrev.lo\n\n$(includedir)/srecord/input/filter/bitrev.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/bitrev.h\n\t$(INSTALL_DATA) srecord/input/filter/bitrev.h $@\n\nsrecord/input/filter/byte_swap.lo srecord/input/filter/byte_swap.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/byte_swap.cc \\\n\t\tsrecord/input/filter/byte_swap.h srecord/output.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/byte_swap.cc -o \\\n\t\tsrecord/input/filter/byte_swap.lo\n\n$(includedir)/srecord/input/filter/byte_swap.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/byte_swap.h\n\t$(INSTALL_DATA) srecord/input/filter/byte_swap.h $@\n\nsrecord/input/filter/checksum.lo srecord/input/filter/checksum.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/checksum.cc \\\n\t\tsrecord/input/filter/checksum.h srecord/interval.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/checksum.cc -o \\\n\t\tsrecord/input/filter/checksum.lo\n\n$(includedir)/srecord/input/filter/checksum.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/checksum.h\n\t$(INSTALL_DATA) srecord/input/filter/checksum.h $@\n\nsrecord/input/filter/checksum/bitnot.lo \\\n\t\tsrecord/input/filter/checksum/bitnot.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/checksum.h \\\n\t\tsrecord/input/filter/checksum/bitnot.cc \\\n\t\tsrecord/input/filter/checksum/bitnot.h srecord/interval.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/checksum/bitnot.cc -o \\\n\t\tsrecord/input/filter/checksum/bitnot.lo\n\n$(includedir)/srecord/input/filter/checksum/bitnot.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_checksum \\\n\t\tsrecord/input/filter/checksum/bitnot.h\n\t$(INSTALL_DATA) srecord/input/filter/checksum/bitnot.h $@\n\nsrecord/input/filter/checksum/negative.lo \\\n\t\tsrecord/input/filter/checksum/negative.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/checksum.h \\\n\t\tsrecord/input/filter/checksum/negative.cc \\\n\t\tsrecord/input/filter/checksum/negative.h srecord/interval.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/checksum/negative.cc -o \\\n\t\tsrecord/input/filter/checksum/negative.lo\n\n$(includedir)/srecord/input/filter/checksum/negative.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_checksum \\\n\t\tsrecord/input/filter/checksum/negative.h\n\t$(INSTALL_DATA) srecord/input/filter/checksum/negative.h $@\n\nsrecord/input/filter/checksum/positive.lo \\\n\t\tsrecord/input/filter/checksum/positive.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/checksum.h \\\n\t\tsrecord/input/filter/checksum/positive.cc \\\n\t\tsrecord/input/filter/checksum/positive.h srecord/interval.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/checksum/positive.cc -o \\\n\t\tsrecord/input/filter/checksum/positive.lo\n\n$(includedir)/srecord/input/filter/checksum/positive.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_checksum \\\n\t\tsrecord/input/filter/checksum/positive.h\n\t$(INSTALL_DATA) srecord/input/filter/checksum/positive.h $@\n\nsrecord/input/filter/crop.lo srecord/input/filter/crop.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/crop.cc srecord/input/filter/crop.h \\\n\t\tsrecord/interval.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/crop.cc -o srecord/input/filter/crop.lo\n\n$(includedir)/srecord/input/filter/crop.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/crop.h\n\t$(INSTALL_DATA) srecord/input/filter/crop.h $@\n\nsrecord/input/filter/fill.lo srecord/input/filter/fill.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/fill.cc srecord/input/filter/fill.h \\\n\t\tsrecord/interval.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/fill.cc -o srecord/input/filter/fill.lo\n\n$(includedir)/srecord/input/filter/fill.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/fill.h\n\t$(INSTALL_DATA) srecord/input/filter/fill.h $@\n\nsrecord/input/filter/interval.lo srecord/input/filter/interval.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/interval.cc \\\n\t\tsrecord/input/filter/interval.h srecord/interval.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/interval.cc -o \\\n\t\tsrecord/input/filter/interval.lo\n\n$(includedir)/srecord/input/filter/interval.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/interval.h\n\t$(INSTALL_DATA) srecord/input/filter/interval.h $@\n\nsrecord/input/filter/interval/length.lo \\\n\t\tsrecord/input/filter/interval/length.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/interval.h \\\n\t\tsrecord/input/filter/interval/length.cc \\\n\t\tsrecord/input/filter/interval/length.h srecord/interval.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/interval/length.cc -o \\\n\t\tsrecord/input/filter/interval/length.lo\n\n$(includedir)/srecord/input/filter/interval/length.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_interval \\\n\t\tsrecord/input/filter/interval/length.h\n\t$(INSTALL_DATA) srecord/input/filter/interval/length.h $@\n\nsrecord/input/filter/interval/maximum.lo \\\n\t\tsrecord/input/filter/interval/maximum.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/interval.h \\\n\t\tsrecord/input/filter/interval/maximum.cc \\\n\t\tsrecord/input/filter/interval/maximum.h srecord/interval.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/interval/maximum.cc -o \\\n\t\tsrecord/input/filter/interval/maximum.lo\n\n$(includedir)/srecord/input/filter/interval/maximum.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_interval \\\n\t\tsrecord/input/filter/interval/maximum.h\n\t$(INSTALL_DATA) srecord/input/filter/interval/maximum.h $@\n\nsrecord/input/filter/interval/minimum.lo \\\n\t\tsrecord/input/filter/interval/minimum.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/interval.h \\\n\t\tsrecord/input/filter/interval/minimum.cc \\\n\t\tsrecord/input/filter/interval/minimum.h srecord/interval.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/interval/minimum.cc -o \\\n\t\tsrecord/input/filter/interval/minimum.lo\n\n$(includedir)/srecord/input/filter/interval/minimum.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_interval \\\n\t\tsrecord/input/filter/interval/minimum.h\n\t$(INSTALL_DATA) srecord/input/filter/interval/minimum.h $@\n\nsrecord/input/filter/message.lo srecord/input/filter/message.o: \\\n\t\tsrecord/defcon.h srecord/endian.h srecord/format_printf.h \\\n\t\tsrecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/message.cc srecord/input/filter/message.h \\\n\t\tsrecord/memory.h srecord/memory/chunk.h \\\n\t\tsrecord/memory/walker.h srecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message.cc -o \\\n\t\tsrecord/input/filter/message.lo\n\n$(includedir)/srecord/input/filter/message.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/message.h\n\t$(INSTALL_DATA) srecord/input/filter/message.h $@\n\nsrecord/input/filter/message/adler16.lo \\\n\t\tsrecord/input/filter/message/adler16.o: srecord/adler16.h \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/adler16.cc \\\n\t\tsrecord/input/filter/message/adler16.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/adler16.h srecord/output.h \\\n\t\tsrecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/adler16.cc -o \\\n\t\tsrecord/input/filter/message/adler16.lo\n\n$(includedir)/srecord/input/filter/message/adler16.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_message \\\n\t\tsrecord/input/filter/message/adler16.h\n\t$(INSTALL_DATA) srecord/input/filter/message/adler16.h $@\n\nsrecord/input/filter/message/adler32.lo \\\n\t\tsrecord/input/filter/message/adler32.o: srecord/adler32.h \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/adler32.cc \\\n\t\tsrecord/input/filter/message/adler32.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/adler32.h srecord/output.h \\\n\t\tsrecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/adler32.cc -o \\\n\t\tsrecord/input/filter/message/adler32.lo\n\n$(includedir)/srecord/input/filter/message/adler32.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_message \\\n\t\tsrecord/input/filter/message/adler32.h\n\t$(INSTALL_DATA) srecord/input/filter/message/adler32.h $@\n\nsrecord/input/filter/message/crc16.lo srecord/input/filter/message/crc16.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/crc16.h \\\n\t\tsrecord/defcon.h srecord/endian.h srecord/format_printf.h \\\n\t\tsrecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/crc16.cc \\\n\t\tsrecord/input/filter/message/crc16.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/crc16.h srecord/output.h \\\n\t\tsrecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/crc16.cc -o \\\n\t\tsrecord/input/filter/message/crc16.lo\n\n$(includedir)/srecord/input/filter/message/crc16.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_message \\\n\t\tsrecord/input/filter/message/crc16.h\n\t$(INSTALL_DATA) srecord/input/filter/message/crc16.h $@\n\nsrecord/input/filter/message/crc32.lo srecord/input/filter/message/crc32.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/crc32.h \\\n\t\tsrecord/defcon.h srecord/endian.h srecord/format_printf.h \\\n\t\tsrecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/crc32.cc \\\n\t\tsrecord/input/filter/message/crc32.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/crc32.h srecord/output.h \\\n\t\tsrecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/crc32.cc -o \\\n\t\tsrecord/input/filter/message/crc32.lo\n\n$(includedir)/srecord/input/filter/message/crc32.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_message \\\n\t\tsrecord/input/filter/message/crc32.h\n\t$(INSTALL_DATA) srecord/input/filter/message/crc32.h $@\n\nsrecord/input/filter/message/fletcher16.lo \\\n\t\tsrecord/input/filter/message/fletcher16.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/fletcher16.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/fletcher16.cc \\\n\t\tsrecord/input/filter/message/fletcher16.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/fletcher16.h srecord/output.h \\\n\t\tsrecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/fletcher16.cc -o \\\n\t\tsrecord/input/filter/message/fletcher16.lo\n\n$(includedir)/srecord/input/filter/message/fletcher16.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_message \\\n\t\tsrecord/input/filter/message/fletcher16.h\n\t$(INSTALL_DATA) srecord/input/filter/message/fletcher16.h $@\n\nsrecord/input/filter/message/fletcher32.lo \\\n\t\tsrecord/input/filter/message/fletcher32.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/fletcher32.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/fletcher32.cc \\\n\t\tsrecord/input/filter/message/fletcher32.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/fletcher32.h srecord/output.h \\\n\t\tsrecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/fletcher32.cc -o \\\n\t\tsrecord/input/filter/message/fletcher32.lo\n\n$(includedir)/srecord/input/filter/message/fletcher32.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_message \\\n\t\tsrecord/input/filter/message/fletcher32.h\n\t$(INSTALL_DATA) srecord/input/filter/message/fletcher32.h $@\n\nsrecord/input/filter/message/gcrypt.lo srecord/input/filter/message/gcrypt.o: \\\n\t\tsrecord/config.messy.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/gcrypt.cc \\\n\t\tsrecord/input/filter/message/gcrypt.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/gcrypt.h srecord/quit.h srecord/record.h \\\n\t\tsrecord/sizeof.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/gcrypt.cc -o \\\n\t\tsrecord/input/filter/message/gcrypt.lo\n\n$(includedir)/srecord/input/filter/message/gcrypt.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter_message \\\n\t\tsrecord/input/filter/message/gcrypt.h\n\t$(INSTALL_DATA) srecord/input/filter/message/gcrypt.h $@\n\nsrecord/input/filter/message/stm32.lo srecord/input/filter/message/stm32.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/message.h \\\n\t\tsrecord/input/filter/message/stm32.cc \\\n\t\tsrecord/input/filter/message/stm32.h srecord/memory.h \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/stm32.h srecord/output.h \\\n\t\tsrecord/record.h srecord/stm32.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/message/stm32.cc -o \\\n\t\tsrecord/input/filter/message/stm32.lo\n\nsrecord/input/filter/not.lo srecord/input/filter/not.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/not.cc srecord/input/filter/not.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/not.cc -o srecord/input/filter/not.lo\n\n$(includedir)/srecord/input/filter/not.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/not.h\n\t$(INSTALL_DATA) srecord/input/filter/not.h $@\n\nsrecord/input/filter/offset.lo srecord/input/filter/offset.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/offset.cc srecord/input/filter/offset.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/offset.cc -o \\\n\t\tsrecord/input/filter/offset.lo\n\n$(includedir)/srecord/input/filter/offset.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/offset.h\n\t$(INSTALL_DATA) srecord/input/filter/offset.h $@\n\nsrecord/input/filter/or.lo srecord/input/filter/or.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/or.cc srecord/input/filter/or.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/or.cc -o srecord/input/filter/or.lo\n\n$(includedir)/srecord/input/filter/or.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/or.h\n\t$(INSTALL_DATA) srecord/input/filter/or.h $@\n\nsrecord/input/filter/random_fill.lo srecord/input/filter/random_fill.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/random_fill.cc \\\n\t\tsrecord/input/filter/random_fill.h srecord/interval.h \\\n\t\tsrecord/r250.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/random_fill.cc -o \\\n\t\tsrecord/input/filter/random_fill.lo\n\n$(includedir)/srecord/input/filter/random_fill.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/random_fill.h\n\t$(INSTALL_DATA) srecord/input/filter/random_fill.h $@\n\nsrecord/input/filter/sequence.lo srecord/input/filter/sequence.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/sequence.cc \\\n\t\tsrecord/input/filter/sequence.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/sequence.cc -o \\\n\t\tsrecord/input/filter/sequence.lo\n\n$(includedir)/srecord/input/filter/sequence.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/sequence.h\n\t$(INSTALL_DATA) srecord/input/filter/sequence.h $@\n\nsrecord/input/filter/split.lo srecord/input/filter/split.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/split.cc srecord/input/filter/split.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/split.cc -o \\\n\t\tsrecord/input/filter/split.lo\n\n$(includedir)/srecord/input/filter/split.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/split.h\n\t$(INSTALL_DATA) srecord/input/filter/split.h $@\n\nsrecord/input/filter/unfill.lo srecord/input/filter/unfill.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/unfill.cc srecord/input/filter/unfill.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/unfill.cc -o \\\n\t\tsrecord/input/filter/unfill.lo\n\n$(includedir)/srecord/input/filter/unfill.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/unfill.h\n\t$(INSTALL_DATA) srecord/input/filter/unfill.h $@\n\nsrecord/input/filter/unsplit.lo srecord/input/filter/unsplit.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/filter.h srecord/input/filter/unsplit.cc \\\n\t\tsrecord/input/filter/unsplit.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/unsplit.cc -o \\\n\t\tsrecord/input/filter/unsplit.lo\n\n$(includedir)/srecord/input/filter/unsplit.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/unsplit.h\n\t$(INSTALL_DATA) srecord/input/filter/unsplit.h $@\n\nsrecord/input/filter/xor.lo srecord/input/filter/xor.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/input/filter.h \\\n\t\tsrecord/input/filter/xor.cc srecord/input/filter/xor.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/filter/xor.cc -o srecord/input/filter/xor.lo\n\n$(includedir)/srecord/input/filter/xor.h: \\\n\t\t.mkdir.__includedir__srecord_input_filter \\\n\t\tsrecord/input/filter/xor.h\n\t$(INSTALL_DATA) srecord/input/filter/xor.h $@\n\nsrecord/input/generator.lo srecord/input/generator.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/generator.cc srecord/input/generator.h \\\n\t\tsrecord/input/generator/constant.h \\\n\t\tsrecord/input/generator/random.h \\\n\t\tsrecord/input/generator/repeat.h srecord/interval.h \\\n\t\tsrecord/output.h srecord/record.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/generator.cc -o srecord/input/generator.lo\n\n$(includedir)/srecord/input/generator.h: .mkdir.__includedir__srecord_input \\\n\t\tsrecord/input/generator.h\n\t$(INSTALL_DATA) srecord/input/generator.h $@\n\nsrecord/input/generator/constant.lo srecord/input/generator/constant.o: \\\n\t\tsrecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/generator.h srecord/input/generator/constant.cc \\\n\t\tsrecord/input/generator/constant.h srecord/interval.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/generator/constant.cc -o \\\n\t\tsrecord/input/generator/constant.lo\n\n$(includedir)/srecord/input/generator/constant.h: \\\n\t\t.mkdir.__includedir__srecord_input_generator \\\n\t\tsrecord/input/generator/constant.h\n\t$(INSTALL_DATA) srecord/input/generator/constant.h $@\n\nsrecord/input/generator/random.lo srecord/input/generator/random.o: \\\n\t\tsrecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/generator.h srecord/input/generator/random.cc \\\n\t\tsrecord/input/generator/random.h srecord/interval.h \\\n\t\tsrecord/r250.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/generator/random.cc -o \\\n\t\tsrecord/input/generator/random.lo\n\n$(includedir)/srecord/input/generator/random.h: \\\n\t\t.mkdir.__includedir__srecord_input_generator \\\n\t\tsrecord/input/generator/random.h\n\t$(INSTALL_DATA) srecord/input/generator/random.h $@\n\nsrecord/input/generator/repeat.lo srecord/input/generator/repeat.o: \\\n\t\tsrecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/generator.h srecord/input/generator/repeat.cc \\\n\t\tsrecord/input/generator/repeat.h srecord/interval.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/generator/repeat.cc -o \\\n\t\tsrecord/input/generator/repeat.lo\n\n$(includedir)/srecord/input/generator/repeat.h: \\\n\t\t.mkdir.__includedir__srecord_input_generator \\\n\t\tsrecord/input/generator/repeat.h\n\t$(INSTALL_DATA) srecord/input/generator/repeat.h $@\n\nsrecord/input/interval.lo srecord/input/interval.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h \\\n\t\tsrecord/input/interval.cc srecord/input/interval.h \\\n\t\tsrecord/interval.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/input/interval.cc -o srecord/input/interval.lo\n\nsrecord/interval.lo srecord/interval.o: srecord/interval.cc srecord/interval.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/interval.cc -o srecord/interval.lo\n\n$(includedir)/srecord/interval.h: .mkdir.__includedir__srecord \\\n\t\tsrecord/interval.h\n\t$(INSTALL_DATA) srecord/interval.h $@\n\nsrecord/interval/coverage.lo srecord/interval/coverage.o: srecord/interval.h \\\n\t\tsrecord/interval/coverage.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/interval/coverage.cc -o srecord/interval/coverage.lo\n\nsrecord/interval/flatten.lo srecord/interval/flatten.o: srecord/interval.h \\\n\t\tsrecord/interval/flatten.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/interval/flatten.cc -o srecord/interval/flatten.lo\n\nsrecord/memory.lo srecord/memory.o: srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/interval.h \\\n\t\tsrecord/memory.cc srecord/memory.h srecord/memory/chunk.h \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/alignment.h \\\n\t\tsrecord/memory/walker/compare.h \\\n\t\tsrecord/memory/walker/continuity.h srecord/record.h \\\n\t\tsrecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory.cc -o srecord/memory.lo\n\n$(includedir)/srecord/memory.h: .mkdir.__includedir__srecord srecord/memory.h\n\t$(INSTALL_DATA) srecord/memory.h $@\n\nsrecord/memory/chunk.lo srecord/memory/chunk.o: srecord/memory/chunk.cc \\\n\t\tsrecord/memory/chunk.h srecord/memory/walker.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/chunk.cc -o srecord/memory/chunk.lo\n\n$(includedir)/srecord/memory/chunk.h: .mkdir.__includedir__srecord_memory \\\n\t\tsrecord/memory/chunk.h\n\t$(INSTALL_DATA) srecord/memory/chunk.h $@\n\nsrecord/memory/walker.lo srecord/memory/walker.o: srecord/memory/walker.cc \\\n\t\tsrecord/memory/walker.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker.cc -o srecord/memory/walker.lo\n\n$(includedir)/srecord/memory/walker.h: .mkdir.__includedir__srecord_memory \\\n\t\tsrecord/memory/walker.h\n\t$(INSTALL_DATA) srecord/memory/walker.h $@\n\nsrecord/memory/walker/adler16.lo srecord/memory/walker/adler16.o: \\\n\t\tsrecord/adler16.h srecord/format_printf.h \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/adler16.cc \\\n\t\tsrecord/memory/walker/adler16.h srecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/adler16.cc -o \\\n\t\tsrecord/memory/walker/adler16.lo\n\nsrecord/memory/walker/adler32.lo srecord/memory/walker/adler32.o: \\\n\t\tsrecord/adler32.h srecord/format_printf.h \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/adler32.cc \\\n\t\tsrecord/memory/walker/adler32.h srecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/adler32.cc -o \\\n\t\tsrecord/memory/walker/adler32.lo\n\nsrecord/memory/walker/alignment.lo srecord/memory/walker/alignment.o: \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/alignment.cc \\\n\t\tsrecord/memory/walker/alignment.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/alignment.cc -o \\\n\t\tsrecord/memory/walker/alignment.lo\n\nsrecord/memory/walker/compare.lo srecord/memory/walker/compare.o: \\\n\t\tsrecord/defcon.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/interval.h srecord/memory.h srecord/memory/chunk.h \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/compare.cc \\\n\t\tsrecord/memory/walker/compare.h srecord/string.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/compare.cc -o \\\n\t\tsrecord/memory/walker/compare.lo\n\n$(includedir)/srecord/memory/walker/compare.h: \\\n\t\t.mkdir.__includedir__srecord_memory_walker \\\n\t\tsrecord/memory/walker/compare.h\n\t$(INSTALL_DATA) srecord/memory/walker/compare.h $@\n\nsrecord/memory/walker/continuity.lo srecord/memory/walker/continuity.o: \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/continuity.cc \\\n\t\tsrecord/memory/walker/continuity.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/continuity.cc -o \\\n\t\tsrecord/memory/walker/continuity.lo\n\n$(includedir)/srecord/memory/walker/continuity.h: \\\n\t\t.mkdir.__includedir__srecord_memory_walker \\\n\t\tsrecord/memory/walker/continuity.h\n\t$(INSTALL_DATA) srecord/memory/walker/continuity.h $@\n\nsrecord/memory/walker/crc16.lo srecord/memory/walker/crc16.o: srecord/crc16.h \\\n\t\tsrecord/format_printf.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/crc16.cc srecord/memory/walker/crc16.h \\\n\t\tsrecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/crc16.cc -o \\\n\t\tsrecord/memory/walker/crc16.lo\n\nsrecord/memory/walker/crc32.lo srecord/memory/walker/crc32.o: srecord/crc32.h \\\n\t\tsrecord/format_printf.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/crc32.cc srecord/memory/walker/crc32.h \\\n\t\tsrecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/crc32.cc -o \\\n\t\tsrecord/memory/walker/crc32.lo\n\nsrecord/memory/walker/fletcher16.lo srecord/memory/walker/fletcher16.o: \\\n\t\tsrecord/endian.h srecord/fletcher16.h srecord/format_printf.h \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/fletcher16.cc \\\n\t\tsrecord/memory/walker/fletcher16.h srecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/fletcher16.cc -o \\\n\t\tsrecord/memory/walker/fletcher16.lo\n\nsrecord/memory/walker/fletcher32.lo srecord/memory/walker/fletcher32.o: \\\n\t\tsrecord/fletcher32.h srecord/format_printf.h \\\n\t\tsrecord/memory/walker.h srecord/memory/walker/fletcher32.cc \\\n\t\tsrecord/memory/walker/fletcher32.h srecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/fletcher32.cc -o \\\n\t\tsrecord/memory/walker/fletcher32.lo\n\nsrecord/memory/walker/gcrypt.lo srecord/memory/walker/gcrypt.o: \\\n\t\tsrecord/config.messy.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/gcrypt.cc srecord/memory/walker/gcrypt.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/gcrypt.cc -o \\\n\t\tsrecord/memory/walker/gcrypt.lo\n\n$(includedir)/srecord/memory/walker/gcrypt.h: \\\n\t\t.mkdir.__includedir__srecord_memory_walker \\\n\t\tsrecord/memory/walker/gcrypt.h\n\t$(INSTALL_DATA) srecord/memory/walker/gcrypt.h $@\n\nsrecord/memory/walker/stm32.lo srecord/memory/walker/stm32.o: srecord/arglex.h \\\n\t\tsrecord/format_printf.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/stm32.cc srecord/memory/walker/stm32.h \\\n\t\tsrecord/output.h srecord/stm32.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/stm32.cc -o \\\n\t\tsrecord/memory/walker/stm32.lo\n\nsrecord/memory/walker/writer.lo srecord/memory/walker/writer.o: \\\n\t\tsrecord/format_printf.h srecord/memory/walker.h \\\n\t\tsrecord/memory/walker/writer.cc srecord/memory/walker/writer.h \\\n\t\tsrecord/output.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/memory/walker/writer.cc -o \\\n\t\tsrecord/memory/walker/writer.lo\n\n$(includedir)/srecord/memory/walker/writer.h: \\\n\t\t.mkdir.__includedir__srecord_memory_walker \\\n\t\tsrecord/memory/walker/writer.h\n\t$(INSTALL_DATA) srecord/memory/walker/writer.h $@\n\nsrecord/output.lo srecord/output.o: srecord/endian.h srecord/format_printf.h \\\n\t\tsrecord/output.cc srecord/output.h srecord/quit.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output.cc -o srecord/output.lo\n\n$(includedir)/srecord/output.h: .mkdir.__includedir__srecord srecord/output.h\n\t$(INSTALL_DATA) srecord/output.h $@\n\nsrecord/output/file.lo srecord/output/file.o: srecord/arglex.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.cc srecord/output/file.h srecord/record.h \\\n\t\tsrecord/sizeof.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file.cc -o srecord/output/file.lo\n\n$(includedir)/srecord/output/file.h: .mkdir.__includedir__srecord_output \\\n\t\tsrecord/output/file.h\n\t$(INSTALL_DATA) srecord/output/file.h $@\n\nsrecord/output/file/aomf.lo srecord/output/file/aomf.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/aomf.cc srecord/output/file/aomf.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/aomf.cc -o srecord/output/file/aomf.lo\n\n$(includedir)/srecord/output/file/aomf.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/aomf.h\n\t$(INSTALL_DATA) srecord/output/file/aomf.h $@\n\nsrecord/output/file/ascii_hex.lo srecord/output/file/ascii_hex.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/ascii_hex.cc \\\n\t\tsrecord/output/file/ascii_hex.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/ascii_hex.cc -o \\\n\t\tsrecord/output/file/ascii_hex.lo\n\n$(includedir)/srecord/output/file/ascii_hex.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/ascii_hex.h\n\t$(INSTALL_DATA) srecord/output/file/ascii_hex.h $@\n\nsrecord/output/file/asm.lo srecord/output/file/asm.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/interval.h \\\n\t\tsrecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/asm.cc srecord/output/file/asm.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/asm.cc -o srecord/output/file/asm.lo\n\n$(includedir)/srecord/output/file/asm.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/asm.h\n\t$(INSTALL_DATA) srecord/output/file/asm.h $@\n\nsrecord/output/file/atmel_generic.lo srecord/output/file/atmel_generic.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/atmel_generic.cc \\\n\t\tsrecord/output/file/atmel_generic.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/atmel_generic.cc -o \\\n\t\tsrecord/output/file/atmel_generic.lo\n\n$(includedir)/srecord/output/file/atmel_generic.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/atmel_generic.h\n\t$(INSTALL_DATA) srecord/output/file/atmel_generic.h $@\n\nsrecord/output/file/basic.lo srecord/output/file/basic.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/interval.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/basic.cc \\\n\t\tsrecord/output/file/basic.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/basic.cc -o srecord/output/file/basic.lo\n\n$(includedir)/srecord/output/file/basic.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/basic.h\n\t$(INSTALL_DATA) srecord/output/file/basic.h $@\n\nsrecord/output/file/binary.lo srecord/output/file/binary.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/binary.cc srecord/output/file/binary.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/binary.cc -o \\\n\t\tsrecord/output/file/binary.lo\n\n$(includedir)/srecord/output/file/binary.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/binary.h\n\t$(INSTALL_DATA) srecord/output/file/binary.h $@\n\nsrecord/output/file/brecord.lo srecord/output/file/brecord.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/brecord.cc srecord/output/file/brecord.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/brecord.cc -o \\\n\t\tsrecord/output/file/brecord.lo\n\n$(includedir)/srecord/output/file/brecord.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/brecord.h\n\t$(INSTALL_DATA) srecord/output/file/brecord.h $@\n\nsrecord/output/file/c.lo srecord/output/file/c.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/interval.h \\\n\t\tsrecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/c.cc srecord/output/file/c.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/c.cc -o srecord/output/file/c.lo\n\n$(includedir)/srecord/output/file/c.h: \\\n\t\t.mkdir.__includedir__srecord_output_file srecord/output/file/c.h\n\t$(INSTALL_DATA) srecord/output/file/c.h $@\n\nsrecord/output/file/coe.lo srecord/output/file/coe.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/coe.cc \\\n\t\tsrecord/output/file/coe.h srecord/progname.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/coe.cc -o srecord/output/file/coe.lo\n\nsrecord/output/file/cosmac.lo srecord/output/file/cosmac.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/cosmac.cc srecord/output/file/cosmac.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/cosmac.cc -o \\\n\t\tsrecord/output/file/cosmac.lo\n\n$(includedir)/srecord/output/file/cosmac.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/cosmac.h\n\t$(INSTALL_DATA) srecord/output/file/cosmac.h $@\n\nsrecord/output/file/dec_binary.lo srecord/output/file/dec_binary.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/dec_binary.cc \\\n\t\tsrecord/output/file/dec_binary.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/dec_binary.cc -o \\\n\t\tsrecord/output/file/dec_binary.lo\n\n$(includedir)/srecord/output/file/dec_binary.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/dec_binary.h\n\t$(INSTALL_DATA) srecord/output/file/dec_binary.h $@\n\nsrecord/output/file/emon52.lo srecord/output/file/emon52.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/emon52.cc srecord/output/file/emon52.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/emon52.cc -o \\\n\t\tsrecord/output/file/emon52.lo\n\n$(includedir)/srecord/output/file/emon52.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/emon52.h\n\t$(INSTALL_DATA) srecord/output/file/emon52.h $@\n\nsrecord/output/file/fairchild.lo srecord/output/file/fairchild.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/fairchild.cc \\\n\t\tsrecord/output/file/fairchild.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/fairchild.cc -o \\\n\t\tsrecord/output/file/fairchild.lo\n\n$(includedir)/srecord/output/file/fairchild.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/fairchild.h\n\t$(INSTALL_DATA) srecord/output/file/fairchild.h $@\n\nsrecord/output/file/fastload.lo srecord/output/file/fastload.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/fastload.cc \\\n\t\tsrecord/output/file/fastload.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/fastload.cc -o \\\n\t\tsrecord/output/file/fastload.lo\n\n$(includedir)/srecord/output/file/fastload.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/fastload.h\n\t$(INSTALL_DATA) srecord/output/file/fastload.h $@\n\nsrecord/output/file/formatted_binary.lo \\\n\t\tsrecord/output/file/formatted_binary.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/formatted_binary.cc \\\n\t\tsrecord/output/file/formatted_binary.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/formatted_binary.cc -o \\\n\t\tsrecord/output/file/formatted_binary.lo\n\n$(includedir)/srecord/output/file/formatted_binary.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/formatted_binary.h\n\t$(INSTALL_DATA) srecord/output/file/formatted_binary.h $@\n\nsrecord/output/file/forth.lo srecord/output/file/forth.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/forth.cc \\\n\t\tsrecord/output/file/forth.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/forth.cc -o srecord/output/file/forth.lo\n\n$(includedir)/srecord/output/file/forth.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/forth.h\n\t$(INSTALL_DATA) srecord/output/file/forth.h $@\n\nsrecord/output/file/four_packed_code.lo \\\n\t\tsrecord/output/file/four_packed_code.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/four_packed_code.cc \\\n\t\tsrecord/output/file/four_packed_code.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/four_packed_code.cc -o \\\n\t\tsrecord/output/file/four_packed_code.lo\n\n$(includedir)/srecord/output/file/four_packed_code.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/four_packed_code.h\n\t$(INSTALL_DATA) srecord/output/file/four_packed_code.h $@\n\nsrecord/output/file/hexdump.lo srecord/output/file/hexdump.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/hexdump.cc srecord/output/file/hexdump.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/hexdump.cc -o \\\n\t\tsrecord/output/file/hexdump.lo\n\n$(includedir)/srecord/output/file/hexdump.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/hexdump.h\n\t$(INSTALL_DATA) srecord/output/file/hexdump.h $@\n\nsrecord/output/file/idt.lo srecord/output/file/idt.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/idt.cc srecord/output/file/idt.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/idt.cc -o srecord/output/file/idt.lo\n\nsrecord/output/file/intel.lo srecord/output/file/intel.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/intel.cc srecord/output/file/intel.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/intel.cc -o srecord/output/file/intel.lo\n\n$(includedir)/srecord/output/file/intel.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/intel.h\n\t$(INSTALL_DATA) srecord/output/file/intel.h $@\n\nsrecord/output/file/intel16.lo srecord/output/file/intel16.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/intel16.cc srecord/output/file/intel16.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/intel16.cc -o \\\n\t\tsrecord/output/file/intel16.lo\n\n$(includedir)/srecord/output/file/intel16.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/intel16.h\n\t$(INSTALL_DATA) srecord/output/file/intel16.h $@\n\nsrecord/output/file/line_termination.lo \\\n\t\tsrecord/output/file/line_termination.o: srecord/arglex.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/line_termination.cc srecord/sizeof.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/line_termination.cc -o \\\n\t\tsrecord/output/file/line_termination.lo\n\nsrecord/output/file/logisim.lo srecord/output/file/logisim.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/logisim.cc srecord/output/file/logisim.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/logisim.cc -o \\\n\t\tsrecord/output/file/logisim.lo\n\n$(includedir)/srecord/output/file/logisim.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/logisim.h\n\t$(INSTALL_DATA) srecord/output/file/logisim.h $@\n\nsrecord/output/file/mem.lo srecord/output/file/mem.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/mem.cc \\\n\t\tsrecord/output/file/mem.h srecord/progname.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/mem.cc -o srecord/output/file/mem.lo\n\nsrecord/output/file/mif.lo srecord/output/file/mif.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/mif.cc \\\n\t\tsrecord/output/file/mif.h srecord/progname.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/mif.cc -o srecord/output/file/mif.lo\n\n$(includedir)/srecord/output/file/mif.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/mif.h\n\t$(INSTALL_DATA) srecord/output/file/mif.h $@\n\nsrecord/output/file/mips_flash.lo srecord/output/file/mips_flash.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/mips_flash.cc \\\n\t\tsrecord/output/file/mips_flash.h srecord/record.h \\\n\t\tsrecord/sizeof.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/mips_flash.cc -o \\\n\t\tsrecord/output/file/mips_flash.lo\n\n$(includedir)/srecord/output/file/mips_flash.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/mips_flash.h\n\t$(INSTALL_DATA) srecord/output/file/mips_flash.h $@\n\nsrecord/output/file/mos_tech.lo srecord/output/file/mos_tech.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/mos_tech.cc \\\n\t\tsrecord/output/file/mos_tech.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/mos_tech.cc -o \\\n\t\tsrecord/output/file/mos_tech.lo\n\n$(includedir)/srecord/output/file/mos_tech.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/mos_tech.h\n\t$(INSTALL_DATA) srecord/output/file/mos_tech.h $@\n\nsrecord/output/file/motorola.lo srecord/output/file/motorola.o: \\\n\t\tsrecord/arglex.h srecord/arglex/tool.h srecord/defcon.h \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/input.h \\\n\t\tsrecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/motorola.cc srecord/output/file/motorola.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/motorola.cc -o \\\n\t\tsrecord/output/file/motorola.lo\n\nsrecord/output/file/msbin.lo srecord/output/file/msbin.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/msbin.cc srecord/output/file/msbin.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/msbin.cc -o srecord/output/file/msbin.lo\n\n$(includedir)/srecord/output/file/msbin.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/msbin.h\n\t$(INSTALL_DATA) srecord/output/file/msbin.h $@\n\nsrecord/output/file/needham.lo srecord/output/file/needham.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/needham.cc srecord/output/file/needham.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/needham.cc -o \\\n\t\tsrecord/output/file/needham.lo\n\n$(includedir)/srecord/output/file/needham.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/needham.h\n\t$(INSTALL_DATA) srecord/output/file/needham.h $@\n\nsrecord/output/file/os65v.lo srecord/output/file/os65v.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/os65v.cc srecord/output/file/os65v.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/os65v.cc -o srecord/output/file/os65v.lo\n\n$(includedir)/srecord/output/file/os65v.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/os65v.h\n\t$(INSTALL_DATA) srecord/output/file/os65v.h $@\n\nsrecord/output/file/ppb.lo srecord/output/file/ppb.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/ppb.cc srecord/output/file/ppb.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/ppb.cc -o srecord/output/file/ppb.lo\n\n$(includedir)/srecord/output/file/ppb.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/ppb.h\n\t$(INSTALL_DATA) srecord/output/file/ppb.h $@\n\nsrecord/output/file/ppx.lo srecord/output/file/ppx.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/ppx.cc srecord/output/file/ppx.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/ppx.cc -o srecord/output/file/ppx.lo\n\n$(includedir)/srecord/output/file/ppx.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/ppx.h\n\t$(INSTALL_DATA) srecord/output/file/ppx.h $@\n\nsrecord/output/file/signetics.lo srecord/output/file/signetics.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/signetics.cc \\\n\t\tsrecord/output/file/signetics.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/signetics.cc -o \\\n\t\tsrecord/output/file/signetics.lo\n\n$(includedir)/srecord/output/file/signetics.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/signetics.h\n\t$(INSTALL_DATA) srecord/output/file/signetics.h $@\n\nsrecord/output/file/spasm.lo srecord/output/file/spasm.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/spasm.cc srecord/output/file/spasm.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/spasm.cc -o srecord/output/file/spasm.lo\n\n$(includedir)/srecord/output/file/spasm.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/spasm.h\n\t$(INSTALL_DATA) srecord/output/file/spasm.h $@\n\nsrecord/output/file/spectrum.lo srecord/output/file/spectrum.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/spectrum.cc \\\n\t\tsrecord/output/file/spectrum.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/spectrum.cc -o \\\n\t\tsrecord/output/file/spectrum.lo\n\n$(includedir)/srecord/output/file/spectrum.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/spectrum.h\n\t$(INSTALL_DATA) srecord/output/file/spectrum.h $@\n\nsrecord/output/file/stewie.lo srecord/output/file/stewie.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/stewie.cc srecord/output/file/stewie.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/stewie.cc -o \\\n\t\tsrecord/output/file/stewie.lo\n\n$(includedir)/srecord/output/file/stewie.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/stewie.h\n\t$(INSTALL_DATA) srecord/output/file/stewie.h $@\n\nsrecord/output/file/tektronix.lo srecord/output/file/tektronix.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/tektronix.cc \\\n\t\tsrecord/output/file/tektronix.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/tektronix.cc -o \\\n\t\tsrecord/output/file/tektronix.lo\n\n$(includedir)/srecord/output/file/tektronix.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/tektronix.h\n\t$(INSTALL_DATA) srecord/output/file/tektronix.h $@\n\nsrecord/output/file/tektronix_extended.lo \\\n\t\tsrecord/output/file/tektronix_extended.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/tektronix_extended.cc \\\n\t\tsrecord/output/file/tektronix_extended.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/tektronix_extended.cc -o \\\n\t\tsrecord/output/file/tektronix_extended.lo\n\n$(includedir)/srecord/output/file/tektronix_extended.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/tektronix_extended.h\n\t$(INSTALL_DATA) srecord/output/file/tektronix_extended.h $@\n\nsrecord/output/file/ti_tagged.lo srecord/output/file/ti_tagged.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/ti_tagged.cc \\\n\t\tsrecord/output/file/ti_tagged.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/ti_tagged.cc -o \\\n\t\tsrecord/output/file/ti_tagged.lo\n\n$(includedir)/srecord/output/file/ti_tagged.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/ti_tagged.h\n\t$(INSTALL_DATA) srecord/output/file/ti_tagged.h $@\n\nsrecord/output/file/ti_tagged_16.lo srecord/output/file/ti_tagged_16.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/ti_tagged_16.cc \\\n\t\tsrecord/output/file/ti_tagged_16.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/ti_tagged_16.cc -o \\\n\t\tsrecord/output/file/ti_tagged_16.lo\n\n$(includedir)/srecord/output/file/ti_tagged_16.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/ti_tagged_16.h\n\t$(INSTALL_DATA) srecord/output/file/ti_tagged_16.h $@\n\nsrecord/output/file/ti_txt.lo srecord/output/file/ti_txt.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/ti_txt.cc srecord/output/file/ti_txt.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/ti_txt.cc -o \\\n\t\tsrecord/output/file/ti_txt.lo\n\n$(includedir)/srecord/output/file/ti_txt.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/ti_txt.h\n\t$(INSTALL_DATA) srecord/output/file/ti_txt.h $@\n\nsrecord/output/file/trs80.lo srecord/output/file/trs80.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/trs80.cc srecord/output/file/trs80.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/trs80.cc -o srecord/output/file/trs80.lo\n\n$(includedir)/srecord/output/file/trs80.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/trs80.h\n\t$(INSTALL_DATA) srecord/output/file/trs80.h $@\n\nsrecord/output/file/vhdl.lo srecord/output/file/vhdl.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/interval.h \\\n\t\tsrecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/vhdl.cc srecord/output/file/vhdl.h \\\n\t\tsrecord/progname.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/vhdl.cc -o srecord/output/file/vhdl.lo\n\n$(includedir)/srecord/output/file/vhdl.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/vhdl.h\n\t$(INSTALL_DATA) srecord/output/file/vhdl.h $@\n\nsrecord/output/file/vmem.lo srecord/output/file/vmem.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/output.h \\\n\t\tsrecord/output/file.h srecord/output/file/vmem.cc \\\n\t\tsrecord/output/file/vmem.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/vmem.cc -o srecord/output/file/vmem.lo\n\n$(includedir)/srecord/output/file/vmem.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/vmem.h\n\t$(INSTALL_DATA) srecord/output/file/vmem.h $@\n\nsrecord/output/file/wilson.lo srecord/output/file/wilson.o: srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/output.h srecord/output/file.h \\\n\t\tsrecord/output/file/wilson.cc srecord/output/file/wilson.h \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/file/wilson.cc -o \\\n\t\tsrecord/output/file/wilson.lo\n\n$(includedir)/srecord/output/file/wilson.h: \\\n\t\t.mkdir.__includedir__srecord_output_file \\\n\t\tsrecord/output/file/wilson.h\n\t$(INSTALL_DATA) srecord/output/file/wilson.h $@\n\nsrecord/output/filter.lo srecord/output/filter.o: srecord/format_printf.h \\\n\t\tsrecord/output.h srecord/output/filter.cc \\\n\t\tsrecord/output/filter.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/filter.cc -o srecord/output/filter.lo\n\nsrecord/output/filter/reblock.lo srecord/output/filter/reblock.o: \\\n\t\tsrecord/endian.h srecord/format_printf.h srecord/output.h \\\n\t\tsrecord/output/filter.h srecord/output/filter/reblock.cc \\\n\t\tsrecord/output/filter/reblock.h srecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/output/filter/reblock.cc -o \\\n\t\tsrecord/output/filter/reblock.lo\n\nsrecord/pretty_size.lo srecord/pretty_size.o: srecord/pretty_size.cc \\\n\t\tsrecord/pretty_size.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/pretty_size.cc -o srecord/pretty_size.lo\n\nsrecord/progname.lo srecord/progname.o: srecord/progname.cc srecord/progname.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/progname.cc -o srecord/progname.lo\n\nsrecord/quit.lo srecord/quit.o: srecord/format_printf.h srecord/quit.cc \\\n\t\tsrecord/quit.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/quit.cc -o srecord/quit.lo\n\n$(includedir)/srecord/quit.h: .mkdir.__includedir__srecord srecord/quit.h\n\t$(INSTALL_DATA) srecord/quit.h $@\n\nsrecord/quit/exception.lo srecord/quit/exception.o: srecord/format_printf.h \\\n\t\tsrecord/quit.h srecord/quit/exception.cc \\\n\t\tsrecord/quit/exception.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/quit/exception.cc -o srecord/quit/exception.lo\n\n$(includedir)/srecord/quit/exception.h: .mkdir.__includedir__srecord_quit \\\n\t\tsrecord/quit/exception.h\n\t$(INSTALL_DATA) srecord/quit/exception.h $@\n\nsrecord/quit/normal.lo srecord/quit/normal.o: srecord/format_printf.h \\\n\t\tsrecord/progname.h srecord/quit.h srecord/quit/normal.cc \\\n\t\tsrecord/quit/normal.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/quit/normal.cc -o srecord/quit/normal.lo\n\n$(includedir)/srecord/quit/normal.h: .mkdir.__includedir__srecord_quit \\\n\t\tsrecord/quit/normal.h\n\t$(INSTALL_DATA) srecord/quit/normal.h $@\n\nsrecord/quit/prefix.lo srecord/quit/prefix.o: srecord/format_printf.h \\\n\t\tsrecord/quit.h srecord/quit/prefix.cc srecord/quit/prefix.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/quit/prefix.cc -o srecord/quit/prefix.lo\n\n$(includedir)/srecord/quit/prefix.h: .mkdir.__includedir__srecord_quit \\\n\t\tsrecord/quit/prefix.h\n\t$(INSTALL_DATA) srecord/quit/prefix.h $@\n\nsrecord/r250.lo srecord/r250.o: srecord/r250.cc srecord/r250.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/r250.cc -o srecord/r250.lo\n\nsrecord/record.lo srecord/record.o: srecord/endian.h srecord/record.cc \\\n\t\tsrecord/record.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/record.cc -o srecord/record.lo\n\n$(includedir)/srecord/record.h: .mkdir.__includedir__srecord srecord/record.h\n\t$(INSTALL_DATA) srecord/record.h $@\n\n$(includedir)/srecord/srecord.h: .mkdir.__includedir__srecord srecord/srecord.h\n\t$(INSTALL_DATA) srecord/srecord.h $@\n\nsrecord/stm32.lo srecord/stm32.o: srecord/stm32.cc srecord/stm32.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/stm32.cc -o srecord/stm32.lo\n\n$(includedir)/srecord/string.h: .mkdir.__includedir__srecord srecord/string.h\n\t$(INSTALL_DATA) srecord/string.h $@\n\nsrecord/string/quote_c.lo srecord/string/quote_c.o: srecord/string.h \\\n\t\tsrecord/string/quote_c.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/string/quote_c.cc -o srecord/string/quote_c.lo\n\nsrecord/string/url_decode.lo srecord/string/url_decode.o: srecord/string.h \\\n\t\tsrecord/string/url_decode.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/string/url_decode.cc -o srecord/string/url_decode.lo\n\nsrecord/string/url_encode.lo srecord/string/url_encode.o: srecord/string.h \\\n\t\tsrecord/string/url_encode.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/string/url_encode.cc -o srecord/string/url_encode.lo\n\nsrecord/versn_stamp.lo srecord/versn_stamp.o: srecord/progname.h \\\n\t\tsrecord/versn_stamp.cc srecord/versn_stamp.h\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/versn_stamp.cc -o srecord/versn_stamp.lo\n\nsrecord/vsnprintf.lo srecord/vsnprintf.o: srecord/config.messy.h \\\n\t\tsrecord/vsnprintf.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c srecord/vsnprintf.cc -o srecord/vsnprintf.lo\n\nt0001a: all test/00/t0001a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0001a.sh\n\nt0002a: all test/00/t0002a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0002a.sh\n\nt0003a: all test/00/t0003a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0003a.sh\n\nt0004a: all test/00/t0004a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0004a.sh\n\nt0005a: all test/00/t0005a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0005a.sh\n\nt0006a: all test/00/t0006a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0006a.sh\n\nt0007a: all test/00/t0007a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0007a.sh\n\nt0008a: all test/00/t0008a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0008a.sh\n\nt0009a: all test/00/t0009a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0009a.sh\n\nt0010a: all test/00/t0010a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0010a.sh\n\nt0011a: all test/00/t0011a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0011a.sh\n\nt0012a: all test/00/t0012a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0012a.sh\n\nt0013a: all test/00/t0013a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0013a.sh\n\nt0014a: all test/00/t0014a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0014a.sh\n\nt0015a: all test/00/t0015a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0015a.sh\n\nt0016a: all test/00/t0016a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0016a.sh\n\nt0017a: all test/00/t0017a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0017a.sh\n\nt0018a: all test/00/t0018a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0018a.sh\n\nt0019a: all test/00/t0019a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0019a.sh\n\nt0020a: all test/00/t0020a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0020a.sh\n\nt0021a: all test/00/t0021a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0021a.sh\n\nt0022a: all test/00/t0022a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0022a.sh\n\nt0023a: all test/00/t0023a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0023a.sh\n\nt0024a: all test/00/t0024a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0024a.sh\n\nt0025a: all test/00/t0025a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0025a.sh\n\nt0026a: all test/00/t0026a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0026a.sh\n\nt0027a: all test/00/t0027a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0027a.sh\n\nt0028a: all test/00/t0028a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0028a.sh\n\nt0029a: all test/00/t0029a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0029a.sh\n\nt0030a: all test/00/t0030a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0030a.sh\n\nt0031a: all test/00/t0031a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0031a.sh\n\nt0032a: all test/00/t0032a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0032a.sh\n\nt0033a: all test/00/t0033a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0033a.sh\n\nt0034a: all test/00/t0034a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0034a.sh\n\nt0035a: all test/00/t0035a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0035a.sh\n\nt0036a: all test/00/t0036a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0036a.sh\n\nt0037a: all test/00/t0037a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0037a.sh\n\nt0037b: all test/00/t0037b.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0037b.sh\n\nt0038a: all test/00/t0038a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0038a.sh\n\nt0039a: all test/00/t0039a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0039a.sh\n\nt0040a: all test/00/t0040a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0040a.sh\n\nt0050a: all test/00/t0050a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0050a.sh\n\nt0051a: all test/00/t0051a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0051a.sh\n\nt0052a: all test/00/t0052a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0052a.sh\n\nt0053a: all test/00/t0053a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0053a.sh\n\nt0055a: all test/00/t0055a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0055a.sh\n\nt0056a: all test/00/t0056a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0056a.sh\n\nt0057a: all test/00/t0057a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0057a.sh\n\nt0058a: all test/00/t0058a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0058a.sh\n\nt0059a: all test/00/t0059a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0059a.sh\n\nt0060a: all test/00/t0060a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0060a.sh\n\nt0061a: all test/00/t0061a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0061a.sh\n\nt0062a: all test/00/t0062a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0062a.sh\n\nt0063a: all test/00/t0063a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0063a.sh\n\nt0065a: all test/00/t0065a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0065a.sh\n\nt0066a: all test/00/t0066a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0066a.sh\n\nt0067a: all test/00/t0067a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0067a.sh\n\nt0068a: all test/00/t0068a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0068a.sh\n\nt0069a: all test/00/t0069a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0069a.sh\n\nt0070a: all test/00/t0070a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0070a.sh\n\nt0071a: all test/00/t0071a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0071a.sh\n\nt0072a: all test/00/t0072a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0072a.sh\n\nt0073a: all test/00/t0073a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0073a.sh\n\nt0075a: all test/00/t0075a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0075a.sh\n\nt0076a: all test/00/t0076a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0076a.sh\n\nt0077a: all test/00/t0077a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0077a.sh\n\nt0078a: all test/00/t0078a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0078a.sh\n\nt0079a: all test/00/t0079a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0079a.sh\n\nt0080a: all test/00/t0080a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0080a.sh\n\nt0081a: all test/00/t0081a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0081a.sh\n\nt0082a: all test/00/t0082a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0082a.sh\n\nt0083a: all test/00/t0083a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0083a.sh\n\nt0085a: all test/00/t0085a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0085a.sh\n\nt0086a: all test/00/t0086a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0086a.sh\n\nt0087a: all test/00/t0087a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0087a.sh\n\nt0088a: all test/00/t0088a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0088a.sh\n\nt0089a: all test/00/t0089a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0089a.sh\n\nt0090a: all test/00/t0090a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0090a.sh\n\nt0091a: all test/00/t0091a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0091a.sh\n\nt0092a: all test/00/t0092a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0092a.sh\n\nt0093a: all test/00/t0093a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0093a.sh\n\nt0095a: all test/00/t0095a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0095a.sh\n\nt0096a: all test/00/t0096a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0096a.sh\n\nt0097a: all test/00/t0097a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0097a.sh\n\nt0098a: all test/00/t0098a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0098a.sh\n\nt0099a: all test/00/t0099a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/00/t0099a.sh\n\nt0100a: all test/01/t0100a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0100a.sh\n\nt0101a: all test/01/t0101a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0101a.sh\n\nt0102a: all test/01/t0102a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0102a.sh\n\nt0103a: all test/01/t0103a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0103a.sh\n\nt0105a: all test/01/t0105a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0105a.sh\n\nt0106a: all test/01/t0106a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0106a.sh\n\nt0107a: all test/01/t0107a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0107a.sh\n\nt0108a: all test/01/t0108a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0108a.sh\n\nt0109a: all test/01/t0109a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0109a.sh\n\nt0110a: all test/01/t0110a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0110a.sh\n\nt0111a: all test/01/t0111a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0111a.sh\n\nt0112a: all test/01/t0112a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0112a.sh\n\nt0113a: all test/01/t0113a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0113a.sh\n\nt0115a: all test/01/t0115a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0115a.sh\n\nt0116a: all test/01/t0116a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0116a.sh\n\nt0117a: all test/01/t0117a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0117a.sh\n\nt0118a: all test/01/t0118a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0118a.sh\n\nt0119a: all test/01/t0119a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0119a.sh\n\nt0120a: all test/01/t0120a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0120a.sh\n\nt0121a: all test/01/t0121a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0121a.sh\n\nt0122a: all test/01/t0122a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0122a.sh\n\nt0123a: all test/01/t0123a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0123a.sh\n\nt0125a: all test/01/t0125a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0125a.sh\n\nt0126a: all test/01/t0126a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0126a.sh\n\nt0127a: all test/01/t0127a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0127a.sh\n\nt0128a: all test/01/t0128a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0128a.sh\n\nt0129a: all test/01/t0129a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0129a.sh\n\nt0130a: all test/01/t0130a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0130a.sh\n\nt0131a: all test/01/t0131a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0131a.sh\n\nt0132a: all test/01/t0132a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0132a.sh\n\nt0133a: all test/01/t0133a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0133a.sh\n\nt0135a: all test/01/t0135a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0135a.sh\n\nt0136a: all test/01/t0136a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0136a.sh\n\nt0137a: all test/01/t0137a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0137a.sh\n\nt0138a: all test/01/t0138a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0138a.sh\n\nt0139a: all test/01/t0139a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0139a.sh\n\nt0150a: all test/01/t0150a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0150a.sh\n\nt0151a: all test/01/t0151a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0151a.sh\n\nt0152a: all test/01/t0152a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0152a.sh\n\nt0153a: all test/01/t0153a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0153a.sh\n\nt0155a: all test/01/t0155a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0155a.sh\n\nt0156a: all test/01/t0156a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0156a.sh\n\nt0157a: all test/01/t0157a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0157a.sh\n\nt0158a: all test/01/t0158a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0158a.sh\n\nt0159a: all test/01/t0159a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0159a.sh\n\nt0160a: all test/01/t0160a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0160a.sh\n\nt0161a: all test/01/t0161a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0161a.sh\n\nt0162a: all test/01/t0162a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0162a.sh\n\nt0163a: all test/01/t0163a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0163a.sh\n\nt0165a: all test/01/t0165a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0165a.sh\n\nt0166a: all test/01/t0166a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0166a.sh\n\nt0167a: all test/01/t0167a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0167a.sh\n\nt0168a: all test/01/t0168a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0168a.sh\n\nt0169a: all test/01/t0169a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0169a.sh\n\nt0170a: all test/01/t0170a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0170a.sh\n\nt0171a: all test/01/t0171a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0171a.sh\n\nt0172a: all test/01/t0172a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0172a.sh\n\nt0173a: all test/01/t0173a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0173a.sh\n\nt0175a: all test/01/t0175a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0175a.sh\n\nt0176a: all test/01/t0176a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0176a.sh\n\nt0177a: all test/01/t0177a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0177a.sh\n\nt0178a: all test/01/t0178a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0178a.sh\n\nt0179a: all test/01/t0179a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0179a.sh\n\nt0180a: all test/01/t0180a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0180a.sh\n\nt0181a: all test/01/t0181a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0181a.sh\n\nt0182a: all test/01/t0182a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0182a.sh\n\nt0183a: all test/01/t0183a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0183a.sh\n\nt0185a: all test/01/t0185a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0185a.sh\n\nt0186a: all test/01/t0186a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0186a.sh\n\nt0187a: all test/01/t0187a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0187a.sh\n\nt0188a: all test/01/t0188a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0188a.sh\n\nt0189a: all test/01/t0189a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0189a.sh\n\nt0191a: all test/01/t0191a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0191a.sh\n\nt0192a: all test/01/t0192a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0192a.sh\n\nt0193a: all test/01/t0193a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0193a.sh\n\nt0195a: all test/01/t0195a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0195a.sh\n\nt0196a: all test/01/t0196a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0196a.sh\n\nt0197a: all test/01/t0197a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0197a.sh\n\nt0198a: all test/01/t0198a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0198a.sh\n\nt0199a: all test/01/t0199a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/01/t0199a.sh\n\nt0200a: all test/02/t0200a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0200a.sh\n\nt0201a: all test/02/t0201a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0201a.sh\n\nt0202a: all test/02/t0202a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0202a.sh\n\nt0203a: all test/02/t0203a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0203a.sh\n\nt0205a: all test/02/t0205a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0205a.sh\n\nt0206a: all test/02/t0206a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0206a.sh\n\nt0207a: all test/02/t0207a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0207a.sh\n\nt0209a: all test/02/t0209a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0209a.sh\n\nt0210a: all test/02/t0210a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0210a.sh\n\nt0211a: all test/02/t0211a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0211a.sh\n\nt0212a: all test/02/t0212a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0212a.sh\n\nt0213a: all test/02/t0213a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0213a.sh\n\nt0215a: all test/02/t0215a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0215a.sh\n\nt0216a: all test/02/t0216a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0216a.sh\n\nt0217a: all test/02/t0217a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0217a.sh\n\nt0218a: all test/02/t0218a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0218a.sh\n\nt0219a: all test/02/t0219a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0219a.sh\n\nt0220a: all test/02/t0220a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0220a.sh\n\nt0221a: all test/02/t0221a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0221a.sh\n\nt0222a: all test/02/t0222a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0222a.sh\n\nt0223a: all test/02/t0223a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0223a.sh\n\nt0225a: all test/02/t0225a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0225a.sh\n\nt0227a: all test/02/t0227a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0227a.sh\n\nt0228a: all test/02/t0228a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0228a.sh\n\nt0229a: all test/02/t0229a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0229a.sh\n\nt0230a: all test/02/t0230a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0230a.sh\n\nt0231a: all test/02/t0231a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0231a.sh\n\nt0232a: all test/02/t0232a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0232a.sh\n\nt0233a: all test/02/t0233a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0233a.sh\n\nt0235a: all test/02/t0235a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0235a.sh\n\nt0236a: all test/02/t0236a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0236a.sh\n\nt0237a: all test/02/t0237a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0237a.sh\n\nt0238a: all test/02/t0238a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0238a.sh\n\nt0239a: all test/02/t0239a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0239a.sh\n\nt0250a: all test/02/t0250a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0250a.sh\n\nt0251a: all test/02/t0251a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0251a.sh\n\nt0253a: all test/02/t0253a.sh\n\tPATH=`pwd`/bin:$$PATH $(SH) test/02/t0253a.sh\n\ntest/arglex_ambiguous/main.lo test/arglex_ambiguous/main.o: srecord/arglex.h \\\n\t\tsrecord/arglex/tool.h srecord/defcon.h srecord/endian.h \\\n\t\tsrecord/format_printf.h srecord/input.h srecord/output.h \\\n\t\ttest/arglex_ambiguous/main.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c test/arglex_ambiguous/main.cc -o \\\n\t\ttest/arglex_ambiguous/main.lo\n\ntest/crc16/main.lo test/crc16/main.o: srecord/bitrev.h srecord/crc16.h \\\n\t\tsrecord/format_printf.h srecord/progname.h srecord/quit.h \\\n\t\tsrecord/versn_stamp.h test/crc16/main.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c test/crc16/main.cc -o test/crc16/main.lo\n\ntest/fletcher16/main.lo test/fletcher16/main.o: srecord/endian.h \\\n\t\tsrecord/fletcher16.h test/fletcher16/main.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c test/fletcher16/main.cc -o test/fletcher16/main.lo\n\ntest/gecos/main.lo test/gecos/main.o: srecord/arglex.h srecord/format_printf.h \\\n\t\ttest/gecos/main.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c test/gecos/main.cc -o test/gecos/main.lo\n\ntest/hyphen/main.lo test/hyphen/main.o: srecord/format_printf.h \\\n\t\tsrecord/progname.h srecord/quit.h srecord/versn_stamp.h \\\n\t\ttest/hyphen/main.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c test/hyphen/main.cc -o test/hyphen/main.lo\n\ntest/url_decode/main.lo test/url_decode/main.o: srecord/progname.h \\\n\t\tsrecord/string.h srecord/versn_stamp.h test/url_decode/main.cc\n\t$(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. \\\n\t\t-c test/url_decode/main.cc -o test/url_decode/main.lo\n\n#\n# The srecord/libsrecord.la library.\n#\nsrecord_obj = srecord/adler16.lo srecord/adler32.lo srecord/arglex.lo \\\n\t\tsrecord/arglex/abbreviate.lo srecord/arglex/test_ambiguous.lo \\\n\t\tsrecord/arglex/tool.lo srecord/arglex/tool/get_interval.lo \\\n\t\tsrecord/arglex/tool/get_interval_small.lo \\\n\t\tsrecord/arglex/tool/get_number.lo \\\n\t\tsrecord/arglex/tool/get_string.lo srecord/arglex/tool/input.lo \\\n\t\tsrecord/arglex/tool/output.lo srecord/bitrev.lo \\\n\t\tsrecord/crc16.lo srecord/crc32.lo srecord/defcon.lo \\\n\t\tsrecord/endian.lo srecord/endian/decode_word.lo \\\n\t\tsrecord/fletcher16.lo srecord/fletcher32.lo srecord/input.lo \\\n\t\tsrecord/input/catenate.lo srecord/input/file.lo \\\n\t\tsrecord/input/file/aomf.lo srecord/input/file/ascii_hex.lo \\\n\t\tsrecord/input/file/atmel_generic.lo \\\n\t\tsrecord/input/file/binary.lo srecord/input/file/brecord.lo \\\n\t\tsrecord/input/file/cosmac.lo srecord/input/file/dec_binary.lo \\\n\t\tsrecord/input/file/emon52.lo srecord/input/file/fairchild.lo \\\n\t\tsrecord/input/file/fastload.lo \\\n\t\tsrecord/input/file/formatted_binary.lo \\\n\t\tsrecord/input/file/four_packed_code.lo \\\n\t\tsrecord/input/file/guess.lo srecord/input/file/hexdump.lo \\\n\t\tsrecord/input/file/idt.lo srecord/input/file/intel.lo \\\n\t\tsrecord/input/file/intel16.lo srecord/input/file/logisim.lo \\\n\t\tsrecord/input/file/mif.lo srecord/input/file/mips_flash.lo \\\n\t\tsrecord/input/file/mos_tech.lo srecord/input/file/motorola.lo \\\n\t\tsrecord/input/file/msbin.lo srecord/input/file/needham.lo \\\n\t\tsrecord/input/file/os65v.lo srecord/input/file/ppb.lo \\\n\t\tsrecord/input/file/ppx.lo srecord/input/file/signetics.lo \\\n\t\tsrecord/input/file/spasm.lo srecord/input/file/spectrum.lo \\\n\t\tsrecord/input/file/stewie.lo srecord/input/file/tektronix.lo \\\n\t\tsrecord/input/file/tektronix_extended.lo \\\n\t\tsrecord/input/file/ti_tagged.lo \\\n\t\tsrecord/input/file/ti_tagged_16.lo \\\n\t\tsrecord/input/file/ti_txt.lo srecord/input/file/trs80.lo \\\n\t\tsrecord/input/file/vmem.lo srecord/input/file/wilson.lo \\\n\t\tsrecord/input/filter.lo srecord/input/filter/and.lo \\\n\t\tsrecord/input/filter/bitrev.lo \\\n\t\tsrecord/input/filter/byte_swap.lo \\\n\t\tsrecord/input/filter/checksum.lo \\\n\t\tsrecord/input/filter/checksum/bitnot.lo \\\n\t\tsrecord/input/filter/checksum/negative.lo \\\n\t\tsrecord/input/filter/checksum/positive.lo \\\n\t\tsrecord/input/filter/crop.lo srecord/input/filter/fill.lo \\\n\t\tsrecord/input/filter/interval.lo \\\n\t\tsrecord/input/filter/interval/length.lo \\\n\t\tsrecord/input/filter/interval/maximum.lo \\\n\t\tsrecord/input/filter/interval/minimum.lo \\\n\t\tsrecord/input/filter/message.lo \\\n\t\tsrecord/input/filter/message/adler16.lo \\\n\t\tsrecord/input/filter/message/adler32.lo \\\n\t\tsrecord/input/filter/message/crc16.lo \\\n\t\tsrecord/input/filter/message/crc32.lo \\\n\t\tsrecord/input/filter/message/fletcher16.lo \\\n\t\tsrecord/input/filter/message/fletcher32.lo \\\n\t\tsrecord/input/filter/message/gcrypt.lo \\\n\t\tsrecord/input/filter/message/stm32.lo \\\n\t\tsrecord/input/filter/not.lo srecord/input/filter/offset.lo \\\n\t\tsrecord/input/filter/or.lo srecord/input/filter/random_fill.lo \\\n\t\tsrecord/input/filter/sequence.lo srecord/input/filter/split.lo \\\n\t\tsrecord/input/filter/unfill.lo srecord/input/filter/unsplit.lo \\\n\t\tsrecord/input/filter/xor.lo srecord/input/generator.lo \\\n\t\tsrecord/input/generator/constant.lo \\\n\t\tsrecord/input/generator/random.lo \\\n\t\tsrecord/input/generator/repeat.lo srecord/input/interval.lo \\\n\t\tsrecord/interval.lo srecord/interval/coverage.lo \\\n\t\tsrecord/interval/flatten.lo srecord/memory.lo \\\n\t\tsrecord/memory/chunk.lo srecord/memory/walker.lo \\\n\t\tsrecord/memory/walker/adler16.lo \\\n\t\tsrecord/memory/walker/adler32.lo \\\n\t\tsrecord/memory/walker/alignment.lo \\\n\t\tsrecord/memory/walker/compare.lo \\\n\t\tsrecord/memory/walker/continuity.lo \\\n\t\tsrecord/memory/walker/crc16.lo srecord/memory/walker/crc32.lo \\\n\t\tsrecord/memory/walker/fletcher16.lo \\\n\t\tsrecord/memory/walker/fletcher32.lo \\\n\t\tsrecord/memory/walker/gcrypt.lo srecord/memory/walker/stm32.lo \\\n\t\tsrecord/memory/walker/writer.lo srecord/output.lo \\\n\t\tsrecord/output/file.lo srecord/output/file/aomf.lo \\\n\t\tsrecord/output/file/ascii_hex.lo srecord/output/file/asm.lo \\\n\t\tsrecord/output/file/atmel_generic.lo \\\n\t\tsrecord/output/file/basic.lo srecord/output/file/binary.lo \\\n\t\tsrecord/output/file/brecord.lo srecord/output/file/c.lo \\\n\t\tsrecord/output/file/coe.lo srecord/output/file/cosmac.lo \\\n\t\tsrecord/output/file/dec_binary.lo \\\n\t\tsrecord/output/file/emon52.lo srecord/output/file/fairchild.lo \\\n\t\tsrecord/output/file/fastload.lo \\\n\t\tsrecord/output/file/formatted_binary.lo \\\n\t\tsrecord/output/file/forth.lo \\\n\t\tsrecord/output/file/four_packed_code.lo \\\n\t\tsrecord/output/file/hexdump.lo srecord/output/file/idt.lo \\\n\t\tsrecord/output/file/intel.lo srecord/output/file/intel16.lo \\\n\t\tsrecord/output/file/line_termination.lo \\\n\t\tsrecord/output/file/logisim.lo srecord/output/file/mem.lo \\\n\t\tsrecord/output/file/mif.lo srecord/output/file/mips_flash.lo \\\n\t\tsrecord/output/file/mos_tech.lo \\\n\t\tsrecord/output/file/motorola.lo srecord/output/file/msbin.lo \\\n\t\tsrecord/output/file/needham.lo srecord/output/file/os65v.lo \\\n\t\tsrecord/output/file/ppb.lo srecord/output/file/ppx.lo \\\n\t\tsrecord/output/file/signetics.lo srecord/output/file/spasm.lo \\\n\t\tsrecord/output/file/spectrum.lo srecord/output/file/stewie.lo \\\n\t\tsrecord/output/file/tektronix.lo \\\n\t\tsrecord/output/file/tektronix_extended.lo \\\n\t\tsrecord/output/file/ti_tagged.lo \\\n\t\tsrecord/output/file/ti_tagged_16.lo \\\n\t\tsrecord/output/file/ti_txt.lo srecord/output/file/trs80.lo \\\n\t\tsrecord/output/file/vhdl.lo srecord/output/file/vmem.lo \\\n\t\tsrecord/output/file/wilson.lo srecord/output/filter.lo \\\n\t\tsrecord/output/filter/reblock.lo srecord/pretty_size.lo \\\n\t\tsrecord/progname.lo srecord/quit.lo srecord/quit/exception.lo \\\n\t\tsrecord/quit/normal.lo srecord/quit/prefix.lo srecord/r250.lo \\\n\t\tsrecord/record.lo srecord/stm32.lo srecord/string/quote_c.lo \\\n\t\tsrecord/string/url_decode.lo srecord/string/url_encode.lo \\\n\t\tsrecord/versn_stamp.lo srecord/vsnprintf.lo\n\nsrecord/libsrecord.la: $(srecord_obj)\n\trm -f $@\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) \\\n\t\t$(LDFLAGS) -o $@ $(srecord_obj) $(LIBS) -rpath $(libdir) \\\n\t\t-version-info 0:0:0\n\n#\n# The install of the *.la file automatically causes \"$(LIBTOOL) --mode=install\"\n# to install the *.a and *.so* files as well, which is why you don't see them\n# explicitly mentioned here.\n#\n$(libdir)/libsrecord.la: .mkdir.__libdir_ srecord/libsrecord.la\n\t$(LIBTOOL) --mode=install $(INSTALL_DATA) srecord/libsrecord.la $@\n\n.mkdir.__bindir_:\n\t-$(INSTALL_DIR) $(bindir)\n\t@-test -d $(bindir) && touch $@\n\t@sleep 1\n\n.mkdir.__datarootdir_:\n\t-$(INSTALL_DIR) $(datarootdir)\n\t@-test -d $(datarootdir) && touch $@\n\t@sleep 1\n\n.mkdir.__datarootdir__doc: .mkdir.__datarootdir_\n\t-$(INSTALL_DIR) $(datarootdir)/doc\n\t@-test -d $(datarootdir)/doc && touch $@\n\t@sleep 1\n\n.mkdir.__datarootdir__doc_srecord: .mkdir.__datarootdir__doc\n\t-$(INSTALL_DIR) $(datarootdir)/doc/srecord\n\t@-test -d $(datarootdir)/doc/srecord && touch $@\n\t@sleep 1\n\n.mkdir.__includedir_:\n\t-$(INSTALL_DIR) $(includedir)\n\t@-test -d $(includedir) && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord: .mkdir.__includedir_\n\t-$(INSTALL_DIR) $(includedir)/srecord\n\t@-test -d $(includedir)/srecord && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_input: .mkdir.__includedir__srecord\n\t-$(INSTALL_DIR) $(includedir)/srecord/input\n\t@-test -d $(includedir)/srecord/input && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_input_file: .mkdir.__includedir__srecord_input\n\t-$(INSTALL_DIR) $(includedir)/srecord/input/file\n\t@-test -d $(includedir)/srecord/input/file && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_input_filter: .mkdir.__includedir__srecord_input\n\t-$(INSTALL_DIR) $(includedir)/srecord/input/filter\n\t@-test -d $(includedir)/srecord/input/filter && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_input_filter_checksum: \\\n\t\t.mkdir.__includedir__srecord_input_filter\n\t-$(INSTALL_DIR) $(includedir)/srecord/input/filter/checksum\n\t@-test -d $(includedir)/srecord/input/filter/checksum && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_input_filter_interval: \\\n\t\t.mkdir.__includedir__srecord_input_filter\n\t-$(INSTALL_DIR) $(includedir)/srecord/input/filter/interval\n\t@-test -d $(includedir)/srecord/input/filter/interval && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_input_filter_message: \\\n\t\t.mkdir.__includedir__srecord_input_filter\n\t-$(INSTALL_DIR) $(includedir)/srecord/input/filter/message\n\t@-test -d $(includedir)/srecord/input/filter/message && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_input_generator: .mkdir.__includedir__srecord_input\n\t-$(INSTALL_DIR) $(includedir)/srecord/input/generator\n\t@-test -d $(includedir)/srecord/input/generator && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_memory: .mkdir.__includedir__srecord\n\t-$(INSTALL_DIR) $(includedir)/srecord/memory\n\t@-test -d $(includedir)/srecord/memory && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_memory_walker: .mkdir.__includedir__srecord_memory\n\t-$(INSTALL_DIR) $(includedir)/srecord/memory/walker\n\t@-test -d $(includedir)/srecord/memory/walker && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_output: .mkdir.__includedir__srecord\n\t-$(INSTALL_DIR) $(includedir)/srecord/output\n\t@-test -d $(includedir)/srecord/output && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_output_file: .mkdir.__includedir__srecord_output\n\t-$(INSTALL_DIR) $(includedir)/srecord/output/file\n\t@-test -d $(includedir)/srecord/output/file && touch $@\n\t@sleep 1\n\n.mkdir.__includedir__srecord_quit: .mkdir.__includedir__srecord\n\t-$(INSTALL_DIR) $(includedir)/srecord/quit\n\t@-test -d $(includedir)/srecord/quit && touch $@\n\t@sleep 1\n\n.mkdir.__libdir_:\n\t-$(INSTALL_DIR) $(libdir)\n\t@-test -d $(libdir) && touch $@\n\t@sleep 1\n\n.mkdir.__libdir__pkgconfig: .mkdir.__libdir_\n\t-$(INSTALL_DIR) $(libdir)/pkgconfig\n\t@-test -d $(libdir)/pkgconfig && touch $@\n\t@sleep 1\n\n.mkdir.__mandir_:\n\t-$(INSTALL_DIR) $(mandir)\n\t@-test -d $(mandir) && touch $@\n\t@sleep 1\n\n.mkdir.__mandir__man1: .mkdir.__mandir_\n\t-$(INSTALL_DIR) $(mandir)/man1\n\t@-test -d $(mandir)/man1 && touch $@\n\t@sleep 1\n\n.mkdir.__mandir__man3: .mkdir.__mandir_\n\t-$(INSTALL_DIR) $(mandir)/man3\n\t@-test -d $(mandir)/man3 && touch $@\n\t@sleep 1\n\n.mkdir.__mandir__man5: .mkdir.__mandir_\n\t-$(INSTALL_DIR) $(mandir)/man5\n\t@-test -d $(mandir)/man5 && touch $@\n\t@sleep 1\n\n#\n# The srec_cat program.\n#\nsrec_cat_obj = srec_cat/arglex3.lo srec_cat/main.lo\n\nbin/srec_cat: $(srec_cat_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(srec_cat_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\n$(bindir)/srec_cat: .mkdir.__bindir_ bin/srec_cat\n\t$(LIBTOOL) --mode=install $(INSTALL_PROGRAM) bin/srec_cat $@\n\n#\n# The srec_cmp program.\n#\nsrec_cmp_obj = srec_cmp/main.lo\n\nbin/srec_cmp: $(srec_cmp_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(srec_cmp_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\n$(bindir)/srec_cmp: .mkdir.__bindir_ bin/srec_cmp\n\t$(LIBTOOL) --mode=install $(INSTALL_PROGRAM) bin/srec_cmp $@\n\n#\n# The srec_info program.\n#\nsrec_info_obj = srec_info/main.lo\n\nbin/srec_info: $(srec_info_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(srec_info_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\n$(bindir)/srec_info: .mkdir.__bindir_ bin/srec_info\n\t$(LIBTOOL) --mode=install $(INSTALL_PROGRAM) bin/srec_info $@\n\n#\n# The test_arglex_ambiguous program.\n#\ntest_arglex_ambiguous_obj = test/arglex_ambiguous/main.lo\n\nbin/test_arglex_ambiguous: $(test_arglex_ambiguous_obj) .bin \\\n\t\tsrecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(test_arglex_ambiguous_obj) srecord/libsrecord.la $(LDFLAGS) \\\n\t\t$(LIBS)\n\n#\n# The test_crc16 program.\n#\ntest_crc16_obj = test/crc16/main.lo\n\nbin/test_crc16: $(test_crc16_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(test_crc16_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\n#\n# The test_fletcher16 program.\n#\ntest_fletcher16_obj = test/fletcher16/main.lo\n\nbin/test_fletcher16: $(test_fletcher16_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(test_fletcher16_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\n#\n# The test_gecos program.\n#\ntest_gecos_obj = test/gecos/main.lo\n\nbin/test_gecos: $(test_gecos_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(test_gecos_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\n#\n# The test_hyphen program.\n#\ntest_hyphen_obj = test/hyphen/main.lo\n\nbin/test_hyphen: $(test_hyphen_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(test_hyphen_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\n#\n# The test_url_decode program.\n#\ntest_url_decode_obj = test/url_decode/main.lo\n\nbin/test_url_decode: $(test_url_decode_obj) .bin srecord/libsrecord.la\n\t$(LIBTOOL) --mode=link --tag=CXX $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ \\\n\t\t$(test_url_decode_obj) srecord/libsrecord.la $(LDFLAGS) $(LIBS)\n\nall: all-bin all-doc\n\nall-bin: bin/srec_cat bin/srec_cmp bin/srec_info bin/test_arglex_ambiguous \\\n\t\tbin/test_crc16 bin/test_fletcher16 bin/test_gecos \\\n\t\tbin/test_hyphen bin/test_prelude bin/test_url_decode\n\nall-doc: etc/BUILDING.pdf etc/README.pdf etc/change_log.pdf etc/reference.pdf \\\n\t\tman/cat1/srec_cat.1 man/cat1/srec_cmp.1 \\\n\t\tman/cat1/srec_examples.1 man/cat1/srec_info.1 \\\n\t\tman/cat1/srec_input.1 man/cat1/srec_license.1 \\\n\t\tman/cat3/srecord.3 man/cat3/srecord_license.3 \\\n\t\tman/cat5/srec_aomf.5 man/cat5/srec_ascii_hex.5 \\\n\t\tman/cat5/srec_atmel_generic.5 man/cat5/srec_binary.5 \\\n\t\tman/cat5/srec_brecord.5 man/cat5/srec_coe.5 \\\n\t\tman/cat5/srec_cosmac.5 man/cat5/srec_dec_binary.5 \\\n\t\tman/cat5/srec_emon52.5 man/cat5/srec_fairchild.5 \\\n\t\tman/cat5/srec_fastload.5 man/cat5/srec_formatted_binary.5 \\\n\t\tman/cat5/srec_forth.5 man/cat5/srec_fpc.5 man/cat5/srec_idt.5 \\\n\t\tman/cat5/srec_intel.5 man/cat5/srec_intel16.5 \\\n\t\tman/cat5/srec_logisim.5 man/cat5/srec_mem.5 \\\n\t\tman/cat5/srec_mif.5 man/cat5/srec_mips_flash.5 \\\n\t\tman/cat5/srec_mos_tech.5 man/cat5/srec_motorola.5 \\\n\t\tman/cat5/srec_msbin.5 man/cat5/srec_needham.5 \\\n\t\tman/cat5/srec_os65v.5 man/cat5/srec_ppb.5 man/cat5/srec_ppx.5 \\\n\t\tman/cat5/srec_signetics.5 man/cat5/srec_spasm.5 \\\n\t\tman/cat5/srec_spectrum.5 man/cat5/srec_stewie.5 \\\n\t\tman/cat5/srec_tektronix.5 man/cat5/srec_tektronix_extended.5 \\\n\t\tman/cat5/srec_ti_tagged.5 man/cat5/srec_ti_tagged_16.5 \\\n\t\tman/cat5/srec_ti_txt.5 man/cat5/srec_trs80.5 \\\n\t\tman/cat5/srec_vmem.5 man/cat5/srec_wilson.5\n\n.bin:\n\t-mkdir bin\n\t-chmod 0755 bin\n\t@-test -d bin && touch $@\n\t@sleep 1\n\ncheck: sure\n\ntest_files = t0001a t0002a t0003a t0004a t0005a t0006a t0007a t0008a t0009a \\\n\t\tt0010a t0011a t0012a t0013a t0014a t0015a t0016a t0017a t0018a \\\n\t\tt0019a t0020a t0021a t0022a t0023a t0024a t0025a t0026a t0027a \\\n\t\tt0028a t0029a t0030a t0031a t0032a t0033a t0034a t0035a t0036a \\\n\t\tt0037a t0037b t0038a t0039a t0040a t0050a t0051a t0052a t0053a \\\n\t\tt0055a t0056a t0057a t0058a t0059a t0060a t0061a t0062a t0063a \\\n\t\tt0065a t0066a t0067a t0068a t0069a t0070a t0071a t0072a t0073a \\\n\t\tt0075a t0076a t0077a t0078a t0079a t0080a t0081a t0082a t0083a \\\n\t\tt0085a t0086a t0087a t0088a t0089a t0090a t0091a t0092a t0093a \\\n\t\tt0095a t0096a t0097a t0098a t0099a t0100a t0101a t0102a t0103a \\\n\t\tt0105a t0106a t0107a t0108a t0109a t0110a t0111a t0112a t0113a \\\n\t\tt0115a t0116a t0117a t0118a t0119a t0120a t0121a t0122a t0123a \\\n\t\tt0125a t0126a t0127a t0128a t0129a t0130a t0131a t0132a t0133a \\\n\t\tt0135a t0136a t0137a t0138a t0139a t0150a t0151a t0152a t0153a \\\n\t\tt0155a t0156a t0157a t0158a t0159a t0160a t0161a t0162a t0163a \\\n\t\tt0165a t0166a t0167a t0168a t0169a t0170a t0171a t0172a t0173a \\\n\t\tt0175a t0176a t0177a t0178a t0179a t0180a t0181a t0182a t0183a \\\n\t\tt0185a t0186a t0187a t0188a t0189a t0191a t0192a t0193a t0195a \\\n\t\tt0196a t0197a t0198a t0199a t0200a t0201a t0202a t0203a t0205a \\\n\t\tt0206a t0207a t0209a t0210a t0211a t0212a t0213a t0215a t0216a \\\n\t\tt0217a t0218a t0219a t0220a t0221a t0222a t0223a t0225a t0227a \\\n\t\tt0228a t0229a t0230a t0231a t0232a t0233a t0235a t0236a t0237a \\\n\t\tt0238a t0239a t0250a t0251a t0253a\n\nsure: $(test_files)\n\t@echo Passed All Tests\n\nclean: clean-bin clean-doc clean-misc clean-obj\n\nclean-bin:\n\trm -f bin/srec_cat bin/srec_cmp bin/srec_info bin/test_arglex_ambiguous\n\trm -f bin/test_crc16 bin/test_fletcher16 bin/test_gecos bin/test_hyphen\n\trm -f bin/test_prelude bin/test_url_decode\n\nclean-doc:\n\trm -f etc/BUILDING.pdf etc/README.pdf etc/change_log.pdf\n\trm -f etc/reference.pdf man/cat1/srec_cat.1 man/cat1/srec_cmp.1\n\trm -f man/cat1/srec_examples.1 man/cat1/srec_info.1\n\trm -f man/cat1/srec_input.1 man/cat1/srec_license.1 man/cat3/srecord.3\n\trm -f man/cat3/srecord_license.3 man/cat5/srec_aomf.5\n\trm -f man/cat5/srec_ascii_hex.5 man/cat5/srec_atmel_generic.5\n\trm -f man/cat5/srec_binary.5 man/cat5/srec_brecord.5 man/cat5/srec_coe.5\n\trm -f man/cat5/srec_cosmac.5 man/cat5/srec_dec_binary.5\n\trm -f man/cat5/srec_emon52.5 man/cat5/srec_fairchild.5\n\trm -f man/cat5/srec_fastload.5 man/cat5/srec_formatted_binary.5\n\trm -f man/cat5/srec_forth.5 man/cat5/srec_fpc.5 man/cat5/srec_idt.5\n\trm -f man/cat5/srec_intel.5 man/cat5/srec_intel16.5\n\trm -f man/cat5/srec_logisim.5 man/cat5/srec_mem.5 man/cat5/srec_mif.5\n\trm -f man/cat5/srec_mips_flash.5 man/cat5/srec_mos_tech.5\n\trm -f man/cat5/srec_motorola.5 man/cat5/srec_msbin.5\n\trm -f man/cat5/srec_needham.5 man/cat5/srec_os65v.5 man/cat5/srec_ppb.5\n\trm -f man/cat5/srec_ppx.5 man/cat5/srec_signetics.5\n\trm -f man/cat5/srec_spasm.5 man/cat5/srec_spectrum.5\n\trm -f man/cat5/srec_stewie.5 man/cat5/srec_tektronix.5\n\trm -f man/cat5/srec_tektronix_extended.5 man/cat5/srec_ti_tagged.5\n\trm -f man/cat5/srec_ti_tagged_16.5 man/cat5/srec_ti_txt.5\n\trm -f man/cat5/srec_trs80.5 man/cat5/srec_vmem.5 man/cat5/srec_wilson.5\n\nclean-misc:\n\trm -f .bin .mkdir.__bindir_ .mkdir.__datarootdir_\n\trm -f .mkdir.__datarootdir__doc .mkdir.__datarootdir__doc_srecord\n\trm -f .mkdir.__includedir_ .mkdir.__includedir__srecord\n\trm -f .mkdir.__includedir__srecord_input\n\trm -f .mkdir.__includedir__srecord_input_file\n\trm -f .mkdir.__includedir__srecord_input_filter\n\trm -f .mkdir.__includedir__srecord_input_filter_checksum\n\trm -f .mkdir.__includedir__srecord_input_filter_interval\n\trm -f .mkdir.__includedir__srecord_input_filter_message\n\trm -f .mkdir.__includedir__srecord_input_generator\n\trm -f .mkdir.__includedir__srecord_memory\n\trm -f .mkdir.__includedir__srecord_memory_walker\n\trm -f .mkdir.__includedir__srecord_output\n\trm -f .mkdir.__includedir__srecord_output_file\n\trm -f .mkdir.__includedir__srecord_quit .mkdir.__libdir_\n\trm -f .mkdir.__libdir__pkgconfig .mkdir.__mandir_ .mkdir.__mandir__man1\n\trm -f .mkdir.__mandir__man3 .mkdir.__mandir__man5 core etc/BUILDING.pdf\n\trm -f etc/README.pdf etc/change_log.pdf etc/debian.png etc/doc_cat.png\n\trm -f etc/doc_chip.png etc/doc_gen.png etc/doc_lens.png etc/doc_lib.png\n\trm -f etc/reference.pdf etc/srecord.png etc/whining.png\n\nclean-obj:\n\trm -f srec_cat/arglex3.lo srec_cat/arglex3.o srec_cat/main.lo\n\trm -f srec_cat/main.o srec_cmp/main.lo srec_cmp/main.o srec_info/main.lo\n\trm -f srec_info/main.o srecord/adler16.lo srecord/adler16.o\n\trm -f srecord/adler32.lo srecord/adler32.o srecord/arglex.lo\n\trm -f srecord/arglex.o srecord/arglex/abbreviate.lo\n\trm -f srecord/arglex/abbreviate.o srecord/arglex/test_ambiguous.lo\n\trm -f srecord/arglex/test_ambiguous.o srecord/arglex/tool.lo\n\trm -f srecord/arglex/tool.o srecord/arglex/tool/get_interval.lo\n\trm -f srecord/arglex/tool/get_interval.o\n\trm -f srecord/arglex/tool/get_interval_small.lo\n\trm -f srecord/arglex/tool/get_interval_small.o\n\trm -f srecord/arglex/tool/get_number.lo srecord/arglex/tool/get_number.o\n\trm -f srecord/arglex/tool/get_string.lo srecord/arglex/tool/get_string.o\n\trm -f srecord/arglex/tool/input.lo srecord/arglex/tool/input.o\n\trm -f srecord/arglex/tool/output.lo srecord/arglex/tool/output.o\n\trm -f srecord/bitrev.lo srecord/bitrev.o srecord/crc16.lo\n\trm -f srecord/crc16.o srecord/crc32.lo srecord/crc32.o srecord/defcon.lo\n\trm -f srecord/defcon.o srecord/endian.lo srecord/endian.o\n\trm -f srecord/endian/decode_word.lo srecord/endian/decode_word.o\n\trm -f srecord/fletcher16.lo srecord/fletcher16.o srecord/fletcher32.lo\n\trm -f srecord/fletcher32.o srecord/input.lo srecord/input.o\n\trm -f srecord/input/catenate.lo srecord/input/catenate.o\n\trm -f srecord/input/file.lo srecord/input/file.o\n\trm -f srecord/input/file/aomf.lo srecord/input/file/aomf.o\n\trm -f srecord/input/file/ascii_hex.lo srecord/input/file/ascii_hex.o\n\trm -f srecord/input/file/atmel_generic.lo\n\trm -f srecord/input/file/atmel_generic.o srecord/input/file/binary.lo\n\trm -f srecord/input/file/binary.o srecord/input/file/brecord.lo\n\trm -f srecord/input/file/brecord.o srecord/input/file/cosmac.lo\n\trm -f srecord/input/file/cosmac.o srecord/input/file/dec_binary.lo\n\trm -f srecord/input/file/dec_binary.o srecord/input/file/emon52.lo\n\trm -f srecord/input/file/emon52.o srecord/input/file/fairchild.lo\n\trm -f srecord/input/file/fairchild.o srecord/input/file/fastload.lo\n\trm -f srecord/input/file/fastload.o\n\trm -f srecord/input/file/formatted_binary.lo\n\trm -f srecord/input/file/formatted_binary.o\n\trm -f srecord/input/file/four_packed_code.lo\n\trm -f srecord/input/file/four_packed_code.o srecord/input/file/guess.lo\n\trm -f srecord/input/file/guess.o srecord/input/file/hexdump.lo\n\trm -f srecord/input/file/hexdump.o srecord/input/file/idt.lo\n\trm -f srecord/input/file/idt.o srecord/input/file/intel.lo\n\trm -f srecord/input/file/intel.o srecord/input/file/intel16.lo\n\trm -f srecord/input/file/intel16.o srecord/input/file/logisim.lo\n\trm -f srecord/input/file/logisim.o srecord/input/file/mif.lo\n\trm -f srecord/input/file/mif.o srecord/input/file/mips_flash.lo\n\trm -f srecord/input/file/mips_flash.o srecord/input/file/mos_tech.lo\n\trm -f srecord/input/file/mos_tech.o srecord/input/file/motorola.lo\n\trm -f srecord/input/file/motorola.o srecord/input/file/msbin.lo\n\trm -f srecord/input/file/msbin.o srecord/input/file/needham.lo\n\trm -f srecord/input/file/needham.o srecord/input/file/os65v.lo\n\trm -f srecord/input/file/os65v.o srecord/input/file/ppb.lo\n\trm -f srecord/input/file/ppb.o srecord/input/file/ppx.lo\n\trm -f srecord/input/file/ppx.o srecord/input/file/signetics.lo\n\trm -f srecord/input/file/signetics.o srecord/input/file/spasm.lo\n\trm -f srecord/input/file/spasm.o srecord/input/file/spectrum.lo\n\trm -f srecord/input/file/spectrum.o srecord/input/file/stewie.lo\n\trm -f srecord/input/file/stewie.o srecord/input/file/tektronix.lo\n\trm -f srecord/input/file/tektronix.o\n\trm -f srecord/input/file/tektronix_extended.lo\n\trm -f srecord/input/file/tektronix_extended.o\n\trm -f srecord/input/file/ti_tagged.lo srecord/input/file/ti_tagged.o\n\trm -f srecord/input/file/ti_tagged_16.lo\n\trm -f srecord/input/file/ti_tagged_16.o srecord/input/file/ti_txt.lo\n\trm -f srecord/input/file/ti_txt.o srecord/input/file/trs80.lo\n\trm -f srecord/input/file/trs80.o srecord/input/file/vmem.lo\n\trm -f srecord/input/file/vmem.o srecord/input/file/wilson.lo\n\trm -f srecord/input/file/wilson.o srecord/input/filter.lo\n\trm -f srecord/input/filter.o srecord/input/filter/and.lo\n\trm -f srecord/input/filter/and.o srecord/input/filter/bitrev.lo\n\trm -f srecord/input/filter/bitrev.o srecord/input/filter/byte_swap.lo\n\trm -f srecord/input/filter/byte_swap.o srecord/input/filter/checksum.lo\n\trm -f srecord/input/filter/checksum.o\n\trm -f srecord/input/filter/checksum/bitnot.lo\n\trm -f srecord/input/filter/checksum/bitnot.o\n\trm -f srecord/input/filter/checksum/negative.lo\n\trm -f srecord/input/filter/checksum/negative.o\n\trm -f srecord/input/filter/checksum/positive.lo\n\trm -f srecord/input/filter/checksum/positive.o\n\trm -f srecord/input/filter/crop.lo srecord/input/filter/crop.o\n\trm -f srecord/input/filter/fill.lo srecord/input/filter/fill.o\n\trm -f srecord/input/filter/interval.lo srecord/input/filter/interval.o\n\trm -f srecord/input/filter/interval/length.lo\n\trm -f srecord/input/filter/interval/length.o\n\trm -f srecord/input/filter/interval/maximum.lo\n\trm -f srecord/input/filter/interval/maximum.o\n\trm -f srecord/input/filter/interval/minimum.lo\n\trm -f srecord/input/filter/interval/minimum.o\n\trm -f srecord/input/filter/message.lo srecord/input/filter/message.o\n\trm -f srecord/input/filter/message/adler16.lo\n\trm -f srecord/input/filter/message/adler16.o\n\trm -f srecord/input/filter/message/adler32.lo\n\trm -f srecord/input/filter/message/adler32.o\n\trm -f srecord/input/filter/message/crc16.lo\n\trm -f srecord/input/filter/message/crc16.o\n\trm -f srecord/input/filter/message/crc32.lo\n\trm -f srecord/input/filter/message/crc32.o\n\trm -f srecord/input/filter/message/fletcher16.lo\n\trm -f srecord/input/filter/message/fletcher16.o\n\trm -f srecord/input/filter/message/fletcher32.lo\n\trm -f srecord/input/filter/message/fletcher32.o\n\trm -f srecord/input/filter/message/gcrypt.lo\n\trm -f srecord/input/filter/message/gcrypt.o\n\trm -f srecord/input/filter/message/stm32.lo\n\trm -f srecord/input/filter/message/stm32.o srecord/input/filter/not.lo\n\trm -f srecord/input/filter/not.o srecord/input/filter/offset.lo\n\trm -f srecord/input/filter/offset.o srecord/input/filter/or.lo\n\trm -f srecord/input/filter/or.o srecord/input/filter/random_fill.lo\n\trm -f srecord/input/filter/random_fill.o\n\trm -f srecord/input/filter/sequence.lo srecord/input/filter/sequence.o\n\trm -f srecord/input/filter/split.lo srecord/input/filter/split.o\n\trm -f srecord/input/filter/unfill.lo srecord/input/filter/unfill.o\n\trm -f srecord/input/filter/unsplit.lo srecord/input/filter/unsplit.o\n\trm -f srecord/input/filter/xor.lo srecord/input/filter/xor.o\n\trm -f srecord/input/generator.lo srecord/input/generator.o\n\trm -f srecord/input/generator/constant.lo\n\trm -f srecord/input/generator/constant.o\n\trm -f srecord/input/generator/random.lo srecord/input/generator/random.o\n\trm -f srecord/input/generator/repeat.lo srecord/input/generator/repeat.o\n\trm -f srecord/input/interval.lo srecord/input/interval.o\n\trm -f srecord/interval.lo srecord/interval.o\n\trm -f srecord/interval/coverage.lo srecord/interval/coverage.o\n\trm -f srecord/interval/flatten.lo srecord/interval/flatten.o\n\trm -f srecord/libsrecord.a srecord/libsrecord.la srecord/memory.lo\n\trm -f srecord/memory.o srecord/memory/chunk.lo srecord/memory/chunk.o\n\trm -f srecord/memory/walker.lo srecord/memory/walker.o\n\trm -f srecord/memory/walker/adler16.lo srecord/memory/walker/adler16.o\n\trm -f srecord/memory/walker/adler32.lo srecord/memory/walker/adler32.o\n\trm -f srecord/memory/walker/alignment.lo\n\trm -f srecord/memory/walker/alignment.o srecord/memory/walker/compare.lo\n\trm -f srecord/memory/walker/compare.o\n\trm -f srecord/memory/walker/continuity.lo\n\trm -f srecord/memory/walker/continuity.o srecord/memory/walker/crc16.lo\n\trm -f srecord/memory/walker/crc16.o srecord/memory/walker/crc32.lo\n\trm -f srecord/memory/walker/crc32.o srecord/memory/walker/fletcher16.lo\n\trm -f srecord/memory/walker/fletcher16.o\n\trm -f srecord/memory/walker/fletcher32.lo\n\trm -f srecord/memory/walker/fletcher32.o srecord/memory/walker/gcrypt.lo\n\trm -f srecord/memory/walker/gcrypt.o srecord/memory/walker/stm32.lo\n\trm -f srecord/memory/walker/stm32.o srecord/memory/walker/writer.lo\n\trm -f srecord/memory/walker/writer.o srecord/output.lo srecord/output.o\n\trm -f srecord/output/file.lo srecord/output/file.o\n\trm -f srecord/output/file/aomf.lo srecord/output/file/aomf.o\n\trm -f srecord/output/file/ascii_hex.lo srecord/output/file/ascii_hex.o\n\trm -f srecord/output/file/asm.lo srecord/output/file/asm.o\n\trm -f srecord/output/file/atmel_generic.lo\n\trm -f srecord/output/file/atmel_generic.o srecord/output/file/basic.lo\n\trm -f srecord/output/file/basic.o srecord/output/file/binary.lo\n\trm -f srecord/output/file/binary.o srecord/output/file/brecord.lo\n\trm -f srecord/output/file/brecord.o srecord/output/file/c.lo\n\trm -f srecord/output/file/c.o srecord/output/file/coe.lo\n\trm -f srecord/output/file/coe.o srecord/output/file/cosmac.lo\n\trm -f srecord/output/file/cosmac.o srecord/output/file/dec_binary.lo\n\trm -f srecord/output/file/dec_binary.o srecord/output/file/emon52.lo\n\trm -f srecord/output/file/emon52.o srecord/output/file/fairchild.lo\n\trm -f srecord/output/file/fairchild.o srecord/output/file/fastload.lo\n\trm -f srecord/output/file/fastload.o\n\trm -f srecord/output/file/formatted_binary.lo\n\trm -f srecord/output/file/formatted_binary.o\n\trm -f srecord/output/file/forth.lo srecord/output/file/forth.o\n\trm -f srecord/output/file/four_packed_code.lo\n\trm -f srecord/output/file/four_packed_code.o\n\trm -f srecord/output/file/hexdump.lo srecord/output/file/hexdump.o\n\trm -f srecord/output/file/idt.lo srecord/output/file/idt.o\n\trm -f srecord/output/file/intel.lo srecord/output/file/intel.o\n\trm -f srecord/output/file/intel16.lo srecord/output/file/intel16.o\n\trm -f srecord/output/file/line_termination.lo\n\trm -f srecord/output/file/line_termination.o\n\trm -f srecord/output/file/logisim.lo srecord/output/file/logisim.o\n\trm -f srecord/output/file/mem.lo srecord/output/file/mem.o\n\trm -f srecord/output/file/mif.lo srecord/output/file/mif.o\n\trm -f srecord/output/file/mips_flash.lo srecord/output/file/mips_flash.o\n\trm -f srecord/output/file/mos_tech.lo srecord/output/file/mos_tech.o\n\trm -f srecord/output/file/motorola.lo srecord/output/file/motorola.o\n\trm -f srecord/output/file/msbin.lo srecord/output/file/msbin.o\n\trm -f srecord/output/file/needham.lo srecord/output/file/needham.o\n\trm -f srecord/output/file/os65v.lo srecord/output/file/os65v.o\n\trm -f srecord/output/file/ppb.lo srecord/output/file/ppb.o\n\trm -f srecord/output/file/ppx.lo srecord/output/file/ppx.o\n\trm -f srecord/output/file/signetics.lo srecord/output/file/signetics.o\n\trm -f srecord/output/file/spasm.lo srecord/output/file/spasm.o\n\trm -f srecord/output/file/spectrum.lo srecord/output/file/spectrum.o\n\trm -f srecord/output/file/stewie.lo srecord/output/file/stewie.o\n\trm -f srecord/output/file/tektronix.lo srecord/output/file/tektronix.o\n\trm -f srecord/output/file/tektronix_extended.lo\n\trm -f srecord/output/file/tektronix_extended.o\n\trm -f srecord/output/file/ti_tagged.lo srecord/output/file/ti_tagged.o\n\trm -f srecord/output/file/ti_tagged_16.lo\n\trm -f srecord/output/file/ti_tagged_16.o srecord/output/file/ti_txt.lo\n\trm -f srecord/output/file/ti_txt.o srecord/output/file/trs80.lo\n\trm -f srecord/output/file/trs80.o srecord/output/file/vhdl.lo\n\trm -f srecord/output/file/vhdl.o srecord/output/file/vmem.lo\n\trm -f srecord/output/file/vmem.o srecord/output/file/wilson.lo\n\trm -f srecord/output/file/wilson.o srecord/output/filter.lo\n\trm -f srecord/output/filter.o srecord/output/filter/reblock.lo\n\trm -f srecord/output/filter/reblock.o srecord/pretty_size.lo\n\trm -f srecord/pretty_size.o srecord/progname.lo srecord/progname.o\n\trm -f srecord/quit.lo srecord/quit.o srecord/quit/exception.lo\n\trm -f srecord/quit/exception.o srecord/quit/normal.lo\n\trm -f srecord/quit/normal.o srecord/quit/prefix.lo srecord/quit/prefix.o\n\trm -f srecord/r250.lo srecord/r250.o srecord/record.lo srecord/record.o\n\trm -f srecord/stm32.lo srecord/stm32.o srecord/string/quote_c.lo\n\trm -f srecord/string/quote_c.o srecord/string/url_decode.lo\n\trm -f srecord/string/url_decode.o srecord/string/url_encode.lo\n\trm -f srecord/string/url_encode.o srecord/versn_stamp.lo\n\trm -f srecord/versn_stamp.o srecord/vsnprintf.lo srecord/vsnprintf.o\n\trm -f test/arglex_ambiguous/main.lo test/arglex_ambiguous/main.o\n\trm -f test/crc16/main.lo test/crc16/main.o test/fletcher16/main.lo\n\trm -f test/fletcher16/main.o test/gecos/main.lo test/gecos/main.o\n\trm -f test/hyphen/main.lo test/hyphen/main.o test/url_decode/main.lo\n\trm -f test/url_decode/main.o\n\ndistclean: clean distclean-directories distclean-files\n\ndistclean-files:\n\trm -f Makefile config.cache config.log config.status etc/Howto.conf\n\trm -f libdir/pkgconfig/srecord.pc script/test_prelude.sh\n\trm -f srecord/config.h\n\ndistclean-directories:\n\trm -rf bin srec_cat/.libs srec_cmp/.libs srec_info/.libs srecord/.libs\n\trm -rf srecord/arglex/.libs srecord/arglex/tool/.libs\n\trm -rf srecord/endian/.libs srecord/input/.libs srecord/input/file/.libs\n\trm -rf srecord/input/filter/.libs srecord/input/filter/checksum/.libs\n\trm -rf srecord/input/filter/interval/.libs\n\trm -rf srecord/input/filter/message/.libs srecord/input/generator/.libs\n\trm -rf srecord/interval/.libs srecord/memory/.libs\n\trm -rf srecord/memory/walker/.libs srecord/output/.libs\n\trm -rf srecord/output/file/.libs srecord/output/filter/.libs\n\trm -rf srecord/quit/.libs srecord/string/.libs\n\trm -rf test/arglex_ambiguous/.libs test/crc16/.libs\n\trm -rf test/fletcher16/.libs test/gecos/.libs test/hyphen/.libs\n\trm -rf test/url_decode/.libs\n\ninstall: install-bin install-doc install-include install-libdir install-man\n\ninstall-bin: $(bindir)/srec_cat $(bindir)/srec_cmp $(bindir)/srec_info\n\ninstall-doc: $(datarootdir)/doc/srecord/BUILDING.pdf \\\n\t\t$(datarootdir)/doc/srecord/README.pdf \\\n\t\t$(datarootdir)/doc/srecord/change_log.pdf \\\n\t\t$(datarootdir)/doc/srecord/reference.pdf\n\ninstall-include: $(includedir)/srecord/adler16.h \\\n\t\t$(includedir)/srecord/adler32.h $(includedir)/srecord/crc16.h \\\n\t\t$(includedir)/srecord/crc32.h $(includedir)/srecord/defcon.h \\\n\t\t$(includedir)/srecord/endian.h \\\n\t\t$(includedir)/srecord/fletcher16.h \\\n\t\t$(includedir)/srecord/fletcher32.h \\\n\t\t$(includedir)/srecord/format_printf.h \\\n\t\t$(includedir)/srecord/input.h \\\n\t\t$(includedir)/srecord/input/catenate.h \\\n\t\t$(includedir)/srecord/input/file.h \\\n\t\t$(includedir)/srecord/input/file/aomf.h \\\n\t\t$(includedir)/srecord/input/file/ascii_hex.h \\\n\t\t$(includedir)/srecord/input/file/atmel_generic.h \\\n\t\t$(includedir)/srecord/input/file/binary.h \\\n\t\t$(includedir)/srecord/input/file/brecord.h \\\n\t\t$(includedir)/srecord/input/file/cosmac.h \\\n\t\t$(includedir)/srecord/input/file/dec_binary.h \\\n\t\t$(includedir)/srecord/input/file/emon52.h \\\n\t\t$(includedir)/srecord/input/file/fairchild.h \\\n\t\t$(includedir)/srecord/input/file/fastload.h \\\n\t\t$(includedir)/srecord/input/file/formatted_binary.h \\\n\t\t$(includedir)/srecord/input/file/four_packed_code.h \\\n\t\t$(includedir)/srecord/input/file/intel.h \\\n\t\t$(includedir)/srecord/input/file/logisim.h \\\n\t\t$(includedir)/srecord/input/file/mif.h \\\n\t\t$(includedir)/srecord/input/file/mips_flash.h \\\n\t\t$(includedir)/srecord/input/file/mos_tech.h \\\n\t\t$(includedir)/srecord/input/file/msbin.h \\\n\t\t$(includedir)/srecord/input/file/needham.h \\\n\t\t$(includedir)/srecord/input/file/os65v.h \\\n\t\t$(includedir)/srecord/input/file/ppb.h \\\n\t\t$(includedir)/srecord/input/file/ppx.h \\\n\t\t$(includedir)/srecord/input/file/signetics.h \\\n\t\t$(includedir)/srecord/input/file/spasm.h \\\n\t\t$(includedir)/srecord/input/file/spectrum.h \\\n\t\t$(includedir)/srecord/input/file/stewie.h \\\n\t\t$(includedir)/srecord/input/file/tektronix.h \\\n\t\t$(includedir)/srecord/input/file/tektronix_extended.h \\\n\t\t$(includedir)/srecord/input/file/ti_tagged.h \\\n\t\t$(includedir)/srecord/input/file/ti_tagged_16.h \\\n\t\t$(includedir)/srecord/input/file/ti_txt.h \\\n\t\t$(includedir)/srecord/input/file/trs80.h \\\n\t\t$(includedir)/srecord/input/file/vmem.h \\\n\t\t$(includedir)/srecord/input/file/wilson.h \\\n\t\t$(includedir)/srecord/input/filter.h \\\n\t\t$(includedir)/srecord/input/filter/and.h \\\n\t\t$(includedir)/srecord/input/filter/bitrev.h \\\n\t\t$(includedir)/srecord/input/filter/byte_swap.h \\\n\t\t$(includedir)/srecord/input/filter/checksum.h \\\n\t\t$(includedir)/srecord/input/filter/checksum/bitnot.h \\\n\t\t$(includedir)/srecord/input/filter/checksum/negative.h \\\n\t\t$(includedir)/srecord/input/filter/checksum/positive.h \\\n\t\t$(includedir)/srecord/input/filter/crop.h \\\n\t\t$(includedir)/srecord/input/filter/fill.h \\\n\t\t$(includedir)/srecord/input/filter/interval.h \\\n\t\t$(includedir)/srecord/input/filter/interval/length.h \\\n\t\t$(includedir)/srecord/input/filter/interval/maximum.h \\\n\t\t$(includedir)/srecord/input/filter/interval/minimum.h \\\n\t\t$(includedir)/srecord/input/filter/message.h \\\n\t\t$(includedir)/srecord/input/filter/message/adler16.h \\\n\t\t$(includedir)/srecord/input/filter/message/adler32.h \\\n\t\t$(includedir)/srecord/input/filter/message/crc16.h \\\n\t\t$(includedir)/srecord/input/filter/message/crc32.h \\\n\t\t$(includedir)/srecord/input/filter/message/fletcher16.h \\\n\t\t$(includedir)/srecord/input/filter/message/fletcher32.h \\\n\t\t$(includedir)/srecord/input/filter/message/gcrypt.h \\\n\t\t$(includedir)/srecord/input/filter/not.h \\\n\t\t$(includedir)/srecord/input/filter/offset.h \\\n\t\t$(includedir)/srecord/input/filter/or.h \\\n\t\t$(includedir)/srecord/input/filter/random_fill.h \\\n\t\t$(includedir)/srecord/input/filter/sequence.h \\\n\t\t$(includedir)/srecord/input/filter/split.h \\\n\t\t$(includedir)/srecord/input/filter/unfill.h \\\n\t\t$(includedir)/srecord/input/filter/unsplit.h \\\n\t\t$(includedir)/srecord/input/filter/xor.h \\\n\t\t$(includedir)/srecord/input/generator.h \\\n\t\t$(includedir)/srecord/input/generator/constant.h \\\n\t\t$(includedir)/srecord/input/generator/random.h \\\n\t\t$(includedir)/srecord/input/generator/repeat.h \\\n\t\t$(includedir)/srecord/interval.h \\\n\t\t$(includedir)/srecord/memory.h \\\n\t\t$(includedir)/srecord/memory/chunk.h \\\n\t\t$(includedir)/srecord/memory/walker.h \\\n\t\t$(includedir)/srecord/memory/walker/compare.h \\\n\t\t$(includedir)/srecord/memory/walker/continuity.h \\\n\t\t$(includedir)/srecord/memory/walker/gcrypt.h \\\n\t\t$(includedir)/srecord/memory/walker/writer.h \\\n\t\t$(includedir)/srecord/output.h \\\n\t\t$(includedir)/srecord/output/file.h \\\n\t\t$(includedir)/srecord/output/file/aomf.h \\\n\t\t$(includedir)/srecord/output/file/ascii_hex.h \\\n\t\t$(includedir)/srecord/output/file/asm.h \\\n\t\t$(includedir)/srecord/output/file/atmel_generic.h \\\n\t\t$(includedir)/srecord/output/file/basic.h \\\n\t\t$(includedir)/srecord/output/file/binary.h \\\n\t\t$(includedir)/srecord/output/file/brecord.h \\\n\t\t$(includedir)/srecord/output/file/c.h \\\n\t\t$(includedir)/srecord/output/file/cosmac.h \\\n\t\t$(includedir)/srecord/output/file/dec_binary.h \\\n\t\t$(includedir)/srecord/output/file/emon52.h \\\n\t\t$(includedir)/srecord/output/file/fairchild.h \\\n\t\t$(includedir)/srecord/output/file/fastload.h \\\n\t\t$(includedir)/srecord/output/file/formatted_binary.h \\\n\t\t$(includedir)/srecord/output/file/forth.h \\\n\t\t$(includedir)/srecord/output/file/four_packed_code.h \\\n\t\t$(includedir)/srecord/output/file/hexdump.h \\\n\t\t$(includedir)/srecord/output/file/intel.h \\\n\t\t$(includedir)/srecord/output/file/intel16.h \\\n\t\t$(includedir)/srecord/output/file/logisim.h \\\n\t\t$(includedir)/srecord/output/file/mif.h \\\n\t\t$(includedir)/srecord/output/file/mips_flash.h \\\n\t\t$(includedir)/srecord/output/file/mos_tech.h \\\n\t\t$(includedir)/srecord/output/file/msbin.h \\\n\t\t$(includedir)/srecord/output/file/needham.h \\\n\t\t$(includedir)/srecord/output/file/os65v.h \\\n\t\t$(includedir)/srecord/output/file/ppb.h \\\n\t\t$(includedir)/srecord/output/file/ppx.h \\\n\t\t$(includedir)/srecord/output/file/signetics.h \\\n\t\t$(includedir)/srecord/output/file/spasm.h \\\n\t\t$(includedir)/srecord/output/file/spectrum.h \\\n\t\t$(includedir)/srecord/output/file/stewie.h \\\n\t\t$(includedir)/srecord/output/file/tektronix.h \\\n\t\t$(includedir)/srecord/output/file/tektronix_extended.h \\\n\t\t$(includedir)/srecord/output/file/ti_tagged.h \\\n\t\t$(includedir)/srecord/output/file/ti_tagged_16.h \\\n\t\t$(includedir)/srecord/output/file/ti_txt.h \\\n\t\t$(includedir)/srecord/output/file/trs80.h \\\n\t\t$(includedir)/srecord/output/file/vhdl.h \\\n\t\t$(includedir)/srecord/output/file/vmem.h \\\n\t\t$(includedir)/srecord/output/file/wilson.h \\\n\t\t$(includedir)/srecord/quit.h \\\n\t\t$(includedir)/srecord/quit/exception.h \\\n\t\t$(includedir)/srecord/quit/normal.h \\\n\t\t$(includedir)/srecord/quit/prefix.h \\\n\t\t$(includedir)/srecord/record.h $(includedir)/srecord/srecord.h \\\n\t\t$(includedir)/srecord/string.h\n\n#\n# The install of the *.la file automatically causes \"$(LIBTOOL) --mode=install\"\n# to install the *.a and *.so* files as well, which is why you don't see them\n# explicitly mentioned here.\n#\ninstall-libdir: $(libdir)/libsrecord.la $(libdir)/pkgconfig/srecord.pc\n\ninstall-man: $(mandir)/man1/srec_cat.1 $(mandir)/man1/srec_cmp.1 \\\n\t\t$(mandir)/man1/srec_examples.1 $(mandir)/man1/srec_info.1 \\\n\t\t$(mandir)/man1/srec_input.1 $(mandir)/man1/srec_license.1 \\\n\t\t$(mandir)/man3/srecord.3 $(mandir)/man3/srecord_license.3 \\\n\t\t$(mandir)/man5/srec_aomf.5 $(mandir)/man5/srec_ascii_hex.5 \\\n\t\t$(mandir)/man5/srec_atmel_generic.5 \\\n\t\t$(mandir)/man5/srec_binary.5 $(mandir)/man5/srec_brecord.5 \\\n\t\t$(mandir)/man5/srec_coe.5 $(mandir)/man5/srec_cosmac.5 \\\n\t\t$(mandir)/man5/srec_dec_binary.5 $(mandir)/man5/srec_emon52.5 \\\n\t\t$(mandir)/man5/srec_fairchild.5 $(mandir)/man5/srec_fastload.5 \\\n\t\t$(mandir)/man5/srec_formatted_binary.5 \\\n\t\t$(mandir)/man5/srec_forth.5 $(mandir)/man5/srec_fpc.5 \\\n\t\t$(mandir)/man5/srec_idt.5 $(mandir)/man5/srec_intel.5 \\\n\t\t$(mandir)/man5/srec_intel16.5 $(mandir)/man5/srec_logisim.5 \\\n\t\t$(mandir)/man5/srec_mem.5 $(mandir)/man5/srec_mif.5 \\\n\t\t$(mandir)/man5/srec_mips_flash.5 \\\n\t\t$(mandir)/man5/srec_mos_tech.5 $(mandir)/man5/srec_motorola.5 \\\n\t\t$(mandir)/man5/srec_msbin.5 $(mandir)/man5/srec_needham.5 \\\n\t\t$(mandir)/man5/srec_os65v.5 $(mandir)/man5/srec_ppb.5 \\\n\t\t$(mandir)/man5/srec_ppx.5 $(mandir)/man5/srec_signetics.5 \\\n\t\t$(mandir)/man5/srec_spasm.5 $(mandir)/man5/srec_spectrum.5 \\\n\t\t$(mandir)/man5/srec_stewie.5 $(mandir)/man5/srec_tektronix.5 \\\n\t\t$(mandir)/man5/srec_tektronix_extended.5 \\\n\t\t$(mandir)/man5/srec_ti_tagged.5 \\\n\t\t$(mandir)/man5/srec_ti_tagged_16.5 \\\n\t\t$(mandir)/man5/srec_ti_txt.5 $(mandir)/man5/srec_trs80.5 \\\n\t\t$(mandir)/man5/srec_vmem.5 $(mandir)/man5/srec_wilson.5\n\nuninstall:\n\trm -f $(bindir)/srec_cat $(bindir)/srec_cmp $(bindir)/srec_info\n\trm -f $(datarootdir)/doc/srecord/BUILDING.pdf\n\trm -f $(datarootdir)/doc/srecord/README.pdf\n\trm -f $(datarootdir)/doc/srecord/change_log.pdf\n\trm -f $(datarootdir)/doc/srecord/reference.pdf\n\trm -f $(includedir)/srecord/adler16.h $(includedir)/srecord/adler32.h\n\trm -f $(includedir)/srecord/crc16.h $(includedir)/srecord/crc32.h\n\trm -f $(includedir)/srecord/defcon.h $(includedir)/srecord/endian.h\n\trm -f $(includedir)/srecord/fletcher16.h\n\trm -f $(includedir)/srecord/fletcher32.h\n\trm -f $(includedir)/srecord/format_printf.h\n\trm -f $(includedir)/srecord/input.h\n\trm -f $(includedir)/srecord/input/catenate.h\n\trm -f $(includedir)/srecord/input/file.h\n\trm -f $(includedir)/srecord/input/file/aomf.h\n\trm -f $(includedir)/srecord/input/file/ascii_hex.h\n\trm -f $(includedir)/srecord/input/file/atmel_generic.h\n\trm -f $(includedir)/srecord/input/file/binary.h\n\trm -f $(includedir)/srecord/input/file/brecord.h\n\trm -f $(includedir)/srecord/input/file/cosmac.h\n\trm -f $(includedir)/srecord/input/file/dec_binary.h\n\trm -f $(includedir)/srecord/input/file/emon52.h\n\trm -f $(includedir)/srecord/input/file/fairchild.h\n\trm -f $(includedir)/srecord/input/file/fastload.h\n\trm -f $(includedir)/srecord/input/file/formatted_binary.h\n\trm -f $(includedir)/srecord/input/file/four_packed_code.h\n\trm -f $(includedir)/srecord/input/file/intel.h\n\trm -f $(includedir)/srecord/input/file/logisim.h\n\trm -f $(includedir)/srecord/input/file/mif.h\n\trm -f $(includedir)/srecord/input/file/mips_flash.h\n\trm -f $(includedir)/srecord/input/file/mos_tech.h\n\trm -f $(includedir)/srecord/input/file/msbin.h\n\trm -f $(includedir)/srecord/input/file/needham.h\n\trm -f $(includedir)/srecord/input/file/os65v.h\n\trm -f $(includedir)/srecord/input/file/ppb.h\n\trm -f $(includedir)/srecord/input/file/ppx.h\n\trm -f $(includedir)/srecord/input/file/signetics.h\n\trm -f $(includedir)/srecord/input/file/spasm.h\n\trm -f $(includedir)/srecord/input/file/spectrum.h\n\trm -f $(includedir)/srecord/input/file/stewie.h\n\trm -f $(includedir)/srecord/input/file/tektronix.h\n\trm -f $(includedir)/srecord/input/file/tektronix_extended.h\n\trm -f $(includedir)/srecord/input/file/ti_tagged.h\n\trm -f $(includedir)/srecord/input/file/ti_tagged_16.h\n\trm -f $(includedir)/srecord/input/file/ti_txt.h\n\trm -f $(includedir)/srecord/input/file/trs80.h\n\trm -f $(includedir)/srecord/input/file/vmem.h\n\trm -f $(includedir)/srecord/input/file/wilson.h\n\trm -f $(includedir)/srecord/input/filter.h\n\trm -f $(includedir)/srecord/input/filter/and.h\n\trm -f $(includedir)/srecord/input/filter/bitrev.h\n\trm -f $(includedir)/srecord/input/filter/byte_swap.h\n\trm -f $(includedir)/srecord/input/filter/checksum.h\n\trm -f $(includedir)/srecord/input/filter/checksum/bitnot.h\n\trm -f $(includedir)/srecord/input/filter/checksum/negative.h\n\trm -f $(includedir)/srecord/input/filter/checksum/positive.h\n\trm -f $(includedir)/srecord/input/filter/crop.h\n\trm -f $(includedir)/srecord/input/filter/fill.h\n\trm -f $(includedir)/srecord/input/filter/interval.h\n\trm -f $(includedir)/srecord/input/filter/interval/length.h\n\trm -f $(includedir)/srecord/input/filter/interval/maximum.h\n\trm -f $(includedir)/srecord/input/filter/interval/minimum.h\n\trm -f $(includedir)/srecord/input/filter/message.h\n\trm -f $(includedir)/srecord/input/filter/message/adler16.h\n\trm -f $(includedir)/srecord/input/filter/message/adler32.h\n\trm -f $(includedir)/srecord/input/filter/message/crc16.h\n\trm -f $(includedir)/srecord/input/filter/message/crc32.h\n\trm -f $(includedir)/srecord/input/filter/message/fletcher16.h\n\trm -f $(includedir)/srecord/input/filter/message/fletcher32.h\n\trm -f $(includedir)/srecord/input/filter/message/gcrypt.h\n\trm -f $(includedir)/srecord/input/filter/not.h\n\trm -f $(includedir)/srecord/input/filter/offset.h\n\trm -f $(includedir)/srecord/input/filter/or.h\n\trm -f $(includedir)/srecord/input/filter/random_fill.h\n\trm -f $(includedir)/srecord/input/filter/sequence.h\n\trm -f $(includedir)/srecord/input/filter/split.h\n\trm -f $(includedir)/srecord/input/filter/unfill.h\n\trm -f $(includedir)/srecord/input/filter/unsplit.h\n\trm -f $(includedir)/srecord/input/filter/xor.h\n\trm -f $(includedir)/srecord/input/generator.h\n\trm -f $(includedir)/srecord/input/generator/constant.h\n\trm -f $(includedir)/srecord/input/generator/random.h\n\trm -f $(includedir)/srecord/input/generator/repeat.h\n\trm -f $(includedir)/srecord/interval.h $(includedir)/srecord/memory.h\n\trm -f $(includedir)/srecord/memory/chunk.h\n\trm -f $(includedir)/srecord/memory/walker.h\n\trm -f $(includedir)/srecord/memory/walker/compare.h\n\trm -f $(includedir)/srecord/memory/walker/continuity.h\n\trm -f $(includedir)/srecord/memory/walker/gcrypt.h\n\trm -f $(includedir)/srecord/memory/walker/writer.h\n\trm -f $(includedir)/srecord/output.h $(includedir)/srecord/output/file.h\n\trm -f $(includedir)/srecord/output/file/aomf.h\n\trm -f $(includedir)/srecord/output/file/ascii_hex.h\n\trm -f $(includedir)/srecord/output/file/asm.h\n\trm -f $(includedir)/srecord/output/file/atmel_generic.h\n\trm -f $(includedir)/srecord/output/file/basic.h\n\trm -f $(includedir)/srecord/output/file/binary.h\n\trm -f $(includedir)/srecord/output/file/brecord.h\n\trm -f $(includedir)/srecord/output/file/c.h\n\trm -f $(includedir)/srecord/output/file/cosmac.h\n\trm -f $(includedir)/srecord/output/file/dec_binary.h\n\trm -f $(includedir)/srecord/output/file/emon52.h\n\trm -f $(includedir)/srecord/output/file/fairchild.h\n\trm -f $(includedir)/srecord/output/file/fastload.h\n\trm -f $(includedir)/srecord/output/file/formatted_binary.h\n\trm -f $(includedir)/srecord/output/file/forth.h\n\trm -f $(includedir)/srecord/output/file/four_packed_code.h\n\trm -f $(includedir)/srecord/output/file/hexdump.h\n\trm -f $(includedir)/srecord/output/file/intel.h\n\trm -f $(includedir)/srecord/output/file/intel16.h\n\trm -f $(includedir)/srecord/output/file/logisim.h\n\trm -f $(includedir)/srecord/output/file/mif.h\n\trm -f $(includedir)/srecord/output/file/mips_flash.h\n\trm -f $(includedir)/srecord/output/file/mos_tech.h\n\trm -f $(includedir)/srecord/output/file/msbin.h\n\trm -f $(includedir)/srecord/output/file/needham.h\n\trm -f $(includedir)/srecord/output/file/os65v.h\n\trm -f $(includedir)/srecord/output/file/ppb.h\n\trm -f $(includedir)/srecord/output/file/ppx.h\n\trm -f $(includedir)/srecord/output/file/signetics.h\n\trm -f $(includedir)/srecord/output/file/spasm.h\n\trm -f $(includedir)/srecord/output/file/spectrum.h\n\trm -f $(includedir)/srecord/output/file/stewie.h\n\trm -f $(includedir)/srecord/output/file/tektronix.h\n\trm -f $(includedir)/srecord/output/file/tektronix_extended.h\n\trm -f $(includedir)/srecord/output/file/ti_tagged.h\n\trm -f $(includedir)/srecord/output/file/ti_tagged_16.h\n\trm -f $(includedir)/srecord/output/file/ti_txt.h\n\trm -f $(includedir)/srecord/output/file/trs80.h\n\trm -f $(includedir)/srecord/output/file/vhdl.h\n\trm -f $(includedir)/srecord/output/file/vmem.h\n\trm -f $(includedir)/srecord/output/file/wilson.h\n\trm -f $(includedir)/srecord/quit.h\n\trm -f $(includedir)/srecord/quit/exception.h\n\trm -f $(includedir)/srecord/quit/normal.h\n\trm -f $(includedir)/srecord/quit/prefix.h $(includedir)/srecord/record.h\n\trm -f $(includedir)/srecord/srecord.h $(includedir)/srecord/string.h\n\trm -f $(libdir)/libsrecord.a $(libdir)/libsrecord.la\n\trm -f $(libdir)/libsrecord.so* $(libdir)/pkgconfig/srecord.pc\n\trm -f $(mandir)/man1/srec_cat.1 $(mandir)/man1/srec_cmp.1\n\trm -f $(mandir)/man1/srec_examples.1 $(mandir)/man1/srec_info.1\n\trm -f $(mandir)/man1/srec_input.1 $(mandir)/man1/srec_license.1\n\trm -f $(mandir)/man3/srecord.3 $(mandir)/man3/srecord_license.3\n\trm -f $(mandir)/man5/srec_aomf.5 $(mandir)/man5/srec_ascii_hex.5\n\trm -f $(mandir)/man5/srec_atmel_generic.5 $(mandir)/man5/srec_binary.5\n\trm -f $(mandir)/man5/srec_brecord.5 $(mandir)/man5/srec_coe.5\n\trm -f $(mandir)/man5/srec_cosmac.5 $(mandir)/man5/srec_dec_binary.5\n\trm -f $(mandir)/man5/srec_emon52.5 $(mandir)/man5/srec_fairchild.5\n\trm -f $(mandir)/man5/srec_fastload.5\n\trm -f $(mandir)/man5/srec_formatted_binary.5 $(mandir)/man5/srec_forth.5\n\trm -f $(mandir)/man5/srec_fpc.5 $(mandir)/man5/srec_idt.5\n\trm -f $(mandir)/man5/srec_intel.5 $(mandir)/man5/srec_intel16.5\n\trm -f $(mandir)/man5/srec_logisim.5 $(mandir)/man5/srec_mem.5\n\trm -f $(mandir)/man5/srec_mif.5 $(mandir)/man5/srec_mips_flash.5\n\trm -f $(mandir)/man5/srec_mos_tech.5 $(mandir)/man5/srec_motorola.5\n\trm -f $(mandir)/man5/srec_msbin.5 $(mandir)/man5/srec_needham.5\n\trm -f $(mandir)/man5/srec_os65v.5 $(mandir)/man5/srec_ppb.5\n\trm -f $(mandir)/man5/srec_ppx.5 $(mandir)/man5/srec_signetics.5\n\trm -f $(mandir)/man5/srec_spasm.5 $(mandir)/man5/srec_spectrum.5\n\trm -f $(mandir)/man5/srec_stewie.5 $(mandir)/man5/srec_tektronix.5\n\trm -f $(mandir)/man5/srec_tektronix_extended.5\n\trm -f $(mandir)/man5/srec_ti_tagged.5 $(mandir)/man5/srec_ti_tagged_16.5\n\trm -f $(mandir)/man5/srec_ti_txt.5 $(mandir)/man5/srec_trs80.5\n\trm -f $(mandir)/man5/srec_vmem.5 $(mandir)/man5/srec_wilson.5\n\n.PHONY: all all-bin all-doc check clean clean-bin clean-doc distclean \\\n\t\tdistclean-directories distclean-files install install-bin \\\n\t\tinstall-include install-libdir install-mandir sure t0001a \\\n\t\tt0002a t0003a t0004a t0005a t0006a t0007a t0008a t0009a t0010a \\\n\t\tt0011a t0012a t0013a t0014a t0015a t0016a t0017a t0018a t0019a \\\n\t\tt0020a t0021a t0022a t0023a t0024a t0025a t0026a t0027a t0028a \\\n\t\tt0029a t0030a t0031a t0032a t0033a t0034a t0035a t0036a t0037a \\\n\t\tt0037b t0038a t0039a t0040a t0050a t0051a t0052a t0053a t0055a \\\n\t\tt0056a t0057a t0058a t0059a t0060a t0061a t0062a t0063a t0065a \\\n\t\tt0066a t0067a t0068a t0069a t0070a t0071a t0072a t0073a t0075a \\\n\t\tt0076a t0077a t0078a t0079a t0080a t0081a t0082a t0083a t0085a \\\n\t\tt0086a t0087a t0088a t0089a t0090a t0091a t0092a t0093a t0095a \\\n\t\tt0096a t0097a t0098a t0099a t0100a t0101a t0102a t0103a t0105a \\\n\t\tt0106a t0107a t0108a t0109a t0110a t0111a t0112a t0113a t0115a \\\n\t\tt0116a t0117a t0118a t0119a t0120a t0121a t0122a t0123a t0125a \\\n\t\tt0126a t0127a t0128a t0129a t0130a t0131a t0132a t0133a t0135a \\\n\t\tt0136a t0137a t0138a t0139a t0150a t0151a t0152a t0153a t0155a \\\n\t\tt0156a t0157a t0158a t0159a t0160a t0161a t0162a t0163a t0165a \\\n\t\tt0166a t0167a t0168a t0169a t0170a t0171a t0172a t0173a t0175a \\\n\t\tt0176a t0177a t0178a t0179a t0180a t0181a t0182a t0183a t0185a \\\n\t\tt0186a t0187a t0188a t0189a t0191a t0192a t0193a t0195a t0196a \\\n\t\tt0197a t0198a t0199a t0200a t0201a t0202a t0203a t0205a t0206a \\\n\t\tt0207a t0209a t0210a t0211a t0212a t0213a t0215a t0216a t0217a \\\n\t\tt0218a t0219a t0220a t0221a t0222a t0223a t0225a t0227a t0228a \\\n\t\tt0229a t0230a t0231a t0232a t0233a t0235a t0236a t0237a t0238a \\\n\t\tt0239a t0250a t0251a t0253a the-default-target\n\n# vim: set ts=8 sw=8 noet :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/README",
    "content": "Read Me(SRecord)                                              Read Me(SRecord)\n\n\n\nNAME\n       SRecord - manipulate EPROM load files\n\nDESCRIPTION\n       The SRecord package is a collection of powerful tools for manipulating\n       EPROM load files.\n\n       I wrote SRecord because when I was looking for programs to manipulate\n       EPROM load files, I could not find very many.  The ones that I could\n       find only did a few of the things I needed.  SRecord is written in C++\n       and polymorphism is used to provide the file format flexibility and\n       arbitrary filter chaining.  Adding more file formats and filters is\n       relatively simple.\n\n   The File Formats\n       The SRecord package understands a number of file formats:\n\n       Ascii-Hex\n               The ascii-hex format is understood for both reading and\n               writing.  (Also known as the ascii-space-hex format.)\n\n       ASM     It is possible, for output only, to produce a serices of DB\n               statements containing the data.  This can be useful for\n               embedding data into assembler programs.  This format cannot be\n               read.\n\n       Atmel Generic\n               This format is produced by the Atmel AVR assembler.  It is\n               understood for both reading and writing.\n\n       BASIC   It is possible, for output only, to produce a serices of DATA\n               statements containing the data.  This can be useful for\n               embedding data into BASIC programs.  This format cannot be\n               read.\n\n       Binary  Binary files can both be read and written.\n\n       B-Record\n               Files in Freescale Dragonball bootstrap b-record format can be\n               read and written.\n\n       C       It is also possible to write a C array declaration which\n               contains the data.  This can be useful when you want to embed\n               download data into C programs.  This format cannot be read.\n\n       COE     The Xilinx Coefficient File Format (.coe) is understood for\n               output only.\n\n       Cosmac  The RCA Cosmac Elf format is understood for both reading and\n               writing.\n\n       DEC Binary\n               The DEC Binary (XXDP) format is understood for both reading and\n               writing.\n\n       Elektor Monitor (EMON52)\n               The EMON52 format is understood for both reading and writing.\n\n       Fairchild Fairbug\n               The Fairchild Fairbug format is understood for both reading and\n               writing.\n\n       Formatted Binary\n               The Formatted Binary format is understood for both reading and\n               writing.\n\n       Four Packed Code (FPC)\n               The FPC format is understood for both reading and writing.\n\n       Hexdump It is possible to get a simple hexdump as output.\n\n       IDT/sim The IDT/sim binary file format is understood for both reading\n               and writing.\n\n       Intel   The Intel hexadecimal format is understood for both reading and\n               writing.  (Also known as the Intel MCS-86 Object format.)\n\n       Intel AOMF\n               The Intel Absolute Object Module Format (AOMF) is understood\n               for both reading and writing.\n\n       Intel 16\n               The Intel hexadecimal 16 format is understood for both reading\n               and writing.  (Also known as the INHX16 file format.)\n\n       LSI Logic Fast Load\n               The LSI Logic Fast Load format is understood for both reading\n               and writing.  Logisim The Logisim format is understood for both\n               reading and writing.  See srec_logisim(5) for more information.\n\n       Memory Initialization Format\n               The Memory Initialization Format (.mem) by Lattice\n               Semiconductor is understood for writing only.\n\n       MIF     The Memory Initialization File format by Altera is supported\n               for both reading and writing.\n\n       MOS Technology\n               The MOS Technology hexadecimal format is understood for both\n               reading and writing.\n\n       MIPS-Flash\n               The MIPS Flash file format is supported for both reading and\n               writing.\n\n       Motorola S-Record\n               The Motorola hexadecimal S-Record format is understood for both\n               reading and writing.  (Also known as the Exorciser, Exormacs or\n               Exormax format.)\n\n       MsBin   The Windows CE Binary Image Data Format is supported both for\n               reading and writing.\n\n       Needham The Needham Electronics ASCII file format is understood for\n               both reading and writing.\n\n       OS65V   The Ohio Scientific hexadecimal format is understood for both\n               reading and writing.\n\n       PPB     The Stag Prom Programmer binary format is understood for both\n               reading and writing.\n\n       PPX     The Stag Prom Programmer hexadecimal format is understood for\n               both reading and writing.\n\n       Signetics\n               The Signetics format is understood for both reading and\n               writing.\n\n       SPASM   The SPASM format is used by a variety of PIC programmers; it is\n               understood for both reading and writing.\n\n       Spectrum\n               The Spectrum format is understood for both reading and writing.\n\n       Tektronix (Extended)\n               The Tektronix hexadecimal format and the Tektronix Extended\n               hexadecimal format are both understood for both reading and\n               writing.\n\n       Texas Instruments Tagged\n               The Texas Instruments Tagged format is understood for both\n               reading and writing (both 8 and 16 bit).  Also known as the TI-\n               tagged or TI-SDSMAC format.\n\n       Texas Instruments ti-txt\n               The TI-TXT format is understood for reading and writing.  This\n               format is used with the bootstrap loader of the Texas\n               Instruments MSP430 family of processors.\n\n       TRS-80  The Radio Shack TRS-80 object file format is understood for\n               reading and writing.\n\n       VHDL    It is possible to write VHDL file.  This is only supported for\n               output.\n\n       Verilog VMEM\n               It is possible to write a Verilog VMEM file suitable for\n               loading with $readmemh().  This format is supported for reading\n               and writing.\n\n       Wilson  The Wilson format is understood for both reading and writing.\n               This mystery format was added for a mysterious type of EPROM\n               writer.\n\n   The Tools\n       The primary tools of the package are srec_cat and srec_cmp.  All of the\n       tools understand all of the file formats, and all of the filters.\n\n       srec_cat\n               The srec_cat program may be used to catenate (join) EPROM load\n               files, or portions of EPROM load files, together.  Because it\n               understands all of the input and output formats, it can also be\n               used to convert files from one format to another.\n\n       srec_cmp\n               The srec_cmp program may be use to compare EPROM load files, or\n               portions of EPROM load files, for equality.\n\n       srec_info\n               The srec_info program may be used to print summary information\n               about EPROM load files.\n\n   The Filters\n       The SRecord package is made more powerful by the concept of input\n       filters.  Wherever an input file may be specified, filters may also be\n       applied to that input file.  The following filters are available:\n\n       bit reverse\n               The bit-reverse filter may be used to reverse the order of bits\n               in each data byte.\n\n       byte swap\n               The byte swap filter may be used to swap pairs of add and even\n               bytes.\n\n       CRC     The various crc filters may be used to insert a CRC into the\n               data.\n\n\n       checksum\n               The checksum filters may be used to insert a checksum\n               into the data.  Positive, negative and bit-not checksums\n               are available, as well as big-endian and little-endian\n               byte orders.\n\n       crop    The crop filter may be used to isolate an input address\n               range, or ranges, and discard the rest.\n\n       exclude The exclude filter may be used to exclude an input\n               address range, or ranges, and keep the rest.\n\n       fill    The fill filter may be used to fill any holes in the\n               data with a nominated value.\n\n       length  The length filter may be used to insert the data length\n               into the data.\n\n       maximum The maximum filter may be used to insert the maximum\n               data address into the data.\n\n       minimum The minimum filter may be used to insert the minimum\n               data address into the data.\n\n       offset  The offset filter may be used to offset the address of\n               data records, both forwards and backwards.\n\n       random fill\n               The random fill filter may be used to fill holes in the\n               data with random byte values.\n\n       split   The split filter may be used to split EPROM images for\n               wide data buses or other memory striping schemes.\n\n       unfill  The unfill filter may be used to make holes in the data\n               at bytes with a nominated value.\n\n       unsplit The unsplit filter may be reverse the effects of the\n               split filter.\n\n       More than one filter may be applied to each input file.\n       Different filters may be applied to each input file.  All\n       filters may be applied to all file formats.\n\nARCHIVE SITE\n       The latest version of SRecord is available on the Web from:\n\n        URL:    http://srecord.sourceforge.net/\n        File:   index.html            # the SRecord page\n        File:   srecord-1.64.README   # Description, from the tar file\n        File:   srecord-1.64.lsm      # Description, LSM format\n        File:   srecord-1.64.spec     # RedHat package specification\n        File:   srecord-1.64.tar.gz   # the complete source\n        File:   srecord-1.64.pdf      # Reference Manual\n\nBUILDING SRECORD\n       Full instructions for building SRecord may be found in the\n       BUILDING file included in this distribution.\n\n       It is also possible to build SRecord on Windows using the Cygwin\n       (www.cygwin.com) or DJGPP (www.delorie.com/djgpp) environments.\n       Instructions are in the BUILDING file, including how to get\n       native Windows binaries.\n\nCOPYRIGHT\n       srecord version 1.64\n       Copyright (C) Scott Finneran <scottfinneran@yahoo.com.au>\n       Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,\n       2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Peter\n       Miller <pmiller@opensource.org.au>\n\n       This program is free software; you can redistribute it and/or\n       modify it under the terms of the GNU General Public License as\n       published by the Free Software Foundation; either version 3 of\n       the License, or (at your option) any later version.\n\n       This program is distributed in the hope that it will be useful,\n       but WITHOUT ANY WARRANTY; without even the implied warranty of\n       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n       GNU General Public License for more details.\n\n       You should have received a copy of the GNU General Public\n       License along with this program. If not, see\n       <http://www.gnu.org/licenses/>.\n\n       It should be in the LICENSE file included with this\n       distribution.\n\nAUTHOR\n       Peter Miller   E-Mail:   pmiller@opensource.org.au\n       /\\/\\*          WWW:      http://miller.emu.id.au/pmiller/\n\nRELEASE NOTES\n       This section details the various features and bug fixes of the\n       various releases.  For excruciating and complete detail, and\n       also credits for those of you who have generously sent me\n       suggestions and bug reports, see the etc/CHANGES.* files.\n\n   Version 1.64 (2014-Jun-22)\n       * Cleaned up a few references to the maintainer's name.\n\n       * Fixed some warnings in test 38\n\n       * Fixed bugs discovered by Mike <russiane39@gmail.com> regarding\n       the formatting of some of the examples where lines were wrapping\n       the wrong way.\n\n       * Added the ability to compile without libgcrypt if the user\n       specifies the option --without-gcrypt to configure. If gcrypt is\n       missing, the user is prompted to either install it or explicitly\n       compile with it disabled.\n\n       * Cleaned up a few recent compiler and doxygen warnings.\n\n       * Added Sourceforge Patch #4 contributed by Stas Sergeev\n       <stsp@sourceforge.net> which contributed get_upper_bound() and\n       makes it and the lower equivalent public (for use from\n       libsrecord).  Also fixed a bug in srec_memory::find_next_chunk()\n       where it would fail to reset the find_next_chunk_index once it\n       became equal to nchunks. After that, find_next_chunk() would\n       always fail.\n\n       * Added prefix and postfix strings to the C Array format which\n       are applied at each end of the data array declaration. This\n       allows the user to add various compiler directives such as\n       location flags or non-standard load address specifiers.\n\n       * when converting from AOMF Fixed Sourceforge bug 11 raised by\n       patryks. In the analysis, it was discovered that a start address\n       (of zero) was being generated when converting from AOMF. AOMF\n       does not support the concept of an execution start address.\n\n       * The Windows build instructions have been updated by Jens\n       Heilig <jens@familie-heilig.net>.\n\n       * Fixed the length field description in extended tektronix\n       documentation. The implementation was already correct.\n\n       * Added a regression test for calculated address for CRC\n       (Sourceforge bug 19).\n\n   Version 1.63 (2014-Apr-07)\n       * The srec_tools now understand how to read and write Logisim\n       formt.\n\n       * Daniel Anselmi <danselmi@gmx.ch> fixed a bug with generating\n       Lattice Memory init files.\n\n       * This change set generalises the code that handles redundant\n       byte settings and contradictory byte settings. The defcon_t type\n       describes what to do: ignore, warn or error.  The --multiple\n       option is no more.\n\n       * Daniel Anselmi <danselmi@gmx.ch> discovered that the \"mem\"\n       output format was malformed. The lines now break every \"width\"\n       bits.\n\n       * Hanspeter Niederstrasser disoverd some false negatives in the\n       test suite, when used on OSX.  Thank you for the bug report.\n       This has been fixed.\n\n       * Simplification of selection code to choose which CRC16\n       implmentation is used.\n\n       * Juliano Mouro Vieira <juliano@utfpr.edu.br> discovered a\n       problem with the srec_mif.5 description. This mistake is not\n       present in the code.\n\n       * Liju Prasanth Nivas (RBEI/ECA1)\n       <Liju.PrasanthNivas@in.bosch.com> suggsted another use case for\n       the examples. In the case of \"joining\" files that are meant to\n       be \"stacked in layers\".  Contributions for the examples are\n       always appreciated. Thank you.\n\n       * Added more comments to the code, so that the use of URL_deode\n       for the command line is better explained. And comment to explain\n       why not to do turl_encode when building header records.\n\n       * Added URL quoting to the command line. There are times you\n       need to be able to insert unprintable characters on the command\n       line. The immediate use case prompting this was a user wanting\n       to put a NUL in the header string. So now you can, as \"%00\". The\n       other choice was quoted printable encoding, but that was a bit\n       obscure.\n\n       * Fixed new warnings when building with g++ 4.8.1\n\n       * Added more links to the windows files on SourceForge, maybe it\n       will boost download numbers.\n\n   Version 1.62 (2013-Jun-05)\n       * Luc Steynen <LucSteynen@edna.be> discovered that the -hecksum-\n         big-endian opion was a counter-intuitive alias for the the\n         -checksum-bitnot-big-endian option.  The -checksum-big-endian\n         option is now deprecated, in favor of the -checksum-bitnot-\n         big-endian option; the code will warn uers of the old option\n         they will need to change.  Ditto little-endian variants\n\n       * Alin Pilkington <apilkington@moog.com> found that the\n         Tektronics Extended format was calculating the record length\n         incorrectory.  Thanks you for the bug report.  This has been\n         fixed for both reading and writing.\n\n       * Dr. Benedikt Schmitt <Benedikt.Schmitt@safeintrain.de>\n         suggested being able to inject arbitrary data into the file\n         header (such as NUL termination characters). This change set\n         adds URL-style escapes (e.g. %25) to the string on he command\n         line. For example: -header or -generate -string\n\n   Version 1.61 (2013-Jan-04)\n       * Izzet Ozcelik <izzetozcelik@cscope.co.uk> discovered a bug in\n         the Tektronix-Extenden format line checksum calculations. The\n         comparison should have been in 8 bits, not int.\n\n       * Daniel Anselmi <danselmi@gmx.ch> contributed a Memory\n         Initialization Format by Lattice Semiconductor, for output\n         only.\n\n       * Daniel Anselmi <danselmi@gmx.ch> contributed a Xilinx\n         Coefficient File Format (.coe) output class.\n\n   Version 1.60 (2012-May-19)\n       * There are now several additional CRC-16 polynomials, plus the\n       ability to select a polynomial by name, rather than by value.\n       See http://en.wikipedia.org/wiki/Cyclic_redundancy_check for a\n       table of names and values.\n\n   Version 1.59 (2012-Feb-10)\n       * A number of additional CRC-16 polynomials have been added, as\n         well as the ability to select a polynomial by name, rather\n         than by value.  See srec_input(1) for more information.\n\n   Version 1.58 (2011-Dec-18)\n       * The -guess command line option, for guessing the file format,\n         now also tells you the command line option you could have used\n         instead of -guess for the exact format.\n\n       * The Intergated Device Technology (IDT) system integration\n         manager (IDT/sim) binary format is now understood for both\n         reading and writing.\n\n       * The Stag Prom Programmer binary format is now supported for\n         both reading and writing.\n\n       * The Stag Prom Programer hexadecimal format is now understood\n         for both reading and writing.\n\n       * The MIPS-Flash fiel format is now supported for both reading\n         and writing.\n\n       * Bernhard Weirich <Bernhard.Weirich@riedel.net> discovered that\n         a backward compatible option had been omitted when the\n         -INtel_16 option was renamed -INtel_HeX_16 to more closely\n         match the usual abbreviation (INHX16) for this format.  The\n         backwards compatible option name has been reintroduced.\n\n       * The windows build instructions have been greatly imptoved,\n         based on the experiences of Jens Heilig <jens@familie-\n         heilig.net> which he has generously shared.\n\n       * The documentation in the manual about sequence warnings has\n         been improved.  The -disable-sequence-warnings option must\n         come before the input file on the command line.  My thanks to\n         Emil Gracic <emil_kruki@yahoo.com> for reporting this problem.\n\n   Version 1.57 (2011-Jun-09)\n       * The byte order of the fletcher16 output has been reversed.\n\n       * The meaning of the -address-length option has been change for\n         the Intel output format. Previously, 2 meant using i16hex\n         20-bit segmented addressing, and >2 meant using i32hex\n         extended addressing. This has been changed: a value of 2\n         requests i8hex 16-bit addressing, a value of 3 requests i16hex\n         20-bit segment addressing, and a value >=4 requests i32hex\n         32-bit addressing.  My thanks to Stephen R. Phillips\n         <srp@CSECorporation.com> for reporting the absence of i8hex\n         support.\n\n       * The -generate -repeat-string option is now able to take a\n         string that looks like a number as the text to be repeated. My\n         thanks to Stephen R. Phillips <srp@CSECorporation.com> for\n         reporting this problem.\n\n       * Luca Giancristofaro <luca.giancristofaro@prosa.com> discovered\n         a WinAVR linker that is a sandwich short of a picnic: it\n         generated non-conforming Intel hex end-of-file records.  This\n         is no longer an error, but only a warning.\n\n       * There were some problems with the RPM spec file, these have\n         been improved.  My thanks to Galen Seitz\n         <galens@seitzassoc.com> for reporting this problem.\n\n   Version 1.56 (2010-Sep-15)\n       * A bug has been fixed in the MsBin output, it now concatenates\n         records correctly, and calaulate checksums appropriately.\n\n       * It is now possible to ask the Fletcher 16 filter to give you a\n         specific answer, and adjusting the checksum to achieve that\n         result. It is also possible to specify different seed values\n         for the sums.\n\n       * There is a new srec_cat -enable=optional-address option to\n         cause output formats capable of omitting addresses, to omit a\n         leading zero address, as those formats usually default the\n         address to zero, if no address information is seen before the\n         first data record.  Defaults to false (disabled).\n\n       * There is a new srec_cat(1) -output-block-packing option, that\n         may be used to pack output records even when they cross\n         internal SRecord boundaries.\n\n       * There is a new srec_cat(1) -output-block-size so that you can\n         specify the block size exactly, rather than implying it with\n         the line length option.\n\n   Version 1.55 (2010-Feb-10)\n       * The Makefile.in has been improved, it now copes with non-\n         standard --prefix options.\n\n       * The rpm.spec file has been improved, it now separates the\n         commands, shared libraries and development files.\n\n   Version 1.54 (2010-Jan-29)\n       * There is now a shared library installed, including the\n         necessary header files so that you can use all of the file\n         formats and filters in your own projects.\n\n       * The license on the shared library code is GNU Lesser General\n         Public License, version 3.0 or later.\n\n       * The code can cope with older versions of GNU Libgcrypt.  In\n         the case of very old versions, by ignoring it.\n\n       * A number of build problems have been fixed.\n\n   Version 1.53 (2009-Nov-10)\n       * There is a new MsBin (Windows CE Binary Image Data) file\n         format, supported for both reading and writing.\n\n       * The lintian(1) warning about hyphen in the manual pages has\n         been silenced, by careful use of -, - and - as appropriate.\n         Sure makes some of the sources ugly, tho.  The lintian(1)\n         warning about the undefined .XX macro has been silenced, by\n         making it conditional.\n\n       * The code will build without libgcrypt.\n\n   Version 1.52 (2009-Sep-17)\n       * There is a new srec_cat -generator -l-e-constant data\n         generator (and also -b-e-const) that may be used to insert\n         multi-byte constants into your data.  See srec_input(1) for\n         more information.\n\n   Version 1.51 (2009-Sep-13)\n       * A number of gcc 4.4 build problems have been fixed.\n\n       * A bugs has been fixed in the Intel output format. When using\n         the segemented format (address-length=2) records that span the\n         end of segment boundary are tricky. The code now carefully\n         splits such output records, to ensure the two parts are\n         explicitly placed into separate segments.\n\n   Version 1.50 (2009-Jul-09)\n       * The CRC16 code has been enhanced to provide low-to-high bit\n         order, in addition to the previous high-to-low bit order.  It\n         is also possible to specify the polynomial, with the default\n         the CCITT standard polynomial, as was in the previous code.\n         See srec_input(1) for more information.\n\n       * The MD5, RipeMD-160, SHA1, SHA224, SHA256, SHA384, SHA 512 and\n         Whirlpool message digests are now supported.  See\n         srec_input(1) for more information.\n\n       * There is a new srec_cat -bit-reverse filter, that may be used\n         to reverse the bits in each data byte.  See srec_input(1) for\n         more information.\n\n   Version 1.49 (2009-May-17)\n       * A typo in the srec_input(1) man page has been fixed.\n\n   Version 1.48 (2009-Apr-19)\n       * There are new Fletcher Checksum filters, both 32-bits and\n         16-bits, both little-endian and big-endian.\n\n       * There are new Adler Checksum filters, both 32-bits and\n         16-bits, both little-endian and big-endian.\n\n   Version 1.47 (2009-Feb-19)\n       * Memory Initialzation File (MIF) format by Altera is now\n         supported for reading and writing.\n\n   Version 1.46 (2009-Jan-13)\n       * There is a new option for the --x-e-length filters, they can\n         now accept a width, and this is divided into the byte lenght,\n         so that you can insert the length in units of words (2) or\n         longs (4).\n\n       * Some small corrections have been made to the documentation.\n\n       * The -minimum and -maximum options have been renamed -minimum-\n         address and -maximum-address, to avoid a command line grammar\n         syntax problem.\n\n   Version 1.45 (2008-Sep-30)\n       * A bug has been fixed in the srec_cat(1) command.  You are now\n         able to specify several inputs within parentheses, instead of\n         just one.  This allows filters to be applied to the\n         concatenation of several inputs.\n\n       * The srec_cat(1) command is now able to write FORTH output.\n\n   Version 1.44 (2008-Aug-29)\n       * Some compilers issue a warning when const appears before\n         extern.  \"warning: storage class is not first\".  The C output\n         has been updated to conform to this expectation.\n\n       * The manual page for srec_cat(1) has been enhanced to describe\n         the in-memory data model, and the resulting output data order.\n\n       * The -motorola optional width argument now produces a better\n         error message when it is out of range.\n\n       * The -fill filter now checks the size, and fails for absurdly\n         large fills, with a -big override if they really want >1GB\n         fills.\n\n       * A bug in the .spec file for rpmbuild has been fixed, it now\n         takes notice of $RPM_BUILD_ROOT\n\n       * There is a new -line-termination option, which may be used to\n         select the desired line termination of output text files.\n\n   Version 1.43 (2008-Jul-06)\n       * The srec-cat -data-only option has been broken down into four\n         separate controls.  It is now possible to -enable and -disable\n         individual features, such as \"header\", \"data-count\",\n         \"execution-start-address\" and \"footer\".  See srec_cat(1) for\n         more information.\n\n       * The srec_cat -start-address option has been renamed\n         -execution-start-address to remove any confusion with the\n         -offset filter.  The documentation now explicitly explains the\n         difference between the two.\n\n       * Examples of converting to and from binary files have been\n         added to the srec_examples(1) man page.\n\n       * A bug has been fixed in the MOS Tech format, it now emits an\n         end record even when there is no execution start address\n         passed in.\n\n   Version 1.42 (2008-Jun-01)\n       * The MOS Technology format was not reading and writing end\n         records correctly, this has been fixed.  The name of the\n         company has been corrected.\n\n       * Some examples of how to insert constant or scripted data into\n         your EPROM load files have been added to the srec_examples(1)\n         man page.\n\n   Version 1.41 (2008-May-12)\n       * False negative being reported by tests on Cygwin have been\n         fixed.\n\n       * There are six new filters (-be-exclusive-length, -le-\n         exclusive-length, -be-exclusive-maximum, -le-exclusive-\n         maximum, -be-exclusive-minimum and -le-exclusive-minimum)\n         which are very similar to their non-exclusive equivalents,\n         except that they do not include the adress range covered by\n         their output in their output.\n\n       * A bug has been fixed in the C word-array output.  It was\n         getting offsets and lengths wrong in some cases.\n\n       * A bug has been fixed in the generated C array header file, it\n         no longer omits the section descriptor arrays.\n\n       * A problem with building RPM packages with the names of the\n         executables in the .spec file has been fixed, and the\n         BuildRequires has been updated.\n\n   Version 1.40 (2008-Mar-13)\n       * An RPM build problem has been fixed.\n\n       * The dependency on the Boost library is now documented in the\n         BUILDING file.\n\n       * Some build problems with g++ 4.3 have been fixed\n\n       * A bug has been fixed in the calculation of ranges on the\n         command line, it no longer goes into an infinite loop for\n         \"-fill 0xFF -over { foo.hex -exclude -within foo.hex }\"\n         construct, which should have been calculating an empty fill\n         set, but was instead calculating a 4GB fill set.\n\n       * The CRC32 filters now take an -xmodem option, to use an\n         xmodem-like (all bit zero) initial state, rather than the\n         default CCITT (all bits on) initial state.\n\n   Version 1.39 (2008-Feb-04)\n       * A bug has been fixed in the use of parentheses to group\n         filters and override the default precedences.\n\n   Version 1.38 (2008-Jan-14)\n       * The CRC16 filters now support a -Broken option, to perform a\n         common-but-broken CRC16 calculation, in addition to the CCITT\n         and XMODEM calculations.\n\n       * A link has been added to the CRC16 man page section to the\n         www.joegeluso.com/software/articles/ccitt.htm web page, to\n         explain the difficulties in seeding CRC16 calculations.\n\n       * A buglet has been fixed in the srec_motorola(5) man page, it\n         now includes S6 in the list of things that can appear in the\n         type field.\n\n       * The ability to negate expressions is now mentioned in the\n         srec_examples(1) man page.\n\n   Version 1.37 (2007-Oct-29)\n       * It is now possible to have negative expressions on the command\n         line, to facilitate \"--offset - -minimum foo\" usages.\n\n       * The srec_cat(1) command now has a simple hexadecimal dump\n         output format.\n\n       * The use of uudecode(1) in the tests has been removed, so\n         sharutils is no longer a build dependency.\n\n   Version 1.36 (2007-Aug-07)\n       * A bug has been fixed in the CRC-16 CCITT calculation; the\n         algorithm was correct but the start value was incorrect,\n         leading to incorrect results.\n\n       * The CRC16 filters have a new --no-augment option, to omit the\n         16 zero bits augmenting the message.  This is not CCITT\n         standard conforming, but some implementations do this.\n\n       * A problem has been fixed in the generated Makefile.in file\n         found in the tarball.\n\n       * The license has been changed to GNU GPL version 3.\n\n   Version 1.35 (2007-Jun-23)\n       * A major build problem with the generated makefile has been\n       fixed.\n\n   Version 1.34 (2007-Jun-22)\n       * The C and ASM output formats have been improved in the word\n         mode.\n\n       * Several build problems have been fixed.\n\n   Version 1.33 (2007-May-18)\n       * More examples have been added to the documentation.\n\n       * It is now possible to perform set intersection and set\n         difference on address ranges on the command line.\n\n       * There is a new category of data source: generators.  You can\n         generate constant data, random data and repeating data.\n\n       * The assembler and C-Array outputs now support additional\n         options to facilitate MSP430 systems.  They can also\n         optionally write shorts rather than bytes.\n\n       * You can now round address ranges on the command line to be\n         whole multiples of a number of bytes.\n\n   Version 1.32 (2007-Apr-24)\n       * The TI-TXT format output has been improved; it is less spec\n         conforming but more reality conforming.  It now allows odd\n         alignment without padding.  It also ends with a q instead of a\n         Q.\n\n       * The warning for odd input addresses has been dropped.  The\n         spec didn't like them, but the MSP430 handles them without a\n         hiccup.\n\n   Version 1.31 (2007-Apr-03)\n       * The Verilog format now suppresses comments when you specify\n         the --data-only option.\n\n       * The Texas Instruments ti-txt (MSP430) format is now understood\n         for reading and writing.\n\n   Version 1.30 (2007-Mar-21)\n       * The ascii-hex output format has been improved.\n\n       * The ti-tagged 16-bit format is now understood for reading and\n         writing.\n\n       * The Intel format no longer warns about missing optional\n         records.\n\n       * A bug in the ti-tagged format has been fixed, it now\n         understands the '0' tag.\n\n   Version 1.29 (2007-Mar-13)\n       * A serious bug has been fixed in the generated Makefile.\n\n   Version 1.28 (2007-Mar-08)\n       * It is now possible to read and write files in the Freescale\n         MC68EZ328 Dragonball bootstrap b-record format\n\n   Version 1.27 (2006-Dec-21)\n       * [SourceForge Feature Request 1597637] There is a new warning\n         issued when input data records are not in strictly ascending\n         address order.  There is a new command line option to silence\n         the warning.\n\n       * [SourceForge  Feature Request 1592348] The command line\n         processing of all srecord commands now understands @file\n         command line options, filled with additional space separated\n         strings witch will be treated as of they were command line\n         options.  This gets around absurdly short command line length\n         limits in some operating systems.\n\n   Version 1.26 (2006-May-26)\n       * It is now possible to place parentheses on the command line in\n         more places to clarify your intent.\n\n       * This change prepares SRecord for the next public release.\n\n   Version 1.25 (2006-May-18)\n       * The assembler output has been enhanced to produce ORG\n         directives, if necessary, to change the data address.\n\n       * The srec_cat(1) command now only writes an execution start\n         address into the output if there was an execution start\n         address present in the input.\n\n   Version 1.24 (2006-Mar-08)\n       * Additional information has been added to the lseek error when\n         they try to seek to addresses >= 2**31\n\n       * The CRC 16 filters have been enhanced to accept an argument to\n         specify whether CCITT or XMODEM calculations are to be\n         performed.\n\n   Version 1.23 (2005-Sep-23)\n       * A segfault has been fixed on x86_64 when running the\n         regression test suite.\n\n       * A compile problem with the lib/srec/output/file/c.cc file has\n         been fixed.\n\n   Version 1.22 (2005-Aug-12)\n       * The -byte-swap filter now has an optional width argument, to\n         specify the address width to swap.  The default is two bytes.\n\n       * The motorola file format now accepts an additional 'width'\n         command line argument, so you can have 16-bit and 32-bit\n         address multiples.\n\n       * A bug has been fixed in the VMEM output format. It was failing\n         to correctly set the next address in some cases.  This fixes\n         SourceForge bug 1119786.\n\n       * The -C-Array output format now uses the const keyword by\n         default, you can turn it off with the -no-const option.  The\n         -C-Array output format can now generate an additional include\n         file if you use the -INClude option.  This answers SourceForge\n         feature request 942132.\n\n       * A fix for the \"undefined symbols\" problem when using g++ 3.x\n         on Cygwin and MacOsX has been added to the ./configure script.\n\n       * There is a new -ignore-checksum command line option.  The\n         -ignore-checksums option may be used to disable checksum\n         validation of input files, for those formats which have\n         checksums at all.  Note that the checksum values are still\n         read in and parsed (so it is still an error if they are\n         missing) but their values are not checked.\n\n   Version 1.21 (2005-Feb-07)\n       * More Doxygen comments have been added to the class header\n         files.\n\n       * There is a new srec_cat --crlf option, which may be used for\n         force CRLF output on operating systems which don't use that\n         style of line termination.\n\n       * A number of problems with GCC, particularly with the early 3.x\n         series.\n\n       * There is a new \"Stewie\" format, an undocumented format loosely\n         based on the Motorola S-Record format, apparently used in\n         mobile phones.  More information would be most welcome.\n\n       * A number of build problems have been fixed.\n\n   Version 1.20 (2004-Feb-08)\n       * The AOMF format now accepts (and ignores) more record types.\n\n   Version 1.19 (2004-Jan-03)\n       * It is now possible to set the execution start address in the\n         output using the srec_cat -Execution_Start_Address command\n         line option.\n\n       * The Intel Absolute Object Module Format (AOMF) is now\n         supported for reading and writing.\n\n       * There is a new srec_cat -Random_Fill filter, like the srec_cat\n         -Fill filter except that it uses random values.\n\n   Version 1.18 (2004-Jan-01)\n       * The VMEM format is now able to output data for 64 and 128 bits\n         wide memories.\n\n       * A bug in the SRecord reference manuals has been fixed; the\n         CRCxx had a copy-and-paste glitch and always said big-endian\n         where little endian was intended half the time.\n\n   Version 1.17 (2003-Oct-12)\n       * There is now support for Intel Extended Segment addressing\n         output, via the --address-length=2 option.\n\n       * There is now support for output of Verilog VMEM format.  See\n         srec_vmem(5) for more information.\n\n       * There is now support for reading and writing the INHX16\n         format, used in various PIC programmers.  It looks just like\n         the Intel Hex format, except that the bytes counts and the\n         addresses refer to words (hi,lo) rather than bytes.  See\n         srec_intel16(5) for more information.\n\n   Version 1.16 (2003-Jul-28)\n       * Some updates have been made to cope with GCC 3.2\n\n   Version 1.15 (2003-Jun-16)\n       * The ASCII-Hex implementation is now slightly more complete.  I\n         still haven't found a definitive description.\n\n       * The Fairchild Fairbug format has been added for reading and\n         writing.  See srec_fairchild(5) for more information.\n\n       * The Spectrum format has been added for reading and writing.\n         See srec_spectrum(5) for more information.\n\n       * The Formatted Binary format has been added for reading and\n         writing.  See srec_formatted_binary(5) for more information.\n\n       * The RCA Cosmac Elf format has been added for reading and\n         writing.  See srec_cosmac(5) for more information.\n\n       * The Needham EMP programmer format has been added for reading\n         and writing.  See srec_needham(5) for more information.\n\n   Version 1.14 (2003-Mar-11)\n       * Numerous fixes have been made to header handling.  It is now\n         possible to specify an empty header with the -header command\n         line option.\n\n       * Some more GCC 3.2 build problems have been fixed.\n\n   Version 1.13 (2003-Feb-05)\n       * Bugs have been fixed in the Texas Instruments Tagged and VHDL\n         formats, which produced inconsistent output.\n\n       * A couple of build problems have been fixed.\n\n       * There are two new output formats for ASM and BASIC.\n\n   Version 1.12 (2002-Dec-06)\n       * It is now possible to put -minimum input.spec (also -maximum\n         and -length) almost anywhere on the command line that you can\n         put a number.  It allows, for example, the -offset value to be\n         calculated from the maximum of the previous file.  The values\n         calculated by -Minimum, -Maximum and -Length may also be\n         rounded to arbitrary boundaries, using -Round_Down,\n         -Round_Nearest and -Round_Up.\n\n       * The malformed Motorola S5 records output by the Green Hills\n         tool chain are now understood.\n\n   Version 1.11 (2002-Oct-21)\n       * The Ohio Scientific OS65V audio tape format has been added for\n         reading and writing.  See srec_os65v(5) for more information.\n\n       * Some build problems have been fixed.\n\n   Version 1.10 (2002-Jun-14)\n       * The Intel format now emits the redundant extended linear\n         address record at the start of the file; some loaders couldn't\n         cope without it.\n\n       * The Binary format now copes with writing to pipes.\n\n       * The Motorola format now understands the S6 (24-bit data record\n         count) records for reading and writing.\n\n       * The DEC Binary format now works correctly on Windows machines.\n\n       * The LSI Logic Fast Load format is now understood for both\n         reading and writing.  See srec_fastload(5) for more\n         information.\n\n   Version 1.9 (2001-Nov-27)\n       * The DEC Binary (XXDP) format is now understood for both\n         reading and writing.  See srec_dec_binary(5) for more\n         information.\n\n       * The Elektor Monitor (EMON52) format is now understood for both\n         reading and writing.  See srec_emon52(5) for more information.\n\n       * The Signetics format is now understood for both reading and\n         writing.  See srec_signetics(5) for more information.\n\n       * The Four Packed Code (FPC) format is now understood for both\n         reading and writing.  See srec_fpc(5) for more information.\n\n       * Wherever possible, header data is now passed through by\n         srec_cat(1).  There is also a new srec_cat -header option, so\n         that you can set the header comment from the command line.\n\n       * The Atmel Generic format for Atmel AVR programmers is now\n         understood for both reading and writing.  See\n         srec_atmel_generic(5) for more information.\n\n       * The handling of termination records has been improved.  It\n         caused problems for a number of filters, including the -fill\n         filter.\n\n       * A bug has been fixed in the checksum calculations for the\n         Tektronix format.\n\n       * There is a new SPASM format for PIC programmers.  See\n         srec_spasm(5) for more information.\n\n   Version 1.8 (2001-Apr-20)\n       * There is a new \"unfill\" filter, which may be used to perform\n         the reverse effect of the \"fill\" filter.\n\n       * There is a new bit-wise NOT filter, which may be used to\n         invert the data.\n\n       * A couple of bugs have been fixed in the CRC filters.\n\n   Version 1.7 (2001-Mar-19)\n       * The documentation is now in PDF format.  This was in order to\n         make it more accessible to a wider range of people.\n\n       * There is a new srec_cat --address-length option, so that you\n         can set the length of the address fields in the output file.\n         For example, if you always want S3 data records in a Motorola\n         hex file, use the --address-length=4 option.  This helps when\n         talking to brain-dead EPROM programmers which do not fully\n         implement the format specification.\n\n       * There is a new --multiple option to the commands, which\n         permits an input file to contain multiple (contradictory)\n         values for some memory locations.  The last value in the file\n         will be used.\n\n       * A problem has been fixed which stopped SRecord from building\n         under Cygwin.\n\n       * A bug has been fixed in the C array output.  It used to\n         generate invalid output when the input had holes in the data.\n\n   Version 1.6 (2000-Dec-03)\n       * A bug has been fixed in the C array output.  (Holes in the\n         input caused an invalid C file to be produced.)\n\n       * There is are new CRC input filters, both 16-bit and 32-bit,\n         both big and little endian.  See srec_cat(1) for more\n         information.\n\n       * There is a new VHDL output format.\n\n       * There are new checksum filters: in addition to the existing\n         one's complement (bit not) checksum filter, there are now\n         negative and positive checksum filters.  See srec_cat(1) for\n         more information.\n\n       * The checksum filters are now able to sum over 16-bit and\n         32-bit values, in addition to the existing byte sums.\n\n       * The srec_cmp program now has a --verbose option, which gives\n         more information about how the two inputs differ.  See\n         srec_cmp(1) for more information.\n\n   Version 1.5 (2000-Mar-06)\n       * There is now a command line option to guess the input file\n         format; all of the tools understand this option.\n\n       * The \"MOS Technologies\" file format is now understood for\n         reading and writing.  See srec_mos_tech(5) for more\n         information.\n\n       * The \"Tektronix Extended\" file format is now understood for\n         reading and writing.  See srec_tektronix_extended(5) for more\n         information.\n\n       * The \"Texas Instruments Tagged\" file format is now understood\n         for reading and writing.  (Also known as the TI-Tagged or\n         SDSMAC format.)  See srec_ti_tagged(5) for more information.\n\n       * The \"ascii-hex\" file format is now understood for reading and\n         writing.  (Also known as the ascii-space-hex format.)  See\n         srec_ascii_hex(5) for more information.\n\n       * There is a new byte swap input filter, allowing pairs of odd\n         and even input bytes to be swapped.  See srec_cat(1) for more\n         information.\n\n       * The \"wilson\" file format is now understood for reading and\n         writing.  This mystery format was added for a mysterious type\n         of EPROM writer.  See srec_wilson(5) for more information.\n\n       * The srec_cat program now has a -data-only option, which\n         suppresses all output except for the data records.  This helps\n         when talking to brain-dead EPROM programmers which barf at\n         anything but data.  See srec_cat(1) for more information.\n\n       * There is a new -Line-Length option for the srec_cat program,\n         allowing you to specify the maximum width of output lines.\n         See srec_cat(1) for more information.\n\n   Version 1.4 (2000-Jan-13)\n       * SRecord can now cope with CRLF sequences in Unix files.  This\n         was unfortunately common where the file was generated on a PC,\n         but SRecord was being used on Unix.\n\n   Version 1.3 (1999-May-12)\n       * A bug has been fixed which would cause the crop and exclude\n         filters to dump core sometimes.\n\n       * A bug has been fixed where binary files were handled\n         incorrectly on Windows NT (actually, any system in which text\n         files aren't the same as binary files).\n\n       * There are three new data filters.  The --OR filter, which may\n         be used to bit-wise OR a value to each data byte; the --AND\n         filter, which may be used to bit-wise AND a value to each data\n         byte; and the --eXclusive-OR filter, which may be used to bit-\n         wise XOR a value to each data byte.  See srec_cat(1) for more\n         information.\n\n   Version 1.2 (1998-Nov-04)\n       * This release includes file format man pages.  The web page\n         also includes a PostScript reference manual, containing all of\n         the man pages.\n\n       * The Intel hex format now has full 32-bit support.  See\n         srec_intel(5) for more information.\n\n       * The Tektronix hex format is now supported (only the 16-bit\n         version, Extended Tektronix hex is not yet supported).  See\n         srec_tektronix(5) for more information.\n\n       * There is a new split filter, useful for wide data buses and\n         memory striping, and a complementary unsplit filter to reverse\n         it.  See srec_cat(1) for more information.\n\n   Version 1.1 (1998-Mar-22)\n       First public release.\n\n\n\nReference Manual                    SRecord                   Read Me(SRecord)\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/RELEASE",
    "content": "Release(SRecord)                                                Release(SRecord)\n\nNAME\n       How to release SRecord\n\nORIGIN\n       Peter Miller's release instructions\n\nCOMPLETE CURRENT BRANCH DEVELOPMENT\n       When making a release, I create the next branch.\n       For example if the current branch is 1.62, then I would aenbr 1.63\n\n       develop end the current branch\n            aede -p srecord.1 -c 62\n\n       note it is awaiting integration\n            aefinish -p srecord.1 -c 62\n\n       then re-arrange the shortcut\n\n            aegis -remove-project-alias srecord.cur\n            segis -new-projet-alias srecord-1.63 srecord.cur\n            ae_p srecord.cur\n\nUPDATING THE CHANGE LOG\n       tkenc to create change 10.\n       aedb 10\n       aecd 10\n       aenf etc/new.1.63.so\n\n       This will have a useful content example.\n       But we are using post-ordered releases (e. 1.62.D099 < 1.63) so we go\n       back and clean up the release note for the previous branch\n\n            aecp etc/new.62.so\n\n       There is a command in the file, which is useful for seeding the initial\n       change log entries.\n       Edit to taste.\n       1. Tridge suggests always acknowledge contributors, and including their\n          email address.\n       2. Lately I have written the not-brief description for change sets so\n          that they read well as changelog entries\n          (\"There is a new srec_cat -example option, that may be used to ...\")\n\n\n       now build and check that that\n                less archive/change_log.txt\n       reads well.  the same information is available in the refence manual,\n\n                evince arhive/srecord-*.pdf\n\nUPDATE SOURCEFORGE AND WEBSITE\n       The \"archive\" directory is actually the new contents of the web site.\n       Later you use the rsync command to send it there.\n\n       finish development and integrate\n           aefinish && aefinish && cd\n\n       WE actually release 1.63.D001.\n\n       My /home partition has a user called archives that owns all my projects\n\n           cd /home/arhives/srecord\n\n       now we update the aegis.repo on sf.net\n\n           ./rsync-sourceorge\n              (the name could be changed to be more informative, if you like)\n\n           ./rsync-web-site\n\n       This does what it says, but also uses rsync to the sf.net download\n       facility.\n\nUPDATING LAUNCHPAD\n       Thirdly it invokes ppa.sh to upload change sets to launchpad-ppa you may\n       need to customize these scripts for your SF or LP account.\n\n       A note about ppa.sh\n\n       I put ~pm~ into the version number, so that the ppa source of the\n       package is clear, in the \"dpkg -l\" output.\n\n       Lastly I have a /home/archives/ubuntu.release.names file that contains\n       the constantly changing list of supported PPA release names.  Shared\n       across a whole bunch of projects.\n\n\n       If you ever want to check the debian packaging:\n\n          cook debian-package\n\n       or\n\n          cook integration-build-targets if you want to see what the archive/\n          directory (new web site) looks like.\n\nUSEFUL TOOLS\n       You can get tardy from my LP PPA\n           https://launchpad.net/~pmiller-opensource/+archive/ppa\n\n       In my junkyard project/package is a mountain of crap\n       Incluing\n           copfix $(slecf)\n                for updating the copyright notices in source files\n\n           fix-white-space $(aelcf)\n                for getting rid of trailing white space\n\n           fix-vim-mode-lines $(aelcf)\n                the last line of the source files set the buffer's mode.\n\n       The bleeding edge Aegis package repo is at\n           https://launchpad.net/~pmiller-opensource/+archive/aegis\n           think of it as a rolling release candidate.\n\nCOPYRIGHT\n        This file is Copyright (C) 2014 Peter Miller & Scott Finneran\n\n        The SRecord package is distributed in the hope that it will be useful,\n        but WITHOUT ANY WARRANTY; without even the implied warranty of\n        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n        General Public License for more details.\n\n        It should be in the LICENSE file included with this distribution.\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf",
    "content": "/*\n *      srecord - manipulate eprom load files\n *      Copyright (C) 1998-2000, 2006-2010 Peter Miller\n *\n *      This program is free software; you can redistribute it and/or modify\n *      it under the terms of the GNU General Public License as published by\n *      the Free Software Foundation; either version 3 of the License, or\n *      (at your option) any later version.\n *\n *      This program is distributed in the hope that it will be useful,\n *      but WITHOUT ANY WARRANTY; without even the implied warranty of\n *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *      GNU General Public License for more details.\n *\n *      You should have received a copy of the GNU General Public License\n *      along with this program. If not, see\n *      <http://www.gnu.org/licenses/>.\n */\n\nconfiguration_directory = \"aegis.conf.d\";\n\n\n/*\n * whenever files are added to or removed from the change,\n * execute the following command.\n *\n * The project files are wiped, too, because a removed file will alter\n * the project file list.\n */\nchange_file_command = \"rm -f etc/cook/change_files.* etc/cook/project_files.*\";\nproject_file_command = \"rm -f etc/cook/project_files.*\";\n\ndevelop_begin_command = \"ln -s $bl bl\";\n\n/*\n * Remove these files before we start integrating, to ensure that they\n * will be rebuild containing the correct version information.\n */\nintegrate_begin_command =\n    \"rm -f \"\n    \".cook.fp \"\n    \"etc/cook/change_files* \"\n    \"etc/cook/project_files* \"\n    \"etc/new.so \"\n    \"etc/version.so \"\n    \"lib/lib.h\"\n    ;\n\nsymlink_exceptions =\n[\n    \".cook.fp\",\n    \"etc/new.so\",\n    \"etc/version.so\",\n    \"lib/patchlevel.h\",\n    \"install-sh\",\n];\n\nmaximum_filename_length = 30;\n\nfilename_pattern_reject = [ \"*.[cC]\", \"*.[cC]++\" ];\n\nproject_specific =\n[\n    {\n    name = \"html:body-begin\";\n    value =\n        @<a href=\"http://srecord.sourceforge.net/\"> <img\n        src=\"http://srecord.sourceforge.net/srecord-64.png\" align=left\n        border=0></a><a href=\"http://srecord.sourceforge.net/\"><img\n        src=\"http://srecord.sourceforge.net/srecord-64.png\" align=right\n        border=0></a>@;\n    },\n];\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/aede-policy",
    "content": "#\n# srecord - The \"srecord\" program.\n# Copyright (C) 2007, 2009-2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\ndevelop_end_policy_command = \"aede-policy -p $project -c $change\";\n\nproject_specific =\n[\n    {\n        name = \"aede-policy\";\n        value =\n            \"authors \"\n            \"comments \"\n            \"copyright \"\n            \"crlf \"\n            \"description \"\n            \"escape-hyphen \"\n            \"fsf-address \"\n            \"gpl-version \"\n            \"line-length \"\n            \"merge-fhist \"\n            \"merge-rcs \"\n            \"no-tabs \"\n            \"printable \"\n            \"text \"\n            \"vim-mode \"\n            \"white-space\"\n            ;\n    },\n];\n\nunchanged_file_develop_end_policy = error;\nunchanged_file_integrate_pass_policy = warning;\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/aemakegen",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009-2011, 2014 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nproject_specific =\n[\n    {\n        name = \"aemakegen:libtool\";\n        value = \"true\";\n    },\n    {\n        name = \"aemakegen:libtool-la\";\n        value = \"false\";\n    },\n    {\n        name = \"aemakegen:version-info\";\n        value = \"0:0:0\";\n    },\n    {\n        name = \"aemakegen:library-directory\";\n        value = \"srecord\";\n    },\n    {\n        name = \"aemakegen:debian:build-depends\";\n        value = \"groff, libboost-dev, libgcrypt11-dev\";\n    },\n    {\n        name = \"aemakegen:rpm-spec:build-requires\";\n        value = \"groff, boost-devel, libgcrypt-devel\";\n    },\n    {\n        name = \"aemakegen:debian:copyright\";\n        value = \"false\";\n    },\n    {\n        name = \"aemakegen:debian:description:srecord\";\n        value =\n            \"A collection of powerful tools for manipulating EPROM load files\";\n    },\n    {\n        name = \"aemakegen:debian:extended-description:srecord\";\n        value =\n@The srecord package is a collection of powerful tools for manipulating EPROM\nload files. It reads and writes numerous EPROM file formats, and can perform\nmany different manipulations.\n\nThe tools include:\n * The srec_cat program may be used to catenate (join) EPROM load files, or\n   portions of EPROM load files, together. Because it understands all of the\n   input and output formats, it can also be used to convert files from one\n   format to another. It also understands filters.\n * The srec_cmp program may be used to compare EPROM load files, or portions\n   of EPROM load files, for equality.\n * The srec_info program may be used to print summary information about EPROM\n   load files.@;\n    },\n    {\n        name = \"aemakegen:rpm-spec:description:srecord\";\n        value =\n@The srecord package is a collection of powerful tools for manipulating EPROM\nload files. It reads and writes numerous EPROM file formats, and can perform\nmany different manipulations.@;\n    },\n    {\n        name = \"aemakegen:debian:extended-description:libsrecord\";\n        value =\n@This package is a collection of powerful C++ classes for manipulating EPROM\nload files. It reads and writes numerous EPROM file formats, and can perform\nmany different manipulations.@;\n    },\n    {\n        name = \"aemakegen:rpm-spec:description:srecord-libs\";\n        value =\n@This package contains the shared libraries for programs that manipulate EPROM\nload files.@;\n    },\n    {\n        name = \"aemakegen:rpm-spec:description:srecord-devel\";\n        value =\n@This package contains static libraries and header files for compiling programs\nthat manipulate EPROM load files.@;\n    },\n    {\n        name = \"aemakegen:debian:homepage\";\n        value = \"http://srecord.sourceforge.net\";\n    },\n    {\n        name = \"aemakegen:debian:maintainer\";\n        value = \"Scott Finneran <scottfinneran@yahoo.com.au>\";\n    },\n    {\n        name = \"aemakegen:debian:priority\";\n        value = \"extra\";\n    },\n    {\n        name = \"aemakegen:debian:section\";\n        value = \"utils\";\n    },\n];\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/architecture",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\narchitecture =\n[\n    {\n        name = \"linux-x86_64\";\n        pattern = \"Linux*86_64*\";\n    },\n];\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/build",
    "content": "#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2010, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\n\n/*\n * The build_command field of the config file is used to invoke the relevant\n * build command.  The following command tells cook where to find the recipes.\n * The ${s howto.cook} expands to a path into the baseline during development\n * if the file is not in the change.  Look in aesub(5) for more information\n * about command substitutions.\n */\nbuild_command =\n    \"cook -b ${s etc/howto.cook} \"\n    \"project=$p \"\n    \"change=$c \"\n    \"version=$v \"\n    \"arch=$arch \"\n    \"-nl \"\n    \"search_path=$search_path\"\n    ;\n\n/*\n * The recipes in the User Guide will all remove their targets before\n * constructing them, which qualifies them to use the following entry in the\n * config file.  The targets MUST be removed first if this field is true,\n * otherwise the baseline would cease to be self-consistent.\n */\nlink_integration_directory = true;\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/debian",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009-2011, 2014 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nproject_specific =\n[\n    {\n        name = \"aemakegen:debian:maintainer\";\n        value = \"Scott Finneran <scottfinneran@yahoo.com.au>\";\n    },\n    {\n        name = \"aemakegen:debian:section\";\n        value = \"devel\";\n    },\n    {\n        name = \"aemakegen:debian:priority\";\n        value = \"optional\";\n    },\n    {\n        name = \"aemakegen:debian:description:srecord\";\n        value =\n            \"collection of powerful tools for manipulating EPROM load files\";\n    },\n    {\n        name = \"aemakegen:debian:extended-description:srecord\";\n        value =\n\"The srecord package is a collection of powerful tools for manipulating\\n\\\nEPROM load files. It reads and writes numerous EPROM file formats, and\\n\\\ncan perform many different manipulations.\\n\\\n.\\n\\\nThe tools include:\\n\\\n * The srec_cat program may be used to catenate (join) EPROM load files, or\\n\\\n   portions of EPROM load files, together. Because it understands all of the\\n\\\n   input and output formats, it can also be used to convert files from one\\n\\\n   format to another. It also understands filters.\\n\\\n * The srec_cmp program may be used to compare EPROM load files, or portions\\n\\\n   of EPROM load files, for equality.\\n\\\n * The srec_info program may be used to print summary information about EPROM\\n\\\n   load files.\";\n    },\n    {\n        name = \"aemakegen:debian:homepage\";\n        value = \"http://srecord.sourceforge.net/\";\n    },\n    {\n        name = \"aemakegen:debian:dm-upload-allowed\";\n        value = \"true\";\n    },\n    {\n        name = \"aemakegen:debian:build-depends\";\n        value = \"libboost-dev, libgcrypt11-dev, groff\";\n    },\n];\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/diff",
    "content": "#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\n/*\n * Compare two files using fcomp.  The -w option produces an output of the\n * entire file, with insertions an deletions marked by \"change bars\" in the\n * left margin.  This is superior to context difference, as it shows the entire\n * file as context.  The -s option could be added to compare runs of white\n * space as equal.\n *\n * This command is used by aed(1) to produce a difference listing when file in\n * the development directory was originally copied from the current version in\n * the baseline.\n *\n * All of the command substitutions described in aesub(5) are available.\n * In addition, the following substitutions are also available:\n *\n * ${ORiginal}\n *      The absolute path name of a file containing the version originally\n *      copied.  Usually in the baseline.\n * ${Input}\n *      The absolute path name of the edited version of the file.  Usually in\n *      the development directory.\n * ${Output}\n *      The absolute path name of the file in which to write the difference\n *      listing.  Usually in the development directory.\n *\n * An exit status of 0 means successful, even of the files differ (and they\n * usually do).  An exit status which is non-zero means something is wrong.\n *\n * The non-zero exit status may be used to overload this command with extra\n * tests, such as line length limits.  The difference files must be produced\n * in addition to these extra tests.\n */\ndiff_command = \"fcomp -w -s $original $input -o $output\";\n\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/history",
    "content": "#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\n/*\n * RCS uses a slightly different model than aegis wants, so some\n * maneuvering is required.  The command strings in this section assume\n * that the RCS commands ci and co and rcs and rlog are in the command\n * search PATH, but you may like to hard-wire the paths, or set PATH at\n * the start of each.  You should also note that the strings are always\n * handed to the Bourne shell to be executed, and are set to exit with\n * an error immediately a sub-command fails.\n *\n * In these commands, the RCS file is kept unlocked, since only the owner will\n * be checking changes in.  The RCS functionality for coordinating shared\n * access is not required.\n *\n * One advantage of using RCS version 5.6 or later is that binary files are\n * supported, should you want to have binary files in the baseline.\n */\n\n/*\n * This command is used to create a new file history.\n * This command is always executed as the project owner.\n * The following substitutions are available:\n *\n * ${Input}\n *      absolute path of the source file\n * ${History}\n *      absolute path of the history file\n *\n * The \"ci -f\" option is used to specify that a copy is to be checked-in even\n *      if there are no changes.\n * The \"ci -u\" option is used to specify that an unlocked copy will remain in\n *      the baseline.\n * The \"ci -d\" option is used to specify that the file time rather than the\n *      current time is to be used for the new revision.\n * The \"ci -M\" option is used to specify that the mode date on the original\n *      file is not to be altered.\n * The \"ci -t\" option is used to specify that there is to be no description\n *      text for the new RCS file.\n * The \"ci -m\" option is used to specify that the change number is to be stored\n *      in the file log if this is actually an update (typically from aenf\n *      after aerm on the same file name).\n * The \"rcs -U\" option is used to specify that the new RCS file is to have\n *      unstrict locking.\n */\nhistory_create_command =\n    \"ci -f -u -d -M -m$c -t/dev/null $i $h,v; rcs -U $h,v\";\n\n/*\n * This command is used to get a specific edit back from history.\n * This command is always executed as the project owner.\n * The following substitutions are available:\n *\n * ${History}\n *      absolute path of the history file\n * ${Edit}\n *      edit number, as given by history_\\%query_\\%command\n * ${Output}\n *      absolute path of the destination file\n *\n * The \"co -r\" option is used to specify the edit to be retrieved.\n * The \"co -p\" option is used to specify that the results be printed on the\n *      standard output; this is because the destination filename will never\n *      look anything like the history source filename.\n */\nhistory_get_command =\n    \"co -r'$e' -p $h,v > $o\";\n\n/*\n * This command is used to add a new \"top-most\" entry to the history file.\n * This command is always executed as the project owner.\n * The following substitutions are available:\n *\n * ${Input}\n *      absolute path of source file\n * ${History}\n *      absolute path of history file\n *\n * The \"ci -f\" option is used to specify that a copy is to be checked-in even\n *      if there are no changes.\n * The \"ci -u\" option is used to specify that an unlocked copy will remain in\n *      the baseline.\n * The \"ci -d\" option is used to specify that the file time rather than the\n *      current time is to be used for the new revision.\n * The \"ci -M\" option is used to specify that the mode date on the original\n *      file is not to be altered.\n * The \"ci -m\" option is used to specify that the change number is to be stored\n *      in the file log, which allows rlog to be used to find the change\n *      numbers to which each revision of the file corresponds.\n *\n * It is possible for a a very cautious approach has been taken, in which case\n * the history_put_command may be set to the same string specified above for\n * the history_create_command.\n */\nhistory_put_command =\n    \"ci -f -u -d -M -m$c $i $h,v\";\n\n/*\n * This command is used to query what the history mechanism calls the top-most\n * edit of a history file.  The result may be any arbitrary string, it need not\n * be anything like a number, just so long as it uniquely identifies the edit\n * for use by the history_get_command at a later date.  The edit number is to\n * be printed on the standard output.  This command is always executed as the\n * project owner.\n *\n * The following substitutions are available:\n *\n * ${History}\n *      absolute path of the history file\n */\nhistory_query_command =\n    \"rlog -r $h,v | awk '/^head:/ {print $$2}'\";\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/merge",
    "content": "#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\n/*\n * RCS also provides a merge program, which can be used to provide a three-way\n * merge.  It has an ouput format some sites prefer to the fmerge output.\n *\n * This command is used by aed(1) to produce a difference listing when a file\n * in the development directory is out of date compared to the current version\n * in the baseline.\n *\n * All of the command substitutions described in aesub(5) are available.\n * In addition, the following substitutions are also available:\n *\n * ${ORiginal}\n *      The absolute path name of a file containing the common ancestor\n *      version of ${MostRecent} and {$Input}.  Usually the version originally\n *      copied into the change.  Usually in a temporary file.\n * ${Most_Recent}\n *      The absolute path name of a file containing the most recent version.\n *      Usually in the baseline.\n * ${Input}\n *      The absolute path name of the edited version of the file.  Usually in\n *      the development directory.\n * ${Output}\n *      The absolute path name of the file in which to write the difference\n *      listing.  Usually in the development directory.\n *\n * An exit status of 0 means successful, even of the files differ (and they\n * usually do).  An exit status which is non-zero means something is wrong.\n *\n * The \"merge -L\" options are used to specify labels for the baseline and the\n *      development directory, respecticvely, when conflict lines are inserted\n *      into the result.\n * The \"merge -p\" options is used to specify that the results are to be printed\n *      on the standard output.\n */\n\nmerge_command =\n    \"set +e; \"\n    \"merge -p -L baseline -L C$c $mr $orig $in > $out; \"\n    \"test $? -le 1\"\n    ;\n\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/new_file_template",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010-2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nfile_template =\n[\n        {\n                pattern = [ \"srecord/*.cc\" ];\n                body = \"${read_file ${source etc/template/lib_cc abs}}\";\n        },\n        {\n                pattern = [ \"*.cc\" ];\n                body = \"${read_file ${source etc/template/cc abs}}\";\n        },\n        {\n                pattern = [ \"*.c\" ];\n                body = \"${read_file ${source etc/template/c abs}}\";\n        },\n        {\n                pattern = [ \"srecord/*.h\", ];\n                body = \"${read_file ${source etc/template/lib_h abs}}\";\n        },\n        {\n                pattern = [ \"*.h\", \"*.g\", \"*.hh\" ];\n                body = \"${read_file ${source etc/template/h abs}}\";\n        },\n        {\n                pattern = [ \"test/*/*.sh\" ];\n                body = \"${read_file ${source etc/template/test abs}}\";\n        },\n        {\n                pattern = [ \"*.sh\" ];\n                body = \"${read_file ${source etc/template/sh abs}}\";\n        },\n        {\n                pattern = [ \"*.[1-9]\" ];\n                body = \"${read_file ${source etc/template/man abs}}\";\n        },\n        {\n                pattern = [ \"etc/new.*.so\" ];\n                body = \"${read_file ${source etc/template/etc-new-so abs}}\";\n        },\n        {\n                /* This one must be last. */\n                pattern = [ \"*\" ];\n                body = \"${read_file ${source etc/template/generic abs}}\";\n        }\n];\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/rss",
    "content": "#\n# srecord - The \"srecord\" program.\n# Copyright (C) 2007, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nproject_specific =\n[\n    {\n        name = \"rss:feedfilename-completed.xml\";\n        value = \"completed\";\n    },\n    {\n        name = \"rss:feeddescription-completed.xml\";\n        value =\n            \"This feed provides you with a way to subscribe to new \"\n            \"SRecord change setsi, if you are interested in tracking \"\n            \"SRecord development.\"\n            ;\n    },\n    {\n        name = \"rss:feedtitle-completed.xml\";\n        value = \"Developments\";\n    },\n    {\n        name = \"rss:feedlanguage-completed.xml\";\n        value = \"en-AU\";\n    },\n];\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/aegis.conf.d/test",
    "content": "#\n#       srecord - Manipulate EPROM load files\n#       Copyright (C) 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\ntest_command =\n    \"PATH=${path_reduce ${addpathsuffix $arch/bin ${spe}} ${env PATH}} \"\n    \"$shell $filename $arch\"\n    ;\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69.\n#\n#\n# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n# Use a proper internal environment variable to ensure we don't fall\n  # into an infinite loop, continuously re-executing ourselves.\n  if test x\"${_as_can_reexec}\" != xno && test \"x$CONFIG_SHELL\" != x; then\n    _as_can_reexec=no; export _as_can_reexec;\n    # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nas_fn_exit 255\n  fi\n  # We don't want this to propagate to other subprocesses.\n          { _as_can_reexec=; unset _as_can_reexec;}\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\ntest -x / || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  export CONFIG_SHELL\n             # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have\n  # already done that, so ensure we don't try to do so again and fall\n  # in an infinite loop.  This has already happened in practice.\n  _as_can_reexec=no; export _as_can_reexec\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME=\nPACKAGE_TARNAME=\nPACKAGE_VERSION=\nPACKAGE_STRING=\nPACKAGE_BUGREPORT=\nPACKAGE_URL=\n\nac_unique_file=\"install-sh\"\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='LTLIBOBJS\nLIBOBJS\nHAVE_GROFF\nLIBTOOL\nSH\nSOELIM\nGROFF\nRANLIB\nYFLAGS\nYACC\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\nEGREP\nGREP\nCXXCPP\nCPP\nac_ct_CC\nCFLAGS\nCC\nOBJEXT\nEXEEXT\nac_ct_CXX\nCPPFLAGS\nLDFLAGS\nCXXFLAGS\nCXX\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nwith_gcrypt\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCXX\nCXXFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCCC\nCC\nCFLAGS\nCPP\nCXXCPP\nYACC\nYFLAGS'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures this package to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n\n  cat <<\\_ACEOF\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --without-gcrypt        disable support for libgcrypt\n\nSome influential environment variables:\n  CXX         C++ compiler command\n  CXXFLAGS    C++ compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  CPP         C preprocessor\n  CXXCPP      C++ preprocessor\n  YACC        The `Yet Another Compiler Compiler' implementation to use.\n              Defaults to the first program found out of: `bison -y', `byacc',\n              `yacc'.\n  YFLAGS      The list of arguments that will be passed by default to $YACC.\n              This script will default YFLAGS to the empty string to avoid a\n              default value of `-d' given by some make applications.\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nconfigure\ngenerated by GNU Autoconf 2.69\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_cxx_try_compile LINENO\n# ----------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_compile\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_cxx_try_cpp LINENO\n# ------------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_cpp\n\n# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES\n# ---------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_cxx_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_cxx_check_header_mongrel\n\n# ac_fn_cxx_try_run LINENO\n# ------------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_cxx_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_run\n\n# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES\n# ---------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_cxx_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_cxx_check_header_compile\n\n# ac_fn_cxx_try_link LINENO\n# -------------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t test -x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_link\n\n# ac_fn_cxx_check_func LINENO FUNC VAR\n# ------------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_cxx_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_cxx_check_func\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by $as_me, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\nac_config_headers=\"$ac_config_headers srecord/config.h\"\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nif test -z \"$CXX\"; then\n  if test -n \"$CCC\"; then\n    CXX=$CCC\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CXX\"; then\n  ac_cv_prog_CXX=\"$CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CXX=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCXX=$ac_cv_prog_CXX\nif test -n \"$CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXX\" >&5\n$as_echo \"$CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CXX\" && break\n  done\nfi\nif test -z \"$CXX\"; then\n  ac_ct_CXX=$CXX\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CXX\"; then\n  ac_cv_prog_ac_ct_CXX=\"$ac_ct_CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CXX=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CXX=$ac_cv_prog_ac_ct_CXX\nif test -n \"$ac_ct_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX\" >&5\n$as_echo \"$ac_ct_CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CXX\" && break\ndone\n\n  if test \"x$ac_ct_CXX\" = x; then\n    CXX=\"g++\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CXX=$ac_ct_CXX\n  fi\nfi\n\n  fi\nfi\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works\" >&5\n$as_echo_n \"checking whether the C++ compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C++ compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name\" >&5\n$as_echo_n \"checking for C++ compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C++ compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C++ compiler... \" >&6; }\nif ${ac_cv_cxx_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_cxx_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu\" >&5\n$as_echo \"$ac_cv_cxx_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GXX=yes\nelse\n  GXX=\nfi\nac_test_CXXFLAGS=${CXXFLAGS+set}\nac_save_CXXFLAGS=$CXXFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g\" >&5\n$as_echo_n \"checking whether $CXX accepts -g... \" >&6; }\nif ${ac_cv_prog_cxx_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_cxx_werror_flag=$ac_cxx_werror_flag\n   ac_cxx_werror_flag=yes\n   ac_cv_prog_cxx_g=no\n   CXXFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nelse\n  CXXFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  ac_cxx_werror_flag=$ac_save_cxx_werror_flag\n\t CXXFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_cxx_werror_flag=$ac_save_cxx_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g\" >&5\n$as_echo \"$ac_cv_prog_cxx_g\" >&6; }\nif test \"$ac_test_CXXFLAGS\" = set; then\n  CXXFLAGS=$ac_save_CXXFLAGS\nelif test $ac_cv_prog_cxx_g = yes; then\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-g -O2\"\n  else\n    CXXFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-O2\"\n  else\n    CXXFLAGS=\n  fi\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if ${ac_cv_prog_CPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor\" >&5\n$as_echo_n \"checking how to run the C++ preprocessor... \" >&6; }\nif test -z \"$CXXCPP\"; then\n  if ${ac_cv_prog_CXXCPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CXXCPP needs to be expanded\n    for CXXCPP in \"$CXX -E\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CXXCPP=$CXXCPP\n\nfi\n  CXXCPP=$ac_cv_prog_CXXCPP\nelse\n  ac_cv_prog_CXXCPP=$CXXCPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXXCPP\" >&5\n$as_echo \"$CXXCPP\" >&6; }\nac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C++ preprocessor \\\"$CXXCPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif ${ac_cv_path_GREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_GREP\" || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif ${ac_cv_path_EGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_EGREP\" || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_cxx_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"minix/config.h\" \"ac_cv_header_minix_config_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_minix_config_h\" = xyes; then :\n  MINIX=yes\nelse\n  MINIX=\nfi\n\n\n  if test \"$MINIX\" = yes; then\n\n$as_echo \"#define _POSIX_SOURCE 1\" >>confdefs.h\n\n\n$as_echo \"#define _POSIX_1_SOURCE 2\" >>confdefs.h\n\n\n$as_echo \"#define _MINIX 1\" >>confdefs.h\n\n  fi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__\" >&5\n$as_echo_n \"checking whether it is safe to define __EXTENSIONS__... \" >&6; }\nif ${ac_cv_safe_to_define___extensions__+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#         define __EXTENSIONS__ 1\n          $ac_includes_default\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_safe_to_define___extensions__=yes\nelse\n  ac_cv_safe_to_define___extensions__=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__\" >&5\n$as_echo \"$ac_cv_safe_to_define___extensions__\" >&6; }\n  test $ac_cv_safe_to_define___extensions__ = yes &&\n    $as_echo \"#define __EXTENSIONS__ 1\" >>confdefs.h\n\n  $as_echo \"#define _ALL_SOURCE 1\" >>confdefs.h\n\n  $as_echo \"#define _GNU_SOURCE 1\" >>confdefs.h\n\n  $as_echo \"#define _POSIX_PTHREAD_SEMANTICS 1\" >>confdefs.h\n\n  $as_echo \"#define _TANDEM_SOURCE 1\" >>confdefs.h\n\n\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\nfor ac_prog in 'bison -y' byacc\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_YACC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$YACC\"; then\n  ac_cv_prog_YACC=\"$YACC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_YACC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nYACC=$ac_cv_prog_YACC\nif test -n \"$YACC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $YACC\" >&5\n$as_echo \"$YACC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$YACC\" && break\ndone\ntest -n \"$YACC\" || YACC=\"yacc\"\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\nfor ac_prog in groff roff\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_GROFF+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$GROFF\"; then\n  ac_cv_prog_GROFF=\"$GROFF\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_GROFF=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nGROFF=$ac_cv_prog_GROFF\nif test -n \"$GROFF\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $GROFF\" >&5\n$as_echo \"$GROFF\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$GROFF\" && break\ndone\n\nfor ac_prog in gsoelim soelim roffpp\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_SOELIM+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$SOELIM\"; then\n  ac_cv_prog_SOELIM=\"$SOELIM\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_SOELIM=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSOELIM=$ac_cv_prog_SOELIM\nif test -n \"$SOELIM\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $SOELIM\" >&5\n$as_echo \"$SOELIM\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$SOELIM\" && break\ndone\n\nfor ac_func in snprintf vsnprintf\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_cxx_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for main in -lgpg-error\" >&5\n$as_echo_n \"checking for main in -lgpg-error... \" >&6; }\nif ${ac_cv_lib_gpg_error_main+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lgpg-error  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\nreturn main ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  ac_cv_lib_gpg_error_main=yes\nelse\n  ac_cv_lib_gpg_error_main=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gpg_error_main\" >&5\n$as_echo \"$ac_cv_lib_gpg_error_main\" >&6; }\nif test \"x$ac_cv_lib_gpg_error_main\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBGPG_ERROR 1\n_ACEOF\n\n  LIBS=\"-lgpg-error $LIBS\"\n\nfi\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wall\" >&5\n$as_echo_n \"checking if $CC accepts -Wall... \" >&6; }\n  ac_add_cflags__old_cflags=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -Wall\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nprintf(\"Hello, World!\\n\"); return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    CFLAGS=\"$ac_add_cflags__old_cflags\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wextra\" >&5\n$as_echo_n \"checking if $CC accepts -Wextra... \" >&6; }\n  ac_add_cflags__old_cflags=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -Wextra\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nprintf(\"Hello, World!\\n\"); return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    CFLAGS=\"$ac_add_cflags__old_cflags\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wl,--as-needed\" >&5\n$as_echo_n \"checking if $CC accepts -Wl,--as-needed... \" >&6; }\n  ac_add_cflags__old_cflags=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -Wl,--as-needed\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nprintf(\"Hello, World!\\n\"); return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    CFLAGS=\"$ac_add_cflags__old_cflags\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\nfor ac_header in boost/shared_ptr.hpp\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"boost/shared_ptr.hpp\" \"ac_cv_header_boost_shared_ptr_hpp\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_boost_shared_ptr_hpp\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_BOOST_SHARED_PTR_HPP 1\n_ACEOF\n\nfi\n\ndone\n\nif test \"$ac_cv_header_boost_shared_ptr_hpp\" != \"yes\"\nthen\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        You need to install the Boost C++ library to be able to compile SRecord.\n        http://boost.org/\" >&5\n$as_echo \"\n        You need to install the Boost C++ library to be able to compile SRecord.\n        http://boost.org/\" >&6; }\n    OK=no\n    if apt-get --version > /dev/null 2> /dev/null; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        The following command may be used to install it:\n        sudo apt-get install libboost-dev\n      \" >&5\n$as_echo \"\n        The following command may be used to install it:\n        sudo apt-get install libboost-dev\n      \" >&6; }\n      OK=yes\n    fi\n    if yum --version > /dev/null 2> /dev/null; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        The following command may be used to install it:\n        sudo yum install libboost-devel\n      \" >&5\n$as_echo \"\n        The following command may be used to install it:\n        sudo yum install libboost-devel\n      \" >&6; }\n      OK=yes\n    fi\n    if test \"$OK\" != \"yes\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        If you have a package based system, the package you need to\n        install will be called libboost-devel or something similar.\n      \" >&5\n$as_echo \"\n        If you have a package based system, the package you need to\n        install will be called libboost-devel or something similar.\n      \" >&6; }\n    fi\n    exit 1\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a Bourne shell which understands functions\" >&5\n$as_echo_n \"checking for a Bourne shell which understands functions... \" >&6; }\nif test \"z$SH\" = \"z\"; then\n    if test -f /bin/sh5; then\n        SH=/bin/sh5\n    else\n        SH=/bin/sh\n    fi\nfi\n\n\ncat >>confdefs.h <<_ACEOF\n#define CONF_SHELL \"$SH\"\n_ACEOF\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $SH\" >&5\n$as_echo \"$SH\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sparse file lseek support\" >&5\n$as_echo_n \"checking for sparse file lseek support... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <unistd.h>\nint\nmain ()\n{\nfpathconf(0, _PC_MIN_HOLE_SIZE);\nlseek(0, 0L, SEEK_DATA); lseek(0, 0L, SEEK_HOLE);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\n$as_echo \"#define HAVE_SPARSE_LSEEK 1\" >>confdefs.h\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gcrypt SHA224 support\" >&5\n$as_echo_n \"checking for gcrypt SHA224 support... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <gcrypt.h>\nint\nmain ()\n{\ngcry_md_hd_t handle; return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\n$as_echo \"#define HAVE_GCRY_MD_HD_T 1\" >>confdefs.h\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\n\n\n# Check whether --with-gcrypt was given.\nif test \"${with_gcrypt+set}\" = set; then :\n  withval=$with_gcrypt;\nelse\n  with_gcrypt=yes\nfi\n\n\nLIBGCRYPT=\nif test \"x$with_gcrypt\" != xno; then :\n\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gcrypt SHA224 support\" >&5\n$as_echo_n \"checking for gcrypt SHA224 support... \" >&6; }\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <gcrypt.h>\nint\nmain ()\n{\nreturn GCRY_MD_SHA224;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\n$as_echo \"#define HAVE_LIBGCRYPT_SHA224 1\" >>confdefs.h\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gcrypt WHIRLPOOL support\" >&5\n$as_echo_n \"checking for gcrypt WHIRLPOOL support... \" >&6; }\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <gcrypt.h>\nint\nmain ()\n{\nreturn GCRY_MD_WHIRLPOOL;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\n$as_echo \"#define HAVE_LIBGCRYPT_WHIRLPOOL 1\" >>confdefs.h\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gcry_md_open in -lgcrypt\" >&5\n$as_echo_n \"checking for gcry_md_open in -lgcrypt... \" >&6; }\nif ${ac_cv_lib_gcrypt_gcry_md_open+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lgcrypt  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gcry_md_open ();\nint\nmain ()\n{\nreturn gcry_md_open ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  ac_cv_lib_gcrypt_gcry_md_open=yes\nelse\n  ac_cv_lib_gcrypt_gcry_md_open=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcrypt_gcry_md_open\" >&5\n$as_echo \"$ac_cv_lib_gcrypt_gcry_md_open\" >&6; }\nif test \"x$ac_cv_lib_gcrypt_gcry_md_open\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBGCRYPT 1\n_ACEOF\n\n  LIBS=\"-lgcrypt $LIBS\"\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"gcrypt test failed (--without-gcrypt to disable)\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\n\nfi\n\nfor ac_prog in libtool\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_LIBTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$LIBTOOL\"; then\n  ac_cv_prog_LIBTOOL=\"$LIBTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_LIBTOOL=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nLIBTOOL=$ac_cv_prog_LIBTOOL\nif test -n \"$LIBTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LIBTOOL\" >&5\n$as_echo \"$LIBTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$LIBTOOL\" && break\ndone\n\nif test -z \"$LIBTOOL\"\nthen\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        You must have GNU Libtool installed to build srecord.\n        Homepage: http://www.gnu.org/software/libtool/\" >&5\n$as_echo \"\n        You must have GNU Libtool installed to build srecord.\n        Homepage: http://www.gnu.org/software/libtool/\" >&6; }\n  OK=no\n  if apt-get --version > /dev/null 2> /dev/null; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        The following command may be used to install it:\n        sudo apt-get install libtool\n    \" >&5\n$as_echo \"\n        The following command may be used to install it:\n        sudo apt-get install libtool\n    \" >&6; }\n    OK=yes\n  fi\n  if yum --version > /dev/null 2> /dev/null; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        The following command may be used to install it:\n        sudo yum install libtool\n    \" >&5\n$as_echo \"\n        The following command may be used to install it:\n        sudo yum install libtool\n    \" >&6; }\n    OK=yes\n  fi\n  if pkg_info -a > /dev/null 2> /dev/null; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        The following command may be used to install it:\n        sudo pkg_add -r libtool\n    \" >&5\n$as_echo \"\n        The following command may be used to install it:\n        sudo pkg_add -r libtool\n    \" >&6; }\n    OK=yes\n  fi\n  if test \"$OK\" != \"yes\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:\n        If you are using a package based install, you will need the\n        libtool package.\n    \" >&5\n$as_echo \"\n        If you are using a package based install, you will need the\n        libtool package.\n    \" >&6; }\n  fi\n  exit 1\nfi\n\nif test -n \"$SOELIM\"\nthen\n  if $SOELIM -I. /dev/null > /dev/null 2>&1\n  then\n    : nothing\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: \" >&5\n$as_echo \"\" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:      The $SOELIM program does not understand the -I\" >&5\n$as_echo \"     The $SOELIM program does not understand the -I\" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:      option.  There is a patch available for GNU Groff\" >&5\n$as_echo \"     option.  There is a patch available for GNU Groff\" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:      which makes this work correctly.  See the BUILDING\" >&5\n$as_echo \"     which makes this work correctly.  See the BUILDING\" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result:      file for details.\" >&5\n$as_echo \"     file for details.\" >&6; }\n    GROFF=\n  fi\nfi\nif test -n \"$GROFF\"\nthen\n  HAVE_GROFF=yes\n else\n  HAVE_GROFF=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: \" >&5\n$as_echo \"\" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result:        The SRecord documentation set and manual pages will\" >&5\n$as_echo \"       The SRecord documentation set and manual pages will\" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result:        be formatted and installed if you first install\" >&5\n$as_echo \"       be formatted and installed if you first install\" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result:        GNU Groff and then re-run this ./configure script.\" >&5\n$as_echo \"       GNU Groff and then re-run this ./configure script.\" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result:        Remember to use \\`\\`rm config.cache'' before you do.\" >&5\n$as_echo \"       Remember to use \\`\\`rm config.cache'' before you do.\" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: \" >&5\n$as_echo \"\" >&6; }\nfi\n\n\n#\n# Evaluate some of the variables, to remove ${prefix} references.\n# This way, they can be used in C programs and Roff input.\n# Make sure that srecord is mentioned in the datadir path;\n# add it if it is not already there.\n#\ntest \"x$prefix\" = xNONE && prefix=\"${ac_default_prefix-/usr/local}\"\ntest \"x$exec_prefix\" = xNONE && exec_prefix=\"$prefix\"\neval \"exec_prefix=$exec_prefix\"\neval \"bindir=$bindir\"\neval \"datarootdir=$datarootdir\"\neval \"mandir=$mandir\"\neval \"libdir=$libdir\"\neval \"datadir=$datadir\"\n\n\n\n\n\n\nac_config_files=\"$ac_config_files Makefile\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by $as_me, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nReport bugs to the package provider.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nconfig.status\nconfigured by $0, generated by GNU Autoconf 2.69,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error $? \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X $SHELL '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"srecord/config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS srecord/config.h\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$ac_tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_tt=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_tt\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error $? \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    \"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$ac_tmp/config.h\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$ac_tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$ac_tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error $? \"could not create -\" \"$LINENO\" 5\n  fi\n ;;\n\n\n  esac\n\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/changelog",
    "content": "srecord (1.64.D001-1) unstable; urgency=low\n\n  * Prep next public release of SRecord. This will be srecord.1.63\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Sun, 22 Jun 2014 15:31:32 +1000\n\nsrecord (1.63.D012-1) unstable; urgency=low\n\n  * Cleaned up a few references to the maintainer's name.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Sat, 21 Jun 2014 19:57:55 +1000\n\nsrecord (1.63.D011-1) unstable; urgency=low\n\n  * Fixed some warnings in test 38\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Sat, 21 Jun 2014 19:18:38 +1000\n\nsrecord (1.63.D010-1) unstable; urgency=low\n\n  * Fixed bugs discovered by Mike <russiane39@gmail.com> regarding the\n    formatting of some of the examples where lines were wrapping the wrong way.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Sat, 21 Jun 2014 19:09:51 +1000\n\nsrecord (1.63.D009-1) unstable; urgency=low\n\n  * Added the ability to compile without libgcrypt if the user specifies the\n    option --without-gcrypt to configure. If gcrypt is missing, the user is\n    prompted to either install it or explicitly compile with it disabled.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Sat, 21 Jun 2014 16:49:49 +1000\n\nsrecord (1.63.D008-1) unstable; urgency=low\n\n  * Cleaned up a few recent compiler and doxygen warnings.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Fri, 20 Jun 2014 08:10:58 +1000\n\nsrecord (1.63.D007-1) unstable; urgency=low\n\n  * This change adds Sourceforge Patch #4 contributed by Stas Sergeev\n    <stsp@sourceforge.net>. Adds get_upper_bound() and makes it and the lower\n    equivalent public (for use from libsrecord).\n  * Also fixed a bug in srec_memory::find_next_chunk() where it would fail to\n    reset the find_next_chunk_index once it became equal to nchunks. After that,\n    find_next_chunk() would always fail.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Mon, 28 Apr 2014 18:04:20 +1000\n\nsrecord (1.63.D006-1) unstable; urgency=low\n\n  * Added prefix and postfix strings to the C-Array format which are applied at\n    each end of the data array declaration. This allows the user to add various\n    compiler directives such as location flags or non-standard load address\n    specifiers.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Sun, 27 Apr 2014 19:50:54 +1000\n\nsrecord (1.63.D005-1) unstable; urgency=low\n\n  * Fixed Sourceforge bug 11 raised by patryks. In the analysis, it was\n    discovered that a start address (of zero) was being generated when\n    converting from AOMF. AOMF does not support the concept of an execution\n    start address.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Tue, 22 Apr 2014 18:11:41 +1000\n\nsrecord (1.63.D004-1) unstable; urgency=low\n\n  * The Windows build instructions have been updated by Jens Heilig\n    <jens@familie-heilig.net>.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Mon, 21 Apr 2014 20:13:29 +1000\n\nsrecord (1.63.D003-1) unstable; urgency=low\n\n  * Fixed the length field description in extended tektronix documentation. The\n    implementation was already correct.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Fri, 18 Apr 2014 16:39:28 +1000\n\nsrecord (1.63.D002-1) unstable; urgency=low\n\n  * Added a regression test for calculated address for CRC (Sourceforge bug 19).\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Thu, 17 Apr 2014 21:35:01 +1000\n\nsrecord (1.63.D001-1) unstable; urgency=low\n\n  * Prep next public release of SRecord. This will be srecord.1.63\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Sun, 13 Apr 2014 21:23:11 +1000\n\nsrecord (1.62.D017-1) unstable; urgency=low\n\n  * Add release instructions based on instructions from Peter\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Mon, 07 Apr 2014 18:17:27 +1000\n\nsrecord (1.62.D016-1) unstable; urgency=low\n\n  * This change does a minor refactoring of the output_file class\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Mon, 07 Apr 2014 18:02:52 +1000\n\nsrecord (1.62.D015-1) unstable; urgency=low\n\n  * This change from Daniel Anselmi fixes an issue with generating Lattice\n    Memory init files.\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Mon, 07 Apr 2014 17:55:20 +1000\n\nsrecord (1.62.D014-1) unstable; urgency=low\n\n  * Fixed new warnings from g++ 4.8.1\n\n -- Scott Finneran <scottfinneran@yahoo.com.au>  Mon, 07 Apr 2014 17:47:58 +1000\n\nsrecord (1.62.D013-1) unstable; urgency=low\n\n  * This change set generalises the code that handles redundant byte settings\n    and contradictory byte settings.  The defcon_t type describes what to do:\n    ignore, warn or error.\n  * The --multiple option is no more.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 Apr 2014 21:45:14 +1000\n\nsrecord (1.62.D012-1) unstable; urgency=low\n\n  * Daniel Anselmi <danselmi@gmx.ch> discovered that the \"mem\" output format was\n    malformed. The lines now break every \"width\" bits.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Mar 2014 19:11:30 +1100\n\nsrecord (1.62.D011-1) unstable; urgency=low\n\n  * Hanspeter Niederstrasser  disoverd some false negatices in the test suite,\n    when used on OSX.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Mar 2014 17:53:04 +1100\n\nsrecord (1.62.D010-1) unstable; urgency=low\n\n  * This change set adds simpler seletion code to choose whivh CRC16\n    implmentation to be used.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Mar 2014 17:40:45 +1100\n\nsrecord (1.62.D009-1) unstable; urgency=low\n\n  * Juliano MourÃ£o Vieira <juliano@utfpr.edu.br> discovered a problem with the\n    srec_mif.5 description. This mistake is not present in the code.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Mar 2014 10:07:40 +1100\n\nsrecord (1.62.D008-1) unstable; urgency=low\n\n  * This change set adds more comments to the code, so that the use of URL_deode\n    for the command line is better explained. And comment to explain why not to\n    do turl_encode when building header records.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 04 Feb 2014 12:52:57 +1100\n\nsrecord (1.62.D007-1) unstable; urgency=low\n\n  * This change makes a start at replacing Peter as the maintainer.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 02 Feb 2014 22:20:19 +1100\n\nsrecord (1.62.D006-1) unstable; urgency=low\n\n  * This change set adds URL quoting to the command line. There are times you\n    need to be abase to insert unprintable characters on the command line. The\n    immediate use case prompting this was a user wanting to put a NUL in the\n    header string. So now you can, as \"%00\". The other choice was quoted\n    printable encoding, but that was a bit obscure.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 02 Feb 2014 19:59:03 +1100\n\nsrecord (1.62.D005-1) unstable; urgency=low\n\n  * Liju Prasanth Nivas (RBEI/ECA1) <Liju.PrasanthNivas@in.bosch.com> suggsted\n    another use case for the examples. I the case of \"joining\" files that are\n    meant to be \\[lq]stacked in layers\\[rq].\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 30 Aug 2013 11:20:16 +1000\n\nsrecord (1.62.D004-1) unstable; urgency=low\n\n  * The srec_tools now understand how to read and write Logisim formt.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 29 Aug 2013 13:15:02 +1000\n\nsrecord (1.62.D003-1) unstable; urgency=low\n\n  * The tools now recogise the Logisim file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 27 Aug 2013 10:46:51 +1000\n\nsrecord (1.62.D002-1) unstable; urgency=low\n\n  * This change set adds more links to the windows files on SourceForge, maybe\n    it will boost donload numbers.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 11 Jun 2013 19:48:29 +1000\n\nsrecord (1.62.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecored for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 05 Jun 2013 14:29:37 +1000\n\nsrecord (1.61.D006-1) unstable; urgency=low\n\n  * * Luc Steynen <LucSteynen@edna.be> discovered that the --checksum-big-endian\n    opion was a counter-intuitive alias for the the --checksum-bitnot-big-endian\n    option.\n  * * The --checksum-big-endian option is now deprecated, in favor of the --\n    checksum-bitnot-big-endian option; the code will warn uers of the old option\n    they will need to change.\n  * * Ditto little-endian variants\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 05 Jun 2013 12:04:34 +1000\n\nsrecord (1.61.D005-1) unstable; urgency=low\n\n  * Alin Pilkington <apilkington@moog.com> found that the Tektronics Extended\n    format was calculating the record length incorrectory.\n  * Thanks you for the bug report.\n  * This has been fixed for both reading and writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 04 Jun 2013 09:53:04 +1000\n\nsrecord (1.61.D004-1) unstable; urgency=low\n\n  * Dr. Benedikt Schmitt <Benedikt.Schmitt@safeintrain.de> suggted bein able o\n    inject arbitrary data into the file header (suh as NUL termination\n    characters.  This change set adds URL-style escapes (e.g. %25) to the string\n    on he command line.  E.g. --header or --generate --string\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 30 May 2013 22:17:00 +1000\n\nsrecord (1.61.D003-1) unstable; urgency=low\n\n  * This change set fixes the Distribution: line in the debian/*.changes file,\n    to cater to Ubuntu's recent changes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 05 Feb 2013 18:15:24 +1100\n\nsrecord (1.61.D002-1) unstable; urgency=low\n\n  * This change set improves some of the links to the wind32 binaries on sf.net\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 05 Feb 2013 15:31:58 +1100\n\nsrecord (1.61.D001-1) unstable; urgency=low\n\n  * This change ser prepares the srecord project for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 04 Jan 2013 12:40:20 +1100\n\nsrecord (1.60.D014-1) unstable; urgency=low\n\n  * This change set fixes yet another build glitch concerning the test_prelude\n    file.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 04 Jan 2013 12:12:33 +1100\n\nsrecord (1.60.D013-1) unstable; urgency=low\n\n  * This change set tries once again to get test_prelude to build properly.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 04 Jan 2013 10:51:07 +1100\n\nsrecord (1.60.D012-1) unstable; urgency=low\n\n  * This change set fixes another problem with building the test_prelude script.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 04 Jan 2013 09:54:35 +1100\n\nsrecord (1.60.D011-1) unstable; urgency=low\n\n  * This change set fixes a coupel of small build glitches.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 04 Jan 2013 07:57:54 +1100\n\nsrecord (1.60.D010-1) unstable; urgency=low\n\n  * This change set adds checks for ambiguous option abbreviations. This will be\n    of most use when adding additional command line options.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 03 Jan 2013 21:37:28 +1100\n\nsrecord (1.60.D009-1) unstable; urgency=low\n\n  * This change set replaces input_file::format_option_name with input_\n    file::format_option_number, so that the --guess error messages always agree\n    with the actual option names.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 03 Jan 2013 20:43:30 +1100\n\nsrecord (1.60.D008-1) unstable; urgency=low\n\n  * This change moves the apt-get of essential packages into its own .cook file,\n    and improves some aspects of the quiet build.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 03 Jan 2013 16:29:50 +1100\n\nsrecord (1.60.D007-1) unstable; urgency=low\n\n  * This change set fixes a bug in the Tektronix-Extenden format line checksum\n    calculations.  The comparison should have been in 8 bits, not int.\n  * My thanks to Izzet Ozcelik <izzetozcelik@cscope.co.uk> for reporting this\n    bug.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 03 Jan 2013 11:49:36 +1100\n\nsrecord (1.60.D006-1) unstable; urgency=low\n\n  * This change set adds ~pm~ to the ppa version numbers, so the source is\n    obvious when installed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 14 Nov 2012 20:10:15 +1100\n\nsrecord (1.60.D005-1) unstable; urgency=low\n\n  * This change set replaces the png2ico command woth convert(1) from the\n    imagemagick package.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 05 Nov 2012 21:56:15 +1100\n\nsrecord (1.60.D004-1) unstable; urgency=low\n\n  * Daniel Anselmi <danselmi@gmx.ch> contributed a Memory Initialization Format\n    by Lattice Semiconductor, for output only.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Sep 2012 16:16:39 +1000\n\nsrecord (1.60.D003-1) unstable; urgency=low\n\n  * Daniel Anselmi <danselmi@gmx.ch> contributed a Xilinx Coefficient File\n    Format (.coe) output class.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Sep 2012 11:25:06 +1000\n\nsrecord (1.60.D002-1) unstable; urgency=low\n\n  * This change set fixes the problem of the Doxygen documentation missing from\n    the web site.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 11 Jul 2012 21:04:56 +1000\n\nsrecord (1.60.D001-1) unstable; urgency=low\n\n  * This change set prepares the SRecord project for its next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 19 May 2012 19:48:28 +1000\n\nsrecord (1.59.D014-1) unstable; urgency=low\n\n  * This change et fixes a typo in the STM copyright assignment.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 21:43:46 +1000\n\nsrecord (1.59.D013-1) unstable; urgency=low\n\n  * This change set fixes the TRS80 input format, so that we can cope with the\n    longest of the possible data records.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 21:26:58 +1000\n\nsrecord (1.59.D012-1) unstable; urgency=low\n\n  * This change et adds a reference to the STM data sheet, for details of the\n    STM32 algorithm.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 19:59:59 +1000\n\nsrecord (1.59.D011-1) unstable; urgency=low\n\n  * Hendrik Beijeman <hbeyeman@gmail.com> contributed a patch that adds support\n    for generating a CRC used by the hardware CRC unit on the STM32 series of\n    ARM MPUs.  The algorithm used by the STM32 hardware unit is just a CRC with\n    a different polynomial and word-fed instead of byte-fed.  The MPU is little\n    endian.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 19:51:41 +1000\n\nsrecord (1.59.D010-1) unstable; urgency=low\n\n  * This change set updates the srec_examples(1) page, to use the new suffix for\n    m of the filter command line options.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 16:55:56 +1000\n\nsrecord (1.59.D009-1) unstable; urgency=low\n\n  * The names of the command line options have been changed (with backwards\n    compatibility) to consistently use _Big_Endian and _Little_Endian suffixes.\n    Previously there was an inconsistent mixture of prefixes and suffixes.  By\n    using suffixes, the emphasis on the purpose of the command line option,\n    rather then the endian-ness.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 16:18:05 +1000\n\nsrecord (1.59.D008-1) unstable; urgency=low\n\n  * This change set adds strict unchange file policy.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 12:58:00 +1000\n\nsrecord (1.59.D007-1) unstable; urgency=low\n\n  * This change set adds automation for needed packages, so does it\n    automagically after upgrades.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 May 2012 12:04:22 +1000\n\nsrecord (1.59.D006-1) unstable; urgency=low\n\n  * This change refactors output-file::put-word into a big-endian and little-\n    endian form, because code duplication was creeping in for the little-endian\n    case.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 16 Mar 2012 23:24:31 +1100\n\nsrecord (1.59.D005-1) unstable; urgency=low\n\n  * This change set refactors the input_file::get_word implementation into\n    specific get_word_be for big-endian and get_word_le for little-endian\n    because there was code duplication appearing for the little endian variety.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 16 Mar 2012 23:10:27 +1100\n\nsrecord (1.59.D004-1) unstable; urgency=low\n\n  * Eric Smith <eric@brouhaha.com> contributed code to read and write TRS-80\n    binary load module format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 16 Mar 2012 22:49:25 +1100\n\nsrecord (1.59.D003-1) unstable; urgency=low\n\n  * This change set makes sure the images are placed in the appropriate place\n    when turning man pages into web pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 11 Feb 2012 21:25:19 +1100\n\nsrecord (1.59.D002-1) unstable; urgency=low\n\n  * This change set adds links from the format names on the front page to the\n    format manual pages on the web site.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 11 Feb 2012 20:18:28 +1100\n\nsrecord (1.59.D001-1) unstable; urgency=low\n\n  * This change set prepares the SReocrd project for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 10 Feb 2012 12:34:20 +1100\n\nsrecord (1.58.D004-1) unstable; urgency=low\n\n  * This change set adds a number of additional CRC-16 polynomials, plus the\n    ability to select a polynomial by name, rather than by value. See http://\n    en.wikipedia.org/wiki/Cyclic_redundancy_check for a table of names and\n    values.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 09 Feb 2012 20:26:23 +1100\n\nsrecord (1.58.D003-1) unstable; urgency=low\n\n  * This change set provides all of the man pages on the web site, with suitable\n    links from the front page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 19 Dec 2011 12:01:10 +1100\n\nsrecord (1.58.D002-1) unstable; urgency=low\n\n  * This change set fixes several errors reported by lintian(1).\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 18 Dec 2011 21:15:27 +1100\n\nsrecord (1.58.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 18 Dec 2011 20:29:31 +1100\n\nsrecord (1.57.D017-1) unstable; urgency=low\n\n  * This change set fixes several spelling errors in the manual pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 18 Dec 2011 19:31:34 +1100\n\nsrecord (1.57.D016-1) unstable; urgency=low\n\n  * For symmetry with output_file::is_binary the output_file::mode method has\n    been replaced with output_file::is_binary\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 18 Dec 2011 19:24:19 +1100\n\nsrecord (1.57.D015-1) unstable; urgency=low\n\n  * The --guess command line option, for guessing the file format, now also\n    tells you the command line option you could have used instead of --guess.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 18 Dec 2011 19:04:32 +1100\n\nsrecord (1.57.D014-1) unstable; urgency=low\n\n  * The Intergated Device Technology (IDT) system integration manager (IDT/sim)\n    binary format is now understood for both reading and writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 18 Dec 2011 10:56:34 +1100\n\nsrecord (1.57.D013-1) unstable; urgency=low\n\n  * The Stag Prom Programmer binary format is now supported for both reading and\n    writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 17 Dec 2011 23:04:20 +1100\n\nsrecord (1.57.D012-1) unstable; urgency=low\n\n  * The Stag Prom Programer hexadecimal format is now understood for both\n    reading and writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 17 Dec 2011 18:47:19 +1100\n\nsrecord (1.57.D011-1) unstable; urgency=low\n\n  * The MIPS-Flash fiel format is now supported for both reading and writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 17 Dec 2011 14:15:05 +1100\n\nsrecord (1.57.D010-1) unstable; urgency=low\n\n  * This change set adds some more cross references to the srec_binary(5) man\n    page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 15 Sep 2011 22:02:22 +1000\n\nsrecord (1.57.D009-1) unstable; urgency=low\n\n  * Bernhard Weirich <Bernhard.Weirich@riedel.net> discovered that a backward\n    compatible option had been omitted when the -INtel_16 option was renamed -\n    INtel_HeX_16 to more closely match the usual abbreviation (INHX16) for this\n    format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 13 Sep 2011 21:46:54 +1000\n\nsrecord (1.57.D008-1) unstable; urgency=low\n\n  * The windows build instructions have been greatly imptoved, based on the\n    experiences of Jens Heilig <jens@familie-heilig.net> which he has generously\n    shared.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 31 Jul 2011 20:41:17 +1000\n\nsrecord (1.57.D007-1) unstable; urgency=low\n\n  * The srec_cat command is now able to read some hexdump files (although it is\n    possible for it to guess wrong about where data bytes appear in each line).\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 23 Jul 2011 23:38:26 +1000\n\nsrecord (1.57.D006-1) unstable; urgency=low\n\n  * This change set improves the documentation in the manual about sequence\n    warnings.  The -disable-sequence-warnings must come before the input file on\n    the command line.\n  * My thanks to emil gracic <emil_kruki@yahoo.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 22 Jul 2011 09:27:20 +1000\n\nsrecord (1.57.D005-1) unstable; urgency=low\n\n  * This change set fixes bugs found by the cppcheck(1) command.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 29 Jun 2011 19:15:39 +1000\n\nsrecord (1.57.D004-1) unstable; urgency=low\n\n  * The debian folk take exception to the \"almost always useless\" *.la files\n    install by libtool.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 29 Jun 2011 19:05:52 +1000\n\nsrecord (1.57.D003-1) unstable; urgency=low\n\n  * This change set silences the Lintian warning about unnecessaryily linked\n    shared libraries.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 12 Jun 2011 17:02:07 +1000\n\nsrecord (1.57.D002-1) unstable; urgency=low\n\n  * This change set adds an \"apt:\" link to the download page, for automagic\n    software install on Ubuntu.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 11 Jun 2011 09:40:47 +1000\n\nsrecord (1.57.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 09 Jun 2011 10:42:06 +1000\n\nsrecord (1.56.D011-1) unstable; urgency=low\n\n  * This change set updates the fletcher16 code to be consistent with http://\n    en.wikipedia.org/wiki/Fletcher%27s_checksum, and also with RFC 1146, and\n    also with RFC 905 Annex B\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 08 Jun 2011 23:19:34 +1000\n\nsrecord (1.56.D010-1) unstable; urgency=low\n\n  * The meaning of the --address-length option has been change for the Intel\n    output format.  Previously, 2 meant using i16hex 20-bit segmented\n    addressing, and >2 meant using i32hex extended addressing. This has been\n    changed: a value of 2 requests i8hex 16-bit addressing, a value of 3\n    requests i16hex 20-bit segment addressing, and a value >=4 requests i32hex\n    32-bit addressing.\n  * My thanks to Stephen R. Phillips <srp@CSECorporation.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 08 Jun 2011 23:03:57 +1000\n\nsrecord (1.56.D009-1) unstable; urgency=low\n\n  * This change set refactors how address ranges are check in the various output\n    formats, to use the same consistent test.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 08 Jun 2011 22:26:31 +1000\n\nsrecord (1.56.D008-1) unstable; urgency=low\n\n  * The --generate --repeat-string option is now able to take a string that\n    looks like a number as the text to be repeated.  My thanks to Stephen R.\n    Phillips <srp@CSECorporation.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 08 Jun 2011 22:05:56 +1000\n\nsrecord (1.56.D007-1) unstable; urgency=low\n\n  * This change set fixes the vim mode lines.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 15 Apr 2011 23:51:03 +1000\n\nsrecord (1.56.D006-1) unstable; urgency=low\n\n  * Luca Giancristofaro <luca.giancristofaro@prosa.com> discovered a WinAVR\n    linker that is a sandwich short of a picnic: it generated non-conforming\n    Intel hex end-of-file records.  This is no longer an error, but only a\n    warning.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 19 Jan 2011 23:51:04 +1100\n\nsrecord (1.56.D005-1) unstable; urgency=low\n\n  * This change set fixes a small grammatical error in the o_input.so file, used\n    by the 3 command line tools.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 06 Jan 2011 18:24:37 +1100\n\nsrecord (1.56.D004-1) unstable; urgency=low\n\n  * This change set adds Ubuntu Natty to the list of releases to upload against.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 06 Jan 2011 16:11:27 +1100\n\nsrecord (1.56.D003-1) unstable; urgency=low\n\n  * This change set fixes some problems with the RPM spec file.  My thanks to\n    Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 07 Nov 2010 17:32:35 +1100\n\nsrecord (1.56.D002-1) unstable; urgency=low\n\n  * This change set adds a hit counter to the download page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 05 Oct 2010 21:52:53 +1100\n\nsrecord (1.56.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 15 Sep 2010 21:46:01 +1000\n\nsrecord (1.55.D017-1) unstable; urgency=low\n\n  * False negative for two tests (for gcrypt functionality) have been fixed,\n    they can now cope with SHA224 and WHIRLPOOL being absent from the gcrypt\n    library.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 13 Sep 2010 14:26:25 +1000\n\nsrecord (1.55.D016-1) unstable; urgency=low\n\n  * The version of libgcrypt in Hardy does not have SHA224.  The test suite now\n    copes with this, rather than giving a false negative.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 12 Sep 2010 23:14:01 +1000\n\nsrecord (1.55.D015-1) unstable; urgency=low\n\n  * This change set adds a LP PPA link to the download page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 12 Sep 2010 22:53:47 +1000\n\nsrecord (1.55.D014-1) unstable; urgency=low\n\n  * This change set cleans up some of the terminology in the msbin sourec files.\n  * My thanks to David Kozub <zub@linux.fjfi.cvut.cz> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 11 Aug 2010 11:10:05 +1000\n\nsrecord (1.55.D013-1) unstable; urgency=low\n\n  * the aede-policy now includes comment checking.  Problems found have been\n    fixed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Aug 2010 22:07:30 +1000\n\nsrecord (1.55.D012-1) unstable; urgency=low\n\n  * Three noisy tests have been silenced; though they are functionally\n    unchanged.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Aug 2010 22:03:25 +1000\n\nsrecord (1.55.D011-1) unstable; urgency=low\n\n  * A bug has been fixed in the MsBin output, it now concatenates records\n    correctly, and calaulate checksums appropriately.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 06 Aug 2010 13:01:19 +1000\n\nsrecord (1.55.D010-1) unstable; urgency=low\n\n  * Additional build steps have been added to ensure that trhe Lintina hyphen\n    warning does not occur.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 03 Aug 2010 15:55:20 +1000\n\nsrecord (1.55.D009-1) unstable; urgency=low\n\n  * It is now possible to ask the Fletcher 16 filter to give you a specific\n    answer, and adjusting the checksum to achieve that result. It is also\n    possible to specify different seed values for the sums.\n  * My thanks to Gene Smith <Gene.Smith@siemens.com> for this patch, although\n    heavily modified.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 17 Jul 2010 17:20:52 +1000\n\nsrecord (1.55.D008-1) unstable; urgency=low\n\n  * This change set adds a request to include \"srecord\" in the Subject: of all\n    emails about srecord.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 15 Jul 2010 11:35:18 +1000\n\nsrecord (1.55.D007-1) unstable; urgency=low\n\n  * There is a new srec_cat --enable=optional-address to cause coutpit formats\n    capable of omitting addresses, to omit a leading zero address, as those\n    formats usually default the address to zero, if no address information is\n    seen before the first data record. Defaults to false (disabled).\n  * My thanks to Stuart MacDonald <stuart.macdonald@christiedigital.com> for\n    this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 28 Apr 2010 01:08:13 +1000\n\nsrecord (1.55.D006-1) unstable; urgency=low\n\n  * There is a new srec_cat --output-block-packing option, that may be used to\n    pack output records even when they cross internal SRecord boundaries.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 27 Apr 2010 23:33:46 +1000\n\nsrecord (1.55.D005-1) unstable; urgency=low\n\n  * There is a new srec_cat --output-block-size so that you can specify the\n    block size exactly, rather than implying it with the line length option.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 27 Apr 2010 23:01:27 +1000\n\nsrecord (1.55.D004-1) unstable; urgency=low\n\n  * This change set fixes various typos found in code comments.\n  * My thanks to Stuart MacDonald <stuart.macdonald@christiedigital.com>  for\n    this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 27 Apr 2010 15:12:41 +1000\n\nsrecord (1.55.D003-1) unstable; urgency=low\n\n  * This change set fixes a couple of signed-ness warnings frok gcc.\n  * My thanks to Stuart MacDonald <stuart.macdonald@christiedigital.com> for\n    this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 27 Apr 2010 14:58:10 +1000\n\nsrecord (1.55.D002-1) unstable; urgency=low\n\n  * This change set adds some additional text to the srec_input(1) man page, and\n    also mirrors the Joe Geluso document (now gone from the interwebs).\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 31 Mar 2010 11:52:09 +1100\n\nsrecord (1.55.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord foe the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 11 Feb 2010 00:09:02 +1100\n\nsrecord (1.54.D004-1) unstable; urgency=low\n\n  * The rpm.spec file has been improved, it now separates the commands, shared\n    libraries and development files.\n  * This change set also rebuilds the Makefile.in file, now that aemakegen has\n    the bug fixed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 10 Feb 2010 23:27:43 +1100\n\nsrecord (1.54.D003-1) unstable; urgency=low\n\n  * This change set changes the way recipes are echoed during the build, for a\n    much cleaner experience.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 02 Feb 2010 12:00:04 +1100\n\nsrecord (1.54.D002-1) unstable; urgency=low\n\n  * This change set corrects a number of read_inner classes to return bool (the\n    int was left-over C from years ago).\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 01 Feb 2010 08:47:08 +1100\n\nsrecord (1.54.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Jan 2010 16:14:20 +1100\n\nsrecord (1.53.D031-1) unstable; urgency=low\n\n  * The web site Download page now includes a link to the pre-build Debian\n    packages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Jan 2010 15:09:33 +1100\n\nsrecord (1.53.D030-1) unstable; urgency=low\n\n  * This change set adds debian packaging to the routine build, to ensure there\n    are no problems.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Jan 2010 14:46:14 +1100\n\nsrecord (1.53.D029-1) unstable; urgency=low\n\n  * This change set fixes soem lintian warnings in man pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Jan 2010 14:37:42 +1100\n\nsrecord (1.53.D028-1) unstable; urgency=low\n\n  * The license on the shared library code has been updated to be LGPLv3+ to\n    permit use under the \"system library\" provisions.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Jan 2010 08:42:13 +1100\n\nsrecord (1.53.D027-1) unstable; urgency=low\n\n  * Some versions of gcrypt.h are so old the fail to define gcry_md_hd_t and\n    thus everything fails messily.  Code has been added to etc/configure.ac to\n    cope with this situation.\n  * My thanks to Michel Dubois <dubois.michel@gmail.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 28 Jan 2010 07:53:26 +1100\n\nsrecord (1.53.D026-1) unstable; urgency=low\n\n  * The license on the shared library code has been updated to be LGPLv3+ to\n    permit use under the \"system library\" provisions.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 28 Jan 2010 07:30:24 +1100\n\nsrecord (1.53.D025-1) unstable; urgency=low\n\n  * The license on the shared library code has been updated to be LGPLv3+ to\n    permit use under the \"system library\" provisions.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 19:52:35 +1100\n\nsrecord (1.53.D024-1) unstable; urgency=low\n\n  * The license on the shared library code has been updated to be LGPLv3+ to\n    permit use under the \"system library\" provisions.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 15:26:36 +1100\n\nsrecord (1.53.D023-1) unstable; urgency=low\n\n  * This change set is merely a rebuild so the test execution estimates are\n    better for the new architecture.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 14:31:04 +1100\n\nsrecord (1.53.D022-1) unstable; urgency=low\n\n  * The shared library is now mentioned in the Reference Manual.  It simply\n    points to the Doxygen documentation on the web site.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 14:28:36 +1100\n\nsrecord (1.53.D021-1) unstable; urgency=low\n\n  * This change set adds some additional authors detail.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 14:17:09 +1100\n\nsrecord (1.53.D020-1) unstable; urgency=low\n\n  * The .spec file is now generated by aegis' aemakegen tool.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 13:49:18 +1100\n\nsrecord (1.53.D019-1) unstable; urgency=low\n\n  * This change set chases $(libdir) to be left unmolested, so that the shared\n    library is installed into the cirrect place.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 09:17:28 +1100\n\nsrecord (1.53.D018-1) unstable; urgency=low\n\n  * This change set adds GNU Libtool to the configure.ac file, and also mentions\n    it in the Building instructions.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Jan 2010 08:56:49 +1100\n\nsrecord (1.53.D017-1) unstable; urgency=low\n\n  * This change set adds the pkgconfig file to the installed files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 26 Jan 2010 23:23:48 +1100\n\nsrecord (1.53.D016-1) unstable; urgency=low\n\n  * This change set adds an icon for the library on the web site.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 26 Jan 2010 21:52:36 +1100\n\nsrecord (1.53.D015-1) unstable; urgency=low\n\n  * This change set adds the library's Doxygen documentation to the web site.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 25 Jan 2010 22:47:46 +1100\n\nsrecord (1.53.D014-1) unstable; urgency=low\n\n  * This change set completes applying the namespace to the remaining few\n    library functions.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 25 Jan 2010 21:45:32 +1100\n\nsrecord (1.53.D013-1) unstable; urgency=low\n\n  * This change set renames srecord::input_file_srecord to srecord::input_file_\n    motorola, and renames srecord::output_file_srecord to srecord::output_file_\n    motorola, in order to be consistent with other vendor-specific file format\n    names.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 25 Jan 2010 20:28:04 +1100\n\nsrecord (1.53.D012-1) unstable; urgency=low\n\n  * This change set starts the introduction of the \"srecord\" name space.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 25 Jan 2010 20:10:31 +1100\n\nsrecord (1.53.D011-1) unstable; urgency=low\n\n  * This change set changes the build system to use libtool to build the shared\n    library.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 22 Jan 2010 14:07:30 +1100\n\nsrecord (1.53.D010-1) unstable; urgency=low\n\n  * This change set adds the necessary foo to have Makefile.in build and install\n    a shared library.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 22 Jan 2010 08:09:11 +1100\n\nsrecord (1.53.D009-1) unstable; urgency=low\n\n  * This change continues moving files under srecord/ for the library, when it\n    happens.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Jan 2010 12:21:26 +1100\n\nsrecord (1.53.D008-1) unstable; urgency=low\n\n  * This change set continues the work to put everythinbg into a shared library.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Jan 2010 12:00:56 +1100\n\nsrecord (1.53.D007-1) unstable; urgency=low\n\n  * This change set starts moving the library to a better name to be installed\n    as.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Jan 2010 09:37:42 +1100\n\nsrecord (1.53.D006-1) unstable; urgency=low\n\n  * This change set fixes the order of entries in the Release Notes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Jan 2010 09:11:57 +1100\n\nsrecord (1.53.D005-1) unstable; urgency=low\n\n  * This change set fixes a typo in the release notes.\n  * My thanks to John McMaster <johndmcmaster@gmail.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Jan 2010 08:52:41 +1100\n\nsrecord (1.53.D004-1) unstable; urgency=low\n\n  * The code is now more able to cope with ancient libgcrypt versions, that\n    don't have SHA224 or WHIRLPOOL algorithms.\n  * My thanks to Gaysinsky Valery-BVG004 <BVG004@motorola.com> for reporting\n    this bug.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 01 Dec 2009 23:09:30 +1100\n\nsrecord (1.53.D003-1) unstable; urgency=low\n\n  * The srec_example(1) page has been made slightly more explicit about\n    exclusive min, max and len.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 22 Nov 2009 17:06:35 +1100\n\nsrecord (1.53.D002-1) unstable; urgency=low\n\n  * This change set adds another architecture pattern, to account for 64-bit\n    machines.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 22 Nov 2009 15:55:40 +1100\n\nsrecord (1.53.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 10 Nov 2009 14:31:00 +1100\n\nsrecord (1.52.D011-1) unstable; urgency=low\n\n  * Microchip Inc. has thrown us a\n  * curve ball and I am curious to know if you already have dealt with this.\n  * If not, I can easily write a C# application. I just don't want to\n  * re-invent the wheel. Basically, the Microchip dsPIC33F microcontrollers\n  * have a weird memory storage pattern and they are able to store 3 bytes\n  * in an address that should only contain 2 bytes. The result is a HEX\n  * file that has zero-filled the top byte, and all addresses are doubled\n  * from what they are in the chip. Here is an example:\n  * :20316000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0\n  * 067\n  * :20318000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0\n  * 047\n  * I would like to use the -unfill parameter to get rid of the extra space\n  * since our EEPROM chips are filling up. However, the -unfill parameter\n  * assumes single byte patterns. I theoretically could find a way around\n  * this with an entire batch file filled with srec_cat -crop routines, but\n  * I was hoping there was a better way. If you don't have anything to\n  * easily fix this, no worries. Just thought I would ask. Thanks again!!!\n  * my thanks to Daniel Jones <Daniel.Jones@mceinc.com> for this example.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 10 Nov 2009 13:40:42 +1100\n\nsrecord (1.52.D010-1) unstable; urgency=low\n\n  * This change set make some improvements to the MsBin code.\n  * My thanks to David Kozub <zub@linux.fjfi.cvut.cz> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 10 Nov 2009 13:05:31 +1100\n\nsrecord (1.52.D009-1) unstable; urgency=low\n\n  * This change set adds more detail (well, documents the lack of detail) for S5\n    and S6 records.\n  * My thanks to eustace@users.sourceforge.net for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 09 Nov 2009 13:03:07 +1100\n\nsrecord (1.52.D008-1) unstable; urgency=low\n\n  * This change set gets rid of the last of the TAB characters in the sources.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 09 Nov 2009 12:40:39 +1100\n\nsrecord (1.52.D007-1) unstable; urgency=low\n\n  * This change set adds a coding style section to each of the \"how to add a new\n    format\" and \"how to add a new filter\" sections of the reference manual.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 09 Nov 2009 12:23:07 +1100\n\nsrecord (1.52.D006-1) unstable; urgency=low\n\n  * There is a new MsBin (Windows CE Binary Image Data) file format.\n  * My thanks to David Kozub <zub@linux.fjfi.cvut.cz> for this contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 09 Nov 2009 11:37:55 +1100\n\nsrecord (1.52.D005-1) unstable; urgency=low\n\n  * The web site has been updated to be less subtle about windows users building\n    SRecord or themselves.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Nov 2009 23:53:09 +1100\n\nsrecord (1.52.D004-1) unstable; urgency=low\n\n  * The code now make use of <stding.h> to define address sizes.  It also uses\n    size_t more correctly.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Nov 2009 14:49:44 +1100\n\nsrecord (1.52.D003-1) unstable; urgency=low\n\n  * The warning about hyphen in the manual pages has been silenced, by careful\n    use of \\-, \\[hy\\ and \\[mi] as appropriate.  Sure makes some of the sources\n    ugly, tho.\n  * The warning about the undefined .XX macro has been silenced, by making it\n    conditional.\n  * I am not completely happy with the fundamentalist pedantry preached by some\n    Debian packagers.  These are only warnings, after all.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 15 Oct 2009 23:25:42 +1100\n\nsrecord (1.52.D002-1) unstable; urgency=low\n\n  * This change adds conditionals so that the code will build without libgcrypt\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 18 Sep 2009 15:31:02 +1000\n\nsrecord (1.52.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 17 Sep 2009 11:18:12 +1000\n\nsrecord (1.51.D002-1) unstable; urgency=low\n\n  * There is a new srec_cat -generator -l-e-constant data generator (and also -\n    b-e-const) that may be used to insert multi-byte constants into your data.\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 17 Sep 2009 10:44:28 +1000\n\nsrecord (1.51.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 13 Sep 2009 08:38:36 +1000\n\nsrecord (1.50.D006-1) unstable; urgency=low\n\n  * The link to the official Debian package has been updated.\n  * My thanks to Fathi Boudra <fabo@debian.org> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 27 Aug 2009 12:11:34 +1000\n\nsrecord (1.50.D005-1) unstable; urgency=low\n\n  * please find attached a patch to build srecord with gcc 4.4.\n  * could you also update srecord informations related to Debian on the\n    homepage:\n  * > The Debian package is maintained by Stephen Moraco <stephen@debian.org>\n    and\n  * > is available at http://packages.debian.org/unstable/utils/srecord.html\n  * Stephen isn't anymore srecord Debian maintainer and the following link is\n    more\n  * appropriate: http://packages.qa.debian.org/s/srecord.html\n  * Thanks.\n  * Fathi Boudra <fabo@debian.org>\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 11 Aug 2009 08:18:36 +1000\n\nsrecord (1.50.D004-1) unstable; urgency=low\n\n  * The use of two back ticks as an open quote has been replaced, particularly\n    in the man pages.  There are much nicer forms available these days.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 11 Jul 2009 21:10:23 +1000\n\nsrecord (1.50.D003-1) unstable; urgency=low\n\n  * A bugs has been fixed in the Intel output format.  When using the segemented\n    format (address-length=2) records that spand the end of segment boundary are\n    tricky.  The code now carefully splits such output records, to ensure the\n    two parts are explicitly placed into separate segments.\n  * My thanks to jxta@users.sourceforge.net for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 11 Jul 2009 20:18:00 +1000\n\nsrecord (1.50.D002-1) unstable; urgency=low\n\n  * A build problem has been fixed.  It is now possible to compile with gcc 4.4.\n  * My thanks to Tom \"spot\" Callaway <tcallawa@redhat.com> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 11 Jul 2009 12:33:34 +1000\n\nsrecord (1.50.D001-1) unstable; urgency=low\n\n  * This change prepares Aegis for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 09 Jul 2009 16:48:56 +1000\n\nsrecord (1.49.D012-1) unstable; urgency=low\n\n  * The code has been enhanced to provide high-to-low bit order CRC16 (as was\n    already available) and also low-to-high bit order. This is confirmed to\n    produce the same results as reversing the order of bits within bytes *prior*\n    to feeding it to the algorithm.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 09 Jul 2009 16:27:35 +1000\n\nsrecord (1.49.D011-1) unstable; urgency=low\n\n  * This change set removes the Ciommunity Choice nominatiob button.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 29 Jun 2009 18:51:47 +1000\n\nsrecord (1.49.D010-1) unstable; urgency=low\n\n  * The CRC-16 filters have been enhanved.  Originally they processed the bits\n    in each byte from most significant bit to least significant bit.  The\n    filters are now able to process in the opposite order: least significant bit\n    to most significant bit.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 22 Jun 2009 15:55:45 +1000\n\nsrecord (1.49.D009-1) unstable; urgency=low\n\n  * The SHA224, SHA256, SHA384, SHA 512 and Whirlpool message digests are now\n    supported.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 21 Jun 2009 20:19:17 +1000\n\nsrecord (1.49.D008-1) unstable; urgency=low\n\n  * The RipeMD-160 crypto hash function is how supported.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 21 Jun 2009 18:21:45 +1000\n\nsrecord (1.49.D007-1) unstable; urgency=low\n\n  * The CRC-16 base class is now able to be passed a polynomial for\n    calculations, rather than assuming CCITT standard polynomial.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 21 Jun 2009 17:53:19 +1000\n\nsrecord (1.49.D006-1) unstable; urgency=low\n\n  * The command line now allows a number of bytes to be passed to the --bitrev\n    option; this is implemented using the byte-swap filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 21 Jun 2009 17:42:10 +1000\n\nsrecord (1.49.D005-1) unstable; urgency=low\n\n  * There is a new srec_cat -bit-reverse filter, that may be ised to reverse the\n    bits in each data byte.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 21 Jun 2009 17:23:13 +1000\n\nsrecord (1.49.D004-1) unstable; urgency=low\n\n  * The SHA1 secure hash is now supported.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 21 Jun 2009 00:03:16 +1000\n\nsrecord (1.49.D003-1) unstable; urgency=low\n\n  * There is a new MD5 input filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 19 Jun 2009 22:30:56 +1000\n\nsrecord (1.49.D002-1) unstable; urgency=low\n\n  * The filters that requires the complete input data before they can beging\n    processing have been refactored to have a common base class.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 19 Jun 2009 16:29:17 +1000\n\nsrecord (1.49.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 17 May 2009 20:53:14 +1000\n\nsrecord (1.48.D003-1) unstable; urgency=low\n\n  * This change set adds a link to the SourceForge community choice awards.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 17 May 2009 20:46:51 +1000\n\nsrecord (1.48.D002-1) unstable; urgency=low\n\n  * A typo in the srec_input(1) man page has been fixed.\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 22 Apr 2009 14:26:33 +1000\n\nsrecord (1.48.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord the the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 19 Apr 2009 20:32:13 +1000\n\nsrecord (1.47.D006-1) unstable; urgency=low\n\n  * This change fixesa typo in the srec_ti_tagged_16(5) man page.\n  * My thanks to Jason Armistead for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 19 Apr 2009 20:15:15 +1000\n\nsrecord (1.47.D005-1) unstable; urgency=low\n\n  * There are new Fletcher Checksum filters, both 32-bits and 16-bits, both\n    little-endian and big-endian.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 24 Mar 2009 20:36:46 +1100\n\nsrecord (1.47.D004-1) unstable; urgency=low\n\n  * There is a new pair of \"Adler 16\" filters.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 22 Mar 2009 21:53:33 +1100\n\nsrecord (1.47.D003-1) unstable; urgency=low\n\n  * There is now a input filter that may be used to calculate Adler 32 bit\n    checksums. It has two command line forms, --big-endian-adler32 and --\n    little-endian-adler32.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 22 Mar 2009 18:29:05 +1100\n\nsrecord (1.47.D002-1) unstable; urgency=low\n\n  * Some more colour has been added to the web site, and some cute document\n    icons.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 19 Feb 2009 22:34:12 +1100\n\nsrecord (1.47.D001-1) unstable; urgency=low\n\n  * This change set preparse SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 19 Feb 2009 18:54:39 +1100\n\nsrecord (1.46.D005-1) unstable; urgency=low\n\n  * The DEPTH field when writing Altera MIF file has been corrected, it no\n    longer appears at the end.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 19 Feb 2009 17:02:54 +1100\n\nsrecord (1.46.D004-1) unstable; urgency=low\n\n  * The Altera MIF input class now understads address ranges, provided they fit\n    into a record buffer.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 19 Feb 2009 16:46:40 +1100\n\nsrecord (1.46.D003-1) unstable; urgency=low\n\n  * The Altera MIF format is now supported for reading.\n  * My thanks to Arnim Laeuger for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 18 Feb 2009 23:18:58 +1100\n\nsrecord (1.46.D002-1) unstable; urgency=low\n\n  * The Altera MIF format is now understood for writing.\n  * My thanks to Arnim Laeuger for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 18 Feb 2009 18:03:40 +1100\n\nsrecord (1.46.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 13 Jan 2009 12:40:06 +1100\n\nsrecord (1.45.D006-1) unstable; urgency=low\n\n  * There is a new option for the --x-e-length filters, they can now accept a\n    width, and this is divided into the byte lenght, so that youcan inert the\n    length in mulrips of words (2) or longs (4).\n  * My thanks to Bruno Pape <bruno.pape@unh.edu> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 13 Jan 2009 12:22:49 +1100\n\nsrecord (1.45.D005-1) unstable; urgency=low\n\n  * The email addresses have all been replaced with my new address.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 10 Jan 2009 20:00:27 +1100\n\nsrecord (1.45.D004-1) unstable; urgency=low\n\n  * This change fixes an error in the --be-e-length example.\n  * My thanks to Bruno Pape <bruno.pape@unh.edu> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 10 Jan 2009 19:50:14 +1100\n\nsrecord (1.45.D003-1) unstable; urgency=low\n\n  * This change set fixes a couple of small problems with the documentation.  My\n    thanks to Garbergs Henrik <henrik.garbergs@space.se> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 17 Dec 2008 19:56:01 +1100\n\nsrecord (1.45.D002-1) unstable; urgency=low\n\n  * The --minimum and --maximum options have been renamed --minimum-address and\n    --maximum-address, to avoid a grammar syntax problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 13 Dec 2008 23:48:38 +1100\n\nsrecord (1.45.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 30 Sep 2008 19:02:27 +1000\n\nsrecord (1.44.D006-1) unstable; urgency=low\n\n  * A bug has been fixed in the srec_cat command.  You are now able to specify\n    several inputs within parentheses, instead of just one.  This allows filters\n    to be allpied to the concatenation of several inputs.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 30 Sep 2008 09:53:10 +1000\n\nsrecord (1.44.D005-1) unstable; urgency=low\n\n  * The formatting of the text in the srec_cat(1) man page has been improved.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 30 Sep 2008 08:46:43 +1000\n\nsrecord (1.44.D004-1) unstable; urgency=low\n\n  * The new file templates have had their initial comment blocks tweaked.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 02 Sep 2008 12:03:12 +1000\n\nsrecord (1.44.D003-1) unstable; urgency=low\n\n  * This change set fixes the .h files' #define insularor names.  They weren't\n    fixed when the files were renamed from the include/ directory, and they\n    shpuld have been.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 02 Sep 2008 11:17:23 +1000\n\nsrecord (1.44.D002-1) unstable; urgency=low\n\n  * The srec_cat command is now able to write FORTH output.\n  * My thanks to Torsten Sadowski <tsadowski@gmx.net> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 02 Sep 2008 08:49:38 +1000\n\nsrecord (1.44.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Aug 2008 16:05:19 +1000\n\nsrecord (1.43.D008-1) unstable; urgency=low\n\n  * The web page now cross references the Uncia project.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Aug 2008 15:50:50 +1000\n\nsrecord (1.43.D007-1) unstable; urgency=low\n\n  * Some compilers issue a warning when const appears before extern.  \"warning:\n    storage class is not first\".  The C output has been updated to conform to\n    this expectation.\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 07 Aug 2008 21:19:21 +1000\n\nsrecord (1.43.D006-1) unstable; urgency=low\n\n  * The manual page for srec_cat(1) has been enhanced to describe the in-memory\n    data model, and the resulting output data order.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 16 Jul 2008 20:25:01 +1000\n\nsrecord (1.43.D005-1) unstable; urgency=low\n\n  * The -motorola optional width argument now produces a better error message\n    when it is out of range.\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n  * The --fill filter now checks the size, and fails for absurdly large fills,\n    with a --big override if they really want >1GB fills.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 09 Jul 2008 10:00:26 +1000\n\nsrecord (1.43.D004-1) unstable; urgency=low\n\n  * A bug in the .spec file for rpmbuild has been fixed, not now takes notice of\n    $RPM_BUILD_ROOT\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 09 Jul 2008 09:36:11 +1000\n\nsrecord (1.43.D003-1) unstable; urgency=low\n\n  * There is a new srec_cat --line-termination option, which may be used to\n    select the desired line termination of output text files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 08 Jul 2008 09:12:17 +1000\n\nsrecord (1.43.D002-1) unstable; urgency=low\n\n  * Several typographical errors on a number of man pages have been fixed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 07 Jul 2008 09:58:54 +1000\n\nsrecord (1.43.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 Jul 2008 15:25:06 +1000\n\nsrecord (1.42.D008-1) unstable; urgency=low\n\n  * A bug has been fixed in the handling of the --enable and --disable options;\n    it no longer drops a command line argument and giving incorrect usage\n    messages\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 Jul 2008 22:38:34 +1000\n\nsrecord (1.42.D007-1) unstable; urgency=low\n\n  * The srec-cat --data-only option has been broken down into four separate\n    controls.  It is now possible to --enable and --disable individual features,\n    such as 'header', 'data-count', 'execution-start-address' and 'footer'.\n  * My thanks to Wouter <wutje@users.sourceforge.net> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 04 Jul 2008 14:44:25 +1000\n\nsrecord (1.42.D006-1) unstable; urgency=low\n\n  * All of the \"using namespace std;\" lines have been removed, and the necessary\n    corrections have been made.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 04 Jul 2008 13:03:20 +1000\n\nsrecord (1.42.D005-1) unstable; urgency=low\n\n  * The srec_cat -start-address option has been renamed -execution-start-address\n    to remove any confusion with the -offset filter.  The documentation now\n    explicitly explains the difference between the two.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 26 Jun 2008 14:38:45 +1000\n\nsrecord (1.42.D004-1) unstable; urgency=low\n\n  * Examples of converting to and from binary files have been added.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 24 Jun 2008 08:48:58 +1000\n\nsrecord (1.42.D003-1) unstable; urgency=low\n\n  * This change set causes the MOS Tech format to emit an end record, even when\n    there is no start address passed in.\n  * My thanks to Ed <dxforth@netbay.com.au> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 07 Jun 2008 17:38:59 +1000\n\nsrecord (1.42.D002-1) unstable; urgency=low\n\n  * Not all of the web pages were being rebuild when the version number changed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 02 Jun 2008 08:39:32 +1000\n\nsrecord (1.42.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 01 Jun 2008 22:15:09 +1000\n\nsrecord (1.41.D003-1) unstable; urgency=low\n\n  * The MOS Technology format was not reading and writing end records correctly,\n    this has been fixed.  The name of the company has been fixed, too.\n  * My thanks to Ed <dxforth@netbay.com.au> for reporting these problems.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 01 Jun 2008 22:03:26 +1000\n\nsrecord (1.41.D002-1) unstable; urgency=low\n\n  * Some examples of how to insert constant or scripted data into your EPROM\n    load files has been added to the srec_examples(1) man page.\n  * My thanks to Brad Schick <schickb@gmail.com> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 14 May 2008 13:03:44 +1000\n\nsrecord (1.41.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 12 May 2008 10:59:10 +1000\n\nsrecord (1.40.D016-1) unstable; urgency=low\n\n  * This change set fixed two tests which were giving false negatives on Cygwin.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 12 May 2008 10:39:55 +1000\n\nsrecord (1.40.D015-1) unstable; urgency=low\n\n  * The handling of the program name has been changed, so that any trailing .exe\n    is removed.  This was giving false negatives in tests.\n  * Also, the GNU diff --strip-trailing-cr option is exploited if available,\n    dealing with a number of other false negatives.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 12 May 2008 09:50:46 +1000\n\nsrecord (1.40.D014-1) unstable; urgency=low\n\n  * The handling of endian-ness within the srec_arglex::get_input method has\n    been reworked so that there are half as many cases (i.e. switch cases which\n    differe only in endian-ness have been merged).\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 18 Apr 2008 10:43:58 +1000\n\nsrecord (1.40.D013-1) unstable; urgency=low\n\n  * The interval classes have been extended with an inclusive/exclusive\n    parameters to their constructors, rendering the specific classes obsolete.\n    So by adding 99 lines of code, we could remove 750 lines of code.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 18 Apr 2008 09:44:50 +1000\n\nsrecord (1.40.D012-1) unstable; urgency=low\n\n  * There are six new filters (-be-exclusive-length, -le-exclusive-length, -be-\n    exclusive-maximum, -le-exclusive-maximum, -be-exclusive-minimum and -le-\n    exclusive-minimum) which are very similar to their non-exclusive\n    equivalents, except that they do not include the adress range covered by\n    their output in their output.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 17 Apr 2008 22:53:59 +1000\n\nsrecord (1.40.D011-1) unstable; urgency=low\n\n  * Due to an uncaught merge problem, the deference manual was including the\n    content twice, in such a way that the automagic bring-the-content-to-the-\n    front script was getting it wrong - ugly wrong.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 16 Apr 2008 15:00:10 +1000\n\nsrecord (1.40.D010-1) unstable; urgency=low\n\n  * This change set adds endian-conditional encode and decode functions to srec_\n    record\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 16 Apr 2008 14:35:59 +1000\n\nsrecord (1.40.D009-1) unstable; urgency=low\n\n  * The use of boolean to represent endian-ness has been removed.  It was\n    confusing because it was not consistent.  There is now and explicit endian_t\n    type and associated enum tags, to make the code more consistent and more\n    readable.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 16 Apr 2008 11:54:08 +1000\n\nsrecord (1.40.D008-1) unstable; urgency=low\n\n  * The srec_input::reda method now returns a bool, rather than an int which was\n    everywhere treated like a bool.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 16 Apr 2008 11:41:58 +1000\n\nsrecord (1.40.D007-1) unstable; urgency=low\n\n  * This change adds a new word wise eprom_address array for the C array output\n    format when in word output mode and also in compressed output mode.\n  * The existing foo_address array is correct but assumes that the memory map of\n    the device being programmed is 8 bits. As such, a new foo_word_address array\n    is added as an alternative in the case of 16 bit addresses.\n  * My thanks to Scott Finneran for this change set.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 30 Mar 2008 10:53:39 +1100\n\nsrecord (1.40.D006-1) unstable; urgency=low\n\n  * This change adds the missing section descriptor arrays to the generated\n    header file when using the c_compressed (section) option in c_array output\n    mode.\n  * My thanks to Scott Finneran for this change set.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 30 Mar 2008 10:48:35 +1100\n\nsrecord (1.40.D005-1) unstable; urgency=low\n\n  * Minor changes to accomodate the acceptable options to the emacs version of\n    etags in the build system.\n  * My thanks to Soctt Finneran for this change set.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 29 Mar 2008 17:16:49 +1100\n\nsrecord (1.40.D004-1) unstable; urgency=low\n\n  * A bugs has been fixed with the C array output format when using the output_\n    word and include options.  The generated header file incorrectly declared\n    the data as being an array of unsigned char regardless of the output_word\n    option, it now outputs an array of unsigned short.\n  * My thanks to Scott Finneran for this change set.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 29 Mar 2008 17:08:29 +1100\n\nsrecord (1.40.D003-1) unstable; urgency=low\n\n  * A problem with the names of the executables in the .spec file has been\n    fixed, and the BuildRequires has been updated.\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 20 Mar 2008 13:54:52 +1100\n\nsrecord (1.40.D002-1) unstable; urgency=low\n\n  * The web pages were missing the version numbers, which was particularly nasty\n    for the download page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 13 Mar 2008 22:14:42 +1100\n\nsrecord (1.40.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 13 Mar 2008 21:55:48 +1100\n\nsrecord (1.39.D019-1) unstable; urgency=low\n\n  * This change set fixes an RPM build problem.  The spec file needed some\n    tweaking.\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 13 Mar 2008 13:56:16 +1100\n\nsrecord (1.39.D018-1) unstable; urgency=low\n\n  * This change set removes some left-over includes used in the past for\n    debugging.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 01 Mar 2008 22:11:57 +1100\n\nsrecord (1.39.D017-1) unstable; urgency=low\n\n  * The srec_output_file_hexdump Doxygen documentation has been improved.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 01 Mar 2008 20:34:01 +1100\n\nsrecord (1.39.D016-1) unstable; urgency=low\n\n  * There was no need to dynamically allocate the memory image used by srec_cat,\n    and several other places.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 01 Mar 2008 20:22:33 +1100\n\nsrecord (1.39.D015-1) unstable; urgency=low\n\n  * The use of srec_memory_walker has been refactored to habe a pointer type,\n    and the derived classes refactpred to enforce this.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 01 Mar 2008 20:02:58 +1100\n\nsrecord (1.39.D014-1) unstable; urgency=low\n\n  * The srec_output* has been refactored as srec_output::pointer instead, with\n    create class methods to enforce it.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 01 Mar 2008 18:23:19 +1100\n\nsrecord (1.39.D013-1) unstable; urgency=low\n\n  * An example has been added which shows how to use the hex-dump output format\n    to look at the checksum or CRC of a file's data.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Feb 2008 23:57:02 +1100\n\nsrecord (1.39.D012-1) unstable; urgency=low\n\n  * The BUILDING file now tells you about the Boost library dependency.  And the\n    ./configure script now fails if it is not installed.\n  * My thanks to Chris Teague for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Feb 2008 23:37:00 +1100\n\nsrecord (1.39.D011-1) unstable; urgency=low\n\n  * The release notes (and changelog.txt) were being built incorrectly, and\n    severely truncated.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 27 Feb 2008 08:25:58 +1100\n\nsrecord (1.39.D010-1) unstable; urgency=low\n\n  * The code has been refactored to use srec_input::pointer instead of srec_\n    input *\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 18 Feb 2008 02:10:50 +1100\n\nsrecord (1.39.D009-1) unstable; urgency=low\n\n  * This change set fixes build problems found with g++ 4.3\n  * My thanks to Fathi Boudra <fabo@debian.org> for reporting this problem.\n    Fathi is the Debian maintainer for SRecord.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 16 Feb 2008 23:24:30 +1100\n\nsrecord (1.39.D008-1) unstable; urgency=low\n\n  * The handling of groff in the Makefile.in file has been improved.  Mostly\n    this was an Aegis bug, but not completely.\n  * My thanks to Fathi Boudra <fabo@debian.org> for this patch.  Fathi is the\n    Debian maintainer for SRecord.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 16 Feb 2008 22:00:08 +1100\n\nsrecord (1.39.D007-1) unstable; urgency=low\n\n  * An incorrect section number on the srec_fastload(5) man page has been fixed.\n  * My thanks to Fathi Boudra <fabo@debian.org> for this patch.  Fathi is the\n    Debian maintainer for SRecord.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 16 Feb 2008 16:47:58 +1100\n\nsrecord (1.39.D006-1) unstable; urgency=low\n\n  * This change set removes several useless includes of <cstdio>\n  * My thanks to Fathi Boudra <fabo@debian.org> for this patch.  Fathi is the\n    Debian maintainer for SRecord.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 16 Feb 2008 16:08:39 +1100\n\nsrecord (1.39.D005-1) unstable; urgency=low\n\n  * This change set adds support for GCC 4.3 to the code base.\n  * My thanks to Fathi Boudra <fabo@debian.org> for this patch.  Fathi is the\n    Debian maintainer for SRecord.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 16 Feb 2008 16:03:16 +1100\n\nsrecord (1.39.D004-1) unstable; urgency=low\n\n  * A bug has been fixed in the calculation of ranges on the command line, it no\n    longer goes into an infinite loop for \"--fill 0xFF -over { foo.hex -exclude\n    -within foo.hex }\" construct, which should have been calculating an empty\n    fill set, but was instead calculating a 4GB fill set.\n  * The baseline text exemption is because it takes a couple of days to run when\n    it gets the wrong answer!\n  * My thanks to Dan Norstedt <dan@norstedt.net> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 14 Feb 2008 10:29:06 +1100\n\nsrecord (1.39.D003-1) unstable; urgency=low\n\n  * This change set adds processing for the datarootdir value to the ./configure\n    file.  Mostly to silence an autoconf warning.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 14 Feb 2008 08:29:49 +1100\n\nsrecord (1.39.D002-1) unstable; urgency=low\n\n  * The CRC32 filters now take an optional -xmodem option, to use an xmodem-like\n    (all bit zero) initial state, rather than the default CCITT (all bits on)\n    initial state.\n  * My thanks to Krauss Manfred (LLI) <Manfred.Krauss@liebherr.com> for this\n    suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 07 Feb 2008 12:02:21 +1100\n\nsrecord (1.39.D001-1) unstable; urgency=low\n\n  * This change set prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 04 Feb 2008 12:44:06 +1100\n\nsrecord (1.38.D003-1) unstable; urgency=low\n\n  * The test have been changed to use a common test_prelude.  This allows the\n    $PATH to be used to find commands, and will eventually allow a shared\n    librray to be used.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 04 Feb 2008 12:31:44 +1100\n\nsrecord (1.38.D002-1) unstable; urgency=low\n\n  * A bug has been fixed in the use of parentheses to group filters and override\n    the default precedences.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 03 Feb 2008 14:23:14 +1100\n\nsrecord (1.38.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 14 Jan 2008 10:38:22 +1100\n\nsrecord (1.37.D005-1) unstable; urgency=low\n\n  * The CRC16 filters now support a -Broken option, to perform a common-but-\n    broken CRC16 calculation, in addition to the CCITT and XMODEM calculations.\n  * My thanks to Manfred Kaiser <kaiser.m.6@pg.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 14 Jan 2008 10:23:47 +1100\n\nsrecord (1.37.D004-1) unstable; urgency=low\n\n  * A link has been added to the CRC16 man page section, with a link to the\n    www.joegeluso.com/software/articles/ccitt.htm web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 10 Jan 2008 23:47:00 +1100\n\nsrecord (1.37.D003-1) unstable; urgency=low\n\n  * A buglet has been fixed in the srec-motorola(5) man page, it now includes S6\n    in the list of things that can appear in the type field.\n  * My thanks to Curtis Wald <cwald@watchguardvideo.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 10 Jan 2008 08:19:43 +1100\n\nsrecord (1.37.D002-1) unstable; urgency=low\n\n  * The new ability to negate expressions is now mentioned int he srec_\n    examples(1) man page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 29 Oct 2007 15:04:39 +1100\n\nsrecord (1.37.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 29 Oct 2007 14:14:27 +1100\n\nsrecord (1.36.D004-1) unstable; urgency=low\n\n  * It is now possible to have negative expressions on the command line, to\n    facilitate ''--offset - -minimum foo'' usages.\n  * My thanks to Craig McQueen <Craig_McQueen@aapl.com.au> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 29 Oct 2007 13:50:10 +1100\n\nsrecord (1.36.D003-1) unstable; urgency=low\n\n  * The srec_cat command now has a simple hexadecimal dump output format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 17 Sep 2007 18:41:07 +1000\n\nsrecord (1.36.D002-1) unstable; urgency=low\n\n  * The use of uudecode in test 60 has been removed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 07 Aug 2007 20:27:09 +1000\n\nsrecord (1.36.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 07 Aug 2007 18:32:09 +1000\n\nsrecord (1.35.D014-1) unstable; urgency=low\n\n  * The CRC16 filters have a new --no-augment option, to omit the 16 zero bits\n    augmenting the message.  This is not CCITT standard conforming, but some\n    sites need it.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 07 Aug 2007 14:17:56 +1000\n\nsrecord (1.35.D013-1) unstable; urgency=low\n\n  * A bug has been fixed in the cookbook, it was not correctly working ou all\n    the .d files it was supposed to build.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 07 Aug 2007 13:41:44 +1000\n\nsrecord (1.35.D012-1) unstable; urgency=low\n\n  * The crc16 class now takes a flag to indicate whether or not augmentation is\n    desired.  The output is unchganged, using the default values.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 06 Aug 2007 23:37:05 +1000\n\nsrecord (1.35.D011-1) unstable; urgency=low\n\n  * A bugs has been fixed in the CRC-16 CCITT calculation.\n  * My thanks to Craig McQueen <Craig_McQueen@aapl.com.au> for reporting this\n    problem, and for reporting the fix, too, at http://www.joegeluso.com/\n    software/articles/ccitt.htm\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 06 Aug 2007 22:30:12 +1000\n\nsrecord (1.35.D010-1) unstable; urgency=low\n\n  * A test of the CRC16 algorithm for XMODEM has been added, to make sure that\n    when I fix the CCITT case I don't break the XMODEM case.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 06 Aug 2007 17:18:59 +1000\n\nsrecord (1.35.D009-1) unstable; urgency=low\n\n  * There is a new test_crc16 program, which is built for testing purpose, and\n    intentionally never installed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 06 Aug 2007 16:40:11 +1000\n\nsrecord (1.35.D008-1) unstable; urgency=low\n\n  * The MANIFEST file is a dinosaur from a previous era.  It is not more.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 05 Aug 2007 21:42:09 +1000\n\nsrecord (1.35.D007-1) unstable; urgency=low\n\n  * The aegis.conf file has been split into more pieces.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 05 Aug 2007 21:15:58 +1000\n\nsrecord (1.35.D006-1) unstable; urgency=low\n\n  * A problem has been fixed in the generated Makefile.in file found in the\n    tarball.  The generatic script had not been updated to cope with the change\n    in the directory location of the programs.\n  * My thanks to Joel Stanley <joel@laptop.org> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 05 Aug 2007 18:20:06 +1000\n\nsrecord (1.35.D005-1) unstable; urgency=low\n\n  * An RSS feed has been added to the web site.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 05 Aug 2007 17:56:40 +1000\n\nsrecord (1.35.D004-1) unstable; urgency=low\n\n  * The prog/ directory is gone, the commands each appear in the top level\n    directpry.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 09 Jul 2007 22:54:51 +1000\n\nsrecord (1.35.D003-1) unstable; urgency=low\n\n  * The license has been changed from GPLv2 to GPLv3.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 05 Jul 2007 13:53:03 +1000\n\nsrecord (1.35.D002-1) unstable; urgency=low\n\n  * The Free Software Foundation postal address has been updated in all of the\n    source files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 29 Jun 2007 15:59:58 +1000\n\nsrecord (1.35.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 23 Jun 2007 19:05:59 +1000\n\nsrecord (1.34.D002-1) unstable; urgency=low\n\n  * A major build problem with the generated makefile has been fxed.\n  * My thanks to Eric Weddington for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 23 Jun 2007 18:55:14 +1000\n\nsrecord (1.34.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 22 Jun 2007 20:58:34 +1000\n\nsrecord (1.33.D016-1) unstable; urgency=low\n\n  * The C and ASM output formats have been improved in the word mode.\n  * My thanks to the MSP430 Group at Texas Instruments for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 06 Jun 2007 22:47:07 +1000\n\nsrecord (1.33.D015-1) unstable; urgency=low\n\n  * The generated makefile did not correctly install the man pages.\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 06 Jun 2007 22:22:26 +1000\n\nsrecord (1.33.D014-1) unstable; urgency=low\n\n  * The class declarations for a number of output classes have been made more\n    consistent.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 13:51:12 +1000\n\nsrecord (1.33.D013-1) unstable; urgency=low\n\n  * The Vmem format has been changed so that it is an error if it sees not-16-\n    bit aligned data, and suggests a -fill -within -range-padding filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 13:45:54 +1000\n\nsrecord (1.33.D012-1) unstable; urgency=low\n\n  * The VHDL format has been changed so that it is an error if it sees unaligned\n    data, and suggests a -fill -within -range-padding filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 12:14:25 +1000\n\nsrecord (1.33.D011-1) unstable; urgency=low\n\n  * The Spasm format has been changed so that it is an error if it sees not-16-\n    bit aligned data, and suggests a -fill -within -range-padding filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 11:17:26 +1000\n\nsrecord (1.33.D010-1) unstable; urgency=low\n\n  * The Spasm format has been changed so that it is an error if it sees not-16-\n    bit aligned data, and suggests a -fill -within -range-padding filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 11:01:38 +1000\n\nsrecord (1.33.D009-1) unstable; urgency=low\n\n  * The Fairchild format has been changed so that is an error if it sees not-8-\n    byte aligned data, and suggests a -fill -within -range-padding filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 10:48:36 +1000\n\nsrecord (1.33.D008-1) unstable; urgency=low\n\n  * The -intel-hex16 format has been changed so that it is an error if it sees\n    not-16-bit aligned data, and suggests a -fill -within -range-padding filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 10:05:06 +1000\n\nsrecord (1.33.D007-1) unstable; urgency=low\n\n  * The C-Array -output-words format has been changed so that is an error if it\n    sees not-16-bit aligned data, and suggests a -fill -within -range-padding\n    filter.  The 8-bit form is unaffected.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 09:56:47 +1000\n\nsrecord (1.33.D006-1) unstable; urgency=low\n\n  * The atmel-generic format has been changed so that it is an error if it sees\n    not-16-bit aligned data, and suggests a -fill -within -range-padding filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 09:45:48 +1000\n\nsrecord (1.33.D005-1) unstable; urgency=low\n\n  * The assembler output has been changed to request the user manually pad their\n    data, rather than the output format making up data.  This only applies when\n    the user has requested 16-bit output, 8-bit output is not affected.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 09:37:18 +1000\n\nsrecord (1.33.D004-1) unstable; urgency=low\n\n  * The output classes now send error messages through quit_defualt\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 00:25:55 +1000\n\nsrecord (1.33.D003-1) unstable; urgency=low\n\n  * There is a new output::format_name method, which may be used to obtain the\n    name of the format of an output.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 20 May 2007 00:13:32 +1000\n\nsrecord (1.33.D002-1) unstable; urgency=low\n\n  * The gcc -Eextra flag has been added to the compiles, and problems thus\n    revealed have been fixed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 18 May 2007 21:39:50 +1000\n\nsrecord (1.33.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 18 May 2007 21:09:25 +1000\n\nsrecord (1.32.D009-1) unstable; urgency=low\n\n  * More examples have been added to the examples page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 18 May 2007 20:52:51 +1000\n\nsrecord (1.32.D008-1) unstable; urgency=low\n\n  * More examples have been added to the documentation.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 18 May 2007 10:11:26 +1000\n\nsrecord (1.32.D007-1) unstable; urgency=low\n\n  * The examples from the srec_cat(1) man page have been moved to theor own man\n    page, and expanded somewhat, tho more work is needed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 17 May 2007 23:40:37 +1000\n\nsrecord (1.32.D006-1) unstable; urgency=low\n\n  * It is now possible to perform set intersection and set difference on\n    intervals.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 16 May 2007 22:06:55 +1000\n\nsrecord (1.32.D005-1) unstable; urgency=low\n\n  * There is a new type of data source: the generator. There are three\n    different generators, more are likely.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 16 May 2007 18:07:52 +1000\n\nsrecord (1.32.D004-1) unstable; urgency=low\n\n  * The C-Array output is now able to emit sectioned output, similar to the -asm\n    -a430 option.  It can also optionally write shorts rather than bytes.\n  * My thanks to the MSP430 Group at Texas Instruments for this contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 May 2007 16:45:22 +1000\n\nsrecord (1.32.D003-1) unstable; urgency=low\n\n  * The assembler output now supports additional options to facilitate MSP430\n    systems.\n  * My thanks to the MSP430 Group at Texas Instruments for this contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 May 2007 12:43:36 +1000\n\nsrecord (1.32.D002-1) unstable; urgency=low\n\n  * There is a new option for claculating address ranges: you can now round\n    randges to be whole mutiples of bytes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 May 2007 12:15:11 +1000\n\nsrecord (1.32.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 24 Apr 2007 09:09:55 +1000\n\nsrecord (1.31.D003-1) unstable; urgency=low\n\n  * It turns out the TI-TXT spec I was using is incorrect.  You don't have to\n    have even addresses, and you don't have to have even byte counts.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 20 Apr 2007 10:53:56 +1000\n\nsrecord (1.31.D002-1) unstable; urgency=low\n\n  * The end character is 'q' not 'Q'.  It also appears that http://www.ti.com/\n    lit/pdf/slau101 section A.2 is wrong about start addresses having to be\n    even.\n  * My thanks to Stefan Schauer <s-schauer1@ti.com> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 19 Apr 2007 23:10:06 +1000\n\nsrecord (1.31.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 03 Apr 2007 21:19:04 +1000\n\nsrecord (1.30.D006-1) unstable; urgency=low\n\n  * The verilog format now also suppresses comments when you specify the data-\n    onloy flag.\n  * My thanks to Stefan Schauer <s-schauer1@ti.com> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 03 Apr 2007 20:57:40 +1000\n\nsrecord (1.30.D005-1) unstable; urgency=low\n\n  * There is a new SEEK_HOLE on Solaris, for navigating around file data holes.\n    This could one day be used to report holes via the srec API.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 03 Apr 2007 20:09:38 +1000\n\nsrecord (1.30.D004-1) unstable; urgency=low\n\n  * The ways file names are passed around has been made more consistent; they\n    are all std::strings now.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 28 Mar 2007 21:50:38 +1000\n\nsrecord (1.30.D003-1) unstable; urgency=low\n\n  * There is a new srec_binary(5) man page describing binary files, and what can\n    happen when you create them with srec_cat(1).\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 28 Mar 2007 14:22:11 +1000\n\nsrecord (1.30.D002-1) unstable; urgency=low\n\n  * The Texas Instruments ti-txt (MSP430) format is now understood for reading\n    and writing.\n  * My thanks to Stefan Schauer <s-schauer1@ti.com> for this contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 28 Mar 2007 11:49:56 +1000\n\nsrecord (1.30.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release,\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 21 Mar 2007 19:32:44 +1100\n\nsrecord (1.29.D007-1) unstable; urgency=low\n\n  * The ascii-hex format has been improved, so that it does much better line\n    length accounting. It also ensures the ^C is present even for the -data-\n    only option.\n  * My thanks to Simon Manderson <phmilesc@blueyonder.co.uk> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 21 Mar 2007 11:18:12 +1100\n\nsrecord (1.29.D006-1) unstable; urgency=low\n\n  * Some more detail has been added to the section on adding new formats.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 14 Mar 2007 18:53:06 +1100\n\nsrecord (1.29.D005-1) unstable; urgency=low\n\n  * The new ti-tagged-16 format is now mentioned in the man pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 14 Mar 2007 15:44:37 +1100\n\nsrecord (1.29.D004-1) unstable; urgency=low\n\n  * The new file format instructions now include some discussions of\n    implementation issues.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 14 Mar 2007 15:29:36 +1100\n\nsrecord (1.29.D003-1) unstable; urgency=low\n\n  * The Intel code warned if there was no start address record.  It was a\n    warning, not an error, but still some folks complained.  The warning has\n    been removed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 14 Mar 2007 13:45:17 +1100\n\nsrecord (1.29.D002-1) unstable; urgency=low\n\n  * A bug in the ti-tagged format has been fixed, it now understands the '0'\n    tag.\n  * My thanks to OZ_Rhett <armistej@users.sourceforge.net> for reporting this\n    problem.\n  * As a side-effect of this fix, the ti-tagged-16 format can now be read and\n    written.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 14 Mar 2007 12:24:50 +1100\n\nsrecord (1.29.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 13 Mar 2007 20:50:01 +1100\n\nsrecord (1.28.D004-1) unstable; urgency=low\n\n  * The generated Makefile was broken by the tab replacement.  This is fixed,\n    and there is also a new \"check-tarball\" build target, so this is less likely\n    in the future.\n  * My thanks to Rene Rebe <rene@exactcode.de> and Eric Weddington\n    <eweddington@cso.atmel.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 13 Mar 2007 20:23:48 +1100\n\nsrecord (1.28.D003-1) unstable; urgency=low\n\n  * The home page on the web site now has various free software and open source\n    software links and icons.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 08 Mar 2007 10:06:26 +1100\n\nsrecord (1.28.D002-1) unstable; urgency=low\n\n  * The develop end policy has been tightened, to disallow tabs (for consistent\n    formatting), no white space on the ends of lines, and a maximum ine length\n    of 80 characters.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 08 Mar 2007 09:37:44 +1100\n\nsrecord (1.28.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 08 Mar 2007 08:23:07 +1100\n\nsrecord (1.27.D004-1) unstable; urgency=low\n\n  * It is now possible to read and write files in the Motorola MC68EZ328\n    Dragonball bootstrap b-record format\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 08 Mar 2007 08:14:33 +1100\n\nsrecord (1.27.D003-1) unstable; urgency=low\n\n  * The logo on the aeget HTML pages is now a reasonable size (it was too big).\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Dec 2006 13:14:07 +1100\n\nsrecord (1.27.D002-1) unstable; urgency=low\n\n  * The web interface links have been updated to use the new aeget interface.\n    Some logos and links have been added to the aeget HTML pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Dec 2006 13:11:17 +1100\n\nsrecord (1.27.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Dec 2006 12:37:23 +1100\n\nsrecord (1.26.D014-1) unstable; urgency=low\n\n  * The copyright norices have been changed to remove the \"all rights reserved\"\n    phrase.  It did not represent the GPL spirit.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Dec 2006 11:33:44 +1100\n\nsrecord (1.26.D013-1) unstable; urgency=low\n\n  * The copyright norices have been changed to remove the \"all rights reserved\"\n    phrase.  It did not represent the GPL spirit.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Dec 2006 10:26:23 +1100\n\nsrecord (1.26.D012-1) unstable; urgency=low\n\n  * A bug has been fixed in the out-of-sequence warnings; it was complaining\n    about synthesized data (while is often all over the place) when it should\n    only have been complaining about file data.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Dec 2006 00:05:54 +1100\n\nsrecord (1.26.D011-1) unstable; urgency=low\n\n  * There is a new warning issued when input data records are not in strictly\n    ascending address order. There is a new option to silence the warning.\n  * My thanks to Frieder Ferlemann <frief@users.sourceforge.net> for this\n    suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 20 Dec 2006 22:51:01 +1100\n\nsrecord (1.26.D010-1) unstable; urgency=low\n\n  * The include files have been folded back into the lib tree, it makes for a\n    more natural development environment.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 10 Dec 2006 18:19:03 +1100\n\nsrecord (1.26.D009-1) unstable; urgency=low\n\n  * The #pragma directives have been removed, g++ no longer needs them, and most\n    folks couldn't work out how to use them.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 10 Dec 2006 14:39:17 +1100\n\nsrecord (1.26.D008-1) unstable; urgency=low\n\n  * The command line processing (of all srec_* commands) now understand @file\n    command line options, filled with space separated strings.\n  * My thanks to <jtxa@users.sourceforge.net> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 10 Dec 2006 13:22:20 +1100\n\nsrecord (1.26.D007-1) unstable; urgency=low\n\n  * More sizes have been added to the srecord.ico file.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 26 Sep 2006 20:23:50 +1000\n\nsrecord (1.26.D006-1) unstable; urgency=low\n\n  * M$IE has a BUG and it gets transparency in PNG files WRONG.  Morons.  The\n    fix is to tell the pngcrush program to use a white background.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 26 Sep 2006 12:45:06 +1000\n\nsrecord (1.26.D005-1) unstable; urgency=low\n\n  * The availability of precompiled Windows executable is now proclaimed more\n    loudly than ever before on the Download page.  One wonders if Windows\n    victims have completely lost the ability to read.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 26 Sep 2006 12:23:24 +1000\n\nsrecord (1.26.D004-1) unstable; urgency=low\n\n  * The rest of the web pages now use the new icon and favicon.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 21 Jul 2006 10:05:52 +1000\n\nsrecord (1.26.D003-1) unstable; urgency=low\n\n  * The icon for the project has been changed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 20 Jul 2006 23:40:20 +1000\n\nsrecord (1.26.D002-1) unstable; urgency=low\n\n  * The crc32 class has had a few comments added to it, to assist programmers\n    find the orignal C code, if they need to incorporate C code into their\n    embedded programs.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Jul 2006 11:46:07 +1000\n\nsrecord (1.26.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public elease.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 26 May 2006 15:18:15 +1000\n\nsrecord (1.25.D004-1) unstable; urgency=low\n\n  * The download page now has a link to the SourceForge downloads page.\n  * My thanks to Craig McQueen <craig_mcqueen@aapl.com.au> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 26 May 2006 14:58:59 +1000\n\nsrecord (1.25.D003-1) unstable; urgency=low\n\n  * The developer build now construts TAGS and tags files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 26 May 2006 14:47:15 +1000\n\nsrecord (1.25.D002-1) unstable; urgency=low\n\n  * It is now possible to place parenteses on the command line in more places to\n    clariy your intent.\n  * My thanks to Craig McQueen <craig_mcqueen@aapl.com.au> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 26 May 2006 14:46:33 +1000\n\nsrecord (1.25.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 18 May 2006 20:01:22 +1000\n\nsrecord (1.24.D007-1) unstable; urgency=low\n\n  * The manual pages have been updated to produce a prominent warning about how\n    holes in the data give wonky results.  The code now also produces a warning\n    when there ARE holes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 17 May 2006 09:41:33 +1000\n\nsrecord (1.24.D006-1) unstable; urgency=low\n\n  * The assembler output has been enhanced to produce ORG directives, if\n    necessary, to change the data address.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 29 Mar 2006 21:17:59 +1100\n\nsrecord (1.24.D005-1) unstable; urgency=low\n\n  * A couple of noisy tests have been silenced, they will only produce output on\n    error from now on.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 29 Mar 2006 20:48:33 +1100\n\nsrecord (1.24.D004-1) unstable; urgency=low\n\n  * The srec_cat(1) command now only writes a start address into the output if\n    there was a start address present in the input.\n  * If you wish to specify a start address for input which have no start\n    address, you may use the existing srec_cat -Start_Address command line\n    option - note that this specifies the start address in the *output* address\n    space.\n  * My thanks to Jan Bendixen <jbendixen@sauer-danfoss.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 15 Mar 2006 11:25:46 +1100\n\nsrecord (1.24.D003-1) unstable; urgency=low\n\n  * Additional build instructions have been added to the Windows web page.  Now\n    windows developers can re-build for themselves, if they wish to add more\n    features.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 13 Mar 2006 10:35:45 +1100\n\nsrecord (1.24.D002-1) unstable; urgency=low\n\n  * The programne functions are now smarter about directory separators, so that\n    they work nicely with mingw.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 13 Mar 2006 10:06:46 +1100\n\nsrecord (1.24.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 08 Mar 2006 21:33:27 +1100\n\nsrecord (1.23.D005-1) unstable; urgency=low\n\n  * Additional information has been added to the lseek error when they try to\n    seek to addresses >= 2**31\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 08 Mar 2006 12:39:30 +1100\n\nsrecord (1.23.D004-1) unstable; urgency=low\n\n  * The CRC 16 filters have been enhanced to accept an argument to specify\n    whether CCITT or XMODEM calculations are to be performed.\n  * My thanks to Aleix Conchillo Flaqué <aconchillo@gmail.com> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 27 Jan 2006 23:14:15 +1100\n\nsrecord (1.23.D003-1) unstable; urgency=low\n\n  * The new aede-policy command is used to check things.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 27 Jan 2006 23:06:47 +1100\n\nsrecord (1.23.D002-1) unstable; urgency=low\n\n  * The spec file (used by RPM packagers) has bene improved.\n  * My thanks to Jose Pedro Oliveira <jpo@di.uminho.pt> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 26 Sep 2005 08:54:38 +1000\n\nsrecord (1.23.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 23 Sep 2005 19:53:32 +1000\n\nsrecord (1.22.D003-1) unstable; urgency=low\n\n  * This change fixes a segfault on x86_64 when running the regression test\n    suite.\n  * My thanks to the good folks at SourceForge who provide their compile farm\n    free of charge for the community to use.  It was essential in reproducing\n    this bug.\n  * My thanks to Jose Pedro Oliveira <jpo@di.uminho.pt> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 23 Sep 2005 15:35:43 +1000\n\nsrecord (1.22.D002-1) unstable; urgency=low\n\n  * This change fixes a compile problem with the lib/srec/output/file/c.cc file.\n  * My thanks to Matthias Voss <matthias.voss@philips.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 22 Aug 2005 22:48:27 +1000\n\nsrecord (1.22.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 12 Aug 2005 22:59:35 +1000\n\nsrecord (1.21.D011-1) unstable; urgency=low\n\n  * The byte swap filter is now able to reverse 32-bit and 64-bit data, in\n    addition to the 16-bits it previously performed.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 11 Aug 2005 17:35:55 +1000\n\nsrecord (1.21.D010-1) unstable; urgency=low\n\n  * The motorola file format now accepts an additional 'width' command line\n    argument, so you can have 16-bit and 32-bit address multiples.\n  * My thanks to Christoph Franck <ihlosi@arcor.de> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 14 Jul 2005 00:11:27 +1000\n\nsrecord (1.21.D009-1) unstable; urgency=low\n\n  * The handling of extra command line arguments for formats and filters has\n    been refactored, so that arglex knows less about individual formats and\n    filters.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 13 Jul 2005 22:57:04 +1000\n\nsrecord (1.21.D008-1) unstable; urgency=low\n\n  * A bug has been fixed in the VMEM output format.  It was failing to correctly\n    set the next address in some cases.\n  * My thanks to \"dbaloun\" for reporting this problem.\n  * Source Forge Bug 1119786\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 13 Jul 2005 22:34:43 +1000\n\nsrecord (1.21.D007-1) unstable; urgency=low\n\n  * The vmem output class has been refactored to use the new command_)line\n    method from arglex output parser.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 13 Jul 2005 21:57:08 +1000\n\nsrecord (1.21.D006-1) unstable; urgency=low\n\n  * The vhdl output format has beem reworked to use the new virtual method for\n    parsing extra arguments.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 13 Jul 2005 21:29:37 +1000\n\nsrecord (1.21.D005-1) unstable; urgency=low\n\n  * The c-array format is now able to add the const keyword, and generate an\n    include file.  It also produces some #define constants.\n  * My thanks to Maarten Brock and and \"thomas\" for these suggestions.\n  * Source Forge Feature Request 942132\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 13 Jul 2005 20:07:58 +1000\n\nsrecord (1.21.D004-1) unstable; urgency=low\n\n  * The ./configure script now adds -fno-rtti to the CXXFLAGS to avoid the\n    undefined symbols problem on Cygwin and MacOsX.\n  * My thanks to Sriram Srinivasan <sriram@malhar.net> for this fix.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 08 Jun 2005 20:11:15 +1000\n\nsrecord (1.21.D003-1) unstable; urgency=low\n\n  * There is a new --ignore-checksum command line option.  The --ignore-\n    checksums option may be used to disable checksum validation of input files,\n    for those formats which have checksums at all.  Note that trhe checksum\n    values are still read in and parse (so it is still an error if they are\n    missing) but their values are not checked. Used after an input file name,\n    the option affects that file alone; used anywhere else on the command line,\n    it applies to all following files.\n  * My thanks to Jochen Betz <betz@sitronic.com> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 07 Jun 2005 23:54:56 +1000\n\nsrecord (1.21.D002-1) unstable; urgency=low\n\n  * This change fixes a build problem with the web pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 07 Feb 2005 23:19:44 +1100\n\nsrecord (1.21.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 07 Feb 2005 23:10:36 +1100\n\nsrecord (1.20.D015-1) unstable; urgency=low\n\n  * This change adds some release notes for the coming release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 07 Feb 2005 22:49:40 +1100\n\nsrecord (1.20.D014-1) unstable; urgency=low\n\n  * This change adds more Doxygen comments to the class header files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 07 Feb 2005 20:22:08 +1100\n\nsrecord (1.20.D013-1) unstable; urgency=low\n\n  * This change adds more Doxygen comments to the class header files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 Feb 2005 23:28:57 +1100\n\nsrecord (1.20.D012-1) unstable; urgency=low\n\n  * This change adds more Doxygen comments to the class headre files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 Feb 2005 17:58:06 +1100\n\nsrecord (1.20.D011-1) unstable; urgency=low\n\n  * There is a new srec_cat --crlf option, which may be used for force CRLF\n    output on operating systems which don't use that line termination.\n  * My thanks to Adam Gibson for this suggestion:\n  * \"Some software that uploads firmware expect the hexfiles to be in CR/LF\n    format.  To keep from needing another tool dependancy it would be nice if\n    there were an option to output in CR/LF format.\"\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 Feb 2005 10:59:30 +1100\n\nsrecord (1.20.D010-1) unstable; urgency=low\n\n  * This change fixed several Doxygen warnings.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 05 Feb 2005 10:52:53 +1100\n\nsrecord (1.20.D009-1) unstable; urgency=low\n\n  * This change updates some of the web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 02 Nov 2004 18:53:51 +1100\n\nsrecord (1.20.D008-1) unstable; urgency=low\n\n  * This change fixes a typo in the documentation.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 02 Nov 2004 18:31:51 +1100\n\nsrecord (1.20.D007-1) unstable; urgency=low\n\n  * This change doscuments the problems with the early 3.x series, and fixes\n    things that 3.4 whines about.\n  * My thanks to Scott Finneran for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 21 Oct 2004 16:17:28 +1000\n\nsrecord (1.20.D006-1) unstable; urgency=low\n\n  * There is a new \"Stewie\" format, an undocumented format loosely based on the\n    Motorola S-Record format, apparently used in mobile phones.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 05 Sep 2004 16:40:49 +1000\n\nsrecord (1.20.D005-1) unstable; urgency=low\n\n  * An inconsistency between the class declaration and the implementation in the\n    AOMF output filter has been fixed.\n  * My thanks to R. op het Roodt <rroo@mail.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 21 Jul 2004 11:30:21 +1000\n\nsrecord (1.20.D004-1) unstable; urgency=low\n\n  * This change fixes some array delete problems.\n  * My thanks to Yi Yan <yiyan97@hotmail.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 09 May 2004 22:08:55 +1000\n\nsrecord (1.20.D003-1) unstable; urgency=low\n\n  * This change fixes some bugs in the memory simulator code.\n  * My thanks to Yi Yan <yiyan97@hotmail.com> for reporting these problems.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 04 May 2004 09:14:54 +1000\n\nsrecord (1.20.D002-1) unstable; urgency=low\n\n  * This change fixes some missing files on the web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Feb 2004 01:13:24 +1100\n\nsrecord (1.20.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Feb 2004 00:55:35 +1100\n\nsrecord (1.19.D002-1) unstable; urgency=low\n\n  * The AOMF format now accepts (and ignores) more record types.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Feb 2004 00:33:04 +1100\n\nsrecord (1.19.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 03 Jan 2004 11:03:14 +1100\n\nsrecord (1.18.D007-1) unstable; urgency=low\n\n  * It is now possible to set the start address in the output using the srec_cat\n    -Start_Address command line option.  (Requested by anonymous user on\n    SourceForge.)\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 02 Jan 2004 12:00:26 +1100\n\nsrecord (1.18.D006-1) unstable; urgency=low\n\n  * The Intel Absolute Object Module Format is now supported for reading and\n    writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 02 Jan 2004 11:25:13 +1100\n\nsrecord (1.18.D005-1) unstable; urgency=low\n\n  * There is a new -Random_Fill filter, like the -Fill filter except that it\n    uses random values.  (Submitted by anonymous user on SourceForge.)\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 01 Jan 2004 20:56:02 +1100\n\nsrecord (1.18.D004-1) unstable; urgency=low\n\n  * This change moves the main srecord web page name to something more standard.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 01 Jan 2004 20:20:14 +1100\n\nsrecord (1.18.D003-1) unstable; urgency=low\n\n  * This change re-arranges the lib/srec/arglex.cc file so that the most often\n    edited method (get_input) is in a file by itself.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 01 Jan 2004 18:04:59 +1100\n\nsrecord (1.18.D002-1) unstable; urgency=low\n\n  * This change fixes a copy-and-paste erro on the srec_os65(5) man page.\n  * My thanks to Stephen M. Moraco for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 01 Jan 2004 17:47:49 +1100\n\nsrecord (1.18.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 01 Jan 2004 16:19:30 +1100\n\nsrecord (1.17.D005-1) unstable; urgency=low\n\n  * The VMEM format is now able to output data for 64 and 128 bits wide\n    memories.\n  * My thanks to Jim Holt <Jim.Holt@motorola.com> for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 01 Jan 2004 15:05:21 +1100\n\nsrecord (1.17.D004-1) unstable; urgency=low\n\n  * A in the SRecord reference manuals; the CRCxx had a copy-and-paste glitch\n    and always said big-endian where little endian was intended half the time.\n  * My thanks to idefixx2@gmx.at for reprting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 19 Oct 2003 11:15:08 +1000\n\nsrecord (1.17.D003-1) unstable; urgency=low\n\n  * This change adds the archive/change_log.txt with just the release notes in\n    it.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 12 Oct 2003 10:07:52 +1000\n\nsrecord (1.17.D002-1) unstable; urgency=low\n\n  * This change makes the README file more comprehensible by removing the\n    terminal escapes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 12 Oct 2003 08:47:16 +1000\n\nsrecord (1.17.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 12 Oct 2003 08:33:26 +1000\n\nsrecord (1.16.D007-1) unstable; urgency=low\n\n  * This change addes support for Intel Extended Segment aasddressing output,\n    via the --address-length=2 option.\n  * My thanks to Alfred Kögel <alfred@mpt-koegel.de> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 09 Oct 2003 13:35:02 +1000\n\nsrecord (1.16.D006-1) unstable; urgency=low\n\n  * This change updates the link to the GNU GPL on the web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 22 Aug 2003 13:25:35 +1000\n\nsrecord (1.16.D005-1) unstable; urgency=low\n\n  * This change adds more information to the Verilog VMEM man page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 05 Aug 2003 12:39:28 +1000\n\nsrecord (1.16.D004-1) unstable; urgency=low\n\n  * This change adds the Verilog VMEM format.\n  * My thanks to Jim Holt <Jim.Holt@motorola.com> for this contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 05 Aug 2003 11:44:22 +1000\n\nsrecord (1.16.D003-1) unstable; urgency=low\n\n  * This change adds the INHX16 format, used in various PIC programmers.  It\n    looks just like the Indtel Hex format, except that the bytes counts and the\n    addresses refer to words (hi,lo) rather than bytes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 01 Aug 2003 20:56:21 +1000\n\nsrecord (1.16.D002-1) unstable; urgency=low\n\n  * This change makes some improvements to the SRecord web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 28 Jul 2003 21:03:05 +1000\n\nsrecord (1.16.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 28 Jul 2003 20:37:07 +1000\n\nsrecord (1.15.D006-1) unstable; urgency=low\n\n  * This change adds some more notes about building on Cygwin.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 28 Jul 2003 15:33:31 +1000\n\nsrecord (1.15.D005-1) unstable; urgency=low\n\n  * This change fixes a compiler warning on a format string.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 28 Jul 2003 15:11:59 +1000\n\nsrecord (1.15.D004-1) unstable; urgency=low\n\n  * This change makes more of the arglex strings constant.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 28 Jul 2003 15:09:01 +1000\n\nsrecord (1.15.D003-1) unstable; urgency=low\n\n  * This change improves the srecord.spec file.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 27 Jul 2003 21:24:48 +1000\n\nsrecord (1.15.D002-1) unstable; urgency=low\n\n  * This change copes with gcc 3.2 differences.\n  * It also looks in the new place for the install-sh file.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 06 Jul 2003 21:20:12 +1000\n\nsrecord (1.15.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 16 Jun 2003 22:22:17 +1000\n\nsrecord (1.14.D008-1) unstable; urgency=low\n\n  * This change adds more capabilities to the Ascii-Hex format\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 16 Jun 2003 21:37:13 +1000\n\nsrecord (1.14.D007-1) unstable; urgency=low\n\n  * This change adds the Fairchild Fairbug file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 16 Jun 2003 11:22:13 +1000\n\nsrecord (1.14.D006-1) unstable; urgency=low\n\n  * This change adds the Spectrum format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 14 Jun 2003 17:12:28 +1000\n\nsrecord (1.14.D005-1) unstable; urgency=low\n\n  * This change adds the formatted binary format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 13 Jun 2003 23:32:56 +1000\n\nsrecord (1.14.D004-1) unstable; urgency=low\n\n  * This change adds more Doxygen comments to the include files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 12 Jun 2003 10:38:08 +1000\n\nsrecord (1.14.D003-1) unstable; urgency=low\n\n  * This change adds the RCA Cosmac file format for reading and writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 11 Jun 2003 21:06:07 +1000\n\nsrecord (1.14.D002-1) unstable; urgency=low\n\n  * This change adds the needham hexadecimal format for reading and writing.\n  * This format is used with Needham EMP series programmers.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 11 Jun 2003 11:15:44 +1000\n\nsrecord (1.14.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 11 Mar 2003 09:01:02 +1100\n\nsrecord (1.13.D005-1) unstable; urgency=low\n\n  * This change adds a link to the web page pointing users at pre-built windows\n    binaries.\n  * My thanks to E. Weddington <eric@umginc.net> for this link, and for building\n    the binaries.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 11 Mar 2003 08:51:14 +1100\n\nsrecord (1.13.D004-1) unstable; urgency=low\n\n  * This change fixes a bug which prevented setting an empty header.\n  * My thanks to Christian Richter <crichter@sbs-europe.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 12 Feb 2003 21:23:23 +1100\n\nsrecord (1.13.D003-1) unstable; urgency=low\n\n  * This change fixes some GCC 3.2 build problems.\n  * My thanks to Caminati Carlo <C.Caminati@selta.it> and doj@cubic.org for this\n    patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 07 Feb 2003 09:03:10 +1100\n\nsrecord (1.13.D002-1) unstable; urgency=low\n\n  * This change adds the sourceforge logo to the web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 06 Feb 2003 09:06:31 +1100\n\nsrecord (1.13.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 05 Feb 2003 21:26:23 +1100\n\nsrecord (1.12.D008-1) unstable; urgency=low\n\n  * This change moves the archive location to srecord.sourceforge.net\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 05 Feb 2003 20:53:15 +1100\n\nsrecord (1.12.D007-1) unstable; urgency=low\n\n  * This change adds basic file metrics.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 05 Feb 2003 20:48:27 +1100\n\nsrecord (1.12.D006-1) unstable; urgency=low\n\n  * This change fixes problems with uninitialized instance variables in the\n    Texas Instruments Tagged and VHDL formats.\n  * My thanks to Eric Weddington <eric@umginc.net> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 27 Jan 2003 17:29:32 +1100\n\nsrecord (1.12.D005-1) unstable; urgency=low\n\n  * This change fixes a compiler warning.\n  * My thanks to Eric Weddington <eric@umginc.net> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 27 Jan 2003 15:03:44 +1100\n\nsrecord (1.12.D004-1) unstable; urgency=low\n\n  * This change adds information about building SRecord on Cygwin.\n  * My thanks to Eric Weddington <eric@umginc.net> for this fix.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 27 Jan 2003 14:53:54 +1100\n\nsrecord (1.12.D003-1) unstable; urgency=low\n\n  * This change fixes some more GCC 3.x issues.\n  * My thanks to E. Weddington <eric@umginc.net> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 20 Jan 2003 22:57:42 +1100\n\nsrecord (1.12.D002-1) unstable; urgency=low\n\n  * This change adds the ASM and BASIC output formats.\n  * My thanks to silva@pacificcoast.net for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 19 Jan 2003 00:43:08 +1100\n\nsrecord (1.12.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 06 Dec 2002 10:55:33 +1100\n\nsrecord (1.11.D005-1) unstable; urgency=low\n\n  * This change adds the ability to put -min, -man or -len almost anywhere on\n    the command line that you can put a number.  It allows, for example, the -\n    offset value to be calculated from the maximum of the previous file.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 06 Dec 2002 10:35:42 +1100\n\nsrecord (1.11.D004-1) unstable; urgency=low\n\n  * This change fixes the comment style to be exclusively C++\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 22 Nov 2002 15:12:58 +1100\n\nsrecord (1.11.D003-1) unstable; urgency=low\n\n  * This change has the S5 records cope with the wird stuff GreenHills compiler\n    produces.\n  * My thanks to Warren Farber <wfarber@dekaresearch.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 22 Nov 2002 10:47:44 +1100\n\nsrecord (1.11.D002-1) unstable; urgency=low\n\n  * This change rebuilds the tarball, because it was messed up due to some other\n    cause outside the project.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 21 Oct 2002 21:51:06 +1000\n\nsrecord (1.11.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 21 Oct 2002 21:20:49 +1000\n\nsrecord (1.10.D006-1) unstable; urgency=low\n\n  * This change fixes the build to cope with recent (2.5x) GNU Autoconf changes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 21 Oct 2002 17:39:24 +1000\n\nsrecord (1.10.D005-1) unstable; urgency=low\n\n  * This change adds the OS65V format.\n  * \"The old Ohio Scientific machines contained a monitor, OS65V, which\n    downloaded\n  * hex files in its own simple format.\"\n  * My thanks to David Fenyes <dave@fenyes.net> for this contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 21 Oct 2002 17:21:43 +1000\n\nsrecord (1.10.D004-1) unstable; urgency=low\n\n  * This change adds ./configure insulation for vsnprintf\n  * My thanks to shankara <shankara@spearnet.net> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 15 Aug 2002 21:25:31 +1000\n\nsrecord (1.10.D003-1) unstable; urgency=low\n\n  * This change adds a link to the Debian page for SRecord.\n  * My thanks to Stephen Moraco <stephen@debian.org>, who is the Debian\n    maintainer.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 29 Jul 2002 09:46:22 +1000\n\nsrecord (1.10.D002-1) unstable; urgency=low\n\n  * This change copes with some Cygwin build issues.\n  * My thanks to Ian Ridley <iridley@btr-auto.aust.com> for reporting this\n    problem: \"use of vsnprintf & snprintf, these are not defined in msvcrt, but\n    _vsnprintf & _snprintf are defined\"\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 09 Jul 2002 15:03:57 +1000\n\nsrecord (1.10.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 14 Jun 2002 09:19:36 +1000\n\nsrecord (1.9.D008-1) unstable; urgency=low\n\n  * This change updates the Intel Hex format to emit the first (usually\n    redundant) extended linear address record (type 4) before the first file\n    data.  Previously it was omitted until the 2nd 64K was accessed.\n  * My thanks to Stuart Warren <Stuart.WARREN@dds.delphiauto.com> for reporting\n    this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 14 Jun 2002 09:05:47 +1000\n\nsrecord (1.9.D007-1) unstable; urgency=low\n\n  * This change causes srec_cat to seek less when it outputs to binary files.\n    This was not a problem for regular files, but it made a mess when piping the\n    standard output to some other program (you can't seek on pipes).  Most of\n    the the the seeks were unnecessary, so they are avoided whenever possible.\n  * My thanks to Stuart Warren <Stuart.WARREN@dds.delphiauto.com> for this\n    suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 11 Jun 2002 12:05:07 +1000\n\nsrecord (1.9.D006-1) unstable; urgency=low\n\n  * This change adds the S6 record type to the Motorola S-Record format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 09 May 2002 09:33:48 +1000\n\nsrecord (1.9.D005-1) unstable; urgency=low\n\n  * This change fixes a problem with DEC Binary output on Windows machines.\n  * \"I brought your software to my NT machine, and built it using cygwin. Once\n  * I got the right cygwin software downloaded, the build went fine. However,\n  * when I did the make sure, I got the error below:\n  * /bin/sh test/00/t0075a.sh\n  * srec_cmp: test.out: 2: checksum mismatch (D5)\n  * FAILED test of the DEC Binary functionality\"\n  * My thanks to Andy Levin <levina@netscout.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 19 Feb 2002 22:43:56 +1100\n\nsrecord (1.9.D004-1) unstable; urgency=low\n\n  * This change adds the LSI Logic fastload format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 31 Dec 2001 21:29:26 +1100\n\nsrecord (1.9.D003-1) unstable; urgency=low\n\n  * This change makes SRecord compile using GCC 3.0.2. This should fix the\n    Cygwin build problems, too.\n  * My thanks to doj@cubic.org for this patch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 29 Nov 2001 10:18:52 +1100\n\nsrecord (1.9.D002-1) unstable; urgency=low\n\n  * This change fixes an uglyness on the web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 27 Nov 2001 10:18:37 +1100\n\nsrecord (1.9.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for its next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 27 Nov 2001 10:05:06 +1100\n\nsrecord (1.8.D016-1) unstable; urgency=low\n\n  * This change adds the DEC Binary (XXDP) format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 26 Nov 2001 22:56:07 +1100\n\nsrecord (1.8.D015-1) unstable; urgency=low\n\n  * This change adds a command line option to the srec_cat program sho that you\n    can set the header comment from the command line, for those formats which\n    support header comments.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 26 Nov 2001 20:10:02 +1100\n\nsrecord (1.8.D014-1) unstable; urgency=low\n\n  * This change adds the Elektor Monitor (EMON52) file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 26 Nov 2001 13:59:38 +1100\n\nsrecord (1.8.D013-1) unstable; urgency=low\n\n  * This change inserts the output address range checking into all of the 16-bit\n    output formats.  This should always have been there, and was present in a\n    partial form in some formats.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 26 Nov 2001 11:42:40 +1100\n\nsrecord (1.8.D012-1) unstable; urgency=low\n\n  * This change tells the build system how to construct the documentation HTML\n    files from the .h file using Doxygen.  Some improvements to header files\n    were also made.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 24 Nov 2001 23:57:08 +1100\n\nsrecord (1.8.D011-1) unstable; urgency=low\n\n  * This change adds the Signetics file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 24 Nov 2001 20:49:48 +1100\n\nsrecord (1.8.D010-1) unstable; urgency=low\n\n  * This change adds the Four Packed Code (FPC) file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 24 Nov 2001 16:31:23 +1100\n\nsrecord (1.8.D009-1) unstable; urgency=low\n\n  * This change preserves headers as they are processed by srec_cat.  It also\n    improves the header handling in the TI-tagged format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 23 Nov 2001 15:56:29 +1100\n\nsrecord (1.8.D008-1) unstable; urgency=low\n\n  * This change adds the ATMEL Generic file format for input and output.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 04 Sep 2001 20:41:18 +1000\n\nsrecord (1.8.D007-1) unstable; urgency=low\n\n  * This change fixes a bug filling intel hex files. It turns out that a number\n    of filters, not just the fill filter, assume that the termination record is\n    the last record in the file. For some formats this is not true, so they have\n    been re-coded without this assumption. The \"termination\" record has been\n    renamed the \"start address\" record, to more accurately refect what it does,\n    and to remove the expectation that it is the last record in the file.\n  * My thanks to Neil Viberg <Neil.Viberg@cmcelectronics.ca> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 22 Aug 2001 14:24:09 +1000\n\nsrecord (1.8.D006-1) unstable; urgency=low\n\n  * This change adds a note to the documentation about DJGPP.\n  * My thanks to Shankar Chakkere <shankar_chakkere@denro.littonas.com> for this\n    information.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 18 Jul 2001 08:37:32 +1000\n\nsrecord (1.8.D005-1) unstable; urgency=low\n\n  * This change fixes a typo in the tektronix output class.\n  * My thanks to Jim Purcell <jim@needhams.com> for his assistance in finding\n    this bug.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 25 May 2001 07:11:39 +1000\n\nsrecord (1.8.D004-1) unstable; urgency=low\n\n  * This change fixed a bug in the Tektronix file format. It was checksumming\n    bytes when it should have checksummed nybbles.\n  * My thanks to Jim Purcell <jim@needhams.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 24 May 2001 12:52:13 +1000\n\nsrecord (1.8.D003-1) unstable; urgency=low\n\n  * This change adds the SPASM format for reading and writing.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 24 May 2001 12:20:09 +1000\n\nsrecord (1.8.D002-1) unstable; urgency=low\n\n  * This change causes srec_cmp -v to emit hexadecimal addresses, rather than\n    decimals ones.  This is usually more useful.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 15 May 2001 13:55:57 +1000\n\nsrecord (1.8.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 30 Apr 2001 21:32:00 +1000\n\nsrecord (1.7.D008-1) unstable; urgency=low\n\n  * This change adds the unfill filter, used to reverse the effects of the\n    \"fill\" filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 30 Apr 2001 11:37:56 +1000\n\nsrecord (1.7.D007-1) unstable; urgency=low\n\n  * This change fixes a bug in the CRC16 and CRC32 calculations. The code on\n    which the implementation was originally based was wrong. This implementation\n    produces results which agree with many implementations available on the\n    Internet.\n  * My thanks to Dimitris Beletsiotis\" <dbele@intracom.gr> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 30 Apr 2001 10:31:13 +1000\n\nsrecord (1.7.D006-1) unstable; urgency=low\n\n  * This change adds a bit-wise not filter.\n  * My thanks to Holger Mueller <hmueller@sitronic.com> for this contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 27 Apr 2001 09:28:03 +1000\n\nsrecord (1.7.D005-1) unstable; urgency=low\n\n  * This change fixes a couple of build problems.  My thanks to Holger Mueller\n    <hmueller@sitronic.com> for reporting them.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 26 Apr 2001 13:13:22 +1000\n\nsrecord (1.7.D004-1) unstable; urgency=low\n\n  * This change fixes a bug in the memory chunk iterator code. This affected\n    CRC16 and CRC32 functionality.\n  * My thanks to Dimitris Beletsiotis <dbele@intracom.gr> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 26 Apr 2001 09:44:05 +1000\n\nsrecord (1.7.D003-1) unstable; urgency=low\n\n  * This change fixed a problem with the error reporting in the CRC16 and CRC32\n    filter classes.\n  * My thanks to Dimitris Beletsiotis <dbele@intracom.gr> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 24 Apr 2001 10:29:57 +1000\n\nsrecord (1.7.D002-1) unstable; urgency=low\n\n  * This change updates the web pages to cope with a small move of the files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 19 Mar 2001 13:32:41 +1100\n\nsrecord (1.7.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for its next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 19 Mar 2001 11:14:42 +1100\n\nsrecord (1.6.D008-1) unstable; urgency=low\n\n  * This change fixes some build problems.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 19 Mar 2001 10:24:16 +1100\n\nsrecord (1.6.D007-1) unstable; urgency=low\n\n  * This change fixes a couple of problems found when attempting to end the\n    branch.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 19 Mar 2001 10:12:03 +1100\n\nsrecord (1.6.D006-1) unstable; urgency=low\n\n  * This change fixes some of the documentation, particularly removing the last\n    few references to .ps.gz files (replaced by pdf).\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 15 Mar 2001 09:20:10 +1100\n\nsrecord (1.6.D005-1) unstable; urgency=low\n\n  * This change adds an option so that locations in memory may be overwritten.\n  * There is a new --multiple option to the commands, which permits an input\n    file to contain multiple (contradictory) values for some memory locations.\n    The last value in the file will be used.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 09 Feb 2001 13:25:42 +1100\n\nsrecord (1.6.D004-1) unstable; urgency=low\n\n  * This change adds the srec_cat --address-length option, used to force the\n    minimum address length of the output format, if possible.  Some output\n    formats to do permit this.\n  * My thanks to Steve Ferree <s.ferree@cummins.com> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 09 Feb 2001 13:12:32 +1100\n\nsrecord (1.6.D003-1) unstable; urgency=low\n\n  * This change adds an include of <stddef.h> to include/srec/memory/chunk.h\n    because it cauased a build problem on some platforms.\n  * My thanks to Hendrik De Vloed <hendrik.devloed@barco.com> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 07 Dec 2000 08:16:07 +1100\n\nsrecord (1.6.D002-1) unstable; urgency=low\n\n  * This change fixes another bug in the C Array output.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 04 Dec 2000 09:43:45 +1100\n\nsrecord (1.6.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 03 Dec 2000 22:17:00 +1100\n\nsrecord (1.5.D011-1) unstable; urgency=low\n\n  * This change fixes a bug in the C-Array output format.  Holes in the input\n    resulted in syntax errors in the output.\n  * My thanks to Chris Maynard <Chris.Maynard@GTECH.COM> for reporting this\n    problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 21 Nov 2000 08:59:18 +1100\n\nsrecord (1.5.D010-1) unstable; urgency=low\n\n  * This change adds a CRC 32 input filter (big endian and little endian).\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 16 Nov 2000 21:52:49 +1100\n\nsrecord (1.5.D009-1) unstable; urgency=low\n\n  * This change adds a CRC 16 input filter (big endian and little endian).\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 14 Nov 2000 22:32:41 +1100\n\nsrecord (1.5.D008-1) unstable; urgency=low\n\n  * This change adds VHDL output format.\n  * My thanks to Hendrik De Vloed <hendrik.devloed@barco.com> for this\n    contribution.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 11 Oct 2000 17:40:08 +1100\n\nsrecord (1.5.D007-1) unstable; urgency=low\n\n  * This change adds some instructions about Windows NT\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 05 Sep 2000 10:22:24 +1100\n\nsrecord (1.5.D006-1) unstable; urgency=low\n\n  * This change makes the srec_cmp -verbose option more efficient, so that it\n    runs much faster for large files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 13 Jun 2000 12:49:10 +1000\n\nsrecord (1.5.D005-1) unstable; urgency=low\n\n  * This change adds a 2s complement checksum filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 04 Apr 2000 22:42:23 +1000\n\nsrecord (1.5.D004-1) unstable; urgency=low\n\n  * This change adds a -verbose option to the srec_cmp program, so that it gives\n    a summary of all the way in which the two files differ, if they do.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 02 Apr 2000 15:06:42 +1000\n\nsrecord (1.5.D003-1) unstable; urgency=low\n\n  * This change fixed abug in the error message prefixes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 09 Mar 2000 10:14:19 +1100\n\nsrecord (1.5.D002-1) unstable; urgency=low\n\n  * This change makes some changes to make srecord more portable to Windows (to\n    the tests, actually, the code was fine).\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 07 Mar 2000 20:27:42 +1100\n\nsrecord (1.5.D001-1) unstable; urgency=low\n\n  * This change prepares S-Record for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 06 Mar 2000 22:16:40 +1100\n\nsrecord (1.4.D011-1) unstable; urgency=low\n\n  * This change adds code to automatically guess input file formats.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 06 Mar 2000 21:36:13 +1100\n\nsrecord (1.4.D010-1) unstable; urgency=low\n\n  * This change adds the MOS Technology file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 04 Mar 2000 22:09:38 +1100\n\nsrecord (1.4.D009-1) unstable; urgency=low\n\n  * This change adds the extended tektronix file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 04 Mar 2000 19:50:30 +1100\n\nsrecord (1.4.D008-1) unstable; urgency=low\n\n  * This change adds the Texas Instruments SDSMAC tagged object format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 03 Mar 2000 23:13:23 +1100\n\nsrecord (1.4.D007-1) unstable; urgency=low\n\n  * This change adds the ASCII hex file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 02 Mar 2000 22:19:59 +1100\n\nsrecord (1.4.D006-1) unstable; urgency=low\n\n  * This change adds the ``Wilson'' file format.  The actual name of this format\n    is unknown.\n  * This format was put together for Alan Wilson <dvdsales@dvdlibrary.co.uk> to\n    drive some unusual equipment he uses.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 02 Mar 2000 17:09:48 +1100\n\nsrecord (1.4.D005-1) unstable; urgency=low\n\n  * This change adds the byte swap filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 02 Mar 2000 13:02:03 +1100\n\nsrecord (1.4.D004-1) unstable; urgency=low\n\n  * This change adds the srec_cat -data-only option, which causes the output\n    (all formats) to include only the data, and not the header or footer records\n    (or any other non-data records, for that matter).\n  * My thanks to Russel Lemon <russell@nautitech.com.au> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 28 Feb 2000 17:46:44 +1100\n\nsrecord (1.4.D003-1) unstable; urgency=low\n\n  * This change fixes a Y2K glitch on the web page.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 19 Jan 2000 11:24:56 +1100\n\nsrecord (1.4.D002-1) unstable; urgency=low\n\n  * This change adds a line length option to srec_cat, so that the user may\n    specify then maximum line length of the output.\n  * My thanks to Paolo Monari <paolomonari@digitek.it> for this suggestion.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 17 Jan 2000 14:10:58 +1100\n\nsrecord (1.4.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 13 Jan 2000 13:33:14 +1100\n\nsrecord (1.3.D003-1) unstable; urgency=low\n\n  * This change makes the text input more robust when faced with CRLF files\n    (caused by DOS and UNIX sharing the same file server).\n  * My thanks to Galen Seitz <galens@seitzassoc.com> for reporting this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 04 Nov 1999 13:16:00 +1100\n\nsrecord (1.3.D002-1) unstable; urgency=low\n\n  * This change updates the FSF address in the GPL file headers.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 05 Aug 1999 13:01:38 +1000\n\nsrecord (1.3.D001-1) unstable; urgency=low\n\n  * This change prepares SRecord for the next public release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 12 May 1999 14:52:51 +1000\n\nsrecord (1.2.D006-1) unstable; urgency=low\n\n  * This change corrects a bug on Windows NT where binary files are being opened\n    in text mode.  For Unix this doesn't matter, but for Windows NT this is a\n    disaster.\n  * My thanks to Angel Jimenez Jimenez <angel.jimenez@ALCATEL.ES> for reporting\n    this problem.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 12 May 1999 12:52:53 +1000\n\nsrecord (1.2.D005-1) unstable; urgency=low\n\n  * This change adds the xor data filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 12 Nov 1998 17:54:29 +1100\n\nsrecord (1.2.D004-1) unstable; urgency=low\n\n  * This change adds a bit-wise AND filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 11 Nov 1998 18:14:05 +1100\n\nsrecord (1.2.D003-1) unstable; urgency=low\n\n  * This change adds a filter allowing you to OR a constant into the data.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 09 Nov 1998 18:22:39 +1100\n\nsrecord (1.2.D002-1) unstable; urgency=low\n\n  * This change improves the use of the #pragma implementation and #pragma\n    interface to cope with older and dumber G++ versions.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 09 Nov 1998 17:59:02 +1100\n\nsrecord (1.2.D001-1) unstable; urgency=low\n\n  * This change prepares this next version for release.  The releases are post-\n    numbered.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 05 Nov 1998 10:49:49 +1100\n\nsrecord (1.1.D010-1) unstable; urgency=low\n\n  * This change adds the --unsplit filter, used to do the reverse of the --split\n    filter\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 04 Nov 1998 18:25:04 +1100\n\nsrecord (1.1.D009-1) unstable; urgency=low\n\n  * This change updates the installation build to include the reference manual.\n\n -- Peter Miller <pmiller@opensource.org.au>  Wed, 04 Nov 1998 14:52:18 +1100\n\nsrecord (1.1.D008-1) unstable; urgency=low\n\n  * This change adds the split filter, for splitting wide eprom images.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 03 Nov 1998 18:12:52 +1100\n\nsrecord (1.1.D007-1) unstable; urgency=low\n\n  * This change adds support for Tektronix abort records.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 02 Nov 1998 00:03:50 +1100\n\nsrecord (1.1.D006-1) unstable; urgency=low\n\n  * This change completes the support for Intel mode.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 01 Nov 1998 12:11:49 +1100\n\nsrecord (1.1.D005-1) unstable; urgency=low\n\n  * This change adds reading and writing of the Tektronix hex file format.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 30 Oct 1998 23:42:06 +1100\n\nsrecord (1.1.D004-1) unstable; urgency=low\n\n  * This change adds a reference manual, constructed from the readme and\n    building files, and the manual pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 30 Oct 1998 23:30:52 +1100\n\nsrecord (1.1.D003-1) unstable; urgency=low\n\n  * This change adds file format man pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 29 Jun 1998 10:39:49 +1000\n\nsrecord (1.1.D002-1) unstable; urgency=low\n\n  * This change updates the LSM, etc, to reflect where the SunSite.unc\n    maintainers chose to put the software.\n\n -- Peter Miller <pmiller@opensource.org.au>  Thu, 26 Mar 1998 10:07:52 +1100\n\nsrecord (1.1.D001-1) unstable; urgency=low\n\n  * This change tidies up loose ends (and cranks on the version number) in\n    preparation for release.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 22 Mar 1998 12:47:34 +1100\n\nsrecord (1.0.D020-1) unstable; urgency=low\n\n  * This change makes the input formts more generous about garbage lines on\n    input.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 22 Mar 1998 10:55:06 +1100\n\nsrecord (1.0.D019-1) unstable; urgency=low\n\n  * This change adds a file manifest to the distribution set.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 22 Mar 1998 09:03:34 +1100\n\nsrecord (1.0.D018-1) unstable; urgency=low\n\n  * Thsi change adds the minimum and maximum filters.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 21 Mar 1998 23:00:11 +1100\n\nsrecord (1.0.D017-1) unstable; urgency=low\n\n  * This change adds a checksum filter, to insert checksums into the data.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 21 Mar 1998 21:12:16 +1100\n\nsrecord (1.0.D016-1) unstable; urgency=low\n\n  * This change adds the srec_info command, use to obtain information about data\n    files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 21 Mar 1998 20:53:07 +1100\n\nsrecord (1.0.D015-1) unstable; urgency=low\n\n  * This change adds help and version options to all of the commands.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 20 Mar 1998 12:22:28 +1100\n\nsrecord (1.0.D014-1) unstable; urgency=low\n\n  * 1. This change adds the C output filter.      This allows a C source file\n    containing an array initialized with the input data.\n  * 2. This change adds the -over and -within address range specifiers.\n  * 3. This change adds a variety of examples to the man pages.\n\n -- Peter Miller <pmiller@opensource.org.au>  Mon, 16 Mar 1998 17:12:45 +1100\n\nsrecord (1.0.D013-1) unstable; urgency=low\n\n  * This change adds the length filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 15 Mar 1998 22:39:55 +1100\n\nsrecord (1.0.D012-1) unstable; urgency=low\n\n  * This change adds the fill filter, to fill hols in the input files.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 15 Mar 1998 18:01:57 +1100\n\nsrecord (1.0.D011-1) unstable; urgency=low\n\n  * 1. This change refines the description in the README file.\n  * 2. This change refines the description in the spec file.\n  * 3. This change adds an LSM file and a HTML home page with icon\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 15 Mar 1998 15:41:54 +1100\n\nsrecord (1.0.D010-1) unstable; urgency=low\n\n  * This change adds the exclude filter, the opposite of the crop filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 15 Mar 1998 09:51:44 +1100\n\nsrecord (1.0.D009-1) unstable; urgency=low\n\n  * This change s the first round in preparing the code for release.      It\n    constructs a Makefile, a tar file, and an RPM spec file.  RPM package build\n    s are supported, but are not an integration build target, because they take\n    so long.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 13 Mar 1998 12:09:49 +1100\n\nsrecord (1.0.D008-1) unstable; urgency=low\n\n  * This change adds the crop filter, to remove portions of a file.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 10 Mar 1998 22:11:43 +1100\n\nsrecord (1.0.D007-1) unstable; urgency=low\n\n  * This change corrects a problem where the tests were leaving their working\n    directory behind.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 10 Mar 1998 22:01:50 +1100\n\nsrecord (1.0.D006-1) unstable; urgency=low\n\n  * This change adds the binary file type.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 10 Mar 1998 13:50:22 +1100\n\nsrecord (1.0.D005-1) unstable; urgency=low\n\n  * 1. This change adds the intel hex format for input and output.\n  * 2. This change adds the offset filter.\n\n -- Peter Miller <pmiller@opensource.org.au>  Tue, 10 Mar 1998 13:17:06 +1100\n\nsrecord (1.0.D004-1) unstable; urgency=low\n\n  * This change adds the srec_cmp command, used to compare srec files. It is\n    not sufficient to use cmp(1) or diff(1), because the record boundaries are\n    arbitrary.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Mar 1998 21:48:34 +1100\n\nsrecord (1.0.D003-1) unstable; urgency=low\n\n  * This change adds a memory store for grouping.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sun, 08 Mar 1998 21:11:14 +1100\n\nsrecord (1.0.D002-1) unstable; urgency=low\n\n  * This change adds the fundamental library classes.\n\n -- Peter Miller <pmiller@opensource.org.au>  Sat, 07 Mar 1998 21:59:29 +1100\n\nsrecord (1.0.D001-1) unstable; urgency=low\n\n  * This change introduces the initial build skeleton.\n\n -- Peter Miller <pmiller@opensource.org.au>  Fri, 06 Mar 1998 14:55:52 +1100\n\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/compat",
    "content": "5\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/control",
    "content": "Source: srecord\nSection: utils\nPriority: extra\nMaintainer: Scott Finneran <scottfinneran@yahoo.com.au>\nHomepage: http://srecord.sourceforge.net\nDM-Upload-Allowed: yes\nBuild-Depends: autotools-dev, debhelper (>= 5), dh-autoreconf, ghostscript,\n groff, libboost-dev, libgcrypt11-dev, libtool\nStandards-Version: 3.9.3\n\nPackage: srecord\nArchitecture: any\nDescription: A collection of powerful tools for manipulating EPROM load files\n The srecord package is a collection of powerful tools for manipulating EPROM\n load files. It reads and writes numerous EPROM file formats, and can perform\n many different manipulations.\n .\n The tools include:\n  * The srec_cat program may be used to catenate (join) EPROM load files, or\n    portions of EPROM load files, together. Because it understands all of the\n    input and output formats, it can also be used to convert files from one\n    format to another. It also understands filters.\n  * The srec_cmp program may be used to compare EPROM load files, or portions\n    of EPROM load files, for equality.\n  * The srec_info program may be used to print summary information about EPROM\n    load files.\nDepends: ${misc:Depends}, ${shlibs:Depends}, libsrecord0\n\nPackage: srecord-doc\nArchitecture: all\nSection: doc\nDescription: Manipulate EPROM load files - documentation\n The srecord package is a collection of powerful tools for manipulating EPROM\n load files. It reads and writes numerous EPROM file formats, and can perform\n many different manipulations.\n .\n The tools include:\n  * The srec_cat program may be used to catenate (join) EPROM load files, or\n    portions of EPROM load files, together. Because it understands all of the\n    input and output formats, it can also be used to convert files from one\n    format to another. It also understands filters.\n  * The srec_cmp program may be used to compare EPROM load files, or portions\n    of EPROM load files, for equality.\n  * The srec_info program may be used to print summary information about EPROM\n    load files.\nDepends: ${misc:Depends}\n\nPackage: libsrecord0\nSection: libs\nArchitecture: any\nDescription: Manipulate EPROM load files - runtime library\n The srecord package is a collection of powerful tools for manipulating EPROM\n load files. It reads and writes numerous EPROM file formats, and can perform\n many different manipulations.\n .\n The tools include:\n  * The srec_cat program may be used to catenate (join) EPROM load files, or\n    portions of EPROM load files, together. Because it understands all of the\n    input and output formats, it can also be used to convert files from one\n    format to another. It also understands filters.\n  * The srec_cmp program may be used to compare EPROM load files, or portions\n    of EPROM load files, for equality.\n  * The srec_info program may be used to print summary information about EPROM\n    load files.\nDepends: ${misc:Depends}, ${shlibs:Depends}\n\nPackage: libsrecord0-dbg\nSection: debug\nArchitecture: any\nDescription: Manipulate EPROM load files - debugging symbols\n The srecord package is a collection of powerful tools for manipulating EPROM\n load files. It reads and writes numerous EPROM file formats, and can perform\n many different manipulations.\n .\n The tools include:\n  * The srec_cat program may be used to catenate (join) EPROM load files, or\n    portions of EPROM load files, together. Because it understands all of the\n    input and output formats, it can also be used to convert files from one\n    format to another. It also understands filters.\n  * The srec_cmp program may be used to compare EPROM load files, or portions\n    of EPROM load files, for equality.\n  * The srec_info program may be used to print summary information about EPROM\n    load files.\nDepends: ${misc:Depends}, ${shlibs:Depends}, libsrecord0 (= ${binary:Version})\n\nPackage: libsrecord-dev\nSection: libdevel\nArchitecture: any\nDescription: Manipulate EPROM load files - development files\n The srecord package is a collection of powerful tools for manipulating EPROM\n load files. It reads and writes numerous EPROM file formats, and can perform\n many different manipulations.\n .\n The tools include:\n  * The srec_cat program may be used to catenate (join) EPROM load files, or\n    portions of EPROM load files, together. Because it understands all of the\n    input and output formats, it can also be used to convert files from one\n    format to another. It also understands filters.\n  * The srec_cmp program may be used to compare EPROM load files, or portions\n    of EPROM load files, for equality.\n  * The srec_info program may be used to print summary information about EPROM\n    load files.\nDepends: ${misc:Depends}, ${shlibs:Depends}, libsrecord0 (= ${binary:Version})\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/copyright",
    "content": "Copyright:\n\n    Copyright (C) 1998-2010 Peter Miller\n\n    See the AUTHORS file, too.\n\nLicense:\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This package is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nOn Debian systems, the complete text of the GNU General Public License,\nversion 3, can be found in `/usr/share/common-licenses/GPL-3'.\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/docs",
    "content": "README\nAUTHORS\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/libsrecord-dev.install",
    "content": "usr/include/srecord/adler16.h\nusr/include/srecord/adler32.h\nusr/include/srecord/crc16.h\nusr/include/srecord/crc32.h\nusr/include/srecord/defcon.h\nusr/include/srecord/endian.h\nusr/include/srecord/fletcher16.h\nusr/include/srecord/fletcher32.h\nusr/include/srecord/format_printf.h\nusr/include/srecord/input.h\nusr/include/srecord/input/catenate.h\nusr/include/srecord/input/file.h\nusr/include/srecord/input/file/aomf.h\nusr/include/srecord/input/file/ascii_hex.h\nusr/include/srecord/input/file/atmel_generic.h\nusr/include/srecord/input/file/binary.h\nusr/include/srecord/input/file/brecord.h\nusr/include/srecord/input/file/cosmac.h\nusr/include/srecord/input/file/dec_binary.h\nusr/include/srecord/input/file/emon52.h\nusr/include/srecord/input/file/fairchild.h\nusr/include/srecord/input/file/fastload.h\nusr/include/srecord/input/file/formatted_binary.h\nusr/include/srecord/input/file/four_packed_code.h\nusr/include/srecord/input/file/intel.h\nusr/include/srecord/input/file/logisim.h\nusr/include/srecord/input/file/mif.h\nusr/include/srecord/input/file/mips_flash.h\nusr/include/srecord/input/file/mos_tech.h\nusr/include/srecord/input/file/msbin.h\nusr/include/srecord/input/file/needham.h\nusr/include/srecord/input/file/os65v.h\nusr/include/srecord/input/file/ppb.h\nusr/include/srecord/input/file/ppx.h\nusr/include/srecord/input/file/signetics.h\nusr/include/srecord/input/file/spasm.h\nusr/include/srecord/input/file/spectrum.h\nusr/include/srecord/input/file/stewie.h\nusr/include/srecord/input/file/tektronix.h\nusr/include/srecord/input/file/tektronix_extended.h\nusr/include/srecord/input/file/ti_tagged.h\nusr/include/srecord/input/file/ti_tagged_16.h\nusr/include/srecord/input/file/ti_txt.h\nusr/include/srecord/input/file/trs80.h\nusr/include/srecord/input/file/vmem.h\nusr/include/srecord/input/file/wilson.h\nusr/include/srecord/input/filter.h\nusr/include/srecord/input/filter/and.h\nusr/include/srecord/input/filter/bitrev.h\nusr/include/srecord/input/filter/byte_swap.h\nusr/include/srecord/input/filter/checksum.h\nusr/include/srecord/input/filter/checksum/bitnot.h\nusr/include/srecord/input/filter/checksum/negative.h\nusr/include/srecord/input/filter/checksum/positive.h\nusr/include/srecord/input/filter/crop.h\nusr/include/srecord/input/filter/fill.h\nusr/include/srecord/input/filter/interval.h\nusr/include/srecord/input/filter/interval/length.h\nusr/include/srecord/input/filter/interval/maximum.h\nusr/include/srecord/input/filter/interval/minimum.h\nusr/include/srecord/input/filter/message.h\nusr/include/srecord/input/filter/message/adler16.h\nusr/include/srecord/input/filter/message/adler32.h\nusr/include/srecord/input/filter/message/crc16.h\nusr/include/srecord/input/filter/message/crc32.h\nusr/include/srecord/input/filter/message/fletcher16.h\nusr/include/srecord/input/filter/message/fletcher32.h\nusr/include/srecord/input/filter/message/gcrypt.h\nusr/include/srecord/input/filter/not.h\nusr/include/srecord/input/filter/offset.h\nusr/include/srecord/input/filter/or.h\nusr/include/srecord/input/filter/random_fill.h\nusr/include/srecord/input/filter/sequence.h\nusr/include/srecord/input/filter/split.h\nusr/include/srecord/input/filter/unfill.h\nusr/include/srecord/input/filter/unsplit.h\nusr/include/srecord/input/filter/xor.h\nusr/include/srecord/input/generator.h\nusr/include/srecord/input/generator/constant.h\nusr/include/srecord/input/generator/random.h\nusr/include/srecord/input/generator/repeat.h\nusr/include/srecord/interval.h\nusr/include/srecord/memory.h\nusr/include/srecord/memory/chunk.h\nusr/include/srecord/memory/walker.h\nusr/include/srecord/memory/walker/compare.h\nusr/include/srecord/memory/walker/continuity.h\nusr/include/srecord/memory/walker/gcrypt.h\nusr/include/srecord/memory/walker/writer.h\nusr/include/srecord/output.h\nusr/include/srecord/output/file.h\nusr/include/srecord/output/file/aomf.h\nusr/include/srecord/output/file/ascii_hex.h\nusr/include/srecord/output/file/asm.h\nusr/include/srecord/output/file/atmel_generic.h\nusr/include/srecord/output/file/basic.h\nusr/include/srecord/output/file/binary.h\nusr/include/srecord/output/file/brecord.h\nusr/include/srecord/output/file/c.h\nusr/include/srecord/output/file/cosmac.h\nusr/include/srecord/output/file/dec_binary.h\nusr/include/srecord/output/file/emon52.h\nusr/include/srecord/output/file/fairchild.h\nusr/include/srecord/output/file/fastload.h\nusr/include/srecord/output/file/formatted_binary.h\nusr/include/srecord/output/file/forth.h\nusr/include/srecord/output/file/four_packed_code.h\nusr/include/srecord/output/file/hexdump.h\nusr/include/srecord/output/file/intel.h\nusr/include/srecord/output/file/intel16.h\nusr/include/srecord/output/file/logisim.h\nusr/include/srecord/output/file/mif.h\nusr/include/srecord/output/file/mips_flash.h\nusr/include/srecord/output/file/mos_tech.h\nusr/include/srecord/output/file/msbin.h\nusr/include/srecord/output/file/needham.h\nusr/include/srecord/output/file/os65v.h\nusr/include/srecord/output/file/ppb.h\nusr/include/srecord/output/file/ppx.h\nusr/include/srecord/output/file/signetics.h\nusr/include/srecord/output/file/spasm.h\nusr/include/srecord/output/file/spectrum.h\nusr/include/srecord/output/file/stewie.h\nusr/include/srecord/output/file/tektronix.h\nusr/include/srecord/output/file/tektronix_extended.h\nusr/include/srecord/output/file/ti_tagged.h\nusr/include/srecord/output/file/ti_tagged_16.h\nusr/include/srecord/output/file/ti_txt.h\nusr/include/srecord/output/file/trs80.h\nusr/include/srecord/output/file/vhdl.h\nusr/include/srecord/output/file/vmem.h\nusr/include/srecord/output/file/wilson.h\nusr/include/srecord/quit.h\nusr/include/srecord/quit/exception.h\nusr/include/srecord/quit/normal.h\nusr/include/srecord/quit/prefix.h\nusr/include/srecord/record.h\nusr/include/srecord/srecord.h\nusr/include/srecord/string.h\nusr/lib/libsrecord.a\nusr/lib/libsrecord.so\nusr/lib/pkgconfig/srecord.pc\nusr/share/man/man3/srecord.3\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/libsrecord0.install",
    "content": "usr/lib/libsrecord.so.*\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/rules",
    "content": "#!/usr/bin/make -f\n\n# Uncomment this to turn on verbose mode.\n#export DH_VERBOSE=1\n\nCFLAGS = -Wall -g\nifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))\nCFLAGS += -O0\nelse\nCFLAGS += -O2\nendif\n\nconfig.status: configure\n\tdh_testdir\n\tdh_autotools-dev_updateconfig\n\tdh_autoreconf\n\tsh configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc \\\n\t\t--mandir=/usr/share/man CFLAGS=\"$(CFLAGS)\" LDFLAGS=\"-Wl,-z,defs\"\n\nbuild: build-arch build-indep\n\nbuild-arch: build-stamp\n\nbuild-indep: build-stamp\n\n# Build and test the tarball.\nbuild-stamp: config.status\n\tdh_testdir\n\t$(MAKE)\n\t$(MAKE) check\n\ttouch $@\n\n# dpkg-buildpackage (step 3) invokes 'fakeroot debian/rules clean', and after\n# that (step 5) does the actual build.\nclean:\n\tdh_testdir\n\tdh_testroot\n\trm -f build-stamp\n\ttest ! -f Makefile || $(MAKE) distclean\n\tdh_autoreconf_clean\n\tdh_autotools-dev_restoreconfig\n\tdh_clean\n\n# Install the built tarball into the temporary install tree. It depends on the\n# 'build' target, so the tarball is also built by this rule.\ninstall: build\n\tdh_testdir\n\tdh_testroot\n\tdh_prep\n\tdh_installdirs -A\n\tmkdir -p $(CURDIR)/debian/tmp/usr/lib\n\tmkdir -p $(CURDIR)/debian/tmp/usr/share\n\t$(MAKE) DESTDIR=$(CURDIR)/debian/tmp install\n\t-rm $(CURDIR)/debian/tmp/usr/lib/*.la\n\t-rm -f $(CURDIR)/debian/tmp/usr/share/man/man1/srec_license.1\n\t-rm -f $(CURDIR)/debian/tmp/usr/share/man/man3/srecord_license.3\n\n# Build the binary package files here.\nbinary binary-arch binary-indep: install\n\tdh_testdir\n\tdh_testroot\n\tdh_installchangelogs\n\tdh_installdocs -A\n\tdh_install --fail-missing --sourcedir=debian/tmp\n\tdh_installman -A\n\tdh_strip --dbg-package=libsrecord0-dbg\n\tdh_compress -A\n\tdh_fixperms\n\tdh_makeshlibs\n\tdh_shlibdeps\n\tdh_installdeb\n\tdh_gencontrol\n\tdh_md5sums\n\tdh_builddeb\n\n.PHONY: binary binary-arch binary-indep build build-arch build-indep clean \\\n\t\tinstall\n\n# vim: set ts=8 sw=8 noet :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/srecord-doc.install",
    "content": "usr/share/doc/srecord/BUILDING.pdf\nusr/share/doc/srecord/README.pdf\nusr/share/doc/srecord/change_log.pdf\nusr/share/doc/srecord/reference.pdf\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/srecord.install",
    "content": "usr/bin/srec_cat\nusr/bin/srec_cmp\nusr/bin/srec_info\nusr/share/man/man1/srec_cat.1\nusr/share/man/man1/srec_cmp.1\nusr/share/man/man1/srec_examples.1\nusr/share/man/man1/srec_info.1\nusr/share/man/man1/srec_input.1\nusr/share/man/man5/srec_aomf.5\nusr/share/man/man5/srec_ascii_hex.5\nusr/share/man/man5/srec_atmel_generic.5\nusr/share/man/man5/srec_binary.5\nusr/share/man/man5/srec_brecord.5\nusr/share/man/man5/srec_coe.5\nusr/share/man/man5/srec_cosmac.5\nusr/share/man/man5/srec_dec_binary.5\nusr/share/man/man5/srec_emon52.5\nusr/share/man/man5/srec_fairchild.5\nusr/share/man/man5/srec_fastload.5\nusr/share/man/man5/srec_formatted_binary.5\nusr/share/man/man5/srec_forth.5\nusr/share/man/man5/srec_fpc.5\nusr/share/man/man5/srec_idt.5\nusr/share/man/man5/srec_intel.5\nusr/share/man/man5/srec_intel16.5\nusr/share/man/man5/srec_logisim.5\nusr/share/man/man5/srec_mem.5\nusr/share/man/man5/srec_mif.5\nusr/share/man/man5/srec_mips_flash.5\nusr/share/man/man5/srec_mos_tech.5\nusr/share/man/man5/srec_motorola.5\nusr/share/man/man5/srec_msbin.5\nusr/share/man/man5/srec_needham.5\nusr/share/man/man5/srec_os65v.5\nusr/share/man/man5/srec_ppb.5\nusr/share/man/man5/srec_ppx.5\nusr/share/man/man5/srec_signetics.5\nusr/share/man/man5/srec_spasm.5\nusr/share/man/man5/srec_spectrum.5\nusr/share/man/man5/srec_stewie.5\nusr/share/man/man5/srec_tektronix.5\nusr/share/man/man5/srec_tektronix_extended.5\nusr/share/man/man5/srec_ti_tagged.5\nusr/share/man/man5/srec_ti_tagged_16.5\nusr/share/man/man5/srec_ti_txt.5\nusr/share/man/man5/srec_trs80.5\nusr/share/man/man5/srec_vmem.5\nusr/share/man/man5/srec_wilson.5\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/debian/watch",
    "content": "version=3\nhttp://srecord.sourceforge.net/debian/srecord_(.*)\\.orig\\.tar\\.gz\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/BUILDING.man",
    "content": "'\\\" t\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 1998, 2001, 2003, 2006-2010, 2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.TH Build SRecord SRecord \"Reference Manual\"\n.so etc/version.so\n.if n .hy 0\n.if n .ad l\n.if n .nr IN 8n\n.SH NAME\nHow to build SRecord\n.XX \"\" \"How to build SRecord\"\n.SH SPACE REQUIREMENTS\nYou will need about 3MB to unpack and build the\n.I SRecord\npackage.\nYour milage may vary.\n.br\n.ne 1i\n.SH BEFORE YOU START\nThere are a few pieces of software you may want to\nfetch and install before you proceed with your installation of SRecord.\n.TP 8n\nBoost Library\nYou will need the C++ Boost Library.\nIf you are using a package based system, you will need the\nlibboost\\[hy]devel package, or one named something very similar.\n.br\nhttp://boost.org/\n.TP 8n\nLibgcrypt Library\nYou will need the GNU Crypt library.\nIf you are using a package based system, you will need the\nlibgcrypt\\[hy]devel package, or one named something very similar.\n.br\nhttp://directory.fsf.org/project/libgcrypt/\n.TP 8n\nGNU Libtool\nYou will need the GNU Libtool software, used to build shared libraries\non a variety of systems.\n.br\nhttp://www.gnu.org/software/libtool/\n.TP 8n\nGNU Groff\nThe documentation for the\n.I SRecord\npackage was prepared using the GNU Groff package (version 1.14 or later).\nThis distribution includes full documentation,\nwhich may be processed into PostScript or DVI files\nat install time \\- if GNU Groff has been installed.\n.TP 8n\nGCC\nYou may also want to consider fetching and installing the GNU C Compiler\nif you have not done so already.  This is not essential.\nSRecord was developed using the GNU C++ compiler, and the GNU C++ libraries.\n.PP\nThe GNU FTP archives may be found at \\f[CW]ftp.gnu.org\\fP,\nand are mirrored around the world.\n.br\n.ne 1i\n.SH SITE CONFIGURATION\nThe\n.B SRecord\npackage is configured using the\n.I configure\nprogram included in this distribution.\n.PP\nThe\n.I configure\nshell script attempts to guess correct values for\nvarious system\\[hy]dependent variables used during compilation,\nand creates the\n.I Makefile\nand\n.I lib/config.h\nfiles.\nIt also creates a shell script\n.I config.status\nthat you can run in the future to recreate the current configuration.\n.PP\nNormally,\nyou just\n.I cd\nto the directory containing\n.IR SRecord \"'s\"\nsource code and then type\n.RS\n.ft CW\n.nf\n\\f[B]% \\fP./configure\n\\f[I]\\&...lots of output...\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\nIf you're using\n.I csh\non an old version of System V,\nyou might need to type\n.RS\n.ft CW\n.nf\n\\f[B]% \\fPsh configure\n\\f[I]\\&...lots of output...\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\ninstead to prevent\n.I csh\nfrom trying to execute\n.I configure\nitself.\n.PP\nRunning\n.I configure\ntakes a minute or two.\nWhile it is running,\nit prints some messages that tell what it is doing.\nIf you don't want to see the messages,\nrun\n.I configure\nusing the quiet option;\nfor example,\n.RS\n.FT CW\n.nf\n\\f[B]% \\fP./configure \\-\\-quiet\n\\bB%\\fP\n.fi\n.ft R\n.RE\n.PP\nTo compile the\n.B SRecord\npackage in a different directory from the one\ncontaining the source code,\nyou must use a version of\n.I make\nthat supports the\n.I VPATH variable,\nsuch as\n.IR \"GNU make\" .\n.I cd\nto the directory where you want the object files and executables to go and run\nthe\n.I configure\nscript.\n.I configure\nautomatically checks for the source code in the directory that\n.I configure\nis in and in\n.IR \\&..\n(the parent directory).\nIf for some reason\n.I configure\nis not in the source code directory that you are configuring,\nthen it will report that it can't find the source code.\nIn that case,\nrun\n.I configure\nwith the option \\f[CW]\\-\\-srcdir=\\fP\\f[I]DIR\\fP,\nwhere\n.I DIR\nis the directory that contains the source code.\n.PP\nBy default,\n.I configure\nwill arrange for the\n.I \"make install\"\ncommand to install the\n.B SRecord\npackage's files in\n.IR /usr/local/bin ,\nand\n.IR /usr/local/man .\nThere are options which allow you to control the placement\nof these files.\n.TP 8n\n\\f[CW]\\-\\-prefix=\\fP\\f[I]PATH\\fP\nThis specifies the path prefix to be used in the installation.\nDefaults to \\f[I]/usr/local\\fP unless otherwise specified.\n.TP 8n\n\\f[CW]\\-\\-exec\\-prefix=\\fP\\f[I]PATH\\fP\nYou can specify separate installation prefixes for\narchitecture\\[hy]specific files files.\nDefaults to \\f[I]${prefix}\\fP unless otherwise specified.\n.TP 8n\n\\f[CW]\\-\\-bindir=\\fP\\f[I]PATH\\fP\nThis directory contains executable programs.  On a network, this\ndirectory may be shared between machines with identical hardware and\noperating systems; it may be mounted read\\[hy]only.  Defaults to\n\\f[I]${exec_prefix}/bin\\fP unless otherwise specified.\n.TP 8n\n\\f[CW]\\-\\-mandir=\\fP\\f[I]PATH\\fP\nThis directory contains the on\\[hy]line manual entries.  On a network, this\ndirectory may be shared between all machines; it may be mounted\nread\\[hy]only.  Defaults to \\f[I]${prefix}/man\\fP unless otherwise specified.\n.PP\n.I configure\nignores most other arguments that you give it;\nuse the \\f[CW]\\-\\-help\\fP option for a complete list.\n.br\n.ne 2i\n.PP\nOn systems that require unusual options for compilation or linking\nthat the\n.I SRecord\npackage's\n.I configure\nscript does not know about,\nyou can give\n.I configure\ninitial values for variables by setting them in the environment.\nIn Bourne\\[hy]compatible shells,\nyou can do that on the command line like this:\n.RS\n.ft CW\n.nf\n\\f[B]$ \\fPCXX='g++ \\-traditional' LIBS=\\-lposix ./configure\n\\f[I]\\&...lots of output...\\fP\n\\f[B]$\\fP\n.fi\n.ft R\n.RE\nHere are the\n.I make\nvariables that you might want to override with\nenvironment variables when running\n.IR configure .\n.TP 8n\nVariable: CXX\nC++ compiler program.\nThe default is\n.IR c++ .\n.TP 8n\nVariable: CPPFLAGS\nPreprocessor flags, commonly defines and include search paths.\nDefaults to empty.\nIt is common to use \\f[CW]CPPFLAGS=\\-I/usr/local/include\\fP to access other\ninstalled packages.\n.TP 8n\nVariable: INSTALL\nProgram to use to install files.\nThe default is\n.I install\nif you have it,\n.I cp\notherwise.\n.TP 8n\nVariable: LIBS\nLibraries to link with,\nin the form \\f[CW]\\-l\\fP\\f[I]foo\\fP \\f[CW]\\-l\\fP\\f[I]bar\\fP.\nThe\n.I configure\nscript will append to this,\nrather than replace it.\nIt is common to use \\f[CW]LIBS=\\-L/usr/local/lib\\fP to access other\ninstalled packages.\n.PP\nIf you need to do unusual things to compile the package,\nthe author encourages you to figure out how\n.I configure\ncould check whether to do them,\nand mail diffs or instructions to the author\nso that they can be included in the next release.\n.br\n.ne 1i\n.SH BUILDING SRECORD\nAll you should need to do is use the\n.RS\n.ft CW\n.nf\n\\f[B]% \\fPmake\n\\f[I]\\&...lots of output...\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\ncommand and wait.\nWhen this finishes you should see a directory called\n.I bin\ncontaining three files:\n.IR srec_cat ,\n.IR srec_cmp\nand\n.IR srec_info .\n.TP 8n\n.B srec_cat\n.The\n.I srec_cat\nprogram is used to manipulate and convert EPROM load files.\nFor more information, see\n.IR srec_cat (1).\n.TP 8n\n.B srec_cmp\nThe\n.I srec_cmp\nprogram is used to compare EPROM load files.\nFor more information, see\n.IR srec_cmp (1).\n.TP 8n\n.B srec_info\nThe\n.I srec_info\nprogram is used to print information about EPROM load files.\nFor more information, see\n.IR srec_info (1).\n.br\n.ne 1.5i\n.PP\nIf you have GNU Groff installed, the build will also create a\n.I etc/reference.ps\nfile.  This contains the README file, this BUILDING file,\nand all of the man pages.\n.PP\nYou can remove the program binaries and object files from the\nsource directory by using the\n.RS\n.ft CW\n.nf\n\\f[B]% \\fPmake clean\n\\f[I]\\&...lots of output...\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\ncommand.\nTo remove all of the above files, and also remove the\n.I Makefile\nand\n.I lib/config.h\nand\n.I config.status\nfiles, use the\n.RS\n.ft CW\n.nf\n\\f[B]% \\fPmake distclean\n\\f[I]\\&...lots of output...\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\ncommand.\n.PP\nThe file\n.I etc/configure.in\nis used to create\n.I configure\nby a GNU program called\n.IR autoconf .\nYou only need to know this if you want to regenerate\n.I configure\nusing a newer version of\n.IR autoconf .\n.SS Windows NT\nIt is possible to build SRecord on MS Windows platforms, using the Cygwin\n(see \\f[CW]www.cygwin.com\\fP) or DJGPP (see\n\\f[CW]www.delorie.com/djgpp\\fP) environments.  This provides the\n\\&\\[lq]porting layer\\[rq] necessary to run Unix programs on Windows.  The build\nprocess is exactly as described above.\n.PP\nYou may need to pass in the include path to the Boost library.\nThis is most simply done as\n.RS\n.ft CW\n.nf\nCC='gcc \\-no\\-cygwin' \\e\nCXX='g++ \\-mno\\-cygwin \\-I/usr/include/boost\\-1_33_1' \\e\n./configure\n.fi\n.ft R\n.RE\n.PP\nDJGPP always produces native binaries, however\nif you want to make native binaries with Cygwin (\\f[I]i.e.\\fP ones which\nwork outside Cygwin) there is one extra step you need after running\n\\f[CW]./configure\\fP and before you run \\f[CW]make\\fP.  You need to\nedit the \\f[I]Makefile\\fP file, and add \\f[CW]\\-mno\\-cygwin\\fP to the end of\nthe \\f[CW]CXX=g++\\fP line.\n.PP\nOnce built (using either tool set) Windows binaries should be testable\nin the same way as described in the next section.\nHowever, there may be some CRLF issues in the text file comparisons\nwhich give false negatives, depending on the CRLF setting of your Cygwin\nfile system when you unpacked the tarball.\n.br\n.ne 1i\n.SH TESTING SRECORD\nThe\n.I SRecord\npackage comes with a test suite.\nTo run this test suite, use the command\n.RS\n.ft CW\n.nf\n\\f[B]% \\fPmake sure\n\\f[I]\\&...lots of output...\\fP\n.if n \\f[B]Passed All Tests\\fP\n.if t \\f[CB]Passed All Tests\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\n.PP\nThe tests take a few seconds each,\nwith a few very fast,\nand a couple very slow,\nbut it varies greatly depending on your CPU.\n.PP\nIf all went well, the message\n.RS\n.ft CW\nPassed All Tests\n.ft R\n.RE\nshould appear at the end of the make.\n.br\n.ne 1i\n.SH INSTALLING SRECORD\nAs explained in the\n.I \"SITE CONFIGURATION\"\nsection, above,\nthe\n.I SRecord\npackage is installed under the\n.I /usr/local\ntree by default.\nUse the \\f[CW]\\-\\-prefix=\\fP\\f[I]PATH\\fP option to\n.I configure\nif you want some other path.\nMore specific installation locations are assignable,\nuse the \\f[CW]\\-\\-help\\fP option to\n.I configure\nfor details.\n.PP\nAll that is required to install the\n.I SRecord\npackage is to use the\n.RS\n.ft CW\n.nf\n\\f[B]% \\fPmake install\n\\f[I]\\&...lots of output...\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\ncommand.\nControl of the directories used may be found in the first\nfew lines of the\n.I Makefile\nfile and the other files written by the\n.I configure\nscript;\nit is best to reconfigure using the\n.I configure\nscript, rather than attempting to do this by hand.\n.br\n.ne 1i\n.SH GETTING HELP\nIf you need assistance with the\n.I SRecord\npackage,\nplease post to the srecord\\[hy]users mailing list\n.RS\n.ft CW\nsrecord\\[hy]users@lists.sourceforge.net\n.ft R\n.RE\nFor information obout the srecord\\[hy]users mailing list.\nhttp://srecord.sourceforge.net/mailing\\[hy]list.html\n.PP\nWhen reporting problems,\nplease include the version number\ngiven by the\n.RS\n.ft CW\n.nf\n\\f[B]% \\fPsrec_cat \\-version\n.if n \\f[B]srecord version\\fP \\f[I]\\*(V)\\fP\n.if t \\f[CB]srecord version\\fP \\f[I]\\*(V)\\fP\n\\f[I]\\&...warranty disclaimer...\\fP\n\\f[B]%\\fP\n.fi\n.ft R\n.RE\ncommand.\nPlease do not send this example;\nrun the program for the exact version number.\n.br\n.ne 2i\n.SH COPYRIGHT\n.I srecord\nversion \\*(v)\n.br\nCopyright\n.if n (C)\n.if t \\(co\n\\*(Y) Peter Miller\n.br\nCopyright\n.if n (C)\n.if t \\(co\n\\*(Y) SCott Finneran\n.PP\nThe\n.I SRecord\npackage is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or\nFITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n.PP\nIt should be in the\n.I LICENSE\nfile included with this distribution.\n.br\n.ne 1i\n.SH AUTHOR\n.TS\ntab(;);\nl r l.\nScott Finneran;E\\[hy]Mail:;scottfinneran@yahoo.com.au\nPeter Miller;E\\[hy]Mail:;pmiller@opensource.org.au\n.TE\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.0.txt",
    "content": "\n\n\nProject \"srecord.1.0\"                                            Page 1\nList of Changes                                Wed Nov  4 00:02:08 1998\n\nChange  State           Description\n------- -------         -------------\n  10    completed       initial skeleton\n  11    completed       Add fundamental library classes.\n  12    completed       memory store\n  13    completed       srec_cmp\n  14    completed       add intel format\n  15    completed       add binary file type\n  16    completed       add crop filter\n  17    completed       test leave junk behind\n  18    completed       add exclude filter\n  19    completed       add Makefile and RPM spec file\n  20    completed       more release preparation\n  21    completed       add fill filter\n  22    completed       length filter\n  23    completed       add C output format\n  24    completed       add checksum filter\n  25    completed       add help and version options\n  26    completed       srec_info\n  27    completed       add minimum and maximum filters\n  28    completed       add file manifest\n  29    completed       more flexible input\n\n\n\nProject \"srecord.1.0\", Change 10                                 Page 1\nChange Details                                 Wed Nov  4 00:02:09 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 1, Change 10.\n\nSUMMARY\n        initial skeleton\n\nDESCRIPTION\n        This change introduces the initial build skeleton.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         config\n        source  create    1.1         etc/Howto.cook\n        source  create    1.1         etc/template/c\n        source  create    1.1         etc/template/cc\n        source  create    1.1         etc/template/generic\n        source  create    1.1         etc/template/h\n        source  create    1.1         etc/template/sh\n        source  create    1.1         etc/template/test\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Mar  6      pmiller\n                        14:41:43 1998\n        develop_begin   Fri Mar  6      pmiller  Elapsed time: 0.027\n                        14:41:58 1998            days.\n        develop_end     Fri Mar  6      pmiller\n                        14:54:13 1998\n        review_pass     Fri Mar  6      pmiller\n                        14:55:17 1998\n        integrate_begin Fri Mar  6      pmiller\n                        14:55:20 1998\n        integrate_pass  Fri Mar  6      pmiller\n                        14:55:52 1998\n\n\n\nProject \"srecord.1.0\", Change 11                                 Page 1\nChange Details                                 Wed Nov  4 00:02:09 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 2, Change 11.\n\nSUMMARY\n        Add fundamental library classes.\n\nDESCRIPTION\n        This change adds the fundamental library classes.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  config\n        source  modify    1.1 -> 1.2  etc/Howto.cook\n        source  create    1.1         etc/documentation.cook\n        source  create    1.1         etc/template/man\n        source  create    1.1         include/arglex.h\n        source  create    1.1         include/srec/input.h\n        source  create    1.1         include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/srecord.h\n        source  create    1.1         include/srec/output.h\n        source  create    1.1         include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/\n                                      srecord.h\n        source  create    1.1         include/srec/record.h\n        source  create    1.1         lib/common/arglex.cc\n        source  create    1.1         lib/srec/input.cc\n        source  create    1.1         lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/srecord.cc\n        source  create    1.1         lib/srec/output.cc\n        source  create    1.1         lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/srecord.cc\n        source  create    1.1         lib/srec/record.cc\n        source  create    1.1         man/man1/srec_cat.1\n        source  create    1.1         man/man1/z_copyright.so\n        source  create    1.1         man/man1/z_exit.so\n        source  create    1.1         man/man1/z_options.so\n        source  create    1.1         prog/srec_cat/main.cc\n        test    create    1.1         test/00/t0001a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Mar  6      pmiller\n                        14:57:57 1998\n        develop_begin   Fri Mar  6      pmiller  Elapsed time: 1.934\n                        14:58:00 1998            days.\n        develop_end     Sat Mar  7      pmiller\n                        21:58:31 1998\n\n\n\nProject \"srecord.1.0\", Change 11                                 Page 2\nChange Details                                 Wed Nov  4 00:02:09 1998\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        review_pass     Sat Mar  7      pmiller\n                        21:58:34 1998\n        integrate_begin Sat Mar  7      pmiller\n                        21:58:39 1998\n        integrate_pass  Sat Mar  7      pmiller\n                        21:59:29 1998\n\n\n\nProject \"srecord.1.0\", Change 12                                 Page 1\nChange Details                                 Wed Nov  4 00:02:09 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 3, Change 12.\n\nSUMMARY\n        memory store\n\nDESCRIPTION\n        This change adds a memory store for grouping.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/template/h\n        source  create    1.1         include/srec/memory.h\n        source  create    1.1         include/srec/memory/chunk.h\n        source  create    1.1         include/srec/memory/walker.h\n        source  create    1.1         include/srec/memory/walker/\n                                      writer.h\n        source  modify    1.1 -> 1.2  include/srec/record.h\n        source  create    1.1         lib/srec/memory.cc\n        source  create    1.1         lib/srec/memory/chunk.cc\n        source  create    1.1         lib/srec/memory/walker.cc\n        source  create    1.1         lib/srec/memory/walker/writer.cc\n        source  modify    1.1 -> 1.2  prog/srec_cat/main.cc\n        test    modify    1.1 -> 1.2  test/00/t0001a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Mar  7      pmiller\n                        22:02:27 1998\n        develop_begin   Sat Mar  7      pmiller  Elapsed time: 1.000\n                        22:02:30 1998            days.\n        develop_end     Sun Mar  8      pmiller\n                        21:10:11 1998\n        review_pass     Sun Mar  8      pmiller\n                        21:10:14 1998\n        integrate_begin Sun Mar  8      pmiller\n                        21:10:16 1998\n        integrate_pass  Sun Mar  8      pmiller\n                        21:11:14 1998\n\n\n\nProject \"srecord.1.0\", Change 13                                 Page 1\nChange Details                                 Wed Nov  4 00:02:09 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 4, Change 13.\n\nSUMMARY\n        srec_cmp\n\nDESCRIPTION\n        This change adds the srec_cmp command, used to compare srec\n        files.  It is not sufficient to use cmp(1) or diff(1), because\n        the record boundaries are arbitrary.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  include/srec/memory.h\n        source  modify    1.1 -> 1.2  lib/srec/memory.cc\n        source  create    1.1         man/man1/srec_cmp.1\n        source  modify    1.2 -> 1.3  prog/srec_cat/main.cc\n        source  create    1.1         prog/srec_cmp/main.cc\n        test    create    1.1         test/00/t0002a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Mar  8      pmiller\n                        21:14:01 1998\n        develop_begin   Sun Mar  8      pmiller  Elapsed time: 0.072\n                        21:14:04 1998            days.\n        develop_end     Sun Mar  8      pmiller\n                        21:46:15 1998\n        review_pass     Sun Mar  8      pmiller\n                        21:46:54 1998\n        integrate_begin Sun Mar  8      pmiller\n                        21:47:00 1998\n        integrate_pass  Sun Mar  8      pmiller\n                        21:48:34 1998\n\n\n\nProject \"srecord.1.0\", Change 14                                 Page 1\nChange Details                                 Wed Nov  4 00:02:09 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 5, Change 14.\n\nSUMMARY\n        add intel format\n\nDESCRIPTION\n        1. This change adds the intel hex format for input and output.\n        2. This change adds the offset filter.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/documentation.cook\n        source  create    1.1         include/srec/arglex.h\n        source  modify    1.1 -> 1.2  include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/intel.h\n        source  create    1.1         include/srec/input/filter.h\n        source  create    1.1         include/srec/input/filter/\n                                      offset.h\n        source  modify    1.1 -> 1.2  include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/intel.h\n        source  create    1.1         lib/srec/arglex.cc\n        source  modify    1.1 -> 1.2  lib/srec/input.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/intel.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/srecord.cc\n        source  create    1.1         lib/srec/input/filter.cc\n        source  create    1.1         lib/srec/input/filter/offset.cc\n        source  modify    1.1 -> 1.2  lib/srec/output.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/intel.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file/srecord.cc\n        source  create    1.1         man/man1/o_input.so\n        source  modify    1.1 -> 1.2  man/man1/srec_cat.1\n        source  modify    1.1 -> 1.2  man/man1/srec_cmp.1\n        source  modify    1.3 -> 1.4  prog/srec_cat/main.cc\n        source  modify    1.1 -> 1.2  prog/srec_cmp/main.cc\n        test    create    1.1         test/00/t0003a.sh\n        test    create    1.1         test/00/t0004a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Mar  8      pmiller\n                        21:52:11 1998\n        develop_begin   Sun Mar  8      pmiller  Elapsed time: 2.000\n                        21:52:14 1998            days.\n        develop_end     Tue Mar 10      pmiller\n\n\n\nProject \"srecord.1.0\", Change 14                                 Page 2\nChange Details                                 Wed Nov  4 00:02:09 1998\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n                        13:15:39 1998\n        review_pass     Tue Mar 10      pmiller\n                        13:15:45 1998\n        integrate_begin Tue Mar 10      pmiller\n                        13:15:48 1998\n        integrate_pass  Tue Mar 10      pmiller\n                        13:17:06 1998\n\n\n\nProject \"srecord.1.0\", Change 15                                 Page 1\nChange Details                                 Wed Nov  4 00:02:09 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 6, Change 15.\n\nSUMMARY\n        add binary file type\n\nDESCRIPTION\n        This change adds the binary file type.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/binary.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/intel.h\n        source  modify    1.2 -> 1.3  include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/binary.h\n        source  modify    1.1 -> 1.2  lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/file/binary.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/intel.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/binary.cc\n        source  modify    1.1 -> 1.2  man/man1/o_input.so\n        test    create    1.1         test/00/t0005a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Mar 10      pmiller\n                        13:18:06 1998\n        develop_begin   Tue Mar 10      pmiller  Elapsed time: 0.067\n                        13:18:10 1998            days.\n        develop_end     Tue Mar 10      pmiller\n                        13:48:06 1998\n        review_pass     Tue Mar 10      pmiller\n                        13:48:09 1998\n        integrate_begin Tue Mar 10      pmiller\n                        13:48:11 1998\n        integrate_pass  Tue Mar 10      pmiller\n                        13:50:22 1998\n\n\n\nProject \"srecord.1.0\", Change 16                                 Page 1\nChange Details                                 Wed Nov  4 00:02:10 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 8, Change 16.\n\nSUMMARY\n        add crop filter\n\nDESCRIPTION\n        This change adds the crop filter, to remove portions of a file.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.3 -> 1.4  etc/Howto.cook\n        source  modify    1.2 -> 1.3  include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/crop.h\n        source  modify    1.2 -> 1.3  lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/crop.cc\n        source  modify    1.2 -> 1.3  man/man1/o_input.so\n        test    create    1.1         test/00/t0006a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Mar 10      pmiller\n                        13:52:09 1998\n        develop_begin   Tue Mar 10      pmiller  Elapsed time: 1.000\n                        13:52:12 1998            days.\n        develop_end     Tue Mar 10      pmiller\n                        22:08:25 1998\n        review_pass     Tue Mar 10      pmiller\n                        22:09:32 1998\n        integrate_begin Tue Mar 10      pmiller\n                        22:09:34 1998\n        integrate_pass  Tue Mar 10      pmiller\n                        22:11:43 1998\n\n\n\nProject \"srecord.1.0\", Change 17                                 Page 1\nChange Details                                 Wed Nov  4 00:02:10 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 7, Change 17.\n\nSUMMARY\n        test leave junk behind\n\nDESCRIPTION\n        This change corrects a problem where the tests were leaving\n        their working directory behind.\n\n        This change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/Howto.cook\n        source  modify    1.1 -> 1.2  etc/template/test\n        test    modify    1.2 -> 1.3  test/00/t0001a.sh\n        test    modify    1.1 -> 1.2  test/00/t0002a.sh\n        test    modify    1.1 -> 1.2  test/00/t0003a.sh\n        test    modify    1.1 -> 1.2  test/00/t0004a.sh\n        test    modify    1.1 -> 1.2  test/00/t0005a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Mar 10      pmiller\n                        21:55:54 1998\n        develop_begin   Tue Mar 10      pmiller\n                        21:55:58 1998\n        develop_end     Tue Mar 10      pmiller\n                        22:01:17 1998\n        review_pass     Tue Mar 10      pmiller\n                        22:01:25 1998\n        integrate_begin Tue Mar 10      pmiller\n                        22:01:28 1998\n        integrate_pass  Tue Mar 10      pmiller\n                        22:01:50 1998\n\n\n\nProject \"srecord.1.0\", Change 18                                 Page 1\nChange Details                                 Wed Nov  4 00:02:10 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 10, Change 18.\n\nSUMMARY\n        add exclude filter\n\nDESCRIPTION\n        This change adds the exclude filter, the opposite of the crop\n        filter.\n\n        This change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.3 -> 1.4  config\n        source  modify    1.5 -> 1.6  etc/Howto.cook\n        source  modify    1.2 -> 1.3  etc/documentation.cook\n        source  create    1.1         include/interval.h\n        source  modify    1.3 -> 1.4  include/srec/arglex.h\n        source  modify    1.1 -> 1.2  include/srec/input/filter/crop.h\n        source  create    1.1         lib/common/interval.cc\n        source  modify    1.3 -> 1.4  lib/srec/arglex.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/file.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/filter/crop.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file.cc\n        source  modify    1.3 -> 1.4  man/man1/o_input.so\n        test    modify    1.1 -> 1.2  test/00/t0006a.sh\n        test    create    1.1         test/00/t0007a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Mar 10      pmiller\n                        22:15:27 1998\n        develop_begin   Tue Mar 10      pmiller  Elapsed time: 4.000\n                        22:15:34 1998            days.\n        develop_end     Sun Mar 15      pmiller\n                        09:50:22 1998\n        review_pass     Sun Mar 15      pmiller\n                        09:50:31 1998\n        integrate_begin Sun Mar 15      pmiller\n                        09:50:34 1998\n        integrate_pass  Sun Mar 15      pmiller\n                        09:51:44 1998\n\n\n\nProject \"srecord.1.0\", Change 19                                 Page 1\nChange Details                                 Wed Nov  4 00:02:10 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 9, Change 19.\n\nSUMMARY\n        add Makefile and RPM spec file\n\nDESCRIPTION\n        This change s the first round in preparing the code for\n        release.         It constructs a Makefile, a tar file, and an\n        RPM spec file.  RPM package build s are supported, but are not\n        an integration build target, because they take so long.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  config\n        source  create    1.1         etc/Howto.conf.in\n        source  modify    1.4 -> 1.5  etc/Howto.cook\n        source  create    1.1         etc/Makefile.awk\n        source  create    1.1         etc/Makefile.file.sh\n        source  create    1.1         etc/Makefile.head\n        source  create    1.1         etc/Makefile.sh\n        source  create    1.1         etc/README.man\n        source  create    1.1         etc/archive.cook\n        source  create    1.1         etc/autoconf.cook\n        source  create    1.1         etc/config.h.in.body\n        source  create    1.1         etc/config.h.in.head\n        source  create    1.1         etc/config.h.in.tail\n        source  create    1.1         etc/configure.in\n        source  create    1.1         etc/rpm-build.sh\n        source  create    1.1         etc/spec.sh\n        source  create    1.1         lib/common/versn_stamp.cc\n        source  create    1.1         lib/common/versn_stamp.h\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Mar 11      pmiller\n                        16:41:21 1998\n        develop_begin   Wed Mar 11      pmiller  Elapsed time: 2.000\n                        16:41:24 1998            days.\n        develop_end     Fri Mar 13      pmiller\n                        12:07:21 1998\n        review_pass     Fri Mar 13      pmiller\n                        12:08:11 1998\n\n\n\nProject \"srecord.1.0\", Change 19                                 Page 2\nChange Details                                 Wed Nov  4 00:02:10 1998\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_begin Fri Mar 13      pmiller\n                        12:08:15 1998\n        integrate_pass  Fri Mar 13      pmiller\n                        12:09:49 1998\n\n\n\nProject \"srecord.1.0\", Change 20                                 Page 1\nChange Details                                 Wed Nov  4 00:02:10 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 11, Change 20.\n\nSUMMARY\n        more release preparation\n\nDESCRIPTION\n        1. This change refines the description in the README file.\n        2. This change refines the description in the spec file.\n        3. This change adds an LSM file and a HTML home page with icon\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/README.man\n        source  modify    1.1 -> 1.2  etc/archive.cook\n        source  modify    1.1 -> 1.2  etc/spec.sh\n        source  create    1.1         etc/srecord.gif.uue\n        source  create    1.1         etc/srecord.html\n        source  create    1.1         etc/srecord.lsm\n        source  create    1.1         etc/ssp.awk\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Mar 13      pmiller\n                        12:23:05 1998\n        develop_begin   Fri Mar 13      pmiller  Elapsed time: 1.439\n                        12:23:09 1998            days.\n        develop_end     Sun Mar 15      pmiller\n                        15:40:42 1998\n        review_pass     Sun Mar 15      pmiller\n                        15:40:47 1998\n        integrate_begin Sun Mar 15      pmiller\n                        15:40:49 1998\n        integrate_pass  Sun Mar 15      pmiller\n                        15:41:54 1998\n\n\n\nProject \"srecord.1.0\", Change 21                                 Page 1\nChange Details                                 Wed Nov  4 00:02:11 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 12, Change 21.\n\nSUMMARY\n        add fill filter\n\nDESCRIPTION\n        This change adds the fill filter, to fill hols in the input\n        files.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  include/interval.h\n        source  modify    1.4 -> 1.5  include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/fill.h\n        source  create    1.1         include/srecord/input/filter/\n                                      fill.h\n        source  modify    1.1 -> 1.2  lib/common/interval.cc\n        source  modify    1.4 -> 1.5  lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/fill.cc\n        source  modify    1.4 -> 1.5  man/man1/o_input.so\n        test    create    1.1         test/00/t0008a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Mar 15      pmiller\n                        15:42:48 1998\n        develop_begin   Sun Mar 15      pmiller  Elapsed time: 0.306\n                        15:42:52 1998            days.\n        develop_end     Sun Mar 15      pmiller\n                        18:00:28 1998\n        review_pass     Sun Mar 15      pmiller\n                        18:00:32 1998\n        integrate_begin Sun Mar 15      pmiller\n                        18:00:35 1998\n        integrate_pass  Sun Mar 15      pmiller\n                        18:01:57 1998\n\n\n\nProject \"srecord.1.0\", Change 22                                 Page 1\nChange Details                                 Wed Nov  4 00:02:11 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 13, Change 22.\n\nSUMMARY\n        length filter\n\nDESCRIPTION\n        This change adds the length filter.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/README.man\n        source  modify    1.2 -> 1.3  etc/spec.sh\n        source  modify    1.1 -> 1.2  etc/srecord.html\n        source  modify    1.1 -> 1.2  etc/srecord.lsm\n        source  modify    1.5 -> 1.6  include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/\n                                      length.h\n        source  modify    1.2 -> 1.3  include/srec/record.h\n        source  modify    1.5 -> 1.6  lib/srec/arglex.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/filter/fill.cc\n        source  create    1.1         lib/srec/input/filter/length.cc\n        source  modify    1.1 -> 1.2  lib/srec/record.cc\n        source  modify    1.5 -> 1.6  man/man1/o_input.so\n        test    create    1.1         test/00/t0009a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Mar 15      pmiller\n                        18:03:56 1998\n        develop_begin   Sun Mar 15      pmiller  Elapsed time: 0.599\n                        18:04:01 1998            days.\n        develop_end     Sun Mar 15      pmiller\n                        22:33:43 1998\n        review_pass     Sun Mar 15      pmiller\n                        22:35:47 1998\n        integrate_begin Sun Mar 15      pmiller\n                        22:35:52 1998\n        integrate_pass  Sun Mar 15      pmiller\n                        22:39:55 1998\n\n\n\nProject \"srecord.1.0\", Change 23                                 Page 1\nChange Details                                 Wed Nov  4 00:02:11 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 14, Change 23.\n\nSUMMARY\n        add C output format\n\nDESCRIPTION\n        1. This change adds the C output filter.         This allows a\n        C source file containing an array initialized with the input\n        data.\n        2. This change adds the -over and -within address range\n        specifiers.\n        3. This change adds a variety of examples to the man pages.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.3 -> 1.4  etc/README.man\n        source  modify    1.3 -> 1.4  etc/spec.sh\n        source  modify    1.2 -> 1.3  etc/srecord.html\n        source  modify    1.2 -> 1.3  etc/srecord.lsm\n        source  modify    1.6 -> 1.7  include/srec/arglex.h\n        source  create    1.1         include/srec/input/interval.h\n        source  modify    1.2 -> 1.3  include/srec/memory.h\n        source  modify    1.3 -> 1.4  include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/c.h\n        source  modify    1.6 -> 1.7  lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/interval.cc\n        source  modify    1.2 -> 1.3  lib/srec/memory.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/c.cc\n        source  modify    1.6 -> 1.7  man/man1/o_input.so\n        source  modify    1.2 -> 1.3  man/man1/srec_cat.1\n        source  modify    1.2 -> 1.3  man/man1/srec_cmp.1\n        source  modify    1.4 -> 1.5  prog/srec_cat/main.cc\n        test    create    1.1         test/00/t0010a.sh\n        test    create    1.1         test/00/t0011a.sh\n        test    create    1.1         test/00/t0012a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Mar 15      pmiller\n                        22:45:50 1998\n        develop_begin   Sun Mar 15      pmiller  Elapsed time: 1.000\n                        22:45:53 1998            days.\n        develop_end     Mon Mar 16      pmiller\n                        17:11:08 1998\n        review_pass     Mon Mar 16      pmiller\n\n\n\nProject \"srecord.1.0\", Change 23                                 Page 2\nChange Details                                 Wed Nov  4 00:02:11 1998\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n                        17:11:12 1998\n        integrate_begin Mon Mar 16      pmiller\n                        17:11:21 1998\n        integrate_pass  Mon Mar 16      pmiller\n                        17:12:45 1998\n\n\n\nProject \"srecord.1.0\", Change 24                                 Page 1\nChange Details                                 Wed Nov  4 00:02:11 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 17, Change 24.\n\nSUMMARY\n        add checksum filter\n\nDESCRIPTION\n        This change adds a checksum filter, to insert checksums into\n        the data.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.7 -> 1.8  include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/\n                                      checksum.h\n        source  modify    1.7 -> 1.8  lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/checksum.cc\n        source  modify    1.7 -> 1.8  man/man1/o_input.so\n        test    create    1.1         test/00/t0013a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Mar 16      pmiller\n                        17:13:50 1998\n        develop_begin   Mon Mar 16      pmiller  Elapsed time: 5.525\n                        17:13:52 1998            days.\n        develop_end     Sat Mar 21      pmiller\n                        21:10:02 1998\n        review_pass     Sat Mar 21      pmiller\n                        21:10:05 1998\n        integrate_begin Sat Mar 21      pmiller\n                        21:10:33 1998\n        integrate_pass  Sat Mar 21      pmiller\n                        21:12:16 1998\n\n\n\nProject \"srecord.1.0\", Change 25                                 Page 1\nChange Details                                 Wed Nov  4 00:02:11 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 15, Change 25.\n\nSUMMARY\n        add help and version options\n\nDESCRIPTION\n        This change adds help and version options to all of the\n        commands.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/archive.cook\n        source  modify    1.1 -> 1.2  include/arglex.h\n        source  create    1.1         include/progname.h\n        source  modify    1.1 -> 1.2  lib/common/arglex.cc\n        source  create    1.1         lib/common/progname.cc\n        source  create    1.1         man/man1/srec_license.1\n        source  modify    1.1 -> 1.2  man/man1/z_copyright.so\n        source  modify    1.5 -> 1.6  prog/srec_cat/main.cc\n        source  modify    1.2 -> 1.3  prog/srec_cmp/main.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Mar 17      pmiller\n                        06:36:10 1998\n        develop_begin   Tue Mar 17      pmiller  Elapsed time: 3.452\n                        06:36:23 1998            days.\n        develop_end     Fri Mar 20      pmiller  Elapsed time: 0.312\n                        09:59:42 1998            days.\n        review_pass     Fri Mar 20      pmiller\n                        12:20:00 1998\n        integrate_begin Fri Mar 20      pmiller\n                        12:20:08 1998\n        integrate_pass  Fri Mar 20      pmiller\n                        12:22:28 1998\n\n\n\nProject \"srecord.1.0\", Change 26                                 Page 1\nChange Details                                 Wed Nov  4 00:02:11 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 16, Change 26.\n\nSUMMARY\n        srec_info\n\nDESCRIPTION\n        This change adds the srec_info command, use to obtain\n        information about data files.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         man/man1/srec_info.1\n        source  create    1.1         prog/srec_info/main.cc\n        test    create    1.1         test/00/t0014a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Mar 17      pmiller\n                        06:36:55 1998\n        develop_begin   Tue Mar 17      pmiller  Elapsed time: 4.000\n                        06:37:04 1998            days.\n        develop_end     Sat Mar 21      pmiller\n                        20:51:45 1998\n        review_pass     Sat Mar 21      pmiller\n                        20:51:49 1998\n        integrate_begin Sat Mar 21      pmiller\n                        20:51:52 1998\n        integrate_pass  Sat Mar 21      pmiller\n                        20:53:07 1998\n\n\n\nProject \"srecord.1.0\", Change 27                                 Page 1\nChange Details                                 Wed Nov  4 00:02:12 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 18, Change 27.\n\nSUMMARY\n        add minimum and maximum filters\n\nDESCRIPTION\n        Thsi change adds the minimum and maximum filters.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.8 -> 1.9  include/srec/arglex.h\n        source  modify    1.1 -> 1.2  include/srec/input/filter/\n                                      length.h\n        source  create    1.1         include/srec/input/filter/\n                                      maximum.h\n        source  create    1.1         include/srec/input/filter/\n                                      minimum.h\n        source  modify    1.3 -> 1.4  include/srec/record.h\n        source  modify    1.8 -> 1.9  lib/srec/arglex.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/filter/length.cc\n        source  create    1.1         lib/srec/input/filter/maximum.cc\n        source  create    1.1         lib/srec/input/filter/minimum.cc\n        source  modify    1.8 -> 1.9  man/man1/o_input.so\n        test    create    1.1         test/00/t0015a.sh\n        test    create    1.1         test/00/t0016a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Mar 21      pmiller\n                        21:14:24 1998\n        develop_begin   Sat Mar 21      pmiller  Elapsed time: 0.225\n                        21:14:28 1998            days.\n        develop_end     Sat Mar 21      pmiller\n                        22:55:33 1998\n        review_pass     Sat Mar 21      pmiller\n                        22:55:36 1998\n        integrate_begin Sat Mar 21      pmiller\n                        22:55:39 1998\n        integrate_pass  Sat Mar 21      pmiller\n                        23:00:11 1998\n\n\n\nProject \"srecord.1.0\", Change 28                                 Page 1\nChange Details                                 Wed Nov  4 00:02:12 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 19, Change 28.\n\nSUMMARY\n        add file manifest\n\nDESCRIPTION\n        This change adds a file manifest to the distribution set.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/BUILDING.man\n        source  create    1.1         etc/MANIFEST.head\n        source  create    1.1         etc/MANIFEST.sh\n        source  modify    1.4 -> 1.5  etc/README.man\n        source  modify    1.3 -> 1.4  etc/archive.cook\n        source  modify    1.4 -> 1.5  etc/spec.sh\n        source  modify    1.3 -> 1.4  etc/srecord.html\n        source  modify    1.3 -> 1.4  etc/srecord.lsm\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Mar 21      pmiller\n                        23:07:04 1998\n        develop_begin   Sat Mar 21      pmiller  Elapsed time: 1.000\n                        23:07:09 1998            days.\n        develop_end     Sun Mar 22      pmiller\n                        09:01:43 1998\n        review_pass     Sun Mar 22      pmiller\n                        09:01:47 1998\n        integrate_begin Sun Mar 22      pmiller\n                        09:01:50 1998\n        integrate_pass  Sun Mar 22      pmiller\n                        09:03:34 1998\n\n\n\nProject \"srecord.1.0\", Change 29                                 Page 1\nChange Details                                 Wed Nov  4 00:02:12 1998\n\nNAME\n        Project \"srecord.1.0\", Delta 20, Change 29.\n\nSUMMARY\n        more flexible input\n\nDESCRIPTION\n        This change makes the input formts more generous about garbage\n        lines on input.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  include/srec/input.h\n        source  modify    1.2 -> 1.3  include/srec/input/file.h\n        source  modify    1.2 -> 1.3  include/srec/input/file/intel.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/srecord.h\n        source  modify    1.1 -> 1.2  include/srec/input/filter.h\n        source  modify    1.2 -> 1.3  lib/common/interval.cc\n        source  modify    1.9 -> 1.10 lib/srec/arglex.cc\n        source  modify    1.2 -> 1.3  lib/srec/input.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/file.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/file/intel.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/file/srecord.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/filter.cc\n        test    create    1.1         test/00/t0017a.sh\n        test    create    1.1         test/00/t0018a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Mar 22      pmiller\n                        09:41:20 1998\n        develop_begin   Sun Mar 22      pmiller  Elapsed time: 0.156\n                        09:41:24 1998            days.\n        develop_end     Sun Mar 22      pmiller\n                        10:51:37 1998\n        review_pass     Sun Mar 22      pmiller\n                        10:53:00 1998\n        integrate_begin Sun Mar 22      pmiller\n                        10:53:03 1998\n        integrate_pass  Sun Mar 22      pmiller\n                        10:55:06 1998\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.1.txt",
    "content": "\n\n\nProject \"srecord.1.1\"                                            Page 1\nList of Changes                                Wed Nov  4 22:10:16 1998\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       change sunsite directory\n  12    completed       file format manuals\n  13    completed       tektronix file format\n  14    completed       reference manual\n  15    completed       complete intel format\n  16    completed       tektronix, again\n  17    completed       installation build\n  18    completed       split filter\n  19    completed       unplit filter\n\n\n\nProject \"srecord.1.1\", Change 10                                 Page 1\nChange Details                                 Wed Nov  4 22:10:16 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change tidies up loose ends (and cranks on the version\n        number) in preparation for release.\n\n        This change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.5 -> 1.6  etc/archive.cook\n        test    modify    1.2 -> 1.3  test/00/t0018a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Mar 22      pmiller\n                        12:02:50 1998\n        develop_begin   Sun Mar 22      pmiller  Elapsed time: 0.047\n                        12:02:53 1998            days.\n        develop_end     Sun Mar 22      pmiller\n                        12:23:54 1998\n        review_pass     Sun Mar 22      pmiller\n                        12:24:00 1998\n        integrate_begin Sun Mar 22      pmiller\n                        12:24:08 1998\n        integrate_fail  Sun Mar 22      pmiller  need to shallow\n                        12:25:35 1998            archive targets\n                                                 Elapsed time: 0.022\n                                                 days.\n        develop_end     Sun Mar 22      pmiller\n                        12:35:37 1998\n        review_pass     Sun Mar 22      pmiller\n                        12:36:23 1998\n        integrate_begin Sun Mar 22      pmiller\n                        12:37:12 1998\n        integrate_fail  Sun Mar 22      pmiller  rsolve missing\n                        12:39:47 1998\n        develop_end     Sun Mar 22      pmiller\n                        12:43:35 1998\n        review_pass     Sun Mar 22      pmiller\n                        12:43:44 1998\n        integrate_begin Sun Mar 22      pmiller\n                        12:43:49 1998\n\n\n\nProject \"srecord.1.1\", Change 10                                 Page 2\nChange Details                                 Wed Nov  4 22:10:16 1998\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_pass  Sun Mar 22      pmiller\n                        12:47:34 1998\n\n\n\nProject \"srecord.1.1\", Change 11                                 Page 1\nChange Details                                 Wed Nov  4 22:10:16 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 2, Change 11.\n\nSUMMARY\n        change sunsite directory\n\nDESCRIPTION\n        This change updates the LSM, etc, to reflect where the\n        SunSite.unc maintainers chose to put the software.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.6 -> 1.7  etc/README.man\n        source  modify    1.5 -> 1.6  etc/srecord.html\n        source  modify    1.5 -> 1.6  etc/srecord.lsm\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Mar 26      pmiller\n                        09:59:42 1998\n        develop_begin   Thu Mar 26      pmiller\n                        09:59:45 1998\n        develop_end     Thu Mar 26      pmiller\n                        10:06:56 1998\n        review_pass     Thu Mar 26      pmiller\n                        10:07:00 1998\n        integrate_begin Thu Mar 26      pmiller\n                        10:07:03 1998\n        integrate_pass  Thu Mar 26      pmiller\n                        10:07:52 1998\n\n\n\nProject \"srecord.1.1\", Change 12                                 Page 1\nChange Details                                 Wed Nov  4 22:10:16 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 3, Change 12.\n\nSUMMARY\n        file format manuals\n\nDESCRIPTION\n        This change adds file format man pages.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/Makefile.sh\n        source  create    1.1         man/man5/srec_intel.5\n        source  create    1.1         man/man5/srec_motorola.5\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Jun 29      pmiller\n                        08:55:11 1998\n        develop_begin   Mon Jun 29      pmiller  Elapsed time: 0.230\n                        08:55:15 1998            days.\n        develop_end     Mon Jun 29      pmiller\n                        10:38:52 1998\n        review_pass     Mon Jun 29      pmiller\n                        10:38:55 1998\n        integrate_begin Mon Jun 29      pmiller\n                        10:38:57 1998\n        integrate_pass  Mon Jun 29      pmiller\n                        10:39:49 1998\n\n\n\nProject \"srecord.1.1\", Change 13                                 Page 1\nChange Details                                 Wed Nov  4 22:10:17 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 5, Change 13.\n\nSUMMARY\n        tektronix file format\n\nDESCRIPTION\n        This change adds reading and writing of the Tektronix hex file\n        format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.8 -> 1.9  etc/README.man\n        source  modify    1.7 -> 1.8  etc/srecord.html\n        source  modify    1.6 -> 1.7  etc/srecord.lsm\n        source  modify   1.10 -> 1.11 include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/\n                                      tektronix.h\n        source  create    1.1         include/srec/output/file/\n                                      tektronix.h\n        source  modify   1.11 -> 1.12 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/file/tektronix.cc\n        source  create    1.1         lib/srec/output/file/tektronix.cc\n        source  modify   1.11 -> 1.12 man/man1/o_input.so\n        source  create    1.1         man/man5/srec_tektronix.5\n        test    create    1.1         test/00/t0019a.sh\n        test    create    1.1         test/00/t0020a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Oct 30      pmiller\n                        17:42:39 1998\n        develop_begin   Fri Oct 30      pmiller  Elapsed time: 0.795\n                        17:42:41 1998            days.\n        develop_end     Fri Oct 30      pmiller\n                        23:40:27 1998\n        review_pass     Fri Oct 30      pmiller\n                        23:40:30 1998\n        integrate_begin Fri Oct 30      pmiller\n                        23:40:32 1998\n        integrate_pass  Fri Oct 30      pmiller\n                        23:42:06 1998\n\n\n\nProject \"srecord.1.1\", Change 14                                 Page 1\nChange Details                                 Wed Nov  4 22:10:17 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 4, Change 14.\n\nSUMMARY\n        reference manual\n\nDESCRIPTION\n        This change adds a reference manual, constructed from the\n        readme and building files, and the manual pages.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/BUILDING.man\n        source  modify    1.7 -> 1.8  etc/Howto.cook\n        source  modify    1.7 -> 1.8  etc/README.man\n        source  modify    1.6 -> 1.7  etc/archive.cook\n        source  modify    1.4 -> 1.5  etc/documentation.cook\n        source  create    1.1         etc/ref-ptx.ignore\n        source  create    1.1         etc/ref-ptx.sh\n        source  create    1.1         etc/ref-ptx1.awk\n        source  create    1.1         etc/ref-ptx2.awk\n        source  create    1.1         etc/ref-toc.so\n        source  create    1.1         etc/reference.man\n        source  modify    1.6 -> 1.7  etc/srecord.html\n        source  modify   1.10 -> 1.11 man/man1/o_input.so\n        source  modify    1.4 -> 1.5  man/man1/srec_cat.1\n        source  modify    1.4 -> 1.5  man/man1/srec_cmp.1\n        source  modify    1.2 -> 1.3  man/man1/srec_info.1\n        source  modify    1.2 -> 1.3  man/man1/srec_license.1\n        source  modify    1.1 -> 1.2  man/man5/srec_intel.5\n        source  modify    1.1 -> 1.2  man/man5/srec_motorola.5\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Oct 30      pmiller\n                        23:03:09 1998\n        develop_begin   Fri Oct 30      pmiller  Elapsed time: 0.058\n                        23:03:09 1998            days.\n        develop_end     Fri Oct 30      pmiller\n                        23:29:20 1998\n        review_pass     Fri Oct 30      pmiller\n                        23:29:23 1998\n        integrate_begin Fri Oct 30      pmiller\n\n\n\nProject \"srecord.1.1\", Change 14                                 Page 2\nChange Details                                 Wed Nov  4 22:10:17 1998\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n                        23:29:26 1998\n        integrate_pass  Fri Oct 30      pmiller\n                        23:30:52 1998\n\n\n\nProject \"srecord.1.1\", Change 15                                 Page 1\nChange Details                                 Wed Nov  4 22:10:17 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 6, Change 15.\n\nSUMMARY\n        complete intel format\n\nDESCRIPTION\n        This change completes the support for Intel mode.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.4 -> 1.5  include/srec/input/file.h\n        source  modify    1.4 -> 1.5  include/srec/input/file/intel.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/intel.h\n        source  modify    1.5 -> 1.6  lib/srec/input/file.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/file/intel.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/intel.cc\n        source  modify    1.2 -> 1.3  man/man5/srec_intel.5\n        test    modify    1.3 -> 1.4  test/00/t0003a.sh\n        test    modify    1.2 -> 1.3  test/00/t0007a.sh\n        test    create    1.1         test/00/t0021a.sh\n        test    create    1.1         test/00/t0022a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Oct 31      pmiller\n                        23:03:07 1998\n        develop_begin   Sat Oct 31      pmiller  Elapsed time: 1.000\n                        23:03:10 1998            days.\n        develop_end     Sun Nov  1      pmiller\n                        12:09:38 1998\n        review_pass     Sun Nov  1      pmiller\n                        12:09:41 1998\n        integrate_begin Sun Nov  1      pmiller\n                        12:09:46 1998\n        integrate_pass  Sun Nov  1      pmiller\n                        12:11:49 1998\n\n\n\nProject \"srecord.1.1\", Change 16                                 Page 1\nChange Details                                 Wed Nov  4 22:10:17 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 7, Change 16.\n\nSUMMARY\n        tektronix, again\n\nDESCRIPTION\n        This change adds support for Tektronix abort records.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  lib/srec/input/file/tektronix.cc\n        test    create    1.1         test/00/t0023a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Nov  1      pmiller\n                        23:47:52 1998\n        develop_begin   Sun Nov  1      pmiller  Elapsed time: 0.032\n                        23:47:57 1998            days.\n        develop_end     Mon Nov  2      pmiller\n                        00:02:31 1998\n        review_pass     Mon Nov  2      pmiller\n                        00:02:35 1998\n        integrate_begin Mon Nov  2      pmiller\n                        00:02:37 1998\n        integrate_pass  Mon Nov  2      pmiller\n                        00:03:50 1998\n\n\n\nProject \"srecord.1.1\", Change 17                                 Page 1\nChange Details                                 Wed Nov  4 22:10:17 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 9, Change 17.\n\nSUMMARY\n        installation build\n\nDESCRIPTION\n        This change updates the installation build to include the\n        reference manual.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.3 -> 1.4  etc/BUILDING.man\n        source  create    1.1         etc/CHANGES.1.0\n        source  create    1.1         etc/CHANGES.sh\n        source  modify    1.8 -> 1.9  etc/Howto.cook\n        source  modify    1.2 -> 1.3  etc/Makefile.file.sh\n        source  modify    1.2 -> 1.3  etc/Makefile.head\n        source  modify    1.3 -> 1.4  etc/Makefile.sh\n        source  modify   1.10 -> 1.11 etc/README.man\n        source  modify    1.7 -> 1.8  etc/archive.cook\n        source  modify    1.2 -> 1.3  etc/configure.in\n        source  modify    1.5 -> 1.6  etc/documentation.cook\n        source  create    1.1         etc/new.1.1.so\n        source  create    1.1         etc/new.sh\n        test    modify    1.4 -> 1.5  test/00/t0003a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Nov  2      pmiller\n                        13:16:51 1998\n        develop_begin   Mon Nov  2      pmiller  Elapsed time: 2.000\n                        13:19:28 1998            days.\n        develop_end     Wed Nov  4      pmiller  Elapsed time: 1.000\n                        00:31:29 1998            days.\n        review_pass     Wed Nov  4      pmiller\n                        14:49:26 1998\n        integrate_begin Wed Nov  4      pmiller\n                        14:49:29 1998\n        integrate_pass  Wed Nov  4      pmiller\n                        14:52:18 1998\n\n\n\nProject \"srecord.1.1\", Change 18                                 Page 1\nChange Details                                 Wed Nov  4 22:10:18 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 8, Change 18.\n\nSUMMARY\n        split filter\n\nDESCRIPTION\n        This change adds the split filter, for splitting wide eprom\n        images.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.9 -> 1.10 etc/README.man\n        source  modify    1.6 -> 1.7  etc/spec.sh\n        source  modify    1.8 -> 1.9  etc/srecord.html\n        source  modify   1.11 -> 1.12 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/split.h\n        source  modify   1.12 -> 1.13 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/split.cc\n        source  modify   1.12 -> 1.13 man/man1/o_input.so\n        source  modify    1.5 -> 1.6  man/man1/srec_cat.1\n        test    create    1.1         test/00/t0024a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Nov  2      pmiller\n                        16:24:14 1998\n        develop_begin   Mon Nov  2      pmiller  Elapsed time: 1.234\n                        16:24:17 1998            days.\n        develop_end     Tue Nov  3      pmiller\n                        18:09:33 1998\n        review_pass     Tue Nov  3      pmiller\n                        18:10:53 1998\n        integrate_begin Tue Nov  3      pmiller\n                        18:10:57 1998\n        integrate_pass  Tue Nov  3      pmiller\n                        18:12:52 1998\n\n\n\nProject \"srecord.1.1\", Change 19                                 Page 1\nChange Details                                 Wed Nov  4 22:10:18 1998\n\nNAME\n        Project \"srecord.1.1\", Delta 10, Change 19.\n\nSUMMARY\n        unplit filter\n\nDESCRIPTION\n        This change adds the --unsplit filter, used to do the reverse\n        of the --split filter\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.11 -> 1.12 etc/README.man\n        source  modify    1.1 -> 1.2  etc/new.1.1.so\n        source  modify    1.9 -> 1.10 etc/srecord.html\n        source  modify   1.12 -> 1.13 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/\n                                      unsplit.h\n        source  modify   1.13 -> 1.14 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/unsplit.cc\n        source  modify   1.13 -> 1.14 man/man1/o_input.so\n        source  modify    1.6 -> 1.7  man/man1/srec_cat.1\n        test    create    1.1         test/00/t0025a.sh\n        test    create    1.1         test/00/t0026a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Nov  4      pmiller\n                        17:43:34 1998\n        develop_begin   Wed Nov  4      pmiller  Elapsed time: 0.052\n                        17:43:40 1998            days.\n        develop_end     Wed Nov  4      pmiller\n                        18:07:06 1998\n        review_pass     Wed Nov  4      pmiller\n                        18:07:10 1998\n        integrate_begin Wed Nov  4      pmiller\n                        18:07:13 1998\n        integrate_      Wed Nov  4      pmiller\n        begin_undo      18:07:33 1998\n        develop_end_    Wed Nov  4      pmiller  Elapsed time: 0.026\n        undo            18:07:47 1998            days.\n        develop_end     Wed Nov  4      pmiller\n                        18:19:40 1998\n        review_pass     Wed Nov  4      pmiller\n                        18:19:40 1998\n        integrate_begin Wed Nov  4      pmiller\n                        18:19:43 1998\n\n\n\nProject \"srecord.1.1\", Change 19                                 Page 2\nChange Details                                 Wed Nov  4 22:10:18 1998\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_pass  Wed Nov  4      pmiller\n                        18:25:04 1998\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.10.txt",
    "content": "\n\n\nProject \"srecord.1.10\"                                            Page 1\nList of Changes                                 Mon Oct 21 21:08:47 2002\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       cygwin\n  12    completed       debian link\n  15    completed       vsnprintf\n  16    completed       Ohio Scientific format\n  17    completed       cope with GNU Autoconf changes\n\n\n\nProject \"srecord.1.10\", Change 10                                 Page 1\nChange Details                                  Mon Oct 21 21:08:47 2002\n\nNAME\n        Project \"srecord.1.10\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares SRecord for the next public release.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.9\n        source  create    1.1         etc/new.1.10.so\n        source  modify   1.11 -> 1.12 etc/new.1.8.so\n        source  modify    1.4 -> 1.5  etc/new.1.9.so\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Jun 14      pmiller\n                        09:09:29 2002\n        develop_begin   Fri Jun 14      pmiller\n                        09:09:30 2002\n        develop_end     Fri Jun 14      pmiller\n                        09:18:51 2002\n        review_pass     Fri Jun 14      pmiller\n                        09:18:53 2002\n        integrate_begin Fri Jun 14      pmiller\n                        09:18:55 2002\n        integrate_pass  Fri Jun 14      pmiller\n                        09:19:36 2002\n\n\n\nProject \"srecord.1.10\", Change 11                                 Page 1\nChange Details                                  Mon Oct 21 21:08:47 2002\n\nNAME\n        Project \"srecord.1.10\", Delta 2, Change 11.\n\nSUMMARY\n        cygwin\n\nDESCRIPTION\n        This change copes with some Cygwin build issues.\n\n        My thanks to Ian Ridley <iridley@btr-auto.aust.com> for\n        reporting this problem: \"use of vsnprintf & snprintf, these are\n        not defined in msvcrt, but _vsnprintf & _snprintf are defined\"\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.8 -> 1.9  etc/Makefile.head\n        source  modify    1.7 -> 1.8  etc/Makefile.sh\n        source  modify    1.2 -> 1.3  etc/config.h.in.tail\n        source  create    1.1         include/config.messy.h\n        source  modify   1.13 -> 1.14 lib/common/arglex.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Jul  9      pmiller\n                        14:33:16 2002\n        develop_begin   Tue Jul  9      pmiller  Elapsed time: 0.066\n                        14:33:16 2002            days.\n        develop_end     Tue Jul  9      pmiller\n                        15:02:53 2002\n        review_pass     Tue Jul  9      pmiller\n                        15:02:56 2002\n        integrate_begin Tue Jul  9      pmiller\n                        15:02:59 2002\n        integrate_pass  Tue Jul  9      pmiller\n                        15:03:57 2002\n\n\n\nProject \"srecord.1.10\", Change 12                                 Page 1\nChange Details                                  Mon Oct 21 21:08:47 2002\n\nNAME\n        Project \"srecord.1.10\", Delta 3, Change 12.\n\nSUMMARY\n        debian link\n\nDESCRIPTION\n        This change adds a link to the Debian page for SRecord.\n\n        My thanks to Stephen Moraco <stephen@debian.org>, who is the\n        Debian maintainer.\n\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_improvement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.37 -> 1.38 etc/srecord.html\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Jul 29      pmiller\n                        08:51:59 2002\n        develop_begin   Mon Jul 29      pmiller\n                        08:51:59 2002\n        develop_end     Mon Jul 29      pmiller  Elapsed time: 0.109\n                        08:56:33 2002            days.\n        review_pass     Mon Jul 29      pmiller\n                        09:45:44 2002\n        integrate_begin Mon Jul 29      pmiller\n                        09:45:46 2002\n        integrate_pass  Mon Jul 29      pmiller\n                        09:46:22 2002\n\n\n\nProject \"srecord.1.10\", Change 15                                 Page 1\nChange Details                                  Mon Oct 21 21:08:47 2002\n\nNAME\n        Project \"srecord.1.10\", Delta 4, Change 15.\n\nSUMMARY\n        vsnprintf\n\nDESCRIPTION\n        This change adds ./configure insulation for vsnprintf\n\n        My thanks to shankara <shankara@spearnet.net> for reporting this\n        problem.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.20 -> 1.21 etc/Howto.cook\n        source  modify    1.2 -> 1.3  etc/autoconf.cook\n        source  modify    1.8 -> 1.9  etc/configure.in\n        source  create    1.1         lib/common/vsnprintf.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Aug 15      pmiller\n                        20:59:05 2002\n        develop_begin   Thu Aug 15      pmiller  Elapsed time: 0.056\n                        20:59:05 2002            days.\n        develop_end     Thu Aug 15      pmiller\n                        21:24:28 2002\n        review_pass     Thu Aug 15      pmiller\n                        21:24:31 2002\n        integrate_begin Thu Aug 15      pmiller\n                        21:24:34 2002\n        integrate_pass  Thu Aug 15      pmiller\n                        21:25:31 2002\n\n\n\nProject \"srecord.1.10\", Change 16                                 Page 1\nChange Details                                  Mon Oct 21 21:08:47 2002\n\nNAME\n        Project \"srecord.1.10\", Delta 5, Change 16.\n\nSUMMARY\n        Ohio Scientific format\n\nDESCRIPTION\n        This change adds the OS65V format.\n\n        \"The old Ohio Scientific machines contained a monitor, OS65V,\n        which downloaded\n        hex files in its own simple format.\"\n\n        My thanks to David Fenyes <dave@fenyes.net> for this\n        contribution.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.37 -> 1.38 etc/README.man\n        source  modify    1.2 -> 1.3  etc/new-file-format.so\n        source  modify   1.38 -> 1.39 etc/srecord.html\n        source  modify   1.11 -> 1.12 etc/template/h\n        source  modify   1.48 -> 1.49 include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/os65v.h\n        source  create    1.1         include/srec/output/file/os65v.h\n        source  modify   1.50 -> 1.51 lib/srec/arglex.cc\n        source  modify    1.9 -> 1.10 lib/srec/arglex_output.cc\n        source  modify    1.9 -> 1.10 lib/srec/input/file/guess.cc\n        source  create    1.1         lib/srec/input/file/os65v.cc\n        source  create    1.1         lib/srec/output/file/os65v.cc\n        source  modify   1.41 -> 1.42 man/man1/o_input.so\n        source  modify   1.30 -> 1.31 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_os65v.5\n        test    create    1.1         test/00/t0077a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Oct 20      pmiller\n                        17:12:37 2002\n        develop_begin   Sun Oct 20      pmiller  Elapsed time: 1.017\n                        17:12:37 2002            days.\n        develop_end     Mon Oct 21      pmiller\n                        17:20:24 2002\n        review_pass     Mon Oct 21      pmiller\n                        17:20:29 2002\n        integrate_begin Mon Oct 21      pmiller\n                        17:20:32 2002\n\n\n\nProject \"srecord.1.10\", Change 16                                 Page 2\nChange Details                                  Mon Oct 21 21:08:47 2002\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_pass  Mon Oct 21      pmiller\n                        17:21:43 2002\n\n\n\nProject \"srecord.1.10\", Change 17                                 Page 1\nChange Details                                  Mon Oct 21 21:08:47 2002\n\nNAME\n        Project \"srecord.1.10\", Delta 6, Change 17.\n\nSUMMARY\n        cope with GNU Autoconf changes\n\nDESCRIPTION\n        This change fixes the build to cope with recent (2.5x) GNU\n        Autoconf changes.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.3 -> 1.4  etc/autoconf.cook\n        source  remove    1.2         etc/config.h.in.body\n        source  remove    1.2         etc/config.h.in.head\n        source  remove    1.3         etc/config.h.in.tail\n        source  modify    1.9 -> 1.10 etc/configure.in\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Oct 21      pmiller\n                        17:25:36 2002\n        develop_begin   Mon Oct 21      pmiller  Elapsed time: 0.028\n                        17:25:36 2002            days.\n        develop_end     Mon Oct 21      pmiller\n                        17:38:17 2002\n        review_pass     Mon Oct 21      pmiller\n                        17:38:23 2002\n        integrate_begin Mon Oct 21      pmiller\n                        17:38:25 2002\n        integrate_pass  Mon Oct 21      pmiller\n                        17:39:24 2002\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.2.txt",
    "content": "\n\n\nProject \"srecord.1.2\"                                            Page 1\nList of Changes                                Wed May 12 13:02:46 1999\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       better implementation pragmas\n  12    completed       OR data filter\n  13    completed       AND data filter\n  14    completed       XOR data filter\n  15    completed       binary files\n\n\n\nProject \"srecord.1.2\", Change 10                                 Page 1\nChange Details                                 Wed May 12 13:02:46 1999\n\nNAME\n        Project \"srecord.1.2\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares this next version for release.  The\n        releases are post-numbered.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.1\n        source  modify   1.10 -> 1.11 etc/Howto.cook\n        source  modify    1.4 -> 1.5  etc/Makefile.head\n        source  modify    1.5 -> 1.6  etc/Makefile.sh\n        source  modify    1.4 -> 1.5  etc/configure.in\n        source  create    1.1         etc/new.1.2.so\n        source  modify    1.8 -> 1.9  etc/spec.sh\n        source  modify    1.8 -> 1.9  etc/srecord.lsm\n        source  modify    1.2 -> 1.3  man/man5/srec_tektronix.5\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Nov  4      pmiller\n                        22:09:26 1998\n        develop_begin   Wed Nov  4      pmiller  Elapsed time: 1.000\n                        22:09:29 1998            days.\n        develop_end     Thu Nov  5      pmiller\n                        10:48:13 1998\n        review_pass     Thu Nov  5      pmiller\n                        10:48:17 1998\n        integrate_begin Thu Nov  5      pmiller\n                        10:48:20 1998\n        integrate_pass  Thu Nov  5      pmiller\n                        10:49:49 1998\n\n\n\nProject \"srecord.1.2\", Change 11                                 Page 1\nChange Details                                 Wed May 12 13:02:46 1999\n\nNAME\n        Project \"srecord.1.2\", Delta 2, Change 11.\n\nSUMMARY\n        better implementation pragmas\n\nDESCRIPTION\n        This change improves the use of the #pragma implementation and\n        #pragma interface to cope with older and dumber G++ versions.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_improvement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/template/cc\n        source  modify    1.3 -> 1.4  etc/template/h\n        source  modify    1.3 -> 1.4  include/arglex.h\n        source  modify    1.3 -> 1.4  include/interval.h\n        source  modify   1.14 -> 1.15 include/srec/arglex.h\n        source  modify    1.3 -> 1.4  include/srec/input.h\n        source  modify    1.6 -> 1.7  include/srec/input/file.h\n        source  modify    1.2 -> 1.3  include/srec/input/file/binary.h\n        source  modify    1.6 -> 1.7  include/srec/input/file/intel.h\n        source  modify    1.3 -> 1.4  include/srec/input/file/srecord.h\n        source  modify    1.2 -> 1.3  include/srec/input/file/\n                                      tektronix.h\n        source  modify    1.3 -> 1.4  include/srec/input/filter.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      checksum.h\n        source  modify    1.3 -> 1.4  include/srec/input/filter/crop.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/fill.h\n        source  modify    1.3 -> 1.4  include/srec/input/filter/\n                                      length.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      maximum.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      minimum.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      offset.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/split.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      unsplit.h\n        source  modify    1.4 -> 1.5  include/srec/memory.h\n        source  modify    1.2 -> 1.3  include/srec/memory/chunk.h\n        source  modify    1.2 -> 1.3  include/srec/memory/walker.h\n        source  modify    1.2 -> 1.3  include/srec/memory/walker/\n\n\n\nProject \"srecord.1.2\", Change 11                                 Page 2\nChange Details                                 Wed May 12 13:02:46 1999\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n                                      writer.h\n        source  modify    1.2 -> 1.3  include/srec/output.h\n        source  modify    1.5 -> 1.6  include/srec/output/file.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/binary.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/c.h\n        source  modify    1.4 -> 1.5  include/srec/output/file/intel.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/\n                                      srecord.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/\n                                      tektronix.h\n        source  modify    1.5 -> 1.6  include/srec/record.h\n        source  modify    1.2 -> 1.3  include/srecord/input/filter/\n                                      fill.h\n        source  modify    1.3 -> 1.4  lib/common/arglex.cc\n        source  modify    1.4 -> 1.5  lib/common/interval.cc\n        source  modify   1.15 -> 1.16 lib/srec/arglex.cc\n        source  modify    1.4 -> 1.5  lib/srec/input.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/file.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/file/binary.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/file/intel.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/file/srecord.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/file/tektronix.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/filter.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/checksum.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/filter/crop.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/filter/fill.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/filter/length.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/maximum.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/minimum.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/offset.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/split.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/unsplit.cc\n        source  modify    1.4 -> 1.5  lib/srec/memory.cc\n        source  modify    1.2 -> 1.3  lib/srec/memory/chunk.cc\n        source  modify    1.2 -> 1.3  lib/srec/memory/walker.cc\n        source  modify    1.2 -> 1.3  lib/srec/memory/walker/writer.cc\n        source  modify    1.3 -> 1.4  lib/srec/output.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/binary.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/c.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/intel.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file/srecord.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/tektronix.cc\n        source  modify    1.3 -> 1.4  lib/srec/record.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Nov  5      pmiller\n                        13:12:43 1998\n        develop_begin   Thu Nov  5      pmiller  Elapsed time: 2.622\n                        13:12:47 1998            days.\n        develop_end     Mon Nov  9      pmiller\n                        17:52:48 1998\n        review_pass     Mon Nov  9      pmiller\n\n\n\nProject \"srecord.1.2\", Change 11                                 Page 3\nChange Details                                 Wed May 12 13:02:46 1999\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n                        17:52:53 1998\n        integrate_begin Mon Nov  9      pmiller\n                        17:52:55 1998\n        integrate_pass  Mon Nov  9      pmiller\n                        17:59:02 1998\n\n\n\nProject \"srecord.1.2\", Change 12                                 Page 1\nChange Details                                 Wed May 12 13:02:46 1999\n\nNAME\n        Project \"srecord.1.2\", Delta 3, Change 12.\n\nSUMMARY\n        OR data filter\n\nDESCRIPTION\n        This change adds a filter allowing you to OR a constant into\n        the data.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/new.1.2.so\n        source  modify   1.15 -> 1.16 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/or.h\n        source  modify    1.6 -> 1.7  include/srec/record.h\n        source  modify   1.16 -> 1.17 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/or.cc\n        source  modify   1.15 -> 1.16 man/man1/o_input.so\n        test    create    1.1         test/00/t0027a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Nov  9      pmiller\n                        17:39:10 1998\n        develop_begin   Mon Nov  9      pmiller  Elapsed time: 0.090\n                        17:39:13 1998            days.\n        develop_end     Mon Nov  9      pmiller\n                        18:19:40 1998\n        review_pass     Mon Nov  9      pmiller\n                        18:19:43 1998\n        integrate_begin Mon Nov  9      pmiller\n                        18:19:45 1998\n        integrate_pass  Mon Nov  9      pmiller\n                        18:22:39 1998\n\n\n\nProject \"srecord.1.2\", Change 13                                 Page 1\nChange Details                                 Wed May 12 13:02:46 1999\n\nNAME\n        Project \"srecord.1.2\", Delta 4, Change 13.\n\nSUMMARY\n        AND data filter\n\nDESCRIPTION\n        This change adds a bit-wise AND filter.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.16 -> 1.17 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/and.h\n        source  modify   1.17 -> 1.18 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/and.cc\n        test    create    1.1         test/00/t0028a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Nov 10      pmiller\n                        18:48:05 1998\n        develop_begin   Tue Nov 10      pmiller  Elapsed time: 1.000\n                        18:48:10 1998            days.\n        develop_end     Wed Nov 11      pmiller\n                        18:05:21 1998\n        review_pass     Wed Nov 11      pmiller\n                        18:06:33 1998\n        integrate_begin Wed Nov 11      pmiller\n                        18:06:35 1998\n        integrate_pass  Wed Nov 11      pmiller\n                        18:14:05 1998\n\n\n\nProject \"srecord.1.2\", Change 14                                 Page 1\nChange Details                                 Wed May 12 13:02:46 1999\n\nNAME\n        Project \"srecord.1.2\", Delta 5, Change 14.\n\nSUMMARY\n        XOR data filter\n\nDESCRIPTION\n        This change adds the xor data filter.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/new.1.2.so\n        source  modify   1.17 -> 1.18 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/xor.h\n        source  modify   1.18 -> 1.19 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/xor.cc\n        source  modify   1.16 -> 1.17 man/man1/o_input.so\n        test    create    1.1         test/00/t0029a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Nov 11      pmiller\n                        18:21:17 1998\n        develop_begin   Wed Nov 11      pmiller  Elapsed time: 1.000\n                        18:21:48 1998            days.\n        develop_end     Thu Nov 12      pmiller\n                        17:48:31 1998\n        review_pass     Thu Nov 12      pmiller\n                        17:48:34 1998\n        integrate_begin Thu Nov 12      pmiller\n                        17:48:36 1998\n        integrate_pass  Thu Nov 12      pmiller\n                        17:54:29 1998\n\n\n\nProject \"srecord.1.2\", Change 15                                 Page 1\nChange Details                                 Wed May 12 13:02:47 1999\n\nNAME\n        Project \"srecord.1.2\", Delta 6, Change 15.\n\nSUMMARY\n        binary files\n\nDESCRIPTION\n        This change corrects a bug on Windows NT where binary files are\n        being opened in text mode.  For Unix this doesn't matter, but\n        for Windows NT this is a disaster.\n\n        My thanks to Angel Jimenez Jimenez <angel.jimenez@ALCATEL.ES>\n        for reporting this problem.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.7 -> 1.8  include/srec/input/file.h\n        source  modify    1.3 -> 1.4  include/srec/input/file/binary.h\n        source  modify    1.6 -> 1.7  include/srec/output/file.h\n        source  modify    1.3 -> 1.4  include/srec/output/file/binary.h\n        source  modify    1.8 -> 1.9  lib/srec/input/file.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/file/binary.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/file/srecord.cc\n        source  modify    1.7 -> 1.8  lib/srec/output/file.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file/binary.cc\n        test    create    1.1         test/00/t0030a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed May 12      pmiller\n                        10:56:11 1999\n        develop_begin   Wed May 12      pmiller  Elapsed time: 0.243\n                        10:56:15 1999            days.\n        develop_end     Wed May 12      pmiller\n                        12:45:42 1999\n        review_pass     Wed May 12      pmiller\n                        12:45:54 1999\n        integrate_begin Wed May 12      pmiller\n                        12:45:58 1999\n        integrate_pass  Wed May 12      pmiller\n                        12:52:53 1999\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.3.txt",
    "content": "\n\n\nProject \"srecord.1.3\"                                             Page 1\nList of Changes                                 Thu Jan 13 13:23:38 2000\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       FSF address\n  12    completed       CRLF\n\n\n\nProject \"srecord.1.3\", Change 10                                  Page 1\nChange Details                                  Thu Jan 13 13:23:39 2000\n\nNAME\n        Project \"srecord.1.3\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares SRecord for the next public release.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.2\n        source  modify    1.6 -> 1.7  etc/configure.in\n        source  modify    1.4 -> 1.5  etc/new.1.2.so\n        source  create    1.1         etc/new.1.3.so\n        source  modify    1.6 -> 1.7  lib/common/interval.cc\n        test    modify    1.3 -> 1.4  test/00/t0005a.sh\n        test    modify    1.3 -> 1.4  test/00/t0006a.sh\n        test    modify    1.2 -> 1.3  test/00/t0022a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed May 12      pmiller\n                        13:02:07 1999\n        develop_begin   Wed May 12      pmiller  Elapsed time: 0.239\n                        13:02:09 1999            days.\n        develop_end     Wed May 12      pmiller\n                        14:49:47 1999\n        review_pass     Wed May 12      pmiller\n                        14:50:34 1999\n        integrate_begin Wed May 12      pmiller\n                        14:50:37 1999\n        integrate_pass  Wed May 12      pmiller\n                        14:52:51 1999\n\n\n\nProject \"srecord.1.3\", Change 11                                  Page 1\nChange Details                                  Thu Jan 13 13:23:40 2000\n\nNAME\n        Project \"srecord.1.3\", Delta 2, Change 11.\n\nSUMMARY\n        FSF address\n\nDESCRIPTION\n        This change updates the FSF address in the GPL file headers.\n\n        This change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.5 -> 1.6  config\n        source  modify   1.12 -> 1.13 etc/Howto.cook\n        source  modify    1.9 -> 1.10 etc/archive.cook\n        source  modify    1.7 -> 1.8  etc/documentation.cook\n        source  modify    1.3 -> 1.4  etc/new.1.1.so\n        source  modify    1.5 -> 1.6  etc/new.1.2.so\n        source  modify    1.1 -> 1.2  etc/new.1.3.so\n        source  modify    1.2 -> 1.3  etc/reference.man\n        source  modify    1.2 -> 1.3  etc/srecord.gif.uue\n        source  modify    1.2 -> 1.3  etc/template/c\n        source  modify    1.4 -> 1.5  etc/template/cc\n        source  modify    1.2 -> 1.3  etc/template/generic\n        source  modify    1.5 -> 1.6  etc/template/h\n        source  modify    1.2 -> 1.3  etc/template/sh\n        source  modify    1.3 -> 1.4  etc/template/test\n        source  modify    1.5 -> 1.6  include/arglex.h\n        source  modify    1.5 -> 1.6  include/interval.h\n        source  modify    1.2 -> 1.3  include/progname.h\n        source  modify   1.19 -> 1.20 include/srec/arglex.h\n        source  modify    1.5 -> 1.6  include/srec/input.h\n        source  modify    1.9 -> 1.10 include/srec/input/file.h\n        source  modify    1.5 -> 1.6  include/srec/input/file/binary.h\n        source  modify    1.8 -> 1.9  include/srec/input/file/intel.h\n        source  modify    1.5 -> 1.6  include/srec/input/file/srecord.h\n        source  modify    1.4 -> 1.5  include/srec/input/file/\n                                      tektronix.h\n        source  modify    1.5 -> 1.6  include/srec/input/filter.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/and.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/\n                                      checksum.h\n        source  modify    1.5 -> 1.6  include/srec/input/filter/crop.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/fill.h\n        source  modify    1.5 -> 1.6  include/srec/input/filter/length.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/\n                                      maximum.h\n\n\n\nProject \"srecord.1.3\", Change 11                                  Page 2\nChange Details                                  Thu Jan 13 13:23:40 2000\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.4 -> 1.5  include/srec/input/filter/\n                                      minimum.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/offset.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/or.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/split.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/\n                                      unsplit.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/xor.h\n        source  modify    1.2 -> 1.3  include/srec/input/interval.h\n        source  modify    1.6 -> 1.7  include/srec/memory.h\n        source  modify    1.4 -> 1.5  include/srec/memory/chunk.h\n        source  modify    1.4 -> 1.5  include/srec/memory/walker.h\n        source  modify    1.4 -> 1.5  include/srec/memory/walker/\n                                      writer.h\n        source  modify    1.4 -> 1.5  include/srec/output.h\n        source  modify    1.8 -> 1.9  include/srec/output/file.h\n        source  modify    1.5 -> 1.6  include/srec/output/file/binary.h\n        source  modify    1.4 -> 1.5  include/srec/output/file/c.h\n        source  modify    1.6 -> 1.7  include/srec/output/file/intel.h\n        source  modify    1.4 -> 1.5  include/srec/output/file/srecord.h\n        source  modify    1.4 -> 1.5  include/srec/output/file/\n                                      tektronix.h\n        source  modify    1.8 -> 1.9  include/srec/record.h\n        source  modify    1.4 -> 1.5  include/srecord/input/filter/\n                                      fill.h\n        source  modify    1.5 -> 1.6  lib/common/arglex.cc\n        source  modify    1.7 -> 1.8  lib/common/interval.cc\n        source  modify    1.2 -> 1.3  lib/common/progname.cc\n        source  modify    1.2 -> 1.3  lib/common/versn_stamp.cc\n        source  modify    1.2 -> 1.3  lib/common/versn_stamp.h\n        source  modify   1.20 -> 1.21 lib/srec/arglex.cc\n        source  modify    1.6 -> 1.7  lib/srec/input.cc\n        source  modify   1.10 -> 1.11 lib/srec/input/file.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/file/binary.cc\n        source  modify    1.8 -> 1.9  lib/srec/input/file/intel.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/file/srecord.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/file/tektronix.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/filter.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/and.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/checksum.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/filter/crop.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/filter/fill.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/filter/length.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/maximum.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/minimum.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/offset.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/or.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/split.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/unsplit.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/xor.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/interval.cc\n        source  modify    1.6 -> 1.7  lib/srec/memory.cc\n        source  modify    1.4 -> 1.5  lib/srec/memory/chunk.cc\n        source  modify    1.4 -> 1.5  lib/srec/memory/walker.cc\n        source  modify    1.4 -> 1.5  lib/srec/memory/walker/writer.cc\n\n\n\nProject \"srecord.1.3\", Change 11                                  Page 3\nChange Details                                  Thu Jan 13 13:23:40 2000\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.5 -> 1.6  lib/srec/output.cc\n        source  modify    1.9 -> 1.10 lib/srec/output/file.cc\n        source  modify    1.5 -> 1.6  lib/srec/output/file/binary.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/c.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file/intel.cc\n        source  modify    1.5 -> 1.6  lib/srec/output/file/srecord.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/tektronix.cc\n        source  modify    1.5 -> 1.6  lib/srec/record.cc\n        source  modify   1.18 -> 1.19 man/man1/o_input.so\n        source  modify    1.7 -> 1.8  prog/srec_cat/main.cc\n        source  modify    1.4 -> 1.5  prog/srec_cmp/main.cc\n        source  modify    1.2 -> 1.3  prog/srec_info/main.cc\n        test    modify    1.4 -> 1.5  test/00/t0001a.sh\n        test    modify    1.3 -> 1.4  test/00/t0002a.sh\n        test    modify    1.6 -> 1.7  test/00/t0003a.sh\n        test    modify    1.3 -> 1.4  test/00/t0004a.sh\n        test    modify    1.4 -> 1.5  test/00/t0005a.sh\n        test    modify    1.4 -> 1.5  test/00/t0006a.sh\n        test    modify    1.4 -> 1.5  test/00/t0007a.sh\n        test    modify    1.2 -> 1.3  test/00/t0008a.sh\n        test    modify    1.2 -> 1.3  test/00/t0009a.sh\n        test    modify    1.2 -> 1.3  test/00/t0010a.sh\n        test    modify    1.2 -> 1.3  test/00/t0011a.sh\n        test    modify    1.2 -> 1.3  test/00/t0012a.sh\n        test    modify    1.2 -> 1.3  test/00/t0013a.sh\n        test    modify    1.2 -> 1.3  test/00/t0014a.sh\n        test    modify    1.2 -> 1.3  test/00/t0015a.sh\n        test    modify    1.2 -> 1.3  test/00/t0016a.sh\n        test    modify    1.2 -> 1.3  test/00/t0017a.sh\n        test    modify    1.4 -> 1.5  test/00/t0018a.sh\n        test    modify    1.2 -> 1.3  test/00/t0019a.sh\n        test    modify    1.2 -> 1.3  test/00/t0020a.sh\n        test    modify    1.2 -> 1.3  test/00/t0021a.sh\n        test    modify    1.3 -> 1.4  test/00/t0022a.sh\n        test    modify    1.2 -> 1.3  test/00/t0023a.sh\n        test    modify    1.2 -> 1.3  test/00/t0024a.sh\n        test    modify    1.2 -> 1.3  test/00/t0025a.sh\n        test    modify    1.2 -> 1.3  test/00/t0026a.sh\n        test    modify    1.2 -> 1.3  test/00/t0027a.sh\n        test    modify    1.2 -> 1.3  test/00/t0028a.sh\n        test    modify    1.2 -> 1.3  test/00/t0029a.sh\n        test    modify    1.2 -> 1.3  test/00/t0030a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Aug  5      pmiller\n                        12:29:40 1999\n        develop_begin   Thu Aug  5      pmiller\n                        12:29:41 1999\n        develop_end     Thu Aug  5      pmiller\n                        12:38:46 1999\n        review_pass     Thu Aug  5      pmiller\n                        12:38:49 1999\n\n\n\n\nProject \"srecord.1.3\", Change 11                                  Page 4\nChange Details                                  Thu Jan 13 13:23:40 2000\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_begin Thu Aug  5      pmiller  Elapsed time: 0.051\n                        12:38:53 1999            days.\n        integrate_pass  Thu Aug  5      pmiller\n                        13:01:38 1999\n\n\n\nProject \"srecord.1.3\", Change 12                                  Page 1\nChange Details                                  Thu Jan 13 13:23:44 2000\n\nNAME\n        Project \"srecord.1.3\", Delta 3, Change 12.\n\nSUMMARY\n        CRLF\n\nDESCRIPTION\n        This change makes the text input more robust when faced with\n        CRLF files (caused by DOS and UNIX sharing the same file\n        server).\n\n        My thanks to Galen Seitz <galens@seitzassoc.com> for reporting\n        this problem.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.10 -> 1.11 include/srec/input/file.h\n        source  modify   1.11 -> 1.12 lib/srec/input/file.cc\n        source  modify    1.7 -> 1.8  lib/srec/memory.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Nov  4      pmiller\n                        10:42:26 1999\n        develop_begin   Thu Nov  4      pmiller  Elapsed time: 0.297\n                        10:42:29 1999            days.\n        develop_end     Thu Nov  4      pmiller\n                        12:56:11 1999\n        review_pass     Thu Nov  4      pmiller\n                        12:56:14 1999\n        integrate_begin Thu Nov  4      pmiller  Elapsed time: 0.043\n                        12:56:26 1999            days.\n        integrate_pass  Thu Nov  4      pmiller\n                        13:16:00 1999\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.4.txt",
    "content": "\n\n\nProject \"srecord.1.4\"                                             Page 1\nList of Changes                                 Mon Mar  6 22:01:05 2000\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       line length option\n  12    completed       Y2k glitch on web page\n  13    completed       srec_cat -data-only\n  14    completed       Wilson file format\n  15    completed       byte swap filter\n  16    completed       ascii hex file format\n  17    completed       TI-tagged file format\n  18    completed       extended tektronix file format\n  19    completed       MOS Technology file format\n  20    completed       auto format guess\n\n\n\nProject \"srecord.1.4\", Change 10                                  Page 1\nChange Details                                  Mon Mar  6 22:01:06 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares SRecord for the next public release.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.3\n        source  modify    1.3 -> 1.4  etc/new.1.3.so\n        source  create    1.1         etc/new.1.4.so\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Jan 13      pmiller\n                        13:22:22 2000\n        develop_begin   Thu Jan 13      pmiller\n                        13:22:23 2000\n        develop_end     Thu Jan 13      pmiller\n                        13:30:53 2000\n        review_pass     Thu Jan 13      pmiller\n                        13:30:58 2000\n        integrate_begin Thu Jan 13      pmiller\n                        13:31:01 2000\n        integrate_pass  Thu Jan 13      pmiller\n                        13:33:14 2000\n\n\n\nProject \"srecord.1.4\", Change 11                                  Page 1\nChange Details                                  Mon Mar  6 22:01:07 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 2, Change 11.\n\nSUMMARY\n        line length option\n\nDESCRIPTION\n        This change adds a line length option to srec_cat, so that the\n        user may specify then maximum line length of the output.\n\n        My thanks to Paolo Monari <paolomonari@digitek.it> for this\n        suggestion.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/new.1.4.so\n        source  modify    1.7 -> 1.8  include/arglex.h\n        source  modify    1.6 -> 1.7  include/srec/output.h\n        source  modify    1.7 -> 1.8  include/srec/output/file/binary.h\n        source  modify    1.6 -> 1.7  include/srec/output/file/c.h\n        source  modify    1.8 -> 1.9  include/srec/output/file/intel.h\n        source  modify    1.6 -> 1.7  include/srec/output/file/srecord.h\n        source  modify    1.6 -> 1.7  include/srec/output/file/\n                                      tektronix.h\n        source  modify   1.10 -> 1.11 include/srec/record.h\n        source  modify    1.7 -> 1.8  lib/common/arglex.cc\n        source  modify    1.7 -> 1.8  lib/srec/output.cc\n        source  modify    1.7 -> 1.8  lib/srec/output/file/binary.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file/c.cc\n        source  modify    1.8 -> 1.9  lib/srec/output/file/intel.cc\n        source  modify    1.7 -> 1.8  lib/srec/output/file/srecord.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file/tektronix.cc\n        source  modify    1.8 -> 1.9  man/man1/srec_cat.1\n        source  create    1.1         prog/srec_cat/arglex3.cc\n        source  create    1.1         prog/srec_cat/arglex3.h\n        source  modify    1.9 -> 1.10 prog/srec_cat/main.cc\n        test    create    1.1         test/00/t0031a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Jan 17      pmiller\n                        09:17:56 2000\n        develop_begin   Mon Jan 17      pmiller  Elapsed time: 0.634\n                        09:17:58 2000            days.\n        develop_end     Mon Jan 17      pmiller\n                        14:03:12 2000\n\n\n\n\nProject \"srecord.1.4\", Change 11                                  Page 2\nChange Details                                  Mon Mar  6 22:01:07 2000\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        review_pass     Mon Jan 17      pmiller\n                        14:03:17 2000\n        integrate_begin Mon Jan 17      pmiller\n                        14:03:20 2000\n        integrate_pass  Mon Jan 17      pmiller\n                        14:10:58 2000\n\n\n\nProject \"srecord.1.4\", Change 12                                  Page 1\nChange Details                                  Mon Mar  6 22:01:08 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 3, Change 12.\n\nSUMMARY\n        Y2k glitch on web page\n\nDESCRIPTION\n        This change fixes a Y2K glitch on the web page.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.9 -> 1.10 etc/documentation.cook\n        source  modify   1.11 -> 1.12 etc/srecord.html\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Jan 19      pmiller\n                        11:14:41 2000\n        develop_begin   Wed Jan 19      pmiller\n                        11:14:43 2000\n        develop_end     Wed Jan 19      pmiller\n                        11:21:16 2000\n        review_pass     Wed Jan 19      pmiller\n                        11:21:22 2000\n        integrate_begin Wed Jan 19      pmiller\n                        11:21:25 2000\n        integrate_pass  Wed Jan 19      pmiller\n                        11:24:56 2000\n\n\n\nProject \"srecord.1.4\", Change 13                                  Page 1\nChange Details                                  Mon Mar  6 22:01:09 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 4, Change 13.\n\nSUMMARY\n        srec_cat -data-only\n\nDESCRIPTION\n        This change adds the srec_cat -data-only option, which causes\n        the output (all formats) to include only the data, and not the\n        header or footer records (or any other non-data records, for\n        that matter).\n\n        My thanks to Russel Lemon <russell@nautitech.com.au> for this\n        suggestion.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/new.1.4.so\n        source  modify   1.10 -> 1.11 include/srec/output/file.h\n        source  modify   1.11 -> 1.12 lib/srec/output/file.cc\n        source  modify    1.7 -> 1.8  lib/srec/output/file/c.cc\n        source  modify    1.9 -> 1.10 lib/srec/output/file/intel.cc\n        source  modify    1.8 -> 1.9  lib/srec/output/file/srecord.cc\n        source  modify    1.7 -> 1.8  lib/srec/output/file/tektronix.cc\n        source  modify    1.9 -> 1.10 man/man1/srec_cat.1\n        source  modify    1.1 -> 1.2  prog/srec_cat/arglex3.cc\n        source  modify    1.1 -> 1.2  prog/srec_cat/arglex3.h\n        source  modify   1.10 -> 1.11 prog/srec_cat/main.cc\n        test    create    1.1         test/00/t0032a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Feb 28      pmiller\n                        15:52:05 2000\n        develop_begin   Mon Feb 28      pmiller  Elapsed time: 0.244\n                        15:52:06 2000            days.\n        develop_end     Mon Feb 28      pmiller\n                        17:41:50 2000\n        review_pass     Mon Feb 28      pmiller\n                        17:41:56 2000\n        integrate_begin Mon Feb 28      pmiller\n                        17:41:59 2000\n        integrate_pass  Mon Feb 28      pmiller\n                        17:46:44 2000\n\n\n\nProject \"srecord.1.4\", Change 14                                  Page 1\nChange Details                                  Mon Mar  6 22:01:10 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 6, Change 14.\n\nSUMMARY\n        Wilson file format\n\nDESCRIPTION\n        This change adds the \"Wilson\" file format.  The actual name of\n        this format is unknown.\n\n        This format was put together for Alan Wilson\n        <dvdsales@dvdlibrary.co.uk> to drive some unusual equipment he\n        uses.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.14 -> 1.15 etc/README.man\n        source  modify    1.4 -> 1.5  etc/new.1.4.so\n        source  modify   1.12 -> 1.13 etc/srecord.html\n        source  modify   1.22 -> 1.23 include/srec/arglex.h\n        source  modify   1.12 -> 1.13 include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/wilson.h\n        source  modify   1.11 -> 1.12 include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/wilson.h\n        source  modify   1.23 -> 1.24 lib/srec/arglex.cc\n        source  modify   1.13 -> 1.14 lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/wilson.cc\n        source  modify   1.12 -> 1.13 lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/wilson.cc\n        source  modify   1.21 -> 1.22 man/man1/o_input.so\n        source  modify   1.10 -> 1.11 man/man1/srec_cat.1\n        source  modify    1.4 -> 1.5  man/man5/srec_intel.5\n        source  modify    1.3 -> 1.4  man/man5/srec_motorola.5\n        source  modify    1.4 -> 1.5  man/man5/srec_tektronix.5\n        source  create    1.1         man/man5/srec_wilson.5\n        test    create    1.1         test/00/t0033a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Mar  1      pmiller\n                        16:46:16 2000\n        develop_begin   Wed Mar  1      pmiller  Elapsed time: 1.031\n                        16:46:17 2000            days.\n        develop_end     Thu Mar  2      pmiller\n                        17:00:01 2000\n        review_pass     Thu Mar  2      pmiller\n                        17:00:09 2000\n\n\n\nProject \"srecord.1.4\", Change 14                                  Page 2\nChange Details                                  Mon Mar  6 22:01:10 2000\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_begin Thu Mar  2      pmiller\n                        17:00:13 2000\n        integrate_pass  Thu Mar  2      pmiller\n                        17:09:48 2000\n\n\n\nProject \"srecord.1.4\", Change 15                                  Page 1\nChange Details                                  Mon Mar  6 22:01:11 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 5, Change 15.\n\nSUMMARY\n        byte swap filter\n\nDESCRIPTION\n        This change adds the byte swap filter.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.13 -> 1.14 etc/README.man\n        source  modify    1.3 -> 1.4  etc/new.1.4.so\n        source  modify   1.21 -> 1.22 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/byte_\n                                      swap.h\n        source  modify   1.22 -> 1.23 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/byte_swap.cc\n        source  modify   1.20 -> 1.21 man/man1/o_input.so\n        test    create    1.1         test/00/t0034a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Mar  2      pmiller\n                        11:24:52 2000\n        develop_begin   Thu Mar  2      pmiller  Elapsed time: 0.207\n                        11:24:53 2000            days.\n        develop_end     Thu Mar  2      pmiller\n                        12:58:02 2000\n        review_pass     Thu Mar  2      pmiller\n                        12:58:07 2000\n        integrate_begin Thu Mar  2      pmiller\n                        12:58:10 2000\n        integrate_pass  Thu Mar  2      pmiller\n                        13:02:03 2000\n\n\n\nProject \"srecord.1.4\", Change 16                                  Page 1\nChange Details                                  Mon Mar  6 22:01:12 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 7, Change 16.\n\nSUMMARY\n        ascii hex file format\n\nDESCRIPTION\n        This change adds the ASCII hex file format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.7 -> 1.8  config\n        source  modify   1.15 -> 1.16 etc/README.man\n        source  modify    1.5 -> 1.6  etc/new.1.4.so\n        source  modify   1.13 -> 1.14 etc/srecord.html\n        source  modify   1.23 -> 1.24 include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/ascii_\n                                      hex.h\n        source  create    1.1         include/srec/output/file/ascii_\n                                      hex.h\n        source  modify   1.24 -> 1.25 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/file/ascii_hex.cc\n        source  create    1.1         lib/srec/output/file/ascii_hex.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file/wilson.cc\n        source  create    1.1         man/man5/srec_ascii_hex.5\n        source  modify    1.4 -> 1.5  man/man5/srec_motorola.5\n        test    create    1.1         test/00/t0035a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Mar  2      pmiller\n                        17:02:41 2000\n        develop_begin   Thu Mar  2      pmiller  Elapsed time: 0.681\n                        17:02:44 2000            days.\n        develop_end     Thu Mar  2      pmiller\n                        22:09:03 2000\n        review_pass     Thu Mar  2      pmiller\n                        22:10:44 2000\n        integrate_begin Thu Mar  2      pmiller\n                        22:10:47 2000\n        integrate_pass  Thu Mar  2      pmiller\n                        22:19:59 2000\n\n\n\nProject \"srecord.1.4\", Change 17                                  Page 1\nChange Details                                  Mon Mar  6 22:01:13 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 8, Change 17.\n\nSUMMARY\n        TI-tagged file format\n\nDESCRIPTION\n        This change adds the Texas Instruments SDSMAC tagged object\n        format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.16 -> 1.17 etc/README.man\n        source  modify   1.14 -> 1.15 etc/srecord.html\n        source  modify   1.24 -> 1.25 include/srec/arglex.h\n        source  modify   1.13 -> 1.14 include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/ti_\n                                      tagged.h\n        source  modify   1.12 -> 1.13 include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/ti_\n                                      tagged.h\n        source  modify   1.25 -> 1.26 lib/srec/arglex.cc\n        source  modify   1.14 -> 1.15 lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/ti_tagged.cc\n        source  modify   1.13 -> 1.14 lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/man/man5/\n                                      srec_ti_tagged.5\n        source  create    1.1         lib/srec/output/file/ti_tagged.cc\n        source  modify   1.22 -> 1.23 man/man1/o_input.so\n        source  modify   1.11 -> 1.12 man/man1/srec_cat.1\n        source  modify    1.5 -> 1.6  man/man5/srec_intel.5\n        source  modify    1.5 -> 1.6  man/man5/srec_motorola.5\n        test    create    1.1         test/00/t0036a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Mar  2      pmiller\n                        22:21:21 2000\n        develop_begin   Thu Mar  2      pmiller  Elapsed time: 1.029\n                        22:21:22 2000            days.\n        develop_end     Fri Mar  3      pmiller  Elapsed time: 0.061\n                        22:34:20 2000            days.\n        review_pass     Fri Mar  3      pmiller\n                        23:01:43 2000\n        integrate_begin Fri Mar  3      pmiller  Elapsed time: 0.026\n                        23:01:47 2000            days.\n\n\n\n\nProject \"srecord.1.4\", Change 17                                  Page 2\nChange Details                                  Mon Mar  6 22:01:13 2000\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_pass  Fri Mar  3      pmiller\n                        23:13:23 2000\n\n\n\nProject \"srecord.1.4\", Change 18                                  Page 1\nChange Details                                  Mon Mar  6 22:01:14 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 9, Change 18.\n\nSUMMARY\n        extended tektronix file format\n\nDESCRIPTION\n        This change adds the extended tektronix file format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.17 -> 1.18 etc/README.man\n        source  modify   1.15 -> 1.16 etc/srecord.html\n        source  modify   1.25 -> 1.26 include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/tektronix_\n                                      extended.h\n        source  create    1.1         include/srec/output/file/\n                                      tektronix_extended.h\n        source  modify   1.26 -> 1.27 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/file/tektronix_\n                                      extended.cc\n        source  create    1.1         lib/srec/output/file/tektronix_\n                                      extended.cc\n        source  modify   1.23 -> 1.24 man/man1/o_input.so\n        source  modify   1.12 -> 1.13 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_tektronix_extended.5\n        source  create    1.1         man/man5/srec_ti_tagged.5\n        test    create    1.1         test/00/t0037a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Mar  4      pmiller\n                        08:20:33 2000\n        develop_begin   Sat Mar  4      pmiller  Elapsed time: 1.000\n                        08:20:34 2000            days.\n        develop_end     Sat Mar  4      pmiller\n                        19:45:00 2000\n        review_pass     Sat Mar  4      pmiller\n                        19:45:05 2000\n        integrate_begin Sat Mar  4      pmiller\n                        19:45:08 2000\n        integrate_pass  Sat Mar  4      pmiller\n                        19:50:30 2000\n\n\n\nProject \"srecord.1.4\", Change 19                                  Page 1\nChange Details                                  Mon Mar  6 22:01:15 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 10, Change 19.\n\nSUMMARY\n        MOS Technology file format\n\nDESCRIPTION\n        This change adds the MOS Technology file format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.18 -> 1.19 etc/README.man\n        source  modify   1.16 -> 1.17 etc/srecord.html\n        source  modify   1.26 -> 1.27 include/srec/arglex.h\n        source  modify   1.14 -> 1.15 include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/mos_tech.h\n        source  modify   1.13 -> 1.14 include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/mos_\n                                      tech.h\n        source  modify   1.27 -> 1.28 lib/srec/arglex.cc\n        source  modify   1.15 -> 1.16 lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/mos_tech.cc\n        source  modify   1.14 -> 1.15 lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/mos_tech.cc\n        source  modify   1.24 -> 1.25 man/man1/o_input.so\n        source  modify   1.13 -> 1.14 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_mos_tech.5\n        test    create    1.1         test/00/t0038a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Mar  4      pmiller\n                        19:51:42 2000\n        develop_begin   Sat Mar  4      pmiller  Elapsed time: 0.287\n                        19:51:43 2000            days.\n        develop_end     Sat Mar  4      pmiller\n                        22:01:04 2000\n        review_pass     Sat Mar  4      pmiller\n                        22:01:07 2000\n        integrate_begin Sat Mar  4      pmiller\n                        22:01:10 2000\n        integrate_pass  Sat Mar  4      pmiller\n                        22:09:38 2000\n\n\n\nProject \"srecord.1.4\", Change 20                                  Page 1\nChange Details                                  Mon Mar  6 22:01:17 2000\n\nNAME\n        Project \"srecord.1.4\", Delta 11, Change 20.\n\nSUMMARY\n        auto format guess\n\nDESCRIPTION\n        This change adds code to automatically guess input file formats.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.6 -> 1.7  etc/new.1.4.so\n        source  modify    1.7 -> 1.8  etc/template/h\n        source  create    1.1         include/quit.h\n        source  create    1.1         include/quit/exception.h\n        source  create    1.1         include/quit/normal.h\n        source  create    1.1         include/quit/prefix.h\n        source  modify   1.27 -> 1.28 include/srec/arglex.h\n        source  modify    1.7 -> 1.8  include/srec/input.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/ascii_\n                                      hex.h\n        source  modify    1.7 -> 1.8  include/srec/input/file/binary.h\n        source  create    1.1         include/srec/input/file/guess.h\n        source  modify   1.10 -> 1.11 include/srec/input/file/intel.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/mos_tech.h\n        source  modify    1.7 -> 1.8  include/srec/input/file/srecord.h\n        source  modify    1.6 -> 1.7  include/srec/input/file/\n                                      tektronix.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/tektronix_\n                                      extended.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/ti_\n                                      tagged.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/wilson.h\n        source  modify    1.7 -> 1.8  include/srec/input/filter.h\n        source  create    1.1         lib/common/quit.cc\n        source  create    1.1         lib/common/quit/exception.cc\n        source  create    1.1         lib/common/quit/normal.cc\n        source  create    1.1         lib/common/quit/prefix.cc\n        source  modify   1.28 -> 1.29 lib/srec/arglex.cc\n        source  modify    1.8 -> 1.9  lib/srec/input.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/ascii_hex.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/file/binary.cc\n        source  create    1.1         lib/srec/input/file/guess.cc\n        source  modify   1.10 -> 1.11 lib/srec/input/file/intel.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/mos_tech.cc\n        source  modify    1.9 -> 1.10 lib/srec/input/file/srecord.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/file/tektronix.cc\n\n\n\n\nProject \"srecord.1.4\", Change 20                                  Page 2\nChange Details                                  Mon Mar  6 22:01:17 2000\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  lib/srec/input/file/tektronix_\n                                      extended.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/ti_tagged.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/wilson.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/filter.cc\n        source  modify   1.25 -> 1.26 man/man1/o_input.so\n        source  modify    1.4 -> 1.5  prog/srec_info/main.cc\n        test    modify    1.4 -> 1.5  test/00/t0014a.sh\n        test    create    1.1         test/00/t0039a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Mar  4      pmiller\n                        22:13:25 2000\n        develop_begin   Sat Mar  4      pmiller  Elapsed time: 1.000\n                        22:13:26 2000            days.\n        develop_end     Mon Mar  6      pmiller\n                        21:25:37 2000\n        review_pass     Mon Mar  6      pmiller\n                        21:25:49 2000\n        integrate_begin Mon Mar  6      pmiller  Elapsed time: 0.023\n                        21:25:53 2000            days.\n        integrate_pass  Mon Mar  6      pmiller\n                        21:36:13 2000\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.5.txt",
    "content": "\n\n\nProject \"srecord.1.5\"                                             Page 1\nList of Changes                                 Sun Dec  3 19:50:02 2000\n\nChange  State           Description\n------- -------         -------------\n  10    completed       Prepare for release\n  11    completed       windows porting\n  12    completed       error message prefix bug\n  13    completed       verbose comparison\n  14    completed       2s complement checksum\n  15    completed       compare more efficient\n  16    completed       VHDL output\n  17    completed       Windows NT\n  18    completed       crc16\n  19    completed       crc32\n  20    completed       C Array bug\n\n\n\nProject \"srecord.1.5\", Change 10                                  Page 1\nChange Details                                  Sun Dec  3 19:50:03 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 1, Change 10.\n\nSUMMARY\n        Prepare for release\n\nDESCRIPTION\n        This change prepares S-Record for the next public release.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.4\n        source  create    1.1         etc/new.1.5.so\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Mar  6      pmiller\n                        21:54:19 2000\n        develop_begin   Mon Mar  6      pmiller  Elapsed time: 0.039\n                        21:54:21 2000            days.\n        develop_end     Mon Mar  6      pmiller\n                        22:11:51 2000\n        review_pass     Mon Mar  6      pmiller\n                        22:11:55 2000\n        integrate_begin Mon Mar  6      pmiller\n                        22:11:58 2000\n        integrate_pass  Mon Mar  6      pmiller\n                        22:16:40 2000\n\n\n\nProject \"srecord.1.5\", Change 11                                  Page 1\nChange Details                                  Sun Dec  3 19:50:05 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 2, Change 11.\n\nSUMMARY\n        windows porting\n\nDESCRIPTION\n        This change makes some changes to make srecord more portable to\n        Windows (to the tests, actually, the code was fine).\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_improvement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        test    modify    1.2 -> 1.3  test/00/t0032a.sh\n        test    modify    1.2 -> 1.3  test/00/t0033a.sh\n        test    modify    1.2 -> 1.3  test/00/t0035a.sh\n        test    modify    1.2 -> 1.3  test/00/t0037a.sh\n        test    modify    1.2 -> 1.3  test/00/t0038a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Mar  7      pmiller\n                        10:42:15 2000\n        develop_begin   Tue Mar  7      pmiller  Elapsed time: 1.000\n                        10:42:17 2000            days.\n        develop_end     Tue Mar  7      pmiller\n                        20:23:12 2000\n        review_pass     Tue Mar  7      pmiller\n                        20:23:19 2000\n        integrate_begin Tue Mar  7      pmiller\n                        20:23:26 2000\n        integrate_pass  Tue Mar  7      pmiller\n                        20:27:42 2000\n\n\n\nProject \"srecord.1.5\", Change 12                                  Page 1\nChange Details                                  Sun Dec  3 19:50:06 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 3, Change 12.\n\nSUMMARY\n        error message prefix bug\n\nDESCRIPTION\n        This change fixed abug in the error message prefixes.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  lib/common/quit/prefix.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Mar  9      pmiller\n                        10:07:06 2000\n        develop_begin   Thu Mar  9      pmiller\n                        10:07:08 2000\n        develop_end     Thu Mar  9      pmiller\n                        10:11:00 2000\n        review_pass     Thu Mar  9      pmiller\n                        10:11:02 2000\n        integrate_begin Thu Mar  9      pmiller\n                        10:11:05 2000\n        integrate_pass  Thu Mar  9      pmiller\n                        10:14:19 2000\n\n\n\nProject \"srecord.1.5\", Change 13                                  Page 1\nChange Details                                  Sun Dec  3 19:50:08 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 4, Change 13.\n\nSUMMARY\n        verbose comparison\n\nDESCRIPTION\n        This change adds a -verbose option to the srec_cmp program, so\n        that it gives a summary of all the way in which the two files\n        differ, if they do.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.7 -> 1.8  include/interval.h\n        source  modify    1.8 -> 1.9  include/srec/memory.h\n        source  create    1.1         include/srec/memory/walker/\n                                      compare.h\n        source  modify    1.9 -> 1.10 lib/common/interval.cc\n        source  modify    1.9 -> 1.10 lib/srec/memory.cc\n        source  create    1.1         lib/srec/memory/walker/compare.cc\n        source  modify    1.6 -> 1.7  man/man1/srec_cmp.1\n        source  modify    1.6 -> 1.7  prog/srec_cmp/main.cc\n        test    create    1.1         test/00/t0040a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Apr  1      pmiller\n                        21:55:29 2000\n        develop_begin   Sat Apr  1      pmiller  Elapsed time: 1.000\n                        21:55:31 2000            days.\n        develop_end     Sun Apr  2      pmiller\n                        14:56:28 2000\n        review_pass     Sun Apr  2      pmiller\n                        14:56:34 2000\n        integrate_begin Sun Apr  2      pmiller  Elapsed time: 0.022\n                        14:56:38 2000            days.\n        integrate_pass  Sun Apr  2      pmiller\n                        15:06:42 2000\n\n\n\nProject \"srecord.1.5\", Change 14                                  Page 1\nChange Details                                  Sun Dec  3 19:50:10 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 5, Change 14.\n\nSUMMARY\n        2s complement checksum\n\nDESCRIPTION\n        This change adds a 2s complement checksum filter.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.20 -> 1.21 etc/README.man\n        source  modify    1.1 -> 1.2  etc/new.1.5.so\n        source  modify   1.29 -> 1.30 include/srec/arglex.h\n        source  modify    1.6 -> 1.7  include/srec/input/filter/\n                                      checksum.h\n        source  create    1.1         include/srec/input/filter/\n                                      checksum/bitnot.h\n        source  create    1.1         include/srec/input/filter/\n                                      checksum/negative.h\n        source  create    1.1         include/srec/input/filter/\n                                      checksum/positive.h\n        source  modify   1.30 -> 1.31 lib/srec/arglex.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/filter/checksum.cc\n        source  create    1.1         lib/srec/input/filter/checksum/\n                                      bitnot.cc\n        source  create    1.1         lib/srec/input/filter/checksum/\n                                      negative.cc\n        source  create    1.1         lib/srec/input/filter/checksum/\n                                      positive.cc\n        source  modify   1.27 -> 1.28 man/man1/o_input.so\n        test    create    1.1         test/00/t0050a.sh\n        test    create    1.1         test/00/t0051a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Apr  4      pmiller\n                        06:50:36 2000\n        develop_begin   Tue Apr  4      pmiller  Elapsed time: 1.000\n                        06:50:39 2000            days.\n        develop_end     Tue Apr  4      pmiller\n                        22:36:13 2000\n        review_pass     Tue Apr  4      pmiller\n                        22:36:15 2000\n        integrate_begin Tue Apr  4      pmiller\n                        22:36:18 2000\n\n\n\n\nProject \"srecord.1.5\", Change 14                                  Page 2\nChange Details                                  Sun Dec  3 19:50:10 2000\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_pass  Tue Apr  4      pmiller\n                        22:42:23 2000\n\n\n\nProject \"srecord.1.5\", Change 15                                  Page 1\nChange Details                                  Sun Dec  3 19:50:12 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 6, Change 15.\n\nSUMMARY\n        compare more efficient\n\nDESCRIPTION\n        This change makes the srec_cmp -verbose option more efficient,\n        so that it runs much faster for large files.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  lib/srec/memory/walker/compare.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Jun 13      pmiller\n                        12:38:41 2000\n        develop_begin   Tue Jun 13      pmiller\n                        12:38:43 2000\n        develop_end     Tue Jun 13      pmiller\n                        12:46:40 2000\n        review_pass     Tue Jun 13      pmiller\n                        12:46:43 2000\n        integrate_begin Tue Jun 13      pmiller\n                        12:46:45 2000\n        integrate_pass  Tue Jun 13      pmiller\n                        12:49:10 2000\n\n\n\nProject \"srecord.1.5\", Change 16                                  Page 1\nChange Details                                  Sun Dec  3 19:50:14 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 8, Change 16.\n\nSUMMARY\n        VHDL output\n\nDESCRIPTION\n        This change adds VHDL output format.\n\n        My thanks to Hendrik De Vloed <hendrik.devloed@barco.com> for\n        this contribution.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/new.1.5.so\n        source  modify   1.19 -> 1.20 etc/srecord.html\n        source  create    1.1         etc/x_defs_pack.vhd\n        source  modify   1.30 -> 1.31 include/srec/arglex.h\n        source  create    1.1         include/srec/output/file/vhdl.h\n        source  modify   1.31 -> 1.32 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/output/file/vhdl.cc\n        source  modify   1.15 -> 1.16 man/man1/srec_cat.1\n        test    create    1.1         test/00/t0052a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Aug 30      pmiller\n                        13:55:10 2000\n        develop_begin   Wed Aug 30      pmiller  Elapsed time: 30.494\n                        13:55:11 2000            days.\n        develop_end     Wed Oct 11      pmiller\n                        17:37:33 2000\n        review_pass     Wed Oct 11      pmiller\n                        17:37:47 2000\n        integrate_begin Wed Oct 11      pmiller\n                        17:37:50 2000\n        integrate_pass  Wed Oct 11      pmiller\n                        17:40:08 2000\n\n\n\nProject \"srecord.1.5\", Change 17                                  Page 1\nChange Details                                  Sun Dec  3 19:50:16 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 7, Change 17.\n\nSUMMARY\n        Windows NT\n\nDESCRIPTION\n        This change adds some instructions about Windows NT\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_improvement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.18 -> 1.19 etc/srecord.html\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Sep  5      pmiller\n                        10:10:04 2000\n        develop_begin   Tue Sep  5      pmiller  Elapsed time: 0.024\n                        10:10:04 2000            days.\n        develop_end     Tue Sep  5      pmiller\n                        10:21:04 2000\n        review_pass     Tue Sep  5      pmiller\n                        10:21:07 2000\n        integrate_begin Tue Sep  5      pmiller\n                        10:21:10 2000\n        integrate_pass  Tue Sep  5      pmiller\n                        10:22:24 2000\n\n\n\nProject \"srecord.1.5\", Change 18                                  Page 1\nChange Details                                  Sun Dec  3 19:50:17 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 9, Change 18.\n\nSUMMARY\n        crc16\n\nDESCRIPTION\n        This change adds a CRC 16 input filter (big endian and little\n        endian).\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.21 -> 1.22 etc/README.man\n        source  modify    1.3 -> 1.4  etc/new.1.5.so\n        source  modify   1.20 -> 1.21 etc/srecord.html\n        source  create    1.1         include/crc16.h\n        source  modify   1.31 -> 1.32 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/crc16.h\n        source  modify    1.9 -> 1.10 include/srec/memory.h\n        source  modify    1.6 -> 1.7  include/srec/memory/chunk.h\n        source  create    1.1         include/srec/memory/walker/crc16.h\n        source  create    1.1         lib/common/crc16.cc\n        source  modify   1.32 -> 1.33 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/crc16.cc\n        source  modify   1.10 -> 1.11 lib/srec/memory.cc\n        source  modify    1.6 -> 1.7  lib/srec/memory/chunk.cc\n        source  create    1.1         lib/srec/memory/walker/crc16.cc\n        source  modify   1.28 -> 1.29 man/man1/o_input.so\n        test    create    1.1         test/00/t0053a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Oct 12      pmiller\n                        11:12:00 2000\n        develop_begin   Thu Oct 12      pmiller  Elapsed time: 24.000\n                        11:12:01 2000            days.\n        develop_end     Tue Nov 14      pmiller\n                        21:28:42 2000\n        review_pass     Tue Nov 14      pmiller\n                        21:29:27 2000\n        integrate_begin Tue Nov 14      pmiller\n                        21:29:38 2000\n        integrate_      Tue Nov 14      pmiller\n        begin_undo      21:31:37 2000\n        develop_end_    Tue Nov 14      pmiller  Elapsed time: 0.050\n        undo            21:31:40 2000            days.\n\n\n\n\nProject \"srecord.1.5\", Change 18                                  Page 2\nChange Details                                  Sun Dec  3 19:50:17 2000\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        develop_end     Tue Nov 14      pmiller\n                        21:54:02 2000\n        review_pass     Tue Nov 14      pmiller\n                        21:54:13 2000\n        integrate_begin Tue Nov 14      pmiller  Elapsed time: 0.084\n                        21:54:48 2000            days.\n        integrate_pass  Tue Nov 14      pmiller\n                        22:32:41 2000\n\n\n\nProject \"srecord.1.5\", Change 19                                  Page 1\nChange Details                                  Sun Dec  3 19:50:20 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 10, Change 19.\n\nSUMMARY\n        crc32\n\nDESCRIPTION\n        This change adds a CRC 32 input filter (big endian and little\n        endian).\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.4 -> 1.5  etc/new.1.5.so\n        source  create    1.1         include/crc32.h\n        source  create    1.1         include/srec/input/filter/crc32.h\n        source  create    1.1         include/srec/memory/walker/crc32.h\n        source  create    1.1         lib/common/crc32.cc\n        source  modify   1.33 -> 1.34 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/crc32.cc\n        source  create    1.1         lib/srec/memory/walker/crc32.cc\n        source  modify   1.29 -> 1.30 man/man1/o_input.so\n        test    create    1.1         test/00/t0055a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Nov 16      pmiller  Cloned from change 18.\n                        16:14:46 2000\n        develop_begin   Thu Nov 16      pmiller  Elapsed time: 0.731\n                        16:14:47 2000            days.\n        develop_end     Thu Nov 16      pmiller\n                        21:43:35 2000\n        review_pass     Thu Nov 16      pmiller\n                        21:44:19 2000\n        integrate_begin Thu Nov 16      pmiller\n                        21:44:41 2000\n        integrate_fail  Thu Nov 16      pmiller  srec/input/filter/\n                        21:48:05 2000            crc32.h: No such file\n                                                 or directory\n        develop_end     Thu Nov 16      pmiller\n                        21:50:13 2000\n        review_pass     Thu Nov 16      pmiller\n                        21:50:30 2000\n        integrate_begin Thu Nov 16      pmiller\n                        21:50:33 2000\n        integrate_pass  Thu Nov 16      pmiller\n                        21:52:49 2000\n\n\n\nProject \"srecord.1.5\", Change 20                                  Page 1\nChange Details                                  Sun Dec  3 19:50:22 2000\n\nNAME\n        Project \"srecord.1.5\", Delta 11, Change 20.\n\nSUMMARY\n        C Array bug\n\nDESCRIPTION\n        This change fixes a bug in the C-Array output format.  Holes in\n        the input resulted in syntax errors in the output.\n\n        My thanks to Chris Maynard <Chris.Maynard@GTECH.COM> for\n        reporting this problem.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.9 -> 1.10 lib/srec/output/file/c.cc\n        test    create    1.1         test/00/t0056a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Nov 21      pmiller\n                        08:36:49 2000\n        develop_begin   Tue Nov 21      pmiller\n                        08:36:50 2000\n        develop_end     Tue Nov 21      pmiller  Elapsed time: 0.025\n                        08:46:05 2000            days.\n        review_pass     Tue Nov 21      pmiller\n                        08:57:30 2000\n        integrate_begin Tue Nov 21      pmiller\n                        08:57:33 2000\n        integrate_pass  Tue Nov 21      pmiller\n                        08:59:18 2000\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.6.txt",
    "content": "\n\n\nProject \"srecord.1.6\"                                             Page 1\nList of Changes                                 Mon Mar 19 11:02:24 2001\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       C Array\n  12    completed       build glitch\n  15    completed       allow overwriting\n  16    completed       Srec_cat --address-length\n  17    completed       documentation tweaks\n  18    completed       prepare to end branch\n  19    completed       build issues\n\n\n\nProject \"srecord.1.6\", Change 10                                  Page 1\nChange Details                                  Mon Mar 19 11:02:25 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares SRecord for the next public release.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_improvement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.5\n        source  modify   1.11 -> 1.12 etc/archive.cook\n        source  modify   1.11 -> 1.12 etc/documentation.cook\n        source  modify    1.6 -> 1.7  etc/new.1.5.so\n        source  create    1.1         etc/new.1.6.so\n        source  modify   1.22 -> 1.23 etc/srecord.html\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Dec  3      pmiller\n                        19:46:50 2000\n        develop_begin   Sun Dec  3      pmiller  Elapsed time: 0.031\n                        19:46:51 2000            days.\n        develop_end     Sun Dec  3      pmiller\n                        20:01:00 2000\n        review_pass     Sun Dec  3      pmiller\n                        20:01:03 2000\n        integrate_begin Sun Dec  3      pmiller\n                        20:01:06 2000\n        integrate_      Sun Dec  3      pmiller\n        begin_undo      20:04:11 2000\n        develop_end_    Sun Dec  3      pmiller  Elapsed time: 0.062\n        undo            20:04:19 2000            days.\n        develop_end     Sun Dec  3      pmiller  Elapsed time: 0.128\n                        20:32:13 2000            days.\n        review_pass     Sun Dec  3      pmiller\n                        21:29:44 2000\n        integrate_begin Sun Dec  3      pmiller  Elapsed time: 0.105\n                        21:29:47 2000            days.\n        integrate_pass  Sun Dec  3      pmiller\n                        22:17:00 2000\n\n\n\nProject \"srecord.1.6\", Change 11                                  Page 1\nChange Details                                  Mon Mar 19 11:02:27 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 2, Change 11.\n\nSUMMARY\n        C Array\n\nDESCRIPTION\n        This change fixes another bug in the C Array output.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by chain.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.11 -> 1.12 lib/srec/output/file/c.cc\n        test    create    1.1         test/00/t0057a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Dec  4      pmiller\n                        08:39:55 2000\n        develop_begin   Mon Dec  4      pmiller  Elapsed time: 0.114\n                        08:39:58 2000            days.\n        develop_end     Mon Dec  4      pmiller\n                        09:31:27 2000\n        review_pass     Mon Dec  4      pmiller\n                        09:31:42 2000\n        integrate_begin Mon Dec  4      pmiller  Elapsed time: 0.027\n                        09:31:45 2000            days.\n        integrate_pass  Mon Dec  4      pmiller\n                        09:43:45 2000\n\n\n\nProject \"srecord.1.6\", Change 12                                  Page 1\nChange Details                                  Mon Mar 19 11:02:29 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 3, Change 12.\n\nSUMMARY\n        build glitch\n\nDESCRIPTION\n        This change adds an include of <stddef.h> to include/srec/\n        memory/chunk.h because it cauased a build problem on some\n        platforms.\n\n        My thanks to Hendrik De Vloed <hendrik.devloed@barco.com> for\n        reporting this problem.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.8 -> 1.9  include/srec/memory/chunk.h\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Dec  7      pmiller\n                        08:10:21 2000\n        develop_begin   Thu Dec  7      pmiller\n                        08:10:21 2000\n        develop_end     Thu Dec  7      pmiller\n                        08:13:07 2000\n        review_pass     Thu Dec  7      pmiller\n                        08:13:40 2000\n        integrate_begin Thu Dec  7      pmiller\n                        08:13:43 2000\n        integrate_pass  Thu Dec  7      pmiller\n                        08:16:07 2000\n\n\n\nProject \"srecord.1.6\", Change 15                                  Page 1\nChange Details                                  Mon Mar 19 11:02:30 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 5, Change 15.\n\nSUMMARY\n        allow overwriting\n\nDESCRIPTION\n        This change adds an option so that locations in memory may be\n        overwritten.\n        There is a new --multiple option to the commands, which permits\n        an input file to contain multiple (contradictory) values for\n        some memory locations.  The last value in the file will be used.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/new.1.6.so\n        source  modify   1.33 -> 1.34 include/srec/arglex.h\n        source  modify   1.11 -> 1.12 include/srec/memory.h\n        source  modify   1.35 -> 1.36 lib/srec/arglex.cc\n        source  modify   1.12 -> 1.13 lib/srec/memory.cc\n        source  create    1.1         man/man1/o_multiple.so\n        source  modify   1.18 -> 1.19 man/man1/srec_cat.1\n        source  modify    1.8 -> 1.9  man/man1/srec_cmp.1\n        source  modify    1.4 -> 1.5  man/man1/srec_info.1\n        source  modify   1.13 -> 1.14 prog/srec_cat/main.cc\n        source  modify    1.8 -> 1.9  prog/srec_cmp/main.cc\n        source  modify    1.6 -> 1.7  prog/srec_info/main.cc\n        test    create    1.1         test/00/t0058a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Feb  7      pmiller\n                        07:47:04 2001\n        develop_begin   Wed Feb  7      pmiller  Elapsed time: 2.740\n                        07:47:05 2001            days.\n        develop_end     Fri Feb  9      pmiller\n                        13:20:18 2001\n        review_pass     Fri Feb  9      pmiller\n                        13:20:21 2001\n        integrate_begin Fri Feb  9      pmiller\n                        13:20:25 2001\n        integrate_pass  Fri Feb  9      pmiller\n                        13:25:42 2001\n\n\n\nProject \"srecord.1.6\", Change 16                                  Page 1\nChange Details                                  Mon Mar 19 11:02:32 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 4, Change 16.\n\nSUMMARY\n        Srec_cat --address-length\n\nDESCRIPTION\n        This change adds the srec_cat --address-length option, used to\n        force the minimum address length of the output format, if\n        possible.  Some output formats to do permit this.\n\n        My thanks to Steve Ferree <s.ferree@cummins.com> for this\n        suggestion.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/new.1.6.so\n        source  modify    1.8 -> 1.9  include/srec/output.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/ascii_\n                                      hex.h\n        source  modify    1.9 -> 1.10 include/srec/output/file/binary.h\n        source  modify    1.8 -> 1.9  include/srec/output/file/c.h\n        source  modify   1.10 -> 1.11 include/srec/output/file/intel.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/mos_\n                                      tech.h\n        source  modify    1.8 -> 1.9  include/srec/output/file/srecord.h\n        source  modify    1.8 -> 1.9  include/srec/output/file/\n                                      tektronix.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/\n                                      tektronix_extended.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/ti_\n                                      tagged.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/vhdl.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/wilson.h\n        source  modify    1.2 -> 1.3  lib/srec/output/file/ascii_hex.cc\n        source  modify    1.9 -> 1.10 lib/srec/output/file/binary.cc\n        source  modify   1.12 -> 1.13 lib/srec/output/file/c.cc\n        source  modify   1.11 -> 1.12 lib/srec/output/file/intel.cc\n        source  remove    1.2         lib/srec/output/file/man/man5/\n                                      srec_ti_tagged.5\n        source  modify    1.2 -> 1.3  lib/srec/output/file/mos_tech.cc\n        source  modify   1.10 -> 1.11 lib/srec/output/file/srecord.cc\n        source  modify    1.9 -> 1.10 lib/srec/output/file/tektronix.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/tektronix_\n                                      extended.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/ti_tagged.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/vhdl.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file/wilson.cc\n\n\n\nProject \"srecord.1.6\", Change 16                                  Page 2\nChange Details                                  Mon Mar 19 11:02:32 2001\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.17 -> 1.18 man/man1/srec_cat.1\n        source  modify    1.3 -> 1.4  prog/srec_cat/arglex3.cc\n        source  modify    1.3 -> 1.4  prog/srec_cat/arglex3.h\n        source  modify   1.12 -> 1.13 prog/srec_cat/main.cc\n        test    create    1.1         test/00/t0059a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Feb  9      pmiller\n                        08:50:43 2001\n        develop_begin   Fri Feb  9      pmiller  Elapsed time: 0.553\n                        08:50:45 2001            days.\n        develop_end     Fri Feb  9      pmiller\n                        12:59:28 2001\n        review_pass     Fri Feb  9      pmiller\n                        12:59:32 2001\n        integrate_begin Fri Feb  9      pmiller\n                        12:59:36 2001\n        integrate_      Fri Feb  9      pmiller\n        begin_undo      13:00:03 2001\n        develop_end_    Fri Feb  9      pmiller\n        undo            13:01:07 2001\n        develop_end     Fri Feb  9      pmiller\n                        13:06:52 2001\n        review_pass     Fri Feb  9      pmiller\n                        13:08:27 2001\n        integrate_begin Fri Feb  9      pmiller\n                        13:08:30 2001\n        integrate_pass  Fri Feb  9      pmiller\n                        13:12:32 2001\n\n\n\nProject \"srecord.1.6\", Change 17                                  Page 1\nChange Details                                  Mon Mar 19 11:02:36 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 6, Change 17.\n\nSUMMARY\n        documentation tweaks\n\nDESCRIPTION\n        This change fixes some of the documentation, particularly\n        removing the last few references to .ps.gz files (replaced by\n        pdf).\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.5 -> 1.6  etc/BUILDING.man\n        source  modify   1.14 -> 1.15 etc/Howto.cook\n        source  modify   1.23 -> 1.24 etc/README.man\n        source  modify   1.12 -> 1.13 etc/documentation.cook\n        source  modify    1.3 -> 1.4  etc/new.1.6.so\n        source  create    1.1         etc/page-list.awk\n        source  modify    1.2 -> 1.3  etc/ref-toc.so\n        source  modify    1.4 -> 1.5  etc/reference.man\n        source  modify   1.10 -> 1.11 etc/srecord.lsm\n        source  modify    1.3 -> 1.4  include/srec/input/file/wilson.h\n        source  modify    1.3 -> 1.4  include/srec/output/file/wilson.h\n        source  modify    1.3 -> 1.4  lib/srec/input/file/wilson.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/wilson.cc\n        source  modify    1.2 -> 1.3  man/man5/srec_ascii_hex.5\n        source  modify    1.7 -> 1.8  man/man5/srec_intel.5\n        source  modify    1.7 -> 1.8  man/man5/srec_motorola.5\n        source  modify    1.2 -> 1.3  man/man5/srec_ti_tagged.5\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Feb  9      pmiller\n                        13:35:14 2001\n        develop_begin   Fri Feb  9      pmiller  Elapsed time: 24.000\n                        13:35:15 2001            days.\n        develop_end     Thu Mar 15      pmiller\n                        09:07:05 2001\n        develop_end_    Thu Mar 15      pmiller\n        undo            09:10:04 2001\n        develop_end     Thu Mar 15      pmiller\n                        09:17:33 2001\n\n\n\nProject \"srecord.1.6\", Change 17                                  Page 2\nChange Details                                  Mon Mar 19 11:02:36 2001\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        review_pass     Thu Mar 15      pmiller\n                        09:17:38 2001\n        integrate_begin Thu Mar 15      pmiller\n                        09:17:41 2001\n        integrate_pass  Thu Mar 15      pmiller\n                        09:20:10 2001\n\n\n\nProject \"srecord.1.6\", Change 18                                  Page 1\nChange Details                                  Mon Mar 19 11:02:39 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 7, Change 18.\n\nSUMMARY\n        prepare to end branch\n\nDESCRIPTION\n        This change fixes a couple of problems found when attempting to\n        end the branch.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.15 -> 1.16 etc/Howto.cook\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Mar 19      pmiller\n                        08:44:38 2001\n        develop_begin   Mon Mar 19      pmiller  Elapsed time: 0.130\n                        08:44:39 2001            days.\n        develop_end     Mon Mar 19      pmiller\n                        09:43:11 2001\n        review_pass     Mon Mar 19      pmiller  Elapsed time: 0.060\n                        09:43:12 2001            days.\n        integrate_begin Mon Mar 19      pmiller\n                        10:10:06 2001\n        integrate_pass  Mon Mar 19      pmiller\n                        10:12:03 2001\n\n\n\nProject \"srecord.1.6\", Change 19                                  Page 1\nChange Details                                  Mon Mar 19 11:02:40 2001\n\nNAME\n        Project \"srecord.1.6\", Delta 8, Change 19.\n\nSUMMARY\n        build issues\n\nDESCRIPTION\n        This change fixes some build problems.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.16 -> 1.17 etc/Howto.cook\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Mar 19      pmiller\n                        10:20:06 2001\n        develop_begin   Mon Mar 19      pmiller\n                        10:20:07 2001\n        develop_end     Mon Mar 19      pmiller\n                        10:22:36 2001\n        review_pass     Mon Mar 19      pmiller\n                        10:22:39 2001\n        integrate_begin Mon Mar 19      pmiller\n                        10:22:42 2001\n        integrate_pass  Mon Mar 19      pmiller\n                        10:24:16 2001\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.7.txt",
    "content": "\n\n\nProject \"srecord.1.7\"                                             Page 1\nList of Changes                                 Mon Apr 30 21:23:01 2001\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       web moved\n  12    completed       CRC error messages bug\n  15    completed       memory bug\n  16    completed       build glitch\n  17    completed       bit-wise not filter\n  18    completed       crc32, again\n  19    completed       unfill\n\n\n\nProject \"srecord.1.7\", Change 10                                  Page 1\nChange Details                                  Mon Apr 30 21:23:02 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares SRecord for its next public release.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.6\n        source  create    1.1         etc/new.1.7.so\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Mar 19      pmiller\n                        10:48:13 2001\n        develop_begin   Mon Mar 19      pmiller  Elapsed time: 0.053\n                        10:48:14 2001            days.\n        develop_end     Mon Mar 19      pmiller\n                        11:12:06 2001\n        review_pass     Mon Mar 19      pmiller\n                        11:12:09 2001\n        integrate_begin Mon Mar 19      pmiller\n                        11:12:13 2001\n        integrate_pass  Mon Mar 19      pmiller\n                        11:14:42 2001\n\n\n\nProject \"srecord.1.7\", Change 11                                  Page 1\nChange Details                                  Mon Apr 30 21:23:04 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 2, Change 11.\n\nSUMMARY\n        web moved\n\nDESCRIPTION\n        This change updates the web pages to cope with a small move of\n        the files.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.7 -> 1.8  etc/BUILDING.man\n        source  modify   1.25 -> 1.26 etc/README.man\n        source  modify   1.10 -> 1.11 etc/spec.sh\n        source  modify   1.24 -> 1.25 etc/srecord.html\n        source  modify   1.12 -> 1.13 etc/srecord.lsm\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Mar 19      pmiller\n                        11:37:02 2001\n        develop_begin   Mon Mar 19      pmiller\n                        11:37:03 2001\n        develop_end     Mon Mar 19      pmiller\n                        11:46:25 2001\n        review_pass     Mon Mar 19      pmiller  Elapsed time: 0.233\n                        11:46:25 2001            days.\n        integrate_begin Mon Mar 19      pmiller\n                        13:31:14 2001\n        integrate_pass  Mon Mar 19      pmiller\n                        13:32:41 2001\n\n\n\nProject \"srecord.1.7\", Change 12                                  Page 1\nChange Details                                  Mon Apr 30 21:23:05 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 3, Change 12.\n\nSUMMARY\n        CRC error messages bug\n\nDESCRIPTION\n        This change fixed a problem with the error reporting in the\n        CRC16 and CRC32 filter classes.\n\n        My thanks to Dimitris Beletsiotis <dbele@intracom.gr> for\n        reporting this problem.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.9 -> 1.10 include/srec/input/filter.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/and.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/byte_\n                                      swap.h\n        source  modify    1.8 -> 1.9  include/srec/input/filter/\n                                      checksum.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      checksum/bitnot.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      checksum/negative.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/\n                                      checksum/positive.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/crc16.h\n        source  modify    1.2 -> 1.3  include/srec/input/filter/crc32.h\n        source  modify    1.7 -> 1.8  include/srec/input/filter/crop.h\n        source  modify    1.6 -> 1.7  include/srec/input/filter/fill.h\n        source  modify    1.7 -> 1.8  include/srec/input/filter/length.h\n        source  modify    1.6 -> 1.7  include/srec/input/filter/\n                                      maximum.h\n        source  modify    1.6 -> 1.7  include/srec/input/filter/\n                                      minimum.h\n        source  modify    1.6 -> 1.7  include/srec/input/filter/offset.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/or.h\n        source  modify    1.6 -> 1.7  include/srec/input/filter/split.h\n        source  modify    1.6 -> 1.7  include/srec/input/filter/\n                                      unsplit.h\n        source  modify    1.4 -> 1.5  include/srec/input/filter/xor.h\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/and.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/byte_swap.cc\n\n\n\nProject \"srecord.1.7\", Change 12                                  Page 2\nChange Details                                  Mon Apr 30 21:23:05 2001\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.8 -> 1.9  lib/srec/input/filter/checksum.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/checksum/\n                                      bitnot.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/checksum/\n                                      negative.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/checksum/\n                                      positive.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/crc16.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/filter/crc32.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/filter/crop.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/filter/fill.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/filter/length.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/filter/maximum.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/filter/minimum.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/filter/offset.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/or.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/filter/split.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/filter/unsplit.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/filter/xor.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Apr 24      pmiller\n                        07:49:06 2001\n        develop_begin   Tue Apr 24      pmiller  Elapsed time: 0.343\n                        07:49:07 2001            days.\n        develop_end     Tue Apr 24      pmiller\n                        10:23:31 2001\n        review_pass     Tue Apr 24      pmiller\n                        10:26:28 2001\n        integrate_begin Tue Apr 24      pmiller\n                        10:26:31 2001\n        integrate_pass  Tue Apr 24      pmiller\n                        10:29:57 2001\n\n\n\nProject \"srecord.1.7\", Change 15                                  Page 1\nChange Details                                  Mon Apr 30 21:23:10 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 4, Change 15.\n\nSUMMARY\n        memory bug\n\nDESCRIPTION\n        This change fixes a bug in the memory chunk iterator code.  This\n        affected CRC16 and CRC32 functionality.\n\n        My thanks to Dimitris Beletsiotis <dbele@intracom.gr> for\n        reporting this problem.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.8 -> 1.9  lib/srec/memory/chunk.cc\n        test    create    1.1         test/00/t0060a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Apr 26      pmiller\n                        08:44:28 2001\n        develop_begin   Thu Apr 26      pmiller  Elapsed time: 0.127\n                        08:44:30 2001            days.\n        develop_end     Thu Apr 26      pmiller\n                        09:41:51 2001\n        review_pass     Thu Apr 26      pmiller\n                        09:42:02 2001\n        integrate_begin Thu Apr 26      pmiller\n                        09:42:05 2001\n        integrate_pass  Thu Apr 26      pmiller\n                        09:44:05 2001\n\n\n\nProject \"srecord.1.7\", Change 16                                  Page 1\nChange Details                                  Mon Apr 30 21:23:11 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 5, Change 16.\n\nSUMMARY\n        build glitch\n\nDESCRIPTION\n        This change fixes a couple of build problems.  My thanks to\n        Holger Mueller <hmueller@sitronic.com> for reporting them.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.11 -> 1.12 etc/spec.sh\n        source  modify    1.7 -> 1.8  lib/srec/record.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Apr 26      pmiller\n                        12:40:24 2001\n        develop_begin   Thu Apr 26      pmiller  Elapsed time: 0.068\n                        12:40:27 2001            days.\n        develop_end     Thu Apr 26      pmiller\n                        13:11:08 2001\n        review_pass     Thu Apr 26      pmiller\n                        13:11:11 2001\n        integrate_begin Thu Apr 26      pmiller\n                        13:11:14 2001\n        integrate_pass  Thu Apr 26      pmiller\n                        13:13:22 2001\n\n\n\nProject \"srecord.1.7\", Change 17                                  Page 1\nChange Details                                  Mon Apr 30 21:23:13 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 6, Change 17.\n\nSUMMARY\n        bit-wise not filter\n\nDESCRIPTION\n        This change adds a bit-wise not filter.\n\n        My thanks to Holger Mueller <hmueller@sitronic.com> for this\n        contribution.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/new.1.7.so\n        source  modify   1.35 -> 1.36 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/not.h\n        source  modify   1.37 -> 1.38 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/not.cc\n        source  modify   1.31 -> 1.32 man/man1/o_input.so\n        test    create    1.1         test/00/t0061a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Apr 27      pmiller\n                        08:46:44 2001\n        develop_begin   Fri Apr 27      pmiller  Elapsed time: 0.083\n                        08:46:46 2001            days.\n        develop_end     Fri Apr 27      pmiller\n                        09:24:06 2001\n        review_pass     Fri Apr 27      pmiller\n                        09:25:24 2001\n        integrate_begin Fri Apr 27      pmiller\n                        09:25:26 2001\n        integrate_pass  Fri Apr 27      pmiller\n                        09:28:03 2001\n\n\n\nProject \"srecord.1.7\", Change 18                                  Page 1\nChange Details                                  Mon Apr 30 21:23:15 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 7, Change 18.\n\nSUMMARY\n        crc32, again\n\nDESCRIPTION\n        This change fixes a bug in the CRC16 and CRC32 calculations. The\n        code on which the implementation was originally based was wrong.\n        This implementation produces results which agree with many\n        implementations available on the Internet.\n\n        My thanks to Dimitris Beletsiotis\" <dbele@intracom.gr> for\n        reporting this problem.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  include/crc16.h\n        source  modify    1.2 -> 1.3  include/crc32.h\n        source  modify    1.2 -> 1.3  lib/common/crc16.cc\n        source  modify    1.2 -> 1.3  lib/common/crc32.cc\n        source  modify    1.2 -> 1.3  lib/srec/memory/walker/crc16.cc\n        source  modify    1.2 -> 1.3  lib/srec/memory/walker/crc32.cc\n        test    modify    1.2 -> 1.3  test/00/t0053a.sh\n        test    modify    1.2 -> 1.3  test/00/t0055a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sun Apr 29      pmiller\n                        09:16:08 2001\n        develop_begin   Sun Apr 29      pmiller  Elapsed time: 1.160\n                        09:16:09 2001            days.\n        develop_end     Mon Apr 30      pmiller\n                        10:28:19 2001\n        review_pass     Mon Apr 30      pmiller\n                        10:28:23 2001\n        integrate_begin Mon Apr 30      pmiller\n                        10:28:26 2001\n        integrate_pass  Mon Apr 30      pmiller\n                        10:31:13 2001\n\n\n\nProject \"srecord.1.7\", Change 19                                  Page 1\nChange Details                                  Mon Apr 30 21:23:17 2001\n\nNAME\n        Project \"srecord.1.7\", Delta 8, Change 19.\n\nSUMMARY\n        unfill\n\nDESCRIPTION\n        This change adds the unfill filter, used to reverse the effects\n        of the \"fill\" filter.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/new.1.7.so\n        source  modify   1.36 -> 1.37 include/srec/arglex.h\n        source  create    1.1         include/srec/input/filter/unfill.h\n        source  modify   1.38 -> 1.39 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/input/filter/unfill.cc\n        source  modify   1.32 -> 1.33 man/man1/o_input.so\n        source  modify   1.20 -> 1.21 man/man1/srec_cat.1\n        test    create    1.1         test/00/t0062a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Apr 30      pmiller\n                        10:36:03 2001\n        develop_begin   Mon Apr 30      pmiller  Elapsed time: 0.122\n                        10:36:04 2001            days.\n        develop_end     Mon Apr 30      pmiller\n                        11:30:58 2001\n        review_pass     Mon Apr 30      pmiller\n                        11:33:47 2001\n        integrate_begin Mon Apr 30      pmiller\n                        11:33:50 2001\n        integrate_pass  Mon Apr 30      pmiller\n                        11:37:56 2001\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.8.txt",
    "content": "\n\n\nProject \"srecord.1.8\"                                             Page 1\nList of Changes                                 Tue Nov 27 10:01:35 2001\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       hex addresses from srec_cmp -v\n  12    completed       spasm\n  15    completed       tektronix bug\n  16    completed       tektronix, again\n  17    completed       djgpp\n  18    completed       fill bug\n  19    completed       Atmel Generic format\n  20    completed       preserve headers\n  21    completed       FPC file format\n  22    completed       signetics format\n  23    completed       doxygen\n  25    completed       emon52\n  26    completed       output address range checking\n  27    completed       dec binary format\n  28    completed       header option\n\n\n\nProject \"srecord.1.8\", Change 10                                  Page 1\nChange Details                                  Tue Nov 27 10:01:35 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares SRecord for the next public release.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.7\n        source  modify    1.4 -> 1.5  etc/new.1.7.so\n        source  create    1.1         etc/new.1.8.so\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Apr 30      pmiller\n                        21:22:08 2001\n        develop_begin   Mon Apr 30      pmiller\n                        21:22:09 2001\n        develop_end     Mon Apr 30      pmiller\n                        21:27:46 2001\n        review_pass     Mon Apr 30      pmiller\n                        21:27:52 2001\n        integrate_begin Mon Apr 30      pmiller\n                        21:27:55 2001\n        integrate_pass  Mon Apr 30      pmiller\n                        21:32:00 2001\n\n\n\nProject \"srecord.1.8\", Change 11                                  Page 1\nChange Details                                  Tue Nov 27 10:01:35 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 2, Change 11.\n\nSUMMARY\n        hex addresses from srec_cmp -v\n\nDESCRIPTION\n        This change causes srec_cmp -v to emit hexadecimal addresses,\n        rather than decimals ones.  This is usually more useful.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.11 -> 1.12 lib/common/interval.cc\n        source  modify    1.3 -> 1.4  lib/srec/memory/walker/compare.cc\n        source  modify   1.10 -> 1.11 prog/srec_cmp/main.cc\n        test    modify    1.2 -> 1.3  test/00/t0040a.sh\n        test    modify    1.2 -> 1.3  test/00/t0060a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue May 15      pmiller\n                        11:50:03 2001\n        develop_begin   Tue May 15      pmiller  Elapsed time: 0.098\n                        11:50:04 2001            days.\n        develop_end     Tue May 15      pmiller\n                        12:34:06 2001\n        review_pass     Tue May 15      pmiller\n                        12:34:09 2001\n        integrate_begin Tue May 15      pmiller  Elapsed time: 0.182\n                        12:34:12 2001            days.\n        integrate_pass  Tue May 15      pmiller\n                        13:55:57 2001\n\n\n\nProject \"srecord.1.8\", Change 12                                  Page 1\nChange Details                                  Tue Nov 27 10:01:35 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 3, Change 12.\n\nSUMMARY\n        spasm\n\nDESCRIPTION\n        This change adds the SPASM format for reading and writing.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.27 -> 1.28 etc/README.man\n        source  modify   1.26 -> 1.27 etc/srecord.html\n        source  modify   1.38 -> 1.39 include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/spasm.h\n        source  modify   1.10 -> 1.11 include/srec/output/file/c.h\n        source  create    1.1         include/srec/output/file/spasm.h\n        source  modify   1.40 -> 1.41 lib/srec/arglex.cc\n        source  create    1.1         lib/srec/arglex_output.cc\n        source  modify    1.2 -> 1.3  lib/srec/input/file/guess.cc\n        source  create    1.1         lib/srec/input/file/spasm.cc\n        source  create    1.1         lib/srec/output/file/spasm.cc\n        source  modify   1.34 -> 1.35 man/man1/o_input.so\n        source  modify   1.22 -> 1.23 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_spasm.5\n        test    create    1.1         test/00/t0063a.sh\n        test    create    1.1         test/00/t0065a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu May 24      pmiller\n                        09:20:52 2001\n        develop_begin   Thu May 24      pmiller  Elapsed time: 0.391\n                        09:20:53 2001            days.\n        develop_end     Thu May 24      pmiller\n                        12:16:59 2001\n        review_pass     Thu May 24      pmiller\n                        12:17:02 2001\n        integrate_begin Thu May 24      pmiller\n                        12:17:05 2001\n        integrate_pass  Thu May 24      pmiller\n                        12:20:09 2001\n\n\n\nProject \"srecord.1.8\", Change 15                                  Page 1\nChange Details                                  Tue Nov 27 10:01:35 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 4, Change 15.\n\nSUMMARY\n        tektronix bug\n\nDESCRIPTION\n        This change fixed a bug in the Tektronix file format. It was\n        checksumming bytes when it should have checksummed nybbles.\n\n        My thanks to Jim Purcell <jim@needhams.com> for reporting this\n        problem.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.1 -> 1.2  etc/new.1.8.so\n        source  modify    1.8 -> 1.9  include/srec/input/file/\n                                      tektronix.h\n        source  modify   1.10 -> 1.11 include/srec/output/file/\n                                      tektronix.h\n        source  modify    1.9 -> 1.10 lib/srec/input/file/tektronix.cc\n        source  modify   1.11 -> 1.12 lib/srec/output/file/tektronix.cc\n        source  modify    1.6 -> 1.7  man/man5/srec_tektronix.5\n        test    modify    1.4 -> 1.5  test/00/t0019a.sh\n        test    modify    1.4 -> 1.5  test/00/t0020a.sh\n        test    modify    1.4 -> 1.5  test/00/t0023a.sh\n        test    modify    1.4 -> 1.5  test/00/t0032a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu May 24      pmiller\n                        12:21:15 2001\n        develop_begin   Thu May 24      pmiller  Elapsed time: 0.063\n                        12:21:17 2001            days.\n        develop_end     Thu May 24      pmiller\n                        12:49:36 2001\n        review_pass     Thu May 24      pmiller\n                        12:49:39 2001\n        integrate_begin Thu May 24      pmiller\n                        12:49:42 2001\n        integrate_pass  Thu May 24      pmiller\n                        12:52:13 2001\n\n\n\nProject \"srecord.1.8\", Change 16                                  Page 1\nChange Details                                  Tue Nov 27 10:01:35 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 5, Change 16.\n\nSUMMARY\n        tektronix, again\n\nDESCRIPTION\n        This change fixes a typo in the tektronix output class.\n\n        My thanks to Jim Purcell <jim@needhams.com> for his assistance\n        in finding this bug.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by chain.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.12 -> 1.13 lib/srec/output/file/tektronix.cc\n        test    create    1.1         test/00/t0066a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri May 25      pmiller\n                        06:53:52 2001\n        develop_begin   Fri May 25      pmiller  Elapsed time: 0.034\n                        06:53:53 2001            days.\n        develop_end     Fri May 25      pmiller\n                        07:09:19 2001\n        review_pass     Fri May 25      pmiller\n                        07:09:24 2001\n        integrate_begin Fri May 25      pmiller\n                        07:09:29 2001\n        integrate_pass  Fri May 25      pmiller\n                        07:11:39 2001\n\n\n\nProject \"srecord.1.8\", Change 17                                  Page 1\nChange Details                                  Tue Nov 27 10:01:35 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 6, Change 17.\n\nSUMMARY\n        djgpp\n\nDESCRIPTION\n        This change adds a note to the documentation about DJGPP.\n        My thanks to Shankar Chakkere <shankar_\n        chakkere@denro.littonas.com> for this information.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_improvement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.9 -> 1.10 etc/BUILDING.man\n        source  modify   1.28 -> 1.29 etc/README.man\n        source  modify   1.27 -> 1.28 etc/srecord.html\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Jul 18      pmiller\n                        08:17:00 2001\n        develop_begin   Wed Jul 18      pmiller  Elapsed time: 0.032\n                        08:17:01 2001            days.\n        develop_end     Wed Jul 18      pmiller\n                        08:31:22 2001\n        review_pass     Wed Jul 18      pmiller\n                        08:34:45 2001\n        integrate_begin Wed Jul 18      pmiller\n                        08:34:55 2001\n        integrate_pass  Wed Jul 18      pmiller\n                        08:37:32 2001\n\n\n\nProject \"srecord.1.8\", Change 18                                  Page 1\nChange Details                                  Tue Nov 27 10:01:35 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 7, Change 18.\n\nSUMMARY\n        fill bug\n\nDESCRIPTION\n        This change fixes a bug filling intel hex files. It turns out\n        that a number of filters, not just the fill filter, assume that\n        the termination record is the last record in the file. For some\n        formats this is not true, so they have been re-coded without\n        this assumption. The \"termination\" record has been renamed the\n        \"execution start address\" record, to more accurately refect\n        what it does, and to remove the expectation that it is the last\n        record in the file.\n\n        My thanks to Neil Viberg <Neil.Viberg@cmcelectronics.ca> for\n        reporting this problem.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.10 -> 1.11 include/srec/input/filter/\n                                      checksum.h\n        source  modify    1.8 -> 1.9  include/srec/input/filter/fill.h\n        source  modify    1.9 -> 1.10 include/srec/input/filter/length.h\n        source  modify    1.8 -> 1.9  include/srec/input/filter/\n                                      maximum.h\n        source  modify    1.8 -> 1.9  include/srec/input/filter/\n                                      minimum.h\n        source  modify   1.12 -> 1.13 include/srec/record.h\n        source  modify   1.12 -> 1.13 lib/srec/input/file/intel.cc\n        source  modify   1.11 -> 1.12 lib/srec/input/file/srecord.cc\n        source  modify   1.10 -> 1.11 lib/srec/input/file/tektronix.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/file/tektronix_\n                                      extended.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/file/wilson.cc\n        source  modify   1.10 -> 1.11 lib/srec/input/filter/checksum.cc\n        source  modify    1.9 -> 1.10 lib/srec/input/filter/crop.cc\n        source  modify    1.9 -> 1.10 lib/srec/input/filter/fill.cc\n        source  modify    1.9 -> 1.10 lib/srec/input/filter/length.cc\n        source  modify    1.8 -> 1.9  lib/srec/input/filter/maximum.cc\n        source  modify    1.8 -> 1.9  lib/srec/input/filter/minimum.cc\n        source  modify   1.14 -> 1.15 lib/srec/memory.cc\n        source  modify    1.9 -> 1.10 lib/srec/output.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/ascii_hex.cc\n        source  modify   1.14 -> 1.15 lib/srec/output/file/c.cc\n        source  modify   1.13 -> 1.14 lib/srec/output/file/intel.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/mos_tech.cc\n\n\n\nProject \"srecord.1.8\", Change 18                                  Page 2\nChange Details                                  Tue Nov 27 10:01:35 2001\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.12 -> 1.13 lib/srec/output/file/srecord.cc\n        source  modify   1.13 -> 1.14 lib/srec/output/file/tektronix.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/tektronix_\n                                      extended.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/ti_tagged.cc\n        source  modify    1.4 -> 1.5  lib/srec/output/file/vhdl.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file/wilson.cc\n        source  modify    1.8 -> 1.9  prog/srec_info/main.cc\n        test    create    1.1         test/00/t0067a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Wed Aug 22      pmiller\n                        10:07:43 2001\n        develop_begin   Wed Aug 22      pmiller  Elapsed time: 0.502\n                        10:07:44 2001            days.\n        develop_end     Wed Aug 22      pmiller\n                        13:53:27 2001\n        review_pass     Wed Aug 22      pmiller\n                        13:53:30 2001\n        integrate_begin Wed Aug 22      pmiller  Elapsed time: 0.068\n                        13:53:32 2001            days.\n        integrate_pass  Wed Aug 22      pmiller\n                        14:24:09 2001\n\n\n\nProject \"srecord.1.8\", Change 19                                  Page 1\nChange Details                                  Tue Nov 27 10:01:36 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 8, Change 19.\n\nSUMMARY\n        Atmel Generic format\n\nDESCRIPTION\n        This change adds the ATMEL Generic file format for input and\n        output.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.29 -> 1.30 etc/README.man\n        source  modify    1.2 -> 1.3  etc/new.1.8.so\n        source  modify   1.28 -> 1.29 etc/srecord.html\n        source  modify   1.39 -> 1.40 include/srec/arglex.h\n        source  modify   1.16 -> 1.17 include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/atmel_\n                                      generic.h\n        source  modify   1.15 -> 1.16 include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/atmel_\n                                      generic.h\n        source  modify   1.41 -> 1.42 lib/srec/arglex.cc\n        source  modify    1.1 -> 1.2  lib/srec/arglex_output.cc\n        source  modify   1.17 -> 1.18 lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/atmel_\n                                      generic.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/file/guess.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/spasm.cc\n        source  modify   1.16 -> 1.17 lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/atmel_\n                                      generic.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file/spasm.cc\n        source  modify   1.35 -> 1.36 man/man1/o_input.so\n        source  modify   1.23 -> 1.24 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_atmel_generic.5\n        source  modify    1.1 -> 1.2  man/man5/srec_spasm.5\n        test    create    1.1         test/00/t0068a.sh\n        test    create    1.1         test/00/t0069a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Sep  4      pmiller\n                        13:10:02 2001\n        develop_begin   Tue Sep  4      pmiller  Elapsed time: 0.984\n                        13:10:03 2001            days.\n\n\n\n\nProject \"srecord.1.8\", Change 19                                  Page 2\nChange Details                                  Tue Nov 27 10:01:36 2001\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        develop_end     Tue Sep  4      pmiller\n                        20:33:04 2001\n        review_pass     Tue Sep  4      pmiller\n                        20:33:08 2001\n        integrate_begin Tue Sep  4      pmiller\n                        20:33:11 2001\n        integrate_pass  Tue Sep  4      pmiller\n                        20:41:18 2001\n\n\n\nProject \"srecord.1.8\", Change 20                                  Page 1\nChange Details                                  Tue Nov 27 10:01:36 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 9, Change 20.\n\nSUMMARY\n        preserve headers\n\nDESCRIPTION\n        This change preserves headers as they are processed by srec_cat.\n        It also improves the header handling in the TI-tagged format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.3 -> 1.4  etc/new.1.8.so\n        source  modify   1.13 -> 1.14 include/srec/memory.h\n        source  modify   1.10 -> 1.11 include/srec/output.h\n        source  modify    1.3 -> 1.4  lib/srec/input/file/ti_tagged.cc\n        source  modify   1.15 -> 1.16 lib/srec/memory.cc\n        source  modify   1.10 -> 1.11 lib/srec/output.cc\n        source  modify    1.5 -> 1.6  lib/srec/output/file/ascii_hex.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file/atmel_\n                                      generic.cc\n        source  modify   1.11 -> 1.12 lib/srec/output/file/binary.cc\n        source  modify   1.15 -> 1.16 lib/srec/output/file/c.cc\n        source  modify   1.14 -> 1.15 lib/srec/output/file/intel.cc\n        source  modify    1.5 -> 1.6  lib/srec/output/file/mos_tech.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/spasm.cc\n        source  modify   1.13 -> 1.14 lib/srec/output/file/srecord.cc\n        source  modify   1.14 -> 1.15 lib/srec/output/file/tektronix.cc\n        source  modify    1.5 -> 1.6  lib/srec/output/file/tektronix_\n                                      extended.cc\n        source  modify    1.5 -> 1.6  lib/srec/output/file/ti_tagged.cc\n        source  modify    1.5 -> 1.6  lib/srec/output/file/vhdl.cc\n        source  modify    1.7 -> 1.8  lib/srec/output/file/wilson.cc\n        source  modify   1.15 -> 1.16 prog/srec_cat/main.cc\n        test    modify    1.4 -> 1.5  test/00/t0010a.sh\n        test    modify    1.2 -> 1.3  test/00/t0036a.sh\n        test    modify    1.2 -> 1.3  test/00/t0056a.sh\n        test    modify    1.2 -> 1.3  test/00/t0057a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Nov 23      pmiller\n                        09:55:34 2001\n        develop_begin   Fri Nov 23      pmiller  Elapsed time: 0.797\n                        09:55:34 2001            days.\n        develop_end     Fri Nov 23      pmiller\n                        15:54:06 2001\n\n\n\nProject \"srecord.1.8\", Change 20                                  Page 2\nChange Details                                  Tue Nov 27 10:01:36 2001\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        review_pass     Fri Nov 23      pmiller\n                        15:54:10 2001\n        integrate_begin Fri Nov 23      pmiller\n                        15:54:12 2001\n        integrate_pass  Fri Nov 23      pmiller\n                        15:56:29 2001\n\n\n\nProject \"srecord.1.8\", Change 21                                  Page 1\nChange Details                                  Tue Nov 27 10:01:36 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 10, Change 21.\n\nSUMMARY\n        FPC file format\n\nDESCRIPTION\n        This change adds the Four Packed Code (FPC) file format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.30 -> 1.31 etc/README.man\n        source  create    1.1         etc/new-file-format.so\n        source  modify    1.4 -> 1.5  etc/new.1.8.so\n        source  modify    1.6 -> 1.7  etc/reference.man\n        source  modify   1.29 -> 1.30 etc/srecord.html\n        source  modify   1.40 -> 1.41 include/srec/arglex.h\n        source  modify   1.17 -> 1.18 include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/four_\n                                      packed_code.h\n        source  create    1.1         include/srec/output/file/four_\n                                      packed_code.h\n        source  modify   1.42 -> 1.43 lib/srec/arglex.cc\n        source  modify    1.2 -> 1.3  lib/srec/arglex_output.cc\n        source  modify   1.18 -> 1.19 lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/four_packed_\n                                      code.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/file/guess.cc\n        source  create    1.1         lib/srec/output/file/four_packed_\n                                      code.cc\n        source  modify   1.36 -> 1.37 man/man1/o_input.so\n        source  modify   1.24 -> 1.25 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_fpc.5\n        test    create    1.1         test/00/t0070a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Nov 23      pmiller\n                        20:29:37 2001\n        develop_begin   Fri Nov 23      pmiller  Elapsed time: 1.000\n                        20:29:37 2001            days.\n        develop_end     Sat Nov 24      pmiller\n                        16:28:14 2001\n        review_pass     Sat Nov 24      pmiller\n                        16:28:17 2001\n        develop_end_    Sat Nov 24      pmiller\n        undo            16:28:23 2001\n\n\n\nProject \"srecord.1.8\", Change 21                                  Page 2\nChange Details                                  Tue Nov 27 10:01:36 2001\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        develop_end     Sat Nov 24      pmiller\n                        16:30:04 2001\n        review_pass     Sat Nov 24      pmiller\n                        16:30:06 2001\n        integrate_begin Sat Nov 24      pmiller\n                        16:30:08 2001\n        integrate_pass  Sat Nov 24      pmiller\n                        16:31:23 2001\n\n\n\nProject \"srecord.1.8\", Change 22                                  Page 1\nChange Details                                  Tue Nov 27 10:01:36 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 11, Change 22.\n\nSUMMARY\n        signetics format\n\nDESCRIPTION\n        This change adds the Signetics file format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.31 -> 1.32 etc/README.man\n        source  modify    1.5 -> 1.6  etc/new.1.8.so\n        source  modify   1.30 -> 1.31 etc/srecord.html\n        source  create    1.1         include/format_printf.h\n        source  modify    1.2 -> 1.3  include/quit.h\n        source  modify   1.41 -> 1.42 include/srec/arglex.h\n        source  modify    1.9 -> 1.10 include/srec/input.h\n        source  modify   1.18 -> 1.19 include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/\n                                      signetics.h\n        source  modify   1.11 -> 1.12 include/srec/output.h\n        source  modify   1.16 -> 1.17 include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/\n                                      signetics.h\n        source  modify   1.43 -> 1.44 lib/srec/arglex.cc\n        source  modify    1.3 -> 1.4  lib/srec/arglex_output.cc\n        source  modify   1.19 -> 1.20 lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/signetics.cc\n        source  modify   1.17 -> 1.18 lib/srec/output/file.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file/ascii_hex.cc\n        source  create    1.1         lib/srec/output/file/signetics.cc\n        source  modify    1.1 -> 1.2  man/man5/srec_fpc.5\n        source  create    1.1         man/man5/srec_signetics.5\n        test    create    1.1         test/00/t0071a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Nov 24      pmiller\n                        00:15:02 2001\n        develop_begin   Sat Nov 24      pmiller  Elapsed time: 1.000\n                        00:15:02 2001            days.\n        develop_end     Sat Nov 24      pmiller\n                        20:47:43 2001\n        review_pass     Sat Nov 24      pmiller\n                        20:47:46 2001\n\n\n\n\nProject \"srecord.1.8\", Change 22                                  Page 2\nChange Details                                  Tue Nov 27 10:01:36 2001\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_begin Sat Nov 24      pmiller\n                        20:47:47 2001\n        integrate_pass  Sat Nov 24      pmiller\n                        20:49:48 2001\n\n\n\nProject \"srecord.1.8\", Change 23                                  Page 1\nChange Details                                  Tue Nov 27 10:01:36 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 12, Change 23.\n\nSUMMARY\n        doxygen\n\nDESCRIPTION\n        This change tells the build system how to construct the\n        documentation HTML files from the .h file using Doxygen.  Some\n        improvements to header files were also made.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.18 -> 1.19 etc/Howto.cook\n        source  create    1.1         etc/doxygen.cfg\n        source  create    1.1         etc/doxygen.cook\n        source  modify    1.9 -> 1.10 etc/template/h\n        source  modify    1.9 -> 1.10 include/arglex.h\n        source  modify    1.3 -> 1.4  include/quit.h\n        source  modify    1.2 -> 1.3  include/quit/exception.h\n        source  modify    1.2 -> 1.3  include/quit/normal.h\n        source  modify    1.2 -> 1.3  include/quit/prefix.h\n        source  modify   1.42 -> 1.43 include/srec/arglex.h\n        source  modify   1.10 -> 1.11 include/srec/input.h\n        source  modify   1.19 -> 1.20 include/srec/input/file.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/four_\n                                      packed_code.h\n        source  modify    1.1 -> 1.2  include/srec/input/file/\n                                      signetics.h\n        source  modify   1.12 -> 1.13 include/srec/output.h\n        source  modify   1.17 -> 1.18 include/srec/output/file.h\n        source  modify    1.4 -> 1.5  include/srec/output/file/ascii_\n                                      hex.h\n        source  modify    1.1 -> 1.2  include/srec/output/file/atmel_\n                                      generic.h\n        source  modify    1.1 -> 1.2  include/srec/output/file/four_\n                                      packed_code.h\n        source  modify    1.4 -> 1.5  include/srec/output/file/mos_\n                                      tech.h\n        source  modify    1.1 -> 1.2  include/srec/output/file/\n                                      signetics.h\n        source  modify   1.10 -> 1.11 include/srec/output/file/srecord.h\n        source  modify    1.4 -> 1.5  include/srec/output/file/\n                                      tektronix_extended.h\n\n\n\nProject \"srecord.1.8\", Change 23                                  Page 2\nChange Details                                  Tue Nov 27 10:01:36 2001\n\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.4 -> 1.5  include/srec/output/file/ti_\n                                      tagged.h\n        source  modify    1.5 -> 1.6  include/srec/output/file/wilson.h\n        source  modify   1.13 -> 1.14 include/srec/record.h\n        source  modify    1.9 -> 1.10 lib/common/arglex.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/four_packed_\n                                      code.cc\n        source  modify   1.13 -> 1.14 lib/srec/input/file/intel.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/file/mos_tech.cc\n        source  modify    1.1 -> 1.2  lib/srec/input/file/signetics.cc\n        source  modify   1.12 -> 1.13 lib/srec/input/file/srecord.cc\n        source  modify    1.4 -> 1.5  lib/srec/input/file/tektronix_\n                                      extended.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/file/wilson.cc\n        source  modify    1.9 -> 1.10 lib/srec/record.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Nov 24      pmiller\n                        17:20:12 2001\n        develop_begin   Sat Nov 24      pmiller  Elapsed time: 0.875\n                        17:20:13 2001            days.\n        develop_end     Sat Nov 24      pmiller\n                        23:54:00 2001\n        review_pass     Sat Nov 24      pmiller\n                        23:54:03 2001\n        integrate_begin Sat Nov 24      pmiller\n                        23:54:05 2001\n        integrate_pass  Sat Nov 24      pmiller\n                        23:57:08 2001\n\n\n\nProject \"srecord.1.8\", Change 25                                  Page 1\nChange Details                                  Tue Nov 27 10:01:36 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 14, Change 25.\n\nSUMMARY\n        emon52\n\nDESCRIPTION\n        This change adds the Elektor Monitor (EMON52) file format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.32 -> 1.33 etc/README.man\n        source  modify    1.6 -> 1.7  etc/new.1.8.so\n        source  modify   1.31 -> 1.32 etc/srecord.html\n        source  modify   1.43 -> 1.44 include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/emon52.h\n        source  modify    1.3 -> 1.4  include/srec/input/file/mos_tech.h\n        source  create    1.1         include/srec/output/file/emon52.h\n        source  modify    1.5 -> 1.6  include/srec/output/file/mos_\n                                      tech.h\n        source  modify   1.44 -> 1.45 lib/srec/arglex.cc\n        source  modify    1.4 -> 1.5  lib/srec/arglex_output.cc\n        source  create    1.1         lib/srec/input/file/emon52.cc\n        source  create    1.1         lib/srec/output/file/emon52.cc\n        source  create    1.1         man/man5/srec_emon52.5\n        test    create    1.1         test/00/t0072a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Sat Nov 24      pmiller\n                        23:49:13 2001\n        develop_begin   Sat Nov 24      pmiller  Elapsed time: 1.000\n                        23:49:13 2001            days.\n        develop_end     Mon Nov 26      pmiller\n                        13:58:22 2001\n        review_pass     Mon Nov 26      pmiller\n                        13:58:25 2001\n        integrate_begin Mon Nov 26      pmiller\n                        13:58:28 2001\n        integrate_pass  Mon Nov 26      pmiller\n                        13:59:38 2001\n\n\n\nProject \"srecord.1.8\", Change 26                                  Page 1\nChange Details                                  Tue Nov 27 10:01:36 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 13, Change 26.\n\nSUMMARY\n        output address range checking\n\nDESCRIPTION\n        This change inserts the output address range checking into all\n        of the 16-bit output formats.  This should always have been\n        there, and was present in a partial form in some formats.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  lib/srec/output/file/atmel_\n                                      generic.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file/four_packed_\n                                      code.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file/mos_tech.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file/signetics.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file/spasm.cc\n        source  modify   1.15 -> 1.16 lib/srec/output/file/tektronix.cc\n        source  modify    1.6 -> 1.7  lib/srec/output/file/ti_tagged.cc\n        source  modify    1.1 -> 1.2  man/man5/srec_signetics.5\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Nov 26      pmiller  Cloned from change 25.\n                        11:38:45 2001\n        develop_begin   Mon Nov 26      pmiller\n                        11:38:45 2001\n        develop_end     Mon Nov 26      pmiller\n                        11:41:49 2001\n        review_pass     Mon Nov 26      pmiller\n                        11:42:00 2001\n        integrate_begin Mon Nov 26      pmiller\n                        11:42:00 2001\n        integrate_pass  Mon Nov 26      pmiller\n                        11:42:40 2001\n\n\n\nProject \"srecord.1.8\", Change 27                                  Page 1\nChange Details                                  Tue Nov 27 10:01:37 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 16, Change 27.\n\nSUMMARY\n        dec binary format\n\nDESCRIPTION\n        This change adds the DEC Binary (XXDP) format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.33 -> 1.34 etc/README.man\n        source  modify    1.7 -> 1.8  etc/new.1.8.so\n        source  modify   1.32 -> 1.33 etc/srecord.html\n        source  modify   1.44 -> 1.45 include/srec/arglex.h\n        source  create    1.1         include/srec/input/file/dec_\n                                      binary.h\n        source  modify   1.18 -> 1.19 include/srec/output/file.h\n        source  create    1.1         include/srec/output/file/dec_\n                                      binary.h\n        source  modify    1.2 -> 1.3  include/srec/output/file/four_\n                                      packed_code.h\n        source  modify   1.11 -> 1.12 include/srec/output/file/\n                                      tektronix.h\n        source  modify    1.6 -> 1.7  include/srec/output/file/wilson.h\n        source  modify   1.45 -> 1.46 lib/srec/arglex.cc\n        source  modify    1.5 -> 1.6  lib/srec/arglex_output.cc\n        source  create    1.1         lib/srec/input/file/dec_binary.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/file/guess.cc\n        source  modify   1.18 -> 1.19 lib/srec/output/file.cc\n        source  create    1.1         lib/srec/output/file/dec_binary.cc\n        source  modify   1.16 -> 1.17 lib/srec/output/file/tektronix.cc\n        source  modify    1.8 -> 1.9  lib/srec/output/file/wilson.cc\n        source  modify   1.37 -> 1.38 man/man1/o_input.so\n        source  modify   1.26 -> 1.27 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_dec_binary.5\n        test    create    1.1         test/00/t0075a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Nov 26      pmiller\n                        13:58:18 2001\n        develop_begin   Mon Nov 26      pmiller  Elapsed time: 1.000\n                        13:58:18 2001            days.\n        develop_end     Mon Nov 26      pmiller\n                        22:53:19 2001\n\n\n\n\nProject \"srecord.1.8\", Change 27                                  Page 2\nChange Details                                  Tue Nov 27 10:01:37 2001\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        review_pass     Mon Nov 26      pmiller\n                        22:53:32 2001\n        integrate_begin Mon Nov 26      pmiller\n                        22:53:34 2001\n        integrate_pass  Mon Nov 26      pmiller\n                        22:56:07 2001\n\n\n\nProject \"srecord.1.8\", Change 28                                  Page 1\nChange Details                                  Tue Nov 27 10:01:37 2001\n\nNAME\n        Project \"srecord.1.8\", Delta 15, Change 28.\n\nSUMMARY\n        header option\n\nDESCRIPTION\n        This change adds a command line option to the srec_cat program\n        sho that you can set the header comment from the command line,\n        for those formats which support header comments.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.14 -> 1.15 include/srec/memory.h\n        source  modify   1.16 -> 1.17 lib/srec/memory.cc\n        source  modify   1.25 -> 1.26 man/man1/srec_cat.1\n        source  modify    1.5 -> 1.6  prog/srec_cat/arglex3.cc\n        source  modify    1.5 -> 1.6  prog/srec_cat/arglex3.h\n        source  modify   1.16 -> 1.17 prog/srec_cat/main.cc\n        test    create    1.1         test/00/t0073a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Nov 26      pmiller\n                        14:47:29 2001\n        develop_begin   Mon Nov 26      pmiller  Elapsed time: 0.712\n                        14:47:29 2001            days.\n        develop_end     Mon Nov 26      pmiller\n                        20:08:01 2001\n        review_pass     Mon Nov 26      pmiller\n                        20:08:06 2001\n        integrate_begin Mon Nov 26      pmiller\n                        20:08:09 2001\n        integrate_pass  Mon Nov 26      pmiller\n                        20:10:02 2001\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.1.9.txt",
    "content": "\n\n\nProject \"srecord.1.9\"                                             Page 1\nList of Changes                                 Fri Jun 14 09:10:10 2002\n\nChange  State           Description\n------- -------         -------------\n  10    completed       prepare for release\n  11    completed       web stuff\n  12    completed       GCC 3.0.2\n  15    completed       LSI Logic Fast Load format\n  16    completed       DEC Binary output\n  17    completed       Motorola format: add S6\n  18    completed       seek less on binary files\n  19    completed       intel hex\n\n\n\nProject \"srecord.1.9\", Change 10                                  Page 1\nChange Details                                  Fri Jun 14 09:10:10 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 1, Change 10.\n\nSUMMARY\n        prepare for release\n\nDESCRIPTION\n        This change prepares SRecord for its next public release.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  create    1.1         etc/CHANGES.1.8\n        source  modify    1.9 -> 1.10 etc/new.1.8.so\n        source  create    1.1         etc/new.1.9.so\n        source  modify    1.2 -> 1.3  man/man5/srec_emon52.5\n        source  modify    1.3 -> 1.4  man/man5/srec_fpc.5\n        source  modify    1.3 -> 1.4  man/man5/srec_signetics.5\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Nov 27      pmiller\n                        09:46:15 2001\n        develop_begin   Tue Nov 27      pmiller  Elapsed time: 0.040\n                        09:46:15 2001            days.\n        develop_end     Tue Nov 27      pmiller\n                        10:04:20 2001\n        review_pass     Tue Nov 27      pmiller\n                        10:04:27 2001\n        integrate_begin Tue Nov 27      pmiller\n                        10:04:30 2001\n        integrate_pass  Tue Nov 27      pmiller\n                        10:05:06 2001\n\n\n\nProject \"srecord.1.9\", Change 11                                  Page 1\nChange Details                                  Fri Jun 14 09:10:10 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 2, Change 11.\n\nSUMMARY\n        web stuff\n\nDESCRIPTION\n        This change fixes an uglyness on the web page.\n\n        This change is exempt from testing against the development\n        directory.  This change is exempt from testing against the\n        baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.34 -> 1.35 etc/srecord.html\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Nov 27      pmiller\n                        10:10:50 2001\n        develop_begin   Tue Nov 27      pmiller\n                        10:10:50 2001\n        develop_end     Tue Nov 27      pmiller\n                        10:18:06 2001\n        review_pass     Tue Nov 27      pmiller\n                        10:18:08 2001\n        integrate_begin Tue Nov 27      pmiller\n                        10:18:10 2001\n        integrate_pass  Tue Nov 27      pmiller\n                        10:18:37 2001\n\n\n\nProject \"srecord.1.9\", Change 12                                  Page 1\nChange Details                                  Fri Jun 14 09:10:10 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 3, Change 12.\n\nSUMMARY\n        GCC 3.0.2\n\nDESCRIPTION\n        This change makes SRecord compile using GCC 3.0.2. This should\n        fix the Cygwin build problems, too.\n\n        My thanks to doj@cubic.org for this patch.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.6 -> 1.7  etc/Makefile.head\n        source  modify    1.9 -> 1.10 include/interval.h\n        source  modify    1.4 -> 1.5  include/quit/prefix.h\n        source  modify   1.12 -> 1.13 include/srec/input.h\n        source  modify   1.21 -> 1.22 include/srec/input/file.h\n        source  modify   1.14 -> 1.15 include/srec/output.h\n        source  modify   1.11 -> 1.12 lib/common/arglex.cc\n        source  modify   1.13 -> 1.14 lib/common/interval.cc\n        source  modify    1.2 -> 1.3  lib/common/quit.cc\n        source  modify    1.2 -> 1.3  lib/common/quit/normal.cc\n        source  modify    1.4 -> 1.5  lib/common/quit/prefix.cc\n        source  modify   1.47 -> 1.48 lib/srec/arglex.cc\n        source  modify   1.10 -> 1.11 lib/srec/input.cc\n        source  modify   1.21 -> 1.22 lib/srec/input/file.cc\n        source  modify    1.3 -> 1.4  lib/srec/input/file/ascii_hex.cc\n        source  modify    1.5 -> 1.6  lib/srec/input/file/ti_tagged.cc\n        source  modify    1.5 -> 1.6  lib/srec/memory/walker/compare.cc\n        source  modify   1.12 -> 1.13 lib/srec/output.cc\n        source  modify   1.20 -> 1.21 lib/srec/output/file.cc\n        source  modify    1.8 -> 1.9  lib/srec/output/file/ti_tagged.cc\n        source  modify   1.18 -> 1.19 prog/srec_cat/main.cc\n        source  modify   1.12 -> 1.13 prog/srec_cmp/main.cc\n        source  modify   1.10 -> 1.11 prog/srec_info/main.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu Nov 29      pmiller\n                        09:41:32 2001\n\n\n\n\nProject \"srecord.1.9\", Change 12                                  Page 2\nChange Details                                  Fri Jun 14 09:10:10 2002\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        develop_begin   Thu Nov 29      pmiller  Elapsed time: 0.078\n                        09:41:32 2001            days.\n        develop_end     Thu Nov 29      pmiller\n                        10:16:47 2001\n        review_pass     Thu Nov 29      pmiller\n                        10:16:50 2001\n        integrate_begin Thu Nov 29      pmiller\n                        10:16:52 2001\n        integrate_pass  Thu Nov 29      pmiller\n                        10:18:52 2001\n\n\n\nProject \"srecord.1.9\", Change 15                                  Page 1\nChange Details                                  Fri Jun 14 09:10:11 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 4, Change 15.\n\nSUMMARY\n        LSI Logic Fast Load format\n\nDESCRIPTION\n        This change adds the LSI Logic fastload format.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by internal_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.35 -> 1.36 etc/README.man\n        source  modify    1.1 -> 1.2  etc/new.1.9.so\n        source  modify   1.35 -> 1.36 etc/srecord.html\n        source  modify   1.46 -> 1.47 include/srec/arglex.h\n        source  modify   1.22 -> 1.23 include/srec/input/file.h\n        source  create    1.1         include/srec/input/file/fastload.h\n        source  create    1.1         include/srec/output/file/\n                                      fastload.h\n        source  modify   1.15 -> 1.16 include/srec/record.h\n        source  modify   1.48 -> 1.49 lib/srec/arglex.cc\n        source  modify    1.7 -> 1.8  lib/srec/arglex_output.cc\n        source  modify   1.22 -> 1.23 lib/srec/input/file.cc\n        source  create    1.1         lib/srec/input/file/fastload.cc\n        source  modify    1.7 -> 1.8  lib/srec/input/file/guess.cc\n        source  create    1.1         lib/srec/output/file/fastload.cc\n        source  modify   1.11 -> 1.12 lib/srec/record.cc\n        source  modify   1.39 -> 1.40 man/man1/o_input.so\n        source  modify   1.28 -> 1.29 man/man1/srec_cat.1\n        source  create    1.1         man/man5/srec_fastload.5\n        test    create    1.1         test/00/t0076a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Mon Dec 31      pmiller\n                        11:33:38 2001\n        develop_begin   Mon Dec 31      pmiller  Elapsed time: 0.964\n                        11:33:39 2001            days.\n        develop_end     Mon Dec 31      pmiller\n                        18:47:20 2001\n        review_pass     Mon Dec 31      pmiller\n                        18:47:24 2001\n        integrate_begin Mon Dec 31      pmiller  Elapsed time: 0.128\n                        18:47:26 2001            days.\n\n\n\n\n\n\nProject \"srecord.1.9\", Change 15                                  Page 2\nChange Details                                  Fri Jun 14 09:10:11 2002\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        integrate_fail  Mon Dec 31      pmiller  the guess regression\n                        19:44:53 2001            test failed\n                                                 Elapsed time: 0.224\n                                                 days.\n        develop_end     Mon Dec 31      pmiller\n                        21:25:45 2001\n        review_pass     Mon Dec 31      pmiller\n                        21:25:49 2001\n        integrate_begin Mon Dec 31      pmiller\n                        21:26:02 2001\n        integrate_pass  Mon Dec 31      pmiller\n                        21:29:26 2001\n\n\n\nProject \"srecord.1.9\", Change 16                                  Page 1\nChange Details                                  Fri Jun 14 09:10:11 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 5, Change 16.\n\nSUMMARY\n        DEC Binary output\n\nDESCRIPTION\n        This change fixes a problem with DEC Binary output on Windows\n        machines.\n\n        \"I brought your software to my NT machine, and built it using\n        cygwin. Once\n        I got the right cygwin software downloaded, the build went fine.\n        However,\n        when I did the make sure, I got the error below:\n\n        /bin/sh test/00/t0075a.sh\n        srec_cmp: test.out: 2: checksum mismatch (D5)\n        FAILED test of the DEC Binary functionality\"\n\n        My thanks to Andy Levin <levina@netscout.com> for reporting this\n        problem.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  include/srec/output/file/dec_\n                                      binary.h\n        source  modify    1.2 -> 1.3  lib/srec/output/file/dec_binary.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Feb 19      pmiller\n                        22:29:20 2002\n        develop_begin   Tue Feb 19      pmiller  Elapsed time: 0.030\n                        22:29:21 2002            days.\n        develop_end     Tue Feb 19      pmiller\n                        22:43:01 2002\n        review_pass     Tue Feb 19      pmiller\n                        22:43:07 2002\n        integrate_begin Tue Feb 19      pmiller\n                        22:43:09 2002\n        integrate_pass  Tue Feb 19      pmiller\n                        22:43:56 2002\n\n\n\nProject \"srecord.1.9\", Change 17                                  Page 1\nChange Details                                  Fri Jun 14 09:10:11 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 6, Change 17.\n\nSUMMARY\n        Motorola format: add S6\n\nDESCRIPTION\n        This change adds the S6 record type to the Motorola S-Record\n        format.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_enhancement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.9 -> 1.10 include/srec/input/file/srecord.h\n        source  modify   1.12 -> 1.13 include/srec/output/file/srecord.h\n        source  modify   1.16 -> 1.17 include/srec/record.h\n        source  modify   1.14 -> 1.15 lib/srec/input/file/srecord.cc\n        source  modify    1.6 -> 1.7  lib/srec/input/file/tektronix_\n                                      extended.cc\n        source  modify    1.8 -> 1.9  lib/srec/input/file/wilson.cc\n        source  modify   1.18 -> 1.19 lib/srec/memory.cc\n        source  modify    1.8 -> 1.9  lib/srec/output/file/ascii_hex.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file/dec_binary.cc\n        source  modify    1.2 -> 1.3  lib/srec/output/file/emon52.cc\n        source  modify    1.1 -> 1.2  lib/srec/output/file/fastload.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file/four_packed_\n                                      code.cc\n        source  modify   1.16 -> 1.17 lib/srec/output/file/intel.cc\n        source  modify    1.8 -> 1.9  lib/srec/output/file/mos_tech.cc\n        source  modify    1.3 -> 1.4  lib/srec/output/file/signetics.cc\n        source  modify   1.15 -> 1.16 lib/srec/output/file/srecord.cc\n        source  modify   1.18 -> 1.19 lib/srec/output/file/tektronix.cc\n        source  modify    1.7 -> 1.8  lib/srec/output/file/tektronix_\n                                      extended.cc\n        source  modify    1.9 -> 1.10 lib/srec/output/file/ti_tagged.cc\n        source  modify   1.10 -> 1.11 lib/srec/output/file/wilson.cc\n        source  modify    1.9 -> 1.10 man/man5/srec_motorola.5\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Thu May  9      pmiller\n                        08:59:38 2002\n        develop_begin   Thu May  9      pmiller  Elapsed time: 0.071\n                        08:59:38 2002            days.\n\n\n\nProject \"srecord.1.9\", Change 17                                  Page 2\nChange Details                                  Fri Jun 14 09:10:11 2002\n\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        develop_end     Thu May  9      pmiller\n                        09:31:38 2002\n        review_pass     Thu May  9      pmiller\n                        09:31:42 2002\n        integrate_begin Thu May  9      pmiller\n                        09:31:46 2002\n        integrate_pass  Thu May  9      pmiller\n                        09:33:48 2002\n\n\n\nProject \"srecord.1.9\", Change 18                                  Page 1\nChange Details                                  Fri Jun 14 09:10:11 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 7, Change 18.\n\nSUMMARY\n        seek less on binary files\n\nDESCRIPTION\n        This change causes srec_cat to seek less when it outputs to\n        binary files.  This was not a problem for regular files, but it\n        made a mess when piping the standard output to some other\n        program (you can't seek on pipes).  Most of the the the seeks\n        were unnecessary, so they are avoided whenever possible.\n\n        My thanks to Stuart Warren <Stuart.WARREN@dds.delphiauto.com>\n        for this suggestion.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the development directory.  This\n        change is exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_improvement.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify   1.20 -> 1.21 include/srec/output/file.h\n        source  modify   1.21 -> 1.22 lib/srec/output/file.cc\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Tue Jun 11      pmiller\n                        11:39:41 2002\n        develop_begin   Tue Jun 11      pmiller  Elapsed time: 0.053\n                        11:39:41 2002            days.\n        develop_end     Tue Jun 11      pmiller\n                        12:03:44 2002\n        review_pass     Tue Jun 11      pmiller\n                        12:03:47 2002\n        integrate_begin Tue Jun 11      pmiller\n                        12:03:50 2002\n        integrate_pass  Tue Jun 11      pmiller\n                        12:05:07 2002\n\n\n\nProject \"srecord.1.9\", Change 19                                  Page 1\nChange Details                                  Fri Jun 14 09:10:11 2002\n\nNAME\n        Project \"srecord.1.9\", Delta 8, Change 19.\n\nSUMMARY\n        intel hex\n\nDESCRIPTION\n        This change updates the Intel Hex format to emit the first\n        (usually redundant) extended linear address record (type 4)\n        before the first file data.  Previously it was omitted until the\n        2nd 64K was accessed.\n\n        My thanks to Stuart Warren <Stuart.WARREN@dds.delphiauto.com>\n        for reporting this problem.\n\n        This change must pass a full regression test.  This change is\n        exempt from testing against the baseline.\n\n\nARCHITECTURE\n        This change must build and test in the \"linux-i486\"\n        architecture.\n\nCAUSE\n        This change was caused by external_bug.\n\nFILES\n        Type    Action   Edit         File Name\n        ------- -------- -------      -----------\n        source  modify    1.2 -> 1.3  etc/new.1.9.so\n        source  modify    1.6 -> 1.7  etc/template/cc\n        source  modify   1.15 -> 1.16 lib/srec/input/file/intel.cc\n        source  modify   1.17 -> 1.18 lib/srec/output/file/intel.cc\n        test    modify    1.8 -> 1.9  test/00/t0003a.sh\n        test    modify    1.6 -> 1.7  test/00/t0007a.sh\n        test    modify    1.6 -> 1.7  test/00/t0032a.sh\n\nHISTORY\n        What            When            Who      Comment\n        ------          ------          -----    ---------\n        new_change      Fri Jun 14      pmiller\n                        08:26:37 2002\n        develop_begin   Fri Jun 14      pmiller  Elapsed time: 0.084\n                        08:26:37 2002            days.\n        develop_end     Fri Jun 14      pmiller\n                        09:04:33 2002\n        review_pass     Fri Jun 14      pmiller\n                        09:04:35 2002\n        integrate_begin Fri Jun 14      pmiller\n                        09:04:37 2002\n        integrate_pass  Fri Jun 14      pmiller\n                        09:05:47 2002\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/CHANGES.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\ncase $# in\n1)\n        project=$1\n        ;;\n\n*)\n        echo \"usage: $0 <project>\" 1>&2\n        exit 1\n        ;;\nesac\nset -e\naegis -l changes -p $project -v -pl 66 -pw 72 < /dev/null\nchanges=`aegis -list changes -terse -project $project`\nfor n in $changes\ndo\n        echo '' | tr '\\12' '\\14'\n        aegis -l change_details -p $project -c $n -v -pl 66 -pw 72 < /dev/null\ndone\nexit 0\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/Howto.conf.in",
    "content": "/*\n *      srecord - manipulate eprom load files\n *      Copyright (C) 1998, 2006, 2007 Peter Miller\n *\n *      This program is free software; you can redistribute it and/or modify\n *      it under the terms of the GNU General Public License as published by\n *      the Free Software Foundation; either version 3 of the License, or\n *      (at your option) any later version.\n *\n *      This program is distributed in the hope that it will be useful,\n *      but WITHOUT ANY WARRANTY; without even the implied warranty of\n *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *      GNU General Public License for more details.\n *\n *      You should have received a copy of the GNU General Public License\n *      along with this program. If not, see\n *      <http://www.gnu.org/licenses/>.\n *\n * @configure_input@\n */\n\n/*\n * the name of the compiler to use\n */\nc++ = @CXX@;\nc++_flags = @CXXFLAGS@;\n\n/*\n * prefix for installation path\n */\nprefix = @prefix@ ;\n/* exec_prefix = @exec_prefix@ ; */\n\n/*\n * Which yacc to use\n */\nyacc = @YACC@;\n\n/*\n * extra libraries required for your system\n */\nlibs = @LIBS@;\nld_flags = @LDFLAGS@;\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/README.man",
    "content": "'\\\" t\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 1998, 2000-2004, 2006-2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.TH \"Read Me\" SRecord SRecord \"Reference Manual\"\n.so etc/version.so\n.hy 0\n.ad l\n.SH NAME\nSRecord \\- manipulate EPROM load files\n.XX \"\" \"The README file\"\n.SH DESCRIPTION\nThe \\f[I]SRecord\\fP package is a collection of powerful tools for\nmanipulating EPROM load files.\n.PP\nI wrote SRecord because when I was looking for programs to manipulate\nEPROM load files, I could not find very many.  The ones that I could\nfind only did a few of the things I needed.  SRecord is written in C++\nand polymorphism is used to provide the file format flexibility and\narbitrary filter chaining.  Adding more file formats and filters is\nrelatively simple.\n.SS The File Formats\nThe SRecord package understands a number of file formats:\n.\\\" ----------  A  ---------------------------------------------------------\n.TP 8n\nAscii\\[hy]Hex\nThe ascii\\[hy]hex format is understood for both reading and writing.\n(Also known as the ascii\\[hy]space\\[hy]hex format.)\n.TP\nASM\nIt is possible, for output only, to produce a serices of DB statements\ncontaining the data.  This can be useful for embedding data into assembler\nprograms.\nThis format cannot be read.\n.TP 8n\nAtmel Generic\nThis format is produced by the Atmel AVR assembler.\nIt is understood for both reading and writing.\n.\\\" ----------  B  ---------------------------------------------------------\n.TP\nBASIC\nIt is possible, for output only, to produce a serices of DATA statements\ncontaining the data.  This can be useful for embedding data into BASIC\nprograms.\nThis format cannot be read.\n.TP 8n\nBinary\nBinary files can both be read and written.\n.TP 8n\nB\\[hy]Record\nFiles in Freescale Dragonball bootstrap b\\[hy]record format can be read\nand written.\n.\\\" ----------  C  ---------------------------------------------------------\n.TP 8n\nC\nIt is also possible to write a C array declaration which contains the data.\nThis can be useful when you want to embed download data into C programs.\nThis format cannot be read.\n.TP 8n\nCOE\nThe Xilinx Coefficient File Format (.coe) is understood for output only.\n.TP 8n\nCosmac\nThe RCA Cosmac Elf format is understood for both reading and writing.\n.\\\" ----------  D ---------------------------------------------------------\n.TP\nDEC Binary\nThe DEC Binary (XXDP) format is understood for both reading and writing.\n.TP\nElektor Monitor (EMON52)\nThe EMON52 format is understood for both reading and writing.\n.\\\" ----------  E  ---------------------------------------------------------\n.\\\" ----------  F  ---------------------------------------------------------\n.TP\nFairchild Fairbug\nThe Fairchild Fairbug format is understood for both reading and writing.\n.TP\nFormatted Binary\nThe Formatted Binary format is understood for both reading and writing.\n.TP\nFour Packed Code (FPC)\nThe FPC format is understood for both reading and writing.\n.\\\" ----------  G  ---------------------------------------------------------\n.\\\" ----------  H  ---------------------------------------------------------\n.TP\nHexdump\nIt is possible to get a simple hexdump as output.\n.\\\" ----------  I  ---------------------------------------------------------\n.TP 8n\nIDT/sim\nThe IDT/sim binary file format is understood for both reading and writing.\n.TP 8n\nIntel\nThe Intel hexadecimal format is understood for both reading and writing.\n(Also known as the Intel MCS\\[hy]86 Object format.)\n.TP 8n\nIntel AOMF\nThe Intel Absolute Object Module Format (AOMF) is understood for both\nreading and writing.\n.TP 8n\nIntel 16\nThe Intel hexadecimal 16 format is understood for both reading and writing.\n(Also known as the INHX16 file format.)\n.\\\" ----------  J  ---------------------------------------------------------\n.\\\" ----------  K  ---------------------------------------------------------\n.\\\" ----------  L  ---------------------------------------------------------\n.TP\nLSI Logic Fast Load\nThe LSI Logic Fast Load format is understood for both reading and writing.\n.YP\nLogisim\nThe Logisim format is understood for both reading and writing.\nSee \\f[I]srec_logisim\\fP(5) for more information.\n.\\\" ----------  M  ---------------------------------------------------------\n.TP 8n\nMemory Initialization Format\nThe Memory Initialization Format (.mem) by Lattice Semiconductor is\nunderstood for writing only.\n.TP 8n\nMIF\nThe Memory Initialization File format by Altera is supported for both\nreading and writing.\n.TP 8n\nMOS Technology\nThe MOS Technology hexadecimal format is understood for both reading\nand writing.\n.TP 8n\nMIPS\\[hy]Flash\nThe MIPS Flash file format is supported for both reading and writing.\n.TP 8n\nMotorola S\\[hy]Record\nThe Motorola hexadecimal S\\[hy]Record format is understood for both reading\nand writing.\n(Also known as the Exorciser, Exormacs or Exormax format.)\n.TP 8n\nMsBin\nThe Windows CE Binary Image Data Format is supported both for reading\nand writing.\n.\\\" ----------  N  ---------------------------------------------------------\n.TP 8n\nNeedham\nThe Needham Electronics ASCII file format is understood for both reading\nand writing.\n.\\\" ----------  O  ---------------------------------------------------------\n.TP 8n\nOS65V\nThe Ohio Scientific hexadecimal format is understood for both reading\nand writing.\n.\\\" ----------  P  ---------------------------------------------------------\n.TP 8n\nPPB\nThe Stag Prom Programmer binary format is understood for both reading\nand writing.\n.TP 8n\nPPX\nThe Stag Prom Programmer hexadecimal format is understood for both\nreading and writing.\n.\\\" ----------  Q  ---------------------------------------------------------\n.\\\" ----------  R  ---------------------------------------------------------\n.\\\" ----------  S  ---------------------------------------------------------\n.TP 8n\nSignetics\nThe Signetics format is understood for both reading and writing.\n.TP 8n\nSPASM\nThe SPASM format is used by a variety of PIC programmers; it is understood\nfor both reading and writing.\n.TP 8n\nSpectrum\nThe Spectrum format is understood for both reading and writing.\n.\\\" ----------  T  ---------------------------------------------------------\n.TP 8n\nTektronix (Extended)\nThe Tektronix hexadecimal format and the Tektronix Extended hexadecimal\nformat are both understood for both reading and writing.\n.TP 8n\nTexas Instruments Tagged\nThe Texas Instruments Tagged format is understood for both reading and\nwriting (both 8 and 16 bit).  Also known as the TI\\[hy]tagged or TI\\[hy]SDSMAC\nformat.\n.TP 8n\nTexas Instruments ti\\[hy]txt\nThe TI\\[hy]TXT format is understood for reading and writing.  This format is\nused with the bootstrap loader of the Texas Instruments MSP430 family of\nprocessors.\n.TP 8n\nTRS\\[hy]80\nThe Radio Shack TRS\\[hy]80 object file format is understood for reading\nand writing.\n.\\\" ----------  T  ---------------------------------------------------------\n.\\\" ----------  U  ---------------------------------------------------------\n.\\\" ----------  V  ---------------------------------------------------------\n.TP 8n\nVHDL\nIt is possible to write VHDL file.\nThis is only supported for output.\n.TP 8n\nVerilog VMEM\nIt is possible to write a Verilog VMEM file suitable for loading with\n\\f[CW]$readmemh()\\fP.  This format is supported for reading and writing.\n.\\\" ----------  W  ---------------------------------------------------------\n.TP 8n\nWilson\nThe Wilson format is understood for both reading and writing.\nThis mystery format was added for a mysterious type of EPROM writer.\n.\\\" ----------  X  ---------------------------------------------------------\n.\\\" ----------  Y  ---------------------------------------------------------\n.\\\" ----------  Z  ---------------------------------------------------------\n.\\\" ----------  End of Format Names  --------------------------------------\n.SS The Tools\nThe primary tools of the package are \\f[I]srec_cat\\fP and \\f[I]srec_cmp\\fP.\nAll of the tools understand all of the file formats, and all of the filters.\n.TP 8n\n.I srec_cat\nThe \\f[I]srec_cat\\fP program may be used to catenate (join) EPROM load\nfiles, or portions of EPROM load files, together.  Because it understands\nall of the input and output formats, it can also be used to convert\nfiles from one format to another.\n.TP 8n\n.I srec_cmp\nThe \\f[I]srec_cmp\\fP program may be use to compare EPROM load files,\nor portions of EPROM load files, for equality.\n.TP 8n\n.I srec_info\nThe \\f[I]srec_info\\fP program may be used to print summary information\nabout EPROM load files.\n.SS The Filters\nThe \\f[I]SRecord\\fP package is made more powerful by the concept of \\f[I]input\nfilters\\fP.  Wherever an input file may be specified, filters may also\nbe applied to that input file.  The following filters are available:\n.\\\" ----------  A  ---------------------------------------------------------\n.\\\" ----------  B  ---------------------------------------------------------\n.TP 8n\nbit reverse\nThe \\f[I]bit\\[hy]reverse\\fP filter may be used to\nreverse the order of bits in each data byte.\n.TP 8n\nbyte swap\nThe \\f[I]byte swap\\fP filter may be used to swap pairs of add and even bytes.\n.\\\" ----------  C  ---------------------------------------------------------\n.TP 8n\nCRC\nThe various \\f[I]crc\\fP filters may be used to insert a CRC into the data.\n.TP 8n\n.TP\nchecksum\nThe \\f[I]checksum\\fP filters may be used to insert a checksum into\nthe data.  Positive, negative and bit\\[hy]not checksums are available,\nas well as big\\[hy]endian and little\\[hy]endian byte orders.\n.TP 8n\ncrop\nThe \\f[I]crop\\fP filter may be used to isolate an input address range,\nor ranges, and discard the rest.\n.\\\" ----------  D  ---------------------------------------------------------\n.\\\" ----------  E  ---------------------------------------------------------\n.TP 8n\nexclude\nThe \\f[I]exclude\\fP filter may be used to exclude an input address range,\nor ranges, and keep the rest.\n.\\\" ----------  F  ---------------------------------------------------------\n.TP 8n\nfill\nThe \\f[I]fill\\fP filter may be used to fill any holes in the data\nwith a nominated value.\n.\\\" ----------  G  ---------------------------------------------------------\n.\\\" ----------  H  ---------------------------------------------------------\n.\\\" ----------  I  ---------------------------------------------------------\n.\\\" ----------  J  ---------------------------------------------------------\n.\\\" ----------  K  ---------------------------------------------------------\n.\\\" ----------  L  ---------------------------------------------------------\n.TP 8n\nlength\nThe \\f[I]length\\fP filter may be used to insert the data length into the data.\n.\\\" ----------  M  ---------------------------------------------------------\n.TP 8n\nmaximum\nThe \\f[I]maximum\\fP filter may be used to insert the maximum data address\ninto the data.\n.TP 8n\nminimum\nThe \\f[I]minimum\\fP filter may be used to insert the minimum data address\ninto the data.\n.\\\" ----------  N  ---------------------------------------------------------\n.\\\" ----------  O  ---------------------------------------------------------\n.TP 8n\noffset\nThe \\f[I]offset\\fP filter may be used to offset the address of data records,\nboth forwards and backwards.\n.\\\" ----------  P  ---------------------------------------------------------\n.\\\" ----------  Q  ---------------------------------------------------------\n.\\\" ----------  R  ---------------------------------------------------------\n.TP 8n\nrandom fill\nThe \\f[I]random fill\\fP filter may be used to fill holes in the data with\nrandom byte values.\n.\\\" ----------  S  ---------------------------------------------------------\n.TP 8n\nsplit\nThe \\f[I]split\\fP filter may be used to split EPROM images for wide data\nbuses or other memory striping schemes.\n.\\\" ----------  T  ---------------------------------------------------------\n.\\\" ----------  U  ---------------------------------------------------------\n.TP 8n\nunfill\nThe \\f[I]unfill\\fP filter may be used to make holes in the data at bytes\nwith a nominated value.\n.TP 8n\nunsplit\nThe \\f[I]unsplit\\fP filter may be reverse the effects of the split filter.\n.\\\" ----------  V  ---------------------------------------------------------\n.\\\" ----------  W  ---------------------------------------------------------\n.\\\" ----------  X  ---------------------------------------------------------\n.\\\" ----------  Y  ---------------------------------------------------------\n.\\\" ----------  Z  ---------------------------------------------------------\n.\\\" ----------  End of Filter Names  ---------------------------------------\n.PP\nMore than one filter may be applied to each input file.\nDifferent filters may be applied to each input file.\nAll filters may be applied to all file formats.\n.br\n.ne 1i\n.SH ARCHIVE SITE\nThe latest version of\n.I SRecord\nis available on the Web from:\n.TS\ncenter,tab(;);\nl l s\nl l l.\nURL:;http://srecord.sourceforge.net/\nFile:;index.html;# the SRecord page\nFile:;srecord\\-\\*(v).README;# Description, from the tar file\nFile:;srecord\\-\\*(v).lsm;# Description, LSM format\nFile:;srecord\\-\\*(v).spec;# RedHat package specification\nFile:;srecord\\-\\*(v).tar.gz;# the complete source\nFile:;srecord\\-\\*(v).pdf;# Reference Manual\n.TE\n.br\n.ne 1i\n.SH BUILDING SRECORD\nFull instructions for building\n.I SRecord\nmay be found in the\n.I BUILDING\nfile included in this distribution.\n.LP\nIt is also possible to build \\f[I]SRecord\\fP on Windows using the\nCygwin (www.cygwin.com) or DJGPP (www.delorie.com/djgpp) environments.\nInstructions are in the \\f[I]BUILDING\\fP file, including how to get native\nWindows binaries.\n.br\n.ne 1i\n.SH COPYRIGHT\n.I srecord\nversion \\*(v)\n.br\nCopyright\n.if t \\(co\n.if n (C)\nScott Finneran <scottfinneran@yahoo.com.au>\n.br\nCopyright\n.if t \\(co\n.if n (C)\n\\*(Y) Peter Miller <pmiller@opensource.org.au>\n.PP\nThis program is free software;\nyou can redistribute it\nand/or modify it under the terms of the GNU General Public\nLicense as published by the Free Software Foundation;\neither version 3 of the License,\nor (at your option) any later version.\n.PP\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY;\nwithout even the implied\nwarranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\nPURPOSE.\nSee the GNU General Public License for more details.\n.PP\nYou should have received a copy of the GNU General Public License along\nwith this program. If not, see <http://www.gnu.org/licenses/>.\n.PP\nIt should be in the\n.I LICENSE\nfile included with this distribution.\n.br\n.ne 1i\n.SH AUTHOR\n.TS\ntab(;);\nl l l.\nPeter Miller;E\\[hy]Mail:;pmiller@opensource.org.au\n\\f(CW/\\e/\\e*\\fP;WWW:;http://miller.emu.id.au/pmiller/\n.TE\n.br\n.bp\n.SH RELEASE NOTES\n.XX \"\" \"Release Notes\"\nThis section details the various features and bug fixes of the various\nreleases.  For excruciating and complete detail, and also credits for\nthose of you who have generously sent me suggestions and bug reports,\nsee the \\f[I]etc/CHANGES.*\\fP files.\n.so etc/new.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/apt-get-depends.cook",
    "content": "/*\n * srecord - Manipulate EPROM load files\n * Copyright (C) 2013 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\napt-package-list = ;\n\nfunction apt-get-package =\n{\n    if [not [collect dpkg -l | grep \"'^ii  \"[@1]\" '\" | wc -l || true]] then\n        apt-package-list += [@1];\n}\n\n/*\n * Make sure the packages we need are present.\n */\nif [matches %1C%2 [version]] then\n{\n    if [find_command apt-get] then\n    {\n        function apt-get-package autoconf;\n        function apt-get-package automake;\n        function apt-get-package build-essential;\n        function apt-get-package cdbs; /* licensecheck2dep5 */\n        function apt-get-package coreutils; /* ptx */\n        function apt-get-package debhelper;\n        function apt-get-package devscripts; /* debuild, licensecheck */\n        function apt-get-package doxygen;\n        function apt-get-package dpkg-dev; /* dpkg-buildpackage */\n        function apt-get-package exuberant-ctags; /* ctags cmd */\n        function apt-get-package gawk;\n        function apt-get-package ghostscript; /* ps2pdf */\n        function apt-get-package groff;\n        function apt-get-package imagemagick; /* convert(1) */\n        function apt-get-package libboost-dev;\n        function apt-get-package libgcrypt11-dev;\n        function apt-get-package libtool;\n        function apt-get-package lintian;\n        function apt-get-package psutils; /* psselect */\n        function apt-get-package sharutils; /* uudecode */\n        function apt-get-package tar;\n        function apt-get-package tardy;\n\n        if [count [apt-package-list]] then\n        {\n            sudo apt-get install -y [apt-package-list]\n                < /dev/tty > /dev/tty 2>&1\n                || true;\n        }\n    }\n}\n\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/archive.cook",
    "content": "/*\n * srecord - manipulate eprom load files\n * Copyright (C) 1998-2000, 2003, 2004, 2006-2014 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nif [not [defined integration-build-targets]] then\n    integration-build-targets = ;\nintegration-build-targets += web-site;\n\nweb-site: [web-site];\n\nweb-site =\n    archive/change_log.txt\n    archive/[project_minus].README\n    archive/[project_minus].lsm\n    archive/[project_minus].spec\n    archive/[project_minus].tar.gz\n    archive/[project_minus].pdf\n    archive/[project_short].png\n    archive/[project_short].ico\n    archive/[project_short]-128.png\n    archive/[project_short]-64.png\n    archive/[project_short]-32.png\n    archive/[project_short]-16.png\n    archive/whining-64.png\n    [fromto etc/%.html archive/%.html\n        [match_mask etc/%.html [source_files]]\n    ]\n    [fromto etc/%.png.uue archive/%.png\n        [match_mask etc/%.png.uue [source_files]]\n    ]\n    html-documentation\n    ;\n\nsource_file_order =\n    README\n    [sort\n        [stringset\n            [source_files]\n            BUILDING\n            LICENSE\n\n            /*\n             * These two are for time stamping the distribution.\n             */\n            etc/version.so\n            srecord/patchlevel.h\n\n            /*\n             * These four are for building the distribution.\n             */\n            Makefile.in\n            srecord/config.h.in\n            install-sh\n            configure\n\n            /*\n             * This is for building the RPM package\n             */\n            [project_minus].spec\n\n            /*\n             * for the reference manual\n             */\n            etc/ref-index.so\n            etc/ref-parts.so\n            etc/new.so\n\n            /*\n             * For pkg-config\n             */\n            libdir/pkgconfig/[project_short].pc.in\n        -\n            README\n        ]\n    ]\n    ;\n\n\n/*\n * These recipes build a Makefile for a user.  They do not build a\n * Makefile useful for a development build, because no arch\n * information is included in the Makefile.\n */\n\naemakegen = aemakegen;\n\nMakefile.in: [source_files]\n{\n    function if_quiet Gneerate;\n\n    [aemakegen] -p [project] -c [change] -o [target]\n        libdir/pkgconfig/[project_short].pc.in\n        set meter;\n}\n\narchive/[project_minus].tar.gz: [source_file_order] [arch]/bin/test_gecos\n        debian/control /* et al */\n    set shallow\n{\n    function if_quiet Generate;\n\n    tar cf - [resolve [source_file_order]]\n        debian/changelog\n        debian/compat\n        debian/control\n        debian/rules\n        'debian/*.install'\n    | tardy\n        [collect [arch]/bin/test_gecos]\n        -unu 0 -gnu 0\n        -ms 0644 -mc 07022\n        -now\n        -prefix\\=[project_minus]\n        [prepost \"-rp=\" \"\" [search_list]]\n    | gzip -9\n    > [target];\n}\n\narchive/[project_minus].%: %\n    set shallow\n{\n    function if_quiet Copy;\n\n    cat [resolve [need]] > [target];\n}\n\narchive/[project_minus].pdf: etc/reference.pdf\n    set shallow\n{\n    function if_quiet Copy;\n\n    cat [resolve [need]] > [target];\n}\n\n%: etc/%.man\n{\n    function if_quiet Groff;\n\n    roffpp\n        [prepost \"-I\" /[arch] [search_list]]\n        [addprefix \"-I\" [search_list]]\n        [resolve etc/%.man]\n    | groff -Tascii -t -P-bcu -man\n    > [target];\n}\n\narchive/%.txt: etc/%.man\n    set shallow\n{\n    function if_quiet Generate;\n\n    roffpp\n        [prepost \"-I\" /[arch] [search_list]]\n        [addprefix \"-I\" [search_list]]\n        [resolve etc/%.man]\n    | groff -Tascii -t -P-bcu -man\n    > [target];\n}\n\netc/%.man.d: etc/%.man\n    set no-cascade\n{\n    [c_incl] -nc -ns -api -nrec\n        --lang\\=roff\n        [addprefix \"-I\" [search_list]]\n        [resolve etc/%.man]\n        -prefix \"'cascade etc/%.man ='\"\n        -suffix \"';'\"\n        [addprefix \"-rlp=\" [search_list]]\n        -o [target];\n}\n\n#include-cooked [addsuffix \".d\" [match_mask etc/%.man [source_files]]]\n\n\n/*\n * This is not in the integration-build-targets because it takes far\n * too long to do.\n */\n\nRPM: archive/[project_minus]-1.i386.rpm;\n\narchive/[project_minus]-1.i386.rpm archive/[project_minus]-1.src.rpm:\n        archive/[project_minus].tar.gz etc/rpm-build.sh\n    set shallow\n{\n    function if_quiet Generate;\n\n    sh [resolve etc/rpm-build.sh]\n        RPM-temporary\n        [resolve archive/[project_minus].tar.gz]\n        ;\n    mv RPM-temporary/RPMS/i386/[project_minus]-1.i386.rpm\n        archive/[project_minus]-1.i386.rpm\n        ;\n    mv RPM-temporary/SRPMS/[project_minus]-1.src.rpm\n        archive/[project_minus]-1.src.rpm\n        ;\n    rm -r RPM-temporary;\n}\n\n[project_minus].spec: [source_files]\n{\n    function if_quiet Generate;\n\n    [aemakegen] --target\\=rpm-spec -p [project] -c [change] -o [target]\n        libdir/pkgconfig/[project_short].pc.in\n        ;\n}\n\narchive/[project_minus].spec: [project_minus].spec\n    set shallow\n{\n    cat [resolve [need]] > [target];\n}\n\narchive/%: etc/%.uue\n    set shallow\n{\n    uudecode -o [target] [resolve [need]];\n}\n\n\netc/%.html.d: etc/%.html\n    set no-cascade\n{\n    c_incl -nc -ns -eia -r -nrec\n        [prepost \"-I\" /[arch] [search_list]]\n        [addprefix \"-I\" [search_list]]\n        -prefix \"'cascade etc/\"%\".html ='\"\n        -suffix \"';'\"\n        [resolve etc/%.html]\n        [prepost \"-rlp=\" \"\" [search_list]] /* remove leading path */\n        -slp [arch] \"'[arch]'\" /* substitute leading path */\n        -o [target];\n}\n\n#include-cooked [addsuffix \".d\" [match_mask etc/%.html [source_files]]]\n\narchive/%.html: etc/%.html: etc/ssp.awk etc/version.so\n    set shallow\n{\n    function if_quiet Groff;\n\n    roffpp\n        [prepost \"-I\" /[arch] [search_list]]\n        [addprefix \"-I\" [search_list]]\n        [resolve etc/%.html]\n    | groff -Tascii -t -P-bcu -man\n    | [awk] -f [resolve etc/ssp.awk]\n    > [target];\n}\n\n\netc/[project_short].lsm.d: etc/[project_short].lsm\n    set no-cascade\n{\n    c_incl -nc -ns -eia -r -nrec\n        [prepost \"-I\" /[arch] [search_list]]\n        [addprefix \"-I\" [search_list]]\n        -prefix \"'cascade etc/\"[project_short]\".lsm ='\"\n        -suffix \"';'\"\n        [resolve etc/[project_short].lsm]\n        [prepost \"-rlp=\" \"\" [search_list]] /* remove leading path */\n        -slp [arch] \"'[arch]'\" /* substitute leading path */\n        -o [target];\n}\n\n#include-cooked-nowarn etc/[project_short].lsm.d\n\narchive/[project_minus].lsm: etc/[project_short].lsm etc/ssp.awk\n    set shallow\n{\n    function if_quiet Generate;\n\n    roffpp\n        [prepost \"-I\" /[arch] [search_list]]\n        [addprefix \"-I\" [search_list]]\n        [resolve etc/[project_short].lsm]\n    | groff -Tascii -t -P-bcu -man\n    | [awk] -f [resolve etc/ssp.awk]\n    > [target];\n}\n\nLICENSE: man/cat1/srec_license.1\n{\n    cat [resolve [need]] > [target];\n}\n\narchive/%1-%2.png: archive/%1.png\n{\n    function if_quiet Generate;\n\n    if [find_command pngcrush] then\n    {\n        convert [resolve archive/%1.png] -scale %2 archive/%1-%2.tmp.png;\n        pngcrush -bkgd 255 255 255 -brute -q archive/%1-%2.tmp.png [target];\n        rm archive/%1-%2.tmp.png;\n    }\n    else\n    {\n        convert [resolve archive/%1.png] -scale %2 [target];\n    }\n}\n\narchive/srecord.ico:\n    archive/srecord-16.png\n    archive/srecord-24.png\n    archive/srecord-32.png\n    archive/srecord-48.png\n    archive/srecord-64.png\n    archive/srecord-96.png\n    archive/srecord-128.png\n{\n    function if_quiet Generate;\n\n    convert [resolve [need]] -colors 256 [target];\n}\n\n\ncheck-tarball: etc/check-tarball.sh archive/[project_minus].tar.gz\n{\n    sh [resolve etc/check-tarball.sh archive/[project_minus].tar.gz];\n}\n\n\nlibdir/pkgconfig/[project_short].pc.in: [source_files]\n{\n    function if_quiet Generate;\n\n    [aemakegen] -p\\=[project] -c\\=[change] --target\\=pkg-config\n        > [target];\n}\n\n\ndebian/changelog\ndebian/control\ndebian/rules\ndebian/srecord.install: [source_files]\n    set shallow\n{\n    function if_quiet Generate;\n\n    /* This actually makes more files than just debian/control */\n    [aemakegen] -project\\=[project] -change\\=[change] --target\\=debian\n        libdir/pkgconfig/[project_short].pc.in\n        ;\n    local tempfile = [collect mktemp] ;\n    tr \"\\\\\\\\t\" \"' '\" < debian/changelog > [tempfile] ;\n    mv [tempfile] debian/changelog ;\n}\n\n\n/*\n * if [or\n *     [in [fromto %1D%2 %2 [version]] 001 002 003 004]\n *     [collect \"set +e; on_ac_power; expr 1 - $?; exit 0\" ]\n * ] then\n */\nif [in [fromto %1D%2 %2 [version]] 001 002 003 004] then\n{\n    web-site += debian-package;\n}\n\ndebian-package: archive/[project_minus].tar.gz\n    debian/changelog\n{\n    function if_quiet Generate;\n    local vsn = [collect head -1 [resolve debian/changelog]\n                         | sed \"'s|.*(\\\\([^()]*\\\\).*|\\\\1|'\" ];\n    vsn = [fromto %-1 % [vsn]];\n    function print \"vsn = '\"[vsn]\"'\";\n    if [not [in [count [vsn]] 1]] then\n        fail \"debian version not right\";\n    local tarball = [project_short]_[vsn].orig.tar.gz;\n\n    local user = [collect id -un];\n    local key = ;\n    if [in [user] archives] then\n        key = -k19CEC7D5;\n    else\n        key = -us -uc;\n\n    /*\n     * We fake the .orig.tar.gz file to not have a debian/ directory,\n     * by filtering it out with tardy.  This silences a PITA lintian\n     * warning, for no real benefit.\n     */\n\n    unset GPG_AGENT_INFO &&\n    rm -rf archive/debian &&\n    mkdir -p archive/debian &&\n    cd archive/debian &&\n    echo Options Indexes > .htaccess &&\n    gunzip < ../[project_minus].tar.gz\n        | tardy -exclude \"'\"[project_minus]\"/debian/*'\"\n                -exclude [project_minus]/etc/crc16-ccitt.html /*not free enuf*/\n        | gzip -9 > [tarball] &&\n    tar xzf ../[project_minus].tar.gz &&\n    cd [project_minus] &&\n    cp etc/configure.ac . &&\n#if 0\n    dpkg-buildpackage -sgpg [key] -sa\n#else\n    debuild [key] -sa\n        --changes-option\\=-DDistribution\\=[collect\n            gawk -F\\= \"'/CODENAME/{print $2}'\" /etc/lsb-release]\n#endif\n    &&\n    cd .. &&\n    rm -rf [project_minus] &&\n    lintian -iIv --pedantic *.changes\n    ;\n}\n\n\narchive/man/index.html: [stringset [html-documentation] - [target]]\n    etc/man-html-index.sh\n    set shallow\n{\n    function if_quiet Generate;\n\n    sh [resolve etc/man-html-index.sh]\n        [stringset [need] - etc/man-html-index.sh]\n        > [target]\n        ;\n}\n\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/autoconf.cook",
    "content": "/*\n * srecord - manipulate eprom load files\n * Copyright (C) 1998, 2002, 2003, 2006, 2007, 2009, 2010, 2013 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n\n/*\n * This file is generated by autoconf.\n * It is architecture specific.\n * If it is not found (not cooked yet) the following\n * symbols will be undefined.\n *\n *      Must be included *after* the search_list is defined.\n */\n#include-cooked-nowarn [arch]/etc/Howto.conf\nif [not [defined prefix]] then\n    prefix = /usr/local;\nif [not [defined exec_prefix]] then\n    exec_prefix = [prefix];\nif [not [defined yacc]] then\n    yacc = yacc;\nif [not [defined libs]] then\n    libs = ;\nif [not [defined cxx]] then\n    cxx = ['if' [find_command g++] 'then' g++ 'else' c++];\n\n\nconfigure: etc/configure.ac install-sh(exists)\n{\n    function if_quiet Generate;\n\n    if [not [exists install-sh]] then\n    {\n        /*\n         * Cook says it is up-to-date, so it must be in the\n         * baseline; autoconf needs it in the current directory.\n         */\n        cat [resolve install-sh] > install-sh\n            set clearstat;\n        chmod a+rx install-sh;\n    }\n    autoconf [resolve etc/configure.ac] > [target];\n    chmod 755 [target];\n}\n\n/*\n * The install-sh script can come from a huge range of places, depending\n * on what distribution you have installed (or whether you built it from\n * the tarball).\n */\nloop install-sh-maybe =\n    /usr/share/autoconf/install-sh\n    [glob /usr/share/automake*/install-sh]\n    /usr/local/share/autoconf/install-sh\n    [glob /usr/local/share/automake*/install-sh]\n{\n    if [exists [install-sh-maybe]] then\n    {\n        install-sh = [install-sh-maybe];\n        loopstop;\n    }\n}\nif [not [install-sh]] then\n    fail \"Can't locate the \\\"install-sh\\\" script from GNU automake\";\n\ninstall-sh: [install-sh]\n{\n    cat [need] > [target];\n    cooktime -m 2-jan-1970 [target];\n    chmod 755 [target];\n}\n\n\n[arch]/config.status: configure install-sh(exists)\n{\n    if [not [exists install-sh]] then\n    {\n        /*\n         * Cook says it is up-to-date, so it must be in the\n         * baseline; autoconf needs it in the current directory.\n         */\n        cat [resolve install-sh]  > install-sh\n            set clearstat;\n        chmod a+rx install-sh;\n    }\n    ./[resolve configure] --cache-file\\=/dev/null\n        ['if' [quiet] 'then' --quiet 'else' --verbose]\n        --no-create\n        ;\n    mv config.status [arch]/config.status;\n    if [exists config.log] then\n        mv config.log [arch]/config.log;\n}\n\nsrecord/config.h.in: etc/configure.ac\n{\n    function if_quiet Generate;\n\n    autoheader [resolve etc/configure.ac] > [target];\n}\n\n\n[arch]/%0%.h: %0%.h.in [arch]/config.status\n    single-thread conftest.subs\n{\n    function if_quiet Generate;\n    CONFIG_FILES\\= CONFIG_HEADERS\\=[target]\\:[resolve %0%.h.in]\n        [resolve [arch]/config.status]\n        ['if' [quiet] 'then' --quiet]\n        ;\n}\n\n[arch]/%0%: %0%.in [arch]/config.status\n    single-thread conftest.subs\n{\n    function if_quiet Generate;\n    CONFIG_FILES\\=[target]\\:[resolve %0%.in] CONFIG_HEADERS\\=\n        [resolve [arch]/config.status]\n        ['if' [quiet] 'then' --quiet]\n        ;\n}\n\n/* Sigh */\ncascade srecord/vsnprintf.cc = [arch]/srecord/config.h;\ncascade etc/srecord.lsm = etc/version.so;\n\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/change_log.man",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2008 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.TH \"Change Log\" SRecord SRecord \"Change Log\"\n.so etc/version.so\n.hy 0\n.ad l\n.SH RELEASE NOTES\nThis file details the various features and bug fixes of the various releases.\n.so etc/new.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/check-tarball.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\nset -e\nset -x\n\nbase=`basename $1 .tar.gz`\n\ntar xzf $1\ncd $base\n./configure\nmake\nmake sure\ncd ..\nrm -rf $base\nexit 0\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/configure.ac",
    "content": "dnl\ndnl  srecord - manipulate eprom load files\ndnl  Copyright (C) 1998, 1999, 2002, 2006-2012 Peter Miller\ndnl  Copyright (C) 2014 Scott Finneran\ndnl\ndnl  This program is free software; you can redistribute it and/or modify\ndnl  it under the terms of the GNU General Public License as published by\ndnl  the Free Software Foundation; either version 3 of the License, or\ndnl  (at your option) any later version.\ndnl\ndnl  This program is distributed in the hope that it will be useful,\ndnl  but WITHOUT ANY WARRANTY; without even the implied warranty of\ndnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\ndnl  General Public License for more details.\ndnl\ndnl  You should have received a copy of the GNU General Public License\ndnl  along with this program. If not, see <http://www.gnu.org/licenses/>.\ndnl\nAC_INIT(install-sh)\nAC_CONFIG_HEADER(srecord/config.h)\nAC_PROG_CXX\nAC_PROG_CPP\nAC_LANG(C++)\nAC_GNU_SOURCE\nAC_PROG_INSTALL\nAC_PROG_YACC\nAC_PROG_RANLIB\nAC_CHECK_PROGS(GROFF, groff roff)\nAC_CHECK_PROGS(SOELIM, gsoelim soelim roffpp)\nAC_CHECK_FUNCS(snprintf vsnprintf)\n\ndnl! This is needed for MingGW build, but not for Unix or Linux, etc.\nAC_CHECK_LIB(gpg-error, main)\n\ndnl! @synopsis AC_ADD_CFLAGS\ndnl!\ndnl! Add the given option to CFLAGS, if it doesn't break the compiler\nAC_DEFUN([AC_ADD_CFLAGS],\n[AC_MSG_CHECKING([if $CC accepts $1])\n  ac_add_cflags__old_cflags=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS $1\"\n  AC_TRY_LINK([#include <stdio.h>],\n    [printf(\"Hello, World!\\n\"); return 0;],\n    AC_MSG_RESULT([yes]),\n    AC_MSG_RESULT([no])\n    CFLAGS=\"$ac_add_cflags__old_cflags\")\n])\n\nAC_ADD_CFLAGS(-Wall)\nAC_ADD_CFLAGS(-Wextra)\nAC_ADD_CFLAGS([-Wl,--as-needed])\n\ndnl\ndnl Make sure Boost is installed.\ndnl\nAC_CHECK_HEADERS(boost/shared_ptr.hpp)\nif test \"$ac_cv_header_boost_shared_ptr_hpp\" != \"yes\"\nthen\n    AC_MSG_RESULT([\n        You need to install the Boost C++ library to be able to compile SRecord.\n        http://boost.org/])\n    OK=no\n    if apt-get --version > /dev/null 2> /dev/null; then\n      AC_MSG_RESULT([\n        The following command may be used to install it:\n        sudo apt-get install libboost-dev\n      ])\n      OK=yes\n    fi\n    if yum --version > /dev/null 2> /dev/null; then\n      AC_MSG_RESULT([\n        The following command may be used to install it:\n        sudo yum install libboost-devel\n      ])\n      OK=yes\n    fi\n    if test \"$OK\" != \"yes\"; then\n      AC_MSG_RESULT([\n        If you have a package based system, the package you need to\n        install will be called libboost-devel or something similar.\n      ])\n    fi\n    exit 1\nfi\n\ndnl\ndnl     Test to find a Bourne shell which understands functions\ndnl\nAC_MSG_CHECKING([for a Bourne shell which understands functions])\nif test \"z$SH\" = \"z\"; then\n    if test -f /bin/sh5; then\n        SH=/bin/sh5\n    else\n        SH=/bin/sh\n    fi\nfi\nAC_SUBST(SH)\nAC_DEFINE_UNQUOTED(CONF_SHELL, [\"$SH\"],\n[Set this to be the absolute path of a Bourne shell\nwhich understands functions.])\nAC_MSG_RESULT($SH)\n\ndnl\ndnl     Test to see if this operating system has the ZFS sparse file support.\ndnl\nAC_MSG_CHECKING([for sparse file lseek support])\nAC_TRY_COMPILE([#include <unistd.h>], [fpathconf(0, _PC_MIN_HOLE_SIZE);\nlseek(0, 0L, SEEK_DATA); lseek(0, 0L, SEEK_HOLE); ],\nAC_DEFINE(HAVE_SPARSE_LSEEK, 1, [Define this symbol if your\noperating system has support for sparse file seeking.])\nAC_MSG_RESULT(yes),AC_MSG_RESULT(no))dnl\n\ndnl!\ndnl! Test to see if libgcrypt is sufficiently modern.\ndnl!\nAC_MSG_CHECKING([for gcrypt SHA224 support])\nAC_TRY_COMPILE([#include <gcrypt.h>],\n[gcry_md_hd_t handle; return 0;],\nAC_DEFINE(HAVE_GCRY_MD_HD_T, 1, [Define this symbol if your\noperating system has a libgcrypt that defines the gcry_md_hd_t symbol.])\nAC_MSG_RESULT(yes),AC_MSG_RESULT(no))dnl\n\nAC_DEFUN(AC_GCRYPT_SETUP,\n[\n    dnl!\n    dnl! Test to see if libgcrypt is sufficiently modern.\n    dnl!\n    AC_MSG_CHECKING([for gcrypt SHA224 support])\n    AC_TRY_COMPILE([#include <gcrypt.h>],\n        [return GCRY_MD_SHA224;],\n        AC_DEFINE(HAVE_LIBGCRYPT_SHA224, 1, [Define this symbol if your\n        operating system has a libgcrypt that supports SHA224.])\n    AC_MSG_RESULT(yes),AC_MSG_RESULT(no))dnl\n\n    dnl!\n    dnl! Test to see if libgcrypt is sufficiently modern.\n    dnl!\n    AC_MSG_CHECKING([for gcrypt WHIRLPOOL support])\n    AC_TRY_COMPILE([#include <gcrypt.h>],\n    [return GCRY_MD_WHIRLPOOL;],\n    AC_DEFINE(HAVE_LIBGCRYPT_WHIRLPOOL, 1, [Define this symbol if your\n    operating system has a libgcrypt that supports WHIRLPOOL.])\n    AC_MSG_RESULT(yes),AC_MSG_RESULT(no))dnl\n\n    AC_CHECK_LIB(gcrypt, gcry_md_open,,\n        [AC_MSG_FAILURE([gcrypt test failed (--without-gcrypt to disable)])])\n])\n\ndnl!\ndnl! Test to see if libgcrypt is enabled(default) or disabled.\ndnl!\nAC_ARG_WITH([gcrypt],\n            [AS_HELP_STRING([--without-gcrypt],\n                            [disable support for libgcrypt])],\n            [],\n            [with_gcrypt=yes])\n\nLIBGCRYPT=\nAS_IF([test \"x$with_gcrypt\" != xno], AC_GCRYPT_SETUP())\n\ndnl!\ndnl!  Now look for libtool.\ndnl!\nAC_CHECK_PROGS(LIBTOOL, libtool)\nif test -z \"$LIBTOOL\"\nthen\n  AC_MSG_RESULT([\n        You must have GNU Libtool installed to build srecord.\n        Homepage: http://www.gnu.org/software/libtool/])\n  OK=no\n  if apt-get --version > /dev/null 2> /dev/null; then\n    AC_MSG_RESULT([\n        The following command may be used to install it:\n        sudo apt-get install libtool\n    ])\n    OK=yes\n  fi\n  if yum --version > /dev/null 2> /dev/null; then\n    AC_MSG_RESULT([\n        The following command may be used to install it:\n        sudo yum install libtool\n    ])\n    OK=yes\n  fi\n  if pkg_info -a > /dev/null 2> /dev/null; then\n    AC_MSG_RESULT([\n        The following command may be used to install it:\n        sudo pkg_add -r libtool\n    ])\n    OK=yes\n  fi\n  if test \"$OK\" != \"yes\"; then\n    AC_MSG_RESULT([\n        If you are using a package based install, you will need the\n        libtool package.\n    ])\n  fi\n  exit 1\nfi\n\ndnl\ndnl     If the soelim program exists, and understands the -I option,\ndnl     arrange for the Makefile to install the .ps files from the\ndnl     documentation source files.\ndnl\nif test -n \"$SOELIM\"\nthen\n  if $SOELIM -I. /dev/null > /dev/null 2>&1\n  then\n    : nothing\n  else\n    AC_MSG_RESULT([])\n    AC_MSG_RESULT([     The $SOELIM program does not understand the -I])\n    AC_MSG_RESULT([     option.  There is a patch available for GNU Groff])\n    AC_MSG_RESULT([     which makes this work correctly.  See the BUILDING])\n    AC_MSG_RESULT([     file for details.])\n    GROFF=\n  fi\nfi\nif test -n \"$GROFF\"\nthen\n  HAVE_GROFF=yes\n else\n  HAVE_GROFF=no\n  AC_MSG_RESULT([])\n  AC_MSG_RESULT([       The SRecord documentation set and manual pages will])\n  AC_MSG_RESULT([       be formatted and installed if you first install])\n  AC_MSG_RESULT([       GNU Groff and then re-run this ./configure script.])\n  AC_MSG_RESULT([       Remember to use \\`\\`rm config.cache'' before you do.])\n  AC_MSG_RESULT([])\nfi\nAC_SUBST(HAVE_GROFF)\n\n#\n# Evaluate some of the variables, to remove ${prefix} references.\n# This way, they can be used in C programs and Roff input.\n# Make sure that srecord is mentioned in the datadir path;\n# add it if it is not already there.\n#\ntest \"x$prefix\" = xNONE && prefix=\"${ac_default_prefix-/usr/local}\"\ntest \"x$exec_prefix\" = xNONE && exec_prefix=\"$prefix\"\neval \"exec_prefix=$exec_prefix\"\neval \"bindir=$bindir\"\neval \"datarootdir=$datarootdir\"\neval \"mandir=$mandir\"\neval \"libdir=$libdir\"\neval \"datadir=$datadir\"\n\n\nAH_TOP([/*\n * srecord - manipulate eprom load files\n * Copyright (C) 1998-2002, 2006-2014 Peter Miller\n * Copyright (C) 2014 Scott Finneran\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#ifndef LIB_CONFIG_H\n#define LIB_CONFIG_H\n])\n\nAH_BOTTOM([\n/*\n * There is more to do, but we need to insulate it from config.status,\n * because it screws up the #undef lines.  They are all implications of\n * the above information, so there is no need for you to edit the file,\n * if you are configuring Aegis manually.\n */\n#include <srecord/config.messy.h>\n\n#endif /* LIB_CONFIG_H */])\n\nAC_OUTPUT(Makefile)\ndnl! vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/crc16-ccitt.html",
    "content": ".hy 0\n.nf\n<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">\n<!--\n    Copyright (C) 2001-2007 Joe Geluso.com\n\n    File archived on 20071229021252 and retrieved from the\n    internet archive on 20100330232203.\n-->\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n<meta name=\"Author\" content=\"Joe Geluso\">\n<title>CRC-CCITT -- 16-bit</title>\n</head>\n<body>\n<h1>CRC16-CCITT</h1>\nCopyright &copy; 2001-2007 <a href=\"http://www.joegeluso.com/\" >Joe Geluso</a>\n<p>\n<ul>\n<li> <a href=\"#original\">Document Original</a></li>\n<li> <a href=\"#overview\">Overview</a></li>\n<li> <a href=\"#general\">General</a></li>\n<li> <a href=\"#results\">Results from the C-language Implementations</a></li>\n<li> <a href=\"#long-hand\">Long-hand Calculation for a One-byte Message</a></li>\n<li> <a href=\"#source\">Source Code for the C-language Implementations</a></li>\n<li> <a href=\"#refs\">References</a> &mdash; updated April 4, 2003</li>\n<li> <a href=\"#style\">Style Notes</a></li>\n<li> <a href=\"#addendum\">Addendum</a> &mdash; added April 4, 2003\n(perhaps a little less confrontational than other sections)</li>\n<li> <a href=\"#addendum-2\">Addendum #2</a> &mdash; added July 4, 2003\n&mdash; ITU/CCITT publications and &ldquo;the&rdquo; CRC16-CCITT</li>\n</ul>\n\n<h2><a name=\"original\"></a>Document Original</h2>\nThis page was originally available as\n<a href=\"http://www.joegeluso.com/software/articles/ccitt.htm\"\n>http://www.joegeluso.com/software/articles/ccitt.htm</a>,\nbut has since disappeared.  The <a\nhref=\"http://web.archive.org/web/*/\\\nhttp://www.joegeluso.com/software/articles/ccitt.htm\"\n>Internet Archive Wayback Machine</a> was used to retrieve\nthe latest version before it disappeared.\n\n<h2><a NAME=\"overview\"></a>Overview</h2>\nThis page presents accurate implementations (long-hand and programmed)\nof the 16-bit CRC-CCITT specification, which is:\n<ul>\n<li>Width = 16 bits</li>\n<li>Truncated polynomial = 0x1021</li>\n<li>Initial value = 0xFFFF</li>\n<li>Input data is NOT reflected</li>\n<li>Output CRC is NOT reflected</li>\n<li> No XOR is performed on the output CRC</li>\n</ul>\n\n<p>\nA C-language program is included which produces CRC values which conform\nto this specification.&nbsp; The program also includes a routine\nwhich demonstrates how an incorrect &ldquo;<a href=\"#results\" >check\nvalue</a>&rdquo; which has been found on the web may be generated.\n\n<h2><a NAME=\"general\"></a>General</h2>\nWhy yet another document on calculating CRCs?&nbsp;\nBecause this one:\n<ul>\n<li>\nIndicates that some common implementations of the 16-bit CRC-CCITT may\nproduce incorrect values.</li>\n<li>\nProvides source code for the 16-bit CRC-CCITT without using tables or\nreversed polynomials.&nbsp; The program <a href=\"#source\" >below</a>\nimplements the concepts presented in the first 8 sections of &ldquo;<a\nhref=\"http://www.ross.net/crc/crcpaper.html\" >A Painless Guide to CRC\nError Detection Algorithms</a>&rdquo; by Ross Williams.&nbsp; Things become\nsignificantly more complex in progressing beyond section 8 of that\ndocument.&nbsp; If a table-driven implementation of the 16-bit CRC-CCITT\nis to be developed, a solid reference is needed to ensure that it is\nworking correctly.&nbsp; The source code in this document may fill\nthat role.</li>\n</ul>\n<p>\nImportant features of a standard CRC are that it:\n<blockquote>\n<li>\nCan be used to validate data</li>\n<li>\nIs reproducible by others</li>\n</blockquote>\n<p>\nThe first feature above is easy to realize in a closed system if\ncorruption of data is infrequent (but substantial when it occurs).&nbsp;\nThe term &ldquo;closed system&rdquo; refers to a situation where the\nCRC need not be communicated to others.&nbsp; A correct implementation\nof a 16-bit CRC will detect a change in a single bit in a message of\nover 8000 bytes.&nbsp; An erroneous CRC implementation may not be able\nto detect such subtle errors.&nbsp; If errors are usually both rare and\nlarge (affecting several bits), then a faulty 16-bit CRC implementation\nmay still be adequate in a closed system.\n<p>\nThe second feature above &mdash; that the CRC is reproducible by others\n&mdash; is crucial in an open system; that is, when the CRC must be\ncommunicated to others.&nbsp; If the integrity of data passed between\ntwo applications is to be verified using a CRC defined by a particular\nstandard, then the implementation of that standard must produce the\nsame result in both applications &mdash; otherwise, valid data will be\nreported as corrupt.\n<p>\nReproducibility may be satisfied by even a botched implementation of a\nstandard CRC in most cases &mdash; if everyone uses the same erroneous\nimplementation of the standard.&nbsp; But this approach:\n<ul>\n<li>\nModifies the standard in ways that are both unofficial and undocumented.</li>\n\n<li>\nCreates confusion when communicating with others who have not adopted the\nbotched implementation as the implied standard.</li>\n</ul>\n<p>\nIt appears that some CRC implementations available on the web produce\nincorrect values for the 16-bit CRC-CCITT.&nbsp; How to tell if a\nCRC16-CCITT implementation was botched?&nbsp; By calculating the CRC for\na reference string.\n<p>\nThe CRC value for the 9-byte reference string, &ldquo;123456789&rdquo;\nis <b>0xE5CC</b>.&nbsp; Some web pages report that the value for\nreference string should be <i>0x29B1</i> &mdash; but this value\nis returned by an implementation which does NOT conform to the\nspecification above.&nbsp; CRC values for other reference strings are\nlisted <a href=\"#results\" >elsewhere</a> in this document.\n<p>\nThe <b>bolding</b> and <i>italics</i> above are used to emphasize the\ncorrect value and distort the incorrect value in the hope that it will\ndiscourage propagation of the incorrect value.\n<p>\nWhy focus on the 16-bit CRC-CCITT (polynomial 0x1021) and not CRC16\n(polynomial 0x8005), which appears to have wider use?&nbsp; Because the\n16-bit CRC-CCITT:\n<ul>\n<li>\nIs a straightforward 16-bit CRC implementation in that it doesn't involve:</li>\n\n<ul>\n<li>\nreflection of data</li>\n\n<li>\nreflection of the final CRC value</li>\n</ul>\n\n<li>\nStarts with a non-zero initial value &mdash; leading zero bits can't affect\nthe CRC16 used by LHA, ARC, etc., because its initial value is zero.</li>\n\n<li>\nIt requires no additional XOR operation after everything else is done.&nbsp;\nThe CRC32 implementation used by Ethernet, Pkzip, etc., requires this operation;\nless common 16-bit CRCs may require it as well.</li>\n</ul>\nWhy use a 16-bit CRC instead of a 32-bit CRC?&nbsp; Because it:\n<ul>\n<li>\nCan be calculated faster than a 32-bit CRC.</li>\n\n<li>\nRequires less space than a 32-bit CRC for storage, display or printing.</li>\n\n<li>\nIs usually long enough if the data being safeguarded is fewer than several\nthousand bytes in length, e.g., individual records in a database.</li>\n</ul>\n\n<h2><a NAME=\"results\" ></a>Results from the C-language Implementations</h2>\n<p>\nThe following CRC values were produced by the program whose source\ncode is listed <a href=\"#source\" >elsewhere</a> in this document.&nbsp;\nThe &ldquo;Good_CRC&rdquo; values are in accordance with the CRC-CCITT\nspecification as defined at the <a href=\"#overview\" >top of this\ndocument</a>.&nbsp; The &ldquo;Bad_CRC&rdquo; values are produced by an\nimplementation which reports the incorrect check value that is reported\non some web pages for the reference string &ldquo;123456789&rdquo;.&nbsp;\nThe validity of the &ldquo;Good_CRC&rdquo; values below is demonstrated\n<a href=\"#long-hand\" >elsewhere</a> in this document.\n<p>\n<table border=1 >\n<tr>\n<td>\n<center>\n<h4>\nMessage</h4></center>\n</td>\n\n<td>\n<h4>\nGood_CRC</h4>\n</td>\n\n<td>\n<h4>\nBad_CRC</h4>\n</td>\n\n<td>\n<h4>\nMessage Length (bytes)</h4>\n</td>\n</tr>\n\n<tr>\n<td>\n<center><i>-None-</i></center>\n</td>\n\n<td>\n<center>0x1D0F</center>\n</td>\n\n<td>\n<center>0xFFFF</center>\n</td>\n\n<td>\n<center>0</center>\n</td>\n</tr>\n\n<tr>\n<td>\n<center>A</center>\n</td>\n\n<td>\n<center>0x9479</center>\n</td>\n\n<td>\n<center>0xB915</center>\n</td>\n\n<td>\n<center>1</center>\n</td>\n</tr>\n\n<tr>\n<td>\n<center>123456789</center>\n</td>\n\n<td>\n<center>0xE5CC</center>\n</td>\n\n<td>\n<center>0x29B1</center>\n</td>\n\n<td>\n<center>9</center>\n</td>\n</tr>\n\n<tr>\n<td>A string of 256 upper case &ldquo;A&rdquo;&nbsp;\n<br>characters with no line breaks</td>\n\n<td>\n<center>0xE938</center>\n</td>\n\n<td>\n<center>0xEA0B</center>\n</td>\n\n<td>\n<center>256</center>\n</td>\n</tr>\n</table>\n\n<p>\nAmong the problems with the &ldquo;Bad_CRC&rdquo; implementation is\nthat it does not augment a zero-length message with 16 zero bits, as\nis required (either implicitly or explicitly) when calculating the\nstandard CRC.&nbsp; Thus, it reports a CRC of <i>0xFFFF</i> &mdash; not\n<b>0x1D0F</b> &mdash; for a zero-length message.\n\n<h2><a NAME=\"long-hand\" ></a>Long-hand Calculation for a One-byte Message</h2>\n<p>\nThe purpose of this section is to demonstrate that the\n&ldquo;Good_CRC&rdquo; values listed in the previous section do, in\nfact, conform to the CRC-CCITT specification as defined at the <a\nhref=\"#overview\" >top of this document</a>.\n<br>&nbsp;\n<table border=1 >\n<tr>\n<td><tt>Calculation of the 16-bit CRC-CCITT for a one-byte message consisting\nof the letter &ldquo;A&rdquo;:</tt>\n<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nQuotient=&nbsp; 111100001110111101011001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; poly=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n------------------------------------------</tt>\n<br><tt>10001000000100001 ) <font color=\"#FF0000\">1111111111111111</font><b>01000001</b><font color=\"#3366FF\">0000000000000000</font></tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"#FF0000\">red\nbits</font> are initial value</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11101111110111111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>bold bits</b> are message</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"#3366FF\">blue\nbits</font> are augmentation</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11001111100111100</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001111000111010</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00001110000110110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00011100001101100</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00111000011011000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01110000110110001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11100001101100010</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11010011010000110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10110110101001110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01111101011011110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11111010110111100</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11100101100111010</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11011011000110110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10100110000101110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01011100000011110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10111000000111100</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01100000000111010</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11000000001110100</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10010000010101010</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00110000100010110</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01100001000101100</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000000000000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n11000010001011000</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10001000000100001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-----------------</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1001010001111001 = CRC</tt>\n<br>&nbsp;</td>\n</tr>\n\n<tr>\n<td><tt>Conversion of the binary value above to hexadecimal by segmenting\nthe bits to nibbles:</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbinary nibbles&nbsp;&nbsp; 1001 0100 0111 1001</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nhexadecimal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;\n4&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; 9</tt></td>\n</tr>\n</table>\n\n<h2><a NAME=\"source\" ></a>Source Code for the C-language Implementations</h2>\n&nbsp;\n<table border=1 >\n<tr>\n<td><tt>/*</tt>\n<br><tt>demonstrates how the incorrect check value of 0x29B1 may be reported</tt>\n<br><tt>for the test string &ldquo;123456789&rdquo; when it should be 0xE5CC.</tt>\n<br><tt>*/</tt>\n<p><tt>#include &lt;stdio.h></tt>\n<br><tt>#include &lt;string.h></tt>\n<p><tt>#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npoly&nbsp;&nbsp;&nbsp;&nbsp; 0x1021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n/* crc-ccitt mask */</tt>\n<p><tt>/* global variables */</tt>\n<br><tt>char text[1000];</tt>\n<br><tt>unsigned short good_crc;</tt>\n<br><tt>unsigned short bad_crc;</tt>\n<br><tt>unsigned short text_length;</tt>\n<p><tt>int main(void)</tt>\n<br><tt>{</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; void go();</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; void repeat_character(unsigned char, unsigned\nshort);</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; sprintf(text, \"%s\", \"\");</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; go();</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; sprintf(text, \"%s\", \"A\");</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; go();</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; sprintf(text, \"%s\", \"123456789\");</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; go();</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; repeat_character(65, 256);</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; go();</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; return 0;</tt>\n<br><tt>}</tt>\n<p><tt>void go(void)</tt>\n<br><tt>{</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; void update_good_crc(unsigned short);</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; void augment_message_for_good_crc();</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; void update_bad_crc(unsigned short);</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; unsigned short ch, i;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; good_crc = 0xffff;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; bad_crc = 0xffff;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; i = 0;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; text_length= 0;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; while((ch=text[i])!=0)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update_good_crc(ch);</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update_bad_crc(ch);</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_length++;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; augment_message_for_good_crc();</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; printf(</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; \"\\nGood_CRC = %04X,&nbsp; Bad_CRC = %04X,&nbsp;\nLength = %u,&nbsp; Text = \\\"%s\\\"\",</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; good_crc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbad_crc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_length,&nbsp;\ntext</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; );</tt>\n<br><tt>}</tt>\n<p><tt>void repeat_character(unsigned char ch, unsigned short n)</tt>\n<br><tt>{</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; unsigned short i;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;n; i++)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text[i] = ch;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; text[n] = 0;</tt>\n<br><tt>}</tt>\n<p><tt>void update_good_crc(unsigned short ch)</tt>\n<br><tt>{</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; unsigned short i, v, xor_flag;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; /*</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; Align test bit with leftmost bit of the message\nbyte.</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; */</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; v = 0x80;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;8; i++)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (good_crc &amp; 0x8000)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nxor_flag= 1;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nxor_flag= 0;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; good_crc = good_crc\n&lt;&lt; 1;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ch &amp; v)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n/*</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAppend next bit of message to end of CRC if it is not zero.</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe zero bit placed there by the shift above need not be</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nchanged if the next bit of the message is zero.</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*/</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ngood_crc= good_crc + 1;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xor_flag)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ngood_crc = good_crc ^ poly;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Align test bit with\nnext bit of the message byte.</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v = v >> 1;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>}</tt>\n<p><tt>void augment_message_for_good_crc()</tt>\n<br><tt>{</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; unsigned short i, xor_flag;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; for (i=0; i&lt;16; i++)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (good_crc &amp; 0x8000)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nxor_flag= 1;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nxor_flag= 0;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; good_crc = good_crc\n&lt;&lt; 1;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xor_flag)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ngood_crc = good_crc ^ poly;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>}</tt>\n<p><tt>void update_bad_crc(unsigned short ch)</tt>\n<br><tt>{</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; /* based on code found at</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; http://www.programmingparadise.com/utility/crc.html</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; */</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; unsigned short i, xor_flag;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; /*</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; Why are they shifting this byte left by 8 bits??</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; How do the low bits of the poly ever see it?</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; */</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; ch&lt;&lt;=8;</tt>\n<p><tt>&nbsp;&nbsp;&nbsp; for(i=0; i&lt;8; i++)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((bad_crc ^ ch) &amp;\n0x8000)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nxor_flag = 1;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nxor_flag = 0;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bad_crc = bad_crc &lt;&lt;\n1;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xor_flag)</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbad_crc = bad_crc ^ poly;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = ch &lt;&lt; 1;</tt>\n<br><tt>&nbsp;&nbsp;&nbsp; }</tt>\n<br><tt>}</tt></td>\n</tr>\n</table>\n\n<h2><a NAME=\"refs\" ></a>References</h2>\nThe following web page contains a javascript calculator that is handy for\nwhat-if comparisons in calculating various CRCs by slightly different methods\nand with any initial value &mdash; very well done:\n<ul>\n<li>\n<a href=\"http://www.zorc.breitbandkatze.de/crc.html\"\n>http://www.zorc.breitbandkatze.de/crc.html</a>\n&mdash; CRC calculation, by Sven Reifegerste.</li>\n</ul>\n\n<p>\nThe following web pages were among those which were helpful in developing\nthe text and program in this document:\n<ul>\n<li>\n<a href=\"http://www.ross.net/crc/crcpaper.html\"\n>http://www.ross.net/crc/crcpaper.html</a> &mdash; &ldquo;A Painless\nGuide to CRC Error Detection Algorithms&rdquo;</li>\n<li>\n<a href=\"http://www.embedded.com/internet/0001/0001connect.htm\"\n>http://www.embedded.com/internet/0001/0001connect.htm</a> &mdash;\nanother detailed discussion which includes a table containing check values\nwhich were not included in the first document above.&nbsp; The table is\nat <a href=\"http://www.embedded.com/internet/0001/0001contable1.htm\"\n>http://www.embedded.com/internet/0001/0001contable1.htm</a>, but the\ncheck value for the 16-bit CRC-CCITT seems to be incorrect (the others\nseem to be correct).</li>\n<li>\nThe following page also contained the seemingly\nincorrect check value for the 16-bit CRC-CCITT: <a\nhref=\"http://www.aerospacesoftware.com/checks.htm\"\n>http://www.aerospacesoftware.com/checks.htm</a></li>\n<li>\nLink not functioning on 3-April-2003 &mdash; C-language source\ncode which allowed reproducing the seemingly incorrect\ncheck value for the 16-bit CRC-CCITT was found at: <a\nhref=\"http://www.programmingparadise.com/utility/crc.html\"\n>http://www.programmingparadise.com/utility/crc.html</a></li>\n<li>\nLink not functioning (but still cached by Google) on April 3, 2003 &mdash; The\nfirst external indication that the 16-bit CRC-CCITT values which seemed\nto be incorrect above may actually be incorrect was gleaned from: <a\nhref=\"http://www.cs.ucla.edu/classes/spring00/cs33/proj/PROJECT_3.html\"\n>http://www.cs.ucla.edu/classes/spring00/cs33/proj/PROJECT_3.html</a></li>\n</ul>\n\n<h2><a NAME=\"style\" ></a>Style Notes</h2>\n<ul>\n<li>\nWhy are the long-hand example and source code embedded in HTML\ntables?&nbsp; Because they are in fixed-width font and confining the\nfont tags within tables aids in editing the document.</li>\n<li>\nWhy isn't the source code written using more of the compact forms\nallowed by the C-language?&nbsp; To make it more accessible to BASIC\nprogrammers.&nbsp; Note that the variables in these C-language routines\nhold 16-bit values.&nbsp; Shifting the value 0x8000 (32,768 decimal) by\nleft one bit is equivalent to multiplying by two; but a 16-bit variable\ncannot hold 0x10000 &mdash; it becomes zero, not 65,536.</li>\n</ul>\n\n\n<h2>\n<a NAME=\"addendum\" ></a>Addendum</h2>\nThis addendum is a quick attempt to address &ldquo;the rest of the\nstory&rdquo; as it has become more clear to me after several e-mail\nexchanges with Sven Reifegerste, whose web page is linked <a href=\"#refs\"\n>above</a>.\n<p>\nTo begin with, I have yet to see a specific reference to an <a\nhref=\"http://www.itu.int\" >ITU</a> (formerly CCITT) document that clearly\nidentifies exactly where &ldquo;the&rdquo; algorithm for the CRC16-CCITT\nis given.&nbsp; If anyone can cite &ldquo;<a href=\"#addendum-2\" >chapter\nand verse</a>&rdquo;, please let me know where the official specification\nmay be found.\n<p>\nAt this point, I'm left with what I can find on the web and what\nseems most credible to me.&nbsp; The article by Ross Williams, cited\n<a href=\"#refs\" >above</a>, seems to have stood the test of time and\nexplains things in a way that (eventually) make sense to me.&nbsp;\nI count it as very credible.\n<p>\nThe snippets of C code scattered around the web which claim to produce a\nCRC16-CCITT have taken on a life of their own, whether they are actually\ndoing what they advertise or not.\n<p>\nI have not yet made a thorough investigation into everything that will\nbe said below, so it may be subject to extensive revision once I find\ntime to do so.\n<p>\nIt seems that most of the CRC code on the web actually does implement\nsome form of CRC algorithm &mdash; as opposed to some less-robust kind\nof checksum.&nbsp; It is questionable in some cases whether their\nalgorithm actually implements the CRC that they claim it does.\n<p>\nAssuming that an algorithm is actually implementing some kind of\nCRC, certain features of that algorithm are crucial when accurately\nimplementing a particular CRC:\n<ol>\n<li>The polynomial</li>\n<li>The initial value</li>\n<li>Whether or not &ldquo;zero&rdquo; bits are explicitly appended to\nthe message</li>\n</ol>\n<p>\nThere seems to be no controversy that the &ldquo;correct&rdquo;\n(truncated) polynomial is for the CRC16-CCITT is 0x1021.\n<p>\nAccording to the document by Ross Williams, the initial value for\n&ldquo;the&rdquo; CRC16-CCITT is 0xFFFF.&nbsp; There seems to be little\ncontroversy over this, either.\n<p>\nIt is usually the case that no one really wants to explicitly append\n&ldquo;zero&rdquo; bits to the end of a message to calculate a\nCRC.&nbsp; The mathematics of calculating a CRC do allow a shortcut to\navoid this time-wasting exercise &mdash; but if the shortcut is taken\nwithout making a corresponding change in the initial value, then the\nresult is a <b>different</b> CRC.\n<p>\nThe question at this point is:\n<blockquote>\nDoes the official specification for the CRC16-CCITT say that initial\nvalue of 0xFFFF applies to a message <b>with</b> or <b>without</b>\n&ldquo;zero&rdquo; bits explicitly appended to the message?\n</blockquote>\n<p>\nIt makes sense to me that the initial value of 0xFFFF applies to a\nmessage <b>with</b> &ldquo;zero&rdquo; bits explicitly appended to the\nmessage.&nbsp; Why?&nbsp; Because the purpose of a CRC is to detect\nerrors, not necessarily to be implemented in a compact algorithm or to\nhave parameters that are easy to remember.\n<p>\nWhatever clever technique is used to calculate a CRC, it is always\nemulating a simple implementation in which &ldquo;zero&rdquo; bit\n<b>are</b> explicitly appended to the message.&nbsp; I think it unlikely\nthat the official specification for the CRC16-CCITT would be in terms of\nanything but the most basic implementation.\n<p>\nThe paper by Ross Williams says:\n<blockquote>\n&ldquo;In theory (i.e. with no assumptions about the message), the\ninitial value has no affect on the strength of the CRC algorithm&rdquo;\n</blockquote>\n<p>\nBut did the committee that designed the CRC16-CCITT make <b>no</b>\nassumptions about the message?&nbsp; I suspect that they made one or\nmore assumptions about the kinds of messages that were important to\nthem.&nbsp; If the &ldquo;correct&rdquo; check value for message,\n&ldquo;123456789&rdquo;, using &ldquo;the&rdquo; CRC16-CCITT is 0x29B1,\nwhy would they choose an initial value of 0x84CF (see table below) for\nthe initial value?&nbsp; Remember, the ultimate definition of a CRC\nrequires &ldquo;zero&rdquo; bits to be explicitly added to the end\nof the message &mdash; all other implementations use tricks (clever\ntechniques) to accomplish an equivalent calculation.&nbsp; Why would\nthe CCITT (now ITU) want to specify an initial value of 0x84CF to\nerror-check the kinds of messages that were important to them?\n<p>\nIt seems that the same CRC can be calculated using the parameters below:\n<br>&nbsp;\n<table border=1 >\n<tr>\n<td><b>Initial Value</b></td>\n\n<td><b>&ldquo;Zero&rdquo; bits explicitly</b>\n<br><b>appended to message</b></td>\n\n<td>\n<center><b>CRC for the test message,</b></center>\n<b>&ldquo;123456789&rdquo;</b></td>\n</tr>\n\n<tr>\n<td>\n<center>0xFFFF</center>\n</td>\n\n<td>\n<center>Yes</center>\n</td>\n\n<td>\n<center>0xE5CC</center>\n</td>\n</tr>\n\n<tr>\n<td>\n<center>0x1D0F</center>\n</td>\n\n<td>\n<center>No</center>\n</td>\n\n<td>\n<center>0xE5CC</center>\n</td>\n</tr>\n\n<tr>\n<td>\n<center>---</center>\n</td>\n\n<td>\n<center>---</center>\n</td>\n\n<td>\n<center>---</center>\n</td>\n</tr>\n\n<tr>\n<td>\n<center>0x84CF</center>\n</td>\n\n<td>\n<center>Yes</center>\n</td>\n\n<td>\n<center>0x29B1</center>\n</td>\n</tr>\n\n<tr>\n<td>\n<center>0xFFFF</center>\n</td>\n\n<td>\n<center>No</center>\n</td>\n\n<td>\n<center>0x29B1</center>\n</td>\n</tr>\n</table>\n\n<p>\nWhich is &ldquo;the&rdquo; CRC16-CCITT?&nbsp; I think it is 0xE5CC.\n<p>\nBecause I haven't seen &ldquo;<a href=\"#addendum-2\" >chapter and\nverse</a>&rdquo; from an ITU document clearly calling for some\n&ldquo;shortcut&rdquo; algorithm using the 0xFFFF initial value, I\nremain convinced that the &ldquo;correct&rdquo; check value for message,\n&ldquo;123456789&rdquo;, using &ldquo;the&rdquo; CRC16-CCITT is 0xE5CC\n&mdash; not 0x29B1, as is more widely claimed.\n<p>\nIs this spitting into the wind?&nbsp; Probably so.&nbsp; I don't imagine\nthat <font color=\"#000000\" >publishing this page is going to cause the\n&ldquo;incorrect&rdquo; implementations to disappear.</font>&nbsp; It is\noffered mainly to help others avoid the frustration that I experienced\n&mdash; what almost everyone else said was the &ldquo;correct&rdquo;\ncheck value doesn't seem to be correct when trying to calculate the\nCRC16-CCITT from first principles.&nbsp; This page attempts to provide\ninformation which may be helpful in resolving this issue.\n<p>\nAs Sven Reifegerste pointed out to me, the &ldquo;correct&rdquo; check\nvalue for the CRC32 seems to be calculated in a way that is similar\nto most implementations of the CRC16-CCITT &mdash; everyone seems to\ncalculate CRC32 with an initial value of 0xFFFFFFFF but <b>without</b>\n&ldquo;zero&rdquo; bits explicitly appended to the message.&nbsp; The\nCRC32 is much more widely used &mdash; it is calculated and stored\nfor each file that is archived in a .zip (compressed) file.&nbsp;\nI'm not prepared to spit into that hurricane.&nbsp; And I think that\nthose who are trying to come to grips with exactly how to implement a\nCRC calculation will find that beginning with a 16-bit CRC, such as\nCRC16-CCITT, may be more manageable than wrestling with a 32-bit CRC\nalgorithm.\n\n<h2><a NAME=\"addendum-2\" ></a>Addendum #2 &mdash; ITU/CCITT publications\nand &ldquo;the&rdquo; CRC16-CCITT</h2>\n<p>\nThank you to the several people who responded to the request for\n&ldquo;chapter and verse&rdquo; where the official specification may be\nfound for &ldquo;the&rdquo; CRC16-CCITT.\n<p>\nThe ITU (formerly CCITT) documents that have come to my attention so\nfar are:\n<ol>\n<li>\nRecommendation V.41 &mdash; &ldquo;Code-Independent Error Control\nSystem.&rdquo;</li>\n<li>\nRecommendation X.25 &mdash; &ldquo;Interface between Data Terminal\nEquipment (DTE) and Data Circuit-terminating Equipment (DCE) for terminals\noperating in the packet mode and connected to public data networks by\ndedicated circuit&rdquo;</li>\n<li>\nRecommendation T.30 &mdash; &ldquo;Procedures for document facsimile\ntransmission in the general switched telephone network&rdquo;</li>\n</ol>\n<p>\nITU allows three free downloads (another page on their site says three\nfree downloads per year?) of their standards, as mentioned here:\n<blockquote>\n<a href=\"http://www.itu.int/publications/index.html\"\n>http://www.itu.int/publications/index.html</a>\n</blockquote>\n<p>\nDo be careful to follow the instructions as they are presented &mdash; I\nwasted a free download by not doing so.\n<p>\nAll three documents mentioned above use the same truncated polynomial\n&mdash; 0x1021.\n<p>\nRecommendation V.41 seems to specify an initial value of\n&ldquo;zero&rdquo; &mdash; which differs from the usual implementations\nof CRC16-CCITT.\n<p>\nRecommendation X.25 seems to:\n<ol>\n<li>Use an initial value of 0xFFFF, but</li>\n<li>Require the step of performing one's complement, and</li>\n<li>Be composed of the sum of two remainders obtained from two separate\npolynomial divisions.</li>\n</ol>\n<p>\nThe result from the X.25 calculation may be mathematically equivalent to\na usual implementation of CRC16-CCITT, but that isn't clear to me at this\npoint.\n<p>\nRecommendation T.30 seems to:\n<ol>\n<li>Use an initial value of 0xFFFF, but</li>\n<li>Require the step of performing one's complement</li>\n</ol>\n<p>\nThus, T.30 seems to depart from usual implementations of CRC16-CCITT in\nthat it requires performing one's complement.\n<p>\nThere seems to be relatively good agreement among the routines found on\nthe web concerning <b>some</b> parts of &ldquo;the&rdquo; CRC16-CCITT\nspecification.&nbsp; But at this point (July 2003), I am not aware of\nan ITU/CCITT document that agrees with other parts of &ldquo;the&rdquo;\nCRC16-CCITT specification (as it is normally rendered in routines found\non the web), and:\n<ol>\n<li> Requires a non-zero initial value</li>\n<li> Does not require the step of performing one's complement</li>\n</ol>\n<p>\nPerhaps I missed something in one of the documents mentioned above?\n<p>\nIt is also becoming less clear to me that the ITU/CCITT intended or\ndocumented the calculation of a stand-alone CRC.&nbsp; Their documents\nseem to be more focused on a FCS (Frame Check Sequence) that can be used\nto validate a serial transmission immediately upon receipt rather than\nbeing concerned about ensuring that disk files (static data) are intact\nor unmodified (to the extent that a CRC is good for such a purpose)\nafter a period of months or years.\n<p><br><p>\n<hr/>\n<p><br><p>\nCopyright &copy; 2001-2007 Joe Geluso\n<br>\nAll disclaimers apply &mdash; use at your own risk.\n<br>\nThis page may reproduced only if it is not altered and it is reproduced\nin its entirety &mdash; including the <a href=\"http://www.joegeluso.com/\"\n>link to the author's web site</a> (now gone).\n</body>\n</html>\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/debian.png.uue",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nbegin 644 debian.png\nMB5!.1PT*&@H````-24A$4@```$````!`\"`8```\"J:7'>```*8$E$051XG.6;\nM>W!4]17'/^?>?24D((^$`('L@E);4-'1%K&(%E%KK;5L\"*2`BH\\*6M%6.HK3\nMBHR.+8I640KX!!DD\"0D^$\"N^L$*U6!U$Q\">PF_`P(J\\`FV0WV7OZ1X!L8$/N\nM;C81A^_,SNSO=W_G>\\[OW'-_]]S?0U25$QG&]VW`]XT3W@&.]E2VM=?U[OI=\nM56<):JIJMM$Y;87GU)-K0Q]L.%73'!5]Y_SE``4#VO69E/88`S9GCNDNX;J)\nMJ$X2Z'ZPNEQ!@9T\"*Q0ZB>!6R!7E&TPI,[.RWNR]96ZD+6UK4P<$T@OZ2UW]\nM5*`0<\"<JK_\"M\"+,-CV=NGWW/?Y=Z\"]O(`8$.HW.DKFX:RO6DYC&K55@OT!_8\nM0$['$=XM\\ZM3P)M:!^P8-=NL?FGEQ:BU`,A*&?'1V(#(`LEPSLO;7;2O-40I\nM<T`@+?\\LZJWY`@,!L2%2#=0!WRF$@##@%.@+=+*IMD(=QC6^FM*5R5F=(@<$\nMW/D_%\\MZA98-#ZDP2YR.!6::JS(:K3>]>XIV']DHV*FPFX8C9Q#5D0(C@9QC\nM<$8P9;2WMNS%9&QOM0.\"[OSA6-;+0'IS;12V\"11+FO.1O'W%6Q+AWW'!/6;H\nM_4^NP>)A@8[--*O'E''>VK+B1+BAE0X(N/U#Q=+7:*;S\"IM$I$2%#W$X5_E\"\nM14F/Y!498_I8D<A3*\".::1+%,'[E#9>N2(0W:0<$NH[/E'VA330WV`F/9)Z9\nM.Z7KFEG1I!3$P[02\"=Y?]#AP4S,M*M7E/,,7*MYAES+Y5'A_Z#'B=[X>6(;3\nM^;>4=AY@>H&FGW?Z9&!),RURB-0]3<D&.X,PD&0$!#W^<XGJ>W'85N$PK_56\nMEVY,F#0!;.LUP1W94;5<8'C<!J84>&O+FG-2$]B.@&\":?_#A0I0I1UY781X]\nMLRYJZ\\X#]-KV;%C27?G`]K@-HCK9+I=M!ZA%!X\"`>]1`T\"N;7!/N\\$663O0&\nMGVC3O#T6WJJBO1CRASB7]@-#RCW^@79X;#O`%RY[*^CQ#Q8K^GH3.>$^7V3I\nM`W9Y4@EON.P%A34Q5?NTBSM7A866F/5V.!(;!\"V]'>@14S//N^*6NQ/B2#'$\nME!DQQ8[LJ?NU.,Q[P+(E;^]#95J)E,\\L[8D2&_H?.;*[W,J%%R:=2`2]OW>Q\nM?6>A*F,$!@!9H)4@GV+*,V;?/LMZ?_:/8]Y),RMK>7WECBHYF(6*6@O!V<MP\nM&+8\\T&($!#H4Y`0?>S%3ZZ(3B7684)J[[:FP'27QL-GC_RG;=GZ%\\C3@46&F\nM.HQ?X'048AH/JJ4#ZC=6/%2>-NK'Q^+IO65N1\"`V^1&)1@=9(GOLV-%R!%B6\nMX1E\\]H':-U9?%UNMAIE0QA6+H#M_A&'IR\\#GXC2O\\%8O^21.LW<!`IZ1PP(9\nM8_;[#A1M;990Y`L.OLX5MF'*#KJXPEO'SC)R%TT^9B2T&`&^FM+M-6^_-X38\nM9U]8YJM=LK8EV7@(9!9VP[(6J+#`TZ?[S_+B=[Y1?^W2?SM_,R3^ZZX1'S2:\nM1B^BFN4+SH^$<]TM/I[V!D'+^FV3LA@S;<D=@?*<&SQ2&UX&;'3YLF[)V32G\nMSHY<2W<1,0)-*[0'0+\\9-[;H`'N#H')YXU^^]MU9L,J6W)$TNW=?#9PA;K-?\nMKR_GV>J\\+5[1:&SNJ^\"R*VLK`@2J8@K+F5Z0W,BO.A%8FG=@R3=)R3<#`VD2\nM(6+IU,K+'K;5-[MYP.'Y-VDN_6P!0;?_?&\"0BCR;C#Q`T%-P>KQZ\"VWR.:[P\nM<LZK?TK-:S`.*I.0094+`,3M7I>,/(`8&C?5%HMN,<6](AS]H=8,[#H@YA$S\nMDG(`:%=`M5_VWN3D(:]ZR1=Q+XAF'-8BO('I7&V7,V$'J*%).4#`!*+R^9:A\nMR<@?ZQM?&^8@&O2(\\::1YK25!(%-!VAL!#@<248`>P`'JC]*5'!3]PD=@M?=\nMV_S$J.I%A_YAFN]$ZZ*VUR+LO@4.#RCB=H?LDL=\"X3,`508D*FONK1J&51^W\nM4Q498W)$&=N@0Y9[JXN_,AQ.V]QV(Z#Q+1\");TB+,,U5@\"5H87G.#9Y$1,7M\nM_L@;*CUJ-GGS.5--*QQ9SZ&I.9,'F%8B5J>,&KO<=B.@\\:X[L._>&#A'#MT.\nML@RDJ[5[=V%S[8(>_Y\"@>^2DH#O_LD-U>?L6?QNOK;'^JP%`-Z!.X5'KUHM7\nM?_W::L,7_*?MB1F[@^\"!P_^JPZ?8)8]%[J+)EIH\\!.Q'=68@8U2O>.W2!Y^V\nM1@WC?T:Z^9]C\\55T&MT92Q\\'4&&QKV[I;?UFW*BGW'ZCO8F`@[#W\"$AC!*CJ\nM58DH`-@[Z#9'T.TOD,P.:Q&Y5J\"+A*.+@CW&'K6>D/W./5%?3>F'??845\\7C\nM`@AT&-7'JJY;A3(4*,>0Q8<O)KB_P&8$2&,(*GT340!PTL>/U&.11G5M#SW)\nM_9H*]P/#V%GS=GE&H>U%U(K.A9T\"+O]HB=2O!08HK,-C#F;,Y:\\G:M,AV'.`\nMR/N'_BH-DZ.)PG7)P(5J6>E2%1F&:92JR&W`V1H.KPVX_%>WE+L'//G#K0/A\nM=:):!-(%X55)=U_@W;^DTC=_0D)A'PM;ZP);NXSK6+^_>C<-R8SB<N1X0R6V\nM5U\\.8^5*`0C^<G:^6MI-A.U8UD*03(4O$5XT3.--A5VJ6%AZNJ\"7T/#J''20\nM92<&?_4NO'=>*K;3V%X8\"3A'KI5#1C2LQI:T1G'`[;\\42_\\HL!'(5CA?(/L8\nM(NL0>8Z.GB>\\.Q<=.$:[A&#;`4&7?S:J-P$HK,D\\M_]YW=[]>ZN6O@+9O\\M@\nM;^TMP\"DXS1FBZB!JG4/#][PT_*02A_F1-U22T*JR7=B/`)=_A*C&#C;E&'*7\nM-USV?&N-^*;_9&>X8MNE1'60&EBH?\"<0PN%XSUM='&B9(7G8=\\`USQJR:-D7\nM0$P>H'LTS76R;U_Q49L<?BBPOS(T?X*%R)RFM5)'N'Y8JHUJ3R0T(2)IKOG$\nM?!<`V2+R@[W[D*`#\\JH6[U%A89/*J#4WT..ZA/<`'B](?$K,Z;R;AF_[@]`\\\nM*W0@H]GVQSD2=H`O5+Q#A:F--9)FU-3=ETJCVA-);9%Q7WS:D\\0L2PM<&>PV\nM]@<9!4DYH.<KTRTQ91(-&QT!<MA7\\V#JS&H_)+U)*J^V;\"TBDPY7*!.#KOR1\nM3\"NQO4'I>$#K-TJZ_`^@^N>&DNY1,:;X(F7/I,\"V=D&K3XQX+CKO3H67&DK2\nM652G;.TY/JVUO.V%E.P5WIP]KH.QM_H5#J[^J/\"<F,8<;TWI?UM-WL9(V6[Q\nM+;TGNNHK=SPM,.Y@5;V:QF6^VM(W4J*@C9\"R0U.]M\\R-^.X:<Y4BAW(\"AT2M\nM?P5=_NFITM$6:)L3(V[_>+'T4:`SL$I-\\V9?[9+U*5>4`K39F:%@AU'=B40?\nM`L8\"JE\"&(2]0>'E1:^;P4HTV/S46\\/B'2U1G`3\\!4.$9HTO7F_,JGZQM4\\4V\nMT>8')WVU96]Y%]T[$-,X'Y@ORFC=M6M->5K^X$UWS/O>DZ9V.3<8BT#7\\9GL\nM#UV!<J9`CHI4B/`Q#OG4F=OUZU3N';*#=G?`\\883_NSP\">^`_P-S(.;?A6#;\n-*0````!)14Y$KD)@@@``\n`\nend\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/doc_cat.png.uue",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nbegin 644 doc_cat.png\nMB5!.1PT*&@H````-24A$4@```&(```\"`\"`8```#P*;R'`````7-21T(`KLX<\nMZ0````9B2T=$`/\\`_P#_H+VGDP````EP2%ES```+$P``\"Q,!`)J<&`````=T\nM24U%!]D\"$PL8#JA_%ND``\"``241!5'C:[+UIL&77==_W6WOO,]SA#?UZ0J-!\nM-`B`($$2%(\"F)LJBJ%0DQP.IT$Y9B4,[E7(*3O*)Y8^.4Y6DRG2E;)64I\"H5\nMJ^0/=LHN.[8#A;$5RRP-UDA2($63`D&#F!I`#^CAS7<XP]XK'_8^YY[[NM&4\nM!\\GZH-=UJN^[[XY[[37]UW^M#7_X\\X<_?_CSAS]_X'ZDN_'<<\\_QD0LW_N9_\nM]>,??<XX@Q@+(JA1Q`AJ+!@!3+Q$4!$0`65U/P8`#0$4%(.@J'I0'_^F'I$`\nM>\"\"`!N*+*`2/JB($D``AK/Z,HO$&:$`U$'Q`@X>F1JLEH:K1JB)4#=K4A-!\"\nM4\"7HC>KPZ.]][;=?^>O_^.WWO?-W_LF7_D`)PJU))3=(D:$J!(EB$@7U`6E#\nMO$,%Q*`\"B$G/C,LC(F`=BD01\"Q@40D\"T!574M_&VURB8;BOX@'H/(6!05$.W\nMY/%YH7M)C;]K0!1,B,\\+OD%:CVD#P<?MH,9\"\"`1:\"=Y?<%GQES[ZT0]^YMG+\nM^G__CY_^U-][[U_X_*_]01%$MY+\\]$__=-20N,X825\\&@XHA6(,:B9<E:4>W\nM.^/\"JS'T>UOC1M>@^*8A-`W:-M`V^*8EA!8-`?6*M@H:A1[775`51\"5]($%,\nM?(\"JHIJ464%4,,9B7`ZV0\"3#.H>Q%C$&L18C#F,=DCE1*^<#_K\\N9.\\7?O&O\nM_>\"O7;Y\\^0^6((!HBV1HL+K]WET:S85V$NO^+F@P<4$;1;PBOD7;&E\\MH*G0\nMID+;\"@TMXKM=[%'OT39>_<N'N`&\"@@\\05%`UT42AR9PE84C\\P$8$XQQD&2H.\nM;`'&88Q#K$.,PQB+B,&*D::J\\R=.^Q_XG_]4\\<(?)$$(D\"'8H:U7XJX758RF\nM=1<0\"00-:>>:N$-5T^71MB:T-5055$N\"K\\%[M/&H;U`\"!%U)6)2`X!$\\AB!1\nM\"]78SA@EOV1`NTN&.R2Z'R5JAW6(L1C)(#C`(F*ATQ)C$2OXMN']Y\\SE?_ZY\nM[W_A#XH@3*\\1:=/)RLPC\"*+=3E1\"Z-9=DSYT.]6CH2%H\"]XC&NV]2`\"C@]<,\nM&`/&=.]HXCL%>A\\4'RA@#=)]3.F>%\"\\1Z756C&\",8(Q!G$.,`9L67TSZ#M'4\nM:?I>BA#:AL<OC)_\\^<_]X`N7+U_FWY>I&FK$P\"B%M,BL=EY_VZ#]CC1I\\:*S\nM#C[$W8Z/-D8\":LQJH0U@5PY^M:C)YQA!)2Z\\=,]!XJ(:Z86C(JAHE%F2&Z*]\nMH*+/R##.8IQ-$:\")`A&#$8FO;R`$CVVK\\=./G;K\\U_Z3Z0M?^<I7_KT(8R@(\nM(ZJ(AGZW!XWK')#>3@>-.RJHHMH2\"'@\"A#89E^BN530Z]A1HQ446%`/6H,9$\nMJR*Z<OS)[\"4G$7=P,-T+]!N@V\\W:.7(D:9;&!1:'L1DFRQ%GXV4-8N/C55?/\nM4Z!=+JAG1SS[Y(7+7_@;/_SO11CFY!V:%KK_HKV_L(1.$)TOT(!J\"]HBZE-(\nMJXAHOSCB!+%IYUN[LOU=Z\"OT0B\"%;&I.1`F=9LC*.<<=;9)VR)JI$@,X@V06\nMDSF,<Y@L^@=CXN=1&Y\\7@N);S_)@#Q'EV0\\]>/D+/_'[+PPS-$D*!!&\"&`+=\nM)2NAJ*08WJ,$%`^=%DB*/[N=J?$^P2!BDW;8WOQHLO/0[?A.>Z(@8RS;)7F*\nMAA0,,%QTB9K5:07Q_OY*9DTRB^0.R2QD%G&=_XAF4=73-A7SO3MDY83+'[IX\nM^0M__3_X?16&60]3S>!:N6!5816X=$Y7Z74G\"4`&\";MVCK1WK-%ITN4&@]T<\nM30[1KY@H0#6*6D4E\";S30*+)ZWT&2;#]EAI\\$&/`NNBP;8;8##46R3,D,RDN\nMZ'P3S&Z_@YM,L:,)EY]Z\\/(7?N+W3QCF;L2CL]U=:-$M:%JD5=\"2K%;T!WU(\nMK]WZI_`4GW9W>AT[\"(^-C0(S&J_>B0J]570\"5OJ`KE]\\!+!]B-W'%H,D%&(4\nM96P6<X@LPQ0Y8F-^88R)<DO/]?42]0%73G'EA,L?>G#-9[STTDN_CSZBL\\!=\nM9MO;_)4&=%H0-U-GN]/R&(F7I\"C)1[RH>^5!S-K[D2[6BIB%KM+ZSG=(>IZU\nM*U/6J8`85*)`5$_HMH!@L!)S!V,MUN6(R_K?U=JD81#P-/-CLO$(5TZBF7KJ\nM8J\\9G_[TIW_/A+$N\")%^#3J_:(0DC%48;ZRDN)T^=C=&$&<P5N+?I3-!LM*4\nMM%+]W[J5,])K8Q!984RR^ERK:P`X]F&N`;$Q5.X?Q\\KT]8X^JK+IS*1)(:V)\nMFTZ!MIIC\\AQ;%MBBQ.8CGOW@`Y?_QG_[S-\\\\OG/EX=EL]GL/^G41SYJITN[^\nM(?31VZT5^IHT0\"`\">A*2;^UT3`FJ*YN7I*-TKRWK0=10(-V6T<XDK3Y7'T%)\nMU(,$<\"50,:2WZP0GB)HD!)O\\EL3?$Z+;+(ZQ>8GX\"%9J6H__\\I-//G=FLSS[\nM=W[Z)S][Y<J5-R]=NO1[*8CTY=).U3X^3Z9EI?O)F`PSZ\\Z?),`HZ`J?TF2V\nM1!%/C)Z2;TC0572:W=LGDQ)EK+VOTB\"K#VHD\"I&5@(00[PD&#8*$M)B#K%RL\nM!34]_M3!_4C\\FLW1,9@2DP=<@GP[]_2I'WK\\T_HKK_(W/O>7_YT+P]P+W9-D\nM1OJ:@,2=&Y%/37E$#&=EA7>D,#/].HBXNN>*2D)T/2H>HXK5Y&>,)H1UA;A&\nMU'4087=A:6\\_5_F.I\"A\")86T\"2WNA!OCB1@(B+'1>=L8S45_$\\U:?7P$DH,;\nM88H25Y:XT0@WGN`F$W[LAQ__].73K__43WSN+S_\\W'//<>7*E=^#>H1JCZI*\nMM^!T\\#.]0U[M_D&^I<,`*Z&Q*$9U%8$%4&LP'>\"78(_.AX@2$RV-CK?/14S*\nMAG7UOI)J%!U8'^L3G9E)>8U)$5?0_G&BT2RI2>;)FBALB1NKJ:JD/05D(;HO\nM#`33;XI/_=#CG^:77^&O_,QO?_;6K5MO7KERA7];[7!W1TV#G$\"5@658P0.]\nM@$*_.\"L`CE4$HP(:!E%P$J/8WGYW&%__.AIC^FC:I$^XZ3W-RH$+L=XQ]\"UK\nMGEX,V+013`!OHJ8GR$4ZY-%V.)00ZBH]UX*48&W,R@&,[3?\"IW[X\\4\\#_)6?\nM^6>?_>QG/_MO+0QWEV52UA*U_KMUQ9H5`MC?ZOQ[AVOJ8/'V=@NNOU;ALIQ+\nM3P2*<=O[%QWD%ROG+%$3NM?255#=6:S.576R5QG<,<B^N^Q<K$!(?S,KF^R'\nM67I*[$)HDR4,<7DD`88(SBQ3(!%?]U.?>/33BO;\"^)5?^14^_O&/_SO0B,Z&\nM)#2UVV9=!A'];LPM.B\"N?ZPFJ%RB+T!@=ICQTF_L<[IL*:WCZ@L9%[^[(!\\U\nM48SF).QK^AHWZV'`:M'3[5H?)N?-I$U\"'PV+C9_#=$#R0$UZ+*K3@.B?AF%Q\nM:.KT@=+NMT3-2,]SFH*(Y$,_]4./?AI5_ON?^6>?_>]NW_XW%H8Y&36M!8W=\nM=PB:_$>(5_>0(#W.W\\=/`]/PUFMCQEIS]O2#G#_S(*>SC&]_L:5:EBLBP@#(\nMZ^&L]6)(6J/X#LO%#B]^98<7OG\"=:S>FJPR\\2_HDYA08&W_OX316\\$H'$O9:\nMML*N@O?I\\7:U,8V-%3]7(%F!R0IL7F+S$E>,^.0/OO?3?^Z//OH7;[SVM2=_\nM^J=_^M\\HZ5MWUETT$L(J9.TK:3JH&W4)FZZLAB1,JO.I6F#JBE/3$1H<8G/*\nM\\2;YS6]P]<5'>/3[[%K.IEU.+TH/OTHG@/BHHX,);WQC!K/;F\"4LY@_V@0(F\nM9MO2.S739^H:3(+75[Y%C\"#V9(0FZ_NSSY$`XWIXQ2BXY\"=CT\"C\\I3_[D;_\\\nMT+G)PS_U?_T_G_NK\\-)++[W$DT\\^^6_NK/L,%\"+0EB*H5;\"4,MM>TZ7W#[V9\nM4*B70M&V7#R]0UN<P5K!%26G-[>X^N8UCM[W))MG#E>$`=$8]_=0>$?#B4G:\nM[1LE;WQUG\\)4*`6N+#AW/NL74CNH15>F5<0E4]FN-&X]:TPA<5*^+L\\PJ^T1\nM,9@$2(F+IBH#(XJ5*(CNY\\_\\R!.?486?^H?_^L*X*Z&+H9S&-\\<DAYUR!.VB\nMF`[&'L#40RQ*%2^7*/7;F.!IR3!VC&^/V-RY1-.\\S!M?NL9'_L19T*:/P'20\nM5VK2,\"/\"[=N.;__F=;;R#.MVF)B`3K89%S4ZX#P,41/I?8*L/(VQD;)S`CPP\nM$LNLHDDK9!7NKC]6H]ES.4C`XE/4ILFD&O[,CS[Q&5!^ZA_^[+^6,-Q)K*E#\nM\"88A8S2S)M&0DH!4UE17):3'1_)8%MXBQT$(;.R<QMDMFEE&)@O8V.*=-U_G\nMSML/<_9B$TU:2(Y?=%4G%^7:M2U>^?(U=LH)>;E%\\,KV9DX],MB\\BK\"&2,2,\nM50?5.^TW#6+HB%J2(/K5/_I$L1/HG=_Y,I6'NHV9_Z0TJPHB(,;B\"A=Q.!M#\nM8%N4D90@RH__T?=]!A'^EW\\-,W671N@@BT5,RJ)7CDX8V,W>EFMR;LEE&\\!E\nM+(SE3'N,,PZ9GL7I&&M;PN@ZUW9O<^,7OLF'_\\B'F?M=U#J*Z2:/G+W3)VS?\nM^/997O_JU[BTN<G6J0]3S0\\XD]6<&N?<VCF#R'X/P_3Y3>?*M!-'A^#&1$]2\nM3;RK/G;U;,0@B>'XYK]XGL-%X'\"A^$;9FMC$6HFFVSA'/MT@*T<4DS'%9$(Y\nMF9#G&2ZS6)?QX__AXY\\1$7ZW/L/=!7$,ZA(,3,T*MC:L95FJ?8@K@SC=Y8:#\nM>LYCYT<$OX^&0\\PD([09!\\>!W9FG6;S*\\1=N\\_*U70XK8;?.N/#`0UP\\?PZK\nM2W;T5=KC74X]_&%VMDYS%';9S`VM9)2;M^,.UE52UV?/HAB36\"%\"@CIB=DRB\nMCHKI(JN876--)*59BUA'Z6H:!W,/MV<>'Y)C!HRTR%Z%,Y`Y(7.0.V$Z*=G8\nMVF2T=8I\\8Y,__8,/?H80?E=FZBYG?;>A[@\"[E#9TOF1@C#5E`-$\\Q6C+R`&3\nMB6&V?YO\";3$[#FR][U'JW5VN7GV#45ER=#AC_[5;;(PF;&WM8&ZW'%Y]FU%]\nM2%@>$3+%2(W24M=WV-P8,=K<8'\\.X_%K@\\]'SZU:!X@E0>,IO\\&!#8BWB`EQ\nMT?LZA2-8AW$9UF44KL7G$>+($D,T:,=823P3(08A#G)K\\'7-_,YMJOU=\\LF4\nMT<X9/GEYZS.^>93_]6>?_]Q?A9?>+<]8#U\\3!ZE/T/J0,F6[L@HS>QADX+\"1\nMM12,-A]Q>'2+Z:VW:,V,^?)-KE]_A;K>)RR7A\":P=?H\\UD5RPGL?FK!;M>29\nM87;<<KNIV2@:WKG^*IOOW6\"\\L4EH9FA9]/NDKP1V3C,!DM+5C;H=E\"\"HJ`$9\nM8GQ/1C,VPSB/<0TVRQ,'5QE)C;.!TBL^L5KZB*RS&T:P)@HDWH[:YMN&Q>Y-\nMFODQ?_+IS<^H?X3_[?//?^[*E2OW%(:[-[E2^J!TE;U)G]XKJPQ;^APC](_M\nMGCT]5_/BBW=X>'2;IKW\"(Y<N<NO63=ZZ<1L?+!<NG$9*0RDE3:68W%#MP='1\nM,0^=WN;T*<'XBOV]F[R5?X.#=^#!S2G;'WV:D\"I[.BA/#T/)OJK5(<5B(MZD\nMIB>?B97(C;61Z6&S#&U:0MXF.,1@3$,>`B&$9.ET`+'(JDR><*N>22CQ=FAJ\nMZN,C/O4].Y^YNEN]\\G=_\\;?^YD_^Y$_>.(E-K6--B3B\\HK]+#SUT4#A=C4(&\nMCK&CUZ=\"?E04`5MR\\[!FU\"P8;VWPM3=>YM6;-YFU2TYMG^)H<<2#TW/D/L#(\nMLG-VAV^^_@H'>T<\\<7I$:&:<NW\"1^?&,Y>PF%GC'UUQH&K(LK\"\"73OQ]L2EY\nM+5F9I2X<CW&'(,YBO,/8!G4.$S(DR[\"E@A-:L1B?$;(V:D@'NVCHD=IU9&@5\nME<44(&J+F$A)K><S_IL_\\=!SCYP?N?_A;W_^?_KL9VF&PK@;:^JQ;.FAZ9X3\nM(!(A;M4^XXT$L>@\\Q)A^44+<LMS<.V!Q<,3I1EDLEAS/:T[O;''VS#;GBX*-\nM;`L.]KBS.$)TP<C,.3,Q;,B\"FP>'O._Q)YCMSJCRG(.C??;+\"UPHWEEC2FO/\nM'#GIOZ*9Z'Q8(!'64LZ`BXS`T+;8+\".$(M8LK(W<J\\83NKZ.E$?U22_#`MH`\nM61YR8F3(Q0+?-&?_R/M'S_SY'SKSX9]X_OG?!GCAA1<X>_;L24'H\"@8(*0KJ\nM;*)9\"TQ6=3H%HRL&70^6$M@^U=*(H]C8H@T6FX^9;@G;6Z?PF>':X8Q,&W[H\nMR4<YVP3:^0&?N/P8-_:/F3A#/LZX])Z'*)SC^NT[[.T&:E&<F\\?DTJ1Z1UA%\nMT3T?M[>H)A$4?/P2+H79/M%TK,-D&8B0B>\"-1>KHM+7P:&BCCK4G+,+:LFD/\nMTVCHWGL@*.W`8)]M;4T^\\?AC%_[\\Z>FM?_7\\\\\\_/GW_^>9Y[[KD3SKH#S@)K\nMF-*JY#9`,KM:=A^AF'['=/T+DU'+N?<\\A!Q=I:DK%.'\"Z=-<>NA1ZFF.RR_P\nMVANO<FU^FV>?>I9;W_XV'B68+8(/7/K0=_.+O_,FHVQ!J):TZBBG6XF=*WTA\nM2TSZLCKLG^B*4;K\"T4+'M59$$FL\\*)*58)IHVS'8+!#:-M78%>_;\"-,'[?T\"\nMZ;U2-;ZGH4H(L>^CV\\0Z9(@%C,CDNR[E3__1CTR>^;N_<?0;@-ZZ=>ONS+K+\nM/'5M5ZVG^C+D#PRX8016!:+TWY,?/L_7?N$5=L8YVYO;;(Q+'G[XO>QIPS_]\nMP@L<'-_B!__84]S8W:><3I']!8L[!URX>)[;Y.Q/SO#>)[:9'ARP^ZM?X>#.\nM+L(#\"5-=84+&Q/ITT$$!*0SQ#I,*61USPR8RDR(NVO.^+A(\")LO0`$%\"Y+PE\nM']G%)#)H+5`CD0N,QEX/GP014N60H6#@@=.39S_PV+D_SF\\<?1'PSS___#W\"\nMUQX3&X2H*?:3/D$Z`</T-EE7[+[T$O.JIFUJML93'KIXCM>NOL57O_$\"CS[^\nM\")^Z?(GI^!)?^?)7638Y'WWL-'YQ0%L=<6??<6T^Y\\ZU6YSZX\"<X]_\"#G#KS\nM&HNB2`SQJ*D2!B2&1`?JUE_-RL]%)-9&;;<N?J/&1`#/&\\0WJ!A,VZ9H+*`>\nMK-$([1B)O7^#\"IKT?8))&$%1FQB)(<26-XU^1KVB/DHQS\\UF,1Z?C^H9$Z\\3\nM&C'H.>CI^)J<6PK_9%B[$-:J\\Z12:H_XI/3\"MYR:CIC:P'14<.=@%WTI<&9G\nM\"ZDL%S<F?.6EU_C:[#K;8TM#SFLOO<:9AQ_BSW[_,TQG#5__QE<Y.ISSX:<_\nM@F49C4$7H@X(*-%!KURH=BO7-06FP\"(6H&)-I2^;^A8U+I&J`R%+_B27N+--\nM(DN$E#<%OVHG2/O1MY[0^I[2H\\''/C\\3\"+9-(8,2T4I<\"CG]W1#'L!^BBP=\"\nM2I1D70%B9&4BT*?14G;Y4Y?DU<<MHL)B67-X<(?3(X<NEM3S(X[+C*/CANG&\nME$<>V.+JT1&W]RQGMDKF'&$:S_S@D.L'UWGYE;<X^\\1W\\>##IT\"O]Q\"\\RH!C\nM-:R:!QD4F.)GD=2@%H:^`AN[C=H$;C8ALC_MJ@X?Z?^)+Q4$X\\,J/R$@UA'4\nM1I\\B`3%M[*)M/=H*:B(;Q@8AA*0ALBIIO4M\"%U;<K<[1=/Q45NR+V(#2)3B)\nM2\"P)*@]=/&^X?;NA13F8+X&&LSNGN'!ZFZ-YPW*VQV.//(0>SRDN7.3-W5>I\nMPA:+:DSP!XBVO/+:VUQ]YR:///H^MLX]S'1T%$U3Z$@*IF]4Z6O@(JB$Z+Q3\nM)Y(QT?8K!K&I^\"01'8X=8C$A\"_A(/+.FKT<$#;&K#6(GE`O@0U^$ZACO$A0Q\nMT;$3(EJ@1)\\1I$TA?8I(XVZ]MR!6[;-AE4SKH&#<J\\,`@3U95!Z4)K_]1N!P\nM_Q:M\"+=G<TR^R=E\\RNF='2Z.)NS>N<F-*Z]2SUO.G+G`=W_DP[SQUAZ9&,Z=\nM>HAVL8>TGIU3Y_\"3,SSRQ!AG;G1HRHH`IZSZ_7I2H\"&(K@@-(<1L.M'[U<F:\nM]HN-^9`U!O4^.6<30V2)RV3\"@+35%\\]2\\<I(DJ6`M-\"N3&,P0'\"H]Q@9]IVL\nMEMW=JP5>C*Q34X9HJUF!;\"M.:0R;9$\"##!BNO.G9&N>8_`*&P+PUO'-8HT7+\nMP^?/<&9KA]GQ#.P\"S7.^ZYEGF&Z^P8N_\\R(?__X?X)M?_!)S;VC+<WSOQT^Q\nMN7%]#7'I3&/4T%1F'3;0AU27[K2<+CH2?`C1[[ENMP=,R*)LG$62,`*K1EN1\nM`,[&&D@R3WW2SJK$;%,[@(I'_:J2.[0YQMK[TVE6G*55-DW_861]XL\"*]-*_\nMFR+1_:B0A8K,U]3+ENG6%@\\\\<)%''GD/Y7C\"0H4B*WCH0]_#\\L853IVYP+)V\nM7-MOF3SX!+6,.7_N(O.M!WGV*<=TLDC42ACTTP_\"Z&B:3&KYBL4M$Q<I)&>L\nM&JN>\"\"Z%HR%T@4L\"!E4Q(>%&6D>7+B#!KTJKJ2(7^]I\"<HE=7X?!:_R_H^^8\nM!*M`*CVWL?+XKBR.KN&D:SA?M4RE8H\\1U'8,;UVQQ'N<QR2VG5!5,-L[YORI\nM#1Z^<)$'=LZS-1IS]?4WN'KU*I-3IUEXP8U/X\\X]PIN'GE>O[[)H`[5DO'[U\nM'<+9]_#BC3G'DS_)%U\\ZPYV#V'L=/^<@L4KA9N<3@C&H,SUC'&-[GJND?NT0\nM(MNC[RZRB<K3\"S7F%*YM,-ZO&\"Q==JW2U[FC3KIH8'1%\"S768%RJ<TC\\W7:$\nMM?MIQ\"`N'?8+]:3?/C@)NF+P:=QU(L/,6_C6ZPUM?8S7!9F,V+WS-F]?7_+4\nM1S_!0X^^CV]]];?PXGC?X^_'(YRY>($'1U/.[>S@FX:WW[[\"K[[X&A<_\\`Q_\nMZ__X*?[3/_<7^-M__Q]P:KOF8]_S$!?.%8@JB\\9PO(\"+IX\\H,E9T_,Z1AN[+\nMA+6F1\\4B&A\"3QDUT>9,QJV;*8(B=YYUS'Q#P.L(\"JRA?0NH-\"?'=U`KX]#@K\nM<<[(T$W?KV8M:\\,'A#7T/66',NAYP\\@Z_*9P>T_YTJ]_BPO9(9O;6QSL[X/\"\nM$X]_`*'AE_^_?T0SKWCLR6?YYF^_P.[>52X^\\CY<-N5@=Q<+O/[66_S2;[W$\nM?WSI<:KY$9__^_\\GSSQ[F7_\\L_^8+_SJBSQT\\3V`X>CH&`VPL;')I4MG^<#C\nMFWSH\\8SS.VVRZ<FD!C.`/))C30TO02.T09\\QMW'0BJ368!+&WE<G-4$J@T[6\nMI)DRA'XTS@,1E0%34=*^-O<I#(58AU8S`*WZ83#).8GT/-8.3-!ASX3`S_W<\nM6Y2S6VR<\"E3',)UNL7'J/*-\\S`N_\\06@87-\\GO;PD-O77B/H@BLOOT@;'%55\nMDY<C;MRYPZ)>\\,]__N>X_/1E?NV7?I7;U]_F(Q_Y,+_^R[_`V__JMW$N0Q5F\nMLR7OJ/+2UPW_%,/VJ;.<?>`BSWSX03[T@5,\\^_X:YTR,F'K>5?Q^01-CP\\?5\nMZ(:[B!I4?,]F7+4@=PTR(4W<214GLTIC-4B?YQB48%/OH\"9M-;K&%;Z':5HQ\nM]_KI&T;74-F>!*0,^B-63O2MZ\\+Q[>N<<TIA1M2MH,&QK\"O>?O,-MLH<,1EE\nMX?#+748.\\M$FM1>J1LE-SL'\\F!!:1D7&S>O7J)]\\DNFTY/K;;Y%O3-@YM<,[\nMBQL<'\\^QUN&LHZX;3%MAC>'HYE6.]F[Q^LN_P\\]O;/&]W_UA_LPG+W'Q]!PA\nM.G3MM3M]3SN`+A)(J%W3S3!\\#`.^[H`!+`S'@\\AJ<$OJVQ#1/OE4-7?9IGM7\nMZ'2%&<A)$A#2JV2TJRMH6(&W7C]FT\\THK1\"\\I6D#U\"V'>[<H\"R4/!5E18K(1\nMBX-WV)Y.<*,1DN7,CN?L[^\\2FAE\"PT:1T?C`]1O7\"!)06E[]YN_PP:>^BW>N\nMWR*H$-J0`CO#:#2BJBIR*WA?$7S%;&_);_[:,6]<N<ESG_D03ST6&-1Y$XU?\nMX\\;V`:-AE2\\,?.9JOQOZVJ\"8`7%GN&X='#S`[8STU3WIB<SOVMY+/UI!A_W5\nM)VH6NL[BZN\\75?:NW^'4*&<ZSK$F,\"H<N5D@U3%9<I`AQ'KQQG3\"9#R*$'I0\nM%O,93@)%)FQME&R/1CA5]@YV\\1)HVX905[S]QBN</[]-[@*&&F<\\(@U>`II9\nM:@(FRV/GJ!C:^1[7KWR3O_?YJ]P\\F)P(0.+NE&#2!C-K_G#%G]5^<7M,3@9S\nM0]*$G)X?U45UP_E'@[*JG/`1YEX$L[Y56<TJG9%A1PF#7&*5J1P?PWQO1JX&\nM:QQM\"&AH6<R.:)N*ICIFL9P3VAH;EK1M@_J&7`)./=(V-,N&45:P761L;X^P\nMSK#[SA[38H(HY%G&X>$>S7(1S790FKI\"-#K8IEK@4M3D-:3ZA,-IPVO?^C+_\nMX.</!I%A,L-J8G+7P3?6@#,K,C(6U`X;.?I&2CD1X)@30,1:OF-675#W%<0*\nM2!NP,W0PJZFSASIHIM#51(\"C(T]NA4Q@,9NCP'PQ9S&?D^<Y5CQE9LCP^.J8\nMT,R9']YA?KC'WJT;^'H.OL6)4%AA4EHR\">3&<'#K#M,RQZ4$J5HN(G$M%8BL\nM,?BFCBQZ!?$>]6U/6VR]XL3SY5_[#7[KF[;'TE8@<VI-/E'L6J7DZY%C?-W`\nMT'8,\\[&.1:(R[&I.A:5[S,0Z$;ZFR3)J^LI$-Q:N#Z3D9&O7\"O<XGBN9:=\"V\nMBN7)INE08HYG1TR*K.^GRU2IEG5B1U14=<OQT1%96<3&'&,)3<7&J&!6\"6U3\nM8ZUB;\"0H^#9J@+,QRBN+:`KGBR4AM)'2XMOX7GD1.:M!8;G+KWYICV<^<!8K\nM]3J,GYB+BA\\(8[#X'8G*=Z39L([Z=@&`K)#?@7M9BY1.EEO7]:/KQ.PZ$@?L\nMA&%Q?-W/#$8Q!(^&&HBE1FL,+NTR9X3ELF)1MP2Q+)O`;-E0>VC:D#:(3^7$\nM&&?;6-\\GSVPJT+04F<6DUROR#(-29%F,AB20.P>JM$V-J.*L!0DT:4I:IC4O\nM?_W+_-)7;-JU(0UZ#(GEWI6'ASUC.NBLX!4M?P``(`!)1$%4'>\":W>0<OXHL\nM)86ITO5=#`;+1!J/$,Q@1,:]-<*`<7U'T#`:T,&0JO4N1OH>99-F)>69PQBA\nM6LYQSE`M%MBR0*QC6;<$70\"&V7R!<QG&9!P='C(:YXBUV\"PG2(YU`>=R\"INS\nM7%0I$7-8V^)]P(IA5)8T;=US<Z>3$?-E1=-Z\"FNQ-L.'FHW)!!,\\66[(7,O/\nM??Z7V\"B_GX\\];2-%1I-&V$$])B33)K+2J'Z#=@!C)Y7!H$C3-?:09HX,HJ?>\nMK,EW<M:FOX:S-59-[:N\"ZEJS.(KWGB9X@BK.&L;C$C2PN3$E+W)\"6S,M'#:T\nM:+-@6F;D1ID=SU%CL5D&QE#[0.V5157'`5C6X34B/1B#LPZ#8$4P$C4B:H^E\nM;1LR9RGRC+;U9)EE,B[)1-G>W*2<;E\".<K+V@'_P^9>YOCON^^188X^GZEW0\nMQ+?DQ/@Z&8RCZ/QIB%6[E#C&SN%T@S2KJAMK=S_0KW_Q8>AT8K;9211J5<05\nM@GIJKS3&TK05[7).805KH_J6>4GK8U/Z:#S!N;APQ<A1E(ZVB2-#-R8C?.9Q\nMXPPG+4YJ&M_0BL$Y0^YRC+C8!=IZVJ:)PK'2$[M0'T>F!*5P!>5HC,L<T]&8\nMPN4X9ZGWW^!7?O/FW5%AW\\1B5KUT0=?ZR?NI8IIFC81!=U58;[KI*R4Z3/2^\nMPRR.;JY%=XF8$X6A`:MN*!Q96?G)Q@9E.6(ZGI`Y1Y[GY'F.*KBL0(&F;6A#\nMH!@5Y(7!F,!XE+.]O8TS&6(<`2B*C-S%@DT;E*:-W3]M$\\>5.F?($E=)1+#6\nM]/\\71<YX7+*Q,:$H'.-Q3IX)SD!>9&R4AB]^\\46NW2Z3.Y34W9H&L#@++DO#\nM6%*]H;N\\A[;MZQ*]$&2%N<5V;UV;7M\"W-HBY/\\1Q5Q#<HY&#)&[0BS9T&\\[:\nMQ.F)`C466M\\0TO/SW#%?5OC0`I;1:(2UAKIMV-P8][NE]HI(SN;4X1N8S8]B\nM(<6'Q-20?@-GSO73$'P'3RBTC9+G613&*,?[!J$%-92E0U!&9<G5.S/>NNEX\nM\\$R*5D,'G:>U\\,0<POC5SN_M_-!G#!9#ANW.>K*-:4#1?-<Q07J/:3`#`9V,\nMN61`P.EH\\$#PBC6.X#450`)M6]/6-9D1QGG!N\"PHG,.),,XS)+2`,MG8P.4%\nMSA6TK2?/LDCF#9ZV;=>F!F69Q=K8&YUEELS9GI?;\"<HY2_`-]7*.;YL4B'C*\nMPN$,E+G0ZJ1OT.^!.QF$KX:^,7Y%;!X::%U+;/OI\"$*<`1=2U5!66-3]P]>3\nM_-=>P.L9B`Y3]@Z0[\"IVJBD2<C&R<18Q0M\"6NJGPWA.\"3[6,0-,T&(7I>,+V\nM]C99F6.=(R\\*Q!BR/\"?+,L;C\\1J[Q)C(B!\"!Z72\"M7%$D7,VI9^!HL@IRX+@\nM(T9DTNPF@^\",(Q.+A,#NS5NI/!PO0X+Z>Q3/@LWB91R);3#$+-;@DI-E`R,I\nMBM+U8MI]!&%6Q``]P5!9PUKE;EJ-K`!Q[Q,S7`--75-5\"^JZB@L4`LOE@N5B\nM05U5%'E.YG+*?$13MS1MBW4FS<DRR;]D6!O#S-9'S8E_RZ)_(&!L]`N:)O%F\nM6491YCCGTF8R>!^HJCHY>INFHBJSX^/5P@_II?UPKLYGNBB(3C/6%OVDU1B,\nM,Z*C/R4A_*XT8L@@&VC'$.(81E0JJ\\D#F#C$$!,0&L:EI2PR1!U(3M,H/B@V\nMS>(P**%IF,\\KZD7+V!2,;(ZJQ:ME<[H%HC2A0;5A<SHFR_.^4.-0,A/(;&P4\nML0CBH70YN3%85;2M,1(H<M<GB\\$W!-^@4I/G<+28HV&0)ZQ9A56_=M]OG>8$\nMKB(M69N@PU\"H:4@]Z&#<H-X5.=V##:YK;>@K(MFJ,+)&M905(]!81]!8*PYH\nM(E,ISA4$+$?+0R2`,T+M?1^AC<93\\CQ'@&I9D96;4$5G>C@[2'RI:(:LL[1U\nM0U&66%$R9VC:V`L1VF7T/46!JE(4!<[$PHPQ@GHA<R:V6]DT<-XWO'-GP;R9\nM,C'[@YE5@P53DW*#CNV8K49+#\"W'8)Y5S_E!U_AO(KJ:['S?>L2:''2-W=T5\nMS8=^:6B_)F-#JSGSJL*)H1A/:>H:\"4UJ4<ZQMJ!I6XPH\\R9R17-1`H$\\RR@D\nMXVBQP$C!X6R&]P'G7)I@'\"&+2A>,\\A)G4AX1(H3AG&4ZB5HCR5]U'6_J6YPS\nM.&LH\\PP!\\J(@LX;CO5VJ^3&3Z8F>ZK7D+=5>NJ9^:V/?A*[.LV#(\">NH14.8\nMZ&2)X_[D@;!NL=8(97+\"?.G@597)Q.+*#9;5@E/3DKJ=TP3P6&[=N4/`H$W-\nM8K9D8V.#\\2BC4D]6EK@R3A%HZP81%\\^#4*6N*D+JR1)CL,XR'HTI\\QP)GB8H\nM&AK*HN34]@1KE+PH\"#Y&6:H0@A!=B\\<\"19YAK2%@*7+'_NP`W[2K\\6EK`X'O\nMX2A-[\"HBQ)!Z#?99R[2[T10=YU8&6)5\\APEFR%JMNB]RG)3!(&*0A/EN3I6M\nM[3%J,U0B5-$J',^7J+%4/N!&4VJ-1.-YK2QJSZ*I$0-U4Z61#4J]6%!5%5F>\nMD64995F0N2@L;4.L.;0U5@).6G:V)XQ+AQ/%5PM\\4U'F#O4U@F*-](Y=5/%M\nM0QN4,L_())W*<C*,[[3?Z&!PRZ#MP!IP[D2X?S+,/^',N\\$M]\\^L[Z$)F+4Q\nMGFN8WPGV!PAY.8U9L<8,]?AX3E\"83C<HQV..YDM:M2RKEMIK;(ROEM2^[8LF\nM15IX8PR+1455U3TOJ\"Q+IJ,19<I!,JML;8PH\"[\"B%)DCLX;,\"!9E7.3]Z%%G\nM#45>8)TASS*\"C]^B7LYI?;.>&_0H]\"\"/ZC#]#@*R*0,W]\\*\"!E8C1,[LBLIZ\nMMZ:9>[9N]>.!!IMCD*C<'61)#YQ=?,^(FC(Z-6O1K*!I&N:+173BHDQW3K'4\nMEM8$]HZ.N+UWS.W]!:U:ZGJ)UYI@8%E5M*UEL1\"L6D:98+7%XID?'\\9.K,R1\nMYP;?+&B:)7F>0>/)U=`L%E@+F0LXX\\DS0Y:9?@\"]XJD`W\\SXVHO[@PC(#!#6\nM05;<Y0G#?\"$,9T$-_(`9.&WU*TQ*PT#`]Q/$8&K+W9GTO7KFAXQ`0U%FS*HX\nM/\"1SCK9IL<:R6%8T34M5-U1U3=6V&)?1>J@;Y>#@B+II<6+23K>,QZ/!F+B&\nMC=*16_\"^H0UQ&H\"8C-%X`Q%'O0S,CFKRK$00,IN16<?6QI0\\=_BVC@WL689J\nM('-QQY:%XRM?WQTX5C,(3>]ANKNET_42\\YKM7SOV(4T\\$%8(K8;[Y1')E@W&\nM-:TG=GJ?L1[Q;^][S)!-3F/L\"&<LXV+$\\=$<:W+*8L+VU@YUXW%9P<'1G,H;\nM9L<+?..9'<WQ=4U;+1'OJ9<+C%%&DXS-C9+)V.'K>3_X-_B8H<]G<^:S!?-9\nMPZU;^QP<S:A#2]\"&/%4*B\\P1VI;%?`;>8R5\")$5F&16.P_V;',YT.)\\N60![\nM#W,C)^K9:>B*GDB,NQII1U+K,O![+.6[)'3FG@TK])/*3C0U#N)G`3[PU`[>\nMC:GJ!D5PY83#V9*;M_>H&Z5N6FQ1<KAHV3VL:;\"Q4Z?S`UF&$V54CJ+VAX#+\nM,XKQA'D=N+$_YYVCEML+>.7Z/F_=J;BV5[._J#FH:MZ9+=EO/'/O650S1%O&\nM6<;F>$1I+?5\\1F$MRV7%=%2P-1TQ<@V__L+1P\"0-M&.X3/T),&:`@!K61D6+\nMG+C/KFH>:^MZO_!5!AC*/37@1$1U\\CX@N(+&N+@+J3A<+#EN(LU]?F<75TZY\nML[O/]NG35.T!DEEFRR73PE%EVI\\-(1A\\HRR7#<:4[!VWO'YMEZMW9N3EF!!@\nM-IOC4C0U+11C,S9DQ).//<8KWWP9HPT/C*<X(S&17#98`5_76''1!)8%2,,W\nM7[K&'_O$YHE\\5M8SX34*>A@`@W:51[1IV-;PC*`.B^KRC?M#'#K0+!T4?>[M\nM$U@[[&,UPOVQAQ7-2_+Q&)MGF+S`(]1-8'__D*9I&&]LX%7PP;!_<,S>\\3'S\nMNJ)J6^;5`D^@J1N,6)95S?[QDI=??XO=HX8\\R_!M36@K)`1\\TU(O:XZ6-;L+\nMSX_^Z(?XB__%H_SX?_9QR+?P'NJJ2C5U3UTM`27/\"M0KUEI$*^:'[_#BJ_6@\nM.-81*KI%26UOW3Q9FW9[%\\9F61RJE66QCN&R\"(=T49(,AM3K?5D<2?+!KA?,\nMN9<4==\"+NM;1@K.\"=QM4M4,:CX0(MDF8H\"+<?N<VVV=/,R]JZMP@M<'6#0?+\nM\"IL;3NULXQLHG&$\\+F)OGO>XIN6!HJ`<Q:I?XP/'BY;C&HZ6+8MF2;:]P?==\nM?@C4\\-&GQTPG3_-/_N'7.+N184R@=88R+P%/K@LJ+TC(*.P655/QQ2^_R?LO\nM/8ZS:RU3Z\\TQ](W=JT&_'>?)A@29RZ\":%TYHT]V!@+O_@#-9G_\"J)TJF.IA[\nM-Y#/9!S8V()F9AB7><+B#6VHR0I#5HRXO7_$AS[^<9YY9H>O_>JWN?+B[U`W\nM$>:HEPML/D6LI6IJRE$1HZG-$0Y#65JR/*.J&DYM6^X<5NCN$6TP7'[J$H]<\nM<+U9V=IPW-J;<W;S#$U]C+0M-A>,Y+&TFEB'+L\"H,-R\\=I-7WWR(]S]>=#U7\nMZYB$T7X@0!PKYU8M5)W_4(W*HS&;C\\6E042J?(<*G9ZH2PQ&!O7:HB?]R=UJ\nM)D!>.G2ZC<SVF8P*\\K)D[I<8)Q3%B\"/U//61'9YY9H?W//@L/_,3N[0<T=8-\nMN<LH2\\.MPYJJJ9E.1MC08,T(ZQ7KA+(LF4N@\"8;LU!A\"`U;XK@]<Q-F>[X(/\nMPNYQQ=&RQ30-I0G8T(!(7S^/6\\WC).\"TY5_\\^@W>__C#R0>8=>Z38;7[@T+(\nMDF/TZUJR5O7T@RBTF[<NWZDP=#)AT'6.Z[VF\"@WG=J?/<.D]<'M_03DNV9R4\nM;$\\RIN.243YB.BXYM;/%N?,[\",+9\\SF?^!,?P;@R9KQM!.B6U0(-@5.;&XR+\nMC,W-$9-IP614,\"DSMC=';(XL&Z5AG\"D7'WR(/_:)!P=0A,-[.%PLN75TC#J'\nM=6\"D0:1!?=>HZ'\"V`+68%MZY<8>JR5??W2AIFORJC&H&C)<N,NK#U$&4A(D%\nM)>=6/D7-[S*ANP<#_-ZQ--QMLZ(PO%<.YPU963(M,MYS;HLSFV.VIU/.GMK@\nMP7,[/'+1]2<M/O'D&<X]<\"'R6VT>AUJILK.]Q3@O$(6FJA%GJ;V/.]A:LLPR\nM*BQ;TQ$?^]Y'V-EV]'S'I+6M5]ZX=HL[\\X\"W)7E18!0V1@6E,P3?XK+5^:;M\nM\\H`O?_TP+6XW'L^L3%._\"<V@>'2B8C><;2JIE;@_!-9\\)_+`8`K5\\#Q0/<'\\\nMOJ<0AD\"9H2R%5AOF5<O&J\"#+`F51<C`7QF-+(3F'B_-LCM\\!`I-IR;D+9[&W\nMYH!%?2`W&6H<RZ9!V\\#1T8S)AL$\"5=7@4J^W,<)H/.+TZ:WTV5=%^SS/R/,Q\nMNX=[M'Z/[)%SE)DCQR*^CG2;PE#5\"[PV5*U'M&$VKT$V!T-&=`\")=RP-6=^X\nM,J`D#:/.P:2<=\\N)[PY?S4D>T[!:QW>^DF:-2Y`L-I]`2V@]DS(#&J;%B*W1\nM-(61\\?7+D65G8T1N6@(5M('<%#0(E0;JIJ5J6NJZPAI+EN61LF7BR/=EZVD[\nMS&O0PAP`S10?6N[,#\"^^=<A2'(VT+!/CSK1*87-LGN&*.-/VVZ_MK?BP9GA6\nM]W#APTFZ]X`Q+ZF:E_7'K*TF^`\\R['?/K.^=+]Q#.MQU!-1ZMQ>//[;%;+Y$\nM@2QS:`A,$H7&I:..^WQ$,T2R2+ET<>!A$P*9BXAL:TJ.9TNJNB&(T'B/!UJO\nM+)8-W@LNS5WJZ\\NI3NU#BW,Y=55Q:_^(N=G@N+;47K#&D1E#(<((86(,TR+G\nM[3??X>#X9(;=9:SF+B1C=129K!,+A@)Z-^[^NSKK$[#%&L5UL/!W/:=O-(H:\nM-)Z4-\"%.`5\"@7BPH,H<SAE%9<&ICUO=@U`OE\\,X^^P<':=+9C%:$4\"_0(#SV\nMX:<(;H/%TC-;UBR\\IU5!3,9\\T3!?Q\"DX?=$_[4BQ%F<,00V94>9-X-F/O8</\nM7/X@8@N$%J<+2O&,Q3`VAC/3@DU;\\X_^WRLLZ]\"?2AR15#-H96,51:W!&<EZ\nM]%3-X6-^-TP_#0,JH:P7-3CQ^\\!4R5``K`]SFM=M9/<%*/.<3&)1/\\\\RA*;O\nMSV[KFOV]FW$F8&H>5($\\=^3EF._[V`4VSS]*ZX5EW;!8UK1M2]LT9%WK;/#K\nM)WI(;-UUZ?P(WT8F>M\",[_V^4Y33,553D6=*[I3QJ&`\\'I&),K8M+W[C95YZ\nMK>X;^-<SXI.D`5WK*5F=0*SK#7:8NXE\\]]2(H>K(W:9I_=]@'(2NFZ=N/D8;\nMXAB%LBQIJB7-8D&19XPFDY7C2TF0-1ZQEB+/XR`J\\9&]9S(>NFCXD?_H\"?+1\nME+9N$YKLL08V)@6C7&(V/.C,B2\\;Q_88#!Z+RW.*/*,H#-_W\\4>IS)3@\"K`6\nMYR+UL\\@MXPRLG_/..\\?K0V'P@XY;$UF`7=VAV\\3#N20Z.!XZI\"'`W>G']^6^\nMGF3XW2^%Z\"<4G\"!])+W=.37!JY#G!6W;)BT(9%82\"4*2X&*I4@CI5.!N0&,D\nM-4^F6PB>[W[V+(\\\\]B@&H:D:0NO)K$*S(#<-MV\\>GLA,E=V#ECRS.\".H=>29\nM8S(:@;$\\],B4'_GDA[@]L\\P6`5J/;6N\"5S(K[&R,N/+67F*%AU3@&5!M=-!+\nM,JP=W!7`G-\"8X9D6[UJS'A1$M)MQJB?@\\7LX;H9M`ZF`?O9TD1RQQ]@\"C\"63\nM\"J-+1EO9*B0,L:,SS)8$WT:\"\\A*<+1G9@L<?L:!09\"V?^-'W8T=32FNQ%JIF\nMR20;L3%RW/[VZWS]7QZE8P;BQKIZ=<$H,ZA94IJ&4>YX^LE1_SW><VF3'_Z3\nM3[/76N;-`BFFB#&4Q9A-$?:N[O/VS>2@@ZQV?#\\6IZN\\#0M$N@).WS4?^T[A\nM:]<`?O*TDY.'R.K*7\\BPZ7&-J@@F*Q&1N+A-`R%0554\")#5M%*6M(W<USW+*\nMLL2ZC-P:#$J6E<D$&!YY..?)CSQ!HXKZ!@T&3ZQ52S/G:[]])3Y6HYWROJ;(\nM'!N3,>.RQ)DL#<%:T>;?^^@F'_Z>)[DUAV5US(@E$]=R9BNC-,?\\BR_?2LV,\nM;G5\\IQEV$@TFX@R/KI=!`A@&RF#\"=ZA9GSC?I!^_UCU,5PYY*)[5,<LG`,$`\nM.V=/TS8>W[9X#3UFY7TR;:E(/SL,!-_0-)YEU=*J!U\\CUN!&TSY$M,YQ^6,?\nM)-O8QAI#9G,:`IFQ%$98+HXA2Y!$FO9?N(R-T8C-\\9AI.4F?T_:?WAC/QWY@\nMA_&%A[B]=\\31X8+,.+:F&><F+;>N7.?J+9NBH.Y@CP1SV,%Q.B=QJ;7I:F'E\nM/,V]R:[K,+C<HSWNY)BV+G_HY[R&U0@?ALBYLK7M\\\"&09<E$&8.S&>)7Y*R`\nM,-N_2>8B@5G%1A@9P&6</3->]:L)O/<27'CT<;)R1\":1.6C%DN<3'GC@_`IZ\nM4&%V'*&0HHBL\\O=</#\\81=JU[<6Z\\H]]\\C'&YQ[CQIV:&V_?H#X^9FP$LSC@\nMZ&`^H&\":%3'9.<A,O,R@E;3'DW2E.1).#L%Z]ZA)U[I%.4$9E'<)M))HAF7`\nM%%<''&WK^]=9+I<),1Z&OYT?B<*T+J,-+2J&\\=8FVZ>&AY;'+_NAIR]@RBFC\nM'!R!Q:+A<.FY]&B\".=(TG6]^ZX\"LS%$KY&7!TT_M#*(UUM#C[<V,'_O3[^?\\\nM>Q]E6F9,G24SCJJ:\\R]?/F;9=*9%5D\"@[32#!`SJO5&)_B!7[EDNO8<@[@&'\nMZ-UPMVC7,&Y.&\"JSDI<1,!EUXR/)RQJ*HHC3PUR19AZE+DQMF1T?,I\\OJ*HF\nMLON,)1\\9\\M(/V-<Q9'SXP3'!E&B[)!,XGL]9^(!DKC<-N_N>:G$0AQD:P>0Y\nM#SVXM7*R@S.ZN]U[^G3&,S_X*-.=TSAKF(Q+=B:&W9LW^>HK#632<P;6N#-=\nMT#2LL\\H]K(W\\;K\"F02*PIAFR.IKLGMGW76GVRC:VKF3>!)JZH@V*%ZA]S>A4\nMLSK_5(3;K]U@DN>4B8^*0(E'PQ;+>KPZ3S1]J;H*N``NWR#+\"T:YI=S<X+''\nMS_6=3K?V9K3U`N,CRAN*,9<>'JT<[)#E/:#)?/#)38[L-JU7ZD7#=NF8RHS=\nMO1HR&\\T0,N@2U;OS!`:'HXNNXU'WH'&8^Q096)V<KO=.)^X2AJX/:03.GRNI\nM`^1Y2>8R3)H>'T[NGM!0-RUM&VO&/L\"B#HPW-RFR=IU-I\\*_?.$6I<PBY+ZH\nM&6UL<OZQBTPV5N-.?_VWWD$SRW'=LJ@]'_G@1<[NY\"=L=+>]NV[2N)!:%'B3\nM8T0YMS5A0L7B>+[:F'8PI6=MSN``^P@VX5(G6!]A4.5[5],T*$NHGJQ3G&CC\nM6DO\\UNL1W<,WIL*R@:I)9S#X$,=N#J!['TJL!E0$ZQQUB)0;GT]YY/&=V)#>\nMF1&!:U<KCMY^D]+$EJRF6K\"0$=__\\4<'X:3RFU^YSNVC8W;G2RKO^-2/7\"++\nMAG:Z6RA9#6I,COO!ATYARC&^K<@-3#+(J=<AGY-`W[#,WT\\SN%=ZH-\\ICW@W\nM!LWPS>]!MUP_#V<PF`IV3N44$TOK%=^TL:(HAGRZU2===Z[>87%\\1%VW9$61\nMH)%`*'>X>&&9U%ZZL:M\\_8M7R-L#0M/@0PVYX_RC%[ET:7,5\":ER^_8^NX<+\nMWKZ]SP,7MWG/A2+!T,.SY@;HZ*#EX,$+)957?/`<+Y:(R3C<K?C&R_X>V;/T\nMR,<:WB,AEDG7&'L,#^JX/PRN`ZGI(#=0W@5RO>MW'9S8+BSK0%\"AR'+:UE,W\nM?NUUF_F,MIYCG\"-S&74;3\\=ZY/&S=]7&;[Q]S/+F-8RT',YF+%O/,MOBHS_P\nMR*`@%!__R1]]DFO7][F^>\\3><3H>&0>:I>K;L)A#/_L/\"9BBH`I*ZSVS^8*V\nM:2C]DMNWF[7#U]>:>P:C5WL`54^0B(=YQKOG$2OU4;T[O&/0U7I/.N;)A\"Y]\nMT-HK/D\">9X@(;>MIZJH/,6<'\\WA8%)+J!TH;`MMGMY,SU?[_5UZZ0=X><7A\\\nM1!,:K\"LI3CW(V0<VUWFBJGSF3SW*TT^]G\\-91>V'A1M9\\93Z0I(.,NY`,=[`\nM9D6D93I#)H$LU+SUMC^!&ZW%)H,>DZ[_>I53W;,Q\\7ZETO4.+UUCJ\\N)67_#\nM,=5W/3G=/O?@)M5;5[$;FYC\"4;<SJOD12)$VR!)O'*H6X\\8(Q[2M,*^K>-IZ\nMVG$O?F/&.R^_@6DKCBI/I@9O2S[Z\\?<R'LFZ_17(\"\\O__M?_.'_W9Y_@]-;X\nM'M'&H\"E%!H0`E#.G!;66FII,<ZAG\\8BBHSGH:-V9=NAL&/I17:?E<W*>AMY?\nM$'J/#JYWI]R\\FPC7GVTQ-*TGM'&<OU_6A+:-,PU;P_Z=G!`44Y3,JQI\\A0V6\nM\"V>%;[]XR%>_=(/1IO#VRZ^RH0<<'B]9SI=,RA'%]GDN/;I]UXB*;L=.)L)S\nM__D3X`=P]##\"Z?Q<FJ)/%I'60BH\"#M\\HSAG:)I#E0KO8!=TYL0$[Z$+OWHF=\nM;PV#44S]K*?[:<1@=BOWH;]R4LCOQA%7)7<Y=CQB,9^SF,T1-=A4\\SBX(QQ>\nM>Y6J;C$V4&1*[N+Y/K_XS[^%W'J=FV^^S2N'4-4SMO*,>MEP>F20?)L__F-/\nML;$A@R\\]^'`]X*;WH`G=2_V'MMMPX<*4%U^K.*+%B&%K*V>\\,9S'\\6Z+,.\"`\nMF:&U\"/<(2>_3NJ5WM7*]V^[GOG:O^VE;)2LC;-$V@:H)W+P6I]X'7U'/#E$L\nM=>NQUN`%%JWEK2LW.=RK.#R\"FW<:C-EFN3!DQ0;+D''ZX8L\\_.CI-/W%KH-O\nM,HS?T]G6ACC*`;\\^A6SH^-I(!JL:^/HWW^9@%OCVM3N\\N;O@SOXAU][X%J^_\nMZE.8V_G\"+N,?E@E8;_D=S@`\\V8%Z+_15]5U,*>\\2).E=HVK6DCM$<*$BTP8D\nMD&5C]JHYM^[LX=O`E_[9KU-5<TQ6$,_2J&AQ')DM?ODK+_+&0MG+1U1BD7*#\nM?'.+R;F':$^]EPOO?]_=D'UGZX>4^NYW.^@15[\\20A?Y#\"+-_[^]:^F-HPC\"\nM7_6LO5['\\2NQ8R=1$B0D9)!RX`((\"2X@;ESXOTAP0@(D2,1#.!&Q%3N)<>)'\nMLO$^9KHX[/3,US4]WAQ0N-A2%%E1]M'54X^OOOKJWA\\G^.G^(XP[\"]#%:WCX\nM?(BA=K\"[^S>^_^XO%(6+:ZGH?1-_(HJ_FS9G;9310`+L6F\\^Y#I%HO)2#,0!\nM/'LV1O_%2W3&9Q@,!GA^-,;1H(]U*/9V3[&[O8WE6:`C'<PM3-AUN6;X[(LM\nMO/?)%LY>OD)O+L/1R1!C`(N79S$C&7KS/7S^\\48S.6#86,A/\"^?N83<=?]-B\nM`G.7<>.XKYA;6$2>=7!Y>0U/CG-(MX?K-VYB^\\$.]@[>QZU-B15IJO8HI:NA\nMD<1C<46I`75^UJ2U:[/[G%5:\\\"4CKB7`:%3@AV\\?X/<??\\79Z!5T.)IH2D&P\nMMG$=(^UA]]$A<J\\X/!D#O@\\W/\\320A?9_%7<N;.(#]=[@-N@[*$I/!(_C08W\nM4O.Y*SD?16/8+;`TL@E8^>6G*S@]_@A[>WT<'Y]@MKN*X:4-=.9S++D97)HK\nM3\\EIDQ@9B,BAAHC6X4R6@*A.,8007::Z[9$:2WSWM:FI!0#X[=X^GC[\\$UUX\nM/'_M\\6HTQLK\\(K+,8>>?4PQFGV#[EQ>8&3B\\Z$]PM'PTQ..GA[A]>W8B+22(\nM<_54JHP6B%\\E\\;>CK,62J(-KT:KJ_N;KF_3ZE.EHPGT(XKU,H>&AI;83\"VY5\nM6,@YR@.LAR513-$&$UQ4:38B?C+.ACFR;@>+RU?Q>IAA;GX1EV8F</2SHP(Z\nM?HV9O(]WM^YB=W\\?/=?'HX-CR&QW(E@E@2'A331CF0I#;K!33@&:\"=TR3_S5\nML*6/F205\"\\35LC[*2W$1TW522;Y2=J1%W<]66XU/*>B$;HG:!@?'6^P;```$\nMUDE$051;4=7$\"-+F@&#IR@)VYC8PSL\\P?VT)6A3P\"IR\\'.*@/\\(-[6%S\\P:R\nM&6!S;0'92'$\\*-!=6D6_R+!_,,;5=0(9C:9%C/DKFAL^Z/]&0X9:<U/Y\"TH8\nMQ;)3HSX!UMDG0V+E!BTW<H6$H*$W(],KZTIKEF^;&H>D:;\"/7^2#K36L7EG'\nM\\&P,E1R#<8X\\+U\"HX\"LXG)X`_<-C9,BQLKX.*/#.K0+B'):OK>+NW97RH`D^\nM9G5(2:5RWOR;I\\,.F[.()!P1+%@VU,<J,S[X>N*[-N!O<N/>E\\'8M$99C$O>\nMQ!#\\X$FSZA9!BS'B5]I<%P`S0,EI#3+6+LP<N[4I)3SK(*&^W8JX4./=H&+'\nMD4U;+&ACA&$1I0L6UM%4\\2#,,I0N1LJ!E\"8$;52A2;5`6NJ`<X.U,CD`E61S\nM0]2`<)\"F1H>D\"<U!S\\.=0UZ3Q,!,9.N$Z_%T^,)BZMXHRZ!E5AJQ9B%G95YC\nMI#,$7/C:H('M(KZ9V$1D#+HTGG&IEF#-F%5E#%L[5.O5$<];L^1R2(6K+2*\"\nMAKBCMHP`@&?,FAR@R/\\[1(CKY$`+\"L(&LJF\\&-UDC_CP0KKK3<&'5*JJL12I\nM^KC7$,4BK8*X3,>:VK\"EQ(?0!/@4X3:.\"(+E_+1(^@T<?6!UU-KEP1-K/3&Q\nMPM=Q02T$XXQ17,L,N7$QGH`[6EM`6Q/K^.%Y`E>;KDBUU96G]UF'T;&@5N9\"\nM0J'QQ(RYQ6+A$O+M8N)N(UA&3Z127BY)<#Y!OJ*)'*WQ),YT(E5G;X*BUH=9\nM$(?5&UQ(E=+?\\O?<1YM6&D]Q2%^CF#8-XD!B$LEF3\\KCK*E)+FEF;)DT%G_4\nMBB]:9RCB:I4P-;PJN^5$T2RJPGMX1X;P,;-\"S9=T/))`Q.+(\"*0LX[5FS!<E\nM1A5B3>7>M!F;-$T<:(4X>&,$?`O(*LT&BYH8+.5&$N$@ZU.W6>)@;/L*HDU,\nM)QI83+G,Q!/$S9KH5MI:(0&ZJ3=R<1(M+J\\V!&J11DRUA4W9&JPU[&73.IF0\nMD$W9PB_1+BU7VX.#M'.Q-955O6BH(_CVB`<D<0'%,8'WKG)0]1Q@7=U!\"_LJ\nMPPUCT<A(CT\\FL$3UWB4\\KNQRQ$`/)E\"+$<ZRRC53TU>E38L2ELBC$D!10R50\nM$ZRKF3V0XE>`F\"4LOW!U)>NE)GF)\\<45@)91]\\O&)U<?'HM4!4,(H:`!2_(D\nM;1$*O\"K0$KP=C!KTE:HGS9',G#3=IE(WKNI9LQ2I3(D18OO-$C>8H,POJ`EE\nM')3%5+[>%B'2#$C!'SN)GQA+VQ%)%WQ\\\\!'Q5\\WH5+!=&=1#<<8IK%++,V=-\nM=!?#*E7OP<<71\"61_!@`4MP;2$#8%R._+%JW/ZO%%!(]\"^0^C%:'H&5&G@RG\nMB<-OQ`\\VI*L#8&'A>:W;E&%.P7/E3(<;?']!$`8KRB\"KX6Z6PI`6H7:&WSVG\nMS)32GP=Q[.P?/?[Y_LX]N.XYU2Z+_$FB4)58Z]3B*XVJ.BA]F3>CM6+UTT\"S\nM!A5%4B?^/&P_`37GQ9!_(\\U\"XP9]41O320U?A\\(O%'>!#!WB3`C.7IOU`J??\nM0O'*C[#S]/1QRAEU`,P!F$WV\\2Y^_NN?<)M&``8`\\@YB3<O\\PA!OU1!5@.E0\nL(CU&)4YT88BW8(@P*^Q3I=\"%`?X?@^!?7_L:59'>.J@`````245.1*Y\"8((`\n`\nend\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/doc_chip.png.uue",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nbegin 644 doc_chip.png\nMB5!.1PT*&@H````-24A$4@```&(```\"`\"`8```#P*;R'`````7-21T(`KLX<\nMZ0````9B2T=$`/\\`_P#_H+VGDP````EP2%ES```+$P``\"Q,!`)J<&`````=T\nM24U%!]D\"$PL:%HDE[#T``\"``241!5'C:[7UKC%W7==ZWUC[GW-<\\.<.W*$J4\nM1$E^RJ:1I$AMQT%:%WFX4!LD0*$&\"!JHCU]\"4\"\"`FP)MBC@H$L-N\"Q2(D3\\-\nMD/QHD#!)^R.)FS0Q'#MVI%JVHR<ED10IOH;#X<R=N:]S]E[]L9_GW#LSE$S9\nM,J!#7'#FSGWNM=?K6]]:&WCW>O=Z]WKW>L==Y']X\\LDG\\8&CUW[S%W[V(T]R\nMQB!6`!&$!<0$804P`6![(X(0`42`(-X/!@\"(,8```@9!(*(!T?9OHD%D`&@`\nM!A`#^R(\"&`T1`<$`9`!CXI\\A$/L#(`8B!D8;B-%`.8&,1S#C\"60\\AAF7D'(\"\nM8RK`B,#(M?%6_W>?_<8KO_[[EQ^Z_MO_^VOO*$%D-:D4#&KE$\"$8LF(B`40;\nM4&7L'4(`,80`$+MGVN4A(D!E$)`5,0$,`8P!206(0'1E?]9B!>.W@C80K0%C\nMP!\"(&+_D]GG&OZ38W\\6`!&!CGV=T\":HTN#(PVFX'8048`X.*C-9'L[SUBQ_Y\nMR'N>^/`9^8/_^/BG?O?^?_''7WZG\",*O)+[PA2]8#;'K#\";W9<`08AC%$\"9[\nM4W#:X7>G77AA1MC;8C>Z&($N2YBRA%0E4)70905C*H@Q$\"V02@\"Q0K?K3A`A\nMD)#[0`1B^P`1@8A39@%(\",P*G!6`:H$HA\\HRL%(@9I!28,K`*@/E&8FBPP;Z\nM7[5HX\\__XM<^^N4S9\\Z\\LP0!P-HB2@V6W^_^)M9<B)>8_SM!#-L%+06D!:0K\nM2#6!'@^!<@PIQY!J##$52/M=K\"%:0RI[\"R]O[`8P`F@#&\"&(L#51$&?.G##(\nM?F`F`F<9D.<0R@#5`C@#<P92&8@S,\"L0,10QE>-)<7I%__!__B>MI]])@B``\nM.0@JM?4\"N^M)!\"QNW0D@,C!BW,YENT-%W$U#J@E,-0'&8V`\\@M$30&M(J2&Z\nMA,``1J*$26!`T\"!H,`Q9+116WA@YO\\2`^!NE.\\2Z'X'5#I6!6($I!TP&0(%(\nM`5Y+6($405<E'C[$9_[L,W_OZ7>*(#AHA-MT%,T\\\"`02OQ,%QOAU%Z</?J=J\nMB\"EAI`*T!HFU]T0&8$E>TX`98/;OR/:=#((/L@\\D0#'(?TSR3[(W(@HZ2TQ@\nM)C`S*,M`S(!RBT_LOH,U=>*^EX!@JA(/'NT^^J>?^>C39\\Z<P??*5*4:D1@E\nMXQ89<>>%GQD2=B2[Q;/.VFAC=SNTM3%D(,QQH1F`B@X^+JKS.4P0L@M/_CD@\nMNZA,03A\"!\"&Q,G-R`TD0E/49.3A3X$RY\")\"M0(C!1/;U&3!&0U7C[F,/+)_Y\nMM9^>>_J99Y[YG@@C%023\"$A,V.U&[#H;4+#31NR.,B(0J6!@H&$`4SGC8MVU\nMD%C'[@(MN\\@$`0.*(<S6JI!$Q^_,GG,2=@<;]B\\0-H#?S>(=.<AIEM@%I@RL\nM<G!>@#)E;XI!RCY>)#Y/`%2C(28[?7SXT:-GOO@;G_B>\"(.;=XA;Z/!%@[]0\nM,%X0WA>(@4@%2`42[4):`9&$Q:&,0,KM?*6B[?>A+R$(`2YD$VY$\"5XS*#IG\nMNZ/9:0?53!4Q@(Q!N0+G&3C+P+GU#\\SV\\XBRSS-&H\"N-T>8&B`0??N^Q,U_\\\nM['=?&)R:)`%@B&\"(8>!O%(4BY&)X#8&!0`->\"\\C%GWYGBKV/P\"!23CM4,#_B\nM[#S@=[S7'BM(&\\OZ)$\\@Q@4#2!>=K&9YK8\"]/]R<6:-<@8H,E\"L@5Z#,^P]K\nM%D4TJG*,P<8Z\\G8/9]Y[_,P7?_U'OZO\"X'J8RLDMNF`10@Q<O-,5!-UQ`J`D\nM81?O2(-CM4X3/C=(=K,U.;!^A:T`A06B!$).X%X#84U>\\!EP@@U;*OD@S(#*\nMK,-6.4CE$%:@(@?E[.(\"[YN`G9O7D?7FH#H]G'G_L3-?_.QW3Q@\\C7AXV^U#\nM\"[^@;I%BT.*LEO4'(:07O_XN/(5VN]N]CDK\"8U968\"SV%IPH(5C%C`!%(:`+\nMBP\\\"H$*('6*+)`D%;!3%*K<Y1)Z#6P5(V?R\"F:W<W'/U9`31!EE[#EF[AS/O\nM/5;S&2^\\\\,)WT4=X\"^PSVV#SHP9X+;\";R=MNMSQ,]D8N2M(6+_*OG,2LP8_X\nM6,MB%A+3>N\\[R#U/J6C*O`H00\\@*1*2AVP00&(IL[L!*064%*,O#[Z*4TS#`\nM0*,<;\"/O=I\"U>]9,O?]XT(S''W_\\;1-&71!$80V\\7V2\"$T8,XUF1B]L18G=F\nM`F4,5F3_3MX$4=04MU+A;W[EF((V&J*(,5'\\7/&6`(XAS&6`E`V5P^,035]P\nM]%:5V9M)=B$MVTTG`*KQ`%P44.T65*L-573PX?<<.?,;_^9#O[F]?O'>G9V=\nMMQ_T\\Q%/S52)OS^%/H+=BNBKTP`\"+*!'QOE6KV,\"(Q)MGI..P+\\VU8.H5\"!^\nMRX@W2?%SA0B*K!XX@,N!BL:]G1<<@82=$)3S6V1_=XAN.=R&*MH@;<%*<>OQ\nM\\S_UZ).K\"^V#O_V%SSUU\\>+%UT^>//EV\"L)].;=3)<3GSK1$W7?&),VLO3]Q\nM@)&1B$^),ULD(`T;/3G?X*`KZS3]VSN38F4LP5>)H?A!F:P0$05$,/8>PQ!#\nM(.,6,\\G*22E`..!/'NX'V:]9]K<!;H,+@\\Q!OMX]?>KC#SXN7WH5O_&93]]U\nM8?`L=(^<&0DU`;([UR*?XO((&\\Y2Q#M<F.E^32(N_UP2<HBNAI`&BT\")\\S,L\nM#F&-B*M%79,(VX>EP7[&?(=<%\"'D0EJ'%GOAVGC\"!@+$RCIO9:,YZV^L69ML\nM]P$J@*P#;K61M=O(.AUDW1ZR7@__^!,//GYFY?SG/_N93]_[Y)-/XN+%BV]#\nM/4(DH*KD%QP>?D9PR''W)_F6I`&60V,A8)$8@1E`%(,]X.=@#^]#2&`3+;&.\nM-^0B[+)AB>]+KD;AP7I;G_!FQN4U[\"(N(^%Q)-8L\"3OSI-@*F^S&*L=CISTM\nM(#?6?8$!PV%3?.KC#SZ.OWP%O_Q;WWAJ;6WM]8L7+^([U8YL.FI*<@(1))8A\nMP@-!0\"8L3@3@$\",8(4!,$@4[,9(*]MMC?.%UQ,;TUK112+@1/$UTX`1;[TA]\nM2\\W3$P/*;00V@&:KZ0YR(8\\\\*H]#$<QD[)ZK`&H#2MFL'`!8A8WPJ4\\\\^#@`\nM_/)O_<E33SWUU'<LC&S*,@EJB5KX;KY8$Q'`\\)/W[Q[7E&3QA+P#=2HE$OR+\nM)/E%=,YD-<&_EL2@VELL[ZHHO$=R1Y)]^^R<%`'&_8VC3=9IENX2.V,J9PF-\nM71YR@\"$(&8]<(&%?]U,_<NIQ@01A?.E+7\\+'/O:QNZ`1WH8X--5O,Y]!6+]K\nM<PL/Q(7'BH/*R?H\")*\"M?YQ%7,DY4`E15@S(.-2X40\\#XJ+[GTU,W$.%4*RV\nMD7@@$<XLU25'/FQU>5`:%IMRXCZ0V_T*5C/<\\S)Q083SH9_Z^*G'(8)__UM_\nM\\M2_NWGS+0N#FU%3+6CTW\\&(\\Q_&WOQ##`6</\\1/B6E(ZQG>'UAG2I&(D`!Y\nM`<ZJ%T/<&J5VI_[WD/@$6%U9,Y)\"\\'ZS(\"Y\\\\(<)=F6T=H]7<6.RLA6_K`7*\nM6^\"\\!56TH8HVLE8'/_71^Q__YY\\\\]2^OO?;LHU_XPA?>4M)7=]8^&C$FAJRA\nMDB9)W<@G;!*M!CE,*@GQ/6#MR03B(05//DA2$_$Y/0D\"_$I>`-2HV4JT1/Y^\nMMMDV!:?&(5,7PPY>C[Z%F$\"J&:%1?7^&'`D`9P%>80$RI^$V:\"3\\XC_[P*?O\nM.=2[]_/_\\X\\^\\ZO`\"R^\\\\`(>??31M^ZL0P8*6*#-15`Q6'*9;=!T\"OXAF`F)\nM\\(006VUR.]W7@`S[R\"C:>3*20.&>AN-\\C`<=C2]<N<_E%E(\\U\"+1M!)ESE16\nM4>/J6:,+B9UR^3R#X_:P&(P#I\"BSIBH'F`2*K\"#\\]3/_X/03(L#G?^_-\"V,J\nMH;.AG-@W!SN'[7($\\5&,A[$3F#K%HL(\".8TB4S=!OH#C;9&+P!+#X]:3H@T7\nML>%M\"*]-1(DI1E?!D0>?0-'3L+*4G09XP&3+K\"1.*RB&N_7'BC5[60&0@8)V\nM49LXD\\KXF7]X^@E`\\/G?^\\,W)8RLB35YE\"`-&>V:L:,A.0$)U517[%:U53HR\nMC@[C(1\"V(*RRH:EQ$9AE7SB39ISC)XEU\\N1G`5F_&X3HPF0G*'8;(%;O)&P:\nM$,,3M<@])_Y#2!2]0-?_[NL8:V!2V<R_U^98001`K)\"U,HO#*1L\"JU;;DA)(\nM\\+.??.@)$.&_O`DS-:41DF2Q('99='1TA,1N!ELNSKDYE^V%Z80E+FJ*RV<U\nM00(W2@)2'M!N$5=!I1`$D(NTK$]0M6`HY#?>E8D7AT=P;:)'KB;NJX^^G@UB\nMD&,XOOY79[$U--@:\"G0I6.PIQUJQIINS#,7<//)V!ZU>%ZU>#^U>#T61(\\L5\nM5);C9W_LP2>(\"'?J,[(IB\".I2Z!F:OPN9=2R+)'@D\"F)TZU)L_Y!`J@G(%$)\nMN.C!.`=OB$0R81H@^`47=C5NE^D;9ZZ,I,B@A>C9L4((3N`V.X:CCA+[R,IF\nMUU!L26E*@52&=C9!F0$##=S<T=#&.68`3!5H8XR,@3PCY!E09(2Y7AOSBPOH\nM+\"ZCF%_`/_WHL2=@S!V9J2EG/6VH/6#GT@'O2Q)C+\"X#L.;))$0`!AD?[GI,\nMB`*/R=I\\$T!$\\IKAL\",A\"UU8N-N9FZ0`Y(5$83](`R`F!XV[_`89H`Q(*Q`;\nMN^BA3I'!J`R<Y5!9CE9601<6XL@=0]2(9ZPXG@D!2A&R#\"@40T\\F&*S?Q/CV\nM+12].70.K.*GSBP^H<M3^*]_>/8SOPJ\\L%N>40]?'0<I)&@AI'39+L4P,\\`@\nMB<,&U5*P`\"#9S>YI,''1#!IP!(P#@+V-4C9\"\"O2;)#_Q**VO!'JGZ0!)\\G4C\nMOX,<!&4U(`>Q#F0T5CDXT^\"LA,H+Q\\$5=&B\"3!FTM4`[5DN(R+S=8()B*Q#[\nML]4V7948WKJ!<K\"-GWQLX0G1]^&__?'9SUR\\>'&F,++9Y$H*06G,WBBD]X*8\nM84<38L)C*=2[)3XO*)M[?0.'ZD93:,)/Z7,8'G<+>8M/T!.8A1FU4#)4M40B\nMH,7&YAJNVD>*+#=66::'RG-(6<$4E8-#&,PE\"F-@C'&?3Q*(A6*9W.%6@4E(\nM]F=33C#9[N-3/W#@B3=NC5_YG;_XV]_\\W.<^=ZV)3=6Q)D'@ETI-(!R@</@:\nM!26.T=/K72$?;E=;^#O8+K>0%'R(?;P$TT(4:9Y`&BXGYL=CVLXQ2[)I*!2;\nMG->B:)9\\.&[C#@)E\"JPSL\"HA608V.2C/H=H\"9(2*%%CG,'EE-<1O(S$!J:TC\nM0S$JLRF`U19B2TF=#';PKW_BGB?O.]S)_L/_^.-?>>HIE*DPIK&FD/)2@*8I\nML<ED+*\\I74BP=1[$'!;%&`L_DS-'2!2:DG\"'G4-.DT.3`($AD0R%$M,(+!\"T\nM*A3_$E206`4?9N`(:RYG0&89@::JH/(<QK1L:*R4Y5Z5&L;W=;@\\*GPNI`6T\nM!%E..3&4<K$`798'__[#G0_]W,=7W_?9LV>_`0!//_TT#AX\\V!2$1!C`N\"C(\nMVT2N!2:Q3B<`2V30!<@!)F:EH7@7?9`X^((!F(0/%9CF\"<P1\"A:B([\\*!L2N\nMWF%B%!WXN,&BLB,H:/LE,A=F:T?341DXSP$BY$30K$`3Z[2EI2&FLIN@:EB$\nMVK))V\"QB_'LG@A(/!NM\\<;'W(P\\^</3G5N;67CI[]NS@[-FS>/+))QO.V@-G\nM!C5,*9;<$N#-U[+#8G'8,2+14TB-!)#8&5O%ML7-B&<G=8=H='Q8Z[--\\;O;\nM%;+(@;LD:?^$+T9)Q-&,YUH+B!QKW`@H;P-<6ML.ALH-3%6Y&KM`Z\\IJMM-P\nM7ZL1]_[B`@HC`C+&]GWX32PI0\\R`B7H?/%D\\]LD/]#[T.U_I?P6`K*VM36?6\nM/O.4VJZJI_J$.O+IN6%6\"1IHGHMJ1(\"=88G-S:'[V!XRE[2PT,!MFZX_5@U-\nM0(,C:BRNS4MJ.4YBOXQK!Z@JB+;-,BA+&*-AC`:J$F(,5A<*9.T<2@!#QG+>\nMG(_T,0DEK07\"9+G`$-OKH9T@C*L<(A4,<&2E]^%''CCTX_A*_V\\`Z+-GS\\X(\nM7P,FEH2H+O:CD\"`U8)A@DR4I$D3\\SQC@E0OK^+?_Z7]A6';PT(,/H-OM3G?R\nM3?%H]KKD3?^5$C-2K_/:'HJ;-[?P_'//X0<?F<>O//D8<E902BRTPV1[_Y(*\nM&H4^02<,(Q#E&(G&V)8WL7Y&M$\"TE6)1\\$*KVST<XG-`&AK!=3/A;1V3J_6:\nMFID)IB-P52.&%/>E0J4K?/W92_C:-R[CEW[IEW#HT\"&\\$R]C#!8.',>?_^D?\nMX=,E4,RW+#&Q(+NSV9$EC,N;C([M!&X_ZDK#5#I0>L1HV^?'!D95(7&%0+D=\nMH`'H:8@C[8?P\\8!Q)J&I\\>1K`!HDXNP](DO/V-\\G$XT;:]OH]7I86EK\"9#+!\nM._4Z??HTSOY!A:V18'Z)H0K?G.GX4H;`VL3\\!`:D,AA1UJ>0`7%ENV@K#:D(\nMPI8-HPQ9,VC+\"Y16K68D=\"9RM[RC\\?Q41/:%;4#Q\"8XC$I.+_8V/YVU/0ZDU\nM+KYQ\"_/S\\RC+$N_DJR@*Y$4+@\\IVR*I6`2/&=K4!MA,J,X`VH0CE&>]D!,36\nML</85@:!]1F&*A?2NXC4[M;9@HCMLR8FTY(4C(,Z)`ALLZB<E\"9MLXM!I2MH\nM(RB*`E55X9U^+2TMX?JM`1ZX]X\"EEI)=)C8):2L4SUSQBLEQV`B@\"J@D6'C#\nM`$P&T1I,:=])7/9LED<CICHU)45;.6:YD5-JPR9*:)!&;#EM,A$,1XSUVQ/,\nMS\\]C/!Z_XP6QO+R,C1V%D2G0-AER95QR9H!,65C?F:>0M\".6F)5K!Q#2$!TK\nMN:G-8:7VIM-$SE*\"<(:`DNH3!R+I);R;@`!M_=A@9'!U^#[T*PTJ_A9%T7]'\nMFR;?X#(W-X=-]7Y<H\\<@F:`W^BKF\\\\I5[UR6XYDDQCB7Z/LZ&%KL_YZ^PPY6\nM`5SIN7*5QUW15Y?A1HXI0D$_=.A0D^I%\"7W&0]N\"R62\"\"[=.8.[@*72S$78&\nM$[3;[7>L:4H[C186%C`Q+726[@,O+>+RN:NXO_<\\>FU;1!+_G5U#)AD#06;A\nM'F-\"P$*P#306(=%@UZ%DR(*->]<C4H@[06-#\\XB'G#V#3Q@65A(,1X1)E4%K\nM8&-+P12GT.ET4%45RK+$W-S<7=$(2FK?L2B%&K[[5H1@&U<(15%@.!R\"F9'G\nM!?3\"A_'&QAI6H0$1M+,AVIFQCT?\"E3\"N-\\18O$P4`=J59A79.2.IF]ZK9DVU\nMX0.$&OKNLD-*>MXL.\\Y@8YMQ?OUA,!?(\\AR;@QT</-S%^?.OX=:MFQB/1UA:\nM6KHK&A%@YUDK[K\"Q6N)V!UK`S#`.1\\_S'*^_?A'G7SN'K:U-+\"TMX_+Z8QCS\nM`LJR!`UNXT3V+%:Z0]>=[(EV$OQD@,Y8A?4*]1$\"F'@/TV1L'5HX`:W\",!CG\nMG\"B:)V?',!J5N'IS#JIU`*U6\"T518%PJW+IU\"]UN!WF>`R`HI>Z:CP@T_AE9\nM>&\"L[R,$KP%$=C/Y^XJBP&@T1*O50J?3Q<;&!MK=173F#R(K2PP&<WC]]AOH\nMJ5?0;16A:!6(\"R:BR0R!4:YW4#S!3FI<X1FF*3+W@MJSU%#90`)*$,9R4F$P\nM&&(PVH1RMF\\T&J$H\"APZ=!]&HS&4LDTA=\\5'$$`Z$02E$;2%Z4VM2C1;\"P++\nM)A&(B(\"94985NKT%'#ER!,\\]]QS*L@R;2%<E\\NW;F/0,NJU:/3+L>DG;DF$L\nM5N7]K/\"4;9I=H9/8M$)-$E!BC\\75+Y@9,KF$UR^\\BOY.A:HT.'CD--[SV\"?0\nM;K>1YWG8H7<EJZ:F+B0E7;<(M@=<=O4#J1;XQ_F_Y7D.8PS:[3:*HL#*R@I>\nM^N9?X?(K7T>F\"$L]P<F#`CZZ&CJ9ZNO&`3$.N!U3J.Y1(#+OQ0:GM\")+TR6/\nMP*)+4@LFM.8>Q*GWG$:K,P=F1K_?Q]S<',Z=.X=+ERZAJBJ(R-T/7R6I)5*C\nMFC?##X@SK[/N2TW6S9MK.'?N'*JJPN+B(@Z>>#\\>>.\\/HRQ+C'8VT!J_!%87\nMDUH)@<,X$0J4GE#02GG0C@2]+\\&,`HO&<49K=&Q3ZTG3E6`P+#%2CV!^?LGY\nM`Z\"J*ER[=@T;ZU=Q]=++T%J#B*\"UODOK+U/)_6XF*'7&Z>\\>Z/,_IYHQ'.S@\nMVJ7GT2D(H]$1M%HM=+M=5%6%+,LP&?>P,WH=O79,UGR^;*B1\"R..P8#XKMN]\nMG#7%DF-:J(]!8K,\\(2@KC7Y_B)V=(53615F6$!%L;V^CT^G@?1_X\"$AUH-2?\nMP1AS5_.(%)M,?9_?W;;;-2YX*H#4;(4*F_M_:VL+K'+<?_H,'G[X8=R\\>1.;\nMF];_>?^SLS-`7T^PLL#@C&)YUN=C'$:*V,]\"GG\\5YX[LH1%NLHQPJ$QXKFD(\nMI*C1VN6*'</UK^'Z&_,8CTMH;;!R\\!B.'/D(\\CR'4@I:VUE]=R=\\K7<2645-\nMG7;T`=[Y-K4B-4->`%X[+EZ\\B/%XC\"S+T.OU8(S!VI57\\(V7O@K%A$XKQURV\nM`SDT`DQA27.AU.PCRY1RA-`I.P7-S12$Z\\2TC\"-&HZ<WD%?2@EV6*<PO=+#8\nMZV-<E5`DT$9AY>!Q=+M=#(=##`:#\\$5WBV;>S,5^9T]%<+/-4JHEZ7UI[N#O\nMOW+E\"M;7UT%$Z/?[&`P&:+?;6#ET#[9NO(P\\8V1JB'EU&XN]-A1Q;(9Q$W5\"\nMKD.^M$N1BNJI_'N&K\\0`9Z$C*%!;)'UBC6H'$:`R+:CE'\\3)(W/(\\SR$KNOK\nMZWCME>?PRBNO0BEUU\\R24BH,<TQ#UF#C71-[TPRE3CE]O/^_W^_C\\N7+08.>\nM^];3(#W$_0^]%W,+!_#@AWX\"G4X'X_$8Y62,2OX4`D?YAZZ5A\\F7$)A]L3.T\nM#-18WKL[:PXT.DH0\\9A')/<!&$\\TUOMSR(L>>KT>\\CQ'EF78V-A`GN?H=KM0\nMRLZ]N%MF241\"7I+>%W7>@&7:Y/C=[Q<Z%419EKATZ5)XK'_MN?EY3\"83#`8#\nM'#A@$]8LRS`@POK-`BOM\";*\"76W>\\S)=N*HL\\SV2'CAJYYX:(0GYN#9'::KR\nM&QQX66H,M]>P::[A\\J4AM+;F9_G`*DZ>?!1YGN/\\Q6MW+V(B0(4YD'5?$33`\nMUT*21?7:X#4AC9:TUKA^_7K`E_S5[BWCQ'VGL;*R@F]_^UOXUC>?`1,CSS-T\nM6CD.3?JH*@/)79.-1/JG)<L[EKG$MC:1V;'>M$:$.0Z.4$..V\"AUD^0%RHJ0\nMTQ9N7?H_N+UMH+6`5`='CGPRA'PA([T+@F\".C'`XL-$FE53#R@3UMC!\"71CI\nM_[=OW\\:M6[>F8`>M==\"`;J?`VLM_\"2:-5JXP5V@<NX=!9LG6\\VL=,JZ,ZMD?\nMM<]$-8+%KA!'/0YTI-+0GIOD\\LX^MUH9%I=7<42.X:!D`!$J76#UX#&LK:WA\nMQHT;6%]?#[G%=V*2/'P\"MZ.C0[8\"4HE)N1/0#P!V=G9P]>K5FD;YZ\\J5*[A\\\nM^3*JJL+*ZA$\\\\*%/HL4E;,='B07U''(W[B+=O+')I][6`$H9B;0?Q-%\\D(2&\nMDR9110`,QX3-ZF'TEH^BU6I!*87-S4TP,UXY]P+6K[^*Z]=>#[;ZK:`9O@_:\nM+[HDCM>'H-X/1>=M:I/,9N%,H]$(5ZY<F<*>_+6UN8[+KSV+VQO'\\?`C[T-O\nM\\3!65U>AM499EKBUF>-0^77D.=E:0U+3#[T^,\"Y*BEI`,]B\",_HCTDX1!`JD\nMI'QN-[-/:\\%6?X+^3HF\\4X:$9S`88#@<XN3)4UA86,`SW[H(YJO?4;&&V4VG\nMI&1<G(N,LBP#*_MW]LV6PM%\\NL0NO`XSAL,A;MRX$?*,V1\\@PXE3[\\<])T[B\nMPH6+00#&&)1EB?&@Q'91H=,MK&D40HUF&*(XA+:SB)/MJ1&,1J?Z#'V)+R$B\nMT-4(XZV7,)X8C(>.-&8$W?D#.+\"R\"I7E&(\\GN^ZZ_?Q!\"M*QTPS%RFD!0V69\nM^]T*R0J,8\\Z3`'W^]<JRQ/KZ.JJJVET(+C^;7UC&TM(R%A9N8?WZZ]A8&P-B\nMH,L1<//OH(]$\\+-FGAIT47:])6%<T;X:D;HZB<BBI-6ZT&Y%Z'0RM-06+KS^\nM=0R&&EH+CAQ_+PX?/1F@XV9(>\">:D\"Z>GXA&L\";`^@-E!>$'[#IM4<H*9>JU\nMG`^IJ@KKZ^N83\"9[\"L%OM/%XC/%XC%YO#B_?N(Q;5\\\\A8X-N3GA@=8)VT7'U\nMYP1P2J;[AR8>CAMQ%DHV@PU>CS<BD2P.RI+4@>8=M)<?QNF#UD<`P'`X1+O=\nMQLLOO8\"+%U[\"SG9_WR^]V^ZM0==L![(K98403)';'(J=(!3/%`2)X,;U&Q@,\nM!G>T*0:#'7S[V:_AUOH:'CK]\"(Z?>@R/?/\"C`&`CP>WSR(JO([0GI0&\"229U\nMIK,.*7;%[NVL:W*0Y#^J$04`0!M!?T\"0_\"CF>G,HBB+@29<O7\\;JP<-@E>.O\nMO_HLF/MW7#.>];\\=DFBG'*LT0@I=.U8(*K.SF.)TM#AH=^W&&@;#P1V;R2S+\nM<?+4HSARY`BN7KV*=KN-7J\\7!-$W)W%[\\$UT\"FTI-\"DG+(Y?B%!18X+%/J;)\nMU*M'-4)9C5\\/K07;.P/L#*Y#J2SD\"UM;M]'MSF%E905;6UM[.L1==W\\J`\"<$\nM[QO(:8(W619[4L@RVYAHLVA'WA>[:#?7U['5W[HCS4SSB*(H</#@00#`QJUU\nM[#B87VN-G8TWL#VZC:H[AU:.A+*:P-;>B7,R6)[W\"U^E1N^+A`(TAF2EN`^-\nML7G]RWCE10MWB`\"/?N!'L+!P+,3]NPEB+S/4_)LW.>P'KE/B+Y0*/B,6YRV\\\nMX!USO]]_TP&#AU*8&0L+\"[A\\X05\\\\ZMGP=#(,\\;AN0F*$WE()J?,/-+:?F-`\nMY-Z9=4,30HU5&CF%[SEG=+KS6#YT/Q8.+T*I#%H+EE>.NCSB15RY<@7&Z)H@\nMFHM_)V;)+T@X*X(9*O/^0@7\"5FC0AV`X,`)')@``$Y])1$%4&.#6QFWL[.R\\\nM*4T(ML$87+KX*JIRA&/'[\\7RP1-XY+$?19XI&%-!E>MH]\\Z!L^:A&U*C^]A*\nMD7:3E_T,0=G/6<]XO=1/)\"&:T0:C:A%S!]Z#HBA0%$6(DBY?OHRKEY_'A0OG\nM0X2RVZ+OYJ1KO[L\\PO^>J2P(@@C6%\"4)X^W-3:RMK>V=)]Q!^/S*B\\^@'-Y$\nM60F.'S^.5JN-3J>#LBPQF9S`]L9U'#1;=E!P,CDGM!,;`4A'JQ\\&MV`?04`:\nMJM-L%8IW3RJ-[>T1AK0-K3N83\"8HRQ*;FYNX]]Y[L;JZBM[\"/7CYU;,U8>SE\nM#V;]7A.2<D)0T5_8`I`5PL29(J\\%=PIU[.:_'GCTA_#@@P_BQ(D3>.:99W#@\nMP`%HK:&UQG@\\!NV,,.X9=%J(1()4()[3I/R!3<:%MV8?K,F!5<`LD#`-J9SO\nMJ*[BUHTU4+8:^C<.'7T$BXN+&`P&,,9`:XT\\SV=JP'[.NNFTO0#\\(FMMZP%:\nM:VQM;6%S<PMBC*L)RYM.(IN\"\\`S%7J^'N8[\"M0O/`*)MH_#H&I:6=D\"8;\\P3\nM3#H^_3`O7U'CZ?V]1T+'-3)R>JB3)%,,LXRQN-##K:T*M[?646F!00L+\"P?`\nMS+:`4I8!AKA3?]\"LL&69/1^(72YA>Q1-:%P<CX>X??LVAJ.Q<W5LVX;QUH7@\nMK\\ED@JJJ4%45%I8.XLJ%;\\-,-J$86.DQ%N<Z*/(,83@`6_YK&-SEAOV&.8&[\nM:&@VD\\\\8_I?90$?29%KR_5@Z>@('3[;1:K6PL;&!5KN#5U\\]AY=?>!I7K]]^\nM4X*8]9A,*<?L\\P[9:MEH.,)P.,3.8`=B),YV>A/HZW[7A==>@C);N'7Z@SAT\nM^!CN>>B'L+R\\C*JJ,!X-,)Y\\`P8W;-NPSR,JW]:<G!'$+EH2<P?D`22.)HV4\nMIME=$\",8#BMLCQ?16UA`GN=HM5H8C\\>X?OTZMC9OH!QO8CC80I9E01!WXJ\"G\nMS)='586@C4955=C<W,1@,`@MMF$,G\"1GXLE;I27'JRS'F`QO8^OV&E@5Z'0Z\nMZ/5Z@59SZ\\8J#DRNHSOO-HL?%*9-\\KZ!51:%L:=I\\N0RHY(N_^1_2C-XP6A<\nM8KA]':.RC7:[`R+\"8+\"#HBCPOO=_!,?O>0#5W_P-KE[_?Z&TN5?HNI]V;&]O\nMH[_5QW`TB,$))\\QPEW1*@WSVG9BHHKV('_C8XSARY`A>.?<RMK?[`<X?#G:`\nMK2L89R6$.NY`1.-FR5(LG1I3JT=$8L:>/F+&[J\\UN4>>3JM0H-'?X=SS_Q?K\nM&SLHRPJ]A7OP8S_^\"X&./Q@,IC0B7>QF8M=<?*TUMK>WL;FYF=`U*9E*1W'<\nMJR?'>=9$@L)^)Q7!7J\\'9L;<_#R^^N>_BXUK+R+/&\"M+7;SWU`K:G16W^(C^\nM57E7JFW?:/\"Y5&_]VCVS3NH2R<B@H\"T28Z9646#EX''H[!1.:$O<[2V>1*?;\nMPW`XQ.;F9E#AO4S3K-^]`'9V=@)I;68^0'5264QU=F>+OYEK/!YC;6T->9YC\nM;FX>'_S!?X2M&_=#*4+!$QQ8V$&GYT[V\\E:E>>(`Z6A<Q,09AWL7AIJ.6C#%\nMYG*`WW\"L,.3'L'#(`GX^MN[W^SC_VHL8;&]@:W,#2JF9SKI)A]1:8S*98#*9\nM8&=G9XIS]+VXQJ,!7G[^&5R[<AZG'_D@VMUES#_T41`1)I,)^N4&!OIY]$C;\nMGFPQ];J$P&;4/IHRY#3D3A*Z&0SP9NH^F6C<VM3@;![=;C=TC/K*U_+2$HJ<\nMH<V%0+%I.F-/8_&8O\\_*F]3)[^4E('1Z\"UA<7,+-FS?1Z72PO+P,(G*;SF\"M\nM7V\"ILPU5J(@GI26%,&\"X\"C.C]B$/(\"8AZ7F@@H96$+0V&`ZVL=9_#2I?0)ZW\nM4%4EQJ,![C_U$#J=#G9V=O#UIY]#O]_'>#P.-):JJJ\"UGDDF>*MPQ-MU95F.\nM(\\?NP[%CQY!E&5YZ\\3EL;_>A5(;)>`#2`V3J*JJ5'MS\\ZNBLJ,Y`=%2_.\\DC\nMI#;!N38;0^I.1#&CUQ9LG_L+O''U-G8&$VBC<.:'?QK=;A?M=CNPYX;#X:Z.\nM\\)U^:6T!RVZW:[N),L%7O_C?H4BCUREP\\M@R>@\\>1*94.O;?:8:;GBS:M0/[\nM\"?Y(AOSN&S41ID[.3*23*85N9PY'[OLX5D_.@97\":#3!RL'CF$PFN'3I=?0=\nM_O_]L.![0>%OO'$9QFC<?_\\I'#IR'W[H1W\\>K58.HRODLH'>_%6H+$N0OB;3\nMF.M.?'\\Z3>HB9+J,#00VQZ2LL#%<1G?I-/(\\1U$4V-S<1+O=P4LO/(OS+WX9\nMX\\D$1'.1C_1]>KWZPE_CVFL5QL.?Q#WWGL+*H1/H]7HNL#B.6^,,A_5UY![J\nM\\#PPG?0+I).C93^FGY@P:\"H&ZC3U1#&\"X:C\"UO8$Z$Q\":Q81X8W+K^/V]6]A\nMJ3O$#@,WMNC[6B.(\"`676&CMX/K%KT)`.'SD>$SJAD,,AQ6&DQ+M=A:A.6^F\nMO!:8))G#G82O84Q$*@1JA.T$HP4R>@.W^QEN:#M`,%.$<O`&#BT,<?3(O7C]\nMC6V<7Y,PE<9?WMZ^79=2JCX/ZBU>_7X?Y\\^?Q]S\\`M[_R`)NKF^@?^4K*(</\nMV^$O1,B5QAPNP%1MB)8&P9B3<[[CV.T(C^\\*<23EO-JA0<V(EM#M%#BXG./V\nM^6]@9W,`8P3=3H%#JPLX==\\]Z+0*7+EA`.Q@=74U.._OEH/M]_MWY75LZ&UP\nM=+6-$X?G\\<;5/BY=_3)&HQ*L;'9]Z-@B.NV>:W/C&::'XCA6$=0CHMTR:^(0\nM!TLRXS1M>B<`[7:!(X<6T&YG&(ULYEOD.>:Z+2S,=S\"95#!NM-SUZ]=K-/JW\nMRZG>+<0U+94:8S\"N<BA26%WJH5NT<?C@`LK*^H%N.\\=\\-T>K<(>9I_E6K>*Y\nM]W>?0:>1R.+PB*'4C]N`$#*587Z.,==MPQAW\")DG>L$.R]*N74EK?5<ZA;X7\nM%S,#PC\"&;0-\\NX7EE9[+?=T)]F'\\JMC:`Y*`A\\*AX)'!`;-/S;IQOHD?]1\\<\nMC,3!NBDYF-D/8*\\GZ&)0Z['^?KSR/,=<QP8Q9.S1\"XK8K1R%T:4UNE%C>G20\nMA\"15.MX/!J>&:1,T$$R)LVE\"[YJUC4%`8GE'AQ=*'%JHL-&O4.GO7\".4<J>L\nM0+\\Y*.]-;@16#`;!5$,LS2O<L\\#HY//)5&A_D*N;C<A5?0Q?D]_D2PHT:]/O\nM$C6)2..#2^1SIF>4UEXR=>[V\\:TBQ_&C!_\"!R1IN;DPP*BOW&C+U020=.41)\nMAC_C?2SQF),ZQ&XU]5FS:J5Q&@\"2,T\\1YZ:210X*SK\"RV,;1E1X6%@J0.SS8\nM#E1T4'>Z)B()RMK@`<1S>>Z`Q8%&3T4*B3=V5L#]A1J+:]4H*QBKJPLH6@4&\nMHS$J;<(Q,.%L(\"2-?B1UU6;4U=P=)*)8V1.\".>E7IB:'T?.)&M\"S02QAHC$B\nMU23G=HL!BYU\\W\\XR=-N,=L^=+Z0H',J5G`1E)X5)0\\*UI9$WX:S]#@IGRR7#\nM%3V'69K9=W.^7YR+T>T4Z'9:KJ4U^?*F<>HO41C:%3(BE8;1]B0N<L<1$,_(\nM_!75QDN%'F1M8J8;F@V3:B0[3=8)/*$UJ-+1%\"L#Y(XVF3DB@#_5`VF>0`U!\nM2'T>A33^OC?6)+5:A\"2J.Y-=4VOWE5I=+R+`#-]0XR=AUDP:^TY+7_],HH]T\nMX]5VLTS#8?ZT%W_4F4EJ*_Y<4T[;\"Q\"/O?2+%,Y.,(\"I@!SU,_/\\QE3D3O=H\nM6ENIOQ8:M6M/TS?[F:;$+811KS+C,+Y:R-NH5]2:9B1L4#\\BAU-53>>%IP>.\nM4N+P_.)R&DJG`R#=S@Z+;*9Y1F$S2M+WX0Z!\\N;-N.9U7R^@9B`CJ/-8$_RH\nMN8=KT$8S/9#]\\HA=\"`]\",P'`>!JLU)R6I$3F6I&$ZX),[7MM'#@U,'QI=.2$\nML9)(3UVL)U\"-HS']H1[D3U=)^MV03##P)LW/>ZLMK#0\"@21\"TC(=H9&)@WM3\nMS1#9C^D7(R=J#JI/CQ2K?5&:5?!.3FQ/CRV(,1+5I\"&-16XT4!(UPL%$BVKW\nM)1J:+BP:`*80P#KI94@^@\\0SO.%18^6UC:+_,>FB)G^K::3_FVGX--DGH:.H\nM/I+>*5*+T%+R7VT'2C(%1!)3D)Q%&@_O<P>`H`&]^`7TQW6&Z6DSWEQH%]^6\nM[B`G4,T-+?;:R?6#\"_W\"I9\\M)#+)1&B2J6`QOGW2K&+V,C7[:<2L*#]L/)DV\nM`;5SDZ=+W*'+J!894=T4I3;<G3%=4^4IWV3J0F_,,Z\\?A$V[0#V-$)A=9)0N\nMM(_LTN:2VIFI$D=V&ZEGPO[!IFG3[R!J2@>]T&Y2VE7(:5\\`30<`S:8_3G8L\nMR51=/#AG$D#K!D9#3==4]Q_4,%G!^2?OG[ZGGYJ9DV-;H/Y=O+!$ZAU!:3C*\nM,\\QU+8)\"PV?LZ:P;X9WL(0S:5^/<E'V)9PA1PTG7AAI1W(FUQR?$:'^_21\\G\nMC<`AB:30=,Q[J7]JNUW4Q%+7!H\\.F%D['=/1(Z?6PB1\"E'T2NG#Z'!JM7+M)\nM0_:'>4GJ0N`9YFEJ]TD]&DJKANGKI&$A-;E8J5`0F7?!=YJ&SQ\"@TO6)GNP.\nM%T^%X%L7FC1\\:6)*3=.8?&C9!WT5F6X'FYD,SN(HUXYAKQ\\^*DG&/0U+S/(O\nM:5-E$HG4[']ZW+&9YCTD@^5MCZ8`VI\\JK!.'ZQ92)P&.QY$D87!+\"H<T_$\"P\nM(#3;%X6S7>^T,\"1-!:N#9Q*.,VX`?E/^888T91INGW)&_C$Z.7ZYJ<HFB=^!\nMV?0?:F2ZS>%3)(V(1KOWE&F4U-#LG9<>/([$I$FB+B;U+?ZM).8=>T$<L30D\nMTWS8VKB@6::1]@!%&RHU*]JIA9_N\",:$Z3W%-!&J.TUJ:%@MV?,GUDM]X8!P\nMUER-<S0CWJ\\EEH)PF%4]!>!Z#E$[#L=2]D7V$03%X38)O\"TU+$F:*/)^U<\"T\nMW]L#B;NI<!-^1W,.TJR%GO5TFO$_)U$+&HWH?A\"])(*@QF:4:1P(S:BL!HZY\nMLX9T0M&79H(QNU1*#01\"IO*%J);D!\\SN%HD0U=TP4<-F)G:6IC(ZQ$,:9CAF\nM-$+A=.%J&DP18C<<044/=TCR?H$QR9%,+.FAN`T\\;%:0+TET)#JBM&F=I]F]\nM.U,CDETB4Q4E,U6XH!K[3*8F8]8&J4Q%$[NI$36';4_C^TVMD:9O2)X[U608\nMYQ;6`PW3H,(D#JEFSDP#<:9ZHBDN&!!=7S-J!#5[FR:OF4TJ36*09\";ZMTO4\nM(N%D%J$92=VNIDQB,V!X7X/&1/:&9!I3FV'J:\"V9Q$0U/Z\\#[CP@E_9#&V_K\nM8P5OZNB?-*@PQCEC,XU:TVP_.EL0J&?WTQDR=A'&+'N?FJ?D<'',3,)G1%J)\nM-E$#SC#2<-Q-K9D1P85LW<1H!O%TE`C2&1O#AB-1G`\",QK1S2$Q/RIR8^F[4\nM,*][)G0I.4!J04)]:(W41T'OZ;$IGM#+U,\"!=O?54]D]S3`])EE\\2A(K7QQ*\nM#M&8WB#-C#>U\\Y0,UDW,D]>.M#9BR!^^40]L2*:;5KR&&=F'UX0ZTA`./I7Z\nM>B139>NA:^WK2C1'?D0SSW+J,W9->*#9I=Y+$8Q+AQB*RPF$IIUJS90G.]DT\nM>$@^W#6-,BMFA:I)2.S-6EIKH$;AS#EQVA]KV@W-F/$A9`;X5,-M./;/^X%1\nM,]E^$FO'<!EH2*H30RE-Z36'/IKH%Z2)=')#*#S[<S1-C$F`NU`M9-0+^\";.\nMW0@=N#)MBD1V->6SAZ*(=]H4$0`WP[1V:$5C%U,3+DEL>]/O3CG+FD;*-%JZ\nMJS-);2<GPM+3D4X-D3`-IRAQ,7V/=%C71IV#4W\\D0&7B!.196NS#UYI/VW=>\nM4SV'DF9XGT(>M(MMGS)1EB%7SWJ3W95FR,3UX2)IV\"HR([S=)5HSR1@+N+ZU\nM6<\\+@DBR7V^.:D(PT>R8!)'5#J,*^)@D9..&;Y+9Q(%]6!P2P^A9M0R:1@6E\nMX8/)%7DH=;)FUFZ>5<!IP`Q-F(1X=X<ONV@0R>QBUE2N,`-T\"[8_\":.3@\\M#\nM\\BEZ=O28UKYI7T'X\\R#<P!&3#C.3QM&D-$-`$HZV1^JD:RSIU.92G0836!O2\nM0%C-#&T3U,Y=K7&73)VPX\"MH_KS*`(%3W:FG-6RM41M9Z8]&IJ96IL)MPB>H\nM$]W2NO\"^X:L@C&H#^4/D8ZTY?HQTRD4=BPUG77/\"GM\"^Y)B>3>'ZCEGJ-8A:\nMS9D!44GUJ^F?.\"Z>\\8N=\"\"*EM7@LR22C+0*MQCL$KK?H&N.RY(10YN&7<%Q-\nMPVQ*4HT+!`Y*DD3:QT=,M513O<`$2?D%D5\"6.F5J9+[-V4]\"TP[)VV.FNL:@\nM47^@&=\")-+0A#4-K;+M4=LZI^^2LQEE-2IY5.A.=Z[!*F.-GZAM$:$;PTP`@\nMB>]@!(3,X#$E)ZD$NDT#$J9:<:<&M\\Y(Q##=NTTTXWUIERI7NC.=`]0RS2KA\nMQ(2P)`[<U!?7VWZ=0!B4@(50$>Y.1V&D21S-J(ND2:%/SHAGEFMJ@KAX9>/R\nM,]^^^\"UP:X]L=Q=F!<VJ,\\_`5V@6Z$?UVBX2OU'+%RC)%]RN,HY88*I8E/?_\nM-YDC:7&F&9(:'87)%.%KG_CYY,[3+[V?\\<[9R'2^4\",K)/[*3'#QVM;E6<8H\nM`]`&4,RLX[U[W>W+[Z8)@!&`*DL,D@%0O2N([ZH@@H/)DD\"Z1\"23OBN(MU\\0\nC+OV/I)Q9,=.[UW=7(/C_%2.]MIYCA&D`````245.1*Y\"8((`\n`\nend\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/doc_gen.png.uue",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nbegin 644 doc_gen.png\nMB5!.1PT*&@H````-24A$4@```&(```\"`\"`8```#P*;R'`````7-21T(`KLX<\nMZ0````9B2T=$`/\\`_P#_H+VGDP````EP2%ES```+$P``\"Q,!`)J<&`````=T\nM24U%!]D\"$PL9*&-IHE4``\"``241!5'C:[;UK<%W7=2;XK;W/N4_@XDF`)$@\"\nMXDLB)5$2*<F2+-F2RQY/[+&FU=.)IU,:UZ2Z2]-)=TUI^F>ZI_I5[:ZI3BJ9\nMGE]Q>:9J4A//U'39<CN3]D.6HZCM6)$HB1(?$B12$$@0!/$&+H#[.F>O^;&?\nMY]P+4DG'CG\\8*I1`X%[<B[WV7NM;W_K6VL`O/W[Y\\<N/7W[\\PGV0_>*YYY[#\nMJ7T+?_#WO_S@<R(2(\"$!(K!@D\"\"PD(`@`$)_$H&)`\"*`X;\\/`0!@I0`&&`($\nM!G,*<*I_QBF(%(`4@`)80?\\2!E0*9@9!`:0`I?R/P6#]!<`*S`HJ56\"5`ITV\nMN-6$:K7!K194JP/NM*%4`BAF*%YH;=:_<>ZMR__VFW/';O[A__<7OU\"&B#)6\nM*0A0,08S09$V$S'`J0(E2G^#\"2`!)@`DS#/U\\A`1(\",P2)N8``$&E`)Q`C\"#\nMTT1_G;(VC-T*J0*G*:`4!!C,RBZY?IZROY+UOUF!&!!*/T^E'5\"20B0**M7;\nM@84$E()\"0BI-]T5Q\\1\\_^.#)9T^?X6_]BV>>_L8=?^\\[/_Y%,81=27SM:U_3\nM)T2O,P29/P8\"3`)*\"K`@_2EA3H?=G7KA60BXO<UZH[-BI)T.5*<#3CI`TD':\nM2:!4`E8*G#(X88\"UT?6Z$Y@)Q&3>$(&$?@`S@]D<9@:(\"4)(B*@`R\"*(8L@H\nM@I`2)`1(2@B*(&0$BB-B2>,*Z3\\HTMI+/_HW3_SXS)DSOUB&`*!]$84.R^YW\nM^\\G:7;\"UF/TY@970\"]IA4,J@-`$G;:2M!M!I@3LM<-(\"JP24VEV<@M,4G.A/\nM]^N5W@\"*@50!B@G,0KLHL'%GQABDW[`@@H@B(([!%`&R\"(@(0D0@&8%$!\"$D\nMB`0D\">JTVH7C(^DG_Y>_73S[BV0(`A\"#($-?S]\"[GI@AV*P[`40*BI79N4+O\nM4&;SF8*3-E32!EHMH-6$2MM`FH([*3CM@*$`Q=[\"Q%`@I\"\"D$%\"D3R$+:9V1\nMB4L\"8/M)X0[1X8>A3X>,0$)\"4`RH\"(`$D03L*1$2)`EITL&=8^+,#[[ZZ-E?\nM%$,(=R+,IB/OYD$@$-N=R%#*KCN;\\V!W:@I6'2A.@#0%L?;W1`H0'/Q.!2$`\nM(>PK\"OU*\"BX&Z0<2(`7(ODVR3]*?1.3.+`F\"$`0A!\"B*0$(`TBP^\"?,W:%?'\nMYN]B$%32P=%]E1/?_^H39\\^<.8._*5<5GHC`*2FSR/`[SWTMP&Y'\"K-X.EBK\nM5.G=CE3[&%)@(?Q\"\"P#2!WB_J\";F\"`*37GBRSP'I117DC,-$8&)M,V,W$#M#\nMZ9@10T02(I(&`0IM$!(01/KW\"T\"I%#)I5>X_,G3FW_R=OK-OO/'&WX@Q0D,(\nM8@:Q<KM=L5YG!7)^6K'>48H9S`D4%%(H0\"7&N>APS<0ZL!N@I1>9P!\"`%&`A\nMM%<A]H'?N#T3)/0.5L+^`K<![&YF&\\A!YF2Q7F\"*(&0,$1=`D=2?4H\"D?CRS\nM?QX#2)H-M+?K.'UBWYD7?^>IOQ%CB/PWV\"RT^T-=O)!0UA`V%K`\"<P)P`N+4\nM0%H&$;O%H8A`TNQ\\*;WOM]\"7X(P``]E8Y%\"\"/1GD@[/>T<*<#LJX*A(`(@&*\nM)40<04011*SC@Q#Z_;#4SU.*D28IFAMK(&*<OGO_F1=_]^=O#!&Z)`:@B*!(\nM0,%^DC<*D\\'P*1@*C!2PIX`,_K0[D_7W\"`)$TIP.Z=P/&S\\/V!UO3X\\VI,:R\nM-LECL#)@`.&BDSY9]E1`?]]]&K=&L005(E`L@5B\"(AL_M%MD3I%T6MA96T%<\nMJN+,W1-G7ORWG_FY&D-D8:H(/GT(9B9XX&*#+L.='6,`\"A)VMH'4!58=-&%S\nM@V`W:Y<#'5>$-B`+!DL&DS&X/8'0+L_%#!C#NBT5O!$A`!GI@\"UCD(S!0H(*\nM,2@6!A?8V`1L+]]$5.V#+%=QYM[]9U[\\W9^?,40WXV%]MX46=D'-(GG08KR6\nMC@<.TK-=?P-/D9K=;7Z/#.\"QD-I@@O6G\"Z($YQ4C`B0Y0.<6'P1`.HCML$60\nMA`(:10D9ZQPBCB&*!9#4^8400MO-/#=M-\\&I0E3J0U2JXLS=^S,QX]UWW_TY\nMQ@CK@6UFZWR^/P'V%.C-9'VW61Y!^I,,2DHU7V1_<X!971RQ6$MS%NS3>AL[\nMR#Q/2N_*[!$@`29M$.;<V2:`(\"!)YPY\"2LBH`(IB]V^6TIPP0\"%%9V<+<:6,\nMJ%35;NK>\"7<RGGGFF9^9,;*&(')K8..B(!AC>!@O)!G<#H?=A2!0)\"`DZ9^3\nM=4'D3XI9*?<SNW*\"W&E41)YC(O^^_&=`.#J8*P\"2&BJ[Q\\&[/A?H]5$6UDT*\nM`VF%WG0,(&GM0!0*D*4B9+$$62CC],F]9W[GMQ[X@ZV5V4/;V]L_>]+/(IZ,\nMJV+[_9#Z<'[+LZ_F!!\"@\"3U2)K;:,\\90S-[G&>LP[.^F+(@*#6*W#%N7Y-^7\nM0U\"DSX$AN`RIJ,S+6<,1B(4Q@C1QB_2_#:/;:6Q!%DJ@5).5;-;C-[YTXKG1\nM6FG/'W[M]YZ?G9V].CDY^;,TA/GCS$YEA\\^-:_%GWSB3,+.V\\<001HH]/\\7&\nM;1&#4FCT9&*#H:YTT+0O;UR*MC&[6,6*_!L5I(T(;R\"\"TM]1`JP(I,QB!EDY\nM20FP</R3I?M!^L_LU+<`48(H*$2&\\K7AZ>E/'WV&7[F\"W_GJ;_^U&T/T8O?(\nMN!%7$R\"]<S7SR2:/T'\"6/-]A8*;Y9X\"X['.)R3\"Z*9A2\"&9(-G%&L&%8/>.J\nM6=<`85M8ZORGSW?(H`@F`VD-6VR-J_&$!@(DI`[>4J,Y'6^T6VMOU0$J`%$9\nMHEA\"5\"HA*I<15:J(JE7\\UT\\=?>;,R,SO_^Y7?_O0<\\\\]A]G9V9]!/8+9L:ID\nM%QR6?H8+R'[W!_D6AP#+L+%@\"&:/P!3`4D!8PL_0'C:&$$,G6JP#K\\M%A,F&\nMV;\\NF1J%)>MU?<*Z&9/7\"(.X%+O'$6NWQ,*X)RFTL4EOK$ZK94Y/$8B5#E\\0\nM@!)N4SS]Z://X.7+^*=??^OYI:6EJ[.SL_C//1U1-VH*<@)F!)[!TP/.0,HM\nMCB?@X!$,$\\`J0,'&C\"2=_[8<G_L]K#&]=FWD$FZX2.,#.$'7.\\+8DHGT)`!I\nM-H)00\"KT23>4\"UGF45H>BJ#:+?-<\"5`)D%)GY0`@I-L(3S]U]!D`^*=?_][S\nMSS___'^V,:(NS\\3()&KN;[/%&L\\`NJ]L?+>\\)@>+QV0#J#E2S\"Z^<)!?^.!,\nM^B38W\\4>5%N/94,5N=<(OA%DWS8[)TF`,C\\3WB>G899N$CNE$N,)E5X>,H0A\nM\")%H&B\"A?^_33QY^AL'.&*^\\\\@H^]:E/_36<\".M##)MJMYG-('3<U;F%)>+<\nM8]E0Y:1C`0+2UCY.,ZYD`B@[E.4!F7`U;F1A@%]T^[7RB;NK$+(^;<262(1Q\nM2UG+D86M)@\\*8;'JM,T;,KM?0I\\,\\[R(#8@P,?3I3Q]^!LSXG[_^O>?_R?+R\nM7]D8(H^:,J#1_@V*3?Q0^M,^1)'C^1U^\"EQ#6,^P\\4`'4_)\"A(#(<W16MAAB\nMUBCT.]F?N\\3'T>I2NY&0@K>;!7[A73P,N\"N5IN;QTF],(77%+RJ\"XB)$7(0L\nME\"`+)43%,K[TQ!W/_'>?/_P_+'QX[L37OO:UOU+2EPW6%HTHY2&KJZ1Q4#>R\nM\"1M[KT&&DPH@OB6LK9B`+:5@Q0=!:L(VIR>&HU_)&H!R-5OVGLA^7^ALFUQ0\nM$RY39R4,O>YC\"PD\"R3Q\"H^S^=#D2`!$Y>D4P$)D3KD$CX1__^JG?/C!6/?3[\nM_^]_^.J_!MY]]]UW<>+$B;]ZL'89**\")-H.@/%@RF:T[Z>3B@W,3[.D))J%/\nMD]GIM@:DA$5&WL^3XH`*MS(<$V,LZ:ALX<J\\+[.0;*D6]JZ5*#*N,O$G+ILU\nM&DAL#I?-,X3?'IJ#,8041=I5Q8`@AB1M\"/OQ:Y\\[_BPS\\/O__B]OC*Z$3D,Y\nMUB\\.80*VR1'8HAA+8P<T=<A%N04R)XI4U@79`H[U10:!!8['K\"=Y'\\ZLX:V#\nMU\\JSQ.31E0OD+B:0CS1\":LE.CCP0I,NLQ.94D(>[V<>R=GM1`2`%B=2@-C8N\nM5>#7_HOCSP*,W__WW_Y+&2/*<TV6)0@AHUXS861(QD!,F:/+>JOJ*ATI(X>Q\nM%(C0)*S4T%09!*;5%\\:E*1/XB7V=//B:03KN.B,:F&P,)<P&\\-4[=IL&)&\"%\nM6F2>X_^#2Q2M05<NO(96\"K03G?E72\\)7$`&0D(B*D>;AI(;`LEC2H@1B?/GS\nMQYX%$?[7OX2;ZCH1'&2Q(&&R:!_H\"('?=+Z<37`S(=L:TQB+#6KRRZ=/`CMM\nM%#NFW+'=S*:\"2@X$D$%:.B;(#!AR^8T-96S-81E<G>B1J8G;ZJ.M9X,$R\"@<\nMK_[9\"]AL*&PV&&F',5\"51K6B7;>((A3Z^A&7RBA6*RA6JRA5JR@48D2QA(QB\nM?/FS1Y\\E(GS<F!%U41Q!70(95V-WJ4`FRV)V`9D\"G*Y=FHX/[$@]!K$,R$5+\nMQAEZ@]F+\"4.`8!><A:EQFTQ?&7>E.&0&-44OC\"J$8`RNLV,8Z2@)BZQT=@TI\nMM\"A-2I\",4(K:Z$3`3@HL;Z=(E0G,``0EH+46(@'$$2&.@$)$Z*N6T#]00WE@\nM\"(7^&OZ;)_8_\"Z4^EIOJ\"M;=CMH2=B8=L+$D<,9L,@#MGE0@!!`@9>&NY83(\nMZ9BTSU>.1\"1[,@QWQ*2I\"TUW&W<3%(\"LD<CM!\\X1Q&2H<9/?(`*D`J42))1>\nM=%>GB*!D!!'%D%&,8I0@+6B*(S8*4<56L6)T)@1(28@BH\"`%TG8;.RO+:*VO\nMHE#M0WEX%%\\Z,_!LVCF,?_?M%[[ZKX%W=\\LSLO#5:)!<@N8@I<EVR<-,1X,$\nM`1N42<$<@:0WNY7!^$53R-$14(8`MCY*:H3DY#=!?F)96EL)M$'3$))DZT9V\nM!QD*2I^`&\"12)T83,H:(4HBH`QD7C`:74:8V(JE02AFI4;4X1&;]AB!(H0VB\nMO]:G+4TZ:*PNHK.SA?_J_MJSG$[A?_O.\"U^=G9WM:8RHM[B2'\"CUV1NY])[A\nM,VSO0I1[++EZ-_OGN<-F?K^\"876]*U3NJ_`Y`I9W<WF+3=`#FD4(9*\"DJVHQ\nM>T)+*)UKF&H?2=+:6*F5'C*.P9T$JI`8.D1`B`X*2D$I9=X?!Q0+^3*YX:V<\nMDI#TUZK31GNKCJ<?'G[V^FKK\\A_]Z/4_^+W?^[V%/#>5Y9H83E_*&8,(1X7#\nMUB@H\"(Q67F\\*^3\"[6M/?SG>9A2070_3CV;D6(B_S!$*X'+@?RVF;P,S!IB%7\nM;#)1B[Q;LG!<XPX\"11(BC2!D!QQ%$\"H&Q3%DB8&(D)\"$2&.H.-$GQ&XC5HZI\nMS3)#'I7I%$\"?%A):DMK>V<9O?O'`<U/CY>B?_Y_?^9?//X].:(QNKLFEO.2H\nM:0I\\,BFM:PH7$D('#Q+\"+8I2FGXFXXX0'&@*X(XP`3E,#E5`!+I$TA5*5`Y8\nMP)TJ5_P+6$$2TL4P!2-8,SD#(JT(5$D\"&<=0JJBAL91:>]5)H6Q?A\\FCW/M\"\nM6$`+F.50$T.A%@M(.YT]C]]9?N`KGQZ]YW=?>.$M`#A[]BSV[-F3-P1[&D`9\nM%&1]HL@`$U^G8T\"P5]`YR@'*9Z6N>.=C$!OZ0@!0@1[**<T#FL,5+#CU^BHH\nMD##U#N51M-/C.H\\JC$`AU7]$9&!V:F0Z,H*(8X`(,1%2(4%M';2YF()5HC=!\nMDO,(F65CMUE8V=<.#,66#$[C@8'JDT>/[/O*2-_2]`LOO+#SP@LOX+GGGLL%\nM:TN<*60X)5]R\"X@W6\\MVBR7<CF'VD8(S(H#`S^@JMBYN>CX[J#MXIV-AK<TV\nMV>YN4\\@B0^X2A_T3MAC%GD=35FO-(#*J<<6@N`2(CO;M$)\"Q@DH24V-GI&FB\nM3[8YX;96P^;UV0`*Q0Q22O=]V$W,H4),01!5[YLLW/_Y4]4'_NC/ZW\\.@)>6\nMEKHS:YMY<F9795-]0I;YM-HP?0AR;)[PU3BB(#&S!YK\"!0]?@[)?L0_LCG`-\nM*$,A='U:<>#\\5,AW&***K7)#&C$3@R+MSUU=1\"F(.`8K0)'2FC<3(RTFH:\"U\nM@`5I+3!8]WJDQA#*5`X1&@;8.U(]?=>1L2_@S^NO`DA?>.&%'O#5<6(!1#78\nMCUR\"E*-AG$_FH$@0\"LDIT]@\",G1ZGLL)!//9FASEJ4F]P\\T.]%HKC>WM^K/P\nM<4XSL5*?=AGIOZ@C-(&7\"E#:`9.`2!+8,\\<I(`5K:D>0[OT+*FCD^@2-,12#\nMI5$D*J5;WEC'&4X9G&HK%@JB5JQ4QAT^!SAW(D3635A?)\\C4>E7&S;@=Z;2J\nMGD-R91V2&9&2UK8*W_43<MD<&,NYHY!SLZ(WDUU8B!H(4'2`]L?+`07;%&B`\nMA8/%BGS9-$W`(C*B:@45FWA2(+VSA1%+*),WJ=2W$YBWG\"8I5)(Z20^K5/?Y\nM\"04E$Y>X@B$-6$H!I-T41]@/8?>S,HD290^`)?0(*8C9^'MXE9ZR8%3ZO$\"R\nM<V&9HBN'M8FL:[)&\\'DB.Y3%`:,;_B&D*\"@P^?<\"\":@P5D#J;J/$D)L=I=6?\nMTM?A-<-K]%**(%+E\\Q,HD(R@6.J80@HD$MU%FZ3@A,!\"JV&D(BAE3DCH87LG\nM=,IKMVR@L?I4>'^O&U!L@F.$Q&2PO[)X/OR#V2]0(&S6_)5RB\\DAY>P6F+SX\nM@/5>UG4>_;JV484IK$\\H';Q-)Y(0VO<S!$B:XA-%NHM5>MV30JJ%9U*X>H1B\nMI;O:`-T)%2D@5:X(917OI!@D=&\"'TJT,#!TS%\"4&TAM$JG=K;T/X]EGEDVD.\nM\"L;F.'02B:@0Q(2PJ!R4)CD0\"I#]F@D)!@&DB%%'&S7$M`5P)QMG,MFY+S_!\nMRL@X$,#9.D70T<$DH-P&T$:`U(L%9G!$F=-/4N=#4@APFGK24C`$Z642*A!M\nMN>*9*5X),K8D@!(@\\:Y1\"0`J`J<I!(5])_Z/ZB;]K%0]5R)VCD,`'RX0SG\\8\nMX<1D@A-W2$C2K5H4R\"\"5*2J1.<()]2%%!4)MX'KK(0AB5&@.[<(]*+=>QT!A\nM`9):!I.K#/*BH*HF<J2>%2.S,&76L(%>F;JT/>6PZ(B0*J7C7F1WNX)0L;9-\nM)$'&&\"JLO9,\"(JG?A7%/+FF'+S%+TP[`E()37\\D-?8Z0\\M9R&J]9\"AA.]V;T\nML1\\<&D)M9`3OS*[@['0==QXBG#H:HUKN:&NG0*,S@(6M<=1;_6@T%9*D@ZFI\nM*=R<>PLSU]_%U-04\"H7]:#;G,3)\\$G/+AS!2NH;]?3.!,*>;%>:<=L##:.V:\nMA&GYTL4MH1=)F6#,K*N>($0&CBIE@8LA!IDAE.&-N*U#.@&D4E]:-14YW=>F\nM3$BT?1T\"*>O_6_F.,+0*8$K/B:D\\[LJ^F@S7:TSA\"OJN0X<`&<<8&!A`?W\\_\nM&HT&KJVLX/P/UC$Q&N'^8T!YX\"AN[DR@OKV%:]>NX;O?_2Z.'S^.N>LW\\-!#\nM#V'G@Y_@K;?>PK%CQY\"F*9K-)OKZ^C\"S.(\"!X@\"JA8U<T*:,@LQM\"YO`&5;8\nMNBNM$F'S=QA49!?+``_%MKLH]5K:%/K?IMXA0)\"=#I00/E$R126R)5ZAJ7Y&\nMI&.44@ZP$'0#C69(4@C3H:1(DXVWKD>$%'?`QKKF$3,2(HHB2\"DAI42Y7,;X\nM^#B6EI8PO32,`\\4#$()1+!9Q[-@QG#QY$AL;&_C1CWZ$Y>5E//GDD_C)3WZ\"\nM2Y<NX?[[[\\>E2Y=PZM0IM-HIWKQZ&`]-OH=2M&.A@.>\\;9W\"?,^V\"^B:NI?O\nMVX14[V3[QZA,TR-#@EC3)&QZQEW-WC93*@'=>6Z#>R#`LX(%!%H)97I#E'XU\nME@2DYG&2])R1,$S?JC]\")T7VT_>D.5_%C.WM+<S/SV-]?=T9HE@LXM\"A0YB<\nMG'2PK]/IX.677\\;5JU<Q.CJ*IYYZ\"HU&`]_YSG=PZM0I**6PL+\"`<KF,Y>5E\nMK*^OHU@LX8.%/;D`$5!.0<<?\"_;]*L'[(\\/W$)'.FJ7Y6P+=$YD^#F%H:Y&9\nM4B\"<R(R$U*IQ(]_7-+?O2C4\"&P>OB1$T]YCZA_V4N@@EI(0@<0O7I'0=FD5`\nM6KEA,\"8X$6%U=157KFQB?'P<C48#Q6(1E4H%P\\/#D.;(;6YN0BF%1QYY!*^^\nM^BH^^N@C//[XX_C<YSZ'<^?.X;WWWL/ITZ?1:#0P-C9F8IW\"ZNHJEI:V<'Q_\nM'XJB[FL;G,4,WD)FAQD*Q*K.?9[AN3!2'.PG_?<I-AQ]JE?##G?19=G4JQ1%\nMT`\\\"86B+U(`%Y52+>AR&?WT!AI*F=Y\"MP(XS6N$>KLDK]UQ-0'\"&E041.DD#\nM;[_](<;&QC`Z.HKQ\\7&,CX^CKZ\\/A4(![78;Q6(1C48#ER]?QJ.//HJK5Z_B\nMV]_^-NZ]]UX</WX<29*@W6X#`-KM-H00Z._OQ\\K*\"O;NW8L;JTNX8\\]6M[(O\nM![;)ULR#[%:KT,FO&^E2+!M!@6!O\"/=\\&5`7AB1DVW03PD?%&3`=PFL_'H3\\\nMX!;3MT'$+OED%EW.J'>%CCUG0'D1$`B/W3^\"J?U5O/\"#:_B+=R[BQ@T=A`<'\nM!]%H-\"\"$P/3T--;7U_'PPP]C<W,3S(RGGGH*'W[X(0\"@4JF@T6C@PH4+F)J:\nMPNCH*(@(HZ.CN'SY,M).#5-[#-W@<AI?!W%OU:I$+\"MFBD8.RD(C***P!]`S\nMP&2DZ&SZ_00KGR\\@RQ9[*8^I#9((A#OAN@EWA!UO)\\A5]\\@)F6^E!B?NF@B1\nMU</J/;!_K(C?>O88_M9B$__AA]=1KV^BT^F`B'#SYDV,CX_CKKONPOGSY[&Y\nMN8E3IT[AYLV;.'[\\N'-;Y\\Z=PY_\\R9_@5W[E5[\"]O8U]^_:!B#`Y.8ERW#!_\nM\"V6KA1FJ`SI;<IN&O`Y+!5(=<,ZW<0!7+7EH4)43EBD_ID+Y.23>-85G02>J\nMPHT3(2?I\\6`CR'N-\"/JV`C-R*AJC&<W(L56F)VW_6`F_^>M'<&YF&-=7ZA@9\nM&<'8V!C.GCV+E9453$Y.XO3ITYB=G462)*;Q4:#3Z6!C8P._\\1N_@4ZG@V:S\nMB:6E)>S=NQ=22KQS_ET\\=$<),L>JA^^%G?0LW+B4J;5G,Y+`F00!WI9DK3MA\nMJ3-JG1V+@)!4@9L2@7B\"G$NS>X!S_9AV#`;8=MW>*E@'`2XLU'OE4KX\\X:M0\nM::>)1D-B9F8&4DH\\]MAC(\")\\]-%'>/'%%W'PX$'<<\\\\]6%I:0I(D.'OV+.Z[\nM[SXL+R\\;G\\K8V-A`?W\\_*I4*I@Z?P'9[$0.ES:Y&&L>R6A5!KM&27+;%@2A:\nM9!?1Q@8B5U32W:4J4^PR!0Y?I[;T3\\!24K9#1KL=CX)=XRRK@#^C6\\)7,UF&\nMO3[\":DN%ZVT3SM\\A:\"@9&>B@T6A`*85&HP$BPMK:&FJU&AY__'&42B7,SLZB\nMV6RB7J]#*>6,DB2:*$O3%$F28'U]#9\\X=@,#Y2UD[)WM&LO2WVP24:7EGRR\\\nMPEDS(>R:X6T[L3(M8JZ_V\\T=R=$H.<9!9]04JBV\"4G-`E(8]?^%H\"NHNMV9=\nMD^G$9)OR9WMZO5?,U'/TCCPTUD9]?05[)XYA8V,#W_SF-Z&4PNCH*/;OWX^#\nM!P_BYLV;:+?;6%Q<1*%0<(:+H@CM=AM$A$:C`2DESGY0Q6?O:P02CB#39BO%\nMH6\"V5$`T<@YD&$RO1!#S;#+(RL<0441##2%2*RA@*Z/-<ILN\\%8Z/@4-_>SI\nM>MM^H#<U>2FJE?+?$KZ2`$3D.H)\"-,!$O4D?=[12?.&31?RGBULX<.``CAT[\nMAG:[C<W-36QN;F)Z>AJ%0L%EY.OKZQ@:&D(41=C9V4$<QR@6BTC3%`_?#4P,\nMUW.]UAQTZ)'3U?KOD`^^]@^W]+J1\\A#[?FJ(\"-N=0334(+8[-;`<0KU!*)?+\nMP-9%[*TLH88;+B:\"I\"F-<G`,E9^`@#13'B9[,H3P]2X.3Q'=+E@+1RD09UVB\nMZ^A7N9AB#OW4?HDH7L,+/[H.DOV04J)8+\"*.8T@IT>ETH)1\"7U\\?UM;64*E4\nMT&JU7#)7J]6PLK*\"BQ_4</=G`U=CX)Y2$IU4H!AUD*@($(18J@#=4=!CIS)U\nM>&NN9MJ/]Q:/HJ-*!@[KYY9*`IN;&]C9V4&[/8P6#^/>\\H*ONX8+&>J#[<*2\nM;W%V_);4RG<O>A!!#PK=JL\\Z.]<U@V)S&6UFE%*@69H8D_C2%W\\%QXX=0ZU6\nM0Z/1P-S<'!J-!@\"@U6JAW6[CR)$C6%]?=]\\?'Q]'L]G$H_>5<&3_#EXYNXJK\nM-Q66UQ7^]S]6:\"45O/U!@M<^/``&X;W%PWCYC38VFS6\\=/X@YE<K6-L9Q-7E\nM`>/:[>06?:HZ7,+<Q@3>6SB(M<T$C48#K58+4DK,S\\_CO??>0[/9Q,V;-]%L\nM-K&RF6(G[?.]=/8TV,6V4\\78N\"85=%>I;-.-JY1PF.C=KC_\"S7&`.]X<3AUP\nMBHQ,7VF0(!$6E^LH%6,,#0UA='04I5()[[SS#K:WM]%H-!`;]G9@8`#,C$ZG\nM@Y65%:RMK>&5=HPO?.8$?N</_@R_^JN_BJJ\\B<UMX.+<&!8W%H!B`1_,5S&_\nM)O'A'*-_9`_F;BQAIU%#7.S#ZNHJ/G'O));76M@_\"DR.+H``7)ZOX.)'@%)K\nM:+5TW:-0*&!J:@I\"\"*1IBALW;F!C8P-IFF)D9`2':X,XU-<`T@1(S();=\\`A\nM@N!<AXR!NU;]$9\"#OLXO;DUQ9(Z,23Y\\>VY8O:307L&;4'CXCK>QL+D/KUZ4\nM6%U=1:O50J%00+%8Q-+2DCN>2BE(*;&]O0VE%(@(?_;C\\[CSY*.8G)Q$H5!`\nM2TW@Z-$R;JP*4'P0::>#RTO[T>DT,''P*.86=M#7UP<1E=#I=\"\"EQ`?7(ZRO\nM;V$G&<%[5QG%4A\\:VTN8GY_'UM866JT6A!\"H5\"JH5\"I02KG3.3`P@.WM;5R]\nM>A6=._?HL48L`9'ZG<]A\\.:<Q^@!:[-M3(%$\\Y841_Y!G`F,6?%1,)HG5S;=\nMZ10P,-`'`-C:V@(1X?+ERP!@(.JZXY@&\\ZA.&0``'9))1$%4!@:PMK:&1QYY\nM!*.CHV!F?.YSGT.A4$\"I5$(<QUH$K!22)`$SZ\\47`E)***70:K7<8SJ=#LKE\nM,E;7-K&Y6<?86!F%PEX\\_/!=J%0J8&:\\_?;;J-?K:#0:N''C!FJU&@X?/NPV\nMR-K:&M8;+3!%()&ZQGBPTJ>#`]P<[M\"@<J6]NS(HR9\\\"PNW@:ZA_#1H1?/[*\nM7A(#RM3X.6R$!F&T<@WQ'F!>#.*FJ&%K:PM'CAQ!O5['BR^^B/[^?@P.#F)Q\nM<1''CQ_'V-@8HBC\"U-04`&!A80%;6UMH-IM02J%4*J%<+J-0**!<+F>,8T%!\nMM5K%OGW[D*8I5E96D*8I-C8VL+R\\[)Y3*I4<MU4NE[&XN(A]^_9A8F(\"0@B4\nMRV5$483Q\\7$D28(WEAL8*RUBK'`=);GNBGE(T^P((]$CF)NOO=;*TRQT2]3D\nM)XWT_.\"<!L_3-^1).?/3_@K07V%(L86EY9LX-\"+P]?_[+2PL+&!P<!!;6UNH\nMU6JX__[[4:O54\"@44*_7\\?[[[V-K:PO5:A6U6@V52@5]?7W.\",5B$5)*\"\"$0\nMQS'B.'8L[O;V-E975R&$<`L]-#2$I:4E7+Y\\&?5Z'8.#@VBWV]B[=R_FY^=1\nMJ]5PZ-`AIU]-D@2OOOHJ7GWU5??\\SW_^\\UCJGT*_W,`H?83A:!;@IE?:A>UL\nM&:&<7R1A8JH;5W3;$Q&$%3^$A,$9YC+L=G!'(ELO,\"=CWVB\"+SY1P->_M86#\nM!P]BSYX]`(`[[K@#\"PL+*)5*4$KAG7?>P?KZ.LKE,@8'!U&KU5\"M5E&M5IT1\nMHBARQK\"06`B!8K&()$G<SYK-)I:7ES$V-H9]^_;AP($#>.211U`JE;\"QL8'K\nMUZ^C7J\\C21+<???=J%0JD%*BV6RBU6IA;&P,$Q,3N'CQ(NKU.N;FYG#HT\"%0\nMWQ#:A7%<[9S\"J/@0!_B<49_DXFHPW=\\U\\8A0)\\6WR2,X:,W-QPSVA9&,U#)4\nMZN5C\"X\"M'6#FND*E.H)CQ_:AO[\\?;[[Y)M(TQ?[]^]%L-O'VVV^#F3$R,H)*\nMI8)JM8I2J81*I8)2J81BL:@3+0\"%0@&%0L&1AT3DC)(DB3/.ZNHJ?OK3G^+D\nMR9,X=NP8=G9VL+FYB?[^?IPX<0(OO?02'G_\\<<1QC#1-$<<:Y4DI,38VAA,G\nM3CC#**5</\"(B7+ST/JY<N8)??;B\"$V/U(-<,7(D*)G6&LP[)=\\7>.EAG[,`9\nM=;<CU#*:8>[6K@;?6MD:P?SF``HEG2F___[[.'CPH..8+EVZY/Q[H5!`7U\\?\nMXCA&I5)!N5Q&N5S&_/R\\BPVV3A[',<KE,FJUFI_W:HP\"`'OV[,'HZ\"C.G3N'\nMEUYZ\"4\\]]13V[]^/[>UMO/_^^]B[=V^F8\\?&&R)RFT`IA>WM;9=O1%&$'_S@\nM!YB>GH:4$A<_BG!B+,C60TV8'[\\05J>R:/_6KDEE\\SP.?2#ER=V<PB*;DJQM\nME;&^TX]JM8I*I8*5E154*A5L;&Q@8&``T]/3J-5J*)?+;N=;%V31R_3T-$JE\nM$J(H0J?3<5R2)0AW=G90+I<Q,##@#-)NMW'V[%DHI?#88X_AZ-&CN'CQHOL]\nM,S,S^,I7O@(A!*(H0A3IB9<6E:5IZDY!K58#`#2;3;SRRBMXZZVWP,Q(D@3-\nMU@#`E2SM$XY18D]]ZS3`=T_=)K,.HCUG!05=-G!!VA8YJ$NW?WW]$&XL$^KU\nM.H00N'GS)I12*!0*N'GS)J(H0G]_?R88VYU>K5:1)`E*I9);0+MP1+KH;S_J\nM]3IV=G:@3%\\\",^/$B1-(D@3?^,8W</GR93SPP`-HM5JX=.D2CAX]ZF\"O94.%\nM$\"@4\"@X<%`H%$!$ZG0[2-,7L[\"Q>?OEE;&]O8V-C`ZU6\"WM'*T`4Y88_YND+\nM\\A,6PL$MMYY.T^,D0&3&>&8XOYSZ(Z0_VFD%U;+`Q,0$1D='T6ZW$441UM96\nM76'(HB(;%^S)*10*D%(B35-$480XCC,[-_RTB[B\\O.P,$441:K4:GGCB\"9PZ\nM=0I;6ULX=^X<`.#\\^?-XZ*&''/QMM]M(+10U[DU*Z39`J53\"SLX.OO6M;V%C\nM8P,K*RMHM5KH=#JX:ZJJ1Z\"*7EQ0X#64@;LA27>K4FGF)/1`83V=FRN/.:D_\nMB!F;[0-87*]@9V?%)&6:ZE9&X!7'L4O80D1D`Z*M9U2K5>>?K4+$&L\"ZK[FY\nM.0P-#1F-<(KIZ6G,S\\_CB2>>P)-//HF=G1WL[.S@TJ5+F)B80*52<<'7&KS3\nMZ;C7L+\\[BB(P,UY^^66LK*P@21(,#@YJE]57P($1`&W.3K)Q(U1MW8(!2KW7\nM)\\HI[GNZ)LY,;>D\"N]0KNPBF,I$?D]Q7N`EFA6JUBI65%2PM+6=VH=W=(00-\nMO\\?,&!X>QMS<'(K%HMNMU@B6S;UPX0*FIZ<Q,3$!I11V=G8P,C+B]%,7+U[$\nM>^^]AXL7+^*UUU[#XX\\_[E['U2Y,A=`J2VR,8&;,SL[BM==>0Q1%Z.OK0W]_\nM/T9'1]%7&\\77OI_@PIQ$1P7WGU\"N=\\$.\"Q;2H\">E^RK\"@E)/KLF05;T7GG>S\nM1IYPPNSJ7=C:6L7R\\C*.'CVJ@UNSB:UMG<A9Y&-C@MV![HU%$49&1A#',5Y_\nM_744BT6,C(PXA+.VMH:%A05,3D[BZ:>?=@$\\BB*4RV5,3$Q@>GH:+[_\\,AY]\nM]%$4BT5L;FYB>'@8:9HZ.&R-83-TF]39^/#RRR\\C21)4JU4,#@ZB6JVZQZ\\U\nM8WSODL1//HKPP,$63H[MH$\\TLAV?84P@/R(C?R)V2>A$MC08U\"@Y/\\60\\T27\nMIGS[Y7NH5*;PB4]\\`E>N7,&U:]=PZM0IK*^O8W5UU>4(-B>(XSBSVRT\"&AT=\nMQ6<_^UDT&@TL+BYB9V<'I5()IT^?1E]?GSM1]O']_?U@9APZ=`C-9A,W;MS`\nMA0L7,#$Q@:FI*<S/SV-[>QO#P\\,8&AI\"H5#(&,.\"`&;&E2M7,#T]C9&1$1P[\nM=LR=&DNW$)$C$*?7\"=-K\"D\\>FL?!ZIH?W$7!:2\"5S35N:0@*^JQ[<ATY1)7_\nMGOD8W',7!I,2SI\\_CR1)\\.E/?]KA=TM)V`4/_Q\\N;/C_0J&`H:&A+H6<:ZTU\nMB]ENMS$\\/(QFLXG[[[\\?DY.3:+5:>/WUUW'DR!$D28)ZO8YVNXWM[6T,#@YB\nM8&#`O0?[>UJM%MYZZRTD28)*I8(D23`Q,8%2J>1BBLUMVNVV@]9*K@%BT\\MY\nM;%U'F'H_JY[B@=[LJPBS1,;N@2(8=!)>U@=&NGT)[[Y;P,C(&*:FIO#..^^@\nMW6[C].G3Z._OQQMOO(%*I>+\\OS6`=4_AJ0AC2=X`-A&SW]O8V$\"U6D4<QXZI\nMM34&9L;.SHY#7)N;FVBU6JC7ZQ@:&G(:7BL9_>\"##S`P,(\"]>_>Z:F*A4,#P\nM\\#`*A8++66P\"V&JU4)0W@\"C6_1/!>AA5F3?&+8.UI5*5-`V/(N\">N$?#0M#H\nMG</,_:4M_)>?N1?CX^,X=^X<MK:V\\/###V-N;@[KZ^NXYYY[T-?7EPF,=J'M\nMHH?()D0S7AB=-8A=[+6U-0P/#Z/=;N/MM]]&',<@(K3;;5R_?AV+BXMH-IOH\nM=#KH=#K8VMK\"PL(\"EI>7L;*R@D:C@3???!/-9A,+\"PM87U]'M5K%T-`0BL4B\nM6JV6BT<#`P/HZ]-T?[%81*E<`F(!%/2E(?JRD*\"U()BHN;LA>L:+H!+'75.V\nMNGT>>WW=UOIE3$]/H]ELXJFGGL*U:]>PMK:&4JF$`P<.H-/IH-UN8V1DQ*$8\nMNZ@AHLDTY.?<D7U\\DB2N#+NVM@8`&!L;PR.//.+X(EL7V=K:PNSL+):7E[&]\nMO>T,LK&Q@;6U-5R^?!GOO_^^@[T7+ES`CW_\\8\\S-S;DLWIX(9G8GHE@L:D)6\nM\"FV$.`(*0AO&&D38F\"$^SN`L.&4;NZ^[>:0N#B7'WX[US>/$9!_&IKZ`#S[X\nM`%M;6Q!\"X/#APWC[[;>='[]QXP;FY^=Q^/!A5[9,TS23U+F9Y`$W9+^7)(E;\nM3`L&F!G[]NUS=0TAA-L(!P\\>1*VF:R2-1@-#0T/H[^_7\"\\GL6@2:S29V=G9`\nM1%A:6L+9LV?QX8<?XK[[[L/QX\\<=@K(;IE@L(N8BD,I<U3/UC\"PK/^/PMH.S\nM,H&Z2P^_R\\2SK(K-?N?H@127;UQ!H]%`I]/!R9,G<>'\"!4<WUVHUO/GFFR`B\nM//#``_CN=[_K:'*E%)K-IMMU5EMKRZLVF&]N;J)>KV-[>QOKZ^NX?OVZHU(.\nM'3H$(0165E:PM;6%Y>5E;&UM871T%'OW[L7@X\"`V-C9<?:2_OQ]K:[JN;2%W\nMJ]5\"K59SE<!&HX&9F1G<>>>=N//..QU!J.P%MZZWW+@'*;2`3>GV8*3XF`E=\nM#P5X=^I.N^07E)D!*-#`U-`[*-`&[KSS3MRX<<-!O@<??!`7+EQ`H]%P\\LNE\nMI247(&=G9UU!OU*IX/+ER[AZ]2J&AX?QQAMO8'U]'?/S\\R[@KJRL8&!@`*U6\nM\"^?/GT>M5L/`P``^^N@C1W7;0M+D7H69#Z]@9F8&:VMKF=-DLV@I)08'!W'P\nMP#[<?:3?Q9'%Q47,S,S@M==>P_>__WV</W_>!7(914X]XLNFII7870(K;B<>\nM\"*90A?>!<JZSM*<1P@MD12;/*$0I'KEK$S.K\"]C<K*/9;.+!!Q_$XN*B6^2C\nM1X_B)S_Y\"3J=#O;LV8,XCG'UZE7<???=$$*XHK^M2=M\"T.7+E_'00P]A9F8&\nM:9J\"B#`X.(BUM37\\\\(<_1+/9Q,F3)W'SYDW,S,Q@8*\"&O_>WI_#HZ1KF%YKX\nM]DN+>//=RQ@9&<'HZ\"B$$%A?7W><5:52P?_XE;OQT,DB+GZPB3_ZXROXBW/7\nMG53(&N_*E2LX<N0('IK:0:4D,C>0(9B4LUOULQN^BNZZD+<NXV-],&>'FS``\nM[N#P\\`QV-B0JE8,8'1W%*Z^\\@GJ]CD]^\\I/H=#JX=NT:^OO[$<<QZO4ZTC1U\nM%;SM[6V7[5JF%0#6UM8P-#2$S<U-#`X.8F5E!4>.','%BQ>QM+2$*(IP[=HU\nMW+AQ`V.C_?@'7[X#1PZ4`*6P?ZR\"W_J[DYB9:^(;_W$.,S,S6%I:<G&A4JG@\nM[W[Q*!ZZNPPP</?107SU?WH`,]=/XO_XYC1>?^>&.X%+2TM87E[&@6(?]MQA\nMT9&9GLRI:0>V$_R#?M];GH@NET0](SKWNN8WPPWF1DF#<<\\=\">97K^%'/[R\"\nMG:;>O8</'W:)WY$C1U\"KU3`S,^,J<E)*K*RL0`CADJ?!P4$7,[:VMK!GSQY4\nM*A4L+2VA6JUB;&S,^?E&8P>?>6P2?^?S>U$NV`*.KS??,5'&/_G[Q_#:Q4W\\\nMQ_^TA'H]15^UA\"]_81*/WUL-FBFU\\>_85\\:_^D?WX?*UX_B__O@#G+UP`]5J\nM%?5Z'1OW30(8Z!X\"0!Q>*_`Q@S5WS>P)/$V/C#L_0HASV6].M;!_E/%KGROB\nMS]]:QP[?@9_^]*=87%S4/]N_']5J%=>O7T=_?S\\V-S=Q_/AQS,[.9G*-<KF,\nM[>UM5V@:'Q]'I]-!L5C,:&D/CD?X[*,#F-P;>1EFIM'%`XR'[QG$@R<&,3.?\nMXL\"X1#%.?/+%RK\"GPIWXHX=*^.?_\\%Y,SVSC__GN1WCCXB):[?W^^H0T*!^'\nMDZ/Y=DH_TX><@::@[B?R+KDV4S?\"LE?*Y*882&)\\ZL$:&JT5G#V_B@L+*Z@-\nM[L/*R@JN7[^.[>UMM[AQ'+N,V.83(R,C3LA\\X\\8-1%&$5JN%_OY^S%V;P1-G\nM1O#(_2/8.QJ;'6U.@%*9+A^_P_1\"B4C@R\"&9[1Y*.:-*S\\?).Z?Z\\,]^\\VY<\nMOG;8W<OMXJ0]!2K@\\?!QX*L;$Q$:@79APKFK9@[./RY79C5=GVQV1J4$?.JA\nM/?C40Z/8K\"<X>_X=O#N]A*75IJLW_.F?_BD&!@9PX,`!1%&$[WWO>]C9V<'A\nMPX=1*!0P-W<-!_<6<>)0!2>/5'%H_SW9,4/A:#=[^00'^1&%0YYL)ZG4^#^U\nM=TB8$^&F^B*K!%>,H_M+.8):!/=\\^[';Z.$UNK6O%,AE\\OUJ7>,B>DCUW1T4\nM(A?L53`AS8^Y=K,W&.BO2GSF$^/XS,-C@&0D*>'F4A-_-K@/?_*C*[AY\\R;B\nM.$9?7Q^44CA__CS:[3:^_+<^@2]]JA@@E#`'HAQ#+/PT,V*]T';2FIW?E-V1\nM^A19YM1>(=T%]U6VE-`E90T4XQ\"WD]/`\\R!V-!KG:Z_<VT=E&//0D+E6)=N*\nM9GTF=_T:-Y4RDL#$>!&__J4#&.@#_NC;[V)]?=W5FOOZ^O#?_[>/X8D'!(#$\nM[S0%=^5F3_`1*K*E0/?D3+;W(^C3X':SRDXX`6>[AHBRZOA,Q9-N\"31[R&G8\nM[P1[;#E[W4;&XAR.4:0,18Y<@N[4@':23.;>(1]C*.S^--3*%Y\\ZA\"\\\\.8G+\nM5YO8:1%J_67L&8[15VZ9TR:\"UBKAAP*'S(\";OFE+F)3MBK+S7<,9JZZYQ0YS\nM5T%QQQI!^5&6=E8@!ZQK,*E;/U?=IF:=N]_$C5^#3_\"L?Z<<*LKJD'N,&<KW\nM5ZBP&U-YT16'QYLS\"T/$.#99#%Q+*PL+;2R*_;G*^.@0-4$&+D4%WL`6_%,?\nM,VPO1-A!+P,F-<W7<CB7?X6OP;ZLNGN,X'RYP7@/[@*CG`F\"=FH+YZXA\"UV2\nM<)?+L@KU'F;@;E!T%V&'(OSL6'^SG_(T0I<TGGK#[_#]PM_$F$6(X>^2IB?\"\nM#,%B<Z==>\"^2,(()D63'\\.7U3;;-BW87`'3?0\\?<'0<HA%_=D9LR,2$+?_W5\nM8O8]<5?_G9V63,%4\\:YLWZ$1T<V%4>XJ&H>,@O=$\"()Q?N9Y<-F><V<A%$]]\nMA4V8&\"%8GPKDC*C0?1^>[<2R<:>'BB/:C9V@KI:N''71Y4*\"-T6!7PZ5:6SE\nM-@&\\\"X<EAOR,*Z:H;+M`6`>A;*-^_DZ+K!%4#DB$38GPKL<^/PUFD$CKBLS7\nM=I\"_GXMFE!GH+J3UZA^Y;;!F+T2VT\\PHJ%]G>C,8MY&D4]8-<-?XD(PL,3.;\nM@D(:0'C8F`G@H3$XJQ>B(*%2G+NM*_BT0R-#=`>AC=!)_>,$:P,(,]*:#*0-\nM\\Q.F(*9R+NB'N0/U8+A[<DV<62A_%?(NZIJ\\FJ.KKA=<76`2*-==F7E3E.5B\nMPEM#.)BMD$$DE/.6]CZD7,\\?IR:@$KJ',\\C@)%MT8T1A*@5B9._,LQM3DKG=\nM(_\\K`\\.Z!)\"S:^N\"_ZU<4Q`6_(9C[\"YEYEQBEU4]V]G8[E85%L:+<$XIB.R%\nMHQ0$/\"M%$2&4IFQKJV`_$M5ESCD72(&:T?IM%=22E1GYP\")`4,@\"A5#'&O)'\nM^3V<<7GY](`_AIRFIX*&>A*`_C;8K#MBA'>&4M!W(;*&)'2W$8?R100D6S@E\nMV4=>A+<N9A.HW-68]E(/&W##&X1#'HF\"Z0(9CHR[76J(D%+N[I$@Y0?WAB<C\nM/SIB-QJ<W:3A,\";F\\P?.5>;R2(LRC5X<#+_KGG3,N47.-5`&%_UE$C1\"[GMA\nM\\R4RM\\!GN#,FW27*`1!PI]#?X0T[`%':TY:=K-S5W.-.M,K$VZQ[0C;WZ9U'\nM^..3F;7!W`4VT\"5[XBS[RH$KR,E)W'@=(3*M>YD3YR`O!SNU6WG8.[8A.Y^)\nM2%^AG#G%`IE;?NW%A7;APO?F<L!@(G0XD*0+U0>4B;J5J[G=B4\"/42ANXW&W\nM\"^!<$2C?Q\\+!3J)<7$#./9F[?2!%]BAWQ2:5-3KWHG\\IQP'MTB](@?L2(KO0\nM',!CZG5G:H\"^%&<SX5\"6W\\7W\\,<+UKO*C?E6\\81SBHX\\R`D\"04BW4R[WL`\\0\nM0:MQFN8X&NI&RF'\\(.XB&[-7]R#[FF:*/F(R:@MT0_!,O./NO$'T<-<9!(5<\nMS+AEL,[-O>/;\"+_Y=N5K/Y(G>_TQ==VP$G`J.305Y!/V^RI\\'.>`0X\"DD`_,\nMMSK^H>\\6;L)RYC38Q$_UVND]>@DSB:8*C,BW$YA1YN_KIK[SUN#;T[S$62.(\nM'NZI:_=Q%@V%G!!ERP4^>'$O3M[G%S:G<+%3Y6(&`Z[\"1MY=262-8*GV$!XC\nM\",P]1J+ZS2:ZT54O]I6YNS^E9S+82Z.<N88]>_DH!Y<+9D_$;O$E;*H,D$C&\nM_U-W_2#S(\\IV[PA3\"\"+#KKJ`:TNB`<\"Q/!*+[-R-GGQ5Z$&H=RQR=[M^W,(0\nMYP]8]J(G=M<9HW=VG''</;2R>3J4=Q&)I,'UR_FCK`+\\CEWD/Y3+=//#IXAS\nMB\"8UK\\G=+*FBWCLOO'@\\F!?H1^PA:-<*@G_*/N^X%<7A2T/<K8=EOD7BMPM\"\nMZ7JSN:2HUR^TKD:$<^2ZY3F>R:1N>2CGWK>=M93);D6V[A!JCGK@_>SU.P@N\nMLT*.G@E<5>8Z''T)\"/-M#$&9,;7!;@RX),YY*[I=-3\"L4%HB<;<CW+OVFE/-\nMT>W#%%./_XL`M>1%U'80/0>&H-QF[-TEE45EX0J9UTK3[,\"M;(+1NU1*.0:B\nM5VNO?9/$G\"L:Y0E8RH9AHIS/#(F^KHPN6U7+!V;DH##0W>443MJQ7)(5\"EBZ\nM@X/7L_R?G5$59NZ*N_FP7B\"?`W3$J6=IPSH/\\^WK$>%D?.ZJ**FNP@5EU&?<\nM-1DS,TBE\"TWL=HPH/VR[F]_/GYJN&SZ\"Y^;1#42@W@N-J++J/`X\"4L:=J>Z*\nM7QC`V(`!3KM%;4`/--33-=F3F9?2!`Z)>[)_NZ`6=C>S,/5(ZG9U9>R;`=WK\nMJBPD[(HMN:G-3D06R$><B\\J_7PJ*02I;W[`CJ94E\\M\"C)A]6Z90)QJJ;M:;>\nM<33:35\\69O?=&3)V,48O?Q^Z)\\K*+PFW[AC.4,X!2G$;DW.!.W]J>B`XEZTK\nMCV;@;T?Q))W2&-9=B6+5'RFZ@T/@>ES\"IGK\\;3D9SJT3NE`<P!F0D!U:P]G)\nM0+>,V.1OZ!4Y62;M'JN[LGOJX7I4L/@4)%84J/G0BT*G'AEOZ.?)!]8PC[\"G\nM(ZR-J*#6'0(;RK/\"\\\"=,\\6UT3<@R#>[BTVQ7;P#C<E*6K&C&NR,B?Y'[+38L\nMNJ9`JEWJO<$(MW\"((9N<()3CH`=IJ(*=K'(Z)`MW[53++GXIQU:'HTA996L-\nME\"N<F2!.M^>:=F,S>KP)[D$^97@;X?OG[<`HHMXO(((WS\")(J@-'R7GKY8<^\nM*A\\7F+NT@UFCB-[O(^]B5$#<N6JAR`U75'[NAAL.S]VNB'E75]Y[*`K;H$V>\nM`3`S3-U.X^Y=3'FZ)/#M^;C;%2PS)Y*[V=)=@PEEM%/>6&DWTLDP$BH7%-DO\nM9AK,`5<Y7H@Y@+_FWXG*W+32=8HM?,W$M-M1'+D<BO/P/J0\\=NWDZE:/D\\S%\nMAG!WA1DRA1=L(`M;\\[><]!*2.78V&&,1SO#./\\\\9(IQFK`*7%1I2^<>)`&FE\nM(3_&@7@A%YNXMW#@-BH.1CABNV>/8\\Y/<2X&DRGR4!AD5:_=W*N`DZ,9\\C1)\nM.*R+>KG,'B>(N'<QJRM7Z*6,5KEQ<92YN-PEGYSV1H]A[9MN:PA[^;7I85;A\nMK$7.#2^C'@9B=[4]PB`M1-::'$[U@H\\E3K7!.895]3AMC,R]JV%052HK6'#Z\nMI31XORH[-#(SCX],(2H866FO1J;\\J0R-FZ=/@@I=)JFDCP%?V4[JU=!)!4J(\nM;-80CE;,<K'NVA@1J\"=26W(,[Z8P?<<BI[K+U)SM2&C.!6WD2#M;+$JS1@EE\nM+99+<I>1!PF>\"[2!MM4:U<Y7<B=-^$TDJ-MM<E\"-<P(.\"I)$NDV,H'R]F;(%\nMID!DS*&@+`S*E,M\\\\[.?\\LTMH694Y/LJ<O4'ZD&=<.XTA#`T+[%WMC-!W29G\nM&<UJ4/),PIGH(DNKB$!CF[D#B'J`GQP!2>)CC(#@'CJFX\"85)[?)4<*4*>YD\nMZ-8>B1BZ>[>)>KPN[5+E\"G>F\"8`I=ZM*1.!\"!`<!7&47U_K^-*`P*\"`+(3W=\nM'8[\"H%T&M8?TN\\HI&4GT+-=D##$[OS;WQOG9=R\"*M\\AV=U%64*\\Z<P]^A7J1\nM?CD1,8*XD<D7*,@7A+^,*4VU?-XUC2A?L@R5(YS7P08[5Z7>F((\\?6T3/YO<\nM6?FEC3,V.\"ONSA<R8H4@7JDV9A<VYWHYHPA`\"4\"A9QWOEQ]_W1]V-[4!-`$D\nM$;+=>,DO#?%S-80+,%$`I#OP8M)?&N)G;PB3_GM13B_,],N/GZ]!\\/\\#2:F8\n1CA',P>``````245.1*Y\"8((`\n`\nend\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/doc_lens.png.uue",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nbegin 644 doc_lens.png\nMB5!.1PT*&@H````-24A$4@```&(```\"`\"`8```#P*;R'`````7-21T(`KLX<\nMZ0````9B2T=$`/\\`_P#_H+VGDP````EP2%ES```+$P``\"Q,!`)J<&`````=T\nM24U%!]D\"$PL9`2';.CD``\"``241!5'C:[;UYL&795=[Y6WN?<\\<WYLMYKJJL\nM2:6Y$)A!0H\"%&FPD\"PAC;-F!;4+=MIL.&3QT>^AVNP,Y.FP\"C#O<1B;:1AT0\nMM``7DS!(($`&8:325*-JKLRJROG-]]WA#'OU'WN?<_:Y[V66L,WPA[+B1;[*\nM=Z>WU]YK^-:WO@U?_O/E/U_^\\^4_?^+^2/7-^][W/EY_XNJ/?>]W?<7[3&(0\nM8T$$-8H808T%(X#Q7R*H\"(B`TOP[!@!U#A04@Z\"HEJ\"E_YF6B#B@!!RHP[^(\nM@BM1500'XL\"YYL<HZK\\!=:@Z7.E05T*>H;,I;I:ALQENEJ-YAG,%.%6<7IWM\nM[/[4YS_W[#__N9?OOO:A7_[]/U&&2%I6Z1BDFZ(J./%F$@4M'5(X_P\\J(`85\nM0$QXIE\\>$0&;H(@WL8!!P3E$\"U!%R\\)_7ZHW3+452H>6)3B'05%UU9+[Y[GJ\nM)=7_OSI$P3C_/%?F2%%B\"H<K_7908\\$Y'(6XLCR1I-WO_XJO>,U[W_R@_H?_\nM_3WO^JD[_OHO_LZ?%$-4*\\D'/_A!?T+\\.F,D_#(85`S.&M2(_[*$TU'M3K_P\nM:@SUWE:_T=4I99[C\\APM<BARRKS`N0)U#BT5+134&]VONZ`JB$KX0((8_P!5\nM134<9@51P1B+23I@NXBDV\"3!6(L8@UB+D01C$R1-1*T<<Y3_0U<V?^/C_^RM\nMO_/@@P_^R3($X'V1Q`ZKVN_5EWIWH97%JI\\+ZHQ?T%R14I&R0(N,<C:!?(;F\nM,[28H:Y`RFH7EVA9HH7_JE_>^0W@%$H'3@55XUT4&MQ9,(;X#VQ$,$D\":8I*\nM`K8+)L&8!+$)8A*,L8@8K!C)9UGGGK7R:__/;^\\^_\"?)$`*D\"#;V]8K?]:**\nMT;#N`B(.IR[L7.-WJ&KX*M$BPQ49S&8PF^+*#,H2S4NTS%$<.&TL+(I#*!%*\nM#$[\\*51C*V<4XI(!K;XDWB$^_\"C^=-@$,18C*;@$L(A8J$Z)L8@5RB+GWJ/F\nMP8]^X*L?_I-B\"%.?B+#II''S\"()HM1,5YZIUUW`>JIU:HB[':0%EB:CW]R(.\nMC$:OZ3`&C*G>T?AW<M0QR#]0P!JD^IA2/<E_B4A]9L4(Q@C&&\"1)$&/`AL47\nM$WX'[^HT_%Z*X(J<\"R<&]__:!][Z\\(,//L@?EZN*3T3DE%Q89)J=5W]OT'I'\nMFK!X/EB[TOG=3NE]C#C4F&:A#6\";`-\\L:H@Y1E#Q\"R_5<Q\"_J$9JXZ@(*NIM\nM%NR&:&TH'S-23&(QB0T9H/$&$8,1\\:]OP+D26\\P&;[QK]<%_]IT+#W_F,Y_Y\nM8S%&;`@CJHBZ>K<[]>OLD-I/._4[RJFB6N!PE#AP17`N/ERKJ`_L(='RBRPH\nM!JQ!C?%>1;0)_,'MA2#A=[`SU0O4&Z#:S5H%<B2<+/4++`G&IIBT@R36?UF#\nM6/]XU>9Y\"A33\"=G>+F^^_\\2#'_L7W_#'8@PS_P\\:%KK^1>MX87&5(:I8H`[5\nM`K1`M`PIK2*B]>)((H@-.]_:QO=7J:]0&X&0LJF9RQ*JDR%-</8[VH33(2U7\nM)09(#)):3)I@D@23^OA@C/\\\\:OWSG%/*HF2ZO8F(\\N8'3C[XL1_ZHS>&B5V2\nM`DX$)P9']26-451\"#E^B.)02JE,@(?^L=J;Z?Q,,(C:<#EN['PU^'JH=7YT>\nM;TB?RU9%GJ(N)`/$BR[^9%6G`O_O]5=P:Y):I),@J874(DD5/[Q;5\"TI\\AGC\nMS772WI`''SCUX,?^^3?^D1K#M--4$WTU(5A5:!*7*N@J]=D)!I\"H8-<JD-:!\nMU0=-JMH@VLW>Y>#CBO$&5*.H552\"P:L3B'=Y=<P@&+;>4M$',09LX@.V31&;\nMHL8BG11)3<@+JM@$>S>OD0P7L/TA#[[NY(,?^Z$_.F.8_8A'Y;NKU*):T+!(\nM3=(2O):/!W5*K]7ZA_24,NSN\\#HV2H^-]08SZK_J(\"K47C$1L%(G=/7B(X\"M\nM4^PZMXB*4/!9E+&IKR'2%-/M(-;7%\\88;[?PW#*;HJ4CZ2V0](8\\^,#)5LQX\nM\\LDG_PAC1.6!J\\JV]OG-\":A.@=],E>\\.RV/$?TG(DDJ/%U6O'.6L=1RI<BV/\nM66A3UE>Q0\\+SK&U<674$Q*#B#:(Z=[8%!(,57SL8:[%)!TG2^O_5VG#\"P%&2\nMCT>D@SY);^C=U.M.U2?C/>]YSQ^:,=J&$*G7H(J+1@C&:-)X8R7D[=2YNS&\"\nM)`9CQ?]<*A<DS4D)*U7_K%HY(_5I=\"(-QB3-YVJ^(L\"Q3G,-B/6I<OTX&M=7\nM!WI_E$WE)DU(:8W?=`H4LS&FT\\'VNMAN#]OI\\^;7''_P7_S--_W8:/WBV;V]\nMO3]\\T*_*>%JN2JM_CZ&/VF\\UZ&LX`0(>T!,78FMUQA2GVOB\\8!VE>FUI)U&Q\nM0:HMHY5+:CY7G4&)/P<!X`J@H@MO5QE.$#7!\"#;$+?'_'Q#=?#+\"=GI(Z<%*\nM#>OQ5[_M_O<=7NH=^=`'?_C]%R]>O'3NW+D_3$.$7R[L5*WS\\^!:FK,?G$E<\nM65?Q)`!&3AM\\2H/;$D5*?/848D.`KGS0K-X^N!1O8ZUCE3II/J@1;T0:`PG.\nM_XLSJ!/$A<6,JG*Q%M34^%,%]R/^U\\QW1V!ZF(XC\"9!O%9[>]?47WJ.?>(Y_\nM\\8%_\\-_<&.8@=$^\"&ZE[`N)WKD<^-=01/IV5!N\\(:6;XWRCCJIXK*@'1+5$I\nM,:I8#7'&:$!8&\\35HZY1AEVEI;7_;.H=\"5F$2DAI`UI<&=?G$SX1$&-]\\+8^\nMF_/QQKNU;+0+TH&DC^GV2'H]DGZ?9#`D&0YY]S=<>,^#:R_\\R`]]X!^<?=_[\nMWL?%BQ?_$/H1JC6J*M6\"4\\'/U`&YV?U1O:5Q@A706!2CVF1@#M0:3`7X!=BC\nMBB&B^$)+?>\"M:Q$3JF%MWE=\"CZ(\"ZWU_HG(SH:XQ(>-R6C].U+LE-<$]6>.-\nM+7YCY;-9.#U=2)T/7QAPIMX4[_KZ\"^_AMY[E'_WXY]Y_X\\:-2Q<O7N2_]G0D\nM^[.FJ\"90)?(,#3Q0&\\C5B],`<#09C`JHB[+@8$:QM?^N,+[Z==3G]-ZU25UP\nM4T>:)H`+OM\\1QY96I!<#-FP$XZ`T_J0'R$4JY-%6.)3@LEEXK@7I@;6^*@<P\nMMMX([_J&\"^\\!^$<__JOO?__[W_]?;8QDGV=26H5:_;M5S9H&`:R_J^)[A6MJ\nMM'@J50`-1TJUCB\\:U1=-<!9_$JK7TB:IKCQ6%:JD?H_H'Z+JNZK.Q0JX\\#/3\nM^.0RKM)#8>=<$3RA\\\\LC`3!$2,PT)!+^==_U]CO?HVAMC$]\\XA.\\[6UO^V]P\nM(BH?$M#4:IM5%82/N[ZVJ(\"X^K$:H'+QL8`(M*T>YQ%7\"0%4ZRRK2<A,W>.F\nMG08TBUY][YK\"O>X0JC]MHA602'!+;<M)E;:&.BA.BUV>A0\\4=K_%GXSPO$1#\nM$A%BZ+N^_L[WH,H__O%???\\_O'GSO]@89CYK:B6-U>_@-,0/Y[^JASBI<?XZ\nM?XI<0]S/J.*!#Z;2$!$B(*^&L]K-D+!&L=]I_[PN?&I8W7HW$D/PU6:A6?@Z\nM'D;8E2O+\\'C;;$QC?<<OZ2)I%Y-VL9T>MM,CZ?;YMK?>\\9Z__,X[__NKSW_^\nM_@]^\\(/_145?.UA7V8AS3<I:=](TZAM5!9LV7D,\")A6E^!5@79$)M((4*O)!\nM5)IH5=.+4L.O4AE`YGJVVGBBZM^-K[:E#FJFKM35F0\"O-[%%C\"!V/D.3]OZL\nM:R3`)#6\\8A22<,)]TBA\\_U]\\_3\\X?71X]D<^_`L?^$%X\\LDGG^3^^^__+P_6\nM=04*'F@+&523+(7*MC[I4L>'VDUH`T^H&'^:PDZO>D#.5)E1X^?%:02%5S2<\nM$&,JT-%5C:OPN<)\":@6U:.-:19+@*HOFQ+6KQI`2A\\-5U1FFV1X>@PF`E\"3>\nM5:5@1+'B#5']^?/ON.>]JO`C/_,'-\\:^@LZG<NK?'!,\"=J@1M,IB*A@[@JEC\nM+*I>H'\"BQ+5=4-7`J7Q1R,`BQQ/64QH?KNK3VSJ]=@U*+$UV50?R.B9($VF,\nM]92=.?#`B&^SBH93(4VZVWZL>K>7=$`<EC)D;1I<JN'/?_,][P7E1W[FY_]`\nMQDCFL:8*)8A31K]F)M\"0@H%46D=7_5;U73IQ@0Y302#&@[#6IZ8N9&\">?1%<\nMF@N!7[3IDT??*^+C;FW$D\"8'0YFP`9KNG=:;!C%41\"T)SVG^HRX4*X.N/_8I\nM9B5DA:_\\ASW3=!`!,9:DFW@<SOH4V'9[GI0@RG>]\\^[W(L*__`.XJ7TG0J,J\nM%C&ABFX\"G1#YS=J7:PAN(617Q@S&TI`U-<OG3X+6W\"BMD?(:[58-'52IDP`)\nMF9:/\";:5#-7U317*M#)'A>#Z0D]\"3[SJ/E;];,0@@>%XZ;<?8F?BV)DH9:XL\nM#VU@K7C7;9*$SL(B::]/=SB@.QS2&P[I=%*2U&*3E._ZTQ?>*R)\\J3$CV0=Q\nM1'T)6JZFVJ6&5I6E6@=DB?)T[])\\?-`:U%-$;00N5F!<@#=4&S)AG\"!4\"ZXF\nM]+A#I>^\"NW(:(X,>HC>!%2($@_OJF$`=%5-E5KZZQAI/2K,6L0F])\"-/8%S\"\nMS;V2TH7`#!@ID,T9B8$T$=($.HFP,.RQN+Q$?WF5SN(2W_'6D^_%N2_)3>T+\nMUOL==078A7*@BB61,]90`7CWY\"(B@$%<E>Y6F)#4/\";O\\UT-(DIU,@)VI.*A\nM\"P]W!W>C4#IE:V?*]?41FUL39K.27B?A_.D5#J_V(P!3`C0>ZAL2L`XI+6*<\nM7_2Z3Y'@;())4FR2TDT*RHZ'.-+`$'5:,58\"ST3`6B%)H&,-998Q7K_);&N#\nMSG\"!_J'#?-N#R^\\M\\SOYT9]_Z`,_\"$_>JLYHIZ^!@U07:'5*&:I=:=+,&@:)\nM`C;2*L%J`,EO]HH&0TU(<\\S!$;@``%<^R@*.K9TI/_W0%_C]SUWB]SYSD9>N\nM;`<<3(*72A!K<?F,;B?EC:\\[QX.O/<F?>MUAOO7K[Z;7,2$M)YR`%#%E348S\nM-L4D)2;)L6DG<'\"5OF0DUM$KE3*P6NJ,K/(;1K#&&\\1_[T];6>1,-JZ3CT?\\\nMV3<NO5?+\\_RK7WSH`Q<O7CS0&,G!Y$JID]*F>I.ZO%>:\"KMQ(:Y^K-3];FV>\nM5Q^V\\/J.@.HVKM#5WPGC<<8O?/1)?N)G/\\=O_][S5*F`6(L:WV%350^-A%AF\nMNHO,7,FG'[O*IQZYS+_!841Y^UO.\\MX_]P;>\\56G6>Z;FGPFUK^>L9[I8=,4\nMS0M<IPAPB,&8G(YS..?\"Y],(8I&F31YPJYI)*/Y[EV=DHUW>]96'WOO*QNS9\nMG_SXIW_LAW_XAZ_.8U-MK$FI^:7:,HBIH7\"J'H5$@;&BUX=&/F%7>_B[]EVA\nM`)0ZAOC'ATQ'O2O+2\\>'/OPP_^Q??X++5W=#K[F/16HTV\"3A)-`P-JHH;VK\"\nM6A**5,MO??8&__GQW^'(X2'?_O;3_*WON)M#BPFF3#`V1Y,$XU(D3;$]A40H\nMQ&+*%)<6_H14VTA=C=2VD:$F*_,E@#\\M8CPE-1OO\\3?^S.GWG3_63_[)3_SB\nM/WW_^\\EC8^S'FNJ25VIHNM[-(A[B5FTM),8'#S&F/DG.>?A9@CLB.M`2I3LF\nM!&01^-3G7N;]_^0C//+%:]@DI=/MUYE*1?OW737J7Y9@0$6QQE*6I=^)+BR8\nM\\Y_/(5R]OLL''WJ&?_\\+C_/7WWV![_^NUY`F*:XHL&F*<UV?&EOKN5=YB:OF\nM.D(=51>]Q`VT\"%F..3%SFZ3,\\R-?=V__37_EZP^_]H<>>NAS``\\__#!'CAR9\nM-X0V,(`+65#E$TTK,6GZ=`I&&P9=#3G@FJJT;MXU,4@#?&$42AS_]J<>YN_\\\nM'[\\&\")UNC[(LL=:&VE\"P-@E]\";#6U\"?3B*D[?.J@V^M3E@YCA:((1BF+\\/@4\nM$<B<X=_\\_$M\\_+,[_/#?>BWWG4A!A%2$TE@D\\T%;NR7J\"N\\)BCF/T%HVK5VQ\nMNBKAB`RE%1A<ILO+P[=?N.O$7UE;N/'40P\\]-'[HH8=XW_O>-Q>L*^#,T<*4\nMFI9;!+Q5O>PZ0S'UCE%M(H6V2`#-SM'0*<K*DN_[7S_\"AW[V$=(T\\0T>E,3Z\nM!;0VP5B/4772U&-$K7-5;1;%&8-J29)XOY\\D';](J5]H=9[%GH03^/R5\"7_U\nM1U[@[[[G.-_^-<O>MV.PJ<,51>BQ*V59^%,93GC5J]'02/-D.T]#%>?\\W$>U\nMB35FB#F,R/`-YSIO?.?KAV_ZR4_N?A+0&S=N[*^LJ\\I3ZU2RB0>TU[,N-RIN\nMF#\\$<VB>:;IQ(A+A^7[LZG_ZWS[\"AW[F<]@D]1Y.A2+/L8G%&G_\\K#588SR]\nMLPS$L7B(H_84)<XIL^D45_KBS782TJ1#VNE@TM3G#E5!(,IH:YM_^.,W>?'R\nM*7[@.\\^'!7>8-$4=.'&>\\Q9B9)632#1:H$8\\%QCULQYE,(0+G4-BP\\#QM>&;\nM[[OKZ+?RR=W_#)0//?30`>EKC8E%*6K(_:0ND.9@F#J-T*A)$!/)I8:<?<WF\nMY^0^\\*._Q;__\\&?H!E>4Y_X$V,3Z(JW\"WT)5:XVO)TR@_71[78;#`4NK*ZR=\nM.L-3G_\\\\H]&8W\"84I5*6):XH&$]G@'=;O4&?)+$(-LSU*2()/_XKEW'.\\#__\nMA3OQW1*'EF\"->FC'B)_]BSIH4L\\)!F,X16U@)#KG1][4QQDM%2V]%3L=L]0=\nM#([5^3GHW(F(9@YB%-5(Z/6ZEINIX;2:J]I@2'5;1VR;I&0\\</:;_^E9?NB#\nMOX,QEK(H,2'X.E>2I%V<RWW`,_YDK!Y:YO\"15=:.'&*X,&0X6&!W>YO3=YTG\nMRW/4)KSNJ_XRD\\F,YQ]YDL'A-:Z^<H7UR]>X^.R+E*4CRV9DV93^8$BOW\\/:\nMQ+=R0_'YH8]=YMS)!;[[FTXBZG!I@&TZXG>V\"60)%^HF5S;C!&$_ED6)*\\J:\nMTJ.N]'-^QN%L41>N*#8D2R50[H<XXGF(:C^[0\"20]@&H`#VA1-1[RJH\"KXH\\\nM;Q+;U!)6V=R8\\-=^X&=Q:DD[EB+/*<L<:Q,6EE;(9A/$&/K]'F<OG.?,^5,,\nMAD,Z8ME<W^3ZU4WV=EY\";,(SS[R,.L=@L(`DAJ/'3U\"(P21='OS3WXPK9^3C\nM$8]\\XG=Y\\9F+;&YLD1<Y26'H=;LX%5PI0$F!X9_^Q)/<=W:1KWC-H7I3>H0W\nM\\*6<8,J*JN+CG-@$I];'%'&(*?QI*TJT$-1X-HQU@G/AA$C3TKI%0><:[E85\nM:\"I^*HV_]P,H58$3B,02H')7-82J0:2(L.R$?_YCGV!C)T?5412.)$EPSK&P\nM<ISI>(=.I\\/INRYPXNP9K\"J7+UUC9VN7[:UMG\"K=7H_9=$JO/\\#:!%5E.BN9\nM%1DW;FZ1VH3BL:<Q'_M/='I=3M]]%^?NO9?7O^EUO/#RRSSQ^X^R-]ICN+Q(\nMI]=C_?)5L(9$P)'R]W_L\"?[CC[[=5^0B.'5^J@W\\)%3BH'1U$ZIBO(M3Q/C`\nMCO.C#(J/&4Z*D-*'C-3OUH,-T8S/NJ:8UJAA7!^'\"(&=;RI'K4F-B`(2OK]V\nM?<2__HG?0S\"DW0[9;$99EO3Z0\\:[&QP_>XX3YT]2S\":\\\\/C3C+9W<:ZDT^G[\nMN@*ET^L\"Q@\\OAD(O]U&3LB@\"!=3B2D=1E#SU^4=Y[C'+\\;4E'GC3`QSYUK?S\nMPM,O</WE:R3&<O:^^[C\\W#/D>8$@7-G(^'>__\")_XSON1HQBQ\"^3<1%IJVZ>\nMA>:5D<!A$Y`\"\"JT]O#.`2]\"RQ$@\\=](L^W[0KZ*JS[6(&Q]/70DWG%*?-DE$\nM@W2AJ>3Y1UI/(?W@__6;8>!%*?*\"I),RFXP!QYVO^TJ$C$M//4<^F]'I=DD[\nM78J\\(\"\\R\\O&,3J_';#K!.4>GUZ?3'V\"3#JXL<$[9&^U0%!DB0C:;D79[V+1#\nMOS?DADGXU8]\\@K5#2YR^ZPQGWGZ!JR]=X<;E*YRZZP*7GWV.3#-*)_R[C[S(\nM=[WC+(</#9KVN#A(K#_IP3W5/32:%K,-XP`J)5HVG=S8YQAK;T^G:3A+337=\nMM/^EK3C0D%[J=U/$AQ^M:(Q:L\\MFF>/#O_PX8H3$I!AQ%'G&H<.'.'+\\!%O7\nM+^&*+,#:PFAGV_<QTH3EU:,@PBR;8JK.E2N9[8U;[]/I]TG-$!'+HO&MTKV=\nM;6Y>?8GU&PF]_A`5V/W\"TRRLO,+]7_<U#%>6>>69YSEZYUU<>>X9I'1L;DWX\nMR5]YEK_]WC?XS>G*IK4:.G)^KLV%D%C-=1A*]7]7]!W?0?9Q2`6D\")W'6Z*O\nM`<]H.*;4#?UZ0D?FJ5X2T6>D:?\"@N(JII^\"<\\O,??8+)K,0Y$#>E!`ZMK3!8\nM7.+FM772M,LLRYB.1W0'?=9.GF4\\&I%E4[;6K[-T:)75M4.D:3^`:]7\\G.!<\nMZ`H*E&6!*PO&XUTVKEY!,1PZ?H9NO\\_V^G5>>O$9!L-%#F7'^.RO?IPS]]W-\nM':^]CQ<>?8JCY\\ZS?O$BVNWQT&^]PM_]\"Z_!&=,42J&I)%6+UWBH7TD\\W.-<\nMG;`(?H#&(R0E)DPH.?%@X^W[$3'$':&Q]?!(:,C4##XUOK<N<>4=D<R<=TEY\nMZ?BUWW[.#YX'_8VEE462M,?FQ@@!QEOK+*P<XNC:G4S&NVQO7.?0T9/T^@.,\nM-9Q872))4\\;3*:>.K7''N7.</'F\"SW[V\\QP[?@R`CWS\\=UE9Z+.\\N,#U]1X/\nMW'\\_EZ^MLS<:L7GC\"B9).7'V;O)LRM57+K&PN(0J'#I]C#O?>\"\\O/761Q2/'\nMV+Q^E9=OSGCV\\@X7SBP'5DA$P*L(\"T1<\"1=F0YP']-4*E.%QUI]@C</T[7K6\nMTA(?$%KH>Z@.)9IYPT3-^>\"BM*+$!`36J:,L'9]^Y`JN++$&NOTNQG283G)F\nMDSWZPP6.G[^;W<V;B#I.G#Z/<04+_0Z;HS'#7I]#AY:XOK'%9#KCTN5K7+YZ\nM$S&&W=T1PTLO(V+(LAD38'E%6%E>X,^^X^T\\]_SS;&[M\\NR+A]D=S]A<O\\YD\nM=Y,39RXPG>SRTL7GR-4QW=KEU#UW</')YTC2%(\";.XZ[3>+]?]V=U(B!$I8V\nM5-820S_J]4!$)6(J2MC7YC:NR?D^M)H(M*K%8$)PDL8]4??-(LRCZNR%R=+J\nM)3[WQ'4NW]A#C)*DEJ0[(,M+BB+G^)D[F4S&4.:<.GL'+I]Q__ECK\"XOXE3X\nMW8<_S\\;-+:Y=N<YL-J7(9L$5!<`M0#,F@*W66EZ^]\"*];H__9VN;\\^?.,MK;\nMXPT/W,.I$T?YW!>>XMF+K[\"UO<%H=Y.CI^]D>_TZY6Q*I]OEZ*EC7+YTA;(L\nM^>+%$5_]VL/1\"'+5,7&A,@\\=)].4L>JDIAH9%&?#[*!6!#MM<84/<$T-<Z]6\nMWS#:0F5K$I`2S4>T^:YU^ANU7I]^80-U2I'/6%D]P2PK2#LI1T[=P>[&-8Z=\nM.DLO$>XZ=X*U0X>X?.TJGWOL*E>O7F&R-R:;S2+%@'B8*!J,=`3^JD-G&:-9\nMSMYHCQ>?>Y'^8,#+KUSC#:^[CS>_\\34L+?7YU!>>9N7P,5Y^_BEZ@R7$6%ZY\nM=(F3<I9NUS*96AY]?K>=/KJ(KQLQ@&.`4T0:X98PMR&B];\",JMGGFP[NT&DS\nMM\"+S)*`J(%=-'VF@X1I7BGFJQF\"<XZGGURF*G,-'CV&2+H>6UR@*AY8S3IP^\nM!^6,XT>.4Y3*9QYY@DL7+S'9V_,!7YOZ1</(L)\\T,G,9=CQ-)$VL4F4\\WF,Z\nM&?.;UZ_S^.-/<>SX<2Z</TDWM?32A/7-#:Z_=)%>?\\#%YU_DY.GC&&.X>&UZ\nM`!\\K<'?%1,2=>-U,382H<3LC=7=/:N#S=FQPT7V*$&T^K,:_9XO-$1^4^K5\"\nM]^KI%[=)4L-@<8TR+\\FRG.7555*!DVM#DG25+S[]`I/)B+W1\"%>4D4A6W(QI\nMG&&U^QHJCM231O4X5N#V5)%O-IMQ^>7+W+B^SJ&CAWGWMWP3S[SX\"J>/':7?\nM&W#IN2?9W=ZFDW987%[BE9M[.#48<1'MU,RY9`<:7&-(5:OD1>O!CZCN#23H\nMVPXSUKQ@\"#A2BPD<42ECYEZ$2&HSZUSW<\\5P_>8V:X=/,AU/R+():T>.4TRG\nM'%M;)DT3GG[Z6=9O7F-G<XLB+P*/J(*2M25\"(**4Q0S-)NAX!]W;@?$NDDW0\nM8H8UOG=AK)\\H-2;Q`XP(UJ8H2IG/N''Y\"C_]L[]$OYORKG>^C:,KRYRY\\`\"'\nM#Q]G>V.=[<TMKJY/N+&9@]IXD*,>I)2Y!,?,`1&M_6J:*2BY;;\"N!\\BC(DT;\nMK2;9UYZ(Y^JD-4!2'5/GE/6M&;O3E+0C9+O;G#Q_)WL[FZ@JS[UXB3+/V=G:\nMPI5%L*<+'S0<Z4\"]S&9C\\A\"L+6`K$EK-,?15KD/H#H8,%I89+JQ2JF+$4)0E\nMZLJ`3WDINIW-3?(\\XY<^^MO<W-Q%G7+\\CKN0EV![?8.EU</<V,XXMM:M!V^:\nM8QK/A6B['C.UI$@].*LNBG)R6UI^4)8)$_X-\\BA!T:61-VLP*6W1Y)5&/JCZ\nMF/_D1S\\)TF-W9Y-3=]W+:&L+=8XBFS'>VV-K8]T;H4J/`P/\"&(-!R*8C-FY>\nM86]WFRR;X8`\"*(Q0&$MA4PIK*40H@BS+9#SFYO4K7'S^\"7:WKI.FEL1Z#E-#\nM9O0]]LGN+D\\^_B1E4?J\",)MQ_/2=+*^L,-K9X4<__%0+<?`5M<1LBZC5'`&E\nM\\<Q?+$TA^]NM;4-4DYC5A(_$P4#V30BU9A5:&'EXO!,^_>A5/OGHB)WM34Z<\nMNXO=C1N`HRQRLMF4\\>YV,R2)3^N,L1@QY/F,S8WKC,>C:%[/8-(!MKL$G24T\nM7<#9/IH,,=UE;'<9TUGP++ZP4[<WUWG^Z4?))KMT.SVLL1A,&._VGS7/,C:O\nM7Z$L/&.CS'..G;M`K]_E([][B9_^]1<:]U#AFI5R3MEDEA+25*D-W0C+>!J/\nM>\";\\G\"7,?&,(DX0!ORI5K5!$::MIM?JA--(^2(N'\\,$//\\UH=X>EM36RR00)\nM/>`\\FS$>[30U\"O@%,I8D21CO;3/:W@Q,%%(\\I0``(`!)1$%4O_!N20^2/F4Q\nMI9B-*&8C\\MF((A^19R/RV0Y%MD.9C\\%VD,Y\",_RNRM6KE[A^Y052:\\)[^=AA\nMPVQ<GN5L;]P(`BP.E^<</WT.=8X?_/?/L#,J?:S`-L6=!J@_FK.HJ$-^5\"',\nMZ\"5>Q(M:F4=>+5B;^BO6UFB&VIN&:FM8'(V'30'X]*-7^?Q3NQB!3F]`-AU1\nMNH*RR!GM>/>D3D/KTV!M0I*F[&S=9#H9M]O2Z<`S*O)Q/2*&\"7T1$_2?3`1-\nM%Q,TGR!)/Z*@P&BTS97++V\"MU$R]\"K<\"R*8S)KLC2O4$@K3;97%UC<V=\"?_W\nM?W@^&I:12(ZB\"J;.=^V<UO.0:L(W2-V?$;%PVQ.A;5W75A8[=PI:4DHM$F*3\nM]O_D1RXSWMGB\\/'3[*Q?QQB#*PHFHUU/-(A6VB0)UB:,=C:9S:;M_9$.T6**\nM:!D\"H:`F17WGF8[ZP.T3O:1!/M6A^11,K_7Y]_9VN7KE19+$DE:B6M)PLG:V\nM-RCS'`3R\\8PCQT\\B(GSXXY?9VIE%K=+@\">+V:46.CH9NZL:QQH7>JVAQ5+H6\nMU9>(F6L,18R,>4F(1H*`2U=&_-X7KM,=#MG9V?9E4%F2Y1GY;%HS!T4D,#@,\nMD^F(\\7@O.N;!'163NANF)@%CZ5%R-+'<-QAP_\\(B=PT66;.6KI:^TC=I@PN5\nM$[\"]9C`?86]OQ'BTY5-',5X`)\\+61MM;GEQ&29EGK!XYROKNE)_^C4M^X<L2\nMBJ+N2]1&D*B0<H&LW1+7B9*>V\\H$B;0F_6,UF7FADK8QV@GT?_SD-?+9E-[\"\nM*KL;UT&$TI5,=G=`/?TD9LT)L+NSU>8O2Q(E7_Z(&[$,C&%AN$CG\\%'*H\\=Q\nMQXZC1P[3.WR<?F]`SP2Q(TD:YKHK:AIF]:*7+[\\8W+IXRHY-L,93=\\I91CG-\nM0)5L,F'UZ%'0DE_XO9MH7GI#N.IOW3??U[!BO(A8Q:B71FGF=H;0`]1@:`>B\nMN1.D^TZ#WS\"_]:D;V,0R'NV0)@E.2_+9C+(L6@P08_Q@QWCL<_BH'/&3G\"Z+\nM9JPZ?N<N+=(]=8HC:SW.#V?<U=GE5'_&TG)*[_19[.(2B9%&5$KPAI`DJGW\\\nM]KUV]1*=M.-9XD:\"2I'_$./1+BJ\"P9\"-IRRN'.+95T9\\\\=)N\"VMKH5^Q.H)X\nM:K6GW;AH?[]:^CK/?ZWKEK8JKT;YJ]15?Y/>?OJQ=5Z^,J(W7&*T>1-C#>J4\nMV702$%D-H4OJ$[$7,JAV9U9;\\D`\"T._1.W&,HELPLR/N__JOY!W?^]=Y\\SN_\nMD9EL,S%3DN.GD/X@H*(VVC=F/N\"QL[/M-P?X9\"'QK$\"QAKS(<<XA!HK9E-6C\nMQ\\'!QQ_=:A6PM72TF+8Z7W\"%)K2,)7\"&1=KQ\\0!#F*@J@SE6;82URGY:3>2F\nM'GYRARS/,,929!/O0D,!%]<+UB8(D,VFS,<P,=VH6!*P':]NNK;*9L>RIV.^\nM]CN_A[-?\\[V<.G(_)][PG;SS>WX`,1G;MJ`\\=(@D\\0HT6LD(E3.?1<4#.:KL\nM[-S$8()RI^^Z>4);0C:;>J4SE$ZG1V\\XX`O/C2/!>FF&,EM>(ZIPJ>A/C7N:\nM/Q$'=^BBN89JZE/C(RCQM$.DAA)<U,-/;-`?#+EY_2K=_B`LMF_X&S&H<Y0*\nMQBA)TF%G=S.B^$>X?YD'ZH[/^9-!C]GR(4B%Y;6C/#>#BY_]1<[9'5Z<#LF7\nMSW+D[GO8?.XJ;FF5SLV;:!;@DEJDJP-,6D:_=O5ECAX[SWB\\Z_5BU7DI(Y0L\nMFV'LJN\\_E\"7#I24^_?0V-W9SCBRF]3A\":_E<NTW@F=H2\\:3T5>J(6E9ZSCW%\nMX%XM@!L?S>8S[.[EO'QY#[$ID]W->EXASS*2I..)`XG7V'-A+#@+Z:H@\\U!9\nMG6$8TR7I]*&70C=ADAJN[[Y\";REASUH8\"\"]MOL`XJ,W123&)5^X7DT2:'W:_\nM]KE\"GLTP-O'U@RMQZLC*@F*:A]-AR6=3ADN',4F/B]=SKT]8)S-SS)<ZQ=6V\nM!%-PR:^BZ3<W5QS1RIM>1#P8N_\\%K]R<X4A(.EV*(J_G`UQ14@:?F^<99>D)\nM9LZ5<W(1E72=J1%?0>C:E'YB20<=>OV4M&,H9(=SI^#/?.-9SIY*&$VOL#/9\nMP2Q[UM^@/_\"%8MIOJ2O4^DW:5*OCZ0A5)4D3;-K!IAT&O2'=;L<3S!)+GDU9\nM6ET%$1YY<1)5R!)I5D7I;\"R'-&<H>=5AQL!4.)A0)LP+-S03_3Y_VAX5OFV2\nMY[BB\\\"6^EA1%09IV*(H<DR0DUI(F75R8FT/`AGZW\"^T7M5TH9X\"RTENFFTT9\nMI$)WJ<]\".N/\\2H_9R44>&?;(5BWW#BW/&4MGV\"//)O1RRRP=,,M'C4LMLZ;)\nMTZ;WDN49DBMIVB7/9FBGAQ%#69:8CH5B2E$ZTB3ERD;F$X'2M4<56I5V!;N&\nM,B\":GN*VK5)MT?M:5'WF9QWF)_L#$KNQ-<6(4%2RSV)0%]AWUF+5>?)O\\)E2\nMQAHVC3Y46<Y(.BL490885I*$Q1D,MW(XL<S9XX<Y:7L<>VG,<,^R<#/#F![#\nM4Z=YX<HFC/;8F<Q86S[)*]>>0$1(NBODTXU&F3Y<6%(-P%<L[D(S!*'(9OYW\nMR7,8&M(D938>@1$V1H5W39I`&(39Y^]:07M.(/+V`^]S)Z'NL4:`TSX)H,98\nM3L'8E$ZG0SZ>ALLT/&9M0B?-!'D>=5H+K<>8?=6(1)5.VJ7(_:QV4>YP3V^!\nMM2VE5W:@T^.MK[V?-]US#WF6LW5TEX^9+_+PDR^0SAQ;US,Z:EB?7&G(U,8$\nM5I+&FC6AOQ(@\"YHQL=*5@=?K262EF)J=[DQ04E:O64(I<SM:HF`M!(Y_0\"QD\nM'L(^*%C'\\D#1J=,Y1&\\^Z0]PR,KR@\"3M(>%ZF4K:,\\8.B[*D+`MFV61NR%[H\nM`AV$%$5GV_1[*PCPW-8ZJ[T!7[ETE&]9[_+N?!&]NLV5BZ]0Y([-]2V6=V>\\\nM97?`:R]FG%/+(9MP;;0-*$FZ@!0SKRP3=J!&PELF\\;/6)DE0`T5+2+(1!)8P\nM.-/OIA&98*Y?'J^L\"Y=;5)B4NG;'Z&#75(5V<Y`<P4&QN9WAB&%QF/C[(Q)J\nM%IX80^E*$A**(J]A9F,MINL5B9TZ<H0U]=]G!K)B2F^X1I%[QO>OW7R);S]_\nM@3]U]`[L=`F]G)#=W\"-GCY6]&:];[W-S8\\2CPR.4XQF_N7O9!UJ3,!BL,-ZZ\nM1-K`FF21!^[WEYA,_#@`SI%I@=@$2N<16D^!I%2')H:EA4X;?C%SUSS$USY0\nMJ3E7\".T<T^4@.HVG+]]JX?56UJ@-MC\"P)#;%)!U*2L0(-C&XLJQ153&&Q/JK\nM9O)L2J\\_9#(>480-M*R&TBE3E.GH.F>.W\\WE:Q>YE,WXQY_[7?[MZBIWO^$M\nMR/$C]\"CIC2>PET/G)HNS/H]?O\\9'-RYQK<PQ(JRLGF%OXR(=51)/C_;3(941\nM>@.*/\".;^9A@K*77Z?@TW3HZ:0<CZN]%TA(CAM7%8>A#5(L;MXVCB<]*S*OR\nM@6;__KY-06?:K<%(V5+G50RUW;\\]LI+0[0AIX@&[\\V>.,9[F7'_Y)9PK0_W@\nMR(L\":Y0D2>CV^DQ\"%V[#*.?*!*..HH0I)?G-BSQP]FXN7K_\"8WG&=_WZ+_+W\nM+C[+MWSUVUA^X%[H+N)VKO+*8Y_GEQ_[+/_JY:>Y5,SHV)2C1\\^S??TY>JX@\nM!2\\%!]R(?/2I,W>SN[=')^U05O5#42#6DECC&>DHV2QCN3.@W!MSXLAB%`<J\nM;JSQ)\\.Y1K@KB/W6.H&J7Z(61URHH0?O?&TK3<;_UN]:3AY)&8_]6.S1PX?8\nMG4RQ28+F2IYG`=[P&%!1E'3[?9(DI2ARIL!UH[S1)5A*<,*DR)E<?X$CI^Y@\nMHQ\"N;=S@[SWS&!]\\Z1GN[RVP8E.N9U.^.-GEF=D>&,/9HV<86&'GVO.L9!G6\nMA:DQA'6!/!C\"&$.:=LGRDBS+4)34)JCU*;2':GPL<*YD<669T<85SAWKT**J\nMF.AT%-58<W1'4(5%J3N0/)`<B+Z:./W2@Z)S\"^AM)..\\02Z<6>#%J[ZRF,XR\nMRK*D/QBRO;E!DG9P14Y9.C]'C9)G&8O+A]A<OPXHSTO)>4EXL_88!%)7J26C\nM]4M,EE?)[KF++3I<7;_&PWE&64Z0!-+E1=ZR=(:NE,RN7V%V<YV5O*0L!:>&\nM$K@IRDW3P!(G3MW):&_DQ\\[4ZR\\Y_.4>UAJZW7Z0ALA)NGV*/*>;&,Z>&(#-\nMP-EPDX!IQ@/$M>N+6CD@,L9M75/%U'(V?._:Z9,<+&.C<Z*';[SW$!_]_4T&\nMPR4>?>*+O.UKOXJEY66VUF_ZSVD\\WN2<J\\7:C>W0[?:8S2:H\")\\P,XZZE*\\U\nM75:,HY=8-(4]-V)KXWFVTR%W+71QO25*8S#%%,8CDKU7D+TQ9EJ2BV7JE!T5\nM]H!+XGC>9+41>KT!_84E1KN[=5)!&,U-TP3!D'32L-%S.OT^T_$NK[EPG)6A\nMJX5@&N15\\4?/DP2:\"MO-P<KF50JZ@W/3%N.NU973\"*J.[/.F^_HL]\"R'CY_B\nME><>QR:6U[W^`:Z\\_!)YGM5J8M6`9.D<FF<L+*]1;%SUH[XB_+0=D;/`=[/`\nM434L&4.2)F3=E)%U;$G&9#KQF4Q98%R)I<0EEIE5=DG9QM`5>%IF?$:RJHY'\nM1#AVYBYVMG?\\C']HMZKX:1ZGBFC)RN(*IG1D6<E@>8'IWHBO>.OYD*U:2))F\nMA$HB:=6:1%*&P1VE+6IOOA3AK(K1W4@&U:=%]U?6\\\\=L89#RQGL7V=I9XX6G\nM'5<N7V=E;8V%Y16VUF_6<BNJ99UA>`PJ9VGE&%L;5P)<+OP<>SR:97Q?>IBW\nM%SU6\\Y3%-$$[D\">&G(1IZ<A)F+F<'&'/\">O.3^X\\(QF_8'9Y@2(23A&.GKR#\nMZ7@:9\"Q\\H>J\"B(IO;GG<J3OH4Q0%NZ-M3ERXCYWU*WS-&U;]!2-.P:6A7BAI\nMB*US?&$I&^>BKM$XO'UC:#X.:)NW=)\"J4*S;'3['VQY<I=OK,1@L\\=CC7V1U\nM=9D[+ESPI&(:@E>#E_E9N[(L6#U\\TE-<PLL_1<[WC2[S-]:O\\`O;>UP?&SK3\nM#HN3#FM9PI',LC)+Z4T39-9E.^ORR5G!O\\JW^9=N@Q<DCQ`;X?#QLYX5Z`I_\nMX:R+IT'\\C9&XDI6593_P7N1T^PO,)B/N.+G,N1-)@`&B>_$J1;16SS]4+#;U\nM)\\>&QU57^;QJ07<``WQ_Z2ZWJ\"_\\S[_J@656EU).GKV+9YYXF)O7;W#_O7?R\nMW#//L!U.A9\\?,#7PY[0$9W#9C*6UX^QMW23+9S6OZC_E8W[GYA[]]9>YO]/C\nMGNZ`<YT^'6\"[+'@AF_)\\-N7Y8LIX7K<:Z'3Z'#IRBKPH_.6UH>LGH<X1;?3&\nM;2=E=>T0_\\O?_S[^]O?_(T[?=1_Y9,2???<]6%/+#<RYG*BCJ+':9]4C+;QH\nM@)I7<4WU.0G#%]'EK.U3<2M<I:'D6*-\\R]<<YN;ZF+0SX/.??Y3O^9Z_R\"./\nM/<WC6YL>_JZ$>\",ULDIB,\\MF#%:.T)F-&>]NUF0#%6&,\\IELPF=GDQ9SI)KA\nMJ_63M.EJ+*X>9K\"PRG0Z\\>Z[NAW,6-2Y,-/@[UE5X-#:\">Y_S05^[J%?\\?!X\nM)V%M<<`W/;@<L32$?=AV14F*;B!K<AES<$5P8#]B?UNWJ;B55_^*ZHKO^(:C\nMK*T-.'7'W5QZZ27^W4_\\-`_<=Q?'3IVF##24BG#L7*U1%N1VG(>BQ;)TZ\"3#\nMI34/&-(6K(IN/=I'<!,C+\"T?YNB9\"Z2=(>/)7BUM)`@VL#IJ09.0EG3[/>Z[\nM_V[NO^]>/OG)3[)RY!C9>)>_^,YS#'M16BINGNX=,>;%LT9L6E^SUBCXFTCD\nM]U8Q8I]+.I!EUNBNQE=`M:>]2*SA+WWS\"8X=/TEOL,2-:U<Y>?(H7_E57\\'A\nM8\\=15X81+%>KPF@`QPS@\"G_5<EYX[']Q[10+*T<8+AZBTQV0))W:.\")\"DG3H\nM]`8L+*VQO':2M9-W83I=QJ-=BF**K?1>K???SI7^-)B@GAQV\\.M?_P:^YZ_]\nM)7[N9WZ)V6S&<'&!.X[W>,=;%D)@-NW9?HGT96EW,UL&NA5W_Y;!>HZ?TZ*X\nM[B.A[S^=HLT)^J:W'.+>\\PO<<=_][(VG_/JO_0;GSYWDC6]^$[W!L!Y\\T4B$\nMRJ??VJA_J>\\7%]DD*),9.KT%%@Z=8.G(:5:/G&/UR#F6#Y^B-USQ%Q`ZQVQO\nM)^AC!*W7RKTYKR!#D(73,B00I>/,F?,,!P/^WP_]?UQ\\X3F.GCR+I>3O_I5[\nML&@3%S1>5!.Q.6R3HI;:9$MBVO2DV^N^NOVP+K(?_M9;U-JZ_XVL\"#_PW7?Q\nM=VY,V+[C`H\\_\\20F[?!U7_>GF,TR/OU[O\\ML.@NWE=\"(KVBE@.\"\"43R3PB>\\\nM7L!P-AU%Q9(?';#&9S3J'\":Q:.DBV04?B(UI+BO4,*:,PMDSYQD.%KAX\\1)7\nM+K_,RMI1>MT>W_NN<]QQ/#E`&W>^&&9.(B)*95VLI_NEI*_QT9']KJG]7R0'\nMH6WW%)-C3ZQU^9O?>8%S%^YA^=`)'OW\"%WCFF6=XQY]^&]_PCF^FV^L&N;=&\nM>$M5*5WAF1_&^B%V_\"XSUC\";[J&E'SI)TRYIVD$1W^X,M8++RSJ3T=+5\"F25\nM.K(_(3X^G3US!\\.E9;)LRK7KE[%IE]6CAWG'6]9X]]L.-Z(PE-'$K0GL<-I\\\nMV%B71*/KH5T0`:YN/[[=G'5C@/C2H(,Y3LV+Z5P+6VMILTJ?]:L?6.(O?^L9\nM?CS+>.Q38W[]H[]!-^WRV@?N86MS@R\\^]C@;&^M!SBT2V\\+7%M:8,*-MR;(9\nM:9J&&0Q'&804K3$DQE#DN>\\.5I=!.1>F_N>UJ'R\">.>%U]#K=)EF$ZY>?84B\nM*[CPVGOXVM>O\\3]^Y_EP:7E9SS_,JT`W,!`'>Y!*9JB^T6P_+7]_95WYLBJ3\nMF.N@M6%<W5_WU;\"\\JZ4DJGFX=WWM4:[>G.'RM_\"%S_QG?OF7/\\+]%R_QY[_C\nMS]'O#7GBB2>X=ODEG&LD)ZJ/6SJ'&$-1%A@C@0&BM=_W<R.^E5DUHJQ-?+_<\nMIM$4DT<)U#E6EE<Y=?H.K+%,IA.N7KU(7CCNOO\\!WOKZ0_SMOW`.C/IK]7)I\nM%-ZJ2R'KX^_FJ$4:,3MNVU6[#?I:6RSB4VK[NHV#*9EAXE,U<E7>&*7SR@.%\nM*M_]CB,8*<$*CSW\\*1[Y[&<9[>X!\"8N+2RQ<>`U7K[[$]I;G1%57F!FQ7@W,\nM6%Q9^C-GC!=>U(J'JY1E'DY'0EGXD^%<@0G#*$YSNMT.IT_?P?+2(<JR9+2[\nMP>7++V,[/>Y]X'5\\XYL7^:OO/DE1YDRFD%JOUF1LZ'E7VB35%7$UM&T:BJ=&\nMJ&NDU.V7UNWK62<'A]VPX$[:`48;85V93V,C\\4`-PNFN=%Y;SSFRHB0K2F99\nMP=O?,$#<41+SE3SYR*,\\__13]`9##A\\^0:?;X_B),ZP=/L[&S6ML;_NA1S5^\nMX4M7^O&N())8O6^E'6LJK*@L_;W5P3461<[\"<(&U(\\<Y=.@PHLIL.N;FQDUN\nMK%]C]=`1[K[O/OZ[MRSP=6]88FMKCUXOI9?F=!-+:GR3R\":\"Q2))J'N#[Y?6\nM0*?.`:.N*9\"K+IUY-1A<YER;QO=KT58:J`;?75!!5E??BE.6CJ(L*4I'EA?,\nM<L<TR]D;S]@933E[J.2=;^[33=_$\"T<.\\]P3CW+IXM,LKZRQLKQ&VDDX<OP4\nM1XZ?9'MKD[W='?;V=NH[1EU(.4W5_4)QI>*<^LQ)H,@S!H,A\"PN+'#UZDDZG\nMB^+(IE/&>[M<OWZ9K\"PY=>XN[KUPDK?<.6-M8+AR75E>Z+/0*QGV+&6:T.VD\nM=+L)2N+A(X(8C%'$E#5@T\\;?XAL6W?XB^7801[W#YIV_BXL\\;3^^&I<*<*]S\nM2NF4LE2*PI$7RC3+&8\\S1J,I.]MCMG8FD(UXW;$)'58XM/J-O/#,DUR[?(F=\nM[746%E88+BW3[?196EQF>6D%$<-T.F8R'5/F><\",RG`@%&,3.IT.G;1+K]]G\nMN+B\"M>%J:.<83\\>,1CML;MX@F^6L'3G&_>?/L=H=<=1>8G=[R+HM&[4#YQ!-\nM$><GE2012&Q]\\94QU>TNT;VK^U`&B6`/MR]9N(TA#K\"7SJLJ5II_7ERQOC8S\nMZE]XQIZW7^D<1:%D>>&_LIS9-&,V+9A.9@R+FTQ+Q]T7SG'BS#DN/?<T&S>N\nMLKV[2;?79SA89-!;($E3;&)97EIMC<HBXK7#C>\\1V'!B\\[(@SPKV)F/V]G:8\nM[.U1.,?RRAIWW'6:;II1;#Y!MI`R3A?H]U(FTY3!-&?6S<E22YY8RM10&L49\nM12TXJSAQX?*\"YI)$:8&?VMZSHG^`8!T5`LJ<N&+%8=;]U7<-(DN;W>83L.;*\nM91MFIZVU7F`W,22)(4DM'9DRVGP:EPGGSIW@S!UWLW'S&C>N7F%K:X,M=Q-C\nM+6G:)4D2TD[7OX9-`\\RA#6>J*\"B*C#R;4>1^=KK3&W#TU!D6%@:XZ3:[5Q^E\nMZ!B6EGITTH0TS-,EB24QAB1P-*SX*WDD\\==$DUHDM4%B6FJ]PAI-$)EKCQY`\nMK3E@YB&Y=9.AT25JKB,XF%Q3W9XH=6X>=J@:G(4TL723A++C*'HE1>$H2^^Z\nMJM-433/9G3$[6R\\PSI1^=YF[[[D;M5UVM[<8[6ZSN[7%=#IE.IE4=_7N&RFP\nMQI*D*8NK:RPM+M-;&*#9F+W-:VQN/$N_E[+0[[\"TV&-E><\"AY2&'5A9871FP\nMLCA@:=AC8=!AT+7T!H9N/R%-$Y+$8*W/U(RI-FJS[1OME/\"-H\\W2BVGZ[M5<\nM4WRJ-+JS=/XROL@153F_EY\\.%R^9YBXY(PDFB*LGUM))$OK=E'Z_PW#896&A\nMQ\\K*D-65/;9VQFSOC-D931GM3=G;>8[9K\"!)^AQ97>;DB2.DG06<\\:IHGCSG\nM80P_\\6,1<;A\\QFQW@_'VR^QLC$G3A&$OX<CR\"HO#+HM#;X3EI0$KRP-6EP8L\nM+_19'O987.BP.$@8=(7^(*$WZ)!V$]*N/\\F)L5[],N8$,%_7Q=#&?'F@7P*=\nMYD`&S7X=[A;^+MI<_2'-G1$BUK/XQ)$8SW7JI,$`LRY+BWT.K0X9C6?LC6?L\nM[DW8W?,&V!G-V-N;,1K/F(PSQM,9TVE&EM\\@GURE+%T=I[3*[-1S9L0(76M8\nM&%A.+\"_2ZQZBWTOI]SH,!QT6%[HL#+HL+O19'/997.BQ,.PR['88]%+ZW81>\nM%[JID*:6M&=(4L&F%I/8,*D53W.8!O-J@:6N$>Z=YZ_>GNG79$(2Q>>XD2C[\nM7)C$#-&HM^1!+X,?1+>)8!-(2^BYE.&@XU/;HB3+<V9YP726,9OE3&8YTUG)\nM9)HSG>9,9SFS6<9LYH-]7OBTN\"Q*#V]078`2[OU)C\">&)99.Q_K4LY/2[23T\nMNQUZO0[]GJ77M?2Z77K=#MU.0L<:4BMT$D@2#2?88#H2.I_&QPL373D=7X@;\nM'XL6\\.;FJ*OZ*@5=A%%HJRFDD2)]F_S7EJ^6EBZ@5I\"X-9C0M?,ZV[XAY/#\"\nMYJ66E.KKCM+Y!<Y+0^'\\7$51.(J\\H\"Q*\"N=5]DOG<\"%=UB#KV8SR^;M^K#7!\nM*%[F(;'15T+XV_K'X>.4<0YK%$FK\"\\^#J(FE^9MFL)T#LWK7+(F[G:MYM1/1\nMGB%MC8/)G-9?+%,]_V1_S4N$WB;-O:7A-PJU3^H+,EQ=G3L3I'R<HJ5GV6F0\nM_Z\\,J2TM\\W#9E$23030+:=0$?^YG-DQ]N9]$+'D7YC7*<!U;U=.1YI)R83_,\nM7)&0G;8KX6I!W+Q/_Q*RIEB!3&[--;Z%D6]%+FBX1+42634,(3'-,[J%Q*9-\nM;Z-2IM<R2I'U@-\\G0D\"-1I!_H$\"6$9POKLU0T0!;)]'8564AD:8U$!L@OMX>\nMC:!R:<^3$!.[XYAQVV\"M;0TFO8TQY%5/7&CT:#,Q*K147%K#\\B+-)5+Q='ZM\nMT19IX54IH(EVF%K:\\[1SF8L1]ET;'#/P-`;CJDNCM-W:=,REH`<M0L0!,[&W\nM<)$1]=5'MV))B?W0][PU]-5A7FF+:S5P_+R>1_RX>-Y@KFL8OTZ<%L:G1>8^\nMFXF8=W7L=&WF!0I%V5;T#'&A9025N?AKHL5U^V646BU2LS^[.@A]5=VO]'!@\nM,7@01[DE;]F^?%2CRP6;4S'W@5NG.AZJC#*1%H<TKF+=`52L1EC>GQ[U[DF\"\nMJZLU\\<)\"EE&\"8ZM-&#&XJ\\6K4&G1?4.=!TY5U3\\SM)6W;@MQS!^P]D5/6E]G\nM3#0;K0?$AP.LJ?OA]@.Y:J$EVE`3YXZR:VM>(.SO)TN<!4;3.LSU\">HGEN$]\nM=3]*ZN3@G1=?/![/;&ET7%P<6VA(!>67`'$TK2'=SX=5O4WA-[_3Y],PW3]G\nMH;>(_)$X5F.PN9O>JT6.@Z;,G;#X<]=R/LJ^8;=PUYSO`,DM\\_V&(%%M;MU/\nMC*R(R)6K:EV'XVK&^6T-(1%=1N+BH6E`S,],'J@L=Q!%J@4DWNH(']1[;=4X\nM!RWT04^7`_XV4=8R3Z*NY'LT,H3,;<:#IZ1:*(/&*Q3>JRS;0_#M`N/@5FF\\\nMH:454W1?/)!*8/966:Q(.PR+S/G,R,^*S`4D0W-)PP&!N47DXN`I)XWN9!:)\nMB&':W-*GT?O9*IZ:1M9'XTMQXY.M!\\\\4:I0=:4E]]W+<YU%]]7Z$1+M$]W64\nMW+[&A;1XK]K6[9BKN/=G$[<Z1C(OMKT?W]_'6)B/#=%SY[.;BINZ3V_$S5%A\nMHH#4<F>N?3):OT,E`1&NUL3M/_#R:@0SFG&OUF+IG$/2`]&_6V0M6M_,HA(9\nM^E5=F3;#@/7[NCDZXWQL<7,_<W/*.:Y-$FZ]7RP;&ET,6T,982RWXKO.7_T3\nM)Q7.A6#L]J/6<G`<36[%+U/FY#>8&Q`ZT!@'^?O8/4E+[^G`(OR@<>,XY9U7\nM@&D%[OE3<T`&5Q5U54:FT0:K1!GKWF(URQ!<C(2!E`-0@X8U$2F$3L.O```#\nMXTE$051>*K?H4W])!5U,#M!6DB`MKZ3MJ:W;1FRI618UR,.M*MRY@9F6K0]P\nM/2Y:?(D**W%1BGN`6XQ?2.?&;JOGN6A1B;(N7+M*=U)=OM%.;%JI<+1I8OF@\nMVTZ52E3KZ`&U@\\1IG+93U_GIN_H6$6&?N*/>8@2`>,;,W:+?&\\,D$6R@H290\nMV1]46ZX\\VLENCH=4I;NU9,,\\OC2'5KOHO=6U>PVM6*1U$)=7QYINA68<\\\"'T\nM`/`IW@'U)=_4]SX<%*AJP*Q.-4U45$>.4N>M-]<CKOE#,C>>K/,.]T\"%F)8Q\nMXVQ)I=T.J`9.)$I%711+:*X,W?>ZMW#E!]]GK=1$7B4F,&NSTW3_+I[O'VOD\nMV^?C[KY@V3J1&N7E<B`XOR_#:DWD5*=B+M-I(1)N+BAJLYC5C'2]KNW[,YKT\nM-_Q_X5HWK>P[Q57ZVHIIKZK7=,`DTGSVI*W6W0'9JNP/V?8`,7>)_7HT]FKF\nM^PSS,QOSU^L<D*VY:+Z-,+=VT/-J0\\1JQBYR6;$A7?,X$V5:98R/:03GS\\4F\nM/9@X\\\"HL#FW2Z(-Z&;(?%=2Y&\"Q!,5+B(.L.VLW[]0&9OQEX'B:)A<[E()>I\nMMYYAF*_0]]4*!X!N&G%<JS1:HBY=57QJ>7#VJ+=@4]Z.A*R!O1VW8^=[TK(/\nM]VGB@D1\"L[6:<OQ@C56]B)3G)9I5CK>X.^\"T54HOINDES.OJ:=UB\"^ZDC#YO\nM5\"L09T?A<Y0E+<G*ZFIDF3^5L7'GX9.H0]<J*N5+2%^UT5E\"JDODJ0508N&'\nM-OK4U-FUTG&XZ]E?]!P^G''-XN\"O)0YJ)7-^-9[DMU'W:SX^F6;Q8I$JG>M1\nM.!HLR472%E6!5P=:TQ[1=4$!O];/B.\"7*AV?=YL:=>-J`H=$1:*\\2HS8-U(M\nM[083.C<#$>E[5T%9YBK?>>VG^>&6.C\\G0EKG/F@LB[VO\"S9W&N(TM,6V:U%,\nM@AW*R'='<:@R>A'5%_'U#-%]0=$3V]!\\*_F9`R#%?`D2$'H`CZE:<(WH-G.0\nML+2:.RVX]8!\"C/VSVR('O*_<HLL5[\\P0`$O=SRJ)6[%&HP#NVHM;^?XR@C#B\nM?C6V@;MC*8RXB),#^B)Q45@59Y4;OAW$<?'RYLN?>?3B(YCN;:K=6.1/#BA4\nMI7TESCR^(@>!?M+N[1+%C5:](%&]$':5TZ!87S1-^>IOB8*C,*=9..<&7=D8\nM,PQ1^M>M3G9XW4J*NHHS57!VNK]>B--OB>*5R[AX=>?E@YQ1`O2`SH%]O\"__\nM^6_]I]I-&3`%BH3V-%[Q94/\\D1JB#C!)E$CG-(KC7S;$'[XAJEEA=U`I]&4#\n:_/$8A/\\?I!DER%`9I.,`````245.1*Y\"8((`\n`\nend\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/doc_lib.png.uue",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nbegin 644 doc_lib.png\nMB5!.1PT*&@H````-24A$4@```&(```\"`\"`8```#P*;R'`````7-21T(`KLX<\nMZ0````9B2T=$`/\\`_P#_H+VGDP````EP2%ES```+$P``\"Q,!`)J<&`````=T\nM24U%!]H!&@H@-UT;#]D``\"``241!5'C:[7UYO)U5=?:S]G[/N3>Y&<D,(0F$\nM42)3$!%:P5(!AZ\\5<:RHE2JV5>M4V^_SLPY56JMVL-@*^K/`5[54E$%4)@64\nM``IA3!AE2$)((&2\\N;GWGG/>O=;WQUY[>-_SWAO;.OUA?K\\+R;WW3'OMO=:S\nMGO6LM8'?_/G-G]_\\^<V?7[L_E/^CN^D[%_+.N\\\\UA0$9\"Q!!C(`,08P%#`$P\nM_HL(0@00`8+T?1@`@#`#`@@,\"`(1!XCS/Q,'(@;@`#`@#/\\D`K\"#B(#``#'`\nMG'X,@?B_`,(08;!C\"#N@UX5TQL&=+J33`7=ZD%X7S\"7`(F!YIC.\\^^N=<L9G\nM#WG7]Y_]M39$N?6:\"]VN>\\^%$(3\\3TD7B$1_70@@HS\\W^DB_/$0$V`+B'Y@>\nMSPQ(\"8A`7.G_[L0;)KP#QQ#G`&8U'(<E]X_C\\*OB_RUJ:/:/8]<#RBZD[(%[\nM/4C9\\]\\O>V`NP3T'Z3H!RQ86N;PT<[Y^P!]]>]6OBR'\"2N+<<\\_%A1=>2/#K\nM#$/^AP(#(0.V!F+(?UGHZ0B[TR^\\&(.XM\\5O=&&!ZZ7%0=F#ZY5@+G41!5(*\nM(%!C`R($$0()P;\\A`AG_\"R(\"B9L\"(\"$88V&*-F`'0-2\"+0H8:T'&@*R%H0+&\nM%J!606)I`</]\\0#M^,&NZ]__ZV6(<\\\\]%U_ZTI>\\+Z+Z.8E.P^][\\CN1PJ[W\nMYP7\"QB]H3T!.0*Z$E%VXSAC0ZT!Z'4C9@7`)<F$7.XASD-)_Q:=GOP%8`,<`\nM\"T'$>!<%47>FQB#_A@T13%$`K1:$\"L`.`*:`,07(%B!3P!@+(@-+AGJ=;GOW\nMNI^<M./:]ZS^=3H1!*`%@LU]O8#4+0F,Z+H30,1@8=VYQN]0$?URD+(++KM`\nMIP-TQL&N\"S@'Z3F(ZT'``$NR,`D8!`>\"@P&3/X5B+()S]'')`!*^*-\\A/OP(\nM_.FP!<A8&&H!7`\"P(+)`.\"7&@BS!E3V,/'7/RFW7_>J-8<X[[SQ<?OGE!H#5\nM[>5W9G+S(!!(PDX4[_(%$-'X$<^-@W`/+\"7@'$C8FY,8,)(])\\,8P)CPBL:_\nM$B/&(/^+!%@#\"ON%PH/\\%Q'%,TN&8`S!&`,J\"I`Q@-7%)Z.?P;LZT<\\E('#9\nM0V_GNL.W7O>^7ZDQS/KUZ[%UZ]:TY@``UD5&VGGQ[P82=Z31Q?/!FAW[W0[G\nM?0PQQ)BTT`:`30$^+:K&'$,0\\@M/X3$@OZB&HG&$\"$+B;:9V`TDTE(\\9+9C\"\nMPA16$:#Q!B$#0^2?WP#,#IWA'5/=SB=6;KO^`ZM_'5R3(1&0<-SM+'Z=&13]\nM-(O?42P\"D1(,A@,#7*IS\\>%:2'Q@5Z#E%YD@,(`U$&.\\5R%)@5_=G@8)OX/9\nMA\">(&R#L9@F!'*0G2_P\"4P%C6S\"M-JBP_LL:D/6_+Y(>)P#*\\3%T]^R&C&Y:\nMN?VF#ZW^E:*FA!0C8%6G$^*%!0=#A%@@#!$/1TF<0EH!D<3%H8)`5G>^M<GW\nM!^A+B$:`0C8Q-9003@:EX.QWM-'30157109`84`M\"],J8(H\"IN7C@S'^_8CU\nMCV,6N-)A?-<.$`ED?-/*[3?_\\HUA<I<D`)@(3`:,\\$7)*$**X1T$#($#PBD@\nMQ9]A9XK_'L&`R.KIL-']B/IY(.SX<'J\\(3V6#4F>0%C!`/)%)W^RPJF`_W[\\\nM4K=&+0MJ%Z\"6!5H65(3XX=VBB$/9ZV!TQS:T!H>`\\<TK=]SXRS6&J<)4DWVE\nM$\"Q\"2,`E!%U)R9X:@+(\\44(@C8'5!TV$W\"#;S=[EP,<5XPTH1B!6(*0&#R<0\nMWN7%F`$U;-Q2V1LQ!K\"%#]BV!;(MB+&@=@O4,HH+0FP\"]FQ]%L70--@I0Y#N\nMYI4[?HDGP_0GVL%W!V@1%E07*8$6]5H^'D1(+V']%9[\"Z>[6Y[$9/#;6&\\R(\nM_XI!E!\"]8D&`I0CHXN*#`-@(L2.VR))0P*,H8UL^AVBU8`;:(.OS\"V.,MYL^\nMUG7'(8Y1#$Y#,3@$&=^\\<L=-?[[Z5Q,C@@<.F6WT^>D$A%/@-U/PW;H\\AOP7\nM*4IRGB\\*SYQAUAA'`M8\"J4%\"6A]B!^GCK$VN+!P!,A#R!A&IG6T\"\"`:6?.Y@\nMK(4MVJ\"B%?\\MUNH)`Q@.O=$1M*9.03$XA-;@$*3[S\"\\E9E0-0137(,1%0U!C\nM)!AO+\"EN1\\3NQA\"H,#\"6_,\\IN\"!*)T57*OXLK)RA>!J9*'%,E-Y7^LH(QPAS\nM#4#60^7X>TBN+P9Z?Y1-<)-&(:WQFTX`E)U1F'8;=G``=F`0MCT%,O;TRN%[\nM+[C0C3ZWY!=EB*)J\"/7WN:N2\\/V<^HA^*[&O>@((\\(0>L<;6<,8$+))\\GEI'\nM$)Z;JB`J-TC8,A)<4GI?$4&1/P=*<\"FIR/IRP7`$$J-&L!JWR/];&=W>V`AL\nM>Q#D/%DINAZ]S3\\Z=T]W]SPW^MS[[-1Y&W[!AM`/ISM5(C[GR'JFPY^HZV@?\nM\"<;Q%$;DIT3=%@G(P:,GC0U*7?F@&5Y>78JWL<18)4SIC1KR1D0R$(']=]A`\nMF$\"LBYEEY60M(\";R3X'N!_F/V=L]`IA!F#:C4,HWA*=RV_UGCCQP\"7X1QBB:\nMV#T2Z$Y-<%1JA@C'@X21L7^579P0ET2BT$!0PGDW*)Y>YSQB,E5B.Q%YZ!J3\nM-]WA@6.2<)+\"J6#OZJQ:E!,2)AB(81\\?C\"9Y9#7>>+?6'=D-4!LH?)PIO-?S\nM=15K4>ZX_\\P]#_[\\C5%4/9-$5I5$(I?DZ>>\\/I'05,RW)`=8RL9\"8$02`F-`\nMK($)A)_2'B&&D,`G6N(7.N8B1K-A2:]+6J,(9+T(*[@PB*MO%'&QQ-\\C\\6Y)\nMC+HG:SR%0CY/ZG4Z>GH&@!;[\\`4#L/X>\".6V^\\_<\\W,^&44_:LIR`A%DGB'1\nM`]%`'!<G$7!(\"$8($,Y0L)J1;/3?@>.+SQ.*4BSJ;K+3@3R0*]7!4HDME4A/\nM!K\"Z$0P#S@\"B,<D$#LM3+J1)(G<[^E@+T\"!@K<_*`<#8N!'*'3]?8Q1]GDE0\nM2=3B9PO%FL0`QK\\%KQ)X3<D63R@$4#U2(C&^2.:#4G`F=7?Z7))`=?#7P4-2\nM?(WL&UGV'7P260)8?V92['=YEJZ)'7.IL9+]\\I`2AB`49ER!A'_><ON]9XX\\\nM(#\\78]1B!&6+A2P^4\"@9:P\"72,3%WQ6ERDE`H6*70YYPB@QI`)6(LA(@,['&\nMC2H,2(L>_LXI<8\\50O&GC200B5\"W5+4<!=BJ>5`.B[G7U3>DN]_\"GPQ]7\"$*\nM(K2NWMUV[YDC:R^\"&]WR/CMU_H:?&VJJ@$9)-6.B]`T*+IY3CA!<#\\6`3C'_\nMC<]JQ.-Z0_D+YIED/!7(8'2@5\"0C`!.OE3$`E%D_O#$VR6I9Z37L<O_/Q%VQ\nM<_J$-LMSC*_X:>PTPK#L`'8H'*/WW#UGCJU;_%`YO/'?BQF+'_Z?!^N0S3$G\nMR!HK:9+5C4+\")LEKD\"*8#.('PCJ(\"210\"D%\\@-P.FA.0(-*O%-P`U6JVDCQ1\nM^+[QV3;%H&9BIBYLE%Y/L84,@6QN&(H0.OJOF\",!,$6D5XP`A9YP7R0CC#UY\nM]8?=V-8EY?#&\\_X[QN@+UC$#!3S1IKL@@27-;.-)3WL^N@E)](20\\6A,,]U0\nM`V(3D%'R\\\\224>%!AJ,Q)I\".'`I7^KYT(250+9)<*U&AKK*,IT^J6:,W0*@Y\nMA3S#9,>4-+Z0`%1X5]4\"#`DL>4-$.=*S=YPM`O2&-Y[7^B\\:H]\\U&=U)K!0\"\nM:0[!HL$:RN^D8.@13L9%Q072$T6<J(=8UC%)GJ,(3&J>1H22#]><0R*\\YL02\nM4T)7,9!']T0ITACK)3NU=,B0+[.2Z*F@!'>KORL^=A1M@!@63E&;*`(TZ&ZY\nMXVP0T!M^ZKS6C/T?_F\\:PKNF/$>C4.(DHS(D-5#NDPD0OU5]E8Y8Y3\"!`C&>\nMA+4>FK(B,*^^4)?&&OA)4IT\\^[N`?-R-1E28K(8RN@%2]4[BI@$9W5A:E8OU\nMBY0@AJ(3`=BV]@YT'-`M?>8_-&A2!1$`&8MBH/`\\G/40V`X,>E$\"\"7I;?GSV\nM*(#_BIOJ.Q&1RU$7)<$M2?;68_7=9/C51F04$&L(H**H*2V?/PD2M5$2L^G(\nM=HMH!344I33DAYS#V`H8BOE-\"&42S!$87!^T26OBH?H8ZMD@`U*%XX8?7H'A\nM,<;PF,#U!#.'K*I6O.LV18'VM.EH#4[!P-!4#`P-87!H\".UV\"T7+PA8M=)_Y\nM\\=E$A'+WQO.*Z7LW1C_%D=4E4'$U89<:5+(LD1B0*</IWJ7Y^\"\"44`R)S<C%\nM0,:)UB\\DB0ES@!`67(S6N!5!L;HKEIP9]!2]454(00WNLV.H=)2,U;_[[!K6\nM>%&:M2!;8+#HHE<`HP[8NL?!L09F`(9*T(X.\"@.T\"D*K`-H%8=K0(*;/G($I\nM,V>C/7T&7/?&LT48Y?!3YQ5[<5-]P;K?40?\"3M.!B\"ZE0M`:B+HGSH0`!L0<\nMY9H23I3JF+S/YT@B4B;M)/A%%V&EN]7=9`6@8\"2*^T%J!#$I-:[Y#0K`,LA9\nMD&&_Z+%.48!M`5.T8(L6!HH2KNTICI8J1%F\"8D5U)@182R@*H&T-7+>+T6U;\nMT=FY'>VA:9BRSUQT1ZX^VW4[Z`UO.*\\U8\\G#/QM\\50U23-`BI-1LEQ+,C\"E`\nM%K!!E10L$DA&R3E?'TB+QJC1$6`E@(./LAXA1?E-C%J)I0V5P!`TE6JG4#<*\nM.RBD$T;+IL9%,9JQ+9C\"P10]V%9;-;B\"*=1%81F#3N!4U1(16?`;AF\"--XC_\nMNS]MKNQA;/L6]$9'4(Y?>;:PF]081;.XDB(H38D5Q?1>D#+LY$(X_B[%>G?*\nMTE(559^?_6I*Y@HY_BU_C$'@W6+>$A+TC&8Q!A4H&:M:(HG0,NQS#:WVD26O\nMC;5>Z6%;+4BO!+=+I4,,C.FAS0QFUO<G&<5\"J4RNO%54$I+_._>ZZ([LQO`C\nMWSN[F+;PI^6>9[]4#\"UX9G*N21#UI5(QB-%%\"R<DI=<^N*J\\7@OYT%TMD,2:\nMQH6D&$/\\[TMT+41)Y@GD<#ES/T'AH8%9LDU#L=@4:/SDE@(<][B#0(6%<06,\nM[4&*`H9;H%8+=E\"`@E\"2A7$M<*OT)R1L(^'(U%:9H83*?`K@3PL9+TGMCN[!\nM]GLO>>?8]G6ML1T;_WK*[,6]R;FFF/)2I*8I\\\\G$7M>4+R2,#QYD3%P49D\\_\nMD[HC9`>:,KAC-\"#GR2%G1&!,)*-<G&O`(M$BL?B7L8)D;(QA#!6L:<Z`PBL\"\nMN2QA6RTP#WAH;*W77O4<./1U:!X5WQ?R`EI&X^2:&,JU6(#K]>9M>>\":8YY8\nMMV7%AO7K[UFR=.E$AI!$`[\"BH.`33068I#J=`$:2@BY2#N\"4E<;B78I!HO2%\nM`<!9`2HJS3.:(Q%:+NFKP\"\"C]0Y.*#KJ<:-'-2I0</Y#%`JSG<IT;`'3:@%$\nM:!'!&0OJ^J`M`P[\"I=\\$9<TC5)9-XF81#J^=&4H\"&>Q:,V<.G7+;7;>_Y>*;\nM/OC(^O7K1Y>J,8H^>L.8;-,%VB#CFY#!EA\"<%:>''2.2(H541``YT4<0L\"]N\nM)CX[HPN3TPFP-F2;$G:W%K)(R=U0S)(<^85ZA=&D$0$^JVJ<!=0:!$S/^W88\nMV!:#RU)K[`+GRE@I#'$!^EI:C8\\R5&+V?1]A$TNN$&,8HJ&CEK:/ON6.ZXYY\nMW_O<;>O7KY>E2Y?V9]8A\\Y3*KJJF^I33T9DV#)%7RX0W)-E#\\^/+,>F*UI)<\nMITU]&$(@8%T,B&!D3P>W_.1)?.V*>[#RR/WPAE>NP,)Y,R+YZ-^/Q/Q'R*DQ\nM2-6'`A@&965K$$$<@XH6#/M,WW!V8H.H$1PY.#&DW6&LG4]J\"-;*(7+#``OG\nM#!U[V/+Y+_^K?[_BQ_/FS7/-\\#5R8AE$5>Q',4'R.XV1=D>J7\"#R/['C+6J0\nM$$5G%5&(5`O>52I(XP9[^%R6@AMO>Q27?><^7'GM&HR.]B`07'[-6OS59Z_'\nM[[QH.<YZ^0J\\^F7/Q]2I+0AKS0'*$ZD[(@#4,U[`1CU8YX&&,0Y<>*65.\"]P\nM$\"<:=%W<2AXD<GS;3.3?H_.]?;X;BD'BXXPX@3AOQ7;;S!B8.G4!`/O<<\\_Q\nM^O7KI78B3-5-A`4RI+5>SMR,B6+CF#`9'Q,H\"\\W^P^<(0]%,3JA)YGTH3RK]\nM7_:,=G''O1MPY;5K\\*WOW8^MV_=@X?SI...4P_#\"8Q9CSJPIV#D\\CAMO?1RW\nMKEZ/[]_Z./[B;Z[!&2\\Y%&>_^A@<=^1^F#4T1;&QS9HL`>&6?]_6P)0EQ!0J\nMJA9P2^-)6PM!!IXA%MV4[%)ESZMQP*7OA`J2'F$'PPPQ#+9E3%PAL`\"**ZZX\nMPLV;-\\\\UJ#BH$HR]]351RERV2-(PAV/*F4:)(!#6>C5LR@NLQ#A>11L*.]7O\nMECV'&U8]BN]\\_T'<>>\\&//SX%DP=;.-5IS\\?1QZV\".N>WH['UV_%^1?=ACFS\nMIV+'SC$<NV)?G//Z%V#A_&FX??4&7'W#0[C\\FK4X:-D<O.C8I3CCY$/PLI,/\nMAB$OS:`\",#!@!Y`RY>BQ5W_:5(?W)UQ=*3,,9_D)&#`%\",:[35/XMC5Q0.D@\nM)4&,[Q6Q3&#6$T*11Z()$CI.VJT0:((^-?/GDG/VVCOAU1Z4PC39^/U8!^?4\nMBI6<F_=Y8YTN[KQW(RZ_9@VNN&8-MFS=C87SIN/XHY?B[6\\\\`=9:7''M_;CA\nMED?PHF.7XLVO/@XO>=%R#`Q:/+=]-RZ]ZCY<<>U:/+%^.TY^T8'X[$=>@<U;\nM=N.VU>OPS>^MP27?O`OSY@SA=:\\X$J]^Z>$XZO`%&&AI`M;RM0B'T@O/K(GU\nM\"!;V76V`4C;>!5&FK\"`J0,)@Y[P!V;<R\"!S$,9A*A?2*2#U-T&P(\"OLSXL$0\nM/ZD*<5$KK^5%Y?3<'L%$J8N*!B1C;]7L:Q]^!I=>=3=^L.JG>.!1WP)]PC%+\nM\\.%WGPH0<.N=Z_\"Y\"V_&@KG3\\4=O.`&GG'`0YN\\SA.MO>03O_N@5>/2)Y[!L\nM\\6R\\YA5'XCL7G8-'GG@.5UW_`#[]+S=ARI063ERY%&>><02>W;H'7[W\\;OS+\nM_[L=%W[])SCF>?OBC!<?A+><>106S1L\"#,-2\"^)<(BV-P)H61'S03BF129\\Q\nM-KY86&/`5`*E1`_OJ[4%Q#D8ROM.TK+WDWY!JBXU`A\"9-%\\R=5V,NHS8@T,$\nMUJ(2B4<Z@4(&@)&Q#NZX=P-N7[T>U][\\,.ZZ_RGL,VLJ3CAV*4YZP0'8?]^9\nM>'S=-OS+);?BH&5S<<*Q2_'1]Y\\&@'#;G>OPJ?.OPU77K<7(:\"?&EOL?VHRK\nMKG\\`TX;:..OE1^*4$Y?CG#><@`U/[\\#W5SV*B[ZQ&J-C/;SQ]X^&)<+FYW;C\nM@4>>P6>^=`O^]HL_PLDO7(:7O?@@G/R\"93CX@-D8,/XS<>#:\"\"#T?'$)QHNK\nM@T\"N1DU8;0<0<A\"7*KFYSS'63BZG29JEC.$,1%M`0X9JZO&4\"'*`LJ%^[;P,\nMDIGQTR>?PU<O7XWK?_@('GST&1A#./+P??'YOSX3SC%NO?-)7'7=6BR:/P-O\nM/FLEWOOV%V/ZT`\"N_^&C>/_'KL2=]SV%G<-CS82Q(K>1/5U<<MEJ7'+9:LR:\nM,06GG'@07O][1^&#[SP9CS[^'+YWXT/XVM7W8=K4-EY\\_#*\\]:QCL>;AS;CJ\nM^P_A![<]@>E#`SCF\\(5X_<N/P*M^YT#L,VO(&X)=*JV&BIQ2LB8F;UX<P5J?\nM#_(=H[0*H*7G4BN/$[*OFN$FC2EB03]VZ$1Q0*9)B@4@!5`41,>,)Y_:BBNN\nM68-O7'T/[GM@$P#@B,,6XKS__0K,GSL-]ZYY&A_][#58.'\\&7O/*H_\")#YV!\nMN;.'<.5U:_#A3W\\/U]ST,-@Q',M_61FQ<W@,5UZ[!E==MP:S9TW%[Y^V`J\\^\nMX_GXV/M/PXVK?HIO7[\\6'_G[ZW'PLKGX\\W?^-N;-&L*U-S^\"J[[_,'YXYSI\\\nMZ#-M_-[)R_'JTP[%2X[?'S.GM<#!I00`:4AU=EHK\"?2/\"1+/P)`X&.U08O)D\nMX^3UB)SBSMC8V#P2F]*]*Q+14Q`0J0@>6[<--]_V&\"ZY[\">XZ_ZG`!$\\[Y\"%\nM>/<YOXTCG[<OGEBW%>=_Y4>8.6,*?ON%RW'3-]^-J5/:N..>=?C@QZ_\"CW[R\nM!$;'NE6I[?_PS_8=H[CX&W?@DLONQ,)YT_&F5ZW$VU[W0GSZ+U^&5:N?P&7?\nM78.[UV[\"X<OGX3-_>1IV[!K#JCO7X;NKGL\"EUSV,!?M,Q6M..Q2O/O5@K%RQ\nM$%,&BZ0VU#(`B99^U5&+)<!I:=:2GS.2A^G):M94&3Y`J+#O(ID,4ZMKQO_^\nMQDT[<>F5=^&R;]^#N]=LA#6$(PY=A(]]X'0LG#<==Z_9B&]<?0]NNO6G./-E\nM1^('WW@W#EPZ![V>PR67W8'5]VV`8_$[]_05L(;@G#^AK$9GS4P#E`XLMX]I\nMU\"<=+4M6#BR3CJIUGWAJ&_[YHELP:\\8@_OA-+\\1%GWL](,!-MS^&_[SZ7EQQ\nM_8,XX:C%^*MWGHAVJ\\`/?KP.7_KF??C\"?]R-V3,&\\<:7'X[7G7$87KAB$0J3\nMJ)?@62)U9JSW&%%#1?K>S22NB7T6+\";+LN(P&`U.H;@#PH9-._'#VQ[#OUY\\\nM\"]8\\M`G=GL.2_6;C76][,8X_9@D>>W(K+KKT#JS?N!TL@F.?OQA''+H(:Q]Y\nM!G_QJ6^C*#SV#E\"@*$Q<J!Y\\L874%SH155LD#JS=2@FHB*#7<R@*F_BQ`4*W\nMY]!NV=BF%8Q*Y/O\"NSV'S__;K6`6E!E'=/R1B_&#VY_$];<^CJ$I;;SRY.7X\nMEX^\\%!LV[\\;-=V[`Q5>NQ1?_\\UXL7C`=Y[QJ!4X[<1F..G0>6KHI`IML(&\"K\nMO8.BS3-&*EKA!M=$L4,_U@2,5%C9)#(3?/[+-^/\\K_P(S(*!@0)__J>GXI4O\nM/0+SYTS#@X\\\\@X.6S<4G_OQEZ)4E>CT':TW2LQ)@K8&PQ,)\\LKK`&._KNMT2\nM16$C*1FY)B790O\\\\2THD61E0HYI.4CZ,66!5/L/,<,Z/&?(]^?Y[1A-4%L%9\nM9QP&R_YW_,D4O/2$97CG:X_&_8\\^B[_]\\H^QZIZG\\8D+;L/G+KD3]WWSK5BR\nM<'J@T3+:GST<#G%63)]O:J[026I:H;H(*,[G`-[XJI6X](J[,3;N^9XO7GP+\nM_O6B6S)\\K7FIN@?'`FLHG0*%A8XE*_Q4-,?Q.3C3*QD5ISGF9!06.,>PUK>1\nM(6;I58:_6D.HO%P?6D^]&?T:Y]#59-0[O/[TP[!DT?0DR)5<51]<N$117;4S\nMJTD-3GE%EOI+'I(\"^#'/7XQ55[\\/W9Z+?KAT#@3\"GM$N?KKN.73&/9_?+BQ$\nM!%;_SPP,#E@,#K2P>-_9,,;K3D4$=]^_$8.#12I#J!%;A?74CO5;?.X^TS!]\nMVA00@)(=]HQVL6O7&'K.58QHU26%F&,,8<[L:1@<*&!U<4?'NGANV[\"Z:(>V\nMI5C;$.=/K2&@U;*8-WLJC,U&33G&80?LXY,U=3]!TB.I\\R?EO2J\"WJO`C***\nM1C6C%3DV1Q1EC<4!2^9D!O*OMV/G&$Y][1>P]N%-L;80*]!$<*QR%_WV.]YT\nM(O[IK\\^\"-81/?^$&?.+OK_'<?@BTR/7`_D090UB^=\"ZN_]J?8/&^LP`2_-V_\nMWHB/?>X:SX+6VGX)J+BT.;.GXGL7OQW''K$8-]W^&-[VH6_@V:V[XVN&_Z=^\nM2RT-$.&,DP[`E>>?A4)I$._2$*$KUT\\7TA@,2.BZG2Q84RHYYH5ZR2CN>)Q%\nM*I1'\"IK`5=>MP0./;(Z&^<`[?P?_Z[0CT\"HLRI+1ZSE\\^>NWXQO?OAL0X))O\nM_`3G_,&).';%?OCF=^_UKDICR'5?>R>*@M`K&88(%_S[;;CLZOL@+'ALW7.X\nMZX&GL'CQ3)0EXQ\\NO\"D:8<'<:;CLBV_%T%`+C@7B@&MN>@@?_\\?K0.0WR_D7\nMK\\)%GWL#/OG/-V#+MA'UWX(K+W@3]IT_%:[G];A$P#]_]0Y\\[3MKP\"RX[K8G\nM\\=6KU^)M9Z[07FYMX`QJ0XHUK\"1N(*06-$C?3*S:B=#),F)B92)H32.0H@S8\nMLO1KTP`\\_[!%*`J#;M=A8,#BU!<?@M7W;<!7O[4:`ZT\"CAG'/G])K#4L6C`3\nMBQ;-@@`X_IBE6//0)@\"$@Y?-Q0N.7H*/__VUN..>#6BW+0X_>$%TXK-G3L'R\nM)7.\\4$$$^\\R:BAT[1V$L,&?V$)YWV$)\\X.-78M.681\"`XX]>`JM(303X[1<<\nM\"!'@>8<LP*UWK0,1,&6@C1-7+L'?_NO-6/O(%CC'F#M[*HXZ9%X\\%0\"P?+_9\nM2LEQ?S4P9-)4I?9SI$23&D([,?WA,JCU]\"(7OTA>CR2J!/N51RW!M[[R1_C:\nMMU;C%:<>@>..W!\\77+P*<_>9%LN-4Z:T\\'_?=SK6;]R./SWGQ5@T?SK`@G_X\nM^%F8/6LJ-CZ]`^]]^\\E8^_!FW/_09A2%@7.\"V3.GX\"/O?2GN>W`3_OC-)^&(\nM0Q8\"$+2*`E=\\Y>WXJ\\]\\%^/=$A]]_^FX[:YU>'+C#@`^D/_XG@TX_Y.OQJH[\nMG\\\"+CEF*M[[V.)!AG/>ATS'8MKC[@4UXVUDK,3Y>XLXUF^!*O\\A//SN,`Q?/\nMP&<^^!+<<-N3>,7)R_%;QRQ.NR\\T]`O56L-#?D%)BAJD_)/\"5S*>6U?U5I2V\nM2/Y`Z5<$9D6>H-%XT7$'X#O7/X`KKUV#;U^_!E,&6Q@<:$41PK-;AK'YV5UX\nMQ>^NP'%'[J^#&0E#4]LX8/\\YV/#4=OSCEVZ&J#\\G]>U/;-@.$<%ARQ?@)2<=\nM[&OEZAH/.W@!EB^;B\\U;AO&%BVZ!,83%BV9Z\\9?V4__XG@T8'&CAS:\\Y#JU6\nM`6.`?68/X3UO^RW\\[1=NQ*J[UN/V>];CD&5SM\"3J-\\ZVG>/8.=S!A]_Q6SCI\nMV,7ZL3F#=RZ)'$QH#(7.',G04]0LT=Z\"M8DR.LH8\\91')%\\78TI.A:C!ID\\;\nMQ`??=2INNN5111/>4O/F#*';<W!.,'_>)@5?'```&I9)1$%4-*PX?%]M@=;@\nM2(37O/)H[+_?;#R]>:?'\\!\"T6A8SIP^BL`:=;HF37G\"@A[^F\"OO>^_:7X+X'\nM-^+I9W8D=T#`/K.FHMMUZ)4.QQ^]!%.G#BA@\\.]YT?P9^-.WG(2[UFSTM'WI\nM)30SAPJT\"H.AJ6TLF#.$@_>?[97M1L7589Q;6\"Q)?>!DO?(]B1Y,UH-\">^NA\nM,UDPZ0\\J2.Q*I4,JU\\'ZV2<&(R,=O/-#EU8>_;K?.P9/K-^*3M?A#:\\Z%B>?\nM>'\"2I\"A9-F>?(7SM6W?BTBOOCH_;9_94K#AD(18MF(&GGQG&62\\_JN^]&2+L\nMNV`&_O)3=^$_KKJK\\K,3CUN&W2,=#(^,X[JO_XFGJC/]UI0I`]BT91CG_I]O\nM5AZWXJ#YF#]G*@[<;Q9>^]+#<>3RN?[S<\\X^<)ZH1$)0=$);[.N(<A_Z&?HC\nMXAR'D(QQM=E=2Z3Q^Y7'4A*E:B[1]X*%A7.\"5F'BSR6**TV$B#MWC6$BI7JO\nMYZK=C7EK'8\"=PZ.-5/G`0`MVK(OQ3JG^.W]UPO!(I_%Q(D\"KL!@?[V7Q0#+Y\nM\"FJMKEFSO6;45!.S8M(\\`K4CH\\E':L^M:FG2L),::ZLG8_?(>\",36CK&E,$6\nMQCN]U\"RB#82D\"O#M.T?[6LI*E:GT2M?PK!)4LXT+6ECEM008[_3RM%W5)H(]\nM8]U*^W\">9CL6=+IE<D7Y:2\"J=NU7Q$-2;V/*))H33:?)T[]LR@NRAK^*N#AK\nMG:KJX?U_=^P::U@O+T2PUL/;2EMQH,F$,#I>D8;\"6O+<%.`7))J0DF!!W\\K.\nM7?TGPB@IY9@QWG'9E.#4K3HVUNNCWH,GZ3G&GDZ)Q'/G)4RI[L`HS?32:F(=\nMU$*).JG#5]._4#5*65)]KLEH<5JQJ4ZO$0\"[&JIIQAA-V`CCXV4&D9.QC3'8\nMLZ?;WV09I`9.4JM5WA&J\"O'=>_I/1*NP>I+(&S(J!Y5N(,+H6#F!G-(SAZ-=\nM!MFB,G-*YRC%/NW*=#XUM-&2,6GF[??MI.RK0:U3O6GI(W<BN<HCRB13ZVV3\nM:R+CB301P7C7^VI1A!9%;98P-M[MFS)0ECXV]$I7F6@6^J5%//FW9[3?$,XQ\nM>HJ:NKV>NG&I]\"F6O7Z7%^8#B@#;=W4@U`(LQZ!<44)0M8\"<RT6-]I;$<46T\nMMXZAG(^,QTQJ$#6U=4DFJ:F,J19@K.9>`*#=\\NKLLF2_L,C4'Y'<%8R/5]V$\nMKR?XG5\\ZKHV62UQ2UW'CZSK'?J@7J0O*+:!RT4ZGUU`5])^ITW/8/=I5=7DK\nM%W?U,=/9W(S4Q&-RG93L)8\\0J<IE*MV\"V:\"L_'5R72Q56]@[W?X=YEC4`/!L\nM*++\\1!\\]WBTU#E2A*6N_7%ERLD,F3\"3X!6LRA*>L?:Y2]CC1WFH$$C2^W\\`J\nM.R<8&>WJ?,&B%K!1\"\\B('52U+AVMWIF?H6.H8@>IJ+N!-#V&^BQ;G1!`1!X5\nMU5\"(J+S&Z,[.ISKXGQ-V[!I#MVX([4`-Z\"GV*-1<4Z=7-M:Z0V4.@*?M&979\nMXO[[9?_C],DZW1(C8]UL:K,%V`(HHY@@JPCEXQ=2')3^R1>3N\":NQG#)W!15\nM9?.-0K/LWV/C_0(`8P*Z(93.I1AMDQ''.V6_:B-#;<S5DY2_?OTD)4.DXE*O\nMYQ+J$8D]V,,-05XR1F'WGHY'B<9W%8$-4%(2[DI&8X1-';)WDPV6-]A;9EV7\nMQR>I/E`;GY\"9M4H\")FN,C?<O2J]D;4\\C.,=IIK>Z/P+0ZS8%3:5QK$%9.J48\nM<E[2+T:OYQH-8;5F[;5/'65LTY.+\"$8;$E\"HGK=TC-'1;G6\\G36`%(`+M\\50\nMGS=)\"*HV(!*3P5=J.`DPE3&>H6]-4*FX:*&#\\C0&8V/=9O2EG+U76:`V=`O8\nMOG-/PT(FI-$K736^9'*?T?'FUS2&8BO5^%B9[703<Y\"1!K25@KV'Q7[HO#94\nMZ#3^T.U:TZ\"F3\\108V5%MLE*I;EJHPF%(1\\S5T<+69H=W&)SL.;H*LK296T`\nMR:>.=_MCBS$F'E;G!\"SDY[F&F\"4\\R:[VAC3ZI(XY2T(3&MR]I]OLTK0>OF>\\\nMEU\"C^&L:P#5`$X)/:\"=F`<@EKQ]_#WLQ!`1]E&;=R%2?4D`Y?Q9_-MX((SWR\nM:K4L>B5KX$[=242$/:IIK<<=3W'XP-OK,=JM0@%$`B>[AL<G-`09C]K&.KVT\nMEED2NF>B$T%`R8S1L5YU])%DO)$)N055451@#2PEAC8T4TR<65,DJ]\"`*O).\nMZ3Y#509F&;`3S^DTN\"6CABA+CBXF)5>\"'3L;*(K0Y:JREI@=4S49'6[(YO.=\nM+2(8[W03U8`TR7FX(0$-B)Z=8#2XVCA4Q>JD,U-;IRR[UB&.<9:W(30L8@.@\nM#9+QAH855+I&:_0D>:@7QOHX3>B:R)$P*;E7^AD7U78YPJY=S=2((:-Y\"*>@\nM'%4E/O#OVCW>&.B[&H^Z/8>=^:G)NI-V[1[O>Z^E8[\"RQ>.!:]+)R]4!4\":K\nMYV3_UF&_839@DUMJ-D0]4VHFABL5.<0.KP3=]NP9Q\\Y=H]6-HJXIB,0<,\\H>\nM(PV_\"A\"T_R19:U`Z!W8<L7WDQ?(LMN%3B@#3A@9@C?$EUY+[W*VH2$X:/F[@\nMLYSC+&DU&7S6P%T4'DG%A<^Z)$V\\^J41\\A>-[*O)78TT)PFQC;P\";N-_QSN]\nMOGH$D3=$T*_ZND)J%PMC0!NE]R+JQC0IZ[J4[6>71DV41Y2EBV[1N\\PJ9=TK\nM,6%\\\"\"'35Q8MK,F@J0O3_;-<POB.HBH[*^F$Y/*.9OBJ'Y2MAVC1U\\D$U3K)\nMV/PJ9C;H[P&(DDEU0>/C/2]U(:G,_&9&8XQ@D9C][LYK#DF(A;+G&@^S8Q_H\nM.]TR32FC=\"ND$X?M.T:;?8#6,5@$VW;N23L[C,((F7:(`2T#M/VE(?ZRD*QJ\nM56%J)XT1_;M?FOIN,8$GT`TZUBG[@C6S8,I@.Y-(^J\\PK2PW9U,>,-@N,-`N\nM]&1QM275]]AB>'B\\D>*8/C3H(:S1`A'K5#.B2&],R%$9$P<OCHQU,I!@@*+E\nMIQF$J<N%[U!%R\\(/<C+>,#:+(?G5/A-GUEE=(AL9%$]+?@-77@R)S>B(XN&<\nM+PI\"@_%.#\\[YG=LK'<JRK)1@/>PM&TNL+/[_!,+H:-<KU,$)VI!@R[:1*KJ.\nMCS<H\"NNUMTYKSMI2P\"(^XY^`_P^YCC6$W6,=;4?0#\\6ZA.P2U5&_<8!<AD(Y\nMS3B<E&N2NB)`:JQJ76R0*\\E3;!D=ZU;\\M:CPMMTJ=&/XX%>6_4GDCEW-+B*4\nM2$4-7<WQ?2?^\\.Y.XW):8[2Y4I/*/&Z20;?+?2<I\\74Z<\\08C[BLJ:X/<FJ(\nMJW4)42K$J,]E\\L-\\)HT1TH0\\:E?456XN:?!7:NFQL=)3&`UU@0!'F27-_I.4\nM2N]HHCALN#_._YJ'KT'BGJXS:W(O`-!J%=&]E,P@FS/+C)++\"80#$HM#UA)V\nMC8QG`,&D'*(RPM14H2WY*]G2);\"FSS69\"8B9:O=I[8H3HKH1,N.Q[\\'K*(-:\nM/T?M=E'9H=7`[(V\\8^>>?D)7^:#`WO:\"2_/4K4\\BX36RC<#;>`%!<$4<K]'Q\nMSU$Z:8R0K/)_D'_/P[O',]:VSCQ0!FW#]3/YT:M>-3TY?#7]=:$\\#E2/(37N\nMHK)TF#8T@#][^^]DB@M\"JRAPW%'+</2*)9@[9QI.>\\D*;5Y)1A@>'L=IIZS`\nMX0<O2N/9+.&`_>?`.<%^BV9A^;)YV'?A+(QU2DP9:,7,?'S<X?13CL\"^\"V?\"\nMJ6C96)_%G_B\"`[%S>`Q;MXY@T8(98$>PE(I=TX8&\\*$_.356^EBG;.XS<PCS\nMYTV#<XR3CCL`RY?-]7T843:?*I2UY$-/@:H`':=):O'VXTGK$4TNB1I<$34F\nM/P!PPX\\>PI_]WTNU7X)16!/[K+][PWUP0<EA#+Y^^8]QQPT?B53,&]YQ`1Y[\nM<HOO:U#5(<4IQPJ6!;CTRM4X_93GX?.??'WLJ3OG_9?@G@<VQL^8C[2[<=6C\nMZ)7.=PU9@](QWO;Z%X)`>.;98?S!NR_!UNTC\\><4VL0$.N'2$W__<=7=^*>/\nMGHDS3CE,QQ#FHV2DX82$,K#DUPK\\C,%:&L@^044,UAPF!&/C)>Y=LQ&O><5*\nMI:L9`P,M^---,-:`A5&6[!M%K,'M=SR&DXX_&#?<]\"\">=^A^6''X8A@2/SHJ\nM7B#NJ1'G&*X4#`RT,-`NL/:AS5AQZ+ZX_:['<>#2>5B\\:#98?&(W=<H`F!F=\nM;@EC?+W<L\\(EMFX?B7=<?'_5(SCNJ\"6)\\]23DBIV_E.'<:.//+X%OWO2(2C:\nM)KO:+=^PBN2<9$Q%WGBR-Z6?<)76S8L:3?(WU,4+A.%=8Q@<;,%:@U[I/`,K\nM!-,R:+6LGQ;)#%=XU;ECP?8=8^AU!9N?W05#A'9A_4A6D[1*HK>Z6]/63)DQ\nMWNEBQ^X1L''8^,P.=+IE+,4.M`OT>B6*PF!@H$!A+8SQ`@%K+)[9,HQ=N\\8Q\nM?5H;3V[8#E=*]+A&+Y/ME0SG'`IK_&@')0TW/;L+VW:.8L&\\:=5![I4LWU2S\nM=\\ZH$?PL\\#6.B<B-0/V+CK1`@=YG%AQ[VB>Q9>ON/B`U6<_T]&F#>-<YI^+O\nMSO]NE<B--$Y:A\"`\"\"&_DPG]?A?^\\\\!WXPS^[.%(GWK5XMQ@TKL9092JE`+C_\nMP4V8/V<:OO.#!V*QRLM!;39[*O7M!=`@(OC2?]R.F_[S/3CJ\\/W\\%:',?0V?\nM\\=Z,,,F&38T>GTS[FLL'\\[L%I.%0J)6=<]C\\[\"XP\"RZ]X%PXQVBU6C#P\"CEK\nMM&].!*U6`=8^9&MLG$HV-*6-EYUZ)+CT%(4I,A6C7N+D=&%]OYUO7(08+)P_\nM$S=<]C[EHQC=;HF!@59<W$A3D._=+JS!P(\"%)4++$O[T#U\\<%SX8PCG`L?.8\nMGQB.>[%'M\"P](S!K^B\"V;1_![!D#GG^BE,_T$U:<W6AF]B:G058_EA@8J[57\nMZ0L.ZS9NPQEO^\">,CG5C-T[8@<YQW$TA'Y!X8T!5#&!-4F-$J(JDW@@\"M:HR\nM-`5D84Q()N>G(@V'ETK^RIPZ08W\":\\JT`:%U@\"74-[RLYYI_>SL.73ZONHE!\nMM8HG34HF-<AI).'<P!A*];J-G%/O=$H(`R\\\\YD!TL\\)]:`2TUL\"I>-C3%)+:\nM;UF\\^]#?\";W5+O0^$\\'EY53=&*R(*_3:!6,;0_&4^@Y6WSOM7T=@-=C'MEW-\nM#4KGO!2T]+W@5H4)E=8T3F*Z>EB8-M0&.P=;%.FB=,E8U[S0IE-O)J]9U^XW\nM\"3*3&&`D#=8E`,\\^-XRWO.<KV+)MMTX%,-$`0=5A3/5&+M(%\"X5\\5FU3\\/_]\nM'(]$J;[$Z]DHZIQL5'G[)GE1Y;=D3?/(%C4\\CR'OXDJ48&98*Q%N._9CIH,;\nM@VC-6_N[C?%7#P9:_1T?_A86+YR!+W_Z==4K=V+^E4^>E,:<KN^*S+H0(5P.\nM6'='(IZ*WKQE%T94#R22W<28R?;#0DMV\"HQ)-Y_DAJLK%_+O2ZX?(C]NCC.#\nMUYE>:ZAOGG>@PW-E!VM>$UN'P\\!<-3#'L:)IO*E5HY.>JJ6+9_OB4/Q`^35Q\nM=0X*>XD146)86WC*X1?AB?7/XHL7WP3'C...6H9NMZPL9N1F=\"$H=&.JIQL=\nMZZ'=MEK\\]X\\K(P>EVB;G-*OV6R?T-P0#6VLP-M[320,FQH-VR^KEMU1I`PC\"\nM[9!8AMWL=.YWX+*L)71Z)08'6OY*96/0[70]6K,Z=D[K&47+CZ9H63\\7Y/R+\nM?X17G?Y\\[+]H5HV5\"+0'9Y5%[,T0#?:2BJ8&3Z[?BG_Z\\O>!2C!O<')Y,*W<\nM0]?_>S_+2*!\\WFQ#W\\Q_>ZS01(^-J\"T;6[&WQQQZX'QOB)KFM1X3]I+0)=E\"\nMF%M!V3L*+F[9_G/Q)V\\Y!9U.+XH`*%N6\\#1!3\"#:`-GME3Y89A1)G6$G2JXL\nMC`72J^L2!\"Y,?/X0J\"ES,Q7`$.=\\2/QW1%F2*I>!A(RGB#U7%>B8,!J#C(&Q\nM)C:PAQ,<XLBB>;,4ON:#U6O2FH:*6H&).8ZTXZE:.3MHV7R<_ZDW3;@%*5=W\nM4W87D3Z79*.G8SMLKGXSHA*4FM\"-J2H2Z*/#3+I5,;\"CC@$I?3Y07X38FN8'\nM7`&J.6('N![`)=#*\"O_6`K90PD[KTIZ>S<:/9@L>&^)K+#7G@P`G<DU96(BC\nM7J4V:9'JD+?Q5C]U.9(5K7S]P.1'-9\\7GBOO*!/TAL6M#,BB:O^>D302-2\"4\nM7&>4]5ZDOH]0+@W5-J/W[ID$0RM`1FHZUHP_JN_A\"K513P]D;WD$FKN%A!H)\nMP'0;;$Y\\!15<Y:;`:D9)M1)87^TI-Z;)+N.H(X[\\\"N=Z`E6[&C.-.U,TGLTD\nMS\\=EAWZ/,.]-:@(%U#BE8%17%]KIYHD\"!:Z*\\6K99S&92!CYJ<BO%$-5,]I0\nM\\*Y(^)';JW9%2/^0D(Q>R356%3B8G2*I*TPRHV6WP%>X,R'`9*)@R=Y#K\"F+\nM=T6`OQO;2%6YP5*5`B+7TG(EWE;=$ZJ4>',>D8Y/A5O-\\+MDO?!U\"KQ/4)\"N\nM2JG(2>+=1,94%8KYB0O7=<9^YH87KQ=CZG.E\\HY89VJGV*!RRV^XN#`L7/[>\nM(C^3382N=TI5^+CLLA&>S-7L[42@811*W'C2[P(J]R:CKXDHW.:;.FAJL29W\nM3X&'S@OT(@VQB6LMM;4/7+D(FR:@>K*3$*]2-M6%#M@X;RZIW)DJ:60W2S43\nMSF7YH.;2\\MZ\"M4Q$4\\ED\\:0V\"ZX.`/)I-SG=3OEMO-G1,-FE=,[5.!JJAZ9J\nM_*\":RR+4KNY!]37U>AZT%\"M7%B\\+Z\"+5CJ`<B9D&=UU!4*C%C$F#M51?7\"8Q\nM!NWUQ,49&U1'1Y5F^CQHYKL@6P\"8JKMAJ:DG*H$H(2G4`_-DQS_WW8J:,H%!\nM\\CHY!*4)E'=9FQ:RZ6]2FT8PL<\",*I]OXK2W0=<S8>HJ52.8!O?4M_NDBH;R\nMJF'^/#DLI+H6*S=*V+B9V\"M.+\\F&P92N6N`Q>KEX;H30NE\"1X4N#KJGN&K,W\nM+7MA7[-KJ_LAJTQB!]1\\:.WR4<DN%ZR>B(GB2]Y4F2&1BO_/KSOF?MU#-EC>\nM]VB*3]Q(?-(6`ZXNI,L`CLV*/,+57<S4'P>B!Z$)E,Q(&??/5!B2/OZS$I@D\nM7F>,:G;<%Q\\:K\"D-BG*90\"3BLNN7ZT>949EYT2C_R1-$R;IU4*L3Q`<Z?4WI\nM9TF9FG=>O3`1RZ-<T7FA<F&6?C;W,U`<J30D_7I8D4D2OPD02M^;K25%34\\8\nMYS=E7'H=M81%EGH^4NO*D2S(<CV[39>H@Z6J.6K`^Y7$4O24];&8III#L%(A\nMK+++<!G49(:@K\"N4\\N0AD]A(S5O1WJJ!>;]W(!(G.L)U^KT\"1QN@\\D1A2JCA\nM_R9#+:@UHE/J<S!4I5_[.J>`OC8%0JUI)ES[Q=I1*LD8U02CN51*-09\"^O*%\nM=\"Q)I%E!+5415:*JJ>8S,S]+?1E=NL,'#8$9-2B,NG@Z@ZNAY,LFD8J1>LU>\nMSZ(ZHRK/W%GZ^;`FD\"\\9.A*7U!UYG:?>O=MX(K)=(GT5)>XK7%!%?29]DS$K\nML_[ZT,1$QRB'SOE0JKH'D_Z30K4CFO-6R((EU3X@44UO9+(R9]V=<?5D5#Y#\nM8'Y#$WQ_FUA3)TW1*&NBVF))S2%)(_LW`6J1>#.+4$-2-Z$KDS25(+XN5R%A\nM7VRI36T.=QKEDI;HHNKO5XF[?\"J9Y$.R-,DC[D>1E6L\\0QRH<TQ-.=3>#(%J\nM=M^?(6,\"8S3Y^]P]99>+HS$);T!:5&T:K&S,VD@>J9^:!@07LW7NG[H>Q*Y1\nM=A%:=]7%D-8JFB8,1\"&9I$W3]]FHYEXG3>@DW:\\K4@$)U3$3^37*>XO8E&8`\nM&JKQ0!/'ZK[LGAI<#^>\"@BRQ(LX@;A.%3@T9;^[G*1N<DKFG<#KRV@A3N'RC\nM\"FQ(^IM6P@ECV8NN\"56F(5Y\\*JB-&*4:$UH]/C&-HZQ*1PU##6B\"71-_D2>H\nM]U(BX_(AAF$T@U!_4*VX\\FPG<TV'))1<C'`#OU1CJSE[;>%JK8%JA3,-XK1W\nMKFDB-J/A34@#^53A;4S6/Z\\#HQK[MY4PBU`S:Y21S%%*W7KU<=B<XH+4F4Y3\nM,XII?A]U%\\,9<1>KA29C#[+XP5E<(.EW12(3NO+FH2A!8J@W:24!LU1[FVN[\nMF.IT2>;;ZW&W+UA63J3TLZ43!A.JW)^:C.7ZD4Z%D>!:4)2TF*%'.JYKK<YA\nM\\G@D0!E4]-1\\BI.:HEK>G3Q&5',HZ1N$(I6Q#XV^G?K5XV1KL2'?77F&3/'B\nMMEH!'=492!4TUX#6HO(Z\\%2F^7'1$%GV*YGX0')#<OH]DR$ME_-CDHF-:[%)\nMFH4#>U%Q2(+13;4,ZF<%I1:#28L\\E`=9;MK-306<&LU0ITDF&J=`$^%[U%JM\nMZK5OJ35S2D.2QE48G5U5$)-/<<WH,:]]TUX-$0;2LFJ`\\E8YJ?5&4(.!)%YM\nMCSQ(&U.UIN13O9`)=REQ3!6&E1M.FZ!R[VH>5)FK@H5000OW548*G*I!/:]A\nM.Y>]=J#':X6I\"O50\"]14&YQ5GURS5_BJ`W>#SH@S)40U:ZC.WLBYV#CPT&3J\nM\"1=*COG=%-IW;!H:Q:/K,X#8K/I5CT\\F+1Z'Q:XVP<=-'[BD,-\\;68(7`ZU!\nMUJ:DA)W+YF=D]$N\\KJ;F-B6KQD4!!V5)(NTE1E\"]WDS5`A,DUQ=$`^0U!JI/\nMM^%Z$D+]`2GX8T/5$X-:_8$:J!.IG88<AE;4=KGMPGUH+O/=61P*1B_SF>BF\nM2JN$\"<CY8\"NID9E2^UX^:&NO(R\"D0<<4QT]G<IL:)4R5XDZ%;FV<1MFGMR1J\nM>%V:H,J5[TP-@$[Z524F<R%&L@#.U<4-OM]E%`9E9\"%LHKOS41AY$D<-=9$\\\nM*0S)&9G&<DW%$.LW[=AXUYKU]\\,,3)+M3J\"LH*8Z<P._0DVD'U5KN\\CB1B5?\nMH\"Q?T%W%*BS@,A7EP__KRI&\\.%.'I.R2,0TE^CHD?B&Y\"X.S0IP)P9FE/U^H\nMB!6R>,5=K']F>&.3(02`_,T%-_[CWUQPX^>QMSZCW_SYG_Z1JD_SAL@K%65C\nM0?4W?WY1AHC&*#(@W4,2D_[&$+]X0VCZGV56YYY[;IYC_N;KE_=%NO;X_VKQ\n27/I1+%$``````$E%3D2N0F\"\"\n`\nend\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/documentation.cook",
    "content": "/*\n * srecord - manipulate eprom load files\n * Copyright (C) 1998-2001, 2003, 2006-2008, 2010-2013 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nall = [all] documentation;\n\nman_src = [match_mask man/man%1/%2.%1 [source_files]];\n\ndocumentation:\n    [fromto man/man%1/%2.%1 man/cat%1/%2.%1 [man_src] ]\n    etc/reference.pdf\n    ;\n\nhtml-documentation: [html-documentation];\n\nhtml-documentation =\n    [fromto man/man%1/%2.%1 archive/man/man%1/%2.html [man_src] ]\n    archive/man/index.html\n    ;\n\n/* Sigh */\ncascade etc/srecord.html = etc/version.so(exists);\n\nman/cat%1/%2.%1: man/man%1/%2.%1\n    etc/groff.sh\n{\n    function if_quiet Generate;\n\n    sh [resolve etc/groff.sh]\n        [addprefix \"-I\" [search_list]]\n        -Tascii -t -P-c -man\n        [resolve man/man%1/%2.%1]\n    > [target];\n}\n\narchive/man/man%1/%2.html: man/man%1/%2.%1: etc/groff.sh\n    set shallow\n{\n    function if_quiet Groff;\n\n    sh [resolve etc/groff.sh]\n        [addprefix \"-I\" [search_list]]\n        -Thtml -t -man\n        -P-I%2_\n        [resolve man/man%1/%2.%1]\n    > [target];\n\n    local images = [wildcard %2_*.png];\n    if [count [images]] then\n        mv [images] archive/man/man%1/.;\n}\n\nman/man%1/%2.%1.d: man/man%1/%2.%1\n    set no-cascade\n{\n    function if_quiet Depends;\n    [c_incl] -nc -ns -api -nrec\n        --lang\\=roff\n        [addprefix \"-I\" [search_list]]\n        [resolve man/man%1/%2.%1]\n        -prefix \"'cascade man/man%1/%2.%1 ='\"\n        -suffix \"';'\"\n        [addprefix \"-rlp=\" [search_list]]\n        -o [target];\n}\n\nman/man%1/%2.so.d: man/man%1/%2.so\n    set no-cascade\n{\n    function if_quiet Depends;\n    [c_incl] -nc -ns -api -nrec\n        --lang\\=roff\n        [addprefix \"-I\" [search_list]]\n        [resolve man/man%1/%2.so]\n        -prefix \"'cascade man/man%1/%2.so ='\"\n        -suffix \"';'\"\n        [addprefix \"-rlp=\" [search_list]]\n        -o [target];\n}\n\netc/%.so.d: etc/%.so\n    set no-cascade\n{\n    function if_quiet Depends;\n    [c_incl] -nc -ns -api -nrec\n        --lang\\=roff\n        [addprefix \"-I\" [search_list]]\n        [resolve etc/%.so]\n        -prefix \"'cascade etc/%.so ='\"\n        -suffix \"';'\"\n        [addprefix \"-rlp=\" [search_list]]\n        -o [target];\n}\n\n#include-cooked [addsuffix \".d\" [match_mask etc/%.man [source_files]]]\n#include-cooked [addsuffix \".d\" [match_mask man/man%1/%2.%1 [source_files]]]\n#include-cooked [addsuffix \".d\" [match_mask man/%0%.so [source_files]]]\n\netc/%.pdf: etc/%.man etc/page-list.awk\n    etc/groff.sh\n{\n    function if_quiet Groff;\n\n    sh [resolve etc/groff.sh]\n        [addprefix \"-I\" [search_list]]\n        -t -man\n        [resolve etc/%.man]\n        > %.ps.tmp;\n    psselect -p`awk -f [resolve etc/page-list.awk] %.ps.tmp`\n        ['if' [quiet] 'then' -q ]\n        %.ps.tmp > %.ps;\n    rm %.ps.tmp\n        set silent;\n    ps2pdf %.ps [target];\n    rm %.ps\n        set silent;\n}\n\ncascade etc/reference.man = etc/ref-index.so etc/ref-parts.so;\n\netc/ref-index.so: [match_mask man/man%1/%2.%1 [source_files]]\n        etc/ref-ptx1.awk etc/ref-ptx.ignore etc/ref-ptx2.awk\n{\n    function if_quiet Generate;\n\n    [awk] -f [resolve etc/ref-ptx1.awk]\n        [resolve [match_mask man/man%1/%2.%1 [source_files]]]\n    | ptx -O -r -w1000 -i[resolve etc/ref-ptx.ignore]\n    | sort -t'\\'\"\\'' -f -d +5 -6 +3 -4\n    | [awk] -F'\\'\"\\'' -f [resolve etc/ref-ptx2.awk]\n    > [target];\n}\n\netc/ref-parts.so: [match_mask man/man%1/%2.%1 [source_files]]\n        etc/ref-ptx.sh\n{\n    function if_quiet Generate;\n\n    sh -f [resolve etc/ref-ptx.sh]\n        [match_mask man/man%1/%2.%1 [source_files]]\n        > [target];\n}\n\n#if [count [match_mask etc/new.%.so [source_files]]]\netc/new.so: : etc/new.sh [match_mask etc/new.%.so [source_files]]\n{\n    function if_quiet Generate;\n\n    sh [resolve etc/new.sh] -r [match_mask etc/new.%.so [need]] > [target];\n}\n#include-cooked-nowarn etc/new.so.d\n#endif\n\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/download.html",
    "content": ".\\\"\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 2003, 2006-2011, 2013, 2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ad l\n.hy 0\n.so etc/version.so\n.nf\n<html>\n<head>\n<link rel=\"icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<link rel=\"shortcut icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<title>SRecord \\*(v)</title></head>\n<body bgcolor=white><h1>\n<img src=\"srecord-64.png\" align=left>\n<img src=\"srecord-64.png\" align=right>\n<center>SRecord \\*(v)<br>\nFiles for Download\n</center></h1>\nThere are several ways you can obtain the software,\nas either source code or pre-compiled binaries.\n<br clear=\"all\" />\n<p>\n<table>\n\n<tr>\n    <td valign=\"top\" align=\"center\" >\n    <img src=\"srecord-64.png\" alt=\"[*]\" />\n    </td>\n    <td valign=\"top\" >\n        <h2> The Master Sources </h2>\n        The following files are available for download from this web site:\n        <p>\n        <table>\n        <tr>\n        <th>File Name</th>\n        <th>Description</th>\n        </tr>\n        <tr>\n        <td valign=\"top\" nowrap>\n        <a href=\"srecord-\\*(v).README\"><tt>srecord-\\*(v).README</tt></a></td>\n        <td valign=\"top\" >\n        The <tt>README</tt> file from the tar distribution.</td>\n        </tr>\n        <tr>\n        <td valign=\"top\" nowrap>\n        <a href=\"change_log.txt\"><tt>change_log.txt</tt></a></td>\n        <td valign=\"top\">\n        The release notes describing the changes in this version.</td>\n        </tr>\n        <tr>\n        <td valign=\"top\" nowrap>\n        <a href=\"srecord-\\*(v).lsm\"><tt>srecord-\\*(v).lsm</tt></a></td>\n        <td valign=\"top\">\n        Brief description in\n        <a href=\"ftp://sunsite.unc.edu/pub/Linux/LSM-TEMPLATE\">LSM</a>\n        format.</td>\n        </tr>\n        <tr>\n        <td valign=\"top\" nowrap>\n        <a href=\"srecord-\\*(v).spec\"><tt>srecord-\\*(v).spec</tt></a></td>\n        <td valign=\"top\">\n        RedHat package manager specification file (<a\n        href=\"http://www.rpm.org/\">RPM</a>)</td>\n        </tr>\n        <tr>\n        <td valign=\"top\" nowrap>\n        <a href=\"srecord-\\*(v).tar.gz\"><tt>srecord-\\*(v).tar.gz</tt></a></td>\n        <td valign=\"top\">\n        The complete source.</td>\n        </tr>\n        <tr>\n        <td valign=\"top\" nowrap>\n        <a href=\"srecord-\\*(v).pdf\"><tt>srecord-\\*(v).pdf</tt></a></td>\n        <td valign=\"top\">\n        SRecord Reference Manual, in Adobe Acrobat format.</td>\n        </tr>\n        </table>\n        <p><br/>\n    </td>\n    </tr>\n\n<tr>\n    <td valign=\"top\" align=\"center\" >\n    <img src=\"http://libexplain.sourceforge.net/sf.png\" alt=\"[*]\" />\n    </td>\n    <td valign=\"top\" >\n        <H2> SourceForge Downloads </h2>\n        The best possible download speed for the source tarball will be\n        from the\n        <ul>\n.\\\" ...............................................\n        <li> SourceForge\n            <ul><li><a\n                href=\"http://sourceforge.net/projects/srecord/files/\"\n                >SourceForge download pages</a>...\n            <li> See also the <a\n                href=\"http://sourceforge.net/projects/srecord\"\n                >Project</a> page.\n            <li> See also the <a\n                 href=\"https://sourceforge.net/project/stats/\\\n?group_id=72866&ugn=srecord\"\n                >Statistics</a> page.\n            </ul>\n.\\\" ................................................\n        <li> Unix and Linux and Downloads\n        <ul><li> The <a\n            href=\"https://sourceforge.net/projects/srecord/files/srecord/\\*(v)/\"\n            >\\*(v) release</a> folder.\n        <li> The <a\n            href=\"https://sourceforge.net/projects/srecord/files/srecord/\\*(v)/\\\nsrecord-\\*(v).tar.gz\" >release \\*(v) tarball</a>.\n            </ul>\n.\\\" ................................................\n        <li> MS Windows downloads\n            <ul>\n            <li>The <a\n                href=\"http://sourceforge.net/projects/srecord/files/\\\nsrecord-win32/\\*(v)/\"\n                >\\*(v) release</a> folder.\n        <li>The <a\n                href=\"http://sourceforge.net/projects/srecord/files/\\\nsrecord-win32/\\*(v)/srecord-1.63-win32.zip\"\n                >\\*(v) release .zip file</a>.\n            </ul>\n.\\\" ................................................\n        </ul>\n        <p><br/>\n    </td>\n    </tr>\n\n<tr>\n    <td valign=\"top\" align=\"center\" >\n    <img src=\"http://miller.emu.id.au/pmiller/software/launchpad-logo.png\"\n        alt=\"[*]\" />\n    </td>\n    <td valign=\"top\" >\n        <h2> Ubuntu Packages </h2>\n        If you use Ubuntu Linux, there are pre-built packages available\n        for installation using the normal <tt>sudo apt-get install</tt>\n        method, from <a\n        href=\"https://launchpad.net/~pmiller-opensource/+archive/ppa\"\n        >this package archive</a> (<a\n        href=\"https://help.launchpad.net/Packaging/PPA\" >PPA</a>).\n        <p>\n        Instructions are available there for how to manually add the PPA\n        to your <tt>/etc/apt/sources.list</tt> file, but the following\n        commands are sufficient on recent versions of Ubuntu:\n        <blockquote>\n<pre>sudo add-apt-repository ppa:pmiller-opensource/ppa\nsudo apt-get update\nsudo apt-get install srecord</pre>\n        </blockquote>\n        <p>\n        If you already have the PPA installed but not the <tt>srecord</tt>\n        package, this link <a href=\"apt:srecord\" >apt:srecord</a> should do\n        the install.\n.\\\"     <p>\n.\\\"     There is some suggestion that, one day, maybe, this link\n.\\\"     <a href=\"ppa:pmiller-opensource/ppa\" >ppa:pmiller-opensource/ppa</a>\n.\\\"     will install the package archive (PPA) for you.\n        <p><br/>\n    </td>\n    </tr>\n\n<tr>\n    <td valign=\"top\" align=\"center\" >\n    <img src=\"debian.png\" alt=\"[*]\" />\n    </td>\n    <td valign=\"top\" >\n        <h2> Debian Packages </h2>\n        The SRecord Debian packages are maintained by\n        <a href=\"mailto:fabo@debian.org\"\n        >Fathi Boudra &lt;fabo@debian.org&gt;</a>.\n        The Debian packages are available at <a\n        href=\"http://packages.qa.debian.org/s/srecord.html\"\n        >http://packages.qa.debian.org/s/srecord.html</a>\n        <p><br/>\n    </td>\n    </tr>\n\n<tr>\n    <td valign=\"top\" align=\"center\" >\n        <a href=\"http://aegis.sourceforge.net/cgi-bin/aeget/srecord.\\*(v)?menu\"\n        ><img src=\"http://aegis.sourceforge.net/aegis.png\" border=0 /></a>\n    </td>\n    <td valign=\"top\" >\n        <h2>Aegis Repo</h2>\n        SRecord is developed using <a\n        href=\"http://aegis.sourceforge.net/\">Aegis</a>, a transaction based\n        software configuration management system.\n        The Aegis <a\n        href=\"http://aegis.sourceforge.net/cgi-bin/aeget/srecord.\\*(v)?menu\"\n        >repository</a> for this project is available.\n        <p><br/>\n    </td>\n    </tr>\n\n<tr>\n    <td valign=\"top\" align=\"center\" >\n    <img src=\"whining-64.png\" alt=\"[*]\" />\n    </td>\n    <td valign=\"top\" >\n        <h2>Pre-compiled Windows Executables</h2>\n        See the <a\n        href=\"http://sourceforge.net/projects/srecord/files/srecord-win32/\"\n        >SourceForge.net download mirrors</a> for pre-compiled windows\n        executables.  They tend to be less up-to-date than the Ubuntu binaries,\n        see <a href=\"windows.html\" >here for how to build</a> up-to-date\n        binaries yourself.\n        <p><br/>\n    </td>\n    </tr>\n\n</table>\n\n.\\\" ------------------------------------------------------------------------\n<hr>\n<table border=0><tr><td valign=\"top\">\n<a href=\"http://www.fsf.org/\" ><img\nsrc=\"http://upload.wikimedia.org/wikipedia/commons/b/bf/\\\nGNU-FDL-ic%C3%B4ne-Transparente.PNG\"\nborder=0 alt=\"\" /></a>\n</td><td valign=\"top\" width=\"35%\">\nSRecord is maintained by\n<a href=\"mailto:scottfinneran@yahoo.com.au\"\n>Scott Finneran &lt;scottfinneran@yahoo.com.au&gt;</a>\nand is freely distributable under the terms and conditions of the\n<a href=\"http://www.gnu.org/licenses/gpl.txt\">GNU GPL</a>.\n</td>\n<td valign=\"top\">\n<a href=\"http://www.opensource.org/docs/definition.php\" ><img\nsrc=\"http://www.opensource.org/trademarks/opensource/web/opensource-110x95.png\"\nborder=\"0\" /></a>\n</td>\n<td valign=\"top\" align=\"right\">\nThere is more <a\nhref=\"http://miller.emu.id.au/pmiller/software/\"\n>Software by Peter Miller</a>\nat his home page.\n</td><td valign=\"top\">\n<a href=\"http://miller.emu.id.au/pmiller/\" ><img\nsrc=\"http://miller.emu.id.au/pmiller/pmiller_2003_colour.64.png\"\nborder=0 ></a>\n</td></tr></table>\n.\\\" ------------------------------------------------------------------------\n<hr>\n<a href=\"http://sourceforge.net/\"><img\nsrc=\"http://sourceforge.net/sflogo.php?group_id=72866&amp;type=5\"\nwidth=\"210\" height=\"62\" border=\"0\" alt=\"SourceForge.net Logo\"\nalign=\"right\"></a>\nThis page is hosted by <a href=\"http://sourceforge.net/\">SourceForge</a>.\n<br>\nThis page has been accessed approximately\n<img\nsrc=\"http://miller.emu.id.au/cgi-bin/web_hit_counter?pmiller_srecord_\\*(v)_dl\"\n> times since\n.ds MO1 Jan\n.ds MO2 Feb\n.ds MO3 Mar\n.ds MO4 Apr\n.ds MO5 May\n.ds MO6 Jun\n.ds MO7 Jul\n.ds MO8 Aug\n.ds MO9 Sep\n.ds MO10 Oct\n.ds MO11 Nov\n.ds MO12 Dec\n.nr y4 \\n[yr]+1900\n\\n[dy]-\\*[MO\\n[mo]]-\\n[y4].\n</body></html>\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/doxygen.cfg",
    "content": "#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2005-2007, 2010 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n# This file describes the settings to be used by doxygen for a project\n#\n# All text after a hash (#) is considered a comment and will be ignored\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \")\n\n#---------------------------------------------------------------------------\n# General configuration options\n#---------------------------------------------------------------------------\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded\n# by quotes) that should identify the project.\n\nPROJECT_NAME           = SRecord\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n#Set by Cook at build time.\n#PROJECT_NUMBER         =  1.6\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,\n# Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian,\n# Polish, Portuguese and Slovene.\n\nOUTPUT_LANGUAGE        = English\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = YES\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these class will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. It is allowed to use relative paths in the argument list.\n\nSTRIP_FROM_PATH        = bl/\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = YES\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a class diagram (in Html and LaTeX) for classes with base or\n# super classes. Setting the tag to NO turns the diagrams off.\n\nCLASS_DIAGRAMS         = YES\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C and C++ comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower case letters. If set to YES upper case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# users are adviced to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments  will behave just like the Qt-style comments (thus requiring an\n# explict @brief command for a brief description.\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# reimplements.\n\nINHERIT_DOCS           = YES\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 8\n\n# The ENABLE_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       =\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or define consist of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and defines in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C.\n# For instance some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = YES\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text.\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n# supplied by Cook at build time\n#INPUT                  =\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nFILE_PATTERNS          =\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = NO\n\n# The EXCLUDE tag can be used to specify files and/or directories that should\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n\nEXCLUDE                =\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories.\n\nEXCLUDE_PATTERNS       =\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       =\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.\n\nINPUT_FILTER           =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse.\n\nFILTER_SOURCE_FILES    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = NO\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header.\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            =\n\n# The HTML_STYLESHEET tag can be used to specify a user defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If the tag is left blank doxygen\n# will generate a default style sheet\n\nHTML_STYLESHEET        =\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set YES to add extra items for group members\n# to the contents of the Html help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index at\n# top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it.\n\nDISABLE_INDEX          = NO\n\n# This tag can be used to set the number of enum values (range [1..20])\n# that doxygen will group on one line in the generated HTML documentation.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n# generated containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript and frames is required (for instance Netscape 4.0+\n# or Internet explorer 4.0+).\n\nGENERATE_TREEVIEW      = NO\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, a4wide, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = NO\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = NO\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimised for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using a WORD or other.\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assigments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = YES\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_PREDEFINED tags.\n\nEXPAND_ONLY_PREDEF     = YES\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# in the INCLUDE_PATH (see below) will be search if a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed.\n\nPREDEFINED             = \\\n        \"FORMAT_PRINTF(x, y)=\" \\\n        \"DEPRECATED=\" \\\n        \"NORETURN=\"\n\n# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition.\n\nEXPAND_AS_DEFINED      =\n\n#---------------------------------------------------------------------------\n# Configuration::addtions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES tag can be used to specify one or more tagfiles.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = NO\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# the CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to\n# YES then doxygen will generate a graph for each documented file showing\n# the direct and indirect include dependencies of the file with other\n# documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to\n# YES then doxygen will generate a graph for each documented header file showing\n# the documented files that directly or indirectly include this file\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found on the path.\n\nDOT_PATH               =\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermedate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n\n#---------------------------------------------------------------------------\n# Configuration::addtions related to the search engine\n#---------------------------------------------------------------------------\n\n# The SEARCHENGINE tag specifies whether or not a search engine should be\n# used. If set to NO the values of all tags below this one will be ignored.\n\nSEARCHENGINE           = NO\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/doxygen.cook",
    "content": "/*\n * srecord - manipulate eprom load files\n * Copyright (C) 2001, 2006, 2007, 2010, 2012, 2013 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\ndoxygen = [find_command doxygen];\nif [not [doxygen]] then\n    doxygen = doxygen;\nall += archive/srecord/index.html;\n\narchive/%0index.html: [match_mask %0%%0%%.h [source_files]] etc/doxygen.cfg\n    set shallow\n{\n    function if_quiet Doxygen;\n\n    cat [resolve etc/doxygen.cfg] - > Doxyfile;\ndata\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or\n# absolute) base path where the generated documentation will be\n# put.  If a relative path is entered, it will be relative to the\n# location where doxygen was started. If left blank the current\n# directory will be used.\nOUTPUT_DIRECTORY       = doxygen-tmp\n\n# documented source files. You may enter file names like \"myfile.cpp\"\n# or directories like \"/usr/src/myproject\". Separate the files or\n# directories with spaces.\nINPUT = [unsplit \" \\\\\\n\" [resolve [stringset [need] - etc/Doxygen.cfg]]]\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision\n# number.  This could be handy for archiving the generated\n# documentation or if some version control system is used.\nPROJECT_NUMBER = [version]\ndataend\n        [doxygen] Doxyfile\n                -d [reldir archive/%0index.html]\n                [resolve [stringset [need] - etc/doxygen.cfg]]\n                                                /*\n                                                 * have Cook tell use how long\n                                                 * it takes to cook.\n                                                 */\n                                                set meter\n                ;\n        rm -rf [reldir archive/%0index.html]\n                set silent errok;\n        mv doxygen-tmp/html [reldir archive/%0index.html];\n        rm -rf Doxyfile doxygen-tmp\n                set errok silent;\n}\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/groff.sh",
    "content": "#!/bin/sh\n#\n#       srecord - Manipulate EPROM load files\n#       Copyright (C) 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\ngroff \"$@\" 2>groff.log\nes=$?\ncat groff.log 1>&2\ntest $es = 0 || exit $es\n\nif grep \"can't open\" groff.log 2>/dev/null\nthen\n    exit 1\nfi\n\nexit 0\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/howto.cook",
    "content": "/*\n * srecord - manipulate eprom load files\n * Copyright (C) 1998, 1999, 2001-2003, 2006-2010, 2012, 2013 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"functions\"\n\nset mkdir;\nset unlink;\nset time-adjust;\n\nawk = gawk;\n\n/*\n * See how verbose we have decided to be.\n */\nif [not [defined verbose]] then\n    verbose = [match %1D%2 [version]];\nquiet = [not [verbose]];\nlibtool-quiet = ;\nif [quiet] then\n{\n    set silent;\n    libtool-quiet = --quiet;\n    set no-star;\n}\nelse\n{\n    set no-silent tell-position;\n    libtool-quiet = ;\n    set star;\n}\n\nfunction if_quiet =\n{\n    if [quiet] then\n        function print /*[@1]*/ [target];\n    else if [in [count [younger]] 0] then\n        function print Building [target] because it doesn\\'t exist yet;\n    else if [in [count [younger]] 0 1 2 3] then\n        function print Building [target] because of [younger];\n    else\n        function print Building [target] because of [wordlist 1 3 [younger]]...;\n}\n\n/*\n * The first item in search list should be the absolute path of the\n * current directory.  Assume that it is.\n */\nsearch_list = .;\nsearch_tmp = [tail [split ':' [search_path]]];\n\n/*\n * Try to shorten the search path in command lines, too.\n *\n * This takes a little getting used to....\n * 1. For development builds, the search path is dev dir, then branch bl,\n *    then ... project bl.  Thus, bl in a dev dir winds up pointing to\n *    the branch reporitory.\n * 2. For integration builds, aegis deliberately omits the branch\n *    baseline from the path, but include's the branch's parents and\n *    ancestors.  Thus, bl in an int dir winds up pointing to the\n *    branch's parent's reporitory.\n * The idea is that integration builds in a branch are like a\n * development build of the branch's dev dir.\n */\nsearch_name = bl;\nloop\n{\n    search_dir = [head [search_tmp]];\n    if [not [search_dir]] then\n        loopstop;\n    search_tmp = [tail [search_tmp]];\n\n    if [not [exists [search_name]]] then\n        ln -s [search_dir] [search_name]\n            set clearstat;\n    search_list = [search_list] [search_name];\n    search_name = [search_name]bl;\n}\n\n#include-cooked etc/apt-get-depends.cook\n\n/*\n * determine the short version:\n * no change or delta number\n */\nversion_short = [fromto %1.C%2 %1 [subst D C [version]]];\n\nversion_shorter = [split \".\" [version_short]] _ _;\nversion_shorter = [unsplit \".\" [word 1 [version_shorter]]\n    [word 2 [version_shorter]]];\nproject_short = [fromto %.[version_short] % [project]];\nproject_minus = [project_short]-[version_short];\n\nchange_source_files = ;\n#include-cooked-nowarn etc/cook/change_files.[version]\netc/cook/change_files.[version]:\n    set shallow nodefault\n{\n    function if_quiet;\n    echo \"'change_source_files ='\" > [target];\n    aegis -l cf -p [project] -c [change] -terse >> [target];\n    echo \"';'\" >> [target];\n}\nproject_source_files = ;\n#include-cooked-nowarn etc/cook/project_files.[version]\netc/cook/project_files.[version]:\n    set shallow nodefault\n{\n    function if_quiet;\n    echo \"'project_source_files ='\" > [target];\n    aegis -l pf -p [project] -c [change] -terse >> [target];\n    echo \"';'\" >> [target];\n}\nsource_files = [sort [project_source_files] [change_source_files]];\n\n/*\n * Speed up graph building by stating the leaves explictly.\n * This also gives more useful error messages.\n */\nif [count [project_source_files]] then\nif [count [change_source_files]] then\n{\n    leaf_file_accept = [project_source_files] [change_source_files];\n    leaf_pattern_accept = /%0%;\n}\n\ndebug = /* -g */ ;      /* g++ takes forever if you say -g for complex\n                        template usage */\n\nall = ;\n\n/* the right hand side is deferred until triggered */\nall: [all];\n\n/*\n * Howto use GNU Autoconf.\n */\n#include-cooked etc/autoconf.cook\n\n\n/*\n * The files which are linked to form the common library for the programs.\n */\n[arch]/[project_short]/lib[project_short].la_obj =\n    [addprefix [arch]/\n        [fromto %0%.cc %0%.lo\n            [match_mask srecord/%0%.cc [source_files]]\n        ]\n    ];\n\n/*\n * Generate lists of object files for programs\n */\nprogram_list =\n    [stringset /* remove duplicates */\n        [patsubst %0%/main.cc %0% [filter %0%/main.cc [source_files]]]\n    ];\n\nfunction prog-var-from-prog-path =\n{\n    local prog = [@1];\n    local prog_var =;\n    if [in [substr 1 5 [prog] ] \"test/\"] then\n        prog_var = [subst \"/\" \"_\" [prog]];\n    else\n        prog_var = [subst \"/\" \"-\" [prog]];\n    return [prog_var];\n}\n\nloop prog = [program_list]\n{\n    prog_var = [prog-var-from-prog-path [prog]];\n    [prog_var]_obj =\n        [patsubst %0%.cc     %0%.lo [filter [prog]/%0%.cc [source_files]]]\n        [patsubst %0%.y %0%.yacc.lo [filter [prog]/%0%.y  [source_files]]]\n        [patsubst %0%.l  %0%.lex.lo [filter [prog]/%0%.l  [source_files]]]\n        ;\n    [prog_var]_libs = [project_short]/lib[project_short].la;\n    all += [arch]/bin/[prog_var];\n}\n\nintegration-build-targets = ;\nintegration-build-targets: [integration-build-targets];\n\nif [match %1C%2 [version]] then\n{\n    baseline = bl;\n}\nelse\n{\n    /*\n     * this is essential so that aeipass does the right thing\n     *\n     * It also means that generated files (e.g. from objen) have consistent\n     * mod-times after integration, sop everythign does not immediately\n     * re-build.\n     */\n    set time-adjust-back;\n    all += integration-build-targets;\n}\n\n\n/*\n * Note: this must come *after* the etc/autoconf.cook include.\n */\nif [not [defined c++]] then\n    c++ = g++;\ncc_include_flags =\n    [prepost \"-I\" \"\" [search_list]]\n    [prepost \"-I\" /[arch] [search_list]]\n    ;\nif [not [defined c++_flags]] then\n    c++_flags = -O [debug];\nc++_flags = [c++_flags] -Wall -Wextra -Werror;\nif [not [defined ld_flags]] then\n    ld_flags = [debug];\nif [not [defined libs]] then\n    libs = ;\n\ncascade %0%.lo = %0%.o %0.libs/%.lo;\n\n[arch]/%0%.lo [arch]/%0%.o [arch]/%0.libs/%.o: %0%.cc [arch]/srecord/config.h\n{\n    function if_quiet Compile;\n\n    rm -f [arch]/%0%.lo [arch]/%0.libs/%.o [arch]/%0.libs/%.lo;\n    libtool [libtool-quiet] --mode\\=compile\n    [c++] [c++_flags]\n        [defined-or-null %0%.cc_c++_flags]\n        [defined-or-null [dir %0%.cc]_c++_flags]\n        [cc_include_flags]\n        -c [resolve %0%.cc]\n        -o [target];\n    md5sum [arch]/%0%.o [arch]/%0.libs/%.o | sed \"'s|^|# |'\" >> [target];\n}\n\n\nc_incl = c_incl;\n\n%0%.h.d: %0%.h\n    set no-cascade\n{\n    function if_quiet Depends;\n    [c_incl] -nc -ns -nrec\n        [cc_include_flags]\n        [resolve %0%.h]\n        -prefix \"'cascade %0%.h ='\"\n        -suffix \"';'\"\n        -nsri\n        [prepost \"-rlp=\" \"\" [search_list]]\n        -slp [arch] \"'[arch]'\"\n        -o [target];\n}\n\n%0%.cc.d: %0%.cc\n        set no-cascade\n{\n    function if_quiet Depends;\n    [c_incl] -nc -ns -nrec\n        [cc_include_flags]\n        [resolve %0%.cc]\n        -prefix \"'cascade %0%.cc ='\"\n        -suffix \"';'\"\n        -nsri\n        [prepost \"-rlp=\" \"\" [search_list]]\n        -slp [arch] \"'[arch]'\"\n        -o [target];\n}\n\ncc_dep_files =\n        [fromto %0%.c %0%.c.d [match_mask %1/%0%.c [source_files]]]\n        [fromto %0%.h %0%.h.d [match_mask %1/%0%.h [source_files]]]\n        [fromto %0%.cc %0%.cc.d [match_mask %1/%0%.cc [source_files]]]\n        [fromto %0%.y %0%.gen.c.d [match_mask %1/%0%.y [source_files]]]\n        ;\n\n#include-cooked-nowarn [cc_dep_files]\n\n[arch]/bin/% [arch]/bin/.libs/%:\n    [addprefix [arch]/ [%_obj] [defined-or-null %_libs]]\n    set gate-first shallow /* tests need them */\n    if [defined %_obj]\n{\n    function if_quiet Link;\n\n    rm -f bin/.libs/lt-%;\n    libtool [libtool-quiet] --mode\\=link\n    [c++] -o [target]\n        [cc_include_flags]\n        [ld_flags]\n        [resolve [addprefix [arch]/ [%_obj] [defined-or-null %_libs]]]\n        [libs]\n        ;\n\n    /*\n     * Libtool makes intermediate shell scripts.\n     * Make sure the fingerprint changes when it rebuilds,\n     * otherwise some tests get confused.\n     */\n    date \"'+# %%c'\" >> [target]\n        set silent;\n\n    /*\n     * libtool creates bin/% as a script, which, when executed, does the\n     * actual link.  But this link puts its results in bin/.libs, and\n     * that directory will not be writable for executables sourced from\n     * the baseline.  So we goose it into linking now, which would seem\n     * to defeat the purpose.\n     */\n    [target] --version > /dev/null;\n}\n\n[arch]/%/lib%.la [arch]/%/.libs/lib%.a [arch]/%/.libs/lib%.so:\n        [[target]_obj]\n    set unlink ingredients-fingerprint\n\n{\n    function if_quiet Link;\n\n    /*\n     * We include the \"hidden\" libtool output files because we need to\n     * fingerprint something that actually changes, and the .la file is\n     * pretty much static.\n     */\n    local version-info =\n        [collect aesub \"'${project_specific aemakegen:version-info}'\" ];\n    libtool [libtool-quiet] --mode\\=link\n    [c++] [c++_flags]\n        -o [target]\n        [resolve [[target]_obj]]\n        [libs]\n        -version-info [version-info]\n\n        /*\n         * If you don't specify -rpath it doesn't make the shared library, even\n         * though the Debian people Really Don't Like Rpath.  We really really\n         * want the .so so we can check out version-info using the aede-policy\n         * soname.\n         */\n        -rpath /usr/local/bin\n        ;\n}\n\n[arch]/bin/%: [arch]/script/%.sh\n{\n    function if_quiet Copy;\n    cat [resolve [arch]/script/%.sh] > [target];\n    chmod a+rx [target];\n}\n\nall +=\n    [fromto script/%.sh.in [arch]/bin/%\n        [match_mask script/%.sh.in [source_files]]\n    ];\n\n\n/*\n * How to build the release sets.\n */\n#include-cooked etc/archive.cook\n\n/*\n * How to build the documentation.\n */\n#include-cooked etc/documentation.cook\n\n/*\n * Explicit include dependencies.\n */\n#if [count [cc_dep_files]]\n[cc_dep_files]: [arch]/srecord/config.h;\n#endif\n\n\n/*\n * The version stamp is to be updated for every\n * integration and development build.\n * (The integrate_begin_command in the config file\n * deletes them for integration builds.)\n */\n\nsrecord/patchlevel.h:\n    set shallow\n{\n    function if_quiet;\n\n    copyright_years =\n        [collect\n            aegis -list version -p [project] -c [change]\n            | [awk] \"-F'[[\\\\\\\\]]'\" \"'/^copyright_years/{print $2}'\"\n        ];\n    echo \"'#define PATCHLEVEL \\\"\"[version]\"\\\"'\" > [target];\n    echo \"'#define COPYRIGHT_YEARS \\\"\"[copyright_years]\"\\\"'\" >> [target];\n}\n\n/*\n * Build the version include, but not too often.\n */\netc/version.so:\n    set ['if' [or [not [defined baseline] ] [not [exists bl/etc/version.so\n                ] ] ] 'then' shallow]\n{\n    function if_quiet;\n\n    copyright_years =\n        [collect\n            aegis -list version -p [project] -c [change]\n            | [awk] \"-F'[[\\\\\\\\]]'\" \"'/^copyright_years/{print $2}'\"\n        ];\n    echo \"'.ds V) \"[version]\"'\" > [target];\n    echo \"'.ds v) \"[version_short]\"'\" >> [target];\n    aegis -list version -p [project] -c [change]\n        | [awk] -F'\\'\"\\'' \"'/previous/{print $2}'\"\n        | [awk] -F. \"'{print \\\".ds w) \\\"$1\\\".\\\"$2}'\"\n        >> [target];\n    echo \"'.ds Y) \"[copyright_years]\"'\" >> [target];\n}\n\n\n/*\n * Catch 22: If the relationship between a target and a derived ingredient\n * appears only in a derived cookbook, it is likely that a clean build\n * (solely from primary source files) will fail.  It is recommended that\n * relationships such as this be placed in a primary source cookbook.\n */\ncascade etc/BUILDING.man = etc/version.so ;\ncascade etc/README.man = etc/version.so etc/new.so;\ncascade etc/change_log.man = etc/version.so etc/new.so;\ncascade etc/reference.man = etc/version.so ;\ncascade etc/srecord.lsm = etc/version.so ;\ncascade srecord/versn_stamp.cc = srecord/patchlevel.h ;\ncascade man/man1/z_copyright.so = etc/version.so ;\n\n#include [resolve etc/doxygen.cook etc/metrics.cook etc/tags.cook ]\n#include [resolve test_hyphen/module.cook ]\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/howto_qemu_hardy64.txt",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nqemu-img create hardy64.img 5G\nqemu-system-x86_64 -net nic -net user -m 1G \\\n    -cdrom /home/vault/iso/ubuntu-8.04.4-desktop-amd64.iso \\\n    -hda hardy-amd64.img\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/index.html",
    "content": ".\\\"\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 1998, 2000-2004, 2006-2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ad l\n.hy 0\n.so etc/version.so\n.nf\n<html>\n<head>\n<link rel=\"icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<link rel=\"shortcut icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<title>SRecord \\*(v)</title></head>\n<body bgcolor=white><h1>\n<img src=\"srecord-64.png\" align=\"left\" />\n<img src=\"srecord-64.png\" align=\"right\" />\n<center>SRecord \\*(v)</center></h1>\nThe <i>SRecord</i> package is a collection of powerful tools for\nmanipulating EPROM load files.\n<p>\nI wrote SRecord because when I was looking for programs to manipulate EPROM\nload files, I could not find very many.  The ones that I could find only did a\nfew of the things I needed.  SRecord is written in C++ and polymorphism is used\nto provide the file format flexibility and arbitrary filter chaining.  Adding\nmore file formats and filters is relatively simple,\nsee the <a href=\"srecord-\\*(v).pdf\" >Reference Manual</a>.\n<p align=center>\n[ <a href=\"download.html\">Download</a> |\n<a href=\"mailing-list.html\">Mailing List</a> |\n<a href=\"windows.html\">Windows</a> |\n<a\nhref=\"http://aegis.sourceforge.net/cgi-bin/aeget/srecord.\\*(v)?menu\"\n>Aegis</a> |\n<a\nhref=\"http://aegis.sourceforge.net/cgi-bin/aeget/srecord.\\*(v)/?\\\nrss+completed.xml\"\n><img src=\"http://aegis.sourceforge.net/cgi-bin/aeget/icon/rss.gif\"\nborder=0 alt=\"RSS\"></a> ]\n<br>\n[ Sourceforge: <a href=\"http://sourceforge.net/projects/srecord\"\n>Project</a> |\n<a\nhref=\"http://sourceforge.net/project/stats/?group_id=72866\"\n>Statistics</a> ]\n</p>\n<p>\nSRecord runs on almost any flavor of UNIX.  The source distribution is\nself configuring using a GNU Autoconf generated configure script.\n<p>\n<blockquote>\nSRecord also runs on Windows.\nYou can build SRecord for Windows using\n<a href=\"http://www.cygwin.com/\">Cygwin</a> or\n<a href=\"http://www.delorie.com/djgpp/\">DJGPP</a>,\nsee the <a href=\"windows.html\">Windows</a> page.\n<p>\n<a href=\"windows.html\" >FAQ</a>:\n<i>Please, <b>please</b>, couldn't you just build a Windows executable for\nme?</i></br>\n<b>No.</b>  I rarely use Windows.\nBesides, SRecord is <a href=\"http://www.opensource.org/\"\n>open source</a>, so you have the source code, so you can <a\nhref=\"windows.html\" >do it yourself</a>.  It is very easy to <a\nhref=\"windows.html\" >do it yourself</a>, or you could consider upgrading\nto Linux.\n</blockquote>\n<p><br clear=\"all\" />\n<table><tr><td valign=\"top\" width=\"60%\" rowspan=5 bgcolor=\"#ccffcc\">\n<p align=center>\n<img src=\"doc_chip.png\" align=\"right\" width=98 height=128 />\n<b>The File Formats</b></p>\n<p>\nThe <i>SRecord</i> package understands a huge number of file formats:\n<dl>\n<dt>\n<a href=\"man/man5/srec_ascii_hex.html\" >Ascii-Hex</a>\n<dd>\nThe Ascii-Hex format is understood for both reading and writing.\n(Also known as the Ascii-Space-Hex format.)\n<p>\n.\\\" ----------  A  ---------------------------------------------------------\n<dt>\nASM\n<dd>\nIt is possible, for output only, to produce a series of DB statements\ncontaining the data.  This can be useful for embedding data into assembler\nprograms.\n<p>\n<dt>\n<a href=\"man/man5/srec_atmel_generic.html\" >Atmel Generic</a>\n<dd>\nThis format is produced by the Atmel AVR assembler.\nIt is understood for both reading and writing.\n<p>\n.\\\" ----------  B  ---------------------------------------------------------\n<dt>\nBASIC\n<dd>\nIt is possible, for output only, to produce a series of DATA statements\ncontaining the data.  This can be useful for embedding data into BASIC\nprograms.\n<p>\n<dt>\n<a href=\"man/man5/srec_binary.html\" >Binary</a>\n<dd>\nBinary files can both be read and written.\n<p>\n<dt>\n<a href=\"man/man5/srec_brecord.html\" >B-Record</a>\n<dd>\nFiles in Freescale Dragonball bootstrap b-record format can be read and written.\n<p>\n.\\\" ----------  C  ---------------------------------------------------------\n<dt>\nC Array\n<dd>\nIt is possible, for output only, to produce a C array definition containing\nthe data.  This can be useful for embedding data into other programs.\n<p>\n<dt>\n<a href=\"man/man5/srec_coe.html\" >Coefficient File format</a>\n<dd>\nThe Coefficient File Format (.coe) by Xilinx is understood for writing only.\n<p>\n<dt>\n<a href=\"man/man5/srec_cosmac.html\" >Cosmac</a>\n<dd>\nThe RCA Cosmac Elf format is understood for both reading and writing.\n<p>\n.\\\" ----------  D  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_dec_binary.html\" >DEC Binary</a>\n<dd>\nThe DEC Binary (XXDP) format is understood for both reading and writing.\n<p>\n.\\\" ----------  E  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_emon52.html\" >Elektor Monitor</a> (EMON52)\n<dd>\nThe EMON52 format is understood for both reading and writing.\n<p>\n.\\\" ----------  F  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_fairchild.html\" >Fairchild Fairbug</a>\n<dd>\nThe Fairchild Fairbug format is understood for both reading and writing.\n<p>\n<dt>\nLSI Logic <a href=\"man/man5/srec_fastload.html\" >Fast Load</a>\n<dd>\nThe LSI Logic Fast Load format is understood for both reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_formatted_binary.html\" >Formatted Binary</a>\n<dd>\nThe Formatted Binary (XXDP) format is understood for both reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_fpc.html\" >Four Packed Code</a> (FPC)\n<dd>\nThe FPC format is understood for both reading and writing.\n<p>\n.\\\" ----------  G  ---------------------------------------------------------\n.\\\" ----------  H  ---------------------------------------------------------\n<dt>\nHexdump\n<dd>\nIt is possible, for output only, to produce a simple hexadecimal listing.\nThis can be useful for developer debugging.\n<p>\n.\\\" ----------  I  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_idt.html\" >IDT/sim</a>\n<dd>\nThe IDT/sim binary file format is understood for both reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_intel.html\" >Intel</a>\n<dd>\nThe Intel hexadecimal format is understood for both reading and writing.\n(Also known as the Intel MCS-86 Object format.)\n<p>\n<dt>\n<a href=\"man/man5/srec_aomf.html\" >Intel AOMF</a>\n<dd>\nThe Intel Absolute Object Module Format (AOMF) is understood for both\nreading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_intel16.html\" >Intel 16</a>\n<dd>\nThe Intel hexadecimal 16 format is understood for both reading and writing.\n(Also known as the INHX16 file format.)\n<p>\n.\\\" ----------  J  ---------------------------------------------------------\n.\\\" ----------  K  ---------------------------------------------------------\n.\\\" ----------  L  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_logisim.html\" >Logisim</a></dt>\n<dd>\nThe <a href=\"man/man5/srec_logisim.html\" >Logisim</a></dt>\nformat is understood for reading and writing.\n<p>\n</dd>\n.\\\" ----------  M  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_mem.html\"\n>Memory Initialization Format</a>\n<dd>\nThe Memory Initialization Format (.mem) format by Lattice Semiconductor\nis understood for writing only.\n.\\\" http://help.latticesemi.com/docs/webhelp/eng/wwhelp/wwhimpl/common/\\\n.\\\" html/wwhelp.htm#href=Design%20Entry/memory_initialization_file.htm#\\\n.\\\" 1371843&single=true\n<p>\n<dt>\n<a href=\"man/man5/srec_mif.html\" >MIF</a>\n<dd>\nThe Memory Initialization File (MIF) format by Altera is understood for\nboth reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_mips_flash.html\" >MIPS-Flash</a>\n<dd>\nThe MIPS Flash file format is understood for both reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_mos_tech.html\" >MOS Technology</a>\n<dd>\nThe MOS Technology hexadecimal format is understood for both reading\nand writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_motorola.html\" >Motorola S-Record</a>\n<dd>\nThe Motorola hexadecimal S-Record format is understood for both reading\nand writing.\n(Also known as the Exorciser, Exormacs or Exormax format.)\n<p>\n<dt>\n<a href=\"man/man5/srec_msbin.html\" >MsBin</a>\n<dd>\nThe Windows CE Binary Image Data Format is supported both for reading\nand writing.\n<p>\n.\\\" ----------  N  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_needham.html\" >Needham Electronics</a>\n<dd>\nThe Needham Electronics ASCII file format is understood for both reading\nand writing.\n<p>\n.\\\" ----------  O  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_os65v.html\" >Ohio Scientific</a> (OS65V)\n<dd>\nThe Ohio Scientific hexadecimal format is understood for both reading\nand writing.\n<p>\n.\\\" ----------  P  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_ppb.html\" >PPB</a>\n<dd>\nThe Stag Prom Programmer binary format is understood for both reading\nand writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_ppx.html\" >PPX</a>\n<dd>\nThe Stag Prom Programmer hexadecimal format is understood for both reading\nand writing.\n<p>\n.\\\" ----------  Q  ---------------------------------------------------------\n.\\\" ----------  R  ---------------------------------------------------------\n.\\\" ----------  S  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_signetics.html\" >Signetics</a>\n<dd>\nThe Signetics format is understood for both reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_spasm.html\" >SPASM</a>\n<dd>\nThe SPASM format is used by a variety of PIC programmers; it is understood\nfor both reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_spectrum.html\" >Spectrum</a>\n<dd>\nThe Spectrum format is understood for both reading and writing.\n<p>\n.\\\" ----------  T  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_tektronix.html\" >Tektronix</a>\n(<a href=\"man/man5/srec_tektronix_extended.html\" >Extended</a>)\n<dd>\nThe Tektronix hexadecimal format and the Tektronix extended hexadecimal\nformat are understood for both reading and writing.\n<p>\n<dt>\n<a href=\"man/man5/srec_ti_tagged.html\" >Texas Instruments Tagged</a>\n<dd>\nThe Texas Instruments Tagged hexadecimal format is understood for both\nreading and writing (both 8 and 16 bits).  Also known as the TI-Tagged\nor TI-SDSMAC object format.\n<p>\n<dt>\n<a href=\"man/man5/srec_ti_txt.html\" >ti-txt</a>\n<dd>\nThe TI-TXT format is understood for reading and writing.  This format is\nused with the bootstrap loader of the Texas Instruments MSP430 family of\nprocessors.\n<p>\n<dt>\n<a href=\"man/man5/srec_trs80.html\" >TRS-80</a>\n<dd>\nThe Radio Shack TRS\\[hy]80 object file format is understood for reading\nand writing.\n<p>\n.\\\" ----------  U  ---------------------------------------------------------\n.\\\" ----------  V  ---------------------------------------------------------\n<dt>\nVHDL\n<dd>\nIt is possible, for output only, to produce a VHDL definition containing\nthe data.  This can be useful for some embedded development systems.\n<p>\n<dt>\nVerilog <a href=\"man/man5/srec_vmem.html\" >VMEM</a>\n<dd>\nIt is possible to write a Verilog VMEM file suitable for loading with\n\\f[CW]$readmemh()\\fP.  This format is supported for reading and writing.\n<p>\n.\\\" ----------  W  ---------------------------------------------------------\n<dt>\n<a href=\"man/man5/srec_wilson.html\" >Wilson</a>\n<dd>\nThe Wilson format is understood for both reading and writing.\nThis mystery format was added for a mysterious type of EPROM writer.\n.\\\" ----------  X  ---------------------------------------------------------\n.\\\" ----------  Y  ---------------------------------------------------------\n.\\\" ----------  Z  ---------------------------------------------------------\n.\\\" ----------  End of Format Names  ---------------------------------------\n<dt>\n<p>\nIf you have a description of other EPROM load file formats that SRecord\ndoes not yet understand, please <a href=\"mailto:pmiller@opensource.org.au\"\n>let me know</a>, and they can be added.\n</dl>\n<p>\nThe manual pages are also available <a href=\"man/index.html\"\n>from this web site</a>.\n</td><td valign=\"top\" width=\"40%\" bgcolor=\"#ccccff\">\n<p align=center>\n<img src=\"doc_cat.png\" align=\"right\" width=98 height=128 />\n<b>The Tools</b></p>\n<p>\nA number of tools are include in the <i>SRecord</i> package.\nAll of the tools understand all of the file formats, and all of the filters.\n<dl><dt>\n<a href=\"man/man1/srec_cat.html\" >srec_cat</a>\n<dd>\nThe <i>srec_cat</i> program may be used to catenate (join) EPROM load\nfiles, or portions of EPROM load files, together.  Because it understands\nall of the input and output formats, it can also be used to convert\nfiles from one format to another.\nIt also understands <i>filters</i>, see below.\n<p>\n<dt>\n<a href=\"man/man1/srec_cmp.html\" >srec_cmp</a>\n<dd>\nThe <i>srec_cmp</i> program may be used to compare EPROM load files,\nor portions of EPROM load files, for equality.\n<p>\n<dt>\n<a href=\"man/man1/srec_info.html\" >srec_info</a>\n<dd>\nThe <i>srec_info</i> program may be used to print summary information\nabout EPROM load files.\n</dl>\n<p>\nThe manual pages are also available <a href=\"man/index.html\"\n>from this web site</a>.\n</td></tr>\n<tr><td bgcolor=\"#ffffcc\">\n<p align=center>\n<img src=\"doc_lens.png\" align=\"right\" width=98 height=128 />\n<b>The Filters</b></p>\n<p>\nThe <i>SRecord</i> package is made more powerful by the concept of <i>input\nfilters</i>.  Wherever an input file may be specified, filters may also\nbe applied to that input file.\nThe following are only some of the filters are available:\n<dl><dt>\ncrc\n<dd>\nThe various <i>crc</i> filters may be used to insert an inustry standard cyclic\nredundancy check (CRC) into the data.\n<p>\n<dt>\nchecksum\n<dd>\nThe <i>checksum</i> filters may be used to insert a checksum into\nthe data.  Positive, negative and bit-not checksums are available,\nas well as big-endian and little-endian byte orders.\n<p>\n<dt>\ncrop\n<dd>\nThe <i>crop</i> filter may be used to isolate an input address range,\nor ranges, and discard the rest.\n<p>\n<dt>\nexclude\n<dd>\nThe <i>exclude</i> filter may be used to exclude an input address range,\nor ranges, and keep the rest.\n<p>\n<dt>\nfill\n<dd>\nThe <i>fill</i> filter may be used to fill holes in the data with a\ngiven byte value.\n<p>\n<dt>\nunfill\n<dd>\nThe <i>unfill</i> filter may be used to make holes in the data for bytes\nwith a given value.\n<p>\n<dt>\nrandom fill\n<dd>\nThe <i>random fill</i> filter may be used to fill holes in the data with\nrandom byte values.\n<p>\n<dt>\nlength\n<dd>\nThe <i>length</i> filter may be used to insert the data length into\nthe data.\n<p>\n<dt>\noffset\n<dd>\nThe <i>offset</i> filter may be used to offset the address of data records,\nboth forwards and backwards.\n<p>\n<dt>\nsplit\n<dd>\nThe <i>split</i> filter may be used to split EPROM images for wide data\nbuses or other memory striping schemes.\n<p>\n<dt>\nunsplit\n<dd>\nThe <i>unsplit</i> filter may be used to\nreverse the effects of the <i>split</i> filter.\n</dl>\n<p>\nMore than one filter may be applied to each input file.\nDifferent filters may be applied to each input file.\nAll filters may be applied to all file formats.\n<p>\nThere are many more filters available, see the <a\nhref=\"man/man1/srec_input.html\" ><i>srec_input</i>(1)</a> man page for\nmore information.\n</td></tr>\n<tr><td bgcolor=\"#ffccff\">\n<p align=center>\n<img src=\"doc_gen.png\" align=\"right\" width=98 height=128 />\n<b>The Generators</b></p>\n<p>\nThe <i>SRecord</i> package is made more powerful by the concept of\n<i>input generators</i>.  Wherever an input file may be specified,\na generator may be specified instead.  The following generators are\navailable:\n<dl>\n<dt>constant\n<dd>The <i>constant</i> generator may be used to create constant value bytes.\n<p>\n<dt>random\n<dd>The <i>random</i> generator may be used to create random bytes.\n<p>\n<dt>repeated data\n<dd>The <i>repeated data</i> generator may be used to create data which\nrepeats a sequence of byte values over and over again.\n</dl>\n<p>\nGenerators and data files can be combined on the same command line.\n</td></tr>\n<tr><td bgcolor=\"#ccccff\">\n<p align=center>\n<img src=\"doc_lib.png\" align=\"right\" width=98 height=128 />\n<b> The Library </b></p>\n<p>\nThe project includes a shared library.  The documentation for this\nlibrary is available <a href=\"srecord/index.html\" >here on the web\nsite</a>.  The shared library may be used to read and write all of the\nformats, and use all of the filters, in your own projects.\nIt also makes the installed executables smaller.\n</td></tr>\n<tr><td bgcolor=\"ffffcc\">\n<p align=center>\n<img src=\"doc_chip.png\" align=\"right\" width=98 height=128 />\n<b> Documentation </b></p>\n<p>\n<ul>\n<li> The complete project documentation, including all of the manual pages, is\n    <a href=\"srecord-\\*(v).pdf\" >available as a single PDF file</a>.\n<li> The Manual Pages are also <a href=\"man/index.html\"\n     >available as individual HTML pages</a>.\n</ul>\n</td></tr>\n</table>\n\n<h2> See Also </h2>\nFor a similar idea, applied to text files rather than EPROM load files,\nsee the <a href=\"http://uncia.sourceforge.net/\" >Uncia</a> project.\n<br/>\nFor a similar idea, applied to file systems rather than EPROM load files,\nsee the <a href=\"http://plasticfs.sourceforge.net/\" >PlasticFS</a> project.\n<br/>\nFor a similar idea, applied to archive files (tar, cpio, ar) rather\nthan EPROM load files, see the <a href=\"http://tardy.sourceforge.net/\"\n>Tardy</a> project.\n.\\\" ------------------------------------------------------------------------\n<hr>\n<table border=0><tr><td valign=\"top\">\n<a href=\"http://www.fsf.org/\">\n<img\nsrc=\"http://upload.wikimedia.org/wikipedia/commons/b/bf/\\\nGNU-FDL-ic%C3%B4ne-Transparente.PNG\"\nborder=0 alt=\"\" ></a>\n</td><td valign=\"top\" width=\"35%\">\nSRecord is maintained by\n<a href=\"mailto:scottfinneran@yahoo.com.au\"\n>Scott Finneran &lt;scottfinneran@yahoo.com.aud&gt;</a>\nand is freely distributable under the terms and conditions of the\n<a href=\"http://www.gnu.org/licenses/gpl.txt\" >GNU GPL</a>.\n</td><td valign=\"top\">\n<a href=\"http://www.opensource.org/docs/definition.php\" ><img\nsrc=\"http://www.opensource.org/trademarks/opensource/web/opensource-110x95.png\"\nborder=\"0\" /></a>\n</td>\n<td valign=\"top\" align=\"right\">\nThere is more <a\nhref=\"http://miller.emu.id.au/pmiller/software/\"\n>Software by Peter Miller</a>\nat his home page.\n</td><td valign=\"top\">\n<a href=\"http://miller.emu.id.au/pmiller/\" ><img\nsrc=\"http://miller.emu.id.au/pmiller/pmiller_2003_colour.64.png\"\nborder=0 /></a>\n</td></tr></table>\n.\\\" ------------------------------------------------------------------------\n<hr>\n<a href=\"http://sourceforge.net/\"><img\nsrc=\"http://sourceforge.net/sflogo.php?group_id=72866&amp;type=5\"\nwidth=\"210\" height=\"62\" border=\"0\" alt=\"SourceForge.net Logo\"\nalign=\"right\"></a>\nThis page is hosted by <a href=\"http://sourceforge.net/\" >SourceForge</a>.\n<br>\nThis page has been accessed approximately\n<img\nsrc=\"http://miller.emu.id.au/cgi-bin/web_hit_counter?pmiller_srecord_\\*(v)\"\n> times since\n.ds MO1 Jan\n.ds MO2 Feb\n.ds MO3 Mar\n.ds MO4 Apr\n.ds MO5 May\n.ds MO6 Jun\n.ds MO7 Jul\n.ds MO8 Aug\n.ds MO9 Sep\n.ds MO10 Oct\n.ds MO11 Nov\n.ds MO12 Dec\n.nr y4 \\n[yr]+1900\n\\n[dy]-\\*[MO\\n[mo]]-\\n[y4].\n</body></html>\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/mailing-list.html",
    "content": ".\\\"\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2008 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ad l\n.hy 0\n.so etc/version.so\n<html>\n<head>\n<link rel=\"icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<link rel=\"shortcut icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<title>SRecord \\*(v)</title></head>\n<body bgcolor=white><h1>\n<img src=\"srecord-64.png\" align=left>\n<img src=\"srecord-64.png\" align=right>\n<center>SRecord \\*(v)<br>\nMailing List\n</center></h1>\nThere is a mailing list called\n<tt>srecord-users@lists.sourceforge.net</tt> which may be used to\ndiscuss uses of SRecord, and how to use it.\n<br clear=all>\n.br\n<dl>\n<dt>Subscribe<dd> Fill out the appropriate <a\n.nf\nhref=\"https://lists.sourceforge.net/lists/listinfo/srecord-users\">\n.fi\nform at SourceForge</a>.\n<dt>Unsubscribe<dd> Fill out the appropriate <a\n.nf\nhref=\"https://lists.sourceforge.net/lists/listinfo/srecord-users\">\n.fi\nform at SourceForge</a>\n<dt>Post<dd>\nTo post an article, send email to\n<a href=\"mailto:srecord-users@lists.sourceforge.net\">\n<tt>srecord-users@lists.sourceforge.net</tt></a>\n<dt>Archive<dd> The mailing list is archived at <a\n.nf\nhref=\"http://sourceforge.net/mailarchive/forum.php?forum=srecord-users\">\n.fi\nSourceForge</a> if you wish to see back issues.\n</dl>\n</body></html>\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/man-html-index.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\necho \"<html>\"\necho \"<body>\"\necho '<h1 align=\"center\">'\necho '<img src=\"../srecord-64.png\" align=\"left\" />'\necho '<img src=\"../srecord-64.png\" align=\"right\" />'\necho \"SRecord Manual Pages </h1>\"\noldsection=1\necho '<br clear=\"all\" />'\necho \"<h2>Commands</h2>\"\necho \"<ul>\"\nfor f in $*\ndo\n    base=$(basename $f .html)\n    section=$(echo $f | sed 's|.*/man\\([0-9]\\)/.*|\\1|' )\n    if [ \"$section\" != \"$oldsection\" ]\n    then\n        echo \"</ul>\"\n        case $section in\n        1)\n            echo \"<h2>Commands</h2>\"\n            ;;\n        3)\n            echo \"<h2>Library</h2>\"\n            ;;\n        5)\n            echo \"<h2>File Formats</h2>\"\n            ;;\n        *)\n            echo \"<h2>Section $section</h2>\"\n            ;;\n        esac\n        echo \"<ul>\"\n        oldsection=$section\n    fi\n    echo \"<li><a href=\\\"man$section/$base.html\\\" ><i>$base</i>($section)</a>\"\ndone\necho \"</ul>\"\necho \"</body>\"\necho \"</html>\"\nexit 0\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/metrics.cook",
    "content": "/*\n * srecord - manipulate eprom load files\n * Copyright (C) 2003, 2006, 2007, 2010, 2013 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nall += metrics.targets ;\n\n/*\n * These are the files to construct to that Aegis can read them at\n * integration pass time.\n */\nmetrics.targets = [addsuffix \",S\" [source_files]];\nmetrics.targets: [metrics.targets];\n\n%0%.h,S: %0%.h\n    set nocascade\n{\n    aemeasure --lang\\=C++ [resolve %0%.h] [target];\n}\n\n%0%,S: %0%\n    set nocascade\n{\n    aemeasure [resolve %0%] [target];\n}\n\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/new.sh",
    "content": "#\n# srecord - manipulate eprom load files\n# Copyright (C) 1998, 2006-2008, 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nsortflag=\nif test \"$1\" = \"-r\"; then\n        sortflag=-r\n        shift\nfi\necho $* |\ntr ' ' '\\12' |\nsort $sortflag -V |\nwhile read f\ndo\n        echo \".so $f\"\ndone\nexit 0\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/page-list.awk",
    "content": "#!/bin/awk -f\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\nfunction output_end()\n{\n        if (start == 0)\n                return;\n        if (middle != 0)\n                printf(\",\")\n        middle = 1\n        printf(\"%d\", start);\n        if (start != finish)\n                printf(\"-%d\", finish);\n        start = 0;\n        finish = 0;\n}\n\nfunction output(n)\n{\n        if (start == 0)\n        {\n                start = n\n                finish = n\n                return\n        }\n        if (n == finish + 1)\n        {\n                finish = n;\n                return\n        }\n        output_end();\n        start = n;\n        finish = n;\n}\n\nfunction output_even()\n{\n        if ((page[finish] % 2) != 0)\n        {\n                output_end();\n                printf(\",_\");\n        }\n}\n\n/Page:/ {\n        page[$3] = $2\n        if ($3 > max)\n                max = $3\n}\nEND {\n        output(1);\n        output(2);\n        numtoc = 0\n        for (j = 3; j <= max; ++j)\n        {\n                if (page[j] > 1000)\n                {\n                        output(j);\n                        numtoc++\n                }\n        }\n        output_even();\n        for (j = 3; j <= max; ++j)\n        {\n                if (page[j] < 1000)\n                        output(j);\n        }\n        output_even();\n        output_end();\n        printf(\"\\n\");\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/ppa-upload.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010-2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nset -e\n\nproject=srecord\nwwwdir=archive\n\nAEGIS_PROJECT=${project}.cur\nexport AEGIS_PROJECT\n\nRELEASES=\"$@\"\ntest -z \"$RELEASES\" && RELEASES=\"karmic lucid maverick natty\"\n\nPPA=ppa:pmiller-opensource/ppa\n\n#find the project baseline\nbl=`aegis -cd -bl`\ndir=$bl/$wwwdir\nf=`( cd $dir && ls *.tar.gz ) | head -1`\nif [ -z \"$f\" ]\nthen\n    echo \"can't find tarball\" 1>&2\n    exit 1\nfi\ntgz=$dir/$f\n\ntdir=/tmp/${project}-ppa-$$\n\nfor release in $RELEASES\ndo\n    cd /tmp\n    rm -rf $tdir\n    mkdir $tdir\n    cd $tdir\n    tar xzf $tgz\n    cd ${project}-*\n\n    PACKAGE=`head -1 debian/changelog | awk '{print $1}'`\n    VERSION=`head -1 debian/changelog | awk '{print $2}' |\n        sed -r -e 's/^\\(//;s/\\)$//'`\n\n    sed -i -r -e \"1s/\\) [^;]+; /~pm~${release}) ${release}; /\" debian/changelog\n    head -1 debian/changelog\n    dpkg-buildpackage --changes-option=-DDistribution=${release} -S -sa\n    ls -lho ..\n    dput $PPA ../${PACKAGE}_${VERSION}~pm~${release}_source.changes\n\n    cd /tmp\n    rm -rf $tdir\ndone\nexit 0\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/ref-ptx.ignore",
    "content": "#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\na\nas\nand\nbe\nby\nof\nthe\nto\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/ref-ptx.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\necho $* |\ntr ' ' '\\12' |\nsort |\nwhile read f\ndo\n        echo .so $f\ndone\n\nexit 0\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/ref-ptx1.awk",
    "content": "#\n# srecord - manipulate eprom load files\n# Copyright (C) 1998, 2006, 2007, 2009 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\nfunction getc()\n{\n    getc_tmp = substr(getc_buf, getc_pos, 1)\n    if (getc_tmp != \"\")\n        ++getc_pos\n    return getc_tmp\n}\n\nBEGIN {\n    th_name = \"none\"\n    th_section = \"none\"\n    active = 0\n}\n/^\\.TH/ {\n    # watch out for the quotes\n    getc_buf = $0\n    getc_pos = 4\n    argc = 0\n    for (;;)\n    {\n        c = getc()\n        while (c == \" \" || c == \"\\t\")\n            c = getc()\n        if (c == \"\")\n            break\n        quoted = 0\n        arg = \"\"\n        for (;;)\n        {\n            if (c == \"\\\"\")\n                quoted = !quoted\n            else if (c == \"\")\n                break\n            else if (!quoted && (c == \" \" || c == \"\\t\"))\n                break\n            else\n                arg = arg c\n            c = getc()\n        }\n        argv[++argc] = arg\n    }\n\n    # th_name = argv[1]\n    # gsub(/\\\\\\*\\(n\\)/, \"SRecord\", th_name)\n    # th_section = argv[2]\n    th_name = FILENAME\n    sub(/^.*\\//, \"\", th_name)\n    sub(/\\.[0-9]$/, \"\", th_name)\n    th_section = FILENAME\n    sub(/^.*\\./, \"\", th_section)\n    active = 0\n    next\n}\n/^\\.SH/ {\n    active = ($2 == \"NAME\")\n    next\n}\n/^['.]\\\\\"/ {\n    # ignore comments\n    next\n}\n/^['.]XX/ {\n    # ignore indexing\n    next\n}\n/^['.]if/ {\n    # ignore conditional (around indexing)\n    next\n}\n/^['.]\\\\}/ {\n    # ignore conditional (around indexing)\n    next\n}\n/^['.]/ {\n    if (active)\n    {\n        sub(/^.[a-zA-Z][a-zA-Z]*[       ]*/, \"\")\n        print th_name \"(\" th_section \") \" $0\n    }\n    next\n}\n{\n    if (active)\n    {\n        gsub(/  /, \" \")              # Translate tabs to spaces\n        gsub(/__*/, \" \")             # Collapse underscores\n        gsub(/  +/, \" \")             # Collapse spaces\n        gsub(/ *, */, \", \")          # Fix comma spacings\n        sub(/^ /, \"\")                # Kill initial spaces\n        sub(/ $/, \"\")                # Kill trailing spaces\n        gsub(/\\\\f\\(../, \"\")          # Kill font changes\n        gsub(/\\\\f./, \"\")             # Kill font changes\n        gsub(/\\\\s[-+0-9]*/, \"\")      # Kill size changes\n        gsub(/\\\\&/, \"\")              # Kill \\&\n        gsub(/\\\\\\((ru|ul)/, \"_\")     # Translate\n        gsub(/\\\\\\[(mi|hy|em)]/, \"-\") # Translate\n        gsub(/\\\\\\((mi|hy|em)/, \"-\")  # Translate\n        gsub(/\\\\\\*\\(n\\)/, \"SRecord\")\n        gsub(/\\\\\\*\\(../, \"\")         # Kill troff strings\n        gsub(/\\\\/, \"\")               # Kill all backslashes\n        print th_name \"(\" th_section \") \" $0\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/ref-ptx2.awk",
    "content": "#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\nBEGIN {\n        print \".hy 0\"\n        print \".de TH\"\n        print \"..\"\n        print \".TS H\"\n        print \"l r lw(2.5i) lw(2.5i).\"\n        print \".TH\"\n}\n{\n        print $10 \"\\t\\\\*[Page*Of*\" $10 \"]\\tT{\"\n        print \".ad r\"\n        print $4\n        print \"T}\\tT{\"\n        print \".ad l\"\n        print $6\n        print \"T}\"\n}\nEND {\n        print \".TE\"\n        print \".ad b\"\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/reference.man",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 1998, 1999, 2001, 2003, 2004, 2006-2009, 2014 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.\\\" Format and print this file using the GNU groff command\n.\\\"     groff -s -p -t -ms -I. -I../man/man1 -I../man/man5 main.man | lpr\n.\\\"\n.\\\" Some of the formatting constructs used in this document assume GNU groff.\n.\\\"\n.pn -1 \\\" the first (unnumbered) is -1, second is 0,\n.\\\"       the third is 1, just like I wanted.  Sheesh!\n.so etc/ref-toc.so \\\"from the etc directory\n.so etc/version.so \\\"from the etc directory\n.if n .ftr CB B\n.if n .ftr CI I\n.if n .ftr CW R\n.if n .ftr C  R\n.\\\" ---------------------------------------------------------------------------\n.\\\" enable the .XX macro\n.nr equire_index 1\n.\\\" ---------------------------------------------------------------------------\n.\\\" stuff for figuring dates\n.\\\"\n.lg 0\n.ds MONTH1 January\n.ds MONTH2 February\n.ds MONTH3 March\n.ds MONTH4 April\n.ds MONTH5 May\n.ds MONTH6 June\n.ds MONTH7 July\n.ds MONTH8 August\n.ds MONTH9 September\n.ds MONTH10 October\n.ds MONTH11 November\n.ds MONTH12 December\n.ds MO \\\\*[MONTH\\n[mo]]\n.nr *year \\n[yr]+1900\n.ds DY \\n[dy] \\*[MO] \\n[*year]\n.\\\" ---------------------------------------------------------------------------\n\\&.\n.sp 2i\n.ps 36\n.vs 38\n.ce 2\nSRecord\n.sp 0.5i\n.ps 28\n.vs 30\n.ce 1\nReference Manual\n.sp 1i\n.ps 18\n.vs 20\n.ce 2\nScott Finneran <scottfinneran@yahoo.com.au>\nPeter Miller <pmiller@opensource.org.au>\n.ft P\n.\\\" ---------------------------------------------------------------------------\n.bp\n.ps 12\n.vs 14\n\\&.\n.sp 2i\nThis document describes SRecord version \\*(v)\n.br\nand was prepared \\*(DY.\n.br\n.sp 1i\n.if n .ds C) (C)\n.if t .ds C) \\(co\nThis document describing the SRecord program,\nand the SRecord program itself,\nare\n.ce 2\nCopyright \\(o) 2014 Scott Finneran <scottfinneran@yahoo.com.au>\nCopyright \\(o) Peter Miller <pmiller@opensource.org.au>\n.sp\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 3 of the License, or\n(at your option) any later version.\n.sp\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n.sp\nYou should have received a copy of the GNU General Public License along\nwith this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.\\\" ----------  Include the Other Stuff  --------------------------------------\n.\\\"\n.nr C 1 \\\"continuous page numbers (see GNU groff tmac.an)\n.so etc/README.man\n.so etc/BUILDING.man\n.so etc/new-file-format.so\n.so etc/new-filter.so\n.\\\"\n.\\\" ----------  Include the Manual Pages  -------------------------------------\n.\\\"\n.so etc/ref-parts.so\n.\\\"\n.\\\" ----------  Include the Table of Contents  --------------------------------\n.\\\"\n.if o .bp \\\" because .TH is going to throw another one\n.nr % 1000\n.TH \"Table of Contents\" \"SRecord\" \"SRecord\" \"Reference Manual\"\n.\\\"\n.\\\"     -----\n.\\\" This next section redefines the page footer to use roman numbering\n.\\\" from \"iii\" onwards.  It is overly GNU Groff specific.\n.\\\" Fortunately, the page number does not appear in the page header.\n.\\\"\n.nr an-page-origin \\n%-3\n.af an-page-letter i\n.de an-p-footer\n.ev 1\n.nr an-page-letter \\\\n%-\\\\n[an-page-origin]\n.ds an-page-string \\\\n[an-page-letter]\n.ie \\\\nD \\{\\\n.       if o .tl '\\\\*[an-extra2]'\\\\*[an-extra1]'\\\\*[an-page-string]'\n.       if e .tl '\\\\*[an-page-string]'\\\\*[an-extra1]'\\\\*[an-extra2]'\n.\\}\n.el .tl '\\\\*[an-extra2]'\\\\*[an-extra1]'\\\\*[an-page-string]'\n.ev\n..\n.\\\"     -----\n.in 0\n.TC\n.\\\"\n.\\\" ----------  Include the Permuted Index  -----------------------------------\n.\\\"\n.bp\n.in 0\n.so etc/ref-index.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/rpm-build.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 2003, 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\ncase $# in\n2)\n        ;;\n*)\n        echo \"Usage: $0 tmp-dir tarball\" 1>&2\n        exit 1\n        ;;\nesac\n\ntmp=$1\ntarball=$2\n\nmkdir -p $tmp/BUILD $tmp/BUILD_ROOT $tmp/RPMS/i386 \\\n        $tmp/SOURCES $tmp/SPECS $tmp/SRPMS\n\nmac=`rpm --showrc | awk '/^macrofile/{print $3}'`\ncat > $tmp/rpmrc << fubar\nmacrofiles: ${mac}:$tmp/macros\nfubar\n\nhere=`pwd`/$tmp\ncat > $tmp/macros << fubar\n%_builddir      $here/BUILD\n%_buildroot     $here/BUILD_ROOT\n%_rpmdir        $here/RPMS\n%_sourcedir     $here/SOURCES\n%_specdir       $here/SPECS\n%_srcrpmdir     $here/SRPMS\nfubar\n\nrpmbuild -ta --target i386-pc-linux --rcfile $tmp/rpmrc -vv $2\ntest $? -eq 0 || exit 1\n\nexit 0\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/srecord.lsm",
    "content": ".\\\"\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 1998, 2001, 2003, 2006-2010 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.\\\" LSM = Linux Software Module, an archive description file\n.\\\"\n.\\\" Descriptions of the LSM file format can be found in the\n.\\\" /pub/Linux/docs directories of sunsite.unc.edu and tsx-11.mit.edu.\n.\\\"\n.ad l\n.hy 0\n.de SH\n.in 0\n.br\n\\\\$1\n'in 8n\n..\n.so etc/version.so\n.SH Begin3\n.SH Title:\nSRecord\n.SH Version:\n\\*(v)\n.SH Entered-date:\n.ds MO1 JAN\n.ds MO2 FEB\n.ds MO3 MAR\n.ds MO4 APR\n.ds MO5 MAY\n.ds MO6 JUN\n.ds MO7 JUL\n.ds MO8 AUG\n.ds MO9 SEP\n.ds MO10 OCT\n.ds MO11 NOV\n.ds MO12 DEC\n.nr y4 \\n[yr]+1900\n\\n[dy]\\*[MO\\n[mo]]\\n[y4]\n.SH Description:\nThe \\fISRecord\\fP package is a collection of powerful tools for\nmanipulating EPROM load files.\n.sp\n*\n'in +2n\nThe SRecord package understands a number of file formats:\nMotorola S-Record,\nIntel,\nTektronix,\nBinary.\nThese file formats may be read and written.\nAlso, C array definitions for output only.\n.in -2n\n.sp\n*\n'in +2n\nThe SRecord package has a number of tools:\n\\fIsrec_cat\\fP for copying and and converting files,\n\\fIsrec_cmp\\fP for comparing files,\nand\n\\fIsrec_info\\fP for examining files.\n.in -2n\n.sp\n*\n'in +2n\nThe SRecord package has a number for filters:\n\\fIchecksum\\fP to insert checksums,\n\\fIcrop\\fP to keep address ranges,\n\\fIexclude\\fP to remove address ranges,\n\\fIfill\\fP to fill data holes,\n\\fIlength\\fP to insert data length,\n\\fImaximum\\fP to insert data address maximum,\n\\fIminimum\\fP to insert data address minimum,\nand\n\\fIoffset\\fP to adjust addresses.\n.in -2n\n.sp\nMore than one filter may be applied to each input file.\nDifferent filters may be applied to each input file.\nAll filters may be applied to all file formats.\n.sp\nSRecord runs on almost any flavor of UNIX.\nSelf configuring using a GNU Autoconf generated configure script.\nThere are no modifications required to compile it for Linux.\n.SH Keywords:\nEPROM, srecord, motorola, intel\n.SH Author:\npmiller@opensource.org.au (Peter Miller)\n.SH Primary-site:\nhttp://srecord.sourceforge.net/\n.TS\nlf(CW) l.\nsrecord-\\*(v).README    Description, from the tar file\nsrecord-\\*(v).lsm       Description, LSM format\nsrecord-\\*(v).spec      RedHat package specification\nsrecord-\\*(v).tar.gz    The complete sources.\nsrecord-\\*(v).pdf       Reference Manual, Acrobat format\n.TE\n.SH Secondary-site:\nmetalab.unc.edu /pub/Linux/apps/circuits\n.TS\nlf(CW) l.\nsrecord-\\*(v).README    Description, from the tar file\nsrecord-\\*(v).lsm       Description, LSM format\nsrecord-\\*(v).spec      RedHat package specification\nsrecord-\\*(v).tar.gz    The complete sources.\nsrecord-\\*(v).pdf       Reference Manual, Acrobat format\n.TE\n.SH Copying-policy:\nGPL 2.0\n.SH End\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/srecord.png.uue",
    "content": "#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\nbegin 644 srecord.png\nMB5!.1PT*&@H````-24A$4@```6P```%L\"`8```#HGX.Y````!F)+1T0`_P#_\nM`/^@O:>3````\"7!(67,```L3```+$P$`FIP8````!W1)344'U@D:`B(R5N9#\nMU@``(`!)1$%4>-KLO6F07-=Y)7C>GN_EGEE[%0H@-A(+08N\"\")*@@A1%2J84\nM<DOM1;;;]GAK6W9;EFQUQXQ[ID>>]G1'SX^.Z'#T3(0G8ASM'ST385NRM5B@\nM1!$+%XD2!:X`\"8(`B:T*59F5>[Y]FQ\\O[\\7-AZP%!$\"\"XCT1&5EK+B_?._>[\nMY_N^\\PEQ'(.#@X.#X]:'R`\\!!P<'!R=L#@X.#@Y.V!P<'!R<L#DX.#@X.&%S\nM<'!P<'#\"YN#@X.\"$S<'!P<'!\"9N#@X.#@Q,V!P<'!R=L#@X.#@Y.V!P<'!P<\nMG+`Y.#@X.&%S<'!P<'#\"YN#@X.#@A,W!P<'!\"9N#@X.#@Q,V!P<'!P<G;`X.\nM#@Y.V!P<'!P<G+`Y.#@X.&%S<'!P<'#\"YN#@X.#@A,W!P<'!\"9N#@X.#@Q,V\nM!P<'!P<G;`X.#@Y.V!P<'!P<G+`Y.#@X.#AA<W!P<'#\"YN#@X.#@A,W!P<'!\nMP0F;@X.#@Q,V!P<'!P<G;`X.#@X.3M@<'!P<G+`Y.#@X.#AA<W!P<'#\"YN#@\nMX.#@A,W!P<'!P0F;@X.#@Q,V!P<'!P<G;`X.#@Z.:X3,#P$'QZV'X\\>/B_U^\nM_X!E69\\)@N\"^*(HVA6$X&89A#@`D28(D22NB*#X%X$>JJAXW#./(1S_ZT8@?\nMO9]>\"'$<\\Z/`P7&+X)EGGMGJ.,X7&XW&KRXO+T^T6BU<N'`!410A#$.0ZU40\nM!$B2!%$4,3\\_CVPVBW*Y[%<JE6=SN=PQ15%.\"(+P#P\\^^&#(CRHG;`X.CAN$\nM$R=.R+U>[PLK*RN_5*O5/KJRLH)&HX%VNPW+LE\"I5!#',:(H&B)L410A\"`)Z\nMO1XD28*F:<AFLRB52JA4*BB52H&NZ\\\\8AG%4493'-4W[\\7WWW<<O>$[8'!P<\nMUXK#AP_O\",/P#P#\\5K/9+%V^?!FU6@V]7@^^[R..8PB\"`,=Q$,<QTM>J(`@0\nM!`'Y?!Z>Y\\%Q'/B^#TF2H.LZ<KD<-$U#I5*!KNLH%HM6J53ZAVPV^[*JJL^+\nMHGCR_OOOK_-/@A,V!P?'*CARY,@^W_?_%\\_S?CX(`O'DR9.P;1N]7@^V;2.*\nM(DK&`*`HRIJ/IR@*PC\"$[_OT1N03<I-E&89AH%PN8WQ\\').3DZA6J\\CE<F=,\nMTSRDJNHA7=>/WG___3;_A#AA<W!\\X/'DDT^..X[SO_;[_7_5Z72$7J\\'QW%P\nM\\>)%A&%(2580!,1QC#`,$00!,IG,$($3$#(617'H1N23(`@011'*Y3*-P%W7\nM!0#(LHQ,)@-%4;!CQPYHFH9<+F?G<KFCF4SFD\"S+AQY^^.$S_%/CA,W!\\8'\"\nMCW[THSL\\S_MSTS1_L=5JB<O+RUA:6D*]7D>_WT>Q6*1D+8HB9%F&)$D`@\"B*\nMX'D>)6Q\"VFST3$B:_)SHVT3C]GW_Z@M_\\#CD,451A*(HR&:SJ%0JF)B8P/CX\nM^)E<+G<HCN-#`(X^^.\"#//KFA,W!\\5-+U..2)/W'Y>7EWUE:6A+.GS^/>KT.\nMUW4I44911,GYG2**UJ[D$\\6UVRT<QZ%5)[(LTYLD21`$`7OV[$&A4+`KE<K1\nM;#9[2!\"$0_?>>R^/OCEA<W\"\\__'\\\\\\_/=CJ=_WEY>?EWVNVVNKR\\C%ZOAUZO\nMAR`(H*HJ-$VCD;%M7U_@>KV$S2X@;&1.;IJF0555&(8!PS\"0R^50*I7.5\"J5\nM0_E\\_I`@\"$<?>.`!'GUSPN;@>/_@F6>>&8^BZ'_J=KM_L+BXJ%^\\>!'U>AU!\nM$%`]699E2M8D47BS(^RT]IT&RP%L-0JY#\\.0?B^*(C1-0[%81*5203Z?1RZ7\nMLS5-.YK-9@]EL]E#'__XQWGTS0F;@^/6Q(LOOEAN-IM?65A8^-+2TE*NV6S\"\nMMFUXGH<P#\"%)$B4_410A21+\",*1)P&PV>UW/?[W7L*(H0T1-%@\"VPH1\\3QIX\nM2$VX(`C(9K.D;!#5:A652N5,H5`X9!C&(451CAX\\>)!'WYRP.3C>6WSWN]]5\nM@B#X@N=Y?UZKU2KGSIW#TM(2;-NF\"3Q-TZCD(0C\"D#9,B(]$L#<KPEZ7!)@$\nMY*B?!T%`%QHBKP1!`-_W$00!)6Y9EJ&J*G1=AV$8T'4=BJ+8V[=O/YK)9`XI\nMBG+H$Y_X!(^^.6%S<+R[^-K7OO98K5;[SYU.9U>M5H/G>7!=%V$8TDH/0FZD\nM3(^-2MF*C^LEW/7^?[UKG%21L*\\K_1I)B2%)3I)%A[P?EL\"!Q.M$413(LHQJ\nMM0I)DI#/YU&M5H_F\\_G_[?.?__Q1?A9QPN;@N*GX^M>_OJO9;/[GE965QQJ-\nM!DS3A&590Q&F+,N(XQB^[\\/S/.3S^:&Z:J)G$ZBJ>E,ED?4(G1`Q&UFSWV<R\nM&;H@15%T5;VW81A7>9VP$;EIFO`\\#X9AH%JMDM?T?VW>O/E+?_S'?QSPLXH3\nM-@?'#<6WO_WMRN+BXI\\O+BY^H=EL*JS,4:E4:&,*D3=(]'F%P`!1E`%$B&,!\nM0`1!D\"\"*0!C&`\"(D;L?7?I_P\\6J_7Y^PV:1G.N%(HFO2?4E*_N(XIAJ\\KNLC\nM917R&)E,!MUNER8L&XT&>KT>[KKKKF<_\\8E/_-PCCSS2Y&?8QL#M53DX5L'W\nMOO<]*8[CC[_VVFN_UF@T/E>OUW.^[T/3-&0R&;BN\"\\NRA@B/+:$CY\"6*`(0(\nMB&-`B\"'$`B``B&/$&)\"I$`'QZ/LHC`;?BZ/O(:[^_UB_K&\\]#9U$U(2$B81\"\nMR)LUI1H5`)+D*ZF0(1&Y81@'=5V_=.S8L?T//OC@:_R,XQ$V!\\<UX\\B1(_L6\nM%Q=__=*E2[_:;#9G/,^#95EP'`>2)\"&;S4)5581A2+L0UQ`DKA#R.Y0LKE?C\nM1BS?U,??2`1O61;U,W$<![9M8W9V%KMV[<+,S$PL2=)?R++\\[Q]^^&%N!\\L)\nMFX-C-)Y^^FE)$(2'7-?]<+_?/]!JM0ZLK*S,$GM3V[9I1,BVCI-$6QB&ZVC0\nM44)HUT'8UWN-QI'TGA*V*(HT*B=&5B3BUG4=NW;M0B:302Z76\\KE<O]')I/Y\nMQX<>>NA<^G%^^,,?\"LUF<]/*RLI6S_.VY//YV6*Q^$HFDSG^L8]];)$3-@?'\nM3Q&^\\8UOB*[K[@V\"X)XXCG<)@O\"((`A[2Z62V&ZW<?GR92PM+:'3Z2`,0UKE\nM0(B:D\">;-\"2Z[EJ$'<?Q!YJPHRBB1,U6FOB^#]NV:>=G-IM%+I>#81A05;4M\nM2=(_BJ*XT.OU[HOC>,YQG.VM5DMLM5KP/`^93`:ZKN/`@0-0%.5M7=>/&(9Q\nM6-?U(X\\\\\\LA/)8%SPN;XJ<77O_[U6<=Q#KBN>\\#W_0][GO>0Z[H2J1TFT1\\I\nMQ2.)0M_WZ;:=?$U^'T41K910516JJL*RK#4)6Q3%ZR+LZT44BN\\I80=!@&PV\nM\"U$485D6;<\\'0-T#TW[?Y'B+HHABL4AW,W$<T^H34JG2Z72@*`H,PZ`=F)5*\nMY52Q6#RLZ_H169://O+((RN<L#DX;C%\\][O?E6S;_ER_W__37J]WGV59M/R,\nMW$AD3&J)3=.DR3!-TP`DADB69='$(K$K]3R/-HN0>N2U\"6M@[G0=A+U>:_EZ\nM\"`/A/27L,`RAZSHD28+KNO`\\CQI-D86/M.FSC3B$F+O=+GS?IY%Z)I.!)$FT\nMU)#L@LAN9R\"OT,:E'3MV0);EIU55_8FJJD<413G\\\\8]_W.2$S<'Q'N%[W_M>\nMKM_O_[9IFE]R'&=K>@(+VPB2-C<BD3-;OL;Z2SN.0\\DZ??-]?YT!`\\GC?9`)\nMFRQJA(3)XD?(NMOM#D77+%F3\")LLMJR_\"2'X;#8[]#WK*TX^2U55D<OE4\"Z7\nM,3$Q$4Q.3AZO5JM'LMGLX:6EI6<_]:E/69RP.3AN,HX=.S;;Z72^:)KF[W6[\nMW3*)AEG7.6(?RM[8SL.U-.CT+$6VK=RV;3B.@VZWNR9A7Z^&O5Y9WGH(_.LC\nMW.LE[$PF`],T$441<KD<9%FF<I.B*%`49<CGFQ`ZFRL@+?WD=^1SDV5YR&TP\nM[1E.GI\\T,1$#KFPVBWP^#UW7L7OW[E\"6Y6<U33NBJNIA69:?O56'%W/\"YGA?\nMXM\"A0SN:S>9?]'J]7[(L2W@O7TL<Q_`\\#[9M4Q*_,J8KA&$8\"\"/_JJDR9$$A\nM>BX[E&#4@`)6TB&1*'F<-0DUO#[\"O]F$?K.QWO-KFD:]7TJE$L;'QZWQ\\?%G\nM*Y7*X6PV>Z3?[Q__Z$<_>DMT9'+\"YGC?X(DGGA`\\S_N4Z[I_:EG6PV0&XGL-\nM0JR$D,E<Q21\"#.\"Z+F*$5VWK221(--CTC3PVT=57NU9'393AA+WQY_=]G\\HP\nMK'F581A0%`5;MFPQ,YG,D6PV>UC7]9\\\\\\,`#3W/\"YN!8!=___O<SEF7]>J_7\nM^Q/+LG:1Q!_1*]<NJ[OY(%4F:3>[Y/7YZ/?[B!%>Y2>2]A1AM_/LUZ04+BWI\nMC)JDS@G[G3T_.P.3S6,(@H!JM0K#,%`JE5\"I5%`JE5:RV>Q1556/2))T^.&'\nM'S[%\"9OC`X_''W\\\\&X;AOVXVF__&MNTL,1$\",.08]UX3@N_[5#-G7>R2V\\`[\nM>A!A$RW5<1R:S!Q%R(0L`,`TS:$DZ+5H\\)RP-Z:QDZ0S23RS8$>H93(9%`H%\nME,MEE,ME0N2+JJH>,0SC<\":3.7+PX,&W.6%S?&#PS6]^<Y=MVW_B.,ZO^[Z?\nM,4V3$AV1$-A!M=?K)WVC)!%6[K@2<6.H2H1$V*3*A'S-:M0L<9#RP=42:AN)\nMLCEA7]OSIQ=/15%H\"2&1GU1512:3H;7XN5P.E4H%8V-C*)5*;<,P_E&6Y1<$\nM0?A_/OK1C]ZP\"A1.V!RW#`X=.O1PO]__TWZ__ZE^OR_8MHT@\"&@$Q):&L:5X\nM[[4D(LLR)5FVN2.Y)5/+!3$>*B=D\"9<D*'W?A^NZU`6/F\"89AC%$Z*P&OI&2\nM/T[8ZS?VK\"5)D?.._>S8195\\UJJJ(IO-HE`HH%0JH5`H0-.TN%PN_UC7]4/9\nM;/;O[[WWWI.<L#G>M_C.=[XC>)[W2Y[G_85MVSM(I04A,0!)E46JNH*-5M>N\nM@WYW(^VK([5XR$MDU+!;5MLF.PF2N\"0D32)Q\\K.T9LX)^YT_/SFOR.?#[ESB\nM.$:OUZ.$K\"@*W=F1190LV.QG0]KM95E&/I_'V-@89F=G,38VMJ!IVG\\)@N#0\nM0P\\]=,WDS0F;XSW!DT\\^6?8\\[_>\"(/CB^?/G9]G&!Q*U$B\\/0M[D8B`=<NF(\nM\\[V\";=NT<X^-_LDMF]41Q0$\"/T(8^8A\"`$($49`AB#$$2$-VJ7$D#'W?[UGP\nM`Q>VY<+U;$0A((@Q%%F#)`NP3&=U^]4APGHG?MNW\"F'?++_PY/>\"$$,0)`A\"\nM#$!$'(>(8V%0EIE#$'CP_1!!X\"&.DX58EE5(DD#_G_Q?&,8(`@]!$`WYB!/O\nMDW*YC.GI:6S:M.E<M5K]FS`,_[\\''WSP#4[8'+<<GGCBB:W]?O]+W6[WMWN]\nM7LYQG.M^3!+QI'5>=KP5J_6F$WOL,`(V\\B71J^_[5RT*[-^9IGE5=R0;O262\nM340)((X%1%%`!QF0P09K$4H<APB\"\")[GP'5]N*X-STNJ4`A1$&(211FR+%)\"\nML6T;8>33!4.`!$D6H,@:9$5$'`E)%<O@/@IQY?LXAB0I5U6EC*I:87<9[-^2\nMLL75?K\\ALE[+#WR#]^3](1:'[D5!OJ[')0OPZ@LF1AXS<G[NW+D3^7S^V=MN\nMN^VOJ]7JWQXX<*#/\"9OCO=:G[W-=]T]MV_Z<;=N2XSA4H[W><S!-D.FO28<<\nM.\\:*)1Y-TU9M6@&`?#Y/(\\51LD=Z8DLZ<1B&X<@*$+8$<+T%B=6PTV6!9\"O.\nMUG]?T=,364E61+IC(897Y$8DI5%#\".(X1A2*[R%AK^\\G?BV2U:C7<;V=I.M*\nM+I$T%$\"DO^[W^U!5%;.SLYB:FJH7B\\5_];N_^[M_QPF;XUW%][__?2F*HG_6\nM;#:_XGG>_:P^S;JN76^5AZ(H]`(DI,K>\"H7\"D'R2]JT@G83L;=04%?;_R44:\nMQS%MK4YW'9*_32\\(Z=>R7N*0/.:HQX[CF,Y:)#HW*1E,JE\"2`0N2+-!YDZ2U\nMGA`[:XB5WIT(@H`XDCAA7P=A\"U#6#\"A(DMDP#)JTW+U[]^/;MV__N8<>>FBH\nM*XJ/\"..XX3AZ]&BVW^__9KO=_K)IFMN)/DU*V5BROEYC(U;R6.VB;+5:5Q$T\nM6\\?=Z_5&$A;Y.IO-7O4Z60+K]_OT<8EFF29Z-OHF9,T2Y5H@4VU8&89]G:P7\nM!R%N$FV'8>(Y'80>K4)A*QL41:%UQNPQ&BHAY*?T#=D!IL]1\\OW,S`R(JZ3K\nMNJC5:B@6BS\\[-C;V^P#^*R=LCIN\"QQ]_?,IUW3]R'.<+IFE6.YT.+,N\"JJKT\nM!\"4DR59(7\"_6DQ1T7;\\J,DQ[*H_:KI+[1J,QU!B3CG0+A<)0M,5*(G$<H]OM\nM7K50$&E\"$`3J\";U69#A*DDD?4_:U79%_PL2>-'!IJ2`Y7N3Y=5V_2N896C#\"\nMB)_<-Q'=;I=:QP9!`,NRDN[8./X$)VR.&XYGGGEFO-UN_UF]7O]BI].1B>1!\nMB)!MW4XW?]R(\"@(B.:RFPY(%@]5M21,.W?:G&E?82)CX+Q,-.-W-N+2T1*M7\nMR._9\")YX@:RU15\\+I,X\\?=S8LC+R_M+1/!`G31ZZBD*A0.N^2;TW:01)2T&L\nM9\",**C_);Y!DDO:1`:YTLK+7Q^!\\VG;5N<`/)\\<[Q7>^\\YV'@R#XBFW;CW4Z\nM':'9;-)!M8JB#$6DH^I;V:[`ZX'KNE<1,DNZCN,,)>O8WZ4)._W_Q(F/)6S6\nM/2^.$T(D=;JD_I;4ZXJB\",,PKM8UF0MVO3KR=,1/CAEK(YM>:!BZ@*9I$*4K\nM$3690ZFJ*H(@H#()>=_$OI3L$$3.$C>$L$?)3@\"0R^5H`I[L\"'.Y'\"1)>HL3\nM-L=UX=BQ8XIMV[_8[_>_TN_W[W8<!V3&'MG6&89!9_8YCH-L-CN24#9J#[H>\nM+E^^/*3=LFW?411A<G)R9.MX.IDW*B'$$F2ZSIH\\/B&V,`QAFB9ZO=[0PN\"Z\nM+A1%H7,+L]DL#,-`)I/94)<FN9!7JX9AB>%J^U81NJXC\"+VA:3FB*\"*;S=+/\nM*=V<PU:;>\"Z71*X'Z21W.D<`)+7\\9\"=*IN6HJOHL)VR.=TK4A5:K]2];K=:7\nM^OW^)A+5\"D+2>DVZP`!0\\A9%$9E,!JU6\"[(LT[\\A)$4(U'&<JRH06'F!$(WK\nMNK!M&Y9E4=_I,`R1R^6&R%_7=9HH)-/-TR3-2AZCJB]8?9WMK$Q7M)\"+CD2O\nMY+VQNPC26D\\6E%JMQMBO1LCG\\Y!E&9JF46M/7==IIQPKO[#'AT3P2TM+=(`M\nMT4&)+\"4(<3)S4HB&Y!7R&MFV;/*8FJ8-22*-E<Y(*6:4_)0^-N0YTIV=K(1S\nMLSM5V3S%6M+91B2-42#F7>Q[9(\\Q&Q\"DCQW98?F^CT*A`$$0</'B17SZTY]&\nM+I=[AA,VQS7AB2>>V-3O][_DNNZ_-$VST._WJ<L<N2@)\"9/(,UW\"5JE4:/1'\nMR\"0=;9`MNBB*<%T7O5X/[7:;#FU-2P.LU)`V1TI',.G*\"G9\\5/I\"9HEFHTG1\nMU<R9R(UMO\"$35MC'M2R+=G,ZCH-.IS-T\\4],3-`(G4A-Y&_#,,2N7;M0J]5P\nMZ=(E!$&`?#Z/0J$`413A^^X[^MQ9TJE6JT/:_[#?]]4[IO2Q('_'DN1&*V3>\nM#Q@5,6\\DVF;/$[+3R6:S``!-T[P@\")[CA,VQ4:*^V[*LKSB.\\XNU6DU9;68>\nMB2#31)76F-GJC/3)32HE\"$&GFVK22;?T_Z<CM/2%PW9\"IJ.F4;70['O;R(6X\nMVG@JEK#3G9#IN9*LALYZB,1Q#-,TH:HJK=,E+G&DVN3--]\\<M,!G42P6D<_G\nM$88AZO4Z5E9JF)J:>L=D#0#97(XVYJBJ2EWKV(:=]'MFCS%I_&%O-T(*>S](\nM(:.NAW1T3YJ7',=!I5*!)$G(9K/_[8$''@@X87.LBB>??%)P'.<QQW&^8IKF\nMP_U^'[9M#U54L!%E>MM(2\"==.N<X#HTL244#:?!@&SU(]$Z:38C.FQZ1E:[B\nM2)-M^H)($\\.H;D66J--?7R]8&2*=%$Q/E$E7:`!`N]V&YWGH=KO4DSF?SR.?\nMSU,=G$3?ON]C<7$1<1S#,`SLV+%C,',ROF:B)C^CR4=1I,E4]C42\"2P];8=\\\nM3H9A#\"4UTP98ZY5EOI\\B[%$+]BB23B]L),(>D#5T7?^_1YY+G*8XCAT[)MNV\nM_<5NM_MGO5YOG-6(/<^#81BK)DO8+3\\;.;%Z9;E<IA=SM]N%95DP39-*`21R\nMRV0R*!:+0S[71+M.MW:3Z)(0RFJ$G)8ZTL1)MJ/IJ#H=;:^%=.MY^H(E$LBH\nM3D>B^:<O?++(\"(*`R<E)>)Y'=Q^]7@^F::+1:$\"69<S.SM)%@%W0$N(D78;Q\nM-1$0>T\\T6C8/P!X3699'$G9ZHLXH$GNOG?QN)&&O%F%CC:8N]I[D6ZK5*@X>\nM/'B<$S;'$(X>/5J-X_@+ER]?_B/;MJ=ZO1ZMS247TZB$W\"C\"8J/9M&6H(`BP\nM+`N=3@?D.8B403R$V6B.$'\"Z,835KT>9^:]&.J-(>*WH\\EHED>O5.-,S&=,D\nM1IP+\"X4\"<KD<K:-V71>F:>+55U]%)I-!I5+!]/0TQL;&(,LR^OT^:K7:0.N/\nM-Q19CRHA%$1Y9%28EI1([3G;B@\\DG:;LX[(>*^D=R$^#AGU5Z>HZ;?F\"(,#S\nM/*BJ\"LNR,#<WM_INC=/6!P^'#AW:;MOVEVW;_DW/\\[+U>GUH\\@G;^,&2UVI>\nM$NR)QU94V+8-UW6QO+Q,'Y]4#)\"*\"%(YPD:01+?6-`V:IM'&E[0DDC:.6BWI\nM-2K!Q1+.]4HB:3TZ?=&F-?3TW[)#>$<UKMBV3:ML,ID,M>DDD6P<Q^AT.CA_\nM_CS.GS^/:K6*N;DY3$U-879V=J@U_YWHV*(@CNRP3#>!C#H.)&I,:_1L3?S[\nMW<]H(XOZ:L9:+&'G\\WGT>CU,3DZN_ES<_.D#%5'?;UG65SJ=SC]K-IM2J]6\"\nM:9I0%&5HF@NIUACNI$M\\?A/W-Q&2)$\"2%(@BX/LAHBB`()\"16!)<UT:_;\\$T\nM>^CU3\"B*A$S&@*K*D\"0%410@#&.$H8\\PC*&J,G0]\"TU3`(@(`@^.X]%YB6L1\nM\"HE061<\\ECQ(TB]-IJ/,H#:B@5]KE)76J--?IY-RZ4H;4F:7UNW9]Z>J23=B\nMI]-!L]FDU3G5:A534Q-KVH.F_;B'OA\\BF='VKX(@T?,B?0]$`WO6Q%8V#'WX\nM?DCM88/`@VG:6-/7^CJ-G\\BYG+959>_7M$]=S]QIA$PX)'O%\\IKGEZ(H:#0:\nMF)R<Q/+R,C[_^<]C9F:F^NBCCS8Y87_`<.3($5E1E'_>[7;_I%ZOW[NRLH)^\nMOT_K7TET.RH\"),CGLW!<\"[;E(HH#2*)\"?93#R(<D*C\"R&2BRAK[9Q?)2'<W6\nM\"@(_@JR(*.1+E`A$\"=2XG_@0!WXT1!0\")`AB<H$EKT.\\RB6/?8W$BV.UVEK6\nM_G24(]UJYCP$MFT/+01D]T$6!>(5PNKKK'2S6MD;^=EZ7B(;J0-F%UQ1%&F2\nMTC1-Z+J.N;D9S,]O@6%D8)HV^OTN!$&\"IBD(@@BR+$(49411`-\\/$88^]=4.\nM@N#F^44+$1S;0Q0'\\+TP\\3QQ?'B^@\\\"/$,7#-?3I*AO@RI#<U<Y?42`ZOKCF\nMPK+:O2AAU?,CK<./(N3`Q]\".E96\"2+\"TL+``15&P;]\\^:)J&3W_ZT_<>.'#@\nM1YRP/R`X?/APJ=?K_:[C.%]<65F9]SR/)A*)+$$R_NFM[?`)GVQC10DCS87\"\nM,$0VFZ55'J32@T0.)#&X5ITT2=JM]AHD4;NJX8!]C'05RRA==M3CKQ8=I2^X\nMM,:\\UK9W5&(M/6`A_?5ZC[_>-9JN<R:+!)$>3-,$D+0\\3TQ,8&IJ\"IE,!I9E\nMH=?KT8:-]/M/%AU<(>QWB/46'%;J(J^9G3*4/M]8S3PMUXV2R$1!73/9M\\ZK\nM'QJB/.K\\8.6U40L^L:=-[Y`(B?=Z/8BBB\"U;MN\"%%U[`7_W57^'UUU__M9__\nM^9__[US#_BG'TT\\_O=VV[3_N=#J_U6ZW<Z9IHE:K#97::9HV%\"&N5U;E^SYD\nMB)1XV-(T699AVS9:K1::S29\\WZ>=AJPVFR;241KHJA'2B$ZU=-/-:AIV^G]&\nM/?YZA,T.`1[E-3+*[WJUBH!TP\\Z-`(DX29*71-NDY$^2)'0Z':RLK-#2L8F)\nM\"9KPE21IB!S9CE`R`.%F@E31D%U?6OXAI8/$L(I-2K/-6J/(4!3%),*_#K!5\nM-FM5>JSV>Q*4L!8#Y+7%<8S)R4F$88ASY\\[!,`SXOH^YN;D]7,/^*<:Q8\\<^\nMV>UV_Z#=;G^FV^V*EF71^EA2J<%:BJ8CM+4B;$F2$(17?\"C8Y&(<QUA>7H;K\nMN@B\"`)JF(9_/0U556F.=R636C!C7BX8E<5@#3D]N&?4S5L-F([Q1CS\\J2DYK\nMV.EI+VRTQWI@CWH_Q,]Z-?WS>J]!MIJ'>*F0A80<>\\_ST._W89HFXCA&J53\"\nMS,P,QL?'AR;8$`GIBJ'4H$OS)D;8Z]7)D]>6]H@A?V=9UM#WI.23[/!<)[RN\nM\")N\\__7*\\E:[CR.)GBNL,1H)`'1=I[FD1QYY!/E\\'ENV;'ES__[].WF$_5.$\nMIYYZ2A4$X9=[O=Z73=/\\4*/10+/9A&F:0Y:F)`),5U900F0TWE%(\"/L*,2B*\nM@C`,J01\"JACR^3SUOV\";+5:K:QX5>8]:--);3I;HTN0\\BK!72Q\"M5NHWBD09\nMRTMZL9$+F)U+N=I$D]6((4WVJY'Z1J)LUDF0+\"JNZ]+/C$S>:;5:M'+'LBQ,\nM3T\\/20SIQ-G-;A\\?%3\"P]Z2QA'BLD)U$VGDQ'9436>5Z:8Z=>K]:!+V6)$*N\nMH?18.\"+_+\"\\O8].F33AX\\\"#V[-D#01!PYLR9':JJ'MBW;]^/.&&_S_&C'_UH\nMK-_O?Z';[?ZA;=O3ER]?'IHR0B[@M-E-6H9@-<\"U8)HF($34[X,D>H@,,C4U\nM-=3%R&K8Q#IR-2E)-MV]```@`$E$051B/<DB^?UHQ[-1Y#Q*DUZ+##;R_MD(\nM<=0.A32.K&;A2H[9J`OZ1I!ANH20/!]I.B+^+*P3'*GA/GWZ-\"VOU#1M:-[C\nMNT'6&XEV2:42D7?(3H(0'JFB8:\\!XGD211'T3/Z&2\"*K)1TWTFG+EKN2G2\\Q\nMW+K[[KOQP`,/X-\"A0ZA6J]BV;1MV[-B!\\^?/_PM.V.]C'#ER9'<0!%\\V3?/7\nMVNVVWFZW89KFT(@J$FF-BFK3#2ALTF\\]#5O+*-0)KM?KH=/IP/,\\6A.<GE\"^\nM6K2Z5IWT:A$P*[^,\\N1@\"7046;-=@Z/N-THHJ_TO(0RRJV%]IUFY(NT$N-%M\nM^49>)UDDR',3?Q6V\"2J*(NBZ3FNYR?]=OGP9Q6(1E4J%OFY23BG+TG7/W%P/\nMA(17&X3,GK=LQ4TZ:B4[\"R+%$<^3&[.@K$W8:TDB810.)9C)(E.M5E$JE?\"I\nM3WT*L[.S^,N__$O<>^^]6%A8P-Z]>[&TM/2KK[SRRO^X;]\\^FVO8[R,\\^^RS\nMG[1M^Q?;[?9OMUHMH=UNTVJ,,`R1S^>'&DK2]J2695TUWHKU<R87[VH:MN_[\nMR.@J!$%`J]7\"TM(2;-M&-IM%N5RFS\\F2U2COB/3?I*>&KY84)!HV*TVDR^?6\nMBMC2\"]5ZDLM:95NKD2>;<&2U[;1;WZB*AFO5>$<MJ(2P28.-)$E#_N#L(D*J\nMA,B.Z>+%BYB8F,#T]#0,PZ`ZL:(HR&227,3-U+#9I.,H:8,=,3=*JDI/-\")1\nM+\"%LR_2N2\\-FW_^HA7;=*B/ORJ!F<BY4*A5LV[8-FS9MPLZ=.U&OUU&KU3`[\nM.PO#,/#**Z_@L<<>PQMOO/%;CSWVV'_CA'WK)Q'U,`Q_+8JB+S<:C=W=;A>-\nM1@.]7F^H#(Z=VKT6(:TE\":P]-7O@>1TD7M2F:=+M->E$3'<2CJKR6(WPR$G,\nMDO%547@L7U7GS$;7HR+XM`9ZK5MS]C%'N<VQ-S*YA:VO91>N=KM-=7U2,ZQI\nM&JV5)J.[TFYV:3_OU9)RZ4[*=+4**]FPU2WL\\2+>+@<.'(#C.-!U?2!W35!)\nM[)T2,FL(MIHYTO40OBS+U-V1=(,*@D\"]T_L]A\\[6+)5*4!0%BXN+*!:+<%T7\nMF4QFI,]+\\KS1NAJV95FH5JN091F=3@>.XT#3-`B\"`,=Q4,A7Z,+=Z_50K5;Q\nMR\"./8->N76BWV^AVNYB:FH+G>3A]^C0<Q\\&V;=LP,S.#,`R?/W#@P#V<L&_=\nM:'K:MNT_['0Z7^AT.F.D9(YH<J2,C:VAMBSKIA(V`+B>35O'PS\"D6NGZ==Q8\nM]^MT%)Z^B8(Z9/B4EAC6TK^O-8)=+8)*$RI+>H2,214->4ZBIQ*2($D^<OQ\\\nMWX=IFI0PTJ90ZR5'5Y-\\TJ\\Q[7:8MI15516U6@V2)&%\\?!RSL[-,WF'P?+<X\nM89/SF+U.2$#QQJFST'4=2TM+F)R<A.NZ\",,0AF'0W<9JU@`;(6RRLR%?$T=%\nM$HSX7F*1.SL[BSONN`/E<IE*4Z[KHE`HT,5%TS1J*^`X#I:7ER%)TCT'#QY\\\nMGFO8MQ\">?OKI#[FN^V73-'^YT^FH[7:;KM;LA4FB2U(!0+:#-Q.$?-@Q8*0T\nMZ5HON%'UT:.B:K:Z)`JCJWQ`V!F.9.KW1B+\\U2[X]6PP6=(FNC3;6).N_R7:\nM*SN4EU27$#(D%@!L7?MJK>MIO?1:!BR,FA+#'E]RO`S#P.7+ES$S,T,7FGI]\nMF9ISW:I@)3BBW[.UZ9.3DRB7RVBU6M!U'<O+RYB8F!C:%:W6?+.1XZMI&IV+\nMJ:HJ9%FFUVU2QI=XF1./EU*I-&0]3/RPIZ>G4:U6D<OE*/'/S<VAT6C\\(8#?\nMXH3]'N/YYY\\795G^3*U6^P/3-#_9:K70:K70[_>'3KZTC$\"20D1KS.?S-_5U\nMLF541',DNB*)9C828:T698\\B;/8F2\\I5-=<LZ;`1YEH[B+4N^+7(CXW`5I--\nMTI$Q.S*,[2YE=S/$X(H=@ILF\\-6T\\HU&I^QK6RWYZ[HN;:\")XQCU>AW9;/:J\nM\\6FW*@CQ$2O@8K$(4131:K50K]>Q8_LNE,MEO/;::]01+Y/)T&0]2]K7&OVS\nMYQHA85((8!@&)B<G,3,]3Z^?(T>.0%$4W'GGG=B\\>3/Z_3[*Y3*JU2J*Q2+\"\nM,$2OUT,<Q[2BI]_O__)/?O*3?[U___X&)^SW)IK.!4'P6[[O_W$0!-LO7+@`\nMV[:IS['O^_1BEB1IR\"N!G!R$-),Q4/Y-?;U7ZEF'/1VNI7H@K<NRM[5&?`F\"\nM`#V3O:J3C4T^KB;Y7$M)VJB+DXU&T_HR2]\"JJ@XMH.G*$-*]QQY#\\E@D^9>>\nM^LX2!OOYCNJF7*^.?CU8EH6QL3&8IHERN8S%Q47LW+D3IFG\",(Q;WDV/E/V1\nM1;??[]-`(Y/)8'9V%@!H!0DA5R)CD#+4M1SUUKL^6#_K,`Q1*!2P>_=N?.A#\nM'X+9=W'NW#F<.7,&+[_\\,IK-)EYYY17LW;L7HBCBLY_]+`S#@\"S+L\"P+BJ+0\nM9/[BXB(,P\\@`^\"*`/^>$_2[BN>>>FX^BZ(NV;?_NRLI*J5ZOH]OMTA.&'83*\nMMN.2!`9[P9+R/3)EY&:\":+-D:Y\\FK(U&(*N-R&*39J.B;7*1I2-8\\C/63WF]\nM3L9KW6JS&G\":M,G7Y/B0B?&ZKD/7=;H[(B9,K,D3.UZ+G?%(WMNHZ)W5QZ_E\nMO;$:]FJ2#RD#S.5R6%E9H14FE4IIJ#'H5D00!-!U':(HHM/IH%ZO0Y9ES,_/\nM8WY^'A_YR$?P]MMO0]=U.O28['K8A?1ZGI_LB#*9#\"8F)G#;;;?APQ_^,/;L\nMV8/_][__+5YYY16</7L6413!=5T</WX<S683\\_/S.'+D\"#[^\\8_CSCOOA\"B*\nM-\"=%KO%!CN-+QX\\?_R^<L-\\%'#MV[%[?]__$MNU_WNOU9*)/]WH]6G%!6E;9\nMY`6YJ%FB9)L#;L3)MM$(FR0[V>$$ZW7QI4ET-<>U]201RW2&IJZS;;VD_&RU\nMZ'HCQ);NO$QOA].$/:K,3U55Z+J.0J&`0J$P--J,5(<$04`760`T!\\%JZ&FY\nM@CSVJ+*WC2Z:[&>4'N4&`(9AP+9M*(H\"UW51K59IV>:[<7[=B`B;M/\\+@H!J\nMM8K)R4GLV;,'V[9MP]34%$Z>/$DG'!F&@4ZG`UF6U_31V>BB2#X_3=,P.SN+\nMO7OW8MNV;9`D\"2^__#)^\\I.?X/3ITS!-$[E<#I5*!:[KT@7]R2>?1+%8Q/3T\nM-,KE,BS+HGH[J8T/@J`D2=(?<L*^N43]$(\"O1E'T4+?;Q<+\"`I:6EF\":)FVU\nM)1='NA58DB0:-;3;;=J)QGJ\"D&W=QBZJ-?R&Z>^E$;_'P%)5&JIS98V\"-D*(\nM@B`DMJE\"8G<IBE=L5I.?#]^+(A*[56#@E:TCG\\M!-PQ(@@PO\\.%8-ES?@Q`#\nML0\"($.@]!\"'Y.<C/(PA(OA^Z%R+(HH18`(08B!`!48Q8`!`E?Q7'$02(N&(!\nM)(`=NE6I5*$H\"C6]4E5UH$7VX;@6HM\"'X_;AV#UD#!V:FOB)RY*`,(H1A3ZB\nMP622.(ZOO+Y8`D2!$L)JA+W>YY^6C=([A6PV2\\L+F\\TFYN;FT&JU4\"Z7;_KN\nM[9JPAHUKN]V&[X48&Z]@UQU[L&?O+LS-SB.7R^',F;?PP@LOX-2I4S`,`YLW\nM;X9E61@?'X>B*+`L:XT%7+A2*1.+P`C_;$W5`2%\"(5_\"YLV;L>_.GT&I7,`S\nM3_\\`W_[VMW'QX@)$440FDP'QH\"<)1LNR$`0!7G[Y9>3S>>S?OY\\:<SF.`]NV\nM4:E42%#S+WA9WTW`2R^]]%\"KU?KJY<N7'Q($`>?.G4-ZZCB;--M(A+11_754\nM=!F&/O6?)@0)(4(<\"8@10I;4-?V*&XW&D+M?>M@NNZ4?:9`3$>E#H8,/)$F`\nM*,H0A!AQ+$!592B*AC@.J;&])\"F091&:FOB43%3'4*R4D5$R<`,?=M^$Z=BH\nM+RT#D@@)$L(XAA#'R7(3BXC%&%:_\"U5786@9Q\"(0^C[\\R(<LB!`5$6:O`UE5\nMH<H2_,A'X'H($2.K:\\AH.2POMB%+!AT82Z(YPS!@&`;&QBI#@W##,*1^'<U6\nM#<5R'EVS#;MO`Y*(8BX/(U^`)BL($6/AP@(B`-F,`57/P'=<M+H=\")&`3-:`\nM'T1T8;9MFR[F81C\"-$UJ[L6>)RRID\\^\"#0C8BB/+LJ\"J*J(H@F59D&49E4H%\nMN5P.P$\"/?Q?,GU8S5R+G3Q2!^G2KJ@Q!D!`$'IK--G(Y`W-S\\_C0A^[\"_OWW\nM0%5EO/[Z&_C!#WZ`;WWK6[3SD0RY-0QCJ!N4-(\\1(RD2++FN\"UW7T>FTD,WF\nML;)2P^;-MZ'5:B\"?+Z+3:<&V77SXPQ_\"WKW[D,FH$`0)LBS\"-&W4:C6\\]-)+\nM.'WZ-!86%H8\"G7*YC/'Q<1B&@965%7SUJU^%(`B8F)A`J52\"95F(XQBZKE,K\nM7!YAWV`\\_OCC?QZ&X5>7EY>QL+!`'<9&#5@E)_/-S<0S%XL0)7$EN?B$:!#*\nM,=^/N!^UL+#?KQ;AT1%8BG95AV)Z4&\\RC22\\JDM3%('(]Q!X2>-.QLI`R4G0\nM5069<AG%J(AJJ3SPQDAJ66GR+PX1AR&FIB8@B!'5FQ'%@!!#$\"((<82YN6FH\nMF@Q)$N!Y;F)HY9@``OB!C7*A`,2#0;JJ`C&77/\"%0@'9;!:E4@F>Y\\$T371;\nMB5V`:9H(O80(;*L+20!*Y3SR^0(JE0I*I1(RF@%1E+']MJTX<^8MG#]_'G&W\nMBWP^CVHIB6[]*(807S&[)_D#=CH0VQK/^I@0`F1M;MGHD760([+)\\+$7;XB;\nMX+4F?-.DG<WF:>*;R'+)Y]V%YWFX_?;;,3$Q@2U;MF#SYLT(@@#GSIW#$T\\\\\nM@2-'CJ#?[]-%CN1+B!S%^NFP=>ML5VB_WX>B)#7=Q6(9S683G4X7LJQB;&P\"\nMV[=OQ\\Z=.S$Q,8%FLXFEI24`0+E<QLZ=.[%MVS84BT7\\]5__-?[^[_\\>M]UV\nM&W1=1[U>1[E<IN/!2$61:9K(Y_,CZ_\\Y8=]`?/O;W_[]E965KY+2/-(^3C1H\nMUKR&[3I[KTNGUKL@B:Z>[HYC&P?6&E\"@*NI00BVM6;-F^X28KDSG\"!\"'(<R^\nM!=\\+T.UV:6*/.`/.S,P-(B$;GI>CID>F:<*V341Q\"-^QDTA43#H3\"WIV4#,K\nM8FIZ`HJ2?$:>YZ+;[:+7[R3E=J$`*:<C#!(3JN2B+:)4*J&0+T'3M,$4>,`T\nM>[\"L/MKMUJ\"R)R%4T[*0S6=1J510+E61R600AB&:S38<QT&SV89EVLAE\\XBB\nM9.2:XWB#A).!KMNEQYA<N.1[(JVQD3\\A&[:QAXURV<B;Y$@(2\"[E\"F''[YJ.\nM/:HZ@R3?B;<)F7%IVS9RN1QNN^TV[-FS!W?>>2?&Q\\?1Z73P^../X\\B1(WCS\nMS3?1[7:IS2PI762-HTB.@\"QT)&!@/56JU2K\",$2WVX6NZ^CU>IB>GL;4U!1V\nM[MR)^?FD;*]6JP$`-4,CU_7>O7L1!`$^\\YG/8&EI\"4\\]]13NN.,.?.A#'\\+9\nMLV=1+I>Q:=,F*(J\"=KN-5JN%L;&QJXRXHBCBA'VC\\'=_]W?W+BXN_I]+2TOH\nM]_O(9K/(Y7(T*EIMRO>M($EMA+!9CXRT-,)NLU?S#%DM\"<B6I9$J\"\\,P!N3I\nMP?,<Z$H)0>#1A\"O1'$FTWFZWH2@*BL4B\"H4<=#T+U[71:G70[C1@FAW8C@C'\nML2&*(@J%`DJE)#I65`F&D8$L)X0=1CZ,;`8E)VE>B\",)G94>XDB$+*LH%HN#\nMYH9D2DO@1SA_80F^'\\#U;/H^$JE(@Z0)V+IU,\\K5$B8F)F`8!BS+P>+B(NKU\nM!AJ-%A8N+<(P<H,&H&0;'L<\"=#V+[,!;W/63B4$D*B3'C+UGK6W3+=:LA)6.\nMPHGO\"`D>V`7Z73#K6]?G@WTOY/-7516[=^_&???=AVJU\"DW3L+\"P@,.'#^,;\nMW_@&U:MG9F:H7PYQ(R3!TZACPMH=L`,J.IT.%A<7L7W[=A0*!=QYYYWT\\0G1\nMVK:-4JF$2J4R-/1B86$!ON_C[KOOQJ_\\RJ_@M==>0Z_70S:;A:9I<!P',S,S\nMD&49ON_#<1Q:/40\"HL'GY7+\"O@$X>O1HY<*%\"W][Z=(EB50#L*23S69'CC@B\nM)\\^M#C*,@$1:Y+6S>MQ:DL=Z()V3V6R6R@6:IL'W_81XZROPO\"MN;,G/71J%\nMD^.MZQHRNH9RN0A)K6)B8@*V,PU!#-#M)I4YKI=X=^NZ-HB\"!A&5&\"<#61%!\nM566H:N&*$V`00122:+=8+\"*;U1$$+IHK+32;;=3JEQ&&,3PW0!A%R.:2MN-\\\nMK@@MJZ%8S$'3,]\"T##PO0+]OP;9=!'X,45\"P?_\\]J-<;6%E9@2C(F)Z:Q>3D\nM9$+4@0]1!\"XO+X'8Z)*=&CF?3-.D1$MN)`IG3;Y&>9.SWM&DBY6U`DU2L^]N\nM9)TF;,,PT&ZWX7D>BL4BYN?G,3,S@]V[=V/+EBT`@,.'#^,?_N$?\\.JKKR(,\nM0\\S/SU-=OE0J44,H<IQ(5$VB[+2'\"_E:TS2</7L6I5()T]/3V+QY,_6;/W?N\nM'):6EC`W-P==UU$NEV$8!GJ]'BS+PM34%.;FYO#**Z]@RY8MR&0RV+-G#[[\\\nMY2_C&]_X!IY__GGLW+F3MLRS_NID80;`6O9V.&'?F!/N?V\\T&IM\\W\\?4U!3=\nMOA&SEW24P-90DU7U5H^PR?:0)>RT;6MZJ@TU0`HQ<BH,N9$J&<,PZ`*@:=J@\nMVZZ(L5(9GN=0OP42@9!FE5PNAQ@1HCB$[?31;#91+.:1RQ60R:A0=0.Z(<'(\nM9F#;YN!B8`S_$=+I*NR\"2BIE2J7\\8`B`!D4%_,!&N]7%XN7+J-56H\"H:@L\"#\nM'R0#B0N%/,;&QE&M5I')&@!B],PN+EU:Q,K*\"CJ=#FS+@>\\GS]5J=:#K.K9O\nMVSE(8DZ@4JDD35.^AY65VE#4FV[283\\/MFV>;6UG/R]VI\\?ZN81A2)NUV\"J)\nM=_,\\'!5EV[9-)\\-OV[8-#SSP`.;FYA\"&(2Y?OHRGGWX:/_SA#W'\\^'$:K8Z-\nMC=%YEB1P8HVW6(=`MK>!'90KRS*RV2R6EI9PSSWW8._>O5!5%2^^^\").G#B!\nMLV?/HM?K86)B`G-S<]BS9P]NO_UVS,S,()?+011%+\"XN8O?NW5A<7$2_W\\?<\nMW!SNO_]^+\"\\OX_CQX_3U52H5>)XW5+9*QKDQ.R).V->+8\\>.C3<:C=^Y>/$B\nM)$G\"UJU;!YJF28F')3J6T&@2['T@B9#WD.Y8)+\\?56M-HY7HZM^Q5J\\DNK-M\nM&\\UF$Z[K(I_/(Y_/0]=UW'W778.+*\"$JDC'OFSTXCH-&HP%1!#S/0:-AHMEL\nM(IO54:V.HUC*(E_(((Z#0?2L((J2Z>V:IB51[*`U/(JDJVQ2HRA\"+G_%S2V,\nM7(1!C!@!=$-!M5I$'`N0%6F@D^8Q-C:&<JF:E/<AABPKB\"+`,FU8IHTHC*&J\nM&21S!D1<O+\"`VV^_'3MWWH%\\/H\\@\"`=;8PNVYX#(;+(LPS`,>C$3^8B0+=%E\nMTZ.^1LV49!/&;`Z%U;#)^7JSS]&-6)]NW;H5FS=OQLZ=.S$W-P<`>.655_#4\nM4T_A\\.'#\\#P/Y7*9SA(EUU\\^GZ>-5T1B(,>/Z-5IGW5R/#.9#(K%(C[YR4_B\nMOOONP^;-F_'44T]A<7$1;[SQ!GJ]'I:7EW'^_'F\\]=9;6%A80+?;Q:.//HJM\nM6[>BW^_C[-FSF)F90;/91+E<IHGB`P<.0-=U?.M;WT(NET,NEZ--<HDD%M..\nM9T;BZG+\"OCZR_DT`__7<N7/J&V^\\@6PVB[FY.>HE,#DYB6*Q\",=QKAJ\\R6Y5\nMR8206Q6K58FPA,U&WB,=]QBB9LV0!$%`N5RFCV7;-ES7I20*`.?.G1M$W#J]\nMB#*9#+(Y`ZYKPW5M:-I@MS*P@?4#%Z;5@21'R.9D*(H,54TN1C]PZ>LF97C)\nM:]2'/+H3/V47BB0.-/00411#$\"7D<D82V<?`V3-O)Q>BDBP2X^/CD&45G4X'\nMS78;%RY<0L_LH]?MTTH'25+H-OUG'_L$%#GQ_.[U>K11IEZOXZWS;\\-U;40(\nMZ0@V(@L5\"@6,CX^C7J_#MFUTNUWJ0\\-ZF9\"R/[9#D]WQL3LDMDJ$753?JR`B\nMCF/,SL[B_OOOQZY=NP``*RLK.''B!!Y__'$</GR8^I[D<CD8AD']0ES7I5*>\nMIFFTTY&8F!'R)!VHK\"4N.Y;L%W[A%VB-^K%CQW#JU\"FLK*Q@8F)B:&'H]7KX\nMR4]^0G?0V[=OQ^[=NW'BQ`D\\\\,`#6%I:PNG3I[%GSQXHBH)CQXZA5\"J1Q>2H\nM[_M[9%D>)Y4P:;DFCF,>8;\\3_.`'/[A;DJ3_Y+KNHZU6\"Z=.G<)'/O(1//?<\nM<_B;O_D;//KHH]BR90M65E:@JBH=,$`R^:PL0K+1K%[%NKF1)HRUL)&9@((P\nM>GKW1C1FUC*22!%$]F&-XUFPC1JN&U*)HUJMHEPNTZ2,[_MHM5I#^CZI:2;6\nML:^^^BKR^3S&Q\\<'SFM%%$LE%$L%!(&'B8D)>)Z#5KN!6FT9FJ:B5\"JA6JW\"\nM,#+(YI(Z\\^3]*A`$8[#5EP8:J0;$@PC59Z:.:TD$ZUF]044),<**X'L^@B!\"\nM%,68GY]''`N#4C$/G4X+BJ*AV6S@XN(\"7-=#'(>0%0E1'\"*,@D'3U!0*A209\nM&<<Q?\"^$95FHUY<'\"<D&^F8?NJXAB&*ZR\\GG\\U3K-PP#^_;M0ZO5PJ5+EW#Q\nMXD5*X&S.@1UND2YE(^9/9!(-6\\VTD>AZO3KK7\"['+(`^/9_(XM#O]S$V-@95\nM55&OU]%H-*@7Q]:M6S$S/4^CZC?>>`/?_.8W\\=133Z'=;B?5.H4\"/9>)7\":*\nM(@S#H._7<1S4ZW5HFH:QL3$XCH->KT=KK=DJ+L=QD,OE<.^]]^*11QZ!)$EX\nM\\<47\\?WO?Q]OO_TV',=!J52BGB6NZ](@0I9E//OLL]BT:1/5M;=NW8HWWG@#\nM81AB\\^;-N'SY,G7;M&T;!P\\>A&59AV9F9M!H-![R/(]&Y-UNE^Z>PC#D$?:U\nMX+GGGMLJBN)_<!SG\\Q<N7!!.G3J%BQ<OHE`HX/;;;X<@\"#A\\^#`.'SX,01`P\nM/CZ.^^Z[#[9M#VF\\Y$(AIC'$.Y<,2R5E7^0D9[TRWLMH)UU#3B(2]CVQIODD\nM,V\\K5^24(`@@2=(0<??[?5B6A4ZGD^B[`TV;2\"6DX^[2I4NX?/DR\"H4<)B;'\nM,3$QAGPA!T%0H!L*,KJ\"?#Z1\"+(Y/6G\\$\"0@]H\"!-(.DH1#)R*=@2+\\-@N@J\nM75@4`4TQ((C,!)J0E&7&B&.@T^Y1*2&*7#BN#==SX`<.%$5\"O^\\A#'T`$3*9\nMQ&JS7\"XG6W@C!U$$+,M&N]T=U/AV!I4P$0PC@TQ&1:>7U`V/CX]CQXX=&!\\?\nMA^NZ:+?;:#02<B?>-.QB*@@\">KW>$$%*DG25KTBZ]OI&5C$UFTUZGA!2BZ*(\nMDJ:B*/1U$U(CI7K3T].01`VU6@TG3IS`#W_X0[STTDNTO+-8+`XE[EGK!+)@\nM!4&0)('S>01!@$ZG`],T(<LR/;>*Q2)LV\\;*R@IF9F9P\\.!!S,W-X:677D(V\nMF\\79LV=I]9=IFJC5:O`\\CY8,$I,LW_=1K]=Q_/AQY/-Y//;88XBBB$JCK#Y>\nMK5:Q9<L6,F5FQ?.\\USS/>XC4C!.K`*:SF$?8&\\&SSSX[$03!O^OU>K]7J]74\nMBQ<OXL*%\"UA:6D*OUT.KU:*N8)_[W.?@^S[.G#F#4Z=.X<B1(U2/'1]/MLLD\nM(4%(V;9M>K*1BVJUR/6]T+!9E[Q1I7N>YPUMGUE-E1VB2ZH[2!1$9(GY^7FJ\nM37>[7>JS0II@;-L=2I!YGC<8ZN`@DU%1J99@&#HRN@952[:8(KV(PX2T<667\nM<271)`PBVPAAF!!P&`)1A*2%7DS^!T*4=(J*(@2!5,0D;?1Q)%!I15%BQ'%2\nM0YTD_R+D\"P9$48`WT)8U34.Q4!Y$QSG(LHR5E6224&.EB4:C`=.T!UMR!=(@\nM`JU6J[2=6==UZDV2R63P]MMOH]_OH]OMTA(V=FM?*I6&.A_9G`KY6S;\"3+>P\nM7R\\(6;%38<@\"1YZ+5+_,SL[BKKONPIUWWHEBH0@`>/OM\"_CQCW^,)YYX`B=/\nMGH3O^RB7RS2J33>^I+L\\T^6*[.Z62\"0+\"PLH%HLX>/`@]N[=BW*Y3$VOR&\"'\nM^^^_'[(LX]*E2_CQCW^,\"Q<N0)(DO/766U16*1:+R.?S>//--]'O]Y'/YW'O\nMO?<..4M&481<+H<M6[90C^Q,)K-BV_9)R[)@&`;]6T+8`X,Q3MAKX?#APVH4\nM17_6:K7^;;O=5A<6%G#AP@4L+R_#MI.:WFPVBUZOA_/GS].\"]YT[=V+KUJW8\nMNG4K6JT67G[Y93IM9&5EY4KCQ<`DB\"VY(A\\2.5'8B2[O%5C\"'N6LU^OUZ#!>\nMDJ`DG7^F:4+/Y&DIE2S+<%T7R\\O+:+?;D\"0)\\_/S,(Q$$R;3-KK=)-KL]_OH\nM-EN#_T\\\\2)+2)PNV;0)\"`%63(`@11$D?M+K'B`<71M)08P`0KU0]Q'(29L<\"\nM!)#6:\"GY6F`M7!-OE=!S(8A`3*/6X:18TL(-2LBB1*J\"9.A1A&(Q#]M).EYE\nM648NEX.6D1&$#FS'QX4+R05O60X\\WP:$$*($2%(,04H(=].F3=B\\>3-45<7*\nMR@KJ]3I=*\"]>O$@)(9?+7>7-/3<W!\\=QT&ZW:94*.TZ+&%5=2RGF.RD-)65V\nM[&).IK*,C8UAZ]:MN....[!]^W;(DHR%Q06<.7,&WWW\\29P_?S[I!(UCNG\"1\nMG`=I*U]KP2\":L\"`(]+KK=KLTV,KG\\[CCCCNP?_]^Y/-Y+\"\\O(P@\"5*M5=+M=\nMY'(Y;-Z\\&6-C8]BQ8P<$04\"GT\\&I4Z=H66JGTZ&EJ;9MX\\477T0NE\\/>O7N'\nMFIH`0-=US,[.TL!-DJ25,`R[)#]!=IDDF!M\\GEP2&86GGWY:=1SG]_K]_K^S\nM+&OBN>>>HY$A(6JB=?5Z/:J=R;*,Y>5E&D*R]0X``\"``241!5`',S<UAW[Y]\nMV+)E\"QJ-!BY=NH3EY64T&@WJQ%4H%#`V-H9L-DLG>UB6!=NVW[4NR/46A+6F\nMGK.9=I+5)K(.K<\\65-I\"32[:?K]/2QY[O1Y*I1*FIJ8P,3&!7\"Z'L;$QFN$/\nM''?@8-9`J]6`XSC(Z(EG<*%H4&\\(25:`V$<4A0/O%$\"2!81AHH-<><WB('H6\nM@5B$+)&(<M!)2#KS!X0M:(-.3I$<APAQ/-BF\"LD8*<OJ)T,*)\"\"K&8CC)\"KR\nMP@!!$\"&,141Q8JKE^18\\WX)M)>_+LGOP/!^NZR&*`LAR4GIF&#DHFHZ=.W<A\nM\"&-ZO(B=:[U>1[U>IZ5J[.!=15%0*I5HW3(I,2T6BUA86$\"GTZ$1*$EZKU:C\nM?;T$WNET4\"@4:+MUO]^':9HTL;=ITR;LVK4+/_,S/X-RJ9QHU:??P#///(.7\nM7WX9/WKN.*V0(8&.+,OT&DF7Q;*[OW1$30H`B`=.-IO%S,P,[KKK+DQ.3J)6\nMJ^'2I4O(Y_.T_ILLRIJ6)(;'Q\\=IE^*)$R<P/CZ.2J6\"?K^/5JM%J\\/(N4VJ\nM/M@I3<3#.Y/)H-/I0!3%1B:3:9)Q<<33A&U6$T611]@LCAX]*OB^__E^O_\\?\nMEI:6MIX_?QZU6HV>7*S!/-&7B8Y(:C9U78?G>6@T&K1,;6IJ\"L5B$9.3D]2O\nME]S.G3N'L;$Q5\"H56E5\"/G!RXMWL.NV-$O:H+L4XCE$H%&A\"B9C:3$Q,H%`H\nM)!UHEY:ODDI(9YZF:31!YKHN.IT.3:CE\\_DD>HV!R/=1*.20SV=AVS94+='!\nM2^4<@!BRFI!K%(4((Q_\"0+Y0%`51F)`O(6MA$%$G>H<(`2*-MA.'PL$B20[+\nMT%62S/<38A]2%`!1``P,K*(X@\"PGQC]A%`)A-!AB'$.6)6@:L5$-$881HCB9\nMQETHY`:S'@.$40Q%D5$L)1):KE!)R#A,&BK(SJ/=;M../R)CD\"XY4C$Q/CZ.\nMJ:DI`$\"A4$@6N,%G<NG2)1III\\V7-CY1?&.H5\"J4N(G%:3Z?Q\\S,#\"8F)G#@\nMP(&!5BVAUT\\J+9Y]]EF\\\\,(+.'?N'(J%9&P62]3L.<1*/*-&S)$V=DW3J'2D\nM:1I*I1)F9V=1*I5@FB;:[3;R^3P*A0)$4?R/81C^6U$4,3T]#5W7:0XFG\\_C\nMKKON@F59$$41__1/_P33-&GK>ZU6HY(5L:TE>0+R.9&>`B9?LO*QCWVL\\:UO\nM?:ON>=XXT:T516%S8#S\")OC.=[[S:+U>_T^-1N/N5JN%E945U&HUM-MM3$]/\nM4^V4E$^19&\"Q6,3$Q`3:[3;.GS^/>KU.L\\,DB;*RLD(CZ2U;MF!F9@;U>AV7\nM+EU\"L]E$L]G$PL(\"EI>7D<\\/ZG@'@SIO!8R*LMB&@VPV2Z/K4JF$^?DDJT]V\nM#+*4H9(023\"R9$#*K8C)/XF^*Y4*#,-`5C6@&QHJX^.HC%>!*(+OVP.))H;O\nM>P-R3?3(,/(!R`/-4H`L:X`P.-7C`1D+4D+,L3`0K<7!SQBB)E\\'@Z(2`<G?\nM10-BCP9VM&*B!2NJ`%$4$JFC/_\"_5I/:7U&6H&HRK18*_`A`TL#A9WRHFDPG\nMURB*@D*AA'*Y!#V;0V.E`44UX/L^VNTV+EZ\\B&ZW2XVG^OT^C9:)'W>U6D6E\nM4H&B*+14D$TLCDHB7^MHK(VB6\"RBU6JAT^E0;XX[[K@#>_;LP:9-FU`I5Q`C\nMQNDW3^.99Y[!<\\\\]APL7+J#?[T/3-&HW2J:CD\\B:)#!))<NH@()((:[K4K*=\nMFIJBE2MA&.+UUU]'O5Y'J53\"/??<@]MNNPV^[_];554Q.SL[)*D$04`EP&W;\nMMN&SG_TL3IX\\\"=M.O&HF)R?IP`K/\\]#I=(::7U@?$Q+`B*(8!D'0&G#,R3`,\nM'TI[G0\\^JP]VA'WLV#$1P,\\U&HU_L[\"P</^9,V=P^?)E>M$8AH%\\/H]:K4:3\nM\"5<\\+JZ,&B*E>B2S2TY.0F3S\\_.P;1OM=IL^9K%8Q,S,##1-P\\F3)VGQ?:U6\nM0[?;Q>SL+,KE,M4\\WSD8S^M83+;P0_>)S>I:]JJ)'>OPWT=Q.+!GC>`Z2?;;\nMT'-)U]?L/,;'JPC\\\"+U>#[?==ALE[&8S2:SU^WVZH)5*!401*3T+$FT:$1S'\nM@JK)F*R,(1\\F$98@BP!\\\"\"*1*22$H8\\H4@921?(ZDXA:3J)G0;D2)@N#8Q+'\nM`]]K`:$?(A8`28@0\"Q(D\"`@A0!CX88LB0]C)'AN``LA2<H\\(:DZB[![VVO\"\"\nM/N)8@:[DX'LF)%&$*,;P0Q]1$\"/P?41A.-#-`4-7D36TH2Y810D1!38*.1V7\nMEQ-)K=UN(XXB%/+)<(%Z;0F\"*%-?ZYF9&<S.SJ)0*-`\\0D($B;UHK;8TR!\\T\nM$01)&WY\";N$@.1PB3LS`!Y(0RX#BFN?):O<+ER[##UQD-`-;MTYAUQU[L&/G\nM-HR/34)1)30:+9Q]ZTT\\=>P9//7T45RZN(A<WL#\\IBTHE\\M87J[3BB%!$&BT\nM2\\H51\\F&;*FAHB@PS1X\\+\\#\\_!P.'CR(<KF(EUYZ!:^^^C)>>ND5B\"+PVFLV\nMGGKJ*';LN!V//OIQ[-]_#_W_.([I;H8<UUPNA_W[]^,W?N,W</CP8;SVVFL8\nM'Q^GPSZ()$5D*K9,EE2$#>KJFP\\\\\\$`$`*9IOB:*XD.LZ1.S>_A@$O;KK[^>\nML6W[?[AX\\>*?OO[ZZSO??OMM^CM2I<%NX2N5\"M65?-^G)PR)MLG(>N(G3#*\\\nMG4X'<1SCY,F3F)B8P/3T--6Y%Q<7:3'__OW[L7?O7BPM+>'4J5,X??HT7GCA\nM!60R&10*!>S;MX^:XY-&#Y)Q)]M?MJ0N'1''L8`X''3J>3[B6(`D\"=`T!9JJ\nM`;%/+]0X#@%A4`TQJ(08&F@0`X(@0DK**`!$Z'1Z`\"*(@IIT`<;)L(*D$D`;\nM7&Q)\\H>,;>IT.KAX\\3R6EY?1Z;8&)[`\\<.%3`81H=^J)]X=@`U(91BZ&@@P@\nM14#DPO4\"1$Y$6]H%04(FDTW>.WW_,@\"5UEQ?\"5D&J@A$R)J,]'0#*9ENL/9\"\nM*#!$1AX_CI`Q,IC6QY*&G\"A&KW,!DB1\"`\"!#A*3*,-0L@M\"#[WMP82.*`X2A\nMA]`/$`4\"HE!\"&,B0Q`S.O55'IVVAU>K0]F4MDX&DZ8CC#\"Y=7L+V[=NQ?<?M\nMR.?S\",,P::\")DM5@K%Q!K;Z$M\\Z>P\\+B170[?4\"(H\"H92+*`*`P!@?A>\"P.B\nM)>__2D0>10FA1S$0A3'B.-'RB\\7$.L#W!XU%@H@HC`8N>XGM[98M\\]BT:3.V\nM;MV\"O7OW(9<ST.WV45]8PC_^XS=Q\\N2K>..--Q&&/J:G9Y'+&9`D!;;M7I54\nM3.\\*6`=,=@[GE2HF!Q`$[-]_-W[VL4]@8GP*QU]X'J=/G\\*%B^?0:-11'2LG\nM^1'70KE<QG>_=PB-1@.___N_#\\?QD,EDT&ZW,3<W!TW3T&JU4*U6\\?;;;^.Q\nMQQ[#V;-GT6PVJ13B>1YV[-B!39LV49F*:.B%0@'=;I=6HBB*LL*0^4E!$)#/\nMYZET0@*V,`Q;'RC\"/G'B1'5A8>$/3YPX\\4=OO?76!-&7-A2GID9;D>:.(`C@\nM.,Y0@H#\\/1F22[9\"M5J-ZHWL[+^O?>UK^/_9>]/8N-+S7/\"IO<BJ8E6Q5E:Q\nM6-PIBB*U=$MJ=:NE7FQWISV9Q(AM^-H7]^(FODD0C&]6)P,$F5_!_'\"2&>`&\nM2(``R742-,;!Q':<V+VXW9)::NTMB91$<=^*K'W?]W/F1]7[ZF.9$M56[-B9\nM>P\"!$BFIJL[YOO=[EV>QV6P8&!C`RR^_C-=>>PWA<!CS\\_-87U_'VV^_C:ZN\nM+M;\\]?E\\,)O-K%Q&CC3T>O1>1&SW0RE3+0^M6I\"FQBZ(6RN[VNW+HJ\"L%'M_\nM'1@80\"Z70RZ7P_W[#Q\"+)3`R,H*AH:$V#,W0[O>7>=ABL]G0TV/$V/@(DLDD\nMZO4:*I52NUQLX5M[;19H-+VPVTTPFK10J24`=4@2D2\\4N^W!9\"5_Y6BJ4+=_\nM_YCAK6*?KX^M7@`9,A3\\>FB91$@:*)429#30Y_\"AV:@Q*[,I-5JX;$D!N2E!\nMI]6V9%45330:K4-3:C;0D.N0VIK=>JT&EAXC\"P/5*B74&A+JS08FQR=@[K6R\nM!\"AE>&JU!I(,S,W-(5_(\\EQ%H92A4JFAI#-L'SUT21)[W*UUT<J^92@4:L1B\nM,3:%5JNU[>\"D05=7JTJ=G)R\"3J?#X<.',3X^CDJE@F@TCI65%?S@!S_`PL(\"\nM<KD<M%HMC,9>;J6)F/C'7:(G*K5.9%GF-3<Z.HH#D^-X_OGGX7:[\\>#!`UR_\nM?AW+*XLMIQUSBQ9>K95;O?Y>,TJE$N[,WL*_?/<[>.7E3T&OU[,RI&CY9C:;\nMF7A$GI)6JQ5'CAS!\\/`P4JG4+A-FRIK%UH@LRQRP[7;[@V`P\"+5:C5PNU\\G!\nM^/^':_KY\\^>'<[G<;X?#X?^RO;UMB$0BK/Y%0[/'76+PHX$@!6Q):I7](I-K\nM+Z))I5+AWJU&HV'<J21)&!L;0[E<QO;V=IL8T@.SV8S#AP_CR)$CN'/G#A,D\nM[MV[AY65%3B=3KC=[EU,+]&X5RSAB%DF,A/I<-F/I?8DPR>J)$C5+Q:+L?\".\nMP^'`Q,0D5R\\B15^K5<.H;,'YBL4\"$HD8XO$XBL4BM%HM[)I>F$P]<#I=4&L4\nM4\"C4:#8:J-<;[=?30:760I8D;H.T;WP[P_[)\"A>)$K*,9U8\"2HT1J%>A4,A0\nMJ11H2HUVUB<!:$*E5J#14'+3O%Y_.-R&W$(H=.F5T'?76&>]-9!20:/3PN5R\nMH=MD1%?W0WAAN5Q&+!Y$,A5':&<;C6:-86V=3,;]`J(LN-9THH5D68;-9N,>\nM;[E<9B2&T6B$P6#`S,P,CA\\_WHHXR22:S2;.G3N';W[SFR@46F)=A)JR6\"Q0\nM*I6[LM+]KEJME0$3I9]$GEIL4BM>>.$%C(X-PV:S87%Q$6^__38N7;J$6\"S&\nM8(%D,HEJM<K#\\GJ]CF@TBALW;F!D>*+U#-JS%KJ'I,29R^5X_5LL%HR/MPX'\nMD\\F$NW?OLE&VJ/4B]K%KM5I\"&-#.;VUM,6>A0[8B\\>\\Z8+_SSCO'R^7R[X5\"\nMH5]:65E1K:ZNHM%H,,6Y6\"PBD4@\\T8+8\"Z=*OZ<^%:%&Z&%T>N^)IK7%8I'=\nMD7T^'\\/Z&HT&$HD$DLDD+!8+K%8K45<1#H>QM+2$C8T-9K91X!;=1XQ&XR['\nM##K5B?DERJ+20.1Q`Z?]-DTL%F,!F^[N;D9[%(M%;&YN(I%(P6:SP>-QPV:S\nM<4^PV:Q#EIJPV^VP6,RP6'I@L5B0R^5:9`6G#7:[%1I-.]N7FX+I`VE\"*UO9\nM+6?%8K`F^KGR)Q:L]RS=6W*%C$67Y28J50V4JI9?9:U6A4HE0Z6J0Y);A[C<\nM:!^F<FN@*4MJ0*GBM:C5:J'5=Z/+T#KP=%U=4\"@4*!:+2*?3K:%V,(QH+`R3\nMH1LRFKNTH\"D1H<3A21*6O=8#O2:A'F19AM5JQ=#0$\"8F)N#U>C$T-,18YD0B\nM@;_\\R[_$RLH*M%HM@L$@!@<'F3%(F3$E&13L'G<1C+35JV[M*Y/)A,'!08R.\nM#L/E<C$N>G%Q$>ET&BZ7\"Y(D\\=HE++92J61D![4^+EVZ!)U.AZ&A(6Y+TE\"1\nM!I\\`X/5Z<>S8,0P.#L:ZNKJ^E,OEWJ/6)05I^K,(UVLVFPEAS63-9C-7+<)5\nMQ[]'IN/L[*PBD\\F\\L;V]_97-S<W7B*[;:#1X\"$@L.M(5V&]!B$%Z+_,!REBT\nMVA;MF+)<FDR+@5!DZ]&O[>UM#`X.8FQLK*U_T<V8SE0JA;6U-=AL-MCM=IP]\nM>Q8S,S/8V=E!,!A$*!1\",!ADW*W'XX''X^'`62P6=S'*:+&())A.&Z*/>UDL\nM%N[/B91@RN#OW+D#N]V.9-*+OKX^SJ3,9A.Z#7K$XW$8C8:VUK2!40\"F'@/4\nM2B6:C2(/3A4*)=1J#91*]4.DA\\!F?-B[5G6T;OX-+ZF)IM2$2J.&0J<#&C4T\nM*T4TFJWY0%.6(<D*0*%IX<=5@+)MW2;+*M0K=:A5ZC8VNQN52H7;`,34*U4K\nM2&=RK\"72PH2W3!TT*B6:4GV/V8;\\L0ZE/;M);3PST;3-9C-&1T<Q-36%X>%A\nMF$PFI--I`,#7O_YUO/ONNSS?R6:S>/;99[EE(%:'5(4]B98)*182.85TJ(>'\nMA^%T.A&/QR&CR8:VK[[Z*AJ-!N[>O8MKUZXA&`Q\"K]?#X7\"TY6Y;CN5:K1;Y\nM?!XW;]Z$7J^'T6C$P,``[WDBM9#^]L#``\"8F)JZKU>I7CQ\\_7OS6M[[%AQE]\nM-HH'(O10I5+%Z;,4\"@6CV^W&O7OW,#T]C4:C05EV\\NS9L_*_FX!]Y<H5;2Z7\nM^U(T&OW=4\"@T%0Z'D4JE&&YC-!JYD4]@=A'@_KB+3OY'+5YBG%$?C[(%LC8B\nMW\"BA(JBL(H947U\\?\"H4\"KERYPOH&9,1)1)-L-HM<+@>;S<84=Y_/AV@TRH$]\nM$FDA``*!``=&<MGH'-1T]MR?IB5\"@U!14YB\"\"<']6G3S+%965F`VF]'?WX^A\nM(3]<;D<;3ZR!H;L+6HV6@W]K(*.\"7&^V42&J=F:M;\"%7Y/:03`S6]+V?8*!^\nM5`72RI`?9K9H9V*54@7)1`KE2JEMVJIHSPI4;4=Y\"2J5`D`=LJ1JF\\YJH=8^\nM=)1I-ILHE,HHE(H(AV+0Z'6HU9O(9#)\\2.OT&FAU:M2KE5US#3$@/LGS52B4\nMC[3O(J04.:V,C(RPUHDLRT@FDUA96<$__,,_8'EY&>5R&>ET&GZ_'\\\\^^RQV\nM=G:X9TV5*.T+DBN@H?+CUE\\^GX<D2?!ZO3AX\\\"\"\\7B\\`L.\"36J/D3)KH_4ZG\nM$\\/#P_CC/_[C7?9TH@!9I5)!.IW&U:M7,3X^#IO-QG,8>O;5:A4'#QZ$6JU>\nM*)5*+Y\\Z=:K<[D=C86%AU_X7R7!LH:?5)H188K3;[4BE4M#I=(Q&`Y#X(4K`\nMS^+UWGOO650JU:\\%@\\'_MK*RX@D$`LP(HYM.O571<9H4]*C?M=^&%/WT.IE^\nMHGPE9>3$:A('@73*4I];#&X$RJ<L09(D9#(9*)5*'#]^'(E$`HE$`NET&LED\nMDC5)1D='(4D2$HD$]\\!;>A1%9E(2BH6R!GI-VOBB2>N/TA(IE\\M\\KZDO3X=5\nM\"W=K:6?[>60R&8;V!8/;,/48,#4UA6:SY90N\"F%I=6IH5\"K4I08'8T6;Z*)0\nMMI>N)+?0*K*R/2/MS*P5/_&@O4L(2VI`J]6TWZ,,J5Y'(IU\".!:%+,NP:VS0\nMZM1MXD[[,\\B`U*RC*4N`]%\"3NE)K)1NDM5(L5]&0FHA&$N@R&J#O:I7K9'Y0\nMJ[>&D#J-^H?ZSQ_G0.Y<_YUKI5@LPN/Q8&QL#-/3T^R!N+&Q@>WM;;SYYILH\nM%HN(1J-0*!0X?/@P5\"H5=G9V8+/9.#B)^CFB*<-^%S&+'0X'_'X_.\\`4BT6&\nM`2I5#QF/E.4.#`S`[_?CQHT;N'GS)A*)!-QN-S,RZ=\\V&PJLK*P@D\\E`I],A\nME\\MQ=MQ&>5`6_.;ITZ?+XD%\"4@W4FA3O-ZT1$272U=5EI'C2:#3$1.MG.V\"_\nM]]Y[`XU&XS<E2?JOER]?-E$0:#:;;&$OXB7%X$J!FT[R_<HN49=6'\":*N@\"=\nMHO=B;Y.\"I,%@X#8%]<`(\"D@]MWJ]CFRV-=&G%LLWOO$-^'P^#`T-P6AL(06\"\nMP2\"KGY%^@=_O1ZE40B`0P/KZ.D*A$`NH$W'';#;O<K6@@/TT&;8`.T(NE^-#\nMAPY&<JWNZ>GAPX($=VJ;%2PL+,!H-,!FL\\)NMS-#K\\_C@L;8HF=#Z,$#JC:Y\nM1=76!\"&,-4'KA(#4II__I.:/8K!N#0TE0);1D&1`:J!<K2\";R2.;*Z!+KX=*\nMHX%:I4%3;D\"AD%I!NM%RSY&:+5J]7*^C5,@AGDPA'H\\CF\\VVD@25!FJM!CZ?\nM#]5&'85BF?NJQ+JC7PJEO$L/AE3C2#UQOY:@F%6+)@\\`\\,8;;\\#C\\6!H:(@=\nMA*Y>O8H?_.`'N'OW+N+Q.+1:+49'1V&U6I')9%CYCEZ?R\"G4/J#@_23DL6JU\nMBM'141P^?!A6JQ6%0H$);/W]_:WAHJ:E64TF!V)O_C=_\\S?Q9W_V9[ATZ1++\nMS)+D+_$F*$@['`[&4=-@W6PV8WU]'9(DW=T%Z4@F.?GJW$.BR[U>KX\\+>\\F8\nMR62X0O^9#]BW;MTZDLOE?F]C8^/S2TM+FG@\\O@O60]-;45.:`BYEO.)-(XOY\nM0J'`4UDJ\\>G?Z?5Z/B%%$]K.@+X73I1.6GH]>H_D=$TH$](EH45$,#U\"L>1R\nM.<S/S_-0D6C;%'@W-S=1K]?A=#IQ\\.!!3$]/8WM[&QL;&UA86$`L%L/6UA;L\nM=COZ^_LY\"Z/RCLHU4>B=H'HDG$_WCBH$>H]DBDN?51R6B/*PHAL*T,)EZ_0:\nMACY22X>F[39[BTI]ZOBS7*YJM5I`J=D;8B@K(#<:D*3VW$&M!F0EZK4:9`7V\nM='1_E#GPCYI=4T\"DA`\"0(#7K4.MTJ)9*\"$4C2*224.OTT'<94\"A54%<WT403\nM<K.)<JV\"<J&(;\"&+4KZ`2J6&7#*#1JV)2JW.R\":U6@V51@N5IN6N(BEVW_M*\nMI0(92G8)9Z@>L$M?G=:`V#.FO4/\"4,&=*%PN%P^$Z1D=.G0(APX=PL#``'I[\nM>Z%0*+\"^OH[WWW\\?ERY=0B`00+5:;='.VYESH5!H,SE[F+EI,IFXOTM[A%J6\nM)%.\\N+@(A4(!E\\O%,ZBAH2&,CX^C6\"PB'`[CN]_]+MQN-WP^'WIZ>G;)^;K=\nMK?=/]'TRR*:U_\"N_\\BL,+VPT&A@='<7Y\\^=Q\\.!!='5U(9?+L9-4*!3\"]/0T\nM5E=7X7*Y$(U&B3FY:Q'I=+H-I5(Y1-4)M41%5<YV\\I00>]CD^%.KU6\"Q6\"C8\nM)W^F`O:Y<^<^&8_'OY!.IW\\Y%HLA%`HAE4JA5JL]M6,+E>]B3Y<6,$'@R+V\"\nM!C\\T=\"@4\"OLR$45W9M%Z23P`Q\"DRE6QT2(AMDWJ]SHLGF4Q\"I5+!X_'L&GBN\nMK:TQ4_/PX<-XYIEGL+.S@^7E902#0>SL[,!JM:*OKP]6JY71';(LHU`H()E,\nM`FC1G(FE*4+`*,\"2'.I^/<8GP;@3HY\"&1ZE4\"J5RBYI\\Z]H-UI!VN?K@\\7C@\nM=GM@L]F@UNH1#86@U;8TB77Z;JC4[0#>!!I2'1JM=L\\,FZJACZ,WWJG[3:[:\nM>SWS5@8J0:UN89:5:C6T&CWTW4:H&E4H-6I($K`3CJ!:+2.?S[=IS7D.8`I9\nMAEZE@]1H[NI_BHXP4O/IJ.252H6'YJ3@1_R\"0J&`0X<.(1@,8G9V%FJU&F-C\nM8SAV[!C&Q\\=Y3A*+Q7#[]FW<O'D3BXN+2\":3;%K!6;[0-A3W`I7^75V['7^H\nMI;:ZNLIT<E+7.W7J%/K[^UG\\JE`H8'Y^'N?/GX?1:,30T!`.'3J$P<$!?.(3\nMGT\"^D&67'I'4UM/3@TJE@H,'#^(W?N,W\\,___,\\(!H-()!+H[^^'1J-!(!\"`\nMU6KE`X4T20@-)2#(]!UKX&L`_E(,U+NL\\]IK2:%0Q(7U913;4\"*D[Z<^8%^]\nM>E53J50^GTPF?R\\8#!X)!`)()!+(Y_/,^\"+DQ]/V'SOM[L5,5Y(D#A@4X`DG\nM^B3!2A3$I\\4KMAK(L$!$E^QUB.R5S5.OWF0R<8E9+I>AT^G@]7IAL]E0J]68\nMZIY,)A&)1)!()!`(!+\"QL0&=3L>.T\"2Z1,/:3\";#^LLT7\"4(5><F?$R8Z_@J\nM?E]N9WA**)4/VR75:A6%8HL$8M)WHURNHER.(!))8&%A\"3HMN:-H,3T]C>YN\nM(ZQ6*RQF-71=>D;U*10J%/)Y0*G8=0B+SV&_%E`GPJ?SW]*!MA>Y\"I#0E%J!\nM)Y%(8\"<4PL[.#G*Y+!L*MZK`VJYGSN^S[8@\"2084RCWAI;(LM^]DQ_NFAO@^\nM%\\F!5BH5]A4D^)\\D25A?7T>CT8#'X\\'(R`B.'#F\"L;$Q9B!N;V_CZM6K>.>=\nM=S`_/X]FL\\E\"4X2]WPME10<E'1CT=\\4#3Z%0P.OU0I(DA$(A9+-9G#AQ`K_X\nMB[\\(O5Z/?_F7?\\'\\_#P/6T.A$+<56ZW#;<S,S$!&DP\\BRO!%HHU2J<21(T>P\nML+#`P(3N[FZ$PV'8>ET8&QN#P6!@+>N6;&]7I^\"4LF/=W%>KU3PG$U4#Q?:2\nMF&'+LJSOG!O\\U`?LRY<OFPJ%PG^-Q6*_F4JE!A86%AC7*[8V2.WM:0.V*'#.\nMDJ#MUS`8#.R3)[X^_=TG5=,33\\S.Z;SH!D*?BP(D!6!QR\"/B:95*):NW:;5:\nM='5U<;8<B[6(*,UF$TZG$UZO%X.#@RB52MC>WL;FYB;B\\3BVM[>1S^<1B\\70\nMW]\\/K]<+@\\'`&%LZJ$0M8[H'E-4_S=4J2U50J12[X(9HFP6T6)@M7'FS44&I\nM6(9\"D6NC1M186EJ!4D&RK@\\9I'J]'DJ-&M/34U\"J%;OTGXEHH5*IN/P6@WDG\nMJD;<8)W?(V>0;#;+0^%T.MU&([5ZL@JES/,+*M-;C+DR4JDTMWOT>L.NH;#<\nM;$*6&U`J`$5'H&XVFY\"E)F19^=B`O5^SA]:=V'L7^ZZY7`Z#@X,X?OPXGGGF\nM&9A,)@#`QL8&=G9V\\.Z[[V)S<Q.;FYNM0:K=#IO-QN86G0[EXAH6]P^UY0C%\nM0N[FP6`02J428V-C.'/F#$Z<.`&SV8P+%R[@_/GSN'OW+B<:+I<+A4(!6JT6\nMQ6(1P6`0W_K6M_#BF1<P,3'!YAE>KQ<JE0J12`1&HQ&Q6`R2).'8L6-87U]'\nM)!*!P6\"`R^7\"\"\\^?Q?CX.$,1Z9\"A9(TJ`0\"UCONZ9C0:6551=*07[D7IQ1=?\nM+(H!6VR[\"E753U_`_NBCCSS5:O6_12*17UM>7K8L+R\\C&HUR4*!!%O7E*!/=\nM;VCR)\"T1ZN/13=5H6GK+O;V]R&:S\"`:#B$0B(+@.#1!)N>OCX+@I:^X,PG1(\nMT`:B;(OZ\\&*[1\"PKB?E&BY]:)W2/1D9&D$ZG6?>$AB]NMQL*A0*Q)2\"?60``\nM(`!)1$%46`P;&QM87%S$M6O78#`8X//YT-_?#[/9S)N.RD*J`BC0[7__]\\^P\nM&PT91+JD!:O1:J!1ZQ`/QZ!J0]M:;N,D*=K*\\+4:?=LMIHERN8):K8Y*I:5!\nMH=)H\\*UO?0M0RC\\DO4F_R.'C42;!%,C$MI4X^:>2_J%HDT9P#@*6EY>AUCP\\\nMI*FMUGH]-0S=NH>OJ5\"BV9`>DBP:-9B[=%!\"!I2[O1@;31D29*A5NJ=:_XE$\nM@F<7%&2)X`$`G__\\YV$P&.!VNWE@M[JZBG/GSN&CCS[\"O7OWH-%HV%F):-JB\nM5=E>C%I1.J'3K:BC%XR1D1'\\PB_\\`DZ>/(EH-(I_^J=_PL6+%]O52HXK/@KZ\nM-$_IZNK\"[=NW,33LQ\\3$Q\"Y1+%*(;#9;!L=JM1J#@X,(!`+0Z_48'1W%J5.G\nM8#';X??[<>7*%5;>I%8EZ0NU9S6[`K96JTV1\"3=E\\WM4I(F.Y%$OKM.?RH#]\nMP0<?3!4*A=^-1J-?\"@0\"6A)8;S:;,!J-NV!G/PY7#+$4$UL3U(,;'AYFO8Q(\nM)()()()0*,3M@2<=2HE966<?5`P4XM!*EF46\\B^52NP&38%3'!#1\\)#@4R3L\nM'PZ'N;PT&`QLK]3=W0V52L68;;_?C\\W-36QM;2$8#\"(6BZ&[NYOE7NUV.R-P\nMQ,#ZM\"V1UKV7?X@!UC(A:$G8*J\"$4OE03[BU49IHU\"683.;V(.?A<+=<+J.0\nM+Z$A-]!C-D!62+O0#9W9WN/:(ITHH<[?&XU&#MR%0H$#7BN@US$R,@*EZB%E\nMG&4V:RTRA]/I;!_(C5T#<KV^&VJ5`<I&!4JTE`7%SR#+K2QZOY;(?CNEN[N;\nMA]_D=D1:T4ZG$\\>.'>,@G$ZG<??N75R^?!FW;MW\"SLX.:U63OR)!5VE_[(62\nM$/<!M?`(`BMFK9(DX8TWWH#=;D=75Q>N7[^..W?N8'EYF5UW**$A_6BZ?_1_\nM%(M%W+AQ`U:K%2^^^\")Z>WL1C4;9([-2J<!FLV%A80&A4`B2).'55U_%T-`0\nMO%XOZC69]8)H7ZK5K6%O/I]GJ*!*I=H5L,^<.5-]ZZVW:HE$0DM[N=,80JE4\nMQCONB4[,L'^J6B+?_>YW7\\MFLU\\I%`IO1*-1!4'1JM4JNXZ8S6:VZZ'3AAZ*\nMB'-\\VAXV!1X:MA!<KU*I0*?3[2*SZ'0ZA,-A9B'MUQ(0,^*]VB*=@;P3=4`'\nM\"CE4D/L-!06Q14/47CH$-!H--C8V8#*98+/9>+!(B!1)DM@\\@6RH(I$(UM;6\nM6.2>[+P2B02C4\\BL0:O5\\OUZVAF\".`RD2J2..FKE6KO]T6AGI1IH-#IH-=0Z\nMD!]F:HJ'[C<UN8%FLZ6R*\"ND7>TN,<NF^_4HG#'968FM*\\KHE$HE\"RZ),,N'\nM[349H4@8>GU+&*G9E*%2M3*_'K..6VUDZ@N%:I?,@%:E1\"E3A80F),@=:!0E\nM5$I%2SGO<3WL?2)V5U<7\"H4\"'R8VFPWCX^.8F9EI046++:IX-IO%[.PLSI\\_\nMCWOW[K&2G,/A8`P^(8&H#R]6E)V(&C&04Z)$]YUF1F0H4\"Z7$0J%H-%HX'0Z\nM.:F)Q^-PN5R[]*[IN8H\\@X6%!2@4\"AB-1AP^?)C)<&1K1UKMM5H-K[_^.DZ=\nM.L6$+W./C8>H8A^<W-:%9U+;(QFL-!H-;:=,!0V[52K58S/L?_.`_<$''ZC4\nM:O4OY?/YWPN'P\\=#H1`6%A:X+4'&FD0<V=[>AMUNWW5\"$X..RI*G=14O%`K<\nMCJ\"-J-?KX?%XX//Y4\"P6L;BXR&8&SS[[++1:+>[?OX\\[=^[LBU(142)BL*8'\nMTAFP.S,X$9Q/D#L:?)(A+='\"52H5HU9JM1HBD0@+ZF0R&<XLS&8S?#X?O%XO\nMLMDL-C<W&3WB<#AP\\N1)'#]^')5*!5>O7D4VFT4X'&:S4I?+Q33Z_6W,'I-A\nMRPI`*;<9C&JHU0\\#MD(A0ZE4PVCN;NMK--$@_RZE$FJE&E`I42\\4T9`E-!I-\nMR`H%2[]JM6JH%4I4:RW8H=R4(\"M;\"GD-15OB6P&HE2I``:@42D#5HN;(BI9*\nM\"91D@=:$)*&MO=WRE\"2Y49VN\"RWJO`+-9KT=?\"JL*VTP&!A)4BZ7&6NL4FEX\nM;;36G([7!%41S48-!JT*2LAHRA#:.BJHE*T#HRP]8<+R\"+WJG>T0E\"K`9#3#\nMV]^'L=$)C(P.P>EPM^8!>@5NWKR)M]]^&]>N76.+.Y?+!:/1R%(\"%,AH.$<0\nMNDX8I9@YRK*,WMY>3I0(1^YRN3`Y.0F?S\\>#35F6X7*Y>)CI]_OQZ4]_&E__\nM^M>QL;&!8#\"(9K/)K1\"]7@^GTXU4*H%DJHS5E75\\^.&',/=8,7EP`HVZA'`X\nMC.XN(V04,3PTBKZ^/@P/C2(6CZ#9D(LFH]F@U6J1S6:YNB-=^T*AP(/'=A*P\nM5^96[4P\".JJ[3C$CG2@A\\&\\6L\"]=NF10*!3_I5`H_/;6UM;PVMH:@L$@\\OD\\\nM@^8)T$^6.%JM%G:['9(D<?^''C;U\"HEM)&8_8M]1/-'$*2T%?.J146#4Z70X\nM<.``#AX\\B$JE@M7559X^D\\!-)!+AK+H%,7,C&`QRZ\\%BL4\"OU[/M$.G>DJ@,\nM\"<C0(C48#!R`Q;*+,CAZK4X<LS@\\(R8G!0,Z$`P&`[+9;%MG6L>OF\\ED6&BJ\nMN[M[ER8$016-1B.T6BU.G3J%<KF,>#R.K:TMA$(A;I<8C4:,C8VQ7\"QE^)(D\nML88W9>#-IKP+:TL5DB0U($M`K='DG],\\0:W2HEIM6T#)+1JZ)`.RU&Z?-`\"%\nM6@%ERQ(=4,BMGZ,)2:X#,J!6MVR_!%7O75_52N7#/\\N``C):^Z355Z\\VZ[L-\nM'13*5D]:5K:).5+[YRUI57H?\"ODA1;Y1:ZTUC4H+39=PP`OM?UEJM#2L`:B4\nM@$JG`72:UO?;6Y5P'Q+:;U9J,NMS[T2Z7<E)])E(MK0!M5H+G4Z#2J4&O]^'\nMR<DIC(^/8FAH!%U=.C0:$D*A\"-Y__WU<N7(%MV_?YHJ,\"\"8ZG>Z'VD?B&B57\nMIG`X#`#LWA0*A5\"KU6\"WVYG1J]%H.$D:&!C@87<L%F,S#ZIFK%8KNS+]P1_\\\nM`?[HC_X(!H,!W__^]_&I3WT*6UM;D\"0)Z70:X7`4/I\\7%DLO/KAP\"2>./X^A\nM=M76:[4#4*+9K*-4JJ!0**)<KD*CUGTHRXI?!Y2SR612[??[\\>#!@UW$/!H<\nM4WR2)*G<>?=U.EU%9#%W0AQKM=JNEHC3Z=3?NW>/\\>9ML^'*V;-G\"S^1@/W>\nM>^\\Y>WIZ_K=T.OT;JZNKMHV-#<3C<2XGC$;C4[<T]J)4BZ57+I?;Q?XJE\\L,\nMR^GIZ<'\\_#R.'CV*PX</PV@T(I_/8W%QD:FU6JV6%?76UM8@21(.'SZ,R<E)\nM;I<,#P\\CD4A@=745JZNK*!0*;\"S;;#;9E)9PU&*&0;UD\"IQ4(E*/>C^V5W=W\nM-Y=K-`RE=@EM,!$J160)FIA'(A%T=77!;#9S'Y)*8``LVDZ]_&0RB4`@@.WM\nM;7;(Z>[N;KG-]/?#Z71\"EN46C&UG!T-#0UQ!$8J%$\"C$>*-%3+W@5L8F09)J\nM#[,-!1[S57KDSU5R9_AZ\\J\\MQYUV;;\"/;O0COSZE9(_\\E+HHE`6W`H8:1J.V\nM/:`M(YW.XM\"A0_#[_3APX`!\\/A_T>CT2B01NW;J%N;DYK*RLL.$&69\")OJ;[\nM781C)J=RPD.+&C1&HQ%]?2V,/;58LMDL\"H5\":X8A)&K=W=W,V\"4PPA>_^$7\\\nMQ5_\\!5Y[[36\\^^Z[^/*7OXQ+ER[AT*%#<#@<R.4*2\";3*!;+;=E51]L&,`6'\nMP]&NEDCO&P\"4N5=>>7G^PH4+_[=6J_TJ#1:IVJ6A<X?>1WHOF/L^)*U$1RS3\nMB_(7[2O)!^\"/L?4QGLUF?Z=4*OWG.W?NZ!.)!(+!8,OBJ,V2H_[6TUYB0*-!\nM!9WTDB1A9&3DAV\"!%)3*Y3*^\\(4OL/?BVMH:LMDL0^E\\/A^ZNKJ8JCHS,X/A\nMX6'8[79NA9C-9LS-S>'V[=LH%`JL4UTL%IF$0G*-.IUN%]M)H]$@E4KQ^Z*L\nM4\\1M/LF!1<B2[NYN+D6IQ\"3$`2UN>@VZ_X0#C\\?C2\"02+#5I,IF@U^NQOKX.\nMO5X/L]F,WMY>>+TMU;V#!P^B6\"SBUJU;R&:S6%A8P-K:&OK[^S$X.,@!G&0W\nMZ7W5:C7N\\1++C;(Q<<!,/<@G-9EX]/W9__X].EC*N[[^6-X`?O3W]R17*!2\"\nMQ6*!Q6)A\\24REW6[W3APX`#Z^_LIF\\/*R@JN7;N&RY<O8W%QD?=H3T\\/'`X'\nM#]PZ-70>EU#0[(1:'I2H9;-9F,UF)F]1YDYH*4I$!*$D3BS(6<?K]2*3R>\"K\nM7_TJOOK5K^+DR9.X=>L6IJ:F$(U&F>&H5K<<C>+Q.\"*1\"\"1)8JIY9T7>HET!\nM\"H7B_])JM5^I5JOZ:K7*LA8$]>U`2.T9L/<*UL+7>$?[5\">V4-O!._%C\"]@W\nM;MQXOE0J?342B?ROV]O;RD0B@:6E)2Z#B71!P;5:K3[UAB2`/T'>B#5%90ME\nMU#1DH$5@M]OA<KF@5JN13\"81B\\50*I4XN)&:7S*9A,EDPLC(\"'P^'[+9+.[=\nMNP>SV8RIJ2G<OGT;T6B4^\\^$P26E/K)M$J%-Q&ZDR;;H1D&#$BJ?]C,9H)80\nM?5YJ%9&R&Y61U\"KJU#<PF\\W,VB0\"!;6,NKN[8;%8F.21S689%6`PM\"11#QPX\nM@%@LAL7%1=R_?Q^SL[.8GY^'W^^'U^N%7J_G`1*]GV*Q\")/)Q'1GD2@A_OXG\nM<?VT!^Q_C8LJJF*Q\"%F6X7:[<?CP88R-C;&>>J52P9T[=W#NW#G<OGT;J50*\nM\"H6\"Y7-I7D'KE@(J$8<>=5FM5J33:4B2Q$S#:#0*@\\&`\\?%Q&(U&Y'(Y9N%V\nM=77!;K?#Y_/!Y7)QLB/.EPCR1OM[?'P<T6@4;[SQ!F9G9YG\\0NT*JNAU.ATR\nMF0R;&+<\\(Z.[L.?M]1`&@+-GST8^_/##OZO7Z[]*GYT&CAVSFPJ`W%ZHX<[^\nM?4?0_J&AH\\B*[,S\"GSI@7[QX46$RF=XH%HN?2*52OYA()`9CL1C\"X3#\"X3`R\nMF<RNDIQNI(B3?!+-V\\==HD@_M18HHS`8#-P'IS)\\:6F)?SD<#H;$$1Z4)L8D\nMF.1VNQEZ=??N7=1J-1946EM;PYT[=QAY8#0:6;2&L@8*:#L[.^QL00>,)$FP\nM6JV[(&WBO:K7Z_M\"!\\6^O:BU2[UY&E22(WFA4.!^N4*A0\"*18!(,:3#4:C4D\nM$@E>H*)P#GE9$FPPG\\_#8##@F6>>P>CH*-;7UT&&QFMK:W\"[W:SQ0(&;LC-R\nMQJ:6B$C<H$I(?NH,]<E@ES^MU]-^?K_?CT0B@7@\\WM)F.74*)TZ<@-5J90]2\nMRJJO7[^.Y>5E%DVS6JU<M5&5),)KGZ1\")N=P:H41Z>38L6,X??HTKEV[AE0J\nMA:VM+6QO;W.;;&QL#*.CHWCQQ1=Y3U.B1TD*#?_Z^OJPL[.#+W_YR_B3/_D3\nM5*M5W+]_G[D&=%#Y_7Y8K5;X?#[D<CF>.W42AF19#@L?X7\\H%(I?I1D-[<<.\nM<X4?G#U[=J\\'I7R4?LU>&7:SV=2)>O7M9__T`?OV[=O.1J/QRTJE\\M>VM[<'\nMH]$H3VJI3T6;CI@^#YU&'@97T:;^1[WH@U$0)`T$H\"4^=/?N7>Z%34U-X=EG\nMGX7/Y\\/Z^CH//\"B0D>W/^/@X!@8&8+/9X'*Y,#<WA_OW[Z.KJPO'CAU#?W\\_\nM`H$`YN;FN&VA5JO1T],#E\\N%OKX^.)U.1FPT&@U$(A$^7\"@[42@4B,?C?/I3\nM\\\"*2QI-L\")**%06J.N&*(AF$[CFU8$A7073[H(6K5\"IYYD`E:`LCK&=7Z$`@\nMP!9/;K<;SS__/(X=.X90*(1()(*5E15$HU$$@T&83*9=?4K1#X^&,YT5Q8\\[\nM8/][;XG$XW%H-!J,C(Q@>'@8SSWW'%PN%P!P2^OBQ8LX=^X<(I$(>GIZT-?7\nMQ^Q'FC^([411K6Z_\"EF$/TJ2A.GI:7SB$Y]@!-;R\\C+(MH_TIT.A$-+I-\"*1\nM\")M@6RP63O\"H54;5\\M+2$HX<.8+EY67\\UF_]%G[U5W\\50T-#J%0JV-[>AMEL\nMQM#0$,;&QOASB?#7/5HB'+!/GSY][;WWWELV&`SC-$\"G/4\"03P#??,3'5^[3\nM$DET!&R]*&7QU!GVS9LWO0\"^5B@4OI!())3I=!I+2TOL.5@JE7;I30`/F53=\nMW=T\\6?XX0XLGN3J%FJK5*O>&;;86CI(.$BJO\"H4\"@L$@^OKZN*]N-!K1W]\\/\nMG\\\\'69:QN;F)\"Q<NH%0JP>ET8FIJ\"FJU&A]^^\"$RF0PO(H?#@=[>7A8NVM[>\nM1KE<ALOEPN7+E]G3D?JV=']HT$8G/&4.(NMQOPV[EZ.-^#,Q\"%)@I3XA91_Y\nM?!Z)1`*I5(K+1QIF]O?W\\WNC347_EUZOQW///8=BL8A(),)NT@0/)\"P]4>#3\nMZ30*A0*BT2AG[-06(^+$+D_$_]D2>>I+I5)A:FH*,S,S<#J=T.OUR.?SV-G9\nMP<;&!BY>O(B5E17$8C%>'T:C<5<\")**RQ`/U29X19:0ZG0X#`P-X_?77<?3H\nM4:RLK.#[W_\\^YN;FF''8U=7%,%1J@5RY<H4I[QZ/AV<N8@N0X+E.IQ/U>IWG\nM6DJE$C:;#<>.'<.Q8\\=@-!JQL[/#KCRD\"]))9`,0$C^#5JO]?W4ZW1]VKO]L\nM-@NU6BT#^.='W?Y]6B*=/6Q])PSX1PK8[[___JA2J?Q#`/^Q5\"JI@\\$@5E96\nML+.SPP[\"-)B@!T1RA,/#P_S[]@?DOO,>C?N/?1';B,@&M*A$B-CDY\"1GS(%`\nM`'?OWD6E4L',S`RRV2SZ^OJ@5\"H1\"`0P/S^/[>UMEC9,I5*8FIIB^!J9\"F0R\nM&40B$;:[GYN;@\\_GPY$C1V`P&#`_/X^+%R^B4JG`Y7)A8F(\"'H^'P?TT:2X6\nMBTBE4@B%0D@D$CS8(-C>?CU\":C%U$D(H&!'Q@*;:),Q#[X%ZTM3VR&:SS*@D\nMDU3:^$11IW];J51P_OQY'DC2@9E,)F$VF]'3TX/^_GY,3$R@V6QB?7T=L[.S\nM\"`0\"B$0BC.FF=@Q!'D4VZY,8!?_/ELBCKY_[N9^#W^^'V^T&T,*\"KZ^OX_O?\nM_SXN7+B`6\"P&G4X'M]L-L]G,TKID.T<H*[5:S<D0P6X[4!)[7HE$`CZ?#Z=/\nMG\\;9LV?1V]N+^_?OLUYV+I?C(;\\H]TIMD/GY>;A<+DQ-3?%:$7'-E``2JY&8\nMP=27_\\QG/L.2PD3.:1D_MQ*5O5B(`#8ZVH[_HE0J_Y\"D7:DW3MGXV;-G4T^2\nM87>LN:9\"H4AW/&N=F'Q][);(AQ]^Z.WN[OZ:1J/Y#Z%02+&^OH[-S4TV\"Z#^\nMJ:CY+.HC&PP&I%(ISAA%:C`Q]ZAE0\"@&FA13P*C7ZQP\\,YD,-!H-!@8&N&P3\nM,U+*7`D!(@+WT^DT9F=GD4PFV:V%A&I((V%@8`\";FYN(1J-(I5),,B'JK$*A\nM0\"@4XEZ;0J'`QL8&GGON.;C=;J12*2PL+'`V25G[<\\\\]A[Z^/MRZ=0L+\"PL\\\nML*M4*O#[_3ATZ!`F)B8XVR%R`#E*ETHEJ-5JN-UNA$(A]/7U86EIB1$IG08*\nMXI\"3AB\\VFPU^OQ\\ZG0X[.SO8WMY&J52\"U^MEG/CT]#2,1B/NW[^/4\"B$K:TM\nM.!P.I--I9K,1\\H34`9O-)E*I%++9+/1Z/7IZ>A@W*\\MRV[/1B-[>7HR.CF)H\nM:`CA<!BKJZL(A4*L=6PP&!B'2V4P#7_%020][PZ*+U<35*92N5PO/QT34ZE4\nM[O)$^-@#OZ<$0M%!2_N'J-]4508\"`0P,#,#M=J-4*K%>]?3T-&?5-$<J%HLX\nM?_X\\WG[[;3QX\\(#-,[J[NP5]$Q4?FG0`BQ+`E$R(:H[BO1)=V8$65^'HT:,X\nM>O0HBL4BKEZ]BLN7+V-Y>9D=='I[>[&QL0&_W\\_55C`8Q)$C1^#Q>)#+Y?!7\nM?_57^)W?^1WF2-!]H6=-`9_6H=OMQB_]TB_!X_$\\:#:;;TF2]'LDCRH.3@GQ\nM(:@E5@$L=0SV;]ILMF@JE7(E$@DH%`HVT0:P];CEDT@D,#X^SC&--%OJ]7KJ\nMY9=?WK4Z:K6:OE:KL5Y^^W#:']9W\\^;-T6*Q^(?Y?/X_SLW-J?/Y/)+))%*I\nM%(L-T6+:C^DFE@)B,\"'5LE*I!*/1R%\"==#J-8K$(G4['5&@B?%!&-C$QT<9/\nM2IB;FT.A4&`++6I[$%Q(/,'M=CN>>>89V&PV*!0*U&HUG#MWCKT4!P<'<>K4\nM*32;3:RLK&!U=16)1`*+BXM86UOCX\"&:#)PX<0(.AP.Q6(P]W$BHBN\"%I\"`V\nM/#R,2\"2\"Y>5E<IM`*!1\"3T\\/_'X_7\"X7PN$P!S\"#P8!,)H.>GAX4BT5,3$S`\nM:#3\"Y_,Q=;94*NT2AZ*!HPB/.GKT*`P&`^;FYK\"QL0&CT;C+/)=H^(%`@\"%W\nMSSSS#*:GI[&PL,!#47HMLAXCLA%E!8U&@_6Z8[$85\"H5!@<'42@4$`J%&#%B\nML]GPRBNO0*_7X_KUZT@FDPB'PVQS1G3YGIX>EHBE_KQ(#2>X&`4:T?B!:-]:\nMI0H_RQ>U``J%`A]0E\"@I%`H\\__SS\"(5\"F)N;@U*IQ,C(\"(X=.X:IJ2DXG4Z>\nMD]R\\>1/7KU_'W;MW$8U&H=/IN/5']TW$PE,`IJJ'!N%B]2I6==3O+A:+4*O5\nM/)1^^>674:E4<._>/1@,!O3T].#(D2-H-IN8GY^'P^%`*I7\"@0,'$(E$H-5J\nM$8O%,#DYB7`XS\"[EL5@,%R]>A\"S+.'GR),KEEH9X.IWF`Z;1:,!FL^'55U_%\nMV-@8O%[O>JU6>_GEEU^.??#!!Y(LR[]/GX]09>+`O[V.%U]]]=5=Y)!77WU5\nMNG#APD4`G]OC$3TN8#\\N*4[L\\3W=X_[>#_UG[[WW7H]:K?[OY7+Y/T4B$44\\\nM'L?BXB(*A0+WF6B`V&Z2[QNP.]7E.NG8'H\\'J52*H3Z$[J\"R0Z52P>?SP60R\nM,3TZ&HW\"Z73\":K4RWI)8A)1I%0H%;&UM871T%,EDDM6X1D9&6'ZQ4JE@:&@(\nMR\\O+6%Q<Q.SL+,;&QN!T.E$L%E&OU]'7U\\<+F3#%%HL%P\\/#C#.^<>,&%A86\nM8+%8<.+$\">AT.BPN+C)=]L&#!]!H-!@:&L*I4Z>8G-#=W<T$%7$!D84893BC\nMHZ.8G)QD%$8JU0+\\6ZU6;&QL,,9T+\\6Y@P</8G%Q$?E\\'CT]/>CM[<7FYB:Z\nMN[LQ.3F):]>N,<$@G\\\\C&`S\"8##@Z-&C\\'J]T&JUN''C!I+))-QN-\\M,DAL-\nM3;7I>1+KDC:!R61BP@,=O(2:J=?K&!X>1E]?'_K[^UE<BVS2E$HE>GIZ6.>$\nM=\"\\*A0(C6RB3%P=C]%Z:S29DQ8]./'DHKO1OUX>F(33M-=H3U)**1\")H-IOP\nM>KWH[^_']/0T*],!+>+*1Q]]A`L7+N#!@P?<EB2(JR@K+,)+Z:+>M;B?*5B3\nM\\!(=(#1,M]EL&!P<1%]?'P_.F\\TFMR\\-!@-.G#B!F9D9K*VMX3O?^0XCHBCA\nMLE@LB,?CL%@L7'U?O7H5]7H=1X\\>Y0.Z7J_#;#9#J52RE^G!@P?A=KO3I5+I\nM?WGII9=B[?CS34F2?KM>KVN(!$/[[J'A!*!0*\"X\\:G[[B.\\''O?X/F;`WDOG\nM(O)#`?O*E2M*69:_7*U6_\\^5E14;:2430XJ\"B1@(GK2W1@M-G'R*7PG10:)\"\nM!/GR>#P8'AX&`(R.CL)L-F-E986#\"BG8K:RL8&)B`E-34T@D$KA]^S:VM[=A\nMM5HQ,C+\"IW\\^G\\?\"P@+FY^>Y%.SO[\\>9,V?@=KL9-=)H-!`,!G=9>(GJ81J-\nMAKT3X_$X-C<WD4JE8+5:<?9L2SN7<*RDDT#W\\]2I4Q@;&\\/$Q`0:C093=N_=\nMNX?[]^\\S)I2PL9E,ADHEG#QY$FMK:\\PPI';.)S_Y21[JQ>-QKB1\\/A_L=CNN\nM7;L&29)0*!00#H>93EZOU[&XN(@3)TY@9V<'BXN+&!\\?QR<_^4GT]/2@4\"C@\nM'__Q']';VPNSV<R]/SIHJ)\\I5E&BS\"AM<GI/5)603Y[1:&2W$JHPAH>'D4ZG\nM$0@$$`@$D$JEL+&QP8)55JN5`Q;-0:@'254&!8B6/K8>:#1_IC-L\"E;41Q91\nM1*0LZ??[<>S8,<S,S,!JM4*2).SL[\"`:C>([W_D.=G9V$(E$F+$J*B[2'A7%\nMQZB\"(9PS#8$[][U6J^7,G^SK>GM[T=_?CZ&A(3B=3MR]>Q=FLYF)._E\\'EJM\nM%D-#0_#Y?(PF>NNMMS`V-H90*(3!P4%$HU'6WE8H%.CKZT,\\'L?MV[>QOKZ.\nMWMY>]/;VLJ8'H3Y(:;/1:/S@I9=>6J#W>N;,F1MOO?76_U.OU_\\3F360:8EP\nMX%<5\"L6?/N)1I!_Q_1\\UPXX_X=\\/[?KAN7/G#-5J]7PRF3Q.+B31:)0_$)W$\nMA.>EQ4*;<S_HF9CQB.44-=4)RTLW?F!@@'O;A4(!>KT><W-S2*?32\"02K3)7\nMJ^7AB<EDPO;V-A,R)$G\"\\/`PQL?',38VAI65%4B2A%0J]5!4I^V*,3HZBG`X\nMS`B)5\"K%2(W>WEXXG4Z&)I)NKMEL1K5:Q<;&!K:VMC`Y.<F#$H(P>KU>+\"TM\nM87M[&R,C(PQA(UV/R<E)'C@6BT4D$@FN8LBLEDK0@8$!!(-!]/;VXN_^[N^X\nM?`V%0D@FDUA:6H++Y<+0T!!.GCS)[ARKJZNX=.D2^^+9;#:V-B-2A\"S+6%A8\nM@-5JQ9DS9W#X\\&&4RV5<NG2)2^7Y^7E,34W!X_&PT,_,S`SR^3PV-S=WP2KI\nM<*;!LDJE0B*1X``KLCQ%[9A\"H8!L-LN#Q\\G)28R,C*!6JV%Y>1F!0`\"SL[,`\nMP$Q*HOK3&B6R%`U8.3NM-WZF,VQQ#[%U6/OP,QJ->/;99UG,B_0W`H$`+EVZ\nMA-G962PL+'\"?MJ>G9Q>CEEB+DF!RW&F0(1Z`5\"'1>Z!^,V7$+I>+1:'HF?;W\nM]Z-2J;\"1+<$@?13?```@`$E$051=-1H-)QZ?^<QG.'#3>\\CG\\PP&*!:+K%W3\nM:#203J=9NX:JT$JE`K/9S/OC$6\"&E&@_1I]/.(3^^N677]YYQ&-(?<Q`_J,$\nM[$Z,9%5\\775[*/4_UM?7CS]X\\`\"12(1/2U+-HR&BV,<B6,V34*<[=2+$_A<-\nM,\"BC)%$7G4Z'8K&(7\"X'E\\N%6\"S&I7\"CT6#XD4:C02*10\":388]'TARH5\"I(\nM)!(/I3K;`Q.WV\\TZSU1.B<XN1'WMZ^M#7U\\?RN4RBSS)LHQ`((\"UM368S6:,\nMCX\\#:(G:1\"(1G#]_'O5Z'4>.','SSS_/!PU!Z619QLK*\"E0J%1^,-/0Q&`S<\nM\"B'22KE<9@$ID\\G$`;W1:*!4*O&&R60RN'OW[@\\)P9O-9A@,!FQL;$\"698R,\nMC,!FLV%[>QN2)*&_OQ^)1(*K%5JXY%G7U=6%YYY[CDDXT]/3/'@L%HN8G)Q$\nM+!;;E>W1[RDSH@U-YA/-9A.Q6(S;141QITUHM5IAL5AX@Y(<0\"0202`00#0:\nMQ>SL+`M4405`ZZ:KJXNQP[5:#8JG0%G\\:P3LI\\6@B$)A-!^Q6JT8&!B`R^7\"\nM]/0T\"R&52B7<NW</'W[X(6[?OLWM+6I'D?2K:#]'N/R]B%NB9Z6(W*$VB%JM\nMW@5M[>_OA\\OE8B>D;#8+B\\7\"`=Y@,,!FL[&&.,FFGCAQ`DJE$K__^[^/KJXN\nMA,-AN%PN9B>G4BE$(A$XG4Z>RYA,)N3S>:Z@R^4R[V5*S/:XDG0X4?(@5@P*\nMA>+_>,RC>%1@KOX8,^R(2,A1?^][W_O<[=NW/T>B_*52B35B:7.)ZG94VHI3\nMY\">!)8F_.BV^<KD<3IPX`;_?CZVM+=R[=P_-9A-C8V.8FIK\"S9LW646.`@NY\nM<??T]&!X>!A'CAR!W^_'VMH:WG__?83#8=CM=MCM=N[7>3P>%IPB.%*A4,#Y\nM\\^=Y4&*SV7C2G$@DL+*R@K&Q,78HCT:CF)N;P_;V-G0Z'>QV.ZY>O8I/?O*3\nM.'SX,):6EO#!!Q]@964%APX=PJ<^]2E6Z:,!'T'X,ID,(S8(`D?S`=%].Q`(\nMX/.?_SS6U]?1W=V-8K'(99_)9$(P&-SE=B(>CD0%]_O]:#:;?%]>?/%%-!H-\nM+\"XN0J/1L\"&O6JU&(I%`M5J%V^W&P,``#APX@$`@@&PV\"X_'`ZO5BLW-360R\nM&8R.CK*T*_54._6ZR3,P&`RRGHO%8D%?7Q]L-AN7ZL2HHXU.K3>'PP&'PX'!\nMP4%,3$SP`)A<W4F5C4@?I)9(Z_9G?>A(]Y:\\1:D_/#HZ\"K?;S<.V6\"R&V=E9\nMO/_^^[ASYPZ*Q2)#0U4J%0^QJ3U&J(B]3`;$85Q75Q>_/E5%Y(MHL]D85I?/\nMYQ$(!)BD1HE8/!YO&RB[N'*N5JLPF4QP.!S8V&@AZ(X=.X8WWG@#=^_>Q=K:\nM&F?3E%V3!@JAQWI[>WE(24D$8:J52B7*Y;*\\!P`BU3E7$WZ6>.FEEY*/>12I\nMGT#`UCRJ'0(`ZGJ]_C?7KEUC'*S)9.+RA;)C`I=3\"4&#\"@H*^^%8J6P5(4/T\nM>MW=W9B:FD(\\'L?;;[^-8#`(C\\>#F9D9*!0*W+IUB\\D6-*\"D+)$>//6[WG__\nM?42C40`M&Z^=G1U\\XQO?@,OEXLRB5JMQ9D=J<<0RU&JUO/\":S28&!P=QZ-`A\nM>#P>K*VMX<*%\"TBE4M!JM1@<'.0,X:677D(NET,L%N-`%`J%\\-9;;^'Z]>LL\nMG4J;AN!5!'L<&QMC_1*J`FAX5Z_7T=O;B^GI:?SMW_XM,IE,RYBV;6F42J68\nM-B]XR_%`CEHK1(#IZ>E!*I5\"(!\"`V6S&F3-G8+/9L+6UQ8/1HT>/8F9F!IE,\nM!O?OW\\>5*U<P,C(\"29+P@Q_\\`!]^^\"%.G3H%A4*!E9451MS0'$*4>B6!']J\\\nMA,RI5\"J(Q6)L3F&U6KDZ(\"@F51V52@4/'CP``'B]7KSXXHMX\\<47>5!,+#F2\nM$_#[_>CO[V>86I.TA[&WO.KCOLJR`I*B+6KZ\"#WIQWY%2X'U:2YJ0VFU6CB=\nM3HR.CF)\\?!Q>KY=]!1\\\\>(!WWGD'ER]?1B@4@E*IY.$]#>9H$$P9,JU[:K,0\nM)T+TU:06IEBY4C_=9K.AO[\\?A4(!L5@,6UM;2\":3O#\\.'3J$@8$!.!P.GEE0\nM_UV$\\HZ.CB(2B:!>K^.7?_F7\\:=_^J=,U.KN[D8BD<#@X\"\"OZU#;R%@T'Z#@\nM3J;&+I<+Q6*Q^;@L>0\\22V2?1_%OD6&'=_TP&`R6S6:SD3#.5.+0C:!F/E$Q\nM18T+HH;N!YPGW*,(%1*A?K=NW4(@$$\"M5L/DY\"2&AH9X(%<NE]G]FT2*XO$X\nM,^4<#@?6U]>YGTP!;G!PD!7C+EVZQ,@&0KG0PI%EF345\"%<Y.CJ*@8$!:#0:\nMY/-YO/GFF^CIZ4$^GV<WY:ZN+KC=;GB]7HR.CF)S<Y,5[3*9#,;'QQ&/QW'K\nMUBT>IHK9$E4H(A2*OD=3?/HW*I4*FYN;O*DF)B:X&B*92LKX#QX\\B!LW;L#M\nM=D.KU:)4*K'055]?'U*I%&M\\$_1N8&``$Q,3&!L;PXT;-_\"-;WR#*?S]_?WX\nM\\S__<\\Z>29N%M!DL%HO@L:C8I>!&Z`W*^`EE1!6:B/\"HU^L(A\\,LW&4T&GF`\nM1%A?PKS'8C$XG4[8[7:\\\\,(+/`/8VMI\"(!#`TM(2`H$`XX_M=GO;T%:\"2J-&\nMETX/G5X'M5(%60%DTQEH]3KHM#I`J8#4:*+>;$`A`RJEHIUM2APP-%H=%`H9\nM]7H3]7I;!$AN'PF=7Y^`^$.#6TH:2!6.VGZI5`I^OQ]C8V/H[^^'Q^.!W6X'\nM`&0R&5RX<`$W;MS`S9LW&0E$UGH4>$6>A-@3%UM7]/QHD$M5#XF?J50J;N^]\nM_OKK.'#@`*+1*#[XX`.DTVFDTVDV?KY]^S9F9V=QX,`!///,,WCUU5<9$=7;\nMVXMJM8IT.LW[D+#^#H<#7_K2E_#7?_W72\":3*!:+<+O=V-S<A%JM1F]O+[[P\nMA2_`9#(AF4SRX9)*I9B=2=5#H_'#TV:-1E.C]B5A_064VV,#ME:K3>=R.=AL\nM-O3T]#`W8K^`+<Y3.DQXXWN\\AH:JF38\"9W?`UNOU<5F6'?00J6]*H'*Q?*`2\nM5>3=/TE+I),;WV@TD,_G.>ND0$HEN`BIHZ\"UM;6%=#K-&&2/QX-:K89P.(Q;\nMMVY!H5#`;K=SYD&9].SL+$Z?/LU&NH2DJ-?KG.7?O'D34U-3>.&%%UA@G=QN\nMJ\"].#$2WVXV3)T_\"X7`@'`XC%HMA;FX.T6B4*;$^GP\\OO/`\"G$XGE_>$3=9H\nM-%PNB@-0JEP(KD4\"4D0NJE0J.'WZ-\"*1\"#M^T`9*)I.8GIYF&N_1HT=!C*QF\nMLXFMK2W$8C&4RV4<.W8,%HL%2TM+,!@,F)F9P>KJ*K[WO>]!EF4,#0WAF6>>\nMX6&D+,LX??HTHM$HO%XO.Z^?.W<.DB1A8F(\"@4!@EX662J5B-B<%\"U)FI$I-\nMU/L6X614\\LJRS%4(D0@$P@$KKE6K5?A\\/F[I#`X.,C0P'H\\SKIQ:\"+31,ID,\nMWV.OKY\\/8ZI&\",M-V'\\RKRB7JZC5&GQ(Z?7D&O](1>U]+[O=CFPVR_N!@FVQ\nM6$0@$&#GE8F)\"1[(ETHES,W-X=Z]>[AV[1JOZ=[>7AY:B\\XE3P*[)9@<[7M*\nM)`P&`\\/Q\")9Z^O1I]G=\\\\.`!4JD4,ID,)$EB@D@VFV4]^;Z^/IPZ=0HFDPGQ\nM>!Q.IQ,C(R,(A\\/<5J%#?F1D!!,3$[A__SXD24(RF83%8L&!`P?@]_LQ,##`\nM:T=4=>R4599EN;['\\%8B5)&@`_)$`;M=>.UU5?ZU<-BR+*L[&)>[6R(FDRF2\nM2J4.4K`0J:%4GE*@ILQ8=.Y^DH!-69?HM$`9&TDN=G5UP>ETHMEL8GEYF8,E\nM(0IL-ANFIJ;8+BP4\"F%E907!8!\"3DY-P.IWP>KU0J]6<;1-CZ,*%\"RSB-#0T\nMQ(..0\"\"`1\"*!EUYZ\"1Z/!V:SF0=;%.\":S28L%@M&1T?9%LOM=J-6JW';B(:/\nMD4@$2TM+B,?CW#^D81II\"9.!`8G^6RP6#A34>Q.MA!J-!JY=NX:[=^_BY,F3\nM[+I!Y2:5P^%P&-EL%H.#@]C<W&3$P-;6%G[]UW\\=X7`8.SL[V-K:PHD3)S`R\nM,H)KUZ[AF]_\\)H:'AW'PX$$T&@VLKZ^C7J_C^/'C\\/O]\"(?#N'[].MN+??CA\nMAWC]]=?QQ2]^$6:S&?/S\\\\AFL[N<Q\"E;HS^3X#VU0JC/31`\\45R(@C?UQ47F\nM)FF<$!*$7B.12*\"OKP]#0T/<4P\\$`EA=744D$F$X8R@4@L%@X)XX$4*RV>PN\nM$PUQO5+K3V14BF7T_O9H^U^)1`(:C8:K\"I(B)932]/0T/!X//!X/E$HE(I$(\nM/OKH(YP_?QYS<W.LU4-B7,1\")!CND^Q1^KP$YZ-V!:&>'`X'#A\\^C.>??QYC\nM8V.091G7KU_'U:M7V3F*-*>I!4/:,]O;V[AX\\2(&!@8P/C[.FCYT_TEPK5JM\nMHE0JP>%PP./Q,!&(&+(OO/`\"'`X':_S0'$MTM1<-D&59SNP1L&62>Z#8)J!)\nM]@O8ZA^A):+Z.\"T129(T(D>E0S40:I/)M!2+Q5XAL+O1:-S%I,KG\\PQ*IU-,\nM5')[DL%C9V^,@C;]7R0Z0R0`NIEDQ$O:%X2L6%]?YU+IY9=?QM#0$#_\\2\"3\"\nMFY-PH>%PF/6N/1X/;#8;+!8+RXR2,ACUN\"G3$]M!U`,GJ%PX'$:M5F-A&8_'\nM@][>7C:K)?IYI5+A$I`.(,K@2$R^O[^?>]`B;9^JG<]][G.X=>L6ZU$35GQN\nM;@Y>KQ=?^<I7\\+N_^[M(I5(X<N0(S&8S:K4:#APX@)&1$5RX<`&?^,0G,#T]\nMC3MW[N#O__[O4:E4X/5Z\\>JKK[9ME,)0J]5P.!Q87E[&6V^]A9,G3^*%%UZ`\nM7J_'[.PLBU?=N'$#JZNKF)Z>QJE3IV`VFQDV)HK!4X`F^C!E;U1=4*9-`4JL\nMQ!0=#N$T;Z#6`4G74AN)*AG\">9-#MLEDPNKJ*A87%W'OWCT>EA+:AN8J-IL-\nM=KN=>0%4[NKU>I96(#E@T5QVOW;@$U'7VY^=[HDLRW`ZG3ATZ!!7C(2:NG__\nM/BY=NH1;MVXA'`ZC6JW\"Z71R^T*E4NU:PT^BT]/)5A0'C\":3B0^-UUY[#1Z/\nM!_?OW\\?5JU=QY\\X=QMB+.&VJF@AVJ%:K65?'Y_/!Y_.!))@=#@>BT2AL-AOK\nMYM\"AHU`HX':[,3,S`Y?+!;_?+\\NR_/O9;/9/Z$\"GEBP]\"S$1D&4YL5>&314*\nMM0N%>Y3]UPS8'WSP@?(QI9;\\B!ZVU&':O3M@=W5U+>KU>J33Z5T;A/JN)!8N\nM0L4H0(L9R&,_I=!:$>FL8NE%JG'E<ID5[0A6!P\"12(3U.XQ&(Z:FIN#S^;B\\\nMK]5J+&#S_///8W)RDC69#08#9V(T`*.%3:X3!%^DX29-U(U&(S[[V<\\BG\\]C\nM;FX.2TM+N[(M0I?04(>@CCL[.PR#)!0$L<+H[]GM=O3V]C(T2<0H$UI$J51B\nM8V.#16J42B4&!@8@RS)RN1RFIJ:PM;7%<X=RN8S/?O:S^)N_^1ND4BE\\X0M?\nMP,&#!W'ERA6LKJ[\"Z_7BQ(D37.(3,RR93$*OUV-P<!!#0T.(1\")0J528GY_G\nM2B:52F%L;`RE4@DS,S/P>#P8'!S$Y<N7V>\"`6CL$-Z1L2QPX4W^4,F?*LL@X\nMH5,C1'3BI@J/E!Y%/U!:CX1M)\\R[P^'`<\\\\]AT.'#B$<#K,,\\/KZ.B1)PN3D\nM)&?-!H.!AVK4$J'DI%.S6QS4/<U%2(IL-@N[W8XC1XY@9F:&7>[U>CVVMK9P\nM\\^9-7+Y\\&??OWV>6*0W4Q98`!5M:4T^:75,_G=03\"6([,S,#A\\.!4JF$FS=O\nMXIUWWL%''WW$![A(G\"'!)9$D1=73]>O7X?5Z\\>E/?QIFLQGI=!H>CX?7@,OE\nM8F$EB\\4\"O]^/R<E)'#AP@!*!_W[\\^/$_??OMM_^$WJ]8V8F_;[]F<H^6@T1K\nMKU0JL<8*<93V0UA^S`S[<;JSN5=>>66OU\\LK%`JS,.,+=<12]<*!`P=P^?)E\nMIKA6JU4&XI/!JYAA/VEO3,21BEAH\\517*I7L>R@B)8A6'@Z'4:E46'5N:FH*\nM@X.#D\"2)(70`N'3+9#),81X:&D)?7Q]F9V<Y2%2K5>1R.79]MMOMF)R<A%*I\nM1#J=QLK*\"M;7U[D'3,&S7\"XC%HLAF4S\"9K/!Z73R_]G7UX=<+H>MK2UD,AEF\nM:Y+*F2@52B([U,*QV^WX]K>_S?`JD9@@TH7]?C\\+_E/_WV:SH:^O#V^^^297\nM`3__\\S^/=]]]%T:C$??NW4-?7Q\\F)B9X`$?:*H3W?O#@`79V=E@X:V%A@3=/\nM-IO%]>O7<>3($?3U]7$+R^5RX<R9,[AUZQ:^]K6OL4%$9T9'@8`\";0>$BM>!\nMS69C#7-\"EHAT88)J$:JAS1U@+?-:K<:D#:+!4SE>J]4P.#C(A*<#!PY@8&``\nMD4@$.SL[2*52;*Q<K59AM5IYW=\"A3JT*<FVA($XXY*>]HM$H]'H])B8F,#X^\nMCJ-'C[*R7C:;Q94K5W#MVC5\\\\,$'\"`:#T&JU7`V3XXNH+4*'/:&8]GN/HJP`\nM'59FLQE>KQ=.IQ,.AP/9;!:SL[/<9IR:FD(L%F,6JIB$45N%JJQ2J83^_GZD\nM4BE\\][O?17]_/XX=.\\8L2D)-495-5>GX^#@.'SY,O(!,N5S^WXE=25!\"D?33\nM$:SW[!$WFTV)#A%JJWV,@*W^5PS8\\4=4.SFZE^TD9'>&+<ORPOCX.*Y=NX9B\nML0BKU<H;AS(ZD<U$#U\\L>S\\N6ZO3LV]S<Y,S+Y'\"3@N.3FZ25:2>::52V>44\nM4ZU6L;:VAM7555@L%HR/CV-D9`212(0W.!%E_'X_1D9&X'*Y\\)WO?`=>KQ<^\nMGP\\S,S.8F)A`+!;#VMH:=G9V\\.#!`U@L%AP[=@Q^OY^',T2^N7[].HM%I5(I\nM>#P>WC0]/3T8'1W%QL8&TNDT1D='<?KT:3B=3JRMK>'BQ8L<<*A'N;FYB7P^\nMSW,\"<G>ADJ]4*F%D9`2OO/(*LMDL:_M21G3UZE5,3T^CV6SBV]_^-GIZ>N!V\nMNW'FS!E4*A5<OWX=&HV&Z?C#P\\.X?_\\^=#H=1D9&4\"P6\\=%''\\%@,.#DR9-<\nM>L_,S&!D9`3!8!!OOODF2^>2:PQY7,JRS,&=$`>=[30*@$2,(%('52$TI\"02\nMCIBEBSU+4C\"L5JO8VMK\"ZNHJ=#H=DSCL=CL[VFLT&CB=3G@\\'DQ.3F)X>!CY\nM?![W[]]GUETFD^$@1#`TD\\FTJV4@ZA4_:8_X<5=75Q<.'CR((T>.L'9+(I'`\nM]O8V=G9V\\-Y[[V%M;8W;?':[G0\\1V@=T[SH-+)XD^Q<9JF2;1<F,T6A$*I5\"\nMN5SF-3\\^/@Z=3H=X/`Z;S09)DE@GG<AG!/\\C_TYZ?N%P&/\\?>V\\>'/=U7@N>\nM7M#=Z+T;Z`8:^T(0``ENX`*)I`B2$B4YDFS)CEWQ*&7'F21^3IP:QTD<)^,J\nM.Y7RLU-QU2NG\\B8SJ7'%4>PXLC.6;)%^E$127$6*(BB\"!`@0Q+XU@`;0&WKO\nM1L\\?PKEU^R>`6*G%YJU\"D00(X+?<^]WOGN]\\YYP]>U;X?;*Q)A@,BH)R-IN%\nMT^F$R^42K*E4*O5OQXX=B\\O,&IG9)4.L]RKJ93*9>9F=I:A!?!@\"=EC2`IHY\nM=.B03QFPQQP.1UBE4EEH<<7N.J_7BW0Z+6`)>5%*4H3B<_<J.LJ[AOR`V9I.\nM93D9<I%W/QHDT$6<CB4VFTU0WCBA>&SNZNK\"W;MW<VR)-F_>C/KZ>@#`S9LW\nM\\?.?_QPFDPG3T]/HZ.B`Q^,161@U+UYZZ24T-C8*C).%(6H&ZW0Z(5O:W]\\/\nMC48CJ%DFDPEGSY[%PP\\_C$]_^M,PF4SHZ>G!&V^\\(9@*M\"S:LF6+T/0E-&0T\nM&@5KAW6&Z>EI;-FR!=75U?CN=[\\KVN`K*BKPS6]^$U_YRE?PTY_^%)65E9B:\nMFH+)9$)W=S?JZNJP<^=.%!4587AX6-`V(Y&(X+DRTZRLK(1.I\\/(R`B,1B.V\nM;-F\"S9LWX\\*%\"X(V55)2@O'Q\\?<T[<@RJ$K(;#']&=+:J/W!]\\?FFV@T*HI:\nMA,_(,S>;S9B8F!\"G';8KDV:F5JM165DI,.]H-\"H\"-`T6#ATZA&0RB:FI*=RY\nM<P?=W=T8&1F!Q6(1V#95YMB(DMU`4X+GGGL.A86%PJXN%HMA<'`0O_SE+W'F\nMS!DA8TRC7%)NN=D1RJ$Y+(OE3!J6<W0B\"8\";9FEIJ3`*(/1&4V:JXY64E&#G\nMSIUH;&P$`-',1-T1K@L2!B8F)D1GZIT[=]#>WBX,<,O+RS$X.)CC0D5KLE`H\nMA&0RF=5H-/\\L\\]+IJ\"XW_\"QBP;5846^>\\6<1X;J-AD1TJPW8*I4J)*$/[^FZ\nMU!XZ=\"@;B\\6ZU&KU/JO5BO'Q<:&%,38V!I?+)8[,)I-)$.#)1::>K,RK5E;3\nMN7-REU6Z=G.14SUK,?$;2C]20M7A<(@C6W%Q,2*1\"`8'!]'?WR^R309Z-H/L\nMW;L7)I,)_?W]Z.SLA-?K%0N<4J?3T].X>/$B]NS9@TV;-@D,.95*H:>G!\\ED\nM$E:K5=#TRLK*\\/333V-V=E94Z[F9L3CV!W_P!R@L+$0H%,+9LV?1V]LK%.C,\nM9C..'3N&X>%AW+Y]&^/CXX*#R_9SM]N-:#2*GIX>U-;6PNUV8^_>O?C!#WX`\nMB\\4BA'#\\?C_<;C=.G3J%IJ8FE)65\"0'Z:#0*O]^/5UYY16BV^'P^P3KA0J&+\nM#(V+R76>F9G!Q8L7$0P&D4ZG83*9A&0LLSB9:;'8R>I>16EY<Y=K'PS,=KM=\nM9'`,2+%83-#.%F-L$&=F=IV?GR^2`UJ?^7P^H4]26UN+AH8&[-NW#W?NW!$0\nM%PV7J0[););WS@Y-67A*7@N$:+C1D&.[:=,F;-FR!1:+!>7EY0#>%0$[?OPX\nM;MRX(61#'0Z'\"()L<I%MNG0ZG5@[U%61GV4D$H''X\\'(R`B*BHJ@T6C0V]N+\nMBHH*V&PVP8\\O*RO#CAT[X'`X,#T]+218W6ZW:*8S&`RBR`^\\:T_WV<]^%C_Z\nMT8^$8-?NW;LQ.3F)>#R.AH8&`1,R:6)A<79V%J6EI9B:FA+/B!10KJ4%/:,W\nM'GWTT3OR'-%JM8C'XZ(W9`D*WL`B,AGSE!->!-9-+)-X:I70WP*,=,\\,.YE,\nMBOOC)AJ-1GU+K(70UJU;$8O%`LED\\@=+I?A7\"PH*]O7U]8E=E9@P35AYO&&F\nMPX=%C%<9I.4,FL%9%@A2'L66TR*1F0-LMZ:@D\\%@0&5E);9LV0*52H7N[FY!\nM<6ML;,3CCS^.M]YZ\"[_XQ2]@L]G0W-R,)YYX`MW=W6AK:X/=;H?7ZQ4Z(G:[\nM'0Z'`Y%(!./CXT*`BID?`Y[%8A%0$2&+T=%1&`P&H<A7554E7-:[NKHP,S,#\nMI],II%(+\"@IP\\N1)A$(A<?1DL\")/>'Q\\'*E4\"H<.'4)?7Q]:6EIPY<H5H:/\"\nM2<$C(9TTNKN[Q0*7G[NL&\\U,DYDL]:[U>KT08F*Q-AJ-OJ<&D7T?[*\\8Z)@@\nMZ/7ZG-9WN2%)Z6>I5JN%^)3!8,A1\"LS/SX=.IQ,,DY&1$>'%2?AK>GH:X^/C\nM&!L;P^W;MZ'1:(2N#(,+(1-N>G*1G=DK.;]T(:^HJ,#V[=N%%LW$Q`1>??55\nMG#MW#D-#0SG*F)P+2C>AE0XJ+;(>Q99PTDN;FII04%`@(`AJPU`N@0UU+,03\nMHN0H*\"C`WKU[$0P&$8E$1`,4M=QYJB;#J:BH\"\"Z7\"U:K54@JRYH>RG>H4JG^\nM61D/^%S96;O(&&QM;8VM@DN]5D@DT]K:FEY#ACVQ1*P++VSJ__+DDT\\F%KT`\nME4IUJ;JZ^LNW;MT2AJ[A<%BT>[*J*F.H,J9-L1>E]*J,5<N[(`,Y@\\ARD(KR\nM97'S\\/E\\0NV+#(6YN3F4E94)=3J=3H>?__SG@JI%:*6\\O!PU-37X[&<_BV`P\nMB.[N;L3C<7@\\'M$EV-/3@W?>>0<ZG4YPK9E9QF(Q3$Q,H+N[&R^__#+V[=N'\nM)YYX`L>.'1/!N[N[6^B4#`\\/(YO-8M^^?=B[=R\\`H*.C`R=/GA1%5?DX)\\,*\nM[\"HD'4FE4J&_OU^T@-?6UHIC(D\\`L@$P)6;EHRKA+8U&@VO7KB$>CXOF$9YH\nM&+\"]7J]@E#\"[D1?4^Q&TN<GPY\"&S2OC!HK7L.DUZ)A<X-YY`(\"\"*O(V-C>+^\nM.SHZH-5JX?%XL&G3)C0U-0GYW)&1$2'Y2GUU/B=>FU)CFIL;G>?+R\\NQ;=LV\nM83>72\"30WMZ.-]YX`Z=.G8+7ZQ56;823R(3A!K3:$0P&H5*IA(A:+!:#V6P6\nMB0Y/<32G5:O5L-ELHBC(9A@*<LEU)NJ;M+2T\"$>H2Y<NB?7'3;Z\\O%QT#L_,\nMS&!X>!A5556P6JV+Q@8I*9C4:#0O*Y@2/P#POS,C7R)@O[W*YI=E,^PE`O:]\nMFF;N];+ZEICGPWEY>9%L-OL_EKP`K59[B?K(;(TE5LSF$*4@#&E5LK8(Q9QD\nM+5UF/\\H\"B&QBL!+Q&QG?(EU.9I7T]O:*HU=C8R-<+A<2B02&AX>%M@(7+>V_\nM!@<'A=YN04$!*BHJ$(E$</SX<8R.C@K&P.<__WET='2(0A`E(UM;6]'2TH+7\nM7GM-M`7[?#X!*[`!H[>W%RTM+3ATZ!\"<3B=Z>WO1UM:&B8F)G*J^W*8MZQ,7\nM%15!J]7B^O7K,!@,Z.CH0'%Q,8:'AU%04(#>WEXA\"$3=!M()O5XO.CL[WY.5\nMR<6_TM+2G-,+W4U(VV(1<+WN]ALQ&/S(2%!ROLGA)^4NG4ZCL+`PIZF\"3(1P\nM.\"SNS^5R\"48$<=I;MVYA8&``-34UJ*JJ0DU-C=#G'AD9$0U/S.SY=S)NF,';\nM[7:X7\"Y45U>CL;$1965E`(`[=^[@C3?>P/'CQX4Z(V$LK@W9S4=I(J!4FEMJ\nML\"F%0FM%145H:FH2M8L+%R[@^O7K4\"5;U@(``\"``241!5*E4L-ELHOV=<]CM\nM=@O%/VZ\"7,L49RHH*,#V[=O%\\Z&6R?3TM.!U4]Z\"-GN4>V6!G4F*HE'I164&\nMJ]5J_YM.I_OM9#)IN\\=IX\\?W(6!KUO`]JPK8`/Y1K5:?:VUMG5@R8!\\]>G2$\nMO?H,V,P0V/4D<UWEBG\\FDQ&=6OGY^3\"93\"++X,(B=BW#&GR!*SW>*8L+I'@1\nMUR-G/)/)8&QL#/1=XP+BHI+_7R`0P/#PL&AX&1@8$%DKS0^V;=N&P<%!7+UZ\nM%5-34Z*Q2&[73:?3PN/2[7;#8K&(YI;\"PD)\\^<M?1F%A(<+A,$Z<.(&;-V]\"\nMH]&@M+043J=38.-R!B5O:!1J'QP<%*W7'H\\'!H,!)24E>.211X3&2G=W-Z+1\nMJ)#'9?.',D.3(2NOURLR;@8P9JK,KLA%YI%<AKC>#Q-;SC6Y+B(K$[+HR+9H\nM?A`^4V1M.?<R-C8FBF)%145PN]T\"VQT9&1'SE[SG@P</B@Y%2OO*SX-P@-UN\nMA\\5B06%AH?\"RS,O+@\\_G0T='!UY[[35<O'A19(B4E56I5((=93:;A4RHHF7Y\nM/4%\\J5%45\"2D'=QN-YY^^FGLWKT;)T^>1'M[.S0:#;JZNH0>3EE9&39MVH0=\nM.W;0N450<UGT)?.'`3L_/U_4._KZ^O#FFV^*_Z?5:H492D-#`QH:&H1XV^3D\nM9([./A,6J3GO)>7]'#MV+#TY.=F>R60.+5$WR0(XL8:`O9SYIWH#`W;O8I]\\\nMY)%'9@\"<63;%9WLX7X+1:!0P@PRTRY58!NUH-\"HT,$C',AJ-.:I^S+J5E=R5\nM'/%D6S%RE&4;+&8B='4FRX(X[>3D)&PV&RP6BZAZ4_2)2G]4/2LI*4%]?;V0\nM,24MC2(\\[([B!&,[\\.SL+/Q^ORC6$;NC7C,U$1*)!,K*R@0?^JVWWD)5594X\nMWK-HM\"`/B6@TBK&Q,4'#8Z;TSCOO\"*[NG3MWQ'&665$L%A-F#RZ7*Z<8K&1L\nMR)D3/\\?@S6>JS.[DC_L=L)4T0+EC5FX.(=;+3DIFV<3YE^(>NUPNS,W-P>?S\nM86QL3'#T6=3V^7SBZ,TLFDIU=75UXJ0IGR:IZVVQ6`15#@!Z>GIPXL0)O/GF\nMFYB8F!\";.@N17&>$<0*!0(YYM3)8KR3+[NOK$_32IJ8F[-^_7P1:)BGA<%@P\nM,&[?OHV!@0$A:^IT.@7C0Q9PXZ9)3C,AG\\<??QQOOOFF4/BC(%5E924.'#B`\nMBHH*^'R^G*Y8N3E*\\EOT9;/9\"XO=4T%!P3@[5A?AF2=;6UN7\"LR9=01LU2H#\nM]E(+(P*%\"M]*AU9Z^7&#P6!@XXS#X1`*6/)D5$X8&:\\F;Y;5>P915I25/-J5\nM3C@Y,Y1;FCF)V-U&:A+;8?GRMV[=*@P.,IF,R#QG9F8P.CJ*:#2*YYY[#G5U\nM=4(F<G1T5(@AS<S,8._>O3A\\^+`(XG-S<Q@9&1%=9Q1U(I89C\\<1C48Q/CZ.\nM?_JG?T)+2PMV[=J%\\O)RH7,1B41$YL9`Y'`X4%)2(O1_?3X?>GIZ1',\"N[-X\nM,F\"'')N-J,O`(SXW*&7M0,[4\"'W(W:PL]\"GMOF0N]5H*8&L-V'+]0GDM<A;.\nM>2F;RLK:%BQ6RL=N\"A!MVK1)\"'U1FX7B_&SW]WJ]&!H:@LUF0UU=':JKJT5]\nM@;0_/CM2`*EOT]/3@[???AM7KUX5=$F/QX-H-\"K8*WS>%/SB*4X9L)6GG>4Z\nMC0\\<.(!=NW:AKJX.@4``)TZ<$'6;@8$!D1`DDTG,S,P(ZSW\"&'5U=:)/@(%8\nM;F22&^-V[]XMX-%8+`:[W8Z''GI(B%BQ48D<=,XY)BR2@-.O6EM;%PVP3J?3\nM*]O&K:)XF%D')+)1&7;_8X\\]EEU7P,YD,OZ\\O#P/`R)-:JFAP8<HB\\HPHV'7\nMD9QALR`@-[:P&TLI=+22!2M;%LGL$UXG)R8YU_SY6JT6=^[<$9*=LIV5U6J%\nMP^'`OGW[4%Q<C*ZN+K2UM8G%0!.#\\O)R5%=78W1T%*=.G4(D$A$*;LR,'0Z'\nM@%DH^L[KW;Y].SH[.]'6UH:FIB:TM+2(9IK^_GX,#P\\+/+6TM!35U=4H*BI\"\nM(!`0+!6;S8;N[FZ1[925E8G6>':!5E96\"IJC3J>#S^?#Z.@H9F9F<@*T#(_P\nM><H\\:EG71\"Z`*IL3WL^`K=%HH-/F0:W50)4%TO,9I),II.<SR-<;Q+]3F30P\nMGX5*HT:>1@NUYMT-D=V25$*4+<S(:PZ%0CDT0IXV*;\"OT^G@<#A07%P,K58+\nMO]\\O\"IAL!'$ZG0);ES>/,V?.X.S9L_#Y?`+79C$_/S]?%,@#@0#\"X;#`ORD9\nMJCQA+(9K+S4^\\YG/X,\"!`^)>^_O[<>K4*8R.C@K)`YX@J.M26%@H9'MOW[X-\nMI].)RLK*'+,#WAM/OC2?V+IUJUAOT6@4!PX<P,Z=.V&Q6`8SF<R_9;/9G^GU\nM^@Z]7@^OUPN;S98#>4F9]]FE[LEL-H^S#7Z5;(_W,\\->%1RRJH`].SOK=[E<\nM'EI?12(1T4XJ9\\@RA8^!C1B<LHK-`#\\V-B;<42P6B^AL4TX\\):;-(&,P&`2V\nMS`8+!AJ90ZR$4?@SZ!XM:W++/-7\\_'R!&9I,)B&.3E$=M@'[_7[!0Z;7(S<P\nMB\\6\"S9LW\"RC(8K'`:K4*+BDU3WIZ>C`Q,2&P2A;(Z!-Y\\^9-]/;V\"JR/#2U7\nMKUY%7EX>RLK*4%96)AP[:FMK!:<ZF4R*9I#9V5F,CHX*W)T2MG0/\"00\"L%@L\nM*\"TM%99E;#SA.V9&JF3QR.^8&^-R^/-*.F\"7A,14:F`^BW0RB?EDKL&`1J5^\nM]_,`M&HUU&I=KA%!9A[Q!14YGCH2B03\"X3!\"H1#FYN9R1),(%3#AH#`43VNA\nM4`B!0``]/3UBOI/>:3`8!.5-/N;W]O8*^(ZPATZG$W`)U0D)09+=PP#&A(AS\nM389S,IF,@->HYT%YVFW;MN'`@0.HJ:E!:6DIKEZ]BA_]Z$>8G)P4)`&>/+@.\nM*RHJT-/3@W`XC.;F9MRY<T?(G-;4U*\"^OEZXV5,^V&JUPNOUHJ:F!M%H%\",C\nM(ZBNKD9A82$>>^PQN-WNK$:C^;M8+/9W1XX<20,0*H]Y>7F\"?40B`VFH6JUV\nMR8`],S/C=3@<N'#A@FCL6TW`EM4PB<<O%[#GYN94+.(R7N3EY=WK>^;E/I32\nMTE*$0B',S,RL/V!;+!8_=1AX1&$&N]XA\\V-9T&)ADIBC+*@C%Q:YBW+1,S.2\nM\"U_K'7U]?:++3-8<YE&ZNKH:G9V=F)Z>QD,//02[W2ZPLXJ*\"IC-9HR.CJ*O\nMKP^SL[,H*RM#964E'`Z'D$>=F9D1M#MRI;E8*-Q$K#,<#N/V[=NBP6;W[MWX\nMXA>_\"(?#@9Z>'@&1C(V-X>S9LTBGTSAX\\\"#V[=N'^?EY7+ER17\"^F?64EI8*\nM+6BV6X=\"(;S]]MNHKZ\\7UQ(,!@5GEP+Z5,G[P)@AB_Q]I7^*@\"^=%.@'R.,X\nM78=XW\"=<0DQ5IN?)=1C.O9&1D1PM:5G-CQL:BZ)R5L_`OMQ@)ZARKC/H$&.W\nM6\"RB$&\\T&E%65@:/QX-WWGD'W=W=:&]O%XU\"3(`((RXT<PB#:Q::Z4`U-#2$\nMRY<OBP8ZWJ/=;A=,,6XN;K<;NW;M@L5B04E)22:=3C_WR\"./O**\\=EDZE\\]:\nM@GT&'WGDD<%[/!;O&OG4[R<DDF)]4'Z/6JVV;]T!.R\\OST\\,C9F&?$Q6XHF+\nM3:![95`4:B&V2Q$DF?NI7!\"RJ`OA#09QN1\"UWM'5U85`(\"\".@62ZL)ON].G3\nMT.ETJ*NK0U55%>;FYA`(!#`Q,8&NKBZ!Z9G-9F'?E,ED</SX<9P_?U[0_\"@7\nM2_,!7C^[-ZEU(>M'DYIH,!C@\\7B$,?'DY*1HXMBZ=2M<+A?&Q\\=Q\\^9-='1T\nM(!:+\"0NVS9LW(YE,PNUV8\\^>/=#I=&AO;T=_?S_<;C<F)R?%Z88;M%+W_/W`\nMJ%=?NUGA)-=J,8]L3A>B+)7*0\"$KOLDL&7+/\"?$I`S)/2XM83HDDA:<W9=/)\nM2E@VLE0J?[>,9U/2(1J-PF*QH+Z^'J6EI<C/ST=?7Q^ZNKI0556%RLI*J-5J\nMH3<_-S<'A\\,AFN#>-6B(B5,6W97B\\3B\\7B_>>.,-&(U&M+:VYDBAL@9\"G?.\\\nMO#QLVK2)&],?'CQX\\)6E6#]\\UK*LZ\\+:?FN9U^J_#P%[HR&1(`!12Z*8G%ZO\nM/[?N@*W5:OUT\"P^'PT+_0[;24E;75SHXH>0%02--8H;L'#2;S:+RS..1DA*H\nM[-Q;[Z\".!\"5FF5VR^DWN-HLQE965:&EIP=C8&%Y]]55,3$S@R)$CV+MW+\\+A\nM,,Z>/8N^OC[H]7KLW;L74U-3*\"XN%CQI9B/<$,?'QX7-F=_OSS%.3:52HFJ_\nM9<L6//300VAH:!\",%+9%]_;V\"JXX+<&XJWL\\'M$%>NO6+1B-1CSTT$-H:6E!\nM>WM[CBT53S@,5(E$8D-.61_DT&@T0'9>=B(1\\Y'9(>^9\\)O28$$9I&4\\GYBU\nMW\"`F-Y%1JYV%4*7RY7)#UF5A#4AFRY!50MIA>7DY\"@L+X?/YT-O;BSU[]@B+\nMO/+R<NS:M0L'#AS`+W[Q\"YPZ=0INMUL$Z60R*8QRZ?3\"C7QH:`C7KU]'<W.S\nM@-FH52(W)[$3.)E,AD.AT+\\O=D_I='HXE4I5\\%DOTF`WOMS!8XU?2[^/M+X0\nM@.,NE^M`-!IUQ.-Q6\"R6_SAZ]&CWAD`B;K=;8+/D-RII6\\KVT94,!E9ET&5P\nMX/&,+X^9MTS;DVE]R@F[WN%T.H78$'%$!JE4*H5=NW:)#LGN[F[<O7L7I:6E\nM:&EIP5>_^E64E96AIZ<'5ZY<04]/C\\\"K5\"H5HM&HP/P`\"\"]&2COJ=#K\\UF_]\nMEJ`=WKQY$[.SL\\(KD9!,,!C$]>O7<>O6+>&3Q\\+CQ8L7T=G9B:&A(0%CE)24\nMH+JZ&I65E2@L+,3Y\\^?1T=$A`E5;6QL:&AIPX,`!5%=7Y^BKL&Y`^&DC3C'K\nMRK#76=C,9#*81S:'U<0`*RO+<9Z3S\\V`S6X_F7JV&#V0`4>N\\6BU6L'=YZE%\nMV6:^W/.5+?GX>^36=0!H;&Q$;6TMTNDT`H&`H)6R\"YAN,/GY^2@I*<&F39N0\nM3J<Q.SN+OKX^A,-AL7'Q>5#_A-1#K]>+P<%!3$U-B;E'K)^=D33]6\"ABGG[\\\nM\\<<7#9!_\\1=_4?G..^]XD\\EDL1QK5@AY+!=<$Q^&#+NUM35[[MRYY\\QFLS:1\nM2#R93J=UK:VM/UW7:5'*0B9)Q6$QC6+B+#K*@7,UF;9LQ2/CSS);A,P2O]\\O\nMJO1LA95;3V4U/]ED=-TXZ0)]B04W+B2M5HM;MVZAN+@89K-9T`.-1J,(OM>O\nM7Q=\\U8*\"`G1W=XLF!*/1*#SK*,!$,29N#/W]_<+>BEV8I/RI5\"I1!&UI:<&^\nM??M@M5HQ,#\"`4Z=.Y1CQ4JF0`DD,/M>O7Q>*=5>N7!&5^9&1$?SKO_XK=N_>\nM#:_7*[!J'OUE4]T/-F\"O_P2ETJASBM,RK\"!33&5-$,)US\")YY%=\"&2P*\\F<3\nMSR:>+)M0+Q;LEQMR]LYK)G1G,IF$?9CL@,Z3JUZOQ^CH*$I*2@1G?'!P$\"Z7\nM\"\\W-S;!:K?C>][XGQ)9X35:K54\"17`<TR\"!-E+K2%'7B_Y-.).>6J6VU)1*)\nMIY2GB84Q\\3X'[/12%,+UT/H6NC33`%[>B+6BE1;--09B5I!9>%@L.*\\FPUY,\nMM$9FA<B%!SF+IJ@_BSG*YAMN`NN%1BAE2JT-&3>4W6,HF/^QCWT,+2TMZ.CH\nMP(LOOHCJZFH!X<C&`MSTF*4R4\\O/SQ>-2L2FJ?--)@?OB_\\_%`IA<'!0L$G:\nMVMH0\"`104E*\"H:$AE)24H+FY&7Z_7_CHW;ES!WZ_'P\\__##R\\O*P=>M6_-$?\nM_1%Z>GKPLY_]#/W]_:BJJL)KK[TF\"F,R]9'PU4<=$I$3#;G#E@%6+FHK80AF\nMP[(=E=P+0-T=_GQNPK+@&;L$9;A$-K->CB4CZY+P^VTVF_`8K:BH$/9Z+`0R\nM@\"82\";2TM&!R<A+!8%!P](N+BX5IQ\\<^]C$</WX\\IVFEM+140)<FDTDP.0A]\nM4.<:@#@QLI;#[#^=3O?<Z[[2Z?0[Z73Z*=E\\01K+!>SD!@?L^`JFD6J-W[=A\nM0ROAS%=T.ETF/S]?0PXJ/>^&AX?7]4OXDI4=:W(57.;&,DMDAL\\\"\"C,7>7&L\nMQ%-R)44I^9C,3(@-#&2\",`.]<>,&3I\\^C7@\\CKJZ.@P.#@H&`+O<B,6GTVD4\nM%16)SCN-1B/:EMEH,3<WAVO7KN'&C1M()!*HJJK\"YLV;A:8$,_JIJ2F<.7,&\nMD4A$=.(%`@$XG4X<.'``A86%>.VUUW#[]FV83\"8A!_K::Z^AL;$15555PL^0\nM>*?%8I$I2D*-D`U&Y)M_L$5'K/O]LN@HFP0OIBXI9]O\\&I,%ZD_+#O`R390;\nM/.F1%)>2BX8RC,?K66Y#9#,.Y[U>KQ<-5L7%Q2*1H,<EV_%Y6F(@=;O=\\'@\\\nM\\'J]F)J:$OHS.IU.:-LP8#-QF9F9065E)?Q^OW#?8:;->R5KA)L[76M4*I5G\nMF9/#\"->9,F!GL]GE`G;J0Q*P9S^0@/W((X^$SI\\_W^ERN;9W=W?#8#!@>'A8\nMN+;$8C&$PV%A7\"MC:,R,EVK,D+^N,)C,82:PHJX<8V-C`B:QV6PY&2AI2;*?\nMG9PAL:C$(A(7H.R<P\\\\KC\\4\\3@,0K;L`1&<C37_I8-+8V`BM5BM,?[FPIJ>G\nM8;5:,3HZ*BKK$Q,3.'OV+/+S\\P7=CW9E6[9L@5ZOQ]#0$/K[^[%OWS[,S<VA\nMJJH*'H\\'K[_^.N+Q.!P.!R8G)X76`XLWQ/_9=5I65H9MV[:AMK86:K5:%)7C\nM\\;AHQ9:A)MX;LZ?[#8DL9V$UGUD[AC[/#/4>#N>+?5Z>J\\KLFQK8E#-82A2+\nM8E/*GRM35_FNN\"F2N<)W:3`81$,/V^$I['_CQ@W1]DV%2H?#(4Y)`.#Q>*#7\nMZU%=72T<UZFI0T+`UJU;\\<4O?A'?^][WA&0QM:]=+M>[E`R_/T=0;?OV[3\"9\nM3((&2AB&I\\P%/9M[[D1>K]?G<#A$+.&I>J$@[UTFV*=YFF&V+ZWIQ#U.^QEJ\nM);'#>*4!F[18,FD6Z@+='TC`!@\"[W?[FG3MWMI/[S*(7%Q6/\\;(JFGPT6FS2\nM;P23@\\4-,CF,1B.L5JN0B)2A'&4F3PQ2=H*7E<88\\-<[9F=G,3X^#I?+A?S\\\nM?$2C45RX<`%]?7UH;&P4IP@`HIN2+]WG\\\\'E<F'W[MW8O7LW`H$`3ITZ!>J3\nM7[QX$;MV[<)SSSV'^OIZW+Y]&Y.3DP+*H?\"3U6H5UFC,>!*)!'[O]WX/&HT&\nM8V-CZ.WM15=7%_Q^/\\QF,UPN%V9GW]<DX<%8Y`3*]<1_$T9C<-^Y<R?JZ^M%\nM>_S<W!PF)R<Q.#@(G\\^'39LVH:BH\"!Z/![MV[1(-56PRXP9!!HA,HU.I5/!X\nM//CD)S^)5UYY1=1#*-_`%OVFIB;8;#:83\":!77/]R^MMX03=#^\"'RVS4/CK4\nM+`*WSKS/&?:RQ\\AX/)YE4B?5\"SZX@%U86/AF)!+Y;R:3\"6-C8S`8#!@='16!\nMD99,Y%0K1>WO%7#?6_A7K4I+A-DB^8S$$NG^(1<UY>(DN\\CD(RMW\\XUJK>[K\nMZ\\/P\\+`H'E945*\"\\O!P6BP7;MFU#?W\\_QL?'X7`XA.E`144%FIN;$8_'\\;&/\nM?0RCHZ-(I5(8'1W%Q,0$>GM[,3,S@[*R,C0T-*\"FI@86BP6SL[/\";(#Z$[=N\nMW1(-.VZW&P</'A3MT]%H%(.#@\\+RC8N=..M2+C_O-[Y\\'VN.[V[@'V+(A@8+\nM#H=#%\"@YUW4Z'1Y^^&$<.W8,;K<;%RY<0']_/Z:GIS$S,P.OUXO)R4D`0']_\nM/RP6B]\"^9EL[-3W4:C6L5JN`-)C,L$/V4Y_Z%\"Y<N\"\"R96;.#H<#6[9LP8$#\nM!X1)-UO\\9?$MV0@WD\\E\\Y<\"!`_<,@CJ=;IHT5EDG)IO-9@\\>/)A=1\\\".WX^`\nMG4JELJ0HT]PEF\\U^<`&[J*CHC;R\\O&Q)28EJ9&0$`#`U-26JP)E,1K3A4F/$\nM8K%@<G(R!Y*0*7=K$5Q?;,'(\"F;$N*F25EA8*+C3,AV-\\`:I>G)UGSQH0CKK\nM&30BC4:CZ.[NAM?K145%A;\"`XO70-FS/GCVHJZM#:6FI<)DA(V-^?E[(6DY/\nM3R,4\"J&\\O!RA4`@='1T8&!C`U-143@,'FWDZ.SO1U=65L\\$1:I';G'G,)>60\nM*HT/Q@<STNFT\\#ND%9=&HT%-30UJ:FKPU%-/H;\"P$#T]/;AZ]2K>?OMM`3>:\nMS6:1L$Q-3<'G\\Z&]O1UNMQL[=NP0S3+*KDO.>9/))`KCA86%L%@LZ.GI@=/I\nM1\"J5$LY)]!\"=F)C`]/2TV,0(@[#^LY!(W=BS9\\\\K*X#\"?.SX7:T#_>'#A[/G\nMSIW+8'&-ZOL2L-5J=81%_X4X-'WTZ-'I#RQ@'SY\\>/2'/_SA+;U>OYUJ8\\1&\nM62`A?L.OL0C(`$'.I\\PN62R+74V&S:*-TB:,$P6`*'[0^HE'0=+U9(A&;@K:\nMB`V%F0J]]3BIAX:&X'`XA'3F^/@XK%8KGGCB\"3B=3MR\\>1,#`P/HZNJ\"Q^.!\nM6JW&Y<N7T=#0@/W[]PL3W)&1$0$')9-)T5I.AH/<],)N.N+G=+V6I2MEG)Y.\nM]!_F#'LC?OZ'.</FACH]/2W<8)J:FG#HT\"%LV[8-1J,1G9V=>.655W#Y\\F5,\nM34W!8K$(DP0F)2QX<W.WV6S8M&F3H!8J84J>2BG).S,S(]A-E'P]<N0(K%:K\nM*)QSG3/3)%M&[EI,)I-W5PAU^E.I5#J52FE)*62&O<)'E]K`@!U=[I<9#(:@\nMR^42LA+O=W;]GH\"]\\!)/9K/9[<1WY6#'@$QW<C:X%!04\"\"T*<H#9WKY4ZZVR\nM$K_<@B'>IG3DUF@T`I;AA*%5$S,/.K\"PTU*I.+C>05H7!938*!$(!(21J<5B\nM$<&VJ*@(.IT.$Q,3Z.OK0W5U-<QF,Z:FIH0$K-/I%&J!HZ.C.51&>@FR,X\\G\nM#?)N4ZF4*))&(A%1V>>]\\\\0A&U9\\N`.VZKX&[.7FX/T.V-1O!X#R\\G(\\]-!#\nMV+MW+UPN%^+Q.-Y\\\\TV\\]=9;P@398K$(N$MNH3>;S4(%<&QL3/0/,.ASKK,0\nMFLUFL=!]ATPF@\\G)26S>O!E;MVY%?7T]=#H=]NS9@X&!`9$4R*?30\"`@H!'9\nMT2>93*XH\"SIV[-A\\7U_?3\"J5*I)E`X`5[Z_I-63+:_D>`$!>7EZ(ZW)A?/`!\nMN[R\\_']%H]&OZ?5ZA,/A'+4P?C\"S9<%!YC`SF-/0E=GY>HN.2G:)[\"')`DTT\nM&A4;\"MN[R7@@1B;;2FT4^X&^>-%H-*<10U[H9'683\"8,#0VAN+@8]?7U4*O5\nMZ._O%U*VAPX=PN[=NS$_/X_N[FXA3\"6KNK'[3JU6P^%PP.?SY7#(Y79KM5HM\nM.BUEX2%N8&R.>#`^N,%W7U)2@FW;MF'GSIVPV6SH[>W%[=NW<>/&#4Q,3\"\"5\nM2@G)!-FRC2<JN1Y!6=A3ITZAH*``I:6EPD.2&SW9*.PNI@'!L6/'4%!0`(?#\nM$8G'XU^>GY__SW0Z?3B=3O^SR62J8O)&WU?9-G#ANE8\\H?+S\\WWI=+I(9G>M\nM(F\"GWD\\,.YU.^\\G`,1@,V;FYN1<^\\(\"]8\\>.2]/3TZ'BXF+KX.\"@>/E<_'*K\nM.'?4T=%1P2TFIB8;&RQ6V%I-ALU@HX1$N*N;3*8<'6YF^6RZX80F'9`ZQ+R?\nM]1;>QL?'A2^C7#`R&`Q\"7&=Z>AIVNQUS<W,X=>H4]NW;AYT[=\\)NM^/))Y\\4\nMK<%&HQ$C(R,X>?(D?#X?RLK*,#(R`IO-)J[79#().5#BD'PND4A$X-7$Q2T6\nMB^#7RL6BE7H\"?M`9]CS=B2#)IJ[P3P\"81_:>(>\"#SK\"+BXM17%R,TM)2F,UF\nMC(V-\"1.-@8$!3$Q,\"&&P\\?%Q3$U-\"?B+)S>52B4Z:&E+-C\\_C\\'!0>%/6E!0\nM(!@9E)3-9#)\"O\\;A<,!H-**YN1DS,S-PN5Q?V+)ER\\^:FIH`X.2Y<^=V&8W&\nMGD0BX0J%0L*!?79V-L<R<'Y^?L4!6Z?33:]44V6#LN6E`O:R5*ED,CED-IOG\nMM5JM.C\\__Q_W[=MWX0,/V,\\]]USJU5=?/=72TO+)L;&Q',ZH_*?2M80V0S*6\nMS&(@\"RDLL/'G,!N5`X@<Q&5)UGLM-A[5F.'+&PJUCV4>-X^'K(++M#YBO;(X\nM$YL09.=QN<5>=L-9F(3B&LACID@[-P<6CU0JE>@JHY8)X0XZZ5#(28!M\"QY_\nM_+K\\K&1]\"6FBB8U/&816DETO&U#7J36RW#5D:*20!;*J]_ZIUFC?E1O)8M$_\nML\\M<WW)%Y^6NC^Y*S%IEM3]:T3')X.=96]'K]?!X//!X/'\"[W<AD,A@>'A:N\nM3T>/'D5'1P?L=CM.G#B!4\"@D9!#Z^OJ$'CWK)&:S621)*I4*D4@$O_C%+V\"U\nM6F&U6L7F'@P&!8_<[7:+.5Y45(31T5%H-)J?;=FRY6?R?;:VM@;>?//-/_'[\nM_3\\Q&HV:<#B,SL[.Q;3H5QRPM5IM9&9F!FZW&RJ5BA9XJ\\JPY4:DA;K5DAG8\nMT:-'L^?/GT_'XW$MO5T71O]RO^RQQQZ+G#MW[E_*R\\LGMFW;]K<?1'*C76*\"\nM_B^/Q_/)1\"(AM*J5F8B<G2E%G3A9V,5$SC$]\"2.1B)!:908H_VSYB$5:TGH&\nM89Q0*\"3^+F/<Y$C+K<CR0N4BD`NI?\"8;X6DX,S.3(T;$8,SGNAQM\\C=E9%5K\nM^_-^#V:M[&2564H,CIPS+%\"SD.=T.E%<7\"QJ1\"J52KC=`$`@$(#+Y8)&H\\$W\nMO_E-?/_[W\\?ERY=Q]>I5//[XX^CJZA*-3X1'2/=D@M'7UX<K5ZZ@LK(2-IL-\nMF4P&1J/Q/88(\\AX/X`N+W>O^_?M_=O+DR5WQ>/ROF6PM%D)6^NQ4*E5R'8]^\nMK7AT>I'8U[^27]C:VOJE#W(-:)=XB\"<W;=J43202*MHKW>LH,!G%3P``(`!)\nM1$%4J33)Y9\\DQ>MT.EBM5MAL-@#O=@HR&/&8OA@\\LAI7]65V<2%4'XU&$0Z'\nMQ2F`FX%2?%YN`N#B8X!6GB[6*T`5\"H5R6J5E..G!6#^D<K^'C./*<!3GB=/I\nMS-'*T>ETL-EL.<U?A/%8,V(K?\":3045%!8J*BI!,)O&'?_B'>.>==[!CQP[T\nM]_>+5G19)5`^-7`.=W9V\"EWN4\"@$J]4*O]^?TV4LG7#_[<B1(Y&E[E>OUU\\.\nMA\\,BJU\\DH=\"L,V#?3PP;>+>QQJ#X7-]'8:YKETC]1]O:VF[EY>5M5^*<]Z+J\nMR1V&LJDF2?H+1088#`8XG4XQT<?&QG+T1>0LA9U\\ZQETT9:JV*)]EE9-,D=5\nMGNB$5F3[,_EDL1%J@4I(2\"DC^^L@OO3K/`BOR<5UN<[B]7J%S*K;[49)20E<\nM+A>,1B/4:K5PC*$Z(,6H&-2M5JN@HB:327SWN]_%=[[S'71V=J*NK@[1:%2<\nM9CF7Y.R9UEW\\.EE%%!9;Q*CBO^YUOR:3Z48P&!1UFT4\"]H<]PXX!L*TEP_Y0\nM!NR%EW+2X_%LI\\FK#(,LAF<OEGG+6@SLBF2AA\"P.LDV(X1*/8Z:R$4.>O/+Q\nME:P20B3\\4^9PRQ-<SKX7@X;6L^`7>V8;Y:CS(,.^OX/:.K)^#FL@#-RDOY:7\nMEPLI5/I#LA@NSSLZM5LL%OC]?O'OLK(RZ/5ZU-?78WAX6/P>9N:$0[CAL]Y\"\nM,PIY72F-&!9.!>'E9%&_\\I6OC+STTDMAF\\UF66)^KB9@)]:18:]5R$GY=7]K\nM:ZO_(QVP$XG$B6W;MGWMXL6+.:8%BV78\\C%P,:LD%A[#X7`.;LULMJ2D!(E$\nM`M%H%'-S<XA$(N+?5\"=;SV#ACXM\"R9\"@>PL#-D\\!K*13VX%5=9G+O1'C7M*>\nM#\\;Z`_;[X>PN)P)L'..<J:JJ$OK5[!AFLI!.IV&WVP4D8C:;45!0($Y]P6`0\nM3J<3B40\",S,S:&EIP=FS9_$G?_(G<#@<^,E/?B)XU.P%8(;-(MSX^#CR\\_-%\nMT9^8=S:;%7Z6S.`SF<RY`P<.+$O,3R020YE,IFF]]95U9MC9#0K8_1^5N;YD\nMP`X&@Q=W[]X]>O[\\^3+E@E`6'^7@+&>*,LN#08CZP<ED4AS1:)I`79#\\_'P1\nMN)5J9VL-B)S(,K3!#(/71=YX)!+)R;B9`2D#A&RAMA%!9S'KIY4XDCP8'_S@\nMO)<%Q2C&1;6]4\"A$!@:<3B<J*RM1556%V=E9L+/88K$(F51RY#T>#SH[.U%3\nM4X.+%R]BSYX]B$:C^-W?_5U<NW8-8V-C(@#+&#894,S(4ZD4HM$HS&:SP,L7\nM6!FR(>Z5%:6VF<Q8)I-IV@`+N?1]>!VQ50;LOH]\\P#YTZ-!\\(!!X$<\"?KW2R\nM+G:D)P9,/C1)_PS8>KT>$Q,3PJ26'91&HQ'A<%@0]-<SV/8J&R;('U:K55P7\nML6UV=>;GY\\-NM^=T?<JMO;(NPUJ'7#A2'E-EPX8'X\\.98<_-S>5(->3GY\\/E\nM<F'3IDVHJ*C`W;MW$8O%,#HZ*N0(S&8S]N[=BUV[=@G&B,?C$0J.F4P&9K,9\nM145%N'OW+IJ;FS$X.`B'PR$:;<;'Q_&UKWT-7__ZUY%.IV$T&@5'GXTU^?GY\nMJ*ZNQMZ]>T57K-%H%(Y&+)1*D,A*G5$F.$?7$[!5*E5F'9\"(:HT9MK(-_>Y'\nM/F`OC)^XW>X_'QD9$95L*FNQR$'=W,46CMR52/<+`7(M3!::%,CL#;I]4VW,\nMZ_6*0B$[_>3./5J0R<X<LA&!;+*JQ)^)47/(DX^_+QJ-\"I<8XN^\\?L(\\RNY+\nM&<L,!`+B6N4Z`*]Y,1WJ7Z>`N1RT<[]YW.L=K&'(FZ<LXTO,F:?'39LVX=EG\nMGT5!00':V]OA\\_F$)@S=[\".1\",Z>/8LWWWP3^_;MP^___N\\C%`K!X_&@IZ='\nM=!Z&0B&X7\"XAG\\LYGD@DT-S<#`!X_OGG\\0__\\`\\(!`(H+BX6F75U=34.'3HD\nM&%I]?7UH:FH27:X&@T'P_A>Z:(-;MV[M7,DS*2DIF<C+R\\,[[[R#[=NWK_G9\nMVNWV3'=W=XZ>^VKG`WTE:9XP/S]_SPP[E4J%'`X';#8;LMFL'\\#__*BLM7O.\nM](]__.-M3J>S1^:.JM5J!(-!!`(!(;VX47``,]Q()\"(@D6@T\"H_'@Z*B(B%F\nMQ!?#H$Q(@[@W`ZC)9(+3Z=R0#\"H0\",#G\\V%R<A(^GP^A4$BP8'@R(+0C8YGL\nM!B-^*3O3;$2P>C#N_Z#K.0,TG59(!<UD,F*3;FEIP=>__G6TM+1@='04UZY=\nMPYT[=S`T-(3IZ6G,S<V)=O\"YN3GX_7[<OGT;/_[QCU%?7X_V]G9LVK0)965E\nM.4RK>WV$PV&4E)1@Z]:ML%JM4*E4:&QLQ\".//(*:FAJHU>J_!9\"6C825IKX+\nMR<W0*A[+A*S7O8Z168R%MLX172:K]RTD6'ZU6OWQUM96[T=E+BZK?%196?G3\nMNW?O?D/&DBEN)'?NK1=CYLOGY&'6S(!(V53*05(PAZWILA8OF2<;-*'$9D!\\\nMF]F/Q6*!7J^'U6K-T1!1NEO+33`RAB[__3<9LOBPC\\4XUNPP3*52*\"HJ0EY>\nM'IYYYAD\\^NBC2\"02&!T=Q>3D)-Y^^VVA,T,9418HF:2,CX_#8K'@]==?1WU]\nM/:+1*&IK:]'>W@Z+Q9+#/I']41G<\"@L+15>OT^E$5545=N_>#8_'DPP$`G_Z\nMY)-/_LNE2Y>^FDJE+#PM$&>7NR_3Z?3P*M[I)).2]2XO>8XLW%?V/@?L_U\"K\nMU6,`_OO1HT?#'Z6YN&S`KJZN/L\\F&&;8#$!^OU^P+M8SY&R3`3N12`B:T\\C(\nMB`B2]$*,1\"+\"GY!!F45,F0?.HLIZAMELEH5M!(Q#?6MF6*10R;Q<PCU+02(;\nM82+\\8-S?P2Q7-L>0:Q@U-37X_.<_+[0^9F9F</+D29PZ=0HVFPW3T].+SA&5\nM2H5H-`J[W0Z+Q8(?_.`'^,YWOH-8+(:>GIZ<QBY9#EAI:EU55254*??NW0NG\nMTPFKU>J-Q^.?.G+DR.6%@!ACP*8.#<T+)/GDU03L\":Z!C<JP5Z,OM`S6?<^`\nM?>3(D9,`3GX4Y^*R`;N\\O/R*V6S.))-)#=D;=\"R)Q6(H+\"P4.@3K\"=@RE\"`W\nMC6@T&I%-,P/7Z730Z72PV^TPF4S\"0($!$LAM[5YOELWKH\\I=-IL5!JR$B%CA\nMMU@L@E5\"[/XWO;7\\HYYA4\\*`)[=L-@N+Q8+2TE*XW6Y\\XA.?0#0:A=_O1U=7\nM%_[]W_\\=R602965EN'3IDO`<):0B2XFR%9U\\[!=??!&?^]SG,#DYB4<??12C\nMHZ,B*5(&;`ZGTXFC1X]BQXX=V+5K%R8G)R_[_?[??N*))\\:E4V*,$!V+DA1+\nMXSW-S\\^O\"A+9H&[<C-PTMT$N4-%?U[6T;,!^_OGGPYV=G3=/G#BQR^_W\"_]!\nMC\\>#<#B,8#\"X[@<L:US+&0R[#VF;1'\\Y@\\$@,&'2H&*Q&(+!H\"@\",FAOA-[U\nMW-Q<#IPA4[BRV:P0O6(&SLR;613YW,HN1D(FO^XLD`\\#3WJ]&S;?*]]M04$!\nM:FMK45U=C?;V=C0T-.#4J5,X?ORX\",RW;]^&P^$0$@U,1IBM,ZF8G)R$V6Q&\nM75T=VMO;\\?+++^-+7_H20J%0CLL2`[:2/EM24H(GGGB\"YL[_$@P&__3IIY].\nM*M98C+^?<Y<:UU(=9349ME]>LQN582_\\N9Y=(-':VIKYC0W8`/#HHX]>&A\\?\nMWT7!?;/9+\"0[,YG,NH,BL3T>^Y1\"2RPPLBC)[);PB=/I%`R+_/Q\\D9$S@U@O\nM\\X(;ATP-E*O9+$BQH$1U0/)IY=9WF4[(\\:!!YL,]R\"+2:#2PV6PH+\"P4%+Q(\nM)\"+,<`T&`W;LV('.SDZHU6K4U-2@HZ,C1U\",K!+.&<(3A86%\"`:#,)E,.'/F\nM#)Y^^FEDLUELW[Y=-'[)<Y`_2Z52\"3G5V=G9OWWLL<>^M00.'U=F^5Q/7+\\J\nME6IX%8\\EL$$&(!GEYKB*#5SUFY1=`RML(8W'XY>:FYOQQ2]^$4\\]]134:C7N\nMWKV+<#B,S9LWK_LB9$E3>4+*&6XBD1!MN+*8T_3T-`8&!C`[.XN\\O#P4%Q>C\nMNKH:965E<#J=&^)7R,Y'L@*4U#WZ7*92*02#0<S,S&!V=A;!8!\"12`3A<%@P\nM7KC9K$;>]-<AP[[7QT<%%G&[W6AL;,2N7;M075V-3\":#P<%!T2`#O&MF\\9G/\nM?`9[]NP1]#K9@4GF/3-HEI65P6PVB^*DQ^/!M[[U+5'`EH.ULDE-I5+1.N[V\nM4L&:&+;\\O.6@+4$2,RM]'H\\]]EA<K58G-BK#5C!%UN,X,_?KO)96M#T6%Q=?\nMH@[OP8,'L7__?KS^^NL8'AY&6UN;$.FG,E\\H%(+?[X?=;D=5514F)B9R\"HLR\nM/LWO8:8M=A()TY9W<6+\"+`0QP^5B(`5+I].Q^`*?SR<XU0`$7,%)2TB%FA\"D\nM;!&>X8128M%<1!2G(K;.3<CO]\\/O]XOBD=ELALED$EQVW@]IB,J%N5+JWT;`\nM/O<;4E@I9*(,2BNY_^6^SDQ4\"6GQ^V*Q&.QVNYBS1J,17J\\71J-1\\*M+2DI0\nM7EX.B\\6\":#2*8#`(C48#N]TN\"N2)1`*3DY/0:#38MV\\?\"@H*</[\\>5R\\>!%^\nMOU_@WA,3$P\"`.W?NX,B1(PB'PP@$`E\"KU=#I=)B;FX/)9,+@X\"!J:VMS&K_X\nM7.03GM%HA$JE>GF9I\"/F]7IA,!C@]7H%A*=XSJORBIN?GP_,S<T5T7F*\\W\"5\nM5-4,$S\"N]946X</AL-=BL6PGIQP`HM'H@X\"]>_?ND9LW;_I2J92+HDU;MFQ!\nM964ERLK*\\/;;;X.68K.SLS\"93*BOKT<H%$);6QNJJZO?HYU-7>I8+`:3R;2N\nMFV`S#5\\ZM:[92<EC)PNF++1HM5KA3<>B(H,T<<>-R(\")J\\OWRZR=)JC*C%.&\nMA7[3.QW7ZPC#S9F;KA(SE3=YOI]4*B6*C0T-#3\"93**+4'X_I,GEY>715@M.\nMIQ,VFPTU-37(9K/HZNJ\"Q6+!\\/`P\\O+RX'`X</7J53SUU%-H:VO#MFW;!&.#\nM+*1,)H/9V5EQ'<I`*,^7A3ERXU[/()E,QBHK*S$U-26T?<APDM&?5;Z:H$JE\nM*EKGZUUS(X):K1Z5@_W\"IA;^C0_8\"T&L,YE,'J80$E7#JJJJL'/G3IPX<0(W\nM;]Z$R^6\"P6#`Y.0D`&#7KEWP^7P\"!F#3`0MR&X'?LGI/RS\"VW](DF`J!-IL-\nMH5`(,S,SF)N;$SQM\"N(0/N'/(FZYWF,[3P1L\"J(Q+C-OV>)KL:#]`.->?\\\"7\nMV_V9.,C*>-RPV2UH,!A0554%H]&(RLK*'&=P>5[(7'\\V=5$'Q&:S8>?.G?C$\nM)SZ!'_WH1R@N+A84OXJ*\"DQ-38G3G=(T@T'59#+ES`=YSBNLM3J6\"=B#FS9M\nMPM34%(J+BZ$PO17_;97/-;@!\"4UV'0%[A\"<%6M^IU>H'&?;\"!+J=3J</9[-9\nMA$(AT6&HT^E0556%KW[UJ[AY\\R9>>NDE]/?W\"V=P'L/4:K5@1Y`+RB+A>@6>\nM2)OBSV8S0\"P60UY>7HX^B=OMAM%HA-_O1R@40CP>%\\5!+FRE4-1Z>=+4.2:<\nM,S<W)X1XF)DQVR=&ST7YF\\`BN=\\9-N$SF<LLPT^Q6$QDX=26R6:S:&QLA,5B\nMP=S<7`[EE'-.AM:HE4/;J;FY.1B-1C@<#CSQQ!/HZNK\".^^\\`YO-AG`XC)J:\nM&ERZ=`FMK:TY\\@Z$U4PF$T*AD*`3*C-KN7B=S6:3V6SVG@[>3SSQQ)<O7;I4\nM/#8V]BD6Q65]G+5DV!L4L-<\\-!K-*%DT4I/:@PQ[`??U,4.>FYL3DW)^?AZ-\nMC8T8&QM#8V,CMFW;AK:V-KSXXHOH[.R$P^$0W&G*.A*2(&:UWH`DPRU\\>80@\nM5\"J5R&R9:5,5T&@TBGLAHX2\"2UR(&^$J+A_)1;5$6OS)9%*(7[&K4Z8!/LB0\nMUT\\;E?7-^3G6/8+!(-QN-PP&`TI*2@3KB,P?<I<)K_'XS63`;K<+*SMBWHE$\nM(L>E_NM?_SH^][G/\"9KGP,``/!Z/^-UZO1[!8%!L##J=#A,3$T*_9S$H1#*^\nMO=G2TK+L1$FGT[\\PF\\V?\"@0\"`HNW6JURM_*J`K9:K=Z(@*U:3\\\"F$SR?C5JM\nMGOQU7@NK$1I'*I42`O\\.AT/`\"->O7X?+Y4)=71VT6BT:&AKP-W_S-_CC/_YC\nM.)U.!`(!!(-!Q&(QV2AST4+>6B$'65Y2YJCR*!L*A>#U>C$Z.HK9V7<-DFTV\nM&SP>3XXQKQP<\"+5LQ/7)CC:RB2\\`H<WB]_L1\"`00\"H6$)CBAI(\\ZR^(#S4H4\nMHF!RTPAIGR4E)2@H*$!=79UX[]>N7<.9,V>$!@@`L;&R>,Q$A#HRS)*Y\\?+W\nME9>7X\\_^[,\\$_,;3Y>SLK`CR3(`L%@LJ*BI$]Z(R0,N<\\(6/ZRMY#HE$XKS9\nM;(9:K19K0`JX\\ZVMK:M:C!^\"#'N$M2\"N)[5:W?,@PUX(?MR)*:Q$B*.XN!@C\nM(R,`@**BHH#+Y8H'`@'#@0,'[/OV[<,++[P`-MU$H]'W6'%MP(O+N4ZE.(ZL\nM!2&WOE,+A,&:BH2T$6,[\\49@['*FR,U*9H:D4BF$0B&149&AP';[E=[_@PQ[\nM<<A,IM/Q<\\2N:VMKT=34A,[.3MCM=G1V=B(6BZ&[NQMS<W/P^7QP.!PH+2U%\nM>7DYW&ZW,.!0FDW+DJ-,<JQ6*P8&!O\"I3WT*UZY=PY4K5^!T.C$Q,0&'PR$*\nMH0:#`=75U2@N+L;>O7MQY<H5Y.7E\"2,/6:A)(>+TDY4\\A\\<??WSHW+ESDX6%\nMA44W;MS`[MV[9:7*Q!K>2V@#X+K%?L\"*,$BU6CVJU^O[52I5S4(BF%2KU2\\^\nM\"-COOIPDH8Q8+`::\\S(;\\7@\\/YR?G__&PP\\_/,;O>?/--^O#X?#G__(O__)/\nMVMK:K&?.G$%75Y>`*C9*G)\\9\"H^X,HV+D$A>7IY@8R02\"7)7830:45A8\"*/1\nMB&PVBV@T*K)<>;&O-V#()L7*0$0<GU*NS*[IN;=>%LUO^F`=0@ZFE/'-S\\_'\nM_OW[45M;B_[^?F0R&?3V]B(O+T\\D(:=.G8++Y4)C8R,T&@W<;C>L5JN@D]*O\nMD5*_=%EB1J_5:F&WV^'S^?#M;W\\;G_[TIW'^_'DT-36)SDF]7@^;S8;FYF:4\nME96AH:$!ERY=@L_GRS%EED7.%DYN0PT-#6=7^BP2B42WQ^,I&AP<Q/[]^Q$.\nMAWFMB34\\VN!]\"M@3*_G&1QYY)'3Y\\N4&`%])I5*[5\"K5O^[?OW_T0<`&4%Q<\nM/!.)1#`S,P.WVXU@,\"B\"G$:C^4)+2\\L/E=^S?__^.P#^!L#?:+7:I[=MV_9_\nMW;AQH_S,F3/HZ.A`.IV&U6I%(!\"`P6`0&AS,AEC4G)J:@L/A@%ZO%UV,LI:T\nM4N-:SFSY-65S3BJ5$E`-J8@4X:$C!PT4@L&@V`CD-GH6L.0-:#'''?FZ%IO@\nMA%UDK#*52F%Z>AH`1%&*1W&>3KAP97ZQO*!Y/<N)7]WO8ZWR_2SU+):RF%O)\nMADG8@Z<GN1`X.CH*E\\LE\"GF)1`+EY>5H:6G!YLV;45M;B^/'CV-@8``#`P/P\nM^7Q()I-PN5RBAA$*A7#Z]&D,#0U!I].AJ*A(L)#(2J)6!YNHV(5(`3*=3H>9\nMF1GLV;,'[>WMF)V=14%!`?1Z/7;MVB7P<ZO5BENW;F'KUJT8&!@0M-C%LNML\nM-CNRRG?1F\\ED6CF'I'>_:FPR&HT&+18+8K&8.\"G$XW&8S>;5X'194AIM-AO?\nMW8H[+A]^^.$4@'_XC8'W5I&E3\"\\A\\Y@]>O3H#Y?[_OW[]Q\\_<^;,R1T[=OQ5\nM65G9_];9V;GERI4KZ.KJPI8M6]#9V8F)B0F4E97!9#)A:FH*B40\"#H=#8(',\nM/`E?,%@NA^,J`Y+\\_PGU\\'/DO:K5:H%11J/1G(V$09&B.?GY^>\\)0AN),1/_\nM)^Y*76WBX3Q2,Q-C`\\:'30U0:2VWD1FTW(Q%*AR+SZ6EI4(.U6PVHZJJ\"OOW\nM[\\?>O7MAL5AP]>I5W+IU\"_W]_?#[_2)(<[.@B8!*I<+(R`BN7[^.NKHZU-?7\nM\"[83YP4;I)C5Z_5ZT$9+I],A'`YC;FY.>#G6U-1@UZY=J*JJ$K1`6=6/\"8E<\nMCY'-.>;GYS6K?`=]U+=7S(OY-;S/$.]3\"46N9@]9Y',C>##6C6'/*.E$\"Q,I\nML-*?<?3HT32`;P/X]KESYYYV.IW?+R\\OK[EPX0*JJZL1C\\<Q,C(\"O]^/TM)2\nM9+-9C(V-P>/QY+@^,U!Q\\BZ7(<I?ERW,Y.#!`E\\T&A79/H-B0T,#(I$(_'X_\nM@L&@R&KE1;789J`T^UWK2\"02.9`)W7A,)I.P79/Q<?Y=Z6CS80G4]SIM*&L1\nM*WEV<A9.-D<VFT4D$D$\\'H=:K1:<YN;F9CSYY).HJ:G!Q,0$WGKK+71V=N+F\nMS9L8&1G),2D@S,9:`G].;V\\OWG[[;>3GYZ.QL5%`7>QXI#X[_TVQ)Y[(#`8#\nMBHN+T=34A%V[=J&\\O-QOL5B^F,ED_BN12#R>3J?_,IU./YK)9(11B-S*SH^%\nMSZ_J>*31:/K8&:@H^&?7\\%Z#3`@44@O9!P'[`P[8F4QF6M[=>>1>L-A9]6AM\nM;3T.X/2.'3O^ZM\"A0W_UDY_\\Q'#GSAV4E)2@J*@(DY.3\\/O]*\"PLS`E&#$@L\nM#)(2MUS`5F;5<A8L>TW*#`+Z]%$1D%AE+!83NB!<.,J`)+>8KS=@ZW0Z<:V4\nMF:5C25Y>'FPVFS@5R'SBC6*Y;&307NK/M09KY?N4WP4S;JO5BH:&!C0W-V/_\nM_OU\"3_W<N7,X<^8,=#H=?#Z?H)_RG9):65Y>+N0-7\"X7-!H-VMK:D)^?CYJ:\nM&N%:+F^<7\"?S\\_,YFZ;1:$1]?3V\"P2!V[-B!VMK:L60RN7/__OW3\"Y?]ZNNO\nMO_Z:1J,YGI>7]UN12$2PC&07(S*C5IMAJ]7J/OH_QN-QV1)OU9-4K5:'M%JM\nM,`N1UN=JLO7,@X!]'P*V5JN=X1%;(?/H7^LO;VUMC0'XUNNOO_YOW_K6M[Y_\nM\\^;-9W[\\XQ^CO;T=+I<++I=+:#H0IV2'&5D<&Z&CH:3)<8&0?SLU-06GTPF/\nMQR,R?Y_/A]'1400\"`1%0Y>\"TD1V*+%K*1V,*!1$#I]0LZP!*Q<,/6[!>\"AY9\nMK*MO)1BY3!.EKDU^?CXL%@O*R\\NQ<^=.-#<W8WY^'N?/G\\>E2Y=P]^Y=H83'\nM;)@!FYUS,F6,<(M>KT<H%$)W=S<N7[Z,(T>.\"%Z_W`')>S,:C:*9RV:S8=NV\nM;=!JM7\"[W<AFLU\\Z?/CPM'P_QXX=RYX_?_XS6JW6.SL[:R'L)]/Y)!Q[M1EV\nM;RJ5@LED@L+Q?\"T!.T@-%=DF;97RJ(L%]^$'H7F=`5NGT\\T0AR,4L!!(9M9[\nM$<>.'1L`\\'&-1O-T;6WM]U][[;6:EU]^&1,3$ZBMK15'509M+GA\"(\\MED<I.\nM,64VS.]7J@7*O%?2NYC1Z_5ZE)>7P^/QP.OUYF\"+:PDZ]QK,&F6C!_G#Y_.!\nM#01L=^=[(K[[889$9-Q?;M%?*=ZM_#EL-W>Y7$*`+!J-XJVWWD(L%L/@X\"#Z\nM^_LQ,S,C(`^91<(C/I.3J:DI6\"P6J%0J1\"(16\"P6.!P.A$(A_.I7OT)5515J\nM:VMAL]D$1,<3#^<H3T9JM1J%A84H*BJ\"1J,Y_M!##[VRV#T=.G0H\\NJKK_XD\nM&`S^$6LE\"NR:SVE5`;NUM35X^O3I:9/)5!B/QV&Q6-85L-E(IU`5G%]GP'Z0\nM8:\\W8._;MR_9T],S,C\\_7ZZ8V!O66;1OW[[CO_SE+T]^\\I.?_,9O__9O_Y\\G\nM3IS0OO#\"\"R@N+D8P&!0XL\\Q-7DD&N1B+1(E[W^N(7EA8B%0J)=3W\\O/SX70Z\nM45!0(\"8\\,SM92G.C6LMEQH?<8BTS7A*)!(+!(*+1J.\"6,^/^,$BXW@L2D6W3\nM%H.NEGM^<M&11;_\"PD*XW6[8;#9AW14*A8110'%Q,8:&AC`Y.8ED,HG)R4F1\nM;3,9X&;.0$MH@RWHE/>]<.$\"S&8S\"@H*Q+SD'.5]:;7:'%7*=#H=5ZO5_\\<R\nM[_U?PN'P'Z12*;4,<\\D;FDJETJQA/O7I]?I\"6?%RC1AVB)V?,I46JRM@/H!$\nM5K-)KN8_)Y/);IK12A\\;V@KZ\\8]_//W00P]]*Q`(U#<W-Q__^[__>U165@J]\nM87ER$,M=2<!>++/F!&.!D?\"*LB+O]_M%\\P(79#@<QNCH*'IZ>E!86\"@4VGAD\nM9D#=B\"&W4_.:>\"UY>7DPF\\WBI$$];K_?+VB)'Y9@O9+-<4V36-&P4E!0@-+2\nM4A07%\\/I=&)P<!\"Q6`Q&HQ$&@T'4'DI+2W'@P`&4E)3`;#:+]\\[@RIJ!W6Y'\nM-!I%/!Y'04$!\"@H*D$@D$(U&8;%8T-;6)DY9_!F<7Q0D([P\"@%*^__?##S_<\nM?Z_[>NJII]JT6NTY.?N7DX\"%CU7OQO/S\\\\.+L$36<AP,R:;3TMI:S<]2:EK/\nM'CIT:.Y!:%YGA@T`9K/Y3C0:/18,!F&SV0``T6CTTOVXL,<??[P?P#/GSIU[\nM^,___,]_W-;65OW&&V_@]NW;.=V``(0X#V&`9#*):#0*G4X'B\\7R'F=WY9%[\nM,1:%\\A@OF^HFD\\F<H$,HPFZWP^ET(IE,8F9F!A,3$P@$`G\"[W:)8)!=HB,E3\nMYE(.Q@Q$I$T10Y4S4AZ5Y<#.X!Z/Q^'U>N'U>E%04/`>'K<L9B1CWDI95]D3\nM<SG-;CF8R$)+RN>[$LA(_MF12$1DM?QY,A>9&BPVFPUE964H*2D1VAQC8V-P\nM.IT\"2N,[H\">HW6Y'?7T][MZ]BY&1$9A,)H3#860R&1'$B=$:#`9A&,!BIL%@\nM0#`8A,_G0S@<1EY>'IQ.)[Q>+XJ+BT4C#3=YE4H%J]4*H]'8OI)U$(U&?0:#\nM`>/CXP)/-YO-B,?C\"`:#T.ETJ\\ZP#0:#3ZO58F!@`%5556L.V//S\\Q&'PY'I\nMZ>G1D(^!D`(A```@`$E$052^(%:UF@P[55)2@E@L!I5*!8/!\\,*#L+Q!`5NG\nMT_U_J53JRUR@*I7*IU:K3]S/\"VQM;;W\\^NNO;]VY<^=?U=75_55[>[OAW+ES\nMZ.CH0\"`0$`TO!H,!X7`87J]7:$.HU6KX?+YUNZ8K@XVR2!8.AW.\"1UY>'JQ6\nM*_1Z/4I*2C`Z.BJ*8#)'F)5^\\L#E+&4QL]6UCD`@('!49IJDJI%GOA2/?#',\nM>;%K76R3VZA165DI*)5\\CJRC$`;Q>#PH+R^'S69#.IT6=#BKU9H#*Y'#3^HF\nM-Z3/?O:SR&:SN'3I$HJ+BZ%6JP5VS0WN/6?Y!>H>@[',QS>;S4BGT]#K]>+]\nM*K+DP97<>U%1T;37ZX7;[<;4U!2JJZMQZ]8M[-BQ`]/3TS`:C6O!NZ87F]IK\nM6)O9<^?.A0'85X!++S7\"4KVE&\\!?/PC+&Q2PGWWVV;/_]5__=3:3R1Q>:,G]\nM\\2<_^<G[;@E^[-BQ&(!O7;MV[866EI;O%Q45/;UUZU;<OGT;X^/CB$0B&!H:\nM0GY^/AH:&I!*I=#;VXML-HOJZFHAW+/>(*W$6;DXR2JA9\"K%[MF^3(V24\"B$\nM<#@LNN!T.IWXVKT*<>L=U&\\ACYN>G(1OY,Q9V09-JIOR=\")?EXR1WP_#A4`@\nM@$@DP@P,6JU6-+?DY^>CHJ(\"A86%L-OMXL1#:5V9;ZS1:-Z#[;/Q:=^^?:!G\nM*9N3*&4@&UE0SUW.]`%@8F(\".IU._)M*D#:;3=109&ACI0&[K*QL;&9F!B4E\nM)0*FB<?CD%Q65AVP52K5M%S<77A?:YUHH44\"]FI^5L!H-/:IU>IQC4;S]-&C\nM1^,/PO(&!6P`T.OU?QN/QP\\OO.A_>S\\O=L^>/?T`GNGHZ'AZV[9MW[]UZU;-\nMK5NW\\!__\\1\\B4'=V=D*CT0BO26+,&Y%9*R$2Z>0A7&IBL9B0<B5CH[BX&)%(\nM1&\"MU,,FELH3@-S4LXA`_9H',T1>(S-#\\KA9+)/E1V5K--G$83G&C;)&L!'7\nM3PA\";@7/9K/P>#RHK:T5;=%^OU_`1^P89,&0M#NSV9RC?SX_/P^;S8;IZ6GL\nMV;,'H5`(/_SA#S$[.XN2DA*,CX\\+O75*)5\"#F8&3\\@FL,?!W4A-;QK876![S\nMV6QV19H79K-YC,5-K5:+J:DI5%55871T%':['9%(1+.&@.U;Y,0XOXZ`C75D\nMV.U&H['^\\.'#F0?A^#X$[&>>>>8LUJ%ANQ&CJ:GI^,6+%T]65E;^M<?C^=JA\nM0X?,/_WI3W'AP@6A+3P\\/`RM5HLM6[9@:FIJ0X*U,KN6L5@N5KDP2&XO)34=\nM#@?<;C?B\\3BFIZ<Q-36%8#\"8HY=]/V13J1LA\"U#-S<V)K#6;S0I!?G9W$HY1\nM\"NC+`5F^_\\5T0#9J4&^:&TY>7AY<+A=J:VM175T-O]\\O,NC%X\"2]7@^+Q0*[\nMW9ZS.<KU@W`XC-+24CS^^./HZ>G!Z=.GX?/Y!\"^;[=PRY9/ON:JJ2N#CRE9M\nM6?J7N'LFDQD^?/AP>B7WGLED[BX$9OC]?E175\\-FLR$0\")!\"N.8,F_>QAN[$\nMY0+VBG]6:VMKX$$8OH\\!^\\,R#AX\\F`;P=Y<O7_ZV2J7ZS)>^]*7_?O3HT>J7\nM7GH)'1T=XGC<T],C&\";W([M6J52B@87P@&P^,#\\_CZFI*9C-9I'-&0P&N-UN\nMF$PFQ&(Q>+W>G(`O_QQ*KZYGR$T<2L@CF\\V*+#(_/U_@VX0>U&JU*++*!4>E\nMB[<2SU9BW>L92LE9M]L-I].)<#B,4Z=.0:/1H+BX&!Z/!WJ]7NBND-YH,!B$\nMJ!?]/=GHH=?K$0@$4%Y>+M[/\\\\\\_#Y_/A].G3Z.QL1%S<W,YFQ0S:)/)))*\"\nMV=E9Q.-QV&PV\\<PL%HO<D2ASJ`=7>N^I5*I3K]=GM5JMZN+%B]B[=R\\F)B9@\nMM]NQX!RSE@Q[=I'WL]87-;/.#/O!^$T(V!P//_SP/(#_!/\"?:K7ZR9J:FF]<\nMN7+EP*]^]2N,CH[\"X_%L&+5-F5W+?\\I!BT%2SJZH:T%E0+/9#*O5\"I?+);K@\nM**@O&8IN\"(=:R<J0M48`\"*<=!A5VP,F9-C<0NF,K.UX7@T(VZI20R61065F)\nMDI(20>MDG>*MM]Z\"W6Z'Q^,16M(FDPE&HQ%6JS6GD8B;%!DZ;&YA(9/S9.O6\nMK7CVV6<1\"`2$8J*\\29%A4EQ<+#+]H:$AA,-A<1H(A4(H*BH2ISMFW@L?*P[8\nMCSWV6/#<N7.C^?GYY>QPC<5B,)O-R,_/7]-FOD1W\\D8&[.\"#T/H@8\"\\[]N_?\nM?Q+`2;/9?'C[]NW?/'7JU.'3IT]O2,!3,D/D?U./FPN2U#TY2#*#I?8\".=(J\nME0H5%15\"QI7-+RQ>;430HY#14AD\\/0QEG)MNX\"J5*L>D5F9,+\"8X=3]:X>OK\nMZW'PX$&XW6ZTM[>CL[-3F\"W;;#8,#0UA>'@8=^[<07U]/9J;FU%45`2GTRF\"\nM,?G0:K5:0#_<L!P.!R8G)^%RN43&W=K:BF0RB6]\\XQLH*\"@0`5NKU<)D,J&D\nMI`1-34W8M&D3DLFD\\`AE03D4\"L'C\\2`:C8KY(<D+M*]RPWHYD\\G\\:5E9F?!+\nMG9Z>1E-3$WIZUF2PXE^DJ+W6B;88XV3J06A]$+!7//;NW7L6P%FCT?CI9YYY\nMYG^^\\,(+KJ&A(0P,#\"`>CXO,*YU.(Q*)\")-<958H*[?=:\\BM\\4MEQ5248R>D\nMG)TR$)(7'(U&X??[A365S69;DCW\";%/F/%-NE6W1#-(R3UN&2^36?&5&+?/%\nM9=E/?LB4/@9\\^=GQ.JB!(2O7<1,QF4R(Q^/B-!*-1C$_/X^RLC)LWKP9O_,[\nMOP.KU8KSY\\^CO[\\?X^/C&!X>%I3*9#()I].)R<E)#`X.XMJU:WCVV6?QA2]\\\nM06R40T-#,)E,*\"@H0#@<%E9<,L?;:#0B$HD``$PF4PXT%`Z'H=?K45=7AY:6\nM%K:6^X/!X#^J5*J?J=7JR^%PV$+CB;R\\/$%#9%MZ)I/!Q,1$?S*9_'_JZNI6\nM/)\\U&LW_FTZG_Y0^C!J-!A45%>CM[87#X5@3[IS-9C/S\\_.:]70Z,F`7%A9B\nM8F(\"'H\\'!H,!D4CD0<\"^3T/]ZWQS1XX<^1F`K<\\___S/GGGF&30W-\\/A<(BF\nM`[I&^_W^_[^]<P]NZ[[N_/=>7.#B#9`@^!0IDI)HO2V)>M#4`Y3DR(X=;R:>\nMQG6[G5VGF]VT3IKM[\"3;)KM;M]W9;*=NMK/-9\":[?4RWG2:>S33=23KVR'5<\nM2G8<218M2Y0E6WQ8$L4'\"!(@0+R!>^_^89Y??H0I1R+@EI;/9T8S%#6Z`\"Z`\nM[^_\\SN^<[Q$1I</A$$(DCS*KALH9DQ3MD2L@#5+(9#*B7*NAH0&=G9WHZ>D1\nM8E=9-4*\")WN4RZD*.7]=Z[3*W4`>-++'B?P\\J6J&#@+#X3!Z>WOQZ*./XC.?\nM^0P:&QM1+!8Q,C*\"\"Q<N8&1D!/%X7`BCS^=;5@=?+!9Q]>I5O/WVV\\AD,IB8\nMF$`H%$)K:ZM(^\\@S-<OELK`5H!T%59.X7\"XDDTDT-35A[]Z]V+%C!QH:&B9M\nM-MMC1X\\>K1\\8&/C=2\"3REJ9I!@W1)?,IFM`DFS49AO&;?7U]=Y6CBT0BERS+\nM.B=[F\\O.@*LX_S&Q-\"VF%CGL=#J]S)_^7A^$RQ'VA\\BQ8\\=B`)ZHKZ]_Z,B1\nM(\\^>/W]^QP]_^$-<N'`!Q6(1S<W-XL-/7S;*\"U*[>K6'?I5B)W<STI?/X7\"@\nM6\"R*_*O3Z83'XX&JJLAFLR+5(N?%*RLSY&V[_,6N]<S'E;HB/P@Y1TZEC7)+\nML]OM%AV(NJYCPX8-Z._OQ^[=N^'U>G'ERA5$HU&</W\\>(R,CHG2/_%M\\/A]2\nMJ928\\#(_/X^+%R_B]==?A]UN1TM+B[!`E6=YRBZ'F4QF634-W4N'PP&_WX_>\nMWEX</'C0:&UM?<8TS3^(1\"*B#.VEEU[272Y78&9F1K2S>[U>,7!#.G3\\[KY]\nM^WZTRMO^?S1-VT^5/73PN=H%65&4A*(H];5(B202\"=QWWWW0-(W\\6CC\"9L&N\nMCM[>WI-GSIQY:<^>/4]MW+CQOUZZ=*GEY9=?QM#0$.KKZY<U05\"-KAPMU4*P\nM/R!'*;[8U/0A;\\>[NKJ6Y;AIBRVWCM.D&;D<KU8'?]66&U9Z5,NM]^2`Y_5Z\nM10JDKZ\\/FS9MPN+B(H:&AO#<<\\_!LBR,CHY\"554$`@&Q<\"U52HB*#SI<3\"02\nM&!\\?A]?KQ?;MVV&:)F*QF.B\"+10*2*52\"`:#8K&D!B'J7@R%0MBV;1LZ.SNQ\nM8\\>.A0T;-AS?NW?O2A/*&WT^G_+66V^)PV::)4J+[-+NZD=5O`UOZ[HNIIU3\nM6FVU@JVJ:J)\"\\%?[08E1%0\\U+04\"`19L%NSJZ>OK,P#\\^?#P\\','#Q[\\JL?C\nM^4I'1X?GS)DSXJ\"/#JEH2TOB60T4459&PI4'F11EYO-YD5O5-`T='1WB.;G=\nM;C%`0=X-4!17RY;VVPGVW4;8U&@BEQ+2_[/9;$@FD^CIZ<'QX\\?1V]L+M]N-\nM;#:+P<%!O/322[AZ]2J\"P:`8*D&'B)1NR>5R8LH,[2C\\?C]RN1PN7KR('3MV\nM8/OV[<+GA;H;Z7XOF3&)_#PMVILW;\\8CCSR\"0\"!PO;Z^_NC>O7NOW^8E9BD/\nM3ZDU6H#E,P73-)U5O`VSU#1$@GV[EOD[%>R*E,AJHY(96N@DBU46;!;LVK%C\nMQXX,@-_-Y7+?ZNWM_>.-&S?^RMC8F/+FFV_B^O7K2\":3<+E<P@!?CA!7F\\->\nM2:SE/+,<><J5)JJJXL:-&Z),K;Z^'I9E(9U.BY9MZNBK%,-:=1I6IG16&W%3\nM[E[N/G0X'#ATZ!!V[MR)SLY.9#(9O/766Q@:&L+0T!\"N7[\\N#K.FIZ>1R620\nM3\";%86PH%$(\\'A?3@2BO[7:[H2@*IJ:F\\-QSS^&+7_PB^OKZ$(_'D4PFA5=V\nM+!9#75V=&#U'>6+3-.'W^[%ITR84B\\7?>^\"!!ZY_P((<=S@<><NRG(N+B^)<\nM1'Y?ENY;-2M_E.9#`A#G+ZO];\"J*4AEAK_:PYE9#0X-1*!1L2VW[1E]?WSQ+\nM*PMVS1D8&)@'\\*\\\\'L^S-V[<>+:EI>6AH:$AC(V-B68)^M)5@YQ2D6N4Z<LB\nM1^!R=$R/2Z5AU(Q!W8AU=77P^7Q87%P4/B$4<<N/\\6'4<M\\-E>9'M(L)!`+P\nM>KV(1\"(HE4JX>O4J4JD4;MVZA7???1>Y7`ZA4&A9)00M2I02D;W19=\\/><+]\nMS9LW<?KT:83#8;2TM(BTA5P=4OD^R0TO``8_Z/6=.''\">O/--Z=M-EO7PL(\"\nM.CHZ$(O%T-34)(_2`X!J(NQYN]U>+I5*&GTV:I##EM_/56E!)!(IS,[.WLQD\nM,EU+CI!\\X,B\"_>&R9<N6X2U;MCS<T-#PT*Y=NYZ]>/'BCO/GSV-T=%0TNM1\"\nML%<RH9</N.3*!=I.FZ8I)F_'8C'A4!@(!!`(!.!VNY<=--+UY<>K-7<;85-^\nMG3RA72X70J$0FIN;1=7.R,@(YN;FT-C8B.[N;C0U->'&C1N8G9W%[.RLZ%`D\nM+P^JO$BE4F(@,]TK6N1H=F%#0P-.GSX-I].)SWWN<VAH:$`\\'H>B*`B%0F)1\nMH0&Y5-%2+!:A:1H.'#AP_0[27I.JJG;1CB>93**QL7'9;,AJ(NQ()&*>.G5J\nMSC\",9OI\\5)/VJI5@`T!=7=U/8[%8UY(3XEE6E`\\/E6_!S]B[=^])E\\NU^\\\"!\nM`Y__Y5_^Y>D3)TY@W;IURX;XTF%2,IF$:9IH:&A89B2D*`IT78?+Y1*==)5>\nMT=0Q2/:F%%7+<QM)Z*E*11Y!ELUF$8_',34UA>O7KR,<#J.CHP.;-FU\"5U<7\nMZNKJ1$M[J51\"+I<3?N&4;Z2M.AU:TM_EM`J]7MF,:J4_\\M@XNC9%EE0F2=</\nM!`+HZ>G!UJU;T=34!$51\\,X[[T!55;2UM<'A<\"\"12*!4*J&]O1W[]^_'P8,'\nMQ2(U-34EZI#'Q\\<1#`9%,Q*YY3F=3C%[D_+]#H<#5ZY<$=[HE$:A>^KW^X7-\nM`#W?3\"9SQ[8&R61R>./&C;#;[2+G'@P&*^=K5A-AHUPNQSP>#^;GY]'2TB)*\nM&5?#XN)BLJNK\"U-34]6F1&\"WVW^EM;7U7_C]_B/9;/8764DXPOXGX_CQXP:`\nM/S]W[MQ?U]?7?VWW[MU?/W?NG./RY<NB2H$FN2<2\";SSSCL(!H/BL,\\T3>$M\nM0K7&M<PCR]-,*`4P/CXNG.@\"@0!<+A?\\?C_2Z;1P!*018A3Q411)79!R*WQE\nM;OWG5<E0FD->>.2!L:52\"8%``,W-S6AM;45=7=VR.F6OU_N^EG8YQTWMYN?/\nMGQ<VHU>O7L7Z]>NQN+@HS+,JSPWHM=#,0;*2!2!&N]'AG>R+4K%@W=&;I^OZ\nM=YU.YZ_3=0S#0\":3$==?HBK!5A1EL?+SL-HH6U&4%+UWU6I!)!*Q`/R(U8,%\nM^Y^-_?OW%P'\\WJ5+E_ZTOK[^]WMZ>IX:'AZVC8Z.8GIZ&NET&JJJ(AP.HU0J\nMB>X]$JK*_&JM4A&R52=Y0B\\L+,#G\\XGN/4W3:*H)#,/`Q,3$LHY*$BYJD:?6\nM\\Y4$^PZC-7%MVHV0@%.:@;P^0J&0B'SEH0*R\\%#[N,?C@=/I1'M[.[Q>+W;M\nMVH71T5',S<V)=,;,S(P0W\\H4$^U0;#8;2J42XO$X,IF,R/W+%2Z5TW.D:]W1\nM`5I_?_^KSS___(\\513E.KYUJIB5<U0JVO*A5,R_49K,M5DP#8BW@E,A'GYT[\nM=TX]\\L@CG^_KZ]O]Q!-/G'SDD4=`6]^E[>\"R69`D4.0;4HL<LAR]4HJ\"*BYH\nM!%4^GT<L%L/-FS<Q.3F)9/(]_QV/QX/&QD8T-34A%`H)QSIY.KB<+Y>CRSO-\nM4=.B1\"5RU.I.!XM;MVY%1T>'J+A97%P44V[<;K<PO*+#2+_?C[JZ.M35U:&^\nMOOX]-=$T//744PB%0HC%8NCIZ1$'PRM-6:<V>H?#`8_'(\\K_HM&HJ-V6A@`L\nMVRW(T\\DMR[KCB@=55?^E81@O.QP.RVZWB\\-B\"6<M!+L6$;;-9DO)X]]8L#G\"\nMOM?RV\\,`'M8T[:'N[NYG+U^^O.,G/_D)AH>'X??[14TT>5>0CS(YWU6UJDHY\nM=#FZDA<#ZOHC[Q./QR,$N+V]7;3`S\\W-B=2(KNO\"6[E2F%>R3[T=-):+FD1L\nM-IOP[0@$`NCHZ!`+#1E+O>^#J&G\"WI4._BB_GTZGH6D:MFS9@J-'CR*93,(P\nM#\"PL+\"P31%G$Y',\"FOGI\\7@0B\\5`/AZRY:DLUI1V6A+LN3M]GQY^^.$H@.-G\nMSY[],P#_)AZ/H[FYN681MJJJB_)91S6\"K6E:I6#;^5O.@GW/$8E$3EZ^?/G%\nMMK:V7VEK:_OC+5NVA\"Y=NH1X/(YX/\"XJ\"^32LFJI;+RIC((SF<S[;$]I2`$U\nMAW@\\'M37U\\/O]R.93(I)\\'18)T^4J1P9]O.02R!]/A]\\/A_\"X3\":FYM%PXN\\\nMA:<%C#I)@\\&@F'=)#4(D\\!2M-S8V8G)R$H\\]]AB\\7B^^^<UO0M?U%2MN:,&A\nMQI)8+(90*(2.C@Y0G32)73J=AL/A6+9SH=+(I=36]56\\91/%8E'X5DOF8<XJ\nM!3M5^?ZOMF13T[2DJJJR8-OXV\\V\"?4^R??MV\"\\!?.QR.'^S9L^>K@X.#7YF8\nMF/\"\\\\\\X[F)B8$%V(BJ+4Q#R*<M6578SR]EC.VP(0U23Y?![1:!3U]?6BC([$\nM<7Y^7LR[I)PXM;G?3?TV#?:E0T\\2WE*IA&0RB50J)2IGY.&Y]%KJZ^O%(2C=\nM+WG!H-1%J52\"S^?#D2-',#0TA`L7+B`:C2Z+KE?*87=U=:&]O1U;MVY%*O6S\nM`2D.AT-,2*>(F@2;#DX-PWAK%6_9+?+$KEBP:W+H*`<\"JQ5L557GZ373Y?F;\nMS8)]3[-KUZX,@-_U^7S_>W1T]/?]?O]3`&SCX^.BE$S7]:H;;ZA)@L183I%0\nMGIHBKT*A(!Z/HFZ/QX-,)H.QL3&XW6[1C-+5U05553$^/B[RX;)%ZIT2#H?A\nM\\_E05U<GNN]BL1A2J11RN1RZNKJ$S:H\\S):Z2<DS11[Q10,&['8[XO$XTNDT\nMNKN[,3HZBHZ.#GSA\"U_`5[_Z52'8LEA7[A#V[=N'EI86;-JT\"3_^\\8]%SMSG\nM\\XGG*Y<ITOU;BMY_N`HQO$4=DQ7I,%>5'[G%6ED.J*HZ+R]T#`OVQX8-&S9,\nM;=BPX?-.I_-_[M^__]GKUZ\\_=/[\\>9PY<P;7KEU#5U>7$\".Y[9PB0,K%4G.(\nMIFGP>KW\"1YHZ\\2JBK?=YD<@B+9/-9I>5!99*)6&XY'0ZL7[]>I%?IM1.H5!8\nM-LRV,N7B]7K1T-``O]^/W;MW\"W&FMOE4*H61D1',SL[BQ1=?Q/;MV[%OWSYT\nM=76)\"A:?SR=RUC2VBQ8D$ER[W8[V]G9$HU&8IHF=.W=B=G86H5`(7__ZU_'T\nMTT^+\"-]NMXM%QV:S8<.&#;C__OO%J\"[R:*'JF70Z+7+8LJL>U;X7\"H6I;=NV\nMK2K\"=KE<8J:GY/98E6\"[7*Y49V<GHM&H6\"!IGN7=LF_?OO3SSS]?,$U3KZ;:\nMA&'!_BCGMX<!/'SRY,G/:IKV[<;&QG`T&L6I4Z>6=:95IC;\\?C\\\\'H^H3281\nMH4/+:CLMY=0)M673D`!J`@H&@VAH:$!S<[/X72:3$26+5&T1#`;1V-B(MK8V\nMM+6UH:ZN3J019F9F$(O%D$@D,#L[*](M-IL--V_>Q-S<')J;F]'?WX]#AP[!\nMX_%@=G86&S9L$#EDJNZ@2)QF,])!+@!Q6-K>WHZ-&S=B9F8&B41\"-+ILW;H5\nMNW?O1G=W=\\;A<#QKFN9KEF4]62Z7/V>SV13*^4LCNY95AE#NO%@L3J_F?EN6\nM-0&@4JRK%FS+LI)4BB<W:E5QO;AIFBT<:;-@?ZQYZ*&'OG_JU*GGUZU;]X?Y\nM?/YIE\\N%L;$QC(R,()?+B9;R;#:+A84%46)&(DV5%G:[_7UE9ZO\\8HJ?Y5F3\nME&>GM$VY7!:S`AL;&^'S^810DB]T*!02QDFT*[APX0(F)R?%-)A4*B6B5T51\nMQ%\"!D9$1C(Z.PNET8MNV;:+,4&[<D:?:T'.E,6:T0Z&S@8:&!JQ?OQ[CX^-B\nM)[)APP;LW[_?VK%CQU]XO=[_V-?7%U]ZZ?]P^O3IF-/I_*U$(H%@,\"@.-.FU\nMRQV?M%BNAOW[]Z=>>>65E,OE\\E>X/58EV*9IIF@71KNE*@5['D!+M<+/L&#?\nM\"]%V!L`73Y\\^/?@+O_`+W[YV[5KX]==?Q]MOOXUX/\"X.NV0/9]G-CAI*G$YG\nMU4.$Y1(PBLPH-4.YY60RB86%!:BJ\"I_/A^;F9B'25!Y'J9;%Q47,S<T)Y[MK\nMUZXA&HTB%HN)45^RW2M%R``P-S>'BQ<OHJFI\";JN8]NV;4@FD^]KUI&M0ZDD\nM3XZ`2;!\\/A\\2B03:V]O)1K78T='QU(,//OB]%>[#W_I\\OM^:FYN#S^<3*0NY\nM*Y,>0ZX6626W/![/UG0Z73/!-@PC:;/91+J*SC:JR&/'Y`HAA@7[8\\^1(T>^\nM_]IKKPWV]O9^^[[[[OOLQ8L7<?KT:5R]>E6D0RJG><N'7[68^+Z2'[=<:4!U\nMSI2O+A0*N'7K%J:GIT7$2TTM7J]7U)@O+\"R(A8=*\".59CU0)0L(=#`9A61:B\nMT2A>?/%%-#8VBDDEU'U)!WZ4*Z?),A2)DYC306$X',:6+5NP=>M6[-V[UVQO\nM;__4H4.'_N$V$>4;=75UB?GY^;K.SDXQ!(`B:]FAKP;EF),^GV]K*I5\".!RN\nME6\"G*$]/.X-J(F.[W3X=\"`3`$38+-B/1W]\\?`_#$V;-G']^[=^]?K5NWSO/6\nM6V_AXL6+PG^;)GI[O5YX/!YQ2$:F_;5$%F[@O;(\\JD6FW+J<VZ7.2&K*<3J=\nMH@2/!AC3SH!^I@6(NC1SN=RRP0*I5`K7KEW#\\/`P-FW:)`X?*4*7R_)HGJ5A\nM&**I1E$4.)U.;-Z\\&4ZG$SZ?#_7U];]Y.[$&@*-'CQHG3YX<BT:C>^F@4=?U\nM99XG\\A#A*MWP)KU>+R8F)N1?NVL185,JBYJ?5HO3Z1QO:&A@P6;!9E;BP($#\nM/WCUU5=?V;IUZ[?7K5OWV<;&1@P/#XO<;SP>%\\91<I5$M<A^)G*T38]#!W#9\nM;%:(&/E$5U:=4-1,7A^ZKB.12(A1:B3:U&I>.16%1+M0*\"`:C>+55U\\5U_%Z\nMO<+6E`1;GEHO5\\R06/7T],#G\\R&?S_]E)!+YUAV(5)[<`//Y/*B:0QYT7*/A\nM#Y,NEZMRAU23E(@\\9:@:H=5U_6(X',X5BT47@\"1_0]<^[\"7R3\\RA0X=B6[9L\nM>2*12!S=N7/GX--//XTGGG@\"APX=$N;ZF4Q&#-ZM+-%;K6!73FZ7M_ZT,)!0\nM4U0;C\\<Q/3TM*C[D6NI2J23*]Y+)I!B>4#F$P31-D:.F5`I5PM\"PW/'Q<<1B\nM,7'(5]GX0C,;Y7IV&NR[-/:K8%G65^[P7M31='K*6<L1MIPGKU*PIU88X*R>\nM.G5JU2&Q95F+JJI:)-35[@+L=OO?>;W>SR^]SBO\\[>0(F[D-#S_\\\\\"\"`P5.G\nM3@WLW+GSF;:VMH'-FS?C]==?QZ5+ES`W-R<.).?FYD2UAF$8R.5R,$U3F$S%\nM8K%E_AERS31MG3_(%X3RYI0.H&M1NH,&K%9Z7,LMY)3_)L&CR)J&\")`[8*E4\nM$E4G;K<;EF7A'__Q'Z$H\"M:M6X>6EA;<N'$#H5`(Q6)1=#@\"/_,L(=,H`\"3F\nM;QP^?/B.3)I:6UO;1T9&4\"@4T-K:BALW;@CK5:H'+Q:+RT:XK892J31).PW:\nM-2S=.Q>`596?'#MVS#ASYDQ:UW6?/&U^M>S>O=L`\\-U3ITXE`,3X6\\F\"S?P<\nM(I'(((#!5UYY96#7KEW/='5U#>S9LP=#0T-X\\\\TW,3HZBN[N;J12*202\"=CM\nM=@2#0>BZCEPNA[FY.6%92A$SY6?IX*S:(<)R.F0U_RZWN=-B((OAZ.@H0J$0\nMVMK:$`J%Q/.E1A>R3Z7__[YMHE,A^6(``!,=241!5*K><728S^>O-3<W[Z4F\nM'XK\\J820=B3D9%A-2H2>KSR\\8FGJS$(5UTW:;#8?-?C4Z#/X`G\\36;\"9N^#P\nMX<.#``:'AH8&@L'@,^%P>*\"UM17CX^/XR4]^`K_?CXZ.#AB&@<7%1:12*3@<\nM#C%`5A8TV>[UPZ!R/%BE`5/EXU;66<MMXW3`.3$Q@2M7KN\"!!QX04UYHL`\")\nMNWS=BKSX'8?\"BXN+W]FX<>.?I=-I,1;,X_$@F4R*_#U-G*GF_EF6-46O5T[E\nM6)95U<&C:9HIFJRS5))G\\K>'!9OY9Z*WMW<0P*\"B*`-M;6W/Y//Y@<[.3@P/\nM#V-X>!B%0@'-S<UH:6E!.IW&W-R<2%E43HVAWU7K95(IQI5&2_)HLY5$3K8]\nM)?&ELCV;S8:FIB98EH7)R4DQ@0:`>%VR$]]*ST/3M*X[?2V93.9[75U=?Y3-\nM9H.*HL#O]XN(FDRFI!Q\\-:434451RIJF:=3\\LW2(6FWS3)(J6Y:>H\\'?FH\\/\nM?.BX1CEX\\.#@P,#`49?+=?0SG_G,X&.//8;^_G[1.AZ/Q\\6,1\"IUDV<JTA1U\nM:@^OI6#+(GR[P<(?9+!?>:A(IE7S\\_,B!YY*I=ZWT-!CD;C2@:&F:9ON]+4<\nM.W8L&P@$_HK*#\\F>ELH7[]9:]@,>QU!5=<9NMXO'61+<J@5;SNMSA,T1-K.&\nMH!RWW6X?Z.OK>^;2I4L#SS__/-YXXPT8AH%0*+1,E$EPJ)2O%O6U*TVA^:\"4\nMB/Q<*)JN;-:1*U/B\\3@<#@>RV2SL=CMH6@LM0'1].4<O+Q*:IK6>.7,FT-?7\nM=T>E:89A?$?7]=\\H%HM*N5Q&(I$0T]BIT:>R''%5T9\"J3FF:MHX.6FLEV!QA\nMLV`S:YQ]^_8-`A@LE\\L#G9V=SUR]>G5@<'`0;[SQQK*HM3)73)V\"M6\"EZ+HR\nM32'_.T&+!Y44RD).U2*:I@G_;EGD*9<L1]>598F:IBF*HGP*P-_<R>O8OW__\nMU9_^]*>G;#;;0*E4PO3T--K;V^%RN40=>2W&NRF*,DDY;.G>5&L`M4\"=GAQA\nMLV`S:YP#!PY0Q/U)E\\OUS4V;-FUYZ:67EK6SE\\OE97:AM:H2N9UX?]\"!(T73\nM<H0L\"[:F:0B%0B@4\"IB=G<7,S(PPB_)ZO<+OHS+\"E@5[:6&ZJPXC7=>_8YKF\nM0#J=1B*1P+IUZZ#KNKBN7+M>C6#+52)+5\"W8U'G*$?;'#\\YA?T0Y=.C0\"]W=\nMW?>?.''BRU_ZTI?B`P,#<+E<B,?C2*52[_.R)G<^VDI3!$GE;12E4WD;M9?+\nM)D/4,%,H%$1T+1M+D4F4/\"W>-$UDLUG1<I_-9L7?_7X_2J424JD4>GM[\\96O\nM?`534U/P^_T(A\\/+;$1E\"U1Z#M2ZO_0:!N_F_BTN+OY=N5S^!Z?3B<;&1DQ/\nM3\\,P#&0R&7@\\'BPN+B*3R53U'IFF.;5]^W9<N7)%W.]JJT2*Q6+B_OOOQ[ES\nMYZ@LD2-LCK\"9CP*12*0$X%MGSIQY+A0*?;NCH^.S%R]>Q-6K5Q&+Q6\":)MQN\nM-Q*)A)BU2`)9+I?A\\7@0#H?O^F\"RTE^[,A*MS&.[7\"[,SLY\"554T-34);Y1B\nML8CFYF;LWKT;/3T]\\'J]>/?==\\74'!)^:AF7#QKIYZ4H^\\J!`P>NW^6]*YXZ\nM=>I_`?@$Y<PIS2!5LU1[`#\"YPN^JBK`515F@1J6E!8`%FP6;^2C1U]<7`_#$\nMY<N7/[MUZ]9O7[AP(7S^_'F,C8V!W.(RF0QBL1CL=CL\"@0!L-ANRV2RFIZ>7\nM-:;<3J!7JOZH'\"=VNSPVI36<3B?L=CL,PX#;[4975Q=V[=J%<#@L%HY8+`:;\nMS29:X555%1-Z9,&6G?4,P_C!*F_=*\\![C44+\"PO+N@9KD1+Y,`1;5=6$81C\"\nM;M8T34Z)<$J$^2BR??OV[S<W-V\\[>O3H]Q]__'$</WX<V[9M$^W@/I\\/=KL=\nMF4P&J50*JJHB%`K=S19_681-(EHYJJRR[MINM\\/G\\Z%<+F-Z>AIVNQU'CAS!\nM\\>/'T=[>7@;P?=,T^TNETBB).PW?S>5RRWP^*G]>$O'X*G<HLP!FR`\"*3*=H\nMH:A!)^'4AQ!A)\\KELFC3!\\`1-D?8S$>5;=NVQ0`\\H2C*X^%P^\"_V[=L7>.VU\nMUW#MVC5<N7(%F4P&=75U\"`0\"(F?[\\R+)RN85N4.1\\MMRF5WEP`2;S28,K1H;\nM&S$P,(!/?.(3*;?;_>=C8V-_\\NBCCUX'@),G3[Z@:=IO9+-94>E\"CR%-,7_?\nM.*]RN5R-_^P[NJXW4Q1/?BWD+[(&(^P;AF&(#E=-TSC\"Y@B;^:BS9\\^>'VB:\nMUM+2TO*?GGSRR=2G/_UI'#Y\\&-W=W<*'))5*87%Q\\8ZN)Z=$9/O1#XJP2;1C\nML1A45<7!@P?QJ[_ZJSAX\\.#SJ52J9_/FS?^!Q!H`RN7R\"X%``*.CHR+:I3;Q\nMVT782S]7(]CO:IHFTB%4,E<NEZN.L\".12`I`Y0VNZM!1491QPS!*=75U?.C(\nM@LW<2QP^?#C7W]__C40BT=/7U_>=W_[MWR[_VJ_]&CHZ.C`_/P_#,+!ITQTW\nM\":[H$2([`:Z4YU84!9V=G3A\\^#`^_>E/YP\\<./!E7=<_-3`P$%U!C`;;VMIR\nMX^/CR.?S*!0*R&0RPD&/TA:5?PS#J$:PK]-@6TK?T&*@JFHM7/VG:AEA'SUZ\nMM&R:YAB=.]AL-HZP.27\"W$N<.'$B\"N#7__[O__YW6EM;_]N7O_SE?SL^/HZ7\nM7WX99\\^>%5:E'Y02D05;MFJM%/&5#AV??/))M+>W3W@\\GKW;MV^?O=WC//+(\nM([DS9\\X,7KUZ]9/E<AG9;!:)1$),O)&'%%?X5E<EV+3X5*9A:C2%91+`?;42\nM[*5[^X[+Y=I<*I4RJJK^%_Z$<X3-W(-\\ZE.?BCWXX(/_SN5R?:*[N_OBXX\\_\nMCJ]][6M8OWZ]J(FF`:\\TG#6=3B.3R8BQ5-3$DLUF42P6X7`X$(N]9Z5,`WNS\nMV2P<#@<>>.`!?.$+7QC=O'GS9ST>S_JE0[X/Q&:SO3`]/2V\\P\"F?3:(JSUN4\nM)JQ7DVR^GLOEX/5ZD<OE$(O%X'*Y1'Z_%H)-'91+NX^J!5O3M+>*Q2)T77_F\nMX,&#@_S)Y@B;N8<Y>/#@2V?.G-ECL]E^T>OU_LZ33SZY>6QL#$-#0[AV[1KF\nMY^?A=KM17U^/4\"B$9#*Y;#`\"U4=3I.UP.)!()#`[.PM%4=#>WHX]>_9D>WM[\nM?[^SL_./^OO[[WC;7BJ57C`,PTBGTS;J/,QD,N_K<)0C?=,TJTZ)Z+HN\\M:R\nMVV$M4B)VNQVE4HGL8FO1=OHM`-%()/(G_&EFP68^!O3U]9D`OG?V[-GGFIJ:\nM_G5C8^/GFIJ:CG1W=V-L;`RQ6`RY7$Y$N)3778KLQ\"!>FK8>#`81\"H6P;MVZ\nMPO;MV_^PIZ?G&X\\^^FC^;I]7?W__Z,LOO_Q_%Q86?HDFTE\"DNU*ERI*H5B/8\nMDZJJFAZ/1Z49CY0:J1%BMJ/+Y8+-9G-7>\\%()#(#@,6:!9OYN''@P`$+P%\\\"\nM^,O77GO-?]]]]WUI>GKZMT9&1OPC(R.(1J.BHY#$DD3:Y7)!UW6$PV&SJ:GI\nME?7KUW^_M;7U3S_YR4\\6JWE.+I=KAAIGJ'R0(FH9*4^^:L&.1\"+EP<'!6\"`0\nM:$JGTZBKJY.]JVL18D]2JWM=75U-!)MAP688]/?WIP!\\X^S9LW^P?OWZ7]JW\nM;U\\DG4X?OW;M6C=%V$O&2*;3Z;SB<KG><#@<+[>WM__MXX\\_GJ[5\\ZBOKS]7\nM+I=%CES3M!7%6G+3<U;YD#-^O[]I=G9V601?K5L?I42\\7B\\F)B:H#(\\%FV'!\nM9FH:=9MXSZKT;_XY'K^QL?&GE(8A`ZO*6F^Y24=1E*HZ7\"S+BGH\\'J12*3'+\nM48[L:Q5ALV`SU<)5(LR:X]%''[VA:=I4I9WJ!PP4J\"K\"MBPKZG0ZD4ZGEPUC\nMJ)%@S[A<+C.7R[WWA6/!9EBPF7L-F\\WV,@EU9=TU\\+,*D1H<.L*RK!GJ=I2]\nMJVN1$HE$(B5-TV9+I1)%[BS8#`LV<V]A6=;?.9U.F*:)?#Z/:#0*7=>%W_;L\nM[\"S:VMI(5*M*B=ALMF@JE8+7ZX73Z42Y7*:A#S6IZS,,8Y*Z*%FP&19LYE[D\nM1P`F*-)-I5(`WALP7\"P6X70Z15X8@+W*QYJQ+`L.AP,4\"5,47RO!I@Y*PS!8\nML!D6;.;>8FDXP\\,`YDW31#P>%X*=S^?A\\_FPL+!`HEK5X;FB*%'+LN!RN9#/\nMYY?-G:P%I5)IBB+W<KEL>^&%%W1^AQD6;.9>$^TK`'Z#VMUINDVY7(;/YT,Z\nMG:8&EZH$6U75&=,TX?/YQ.29I?QXS5(BY`=>*I6X%IMAP6;N68:HM\"^?SPLO\nM$UW785E6K00[:A@&_'X_TNGT,@?\"6F!9UD0P&!1EB':[G06;8<%F[DG&'0Y'\nMT>OU(IE,PN%P4-0J#*I090Y;491YTS3+7J\\7F4RFYH*MJNK-^OIZ,5\"8!9MA\nMP6;N22*12-EFLXT%`@'$X_%E;H%DV%1MA-W?WV]:EC7K=KN1S^?E<KZ:*+;-\nM9KL9\"`2$_TF5[H(,\"S;#K%T417G;Y7)A<7%1#$K(Y7)BV`!JT+%K6=8,78]R\nMY;6*L&TVVPV7RV4N7>\\/^OKZ+O.[RK!@,_<DZ73Z[<[.3BPL+\"`>CT-5583#\nM86'[BNK+^N!VNZ,`D$@DT-;6AGP^3XM!378)F4SFO[M<KE\\Z=NS8U_@=958+\nM>XDP:QZ;S79#=NS3-$TVHH)IFK7X',_0@(92J20>JU9$(I'_S.\\DPQ$V<\\]C\nMM]LG240!P.%P()?+P31-BK#54Z=.5?59MBPK\"@!.IQ.%0H$.,Q6^^PP+-L/<\nMS390TR8-PQ\"S'35-0SZ?I^B[5KO%&451X':[Q<\"$6D;8#,.\"S7Q<F%(4142_\nMBJ*@6\"P*`:=`O,H(>P8`/!X/,IF,L%AE&!9LAKD+#,.(:9I6=+O=R.5RPFI5\nM*NNK.L*V+&M&411X/!YDLUE*B9A\\]QD6;(:Y\"PX?/FS:[?9I$M-RN0Q55>%T\nM.E$L%FLBV%A*B3B=3I%N412ES'>?8<%FF+M$T[0IA\\.!8K$HS)FD.FR@^I3(\nMY-+CR(Y]);[S#`LVP]PEA4)ALJ.C`Q<N7(#'XX&B*,AFLP@&@S6)L!]\\\\,'T\nMS,S,?'-S,V9G9^'U>J'K.D?8#`LVPZPB`KXE5XK0G$=IC%?5M=B*HKQ+4VYR\nMN1S*M>J<81@6;.;C*-BZKJ-4*E']-:3Z[*H%6]?U\\27A1BZ7@V59+-@,\"S;#\nMW\"VF:=XR31-DT$1&2K7*80.`R^4:5U45NJY3^2`+-L.\"S3\"KB;`518'7ZT4V\nMFP5%PM(D]:HC;%55WZ4HOE@LPK(L/G1D6+`99C6\";;?;X?/YD,ED1\"VVU-QB\nMJ_8Q#,,8H0&\\2ZY]'&$S+-@,LPJF[':[Z?%XZ$#P/97^66MZU9]E554O:YJ&\nM8#`(I],)A\\/!@LVP8#/,W?+@@P^6;#9;E-(5%&&KJEJS\"/OPX<,Q7=='`H$`\nM/!X/7\"[7'-]YA@6;859!H5\"X9;?;D<_GH>LZTNFT&!E6J\\]RL5C\\D=_OG]9U\nM/;^PL/`#ONO,6H+]L)F/#(9AW-(T;5^A4(\"F:6)&8JTB[\"6^#N\"KD4B$?408\nM%FR&62WE<GF\"2NY(L*6ROII$V)%(I,!WFEFK<$J$^2@)]BV:E$X&4%*$S9]E\nMA@6;8=8*EF7=LMEL<+O=2*52L-EL<AUVD>\\0PX+-,&L$15%N69:%AH8&1*-1\nMV&PVN4J$!9MAP6:8-?-A5=5;AF&@L;$1T6@4JJK*==@LV`P+-L.L(<&>-$W3\nM\\OO]2\":3PD^$!9MAP6:8-<:Q8\\>*Y7(YJNLZ4JD4_'Z_[-;'@LVP8#/,&N,F\nM39M9,FBBWW,Y'L.\"S3!K\"<NR)@#`[78+USZ.L!D6;(99FX)]4U55^'P^+\"XN\nMLF`S+-@,LX:94!0%/I\\/J52*!9MAP6:8M1QADV\"GTVD6;(8%FV'6L&#?4!1%\nMY+\"7#AT7(Y&(Q7>'8<%FF+7%94512E0ELD2,;PO#@LTP:XP3)T[DO5[O11H3\nM5B@4`&\"6[PS#@LTP:Y!RN7S.Y7(A&`Q\"UW4`F.&[PK!@,\\P:))?+G?5ZO0B'\nMP]!U/0'@=_BN,\"S8#+,&R>?SYYQ.)^KJZJ`HRO^(1\"+#?%<8%FR&68,4B\\5W\nM`,SHNFZ5R^7_QW>$^;B@2%X,#/.1X?3ITY]35777H4.'_CW?#88%FV$8AEE3\nM<$J$81B&!9MA&(9AP688AF'!9AB&85BP&89A&!9LAF$8%FR&81B&!9MA&(9A\nMP688AF'!9AB&85BP&89A&!9LAF$8%FR&81B&!9MA&(9AP688AF'!9AB&85BP\nM&89A&!9LAF$8%FR&81B&!9MA&(8%FV$8AF'!9AB&85BP&89A6+`9AF$8%FR&\nM81B&!9MA&(8%FV$8AF'!9AB&85BP&89A6+`9AF$8%FR&81B&!9MA&(8%FV$8\nMAF'!9AB&85BP&89A6+`9AF$8%FR&81@6;(9A&(8%FV$8AF'!9AB&8<%F&(9A\nC6+`9AF$8%FR&89A[E/\\/1E\"._&:VI:@`````245.1*Y\"8((`\n`\nend\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/ssp.awk",
    "content": "#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 2006, 2007 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\nBEGIN { count = -99999 }\n/^[     ]*$/ { ++count; next }\n{\n        if (count > 0)\n                print \"\"\n        print $0\n        count = 0\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/tags.cook",
    "content": "/*\n * srecord - manipulate eprom load files\n * Copyright (C) 2006, 2007, 2009, 2010, 2013 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nif [find_command ctags] then\n{\n    /*\n     * There are three different versions of these commands,\n     * and they take completely different command line options.  We\n     * assume minimal posix syntax if nothing better is available.\n     * (What were they thinking?  Were they even thinking?)\n     */\n    ctags-variant = posix;\n\n    /*\n     *  The '|| true' is needed because if ctags fails the build stops.\n     */\n    ctags-version = [collect ctags --version || true];\n    if [in Exuberant [ctags-version]] then\n    {\n        ctags-variant = exuberant;\n    }\n    else\n    if [in Emacs [ctags-version]] then\n    {\n        ctags-variant = emacs;\n    }\n\n    all += tags;\n\n    if [find_command etags] then\n    {\n        etags = etags;\n        all += TAGS;\n    }\n\n    /*\n     * xargs can invoke ctags/etags more than once if the underling\n     * shell does not handle so much arguments.  In order to not\n     * truncate the target the '-a' options must be used.  It is posix\n     * compliant and should be supported by different ctags variant.\n     */\n    ctags-opts = -a;\n\n    if [in posix [ctags-variant]] then\n        ctags-opts += -f;\n\n    if [in exuberant [ctags-variant]] then\n    {\n        ctags-opts += --c-types\\=+px -f;\n        etags = ctags -e;\n        all += TAGS;\n    }\n\n    etags-opts = [ctags-opts];\n\n    /*\n     * The (GNU) Emacs variant of ctags (based an Exuberant) use -o\n     * to set the output file name.\n     */\n    if [in emacs [ctags-variant]] then\n    {\n        ctags-opts += --declarations --defines --globals --members --typedefs\n            /* --no-warn (the man page says the --no-warn option exists,\n               but is doesn't, really) */\n            -o\n            ;\n\n        /*\n         * Turns out that the emacs version of etags doesn't offer the\n         * same options as ctags when those options would simply\n         * confirm the default values. Sigh.\n         */\n        etags-opts += --declarations --members\n            /* --no-warn (the man page says the --no-warn option exists,\n               but is doesn't, really) */\n            -o\n            ;\n\n    }\n}\n\ntags: [change_source_files]\n    set shallow no-cascade\n{\n    function if_quiet Generate;\n\n    xargs ctags [ctags-opts] [target]\n            set meter;\ndata\n[unsplit \"\\n\"\n    [resolve\n        [stringset [source_files] - [match_mask %0%.h [source_files]]]\n        [match_mask %0%.h [source_files]]\n        [fromto %0%.def %0%.cc [match_mask %0%.def [source_files]]]\n        [fromto %0%.def %0%.h [match_mask %0%.def [source_files]]]\n    ]\n]\ndataend\n}\n\nTAGS: [change_source_files]\n    set shallow no-cascade\n{\n    function if_quiet Generate;\n\n    xargs [etags] [etags-opts] [target]\n        set meter;\ndata\n[unsplit \"\\n\"\n    [resolve\n        [source_files]\n        [fromto %0%.def %0%.cc [match_mask %0%.def [source_files]]]\n        [fromto %0%.def %0%.h [match_mask %0%.def [source_files]]]\n    ]\n]\ndataend\n}\n\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/c",
    "content": "/*\n * ${project trunk_name} - ${project trunk_description}\n * Copyright (C) ${date %Y} ${copyright_owner}\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <${trim_ext $fn}.h>\n\n\nvoid\n${id ${trim_ext $fn}}()\n{\n}\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/cc",
    "content": "//\n// ${project trunk_name} - ${project trunk_description}\n// Copyright (C) ${date %Y} ${copyright_owner}\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <${trim_ext $fn}.h>\n\n\n${id ${trim_dir ${trim_ext $fn}}}::~${id ${trim_dir ${trim_ext $fn}}}()\n{\n}\n\n\n${id ${trim_dir ${trim_ext $fn}}}::${id ${trim_dir ${trim_ext $fn}}}() :\n    ${id ${trim_dir ${dirname_rel $fn}}}()\n{\n}\n\n\n${id ${trim_dir ${trim_ext $fn}}}::${id ${trim_dir ${trim_ext $fn}}}(const ${id\n        ${trim_dir ${trim_ext $fn}}} &arg) :\n    ${id ${trim_dir ${dirname_rel $fn}}}(arg)\n{\n}\n\n\n${id ${trim_dir ${trim_ext $fn}}} &\n${id ${trim_dir ${trim_ext $fn}}}::operator=(const ${id ${trim_dir ${trim_ext\n    $fn}}} &arg)\n{\n    if (this != &arg)\n    {\n        ${id ${trim_dir ${dirname_rel $fn}}}::operator=(arg);\n        ...\n    }\n    return *this;\n}\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/etc-new-so",
    "content": ".\\\"\n.\\\" ${project trunk_name} - ${project trunk_description}\n.\\\" Copyright (C) ${date %Y} ${user name}\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify it\n.\\\" under the terms of the GNU General Public License as published by the Free\n.\\\" Software Foundation; either version 3 of the License, or (at your option)\n.\\\" any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful, but\n.\\\" WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n.\\\" or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n.\\\" for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License along\n.\\\" with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.\\\" ------------------------------------------------------------------------\n.\\\"\n.\\\" you can create the initial cut of this file using the\n.\\\"\n.\\\"     aereport -f /usr/local/share/aegis/report/chan_so.rpt \\\n.\\\"             -p ${project trunk_name}.${trim_ext ${project version}\n} -c ${substring ${project version}  ${length ${trim-ext ${project version}}.\n} 9} -unf\n.\\\"\n.\\\" command, and then editing it to be more appropriate.\n.\\\"\n.\\\" ------------------------------------------------------------------------\n.\\\" Add new entries above this line.\n.ne 2i\n.SS Version ${project version} (${date %Y\\\\[hy]%b\\\\[hy]%d})\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/generic",
    "content": "#\n# ${project trunk_name} - ${project trunk_description}\n# Copyright (C) ${date %Y} ${copyright_owner}\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/h",
    "content": "//\n// ${project trunk_name} - ${project trunk_description}\n// Copyright (C) ${date %Y} ${copyright_owner}\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef ${id ${upcase $fn}}\n#define ${id ${upcase $fn}}\n\n#include <${dirname_rel $fn}.h>\n\n/**\n  * The ${id ${trim_dir ${trim_ext $fn}}} class is used to represent\n  */\nclass ${id ${trim_dir ${trim_ext $fn}}}:\n    public ${id ${trim_dir ${dirname_rel $fn}}}\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~${id ${trim_dir ${trim_ext $fn}}}();\n\n    /**\n      * The default constructor.\n      */\n    ${id ${trim_dir ${trim_ext $fn}}}();\n\n    /**\n      * The copy constructor.\n      */\n    ${id ${trim_dir ${trim_ext $fn}}}(const ${id ${trim_dir ${trim_ext\n        $fn}}} &);\n\n    /**\n      * The assignment operator.\n      */\n    ${id ${trim_dir ${trim_ext $fn}}} &operator=(const ${id ${trim_dir\n        ${trim_ext $fn}}} &);\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // ${id ${upcase $fn}}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/lib_cc",
    "content": "//\n// ${project trunk_name} - ${project trunk_description}\n// Copyright (C) ${date %Y} ${copyright_owner}\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <${trim_ext $fn}.h>\n\n\nsrecord::${id ${trim_dir ${trim_ext $fn}}}::~${id ${trim_dir ${trim_ext $fn}}}()\n{\n}\n\n\nsrecord::${id ${trim_dir ${trim_ext $fn}}}::${id ${trim_dir ${trim_ext\n        $fn}}}() :\n    ${id ${trim_dir ${dirname_rel $fn}}}()\n{\n}\n\n\nsrecord::${id ${trim_dir ${trim_ext $fn}}}::${id ${trim_dir ${trim_ext\n        $fn}}}(const ${id ${trim_dir ${trim_ext $fn}}} &arg) :\n    ${id ${trim_dir ${dirname_rel $fn}}}(arg)\n{\n}\n\n\nsrecord::${id ${trim_dir ${trim_ext $fn}}} &\nsrecord::${id ${trim_dir ${trim_ext $fn}}}::operator=(const ${id ${trim_dir\n    ${trim_ext $fn}}} &arg)\n{\n    if (this != &arg)\n    {\n        ${id ${trim_dir ${dirname_rel $fn}}}::operator=(arg);\n        ...\n    }\n    return *this;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/lib_h",
    "content": "//\n// ${project trunk_name} - ${project trunk_description}\n// Copyright (C) ${date %Y} ${copyright_owner}\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef ${id ${upcase $fn}}\n#define ${id ${upcase $fn}}\n\n#include <${dirname_rel $fn}.h>\n\nnamespace srecord {\n\n/**\n  * The ${id ${trim_dir ${trim_ext $fn}}} class is used to represent\n  */\nclass ${id ${trim_dir ${trim_ext $fn}}}:\n    public ${id ${trim_dir ${dirname_rel $fn}}}\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~${id ${trim_dir ${trim_ext $fn}}}();\n\n    /**\n      * The default constructor.\n      */\n    ${id ${trim_dir ${trim_ext $fn}}}();\n\n    /**\n      * The copy constructor.\n      */\n    ${id ${trim_dir ${trim_ext $fn}}}(const ${id ${trim_dir ${trim_ext\n        $fn}}} &);\n\n    /**\n      * The assignment operator.\n      */\n    ${id ${trim_dir ${trim_ext $fn}}} &operator=(const ${id ${trim_dir\n        ${trim_ext $fn}}} &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // ${id ${upcase $fn}}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/man",
    "content": "'\\\" t\n.\\\" ${project trunk_name} - ${project trunk_description}\n.\\\" Copyright (C) ${date %Y} ${copyright_owner}\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) ${basename $fn .1}\n.TH \\*(n) 1 SRecord \"Reference Manual\"\n.SH NAME\n\\*(n) \\- manipulate eprom load files\n.if require_index \\{\n.XX \"${trim_ext ${basename $fn}}(1)\" \"manipulate eprom load files\"\n.\\}\n.SH SYNOPSIS\n.B \\*(n)\n[\n.IR option \\&...\n]\n.IR filename \\&...\n.br\n.B \\*(n)\n.B -Help\n.br\n.B \\*(n)\n.B -VERSion\n.SH DESCRIPTION\nThe\n.I \\*(n)\nprogram is used to\n.br\n.ne 1i\n.SH OPTIONS\nThe following options are understood:\n.TP 8n\n.B -Help\n.br\nProvide some help with using the\n.I \\*(n)\nprogram.\n.TP 8n\n.B -VERSion\n.br\nPrint the version of the\n.I \\*(n)\nprogram being executed.\n.PP\nAll other options will produce a diagnostic error.\n.so z_options.so\n.so z_exit.so\n.so z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/sh",
    "content": "#!/bin/sh\n#\n# ${project trunk_name} - ${project trunk_description}\n# Copyright (C) ${date %Y} ${copyright_owner}\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nexit 0\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/template/test",
    "content": "#!/bin/sh\n#\n# ${project trunk_name} - ${project trunk_description}\n# Copyright (C) ${date %Y} ${copyright_owner}\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fill me in\"\n. test_prelude\n\ncat > test.in << 'fubar'\nHello, World!\nfubar\nif test $$? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nHello, World!\nfubar\nif test $$? -ne 0; then no_result; fi\n\ncommand-to-be-tested -? < test.in > test.out\nif test $$? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $$? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/whining.png.uue",
    "content": "#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#\n# Source: http://dessertyears.files.wordpress.com/2008/06/whining.jpg\nbegin 644 whining.png\nMB5!.1PT*&@H````-24A$4@```2P```%.\"`(```\"S([=S`````7-21T(`KLX<\nMZ0````EP2%ES```/80``#V$!J#^G:0````=T24U%!]D+\"`P=-)Q#GW0``\"``\nM241!5'C:;+S9LB1)<B6FBYFY>RQWS:RLJMX&(\\\"0\\T@1<D3X%12AR(#8&@T,\nMT9P7_ACY#_P(O%`(S+\"K45U++G>+\"%]L4U4^6(3G[0)=KE3%O1F+A[NJZ=%S\nMCAK^G__7_Q%\"`(`<$P!L^AX`4DH.B)G)L9F)*0\"0<\\ZY$FLI!0\"<<V:64E)5\nMYYRJ>N]#\",Q,1$3DG&-FJNJ<4X244BX%$9$)`$I,B,C,S(R(9B8B(E)-`0``\nMB*B]5?NU[T-[3JVUUFIFB$A$5%5$`,![W_<]$=5:<\\Z;_0X1575]IHCDG$N:\nMV]N*E!AC2JE*5M7'.;9W5B1F1F(`4%7-N;VAU(R(#%9*B3&^#![,H$C';NN[\nM/\"VGYY>:R_;MWG%@9G*^[X9NV\"!PK54S#BX,/EQO=E=75^;(/'?;C<3E>3G-\nMNMQN-C^[OK_J=I7<)%6D;G;;T'<B,H_3IQ_?'SX]:I6[^^V[S=6;83^G6#?^\nM**FJHMG[AT\\>Z=]\\_?,/W_WPW7??4>>3R1=??^793\\?3/$V.Z.=??O7EVS<J\nM4DKI^S`,`P#TH2.BM\"SM\\O[BRS>[F]OO/GW\\I]___K_^O]\\L4_P/_]U__S_^\nM#__!9_WFVV]^]_X'M[OZMW_R9U_=?<E&D$4AL0M`#LP4$!$00140P:S=.C43\nMM5(EUEI-V0S,#!`16<!,$0#44GLV(B+B^>*K`CHS\"R&H:@L8$6'F%B$`(\")F\nMUJ)(58E<*<7,B*A]HQ8`'!@`R(\"(\"-',K(J(4/#,K*JU5N_]T`\\(F&L68+@<\nM9K:>V+PL[5=F=LZU<VAAYKW/.1.1][Y];BDE`)T#E0A?'6*JJNUM^3_^YC^V\nM\"P4`GKD]E0`9D%L\"F)D9&*`!`#AT8$\"(3(R`8.\"8@_=(?Y11[0,``-5:&J^'\nMJ*HJ`K2D1<06Y:44577!O\\YAOIR2JK1[X+WWWI\\SG,@3AQ\"ZKNNZ;GU)\"$%J\nM10,T($3'S$A:I>92I912EF69YZDE8<HQYYQ+1%`\")#0TT%K2,B_3?#@<<LZU\nM5JE%1%1JK555*70=L@-T0`2H51!QN]V``^]#UW7.>U5+N<0EY9QK,<?<.>^]\nM)V8U4P3V+L?EM$RQIB&$?3<XY*)6`7+.Q*1F.>=I',?C2:MLAF&S[W?]L!TV\nMJ>9C7J+6KNM0;9RF6LJV'S9=[YSS?2=@R[+<OWW3]WT?`I3Z_/`X#/VO?O4K\nM)4S+\\M577SGGIG%4U2Z$S69S<W,SC^-VM[NYO7U[^P;%7AZ>QM/QY?GEW=W=\nMVR^_'+;;]S^^__TWOWOX]-$[O+J](D>`9M9BO:46`AA<$I(($4%-:JU5\"K-'\nMA$N&J)H1HV,?.K>NN2T)V^%<:!%O9BV=$#&$T-*L/;,%S\"5O;<V<MF2WE^>:\nM1:2=8'NAJ9I955W_\\D</V+=(7C_T7\"=4V\\>MT;Y^'!&UE0(1VTKAO>^<;[G:\nM\\KR4TM9Z)&K%`Q'YK_[37YH:(O8A>.\\)D)\"ZKMNZP,XY8D9B(D9\"1#0(Y$$-\nM#1P1(Z*!(^Z\\!T3'3(A@H**F!@:F1H#MU,]+HHBHJ\"K!YP5/1%2U)9Z]6@Y?\nMKXAV24)NGP+0OKTC;LGLG&LO:4D(:H1$2$S43DQ%I,J4YR7%TSB.\\[BDF$O)\nM):><>T;/Y(A(Q;1`K3DM:1GG6-J=:.D'EZM\\->P#,JE9E9)R*86=ZS<;10U=\nM%[H.D&)*A],XSG/*&0V\\=UT?@G,&5K4:`C&:R&$Z+679A+`+O:0ZQ9152\\EJ\nM5FJ-,8[3-$^S<^[-_3UY&'QWM=MGJ0_C<:EYO]MIE659EFF64F]N;D+751%`\nM/)U.8\\W7^ZO[JYNOWWX1Y^6;;W[G^N[K7_UB<+X%ROW=70@AQ=CJR7Z_#Z&3\nMF%CQW=W;K[_Z,J7\\C__XCTQ\\?W]__^9-'UR)R^'P<8Y'W^%VV\"`9XCG[#-H:\nM*Z_3\"1'LL@H#M$!OP5\"K*@`080ANK3FO7HAF6&M=U]]6\"==_?0V:6I(PNQ5#\nMK7G%S(#`S)Y=\"*'AM?;BJO(:<ZFJ@1&10S8S$P6S%O^@9JH&YIA;$<!6[LW`\nM#!&=<P`00FBPBXD\".T8D1\"2\\?+/+V0*L&(W_[K=_JZ((Z-F!08ZYE@H&/7G0\nM<P$D9$>.B`C)Q$P5#`@)`1\"@Q3HRK2L3F!%B^V$D$5&S-:/:EPS>JVHK@&MQ\nM;\\```<```1$0S$Q-19T_7R:['.<JW]9:0FM/O;RR<QX!UFM42TDQYI1.RYA2\nMBC'FG&JM(F*F`+#Q@*!22HYSSEEKD5JTBJ!K.*>4K*I,V.KP3;^!4M.RI'E>\nMTE)J`4;G'0<&1%&)I8S3-(Y3*L7`NM#W?=_U/3$KF+6H-1.1Y]-A2M-N&/;=\nMD*9XG.8D@F:U2I%::TTIY9R[$*YO;K(D4KBZNE;''X\\OAWG:[_98U1&G&(^'\nMP]7U];`9EF4)H?/LOOGP@V>WZ_HOW[R]N;I*.<XY37%Y<WW=DO!J?[7=;A%@\nM69;C\\5A4.Q]Z#I@E$-W<W/:;'AA?GE]>GI^MI%]\\]>Z7O_P:V0[CXV%^N;VZ\nM(T8F`C0U)20B!`2\\P#E$`P\"D<_\"5DEI8&IJJB8J(UEJ)H/4C:XEK]U<-<LXM\nM=EORK\"!K7:#/:09@9LXQ@`%8*\\)$\"&`BE1P3D2-VSGERA.1:5V*ZKMVM@C5L\nM\"8BJHBKMK=:JKJ;.L7-,A&8J4D6JF2(\"@*F*=XX`4XZJHJ\"MF+936L^*F0P,\nMP-IC_MM_^&NI%<P(L)::YB6GI%6L2LXYE](*/!&U6BA5UFQ>BU7[7X-_\"-!R\nMKZU%YRMU24(`(\";G7!=\"^\\NZ^)TOHO=K5[G>#`#@2U8C8,O\\MB#1Y4U>(V]5\nM1211K2)5).5\\&L?#\\7@X'D_+F$L1D:JU2A450$,BR4O.>5ZF<5YB7%(NM5:1\nM&BLT%&&FWON^\"VW!\\X*GTVD\\G6).9D:.G??(1(%CRL?3:1RG)<8J`L3$O!^V\nMH0N^\"X(F(HA`:EK*DM*GY\\?3<KK:;&XVNS@M+Z<QJW;.U09@3*M(SAD0^ZZK\nM6G)*_3!0[S\\>GS\\\\/5P-VYWOMIM!11Z>GC;;[>W=G9H-7;?;;D\\Y_OC]#V1V\nM=W=[M=_?OKT/7??T_!S'\\=V[=\\,P/#\\].>?N[^Y:D__#CQ^DR-5F'_9[K/5T\nM/\"#A+W_UB^#]P^.'3Q\\^^,\"W;^ZOKG>IY$\\/'Y![)NK['I%4%`\"1\",\\186;G\nMGAR!B-@QJPF>5UD$!+@\\C0A;)+R^]6:&C(#F/%]6>%,3YUA5U$2TJ@H2M,H'\nM8%*U=4,K]FM)6UN&GQ,,D,[8N:JL0&S-9`!`0P0D)`0T55/%2X/FV3EB--`J\nM4JN)@AH!FFB*L56ADG-[%=CY#<^]6\",^:L7+]T5$_JN__4LP8&)/CI$=N>`[\nM[P(\"*2(@&2`0`6(U$S,$0$)B)B9B:ID!B*#6TJ,E8<L6,!`5,S/\\W.`2$S-+\nMK:V%7=O(<Q9=T'];D-8'.:<5G;_&[L%SRTMF:JUB6Y``2$T-P,!:$KX<#N,T\nM3LO4;HS(>I-$1,9EFE-><DXBJ=98ZI)SJG5>2H-#?1>VV^VF[UL3.YZ.CX?G\nM<9D,S?>AW_2A#PB6I9ZFZ7`\\CM-<5)T//G0^^#[T[#TY3J6D%$V-#6K*L91/\nMSX]CG*YWNYO-;CY.'Q^?QKAL^MY,JVJ6FG)>8I1:#8`#S],\"B-:%A]/QN_?O\nMK[OMF^O;@\"@BSX>#(5S?7/==1P96!+U[?GIZ.1QR+;OKJW=?O!VZ?M<-RSR5\nM4O;[_7ZW6Y9%1:ZNKFYN[YT+I^/IY>6)`3=7NW[H1`H3WM]<,^(<YZ>7%U%Y\nM\\_;=?G>5E_(OW[W/M?;#L.FW1&QJA*0*>&'47L-+`'0>$*GAFY:QSCGG7`.T\nM/\\E`,Q-5[_UVNVUM5<.<[5]76+36,40T4':$!*I2:VF_.L_:ND'`%E(BHE5$\nM))_1D*U$R^4T@!TY9CA3'&VQ!B0\\=UV7,MCJF_?.3'-.;4$!L!!\\\"%ZD&.A:\nMEM>EQ,!4&PHS_LO?_$7GO'<.$1UQUW6=\\TQDCHA)\"8'0$,5,S00,$`W!$!1`\nMS-IC0W`*+0-;2315%3'1+!41@;!1,@#0,&;)><7K[2(ZY\\ZTTF7!L',WJ*IJ\nMM:(!`;8?:'EMUN[UFI;KDE/,BDJN)99\\FJ>7X^$XC3&G(D4:SE`1U5IK+BFF\nM--4TYY2J%H!8Y127*:=458HV(-3W70@!P99E.9U.AV4ZS5-5]4/7]5T(P1!*\nM*8=IG.?E-$\\I%V0*H>^ZGARC*3HR@CDMI_$((A[`:EE*>3P\\3VFZV>WN=E?C\nMR^F'#Q\\/T]015Y6J$G.:EV5>%C7SWB-CCJF*0.!CG'_XX8==/WQY?4>FS+R4\nM_/#\\A$3WMW<D&N>EZ_KKJ^L/SX^_^_Y;\\NYG7W[Y]OHV&&[VV^?GYW.?2;3,\nMLXCTP[#?W[K@YIP_/C\\8VGZW!16LXA&&[2\"$[Q^?G@ZGKMN^N7WWY?V7WSY\\\nM.AXG5;O:7W6^IT;J&2'IN9I`NR]T6?<%\"0!05,W`+JAJ77-?9]<E5P'`4HHB\nMM?6$(O62+7B)[Y88UG*X/6CM'P#DG!LR:]3&A6LT1$PE_P39M<>NO0\"0\\!QR\nM[0&[2PI>B'=N)`T1$TFMC:U`Q.\"]=R[G_)I-]:V==*R7RT%$_)O_]#==UQ&1\nME\"HB9%!KG><YF]0+0-:6N-3XT4:XF*AH0QM@!N!AS?%S^6IEMZ@P,Q*UOS2`\nM(B+!^=?+6&L(UU737IUB^Z]WO#*BZY+)S+FD1DFM(*05NJF4.<9QGH_C^'PX\nM/!\\.TS+G6AVOS/49M^224DJSE#GE5$L5F4LY3=,4<Q;IT)T/)E6-RWPX'%Y>\nM7C)9+!F9NJ%GYQ!`2HW+<ERF6!J457:N[P87`@!(+NP<>9Z7>3R-9#:P)X7C\nMLCP>GJ<TWUU?O[FZB>/RZ>EY*1E$@,D08LG+LN2<G7/#9J,@6D55J0^SE`_O\nMW^]\\_^[Z;M.%?C,HPK??_:&4\\O.O?S;X(*7N]U<4?`8MJ#]^>!_GZ=__R9^^\nM^^*K:1F_^.*+P^'PX?W[K[_^^O;V]L<??YS&\\6I_O=GLNDW_\\?GA<#JH5\"MU\nM\\-Z!]9NM$#Y-X\\/SX>7IZ\"#<W7SQ[E>_^O3P\\/#PU(5^M]TY]@\"L8L0KQ=)*\nMXGE]KKJT#D/51&J5%LK0N/'/+=GEZ(<^I70\\'I^?GU5U&(95G_@)^[)\"K48T\nM,/.FWWCGYV5^>GHR0%5M$=R\"QSOGG%M2:JM_2]TS/B2^]'+G7S\\SM_^*F&C1\nMFU)J\\M@:^:M\"MGZC<X4'6_O>,\\OZ/__Y_]2^5:E%5-%QD3K'I=6NH>\\;&SGT\nMO4,\"416MI:H($Q.2J38N5%H+I2*J8MJX!R!$S^U+M$ANR)V14`T(C;\"B9:FU\nM86M1E=(%+Z68BF=&L*;%^,O1OIM>F&4!!J1<9(E)U$+7^\\X;0*XV'<?3R\\OI\nM^>7P_#`OIV(I6]HQ,R$YK*!C69[C^!+'HZ2ZC&!F)CGGO&00\\,YUKK_9=5W@\nMJG7.,4LYQ.5I&A<5\\:XBFF-R'MG%G$_CM\"PQ%45%1VX;^GTW[+I^[\\,^A\"32\nM^U\"G93F<ZAP]4NBZ):>7:?ST\\@1&=[OK^\\VUI/SCTX?GY2\"$L10S`J6T1`(8\nM!D<H%:B(,''O.TI2YB0&X>[Z:NAJS-NNCR5_]_AQN]]M0G?M^[WONA\"48\"EE\nM2NGCQ\\<EU__FS_[]W7\"SW]T(XO>?/GX\\/-W<W][=WWSZ]'&:E\\UFN^FOWMY\\\nM6;-^_/0)`VFP$.Z+$%'8#_L<E_<?OI_R87/3[</N3W_Y<Y/YF]_]T_7U;K?;\nMU6K..6E,`KI+^EVX#9NHZ0>F%:@BBO/J0ZW%]YT`S\"4+0F4$[WCH!M]7$S$-\nMSE]?7_>ARRD34K?=B&DNM07XO.28,CM/\"(UF)Z)2R[S,R[*HJE;U[/J^[_N^\nM4:FYUE2*B#1Q:^T,6RX8F(*U)E),#1MVY@;R6B/3>'A$+*6$$%)*M=:^VW@?\nMB#RA6Y9D)BWX&^O3UAI$]$B.V#=)^N]_^YL&X1#/O%\\+[MS6DLT&`)KZV=(7\nM+F#]M:X*`('=:YYF!?>&GUOMUR\\$-21\")B#\\S.M`:^U\\.Y]V*=M_0PA-BFA'\nM^THI)>?=I0P*$1%#(UT/2WPY/I\\.QVD<YWFJM1!\"$U04K(HL*9WFJ>D'M4H?\nM0JEUGN(TS;6((]>'K@O=X(D0:Y5:2BYEF>.R++44/_1-E$2#TJ2\\TRGE1,ZW\nMV\\E(/@3'3DUSR1PZ0EQ27.9ECHN\"H>.EYG%9'HXON:3]9OON^LXA?GI^>CX>\nM1\"VEO\"SI=!J7948$=EA*5D,3[4/8#AL0?7A\\C\"GV7??FZHH1NQ\"F'#\\\\/VYW\nMNYO-SE(-P0^[K1^Z[W_X,94,!G_XPW=%ZW_[;_\\LU=SUW;MW[[[_PQ]^^.&[\nMG__LZ[[O8YSZ?D\"D$+IA&%1JZP8\"^EI3\"&Z[VWI/\\SR/I\\/S\\]-^OQ\\V_?W]\nM&^_#T].S]]UNMQ.UUQK:*F<#`*(T9DW!!*R:2BVE)D9J.I-WKB$+0&1FD\\K,\nMU[O],`Q=USEVY\\!@!P@K4UI*;;TB(;3KOXK[(81A&+P+?=^WR%D1DXCT?=]6\nM]I68/>/2QA==BO,9UM6R0K#7*F*KD^UQU_7..2)N#I80SJ)(RZP5Z)T+8D.J\nM?__;W[33;?QOJZ?.N6[HFS)SKMW>MU.G\"P8X5VKF5DB]<\\34ZBNV7`6P\"Q?_\nM$Q;TK/(QT>LD!\"1H%`NO5[`M#>T3FZ;?Y->536WGV5H\"9B;\"YHQY/[X\\/S\\?\nM#B]Q'B4G1^R]\\\\2II)S3O,RG:1J7N98\"B,ZY5,H\\QVF<:ZV>_=`%3\\Z9(9F(\nME%12SB7GFFJME9'`<PBAH?>2\\SQ-2UR02`W;O73>DV-KYU.*@L6TG,;3G)9%\nM<@5%STG*\\_%TG(^&<+/=?WESLPG=:3R>XG18EG&:GU^.SR^'F\"([!M0E+83.\nM(0U=?S5L3?7YZ6F:)N?<S6[;A<!$@O#IZ;&J7&_WSJ!(O;ZYN;JZFL9)JQ35\nM'S]]?!P/-_O]E^^^[)P/S`SPW;??3O/XY<^_'H*;YJG6.O2#]RZ$CI\">GTX!\nMA1!R7OK@W]S?YAQ__/X/T^G8;SHFNKFZN[FYG^>$R,.F8S8$:L3#F0N]$/T`\nM9,9F)FJJU317S:;%43ASW8A@5FHU4<].:W5(K5+57(BHL>>Y9*VBHM1(2P4T\nM\",ZW+F/-P\\^(D3T`M!!256;NNJ[5F)8>:^=V1K;ZV;GUVCKR$QO-3WQ=+0F9\nM&(E:^PIX;E-;1JR6%21:^13^Z]_\\!1%U7>>];]U@*0410]<U7+M^C;88-'O.\nM:D_[+\">\\*H!KAZ:JAI]/>DU]`&BZC3%=A\"1D)&(RD7:QUM1MDD#[]`;W7V-Q\nM_:S`(*\"*2$K+/$\\_'`_'XS'.,XEZIK[S?0B>^13')2[':9KF*9>\"R(X=43B>\nM#BE5$W/LM_W0^<!F4E5!:JVIU)QS+=4,/'-PKIAZYTHI:8FEE'E94LZ`6(LQ\nMN;X;?-<ADMI9&UJ6Y31/IVFLIHH`B.8HU?+P\\#\"ER-[M^W[K0DWQ\\?GY&.=%\nM9)J6P_$T38N:(\"&@BHH#1XB]\"YMA0P#'XS'&Z)PCAU>[*RN\"1*>X'(ZGWH>[\nMF]OCZ<3.[3;;Z_WUZ71Z.A[]?G.J\\0__Y7=OOGC[]NX^+<O-?L^.?__M[Q7A\nM%^_>BDI,L93BV`W#UKFN5K4ZLB,`JS41X78()O+R]'287YSSP[#9#%<WUW<`\nM4LK2=]Z`+EGW.@,-H*%1$*FB6528(#@$]6!6<BZU-MAF:HZ=)VIB0XZIUAJ<\nM(Z*4D@N^+=WMJ$5:_=@,6R;'[)@<-=*$')-K4711AFT-W6F:5G36FD/'CIB\\\nM\\^SXW$:Q6R4Z,VOG(R(K3'L=X<SNHDI`*45-F[BV=L7M5ZEJ\"J:@8OSKO_^K\nMUJTU%-?J#\"+&G'+.+?<:V&V?NBR+][YQ.:^32B_H6<$4K/6SY/C_%Z.VTHI$\nM1I]KNB-F9I6ZFH!:)K?+UU:IYE![[6]*.9W7%JNUUACG<1Q/I]-3G.,\\@]2.\nM*;!S3`\"6<SZF<4G+M,PY%P50M9SJ,D<1=<B=[X9NZ+O`C68V76I*I521*K74\nM\"@9GOY)W\"+C,RSS/M=94<DQ15!P%YYSO@O<>'0,1$`)AKF6)<9IGA3/[AP8Y\nMI8>'QSDNSM.^W^R\\MZJ'99RU)+$EI6E:<JD&IJ`*@H0E5Q5AYDW7$_.R+&.<\nM#<%0W][>:2I`*&\"/AQ>I]5>_^.64YM/Q&'QX<W=_F,9/S\\_4>7#\\\\/[#AQ_?\nM__SG7W]U_T5.R^W=[68S_.[WWY#JW>TM(Q]>GH/SH>M0\\?;FKJ2CJN[V>P5]\nM?GRZO[M]<W__\\.G3O_SX>T1D\"GW7#\\,V!(=D1(;H6]ZI-D?;6<L&.S/U0*(B\nMH)70'`%8IZ*U%%/U[%IR.>9F3\"%`YUS7`@]PF9<+1A0$<.P:=])WG5U@Y.K,\nM;/&V&DI7\"K\"MZ:LL\\9J87:F^%;8AK$_0,^&H<A%\"%<\"(^*)7-RD%VH>\"^R-X\nMV%HP8D8`XD:6,/_];_]V1<EP\\7,243?TJR#3SJG)!J64B[!S_LL*]U?HW%27\nMEC`_)8(N!S$#H2%44P7CAFR)\"<YB8-..6^%M9W@F*5\\IJ@!0I1J(FJAJK3G&\nM.$VG99F/,94EHDA@1I-2\\VF9#J>74SK$%'/.U0``I$)<\\C3.&^X&W^TWN]UV\nMXUU0T%AR+/$Y3C&ETE0-,W;>A<#$R&2J\\S0M,3;(W?2;3;=M#!@PL7/(5$&S\nMU\"QY6J;Q=)1:R\"P0>2))Z7@ZI12=]U>;X6JS=<$]Q^EA.L5<2ZU+3+E4;7<:\nM%0G&:2FE($#HN[[OEY*.XRGEK`A7V[TS,H5L>IRF95J^^O(K]OSQX<$YYT.'\nM3+G4EY>7_7Z_'3;OW[]_>7G^Y2]_?G-U[9EOKJ]JRC_^X0,@OGES[QP?CB\\J\nMVG<#.N<\\*F\"1BD#,3A0(\\>W;+QY?'CY]^#A/R_7UWCOL^MZQKU*JB%IM/P!J\nM((C&B*`560&MF0_-3(I*$::>D1#`.==W_=E!\"4@`WOF&0L]4`B(`N!\"<<W9A\nM.\\V@63$!2$1+J:74-395+:6X&CO72M!`:8ODM4NT5\\=KG1,1\"4E-UIZPE/*9\nM:''A7#R0&R?,3+4*,K<R>+8`&+13<N3H(K7S;_[7OWF];+0,\\=Y?W]ZLPPJK\nM@B<BH>M>VP+7<VTB>TM'1*2+][J]\\ZJS_Q&GC*`(+8*;R8:0&%?GKEL;U`9'\nM5\\_!9W<X8K5R0:JQ9>`T3<NR3$LNRXRB:)9+GN(RSJ>7Z33EJ4A10S!25:FF\nM`@BXX[YCUX>.V!63.2VG93S&>:XY:34D<HQ,/@3?!2!<YF69EVF>EAC5#)B<\nM<TBT\"3LS:.9912BJN=0EYSG/IVD<3R>HV@8O!G(RI],XYEJ\\Y]Z';=<!TP\\O\nM#__U^V^A@AGD5&),B-!UP7E2E:+6+DO7=<-V4Z0>QM.<XE(B%;W;7>6<'T\\'\nM19CF.82PO]Z?QM,<HR$.VXV*3<?3X+MAMPW!_]-_^>=4\\[_YDU\\Q`9;Z]N8V\nM9WS\\].P][?>;%)>X+&;J$/VP0:;3--=JH>^/A],T35^\\^])U_OGYY?V'[T3+\nM=KOM^XZ`F%Q5:>4\"$41JC(NJ.,]HV;3H6;]F-I:B)0F28V9HHISCUEHTMP4S\nM2U-]2FUC\"F=P9*953-4[Q\\2..#CON_[UHK\\Z0D/PZZ3%:T2ZHKS7=:+9*M<*\nMV0+L0O98<X8TJ-2^(!$\"GA6.STE(6$I5_)S&=IXH45&M4IL.7%7Y+W_]YZU/\nM74%SXT(4+,:X3HNT=PDAM%Y6+U[RUPS-:[2YVMA7ZZZ]<JZ9-5\"\"=C8N-:<;\nM$A)>)C\":ZE)K74OB:\\O\\>G52B3GG-A4Q3=,XGL9QG.>YU%IC,JT(4&M)-<\\E\nMSCD:E+;\\B&K)58LZ=GT8KKDCI\"HUY3C&>4[+7&*J%3L/A-X'YSV>K5>L*H>G\nMEWE9QFF:YCF7W!I35=VZ32/CJVFI)=62I8KI'*<44YH7!MRZ;NL[KQB/XX>G\nM)U7M-OUVV%SO]]OK_2'./QX^Z:+.^5ID6:)SO-_O?&#1RJ$S,U7;#,/5_DK`\nMIF5.I1Q.!UW2S]Z^*Z5\\>/@4-L.\\+%+J[=U-D?KP^$C$/H1E6@@PC;,PN!#&\nM97Q\\?'\".W[UYL^UZ%'CS]I</#Q^^__X/SM.[=V]?7I[_\\.VWMW=WOM\\841>Z\nMF/+3XR,@,='WW_]P_\\7]=KOYX<<__,NWOWOW[HOM=E\\K#)MK=B07SWT3^IJ2\nMU@6K4DI.!N38$7D1J%FK*3,W2@:TC1G)&@DE9S.C\\[`2.6+O`S&IZ)FTAS-Y\nM(0;KJU8[:\"G%>_<Z8M?BUM)O=8<W^2'GS$0K+]H>7\"RFV-[_]2@3`-2JES:*\nM&RA%PI0RNC-UXM@Q49MZ^\"SQM^,O?O._D&-RW%J7]L#:*,VK6&]+[VZW8T#/\nM+C06%M$1-;2KA,Y[0%0SI.;;K(#H1#U1YSTC6JT@XH@ZY]\"3J9A4%'$`9&:F\nM54JCPM;$:^?0KLYG/^%E/C\"E%+/F+#&E*GHX'I]>GJM(+FF*!X4::ZR@2<IQ\nM6=2`D'-E$48:3.DTQE)J/_2;[48W:+W#WB\\E/S\\?<JR!AH#]#3-'#8;;L!G\"\nMAM'E)(?C-*9Z/*5I5H7!A8$<&F6CY'&;4BJU($/7!^=)I,2TG`ZCQ#3X`%44\nME#;AI4X/Z?1A>AG3M&%_?WWKV9<D94[E>?YX&@_3>)Q/`M5Y[ASU[`<*Y.@T\nM3D_'4R':WMYN-X/66*;3^_D4I6QOK[?[W>%X?'E\\ZOI>'=YY/W1AF::E1`55\nM%._)4#Y]_WX(_;N?_2(J?GIZN;ZZ>O?VCAFMQIOK78[IY>D(Z&]N[D/?_\\NW\nMO[_=[(=A\\#Y@S\\=E>GC^5%04(-2XW0S9[,>'3^^?'O97FW=OKP(FI\"L#\"R&,\nM:9KFEX[,EG'Z]+Y:M_&;`$X/IWQX(2C$(KB4E`G/5<40SLXQ9.H=.!(\"<\"P$\nM0F\">9\\E6C^2&_P``(`!)1$%4:E45%4,`1T`@;!0809Q#1E,MJL61!4?!D=;B\nMF;PCY[D+/GBG(#$M2.`]`T(N2:2V)*FU#GV_-HIKV72NA2K4*JI`Q-YWW@=F\nMMQK?FLU-I%0IQ-!W7:O%H`*F8(JFH%JEKGTR_\\W?_]7J(G]M26E@=XWX%7SZ\nM5W+':]*EJ#34VKK*-M%8:^U>Z46MQG9=%T*HE]F6UXY0`'#XF5Q=8<-K6/O:\nM&2,B!IC3,D_3,L_'XV$:1Y52<A941%0152NEE%K.M=JYG'.<X[(LI53'W'4=\nM.\\XEIK3$&&-<1&L(H>\\#,9*)JCGO0]<C<:VRI!QC/)Z.*99:*SO7]]YW'((+\nMWM5$@*``JE5$0$5*+4MJUA,\"1%/GG/,\\ISC.4T7L0S>$?KO=7NWWQ&Z<ISG%\nMP[SDDMNH!X#V/O2A0U,MA8%1P!O=;+;W^WTP@U0>X[P<QTW7O[M[HZH?/GPX\nMCJ?]?G\\S#-O=+J:48NQ#YU>6BURN$E->8E*I/9,GZIWK^FUK/6*,,:>NZZZN\nMK[SW/WS[P]#W81,<,Z).IS%-<^]#64YB=G-WJV;??OLO->4OWKQUS@7>$$%3\nM;LT@I91C%(/'IP,C]-YKE91CS+EJ06K,BP,D;;.MS8$(JJI,!&;-&5)+;32Q\nM`[1+D]+\\6+5%RSI2U<3W2S/5PO@RRBMML*Y1G0#0S)',W/?#,`Q]W[>_OT9V\nM+2!7E^69GP-\\#7U?=UOMC[7^$1F[XF$%^UP)?_,/O_ZC88A_);\"^GJQMVMXZ\nM<F*OH&;*647BLJ28FF&&D+H0F/#B\\S[//+5J:6=BR1\"0FQ\\<J7EL7D^IO,:?\nM:R/:,,.Y$:\\2IWD\\'<?C83P=:H[G\"T:\"A*74G.(2DY2*A\"(:4YY.XS2-I50\"\nMZ+I^T_7!^RQSRG&)<\\H+@#K'`%IKEES%E,DCN5IEB6F<IFE:ECB+B\"(Z1]XS\nM$P\"(J55UY!RBUEI1Q2&AFI52<JDQH9I#\\B&@IVF9Q[1DD>`\\J#IRV_U.#)X.\nM+W-.<ZDYIVK:?%^=#PXA+=&);4)O\"LLXL\\+U9KMAAEH.)1X?GU#U[=LWP]!]\nM_\\-W[S^\\=TSWMS>W=W>J>CP<O?-]U[<H=.R6N\"RY%\"ED8%J=03]T+.(<;79;\nM=GP\\'G).5_O]=K.9G@X__O\"#FM[<W'3>@Q1290`D32EU0S]L-N/Q]/3TA`9=\nM\"-MN<('!\"C$[SZ5*S+6*'8\\O*245#9X!,:8EY8P`2![/5,U9>#`P,(CS3`:H\nMYHG1`$3]9<85+_JX:Z8S!\"(*SC/Q6C/6:?:U(:R7WJH-$ESJVQEA.3ZWCG#)\nMG+4XK:.]K\\5Z43'X(^/*.<II'=S[H]''SYP/PIJ3_'>__=O7\"?J:C/G),-$Y\nMFR^.N%7[;\\^_O;OSSI6<4XS->]T4?`1[;0%=919RO(HSK[\\D&OP$N*^2QGHR\nM9QVIS3*G-(_C/![C/)44F;#SWA%F$#\";YBG&5$NNHB8:E^5P.J04S<`[[KJ^\nM<X[9(:)Q$I%:BYD2,6*SD5='CM`!DP(L*1W'Z7@<3]-830R-\"-BA(P03K5*+\nM(#M5D5I)Q1,')!9#T6E9RK*`JG-N&#KGW)SG7/,X+V1@JH[==K.I`*=IFE.<\nMECC%1400C9!V0[_M!S,M):/G7,MA&DLMH>/MI@O!1ZF'QZ=EGO;[W?5^'^/R\nM\\OQT>'FY?WM_<WT]=%V:%U`-79=S'J?I>K_ON@Z!3N,XCJ,603(7@@<4T]!U\nM0S],T_3T],3,N]WNZ_LOOOGF=\\\\O3YM-M]_O]L-@H@C6]5Y57UY>-L/PLZ^_\nM?GEZ_N'[[[>[W77?;[=#T^2=Z]DY,9A3'KP_'8ZG\\1#Z[NIJ1T0YIISB4JN9\nMGJE\\:D/;AD2!V#.C04L.K8(&4BH[!CRW9VW\\#9F\\\\Y^'W<Z=&*^&L#.?=^$O\nMFOO[XF59]3:\\3*Y9\"[.5_V\\Q?^%@/_MI5J?HNI5&L_*TWI+8K3&\\$B6JNII>\nMS(S_\\C=_X9QKXOO:@+YVE-/%>]V:T<Z'%5BVIS6V2DH%,T;JN^YJO]]MMYM^\nMV&XVJ6:@\\YA*>]\"4\"8=$B-ZYX+SG-B-Y'I9_7;L_&[B]_R-?>\"GMFN9YG,;3\nM,H\\I+2HU>&8B,YDEUEJ6>2FU$#&\"5=%Q'.<4S<P1#<-FTW>(5$O.*59(HFTZ\nMLQ%?\"&!$M.NO.'@`2JDL,9W&>9RG%$NU2@3.<7#$C(S$1F0$@'&>2UH\\4'\".\nMQ*P*:#WE6')&`,\\T#`,Y7)8H(CE50NR<W_6;ON_)N53R<1J3:$I+U:IF:-*'\nMKO-.:YVT)-.HDJHD*^QX=[V_OK]BP<?'QY?G9^?<U?7U=K.14C]]_&3.=MOM\nMF]O;`!CGN<VV+''NG=MNMTS^X\\=//_[XXSB-/OC][<W-T\"M8J:7ON\\UFR#G%\nM:5KFZ7YW-6R&<9D^?OPP;/KM=B@I=LY5J*$+<5X<\\?W=7<KIT\\-#*67KP]W=\nMC?-!:R4BYSP0CLN\\\\;RD95H6`^F'83/TIAK'^64\\B8E[Q78@`A-Y\\F`@M3IV\nMCATA,A$8-.;B`D?;+C5&3*!6:Y4J;7T/[-F=Y82SQ^.RV42Y)%N3]2X&Z[,Z\nM[;W_B3ZQDOP_*0^O][98-W998[4-8SCGFC7LO#]*K6WA:!B0_^+7?]ZV2'J]\nM/43SKZTNGM<;YGAV*Z'T>B>EF@L3>^>[T`4?3#7%F&(:=IM5#_VLMQ#9A9)=\nM*_M:M?_UD\\^VVE+RY9#+L<S'TWA:XIQR%\"W$6*4L:4Y2:RDQ128F)E6K)<_+\nM)'*V$@PA#,.&`'(NI90ICK5(*57$1#3GDG,Q`^:@\"G-<CJ?3.\"\\QYY)%$0#-\nM=SX$=@Q,X,`1$*$GJ66)(#J$,(0.4%6JF1TDBQ9\"\\.RV?6\"D.(\\U9P`FA8T/\nMVWX(SB-Q3.GP\\I)J*5(OAB?R\"%KJ:1S=IJN@0,X(JHAS>'VSO[[:W_;;T^'E\nM>#P@8S=TV[X'T-/AY?WSPW88OKA[<SULX[3$92%F`3L\\/CCVONN6*7[X^/'A\nM^5E0-_O]E]=7H0M+7%3U_O9V-VS&<?SPX_O3T_/;+[^XNKG^\\=/[#Y\\^A.\"N\nM]CLSC9*]<YT/*<9EGG>[G0OA]W_XEI\"WV_W5U1Z!:LWLR$!RGO.<7/\"`-LYS\nM+;GO^PY9<CJD&4P;JX?,2-@&CU2A2LVE..]]\\(#`SC7AFRZ*,5X&Y1`QL*]2\nMZR7E6LHTKN7<VER4^I13F]G_XXGP,]O9QC76#8U>^[=6LI\"1SY#6\\4_DZ[4G\nM]#Y<>M&Z:B'K-B[M[_R;?_AU>]_7VWO\\!(6^GAY\"@#4_5Q\\0`)!:\\_XU'UK-\nMI>8\":F'77[I!LO,8E!H8*YS]$`!MO`\\!'#-<D/=G!?)BPVL;/;3]W1HPR#D?\nMI\\-Q.L:2EQ2K\"3I*)<XQMLD,J4),8##-T[+$95ZJ*A$%=MY[SURKI!3-=\"E)\nMU6J5AK5KT5)JL_Z74D^GZ7`\\QC9OW_1BAA\"<]X2H4\"L8@#)4]\"IL$-CU(1\"S\nMFF2I1>J+1C5S2)YQT_4!81DGB5F!/9!G]N0\\.T2:Y_EP/(XIJBF0,9'WW+$'\nM`!/IV'7LO?-657+:>'^WW0WLKOL!$(K68A7`V)%3RRE^__1AZ+N;?KB_NO:`\nMTS(!@:*-AP,B;OH-D9^7]/#R^#P>EYI_?G>UW^^DEN/A1;5VWCLF`WUX^%1-\nMMC=[%_SW[[_/*=W=7HM4(`0SQUR7-$W3_NIJV&U?QN/3TUA$KW?[;3^`5\")1\nMJ\"HY1G&=,VJ6K$0&'B`P5T<B&E-44V+VWK>A=N!@B(;@@A?3)<4B4E5:1*Z.\nMEC4)'?,Z0=^0XJHH7'9P.F>+O9(9B\"ZLAYWK@5ZJSDI\\M*J[NJF;2ZQMIT)(\nMK]/O-4E#[%XKC7\"9!U*PU23#_]O__MN62VLZM=P;AF'URKA71R.5UB:M5<(6\nMULVEOBX>SKEA&$YQ>MW+KI6:['.9;>?75I=U2F/M/%ME7I/P]89VI933]#S-\nM4ZFYU&0@/G`N)>58M)I\"H\\YR+J?C<9J7&\",R#\\.PZ?L0@JG-\\Q)C9$#E-I.&\nM3+[K>F;OG._[P7$`PKC$>4FE-IE5S4!!VIBDJ9@(*)$Z4Z04&:D1-6:UB*1:\nM8EX.6D#-(WG$?;_Q2'&::\\J\"[(D=D\"<>AI[8+3'.<<$^$(&HEEH)P+'KG!NZ\nMKARGP+YWH2Q94[X;ME]<WW0$4&VSV0C\"G**JAA`Z=EKJQ_%Y$[J!W-?W7^PW\nMVVF>D]:BHC&+BG<]<2BJ4YS'94HU;U3>O'VSW^_3$J=Q1+7M9K/;;&-.A]-Q\nM*?GN[1T@?OCX7E7W^ST0H1E405$#$%-@NKV_^W_^Z??CZ71[??/V]LXY0$8P\nM,<U(?17)M=AY<BPYPTWH_&X;4QRGR=2ZT(>^)R(P*';>X(6=JU*7&!MDRC%]\nM=JB9UEJK\"B*V76LN._B87MJH<&FC5K^,\\[[O^XL`N%8=O+\":]2<\\9<O8539K\nMKK=F!V\\9]-D6AXR(;1H]IKRJ%Z_W(G3>.W+G*OJW__G7>%'*#8V80A?Z39]3\nMG..<:P9'&?64E\\5*#52E*(&AM3U:K%8MI:38#UW;9`81VH8\"S*0F\".B)VPX<\nM6JI5034&;*;8=NIMH.N\\G0&J(20IJ60EX,X7T#'.N>0ES6*\"!`J5T,32O!Q/\nMQR7G\"%A##\\1:RBQ2U,0R&%`4.\\3\\$LO+5.<H'#;=;G!=1R%DU5-<EIHK@3@,\nM0HZ<)]?N*!\"`(T5;2GTY'9^G4ZI%I5#57FVC4+9DA-6P\"F3%8E:=:3!6451R\nMCH.OS)/4V71QOLP92F6#_:;ONR\"\",<L8I8```@,QD?,>D;/44DHJM4V5U*HB\nM1L\".`Z(SY))K$-P8]D8H4E3]9K_O0C:9M0BCF-:4@]&&_6&LI0AYH]ZNW^ZW\nMVWY\\.'*LU3E)Z@BQUOET/!X.,9=^V`K5#8>OM[=>H)K,6OHA>.8T91%=IA'$\nM_MV?_CL`^+__^9^'W>X7^WM+U9-#YU[&\\6$\\2G\";FVNJ]OMOOQG3?/?E/1!8\nM*1U[FU(JLR,BH^DXQRFK435PFV'3F^MIDOPBZ62E.M=OMXJ$SC?JQ3E$5,=(\nM*)Y!R,2J@A\"WB]VU'996_U83JXM(4[]K*<Q<4DY+]$@@6F/ND')*9$`&K0BJ\nMB:FH5.^OS-B,`5RM4(J)(*(/WJF:B\"(2LSL[LPW-=&W<VK9CS?5%Y)WS1-P,\nM:P#H?0C.\"R``YE)B3/SK?_CKU]CO,[?;I#FS\\V!5J6CF`'OV9X(8D9#(<>BZ\nM;NC='[M@/^]E^,=;]WP>00I=LXP#0)NSO)1L@<8@B;8Q_IKSLBQ63:HP(!.3\nM@2GDE.*XQ!QKS6;2!BU4I6U<8$4!L319;XXY1D;:])OMI@_.,[0]]Q35&,DA\nM]4PFDG,VE:;G$H))76**:8DY2NL<F-@Q=[X/86#?L^^`O2&KD2B4ZL00T#MV\nMSA-A!5,$(ESBA*:.-#`'[YBP[34VI<C,G?==Z-BQ&BPYI9QB2LVX3$1,[)G)\nM`$2MB*HR<;$:2RY:D2ATW57?%973/,64T,`!>F00C=6D9).,8+M^<[.[)J.\\\nMI(P`IH2D:DM*<XQ36L9Y)A!6NM]?=UT_2YF6Z%P([)A=SCGEF%)\"IMU^5VK]\nM_OOOVZRM\\SZ7$OJNB'SX^/'3IT^__.KK6M+STV,IZ<W=[7Z[D10)()_I>0=`\nM*M;LR&`Z!`K]@-ZI0BU\"2MMNZ#@0>P!`DU:6\",DY]B&<MTJ!MC4NK2'\\>5;H\nMU;C]^5/:M*Z:\\]Z:61H15ZM:L]>H-D<HL5,3,X$V)06*!.S.D;]R*I>I0&.F\nMU8/Z6@\"7:H3D\"!F1B+%M2J?FB/AB%.._^\\^_^<G>'JW.$C,A>N^'T/4^].0Z\nM9&^XZ7JRLP+C@O?!@V,C1(7+#.'YIT$IP,]]YNO]\"*K4]K0F&XI*%4%\"!^<=\nML!VQ8R;`4FI)V;*!``*P(1A(KFG.R[+,<:PUF58S*276++64G`H*B%I,>5Z6\nM99ZEU(T+U[NM8P\"1FE)-27*V6E$51'KGV@9=(-IX*ZU24HII3CFF4@2J$*!#\nM\"DS>A6JDQF*DX`T\\D@,,1H$HD`O>,SE522FG-ILBU3OH'0:\"AE=2+2GG)-F[\nM,(2N[SIBSB7'4DJM(,*$8\"I23<0#AG-,M:DUK@A)<ZF5B(8N[#8#$,::2ZW>\nM^3YTO0O..:V64\\QY2<OBB+Y\\^\\75L%VF>4Q+\\^\"%$*KJDN.RQ*?'1R!+X[+?\nM7MV^N3>DY].AYBJBFZ[WWHO).(XQI_W5?NCZY\\>GE_'4;3?.NRH20@C>GX['\nMQX^?;JYW?1<^/KQ_?/CXYO[F9K\\UJ<.F`W#S,DL%[SM`2C$NTQ27N<HR;+97\nM5]?!]U(*%`WD`C$PPV7+-L:VJ1?]?VR]>X\\C29;E=U]FYDXR(C*SJKI[>D:0\nM($CZ1GI@(4UO[W0W9G<$\"-!WUNY65U5F!DE_F-E]Z`\\CF:R2B$0@$XA@>$:X\nMN5V[]YS?&0YWQ-L!Y^X;9R(BH#%_)J0Q?!X@7(2;S_@FSR\"Z]34>S8ZGCW?6\nML`$XWM#&AAB(D3B/.O/.4;K-X@.^B4F>61L2?*-!FH?9G9,$@T-O:J;*?_[;\nMG]W\"S8?O#8'\"(7RX*@,#*9\"#\"DFAE%\"8)\"S<`D5*F3@EC:A=4\\\"S./W.ZNSC\nM6O^_`NY:ZV/9/^:31\"1`?-<L(1+$N%\"+[A0`#N'FW5JK==UZ[>_7G[57`(W0\nM5O?>>MO[ONT,4FM=UNN^[]8U(1ZF<IH+$869JX49`3#>$,;DBN%X(XV'J_9:\nM>]VKZI\"`=C!`!()`\"`\"L;F9=U=0\"@)%EH*K\"DK\"@`$1KNM9MKWO=*Y).(B61\nM,\"9$`-AK6[;%QZB&D[`$1&U];5MM-0,S8GAH5S!GHD0L1`%N%#P5Y]BUJW4&\nMF'(^SE.>\"A\"V6@E@+M.4<DXIJO9>/:*V9NH_?/KNA[>/5NNE[1A`A(?3T=RO\nMRZ*]66OG\\_G]ZSNR_/X/?WC[^!'<Z]Y:ZX`QGXZMM^NZU%JU]S*5CQ\\__M?W\nMGY?UFG.:<F[;EG)Z/9UZJW__+__Y<\"A$M-<U7'.6EWF:#G/F<CY?EVT;S7XS\nM[7W?MNVZGIGY=#P=IQD=O6L*+,+(PC>P$1*1>W0S\\QA=1R)B2LPLDOC>I_S-\nM<.MVM$,<M%`63I(&<'%L9;<^Q5CJMY9F<K!;CQ$#P`$\\P\",LI33,RA'N81&.\nM!\"(\\&J</C,OHN)C9G$JXCZF:VU\"N#43N6)-.$/RGO_[S8[CQ$,<041ZM57=M\nM/;HQ<TYI2EG#;R:)(4LG',UB`;BQ#X=IBFZ:\\6>AP*\\4`X1JUDT#8,CRAND.\nMS4=;4U7')*>VVGN'$5EP'\\!LV[)>KZW5Z_K5;(]PTZ:]NT4$F)JJ7Y?ELB[=\nME)FGD@\\Y)<)]N%QN0WDDPO$S(@4/H'NA'X&M]UK;UEI7:VX&XR$L\"`0>(AD(\nM'<$0'*\"#:WAW*V8(XVVA@ZF'07BX:<W\"B4D0\"=$!6[>J&D@0`>Z#F*NN:ZW[\nMOB?#6V6!`(C#WSBJ'(4@08/HO;DJ>I0L0C0?#TEDN5S7RQ7NO:L<J%VK>U/K\nMJI]>/_SNX\\?,M+MNZ[;5/<\\3(B[+XFH3R_E\\7M9E;]OI]>6'[SZ>YL.^;M?E\nMK+T#P+:O'JZ]G\\_O.:7OO_M^!SV_OQ^G^>WT<KE>P?SE]86)WW_Y9=^VP_$P\nMY?SE\\R_A]NGU#=P33Q\"Q-[LN:VV]E#*5O->]:=MK@X\"22F:)KF&:A&0^I\"08\nM$&Z!:`Z]*P26D@E'E8=CKH#`$$B!25).F8E'+W[@0\\T5`,Q]4+2'*=`C'K;Z\nML;_I7;2-#$@P@/*(,$0X>(<:_V:4?=MC2<:D_F%6-+,D\"1#&*8:8!AA:36_[\nMI$@IA?_Z;W]YO-?S:IFG@<H@)@)$'V(Q-RI)<I(I$]'8!YAYRIGOY\\\"'YN8W\nMKT>K]\\Y#OUW$:,E\\2PCHT2/47,W5O:MU'UKYCHS`@.3J?5G.[]?WO6WNVX`&\nMN:F;$3)C0J#W;3TOUZ7NR%2F-$\\Y$9JUZ][:7?)&1'$?/Q)2/)0'*0%AK6W=\nM]V7OW<-B8/[3)#F!L&-.$[&P)&%!HO\";2^4U$PL1LV,XHA,HND:00Q8N/!2^\nMH!:MFRI*9B9D9!%B24C475OO`@`$\"M:\\FQL0(./X&.$I)T8`<S!EPEQ*(ISG\nM^7@X]-8NE\\L8E'G$6YYVLZ6UI:L%S//TP\\>WT^&PUNU\\N2S[DDN9#K.VWI<-\nM5,'[WO;S>D:*EUP^O9Q<V_G]?;?>>F?APSQO^[XNUU)*%HF,X)Z%IY0@HFM7\nM5Q(ZE>.//_Z]MCK-\\[9NP_/NJA)T/+T`TM?W\\[*MTU2FPQ3N5]O/R]6J3;F<\nMRH0!^[XU;2^O'U-.X#$4TP$(@)R3W$VT0_9I>E.BA/E#+/HXFT6$4P1$>,30\nM8<#MGZ/)/\\1IHSJ];1OW\\O+9XH>(83=>Z)\"-#\"L3$_6N`;=AX#>?NLBMGF0D\nMH?$'&($@8EP#!`3_Y5__0L@\\'O`!X3#`%UJ[FPL+IQQ,5?6\\;Y=]`^;N;H.[\nMIQX.`L1`0>$07;5I'SZP<5,.TN/SX''\\9=<&B+ED)*JMF=NP.`X;LQ,&H0/<\nMV*,0E#HE!##UUK6>E_-E?7?OA#[J]<$91B2SV/?Z=5NOV]K#TYQRSCGQ,!8:\nM$B`08\\J22T)\"<S,WLP%`SLCB#EOKUW5?M[JH!1`@$Z9)RDQSP42&;,X!\"9`#\nMQ4``,]#$:3XF$@X,C3#P\"K%;WWH5I\\1I3CE+!J#>O6JH!S$R<6)B8A9&YF;:\nMM)&C(W3PIMK!88`:QJPYHG#*@&2.X0\"0!D^\"Z,/K6^%4UZW6.N9@1\\G!O)@N\nMJAV<P#\\<#V\\O!U53[<U,(Z9I2LCUNG@W]+[V?;<]W*#M__#IT^OIN+7KLO=:\nMJR2>ILE4397'F8+B[?BBM6W+,A\\.0/2^7IWP0W[=MNU\\7MR\\E.(:UOM<#D52\nMRI,&=(NFNN][A'.B2^CE>M76,LGI<!3A=5O6;4UE3I)'49@D!9(%BJ1!H!J_\nM.=,'(%/PGM`TM!S?Q!YTFT\\,T>FM:J5;=M3]I$1X%Y2:^3A[#/4NDP\"@>T#`\nMLUKM-EJ3FU#[UZ8GSCDW-R\"\\@=L&<HF86<Q5?5@*E?_=G_[=<\\#-P\\+;MAT!\nM)24I&9E:6`=WPB]?OR[+4FL-CYS2)(D#7<TIGKF1#^G=6(3/A>Z-%ZK?5'D/\nMU%RME8B_M7;\"U:R'F?L\\(Q)J]-[;WM=EN>QU\"S0V'6MV5\"S6?=_V\\]?K$GUK\nM#3A2*2DQC[*S]]W!1W^.&1`MO&EOO;M*SE,NLP$N^WZY+-=UJZWK:&I1$I9,\nM9:(D1MQ!3\"6`+5\"=U<5AXC1+@ARC*:7N/5P1-NU[;[&Z$!W+/$^%1<Q)'0!X\nM;\\MHD87?3B9;:]N^:^U(%(F#$(21\"\"*&AL9:3P\"D'KUIZ]T-!%G#S#Y^^'`\\\nM'+9M6]8U(%+.&2$?CIO[:MZT>V]OQ^F[M]?C-)&DJNW+^_N(`_*JA3E\\W[6:\nM((+UZ_)/O_OA^P]OR[I4Q^NR[-N:1`[SC!#;NJ[KFJ?\\_:=/Z_GZRR^_G$ZG\nM-$^7=>UAI<GI]779MNMR/1Z/^[Y=SY>/KQ\\_G5YJ:[7I=#QIQ(\\__KCOV^ET\nMW#,NUVM=-O0X3'F:2[-N8=HAY<3,0)QS<4`U!V+7=N=\"^S@NYCSEG(7PJ=/N\nMXX`G(DW;G=7+#TGT&\"3>5M0H1._3Z8!GEBDBXM!RT/U^_DW@C-QJHE]!4!%O\nMO[N`&(04<Q\\+<A@I)*<\\%?Z?__E_R5,AX:9=W3@)\"3L$$!U?7Z;#8=@=II2/\nM>9HD0;=#F80XAJN_%\"?<>N.JA5)&(0,RR\"@)F`T..6<2-\"\\I@7G=]RQ24FZM\nMM;U:ZYGE-!^$&#PR2]/F;HYAZ)V\\8U=4XYA+)J10:^NZ?CZWRY5JXVX]=NM=\nMM^JU8T\"%]J6^_]*^_!==MVA*/J@_W6QK?3/KFE,Y<\"X@;(37??EZO6Q>#X=>\nMID!J5:]+6]:H.]LN!G)J%KUU\"3\\DFAD)FL<FYD*0A8I0)DP$#,YN6AB9.\\$>\nM5BD6K;OUE%/M2HE)`!D[TL7]YU[_WK8&WI-HDIVQ)^J,M;>U[I%U-S4+3A-%\nMTFY$=#P>A-3-HD<X2IE;HG/476)^.5GB7=O\\>IBF_/[+3]#JA\\.<JY20WY\\^\nM'!1EW7E7[/Z'W_WQ!\\RDL.\\5@,DQ=7RC&=?^\\_[N#A.5M].G?;-??EZ^>_OC\nM[]_^2==+=&W:JG9D_/CA]33-NNT6EB25>=I;K;V?3B=&7,_7?=TD$X)_^>67\nM+$R(ZKIK<]#CZ_'CA[FN7]I^#M35.N;TT:EO];QNGWNMB/-Q_G\"8L^E5I)ES\nMXM/IE)-0*(61-8L1P#;62R`&H@-8W=;+Y7W;5Q9*63S,P\\9T(2=)/\"\"_<&^@\nM2IJ+0>R]JSLRIYR9A(@?'10$>`1[08RV`=V<0`\"(X@&UMB3R2,Y\\G!@'QY^1\nM\"LN8EF/`:,BJ!Q+#D.?]]?_\\ZQ\"2WU!3(K=PPZ>\\L6<E*Q,/--MOK5,`'C$B\nM5H@IY32V&F)T#`L'A&966QMUIOY:3_3-\"@W``_$4MQ[FL\"'/#&[:6]VVZ[*\\\nM7]?KUO:FM6HW<VVZM[;WOFI_7]?S95G=!'!*^3C-11(%A3D'!N`\\Y2P<$=IZ\nMK2T<2IH2&\"*&1V^V;?NVU=;5W56=,:;,AWG*21@&GR#V4\"=T)F<,1A#F))`$\nMA8C(U9KI\\+]U[0`@SG/B.6<A\"K>FVMV1.$&,XPT'))&$K+W7O1*C>_1NW1P\"\nM<Y9<A)G`%0,+YXPBQ\"-Q(2=Y34>PH(AC*7,I9FJA2!BI6S++?F[GU5:E77'C\nM&?Z'WW^O6%T<4NS[U?HV21#H'FOO6^N;1Z]U18SO/KV\\O!U+DK6N!@$4JIJ8\nMII3!_<OE?5W7>9YSSH,_E%*JM0)`*GDZ'+9:][['\"&/43M$.A^EXF&IKR[I3\nM*@&R+'46]@`GJKVU6@\\YO\\X3([C,HVU\"2,)\"R*;6F]JW\\WOBNU5BT\"@?&J\\'\nMB\\S=X491X:?N($1$ZQ41A\\=U.,4J[YP,```@`$E$05355$V'$?$W3@9FUAMX\nM\">YWKPP#K3]Q`'Z#DV=FH8&BNKV)$#^$K6;&?_K;OW_>N,>$Q'V$J7QK1S[<\nM?7G8DE.B6SB?>?AHAS;3O3<-!R84=@2#Z*[=K*DJ1C=MV@?R=0C*.,G@_XX>\nM8\"\"@VOCQF.IHZ1*1('&8]K;MRW(]7];+4I>];RT:8PED#:AJN\\6N?MGJM39P\nMGW-YF8_',G%P=`-U!)JRY$0,Z$U;;=Z<2:9T2&P$`D;6O>_:6@,'(59?<\\;C\nME.9QK-01T$.K=V<<UTS\"P11,D#@C4D!7M:ZCZKB%GP9-*1VS%.9A+0T;S\\4@\nM0%1GI\"PI$5GO;=]3%G#H:JY!0J4D9E0;:<&402B0+=S4K<\\E3U3`C,(Q8BH%\nM\"\"[+9=D7.09DL!R7=NVP@>BFUUVO_]UW'\\LI88*E7:WMA$JHPH!D9@W&;@NJ\nMOBLH9_C'/_SC>;FTUBS\\>KU::\\?C\\>WM;=^WG_[^]Y+RZ^EEO2[:^F&:9:2@\nM1IQ>3H!Q/I^[MC(58HI^-JN#Y-N:[LW460V\\;9QRGJ9UV]\\_?TE,;R_'E-B\"\nM$W.6Q$@0@''+P@OYEM'Y.`&-$O,WJ0J/\"<1832.<5%5O7P3?B`W/TK,16\"0D\nMC_BD\\;'?Y&QT7V`R=&JMMU]Q7O!VOGODKXPY\"3PZ(_<99GCP__K/_]N^WT!4\nMX_\\SKKNV-GZ.:M9ZKZVVWM6TW(.+'^K->W*M=+<!U0Q\"#=?PT49OK@81`!9A\nMXZ3DCOZ-7_JP)JIJ=+VGNEBX\\QCE`8:UWNJV+)?ULFS775<-=3+V9![JW@-W\nMB\\N^+UMOW2?AESR?ICF!6-=>&QH0X,LIAUMOM>W-U1E$*`N*9`PG4_?NVKKV\nM#H&%!:0EABPLB.1@JA@H+.HZ!.L,R&,@$\\$!A6ZZ=G6[)7*ICA\"&PC0GF9,(\nM<A@TM=X[@F$X(0AB8F:(,9^4,D4@!\"%Q$B)&L];:DJ>,!J0!K;,/UJ&7Q&+\"\nM@(DX7$O)99)U6VK;YCF5:4YI:K69&H*#*KH7X-_]PS]TAY^_?)[R-*?2MTZ(\nMIN`&`$S(4HH'7);K[OK?_O&?W*WVVNM>MVVY;DG2/_SQ'TM)E\\NEM39D3V/\\\nM>S@<G&C9-A1`IF5;WB\\7!W_[^&;MW;1/4SX=3EU]75N`Y#)=WS^3I%RF7OOE\nM?\"&,T^D@PHE2R64N13@3C7F@$(G1KUKNWZ)@S!^EX#/,UWSHHF^+T,S&^&P^\nM3`_M]$/`3$3P%,$]Y@W[OJ_KBG?.Q=UO=5-RPZ\\!$0\\EC<*-O!L#(_B8V`W!\nMV6C,_N__\\G\\,]>:(!7_8&;_-#.[#]'%^G:=I7/$SV7XPW!Y8Q4!XH$>'J7>0\nMR!#1\\?;<(D1)B45&HQ:)`\"$@$MPR>KKV&*&<+()DUGO5=5NV==G;[M8!#!!B\nMCVW;MMZ:^[+OG[^>EV4+@]<YE929Q,SZ7EUO3[B<>4@S>VMJCH`BPL0M5)NU\nMO??6=4P/`H6(IR`@!F)B#`P'<$`(`9PY):`$=$PE(XE!)B:\\Y;^:NR.HVTAT\nM=#=!R(Q9B)DMHC7MJAK&=Y.W#$Q#ZZ8:C-8M`(69A1$\\L#,3$X.Z.'%@D922\nM=&^(P#@1(HM$^.&0W]Y.B.%A1?.AO,YRM\"UT-:I17%[YV,(_??</(E/;8TI'\nM\\KQ<FH=X3UTI'$TAYX/(U#0\"Y%CXPZ</@K1<+^%1]UI[/YY>WUX.*:7KY=);\nM^_#A`S,//AAECABWD[O[Y?)^N5Q>7E[0ML3,-['.3\"SN$!Y-*S@@,7AL^V[:\nM60@87J<9$,:6,\\W'7&8#J+57T^<XT6>Y)8L`HHYH6KJ=WP:@'9&>\\GU91$:,\nMPC?P]M\"XW0%EK;>'8>`^NH!GQ],]FQ.>W^&AI(D(3L+XE%9_RQJE\\!B6(XC@\nM/__KGX=U^G@\\?A.\\F<4@)PYOT;C>E%ADFLI(:\\*A>A(>[2$'?\\Q2GLOHPCQ\\\nMAG!#%Z\";X4W;>A.\\/G0\"0^V.3-VL:0N($4V`B-VBMK8MZ[9MVBJH@AF91]/6\nM]F;67-=U7Z^KJQ?)<R9&\"?=>FZH3$:?\"DMRZ=C>S;D,]\"\"FQ\"*[A34V;FHZV\nM%,MP>0N#(V.>4F%D\\('V\\`R24TY(B>4PSXF%`4O*&@:$ZCYXJLVM:7>$D7>7\nM&00A(M2CN5F`D@W2XRA/'-Q-/;QJ#'(F(#(#,93,\\R3:G!T3<D8NI83`IK6!\nME?0RP)80E@2/\\R2$NF^PI\\)3YD/TZ$OSK66GHTP^9Y;I[>W3Z?`&';>U:_4(\nMPFGJ8T2K'AXTTJ>%]_K^QS_\\X3#/;=TQT`/6K5ZV]>50WM[>EF7Y\\N5+*66>\nMY_$H3RPOQQ.X]5HQS-6^?OYLO;X<#[UKW?;#/'_\\\\$9$K=>FNZ1BZJX^F$![\nMW10,!6>20$@Y4TK(J4>H@]X+O-_$-@^HV9`]/VJZ<8^E).-,^`2M2,RLUA\\,\nMQ<>`043P?L@<S.M')'N_L>'QOOW>VOZ/E?9L`!KMC%LI.T8&X6.S862(H14W\nM_O.__@=$'+$88P.\\V9`!'H7UN(C'[/X9/O5-EHTWA^$W-5U$:VT\"&@G8VKJJ\nM$J\"'\"_,#S3;BIAY/$773\\.'!(Z)4$A.9V[+ION[KLK9ML]I1C<S%@$*1T,+7\nMNJW;YN8EY5.92>X@#`M`I)19.`#,L#95\"P<(,,F<,@?:64GM%H'`3%D2)8DP\nMP)F\"BTPE%PKLV@)<F`V)<G)\"%\"[S!(0]G(2K=R#2\\!;>P6MO6V\\*(9E+XJED\nM(G33JMK=@PF+!,((;281)G((BVC=AN[>W9$@)>0$[CUZ,&\"!--SE>^BE+XT\\\nMP3$0F%$(>MT2^<M<HK=N\"$B8B'-R:W7?()3)]4!J^OIZ.AWF,`VWP?G6#.M^\nM%8Z2L-?%?2^%\"+5%32+',A=)8>`!/?SS^YFM)TE,W%M?K@LASM.\\;QLQ'N:9\nMD%K=36TJ9=N695GF/+==>ZV'PWPZ'2-<W<)[-QX3JQ&_L^UK]RY%,A()EVGF\nM5*K%UM6!N&3^=1P:W<-&`\\)N+8T8\";9C7HTW\"R$^#1AH0&*>P6*/$5V^._)^\nMLT,BX>,LBHA,<D^&'HV?7P$!F?DA&AM;J]V?#L+R3:GVEW_[RUCK8\\V,1\\BV\nM;66:1K_H\\5`9B$%\\FB4^J*1FED4(4'OOK8''R.O;UC4#:FON7O=J9H0X3H.2\nMTK.P^\\&>N6YK-W7S@!\"1G)-#U-XNU[YM^[8L;=M0E<.2`SN8[4A4[9;.24B'\nM-&=**`,*#N8.A\"(I`-2,*.U[:[T#`B=.4R*!UNO7&KWW7KOUAH$LX\\3;F$],\nMDE-.G-R]]1T1RE26<,I),9R02^[@3;L1A!DPC3VPNVV];JU:.\">>IG*<LQ\"J\nM6FW:`9\"(YS+4`L,G,WYM%NX]B'F`I9$B9[)HZW9)D`6(@VOMS72W=M7-$Z(F\nM$9ZF/\"7NVU($?__==U-*9]V5G#*7XX3L6[VJ[@YMY2:\"<TF):<IIRLFL1>C7\nM^GY=WP^%WTY3JU?5+1<$;)3+]7P^SO/W'[^O>ZN]!]&Z[\\O77]S]AQ]^.)U.\nM/_WT4^_]=#I=K]<II1$K/3;#TV$*M7W=EKU-J20A\"`/PPVF>IWQ9+\\L:$8\"!\nMA.3NR[YTT#SG3\\=C(`(E3(DD`4N(``F8/G='?^.^?88_C%6JVL=$<11V`#!.\nMAI+X-\\+K81;W$35QQX5^PRD]`8*9&>!&/**[K^AA3GS(V08H=<BS;CHM0D'^\nMYC_\\T__U5TQB!-6T#5%SXNET!/V6;_B\\S^)]\"OD(J;D-1M4AD(D)F9\"'%IR0\nMU[T%\"0JE:4JY#`'T>-O!5QS3F#$_#?>*>X02W\"))D6FS_GFY7\"\\_FIT)WH4N\nMA&?`:\\=KH_4<^;WM7[?MO-6M&Z62#P=,LIH;-Y,SIJ^2EIP;PPY:JY9UW?:]\nM!2:B4BNMJ_?.1^C4:J\\;\"4=.Y]HNJOGEH_#/652XD5?0-@'-F\"8GBE[`3RF?\nM<B(W#F=`,`O,ZE`MU**[.Q`AA^.+I\\E9`C@BP(U,R1IJBPID@::NW9K&`%*W\nMSMW$+9DGQT3$PE`$YMS387YI\".]]V\\\"<`(\"\\190YGV;.U&W+*5Z.4V)/\"?-[\nMRD:ON1RF3.#NVK5M>]T/Y7AZG66:I8\"'A1G'+]>O(DE[K[T'RW0X`0B9O,X?\nMCXGJ=1&B3Y\\^NNOE_6N*F#\"^ZOY^O226[]X^%N3]NECKKX?C?R9=M.5I/AV.\nMZW99VRJ'\\O?WGS?S2U]4S',H&262D@_SM']9S;K,1877UM:]MJV*8\\ON1(Y.\nM!*4P\"3@US#J90G2,3JCJK>G6K#FHJ7D88/\"`<O,MEX9CC/LHC0.V&V'DQ-V[\nMNXXO(8(!K4<\"`G[BJSR%J2`)YY$V$X9N<1>NW;HOWV)&$1_3_V<;PUB3'GZS\nM(D+PO_RGOXSV(P,*DN`-YCM:M(\\'R3?XZ1.0X[D>&(SDASW_`2`MN8@(TN,=\nM;NUC%GF0CQ\\5>410(0$28@3P,`^O;;^L%]VK]>Z]>JO>FZKJF-<97K=Z6=;S\nMLFRU(7%*V3T`(-PPE!%RRID*0H:0VFO3/4!3`DY$9(#.'-HO2[TX*C-Z:(0R\nM`Y%-,H$3!`&0D!\"BF39M+WF:)6-W[#9Q8@=4ST@A:EZU;Q8M0(%,K;HWMQU0\nMB2+0+;`!:TA`(0Y3LQX$5/*4)8&'&[B#>XP[*@)I*\"^0NBHE&0'*`^N,3)@X\nM&9]R/J9$O?NV8&\\%(\"%&9P-E8:2HK?:V8Q@3GFOSK7\\\\OGS_]HD\"\"3E).K]?\nMU*WW[FH(*,1)A)G<C\"ER2L)2\\I0DAX>I041C&,WGG/-\\.+36:FNY%(6(VF:2\nMXSRCQ[)OE^6J9E4M)4Y\"F2DQ99:9<TFY*U;O([8\"B(\"\\]]JU0F9B810FR3+G\nM7)(482E8B(1)D,1O8R-BEKG,XT8=J8\"CR#*S(NE9=7VK8%GV7L=2>SX!BHA9\nMAX\"QK;K'()LESEW[L%.9V;@-F2FE+$+/<0\\/\"9L\\3=2?L9W/VC+^RW_\\%P+`\nM@('3)D#PP\"'[9*8[#/QQ-AUJ^M^\\\\-YO?6R>#]D:(([^C;GO^[[7+6`46O$(\nM6GL0[^-N$<$AB'8'\\*:]U3VZ43A81W>$`\"<(AN\"O>[TLV_NRKK5Z0\"XEI0SA\nM:&C:7)40A3,X:T?KT+VZ*6&DS$S@H,,0O/9K;3LABJ!Z8_:<V*T)',%YZ.\"9\nM&1`@S,/?\\J%(\\F[H,>>)`:VI(,D<ILVT1BA`>&CO>V_[X933Q%(2IV3(ZF21\nM(D0(M*KU2)SG<A1*KN$=PL\"Z]V;@`($$DC@ER6O?1U]<`A)Q,\"B$$[[P=$AI\nM3I+`R3J93L)3+H?Y0$R<$1G-JFDE`((0F:'JS/GCR]O$\"3PHD)'V5D?&@[8F\nM+(=Y)L2][HA^/)Y,P]V/QU/.2<UJJ\\:D9N?K1=W?/GZ0DFIO0#@Q0]-,=)SF\nMPW'N:ENK;Q\\^_OC+S_N^\"M&A)`K/0*=R*)0JP-;VK?5Z0S?8ME_?SU^41'+.\nME,$X`4]Y+E(DQ'K$D,(KJ(?J2)V5H4-[N`@>I>:0MGB`^<T>$(!`U%J'0+L)\nMB'W(1(531+L%,?EPQ(\\I$DNBQ.E&/04W\\]9:K3L1CEB+>YEZFQF.0^!8WL_5\nM\\C.'1D!O`./1B8$(,$?$VYHD&J[&,,,(`FBM/>^-W\\@Q]LW1_+S6[^VFV\\XY\nM,C0CHI1\\1SB.>0ZE).YN/@`7E)B<P,\"S<,EI?S][[]XUNGN'4+\"&IEBKU=I-\nM7412EFF:1,B[\"Y`:1A!'(A>UJ+NJ`G%.C$%!D#`PNKEJ1$@Z'HX%D04I)Q\\Y\nM;6:VOP=E9DG,@.@!2(EREB%]DIP`[@Y#(H\\`0PD6*@B.'ET!3#BFIN0`2.ZH\nM$=@CS`$A\";!$`L\",B9W\"`CJ0PRPE#!5\"PR&H=TL0`FB)-#PYC.%U-%6TCH$%\nMJG?1F`5H+HP6*1FC)#=0P'`+<,M$AE[-9B\"D]/[+YY^.__73__@_,:*U_D\\_\nM_'[5RDA6V[[76NN4R]@90BL%\"46O=5_6EY>7M]-Q7Z[>-:6T[_M/7SZ__O+3\nM'W[W^]/;:]WW3YB4P=;Z\\X]___C]=TP)G1/GDJ;/?_\\[:?_N-$5SI:Y;V]K\"\nMIY*28-^TF4='`DGHWI9M?ZWJ,VCMRWF9Y9\"Q<$+CE)@'+U\\``-T1<L[[>O'[\nM?3^2ZV]8W?C6+WV(3R)BGN>1\"/C((!ODF'D>!SQ&2!$`(0#D3L2A?LL=F\\M<\nMBN];&_RQD1SQG\"5*2'#/KOA-AM)(`;V!V_[V'_^%B=PLW`?[#\"*2B#]U.Q]+\nMZS&F?^:OC>\\:OXZ#>[;PJFJM>T3DG*>IC-UU!'0,PL58V'>P(E@W<D>(WFJM\nMV[I?MVVQNH.UZ`VL@89W5P7K\\77?U[V:^9BBY%08T%4+\"(8+<DZ%6=Q)1P\"3\nM%W`AR(@%7$S9%-WHO%M$;M7:9AB\"QE8#C04D,6=F(6!\"HD`$00Q)'9Q*P9QV\nMTPY!4S$\":V&.!!FHJ%.MY,H($^=\"6%`8A2Q4=4-OA*W0`2P$*1$SD'?U9N@!\nM#MK5PQ&9B1@EIU1R=C0.R,@%F0!'Q`$@F*M!!PH21`I'H,(\\I3FP]J9],,J,\nM@#C0FH;&R_&HK;7>/GWZ>)AG;:VDU,/\"O+<QPO3Q6TPYRZUDS814ZW8XS!_>\nM7ENK7\\Y7-T/F;KILZV&>7T\\OWG4.+#EWL_/E@BR'TPD\\*`@BMLNY+M=)Y#1-\nM*=#-\"7G^^.8137T`%[((1FS+LG8]S8>WZ51(P(\"`LF1F<KH+TP!O6OQ1K\\FW\nM$,N'H\\#=B=/=Z4K^B`\\CNEZ7UOK3'*(,6%FXCKDRDPQJ)B$AAGDW4S-U#R1@\nM%$F<2WIL?0_YVRWI[#Y+?Y[;/4:+MZ\"8O_VGOPXC<-P-C@\"0<PX`0G3S<*=Q\nMT`0PM73/Z'U^(>+#?_AXTMR:/SD!0H#?TK-'VA5`JYN9ME;W?6NMWF.2'8*T\nM=8I@=%/=VUK[WOJ&KF`-=$<?0(I0=>WZONUU3`*1\"(@P*,)[IZ;HGHB9Q0/=\nM?+`_P',XC@H30P+&_)TW1I&\"C@QRR%.BE(\"F5$Z9!`V\\$T;B$$9P-^T\\'2Q<\nM<D:FK54@S-,,-&0*',@&M-=8M[HW\",?7TRLS2B).@&#1&UG/\"`EG#+\\A#\\;5\nMA&&`FX'?W6](PI1%BF0B9X=,G%F$B)FR2`+:^Y:8YJED070%]Y0XI?(F,GQ`\nMPWJ6,25@,$P$IY>C)#HO9T?_]/'M.)>ZKYBR]JZ]#Y?K*)P.A\\/,&0%S2H2T\nM;UO)Y=.G#TQX>5_W;0N\"0+RNBW<]3O.<LK>**1G!WGL0OAY?C^7`SAS!YN\\_\nM_]SW]=.'#T2LW=[>WO(\\:X_655N8^9B[;LO2:IV(7^;YD#(&!$8J27(*8LDR\nM&J+(Z!ZMMPC/Z2;F?'3O[R]Z'AL.?<RC/_E`C3U$*1`<<>,`J7;5UK6:M0![\nMSOWMVL:)<9P_GZ<&8\\D]3F?Q9'!_2--N9\\+_\\*__PB*C8F61\\81(.3]0WB,A\nM\\+&^[>[]&*>X?G^-C(K'-[@-0T0`AW.7[QJW/J[8;V1;>O8WI908!=P+\\Y03\nM47AT#P.$MGVQOEE=O57OO=56M[[7]N6RU*W&X/8C<@0[A#FT78122@!HZDVU\nM:U7KDR1\"#W1$QW$\"]JZN[[:IMG!-%(F#01F,P%Z*4QA80S!!Q`#T`(NIS!20\nM2\"@`#1)R(D$/@[UJK;IUMUWKVENW'A02O>L>T9$\"W+Q;=CG0A,08-])!8BJ)\nM&0'\"$R=B\"@PU5>\\`0`3A>I+,@')S7D)B+B1L@=%?4GG)>4;.'A/R1)(!3[F0\nM<$H9@JR'0$J8R+#YRHQRR%O;:M\\_?OKP\\?4%*5B*Z1`:A`T:$J$DF4$&LD6(\nM$`+\"2DYS*=:AM;;7:@CAWO8]`7WW\\@:,NW=G\"J;+96E;.^89-=B5(<Y??KF>\nMS\\,X0\"RYS(1#19O#<=]ZN\"<DK=VMDOO$<IPG)@X,2HR9\\C3GDB(\\T,M@=U&D\nMQ-;M.<7DD37?S!]`HV[:36\\.J.`1K_U(M$8@`,1(\"`*!8T#HT=R;1S,#HMMX\nM\\,X$A9'E]/\\3%CB$:73+O_UF?2)^-D/QG_[V)V(R-W,?FFQS'UJ>!Y1_[.^C\nM'*5?I\\\\\\3H!ZMZL_LB+&,V!9UWW?:]W'L37\"QRJ=Y_*8<XQ\"?!RF(;#7#FZ(\nM4=N^;->M;K4W\\#6\\PXW+Y.$P*JP??_K:NJ8DTS0G84(@0'07L'F:<YD!T-R[\nMJ;F9]>,A(QFB!CJ1>:A:-=LOV+KN6>`X\"X,F]\"Q!WA(81+]!8=TQ``D3YQ24\nMD3E0`\"?)\"0FZ@]K%OBS[>:VKNAJ:HP,Y)3PD)W(IP(D9B#HE+X7FH$$@:0!0\nM2IJGF1#-^KY5\"^O6JZE#Y)*GDDM*,S#%P\"Z$F3%``HJF\"6(B*@$E8&8^L.1`\nM[.IF1)S+%([:3((2972X;C\\#13H6I[#0),0$0EBFUV&MBXB!%_%P`!\"#@5<1\nMX5S2OF]F=C@<<N3N]N5Z;F:Y9&^=+7[X^%UYF9>Z4\\[SR^G\\]=RV^OM/O_MP\nM.%G=O+5]NUZ7\\[:OJ>0\\SWOO+_DT38=Y/CGPNFRA=I@F`=2^>:^9^>7T*HDU\nM#-(8S\"=D4NUFFDHA1G-GIC!X)`H^C$',;(;#HX1([@&!/%*74X*GJ=O8NU25\nM\\4#$*:><4\\J4$J5,DE!X0D1W4[6'BT*([>G(]E#,W&2E@WG]%'48$(]T\"57E\nM?_^7/YD:!#!1>+B9]KY<K^/S1&0N$R'MRVJ]OYY>2BZ,-)<)`^8RO;V\\@@<C\nM!4&92BYE5.>`P,(L@@'\"0D@YY<-\\1\"!3)V3S<$>U4+.4RO%T8I'6^^I>ZU7U\nMZK9XV\\\"<3:+QMK1H!\"I:HS</AAK[Y^O/7_JYPS8=^,/K+&C1=D&?BV!O29AS\nM\">*UUO5R#NV'E*(W\"A<D\"42U:$H&\"?`?Z_$'S3_P]!W-LP6;BSMXI'*:YA/E\nMT@PZ(.:)<C'$50]`L]/4C3424&F&Z]K/<VH\\[9C?FU=%I\"*8L!-8@J\"\"Y<@Y\nM.9(&A!.0(4\"(:MIVJ\"J.12D9<F+:>VNN(TJ3NTK3V6&I>P9[-?L>\\),D<JK*\nM-+VAI/-N9PN;II[3[FC`DN</\\&%*AR\"J6BTZ40PP2Z*BM4\\I?WAY,?6NG`[?\nMF[QV,F9F#=A:,A,/\"@NWZ]0WK.E4\\O%0NVU+XTBSG#Z=3KW5Y;)H[V1H33$@\nM<0KH1400,I(D^NGSCU_6S[__[_^X39]7O:9I_NF\\_3_O%WE[/<YE\"GLYI@]S\nMR=8G<VCU?3DWB2WYY\\W7W;O'\\72<#_-2+WM;IQ._'E[-E9C3-#$E<&$7:,`X\nM,M,</=!O2>JAIM[<F@@*@UL+[T01WN=#9@%).\"H<0&?!7!B2`ZM!]W'\\\"T9(\nM!\"5QC@\"W>!K'`V!L=1U(%K7>>JUM][\"4!`&T-]6.\"$P($.$&X0)PDZ(3\\I__\nM]N_':7*ZO\\:`Y?7M=12^/,)8``8(8#PCA\\9M%-9#+E![>U[KCPY5(9ER'JDO\nM8P0B1%,N1+=BT'K7UEV5`+,D\"W!M8(IAVFK;V[9MV[JXU=Y:V]:V;Q%J[N=E\nM^?K^M07E7$HJ9KZONYD#H'>;IPDE&?#>;5GWUALA21(D\\)M;FH:Q8Y#O,X9C\nM0W%.X=P1%<41S97O*5D#0,L\\^`04$;75B^HJI/-$<\\:<8;.*KJ,1$N%TH_X;\nM1A>\"E$/$$2U<(0P(3(V0('CXSI@9O*NV%N8$(>2$C\\@#@P\"')\"1,R.)(J^K>\nMU1UR07!/68[S/.>4D`I087Y)$V4*]``E#`@'<T9B4;6-,TB*VK=N/6<F!J%4\nM4BY#0]^JA@=@8)@KN#-R)G$+5T\\YSX=)B$BXAS4=-X\"&NG6=3EA*'I\"RQ++N\nM>^]]+H?3Q&)\"1N?S^;(OB)XXQ@4GSH3,DK;6SOL:28AEW[NUCA$OA\\-\\F`>`\nM!86*'&'DR7(2%J'$+,SRR)1_EE-'1)K*0V;]G),Y6H^/?*%ON8`!B#@B:T=A\nM^4T@3IPD)4G$I*K#74%,SQ$2=V0&#D+^LWQG;))3*@CHX6;&__9__QL+`X[A\nM/7R3:^?DX>&.0[S#C$1)I/7^J#D?/JN!9?U5@MJ]7ITXY92%94#-3!4\"$\"!\\\nME(?:ZKXNR[:MHSW;PJQ6-!5P&IP!\"`?3OGIOV[+TOA-2U?Y^/G^]7I#*5.;3\nMZ:6D`H!@@YL5IY>3!M5NR]ZVVBP@)<DI(P_VA`6B0YB'101\"BF2!2$*<D(@E\nM$27$%!;#WYDE$2($,%)FR=(9M;\"7!\"4#H0(TQ.X:WKN;!AB$FO8`9P+RRF(Y\nM!;%']'`-C$#3BH1$(#C00!0#.]G0A\\W2(\\:L%0'-+8.(2#\"H4,>HYFK.(E,6\nM@$B$<TF9*#LD1\"&:BW`BQT[DP@BFUKL0IN+F'<E(R'UX6Z/DE*C,*1]*!KQI\nMZX$(D-\",'`0I24:D($!A2)Q<*2<@Z*9FUEOKK;FK3&T^I`CSB/EP4+/K9=OW\nM_8?3Z\\?R.H'4NE_;=EZ_!/C'#R\\2DG+.+*5,S?3K]=(\"@@DP6^]A7J;IY71*\nMTP08O:O(+))*+@3L%FZ@YJ:6LHP6QI/;\"!%1';0/2+\\@$),PR8CM&TKBE')*\nMF9`A,`)B0,7&;1P0=R%OU_%]5.U;--@-5P-PRY\"1;[I3NL<\\/5JUX_/MCA14\nM51F&Z&_5ZET0LY_KK7T$V/F&BK&(T?D=I/Z<\\V,D6$KQ^Y3B\\28`D!4E$`+<\nM@9`/<QF/A&[-W2-'SVEEV?=-`B701INGJY-'[V[J6K6OC,IL!`;NSM%[;]H#\nM>+MNUBQ1>CD>(Q7=V@C2`&3WMG?=6P^DE)(D`:8`U7!U0P<`Z&;CF>?Q`J0>\nMJ$:\"1$C@`>&<+S)TU6I=.P\"1H`!2X)3*H'JUUK:1N\"8RH2EX!PT&<-!0`.24\nMR7M*B=C\"FX=9C/A(HF`*@'`,0#,6RD)<BJ_#76EH[C?Z(6`@\"SKAA@AAC!(8\nM4F0N3*`)'<\"A-70/A\"`.LDUW04$,#\"])U'C?>^]MFF<F<W.P/`EIW[U&J%E=\nMETN@'1`X3T7#=7=4/5**B.1,'I(12-SULI^SE(PJ0F_'@Z[&'&4``\"``241!\nM5'>MUZNC,]/YZT^G0SF^?&!.`/%R.\"YY^>677SZ?3M__-Z^'X\\L?/GWWT_7G\nMS]<?UWU1##7?6RV29CQ,4RHE[=U-_5#F/AU6LZZJ&\"^GH[1TO9[7?9NF\"<R!\nM-`PZ1A!;8,\"OLND?M_ZNM\\CW9S'F([?PX6A_!!(BHJ*;V<VJ_PC8O%.1GM$0\nMS/RH!&\\`4F)\"LK\"X)_+^9CZI:H]@;!FB[3$D>:0LF1GG!&9QMT4!CWRB/JYU\nMG'K'?C@Z*\\_YO@_#8<XYY_0L\"!IMW.=%.V$NI>S[=`N%JPM$8!`X@F.8!G2\"\nMKK$C=!8CAM[;NF^U&TE^/0TKIV[+HJH8/N7T<CHV:X-`&A%\"R\"R(8&9J[3=#\nM6U4'@$;UUL9&OME/$`)A)-HA8MUW;3VE0H\"NEC&'H1LADZF`9204+F9G#A>\"\nM!-@)A0`\"!5$2)V8>D%$+\"X<0(J8DR`S!\"?Y?KMZM-XYER=*TF[M'9#(I:>]3\nMA>K^=XT9%`:8?SW=,U6%<Y'$S(P(=[O-@P=3ZK.Q'PB*(HE4>IBYV5K?RH@@\nM,,%2A-Y`MC%0$Y`#0=T,DH2G8,V!/1$A$1S2`\\4@D%(2)9P\"\"2DQ3>-.^^7]\nMVIC3K`!)J<K:AU[M*V.)\\!A+6Y9&!VK:%E1UO^LXMK9>16H2JOH8=FUUDL9<\nMC0LQH;D=VRA%;X*UUFNK1^-+JQF6H-MS_/C^T>IE:6^NUI;RY<OM^7S^?__Y\nM'__]VQ]_OMW>KNW]=BVE]&X?'T=;6]UW(5K[4DM[O[WU1^\\!`\"PBQ.4P/\\RY\nMU(M(WX^];\\>QVF4LW$0DJ82((\\%I5(C7(FV^&V>+-F,AYGM<1(AXC#&M269N\nMYM.D/CT/I_!:<'*%A1@!U8]/8VK]77H6G_S\\USM?1%35U5_F];E?F(OQ95D0\nMDA`30)!I^OSF&RX1@)\"0EF7IO8^):6,JI41$/_;Y`^;O,1W'\\Z`'PN\\TFE]^\nMJE;U.$9Z8$)ZNF*8JDKES](,@$\"M0(1E\"F%EH03.#!($(`QF<]M=#=(BQK[;\nM\\[FK!;)<:ZVUFEG?]LQ<6VVM\"6$F%DK\"%`Q`%DH,-^UC',S<I&2B1LR[N[O[\nM]1]S4Q2`*360TCT11B)C(L+)J^,SU3BQF=D`DUJ0*PNKV;99<!KDO+<7PD89\nM$1(H6!F8`6/BY((!&:!AG;S)DAQF!N#F!RH5J!4(@8J4(-PB/6VN>6:V.WT&\nM,G<;0MZJ-)9\"4HF$3J/`2\"<'BUR0*1D\"\"Y7*M:>9(E&C<.U2I53*8<?V\\?RW\nM;S?#,%.*(:5)+<!$Q.Z3!A\\`@0RE%<Q,Z\\\\8;^_75MA[-N;;=3$?]\\>#I3Y^\nMCMN;71;HU-]*O;U=KF_M[_>?_^_W_VSB(G\"]KM?U[:]_^_%??[V__]MUN*GU\nM;?^XE&^7I97=]Z'N`X!(N(?=]TW=KFUIK?5N^_'<'Y<%BX!@Y<P,BJ76ER5B\nM3B!GS4\"2LP^<)HG/>,Q7-W<.YP%F=Y/NLSQ6$4*\"SXC.XSC^MY\"RSUV?U#*#\nM569C^(IV>J6[SX]_OZ^]RJFTUGKO+_?'J\\*^CO7\\HPD.Z+U/>=H\\8/.1<Z:+\nM\\GGI?.5LSZ]1-PLGX<)UBGV866JY;_=//=%I*00`-RM\"R8*!J#J.OAV/KC^.\nM\\4@_A@XSC[3CV([>9Z[-<3PPFYEY:)52*@HG@C&&@%,8A2)E008,@,#(6D5(\nM>E<[!DQN*F'(#K4B`#HF0P*Y&V)\"N=FT@A&\"\\$1B(U&8`@02@B0+9F`//WIW\nM])ZIDQT+Q,B8@`9`G#/:EU&XF#DD`JV`%O/:@80)'D'I%F!<72B2!D0`6B%-\nM&A`4S@\"\"0B@`H4C)\"`S!'L2`X:XS<CR(`X\"XF&<&\"Q9P\"`>B0EB'/I?E0@3A\nM'8*7QI`V]OO8;NOM31'5O4$BEUI:Y8(Z(M!#8SAU+H(ELP+TU+UOC0G\"*N'2\nMRKHNPP;F,@Z__^B7M;\\1FREQOM\\NW_WG__S^OZX+?GE_^_+ERQ_?_O5O?SU^\nM_..XOS]O;XNG;7TK>BFU%N8(C7!FEKJX'L?08?[UK=PN;QL\\S&Q[WJ_<!&L&\nM##$788I7`7QUGLR,6\"(B'&#V_H$9Z):U+G,;YZ&(-$M61(`8$<T8;H\",3S]A\nM:^T5V?++;I\\II4`]16:]]QDA2D3KNKXTU?/-WUIS]QGD!NX0*\"]4\\'PDO!X>\nM('QACHC>NW\\Z_$5DW_??GQFO]O*?.#DO\\<$>J6XB,D=)0X>D(&(WK;4*LX=-\nMWZJ'#QOP\\DEE,I?*$E`29+<('S,=\\;S@(@/0'U]O[AZA2Y-2!-+,H]0U33,<\nM?>34Q9,0,8.H2I,\"@#Y4CTXDM2Y$M(,A+Y-YBB\"0E(&8V-;%IS5XDNW#.;C6\nMFG:`(`L3&W\"20&'\"6O[Z[#W3$F(J8)`I$QV`T9%*%:8J[`B')Q=L@189G`B!\nM`8X8\\T[5`:S2\\!RC)Z%7[HA'YIL3$3'BR;B4`A3+I3HX9*IK]'0*H#,7FDNS\nMA$Q@E-/X$\"A2U>\\+\"O'TU%A;&##UL?WC;W_];^N*M?1QR-$8ZJE()L\"([.ZN\nM:8Z9!<&1#_+G\\TYF%UD*DR\"MK2\"_/S^*Z;8]=7N.R^5B9L31&LNM?O_[CY_;\nM[=L?M]OM]O7K'[7^M6_Q\\^/QY[=;1%$;'EJ6:ZVUB6_#1*0RCE3]W/[QNC;7\nM[.=D`_-S_,*D0V>G-KN&.<FOM>[CEP&_?G*27MKF5SF9%455<>)I,X.\"X'/B\nMB!1\"KR[O!49R]^>^9>:R+#-GQ<Q,[#@.`GJAW^:AG3&;GO'27?.__]__'AZ0\nM.;&*I_O70Q(KR_R_E5I89+(G6@$F)+3PN;N?0U0A'D<GP*6VF:FTMJ656D26\nMUM9EF8'C2UN*B)O7I9:E!<!N`PA+*0P(ZKN9FEI_A#[(=Q_[V)^Z#]YWZ[X;\nM/(??^Z'AI41CXQ*!O8K7:I6\\4M0$4$,O>@QU*Y7*0@D:/C(L)2RZIY9\"K50B\nMX$PA%AQD+D\"-%W#6`9F59%GEJ^V!P9R<\\[)7`3'\"2VL7X+IW?>QC)\":P(__H\nM/]45,@MQE2+3,8:YMMM::RV\"&,,.C4/)DEWZL=2:8&,<X2%85KY]:7]>*26S\nM=[-P:@4D$D8ECQ:/_6<5?&OL8R/TM16UX0]]6V\\`\\-1.\"Y&@60>T][B\\M:44\nM/&+;8;B0,AT1=]@&>C8`]KT_QNB%VR+7X59:I<S&=%UK0C_L#F*E`_@PWY!Z\nM;5Z73!R>!Y!@XK<__B+M^O>_?W`N?[S]2^[T//[#X]GCR2W?OEY;XX+XMEQL\nM1QB@W;Z\\?[VNE^W^L>WW'_>__CR>[U^N[VLI:63Y_O;E_?K'_<>#NU0'ZM&2\nMOK3U5M=KO7Q]N^4>_><]5\"^M2)'\"5*G4%\"JIJF/THP_W+&TM=>W#>CHRF?O>\nM#P2HM2+`W*Y-&=B91]:[FP&`1$R$%\\T$BLR,.<[7>5BFZ4^0\"DMC0>;+>M&A\nMV[XS\\Z%Z?SR06:@,M3YT+L\\`,'/RIJ!(+5*%B_P.R?E%N0'H'JKZ^^UNGOMU\nM7?%SUU'.O=;9+O^>)/Q/T/O7)&I^II1B8&ZG)1\\`7-6[NOMQ'&1&D6&>9J_=\nM8Z;-1!CW'-W-LJ$@<W@A8`#+=$1FD@CPZ4@&(BF,$(`(.'%7%(Z!,1\\[$315\nMCTEKJ<S\"5(@D`&7\"FHF90)A#'0E%\"N+D/H$7'*EAF91+K232=1S;5E,*<Q(\"\nMD`X[CJ'JB-@FDBL0T!*<`\"LR(Q\"!^:$6D='JLD@MA`D.F4W*V[(&I&8.M4RG\nM0IBTEJ5QK=*DTAB'#U<SM#0+P5*E%6S,`I@8>/CWB\\>\"\"Q=CB%*\"'3(CL3*2\nM)!:BP&3$F?/@JMK'4IL@A1HC+ES.?P'(RC69(5%'LB!S*4##=-L?MX76M?G(\nMKIT%ERKN.K3OC_O'C^^5LEUO:RMOZZ5__-CW_>/CXW*Y?/WZ]=O[[7_^+^CC\nM>#SNC[?:KBTIW0V*+4O=MZ<30`%!X=J(6X)8$`E+JZ'63==0F0MHQB2:;\\/(\nMF:_J4XQ5UX:(#A@S>^?3UO#[V_OW@)>9692,P)0`$1/Q!2+U!5&:<NB9;\"$B\nM](D\\79:E^-DD+K+,C?KO]%`S.R]QB!$AOZ_[?M]R$N!+@_?\",0%`_[G/,LI(\nMV*!*H4+,#!A(,[CMU_XD(O@S\\N45E'$Z_#/W?EA&6^M<F\\PA+7K6P@+5[1AA\nMD>?5%DZ%=XYN8T0Z85DX>3S]C+PBYUI:J09NVI_/7>>BF6`&C(8')504=4^?\nM+Z#0-\"&E,+)0(93P\"`/\"\"17-@I!,W9(`2JF4D>D,K!(!LYF9JLKP-/*Q8D,F\nM1!H>P[P?;E.4*Q1HD3F'W(3)F1+(E1+1,P1`!(@SPH_CN7+%I`)4L21:22%&\nM*;CUD!`T@@X\")=*/X9@\\:86E2BT7!*(4)`SSQ&?D`CC]!LD8S(DU.)N[4Z0P\nM@8@D9@0AI<?8=GQ[J\\3>E8M<I!YVJ`>0\"!?B#`CMEDFUUB\"'([;'?>%V?;ML\nM'_LX#F2ZK6NF'_K<GO>/'_]8A\"Y2X'J]K<N^K!_[X^?/'U^^O+^_7?[RQY_7\nM5O?GX^?/[S^O>%O^$JB'/@GKY2(_-W>(C$P0@ZG@A&%,M=3U\\O2/C^TIEPLM\nM:THC1B%A1I&:0+UKU^DRIQC'*:<&3\\`$(B9!GMBT_/07`$)B3)KWS',\"!`0,\nM0D\\(A&D\"YL_B0I\\?,%\"\"1P0CE5)FJ!DP4=)K1/2*/R*BXSA>JPOY'8[V6NX!\nM@!#KYU[^M;J8!HN9##ZI38.XE(*9#GX.6N:FX?,O(E&M=3;H\\[$TG50BPL81\nM,[D\\5'7TCAZ-:17AC*>;J[J:AYKI]\"<,M3$&.!2JA1HF^$`\"1$DF)ZY4&N@P\nM/W8U.$<I&>$1@(&04)@3`,(#\"8%A3H.)\"HB`0$):HB<3$\\W(WY!,RT3(BC41\nM0HT@78*9*2C=S08X%83;NCPV(*!D\\70\\XUE9I)!@`CA&H\"<&8DIFS70((JZU\nMN$>FFXUPI,@_VEN?H^G(PH(\"\"L!`DB[`H&#@E]*0&@H@@X9C(`(34WI$0!5)\nMA+9>I%2$!C,RSI.9&E7F/+I1S@!JANF/I\"REC#'\"7(A])HZL\"TA)\\7.8C8+I\nM&I\"&W#@I:N&AO??]Z_M%E[+O.R)?KHNE?NS2;1S;MF^/?6G/(F5Y?[NN8V_;\nM\\?S'C[__Z[_^V]<OM[]\\^_I]__%X/+Y_\\)]?KZLO<#PD2BVMW3@.S^$:`*:'\nMI3FI$]56+@K;_7%L\\OB)M36BBM=?8A4N(N0YB5!DX6=CB331N,`36P:_;]=>\nM]<K2\"3)C/HPQ(0,A\\#/<$V!JB>=\"GY!XJE8B/4/[`$(SHR`/?Y%FB(B1`2'Y\nM?W,VG6/6UUKS9;L(XA>HXAS*9P)`K0T`G'S>5M-]%CA+>[6UOTX@XDLE,/]3\nMU<FE_/KE2Y6\"CNZN$=/.KZH4`:@ZE?G[-G2?IY<J3G>VF1%!K2*<8=YJJ8T*\nMQU2IJ\\4^QG,?)#SYXY`Q48`S-(8A&<$)!\"@0@\"8@A$62N0!`N&4ZRPFKBU1`\nM!PB`*3/*3`28MW,BP@R,\\$C@F=@5.T!D&\"94Y+6V0))2\"*<T)X(\"&#\"`$0L3\nM$%N$A9LYYJ1,\"D(@<B&YM(L&=K`Q@>1I1(U!*(6`B82(F`D%<>PSWH00PCR)\nMJ-)2*G/#O$!<&\"'<,AP8@5%@$$#Z;US`#`A8UW8<1^][Q!M`N!H4641BP7Y8\nM..1,-<J<H@R!I,;@,73W'+4Q%3J._;*T4E5$MM''&+WK?HQ'W;[6Z[75X[(\\\nMM_N/G_]X>WN[U/*7KU_^G_]:M^WCQT_Z^7PLEPM*1]&E7NM2=QW`0/B:OO\"4\nM-+6ZEE+V_7D<1^L;MR:UJ)ZQU<0N4C^3SV1YQ0;:*0&QL%ELSO<_1&(B8A(D\nM@0ZCI(`4^$S>A03\"8]O/<@7S'7X*`PI)9(A(C'$<QYQ_$E&KZTL]%A$CQZL=\nM?1U[>4U:?S\\MKS7+'%2^CE9F;ML&`#-,5U[P\"T`2F!$W\\YN<8RM$:=73SBZ7\nM4BHOU'YM^1'<G!*0.45R&*;&\"#\\&A'\\^+1`%U6`?.L8(<\"E0BC,IDB)Y$2F%\nMB`$QW57=/`,%D</`/2S2Y^T+8X:/.U'$S\")/3H(4T)R09C2(P(QPH=D7N(&E\nM``*,</#(&19I!#E-+,P\"F3DFQ1GBA$L\",N0R_[P4TR>2`T=B!@5*)B`)7M?;\nM_;F-X]#A0@6%B23-?C[N;;E(K0U2QQ&Z1P13L3$2HS`GAFI'2@?S;DCS0H_,\nM#)B93A!21-7ZB%:YUD;D&0=$$'Z:3.>7SM8K,R%JJ:&X]V,[]L+G/:+66HNY\nMQ1@`D<2\"S(0:80)>2XDEW.SHV[K<EFO=CDTSD0N5-6'?U?<QNIHY9.\\(480<\nM_./Y\\;C__'K[X]OUNM3+X_[]Q\\?]'Q_WMR]?EP4PH8@(,2,68I;*Q%6X%2ER\nMOJS7]3+V+4Q3!X,+`Y](A%#K$8%2P`A16RD1,<S43</C$P6QUO9/\\XL7R3LG\nM#B,A?POV@\\C,8*3,@$A#3`]@UH(`0+.7C$@B^922SOO7[_\"761L_500@+__1\nM[[[X?Y*<_JY':ZV%^1RN$(\"J0B1,2S[`\"_$TUXPB\\N/^,<_;N0J/$_U?JP`3\nM)2/FR&&S\\W1?B&-8N!)@$8G@;D!$CWTFQQLQ)'C\"043(!D#,9>;/N.,881'`\nMP@4\"PDU51V9.^A5&>%J`)4.\".Z\"F$X=P-0WX+`N1&:GI4:@`L:&3X,PAR$R1\nM\"BRB`0[``,)`:.F[1>]*-*_@&)9A`SP$VP6A!XR94X<Q4M-B_H/=<@4@PLH<\nMA((@\"!1)V]Z!!4N;+/P40A\"IY=YW=E]+38K#E0!0\\!C'E0MP,@;-.NTV!D`6\nM)%,'-0E!@4PT`B6$Q!/(!X3SIC[;K\\,Z\".YV?#P_OKU_H8*6ZJ'(-M6GQ$@X\nM`S02PF:4=*OE2.O]N*QORW7!G_C8E4HIZQMNVV'^./2MVT5S['MP,G,I\\O'Q\nM\\?/GS]OR]N7M[6UY_QO\\U['O'_=M/]3?82*QJBP,!Z9R0&9`**1BCL:+9]Z6\nMB[;UL=W[OMGHJ<.DU/J&B./0<(7(#(P(19AI9,$(1$D0.!TB]IDO/<65F!@$\nM5(AG`P4>&2?)&Q&_O;V?@KB9Q:L&Z1XY\\FP#BP@@UDP](5'Q&EN^]OCS++PH\nM.+^PC:]8F'G8MN<V2_E)!_C4I\"^ESI(Z85`VIM^4=.C+GC\\7-4346J,B^[[/\nMT>B+JS%+)20!G[]0J#(SUDJCJ^GG:\"?-QABCC]Z[SK4/8B!ZI\"80211BJ5`J\nM(]&<(`]5#[@N1=UZ.*`A`@M5P(#4,1SF=YDC+P(@)R^E1L09USN?.\\ST:1M-\nM$D)4'9A9YH7[F*T+@8-%=+-A/C(+Q<P0!W<W]:X5B+-58L!,8@4W=_6!$)@`\nM_E3/4IHPIB>1B\"P<YC$2>:AV<\\^Y%.6`+$W`4J:$_'`NW-:2;'3.U9(9)V/K\nMZ!XNUQLDH,53'9`0L@N[,\"A<<68MP!G8F`@>$6JMU*'VW+?W]W=A<3,+SQC$\nMQ$$SS@`!$R)!\"0C\"6!:A-!L.7FN30H\\/O;3:UE662W\\^]N[//M8Q;N&REE)X\nM/JD?CX_XR[]=+Y=U?:O4NA_[T#XL',(AS-9V97R`#XT1J:/OKD<4%KH22I2E\nMLKC:V';=CUY:#Q,1X3JAUW1.43A-,W,BJKF49)1,S^\"`WU-EY@>(N%`]N[](\nM0,B,F=0PCH.9\"7#*JD]\".3,`SOT[,]/I07%513J)9_,H3NS-NJZ?;V9D9OX_\nM_Z__(SY#2Y;6EM8@4\\>8OOCU>FE+(YZ8,+'P9*(B5,01-,,)H7`P,8.Y3W!]\nM9-X?CVW?$X\"X(%+OAYM=+VLMQ54S%*L89#?;CF'#(:,`\"L;N/^_/?S`,B/UX\nMWL?6K?O\"%PYBK_O/,1YYE=NU7M/=`R1+E0M%2^=P'F,,'2)Y*14<5$U(KLL;\nM!HW#(.CY,1A*E<98,5B`&DHE60JV6B\"B(%642O)E>2O`W(%&8G>*O\"WULE0$\nMM;$#)Y=D241#-\")/[ZF'-E8(=5=S]0!`*;66!M@)D)((\"(,3*6OU2[U*+84+\nM\"WJPY5MI7]:E2J&05FMA4CO4>Y;,2AVB)9B'$P6A92PL%Z0Z'\":NXU0D42(X\nMA&546:_7;XBK&@7*8;[IR%I)F@,@3K\\(FSDFKLLE>K^^W=1].WI;UF59T9*!\nM,@L\"`3B`(BHS05`H`R)\"#8,$7)=KK05ACFIB>SP;RT7$]T/W)Z5?EW:[?O6]\nMZ^,A%<M[41@-\\H]:OW^4/H:&`=+MZ^V/KU\\+`^:X%K'CL.X6F%BIK;(L*>3:\nM00`*:*8E()9:ED463RTL`>S`)$NR.*%+1H1C)D[2(5>6@E0`,7-FYA+,,'*L\nM(FM;\\K\",F.VPNH6@+`T+`Y&&JQDAMMK66BG!U09X6YH4,;?,D\"*3V$1<_ID1\nMGCG%GI?+98Y)Y?=[X-STS\\_,!Y4]_/0F?\\IB/G%,9^+\\=&1E)GBLZSH_/S<S\nMIS0N<9Y^J756U'5=`2#H''3,\"VL%K(6Y7B#76%<_[OL89L:%:E;UW+0_CGVH\nM<J'E4KB1[FC#>&VM5):J[M:[66`F2YU$F5>#'9]/NXD`0I(S*^OS)E`#\"T`!\nMR<BIRR'4J2^%3P2S16*:`R!+)LZIMD%$YHRC\"D93S4#\\?,A%(C(%AK`$`!(X\nM)$:&FKE)!$]6F\",/SQ%(YC',C+!B`B9P`D6B1X;/P+BP0,SIWE&%L6180$%(\nM-HV<7'=`A,E!B6&ZE/J+(0WHEHX^`]_=_?4B1(1(/8[AEH32N^KP0CRZU74!\nM2$2*F/O8`ND6$<!`A0C=Q[`.`T5FXVL`CCCI7HNJFD(_?-N.2N\")XQA//<SL\nM*+YQ_^,OW_[C[VO\\L/N]?__[C\\>?CVM9J1`1+<NR&AW[Z#H1!\"$B!JF1S(2E\nM$I=][,]M8Y%Z7>>-`@,<YJOF@;%\\[@GFUN[UQNB]_\\HS^VV\"`D*,.,-?9B>9\nMYH!X+0M(`X!7O+TP<ZOHIQ5IBF->>!ZS<[PR!7&_ZT/GEJ*U)N]?O_R^J8\\(\nM+E*9(7+>Z\\XU/9Z3G$E&>ZTKIC=DC,'@OS@T[LNR`,\"R+-]_?)C9NJZME2F<\nM79:5B'1N+1-L:-^?NW8)XPSU#[,1[NZ:Z2(RW(YM>XSC/IX=1BT+%`AP))(Z\nM$<,+B^B^FYD-A:1\"9U.-\"7.2B3G;X*S,@0\"1!,`$0H5DVDFB5F$`LW3W\">4\"\nM2,L9?8,1,=P`8`8H.40@1F9WFW'D!N$(A`(8[F`Q\\Q7!TM1'$2)$8*PO7W^\"\nM)!8'2*(Y[V!92000`GBI(NP15IJ!`XP$B(C2KH7BRNM\"U6T((%&E18YCFZZV\nMB`1(.HTCJ*K]T,I!%=PU,X'8+(3\\-14_`S'GRHQJ/Q19F'G?=\"OCR^5M-FY$\nME.B>`,G,`L!PSJD*\"`'$T&['?5G;-,_TW2!&:^OM<M/#PF)_C*UUN2ZE+EW-\nM1IC%&+Y7*$MI:Q6N0[>/[Q_?O]^_O?V1RTQ0IUH%#WUMO5MKIJ.[\"8J4AJ7V\nM^X<?#UZD7E<\")\").).(48B\"@;/`KM6$VAWC\"T0=_.H-_!Y=U42*BG-MDC@@8\nMAHC'>,X;W,A0U6$V.?&-Y;4)?]G](F(BU^V,D8%Y:D3D?K]/B6EK3>[W^]S:\nMO3AM<[+B:K76@D!$JFK]F-?%M=;Y32-B(CLBDP`>]\\WMY+41$0(#`\"0QEVET\nM9\"J(JFK[OC-S6U='+H4NE\\M2,+7$L?G8]X\\GQL`(8B`&!P]P2QOAFI82*;;K\nM$R\"(<+U<&S1F3D_7\"+4S^`VQLDP#2_IT#@4E$\\+A!@\"!`)12A&<:*Q/YF`B>\nMS!Z`(DRU(%-L3Z)T`(>,Q(`4F$1*\"@0S,T]U=\\@99,1$-M>>AZ:Y,`M*\\%QQ\nMG\"J-`M20@:A)PY#,=)]B;\\%2$RE+F1*61!3BQN+A&EX2S8(=!8D<?(1!'`A<\nMJ(]H\"Q>>Q(,Q`4,BQ2U4W<(M+5T1LI)8Q&2$`<#\\8`H>/F6+60H3BYKO1[\\M\nMUU*J>X@41'*?VU,F!.$ZTBVH)\";@A/]8D`!>+FW?MZ&'2&VM+<ME>Q[;<SR7\nMY](*7UBR%JANL>_^;+G9HQ3^\\O[.C[`>]Y^/[<]C7=?J1U+Y#$DX::(>1J68\nM&25Q+659DF6DJA_@TP0+`$!G[!X\"P&LY_HK6G,..R^7RFH.\\D,&(:`2,$.X<\nM4%BFAVLJ6\"@2:TT\"BU\"(1\"``Z/VE.WUM(,PL\"?])\\#V__XM-`0#R`J3^+@E_\nM#5*YR%2%SZ^>*9\"OI:*JO@HC$<U%_+(LT^7TTLV(2\":Z>ZLK(H8Y(NU;-S/U\nMF.5..-6/KGYMU30A%(IT@GX<GLZ-@3`QB)/8(SMX2*V%6$@PL@_MO4<`<YG(\nM>D)!8.;($Z2,B)@Q]P>)\"$12B%D()]ZLB@D`820/=!=,B5H%.\\R_%`&!`,`6\nM9)JRT`Q-M_`QBV&$NO?#(\\+UG#ZS`!?B0GY&1X*'FQEX$!$#=LJT5->P+!S=\nMB($S\\S:(^-S$@D=&@#N8CXB:[&D.,,88/@I(68KJ%,17HAE,JB+2&D>*>IJ9\nM<88I(X4(!)T9)I%F-N-*<!IS`&;7-&6),VNQE3K&F%S`3P>XSQN.AH6:35`N\nM<T)\"9$3<WM[VY_']^X\\C]UHO2VTV?/1QO]^E$;4;<UFX=#L>CZVL!S5N:[U<\nM+MJ'^;$]^V/?VK[^>5V960J44DJU2#_ZOFW;UV]_9\")3:[6]7?UC_?G<COUX\nMN%JH.=KIG5,(B*2\\M.M<ZXG(W'7/#<%I7#HYB+\\F*.UVR4PW<T\\L,*%K@'1=\nM5V0F840HK8;AS*(<^_$[<?35UM92B'BN_$1HC-&/WL=^N5R(ES&&NTM;EW,;\nM040(Z1\"0Q^@\"]%*9,;-`3D'=7&XB\"Q1X?0&6:C9>[HKYR/DL^I-UY1:X++*T\nMBU$7D0KEP*Z^1TQI9R`E0.@X7'N,8^9G#^LSXB\\S,QS0A*?2\"QD!AO'*`#CC\nM=2&R$`><61H144B0V3TCS\"#20:1&3.3AI[1@)A(\"N`8*]QC#+<(V&TLL\":!@\nMD9\")'=M9N```(`!)1$%40`Q)TR'#-EV&B$G@D`D1``XV[!/@&`$^_SH$]C@3\nM+=75PC-S!NLR%@?W81H.F*&&Z(A\\$0A(!DQ$%\"8C2F+FAE!(4\"@3HY'W%$HN\nM-#0=W=&GPR(B-4S#$,D]#ST`.<,J5U++0(Q!1.!A9CJ?4ZTQ,PEE9#>EH%($\nM&,UT,,\\:.>_&`!$Y$I`%R2/<2(D*%A\"#@$!TKFV]7&[?OW]LVP8@<_+=NP[5\nM8]3#VX5Y+?4@N9O>>__+MZ]7O7S_&X<Z!EF/[;FOE_WK\\H;$B*4MY9)H<*H]\nM!2FQ%\"X++W2!K]=W/7X\\'S_ZVV$7%0Z\"N?-!0R\"&%XA^#DA>]Z99%2=F::J%\nMYMP2(C.<_)<!'YD\"8'=-&SE.TP9F0N0,&INUKI0RQROG=H!Y^JI^'[Y,&L/+\nM_B\\?'Q^_<(B?`$)WOZW7*?`X56R?I79BG.8/>_D/B2@3^>R%0M7G8\"(3VM)F\nMC=4^GD\\OA0EI#`NW83J.KMH'1LF>XSE&[[W;L?EX,.6\\%IK9?;N[&D06!,%@\nM\"$)>F\"?^<2H'SKL?LB`22PP#3RS$7#(-B\"I7]<'2+#3\")C*\"/MN)TD-#)9<5\nM&#\"'FVM/EI$.9[XJ6D!F)%!.0C$1Y!1:P!3S!@#SS+>)Q$P+P/!,\"`TD023\"\nM!`*FC/,%7YP\"`(`+@I`0,@`)\"]>2$)E`(!Q!P(C,!,T<*(S=,@\\V(V-,EJ5.\nMP?0X6JLBK);FHP^L<$GT,08F,8&EI6<&EP9S!.6>'D%DA:LPF\\VPD,CTHS\\*\nM9V-@BBK%HZ=Y@B/%[+``H)!%!`5QSB`W(A3)ZL;K<FOU>NP_CV.KM4I!8K=T\nM`^VZH4(+J:7$&!_]^1X'S<46,`*9QM['WH_C.#@I>+KMP-40LU8!#TY,#<,L\nM*+?K=7NTX_GWL1_:1RO!4D0*\"A=,*CB.1.9Y24)`2&0BIN(V?=)9RR)%\"$78\nMF-GZEIE0\"Q'-9W0@N_NA_>SOD*J46NM2\"R(:Y&P2EV4AHKJTN1M4U0B?!'HB\nM!$AFJK4\\G\\^7`$\"F2?$5ESM;U=E)SA[U]%70*9VIM<Y#/*>FL]S-U<?\\D>-S\nMO?&*-)Q'7\\<PL]OMNEZOJCHWA,Q\\'.2^HR)0%L;WM\\LS_;[_''U7U2D1<W=3\nM940F)C`;7GE9I\"SM$C.-X,S]-8`S/-7`?F^M$9D%(\"?J3A)SKL=>\":4K4DE8\nMI23+6JRK#=6EMO]ZWHD8F&<PR,P,(4(?\"LSS`--D9R=0@H#\\GB*>2%*HU&J?\nM(75AJ*IH:!EF1@<1D'BB0V4B(`\"J*(;GD#;2U=TR/$+#U\\*!%)2:;APN24)%\nM*(OTWGL_I,RI\"JKJ&\"E\\00HS9P04\"F`/2$]:RV?8\\^08G>/N?3^(N2U-59_/\nM.X9?6XU@YAIA$98YB;:0X)E9*!6#$\"G!'-``B02*CBBRM+9F_E!5$2(.XC#O\nMZL?>48<!-7!4'\\<&/W[\\XUK?:JUK7=T](WKOP\\W=,2(I9],XAX69B1YI9*8P\nM]F4M:VF79;T7_A4L0<$>21B88-\"[ONR\"OX>FO-[A$U(Z9X>EE,;%,[C()/P[\nMS?U,KI=;J.D8KC;&2/=@$>)!^>+9S-&+N^_[_K*_O[:1\\X#,\\GBR;?['O_\\/\nM2$#`C,29D$XD++^2*TM!G)/WO*R7PE*DX.<0=F;3)^3H??XK3JC^J[=VRH0$\nMA+8NZ[HFX!B:\"4>&9FR]#^MKE<*A?=.^Z3YBJ\"1B#]T\\.YN6M!J[%FB-KFO]\nMNK0OS(LG:T:(/\\?SV>\\>G=B+>!$74DA/,HVA/@(C(0(,,)DQ<3@.+$EB@0ID\nMQ!%^O7=5(%G>B\"N5E;A^?&R:M99+X<4#IB`APLR&\\,ER/L90/S'55$0.6%*@\nM*W5](WGG>@.^(:,=%Z0%\"0/<,U!(UI26Z^4@/,(/LT186JV5P/6Y/5J5*N#>\nMU8]ANX:RY$UP^-@]'\"61Q+&:U6&C-4<$QC'L<>PN`M=%\"_7C65IA:1[H,2LM\nMJMMZ>0<NW;);)I`%&`));70E6/:'[P]#7)@O*1=>WZEPHAB0S_@]9`+*`$B;\nM\\+$8!J[DAMYC[`O]6:!$S_WG$8J5+IB-HNU&H-2B79<O1O+]&-V`@K]^^9<W\nMNBRP_'P\\?ECOG`+\\+]=O[]=_699W-3#/Q][5P9';[>M%JH8K!ETX.!T4@?J1\nMT=X#<EGD;1&P;N/`1'\"B2_$T=9UL#BXTH[]T=+.!&3)EQF$$60L/T\\@TLSY&\nM1E`\"(S4IQW$P46NM+0T+:T9//]+\\K*VB[O?G\\^.Q'4,]`3->\\Y27=7[?]V59\nMUG6=M[9?*M)93UZ7U->8]=6.GBULPNMPGX?P<](],1DOH]0G[:(DYJR</'4Y\nMZ9DY^LC,<>QA8P#5L'2'3`>W=(\\P],0(QO!PUZG'Q$D6EXEEY%KK[IM#Y@G\"\nM$?XDS!&1)!/$<`=/(B'/B'1+5;<`2@!@F/;`D$?J0=%CC/X,!$+QC)VS#W5(\nM9C;WJ2PA9D3<O9]R>XA$P$^CR:XN*6H]TA:N7&@(IH!$969`A$BT0'4,D'FK\nMB!0DJ:V5@D2>8)E?E]M;71\"1*)`R*2`R$H_]2*#\"E$\"3^.Y()N4RTC4KX=I6\nMJF@9NFEWURK,\"&CACH#!(*44XOO]9RWE7)'-/#$U,UM;0R0+]B`DS'35WOM>\nM@$6D$-.G!R^GE!*!4)\"0&##/+8A9C%`$DB;K^P7VW<`P42J+OR:3=G*TF,US\nMC!Y<B4(*P1YF9C[<%0\"0@8(P7`A*%6;&\\%H7#L`(IDH$%NP.9G'8,\\)NXW*#\nMRTSV\"L+(&.,TRIZCBE?*+8>(N-JV;2=19JX#YAC6'8B699ESC5F$)VMT$J)>\nM$8BSA72WV9$BGJ[Y2K]BYV=KQLQS@3<K'#/+[7:;M?(5UOD:L+XR)V;1/,_5\nMG&A/*29BP\"=1Q\\YYZZ_T^3-^\\%,/$)%$TP.5F8QI;IB3ZX!S<3='P)ZAJ9JA\nM!!YA[H>.H<J\"!,7\"P^\",B2N23FK1U8FHE39?05?'3Z(.F`-`(48$'T:E`1!F\nMX&P.D2`(0N#B7,C\"GV#F@>@`H`6]FZFC(0\"<IQV2B8>>N6ZGM7)FI:M[Y4`P\nM2RA$:\\6U)4$0D$UF85(XF56/0MP@P4R/`]1**:4P$@.`\"%^R+E@3W(``)>9]\nM.]UE6:FRM`#9[-B1@W!(69,`D#Q7DK6U?=\\?^X:9N4\"\"`@B@F;I2\"$-A]NY.\nMU*1DNO8QM`N_51;S0T00G2@2(S+5<#^0LBVU0:T,F)3H*,G3=YKT:3^'LT^D\nMS.X='$\"@7EN/\\=B>`##W`:Y]C#$&)T*F(Z*9/K>?;R)+J:TQDJL=O>/1'X<>\nM:[XA)00P<T4A!#<3KDAI=CJYN0%%?OW2__/^&*:/[=E:J761LK((`I);)LP#\nM,(<HV[8]CN,DA98RGZ')/#O&.>K$S\\.*B'.LO5Y6`.@)04Y$:UOFE`43\"!`0\nMB%E$\"&56J:DY_?UF-*OB/&CST,EK<S)+W^LY\\:)BV*?=]N1&]3$7:^<Z$O+%\nM/GS-FL[KI@@SCRD1R$QW1II/7`\"06CR!`(GF?<O\"W+5'NH:.5\"4/B@#75-4!\nM`B@,Y^8P(3D0DA*1S>(86J5$(P8.UZ%>`9!)1):$1%[*DA[#T]0!D*FR5\"*Q\nMP$AT0ZZ#B$AUF!/`:9X#).;AEI-$`FEFX4!$-4&(&2`Q*))CSFC22XV(),*(\nM&7@&Z>EAD12)&.DAD$*TEK*V9D'F=HP12\"FA:<Q<RZ)''A&0,:.?`<21+)WJ\nM0D`E$1(3V%@4<T^@!;'(<`<R15:*)\\64!!-F8T)B17/58+3D@C-8!@'$\\CC7\nML>G[L=5:+=Q<D0@1S%1UC&GX#O8$,@B)J8A8BF2$II-GID.<ACU+<PUW!TI#\nMW_KF$509`%1')S\\.3)S>21AZW._^I;;U^JTMP@(^>A^Y[??G_KS8+8DG(WEV\nM#GKL$9%)IN$QH&+CNB[X]8O_PT;8V,>^;16`DJND!9Q7P5GB^#.C=HI/F'DR\nM(GY-^Q%/#Y!((I[V_/\"(L(QY-*[7ZPNP-+O*>9[G$7@-8U^YG:^MP6O#]Q)S\nMRSQR+_[,<1SS_+Q6*/./YCE\\69S@TUTQI^T3O/BR.[UT`[76&!UB_OJ>&!#G\nM=T@=ICW#)`$@72U&M[VG*X1E>D`HN*:F*9@V*2*S89ZZR[)4J2(',B:F)Q)0\nM(DP(08\"G3Q\"(BR`P(T5&>MSO3T22NK!4(L*$\\`\"`?.QS&EP2,],_O9Y&R3&U\nMP(`1F>YJ@7C#6@H6H/1T=4Z01,#RL(Q(TX`,UI#A4^A.5::<BA*8\"!%*H:6R\nM`V]/1(B9S63JA@R!@24P$\\$(@[D#'@2'!6X[)S3D)JTA.\\O#=1SZ$%MK(\\$!\nM26$A\"$L!1$+-0`!BQGC9(($QPW4$8:UE75<F0(\"/GS]K@5]I7A/Y-7LBR,@T\nM=\\C,\"8D\\\"=.\"B`3BZ92\"G'.^#QPV0<ZAF>:I:CJT$IYF&O.1`\"D40>Z^[7W;\nMWKZLMSD@F:/X;=N>Q_.+#6Z-2BG!3#PL,EQ5220B(A034*:?+!GF'`>(480$\nMP<V.OB>>.`CMXSD&(MYNMS^__?'CXV=$=.NOYG`>C-EMO@+-B$@(`6#?=R-J\nMK7&M[GH\\MWD(YVPK`G(.?OQ\\&0/]I1W]W3<\\1:1GN7IYZE\\WP_DD>#P>Z[I.\nM4_R+IHJ(4]TSAZ4QJ=JS_@I^AO+*_!GS^\\P/9+:O\"<!`1*V4^\\\\?:,$!18C1\nM`=*1$!)5R1W/7]A\"-4TI/\"`2)5\"9D9&+D!!#N\"1+<L52L`@()TIRH^HV,C-F\nM><(T,YMBU,GF$&!)8B-,3,U,ME150JRUY4RKG/T)Y%2N8&*<ZC>>-`#$2/S,\nM`/ITG4$`(3820%RD%):(Z0<MA`0826@03!@41N$6GB/`\"9,`.1,L``+?*DC)\nMM$P)BB`.)$=D!H\\(=)8H4M\"*[>%;9\\P:<BVEL13BQ\"PUU1V0(@*2&(OFH`3!\nM*L(588RQ[QO$(H4NRQH1X]B7]B92P)W0@*:E9-I-TC(PXU0.`*`C1G!@*2=3\nM`BDIP5TM##^O]A#&@D4H',P&X^RX(R*`)CG``$*''\\<X_G^NWFRWD:3+UEQ[\nM,'-W4I%3#<`!^OU?K\"\\:Z*XZ?V9(I+O9GOK\"*&;6B2LA``V4:&Y[6.M;UZPB\nM$1%NE79=US5/BRGH(J1-HJ`,(4Q[WOJ/OG$D?Z=Q041Z$Q@RO*;3GJCB6DL8\nM6F7GBJ!X7X.]]^?S&>9K4M)$5C?XTDZ[@WG;MM;:4FZNYG\"5?JLY?.\\&,W-%\nM-2W%V$O]0GCCO==5O.ZG?T:%ZAM!L\\[,ON_OR.]WBN*Z`_^'4YZ_(Z#P??O]\nM8\\#SS^U%F*_GL'[_[E>9VT4-1%1\"0EE51154@!M7\"C&0&1;FG-&JAF<54$S@\nMUMK&*LOT=P4Y>FFGUDNJ2HHW:E-SJ5@B:XV3\".BMZ>I1A5D\"[*A@7>7Q_?HT\nM$6[''A%$5A73G-_/L(6J%$Y\"YC+2!2J2L_JK/<Z,D=Q;8]U9BHXMNZ1E%O=D\nM(B0A44[EG$Q.[.%QQ?3R995N\"\\P`86@'1PK\"D=1*-I+BSALCG-)2C$5V:O\"^\nM=2J8/DUVZGN31!:\\@,PHI&4JDS;&AHI,3A/5HE7I5/B,O7551DJE+#0X46\"1\nM&)+#_UXNO_$J2>`J\\R0*(DXB3@202RCW_%)51055(^Q-8XZR.:JHLIC<C80C\nM<T9&!+&,8>=S6`1!6MMH5CB&7><\\N6_*G)X!KH(RQOPZ[KNH((L%PJ3$^]Y_\nMO7]\\SNES7E^?C?A&HGK;1'E?Z$K[IHE21IR/A^Z;B`CQ&Y3X%GN]-NS?M:5G\nMF-G6^JMX%%&6^W%;9^RZKB8*><,E7C+4*/L_0@17D;%V(:^58WZS]9>_8:U*\nMW'UIE-YZUK?W=U]!A7B5U%%_2T_>@1;K?Y[/Y^/Q6)WABC=<%[:OLTHOR;@#\nML!EC^)AV#8ID0*AX,372*4N(#Q5F,'-C.5K?M1'*P_T:.8VJ%(2L\\H`GLK1I\nMV%QWU'H1VAHW?EY>B(B9QBR9E*S%3.;U]-FY[\\K%B(Q(=J$>4)8BF%EF*7.Q\nM)&@H555D@D&J)&SN8]C,E81'*C04@9AE[O./$@8E+])9!J5+&B<I(%R4F4Z5\nM#&&0%K.E$L@C/4#5@1U-&$^R1$2,C**(76[WMG_P_JCS_'J,,5IK06R5LWP@\nMKK/2Y[$E2@B\\?&Y!N6TXCN-^OV?8U]>7^>C<F7E.[SU!A%KX%:ZBB!IN8B(B\nM8%'B%XD<E9$>7.F%H`(S555&C:_/CX\\/$1&4H(3!5.'SLNC*#A\"(2ZQR>+I'\nMVX_P&F/ZBB9F)5:`+YMC#&UG@N9,7WM98(S3_/)B<PZV$H5PEM_[?HEFCC\"W\nM,7-8(JC^SF-:)^T](+7*?=_7JO0\\3_X>6KX--ZLGO*[K')>9G?2BPBR<Z1H$\nMGN>YXGZ/X[;L$7/Z:UN>N;J\\MQ)F-82KQEQG31LT5CI*XOSYO(CV??^/W_[]\nM>EYF5E=(EV/;F3G\"(D)`&=F8&8Q$9ZVL\\_'$!B)BJ8*!]#B.UC_ZQH6E*1W3\nMGLA2%0\"?/Z^:U%7OC3B&UW7Z\\\\JGM?#`G&D1;@1JN6,(/?G*,SO3)BG,@N)D\nME)3+E,_3GX?V;1?EFA6.64I/_L&8]Q@]755=^,G\\+/__3\"@W`G923<SKV;7]\nM\\<=O?SZN>]VT&I^557?JFTKF_(M=N5H7;%O:G.Z%(*&V0L2UO_;&5ZHK)QOB\nMNJR)]%W5()QW*#?)3:Z1TU%T8]IEVIV//]J/ZW;5L,\\Q$1<@_7:+LD_[ZS?Z\nM,2%H).7;C\"-RDSH%%OL3ZJ(,86E=>B@FY?DU\\Z-]NGW.KU^/7X]VM$O4?..X\nMFAC17V&IHD6;BQ9YZ:RFR4V.FVP5SI,:<[M16+#JL=W/:[IAWV^M-<1?L*A6\nMTE1(T[(!FW:5+#-0ZJ90NFH\\<YKDS7Y4[5)*87[99KWH/FF2F#!EE@<:<\\Y)\nM9G?59,\\^O^@A(LHA/CWSX;E?;M=H]ZKQJ,6IZK>O\\TO:]KQFWSZ(X.!`#H+>\nM-SHO!E'3ZC+(-<=1'27_^OJO?=^/XRZ-,^$SQK`8U\\I[>>LKWO%I49.H,2,S\nM(YTE[[=.M)4R%[0HW,-.O1URZW;Z*1%TS8A.HAL8Y>,YSI]7I\\ST<`2V;3N.\nM@UG-K&U25;)M[J)O#/![PKG*5F7=MFVER&:]+D95_=>__GK3[-?`=X$67?P]\nM?5HSGI54L3+D]MO&`ALSPLULH6!`Q8*&`AC%!&761\"0B,\\J=PCE#(B0CO4J8\nM1)8Q=KDC#$YH\"8V2#+;$'/F\\'$`>9\\8,&DDDJ$B9#O/\\_?@E(GP.A$=%A9>2\nM5_SR^[T?8AG,U+C16G7$;E].3IS+6:98[3^BQ4NY[EF(RDAD<M&V;6Z#*I;1\nMK*DH@:E&^()4>-(:SCC%F>/^+Y:OV\\V)//?:-]](U#,_15!*S`3G]%59&SPU\nM&!!F)6E@21`A*54U\"9Z12YI,O/(D\":Y<F=,MA:BI*-\"*>F;/;%4*D$CQ:Z/S\nM2\\(<%\"\"J-A/%&Z5&?&Y5F;4DSA7P!!B.DA6Y@XCRC%F>2%8X^:S)F01O3?90\nM\\S/'S+)%RF)>;E>MR@B:EZ&XJ1.MZP)5KUKCLGF%]=X+N,8@DE9_2UZ`_V&9\nMY=9::\\.&NZ]LA=8:26]E[O[Y^0G@]2T\"F?G+[W^\\@R*^=5<K!)O>0\\JW92\\S\nMGS:J@,1*LN>FV][O]_M?CR\\OEX)S%F@UJ$0$_\"TH79K251*NJ>SZ6-^-W'L\\\nMLVIB$?WEEU]ZOST>C\\?S\\YI#A(B(5<PLW#A#5=DM45&I+%&()9^)K$@&-=$Q\nMG5LC>OU87>7'_>X?'X_/GSD'F5'5DIZZY1SA95Z6Y943[CV=PLW\"(YA%JIB5\nMI()]%\"[8NUE]62+7%`G%^718DD5K(E0IYI4CCIY9,2(L9E86(K/F?&X_FNPR\nMSWG-:]_W)HVSVBX_GAP1Z0GY_B.A(NS(&8$15IZ)Y`*!@7(;Z?9MXEBF$8OP\nM)@HPB22R\"%`RP:>-OZR3*FYW#EQ$3;IN79JZ%Z2)2.\\EX:#@-$X3_JE$#-$J\nMBB2X$*F`F=9L*\"L]S(D$$*8B[*JC\"N:M]\\:K(,[*K.0((69BYLZL1$(_%:94\nM14`:H9!-321W<'K.:U11$]62`KF[2H@L)TIFAN<,*DXR-B4*ADA`$K0\"XV:)\nM95(5,4.D55*E1-)I7P#V_:9:+Q!F4B5=8<]IEQOW9H6G#2KN=_\\U@IF[MLK(\nM>NF'N=\"VOAW[.<YSC`(\\DU2VODF_C3'&L`4<$I'%GOEZ/D2$5:K*PF.^\\&(J\nMM$SLRQ\\?\\7+;?GT^M];N?>]-0686>0YI^H^%-XB`UT.$MK:]D2ZO7-U*9N9B\nMRM<-K/_L&E?SMKK$S\\\\O$8G8%MP)P-)2+_O\\NBW_*4_+-9Q>J4ZT<F>92%I?\nMSV,L??K6=\"4!UWU_^I@^*YW2B6B=P\\3J+I*0BEK%NGHT@E0\"3%S@,L3,&&E!\nM)VBP$JE105NT+;.*!%GNA%0$$]GRSJK.P2JBXJQH`BX(6I=S?+G[F)>[$X?H\nMC:6X7!M`OL\".MGZBJLS<\\A4V:@@'E2`11<B'`]E:$V$@%^:BW&ZJ8\"20$8$4\nMI5)<.?^?.!6L2L+,H-;0.UI'KX7E)2)(4A$DBCP:,:BBG+S*JL\"DLA:P^0W;\nMBHB@8.(J,*<T60LN(2'`(B**28-X5L*(E%IVI2[$@S6T7D_&QA%1-:3H_RI-\nM#PL06;^UWKJ\"X$D*8='&1%5)X>%A/NU\"LF!7+JK(F6E$U3<>!)^6Q91*$5F2\nMD(BRB-Y?%^`*`LF,S)JVG&*(PD@?%H79QN7N7%!5#U14585Y)O9ED^T-X_6F\nM=_>F:?8WYDRD,?,*ASG/YUOJ.<9X)]V_EWBMM3'&\\_E<H_55KV[;MO=MNCVN\nM<\\Y)X7WM-EA6A)-79GA%%K\\^96EKWNF=[VNCJEX\"[O<@=&T;B>CX^'@\\'G]^\nM_FRM_?AQ[[U[S.NZIKE%>&9K35>L%)&*5!@MSS\\+\"N4!@8\"TO;@8*T/<W<_'\nMT\\Q`OB[]B(@QSO-Q7I]C/L%%205PL3(#)+5B/3I1O>=R$3'#AUOF%_0B7<DK\nME6FD`RC&#>\"D*$81KWC@)AK#%UA+5ARO$K@:BZ.\\JB^U?U8GZ:W595?_1$NX\nM1Y;%E:@5M832`\"9Q%!R5J%F6F9TW9NDJPJ@7WT'UUJ5HI;$$(LJ%%8*L_*V,\nM\"ZVH09MJ4S1%DSIED\"18*BL0\";OR.N/*R%):S[453$SE#B[$V@!25H09BD@R\nMJ_&W62[#W4474J2R0S09Z9GLZ)H]BPK__K4QE:KNC8G$;=JXJBKOK\"Q%3,7I\nM%11--VYJ\\5QOJM:E=R'A>3[&&!,^12[BOK#6\"ME59=,(MWCG;*Z'VAHG5E$M\nM+B_QBFW(A)FMNM3=5[I!>%W7M41V:5Z1&<E$2:S,!6AOO7=2R:HYY_,\\\"S*1\nM:SPGPI2%2@:+:OWX</=SCH@`07ICD21P+-JF8DF0AU>5BFQ;(_\"<CJ1$A9<C\nM!7P_CD5GJRHD4`Q6IA)9D\\[@\"A%!D$U[+^&7AES_1@Z[OX&%S/SCQX]OL5LM\nMU-E2S;^E-^NLKO'.4ER]>\\MW5?V/B$;@6X.R[L\\Y;)/MV#F07^?/,;\\B+]!$\nM$((JV).C!`1GMB*T1NN7O<JFR/*\"E641A%D3'&9F88NO!,G@%[<42`\\J46;G\nM5H![%15+%1$7D?*^=7*(\"!5BS)[22K:4PB1B4:[((\"2XB$'TY;(BE*HJL'8Q\nM91$RKKZIRM:4A2JI2(@;98G5]$68H61&8R*BIH4DB6SDNTAOU1NU1AMK-2X4\nM(5@M8GI<SE<^JIK0ILP\"Y<ATP<127!0S,UZ%4P#A`=URYHS*Q)1*+\"(F3JYM\nM`=XSJ0@>>4T`]LS6&B6I:%/V`B\\-QO1^[-*W`,WSJIFT8^_;-5TH0^L&WK:F\nMPLI&>1Z;:G%,]T6+UV9FCXPLCN2L6ET,8$5(Q*K?:WGA5QXRU8+R4BZ]0\\&#\nMDBH\\AKO[N*Y3SRA.4`6Z<&L-\\Z6R7!'4P^;C\\2!2VMJ[+%QWT5JD??[\\\\\\6#\nMEQ7`^D*W;*Q+O[9F'S]^_%BWV6->+W'EFH*K!DA4FVAFQB+3+DU6;^MN7`O)\nM=R+BNWA<-VIK39?#^GT4W\\BWTPP`JUS7];P&$:FRB+\"H]B:E?=M$Q,[G\\WPV\nM;[\\>=ZR<T'I1XD`DHB1%N;CBE1Z!4F(!V:1M;\\1KJ>*MTY8`EWU*!L+=9DY+\nM5IG<!BN#F:$L)%VX9P2;TT3&7B5$/Y!J?OF$69'P<,TLU9=1W3,(1<I]NU55\nMS<%$V]Z;$#/M?7N4DVQ+Z)<$MH)[3]ELBT35XB^K@RPJ:E6=5$7\")$0,8H1$\nM):42ZTNV6X'*FF8I!X_IMF)F&$RDPN3X,Y.C.$M+9LV=]6CAJO_6[B[D5!E&\nMRI6DE,1UNW(*G*@`ITC&!;^H6E56DC!1+12C,F?&B%AQ!M+4JCS6L2I88:,F\nM2D$*UB*F#//_F^<A;:]VJSQ82Z>G:Y-_\"Q%23G;*U\\C$<Y8%&C'<:%(Q`2)2\nM3;!+%H,$#$8!SCR(3D*-FC,(`N&%'2YDEA&UJJ5\\*(`)0DB\"*\"B'Q>7$*84R\nMMZ#>O#S&&/MFVG8\"+QT893%SK!)=Q,+=_;*Y9[:UQZ[X%L`PD0`XQ[76]^O\"\nM>*\\N6LFW]*R6WW=-39VP:=,B663O<*F0IHC%=^?BOPG\"S+Q\\K8@\"2KOTWC?M\nMH^]K0L-%E-#W_OXM!5@'<G5]USC/\\R2JXSC6O=?[:^*TEHIOXA/C?Z2$OV)Z\nM1:KR6[&J%;DPJ\\Q\\.WY52;NN\\QQSSH)%CO/ZV?)7!-PP+6:`N1SDJ[`N;.!E\nMT'M!/X/2[I3)^(5*D`W9&3N!/1*@1MQ)LA)4Q21\"DY4J2[HH][X)5LR52(1H\nM7[MWEKY038=NN]_&=/<`$>M&Q#%\\SC'%4<&`\"K=%O48EB_Z^$T.;\"(J%`!)J\nM1#\"&5P88\"\\]/4!`5W?(0(D%QDH\"WZ`>.F]S$,HNHDD,RBZB1I%3]>J<GQ1.Q\nM=H4`+HE!D%Q7]:OA4-6NO8C=P<Z````@`$E$050?C[!`[UW['I4SPB+,??-H\nMR:VQ5K6JEL61F/9G=X./F%$>V2BCTKAX:WL5S`Q\"O6W;MG&1F?7[P06NRH19\nM,+B*1=KSYY]\\'-@;\"?LBP&U]$_KYK\\L-(M^)2&2@*AC0UD@M\\\\7!6^=$B-,B\nMQN3CQB5A7DY4>'L\">^\\)ON9I9G/*OFW?70N]N?+O4T'?)/UW@.XOO_RR-@(+\nMB/;Q\\;&TT./G\\_L-7/]\\8[_9I&X&(J]T!JO$XI5\\YRE5E5>61W\\95OG]75;?\nMO@AT<\\XQAAX?]\\PLH+5-JQ;T`H3>M*J$;TLBD)GI$.I4J*P515C[OD0#O?>R\nM1:?6;=L6;^;Y?#Z?S_W65G'/M.][SQH5@\\4LNDH1!XLU]?-YV7ER%\"29((46\nM6HJHC$KIK0;_^/@XVB;HGU_^]?RT#&.S\\[&I($.:<+L0DQ66V8_?(B*1'EG$\nMK+<H#=(LJ6)I75H+TG5?&^0_Z*^(\\*CP%T\\FDS)CJ)UE`V[%E('D\\M#(WT//\nM,8'LMUT8EEY:[=@>]E\\;M0YE[TI\"2MX0!#@HBS-4MZZLP31TY]^@3Q\\3B6W;\nM=.LD/,JS9FSWU3!/S%GA29A\\##E)RWUS,`C2`P(#7[FUN34&D:<[>8$?::=?\nM(3<F\"<_K,<`<`JLZ(UO).:)L_KK?;L>'1B'B.'[D_2\\`F?'GX\\__^G+M[?9Q\nMC)[SP[E`02WD3D\"J)(<S6306$@T&E7`0>>L):X_,'.'\"&BBBUHG\"L^\\WL]!B\nM=G9W%N&N68\"/JE\"Z$RQJ.IVSYMZ/.G[2+?J''A_4O'X+^YSP^M?/^*./Z[?,\nM!O9DE`;'5^9_=FGW#Y4XS\\_G$\\RZMZ-+OP<KMPE<;J`2D3!?VD/.K&5:*-JD\nM4=B<T_Q)M.S10A3,K[5<)IL/$&EG2FK%!VNG5KPBF4A8W/T<%Q$=^ZY-C1E5\nMUQB/ZSSG:%M?YN+6CX@^Y]1%:GK+V-:<YMW7+2WY.\\8-6&/WUX/!O_^MGW2,\nM\\7@\\WFKQWOO]?I\\U**F*\"(**L+JN:XSG'-!BBKEPXNOJGW-N-,&L3\"I46%'Q\nMX>/JM%5X$KFN6ZT8F1XOK34E<V,&\"V1M2L*)@Z@6R`^4*X-W:S=$$I'RDGY7\nM147EW#B372@TPE=.0'F&$2;PS+S2\"P)P4@47.:PR$&Z#E\\@UG;BZLJ@D-=*-\nM5BD6100>)9,X(1$^@Y*Y2U=R94JA0NO2E$M8NG1AT14M)`4I\"'$5I*#[=F,J\nM\"I]SC&E7^()K7->UWV\\O<X#P<+/PJG*J0E(%/`,5J(%TY$^1EGDA(CA<&K$V\nMVCLE;<H`)0=@F6M^29!P$=U8-NEW:C<68B0HW%*+.%&<E4@&$N2_W#Y6DCN8\nM+**`*%#6T;JS9H1/LW!\"45)093D3>QH%O1![:9:ZQSW]L-'FI866I6%1N2TP\nMRB(;>:U4\"&ZJYWF9R3GLVS^7[N;NU/OI<T2.\"FE]7R*3Z]SWWEI;3(I5ZZT;\nM[YHOO\"`1;=NV(GA788]Z@1D68\":187Z['>ENWZ\\K/0`,&L&15;0TWY5OE]]R\nM][[,NM?U7/7N&.<:RZYF,3.JBAG;UK:MO?6E[VISN2O>>`M6U?YB>*[N=MBT\nM<$BN73Q79GE&<---#I]+DA9F8T5P$[B*`&=(Q9SC:>$D3`B4`YS!7AY<PBR@\nM`*A6F9]%F93$(\"H\"FE#Z0`41B)5)B*6M\"*;RI&108UK#)$81Y4E(JF#,+$/.\nM]&'F[J/H2GQ5G!%&F>!$)N.&C$959`BJ\"E14QG343:IYVZ-V3J[*M\"K*%K)'\nM>3D5<814;I0WY9&U`*2J8,X2,*=H-:WU-R(0$QO3^D`1RLP@<)5D@;(RPB^S\nM6R%0F<6-P_,<4U4O\\LJL=#=S]ZAT%)A^4C)S(_YSGO\\]G[NTO6TWCA_$H-:%\nMJ\"DYPPQ?J&DA4S=JN^Z']\"2&-^9J>$9@\"?.3BHD@X&2N1IR5',5%!\";F)L3B\nM?]DE45RD(F\":#$]_^-P026DQPY)5DO+RP2$4OY5O\\VICVV2[HR[WD:[G]1AC\nM3+<9%DF1P8V:B(T5#5J+MF4^+[LN/V=MCB*5QD+2VK%3DF?>COV?.;;O:L[@\nMJQ(Q<^;H?=&Q;2%\"-]WVOG';7D,0C^OYC.\\XV[=_U\\:<$N](LO_!SOXFD4:$\nM+BS4&QN<F>=Y/AZ/=_K\\VP3UEKW]TW;UO7B1M_ITF?;'&.=YFIFT[Y9GT;\\R\nM5O=^.XC7=#G&.O_2NK;NUU2HQYSS\\@RE!DI01DY0K[5^2<H*9FFM!ST7\\_,-\nM5TYB$E4%B(D*G\"BH\\!(\\PFAA:9IRE_>L#,&M*J(RDJUB)DW`JL(Y@PKB*\"O,\nM-,]R=X_7^\"XS>8&PE.&2L5O*C'ZZ>JSD\\R1BJ%C`HH@31$4Q$)V3\\I48Q52@\nM7+=_52CAY2F%<B7\"BXF$RRPC/2S#FA(WC<O&LE.^G&64@2).R(CZS&OY'KY5\nM&\"\\5?\\\"#R(\"3]5.?F[9CV[?Q_(_CU]N&7_;;+MNV[^\"1-NTK3W:X-.JJ03)3\nMPA6B)%2BI`PB\"!=Q<A8X88E,`BVVO!0744E[1.DZM<3))`Q#)*&04#B<(D5:\nM(J(\\RJ62LBQJ)C96:`,NBYDSPT:$&3R)$R$01I)T)F(RT:XZ+IL1YCZ+L.V[\nM',?,L$@2[MM&1':=Z_9[&Q56:W>[W5;3^';SK8/P'[__L9Q*E3FOL28W557A\nMS(R5)7([;MN6F=/-_G%J7@L,8+6R;^69;GL#Y9CG&K>LK>6<<R%TB:L0]FVJ\nMR,RM'^_2]!5]^@TV'=?U^7BLNYN9BTA:*_(%8^6FC3?VF-/-[=9Z64Q856+)\nM(T`)G?/9\"$4D35%,*C41*^*8BX@](SR]H*U)V\\#B61YDD3;3+,`BX&,!K)`1\nM5LM4Q4U%&_>_+5=,$1$9E864,#>+:XSI,=RF113\"\":5<R<0HC_`QAYF=,[[U\nMN-%4%P&A(%>4H6*:$6D5AS?PIOI5]ISS:2<K-X4RW*<;;R3$T`4>II7KJKP2\nM#`G$+$22Q`X6\"-8B.U>^,(AR::A0MWT?TX;'I!7>I:!VVCCM!=LC((FJ@.7L\nM064M/I`Y>8G%B%.NNM'1M_F1O]_OO[2NW**&Y?599561/@/=N3$V;IWD`_R*\nMX:25I?,RUNS[_GYG9P07(I(L;K?;6HN[NW.%$`2]-8E4^H[H,T3$6E8(/9DV\nM%B^M8(,X=**\\XN8^AT]/(^[%J(H,8_H@BL*2%3$1%4?4\"SZ65>=Y7M.LS;T[\nM9<4WIW`%.BQ)240\\7WRT-;\"LKZ_GJ\\,Z-G<?9M,,X-;:;=M5=3D1HK*JDFEF\nMS#F?U_GC]]\\SHLQ6YA>#EBY^K?W6:=2WQWZ=I77B>^]O]^$;F?C/X+3WLN4]\nM\"UJWY>KNELOX==MBVHR(:M+7'HF9RROG,_SR^62D\"(T13YMCF/0-J@64:%5\"\nM!-IDV].\\1#WAEF-8%&W4\"VHIBO2`AWB0&Y&`B3.4&0(4,8A;NVW]0Z7G`\"_Q\nMI4@NG=NZ?9S,<4T_+:;;B/2J*GQYS,PK:T0,MS'G''/I)[FX(B-2IT760N6>\nM6>34RT99!UK$77H7B?*B!%,Q07M6&HE3_V!E8\"6.B:HT)5$2K4`5F(682N`<\nM)5\"NIY]@DJ:KFIIF7LF]J^HYQ@J\",XIJ884Q7TR,1;TEE3*&KZ%3<8&XDE\")\nMX(+7R/3@KNTYKFO.<;_?FC)7-KG2'3.3PFMC-.):UJ<\"0$)\"!'D!EI.!OF]_\nMXX/-,I.RE%BVWFU?.N.7T$T`5)--T5OU8=,M*B#HC;;&P6S2B00CIV'JAD!4\nMV!SGU_.S?_S8#Q$AH8*9,W,ALSRQ^#1$%3G/QS.!K_/ZWY]_2=OB=C.>0OP\\\nMOWKOQW&DO5!HZ^RM$[+:Q<7\"6%W8UTI/(0)3@AR%\"HMZ'4(4`&6&$DOO2BLB\nM`42D(J\"5M981:]VP;D@]SP?S_3BVY2:^KLMLK'IRS5O?F_=5LJZ?<OF.UV;_\nM'5:AO=V;_A^?E<DD]<+;IK-$EF6FV5?82KJ:(I*H.6=DM?TH8%1,D\"?8RXI*\nM&HB#R#SF-><5!3)H%,PY45&-L#$Y*B@4VM)4FI\"@H8-UT_NF-Y;M'!<SBRHQ\nM9X9S);B8)L4LOH)&\\%4TB:V0F?\\=/M*?<YQ^33./&>[(S\"66K*Q,KSS/8>Q$\nM%.()-!+COH&V2,W8&UJ$:.LBQ2PL$=52;G+G6KI38A;EIMI)M4!E02HL\"\\ND\nMI:1P(C(BGZ/\"I:WL&B!9A14XMNWRR#F],\"U&5;$TU,P$`2P*3JE\\[3,R`5ZA\nM'8AB<A0R+IL6YNE7C#_/GT?3756(-UE1J2YT4+*$@I)!I\"KHJJVQ+$E3908[\nM5(2Y;1L7B\"C<(TM$DA)-6(7<*6KIOHFIR2&I6FVXSW%%9N>FU1J$4X7W1#NO\nM-\"?1O25\\C,?CJ_WUKW;_X-Z.OO':.9<R)\\GV>A@S%JMJ/L[6VO5X7L_SW_[C\nMQZUO/IR9_@D\"7@WA*VIBO&[(IDVX$61MVQ_/G_W853M+BRBCFK[.+>7W`B0J\nM/%ZR&5_QF\"_0,R,K([\\9:\"L!(?0___,_K^OZ^OI:DL[[_;XJS#GGLB&_>\\57\nM<UBZ+LQWNLW+==';NVE\\!<N(M-:TZ;8=RBVBQOF<]@`@O>$LY#2;D?;=LT)$\nM9N2:/+$T@(;[<]K7-7ZY'0&ZS,?E9DYHSC',ID=G1@EQ8^J$\"0A*>[NW)B2+\nM'(5*#9=TM-:)69HFH69:I&=0TG]?7\\/C>9V/>5T>(WRIR'\\BSK#3KW,.^,1R\nM%BN762R>058EN<\\D):+\\0\"&RE%^8I+@J;\\:[1>NMJ18XG#!\"M?7HE>.%+F,F\nMR)+=%E`552!B$27BB&069O[]8W]\\_9S7V94;P4D'71E)'L=Q/,S)@JCF].FQ\nMW3=!&7-5KI@4$B%B1N;6@.+>P)3NM/P[DX`,DEDV+_MZ?BK3UK1K^U_WPT4$\nML1/VW\"F(48+D7U2D-=VZ*O,WJBNM.*$BJ@1@SE=P5294BLDRALTY9U2VIMJZ\nM)%%\"BL@K+DN\"=&D0I@W5J/;,?EU7@/?62\\CF(^G4KZ_;\\W'_\\2MM^R)`BVAK\nMY!CO<`>/:3F%^<=^,\\^H_+=??NN]?_FCB1I\\S4'>H,`57&'S[UWWRY_!7%4?\nMO_[2MEXDUQR9G@0682*O6*,@5@'@F:LT;7C%.1*SBE*A0$[T>#S>0$,-2'&;\nM,YZ?3^9KN394&]H^$GZ-%^):4(D5HSE]DF#K?3DXM0N`X]C/\\ZSE3O6YIA&9\nM[D]CMMYV+D;FT7KK6\\2T_7:Y/R;&J)V/WX[2&=?S\\<G1>^^]T1AL\\:/U>R_.\nMK_Y$X[K3X5O_LL?/YSF>5]OZO^VXKN<\\2S[Z+S\\.RBO,[WL=?>S[+:E`.LR&\nM?4E+%N'\\L>];59B?C5WX^;A^ND\\>C&D2V:,\\0>AA\\^OS>=*8<\\9YT34JD[)6\nM8,/FQDQ59#.CP+I#-0GUYX!P;7&..9\"3A%5(]'?IK;5%6&&6^Z\\?(GJ6_^;-\nM*U.8=$?;`HQD$=DV8J)>V#T(V)1+B)B_VF@;\"EP>ET5M['+\\OX_/3Z;.='RT\nMZ9^XANPRB<_X$N$[(9/A1I00B=N6@<U(5=<PJ#5];9#O_<JOUQZ<JXA1I0D%\nMU>,4E99T0'](_]ADDR*?>_M#22@I`RL:48DR&S/V?5^*_KX+86C+1/M(&WE6\nMLO9[UC:?5P5WVH_>8M;I_ODY'J?UWC=2\\5;R.Q\\_?E;8^\"L$Y85S[+)%V^V:\nM?C[[]-UB<U8^(H+VOSPVQ;9O/Y[GOZ8_*J%R\\RT_Z^R_WO[]UQ\\0\\?+6*^.\\\nM[?J*CX_73.3YO+Z^'A!FYJ9MVU\\+C!=Y,/>O_WY@J=X25=4:6/DYK2J\\7E=7\nM1-5BM'-E5>^;F?W\\ZZ_;[?;;C]\\$:?_MP%*&N5[7]4^L_5**CC$\\@H%$+F(4\nM*)?]\\7;_\\<\\!Z7OD^GP^EQ)G^:]68TE$3$4DC5MX%0)5$3[G].&UHMNT0S*#\nM7<@;L[_\"E=[C'U6]W6[GTT0[1`A$34D8!1:)>$:>YCGMIK+W35)2VDL+#V%B\nM9576Z'T#47D5^;3YN$YP.M&5_'G9P_=SDB7/JNE^ICWL>LYQYNGNX;XB699J\nM%D1^[+DZCU:0!N7,A)L&)XHM!2Q$-]4;Z08I0E2A<N5Y-.)-E(@V%JEDYJ:+\nME$)$I\"O.#M2UM9>7!HDB9@U7/=SIO+ZJB'OORK>$7V-CIEW:K_2QFP.CZ/)7\nMBL%[)?4W4NBY@GIJ6<P6[;NU]C@+E-\\X!<_,UF3;MEOZQ[;]?O_QQ\\?'K[=C\nM[TV4B8CS*=45V47WMA_'BW+]M&JMA?MJ6[KHLNV=IRUOZ_6XK*H1,XD6C4A#\nM1L85-C.0L3%(N,*5497F!N(8<WKM-Q6AB;RNY^?G7_>/7[;MX*:B6FOK1,PJ\nMK,(B22N:Z1WH#A%A5#&O!\\?;T'!=UW(\"'<?Q.(>*\"K<,/!_7/Y5H+/+^E:X1\nM*(4O9OEU72^BI\\C+A4A8`IA5;SX>C^NZ]M:/;7M;)K2)%O^=2O]>:'S?OQ'F\nMLV9&)*6(7-_9UZC\"/\\>OP!)WKR^1P!RCZJ7>E$V(N(EF1;JE>8QI8U9!>P-7\nMY+1-+V>:D<AW;F.@DL!-K[J:4\"JC2/9.8Z1'*<_SC/`(F7,<>]OW7LD,>A]\"\nMT2ZML89JCTSN1(J,F/`D2>U/T3^M_OMGGL,,'H1GS.<<7]?Y]7QD^>OU@)=S\nM86'VX]B0B3G@L>*XI=*9[K6E$`F8M2O?M!_2-I)BD\"BS*&ACO;76%TO7\\^5'\nM7;$'KTEV]+9I41=6$:[DDD\"QTD<<_?BX^,N'>\\3*$A7>!-\"\"D+1.'QR>'$G9\nM:>::@U,A,B/3UPA6CFW3E]-TB8Q1I:I?#V5Y=4KN,R*T\\;9MG//'<?NW'S]^\nMO]_O6U\\#-J+ZY5ZM<6MHC;:.HU/O0D0I*LPCDYDW;2':1-/CRZ[;[5:>/IPQ\nM&XN02.$1<V8XZNG7B$'@XJ+.85=EP\"<+%:ALHJ0K,73.*\\+'?)B?A2F:JC7=\nM6!0ED>E4@9KAEF->EVHGS2\"MJB:\\YB6>N7Q;NO5E0\\\\J4?G]]S]6(?J6=*\\)\nM2!/>*@\"L;\"?/6`^LRZ8*]Z9$M/57%J(P?7X]ULWT<;^KB%V#\"R)RV7RK._5M\nM&?Z&W+UX^JI-584T9,6U@XB4F%16_)O(*H8%:&MAL6B-[SW^^M=E1;+0W@X1\nM:6@&9^8*^`QW)V%JG.BN>E(=D4W[JA\"&&P\"/F&83.2HH2$FT->VM(F:X32;:\nMF?9*36^]Z\\I3?]&LB+YMURLWMR)'C)H^1_IE?D;\\U\\_G__ZZ_OK$\\WHZ57$]\nM_7K:->Q*FZB7%IL9]9WIHZK9E$%0C_F$>Q=IRH+\"<5MH;V;NRINVWAH)0\\`B\nM6]]NTG;FG;6S,.CB4)5M>XVX%MP2&8P\"%9(6AK@0#%#)A^Q;;PJ:-X=;!\"JL\nMDQZ;9GC91=`B[F\"6QJS7#!519>*H\\LB1&:!LTI<Z:IV]E1\"JJG_<#KRXR>M)\nM[^N]V':Y[]OOQ\\=]WW:5UK4U4=7>QML1#NW!W:`H\\#O^MK#NIG4Y_/CQX_E\\\nMVC6[-A.=M(B7^2B?/IUJI`>#E62COLO]XU\"FIL+`YWG.YPG=YKQ$:(UY(CQR\nM1(S((46>2@@B\"A0QLTJZ>_CY>*IT.3@!%UDZ^KYO]CTF6<>,F=VSJFZWCW>M\nMM_R'Z^6<Y]=U71;QYJ\\!()4WZ/Z]07C'9BP@(HB.X^BBZQO-R+][SL^_?K[Y\nM:\"\\&>U@L_R*7=%WCSDU?2E9WKUJ+>Z>L=\\B&>V[:UJKG#5?])A\"_4&NRVE.6\nMIFH0LYC#^Z&L3;%!-`H,*$MK;=A<J6G%E`0TF>&(W&73IMNV/:]IU_#9]WWO\nM>F?<TH^2IJ+\"W'NJZAH9$Y&J,(M'N,WIF5DB8M?UU^?C\\_,YKIAVS3$2D5SI\nMD],V$F\\-*:VUO74&517C-1-N)$I<+5+:\\G0V)J;ZKWH=.1)6IET:\"Q-X$VFB\nMFVAOLG%K!\"4H4>GZ<J_P@#73!\\``U1IZ$]5R6))0=5$J*/%Q'.7-SGGS.O;V\nMB_8YKS$T;/B,FBD)3@(K)3BJL;2ML6Q`%2**;UM?!577)B+K\"=W[+V:6Z:M,\nM^A:35':Z]_UV;+?6NDIKTO:M;9IM(UZ3)'96TI;2`%`\\6VOED9EK2<U$^[;Q\nMT2KB(=+W;7K,K#F-4\"/\\,DNJK)+&NNFV]6W7[;A7%2<WX1P1EMPYBLH3X$I:\nMCMO'X\\%-ZXC6;RI\"D&SMV'>+HQ)S,\")[:\\?M'O1MH*82E86BSLQKCE?-J6O]\nMZ__'H'']73Y^'*3$0'$R<Q*8>=NZC<%(#Y\\STO4=VMGW>^\\](A#9>N^'+LUJ\nMV_J\"G1&SOC6BJT)]IZ\"]OKU#1)0X53,366->;_7,Z_2&$E'XZT'R_@HKZ9M1\nM$47$%>%AP@$\",Z,HHA:X5+EM;%VZ0H6<\\0)D1$0)L\\IQOST*.2(!$6+0)FW7\nM9M<@M.4G)\"A`!&UMZ]J.(WK?9W@6D4B1,*NM[-XJ!G=BB<'#-T^P7/&,NJHJ\nM`*K86;6WJAVLV^)JX<7J7\\^=._1%'VV;$)IJN<\\YOP@B0DI@4J%=VLXL1#M8\nMB24A\":(`L0BO:F.-]:J\"0)NVU^^?DK(:N#$1A)?'3G7G[FF0[)L&U6&,[,1]\nMWV1K6^LX1T$L.7/$G&??CA7\\$$L,I_U;$4DK$2',5\\C$-_.RLU3FVE\\K,P-)\nM1%ZY\"6^B_<5M7^]CDM:85X0),376#J)*VM6.OE%6F(N\\Z!<BTAA7VXY]MRPC\nM>F8:PC/M##,KAHCLF]R/_=9E4TE6]Z#A);IX=`6!]@8PM1F>2>.RZ[IV^S@.\nMSNDI3DR4J46=9((\\2CHO59\"S6F6DN4T/LNG+Q[3T,=]61OKS^:]71P-4)7WC\nM0Y?,P,*YDK\\!OB3\\M]?)_;U+_V?P[J)C*TN^L.CR'JGHO__QQSO%>VG)A4A4\nM+S>?EF$K?V4UAQ&Q@.'_C)'!.B^.)B\\>OF6]&\\M$9D*)LB@]($&<534\\PE.Y\nM;6WO)(#<N/W_7+W=<AQ+DJWG?Q&1605R[^Z>.2,[>O^WTHU,,HUD,SW=W`2J\nM,B/<?>G\"LVIS#J]H!`B@\"AD1'NYK?>NCC28KEK]]EH<ODS:V;3M]SK.+]=:J\nM'[Q;/T31)C@]N`\"WUJV/O@\\9W5KK%6=<B[\"6'UQS>7BNN?!XCDAF>U+DELL,\nMH$B:H:UO;1M(:N,ZJ)2XMB$34=7&U5^.B&\"QRF;DMOZVEIB*4\"`%V*GMK,4\"\nM+Y359JT9F[`.L]ZNJW@D(H1%N%@EI-V$H22J(O6(FVIKPB`/%>U`4OZ&L0NM\nMF6N=4KY`D*C*;OYP?CAWXB2!)M&D3`^%BO`VC*PQ\"$EBK6)Z&13L;-RDF1DK\nM@R#*JKKSMO6VC[ZUKBK:1)NJ6:-EPL+&+,Q0(2).SEZ,W;E(,7IGHBMOSW,;\nMX^/C8Q$_\")+N[,_CB,]8*Z3QZ&T?XSYZ;]J8^O;!&7/%G-.#'L]UQ*=NW^[W\nMWYJQ9M0L>LY<,Y\"<OE*7,`'.D5*R10_;M`9OB\\,)I<@H0;0C>^]JS8376IXI\nM(M^^[[6H,G.MC`A0>D1K38QY52Q)NB]/;FZ:L&;:S%XA@A?15Q4>N=R]T#^L\nMQ\"*23:4994:$O4.MWV#&RU'16D0DO/X/@R`5#\\J_\"DW?,F[A]O[>]35?\\WJ(\nM5(5H3@`A<L7R:[IHUELK;L(F_:9;RF/Y4E@Y*;_.(Q?U?3.S4!^MC];7.@V\\\nM6=NL17XFSNDSD&*MC=:WZ\".$7M5Y4ET.`<K,WFX9<OI)Z[\"DW\\86A@?SZ`Z`\nMH#/2@T>_]>TC,W6PJIIJ:1T062JM)83DZ?$\\SNF4(.W;&/O^.%DE*-9:G+&%\nM;**-Q)F$I9ON8VM=1,A,K.OQ.\"NV^FU>J<#GO7^KP#HFJ59>D=@_CT]P2A,E\nMV:CM-I;2Y_I\\KI-%H0$0-QFVT\\[G=IS/AS93-2+)I(\"`1$C.-;59Y9QP\"J/$\nM[+QBJ:HVL::91;_5IHJ(=%XGD;L:6S2#&?R#CD;>VE#NJLWT@BBL5RK#^[*T\nMUH*'K]74;K?;E[OZE*V3]^4G'.DA*DKH5@-R44*(J-CGUX_G7\"1:Z;)GY%K9\nM7T,R7WD>ZSCF>:YO<JL.*1$'RQ`[59O0UCHECN,XLBBHQ;)\"[Z,49+?;1YU[\nM!&FM>1QS_9E65LSHS%SQ\\A7)17KC%]>GM&5OUWRMIG,NB(PQ/CX^TN,\\S[K$\nM/=>JKD]FVC_GL\\`JDO#E0M2M;:W_X_A*QA$YPWOOM[$%\\>.8.]KCZV%FW[Y]\nM:UV?SV=X]G9?').RM=9L*X]S?8-]NYWG^?=__F.MM6TV-CO7XX_G/[\\TSS5_\nM:^/.PQ5R^Q@>^,__>F`M7QS&*_7D#[H_'VL=?DO;^QZ$9S[[=Y.@YW_]<;0?\nM01M#,LW]WNCW#1^W''?:;#,`TELD.7+YFFL.0W((LT>21K\\/9IUKF4\"6?/_^\nM_>?/K_5\\?O]V&]9:&V;6<E-E,!USA@8/Y7K.8@'0)K>ALN:<Y^*S.CCG\\>AJ\nM=]5TNK=VV_<YY[:%4JJP8#:,KM98V;F0TOK\"*QSA(M(_MB_WT9KU1M:$20+(\nMC-,G>-ANR8C5I:71H@,1?SU:@'RUW[F5D2LH8^M_M)B>9Q)(7)(S>LM;[[]K\nMJZ`Z5=Z[B7!QR?]8(7&VQ$;ZL8VNG9)CG<UO8B(DG703W5.V$#LEZ*_6[]4-\nM0N^+>65PD_M^\\W-:VUF7!T1UV[9H+0@12-;O?4G'?=%'KG^<S__#CM;S^[[?\nMQMX@PF/9]@.J__7_[!_W4^<_UC^/<T7Z?=]'_/'W]5^[W$QZX\\$IM#9^+!D^\nM_Z>!FS@+=*<1+I3<M/U#4H:9L4:H2$1&\\+Y_D\"]E4VV=C9Q+)]^:/9:NO\"9D\nMBR0K@$9T0*RUOIDC5WCK!N$3O&VW1;1BK8`@AIA9RTRB%>',I\"K:M'.?<QXQ\nMMS$B0H\"M-2L-VY]I:2!CR<S[_0ZF[GZF,W,3TTYTOS_F>0J$@G-U8^\\:`H@,\nM+>HYW)T3URP%Q,RWV^UV^W#WB'/Y4:7O\\7A>84_\"YW<N7N@``\"``241!5#S_\nM.7^>CT\\T995`3E]$$DPIE$P7H@\\@SMICNO9]OYWGB<42K\"1-M(MMUDS41)B2\nM\",;$RIQ<:.N,K\"W?S/:Q]212TSD!_OC^?;_?AHUYGVUL*+8B<\\]6`@CK)FP5\nM:QC(/*^;MUKK22=6>\"B3#2.VUIJ)KO,(06K*D&UKU:SOPYJ:\"\"7`F273+<+L\nMM8DV8=`N)@!Y@)6;L@E%!A$'F<@H&C\\ER:5O;*V26BI,)P,4$6Z2CJG<`@X)\nM`F<TX<9R^LFL[DX0UF;6F%28&]]$TS2-&&E$G2'&8K=-1$)X&D$IC=.DF8YF\nMT$KB@8&DPFZ8(P#AUAH[9ZQR^-14`P@(6`GUI1K%8&F=(T@83\"P\"ID\"N#.GM\nM:YT_C^?S/&J%,,A/__[Q,=K&K()&2JS$C:CG<TT=6VN=%OM<\\S@Q7:A%H#+_\nM>N_;V#-S3C>S$IG,Z>=Y,FL@/7.M=;O=!E'%/1QK5@J`C/YV)(F(L8DJA%55\nMB-^3C'?T=;GUJQRHH_+].>^P\">926GE$1+(,-1%%8JT5D\"0$@8',>,3D2$3R\nMWJT)@&BRE/+26/K&@XDB<ZVEQ*TU(5Z<YWF6`J:U%B%\\YCFM,.,7A<DTDOYX\nM?'T]/\\58U<#T7,YJ2V4E%B,3RNP10(5#\\3;V[]]!1/SC8\"=RWJSMK6^5M\\2:\nMF,R21,H(8@BJO754,UHU>B=6B!)S9L%HN9'HV%H?9R'!@$I:!4#*8LJ,)!C)\nMICAS\"DO7SN`A,UBWOC4\"L;8A7359$LLKKZ[$[DI$%/!TJL&#XAK64>&#F>N)\nMNJEF)D>P.!N+:I(297-J3\"8*HTA.15<CV?AY`+0\"Y)6\"0F:ZL3'I;GPZSAKW\nM(Y6\"<K&*\"`L4X\"1X!',*M,FNG%UA0N($E2;#I.W[2\"(6!`/&9$:]K=YZLU3&\nMI=[FSLK\"0OP5H6K4A9E/.*(2RYG@0(B`E-$I-\\F=<[+\\5!$#*ZMHZZ22B>4Q\nMSR,G/<[C.-=YGAVV<5O'2>=O9KU<ZJTWB!_Y^7,*^=UT*\"O#,Q,!\">:4QUHE\nM)NEMH-<.&[^&(+F[\"(DIBP(X'H\\J1,&L24VT][Z-[9<5=0G3B#F8>VOO-+5K\nM$0*F2IZ_TC%^)2F^K1'F<Q79@PEXM<B49;E[)BZHJD8D$LI\\O]W>RH/R\\\"%S\nMS7EXUJ%:@2%\"?_KQ\"\\T_QM@VN]L=-$'KOM_F\\C*/MS9\"Z#C/+KRIL;9SG2P,\nMU82DB*>+MEBK[#`C8-9_;[UQX_ACG8XCNUA7&]:&:E>;M`A0X20&I[&H$)39\nM67#%W\"<XF55$58V8/#C1>VN])Y.`0)23D@&\"LE!&$(C3S+H-2HZ(6$F.)FU3\nM'6T`GQY!(M33P.X4LMB,6(DR@@ZX$JMR,S.U\\SR(2$!,I$+*W)D,.1(`@4F0\nM'%'>7F/3)&4N3S\\KJW(3A1&M,Q.96+%\\!9&8MM9Z$D'4!$89@(EPI\"],Y9<1\nM]+HO(SEB#6E-:2@)!U,J6M?6.]_5B\"B%((\"2:B,S5J.FP63,K&(L58:4B[(Z\nMC=2H8W.9-;P59(#5N)2O:(*ANG=5C6;73+(U@AQS&F$%]VV,L1_+OWY^AJ]O\nM8Q>0?T5H-`4X(]>Q/(^%YMO'7QIW9@R$J6ZM+W.?S(F8:X)C.D6Y\\$A$5J&/\nM>W\\>QUJ+,K12>1(1CDAMUFK@29P>;?1WE(6QOH/OW5VH,A29Z!4B'\\DO-_RO\nMGJ3C./[RE[^\\^3=6(1A\"Y>?)(\"EY&H20`9+>FJH&2])BT(AK,KO6FM/%PX)W\nM:G/-^[9O8S31]!`1>,\"#3==::QWG>;IW-3J.X_%X6&_4NUW=[;JT314QZ-;Z\nMX;&(6308K$(ND13$)`J6!)OUK5DZ/CYRRIPY555%:D6IUM4;H-H(A\"A5%>#1\nMFF<0\"9)6HL()351>\\%45,6)C,99DTJUE]LQ,^)PSYUGXY)Q+,C-\\3<],4ZD(\nM66L<RDRI3+PU+46ERM#Q<IL0,ZP\"79L<!P14B#IE-F4#:Q*'FRH7$2D2E%H.\nME=XR,^9*.)%R4Q;FQ+AOF21S!3ACN4<F>7HG(Z@(*H:L?+=.GA2\"1\"0G$0L3\nM,8N\"C!]-N*F:)!.Z8'0=7>\\1=!GGE5191<@$+U>T\\#M43T0R0]5`E%75#V[9\nM,A,4E\"IA4MUBKK\"]UL;8QZW0I-V&24OW8YXRO7_<.K>^;0B:XW\"<1;:N[6\\^\nM)Q;,6;N*(&]]S6?(G;6Q$\"%1C,S6OG__?K_?>^^$LJJWZZ#+J:HBF&NM-3V\\\nM+.+WL1$1JQ0U0HO09IJ5\\&7:0>]978;+BZ)_V?/+&SG7>K5J:H!77J52L5U2\nM,^;7A+^<3HE`@%)%HD[;E%\"M-7TE@SXG1!)(=W)7H*MIUY_KLH$T-5?GQ(1G\nMIE*YW*4:Q!*HD)ICGDVEMYX1\\_$U__B2YU)5#=S;?D2L\\#KNA53@1T2\"FE1X\nMABC4I(E8[ST=,5-5^1I=%7W3B)!4N0`5%R2BT:@93\"1`''-1A+%0DZCQ+%-$\nMK'/\"G5DI,YLPHS%%D+N+IQK,G6(UU=;5'(\"P:8UG-E;6)DI-5(V36]GCY8UJ\nM5Z)BV,;TH%)!Y/(,+Q:`0\"TY.53%N\"Y1R0%C-F)571D9CES$B95!`L8\"$9-:\nM[T,S9B+@\\$7W9L%D;*0@2F4GT2Z]4.O',>?I6K4I:U?MYJU1;^A\"*FS\"6^=N\nML+F$U%38E$U9E.L\"%V!.5F*0(P/))$E@,RHQ\"I-J8X-XN!.XL8\"E*3>!2D@C\nMN^GMV_Z<=;%GU:1CS?/Y$+.;-M5%)!JX]7$ZS3G_^<<?3\":#;VU7\"%(H&<OY\nMS'@^M:_>13G#\\UQS,7C8UL?6Q[;=F%G87@H8.^>J8ZJU)F(01EZA+&9FV]#>\nMKQPXL][[U]=7_5\\EIH2'8[F[BQDJRS&\"F5MO]3P<<;[+SAI(5KWZ'B2*B'U\\\nM?%3U:,0,DL!E*YI366%\"H%C.@+&HR5JKC/8EHZPO!J*ZYJUS5D5:0F1]:7$*\nMI:P*-5H^5/7G\\_%=3$0P_?CCDYZS+[3EA-SN6[?!GNZ1#DE0D\",)#.&DDHR3\nM:FO:G;Z(F42X*:F0\"I@A'&G$Q7%6(A`GB$'\"#F)N:J&Y.!:\"F4>S4XG\"1B47\nM)C/82,+SRQ]-#2(<WL!=58@Y8)I75%N_-\"Z1F4*2M&OCZD]0676937%F,BIY\nMBX7=_9PSW3_&7I!;!@ES(VDL\"DK.H%\"P@;6\")3)Y+1(R)FI*GF>XGYXL9'J\"\nM!`*28()VEJQPT\\NVS!`5(`L*;DWV/@!J8-?6;#`KP&9F1DUIB/3&IM)9&YO`\nMPIP:43/I*:JL$$D0:Q`8$I7LD&)*K*'$I\"D0O./:45&K*R6I,3>\"2:@LZ=&8\nMI+,Q&R<DF2/)P1-FW)YN&A&G4-[:3@WG.1^/IXX?NF2@-=E,5%)X4A[+SI/F\nMY):BY(`++1%1G=-%S@BH-)&EJD22F?M-WW.(<GLW&ZIZQ`)`PBD<F>$QPX]T\nMIHO]4UJ];D9]$-'C>#*0[E),\"D\"*T_4R`_ZW.(K,\\SSI%1IC$4$)!I%J4Q.1\nMXO<SLZA`914OD4BMFREWR[4`>JG5ZF&:;=@\\SDFGF>U]E*S\"_XPUQ9RSN\"^5\nMY[8RLF)#([\"\\@8U5YF)$8RV)7>EF*LV51)(3R9%8N/R*8XSX$8XD85+A2L%C\nM2B[U(I.\\U(MP%B!XK0=KV?9>>8Y,S`QC(A3CC8B,N($I,)J9FA\"#LQE?N]]:\nM:LA8F:R5[1Q>I2Q-M-94+#(`$H.0&;>4Q<PD(&*2*WHUA.:<RA<UUT3-K/S7\nM(<1(SS2Y+E\"40$26Q::U0.#,E0O>S'3LMPSR66[,HAZP0#*_'$A1$LJ,R&7L\nMVOCY\\[.D:KOUV^TN8N$H8JFJ-..NW$W;]8;*[)]FS\"U)B319F01,T*)9).#A\nM#(U00DKIU`P<G%CN5T044T)!`*N0<9\"$6%QW#$0*4*P\\33+5W;:1NK,%7:^Z\nM!!)B.G&N7--/642H1I@T=%HKCKGLX\"XDHJWQ2F<4^NC=IWAKQ<:XU?UPN3\\>\nMCQF^;_?;[49-YGFN8TFSUAHU32`S=FMU)\\SE#&JJ3:VI??OVK<0T]5R5][W4\nM)K782AO\\UMD^G\\\\W8,J&;BO77'/.,+LRRJ$:X4W5F!BH[`R/(_*<B=Z[L3)3\nM:]95ANF5R_4\"&#LR?'EX,%5(XOW^[;Z-SZ\\?Z_E)?F(=?OYSM6^Q[Y)@\"ISG\nM\\SP#?O:V1YJTO^AVY'S2\\?\"3&_9D)U)P!A\\3/S_]]D$LQF/+Y\\_!_)M(]S42\nMW7J\"7],$(D^-;)%;\"H-/VX\\YSW4.IK%MWUI_GL?7\\1C:PE,YN*Z>9I30KF)2\nM@2-UWZ%4(C5KU'3.242=NPB)S\\Q4UGWGDN>?B3-<U93U6,Z!UNP5Y24B%9.&\nM#ZT+@<*004>FBUCKA$\\'L736NZF0$R($HDN9F80[A@L'FCO[P8;))\"R$MN`S\nM_\"R^T[(VYQ0G26EFM_V#F8^O!Q;:-IAY<)-%*KFUMM9B$155%B8A,/2R%=_:\nMWSR3%ZLT54,RBYH9&'-.!35IPB0,(P3R,7_N^]Z[I8?#\\\\HD8/O+Q_/YQ'P>\nM:YX>\"2;63+ANG^O3W?>-ODEO^]X0\\SP?M^_KX=^_??L@CN<R-X-ELJW;.)H@\nM6\\KWW^\\0?KI+S-\\3'#\\C:<[1^M9BU^/S?I<-L^L=K3O$`:78MO9Q;X^?U2@6\nMD_'Q89D9):R)R_04RU=D[UU+H%+F71$2BH@5\"SYK+>W[OMWWTI]EA+L_UQEY\nM;MLV_4#&[]]^/_U\\_O'5>V\\WBXCG>F#!WF?QG[T:,U6-$%4MG+OL&Q&ES[46\nMXB*;72RJET+MM[_^I;0R;PUJ_:P%PG#WR'!W9%DT;.M=B$M;LY!I@LZ`)F%E\nMH`2_*I#+\"=%:8X1(&2FCMB(U'JTO55I>XYIB^Q!?\"*1J5\"73==P)6>^-R9FI\nMHG$)CDR@Z:;IKER]RCJ.A,A]$I>:.I.011$E:@IH33M0J=_)K,H`1WHU*,RL\nM]:TUHXR,\"R\"02$8%-)&RI`<85RING=Y7OE9E63=`KRYZ_4Q*3(@,(\"YT$S(]\nM)@%,#G)/+[D2P\"0Y%SSHPKZS$JLH]9%&K7<`K'J]R>7_5E(A$6)!O9%*U8O1\nM\"]Y5Y\\FK0U[C928&P*^@D5=3WM/Y+1\\1)@#/XZR^G?8FS4+.KYC'<TY?A20$\nMT0I/\\$(VT<=Z?NR;&(,9Q-1T/O-XGM_WVXQISO)\\:M,VNNV-B*:OF3XB1#.9\nM4!P<OCJ38$TV?;D.(@),R#^5,154IJJN5&?7VPS!1/JRW?Z:J53OP^?G9\\7Q\nM_FK:-+.M6?D9`)Q^P9U*FYTO1*#%G&:V[7N-2@J>HD11X-2:8PB;F?6NJE!7\nMU?2KM*W+=V;^QW_\\1_U`;U-O_2AO8F))Z>J[JNK6APFY^\\J8B#!>*9X@SXP%\nM89@0*<KG2I6#Q$H\"R86,-<-G;V.H?24B(H&4JUGPRL>\\,B0N11BS,`<350Q\"\nM!F=\"L@R\"(T>0J2C(.2$,)3!S+ZND<!BO6J_$1-0%(\"&B*IPUJ^//5$-)1L4S\nM#FNL5@*_^I4!R9Z@E!H8S,(#UV^.E429V\"DQ0)RDX;2865#Q:4&7:($EC<B`\nM,]<*)]J3$'2EZD&4E8BY08K[V<@8$F>PL;*YA!.8$`QF@@DU-6$5+OZBU(0D\nM,SG8!=:+CJ&J)%P[2`W?JTJ,3+,K1*6UQJA\\VGI;6BMO:@3-0&2-*X+I1'RN\nM\\^M\\'K$@+*ID$DQF.F0;8WQ^':DCK&+&A;FAZ[%RY&Q5%!#XBP?'Z*SG*:/9\nM:EO>&,EP)R23P^M@R$S2=PLW8\\W6[J4>(6%A\\;R&\"C@<0:)J2;6+2V7Z$E?\"\nMUPL^<@E=QF_M?8S]:B\"N6-7T)*(#!P!.AJ-I5TZ3EIEV7?]>?]YHP^G+S(A1\nM(62JVNTZV4I*>H&>1*\\4N%]LP?4OY:1^H80)E5>:<OD5+_0&`N[P2;X$DY+)\nMI_NETJ]07KU>#`/\"61/G\\!FQ5+9&C(SE\\\\RU*/Q\"U9.94@($\"`%`A:,E9I2[\nMICHD+\"*]-6;68$X14A`Q!U$R`>E=N&+2%R0D*9@J&B;+)L\\JB63AZ[<DI8`0\nM<8Z%='<5+A],+4).7\"$H2`6;6(6:\"HNR*:N0$`#OS`3F5`Y)<'7U9>4D)\"B9\nM28TM62,1:TU-\\*+TP(J$@X,(V;F1:,U^\"U,;\"3-+AF<P\"!$BE^1%3:_&%BZ;\nM7R91\"@FMLUEOHYR'S%I^0190F.K,Y`0S4R(+%*'*1(B@.@:M9V;&;,KO!^Q<\nM\\_`U$8O1QP\"\"B%8L#HBR`![1-H/!:;$HA\"%\"6Q?:OLXC,DEYVX=SL\"]9R_QL\nM.>9:TQ?9A'.`P\"\"AWCM+7ZSY`BLR7>0D=T]\"44,IPC/`5'+9Y7[5)\\P$9,0*\nMIU^J@&L>]BKZWL=^7<U*A/%NA+ZIV6NM>$-'S<R4?9WS?/Z:U_L+VU>8.0G5\nMSLY,!Y5#[%JUKWMJW\\;[@+YB0U_`J/J\\8@J$ZY5B&2'ZI]$C(B(\\,F9&9K;7\nMMLK,3;08TE8-OO#PN4Z:YX'8FJB)3B+/*&LV:^7H2=K5EZO?.HA\":&54FTZ8\nMDTCK`MB$0I(2K%`&%.$1\"RFJ*:HD0I0(`WF!OCE/%0*2H>6&9Y*J64U-FF8R\nMYK.R29FH*B)*$M`%4<^2*8Y2PE];(1N!KC199F-\"<@VLI`FKZ(+#D4`F\"3%8\nMV8;@.6,AS\\AY\"2B((BFYL0(5V5L/=FG!;9AFIJAH;=N)].!R?`J5:ES%E*GT\nM`!%A>47*5N'*-;,6U&.:1`+*>F^)*V^K!D1$0JP@2D@36L2(NMRLMW3KG:H0\nM/M&L-ZO*=OL^@#5CMC;(=`'.8+.%R;D6`D8D/.=!C=O6UGD<(N>YOXXC:TU[\nM-U55:\\2ZDN,B3K&974C\"EU/LFE0!'R_BV7O([NZ(%-/K<0*8&9'0?#NA,I-:\nM8[-+-\\3,W-_'XVM98OEZ/I]OLMN?L6QOWO:5O<;L[CZ=B)J*F2$0$=NVERFC\nMO,-7&Q.HE-/7\\-$JMHF9?_SX<1Q':T,)+/1&!CB<79:<E76KD>*IL1`>[A!!\nM&B4$N:FL#\"BK*@>O]%@S!#Z/>3RW-FY;]VDAN;#`J<I*A8:L.'.^Y@<5ZUT%\nM!;/#@4\"BGBDQRI3*Y2)B2%MDGIGR4)9:#B*AT+PB]%B80)H!SK)!L(AY+%(5\nM4J7(),H4$)MY+D+ANE'KL&Z>8A=BO&0SI:T#4>-EJJ_@5V+2@EE;8R+V@'NX\nMEQ96AO69GE<B,8$)=5XSG*$B041(-:-*@8_U-@=K07C4E+B)(1(0%J[U.6KV\nM:Q)SE4*2JTP%%=W$1\"O;0U^->!4!H,S$DA6[\"P8H($GBN,:_G)\"`!FREKISG\nMZ7.Y.\\*EM:UUIKQR4!WI)YHP:<4K/.?\\^+@W%FZ2P,HUYYP(Z]JZ\"-$:NY9]\nMO*GU5O9ENJH?%B[)E`IAY:7NB8@D5%)2$(SX!3VS^I`)-^[\\6B#_RQ)]PZ#>\nM+K]?KX[O3W[#[/_VM[_]V1WE#&.REV*HN``4<.)\"IP-@7&&_K36Z8K?:I=PQ\nMN[@,UWF3[T\"8^FJWVZWNM:\"+=EPOC)B/.;&F1G#D8`6(%\\Z,]\"#*D&105R-6\nM2G=D$P4HTQ,.*\"(CUUWO6Q]?K:V(QSIG>!(\"Q!7S)G]6YQ6$K@5B@'`BR?E5\nMF+:6<SDYB(S$B(QT4,:2\"5*!&)&2-<Y*5'_2D^M4`U,2PYB54]ZA7T7;$;IF\nM(686RS,3A&HR\"/$5X\\V<S$@PT574$5M^)EJ&.H1)3U/280&S;MK8&K+Y/.&>\nME,2D3,Y.Q%1Z.^&*I7`0I\"3PZ\"5UFC/7ZLR($-;6Q%@Z\"8#&<@0D.4V2&\"RX\nM;L=B!N,K982)S%H9PZOK8\")IXNY7YR:O:['4=@!</Z6HKRNR(3TXLE9@6]E(\nMR-I0\\Y,:B]2XV@,:`)`MEYN&-3$SFG-F[/<A9M,7<7&T?*TE[LD\"7^).'J(A\nM*HWE3:DF*HJA$B$B2)N8,9`$NL)5$1$_OC[;;)NO4F\"_=:%<88_U][?W/8(R\nMFZJ)K+7B-4@'4(%$=>\"WULRJ9ZGG\\WPO3GMW:>K`K7)41\"BI]VY;S\\Q71]0C\nM0JVUUD:[J#CO!M$[7?%-XZB'[[???OOY\\R?`@O25:EP1X:0R_8P9/<&>@S4A\nMGG34;)`Y(@7$8BJRKNC22EZ&H(!TI'3M:B)2',MS37<'V(*3+ZQ\\$!5_*@`%\nME\\S?6)+$!6681!P4*R,2V<Q(I!0C1'(A_XF%!$A*9.9!4EW3BWE%0E!B[EW?\nM\"[[J$2*!AW9-OZH15+P3L['XG^@Z)N!5ZO&:7TP=VHHM(2)$O$0&<Q,=?1-6\nM3YP1N6)F3/;3UWFQPZG8DY0L&?48&2E,FC5'!EU#=`5Q@CTCO6#U3`-\"<$ZA\nM!'F\"TRFL]>O60)6/6>);@DA)GX7XLA>\\6G\\D5`D;A\"1DUDD>@%_0!L_I%&E)\nM\"3Z?AS)$)*O&JRCZS+*54\\+7E#ZV;=OW_7#_^S_^<[1_ZZ(3N8W[&*WL[<)L\nM8\",6D&0@DBCA2V^:H,Q\\Y05*QIKGN7V[7]U+IB+BMHCJ'5;`Z*QP*[_2W7',\nM-TFMM3]9NS]^_-BVK<ZJ]\\-?4:K,+*#,'-9,M.(K?B79VQ,N*D%P=Z'8VF:F\nMQ0QFHD+$:UD1Q$QT^@+3T]=Q7)EJ;*UM.WO[=3XQYT52]',V:0#<8\\ZY?+$`\nM3+P4KAG)UMHNV>3!:_F1F\\GB.\";<F]K$\"L^35YN<-AUY`#]\"YXD1YV9\\/\\S$\nMC_4U*3^V;\\')R&_]_G/.,49$K.,D(DM(YJ9Z%._D3X9_9-W\"\\R:ZA!>51DF(\nM&E13<]3E)HA`J(,-R7L(DC*QKB:IJC:5YO$\\8CW\\>%*$P5004U75E=.$N3,U\nM\"5Z03,KXONU1&KVK-\\\"1&>&L?W7B4%-E$<Y@G;$):PO*1;NU`6-T%DCWX[#0\nM?#Q]%0&(3)N2SNF*1I!F9F+S:[F$\"'7MW`3(DY)9/%.2S-K3L[,O]Q#9>H=P\nMP\"D#F48@DH@@J)@=QXP\\5&W<;R1Z>ETV-V'QQ2*ZJ%E9_4F8C5`TD)C>IKMG\nM\\S2':!_B\\?CYJ2O6.D7D?MMZMSBG*N]CS`QK^PS,-6\\]Z>MX?JY[^_A_U^/_\nM_+_^\\;__#_G7W[X]CZFPF[5QKB5I.^:<UD^S;B1C?&_MWF1G9LTXW?U<,[HV\nMT_U^SN?;RG=U*\"(0D6[*W+1=4\\%^28M_K@!S``%<(V-5;2V%O\\[C\\WANVS;&\nMR%?4YV@],DBY]9Z$TR<SVVA#+^\"]N]LO,,7BVV3-H)<G`%,N'WC)Q4WT^<>/\nMV@.JHR`B94Q^@SK.\\XP(9M1Y/?H0$2+)M,3R@,<\"X#$ILK)8&<K!`'N&!-(C\nM(W@%DX@1BY+1N)MVS5C,,X/6BOF<ST_0M[^U-JRUYW$<QS'[G)M/FN]RG%Y*\nML=<;#4XDKNOK>Y>J_\"`1>6.L*E9:7C.Q2USV:O-DU#(V)4&&1T9,YH5<F9$9\nM+-`D!96!(MP9J>6Q)#*SQFS\"(A7$*Y097L*%BOT)5K77PU&GT$J*TX$(B'8U\nMH6V8$,+]C%DXO&2B2(_EX`Q/Z?0*Y\\)U\"I\"(I-)EU0+*0U%<_.E'-5\\2G@D1\nM`C@\"A!Y4%^9Z'.O*2S4'?D_&WLF65LT.$%X$ZNO[50O(9_C,6$@G!\"'.M3R<\nMD^6@@)E(%U-D:9M::X2\"]YB9>,0^AJ_S^7S^-.[?/YSP\\WPN\\D'D',6*--U&\nM3P49>,XIJC4*>GOA@U\"MD7?\";HW:F?GQ=52K\\AUP5*7?Q\\='U9_G>=9KOXAL\nMS6JH^/GY64EG=;W,_?:F,;WGY^][8ZT1^W:[/Y_/MY*MZ+0`FO5R_D9$(IX^\nM\"\\_XQDB]GN$JQTH!-(C2?=:6QLR@]%!R>4]!*`1@U394%B,CU@+C:A;WWH_C\nMDU=(39,XN>&*9^/&DG!DDGO2PO,Q'R/G[MK;&/O?/S\\_/Q_/]O1OF0+NU[CE\nM4NB]IH5*&27\\QP5QO!;DJTS)1\"(R0\"3U.[ON]/0KLR=?J<O\\=G55F=$X$L&`\nM(,#\"F7\"G$`\"M&IP$(1FJ7<18$J;*D1<ZO9*)`4Q,E29\"Q4Q;A),T13:!PP%2\nMWO?6;GT_Q17T=.]-5T8`G'\"O07!VJ1V'D4O0B))?B*%2U=>*8I![BI`21$B%\nM@*!2\"R8AP]&-ROF@J@VE\"%2M[O<[_^?M>26D)(E5AX@@Q<$/(L^<[D?$F3DS\nM/7-F3L^HN1N$P2R%T!>9TX.HLSHHGT^).([CZ_GXR_>_/)]ZGL^?%/?;L*[N\nM*Y3G\\RL8VJ7W/OJ9OCB<P\\^870:KBI!\"2`!B3GQ]?54@8;4VWIW/?=_?P_0Y\nM9[W`6K%O_2=^60/GFF6)JJECK;HKL_7UA/RZ2;FO-XG8N#IUQ.\\@%V)6TP\"9\nM&E%F9%8\\*!%>7=.(()+JOM!K?U5ELZ'*O5NI>YBY@+.%.KZNL!#3KLPFR(Q$\nME(Z$F-6Z>,*3(NVR%!`3&<O*R%S'N8[I.>%,Z\\SUS,><V_Y-^\\BDQ]?QW$Y$\nMJEI>4)EJ6BJ#,NLM0W7DB5FI>JB$E^->A3*10\")(A$'$]%[``DKFR_8E'4#&\nM5:745RI7N:!D+X1$SL7DB[EMS8B%2<&;V68FS+E6F8!45?!G)#HSSXSF($KR\nMZR!Q,X+&UP,4K2EGT!BL$0L:\\=O]#LH5/N?BZKTF$<.1=5TS[FS<6W\\-ABX4\nMV\"M>CYA7D<[,3)6YIH396!G``B/(F(TD4-DG8,I*CT+=NOGJ<@&0`$DPE(5?\nMO>K,3$(B`QF$%\"8FU)7Q^7RVILP<X&(\"6!3$B6*&6*9(NE=#@9E_N]\\D`WYD\nMYO.<K;76!XWF\\UQYK!@S9L:D7,B9,<$W\"(DR@>L<X(*/92J+7$HD`LA82.5<\nMUP/L[I4_7?%I[TSK6BSON7I]M&Z2=2^[T!CGK%_HNT'Z6GMO)X?8X^<G,W_L\nMM^(LO..6CF..,9AQ=6RM5Y/G/,]7;IN]+<EKK1KUM::MM=9MK0L8[VM=_3KF\nMUKH()>9M?5\"<G&'\"W2S3P^O,\"$EDPHCMU^A20D)FYEJEC6$*R27I?*X8)-*'\nM3N$N'```(`!)1$%46C^?C\\?C>9Z3[_(J?_!F5[T(FD2)JU)BEFMX?OU+E:<,\nMU+\">N/*ZKX]2K<#+Q%D(\\DLEKO4^!WEX4J(X>6`*\"DH&;8T((2FFU@H%XK$B\nM39(H65\"[&*XV#Y6W#+$R*9A,=243)7M<#VO$>2Y*1YJ0W+_M*]?/YR/ARDQ-\nM*^UL^2(B@ZCRH\"9\"I=LFX$W=0W*$$X1)D8SD(F4(0]E$Q$B69R)``@K.$\"$3\nM!:?J>-OJWIT&(N)P$64)+KYER;PIJ)HNU75+4\"3%E?#!-18'\\:OWULS,^NE+\nMQ$A96K_=;K:--@SI*O1QVY4EEOLY/_;?AS5?#T8B)^6\\OC0G\"5(10K4Q)D@1\nMJEV97^DIU\\E6LSYF7H&+N'U%U1?2`8_'X[V'_3J!R/\"UUOM:5_1$5;W?[[\\6\nM\".\\_[Q&_B)B*N/OS\\0CW,<;H/2+6G.62%B5WC[6\\6-#(=^G_BT\"N]@:X^YP!\nMJA=SODK>-+6*+R8B0,(Y',ID4I,SOZ8N3/1J*[&(MF:M45//6!G=;IC3$T@E\nM,$!PSLEG9();'_O]?GX]OSZ?7S^^YG[H=KL*@-*LO8*E?EE1[PJ3N'P`@%R3\nM`S=&UGT,6KK.DEY4>UI$'M7U$E968:2OB/!8*]P)BS($PBQ2;2U2I\"98(!#.\nMB\"6(1!\":$X,YZ_Y'A8[)%#;)X\"!.J'!RKG5.)HW@9DP:*^D\\PEG(>KO1FEVT\nMF0@07%<=$J$O3XKT2&94.+&\"@L\"DA2HK,0#RFJKFY)+A4Y*H&*&)L-D1)`C1\nMIBQ,V=1Z[Z)TN+V>JZ*$7\"<A1X(7B;!>9WL-06.%3_?IO_X%@;U=#!]C,;\"\"\nMAMBM;XME>LRYG,`1TEL*B\\AY/D5H'_?1+,YI*0.FBU2X49+[6N?R<V(M03,$\nM4BF87B9'9H2SR+?[QSORO0(5:[VMUZ'UJP.P_N.;!?R69&8FJ]2HO(9V[T^F\nM?+>+\\]<YH7N\\KTNV[_OS^:QHJ#<0=LYIT)/(3`BHLKAX\"6].&^\"OO-\\*CLIJ\nMA8/R_9*8686M_4E6C<@YYW&<W7@R>VF!ZE5!6*U2Y^N*IKV%<D9&(`G%ZHE`\nM)LC)SUPG'^<\\UE+5^^W;HWT^?QP_?OQ\\?#^^_^6;L+S*PA=H6(JB3?AED$KO\nM_3NKD5,;3=99VD@K%8=*$%V/*I&^4-GO@J1F/`=%4DG#63E5C9F4>*A44*2\"\nMS^,XXRCYI6(5`(`9RLA(2L_T%`7`93X`Q_1CS2/.\\VM]W/?6F3,1B)5&XW;[\nMZ*O9/GJQS@$6B*J*MN!U3E]QGL^NTD6EI3\"_5DOUJY2Y'I%&T`P286%!IB]>\nM2L+B`@&M#$LA`@Q-643.TNZ4RT3`\">:K-T\\B2$<6Y:?V;L2$G[F..!_K?*PY\nME\\^DD'S.,*X*B`DXENN9UJCO:\\7QF!.AFP43K!\"LMHW12#9KJMW`(TB#^MY!\nMP)K'\\_&S_VRW;R,.H4$1!BBSJF1F\\=0CXO/SLSJ1-;Y^S_UT;/4+?=_EZH'Y\nM_???YYR5L/W?X#&^ZC9Q'$>MQGJJN[5+I_J:J]>)JFI_+D)*?-SN]_U60[]8\nMSD2C=8%4C\\;,>,[S/\"7T5PGYE6R<213,?)Y?8PRU4LVM*\\XEUWD>8^`\\(A,U\nM7>G=,O./_]L9H4(B!N*YHHKAJU;B*HZ$+U\\\"K;E.7^?RM<*=99$[K8ECGN>:\nMJOL8H[7Q],_S/->,:S_FZY%XCT.%*.J\"QQQE^GTUN.IJ=^%!F)0HA=]MC)?9\nMF=ZY!=?\"BX@HOXLG(A5!%$3$!*9@*O!;;ZJJQI8>7\\_S?)Q-;=]WXD!%3->(\nM,!/DD7.F68`3*9+,<\\Z?C\\_/Y^?7YWS.>S>A#`&EL\\E<DP?E-_L7U=*(_IFM\nM-_8.(-:JOI^W%2(D$@@1^S6JJ2[YG6^962)-RL@,7V2\"L)+YYH$C?:VIZ9,9\nM9+]=`[1?2\"HEB*$$XK]=A(C(/=US3C_/=1RS^OA9@\\24(7;?=R%$.B78$XUK\nM\\TW&-2YH-O;-6MNW+1ZG)'V,78-&B*GNK4W$]%CG\\W'T<7QM\\RF^#PO(-6%'\nM$`$$KD?N?07#Z[S)3`6][VSO*$X1^?GS9T5JUW^ICZZU5OC]?J^I6+VH]V'X\nMJZ2[O@B`BA._`GF^8L)?2E%3R*5@G%_/1,*Y<1L?MW^Y[\\]Y/N?\\OM_?5?)+\nM^W?9=A^/X\\K$X!&>$&EMW+]_)[&@XY]_?#YC?A<B/^/YH-M?YX\\OF6?;^]'&\nMD2TX)/VD0XWV;/?0[:2VMR_V?__YX^?V[?/Y/&<>NOY3/P,.NG>_V=?7US_^\nM^6__-IBR8W[B\\]\\?__ZO\\M?OS]VL,T4@208-!O.$3R(1M20)(B<BJ[[DA9'P\nM$KKIVQZI_>RJ8)T9[M>N^*[I8[D?Y_2U&(?[T^<3J<:J:B*]:6NFA0+8O@D@\nM<\\7I./#YC+\\_'W_,O_^/W?['O_SK__RW_RU\\/I]/!\\V)F>+H#63+XY@>]`3]\nMU[/__;-%XO_[S]/$?N=M>RX^C_$MZ*\\V:+,-'_?^E[')^3CG)$[5IG%*X[79\nMK'KZ/!K38%D[`:EL1$I9EF+A!'0M/Q'9>Q]-B<Q]_IR'26^MB2<'*1DM7LS#\nM.O-4T\\@`98HLRB\"H*98&DW4CJ,_H:#<G?ZQ<C_G\\XX\\??__'/_[^^7A&K=\"^\nM?=NWUGL?LO)@2QLL_S]5[](;R9)MZ:W],'/W\")*95>=4U>V^N!(:Z($F^B\\]\nMZ+'^L`!I(D\"`6M!`4-W7.?DB&>%N9ONA@3GC9.<H7V0&F6YA9FNO]:V-;3EL\nMT[3X\\>..1>VR[MHN2]FSER(=X_.GZY,6]C3W>\\FZR(9+98(?PPQWD]9K[_6^\nM/RWWQ6\"]#2<M*U0B@H2VE^<UW<?1^H^CA\\JZ;JN0_CB.PB4CIKSIX414]<P&\nMS=UHGAD?`<!'*=JR+(\\F>9]5]9G+MF7F[7:S?=^V;59?G.5_/U.W'X>KN3M'\nM1'?KO4N>7M!::]_;(Z`T;ZX/1,=<_8_-M_?>6MLIM:Y@F0,,=_?>ST0B0BAG\nMO>NDW!\"EC9;&29Q\"YIXV4N3Y^1E-F$H!6>83%,0O5)Y3X40A\"`B5ZWIMZTM:\nM?OGW+W][^>7I255U3\"_2QV#PXRCZ,\"&?42Q.RNE=`I)I2O$/7<L]'X2\",49O\nM(W7:M6.V\\\\S.`#-S(21S9GR$R1V4'.Y.(DXX6COL\",(8X^O7KU_Z_=O;6R0^\nM/;^(%`XF&DLIAZ&ELT`6MM:_M?9;W[^.^]?;MV9>(+_H]?-`-=M*M:9_>=Z2\nMTKQG>BD\"YG!.I+*,]#DL&F&=)6JEM3XY<W*9;6VD!*%9/\\-!Y[E99LWZR6L4\nM*$LYLSLH3&56Q,TO-#,]X&>ZE(B-Z8QA4C`H&\"Z4PD?8$=;#'3G=^1/0]5S^\nM`DX6!'F2<:6BJBR'I9F%&:O\"'!`NH:I\\N\"$.C:5NJU9F#D=K(R\\+<:HLZ10<\nM;?1]W[4N5_.064T@$1&6@630ON^UZK(LJNQF\\X;L'[W4/R49Y(_RE8^J%:*S\nMCN8XCFGB>TPC'AZRB#\\45%7=MFUNJH^&&0\"Z+>OCUGA>&8=-#\"D`<QMCD)N9\nM)9.9P6-9%JUE&EOG:'X\"RQ[)CH<$PLP(8ZU2ZGJ13$_;]W',E\\H2DI#\"FHR1\nM09%P`17E4A;A:B-N]]TU@Z5:`H*,F^7JQ)!+RF)\\:PEG&$N6I5R7LO7;_O9]\nM__'VMEXNR[;-7N;YG-`C!7!&A?\\8\\4W9:<JI<UA!2$*.QS<QSWRB)QR)B/2S\nM1Y$RW-+\"\\P^?*A/@Q$8YK:K#^Y`B!&<,][WUV^VVO[]_N;W^N.]!Y3__T__X\nMRY\\_*ZF@`^3<1Z0J)<L]\\.UV_-Y>OXWC7W,_?*Q4*J_7=5E\"9*NT%!3N,8:Y\nMI\\_!ZD\"Z92;8L[(XI8<EPL)9I=Q]670IA<#AR/.]B<S]E.#E_%+.050.36+/\nM.=@@/NVOCI_FISX3'T!F*`?#,=-X1)0IY$(FV1$]1\\!%:=&R+9=::T5X6O?>\nM_;\"@C&\"G9(1R.`C\"$'$21.GYI*7UZ;E#<`3GS/KD\\/?]8`$7@`D1MWV_]OV2\nM+PQ3SA\"&$7A:HA)\"PN+N>[@@M12&].[[OL='S/WACYW/^6CG7'2.\"?XH4R+^\nMV;`Y%U1$`\"<V:HSQ\\+O]K\"1GIO[48?;')ONX5@9252>#S\"P`/%^O9G:_WQ^;\nMYUQXUL>L*WJL^]->:!$1?=\\#O\"REZ$?0>-HZBY8J[,1\"\";<T12[+LM:542Q:\nMMSSVYFGBJUOV8:VU;EY)1F10F%$_[#B&JBHIH2@Y@F[[W<+!DC3.%9B,#PWP\nML18?DK$!#@KBV:47B4CRP.R08E)+&V.XQP-?U[.?;1SA?0R/2.6?.\"(<R$@B\nM9\"`MO!D6E7)=\\SCN7V^]']NZ5HY];__Z]=OSY?EZ?7ZZ;,)+[UT9XBD\"U:EZ\nM!R(YLZ6/C\"K$M6RZ/066PH78.(S<TX.\"9G8J@Y#PD,13796]H5'X86/W4?VD\nM+UI&'^8G-ER[#6861$+<AV5*&BB4,M(H,BG!-'-O1!3KN5KI0V1F0!B3GIXT\nMOX'P.31-APH*LT@I14@O97O9+NMZJ3D\\X^C[>\\/M&#8?H$=>3JK225/6@14%\nM9J6435>5`I*<8C;H=;\\SY[(6J101(UZOM^NG3Y]@/;V3*G')CTL^);.486T<\nM+7*LI:HN891)/UM`YRGO0SN(95E$Y#B.?=\\?;;NS6/+1^_FX`8YA#YURGEWG\nM8?4QM<],O;^]GQ\\F2')17;14T9E.FKX>,(TQ\"IUEI>WM[;;?F7G;-E5-P/*,\nM5,WR[4>4H_>^5B4F=]O;,89<5YG#QBD\\+3P1)BJL+$5$YI.<A.YNS%0JPGH?\nM*3[(W[V_VKBG#<HG^\"%$S$=KK^_WEY<GK0NKM(S6[?UH^[#KU%4Q4[B1YG]8\nM7_[['FG_F.MC`MTR+=S\":UD_O(6<\"??)O02%Q[\"(\"\"$S:S:Z6[)4.FN:DT')\nM$9%,D1@QIF<60EF(:UG750JU;6GZ#N#M?K_=;I=UFV_JZW#.K,15&\"R?RMIJ\nM7U/?XFCD%ZZ?N%ZY7)BJD()#))5)63ZL%4)4I(XQ@P,E+#W),]_NMZ\"H3[^$\nM9L/P\".=D*5'(.,*ZB(0NF\">I,(`'LQ*0<`\"<E`1.#L]DCE-V%YS.BHG)LHCY\nMJP\\7.]RL]T[IA7A;%WIY)D>ELI1E*[H`22C*$7Z,8YAG,$'AH*0J!>\"P),\"Z\nM1P^$@\"62$LI:9N-WA(&7A`6@0=['B/;^^OWV_'Q;-R+6PH8,(2<Q)&=X'%JX\nMKLOHN+?.QU!9I6CD']:HQQEJILQ$9%W7N18>B_/U_>T1H_VY6VFNS%E5,*&C\nM\\SCZ<(EFILZ_,:]V4Y-]I)\"F-7[NA).T,>?R[CZ=HF.,^_T^%=27[3K_=/(5\nMY^M[B+]2JL4MPL8X!Z-MA!FB3,Q?E>*E++5<9@=G`(>-3`GBA#HHF#I1RQR4\nM)@RB`7)E7J1%?]O?KI\\NZ]-6+O7[U_YV>]W>ZOO]]O3T3$CF&4U$8&+_$)%T\nM%GN?(E@$S<&A8_IX,C*)>6+4B$BUU'4!R7P':?O][+Y*MG#/&`A*NG)18IIK\nM(8$@0E*D4QHRO(W>#'E]N2+E]G9L'I?+\\[76RMQ:._KN#*DE]B8`A0-1DOY4\nM+W*A788LVB+(\\9G6E715+1?A2PF1D$H%$\\(3`4E6B):D&`BB;CDL.=_W>[/V\nM^?.?&]ET>-9::UE`-(8S(3#?KE@H(4S,Q&>VCP@@)!,)=4I!%#^]\"M-:)-,R\nMZDEP$19/#5\"2>+H%NN7[(7T\\2;T\\*06E?_\"X//\"!!P(X',&1PT<V>\"B7'N[A\nMRG(,N_4N==O=CB--I%ZNEVV#A^V-\"ID?2E`F$ATQ:+CON_=[C\"OIQES/LBLZ\nM*Q@T6;30\"A%Q0QA&[RA_S!4>UY;YS-]NMWFV_'AR8NYOC[WG,3_,S,OE<K_?\nMYV'S(:#,]?7'<73NK?-C'IZ8UMH<4`:A]SXOG?./EG66I7`\"PZR/46O=+A?\"\nM.0.92M'#[++ONR>1Z$>X^\"2RG6V/R4E*4*02%*3KLBQ%1A`)F^-PVWL/!V2V\nM-62!5B&*S`@!F2`%>[8679FA--C?CM=__[K^^OKVRY]_+5(!BP@$&#2]VIGG\nMC?D$X0#V&$68^1151&?)^!2X`\"+,`/2\\,A(3F;L-;SX\\@I@AK([\"PD%&^(DG\nM\"L?H;A$V>IO(D6E9_%,4SK@NZZ*%R8>UX$3A-'%X,Q_F`BQK^9RTD@DMSCS,\nMJ04'HLK8U!=:2,V1(V.:.D\\4B@A,)AG60EGJ4M^.M_MHO[U]?[I<GY9K(:$$\nM1^I</,K3+N,^YG]S(CPIB$YW&B$%0<F4CL!I[V(AIOA`^GB0!81%73A$4(C@\nMJ(YXO^'>U(Q)N8AS9A`SI4<DS\"QF(8QH=V^MC2X4*%5[3TLCJ8WS'O9<:X0[\nM4L(-X%)7Y42YC3&3[H6XUKH03_-UF%$.XA0A$@$K9IB25G>SUH!0U:+:#F_C\nMJ*P_\"Y;SP9X]/S]7NSQ\"`LNR/*YU#\\C+&&/;+K76.0C1LXZ9?K;:`M\"'I;.4\nM,FVL]_O]?K\\_/3V)2(3WWK66Z_6Z7B_[OD?F)'AOVW:]7A\\#S=N^SSS5SSV^\nMZ[KV$S=]9B+3SNU4N`@7D8=5BLW)_9Q.3@!##/B^#S<F)@L9P18E:0'[K$HU\nM#%@M!9R['6QP<A2$X,>/'_=C=_>EL`/N29&JY6/6]S\"'G7E/?N0#)GN$4$5J\nMK9SGQ=K=VW&TUB8D]WJ]MM;VXSCZ,6QDIJA0*6(@@)(5X7G:*1.2V5OO\"4\\A\nM\"S_NC4RNZW8MXL,6X2*JRD!8!@.C3F$HR:V\"%RY22S'Z9=F\\E!XQ[EW&H%7]\nMPJVF.1W=TC,YUZHT]WRG<$\\/92HLK*K7I>X_1K???_^]_D5T>ZD0ZAZ]J90*\nM\\97G?ZA93I(Y!;F[EG+::*>F#!\"\"$FPQL;G\\(0_2F5%T`#2<2JAG84122:)F\nM.$:V$0)2FN!$J85@.6E+*G5=\"V.TH[LEP\"PLE<0)BB(IZB*T+)3!\\!0=B`S4\nM4BN5O7_+!#GIY)P()#/ZL'Z,,8J-Q`@J`9EQ6U7-C)YA[6#FI:PB]7*Y'/V8\nMR8E'(OY!8'JLR9FK^/@D^1@GS@^9FYF9;]LVIX(_XY<>^@L`[7Y\"T/IA:J/6\nM6K=U`D_=7?GL3AM]C#$X4U52=$XS)<$L@+MY&WWV2,V%KL0$N$>8:R62C!CN\nMPV)O]G8?-^JZXO.257TIW(KNJXY0J9>7D1$<R=G';MA9!D.,]$?<OOJK41`X\nM9=Q6^_)Y65L*1:TJ^_U2U_+\\ZZWN/Z+?7_NW?[N]_GI<_GHMRG`+:Q982<]V\nM\"B5.3GC:R-9%MGE77TA*F>=U]F,RED1H?J.2\"4X4X&'];;^_WF]'CB/Z'@U,\nM2ZQ$482<;>1@+<EI2*YJ3?IP[\\X@\\\")/[.Y[]DBY7);\"I0118C0C%8O@(P$D\nM)%`[LY$FBW$.9LK^Z<K7/U]LM&9P*0)6&8NHB)!`19J-GCL8EW7M,6[]3;8\"\nMR'[WE?[$\\O2MO_W^[=CHN+Y\\$J3'N%$DH;FR<!$VT&S0X2D7YV1V2#HR0\"\"%\nM%BI97T=&H#BM3JJR,I5!]$JOVZ4L!5L)L&7>!K6;?4]?V^TU3:C`$%GRYH<U\nM_(>UU%)[\\^/+<?>FJU1=]_>W76]C&'<),PI@%R.QO/C316JQ]!X!?E;55<JU\nME)1_^/'C2^OWYA3NO;NFC97TQWUYMA4!=`HB,HU2G`<Z63QA6R[/I11#WJVW\nM:`]VX[Q;S:4UQJ@B#Y^&UEI5,W-9EGWT!QIF;FES0RHB0B>D@IEGJL#<Y6.>\nM041ZO]_G/_,($]9:Y\\)[\\&T>_,+Y.N;E</XX234?NJC0.4*<]RL1>7Y^)J$!\nM(R=W8O@'&#\\FT'*RIDYS.K$$P-PSW<SZH$@A%=#[<8PQTF.&`_(C=KBM3T68\nM,AFHI:PBGZ_/MZ?WMR/VU_NWW[]]?GJZ7\"M)S4Q1\"F-,MWP*@2;<%#)-%!]4\nMJ#R#\\0!B#\")RD-DI6#,2X(Q!&8RD:7J%$%1Y>>(GE6(QR$'.(%F8*&G'J.`@\nMT20`(>0R#ZIUE5)%Q1`1S>UHK?G069:4GM-&AY$A9EFVM3`7K1.4``'I8L!5\nMUK-@G4)85!\":1/3V]MZZ]4B\"I$@2P)E$\\TFZW^]OJE>MTT7*Q)K$21S0DP)R\nMIM2)I\\_+(@\"F1X:`F1\\9O7.C8*=D)<A$A7HDN1.L^VCVM=W>L[$0`Q&.5#!$\nM.2V)P,$$R<P^O(<%H9EZT$4O=2EION^MM48VZ,\\NH@H,&\\=];]N!>M&E7F4)\nMN[!XHF<$99\"9'3M_NIY^-,6$LOL9T1R59.J+1V_#W1FE%$[,$]^#P/1(=3Z6\nMP]R]3O8G,R4FWVEZ](M,85OF&GGH-#-C(?3'#WUZ>GHDH^9W=KIR9EIW]BI.\nM6]V45J5W!AUYC#'Z%*=4Y_/2>Z?$E$RG-7LV8P2\"'/!9,9;S=71KRSF<G,FA\nM$38(.>EI[B/:&!,4FY3(L*#D(K4@B80]%RHE9-6BRH043QI#B:ZU?MJVY2IH\nM>/_^?MS[MFT6W'TV2>I9<IRG*\"Q,I#(YJQ28O0\"9.<TQK`HP9X:@ZFD79!(_\nM#D(G&%-JR,)29%WX6JAH*A*SB4-DLH%):DLHT8R)Q.!P1@H76F=UQG#S/,<D\nM2>)IS,\"T^0.S43N);+1E*0`\\B4A*82E:P?7#8)5!`0[7C&2A%(62)))+$&>F\nM+'59R';/8:^W]\\I47CXOPA\\^1N+9*@#,,8L\"S'-PY=/OS4J4)>&1).#)!_Y8\nMA#9#4H58,>'VB?1DCA'>_4XCU\\*BL.'#.$BFK\\\\H(N&42</C%J,C.B4M3^@C\nM:%MU`65V+5HO=>.]+:6HR.[=]V:MVW.$,CQ$:\"D2R>(LE85%D1\\NB[:4K3`G\nML45&A&AZC!9CAAJD3/$WE\\ME#@@>T[]'`_P)K/NPLQW'`>\"R;IF)\",K,M)F?\nM5M!^'*VU.=-Z-,G/R]KC<JC;MAW',0^IR[+\\G.:8:WT&YQ_IX^?GY[F5S6G$\nM6;/N;N%FAC@SN/0!!3K<`G%X&]X3;J.W_3CVW=T\\(\\+&:(;6]KL=![F1@0HD\nMV(?[B,S92T1GY@.<\\T:O8`(9?,2EELG8R6XDO`G]^O1\\ZQ;IY.C-S#*\"AE-W\nM5!1@FK5I(K4S!0F6(/H(5E!&Q*Q5HZ!`N'NZN7NZ>P:`,>Z]'V,T#P)8I2HO\nM!>46J9$DRLQ41*8C,>TB*]402;;PB)[>!<804W/K-B*0!!(5R9IR?#]HZK@Q\nMI^>)U'#BS&`Z^C`?1;A6163D(*D9\"$=@!HF0P6\"5NG&V;MY]F%/S<#H;^5K$\nM<?1;/SXCJS#,$:D!(`5@A!\"820#*3#[/!Z`$SF:IDR7#<^250(\"\"R#.S$'$$\nM)1$'E?DY,(-EHKI(\"7,DU>\"(]&X):69O[;@?[=[[+4;G-,J1+3F&'WL;&LSP\nM6J40\\?!B6969B]*)!!H<0\":<\"$M1@'N?L&>$^SC:ON^Z/\"W;Y`\\E(I=2(X+B\nMI`T2$65,R0,?;6>/(*^[5Y;I?3G)/:HS\\T\">9V/G7#LGK8Z<\\)A)3'_50QK]\nM(X=TO]_[Z2,[P8ES5YQE;D1T',?T=L]7LY8J(HL666DNZ(@X8?TB$R;)S+JL\nM<_/M;DF9X9$!2O@'LU%)0)GN86[->G/KRZPX)3[CK?,-&(+,9(FD[L'!6IA9\nM$=[[F*D?52F<57E1S76A;CMU41&1=/=A4J269>*D<Q+[,MR1'FZ1'I8&(/*/\nMA-A\\I]24\"`^?G4OA%`C/]`0%RUQL*E7JI:QK7;;OXYUYMK9$378X,?G(+4.)\nM185DIKJ3$(IL-AR>G#'1C&YCC##+<T-V#P-`P4Q,R963$,=Q,/.V5!&G]`R+\nMLGQ4!?)'ZC^9JR)\"R7**-C;GED2\\;1LR]S;VT7?K2]7\"+,0S;)D125.K.NE3\nM(1,.F<0\\SU:9'I'NR,@Y9)X$JUE:.'.;.1TU+$3L*6VXM8B>(8Y!2^I*RXC1\nMNKV3[[U]W=^_'O<W:SM%ETBAC+YMZ\\*IF>(F!1C1VO=M_;-;+ZZ\"G!FN4JLL\nME7+EOE..4@M/JU<SBSZ!+E+VLA[+U5ET9DN/V_M40`S>>@_S::;[_???3RN8\nMZF,%SO?3;E;&>.R-<T5MI6;.J.DY3DP\"\"Z>=)*@'V>D<$V00$.%$I).?,>^@\nMYU@B8H[=Y];WN)4^VF0>C.\"?.2Z/P?<<%4Y/X`PK0)@$&>D^@FCVI[;:F($,\nM\"B<$TCF\\J\"[+-BB1GJ+!TLS<6SH&BPO'S#JIDB$]W3-%C5)BWG1#&1'>VIX:\nM6H0YW)M97V2I+'X2FV:V;3[CYI&(F/EQ^LG8-M.Z9``8<\"&&!'!FPXZ@EC22\nM@UF*EK64I8B\"2O%YJ72S,1;2*AH(24HF%W+,L`;<<HR1%2.]18\\`(C&\"AK/'\nM*H5EQL@F1ZH(5Z1<EPCPB)D9Y@A$N'*.L9^)/BF`NOOTNQ8JLT=7))A[4O,$\nM,2^UNEE;2C/[<7M?JY:RR@S_13HEYC_PH#/'8!%FF>VTL_\\S(MP($I.EG&<O\nMO9V+=PYF\"6`>B;?]^/+C_?W>HHVHBW@P.#R/YO=CW'S<Q_[M]O;M>#_08N54\nM3>3\">:E:1\"<ZNU\"!AV-TQ+VW12A)I#<S8Z7MNAH&'3NBIQ!)*37=]N'I?5@9\nMO?>^'WT_=#OMLK?]#A4I.NVR(DR)C-\"/'_,D^3B%SES(_)W'YH1SK)WX*93#\nMR,GQ>=P>'W28V2'W^/LZ>4_STSWB@O8!HI]NMP<M8XPQL_8/6/!C,-C#']F\"\nMGX./E,G$2)QLG&.?X_ZDR/0X0]6)2`H7DK*M-IH;4CF%>_HPS\\R;QZ!$$81\"\nMV(,S$$Q':\\M2\"!_>J'FE8LA&23ZHF;>P!B$&)#/.+K0$`>Q$2>3@$*G35/X3\nMX9P!6+.8(,0PBS&L'\\?]&/U']];ZT1NI;$*<&A%]4-F62#`BD6E#@%(EW4B6\nM`!T9QU1R8@Y>.S;?H^UVA+D$5\\<&K45OS28N@UDRDY/($\\@B$LP(2A:P1GB2\nM%U7+D8E)F`%@UMTSHE36M=!3```@`$E$0502=X(3>Y(';!K(?(@P\\[*N[;C?\nM^W$_CJM4B]!E#20E@I\"$`*;P$G,02C$GMIC-OW160/[\\7CQQ\\J1Z,HB9#+3W\nM_N7[C__W7__E__FWWWW8RV4KQ)3!*O?>CKX/%T^[]?OK<1]L6I9\"Q,+%F#J/\nMR)ZA)\"8A(B;KG3S3*)S@=K/7U^_'\\3<`H576%=::-Y:R73\\1RNUVG\\.&^1`>\nMQ[&5-9F(<UE*#Q\\Q\"G/=ZEHJ>^8P\"GEHD(_4WL/I<O8\"AI^7I'F&^C\":SL*_\nM0`;B[>UM_LZ\\`CS*8?PG^Z1>+I=YNKW=;ON^3\\%SCOD?@\\5'?-C=F?^X)2[+\nM4FN=C#?RD9FS8<_=^W[,+3'\"&3%BW/?[_?[>C]O]_7VN?''W('<@9Y(UTL/\"\nMV[!N(S)3&2H3)?WZ^VL:`I3(;AYC9(0&7N_W[;*LM;*>%79/3Q>*?/WMMV'1\nMQM&](YW2)VRWY;0U@!B(/&$6F7X&<V?$>&8I!,\"ZKF:=S89GPEK8&&,<.^IS\nM6D*#\"Y=:RU9%->%I1N&5A4D\"M@)K>$::CQYTU]PY@JEB%JSF6[LW[P9C9?8@\nM!TW5QED$*I)))X@C*3P9P:P0#59F]C&*A#*QBGL\"SD+\"),I$J<I/]6GO#>V(\nM`*,+,0`6V8]#5,M2/<;H?HK=W:[K-L]I<_V`*2=JYV.9S<,Z3K4FB,H'FO6/\nMW*:[Y[3@`@D.Y#[LZ^OKO__VV__^W_YO1OSYY=-2*I`H<E@;Z5L4+M+#]A@6\nML;I7(I%RP5JQ=A_\"'&`;02[=E8LQRBK$GD<[7E]?9R\\2ZU*6*[7[L;>2N2V+\nM&_Q]?Q`5SC&=&1?-\"\"0K,X0LXW;LUOI*(DE2ZB-J.)?<7`43B?;XY=DUE*<]\nM>/YD\"BO3E'*Y7$1D)@Q/-W7$W#E/]!F@7[]^+:5<K]?KNEWJ`B#,W]_?;Z-I\nM^D*Y3\"AJ8A&MEZ=9#O-@GDX05:TU_!`IE%EE%5T;*C;R87V\\C3&8>'$91N-(\nMNX?RLCE%^$%AEM%I\\2LXQL@=:E8P7'M>G!6E40RW7^O:[F_M=@RF>Y$A4`*[\nM7^#_]B__O/S#W_[RU[_UW5[]5JHT&=R7;,W<;Z^W_NG/ETW;\\*W65;6U1I&1\nM9MV):-%BL$@P,809C(P(4`@127:&EPSU/`R4XJ4.`EF+/`C&5)AHTT55;[=;\nMN8CW&&:E5\"E//:E[@'E92L_1;;@YW-*2NU7+%WEIK0WW.64]>CLBFG(L@X2X\nMB%#)[M%[$:R7-3UTYM3&\"`4D;APCQXID$64A`F$L%W;B0:/S>ZS98K<\"+(HC\nMX'D_CE<]%\")>/`&*-S26.Z\\1^%&6XI81L91-E8$4$39GSH*@D-E;7[)0\"@W7\nMPB(E,RT]':E$)-_-E\\*U,`IN=OOJQV_%_H_[M__UQ]\\OEZM^>;N6<BE+^-FC\nM]K1<U]1:F);\"V1S]&,DLZY(C;:DJ%!P(07#6RHNM:JP=#-V4K>>W;S_^PS_]\nM#[]6/P*[TA#R##\">+LO;]WB]O:.`5UR9CH9\\[=OU\\[H]4PCKXBSOK>\\VK\"Q6\nM1\"&%[$%V.JM3F%5UN6QS6SJ.PT:OHJ02[II\"<N89)LO/ILH7H:5PK9,O*A^M\nM&R%0/0T`VFU8^'\";,(SGR[64HDO=.\"+\"6H\\VY@5/F\"E/)_C#PSK7X;=OWZB$\nM2*3%&%:D$J36-96C168N2UW+Y^VRO!8=UEMKLN#`?8P1Z>DMR:2J4$;TR.X^\nMP@9':G!&D>!>X-H&#]#T8P0LG>(HV8[[;]^^7[?+R[H)<4:0X?-?_O3C[4?O\nMQYNUU_:^Q\"JJ5#GO#@3HS)[,@X'EZ7^/*>+!'YS1O1WDD1[N[IFS=7!AN!DG\nM2%A+$=5IS&?F2=<2DO0Y=)Q8&KZ_O0]*3T\\*CH0Y.<@QVA%FG!F$,(.9,J]<\nM!DC!ZN#,L.`435++]_U65X,HL:HH)3*S)'.0DE829251)[8I_G0'LY`6((D[\nM!3-\"0J(Q,0=%(!S>X=T3:6O2&1!,>$3:S&]5$)@BLW`RH7`4#A6F&=69D@'3\nM@_U51#D2PS/\"D8:XF]U&XUFU8&[,@RW#)_9JJYL@V9.)A2IE\")55UV==E*60\nM(LYB]A'A@63V#)OE(H!'-!N]]^7SGS*SZ$*T]S;NM&^BJG48F?GHYNXU/SJ(\nMAEV>GIV815YJ-4@F,;A0&>.8*VKRW<Z#0N^D,@^H'TR`F'S1QVXY'ZH'%>[X\nM\\?8X@O[<AZ'Z1VVP_L,__L?C.,ZSK,=P[_U(Y%KJQ-2<J(*/SJ;G\\CQ'&E/+\nM>>\"E9JF-S?I.[P2,,8[C(/8Q&@O-9IS3%!:Q7M@BW(9'#W30`/6@=#)#2V\\(\nMTQ!.TB!S.11-%M:APJ5(#B_(!7K$_KIW&U^699%?_[)HT60A]1P.-TJ5=$)2\nM$'MO-QZ\"\\%F;-R_'$9'@R!W@F*B)J<2?!U6*)$]89)OG58N(@\".35&M9-UZ6\nM`5\"`2:/?BM9IAC3+S!32H&0G(2P0R4P+&I$CPA,MZ:,A@P?EF\"U(8)``\"(L1\nMX2[$HA)NZ)8IB2`Q\\9(2R9[#<MT@Q\"*E+,R2D$$9.15219)%PKMXGX:'BJI0\nME1HBYJ(0<F:*,=E$R-G0QD'D2>$LJ\\SN5\"&ED\"0-TTR/>1B#JM9U4=6I:6L`\nMS5UBC&%$^^C?[^_?]CM-@ZAU(:B0)%3UNJW7LF289BHKQ$<,ZBF592$%Z>3[\nM,(8[13!AQ!\"(9Z@\"R9YVW_?O;Z_XZY]J69Z>GB)M?W\\;8RPDR[)8+SZL'X=?\nM+\"+\"AO?62:O90\"\"+K!=B&2/#(]BF[A(1\\\\(U19J/RV%F9F%9MSJO<H[Q^NW[\nM7'AS$3XL:?/#IV#YT$J8F44?\"`Q]>WM[U$B`R,/G`KMH799E6]>'\"VZF&'_]\nM]=<S_6DV%=09NF_12UV8+#/+A%Q`$NZ>1\\31]]YS/V[?OW^[W>\\LL__+$H,Y\nM\"C+UI`Q[MH@.<F%(RD2.DW?SX<,R\":RBI5(41(URHQY$7_>]?/GV='E^N;ZL\nMJA*P_4OTQL2++LJEIBX)W_=A]>'](Y&,R&DF2?[OFCSS0QH4#J1%=D1W:S;&\nM&.86YNG!2Y&EAO+(R$RAV:(\"3IB#/)C./CY-40H\"TBFZHWFXP5--\"!`A$5&`\nM(WRXMX,TDR2&M=;2L6CI\"B)2(7J``H9#`N16B6UA'E9(RB@%T!0F,+145=64\nM;F$1ZI0@)54?DE`!<64&9F4QG]7%DCR?(@6I*\"A+%@HPA2*9P38`3Y\"C8MJZ\nM'V_SS`#$*<(RV2U,<#?[=G__=MQ\\M$P/,U5VJD6XUK(M*PZC<!9:EUK*>K>[\nM=\\\\>;6DA%:)%.9/VUGK$NFT^\\:J(^<YNW6[WMR]??KO]PU\\OE\\OS\\TLIY97E\nM>'\\#>*FKUVUX'\\V\\C_2`6+B%]6._08MH(08!0B?8<MNVS)P,M+G1S0'X`W9\\\nMDEP^_*4/W_99337?;,WT8QCX<%E/A<:9'^M.^W[46BVBM5:7Y>GE>;J9%H,D\nMPOV#UWDZ;KY\\_Z:J6HO4LYJT3<BQP,Q:;V%NI6S(6HD5%IA-.F:]M79O1Z15\nM7>%[AB&,$4S)!)V=QJ=W!R)*S$B<<E\\[W-W36N28/J&1;B[79=F>C_[CM^^O\nM3]=OST^?A!26FV@C:8Z^Q_W'W=:G/VVK)6YTMC4%Y9R\\C.B>6&81B%F>#'+,\nM0,#HX1DC<B2<F%B5@HA:/R)`))AG/X\\$9U(EX01&DH>D$,@LK`V+\\2%N60XC\nM-WB\"R&U.(:S,D6-*F%OOO!(AS6PTHYC5%9/9[*5,*\"1+G!=8,HS[2`Z2)#6O\nMA6NA\";E@`I%&4.:%N6LY*)AY?W\\W-UAF4&^[*Y>*34K&].8F@LS,\"Q>N-,\\#\nM/$NC,('1R`P+*O1H\\)U/B&#N&FRLI,S,`1RCO]WWU@?<8U:`,%%A)F5F\"N_M\nMX$QFXD6JEA$2X9)HG\"FAE6JM;G9_M\\,'ZZH#/.D(L[`@;#1Z?7W]_OVUE&5Y\nMVE1UM-9O>P85K>MZH4:4\"/<P3XFT$:SO[^_;\\XL261\\C>X8(!$A/(J(94)I?\nME[NK*B6415B0\"/-N/O'!3Y?KP]KV6)S#X[VU;O9(%7ZTW_)QN\\\\91*U5*\\GQ\nM=CM&UUI<Y.OO7V:V^GE[Z;W?WV]@*K766J46,WM_?R^E_-S?=)YWS_?Q\".2P\nM/NR@M[S?[_,06]<B23FALD!R/NF&8]S0,B+=J#D-1X+!`DE&*%'`!8/'X+:J\nM8JM&OH?UZ`B*3!LH>$:]WNMX>__Q]R]?/SU]H@!;2&NO]_;UWO+'_N7[75->\nM_O$?.$D+,8L'+#*1YM$]PG$IFLF$),+)WYV#>T(\"P13*\"9YFMK/P,@$F9P0E\nMD(K,A$+2,\\PH*!'AL#%Z:ZK+9&.P1=@4T2:(,?L8-H80;W41FF48&':V4+&6\nM##A-;#_UT5**:E4M))JS>A=).1(&:B&JIF)\"2V&1(C7\"R%$@&^4A$<CAHR[<\nM#K<8Z=&M)7-2E55H.#&K*$6.81P$!2)7!D46HB0E(GQ,%$^CR8=^/F,H1)1U\nM%0I=%FB)T?;[<7M['V,`682&*`I350$GO!W'51,>YMXZEY7R1.5+T7+=MJ74\nM,D'T5?I]6!_/9>&$1/C1(2P!MV'WV_=OKR_/G\\NV`F?'<B8!O.B*R(!G4/K(\nM\\/#A0YK3LJWI9AEF\"3!(+6C6\\YZU?W:FXTLI0J?\"^3\"@/8PUCQ#P%'*FN\"HB\nM\\](X0T7+LOS!1R9R]^,X5#RM];\"Q;I=U6=_W>WK4NL`\\S6/8%\"U*K5)+K;6N\nM\"Q%%YAA]UF646F?R$,RU5BT\"1&_[&,-IM#U450OW8Y^.V`F!?:H7K\\-UCPZ;\nMX4DC!@0EDYP(\\)$VX$UZUU&AQ.7`R+U9^B)UK;QX>@MF42T&^O+V_O?O7VNM\nM%ZU]]'_>W__^^X_7^UA5@O'RY^=/C&N95'B/\"$@)0@*LXK,Q+(7`S)F1LTE+\nME<^YN(,R<IREM@PP<S!-$O=$TB3!AZ5')F5&6O;>K8^(\"%G3DV,JL(P4SQ%(\nMIQP,9V1$\"YOR9@H?UD]31\"G([`FB9\"8S,L;9J&T6WCV:*&L<#`21$31$7.#*\nM2I46:-6@4M9*J(SF'MZE$GL@*(4IT\\D&=Y/*#5RJ,A.C(7HX9TE@X3%?07*F\nME\"1X8';KS<;\"B<5_[`8M;*IYR-SW]OK]^_>O/X[W^^QU&3.2*2*BXM1[OU:`\nM8F1K(U>G@(/\"88OA4ZF5BC=;6&EYXF;M;=>7M8A4EG1P@(G#['B_?_OVXY=?\nM;NOS5815:RE5/)\"L)-`ER#X`_P'WB\".ES%-B+96%(T#),CVW'Y/W4_\"<7N(Y\nM=INNIDR?[NV(>7P]Z?HS@9&YE,*U9.:<);+*++UFY-/E.F72,8;N]_NE+DK<\nM6]NV[:^__#K\"A]D:LFV;1^R]W8^]]ZZ$*:-/7?1ADSMW0M8Q1A]]@3+#W8$H\nMI;@9*'KO[_?;ON\\6YSN*M8$1FA)4A`-22PE*#/.I28PTRVAHG;J)V3$##M9\\\nM-^2J6DJI$;?=0Y)914L?_?UH>\\1%2WRZWM[>_F6___-O7\\GBY4\\O_]/QG_AI\nMV2(8=EZ/!:=/2-3N1\\3L$)I=,3/9\"M&9ZZ,DGAS2T_4'$N(\\\"QE2F&?CD/61\nMF0)!YFACO]_=O;\"^O=\\)J$`A+F`0,:F3AT\"860O9],Q,Q8R&6P:74E0H@X<-\nM)(N0S<3Y,,101L((7AGAG9%)$(*?TSTAX^;W*-O&NA#74K;\"C:E8OH[F86!E\nM%3(RZ\\<XM%/I3T2AZR3M)Q%!!9D0FQ%[$@;@>?;LI0XSHYFDJ4551969#QN%\nMH!D^QOU^?W]]>W]]'>\\-Y<Q'3R.XEJ(#/?;;<6,0S+PPA+1*]:R+EL,NSHHX\nM]K$LO\"W7P?<OMZ]T?5$IE24S6-21K7F[[S]^_)BE?:IEV[:^;=D&(M*F?ELF\nM]A=A`8J,-HX@<M%G45Z6J6@+RX-C/V^##R3,Z9G4TU_SV.4>H_S'3CCA-,UL\nMLBVF]VV.&==UG779)TCJO_PO_[5S\\K;(N@S$T9M',//]V'DI95NY*#Z(S1EQ\nMO5S#O1TM(P@(#V2JZ\":D\"410G'3A#%JWZ[:ILA*$2-S<PX5A=I!N;_M;CR9J\nM/?>6>R??8<$YA.Z0UX[7W7MS\"6PL`FUN]S:B8[7MR;8KO6SE\\Y[O7^^O;QA=\nMY?MHAX]EJ_6IO`2]'=^_W+[>W-M0#OW;+W_ZIW_\\ZUK68SB#.=-[5X&6[./F\nM-IS3R5W<)4S&$',U88ZTM$%F9#%];I;1]C$RG7F]/CU=GD<;X]Z*+KHW2=&$\nM6J([/'22!M)Y##%;B+A0)W_S]AI-(OJ$?G`VCCOLSMXJAG(0PGP<+<?@\",[@\nM\\(:PL*0@)2J2(@;>+;<!&,(I3T1981,>,EIXAV1-Y]8]6()H#+MWU[(<86]^\nM&.=Q[#'BUZ<_5Y*MKFP21Q2H$(.]+\"S4:?:\\J0=;\\A'<DGN\"P\"`E5J;\"4`J!\nM<WXN<5TE,MZ'_?W[M__KW_[U?_MO_^<M&_(O@?IINWY:-HD$\\N[^Y;B+@4(K\nM;XK*`PO*\\_)\\U77;MFZ6(MNGR^'^X[:S7,KRE(I:=\"DRS^D]^.:4>EW7R_9T\nM_>73YVLIG%X03,YDM_8J\"WGV?=Q+U76[*\"N#E$F1E;\"15DA-YF!*0D::9;@0\nMS=EKA(<;\"$EY$I%4M&I2MM%F1(@\\*(,)H_=]')\"9'XR9LI^CBWDBM>B!((86\nMT9>7EP<@[*=*83R*\"A]+_'21U_JHC_K9\"5YK#602CF._W^]F?0J9.<S,,FAR\nM5'W8S!!F^NS0G4?GC`F/\\#%L;[XWZ\\V1+L1(-ALH%4:S+,+-]G%DCYTTT^#!\nM0919>I\"U?-OU:O2\\SM>VK:OM_N7+E__O[W__G__S?[QN,P(HD_$'!Y$LO-BT\nM6X;/,E=$DD]J3TXC5K@'(0B6<8S>TXQG144@HQ`%LWI47:SWT09&NONL_DL'\nM&W(D/+IU'*,CB+.*[OL]\\P^VMR-55:O<;)`'N?.(64H'9A(FG[>.R&'V4R')\nM$6>K5!*G6K+,Y(EME,WW#BLCE>FZYJ4NR[9T.ZQ3HI!V:YQ<5<.<M4YAC*#,\nM'&P3',5%=4((IC$43#2%/DQ.G8>ECV05*0+)V(A*@%IOKV_W;]]^].Y:+^Y&\nM[K\"M<BDD,=*:6PLF(8@(E00C@XPT5'FXE64E@4<<O>W'\\=\"EP,1%.1$0MJ\">\nMH`CDU/\\^/3]=+D^%B(D&\\;9>03%&^\\/SC&0F%DF:)O^.,?@,F9+-YS;S9,,(\nM/V(6'S6X_02U3!>;\\%H7LK`QYO4OE3VCSG*7<1:AC3%F0O#YY?K`9^C+\\_-#\nM*CUW4K-PIP_KS=G>]!'@G_+K'V\"(L],O]G9,O-J]'1%!\\E&`6$HF37UBOAH%\nM:BUI/L_7'R/'LZ9K=+<Q8KC$/..Y->^]H\\9NO7LW\\A!0HB?2QAB]]=&3P%A\"\nMJH?<?>U))-?K_\\_5N_5*DF17>OMF9NX>$>?DI2JK62+90PYG`,T`(T@0!+WH\nMST@O^IN\"'@;0@RXDR)FAR)YF=;.[+GDYYT2$NYO9ONC!XD25!D@D$H7,K,B(\nM,#>SO=;ZUNET/*R]MM*W\\\\L//WU\\OE[?+L*)P()\"'-P5*)`@\"PT!;?C^76[5\nM3-#'5'/<(<%OB67PBS4D$02RR`8))<\"3`T:XFM86=@.0J*IK%&=7>W7B^QX6\nMC\"#\\O&ZW^=;@2H:+60%HHT>#D!C1`?$6V?-MO\\6F7Z7>\\0&MZ(PDB!;!NQJH\nM$3.2!AAB<L)`-S0(H(C$DZ2Z=T%$EMXJ$S%*[[T!B0@#9V9FC$`,&^TXP\"S#\nM&PSC$<R(\\=KW`LB!Y(1.8`30:G`F9VI.:[//SY?KUHV(:,^(AP2G5`!@W9KM\nMSE:\"W&'$-Q,J1#6?E($QX7Q8EF4\"N(6)14185KM@AV*IY`R`KF:F7G?5=KY<\nM7I[/[QX?IKR0));LV4_TN*Z7D4@>WW,@GZ82).I^JQOCE(`I,1$OA\\E>$:Q#\nM=(E;$4U%'!TO>@M8CELQ4TF2$@OGH9J(IZ:]UA[@/#`.XWQ(D(O4NOV\\\"*WU\nMNU5\\M&3?O=?_!3UJY'K'XV&,@WXYX9FRB`B)'(]'3I(2]][7NA<1<'0\"[9T`\nM`:!(.LQSNZSN>H<.#P%T<+PR(V1-$J;>3%NW5E4AMGW?K8\\&221B`Q+:@?8=\nMKM8@A%)F,^_>]TY='QX>WKUY^WS]M$R(AVEM]8<OS]\\\\E#G-82`&(MD;``@\"\nMUJA$E#@3F%IX>`(18O5^Y_;\\$I&,B2A38A((4B5S4[7:M79M]JHX0E.M79O;\nMBJ@CD8C0!G3-U0&NH$3$P,AD8%V[]^#&S`P1K$'^ZLUW=``\"%90A/MXN'I@2\nMI[,#`^5@<9>`##@3949M*D@(YF&*L=<6JK),*?/$R2S,+7.JI&;6NW4:E>JW\nM002H>YAW5`PB@IQE^#]<AZ7!5(B(19A%6(2%@-`10M1PL[CN>JG]^;JWVD%8\nMDA[+_#\"G1=`:5$,T8N`KJ!,=2(#%0-5-`)1Q2B13D9+!+&>QR3,G=PA%[=;=\nM&`+1$4,@/'2M^^5R>3Z_K.M[(;;:NX9(*<+[7MT(*2)052EE9@YBB_\"PU]R]\nM$0`BCGJRH<>Z6=<;=\"\\(!_#Z'LP=(:G:VW9=EUP.\\X*(33L((]]2\\D--N/7\\\nMW?!+^6>L:MMK.>4LR=T#(.<R(L/+LMR;ANY`F[LL<:\\U'=?6WGN>IEN^P_S6\nMM\\44$=K4+`!N0;7,4DJ9Y[E?5[/N;B+B)JVUF^Q&D=+-_[5;M]8B`CF;=3,P\nM10]X;3J#`/!EVNOVTG<\"+,P\"]-+K]\\]/W[Q9),DTY210,GM)E[W^]@]_^!</\nM2WK(.-:R2$@`D0>T:LPLF5$EHH4!`A#S/)0'\\P9AIA$0UL/ZM!0BFI)D`%&-\nMKK9M^[:!TH!DA$,?R5_MAO`4NK=:30-!(;96A_$(CY/=[_1,JMI,W?T$@@$)\nMB&^=QZ,T+<;^!-['AS+$*Q'1[L*8B3-0`5@D'W`J))-A!KJJ\">X`T`7)=`9:\nML!0IJW=51V$DKJUOJ1VG%!1!(VZ%`(YA;F$NYN#N.BK%D9&<`-VGT84NEG`T\nM6Q`!8L[%`#>MG\\[G'SY]_O3T#$202BY>)A;PJ%4@S9(WJKVVM:A!.G`T!O8(\nM]`TUL687M59K4$\"BP>!6K[&D.:`C,H`CRIR2%S7%\\WK-.=?>7@MZ`C\"EDEF;\nM\\$24(MP-1ELX$3D%T>V\\_]J,[D-MN37RPFV!#N*HI#R&,2/#,!:\"B#R^?2/$\nMY%%*(2+L%$RUMV69(@PQ1FA^\\`=;:Q'ISB64TW)8RB0LW;OYP.VQ()W/YU\\T\nM$-Z\"53GGSY\\_WT/^0VT<__W5>QEFMM4J2@#0>N=P\\)O#)D94U\\.ZFHV^3Q4,\nM1([`T5\"-*!C.T5MONF_1C4BF2;:7L]:(<7D$9T4/),+N4;M5U;`(ADQ4`9ZV\nM[;3NHZ_VN$QU:Y?P3R]/__#==__#AU]_6/((\"[O[;LV=NEL/#Z!,\"=F0!*B#\nM!P\"*PS!1ID`(-/,,M$C>L:,INY4QIG<G!@#OOR!J[;6OK;8()_R#72[K>NW5\nM\"(\"P]JZMJ7IN-A0G9J9AC`H'@%HW`I1A62`*0H-PA-Y_03,8Q5T-B<@,&%\"&\nMS@58F$K*B>7;Z6'F-*,L)+/D`\"*%V-7)TF&VP%T[<7+\"'D:MK95+F8W'Z)NG\nM4B*8!(T<`-0\"0(E($)D2$84G`'\"'WBT,(-V@`NK6S7OXN5U_^/+IT],70&21\nM/!4B:K4*VC)+3@AH>U][Y@FXN9EW'N>W%$`FG,+<HXOPDC,7L(8=-3A5=;*P\nMW@$M@4P!K;=-::O[WC00<BI.@F.0H5'R,D^'73>SX-?!QX`3#[ED))7'(7^[\nMG@&`1.:<D>DN\"0:3\"*7$(]!W:S5,/#(KT75<.]7T?%Z_^_WO1'+.>5F67W9Q\nMYYQKW<S$75593J?3O5E[[(&W8H;76/'`!XWKW)`@[[:U,6\\=*([>:Y[*X7`X\nMG4[=S+P/NL:<A(B'+CX$)3-;UU6M!5A$C$,:!\"&\"JR,)1@\\/<,-P)G\"@(+&&\nMJ$PA,B8#'N1(Q+@VKEJ4#-&M<YXR\"P8^GZ]B40[R>#JNE_,+\\[[9]S]]OOZT\nM\\C>Y)&G>NNFNNW(8!DHVI#T,`NPFQH29DC:($(>)B)`5`I$X32^UFBI*H@@9\nM8%PAS-RZ-^NMUM:M]G;N;6NU@W]JU[75S;HQ!N-@J`)AK^KFMTNGZ8U(C+BV\nMT77>Q[PEQA&/$-1^YH</3W\"$#58N1`>'&$790/N&B%?3ASP_0'KD\\F:A*7)T\nM;;`W\\TQ1T9J'UQT1E?'2]@/[83IT:A@F)68I*`G)]&Y,(V&^57FX._!^PVP3\nM$0N3,2=F)BZJMFM_V<Z?SU^N;:4R`P!P\"<`8%1>,U=2A8XF%94::`XKZ02!G\nMGDHJB::4)Q&\"F%,NE+.R$6\"B<S=$Y0!K\"@\"%0<S[ML/QL.[[E^>GE_/UZ_<?\nMYC19[^&!R,MR5*MZUOM,456)&`\")9`QK[HMM?,\\S(B*6E(?G.2(4XE[]<)?F\nMQ_Y&@.0!Q#^75>X[<Y^F?#C,(^TPI/52RLO+RST<+PBPKNN`:B21D6(<O_5>\nM!^#NM=9MVWKO;]Z\\&4G\"<4\"]DZ0<8J#Y\\UQNDZM;-90!#>-\"W$L2`<:RO^%W\nM>N^(3(3NRBE!&!\"5Q)[%(=2PJQ6:*GEA4AK.C(X.J'$P.4`\"QCU\"6V..!\"(>\nMZ[H=2GI83@TH?5R793*M6]V>?SSK9G.:*+1%-S!,Q(+8900*P1$1`LE<376A\nMVQDE$3NZFH,Y04PI=PL&E-'<;M9-NYM&5-.FO4<H1G=[:=NV[]>^-W`G@'L.\nMC4B(J1L`!2$36[AV=0@D@B+#Q#IX4TZ(3$\"8`N]4A5<\"FH'=%R\\3#74=/\"(P\nM?M@N:^\\OBB\\AM;;'Y2@BG\"2[]TPVD87OVG+.*&G;SSXG1W?WUDT`&1')'\"Q*\nM<89Q\\!$>)+X>:D1]V)&3I)RP\"`FID,^'M^?GI\\MZ_OSTZ>G\\#-[S].ACQD12\nM\"DZI(&.K>Y`MQY(CG4B.(`>/$]*2ICE/*1=&(L+BB:L``\"``241!5,\"$F(DS\nM<1`'DZ1LV,D<!;L;AA<6).T.*:41Z_GRY<O^[;?3(4/07O<9N:1YFA9>GP/T\nM?L\\'=_BY-MP`AX??'AX>QFE_[#1#6A\"22]M&$],XCHZ`1:UUA`'&N&1L:6_?\nMOOTKX<$%'CO9/6,QN+X_8_#'F7.4Y28BF8I5J*WIUD<(DHA&-_*<R]VGIK6!\nM^U(F\"+#6#].<Z/8OL=T<'0`@Z#0]1I@18`\"5A,RZ&P.&LB%4T[ZO[&T2<-6J\nM7<(;`X4#LL=D'JIU[[5&?/$+(QTT<%7R``CU7O5Y34ZP8KO.3--A$5BW!H=W\nM[V%MLLII+]QMRW+X^O@QQ_>?_/^JO_]*__*_/BS[YTM?M^E8%&';:]E5F(V@\nM01@-.(%:K]5REHRH82HBF&75??/6B7V:5-+%02(\"I#5Z^;+3ENONN].*]JG6\nM+_MZ<5U#Q<,]B!$S18\":!0(15PD0`6$@!!L_''X&,B)X@`-9L!,150C.R?>-\nM`^9,Z%%$&,@@D$G=]]9ZAQ%A#@]DN/;5`$B6Y+OO^*8<,Q;`4G`FIS!/@1&\\\nM<=\\S_\\/E4M/\\EV^7KZ9):F^ME3E/T\\2I,+$$>^OMM:V)<Q%<A(69(:#5,.5I\nMFC`5U7/*;EB?+T^N[>LW;\\%@RM,QJD`0T+EK.&@2\\;S7;>K\"V;3P16+'+<?^\nM%N.KDA^Y6*NME\"^M32*2<NQ]GOB8.:K]]/(2B=^^>:.!!GU>EE^)/5W/?J;]\nM_*6V2_[FT99X^?A22FJN3/Z6Y_URB7;-@@]S1L$@=D[.*8B%(Y&*;VSS7,IN\nMN*M?5HOK>CK$^\\?EF`\\96HIUH]6CDQ`2U+8#D`4$\\Y=M';=-ZUK*W!2V:EMM\nMKTQZ>R5!C>=P0L1;0\\6]-P*8AF\\U\"[76M+;>NY&64E(N8Y6/D^K858EH]!#>\nMF%.(*#?_^.BIV;:KJ8W*Z?L:=K6\"#%)ZF;\"!:3=3-P!BZ&'=7!T`4RK)@)IY\nMW:_7#7I0=>HX<9(I02!T]WY%)LD3$`)Q-^_@+0PQOCR?I>14A)E[WVJM.:6/\nMGU]^^_L_O%].Q['#J\"$%A>4\\#QG,S2T&VQ0HP'<W,XB(,2D<F3&CO;<!34KA\nMJ>1$:4&JVC<W@0P&M;:7?7U:+SNZ4L0PJ@L*TTBF@X)!9\\10!=51ES=RO(Q$\nM58F8`!F0D5.2S!D13\\@IB\\HJ@E,9A20,#AO[F,75KJ,X=@BPV3DE*6DJE%&A\nMUWIU`(\"E9;=,J3!S)O1$6ZW;=?56?S(\\.973NQ-+R5ERAL2O;7M^H_O#K43:\nM`>^%TG<R9^\\=R*^]/V_;E\\MZKK4Y9DEIFD;]!`02(@4(8(+(@1`6,:YDB$(B\nMS\"BNH6&<25B(LXB0>=-V/?N4)NS&W;MKVVLJ.96\\]Q[7EC&%QO/E6IL2)Q$Z\nMS`=2A!`*Q^AAS</\"\"\\\"46!QI=^]>3<TL(0)A#NL8P\\!$%!C@8=:M(XYAS&S0\nMK]<]PE!HGF>D=-<+[@!11\"2Y$<WOV^\"X]VVOTA0BRCTH.)0&8!ICF`&`JG[#\nM<FS;]G(O#\\EYFJ8[\\V(H]2.4.);[^!B:=@`X'`[:FW?E5Q1Q-P>/8I:-&))&\nM5VL6`<3(HI>]UV;-R`DQ\"8.0DK5$W$%W-5`WQHP<!\"U0]P`@3MD0QJNUUFC=\nM3C1=+F?#^/KK]Z7,&!?R6%)Y>EG_W]_^[IN'M__JO_H3R0F\\H7ERC0%@\\QN^\nM$9TP1NL=J+]Z(R-&@0&Z7JX[F#=S`S2D4K\"Y*<\"._6+[<]N>ZO6Y7U?LG@B8\nM%2P\\@*\"#`]BHB2A$,^9QC&%$9LZ2QGNX,#`2!8!C$IE2$6(P?VPHQGM8QE0X\nM#X*P.]\"Q,#,&#2ZCJK:][OM>0$HI99Z096UUW9MZ>/2^][9)\"\"!!SN)9LJ4L\nMZ;)>S^OU>MR5P!B50!G(+?&@B`6^U@>,+$4@.`3A:RD]D4-TTVKZ5/=/U^W+\nMM;[LJH&(T`DHRC#6)@1&8H@9$!\"80H8O$X\"9Y[),4MB0B(121D$D'JB,INNV\nM+3-)UZ*@JGW;:9[R\\:#A\\_-6TO1D_L<?/G[W_8_OO_FP)&I;0Y\\10;!DL4K5\nM6FT=]P8@>U!VQ$`\"&C4CQ,PY)90$P6B@`.[D[MKV7#(BI<2YIQ713`G`PQ/A\nMZ*ND`9HS-W,B&NCZ^\\WN%OP5&>K#+=3[<RIW/)Y?)V^7R\\7=(2+GC\"F/,?TO\nMYZ*CO'L$'\\?B'*BH[-.X0W93$:G;'N!\"E\"6EE!C1U\"-B@FP8%6H`\"XHB.J,C\nMA9$9JH[\"US`+-PBCXW+8H%N][EJ[M6*(@LYP,\\N3#R%-'<W#MY7G:36+;3O6\nMOARFXWR\\3K4K7#A^_/SYQZ>G?_GGWZ9<>JWL(0X6AA$*KFKJ1L$#M`F$9BY$\nMP`2.#\"R8V/O#X]M7]+(8@II5U>Y60R]M>]XNY[[U,$@$0@-W-2;^Y\"9`F7&1\nM/)7RUC(&\"%(222S#F>D1SCY0!A0T<9I*P4!K73!$2$!8<)(!XTJ(G\"DE$B$:\nM@28I1(N[>Q`3D90LT^2,U[H_GU\\NZWKI5VT;5(\"E``L3G)9#D?1=;X4D+W,Z\nM+N'1W1,\"T\"TS/EQ5PW-RE[E^R2*ZQ^HVZ]?>+K6OW;J#`I!Y:E72,=S0`0@9\nM00@(6%@4G<61,!\"8\\Y2FB7-RH1XDZ-7&[T[(<\\K;6FEM$]@CBZOJNN'#P_3F\nMH*'^TI4R6;M>KS_^^..Z;N\\_?\"USKY<]\">><<IK\"YK-WQ]YMGS$3$S`C)@6&\nM\\-X[A<]I`@P*OS?56-C%VW$Z02@@YBRGP[%;4VNZ:W#\\,DEXJ_=T'[?T^U9W\nMS\\&/EIB;ZG[?.FD4LC+=5>`A4][A]BEE(MI:[:K;M8X_)27?9TKC10Q3R(B!\nMI)024YB\"1Z>;5%A**3D?P=M^#5?K'<B9M9N;N8@$$+&JAUEHUVX^\\+T<P\"Q`\nMYA':31P0@92Z*V\"8,!!)R>Z^FW]9MR!!B^=U%9'#O+P]]B]?GDM)M=:/3U^>\nMMVU^.!`7C(88P@*(/B(ZA&,1!IBQOTY1`(R(@`)899FFWGO?^_CGU]\"JW<R`\nM@3*)4@$N2NYF:A8^$0?28%IFI@7ED-*2RV,709I)RJAGA*BFZO;[N(@3HV2A\nMR`19P@.`,1%R,*;$D)D$,\",14.P^%TQ,X`#JF3FG*1%O`A&!3%EXGF=?EDLN\nMEW+Y?04E\"`$JTC$&X.OA[;NZK]$TYSPF#>BW\"?E0T<:/826^E81B!`P_GQ-Q\nMT*T`LEJOVO96>PLW(B8\"A^%1#\\,(BB`'!$^$DO.N*Y,;>@\"-<6ORE)RT&F+G\nM0\"Z8>)HYY7F&=8>7/0OQE!3:YVVKU^N\\3(%H73?3(.S1/_[X_<OGS\\N?_(I/\nMCRMTXI`$[F\"&30-<.;50!G0B&(DTBQ`$A>BM$J`'A3LA\"=WFWX`6$0A(1&5*\nM8M15(&CPS<9BB0&3AF&$2D*WUNIQY!FLO[$\";WWW/Q]D`8@H[L47>1[58>X^\nM')4..J`0MV`BP#UNC(AMV^]EW'<SI+NGG+I;0.`@903P#8012M(1FWO70=I%\nM-S+L5#@M*1'WI@T<KN@<_;JK$P:D03)VP&ZA5=?6M7<F3>XBF!\"(>[./?9T3\nM.?KSY9*(WQX?'I;#]?EBU!7LT^<??O?'/QS*GQ]2-B4`Q5_4AC(Q!4.81S@`\nMRP`!(`G;X-H1:FUNT6LSL[\"@@'VKK2EHGXEX.2R:)HMKVV$DS8.(F05'BCL#\nM%.3D=.*<'$MP,6(#(TS`'?#=X33>KHG+)(F!``)(BL+,;.(S^X()U+(&N#41\nM`F0@BW\"(ZFH]*E$?MB=%\\^K:2DF'3/.;(P2MWM=$?4IJO=?.@#+QMU]]V\"Y7\nM(NJF/\\-C`P+B?O<;.8]7^-K_KW+\\Y\\W0-FUKWW:M#2U*HH.D0T:ACN$2SC\":\nM$)T(A$4YD(R(1QHH#%`AH6`$&9+A3#DC)R!\"BF[>-!Q$<`+.ZO7E<DED\"\"9]\nM:QU*R4#7SY^^_Z?_?/Z3K[]^?#@>IJZ;>XNH\"`UQ.(&UMQT`(%@Q%'C$TQ\"\\\nM;M>\"A)P8@7B,]7&9\"H2/&@6W/O2\"<1L>(L(]/W%WMMPS\\??BBC&5'<^XV[3Y\nM/CEMO;?6#&XJ\\/[R@HB\"E%)*@V4-.')B0FG((ZVUZW8C.CXN]Y&KW\\V0`/#Q\nMXT=7+3D3T7%>K.ZFO6U['&;+*7)6HFKF#H2<F9PTD#U1L`!C;*AHS1H9@IFW\nM#H8SY0D!+?H6K'@#K6AT[6._=X?GNJNS(B2$*U]/95[*=)H/H5\\\\X<OSY^]^\nM_T_??OAZ?O\\N#($$O`>,CO4;_M=N=>1$S.`QQH]AWE7=AZDMC!@U:.S]%AR8\nMU##P)`6DO`]IK?%H$VB*`S*+R.X4(!84@429J`!G(`94`!1F@K\\Z3+WWT\"@L\nMC#(2C(P%)>8D1IS9<I)09Y0;N2M)(+J!.P+A:-<0=Q$)BAYJY@8^E8E$OI(W\nM9ZWH^H(.!H)$@-'U-,U34!(>QQ\\,]*[ND%/&VY3H=L`B)`#`-(ZC`\\BHH]B1\nMD%`;M`JM4^\\E8@9<\"&:`Q#W`!8$#0%W=*0D0%[F1II<TYSPE$@G**$B$@>'`\nMR.EV278<;4'JF7\":Y\"1E[]JO&R;I,P!&F6B69-9>OO_#\\T_?_^K](]MBW<P#\nM,807IJZ]MQISN;D&'0'4AD,F/`%;*C,R1X\"V&A$@7!%22H@$S!&FK>]U1^!Q\nM5+HG'^XF;S-+*>/K/L>(PQ,G(F,*=,L$C[:*0<AJK<6K1S;`[_[C,`>`L95=\nMZC8@&?,\\/SX^#A;&MFW7Z_7V?\\IIB\"KC\"W<H>;U<W`P]!M$4PBG`3U/N`JAU\nM7_=]CS&YH<035;,:IF$M^J[MVM:7Z\\LC'6KMO2H$E65Z2)F\"6[,+E1Y>!2ZN\nMJA6`F<0DU.KFG3@\\LW;K38_+\\>%X[.LG(SZ?SY\\_?[[6/3@;!@`P]/M.2,QX\nM\"V:,!#S&Z\"Q\\U>4LO.0Y(FPP[!'#;F4@ISS5J(*4)3UBAFQ@WGO?2PRA+\\*\"\nM`BT2!0;L!`Q8B`LR`0IC%Q3&KSSM5<$P\"S,R*`A2*>7'OC.24R@!,CAS+A.E\nM,@=Z1'<+1I),*3N`JQYVXYR\"P=`\\$TW))C:&!:6Q4U-MS<-REDDR`=K>$LMA\nMFJ9I2HC8#0%D+,C;?68<A6[Y7<GIGKSY^0TD0FMH2FXIHB!G0#8E@RP\"\".0!\nM\"A;6W=F9`@])@&F:YF6:9YX$1\"A-4EIKUF.D[C$#$:6<#_-\\^;S5WHAYFO-I\nM7C\"J.A#@F@.\"6\"(1U5H___C''_[Y]__RS[^5P[>)D7#G#(R'?2?M%U=HV+(4\nM(2J2@49?<\"#B-$W+LD`NL:NUIJK5%,%UFHA(F,=X,A#\";Z>_(1O>%^'=5_AS\nM()AHZ.HII>AMT'?=75;=T>K8V334NP^3VT'F^[AYJ_O]KQYO_7#/#'J%B!R/\nM1[U<QUBOF^M>K?6<IY121GO_^*\"]/WWZN&^;-B,\")G;\"`&2:E_+&1;?M18*6\nMI6QX@-BZKF3-U]4O5Z[]`5.ONZ!+=*_&S!#45]>6)C]G(:TJ&,=YKA`OZ[5J\nM?YR$'*CZ^4N;'TH_VK:_I-*_?OO^R_/+&>#'+Y_^]C_\\QS>'-W_V];?UY>+(\nM!F&$/2!ZD&MT\"\"/DV.OJ[N%H`!T!2B8C`]M;[4E;6&M;$DI'BLU]W2?AT[1P\nMT-97#)IRP;+LVXL1&(-B&JFC<4.>.B-B(%5$NI4P!5OLM.5#SBR#UMV15G2U\nM\"RT<,Z/-6]M,9%H*I@3\"?%@HHC\"/\"@-W+R(YF)PY,S)'6+?6\"5.1:9IJ-FV1\nM.YRL>&TO:A<D3'1B*Q!`FJ`S)LG8D4+0L@LQ8E!TT\":(4RDII60,B`YC\"!0`\nMT-VJU@I\\KNWY>FG6=ML1X/1P3)D?DH.)[M@Z1%6I^SSQUX=#\\8,4!G0,D&1*\nM[8S/@)IM74['+7SC1(<#H+RC_$#;-F_9DZP\".QP?ENGMPT]\\OD8K=C@=R]/3\nMT^87`O2KVM7UR>GQ,Y^T72_A>#@MF;[Z8Z//GYXKY8(S.E.S-].14W8@(I8E\nM(3%3/B2!9A4:YRASY.DAP@$HM''`(L*`O7=U'\\$CM1\"1#J'J1.0R)J8#IXYN\nMMO5VWM:!NLB#1WJY7$9C]FU1B@P_SK#5C$OY*+P?UI8A3MQVR(@[G_OGFM[:\nM[K4D9E:M[OMNJE4[(#H$>/BHH6[5]GT,<,V,$(@H%5$0,=A[TWW3?8-N&*-=\nM(:2K>Z2`A(`$\"BK$#<+,.KY.^@71:5WWA)2`!6'3=MY627/*F)B793F97B[K\nM/__S/W_WX;NOCF_G9>[[#A`&1NK#]\\6\"7))B&!&8NX-\"`.%$R$F0Y&;WJ:VW\nMEG*9I_F8I^YG[][!/1R9\"$$CK/4&XZ).A001.3@1,>#.P[T1-/JXAQ$&$7,6\nM24P\\*/.CI[.'.Y(<#P).?9+,*26#Z!@R^&O(P,0Y):+;QZ$63$B4D-$%*(:Q\nM?F1,B8@=LJ0%I2,&TR0I`Q66!#2Z=(5X].R-^PTA,5$:7REW\"Z-;D7W`.\"S&\nMP-@.M:>9*X8)6*:8!*8I:P/=@P@X9\\5`]F;M=%A2(1=$M@(P`:8(K)T<L3FX\nM>^O1-5(.(<KIS?S0;9<=VM[:67E>#@L#B#'VNA-!NW7X^4^??@0*>OQ5F!%>\nM2-5,:[_,$SZ>Z*JO)1-(%@YF@<`L:HV4'4$-+3H1I3*7:1HV+VOM^?G+Y7Q.\nMB8_S,G2!VVT9@YDC?-C!AT)X9U[H:QICL`MO$L4OW:&#LGBGE]Y]I/>;M[M;\nMU]'\\WO9Z*Q=,[NY/S\\_S/#.S>A#15$HI$P\"T?6^MZZO'37LWZQ$1X(QHX.X*\nMX$'@$4`1H(!*;MBZKIOO;51DNQDVRVH8M$#,`#N:@@^!G8@`NEKK0!;NZ&J-\nM.#.+`:QF3^M*\"8Y4,B(S'^?%FIV?7W[SF]]\\\\_;KO_CUOR!ACF`?6@(`!B%R\nMDJU5!C('`!.XU8$*<#7-A\"7)7))`3$DF82::W[VMZ]9;`T-!Y\"#K:A9!3$E2\nMSJ-<,07/P(7E/+T>@P-^.?3O!Q:6A`P#_R9$\"(RQ&^(\\$V&X,:,SA;M:1]\"`\nMT`!F-H&4&(H@XG7KA,$,*7'A\\>$:N&_NC)28)C!#HH0]0#$6D1(T,R<:UU3(\nM-,#>\"#&F5C3:O>`V`N@1!(BCUM!0S4RMMUKW[;KOJUEGLBG!*=$Q$Q,XC78G\nMY$3$2=@E2YHY%P;4<!/K)2A[H.\\3STE)NOJE]6FS8S9*,&?_Y.#!1`SF6Y66\nMCH<BA,^AE\\O9\"5K;<TH.^./''[Y<GKY);REQXO<,!ONUP`_$VO3+RS.J6R'*\nMI0`E-P@8^26/,!1C@A0$,>5R3.D4,:KEAINZ,D\\1X6&)RQURY0CCO?+1P0<^\nM*)H$F.4&7*NU^IAW,TLI<TH9$4?(*@)KO?5@#)_X-$WS/(\\SZFBE&8M^FJ9[\nM6R(`D.KXQ>A1Z;V[`R+6NK?6VEY=F[LA43AL=;>`A.!=UW6M^]9:JV'Q'*IL\nMUJTUZ(UWE6K2/12X.=8^J2?B!3\"!*3E@,X,03(FS1U7K(ZMA.J*W@6Z<._BE\nMM;0A$3R6>92U'.=EB_K]]]___6_^\\?W77WUU6@\"`>NN]WKK%3?N]?0'L-OL\"\nM#`(D;*T\"Q)03TJ'E)('$*(#I<99)M'7H$5U=@QI3X0Y94I*<`CG,0-%9C*3D\nM=,-DO=ZF1NI4IL0LA(0>%.&,`2$0T*`G`@!#&!JW$P8GB>8>R!'D%H[DPH$(\nM*QHC)`(D9G(\"(/`;V5X2`;JJDR7`YJYNX]$P,4_(#)00AC@Q9NL_=T[$S:T:\nMPV7G`SF'CJZNJFU=U^NZ;W6W:\"R1$\\P\")XXT947TW+RJ]MU#F1D%0X(S\"C)L\nME:LR8<+,'H>R\"%\"ONOG>^-II\\N/$<]DY.G8IN5\"V;E6K[E;5^<!A'0(AS`(=\nM^?GZ\\K=__W?YW_ZW[]_]BO@0@'@XI\"0T,[6S/CWOO16W*266TM1ZL]WZ-!$7\nME(D!@'(\"GUD6@(RXCH8Y231-4TK\"0NC034=T1GWP<@$0(6)(%[76>QII;)AW\nMB8&(9%\"BQJ;YLZ-4Y,N7+R.K-@ZK8X<DHK[NH99RGN9E!!;#0T2^_8N_J+6V\nMUM2C][YNVV@P92%)R<Q4&PFGE+#BJA=P94F$8=;-53)'4--ZO89`0%>JD5IP\nM0]C,5\\TML$.*-%.>@@9S!=#K,%TS,E(A@`ALVK<JB#JZG8&(B=WW:@EJEU1*\nM\"35EAP)?/C_]]KM_^O;7?_8P_3HGQ@#R(`(@,/+;0_%FGC>'H=U2!.\"MA@\\(\nM,`63!3.FE&\"2^3`)H#;MZZY;AXA$O/>&22\"+`EJX!7869\"%J-_`10``8WK!E\nMC`22``G,A\\TMP-4,BXS(OI%'1`]`1'/+$H[AMTR8(YJB(2)F(D(1\"8BJ50,D\nM@HFF>181A8\"&V-'\"!;`'L$-BRL2,Q(&O!3`>CD0WCU0S8X`DPLR`%.$VWB@`\nM(!Q>=G7<>E];W;3U4``7[!FC$.ZNT6K;:@26Q'.1N7\"PL92%6)OXV@$]35)2\nM3E38@EOXV@POMASQ`--2UDFNYR[\"[XY3[K&15U=#B>:9LA/D/+7>.WDU_^N_\nM^P_'/_O?C__]_U3>_*DJ`0F71\\I>K$T?6P_?>CLPREQ\"1[(M1)B&H1=(D@`(\nM``]3U?5ZU;:;V:`]C2*JK355;:H`%'@C1#E$3JE%.(\";Z<\"TN=\\0IJ]I)+E;\nM\\H?Y\\Z[4_^F?_NE-6WQU>(]1SR%/8\\@S3=-=$DPIC<8I507BT51A%@`P'=G=\nMM\\MU\\,L2<X2M1$+LV@>NVU,J:>9$JKK6%<RP(]6@G6ASN_A^KA,)64PLDR0!\nMZ394-#\"TIJZ`(G*@-`4FB&AP(74%0PM'S\"4+:;/J^-D^_^K#GSR<3FUK%?H3\nMXO<??_J;O_O;#\\?EJS=O!<'5QL,_PIP<.`5$F\"$(D;%3A-N]=M8'>4\"@6R!P\nMHB8P+SFQ2'/)TG/%@)(R]>Z$QAA$B!#$B86)O5_@-;![3^X\"0#)G#H(Q?@MW\nMUW!#2\\P:/HR7Z@X0%M&U;5T!P#V]PIX9P(F(B3*+,)+'+5F1)$GB\\50=BA9@\nMTTYN&:'[J^\\1$&*`YD`A&&Z8N1%9'JL3;VW>/!\"\"$1@.:J`]#/-N]-+TTKL[\nM&\"A&\"$0RV^K>SL^^^S*?3H?Y=)@/4P%Q'(A]D.;C,I\"QS'NSK$%[Q-X<\"=Y4\nM>A?S,LG#H3]]7J$^2)I+#G=EH+E\\?/H\"'I!H2E-5:Q%S2L^7Z]_\\^__MF\\=W\nM?_'O3C*_&^A)PN5P_/#FW=/YN@(AY50.2T8JW2/`?264&!]&`'$`-+>^KN?M\nM>@6`G%,6P3!W-;-NH69$A(.52,2#&8YX[\\H>ONNQ:@:2]):,/Y^O(^J><QDC\nMF8'^?OOV\\<ZZ'\\MR+-R1X!@GU7N\\$`#ZOMWNC3!PD@(0K;5NX6K=+49(#P\"9\nM4LG6KB_/S^U\\'@.A0\"BE2,D'8=]:,]7-;%/8\"2KZ%EB0/2]YFG-1M.K=`IU9\nM0Y$HIP1(K;LX)L>$I<$>Z`TP7E^5N76-Y^WRN#P\\'HYSF2\"HE/+I?/[[__R/\nMOW[W/OVKO_KP[FUA<>_->]>J:#H\"C$*`3IS`W8/,S!&#,)!X6!Y)7=T9*9-3\nM]'#B2//$S*[&))S8W2SL5NV(+`9LW@,=PB,\\PD;%+1$0FG?%,?^^?6P!`>#A\nM/52)D9B&XLSHP*:[WCE=]SP:,T\\YLQL;$G@0C>V:4[K138@D%P(D-T1T(HV;\nM%29@M!#>H\"PB0J_KD)CE50I38T`?Z<XQ(M`.3>%EZR][O7;?`XEA4*J(Z,!B\nMG!86)YV(9F:&0'>BY-UZ!'9WIX[8@##8FX%%&.!NAIM?6]1.);[ZZD/[\\IF>\nMGG5?YWE9\"+L:=IQE7I^?6@.<<Y))P[O&/,\\OGS_]W__G_V'Y\\)?_]K_C7$)W\nM]\"JURY3CNAH!I0Q31N\"4$`\"T5I(4P>/C`@#3RUJW=?5P'^)Y1&#$38J`FWV%\nM)-T\"[K<([TV<&$T5]]G*6#@WO,58IMNVC7'HJ.H&@!]__'$,0L=ZNP]LICS=\nMNT0C8AQ6F3GS/*Z;U^U69V.FV[;M;C?(VC!_2YKFO\"S+3]__4ZVUU8H0@YPC\nM)6?!0MQ[-`O;S3:'X6F#%,Z,F#AG3N'@UAW#D``QEYSGI=5>+V?KFC&]2>6)\nM3!PH4,<$'3V<')0RG<]G#CB4`[TZ/*[;]O_\\S5^?EOGQL$S$*(@`RED0GKI&\nM``TR%_$(4T#X.&RTKA;.2$#!B:AP\"'?P:\"VA2)F$BNZUNZ&(M9$M@83$$>Q`\nM'C@#>F!XX(!\\(@$ADL*H4`5P&\\Y@&)?^OGOO(2Q!`9'&X#(G`!PY3W>/6U<D\nM,$$A&<V&^-I18J&A+O=O@$@)MTX^,#)!@Z1B%C2(=$Q!*\")#.1XJV:A=CP@/\nM0.37WE6$4'?4'D^7];RU30V(9!+*93SXL?>$L*3BF0LS`6;\"2=B`^[[OYMS5\nMU!&P6ICJY)2=,`C,H;G59EOUJ1?D@MQKMZY)<BF3`[H1O?GPZ?FR;WN2G*99\nMM;U<]OGP>#Q.?_>?_KZFP^GKK[_YYANH.^C.Z^5ZO5ZVM1\"-[N\\(-[W3:!FQ\nML`_<OK9^O5P_ASTR(D#L^Z[6$HULQ*BTA.$G4S,WB\\!F6N2_S,>/>L^[4TU$\nMY%1*1%@$(?;6UEISSDLI']<+,Y>4EX='=_>N9L8DW:U7HW[KQ$`B#>_=PG*$\nM$=/(^]9]K;76_5*D\"'%(O'U\\+X!1^YNR--ATKA?9>UAM:Y;C:3E-+F*44[J\\\nM?-X^[]>7=NW:O%+??R4(O7).'?L58L-VZ9>FO7\"DVN><P\\Q;2T*)YJA6UXT+\nME,Q*OK>]:;#GH\\P,LE-I+TWK-;\\K<\\YO#J4:K=;^XX_7Z[__:\\S'__&_^3?0\nMUW[M;_+)(DC5T)S=@<:`AKR2NB=15>B8*\"660$-\"EDG4>Z^$R!,[1(^^1E?3\nM9$X6QY#$1$0*L5G?K4]I.)X#S)`0A0.&F6+=$1D0*=P4N@U=49AS(F2R\\*ZV\nM-PA\"9GZS'`-A\"VNFD5,2\"2#UN`99:SG')!36!6B214B\"*B$C6+@QQ3*7H@0T\nMHP``(`!)1$%4DK*[)ZM$2N1T?V'4\"='`D9&1*)!``1`B&+%GL*[0+*7\"P+WK\nM<&YL?WRNGZ[>C%+ADD@2!!/(P>#IHGLL5\"B3O1$XS@ND<O%+*9)Z^&:X$X=F\nMVT]+.I%:V,9UX\\V1KOOEI_,7>GMXGQY?YN,_;G]L1J=<#I1QZA_UJ>SKO_[+\nM#[_]XQ]^\\\\??'MZ\\?__A@QOT3R_[AW_]>(\"^[C_]]A\\^/![Q\\*!XO\"YOO>^Z\nMMNC]?'V9ECF54RH38`(_PBA=@X;8\"?9,]0W[BU=$]\"##\",(-.@9BR=1B='L:\nM&A,-O'21Y!:]J5KG&[TN!@C#32+\"+9IU_E_^U_]9W1P\"F?)4IF4.Q+W5T\\,I\nMYPQQT^4Q;I%^?87LCZS^G7/1:V^M`<;86H=I3D0L;-3'Y91YO/S`;=NNZ_/S\nM\\U.K.Q,<#^5T6`!#M:VFEQ\\_GG_X>/GIX_9RMJU2U:,D`F0B8@)&0^^NS<W<\nME$E2`J(VCMP1[N$16[A\"]/#JY@88,1Y:;A;F:(X>*?$T.\">,O_MI>WIZ(O0W\nMC\\<IBT.$^=Z:<P8D\\[CQ-Y$!\"9$JN0PZ,_$086^*$-SL$0%PNP.,$@FDVX22\nM\")E#*`A!R+P1T0A/W&K98%0:(B%C(,5P1]^.OX=ISI)YS`V8B7F<'</<(0:'\nMAH23R,`3AJ%Y0W`:B%0`9D$@3K>-<$0@AC)\"R.KZ2Z7D_K/@4\"QAP'#'`B7$\nMH!B3>$#WB%WKR[H^;Y??/W_YW=.G[\\\\O/?10Y%?'^=OCX>V4;5^?=EL[(&/.\nML!SR]##1-$6H[TVWCM50@P%32J5,0KC6NJV[FN=I(1$GFD_'Q^,;BSB_/$=K\nMA[GP)$VP,^!N#,0AUDV[IERFPQP\"R)`IK&T8_G!\\.!Z/E*?\"^7B8M?<P?SP]\nM/KS[\"JF$(P;9J&*`@4@*!`A5:[U'(D2\"06\\G`ASZS*V\\`M'<QX0R`I@9D>/6\nMT'YSO=^\\[\\1#<D5\"<8A]V]9U=??3Z?3X^)A*#KQ5'VOKXQ)XF.;;@#0)$=V;\nM[L=*2REYM5&?]@H@TE$`#)O;+09ZXW\"N^_;T_+3MJWM/&:FDDI.QU>U2:ZUJ\nM_?P\"ZS5;1P(72CD=)366`+#1Q<F44LH8ZC@A_G]<O5F/9,N6K34[,UO+W:/-\nMW+F[<SBEJGNY/\"#Q`/PF)\"20D/A_2/\"&A+@\\5.E2J.KL.OOL-C,C([Q9:YG9\nM;'@PCZB\"EU\"&,B-#WIC;;,;X!K'8@-(#J%L`1.')(-`;@C`[F@5N%\"G3;0BC\nMM=9/Y^5PV+U_]\\!S:4]V\\V%^^O7G?_SK7_[P3^]%_O-O'N\\RB:UK)T:D<.^M\nM.8((HP@`@%5)@D@&%A$@,EIP;?6ZZ'MU/P-=/9;`2`&&X.@>`0D9V%=$9\"&!\nM(+>N??P(N@%<DR%1(+$4?@TA<G<@).$L*2$-6FDB!B9\"8!A#2AI'6A@A6-!'\nMW2*41#)S2HE>8TSP+?S9S)K6T4R^)>Q=A<@>@$@C0&RHR0$AD'QX\\4)=:]1%\nM^TL_?5Z^_(S;$U4CWPF]R^E=F6Z29(`S1`4UQD#4Y!NW!)VBL6+;NIT;&&04\nM(`P$)]=4C)H\"1!`Z]A;]N'[Z^/SMN^\\>/CQ^^,,W3_\"3[\\4F,?)$Q7]O3S__\nM_O#X^-_\\X3_\\?/KRXAT1J%`[?7S8?4U(O_[TYW_8[])^__C'&U`K:9KR?&Q/\nMY_/RO@455H>44O@E0A`9@F!(/F%\"ZJ)`PY`<83XT&8#@(N5Z)XW^'5$DI92$\nM2TI);:1G#R_%X%CHVS,LN]L;3!),9H9)>KAJM_`<5ZG;FX%P'#EFGE).Q-NV\nMM773VN9YGN<9F8G(K`_&\\&CSKDZS`*=KUVYNNJU/QY?GS[]NVR4S)6%@;%HO\nM;5'3R\\MQ?7G1\\XG65BP0T,W`&P0'@FMH]&YA.,*#TDP<A#V@L%3FWLT04;@0\nMFW<)S\\@&;N$;F(`517+SWK2V<E[RS6)A6B/-NWPXG'K[QY]^O+G=[>=R/VR7\nM5\\9I\"NKAUXV%JDZ)\":&K6N\\B4DI\"Q)18&[P]N?!J3'%W<P_$MZ7']2(98D(D\nM`LS$P`XC\\%V#0]P=S!&069+(T%@CMZ&S())4,@H.MTHW-0*$L!BX/G5W-!_/\nMFH8S`0F9NYH#!K7``.\"X\"NX!(\\+T2F&XSF;B7U]$\\:NBX!5(BX!N`.@*`(CD\nMJ)OVQ;:++L_K\\8?+TY>^HL##/'V[W[\\KI0#H5I>P[M&]$_L65C!25.ZX;\\B-\nMO(>I&V&9$A4))BT)>IF,0D_:C!/V9I]__?3K5[]]_X=OWWW[[K(\\:^)>N%4-\nM@[E/S[]]3%'_\\/C]O*>_MI>3>3<]S$1:]_>W+O+I^?<___0OY?']_O`(80^'\nM^\\O\\8MVU:18P,[G.K<`AAN@:0@B+L!5N0ZZNX!'7..9PW.IU$A9(X\\B,]6`-\nM1<3!\\1(9X.Q!MH@W!Z8,CLU^OX=7#MJ0B2K2-$U94BEE5)[C3*[K.F1O*:7+\nMY?(6'EK7QLPIOV9<,(ZXC-Y:``1A-^T>6NMR.9^7R\\O+\"WCP?AKL`C570,7P\nMVJ,K;!VV1D$,K!YF(]@(@Z*V5E&[!&3!?$6#`\\\"U4T<:/HC!SA0'AB`-=6C1\nMS@\"X26%)DIOKY_/9?L?#?M[M]O#<4^8P.ZW+T_GX='XF\"%`#(<X)B^PB=PL`\nM:-K-;'^8S$RM4EPM7>HV&)!7C/+K4]S4S6PP<PVO4<:(*,\"\"(I(C8L253%P2\nM2(>NJB7-INJN,=*/U`+#`'(9Y\\:)D\"P0P2%PX&F'KFV(\"SPX1H*?$\\1UXP)\"\nM0!X80.'@%H1\\5:Q&#!8S_YM`!'@CK`'@H\"&!CWP`A,'%#18#`&14B&ZZ]59;\nMN]3M]^?G;6N[@+LDC[G<I2D'6-]:1U4@0Y)`!B<$`'9*'0G38MMZV9RIE\")3\nMX5T^]VJMWI5Y=\\>7RP61!>AR6?_Z\\T\\/CW>[PSS=3565V#PP6DB-G4K]Y>5W\nM^P$/^:O'W8WD9]]T>3Y=/M9M.WQX5_G\\?_[#?WQJ[;_ZK__;=S3M<MFE<CZ?\nMZ[;FFX<$Z9H6!`Q`8^`\"R(`BG&@B`'`+5#73<;%X8+=7,/0H.9FOZ@X=/L%Q\nM+`?N+%05*=X&8Y*)4YG&W*:UUE,>%>809X\\/!%7M6EMK.>=PK]OF`S.3<WJE\nM\\U].RZA+K^&C<M46$I&YC_^DKMMZOER.I_.V'G:W[EYR3A.7)+;&UGU=Z^52\nMPZ!0,6@(Q)P\"/<(R,3!WCA;>PYD!15\"HCF6=N5@4!0W\"\"'<(HHQ2,-P1*\"0<\nM`UFC(TF6G#.8O6SG[:E_C8_??/CJ&\\\"7L&7]$FB;K<^7ERQX*#-$IT!AH3F9\nMAKIA@`MRN)N\"6Q+:SP68HOH0W[ZZ\"J[SR&$XV'%2\"+W\"TW\"XZ4?=[V8:D24E\nM%F%*@88,P30PM&'LP$A,1(#K\\1($DFAP`%#!P2.B),$P#!@0.P(@Q,0D0``I\nMPI\"1F0/0`!-)(B8`01$F)(\\P1^+$WO\\_P)BW*]UP-!0(X`'AKN.T9R`S$XP`\nM[N:M6FO6M[Z/N7#<9;Z?]X<\\[3AEP`83.9;@1,R\"D+LPDQ$IS)Z;V]ICNRR=\nM>7]W\"XFI\\/ET;.?C[9[N]C=30(U8PQWP]')<3J</7]_/M_.GYQ=FF,L,37/4\nMB:B^G%]JG^]N:.M3O?GF9DK\\R+?31E`KT&VYA/[VZU]^^?G#A^__'3`*VGIY\nM.3U_N7GWCGFV4(0\"@`CD&`@(H8`*C$09(@(M_!6T&QZ.\\SQ?><$>KU&^*4;D\nMY6L&^ZO;ULS,N[N!:3\"KM*TRD@%>!=S$[KY>EH!HK2E<,<-`5PS^MEZ1;Z,%\nMRCF/_N'FYN;_%PTU7LC$@FA.J&Y;JY=M[:92\\ON;AX@0&4+4OK7C\\_&R+.>^\nMMD)YGF\\W[G6IBJ8]0&/B&(;N@@F$O9!G-O+-(]R]JV^-FTV.!-C-6Z)$,A.B\nM*L%@9T!$7()<50D2HKHO;<,71N:O'O^0;O9/?M*^OER>GTYS9@>XW?EL82@B\nM+,P!X<&`A0!(`V3`_D0<K]D;UOU5F(NOR@>:IDG,\"9&0\"-\"=R(,L&&(L`H::\nM$GVH:\"DQMZ8$X0A`\"!$)0`B9V2P3`S$!`)@#8DK\"@I)*U=[<!G_9P\\@C$8T$\nMG@`#PPX]G`\"!N&2#`%/54A(+F;4`XU<<X[\\AFU[/88]K/>H#.``0`0'N@,U\\\nM(D!$4ZRUMT5UM7>QBY1N,S].-[,4BN3NVA&Z)\"5!$<9@9B!L\"*LAA&VJ:P<-\nM1U?5VC?J@A(DT.K6.I0@`&^]S8F66M?34;Y[G/=3??I8PA,+:J1,N_U<+&;.\nMU.'XX[/^?MK=WWYS-Q]@JO?IM]/2\\\\9WN[:L?_V'O_^[_<-A/Y?,<Q&WU=I*\nM$YL!T?YU-^X`\"M`A.D0%F#U<W9KVK5\\GE(X$M5YS[?V:3C&$?:KA[H#Q:H#G\nM45/T/N3=X!X272%9[[IM6TKI]OX^(DYJ/)=MVS!@I!&\"78%./'*`>Q\\5UYN5\nM?I@RWBS\"HT9U=P@WL^$YN`:^[7:[W2YO)(ESEJ;U<CFM6UO66IN_>_?5/O<<\nMEX^?EDM=G0.))<EZN:!UR&P9N`@GZ02#Z0T0H>:U0],1BA(!%U44Y@`.2(%`\nM;!%F%D)+[VVSPYRGPP%K4_.GYY>'W?N[J80?%CV:=<?>O5_6<XD(2Y%22BF0\nMR8T1*`F7>3QV8`[S/HK^DLG@]8'#$$EP*J44.BW`R$1CG('@Y([J`V^$KRQ:\nM-Q,D8BE)(L()O?50#Q\\YWK[?[0!`O;>V:31.5&A*DM\"#'3C@NK`+(`>$D$3,\nM/+BDR*Q#<$H$0:;Z\"GZ'B$#\"E&33_G;VWF3^;USP(2!QB)$$%H&`W+US``.;\nMA56WIM[,7U8F+)(R#?R4>[?:K)XZ+$`B>2^.((BBQ,KFO2^MUS:6UQ:^;)L+\nMS8=Y;^!/Z_/3Z6':IWD&50?<3$\\O1]>&%%M;)?*MS[&TR^64$NYO#]P1%6Z!\nMUW/7Y91.L!Y_N_D/WWSW]<W'I?>B92]Q.OUO_^O_\\C=_^N/=S7ZWR]-<\"`W!\nMD2*\"7MV1\"*`1%J[AS5W4K;6^M;JV-G8'`=2TWMS<['8[1FJMJ9F[`D#OKJJC\nMF4:,M_$,4WD#:@LF.6^KB.SO;E-*2ZONGN8IYSS8&(*DK;=:B0@B`%'-MEHI\nM\"7%:K8_84`\"5!!'66H]P2>@>#-0W9@1!GQ+0G&=.\"!DA[Y8SH+^<GC\\_?WXZ\nM/?_UUY^/=2FEW.[PJ[NOOE3_G/Q+`0&8F[.'PNV&L26/#!F0C2)GS(>;EP7\"\nM*Z*C&MIXAX\"I`1>D\"7D\"J`$:L#$TA-DZ]9JS3!C8-E&;19*Y/?^^V^\\?*+,E\nMVI\"]2\"K5O#J'&5ADB&F:N`B8:>_AC05V^])ZK]L%F4I.@M%D<G</!7?!3)S#\nM8CMM4\\H:KFKN@`$2*;.D3,U79.&1]24P`N2Z-C4SQ!YD+)1R1G#MT7L#ZR-:\nMQ]T-9LZIII=3NYF%4BH8S:M[<P3+V9%*B#!-:;K&GA*@!6Z7/MU@(4H($H@F\nMS(*2H[`@H`)80`_W*V@K0\"P#,;H[!\".K=G,HI>3SNB\\%-ECZ!=9FITO]_#PU\nMN[]E!'^XR[>W.6![H34F?=&7@$.E)5(3V4GE`@41G_6+;NQ@:;]'2P;=K\";1\nMAX=4U@A)^7ZWUM.O7\\Z[BKO]+\"G].#_]O'U^/#[??OOU?:N__>57]*</'P[3\nM=J>]MQ3+Z0QA4V()WU/>NLX^K;^OK?7]^QW/LY?2,&AJQX\\_??[)]X?[.=W&\nM)9`Q&7@^$A*`@3901:NQ;;;6C[$622)IRC-#;M`5S=W3#:O;\\7P:JM$D5Y@]\nM\")8B$3&F%%O=6FLI)?%KY)-0DIN;F_/YO*[KMFTYYU%AODF_W7W.143\"O;5V\nM/I]WN]UH8UIK8`XCM[7KJGUTF8.^!7%%4#*+ZQ!>C?47(1`$E)VTUJK6M:Z7\nMRVE9SJ,TDMWNL+_GK_'Q\\>/EM,52PX\"\"9B9@0R)DR,S\"XD@ML!*-==RHN7F$\nMW1+/G!B)'<\"A`+''$#/#ZJ3$B+@:J(&/?-XX'2\\L(OM4RNQJR^G<#OO#;E(8\nMD'F+$<>'19@XYTMW`S<,*$+!#J$0&B88@,$$,4\"B$2/;=P\"\"(MPQ&`D'<\"1@\nMFJ=!+7AS)XR.HK6&2!P8ZA'JA,Z!B=E<4-P=@8B9U+?M;&;'9I0167LT)R?)\nM+(&\"(V,])<)P#1T5[`\"B4+@1]!Y`.!@<YMYK1P0D0R($8$0`]R`+H`@+-P='\nM;4.\\*]PE!*V9+GT]Z?K4UZ.W!52$)TF[W2ZEI*U[ZT'!P'%=`):<\\U5^@#2E\nM7%\\6#\"(`H928<Q(`VK;&4=;+RML&ZI!2(%5W<+K%`J?63^OAC_/7]^\\^_?#K\nM>K[LO_WZ[GWYY__TCS/PMX?[BDNOW3-OT>]N]PNJKR<L17KB[@5EG]-Y;25-\nM(F`6GY]^;]8>W[^;YCW@#,P0UK:JO3)@%LFWZ?OIKF[;NFYJRBS3(6FW9GI9\nM+Z]BVGA+E'#WK?51&[ZQZJ_>0JVEE#(E9I;A(73W\\_G\\_/S,S`\\/#X^/CU=?\nMABJ8YYSA[1=TFSA!GM96T6-,'1*2(K[FB@[)ZWC/Q=:J]HT()!$13YD0V,S6\nM;5VV\\W$]7K93K6N$33G=WNQI.AS>?7WG]Y\\^/'WY]?EX;%[5`C.K0&@8`64F\nM05>S46_W9K5VL\\`8;10Q8`9\"`P&<*$5$\"YL\"$`@Q\"I*Y6PLS`*(>!,'KNLYU\nMDGW..:MMI^-QN[UYN#DHH0.%&P1P[U>]'T3(R)E%%F'\"WGO5'J8E):(@\"#!W\nM-.*K=!!,F8&$'(@`)#@%_NO$WUYY=2.JU!VZ,:,X4`]U<X8.$02S,R)JMX@H\nM)??>V]:(R#/0=7!\"&,`P',57;1HS#XN4PZ@!!]$3KI$\"@$QD$:J=(D5T`$9T\nMHN0.`>$6)$Q$Y&`68VD7`4\"X,B'&9KIX/UH_@VT$FB4Y3G/>367BU\"B/,4[&\nM4LTS\\;#5F2N8(_$DR?+,P.3A[L`^E9PE@R-AJLW]HL5%I#2'J&K4D@`G/#T=\nMGSY^OKN[^?;KKW]^_LN__/[+GF\\?W]WBY[,_/QW2%'>[FI@.,TPE,0:'<5BM\nM:5E+FZ?]+LM>8#KZJF;-MFYG:\\FI66R2\"Q`!!G%\"22`%F$$AW*VK>F`B1.H$\nMW>,M$'N\\?&\\NW*NU^M4+,3Y]F/GR<I24D52MR=C%W]W=O7__'@\"V;3L>CS_^\nM^./=W=T('$TCX*)?&:89:)JF>9I&,MOE=!X*TE3>Q*GF[O'ZMH(@M9987M%N\nM:%;KULXOOUTNE]/Y2VTK@>]R$ID_W#WN'S\\<;M]-O;^[>W^WNU=9\"(/<-+EF\nMU^PI(V1R@H96W6O7M=7>>[A3@'E`.\"\"DKF,L-*4$`$51PRE(IU*S+H/``5<K\nM>A>^<5J[4JNI,%,R]=Z:=:_1Q[@8B0!(5<=*C>+*7TF,@I((.-S=T14!`6)8\nM)A2,*#%CM4;,Q,,+\"!3.+(5R']OYUS$DOO9C0BQ`!\"0`BJC@S7MWNR9-@I><\nM(`M@A(D!Y*&>&3MV\"A%A3H0\"`&$^TNF+)!`\"IW!TRLP!J!B*^*H-[Y;2P9T]\nM6KB-C:8;N(>[(5(``3D`(X^VEYJ'NZU;NZQU'58V!T2>=G*[/^RF.3-C-P3O\nMJF))M<%K<-7HGJ%;J-W.MQ30JR[U;+U+1M2)?;38H-V38R!;>`!01(9\"19Z7\nMI?[RR]_>_[N';S[\\Y<\\__<OQ]Z]*W.VS/_GERS/?W$PW[\\O7]X<_?GV:\\/'V\nM;B>R'$\\OYR,Z\\.:\\V-?O#SW3NFT5S0$-T``@$)J[=9`\",J5IYKP#$`\\@>Q(D\nM$:E;W2Z7YM$C+/R0I[?0I;$F&%=?ZW9]L.;6^HB8C;\"4.\"4&\\-ZK#,7VFSII\nMGN?Q]8U;8:VWUDSUW\\9H#U4X,W<W57WCVZ24`\"0B6K]*:B2E\\:#0T4R[MFU9\nM3N>7\\^7I<KF<CD==>W2=N1SF_7TYW.SO0V,YGOMYBZU?/7WF>L-=T'=L<_*<\nM`*BI;QJU#U*;,(_/&XPP\"J#K9T^\\K>P$KI'#Y@\"-=8,*$.2=+!,9\\[EOMN!M\nM/NSV\\Y39`Y=MU32)\"!,ADB$$((_!2NVHBHA\"-@4#\\$39P5>S\\?=7D=?H[&DH\nM^%Q[#P1&(41WK];`,2+>I.3Q&O03!5##U4>H8\\J#-A75!Y`RXSQW)B-$PEIK\nMK#4920),GIBSE\"09D0?_3E4%A4MB%#-0=P:D\\;(``(\"&FT53G20LO&L/&&,;\nM&C+RM781=P!$1@X/[*ZA7:VJZGH^;^=+O5S:\\:+G%0!N'O>/#W</\\\\&WUIKW\nM2^^JS#*A=#=75:+$0D2@%FNK3812KUK/;>T7U<R%D*'W-C:E9D9(`T,<A)3G\nMAG[IK5NOB)$SWLX.OH:__/Q+OBRWA1;KJNO#X0//!=Z5/DTA94X)A+=E;9\\O\nM_E)O6/;W-^]2(4KK9L^Z4$Q^.S_,$V!R3^XE8H[8.?)(@,=@$@Y\"#;<($I%4\nM..@MY>&MYHR(UOI;MNQ;==E:N[W9N0^ZKU\\WW0-TOZXK$=W=W3T^/HYD[75=\nMV[HAXCQ-*:6(D$!5[:II*J7,>X+6VC1-M:ZO=^Y5-3H4]]4;(B*P66COWK9U\nM.:ZGY]/IN)[7Y7CQ:AEHS].='`ZX3X$OOWTZ_S\\_/OWXDUXN*9PS,<?\"H(*:\nMD(0Z(2A6M;6;J@[=\"7FX6B`AHR-P>'-3TTT=@IAY\\*W#:Z`%&240Q^;1>T/$\nMHS8(TH[LI7\"!G#O!I;9]F@60@KI;=P.\"<2;WR$2$'F#>O2&.,%Q[W0X\"A2`:\nM!@)0!$[SS5(WK1614Q+A;$U;;7(-TGGC4U[+5TNL84J.#L*816:(I-@SKP\"`\nMV'NWYI2$<Q(([YL%8$2^8L(I44)D(P-3&+%[0\\3H$69N&NY(%N@VK/&`@'BN\nM%[-JW@(Z$1$*(@,Q!%F@0R`&$3N;*]9K@VBZ]K8V7;M7$\\5!I)D+)Z%+;?6\\\nM;J>-.>UO]XAMZ;6!7\\<20-&J;^WYN9<T25`8A$;;^G:N.>?B,5%R\";`@-_4`\nM,@.\\O%C=X:DWV/9:]3#-][=WO_W\\6[^_\\YO=IX\\O\"\\3W#W?S_2U(8J()TO'S\nMR^+P..UO\\MU\\H>7SBVW+\\7F]_^[K_;O;\\NYFF<NQZOG3NCRW]\"U.-S=IVG&9\nM@-&]![H%:EU5M;EQDD/*CF0!#I&!WJ(XQF&[^F_W-__VI141G*;>NVJKM8TK\nM3<8_'17IP\\/#NJ[+LKR\\O-S>WKY9@*=I.NSW$;%M&^642S(SCZC:-^U-NU7@\nMB-?5A1/1T+>*B,=HQ=BZ:E7K-:PC6&B`#V0HI)!]FB;-<-:3_;[^^=/Q'W\\X\nM?OR8U&0N`HQN1U408&=RXD[6W5>S9DU[(6%FM]Y[!W-D$J(\"A(S=>]5N0$E0\nMR1F`^LJ`<Q@E5N#+6JU905O\"2A(5.=7-CVY@TY0-(3MR(`:HAH(Z`J(+I903\nMHYB[UA:N@@01ZIIB'LL]!&1@P+';1G>`$.8AYTD!\",$(@]7RKYL`?*U*5NO.\nMX)F!`9$L@LRE62Y386S:>^M,R!XB*)!]9B('[#\"@5`YA/LRY;^DD[L[@`\"@B\nM$#PX*C'VBA\"(3\"++M@1X8`,(YN\"KL%M*[-R]]6Z``&&!W2T\"JMG2^KFUI?7N\nMX<0\\3?,\\2P*$6,^7XY?G>EFB.R-E++E0(+A>;:BN9JWU=6N;H\")Q222>)D`/\nM`^^^GU.!I`T$!1PO;6M:5:-M/:CTOAU__?SR[K?O_N;O_G3[_O_Z]+__V/+?\nM_?%/2]-//W]^>+CY]ML/-[>/=^5V:GQIVM8MSENBN-O2XSKW9WO^\\67[J_O]\nMR^[OOOGJ;[Z9]^FH^MS//_GI[MV[1_Q0^!YX)B!7-[7-NKDY!HDPBQMX;=I;\nM7#7MU[7&F]VOE&FL[L;%^.:&?_K\\[$8`Q(3REC1XW6X!7(&*KV.Z8=!^^P6U\nMM</A,#%7[2.6K?\"4<\\;7N#:`(\"*D*QM?.$6/,&Q=>^_:FO7FWG9IED+9R*\"S\nM`0?[VB^+_?CGG\\[_],OE__X)GA9AY(D`'=TR)P(VE`220\\P\\F67S4^\\ID2/U\nMWK6VB$B0`)&N$Q0RAX[A%!T,3:FU3$0,NS094JJVA4\\.9T(N&9-<ZGI93Q']\nM_O9`6?K2<`I\")+F270A!&8[>2LI(T+J[6Q%B9.7(*Q&`!5P/`.\"0B[X\\GU&&\nM2I1;4W-*@<2IUO,8S%S]LJ_/<S,E$4PY#$Q=F^*Z16MIA7F>DK,&B.1PJ$MC\nM@!AR-@^/#N&=NZ\"$HY&/X=F;\"(994A+TW\"T4QGD%,R.F1!04`_>/9..'B`G1\nM.:3U;F;=E<-;TZU5`/C2+\\NZO\"RG6K=0:^\"<A>=RV`DBGL_'X_$(#2C$-7KM\nM^QM)+.1Z%5ETTZWVK5(DU^C>&4E0%/J0T18N.9\"9RUP$Q<_F9N%ZQ[>=T\\5K\nM?SE_^>$7O?GJF_GV^\\/#GW_\\Z_WC^]TW'YSS.6%+^>[V(8?0E^V0IHO[\\^]/\nMSQ5FVDT+E,\\*ZVY]WH[P9?VR/%3C/]WM'Q)E_/'S7];^LNG+;7M_N+_/4_$`\nM[TUC/U0R.%2!05F2$%M<\\=M#IO*&*:SU\"O(:E][XVGL7*>-`II3XO_\\?_KN1\nM;3;,N^.'F;EV'0KI`&Q=>^L1(\"EK;X-DT4T'B95S`L*T-`D40/`PM7`L:9IW\nM>\\?4NZ^79;U<^E*]P9QNW]_]H=[D!>W8SYW:89=N,\\/IN/SRRW_ZC__\\TP\\_\nMGM9+I=H+T$%T3_5`^T1Y)BK4V,^A2]=0S\"X\"(QMKJ6Z-?0%?T\"KZ4GP+50@A\nM$<KHI$9-J6($\"@1;]TO=%H+SCIXG^&81,1+)TVZO0$M3H%P.=S33QH83<@HP\nM3X89BC3*-NWE`!6H^]U^5UBT;H)1LW2)!@H\"G+#WM;<U\"V8V<B7O*93=PC;W\nM#F@^886^Z+9I[:\".#A2!/E,N0)-Z:EW<@-\"R])(ZAQ>N:!4L$KF@4P2C\"P0S\nMI2+3#M)LG):`Q=U+H#`@(4BBK.8&D79EL[6!KF`+QL9D*77$U=1:)Q0$\"1.,\nMS%C\"29NS9?21>>X=5<_*```@`$E$0508KK;UMEJOZ^:?GKX<+TL+/Z[+N:]E\nM-]\\^/ORIX2ZR-3TNV\\NV7+Q9)LA8\\(9PTAYM530(A[75Q2J$=:I1H\":[0'=.\nM/-TY3/N[20[SQ;:3+N=6M\\T3''+<1APG@%LN<TSK9ON'#_???']N]G_\\]:]:\nMIJ__](<\\3:'M?C>1U;X<<6VS8?_U>/[MY>7E_+0NP,ASXAM\\MO,E&A'M4WFX\nMO^?;Z<+^,-UHLT]?GCZO9Q,QGHAVA_U7RZH`!,#=O=5:ZQ:]D76@%!ZFIMV]\nMF:N#81@<M\\O6ZM9:($A.)$(B99Z`:6W;VK:F30!@!&J/$SSV$`..,\"J1@4Y3\nM;T,Q(RE=(PH'DBA\\V`O?S;L1[40&;&`15V=3P':Y+.>+U1H00^E[Z75_V/7U\nMH--9U=E0MWKZ<OSMQ[_:\\TNJ/2,E&=D#0L2<$UHX!U[AXKV:HB$3NT,$$K#@\nMF'6:18\"C=!\\,,T3\"8\"-JB$Y!D1,0!9A[MB`P#*\\!'<.\\\\P;$UKU%V%*WT^5\\\nMF.^FP3D/(\"(@)B(D&<-A,V6B\"#0?:J'4KQP/'\"%,282)<L[KVD=!,F9:$=&;\nMJ:JDE)&#Q0$)D$;F0T3SE8#)8XA?D<*0#!$=%<,(G-$928;3E@:LE)F1`8<'\nM]S5YRR#0'\"$4R2!46S\\[<:H1U;S&B%^\\,N4$V(-P1$T$J8T^)P!Z1.C(D410\nMB]ZM>U\\6LP;>?6F7=;TDQL2!MLWYMFFLEVU;UK9M@3QG9R3D(1WOYI6\"F9@%\nM<\\Y:.R)J*`2%&4D2=(:H7:=IM[^YZ[C4OG1OX9'3KA,!H;J=M_K\\LLX__//\\\nM[O[NFZ_N]KN7YT_G\\[=_>'A4Z\\?C<SFO,N]WNH->B\\)!BJYM/1W/F^_W-P7A\nM)DU\"R3K4E_/E^6A?)RATLY]C@S!<N__ZPX^??_MR__#^[N[=5^_^4'N[U\"V0\nMIMV.D:*KUE;=/#P0D,D1#,\"TH^F\\FZ^I+T/5:#9T5.XP?!%F)J/^'-OAWOL;\nM2P8!UG75UJ]4-A%\\W02^&?6;Z3#0S&6ZA&(`$S(GC@3NO7=7VY8-N\\U)9+[/\nMPKWW95G6;:G/VWHZ8[,9.0.*A;>^G%=9+H?PJ11F#@?5`()$&$CJT=44?=NV\nMRWF!'H6R*882A#\"B!PXI\"09BC(B9\"`1*E(`D20C1%AEH\"G+WG8.`\"OD&X#MN\nM6E4K5PLT8EBTO:S+79L2SZA@[C2B$\"`220\"L=2,`GI(;F`-28I8$5^KQ-?UF\nM%)@>A\\-A-.O#YD`H(NCN*1\"O8#6^1EY[>'@%1U`$Q'`B!`)'5XLR\"1\"%>A`J\nMN44/\"'`HJ;P&0@0\"`CH0X%`87Y=%3L%`V,/7NI)8#ZNF;X>0`B#BD`[7_26\"\nM`P*0AZL'8`>`%J9N$;!L[719>^_K!<$0%/I2H]7]S>Y^2GO!Q--R.:[GK6TM\nM;\"CE4(@[-`>SH05B(8S!1EJMB63$<#<\"RP0\"3KU>&A?5Q\\,.:FW1!12T,;J1\nMBG&1/`G7X_;##S^\\^_Z;#]]]]U_\\^[_Y^>>?/=I\\R)<O\\/&W7TUQ>GA?[&Y*\nM/3?>MS@NS4^K.0>7PJ6D727[<CF=?_J]WK%\\4_SN!A6RE`]WNX;QZ<OS\\N7E\nMV'T]+KSX[N:PG_+FT'KK$02<IN*`KQ$L/`:AJJYNSU^>Q@AJ>!O&(8R(W>XP\nM[.]$)&,$>A4NNH^^CIFU:ZVUKIN(C+W%(`BA((QI601[$\".S))9/]42(CN1A\nM:.ZM]]I<%;=.X0B8A25G3-+0B+W^\\KQ=%FQ:0KC6^GQ>OASK9<'H*1-EII2K\nMV>9N:@S][G##')@]``NO&T:`!W0SB8`QA&1@]J!`0F(.`U/M9AW,T`7!$$1Z\nM#V`\"28Z`W(F,71A.PG;I33M5(R$$7%I_NISNM]U.,I`%@4E2,E0C-``T,Q0.\nMQQ;.0$ER@#,``A)=]V@(2$AA+B6E24J:QCE$1`*FS&@JP80(<C747_EWX>`!\nM:C[0BH%CK58CT#TP,'$P#UT+`'B8>9A9@\"&1B'`B9J:4&`G0S6Q116:-:&;F\nMU2\"ZFT(XCND/,6``CU'MOV8/@B/AHALB5E,U=<\"M]66KK;7U#,V:-R/U`G\";\nMTT/).Q'LN%VT+9H@4Q)$+)0%N-F\"B,11IIQ3(C=PC:8Y3Z\\ISMW5\"#PA$,2Y\nM6:YZ?\\L=O'N?\"VCKJN=#/H@A&I2T7]/E^+*<?_WTGWWSW7_Y[_\\NHV>&MJU@\nM5K?EY=B>#.=NN]DR[-*FMR'3_O:F3.(`O0-0`=XKKK4NOW[&WV_HG6S4HA#O\nM\\MV<YP>^U+8&+'W]Y[__^P_??WOS_CV4S(P.5_>@`@)1(F+A(\"1&(`.%N[N[\nM:V0:\\W4@+/+VAU%XRCS/HU\\<)HE7(Y)TNTS3E/AJS'D+`TV3;-OVO*X$,'0/\nM3;=C[RV#$`>B=NM;[5L%-0RXR;M\"&`3!:&:K;ENK6ZW6>JP=U@X1_65Y^?WI\nM_'1$A4Y`F2P!3>0DO:L\"$I%!$!,S9N=\"4D@:]*OM=0S?(=`C!0(@(\\.40160\nMM#=U4VT1&DI[@P!'#`%6`B=$)L2(9M\"-S!F9&$SMO%P4]/'=S>,THQ0&[A`]\nMD,%5#:YA<NP0H<$YC[\"`UK8W-\\G5U!MA9B\\OIZ&6F*8=(D+0<#\\3\\%NHXY4\"\nM3(P`<U=B\\\"!WC<``9`]RW\":*\"\")^\"Z6[ZJU['U!C\"`ST0`_&X`BF0$*`KKVW\nM[HQ.:.`8I`!*Y!\"(0UK#3-S[50`H*(($$$,]NGJ-B-J[-8N(=:NU]=9L.6^M\nM;UT7=I]SN96R`]H'V`;UW'0U!B'T0\"0/Z`9DP\"0(P%)(H@<J1(^;Z495>VMM\nMZV#N<R<\"9CJWFJLH0+`8@B>&0F'P;IK-3\"]]GNE[V<MRE\"_+=&HPY?M4UN.E\nM\\_2PO^&']Z?GGS^^G*9%'2^>[DO:W4AV0@GPK36%;`Z2;R@;^N?-ZI<S?3G,\nM[QZ/K?_RVZ^2Z:N[AW?S[F1.8?B0ZWKZ^$^?L92OO__CP^/[\"&RM+:T'@O7N\nM5(,P`$;OU&L=!V<,7(9GFIFW[9H5X^[26EN6157'UOXU7A13F0!`D<:W(Q>M\nMM7;S[@$8B!',$PL3!5LF`MLP#\")Z;7W;M'<*(\"*'8&$65K?>M[JLVWJI=7MW\nM^YBZKI>MOISK[Y\\__?CSYU\\^ZMKYL,<D2D!\"+AQ@#,\",$1V#03UZIQ;9V=Q4\nMW5P'8!P!9&`R$86P=N<@EB*4U'L%[^2!0`\"!L((1@1,JTQ\"+Y19@%#1)8L.X\nM8-U:7<$^GTX?9!<\\\"XL\"(1.$!(\";,3,@^M5N#^JHCD80X4`LPF8VK&0&_HK9\nMLI12R3/1&$='8K;P-T?\\D-@&0G)C)\":`<3\\``A$1[':[T;&_N9G'JS8FGAX\"\nM`$X^-I46VE9```9T\\VH60)PRH,``7\\0([@1$(F`&KEX'E2.!&URA\"F;6T<QC\nMZ;5M3;LMY_5X6JWUB*Y]`>M3YH=INBN[?932J9[K=MK:TIW#*!#165NMAUT*\nM1[<!R8CHF)31\"S?V[NQ<L'AR(-[,T'V#.-*R&4PW-Y?GX[)6XH(YC0P_,)>>\nM;DDJ9CZO_=,7>R>XMNWW+PK3PQ_>3U]]>_GU^?>7XT/#NES*CK][=S.ELEG7\nM6H-0<MFL0^N,5!+O'?+BY>*']VEA?SE?EN.\"'E_?/Q)\"@KC[YJNU]_.GSR^7\nM(WW\\O9ONRLU<IL+B[GTD3H\"CL*3\"2<KA,(1L]);>\\?KM&X-4QC9\"54LII92W\nMQ*5Q]8T:->=<<C&S=5T_?OPX:\"4(T&H%<P)DQ`,E,VNMQ]:\\=5<U0@Q_L;.H\nM(*)J:Z8`OB_3G'*\\;`GDY;Q=?OG=GR]1>\\:4BI#L.><%FD5$[[8M67C&/.T*\nM$UC75BNISU20T]K;N3\\3(HD(IH``\"@80#%^<B(:<7!%V\"\";@'&#:S1S<$`$9\nM$9,\"6(CR[(%$X;1A7P*\"T<)_??KT=:0J\\UZRL7E.C!P=_57:PLP(W-5C1!67\nMU'LW!\"(T![6K]?/N<+=M6VNM&X0&(KH%>C2$\"#!`#5``'[LB`!7+(A+H`J81\nM\"`KD@-G->P.BH7\"[ZB*0S#H`$(._?M!$0(0WZ]9UY+`'$R0&82?()AY!@#[B\nM`@R(D8&`K\\LJ`@J/MWROFK0W.Z_+Y;18M[KT9=E4=4<NY.:>@7>IW)6;'4ZV\nMU9>G\\^6T]:UC8:1@00I\"=0[Q<-`1UL=@()8QP\"X69CBR*<@->5/SB,;P^<OR\nMY73^T]=?E?O[C^??O,=,HO4\\29J2.$=H\"`*H+9?+_/AXX.E4X_SSEU.ZG_*\\\nM__#UBWMSP!94TA\".44!.Z6:>@,%7O]05U4NDW(1/6_YX.>]?\\*NR>W??5CS5\nMRWPDD5RM_X3Q\\/[==W_[QX?6>XOS\\;3Z>G=S&Y)).#,1(X5K1)@/[^JX\\?YM\nM6\"\\`B*2WI#,9R*:AIAD\"M'$\"U]KF>1:1L9!`OXJ_.@P*/\"069($^L#+=E[5I\nM;ZW5WAT\"KA'M@_K*+(A2DJ5QUYI9YUXD6>O'IV=>&CO(:#0[2F%6-.NN/=8U\nME[)G(;1P[W7;SA=KX9%<T1NJ-2&F(*(`'+=((/@-%'(,<P]E\"!-'$$#J9FBP\nM800%$R$0`R?WUL%BL,I5J1HVFR!`GKY\\^<*[[?\"^SWU<FRCH[HX`9J^1\\:#J\nM%C6EXA#J!HZ\"\"0B!D(@8A9!>3??H[D.!S<QU+&D1'&'P=H,@`%IA2H24O&OO\nMINY.8$'SOXGX>0-:`L\"5%SY28BEP)#P13FE:;0D`8@8F0U\"W;BX@,6R$`0%`\nMB`3(@\"ES@*$C4@\"ZAZHU53UN2VOM?%ZW9</@K@J(PLG]#*&AU2*!.0>#8CW7\nMX_.R758/*,/*P2C$#!QJ$$A!$B*<P3L9A9%@,E7S;@+&$5D$D5(*K5]>GI^>\nMO_SI^^_R_K;ZIZ76&M92O2\\E<UJ[+6UK886)F&?)#[N[(Y;G7S__Z/PW?_OO\nM'K[Y=B%\\^?A/=\\`U[/ET[&J2TVZ>`*E&-T9C!(L<@=WL^7SYJU^RYIOO;KZ[\nMMQUMOWZ\\7\"Z[\"5K?3C--=GM;#H]W=X3Y]'2Z/%WZ5IULVN_F>:9<6E@UM0`/\nMR*5<C1\"O^_HW]<Q;JB'_3__S_SB`,==#*7+-<RJ\"$>$F``F1S<4\\`1@&`8U)\nM.A,Q8S?=ZK;T>JG;TJIAC'-PM6^4=)BF*64H7'?\\A.VLJX%/OSZ?_^$'__N?\nMT\\_G6$S+O!VF)]#/<X^@G<Y\\SO7D\"#)/^3\"5<`K3K2Z;5B7?M->NP)(B]<VV\nMM8=#+C-G,8BJ/154:@UKA=9!%1T0$&\"-`\"86N0:\\N1EX$)SES*PE.FM%Z\\;1\nM)]+\"W-3=I]O#[<-MQB\"KD%LO6P`J5A`'[NH+2T]9(RX-O&MC)\")65>M.2(1I\nM3T``[N@6$<!\"+`%LP`@8!J&N>GV%\"(FR16Q].U_JNG'$)%(\"DYE:=U-W0PA\"\nM<#?3[FY:`@F9$1`LP@A\".$J*YL2$1'$MU\"D33R0<$P61(3FR#^8O.V#5Y?HI\nMO*[+LBS+LFU;K?5I[<_']?FXK)N#`D-(&%M[,=#6LMJCR->[P[O#C6K_[=/G\nMX\\NVU:64+$((SH2,(\"49YFY!$',A!#V=7R[;`O\\O66_68UF6GN=]PUIK3^=$\nMY%!5V=7=(L5N#B+-I@R9(F'+EGPC^`<8,.!;2R9E2B0MT`,,_3K?V3>&:9I#\nM5U=75=>0-61F3.><O==:W^2+'9E-P(%$(O(B$H&(L\\_>Z_O>]WDR)P*C;FRK\nM7L2VXW&\\/HP@K9O4B3Z7T_3>\\P^?O]#3^M`OO[A\\-^:B4[DS?7UWSY\"F819&\nM/BYMF;SY]O*6;K=#%(TXD=ZS_4BF#.RF-^O]B:I/B0H?KXZ>H:>0$>7(;40\"\nM/#1Z<NN7AVV@G.>2EDR%[GO]1NLZE[SR$B4WXC1`*<8X,X\\]6O9U.W>M:4B4\nML?;6I1+OZ&8354!(.8G*9;VTWG-B1-C_I-O;VW$<]VMOOVSV/B$E5E7MPH!C\nM+D/**M+6;5?2X%LV4*C46GMK^V3UG;]I_T_VS0<TW2[GBDJ'\\7F:1%M_\\_#Z\nMLR_OOORZW][O!*?-9`43@N00HE*;B0-Z4'2WB[1(0T1L8E6LJZM00,YEX'B<\nM&S&ABNQ,]7T3&+L;]7&\"0H_.,]_OTCL.*6+/4+KGP.1(NZX!'`(!R`TR+@\\7\nM__+KNZ?#L_>?/9F6$2-C1\"(`XB%E)C#U,-]-TJ6,^_`SWGZX.Z)V\"\"0>AOSX\nM@PT%\"&:TO44!S@C,!&]E!AS@B8')S.#M:D3<@G#7)\"*]70_N23>&QX291Z!I\nMN`:@>`:$_]_'CD7=R]YOH:BT8S'1,R$SD2.)M59MVVIKK?<*W7/W%%@0,Y`'\nMB(B+L,>8\\I`+(F[;MFW]?%XI'@L<H>#H:;=A$V\\<8*;PR$#H%!M8=WDR'1`1\nMVFJ<#;D@P[[G-$#\"T^W#IS_[^-=^^^K)DR=????-/$ZHCKLT,KQ3.&A5AWKY\nMG1ZH,%ATT=YJ;)<SMU/TN[!G3Y:E+/7^=-JVVA^J\"98T+:-@&(&*@1IVCVJK\nMV\"M,XQ=\\>)^/RP?3\\6G!85\"C7/:4W\\/E/(RY#(DY':^>3`O>?_M51*C(MJY9\nM2ZBY2.TB^M@!?(=*VS^TRR_3,^^H,/J.DPG06LM#V9<;%!`(W51%F@H6`@]U\nM!S?MTMNFK9O9OL??_4W3-#UZU\"(H@--PF.?-6G.U2_7O3OK9UV_^]M/UBV_Q\nM81MRQDS5V\\E:!^?+UFN#QA2$`Z8QTXB>HKF;Z>JT&77QWITPPB,33M,TY&+2\nM>VVB/7/:\"7'[/,GI\\57VR^=RA``(=PM74S5S\"'?8M1(800`9<##2'A&CJ-P\\\nMR,LW%^+E\",-$J4PC^?EQA.^`^U3REYU.VG&ZS!SF.VU`\"N0T$CMBN*EYYSV@\nM%81[NFR7:3''7LB,A`Q,\"79:#^);-Q,@$KP%2.';O:[:EO?86R(.]/`@\"$)_\nM+/'BWTNN@5F(]W<^'P\"@('3$P&VK;S7IIFJ]R[;56FM<-D+,AN8`\"0-!M;?6\nM9&N%:9GGI\\?#-(RJMJVMB[$3>KA[J#MZ@<+[PB-C$`)@)'0@2Z0$LB<<B0LE\nMIQ3H(5JW[NC#,(P.8]\"KK[Z^>W'SV__@5WO(+UY_H]_=!9\"A&[-F4H0[;6V]\nM_R>U);,)X^+2VT5/T\"([VI>7^D;O[M)AR</AQ;.KJRNXM%?K^>E(@5!=JM3H\nM6C2HB]=^NF?[Q`K#'#C]UH?Y^?.L<CZOQZNKG(8*IN&V;:K6L1RIS.-4-'>5\nM?ME\"K8Q3GF8SDTR/%>JWVM;=%#C/\\WZ!J&H:Q_$13?OV3KB_DN[O[A\\5%J*]\nM-40\\+H>K9T]/LK;6^M:DU<?2,?,TCD^>/'N'\"6)FHL>SY2K;G(=EF<=(Z^LW\nMIV]>KY]\\>?KXR_K%=W2_#4$I9RI@)M*LFXYK\\\\X@\"\"D#)RJ$)4%&[]$%Q,$B\nM25\"+;M)/8K/+LBS+<9'*O39QX<`TX,[S9V:(_;40^ZLP97;W<',W-_5P#XN(\nM#IR0F0@!2O#B1$K%O4X,\".KVYG0_SA,,\"4M\"XLP8;A;@^WP?T#P``IPC^KMJ\nMV1ZC!0-U#Y/]:Q34P1#)`L=I-'4Q-8@`<H2]XFM(C`B)D(#V)9X',ON[=,O?\nMNZTA8BB&(S`A$B-;[\"*W4+>4'EGA[ZQ;9F;,#N\"^>V9@ET&%QWKI;R]\"[5U:\nM->FA`ORH:MK?XCN3B_:+-NI]F)?K<;Z>#R.E=:V7K8J8\"XA;=@+8<P\"P\\U$G\nMYB!`P#$70AQR)DJF=O-P&HFRXQ3)P[59A<V'Y`E\"_'H\\U/N'O_WK__<?OO_B\nMQ[_QH]M^?GE[[Z@`%'D?#<766C^=3N?[(Q7(:.3>*ZXPE,.TC-N@6Z\\7W8A(\nMUU,:AQ=/GY1CJ)M\"](!+J*+F0LSL.1V1EI,/'[U:FX'!U>__QO7QB9Q5-DF'\nM,DQSF@_\"M%Y:N$*.#YX]5??+Y?)POLC6F'/.&1RB_%)\\MI,KB.A\\/FOK>^(%\nMS!\\+1^\\>GUIK^[WQ^OIZOY,8ISWFHF:!8`55=6NUMQIF*:?C<C@<#E.9WFFT\nMW]UG>^^MP'IY>-@N!'&ZN;U]^<WYLR_/O_A*;AX.F(=2%#$P,G$\"ZF(9\\\\!0\nM@H`=*`P]PB)X8-[4I+H8*8``K]&ZM,W%QD18TIB'XT(;DH>$0Q@3Y$1@WKM@\nM4.+\"S!H@\\&A9<7>(8,!@:@\",P0@I\\6`X.,U\"0GQ^0KUKD].;4YN.Z?A\\<AA;\nM7P_+:&#=G)ESRH#8K)O9@@SQ]E'-G0GV+J*:FBL%0NR*6C10-9T+`R,`,*!!\nMF$.@$^)C>2,\"'I^K$S*B/VX4WIDDWY'J\"Q7>9R^.%HX.'F[A0]K%D@F`WB'4\nM$$&UOQN7OWML-C,,W\">B^T!NSQZ*R%`\"\",U13,V,(IKWS=H':7PZ3M?3,N8Q\nMNJ[G[7):ZR:D)N#,&!C(Z(R*T5RO7!$A$8U$B%R1LZ,;/*R72`,3CY0H41O@\nM4D#)N[B('9:Q3/;55U]]].G/_NE_]@?//GCVLV^^N9?*`9-#ZQ)J5D7O+K^X\nM>?WB^MDYX9D!JPP;'0[TK%R].H14H2`,NWWUNCZ<A^_]\\(K'M(R//Y1$';$3\nM`E',].NM7$/.&[WYY.'&/I$TOO^[/_J5X_MO3O>9B^4TCN-<2H;$P&,9SNNZ\nM+XW,3,P&,2Y#R@SSTEJK5K7UBWG.642D-AH>$Q'NSO_-?_M?OPO*O'M@&X;!\nM14T4`*9IFH^'E+.:K;6>UG/MC1#'83@LR^&PC--4<NYB`1\"P-^S\"]NT9X.%[\nMSU(@==/S>O_EM]_]W2<W/_UT^_JU7>J<A\\1Y<]G0!2%$L8J*L$$.HP0X4AI3\nM+B5SSF+UO&U;$X-JMKE6L`8BY$8[^@'34$K)P\"2J`^!8ALS)W\"$@I;3K&:II\nMN)FIAH:[[]YFQ(I!$,4A`:0`CF\"`\"<FH<ABB]Q#QGC+/\\SP.91P*`!HB$%`I\nM1MA4NAEC=O><..>T8\\?=K?<&R`$4D(`S<P;FW>A2((?OH'4*8$`B2,29F0EQ\nMYU7L<V\\$B'=WU[>]I_26,8SJ*8AV;\\+;TQX1YZ'LYT3S1^K!7M90-3<W-3</\nM=U/MK??6PZ3U;=W.ZW:N;>V]FHF[!G@@&D3L8US7Z`*B+_+A^?'X=%XF).MR\nM7NNZB0*V+HJ>QR$8(F&91TAD$(6\"*%*BE!F`UDM_.*VUZ[X/'8$GSN,T#M='\nMFW-E.\"N(:LGY:IJ[-B=X_N'S9Q^\\]_F;F_OU+\")L@)OTM:UUZZHZ4IK&^\\OE\nM]>WMI39U'X;QN!PMHZXU+MO(A0A#`[I>;N\\@H-4JO8>:J9FHAP/@AUB6,LUE\nM\\0XWW]S<?_MF1'[_ZOGQ_6?C<?&2N0Q3F08>EF69#\\=Y&2FG)OUTNJSK:K;G\nMV/#<NYGMC8IW;:92BHH@P/Y*Y/_Q+_YTKU3L(K3'F\"'`\\7#8+].FHJH6WJ5O\nM=:NM`L\"0RS+/Q\\-AFJ?$[.9N\\<B9ROD=]C?G/.1T\"\"[GOKU\\]?JCS[[[FY]O\nMGW^33TT)IF$$I(OVBFX1W'14N)4&K8<T9LI+*?-0<DF!?#IOZZ82BG11.5EK\nMV(6L8;2P9MI-(@(9`\\$B9H\"4.\"#<%`E+3DPH*G6'T;GMZS@$0$(`2(Y%/'MD\nM0(`0$Z>`3%`;0RK38LRWIW7=^I\"GDD;B<,(`<\"9(W,.JJ1/%Y@`QEJ&4\\F[M\nMI]81APB*(`ORP#U;'8!)]LAM0F1PC$\"DE#@'P*[I)\"0FSI3`P]40B8D1<'<:\nM[N,4!,P*[#L'^6UP+Z7,R7?HUO[8;;Y_XKXGY6`?L>[B$S<+]\\OY7&NMM;96\nM]X<:@\"!\"=@4#%$?U)):;#N*3^]/A>)RFB=%:;UM?UW9I\"LAG;9@HSV,00*(R\nMCY!)(32UR`0C0RE\"=+_5F\\MZ427''+10*@&.0<L0AU(3K!I-A,(S(B7<=.M@\nMSUZ\\=WUXMIU7M!B![=S6;=O,UK#A<)B7J]-67]_=KVK5W9`CY?G]Y5!FV:JJ\nM8,EBDI#G<6)Q:,KJHP*M'1XVWF06@\"EY*5CFP1/>5?OV#A_J4&5]?XK,GE,:\nMRD`I!98RXE@P8:WU=#[7V@*\"4RJE#,/P4\"L1+<NR+^3WZX*(#H?#.UUAFN=Y\nM'T;O-\\!]TKCS/_;(Z-WIH;4&A`81A-,R[TZ0)CWG7,K(*2E1;]O>`-YK#KL9\nMAIDO#[=3]?;5ZU<__?G=SS[7[^[R*G/P>21(K!X6[AJ(F`T2),[)NJBHF91P\nM0@R5WJS4+:N-*0DFE-:U51)!:X`%N(NV&HWJTV%<\\I\"'3!;[LY:^?1]2U5Z;\nMQ'Z+CG=,R?UT=31T\"P)G)@%OH!:>D*]\\.M?`.9<RJ-2;V_7KKV]!,^!Q.4RY\nM%*)D*A8NX3EG:+`O\\0+,O2?&,B1.<V]9(TPMP@.!&3D3I]&[,3]B^P$\\'!`)\nM@N\"M\"Y@`$R=&`@\\-V)$0OD/B'N6[$`!+&=S,1<T?)?)D`8\";Z]\\_.MI;D)3;\nM+\\6Q>RKC\\00AJZJJ=0\\)\\-BS<!$'2&JNW4$<Q-BL>\"0HC,'A6EM?Z[K6AU.]\nMU*Y`D2@8@\\D@@\"(20:*P6-&0C3+2`.'4\"K:\"M0-<VL@C,&G3VBYY)GSRC'.^\nM&J[</0-T$V\"2D)]_^=GUB^?__#_^+\\]O[E\\!PZ7=WZX]K$%L``P<2!U@0W#&\nMZN:RP7I*O5P/^4T]^Z6^>/][3G%73YGX!\\^>>]=D0>K#5A_N*@!,$]P\\216*\nM0?\\@S[]R_-Y[=Z]O/W^XZ7_WQ=/ZXG=^\\_CC'XR`KJ;=G#AEVOKEX7+>>J,A\nMSR5'H)BN==L?,/=JQ-L$OS.SORW@NSO_Q?_V9TA[^X$!`MP2TS0.K^Z^UOWI\nM!9B(31N$'9;\\_6??>^_ZZ9B+MAW5BOO`QS*1!XN)R\"9MZY6Z3A)-VOKF[N$7\nM+V_^YN?K1U\\>[ONU,U2Y&>DURFOJ&UAN-FZ2NX7[5EW=962]&F$H8YJRE';?\nM\\YGZ6;4::`0B<#+,31!G/DM]4+F07=`V,T.B4C(?3`@Z(\"4;AT;03<,M<0DU\nM$,M`$W(Q&\"4FA<'GJW*=J'03)0@F1T>P2_-@;\"\\``\"``241!5$8L3!%CT%69\nM\":BJ=B(6F89#AI(B)4]A,*8)C$HF)!(W\"X#$P=F1'5-`\"U(E%78C!R2`A)&/\nM`>P0:NX&$$@1X!&VH0:C$U2T&EK1.H=F#$3%V+0K!H^EAV_:(_$0%(C&J`0=\nM0\\`%PR%JAVZA$8:H;FJ>'#,2PA/RW,]FJZ1(KKZN:VVB[2SN+?,#Q(W:Q;E#\nMOK3`VF5U6J-4X@JH@2GS.%POXS\".2NE4Y53%@,A1M_X$R@'S$#`1%T;OW4T8\nM8ZMWRS@MP^Q;H$8.MK62JE==<BD`#(&9+]$O(.DX\\D!73^9<DF,H0/4P++?W\nMZS]Z\\2(3V?VYOWS#;TY^6E>P.`[O+<O5<=FV[?6;F]X4*;G3S?WIE:@O1[^Z\nM/KD'T7%:,J?6^]SJD/$PC@D0U$O0@%P@83XLFA?,.2>824MJ3;9O[I?;[=?X\nM^NKY\\_7`]]Q=N\\M:Y?*+MMZ6R&5X)DQ-;Z,V]-D1<BHY]5K7\\YHY3<,8#KWU\nM-S=OMFW;GT[Y7_WQ?Z?J3&F:YFF:&;EWJ5N;YIDIM6;KI4K7`!A*7I8#(^U1\nMJ7$<QG%,^7$B.HP3F&OO&AZ%RS@,N13DT]W=W5???OW1IV\\^_4+>/!3'DA(A\nM7AAVEGAX#,B,9!`M],;4V&%D&AAS(F8SJ])4^GVO)^L7TI6\\)=+\"GA!I\"\",/\nM1$C@#(9@A,$'2@R8B2BS9P(,LL@&.14&S,0EY\\2<B#$QIT1&E-!`-=PP=H8/\nM((]$!1G-410\\&##$MM.#2YW&<1G&(3,C4EA\"+$B4D(A2WDV$`+!3/QI@!!!2\nM(N1$*06Q(YFG9:A@%Y=JTL\"=$9B`'Q>`IA;N^QDQ(%1UIZP_=CM3>L>D$5,!\nM%PBA$(I=#B/AABQH!J$8NM,DK)L9`INUMJVM;2)MJVN3ZN\"^K0&.1`%D(J1.\nMYMB-P]P=#-\"1`)EP&-(\\C5?C,)3B8NMI;9>J3=P\\(4TI`Z*%F5M0<$F<&0DV\nM$Z1R=;@>IQDB1*36U:R/4*[&8:&4\"!7MC/V<M0^4,15.)3$3`Z)#:$0D^N+E\nM5__X=WYW\\O3-%U_Q]<&/8W<YY&F9)NM2URIK[9<ZIC*7\\G![KV'+.%W/BZS;\nMZ?9N3.DP+UVZKY<`R)0*,(J[&%,NPV#7ASR4E!.EQ$.A4JK*0]M6%8RPB#6#\nMCR4(A:D72B<]<#GFD0\"K-%&=4EG&V=[6`,T>54T[7F2<AOUYM93\"__V_^2,1\nM\"P-$)J;,F3D!H*F80+WT5H602]H-HB.]BW0S1T3O;8_D#&5(@(PDX#7,$#(0\nM6IR^_/J[3S[_]J-/MV_?I&8C,D8TZ8KH&`[`2`E05\"^]WK?M@HA#RH>!IP*)\nM$<',I>M%VT.O%^N=43-+)B44C.2#/SH_\"8+,P`PM<,:`B$041!JNHMB->[`[\nMF9,#`H2'NNV^^!$IR\"W<,12QV^YL3C/Z0&D@WG6]8TYHMM[=2;P-/5`P(D*,\nMS`/SJA=WC7``<S=5$:TBG7+9=>^9<P+.`6Q!9N<1MM`.[IDII2\"T\\*Z2=C5%\nM``4R$!(Q$`&JA9D3<4IYMY82<02LO4N$(#B1(2J`N'>S?;_2W1S,(]0?\\XF]\nM-6FU;J=6SZUO3:J'8T:MEP!T`C'I6P_5Y(YJB.`>X(CN'%%R7L8RC^.4.\"/U\nMK6_G36K7)F@QI)*0PD-$NS;.:5C&/!9`K(:J?CA>S\\MB)MMZJ74U[P<8YY0+\nM`H16[/?8UA%M2;$V1DQ$F=,TS;D,Q$Q('[W\\/$O\\Y,>_:81_^?G'?>1EG/!A\nMS>/P@Q<?LL'#J]?L,.4!U<E#W?<CA*E\\\\_*EN5X_O<:26KV(!ZJS`>_C)Z)(\nMC%=+3FD/I/!8TCANVF_.#V'@;U;8^O+DV>'%^UNF.Y>MI.L[*=U[:Z_ZY=2W\nMW*P8]#!#VE,K.9>=64'$I11WB,<C$:7WW_M>K56E]2ZMM9*(B$2:=B-*&#26\nM*><,X+V*J^T3?F;..;F[Z&,/>%O/.1`)@T)5P&%M!O<KW6]^<[+[\"W=+@.Z^\nMF53M4A7G/,X%F*Q)-SEINX2PPYS&:1IY2&8\"W:,:J&TF1DZ)*6?*1<-7K=#%\nMT3D,00,=$EI8,V6`!PN#!%P2[AI'8@\\R2!Y!#(0*`.`[-Q\\)\"1_)=$2$X1`)\nM(0!XDYX+#-/(JIMT1)Q*.HSE1MK7-]]>O+UG[W_XO0^NTB&LY5##76`<`&DW\nMMY#GE!B0`P\"!(H*14@\"&8\\1MJQB0'L,W!&*F1A%&FG/.J<C;!'!**:7L@?MY\nM>S^Z[\\.P=VL&`H``1HP`\"G\"/O6Q\"H)\"8\",A!U</4W-5$O'5KJKJOR\\`0<N[@\nMW>S4MG-?DQ&GDA)@`\"`ZF`1FY'V&FP!@+]NW3A8#9T`W]P0($H&/8A0`R&6D\nMQ+UO05.5=G>JXS0QHH?VOGKT(5TE1`C7%#VB053VDGQ.@[\"!M0'R(8W+/%[G\nMQ=WC`_RKGW[T@P\\^_/5_\\I//+C<_^^E'5]/QZOG3==W8K$0<J<`PN,;YLI:4\nMF/!\\<W<_+<?#/!Z7[Q[NQC???O^#%_.SJ_O[U4_W@?J,IQ1L8*$P7CJ/&!&Z\nMLS9H*,B96*H7D_F+R_3SN_)KFPQ/[K+=GB[OE>+J=[U]A5N$?*A(1C6CJT0%\nM1-PWA^YN&FKVUJ7KB,C_ZH_^2%5VLJ:'(CAQ`(1II)03Y_T*!H@N354B;+^R\nM]^#7'M[8`VY];PF$!U,A]OOUX<MO_8O7MU]\\7;^[H;5A5]FE)PCK_=D((_.>\nM)C.SAJX,PQ:'95SF,1.0>*PUSA6K=%=T((\"22\\K)W.K6M'>CYJP23:$!.X`@\nM&B>?TP@(CF!,SDR4!T@9$FHC?`1'&(3##FF$%*[FMJL4(72OV3%MT(R)2H'$\nMXBZ@SA`)[Z1M*F>3\"A$E>>;F(A!#>A2)1.PCD\\>DO',)0'6+0/38J:2(X(C)\nM(05DA]0=U0;DJSRV\".9$Q![@'KLL%@`MP,P!,`)4C6C'J`=I4\"`[<A#OGQBD\nMH,D\"S$`]A9,'=HDNT?6B:ZNKMAX>B$A,@=!=>TE;^,GDW.JE=4),S`!0)%`-\nM%#B@I#2781E2)LX`VJ5N3;ON3\"NPP-@?<M@@')VF85A&05][VR)U-808QO&P\nM3.CQ<'^K*D_PN)>0*;$47,EJ09I*/H[`I+7)N=E:[53M7%.'OC4>Q__GDY]_\nM_U=_Y5_^L_]B_?;FJR^_M\"G_Z,,?]K5\"D\\$Y>O>N`*\"FH*Z]$^+3Z^OC\\7`^\nMG]9M/1P/>4AU;7K92\",!!9(A\"<'L/`\"G0%(OR!,7\\F#UUS>WSW$L3F?IL`S'\nM9T]Y'C>W<AQ]+G(U7F9FBZL&\\S#2]9*'D9G-;*](B(A[,/,P3/LO,0+XC__D\nMCP%]&H=AS\"*;:C/KK5^L*Q$34F(>AC(.>5G&)]?+.$WS/#/SHTHM/3HQW23\"\nM.!$PJHJ?U_[MFX?/OKKYRX]OO_K&[BY9/?012[@C&\"1AHP@$`@1$#5>(47!9\nMYE+83:75?JG]M$539]SIG(`43)OI*DTC:NJ1<(LN`9B\"`M\"A)!RH[,7[&EYW\nM0(,\".E*(,SFBQ1ZE1D+\"`-Q#+42.(#MAFPDP*E,3ZZH>Z!#B(;N&/I)9K+V=\nM:KWT7M4\\>)SG9/&(CG=05=,P#5-+:93=#[I'(C'V%4$.(HL4F('(`SP24<GY\nMOE=S$S>/X,24$B\"*:I='X,C?KVF;&:KO_H]]40L>*2`!%D134Q=S-]/66JNU\nMMWIN:]TV-T?<MQD#$`?@66WM6D5[-S`8*(]`*'ZH2@IDF\"DMXW2<YSGGA($1\nMK;=6FW25MG^_&!Y(\"1,%@R!X1DO4PLY]6Q4,'\"G&H3Q_^G08\\N6\\2NVI,@(R\nM<1I*9%[1O/`P3U6V%%B0BZ&M\\O#J[O3FU,^KK7J1]N;A_KNOOO[Q\\P_^\\6_\\\nMUIN'^T]>??G!\\;I0S@%R7JT;IZ01\"@[=<DIFQDQ75\\>,2![S/&OMUH4,,S(!\nM^SZE3/D0G)D3$@-EH(PI`1U2.;7FHN>V=;:4TA2TS-/[+SZX*;*FV`HFYFOC\nM24$Q6@+B5(:!4WJ<R`-P2L,X,*7]3,?,_.=_\\6>V:Q+(6U_=*J)[\"`@.)>64\nM2T[[`74:T_&P6(2[UUJW;=LOPD?$(G@BGJ:)4UI/Y_7;-Z=/O[K[V><W?_>+\nM[<T]=2V(+MIZ;R;-=2AC#,D*0]J[L>$1AG`HRW`U6L9JM;96M]9K<W?+!,R*\nM88PUX;W6.VT;68UPY%5--)@3!^7`*8V,%`YB>I9^W^LF\"@H$.`U$)0&3(B!1\nM3BEQ(B07-,`@-`!S14)(82Z0CRYA75/0D`?T<(M,?(4S]6C=3NMVOM1>&TB,\nMP\\QF$8!(S)DH$28$1B)W</7]\"`H)$%'1-\"P;NQD\"II(Y)X/H;M7U+(]=&`,`\nM8B06]R9JJN]B%?NQ_!'J#.X(\"J[AXF80!F$(CK%YNUC?7%?OEUY7V:H)<WIL\nM7P:)N$BH1^LN+>K:9)60F\"(=>3IZXNI/)3B0D4H>CO-RG(=,&*9;7;=:W5RZ\nMK>OF%IRRN3N0$RE:#6WHDEPP!*RY>Q@3)J+#-!VFI==V?KC$R<W,-1R@AV\\J\nMSCA-\"_5M!%XP'_.<,=>M7=:J@/.XW+]^\\_WK9Z\\^_?SG/_OXUW_[-__ACWXU\nME_SSO_EI`HQNZ]T)`RSBM)T-8:14AN+FK=4QI>?7U]>'0R&VUM$CQ>.#1B`%\nM<A!DY.8[[P`#(FS'7N;QN)RUWD;CXS`IV'=W#%Y>O'>;VHW6:O)<^&FC+G+G\nM[>(\"&OL[IJH]1N?WG8^#>R`2<^(_^_=_6MN*H,1AW@!TG\\LLX^%XN)KG,:<2\nMX:U?MFWMLCK0(_)0]I\"A[]N/>9Y4E1`125MK;^[O/O[BZ[_YF!^:;PW%0+35\nM6GM3=`?`0,],TY!R9D#89X<Y3<LQ+X.DN.A657J7/8BNB8)9$TJBFO!6ZYN^\nMG4-$V\"GOQ]7,XP`E19K3,A1BX@#:3,\\B9C%B'B@/J(]L%=&]%;CGM=Q3``*Q\nM@FH8)`0&T5;*,W(DBP'37,9$*2'-99A6=C%S$%-W\"'&MBH9H(J*(S(GW4C$`\nM0J\"KJ;L!(\",F`D(+ZVY7/(FIA5-.GEG`-Y<:%D`IYY13[\"XZZ;75UELBSCGO\nM:KM][[?+LS8.A1`(`5=W#1<(1VC>+MK/VE>0S62SUL($O&#>A:1N4&L7]0!R\nMQ+AXWT2VAF)3I\"=I.$`IW:\\C&`B)<\\[3-$Y#03?M_?[AKK>.Q&ZQ;AL`EE3,\nM73P\"H8-OT1N:98#\"F'-W<U=F)(^4\\M6R:+?;-W=)&0Q41436WB^].E*9QBOT\nMJ%W.S<5<X53K1429[F].+^;KZX[/C\\=O3C>?O?GZ)S_YW3_\\W9^\\OKG][NMO\nMZL,E`YT>3J?+61&Q\\.\"<F(DYPDI*'SQ__F0Y:.L#,3FY[F!GRI0@0+MP2IOV\nM9NJ('MY5(2`EGIX>I>!Y`$/GTX8W)P&/0OZ]XR5%2?D'/AQ6>Y!ZSE\"6Z5CF\nM7=W9F^SQE=T>2\\COO!+\\[_[MOQY2RIS#0%OT!F&EI\"NF;!ZMJ_1FYABD`N>'\nMYH72..9E%O2[]?QP.O7:P^+F[K8QKJ;]S</X\\C1\\?G?_\\9???O%R.JUD!BJ]\nM-W<CQ,QIX,0Y$V!RSX#`T=D[BJ/Q4N`1\\\\);M8>J]^KWX:^!5J0.W`+/6VM5\nM.'#`-*0LUHTC1A;0;CTSE2$?.XR4>I.+-)US*W!KE[MH;>8M841PDTGM2O&I\nMX95B<!^2)[(TI#R59O90-T.:Q5G;OO?(C(>4E^#2O(]*R3/8`7@4RUVRAEU6\nM[[DUWRPJH&2\"D@)!U6PV\\TYF$]&(\"0S#(8!J6`73A,:XOSOLI]$T3L,T4DI[\nM&^U=3'0<Q]9[`)F'6@\"2>0#DWE:T8,\"$D#S(S:5Z;R*GS?T$>(I4(Z'1T&&J\nMGBQ\"F\\K%X\\*L$\"K;UL_MFVZ(@:V65I]0S!$DDHE5QNH(E(=E+N/H$$VE6ZQG\nM,TO20ULP9H0$#@34R\"M:I>@9^^ZBRN,TS#ZPG[<G7)Z,@[5MSNG]<4SWI_MZ\nMHAQ<DC(^]'K7^XI<@X)FN6\"L\"#Y8+JM[;TK=;M>[/&:<<N0T+H>;T^7CUZ_;\nMTR?_T[_XKW(I?_V+GW_V\\JLYC4_+@11\"XPHAPD1[EYYSOEZ.$Q7;Y#B,\"R1_\nMV\"X/)Q[*<EP6+DM0+L/5O\"QY2(Z$J`\"5HA=DIYQ2>3)O!Y0)AP%37\\OI_OF'\nMW[\\VBH2ON-^-$8RX-:[BW8><YVD>AA&8N&0J!3(7>*2?(`+_FS_YUX]TRK?>\nMT+W!I-(1D3DE9D2\"@#U<T4$OZT5,AW$8QY$1=U+`6,J8RQ\"4'JJ]O+G_^(MO\nM/_KT[N5WQ=S=PSSV:3KS?OP&9F3>O1&Z\"PC<U(R'(7Q?'[7ULJY;E2[F#IPX\nM8\"]((F$NA1);A$9(N$(`4P!0P(`\\YG($SL3N4<%J@NJ/](\"3MJJ=B8=Q'/.P\nMZQ(A\\;[\\\\CV%0H]BU7D8LS\\ZAO=^$>V3S%)2.*I30`I*2!F0#%!\\NZRRM3`#\nM=\"9*Q!@`X<@!N[$,$P$BT,XGW>-'[UH1?R^9G78A]?[WSC+=,;\"JNY<>F2FE\nMC(B<2'>PO`?N6BQW-S7W5J6)=A'33BXE?$`8$J><S%7=@\"BER3!?-CM=^NW=\nM0W*?,!9.2\\X9D`(9&90B'!./XS\"4`N':6J_-+(AV&101H2%V=,&H)MU-&;U0\nM$\"KM/$S$1-CMF(>Q9\"1X>GWU9%Y8?=UZ0F1D0*JN-2R&7*Z69$%=8^L18!!K\nM[7VK9#$/TW%9,O'N(#E?+J?+^>'V#L?\\S_[S?_Y[_^@_^O:[5Y_=ONH<<_`S\nM@0'H$<2ZH^U2&H=A',?;UZ^68;R>#V9VV39\"?#(>YCQ(DT24D!)09D8#,$/Q\nM$N2FD;$3@`AMO=5V<=F6:;P^:N&J*K5'E9&*JT_+(9>L9I=UO6R;J'I`0-C6\nM]ZF*N_/__+_^^SWJN>,0]]93SOEP6(924LKQML3&E)@YS:6+B&HN>1S'L91Y\nMG*Z/5Z\"*'G\"J^O7-P\\=?W'_T>?OV9F@NIF:^1[IW`B`1(Y(S`F)@\"+AA4$[!\nMZ!!4!E653>K:^M9;Z^IF@8E3YL0.+HH`E!(@F&IW5S<A<-IY?3!B&CC-!FXF\nM9C7L`M8IG!\"1'U\"KJX(34P2H&Q*E<<P1@6#[=XD8#@.EPS\"Y&(0C`B&$6YAG\nMXJ$,8P\":AQH'%>(,E!W90F2/16M@!.[-?3,`C$\"@M,L@'&`GY'N\\PZ6]4]CM\nM;X@,'&;@SDB,B`$$0(!=]2TKX5%&N?_BD``#=C]Y1(2'Q5[JQHA`T!Q:7-B5\nMS,%-7;MH4[=(W6FK<??0'L[5+NN$>,SIZ3@>AW%`9L>$'`Z(F$M:#O,T#0C>\nMMZIU4P,*R($,!!$*T<)6,'%M8$H8`QNC8:24\\C\"$*W>;*24$41F'<CW-`Y!6\nM!?7PT(@.L6%41BCID')R(`'PZ!ZU5EEKJ\"-\"(<[(\"3`A,1);R&7[RR\\^747_\nMDS_\\@]_[3__PYGSW\\HLO9O=KY!+L'FDHXS191)C/XWA]=16FH38/T_'J*IAZ\nM[^R8<4>X`)JCQ0`T8)HH+5RF-(\"98:R]MKN3K[6I;`1T??CP'_QP?'*%0Q81\nM\\#@>C_O^@!,3,R`!4<J94T;\"#(_(0P#@__`?_A<W:[6*\"!/MN*><LTAOO5W6\nMK6ZUBYJJJ*EIM;9?A%VZB)B(=FE;W5J5=;N\\NKW]Y,M7?_?)S6=?ZLVI:`CL\nMNG+MIA8>$0B`'@(>A`8N;I`HC0.71$R1DC;M:]6V)TAM]ZV'0T9*1/S(]74S\nM0X`-W&$OTV$`9*\"!TY3R&&BBJK:ZKF`](9><RM!3>$2H@YI+#S$&3)1*Q)YJ\nMWVOK8)$\"1DK:]J,C4F)\"=-6`((2=DJ9F.VUM7Z=G3I;9P]2MNV[6S]97URT\\\nMF9,C`8'\"_A40(69[U37>0N[2V_($.>X7X2YU!(\\P)P!D@/\"<,A-FSCDE<&=B\nM50DS%3%3=S<WD=ZEFR\"&9=0\"PBXAHKW7+K5WM3\"'WN-\\DH=36S<UX^>,$_%5\nM2D_'\\9C'A$3.!-Q%`SV7,L_3F+*+]/.Y;UNQE!R*`78WL]:E:A=79Y)PH?\"<\nMC`&(<LG3-\"7W$?AZF!*\"FF3F)^-\\&$:Y=&FMU;ZU5L,JP]ED=7D^'$MP<@A'\nMAQ!3%TN!B)Z)EEP2D_>.YF/.$W%)\\__U\\=_]WR\\_>_[##__%[__!;[WXP>ET\nM_\\G=R]E+1\\>AC(>9.66DA?(`].+[+]IE[9>MC,/A^GH<!M30K3V[>D)$8,X.\nM\"7`('H''(&1*YIR+NM73Q2^UNE\\8*^'RY'IZ>HVE7$S.TAM$,\\.`M/<F]AU#\nM*<0)$,`\"\"45UJY7_],_^!WDK`'TGLF!F!P\\/YC1.XV$Y3O,\\Y\"'G/\"SC.$W3\nM,N>2W5U:T]9=[?#L>D#&4[U\\]>KNRV_.W[[1TZI;,T+UD(A'J2\\R.J)#Y]AC\nM38*!F?,X4&8GW!SJMO6U83/0$(M'A5<74Z7`G'-B[J[J%@`=07$?`P(`%J2!\nMTX`\\<4(+#U#P%;WC(WO*S3FH`\"8#-BC`)2C4YT0[<(F0\"S%:@%AVM'!PW553\nM.QS^\\;9>V!\"<L4-T<(4(9F\"Z>.TFS:6&7D0>9#M)>^AUU-UKN$-.,1`TS-XJ\nM7?>;X3M@Z?Y@Z?YX9@`(,]W_&0!N3@CA^X85537<>ZU=>N]=I.^+X-Y;E2Y=\nMP)7\"T'7'9XN\"!D9`.*G`=I'+0VMK0XU\"^$')AYRNQW(H`T=8=Q-SAW!#HIS3\nMD!.\"R[9N#^=^N7`#%(NF8>[FA)0XC:FL>X2\"P'E_J_5'14^7$7GAA!!=.X8O\nMN1R'L5Z:B+0N=^?3_;;6\\-54PM^;#D,0]G!1`8?`DM(RC!Z&`3EG1CQ?+JU6\nM1F+`X^':`+[X^JN__:N_8O4__*>__^/?^2T9\\W:NC4$SY6E<QNF0Q]Q]N[F?\nMGQVOIL6ZOKFYX90__/##)_,5J4>`JCH$(17DB<J`C!;`!!9<LIG7T\\6KUH@Z\nM\\'?G^ZWWJ_>>#4^OVL`GT-?KR1)=Y9&88E>1/Y:E3$W9\\2VH6_G?_=L_9J*<\nM\\MZ(V>LSX?L$U=V!$\"-VP[I[Q,/Z4%OS\"\"0TL[9MUB4QOW[]ZO;SE]_][2??\nM_O23^R^_D=-:#`;DM3<-=P(HB7-*^^M;73,&[%!1XI*@)`/K*J?6Z[G*9</N\nMX\"%JW<,BF-E$W;WDS#F)V2:MJT1).\\<AF)@I$P]`*9`B$``,#$$0.GB8,1`X\nM,A!Z4$1&&CD-E(EI9@Q\"CTB8$B<V0/<42,SNIH]EA7VY&AYN\"2,1)G8F<3-W\nMC3#?7860B`G0PWN7=:NG\\R5#5GWL3@6A[8Y[\\F2![XY\\\\&BPH)UG`?#VM_&(\nM-P8$PG!3?,P5FO2VGL]UJYG9W%74PW;_A(,[1$I`\"8'`@]11/!D08#*%MO;+\nM_;K=;KHV[II-B_8#TS+DI\\M<B-;S95TW-3\"`99K+4,9A'(9,[K)M5BNJ,V2-\nMZ.@]7#\"`.*<TIG*'$@B*H>'BZFZN9J+<^A@T(A'$WFB<4[Z>EUI%5\"WB[G2Z\nM[=+-.GJ9IO>6JP$SBM5U:UTL/&.>N'3=:MUV$KF#.P,R&OCK\\\\,5\\(\\/S[<W\nM=__[__E_?/3R\\Q<OOO][O_';\\Y/K?+4TC(M45RN<!DZH?G.^__#9^U?3<CF=\nMQ>PP+\\=Q.93QX?ZA2>\\J%D&(.95Y&#`E<R4/2*QNT\"T$MHBUL)J!^H<_^.&3\nM'_Z@/+]NA1^DY7F>[/$W:!X6;N[[13CD`??P82G\\YW_^)^^&`>_0W*I*B1!Q\nM'Z2VVK=M4S%$_.[FNRX2`\"GS_N1:]KS5P^7RBV]N_OJ3\\Z<O^\\T#7&KN/AFN\nMUO?!B4($`'J$&*IM9!H.!&DH-\"1#Z-JW_O\\1]68[EBQ9>MZ_!C-WWSN&S#Q#\nM=56S6LT&V\"*:%\"A!%WH;00(H`A1`OIO>01>2\"`+4@!;5Q69UL:OJG%,GAX@]\nMN+N9K4$7'J<8R*M`)B*Q$7N[V?K_]7WMTJRO&S8KP9P\\+%J8@:1(O@5P[,!`\nM=+?AEBK)%,I45$44I`&*-#<^Z`X1H3S\",V+6B<HT?(RC=4+(2!*56I8P<Q_#\nM\"%1%\"42>\"K:WL0D%(0B'=^78(%*6(DI)%(E,\\H1Y(3SH]*AU)M4`6<3NX[Y?\nM^MA:\"_<DBHP1-N!!I!['U>Y84/HC&?8`%AZCJ,@@(58&8])\"(!4^;JD$&F,@\nM0U3#O-LP'Q&1!#\"86>L@14@9J;O)/C`LAV5;VWK=;I_O_=;J\\!-P3JO1:BG+\nM5$YS3?/K]=KZ`\"NQGI>EJ)1)E=C'\\&UGBUG+.\"VC\\EWB`KOE:`>RP+T5\"H)%\nM=#-S%Z(JPJ\"%Y6&:SUIK42Y,A(=I^OKYW3ILV[;('.[#AU%:8CF=WY\\>3U+5\nM<M];LV&1%,F14JC;\"`8?VG\"5'G[=UJ+\\0(S;>M)IF9;_Y__[Z__S__B_,.B?\nM_;?_[/G;K]Y_\\[5,]<OE\\OKR<M^WW4;V/K.>=:ZU)LC-=&`F\\<RWK#73(Y2D\nMB\")S&STSM6BM\\VE:%/JYK9]SO-=YAG[U^.[APX<X39MB`)55S8X5>BU%BM)!\nMYB2\"YQ^G,/(O_^4_7]?U=KL=$N;#T#3&6/NN(O.\\'%Z*O;4,B,B';SX\\/#Z`\nM:6];1\"S3Q(FV[?3CZ^O?_O;VJ[^/CU?9!^Z-UUY[[(5&1O.QAPTSF!]_5EAD\nMTG$;G(HAVVA[[VND;TU&SE`!CXB>'D3=.C&IR&$X<48(2]46D<)0(146%A![\nMTG`2*N`<;FZ=T&QDQ$FG7K6993I533Y(QP:69W-W&S'(J8A*4GJH2/,.HA2\"\nM$)CS)PZ()MY.]W$LS#,'<4!SS)`94CQHI`3#@X?_=K^/W@%2$7\".C*1(H@7\\\nM$Y6'WQ81#S+7(2H`S#T!$1%59N[;_L?!##,SR_'W#ZA^V_9]WWH<U^\\(I,6K\nM)49H<]DZ;;NU?;36;=WWS?P^9,2)Y+'0H^!<P/4T*1?FWO=MW4&LTPP6\"HL(\nMR@P?8]_&NE-$%?XA[)KC2[0+;*<`2Q$M++MD`LUM&R,#RU1/R[*4U2F<5@``\nM(`!)1$%42<//6F=F94J&C3Z)?'A\\ZJ#7Z^7HIG,IP;SV7NITFN9%2@FR/D8Z\nM0,?XK4P\\W`R90D$(Y-K;E]OMO._SPTD?3[!\\Z/0M/>[=_MU__-6__[__'9C^\nMZK_ZIW_Y5_]X/BUKV[L;A!^3Q[JS9ZV55)58G7S=#;!P\")=:563625G<K,R3\nM')!I(JV+$'T9^UKP;#1#IE*GY_.^Z\"993K,$ZL$%92;F8\\!]A`3>WY8)`<@_\nM_Q?_O8=ID5*/Z@A$68NN.:@H*?<QMGTKT_3\\[FDY+^]9F7!K]Y$^+_7]P^,\"\nM?OW]=[_Y]W]S^=N_QV]^K!^O\\7)+-RK<.%C=:?`D-;EN+DZA>A56\"CF5/)4X\nM24REA6][I.OK=I!-^F9VBVX*+S+2.FA$#(Y0-HEF?>^[];VK]C&(>-)*3OMM\nMBX%Y/B\\D&-2';<B[\\!TQ@C*PY1TV@.1([R8$+J5S5J`I;T1KC&Y^DO*L\\RGY\nM)79E.DMYXC)%ZAB2L8A,`2!\"9>>X>NN,5.H1>XY!,&00@XF9)JV/.B6@(];[\nM_GI;7_?1G$;6;B(UHJAE;MXMPPDI)%/!EJW;[F'\"T,*D'$2&AIT*[^L68044\nMVY;[B+VU[!E&@#)7ILHD,33'3&<R\\6XV=NM[W]?[[7J_7MO]QML^VWA'>%(I\nMHL:Z0I<'D?E01XZ!].'5_$.M$E`B%@G$UONEW>^];^%:YB_K]?>WVQ<SI]2(\nM><1L\\=<YOI!_(;\\KK&H2*97'^6&V_:PJS4XM/F!:!C3E='[Z,\"\\]XM/MNKG5\nM,@?+6OA5<R5[?#J?3KKUV[I?17,AP=9GI\\(ZE6F>SK7.X][MWI]D(91\"]5%/\nMC].\\K7?K]Z_/R_O$KZX__,UO_NZO_^9O+>DO_]%_^0]_^0_^Y,.[O_CES^/I\nMH4_EUC-#/^CSUW)^\"IF)=]C8MIKT[?.'KQ^>E0A\"YP]/)T\\6WO853.5AL>=E\nM+_3E\\^=NI@^G'C[-T^//O]F>]!:M;]L`@Z24J9\"&A7<7E?/I1$7,NMD0PAL#\nM]Z=\"31ZRP8AHUMR=$A1$1-['Y_9YM'YBS,^/M4R&O'^Y^L=+W>S^_9?]NR_;\nMQPNNFS;G9$XP\"2M]R6TG,:>WV08AJ\\BLI13,:IH[#1]QW]NZ;NEX6[NB#`01\nM:6&P)$?;]T`PB)2UBH:41MVI$#IG3VN^#X^1?4IJ@T\\D0LG,R1A\"$_&(H8=3\nMD=[($6^Y'#(BKF&S5\"G,I&O@1[1K##(OI<`\\Q@\"Q,E6M#N\\((?9`NB-_\"OJ(\nM1*F!#\\L\"$PY=`!,'\\IV>KML:O?L][V'[MMTNU\\?GI[*6#^_>R7F92BTB\"->D\nMQ;E'I'LB$,=':-CP&%86)E`'$!D4EG'0NT4/44P0\\;'+2%2!V-K>ANVMW[=]\nMV]I^;>VZ]KU-#@E:(.<ZS:4FTY[.84+,`$;D,$G,=3Z7:5F6[&&4O8][M'6T\nM-6U@^'`>'A'O11>XAE12)WY-NWFSR)%0I8F9FV7?T\\OIK)K)$5!*.JB3O=GN\nM7B8MA65M:PA-I9QDV;)7+1'A</D)BV3NC-1:B-`1/NQ-2L%2M#!YLW'?UED?\nMZS19?R/B_C?SS_>]W__#[_[-?_A??O7M__K\\LW=_]E=_\\4_^Z[_ZJX?_[G:Y\nM'\\=RK+:V_=;W=-N:^#MEJ;X\\!Q5[7?M]']N-0Y`(`C-#9*KSS]Y_U=TNGS_*\nM,*S;^NES^?2I_JPLDVHM^QN('I8QQC#W23@]B.CAX2',E5A%Y$BQ_UBB>4/D\nM%[(^;N8\"2D=A8?``Z)BO3*6H])YYN>S??[[\\[6_C]Y_ITPW[*,0LZCXBPIFN\nM1H/$TL1\"PLV]2<]Y.:NR1$_;;1BE1::\"A)?&HF5X]K`#*C00W<91QZ2WV2&)\nM2)DG33U:8XW&/4:+(#(*EKX&Z43*0@>.J2$)*7`E'G#*/%X<3[B[$;R(E3=*\nMVL7LE:5JH8G^[#@J6E\"&.J/(((Q,,&6F#4<5200\\*5G)DXZ(()(F.<)ZRLS'\nME#!B(%JTL=Y?K^OE]7Y[FO<GZH%W3WQ^J'5F)-)L;#+/`HH`,56P@CT]/([R\nM@`2\"8!D#$1(C8EU7=W<?S*Q0(CWR_Q'>;;36QK9C&W5X\"4XJ/$P\\)<P'N@5-\nMA92E%DG`$MUH>*6RS/.B\"[/&:)&CP=8<*_E69:7>NM&UG^O\\M<YLZ1XFLG&N\nMX3;K&\",<LY8G+?/@L^>CY9PL%K`1S!%F:</PY?KR[?/7<QUGK5MP\"QN)2$\\X\nM>T8?*6\\6!C./X].M:!$.M^'APY%92E'19+)NUVT]G>9IKJ77MS61U^WGR^/I\nM_)60C(Z/?_?]__Z[__1O_\\W_]E]\\^\\L_^=F?_OE?_.4O_M&?+T\\/GG:Y7^_W\nM:]F[CEB<YLYY;69VN[QNKU?BT\\0_;;*;HXV)Z'T]95)[N8W[^ODL]/=?/_W9\nMA^>G>5]JND=X:]NA<Q5FLWZ_O`;A0!YNWN5?_>M_$1',=#HMY_-)A(\\)S7P^\nM9<8Q32=\"U5JK,I,E1L3HO9\"<@^MU;'__XX]_\\^O]U]^-SQ>_[?#(B+WW;?3F\nMMKI$PCTF\\'FJI0IFT8=:)BU5,SVLIT7V$1:<*)TE#N)#(\"$JDF2M3UH+2ST\\\nMG>X4.&:;*FR2F^2=;\"!`*9[P>/!<P%,F)8Q]Y(C((C24XX\"L@BB2$@K*C,=:\nMBRB#?'@/&YE-J!?.X:E:M&C*&Z$3)&`'1\\;QH\",F?]MXI1V1'A%.27*,6XXK\nM>#?-G*&3%CET@1$Q;._KMNWKULR]U*I:WXXE4@(X6D5*0F_V-Q0D!8;94;;Q\nMC\"1X>-%#<<^UJA;.R-Y]W_KG^^U^O5]?+]OE%O<F>R\\]JN5[U)*0PVF(2$86\nM9I4*'#=1,E35<STQ4=M;[&-S:X11:5>Z9U_3&T,Z/7#]0/4II8(;\\A/&)_+Q\nM4$%@CS/HO<[/D*?4)ZJ270*<)$RB&I0CO0W[Y<]^8=W;O;7>=X\\O;;NTS0(<\nM<6)]JA-GMM&3J$@5<\"(.DOH8YGUD)\"?2@Y5_PI93K;6J\"FCL3<X35/9NPWTI\nM]8EENC7]=/GTA\\^OW_WA]__QM[_^U:^^^_O?K^N=$,(HCEE*\">+==<0$F<!*\nM7(B9V,8(\"^_C6#:JHG:YVLLM6K]CR,/RX=NOI\\?SJ&S\"=#PY?[KV'P:X>9JT\nME#)5G:H>H(N#G'T`H8[O;)<O&337NBPS)U$>HZ+8O!?*JH4C8^W[QY?M^T_M\nM^Q>^KNPVR'<X(8+<.4AEVM'3A_5@YL)%)24#-)=%E4L$69?>J64TRZ1QWP,)\nMI`:$9:9RM+(\\Q<)]6!))82D<B>BC:]#!C@:(F1BI,`L@E6D*0?J47$E\"4D49\nMR4`>D!<`@\".06-=59YS+<IY.@\\MJ?8O8>_M/-I[%OY'E264BTJ0IP($N4@E(\nM`JB\"\"-YLI/))RK!,I((.>(P?8N3`6295->0\"K\\07C'UKGVQ;6W^]K]?6MO#W\nM[]^?YV59EK,->1N\\(/JPC\"/&-(NW:LU;V2U8B#C;UEFB%\"Y5\"#)&1+@;[K>]\nMK?O]NMEUIV:+X9`_S5--+C$7$+F2%TF1)\"(\"95)R84Q<1223=G=/6[V;B'/Q\nM'.O>NW<IY?&T2,^PH)0`;S&NY%?-;%U!`O#P@K%0G<)SWY-\"IB(B2%B@U\"6]\nM[VN[7U<FFJ9I`\"]]N]OP3,DPWWE^F$1SHEJKC\\$I87[?M\\F]'$2]!)(RL]LH\nM=9[FJ5%[;:N(?'-^**SM<GN]O%[+-((HZ4/W/RG3-WJJ(?L\\C9;KWW^\\_N9'\nM/W_7O_[PPZS#^^/C<V6=@K3G$]4/T\\-)REFJ5.=DBJPHDD06):F6\\O7S5]/5\nMONSWZ[6MO_T8?_=C>7ZD\\K\"ARU3+,@73VIL/.]7IX71NK5VO5Q0IM6K\"0>AC\nM7&_A,<88PQHSWRX79B[T2/-RP$Y\\F%E?3F<Y;&#!^^W^^8>/+W_XM'^Y/\"OR\nMI`U\\OZSDENR1$1++1\"/-8-=TBERH`!)MC,69\")VHA1K/#O>PX%??+\"*%$L1@\nM``5\\DG(S2[/((5*64J66;=^W==TT!P/B(A`F)$=F,OCH'3A'<.$H5(T9P@A/\nMQYN0Z+B]`0G<,\\JP)\\0#UQ-)94&TC/$1V<<V(NY4G[6>H6R9D3656(\"@0/*Q\nM`@./F'4QI0P!F'&$%PF@%)U$E5G,X$B2R`@?+3,$>]C'_+(-^WB]/G]X_^'#\nMAU^<GZ929E;\"T0;-%`)SZR,SAQO1\\7T7)0JO5463Q2-Z[W:][)>7L:WN@VU(\nM#`HG#::D`W)J?8<P5$+8B4#'68F8)88QB+D(,<`CO:7_T*_-[4BF+&,RU*PG\nMFA^T^&CW&\"O%RO$I^IU\\,.;N2]&9=$%.))6)B`9<,46HBGB\"!LU%BQ0\"75]>\nM?_:SGY^>\\O[];W]LJU55J.]&$V*8!*9E6=K2,FRDIVM1$E;5RA)2B=@SUGTW\nM9#\"Y4-N[[NN[95EJ+:74T0V2DVZ4KQ(2^W\"?8YQN4,B2M=3I87H\\>>U?]LOU\nM<WE'RD*!'%B39%KY]+!,\\WW?9BY3D$Y:=?+CQD=T?GXOES$<8JM]VOPW7\\H_\nM:-,WS\\]?/830$#3O6]^B#8UPD2*\\]A&:I4SZ\\/``X%@.//P-M=9:*TVE]\\[,\nM8V]AGIX`&'B3&UJ\\MOOMAX\\?O_]A>[UD0F>>R[(M`>ZT@CN&A9%)85:(UN&Y\nM0Z=I*:4B8TVR2'??1X2%>3;',+_.U\"T]/8DT:1B=*\"A\\3?/#;:'4.`6Q4VSI\nM,`6Y.D^%DG*8F3N!/>!)`<E(2@6E)WED'N3W1!YUS#B$#;'.PNYSWTKZB52(\nM9E8G:';/>/&VB5]]G%/.T*7J:7\"%9%C$X8I0XC+(BQWK:60!C[3T(V-,X9&.\nM[F11D2'I('#)&-HI/*QMK[OM^][,S5./C\\QYF;4R<S`L(S*5Z&A=2$2,@1QE\nM*F*&4@#+]&'[MN_KVO?=6\\O;]3!&9'1BUSALV@1'>'@,[YX05II.M=92A_<(\nM+U!5#=#:V]K;R_WZFWXAHBGJ>6\"1\\E4]%4?I&&V8QYWSBGXEOTLV!@B/)\">4\nM2?+,LH@P<90HI;(NW89%,,\"MER@/\\_3$YY=/G__D3WXQ/S_DPVF],1=9O$HX\nML[3;NCVL#^?3Z72ZMKUURWSKK*0YD115E1(,,+^,=1UMA*70.MKE?GMZ_/!X\nM?KCL^Q@C(Q^6Y7%:%@*X-W8T8P(QC92T%IU8HCZ<MFT++5HF58TV7E]?;6O/\nMYP<5WGK?]I&+377A4K%,%<5TGD_OYZT7(%8?O[O0CSO]F?MSMN$[O'&R2F&9\nM=%+BVWUMH[%2$O1PN=1:#QGH'[F47W_]X7J]][UE>F:*\\J25B,;!]FUCNUS_\nM\\(<__/#==W5=IVF:9\\S/)_;S]#3+.J39NFU;C-?;*RVJYZ5Y;)L)Y<2QMGVG\nMJ8)CC&$#04GJC,Y^FVB#CW`*4L>1.BMCSV15%AV9W3MR&$4LI7@M:95B1II[\nML[0@(%O$\\(-GB\\,+,<*'!3$?3T((?K(2)1%N$W+WI><#>%9EY@-E_4\"E4SCC\nMGG:S/@-?E?/[N3YU*L1'&B\\A2U''(\"+=(S,C*3,MP^%&%(P]C+LG:(86ED`$\nMDY8Z]830ZOTZW\"/N[F;16O/]?J[S^_/C\\_EAGF>H#,J!>-1I9)B[NWEK\"@]A\nMN*%*PMU':]NZWK?-6H,9QT`:A7,F!S+`D7\"B0VZ<;P:<-V1;85GW@?#\"*B)F\nML>[[E_7V^?KZ6F,^;IN@6<H[K;SN=E^[=3#ODI^C7S)-\"<R4\\<A5@ZJG`)39\nM;3\"ASI51UJU%F`J)13&<J)SJ]/LO']=UQ5=/T_.#KF</TB[SO#0>^VW=[G?@\nMZUHK\"1^;$!9NV^Z.D+FP8$JH9\":8MK9'YE35MG'?5C\\]/YS/W\\=MOV[H8[[+\nM-%@%Y!;NG[//]6&JA:4TC(LY$,2Y76^/\\^F;JA].9Q!Z'VQ]=A/GT0RM=Q2\"\nM4\"2W%LI1BTYS+:<*:Q;[I^OZX^OVY;W\\_%%5JY:$[ZU9Z]Q=:E11=;GO^_9I\nMR/_P/_V/'M2&>Q))V;NU[E(FVXQ;OCL]E_/#%^^O:<$<D4_T7\"QGS]??_O;U\nM=[_9/_Y>_&9V6::QWRY^V]FI(R^PUQ+;C%47/Y^[:,ML2(3SL%.@(3`&6<#9\nMNO4VQFAI?=FB@H.I,P6A!,[&CRXQUK-'<8ST3:D5CN0<(`^H&--]M-6;'\\$Z\nM<I*R%MPU4WBRD-$M+\";:PD$$QM&8.:QCGO@ZYAHR(C:XJQ#R9/0^2TF-P`JZ\nM\"=\\8]\\0&K(!$#DUFL+N&+\\Q3@/;.^L!2'.AACJQ<IU(F\\(-A(1:B0!@\"!$UH\nMY$)X3'X7\\C[E[%1!YG:_W<<8D>Z4=]LWZ\\&1Z=ZW;GNWYM%'OFU2=807RMQ!\nMNC6\\?++//^[KEVU<[G9]U=>];ON#VW/2.;!D+B+G>8)YCP@B5J6D$]='JK5G\nMW<M2'_CIZ57HU]OE[[;+1^^K,,@7R%.GASV?4B>M7?A*\\7T;GY&?TRZ(EN#$\nM%%@\"?^Y%QJ!P,$:&O;WL7!\"$J(3GHL^EEKV5/MXO\\Z0#-?-,C??+RR?;M\\)E\nM]ZB)<.S-E>LL<WI\".`3[[75=UZ>Y+E7O^^V>VZK6:MS=]];2?8(6$D^XZOS5\nM>X6T,;;>=HP]1JJDEN8D22.BP[VFE=ALV_L^QC@]/G'5UAI%?/7P]#3/;*Z9\nMIS(+D8\"`9(:G#XPRZ<RME7UVGR_;\\%$J+^_GY1]^-<]/'QX^;)F-):?YFV]_\nM_CP_4<<UHY1YD7GF60]%]A_WV8ZT\\&!DZ4%)$=1:J>I,JLW[IT\\VNJVWU]]]\nMUS^^Z-X71P2N'Z^CAPUD<D_LWENT`3O1P_`8,:3W'$.-:D@-6BJ]07A[%J-M\nM)!L\"'$P%,2%[!B48;S6Q6<LQ(>1$9@ZSM)1P%3VL@YR0Q(B@8S2?'>X\"<11B\nM(;`CVD`<V42\"?Q(%(4''/T324>ET#SKD8S1+F2U*-$DPD5&NWB/BUVF+E4?(\nM0O[(^D191&<^_T`6YLA0Y@G\"`>Y)Q#]B1(:_J<T8R!'NZ3,4Y)1(!(,XDKN#\nM_/;ILJ_MY>523\\OCT_G=]CR7BHQ2A(B$H9S*E)2$2*=DVO;M=FTOU\\O]OGD;\nMY,XL2YTCXFB9I'EZ,)&\"4CB'I?M_-@(I)\\M@&O\"VW5]LOZ[W?=^/D]&B=`9/\nM),IL[JOUEK[!-\\$>OJ<G00F:*,B9!$P(BLR#<1Y(BQAN#:F@)`SW*BQ5`WB]\nMWZ)&KFO9SD*\\+,N]N7D<^]`DO%E_N5_+:<9/BKM1%7/9BV1Z$QJ4/CIK/7Y*\nMFDD@2!+<6KMMZR):M73B#).$!`@I1%QJ4441]QB](8)!F?DP+^PYVG:_WU^I\nM/.K$*@;<8U25RE4@8#:/XD&9`IZH\\ER7V;5?]MO^^H<O^OWG=W_^ITN=)A](\nMM_\"]-QI)R,?S0ZTU\"7OOFIG'^GUK[3#7']@2[X.&]]9HKO?LV^C&Y5U=YK3;\nM>EW_\\,/U=[^SSY]U[S72A[W^X=:;AQU:!)B/D=W@$^TI$/@4/H-/*>>4&F0(\nMWPWF'#P,V9,BB=F4G'S*M$1$O*G`\"%5*#//(XQAY?(B+*H./`[.*E)0_*E,*\nM,2<B':3*4E35CZ`>3!`A@!!)AT$1:)P,4B%SLHS`FS5U@6ZP$V0@DSDE6[JE\nMW4`EQ@GT2/I5IAE_T'KBZ91[#\\^(-R?'L(A@%K#DH5-1D5(`N)OUY`2]B6\"4\nMA5+B[:1IN&_]1:#GY=9M;7E:I@+6DJHZ5YZ+SE48\"08AF_GU<OO\\Y7Z[K'T=\nMV+JX%^(%DH=M`X=!F0JD@'<A,I*$@$6+JKJ0<UXXU]ZV;5SV];;>S>SHE#\\/\nM/7,]RT1`C[RWMG$TQ*WDVJU%$F$\":M`)-#.YPNFP=_]T!S>CS$:B=0:1N3NA\nMU&+=+NM=`=S6T]K.'\\Y???CP<MMO]PU./FS2TJQ_OET>WCUK5>IL9E'G4I8>\nM6-<]F7O&WOI<R_-I<7?;6Q)YQ(A8]^WE]?7AX?FQSJBM[UL!8E@(%1'KKK62\nM:.O-S)6461A87RZ%!>;[B%>^Z9G/\\Y3,M]YGU$%4D24XW:ES7W?N2:7..<]U\nM*:/M]VW[PX5_]WGZ\\<OT[I$EDC,R]MY]M\\GSY-5;IZ)SK1K61WK?U]'[4*[*\nMYV7B\\R)E6E\\N:5Z6!661^WT\"/\\UGO'YJZ_7S#[__\\7>_I=?+O+5FL5^N>0<&\nM,(B)E;EDSA$#;&'!8,:L15D6B\"3(4]-B>-B;RO-MG8>)B0KQG`>^`9QIB!U^\nM)NZ1F7',]T2D<#EQ&??M$*\\7U87`:6^)BPA%BOEA&*-$(2[DB0/ZSWZTLC.8\nMB(GLP%X?\"26Q91HXF#FP0!ZI0B`2`!I19(;3%M$(#3XR^\\!P^E#T&Z*6O%.,\nMC,'8I^S(9)\\;!Q`LS,*L(%+05)F[<X*(&,3$9W`B.,-UOH[]XL.DWZY;MSS?\nMYZE6J5Y53G.)4V445@*!,G8;M]M^OZZV!SM%$`8E98YVG\";HS6J83,D9`6)1\nM!=5:RS2AZ-UM&^/']#=RU.CI44!%\"P'/)G/JQ&J4N_?;&*ND*]TUMY$)3(2%\nM=$*<$TO*R+`,ST#245?(1)B'$!$)LP\"L/T5GX9/,>X]];<N'AX?I7$G<O<K4\nMMXV9';G;V$9_7,Y3K:\\O)F6>2O&]#\\M2\"H7[&&G$E6NM;SW^;I$^QMCW?>AI\nMTDGFQ]V8(MEA&2+%W+NE%A:=D/)FQB*R9EIE+C-1-//7?>=I.LU34*[AW*(D\nM/4A5I@@;VUJ$L_),*3I-6K?+;?_ATO_V]^=__$O^TS]9GO0\\,Q?,=3J=\\*03\nM=?]T>=G;7I99#R\\O@*.Z_?+R`N!\\/C\\\\U8CHK;D0ZWQ:%EK[_78KT5_OEQ\\_\nM?;J]7A[,DWAD-/.\"(B$\"EBR10BE(+N2[!,(1\"<N4[/`,1,+>U$@!SA`:2LV1\nM1X4N4Q,:;_K;!C=DA0Z$'5O-3BQ<P!.)$[UQC#/E)U2$N^_A>H`[(1P0#T',\nM3HP\\H)@@>+S-:\"*S&ZH0,A1DR)99TB1X=A'B!YV$$M[362`IM(%:QDIC9[X%\nM?<[Q.<>[M']:IA3=+7<?[B`5$;&,R?*(P>&18R3`A$P,Q)'X129W%M&'Y)HZ\nM4IBJ)&W&^V5]O6ZW.M5:RT-6E:?3DC'3J5*1XT0ZFN_WO=^[#Q07,5:/\"F8+\nM9GZS@Q\\5A41$!`/*[MDI(6@Q7FV_C_9I#`(*\"R<JF(%*PLS5A\"%@<<[NM&:T\nMR$QY.U4`\"WB!S*`).256.QQC0\"0AC]58!542/C0$+*J:[D0TSW/ETJSUZUZN\nM;2)>I\"Q%3\\OILNV922))N-YORVDZU_FL]7IO5%(C)I)3G3T#W6:G[7JC1&61\nMGQ;(*9$1?6]:)Q59ZJ1)[C[<-NLL,A\"446O-4FQK/@Q)1YW%W!GHX]@W;@^G\nM\\_O'!V:R`DU)$1+B8,J41'>'!(J>3J=QO=_OO?_A\"WZ\\X&4K=69-R^@!=1I.\nMBY3,]`RBU#!;INEX*_9]/Z:C^[J^WM>3UFF:1D2_KV6J5336S<SV;=M?K[';\nM7)>9P_SNCI)$)$3,I$A\"A.`@20Z.A!F8,B)`R1+,:8YX0V<X(Y0=9(A,.N(#\nM3?)$1W8*<,Y)07G`/RE3/<6=T`4DQ)SN[CVMIX_T3#\"P,$YEF7@Z!4N+%I49\nM]^$>,([@'!G'C^!$'MM-B1ZY,W,$P.8#`!-7L'BF$04**)R<?9\"#,3B&X.ZX\nMD)\\9>QF51#AX'R>G)\\C9A?PXTR$`1UA$(/78+11!O\"'PWM)MDF1>,V?2!]%[\nMQN?>/V>[[_U>E0>F6LQ,$96R.\">2O%^OOGZYW5_N&)RIU5&\")Y5:Y$V2>%S[\nMF3Q]C)&U1.06'I9BU#BO;=]&[V,4L\"C5)$]F0!P9Z4(&;]Z-N',.\"_,0ICE(\nMH4IY(EU`$TAQ8/WB^$P4D`8JN!)7DIFU@A54F0LXTT&DJOT^'!TWX=W?/9^^\nM>7RWW3LBSM/L$4$,X':Y/LWS^Z^^^>;QW?KY.]M-51>MB];,#.TTLE-4T8E4\nM%.F@Y(E$/9L[]E8L-4FU2\"FC[?>VG<H4,3BX'%`?\"D:RT&W?*5%8'I?3\\O\"0\nMW7H?+W91Z\\NR5)U2<*S4Z8$KH4QRYY#*RWRF;<O;Y]M]VW[]7?SR3^G\\];Q,\nM5T3OFZ]]##P_/26A/)QDF?2831^4I\\Q\\?'P4D=[[=R\\O5)=Z>HB,V[;JKI#*\nM?>3KUGZ\\;'^XYI>]/$P\\/\"[=7D9+36)A'*/Y83;825#=*+P0B\"GIC?TN8&_.\nM09DX;FF%^(!'F/)1VR@L1HE(8QCGEJ9RN!S@(L1<![@/F:6P[!$6,3)\".2+-\nM@QA%<#BD\"XMR,<HBT#%ZQA9AR`/:'X`#2Y=CY..@0=D9%.Y$%5*`*6A*XM`)\nM.!(4A3^F;AE[9D\\XI8##Q_]K[<3ED?11*9)T.\"-G<!S&4\"!Q&+0/Q`48=(S=\nM-5GS[<)&2,0@XF!9D<J9GI_8][0P`M-P:V'#K`-A+6VLKS[N>^S&0P`NT$7J\nMF93YB$Q^6M`FC(QNG51&QBV&!3%X9-YASGDB9<_28R(!A$!$;.[;Q#T\\1S\"7\nM#N1A#$6>$T2U**;D@F0\",@THX#=9S?$F)#Y)J:PS2P4?.]-<0\"\"WL-%B#U#X\nM;8_[_OS5^V^?WGW\\^/G+Y3Y!:RW#S=U\\C/UVI\\?WWSZ^^_)\\^?SZ$H@B]6ZK\nMBD#3>I]KY23QE(20J#`'T&REEA`*3L^(H*)9Q$-(2%63L;8MNW'D+#J);A$%\nM'(D@G,]G6;#?[AB^7V[BB=FIS*:LI'F,Q]BY*!>@,'/60A(V;M?;;[[?O_M4\nM_O3=4WWGRT+\",@W=1M\";-Z[[T'F>]WU7U5_\\XA>'3;OW/DW3+W[QB_W+I;56\nM3O-19TN/=*=[STO+:RLM3XL69QK2H^P43'!\"XE@P=Z=@T!D4HH?YR#)::[UU\nMSU0[QI04090Y)V\\!L>C*]),YD$\"I;,A!N4><M!0N*K2H,K-X</2>$'Z;$A*S\nM%$W*-Q-2^MKV#3!*]:@)ESQ199BQ%Z$A;)Q$R(P:A8G<!P')%,D#R80>08$\"\nM*'2BLG\"9LX]'&=\"I```@`$E$052,IZ2&:.Y;H`-&Z0%#O$;<N:EBTKDA/[FM\nMR2?1.?+8M#ANI$0<$2-<;/#;IC!10@*,Y$Q!4Q0*,/,@N:O>*'<X2N7\"K%7X\nMD+%Z[]W:#E,A/142DIFF9ZX/6A<IZ_[%W`_;!)$`[!D&%W,7N%`O))4-&48)\nM/JF&#\\V4S`)A53!UT\";8W<RS!@6]`3G$8B)5E@H2@,*3*!D1(<1O7Y&,U*1\"\nMLK!JHA##(S/`H<3F,7I_*H];X'5;MY?[T\\_&HG42S>$@JM-$1#TB$;:U;.-\\\nM>GK^]OWG[=+#1J0/G[0086!HIP,L5I-/6@LK(<)MVW<MTTGG&&.WG;W*PS+I\nM,H-UJA%QN]WZMA5PF4[!]/#\\I,3WE\\N7ZPN&/TBUUA5T2LIA'6`(3<M4ZAQ:\nM6&_KS3`F+1,7$M8J5;B0KQ^_O'[_(WW_M+WCVUE.#^>9I(K>8ESNUY?L.1?Y\nM5__Z?R82(LFDPRX:D??[)J\"'Y32=EJ&4AYCKR]T_77[X#[_]W5__3?E\\?Z]3\nM#A_-;?/:)X._G:;@1,;B3(&TN692.KS'Z*U;[QJ867=R3UB&I;DPE`WHZ=TH\nMDT;D'KY3[HR=8TM;7(1TH?)H\\M!RV4,]A,DC,3S;(/?T'#9V,TMGI?#@S)/(\nM+)*<F\\8NX0ZC[)2=(B)T8!E\\[F3BSF$'%H4H/!$A(C.!A0@!\"E`0.](C!Q],\nMWT/T*PC.1J-E:\"EF<3-_U?PTR?<%/T[\\PTFWD*OJ2$2D!@J(,](Z'8\\G`$2.\nMW-+OL\"OL2G@E^RS]6OT^>>>&M\"7R*QY/Z$_5SS,B[;;UVYZ;E7HC[:2W]IZG\nMKW7B;G\"/=`<Z\\IIVA7=E5TUP!-VSA\\(1CA!A8;+1QVA?[3B!SN`%6ED29`E/\nMN@]SE8W\\ZFV0(TW-9X12E/0)J6$4IIF3Z'F:X#&++*0S>`Z:0).(BKQ3D0PZ\nM4`^MQ][5<H;4H$)\"X6.W.BV/'SZ$XO/M<UM#P!P@RQ+,$\">6.O?H>^^?;M?7\nMUL$\\3\\NDDT*PJ\"S%F#:W3I33XCIM0;4&\"1E\\H`/!9+#.K>GCDY+`\\][[S8:#\nM%BIGE^+.9A-1!85;I'-A,+Z7UBHG\"7F(4PX_BF:54(F.!Y\"$'^L^RS7NWM^?\nM']__D[_X^A<___1>?6N;=;FU6N5!J[U?GN>3UEH/L<0Q$SN:W-]\\\\\\WKY3+&\nMZ-NXC'V$3R2G\"%BT[W[H'[_(_4KSG\"I.:85H0=GYH&1&_N<O2@S#B!@9?B0?\nM(S0)X'B336<D&84E)TA8*8.8&4D9$9X(CV$^7CAZPA/&I1*],=Z!YF&'U@@J\nM9(ID!\"+B4)[FV_^'`0V4R`0=XR]*4!Y@.S`S(S(QPC+)\"9$)\"#./X4(H`4,R\nMP8%!.0A$%$$.!,#,A:A29MHRG237JXUHYAX9M`,CVY13.2!O20ZI<$8XX9S$\nMQ&])7:;^%-C6L)''$RRTIR9.26!I9E.=3GJJ6:QC;\"-&,DH7$*-Q5D2A&!09\nM3L-FE:`W3>];`NQIX<$I'B6RJLRNGI!.DPGC#:43Q[0(')F1L:-%APM*U6DJ\nM;,8^E$@LE*D0%V$@/#S-+5+H>!$=`2)2,\"7\"/)DCHILA0@(\"9A8E89)`9E`;\nM_>7UE;Y^.I_/WW[[[:_[QVO:Z\"/-BZ@B;;^-5_GE5^_'N_>WO<5VJUI8Q#V\"\nM48:KU\"(55;('MBY2YSK-X(E4C[0FG9,DDXAQ;RQ%B!YURBD/R5ZD;QQD$.9:\nM55F415A4]3&U@-GY:*NVUE)<5:7,12<M19B5.)7*M$R3S;[G;>]?KG7OD\\YZ\nM5E;Y:N&`=[=:#9'Z^?/GP[PE(M,T'1S+,<;I=+(Q/*.&1N;$6M*OEYO>UGEO\nM!3@O-92OV[YS9T7UM^U8/W0+@.\"M$I9`0B(]XE`^<Z*&[?P3[<]&6`\"BHEQX\nM'(A/\\0/LP7-A2EW3<.3)G.-XA(8;<FWK$7^%B!)78$8\"TM-!<(919B8'34Y@\nM(N'AEC:24H3E>/=Y<F0`D@A*HHS,@XLSTB1QI(X]/1.#LE&(R,CH&9X@\"!-5\nM)R1-R4Q%*/:?4*O=K7M^X9#(._``65A+@BE%20<$D(/R])/#FXE*!F<J)`,&\nM6P!\")<AKEH?Z>*HG`]WZYIN%LRA[B0AJ`A8C3<]P2\\MXR##D$!C@Z>WX)8,;\nMHGC.06>6<ZAUDX8!,82`')D('&A5()#*_S]1;[(D29)DB;W'+*)JYDLLN536\nM-MTT<\\-W@0B$\"V[`[X(PTU755945F[N;F:H*,S\\<Q\"+[$D3N!W?R,%41YK>V\nMI)S5W/L4'\"DS<9(MA4ZLI%DK6,RT9X-FFQ1]M;9ZZS`\"8XQ99S(MG?=H.6\"+\nM,1<*4,=Q9.;RL#P\\/.!AW6[;K0:II3D5E_WMZ^?]WS]^^.6'GXZ1VU\\W14Z=\nM\\_GA9\"\\W5;BU;DU,1+%&HRW6.WLSS%9,28;68+Y'F=R]NZVM)V(\"^6H>$:PL\nMPE5;CFZ^J\"_-C+1&;PMI^V7$,;JYGYY[[TM?9U`T01%)O*MF7RYO_^OO_N<?\nM]Q]^.$@U>SS:V\"XB#H?3VKJNO[V$OZ4\\9:8R&KBNZ_KXD*I34M>O7Z[;Y<OG\nMR^O71]XI\\AR'QLZP-FJ@LC)1=\\C!S,BCF/*J3%DB59:T*6INWDC/.I0YJ#3*\nM6N\\H3\"&'H'*WU9I;VU(4830STA@J*5$'ZOOWY+`&+3(ACR2@`(8P`),UB\"DN\nMOB6!-,E\\1?,<&7%8BF8RIYO35!$5(\\>`FD%F**:4JAVU*Q?S&24FP9(N3NK%\nMK]N#<6GK1ARF01[&G>-@[:HA9./A:06GFCG&YF4=/H]6`HUF9H5!9YO9UH)%\nMDFC.A[:\\/S\\OZ\\-K;>.H?4A`\\V:M*%7GD'9&-89K9!V91<@PH)S$G4%4LDXE\nMIS?S$WVO<`E@D`GD5+D`<P0OZ7P^!\\IRU#%8N0\"@I\\8)K0D]U!R-A'FYEW!#\nMF*&)W=QGP94D:<_\\?M(X1(E9@&I9EB.BM>:SV_VV9>O;]?:P=&90RP2QQIA]\nMC>/U]?7WSW]^?GAT88S(UA):B\"+V\"%><;#DU=TI9M_VZ+(_F*&$0R6HDC7\"C\nM-/+84T?CQ3*1-%_<GIX?>T0<8V2%LHDJ1`BCN*[I-A`'S*RL>&1<MAM)ISO;\nM/3\"/I/FC@&^W_3]^'7_[I'\\_U]JVH6_#VVV#&Z.IL7W\\^%%21&S;-GLGS^?S\nM\\_/SM]O%1$6.;=_W'<GUB*7XMEWVC+7Y-%'Z&'W/AU`3)40IO\\=IJHJTH8JL\nM,?O\"$E7%PJC`+*%R]^JL4BE*@4S>HSA9JLRHB$`8O`*BF_5U.9D%W)1-R(<3\nM`<A2554F6::C9G)Y43MK0Z5Y0^NI2\"W``CN@J%024&ON4;_94LPHIXII&*FU\nMF<R0M%*J5+/4D%-F4``%JZD&-]98?86[JRS#\"#=OG2,/$`>`BJ%DR87%?>?T\nM1.52-,`!%SWM\\&%F2[-.4V9Y-MKBZ?VI]:6DV[9MQSXBS`WF3\\VJ+*W5/L)&\nM247+S%>D3W;0,4I1E829%<#$R2T6'XW[7@<J@0#KGC(V,#D-N9G%OKO;4HB1\nMO?#A\\=&;KI?+.6G@_\"]UF(B`,*\\Y<Z-1S,B]8H90GF`P@C-T_+N:!O?X\\(B,\nM.C:-V^O;^?SAX\\/3Y2U6JUH[R7W?+SDRX>\"_OGY[_^-/K;7'Y7R+PVG'J-?7\nMRV).MRQ!V7KKB^.(8]MO=81`V&&CO!;0.FDV[6\"1>8VZVBP@P-)DM[?%&ZFH\nM84);5J=%A$*V8.3Q;=L/:\\]V.BV+=WM]>T.*2YW:ZGWEVD[KV;S%RQN&\\LOM\nMX?/V0[8Z/[UVK3NZ%\"I5Y19M7H/S)NR]SQ?R=KNQ^<)VY*:J<1SYNL7GV_[R\nM=DAEUI;5VU*9O;R'G8<Y(.@`31@0L@@*Y<U#954P,V>7*^$0JTQE;#31-(G+\nM*(72YV#9^D*)5:RJ6HLMY:S%M3@X:HQD95N\",J\"JQ`JJ##+(K95E@C?5!;49\nM#5!9'7LC']HZD*-&UN[>O?=%,515BNF[)]FIACVUS&Q?DN0B,WG#K*!H8;Q_\nM;L:4%4Q$=Q/41ECN`+RY-W^\")S.A(E!W'Q52UP6FZN(0N[C,?D'4,`$94099\nM)813-W<_-W/C./9QO6`;2\\*!->I]Z^XPZ]<,W([Y^GBE-YKDLPA4VJO,0!J-\nMBYFA9;>C<7?<4$4,H>8<CBJ`J`Y:\"56M^MD(V\"I[9TLSNHV6V6@G:VUFTRA'\nMC(&\\(1L\\O\"WBE/5VF-/,^@Q0SKE-@TYK]#$.@SJM@]L8UZ\\O_>GT[O3P@9>;\nM(D&C73\"R4*\"+?_WRZ?GUIQ_???CC[__PSW]]>KM>4O#.:EB\\-V.73.7RWMIR\nMHH>@\"'$@Q6C69\"'#+0ZBBI6\\'\\F4Y3@NURO.CXNW&0QK!8-PA'(./-SK('!B\nM#+6(D/7,''OX,*0W!$_+NJP6V8[,;WO[V]?^Z8+GAZ]6EV,\\>2'*(C#BGH8_\nM*RBFB'3;MNOU6FLK[SK&X\\/#^X>GK3Z__>7+EW_\\>OG\\.FY'M36BE-\\?P&(K\nM-=#O*XT!<M'!M5&E(VL&'QF[K\"A<8J^T^8(5$E1.!Y-_YY?,%C91Y@BHQF:5\nM\\_NS\\*VJ@&I'$)Q;5<'\"E#20BUCPT+BJ+HPKTTE2)AAE@%.=KED-4?!\"`IC7\nMM_M4=M6</S.V4E=;RE=O@%?5$2A8`D$%%#,/VVPT'0JFF-&@%4B)P(^^J&&7\nM1B9-#;[\"K/#5DU$4'+9:F[(^E![JWOAI!.6$5OG*]K[W)^/UR'4+ILAFZ>M>\nM']RZ-^?I33DJ`H\"U8;X6;-ZNX\"ALI4'-\\(S6VFJMN9<S&V74?.\\X0U9-,U&!\nM--BCK:YJL&[L)=]',S^#;M[Y7Y](5@9J4J^%S*R\"K6S>&NEFAKB':]V;;K[O\nMA0O<FJ<KH\"UK?[U\\_<>OZ[NG]X]/L>UQ'&JMT=:^3+KE&_(__OGWT^GTPP\\_\nMW=YNE]>WE;:TDXUJQI4\\PQ9I&7'V?NH=.LIFU%`D:U6LR:5PC&PTF&=I'@K/\nM\\.<BK3V:=_/T4E;/=)J[UQA90>_6VP2T0R-%[Q,3+$*('/M.T%?DJ?4`7V[;\nM__S'_I??MQ\\>![A?;OW<3V[GMG3V>]WY3+R<IMYU79^>GF+Q_?7RZ>O7B/CI\nMP\\=U62[\"?ML>;34_/R[GI:T'AL`L[\"/[*+%@LV3:S;G`NKC77C$R#JI!#?+I\nM?I\\?&:)2)609@!*RMV6*!V*,(XYP5'<Y9[5U&N3&I1G*D97Q.,%4\\S`8)(20\nM--D^5W^$L\"-WY8H&UKO6CSBBADQM[68<&>,8)]D,JW#('$I4U9X'H2-C1YT@\nMP!98=Y/I6VQS\\A<TJH1*0N06,0MW'5RM-R+=RXS;*'.A*E)0=V^`)1<18BLM\nMX-G]S-8%H1ZKEXI@`T`0:+*>_F%9'ZP9[)(0FOO\"T9;@^<C3:86O]'W`DF!?\nMDMA&6*J!31QE5^B0*NQLYMY!;S\"?G2H@`;F;4;,_'J30Y4U\\=WH\\;M>66F\"F\nMP.W@TD[6L@*`LD(J5:#,\";?3<HICZ(C90$XSD%$5=^4.##9#W^?;:_.'Q\"#J\nMY'T7:P2S'M\\]??GV];B$$VR^<*T=L8>?UO_\\_.FAG?[''__;\\_GAI9^CA*BS\nMO+;#P5-?SF*+/'D\\V^+>PWAE()G225I5JVHKK/<TVR1PMO:>_5EVN)A5.3\"B\nM,@:\"WM?>PUI5*0;,\"@H5C:?3:>S#JLY.6T@A(Y-',UPM3ID:1WZ[V.5X].7I\nM:2VV.*XUIP\"AC?TP,TW,7<J(H[)EM%C<^^/'CY=CW[]\\?KI$7(_Z=K-_?8'7\nMEX6^^+K%>DD/-<??'RSVR)$NM(`RJ2RSDSG;V5J_26_*4BA256AVS2.R8.;N\nMS[!S\\D@\\0TZ1GLO3O_+U4VZWAK=MC]R>;#FA['KA;7\\R/R?VT%\\<45%QK+`G\nM^!/\\ZG;UNBS']1AH4,>78YQV///I)YVCZ?W#0[.RX_*R[Z-Q,7-OGVK0#=8!\nMY$TN;^@=C7P3:A!'XT:T#`\\[R59T=Q=YU.'BE4KE4$9S:R;I;8RJ@)%92*R5\nMK+$\"*V9\"4TPJXD^Q]/*5MA9;$,B)RCJTV$*WHS(@[VTTNP++2G>+6YY&-[,M\nMXC7?KK?CB]Z]7^KAEQ,?Q]OGSQ5:&@G_72RQX-O87NI`,PN<@4>URSA.2WM<\nM.QOWW!+Y_OP0I7[8/@X,MF5)PSX.`6WM-3:'FO'4VIDGB_0A!Z_T(Z,@NB=X\nMI++0S']YVPOS>&$FH`J_VT=,<)55-<&00A6YZV3TA`>.O<;K/KA[MW:^'+WW\nML>#;]NJIU5I?VVE]^/GT_F_;KW_[_'5]__'C#^^?CLOEG_]<CJ06NAW&?R*,\nM?%B61[,7Y//@PWI^7I:EC>UR4<28\"2<6>\\:LM7AL9Y0N([XAWO%C8W/WLAK[\nMD9DF\\\\0/RX=@#EV<N:Y/72<>I^/:W[4G[QBMO;:2KJ.B`KZW]_[+BVV'M<CQ\nMT_]\\6?[MJ^'I\\O'TC^7I;S8>KGDY6QL9-0I`:^WQ\\=',KOMVN]W>WJX/ZVF.\nMJ76,V8\\=$=%T=%37YAD6UK6>W>BV[W=R<`XTY\"P`H<.%1C!BYCW,WX7F5*FR\nM!+K)G/)%_6AJ(J22TIF!0>VFE4NS1EB40E6IS!Q(`$4,`Z4-:G>\"2P3,[H$<\nM9$W0A+)FB%)5Y(A2,HTR@YV_>^P++(/I'ICL=&4E-'4%438`GW\\\",'%D08WW\nMG_R^W&!3_I:<BS&KJKE_;T&;@[3=0]6B)JCKF.UFLP\\$9:V@S#$JI[RVMZ6Y\nMUZC1\\C+&VQAF)F-KRV/KL[+WX_NG]OS\\]<N7(T9K-?8C]%!F)'MKYDZ31\\U<\nM`4\\QR\\P\\-75>)I[@#5U&@Z7@;,7R4J,EI:HC1B!\\1DT!N_+ND:@J0!#(J!PH\nMXWW[!&P*J1DEW1-?[XU[N.OO\"4HI%`42%!09^\\$?GQM/',LQ;JR*&L=MWU@Q\nMII.ROKY\\6[L_O7NV8[]\\_?3^]#\"!):00Y34,`*M:JZK6VK+TQ6R_O*'4S<>1\nM^+[/3%<JP`:OBHA26E51Y50C#(HXP$)#8VNM+5P;O*%?M^MY75=?6FM5&!DL\nMH'0VN$R%X^WV^I^_/O[MG\\<[Y:*11WKF+?=;M=>WMTG3]]X_?OSX[MV[=^UI\nM\\?;EY9O?I4<^5%DQQIXYPI2=//DX.7<?3:5Q'+NS.TW?Y?H$0C57&K@U^F(Z\nMP-0=_!P9HW)4'E41*G.:R7C9;RN\\%];6W7WIISS[H<;K9K0L':B)5LN4\"60-\nMJPUY&$M8H*@Z((QTP,!9!S@WMVSLQ*BL\"!<Z&/>#F(\\3*@)V*.^`G16KFU6I\nMA,C<P5[5D(8V9))262B\"S7PQ$_\"^VDS^JK(B9O)O*N68?WBE#L0=YP%75(<[\nMK-'F@3+M#D?G&\",KY_/JE9;96K/R+&[\"BPI9GNRM43SBAHSKT_G]NZ<??_SQ\nMRZ>OXXC,?*L;JPUD*-NT1(\"2SO`%MA0MD2&/\\H!`R^A0E>K(N3F;5%'J'4!!\nMMPR2;'>AS[X/,R,$B>\"L1E(I[O`8S;S+-.M7*VOF7U$30)U<(0`Q`5!E1!,;\nM%\"/'Z_7;PU(-6/N@NE'6I03J]?9F;0WI7U^_K&O_\\\\\\_LN+UY?->455SP&ZP\nM!3R9];+;V/,U)3T]/JRM5^_[;;M%3!>!D<K2K(C]_F7F_`H3.C*:BT?L1D)5\nMM`H=.KA#XL,`G2>M='-ZJS9J*`HUNF1MR0Q]N]K+\\9\"MV>FG97U\\;.<E.O;V\nM_H>/5;7O^[[OM]L-P,1(?_[AQPG2&.W4EUS7S9O3&N$$385,A2IB[-IB>3S)\nMO,\"LRN\\>EJJRQ0`KHX.+^106*BM\\$GTZE'ME9%0SP+9*D$PL5*.?2EFV)DO.\nM0I8.H1Q]MO8YZ]BJ:EA-YT2J4HHL(HV8GMD\"CLK=\\D!Y2$H#5FLI[,I223I-\nMCY&0TPR%*M;<4ZM`U3`,U0$Z#,B11[N[\\^FDT8J2^9(@,/^T.1%(\"`#)[Z>/\nM*.8]VH:/[,0]TC@GE0?E+`;+06!MW6F5-0TN+&;A<-N,$>'\"HVA1,(WC^-<_\nM?UW<_O#+[Q?VO_[E[R8<F+VD@#3&`?@\"$_!L?8%/W7R(>Q2&\"!Z3SY`.1$$0\nM\"BK5EC(S48DR6G=V<TG\\[BMNM\":ZZ**!B=#4]<W$AKMB74F\",*FFY7[:N$AI\nM3))G]FH=Y1HUWJ[^V-[]\\O//R-<O7V/?.EFRO3(A;XZLR[%]N[[]'._ZVOOC\nM^;*/J-'1'JU#:O\"8D;!F1XWKY:T!3X_GA],YXM@N-_M^%<^#UZ9F':PI1X`6\nMN)/=C8)4[N9]1L.[PU5,U:'=8`PNN_=FJS4#6:Q(+`/&MJZ]:K_NX^T:UWW;\nMCZ2YKZV!>;1_??OR\\/#P\\/AP/I\\C`D)ESHCK8]^W;5,S+\\PPQ#'&DG9&`[I&\nM[6];N\\4SE\\?SPTO,\"%EFW5&O*7TJ2!&2\"FP%F8<0*A-JSBJRR-A1(Q.B=S-O\nM5,U&WU-5'5*!;%.+$_/SG(>NMW9X,YC-:%RJ**B`14QR4`>41*\"NBAOR1*OY\nMZI`-\\YHB@`4(0E(0\\Q2?BK3,+-VYP'#L*=.]QMJ,;F99J:I,HW7SK`)44.#N\nM/P911$_-X(U9)T+<9=!C/H&R6;%8FDB51D8@&YSN9C944#DT^;14':BA7+\\_\nMYDOO0!W[_NWSE\\?3^?WSN]O'_?.GKUDTM]8<83D&[@'&_]71_1O:+(C@WN5N\nM(1U'%>3N`$?JED=C:Z`@GU8R\":5NO2)-.%GKH$D-[&Q?M-]EB?>9')H/NB0@\nM(?O^K]UKAPO`[/^6/**KQK&->'E[^.5WOWM\\_MK/+[&?\"FXM(W;Z]UYQ;OO^\nM^=O7]^OR[L>/_]_?_SGR.\".=M@!&T!U9)\\#-,O/V]MJJEO/B[@%]+T,W^WXF\nM&$DPD!1\\)F)-U'`*?4A/IP$!'4HD!!K7[EL=OJF;M],#90B,$2_QRK6?TH3R\nMA`^!;LOR^?959^2AM]K;?AQSZ#PO:V?/8VS;5E4U2]['/HZ*;=__]>NWS[]^\nM_?+IXZBUK^WQJ9I=,F/;GP[ORYK[;5:ZD[1I607H-F8L8$05`+BYW`%3I1D`\nM=LCAJBRJH\"PU1SK->?+N98_&,TYM')O&34-0S.>0DG1J/6G3;];%9MQ1Q7JL\nMAJ;-XF#2,4Q;Q;7B'6?&-$.SR(%S6V/(#`X:U$IQ;TIB)0$35$32DG<.>S5G\nM;R96Q2QR9,\",.>]/UHSKG0G#Q>JR^_/'\"14:H*KZIEVB8*II]8(#1+I(N)N3\nMG/V@,)2QKRT-O\"]$`?IL:F/1C-[ZY>WM+__Q'__VIW_[;W_\\DY7]QZ=/Q]@7\nM]6YNU@SHWB@<$2FY^GRHTEE)FNU(F[PY]%LMXGW'+MW_DP4<(98):U\\2<F\"E\nM-Q#*!EO,U_*Y`-]G;&>*$BS%^<<#O[6C\"B@,0`XV-`$GH]0@O'[Y<OOVTCX\\\nM/S^<X\\NUF2]M34&U'R,$=O<8X\\N7+^N']S]_>#Y]^EPDA3Y!`+!,!1T13WU9\nMR,QQ>7L1'LNJ+5Y!_%8(S\\GFL(30;FZDRQ\":D*X(V6P,+.3(+?90=%CUT\\/2\nM,V-/[K%GK@97J/;T'QH65S,>@<L^/KV,?[W6[]_YZC&]JN;MZ=WS<1QOETM$\nM//259._=P-OM.A.3,O,XCF/;QWZ,,7:QZ-5Z-=N\\`7P=8;$I<[;:3S\\AW410\nMNNIPH[LW8*H*0=!X]CXH(1O4K2]RH=+P:ED+ZH@+]4@!=49KYH_>K9164@XQ\nM!4(T.&V!5\"+09_NID^1J'C:I#<A8U(Z\\*?:RZB:Q0JG\"U%1-8[$Q)W!\"L$!5\nMDY=Y5@(J,0M))LPP4YB5@`B'V=3,U/R<C#1`B;*\\&Y=C4BR0S&5(8E0%<D,5\nM4501TW[>P0:L,)JSN9F-S!E'%:C``*Q1C]U;>8/1ZL!>P[K;NJRA?/OV\\O+\\\nM\\H??_>E/?_SC5^7KMY<]#EKOG'2Y5=45L0B.E+5A.J8@EF8CR9K\"'8\"64\\_-\nM!W04_)YA,`L:)3-5W9W9*MV-RRKD228B83*OUF(24*HE[]S@O(CGN`0`#`FJ\nMJ#05.PEK*'RU^GSY^O2\\/#P_O3Y<XA:IW$M-3-2]6'[$%F-?5[U_^O/S#Z\\'\nM6_#1>L4H\"5%18['&YEUN@`E50?=^6F_7G`2)T\\Q<$]>HNFDL;'3>6^CJ[I<]\nMG\\^+=X58I40JO1DZA\\().MU=A$96%`K?OGWIC^<3H\"TLBO]XQ:\\OC[<_G5>_\nMCK1=W=7:NMQNM^UZ._8]EU,W;[3>^QC#:?/^[;VWQT>\\>_?T]'2\\'M>(?+MH\nM;0GTWG>/ZZA.-O.:Y>KY7S5/8PQO?5D6EQW'49'3')&10W4@#\\6!/*A!I>%U\nMR0-VX'#Q2;468'PP7V0#]#N9S'N3E,#IOIO-NW?UF,)J12.$$B`90CB0>\\55\nM:K6J&6=8K)F(S+2[6ZFF_U6`)8HTL^DFF$1E%)WJQI$AJ=.<='/0IZ:\\W]EG\nM\"R@!3!TT,%\"%*1TNT89RKXC*6#V@`B4EC:4&E-`$<^]]*6-4B0C5GO'R]JTO\nMBZ'.2U_<3/#\"OI?ACKZ>^G((W[Y\\/2^/O_O=[__]O__WO_VO__CVZ?.<P\"<I\nM%Q'3#C*YD$'MRJ,2P\"-]9M+X++NH>R[&B3UF6?>\\6!0PLZ7'-@@DL2D=]PK7\nM7?&15H2;ASO=YZA?><=4]=M\"^/T^!%7*DF5ZEF#=FS?S7/SS[:W&N^7AS(=U\nMWT=(&^L9)I&T%\"(S4<=Q[+?M!UL-W55/Z`$4\"?<-S!JWVZVAG:=-.6*O<:!2\nM4QPASC75P%*JALJ@1@Q557&6R;H=QV$-#-3(@C=\"O5OCL<7)6EMZ6^X^3U2Q\nMF!DGVJEU&IF6EX&7\\;#KA].C6STP#Z/_/__W__6PKA_>/;][>@)UW6];[$.Y\nMB,-P:_5R>;U^_NR?W_3/+_'MV[N7].?S\\=2O-<;+Q;Y>G[9ZA!_=3KX\\8V'A\nM6O$68X^(D3\"M])7>A%+==%QTO&D?YEOEH1RP[\"T6?^U\\L]K!,6K*9VI/2U@9\nMB]F&G9P.([VUI!UD+FM;EWVNLM#&JAL=MRX``\"``241!5).WA[4U_WR\\;N.(\nM*`^P`.`&?%(\\H9>SPT^%9_&Q=*Y:,]\\*L^FE@5U8@`ZT4E%SHQ&4$K\\C[<[Z\nMCJ4S@0VYL\\(1K%UYK3A,Z0:S^:P%1)C31%3DT!\"*A@]JYZ&'U%/R&7:F6960\nM!4]@$&485$Z@N=EP/ST_F[7+U\\NXA7$9L&\"[97@_4:W;N?OYZ\\O;UZ]O;/U/\nM/_WX\\X</;MB.`TL+YV6,T4PBK2<I[_!^5!YQ6.,:,F!:?E(S/%DP)L9=\"*%T\nMZ61^]K9J.DAG8ARS\\[\"Z:EPQ3A5<O*V=IAP;QNYYG%!.TC1R#(61#C;8\"3UU\nMXW?2HIW.[#ZB1L4157O%-7Y^^N']\\OS/?_[K4U[]^1&YTV$*5S1B0*]Y7(T?\nM'Q[:NX=+C<_'6RZLAEML,'5E-RYM]7X:X#7&P4\"WJJH:#IR\\.7U$')GA;-:6\nMOM8H';587]F98/&<+4)[C</*5I[.ZZFYMB-P*8W%[?%\\7M<5PC9BKV2SE^?^\nM`TY;8TN.M3^^_W#YW_[0WC]^XM9-5J/]^NNOZ[H^/S\\_/3V]>_?N=KO==\\+K\nM[M3)C$_/>4W%V^O+V]N7US^<3M?>E!5YC!B-2F?J#OV%*JHF3Z?2;)8+6-'-\nMO5E?77LQ%#'D[O-NV^99Q@)4?F]M=_,`=Q',K?:'JEZ<1Q]5G@6RNXCJ-<68\nM]QIK9%G52J=7Z7Y7IB;2QU]S_['P5/XAO8&[U8O'S=)CXF/W+0B`>%<PV/=4\nMUMF=>Z^5E\\WT:A\"0K&341%;NLBR!4H(F`#A-Z8NP``FZ$*B0W#!Q\"V)VUK-Y\nMJ[([GY8E5&6H`F[FWJ=9Z$B?,?L11^7(:.9C#\"(MU6D-K:K^\\9__F76\\?__^\nMX\\>/K2U?7UX^?_U:%>?UW$]K9JI*&<UZ+[04*PW=S>]03>J>ME4%SC6\"D\\^D\nMR'FM13G9R,A2RIU>S$(!%9BQ;Y)IUDXB0<X?_AL]>#?'P*IT1XPB:XKZ5>O3\nM^\\M^^7*]+*_?/K[_\\/C3^W]^WJYUZ[Q_5&[FI$(*Z6T[>/WP_CW6\\_'UM6+0\nMFJ<69X/Y['5%397Y-HY,O7_Z8+7RJ#@&D>ZM&B/3**?YLM#*8:QIX#'-#OOO\nM`W55I5*H&DG:#=N;O=D\"KQ85F>,2(T=+E[L;E,<8U\\OE[4TO=NU7EZ)&0VF[\nMWFZ7ZS_QC]_@)I+[Y9I$?SB=6EO/3_7PA//C?GXBY&[,/+;]&(>C;LU6@:H]\nM`U.(!KA[\"2AEYI&R4O>F9G?L08B2-;?F`6'V/*+<L103@E&-0=X*6PZ4'HY\\\nM1ZSLC<:1%`KR43#.9A?!`JE0(DWC0=YI;`3S#M)\"<+RXGJ0E^1[M!+PPWZP&\nMN:0E5%)(!HIW]-)TAQ-)-MT7M@XZX((1/C<;H$U^>-*&--Z_K[K[+<SN;R\\2\nM=/!`#60#IX!]/I$SZ@+F1X@D1&59E*&,MLH>Y6N@Q(>V^+TM-&%T,C(<GF.`\nM=CJ=2&['_O>__BWVXZ=??O_CQQ^692'Y>GG+S%1F!@`75WIRF9**&=0[WQ)W\nMM[I/_J:ZI[G>HYS`%\"%#,W>2(R(HP$0%LP&$51DF/5/W6M89P580)V`S5:8$\nMY*0H*W&FRE)HL*,P8+OJ\\^5U??=X>G_V*W8>@].^1H(+O1E899?CP.O3#S\\^\nM/CWMG[[4L3?=LZ<Z7+\"L!&+*TW=HU%B5'TX/I\\ZH;<1!6E!'10.1U5JGW6?R\nM^ZEH=X]TH^;H.B1+559W)7AD1.;4443%G@<C!)@9D#6.N&YQW?*VL,G,O/7V\nMRR]_F'S@[78[CF,N1%(]/;U+PKNMLLZ0+1T-56]C1'2R>-012=05Z*P>::H:\nMBDHZ6W/1*`YK*NT9\"4WQ`\"1&4=^UVX0((YM,)8>GZL@*4SD32&5EWNH(LX^-\nM9_IBZ,F\",D+-?=:8*SL\\4)&ITBQ*$Q'T72F6@\"+<&NXCJDEPUEI\\H,G;#'T1\nM&-#WYT,K\"+\"1\\R9T<8HMISU_:M:G$C(@1PW0S9JYXWL=!2$BE5XSH-K(63BE\nMJ9#F/9,;W[=<D.P3AC-+I*R\\U+V?O/>0'^G@0UN<1E5,4:L9HYF@J%#80>_-\nMS%CUY=/7\"OWPTX_OWSV]?__\\^?/GO_[]/[=Q2.5FB_'$EO1$@W!0`*+2:?S-\nMF7T_B6!@IWG!OD\\$B[5)>\"Z^3)(6@+6NWF=T-\\1&V92WF]WB!MQGBX(&\"F)3\nMJ69BI?F]ZIC-S!W<TH2U+<=M.ZZWIU/_\\/!P7%Y#,)H;F\"K5(EM@#G`;=N33\nM^3'>??SVZ;-))^N-;E0(`]PJ#BB,WKIY>[F^G)J_.[U_]+Y=]NO8E3%C#C)B\nMS*SN^SR`J$#K-#-J\"E^K:AXB[HV]PWAD',K.Q1K+5;.;%FEP9B#(D6V$4J=E\nM?5BZ&EH>P\\CSLJZMYTP$BAAC<$Y?R3AVW@Z,V([]Z]NE7C?IQ,?64RQM%6^B\nM`^_,<E14156U23T15HVMJE!\"<_9FT*+*S`$<F4>.W:B&UMI:,M6IVIYQ5>YS\nMT+7)E^O-:4KFB,HS[6%Q*U3$$&%$2K\"T,I@4G42I\"I:0%22AB@\"Q\"EGY@M%<\nMSS!6GL2?T5_,!E`H39$-$:J\"?#YO]WR(>V[G%.*T>7?-L17B?'4EDHW6:%D5\nM5\"A#NBB;\\`!?X8V61``#/*4(\\C?AR,Q&`V1M_LY.I^F0&LS%C*@E[?LKRBB6\nM9KB)D8@4U&!1D7OV95EZW_?M\\Z=/Q]A^5[_\\X8^_G/[PLUO]]==_'-N>1\\1^\nMH*\\/ZXFGJ%1P3!PB,V<HH]U'1YO627W').?\\#&#DF%,TA:IAL$:?1`YAYN:3\nMAY`HNOMOM9`C[US-$!J[0*/9S.XAG)+Q@]:(H\\INVWY\\>_GYSW_X]P\\_[J^O\nM5YNOQA3;U(G]S+[25=O;R[>GT^GCA_=QN^V7JQ%0S5]=]%&9%7-8L\\:Q'V]O\nM;VO@X_+45L<`LU:WGJC(C`)H]-::%2*C7*2:^2RZ42D1[F[M!/I1NL4X^[ZV\nMGE9P#*EJ'!4]'9*-XABVAZ<6<TE1U:8B]+<RICF$M-9>OKQX:ZU;#]',U[66\nMOIGBMEM5CFZ>*!ZE2]8\">]>[I(RJ[_$DR&+5H3%SZ<TP/P\\;;**[,6H@1Q'P\nM9CYIQBZ6V,&X/XW4?.B7?A&BQJWT)+H_/G7W.[YG!272:8DTL9E%3:ECL4JL\nMZ9<M8>3Q!C.F?`EK3\\!:]B#<\"-QM('!4S)%X\\O3W@J9)T<OHAGMZS=W>J_LM\nM86S0G:C@5%BHCHH=^6)UHIDX(=PBI@VX4O>JT8DGSY\\\\!S)5(]SO@[$R<PQO\nM7=V;M2Q5:-[&F('_)1?6MJQ]J8@C[OZ&[KU0UV^O?SMV(G[YXR]__N,?VM)>\nM7U^_?/JB2A%M76Q?CFW[;0VTN]<!?J<U:SIQ$Q*8)(T.J'$,S,<<Q*P\"2<-Q\nM;%5P]^Z-XH$C*PSNS<49/0,1<2_XS*6UN1*S`$@Y5:9\\-&YMR;7&-EZ_?-V>\nMWW]X>O?G'W___W[[<HPA24:F4K+N\"]MVY*=O7Q\\>'CX\\/I^?GV(_1I4)1*<W\nM:XWI&\"#\"DB:\\?WS<WBZ_CL^Q'*>VIL*A%>[.G\"$``,G6FH':E9P4.)RLK*J`\nM&0PCJKFOQM:[+YW-%3$T;K'%T2Z\\/9U)F55J.XZWMY/]XK0QCGV,=CX_1L2<\nM0><=:&:]]U]^^CFA;MX@Z_OVMA^=M\\7.[OMUV[=;K6;W';>.RND$Q10Z1TVH\nMEU4T2AJ9<E.&TYJ96@M90*8B9UHEC.SB5G&P!BGW,B0T4HD*6!K2<3#WJ(6M\nMV]E9T(P+K%+=HX,!;Z1\\PIF\"7&@SV%!X<ZV9JSA'>U$)D;\"$\"PT,3/&\"C\"JC\nM#@G23$E2`0R11E--H,*^EVC?19ZMV9013$@\"FB2AF37YJ7R%-S%2]P*:29A)\nM1IL+/T`4<TJ^5(1-54Q4U1C5[,&I[@JK0*-U;P[)O(ZQF\"_+PKI31,>Q.Y;>\nMG:T-:KN^_>VO?Q'BAQ\\^_.Z']Q^>'I_/#]?+S=HIHF[*EV,OA-,:S<CI0FSF\nMW9P9D@(U4`/S:#*2P5(W24<%R;8T`3=-A*X:%Z+F:NR0H4B3,`7U<XS(JH!2\nMC=#=DZ^:)V))T0ZU&ARCU>N^_^U?__K#PY\\__OS[\\[&-B%\"9676F&-11N2,4\nMMR^7;Z?'T_/'YVV[7EY?FSM'`34R(PM`HS?)LLZ/9ZYYV[>OQ_64XZ2VP-92\nMD`;ZG<''E!:Y_Y8G3R61H<SL1=H1:<7>O!S\\KN\\K:JANQW[#=6T=6IVT*.V#\nM40Y6*:EVO5ZG7G1=U_DV1@3)SE81X5J6WM=E:UY+L\\?3LNS[;3NNMU!'_TX]\nM$<<8%E!&5@9I5=/@^_CXN!V'8H2F&MU::T[;HQK5H3$57B6D4+H@DLANV5B&\nM43E*@1J';'4N;;>2\\HK<-)8,L=7,MT5)+*DL&]W<*+%$T($&$I7\"[00?9/G)\nMV@.;,P?SF#CFW4\\X,;M[))LF_O#=)#`-APX%DF(3<\\(VW[5@R[)XJH4<$#`]\nM!)2=Z6?ZF?V<YM*XA_^JB'GUN.[NZKN(Q+[KN7_+S:A\"U;?M>HI',SMB1$P&\nM$12.;8\\:BY\\S\\[;?&EM?EM@#4([HWM=UA>7M=OO[?_[U>GW[Z:>?GIZ>?OKI\nMI^O3'LG+;5^VK6=NUQ<8FS<'+87OX7F=EBB\"DVZY&V;(/:NUAJP]=X<]K\"<`\nM^[$]+QV)69F(FD(,KKUM]PF`$.`V?2LB(T.S/&U>/IB)NLQ6M]P_W=XV@VC?\nMQOZP'Z?'A].ROMFE*M6,L@H.%2-EE-MU[$?&X[OWI]>'E[?7UCP#&;'5.\"\"\"\nM2VL+,?LE'QX>;.G7V[9'=./\"M4F[IG[=24[A;C.7,5$49Y-0U3SZYZ\"$[3CJ\nM.+B-7M#CDY5Z[QI6R\",B(J#EGB0`;K=;CG4ZC?S_^#__]_D2]M[G$S!S+EI5\nM[OOEY260.#4I\\\\OKY2__N/[Z.?>]KL?Q=J4UM/9M/RZ5[]@?EG-+CN-HO9_.\nM)P<9M>1VZNYN%6%#3SB].]KYBHVY[UM4HL_,G\"CF44<VFJI7G4L/J76:FI4O\nM\"]&MW*PWD^.6MFO!LA8MYSUD(NANW@LTZS4]#F:#N\"\"N0#0XFO9<JQYDI^*3\nMM6>V4^AO/(8)3C.V4DNMJ?/0K:=,08VY2)@;7,)I^G,`,\\*8Y(&Z:23EH`O\\\nM'BCFH(D'Z(E>;$:'U0R/<+O+-6#N;F3,I<#8M75BIH)G3D&_\"WRVI]K#H+[8\nM4>,80X0*%GFRA=*(H\\,>?7TH>U)+5RI';$HU6F<[]GS[]G;9WFZ9EXS-X>^?\nM3Q_>#>KMV#\\=1F]D<1RMHC>;\"17?XO43]F]>H]O9VJG<1-+.:)83*;U[1%(P\nM[_(EK1W@40BPL74V2SC@,W85J,JL4<A`/G_'9@,54P8,0?A<0;$%SNA/?=$^\nMZGK[L)QP4C]RV7.EF3=)%K6(WNBAA\\&'\\@_+0[/VLF^[X<U/WV*\\:=3T&)<:\nM[:&?U\\R'K9[WN^.K:/?9P^[MJ6[LX-J:21J#?M*@1/=6Y)$9*E&WM\"*:;*$_\nMKJ>G96EDC?'U^N;F//?WZ>^K*>L?IZR'7K]_Y+M3K.V#G=OTU$^KU12I`5C7\nM=3V=EO-I/9\\.C=N^80QO;5W7MVVT4:MXB%6:<8`T7)9Z6NCRW'39+LAK-U]:\nM&]U![%4[8-(-P_K:K%NET?G_,_5N39(DV9&>ZCEF[A&1F77I[ND9S&`PV)W%\nM0B!<BBSYBRA\\XK^ED$(N(%@0EQD,9KJ[NBZ9<7$WLW.4#Q;9V))ZJ\"HIJ<J,\nM\"'>W<U3UTQF3D69;.A>[9`>1<6\\X<\\+`!?X([UTC>@`<V80=OCOJD/O$E,['\nMH0'2R\"@3R'8G1*QP6`[:L#!'P';'2PX7ABB,N;\"[F[#T[Q0B[S..Q=1=*7+X\nME/YR6BON1\\?)*S0;X>3T?($TGXY0N9%2S)\\S>)\"25&868>8P,+.&8M\"*B>3K\nM%X.[:QP]>W&#LZQE01T1HGEA-XU,\"$4U@5N.`:O%BY?$G.0DV=\"$G?G+YTMF\nM*5NO#P_+<CB]6;_Y^JOCLCR?_W8U8T>7`#D\\Q^@QS(LI`\\F,;4R>/Y/,ZO/H\nM/4(1,Q`HDTKX?<HE,K0K4BSW\\?D>%YJO4@(`]L+,-,$<Q1P$84P=S3JUQQA0\nM$'(;SEL.`]=EZ7;;>S#I9*6M=3&@.DVV7[;+^>J'95G6V^TR^WTKW>^'Q9R'\nM=F5F:C)S7P&,_'=O7MZUK8B@N:2,0/1\"3YL=E@098+[:JD(Y(GI&A'H,<P]@\nMC+'%WKBDKR*K>;6ZP2YC7)3EX>%AJO/[OD_>869FYLUF9@^\"*7-9E_5T]%).\nM7AM:)A39>V]5012W[\\>E%IH7/Y3:1HM^C:VCVN$P0Q#F3N`67;!:BFYP>)&L\nMQXR.H-#HK)JEF3_9P8]6POQK^!;C&M%-2C7HS`&TM2Q>2X5CAZ5D-B$FVS2\\\nMFWGF8DQSH_70N2(=@[91EQBN%*L9CO`D\\.H(M<G/!$[I(8PIR>MU=P)T3&08\nM$BJS=Y1(XC%9B)D-'9Q&2@UE804BD`,T&&V>(F6O;_U4?Z<F:3-1#$C,`!*<\nM(6!XRUL.[^DKC\"[9:\"-)WZ',8:\"7*K$K9&#U,E$\\@*\"(,4&5,!8=QDVMG7G>\nM$>F)IZ>'M]^^[^W/_OAOWW^\\7`M+*:<]X3&<EF0E@Y0XJU8-3F',S\"P)V)3W\nM222E2!AI%LJ.L-2@%=J1183/I@%8$@Z(:#9)=J/*80ZG\"8(>4';J9GX;O6=T\nM:FA\\WBZK^:FN6`ZXW-*F=,0*.^!0:36Q;^/ER_7M<CP>GIYOK<60PMR+N45.\nMES!GVDYW42IHZ60Z:9F-LX&/-O?A2*62&8)2(^%NI-N8^K#280%U94?V#$I=\nMR>()M=9NP\\Z^<'$19N;[8(]1=',OA\\/A<#C,F)*9O7W[5E)K;<]FD4;*;.Q1\nM,I=E>7AXR*?'L;=VO5VSGP,;<\"URIK?]4\\/2ZU=6OCJ=6N_GL0VHC?!$03F4\nMJARMM7W<LM88+/(*K&!+#43/\"$-9RP3,6^HU\\BD'WJ@L@IOMCFZ9&.<QKF,\\\nMS?O>W*:DD5X@(`IH5I39F55I,%=:Q\"50`#>#9O@07*RZ'R(DC=0@2$Z$&Z`C\nM+8A=RKSWE@Z%,L6L-)@Y9\\_G/1!P0N4=6)8A],C.61;M]RMS[B=F>!2,U^#8\nM720D\"VFE\"%UBYNRZA8,S=CAH4O2^CW`29HSHTO`HEBB:(RM^<DJD%%)\"U+PR\nMIO*NDYV4V/K>VN59H=''5^_>OG_S7_^GWSZLY>\\S+^<Q#SN&7(1UT-P*2U`S\nMM$R(D7WO]UN(6.`^R3%D:#($%%*/)%\"(Q6T%[JT;M+DBGOIM9DY,CR*%ABP4\nM+%4I:5KS-2*[88RV7YZ_YN']^OCF<&)7IYCT2*9.K-6<AI;M<MW*WDI=E\\.Q\nM?_F<F44.LT*KA$NFE.X372?#E*(DI*984N9%^]-O88DTR,S-(+>4]<Q4SL&P\nM2F$8T*\"<\"$-0$=D2EV%GZQ71D6MD;;E:J2M1O/SXXX_32+%MV\\S7+\\L\"@-7-\nM<*A+/=3-\"_M+J<O3X^-YK>'LCJW@4K0M>(F,B%^M2Z3-$-21ZY$LAMWT\\981\nMN;BM:\\E);H:6:BIN<.48J0,\\H$!,N[K=-_:@-#)GSM72D&E%10;SK62/D<I/\nM_38@T9>1%?(0H(*[U)&PD('L,SP*/H:9=`!=LI23*_U@CCWFUV#0@(*ZZX1U\nMH<UZ'KQF!Z;$($+.&8KCG?5*UFYWE_9TAQ`.5KI&%O-\"@W+$F-*USZV$,+6^\nM^W5H='(/3!%*D,,=A:3#R\\+('GU$Q.%PR\",R-7JN4=S-,!$221!0QC[+IDBS\nMR3`>?3YL1R9F/5NZMOCRX\\=MO[U<SC_[YO\";W_RZ'M_\\/__O__?##Q].+&]/\nM)RJ7&Y!<P1MRS]GFXP4<(UXW63,(9DP:>56$$(F1,:G>F+CSO!/'?5;7T@9%\nM`\",!.MS!&JH1#G/0#$Y4=X>3$WX7N<>Q\\-WR<*A+]V8*``4R:=5$FIB\\[CF^\nM7,_KV\\?#XT-^^C@T,D8!5G,G\"\\P%FD.*1#\":YI#A`I=2YR`P6J=D7DNIK#6R\nMW]5,,HEAUF-VK:>3PS!L7GN@4VZW?63(B8'<F5UCZ^VXM]-ZP.%0#FB.\\O;M\nMVU)*K34BSN?SON_N_N;-FQ\\OGUO;&7D\\K5^]>\\_PS_RA7[?1[@-DM14+FV/+\nMW*+MK*N7=O0QEHSJ7=;-'3YB9.PA`YTRL^KVL\"Y>F`1:['L.TS!V``9O@9Q;\nMSGMT=2`'-\"VFK2O@66QFNLWX$L.S'Z`%5F!%T]]8(Q'\"O$4F]9J2QA`0\">4@\nM`[IG8E,/7EH&I`U19I<-`>F:_5Z*8OB)24$970*5RJEFTDIQ%N]MR!B<9F?2\nM6,U<'CT6N+LKQCT\"E3)CL?)J305G'CHRYDIVNKFFK7Q^&LD8@XD8HUW:P=?%\nMZO`5,=9Y/-(]4E3I`+IT`T$6A_E/&H!(Q6@.)^%@C-C:N/1^WOO_^7^UW_[V\nMKW[SZ[^H9?F[O_O['W_X>!Z76LJ#KSX;G7)<$0&L9JL8^DDF!0%!)@JZ6=X-\nM#Q.S0,Z6A`YPHC$!!^/>DC\"/Y:5@@N%F#9956B=)N'FUZKJ3$B3=^MA'K'(3\nM.!*P6FI%6<?L-P&+M=ZNM^?'D]?#6M>:^X2VCP0-7F:*WJLBFXTA#B9EL[DD\nM(@C<9T-E1`1-F9QF#.-0CL&FV*6669&#%IPEX1K3KN?L8TA(LB.O&I9]C-[W\nM-BM*;\\E.EI>7E\\R<`OT88]8`2'I\\.K7D?KU=OKS8\\53::\"^7\\\\?/]=I/P;(<\nMM]#GL>6M1?:,^'Y$>ZQ8UH/;H?%A>'/O%'WMF1O4,9Q<';6ZET+U0CJR(E=G\nM)TQ)Y#K\\;A%ZC;H,8Q`;M(<&IUXPX;D4,!R[LB/=ZBHZF$1Z46A7``@B3\"U[\nM*J<>,.XE$0;D@7Y6VP-_7A]]=`22E\"G-9I+V&0.<I4!)>A*+9D.U;)*:?DJ,\nM1U)YP?1/HH.3Y<^D@0?0Z`8+,&%&.(B4O5(G\"8ITW:$:TYLX/[SW,NUYS:<<\nM+DA;Y)INU;.44%-CY)TE.\"$NI,$'TH30A,Y/RZ8HPH.\\QZM2&&!OZ*9_^?VG\nMUO_Q;_ZZ_/8WO_[95T__]W_[V__^3__RZ7(^E%J)D?&,?,88S@-L!<2X6[H!\nM2_GKK78C[]9MTF?`+!#*+`RA)NP^:,VI$KO)I$$ND)D+D-@A&;OBGE^9(YS1\nMR7/;7F[7@Q]MFNQ-M59GJ3&&:<O>G#?NMQ;H]73DZ>G1W?MVHXA(0>9K+26E\nM042R([M0=->=(\\-HYN9$CMG_DQ'#,6@F648T:<]LB@:885Z!\"<U^!(\"A#`,3\nM$^-RBXXL-D9F?KE=/CU_>5YJ>3H5=Y];F7F\\.1Z/^[Z?SV>9'@_'A[H*T;=]\nM?WZYO)S[MI^\"CMJ-SV/'WC,ZD`OQ)4:.'@GV>@2]5!J+46U+U*;>BRH15&5N\nM:ON^U5(0PZE*%H-:;]F/_B3<21`)F-,=</;,]'FH<4S7?$J9H[#%&\"(9IC(+\nM7=SMZ`4!24%NF-:&2'`#!E&0@.2X,);L/I+^>&>AZ5475*9R%,QZ[9Q+SKO]\nM2B.&6W&S8E82=S!0H,/-F,2(C!D;``\"\\P8H[O\\S,6.ZVX(#9*Z0.,[NHZ3^X\nM)QE%FL/G1Y!`05V6`@Q:6IJ9%YFLWLKHO0LJ7@`I`D!US_L16AA90&4@4^#@\nM#JL&(^E63!/2Y>OQ]/M__?[Z_!S_]6_^PV__\\G_Y7_]G.YW^\\7>_>_YA7UE@\nMV(B;<2=WQ3J\"=N?$N6#.`E1#,;;7F.!<\\C)?:<VOEOAYW>(.>\\+-$I&62#-S\nM)WQB0PI\\9`Q$,B.FL,]2_%/#K>VQKNX^\"1WN3K$881@1+=0TFL86S:,=C\\<[\nM]WD?RI$P`-5\\CS%=K#'OT60\"1G?>_]FY1#7!W2#/W\"QK,@<PYKA$!EY%Y&EX\nMS`PEQ:'$J_\\[%'L,BU$@)P>TC][2%C/_W_Z/_]W7Y7@ZBKA<K^?KQ<C3Z?3I\nM\\Z<?GC]=HN]MC_--'YY_^(=_^>$/?[0?+Q6VAJ*-EW:[4CJ4J/R\\^'-L+?K*\nM?`\"*.CG\"^P'%1A^C[\\BM4J6LJJ=>GML>B?G>[9&;--S3?.<]Z2N'5M=BP>PQ\nM;C'[*F(;X]K;9<1-N5&=Q^+KL1X.9:UFQ0@7+3_Z[5;:=8G;DF?LUVQCLKEK\nMK6:3Y2(AP&[HU7^1J]?:1T_(8)E1Y:O76H]+EBJKLUK(?*)S!D-4<-8V2'#\"\nM\"2^DT]S<;?+(YB/)N\"R@5:$&JGR66,QG]=1\\4ZE,HSEH@D>LM*-8!$/\"$)X-\nMG<P8;0D\\^>%I.1WK:DNU^FHBE8RH[N8NJ:5*P2H<$\\?$*;G(*@R`VTI-%GE*\nMX1@%HV9[L^_'3&SCXP^?+N?]FZ^^^<TO?_7M^[=?ZOBP/__I\\B(?C\\NRCF1O\nM!BU8$5`F07/S4E`8)M_O1QII:H=*I\\BC0&,Z=]?.;'>V75+F,Z1BI12'L67N\nMT<;*6_:=ZL6&^2W5S%$/^QB'93T=CX>%2PS<;MZCFK\\9*BSKLKYD?)?]V:RS\nM/)[>'K..R]5OVZ/QP5R9(77WH#>@SRK89`'#>5GP?BV=N6'THG\"-[!&]2`]N\nM7HV+AV?7@'I5/T*/S$?J*?1UJ5]Y>5OJ8REQO5Q[[<2HMBMYK'8XJM2GM]\\\\\nM_?;/XE=OM[?<<2['XW%N\"-S]X7@\"$*VWUMX]/NTQC@^G2A3L#5]FTN*T=QN8\nM19^/93D1+96)@Z*-&+U?&3>WM)/32^!:35G-(M6WUA)C)P;]\\?%QBAR*)%%I\nME5KH\"85`(E,:H5!H1`XO\"^]\"7DJ>2H$BSF,SE(/'P;+0W?P`=^4R[IEZ&8[)\nM(7,@$^&>I`$Y!C.1.20B/W$[^-J-BRWF7H</*B2$M523IIN4@LD!.ZNYTO/N\nM&G6HHKJQS#91($F7Y=PP@3%B\",B<_N6$NG(`BO%35`K&GZH=B]M/EE1!&3E_\nME0J?2Y>,WELZ.J+UEA#=G-.?A\\B8^'W2PM2FF]K-S`A4B1.SU^3QJ0``(`!)\nM1$%4&?<I,>R>]G#2Z\"/S?#[_\\S_^XQ;]+W_[E]]\\\\^U_6>O3<OPG_-/+RSG;\nM[O3'=3$K:R]I\"I70B,A;WF0TL\\=UC<RAF/:#`91D!QL\\E(,V'YZ4;#IDIG%O\nMDJS&,-$%XY(CD\"+A@B>*:\"E$_JR<CH.V]>*L5@ZV5OEA<\"^\"(J!&F7N96M/6\nM$C\\9DNZ0^&*%9.@>WZM>_`[4(8=:M/NS,=-2)A\"6P(!+[)&[T(4!FS6OETP\"\nMQ=\",NV&G2#1CY\"V1CBK$;&;FKM&2(P^E'JN5XG>!?O9-%?-E6=RLE/+N>.S*\nM]70TI;IM(\\[G\\_E\\_A5LB:SB(^Q1Y3';&'3:-<\"1$7$1/G'_BLM)7H%D%O>C\nMECVTC:UGW,S.Q9_*0R(4X;0*=:HJ6\\H<\\YQ\"(2.%-*5+Q:=F<<_(WCWZ0*\"?\nMV1B]Q]:QEN5XM/7`LO3-IHQZ]Y%J0W;DM0<E0L7,\"$N2('AFP`5G-5_,I<&4\nM3[GK?C%H:F\\.$@S`J\"(4Y`);8*OS7NDK,E\\C<_>MBV2NS(%,SNJB[\"[0V`>G\nMXXUWJP!>%Z><+%IRJI%*&9D(TJ5H?:/),;HC[@QL<[?,C#$B8YKFVIAZ)VYF\nM\"[7`\"\\TY>Q1A)B8$20Q`P-X[C$(P\\7(^7_[^OS^_O/SRSW_U9W_QB[_^S6]^\nM\\>[=]]]_^/#AP_GE$A%`MQ$&6XH/]X[L9!KA%BU[1L\\QX<6O\"V0;NG^S4V6M\nMTZ-$HC4'C3`AAQ)9:-5\\'\\,E)ZLX7^=0:NC->HRQ76ZW>BQ/I?A:RPY+M8+(\nML0_>,L*-1@.M8SF4<.^I4,A8:X6LQ9@H%I^!M;FU\"@!JZIB)CIB\"O=.<D^>0\nMW\",:LLM$H[G38NR=/E@ZO<FVI*D,+H$O0;F3@P!<U=(Y2FYC&7:0*_^'0IB9\nM*AQCO'EX?/_^?7QZ'H@Q!F/HX_G+CQ^O7UXL]&8Y6&^EYY[V*#ZECXA\"?$PM\nM7F[.9^6_L57<)+S-<AQ9:`^L9E+)6_2./&?+JQ:ZD;76A+7LC$0.RJ;#]XZ4\nM(\"ES8.\\0DZ_3H@!ADA?435\\2D^_R)NN32LU)[4$A)`9M,>_BD#0\"@!L,YL8R\nMB\\+!,(02$6-:S3/N7*:Y@'FUAH),P8`'O\\=;#5Z3!2B00[?[/43DQ-G>[;_5\nMO$^WJ#$,30H#W4K8/3F1T[//4@K-..9__DKJ?HT::S8,AQI&[+%8RBL*(B!`\nM$T^:$[WQ2O7$-%JI\"YTZR(NX)@0PX0D#0W`\"0(.4,//3X5\"0G[?GW_WN]Y\\_\nM?WG^].'7O_[U?_C5K_[B%[_XX8<?O_ONN^^___[SER\\L!!0<D!E1A8A4SWB=\nM`3F_S>F*!R-\\6FTF7D#D8C0S=\";!9\")][EIUSW\\7<($AN<\".N#\\^NV'3V#,)\nML?BA,D9&Y@%HJ6OV%VUG(;T6JUGLM*SI-4F,M&*UUAAJ;;S>]^BTU[LM#`RP\nMLI`<Z(\",A5Y$Z\\&NW,5-S(F^!0=XP++:NJ!X.OK]=%1@*I$Y@.I>EE*/R^KE\nMY`.V9>P#[=[KR,PTL]/I%'VTUO9]+Z6\\/9U6\"F[C=MM2V^>7VX^?==FH4LP6\nMXQ%^\\OK$T6D<C1`+P_2,.(]Q'=D*?KD\\_)=+66SRE\\K@@L+,O$0?K9V6PVE9\nMW8HGBJ+2*GR7;`IKFJ)V$E9I&Q\"IUUS\"!'7E!$S,[,SF/,.>35]Z5[(7)9&)\nMD.*.'M4.K;\"9,L)K.&YR9\"):I'E&F1]Y,HUC)D%UAQU.<7`J*`\\)L_G.<5(I\nM>T8B+VX_-0VY^\\P6`M\">@L;TP$@MAA*S@^;>APH),MC,:O0,OWL`E`)I,V[2\nM`T86,TN3V0!3F(\"T,6)$1TRKT'239:EE,F`&%<#(;(!H^X3[@49`*&!*@@JJ\nMNP>1\"8-6+D$XR^__X9_'9=\\OV_NOOOKYUU]]_?[=-]]\\]:<__>G[Y_.V[>-Z\nMB]XKBI$(1H2MZT^R]61GS=KM3KLWQ(20*F`S-[-JN$?I((?;W$!GD'3!22<K\nM>\"A5$0-4CYHH/HG#]Q\"P)1%*90=NT$N.[&\"Q6T3TL7CQTP-'7;P4*Z!<X)AV\nM[(EGO,,[S(Q8BI7Y^(/D=-&#[,HN#2)ALS!O;K3>TVNZ)RU!RIVKBKAPL=@1\nM\"H$&K5XHY=8*/`<7UN5P*+76?=^C]V59EE(S<U:C7<\"R+J4476_[AT_/?_QA\nM^^'STO*ZW8[!0G?:H=8'TPW[K45AMA[A8[/Q27'-<%74TW^J*<$34#BU&!L1\nMRF[L5+_7]0ENA66AJL;\\SC/3(C`IL<*3V2`J4*4BS9WJH.CU%GT7II'MD_IC\nM*<46M<U`%TTRI-MKU&B^X#^=:,F)-\\\\4R0)?O\"ZECJ'.2*A'!M60'8IYO(R4\nMM$*6$GEGXF!F\\#CNV\\ZTA\"D-]SWA$DQ(Q)U0KJ3@/;I>$8\"T^5)D1(]8()C?\nM98FY$S8&\\C:DE+D?:Z59,XS4%\"0GF0+$XN[N&2,RF3\"SE58TMXO1:0&ZU?+J\nM-9L/[YE.KC!,IT[(JI^6TU#F'DS_\\-W'+U]>'M^\\^?F???OMG_WBVV^__?KK\nMK\\N'?SL_/S__^*5?=@]?4'(H^^A(N66Q0>TQ>N\\1B<R^.`439#F[$EPRS2SA\nM-`:BW//#R%>?X-1R25;8F!?$+*H!G[H_P8[R0ACPB7LC-VH7AC&1;1_]MNU1\nM#\\5.#X^FD7N/2))U7:F0*3-?!6-,LDE%=7H!JUMF)I%B`D-Q3XLR4[/^G8\"%\nM9M41>V\"8`D-,4D()M9Y1!A(MQD;6=CW_\\0]_:G_PY^.;Y>U::JV'PZ&]\\I@/\nMAT,UW_=].:Q>\"T?NK=^>S]<?/^NRO>-RBU94!JSKG@`VF2+>>;613=S69:O]\nMTL9WX[;N]6_%][8^><W,*?N8S`VY6H/4=[L7PMQK&\"BXS9IH-]`\"`THC+894\nM`&=2,&H'`EBM,F)DIJ$KOF1[L%J6Y>>]+.:0M1&.`6&0(&Z\"@)$S<B>C'&9F\nMU\\Q#P3S'5MHJF^##!6Q\"F=[<&8V;31LH#DO<<4<$'&YF%38%_'O!Z7WV4:+.\nM1R<A#SB*\"RYL\\S/&?^](2>44KZV8B2T#@CO#T'ND+3M8Z4M=DFP9NV0LKJYB\nMANJ3^T!3QO2++J@5)MF([!,0ZGZS=&$H`Q#,H>(&H**VZ(\"*&;RD:;3MLIW?\nM+D\\\"]FW<]H\\?GY^_^_'CG_WJ%U_][)MOOWY[6NK!Z^U\\RZ;1(FYMP.PZ.&-<\nM4.#>\\H(I'<\\_E>99QEX=9%,M<6`HC2\"L%+_;5C('E+0[HI=D1(&MPMKR0)R\\\nMR-''^%QQ4[\\@;Q!+/:J\\&?;0S&:PD5)$[[WW(1AG313@9O,6UC,#\">$=%T22\nM5F`BNZ*/D4XIIFG[WI;P*B9M\"A'9):28EH[P-K9;CQ:HQ27UWF+L2UD<>RV+\nMG1[;X63NY7*YK.NZUCIMW+76]5279;G=+H^']7`X+FWD>K\"1X^4ZNF5QR#+4\nMQKZK1[UG[=[6!8H`<UW\"^TM>KUO[/*Y_B_:+P],OR^.1/KVH'J`AS/818T01\nM*VNZS3[`>Q;!Z$;)[SYUMQS7Z>H+H#.[LLRAH<E3)S<=J@OM-CZU*X\"_\\G6Q\nM8K(MAZ6!2I?)X!Q*)4:$,@,B4K!G1(UFR0<YY6O2O:XL!6S(JF$YG)DS\\6!&\nM#<V;]`Q9P,U,9DN/S#D+6J6[SU$+SZ.7XG0H`V\"5E82E1LG[C[O7;&+-&!#<\nM!$8?(LPH:\"A]/:F/EJ@!,[9$F-%K1)M&1Z8<Y-US\"@,K[%06\"EVVY8A\"N5TU\nMRMP+I@0[W`D;//HZ9METJMTVN;G;@>NM];4NQ]-36)[WR^__\\(?GV^5G+R]O\nMOEI['PXMZSH\\.WN/L04>-</(3.G>2YA)<NMM,MH5.>OJYZ++S58K<LO,,9*I\nMI;B5TB<?`(KYM)JX='`KJ\"EDE)&'6I>505UZO%2=Q[CT?D,ZRZ.O[]._ML/#\nMX=CVZ_5Z5=^CCS%B@,;^J#HM.3(FL\"-'1BK?VA*9A30CP*884L;\\6\\2<RZ>J\nM7,S=-@M0B62..5B,CMM^W7H&)'HB)9FR%AY6?WKWEE]]HZ?::A2\\>;Q<MD5X\nM=WRC'.?+Y<I1CX>&]J?KQU_ZZ7-NU^UJ'VX_W&YY?#P.;0?2?;BO35\\O[F)?\nM]$6TPI3*Y]NWY,_R<-/XGNT66\\1A/>A]2YYOI%1]BU[#BGBL2Q%[1\"&/98F(\nM#^*>F1'N#C.$\"FP)/QZ6@Y29I\\@'Q8VZ,CKP$6V!(/5]9_4X\\HOTHMM_[.NC\nMER.9\"B(?DU5X4%JU,6+01F%7&1E!\"[>S]=$[K#X46TBC100(*IA!90'NF&U-\nM=(T;32-283!B**?O2H7V$S!FC#XOK2#&Z*NO;=\\$E(>'2VLL',[L8_:*)W2+\nM'@9;ZEO9^5`^HOV8>V%Y.*F9?=[UE!M*Z>GKPU&T\\_G9,0X9[J6`[QY.;ZWL\nM/W[B97ND'WAZ8Z7':+=F:^7#L6WG+^V\"<)IM$:LH5J>'S(,.OHQ;$@/>%7''\nM6=E2Z^X-J7@Y5^//EO6<_/S=CQ\\_??[+=[]\\?/?X^'AJ',_C!7E;U[$>S0]/\nMO4?+\"`-\\\"<NM[2/BAC(Y:U[,'&ODFBI2K\\6$@W*5K2293;&/K/0HQAC(@+I%\nM>@C*%642#\\!2P]FXI5X27T:[C&YN;^G+P$D[Y-=R>PKS@U]H%W@YKAS(K2WT\nMEW'-3(05+#-$/S$EGS5.\\&4.@D\"%=V!7Q+*TU!8QY#!;R@SE!&8QL\\P'C\\MZ\nM+*<,\"&6OV;L=AU8<\"CSZV&+_[OD[/7__;OMUO_'#=2O7\\^7RZ0MN^WYZ?/_N\nMS>%T[-OY\\^?/AVJM;3\\\\G__T\\<?XXY_ZO@/HO6_##C7@=3$_P\"WX8.7KY:1=\nMPTISF6F`N[1%AOHM\\\"G:=_LUHIY,C[Y4L^BY3#$MLY-)6+&U%AC;B/-V>QZW\nM,2\":)I&>M)%W[,)2'%B0*17D+[!<.<[J%\\5UCW&O5<+O<7X;\\94OQTK+R2[+\nM(BPYYF:&Q)WY#`%:P$43;I+=TI1=,4;FW![3\"A\"\\<_N0T2**/)4.&.])BC)4\nM)KM02\")F,0[GIE29:3$FA[N-L<^\"P1&1X?`9T)YJH17_V/MS;Q]SOR%-XWF[\nMAG.#KFT#O7<64UV7W1H8)>6#5'S6]N!>K3\\]E&IK';K<;I,8VF/D%I*J51G/\nMV4VB^>*\\42.S)(K9BF*D3UHVA)#&\"*@BJ_FJLL)*EI%]3X_.'SY_O+3KX7*J\nM:_'JIWI\\/G_Y\\N7+V^7KT7M&@.;288C#$GP:)8WI#.8T<Y.90-^;T0?K@%Q6\nM)KC5@$SCW#5:(<,]J1%BDK,J9$(/(JMQJ1Y]<);2P!;9FBP26]1W56X^\"_2F\nM@AD11&)6*B0CC#+9?`<?O!SA1_DB!F1\"(A-Y&]&%+HWY,,QI^,G:!ATU>8(_\nMLCZQ:@2#3B0XE\\-%I2RUE,)2U`9['+V^*5:BC[545.6(V^VV'`_KZ5A.AXID\nMJWY[X<AHW6F'95&H*6YC'-BM1QURHBS+<7UC_6+$0$!Q8PZ3'!)>!D>T:->+\nMEJ_AYOX6=<W8K:>4Z$,2L9*+F:J]=V?VT>S\":!X-&<H$HJ.8+^95#BN222#L\nM<635%`RY(S9$)V#\\9UV_EF3\\>3D>Y9@D<W!MJF`%A\\&4`@,DS%,E-0>2AG3.\nM8%A`[D`QB`Y,$'#`++)->)2#\"^F`E!5:X#.;,\\,?@TH\",Q&6@8R)(9U6+$^M\nMI&,>:&=$:B1L*#\\7?HS^4H1U(<L^0B0.2W]<41:T'$OUXT'APF@*A-#''G%1\nM/CT5MQ6[UJ:G74Y6,S`SLR[5UV7/D=?=S%\"\\.R5=<YC!:5^'FYG35B^*Q/S\"\nM$`.VI*WPDFZ#2]8',*#GT?MUG/?;X;`\\/3T=#NO1U]V62>Z+B/LSC_50\"X\"'\nM]\"0;L2&NVEMFUP!P!\"$.9,`22I%(YM1NF4\"ER0#W0,X5`@4W*V`E'+I/+Y$.\nME<1*GF0/+\"?XDR]T,W>;Q_K9'#;=W)0XEVEIFF9F*^`;<0%6PJG(Z.@-O6M<\nMH)DO%0S(><LOE@?`0P4XP(ZRA[`)&%N+&W*&FR7TC.R=S4]++4KO?9&*\"8]/\nM;YZ^6C#RMETNEPL.7DZ'''DZG=Y_<^A]?/G]YV<O3B/U,C8#CXD'\\<'6B!A-\nM*VJSJHASCEOLC6(E%Z%J+/4<V;/=,C>5,I9*J_)+Z0/:$$V14NUQR+Z8?8-R\nM*L9Z.EI>LI_;UF?]E0H2^Q@;(M%`2Z-H4#0@2<(IF-/<5>S<;I7C/:,7'H-H\nMP_HPY0,LH#`?!!\"\"@@9W2\\YT6\\]HGG4V7$8Z%+!R+X]54I217+P4<Z,\\L9B[\nMP*#+\"IC\";)@:5$/&W:/A$1#2W(HY@!F]J_<4(6DFP2?:FQKBO\"QP6(TE]@YW\nM'E9\\=7K_]BM*9G8\\'F4S=9A?+M?]\\Y?QZ3DN.]VJPTZ'IY^]63Y]VB^WV+IE\nM&%C,Y=Q[>T(Q6(&;&!%C@H#=K[FM*E9JH=6IL0B9_J)P6))=J42\"I912G#I/\nM3PP%ZC*VO9A__?C5A]:ZRLA4#$^[$]IE4Y9ST%_+(P,25'@@#68I&P\"%(B=8\nMH)P`+DXEDP$6T>F!OAB/OAS*6NFWT7MO\"\\Q@1]DB',\"3UZ>R/AU./:*:F2:R\nMF9KH,R!8S,*21>;@`;[.D'Z.\"B-B$%VQHV]J-XQ8#GUV]!EG)]<\\OY1:+`W!\nMG!N;\"$@%=F+93!,V.^'7/<.4'[[_H7__H?]L.;P]E=.R0HH^%O-#79)S7K#G\nMY^=R6-_WY;&NUV2[W%IK5=RB%_JC+V^6X\\-B?=]N?9/RT>HM^F/8+2V1PWA-\nMK<E1UVYC5WX:H[?N#2QZH+&8S\"R#*8M4&ZE(*R]L`\\IJ*]U0%V7&('\"K#W''\nM!XX&=67(DWI9D%/*2SA89L<G1\"$BKFV_:EFS^!B+<,!L1=>`S=[\"KMGOA..4\nM41!-417%2W&OXH3WSB+9J4<92>KDBX$:8RXY9U#@KH]/`_@KFRR-`=7,R)1D\nM7J9EK-QWF(VO36=N=K#:C;3RL$>WTA5C[Z'9E5<8^O5O__IO?OL?WQZ/)?.T\nMU%IK61<S^_V/'_[PS[_[A__V=]_][O>WK7GPS=LWO_FK_WRZ??G^7_[UTQ_^\nMA.M>DQR,P&C]#0J3&H`I8D+J9FAU-O3=C4$^L<1D,G?(F)D9F?\"9NXX8(S/-\nMB\\GVZW[]<CG4Y?'Q<5^\\9VQ#O?>,L#M!0L^H%G8/NUB:><4,-L\"`'1(B-*LR\nM,#U/1AKEF3$2LH5PV-'*GNF9BV-U!Q\"(EOUH1>#1ZI(XP`]VEP]'AJ=3TYR`\nM.65,R\"OIQ:P(\"_Q(.YA5&EL,),D.;8PK8D,V:#B'$!(ENZ]X,0.^,A--]'`V\nM!U*C\\N250'$WN7M=UE6'=3F=MFCOB[UY?%R_?E^VZZV=KY];7[UXM7`JW)''\nMX[&-L5^N_7P;EUN[WC0\"7K26;G;5N/2]>)UDU,588C^4Y2T>(NJ\"-(L6K2NL\nM^.X85,?^J34BA_#&RB]X</,\"6UD=H=$+M*1=RFBC]\\BE+LNR+'65G)$K'/11\nMRT!NP(W:F`$^\\YH!2JM$905'*B-K`(A+M`]Q'ES>@(]6#E8,;!D;D4A#SNYH\nM2`N\\4UW1D5-].=#=;$\\1B@RC(,[*2P>/20)C4@`D\\\"[(RCR@,1T\"TW,#2!AC\nMW\"EJ(2(9*C`3`S,T\"&8:Y)0&(L;/ZV-U']8^C4T)NAO%S!/*G[_]]B_>O<'Y\nM8JV5SJH\"]U_]XK?_T+S]^.7+QR_;Y7)KHP%/7W_]G_[\\M\\>W3T;>_O`=MFY@\nM2K760T-,UK'N#W`S,R\\+4-QIG-8WO5I)IMT(M+3H&A/J,]IX.*ZM-:8I,A-]\nMI')X'0UCBN^#\"G#6UTO:%(919?7>87F7Y[:('<-IB]C`8*$J3,/@;HZYAU&$\nM%C/!GJQ<$5+Z;$T%.I75C@&C/9350]/M<.NM4Z?U>+=G1-XE6$\"2):M9I57C\nM`A8W-W-8=P#HR`9=J0NPPSK1L_<(I14G$H:TE(<KAK%6+TM9G\"6(!,+Y8&42\nM&R(C+#O2,@5H+=V0;=_/+^7I>\"J'APHHLD?;<HP\"`:?3\"==KW\\_;^7([7]JV\nMSQWV#J[4;8R7+E@X1,=Z6+6%&T_&S*7&`,8MN,=>H4KLE:CE6MO',89=#K+K\nM:\">N#RP/+\">K\",1(+4LNI6]HHW>I91;1W(U6[UM'DY4`-\\4&=:7-@M%0P@;8\nMP>8(0TA#>5'L>3VS?\\V:I&CO5!)\\[5NY(X?NU<UW2*)\"R505E\\`T_DY#R4Q$\nMS`_-JME.80E5]VG0'$BC\\LYQO%O>(F5&I@K=)!<\\)@K5\"6Q+4>2L\"W8!B8Q(\nMY(-I+SP4.RSU%@DQ:[)B7&.!'8*7'S\\___&/VZ=S;S%&XLW3#^UR^?AYC(&Z\nM1.89\\;GJS2^__?-,WMJ'GK</GW-T(8_5B<08H32CF\\_^:DD%-B.M/8*IQ;R0\nM[O:0=RIQ2%(4+S0VJ-9#D[41T3/!4E:KI25Q:843YUC\"TFJA%4D1W5(ETQ,D\nMDO<MB>X]U3'(D$&#PI`78#%?9C2N`;`B(WD*.JO<5C=E[AF;QG\"N@Q#J;/J$\nMNN>F89$UER4S1V0?5@H-[BZWVGREU=G@K0@@)&%L90EE2VV*:XPK8V<.J46+\nME-&=M9IJ6D6NL#=A)_,W5A[3\"\\'94@TLL\"+V&%M$8]E[=[,2L;X[^>,2KI&M\nM9&9=#JM9VW8-E5*P,(J=S^?>>]WVV^5Z?3GOMRTS(^+3]=F/3X^V#N>`>@Y%\nM]D[9HFS&6H$C>!6.68X(#(E202O4PMWTB:,$/D5[9_M7?OC&C]UH56EY6I$T\nMU1K.H;R,EB,*6,Q_;DYD2;JH9'V-R=?#(34B1P@=NEEN9(/ZLEXUSNHCHZD1\nM*LE0O,4I%`DE$P2GQ]=-7??DD>XN'DNYY&#>6YUYAT9(DE:99I>0LY0B94=.\nMY\\5T0NNG:WR:@\\V=1LG%(CJXF%.X</#>QF'%O!H]8F2T[=($K.9K<2AZ3P38\nMNXGFD?W\\^=.'W_WKAW_]T\\O'\\^VVQ\\,IWAZ?;<3>K\"Y9_0OZ=WF[]'U].'WU\nMS=?7QS^V3R_1&Y0PPW%19XX!,]T3JY&1:]K<QZ320*?7I10O3UW[Z%W9E`:N\nM;M5+2YQONQLK;.00S6L!?>MCB9SVW1R3L2V52.D!CDR[]W+ZL!09@8Z91@!`\nM3[3,BC\"A`4[`K<`LA,`DIGG&2GBMM988H\\78,;JQI`BA1TRR@C@,=(Z,,4;T\nMD0BDN]E2%C,<!XO3*?81&3T#%(7]L'2I*:\\1-\\1-,<?[^<\\Z;?%2I1*H0B'?\nM8WU`?90O0YY#27.ZV_\\0Z(2,DR>ZKFL40_%1.)1E`O!%WD<4::5[6>*4]F.O\nMB1^_//_^C]\\OE['JH&5I&A_&V#/MS;O%*V_CX%[)Y[&S</&B#/3^E&-7&-G%\nM_Y^I-^N5Y<BR]-8>S-TCXDSW7HZ964QF9557UTNC)4A/^CD\"!.@?ZD](:$$#\nMH.K*D<Q,WOE,$>%N9GLO/5@<9E_PD03)<R+<S?9>Z_L>\"C[W8*=GJ<PS\\N0L\nM&[>M?F+]BQQ?^?+&=[?33-$BJQ0IS72E4!;X)+2(0YSU\\EM2<E`,(3!6@4[5\nM[!PM-=,M$3V[A3C2B1KX3#Y+>ZO86;P%2YE-C!W,+\"Q3,%OJX/DB9K$=Y)*H\nM`ATZ7FM-**H.E!`#H6$^99(96T-EM`AS'^.RN#\"J749U,5(1KBQJEC\"R\"#V[\nM`/O-1!P7U048E(1\"3[Z=%<];/K<14Q<S6(OI_'BWKM]*P8:_OK]_^NG#0I_/\nM\\9/TQ);8/-A:Q3Q/@5V5#ZG[&OU\\KL>'A_-'BD*F>JR&*K,W0[0VBTER`_I<\nMCCA+SRFPJ%VE142>&M59;#8K*4NR\"GIKE9%%^MI555TG]2UZK6<K[I.O73JS\nM1N_:!U5#H$5ENMC9RX`)>-J4MJ-^1O=4AXZ?1;H\\J#PH3[U.D7.N>Y:]E)W:\nME&;`BO6@\\XT?Q/UM/O\\D[?T4[6H*-/9X0I_$I$-:7WRY\\MT7>@WUS7MZZN2+\nMD.=SR3[YOF:D6KBTB@Y;X`:&K)O$D_8']\".S@DE)P1ZN4#/K:,B!29C5)L?4\nM$QO@R@`DHVA9YHDPHQ6EAKCH*>IV[I^>^!].O)+Y^=P>H_KI^1A>:RF3&@5)\nM9FN-N2Q6KJ\\.3Q\"#%5VN=W-NCW4K4&1OK1W/IZ5,2\\:^S&:V:]R`)M%4I[D<\nM0KNZLJT],MO6HK]<AP9C:YY+9K+G&O&YG2*B37DH>95=H.-]Z`#-H`3COK:!\nMU@E&3T2\\@,.F`U0BM><%V^.0*>6\\K3%D=\".G1J[9@_E3MBEJ,7>($@Y5!9ES\nML=:S)\\CH*</'HB(I(D,G?Y&K7Q\"52)&DXK+,#*(+0I@RNNL7ON=%>*8Z\\)JC\nM*:\\J%[<%62X^I@%$0X*F,`C%%\\6$-%X@K%2&2(<\\U?4\\[64NLE^B:._JTUSF\nMJ<U%,D;I2D`1241I63I[%VV80D5=U8QQ$&W4R,B0:00UD=KU#()\"5=42JKWS\nM1+:,:1M1Y>&?E0X+,CE*0$#/T0_$6)D&IY2>.06,&N10;J@.W/8%LF8CNZMJ\nM8;=C$TBQ\"\\8\"70A%0VZQG8A5YRQFI6AHZ0R?CJ85O69_%^O'J`\\MN,$CR9S%\nM\"M1%#=R)[6\")&-$=,B@^'`8![;TS`0V(FBA$NZ`GGK/5C!.C9HR+O8\"6*B9*\nM#\"+)0,Z,=7/KS;0,AW1$OEATY&D]K[VFRN3%W8W2@F6D`E3WUU>RJ-_=W67K\nM(A!WA63=MJVRZ^EIG:FO#OM__)=_GMX>MS^=?GSZM+65V95,]\"WZYN:J'93:\nM=J%0K\":3N8NZ$6P:TK2#N85&5!L556.F].Q67(LC>=KZ%MO#VJ;F7R3,\"FB`\nM3F*+YDP8\\\\&ZB(2,&&$TR5$UFK9N(LA+^6A`2QNZ0I*I`A-)X4@D;<@*<6;)\nM9D2A%&@1%6`2PI+@;BCH_YL_%Q\\3,:#G*1+`]()($Y$.#MUW(JJ^`//E4I03\nMR-@H(BE\"4S$SR6$\\@4N2#`YG'%4N9H$K+2MB!WDD@\\DAD`$_/#^\\>WSXJLQ/\nMV9[8CD@5C#,N```@`$E$050:E]FB6!3+4$U#KV@1T==6L75/.,SIEN[J1E5J\nM(;+GT(Q/EZ*66M`P2=)$\"WQ\\W@(4:(<J?[:Z=2(B(X!)C'GQSKMZB)+\"3B4&\nMUEED9/PB(P42(T,JPKSDOD3%8\"751(>&E6!%R/AW\"#9&`YZD';&>1*^<L]JI\nMGWNRTL[.3UP?I#412Y+=\"4)=4(`).J4LC;WTC(RM<MQW38=Y2NFC9\"U(+U.,\nM[H7R/FIE;(Q*]@N62@4L,!!CIC!VP(9!FGJ1571&]J'0T>S/44]177P>Y:S,\nM8G:PZ?[AT=Y_V+Z9=;[VAX<'1\"Z[>=XMZJZ2WA*F3\\\\-*=UFF8OM2Y5>HZ)(\nMJ:*\"KG*2MM!<O8EDST/M0UX7`E>?D&P]&IJ7<\\8>M<$-H=`NV31S2S/8Y\"'2\nMP>/6)$(S3H3V1C@A\"IE#BZ9D/K*+2)H$&9)=F`!4IE85,D$4D.%#`D3D!J*B\nMBYH+!Q!E&]OS(LC4#$M,P`R=Q=WL6$\\NNC<S*XN6*4P;P%&N0($F.!1\"%Q0W\nMQO)?$MG(SEP%058$A2`-4A*FHR`O)D+VGQVL4!EM4<LQDN&E0?EBEUFB+&Z+\nMHC#[<.;HZ.-C!=I2<+7OAZ7N/,X\\QG:&=D&SQ\"#Y9.N]'\\_'-;:]J$QS3DL7\nMR\\S95,`-;0L$7L3#4!,1X2WG0\"BA_4(C%AC4GE6*Z*0F)%+G[$K+N%\"N$G09\nM0MO1-N`S),@.BFBH;+T/S]RLBO$C20SD]C`L3QCR&1W'`1\"-*8K\"A'G5N$=\\\nMRN,[UFM=KFRJZW%#'HEG\\B3<))4Z]:C,213`1!9R`1\"9/698Z]V3,W2A%G%H\nM24B%J4BT49_@&7$?:T4^:AUVQ;@`[TR!,24\"@$@%'8-V99-:T5)*@4B^E)A[\nM1-_6KFC(S&@2O3:E3+MR-2U^=5A;?7I\\1*'/7I[;:7U^>FZ;*C)S7LK-U>'K\nMUZ^UYW*_OO_]#S^\\^XGKD<XR^<$\\V)].]3[6!.'+OLR+N_05)NQAHB:I8FF%\nMA??:B]I>)JC,9-$,S9\"^-TMHJ]$8/3H$MIB[/VZ;0#J2H_)L8J`@:HZZI5ZP\nM.W(AD%=0R$F'/M;&M)/*JS-<U=4)3,#0LS3A%LD$$C/014P@,F0R76BJMHA-\nMT$+QH:K\\NV3/MA$ZD[$OLY1A.)7(;$0*>V:J_@Q2'!C9D3/W431[^9X-\\VN2\nM?EDNOEA07F:V$JF\\X&I$18!4@KD]GW_XX2^W(E-&7:;S[-OQ.5OM#=*X2H<*\nM#.A(R;6MSVP'GW._]/UR*H[>P%!%3V[\"9G#1&G\"R\"YO2(@.9H.)B_Q:(23IT\nM%MF!\"]0!AY6$`$^H8T-J(N`@7!&9;;Z,B\"'LBE483$58RFCWCM_G>%J)R\"W=\nMH)XZ(GXAK,I4U-0F/81GQ!&9R(E]YG2GV`1'YTEQSFP)B?38&G5148%#5.'`\nMY%HF1=]:BVQ=@.SLB,B,B#J9`AW#IRYG]@>T#7G*@2_&L&ZYT'GAV<J%-)T3\nML%/;Z[2HN_K`!4%@9F*60.M-IDG&<X>#E2=.N.BK-U_ZEU_;J]MZF/W[[[\\_\nM;6MEA^EY/7[Z].GQ\\?'\\?'RPXF9?ID_7AU???GF^.^\"MC!M0$+6,2EPWUGVT\nM3+M6`M2`2G>X.V0JF/RT'0]24K!CZ1%/#$5S@:JVGNM%U\"LP<W-3>[`&$;G0\nM*X<G-\"7!.LY,*0/#=H&!0#M<9(*J2@AKQE!L!G.\"[2\"66J,/>\\GFD$PD%)C<\nM%9#(EJU#;N%C]#^!DW!*%(K#1%A,(5J01;1F=)\"7)@<#TI@M!P/`%#*_`!&%\nM<(IP\"&AAHL*+<FGXW*\"\"%#$?6V-<L(<$$&\"-\"'6:@#(BX$H&LWUX_\"^?_O>W\nM__6_OGYU?3P^OCT]]W9VU=9/WG+-+G.!\"A9;]KMYGD-BRR#1K(1ZLK7@(I!)\nM\"8J)0L&!T&'V_@%U\\`S4;:!/$A3(OLL&2W7\"%FHARU\"C98RPP45Q/61T@WFG\nMRF0`2JAJ)`,#^Z10L81!'5K4A+B!*F7D-KN@\"1R(Y)-C;7F*K3DX68>L/;.>\nMQ`I5,=!#[\"*]@C5A!&6`*3)5LA2=E8L>SZ>>T1\"`&D*17;))GG,5(@5)(J,\"\nM*\\93&A>0*E3D4@U5P!,7NIS(+++WLI.R@S&R@T(IHF9N9BTC39AIHF[NXD;3\nM1(!;;^=M?;-;;E^_>O3TW__N=\\=M[<9RV)5B8K;;[5R4M9.\\NKG^I^^^^*KA\nMS__''_[?/_S;=CZVADUX0F31R-\"V7>D$E-<&JA2#A7CFN$MTS6OXI+;`6^^=\nM<16U)/:JIYX=,HOLS)NA@[UG;.U.A*(5K..F0=%`YN6TY(-]/'ZO*:*\\H0O$\nMQ:FZ9G_*;6.&*)1%;:]E3JWC<\"C>54-*[SW`8;WJV9,\"X%:F\"7H%W:<N(IYP\nMB@_]8,J(Z0IEN).#N8&-D2E-)$;]7TT2.]@(;2/YWUXLB]I%1?A\"D1D'TQ0?\nMWK]D)OER`T77UA5-T9,]<QQK$9S@]?'AQX>']^^L*VNK,!HS!-Y;[\\U,Q;WL\nME]LWK]^\\>3/#4'M?FW1U3&\"=F4M*<XMLF5H@4Z>1)AJ4JN-@=@$\"A(QW-A9H\nM06I&(#>P0S<=C,91S?_[3D8@\"KU.[]0-O2<:Z=\"*R.0+WE=4U(E)S*@@GQ$N\nM:@(*&G)C;!D=?%?X+'5-\"'22HA!AW3H^HRU>=L!,W:$4TR-[1?8N`!#1V,^B\nM)XM59:<HI?7L6$3#H)$J#=$\\VE:3H\"IU8'_-U`=68WP33>`#8@&.P,VH^1LQ\nMF15H@6JR]R#$U=64*ITY.%$:=-')W`??6'4(_[9M6^M66SO5S4LIK.M6:YA0\nM9Q^RU,S]O\"?BZ?C\\]O3A_.%]D&5V646$E7V-5LDU(=VVLJ?/C0WJ9NH0'6#\"\nMWA[1OO9]H4RB26D=)8V@\"U2L(0WA0$!J1NVM9Y_=4RP@9T1GHH.0S.'9Y*3B\nM(DYQB(E:RA?I`H%80)\\B>T<B]<41NUC9$Z4[D&X6Q3-Z#>D1`\\8;Q515W>:G\nMMA/;B^W%9^CTXH(&8S0&#>P8E8L`N\"D;0J\")P9F_O%1V]`NNXL(3'0#J%_%@\nMYL^(T3'R:7GY_@5SO'-&%G&<Z5/0AK?WY5S4GTX&,\\_3:86%[/<Z63RO<%`2\nMT<A97*;][N;N]M6K5SMUK5L>FZRQT\"5]A[Z0VM$BNW*2,E.F0>Y%SH+(`*%U\nM)$[41%54W8T0II#):(@Q>II*&7NP`=89=K$B,H<V2`$V1J%T18$T]J+F:BYF\nM',1%T23`=UI5U523K(R5?454Y\"=(6J;\"S$J*!M&HP`DH04OL@`!\"L)F<0:5&\nMHC(W]C.P`IOG;(WK4Z_4\"D4!M`LJ>F7<P1H24J\",E@5Y[;,FI@N=.!70GT\\C\nMHVP-6,(AEG`5B1Q'U[%\"4]4$6VN=*:KS2\\(C,RF$\"4U#8:6TUGKOMBO^OC[J\nMK*]?O5Z69=NVAX>'UEHII9UJ%SZ8W%:YD9M_N[MI,E-W=;=*%.V2+F=WZ?9!\nMA&L-XF[+P]I[M/.,\\V*GB'JL/PE<K9B)\"R#>]3;T('(%AN@*/;(_]_Z(%NQ#\nM6F3)2;`,S@+8DH0]:TXA<\\A>;))A]6'//#FRZ,GS<ZQ/4IN2E.Q!$Q&Y@NZ`\nMG:@Q*J,'C^A=6D<-8M+I4.99U(%?HCCEX/,BSM8KLXITQ@E#)X4<M'LIAB*9\nM4JK#@ID9$\\087NFBDVC-V#3%`:;TMA`3I/7(Q#Q=]4:;=ON[VW#NKO;2MX^?\nM[H_GTUK3I<QB69M34UN'4-QTGYH.$CVRP1`,^`0JE.P26?4PIQW@CGCD?+A9\nM=O_QF^_^\\W?_])O=[5//GS[\\].GM[\\ZGOT7].&<-L]4!EOWU;:H5RKX)SGUC\nMOUYN'G(EHD5OE^/^1=9]Z%',BA:E,%P@&JK4$B]VR,L[\\**'6?-L`M4$>V4/\nM0MT.[D(<V_H<<67+C4U,/\"#/FHSMZ'@2-J0'2DH3;.1IY61R9_.K/L\\=)\\9/\nMB(^:77`?/=C3YQNQ+SJ^\"BKT)V?M#8)4G!,/AN?\"9&U>4@((S58$9D81P-LY\nM5;0D/3@Z,2VSJ&W]7*`3;%#>YB%94$U2D06VA^_@'B9>?';O,4C31W9<%*_:\nM(W:3S,#>I[V4)92AH2Z[72^,238+72:_/5RMZWIZ?&KG=;?;??WFB]&4KY^?\nMDKTS>BF'KUY__8_?W7WSY>?'AU=/D:6H[3YIW&<<V_913#%?PS?1`DE%OQQ+\nMK&BY),HSA_!93-V*FER;]4R+EA?;%'<7OI\"2EQJUC#QCF53U+G(XV67LIA(!\nM&&7KK2-.F5NVSIXOH`B2K;4J!A83G:A\"F>&[CB[6RMQ!29F[3V*3FJ(I1'BY\nMJ24)`2F+E?%LJT!E),=@-ADI`_2DPF)CX6$0,\\^4+@@;<+^4@*@L5M;6G^N)\nM-N-ZGK[[ZN;K5^>VW7WUQ=7#$SX]/_[X]OG]AZRMBJ2P^@4`EQF1G1`92^\";\nM&S`PC00E!S=HFJ9YGLVLWNWN;J_?7%U]_XMOOKB]G@78XM/#:?WTL-X_H;41\nMJ`IFFS$MOK^Y7LJ^G'K[?.3QU+9.=/(\"1P7!2]J#)Z1&B!LPD.`^N4WF/.<+\nM!.9R=GAY_W.,5D>UWP%-L4\"A2\"#A>\\HB:&2P;M$_@6OG*@1E2CV!&[$J;I+>\nMJ9DB(>($1]S=BJND4\"X'>U-G4<@MDJ8C]GEME&F&E7.K3\\$,*B&)(E`0`JH4\nM9*'.@E%P<XB\"BMSY?$E-C0$2.-39D]HLML`*]>(2-Q.1K541@?DT]BP](H*9\nMVQ84:+H1CD(SFJ2JF9V>GC^]TW:>?3:W>3DGU].YG==YGDLI(O+%FS?-T#5+\nMP,^\\_?4OOOSUKW[XRU]>_?0<G0UR+(#CK/E).\\UOSS)L.!\"IRA1UA9B?LB80\nMO-15*>-;REE]]\"BLRT*]8>;`RFQ865?T%=E!2Q1HH2U8.F-E;R]+,R$<]HQ6\nM&35R8^]#[HKQV4?M;8.ERJ1ET`B0LF\\NIC0-9D9*1Q$M9D<),MFC*\\:466!0\nMF4@1-$$@:_3-V)G-TGN(JEPXVV))(XP4?Y$-CNRHC`DLLC:%=#`F[9:'G;[Y\nMU9>G]?E_^_3#U[[\\IW_][E^^_^[^=W_ZVP]_?GA^L,G7A_O,-$HQ&:L%$5-9\nM\\K`L5_NOOOKJYO9ZMYNGR2%I9H=\"5<W>KG>[:_,OI]T^XOSA?7TXG?[ZM_7#\nMI[9NJBZEY#0WY/9JIZ_O=K_X]FY_XY]/YQ\\^Q-N/\\7PL,0:Y#)*\"``4,9`5H\nM#/0NR,S\"V$4NC%F'/G5L3'68?`::&:`21=0NI@H1RC6\\0A1RC;*CKN@%XH*W\nM4FJV!BJDB@79(\"'R&HTB.S$W<[@+!BY5126!8&2&(`4T-?.[+8?S>\"!ABN^\"\nM\\MA\"6=$YJDP7:J)*DF(R07:0F5HH.<C)&3MS$99BNS)-5+8ND9I8H(N7!68]\nM-6$N8WS5%8SH&1%A$$TJ9)YF]\"T#';V+-BE0-$6]P,!2$S/5M_.Z+,OA]9O6\nMVOE\\;JVUK0)@V=4(+M8D:VSES=67_^'[J]_]^_*WTZEWMH\"$%,G9CV1*N\\T,\nM*ZE>1`8C6BBJQM#Q3%31X:8YM[Y%GUJZ^V0VV;R3H;*$0HO@9.588E5NC-Z:\nM=3JX!\\Y``U=D$\\!4!TI02TCV88@;LX'$S\\./0;16X<Y+9K8:UW!)56A`(RZS\nM64^$E^QAN#C.(()B9&8-20E#,)MPD^R&#O%0#BZ7B`U8/:D`>Y()R<B>2'MQ\nM1QJE3-,$?<@X/3TLCP__D/G+;[Y].+[]TX]_?O_T\\#]\\]]N[?_G6#^GOYS+Y\nMK\\_?/A9YZ_QK7W\\\\/GX\\/F>M%+FYVWWW#[_Z[6]_\\\\U77]Y<'>;)>^]M.R^S\nM9_:(L`@YK[MS],?'X[M/[_[PX_N?WM=:_?K*Y@7[I4UE19P/.K^ZT:_>E,.-\nMV\"3'M9S7Z%UK'=/:,5H(9@<<4E2K8AMY($\"B]RZ=&64AZ,\"%RJ@BB<&)ZIEE\nM?.(O<C_QE!N=H+E0[Z3<BJOE@TZ/TF_-WY^?W_%<?:(Y@QY2:#>0CD'-8EC$\nMV`^I9``1+5@%(VX!J*CN!<6TJ,5X879N/:X[D\"8T#RKA`Y`P&`@E/;%0)XH!\nM\"8P!^\")%!F;>YB(:(;TW!0IDIDZBR!0P,WOOO?<FP0'9C%S@`(J5W333K;8F\nM:AD2@A2I8$&:EF5WA:M;7NW\\^>'Q^>'1W9=EF:9I*=-XD#^?3Y^/3W:8=\"J(\nM_LT7M[_^3__ZEQ]^O/]P/'WXW$XVN2[*(_K:VH;V-RD;LTKNS<W%!$MG21&1\nM'`=<,B&;Y,98L_>(DF4IDZN5Q\"A*#Q\\`145T+MHD&E0EB^@60XLK7:4::!@6\nMSXW8,NN08H-(4842V4+<134[166:)O2&K14SDHCN@(^%')CLDTQ4F4MQM6#6\nMT:P?D&%F\\%++N!S.0!D;RY&Z@KJ*)XR(8(HT0).71APOSK\">4>:YGYZWK7_^\nMX6]_4/OUK[_[G[[Y]7_YZ_WYZ?FOYX>VOSXM%O-TO>R_OWK=]^67._M:ZNWI\nM\\T_'X[EU@?WB>OG5UZ]^>9AW?2U/;3$#XWP^R[Q;:Q65MM7V]'QZ/->/#X_O\nMWJ]KTVF^^^875Z]?37>W=><?VWK__/3P]$FVT^W]?5E;?GYHQP>T8[*.6`)D\nML\"&%D$D,*A*<`%.X\"F%FLD.9H&MV)\"M0H!0KHBI0ZBSB,NI/,*)@A)-E!W'8\nME>C7H;\\0N_69NFN>_YU/?ZCXMY\"_6IXFU8XKZG78#VA@;.R9E*XGQ>K1I`4,\nM9`\"-T09K)LD4-U?7XC[1LT?K73)W5K3'^,^P\"QI/DB`O@[62\\*1\"\")EA\"1[2\nMDJ&M(S:8>4^'FN@(WZL(5)E,H&=LV<ZH,]R'8+)X\"1A$B%E<376D-D2#;,Q&\nM=)-2K-:Z/C:_NKW9MJVU=MK6&EU?_MP<#N+FN\\)BCX^/9^/\\U:MO_^-OW_W[\nM[Y[.CQ[3:[6(K68@I3/?:=W`QCP@%OA^I$0@JC9.)QV9*=U`&SDS=L$YNT67\nM<?B^&%ZY1J_$N/I)\"P%4A$6%<)$B&CI<(AG@8UTWQBI,%XP^PM!HD20#W*17\nM\\2Y1S-0<L[/'F+#IA4K,8+)UD#`7DR1ZQAKMU+:]3>H2`F8Z2=*\"EGDFQW[,\nM:1`S,1$58)9+54V$(>D\"AQBS9;;>NM8ADSA_>OC_/GQ\\^V^__\\?OOO^G7O>_\nM^NJK_9ME63[;\\</IX_GSXU]DV]T>>+?WTI>6-V*OEOWBNW^^VM_E8N\\>6]O6\nM5MM4;F^O[\\S?OU^W5@^O;F>;=+[K<UEGMJ49Z[Q<S[O=W==?[+Y\\=9SLZ?/;\nMTWIO3#VNZ_;N8Z(]W-?[1WO>2NO7:7RY#PY#(E14Q)&6JBD%3(B)F$#)52Y<\nM\"0&-M(&=5]DQ4K0C@PE@##E,E9&B\"H:!5Y1?YG1M+D#D_&=<_X+Y[^Q_B3@'\nME\\@]Y\"<O-4;)B\"I,'7#2EQ[B^$LP_,=$]B+A2$.!*L#H\"IC:!-?Q2H>,S2W!\nM`$N3?+G\"V!BYBYJ(A0!J$(>6$(&-N&^Q\"[1^2\"BZH4=6,$5E*NP9D>/NX&JS\nMN;>\\Z-Q217$A(@H.;U[???D57\\\\NX>=MG:9I?W70BT4(8_%?&5?[PSQY,YQ+\nM>3H>UU8/7[^Y^_4OWO_QK]9X4&73+BXB3ZQO2]9L/?J-V)7,J2BIDQA,C18C\nM@7$9]RIL`#81I,0PR\\)EP'-9LS/H.DJ<;73E4R>%S!SIQ62R,COC''W#(*<+\nMQ(9N3XD)8(^F-:2LV9\\K%U6?;3`+W6Q0)70(UB%*\"4:TGIDU8Y-LC`Z>C:8<\nM?_,D-HUM._.#CA=CMN#+6I<3Y`#O&*K)[\")N8@E)HI0:43-2-`%,7F\"/Y^.G\nM__O_M'*PK7M.;W[]_=7RU5$^?WA\\IWY^5=*Q/=;GST^?'FOL[6KQP^EPO=FG\nMS\"Z&WBL4WWSSS>NO7C^\\>WK__'!X\\[0[7!_FQ3;)/L.N^G8O,CMGZ:H-\\X29\nMX:U>4:ZW\\..G.*UM/9[/SR7\"U#MGA7*@A\"\\Z@H'/4<%($5D`G=G87VI1&`&#\nM'$$@58$<0D*EBP0NH*21XR6R253A.6(#0%L(2T7';^5P$+UMY[D?_XC^;%PE\nM40J$&>.?+ZITP)ACYC.,'Z$PHH-D7M(1+9BQB,\\^9^OH\"%6,YI'*R$]'9I('\nME`Z,<%F0!IWABSC1BQ57&T#^4?[.Z&9&LD67`1S(:(RJ+,L\\S;M<:SN?(V+(\nM#$QT@:BHFBM$T@-#N>:?GA]Y>NXL-KG7WL6LKVNM%4`IA>2V;0J\\WE]7T_GZ\nM\\.KV[EDE\\WC[U9OO?O4//\\W_3S]_/,`:>78]63[7OBZJ+92)<)A.Z=?\"&/,R\nMTZ*E@RD#7A`]PXIW$@G8!1_=2(!5$82+E5+&J\"U(N/7:`!014=\"D$RNY#1,Q\nM\"8.XB=A+NIUS*6PM$NFE9CSWFEZN#U=QZF60:`\"2G303J.RN#G5=>^^U]XZ`\nM:9DGPH^]#AV\"`I-:$1V)D,>]]MY;:V.MEA?\"KXS'K5\\>MV(YQ@`XMDVG$5,M\nMZ_G4)>YNKI\\^?C0US?[\\P]^V3\\_UT^JO7G6UZ8LO6_TLAV5>ICVW6RN'>?_E\nM_.;-=+<>+[^FVZN;+>O#\\3G;9'GU^N#O/WS^_-.GC_IPO;]>9)K4(CS/F&>?\nM6*Q\":M_M[?6R_^;Z^N'M)U^AGT\\\\G82;9U-@6DQ/\"E-3E1$<R?%@AZF+J$-@\nMFH1(;LE@1H0/@2F0P$6@(9<7CJLT9L^X>*<&QT.E&L[HQY\"S]@8Q*KE;=/Z5\nMEZV7MYD_X/@XYVG2WK(R&E)&$5\\$!#+A-MZ$%V33.)&\"TE,UV3):VF*[,K6.\nM;=LX00.N&*,=&8&TY(%S<UD=G3UJ2T(I3G6;W!W)UBK!Q::B1M$NTJ,S<NB=\nMAOVS@P:WXD9D#;=B8DS66E_YWC@TR:!:&Z-<R.-V]M,1_4H7M__E?_V?][O=\nMS?6UF[5:09IJ1AS7I\\/=U>/I^?V[M[/H-W>O#[M]N#[C^(&G3_6I9_-:I\\A`\nM?<[GY\\4PZ5.V3_7<DB`R,Y7[GM*SM)Q:+HV[R&NQ:W7MS-ZW5L_L&Z(IM9C/\nM4YPV@T\"D1:S11W:9@CI-3]$^Y/9!^EMM/VE]*^W>N$U\"$P1U3:]]&89)Q:/%\nM*2\"0O9<K+84`&,RB:B9.:&0!=NX.L1X]1JX*8N[3[%8D:#4I],[269)3H#\"G\nMR,(\\U'C5^4;L%>4*F)&&5,GG(F?V!!VVDS+1K8O0*$42'KGTN\"'VM4W/YS=:\nMEB@[3+>8KK;,=Q_KN[?[OKTV[F^FQWH^FDV[F]*MB+S^QZ^^_1]_PR]N8L'C\nM]E2USJ\\..B-/Q^F\\W49,=2MULW:>I'W[R]N;N^GY]+[OVE;6PQ>[+[Y]M0CS\nMPSU^_%!^^&P_ON?C\\7D[GYBP:6^'*SUX]3V\\4/8I2\\H$['8+BSZUDZH&`L6\"\nMV'H52%%'CQOU16UQ-Y5$;NPGMA/:O-.UL!K#,)M<F=U0;P0[\\G7BV^Z_Y/P-\nM]C?87=F5Z4&H4&F((]<CS\\\\X/7$]X_Q76^Z5GS2.#\".OX'>!UUU*$TMTQ6G\"\nMZB+J5SK=ZFX2(FFBKB[)7ALC#;KU[(&-W\"!--,U3+,4D!2D3[2K+C<Q[G5T<\nM:D]<5\\1)<G4\\&Q^DWUL\\>D;4+>O&FM*AZ9H%.2%EMGHZZKKM(3,@2LZ6BSYA\nM>T8_]Z@U=\"!4\"N?7AU_]][_YYE__X53J\\WKO\\SQ__OSY_?OWA\\/AYN9FGN=A\nMS+Z[OME-\\^M?WC'R\\?[^]S_^^?IP->V7W_[VM]O[^]W[X_'XASR&1.X5AYRO\nM5TD7=CD1GR0VK&]SFT._*X>%>G\"YHBU)#T5+D)C$J0O<1^@I82$JF,W'!B*8\nM/6*``REXE#RB'M%6\\I3YG/T\\;.@<?'F%I`&:J::INC'&S7.+OHF.]F`PMU[5\nM)Q4;VY\\<\"4/1B.S,GL&\\6`>&N<Y%(13P8JR_U!QDA#I%1'U$G2^IK1'!'M'M\nM&(D0$8,5(_N`O=/X`A:'['0JH@EL&1MCJRU/7;B^XJM-E6X-^AR^`:7K?(I_\nM^/XW^/97'W_\\R]_^]K>WCY^]Y:'AM#X^M6WK35PL(^(Y[H\\W;^:O]E=_O7]N\nM3\\_W#RO>/6CP?#P]/3S<?_H\\_SU<3D2F)B'4<1>\"CHJ[6(`I4#%-BHB--SY$\nM.7Z\"5M0N(+67>R1!$FO=7:(_`G)P+K13]JPFXF(&3Y0NO@XXO<F9[7UN/Z#_\nM:/J>?H]XJ'&<VEFS\"=4D1=,NWC;M,(29#(AA0Z[DS-@5CV#KH:1#C4H@DT:,\nM<H/D0/-GDA'Q!*JH,R]WBI??;R(8_44^*2:BD2(\\E\"F@@1@$[DHB@^\"\\]4*9\nMU'?3LHA?Z/V]#]Q\"=$87Z](G3[A-%K6=M_6TLS:IJ^JR+\"1WN]U09T>$B)R/\nMVV?>;U=MM]N=(AY.ITUDQ_SN[O;K;[_Y>/OJ)'^<;-I-MM'NV_8+SC7X28US\nM66<]\"L>7^2^Q74EY8_-7LKQ)NU*=FBAC&T4UD0E\"H#%;1@1,C8(.5O),;)$5\nMD>0GDU5>$$_,!I)0PAH60U&#:F9(@@)3'0+C!IXCGK7-.AD@$:=!J?=I>$5$\nM*!`J7FZ(C&$0&D$!54JD)`C[N5LXNC\\J+\\>A<0\"[9):&X6?(GL@$U,Q\\2-@E\nM8P1$17WH<BE3,2.0;!(KVSG8MA9<8YL>\"]:4OO1C7=>ZY9_^I!_?_?*;/__S\nMKW_S]???[&_+PX]_.7VZCW/MQQ[W]U3L=CO)V+;3AU/;;M^OZUKO'W@ZK[5_\nM5E>14]U.V[IEF^?%1)R2&-V^I\"I4!\\A8(>.CVB+\"THJ7\"H6.+Z&,>@=4Q;+'\nMY9PY,NN7GQ/.X8-9JI`0!26@#IG1`U[5S[`G&!0K8PZLUC[T]<^Q_E';CR7_\nMBOE]DX>N*Z*\":5*H0V$=F:$#>2EJ,D(,3;@ASX(KLQ&MUQY%/(4*`4=K4\"Z)\nM[&1*9&8@-H1`=-PR^++E(F8C,Q4L4(,5J(WUOAO'.8]*7))]0$X-#A132Z7*\nMJ)Y*\\C!-=3391PI?,.^6_=W-]5X56X8``\"``241!5.$J!$?TDXI__OQY;.?O\nM[^])+LLB(JVUN^N;W=7AO*T/ST^'F^OY^E!;.VU;S;);#M<W-_?+06TKM.N(\nM+VQ'S\"=$BM*+*XX:FV5DOLOZP'A\"/FG_A.E:=%>T4,*\"#\".<0F!%-)+(,OP;\nMPHH\\(\\^259CDV_;<%579@0&^5&(&=M!)W,4HF2*I\"*!=^KT2BA/CK+XY2DIT\nM\"G3-C-Y\\\\+SETGDOZ!\"D761I+]L']0LJ<]0WY25#\"+F([0>DB(2(FXH4#*TG\nM<W1.QM-7I(`AB)$#=QW?7N%@L,AP\"N]$3=\"I\"#G&\\:'SLZR-.]_O<;6<69^W\nMSW_Z_=O_ZZ]_?'-[M[_:+67Z\\NO;JQO=/=:HV_/CT[H]*FC;=GH^K6\\_U%K9\nM^J)>*\"4[!2U:`>9EE]&5G,TR0'#,[5(N#;&?4T<C[*ZJT\\7TIIE0J$*4$-'*\nMAM'C__O[4T2D1^#%^00,.Z*HC\"(/SQ)/P`?$%)BA*HQ>?\\KUW[']4?%![%EM\nMX]32E*L12CW`][`Y$,$((KIHFH[P'BGH@M5P9$X8=+<Q'+B,S\"<M)(?&3\"@=\nM8[;S]__3(=LC+EG?O;B8:%Q4&0.S(,1S6T7&;(U.7<S<3(DK3LPT2O;HE^V5\nMN%EQS42#HJ:,&M>NS->',D_/C!6L8FYFTS2Y^WZ_'V_\"SY\\_?_SX<?GVER,L\nM7M>U++RZOA'3IZ>G]OBX['=OOOKZ_,47V_NM/Q[GGJ]M><R,UO<(!)?`3G@(\nMW9INRYR9:_:?HG_D.JDLXFYZ;<8,3;H(R8;L@APFHI''99RT;Q*-2<4I@D`?\nM6K.$*P[JL]@.:CJ8?!*F71'9>X]1<0M@HYR-F\\D\"%4DI7GM?HPMD\\N+4X1N<\nM,L9\\F*/)3@I358LYA^AS0']?0!>CJNNJ2(SJY_A=CE<<[$*\\'@$NR1BI+E>#\nM@J90B=9[]#7KF.(X98)>425-NW[VFNR](CJ_V%V]^>I+V=NF4>?KT^-3M%K*\nMM-_-OSR\\^MX.=QN.]!__^(?'3_<SM%\"VK8O%),C(G>DLJAAX`310(\"VI(D54\nM3$=2(@&0C8DA01D'LTSI5-?9W,R8TIF7Y6=0(=#R<U3MTH4D$^E697B*\"0H;\nMT%5$6-,-(KQP/X4QO@8+\\CWJG]'^DGP(;SD9U4RF3@'5Y$;T!KJC])0\"7[%A\nML-^$%9*9#:GH#^05='8S4CN!(*!NZ29!#4H2@!,0%<A$\"E4X\"-D,7/2J<T!$\nM32]PO<:DJIJ>6Y_$BM\"I!;J3:2^F*H=R=2&.BXS<PF0^>6'=*EA#,M`AV5(R\nMFE.NEG!5%S/UZ^OK\\28<!]'6VO7U]1=??'%Z/CX]/24HY*=W'^IIO;Z]J<^G\nMXWFKQ_-Y73.Q>-&RDT2V]::XLT^TJ\\2IQ5FTHFPB]X%&GH(KZU$@$#=WM4=Q\nM:B@X'EG!46%7'Z?3S)JQ9J^\\G-874Q$Q,$DG]C9=>9G$M`]>(9.$2`<[LW,P\nM>BW`3?(H/\"$.JI.Z66EQ(8L&TX,CD@IT@^EP(E->>CG\\^18T4AGZ<R47,+,A\nM'!]#PI:1/::_[Y'TY6*9+6GC;BD7!,\"+@#M7-(.6T;F#2F9I-,C=MI;)ET#M\nM3[?A=VOX?HY)?CI^>%/F_;)L3^>M/\\KRG---=-W.IUZ;]0'<T\\KH%'57MXYL\nMK2EI[@/?&^LFFB[FN'!T&C.$P5P!FB)%,TQU%H_L/:BF9A87;MC/O!QY`;=>\nMWBH_;[E4*P`;K@B`DJE\"P99]N%8;41$-T9`)W*(<)3YJ/B+./1*UB\"M=,@7I\nMJ;-A#UF@H652M-Z.Z$)J0L'6D8P-K-:@TUZ4:D\"_`'Z39^M.3L%99/!_16\"J\nM4[^\\Z!(,N7R*J(+>QE,7P%B]]$N)28M[@7KO2K7+WRTMHS%2>4ER1;Z,;'N`\nME2J\"H(-,R2SZ7-`-$P6-?CJ=#H>#F6W;=CP>S^=S*>7V]M9\\JK6JZF[:.VVB\nM[5ELNJK'8S!;:[76I<?5M)1Q'ICT*?*(?C9^SJ`FC$&4%D060:I5&52D1/(Y\nMLS,IHY-&1AKAH0ZG()(U1C\\7`HA@&N>D!((&+)G>NR!&1TN`!#JS9R:1`E4=\nM((Q@>K83K(F;.<8333P$G;Q,V,5RN%M>3&?&R^=)AU9:QT1:B!'^H:O)2,H.\nM(_?/G\\M(_'PF$Y'+\"S%)IDIB1#](R.@N#5THA1VY,9UB#!=UMBG])F0]=7O\\\nM=/KQXTEZM3PLKS3SN;;GMK8\"WMR$37:J)_7Z?/(,]7%DX\\;LO7OR'\"T8\"BFD\nMJ`A-7]YFR@L96R$#57S6'-X*!Q<K14VCKKVEC8G\\Y2:OXWEOII&\\K.LNM^CQ\nM)>R#P9,*H1)-T,<!)S>H-)$5/%F<,BNRBSQ\"AC6@@/L1`68*:Y=R.:^3,3CA\nMIE+T.LPRA_#2%&=D'4'S8(FZBO8Q.*,0V:-]\"LR4/41I0_XQ[L,.'0`Q>:E$\nM!BC$BG3`!&4H[A(*D<X%99+)5'L($14(#21U[9TI(NX^0Q&(3\"IM4<'@S)L&\nMW#WGR??3ASB7.$PY3PEW]\\P<J=&KJZLW;]ZLZ[JN:YEWNZM#MJZ`B=;GTV/+\nM:9I>O7G]RA?[U?UZ\\_MS>Y?_?U7OMB1)DER)G:-JYAZ1E\\JJZI[J&0S`6<@N\nM=K$$A4+A__\\(A\"(DA,129C\"8[NFJS(AP-U,]^Z`>V8U^J(>LE*[,<+>+GNO0\nMP[K*F^>UL7F]D,Q=XY6Z6&0::=U-9,M43-N\"@=?%9XFVZX2I9);JZ<E#X&>%\nM7KC3[$1TFA/,<*'!+9&:$VRMU4J>,7?F,,E@%;\"5&<\"6VC3\".]RT3SJM-1!C\nMC$!Z)=C-Z=4<3W.S.P1S!*;S*-/E?6Z7NT,HJ?R(B/N&PBC\"$#33/6(Z:]Y0\nM);5&(@U>EQ]#!J%V\"+XI.&G@<Y[8UDC8C`4-D@O,Z.-UA3]`\"_R*C,O;&ZX^\nMYFB/I)KYF&-@#L.F>-NV$[O9D2`3D`'-FJ=2`P>(!+Z7=A,;<J4,<JBWYMWR\nMFHFH_:)@3J=5APW=.GM$',+=BI67!`6\\I!EV5\"-7738<6X*`R53.B!T(X$>%\nM4R:MQC.DVB(3FWL$:AD/:%>*G(83,!(K&`#8U,3(2+QQWS.'1@!NW<TC(S6_\nMA4:R9PO=&TLE)$J6(!ZRQ`F596TV1M5\"DYWM9.8A(L]HJQIH5\\:NV$RDIN5Y\nM,)0R0G;H<FB]HH24B8IWAAGH;KV=OWP^?_<Y%H_+K7U\\?-[W?1N1V\\@VUO/C\nM^>G#U3NZ-S',++6NRX6ZYCZ,%_B#^6R]OSS_<=&8M\\=]GM?3Z:+N9N:>\\3S@\nMUI^[?;6X*FZW6V_]M'[8<EYSSH;A&=@EY)Z\\C7+$+JW5\\97*Q=U;8V1%\"<2<\nM]/2((Q^M>1H'-=DVYYYYFV/3W*AI0&O>VIX;*W*(&(F?([_&_FQ\\/#]:!F,?\nM&3UG^5:8-W\"92@-ZY3[6KD;[:U[<#R\"^F;?6/)4#`VEF2%3Q^LI6.,W`:-:Z\nM>Y:J/M/-EM9G:BJ9:;`Y%3&#Z.8KEZ5UDG-.S;#*0P0\\S?9X`B93VF`\\)1JP\nMT_9C,7!.YLCA,&OG[5J`<;.V8IDY'Y,_V#J4:U]GSNO8X4I30-;YL'65O`AE\nM6F>O80DXJ0V-\"]*HGJ@HH:6O.8,S'\\T-;\"DJF/G-`4/:04T<,-6AFT&@+@N<\nMX(B8D6BG2,\",S+G=A%Q;'QFK.(EK)HVGAP=%CFTS\\,DP310<PQ.KX--EN#$'\nMYAOR:^\":0_1.[XJNY0WS_^+XESZ_>/Q>_KO9GB?_S[V]85Z0/_?Y*JUA3_)'\nMM:%9;3R]N=/G<3W!>7HS;\\T[*I/\"TN'@-N<8&R<D&91[O;W\\\"[Z>_'2VQY[+\nMJO7$=K)&PW;Y^G6U']?VR9YNUT5<^\\N7VZ<?QKZ\\7?A\\]9_0F[L_/S^_O+S,\nM.6^WV[=OW^:<F:EF:U].WI>EEU3\\;;]UQ>WK]M-?7G_Z'__ZY[_\\^S['&=CG\nM&&/T=>G9U^9/<@\"=0<NJ@G-;EK:XMXA`BF[-V^=D(C-F*\"`YK-$:VSY'9OF/\nMQ:E&-H=@L^X&9HNYF55+BY\"(F'-D)*'N!L.8L>\\3)_Y*8WA7-!'SMA6XXX*C\nMF:MD93<_=L@:4G-6E`Q.L+)$4J`ES8^\"._XZO`)9(@Q@&,-$2TEAA\\`4EFM:\nMHQWT(F0&KP,S4>DLS!H\\63>ZLFG/PQ8$`^G%$$2%6B708$D)4,32%@,:S(^>\nMKT9\"QFT;4,RB^^HO(S*1922H3^A7A_PM,RRG:\\Q4[!X<FM8,MZW:E,JNICL'\nM<[:UYL320T>E-T'*.\\-F9K2A[.3(>`,&YLR<A7&QA\"^EQH<#,+L+_BN#0!1;\nMJ2#!EH>>\\1NY`3?@!EP`F(:4T((@<A)(77/_BOYHB_7U%.R)CE\":E%)Y/CF/\nMKBT5$=KNC<7C[CL(52`B2A4TF]W-\"\"`-*.]6KFX.N\"I5MT+G)F\"[9SJ!'-JV\nMB)1.JW_X\\/\"G[=N?_^5/SVKV_8?V+__?_TOR?#Z_O+ST=5F-/=/=O[V]GL_G\nM<UO&ON\\Q*[Y[SEG?[#]\\R=]^V?^?/\\X?7Y'A@C(2</!DS?MIB<$8BFG69]*J\nM/X3H):T&/LE!5V\\Z!*]T<X/]/&\\$FM$3Q]TLF9D&<UJGMQJ&43,\"&6FA(Q*S\nM<H*ES/^0&EK++Z\"I1&2]S4/9:-W<#8J)(WB\"$JV(HS)#93*5D`.*&AMAP!Y1\nMR(1P9*LE03$;@T>09=3Y0\"GGHDZ@[O:$[*[PJB&SNDKX3DY*9BS?2\"(((T&C\nM#NLP2)?J=^;(,1-@FCF`?<Y0!I'5_]P0#`)A6.HS`A5'],:OI]=\"AJ\\=TW):\nM)A51<Y;6MBY#=[\"764E'(.FG8*5<Z=YF48LJH<KJ;#*3-=`!!W[FG-#(W%FY\nM/8P\"1N\"$O+J-Q*QV**L1E@NX\"JNT(#RAT+\"VT3;EC=@,``93R.^!:;8YKIFO\nM*=.POMRZGV9,FINMA$2#4MH457F@3,OTFGRLPE^IU)P5:5)57\";@YLJ,5)!<\nMO-.JWUO/;DUTR5%TZIP@@#>[W809/9):V_KYX?G+R\\N7C_'[9\\35OMTNG.W+\nMER]O;V]CC-?7UV59CEV?O-QN,>97$(4TN)U.)_8V8W\\Y.7^?^Y=__;?S>LN_\nM/KBMUK>8DY$A`Q[D\"^GB0MXZ+[KM>XR<<L+:6\\XM9]_-W5OK;#SX\\12%<Q6P\nM&)W'8&;\"`$Y)XS%`2AHY1\\R948%.!`VY2TPMWI;%+MC?UZ%@$UGMGZUUF`G#\nMPB@LUCTQD2M:(`2QXI;`7OO.OHNP`Q$X9GI25XW,`RP]#(@T>/I[F6_%J4$1\nMU8D6%3M=;)K5VRW)067-8ZS9,\\4B8XZ``C,SNM5;OE2!=:UNP,V:_(:HQ&^1\nM(W(B@A:&D6E]23/EI\"RD;F[&&'L=7(5[V;V$H[X2$8@[#U'!*+JOU;ND.U&A\nM9MQC'']C=WZBQ\")F1<J5R3Z)085ASQ`M@4`FR\\'@[F9I5CX)LJH9:A.$T8E%\nM7&%+:H$1=0CC?E^H58(F$_*9&\";0-L.>^\"L4,7XFN\\9B;?&^F+>4S?141BS-\nM`PID\"8>J[@P\"HQC%H@VKJD?WN;?:-0BIB:`O;B<;\".M$,QH5.4/!S-<^PRSG\nM;4S%X^/RVP_\\=+K@IO7EY?'3<MZUOS5K_O3AN7I5M[$?AY+[ER]?WKY]PXC3\nMPP/)?0XV/YW/K3_ZS]<K\\C+WS30-,(\\C@@6*-*'33^S=_+RL@[JDO>6V96RT\nME;$2&VQ!E/^E</^IS,R`SKW7\"5-NH-Z;F7'/-A:8R6P2(V-/U44VJVB*=I<(\nMU\\*U][\"S.J<2J,ZS&]/);*Y*OFR.$*?OG1',@OJJ-$OA$:M$H,-6=[XG#)-&\nMR\\P)E?`%L&9FUD\\1Q[OLY<S*F1E\"_(?;*XXDB.J$.DY\"D)6R!)(96?MRL[J9\nM<BHC0N_YED\"=70!ZN>O=\"\\=\"DLW8**7W?G\"`.3*E(^3-9Z8*TKP?YJ4X6Y.8\nM60/\"@D9\"2AN:.<W,ZG&D(F+/4,P=QFK.,DLB4Q$12/95!>BDD`C#A(*:*;H9\nMS1.FM-('-!>]_/&2YHQ,=3KAR*29RRI;J3*7]U1(%!U85+59?C*78ZF4JHP*\nMYYK)GQ%O8S]AGLD'\\HE\\),Y&3SIP#D[90/UX&,B(3.@QF]W#XRK4F$!\")]Q3\nM4\"2?:E0S-_->D+<YW0+8<D3L@\"[:W!_6>OP?UO7OOJQ_^YV>3Z_;V]OX]G%8\nMZVS;MIU.I]/IE)DE-\"NG\\#['X^/C:JT&Z[;T2;W>KKJ-<;M-2-WMM&0SR>:(\nM&#--D2.DQ;IHUMC=EHBG?MZX7.=^5;YJ?##'LD25!F1U2F>X)S.AUAD1F3DS\nM`9Z]M]8&+-.B<3<$<U\"UK4HFY%!,9;K1&TTS<EQWK+ASQP;DX;Y!_G5NKN:-\nMYF;NTRPS@_HIAB1SJ[S-D15SH^_$DK]!1EK><V[@I3T]:&[6G`$PLG@.9O$!\nM)`Q0^J^B]7FL0TF)J+P3&JEJP17-$JCY4(\"4`60&D(/:-4TP<U.B<I;<:%9M\nM%K5PF]N4G\"1:S3!3IAA9M3^L,8<Z(M),.N[CJS&ENFVNLD83,S+&W>E6I.Y$\nMY8_;+8>9D55<BT`$8B)I74HQA*)D,5DK!]4N8E!G!V(F+2W)(Q.C@LG>B^N2\nM)C+%R4K]')87QE7:@`$\":N))]@!2E\"PB$M6!SB03V#6_$A?,KY$/,5[@GZP_\nM=UMGCKJ!U%Y4[5&2,BN2@^_F0RD($\"6W0*0R*GN.P=J%2XT[4?]B3DTX7F^W\nM)ZQ+M@#BO.K[%_SP29\\_D`,:L<=(-.\\]@9EI9N?'1P!CC&W;7M_>^H>7MB[[\nMV_5VN]G:MYA__LN_GYJ?)CZ<UL>/'\\X?GJ[=<R(RLK0\"0&:&(G+N4S/],7-9\nM3@ML97L$'F`;9.C#,R)VS:!D+>R8<)LRZ#).!(`.9V`;^2HOL'//O\"EW5.`E\nMZ56$!!%)#>4\\1D(\"OR1_IE#K\\!N&13B\\.<?,8;$$C+9&`'1:0Y-QB(,!8'<I\nMU)\"F0**+GBC_<4V<=:9%M4^\"6^&-(L$2(*13\\LI.TJ_([H,<B*/&H)GE+P4V\nM.#@W,H[*$L!(MQNB2LL6,T`YII&M-0B884(W[^8*6)&0&9DI,R;WFJZ;S7NM\nM\\,&[\\+@RI#0(;UX9IZ$\\9M2(\\M$=Z45*@.[>6HM]UKJI<,?Z[$V8$8HLM.-=\nM&9;*1H?`2(=Y=\\O&.3!S.C-5J265]@HP(KL<5@&2)GAXNUF^*O_\"?$->H*%T\nM<H$@62K@`0.F(9FRNV&7:%.X:KPRK]:&:9<OC(_H9N8TYM&X?((#?O)W)=!Q\nM[S`:R2L/-H8F3^)@\\[-EBQ\"$=`2T98;3NW%V3EJ8+R<\\/+RN)LUV>_O\\PV^>\nM3LO'JRZ(-N?<MDV2F?7>>^_+LCP_/\\,8$0\">7SZ(^'9Y\"^+SY\\\\GLS[RJ>?S\nMR\\OCA^?7TYIO8^S[B<;>%C',7#8U1\\9,<`]HH[A(IV5=Y&]SSRVU;U02@ILU\nM3S*4(W$JSK?[S(P(!/>88[\\&;$SLRHVQY2C)B]-\\Z4LZ4I%SCSGJ^K*T?+\\`\nMDB`\"B+)@NV6F(EIHAPVPT.3?XZ%F%TY+:4L6H71=(2@2`<T#EB&-[_&A-2E%\nM1\"(1N![%+<<+#CM\":S*CT#;^*A28))0\\*NOM7<)/TLS-K)3^`]-@;LW=MQBA\nMZ.;N-&\",9.E6P:@ID;9XDV3*A*[;3L\";ZQ[,7X\"0F_]2=\\-?H-YIH)O3YC8B\nMC\\MC!F*,7W[.NYIV*A=8Z97N\"&?]:7.&\"4T'K4\\4R@N:J\\)488LW-VK&J$:<\nM7T%3&8<,GNDJB0V:Z\"7YN`E?C6_D52'`H2ZM0\"`,K0IGB.F*$(@T8I'MR$D%\nM@9;-8D:TW*U9<ZQDEUKH!%M@\"WSV(R@PH@2E1VS7&V9&('.AG9<EC9&(S!R<\nM`)*9FM`.B6;=/[2/ZW!'.W_\\[M/O_N;IRP_Y<-Z;_?N__?LP9\"XX+ZWWGIE9\nMT)#[MFT__?33ON_\\<+[\\_.W?_MV___CI^?'I\\^GS;=]>+Y<?'_'#P\\-\\_7E=\nMU_.'I\\</S\\OM=>V/:9B9)W'\"@V+G8WI$9K=;#;)&QD[@`8P9<^WE]S@N.5,5\nM?_NM%04^CW#X0$)K>UY,RMEF+(PT8[>=V*BS24K5ME>,?]WR3H#7GC7;Q+/P\nMC+7KU$[KG/,:XR\\8;SD6V>]\\_9OUZ7EHC!$*FR'C29$5P!SK#\"1$\\PE&9@=#\nM>J*/*FDR#N6.2*,U/,YVG_'8CL[6C(AL#B*9`W&P#F:HI$5P#HR]WNU.,(+M\nMY)=]CP@Y`!\\0-)E<@F`?Q&6.6G,4QMP7\"H8)9HO9S6F:RHC%-:'9H.9-Z]R'\nM]OE@K:[<;!Z&?>QFUMV0NB&`ZD--HW8-)L.R^5*OH8-.V<QEVFKMIVY9XB?I\nM?0('T&*6G,@!99Z`$YULF_G((/LTFS,F&<X9F/&6T'6O:@LLS;O5;L*88\\QM\nM8DRMR!YNV=II[KOR1FA%`'_=1VH^]>5W8>G<A'-RTK5X3=UMBXH^&,+<]4TS\nMY\"N6;TBFG+&8K1WGQ%G9$,P>$5+@<!,GG;UA4[JARU98W[-Y43#^BLW7]4W[\nMU_$U#&;68>NP\\PCVUI^6I]]]^.$___#\\#[]__=OO7E].;V]?O^.Z#%LOT?9]\nM[[T_/3VUUB)\"TN/CX\\/#PT_7U\\7<8=>W2]SV\\_G,YDZ.ZVT`9_+YY</CRX<_\nM-=MB$-GI[T!(%@%EA'C5J!,`]S(Z*\\M,U=D\"92(24\"?\",WO)+D)90M`R')S<\nM72K?2$^N@6F<T!5;*\",UH71:LHF\"/#R4OZC)BA>DOZL!9^:.3.@;QD_S]G4<\nM1%\\I5$M?!V#+&85K9#2Q@P8UV#7G>P8FP083Z3AT6_7['GA]UE80]3#=G<D#\nM:IM!V/N)Y/CE=)I[(.ELUIQD1(R8$)I90BX%#Q=-,1^'J*L2V:?$8ALU1U99\nM7H%)18\"8V:@PE)!@,Q,Q`P9D\\^:@I'?@MWZ1V]CSZ'LS3SA$@,B>D-BR8KJ.\nMTL5[7;'>!:4%!@.(G%D^E0!(![L(V+2>0*_;.=\"R59ZPUW8&JYPE'MV`6?!7\nML7HH'6ZALBQ'E3VP;<@,S`JP=1JRM,<!#>6-G.2?YF:@TU;8(]H&N\\HZ]#0'\nM4H9T6O4/-<E3CY2#BUD#*63.*$BY`3;W.5(S(UMXLV:\"V;I%6F_+=R_/?_.;\nMEQ^^[Q\\^<,5#_W0>X)9IT7).:PV9V_4ZQ@\"P+$OO_?'YJ7NSU/7KZ^UZ1:K1\nMFOE36\\]<'L^-O_GNXY?O[?$T%C<YMEFZN\\B:6!&&%/<\"W<CZ[$RJEZ\"5K>1^\nM+RM6@.`BES25`T`QI9*@/JN?VAI\\D$,:4U/Y&B/`:0HK_DI+UJ!C>VI`*@M2\nMY>YU+Q_$5.[,&R3*<@OI-SBM2UN],V+,`!)E>'5KK15P'YB$=6L!C&/3.-90\nMI<HZX6ZU^MZW'M4+JJBDVN8&LQ$Q<R:R\\3]<\"]]?>DZ:C&X-C<=\",P\"+E_,X\nM&3JF1H#%&5I%O]5D)J.Y6[H=$'0(T$*WSD8C6];_M;F(N0\\!!E^M64J1R`.>\nMJ>OKCBA+DJ6<;'5;9\"ZS2`OF>[P%0+UWABOM%VPCE3.KZ4E`>#9C0N;0;BN4\nM:0U*5<W!I!&=(GBBKVB-AP4LD!,9_&4F+ZU!1&QDAR_5KI7S%M.(;&8-+K9#\nM>J>D+@R2REI@&$:!XJ$)MYR$''8J4CY#R@PLB&[>K`H2<D=,:4+V<,J<V>2P\nM/G#V]M37!4:T+=,>VOYR^JOK]NVO^[*_.7;-;R-[H(%M69;WF;N\\&)?+9<[Y\nM^?/GY>'QZ?1P>K976A(U/7[]]OK0'L_95[?^>.[/#_-A]6ZYO2:0J2D-J.H!\nMLC;^=U0M*EQ'$='H57*J4BZBR&7.VJB@\"=VH(16J-C+H9N:+-0K*&3%90;.F\nM-!0NU,D.-14??FR-!L(-[=[^F3H@OH9P_)1SB_P?Q$M[>%ILF3*H157RZJ,U\nM-!_*BV*$Y)#)D3R*[(6$E`:YK!V]%?F>ET5XA9$;XS![1!57E\"5+[KP+1.X(\nMPKU`)B(4&:6K(KJ[F3FVJE4)R`DO5$Z2H35W=QY`@F1B([,QT^[T+\\EN[NXD\nM6H:0=E?>6JJ9KW05J_!N]E#1EUZU<\"4<F'?,PG\"DE94V8&0FI+N[XN!\"_R,]\nMP[LP\"<K*:C6@:K,,:&R\"6F*!N=`4#>QNG>ZR@`9R(&^*RNQB.1LK;$JY:9)X\nML'9B6ZKV;F8UM#\"U9$7G<-0`1#UX-R'(\"=]A#49:P\"X6!G3DR=H*-,F4C5JU\nM#[G#$]H5-\\0TI#'V/6>L]).L`RMP-O,$^WI^>?C^G_[A^__]O]GO/KW9R&UC\nMLW5IOK3SZ70ZG5K.&'E8\\>L#S!ECVR^O;W';X[PMWMS=F[=F7!HV?VSG_+;]\nM?'W[\\?KZ=;O>;A>[ZK$T+)DS8YJ&(1-A6.^>R&JZB_L#V9D5V!LE*B%F9E(_\nM:U11UX0&,W@L0IB#2M=$[M+&F*Z94)I*:61I@@,=Z$46SS#!?WW\"$,@TP`^U\nM\"6\"8Q)OR7^;E8^`WL@]F#\\T7;TO24GT*L`NUBQN0+'X`#_.X:AZDQ9&K:5.S\nMP,/W=Y@D9(NWFKT#69BDTTQT]P+`4DG]\\J,>_2,XY#]B4=JF^R=8>4'MR#55\nM)CQA7H`[Z]^:<\\ZJ#DQT$<+ALXF8RAAS*DH2@90B\">MBM=PD\"OMC^<?7WD?$\nMI$HQE_<8B]+*@)3;T!%1Y^[/LB-R2XI#[0\"\"G9+1U\":E8S$?P'7U^M9!ZK0&\nM6V\"FJ!:G4B#-U(Z\\YIS*,/RJJY*5.[LCFAB9WDBP@Q)S(G.PBI!E=N25@(&]\nME7J(R/DJKF@G>`/;`D7E`H\\3O3$;V>EG1*.`F9E;SD$E#6;8)S.[K<U[!X]9\nMD;A`'W_S^7?_]-__YO_XI_SRX>I\"]^;+3Z]?Z6;N6-J!(AP/U;VU]OS\\[.ZO\nMKZ_7ZW6[WII[2NE,XS9V-:P=V_4V]ELV.ST^\\'Q>8G*+\\O14VN24!HO!OTND\nM_J-.ZI9YU$>A\"AHQ*4EO.?(P4AZH6-%R;!;0'N.:\\R;MX4R:NP``#T5)1$%4\nMR'1#L[DS*`J+2&%1>LJ`N#^S`#J9]PUB#;BXPL_P5V@2@%+Z$9BYQ[A.=JEW\nM68,YK&D;(TBYLK..LWK+:Q5*5<?C'4X!&?,0PH#OQR!(/ZPRR4-S8FX&,UB)\nM$LO=6OQ$*9Y'`:F'SQC*#$4R+84$(51G7G$?$?5!)\\D0,I%((,/IM)5>B:`P\nMCH@1DX*E+(49WEJG26F\"AQS4>YI,0J335/+!TK\\`J-IAJ;'-R@6@=I5J'MGH\nMTU)9U2#\\97SC@04X##:H\">P9H8S$H(844F.K#\\C!/KT^Y9!VQ17YIOF&64GR\nM=;=PL<KNC5!&#0O7G!U84,8;'$F_0MYKM!.2>+&,Q*0B<04<V6$./JDI!Z4E\nM?26;V(E&?VK.^]T^2U0S8>`#UV8\\^;+XTLU$']::>3X\\K=]_ST\\?WA8,C$WJ\nM(9)/?1W*L>_;'.W4E^K:!C#GK`B`;O[AX\\O8=A.J[G\"+^;9=O]XNNX:=\\S%U\nM.J]/GUX>'A[VU'ZYG6R%6PGM1`:5T(0NVH\\$H%^N6E5*V0(9RDF%D,:4@MJ/\nM%J!#4>('W%8!O:G,R*B'G>:\"=D<9\"CWARB:Y`4(1^K7[&5\"$1V@:6S.7]U6Q\nM*H^$-2C.]AJ)<3-F2WE:4S=:T,H-N'@K0IL!!^.>'%6`PP&[IY!!&DW')1LF\nMU5\"13HK&P]I1#+&-S'>JX]?[5-B4\":A6X,P(L\"HVUL2=?LF*[+=6==RIV,L^\nM5/++G,IDF#&5+E:\"3`6$=UKK\"^<0V.C=F4FG<69KS;QE8L\\IR4FX9X@A@UC9\nMQF;%`2XR!S*11HDS`3NZ#7D7H[-*5(MZR0GS)$5-8I,VUY\"FY@!&Q@2%7&PA\nMW0Q=+1'2'$@`-\\0;YJM&WG,S=,1S>&%B#939EJ'0F6UI[9Q29D,OR4X0`3SB\nMD.!<,@9RR[)*&:OMAO34%.N)!TU4D&X8.9NX)A=9A[=BP\"9.\\$[S:0H%<6/.\nMEJ?3Z;?_Y>]__X__\\.'W/XS>OLUM&DX0F!^6)X_YMMVVN;?,O-UN8XP2[$E:\nMU_5T.IT_?@CEF,&8WMOC\\]/IX_/R\\B3'0U!_^8:9!P('GEKGX0BQ$HC4-4;$\nMJ^6OGT=FCC%FS,7/J1S(6;IHL=([[:[JJDMC9<@[N.VS`=VJXD=;Q9\\$9D<#\nMCHMH7><@$+MII-YIZ'<5@?7>83)?PU?$AF0*PC3?QK\"9#]\"5?%2;;/1FBW(.\nMRKK1,W.&A3RPM59*PD0F,)1,S9QG'O;?NH[69HUB\",GN7HQ8J5MXOX,>[85W\nM+`>`=ZLK92)#,9&%;2H9M-0!O3:Q&@07>$0,!))6*4B5U>`HLA$AN#<S=^]$\nM&RFPTZ;40-$2]ZN,HYM-,T_.HWJ1%6QDI,\"[Q!P&GH<%$$+6;@$*UNG,^>[8\nMYMUB@M2]E=C3$,0T[5GZIY1R$B&9,F!)AUEK?:80)23(7;%G7*'C14F@XH>/\nM9#=V-TB[,F.ZV\\EZ)Z%H:#ORQDQD`T^R%;;\"OA\\:L!NP@P,NF6B$;QSST+6R\nMF0-9`J:WV_4$[^R-[='[*JN<+N]MH=<]@NYRP[*VYZ?GW_SF=W__OWSYPQ^^\nM?>KBV#4ZL5I;T-T/,KRU\\\\JEV1C[ON>^SS&^W2X_7UY?F/N^N_O#PX,W'V.\\\nM_O3ZXX\\_7GQ^__SQJ;?GI\\?V^/QT?OAKLY\\XOK]=1[-MT0Q@0('-[>;P>,PY\nM:6&=.^=KC)ND96V63;1)&WDR[]Y'Q#;WL7AF):5CCUA:`WG9]VGMIK@B;XT;\nM.\"=(+&8/,RKPD#2ZDXPQM[EI;H#00(<;#\"5@\":SJ(YXGGMC/9G_$]J/IUF`9\nM2<R&;X!K1&HC7X53=$QZS!7^X*WYFIP1@3@!F,P=>=6\\1.R=L:X_;(Y[`*`Q\nM:-G,R/#P8NK-\"+?,\"8C$L$FA!3MM,6_6D$3D+OLY+E]SWU>WL^5U^K8_LGO>\nMFXJ3`B:R(0T.[FCHU=<9L+B+AFY#7.0]6YM`[.F&U6#+0^9<82N.@2T<D;-L\nMN].@[E(@H@J&//A@JZ28@U!K5L3)90VD,H&9#CQC8=(N\"JC1C]@4()J'<U*W\nMX;%X&C73]CB#20[H`?T:8R*M%(&Q*Z;,&\\_/O0UIS_VK\\\\_*GSWWA$X=D8@D\nML<`?P75&ST-;\"\\\",4LS85^MK;\\N.'?FF>0-*=$$W6KN%(JLDV)8,(8R*W#]Q\nMF6CU5J6T3R;D;D_L+IS`)_*4N:3.\\-XZ0P]F03S-=F4;;#_X=U__\\0_YAX^W\nMSZ<_;E]OW]J^^E\"V9;6^_KS=;F.WM3^\\?-?^^9__^?/GSU^^?/G\\^7,5,^W[\nM7ASZ^?&)Y';;YFW[\\.'#=R\\?.VTPEF598\"=?VF4\\??GN_.G#Z[=+6VA.9[@*\nMVL>:BM\"YK6DMM6?.R.Q3(Q4QHQ,)IIIS$A.1IKGXV*N'HA4%MYD`73'A[3;C\nMFC/,T&RQI<[MGN2[K+&H*Z?D93&$0\\;*B-R!3GV.=DXNJ1MX$=:DIY!H,S,Q\nM@3?.G?,G;\"?=3NS_24_-<`9@7-Q*=HDJ^8D*)N6C+XUY0XZ1[[K'`DD-ABIS\nMK^C-\\B$F,F=QAB8>*>.`#`-B'8<S>_;'Y'F7AVL\"X\"EZ3P]#&N75\"%`IB[IJ\nM%DI151`R:Z6M2P$6Q#S4<\"B7?UR_'>E5Y5Z@:')RS,R8]<UQ:`.1T'0>OKJJ\nMJD>6\\^5UVPD:6F-K[D9O=>61H?\">3$&:$3,G\\A$^!S;+C#ITS\"FC?4MMX!6`\nM83%;S8AN-\"0G.(1;XC+SDJ.<^-CG?3BUH\";4#<EVC4.3UV!![1F7'\"[^?GFD\nM[$SOF>7:02(4WS\"S-&C&)*RYF662VR!I[C0Y<%Y*^<3<2RW)('8HD0/9(O[N\nM]+($AO'$=71F:Q^^^_3\\]W_XN__MO_W^'_]+?#C]V_8:S),W#WW[\\X_?;A?K\nM;=$YI/;R\\I*9?_[SGZMHLM[F.>?SZ0'\"V,?V>AEC=-CGSY^_?/KNIY_^<MOV\nM2TRM)_/$\\RF[__7;U\\]Y&L!$(-63)DL)R,A8C9(-P:VMI_41-H'KN*6B<#`!\nM^QB3DIO5<S:3VU\"`&L@KPERWU!\"FJ9HUC$RI5PJM63V3(,(9L)8T8YG>+`,1\nM\"87L.FY,,W@:ZK:S\"\"-'`)$A8#@'A,2%V6R.^6T5G]$^:UZC/:*ME#O*50QH\nM86O>SH;;'/L<:>^C75E^DB)%+G>OB>Y?!P5U=62&-,$X;,@4Z6,V:X]IGNK3\nMH2XL)G-RS]@R!T6S>RZ#]C(EU_M'-K_KOP8CM2O*A>J\\?\\^!#F<I(V:,(I\"B\nM+60>=JQ?]*[I5@H2N1/0G\",RB\"(([(ZK)8$Q)H`K9C.K%\":22VL=&!DM4B%$\nME-8TR:`&\\EOSZ>T&%OW=Q4T)Y2,:#5OB\"ER%`9>Y@S&V`T!F[D`)\\F$'<6N`\nMA*%,<EBEN6T=7.5GNLL3.10I_08]D1[.M)\"8M.:9>>5LS9L9(@DL=`,SLOD\"\nMP*QU;X?5BZ0[+V,JX$MO[LY^/GWYV[]Y_E__\\?D__6Y_[%_']<?7K]O8/YP>\nMOC\\_GT^/[;S\";5+[OK??_O:WA5G?;K?7UU<`#P\\/+R\\O<=G,[.7YPW>?/E=-\nMA2(C\\NGQT30Q=UN7QT\\O?_>?_Q[_]<_CCS]>_^\\_;<Z=\";$*`#LY`412D%)S\nMBJ$%)#+R%%#`8.['V=F<9HY3GTIK/B%$3FID[@C+2\"?H)&:&(B%U<Z:,)C\"E\nM084TH8!.U@J+,QUPX0IV\\O+@%N:3U?94>.\":^+H6VO5+5F9(!OW1]X5\\G>,:\nM=F7_Z.MS:QW&2\"@;0*&++<&T!K^UPQA^-YX=^33'HK2R8\\/DM='Z],FB&%0\"\nMF&HFVS-/\\@8SI(ND2:0[NRG&/K<=2LJ=YH<?0@=4>TB.2U2IC$CM6?\"W$:QU\nMV^R(?I,0A]51)&)MOU8X`8C(5#[Z,E.141?=>9SDYJTA4*=BYKTQ`LA>X5=Z\nMSR.M_P:T(W=FJ?0\"^(;Y5?$Z2P`H5)BN6Z9'R-#,FKQ%SDG.2.E@35+O;<(8\nMS$Z0?/1>`-$]#HBEH?\\QMQ7V@GYB7^EN)K60+GZD78M4S/*;A.*)=F)SFE)(\nM=<J8RB\"Z(&$8@W0!K;5F/\"VKS;2'TX.?7SWZ^?SAX\\OS=Y_PL+[NMRMF.ZVA\nMO+Y=+F$GV17;^?'!S9I9^^,?_[BNZ_E<M.'I7634UP7`B/EVO5PNE[J@CC$^\nM?O=Q4'/.ZYS\\NL]ME[3-L50VRCT=M]BA)$*I@.Y8_GM]YSJM7GA7V79:@((-\nM1^:AKL@($)0(9&G4K91GK)'9S4>&W@,L,I-(9<[H=`?,T$@D#7ZFK6RMM0X[\nM5:`$);<SEUWQ;^.ZBU,Y#!.:0@(;$M`M98$%L4HN9,Y.^Z#5[W*-$;.D=G9W\nM5_P2$GQ?A'7.'->_7[*\\,9\"\"YCU%7E7R!0V(S)WAPN+5ARHG1XS;'-<<.Y\"@\nM*:MH[GSOSSG6/F6J.C<`<')*A0,%1.5M[A7M4Q2'>ZL?;-QUY.^RWB,.[X[<\nMOLNL#P`)!YS]2V;4L73#2D=PQ^5$F.%;[)OC!@TDQ(&X95[JZ5:\\B-`:E[ZL\nM:LN4#96Y.`^9HZ\"P^^>8T/U2BLP4K0L.ZS03K%R\"B4SMKLC<-*Z$444&&NW%\nM>B@.'57:,<I'-.62]\"-Y2QU6.>R=?2J%\"ATVD@V^6!^W<;)&]Y1,6-?UM*Q(\nMS>M&KLNI+Z>'?'IJB<?T?+MU96NM$FC;QX\\?*UWF>KV^9QQ(.BWKP\\/#LJXR\nMMIC%YE^VV\\___[_VTUKUW*<]+;6NZZ=/G^Q/;],P69&#2D-*$]F7:C4M]5G`\nM7<=1T.J0K\"5KM1]+@YASEK),,XKU7.`3G!$9F71W]WXXS76H5>O=`@L03^'(\nMDT82]HLUP98]EZ$^\"&`QK!Z[TI2_L_66\\\\*X**_&1*01-(M8R:?F9_B)RPJC\nM>*_@*IN/=D4@\\RAC3-T]:74O*G%CY-0]<>9`;B1`L_BV^ZM$'/X,.79&,MTP\nM/2EASH:6D;,,RP<6S?>HQ5*]U+]B]\\5O9IY6F12'4$C'/$L\"#,G,C\";2)/G(\nM7[:.@R>BS#3\"$WX4HO-XZ5.4&43S(^KC8+[50\"-*55<\\0BF$)I2E(.+A=*Z,\nMN1-,X,X`T<V=;$0OXF_.F\",Q9:@NR$[?:W7?PP&\\AF&5>+=:L>KK&LI$NLQ2\nM@;@(0@[X`FOTEV'W:N\\CS9AB`A=$!N@T.J7##0*@N255.0\\DBNP!K=FRK.P=\nM.\\QL799FGF.^_OC74SY?KKI:MJ5_?'B2^2V&$=NVU0CS/P'C4ELUM[9WZ0``\n*``!)14Y$KD)@@@``\n`\nend\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/windows.html",
    "content": ".\\\"\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 2003, 2006-2011, 2013, 2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ad l\n.hy 0\n.so etc/version.so\n.nf\n<html>\n<head>\n<link rel=\"icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<link rel=\"shortcut icon\" href=\"srecord.ico\" type=\"image/x-icon\">\n<title>SRecord \\*(v)</title></head>\n<body bgcolor=white>\n<img src=\"srecord-64.png\" align=left>\n<img src=\"srecord-64.png\" align=right>\n<h1 align=\"center\" >\n<a href=\"index.html\" >SRecord</a> \\*(v)<br>\nFor Windows\n</h1>\n<a href=\"http://www.cygwin.com/\"\n><img src=\"http://www.cygwin.com/cygwin-icon.gif\" align=\"right\" border=0 /></a>\nThe <a href=\"http://www.cygwin.com/\" >Cygwin</a> tools are ports of the\npopular GNU development tools and utilities for Windows 95, 98, NT, XP,\nVista, <i>etc</i>.  They function by using the Cygwin library which\nprovides a UNIX-like API on top of the Win32 API.\n<p>\nThis means that you can compile SRecord for Windows\n95, 98, NT, XP, Vista, <i>etc</i>.  SRecord was tested\non Windows in this way.  Other tools, such as <a\nhref=\"http://www.scl.com/products/mks/datasheets/nutcracker.html\"\n>Nutcracker</a>, are expected to work but have not been confirmed.\n<p>\n<a href=\"http://www.delorie.com/djgpp/\" >DJGPP</a> is a complete 32-bit\nC++ development system for Intel 80386 (and higher) PCs running DOS.\nIt includes ports of many GNU development utilities.\n<p>\n<a href=\"http://www.cygwin.com/\"\n><img src=\"http://www.cygwin.com/cygwin-icon.gif\" align=\"right\" border=0 /></a>\nOnce you have <a href=\"http://www.cygwin.com/\" >Cygwin</a> or <a\nhref=\"http://www.delorie.com/djgpp/\" >DJGPP</a> installed, simply follow\nthe instructions in the BUILDING file, as if it were Unix.\n<p>\nPre-built MS Windows binaries are available from <a\nhref=\"http://sourceforge.net/projects/srecord/files/srecord-win32/\"\n>sourceforge.net</a>, although they tend to lag behind the current release.\n<p>\nThese instructions have been improved greatly with the assistance of\n<a href=\"mailto:jens@familie-heilig.net\"\n>Jens Heilig &lt;jens@familie-heilig.net&gt;</a>,\nwho is often the person who builds the MS Windows binaries you see on\nSourceForge.  Thank you, Jens.\n<h2>FAQ</h2>\n<img src=\"whining-64.png\" align=\"right\" />\n<i>Please, <b>please</b>, can you just build it for me?</i>\n<p>\nNo.  The author rarely uses Windows for anything.  No.\n<p>\n<a href=\"http://www.opensource.org/\" ><img\nsrc=\"http://www.opensource.org/trademarks/opensource/web/opensource-110x95.png\"\nalign=\"left\" border=0 /></a>\nBesides, SRecord is <a href=\"http://www.opensource.org/\" ><i>Open\nSource</i></a>.  That means you can <i>get the <a href=\"srecord-\\*(v).tar.gz\"\n>source code</a></i>.\nThat means you can build it youself.\n<p>\nIf you let the author know the URL to get your compiled binaries from,\nafter some-one else confirms they work, he will upload them to <a\nhref=\"http://sourceforge.net/projects/srecord/files/\" >SourceForge</a>\nin the <a\nhref=\"http://sourceforge.net/projects/srecord/files/srecord-win32/\"\n>srecord-win32</a> directory.  If a Windows user has built the most\nrecent SRecord version for windows, it will be available in the <a\nhref=\"http://sourceforge.net/projects/srecord/files/srecord-win32/\\*(v)/\"\n>\\*(v)</a> directory as the <a\nhref=\"http://sourceforge.net/projects/srecord/files/srecord-win32/\\*(v)/\\\nsrecord-\\*(v)-win32.zip\" >srecord-\\*(v)-win32.zip</a> file.\nIf the link is broken, it means no MS Windows user has built SRecord and\nsent the author a zip file for upload.\n<br clear=\"all\" />\n\n<h2>Prerequisites</h2>\nThere are three pieces of software that must be installed before you can\nbuild SRecord for Windows.\n<dl>\n<dt>MinGW<dd>\n    Download and install <tt>mingw-get-inst</tt> (I used version\n    20110530) from the <a href=\"http://mingw.sourceforge.net/\"\n    >MinGW project page</a>.  Select C++ and MinGW Developer Toolkit during\n    installation.\n    <p>\n    Start MinGW Shell from the Windows Start Menu.\n    Install additional packages by entering following commands at the prompt:\n    (the &ldquo;<tt>$</tt>&rdquo; sign indicates the shell-prompt,\n    do not type it)\n    <blockquote>\n<pre>$ <b>mingw-get.exe install msys-groff-ext</b>\n$ <b>mingw-get.exe install gettext</b>\n$</pre>\n    </blockquote>\n\n<dt>The Boost Library<dd>\n    Download and install the Boost library from <a\n    href=\"http://ascend4.org/Binary_installer_for_Boost_on_MinGW\"\n    >http://ascend4.org/Binary_installer_for_Boost_on_MinGW</a>.\n    Copy the newly installed files to you MinGW directory:\n    <blockquote>\n<pre>$ <b>cp <i>boost-install-dir</i>/lib/* /lib/</b>\n$ <b>cp -r <i>boost-install-dir</i>/include/boost-1_41/boost /include/</b>\n$</pre>\n    </blockquote>\n\n<dt>The libgcrpyt Library<dd>\n    Download libgcrypt-1.5.0.tar.bz2 and\n    libgpg-error-1.10.tar.bz2 (newer versions should also work)\n    from <a href=\"http://www.gnupg.org/download/index.en.html\"\n    >http://www.gnupg.org/download/index.en.html</a>.  cd to the directory\n    where the two downloaded files are (make sure the path to this directory\n    does not contain spaces)\n    <blockquote>\n<pre>$ <b>tar xjf libgpg-error-1.10.tar.bz2</b>\n$ <b>cd libgpg-error-1.10</b>\n$ <b>./configure --disable-shared --enable-static</b>\n<i>lots of output</i>\n$ <b>make</b>\n<i>lots of output</i>\n$ <b>make install</b>\n<i>lots of output</i>\n$</pre>\n    </blockquote>\n    (the previous step might hang when converting from ISO-8859-2 to\n    UTF-8 late in the build process. Press ctrl-c and proceed)\n    <blockquote>\n<pre>$ <b>cd ..</b>\n$ <b>tar xjf libgcrypt-1.5.0.tar.bz2</b>\n$ <b>cd libgcrypt</b>\n$ <b>./configure --disable-shared --enable-static</b>\n<i>lots of output</i>\n$ <b>make</b>\n<i>lots of output</i>\n$ <b>make install</b>\n<i>lots of output</i>\n$</pre>\n    </blockquote>\n</dl>\n<p>\nYou now have all the prerequisites required to build the srecord tools.\n\n<h2> Building SRecord </h2>\ncd to the directory where you unpacked the srecord source code.\n<p>\nNow we can start the actual build process:\n<p>\nStart configure for srecord:\n<blockquote>\n<pre>$ <b>CPPFLAGS=\"-static -I/include -I/usr/local/include\" \\\nLDFLAGS=\" -L/lib -L/usr/local/lib\" \\\nCC='gcc -static-libgcc' \\\nCXX='g++ -static-libgcc -static-libstdc++' \\\nLIBS=-lgpg-error \\\n./configure</b>\n<i>lots of output</i>\n$</pre>\n</blockquote>\n<p>\nAfter configure has run successfully, start the build process:\n<p>\n<blockquote>\n<pre>$ <b>make</b>\n<i>lots of output</i>\n$</pre>\n</blockquote>\n<p>\nAfter successful build process, run the tests:\n<p>\n<blockquote>\n<pre>$ <b>make -i sure</b>\n<i>lots of output</i>\n$</pre>\n</blockquote>\n<p>\nAll tests should succeed.\n<p>\nNext, reduce the size of the built programs by removing debugging information:\n<p>\n<blockquote>\n<pre>$ <b>cd bin</b>\n$ <b>strip *.exe</b>\n$</pre>\n</blockquote>\n<p>\nFinally, move <tt>srec_cat.exe</tt>,\n<tt>srec_info.exe</tt> and\n<tt>srec_cmp.exe</tt>\nfrom the bin directory to where you want them, you can then delete\neverything else in the bin-directory.\n<p>\nYou should now have working SRecord tools.\n<p>\nThis is how the executables on <a\nhref=\"http://sourceforge.net/projects/srecord/files/srecord-win32/\"\n>sourceforge.net</a> were built.\n\n.\\\" ------------------------------------------------------------------------\n<hr>\n<table border=0><tr><td valign=\"top\">\n<a href=\"http://www.fsf.org/\" ><img\nsrc=\"http://upload.wikimedia.org/wikipedia/commons/b/bf/\\\nGNU-FDL-ic%C3%B4ne-Transparente.PNG\"\nborder=0 alt=\"\" /></a>\n</td><td valign=\"top\" width=\"35%\">\nSRecord is maintained by\n<a href=\"mailto:scottfinneran@yahoo.com.au\"\n>Scott Finneran &lt;scottfinneran@yahoo.com.au&gt;</a>\nand is freely distributable under the terms and conditions of the\n<a href=\"http://www.gnu.org/licenses/gpl.txt\">GNU GPL</a>.\n</td>\n<td valign=\"top\">\n<a href=\"http://www.opensource.org/docs/definition.php\" ><img\nsrc=\"http://www.opensource.org/trademarks/opensource/web/opensource-110x95.png\"\nborder=\"0\" /></a>\n</td>\n<td valign=\"top\" align=\"right\">\nThere is more <a\nhref=\"http://miller.emu.id.au/pmiller/software/\"\n>Software by Peter Miller</a>\nat his home page.\n</td><td valign=\"top\">\n<a href=\"http://miller.emu.id.au/pmiller/\" ><img\nsrc=\"http://miller.emu.id.au/pmiller/pmiller_2003_colour.64.png\"\nborder=0 ></a>\n</td></tr></table>\n.\\\" ------------------------------------------------------------------------\n<hr>\n<a href=\"http://sourceforge.net/\"><img\nsrc=\"http://sourceforge.net/sflogo.php?group_id=72866&amp;type=5\"\nwidth=\"210\" height=\"62\" border=\"0\" alt=\"SourceForge.net Logo\"\nalign=\"right\"></a>\nThis page is hosted by <a href=\"http://sourceforge.net/\">SourceForge</a>.\n<br>\nThis page has been accessed approximately\n<img\nsrc=\"http://miller.emu.id.au/cgi-bin/web_hit_counter?pmiller_srecord_\\*(v)_win\"\n> times since\n.ds MO1 Jan\n.ds MO2 Feb\n.ds MO3 Mar\n.ds MO4 Apr\n.ds MO5 May\n.ds MO6 Jun\n.ds MO7 Jul\n.ds MO8 Aug\n.ds MO9 Sep\n.ds MO10 Oct\n.ds MO11 Nov\n.ds MO12 Dec\n.nr y4 \\n[yr]+1900\n\\n[dy]-\\*[MO\\n[mo]]-\\n[y4].\n</body></html>\n\n\n/* vim: set ts=8 sw=4 et : */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/etc/x_defs_pack.vhd",
    "content": "--\n-- Example ROM definitions pack for type-independent srecord output\n-- Copyright (C) 2000 Hendrik De Vloed - hendrik.devloed@rug.ac.be\n-- Copyright (C) 2007 Peter Miller\n--\n--      This program is free software; you can redistribute it and/or modify\n--      it under the terms of the GNU General Public License as published by\n--      the Free Software Foundation; either version 3 of the License, or\n--      (at your option) any later version.\n--\n--      This program is distributed in the hope that it will be useful,\n--      but WITHOUT ANY WARRANTY; without even the implied warranty of\n--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n--      GNU General Public License for more details.\n--\n--      You should have received a copy of the GNU General Public License\n--      along with this program. If not, see\n--      <http://www.gnu.org/licenses/>.\n--\nlibrary IEEE;\nuse IEEE.std_logic_1164.all;\npackage x_defs_pack is\n        -- The basic type of the data word stored in the ROM. Define\n        -- your ROM's width here.\n        subtype x_rom_entry is std_logic_vector(11 downto 0);\n        -- The type used to represent the ROM. Define your range\n        -- here.\n        type x_rom_array is array(0 to 511) of x_rom_entry;\n        -- The \"Don't Care\" value used to fill unused parts of the ROM.\n        constant x_dont_care : x_rom_entry := (others=>'-');\n        -- The conversion function used to make srecord's output\n        -- independent of the actual rom_entry type and # of bits.\n        function x_entry(data:natural) return x_rom_entry;\nend package;\n\nuse IEEE.numeric_std.all;\npackage body x_defs_pack is\n        function x_entry(data:natural) return x_rom_entry is\n        begin\n                return std_logic_vector(to_unsigned(data,x_rom_entry'length));\n        end x_entry;\nend package body;\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2011-11-20.07; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# 'make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=${DOITPROG-}\nif test -z \"$doit\"; then\n  doit_exec=exec\nelse\n  doit_exec=$doit\nfi\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_glob='?'\ninitialize_posix_glob='\n  test \"$posix_glob\" != \"?\" || {\n    if (set -f) 2>/dev/null; then\n      posix_glob=\n    else\n      posix_glob=:\n    fi\n  }\n'\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nno_target_directory=\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n\tshift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n\tcase $mode in\n\t  *' '* | *'\t'* | *'\n'*\t  | *'*'* | *'?'* | *'['*)\n\t    echo \"$0: invalid mode: $mode\" >&2\n\t    exit 1;;\n\tesac\n\tshift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n\tshift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t) dst_arg=$2\n\t# Protect names problematic for 'test' and other utilities.\n\tcase $dst_arg in\n\t  -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n\tesac\n\tshift;;\n\n    -T) no_target_directory=true;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --)\tshift\n\tbreak;;\n\n    -*)\techo \"$0: invalid option: $1\" >&2\n\texit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n    # Protect names problematic for 'test' and other utilities.\n    case $dst_arg in\n      -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n    esac\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call 'install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  do_exit='(exit $ret); exit $ret'\n  trap \"ret=129; $do_exit\" 1\n  trap \"ret=130; $do_exit\" 2\n  trap \"ret=141; $do_exit\" 13\n  trap \"ret=143; $do_exit\" 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names problematic for 'test' and other utilities.\n  case $src in\n    -* | [=\\(\\)!]) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n    dst=$dst_arg\n\n    # If destination is a directory, append the input filename; won't work\n    # if double slashes aren't ignored.\n    if test -d \"$dst\"; then\n      if test -n \"$no_target_directory\"; then\n\techo \"$0: $dst_arg: Is a directory\" >&2\n\texit 1\n      fi\n      dstdir=$dst\n      dst=$dstdir/`basename \"$src\"`\n      dstdir_status=0\n    else\n      # Prefer dirname, but fall back on a substitute if dirname fails.\n      dstdir=`\n\t(dirname \"$dst\") 2>/dev/null ||\n\texpr X\"$dst\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)[^/]' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)$' \\| \\\n\t     X\"$dst\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n\techo X\"$dst\" |\n\t    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)[^/].*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\).*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t s/.*/./; q'\n      `\n\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n\t# Create intermediate dirs using mode 755 as modified by the umask.\n\t# This is like FreeBSD 'install' as of 1997-10-28.\n\tumask=`umask`\n\tcase $stripcmd.$umask in\n\t  # Optimize common cases.\n\t  *[2367][2367]) mkdir_umask=$umask;;\n\t  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n\t  *[0-7])\n\t    mkdir_umask=`expr $umask + 22 \\\n\t      - $umask % 100 % 40 + $umask % 20 \\\n\t      - $umask % 10 % 4 + $umask % 2\n\t    `;;\n\t  *) mkdir_umask=$umask,go-w;;\n\tesac\n\n\t# With -d, create the new directory with the user-specified mode.\n\t# Otherwise, rely on $mkdir_umask.\n\tif test -n \"$dir_arg\"; then\n\t  mkdir_mode=-m$mode\n\telse\n\t  mkdir_mode=\n\tfi\n\n\tposix_mkdir=false\n\tcase $umask in\n\t  *[123567][0-7][0-7])\n\t    # POSIX mkdir -p sets u+wx bits regardless of umask, which\n\t    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n\t    ;;\n\t  *)\n\t    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\t    trap 'ret=$?; rmdir \"$tmpdir/d\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n\t    if (umask $mkdir_umask &&\n\t\texec $mkdirprog $mkdir_mode -p -- \"$tmpdir/d\") >/dev/null 2>&1\n\t    then\n\t      if test -z \"$dir_arg\" || {\n\t\t   # Check for POSIX incompatibilities with -m.\n\t\t   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t\t   # other-writable bit of parent directory when it shouldn't.\n\t\t   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t\t   ls_ld_tmpdir=`ls -ld \"$tmpdir\"`\n\t\t   case $ls_ld_tmpdir in\n\t\t     d????-?r-*) different_mode=700;;\n\t\t     d????-?--*) different_mode=755;;\n\t\t     *) false;;\n\t\t   esac &&\n\t\t   $mkdirprog -m$different_mode -p -- \"$tmpdir\" && {\n\t\t     ls_ld_tmpdir_1=`ls -ld \"$tmpdir\"`\n\t\t     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t\t   }\n\t\t }\n\t      then posix_mkdir=:\n\t      fi\n\t      rmdir \"$tmpdir/d\" \"$tmpdir\"\n\t    else\n\t      # Remove any dirs left behind by ancient mkdir implementations.\n\t      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null\n\t    fi\n\t    trap '' 0;;\n\tesac;;\n    esac\n\n    if\n      $posix_mkdir && (\n\tumask $mkdir_umask &&\n\t$doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n\t/*) prefix='/';;\n\t[-=\\(\\)!]*) prefix='./';;\n\t*)  prefix='';;\n      esac\n\n      eval \"$initialize_posix_glob\"\n\n      oIFS=$IFS\n      IFS=/\n      $posix_glob set -f\n      set fnord $dstdir\n      shift\n      $posix_glob set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n\ttest X\"$d\" = X && continue\n\n\tprefix=$prefix$d\n\tif test -d \"$prefix\"; then\n\t  prefixes=\n\telse\n\t  if $posix_mkdir; then\n\t    (umask=$mkdir_umask &&\n\t     $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n\t    # Don't fail if two instances are running concurrently.\n\t    test -d \"$prefix\" || exit 1\n\t  else\n\t    case $prefix in\n\t      *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n\t      *) qprefix=$prefix;;\n\t    esac\n\t    prefixes=\"$prefixes '$qprefix'\"\n\t  fi\n\tfi\n\tprefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n\t# Don't fail if two instances are running concurrently.\n\t(umask $mkdir_umask &&\n\t eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n\t  test -d \"$dstdir\" || exit 1\n\tobsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=$dstdir/_inst.$$_\n    rmtmp=$dstdir/_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"\t2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"\t2>/dev/null` &&\n\n       eval \"$initialize_posix_glob\" &&\n       $posix_glob set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       $posix_glob set +f &&\n\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n\t# Now remove or move aside any old file at destination location.\n\t# We try this two ways since rm can't unlink itself on some\n\t# systems and the destination file might be busy for other\n\t# reasons.  In this case, the final cleanup might fail but the new\n\t# file should still install successfully.\n\t{\n\t  test ! -f \"$dst\" ||\n\t  $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n\t  { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n\t    { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n\t  } ||\n\t  { echo \"$0: cannot unlink or rename $dst\" >&2\n\t    (exit 1); exit 1\n\t  }\n\t} &&\n\n\t# Now rename the file to the real destination.\n\t$doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/libdir/pkgconfig/srecord.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nbindir=@bindir@\nlibdir=@libdir@\nmandir=@mandir@\ndatarootdir=@datarootdir@\nincludedir=@includedir@\n\nName: srecord\nDescription: Manipulate EPROM load files\nVersion: 1.64.D001\nURL: http://srecord.sourceforge.net\nLibs: -L${libdir} -lsrecord\nLibs.private: @LIBS@\nCflags: -I${includedir}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man1/srec_cat.1",
    "content": "'\\\" t\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 1998, 2000-2014 Peter Miller\n.\\\" Copyright (C) 2014 Scott Finneran\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_cat\n.TH \\*(n) 1 SRecord \"Reference Manual\"\n.SH NAME\nsrec_cat \\- manipulate EPROM load files\n.if require_index \\{\n.XX \"srec_cat(1)\" \"Manipulate EPROM load files\"\n.\\}\n.SH SYNOPSIS\n.B \\*(n)\n[\n.IR option \\&...\n]\n.IR filename \\&...\n.br\n.B \\*(n)\n.B \\-Help\n.br\n.B \\*(n)\n.B \\-VERSion\n.SH DESCRIPTION\nThe\n.I \\*(n)\nprogram is used to assemble the given input files into a single output\nfile.\nThe use of filters (see below) allows significant manipulations to be\nperformed by this command.\n.SS Data Order\nThe data from the input files is not immediately written to the output,\nbut is stored in memory until the complete EPROM image has been\nassembled.  Data is then written to the output file in ascending address\norder.  The original ordering of the data (in those formats capable of\nrandom record ordering) is \\f[I]not\\fP preserved.\n.SS Data Comparison\nBecause input record order is not preserved, textual comparison of input\nand output (such as the \\f[I]diff\\fP(1) or \\f[I]tkdiff\\fP(1) commands)\ncan be misleading.\nNot only can lines appear in different address orders, but line lengths\nand line termination can differ as well.\nUse the \\f[I]srec_cmp\\fP(1) program to compare two EPROM load files.\nIf a text comparison is essential, run both files through the\n\\f[I]srec_cat\\fP(1) program to ensure both files to be compared have\nidentical record ordering and line lengths.\n.SS Data Conflicts\nThe storing of data in memory enables the detection of data conflicts,\ntypically caused by linker sections unintentionally overlapping.\n.TP 2n\n\\[bu]\nA warning will be issued for each address which is redundantly set to the\nsame value.\n.TP 2n\n\\[bu]\nA fatal error will be issued if any address is set with\ncontradictory values.\nTo avoid this error use an \\fB\\-exclude \\-within\\fP filter\n(see \\f[I]srec_input\\fP(1)) or, to make it a warning, use the\n\\fB\\-contradictory\\[hy]bytes\\fP option (see below).\n.TP 2n\n\\[bu]\nA warning will be issued for input files where the data records are not\nin strictly ascending address order.  To suppress this warning, use the\n\\fB\\-disable\\[hy]sequence\\[hy]warning\\fP option (see below).\n.PP\nThese features are designed to detect problems which are difficult to\ndebug, and detects them \\f[I]before\\fP the data is written to an EPROM\nand run in your embedded system.\n.so man/man1/o_input.so\n.br\n.ne 1i\n.SH OPTIONS\nThe following options are understood:\n.so man/man1/o_at.so\n.TP 8n\n\\fB\\-Output\\fP \\f[I]filename\\fP [ \\f[I]format\\fP ]\n.RS\nThis option may be used to specify the output file to be used.\nThe special file name \\[lq]\\-[rq] is understood to mean the standard output.\nOutput defaults to the standard output if this option is not used.\n.PP\nThe \\f[I]format\\fP may be specified as:\n.\\\" -----   --output -A* ---------------------------------------------------\n.TP 8n\n\\fB\\-Absolute_Object_Module_Format\\fP\nAn Intel Absolute Object Module Format file will be written.\n(See\n.IR srec_aomf (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-Ascii_Hex\\fP\nAn Ascii\\[hy]Hex file will be written.\n(See\n.IR srec_ascii_hex (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-ASM\\fP [ \\f[I]prefix\\fP ][ \\-\\f[I]option\\fP... ]\n.RS\nA series of assembler DB statements will be written.\n.PP\nThe optional \\f[I]prefix\\fP may be specified to change the names of the\nsymbols generated.  The defaults to \"\\f[CW]eprom\\fP\" if not set.\n.PP\nSeveral options are available to modify the style of output:\n.TP 8n\n\\fB\\-Dot_STyle\\fP\nUse \"dot\" style pseudo\\[hy]ops instead of words.\nFor example \\f[CW].byte\\fP instead of the \\f[CW]DB\\fP default.\n.TP 8n\n\\fB\\-HEXadecimal_STyle\\fP\nUse hexadecimal numbers in the output,\nrather than the default decimal numbers.\n.TP 8n\n\\fB\\-Section_STyle\\fP\nBy default the generated assemble of placed at the correct address using\n\\f[CW]ORG\\fP pseudo\\[hy]ops.  Section style output emits tables of section\naddresses and lengths, so the data may be related at runtime.\n.TP 8n\n\\fB\\-A430\\fP\nGenerate output which is compliant to the \\f[CW]a430.exe\\fP compiler as\nit is used, \\f[I]e.g.\\fP in IAR Embedded Workbench.\nThis is short\\[hy]hand for \\-section\\[hy]style \\-hex\\[hy]style\n.TP 8n\n\\fB\\-CL430\\fP\nGenerate  output which is Code Composer Essentials compliant,\n\\f[I]i.e.\\fP the compiler of it.\nThis is short\\[hy]hand for \\-section\\[hy]style \\-hex\\[hy]style \\-dot\\[hy]style\n.TP 8n\n\\fB\\-Output_Word\\fP\nGenerate output which is in two\\[hy]byte words rather than bytes.\nThis assumes little\\[hy]endian words; you will need to use the\n\\-Byte\\[hy]Swap filter if your target is big\\[hy]endian.  No attempt\nis made to align the words onto even address boundaries; use and input\nfilter such as\n.nf\n.in +8n\n\\f[I]input\\[hy]file\\fP \\-fill 0xFF \\-within \\f[I]input\\[hy]file\\fP\n\\-range\\[hy]pad 2\n.in -8n\n.fi\nto pad the data to whole words first.\n.RE\n.TP 8n\n\\fB\\-Atmel_Generic\\fP\nAn Atmel Generic file will be written.\n(See\n.IR srec_atmel_generic (5)\nfor a description of this file format.)\n.\\\" -----   --output -B*   -------------------------------------------------\n.TP 8n\n\\fB\\-BASic\\fP\nA series of BASIC DATA statements will be written.\n.TP 8n\n\\fB\\-B\\[hy]Record\\fP\nA Freescale MC68EZ328 Dragonball bootstrap b\\[hy]record format file will\nbe written.\n(See\n.IR srec_brecord (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-Binary\\fP\nA raw binary file will be written.\nIf you get unexpected results \\f[B]please\\fP see the\n\\f[I]srec_binary\\fP(5) manual for more information.\n.\\\" -----   --output -C*   -------------------------------------------------\n.TP 8n\n\\fB\\-C\\[hy]Array\\fP [ \\f[I]identifier\\fP ][ \\-\\f[I]option\\fP... ]\n.RS\nA C array defintion will be written.\n.PP\nThe optional \\f[I]identifier\\fP is the name of the variable to be defined,\nor \\f[CW]bugus\\fP if not specified.\n.TP 8n\n\\fB\\-INClude\\fP\nThis option asks for an include file to be generated as well.\n.TP 8n\n\\fB\\-No\\[hy]CONST\nThis options asks for the variables to not use the const\nkeyword (they are declared constant be default, so that they are placed\ninto the read\\[hy]only segment in embedded systems).\n.TP 8n\n\\fB\\-C_COMpressed\\fP\nThese options ask for an compressed c\\[hy]array whose memory\ngaps will not be filled.\n.TP 8n\n\\fB\\-Output_Word\\fP\nThis option asks for an output which is in words not in\nbytes.  This is little endian, so you may need to\n.TP 8n\n\\fB\\-PREfix\\fP \\f[I]string\\fP\nThis option allows a string to be prepended to the array definition. This\nis commonly used for non\\[hy]standard options common to cross compilers.\n.TP 8n\n\\fB\\-POSTfix\\fP \\f[I]string\\fP\nThis option allows a string to be appended to the array definition. This\nis commonly used for non\\[hy]standard options common to cross compilers.\n.RE\n.TP 8n\n\\fB\\-COE\\fP\nThis option says to use the\nXilinx Coefficient File Format (.coe) for output.\n(See \\f[I]srec_coe\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-COsmac\\fP\nAn RCA Cosmac Elf format file will be written.\n(See \\f[I]srec_cosmac\\fP(5) for a description of this file format.)\n.\\\" -----   --output -D*   -------------------------------------------------\n.TP 8n\n\\fB\\-Dec_Binary\\fP\nA DEC Binary (XXDP) format file will be written.\n(See\n.IR srec_dec_binary (5)\nfor a description of this file format.)\n.\\\" -----   --output -E*   -------------------------------------------------\n.TP 8n\n\\fB\\-Elektor_Monitor52\\fP\nThis option says to use the EMON52 format file when writing the file.\n(See\n.IR srec_emon52 (5)\nfor a description of this file format.)\n.\\\" -----   --output -F*   -------------------------------------------------\n.TP 8n\n\\fB\\-FAIrchild\\fP\nThis option says to use the Fairchild Fairbug format file when writing the file.\n(See \\f[I]srec_fairchild\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-Fast_Load\\fP\nThis option says to use the LSI Logic Fast Load format file when writing\nthe file.\n(See \\f[I]srec_fastload\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-Formatted_Binary\\fP\nA Formatted Binary format file will be written.\n(See \\f[I]srec_formatted_binary\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-FORTH\\fP [ \\-\\f[I]option\\fP ]\n.RS\nA FORTH input file will be written.\nEach line of output includes a byte value, an address, and a command.\n.TP 8n\n\\fB\\-RAM\\fP\nThe store command is C!\nThis is the default.\n.TP 8n\n\\fB\\-EEPROM\nThe store command is EEC!\n.RE\n.TP 8n\n\\fB\\-Four_Packed_Code\\fP\nThis option says to use the PFC format file when writing the file.\n(See\n.IR srec_fpd (5)\nfor a description of this file format.)\n.\\\" -----   --output -G*   -------------------------------------------------\n.\\\" -----   --output -H*   -------------------------------------------------\n.TP 8n\n\\fB\\-HEX_Dump\nA human readable hexadecimal dump (including ASCII)\nwill be printed.\n.\\\" -----   --output -I*   -------------------------------------------------\n.TP 8n\n\\fB\\-IDT\\fP\nAn IDT System Integration Manager (IDT/sim) binary file will be written.\n(See \\f[I]srec_idt\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-Intel\\fP\nAn Intel hex format file will be written.\n(See\n.IR srec_intel (5)\nfor a description of this file format.)\nThe default is to emit \\[lq]i32hex\\[rq] 32\\[hy]bit linear addressing;\nif you want \\[lq]i16hex\\[rq] 20\\[hy]bit extended segment addressing\nuse the \\fB\\-address\\[hy]length=3\\fP option,\nif you want \\[lq]i8hex\\[rq] 16\\[hy]bit addressing\nuse the \\fB\\-address\\[hy]length=2\\fP option.\n.TP 8n\n\\fB\\-Intel_HeX_16\\fP\nAn Intel\\[hy]16 hex format (INHX16) file will be written.\n(See\n.IR srec_intel16 (5)\nfor a description of this file format.)\n.\\\" -----   --output -J*   -------------------------------------------------\n.\\\" -----   --output -K*   -------------------------------------------------\n.\\\" -----   --output -L*   -------------------------------------------------\n.TP 8n\n\\fB\\-Lattice_Memory_Initialization_Format [ \\f[I]width\\fP ]\nThe Memory Initialization Format (.mem) by Lattice Semiconductor is\nunderstood for writing only.  (A.k.a. \\fB\\-MEM\\fP)\n(See \\f[I]srec_mem\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-LOGisim\nLOginsim logic simuator uses the format\nSee \\fB\\-srec_logisim\\fP(5) form more information.\n.\\\" -----   --output -M*   -------------------------------------------------\n.TP 8n\n\\fB\\-Memory_Initialization_File\\fP [ \\f[I]width\\fP ]\nMemory Initialization File (MIF) by Altera format will be written.\nThe \\f[I]width\\fP defaults to 8 bits.\n(See \\f[I]srec_mif\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-Mips_Flash_Big_Endian\\fP\n.TP 8n\n\\fB\\-Mips_Flash_Little_Endian\\fP\nMIPS Flash file format will be written.\n(See \\f[I]srec_mips_flash\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-MOS_Technologies\\fP\nAn Mos Technologies format file will be written.\n(See\n.IR srec_mos_tech (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-Motorola\\fP [ \\f[I]width\\fP ]\n.RS\nA Motorola S\\[hy]Record file will be written.\n(See\n.IR srec_motorola (5)\nfor a description of this file format.)\nThis is the default output format.\nBy default, the smallest possible address length is emitted,\nthis will be S19 for data in the first 64KB;\nif you wish to force S28 use the \\fB\\-address\\[hy]length=3\\fP option;\nif you wish to force S37 use the \\fB\\-address\\[hy]length=4\\fP option\n.PP\nThe optional \\f[I]width\\fP argument describes the number of bytes which\nform each address multiple.  For normal uses the default of one (1) byte\nis appropriate.  Some systems with 16\\[hy]bit or 32\\[hy]bit targets mutilate the\naddresses in the file; this option will imitate that behavior.\nUnlike most other parameters, this one cannot be guessed.\n.RE\n.TP 8n\n\\fB\\-MsBin\\fP\nThis option says to use the Windows CE Binary Image Data Format to\nwrite the file.  See \\f[I]srec_msbin\\fP(5) for a description of this\nfile format.\n.\\\" -----   --output -N*   -------------------------------------------------\n.TP 8n\n\\fB\\-Needham_Hexadecimal\\fP\nThis option says to use the Needham Electronics ASCII file format to\nwrite the file.  See \\f[I]srec_needham\\fP(5) for a description of this\nfile format.\n.\\\" -----   --output -O*   -------------------------------------------------\n.TP 8n\n\\fB\\-Ohio_Scientific\\fP\nThis option says to use the Ohio Scientific hexadecimal format.\nSee \\f[I]srec_os65v\\fP(5) for a description of this format.\n.\\\" -----   --output -P*   -------------------------------------------------\n.TP 8n\n\\fB\\-PPB\\fP\nThis option says to use the Stag Prom Programmer binary format.\nSee \\f[I]srec_ppb\\fP(5) for a description of this format.\n.TP 8n\n\\fB\\-PPX\\fP\nThis option says to use the Stag Prom Programmer hexadecimal format.\nSee \\f[I]srec_ppx\\fP(5) for a description of this format.\n.\\\" -----   --output -Q*   -------------------------------------------------\n.\\\" -----   --output -R*   -------------------------------------------------\n.\\\" -----   --output -S*   -------------------------------------------------\n.TP 8n\n\\fB\\-SIGnetics\\fP\nThis option says to use the Signetics hex format.\nSee \\f[I]srec_signetics\\fP(5) for a description of this format.\n.TP 8n\n\\fB\\-SPAsm\\fP\nThis option says to use the SPASM assembler output format (commonly used\nby PIC programmers).\nSee \\f[I]srec_spasm\\fP(5) for a description of this format.\n.TP 8n\n\\fB\\-SPAsm_Little_Endian\\fP\nThis option says to use the SPASM assembler output format (commonly used\nby PIC programmers).  But with the data the other way around.\n.TP 8n\n\\fB\\-STewie\\fP\nA Stewie binary format file will be written.\n(See\n.IR srec_stewie (5)\nfor a description of this file format.)\n.\\\" -----   --output -T*   -------------------------------------------------\n.TP 8n\n\\fB\\-Tektronix\\fP\nA Tektronix hex format file will be written.\n(See\n.IR srec_tektronix (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-Tektronix_Extended\\fP\nA Tektronix extended hex format file will be written.\n(See\n.IR srec_tektronix_extended (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-Texas_Instruments_Tagged\\fP\nA TI\\[hy]Tagged format file will be written.\n(See\n.IR srec_ti_tagged (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-Texas_Instruments_Tagged_16\\fP\nA Texas Instruments SDSMAC 320 format file will be written.\n(See\n.IR srec_ti_tagged_16 (5)\nfor a description of this file format.)\n.TP 8n\n\\fB\\-Texas_Instruments_TeXT\\fP\nThis option says to use the Texas Instruments TXT (MSP430) format to\nwrite the file.  See \\f[I]srec_ti_txt\\fP(5) for a description of this\nfile format.\n.TP 8n\n\\fB\\-TRS80\\fP\nThis option says to use the Radio Shack TRS\\[hy]80 object file format\nto write the file.  See \\f[I]srec_trs80\\fP(5) for a description of this\nfile format.\n.\\\" -----   --output -U*   -------------------------------------------------\n.\\\" -----   --output -V*   -------------------------------------------------\n.TP 8n\n\\fB\\-VHdl\\fP [ \\f[I]bytes\\[hy]per\\[hy]word\\fP [ \\f[I]name\\fP ]]\nA VHDL format file will be written.\nThe \\f[I]bytes\\[hy]per\\[hy]word\\fP defaults to one,\nthe \\f[I]name\\fP defaults to \\f[CW]eprom\\fP.\nThe \\f[I]etc/x_defs_pack.vhd\\fP file in the source distribution contains an\nexample ROM definitions pack for the type\\[hy]independent output.\nYou may need to use the \\-byte\\[hy]swap filter to get the byte order you want.\n.TP 8n\n\\fB\\-VMem\\fP [ \\f[I]memory\\[hy]width\\fP ]\nA Verilog VMEM format file will be written.\nThe \\f[I]memory\\[hy]width\\fP may be 8, 16, 32, 64 or 128 bits;\n.\\\"\n.\\\" The default number of bits is 32.\n.\\\" If you change this, you must also change the following files:\n.\\\"     lib/srec/arglex_output.cc\n.\\\"     lib/srec/output/file/vmem.cc\n.\\\"\ndefaults to 32 if unspecified.\n(See \\f[I]srec_vmem\\fP(5) for a description of this file format.)\nYou may need to use the \\-byte\\[hy]swap filter to get the byte order you want.\n.\\\" -----   --output -W*   -------------------------------------------------\n.TP 8n\n\\fB\\-WILson\\fP\nA wilson format file will be written.\n(See\n.IR srec_wilson (5)\nfor a description of this file format.)\n.\\\" -----   --output -X*   -------------------------------------------------\n.\\\" -----   --output -Y*   -------------------------------------------------\n.\\\" -----   --output -Z*   -------------------------------------------------\n.RE\n.\\\" ----------  A  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Address_Length\\fP \\f[I]number\\fP\nThis option many be used to specify the minimum number of bytes to be\nused in the output to represent an address (padding with leading zeros\nif necessary).\nThis helps when talking to imbecilic EPROM programmer devices which do not\nfully implement the format specification.\n.\\\" ----------  B  ---------------------------------------------------------\n.\\\" ----------  C  ---------------------------------------------------------\n.TP 8n\n.B \\-CRLF\nThis option is short\\[hy]hand for the \\fB\\-line\\[hy]termination=crlf\\fP option.\nFor use with hare\\[hy]brained EPROM programmer devices which assume all the\nworld uses Evil Bill's operating system's line termination.\n.\\\" ----------  D  ---------------------------------------------------------\n.TP 8n\n.B \\-Data_Only\nThis option implies the \\fB\\-disable=header\\fP,\n\\fB\\-disable=data\\[hy]count\\fP, \\fB\\-disable=exec\\[hy]start\\[hy]address\\fP and\n\\fB\\-disable=footer\\fP options.\n.TP 8n\n.B \\-DISable\\fP \\f[I]feature\\[hy]name\\fP\nThis option is used to disable the output of a named feature.\nSee the \\fB\\-enable\\fP option for a description of the available features.\n.\\\" ----------  E  ---------------------------------------------------------\n.TP 8n\n.B \\-ENable\\fP \\f[I]feature\\[hy]name\\fP\n.RS\nThis option is used to enable the output of a named feature.\n.TP 8n\nHeader\nThis feature controls the presence of header records, records which\nappear before the data itself.\nHeaders often, but not always, include descriptive text.\n.TP 8n\nExecution_Start_Address\nThis feature controls the presence of execution start address records,\nwhich is where the monitor will jump to and start executing code once\nthe hex file has finished loading.\n.TP 8n\nData_Count\nThis feature controls the presence of data record count records, which\nappear aftre the data, and state how many data records preceeded them.\nUsually a data integrity mechanism.\n.TP 8n\nFooter\nThis feature controls the presence of a file termination record,\none that \\f[I]does not\\fP double as an execution start address record.\n.TP\nOptional_Address\nIn formats that have the address and the data separated or partially\nseparated (as opposed to having a complete address in every record) it\nis possible to disable emitting the first address where that address\nwould be zero, as these format often default the address to zero if\nno address is seen beofre the first data record.  This is disabled by\ndefault, the zero address is always emitted.\n.PP\nNot all formats have all of the above features.\nNot all formats are able to optionally omit any or all the above features.\nFeature names may be abbreviated like command line option names.\n.RE\n.TP 8n\n\\fB\\-Execution_Start_Address\\fP \\f[I]number\\fP\n.RS\nThis option may be used to set the execution start address,\nin those formats which support it.\nThe execution start address is where the monitor will jump to and start\nexecuting code once the hex file has finished loading,\nthink of it as a \\[lq]goto\\[rq] address.\nUsually ignored by EPROM programmer devices.\nThis option implies the \\fB\\-enable=exec\\[hy]start\\[hy]addr\\fP option.\n.PP\nPlease note: the execution start address is a different concept than the\nfirst address in memory of your data.  If you want to change where your\ndata starts in memory, use the \\fB\\-offset\\fP filter.\n.RE\n.\\\" ----------  F  ---------------------------------------------------------\n.\\\" ----------  G  ---------------------------------------------------------\n.\\\" ----------  H  ---------------------------------------------------------\n.TP 8n\n\\fB\\-HEAder\\fP \\f[I]string\\fP\n.RS\nThis option may be used to set the header comment,\nin those formats which support it.\nThis option implies the \\fB\\-enable=header\\fP option.\n.PP\nIf you need to inject binary data into the header, use the URL encoding\nthat uses % followed by two hexadeimal characters.  For example a\nbackspace would be encoded as \\[lq]%08\\[rq].\n.RE\n.\\\" ----------  I  ---------------------------------------------------------\n.TP 8n\n\\fB\\-IGnore_Checksums\\fP\n.so man/man1/o_ignore_checksums.so\n.\\\" ----------  J  ---------------------------------------------------------\n.\\\" ----------  K  ---------------------------------------------------------\n.\\\" ----------  L  ---------------------------------------------------------\n.TP\n\\fB\\-Line_Termination \\f[I]style\\[hy]name\\fP\n.RS\nThis option may be used to specify line termination style for text\noutput.  The default is to use the host operating system's default line\ntermination style (but Cygwin behaves as if it's Unix).  Use this option with\ncaution, because it will also introduce extra (i.e. wrong) CR bytes into\nbinary formats.\n.TP 4n\nCarriage_Return_Line_Feed\nUse the CRLF line termination style, typical of DOS and M$ Windows.\n.TP 4n\nNewLine\nUse the NL line termination style, typical of Unix and Linux.\n.TP 4n\nCarriage_Return\nUse the CR line termination style, typical of Apple Macintosh.\n.PP\nAll other line termination style names will produce a fatal error.\nStyle names may be abbreviated like command line option names.\n.RE\n.\\\" ----------  L  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Line_Length\\fP \\f[I]number\\fP\nThis option may be used to limit the length of the output lines to at\nmost \\f[I]number\\fP characters.  (Not meaningful for binary file format.)\nDefaults to something less than 80 characters, depending on the format.\nIf you need to control the maximum number of bytes in each output record,\nuse the \\fB\\-\\-Ouput_Block_Size\\fP option.\n.\\\" ----------  M  ---------------------------------------------------------\n.\\\" ----------  N  ---------------------------------------------------------\n.\\\" ----------  O  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Output_Block_Size\\fP \\f[I]number\\fP\nThis option may be used to specify the exact number of data bytes to\nappear in each output record.  There are format\\[hy]specific limitations on\nthis value, you will get an error if the value isn't valid.\nIf you need to control the maximum number of characters on a line of\ntext output, use the \\fB\\-\\-Line_Length\\fP option.\n.TP 8n\n\\fB\\-Output_Block_Packing\\fP\nFrom time to time, with large files, you may notice that your data\nrecords are spit unexpectedly on output.  This usually happens where\nrecord lengths are not a power of 2.  If this bothers you (or your\ncomparison tools) this option may be used to repack the output so that\nSRecord's internal block boundaries are not visable in the output.\n.\\\" ----------  O  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Output_Block_Alignment\\fP\nThis option is similar to the \\fB\\-Output_Block_Packing\\fP option,\nexcept that short records are used after holes to cause subsequent\nrecords to be placed on a block size boundary.\n.\\\" ----------  R  ---------------------------------------------------------\n.\\\" ----------  S  ---------------------------------------------------------\n.so man/man1/o_sequence.so\n.\\\" ----------  T  ---------------------------------------------------------\n.\\\" ----------  U  ---------------------------------------------------------\n.\\\" ----------  V  ---------------------------------------------------------\n.\\\" ----------  W  ---------------------------------------------------------\n.\\\" ----------  X  ---------------------------------------------------------\n.\\\" ----------  Y  ---------------------------------------------------------\n.\\\" ----------  Z  ---------------------------------------------------------\n.PP\nAll other options will produce a diagnostic error.\n.so man/man1/z_options.so\n.so man/man1/z_exit.so\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man1/srec_cmp.1",
    "content": "'\\\" t\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 1998, 2000, 2001, 2005-2009, 2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_cmp\n.TH \\*(n) 1 SRecord \"Reference Manual\"\n.SH NAME\nsrec_cmp \\- compare two EPROM load files for equality\n.if require_index \\{\n.XX \"srec_cmp(1)\" \"Compare two EPROM load files for equality\"\n.\\}\n.SH SYNOPSIS\n.B \\*(n)\n[\n.IR option \\&...\n]\n.IR filename \\&...\n.br\n.B \\*(n)\n.B \\-Help\n.br\n.B \\*(n)\n.B \\-VERSion\n.SH DESCRIPTION\nThe\n.I \\*(n)\nprogram is used to compare two EPROM load files for equality.  This\ncomparison is performed irrespective of the load order of the data in\neach of the files.\n.so man/man1/o_input.so\n.br\n.ne 1i\n.SH OPTIONS\nThe following options are understood:\n.so man/man1/o_at.so\n.TP 8n\n.B \\-Help\n.br\nProvide some help with using the\n.I \\*(n)\nprogram.\n.TP 8n\n\\fB\\-IGnore_Checksums\\fP\n.so man/man1/o_ignore_checksums.so\n.so man/man1/o_sequence.so\n.so man/man1/o_multiple.so\n.TP 8n\n.B \\-VERSion\n.br\nPrint the version of the\n.I \\*(n)\nprogram being executed.\n.TP 8n\n.B \\-Verbose\n.br\nThis option may be used to obtain more information about how and where\nthe two files differ.  Please note that this takes longer, and the output\ncan be voluminous.\n.PP\nAll other options will produce a diagnostic error.\n.so man/man1/z_options.so\n.so man/man1/z_exit.so\n.SH EXAMPLE\nA common use for the \\fI\\*(n)\\fP command is to verify that a particular\nsignature is present in the code.  In this example, the signature is\nin a file called \\[lq]signature[rq], and the EPROM image is in a file\ncalled \\[lq]image[rq].  We assume they are both Motorola S\\[hy]Record format,\nalthough this will work for all formats:\n.sp 0.25\n.RS\n.ft CW\n\\*(n) signature  image \\-crop \\-within signature\n.ft R\n.RE\n.sp 0.25\nThe signature need not be at the start of memory, nor need it be one\nsingle contiguous piece of memory.  In the above example, the portions\nof the image which have the same address range as the signature are\ncompared with the signature.\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man1/srec_examples.1",
    "content": "'\\\" t\n.\\\" srecord - The \"srecord\" program.\n.\\\" Copyright (C) 2007-2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_cat\n.TH srec_examples 1 SRecord \"Reference Manual\"i\n.SH NAME\nsrec_examples \\- examples of how to use SRecord\n.if require_index \\{\n.XX \"srec_examples(1)\" \"Examples of how to use SRecord\"\n.\\}\n.SH DESCRIPTION\nThe \\f[I]srec_cat\\fP command is very powerful, due to the ability to combine\nthe the input filters in almost unlimited ways.\nThis manual page describes a few of them.\n.PP\nThis manual page describes how to use the various input files, input\nfilters and input generators.  But these are only examples, for more\ncomplete details, see the \\f[I]srec_input\\fP(1) manual page.\n.SS The Commands Lines Are Too Long\n.\\\" stupid synonym: absurd\nIf you are marooned on an operating system with absurdly short command\nline length limits, some of the commands which follow may be too long.\n.\\\" stupid synonym: handicap\nYou can get around this handicap by placing your command line in a file,\nsay \\f[I]fred.txt\\fP, and then tell \\f[I]srec_cat\\fP(1) to read this\nfile for the rest of its command line, like this\n.PP\n.RS\n.ft CW\nsrec_cat @fred.txt\n.ft R\n.RE\n.PP\nThis also has the advantage of allowing comments, allowing you to write\nyour command line options over several lines, and even indenting to\nmake the command more clear.  Comments start at a \\[lq]\\fB#\\fP\\[rq] and\nextend to the end of the line.  Blank lines are ignored.\n.PP\n.nr y4 \\n[yr]+1900\n.nr yd \\n[y4]-1992\n.\\\" stupid synonym: sucking, sucks, sux\nOf course, you could always upgrade to Linux, which has been sucking\nless for over \\n[yd] years now.\n.SS Your Examples Wanted\nIf you have a clever way of using SRecord, or have solved a difficult\nproblem with SRecord, you could contribute to this manual page, making\nit more useful for everyone.  Send your example in an email to the\nemail address at the end of this manual page.\n.SH CONVERTING FILE FORMATS\nThe simplest of the things \\f[I]srec_cat\\fP(1) can do is convert from\none EPROM file format to another.  Please keep in mind, as you read this\nsection, that you can do many of these things simultaneously in one\ncommand.  They are only broken out separately to make them easier to\nunderstand.\n.SS Intel to Motorola\nOne of the simplest examples is converting files from Intel hex format\nto Motorola S\\[hy]Record format:\n.PP\n.RS\n.ft CW\nsrec_cat \\f[I]intel\\[hy]file\\fP \\-intel \\-o \\f[I]srec\\[hy]file\\fP\n.ft R\n.RE\n.PP\nNote that the format specifier immediately follows the name of the file\nit is describing.\nPick any two formats that SRecord understands,\nand it can convert between all of them.\n(Except the assembler, BASIC, C and FPGA outputs which are write only.)\n.SS Motorola to Intel\nConverting the other way is just as simple:\n.PP\n.RS\n.ft CW\nsrec_cat \\f[I]srec\\[hy]file\\fP \\-o \\f[I]intel\\[hy]file\\fP \\-intel\n.ft R\n.RE\n.PP\nThe default format is Motorola S\\[hy]Record format,\nso it does not need to be specified after the file name.\n.SS Different Shapes of the Same Format\n.\\\" stupid synonym: addle-pated\nIt is regrettably common that some addle\\[hy]pated EPROM programmers only\nimplement a portion of the specification used to represent their hex\nfiles.  For example, some compilers produce \\[lq]s19\\[rq] Motorola\ndata (that is, S1 data records with S9 start records, 16 bit address\n.\\\" stupid synonym: blockhead\nfields) which would be OK except that some blockhead EPROM programmers insist\non \\[lq]s37\\[rq] Motorola data (that is, S3 data records with S7 start\nrecords, 32 bit address fields).\n.PP\nIt is possible to convert from one Motorola shape to another using the\n\\fB\\-Address\\[hy]Length\\fP option:\n.PP\n.RS\n.ft CW\nsrec_cat short.srec \\-o long.srec \\-address\\[hy]length=4\n.ft R\n.RE\n.PP\nThis command says to use four byte (32\\[hy]bit) addresses on output.\n.PP\nThis section also applies to Intel hex files, as they, too, have the\nability to select from a variety of address widths.\nTo convert from one Intel shape to another using the\nsame \\fB\\-Address\\[hy]Length\\fP option:\n.PP\n.RS\n.ft CW\nsrec_cat i32.hex \\-o i16.hex \\-address\\[hy]length=3\n.ft R\n.RE\n.PP\nThis command says to use \\[lq]i16hex\\[rq] 20\\[hy]bit segmented addresses on\noutput.  An address length of 4 is the default (\\[lq]i32hex\\[rq] 32\\[hy]bit\nlinear addressing), and an address length of 2 would request \\[lq]i8hex\\[rq]\n16\\[hy]bit addressing.\n.SS Line Lengths\n.\\\" stupid synonym: feeble-minded\nFrom time to time you will come across a feeble\\[hy]minded EPROM\nprogrammer that can't cope with long text lines, they assume that there\nwill only ever be 46 characters per line and barf when they\nsee the default line lengths that \\f[I]srec_cat\\fP(1) writes (or worse,\nget a stack scribble and crash).\n.PP\nThe Motorola S\\[hy]record format definition permits up to 255 bytes of\npayload, or lines of \\f[I]514\\fP characters, plus the line termination.\nAll EPROM programmers \\f[I]should\\fP have sufficiently large\nline buffers to cope with records this big.  Few do.\n.PP\nThe \\-line\\[hy]length option may be used to specify the maximum line length\n(not including the newline) to be used on output.\nFor example, 16 byte payloads for Motorola hex\n.PP\n.RS\n.ft CW\nsrec_cat long.srec \\-o short.s19 \\-line\\[hy]length=46\n.ft R\n.RE\n.PP\nThe line length option interacts with the address length option, so some\ntinkering to optimize for your particular situation many be necessary.\n.SS Output Block Size\n.\\\" stupid synonym: daft\nEvery once in a while you will come across an ancient daft EPROM\nprogrammer that can't cope with long data records, they assume that\nthere will only ever be at most 16 bytes of data per record, and barf\nwhen they see the default 32 byte payloads that \\f[I]srec_cat\\fP(1)\nwrites (or worse, the buffer over\\[hy]run causes a tall grass walk that\nscribbles on your EPROM).\n.PP\nThe Intel hex format definition permits up to 255 bytes of payload data\nper record.  All EPROM programmers \\f[I]should\\fP have sufficiently\nlarge data buffers to cope with records this big.  Good luck with that.\n.PP\nThe \\-Output\\[hy]Block\\[hy]Size option may be used to specify the record\ndata size to be used on output.  For example, Intel hex with 16 byte payloads:\n.PP\n.RS\n.ft CW\nsrec_cat long.srec \\-o short.hex \\-intel \\-obs=16\n.ft R\n.RE\n.PP\nBe careful not to put the \\fB\\-obs\\fP option between the output file\nname and the format specifier.\n.SS Just the Data, Please\n.\\\" stupid synonym: bonehead\nThere are some bonehead EPROM programmers which can only cope with data\nrecords, and are unable to cope with header records or execution start\naddress records.  If you have this problem, the \\fB\\-data\\[hy]only\\fP option\ncan be used to suppress just about everything except the data.  The\nactual effect depends on the format, of course, because some don't have\nthese features anyway.\n.PP\nThe \\f[B]\\-data\\[hy]only\\fP option is short hand.  There are four properties\nwhich may be \\fB\\-disabled\\fP or \\fB\\-enabled\\fP separately.  See the\n\\f[I]srec_cat\\fP(1) man page for a description of the \\fB\\-disabled\\fP\nand \\f[B]\\-enabled\\fP options.\n.PP\n.\\\" stupid synonym: Neanderthal\nFor example, your neanderthal EPROM programmer requires Motorola hex\nwith header records (S0), but without data count (S5) records.  Not\nusing the \\fB\\-data\\[hy]only\\fP option has it barf on the data count\nrecord, but using the \\fB\\-data\\[hy]only\\fP option has it barf on the\nmissing header record.  Using the \\fB\\-disable=data\\[hy]count\\fP option\nwould leave the header record intact while suppressing the data count\nrecord.\n.SS Data Headers\nThe \\f[I]srec_cat\\fP(1) command always tries to pass through header\nrecords unchanged, whenever they are present.\nIt even tries preserve them across file format changes,\nto the limit the file formats are capable of.\n.PP\nIf there is no file header record and you would like to add one,\nor you wish to override an existing file header record, use the\n\\fB\\-header\\fP=\\f[I]string\\fP option.  You will need to quote the\nstring (to insulate it from the shell) if it contains spaces or shell\nmeta\\[hy]characters.\n.SS Execution Start Addresses\nThe \\f[I]srec_cat\\fP(1) command always tries to pass through execution\nstart addresses (typically occurring at the end of the file), whenever\nthey are present.  They are adjusted along with the data records by the\n\\fB\\-offset\\fP filter.  It even tries preserve them across file format\nchanges, to the limit the file formats are capable of.\n.PP\nIf there is no execution start address record and you would like to add one,\nor you wish to override an existing execution start address record, use the\n\\fB\\-execution\\[hy]start\\[hy]address\\fP=\\f[I]number\\fP option.\n.PP\nPlease note: the execution start address is a different concept than the\nfirst address in memory of your data.  Think of it as a \\[lq]goto\\[rq]\naddress to be jumped to by the monitor when the hex load is complete.\nIf you want to change where your data starts in memory, use the\n\\fB\\-offset\\fP filter.\n.SS Fixing Checksums\n.\\\" stupid synonym: featherbrain, featherbrained, feather-brain, feather-brained\nSome embedded firmware developers are saddled with featherbrained tools\nwhich produce incorrect checksums, which the more vigilant models of\nEPROM programmer will not accept.\n.PP\nTo fix the checksums on a file, use the \\fB\\-ignore\\[hy]checksums\\fP option.\nFor example:\n.PP\n.RS\n.ft CW\nsrec_cat broken.srec \\-ignore\\[hy]checksums \\-o fixed.srec\n.ft R\n.RE\n.PP\nThe checksums in \\f[I]broken.srec\\fP are parsed (it is still\nand error if they are absent) but are not checked.  The\nresulting \\f[I]fixed.srec\\fP file has correct checksums.  The\n\\fB\\-ignore\\[hy]checksums\\fP option only applies to input.\n.PP\nThis option may be used on any file format which has checksums,\nincluding Intel hex.\n.SS Discovering Mystery Formats\nSee the \\f[B]What Format Is This?\\fP section, below,\nfor how to discover and convert mystery EPROM load file formats.\n.\\\" ------------------------------------------------------------------------\n.SH BINARY FILES\nIt is possible to convert to and from binary files.  You can even mix\nbinary files and other formats together in the same \\f[I]srec_cat\\fP(1)\ncommand.\n.SS Writing Binary Files\nThe simplest way of reading a hex file and converting it to a binary\nfile looks like this:\n.PP\n.RS\n.ft CW\nsrec_cat fred.hex \\-o fred.bin \\-binary\n.ft R\n.RE\n.PP\nThis reads the Motorola hex file \\f[I]fred.srec\\fP and writes it out to\nthe \\f[I]fred.bin\\fP as raw binary.\n.PP\nNote that the data is placed into the binary file at the byte offset\nspecified by the addresses in the hex file.\nIf there are holes in the data they are filled with zero.\nThis is, of course, common with linker output where the code is placed\nstarting at a particular place in memory.\nFor example, when you have an image that starts at\n0x100000, the first 1MB of the output binary file will be zero.\n.PP\nYou can automatically cancel this offset using a command like\n.PP\n.RS\n.ft CW\nsrec_cat fred.hex \\-offset \\[mi] \\-minimum\\[hy]addr fred.hex \\-o fred.bin\n.ft R\n.RE\n.PP\nThe above command works by offsetting the \\f[I]fred.hex\\fP file lower in\nmemory by the least address in the \\f[I]fred.hex\\fP file's data.\n.PP\nSee also the \\f[I]srec_binary\\fP(5) man page for additional detail.\n.SS Reading Binary Files\nThe simplest way of reading a binary file and converting it\nlooks like this\n.PP\n.RS\n.ft CW\nsrec_cat fred.bin \\-binary \\-o fred.srec\n.ft R\n.RE\n.PP\nThis reads the binary file \\f[I]fred.bin\\fP and writes all of its data\nback out again as a Motorola S\\[hy]Record file.\n.PP\nOften, this binary isn't exactly where you want it in the address space,\nbecause it is assumed to reside at address zero.\nIf you need to move it around use the \\f[B]\\-offset\\fP filter.\n.PP\n.RS\n.ft CW\nsrec_cat fred.bin \\-binary \\-offset 0x10000 \\-o fred.srec\n.ft R\n.RE\n.PP\nYou also need to avoid file \\[lq]holes\\[rq] which are filled with zero.\nYou can use the \\f[B]\\-crop\\fP filter, of you could use the\n\\f[B]\\-unfill\\fP filter if you don't know exactly where the data is.\n.PP\n.RS\n.ft CW\nsrec_cat fred.bin \\-binary \\-unfill 0x00 512 \\-o fred.srec\n.ft R\n.RE\n.PP\nThe above command removes runs of zero bytes that are 512 bytes long or longer.\nIf your file contains 1GB of leading zero bytes, this is going to be slow,\nit may be better to use the \\f[I]dd\\fP(1) command to slice and dice first.\n.\\\" ------------------------------------------------------------------------\n.SH JOINING FILES TOGETHER\nThe \\f[I]srec_cat\\fP command takes its name from the UNIX \\f[I]cat\\fP(1)\ncommand, which is short for \\[lq]catenate\\[rq] or \\[lq]to join\\[rq].\nThe \\f[I]srec_cat\\fP command joins EPROM load files together.\n.SS All In One\nJoining EPROM load files together into a single file is simple, just\nname as many files on the command line as you need:\n.PP\n.RS\n.ft CW\nsrec_cat \\f[I]infile1\\fP \\f[I]infile2\\fP \\-o \\f[I]outfile\\fP\n.ft R\n.RE\n.PP\nThis example is all Motorola S\\[hy]Record files, because that's the\ndefault format.  You can have multiple formats in the one command, and\n\\f[I]srec_cat\\fP(1) will still work.  You don't even have to output the\nsame format:\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\f[I]infile1\\fP \\-spectrum \\f[I]infile2\\fP \\-needham \\e\n    \\-o \\f[I]outfile\\fP \\-signetics\n.ft R\n.fi\n.RE\n.PP\nThese are all ancient formats, however it isn't uncommon to have to mix\nand match Intel and Motorola formats in the one project.\n.\\\" ......................................................................\n.SS Overlaying two data files\nIt is common to want to \\[lq]join\\[rq] two hex files together, without\nany changes of address. on the assumption neither file intersects with\nthe other.  This is a simple \\[lq]layers\\[rq], it is quite common for\nlinkers to output the main code, and then a whole bunch of relocation and\njump destination, by writing a two layered files.\n.RS\n.nf\n.ft CW\nsrec_cat one.he two.hex \\-o three.hex\n.ft R\n.fi\n.RE\nAlmost always you see an error\n.sp 0.25\n.RS\n.fi\nsrec_cat: two.srec: 49282: contradictory 0x00000000 value (previous = 0x00, \\\nthis one = 0x80)\n.RE\n.sp 0.25\n.PP\nThis means that the files actually intersect, they try to set\nthe same location.  You can turn the error into a warning, using the\n\\fB\\-contradictory\\[hy]bytes=warning\\fP command line option.  But this\nwill probably generate a bazillion warnings.\n.PP\nThe necessary step is to crop the first file, to avoid the regions the second\nfile is going o be overwriting.\n.sp 0.25\n.RS\n.nf\n.ft CW\nsrec_cat                               \\e\n    one.srec \\-exclude \\-within two.srec \\e\n    two.srec \\-exclude \\-within one.srec \\e\n    \\-o three.hex\n.ft R\n.fi\n.RE\n.PP\nDepending on your linker this will have no errors (but if it wants\nanother layer, more jiggery\\[hy]pokery is required).\n.\\\" ......................................................................\n.SS Filtering After Joining\nThere are times when you want to join two sets of data together,\nand then apply a filter to the joined result.  To do this you use\nparentheses.\n.sp 0.25\n.RS\n.ft CW\n.nf\nsrec_cat                                                  \\e\n    '('                                                   \\e\n        \\f[I]infile\\fP \\-exclude 0xFFF0 0x10000                      \\e\n        \\-generate 0xFFF0 0xFFF8 \\-repeat\\[hy]string 'Bananas ' \\e\n    ')'                                                   \\e\n    \\-length\\[hy]b\\[hy]e 0xFFF8 4                                  \\e\n    \\-checksum\\[hy]neg\\[hy]b\\[hy]e 0xFFFC 4 4                          \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example command catenate an input file (with the generated\ndata area excluded) with a constant string.  This catenated input is\nthen filtered to add a 4\\[hy]byte length, and a 4\\[hy]byte checksum.\n.SS Joining End\\[hy]to\\[hy]End\nAll too often the address ranges in the EPROM load files will overlap.\nYou will get an error if they do.\nIf both files start from address zero, because each goes into a separate\nEPROM, you may need to use the offset filter:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile1\\fP \\e\n    \\f[I]infile2\\fP \\-offset 0x80000 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nSometimes you want the two files to follow each other exactly,\nbut you don't know the offset in advance:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile1\\fP \\e\n    \\f[I]infile2\\fP \\-offset \\-maximum\\[hy]addr \\f[I]infile1\\fP \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nNotice that where the was a number (0x80000) before, there is now a\ncalculation (\\-maximum\\[hy]addr \\f[I]infile1\\fP).  This is possible most places\na number may be used (also \\-minimum\\[hy]addr and \\-range).\n.\\\" ------------------------------------------------------------------------\n.SH CROPPING THE DATA\nIt is possible to copy an EPROM load file,\nselecting addresses to keep and addresses to discard.\n.SS What To Keep\nA common activity is to crop your data to match your EPROM location.\nYour linker may add other junk that you are not interested in, \\f[I]e.g.\\fP\nat the RAM location.  In this example, there is a 1MB EPROM at the 2MB\nboundary:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-crop 0x200000 0x300000 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe lower bound for all address ranges is inclusive, the upper bound is\nexclusive.  If you subtract them, you get the number of bytes.\n.SS Address Offset\n.\\\" stupid synonym: moronic\nJust possibly, you have a moronic EPROM programmer, and it barfs if the\nEPROM image doesn't start at zero.\nTo find out just where is \\f[I]does\\fP start in memory,\nuse the \\f[I]srec_info\\fP(1) command:\n.PP\n.RS\n.ft CW\n.nf\n$ \\f[CB]srec_info example.srec\\fP\nFormat: Motorola S\\[hy]Record\nHeader: extra\\[hy]whizz tool chain linker\nExecution Start Address: 0x00200000\nData:   0x200000 \\- 0x32AAEF\n$\n.fi\n.ft R\n.RE\n.PP\nRather than butcher the linker command file,\njust offset the addresses:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-crop 0x200000 0x300000 \\-offset \\[mi]0x200000 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nNote that the offset given is \\f[I]negative\\fP, it has the effect of\nsubtracting that value from all addresses in the input records, to form\nthe output record addresses.  In this case, shifting the image back to zero.\n.PP\nThis example also demonstrates how the input filters may be chained\ntogether: first the crop and then the offset, all in one command,\nwithout the need for temporary files.\n.PP\nIf all you want to do is offset the data to start from address zero,\nthis can be automated, so you don't have to know the minimum address in\nadvance, by using \\f[I]srec_cat\\fP's ability to calculate some things on\nthe command line:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-offset \\[mi] \\-minimum\\[hy]addr \\f[I]infile\\fP \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nNote the spaces either side of the minus sign, they are mandatory.\n.SS What To Throw Away\nThere are times when you need to exclude an small address range from an\nEPROM load file, rather than wanting to keep a small address range.\nThe \\fB\\-exclude\\fP filter may be used for this purpose.\n.PP\nFor example, if you wish to exclude the address range where the serial\nnumber of an embedded device is kept, say 0x20 bytes at 0x100, you would use\na command like this:\n.PP\n.RS\n.ft CW\nsrec_cat input.srec \\-exclude 0x100 0x120 \\-o output.srec\n.ft R\n.RE\n.PP\nThe \\f[I]output.srec\\fP file will have a hole in the data at the\nnecessary locations.\n.PP\nNote that you can have both \\fB\\-crop\\fP and \\fB\\-exclude\\fP on the same\ncommand line,\nwhichever works more naturally for your situation.\n.SS Discontinuous Address Ranges\nAddress ranges don't have to be a single range, you can build up an\naddress range using more than a single pair.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-crop 0x100 0x200 0x1000 0x1200 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThis filter results in data from 0x100..0x1FF and data from\n0x1000..0x1200 to pass through, the rest is dropped.  This is is more\nefficient than chaining a \\fB\\-crop\\fP and an \\fB\\-exclude\\fP filter together.\n.\\\" ------------------------------------------------------------------------\n.SH MOVING THINGS AROUND\nIt is also possible to change the address of data records, both forwards\nand backwards.  It is also possible rearrange where data records are\nplaced in memory.\n.SS Offset Filter\nThe \\fB\\-offset=\\fP\\f[I]number\\fP filter operates on the addresses of\nrecords.  If the number is positive the addresses move that many bytes\nhigher in memory, negative values move lower.\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\f[I]infile\\fP \\-crop 0x200000 0x300000 \\-offset \\[mi]0x200000 \\e\n    \\-o \\f[I]outfile\\fP\n.ft R\n.fi\n.RE\n.PP\nThe above example moves the 1MB block of data at 0x200000 down to zero\n(the offset is \\f[I]negative\\fP) and discards the rest of the data.\n.SS Byte Swapping\nThere are times when the bytes in the data need to be swapped,\nconverting between big\\[hy]endian and little\\[hy]endian data usually.\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\f[I]infile\\fP \\-byte\\[hy]swap 4 \\-o \\f[I]outfile\\fP\n.ft R\n.fi\n.RE\n.PP\nThis reverses bytes in 32 bit values (4 bytes).  The default, if you\ndon't supply a width, is to reverse bytes in 16 bit values (2 bytes).\nYou can actually use any weird value you like,\nit doesn't even have to be a power of 2.\nPerhaps 64 bits (8 bytes) may be useful one day.\n.SS Binary Output\nYou need to watch out for binary files on output, because the holes are\nfilled with zeros.  Your 100kB program at the top of 32\\[hy]bit addressed\nmemory will make a 4GB file.  See \\f[I]srec_binary\\fP(5) for how\nunderstand and avoid this problem, usually with the \\fB\\-offset\\fP filter.\n.SS Splitting an Image\nIf you have a 16\\[hy]bit data bus, but you are using two 8\\[hy]bit EPROMs to\nhold your firmware, you can generate the even and odd images by using\nthe \\fB\\-SPlit\\fP filter.  Assuming your firmware is in the \\f[I]firmware.hex\\fP\nfile, use the following:\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat firmware.hex \\-split 2 0 \\-o firmware.even.hex\nsrec_cat firmware.hex \\-split 2 1 \\-o firmware.odd.hex\n.ft R\n.fi\n.RE\n.PP\nThis will result in the two necessary EPROM images.  Note that the output\naddresses are divided by the split multiple, so if your EPROM images\nare at a particular offset (say 0x10000, in the following example),\nyou need to remove the offset, and then replace it...\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat firmware.hex \\e\n    \\-offset \\[mi]0x10000 \\-split 2 0 \\e\n    \\-offset 0x10000 \\-o firmware.even.hex\nsrec_cat firmware.hex \\e\n    \\-offset \\[mi]0x10000 \\-split 2 1 \\e\n    \\-offset 0x10000 \\-o firmware.odd.hex\n.ft R\n.fi\n.RE\n.PP\nNote how the ability to apply multiple filters simplifies what would\notherwise be a much longer script.\n.SS Striping\nA second use for the \\fB\\-SPlit\\fP filter is memory striping.\n.PP\nYou don't have to split into byte\\[hy]wide parts, you can choose other\nsizes.  It is common to want to convert 32\\[hy]bit wide data into two set of\n16\\[hy]bit wide data.\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat firmware.hex \\-split 4 0 2 \\-o firmware.01.hex\nsrec_cat firmware.hex \\-split 4 2 2 \\-o firmware.23.hex\n.ft R\n.fi\n.RE\n.PP\nThis is relatively simple to understand, but you can use even wider stripes.\n.PP\nIn this next example, the hardware requires that 512\\[hy]byte blocks alternate\nbetween 4 EPROMs.  Generating the 4 images would be done as follows:\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat firmware.hex \\-split 0x800 0x000 0x200 \\-o firmware.0.hex\nsrec_cat firmware.hex \\-split 0x800 0x200 0x200 \\-o firmware.1.hex\nsrec_cat firmware.hex \\-split 0x800 0x400 0x200 \\-o firmware.2.hex\nsrec_cat firmware.hex \\-split 0x800 0x600 0x200 \\-o firmware.3.hex\n.ft R\n.fi\n.RE\n.SS Asymmetric Striping\nA more peculiar example of striping is the\nMicrochip dsPIC33F microcontroller, that\nhas a weird memory storage pattern and they are able to store 3 bytes\nin an address that should only contain 2 bytes.\nThe result is a hex file that has zero\\[hy]filled the top byte\n(little\\[hy]endian), and all addresses are doubled from what they are in\nthe chip.\nHere is an example:\n.PP\n.RS\n.nf\n.ft CW\nS1130000000102000405060008090A000C0D0E0098\nS1130010101112001415160018191A001C1D1E00C8\nS1130020202122002425260028292A002C2D2E00F8\nS1130030303132003435360038393A003C3D3E0028\n.ft R\n.fi\n.RE\n.PP\nTo get rid of the 00 padding bytes, leaving only the 3/4 significant bytes,\nyou also use the split filter, with its additional \\f[I]width\\fP argument,\nlike this:\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat example.srec \\-split 4 0 3 \\-o no_dross.srec\n.ft R\n.fi\n.RE\n.PP\nThis results in a file with the 00 padding bytes removed.\nIt looks like this:\n.PP\n.RS\n.nf\n.ft CW\nS113000000010204050608090A0C0D0E1011121451\nS1130010151618191A1C1D1E2021222425262829EC\nS11300202A2C2D2E30313234353638393A3C3D3E87\n.ft R\n.fi\n.RE\n.PP\nNotice how the addresses are 3/4 the size, as well.\nYou can reverse this using the \\fB\\-unsplit\\fP and \\fB\\-fill=0\\fP filters.\n.SS Unsplit ING Images\nThe unsplit filter may be used to reverse the effects of the split filter.\nNote that the address range is expanded leaving holes between the stripes.\nBy using all the stripes, the complete input is reassembled, without\nany holes.\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\-o firmware.hex \\e\n    firmware.even.hex \\-unsplit 2 0 \\e\n    firmware.odd.hex  \\-unsplit 2 1\n.ft R\n.fi\n.RE\n.PP\nThe above example reverses the previous 16\\[hy]bit data bus example.\nIn general, you unsplit with the same parameters that you split with.\n.\\\" ------------------------------------------------------------------------\n.SH FILLING THE BLANKS\nOften EPROM load files will have \\[lq]holes\\[rq] in them, places where the\ncompiler and linker did not put anything.  For some purposes this is OK,\nand for other purposes something has to be done about the holes.\n.SS The Fill Filter\nIt is possible to fill the blanks where your data does not lie.\nThe simplest example of this fills the entire EPROM:\n.PP\n.RS\n.ft CW\nsrec_cat \\f[I]infile\\fP \\-fill 0x00 0x200000 0x300000 \\-o \\f[I]outfile\\fP\n.ft R\n.RE\n.PP\nThis example fills the holes, if any, with zeros.\nYou must specify a range \\- with a 32\\[hy]bit address space,\nfilling everything generates \\f[I]huge\\fP load files.\n.PP\nIf you only want to fill the gaps in your data,\nand don't want to fill the entire EPROM, try:\n.PP\n.RS\n.ft CW\nsrec_cat \\f[I]infile\\fP \\-fill 0x00 \\-over \\f[I]infile\\fP \\-o \\f[I]outfile\\fP\n.ft R\n.RE\n.PP\nThis example demonstrates the fact that wherever an address range may be\nspecified, the \\fB\\-over\\fP and \\fB\\-within\\fP options may be used.\n.SS Unfilling the Blanks\nIt is common to need to \\[lq]unfill\\[rq] an EPROM image after you read it\nout of a chip.  Usually, it will have had all the holes filled with 0xFF\n(areas of the EPROM you don't program show as 0xFF when you read them back).\n.PP\nTo get rid of all the 0xFF bytes in the data, use this filter:\n.PP\n.RS\n.ft CW\nsrec_cat \\f[I]infile\\fP \\-unfill 0xFF \\-o \\f[I]outfile\\fP\n.ft R\n.RE\n.PP\nThis will get rid of \\f[I]all\\fP the 0xFF bytes, including the ones you\nactually wanted in there.  There are two ways to deal with this.  First,\nyou can specify a minimum run length to the un\\[hy]fill:\n.PP\n.RS\n.ft CW\nsrec_cat \\f[I]infile\\fP \\-unfill 0xFF 5 \\-o \\f[I]outfile\\fP\n.ft R\n.RE\n.PP\nThis says that runs of 1 to 4 bytes of 0xFF are OK, and that a hole\nshould only be created for runs of 5 or more 0xFF bytes in a row.\nThe second method is to re\\[hy]fill over the intermediate gaps:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]outfile\\fP \\-fill 0xFF \\-over \\f[I]outfile\\fP \\e\n    \\-o \\f[I]outfile2\\fP\n.fi\n.ft R\n.RE\n.PP\nWhich method you choose depends on your needs, and the shape of the data\nin your EPROM.  You may need to combine both techniques.\n.SS Address Range Padding\nSome data formats are 16 bits wide, and automatically fill with 0xFF bytes if\nit is necessary to fill out the other half of a word which is not in the data.\nIf you need to fill with a different value, you can use a command like this:\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\f[I]infile\\fP \\-fill 0x0A \\e\n    \\-within \\f[I]infile\\fP \\-range\\[hy]padding 2 \\e\n    \\-o \\f[I]outfile\\fP\n.ft R\n.fi\n.RE\n.PP\nThis gives the fill filter an address range calculated from details of\nthe input file.  The address range is all the address ranges covered by\ndata in the \\f[I]infile\\fP, extended downwards (if necessary) at the\nstart of each sub\\[hy]range to a 2 byte multiple and extended upwards (if\nnecessary) at the end of each sub\\[hy]range to a 2 byte multiple.  This also\nworks for larger multiples, like 1kB page boundaries of flash chips.\nThis address range padding works anywhere an address range is required.\n.SS Fill with Copyright\nIt is possible to fill unused portions of your EPROM with a repeating\ncopyright message.  Anyone trying to reverse engineer your EPROMs is\ngoing to see the copyright notice in their hex editor.\n.PP\nThis is accomplished with two input sources, one from a data file,\nand one which is generated on\\[hy]the\\[hy]fly.\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\f[I]infile\\fP \\e\n    \\-generate '(' 0 0x100000 \\-minus \\-within \\f[I]infile\\fP ')' \\e\n        \\-repeat\\[hy]string 'Copyright (C) 1812 Tchaikovsky.  ' \\e\n    \\-o \\f[I]outfile\\fP\n.ft R\n.fi\n.RE\n.PP\nNotice the address range for the data generation: it takes the\naddress range of your EPROM, in this case 1MB starting from 0, and\nsubtracts from it the address ranges used by the input file.\n.PP\nIf you want to script this with the current year (because 1812 is a bit\nout of date) use the shell's output substitution (back ticks) ability:\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\f[I]infile\\fP \\e\n    \\-generate '(' 0 0x100000 \\-minus \\-within \\f[I]infile\\fP ')' \\e\n        \\-repeat\\[hy]string \"Copyright (C) `date +%Y` Tchaikovsky.  \" \\e\n    \\-o \\f[I]outfile\\fP\n.ft R\n.fi\n.RE\n.PP\nThe string specified is repeated over and over again, until it has\nfilled all the holes.\n.SS Obfuscating with Noise\nSometimes you want to fill your EPROM images with noise, to conceal\nwhere the real data stops and starts.\nYou can do this with the \\fB\\-random\\[hy]fill\\fP filter.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-random\\[hy]fill 0x200000 0x300000 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nIt works just like the \\fB\\-fill\\fP filter,\nbut uses random numbers instead of a constant byte value.\n.SS Fill With 16\\[hy]bit Words\nWhen filling the image with a constant byte value doesn't work, and you\nneed a constant 16\\[hy]bit word value instead, use the \\fB\\-repeat\\[hy]data\\fP\ngenerator, which takes an arbitrarily long sequence of bytes to use as\nthe fill pattern:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\e\n    \\-generator '(' 0x200000 0x300000 \\-minus \\-within \\f[I]infile\\fP ')' \\e\n        \\-repeat\\[hy]data 0x1B 0x08 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nNotice how the generator's address range once again avoids the address\nranges occupied by the \\f[I]infile\\fP's data.\nYou have to get the endian\\[hy]ness right yourself.\n.\\\" ------------------------------------------------------------------------\n.SH INSERTING CONSTANT DATA\nFrom time to time you will want to insert constant data,\nor data not produced by your compiler or assembler,\ninto your EPROM load images.\n.SS Binary Means Literal\nOne simple way is to have the desired information in a file.\nTo insert the file's contents literally, with no format interpretation,\nuse the \\f[I]binary\\fP input format:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-binary \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nIt will probably be necessary to use an \\f[I]offset\\fP filter to move\nthe data to where you actually want it within the image:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-binary \\-offset 0x1234 \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nIt is also possible to use the standard input as a data source,\nwhich lends itself to being scripted.\nFor example, to insert the current date and time into an EPROM load file,\nyou could use a pipe:\n.PP\n.RS\n.ft CW\n.nf\ndate | srec_cat \\- \\-bin \\-offset 0xFFE3 \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe special file name \\[lq]\\f[CW]\\-\\fP\\[rq] means to read from the\nstandard input.\nThe output of the \\f[I]date\\fP command is always 29 characters long,\nand the offset shown will place it at the top of a 64KB EPROM image.\n.SS Repeating Once\nThe \\f[B]Fill with Copyright\\fP section, above, shows how to\nrepeat a string over and over.\nWe can use a single repeat to insert a string just once.\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\-generate 0xFFE3 0x10000 \\-repeat\\[hy]string \"`date`\" \\e\n    \\-o \\f[I]outfile\\fP\n.ft R\n.fi\n.RE\n.PP\nNotice how the address range for the data generation\nexactly matches the length of the \\f[I]date\\fP(1) output size.\nYou can, of course, add your input file to the above \\f[I]srec_cat\\fP(1)\ncommand to catenate your EPROM image together with the date and time.\n.SS Inserting A Long\nAnother possibility is to add the Subversion commit number to your EPROM image.\nIn this example, we are inserting it a a 4\\[hy]byte little\\[hy]endian value\nat address 0x0008.  The Subversion commit number is in the \\f[I]$version\\fP\nshell variable in this example:\n.PP\n.RS\n.nf\n.ft CW\nsrec_cat \\-generate 0x0008 0x000C \\-constant\\[hy]l\\[hy]e $version 4 \\e\n    \\f[I]infile\\fP \\-exclude 0x0008 0x000C \\e\n    \\-o \\f[I]outfile\\fP\n.ft R\n.fi\n.RE\n.PP\nNote that we use a filter to ensure there is a hole in the input where\nthe version number goes, just in case the linker put something there.\n.\\\" ------------------------------------------------------------------------\n.SH DATA ABOUT THE DATA\nIt is possible to add a variety of data about the data to the output.\n.SS Checksums\nThe \\fB\\-checksum\\[hy]negative\\[hy]big\\[hy]endian\\fP filter may be used\nto sum the data, and then insert the negative of the sum into the data.\nThis has the effect of summing to zero when the checksum itself is\nsummed across, provided the sum width matches the inserted value width.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\e\n        \\-crop 0 0xFFFFFC \\e\n        \\-random\\[hy]fill 0 0xFFFFFC \\e\n        \\-checksum\\[hy]neg\\[hy]b\\[hy]e 0xFFFFFC 4 4 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nIn this example, we have an EPROM in the lowest megabyte of memory.\nThe \\-crop filter ensures we are only summing the data within\nthe EPROM, and not anywhere else.  The \\-random\\[hy]fill filter\nfills any holes left in the data with random values.  Finally, the\n\\-checksum\\[hy]neg\\[hy]b\\[hy]e filter inserts a 32 bit (4 byte) checksum\nin big\\[hy]endian format in the last 4 bytes of the EPROM image.\nNaturally, there is a little\\[hy]endian version of this filter as well.\n.PP\nYour embedded code can check the EPROM using C code similar to the following:\n.PP\n.RS\n.nf\n.ft CW\nunsigned long *begin = (unsigned long *)0;\nunsigned long *end = (unsigned long *)0x100000;\nunsigned long sum = 0;\nwhile (begin < end)\n    sum += *begin++;\nif (sum != 0)\n{\n    \\f[I]Oops\\fP\n}\n.ft R\n.fi\n.RE\n.PP\nThe \\fB\\-checksum\\[hy]bitnot\\[hy]big\\[hy]endian\\fP filter is similar,\nexcept that summing over the checksum should yield a value of\nall\\[hy]one\\[hy]bits (\\[mi]1).\nFor example, using shorts rather than longs:\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\e\n        \\-crop 0 0xFFFFFE \\e\n        \\-fill 0xCC 0x00000 0xFFFFFE \\e\n        \\-checksum\\[hy]neg\\[hy]b\\[hy]e 0xFFFFFE 2 2 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nAssuming you chose the correct endian\\[hy]ness filter,\nyour embedded code can check the EPROM using C code similar to the following:\n.PP\n.RS\n.nf\n.ft CW\nunsigned short *begin = (unsigned short *)0;\nunsigned short *end = (unsigned short *)0x100000;\nunsigned short sum = 0;\nwhile (begin < end)\n    sum += *begin++;\nif (sum != 0xFFFF)\n{\n    \\f[I]Oops\\fP\n}\n.ft R\n.fi\n.RE\n.PP\nThere is also a \\fB\\-checksum\\[hy]positive\\[hy]b\\[hy]e\\fP filter, and\na matching little\\[hy]endian filter, which inserts the simple sum, and\nwhich would be checked in C using an equality test.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\e\n        \\-crop 0 0xFFFFFF \\e\n        \\-fill 0x00 0x00000 0xFFFFFF \\e\n        \\-checksum\\[hy]neg\\[hy]b\\[hy]e 0xFFFFFF 1 1 \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nAssuming you chose the correct endian\\[hy]ness filter,\nyour embedded code can check the EPROM using C code similar to the following:\n.PP\n.RS\n.nf\n.ft CW\nunsigned char *begin = (unsigned char *)0;\nunsigned char *end = (unsigned char *)0xFFFFF;\nunsigned char sum = 0;\nwhile (begin < end)\n    sum += *begin++;\nif (sum != *end)\n{\n    \\f[I]Oops\\fP\n}\n.ft R\n.fi\n.RE\n.PP\nIn the 8\\[hy]bit case, it doesn't matter whether you use the big\\[hy]endian or\nlittle\\[hy]endian filter.\n.SS Quick Hex\\[hy]Dump\nYou can look at the checksum of your data, by using the\n\\[lq]hex\\[hy]dump\\[rq] output format.\nThis is useful for looking at calculated values, or for debugging\nan \\f[I]srec_cat\\fP(1) command before immortalizing it in a script.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP                        \\e\n        \\-crop 0 0x10000             \\e\n        \\-fill 0xFF 0x0000 0x10000   \\e\n        \\-checksum\\[hy]neg\\[hy]b\\[hy]e 0x10000 4 \\e\n        \\-crop 0x10000 0x10004       \\e\n    \\-o \\- \\-hex\\[hy]dump\n.fi\n.ft R\n.RE\n.PP\nThis command reads in the file, checksums the data and places the\nchecksum at 0x10000, crops the result to contain only the checksum,\nand then prints the checksum on the standard output in a classical\nhexadecimal dump format.  The special file name \\[lq]\\f[CW]\\-\\fP\\[rq] means\n\\[lq]the standard output\\[rq] in this context.\n.SS Cyclic Redundancy Checks\nThe simple additive checksums have a number of theoretical limitations,\nto do with errors they can and can't detect.  The CRC methods have fewer\nproblems.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP                        \\e\n        \\-crop 0 0xFFFFFC            \\e\n        \\-fill 0x00 0x00000 0xFFFFFC \\e\n        \\-crc32\\[hy]b\\[hy]e 0xFFFFFC         \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nIn the above example, we have an EPROM in the lowest megabyte of memory.\nThe \\fB\\-crop\\fP filter ensures we are only summing the data within the EPROM,\nand not anywhere else.\nThe \\fB\\-fill\\fP filter fills any holes left in the data.\nFinally, the \\fB\\-checksum\\[hy]neg\\[hy]b\\[hy]e\\fP filter inserts a 32 bit (4\nbyte) checksum in big\\[hy]endian format in the last 4 bytes of the EPROM\nimage.\nNaturally, there is a little\\[hy]endian version of this filter as well.\n.PP\nThe checksum is calculated using the industry standard 32\\[hy]bit CRC.\nBecause SRecord is open source, you can always read the source code\nto see how it works.  There are many non\\[hy]GPL versions of this code\navailable on the Internet, and suitable for embedding in proprietary\nfirmware.\n.PP\nThere is also a 16\\[hy]bit CRC available.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP                        \\e\n        \\-crop 0 0xFFFFFE            \\e\n        \\-fill 0x00 0x00000 0xFFFFFE \\e\n        \\-crc16\\[hy]b\\[hy]e 0xFFFFFE         \\e\n    \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe checksum is calculated using the CCITT formula.\nBecause SRecord is open source, you can always read the source code\nto see how it works.  There are many non\\[hy]GPL version of this code\navailable on the Internet, and suitable for embedding in proprietary\nfirmware.\n.PP\nYou can look at the CRC of your data, by using the\n\\[lq]hex\\[hy]dump\\[rq] output format.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP                      \\e\n        \\-crop 0 0x10000           \\e\n        \\-fill 0xFF 0x0000 0x10000 \\e\n        \\-crc16\\[hy]b\\[hy]e 0x10000        \\e\n        \\-crop 0x10000 0x10002     \\e\n    \\-o \\- \\-hex\\[hy]dump\n.fi\n.ft R\n.RE\n.PP\nThis command reads in the file, calculates the CRC of the data and\nplaces the CRC at 0x10000, crops the result to contain only the CRC,\nand then prints the checksum on the standard output in a classical\nhexadecimal dump format.\n.\\\" .PP\n.\\\" \\f[B]Note:\\fP\n.\\\" To get the same CRC\\[hy]16 as used by the Linux kernel\n.\\\" in the \\f[CW]lib/crc\\[hy]ccitt.c\\fP file, use the\n.\\\" \\fB\\-least\\[hy]to\\[hy]most\\fP modifier.  To get the same CRC\\[hy]16\n.\\\" as used by the Linux kernel in the \\f[CW]lib/crc16.c\\fP file, use\n.\\\" the \\f[B]0x8005 \\-least\\[hy]to\\[hy]most\\fP modifiers.  For both of\n.\\\" these, augment or not, as required.\n.SS Where Is My Data?\nThere are several properties of your EPROM image that you may wish to\ninsert into the data.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-minimum\\[hy]b\\[hy]e 0xFFFE 2 \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example inserts the minimum address of the data (\\f[I]low\nwater\\fP) into the data, as two bytes in big\\[hy]endian order at address\n0xFFFE.  This includes the minimum itself.  If the data already\ncontains bytes at the given address, you need to use an exclude\nfilter.\nThe number of bytes defaults to 4.\n.PP\nThere is also a\n\\fB\\-minimum\\[hy]l\\[hy]e\\fP filter for inserting little\\[hy]endian values,\nand two more filters called \\fB\\-exclusive\\[hy]minimum\\[hy]b\\[hy]e\\fP and\n\\fB\\-exclusive\\[hy]minimum\\[hy]l\\[hy]e\\fP that do not include the minimum\nitself in the calculation of the minimum data address.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-maximum\\[hy]b\\[hy]e 0xFFFFFC 4 \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example inserts the maximum address of the data\n(\\f[I]high water + 1\\fP, just like address ranges)\ninto the data, as four bytes in big\\[hy]endian order at address 0xFFFFFC.\nThis includes the maximum itself.\nIf the data already contains bytes at the given address,\nyou need to use an \\fB\\-exclude\\fP filter.\nThe number of bytes defaults to 4.\n.PP\nThere is also a \\fB\\-maximum\\[hy]l\\[hy]e\\fP filter for\ninserting little\\[hy]endian values, and two more\nfilters called \\fB\\-exclusive\\[hy]maximum\\[hy]b\\[hy]e\\fP and\n\\fB\\-exclusive\\[hy]maximum\\[hy]l\\[hy]e\\fP that do not include the maximum\nitself in the calculation of the maximum data address.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-length\\[hy]b\\[hy]e 0xFFFFFC 4 \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example inserts the length of the data\n(\\f[I]high water\\fP + 1 \\[mi] \\f[I]low water\\fP) into the data,\nas four bytes in big\\[hy]endian order at address 0xFFFFFC.\nThis includes the length itself.\nIf the data already contains bytes at the length location,\nyou need to use an \\fB\\-exclude\\fP filter.\nThe number of bytes defaults to 4.\n.PP\nThere is also a \\fB\\-length\\[hy]l\\[hy]e\\fP filter for inserting a\nlittle\\[hy]endian length, and the \\fB\\-exclusive\\[hy]length\\[hy]b\\[hy]e\\fP\nand \\fB\\-exclusive\\[hy]length\\[hy]l\\[hy]e\\fP filters that do not include the\nlength itself in the calculation.\n.SS What Format Is This?\nYou can obtain a variety of information about an EPROM load file\nby using the \\f[I]srec_info\\fP(1) command.\nFor example:\n.PP\n.RS\n.ft CW\n.nf\n$ \\f[CB]srec_info example.srec\\fP\nFormat: Motorola S\\[hy]Record\nHeader: \"http://srecord.sourceforge.net/\"\nExecution Start Address: 00000000\nData:   0000 \\- 0122\n        0456 \\- 0FFF\n$\n.fi\n.ft R\n.RE\n.PP\nThis example shows that the file is a Motorola S\\[hy]Record.  The text in\nthe file header is printed, along with the execution start address.\nThe final section shows the address ranges containing data (the\nupper bound of each subrange is \\f[I]in\\f[P]clusive, rather than the\n\\f[I]ex\\f[P]clusive form used on the command line.\n.PP\n.RS\n.ft CW\n.nf\n$ \\f[CB]srec_info some\\[hy]weird\\[hy]file.hex \\-guess\\fP\nFormat: Signetics\nData:   0000 \\- 0122\n        0456 \\- 0FFF\n$\n.fi\n.ft R\n.RE\n.PP\nThe above example guesses the EPROM load file format.\nIt isn't infallible but it usually gets it right.\nYou can use \\fB\\-guess\\fP anywhere you would give an explicit format,\nbut it tends to be slower and for that reason is not recommended.\nAlso, for automated build systems, you want hard errors as early as possible;\nif a file isn't in the expected format, you want it to barf.\n.\\\" ------------------------------------------------------------------------\n.SH MANGLING THE DATA\nIt is possible to change the values of the data bytes in several ways.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-and 0xF0 \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example performs a bit\\[hy]wise AND of the data bytes with the\n0xF0 mask.\nThe addresses of records are unchanged.\nI can't actually think of a use for this filter.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-or 0x0F \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example performs a bit\\[hy]wise OR of the data bytes with the\n0x0F bits.\nThe addresses of records are unchanged.\nI can't actually think of a use for this filter.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-xor 0xA5 \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example performs a bit\\[hy]wise exclusive OR of the data bytes\nwith the 0xA5 bits.\nThe addresses of records are unchanged.\nYou could use this to obfuscate the contents of your EPROM.\n.PP\n.RS\n.ft CW\n.nf\nsrec_cat \\f[I]infile\\fP \\-not \\-o \\f[I]outfile\\fP\n.fi\n.ft R\n.RE\n.PP\nThe above example performs a bit\\[hy]wise NOT of the data bytes.\nThe addresses of records are unchanged.\nSecurity by obscurity?\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man1/srec_info.1",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 1998, 2001, 2005-2009, 2013 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_info\n.TH \\*(n) 1 SRecord \"Reference Manual\"\n.SH NAME\nsrec_info \\- information about EPROM load files\n.if require_index \\{\n.XX \"srec_info(1)\" \"Information about EPROM load files\"\n.\\}\n.SH SYNOPSIS\n.B \\*(n)\n[\n.IR option \\&...\n]\n.IR filename \\&...\n.br\n.B \\*(n)\n.B \\-Help\n.br\n.B \\*(n)\n.B \\-VERSion\n.SH DESCRIPTION\nThe \\fI\\*(n)\\fP program is used to obtain input about EPROM load files.\nIt reads the files specified, and then presents statistics about them.\nThese statistics include: the file header if any, the execution start\naddress if any, and the address ranges covered by the data if any.\n.PP\nIf there is binary data the header, it will be presented using the URL\nencoding that uses % followed by two hexadeimal characters.\nFor example a backspace would be encoded as \\[lq]%08\\[rq].\n(This is symmetric with the srec_cat \\[hy]\\[hy]header opion).\n.so man/man1/o_input.so\n.br\n.ne 1i\n.SH OPTIONS\nThe following options are understood:\n.so man/man1/o_at.so\n.TP 8n\n.B \\-Help\n.br\nProvide some help with using the\n.I \\*(n)\nprogram.\n.TP 8n\n\\fB\\-IGnore_Checksums\\fP\n.so man/man1/o_ignore_checksums.so\n.so man/man1/o_sequence.so\n.so man/man1/o_multiple.so\n.TP 8n\n.B \\-VERSion\n.br\nPrint the version of the\n.I \\*(n)\nprogram being executed.\n.PP\nAll other options will produce a diagnostic error.\n.so man/man1/z_options.so\n.so man/man1/z_exit.so\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man1/srec_input.1",
    "content": "'\\\" t\n.\\\" srecord - The \"srecord\" program.\n.\\\" Copyright (C) 1998-2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_input\n.TH \\*(n) 1 SRecord \"Reference Manual\"\n.SH NAME\n\\*(n) \\- input file specifications\n.if require_index \\{\n.XX \"srec_input(1)\" \"Input file specifications\"\n.\\}\n.SH SYNOPSIS\n\\f[B]srec_*\\fP \\f[I]filename\\fP [ \\f[I]format\\fP ]\n.SH DESCRIPTION\nThis manual page describes the input file specifications for the\n\\f[I]srec_cat\\fP(1), \\f[I]srec_cmp\\fP(1) and \\f[I]srec_info\\fP(1)\ncommands.\n.PP\nInput files may be qualified in a number of ways: you may specify their\nformat and you may specify filters to apply to them.\nAn input file specification looks like this:\n.RS\n\\f[I]filename\\fP [ \\f[I]format\\fP ][ \\-ignore\\[hy]checksums ]\\\n[ \\f[I]filter\\fP \\&... ]\n.RE\n.PP\nThe\n.I filename\nmay be specified as a file name,\nor the special name \\(lq\\-\\(rq which is understood to mean the standard input.\n.SS Grouping with Parentheses\nThere are some cases where operator precedence of the filters can\nbe ambiguous.  Input specifications may also be enclosed by \\fB(\\fP\nparentheses \\fB)\\fP to make grouping explicit.  Remember that the\nparentheses must be separate words, \\f[I]i.e.\\fP surrounded by\nspaces, and they will need to be quoted to get them past the shell's\ninterpretation of parentheses.\n.SS Those Option Names Sure Are Long\n.so man/man1/z_options.so\n.SS File Formats\nThe\n.I format\nis specified by the argument \\f[I]after\\fP the file name.\nThe format defaults to Motorola S\\[hy]Record if not specified.\nThe format specifiers are:\n.\\\" ----------  A  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Absolute_Object_Module_Format\\fP\nThis option says to use the Intel Absolute Object Module Format (AOMF) to read\nthe file.  (See \\f[I]srec_aomf\\fP(5) for a description of this file format.)\n.TP 8n\n\\fB\\-Ascii_Hex\\fP\nThis option says to use the Ascii\\[hy]Hex format to read the file.\nSee\n.IR srec_ascii_hex (5)\nfor a description of this file format.\n.TP 8n\n\\fB\\-Atmel_Generic\\fP\nThis option says to use the Atmel Generic format to read the file.\nSee\n.IR srec_atmel_genetic (5)\nfor a description of this file format.\n.\\\" ----------  B  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Binary\\fP\nThis option says the file is a raw binary file, and should be read literally.\n(This option may also be written \\-Raw.)\nSee \\f[I]srec_binary\\fP(5) for more information.\n.TP 8n\n\\fB\\-B\\[hy]Record\\fP\nThis option says to use the Freescale MC68EZ328 Dragonball bootstrap\nb\\[hy]record format to read the file.\nSee \\f[I]srec_brecord\\fP(5) for a description of this file format.\n.\\\" ----------  C  ---------------------------------------------------------\n.TP 8n\n\\fB\\-COsmac\\fP\nThis option says to use the RCA Cosmac Elf format to read the file.\nSee \\f[I]srec_cosmac\\fP(5) for a description of this file format.\n.\\\" ----------  D  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Dec_Binary\\fP\nThis option says to use the DEC Binary (XXDP) format to read the file.\nSee \\f[I]srec_dec_binary\\fP(5) for a description of this file format.\n.\\\" ----------  E  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Elektor_Monitor52\\fP\nThis option says to use the EMON52 format to read the file.\nSee \\f[I]srec_emon52\\fP(5) for a description of this file format.\n.\\\" ----------  F  ---------------------------------------------------------\n.TP 8n\n\\fB\\-FAIrchild\\fP\nThis option says to use the Fairchild Fairbug format to read the file.\nSee \\f[I]srec_fairchild\\fP(5) for a description of this file format.\n.TP 8n\n\\fB\\-Fast_Load\\fP\nThis option says to use the LSI Logic Fast Load format to read the file.\nSee \\f[I]srec_fastload\\fP(5) for a description of this file format.\n.TP 8n\n\\fB\\-Formatted_Binary\\fP\nThis option says to use the Formatted Binary format to read the file.\nSee \\f[I]srec_formatted_binary\\fP(5) for a description of this file format.\n.TP 8n\n\\fB\\-Four_Packed_Code\\fP\nThis option says to use the FPC format to read the file.\nSee \\f[I]srec_fpc\\fP(5) for a description of this file format.\n.\\\" ----------  G  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Guess\\fP\nThis option may be used to ask the command to guess the input format.\nThis is slower than specifying an explicit format,\nas it may open and scan and close the file a number of times.\n.\\\" ----------  H  ---------------------------------------------------------\n.TP 8n\n\\fB\\-HEX_Dump\\fP\nThis option says to try to read a hexadecimal dump file, more or less\nin the style output by the same option.  This is not an exact reverse\nmapping, because if there are ASCII equivalents on the right hand side,\nthese may be confused for data bytes.  Also, it doesn't understand white\nspace representing holes in the data in the line.\n.\\\" ----------  I  ---------------------------------------------------------\n.TP 8n\n\\fB\\-IDT\\fP\nThis option says to the the IDT/sim binary format to read the file.\nSee \\f[I]srec_idt\\fP(5) for a description of this file format.\n.TP 8n\n\\fB\\-Intel\\fP\nThis option says to use the Intel hex format to read the file.\nSee\n.IR srec_intel (5)\nfor a description of this file format.\n.TP 8n\n\\fB\\-INtel_HeX_16\\fP\nThis option says to use the Intel hex 16 (INHX16) format to read the file.\nSee\n.IR srec_intel16 (5)\nfor a description of this file format.\n.\\\" ----------  J  ---------------------------------------------------------\n.\\\" ----------  K  ---------------------------------------------------------\n.\\\" ----------  L  ---------------------------------------------------------\n.TP 8n\n\\fB\\-LOGIsim\\fP\nThis format is read and written by the open source Logisim program.\nSee \\f[I]srec_logisim\\fP(5) for more informatuion.\n.\\\" ----------  M  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Memory_Initialization_File\\fP\nThis option says to use the Memory Initialization File (MIF) format by\nAltera to read the file.\nSee \\f[I]srec_mif\\fP (5) for a description of this file format.\n.TP 8n\n\\fB\\-Mips_Flash_Big_Endian\\fP\n.TP 8n\n\\fB\\-Mips_Flash_Little_Endian\\fP\nThese options say to use the MIPS Flash file format to read the file.\nSee \\f[I]srec_mips_flash\\fP (5) for a description of this file format.\n.TP 8n\n\\fB\\-MOS_Technologies\\fP\nThis option says to use the Mos Technologies format to read the file.\nSee\n.IR srec_mos_tech (5)\nfor a description of this file format.\n.TP 8n\n\\fB\\-Motorola\\fP [ \\f[I]width\\fP ]\n.RS\nThis option says to use the Motorola S\\[hy]Record format to read the file.\n(May be written \\fB\\-S\\[hy]Record\\fP as well.)\nSee\n.IR srec_motorola (5)\nfor a description of this file format.\n.PP\nThe optional \\f[I]width\\fP argument describes the number of bytes which\nform each address multiple.  For normal uses the default of one (1) byte\nis appropriate.  Some systems with 16\\[hy]bit or 32\\[hy]bit targets mutilate the\naddresses in the file; this option will correct for that.\nUnlike most other parameters, this one cannot be guessed.\n.RE\n.TP 8n\n\\fB\\-MsBin\\fP\nThis option says to use the Windows CE Binary Image Data Format to\nread the file.  See \\f[I]srec_msbin\\fP(5) for a description of this\nfile format.\n.\\\" ----------  N  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Needham_Hexadecimal\\fP\nThis option says to use the Needham Electronics ASCII file format to\nread the file.  See \\f[I]srec_needham\\fP(5) for a description of this\nfile format.\n.\\\" ----------  O  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Ohio_Scientific\\fP\nThis option says to use the Ohio Scientific format.\nSee \\f[I]srec_os65v\\fP(5) for a description of this file format.\n.\\\" ----------  P  ---------------------------------------------------------\n.TP 8n\n\\fB\\-PPB\\fP\nThis option says to use the Stag Prom Programmer binary format.\nSee \\f[I]srec_ppb\\fP(5) for a description of this file format.\n.TP 8n\n\\fB\\-PPX\\fP\nThis option says to use the Stag Prom Programmer hexadecimal format.\nSee \\f[I]srec_ppx\\fP(5) for a description of this file format.\n.\\\" ----------  Q  ---------------------------------------------------------\n.\\\" ----------  R  ---------------------------------------------------------\n.\\\" ----------  S  ---------------------------------------------------------\n.TP 8n\n\\fB\\-SIGnetics\\fP\nThis option says to use the Signetics format.\nSee \\f[I]srec_spasm\\fP(5) for a description of this file format.\n.TP 8n\n\\fB\\-SPAsm\\fP\nThis is a synonym for the \\fB\\-SPAsm_Big_Endian\\fP option.\n.TP 8n\n\\fB\\-SPAsm_Big_Endian\\fP\nThis option says to use the SPASM assembler output format (commonly used\nby PIC programmers).\nSee \\f[I]srec_spasm\\fP(5) for a description of this file format.\n.TP 8n\n\\fB\\-SPAsm_Little_Endian\\fP\nThis option says to use the SPASM assembler output format,\nbut with the data the other way around.\n.TP 8n\n\\fB\\-STewie\\fP\nThis option says to use the Stewie binary format to read the file.\nSee\n.IR srec_stewie (5)\nfor a description of this file format.\n.\\\" ----------  T  ---------------------------------------------------------\n.TP 8n\n\\fB\\-Tektronix\\fP\nThis option says to use the Tektronix hex format to read the file.\nSee\n.IR srec_tektronix (5)\nfor a description of this file format.\n.TP 8n\n\\fB\\-Tektronix_Extended\\fP\nThis option says to use the Tektronix extended hex format to read the file.\nSee\n.IR srec_tektronix_extended (5)\nfor a description of this file format.\n.TP 8n\n\\fB\\-Texas_Instruments_Tagged\\fP\nThis option says to use the Texas Instruments Tagged format to read the file.\nSee\n.IR srec_ti_tagged (5)\nfor a description of this file format.\n.TP 8n\n\\fB\\-Texas_Instruments_Tagged_16\\fP\nThis option says to use the Texas Instruments SDSMAC 320 format to read\nthe file.  See\n.IR srec_ti_tagged_16 (5)\nfor a description of this file format.\n.TP 8n\n\\fB\\-Texas_Instruments_TeXT\\fP\nThis option says to use the Texas Instruments TXT (MSP430) format to\nread the file.  See \\f[I]srec_ti_txt\\fP(5) for a description of this\nfile format.\n.TP 8n\n\\fB\\-TRS80\\fP\nThis option says to use the Radio Shack TRS\\[hy]80 object file format to\nread the file.  See \\f[I]srec_trs80\\fP(5) for a description of this file\nformat.\n.\\\" ----------  U  ---------------------------------------------------------\n.\\\" ----------  V  ---------------------------------------------------------\n.TP 8n\n\\fB\\-VMem\\fP\nThis option says to use the Verilog VMEM format to read the file.\nSee \\f[I]srec_vmem\\fP(5) for a description of this file format.\n.\\\" ----------  W  ---------------------------------------------------------\n.TP 8n\n\\fB\\-WILson\\fP\nThis option says to use the wilson format to read the file.\nSee\n.IR srec_wilson (5)\nfor a description of this file format.\n.\\\" ----------  X  ---------------------------------------------------------\n.\\\" ----------  Y  ---------------------------------------------------------\n.\\\" ----------  Z  ---------------------------------------------------------\n.SS Ignore Checksums\n.so man/man1/o_ignore_checksums.so\n.so man/man1/o_multiple.so\n.SS Generators\nIt is also possible to generate data, rather than read it from a file.\nYou may use a generator anywhere you could use a file.\nAn input generator specification looks like this:\n.PP\n.in +0.25i\n\\fB\\-GENerate\\fP \\f[I]address\\[hy]range\\fP \\fB\\-\\fP\\f[I]data\\[hy]source\\fP\n.in -0.25i\n.PP\nThe \\fB\\-\\fP\\f[I]data\\[hy]source\\fP may be one of the following:\n.TP 8n\n\\fB\\-CONSTant\\fP \\f[I]byte\\[hy]value\\fP\n.RS\nThis generator manufactures data with the given byte value of the\nthe given address range.\nIt is an error if the byte\\[hy]value is not in the range 0..255.\n.PP\nFor example, to fill memory addresses 100..199 with newlines (0x0A),\nyou could use a command like\n.PP\n.nf\n.in +0.25i\n.ft CW\nsrec_cat \\-generate 100 200 \\-constant 10 \\-o newlines.srec\n.ft P\n.in -0.25i\n.fi\n.PP\nThis can, of course, be combined with data from files.\n.RE\n.TP 8n\n\\fB\\-REPeat_Data\\fP \\f[I]byte\\[hy]value\\fP...\n.RS\nThis generator manufactures data with the given byte values repeating\nover the the given address range.\nIt is an error if any of the the byte\\[hy]values are not in the range 0..255.\n.PP\nFor example, to create a data region with 0xDE in the even bytes and 0xAD\nin the odd bytes, use a generator like this:\n.PP\n.nf\n.in +0.25i\n.ft CW\nsrec_cat \\-generate 0x1000 0x2000 \\-repeat\\[hy]data 0xDE 0xAD\n.ft P\n.in -0.25i\n.fi\n.PP\nThe repeat boundaries are aligned with the base of the address range,\nmodulo the number of bytes.\n.RE\n.TP 8n\n\\fB\\-REPeat_String\\fP \\f[I]text\\fP\n.RS\nThis generator is almost identical to \\-repeat\\[hy]data except that the data\nto be repeated is the text of the given string.\n.PP\nFor example, to fill the holes in an EPROM image \\f[I]eprom.srec\\fP with the\ntext \\(lqCopyright (C) 1812 Tchaikovsky\\(rq, combine a generator and an\n\\-exclude filter, such as the command\n.PP\nIf you need to inject binary data into the string (e.g. a terminating NUL\ncharacter), use the URL encoding that uses % followed by two hexadeimal\ncharacters.  For example a backspace would be encoded as \\[lq]%08\\[rq].\n.PP\n.nf\n.in +0.25i\n.ft CW\nsrec_cat eprom.srec \\e\n    \\-generate 0 0x100000 \\e\n        \\-repeat\\[hy]string 'Copyright (C) 1812 Tchaikovsky. ' \\e\n        \\-exclude \\-within eprom.srec \\e\n    \\-o eprom.filled.srec\n.ft R\n.in -0.25i\n.fi\n.PP\nThe thing to note is that we have two data sources: the \\f[I]eprom.srec\\fP\nfile, and generated data over an address range which covers first\nmegabyte of memory but excluding areas covered by the \\f[I]eprom.srec\\fP data.\n.RE\n.TP 8n\n\\fB\\-CONSTant_Little_Endian\\fP \\f[I]value\\fP \\f[I]width\\fP\n.RS\nThis generator manufactures data with the given numeric value,\nof a given byte width, in little\\[hy]endian byte order.\nIt is an error if the given value does not fit into the given byte width.\nIt will repeat over and over within the address range range.\n.PP\nFor example, to insert a subversion commit number\ninto 4 bytes at 0x0008..0x000B you would use\na command like\n.PP\n.nf\n.in +0.25i\n.ft CW\nsrec_cat \\-generate 8 12 \\-constant\\[hy]l\\[hy]e $VERSION 4 \\e\n    \\-o version.srec\n.ft P\n.in -0.25i\n.fi\n.PP\nThis generator is a convenience wrapper around the \\fB\\-REPeat_Data\\fP\ngenerator.  It can, of course, be combined with data from files.\n.RE\n.TP 8n\n\\fB\\-CONSTant_Big_Endian\\fP \\f[I]value\\fP \\f[I]width\\fP\n.RS\nAs above, but using big\\[hy]endian byte ordering.\n.RE\n.PP\nAnything else will result in an error.\n.SS Input Filters\nYou may specify zero or more \\f[I]filters\\fP to be applied.\nFilters are applied in the order the user specifies.\n.\\\" ----------  A  ---------------------------------------------------------\n.\\\"             adler 16, big endian\n.TP 8n\n\\fB\\-Adler_16_Big_Endian\\fP \\f[I]address\\fP\n.RS\nThis filter may be used to insert an \\[lq]Adler\\[rq] 16\\[hy]bit checksum\nof the data into the data.\nTwo bytes, big\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\fBNote:\\fP If you have holes in your data, you will get a different\nAdler checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Adler checksum filters.\nYou will receive a warning if the data presented for Adler checksum has holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Adler\\[hy]32\n.RE\n.\\\"             adler 16, little endian\n.TP 8n\n\\fB\\-Adler_16_Little_Endian\\fP \\f[I]address\\fP\n.RS\nThis filter may be used to insert an Adler 16\\[hy]bit checksum\nof the data into the data.  Two bytes, in little\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\f[B]Note:\\fP If you have holes in your data, you will get a different\nAdler checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Adler filters.\nYou will receive a warning if the data presented for Adler checksum has holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Adler\\[hy]32\n.RE\n.\\\"             adler 32, big endian\n.TP 8n\n\\fB\\-Adler_32_Big_Endian\\fP \\f[I]address\\fP\n.RS\nThis filter may be used to insert a Adler 32\\[hy]bit checksum\nof the data into the data.  Four bytes, big\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\fBNote:\\fP If you have holes in your data, you will get a different\nAdler checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Adler checksum filters.\nYou will receive a warning if the data presented for Adler checksum has holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Adler\\[hy]32\n.RE\n.\\\"             adler 32, little endian\n.TP 8n\n\\fB\\-Adler_32_Little_Endian\\fP \\f[I]address\\fP\n.RS\nThis filter may be used to insert a Adler 32\\[hy]bit checksum\nof the data into the data.  Four bytes, in little\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\f[B]Note:\\fP If you have holes in your data, you will get a different\nAdler checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Adler checksum filters.\nYou will receive a warning if the data presented for Adler checksum has holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Adler\\[hy]32\n.RE\n.\\\"             and\n.TP 8n\n\\fB\\-AND\\fP \\f[I]value\\fP\nThis filter may be used to bit\\[hy]wise AND a \\f[I]value\\fP to every data byte.\nThis is useful if you need to clear bits.\nOnly existing data is altered, no holes are filled.\n.\\\" ----------  B  ---------------------------------------------------------\n.\\\"             bit reverse\n.TP 8n\n\\fB\\-Bit_Reverse\\fP [ \\f[I]width\\fP ]\nThis filter may be used to reverse the order of the bits in each data byte.\nBy specifying a width (in bytes) it is possible to reverse the order\nmulti\\[hy]byte values; this is implemented using the byte\\[hy]swap filter.\n.\\\"             byte swap\n.TP 8n\n\\fB\\-Byte_Swap\\fP [ \\f[I]width\\fP ]\nThis filter may be used to swap pairs of odd and even bytes.\nBy specifying a width (in bytes) it is possible to reverse the order\nof 4 and 8 bytes, the default is 2 bytes.  (Widths in excess of 8 are\nassumed to be number of bits.)\nIt is not possible to swap non\\[hy]power\\[hy]of\\[hy]two addresses.\nTo change the alignment, use the offset filter before and after.\n.\\\" ----------  C  ---------------------------------------------------------\n.\\\"             checksum bitnot, big endian\n.TP 8n\n\\fB\\-Checksum_BitNot_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\\n\\f[I]width\\fP ]]\nThis filter may be used to insert the one's complement checksum of the\ndata into the data, most significant byte first.\nThe data is literally summed; if there are duplicate bytes, this will\nproduce an incorrect result, if there are holes, it will be as if they were\nfilled with zeros.\nIf the data already contains bytes at the checksum location,\nyou need to use an exclude filter, or this will generate errors.\nYou need to apply and crop or fill filters before this filter.\nThe value will be written with the most significant byte first.\nThe number of bytes of resulting checksum defaults to 4.\nThe width (the width in bytes of the values being summed) defaults to 1.\n.\\\"             checksum bitnot, bittle endian\n.TP 8n\n\\fB\\-Checksum_BitNot_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\\n\\f[I]width\\fP ]]\nThis filter may be used to insert the one's complement (bitnot)\nchecksum of the data into the data, least significant byte first.\nOtherwise similar to the above.\n.\\\"             checksum negative, big endian\n.TP 8n\n\\fB\\-Checksum_Negative_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\\n\\f[I]width\\fP ]]\nThis filter may be used to insert the two's complement (negative)\nchecksum of the data into the data.  Otherwise similar to the above.\n.\\\"             checksum negative, little endian\n.TP 8n\n\\fB\\-Checksum_Negative_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\\n\\f[I]width\\fP ]]\nThis filter may be used to insert the two's complement (negative)\nchecksum of the data into the data.  Otherwise similar to the above.\n.\\\"             checksum positive, big endian\n.TP 8n\n\\fB\\-Checksum_Positive_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\\n\\f[I]width\\fP ]]\nThis filter may be used to insert the simple checksum of the data into\nthe data.  Otherwise similar to the above.\n.\\\"             checksum positive, little endian\n.TP 8n\n\\fB\\-Checksum_Positive_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\\n\\f[I]width\\fP ]]\nThis filter may be used to insert the simple checksum of the data into\nthe data.  Otherwise similar to the above.\n.\\\"             crc16, big endian\n.TP 8n\n\\fB\\-CRC16_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]modifier\\fP... ]\n.RS\nThis filter may be used to insert an industry standard 16\\[hy]bit CRC checksum\nof the data into the data.  Two bytes, big\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\nThe following additional modifiers are understood:\n.TP 8n\n\\f[I]number\\fP\nSet the polynomial to be used to the given number.\n.TP 8n\n\\fB\\-POLYnomial\\fP \\f[I]name\\fP\n.RS\nThis option may be used to set the CRC polynomial to be used, by name.\nThe known names include:\n.RS\n.TS\ntab(;);\nl r.\nibm;0x8005\nansi;0x8005\nccitt;0x1021\nt10\\[hy]dif;0x8bb7\ndnp;0x3d65\ndect;0x0589\n.TE\n.RE\n.PP\nSee http://en.wikipedia.org/wiki/Cyclic_redundancy_check for a table of\nnames and values.\n.RE\n.TP 8n\n\\fB\\-Most_To_Least\\fP\nThe CRC calculation is performed with the most significant bit in each\nbyte processed first, and then proceeding towards the least significant\nbit.  This is the default.\n.TP 8n\n\\fB\\-Least_To_Most\\fP\nThe CRC calculation is performed with the least significant bit in each\nbyte processed first, and then proceeding towards the most significant\nbit.\n.TP 8n\n\\fB\\-CCITT\nThe CCITT calculation is performed.\nThe initial seed is 0xFFFF.\nThis is the default.\n.TP 8n\n\\fB\\-XMODEM\\fP\nThe alternate XMODEM calculation is performed.\nThe initial seed is 0x0000.\n.TP 8n\n\\fB\\-BROKEN\\fP\nA common\\[hy]but\\[hy]broken calculation is performed (see note 2 below).\nThe initial seed is 0x84CF.\n.TP 8n\n\\fB\\-AUGment\nThe CRC is augmented by sixteen zero bits at the end of the calculation.\nThis is the default.\n.TP 8n\n\\fB\\-No\\[hy]AUGment\nThe CRC is not augmented at the end of the calculation.\nThis is less standard conforming, but some implementations do this.\n.PP\n\\fBNote:\\fP If you have holes in your data, you will get a different CRC\nthan if there were no holes.  This is important because the in\\[hy]memory\nEPROM image will not have holes.  You almost always want to use the\n\\fB\\-fill\\fP filter before any of the CRC filters.\nYou will receive a warning if the data presented for CRC has holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\n\\f[B]Note 2:\\fP there are a great many CRC16 implementations out there,\nsee http://www.joegeluso.com\\%/software\\%/articles\\%/ccitt.htm (now gone,\nreproduced at http://\\%srecord.sourceforge.net\\%/crc16\\-ccitt.html)\nand \\[lq]A painless guide to CRC error detection algorithms\\[rq]\nhttp://www.repairfaq.org/filipg/LINK/F_crc_v3.html for more\ninformation.  If all else fails, SRecord is open source software:\nread the SRecord source code.  The CRC16 source code (found in the\n\\f[CW]srecord/crc16.cc\\fP file of the distribution tarball) has a great\nmany explanatory comments.\n.PP\nPlease try all twelve combinations of the above options before reporting a\nbug in the CRC16 calculation.\n.RE\n.\\\"             crc16, little endian\n.TP 8n\n\\fB\\-CRC16_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]modifier\\fP... ]\nThe same as the \\fB\\-CRC16_Big_Endian\\fP filter,\nexcept in little\\[hy]endian byte order.\n.\\\"             crc32, big endian\n.TP 8n\n\\fB\\-CRC32_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]modifier\\fP... ]\n.RS\nThis filter may be used to insert an industry standard 32\\[hy]bit CRC checksum\nof the data into the data.  Four bytes, big\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\nSee also the note about holes, above.\n.PP\nThe following additional modifiers are understood:\n.TP 8n\n\\fB\\-CCITT\nThe CCITT calculation is performed.\nThe initial seed is all one bits.\nThis is the default.\n.TP 8n\n\\fB\\-XMODEM\\fP\nAn alternate XMODEM\\[hy]style calculation is performed.\nThe initial seed is all zero bits.\n.RE\n.\\\"             crc32, little endian\n.TP 8n\n\\fB\\-CRC32_Little_Endian\\fP \\f[I]address\\fP\nThe same as the \\fB\\-CRC32_Big_Endian\\fP filter,\nexcept in little\\[hy]endian byte order.\n.\\\"             crop\n.TP 8n\n\\fB\\-Crop\\fP \\f[I]address\\[hy]range\\fP\nThis filter may be used to isolate a section of data, and discard the\nrest.\n.\\\" ----------  D  ---------------------------------------------------------\n.\\\" ----------  E  ---------------------------------------------------------\n.\\\"             exclude\n.TP 8n\n\\fB\\-Exclude\\fP \\f[I]address\\[hy]range\\fP\nThis filter may be used to exclude a section of data, and keep the rest.\nThe is the logical complement of the \\fB\\-Crop\\fP filter.\n.\\\"             exclusive length, big endian\n.TP 8n\n\\fB\\-Exclusive_Length_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP \\\n[ \\f[I]width\\fP ]]\nThe same as the \\fB\\-Length_Big_Endian\\fP filter,\nexcept that the result does \\f[B]not\\fP include the length itself.\n.\\\"             exclusive length, little endian\n.TP 8n\n\\fB\\-Exclusive_Length_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP \\\n[ \\f[I]width\\fP ]]\nThe same as the \\fB\\-Length_Little_Endian\\fP filter,\nexcept that the result does \\f[B]not\\fP include the length itself.\n.\\\"             exclusive maximum, big endian\n.TP 8n\n\\fB\\-Exclusive_MAXimum_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThe same as the \\fB\\-MAXimum_Big_Endian\\fP filter,\nexcept that the result does \\f[B]not\\fP include the maximum itself.\n.\\\"             exclusive maximum, little endian\n.TP 8n\n\\fB\\-Exclusive_MAXimum_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThe same as the \\fB\\-MAXimum_Little_Endian\\fP filter,\nexcept that the result does \\f[B]not\\fP include the maximum itself.\n.\\\"             exclusive minimum, big endian\n.TP 8n\n\\fB\\-Exclusive_MINimum_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThe same as the \\fB\\-MINimum_Big_Endian\\fP filter,\nexcept that the result does \\f[B]not\\fP include the minimum itself.\n.\\\"             exclusive minimum, little endian\n.TP 8n\n\\fB\\-Exclusive_MINimum_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThe same as the \\fB\\-MINimum_Little_Endian\\fP filter,\nexcept that the result does \\f[B]not\\fP include the minimum itself.\n.\\\"             exclusive or\n.TP 8n\n\\fB\\-eXclusive\\[hy]OR\\fP \\f[I]value\\fP\nThis filter may be used to bit\\[hy]wise XOR a \\f[I]value\\fP to every data byte.\nThis is useful if you need to invert bits.\nOnly existing data is altered, no holes are filled.\n.\\\" ----------  F  ---------------------------------------------------------\n.\\\"             fill\n.TP 8n\n\\fB\\-Fill\\fP \\f[I]value\\fP \\f[I]address\\[hy]range\\fP\nThis filter may be used to fill any gaps in the data with bytes equal\nto \\f[I]value\\fP.  The fill will only occur in the address range given.\n.\\\"             fletcher 16, big endian\n.TP 8n\n\\fB\\-Fletcher_16_Big_Endian\\fP \\f[I]address\\fP \\\n[ \\f[I]sum1\\fP \\f[I]sum2\\fP [ \\f[I]answer\\fP ]]\n.RS\nThis filter may be used to insert an Fletcher 16\\[hy]bit checksum\nof the data into the data.\nTwo bytes, big\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\fBNote:\\fP If you have holes in your data, you will get a different\nFletcher checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Fletcher checksum filters.\nYou will receive a warning if the data presented for Fletcher checksum\nhas holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Fletcher%27s_checksum\n.PP\nIt is possible to select seed values for \\f[I]sum1\\fP and \\f[I]sum2\\fP\nin the algorithm, by adding seed values on the command line.  They each\ndefault to 0xFF if not explicitly stated.  The default values (0) means\nthat an empty EPROM (all 0x00 or all 0xFF) will sum to zero; by changing\nthe seeds, an empty EPROM will always fail.\n.PP\nThe third optional argument is the desired sum, when the checksum itself\nis summed.  A common value is 0x0000, placed in the last two bytes of an\nEPROM, so that the Fletcher 16 checksum of the EPROM is exactly 0x0000.\nNo manipulation of the final value is performed if this value if not specified.\n.RE\n.\\\"             fletcher 16, little endian\n.TP 8n\n\\fB\\-Fletcher_16_Little_Endian\\fP \\f[I]address\\fP\n.RS\nThis filter may be used to insert an Fletcher 16\\[hy]bit checksum\nof the data into the data.  Two bytes, in little\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\f[B]Note:\\fP If you have holes in your data, you will get a different\nFletcher checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Fletcher filters.\nYou will receive a warning if the data presented for Fletcher checksum\nhas holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Fletcher%27s_checksum\n.RE\n.\\\"             fletcher 32, big endian\n.TP 8n\n\\fB\\-Fletcher_32_Big_Endian\\fP \\f[I]address\\fP\n.RS\nThis filter may be used to insert a Fletcher 32\\[hy]bit checksum\nof the data into the data.  Four bytes, big\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\fBNote:\\fP If you have holes in your data, you will get a different\nFletcher checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Fletcher checksum filters.\nYou will receive a warning if the data presented for Fletcher checksum\nhas holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Fletcher%27s_checksum\n.RE\n.\\\"             fletcher 32, little endian\n.TP 8n\n\\fB\\-Fletcher_32_Little_Endian\\fP \\f[I]address\\fP\n.RS\nThis filter may be used to insert a Fletcher 32\\[hy]bit checksum\nof the data into the data.  Four bytes, in little\\[hy]endian order, are inserted\nat the address given.  Holes in the input data are ignored.  Bytes are\nprocessed in ascending address order (\\f[I]not\\fP in the order they appear\nin the input).\n.PP\n\\f[B]Note:\\fP If you have holes in your data, you will get a different\nFletcher checksum than if there were no holes.  This is important because\nthe in\\[hy]memory EPROM image will not have holes.  You almost always want\nto use the \\fB\\-fill\\fP filter before any of the Fletcher checksum filters.\nYou will receive a warning if the data presented for Fletcher checksum\nhas holes.\n.PP\nYou should also be aware that the lower and upper bounds of your data\nmay not be the same as the lower and upper bounds of your EPROM.  This\nis another reason to use the \\fB\\-fill\\fP filter, because it will\nestablish the data across the full EPROM address range.\n.PP\nhttp://en.wikipedia.org/wiki/Fletcher%27s_checksum\n.RE\n.\\\" ----------  G  ---------------------------------------------------------\n.\\\" ----------  H  ---------------------------------------------------------\n.\\\" ----------  I  ---------------------------------------------------------\n.\\\" ----------  J  ---------------------------------------------------------\n.\\\" ----------  K  ---------------------------------------------------------\n.\\\" ----------  L  ---------------------------------------------------------\n.\\\"             length, big endian\n.TP 8n\n\\fB\\-Length_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\f[I]width\\fP ]]\nThis filter may be used to insert the length of the data (high water\nminus low water) into the data.  This includes the length itself.\nIf the data already contains bytes at the length location,\nyou need to use an exclude filter, or this will generate errors.\nThe value will be written with the most significant byte first.\nThe number of bytes defaults to 4.\nThe width defaults to 1, and is divided into the actual length,\nthus you can insert the width in units of words (2) or longs (4).\n.\\\"             length, little endian\n.TP 8n\n\\fB\\-Length_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP [ \\f[I]width\\fP ]]\nThe same as the \\fB\\-Length_Big_Endian\\fP filter,\nexcept the value will be written with the least significant byte first.\n.\\\" ----------  M  ---------------------------------------------------------\n.\\\"             maximum, big endian\n.TP 8n\n\\fB\\-MAXimum_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThis filter may be used to insert the maximum address of the data (high water\n + 1) into the data.  This includes the maximum itself.\nIf the data already contains bytes at the given address,\nyou need to use an exclude filter, or this will generate errors.\nThe value will be written with the most significant byte first.\nThe number of bytes defaults to 4.\n.\\\"             maximum, little endian\n.TP 8n\n\\fB\\-MAXimum_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThe same as the \\fB\\-MAXimum_Big_Endian\\fP filter,\nexcept the value will be written with the least significant byte first.\n.\\\"             message digest 2 -- place holder, gcrypt does not implement yet\n.\\\"             message digest 5\n.TP 8n\n\\fB\\-Message_Digest_5 \\f[I]address\\fP\nThis filter may be used to insert a 16 byte MD5 hash into the data,\nat the address given.\n.\\\"             minimum, big endian\n.TP 8n\n\\fB\\-MINimum_Big_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThis filter may be used to insert the minimum address of the data (low\nwater) into the data.  This includes the minimum itself.\nIf the data already contains bytes at the given address,\nyou need to use an exclude filter, or this will generate errors.\nThe value will be written with the most significant byte first.\nThe number of bytes defaults to 4.\n.\\\"             minimum, little endian\n.TP 8n\n\\fB\\-MINimum_Little_Endian\\fP \\f[I]address\\fP [ \\f[I]nbytes\\fP ]\nThe same as the \\fB\\-MINimum_Big_Endian\\fP filter,\nexcept the value will be written with the least significant byte first.\n.\\\" ----------  N  ---------------------------------------------------------\n.\\\"             not\n.TP 8n\n\\fB\\-NOT\\fP\nThis filter may be used to bit\\[hy]wise NOT the value of every data byte.\nThis is useful if you need to invert the data.\nOnly existing data is altered, no holes are filled.\n.\\\" ----------  O  ---------------------------------------------------------\n.\\\"             offset\n.TP 8n\n\\fB\\-OFfset\\fP \\f[I]nbytes\\fP\n.RS\nThis filter may be used to\noffset the addresses by the given number of bytes.\nNo data is lost, the addresses will wrap around in 32 bits, if necessary.\nYou may use negative numbers for the offset,\nif you wish to move data lower in memory.\n.PP\nPlease note: the execution start address is a different concept than the\nfirst address in memory of your data.  If you want to change where your\nmonitor will start executing, use the \\fB\\-execution\\[hy]start\\[hy]address\\fP\noption (\\f[I]srec_cat\\fP(1) only).\n.RE\n.\\\"             or\n.TP 8n\n\\fB\\-OR\\fP \\f[I]value\\fP\nThis filter may be used to bit\\[hy]wise OR a \\f[I]value\\fP to every data byte.\nThis is useful if you need to set bits.\nOnly existing data is altered, no holes are filled.\n.\\\" ----------  P  ---------------------------------------------------------\n.\\\" ----------  Q  ---------------------------------------------------------\n.\\\" ----------  R  ---------------------------------------------------------\n.\\\"             random fill\n.TP 8n\n\\fB\\-Random_Fill\\fP \\f[I]address\\[hy]range\\fP\nThis filter may be used to fill any gaps in the data with random bytes.\nThe fill will only occur in the address range given.\n.\\\"             ripe message digest 160\n.TP 8n\n\\fB\\-Ripe_Message_Digest_160 \\f[I]address\\fP\nThis filter may be used to insert an RMD160 hash into the data.\n.\\\" ----------  S  ---------------------------------------------------------\n.\\\"             secure hash algorithm 1\n.TP 8n\n\\fB\\-Secure_Hash_Algorithm_1 \\f[I]address\\fP\nThis filter may be used to insert a 20 byte SHA1 hash into the data,\nat the address given.\n.\\\"             secure hash algorithm 224\n.TP 8n\n\\fB\\-Secure_Hash_Algorithm_224 \\f[I]address\\fP\nThis filter may be used to insert a 28 byte SHA224 hash into the data,\nat the address given.\nSee Change Notice 1 for FIPS 180\\[hy]2 for the specification.\n.\\\"             secure hash algorithm 256\n.TP 8n\n\\fB\\-Secure_Hash_Algorithm_256 \\f[I]address\\fP\nThis filter may be used to insert a 32 byte SHA256 hash into the data,\nat the address given.\nSee FIPS 180\\[hy]2 for the specification.\n.\\\"             secure hash algorithm 384\n.TP 8n\n\\fB\\-Secure_Hash_Algorithm_384 \\f[I]address\\fP\nThis filter may be used to insert a 48 byte SHA384 hash into the data,\nat the address given.\nSee FIPS 180\\[hy]2 for the specification.\n.\\\"             secure hash algorithm 512\n.TP 8n\n\\fB\\-Secure_Hash_Algorithm_512 \\f[I]address\\fP\nThis filter may be used to insert a 64 byte SHA512 hash into the data,\nat the address given.\nSee FIPS 180\\[hy]2 for the specification.\n.\\\"             split\n.TP 8n\n\\fB\\-SPlit\\fP \\f[I]multiple\\fP [ \\f[I]offset\\fP [ \\f[I]width\\fP ] ]\nThis filter may be used to split the input into a subset of the data,\nand compress the address range so as to leave no gaps.  This useful for\nwide data buses and memory striping.  The \\f[I]multiple\\fP is the bytes\nmultiple to split over, the \\f[I]offset\\fP is the byte offset into this\nrange (defaults to 0), the \\f[I]width\\fP is the number of bytes to extract\n(defaults to 1) within the multiple.  In order to leave no gaps, the\noutput addresses are (\\f[I]width\\fP / \\f[I]multiple\\fP) times the input\naddresses.\n.\\\"             stm32\n.TP 8n\n\\fB\\-STM32\\fP \\f[I]address\\fP\nThis is a synonym for the \\fB\\-STM32_Little_Endian\\fP filter.\n.TP 8n\n\\fB\\-STM32_Little_Endian\\fP \\f[I]address\\fP\n.TP 8n\n\\fB\\-STM32_Big_Endian\\fP \\f[I]address\\fP\n.RS\nThese filters many be use to generate the CRC used by the hardware\nCRC unit on the STM32 series of ARM MPUs.  The algorithm used by the\nSTM32 hardware unit is just a CRC32 with a different polynomial and\nword\\[hy]fed instead of byte\\[hy]fed.\n.PP\nThe \\f[I]address\\fP is where to place the 4\\[hy]byte STM32 CRC.\n.PP\nThe CRC used is documented in \\[lq]RM0041, STM32F100xx reference manual\\[rq],\npage 46, chapter \\[lq]CRC Calculation Unit\\[rq], which can be found at\n.br\nhttp://www.st.com/internet/mcu/product/216844.jsp\n.RE\n.\\\" ----------  T  ---------------------------------------------------------\n.\\\"             tiger\n.TP 8n\n\\fB\\-TIGer\\fP \\f[I]address\\fP\nThis filter may be used to insert a 24 byte TIGER/192 hash into the data\nat the address given.\n.\\\" ----------  U  ---------------------------------------------------------\n.\\\"             unfill\n.TP 8n\n\\fB\\-UnFill\\fP \\f[I]value\\fP [ \\f[I]min\\[hy]run\\[hy]length\\fP ]\nThis filter may be used to create gaps in the data with bytes equal\nto \\f[I]value\\fP.  You can think of it as reversing the effects of the\n\\fB\\-Fill\\fP filter.  The gaps will only be created if the are at least\n\\f[I]min\\[hy]run\\[hy]length\\fP bytes in a row (defaults to 1).\n.\\\"             unsplit\n.TP 8n\n\\fB\\-Un_SPlit\\fP \\f[I]multiple\\fP [ \\f[I]offset\\fP [ \\f[I]width\\fP ] ]\nThis filter may be used to reverse the effects of the split filter.\nThe arguments are identical.\nNote that the address range is expanded (\\f[I]multiple\\fP / \\f[I]width\\fP)\ntimes, leaving holes between the stripes.\n.\\\" ----------  W  ---------------------------------------------------------\n.\\\"             whirlpool\n.TP 8n\n\\fB\\-WHIrlpool \\f[I]address\\fP\nThis filter may be used to insert a 64 byte WHIRLPOOL hash into the data,\nat the address given.\n.\\\" ----------  X  ---------------------------------------------------------\n.\\\" ----------  Y  ---------------------------------------------------------\n.\\\" ----------  Z  ---------------------------------------------------------\n.SS Address Ranges\nThere are eight ways to specify an address range:\n.TP 8n\n\\f[I]minimum\\fP \\f[I]maximum\\fP\nIf you specify two number on the command line (decimal, octal and\nhexadecimal are understood, using the C conventions) this is an explicit\naddress range.  The minimum is inclusive, the maximum is exclusive (one\nmore than the last address).  If the maximum is given as zero then the\nrange extends to the end of the address space.\n.TP 8n\n\\fB\\-Within\\fP \\f[I]input\\[hy]specification\\fP\n.RS\nThis says to use the specified input file as a mask.  The range\nincludes all the places the specified input has data, and holes where\nit has holes.  The input specification need not be just a file name,\nit may be anything any other input specification can be.\n.PP\nSee also the \\fB\\-over\\fP option for a discussion on operator precedence.\n.RE\n.TP 8n\n\\fB\\-OVER\\fP \\f[I]input\\[hy]specification\\fP\n.RS\nThis says to use the specified input file as a mask.  The range extends\nfrom the minimum to the maximum address used by the input, without any\nholes, even if the input has holes.  The input specification need not be\njust a file name, it may be anything any other input specification can\nbe.\n.PP\nYou may need to enclose \\f[I]input\\[hy]specification\\fP in parentheses\nto make sure it can't misinterpret which arguments go with which input\nspecification.\nThis is particularly important when a filter\nis to follow.  For example\n.RS\n\\f[I]filename\\fP \\-fill 0 \\-over \\f[I]filename2\\fP \\-swap\\[hy]bytes\n.RE\ngroups as\n.RS\n\\f[I]filename\\fP \\-fill 0 \\-over '(' \\f[I]filename2\\fP \\-swap\\[hy]bytes ')'\n.RE\nwhen what you actually wanted was\n.RS\n\\&'(' \\f[I]filename\\fP \\-fill 0 \\-over \\f[I]filename2\\fP ')' \\-swap\\[hy]bytes\n.RE\nThe command line expression parsing tends to be \\[lq]greedy\\[rq] (or\nright associative) rather than conservative (or left associative).\n.RE\n.TP 8n\n\\f[I]address\\[hy]range\\fP \\fB\\-RAnge\\[hy]PADding\\fP \\f[I]number\\fP\n.RS\nIt is also possible to pad ranges to be whole aligned multiples of the\ngiven number.  For example\n.RS\n\\f[I]input\\[hy]file\\fP \\-fill 0xFF \\-within \\f[I]input\\[hy]file\\fP \\\n\\-range\\[hy]pad 512\n.RE\nwill fill the \\f[I]input\\[hy]file\\fP so that it consists of whole 512\\[hy]byte\nblocks, aligned on 512 byte boundaries.  Any large holes in the data\nwill also be multiples of 512 bytes, though they may have been shrunk as\nblocks before and after are padded.\n.PP\nThis operator has the same precedence as the explicit union operator.\n.RE\n.TP 8n\n\\f[I]address\\[hy]range\\fP \\fB\\-INTERsect\\fP \\f[I]address\\[hy]range\\fP\nYou can intersect two address ranges to produce a smaller address range.\nThe intersection operator has higher precedence than the implicit union\noperator (evaluated left to right).\n.TP 8n\n\\f[I]address\\[hy]range\\fP \\fB\\-UNIon\\fP \\f[I]address\\[hy]range\\fP\nYou can union two address ranges to produce a larger address range.  The\nunion operator has lower precedence than the intersection operator\n(evaluated left to right).\n.TP 8n\n\\f[I]address\\[hy]range\\fP \\fB\\-DIFference\\fP \\f[I]address\\[hy]range\\fP\nYou can difference two address ranges to produce a smaller address\nrange.  The result is the left hand range with all of the right hand\nrange removed.  The difference operator has the same precedence as the\nimplicit union operator (evaluated left to right).\n.TP 8n\n\\f[I]address\\[hy]range\\fP \\f[I]address\\[hy]range\\fP\nIn addition, all of these methods may be used, and used more than\nonce, and the results will be combined (implicit union operator, same\nprecedence as explicit union operator).\n.SS Calculated Values\nMost of the places above where a number is expected, you may supply one\nof the following:\n.TP 8n\n\\f[B]\\-\\fP \\f[I]value\\fP\n.RS\nThe value of this expression is the negative of the expression argument.\nNote the \\f[B]space\\fP between the minus sign and its argument:\nthis space is mandatory.\n.RS\n.ft CW\nsrec_cat in.srec \\-offset \\[mi] \\-minimum\\[hy]addr in.srec \\-o out.srec\n.ft P\n.RE\nThis example shows how to move data to the base of memory.\n.RE\n.TP 8n\n\\f[CW](\\fP \\f[I]value\\fP \\f[CW])\\fP\nYou may use parentheses for grouping.\nWhen using parentheses,\nthey must each be a separate command line argument,\nthey can't be within the text of the preceding or following option,\nand you will need to quote them to get them past the shell,\nsuch as \\f[CW]'('\\fP and \\f[CW]')'\\fP.\n.TP 8n\n\\fB\\-MINimum\\[hy]Address\\fP \\f[I]input\\[hy]specification\\fP\n.RS\nThis inserts the minimum address of the specified input file.\nThe input specification need not be just a file name,\nit may be anything any other input specification can be.\n.PP\nSee also the \\fB\\-over\\fP option for a discussion on operator precedence.\n.RE\n.TP 8n\n\\fB\\-MAXimum\\[hy]Address\\fP \\f[I]input\\[hy]specification\\fP\n.RS\nThis inserts the maximum address of the specified input file, plus one.\nThe input specification need not be just a file name,\nit may be anything any other input specification can be.\n.PP\nSee also the \\fB\\-over\\fP option for a discussion on operator precedence.\n.RE\n.TP 8n\n\\fB\\-Length\\fP \\f[I]input\\[hy]specification\\fP\n.RS\nThis inserts the length of the address range in the specified input file,\nignoring any holes.  The input specification need not be just a file name,\nit may be anything any other input specification can be.\n.PP\nSee also the \\fB\\-over\\fP option for a discussion on operator precedence.\n.RE\n.PP\nFor example, the \\fB\\-OVER\\fP \\f[I]input\\[hy]specification\\fP\noption can be thought of as short\\[hy]hand for\n\\fB'(' \\-min\\fP \\f[I]file\\fP \\fB\\-max\\fP \\f[I]file\\fP \\fB')'\\fP,\nexcept that it is\nmuch easier to type, and also more efficient.\n.PP\nIn addition, calculated values may optionally be rounded in one of three ways:\n.TP 8n\n\\f[I]value\\fP \\fB\\-Round_Down\\fP \\f[I]number\\fP\nThe \\f[I]value\\fP is rounded down to the the largest integer smaller than\nor equal to a whole multiple of the \\f[I]number\\fP.\n.TP 8n\n\\f[I]value\\fP \\fB\\-Round_Nearest\\fP \\f[I]number\\fP\nThe \\f[I]value\\fP is rounded to the the nearest whole multiple of\nthe \\f[I]number\\fP.\n.TP 8n\n\\f[I]value\\fP \\fB\\-Round_Up\\fP \\f[I]number\\fP\nThe \\f[I]value\\fP is rounded up to the the smallest integer larger than\nor equal to a whole multiple of the \\f[I]number\\fP.\n.PP\nWhen using parentheses,\nthey must each be a separate command line argument,\nthey can't be within the text of the preceding or following option,\nand you will need to quote them to get them past the shell,\nas \\f[CW]'('\\fP and \\f[CW]')'\\fP.\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man1/srec_license.1",
    "content": ".TH GPL GNU GPL GNU \"Free Software Foundation\"\n.PP\n.ce 2\nGNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n.if require_index \\{\n.XX \"srec_license(1)\" \"GNU General Public License\"\n.\\}\n.PP\nCopyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\nEveryone is permitted to copy and distribute verbatim copies\nof this license document, but changing it is not allowed.\n.PP\n.ce 1\nPreamble\n.PP\nThe GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n.PP\nThe licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program \\- to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n.PP\nWhen we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n.PP\nTo protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n.PP\nFor example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n.PP\nDevelopers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n.PP\nFor the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n.PP\nSome devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n.PP\nFinally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general\\[hy]purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non\\[hy]free.\n.PP\nThe precise terms and conditions for copying, distribution and\nmodification follow.\n.ne 2i\n.PP\n.ce 1\nTERMS AND CONDITIONS\n.PP\n0. Definitions.\n.PP\n\\[lq]This License\\[rq] refers to version 3 of the GNU General Public License.\n.PP\n\\[lq]Copyright\\[rq] also means copyright\\[hy]like laws that apply to other kinds of\nworks, such as semiconductor masks.\n.PP\n\\[lq]The Program\\[rq] refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \\[lq]you\\[rq].  \\[lq]Licensees\\[rq] and\n\\[lq]recipients\\[rq] may be individuals or organizations.\n.PP\nTo \\[lq]modify\\[rq] a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \\[lq]modified version\\[rq] of the\nearlier work or a work \\[lq]based on\\[rq] the earlier work.\n.PP\nA \\[lq]covered work\\[rq] means either the unmodified Program or a work based\non the Program.\n.PP\nTo \\[lq]propagate\\[rq] a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n.PP\nTo \\[lq]convey\\[rq] a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n.PP\nAn interactive user interface displays \\[lq]Appropriate Legal Notices\\[rq]\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n.ne 2i\n.PP\n1. Source Code.\n.PP\nThe \\[lq]source code\\[rq] for a work means the preferred form of the work\nfor making modifications to it.  \\[lq]Object code\\[rq] means any non\\[hy]source\nform of a work.\n.PP\nA \\[lq]Standard Interface\\[rq] means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n.PP\nThe \\[lq]System Libraries\\[rq] of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\\[lq]Major Component\\[rq], in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n.PP\nThe \\[lq]Corresponding Source\\[rq] for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general\\[hy]purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n.PP\nThe Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n.PP\nThe Corresponding Source for a work in source code form is that\nsame work.\n.ne 2i\n.PP\n2. Basic Permissions.\n.PP\nAll rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n.PP\nYou may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n.PP\nConveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n.PP\n3. Protecting Users' Legal Rights From Anti\\[hy]Circumvention Law.\n.PP\nNo covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n.PP\nWhen you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n.PP\n4. Conveying Verbatim Copies.\n.PP\nYou may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon\\[hy]permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n.PP\nYou may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n.PP\n5. Conveying Modified Source Versions.\n.PP\nYou may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n.TP 4n\na)\nThe work must carry prominent notices stating that you modified\nit, and giving a relevant date.\n.TP 4n\nb)\nThe work must carry prominent notices stating that it is\nreleased under this License and any conditions added under section\n7.  This requirement modifies the requirement in section 4 to\n\\[lq]keep intact all notices\\[rq].\n.TP 4n\nc)\nYou must license the entire work, as a whole, under this\nLicense to anyone who comes into possession of a copy.  This\nLicense will therefore apply, along with any applicable section 7\nadditional terms, to the whole of the work, and all its parts,\nregardless of how they are packaged.  This License gives no\npermission to license the work in any other way, but it does not\ninvalidate such permission if you have separately received it.\n.TP 4n\nd)\nIf the work has interactive user interfaces, each must display\nAppropriate Legal Notices; however, if the Program has interactive\ninterfaces that do not display Appropriate Legal Notices, your\nwork need not make them do so.\n.PP\nA compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\\[lq]aggregate\\[rq] if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n.ne 2i\n.PP\n6. Conveying Non\\[hy]Source Forms.\n.PP\nYou may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine\\[hy]readable Corresponding Source under the terms of this License,\nin one of these ways:\n.TP 4n\na)\nConvey the object code in, or embodied in, a physical product\n(including a physical distribution medium), accompanied by the\nCorresponding Source fixed on a durable physical medium\ncustomarily used for software interchange.\n.TP 4n\nb)\nConvey the object code in, or embodied in, a physical product\n(including a physical distribution medium), accompanied by a\nwritten offer, valid for at least three years and valid for as\nlong as you offer spare parts or customer support for that product\nmodel, to give anyone who possesses the object code either (1) a\ncopy of the Corresponding Source for all the software in the\nproduct that is covered by this License, on a durable physical\nmedium customarily used for software interchange, for a price no\nmore than your reasonable cost of physically performing this\nconveying of source, or (2) access to copy the\nCorresponding Source from a network server at no charge.\n.TP 4n\nc)\nConvey individual copies of the object code with a copy of the\nwritten offer to provide the Corresponding Source.  This\nalternative is allowed only occasionally and noncommercially, and\nonly if you received the object code with such an offer, in accord\nwith subsection 6b.\n.TP 4n\nd)\nConvey the object code by offering access from a designated\nplace (gratis or for a charge), and offer equivalent access to the\nCorresponding Source in the same way through the same place at no\nfurther charge.  You need not require recipients to copy the\nCorresponding Source along with the object code.  If the place to\ncopy the object code is a network server, the Corresponding Source\nmay be on a different server (operated by you or a third party)\nthat supports equivalent copying facilities, provided you maintain\nclear directions next to the object code saying where to find the\nCorresponding Source.  Regardless of what server hosts the\nCorresponding Source, you remain obligated to ensure that it is\navailable for as long as needed to satisfy these requirements.\n.TP 4n\ne)\nConvey the object code using peer\\[hy]to\\[hy]peer transmission, provided\nyou inform other peers where the object code and Corresponding\nSource of the work are being offered to the general public at no\ncharge under subsection 6d.\n.PP\nA separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n.PP\nA \\[lq]User Product\\[rq] is either (1) a \\[lq]consumer product\\[rq], which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \\[lq]normally used\\[rq] refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non\\[hy]consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n.PP\n\\[lq]Installation Information\\[rq] for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n.PP\nIf you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n.PP\nThe requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n.PP\nCorresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n.ne 2i\n.PP\n7. Additional Terms.\n.PP\n\\[lq]Additional permissions\\[rq] are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n.PP\nWhen you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n.PP\nNotwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n.TP 4n\na)\nDisclaiming warranty or limiting liability differently from the\nterms of sections 15 and 16 of this License; or\n.TP 4n\nb)\nRequiring preservation of specified reasonable legal notices or\nauthor attributions in that material or in the Appropriate Legal\nNotices displayed by works containing it; or\n.TP\nc)\nProhibiting misrepresentation of the origin of that material, or\nrequiring that modified versions of such material be marked in\nreasonable ways as different from the original version; or\n.TP 4n\nd)\nLimiting the use for publicity purposes of names of licensors or\nauthors of the material; or\n.TP 4n\ne)\nDeclining to grant rights under trademark law for use of some\ntrade names, trademarks, or service marks; or\n.TP 4n\nf)\nRequiring indemnification of licensors and authors of that\nmaterial by anyone who conveys the material (or modified versions of\nit) with contractual assumptions of liability to the recipient, for\nany liability that these contractual assumptions directly impose on\nthose licensors and authors.\n.PP\nAll other non\\[hy]permissive additional terms are considered \\[lq]further\nrestrictions\\[rq] within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n.PP\nIf you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n.PP\nAdditional terms, permissive or non\\[hy]permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n.ne 2i\n.PP\n8. Termination.\n.PP\nYou may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n.PP\nHowever, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n.PP\nMoreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n.PP\nTermination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n.ne 2i\n.PP\n9. Acceptance Not Required for Having Copies.\n.PP\nYou are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer\\[hy]to\\[hy]peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n.ne 2i\n.PP\n10. Automatic Licensing of Downstream Recipients.\n.PP\nEach time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n.PP\nAn \\[lq]entity transaction\\[rq] is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n.PP\nYou may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross\\[hy]claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n.ne 2i\n.PP\n11. Patents.\n.PP\nA \\[lq]contributor\\[rq] is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \\[lq]contributor version\\[rq].\n.PP\nA contributor's \\[lq]essential patent claims\\[rq] are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \\[lq]control\\[rq] includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n.PP\nEach contributor grants you a non\\[hy]exclusive, worldwide, royalty\\[hy]free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n.PP\nIn the following three paragraphs, a \\[lq]patent license\\[rq] is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \\[lq]grant\\[rq] such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n.PP\nIf you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \\[lq]Knowingly relying\\[rq] means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n.PP\nIf, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n.PP\nA patent license is \\[lq]discriminatory\\[rq] if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non\\[hy]exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n.PP\nNothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n.ne 2i\n.PP\n12. No Surrender of Others' Freedom.\n.PP\nIf conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n.ne 2i\n.PP\n13. Use with the GNU Affero General Public License.\n.PP\nNotwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n.ne 2i\n.PP\n14. Revised Versions of this License.\n.PP\nThe Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n.PP\nEach version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \\[lq]or any later version\\[rq] applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n.PP\nIf the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n.PP\nLater license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n.ne 2i\n.PP\n15. Disclaimer of Warranty.\n.PP\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \\[lq]AS IS\\[rq] WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n.ne 2i\n.PP\n16. Limitation of Liability.\n.PP\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n.ne 2i\n.PP\n17. Interpretation of Sections 15 and 16.\n.PP\nIf the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n.PP\n.ce 1\nEND OF TERMS AND CONDITIONS\n.ne 2i\n.PP\n.ce 1\nHow to Apply These Terms to Your New Programs\n.PP\nIf you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n.PP\nTo do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \\[lq]copyright\\[rq] line and a pointer to where the full notice is found.\n.PP\n.RS 4n\n.if n <\n.if t .ft I\none line to give the program's name and a brief idea of what it does.\n.if t .ft P\n.if n >\n.br\nCopyright (C)\n.if n <\n.if t .ft I\nyear\n.if t .ft P\n.if n >\n.if n <\n.if t .ft I\nname of author\n.if t .ft P\n.if n >\n.PP\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n.PP\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n.PP\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <http://www.gnu.org/licenses/>.\n.RE\n.PP\nAlso add information on how to contact you by electronic and paper mail.\n.PP\nIf the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n.PP\n.RS 4n\n<program>  Copyright (C) <year>  <name of author>\n.br\nThis program comes with ABSOLUTELY NO WARRANTY; for details type \\[lq]show w\\[rq].\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; type \\[lq]show c\\[rq] for details.\n.RE\n.PP\nThe hypothetical commands \\[lq]show w\\[rq] and \\[lq]show c\\[rq] should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \\[lq]about box\\[rq].\n.PP\nYou should also get your employer (if you work as a programmer) or school,\nif any, to sign a \\[lq]copyright disclaimer\\[rq] for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n.PP\nThe GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why\\[hy]not\\[hy]lgpl.html>.\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man3/srecord.3",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2010, 2011 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srecord\n.TH \\*(n) 3 SRecord \"Reference Manual\"\n.SH NAME\nsrecord \\- library to manipulate EPROM load files\n.SH SYNOPSIS\n#include <srecord/\\f[I]name\\fP.h>\n.sp\ncc ... \\-lsrecord\n.SH DESCRIPTION\nThe srecord sjared library may be used to add all of the EPROM file\nformats and filters to your own projects.\n.PP\nThe full documentation for the shared library is generated by Doxygen\nfrom the source files, and is available on the Internet at\n.br\nhttp://srecord.sourceforge.net/srecord/index.html\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man3/srecord_license.3",
    "content": ".TH LGPL 3 LGPL GNU \"Free Software Foundation\"\n.SH NAME\nLGPG \\- GNU Lesser General Public License\n.SH DESCRIPTION\n.PP\n.ce 2\nGNU LESSER GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n.if require_index \\{\n.XX \"srecord_license(3)\" \"GNU Lesser General Public License\"\n.\\}\n.PP\nCopyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n.br\nEveryone is permitted to copy and distribute verbatim copies\nof this license document, but changing it is not allowed.\n.PP\nThis version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n.SH \"0. Additional Definitions. \"\nAs used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n.PP\n\"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n.PP\nAn \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n.PP\nA \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n.PP\nThe \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n.PP\nThe \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n.SH \"1. Exception to Section 3 of the GNU GPL.\"\nYou may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n.SH \"2. Conveying Modified Versions.\"\nIf you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n.TP 4m\na)\nunder this License, provided that you make a good faith effort to\nensure that, in the event an Application does not supply the\nfunction or data, the facility still operates, and performs\nwhatever part of its purpose remains meaningful, or\n.TP 4m\nb)\nunder the GNU GPL, with none of the additional permissions of\nthis License applicable to that copy.\n.SH \"3. Object Code Incorporating Material from Library Header Files.\"\nThe object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n.TP 4m\na)\nGive prominent notice with each copy of the object code that the\nLibrary is used in it and that the Library and its use are\ncovered by this License.\n.TP 4m\nb)\nAccompany the object code with a copy of the GNU GPL and this license\ndocument.\n.SH \"4. Combined Works.\"\nYou may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n.TP 4m\na)\nGive prominent notice with each copy of the Combined Work that\nthe Library is used in it and that the Library and its use are\ncovered by this License.\n.TP 4m\nb)\nAccompany the Combined Work with a copy of the GNU GPL and this license\ndocument.\n.TP 4m\nc)\nFor a Combined Work that displays copyright notices during\nexecution, include the copyright notice for the Library among\nthese notices, as well as a reference directing the user to the\ncopies of the GNU GPL and this license document.\n.TP 4m\nd)\n.RS\nDo one of the following:\n.TP 4m\n0)\nConvey the Minimal Corresponding Source under the terms of this\nLicense, and the Corresponding Application Code in a form\nsuitable for, and under terms that permit, the user to\nrecombine or relink the Application with a modified version of\nthe Linked Version to produce a modified Combined Work, in the\nmanner specified by section 6 of the GNU GPL for conveying\nCorresponding Source.\n.TP 4m\n1)\nUse a suitable shared library mechanism for linking with the\nLibrary.  A suitable mechanism is one that (a) uses at run time\na copy of the Library already present on the user's computer\nsystem, and (b) will operate properly with a modified version\nof the Library that is interface\\[hy]compatible with the Linked\nVersion.\n.RE\n.TP 4m\ne)\nProvide Installation Information, but only if you would otherwise\nbe required to provide such information under section 6 of the\nGNU GPL, and only to the extent that such information is\nnecessary to install and execute a modified version of the\nCombined Work produced by recombining or relinking the\nApplication with a modified version of the Linked Version. (If\nyou use option 4d0, the Installation Information must accompany\nthe Minimal Corresponding Source and Corresponding Application\nCode. If you use option 4d1, you must provide the Installation\nInformation in the manner specified by section 6 of the GNU GPL\nfor conveying Corresponding Source.)\n.SH \"5. Combined Libraries.\"\nYou may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n.TP 4m\na)\nAccompany the combined library with a copy of the same work based\non the Library, uncombined with any other library facilities,\nconveyed under the terms of this License.\n.TP 4m\nb)\nGive prominent notice with the combined library that part of it\nis a work based on the Library, and explaining where to find the\naccompanying uncombined form of the same work.\n.SH \"6. Revised Versions of the GNU Lesser General Public License.\"\nThe Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n.PP\nEach version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n.PP\nIf the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_aomf.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2004, 2006-2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_aomf\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_aomf \\- Intel Absolute Object Module Format\n.if require_index \\{\n.XX \"srec_aomf(5)\" \"Intel Absolute Object Module Format\"\n.\\}\n.SH DESCRIPTION\nThe Absolute Object Module Format (AOMF) is a subset of the 8051 OMF.\nThe structure of an absolute object file (the order of the records in\nit) is similar to that of a relocatable object file.  There are three\nmain differences:  the first is that an absolute object file contains\none module only, the second is that not all the records can appear in\nthe absolute file and the third is that the records can contain only\nabsolute information.\n.SS Generic Record Format\nEach record starts with a record type which indicates the type of the\nrecord, and record length which contain the number of bytes in the record\nexclusive of the first two fields. The record ends with a checksum byte\nwhich contains the 2s complement of the sum (modulo 256) of all other\nbytes in the record.  Therefore the sum (modulo 256) of all bytes in\nthe record is zero.\n.PP\nThe record length includes the payload and checksum fields, but excludes\nthe type and length fields.\n.PP\nAll 16\\[hy]bit fields are little\\[hy]endian.\n.TS\ntab(;),center,allbox;\nce ce ce ce.\nT{\nREC\n.br\nTYP\n.br\n8 bits\nT};T{\nRecord\n.br\nLength\n.br\n16 bits\nT};T{\nPayload\nT};T{\nCHK\n.br\nSUM\n.br\n8 bits\nT}\n.TE\n.PP\nHere are some of the relevant record types:\n.TS\ntab(;),center;\nl l.\n0x01;Scope Definition Record\n0x02;Module Start Record\n0x04;Module End Record\n0x06;Content Record\n0x0E;Segment Definition Record\n0x12;Debug Items Record\n0x16;Public Definition Record\n0x18;External Definition Record\n.TE\n.PP\nNames are not stored as C strings.  Names are stored as a length byte\nfollowed by the contents.\n.SS Structure\nAn AOMF file consists of a module header record (0x02), followed by one\nor more content (0x06), scope (0x01) or debug (0x12) records, and ends\nin a module end record (0x04).\n.PP\nThe records with the following types are extraneous (they may appear\nin the file but are ignored):  0x0E, 0x16 and 0x18 (definition records).\nAll records which are not part of the AOMF and are not extraneous are\nconsidered erroneous.\n.SS Module Header Record\n.TS\ntab(;),center,allbox;\nce ce ce ce ce ce.\nT{\nREC\n.br\nTYP\n.br\n0x02\nT};T{\nRecord\n.br\nLength\n.br\n16 bits\nT};T{\nModule\n.br\nName\nT};T{\nTRN ID\n.br\n8 bits\nT};T{\nzero\n.br\n8 bits\nT};T{\nCHK\n.br\nSUM\n.br\n8 bits\nT}\n.TE\n.PP\nEach module must starts with a module header record.  It is used to\nidentify the module for the RL51 and other future processors of 8051\nobject files.  In addition to the Module Name the record contains:\n.TP 8n\nTRN ID\nThe byte identifies the program which has generated this module:\n.TS\ntab(;),center;\nl l.\n0xFD;ASM51\n0xFE;PL/M\\-51\n0xFF;RL51.\n.TE\n.SS Module End Record\n.TS\ntab(;),center,allbox;\nce ce ce ce ce ce ce.\nT{\nREC\n.br\nTYP\n.br\n0x04\nT};T{\nRecord\n.br\nLength\n.br\n16 bits\nT};T{\nModule\n.br\nName\nT};T{\nzero\n.br\n16 bits\nT};T{\nREG\n.br\nMSK\n.br\n8 bits\nT};T{\nzero\n.br\n8 bits\nT};T{\nCHK\n.br\nSUM\n.br\n8 bits\nT}\n.TE\n.PP\nThe record ends the module sequence and contains the following\ninformation:  characteristics\n.TP 8n\nMODULE NAME\nThe name of the module is given here for a consistency check.  It must\nmatch the name given in the Module Header Record.\n.TP 8n\nREGISTER MASK (REG MSK)\n.RS\nThe field contains a bit for each of the four register banks.  Each bit,\nwhen set specifies that the corresponding bank is used by the module:\n.TP 8n\nBit 0 (the least significant bit)\nbank #0.\n.TP 8n\nBit 1\nbank #1.\n.TP 8n\nBit 2\nbank #2.\n.TP 8n\nBit 3\nbank #3.\n.RE\n.SS Content Record\n.TS\ntab(;),center,allbox;\nce ce ce ce ce ce.\nT{\nREC\n.br\nTYP\n.br\n0x06\nT};T{\nRecord\n.br\nLength\n.br\n16 bits\nT};T{\nSEG ID\n.br\n8 bits\nT};T{\nOffset\n.br\n16 bits\nT};T{\nDATA\nT};T{\nCHK\n.br\nSUM\n.br\n8 bits\nT}\n.TE\n.PP\nThis record provides one or more bytes of contiguous data, from which\na portion of a memory image may be constructed.\n.TP 8n\nSEG ID\nThis field must be zero.\n.TP 8n\nOFFSET\nGives the absolute address of the first byte of data in the record,\nwithin the CODE address space.\n.TP 8n\nDATA\nA sequence of data bytes to be loaded from OFFSET to OFFSET+RECORDLENGTH\\[mi]5.\n.SS Size Multiplier\nIn general, raw binary data will expand in sized by approximately 1.02 times\nwhen represented with this format.\n.SH SOURCE\n.nf\nhttp://www.intel.com/design/mcs96/swsup/omf96_pi.pdf\nftp://download.intel.com/design/mcs51/SWSUP/omf51.exe (zip archive)\nhttp://www.elsist.net/WebSite/ftp/various/OMF51EPS.pdf\n.fi\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_ascii_hex.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2000, 2001, 2003, 2006-2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_ascii_hex\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_ascii_hex \\- Ascii\\[hy]Hex file format\n.if require_index \\{\n.XX \"srec_ascii_hex(5)\" \"Ascii\\[hy]Hex file format\"\n.\\}\n.SH DESCRIPTION\nThis format is also known as the \\fIAscii\\[hy]Space\\[hy]Hex\\fP or\n\\fIAscii\\[hy]Hex\\[hy]Space\\fP format.\nIf you know who invented this format, please let me know.  If you have\na better or more complete description, I'd like to know that, too.\n.PP\nThe file starts with a start\\[hy]of\\[hy]text (STX or Control\\[hy]B)\ncharacter (0x02).\nEverything before the STX is ignored.\n.LP\nEach data byte is represented as 2 hexadecimal characters, followed by\nan \"execution character\".  The default execution character is a space,\nalthough many programs which write this format omit the space\ncharacter immediately preceding end\\[hy]of\\[hy]line.\n.LP\nThe address for data bytes is set by using a sequence of\n\\f[CW]$A\\fP\\f[CI]nnnn\\fP\\f[CW],\\fP characters, where \\fInnnn\\fP is the\n4\\[hy]character ascii representation of the address.  The comma is required.\nThere is no need for an address record unless there are gaps.  Implicitly,\nthe file starts a address 0 if no address is set before the first\ndata byte.\n.PP\nThe file ends with an end\\[hy]of\\[hy]text (ETX or Control\\[hy]C)\ncharacter (0x03).\nEverything following the ETX is ignored.\n.PP\nIt is also possible to specify a running 16\\[hy]bit checksum using a sequence\nof \\f[CW]$S\\fP\\f[CI]nnnn\\fP\\f[CW],\\fP characters, although this usually\nappears \\fIafter\\fP the ETX character and is thus often ignored.\n.SS Variant Forms\nIn addition to a space character, the execution character can also be\npercent (%) called \"ascii\\[hy]hex\\[hy]percent\" format, apostrophe (') or comma\n(,) called \"ascii\\[hy]hex\\[hy]comma\" format.  The file must use the same\nexecution character throughout.\n.PP\nIf the execution character is a comma, the address and checksum commands\nare terminated by a dot (.) rather than a comma (,).\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 3.0 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example ascii\\[hy]hex file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x1000.\n.RS\n.nf\n.ft CW\n^B $A1000,\n48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 0A ^C\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_atmel_generic.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2001, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_atmel_generic\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_atmel_generic \\- Atmel Generic file format\n.if require_index \\{\n.XX \"srec_atmel_generic(5)\" \"Atmel Generic file format\"\n.\\}\n.SH DESCRIPTION\nThis format is the output of the Atmel AVR assembler.\nThe file contains two columns of hexadecimal coded values.\nThe first column is the 24\\[hy]bit word address,\nthe second column is the 16\\[hy]bit word data.\nThe columns are separated by a colon (`:') character.\n.PP\nBy default, SRecord treats this is little\\[hy]endian data (the least\nsignificant byte first).  If you want big endian order,\nuse the \\-atmel\\[hy]generic\\[hy]be argument instead.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 6.0 times\nwhen represented with this format (6.5 times in Windows).\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Atmel Generic file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at bytes address 0x0100\n(but remember, the file contents are word addressed).\n.RS\n.nf\n.ft CW\n000080:4865\n000081:6C6C\n000082:6F2C\n000083:2057\n000084:6F72\n000085:6C64\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_binary.5",
    "content": "'\\\" t\n.\\\" srecord - The \"srecord\" program.\n.\\\" Copyright (C) 2007-2009, 2011 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program.  If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_binary\n.TH srec_binary 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_binary \\- binary file format\n.if require_index \\{\n.XX \"srec_binary(5)\" \"Binary file format\"\n.\\}\n.SH DESCRIPTION\nIt is possible to read and write binary files using \\f[I]srec_cat\\fP(1).\n.SS File Holes\nA file hole is a portion of a regular file that contains NUL characters\nand is not stored in any data block on disk.  Holes are a long\\[hy]standing\nfeature of Unix files.  For instance, the following Unix command creates\na file in which the first bytes are a hole:\n.PP\n.RS\n.nf\n.ft CW\n$ echo \\-n \"X\" | dd of=/tmp/hole bs=1024 seek=6\n$\n.ft P\n.fi\n.RE\n.PP\nNow \\f[CW]/tmp/hole\\fP has 6,145 characters (6,144 NUL characters\nplus an X character), yet the file occupies just one data block on\ndisk.\n.PP\nFile holes were introduced to avoid wasting disk space.  They are\nused extensively by database applications and, more generally, by all\napplications that perform hashing on files.\n.PP\nSee\nhttp://www.oreilly.com/catalog/linuxkernel2/chapter/ch17.pdf\nfor more information.\n.SS Reading\nThe size of binary files is taken from the size of the file on the file system.\nIf the file has holes these will read as blocks of NUL (zero) data,\nas there is no elegant way to detect Unix file holes.\nIn general, you probably want to use the \\fB\\-unfill\\fP filter\nto find and remove large swathes of zero bytes.\n.SS Writing\nIn producing a binary file, \\f[I]srec_cat\\fP(1) honours the address\ninformation and places the data into the binary file at the addresses\nspecified in the hex file.  This usually results on holes in the file.\nSometimes alarmingly large file sizes are reported as a result.\n.PP\nIf you are on a brain\\[hy]dead operating system without file holes then\nthere are going to be real data blocks containing real zero bytes,\nand consuming real amounts of disk space.  Upgrade \\- I suggest Linux.\n.PP\nTo make a file of the size you expect, use\n.PP\n.RS\nsrec_info foo.s19\n.RE\n.PP\nto find the lowest address, then use\n.PP\n.RS\nsrec_cat foo.s19 \\-intel \\-offset \\-\\f[I]n\\fP \\-o foo.bin \\-binary\n.RE\n.PP\nwhere \\f[I]n\\fP is the lowest address present in the \\f[CW]foo.s19\\fP\nfile, as reported by \\f[I]srec_info\\fP(1).  The \\f[B]negative\\fP offset\nserves to move the data down to have an origin of zero.\n.SH SEE ALSO\n.TP 8n\n\\f[I]srec_input\\fP(1)\nfor a description of the \\fB\\-unfill\\fP filter\n.TP 8n\n\\f[I]srec_examples\\fP(1)\nhas a section about binary files, and ways of automagically\noffseting the data back to zero in a single command.\n.ds n) SRrecord\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_brecord.5",
    "content": "'\\\" t\n.\\\"     srecord - The \"srecord\" program.\n.\\\"     Copyright (C) 2007-2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_brecord\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_brecord \\- Freescale MC68EZ328 Dragonball bootstrap record format\n.if require_index \\{\n.XX \"srec_brecord(5)\" \"Freescale MC68EZ328 Dragonball bootstrap record format\"\n.\\}\n.\\\" ------------------------------------------------------------------------\n.SH DESCRIPTION\nThis data format is understood by Freescale MC68EZ328 Dragonball series\nprocessors on their internal UART.\n.SS Lines\nEach line contains hexadecimal data, each byte represented by two\nhexadecimal nybbles in upper case.  Characters not in this set, but\nlarger than 0x30 (e.g. lower case) will be ignored, less than 0x30\n(e.g. CR or LF) are considered record terminators.\nComments are problematic; don't try this at home.\n.SS Fields\nEach line contains a 4\\[hy]byte address (big endian), a 1\\[hy]byte\nlength\\[hy]and\\[hy]mode, and then data bytes as dictated by the length.\nThere is \\f[B]no\\fP checksum.\nA zero length record is an execution start address record,\nnon\\[hy]zero length records are data.\n.TS\nallbox,center,tab(/);\nc c c c c c c c c c c c.\n1/2/3/4/5/6/7/8/9/10/\\&.../\\f[I]n\\fP\n.T&\nc s s s s s s s c s c s.\nAddress/Length/Data\n.TE\n.LP\nThe length\\[hy]and\\[hy]mode byte is formatted as follows:\n.TS\nallbox,center,tab(/);\nc c c c c c c c.\n7/6/5/4/3/2/1/0\n.T&\nc s c c s s s s.\nMode/R/Length\n.TE\n.TP 8n\n\\f[I]Mode\\fP\nThese bits are ignored by SRecord in input\n(00 = bytes, 01 = half words, 10 is\nreserved, 11 = long words).\nThese bits are always zero on output by SRecord.\n.TP 8n\n\\f[I]R\\fP\nThis bit indicates a data read rather than a data write;\nSRecord does not accept input files with this bit set,\nand will not set it on output.\n.TP 8n\n\\f[I]Length\\fP\nThe length of the records data bytes.\nIt does not include the address or length bytes.\nThe maximum payload of a record is 31 bytes of data.\n.SS Size Multiplier\nIn general, binary data will expand in sized by at least 2.35 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example b\\[hy]record format file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\n000000000D48656C6C6F2C20576F726C640A\n.ft P\n.fi\n.RE\n.SH SEE ALSO\nhttp://www.freescale.com/files/32bit/doc/ref_manual/MC68VZ328UM.pdf\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_coe.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2012 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_coe.5\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_coe \\- Xilinx Coefficient File Format\n.if require_index \\{\n.XX \"srec_coe(5)\" \"Xilinx Coefficient File Format\"\n.\\}\n.SH DESCRIPTION\nThe Xilinx Coefficient File Format\nhas a general syntax of the form:\n.TS\ntab(*);\nl l l l l\nl l l l l\nl l l s s.\n\\f[I]keyword\\fP*\\[eq]*\\f[I]value\\fP*;*\\f[I]optional comment\\fP\n\\f[I]radix\\[hy]keyword\\fP*\\[eq]*\\f[I]value\\fP*;*\\f[I]optional comment\\fP\n\\f[I]data\\[hy]keyword\\fP*\\[eq]*\\f[I]value\\fP, ..., \\f[I]value\\fP\\f[B];\\fP\n.TE\n.PP\nThere are numerous keywords, only the \\[lq]memory_initialization_radix\\[rq]\nand \\[lq]memory_initialization_vector\\[rq] keywords are used.\nThe semicolons are mandatory.\n.SS Size Multiplier\nBinary data stored in this format expand approximately 4 times\n(5 time on Windows).\n.\\\" We could get this to approach 4 on windows (and remain 4 on Linux)\n.\\\" if we put more than one value per line, with commas and speces\n.\\\" between.\n.SS See Also\nhttp://www.xilinx.com/support/documentation/sw_manuals/xilinx11/\\\ncgn_r_coe_file_syntax.htm\n.ne 1i\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_cosmac.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_cosmac\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_cosmac \\- RCA Cosmac Elf file format\n.if require_index \\{\n.XX \"srec_cosmac(5)\" \"RCA Cosmac Elf file format\"\n.\\}\n.SH DESCRIPTION\nThis file takes the form of one or more RCA Cosmac Elf monitor commands,\nalso known as the IDIOT/4 monitor.\nOnly the change memory command (\\f[CW]!M\\fP) is allowed.\n.PP\nThe general form of the \\f[CW]!M\\fP command takes the form\n.RS\n!M\\fIaaaa\\fP \\fIdd\\fP ... \\fIdd\\fP\n.RE\nThe \\f[CW]!M\\fP command writes data byte bytes (represented by character\npairs \\fIdd\\fP) into successive memory locations, started at address\n\\fIaaaa\\fP.\nSpaces between data bytes are ignored.\n.PP\nUsing the comma (\\f[CW],\\fP) line continuation character resumes from\nthe next address in sequence.\n.RS\n!M\\fIaaaa\\fP \\fIdd\\fP ... \\fIdd\\fP,\n\\fIdd\\fP ... \\fIdd\\fP\n.RE\n.PP\nUsing the semicolon (\\f[CW];\\fP) line continuation character\ntakes an address on the next line\n.RS\n!M\\fIaaaa\\fP \\fIdd\\fP ... \\fIdd\\fP;\n\\fIaaaa\\fP \\fIdd\\fP ... \\fIdd\\fP\n.RE\n.PP\nIt is also possible to have the semicolon immediately after the command.\n.RS\n!M;\n\\fIaaaa\\fP \\fIdd\\fP ... \\fIdd\\fP\n.RE\n.PP\nAll of these forms may be used in combination.\n.SS Size Multiplier\nIn general, binary data will expand in size by approximately 2.0 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Cosmac file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x1000.\n.RS\n.nf\n.ft CW\n!M1000 48656C6C6F2C20576F726C640A\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_dec_binary.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2001, 2004, 2006-2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_dec_binary\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_dec_binary \\- DEC Binary (XXDP) file format\n.if require_index \\{\n.XX \"srec_dec_binary(5)\" \"DEC Binary (XXDP) file format\"\n.\\}\n.SH DESCRIPTION\nThe DEC Binary (XXDP) format was used on the PDP 11 series machines.\nThis is a binary format, and is not readable or editable with a text editor.\nThe file consists of records of the form\n.TS\ncenter,allbox,tab(;);\nl l l l l.\ntype;length;address;...data...;checksum\n.TE\nThe field are defined as follows:\n.TP 8n\ntype\nTwo byte little\\[hy]endian value.\nMust always be 1.\n.TP 8n\nlength\nTwo byte little\\[hy]endian value.\nThis is the number of bytes in the data, plus six.\n.TP 8n\naddress\nTwo byte little\\[hy]endian value.\nThis is the load address of the data.\n.TP 8n\ndata\nThe data is simple raw bytes.\nThere are (length\\[hy]6) of them.\n.TP 8n\nchecksum\nThe checcksum is a single byte.\nIt is the negative of the simple summ of all the header and data bytes.\n.PP\nIf the record length is exactly 6 (\\fIi.e.\\fP no data), this is the\nexecution start address record, indicating the transfer address.\n.PP\nIn addition there may be NUL padding characters between records.\nIt is common for records to be padded so that they start on even byte\nboundaries.  In the days of paper tape, it was common for the file to\nhave many leading NULs, to generate blank leader on the tape.\n.SS Size Multiplier\nIn general, raw binary data will expand in sized by approximately 1.03 times\nwhen represented with this format.\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_emon52.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2001, 2006, 2007, 2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_emon52\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_emon52 \\- Elektor Monitor (EMON52) file format\n.if require_index \\{\n.XX \"srec_emon52(5)\" \"Elektor Monitor (EMON52) file format\"\n.\\}\n.SH DESCRIPTION\nThis format is used by the monitor EMON52, developed by the European\nelectronics magazine Elektor (Elektuur in Holland).  Elektor wouldn't\nbe Elektor if they didn't try to reinvent the wheel.  It's a mystery\nwhy they didn't use an existing format for the project.  Only the\nElektor Assembler will produce this file format, reducing the choice of\ndevelopment tools dramatically.\n.SS Records\nAll data lines are called records, and each record contains the following\nfour fields:\n.TS\nallbox,center,tab(;);\nl l l l l.\ncc;aaaa;:;dd ... dd;ssss\n.TE\nThe field are defined as follows:\n.TP 8n\ncc\nThe byte count.\nA two digit hex value (1 byte), counting the actual data bytes in the record.\nThe byte count is separated from the next field by a space.\n.TP 8n\naaaa\nThe address field.\nA four hex digit (2 byte) number representing the first address to be\nused by this record.\n.TP 8n\n\\fB:\\fP\nThe address field and the data field are separated by a colon.\n.TP 8n\ndd\nThe actual data of this record.\nThere can be 1 to 255 data bytes per record (see cc)\nAll bytes in the record are separated from each other (and the checksum)\nby a space.\n.TP 8n\nssss\nData Checksum, adding all bytes of the data line together, forming a 16\nbit checksum.  Covers only all the data bytes of this record.\n.PP\nPlease note that there is no End Of File record defined.\n.SS Byte Count\nThe byte count cc counts the actual data bytes in the current record.\nUsually records have 16 data bytes.\nI don't know what the maximum number of data bytes is.\nIt depends on the size of the data buffer in the EMON52.\n.SS Address Field\nThis is the address where the first data byte of the record should\nbe stored.  After storing that data byte, the address is incremented\nby 1 to point to the address for the next data byte of the record.\nAnd so on, until all data bytes are stored.\n.PP\nThe address is represented by a 4 digit hex number (2 bytes), with the\nMSD first.\n.SS Data Field\nThe payload of the record is formed by the Data field.\nThe number of data bytes expected is given by the Byte Count field.\n.SS Checksum\nThe checksum is a 16 bit result from adding all data bytes of the record\ntogether.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 3.8 times\nwhen represented with this format.\n.SH EXAMPLE\nHere is an example of an EMON52 file:\n.RS\n.nf\n.ft CW\n10 0000:57 6F 77 21 20 44 69 64 20 79 6F 75 20 72 65 61 0564\n10 0010:6C 6C 79 20 67 6F 20 74 68 72 6F 75 67 68 20 61 05E9\n10 0020:6C 6C 20 74 68 69 73 20 74 72 6F 75 62 6C 65 20 05ED\n10 0030:74 6F 20 72 65 61 64 20 74 68 69 73 20 73 74 72 05F0\n04 0040:69 6E 67 21 015F\n.ft P\n.fi\n.RE\n.SH SEE ALSO\nhttp://sbprojects.fol.nl/knowledge/fileformats/emon52.htm\n.SH AUTHOR\nThis man page was taken from the above Web page.\nIt was written by\nSan Bergmans <sanmail@bigfoot.com>\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_fairchild.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_fairchild\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_fairchild \\- Fairchild Fairbug file format\n.if require_index \\{\n.XX \"srec_fairchild(5)\" \"Fairchild Fairbug file format\"\n.\\}\n.SH DESCRIPTION\nThe Fairchild Fairbug format has 8\\[hy]byte records.\nA file begins with an address record and ends with an\nend\\[hy]of\\[hy]file record.\n.PP\n.PP\nThere are three record types in this file format.\n.PP\nAddress records are of the form\n.TS\nallbox,center,tab(;);\nlf(CW) l.\nS;\\fInnnn\\fP\n.TE\nindicating the address for the following data records.\n.PP\nData records are of the form\n.TS\nallbox,center,tab(;);\nlf(CW) l l.\nX;\\fIffffffffffffffff\\fP;\\fIc\\fP\n.TE\nEach data record begins with an X and always contains 8 data bytes.\nThe \\fIff\\fP characters are hexadecimal byte values (8 bytes).\nEach data byte is represented by 2\nhexadecimal characters.\nThe \\fIc\\fP character is a hex digit being the the nibble\\[hy]sum of the\ndata bytes.\nA 1\\[hy]digit hexadecimal checksum follows the data in each data record.\nThe checksum represents, in hexadecimal notation, the sum of the binary\nequivalents of the 16 digits in the record;\nthe half carry from the fourth bit is ignored.\nThe programmer ignores any character (except for address characters and\nthe asterisk character, which terminates the data transfer) between a\nchecksum and the start character of the next data record. This space can\nbe used for comments.\n.PP\nThe end\\[hy]of\\[hy]file record has the form\n.TS\nallbox,center,tab(;);\nlf(CW).\n*\n.TE\nThe last record consists of an asterisk only, which indicates the end of file.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.4 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Fairchild Fairbug file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x1000.\nNotice how the last record is padded with 0xFF bytes.\n.RS\n.nf\n.ft CW\nS1000\nX48656C6C6F2C2057C\nX6F726C64210AFFFF3\n*\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_fastload.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2001, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_fastload\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_fastload \\- LSI Logic Fast Load file format\n.if require_index \\{\n.XX \"srec_fastload(5)\" \"LSI Logic Fast Load file format\"\n.\\}\n.SH DESCRIPTION\nThe FastLoad Format uses a compressed ASCII format that permits files\nto be downloaded in less than half the time taken for Motorola S\\[hy]records.\n.PP\nThe base\\[hy]64 encoding used is \"A\\[hy]Za\\[hy]z0\\[mi]9,.\".  The data is\nencoded in groups of 4 characters (3 bytes, 24 bits).\n.PP\nThe character '/' is used to introduce\na special function.\nSpecial functions are:\n.TP 8n\nA\\fInnnnnn\\fP\nDefines an address.\n.TP 8n\nB\\fInn\\fP\nDefine a single byte.\n.TP 8n\nC\\fInnnn\\fP\nCompare the checksums.\nThe checksum is a simple positive 16\\[hy]bit sum,\nof the data bytes only.\n.TP 8n\nEAA\nDefine the program's entry point.\nThe address will be the current address as defined by the \\fBA\\fP command.\n(The \\fIAA\\fP number in this command is ignored.)\nThis must be the last entry in the file.\n.TP 8n\nKAA\nClear the checksum.\n(The \\fIAA\\fP number in this command is ignored.)\n.TP 8n\nS\\fIname\\fP,X\nDefine a symbol.\nThe address of the symbol will be the current address as defined by the\n\\fBA\\fP command.\n.TP 8n\nZ\\fInn\\fP\nClear a number of bytes.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 1.4 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example LSI Logic Fast Load format file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\n/AAAA\nSGVsbG8sIFdvcmxk/BAK/CARS/AAAA/EAA\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_formatted_binary.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_formatted_binary\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_formatted_binary \\- Formatted Binary file format\n.if require_index \\{\n.XX \"srec_formatted_binary(5)\" \"Formatted Binary file format\"\n.\\}\n.SH DESCRIPTION\n.\\\" ftp://ftp.dataio.com/main/Manuals/UniFam/Translation%20Formats.pdf\nThis is the PDP\\[hy]11 paper tape format, described in the\nDEC\\[hy]11\\[hy]GGPC\\[hy]D PDP\\[hy]11 \"Paper Tape Software Programming\nHandbook\" 1972.\n.PP\nThe file starts with a character sequence which appears as an arrow when\npunched on 8\\[hy]hole paper tape.\n.RS\n0x08, 0x1C, 0x2A, 0x49, 0x08, 0x00\n.RE\n.PP\nThen follows a byte count, encoded big\\[hy]endian in the low 4 bits of the\nnext 4 bytes.  The high bits should be zero.\n.PP\nThen follows a 0xFF byte.\n.PP\nThe data follows, as many bytes as specified in the header.\n.PP\nThe trailer consists of the following bytes:\n.RS\n0x00, 0x00,\n.RE\nand then a 2\\[hy]byte checksum (big\\[hy]endian).\n.PP\nThe alternate header sequence\n.RS\n0x08, 0x1C, 0x3E, 0x6B, 0x08, 0x00\n.RE\nis followed by an 8\\[hy]nibble big\\[hy]endian byte count.\n.SS Size Multiplier\nIn general, binary data will expand in sized very little\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is a hex dump of a formatted binary file containing the\ndata \"Hello, World!\".\n.RS\n.nf\n.ft CW\n0000: 08 1C 2A 49 08 00 00 00  ..*I....\n0008: 00 0E FF 48 65 6C 6C 6F  ...Hello\n0010: 2C 20 57 6F 72 6C 64 21  , World!\n0018: 0A 00 00 04 73           ....s\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_forth.5",
    "content": "'\\\" t\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 2008, 2009 Peter Miller\n.\\\" Copyright (C) 2008 Torsten Sadowski\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_forth\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_forth \\- FORTH file format\n.if require_index \\{\n.XX \"srec_forth(5)\" \"FORTH file format\"\n.\\}\n.SH DESCRIPTION\nThis format can be read by FORTH interpreters\n.PP\nThe file starts with HEX to set the number base.\n.PP\nEach line contains the address, the byte and a store command, either\nC! for RAM or EEC! for EEPROM\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example srec[hy]forth file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at address 0x1000.\n.RS\n.nf\n.ft CW\nHEX\n48 1000 C!\n65 1001 C!\n6C 1002 C!\n6C 1003 C!\n6F 1004 C!\n2C 1005 C!\n20 1006 C!\n57 1007 C!\n6F 1008 C!\n72 1009 C!\n6C 100A C!\n64 100B C!\n0A 100C C!\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_fpc.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2001, 2006, 2007, 2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_fpc\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_fpc \\- four packed code file format\n.if require_index \\{\n.XX \"srec_fpc(5)\" \"Four Packed Code (FPC) file format\"\n.\\}\n.SH SYNOPSIS\nAll ASCII based file formats have one disadvantage in common: they all\nneed more than double the amount of characters as opposed to the number\nof bytes to be sent.  Address fields and checksums will add even more\ncharacters.  So the shorter the records, the more characters have to be\nsent to get the file across.\n.PP\nThe FPC format may be used to reduce the number of characters needed to\nsend a file in ASCII format, although it still needs more characters\nthan the actual bytes it sends.  FPC stands for \"Four Packed Code\".\nThe reduction is accomplished by squeezing 4 real bytes into 5 ASCII\ncharacters.  In fact every ASCII character will be a digit in the base 85\nnumber system.  There aren't enough letters, digits and punctuation marks\navailable to get 85 different characters, but if we use both upper case\nand lower case letters we will manage.  This implies that the FPC \\fIis\ncase sensitive\\fP, as opposed to all other ASCII based file formats.\n.SS Base 85\nThe numbering system is in base 85, and is somewhat hard to understand\nfor us humans who are usually only familiar with base 10 numbers.  Some of\nus understand base 2 and base 16 as well, but base 85 is for most people\nsomething new.  Luckily we don't have to do any math with this number\nsystem.  We just convert a 32 bit number into a 5 digit number in base 85.\nA 32 bit number has a range of 4,294,967,296, while a 5 digit number in\nbase 85 has a range of 4,437,053,125, which is enough to do the trick.\nOne drawback is that we always have to send multiples of 4 bytes, even\nif we actually want to send 1, 2 or 3 bytes.  Unused bytes are padded\nwith zeroes, and are discarded at the receiving end.\n.PP\nThe digits of the base 85 numbering system start at %, which represents\nthe value of 0.  The highest value of a digit in base 85 is 84, and\nis represented by the character 'z'.  If you want to check this with a\nnormal ASCII table you will notice that we have used one character too\nmany!  Why?  I don't know, but for some reason we have to skip the '*'\ncharacter in the row.  This means that after the ')' character follows\nthe '+' character.\n.PP\nWe can use normal number conversion algorithms to generate the FPC\ndigits, with this tiny difference.  We have to check whether the digit\nis going to be equal or larger than the ASCII value for '*'.  If this is\nthe case we have to increment the digit once to stay clear of the '*'.\nIn base 85 MSD digits go first, like in all number systems!\n.PP\nThe benefit of this all is hopefully clear. For every 4 bytes we only\nhave to send 5 ASCII characters, as opposed to 8 characters for all\nother formats.\n.SS Records\nNow we take a look at the the formatting of the FPC records.  We look\nat the record at byte level, not at the actual base 85 encoded level.\nOnly after formatting the FPC record at byte level we convert 4 bytes\nat a time to a 5 digit base 85 number.  If we don't have enough bytes\nin the record to fill the last group of 5 digits we will add bytes with\nthe value of 0 behind the record.\n.TS\ncenter,allbox,tab(;);\nl l l l l l.\n$;ss;cc;ffff;aaaaaaaa;dddddddd\n.TE\nThe field are defined as:\n.TP 8n\n\\fB$\\fP\nEvery line starts with the character $, all other characters are digits\nof base 85.\n.TP 8n\nss\nThe checksum.\nA one byte 2's\\[hy]complement checksum of all bytes of the record.\n.TP 8n\ncc\nThe byte\\[hy]count.\nA one byte value, counting all the bytes in the record minus 4.\n.TP 8n\nffff\nFormat code, a two byte value, defining the record type.\n.TP 8n\naaaaaaaa\nThe address field.\nA 4 byte number representing the first address of this record.\n.TP 8n\ndddddddd\nThe actual data of this record.\n.SS Record Begin\nEvery record begins with the ASCII character \"\\fB$\\fP\".  No spaces or\ntabs are allowed in a record.  All other characters in the record are\nformed by groups of 5 digits of base 85.\n.SS Checksum field\nThis field is a one byte 2's\\[hy]complement checksum of the entire record.\nTo create the checksum make a one byte sum from all of the bytes from\nall of the fields of the record:\n.PP\nThen take the 2's\\[hy]complement of this sum to create the final checksum.\nThe 2's\\[hy]complement is simply inverting all bits and then increment by 1\n(or using the negative operator).  Checking the checksum at the receivers\nend is done by adding all bytes together including the checksum itself,\ndiscarding all carries, and the result must be $00.  The padding bytes\nat the end of the line, should they exist, should not be included in\nchecksum.  But it doesn't really matter if they are, for their influence\nwill be 0 anyway.\n.SS Byte Count\nThe byte count \\fBcc\\fP counts the number of bytes in the current record\nminus 4.  So only the number of address bytes and the data bytes are\ncounted and not the first 4 bytes of the record (checksum, byte count\nand format flags).  The byte count can have any value from 0 to 255.\n.PP\nUsually records have 32 data bytes.  It is not recommended to send\ntoo many data bytes in a record for that may increase the transmission\ntime in case of errors.  Also avoid sending only a few data bytes per\nrecord, because the address overhead will be too heavy in comparison to\nthe payload.\n.SS Format Flags\nThis is a 2 byte number, indicating what format is represented in this\nrecord.  Only a few formats are available, so we actually waste 1 byte\nin each record for the sake of having multiples of 4 bytes.\n.PP\nFormat code 0 means that the address field in this record is to be treated\nas the absolute address where the first data byte of the record should\nbe stored.\n.PP\nFormat code 1 means that the address field in this record is missing.\nSimply the last known address of the previous record +1 is used to store\nthe first data byte.  As if the FPC format wasn't fast enough already ;\\[hy])\n.PP\nFormat code 2 means that the address field in this record is to be\ntreated as a relative address.  Relative to what is not really clear.\nThe relative address will remain in effect until an absolute address is\nreceived again.\n.SS Address Field\nThe first data byte of the record is stored in the address specified\nby the Address field \\fBaaaaaaaa\\fP.  After storing that data byte,\nthe address is incremented by 1 to point to the address for the next\ndata byte of the record.  And so on, until all data bytes are stored.\n.PP\nThe length of the address field is always 4 bytes, if present of course.\nSo the address range for the FPC format is always 2**32.\n.PP\nIf only the address field is given, without any data bytes, the address\nwill be set as starting address for records that have no address field.\n.PP\nAddresses between records are non sequential.  There may be gaps in\nthe addressing or the address pointer may even point to lower addresses\nas before in the same file.  But every time the sequence of addressing\nmust be changed, a format 0 record must be used.  Addressing within one\nsingle record \\fIis\\fP sequential of course.\n.SS Data Field\nThis field contains 0 or more data bytes.  The actual number of data bytes\nis indicated by the byte count in the beginning of the record less the\nnumber of address bytes.  The first data byte is stored in the location\nindicated by the address in the address field.  After that the address is\nincremented by 1 and the next data byte is stored in that new location.\nThis continues until all bytes are stored.  If there are not enough data\nbytes to obtain a multiple of 4 we use 0x00 as padding bytes at the end\nof the record.  These padding bytes are ignored on the receiving side.\n.SS End of File\nEnd of file is recognized if the first four bytes of the record all\ncontain 0x00.  In base 85 this will be \\[lq]\\f[CW]$%%%%%\\fP\\[rq].  This is\nthe only decent way to terminate the file.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 1.7 times\nwhen represented with this format.\n.SH Example\nNow it's time for an example.  In the first table you can see the byte\nrepresentation of the file to be transferred.  The 4th row of bytes is\nnot a multiple of 4 bytes.  But that does not matter, for we append $00\nbytes at the end until we do have a multiple of 4 bytes.  These padding\nbytes are not counted in the byte count however!\n.RS\n.nf\n.ft CW\nD81400000000B000576F77212044696420796F7520726561\n431400000000B0106C6C7920676F207468726F7567682061\n361400000000B0206C6C20746861742074726F75626C6520\n591100000000B030746F207265616420746869733F000000\n00000000\n.ft P\n.fi\n.RE\nOnly after converting the bytes to base 85 we get the records of the\nFPC type file format presented in the next table.  Note that there is\nalways a multiple of 5 characters to represent a multiple of 4 bytes in\neach record.\n.RS\n.nf\n.ft CW\n$kL&@h%%,:,B.\\e?00EPuX0K3rO0JI))\n$;UPR'%%,:<Hn&FCG:at<GVF(;G9wIw\n$7FD1p%%,:LHmy:>GTV%/KJ7@GE[kYz\n$B[6\\e;%%,:\\eKIn?GFWY/qKI1G5:;\\-_e\n$%%%%%\n.ft P\n.fi\n.RE\nAs you can see the length of the lines is clearly shorter than the\noriginal ASCII lines.\n.SH SEE ALSO\nhttp://sbprojects.fol.nl/knowledge/fileformats/fpc.htm\n.SH AUTHOR\nThis man page was taken from the above Web page.\nIt was written by\nSan Bergmans <sanmail@bigfoot.com>\n.PP\nFor extra points:\nWho invented this format?\nWhere is it used?\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_idt.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2011 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_idt\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_idt \\- IDT/sim binary file format\n.if require_index \\{\n.XX \"srec_idt(5)\" \"IDT/sim binary file format\"\n.\\}\n.SH DESCRIPTION\nThis format comes from Integrated Device Technology (IDT) System\nIntegration Manager (IDT/sim).\n.PP\nIt is almost identical to the Motorola S\\[hy]Record format,\nexcept that most of each record is in binary, and there is no\nline termination character.\nThe 'S' and tag characters are the same (ascii), however all other bytes are\nemitted as binary, rather than as a 2\\[hy]byte hexadecimal ascii encoding.\n.SH SEE ALSO\n.TP 8n\n\\f[I]srec_motorola\\fP(5)\nThe orginal Motorola S\\[hy]Record format.\n.TP 8n\n\\f[I]srec_wilson\\fP(5)\nFor a different spin on making S\\[hy]Record into a more densely packed\nbinary file.\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_intel.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 1998, 2000, 2001, 2006-2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_intel\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_intel \\- Intel Hexadecimal object file format specification\n.if require_index \\{\n.XX \"srec_intel(5)\" \"Intel Hexadecimal object file format specification\"\n.\\}\n.SH DESCRIPTION\nThis format is also known as the \\fIIntel MCS\\[hy]86 Object\\fP format.\n.PP\nThis document describes the hexadecimal object file format for the Intel\n8\\[hy]bit, 16\\[hy]bit, and 32\\[hy]bit microprocessors.  The hexadecimal\nformat is suitable as input to PROM programmers or hardware emulators.\n.PP\nHexadecimal object file format is a way of representing an absolute\nbinary object file in ASCII.  Because the file is in ASCII instead of\nbinary, it is possible to store the file is non\\[hy]binary medium such\nas paper\\[hy]tape, punch cards, etc.; and the file can also be displayed\non CRT terminals, line printers, etc..  The 8\\[hy]bit hexadecimal\nobject file format allows for the placement of code and data within\nthe 16\\[hy]bit linear address space of the Intel 8\\[hy]bit processors.\nThe 16\\[hy]bit hexadecimal format allows for the 20\\[hy]bit segmented\naddress space of the Intel 16\\[hy]bit processors.  And the 32\\[hy]bit\nformat allows for the 32\\[hy]bit linear address space of the Intel\n32\\[hy]bit processors.\n.PP\n.TS\ntab(;);\nlf(CW) c c l.\n\\-\\-address\\-length=2;\\[lq]i8hex\\[rq];16\\[hy]bit;\n\\-\\-address\\-length=3;\\[lq]i16hex\\[rq];20\\[hy]bit;segmented\n\\-\\-address\\-length=4;\\[lq]i32hex\\[rq];32\\[hy]bit;linear\n.TE\n.PP\nThe hexadecimal representation of binary is coded in ASCII alphanumeric\ncharacters.  For example, the 8\\[hy]bit binary value 0011\\[hy]1111 is 3F in\nhexadecimal.  To code this in ASCII, one 8\\[hy]bit byte containing the\nASCII code for the character '3' (0011\\[hy]0011 or 0x33) and one 8\\[hy]bit\nbyte containing the) ASCII code for the character 'F' (0100\\[hy]0110 or\n0x46) are required.  For each byte value, the high\\[hy]order hexadecimal\ndigit is always the first digit of the pair of hexadecimal digits.\nThis representation (ASCII hexadecimal) requires twice as many bytes\nas the binary representation.\n.PP\nA hexadecimal object file is blocked into records, each of which contains\nthe record type, length, memory load address and checksum in addition\nto the data.  There are currently six (6) different types of records\nthat are defined, not all combinations of these records are meaningful,\nhowever.  The record are:\n.TP 2n\n\\(bu\nData Record (8\\[hy], 16\\[hy], or 32\\[hy]bit formats)\n.TP 2n\n\\(bu\nEnd of File Record (8\\[hy], 16\\[hy], or 32\\[hy]bit formats)\n.TP 2n\n\\(bu\nExtended Segment Address Record (16\\[hy] or 32\\[hy]bit formats)\n.TP 2n\n\\(bu\nStart Segment Address Record (16\\[hy] or 32\\[hy]bit formats)\n.TP 2n\n\\(bu\nExtended Linear Address Record (32\\[hy]bit format only)\n.TP 2n\n\\(bu\nStart Linear Address Record (32\\[hy]bit format only)\n.SS General Record Format\n.TS\nallbox,tab(;);\nle le le le le le.\nT{\nRecord\n.br\nMark\nT};T{\nRecord\n.br\nLength\nT};T{\nLoad\n.br\nOffset\nT};T{\nRecord\n.br\nType\nT};Data;T{\nCheck\n.br\nsum\nT}\n.TE\n.TP 8n\nRecord Mark.\nEach record begins with a Record Mark field containing 0x3A, the ASCII\ncode for the colon (\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nEach record has a Record Length field which specifies the number of bytes\nof information or data which follows the Record Type field of the record.\nThis field is one byte, represented as two hexadecimal characters.\nThe maximum value of the Record Length field is hexadecimal 'FF' or 255.\n.TP 8n\nLoad Offset\nEach record has a Load Offset field which specifies the 16\\[hy]bit starting\nload offset of the data bytes, therefore this field is only used for\nData Records.  In other records where this field is not used, it should\nbe coded as four ASCII zero characters (\\[lq]0000\\[rq] or 0x30303030).\nThis field is two byte, represented as four hexadecimal characters.\n.TP 8n\nRecord Type\n.RS\nEach record has a Record Type field which specifies the record type of\nthis record.  The Record Type field is used to interpret the remaining\ninformation within the record.  This field is one byte, represented as\ntwo hexadecimal characters.  The encoding for all the current record\ntypes are:\n.TP 3n\n0\nData Record\n.TP 3n\n1\nEnd of File Record\n.TP 3n\n2\nExtended Segment Address Record\n.TP 3n\n3\nStart Segment Address Record\n.TP 3n\n4\nExtended Linear Address Record\n.TP 3n\n5\nStart Linear Address Record\n.RE\n.TP 8n\nData\nEach record has a variable length Data field, it consists of zero or\nmore bytes encoded as pairs of hexadecimal digits.  The interpretation\nof this field depends on the Record Type field.\n.TP 8n\nChecksum\nEach record ends with a Checksum field that contains the ASCII hexadecimal\nrepresentation of the two's complement of  the 8\\[hy]bit bytes that result\nfrom converting each pair of ASCII hexadecimal digits to one byte of\nbinary, from and including the Record Length field to and including the\nlast byte of the Data field.  Therefore, the sum of all the ASCII pairs\nin a record after converting to binary, from the Record Length field to\nand including the Checksum field, is zero.\n.SS Extended Linear Address Record\n(32\\[hy]bit format only)\n.TS\nallbox,tab(;);\nce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\n.br\n(2)\nT};T{\nLoad\n.br\nOffset\n.br\n(0)\nT};T{\nRecord\n.br\nType\n.br\n(4)\nT};T{\nULBA (2\n.br\nbytes)\nT};T{\nCheck\n.br\nsum\nT}\n.TE\n.PP\nThe 32\\[hy]bit Extended Linear Address Record is used to specify bits 16\\[hy]31\nof the Linear Base Address (LBA), where bits 0\\[hy]15 of the LBA are zero.\nBits 16\\[hy]31 of the LBA are referred to as the Upper Linear Base Address\n(ULBA).  The absolute memory address of a content byte in a subsequent\nData Record is) obtained by adding the LBA to an offset calculated by\nadding the Load Offset field of the containing Data Record to the index of\nthe byte in the Data Record (0, 1, 2, ... \\fIn\\fP).  This offset addition\nis done) modulo 4G (\\fIi.e.\\fP 32\\[hy]bits from 0xFFFFFFFF to 0x00000000)\nresults in wrapping around from the end to the beginning of the 4G linear\naddress defined by the LBA.  The linear address at which a particular\nbyte is loaded is calculated as:\n.RS\n(LBA + DRLO + DRI) MOD 4G\n.RE\nwhere:\n.RS\n.TP 5m\nDRLO\nis the Load Offset field of a Data Record.\n.TP 5m\nDRI\nis the data byte index within the Data Record.\n.RE\nWhen an Extended Linear Address Record defines the value of LBA,\nit may appear anywhere within a 32\\[hy]bit hexadecimal object file. This\nvalue remains in effect until another Extended Linear Address Record is\nencountered.  The LBA defaults to zero until an Extended Linear Address\nRecord is encountered.  The contents of the individual fields within\nthe record are:\n.TP 8n\nRecord Mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nThe field contains 0x3032, the hexadecimal encoding of the ASCII\ncharacters \\[lq]02\\[rq], which is the length, in bytes, of the ULBA data\ninformation within this record.\n.TP 8n\nLoad Offset\nThis field contains 0x30303030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]0000\\[rq], since this field is not used for this record.\n.TP 8n\nRecord Type\nThis field contains 0x3034, the hexadecimal encoding of the ASCII\ncharacter \\[lq]04\\[rq], which specifies the record type to be an Extended\nLinear Address Record.\n.TP 8n\nULBA\nThis field contains four ASCII hexadecimal digits that specify the 16\\[hy]bit\nUpper Linear Base Address value.  The value is encoded big\\[hy]endian (most\nsignificant digit first).\n.TP 8n\nChecksum\nThis field contains the check sum on the Record Length, Load Offset,\nRecord Type, and ULBA fields.\n.SS Extended Segment Address Record\n(16\\[hy] or 32\\[hy]bit formats)\n.TS\nallbox,tab(;);\nce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\n.br\n(2)\nT};T{\nLoad\n.br\nOffset\n.br\n(0)\nT};T{\nRecord\n.br\nType\n.br\n(2)\nT};T{\nUSBA (2\n.br\nbytes)\nT};T{\nCheck\n.br\nsum\nT}\n.TE\n.PP\nThe 16\\[hy]bit Extended Segment Address Record is used to specify bits 4\\[hy]19\nof the Segment Base Address (SBA), where bits 0\\[hy]3 of the SBA are zero.\nBits 4\\[hy]19 of the SBA are referred to as the Upper Segment Base Address\n(USBA).  The absolute memory address of a content byte in a subsequent\nData Record is) obtained by adding the SBA to an offset calculated by\nadding the Load Offset field of the containing Data Record to the index\nof the byte in the Data Record (0, 1, 2, ... \\fIn\\fP).  This offset\naddition is done modulo 64K (\\fIi.e.\\fP 16\\[hy]bits from 0xFFFF to 0x0000\nresults in wrapping around from the end to the beginning of the 64K\nsegment defined by the SBA.  The address at which a particular byte is\nloaded is calculated as:\n.RS\nSBA + ((DRLO + DRI) MOD 64K)\n.RE\nwhere:\n.RS\n.TP 5m\nDRLO\nis the LOAD OFFSET field of a Data Record.\n.TP 5m\nDRI\nis the data byte index within the Data Record.\n.RE\n.PP\nWhen an Extended Segment Address Record defines the value of SBA,\nit may appear anywhere within a 16\\[hy]bit hexadecimal object file.\nThis value remains in effect until another Extended Segment Address\nRecord is encountered.  The SBA defaults to zero until an Extended\nSegment Address Record is encountered.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord Mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nThe field contains 0x3032, the hexadecimal encoding of the ASCII\ncharacters '02', which is the length, in bytes, of the USBA data\ninformation within this record.\n.TP 8n\nLoad Offset\nThis field contains 0x30303030, the hexadecimal encoding of the ASCII\ncharacters '0000', since this field is not used for this record.\n.TP 8n\nRecord Type\nThis field contains 0x3032, the hexadecimal encoding of the ASCII\ncharacter \\[lq]02\\[rq], which specifies the record type to be an Extended\nSegment Address Record.\n.TP 8n\nUSBA\nThis field contains four ASCII hexadecimal digits that specify the\n16\\[hy]bit Upper Segment Base Address value.  The field is encoded\nbig\\[hy]endian (most significant digit first).\n.TP 8n\nChecksum\nThis field contains the check sum on the Record length, Load Offset,\nRecord Type, and USBA fields.\n.SS Data Record\n(8\\[hy], 16\\[hy] or 32\\[hy]bit formats)\n.TS\nallbox,tab(;);\nce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\nT};T{\nLoad\n.br\nOffset\nT};T{\nRecord\n.br\nType\nT};Data;T{\nCheck\n.br\nsum\nT}\n.TE\n.PP\nThe Data Record provides a set of hexadecimal digits that represent\nthe ASCII code for data bytes that make up a portion of a memory image.\nThe method for calculating the absolute address (linear in the 8\\[hy]bit and\n32\\[hy]bit case and segmented in the 16\\[hy]bit case) for each byte of data is\ndescribed in the discussions of the Extended Linear Address Record and\nthe Extended Segment Address Record.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord Mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nThe field contains two ASCII hexadecimal digits that specify the number\nof data bytes in the record.  The maximum value is 255 decimal.\n.TP 8n\nLoad Offset\nThis field contains four ASCII hexadecimal digits representing the offset\nfrom the LBA (see Extended Linear Address Record see Extended Segment\nAddress Record) defining the address which the first byte of the data\nis to be placed.\n.TP 8n\nRecord Type\nThis field contains 0x3030, the hexadecimal encoding of the ASCII\ncharacter \\[lq]00\\[rq], which specifies the record type to be a Data Record.\n.TP 8n\nData\nThis field contains pairs of ASCII hexadecimal digits, one pair for each\ndata byte.\n.TP 8n\nChecksum\nThis field contains the check sum on the Record Length, Load Offset,\nRecord Type, and Data fields.\n.PP\n\\f[B]Note:\\fP Care must be taken when the addresses with an record\nspan the end of addressing.  The behaviour is different for linear and\nsegmented addressing modes.\n.TP 8n\nlinear\nIf a record starts just short of 2**32, and would finish after 2**32,\nthe later part of the record wraps around to address 0.\nTP 8n\nsegment\nIf a record starts just for of a 2**16 boundary, and would finish after\nthat 2**16 boundary, the later part of the record wraps around to\naddress 0 within the same segment (\\f[B]not\\fP the next segment).\n.PP\nThe \\f[I]srec_cat\\fP(1) program will never output records such as these,\nit will always produce separate records on output.\n.SS Start Linear Address Record\n(32\\[hy]bit format only)\n.TS\nallbox,tab(;);\nce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\n.br\n(4)\nT};T{\nLoad.\n.br\nOffset\n.br\n(0)\nT};T{\nRecord\n.br\nType\n.br\n(5)\nT};T{\nEIP (4\n.br\nbytes)\nT};T{\nCheck\n.br\nsum\nT}\n.TE\n.PP\nThe Start Linear Address Record is used to specify the execution start\naddress for the object file.  The value given is the 32\\[hy]bit linear\naddress for the EIP register.  Note that this record only specifies\nthe code address within the 32\\[hy]bit linear address space of the 80386.\nIf the code is to start execution in the real mode of the 80386, then the\nStart Segment Address Record should be used instead, since that record\nspecifies both the CS and IP register contents necessary for real mode.\n.PP\nThe Start Linear Address Record can appear anywhere in a 32\\[hy]bit\nhexadecimal object file.  If such a record is not present in a hexadecimal\nobject file, a loader is free to assign a default execution start address.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord length\nThe field contains 0x3034, the hexadecimal encoding of the ASCII\ncharacters \\[lq]04\\[rq], which is the length, in bytes, of the EIP register\ncontent within this record.\n.TP 8n\nLoad Offset\nThis field contains 0x30303030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]0000\\[rq], since this field is not used for this record.\n.TP 8n\nRecord Type\nThis field contains 0x3035, the hexadecimal encoding of the ASCII\ncharacter \\[lq]05\\[rq], which specifies the record type to be a Start Linear\nAddress Record.\n.TP 8n\nEIP\nThis field contains eight ASCII hexadecimal digits that specify the\n32\\[hy]bit EIP register contents.  The field is encoded big\\[hy]endian (most\nsignificant digit first).\n.TP\nChecksum\nThis field contains the check sum on the Record length, Load Offset,\nRecord Type, and EIP fields.\n.SS Start Segment Address Record\n(16\\[hy] or 32\\[hy]bit formats)\n.TS\nallbox,tab(;);\nce ce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\n.br\n(4)\nT};T{\nLoad.\n.br\nOffset\n.br\n(0)\nT};T{\nRecord\n.br\nType\n.br\n(3)\nT};T{\nCS (2\n.br\nbytes)\nT};T{\nIP (2\n.br\nbytes)\nT};T{\nCheck\n.br\nsum\nT}\n.TE\n.PP\nThe Start Segment Address Record is used to specify the execution\nstart address for the object file.  The value given is the 20\\[hy]bit\nsegment address for the CS and IP registers.  Note that this record only\nspecifies the code address within the 20\\[hy]bit segmented address space of\nthe 8086/80186.  The Start Segment Address Record can appear anywhere\nin a 16\\[hy]bit hexadecimal object file.   If such a record is not present\nin a hexadecimal object file, a loader is free to assign a default\nstart address.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord Mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nThe field contains 0x3034, the hexadecimal encoding of the ASCII\ncharacters \\[lq]04\\[rq], which is the length, in bytes, of the CS and IP\nregister contents within this record.\n.TP 8n\nLoad Offset\nThis field contains 0x30303030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]0000\\[rq], since this field is not used for this record.\n.TP 8n\nRecord Type\nThis field contains 0x3033, the hexadecimal encoding of the ASCII\ncharacter '03', which specifies the record type to be a Start Segment\nAddress Record.\n.TP 8n\nCS\nThis field contains four ASCII hexadecimal digits that specify the 16\\[hy]bit\nCS register contents.  The field is encoded big\\[hy]endian (most significant\ndigit first).\n.TP 8n\nIP\nThis field contains four ASCII hexadecimal digits that specify the 16\\[hy]bit\nIP register contents.  The field is encoded big\\[hy]endian (most significant\ndigit first).\n.TP 8n\nChecksum\nThis field contains the check sum on the Record length, Load Offset,\nRecord Type, CS, and IP fields.\n.SS End of File Record\n(8\\[hy], 16\\[hy], or 32\\[hy]bit formats)\n.TS\nallbox,tab(;);\nce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\n.br\n(0)\nT};T{\nLoad\n.br\nOffset\n.br\n(0)\nT};T{\nRecord\n.br\nType\n.br\n(1)\nT};T{\nCheck\n.br\nsum\n.br\n(0xFF)\nT}\n.TE\n.PP\nThe End of File Record specifies the end of the hexadecimal object file.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nThe field contains 0x3030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]00\\[rq].  Since this record does not contain any Data bytes,\nthe length is zero.\n.TP 8n\nLoad Offset\nThis field contains 0x30303030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]0000\\[rq], since this field is not used for this record.\nIn ancient times, i8hex used this for the start address record.\n.TP 8n\nRecord Type\nThis field contains 0x3031, the hexadecimal encoding of the ASCII\ncharacter \\[lq]01\\[rq], which specifies the record type to be an End of File\nRecord.\n.TP 8n\nChecksum\nThis field contains the check sum an the Record Length, Load Offset,\nand Record Type fields.  Since all the fields are static, the check\nsum can also be calculated statically, and the value is 0x4646, the\nhexadecimal encoding of the ASCII characters \\[lq]FF\\[rq].\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.3 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Intel hex file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\n:0D00000048656C6C6F2C20576F726C640AA1\n:00000001FF\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH REFERENCE\nThis information comes (very indirectly) from\n.I \"Microprocessors and Programmed Logic,\"\nSecond Edition,\nKenneth L. Short,\n1987,\nPrentice\\[hy]Hall,\nISBN 0\\[hy]13\\[hy]580606\\[hy]2.\n.PP\nhttp://en.wikipedia.org/wiki/Intel_HEX\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.SS Derivation\nThis manual page is derived from a file marked as follows:\n.PP\nIntel\nHexadecimal Object File\nFormat Specification;\nRevision A, 1/6/88\n.PP\nDisclaimer:\nIntel makes no representation or warranties with respect to the\ncontents hereof and specifically disclaims any implied warranties of\nmerchantability or fitness for any particular purpose.  Further, Intel\nreserves the right to revise this publication from time to time in the\ncontent hereof without obligation of Intel to notify any person of such\nrevision or changes.  The publication of this specification should not\nbe construed as a commitment on Intel's part to implement any product.\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_intel16.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2010 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_intel16\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_intel16 \\- Intel Hexadecimal 16\\[hy]bit file format specification\n.if require_index \\{\n.XX \"srec_intel16(5)\" \"Intel Hexadecimal 16\\[hy]bit file format specification\"\n.\\}\n.SH DESCRIPTION\nThis format is also known as the \\fIINHX16\\fP format.\n.PP\nThis document describes the hexadecimal object file format\nfor 16\\[hy]bit microprocessors.\n.PP\nThis format is very similar to the \\fIsrec_intel\\fP(5) format, except\nthat the addresses are word addresses.  The count field is a word count.\n.PP\nThe hexadecimal representation of binary is coded in ASCII alphanumeric\ncharacters.  For example, the 8\\[hy]bit binary value 0011\\[hy]1111 is 3F in\nhexadecimal.  To code this in ASCII, one 8\\[hy]bit byte containing the\nASCII code for the character '3' (0011\\[hy]0011 or 0x33) and one 8\\[hy]bit\nbyte containing the) ASCII code for the character 'F' (0100\\[hy]0110 or\n0x46) are required.  For each byte value, the high\\[hy]order hexadecimal\ndigit is always the first digit of the pair of hexadecimal digits.\nThis representation (ASCII hexadecimal) requires twice as many bytes\nas the binary representation.\n.PP\nA hexadecimal object file is blocked into records, each of which contains\nthe record type, length, memory load address and checksum in addition\nto the data.  There are currently six (6) different types of records\nthat are defined, not all combinations of these records are meaningful,\nhowever.  The record are:\n.TP 2n\n\\(bu\nData Record\n.TP 2n\n\\(bu\nEnd of File Record\n.TP 2n\n\\(bu\nExtended Segment Address Record\n.TP 2n\n\\(bu\nStart Segment Address Record\n.TP 2n\n\\(bu\nExtended Linear Address Record\n.TP 2n\n\\(bu\nStart Linear Address Record\n.SS General Record Format\n.TS\nallbox,tab(;);\nce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\nT};T{\nRecord\n.br\nLength\nT};T{\nLoad\n.br\nOffset\nT};T{\nRecord\n.br\nType\nT};T{\nData\nT};T{\nCheck\n.br\nsum\nT}\n.TE\n.TP 8n\nRecord Mark.\nEach record begins with a Record Mark field containing 0x3A, the ASCII\ncode for the colon (\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nEach record has a Record Length field which specifies the number of\n16\\[hy]bit words of information or data which follows the Record Type\nfield of the record.  This field is one byte, represented as two\nhexadecimal characters.  The maximum value of the Record Length field is\nhexadecimal 'FF' or 255.\n.TP 8n\nLoad Offset\nEach record has a Load Offset field which specifies the 16\\[hy]bit starting\nload offset of the data words, therefore this field is only used for\nData Records (if the words are loaded as bytes, the address needs\nto be doubled).  In other records where this field is not used, it\nshould be coded as four ASCII zero characters (\\[lq]0000\\[rq] or 0x30303030).\nThis field one 16\\[hy]bit word, represented as four hexadecimal characters.\n.TP 8n\nRecord Type\n.RS\nEach record has a Record Type field which specifies the record type of\nthis record.  The Record Type field is used to interpret the remaining\ninformation within the record.  This field is one byte, represented as\ntwo hexadecimal characters.  The encoding for all the current record\ntypes are:\n.TP 3n\n0\nData Record\n.TP 3n\n1\nEnd of File Record\n.TP 3n\n5\nExecution Start Address Record\n.RE\n.TP 8n\nData\nEach record has a variable length Data field, it consists of zero or more\n16\\[hy]bit words encoded as set of 4 hexadecimal digits, most significant\ndigit first.  The interpretation of this field depends on the Record\nType field.\n.TP 8n\nChecksum\nEach record ends with a Checksum field that contains the ASCII hexadecimal\nrepresentation of the two's complement of  the 8\\[hy]bit bytes that result\nfrom converting each pair of ASCII hexadecimal digits to one byte of\nbinary, from and including the Record Length field to and including the\nlast byte of the Data field.  Therefore, the sum of all the ASCII pairs\nin a record after converting to binary, from the Record Length field to\nand including the Checksum field, is zero.\n.SS Data Record\n(8\\[hy], 16\\[hy] or 32\\[hy]bit formats)\n.TS\nallbox,tab(;);\nce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\nT};T{\nLoad\n.br\nOffset\nT};T{\nRecord\n.br\nType\nT};T{\nData\nT};T{\nCheck\n.br\nsum\nT}\n.TE\n.PP\nThe Data Record provides a set of hexadecimal digits that represent\nthe ASCII code for data bytes that make up a portion of a memory image.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord Mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nThe field contains two ASCII hexadecimal digits that specify the number\nof 16\\[hy]bit data words in the record.  The maximum value is 255 decimal.\n.TP 8n\nLoad Offset\nThis field contains four ASCII hexadecimal digits representing the word\naddress at which the first word of the data is to be placed.\n(For an exquivalent bytes address, double it.)\n.TP 8n\nRecord Type\nThis field contains 0x3030, the hexadecimal encoding of the ASCII\ncharacter \\[lq]00\\[rq], which specifies the record type to be a Data Record.\n.TP 8n\nData\nThis field contains sets of four ASCII hexadecimal digits, one set for\neach 16\\[hy]bit data word, most significant digit first.\n.TP 8n\nChecksum\nThis field contains the check sum on the Record Length, Load Offset,\nRecord Type, and Data fields.\n.SS Execution Start Address Record\n.TS\nallbox,tab(;);\nce ce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\n.br\n(4)\nT};T{\nLoad\n.br\nOffset\n.br\n(0)\nT};T{\nRecord\n.br\nType\n.br\n(5)\nT};T{\nEIP (4\n.br\nbytes)\nT};T{\nCheck\n.br\nsum\nT}\n.TE\n.PP\nThe Execution Start Address Record is used to specify the execution start\naddress for the object file.\nThis is where the loader is to jump to begin execution once the hex load\nis complete.\n.PP\nThe Execution Start Address Record can appear anywhere in a\nhexadecimal object file.  If such a record is not present in a hexadecimal\nobject file, a loader is free to assign a default execution start address.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord length\nThe field contains 0x3032, the hexadecimal encoding of the ASCII\ncharacters \\[lq]02\\[rq], which is the length, in bytes, of the EIP register\ncontent within this record.\n.TP 8n\nLoad Offset\nThis field contains 0x30303030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]0000\\[rq], since this field is not used for this record.\n.TP 8n\nRecord Type\nThis field contains 0x3035, the hexadecimal encoding of the ASCII\ncharacter \\[lq]05\\[rq], which specifies the record type to be a Start\nAddress Record.\n.TP 8n\nEIP\nThis field contains eight ASCII hexadecimal digits that specify the address.\nThe field is encoded big\\[hy]endian (most significant digit first).\n.TP\nChecksum\nThis field contains the check sum on the Record length, Load Offset,\nRecord Type, and EIP fields.\n.SS End of File Record\nThis shall be the last record in the file.\n.TS\nallbox,tab(;);\nce ce ce ce ce.\nT{\nRecord\n.br\nMark\n.br\n(\\[lq]:\\[rq])\nT};T{\nRecord\n.br\nLength\n.br\n(0)\nT};T{\nLoad\n.br\nOffset\n.br\n(0)\nT};T{\nRecord\n.br\nType\n.br\n(1)\nT};T{\nCheck\n.br\nsum\n.br\n(0xFF)\nT}\n.TE\n.PP\nThe End of File Record specifies the end of the hexadecimal object file.\n.PP\nThe contents of the individual fields within the record are:\n.TP 8n\nRecord mark\nThis field contains 0x3A, the hexadecimal encoding of the ASCII colon\n(\\[lq]:\\[rq]) character.\n.TP 8n\nRecord Length\nThe field contains 0x3030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]00\\[rq].  Since this record does not contain any Data bytes,\nthe length is zero.\n.TP 8n\nLoad Offset\nThis field contains 0x30303030, the hexadecimal encoding of the ASCII\ncharacters \\[lq]0000\\[rq], since this field is not used for this record.\n.TP 8n\nRecord Type\nThis field contains 0x3031, the hexadecimal encoding of the ASCII\ncharacter \\[lq]01\\[rq], which specifies the record type to be an End of File\nRecord.\n.TP 8n\nChecksum\nThis field contains the check sum an the Record Length, Load Offset,\nand Record Type fields.  Since all the fields are static, the check\nsum can also be calculated statically, and the value is 0x4646, the\nhexadecimal encoding of the ASCII characters \\[lq]FF\\[rq].\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.3 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example INHX16 file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\n:0700000065486C6C2C6F5720726F646CFF0AA8\n:00000001FF\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_logisim.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2013 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_logisim.5\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_logisim \\- format Logisim EPROM load files\n.if require_index \\{\n.XX \"srec_logisim(5)\" \"format Logisim EPROM load files\"\n.\\}\n.SH DESCRIPTION\nThe file format used for image files is intentionally simple; this\npermits you to write a program, such as an assembler, that generates\nmemory images that can then be loaded into memory. As an example of\nthis file format, if we had a 256\\[hy]byte memory whose first five bytes\nwere 2, 3, 0, 20, and \\-1, and all subsequent values were 0, then the\nimage would be the following text file.\n.RS\nv2.0 raw\n\n02\n03\n00\n14\nff\n.RE\nThe first line identifies the file format used (currently, there is\nonly one file format recognized). Subsequent values list the values\nin hexadecimal, starting from address 0; you can place several\nsuch values on the same line. Logisim will assume that any values\nunlisted in the file are zero.\n\nThe image file can use run\\[hy]length encoding; for example, rather\nthan list the value 00 sixteen times in a row, the file can include\n16*00 rather than repeat 00 sixteen times. Notice than the number of\nrepetitions is written in base 10. Files produced by Logisim will\nuse run\\[hy]length encoding for runs of at least four values\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.95 times\nwhen represented with this format.\n.SS Commentary\nThis format is particularly deficient.\n.TP 2n\n\\[bu]\nThe is no way for changing address in\\[hy]flight.\nAnd therefore the format can't have holes in the data.\n.TP 2n\n\\[bu]\nThere are no checksums, or any other error checking.\n.TP 2n\n\\[bu]\nThere is no provision for a comment header,\nas distinct to the \\[lq]v2.0 raw\\[rq] magic number.\n.TP 2n\n\\[bu]\nThere is no provision for an execution start adddress.\n.SH SEE ALSO\nhttp://ozark.hendrix.edu/~burch/logisim/docs/2.3.0/guide/mem/menu.html\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_mem.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2012 Lattice Semiconductor\n.\\\" Copyright (C) 2012 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program.  If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_mem\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_mem \\- Lattice Memory Initialization format\n.if require_index \\{\n.XX \"srec_mem(5)\" \"Lattice Memory Initialization format\"\n.\\}\n.SH DESCRIPTION\nA Lattice Memory Initialization format (.mem), by Lattice Semiconductor,\nfile is an ASCII text file that consists of a header followed by lines\nof memory data.\n.SS Syntax\nThe data must be in one of the following formats: Bin\n(binary), Hex (hexadecimal), or Address\\[hy]Hex (described below).\n.PP\nFor hexadecimal values, both upper and lower case can be used.  If the\ndata has fewer bits than the specified data width, the most significant\nbits are filled with 0.  Any address not specified will be filled with 0.\n.PP\nComments can be added at any point after the header (defined below) by\nstarting the comment with a pound sign (#) or two slashes (//).  The\ncomment then includes everything to the end of the line.  Comments may be\nadded to any of the data, but never add comments to the header.\n.SS Header\nA \\f[CW].mem\\fP file starts with a header, which declares the file\nformat, memory size, and address and data display radix for Memory\nGenerator.  The syntax of the header is:\n.RS\n.nf\n.ft CW\n#Format=Bin | Hex | AddrHex\n#Depth=1 \\f[I]to\\fP 65536\n#Width=1 \\f[I]to\\fP 256\n#AddrRadix=\\f[I]index\\[hy]number\\fP\n#DataRadix=\\f[I]index\\[hy]number\\fP\n#Data\n.ft R\n.fi\n.RE\nThe \\f[I]index\\[hy]number\\fP can be one of the following numbers.\nAddrRadix and DataRadix can have different values.\n.RS\n.nf\nBinary: 0\nOctal: 1\nDecimal: 2\nHexadecimal: 3\n.fi\n.RE\n.PP\nFor example, the following header says the .mem file is using the\nbinary format for a 32x8 memory.  When displayed in Memory Generator,\nthe address will be shown in hexadecimal and the data will be shown in\nbinary.\n.RS\n.nf\n.ft CW\n#Format=Bin\n#Depth=32\n#Width=8\n#AddrRadix=3\n#DataRadix=0\n#Data\n.ft R\n.fi\n.RE\n.SS Bin and Hex Formats\nThe data is represented in binary or hexadecimal format.  Each line of\ndata specifies the contents for one memory location, starting with\naddress 0.  That is, the first line is for address 0, the second line\nis for address 1, and so on.  For each line, the data is interpreted as\nleast significant bit on the right.\n.PP\nFor example, in the Bin format, the following lines will initialize\naddress 0 to \\[lq]00011011\\[rq], address 1 to \\[lq]11111010\\[rq]\n(assuming it is a 32x8 memory).\n.RS\n.nf\n# for a 32x8 memory\n11011\n11111010\n.fi\n.RE\n.PP\nIn the Hex format, the following lines will initialize address 0 to\n\\[lq]003B\\[rq], address 1 to \\[lq]FB0A\\[rq] (assuming it is a 32x16 memory).\n.RS\n.nf\n# for a 32x16 memory\n3B\nFB0A\n.fi\n.RE\n.SS AddrHex\nThe data is represented in hexadecimal format.  Each line consists of an\naddress followed by a colon and then any number of data words, separated\nby spaces:\n.RS\n\\f[I]address\\fP\\fB:\\fP \\f[I]data data> data\\fP...\n.RE\nThe data will be applied starting at <address> and filling in\nsequentially from there.\n.PP\nFor example:\n.RS\n.nf\nA0:03 F3 3E 4F\nB2:3B 9F\n.fi\n.RE\nwill initialize A0 with 03, A1 with F3, A2 with 3E, A3 with 4F, B2 with\n3B, and B3 with 9F.  The other addresses will be initialized to 0.  So A4\nthrough B1 will be set to 0.\n.SS See Also\n.nf\nhttp://help.latticesemi.com/docs/webhelp/eng/wwhelp/wwhimpl/common/html/\\\nwwhelp.htm#href=Design%20Entry/memory_initialization_file.htm\\\n#1371843&single=true\n.fi\n.SS Size Multiplier\nThe size multiplier depends on the width selected.  As files grow larger,\ntheir size multipliers will approach those in the table, from above.\n.TS\ntab(;);\nc c c\nn n n.\nWidth;Linux;Windows\n8;2.96;3.0\n16;2.47;2.5\n32;2.25;2.28\n64;2.13;2.15\n.TE\n.SS Byte Order\nThis format is implicitly big\\[hy]endian.\nUse a \\-byte\\[hy]swap filter if you need something different.\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_mif.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2009, 2011, 2012, 2014 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program.  If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_mif\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_mif \\- Memory Initialization File (MIF) format\n.if require_index \\{\n.XX \"srec_mif(5)\" \"Memory Initialization File (MIF) format\"\n.\\}\n.SH DESCRIPTION\nThis format was invented by Altera.\n.PP\n.\\\" http://www.altera.com/support/software/nativelink/quartus2/glossary/\n.\\\"    def_mif.html\nAn ASCII text file (with the extension .mif) that specifies the initial\ncontent of a memory block (CAM, RAM, or ROM), that is, the initial\nvalues for each address. This file is used during project compilation\nand/or simulation. You can create a Memory Initialization File in the\nMemory Editor, the In\\[hy]System Memory Content Editor, or the Quartus II\nText Editor.\n.PP\nA Memory Initialization File serves as an input file for memory\ninitialization in the Compiler and Simulator. You can also use a\nHexadecimal (Intel\\[hy]Format) File (.hex) to provide memory initialization\ndata.\n.PP\nA Memory Initialization File contains the initial values for each\naddress in the memory. A separate file is required for each memory\nblock. In a Memory Initialization File, you must specify the memory\ndepth and width values. In addition, you can specify data radixes as\nbinary (BIN), hexadecimal (HEX), octal (OCT), signed decimal (DEC),\nor unsigned decimal (UNS) to display and interpret addresses and data\nvalues. Data values must match the specified data radix.\n.PP\nWhen creating a Memory Initialization File in the Quartus II Text\nEditor, you must start with the DEPTH, WIDTH, ADDRESS_RADIX and\nDATA_RADIX keywords. You can use Tab \"\\t\" and Space \" \" characters as\nseparators, and insert multiple lines of comments with the percent \"%\"\ncharacter, or a single comment with double dash \"\\-\\-\" characters.\nAddress:data pairs represent data contained inside certain memory addresses\nand you must place them between the CONTENT BEGIN and END keywords, as\nshown in the following examples.\n.RS\n.ft CW\n.nf\n%  multiple\\[hy]line comment\nmultiple\\[hy]line comment  %\n\\-\\- single\\[hy]line comment\nDEPTH = 8;                    \\-\\- The size of data in bits\nWIDTH = 32;                   \\-\\- The size of memory in words\nADDRESS_RADIX = HEX;          \\-\\- The radix for address values\nDATA_RADIX = BIN;             \\-\\- The radix for data values\nCONTENT                       \\-\\- start of (address : data pairs)\nBEGIN\n00 : 00000000;                \\-\\- memory address : data\n01 : 00000001;\n02 : 00000010;\n03 : 00000011;\n04 : 00000100;\n05 : 00000101;\n06 : 00000110;\n07 : 00000111;\n08 : 00001000;\n09 : 00001001;\n0A : 00001010;\n0B : 00001011;\n0C : 00001100;\nEND;\n.ft R\n.fi\n.RE\n.PP\nThere are several ways to specify the address and data,\nas seen in the following table:\n.TS\ntab(;);\nl l lf(CW).\nNotation;Interpretation;Example\nT{\nA : D;\nT};T{\nAddr[A] = D\nT};T{\n.nf\n2 : 4\nAddress: 01234567\nData:    00400000\n.fi\nT}\nT{\n[A0..A1] : D;\n.br\n\\f[I](See note below.)\\fP\nT};T{\nAddr[A0] to [A1] contain data D\nT};T{\n.nf\n[0..7] : 6\nAddress: 01234567\nData:    66666666\n.fi\nT}\nT{\n[A0..A1] : D0 D1;\n.br\n\\f[I](See note below.)\\fP\nT};T{\n.nf\nAddr[A0] = D0,\nAddr[A0+1] = D1,\nAddr[A0+2] = D0,\nAddr[A0+3] = D1,\nuntil A0+n = A1\n.fi\nT};T{\n.nf\n[0..7] : 5 6\nAddress: 01234567\nData:    56565656\n.fi\nT}\nT{\nA : D0 D1 D2;\nT};T{\n.nf\nAddr[A] = D0,\nAddr[A+1] = D1,\nAddr[A+2] = D2\n.fi\nT};T{\n.nf\n2 : 4 5 6\nAddress: 01234567\nData:    00456000\n.fi\nT}\n.TE\n.PP\n\\f[B]Note:\\fP\nThe address range forms are limited in SRecord,\nthe range must be less than 255 bytes.\nSRecord will never write an address range.\n.PP\n\\f[B]Note:\\fP\nWhen reading MIF file, SRecord will round up the number of bits in the\nWIDTH to be a multiple of 8.  Multi\\[hy]byte values will be laid down in\nmemory as big\\[hy]endian.\n.PP\n.\\\" http://www.mil.ufl.edu/4712/docs/mif_help.pdf\nAn ASCII text file (with the extension .mif) that specifies the initial\ncontent of a memory block (CAM, RAM, or ROM), that is, the initial\nvalues for each address.  This file is used during project compilation\nand/or simulation.  A MIF contains the initial values for each address\nin the memory.  In a MIF, you are also required to specify the memory\ndepth and width values.  In addition, you can specify the radixes used\nto display and interpret addresses and data values.\n.SH SIZE MULTIPLIER\nIn general, binary data will expand in sized by approximately 3.29\ntimes when 8\\[hy]bit data is represented with this format\n(16 bit = 2.75, 32 bit = 2.47, 64 bit = 2.34).\n.SH EXAMPLE\nFollowing is a sample MIF:\n.RS\n.ft CW\n.nf\nDEPTH = 32; % Memory depth and width are required %\n% DEPTH is the number of addresses %\nWIDTH = 14; % WIDTH is the number of bits of data per word %\n% DEPTH and WIDTH should be entered as decimal numbers %\nADDRESS_RADIX = HEX; % Address and value radixes are required %\nDATA_RADIX = HEX; % Enter BIN, DEC, HEX, OCT, or UNS; unless %\n                  % otherwise specified, radixes = HEX %\n \\-\\-Specify values for addresses, which can be single address or range\nCONTENT\nBEGIN\n[0..F]: 3FFF;     % Range: Every address from 0 to F = 3FFF %\n6     :    F;     % Single address: Address 6 = F %\n8     :    F E 5; % Range starting from specific address %\n\\-\\-                % Addr[8] = F, Addr[9] = E, Addr[A] = 5 %\nEND;\n.fi\n.ft R\n.RE\n.br\n.ne 1i\n.SH REFERENCE\nThe above information was gleaned from\nthe following sources:\n.nf\nhttp://www.altera.com/support/software/nativelink/quartus2/\\%\\\nglossary/def_mif.html\nhttp://www.mil.ufl.edu/4712/docs/mif_help.pdf\n.fi\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_mips_flash.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2011, 2012 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_mips_flash.5\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_mips_flash \\- MIPS\\[hy]Flash file format\n.if require_index \\{\n.XX \"srec_mips_flash(5)\" \"MIPS-Flash file format\"\n.\\}\n.SH DESCRIPTION\nThe MIPS SDE tool chain has a \\f[I]convert\\fP program that is able to\noutput this format.  I have no idea what reads it, some kind of flash\nprogrammer I suppose.\n.SS Format\nThe file must start with '!R' to reset the state machine.\nWhite space appears to be ignored, except as it serves to separate tokens.\n.PP\nData is presented as 32\\[hy]bit hexadecimal numbers, in the normal\nbig\\[hy]endian text number format.  To write them to memory, you have to\nknow if the target is big\\[hy]endian or little\\[hy]endian. for little endian\ntargets, reverse the order of the bytes in this number.\n.PP\nThe eight bytes following a '>' are a sort of comment.  The SDE code\nreads like they are displayed in the flash programmer as a kind of\nprogress indicator.\n.PP\nThe number following '@' is a new address for the following data.\n.PP\nEach segment must be erased before it can be written, this is done with\nthe '!E' command.  Each segment is assumed to be 128kB in size.\n.PP\nSpecial segments must unlocked (with the '!C' command) and locked again\n(with the '!S' command).\n.PP\nThis file format contains no checksum mechanism.\n.PP\n.SS Command Line Options\nThis format is specified using one of the \\fB\\-Mips\\[hy]Flash\\[hy]Big_Endian\\fP\nor \\fB\\-Mips\\[hy]Flash\\[hy]Little_Endian\\fP options.  The endian\\[hy]ness must\nbe specified on the command line, because there is nothing in the file contents\nto indicate the endian\\[hy]ness of the data it contains.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.3 times\nwhen represented with this format (worse if you use shorter lines).\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example MIPS\\[hy]Flash file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at bytes address 0x0000\n(but remember, the file contents are always multiples of four bytes).\n.RS\n.nf\n.ft CW\n!R\n>00000xxx @00000000 !E\n@00000000\n>00000000\n48656C6C 6F2C2057 6F726C64 210A0000\n>#DL_DONE\n>FINISHED\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_mos_tech.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2000, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_mos_tech\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_mos_tech \\- MOS Technology file format\n.if require_index \\{\n.XX \"srec_mos_tech(5)\" \"MOS Technology file format\"\n.\\}\n.SH DESCRIPTION\n.\\\" ------------------------------------------------------------------------\nThe MOS Technology format allows binary files to be uploaded and\ndownloaded between between a computer system (such as a PC, Macintosh,\nor workstation) and an emulator or evaluation board for microcontrollers\nand microprocessors.\n.SS The Lines\nEach line consists of 5 fields.  These are the\nlength field, address field, data field, and the checksum.\nThe lines always start with a semicolon (;) character.\n.br\n.ne 2i\n.SS The Fields\n.TS\nallbox,center,tab(&);\nlf(CW) l l l l l.\n;&Length&Address&Data&Checksum&CRLF\n.TE\n.TP 8n\nLength\nThe record length field is a 2 character (1 byte) field that specifies\nthe number of data bytes in the record.\nTypically this is 24 or less.\n.TP 8n\nAddress\nThis is a 2\\[hy]byte address that specifies where the data\nin the record is to be loaded into memory, big\\[hy]endian.\n.TP 8n\nData\nThe data field contains the executable code, memory\\[hy]loadable data\nor descriptive information to be transferred.\n.TP 8n\nChecksum\nThe checksum is an 2\\[hy]byte field that represents the least significant\ntwo bytes of the the sum of the values represented\nby the pairs of characters making up the record's length, address, and\ndata fields, big\\[hy]endian.\n.SS End of File\nThe final line should have a data length of zero, and the data line\ncount in the address field.  The checksum is not the usual checksum, it\nis instead a repeat of the data line count.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.54 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example MOS Technology format file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\n;0C000048656C6C6F2C20576F726C640454\n;0000010001\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.SH KIM\\[hy]1 User Manual \\- Appendix F \\- Paper Tape Format\n\\fI(The following information is reproduced from\nhttp://users.telenet.be/kim1\\[hy]6502/6502/usrman.html#F\njust in case it vanishes from the Web.)\\fP\n.PP\nThe paper tape LOAD and DUMP routines store and retrieve data in a\nspecific format designed to insure error free recovery.  Each byte\nof data to be stored is converted to two half bytes.  The half bytes\n(whose possible values are 0 to F HEX) are translated into their ASCII\nequivalents and written out onto paper tape in this form.\n.PP\nEach record outputted begins with a \\[lq];\\[rq] character (ASCII 3B) to\nmark the start of a valid record.  The next byte transmitted (18HEX)\nor (24 decimal) is the number of data bytes contained in the record.\nThe record's starting address High (1 byte, 2 characters), starting\naddress Lo (1 byte, 2 characters), and data (24 bytes, 48 characters)\nfollow.  Each record is terminated by the record's check\\[hy]sum (2 bytes, 4\ncharacters), a carriage return (ASCII 0D), line feed (ASCII 0A), and six\n\\[lq]NULL\\[rq] characters (ASCII 00).\n(NULL characters cause a blank area on the paper tape.)\n.PP\nThe last record transmitted has zero data bytes (indicated by ;00)\nThe starting address field is replaced by a four digit Hex number\nrepresenting the total number of data records contained in the\ntransmission, followed by the records usual check\\[hy]sum digits.  An\n\\[lq]XOFF\\[rq] character ends the transmission.\n.RS\n;180000FFEEDDCCBBAA0099887766554433221122334455667788990AFC\n.br\n;0000010001\n.RE\nDuring a \\[lq]LOAD\\[rq] all incoming data is ignored until a \\[lq];\\[rq]\ncharacter is received.  The receipt of non ASCII data or a mismatch\nbetween a records calculated check\\[hy]sum and the check\\[hy]sum read from tape\nwill cause an error condition to be recognized by KIM.  The check\\[hy]sum\nis calculated by adding all data in the record except the \\[lq];\\[rq]\ncharacter.\n.PP\nThe paper tape format described is compatible with all other\nMOS Technology, Inc. software support programs.\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_motorola.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 1998, 2000-2002, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_motorola\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_motorola \\- Motorola S\\[hy]Record hexadecimal file format\n.if require_index \\{\n.XX \"srec_motorola(5)\" \"Motorola S\\[hy]Record hexadecimal file format\"\n.\\}\n.SH DESCRIPTION\nThis format is also known as the \\fIExorciser\\fP, \\fIExormacs\\fP or\n\\fIExormax\\fP format.\n.PP\n.\\\" ------------------------------------------------------------------------\n.\\\" Derived from http://freeware.mcu.motsps.com/lit/faq/as-80.htm\nMotorola's S\\[hy]record format allows binary files to be uploaded and\ndownloaded between two computer systems.  This type of format is widely\nused when transferring programs and data between a computer system (such\nas a PC, Macintosh, or workstation) and an emulator or evaluation board\nfor Motorola microcontrollers and microprocessors.\n.SS The Lines\nMost S\\[hy]Record file contain only S\\[hy]Record lines (see the next section),\nwhich always start with a capital S character.  Some systems generate\nvarious \\[lq]extensions[rq] which usually manifest as lines which start with\nsomething else.  These \\[lq]extension[rq] lines may or may not break other\nsystems made by other vendors.  Caveat emptor.\n.br\n.ne 2i\n.SS The Fields\nThe S\\[hy]Record format consists of 5 fields. These are the type field,\nlength field, address field, data field, and the checksum.\nThe lines always start with a capital S character.\n.TS\nallbox,center,tab(;);\nlf(CW) l l l l l.\nS;Type;Record Length;Address;Data;Checksum\n.TE\n.TP 8n\nType\nThe type field is a 1 character field that specifies whether\nthe record is an S0, S1, S2, S3, S5, S6, S7, S8 or S9 field.\n.TP 8n\nRecord Length\nThe record length field is a 2 character (1 byte) field that specifies the\nnumber of character pairs (bytes) in the record, excluding the type and\nrecord length fields.\n.TP 8n\nAddress\nThis is a 2\\[hy], 3\\[hy] or 4\\[hy]byte address that specifies where the data\nin the S\\[hy]Record is to be loaded into memory.\n.TP 8n\nData\nThe data field contains the executable code, memory\\[hy]loadable data\nor descriptive information to be transferred.\n.TP 8n\nChecksum\nThe checksum is an 8\\[hy]bit field that represents the least significant\nbyte of the one's complement of the sum of the values represented\nby the pairs of characters making up the record's length, address, and\ndata fields.\n.br\n.ne 2i\n.SS Record Types\n.TP 8n\nS0\nThis type of record is the header record for each block of S\\[hy]Records.\nThe data field may contain any descriptive information identifying the\nfollowing block of S\\[hy]Records.  (It is commonly \\[lq]HDR[rq] on many\nsystems.)\nThe address field is normally zero.\n.TP 8n\nS1\nA record containing data and the 2\\[hy]byte address at which the data is\nto reside.\n.TP 8n\nS2\nA record containing data and the 3\\[hy]byte address at which the data is\nto reside.\n.TP 8n\nS3\nA record containing data and the 4\\[hy]byte address at which the data is\nto reside.\n.TP 8n\nS5\n.RS\nAn optional record containing the number of S1, S2 and S3 records\ntransmitted in a particular block.\nThe count appears in the two\\[hy]byte address field.\nThere is no data field.\n.PP\nThis record is optional, you do not have to use it.\nNobody knows if you can have more than one in a file; and if you do,\nnobody knows whether or not the line count resets after each one.\n.PP\nThe \\f[I]srec_cat\\fP command will only ever use one,\nprovided the number of lines fits in 16 bits,\notherwise it will use S6.\n.RS\n.TP 8n\nS6\n.RS\nAn optional record containing the number of S1, S2 and S3 records\ntransmitted in a particular block.\nThe count appears in the three\\[hy]byte address field.\nThere is no data field.\n.PP\nThis record is optional, you do not have to use it.\nNobody knows if you can have more than one in a file; and if you do,\nnobody knows whether or not the line count resets after each one.\n.PP\nNobody knows what happens if you mix S5 and S6 records in a file.\n.PP\nThe \\f[I]srec_cat\\fP command will only ever use one,\nprovided the number of lines fits in 24 bits.\n.RE\n.TP 8n\nS7\nA termination record for a block of S3 records.  The address field may\ncontain the 4\\[hy]byte address of the instruction to which control is passed.\nThere is no data field.\n.TP 8n\nS8\nA termination record for a block of S2 records.  The address field may\noptionally contain the 3\\[hy]byte address of the instruction to which control\nis passed.  There is no data field.\n.TP\nS9\nA termination record for a block of S1 records.  The address field\nmay optionally contain the 2\\[hy]byte address of the instruction to\nwhich control is passed.  If not specified, the first entry point\nspecification encountered in the object module input will be used.\nThere is no data field.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.4 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example S\\[hy]Record file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\nS00600004844521B\nS110000048656C6C6F2C20576F726C640A9D\nS5030001FB\nS9030000FC\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_msbin.5",
    "content": "'\\\" t\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 2009-2011 Peter Miller\n.\\\"\n.\\\" Original code contribution by David Kozub <zub@linux.fjfi.cvut.cz>\n.\\\" Copyright assigned to Peter Miller 28-Jan-2010\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_msbin\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_msbin \\- Windows CE Binary Image Data Format\n.if require_index \\{\n.XX \"srec_msbin(5)\" \"Windows CE Binary Image Data Format\"\n.\\}\n.SH DESCRIPTION\nThis format is the output of the Microsoft WinCE Platform Builder.\nThis is a binary (non\\[hy]text) file format.\nFile names in this format typically (ambiguously) use the \\f[CW].bin\\fP suffix.\n.SS File Format\nFiles in this format start with a header record.\n.PP\nThen comes the data itself, organized into records.\n.PP\nThe file finishes with an execution start address record.\nThis is mandatory.\n.SS File Header Record\nData in this format start with an optional header containing the magic\n\\[lq]B000FF\\en\\[rq], followed by the image start (four bytes, little\nendian) address and the span of the image (highest address \\- lowest\naddress + 1) (four bytes, little endian).\nThe file header does not have a checksum;\nit is therefore possible that a corrupt file header will go undetected.\n.TS\nallbox,tab(;);\nce ce ce.\nT{\nMagic\n.br\n\\[lq]B000FF\\en\\[rq]\n.br\n(7 bytes)\nT};T{\nLeast\n.br\nAddress\n.br\n(4 bytes)\nT};T{\nGreatest\n.br\nAddress\n.br\n(4 bytes)\nT}\n.TE\nThere is no provision for a file comment of any kind.\n.SS Data Record\nEach record consists of a record start address (four bytes, little endian),\na record length (four bytes, little endian),\na record checksum (four bytes, little endian),\nfollowed by the record data.\nThe data part of each record is raw byte values, no encoding.\n.TS\nallbox,tab(;);\nce ce ce ce.\nT{\nStart\n.br\naddress\n.br\n(4 bytes)\nT};T{\nLength\n.br\n(4 bytes)\nT};T{\nChecksum\n.br\n(4 bytes)\nT};T{\nData\nT}\n.TE\n.PP\nThe checksum is calculated by a simple sum of unsigned bytes\ninto a 32\\[hy]bit accumulator.\n.PP\nThe 12 record header bytes are not included in the record checksums;\nit is therefore possible that a corrupt record header will go undetected.\n.PP\nIt is not possible to place data at address zero with this format.\nAddress zero is reserved for use by the execution start address record.\n.PP\nThere is effectively no limit on the length of a record (2^32\\-1).  It is\nnot uncommon for a MsBin file to contain records with sizes in the tens\nof megabytes.\n.SS Execution Start Address Record\nLast comes a special record with the record address set to zero and\nrecord length set to the image execution start address.\nAccording to specification the record describing the execution start\naddress must be always present, and must always be the last record in the file.\n.TS\nallbox,tab(;);\nce ce ce.\nT{\nZero\n.br\n(4 bytes)\nT};T{\nStart\n.br\nAddress\n.br\n(4 bytes)\nT};T{\nChecksum\n.br\n= 0\n.br\n(4 bytes)\nT}\n.TE\n.SS Commentary\nThe MsBin files produced by SRecord are valid and can be\nsuccessfully parsed by the command line utilities \\f[CW]viewbin\\fP and\n\\f[CW]cvrtbin\\fP (part of Windows CE platform).\n.PP\nFor a MsBin file to be usable in Microsoft WinCE Platform Builder it has\nto contain a TOC meta\\[hy]structure.  This is data embedded in the file by\nMicrosoft WinCE Platform Builder itself.\n.PP\nThe opposite conversion \\- from MsBin \\- comes in handy when analyzing\na MsBin file (\\f[I]i.e.\\fP a WinCE image).\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 1.0\ntimes (approaching asymptotically from above) when represented with\nthis format, as the 15\\[hy]byte file header is averaged over the data\ncontent.  Holes in the data will also increase the size.\n.SH SOURCE\nhttp://msdn.microsoft.com/en\\-us/library/ms924510.aspx\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_needham.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_needham\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_needham \\- Needham EMP\\[hy]series programmer ASCII file format\n.if require_index \\{\n.XX \"srec_needham(5)\" \"Needham EMP\\[hy]series programmer ASCII file format\"\n.\\}\n.SH DESCRIPTION\nThis format is understood by Needham Electronics' EMP\\[hy]series programmers.\nSee \\f[CW]www.needhams.com/winman.pdf\\fP for more information.\n(This format is very similar to the ASCII\\[hy]Hex format, but without the ^B\nand ^C guard characters.)\n.PP\nEach data byte is represented as 2 hexadecimal characters,\nand is separated by white space from all other data bytes.\n.LP\nThe address for data bytes is set by using a sequence of\n\\f[CW]$A\\fP\\f[CI]nnnn\\fP\\f[CW],\\fP characters, where \\fInnnn\\fP is the\n8\\[hy]character ascii representation of the address.  The comma is required.\nThere is no need for an address record unless there are gaps.  Implicitly,\nthe file starts a address 0 if no address is set before the first\ndata byte.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 3.0 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example ascii\\[hy]hex file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x1000.\n.RS\n.nf\n.ft CW\n$A1000,\n48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 0A\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_os65v.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2002, 2004, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_os65v\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_os65v \\- OS65V Loader file format\n.if require_index \\{\n.XX \"srec_os65v(5)\" \"OS65V Loader file format\"\n.\\}\n.SH DESCRIPTION\nThis format is used by Ohio Scientific OS65V\\[hy]compatible loaders.  This\nfamily of machines includes the OSI C1P, Superboard II, C2, C4, C8,\nand Challenger III, as well as the UK101, and Elektor Junior.\n.PP\nThe file startes with a period '.' (0x2E), to ensure address entry\nmode.  then a 4\\[hy]digit hex address, followed by a slash '/' (0X2F) to\nenter the data entry mode.  The initial address is always present.\nThere is no need for an additional address record unless there are\ngaps.\n.LP\nEach data byte is represented as 2 hexadecimal characters, and is\nseparated by a carriage return character (0x0D) (advance address).\nThe final return character may be omitted.\n.LP\nThe data is concluded with a period '.' (0x2E) to re\\[hy]enter address\nmode.  If an address to start execution is specified, then the last 5\nbytes are \\fInnnn\\fPG where \\fInnnn\\fP is the 4\\[hy]digit execution\naddress, and G is the 'Go' command.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 3.0 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example ascii\\[hy]hex file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x1000,\nwith execution at 0x1003.  (On a 6502, this is the opcode for indirect\njump to 0x2C6F.)\n.LP\n1000/48^M65^M6C^M6C^M6F^M2C^M20^M57^M6F^M72^M6C^M64^M0A^M.1010G\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_ppb.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2011 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_ppb\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_ppb \\- Stag Prom Programmer binary format\n.if require_index \\{\n.XX \"srec_ppb(5)\" \"Stag Prom Programmer binary format\"\n.\\}\n.SH DESCRIPTION\nThis is the native binary format of the Stag Prom Programmer.\n.SS Format\nThe format is packet based.\nThe packet is somposed of an 0x01 byte,\nthe packet payload size (4 bytes, big\\[hy]endian),\nthe packet address size (4 bytes, big\\[hy]endian),\nthe packet data,\nand a one\\[hy]byte simple sum of the payload data.\n.PP\nIf the packet payload is more than 1024 bytes, there is an\nintermediate checksum after each 1024th payload pyte.\n.PP\nThe end of file is indicated by a packet with a zero\\[hy]length payload.\n.SS Command Line Option\nThis format is specified using the \\fB\\-PPB\\fP command line option.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 1.002\ntimes when represented with this format (worse if there are many short\ndata regions).\n.\\\" ------------------------------------------------------------------------\n.SH SEE ALSO\nhttp://www.stag.co.uk/\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_ppx.5",
    "content": "'\\\" t\n.\\\" srecord - Manipulate EPROM load files\n.\\\" Copyright (C) 2011 Peter Miller\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_ppx\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_ppx \\- Stag Prom Programmer hexadecimal format\n.if require_index \\{\n.XX \"srec_ppx(5)\" \"Stag Prom Programmer hexadecimal format\"\n.\\}\n.SH DESCRIPTION\nThis is the native hexadecimal format of the Stag Prom Programmer.\n.SS Format\nThe file must start with an asterisk '*' on a line by itself.\n.PP\nEach line has a 16\\[hy]bit address, followed by 8\\[hy]bit bytes.\n.PP\nThe end is indicated by '$S' folloowed by a 16\\[hy]bit checksum of the\ndata bytes as 4 hex digits.\n.SS Command Line Option\nThis format is specified using the \\fB\\-PPX\\fP\ncommand line option.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 3 times\nwhen represented with this format (worse if you use shorter lines).\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example PPX file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at bytes address 0x0000\n(but remember, the file contents are always multiples of four bytes).\n.RS\n.nf\n.ft CW\n*\n0000 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A $S0473\n.ft P\n.fi\n.RE\n.SH SEE ALSO\nhttp://matthieu.benoit.free.fr/pdf/pp39.pdf\nhttp://www.stag.co.uk/\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_signetics.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2001, 2006, 2007, 2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_signetics\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_signetics \\- Signetics file format\n.if require_index \\{\n.XX \"srec_signetics(5)\" \"Signetics file format\"\n.\\}\n.SH DESCRIPTION\nThe Signetics file format is not often used.  The major disadvantage in\nmodern applications is that the addressing range is limited to only 64kb.\n.SS Records\nAll data lines are called records, and each record contains the following\n5 fields:\n.TS\ncenter,allbox,tab(;);\nl l l l l l.\n:;aaaa;cc;as;dd;ss\n.TE\nThe field are defined as follows:\n.TP 8n\n\\fB:\\fP\nEvery record starts with this identifier.\n.TP 8n\naaaa\nThe address field.  A four digit (2 byte) number representing the first\naddress to be used by this record.\n.TP 8n\ncc\nThe byte\\[hy]count.\nA two digit value (1 byte), counting the actual data bytes in the record.\n.TP 8n\nas\nAddress checksum.\nCovers 2 address bytes and the byte count.\n.TP 8n\ndd\nThe actual data of this record.\nThere can be 1 to 255 data bytes per record (see cc)\n.TP 8n\nss\nData Checksum.\nCovers only all the data bytes of this record.\n.SS Record Begin\nEvery record begins with a colon \\[lq]:[rq] character.  Records contain only\nASCII characters.  No spaces or tabs are allowed in a record.  In fact,\napart from the 1st colon, no other characters than 0..9 and A..F are\nallowed in a record.  Interpretation of a record should be case less,\nit does not matter if you use a..f or A..F.\n.PP\nUnfortunately the colon was chosen for the Signetics file format, similar\nto the Intel format (see \\fIsrec_intel\\fP(5) for more information).\nHowever, SRecord is able to automatically detect the dofference between\nthe two format, when you use the \\fB\\-Guess\\fP format specifier.\n.SS Address Field\nThis is the address where the first data byte of the record should be\nstored.  After storing that data byte, the address is incremented by 1\nto point to the address for the next data byte of the record.  And so\non, until all data bytes are stored.  The address is represented by a 4\ndigit hex number (2 bytes), with the MSD first.  The order of addresses\nin the records of a file is not important.  The file may also contain\naddress gaps, to skip a portion of unused memory.\n.SS Byte Count\nThe byte count cc counts the actual data bytes in the current record.\nUsually records have 32 data bytes, but any number between 1 and 255\nis possible.\n.PP\nA value of 0x00 for cc indicates the end of the file.  In this case\nnot even the address checksum will follow!  The record (and file) are\nterminated immediately.\n.PP\nIt is not recommended to send too many data bytes in a record for that\nmay increase the transmission time in case of errors.  Also avoid sending\nonly a few data bytes per record, because the address overhead will be\ntoo heavy in comparison to the payload.\n.SS Address Checksum\nThis is not really a checksum anymore, it looks more like a CRC.\nThe checksum can not only detect errors in the values of the bytes, but\nalso bytes out of order can be detected.\n.PP\nThe checksum is calculated by this algorithm:\n.RS\n.nf\nchecksum = 0\nfor i = 1 to 3\n  checksum = checkum XOR byte\n  ROL checksum\nnext i\n.fi\n.RE\nFor the Address Checksum we only need 2 Address bytes and 1 Byte Count\nbyte to be added.  That's why we count to 3 in the loop.  Every byte is\nXORed with the previous result.  Then the intermediate result is rolled\nleft (carry rolls back into b0).\n.PP\nThis results in a very reliable checksum, and that for only 3 bytes!\n.PP\nThe last record of the file does not contain any checksums!\nSo the file ends right after the Byte Count of 0.\n.SS Data Field\nThe payload of the record is formed by the Data field.\nThe number of data bytes expected is given by the Byte Count field.\nThe last record of the file may not contain a Data field.\n.SS Data Checksum\nThis checksum uses the same algorithm as used for the Address Checksum.\nThis time we calculate the checksum with only the data bytes of this record.\n.RS\n.nf\nchecksum = 0\nfor i = 1 to cc\n  checksum = checksum XOR byte\n  ROL checksum\nnext i\n.fi\n.RE\nNote that we count to the Byte Count cc this time.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.4 times\nwhen represented with this format.\n.SH EXAMPLE\nHere is an example Signetics file\n.RS\n.nf\n.ft CW\n:B00010A5576F77212044696420796F75207265617B\n:B01010E56C6C7920676F207468726F756768206136\n:B02010256C6C20746861742074726F75626C652068\n:B0300D5F746F207265616420746869733FD1\n:B03D00\n.ft P\n.fi\n.RE\nIn the example above you can see a piece of code in Signetics format.\nThe first 3 lines have 16 bytes of data each, which can be seen by the\nbyte count.  The 4th line has only 13 bytes, because the program is at\nit's end there.\n.PP\nNotice that the last record of the file contains no data bytes, and not\neven an Address Checksum.\n.SH SEE ALSO\nhttp://sbprojects.fol.nl/knowledge/fileformats/signetics.htm\n.SH AUTHOR\nThis man page was taken from the above Web page.\nIt was written by\nSan Bergmans <sanmail@bigfoot.com>\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_spasm.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2001, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_spasm\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_spasm \\- SPASM file format\n.if require_index \\{\n.XX \"srec_spasm(5)\" \"SPASM file format\"\n.\\}\n.SH DESCRIPTION\nThis format is the output of the Paralax SPASM assembler\n(now defunct, I'm told).\nThe file contains two columns of 16\\[hy]bit hexadecimal coded values.\nThe first column is the word address, the second column is the word data.\n.PP\nBy default, SRecord treats this is big\\[hy]endian data (the most\nsignificant byte first).  If you want little endian order,\nuse the \\-spasm\\[hy]le argument instead.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 5.0 times\nwhen represented with this format (5.5 times in Windows).\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example SPASM file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at bytes address 0x0100\n(but remember, the file contents are word addressed).\n.RS\n.nf\n.ft CW\n0080 6548\n0081 6C6C\n0082 2C6F\n0083 5720\n0084 726F\n0085 646C\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_spectrum.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2006-2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_spectrum\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_spectrum \\- Spectrum file format\n.if require_index \\{\n.XX \"srec_spectrum(5)\" \"Spectrum file format\"\n.\\}\n.SH DESCRIPTION\n.\\\" ftp://ftp.dataio.com/main/Manuals/UniFam/Translation%20Formats.pdf\nIn this format, bytes are recorded as ASCII code with binary digits\nrepresented by 1s and 0s.  Each byte is preceded by a decimal address.\n.PP\nThe file ends with a Control\\[hy]C character (0x03).\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 14 times\nwhen represented with this format (or 15 times on DOS or Windows).\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Spectrum file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x0.\n.RS\n.nf\n.ft CW\n\\fB^B\\fP\n0000 01001000\n0001 01100101\n0002 01101100\n0003 01101100\n0004 01101111\n0005 00101100\n0006 00100000\n0007 01010111\n0008 01101111\n0009 01110010\n0010 01101100\n0011 01100100\n0012 00100001\n0013 00001010\n\\fB^C\\fP\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_stewie.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2004, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_stewie\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_stewie \\- Stewie's binary file format\n.if require_index \\{\n.XX \"srec_stewie(5)\" \"Stewie's binary file format\"\n.\\}\n.SH DESCRIPTION\nIf you have a URL for documentation of this format, please let me know.\n.PP\nAny resemblance to the Motorola S\\[hy]Record is superficial, and extends\nonly to the data records.  The header records and termination records\nare completely different.  None of the other Motorola S\\[hy]Records record\ntype are available.\n.SS The Records\nAll records start with an ASCII capital S character, value 0x53,\nfollowed by a type specifier byte.  All records consist of binary bytes.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 1i\n.SS The Header Record\nEach file starts with a fixed four byte header record.\n.TS\nallbox,center,tab(;);\nl l l l.\n0x53;0x30;0x30;0x33\n.TE\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS The Data Records\nEach data record consists of 5 fields. These are the type field,\nlength field, address field, data field, and the checksum.\nThe lines always start with a capital S character.\n.TS\nallbox,center,tab(;);\nlf(CW) l l l l l.\n0x53;Type;Record Length;Address;Data;Checksum\n.TE\n.TP 8n\nType\nThe type field is a one byte field that specifies whether\nthe record has\na two\\[hy]byte address field (0x31),\na three\\[hy]byte address field (0x32) or\na four\\[hy]byte address field (0x33).\nThe address is big\\[hy]endian.\n.TP 8n\nRecord Length\nThe record length field is a one byte field that specifies the\nnumber of bytes in the record following this byte.\n.TP 8n\nAddress\nThis is a 2\\[hy], 3\\[hy] or 4\\[hy]byte address that specifies where the data\nin the record is to be loaded into memory.\n.TP 8n\nData\nThe data field contains the executable code, memory\\[hy]loadable data\nor descriptive information to be transferred.\n.TP 8n\nChecksum\nThe checksum is a one byte field that represents the least significant\nbyte of the one's complement of the sum of the values represented\nby the bytes making up the record's length, address, and\ndata fields.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 1i\n.SS The Termination Record\nEach file ends with a fixed two byte termination record.\n.TS\nallbox,center,tab(;);\nl l.\n0x53;0x38\n.TE\n.\\\" ------------------------------------------------------------------------\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 1.2 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an hex\\[hy]dump example file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\n0000: 53 30 30 33 53 31 10 00 00 48 65 6C 6C 6F 2C 20  S003S1...Hello,\n0010: 57 6F 72 6C 64 0A 9D 53 38                       World..S8\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_tektronix.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 1998, 2000, 2001, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_tektronix\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_tektronix \\- Tektronix hexadecimal file format\n.if require_index \\{\n.XX \"srec_tektronix(5)\" \"Tektronix hexadecimal file format\"\n.\\}\n.SH DESCRIPTION\n.\\\" ------------------------------------------------------------------------\nThe Tektronix hexadecimal file format is no longer very common.\nIt serves a similar purpose to the Motorola and Intel formats,\nusually used to transfer data into EPROM programmers.\n.SS The Lines\nMost Tektronix hex files contain only Tektronix hex lines (see\nthe next section), which always start with a slash (\\[lq]/[rq]) character.\nThere are only two types of lines \\- data lines and a termination line.\n.br\n.ne 2i\n.SS Data Lines\nData lines have five fields:\naddress, length, checksum 1, data and checksum 2.\nThe lines always start with a slash (\\[lq]/[rq]) character.\n.TS\nallbox,center,tab(;);\nlf(CW) l l l l l.\n/;Address;Length;Checksum1;Data;Checksum2\n.TE\n.TP 8n\nAddress\nThis is a 4 character (2 byte) address that specifies where the data in\nthe record is to be loaded into memory.\n.TP 8n\nData Length\nThe data length field is a 2 character (1 byte) field that specifies the\nnumber of character pairs (bytes) in the data field.\nThis field never has a value of zero.\n.TP 8n\nChecksum 1\nThe checksum 1 field is a 2 character (1 byte) field.  Its value is\nthe 8\\[hy]bit sum of the six 4\\[hy]bit values which make up the address and\nlength fields.\n.TP 8n\nData\nThe data field contains character pairs (bytes); the number of character\npairs (bytes) is indicated by the length field.\n.TP 8n\nChecksum 2\nThe checksum 2 field is a 2 character (1 byte) field.  Its value is\nthe least significant byte of the sum of the all the 4\\[hy]bit values of\nthe data field.\n.br\n.ne 2i\n.SS Termination Line\nTermination lines have three fields:\naddress, zero and checksum.\nThe lines always start with a slash (\\[lq]/[rq]) character.\n.TS\nallbox,center,tab(;);\nlf(CW) l l l.\n/;Address;Zero;Checksum\n.TE\n.TP 8n\nAddress\nThis is a 4 character (2 byte) address that specifies where to begin\nexecution.\n.TP 8n\nZero\nThe data length field is a 2 character (1 byte) field of value zero.\n.TP 8n\nChecksum\nThe checksum 1 field is a 2 character (1 byte) field.  Its value is\nthe 8\\[hy]bit sum of the six 4\\[hy]bit values which make up the address and\nzero fields.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.4 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Tektronix hex file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0.\n.RS\n.nf\n.ft CW\n/00000D0D48656C6C6F2C20576F726C640A52\n/00000000\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_tektronix_extended.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2000, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_tektronix_extended\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_tektronix_extended \\- Tektronix Extended hexadecimal file format\n.if require_index \\{\n.XX \"srec_tektronix_extended(5)\" \"Tektronix Extended hexadecimal file format\"\n.\\}\n.SH DESCRIPTION\n.\\\" ------------------------------------------------------------------------\nThis format allows binary files to be uploaded and downloaded between\ntwo computer systems, typically between a computer system (such as a\nPC, Macintosh, or workstation) and an emulator or evaluation board for\nmicrocontrollers and microprocessors.\n.SS The Lines\nLines always start with a percent (%) character.  Each line consists\nof 5 fields.  These are the length field, the type field, the checksum,\nthe address field (including address length), and the data field.\n.br\n.ne 2i\n.SS The Fields\n.TS\nallbox,center,tab(;);\nlf(CW) l l l l l.\n%;Length;Type;Checksum;Address;Data\n.TE\n.TP 8n\nRecord Length\nThe record length field is a 2 character (1 byte) field that specifies\nthe number of characters (not bytes) in the record, excluding the percent.\n.TP 8n\nType\nThe type field is a 1 character field that specifies whether\nthe record is data (6) or termination (8).\n.TP 8n\nChecksum\nThe checksum is an 2 character (1 byte) field that represents the\nsum of all the nibbles on the line, excluding the checksum.\n.TP 8n\nAddress\nThis is a 9 character field.  The first character is the address size;\nit is always 8.  The remaining 8 chgaracters are the 4\\[hy]byte address that\nspecifies where the data is to be loaded into memory.\n.TP 8n\nData\nThe data field contains the executable code, memory\\[hy]loadable data\nor descriptive information to be transferred.\n.br\n.ne 2i\n.SS Record Types\n.TP 8n\n6\nA record containing data.\nThe data is placed at the address specified.\n.TP 8n\n8\nA termination record.\nThe address field may optionally contain the address of the instruction\nto which control is passed.  There is no data field.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.5 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Tektronix extended file.\nIt contains the data \\[lq]Hello, World\\[rq] to be loaded at address 0x006B.\n.RS\n.nf\n.ft CW\n%256D980000006B48656C6C6F2C20576F726C64210A\n%09819800000000\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_ti_tagged.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2000, 2001, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_ti_tagged\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_ti_tagged \\- Texas Instruments Tagged (SDSMAC) file format\n.if require_index \\{\n.XX \"srec_ti_tagged(5)\" \"Texas Instruments Tagged (SDSMAC) file format\"\n.\\}\n.SH DESCRIPTION\nThis format is also known as the \\f[I]TI\\[hy]Tagged\\fP or\n\\f[I]TI\\[hy]SDSMAC\\fP format.\n.PP\n.\\\" ------------------------------------------------------------------------\nThis format allows binary files to be uploaded and downloaded between\ntwo computer systems, typically between a computer system (such as a\nPC, Macintosh, or workstation) and an emulator or evaluation board for\nmicrocontrollers and microprocessors.\n.SS The Lines\nUnlike many other object formats, the lines themselves are not especially\nsignificant.  The format consits of a number of \\fItagged\\fP fields,\nand lines are composed of a series of these fields.\n.TS\ncenter,tab(;);\nl l.\nTag;Description\n_\n*;T{\nData byte.\nT}\n:;T{\nEnd of file.\nT}\n0;T{\nFile header (optional).\nT}\n7;T{\nChecksum.\nT}\n8;T{\nDummy checksum (ignored).\nT}\n9;T{\nAddress.\nT}\nB;T{\nData word.\nT}\nF;T{\nEnd of data record.\nT}\nK;T{\nProgram identifier (optional).\nT}\n.TE\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Data Byte\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I).\nB;n;n\n.TE\n.sp 0.5\nOne byte of data.\nThe \\fInn\\fP is 8\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS End of File\n.TS\nallbox,center,tab(;);\nlf(CW) l.\n:;CRLF\n.TE\n.sp 0.5\nThe end of data is indicated by this tag.\nThe end of line sequence (LF on Unix systems, CRLF on PCs)\nfollows this tag.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS File Header\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I).\n0;length;filename\n.TE\n.sp 0.5\nThe optional start\\[hy]of\\[hy]file record begins with a tag character ('0') and\na 12\\[hy]character file header. The first four characters are the byte count\nof the file data.  The remaining 8 characters are the name of the file\nand may be any ASCII characters, blank padded.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Checksum\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\n7;n;n;n;n\n.TE\n.sp 0.5\nThe checksum is the 2s complement sum of the 8\\[hy]bit ASCII values of\ncharacters, beginning with the first tag character and ending with the\nchecksum tag character (7).\nThe \\fInnnn\\fP is 16\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Dummy Checksum\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\n8;n;n;n;n\n.TE\n.sp 0.5\nThe checksum is the 2s complement sum of the 8\\[hy]bit ASCII values of\ncharacters, beginning with the first tag character and ending with the\nchecksum tag character (8).\nThe \\fInnnn\\fP is 16\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Address\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\n9;n;n;n;n\n.TE\n.sp 0.5\nAddresses may be given for any data byte, but none is mandatory.\nThe file begins at 0000 if no address is given before the first data field.\nThe \\fInnnn\\fP is 16\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Data Word\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\nB;a;a;b;b\n.TE\n.sp 0.5\nTwo bytes of data.\nThe \\fIaa\\fP and \\fIbb\\fP are each 8\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS End of Record\n.TS\nallbox,center,tab(;);\nlf(CW) l.\nF;CRLF\n.TE\n.sp 0.5\nThe end of line sequence (LF on Unix systems, CRLF on PCs)\nis escaped using this tag.\nThe checksum is reset to zero at this point.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Program Identifier\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I) lf(I).\nK;n;n;n;n;text\n.TE\n.sp 0.5\nThe program identifier can contain a brief description of the program, or\ncan be empty (\\fIi.e.\\fP the text portion is optional).  The \\fInnnn\\fP\nlength (hex) of the field includes the `K', the length and the text; it is at\nleast 5.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 21\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.9 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example TI\\[hy]Tagged file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x0100.\n.RS\n.nf\n.ft CW\nK000590080B4865B6C6CB6F2CB2057B6F72B6C64*0A7F648F\n:\n.ft P\n.fi\n.RE\nand here is another example from the\nreference below\n.RS\n.nf\n.ft CW\n00050        7FDD4F\n90000BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F400F\n90010BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FFF\n90020BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FEF\n90030BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FDF\n90040BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FCF\n:\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.SH SEE ALSO\nhttp://www.dataio.com/pdf/Manuals/Unifamily/981\\[hy]0014\\[hy]016.pdf\n(page 6\\[hy]33)\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_ti_tagged_16.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2007-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_ti_tagged_16\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_ti_tagged_16 \\- Texas Instruments Tagged (SDSMAC 320) file format\n.if require_index \\{\n.XX \"srec_ti_tagged_16(5)\" \"Texas Instruments Tagged (SDSMAC 320) file format\"\n.\\}\n.SH DESCRIPTION\nThis format is also known as the \\f[I]TI\\[hy]Tagged\\fP\nor \\f[I]Texas Instruments SDSMAC (320)\\fP format.\n.PP\n.\\\" ------------------------------------------------------------------------\nThis format allows binary files to be uploaded and downloaded between\ntwo computer systems, typically between a computer system (such as a\nPC, Macintosh, or workstation) and an emulator or evaluation board for\n16\\[hy]bit microcontrollers and microprocessors.\n.SS The Lines\nUnlike many other object formats, the lines themselves are not especially\nsignificant.  The format consits of a number of \\fItagged\\fP fields,\nand lines are composed of a series of these fields.\n.TS\ncenter,tab(;);\nl l.\nTag;Description\n_\n*;T{\nData byte.\nT}\n:;T{\nEnd of file.\nT}\n0;T{\nFile header (optional).\nT}\n7;T{\nChecksum.\nT}\n8;T{\nDummy checksum (ignored).\nT}\n9;T{\nWord Address.\nT}\nB;T{\nData word.\nT}\nF;T{\nEnd of data record.\nT}\nK;T{\nProgram identifier (optional).\nT}\n.TE\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Data Byte\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I).\nB;n;n\n.TE\n.sp 0.5\nOne byte of data.\nThe \\fInn\\fP is 8\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS End of File\n.TS\nallbox,center,tab(;);\nlf(CW) l.\n:;CRLF\n.TE\n.sp 0.5\nThe end of data is indicated by this tag.\nThe end of line sequence (LF on Unix systems, CRLF on PCs)\nfollows this tag.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS File Header\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I).\n0;length;filename\n.TE\n.sp 0.5\nThe optional start\\[hy]of\\[hy]file record begins with a tag character ('0') and\na 12\\[hy]character file header. The first four characters are the count (in\nhex) of the 16\\[hy]bit data word values (B) which follow, not including data\nbyte values (*). The remaining file header characters are the name of\nthe file and may be any ASCII characters, blank padded.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Checksum\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\n7;n;n;n;n\n.TE\n.sp 0.5\nThe checksum is the 2s complement sum of the 8\\[hy]bit ASCII values of\ncharacters, beginning with the first tag character and ending with the\nchecksum tag character (7).\nThe \\fInnnn\\fP is 16\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Dummy Checksum\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\n8;n;n;n;n\n.TE\n.sp 0.5\nThe checksum is the 2s complement sum of the 8\\[hy]bit ASCII values of\ncharacters, beginning with the first tag character and ending with the\nchecksum tag character (8).\nThe \\fInnnn\\fP is 16\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Address\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\n9;n;n;n;n\n.TE\n.sp 0.5\nAddresses may be given for any data byte, but none is mandatory.  The\nfile begins at 0000 if no address is given before the first data field.\nThe \\fInnnn\\fP is 16\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Data Word\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I).\nB;a;a;b;b\n.TE\n.sp 0.5\nTwo bytes of data.\nThe \\fIaa\\fP and \\fIbb\\fP are each 8\\[hy]bit big\\[hy]endian hexadecimal.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS End of Record\n.TS\nallbox,center,tab(;);\nlf(CW) l.\nF;CRLF\n.TE\n.sp 0.5\nThe end of line sequence (LF on Unix systems, CRLF on PCs)\nis escaped using this tag.\nThe checksum is reset to zero at this point.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SS Program Identifier\n.TS\nallbox,center,tab(;);\nlf(CW) lf(I) lf(I) lf(I) lf(I) lf(I).\nK;n;n;n;n;text\n.TE\n.sp 0.5\nThe program identifier can contain a brief description of the program,\nor can be empty (\\fIi.e.\\fP the text portion is optional).  The\n\\fInnnn\\fP length (hex) of the field includes the `K', the length and\nthe text; it is at least 5.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 21\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.9 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example TI\\[hy]Tagged file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x0100.\n.RS\n.nf\n.ft CW\nK000590080B4865B6C6CB6F2CB2057B6F72B6C64*0A7F641F\n:\n.ft P\n.fi\n.RE\nHere is another example from the reference below\n.RS\n.nf\n.ft CW\n00028        7FDCFF\n90000BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F400F\n90008BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3F8F\n90010BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FFF\n90018BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3F7F\n90020BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FEF\n:\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.SH SEE ALSO\nhttp://www.dataio.com/pdf/Manuals/Unifamily/981\\[hy]0014\\[hy]016.pdf\n(page 6\\[hy]7)\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_ti_txt.5",
    "content": "'\\\" t\n.\\\"     srecord - The \"srecord\" program.\n.\\\"     Copyright (C) 2007-2009, 2011 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_ti_txt\n.TH srec_ti_txt 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_ti_txt \\- Texas Instruments ti\\[hy]txt (MSP430) file format\n.if require_index \\{\n.XX \"srec_ti_txt(5)\" \"Texas Instruments ti\\[hy]txt (MSP430) file format\"\n.\\}\n.SH DESCRIPTION\nThe ti\\[hy]TXT format is used by the Texas Instruments MSP430 familty\nprogramming adapter.\n.PP\nThe TI\\[hy]TXT hex format supports 16\\[hy]bit hexadecimal data.  It consists of\none or more sections, followed by the end\\[hy]of\\[hy]file indicator.\n.PP\nEach section consistes of an at (@) sign followed a execution start address (in\nhexadecimal), and newline, and then data bytes (in hexadecimal).  The\nsection address is followed by a newline.\nThere are to be 16 data bytes per line,\nexcept for the last line in a section.\n.PP\nThe end\\[hy]of\\[hy]file indicator is the letter \\f[CW]q\\fP\nfollowed by a newline.\nThe end\\[hy]of\\[hy]file indicator mandatory.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 3.0 times\nwhen represented with this format.\n.SH EXAMPLE\nHere is an example ti\\[hy]txt file taken from the reference below:\n.RS\n.ft CW\n.nf\n@F000\n31 40 00 03 B2 40 80 5A 20 01 D2 D3 22 00 D2 E3\n21 00 3F 40 E8 FD 1F 83 FE 23 F9 3F\n@FFFE\n00 F0\nq\n.ft P\n.fi\n.RE\n.br\n.ne 1i\n.SH SEE ALSO\nhttp://www.ti.com/lit/pdf/slau101, section A.2.\n\\f[B]Note:\\fP the portion which says addresses must be even, and the\nnumber of data bytes in a section must be even, is wrong.\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_trs80.5",
    "content": "'\\\" t\n.\\\" srecord - manipulate eprom load files\n.\\\" Copyright (C) 2012 Peter Miller\n.\\\"\n.\\\" Code contribution by Eric Smith <eric@brouhaha.com>\n.\\\" Copyright assigned to Peter Miller 15-Mar-2012.\n.\\\"\n.\\\" This program is free software; you can redistribute it and/or modify\n.\\\" it under the terms of the GNU General Public License as published by\n.\\\" the Free Software Foundation; either version 3 of the License, or\n.\\\" (at your option) any later version.\n.\\\"\n.\\\" This program is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU General Public License\n.\\\" along with this program. If not, see <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_trs80\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_trs80 \\- Radio Shack TRS\\[hy]80 object file format specification\n.if require_index \\{\n.XX \"srec_trs80(5)\" \"Radio Shack TRS\\[hy]80 object file format specification\"\n.\\}\n.SH DESCRIPTION\nThis document describes the binary object file format for the Z80\\[hy]based\nRadio Shack TRS\\[hy]80 microcomputers, such as the Model I, II, III, 4, 4D,\nand 4P.  The binary format is generated by the disk\\[hy]based Assembler/Editor,\nand used for TRS\\[hy]DOS program files.\n.PP\nThe object file is blocked into records, each of which contains\nthe record type, length, and payload data.  For Data and End of File records,\nthe payload starts with two bytes of address in little\\[hy]endian format.\nThere are four main types of records that are defined.\nThe record types are:\n.TP 2n\n\\(bu\nData Record\n.TP 2n\n\\(bu\nEnd of File Record with Execution Transfer\n.TP 2n\n\\(bu\nEnd of File Record without Execution Transfer\n.TP 2n\n\\(bu\nComment\n.TP 2n\n\\(bu\nStart Linear Address Record (32\\[hy]bit format only)\n.SS General Record Format\n.TS\nallbox,tab(;);\nle le le le.\nT{\nRecord\n.br\nType\nT};T{\nRecord\n.br\nLength\nT};T{\nLoad\n.br\nAddress\nT};T{\nData\nT}\n.TE\n.TP 8n\nRecord Type.\n.RS\nEach record begins with a single byte Record Type field which\nspecifies the record type of this record.  The Record Type field is\nused to interpret the remaining information within the record.  This\nfield is one byte, represented as two hexadecimal characters.  The\nencoding for all the current record types are:\n.TP 3n\n1\nData Record\n.TP 3n\n2\nEnd of File Record with Execution Transfer\n.TP 3n\n3\nEnd of File Record without Execution Transfer\n.TP 3n\n5\nComment Record\n.RE\n.TP 8n\nRecord Length\nEach record has a single byte Record Length field which specifies the\nnumber of bytes of information or data which follows the Record Length\nfield of the record.  The maximum value of the Record Length field is\nhexadecimal \\[lq]FF\\[rq] or 255.  In the case of Data Records only,\nRecord Length byte values of zero to two are considered to be lengths of\n256 to 258, respectively.\n.TP 8n\nAddress\nData and End records have a two\\[hy]byte Address field in little\\[hy]endian byte\norder.  For Data records, this is the starting address at which to load\nthe remaining payload of the record.  In End records, this is the address\nfor the start of execution of the file, or zero if not applicable.\n.TP 8n\nData\nEach record has a variable length Data field, it consists of zero or\nmore bytes.  The interpretation\nof this field depends on the Record Type field.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH REFERENCE\nThis information comes from the \"Program Files\" section of\n.I \"TRSDOS\\[hy]II Reference Manual,\"\nTandy Corporation,\n1982.\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n.\\\" vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_vmem.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2003, 2005-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_vmem\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_vmem \\- vmem file format\n.if require_index \\{\n.XX \"srec_vmem(5)\" \"VMEM file format\"\n.\\}\n.SH DESCRIPTION\nThis format is the Verilog VMEM format.\nThis is a hex format suitable for loading into Verilog simulations using\nthe \\f[CW]$readmemh\\fP call.\n.LP\nThe text file to be read shall contain only the following:\n.br\nWhite space (spaces, new lines, tabs, and form\\[hy]feeds)\n.br\nComments (both types of C++ comment are allowed)\n.br\nHexadecimal numbers\n.LP\nWhite space and/or comments shall be used to separate the numbers.\n.LP\nIn the following discussion, the term \"address\" refers to an index into\nthe array that models the memory.\n.LP\nAs the file is read, each number encountered is assigned to a successive\nword element of the memory.  Addressing is controlled both by specifying\nstart and/or finish addresses in the system task invocation and by\nspecifying addresses in the data file.\n.LP\nWhen addresses appear in the data file, the format is an \"at\" character\n(\\f[CW]@\\fP) followed by a hexadecimal number as follows:\n.RS\n.nf\n.ft CW\n@hh...h\n.ft P\n.fi\n.RE\n.LP\nBoth uppercase and lowercase digits are allowed in the number.  No white\nspace is allowed between the \\f[CW]@\\fP and the number.  As many address\nspecifications as needed within the data file can be used.  When the\nsystem task encounters an address specification, it loads subsequent\ndata starting at that memory address.\n.SS Commentary\nThere is no checksum in this format, which can generate false positives\nwhen guessing file formats on input.\n.LP\nThere is no indication of the word size in the file, since it is dependent\non the word type of the Verilog memory it is being read into.\nSRecord will guess the word size based on the number of digits it sees\nin the numbers, but this is only a guess.\n.LP\nSRecord will also assume that the numbers are to be loaded big\\[hy]endian;\nthat is, most significant byte (first byte seen) into the lowest address\ncovered by the word.\n.LP\nYou can use the \\fB\\-byte\\[hy]swap\\fP filter to change the byte order;\nit takes an optional width of bytes to swap within.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 2.9 times\n(32\\[hy]bit), 3.1 times (16\\[hy]bit) or 3.6 times (8\\[hy]bit) when\nrepresented with this format.\n.\\\" ------------------------------------------------------------------------\n.br\n.ne 2i\n.SH EXAMPLE\nHere is an example Verilog VMEM file.\nIt contains the data \\[lq]Hello, World[rq] to be loaded at address 0x1000.\n.RS\n.nf\n.ft CW\n@00000400 48656C6C 6F2C2057 6F726C64 0AFFFFFF\n.ft P\n.fi\n.RE\n.\\\" ------------------------------------------------------------------------\n.SH REFERENCE\nIEEE P1364\\[hy]2005/D2,\nStandard for Verilog Hardware Description Language (Draft),\nsection 17.2.8 \"Loading memory data from a file\", p. 295.\n.br\nCopyright \\(co 2003 IEEE\n.br\nhttp://www.boyd.com/1364/\n.br\nhttp://www.boyd.com/1364/1364\\[hy]2005\\[hy]d2.pdf.gz\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/man/man5/srec_wilson.5",
    "content": "'\\\" t\n.\\\"     srecord - manipulate eprom load files\n.\\\"     Copyright (C) 2000, 2006-2009 Peter Miller\n.\\\"\n.\\\"     This program is free software; you can redistribute it and/or modify\n.\\\"     it under the terms of the GNU General Public License as published by\n.\\\"     the Free Software Foundation; either version 3 of the License, or\n.\\\"     (at your option) any later version.\n.\\\"\n.\\\"     This program is distributed in the hope that it will be useful,\n.\\\"     but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n.\\\"     GNU General Public License for more details.\n.\\\"\n.\\\"     You should have received a copy of the GNU General Public License\n.\\\"     along with this program. If not, see\n.\\\"     <http://www.gnu.org/licenses/>.\n.\\\"\n.ds n) srec_wilson\n.TH \\*(n) 5 SRecord \"Reference Manual\"\n.SH NAME\nsrec_wilson \\- wilson file format\n.if require_index \\{\n.XX \"srec_wilson(5)\" \"Wilson file format\"\n.\\}\n.SH DESCRIPTION\nThis is a mystery format, added to support a mysery EPROM loader\nused by Alan Wilson <dvdsales@dvdlibrary.co.uk>\n.LP\nIf you know the true name of this format, please let me know!\nIt bears a remarkable similarity to the Motorola S\\[hy]Record format,\nhowever I can find no reference to a \"compressed\" Motorola format.\n.SS The Lines\nEach line contains normal ASCII characters, and \\[lq]high bit on[rq]\ncharacters, but the ASCII control characters are avoided (the\nhigh\\[hy]bit\\[hy]on con characters are not avoided).  Normal line\ntermination characters (CRLF or LF, depending on your system) are used.\n.LP\nThe presence of high\\[hy]bit\\[hy]on characters makes this format unattractive to\nsend via email, as it must be wrapped as a binary attachment, increasing\nits size.\n.LP\nIn general, a single\nbyte per byte is used to encode values, however some values use two bytes,\naccording to the following table:\n.TS\ncenter,tab(;);\nc c.\nByte Value;Encoding (1 or 2 chars)\n0x00 .. 0x9F;0x40 .. 0xDF\n0xA0 .. 0xAF;0x3A 0x30 .. 0x3A 0x3F\n0xB0 .. 0xBF;0x3B 0x30 .. 0x3B 0x3F\n0xC0 .. 0xCF;0x3C 0x30 .. 0x3C 0x3F\n0xD0 .. 0xDF;0x3D 0x30 .. 0x3D 0x3F\noxE0 .. 0xFF;0xE0 .. 0xFF\n.TE\nThe rest of this description, when refering to \\[lq]bytes[rq] means byte\nvalues encoded using the above table.\n.br\n.ne 2i\n.SS The Fields\nEach line consists of 5 fields. These are the type field,\nlength field, address field, data field, and the checksum.\n.TS\nallbox,center,tab(;);\nlf(CW) l l l l.\nType;Record Length;Address;Data;Checksum\n.TE\n.TP 8n\nType\nThe type field is a 1 character field that specifies whether\nthe record is data (0x43), or termination (0x47).\n.TP 8n\nRecord Length\nThe record length field is a 1 byte field that specifies the\nnumber of bytes in the record, excluding the type and\nrecord length fields.\n.TP 8n\nAddress\nThis is a 4\\[hy]byte address that specifies where the data\nis to be loaded into memory.\n.TP 8n\nData\nThe data field contains the executable code, memory\\[hy]loadable data\nor descriptive information to be transferred.\n.TP 8n\nChecksum\nThe checksum is an 1\\[hy]byte field that represents the least significant\nbyte of the one's complement of the sum of the values represented by\nthe bytes making up the length, address, and data fields.\n.br\n.ne 2i\n.SS Record Types\n.TP 8n\n0x43 (#)\nA record containing data and the 4\\[hy]byte address at which the data is\nto reside.\n.TP 8n\n0x47 (')\nA termination record.  The address field may contain the 4\\[hy]byte address\nof the instruction to which control is passed.  There is no data field.\n.SS Size Multiplier\nIn general, binary data will expand in sized by approximately 1.5 times\nwhen represented with this format.\n.\\\" ------------------------------------------------------------------------\n.ds n) srec_cat\n.so man/man1/z_copyright.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/script/test_prelude.sh.in",
    "content": "#\n#       srecord - Manipulate EPROM load files\n#       Copyright (C) 2008, 2010, 2012 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nif [ \"$TEST_SUBJECT\" = \"fill me in\" -o \"$TEST_SUBJECT\" = \"\" ]\nthen\n    echo '    You must set the TEST_SUBJECT environment variable' 1>&2\n    echo '    at the top of your test script to something' 1>&2\n    echo '    descriptive.' 1>&2\n    exit 2\nfi\n\n#\n# Remember where we came from, so that we can refer back to it as necessary.\n#\nhere=$(pwd)\ntest $? -eq 0 || exit 2\narch=${1-.}\nbindir=$here/$arch/bin\n\n#\n# We are going to create a temporary directory for running tests within.\n# This makes it easy to clean up after tests (just rm -r) and it means\n# tests can be run even if the development directory is read only (e.g.\n# for reviewers).\n#\ntestdir=/tmp/srecord-$$\n\n#\n# The tear_down function is used by all the ways of leaving a test\n# script, so that they all clean up in exactly the same way.\n#\ntear_down()\n{\n    set +x\n    cd $here\n    rm -rf $testdir\n}\n\n#\n# The pass function (command) is used to declare a test to have passed,\n# and exit.  The exit code of 0 is dictated by Aegis, so Aegis can know\n# the result of running the test.\n#\n# Note that we don't say what was being tested, because only failed\n# tests are interesting, especially when your project get to the point\n# of having hundreds of tests.\n#\npass()\n{\n    tear_down\n    echo PASSED\n    exit 0\n}\n\n#\n# The fail function (command) is used to declare a test to have failed,\n# and exit.  The exit code of 1 is dictated by Aegis, so Aegis can know\n# the result of running the test.\n#\nfail()\n{\n    tear_down\n    echo \"FAILED test of $TEST_SUBJECT\"\n    exit 1\n}\n\n#\n# The no_result function (command) is used to declare a test to have\n# failed in an unexpected way, and exit.  This is used for any case\n# where the \"scaffolding\" of a test does no succeed, effectively making\n# the correctedness of the functionality being tested indeterminate.\n# The exit code of 2 is dictated by Aegis, so Aegis can know the result\n# of running the test.\n#\nno_result()\n{\n    tear_down\n    echo \"NO RESULT for test of $TEST_SUBJECT\"\n    exit 1\n}\n\n#\n# Create our testing directory and cd into it.\n#\nmkdir $testdir\ntest $? -eq 0 || exit 2\ncd $testdir\ntest $? -eq 0 || no_result\n\n# On cygwin, we need to have diff ignore the CR in CRLF sequences\n# otherwise we see diff output which looks to be identical but which\n# diff things differs.  And it does, by a carriage return.\nif diff --strip-trailing-cr /dev/null /dev/null > /dev/null 2>&1\nthen\n    diffpath=`which diff`\n    diff() {\n        $diffpath --strip-trailing-cr \"$@\"\n    }\nfi\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srec_cat/arglex3.cc",
    "content": "//\n//      srecord - manipulate eprom load files\n//      Copyright (C) 2000-2008, 2010, 2013 Peter Miller\n//\n//      This program is free software; you can redistribute it and/or modify\n//      it under the terms of the GNU General Public License as published by\n//      the Free Software Foundation; either version 3 of the License, or\n//      (at your option) any later version.\n//\n//      This program is distributed in the hope that it will be useful,\n//      but WITHOUT ANY WARRANTY; without even the implied warranty of\n//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//      GNU General Public License for more details.\n//\n//      You should have received a copy of the GNU General Public License\n//      along with this program. If not, see\n//      <http://www.gnu.org/licenses/>.\n//\n\n#include <srec_cat/arglex3.h>\n\n\nsrec_cat_arglex3::srec_cat_arglex3(int argc, char **argv) :\n    arglex_tool(argc, argv)\n{\n    static const table_ty table[] =\n    {\n        { \"-Address_Length\", token_address_length, },\n        { \"-Carriage_Return_Life_Feed\", token_crlf, },\n        { \"-Data_Only\", token_data_only, },\n        { \"-DISable\", token_disable, },\n        { \"-ENable\", token_enable, },\n        { \"-Execution_Start_Address\", token_execution_start_address, },\n        { \"-GOTO\", token_execution_start_address, },\n        { \"-HEAder\", token_header, },\n        { \"-Line_LENGth\", token_line_length, },\n        { \"-Line_Termination\", token_line_termination, },\n        { \"-End_Of_Line\", token_line_termination, },\n        { \"-Output_Block_Size\", token_output_block_size, },\n        { \"-Output_Block_Packing\", token_output_block_packing, },\n        { \"-Output_Block_Alignment\", token_output_block_align, },\n\n        //\n        // This option is intentionally undocumented.  It is preserved\n        // for backwards compatibility.\n        //\n        { \"-Start_Address\", token_execution_start_address, },\n\n        SRECORD_ARGLEX_END_MARKER\n    };\n\n    table_set(table);\n}\n\n\nsrec_cat_arglex3::~srec_cat_arglex3()\n{\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srec_cat/arglex3.h",
    "content": "//\n//      srecord - manipulate eprom load files\n//      Copyright (C) 2000-2008, 2010, 2014 Peter Miller\n//\n//      This program is free software; you can redistribute it and/or modify\n//      it under the terms of the GNU General Public License as published by\n//      the Free Software Foundation; either version 3 of the License, or\n//      (at your option) any later version.\n//\n//      This program is distributed in the hope that it will be useful,\n//      but WITHOUT ANY WARRANTY; without even the implied warranty of\n//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//      GNU General Public License for more details.\n//\n//      You should have received a copy of the GNU General Public License\n//      along with this program. If not, see\n//      <http://www.gnu.org/licenses/>.\n//\n\n#ifndef PROG_SREC_CAT_ARGLEX3_H\n#define PROG_SREC_CAT_ARGLEX3_H\n\n#include <srecord/arglex/tool.h>\n\nclass srec_cat_arglex3:\n    public srecord::arglex_tool\n{\npublic:\n    enum\n    {\n        token_line_length = srecord::arglex_tool::token_MAX,\n        token_address_length,\n        token_crlf,\n        token_data_only,\n        token_header,\n        token_execution_start_address,\n        token_enable,\n        token_disable,\n        token_line_termination,\n        token_output_block_size,\n        token_output_block_packing,\n        token_output_block_align,\n        token_MAX\n    };\n\n    /**\n      * The destructor.\n      */\n    virtual ~srec_cat_arglex3();\n\n    /**\n      * The constructor.\n      */\n    srec_cat_arglex3(int, char **);\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    srec_cat_arglex3();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    srec_cat_arglex3(const srec_cat_arglex3 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    srec_cat_arglex3 &operator=(const srec_cat_arglex3 &);\n};\n\n#endif // PROG_SREC_CAT_ARGLEX3_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srec_cat/main.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2008, 2010, 2013, 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <iostream>\n#include <cstdlib>\n\n#include <srecord/input/catenate.h>\n#include <srecord/input/file.h>\n#include <srecord/memory.h>\n#include <srecord/memory/walker/writer.h>\n#include <srecord/output.h>\n#include <srecord/output/file.h>\n#include <srecord/output/filter/reblock.h>\n#include <srecord/record.h>\n#include <srecord/string.h>\n\n#include <srec_cat/arglex3.h>\n\n\nint\nmain(int argc, char **argv)\n{\n    srec_cat_arglex3 cmdline(argc, argv);\n    cmdline.token_first();\n    srecord::input::pointer infile;\n    srecord::output::pointer outfile;\n    int line_length = 0;\n    int address_length = 0;\n    std::string header;\n    bool header_set = false;\n    unsigned long execution_start_address = 0;\n    bool execution_start_address_set = false;\n    int output_block_size = 0;\n    bool output_block_packing = false;\n    bool output_block_align = false;\n    while (cmdline.token_cur() != srecord::arglex::token_eoln)\n    {\n        switch (cmdline.token_cur())\n        {\n        default:\n            cmdline.default_command_line_processing();\n            continue;\n\n        case srecord::arglex_tool::token_paren_begin:\n        case srecord::arglex_tool::token_string:\n        case srecord::arglex_tool::token_stdio:\n        case srecord::arglex_tool::token_generator:\n            {\n                srecord::input::pointer ip = cmdline.get_input();\n                if (infile)\n                    infile = srecord::input_catenate::create(infile, ip);\n                else\n                    infile = ip;\n            }\n            continue;\n\n        case srecord::arglex_tool::token_output:\n            if (outfile)\n                cmdline.usage();\n            outfile = cmdline.get_output();\n            continue;\n\n        case srec_cat_arglex3::token_line_length:\n            if (line_length > 0)\n                cmdline.usage();\n            if (cmdline.token_next() != srecord::arglex::token_number)\n                cmdline.usage();\n            line_length = cmdline.value_number();\n            if (line_length <= 0)\n            {\n                std::cerr << \"the line length \" << line_length << \" is invalid\"\n                    << std::endl;\n                exit(EXIT_FAILURE);\n            }\n            break;\n\n        case srec_cat_arglex3::token_output_block_size:\n            if (output_block_size > 0)\n                cmdline.usage();\n            if (cmdline.token_next() != srecord::arglex::token_number)\n                cmdline.usage();\n            output_block_size = cmdline.value_number();\n            if\n            (\n                output_block_size <= 0\n            ||\n                output_block_size > srecord::record::max_data_length\n            )\n            {\n                std::cerr << \"the block size \" << output_block_size\n                    << \" is invalid\" << std::endl;\n                exit(EXIT_FAILURE);\n            }\n            break;\n\n        case srec_cat_arglex3::token_address_length:\n            if (address_length > 0)\n                cmdline.usage();\n            if (cmdline.token_next() != srecord::arglex::token_number)\n                cmdline.usage();\n            address_length = cmdline.value_number();\n            if (address_length <= 0 || address_length > (int)sizeof(long))\n            {\n                std::cerr << \"the address length \" << address_length\n                    << \" is invalid\" << std::endl;\n                exit(EXIT_FAILURE);\n            }\n            break;\n\n        case srec_cat_arglex3::token_data_only:\n            srecord::output_file::enable_header(false);\n            srecord::output_file::enable_data_count(false);\n            srecord::output_file::enable_goto_addr(false);\n            srecord::output_file::enable_footer(false);\n            break;\n\n        case srec_cat_arglex3::token_enable:\n        case srec_cat_arglex3::token_disable:\n            {\n                int tok = cmdline.token_cur();\n                bool yesno = (tok == srec_cat_arglex3::token_enable);\n                cmdline.token_next();\n                std::string name = cmdline.get_string(cmdline.token_name(tok));\n                if (!srecord::output_file::enable_by_name(name, yesno))\n                {\n                    std::cerr << \"argument of \" << cmdline.token_name(tok)\n                        << \"=\" << name << \" unknown\" << std::endl;\n                    cmdline.usage();\n                }\n            }\n            continue;\n\n        case srec_cat_arglex3::token_crlf:\n            srecord::output_file::line_termination_by_name(\"crlf\");\n            break;\n\n        case srec_cat_arglex3::token_line_termination:\n            {\n                int tok = cmdline.token_cur();\n                cmdline.token_next();\n                std::string name = cmdline.get_string(cmdline.token_name(tok));\n                if (!srecord::output_file::line_termination_by_name(name))\n                {\n                    std::cerr << \"line termination \\\"\" << name << \"\\\" unknown\"\n                        << std::endl;\n                    cmdline.usage();\n                }\n            }\n            continue;\n\n        case srec_cat_arglex3::token_header:\n            if (cmdline.token_next() != srecord::arglex::token_string)\n            {\n                std::cerr << \"the -header option requires a string argument\"\n                    << std::endl;\n                exit(EXIT_FAILURE);\n            }\n            header = cmdline.value_string();\n            header_set = true;\n\n            //\n            // The users may use %nn on the command line, but we store\n            // a byte 0xnn in the header.  The motivation or this a use\n            // case that wanted to insert a trailing NUL character.\n            //\n            header = srecord::string_url_decode(header);\n\n            srecord::output_file::enable_header(true);\n            break;\n\n        case srec_cat_arglex3::token_execution_start_address:\n            if (execution_start_address_set)\n            {\n                std::cerr << \"too many -execution-start-address options \"\n                    \"specified\" << std::endl;\n                exit(EXIT_FAILURE);\n            }\n            cmdline.token_next();\n            execution_start_address =\n                cmdline.get_number(\"-Execution_Start_Address\");\n            execution_start_address_set = true;\n            srecord::output_file::enable_goto_addr(true);\n            continue;\n\n        case srec_cat_arglex3::token_output_block_packing:\n            output_block_packing = true;\n            break;\n\n        case srec_cat_arglex3::token_output_block_align:\n            output_block_align = true;\n            break;\n        }\n        cmdline.token_next();\n    }\n    if (!infile)\n        infile = cmdline.get_input();\n    if (!outfile)\n        outfile = cmdline.get_output();\n\n    if (output_block_packing || output_block_align)\n    {\n        //\n        // Reblock the output so that it matches the output file's block\n        // size exactly.  That way SRecord's internal memory chunk size\n        // does not cause output artifacts.  This requires lost of\n        // memory copying back and forth, so only do it if they asked\n        // for it.\n        //\n        // This filter makes no semantic difference to the output.\n        // (If it does, it's a bug.)\n        //\n        outfile =\n            srecord::output_filter_reblock::create(outfile, output_block_align);\n    }\n\n    if (address_length > 0)\n        outfile->address_length_set(address_length);\n    if (line_length > 0)\n        outfile->line_length_set(line_length);\n    if (output_block_size > 0)\n    {\n        if (!outfile->preferred_block_size_set(output_block_size))\n        {\n            std::cerr << \"output block size \" << output_block_size\n                << \" was rejected by \" << outfile->format_name() << std::endl;\n            exit(EXIT_FAILURE);\n        }\n    }\n\n    //\n    // Read the input into memory.  This allows the data to be\n    // consolidated on output, and warnings to be issued for\n    // duplicates.\n    //\n    // It is assumed the data will all fit into memory.  This is\n    // usually reasonable, because these utilities are used for\n    // EPROMs which are usually smaller than the available virtual\n    // memory of the development system.\n    //\n    srecord::memory m;\n    if (header_set)\n    {\n        // Only the first header is used, even if you have N input\n        // files.  Being set before reading any of the input files, the\n        // command line takes precedence.\n        m.set_header(header);\n    }\n    m.reader\n    (\n        infile,\n        cmdline.get_redundant_bytes(),\n        cmdline.get_contradictory_bytes()\n    );\n    if (execution_start_address_set)\n        m.set_execution_start_address(execution_start_address);\n\n    //\n    // Write the remembered data out to the output.\n    //\n    srecord::memory_walker::pointer w =\n        srecord::memory_walker_writer::create(outfile);\n    m.walk(w);\n\n    //\n    // success\n    //\n    return EXIT_SUCCESS;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srec_cmp/main.cc",
    "content": "//\n//      srecord - manipulate eprom load files\n//      Copyright (C) 1998-2003, 2005-2008, 2010, 2014 Peter Miller\n//\n//      This program is free software; you can redistribute it and/or modify\n//      it under the terms of the GNU General Public License as published by\n//      the Free Software Foundation; either version 3 of the License, or\n//      (at your option) any later version.\n//\n//      This program is distributed in the hope that it will be useful,\n//      but WITHOUT ANY WARRANTY; without even the implied warranty of\n//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//      GNU General Public License for more details.\n//\n//      You should have received a copy of the GNU General Public License\n//      along with this program. If not, see\n//      <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file.h>\n#include <srecord/memory.h>\n#include <srecord/record.h>\n\n#include <iostream>\n#include <cstdlib>\n#include <vector>\n\n\nstatic bool\nexecution_start_addresses_differ(srecord::record *rp1, srecord::record *rp2)\n{\n    return (rp1 && rp2 && rp1->get_address() != rp2->get_address());\n}\n\n\nint\nmain(int argc, char **argv)\n{\n    srecord::arglex_tool cmdline(argc, argv);\n    cmdline.usage_tail_set(\"<file1> <file2>\");\n    cmdline.token_first();\n    srecord::input::pointer if1;\n    srecord::input::pointer if2;\n    bool verbose = false;\n    while (cmdline.token_cur() != srecord::arglex_tool::token_eoln)\n    {\n        switch (cmdline.token_cur())\n        {\n        default:\n            cmdline.default_command_line_processing();\n            continue;\n\n        case srecord::arglex_tool::token_paren_begin:\n        case srecord::arglex_tool::token_string:\n        case srecord::arglex_tool::token_stdio:\n        case srecord::arglex_tool::token_generator:\n            if (!if1)\n                if1 = cmdline.get_input();\n            else if (!if2)\n                if2 = cmdline.get_input();\n            else\n            {\n                std::cerr << argv[0] << \": too many input files specified\"\n                    << std::endl;\n                cmdline.usage();\n            }\n            continue;\n\n        case srecord::arglex::token_verbose:\n            verbose = true;\n            break;\n        }\n        cmdline.token_next();\n    }\n    if (!if1 || !if2)\n    {\n        std::cerr << argv[0] << \": two input files required\" << std::endl;\n        cmdline.usage();\n    }\n\n    //\n    // Read the first file into memory.\n    //\n    srecord::memory m1;\n    m1.reader\n    (\n        if1,\n        cmdline.get_redundant_bytes(),\n        cmdline.get_contradictory_bytes()\n    );\n\n    //\n    // Read the second file into memory.\n    //\n    srecord::memory m2;\n    m2.reader\n    (\n        if2,\n        cmdline.get_redundant_bytes(),\n        cmdline.get_contradictory_bytes()\n    );\n\n    //\n    // Error message and non-zero exit status if the files differ.\n    //\n    if (verbose)\n    {\n        bool different = srecord::memory::compare(m1, m2);\n        if\n        (\n            execution_start_addresses_differ\n            (\n                m1.get_execution_start_address(),\n                m2.get_execution_start_address()\n            )\n        )\n        {\n            std::cout << std::hex << \"Execution start address \"\n                << m1.get_execution_start_address()->get_address()\n                << \" not equal to \"\n                << m2.get_execution_start_address()->get_address()\n                << \".\" << std::dec << std::endl;\n            different = true;\n        }\n        if (different)\n            exit(2);\n        std::cerr << argv[0] << \": files \\\"\" << if1->filename() << \"\\\" and \\\"\"\n            << if2->filename() << \"\\\" are the same.\" << std::endl;\n    }\n    else\n    {\n        if\n        (\n            m1 != m2\n        ||\n            execution_start_addresses_differ\n            (\n                m1.get_execution_start_address(),\n                m2.get_execution_start_address()\n            )\n        )\n        {\n            std::cerr << argv[0] << \": files \\\"\" << if1->filename()\n                << \"\\\" and \\\"\" << if2->filename() << \"\\\" differ\" << std::endl;\n            exit(2);\n        }\n    }\n\n    //\n    // success\n    //\n    return 0;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srec_info/main.cc",
    "content": "//\n//      srecord - manipulate eprom load files\n//      Copyright (C) 1998-2002, 2005-2010, 2013, 2014 Peter Miller\n//\n//      This program is free software; you can redistribute it and/or modify\n//      it under the terms of the GNU General Public License as published by\n//      the Free Software Foundation; either version 3 of the License, or\n//      (at your option) any later version.\n//\n//      This program is distributed in the hope that it will be useful,\n//      but WITHOUT ANY WARRANTY; without even the implied warranty of\n//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//      GNU General Public License for more details.\n//\n//      You should have received a copy of the GNU General Public License\n//      along with this program. If not, see\n//      <http://www.gnu.org/licenses/>.\n//\n\n#include <iostream>\n#include <cstdlib>\n#include <cstdio>\n#include <vector>\n\n#include <srecord/interval.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file.h>\n#include <srecord/memory.h>\n#include <srecord/record.h>\n#include <srecord/string.h>\n\n\nint\nmain(int argc, char **argv)\n{\n    srecord::arglex_tool cmdline(argc, argv);\n    cmdline.token_first();\n    typedef std::vector<srecord::input::pointer> infile_t;\n    infile_t infile;\n    while (cmdline.token_cur() != srecord::arglex::token_eoln)\n    {\n        switch (cmdline.token_cur())\n        {\n        default:\n            cmdline.default_command_line_processing();\n            continue;\n\n        case srecord::arglex_tool::token_paren_begin:\n        case srecord::arglex_tool::token_string:\n        case srecord::arglex_tool::token_stdio:\n        case srecord::arglex_tool::token_generator:\n            infile.push_back(cmdline.get_input());\n            continue;\n        }\n        cmdline.token_next();\n    }\n    if (infile.size() == 0)\n        infile.push_back(cmdline.get_input());\n\n    //\n    // Read each file and emit informative gumph.\n    //\n    for (infile_t::iterator it = infile.begin(); it != infile.end(); ++it)\n    {\n        srecord::input::pointer ifp = *it;\n        if (infile.size() > 1)\n        {\n            std::cout << std::endl;\n            std::cout << ifp->filename() << \":\" << std::endl;\n        }\n        std::cout << \"Format: \"\n            << srecord::string_url_encode(ifp->get_file_format_name())\n            << std::endl;\n        srecord::record record;\n        srecord::interval range;\n        while (ifp->read(record))\n        {\n            switch (record.get_type())\n            {\n            case srecord::record::type_header:\n                {\n                    if (record.get_length() < 1)\n                        break;\n                    std::cout << \"Header: \";\n                    std::string s(\n                        (const char *)record.get_data(),\n                        record.get_length()\n                    );\n                    s = srecord::string_quote_c(s);\n                    std::cout << s << '\\n';\n                }\n                break;\n\n            case srecord::record::type_data:\n                range +=\n                    srecord::interval\n                    (\n                        record.get_address(),\n                        record.get_address() + record.get_length()\n                    );\n                break;\n\n            case srecord::record::type_execution_start_address:\n                {\n                    std::cout << \"Execution Start Address: \";\n                    unsigned long addr = record.get_address();\n                    char buf[16];\n                    snprintf(buf, sizeof(buf), \"%08lX\", addr);\n                    std::cout << buf << std::endl;\n                }\n                break;\n\n            default:\n                // ignored\n                break;\n            }\n        }\n        if (range.empty())\n        {\n            std::cout << \"Data:   none\" << std::endl;\n            continue;\n        }\n        int prec = 4;\n        if (range.get_highest() > (1L << 24))\n            prec = 8;\n        else if (range.get_highest() > (1L << 16))\n            prec = 6;\n        bool first_line = true;\n        for (;;)\n        {\n            srecord::interval tmp = range;\n            tmp.first_interval_only();\n            if (first_line)\n            {\n                std::cout << \"Data:   \";\n                first_line = false;\n            }\n            else\n                std::cout << \"        \";\n            char buf[32];\n            unsigned long lo = tmp.get_lowest();\n            snprintf(buf, sizeof(buf), \"%0*lX\", prec, lo);\n            std::cout << buf << \" - \";\n            unsigned long hi = tmp.get_highest() - 1;\n            snprintf(buf, sizeof(buf), \"%0*lX\", prec, hi);\n            std::cout << buf << std::endl;\n            range -= tmp;\n            if (range.empty())\n                break;\n        }\n    }\n\n    //\n    // success\n    //\n    return EXIT_SUCCESS;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/adler16.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/adler16.h>\n\n\nsrecord::adler16::~adler16()\n{\n}\n\n\nsrecord::adler16::adler16() :\n    sum_a(1),\n    sum_b(0)\n{\n}\n\n\nsrecord::adler16::adler16(const adler16 &rhs) :\n    sum_a(rhs.sum_a),\n    sum_b(rhs.sum_b)\n{\n}\n\n\nsrecord::adler16 &\nsrecord::adler16::operator=(const adler16 &rhs)\n{\n    if (this != &rhs)\n    {\n        sum_a = rhs.sum_a;\n        sum_b = rhs.sum_b;\n    }\n    return *this;\n}\n\n\nunsigned short\nsrecord::adler16::get()\n    const\n{\n    return ((((unsigned short)sum_b) << 8) | sum_a);\n}\n\n\nvoid\nsrecord::adler16::next(unsigned char c)\n{\n    // This is not portable to int=16-bit machines\n    sum_a = (sum_a + c) % 251;\n    sum_b = (sum_b + sum_a) % 251;\n}\n\n\nvoid\nsrecord::adler16::nextbuf(const void *data, size_t nbytes)\n{\n    const unsigned char *dp = (const unsigned char *)data;\n    while (nbytes > 0)\n    {\n        next(*dp);\n        ++dp;\n        --nbytes;\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/adler16.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_ADLER16_H\n#define SRECORD_ADLER16_H\n\n#include <cstddef>\n\nnamespace srecord\n{\n\n/**\n  * The adler16 class is used to represent the running value of a 16-bit\n  * Adler checksum of series of bytes.  (Using an algorith analogous to\n  * Adler-32, but using mod 251 instead of 65521).\n  */\nclass adler16\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~adler16();\n\n    /**\n      * The default constructor.\n      */\n    adler16();\n\n    /**\n      * The copy constructor.\n      */\n    adler16(const adler16 &);\n\n    /**\n      * The assignment operator.\n      */\n    adler16 &operator=(const adler16 &);\n\n    /**\n      * The get method is used to obtain the running value of the checksum.\n      */\n    unsigned short get() const;\n\n    /**\n      * The next method is used to advance the state by one byte.\n      */\n    void next(unsigned char);\n\n    /**\n      * The nextbuf method is used to advance the state by a series of bytes.\n      */\n    void nextbuf(const void *, size_t);\n\nprivate:\n    /**\n      * The sum_a instance variable is used to remember the sum of bytes\n      * scanned.\n      */\n    unsigned char sum_a;\n\n    /**\n      * The sum_b instance variable is used to remember the sum of the\n      * sum of bytes scanned.\n      */\n    unsigned char sum_b;\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_ADLER16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/adler32.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/adler32.h>\n\n\nsrecord::adler32::~adler32()\n{\n}\n\n\nsrecord::adler32::adler32() :\n    sum_a(1),\n    sum_b(0)\n{\n}\n\n\nsrecord::adler32::adler32(const adler32 &rhs) :\n    sum_a(rhs.sum_a),\n    sum_b(rhs.sum_b)\n{\n}\n\n\nsrecord::adler32 &\nsrecord::adler32::operator=(const adler32 &rhs)\n{\n    if (this != &rhs)\n    {\n        sum_a = rhs.sum_a;\n        sum_b = rhs.sum_b;\n    }\n    return *this;\n}\n\n\nunsigned long\nsrecord::adler32::get()\n    const\n{\n    return ((((unsigned long)sum_b) << 16) | sum_a);\n}\n\n\nvoid\nsrecord::adler32::next(unsigned char c)\n{\n    // This is not portable to int=16-bit machines\n    sum_a = (sum_a + c) % 65521;\n    sum_b = (sum_b + sum_a) % 65521;\n}\n\n\nvoid\nsrecord::adler32::nextbuf(const void *data, size_t nbytes)\n{\n    const unsigned char *dp = (const unsigned char *)data;\n    while (nbytes > 0)\n    {\n        next(*dp);\n        ++dp;\n        --nbytes;\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/adler32.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_ADLER32_H\n#define SRECORD_ADLER32_H\n\n#include <cstddef>\n\nnamespace srecord\n{\n\n/**\n  * The adler32 class is used to represent the running value of a 32-bit\n  * Adler checksum of series of bytes.\n  *\n  * See wikipedia for a description\n  * http://en.wikipedia.org/wiki/Adler-32\n  */\nclass adler32\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~adler32();\n\n    /**\n      * The default constructor.\n      */\n    adler32();\n\n    /**\n      * The copy constructor.\n      */\n    adler32(const adler32 &);\n\n    /**\n      * The assignment operator.\n      */\n    adler32 &operator=(const adler32 &);\n\n    /**\n      * The get method is used to obtain the running value of the\n      * checksum.\n      */\n    unsigned long get() const;\n\n    /**\n      * The next method is used to advance the state by one byte.\n      */\n    void next(unsigned char);\n\n    /**\n      * The nextbuf method is used to advance the state by a series of bytes.\n      */\n    void nextbuf(const void *, size_t);\n\nprivate:\n    /**\n      * The sum_a instance variable is used to remember the sum of bytes\n      * scanned.\n      */\n    unsigned short sum_a;\n\n    /**\n      * The sum_b instance variable is used to remember the sum of the\n      * sum of bytes scanned.\n      */\n    unsigned short sum_b;\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_ADLER32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/abbreviate.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex.h>\n\n\nstd::string\nsrecord::arglex::abbreviate(const char *s)\n{\n    std::string result;\n    for (;;)\n    {\n        unsigned char c = *s++;\n        switch (c)\n        {\n        case '\\0':\n            return result;\n\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':\n        case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':\n        case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':\n        case 'v': case 'w': case 'x': case 'y': case 'z': case '_':\n            break;\n\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':\n        case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':\n        case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':\n        case 'V': case 'W': case 'X': case 'Y': case 'Z':\n            c = tolower(c);\n            result += c;\n            break;\n\n        default:\n            result += c;\n            break;\n        }\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/test_ambiguous.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstdlib>\n\n#include <srecord/arglex.h>\n\n\nvoid\nsrecord::arglex::test_ambiguous(void)\n    const\n{\n    int number_of_errors = 0;\n    for\n    (\n        table_ptr_vec_t::const_iterator it1 = tables.begin();\n        it1 != tables.end();\n        ++it1\n    )\n    {\n        for (const table_ty *tp1 = *it1; tp1->name; ++tp1)\n        {\n            std::string abbrev = abbreviate(tp1->name);\n\n            for\n            (\n                table_ptr_vec_t::const_iterator it2 = tables.begin();\n                it2 != tables.end();\n                ++it2\n            )\n            {\n                for (const table_ty *tp2 = *it2; tp2->name; ++tp2)\n                {\n                    if\n                    (\n                        tp1->token != tp2->token\n                    &&\n                        compare(tp2->name, abbrev.c_str())\n                    )\n                    {\n                        fprintf\n                        (\n                            stderr,\n                            \"option %s is ambiguous (%s vs %s)\\n\",\n                            abbrev.c_str(),\n                            tp1->name,\n                            tp2->name\n                        );\n                        ++number_of_errors;\n                    }\n                }\n            }\n        }\n    }\n    if (number_of_errors > 0)\n    {\n        fprintf\n        (\n            stderr,\n            \"found %d fatal error%s\\n\",\n            number_of_errors,\n            (number_of_errors == 1 ? \"\" : \"s\")\n        );\n        exit(1);\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool/get_interval.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <climits>\n\n#include <srecord/interval.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/input.h>\n#include <srecord/input/interval.h>\n\n\nsrecord::interval\nsrecord::arglex_tool::get_interval_factor(const char *name)\n{\n    switch (token_cur())\n    {\n    case token_paren_begin:\n        {\n            token_next();\n            interval retval = get_interval(name);\n            if (token_cur() != token_paren_end)\n            {\n                fatal_error\n                (\n                    \"closing parentheses expected before %s\",\n                    token_name(token_cur())\n                );\n                // NOTREACHED\n            }\n            token_next();\n            return retval;\n        }\n\n    default:\n        {\n            if (!can_get_number())\n            {\n                fatal_error\n                (\n                    \"the %s range requires two numeric arguments\",\n                    name\n                );\n                // NOTREACHED\n            }\n            unsigned long n1 = get_number(\"address range minimum\");\n            unsigned long n2 = 0;\n            if (can_get_number())\n            {\n                n2 = get_number(\"address range maximum\");\n            }\n            if (n2 && n1 >= n2)\n            {\n                fatal_error\n                (\n                    \"the %s range %lu..%lu is invalid\",\n                    name,\n                    n1,\n                    n2\n                );\n                // NOTREACHED\n            }\n            interval result(n1, n2);\n            return result;\n        }\n\n    case token_within:\n        {\n            token_next();\n            srecord::input::pointer ifp = get_input();\n            interval result = srecord::input_interval(ifp);\n            return result;\n        }\n\n    case token_over:\n        {\n            token_next();\n            srecord::input::pointer ifp = get_input();\n            interval result = srecord::input_interval(ifp);\n            return result.flatten();\n        }\n    }\n}\n\n\nsrecord::interval\nsrecord::arglex_tool::get_interval_term(const char *name)\n{\n    interval result = get_interval_factor(name);\n    for (;;)\n    {\n        switch (token_cur())\n        {\n        case token_intersection:\n            {\n                token_next();\n                result *= get_interval_factor(name);\n            }\n            break;\n\n        default:\n            return result;\n        }\n    }\n}\n\n\nsrecord::interval\nsrecord::arglex_tool::get_interval(const char *name)\n{\n    interval result = get_interval_term(name);\n    for (;;)\n    {\n        switch (token_cur())\n        {\n        case token_number:\n        case token_within:\n        case token_over:\n        case token_paren_begin:\n            result += get_interval_term(name);\n            continue;\n\n        case token_union:\n            token_next();\n            result += get_interval_term(name);\n            continue;\n\n        case token_minus:\n            token_next();\n            result -= get_interval_term(name);\n            continue;\n\n        case token_range_padding:\n            {\n                token_next();\n\n                //\n                // Collect the multiple from the command line.\n                //\n                long mult = get_number(\"--range-padding\", 2, USHRT_MAX);\n\n                //\n                // Pad the range so that is contains whole multiples, aligned.\n                //\n                result = result.pad(mult);\n            }\n            break;\n\n        default:\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool/get_interval_small.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n#include <srecord/pretty_size.h>\n#include <srecord/arglex/tool.h>\n\n\nsrecord::interval\nsrecord::arglex_tool::get_interval_small(const char *caption)\n{\n    interval result = get_interval(caption);\n    bool big_range_ok = false;\n    if (token_cur() == token_big)\n    {\n        big_range_ok = true;\n        token_next();\n    }\n    if (!big_range_ok)\n    {\n        long long c = result.coverage();\n        if (c > (1LL << 30))\n        {\n            fatal_error\n            (\n                \"the %s range %s is %sB and is probably larger than you \"\n                    \"intended (use --big to override this error message)\",\n                caption,\n                result.representation().c_str(),\n                pretty_size(c).c_str()\n            );\n        }\n    }\n    return result;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool/get_number.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/input.h>\n#include <srecord/input/interval.h>\n\n\nunsigned long\nsrecord::arglex_tool::get_number(const char *caption)\n{\n    unsigned long value = 0;\n    unsigned long multiple;\n    interval over;\n\n    switch (token_cur())\n    {\n    case token_paren_begin:\n        token_next();\n        value = get_number(caption);\n        if (token_cur() != token_paren_end)\n        {\n            fatal_error\n            (\n                \"closing parenthesis expected before %s\",\n                token_name(token_cur())\n            );\n            // NOTREACHED\n        }\n        token_next();\n        return value;\n\n    case token_number:\n        value = value_number();\n        token_next();\n        return value;\n\n    case token_minimum_address:\n        {\n            token_next();\n            input::pointer ifp = get_input();\n            over = input_interval(ifp);\n            value = over.get_lowest();\n        }\n        break;\n\n    case token_maximum_address:\n        {\n            token_next();\n            input::pointer ifp = get_input();\n            over = input_interval(ifp);\n            value = over.get_highest();\n        }\n        break;\n\n    case token_length:\n        {\n            token_next();\n            input::pointer ifp = get_input();\n            over = input_interval(ifp);\n            value = (over.get_highest() - over.get_lowest());\n        }\n        break;\n\n    case token_stdio:\n        token_next();\n        value = -get_number(caption);\n        break;\n\n    default:\n        fatal_error\n        (\n            \"number expected for %s before %s\",\n            caption,\n            token_name(token_cur())\n        );\n        // NOTREACHED\n    }\n    switch (token_cur())\n    {\n    case token_round_down:\n        token_next();\n        multiple = get_number(\"-round-down\");\n        value /= multiple;\n        value *= multiple;\n        break;\n\n    case token_round_up:\n        token_next();\n        multiple = get_number(\"-round-up\");\n        value = (value + multiple - 1) / multiple;\n        value *= multiple;\n        break;\n\n    case token_round_nearest:\n        token_next();\n        multiple = get_number(\"-round-nearest\");\n        value = (value + multiple / 2) / multiple;\n        value *= multiple;\n        break;\n    }\n    return value;\n}\n\n\nunsigned long\nsrecord::arglex_tool::get_number(const char *caption, long minimum,\n    long maximum)\n{\n    long value = get_number(caption);\n    if (value < minimum || value > maximum)\n    {\n        fatal_error\n        (\n            \"%s value %ld out of range (%ld, %ld)\",\n            caption,\n            value,\n            minimum,\n            maximum\n        );\n        // NOTREACHED\n    }\n    return value;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool/get_string.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n\n\nstd::string\nsrecord::arglex_tool::get_string(const char *caption)\n{\n    switch (token_cur())\n    {\n    case token_string:\n    case token_number:\n        {\n            std::string result = value_string();\n            token_next();\n            return result;\n        }\n\n    default:\n        fatal_error\n        (\n            \"string expected for %s before %s\",\n            caption,\n            token_name(token_cur())\n        );\n        // NOTREACHED\n        return std::string();\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool/input.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <iostream>\n\n#include <srecord/quit.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/input/catenate.h>\n#include <srecord/input/file/aomf.h>\n#include <srecord/input/file/ascii_hex.h>\n#include <srecord/input/file/atmel_generic.h>\n#include <srecord/input/file/binary.h>\n#include <srecord/input/file/brecord.h>\n#include <srecord/input/file/cosmac.h>\n#include <srecord/input/file/dec_binary.h>\n#include <srecord/input/file/emon52.h>\n#include <srecord/input/file/fairchild.h>\n#include <srecord/input/file/fastload.h>\n#include <srecord/input/file/formatted_binary.h>\n#include <srecord/input/file/four_packed_code.h>\n#include <srecord/input/file/hexdump.h>\n#include <srecord/input/file/idt.h>\n#include <srecord/input/file/intel.h>\n#include <srecord/input/file/intel16.h>\n#include <srecord/input/file/logisim.h>\n#include <srecord/input/file/mif.h>\n#include <srecord/input/file/mips_flash.h>\n#include <srecord/input/file/mos_tech.h>\n#include <srecord/input/file/motorola.h>\n#include <srecord/input/file/msbin.h>\n#include <srecord/input/file/needham.h>\n#include <srecord/input/file/os65v.h>\n#include <srecord/input/file/ppb.h>\n#include <srecord/input/file/ppx.h>\n#include <srecord/input/file/signetics.h>\n#include <srecord/input/file/spasm.h>\n#include <srecord/input/file/spectrum.h>\n#include <srecord/input/file/stewie.h>\n#include <srecord/input/file/tektronix.h>\n#include <srecord/input/file/tektronix_extended.h>\n#include <srecord/input/file/ti_tagged.h>\n#include <srecord/input/file/ti_tagged_16.h>\n#include <srecord/input/file/ti_txt.h>\n#include <srecord/input/file/trs80.h>\n#include <srecord/input/file/vmem.h>\n#include <srecord/input/file/wilson.h>\n#include <srecord/input/filter/and.h>\n#include <srecord/input/filter/bitrev.h>\n#include <srecord/input/filter/byte_swap.h>\n#include <srecord/input/filter/checksum/bitnot.h>\n#include <srecord/input/filter/checksum/negative.h>\n#include <srecord/input/filter/checksum/positive.h>\n#include <srecord/input/filter/crop.h>\n#include <srecord/input/filter/fill.h>\n#include <srecord/input/filter/interval/length.h>\n#include <srecord/input/filter/interval/maximum.h>\n#include <srecord/input/filter/interval/minimum.h>\n#include <srecord/input/filter/message/adler16.h>\n#include <srecord/input/filter/message/adler32.h>\n#include <srecord/input/filter/message/crc16.h>\n#include <srecord/input/filter/message/crc32.h>\n#include <srecord/input/filter/message/stm32.h>\n#include <srecord/input/filter/message/fletcher16.h>\n#include <srecord/input/filter/message/fletcher32.h>\n#include <srecord/input/filter/message/gcrypt.h>\n#include <srecord/input/filter/not.h>\n#include <srecord/input/filter/offset.h>\n#include <srecord/input/filter/or.h>\n#include <srecord/input/filter/random_fill.h>\n#include <srecord/input/filter/sequence.h>\n#include <srecord/input/filter/split.h>\n#include <srecord/input/filter/unfill.h>\n#include <srecord/input/filter/unsplit.h>\n#include <srecord/input/filter/xor.h>\n#include <srecord/input/generator.h>\n#include <srecord/input/interval.h>\n\n\nsrecord::endian_t\nsrecord::arglex_tool::get_endian_by_token(int tok)\n    const\n{\n    switch (tok)\n    {\n    case token_adler16_be:\n    case token_adler32_be:\n    case token_atmel_generic_be:\n    case token_checksum_be_bitnot:\n    case token_checksum_be_negative:\n    case token_checksum_be_positive:\n    case token_crc16_be:\n    case token_crc32_be:\n    case token_exclusive_length_be:\n    case token_exclusive_maximum_be:\n    case token_exclusive_minimum_be:\n    case token_fletcher16_be:\n    case token_fletcher32_be:\n    case token_length_be:\n    case token_maximum_be:\n    case token_minimum_be:\n    case token_mips_flash_be:\n    case token_spasm_be:\n    case token_stm32_crc_be:\n        return endian_big;\n\n    case token_adler16_le:\n    case token_adler32_le:\n    case token_atmel_generic_le:\n    case token_checksum_le_bitnot:\n    case token_checksum_le_negative:\n    case token_checksum_le_positive:\n    case token_crc16_le:\n    case token_crc32_le:\n    case token_exclusive_length_le:\n    case token_exclusive_maximum_le:\n    case token_exclusive_minimum_le:\n    case token_fletcher16_le:\n    case token_fletcher32_le:\n    case token_length_le:\n    case token_logisim:     // no way to tell (not documented)\n    case token_maximum_le:\n    case token_minimum_le:\n    case token_msbin:\n    case token_mips_flash_le:\n    case token_spasm_le:\n    case token_stm32_crc_le:\n        return endian_little;\n\n    default:\n        quit_default.fatal_error\n        (\n            \"%s: %d: add %s to switch (bug)\",\n            __FILE__,\n            __LINE__,\n            token_name(tok)\n        );\n        return endian_big;\n    }\n}\n\n\nbool\nsrecord::arglex_tool::get_inclusive_by_token(int tok)\n    const\n{\n    switch (tok)\n    {\n    case token_exclusive_length:\n    case token_exclusive_length_be:\n    case token_exclusive_length_le:\n    case token_exclusive_maximum:\n    case token_exclusive_maximum_be:\n    case token_exclusive_maximum_le:\n    case token_exclusive_minimum:\n    case token_exclusive_minimum_be:\n    case token_exclusive_minimum_le:\n        return false;\n\n    case token_length:\n    case token_length_be:\n    case token_length_le:\n    case token_maximum_be:\n    case token_maximum_le:\n    case token_minimum_be:\n    case token_minimum_le:\n        return true;\n\n    default:\n        quit_default.fatal_error\n        (\n            \"%s: %d: add %s to switch (bug)\",\n            __FILE__,\n            __LINE__,\n            token_name(tok)\n        );\n        return true;\n    }\n}\n\n\nsrecord::input::pointer\nsrecord::arglex_tool::get_simple_input(void)\n{\n    std::string fn = \"-\";\n    switch (token_cur())\n    {\n    case token_paren_begin:\n        {\n            token_next();\n            input::pointer ifp = get_input();\n            for (;;)\n            {\n                switch (token_cur())\n                {\n                case arglex_tool::token_paren_begin:\n                case arglex_tool::token_string:\n                case arglex_tool::token_stdio:\n                case arglex_tool::token_generator:\n                    ifp = input_catenate::create(ifp, get_input());\n                    break;\n\n                case token_paren_end:\n                    token_next();\n                    return ifp;\n\n                default:\n                    fatal_error\n                    (\n                        \"closing parenthesis expected before %s\",\n                        token_name(token_cur())\n                    );\n                    // NOTREACHED\n                }\n            }\n        }\n\n    case token_generator:\n        // Don't need a file name,\n        // but do NOT discard this token, yet.\n        break;\n\n    case token_string:\n        fn = value_string();\n        token_next();\n        break;\n\n    case token_stdio:\n        token_next();\n        // fall through...\n\n    default:\n        if (stdin_used)\n        {\n            fatal_error\n            (\n                \"the standard input may only be named once on the command line\"\n            );\n            // NOTREACHED\n        }\n        stdin_used = true;\n        break;\n    }\n\n    //\n    // determine the file format\n    // and open the input file\n    //\n    input::pointer ifp;\n    switch (token_cur())\n    {\n    case token_motorola:\n        token_next();\n        // fall through...\n\n    default:\n        ifp = input_file_motorola::create(fn);\n        break;\n\n    case token_aomf:\n        token_next();\n        ifp = input_file_aomf::create(fn);\n        break;\n\n    case token_ascii_hex:\n        token_next();\n        ifp = input_file_ascii_hex::create(fn);\n        break;\n\n    case token_atmel_generic_be:\n    case token_atmel_generic_le:\n        {\n            endian_t end = get_endian_by_token();\n            token_next();\n            ifp = input_file_atmel_generic::create(fn, end);\n        }\n        break;\n\n    case token_binary:\n        token_next();\n        ifp = input_file_binary::create(fn);\n        break;\n\n    case token_brecord:\n        token_next();\n        ifp = input_file_brecord::create(fn);\n        break;\n\n    case token_cosmac:\n        token_next();\n        ifp = input_file_cosmac::create(fn);\n        break;\n\n    case token_dec_binary:\n        token_next();\n        ifp = input_file_dec_binary::create(fn);\n        break;\n\n    case token_emon52:\n        token_next();\n        ifp = input_file_emon52::create(fn);\n        break;\n\n    case token_fairchild:\n        token_next();\n        ifp = input_file_fairchild::create(fn);\n        break;\n\n    case token_fast_load:\n        token_next();\n        ifp = input_file_fastload::create(fn);\n        break;\n\n    case token_formatted_binary:\n        token_next();\n        ifp = input_file_formatted_binary::create(fn);\n        break;\n\n    case token_four_packed_code:\n        token_next();\n        ifp = input_file_four_packed_code::create(fn);\n        break;\n\n    case token_generator:\n        token_next();\n        ifp = input_generator::create(this);\n        break;\n\n    case token_guess:\n        token_next();\n        ifp = input_file::guess(fn, *this);\n        break;\n\n    case token_hexdump:\n        token_next();\n        ifp = input_file_hexdump::create(fn);\n        break;\n\n    case token_idt:\n        token_next();\n        ifp = input_file_idt::create(fn);\n        break;\n\n    case token_intel:\n        token_next();\n        ifp = input_file_intel::create(fn);\n        break;\n\n    case token_intel16:\n        token_next();\n        ifp = input_file_intel16::create(fn);\n        break;\n\n    case token_logisim:\n        token_next();\n        ifp = input_file_logisim::create(fn);\n        break;\n\n    case token_memory_initialization_file:\n        token_next();\n        ifp = input_file_mif::create(fn);\n        break;\n\n    case token_mips_flash_be:\n        token_next();\n        ifp = input_file_mips_flash::create_be(fn);\n        break;\n\n    case token_mips_flash_le:\n        token_next();\n        ifp = input_file_mips_flash::create_le(fn);\n        break;\n\n    case token_mos_tech:\n        token_next();\n        ifp = input_file_mos_tech::create(fn);\n        break;\n\n    case token_msbin:\n        token_next();\n        ifp = input_file_msbin::create(fn);\n        break;\n\n    case token_needham_hex:\n        token_next();\n        ifp = input_file_needham::create(fn);\n        break;\n\n    case token_ohio_scientific:\n        token_next();\n        ifp = input_file_os65v::create(fn);\n        break;\n\n    case token_ppx:\n        token_next();\n        ifp = input_file_ppx::create(fn);\n        break;\n\n    case token_ppb:\n        token_next();\n        ifp = input_file_ppb::create(fn);\n        break;\n\n    case token_signetics:\n        token_next();\n        ifp = input_file_signetics::create(fn);\n        break;\n\n    case token_spasm_be:\n    case token_spasm_le:\n        {\n            endian_t end = get_endian_by_token();\n            token_next();\n            ifp = input_file_spasm::create(fn, end);\n        }\n        break;\n\n    case token_spectrum:\n        token_next();\n        ifp = input_file_spectrum::create(fn);\n        break;\n\n    case token_stewie:\n        token_next();\n        ifp = input_file_stewie::create(fn);\n        break;\n\n    case token_tektronix:\n        token_next();\n        ifp = input_file_tektronix::create(fn);\n        break;\n\n    case token_tektronix_extended:\n        token_next();\n        ifp = input_file_tektronix_extended::create(fn);\n        break;\n\n    case token_ti_tagged:\n        token_next();\n        ifp = input_file_ti_tagged::create(fn);\n        break;\n\n    case token_ti_tagged_16:\n        token_next();\n        ifp = input_file_ti_tagged_16::create(fn);\n        break;\n\n    case token_ti_txt:\n        token_next();\n        ifp = input_file_ti_txt::create(fn);\n        break;\n\n    case token_trs80:\n        token_next();\n        ifp = input_file_trs80::create(fn);\n        break;\n\n    case token_vmem:\n        token_next();\n        ifp = input_file_vmem::create(fn);\n        break;\n\n    case token_wilson:\n        token_next();\n        ifp = input_file_wilson::create(fn);\n        break;\n    }\n    // assert(ifp);\n\n    //\n    // Process any additional format-specfic command line options.\n    //\n    ifp->command_line(this);\n\n    //\n    // Ignore checksums if asked to.\n    //\n    if (token_cur() == token_ignore_checksums)\n    {\n        ifp->disable_checksum_validation();\n        token_next();\n    }\n\n    //\n    // warn about data record sequences, if asked to\n    //\n    if (issue_sequence_warnings != 0)\n        ifp = input_filter_sequence::create(ifp);\n\n    //\n    // report success\n    //\n    return ifp;\n}\n\n\nsrecord::input::pointer\nsrecord::arglex_tool::get_input()\n{\n    input::pointer ifp = get_simple_input();\n\n    //\n    // apply any filters specified\n    //\n    for (;;)\n    {\n        // Keep this switch sorted in alphabetical order.\n        switch (token_cur())\n        {\n        case token_adler16_be:\n        case token_adler16_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_adler16::create\n                    (\n                        ifp,\n                        address,\n                        end\n                    );\n            }\n            break;\n\n        case token_adler32_be:\n        case token_adler32_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_adler32::create\n                    (\n                        ifp,\n                        address,\n                        end\n                    );\n            }\n            break;\n\n        case token_and:\n            {\n                token_next();\n                int filler = get_number(\"--and\", 0, 255);\n                if (filler < 0 || filler >= 256)\n                {\n                    fatal_error(\"-and value %d out of range (0..255)\", filler);\n                    // NOTREACHED\n                }\n                ifp = input_filter_and::create(ifp, filler);\n            }\n            break;\n\n        case token_bitrev:\n            token_next();\n            if (can_get_number())\n            {\n                // Let the byte swap filter re-arrange the bytes.\n                ifp = input_filter_byte_swap::create(ifp);\n                ifp->command_line(this);\n            }\n            ifp = input_filter_bitrev::create(ifp);\n            break;\n\n        case token_byte_swap:\n            token_next();\n            ifp = input_filter_byte_swap::create(ifp);\n            break;\n\n        case token_checksum_be_bitnot:\n        case token_checksum_le_bitnot:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                int nbytes, width;\n                get_address_nbytes_width(name, address, nbytes, width);\n                ifp =\n                    input_filter_checksum_bitnot::create\n                    (\n                        ifp,\n                        address,\n                        nbytes,\n                        end,\n                        width\n                    );\n            }\n            break;\n\n        case token_checksum_be_negative:\n        case token_checksum_le_negative:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                int nbytes, width;\n                get_address_nbytes_width(name, address, nbytes, width);\n                ifp =\n                    input_filter_checksum_negative::create\n                    (\n                        ifp,\n                        address,\n                        nbytes,\n                        end,\n                        width\n                    );\n            }\n            break;\n\n        case token_checksum_be_positive:\n        case token_checksum_le_positive:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                int nbytes, width;\n                get_address_nbytes_width(name, address, nbytes, width);\n                ifp =\n                    input_filter_checksum_positive::create\n                    (\n                        ifp,\n                        address,\n                        nbytes,\n                        end,\n                        width\n                    );\n            }\n            break;\n\n        case token_crc16_be:\n        case token_crc16_le:\n            {\n                endian_t end = get_endian_by_token();\n                const char *name = token_name();\n                token_next();\n                unsigned long address;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_crc16::create(ifp, address, end);\n            }\n            break;\n\n        case token_crc32_be:\n        case token_crc32_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                get_address(name, address);\n                ifp = input_filter_message_crc32::create(ifp, address, end);\n            }\n            break;\n\n        case token_crop:\n            token_next();\n            ifp = input_filter_crop::create(ifp, get_interval(\"-Crop\"));\n            break;\n\n        case token_exclude:\n            token_next();\n            ifp = input_filter_crop::create(ifp, -get_interval(\"-Exclude\"));\n            break;\n\n        case token_exclusive_length:\n            fatal_error\n            (\n                \"Use --big-endian-exclusive-length or \"\n                    \"--little-endian-exclusive-length\"\n            );\n            // NOTREACHED\n\n        case token_exclusive_maximum:\n            fatal_error\n            (\n                \"Use --big-endian-exclusive-maximum or \"\n                    \"--little-endian-exclusive-maximum\"\n            );\n            // NOTREACHED\n\n        case token_exclusive_minimum:\n            fatal_error\n            (\n                \"Use --big-endian-exclusive-minimum or \"\n                    \"--little-endian-exclusive-minimum\"\n            );\n            // NOTREACHED\n\n        case token_fill:\n            {\n                token_next();\n                int filler = get_number(\"--Fill\", 0, 255);\n                interval range = get_interval_small(\"--Fill\");\n                ifp = input_filter_fill::create(ifp, filler, range);\n            }\n            break;\n\n        case token_fletcher16_be:\n        case token_fletcher16_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_fletcher16::create\n                    (\n                        ifp,\n                        address,\n                        end\n                    );\n            }\n            break;\n\n        case token_fletcher32_be:\n        case token_fletcher32_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                token_next();\n                unsigned long address;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_fletcher32::create\n                    (\n                        ifp,\n                        address,\n                        end\n                    );\n            }\n            break;\n\n        case token_haval:\n            {\n                // Undocumented, no gcrypt implementation, yet.\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_haval\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_gcrypt:\n            {\n                const char *name = token_name();\n                token_next();\n                std::string algo = get_string(name);\n                unsigned long address = 0;\n                get_address(name, address);\n                bool hmac = false;\n                ifp =\n                    input_filter_message_gcrypt::create\n                    (\n                        ifp,\n                        address,\n                        algo.c_str(),\n                        hmac\n                    );\n            }\n            break;\n\n        case token_length:\n            fatal_error(\"Use --big-endian-length or --little-endian-length\");\n            // NOTREACHED\n\n        case token_length_be:\n        case token_length_le:\n        case token_exclusive_length_be:\n        case token_exclusive_length_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                bool inclusive = get_inclusive_by_token();\n                token_next();\n                unsigned long address;\n                int nbytes, width;\n                get_address_nbytes_width(name, address, nbytes, width);\n                ifp =\n                    input_filter_interval_length::create\n                    (\n                        ifp,\n                        address,\n                        nbytes,\n                        end,\n                        width,\n                        inclusive\n                    );\n            }\n            break;\n\n        case token_maximum_be:\n        case token_maximum_le:\n        case token_exclusive_maximum_be:\n        case token_exclusive_maximum_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                bool inclusive = get_inclusive_by_token();\n                token_next();\n                unsigned long address;\n                int nbytes;\n                get_address_and_nbytes(name, address, nbytes);\n                ifp =\n                    input_filter_interval_maximum::create\n                    (\n                        ifp,\n                        address,\n                        nbytes,\n                        end,\n                        inclusive\n                    );\n            }\n            break;\n\n        case token_minimum_be:\n        case token_minimum_le:\n        case token_exclusive_minimum_be:\n        case token_exclusive_minimum_le:\n            {\n                const char *name = token_name();\n                endian_t end = get_endian_by_token();\n                bool inclusive = get_inclusive_by_token();\n                token_next();\n                unsigned long address;\n                int nbytes;\n                get_address_and_nbytes(name, address, nbytes);\n                ifp =\n                    input_filter_interval_minimum::create\n                    (\n                        ifp,\n                        address,\n                        nbytes,\n                        end,\n                        inclusive\n                    );\n            }\n            break;\n\n        case token_md2:\n            {\n                // Undocumented, no gcrypt implementation, yet.\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp = input_filter_message_gcrypt::create_md2(ifp, address);\n            }\n            break;\n\n        case token_md5:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp = input_filter_message_gcrypt::create_md5(ifp, address);\n            }\n            break;\n\n        case token_not:\n            token_next();\n            ifp = input_filter_not::create(ifp);\n            break;\n\n        case token_offset:\n            {\n                token_next();\n                unsigned long amount = get_number(\"--offset\");\n                ifp = input_filter_offset::create(ifp, amount);\n            }\n            break;\n\n        case token_or:\n            {\n                token_next();\n                int filler = get_number(\"--or value\", 0, 255);\n                ifp = input_filter_or::create(ifp, filler);\n            }\n            break;\n\n        case token_random_fill:\n            {\n                token_next();\n                interval range = get_interval_small(\"-Random_Fill\");\n                ifp = input_filter_random_fill::create(ifp, range);\n            }\n            break;\n\n        case token_rmd160:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_rmd160\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_sha1:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp = input_filter_message_gcrypt::create_sha1(ifp, address);\n            }\n            break;\n\n        case token_sha224:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_sha224\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_sha256:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_sha256\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_sha384:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_sha384\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_sha512:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_sha512\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_split:\n            {\n                token_next();\n                int split_modulus = get_number(\"--split modulus\");\n                if (split_modulus < 2)\n                {\n                    fatal_error(\"the -split modulus must be two or more\");\n                    // NOTREACHED\n                }\n                int split_offset = 0;\n                if (can_get_number())\n                {\n                    split_offset =\n                        get_number(\"split offset\", 0, split_modulus - 1);\n                }\n                int split_width = 1;\n                if (can_get_number())\n                {\n                    split_width =\n                        get_number(\"split width\", 1, split_modulus - 1);\n                }\n                ifp =\n                    input_filter_split::create\n                    (\n                        ifp,\n                        split_modulus,\n                        split_offset,\n                        split_width\n                    );\n            }\n            break;\n\n        case token_stm32_crc_be:\n        case token_stm32_crc_le:\n            {\n                const char *name = token_name();\n                endian_t endian = get_endian_by_token();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp = input_filter_message_stm32::create(ifp, address, endian);\n            }\n            break;\n\n        case token_tiger:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_tiger\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_unfill:\n            {\n                token_next();\n                int fill_value = get_number(\"--unfill value\", 0, 255);\n                int fill_minimum = 1;\n                if (can_get_number())\n                {\n                    fill_minimum = get_number(\"--unfill minimum\", 1, 16);\n                }\n                ifp =\n                    input_filter_unfill::create\n                    (\n                        ifp,\n                        fill_value,\n                        fill_minimum\n                    );\n            }\n            break;\n\n        case token_unsplit:\n            {\n                token_next();\n                int split_modulus = get_number(\"--unsplit modulus\");\n                if (split_modulus < 2)\n                {\n                    fatal_error(\"the -unsplit modulus must be two or more\");\n                    // NOTREACHED\n                }\n                int split_offset = 0;\n                if (can_get_number())\n                {\n                    split_offset =\n                        get_number(\"--unsplit offset\", 0, split_modulus - 1);\n                }\n                int split_width = 1;\n                if (can_get_number())\n                {\n                    split_width =\n                        get_number(\"--unsplit width\", 1, split_modulus - 1);\n                }\n                ifp =\n                    input_filter_unsplit::create\n                    (\n                        ifp,\n                        split_modulus,\n                        split_offset,\n                        split_width\n                    );\n            }\n            break;\n\n        case token_whirlpool:\n            {\n                const char *name = token_name();\n                token_next();\n                unsigned long address = 0;\n                get_address(name, address);\n                ifp =\n                    input_filter_message_gcrypt::create_whirlpool\n                    (\n                        ifp,\n                        address\n                    );\n            }\n            break;\n\n        case token_xor:\n            {\n                token_next();\n                int filler = get_number(\"--xor\", 0, 255);\n                ifp = input_filter_xor::create(ifp, filler);\n            }\n            break;\n\n        default:\n            //\n            // return the input stream determined\n            //\n            return ifp;\n        }\n\n        //\n        // Process any filter-specific command line options.\n        //\n        ifp->command_line(this);\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool/output.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2004, 2006-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/aomf.h>\n#include <srecord/output/file/ascii_hex.h>\n#include <srecord/output/file/asm.h>\n#include <srecord/output/file/atmel_generic.h>\n#include <srecord/output/file/basic.h>\n#include <srecord/output/file/binary.h>\n#include <srecord/output/file/brecord.h>\n#include <srecord/output/file/c.h>\n#include <srecord/output/file/coe.h>\n#include <srecord/output/file/cosmac.h>\n#include <srecord/output/file/dec_binary.h>\n#include <srecord/output/file/emon52.h>\n#include <srecord/output/file/fairchild.h>\n#include <srecord/output/file/fastload.h>\n#include <srecord/output/file/formatted_binary.h>\n#include <srecord/output/file/forth.h>\n#include <srecord/output/file/four_packed_code.h>\n#include <srecord/output/file/hexdump.h>\n#include <srecord/output/file/idt.h>\n#include <srecord/output/file/intel.h>\n#include <srecord/output/file/intel16.h>\n#include <srecord/output/file/logisim.h>\n#include <srecord/output/file/mif.h>\n#include <srecord/output/file/mem.h>\n#include <srecord/output/file/coe.h>\n#include <srecord/output/file/mips_flash.h>\n#include <srecord/output/file/mos_tech.h>\n#include <srecord/output/file/motorola.h>\n#include <srecord/output/file/msbin.h>\n#include <srecord/output/file/needham.h>\n#include <srecord/output/file/os65v.h>\n#include <srecord/output/file/ppb.h>\n#include <srecord/output/file/ppx.h>\n#include <srecord/output/file/signetics.h>\n#include <srecord/output/file/spasm.h>\n#include <srecord/output/file/spectrum.h>\n#include <srecord/output/file/stewie.h>\n#include <srecord/output/file/tektronix_extended.h>\n#include <srecord/output/file/tektronix.h>\n#include <srecord/output/file/ti_tagged.h>\n#include <srecord/output/file/ti_tagged_16.h>\n#include <srecord/output/file/ti_txt.h>\n#include <srecord/output/file/trs80.h>\n#include <srecord/output/file/vhdl.h>\n#include <srecord/output/file/vmem.h>\n#include <srecord/output/file/wilson.h>\n\n\nsrecord::output::pointer\nsrecord::arglex_tool::get_output()\n{\n    //\n    // skip the -output token\n    //\n    if (token_cur() == token_output)\n        token_next();\n\n    //\n    // determine the file name\n    //\n    std::string fn = \"-\";\n    switch (token_cur())\n    {\n    case token_stdio:\n        token_next();\n        // fall through...\n\n    default:\n        if (stdout_used)\n        {\n            fatal_error\n            (\n                \"the standard output may only be named once on the command line\"\n            );\n            // NOTREACHED\n        }\n        stdout_used = true;\n        break;\n\n    case token_string:\n        fn = value_string();\n        token_next();\n        break;\n    }\n\n    //\n    // determine the file format\n    //\n    srecord::output::pointer ofp;\n    switch (token_cur())\n    {\n    case token_motorola:\n        token_next();\n        // fall through...\n\n    default:\n        ofp = srecord::output_file_motorola::create(fn);\n        break;\n\n    case token_aomf:\n        token_next();\n        ofp = srecord::output_file_aomf::create(fn);\n        break;\n\n    case token_ascii_hex:\n        token_next();\n        ofp = srecord::output_file_ascii_hex::create(fn);\n        break;\n\n    case token_assembler:\n        token_next();\n        ofp = srecord::output_file_asm::create(fn);\n        break;\n\n    case token_atmel_generic_be:\n        token_next();\n        ofp = srecord::output_file_atmel_generic::create(fn, endian_big);\n        break;\n\n    case token_atmel_generic_le:\n        token_next();\n        ofp = srecord::output_file_atmel_generic::create(fn, endian_little);\n        break;\n\n    case token_basic_data:\n        token_next();\n        ofp = srecord::output_file_basic::create(fn);\n        break;\n\n    case token_binary:\n        token_next();\n        ofp = srecord::output_file_binary::create(fn);\n        break;\n\n    case token_brecord:\n        token_next();\n        ofp = srecord::output_file_brecord::create(fn);\n        break;\n\n    case token_c_array:\n        token_next();\n        ofp = srecord::output_file_c::create(fn);\n        break;\n\n    case token_cosmac:\n        token_next();\n        ofp = srecord::output_file_cosmac::create(fn);\n        break;\n\n    case token_dec_binary:\n        token_next();\n        ofp = srecord::output_file_dec_binary::create(fn);\n        break;\n\n    case token_emon52:\n        token_next();\n        ofp = srecord::output_file_emon52::create(fn);\n        break;\n\n    case token_fairchild:\n        token_next();\n        ofp = srecord::output_file_fairchild::create(fn);\n        break;\n\n    case token_fast_load:\n        token_next();\n        ofp = srecord::output_file_fastload::create(fn);\n        break;\n\n    case token_formatted_binary:\n        token_next();\n        ofp = srecord::output_file_formatted_binary::create(fn);\n        break;\n\n    case token_forth:\n        token_next();\n        ofp = srecord::output_file_forth::create(fn);\n        break;\n\n    case token_four_packed_code:\n        token_next();\n        ofp = srecord::output_file_four_packed_code::create(fn);\n        break;\n\n    case token_hexdump:\n        token_next();\n        ofp = srecord::output_file_hexdump::create(fn);\n        break;\n\n    case token_intel:\n        token_next();\n        ofp = srecord::output_file_intel::create(fn);\n        break;\n\n    case token_idt:\n        token_next();\n        ofp = srecord::output_file_idt::create(fn);\n        break;\n\n    case token_intel16:\n        token_next();\n        ofp = srecord::output_file_intel16::create(fn);\n        break;\n\n    case token_logisim:\n        token_next();\n        ofp = srecord::output_file_logisim::create(fn);\n        break;\n\n    case token_lattice_memory_initialization_format:\n        token_next();\n        ofp = srecord::output_file_mem::create(fn);\n        break;\n\n    case token_memory_initialization_file:\n        token_next();\n        ofp = srecord::output_file_mif::create(fn);\n        break;\n\n    case token_mips_flash_be:\n        token_next();\n        ofp = srecord::output_file_mips_flash::create_be(fn);\n        break;\n\n    case token_mips_flash_le:\n        token_next();\n        ofp = srecord::output_file_mips_flash::create_le(fn);\n        break;\n\n    case token_mos_tech:\n        token_next();\n        ofp = srecord::output_file_mos_tech::create(fn);\n        break;\n\n    case token_msbin:\n        token_next();\n        ofp = srecord::output_file_msbin::create(fn);\n        break;\n\n    case token_needham_hex:\n        token_next();\n        ofp = srecord::output_file_needham::create(fn);\n        break;\n\n    case token_ohio_scientific:\n        token_next();\n        ofp = srecord::output_file_os65v::create(fn);\n        break;\n\n    case token_ppb:\n        token_next();\n        ofp = srecord::output_file_ppb::create(fn);\n        break;\n\n    case token_ppx:\n        token_next();\n        ofp = srecord::output_file_ppx::create(fn);\n        break;\n\n    case token_signetics:\n        token_next();\n        ofp = srecord::output_file_signetics::create(fn);\n        break;\n\n    case token_spasm_be:\n        token_next();\n        ofp = srecord::output_file_spasm::create(fn, endian_big);\n        break;\n\n    case token_spasm_le:\n        token_next();\n        ofp = srecord::output_file_spasm::create(fn, endian_little);\n        break;\n\n    case token_spectrum:\n        token_next();\n        ofp = srecord::output_file_spectrum::create(fn);\n        break;\n\n    case token_stewie:\n        token_next();\n        ofp = srecord::output_file_stewie::create(fn);\n        break;\n\n    case token_tektronix:\n        token_next();\n        ofp = srecord::output_file_tektronix::create(fn);\n        break;\n\n    case token_tektronix_extended:\n        token_next();\n        ofp = srecord::output_file_tektronix_extended::create(fn);\n        break;\n\n    case token_ti_tagged:\n        token_next();\n        ofp = srecord::output_file_ti_tagged::create(fn);\n        break;\n\n    case token_ti_tagged_16:\n        token_next();\n        ofp = srecord::output_file_ti_tagged_16::create(fn);\n        break;\n\n    case token_ti_txt:\n        token_next();\n        ofp = srecord::output_file_ti_txt::create(fn);\n        break;\n\n    case token_trs80:\n        token_next();\n        ofp = srecord::output_file_trs80::create(fn);\n        break;\n\n    case token_vhdl:\n        token_next();\n        ofp = srecord::output_file_vhdl::create(fn);\n        break;\n\n    case token_vmem:\n        token_next();\n        ofp = srecord::output_file_vmem::create(fn);\n        break;\n\n    case token_wilson:\n        token_next();\n        ofp = srecord::output_file_wilson::create(fn);\n        break;\n\n    case token_xilinx_coefficient_file:\n        token_next();\n        ofp = srecord::output_file_coe::create(fn);\n        break;\n    }\n\n    //\n    // Parse extra command line options for this format, if any.\n    //\n    //assert(ofp);\n    ofp->command_line(this);\n\n    //\n    // return the stream determined\n    //\n    return ofp;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2014 Peter Miller\n// Copyright (C) 2014 Scott Finneran\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <iostream>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file.h>\n\n\nsrecord::arglex_tool::arglex_tool(int argc, char **argv) :\n    arglex(argc, argv),\n    stdin_used(false),\n    stdout_used(false),\n    issue_sequence_warnings(-1),\n    redundant_bytes(srecord::defcon_warning),\n    contradictory_bytes(srecord::defcon_fatal_error)\n{\n    static const table_ty table[] =\n    {\n        // sort using \"!LC_ALL=C sort -f\"\n        { \"(\", token_paren_begin, },\n        { \")\", token_paren_end, },\n        { \"+\", token_union, },\n        { \"-A430\", token_a430, },\n        { \"-Absolute_Object_Module_Format\", token_aomf, },\n        { \"-Adler_16_Big_Endian\", token_adler16_be, },\n        { \"-Adler_16_Little_Endian\", token_adler16_le, },\n        { \"-Adler_32_Big_Endian\", token_adler32_be, },\n        { \"-Adler_32_Little_Endian\", token_adler32_le, },\n        { \"-Adler_Checksum_16_Big_Endian\", token_adler16_be, },\n        { \"-Adler_Checksum_32_big_Endian\", token_adler32_be, },\n        { \"-AND\", token_and, },\n        { \"-Ascii_Hexadecimal\", token_ascii_hex, },\n        { \"-Ascii_Space_Hexadecimal\", token_ascii_hex, },\n        { \"-ASseMbler\", token_assembler, },\n        { \"-Atmel_Generic\", token_atmel_generic_le, },\n        { \"-Atmel_Generic_Big_Endian\", token_atmel_generic_be, },\n        { \"-Atmel_Generic_Little_Endian\", token_atmel_generic_le, },\n        { \"-AUGment\", token_crc16_augment },\n        { \"-BAsic\", token_basic_data, },\n        { \"-BIG\", token_big, },\n        { \"-BINary\", token_binary, },\n        { \"-Bit_REVerse\", token_bitrev },\n        { \"-BROken\", token_crc16_broken, },\n        { \"-Byte_Swap\", token_byte_swap, },\n        { \"-B_Record\", token_brecord, },\n        { \"-Checksum_Adler_16_Big_Endian\", token_adler16_be, },\n        { \"-Checksum_Adler_16_Little_Endian\", token_adler16_le, },\n        { \"-Checksum_Adler_32_Big_Endian\", token_adler32_be, },\n        { \"-Checksum_Adler_32_Little_Endian\", token_adler32_le, },\n        { \"-Checksum_BitNot_Big_Endian\", token_checksum_be_bitnot, },\n        { \"-Checksum_BitNot_Little_Endian\", token_checksum_le_bitnot, },\n        { \"-Checksum_Fletchers_16_Little_Endian\", token_fletcher16_le, },\n        { \"-Checksum_Fletchers_32_Little_Endian\", token_fletcher32_le, },\n        { \"-Checksum_Negative_Big_Endian\", token_checksum_be_negative, },\n        { \"-Checksum_Negative_Little_Endian\", token_checksum_le_negative, },\n        { \"-Checksum_Positive_Big_Endian\", token_checksum_be_positive, },\n        { \"-Checksum_Positive_Little_Endian\", token_checksum_le_positive, },\n        { \"-CL430\", token_cl430, },\n        { \"-COE\", token_xilinx_coefficient_file },\n        { \"-Comite_Consultatif_International_Telephonique_et_Telegraphique\",\n            token_crc16_ccitt,},\n        { \"-CONSTant\", token_constant, },\n        { \"-CONSTant_Big_Endian\", token_constant_be, },\n        { \"-CONSTant_Little_Endian\", token_constant_le, },\n        { \"-Contradictory_Bytes\", token_contradictory_bytes },\n        { \"-COsmac\", token_cosmac, },\n        { \"-CRop\", token_crop, },\n        { \"-Cyclic_Redundancy_Check_16_Big_Endian\", token_crc16_be, },\n        { \"-Cyclic_Redundancy_Check_16_Little_Endian\", token_crc16_le,},\n        { \"-Cyclic_Redundancy_Check_16_XMODEM\", token_crc16_xmodem,},\n        { \"-Cyclic_Redundancy_Check_32_Big_Endian\", token_crc32_be, },\n        { \"-Cyclic_Redundancy_Check_32_Little_Endian\", token_crc32_le,},\n        { \"-C_Array\", token_c_array, },\n        { \"-C_COMpressed\", token_c_compressed, },\n        { \"-DECimal_STyle\", token_style_hexadecimal_not, },\n        { \"-Dec_Binary\", token_dec_binary, },\n        { \"-DIFference\", token_minus, },\n        { \"-Disable_Sequence_Warnings\", token_sequence_warnings_disable, },\n        { \"-Dot_STyle\", token_style_dot, },\n        { \"-EEPROM\", token_eeprom, },\n        { \"-Elektor_Monitor52\", token_emon52, },\n        { \"-Enable_Sequence_Warnings\", token_sequence_warnings_enable, },\n        { \"-Exclude\", token_exclude, },\n        { \"-Exclusive_Length\", token_exclusive_length, },\n        { \"-Exclusive_Length_Big_Endian\", token_exclusive_length_be, },\n        { \"-Exclusive_Length_Little_Endian\", token_exclusive_length_le, },\n        { \"-Exclusive_MAximum\", token_exclusive_maximum, },\n        { \"-Exclusive_MAximum_Big_Endian\", token_exclusive_maximum_be, },\n        { \"-Exclusive_MAximum_Little_Endian\", token_exclusive_maximum_le, },\n        { \"-Exclusive_MInimum\", token_exclusive_minimum, },\n        { \"-Exclusive_MInimum_Big_Endian\",token_exclusive_minimum_be, },\n        { \"-Exclusive_MInimum_Little_Endian\", token_exclusive_minimum_le, },\n        { \"-FAIrchild\", token_fairchild, },\n        { \"-Fast_Load\", token_fast_load, },\n        { \"-Fill\", token_fill, },\n        { \"-Fletchers_16_Big_Endian\", token_fletcher16_be, },\n        { \"-Fletchers_16_Little_Endian\", token_fletcher16_le, },\n        { \"-Fletchers_32_Big_Endian\", token_fletcher32_be, },\n        { \"-Fletchers_32_Little_Endian\", token_fletcher32_le, },\n        { \"-Fletchers_Checksum_16_Big_Endian\", token_fletcher16_be, },\n        { \"-Fletchers_Checksum_32_Big_Endian\", token_fletcher32_be, },\n        { \"-Formatted_Binary\", token_formatted_binary, },\n        { \"-FORTH\", token_forth, },\n        { \"-Four_Packed_Code\", token_four_packed_code, },\n        { \"-GENerate\", token_generator },\n        { \"-GENerator\", token_generator },\n        { \"-Gnu_CRypt\", token_gcrypt }, // undocumented\n        { \"-GUess\", token_guess, },\n        { \"-HAVal\", token_haval, },\n        { \"-HEXadecimal_Dump\", token_hexdump, },\n        { \"-HEXadecimal_STyle\", token_style_hexadecimal, },\n        { \"-IGnore_Checksums\", token_ignore_checksums, },\n        { \"-INCLude\", token_include, },\n        { \"-Integrated_Device_Technology\", token_idt, },\n        { \"-Intel\", token_intel, },\n        { \"-INtel_HeXadecimal_16\", token_intel16, },\n        { \"-International_Telecommunication_Union\", token_crc16_ccitt,},\n        { \"-INTERSection\", token_intersection, },\n        { \"-Lattice_Memory_Initialization_Format\",\n            token_lattice_memory_initialization_format },\n        { \"-Least_To_Most\", token_crc16_least_to_most },\n        { \"-Length\", token_length, },\n        { \"-Length_Big_Endian\", token_length_be, },\n        { \"-Length_Little_Endian\", token_length_le, },\n        { \"-LOGisim\", token_logisim },\n        { \"-MAximum-Address\", token_maximum_address, },\n        { \"-MAximum_Big_Endian\", token_maximum_be, },\n        { \"-MAximum_Little_Endian\", token_maximum_le, },\n        { \"-MEM\", token_lattice_memory_initialization_format },\n        { \"-Memory_Initialization_File\", token_memory_initialization_file },\n        { \"-Message_Digest_2\", token_md2 },\n        { \"-Message_Digest_5\", token_md5 },\n        { \"-MInimum-Address\", token_minimum_address, },\n        { \"-MInimum_Big_Endian\",token_minimum_be, },\n        { \"-MInimum_Little_Endian\", token_minimum_le, },\n        { \"-MINUs\", token_minus, },\n        { \"-Mips_Flash_Big_Endian\", token_mips_flash_be, },\n        { \"-Mips_Flash_Little_Endian\", token_mips_flash_le, },\n        { \"-Most_To_Least\", token_crc16_most_to_least },\n        { \"-MOS_Technologies\", token_mos_tech, },\n        { \"-Motorola\", token_motorola, },\n        { \"-MsBin\", token_msbin, },\n        { \"-MULTiple\", token_multiple, },\n        { \"-Needham_Hexadecimal\", token_needham_hex, },\n        { \"-NOT\", token_not, },\n        { \"-Not_AUGment\", token_crc16_augment_not },\n        { \"-Not_CONSTant\", token_constant_not, },\n        { \"-Not_INCLude\", token_include_not, },\n        { \"-OFfset\", token_offset, },\n        { \"-Ohio_Scientific\", token_ohio_scientific, },\n        { \"-Ohio_Scientific65v\", token_ohio_scientific, },\n        { \"-OR\", token_or, },\n        { \"-Output\", token_output, },\n        { \"-Output_Words\", token_output_word, },\n        { \"-OVer\", token_over, },\n        { \"-POLYnomial\", token_polynomial },\n        { \"-PREfix\", token_prefix, },\n        { \"-POSTfix\", token_postfix, },\n        { \"-Prom_Pogrammer_Binary\", token_ppb, },\n        { \"-Prom_Pogrammer_heXadecimal\", token_ppx, },\n        { \"-RAM\", token_ram, },\n        { \"-RANDom\", token_random, },\n        { \"-Random_Fill\", token_random_fill, },\n        { \"-RAnge_PADding\", token_range_padding, },\n        { \"-RAw\", token_binary, },\n        { \"-Redundant_Bytes\", token_redundant_bytes },\n        { \"-REPeat_Data\", token_repeat_data, },\n        { \"-REPeat_String\", token_repeat_string, },\n        { \"-Ripe_Message_Digest_160\", token_rmd160 },\n        { \"-Round\", token_round_nearest, },\n        { \"-Round_Down\", token_round_down, },\n        { \"-Round_Nearest\", token_round_nearest, },\n        { \"-Round_Off\", token_round_nearest, },\n        { \"-Round_Up\", token_round_up, },\n        { \"-Section_STyle\", token_style_section, },\n        { \"-Secure_Hash_Algorithm_1\", token_sha1 },\n        { \"-Secure_Hash_Algorithm_224\", token_sha224 },\n        { \"-Secure_Hash_Algorithm_256\", token_sha256 },\n        { \"-Secure_Hash_Algorithm_384\", token_sha384 },\n        { \"-Secure_Hash_Algorithm_512\", token_sha512 },\n        { \"-Signed_BiNary\", token_stewie, },\n        { \"-SIGnetics\", token_signetics, },\n        { \"-SPAsm_Big_Endian\", token_spasm_be, },\n        { \"-SPAsm_Little_Endian\", token_spasm_le, },\n        { \"-SPAsm\", token_spasm_be, }, // put after others\n        { \"-SPEctrum\", token_spectrum, },\n        { \"-SPlit\", token_split, },\n        { \"-Stag_Binary\", token_ppb, },\n        { \"-Stag_Hexadecimal\", token_ppx, },\n        { \"-STewie\", token_stewie, },\n        { \"-STM32_Big_Endian\", token_stm32_crc_be },\n        { \"-STM32_Little_Endian\", token_stm32_crc_le },\n        { \"-STM32\", token_stm32_crc_le }, // put after others\n        { \"-SUBtract\", token_minus, },\n        { \"-S_record\", token_motorola, },\n        { \"-Tektronix\", token_tektronix, },\n        { \"-Tektronix_EXtended\", token_tektronix_extended, },\n        { \"-Texas_Instruments_Tagged\", token_ti_tagged, },\n        { \"-Texas_Instruments_Tagged_16\", token_ti_tagged_16, },\n        { \"-Texas_Instruments_TeXT\", token_ti_txt, },\n        { \"-TIGer\", token_tiger },\n        { \"-TRS80\", token_trs80 },\n        { \"-UNIon\", token_union, },\n        { \"-Un_Fill\", token_unfill, },\n        { \"-Un_SPlit\", token_unsplit, },\n        { \"-VHdl\", token_vhdl, },\n        { \"-VMem\", token_vmem, },\n        { \"-WHIrlpool\", token_whirlpool },\n        { \"-WILson\", token_wilson, },\n        { \"-Within\", token_within, },\n        { \"-Xilinx_Coefficient_File\", token_xilinx_coefficient_file },\n        { \"-XOR\", token_xor, },\n        { \"-X_MODEM\", token_crc16_xmodem, },\n        { \"[\", token_paren_begin, },\n        { \"]\", token_paren_end, },\n        { \"{\", token_paren_begin, },\n        { \"}\", token_paren_end, },\n\n        // The deprecated options go at the end of the table, so that\n        // the preferred name will always be earlier in the table.\n        { \"-Checksum_Big_Endian\", token_checksum_be_positive, },\n        { \"-Checksum_Little_Endian\", token_checksum_le_positive, },\n        { \"-INtel_16\", token_intel16, },\n        { \"-MAximum\", token_maximum_address, },\n        { \"-MInimum\", token_minimum_address, },\n\n        SRECORD_ARGLEX_END_MARKER\n    };\n\n    table_set(table);\n    deprecated_option(\"-Checksum_Big_Endian\");\n    deprecated_option(\"-Checksum_Little_Endian\");\n    deprecated_option(\"-INtel_16\");\n    deprecated_option(\"-MAximum\");\n    deprecated_option(\"-MInimum\");\n}\n\n\nsrecord::arglex_tool::~arglex_tool()\n{\n}\n\n\nbool\nsrecord::arglex_tool::can_get_number(void)\n    const\n{\n    switch (token_cur())\n    {\n    case token_paren_begin:\n    case token_number:\n    case token_minimum_address:\n    case token_maximum_address:\n    case token_length:\n        return true;\n\n    default:\n        return false;\n    }\n}\n\n\nvoid\nsrecord::arglex_tool::get_address(const char *name, unsigned long &address)\n{\n    if (!can_get_number())\n    {\n        fatal_error(\"the %s filter requires an address\", name);\n        // NOTREACHED\n    }\n    address = get_number(\"address\");\n}\n\n\nvoid\nsrecord::arglex_tool::get_address_and_nbytes(const char *name,\n    unsigned long &address, int &nbytes)\n{\n    if (!can_get_number())\n    {\n        fatal_error(\"the %s filter requires an address and a byte count\", name);\n        // NOTREACHED\n    }\n    address = get_number(\"address\");\n    nbytes = 4;\n    if (can_get_number())\n    {\n        nbytes = get_number(\"byte count\", 1, 8);\n    }\n    if ((long long)address + nbytes > (1LL << 32))\n    {\n        fatal_error\n        (\n            \"the %s address (0x%8.8lX) and byte count (%d) may not span the \"\n                \"top of memory\",\n            name,\n            address,\n            nbytes\n        );\n        // NOTREACHED\n    }\n}\n\n\nvoid\nsrecord::arglex_tool::get_address_nbytes_width(const char *name,\n    unsigned long &address, int &nbytes, int &width)\n{\n    address = get_number(\"address\");\n    nbytes = 4;\n    width = 1;\n    if (can_get_number())\n    {\n        nbytes = get_number(\"byte count\", 1, 8);\n        if (can_get_number())\n        {\n            width = get_number(\"width\", 1, nbytes);\n        }\n    }\n    if ((long long)address + nbytes > (1LL << 32))\n    {\n        fatal_error\n        (\n            \"the %s address (0x%8.8lX) and byte count (%d) may not span the \"\n                \"top of memory\",\n            name,\n            address,\n            nbytes\n        );\n        // NOTREACHED\n    }\n}\n\n\nvoid\nsrecord::arglex_tool::default_command_line_processing(void)\n{\n    switch (token_cur())\n    {\n    default:\n        arglex::default_command_line_processing();\n        break;\n\n    case token_ignore_checksums:\n        input_file::ignore_all_checksums();\n        token_next();\n        break;\n\n    case token_sequence_warnings_enable:\n        issue_sequence_warnings = 1;\n        token_next();\n        break;\n\n    case token_sequence_warnings_disable:\n        issue_sequence_warnings = 0;\n        token_next();\n        break;\n\n    case token_multiple:\n        // This one is intentionally not documented.\n        // Use one of the -rb or -cb options.\n        redundant_bytes = defcon_ignore;\n        contradictory_bytes = defcon_ignore;\n        token_next();\n        break;\n\n    case token_redundant_bytes:\n        {\n            if (token_next() != token_string)\n            {\n                fatal_error\n                (\n                    \"the %s option requires a string argument\",\n                    token_name(token_redundant_bytes)\n                );\n            }\n            int x = defcon_from_text(value_string().c_str());\n            if (x < 0)\n            {\n                fatal_error\n                (\n                    \"the %s=%s option value is unknown\",\n                    token_name(token_redundant_bytes),\n                    value_string().c_str()\n                );\n            }\n            redundant_bytes = (defcon_t)x;\n            token_next();\n        }\n        break;\n\n    case token_contradictory_bytes:\n        {\n            if (token_next() != token_string)\n            {\n                fatal_error\n                (\n                    \"the %s option requires a string argument\",\n                    token_name(token_contradictory_bytes)\n                );\n            }\n            int x = defcon_from_text(value_string().c_str());\n            if (x < 0)\n            {\n                fatal_error\n                (\n                    \"the %s=%s option value is unknown\",\n                    token_name(token_contradictory_bytes),\n                    value_string().c_str()\n                );\n            }\n            contradictory_bytes = (defcon_t)x;\n            token_next();\n        }\n        break;\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex/tool.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2014 Peter Miller\n// Copyright (C) 2014 Scott Finneran\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_ARGLEX_TOOL_H\n#define SRECORD_ARGLEX_TOOL_H\n\n#include <srecord/arglex.h>\n#include <srecord/defcon.h>\n#include <srecord/endian.h>\n#include <srecord/input.h>\n#include <srecord/output.h>\n\n\nnamespace srecord\n{\n\nclass interval; // forward\n\n/**\n  * The srecord::arglex_tool is used to parse command line with srec-specific\n  * arguments.\n  */\nclass arglex_tool:\n    public arglex\n{\npublic:\n    enum\n    {\n        token_a430 = arglex::token_MAX,\n        token_adler16_be,\n        token_adler16_le,\n        token_adler32_be,\n        token_adler32_le,\n        token_and,\n        token_aomf,\n        token_ascii_hex,\n        token_assembler,\n        token_atmel_generic_be,\n        token_atmel_generic_le,\n        token_basic_data,\n        token_big,\n        token_binary,\n        token_bitrev,\n        token_brecord,\n        token_byte_swap,\n        token_c_array,\n        token_c_compressed,\n        token_checksum_be_bitnot,\n        token_checksum_be_negative,\n        token_checksum_be_positive,\n        token_checksum_le_bitnot,\n        token_checksum_le_negative,\n        token_checksum_le_positive,\n        token_cl430,\n        token_constant,\n        token_constant_be,\n        token_constant_le,\n        token_constant_not,\n        token_contradictory_bytes,\n        token_cosmac,\n        token_crc16_augment,\n        token_crc16_augment_not,\n        token_crc16_be,\n        token_crc16_broken,\n        token_crc16_ccitt,\n        token_crc16_le,\n        token_crc16_least_to_most,\n        token_crc16_most_to_least,\n        token_crc16_xmodem,\n        token_crc32_be,\n        token_crc32_le,\n        token_crop,\n        token_dec_binary,\n        token_eeprom,\n        token_emon52,\n        token_exclude,\n        token_exclusive_length,\n        token_exclusive_length_be,\n        token_exclusive_length_le,\n        token_exclusive_maximum,\n        token_exclusive_maximum_be,\n        token_exclusive_maximum_le,\n        token_exclusive_minimum,\n        token_exclusive_minimum_be,\n        token_exclusive_minimum_le,\n        token_fairchild,\n        token_fast_load,\n        token_fill,\n        token_fletcher16_be,\n        token_fletcher16_le,\n        token_fletcher32_be,\n        token_fletcher32_le,\n        token_formatted_binary,\n        token_forth,\n        token_four_packed_code,\n        token_gcrypt,\n        token_generator,\n        token_guess,\n        token_haval,\n        token_hexdump,\n        token_idt,\n        token_ignore_checksums,\n        token_lattice_memory_initialization_format,\n        token_logisim,\n        token_include,\n        token_include_not,\n        token_intel,\n        token_intel16,\n        token_intersection,\n        token_length,\n        token_length_be,\n        token_length_le,\n        token_maximum_address,\n        token_maximum_be,\n        token_maximum_le,\n        token_md2,\n        token_md5,\n        token_memory_initialization_file,\n        token_minimum_address,\n        token_minimum_be,\n        token_minimum_le,\n        token_minus,\n        token_mips_flash_be,\n        token_mips_flash_le,\n        token_mos_tech,\n        token_motorola,\n        token_msbin,\n        token_multiple,\n        token_needham_hex,\n        token_not,\n        token_offset,\n        token_ohio_scientific,\n        token_or,\n        token_output,\n        token_output_word,\n        token_over,\n        token_paren_begin,\n        token_paren_end,\n        token_polynomial,\n        token_postfix,\n        token_ppb,\n        token_ppx,\n        token_prefix,\n        token_ram,\n        token_random,\n        token_random_fill,\n        token_range_padding,\n        token_redundant_bytes,\n        token_repeat_data,\n        token_repeat_string,\n        token_rmd160,\n        token_round_down,\n        token_round_nearest,\n        token_round_up,\n        token_sequence_warnings_disable,\n        token_sequence_warnings_enable,\n        token_sha1,\n        token_sha224,\n        token_sha256,\n        token_sha384,\n        token_sha512,\n        token_signetics,\n        token_spasm_be,\n        token_spasm_le,\n        token_spectrum,\n        token_split,\n        token_stewie,\n        token_stm32_crc_be,\n        token_stm32_crc_le,\n        token_style_dot,\n        token_style_hexadecimal,\n        token_style_hexadecimal_not,\n        token_style_section,\n        token_tektronix,\n        token_tektronix_extended,\n        token_tiger,\n        token_ti_tagged,\n        token_ti_tagged_16,\n        token_ti_txt,\n        token_trs80,\n        token_unfill,\n        token_union,\n        token_unsplit,\n        token_vhdl,\n        token_vmem,\n        token_whirlpool,\n        token_wilson,\n        token_within,\n        token_xilinx_coefficient_file,\n        token_xor,\n        token_MAX\n    };\n\n    /**\n      * The destructor.\n      */\n    virtual ~arglex_tool();\n\n    /**\n      * The constructor.  Pass the argc and argv as given to main;\n      * there is not need to change the values at all.\n      */\n    arglex_tool(int argc, char **argv);\n\n    /**\n      * The get_input method is used to parse an input specification\n      * (filename, file format, filters, everything) from the\n      * command line.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    input::pointer get_input(void);\n\n    /**\n      * The get_output method is used to parse an output specification\n      * (filename and file format) from the command line.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    output::pointer get_output(void);\n\n    /**\n      * The get_number method is used to parse a numeric value from the\n      * command line.\n      */\n    unsigned long get_number(const char *caption);\n\n    /**\n      * The get_number method is used to parse a numeric value\n      * from the command line, and check it agains a specified range.\n      *\n      * @param caption\n      *     for the error message, if necessary\n      * @param min\n      *     The minimum acceptable value (inclusive)\n      * @param max\n      *     The maximum acceptable value (inclusive)\n      */\n    unsigned long get_number(const char *caption, long min, long max);\n\n    /**\n      * The can_get_number method is used to determine if it is possible\n      * to parse a number from the next token on the command line.\n      */\n    bool can_get_number(void) const;\n\n    /**\n      * The get_interval method is used to parse an interval\n      * set form the command line.  It consists of as many\n      * get_interval_inner()s as possible.\n      *\n      * Used by the get_input method to parse the address intervals used\n      * by various filters.  It is the lowest precedence level, and\n      * handsles set union (the implicit operator) and set difference\n      * (the - operator).\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    interval get_interval(const char *err_msg_caption);\n\n    /**\n      * The get_interval_small method may be used to parse an interval\n      * set form the command line.  It checks that the interval is\n      * <=1GB, and errors if it is not, with a --big override.  Commonly\n      * used to sanity check things like --fill.\n      */\n    interval get_interval_small(const char *err_msg_caption);\n\n    /**\n      * The get_string method may be used to get a string from the\n      * command line, or issue a fatal error if one is not available.\n      *\n      * @param caption\n      *     The text for the error message.\n      */\n    std::string get_string(const char *caption);\n\n    // See base class for documentation.\n    void default_command_line_processing(void);\n\n    defcon_t get_redundant_bytes(void) const { return redundant_bytes; }\n    defcon_t get_contradictory_bytes(void) const { return contradictory_bytes; }\n\nprivate:\n    /**\n      * The get_interval_factor method is used to parse a single\n      * interval from the command line (usually, a pair of number\n      * representing the [lower, upper) bounds, but it could be\n      * -over or -within, too).\n      *\n      * This method parses the highest precedence operators in the range\n      * parsing.\n      *\n      * This method should only every be called by the get_interval_term\n      * method.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    interval get_interval_factor(const char *err_msg_caption);\n\n    /**\n      * The get_interval_term method is used to parse set-intersection\n      * precedence intervals from the command line.  This method parses\n      * the middle precedence operators in the range parsing.\n      *\n      * This method should only every be called by the get_interval_term\n      * method.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    interval get_interval_term(const char *err_msg_caption);\n\n    /**\n      * The get_address method is used to parse an address from the\n      * command line.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    void get_address(const char *err_msg_caption, unsigned long &addr);\n\n    /**\n      * The get_address_and_nbytes method is used to parse an address\n      * and a byte count from the command line.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    void get_address_and_nbytes(const char *err_msg_caption,\n            unsigned long &addr, int &nbytes);\n\n    /**\n      * The get_address_nbytes_width method is used to parse an address\n      * a byte count and a width from the command line.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    void get_address_nbytes_width(const char *err_msg_caption,\n        unsigned long &addr, int &nbytes, int &width);\n\n    /**\n      * The stdin_used instance variable is used to remember whether\n      * or not the standard input has been used by a filter, yet.\n      * Only one use of the standard input may be made; the second\n      * use will result in a fatal error.\n      */\n    bool stdin_used;\n\n    /**\n      * The stdout_used instance variable is used to remember whether\n      * or not the standard output has been used by a filter, yet.\n      * Only one use of the standard output may be made; the second\n      * use will result in a fatal error.\n      */\n    bool stdout_used;\n\n    /**\n      * The issue_sequence_warnings instance variable is used to\n      * remember whether or not to issue data sequence warnings when\n      * data records are not in strictly ascending address order.\n      *\n      * Negative means not set from the command line, zero means diabled\n      * from the command line, positive means enabled on the command\n      * line.\n      */\n    int issue_sequence_warnings;\n\n    /**\n      * The get_simple_input method is used to parse an input filename\n      * or generator from the command line.  It shall only be used by\n      * the #get_input method.\n      *\n      * If the parse is unsuccessful (is not present on command\n      * line) a fatal error will be issued and the method call will\n      * not return.\n      */\n    input::pointer get_simple_input();\n\n    /**\n      * The get_endian_by_token method is sued to obtain the endian-ness\n      * of a given token.  This is for when there are big-endian and\n      * little-endian variants of filters and file formats.\n      *\n      * @param tok\n      *     the noken the endien-ness is required for.\n      */\n    endian_t get_endian_by_token(int tok) const;\n\n    /**\n      * The get_endian_by_token method is sued to obtain the endian-ness\n      * of the current token.\n      */\n    endian_t\n    get_endian_by_token(void)\n        const\n    {\n        return get_endian_by_token(token_cur());\n    }\n\n    /**\n      * The get_inclusive_by_token method is used to determine whether\n      * or not a token is inclusive (e.g. token_length_be) or exclusive\n      * (e.g. token_exclusive_length_be).\n      *\n      * @param tok\n      *     The token to examine.\n      */\n    bool get_inclusive_by_token(int tok) const;\n\n    /**\n      * The get_inclusive_by_token method is used to determine whether\n      * or not the current token is inclusive or exclusive.\n      */\n    bool\n    get_inclusive_by_token(void)\n        const\n    {\n        return get_inclusive_by_token(token_cur());\n    }\n\n    /**\n      * The redundant_bytes instance variable is used to remember what\n      * to do when faced with multiple identical byte values for a\n      * memory address.\n      */\n    defcon_t redundant_bytes;\n\n    /**\n      * The vontradivtory_bytes instance variable is used to remember what\n      * to do when faced with multiple different byte values for a\n      * memory address.\n      */\n    defcon_t contradictory_bytes;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    arglex_tool();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    arglex_tool(const arglex_tool &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    arglex_tool &operator=(const arglex_tool &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_ARGLEX_TOOL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cassert>\n#include <cctype>\n#include <cstring>\n#include <cstdio>\n#include <cstdlib>\n#include <errno.h>\n#include <iostream>\n#include <unistd.h>\n\n#include <srecord/arglex.h>\n#include <srecord/progname.h>\n#include <srecord/quit.h>\n#include <srecord/versn_stamp.h>\n\n// Cygwin's mingw has the execvp prototype in the wrong place.\n#ifdef __MSVCRT__\n#include <process.h>\n#endif\n\nstatic const srecord::arglex::table_ty default_table[] =\n{\n    { \"-\",            srecord::arglex::token_stdio,       },\n    { \"-Help\",        srecord::arglex::token_help,        },\n    { \"-LICense\",     srecord::arglex::token_license,     },\n    { \"-Page_Length\", srecord::arglex::token_page_length, },\n    { \"-Page_Width\",  srecord::arglex::token_page_width,  },\n    { \"-TRACIng\",     srecord::arglex::token_tracing,     },\n    { \"-Verbose\",     srecord::arglex::token_verbose,     },\n    { \"-VERSion\",     srecord::arglex::token_version,     },\n    SRECORD_ARGLEX_END_MARKER\n};\n\n\nsrecord::arglex::arglex() :\n    usage_tail_(0)\n{\n    table_set(default_table);\n}\n\n\nsrecord::arglex::arglex(int ac, char **av) :\n    usage_tail_(0)\n{\n    progname_set(av[0]);\n    for (int j = 1; j < ac; ++j)\n    {\n        if (av[j][0] == '@')\n            read_arguments_file(av[j] + 1);\n        else\n            arguments.push_back(av[j]);\n    }\n    table_set(default_table);\n}\n\n\nvoid\nsrecord::arglex::read_arguments_file(const char *filename)\n{\n    FILE *fp = fopen(filename, \"r\");\n    if (!fp)\n        quit_default.fatal_error_errno(\"open \\\"%s\\\"\", filename);\n    for (;;)\n    {\n        int sc = getc(fp);\n        if (sc == EOF)\n            break;\n        unsigned char c = sc;\n\n        //\n        // Ignore white space between words.\n        //\n        if (isspace(c))\n            continue;\n\n        //\n        // Ignore comments\n        //\n        if (c == '#')\n        {\n            for (;;)\n            {\n                sc = getc(fp);\n                if (sc == EOF || sc == '\\n')\n                    break;\n            }\n            continue;\n        }\n        char buffer[1000];\n        char *bp = buffer;\n        for (;;)\n        {\n            if (bp < buffer + sizeof(buffer) - 1)\n                *bp++ = c;\n            sc = getc(fp);\n            if (sc == EOF)\n                break;\n            c = sc;\n            if (isspace(c))\n                break;\n            if (c == '#')\n            {\n                ungetc(c, fp);\n                break;\n            }\n        }\n        *bp = 0;\n        if (buffer[0] == '@')\n            read_arguments_file(buffer + 1);\n        else\n            arguments.push_back(std::string(buffer, bp - buffer));\n    }\n    fclose(fp);\n}\n\n\nsrecord::arglex::~arglex()\n{\n}\n\n\nvoid\nsrecord::arglex::table_set(const table_ty *tp)\n{\n    tables.push_back(tp);\n}\n\n\nstatic const char *partial;\n\n\nbool\nsrecord::arglex::compare(const char *formal, const char *actual)\n{\n    for (;;)\n    {\n        unsigned char ac = *actual++;\n        if (isupper(ac))\n            ac = tolower(ac);\n        unsigned char fc = *formal++;\n        switch (fc)\n        {\n        case 0:\n            return !ac;\n\n        case '_':\n            if (ac == '-')\n                break;\n            // fall through...\n\n        case 'a': case 'b': case 'c': case 'd': case 'e':\n        case 'f': case 'g': case 'h': case 'i': case 'j':\n        case 'k': case 'l': case 'm': case 'n': case 'o':\n        case 'p': case 'q': case 'r': case 's': case 't':\n        case 'u': case 'v': case 'w': case 'x': case 'y':\n        case 'z':\n            //\n            // optional characters\n            //\n            if (ac == fc && compare(formal, actual))\n                return true;\n\n            //\n            // skip forward to next\n            // mandatory character, or after '_'\n            //\n            while (islower(*formal))\n                ++formal;\n            if (*formal == '_')\n            {\n                ++formal;\n                if (ac == '_' || ac == '-')\n                    ++actual;\n            }\n            --actual;\n            break;\n\n        case '*':\n            //\n            // This is incomplete, it should really\n            // check for a match match of the stuff after\n            // the '*', too, a la glob.\n            //\n            if (!ac)\n                return false;\n            partial = actual - 1;\n            return true;\n\n        case '\\\\':\n            if (actual[-1] != *formal++)\n                return false;\n            break;\n\n        case 'A': case 'B': case 'C': case 'D': case 'E':\n        case 'F': case 'G': case 'H': case 'I': case 'J':\n        case 'K': case 'L': case 'M': case 'N': case 'O':\n        case 'P': case 'Q': case 'R': case 'S': case 'T':\n        case 'U': case 'V': case 'W': case 'X': case 'Y':\n        case 'Z':\n            fc = tolower(fc);\n            // fall through...\n\n        default:\n            //\n            // mandatory characters\n            //\n            if (fc != ac)\n                return false;\n            break;\n        }\n    }\n}\n\n\n//\n// NAME\n//      is_a_number\n//\n// SYNOPSIS\n//      int is_a_number(char *s);\n//\n// DESCRIPTION\n//      The is_a_number function is used to determine if the\n//      argument is a number.\n//\n//      The value is placed in arglex_value.alv_number as\n//      a side effect.\n//\n//      Negative and positive signs are accepted.\n//      The C conventions for decimal, octal and hexadecimal are understood.\n//\n//      There may be no white space anywhere in the string,\n//      and the string must end after the last digit.\n//      Trailing garbage will be interpreted to mean it is not a string.\n//\n// ARGUMENTS\n//      s       - string to be tested and evaluated\n//\n// RETURNS\n//      int;    zero if not a number,\n//              non-zero if is a number.\n//\n\nstatic int\nis_a_number(const char *s, long &n)\n{\n    int         sign;\n\n    n = 0;\n    switch (*s)\n    {\n    case '-':\n        ++s;\n        sign = -1;\n        break;\n\n    case '+':\n        ++s;\n        sign = 1;\n        break;\n\n    default:\n        sign = 1;\n        break;\n    }\n    switch (*s)\n    {\n    case '0':\n        if ((s[1] == 'x' || s[1] == 'X') && s[2])\n        {\n            s += 2;\n            for (;;)\n            {\n                switch (*s)\n                {\n                case '0': case '1': case '2': case '3':\n                case '4': case '5': case '6': case '7':\n                case '8': case '9':\n                    n = n * 16 + *s++ - '0';\n                    continue;\n\n                case 'A': case 'B': case 'C':\n                case 'D': case 'E': case 'F':\n                    n = n * 16 + *s++ - 'A' + 10;\n                    continue;\n\n                case 'a': case 'b': case 'c':\n                case 'd': case 'e': case 'f':\n                    n = n * 16 + *s++ - 'a' + 10;\n                    continue;\n                }\n                break;\n            }\n        }\n        else\n        {\n            for (;;)\n            {\n                switch (*s)\n                {\n                case '0': case '1': case '2': case '3':\n                case '4': case '5': case '6': case '7':\n                    n = n * 8 + *s++ - '0';\n                    continue;\n                }\n                break;\n            }\n        }\n        break;\n\n    case '1': case '2': case '3': case '4':\n    case '5': case '6': case '7': case '8': case '9':\n        for (;;)\n        {\n            switch (*s)\n            {\n            case '0': case '1': case '2': case '3':\n            case '4': case '5': case '6': case '7':\n            case '8': case '9':\n                n = n * 10 + *s++ - '0';\n                continue;\n            }\n            break;\n        }\n        break;\n\ndefault:\n        return 0;\n    }\n    if (*s)\n        return 0;\n    n *= sign;\n    return 1;\n}\n\n\nstatic bool\nstarts_with(const std::string &haystack, const std::string &needle)\n{\n    return\n        (\n            haystack.size() >= needle.size()\n        &&\n            0 == memcmp(haystack.c_str(), needle.c_str(), needle.size())\n        );\n}\n\n\nstatic bool\nends_with(const std::string &haystack, const std::string &needle)\n{\n    return\n        (\n            haystack.size() >= needle.size()\n        &&\n            (\n                0\n            ==\n                memcmp\n                (\n                    haystack.c_str() + haystack.size() - needle.size(),\n                    needle.c_str(),\n                    needle.size()\n                )\n            )\n        );\n}\n\n\nstatic void\ndeprecated_warning(const char *deprecated_name, const char *preferred_name)\n{\n    srecord::quit_default.warning\n    (\n        \"option \\\"%s\\\" is deprecated, please use \\\"%s\\\" instead\",\n        deprecated_name,\n        preferred_name\n    );\n}\n\n\n//\n// NAME\n//      arglex\n//\n// SYNOPSIS\n//      int arglex::token_next(void);\n//\n// DESCRIPTION\n//      The arglex function is used to perfom lexical analysis\n//      on the command line arguments.\n//\n//      Unrecognised options are returned as arglex_token_option\n//      for anything starting with a '-', or\n//      arglex_token_string otherwise.\n//\n// RETURNS\n//      The next token in the token stream.\n//      When the end is reached, arglex_token_eoln is returned forever.\n//\n// CAVEAT\n//      Must call arglex_init befor this function is called.\n//\n\nint\nsrecord::arglex::token_next(void)\n{\n    const table_ty  *tp;\n    const table_ty  *hit[20];\n    int             nhit;\n\n    std::string arg;\n    if (!pushback.empty())\n    {\n        //\n        // the second half of a \"-foo=bar\" style argument.\n        //\n        arg = pushback.back();\n        pushback.pop_back();\n    }\n    else\n    {\n        if (arguments.empty())\n        {\n            value_string_ = \"\";\n            token = token_eoln;\n            return token;\n        }\n        arg = arguments.front();\n        arguments.pop_front();\n\n        //\n        // See if it looks like a GNU \"-foo=bar\" option.\n        // Split it at the '=' to make it something the\n        // rest of the code understands.\n        //\n        if (arg[0] == '-' && arg[1] != '=')\n        {\n            const char *eqp = strchr(arg.c_str(), '=');\n            if (eqp)\n            {\n                pushback.push_back(eqp + 1);\n                arg = std::string(arg.c_str(), eqp - arg.c_str());\n            }\n        }\n\n        //\n        // Turn the GNU-style leading \"--\"\n        // into \"-\" if necessary.\n        //\n        if\n        (\n            arg.size() > 2\n        &&\n            arg[0] == '-'\n        &&\n            arg[1] == '-'\n        &&\n            !is_a_number(arg.c_str() + 1, value_number_)\n        )\n            arg = std::string(arg.c_str() + 1);\n    }\n    value_string_ = arg;\n\n    //\n    // see if it is a number\n    //\n    if (is_a_number(arg.c_str(), value_number_))\n    {\n        token = arglex::token_number;\n        return token;\n    }\n\n    //\n    // scan the tables to see what it matches\n    //\n    nhit = 0;\n    partial = 0;\n    for\n    (\n        table_ptr_vec_t::iterator it = tables.begin();\n        it != tables.end();\n        ++it\n    )\n    {\n        for (tp = *it; tp->name; ++tp)\n        {\n            if (compare(tp->name, arg.c_str()))\n                hit[nhit++] = tp;\n\n            // big endian deprecated variants\n            assert(!starts_with(tp->name, \"-Big_Endian_\"));\n            if (ends_with(tp->name, \"_Big_Endian\"))\n            {\n                std::string name2 =\n                    \"-Big_Endian_\" +\n                    std::string(tp->name + 1, strlen(tp->name) - 12);\n                if (compare(name2.c_str(), arg.c_str()))\n                {\n                    hit[nhit++] = tp;\n                    deprecated_warning(name2.c_str(), tp->name);\n                }\n            }\n\n            // little endian deprecated variants\n            assert(!starts_with(tp->name, \"-Little_Endian_\"));\n            if (ends_with(tp->name, \"_Little_Endian\"))\n            {\n                std::string name3 =\n                    \"-Little_Endian_\" +\n                    std::string(tp->name + 1, strlen(tp->name) - 15);\n                if (compare(name3.c_str(), arg.c_str()))\n                {\n                    hit[nhit++] = tp;\n                    deprecated_warning(name3.c_str(), tp->name);\n                }\n            }\n        }\n    }\n\n    //\n    // deal with unknown or ambiguous options\n    //\n    switch (nhit)\n    {\n    case 0:\n        //\n        // not found in the tables\n        //\n        if (value_string_[0] == '-')\n            token = arglex::token_option;\n        else\n            token = arglex::token_string;\n        break;\n\n    default:\n        //\n        // if all the hits are the same, it isn't ambiguous\n        //\n        {\n            bool all_same = true;\n            std::string possibilities = hit[0]->name;\n            for (int k = 1; k < nhit; ++k)\n            {\n                if (hit[0]->token != hit[k]->token)\n                    all_same = false;\n                possibilities += \", \";\n                possibilities += hit[k]->name;\n            }\n            if (!all_same)\n            {\n                fatal_error\n                (\n                    \"option \\\"%s\\\" is ambiguous, did you mean one of: %s?\",\n                    value_string_.c_str(),\n                    possibilities.c_str()\n                );\n                // NOTREACHED\n            }\n        }\n        // fall through...\n\n    case 1:\n        if (partial)\n        {\n            pushback.push_back(partial);\n            partial = 0;\n        }\n        value_string_ = hit[0]->name;\n        token = hit[0]->token;\n        check_deprecated(arg);\n        break;\n    }\n    return token;\n}\n\n\nvoid\nsrecord::arglex::deprecated_option(const std::string &old_fashioned)\n{\n    deprecated_options.push_back(old_fashioned);\n}\n\n\nvoid\nsrecord::arglex::check_deprecated(const std::string &actual)\n    const\n{\n    for\n    (\n        deprecated_options_t::const_iterator it = deprecated_options.begin();\n        it != deprecated_options.end();\n        ++it\n    )\n    {\n        std::string formal = *it;\n        if (compare(formal.c_str(), actual.c_str()))\n        {\n            deprecated_warning(formal.c_str(), token_name(token));\n        }\n    }\n}\n\n\nconst char *\nsrecord::arglex::token_name(int n)\n    const\n{\n    switch (n)\n    {\n    case token_eoln:\n        return \"end of command line\";\n\n    case token_number:\n        return \"number\";\n\n    case token_option:\n        return \"option\";\n\n    case token_stdio:\n        return \"standard input or output\";\n\n    case token_string:\n        return \"string\";\n\n    default:\n        break;\n    }\n    for\n    (\n        table_ptr_vec_t::const_iterator it = tables.begin();\n        it != tables.end();\n        ++it\n    )\n    {\n        for (const table_ty *tp = *it; tp->name; ++tp)\n        {\n            if (tp->token == n)\n                return tp->name;\n        }\n    }\n    return \"unknown command line token\";\n}\n\n\nvoid\nsrecord::arglex::help(const char *name)\n    const\n{\n    if (!name)\n        name = progname_get();\n    const char *cmd[3] = { \"man\", name, 0 };\n    execvp(cmd[0], (char *const *)cmd);\n    std::cerr << cmd[0] << \": \" << strerror(errno) << std::endl;\n    exit(1);\n}\n\n\nvoid\nsrecord::arglex::version(void)\n    const\n{\n    print_version();\n    exit(0);\n}\n\n\nvoid\nsrecord::arglex::license(void)\n    const\n{\n    help(\"srecord::license\");\n}\n\n\nvoid\nsrecord::arglex::bad_argument(void)\n    const\n{\n    switch (token_cur())\n    {\n    case token_string:\n        std::cerr << \"misplaced file name (\\\"\" << value_string()\n            << \"\\\") on command line\" << std::endl;\n        break;\n\n    case token_number:\n        std::cerr << \"misplaced number (\" << value_string()\n            << \") on command line\" << std::endl;\n        break;\n\n    case token_option:\n        std::cerr << \"unknown \\\"\" << value_string() << \"\\\" option\" << std::endl;\n        break;\n\n    case token_eoln:\n        std::cerr << \"command line too short\" << std::endl;\n        break;\n\n    default:\n        std::cerr << \"misplaced \\\"\" << value_string() << \"\\\" option\"\n            << std::endl;\n        break;\n    }\n    usage();\n    // NOTREACHED\n}\n\n\nint\nsrecord::arglex::token_first(void)\n{\n#if 1\n    // We probably don't need to do this all the time.\n    // How do we distinguish Peter's build from a package build?\n    test_ambiguous();\n#endif\n\n    switch (token_next())\n    {\n    default:\n        return token_cur();\n\n    case token_help:\n        if (token_next() != token_eoln)\n            bad_argument();\n        help();\n        break;\n\n    case token_version:\n        if (token_next() != token_eoln)\n            bad_argument();\n        version();\n        break;\n\n    case token_license:\n        if (token_next() != token_eoln)\n            bad_argument();\n        license();\n        break;\n    }\n    exit(0);\n}\n\n\nvoid\nsrecord::arglex::usage_tail_set(const char *s)\n{\n    usage_tail_ = s;\n}\n\n\nconst char *\nsrecord::arglex::usage_tail_get(void)\n    const\n{\n    if (!usage_tail_)\n        usage_tail_ = \"<filename>...\";\n    return usage_tail_;\n}\n\n\nvoid\nsrecord::arglex::usage(void)\n    const\n{\n    std::cerr << \"Usage: \" << progname_get() << \" [ <option>... ] \"\n        << usage_tail_get() << std::endl;\n    std::cerr << \"       \" << progname_get() << \" -Help\" << std::endl;\n    std::cerr << \"       \" << progname_get() << \" -VERSion\" << std::endl;\n    std::cerr << \"       \" << progname_get() << \" -LICense\" << std::endl;\n    exit(1);\n    // NOTREACHED\n}\n\n\nvoid\nsrecord::arglex::default_command_line_processing(void)\n{\n    bad_argument();\n}\n\n\nvoid\nsrecord::arglex::fatal_error(const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    quit_default.fatal_error_v(fmt, ap);\n    // NOTREACHED\n    va_end(ap);\n}\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/arglex.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef LIB_ARGLEX_H\n#define LIB_ARGLEX_H\n\n#include <srecord/format_printf.h>\n\n#include <list>\n#include <vector>\n#include <string>\n\n#define SRECORD_ARGLEX_END_MARKER {0,0}\n\nnamespace srecord {\n\n/**\n  * The arglex class is used to implement a lexical analizer for command\n  * line arguments.  Each comamnd line argument is analized to determine\n  * if it is a number, a string (file name) or an option.\n  */\nclass arglex\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~arglex();\n\n    /**\n      * The \"normal\" command line tokens common to all programs.\n      */\n    enum\n    {\n        token_eoln,\n        token_help,\n        token_license,\n        token_number,\n        token_option,\n        token_page_width,\n        token_page_length,\n        token_stdio,\n        token_string,\n        token_tracing,\n        token_verbose,\n        token_version,\n        token_MAX\n    };\n\n    /**\n      * The value_ty struct is used to represent the value of a\n      * command line argument.\n      */\n    struct value_ty\n    {\n        /**\n          * The literal string value of the token.\n          */\n        const char *alv_string;\n\n        /**\n          * The integer vale of the token.  Only meaningful\n          * for token_number, otherwise zero.\n          */\n        long alv_number;\n    };\n\n    /**\n      * The table_ty struct is used to repesent a row of a\n      * commandline option table, used to match option names with\n      * their corresponding tokens.\n      */\n    struct table_ty\n    {\n        /**\n          * The name of the commen line option.\n          */\n        const char *name;\n\n        /**\n          * The corresponding token.\n          */\n        int token;\n    };\n\n    /**\n      * The fatal_error method may be used to print a fatal error\n      * message, and then exit via the usage() method.\n      *\n      * @param fmt\n      *     The format of the string - it controls the rest of the\n      *     arguments.  See printf(3) for more information.\n      * @note\n      *     This method never returns.\n      */\n    void fatal_error(const char *fmt, ...)                  FORMAT_PRINTF(2, 3);\n\n    /**\n      * The compare class method is used to compare a command line string\n      * with a formal spec of the option, to see if they compare equal.\n      *\n      * The actual is case-insensitive.  Uppercase in the formal means a\n      * mandatory character, while lower case means optional.  Any number of\n      * consecutive optional characters may be supplied by actual, but none\n      * may be skipped, unless all are skipped to the next non-lower-case\n      * letter.\n      *\n      * The underscore (_) is like a lower-case minus, it matches \"\", \"-\"\n      * and \"_\".\n      *\n      * The \"*\" in a pattern matches everything to the end of the line,\n      * anything after the \"*\" is ignored.  The rest of the line is pointed\n      * to by the \"partial\" variable as a side-effect (else it will be 0).\n      * This rather ugly feature is to support \"-I./dir\" type options.\n      *\n      * A backslash in a pattern nominates an exact match required, case\n      * must matche excatly here.  This rather ugly feature is to support\n      * \"-I./dir\" type options.\n      *\n      * For example: \"-project\" and \"-P\" both match \"-Project\", as does\n      * \"-proJ\", but \"-prj\" does not.\n      *\n      * For example: \"-devDir\" and \"-d_d\" both match \"-Development_Directory\",\n      * but \"-dvlpmnt_drctry\" does not.\n      *\n      * For example: to match include path specifications, use a pattern\n      * such as \"-\\\\I*\", and the partial global variable will have the path\n      * in it on return.\n      */\n    static bool compare(const char *formal, const char *actual);\n\n    /**\n      * The abbreviate class method is used to take an option's long\n      * name, and turn it into the minimum possible string for that\n      * option.\n      */\n    static std::string abbreviate(const char *text);\n\n    /**\n      * The test_ambiguous method is for debugging.  It verifies that\n      * all of the option names are unique.\n      */\n    void test_ambiguous(void) const;\n\nprivate:\n    /**\n      * The arguments instance variable is used to remember the\n      * remaining command line arguments.\n      */\n    std::list<std::string> arguments;\n\n    /**\n      * The token instance variable tracks the current token in the\n      * parse sequence.\n      */\n    int token;\n\n    /**\n      * The value_string_ instance variable tracks the value of the\n      * current command line argument.\n      */\n    std::string value_string_;\n\n    /**\n      * The value_number_ instance variable tracks the numeric value\n      * of the current command line argument.  Usually zero unless\n      * the current command line argument is a number.\n      */\n    long value_number_;\n\n    /**\n      * The table_ptr_vec_t type is used to declare the 'tables'\n      * instance variable.  Also used to simplify the code use to\n      * manipulate the 'tables' instance variable.\n     */\n    typedef std::vector<const table_ty *> table_ptr_vec_t;\n\n    /**\n      * The tables instance variable tracks the command line token\n      * tables to be scanned to determine if a command line argument\n      * is a particular token.  There is usually one per derived\n      * class.  Append more tables with the 'table_set' method.\n      */\n    table_ptr_vec_t tables;\n\n    /**\n      * The pushback instance variable tracks command line argument\n      * (or, often, portions of command line arguments) which have\n      * been \"pushed back\" to be re-scanned later.\n      */\n    std::list<std::string> pushback;\n\nprotected:\n    /**\n      * The table_set method is used to append more command line\n      * token tables to the list of tables to be scanned.  Usually one\n      * per derived class.\n      */\n    void table_set(const table_ty *);\n\npublic:\n    /**\n      * The default constructor.\n      */\n    arglex();\n\n    /**\n      * The copy constructor.\n      */\n    arglex(arglex &);\n\n    /**\n      * The normal constructor.  The argv and argv should be those\n      * passed to main().  Not manipulation is required.\n      */\n    arglex(int argc, char **argv);\n\n    /**\n      * The token_cur method is used to get the type of the current\n      * token.\n      */\n    int token_cur() const { return token; }\n\n    /**\n      * The token_next method is used to advance to the next command\n      * line option and determine what type of token it is.\n      * It returns the type of the token; this value may also be\n      * fetched using the token_cur method.\n      */\n    int token_next(void);\n\n    /**\n      * The token_first method is used to fetch the fisrt command\n      * like token (rather than use the token_next method).  This does\n      * standard \"help\" and \"version\" options.\n      */\n    int token_first(void);\n\n    /**\n      * The value_string method is used to get the string value of\n      * the current token.\n      */\n    const std::string &value_string() const { return value_string_; }\n\n    /**\n      * The value_number method is used to get the numeric value of\n      * the current token.\n      */\n    long value_number() const { return value_number_; }\n\n    /**\n      * The token_name method is used to turn a token type number\n      * into an equivalent string.  Useful for some error messages.\n      *\n      * @param tok\n      *     The ID of the token to be named.\n      */\n    const char *token_name(int tok) const;\n\n    /**\n      * The token_name method is used to obtain the name of the current\n      * token.\n      */\n    const char *token_name() const { return token_name(token_cur()); }\n\n    /**\n      * The usage method is used to print a usage summary.\n      * This is a fatal error; this method does not return.\n      */\n    void usage() const;\n\n    /**\n      * The help method is used to print a help message.\n      */\n    void help(const char * = 0) const;\n\n    /**\n      * The version method is used to print a version message.\n      */\n    void version() const;\n\n    /**\n      * The license method is used to print the license conditions\n      * of the program.\n      */\n    void license() const;\n\n    /**\n      * The bad_argument method is used to print an error message\n      * when the current token is inappropriate, then it calls usage,\n      * which exits.  This method does not return.\n      */\n    void bad_argument() const;\n\n    /**\n      * The usage_tail_set method is used to set the end of the\n      * command line to be printed as part of the usage method.\n      */\n    void usage_tail_set(const char *);\n\n    /**\n      * The default_command_line_processing method is used to process\n      * command line arguments not handled by the derived class.\n      */\n    virtual void default_command_line_processing(void);\n\nprivate:\n    /**\n      * The usage_tail_ instance variable tracks the end part of\n      * the command line printed by the 'usage' method.\n      * Defaults to the empty string.\n      */\n    mutable const char *usage_tail_;\n\n    /**\n      * The usage_tail_get method is used to get the tail end of\n      * the command line to be printed by the 'usage' method.\n      */\n    const char *usage_tail_get() const;\n\n    /**\n      * The read_arguments_file method is used to process filename\n      * command line arguments.  The file is read and separated into\n      * space separated words, and each word added to the arguments\n      * instance variable in the appropriate sequence.\n      *\n      * Blank lines are ignored.\n      * Comments (starting with '#' until end of line) are ignored.\n      *\n      * @param filename\n      *     The name of the file (not including the @) to be read.\n      */\n    void read_arguments_file(const char *filename);\n\nprivate:\n    typedef std::list<std::string> deprecated_options_t;\n\n    /**\n      * The deprecated_options instance variable is used to remember the\n      * options that are not to be used any more, so that a warning may\n      * be issued, recommending an appropriate replacement.\n      */\n    deprecated_options_t deprecated_options;\n\n    /**\n      * The check_deprecated method is used to check an actual command\n      * line option agans the list of deprectaed options, and issue a\n      * suitable warning of necessary.\n      *\n      * @param actual_use\n      *     The text given on the command line\n      */\n    void check_deprecated(const std::string &actual_use) const;\n\nprotected:\n    /**\n      * The deprecated_option method is used to nominate option patterns\n      * that are deprected.\n      *\n      * @param formal_name\n      *     The pattern that is deprected.  Must be an entry in one of\n      *     the tables, otherwise users are going to be VERY confused.\n      */\n    void deprecated_option(const std::string &formal_name);\n};\n\n};\n\n#endif // LIB_ARGLEX_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/bitrev.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/bitrev.h>\n\n\nstatic unsigned char table[256] =\n{\n    0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,\n    0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,\n    0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,\n    0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,\n    0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,\n    0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,\n    0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,\n    0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,\n    0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,\n    0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,\n    0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,\n    0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,\n    0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,\n    0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,\n    0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,\n    0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,\n    0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,\n    0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,\n    0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,\n    0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,\n    0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,\n    0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,\n    0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,\n    0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,\n    0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,\n    0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,\n    0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,\n    0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,\n    0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,\n    0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,\n    0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,\n    0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF,\n};\n\n\nunsigned char\nsrecord::bitrev8(unsigned char value)\n{\n    return table[value];\n}\n\n\nunsigned short\nsrecord::bitrev16(unsigned short value)\n{\n    // could make this faster with a table,\n    // but is it worth it?\n    unsigned char hi1(value >> 8);\n    unsigned char lo1(value);\n    unsigned short hi2(bitrev8(lo1));\n    unsigned char lo2(bitrev8(hi1));\n    // hi2 must have same type as return\n    return ((hi2 << 8) | lo2);\n}\n\n\nunsigned long\nsrecord::bitrev24(unsigned long value)\n{\n    unsigned char hi1(value >> 16);\n    unsigned short lo1(value);\n    unsigned long hi2(bitrev16(lo1));\n    unsigned char lo2(bitrev8(hi1));\n    // hi2 must have same type as return\n    return ((hi2 << 8) | lo2);\n}\n\n\nunsigned long\nsrecord::bitrev32(unsigned long value)\n{\n    unsigned short hi1(value >> 16);\n    unsigned short lo1(value);\n    unsigned long hi2(bitrev16(lo1));\n    unsigned short lo2(bitrev16(hi1));\n    // hi2 must have same type as return\n    return ((hi2 << 16) | lo2);\n}\n\n\nunsigned long long\nsrecord::bitrev40(unsigned long long value)\n{\n    unsigned char hi1(value >> 32);\n    unsigned long lo1(value);\n    unsigned long long hi2(bitrev32(lo1));\n    unsigned char lo2(bitrev8(hi1));\n    // hi2 must have same type as return\n    return ((hi2 << 8) | lo2);\n}\n\n\nunsigned long long\nsrecord::bitrev48(unsigned long long value)\n{\n    unsigned short hi1(value >> 32);\n    unsigned long lo1(value);\n    unsigned long long hi2(bitrev32(lo1));\n    unsigned short lo2(bitrev16(hi1));\n    // hi2 must have same type as return\n    return ((hi2 << 16) | lo2);\n}\n\n\nunsigned long long\nsrecord::bitrev56(unsigned long long value)\n{\n    unsigned long hi1(value >> 32);\n    unsigned long lo1(value);\n    unsigned long long hi2(bitrev32(lo1));\n    unsigned long lo2(bitrev24(hi1));\n    // hi2 must have same type as return\n    return ((hi2 << 24) | lo2);\n}\n\n\nunsigned long long\nsrecord::bitrev64(unsigned long long value)\n{\n    unsigned long hi1(value >> 32);\n    unsigned long lo1(value);\n    unsigned long long hi2 = bitrev32(lo1);\n    unsigned long lo2 = bitrev32(hi1);\n    // hi2 must have same type as return\n    return ((hi2 << 32) | lo2);\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/bitrev.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_BITREV_H\n#define SRECORD_BITREV_H\n\nnamespace srecord\n{\n\n/**\n  * The bitrev8 function is used to reverse the order of the bits in an\n  * 8-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned char bitrev8(unsigned char value);\n\n/**\n  * The bitrev16 function is used to reverse the order of the bits in an\n  * 16-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned short bitrev16(unsigned short value);\n\n/**\n  * The bitrev24 function is used to reverse the order of the bits in an\n  * 24-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned long bitrev24(unsigned long value);\n\n/**\n  * The bitrev32 function is used to reverse the order of the bits in an\n  * 32-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned long bitrev32(unsigned long value);\n\n/**\n  * The bitrev40 function is used to reverse the order of the bits in an\n  * 40-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned long long bitrev40(unsigned long long value);\n\n/**\n  * The bitrev48 function is used to reverse the order of the bits in an\n  * 48-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned long long bitrev48(unsigned long long value);\n\n/**\n  * The bitrev56 function is used to reverse the order of the bits in an\n  * 56-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned long long bitrev56(unsigned long long value);\n\n/**\n  * The bitrev64 function is used to reverse the order of the bits in an\n  * 64-bit number.  This function is its own inverse.\n  *\n  * @param value\n  *     The value to be reversed.\n  */\nunsigned long long bitrev64(unsigned long long value);\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_BITREV_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/config.h.in",
    "content": "/* srecord/config.h.in.  Generated from etc/configure.ac by autoheader.  */\n\n/*\n * srecord - manipulate eprom load files\n * Copyright (C) 1998-2002, 2006-2014 Peter Miller\n * Copyright (C) 2014 Scott Finneran\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#ifndef LIB_CONFIG_H\n#define LIB_CONFIG_H\n\n\n/* Set this to be the absolute path of a Bourne shell which understands\n   functions. */\n#undef CONF_SHELL\n\n/* Define to 1 if you have the <boost/shared_ptr.hpp> header file. */\n#undef HAVE_BOOST_SHARED_PTR_HPP\n\n/* Define this symbol if your operating system has a libgcrypt that defines\n   the gcry_md_hd_t symbol. */\n#undef HAVE_GCRY_MD_HD_T\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */\n#undef HAVE_LIBGCRYPT\n\n/* Define this symbol if your operating system has a libgcrypt that supports\n   SHA224. */\n#undef HAVE_LIBGCRYPT_SHA224\n\n/* Define this symbol if your operating system has a libgcrypt that supports\n   WHIRLPOOL. */\n#undef HAVE_LIBGCRYPT_WHIRLPOOL\n\n/* Define to 1 if you have the `gpg-error' library (-lgpg-error). */\n#undef HAVE_LIBGPG_ERROR\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define to 1 if you have the `snprintf' function. */\n#undef HAVE_SNPRINTF\n\n/* Define this symbol if your operating system has support for sparse file\n   seeking. */\n#undef HAVE_SPARSE_LSEEK\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to 1 if you have the `vsnprintf' function. */\n#undef HAVE_VSNPRINTF\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Enable extensions on AIX 3, Interix.  */\n#ifndef _ALL_SOURCE\n# undef _ALL_SOURCE\n#endif\n/* Enable GNU extensions on systems that have them.  */\n#ifndef _GNU_SOURCE\n# undef _GNU_SOURCE\n#endif\n/* Enable threading extensions on Solaris.  */\n#ifndef _POSIX_PTHREAD_SEMANTICS\n# undef _POSIX_PTHREAD_SEMANTICS\n#endif\n/* Enable extensions on HP NonStop.  */\n#ifndef _TANDEM_SOURCE\n# undef _TANDEM_SOURCE\n#endif\n/* Enable general extensions on Solaris.  */\n#ifndef __EXTENSIONS__\n# undef __EXTENSIONS__\n#endif\n\n\n/* Define to 1 if on MINIX. */\n#undef _MINIX\n\n/* Define to 2 if the system does not provide POSIX.1 features except with\n   this defined. */\n#undef _POSIX_1_SOURCE\n\n/* Define to 1 if you need to in order for `stat' and other things to work. */\n#undef _POSIX_SOURCE\n\n\n/*\n * There is more to do, but we need to insulate it from config.status,\n * because it screws up the #undef lines.  They are all implications of\n * the above information, so there is no need for you to edit the file,\n * if you are configuring Aegis manually.\n */\n#include <srecord/config.messy.h>\n\n#endif /* LIB_CONFIG_H */\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/config.messy.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_CONFIG_MESSY_H\n#define SRECORD_CONFIG_MESSY_H\n\n//\n// If gcrypt is too old, there is no point trying to make it work.\n//\n#if defined(HAVE_LIBGCRYPT) && !defined(HAVE_GCRY_MD_HD_T)\n#undef HAVE_LIBGCRYPT\n#endif\n\n//\n// Make sure Solaris includes POSIX extensions.\n//\n#if (defined(__sun) || defined(__sun__) || defined(sun)) && \\\n        (defined(__svr4__) || defined(svr4))\n\n#ifndef _POSIX_C_SOURCE\n#define _POSIX_C_SOURCE 1\n#endif\n\n#ifndef __EXTENSIONS__\n#define __EXTENSIONS__ 1\n#endif\n\n//\n// fix a glitch in Solaris's <sys/time.h>\n// which only show's up when you turn __EXTENSIONS__ on\n//\n#define _timespec timespec      // fix 2.4\n#define _tv_sec tv_sec          // fix 2.5.1\n\n#endif // sun\n\n//\n// Cygwin's mingw mode...\n//\n#if defined(__MSVCRT__)\n#define snprintf _snprintf\n#define vsnprintf _vsnprintf\n#endif\n\n#endif // SRECORD_CONFIG_MESSY_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/crc16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2010, 2012, 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n//\n// Implemented from scratch from\n// \"A painless guide to CRC error detection algorithms\"\n// http://www.repairfaq.org/filipg/LINK/F_crc_v3.html\n//\n// See also http://www.joegeluso.com/software/articles/ccitt.htm (gone)\n//          http://srecord.sourceforge.net/crc16-ccitt.html (duplicate)\n//                         etc/crc16-ccitt.html (in the source tarball).\n//\n// See test/01/t0150a.sh for test vectors.\n//\n\n#include <cstring>\n#include <string>\n\n#include <srecord/bitrev.h>\n#include <srecord/crc16.h>\n#include <srecord/quit.h>\n#include <srecord/sizeof.h>\n\n\n//\n// The Chapter numbers come from Williams, N. (1993) \"A painless guide\n// to CRC error detection algorithms\"\n// http://www.repairfaq.org/filipg/LINK/F_crc_v3.html\n//\n#define IMPL_CH9   9\n#define IMPL_CH10 10\n#define IMPL_CH11 11    // doesn't work yet (i.e. not same results as 9 and 10)\n                        // but it \"almost\" works, according to test/01/t0150a.sh\n\n// So, for now we will be conservative, and use Chapter 10\n#define IMPL IMPL_CH10\n\n\n//\n// Use a seed of 0xFFFF when augmenting manually (i.e. augmenting by 16\n// zero bits by processing two zero bytes at the end of the data), but a\n// seed of 0x1D0F when the augmenting is done by shifting where the XOR\n// appears in the updcrc function.\n//\n// The 0x1D0F value is calculated by using the manual augmentation\n// updcrc function:\n//     updcrc(0, updcrc(0, 0xFFFF))\n//\nstatic unsigned short const ccitt_seed = 0xFFFF;\nstatic unsigned short const broken_seed = 0x84CF;\nstatic unsigned short const xmodem_seed = 0;\n\n\nvoid\nsrecord::crc16::calculate_table(void)\n{\n    if (polynomial == 0)\n        polynomial = polynomial_ccitt;\n    if (bitdir == bit_direction_most_to_least)\n    {\n        for (unsigned b = 0; b < 256; ++b)\n        {\n            unsigned short v = b << 8;\n            for (unsigned j = 0; j < 8; ++j)\n                v = (v & 0x8000) ? ((v << 1) ^ polynomial) : (v << 1);\n            table[b] = v;\n        }\n    }\n    else\n    {\n        polynomial = bitrev16(polynomial);\n        for (unsigned b = 0; b < 256; ++b)\n        {\n            unsigned short v = b;\n            for (unsigned j = 0; j < 8; ++j)\n                v = (v & 1) ? ((v >> 1) ^ polynomial) : (v >> 1);\n            table[b] = v;\n        }\n    }\n}\n\n\nstatic int\nstate_from_seed_mode(srecord::crc16::seed_mode_t seed_mode)\n{\n    switch (seed_mode)\n    {\n    case srecord::crc16::seed_mode_ccitt:\n        return ccitt_seed;\n\n    case srecord::crc16::seed_mode_xmodem:\n        return xmodem_seed;\n\n    case srecord::crc16::seed_mode_broken:\n        return broken_seed;\n    }\n    return ccitt_seed;\n}\n\n\nsrecord::crc16::crc16(\n    seed_mode_t seed_mode,\n    bool a_augment,\n    unsigned short a_polynomial,\n    bit_direction_t a_bitdir\n) :\n    state(state_from_seed_mode(seed_mode)),\n    augment(a_augment),\n    polynomial(a_polynomial),\n    bitdir(a_bitdir)\n{\n#if (IMPL == IMPL_CH11)\n  #if 1\n    // the \"pre-augment\" crc seed\n    state = 0x1D0F;\n  #else\n    // The above nukes the seed value the user may have provided,\n    // making this look more likely:\n    state = updcrc(0, updcrc(0, state));\n  #endif\n#endif\n    calculate_table();\n}\n\n\nsrecord::crc16::crc16(const crc16 &rhs) :\n    state(rhs.state),\n    augment(rhs.augment),\n    polynomial(rhs.polynomial),\n    bitdir(rhs.bitdir)\n{\n    for (size_t j = 0; j < 256; ++j)\n        table[j] = rhs.table[j];\n}\n\n\nsrecord::crc16 &\nsrecord::crc16::operator=(const crc16 &rhs)\n{\n    if (this != &rhs)\n    {\n        state = rhs.state;\n        augment = rhs.augment;\n        polynomial = rhs.polynomial;\n        bitdir = rhs.bitdir;\n        for (size_t j = 0; j < 256; ++j)\n            table[j] = rhs.table[j];\n    }\n    return *this;\n}\n\n\nsrecord::crc16::~crc16()\n{\n}\n\n\n#if (IMPL == IMPL_CH9)\n\n//\n// This is the simplest possible implementation.  It can be used to\n// validate the two following table-driven implementations.\n//\n// See \"A painless guide to CRC error detection algorithms\",\n// Chapter 9, http://www.repairfaq.org/filipg/LINK/F_crc_v33.html#CRCV_001\n// 'A Straightforward CRC Implementation', for an explanation.\n//\n\ninline unsigned short\nsrecord::crc16::updcrc(unsigned char c, unsigned short state)\n    const\n{\n    if (bitdir == bit_direction_most_to_least)\n    {\n        for (unsigned i = 0; i < 8; ++i)\n        {\n            bool xor_flag = !!(state & 0x8000);\n            state <<= 1;\n            if (c & 0x80)\n                state |= 1;\n            if (xor_flag)\n                state ^= polynomial;\n            c <<= 1;\n        }\n    }\n    else\n    {\n        // note: calculate_table() already reversed the bits in the polynomial\n        for (unsigned i = 0; i < 8; ++i)\n        {\n            bool xor_flag = !!(state & 1);\n            state >>= 1;\n            if (c & 1)\n                state |= 0x8000;\n            if (xor_flag)\n                state ^= polynomial;\n            c >>= 1;\n        }\n    }\n    return state;\n}\n\n#endif // IMPL_CH9\n#if (IMPL == IMPL_CH10)\n\n//\n// This version of updcrc doesn't augment automagically, you must\n// do it explicitly in the get() method.  It is a more intuitave\n// implementation than the \"augmentation included\" implementation below.\n//\n// See \"A painless guide to CRC error detection algorithms\",\n// Chapter 10, http://www.repairfaq.org/filipg/LINK/F_crc_v33.html#CRCV_002\n// 'A Table-Driven Implementation', for an explanation.\n//\n\ninline unsigned short\nsrecord::crc16::updcrc(unsigned char c, unsigned short state)\n    const\n{\n    if (bitdir == bit_direction_least_to_most)\n    {\n        return (((state >> 8) & 0xFF) | (c << 8)) ^ table[state & 0xFF];\n    }\n    else\n    {\n        return ((state << 8) | c) ^ table[state >> 8];\n    }\n}\n\n#endif // IMPL_CH10\n#if (IMPL == IMPL_CH11)\n\n//\n// This version of updcrc means that the 16-zero-bit augmentation has\n// already happened.  There is no need to explicitly do it in the get()\n// method.  This is deep voodoo even for folks who actually understand\n// XOR arithmetic.\n//\n// See \"A painless guide to CRC error detection algorithms\",\n// Chapter 11, http://www.repairfaq.org/filipg/LINK/F_crc_v33.html#CRCV_003\n// 'A Slightly Mangled Table-Driven Implementation', for an explanation.\n//\n\ninline unsigned short\nsrecord::crc16::updcrc(unsigned char c, unsigned short state)\n    const\n{\n    if (bitdir == bit_direction_least_to_most)\n        return (state >> 8) ^ table[(state ^ c) & 0xFF];\n    else\n        return (state << 8) ^ table[((state >> 8) ^ c) & 0xFF];\n}\n\n#endif // IMPL_CH11\n\n\nvoid\nsrecord::crc16::next(unsigned char ch)\n{\n    state = updcrc(ch, state);\n}\n\n\nvoid\nsrecord::crc16::nextbuf(const void *data, size_t nbytes)\n{\n    unsigned char *dp = (unsigned char *)data;\n    while (nbytes > 0)\n    {\n        state = updcrc(*dp++, state);\n        --nbytes;\n    }\n}\n\n\nunsigned short\nsrecord::crc16::get(void)\n    const\n{\n#if (IMPL < IMPL_CH11)\n    // The whole idea is that Ch.11 technique is \"pre-auugmented\"\n    if (augment)\n    {\n        return updcrc(0, updcrc(0, state));\n    }\n#endif\n    return state;\n}\n\n\n#include <cstdio>\n\n\nvoid\nsrecord::crc16::print_table(void)\n    const\n{\n    printf(\"/*\\n\");\n    printf\n    (\n        \" * Bit order: %s\\n\",\n        (\n            bitdir == bit_direction_most_to_least\n        ?\n            \"most to least\"\n        :\n            \"least to most\"\n        )\n    );\n    printf(\" * Polynomial: 0x\");\n    if (bitdir == bit_direction_most_to_least)\n        printf(\"%04X\", polynomial);\n    else\n        printf(\"%04X\", bitrev16(polynomial));\n    printf(\"\\n */\\n\");\n    printf(\"const unsigned short table[256] =\\n{\\n\");\n    for (size_t j = 0; j < 256; ++j)\n    {\n        if ((j & 7) == 0)\n            printf(\"    /* %02X */\", int(j));\n        printf(\" 0x%04X,\", table[j]);\n        if ((j & 7) == 7)\n            printf(\"\\n\");\n    }\n    printf(\"};\\n\");\n}\n\n\nint\nsrecord::crc16::polynomial_by_name(const char *name)\n{\n    struct table_t\n    {\n        const char *name;\n        int value;\n    };\n\n    static const table_t table[] =\n    {\n        { \"ansi\", polynomial_ansi },\n        { \"bisync\", polynomial_ansi },\n        { \"bluetooth\", polynomial_ccitt },\n        { \"ccitt\", polynomial_ccitt },\n        { \"dnp\", polynomial_dnp },\n        { \"hdlc\", polynomial_ccitt },\n        { \"ibm\", polynomial_ansi },\n        { \"iec-870\", polynomial_dnp },\n        { \"m-bus\", polynomial_dnp },\n        { \"modbus\", polynomial_ansi },\n        { \"scsi-dif\", polynomial_t10_dif },\n        { \"sd\", polynomial_ccitt },\n        { \"t10-dif\", polynomial_t10_dif },\n        { \"usb\", polynomial_ansi },\n        { \"v.41\", polynomial_ccitt },\n        { \"x.25\", polynomial_ccitt },\n        { \"x3.28\", polynomial_ansi },\n        { \"xmodem\", polynomial_ccitt },\n    };\n\n    std::string names;\n    for (const table_t *tp = table; tp < ENDOF(table); ++tp)\n    {\n        if (0 == strcasecmp(name, tp->name))\n            return tp->value;\n        if (!names.empty())\n            names += \", \";\n        names += tp->name;\n    }\n\n    quit_default.fatal_error\n    (\n        \"CRC-16 polynomial name \\\"%s\\\" unknown (known names are %s)\",\n        name,\n        names.c_str()\n    );\n    return polynomial_ccitt;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/crc16.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n// See http://www.joegeluso.com/software/articles/ccitt.htm for a great\n// write-up on the CRC16 calculation.\n//\n\n#ifndef SRECORD_CRC16_H\n#define SRECORD_CRC16_H\n\n#include <stddef.h>\n\nnamespace srecord\n{\n\n/**\n  * The crc16 class is used to represent the running value of a 16-bit\n  * cyclic redundancy check of series of bytes.\n  *\n  * Note: this CRC16 works for systems that process the leaast\n  * significant bit of each byte first, and working to wards the most\n  * significant bit.\n  *\n  * If you were expecting MSB first (you may not even know it) this\n  * code will give you \"wrong\" answers.  Try using the bitrev filter.\n  */\nclass crc16\n{\npublic:\n    // See http://en.wikipedia.org/wiki/Cyclic_redundancy_check\n    // for table of polynomials.\n    enum\n    {\n        /**\n          * X.25, V.41, HDLC, XMODEM, Bluetooth, SD, CRC-CCITT\n          */\n        polynomial_ccitt = 0x1021,\n\n        /**\n          * CRC-16-IBM, Bisync, Modbus, USB, ANSI X3.28, CRC-16-ANSI\n          */\n        polynomial_ansi = 0x8005,\n\n        /**\n          * CRC-16-DNP, DNP, IEC 870, M-Bus\n          */\n        polynomial_dnp = 0x3D65,\n\n        /**\n          * CRC-16-DECT\n          */\n        polynomial_dect = 0x0589,\n\n        /**\n          * CRC-16-T10-DIF, SCSI DIF\n          */\n        polynomial_t10_dif = 0x8BB7,\n    };\n\n    /**\n      * The polynomial_by_name class method is used to take the name\n      * of a CRC-16 polynamlial, and return the value of the CRC-16\n      * polynomial corresponding to that name.\n      */\n    static int polynomial_by_name(const char *name);\n\n    enum seed_mode_t\n    {\n        seed_mode_ccitt,\n        seed_mode_xmodem,\n        seed_mode_broken\n    };\n\n    /**\n      * The destructor.\n      */\n    virtual ~crc16();\n\n    enum bit_direction_t\n    {\n        bit_direction_most_to_least,\n        bit_direction_least_to_most,\n    };\n\n    /**\n      * The default constructor.\n      *\n      * @param seed_mode\n      *     This selects which CRC16 calculation seed is to be used.\n      * @param augment\n      *     This is true if the 16-zero-bit augmentation is desired.\n      *     This is the default.  False if no augmentation is desired.\n      * @param polynomial\n      *     The checksum polynomial.\n      * @param bitdir\n      *     The direction of bits in a characters as they pass through\n      *     the algorithm.\n      */\n    crc16(seed_mode_t seed_mode = seed_mode_ccitt, bool augment = true,\n        unsigned short polynomial = polynomial_ccitt,\n        bit_direction_t bitdir = bit_direction_most_to_least);\n\n    /**\n      * The copy constructor.\n      */\n    crc16(const crc16 &);\n\n    /**\n      * The assignment operator.\n      */\n    crc16 &operator=(const crc16 &);\n\n    /**\n      * The get method is used to obtain the running value of the cyclic\n      * redundancy check.\n      */\n    unsigned short get() const;\n\n    /**\n      * The next method is used to advance the state by one byte.\n      */\n    void next(unsigned char);\n\n    /**\n      * The nextbuf method is used to advance the state by a series of bytes.\n      */\n    void nextbuf(const void *, size_t);\n\n    /**\n      * The print_table method may be used to print the table being used.\n      * This is principally for debugging the table generation process.\n      */\n    void print_table(void) const;\n\nprivate:\n    /**\n      * The state instance variable is used to remember the running\n      * value of the 16-bit cyclic redundancy check.\n      */\n    unsigned short state;\n\n    /**\n      * The augment instance variable is used to remember whether or\n      * not the 16 zero bits of augmentation are to be processed before\n      * reporting the result.\n      */\n    bool augment;\n\n    /**\n      * The polynomial instance variable is used to remember the CRC\n      * polynomial being calculated with.  Note that if the bitdir is\n      * low-to-high then the bits in the polynomial will be reversed.\n      */\n    unsigned short polynomial;\n\n    /**\n      * The bitdir instance variable is sued to remember the direction\n      * of bits in a characters as they pass through the algorithm.\n      */\n    bit_direction_t bitdir;\n\n    /**\n      * The table instance variable is used to remember the results of 8\n      * shift-and-process operations for each byte value.  This is used\n      * to improve efficiency.  It is filled in the the #calculate_table\n      * method, called from the constructor.\n      */\n    unsigned short table[256];\n\n    /**\n      * The calculate_table method is called by the constructor to fill\n      * in the #table instance variable.\n      */\n    void calculate_table(void);\n\n    /**\n      * The updcrc method is to add another byte of data to the running\n      * CRC state.  It is called by the #next and next_buf methods.\n      */\n    inline unsigned short updcrc(unsigned char c, unsigned short state) const;\n};\n\n};\n\n#endif // SRECORD_CRC16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/crc32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n// (I got this copy from http://www.gator.net/~garyg/C/CONTRIB/SNIP/\n// but as always on the Internet, it is now gone.  So use the\n//      Wayback Machine, http://www.archive.org/, or google for \"crc_32\"\n//      and you should find it fairly quickly.  The same code also\n//      appears in the ZModem sources, as well, but they seem to abuse\n//      it slightly, and the way they initialize and terminate the CRC\n//      doesn't give the same answers as the way everyone else uses it.)\n//\n// 32 BIT ANSI X3.66 CRC checksum\n//\n// This class may be used to compute the 32-bit CRC used as the frame\n// check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 and\n// FED-STD-1003, the U.S. versions of CCITT's X.25 link-level protocol).\n// The 32-bit FCS was added via the Federal Register, 1 June 1982,\n// p.23798.  I presume but don't know for certain that this polynomial\n// is or will be included in CCITT V.41, which defines the 16-bit CRC\n// (often called CRC-CCITT) polynomial.  FIPS PUB 78 says that the\n// 32-bit FCS reduces otherwise undetected errors by a factor of 10^-5\n// over 16-bit FCS.\n//\n\n\n#include <srecord/crc32.h>\n\n\nstatic unsigned long ccitt_seed = 0xFFFFFFFF;\nstatic unsigned long xmodem_seed = 0;\n\n\n//\n// Portions of the code in this file are derived from code which is\n// \"Copyright (C) 1986 Gary S. Brown.  You may use this program, or\n// code or tables extracted from it, as desired without restriction.\"\n//\n// First, the polynomial itself and its table of feedback terms.  The\n// polynomial is\n// X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0\n// Note that we take it \"backwards\" and put the highest-order term in\n// the lowest-order bit.  The X^32 term is \"implied\"; the LSB is the\n// X^31 term, etc.  The X^0 term (usually shown as \"+1\") results in\n// the MSB being 1.\n//\n#define POLYNOMIAL 0xedb88320\n\n//\n// Note that the usual hardware shift register implementation, which\n// is what we're using (we're merely optimizing it by doing eight-bit\n// chunks at a time) shifts bits into the lowest-order term.  In our\n// implementation, that means shifting towards the right.  Why do we\n// do it this way?  Because the calculated CRC must be transmitted in\n// order from highest-order term to lowest-order term.  UARTs transmit\n// characters in order from LSB to MSB.  By storing the CRC this way,\n// we hand it to the UART in the order low-byte to high-byte; the UART\n// sends each low-bit to hight-bit; and the result is transmission bit\n// by bit from highest- to lowest-order term without requiring any bit\n// shuffling on our part.  Reception works similarly.\n//\n// The feedback terms table consists of 256, 32-bit entries.\n//\n// The values must be right-shifted by eight bits by the \"UPDC32\"\n// logic; the shift must be unsigned (bring in zeroes).\n//\n\nstatic unsigned long table[256];\n\n\nstatic void\ncalculate_table()\n{\n    for (unsigned b = 0; b < 256; ++b)\n    {\n        unsigned long v = b;\n        int i = 8;\n        for (; --i >= 0; )\n            v = (v & 1) ? ((v >> 1) ^ POLYNOMIAL) : (v >> 1);\n        table[b] = v;\n    }\n}\n\n\nstatic unsigned long\ninitial_state_from_seed_mode(srecord::crc32::seed_mode_t seed_mode)\n{\n    switch (seed_mode)\n    {\n    case srecord::crc32::seed_mode_ccitt:\n        return ccitt_seed;\n\n    case srecord::crc32::seed_mode_xmodem:\n        return xmodem_seed;\n    }\n    return ccitt_seed;\n}\n\n\nsrecord::crc32::crc32(seed_mode_t seed_mode) :\n    state(initial_state_from_seed_mode(seed_mode))\n{\n    if (!table[1])\n        calculate_table();\n}\n\n\nsrecord::crc32::crc32(const crc32 &arg) :\n    state(arg.state)\n{\n}\n\n\nsrecord::crc32 &\nsrecord::crc32::operator=(const crc32 &arg)\n{\n    if (this != &arg)\n    {\n        state = arg.state;\n    }\n    return *this;\n}\n\n\nsrecord::crc32::~crc32()\n{\n}\n\n\nstatic inline unsigned long\nUPDC32(unsigned char octet, unsigned long crc)\n{\n    // The original code had this as a #define\n    return table[(crc ^ octet) & 0xFF] ^ (crc >> 8);\n}\n\n\nvoid\nsrecord::crc32::next(unsigned char x)\n{\n    state = UPDC32(x, state);\n}\n\n\nvoid\nsrecord::crc32::nextbuf(const void *data, size_t nbytes)\n{\n    const unsigned char *dp = (const unsigned char *)data;\n    while (nbytes > 0)\n    {\n        state = UPDC32(*dp, state);\n        ++dp;\n        --nbytes;\n    }\n}\n\n\nunsigned long\nsrecord::crc32::get()\n    const\n{\n#if 1\n    return ~state;\n#else\n    //\n    // The crc_32.c program floating around on the Internet prints\n    // two numbers.  The first is calculated as follows (the second\n    // is the CRC as returned 5 lines back).  It appears to be an\n    // attempt to embed the crc into the data, and tell you what\n    // the CRC should be if you calculate the CRC over the data and\n    // the CRC.  However, it makes the assumption that you store\n    // the CRC little-endian, and it doesn't do the final bit-not.\n    //\n    // To simulate this (or something very much like it) try\n    //      srecord::cat <file> -lecrc32 <addr> -lecrc32 <addr+4>\n    //\n    unsigned long temp = state;\n    temp = UPDC32( ~state    & 0xFF, temp);\n    temp = UPDC32((~state >>  8) & 0xFF, temp);\n    temp = UPDC32((~state >> 16) & 0xFF, temp);\n    temp = UPDC32((~state >> 24) & 0xFF, temp);\n    return temp; // I wonder why this isn't bit-not-ed?\n#endif\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/crc32.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_CRC32_H\n#define SRECORD_CRC32_H\n\n#include <stddef.h>\n\nnamespace srecord\n{\n\n/**\n  * The crc32 class is used to represent the running value of a 32-bit\n  * cyclic redundancy check of series of bytes.\n  */\nclass crc32\n{\npublic:\n    enum seed_mode_t\n    {\n        seed_mode_ccitt, // all ones\n        seed_mode_xmodem // all zero\n    };\n\n    /**\n      * The destructor.\n      */\n    virtual ~crc32();\n\n    /**\n      * The default constructor.\n      */\n    crc32(seed_mode_t seed_mode = seed_mode_ccitt);\n\n    /**\n      * The copy constructor.\n      */\n    crc32(const crc32 &);\n\n    /**\n      * The assignment operator.\n      */\n    crc32 &operator=(const crc32 &);\n\n    /**\n      * The get method is used to obtain the running value of the cyclic\n      * redundancy check.\n      */\n    unsigned long get() const;\n\n    /**\n      * The next method is used to advance the state by one byte.\n      */\n    void next(unsigned char);\n\n    /**\n      * The nextbuf method is used to advance the state by a series of bytes.\n      */\n    void nextbuf(const void *, size_t);\n\nprivate:\n    /**\n      * The state instance variable is used to remember the running\n      * value of the 32-bit cyclic redundancy check.\n      */\n    unsigned long state;\n};\n\n};\n\n#endif // SRECORD_CRC32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/defcon.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdlib>\n#include <cstring>\n\n#include <srecord/defcon.h>\n#include <srecord/sizeof.h>\n\n\nconst char *\nsrecord::text_from_defcon(defcon_t x)\n{\n    switch (x)\n    {\n    default:\n    case defcon_ignore:\n        return \"ignore\";\n\n    case defcon_warning:\n        return \"warning\";\n\n    case defcon_fatal_error:\n        return \"error\";\n    }\n}\n\n\nstruct table_t\n{\n    const char *name;\n    srecord::defcon_t value;\n};\n\n\nstatic const table_t table[] =\n{\n    // Keep this table in strcmp(3) order\n    // suitable vim command: 'a,'b! LANG=C sort\n    { \"error\", srecord::defcon_fatal_error },\n    { \"fatal\", srecord::defcon_fatal_error },\n    { \"ignore\", srecord::defcon_ignore },\n    { \"none\", srecord::defcon_ignore },\n    { \"nothing\", srecord::defcon_ignore },\n    { \"warn\", srecord::defcon_warning },\n    { \"warning\", srecord::defcon_warning },\n};\n\n\nstatic int\ncompare(const void *va, const void *vb)\n{\n    const table_t *a = (const table_t *)va;\n    const table_t *b = (const table_t *)vb;\n    return strcmp(a->name, b->name);\n}\n\n\nint\nsrecord::defcon_from_text(const char *text)\n{\n    table_t key = { text, defcon_ignore };\n    table_t *tp =\n        (table_t *)\n        bsearch(&key, table, SIZEOF(table), sizeof(table_t), compare);\n    if (!tp)\n        return -1;\n    return tp->value;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/defcon.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_DEFCON_H\n#define SRECORD_DEFCON_H\n\nnamespace srecord {\n\n\nenum defcon_t\n{\n    defcon_ignore,\n    defcon_warning,\n    defcon_fatal_error\n};\n\n\nconst char *text_from_defcon(defcon_t x);\nint defcon_from_text(const char *text);\n\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_DEFCON_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/endian/decode_word.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/endian.h>\n\n\nunsigned short\nsrecord::decode_word_le(const unsigned char *data)\n{\n    return (data[0] | (data[1] << 8));\n}\n\n\nunsigned short\nsrecord::decode_word_be(const unsigned char *data)\n{\n    return ((data[0] << 8) | data[1]);\n}\n\n\nunsigned short\nsrecord::endian_decode_word(const unsigned char *data, endian_t order)\n{\n    return\n        (\n            order == endian_little\n        ?\n            decode_word_le(data)\n        :\n            decode_word_be(data)\n        );\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/endian.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/endian.h>\n\n\nconst char *\nsrecord::endian_to_string(endian_t x)\n{\n    switch (x)\n    {\n    case endian_big:\n        return \"big-endian\";\n\n    case endian_little:\n        return \"little-endian\";\n    }\n    return \"?\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/endian.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_ENDIAN_H\n#define SRECORD_ENDIAN_H\n\nnamespace srecord\n{\n\nenum endian_t\n{\n    endian_big,\n    endian_little\n};\n\n/**\n  * The endian_to_string function may be used to convert an endian value\n  * into its string equivalent.\n  *\n  * @param x\n  *     The value to convert\n  * @returns\n  *     a C string\n  */\nconst char *endian_to_string(endian_t x);\n\n/**\n  * The decode_word_be function is used to decode a big-endian 2-byte\n  * data buffer into an unsigned short value.\n  *\n  * @param data\n  *     The data to be decoded\n  */\nunsigned short decode_word_be(const unsigned char *data);\n\n/**\n  * The decode_word_le function is used to decode a little-endian 2-byte\n  * data buffer into an unsigned short value.\n  *\n  * @param data\n  *     The data to be decoded\n  */\nunsigned short decode_word_le(const unsigned char *data);\n\n/**\n  * The decode_word_le function is used to decode a little-endian 2-byte\n  * data buffer into an unsigned short value.\n  *\n  * @param data\n  *     The data to be decoded\n  * @param order\n  *     The order of the bytes to be decoded.\n  */\nunsigned short endian_decode_word(const unsigned char *data, endian_t order);\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_ENDIAN_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/fletcher16.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cassert>\n\n#include <srecord/fletcher16.h>\n\n//\n// http://en.wikipedia.org/wiki/Fletcher%27s_checksum\n// RFC 1146\n// RFC 905 Annex B\n//\n\n\nsrecord::fletcher16::~fletcher16()\n{\n}\n\n\nsrecord::fletcher16::fletcher16(\n    unsigned char a_sum1,\n    unsigned char a_sum2,\n    int a_answer,\n    endian_t a_end\n) :\n    sum1(a_sum1),\n    sum2(a_sum2),\n    answer(a_answer),\n    end(a_end)\n{\n    // because 0 == 255 mod 255, adjust accordingly\n    if (sum1 == 0xFF)\n        sum1 = 0;\n    if (sum2 == 0xFF)\n        sum2 = 0;\n    if (answer >= 0)\n    {\n        if ((answer & 0x00FF) == 0x00FF)\n            answer &= 0xFF00;\n        if ((answer & 0xFF00) == 0xFF00)\n            answer &= 0x00FF;\n    }\n}\n\n\nsrecord::fletcher16::fletcher16(const fletcher16 &rhs) :\n    sum1(rhs.sum1),\n    sum2(rhs.sum2),\n    answer(rhs.answer),\n    end(rhs.end)\n{\n}\n\n\nsrecord::fletcher16 &\nsrecord::fletcher16::operator=(const fletcher16 &rhs)\n{\n    if (this != &rhs)\n    {\n        sum1 = rhs.sum1;\n        sum2 = rhs.sum2;\n        answer = rhs.answer;\n        end = rhs.end;\n    }\n    return *this;\n}\n\n\nvoid\nsrecord::fletcher16::next(unsigned char ch)\n{\n    // reduction step to reduce sums to 8 bits\n    sum1 += ch;\n    sum2 += sum1;\n    sum1 = (sum1 & 0xFF) + (sum1 >> 8);\n    sum2 = (sum2 & 0xFF) + (sum2 >> 8);\n}\n\n\nvoid\nsrecord::fletcher16::nextbuf(const void *vdata, size_t nbytes)\n{\n    //\n    // A few tricks, well-known to implementors of the IP checksum, are\n    // used here for efficiency:\n    //\n    // * This reduces to the range 1..255 rather than 0..254.  Modulo\n    //   255, the values 255 = 0xFF and 0 are equivalent, but it is easier\n    //   to detect overflow if the former convention is used.  This also\n    //   provides the guarantee that the resultant checksum will never\n    //   be zero, so that value is available for a special flag, such as\n    //   \"checksum not yet computed\".\n    //\n    // * 256 = 1 mod 255, so the end-around carry expression (x &\n    //   0xFF) + (x >> 8) reduces x modulo 255.  Only doing it once is not\n    //   guaranteed to be complete, but it will be less than 0x1fe.  A\n    //   second repetition guarantees a fully reduced sum in the range of\n    //   1..255.\n    //\n    // * This uses a 16-bit accumulator to perform a number of sums\n    //   before doing any modular reduction. The magic value 21 is the\n    //   largest number of sums that can be performed without numeric\n    //   overflow in 16 bits. Any smaller value is also permissible; 16\n    //   may be convenient in many cases.\n    //\n    const unsigned char *data = (const unsigned char *)vdata;\n    size_t len = nbytes;\n    while (len)\n    {\n        size_t tlen = len > 21 ? 21 : len;\n        len -= tlen;\n        for (;;)\n        {\n            sum1 += *data++;\n            sum2 += sum1;\n            --tlen;\n            if (!tlen)\n                break;\n        }\n        sum1 = (sum1 & 0xFF) + (sum1 >> 8);\n        sum2 = (sum2 & 0xFF) + (sum2 >> 8);\n    }\n    // Second reduction step to reduce sums to 8 bits\n    sum1 = (sum1 & 0xFF) + (sum1 >> 8);\n    sum2 = (sum2 & 0xFF) + (sum2 >> 8);\n}\n\n\nunsigned short\nsrecord::fletcher16::get()\n    const\n{\n    //\n    // An empty \"answer\" on command line defaults to answer == -1\n    // so, in this case, don't calculate adjusted sums.\n    //\n    if (answer >= 0)\n    {\n        //\n        // Adjust checksum so it results in \"answer\" when the checksum\n        // itself is included in firmware's fletcher sum.  Typical final\n        // value would be 0x0000 so firmware's fletcher result of zero\n        // indicates good eprom when adjusted sum place in last two\n        // bytes of eeprom.  (Note: 0xFF in final byte (f1 or f2) is\n        // equivalent to 0x00 due to modulo 255 arithmetic.)\n        //\n        unsigned char f2;\n        unsigned char f1;\n        if (end == endian_big)\n        {\n            f1 = answer >> 8;\n            f2 = answer;\n        }\n        else\n        {\n            f1 = answer;\n            f2 = answer >> 8;\n        }\n\n#if 1\n        // The following code assumes sum1a and sum2a are 16-bits, or\n        // more.  If you make them char or unsigned char, you will get\n        // the wrong answer.\n        unsigned short sum1a = sum1;\n        unsigned short sum2a = sum2;\n\n        int tmp = int(f2) - int(f1) - int(sum2a) - int(sum1a);\n        tmp = (tmp & 0xff) + (tmp >> 8);\n        sum2a = f1 - sum1a - tmp;\n        sum2a = (sum2a & 0xff) + (sum2a >> 8);\n        sum1a = tmp;\n\n        return (((sum1a & 0xFF) << 8) | (sum2a & 0xFF));\n#else\n        // exhaustive search\n        for (unsigned short c1 = 0; c1 < 256; ++c1)\n        {\n            unsigned short sum1a = sum1 + c1;\n            unsigned short sum2a = sum2 + sum1a;\n            sum1a = (sum1a & 0xFF) + (sum1a >> 8);\n            sum2a = (sum2a & 0xFF) + (sum2a >> 8);\n\n            for (unsigned short c2 = 0; c2 < 256; ++c2)\n            {\n\n                unsigned short sum1b = sum1a + c2;\n                unsigned short sum2b = sum2a + sum1b;\n                sum1b = (sum1b & 0xFF) + (sum1b >> 8);\n                sum2b = (sum2b & 0xFF) + (sum2b >> 8);\n\n                sum1b &= 0xFF;\n                sum2b &= 0xFF;\n\n                if (f1 == sum1b && f2 == sum2b)\n                    return ((sum1b << 8) | sum2b);\n            }\n        }\n        // This is common when one or both of f1 and f2 are zero.\n        assert(!\"exhaustive search failed\");\n#endif\n    }\n\n    return (((sum1 & 0xFF) << 8) | (sum2 & 0xFF));\n}\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/fletcher16.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_FLETCHER16_H\n#define SRECORD_FLETCHER16_H\n\n#include <cstddef>\n\n#include <srecord/endian.h>\n\nnamespace srecord\n{\n\n/**\n  * The fletcher16 class is used to represent the running value of a 16-bit\n  * Fletcher's Checksum of series of bytes.\n  *\n  * http://en.wikipedia.org/wiki/Fletcher%27s_checksum\n  *\n  * Fletcher's checksum is one of several types of checksum algorithms,\n  * which are relatively simple processes used by computers to check the\n  * integrity of data.\n  *\n  * The implementation of the Fletcher-32 is very similar to the Adler-32\n  * algorithm but several differences should be noted. Fletcher wraps around\n  * at modulo 65535 while Adler wraps at the prime 65521. In other words,\n  * Fletcher adds overflow bits (16-31) into its sum; while Adler multiplies\n  * those bits by 15, then adds the product into its sum. Fletcher-32 works\n  * on 16 bit data while Adler works on 8 bit data.\n  *\n  * It is designed to overcome some of the inadequacies of simply summing\n  * all the bytes as in the original checksum. Fletcher's checksum, unlike\n  * the original checksum, can detect the inserting/deleting of zero value\n  * bytes, the reordering of bytes, and the incrementing and decrementing of\n  * bytes in opposite directions.\n  *\n  * Fletcher's checksum is described in RFC 1146. You can also find\n  * information about generating (as well as verifying) such a checksum in\n  * Annex B of RFC 905.\n  *\n  * Fletcher-32 is slightly more reliable than Adler-32.[1]\n  */\nclass fletcher16\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~fletcher16();\n\n    /**\n      * The default constructor.\n      *\n      * @param sum1\n      *     The seed value for sum1.  Defaults to 0xFF.\n      * @param sum2\n      *     The seed value for sum2.  Defaults to 0xFF.\n      * @param answer\n      *     Set this to -1 to be completely ignored.\n      *     If >= 0, this is the desired outcome if the checksum\n      *     includes the checksum itself.  The checksum returned will be\n      *     calculated to return this desired outcome, when traversed,\n      *     rather than a pure Fletcher-16 checksum.\n      * @param end\n      *     The endian-ness of the checksum.  This is needed to\n      *     manipulate the answer.  Ignored if #answer is ignored.\n      */\n    fletcher16(unsigned char sum1 = 0, unsigned char sum2 = 0,\n        int answer = -1, endian_t end = endian_little);\n\n    /**\n      * The copy constructor.\n      */\n    fletcher16(const fletcher16 &);\n\n    /**\n      * The assignment operator.\n      */\n    fletcher16 &operator=(const fletcher16 &);\n\n    /**\n      * The get method is used to obtain the running value of the cyclic\n      * redundancy check.\n      */\n    unsigned short get() const;\n\n    /**\n      * The next method is used to advance the state by one byte.\n      */\n    void next(unsigned char);\n\n    /**\n      * The nextbuf method is used to advance the state by a series of bytes.\n      *\n      * @param data\n      *     The data to be checksummed.\n      * @param data_size\n      *     The size of the data to be checksummed, in bytes.\n      */\n    void nextbuf(const void *data, size_t data_size);\n\nprivate:\n    /**\n      * The sum1 instance variable is used to remember the running sum\n      * of the 8-bit bytes, mod 255.  We use a 16-bit value rather than\n      * an 8-bit value for convenience, see #nextbuf implementation for\n      * details.\n      */\n    unsigned short sum1;\n\n    /**\n      * The sum2 instance variable is used to remember the running\n      * sum of the sum of the 8-bit bytes, mod 255.  We use a 16-bit\n      * value rather than an 8-bit value for convenience, see #nextbuf\n      * implementation for details.\n      */\n    unsigned short sum2;\n\n    /**\n      * The anser instance variable is used to remember the desired\n      * outcome if the checksum includes the checksum itself.\n      *\n      * Set this to -1 to be completely ignored.\n      *\n      * If >= 0, this is the desired outcome if the checksum includes\n      * the checksum itself.  The checksum returned will be calculated\n      * to return this desired outcome, when traversed, rather than a\n      * pure Fletcher-16 checksum.\n      */\n    int answer;\n\n    /**\n      * The end instance variable is used to remember the endian-ness of\n      * the checksum.  This is needed to manipulate the answer.  Ignored\n      * if #answer is ignored.\n      */\n    endian_t end;\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_FLETCHER16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/fletcher32.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/fletcher32.h>\n\n\nsrecord::fletcher32::~fletcher32()\n{\n}\n\n\nsrecord::fletcher32::fletcher32() :\n    sum1(0xFFFF),\n    sum2(0xFFFF)\n{\n    // See notes in the nextbuf() method, below.\n}\n\n\nsrecord::fletcher32::fletcher32(const fletcher32 &rhs) :\n    sum1(rhs.sum1),\n    sum2(rhs.sum2)\n{\n}\n\n\nsrecord::fletcher32 &\nsrecord::fletcher32::operator=(const fletcher32 &rhs)\n{\n    if (this != &rhs)\n    {\n        sum1 = rhs.sum1;\n        sum2 = rhs.sum2;\n    }\n    return *this;\n}\n\n\nvoid\nsrecord::fletcher32::next(unsigned char x)\n{\n    sum1 += x;\n    sum2 += sum1;\n    // reduction step to reduce sums to 16 bits\n    sum1 = (sum1 & 0xFFFF) + (sum1 >> 16);\n    sum2 = (sum2 & 0xFFFF) + (sum2 >> 16);\n}\n\n\nvoid\nsrecord::fletcher32::nextbuf(const void *vdata, size_t nbytes)\n{\n    //\n    // A few tricks, well-known to implementors of the IP checksum, are\n    // used here for efficiency:\n    //\n    // * This reduces to the range 1..65535 rather than 0..65534.\n    // Modulo 65535, the values 65535 = 0xFFFF and 0 are equivalent, but\n    // it is easier to detect overflow if the former convention is used.\n    // This also provides the guarantee that the resultant checksum will\n    // never be zero, so that value is available for a special flag,\n    // such as \"checksum not yet computed\".\n    //\n    // * 65536 ≡ 1 mod 65535, so the end-around carry expression (x\n    // & 0xFFFF) + (x >> 16) reduces x modulo 65535.  Only doing it\n    // once is not guaranteed to be complete, but it will be less than\n    // 0x1FFFE.  A second repetition guarantees a fully reduced sum in\n    // the range of 1..65535.\n    //\n    // * This uses a 32-bit accumulator to perform a number of sums\n    // before doing any modular reduction.  The magic value 360 is the\n    // largest number of sums that can be performed without numeric\n    // overflow.  Any smaller value is also permissible; 256 may be\n    // convenient in many cases.\n    //\n    const unsigned char *data = (const unsigned char *)vdata;\n    size_t len = nbytes;\n    while (len)\n    {\n        unsigned tlen = len > 360 ? 360 : len;\n        len -= tlen;\n        for (;;)\n        {\n            sum1 += *data++;\n            sum2 += sum1;\n            --tlen;\n            if (!tlen)\n                break;\n        }\n        sum1 = (sum1 & 0xFFFF) + (sum1 >> 16);\n        sum2 = (sum2 & 0xFFFF) + (sum2 >> 16);\n    }\n    // Second reduction step to reduce sums to 16 bits\n    sum1 = (sum1 & 0xFFFF) + (sum1 >> 16);\n    sum2 = (sum2 & 0xFFFF) + (sum2 >> 16);\n}\n\n\nunsigned long\nsrecord::fletcher32::get()\n    const\n{\n    return ((sum2 << 16) | sum1);\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/fletcher32.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_FLETCHER32_H\n#define SRECORD_FLETCHER32_H\n\n#include <stddef.h>\n\nnamespace srecord\n{\n\n/**\n  * The fletcher32 class is used to represent the running value of a 32-bit\n  * Fletcher's Checksum of a series of bytes.\n  *\n  * http://en.wikipedia.org/wiki/Fletcher%27s_checksum\n  *\n  * Fletcher's checksum is one of several types of checksum algorithms,\n  * which are relatively simple processes used by computers to check the\n  * integrity of data.\n  *\n  * The implementation of the Fletcher-32 is very similar to the Adler-32\n  * algorithm but several differences should be noted. Fletcher wraps around\n  * at modulo 65535 while Adler wraps at the prime 65521. In other words,\n  * Fletcher adds overflow bits (16-31) into its sum; while Adler multiplies\n  * those bits by 15, then adds the product into its sum. Fletcher-32 works\n  * on 16 bit data while Adler works on 8 bit data.\n  *\n  * It is designed to overcome some of the inadequacies of simply summing\n  * all the bytes as in the original checksum. Fletcher's checksum, unlike\n  * the original checksum, can detect the inserting/deleting of zero value\n  * bytes, the reordering of bytes, and the incrementing and decrementing of\n  * bytes in opposite directions.\n  *\n  * Fletcher's checksum is described in RFC 1146. You can also find\n  * information about generating (as well as verifying) such a checksum in\n  * Annex B of RFC 905.\n  *\n  * Fletcher-32 is slightly more reliable than Adler-32.[1]\n  */\nclass fletcher32\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~fletcher32();\n\n    /**\n      * The default constructor.\n      */\n    fletcher32();\n\n    /**\n      * The copy constructor.\n      */\n    fletcher32(const fletcher32 &);\n\n    /**\n      * The assignment operator.\n      */\n    fletcher32 &operator=(const fletcher32 &);\n\n    /**\n      * The get method is used to obtain the running value of the cyclic\n      * redundancy check.\n      */\n    unsigned long get() const;\n\n    /**\n      * The next method is used to advance the state by one byte.\n      */\n    void next(unsigned char);\n\n    /**\n      * The nextbuf method is used to advance the state by a series of bytes.\n      */\n    void nextbuf(const void *, size_t);\n\nprivate:\n    /**\n      * The sum1 instance variable is used to remember the sum of the bytes.\n      */\n    unsigned long sum1;\n\n    /**\n      * The sum2 instance variable is used to remember the sum of the\n      * sum of the bytes.\n      */\n    unsigned long sum2;\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_FLETCHER32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/format_printf.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_FORMAT_PRINTF_H\n#define SRECORD_FORMAT_PRINTF_H\n\n#ifdef __GNUC__\n#define FORMAT_PRINTF(x, y) __attribute__((__format__(printf, x, y)))\n#define NORETURN __attribute__((__noreturn__))\n#define DEPRECATED __attribute__((__deprecated__))\n#else\n#define FORMAT_PRINTF(x, y)\n#define DEPRECATED\n#define NORETURN\n#endif\n\n#endif // SRECORD_FORMAT_PRINTF_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/catenate.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/catenate.h>\n#include <srecord/record.h>\n\n\nsrecord::input_catenate::~input_catenate()\n{\n}\n\n\nsrecord::input_catenate::input_catenate(const pointer &a1, const pointer &a2) :\n    in1(a1),\n    in2(a2)\n{\n    assert(!!in1);\n    assert(!!in2);\n}\n\n\nsrecord::input::pointer\nsrecord::input_catenate::create(const pointer &a1, const pointer &a2)\n{\n    return pointer(new srecord::input_catenate(a1, a2));\n}\n\n\nbool\nsrecord::input_catenate::read(srecord::record &record)\n{\n    while (in1)\n    {\n        bool ok = in1->read(record);\n        if (!ok)\n        {\n            in1.reset();\n            break;\n        }\n        switch (record.get_type())\n        {\n        case srecord::record::type_unknown:\n        case srecord::record::type_data_count:\n            break;\n\n        default:\n            return true;\n        }\n    }\n    for (;;)\n    {\n        bool ok = in2->read(record);\n        if (!ok)\n            return false;\n        switch (record.get_type())\n        {\n        case srecord::record::type_unknown:\n        case srecord::record::type_data_count:\n            break;\n\n        default:\n            return true;\n        }\n    }\n}\n\n\nstd::string\nsrecord::input_catenate::filename()\n    const\n{\n    return (in1 ? in1 : in2)->filename();\n}\n\n\nstd::string\nsrecord::input_catenate::filename_and_line()\n    const\n{\n    return (in1 ? in1 : in2)->filename_and_line();\n}\n\n\nconst char *\nsrecord::input_catenate::get_file_format_name()\n    const\n{\n    return (in1 ? in1 : in2)->get_file_format_name();\n}\n\n\nvoid\nsrecord::input_catenate::disable_checksum_validation()\n{\n    if (in1)\n        in1->disable_checksum_validation();\n    in2->disable_checksum_validation();\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/catenate.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_CATENATE_H\n#define SRECORD_INPUT_CATENATE_H\n\n#include <srecord/input.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_catenate class is used to represent an input source\n  * which presents two inoput sources af if they were a single input\n  * source.\n  */\nclass input_catenate:\n    public input\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_catenate();\n\nprivate:\n    /**\n      * The constructor.\n      * It is private on purpose, use the #create class method instead.\n      *\n      * @param in1\n      *     The first of the inputs to be read.\n      * @param in2\n      *     The second of the inputs to be read.\n      */\n    input_catenate(const pointer &in1, const pointer &in2);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param in1\n      *     The first of the inputs to be read.\n      * @param in2\n      *     The second of the inputs to be read.\n      */\n    static pointer create(const pointer &in1, const pointer &in2);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    std::string filename() const;\n\n    // See base class for documentation.\n    std::string filename_and_line() const;\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\n    // See base class for documentation.\n    void disable_checksum_validation();\n\nprivate:\n    /**\n      * The in1 instance variable is used to remember the first of the\n      * inputs to be read.\n      */\n    pointer in1;\n\n    /**\n      * The in2 instance variable is used to remember the second of the\n      * inputs to be read.\n      */\n    pointer in2;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_catenate();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_catenate(const input_catenate &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_catenate &operator=(const input_catenate &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_CATENATE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/aomf.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004-2008, 2010-2013 Peter Miller\n// Copyright (C) 2014 Scott Finneran\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/aomf.h>\n#include <srecord/record.h>\n\n\n#define O96_Mod_Hdr                             0x02\n#define O96_Mod_End                             0x04\n#define O96_Content                             0x06\n#define O96_Lin_Num                             0x08\n#define O96_Block_Def                           0x0a\n#define O96_Block_End                           0x0c\n#define O96_Eof                                 0x0e\n#define O96_Mod_Anc                             0x10\n#define O96_Loc_Sym                             0x12\n#define O96_Type_Def                            0x14\n#define O96_Pub_Def                             0x16\n#define O96_Ext_Def                             0x18\n#define O96_Res_Type_1A                         0x1a\n#define O96_Res_Type_1C                         0x1c\n#define O96_Res_Type_1E                         0x1e\n#define O96_Seg_Def                             0x20\n#define O96_Fixup                               0x22\n#define O96_Res_Type_24                         0x24\n#define O96_Lib_Mod_Loc                         0x26\n#define O96_Lib_Mod_Nam                         0x28\n#define O96_Lib_Dic                             0x2a\n#define O96_Res_Type_2C                         0x2c\n#define O96_Lib_Hdr                             0x2e\n#define O96_Res_Type_30                         0x30\n#define O96_Res_Type_32                         0x32\n#define O96_Max_Rec_Type                        0x32\n\nstatic const char *\no96name(int x)\n{\n    switch (x)\n    {\n    case O96_Mod_Hdr:\n        return \"Mod_Hdr\";\n\n    case O96_Mod_End:\n        return \"Mod_End\";\n\n    case O96_Content:\n        return \"Content\";\n\n    case O96_Lin_Num:\n        return \"Lin_Num\";\n\n    case O96_Block_Def:\n        return \"Block_Def\";\n\n    case O96_Block_End:\n        return \"Block_End\";\n\n    case O96_Eof:\n        return \"Eof\";\n\n    case O96_Mod_Anc:\n        return \"Mod_Anc\";\n\n    case O96_Loc_Sym:\n        return \"Loc_Sym\";\n\n    case O96_Type_Def:\n        return \"Type_Def\";\n\n    case O96_Pub_Def:\n        return \"Pub_Def\";\n\n    case O96_Ext_Def:\n        return \"Ext_Def\";\n\n    case O96_Seg_Def:\n        return \"Seg_Def\";\n\n    case O96_Fixup:\n        return \"Fixup\";\n\n    case O96_Lib_Mod_Loc:\n        return \"Lib_Mod_Loc\";\n\n    case O96_Lib_Mod_Nam:\n        return \"Lib_Mod_Nam\";\n\n    case O96_Lib_Dic:\n        return \"Lib_Dic\";\n\n    case O96_Lib_Hdr:\n        return \"Lib_Hdr\";\n    }\n    return \"unknown\";\n}\n\n\nsrecord::input_file_aomf::~input_file_aomf()\n{\n    if (current_buffer)\n        delete [] current_buffer;\n}\n\n\nsrecord::input_file_aomf::input_file_aomf(const std::string &a_filename) :\n    srecord::input_file(a_filename),\n    current_buffer(0),\n    current_length(0),\n    current_maximum(0),\n    current_pos(0),\n    current_address(0),\n    state(expecting_header)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_aomf::create(const std::string &a_filename)\n{\n    return pointer(new srecord::input_file_aomf(a_filename));\n}\n\n\nint\nsrecord::input_file_aomf::get_byte()\n{\n    int c = get_char();\n    if (c < 0)\n        fatal_error(\"premature end-of-file\");\n    checksum_add(c);\n    return c;\n}\n\n\nint\nsrecord::input_file_aomf::slurp()\n{\n    current_pos = 0;\n    current_length = 0;\n    if (peek_char() < 0)\n        return -1;\n    checksum_reset();\n    int type = get_byte();\n    size_t length = get_word_le();\n    if (length == 0)\n        fatal_error(\"invalid record length\");\n    --length; // includes checksum byte\n    if (length > current_maximum)\n    {\n        if (current_buffer)\n            delete [] current_buffer;\n        while (current_maximum < length)\n            current_maximum = current_maximum * 2 + 64;\n        current_buffer = new unsigned char [current_maximum];\n    }\n    current_length = length;\n    for (size_t j = 0; j < length; ++j)\n        current_buffer[j] = get_byte();\n    get_byte();\n    if (use_checksums() && checksum_get() != 0)\n        fatal_error(\"checksum mismatch\");\n    return type;\n}\n\n\nbool\nsrecord::input_file_aomf::read(srecord::record &record)\n{\n    for (;;)\n    {\n        unsigned char c;\n        switch (state)\n        {\n        case expecting_header:\n            if (slurp() != O96_Mod_Hdr)\n                fatal_error(\"Module Header Record expected\");\n            state = expecting_data;\n            if (current_length > 0)\n            {\n                unsigned nbytes = current_buffer[0];\n                // should be exactly (current_length-3)\n                if (nbytes > current_length - 1)\n                    nbytes = current_length - 1;\n                record =\n                    srecord::record\n                    (\n                        srecord::record::type_header,\n                        0, // address\n                        current_buffer + 1,\n                        nbytes\n                    );\n            }\n            else\n                record = srecord::record(srecord::record::type_header, 0, 0, 0);\n            current_length = 0;\n            return true;\n\n        case expecting_eof:\n            if (slurp() >= 0)\n                fatal_error(\"end-of-file expected\");\n            return false;\n\n        case expecting_data:\n            if (current_pos < current_length)\n            {\n                size_t nbytes = current_length - current_pos;\n                if (nbytes > srecord::record::max_data_length)\n                    nbytes = srecord::record::max_data_length;\n                record =\n                    srecord::record\n                    (\n                        srecord::record::type_data,\n                        current_address,\n                        current_buffer + current_pos,\n                        nbytes\n                    );\n                current_pos += nbytes;\n                current_address += nbytes;\n                return true;\n            }\n            c = slurp();\n            switch (c)\n            {\n            case O96_Mod_Hdr:\n                fatal_error(\"too many Module Header Records\");\n\n            case O96_Mod_End:\n                state = expecting_eof;\n                break;\n\n            case O96_Content:\n                if (current_length < 3)\n                    fatal_error(\"malformed Content Record\");\n                current_address =\n                    (\n                        // strictly speaking, this byte should be ignored\n                        ((unsigned long)current_buffer[0] << 16)\n                    |\n                        // length is little-endian\n                        ((unsigned long)current_buffer[2] << 8)\n                    |\n                        ((unsigned long)current_buffer[1])\n                    );\n                current_pos = 3;\n                break;\n\n            case 0x01:\n            case 0x0E:\n            case O96_Loc_Sym:\n            case O96_Pub_Def:\n            case O96_Ext_Def:\n            case O96_Mod_Anc:\n                // Ignore these silently\n                current_length = 0;\n                break;\n\n            default:\n                // Nothing else should be in an AOMF file,\n                // even though it may be valid in an OMF file.\n                warning(\"ignoring %s record (type 0x%02X)\", o96name(c), c);\n                current_length = 0;\n                break;\n            }\n            break;\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_aomf::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_aomf::get_file_format_name()\n    const\n{\n    return \"Intel Absolute Object Module Format (AOMF)\";\n}\n\n\nint\nsrecord::input_file_aomf::format_option_number(void)\n    const\n{\n    return arglex_tool::token_aomf;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/aomf.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_AOMF_H\n#define SRECORD_INPUT_FILE_AOMF_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_aomf class is used to parse Intel Absolute Object\n  * Module Format (AOMF) file.\n  */\nclass input_file_aomf:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_aomf();\n\nprivate:\n    /**\n      * The constructor.  The input is read from the named file (or\n      * the standard input if the file name is \"-\"). It is private on\n      * purpose, use the \"create\" class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_aomf(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The get_byte method is used to fetch a byte of input, and\n      * update the checksum.  We over-ride the base implementation,\n      * because we use raw bytes rather than two hex digits.\n      */\n    int get_byte(void);\n\n    /**\n      * The current_buffer instance variable is used to remember the\n      * base of an array which buffers the current input record.\n      */\n    unsigned char *current_buffer;\n\n    /**\n      * The current_length instance variable is used to remember\n      * the length of the current record.  It is zero if there is no\n      * \"current\" record.\n      */\n    size_t current_length;\n\n    /**\n      * The current_maximum instance variable is used to remember the\n      * length of the current_buffer array.  It is zero if there is no\n      * \"current\" buffer.\n      */\n    size_t current_maximum;\n\n    /**\n      * The current_pos instance variable is used to remember the\n      * position within the current_buffer array.\n      */\n    size_t current_pos;\n\n    /**\n      * The current_address instance variable is used to track the\n      * load address of the current record.  It is updated each time\n      * we return a partial block, so that we alsoways return the\n      * correct load address.\n      */\n    unsigned long current_address;\n\n    enum state_t\n    {\n        expecting_header,\n        expecting_data,\n        expecting_eof\n    };\n\n    /**\n      * The state instance variable is used to remember what to expect\n      * next from the file.\n      */\n    state_t state;\n\n    /**\n      * The slurp method is used to fill the current_buffer array,\n      * and set the current_length.\n      */\n    int slurp(void);\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_aomf(const input_file_aomf &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_aomf &operator=(const input_file_aomf &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_AOMF_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ascii_hex.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2005-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/ascii_hex.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_ascii_hex::~input_file_ascii_hex()\n{\n    // check termination?\n}\n\n\nsrecord::input_file_ascii_hex::input_file_ascii_hex(\n    const std::string &a_filename\n) :\n    input_file(a_filename),\n    garbage_warning(false),\n    seen_some_input(false),\n    address(0),\n    state(state_initial)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_ascii_hex::create(const std::string &a_filename)\n{\n    return pointer(new input_file_ascii_hex(a_filename));\n}\n\n\nbool\nsrecord::input_file_ascii_hex::read_inner(record &result)\n{\n    if (state == state_ignore)\n        return false;\n\n    if (state == state_initial)\n    {\n        for (;;)\n        {\n            int c = get_char();\n            if (c < 0)\n            {\n                state = state_ignore;\n                return false;\n            }\n            if (c == 2)\n            {\n                state = state_body;\n                break;\n            }\n            if (!garbage_warning)\n            {\n                warning(\"ignoring garbage lines\");\n                garbage_warning = true;\n            }\n        }\n    }\n\n    for (;;)\n    {\n        int c = peek_char();\n        if (c < 0)\n        {\n            return false;\n        }\n        if (isxdigit(c))\n        {\n            unsigned char c = get_byte();\n            result = record(record::type_data, address, &c, 1);\n            int sep = get_char();\n            if (sep >= 0 && !isspace((unsigned char)sep))\n                fatal_error(\"not execution character\");\n            ++address;\n            switch (peek_char())\n            {\n            case '\\'':\n            case ',':\n            case '%':\n            case ' ':\n                // The documentation calls these an \"execution\" character.\n                // Strictly speaking, the space isn't optional.\n                get_char();\n                break;\n            }\n            return true;\n        }\n        c = get_char();\n        switch (c)\n        {\n        case 3:\n            state = state_ignore;\n            return false;\n\n        case ' ':\n        case '\\t':\n        case '\\r':\n        case '\\n':\n        case '\\f':\n            break;\n\n        default:\n            fatal_error(\"illegal character\");\n\n        case '$':\n            int command = get_char();\n            unsigned long value = 0;\n            for (;;)\n            {\n                value = (value << 4) + get_nibble();\n                int c = get_char();\n                if (c == ',' || c == '.')\n                    break;\n                get_char_undo(c);\n            }\n            switch (command)\n            {\n            default:\n                fatal_error(\"unknown command\");\n\n            case 'A':\n                address = value;\n                break;\n\n            case 'S':\n                if (use_checksums())\n                {\n                    unsigned short chk1 = checksum_get16();\n                    unsigned short chk2 = value & 0xFFFF;\n                    if (chk1 != chk2)\n                    {\n                        fatal_error\n                        (\n                            \"checksum mismatch (%4.4X != %4.4X)\",\n                            chk1,\n                            chk2\n                        );\n                    }\n                }\n                break;\n            }\n            break;\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_ascii_hex::read(record &result)\n{\n    if (!read_inner(result))\n    {\n        if (!seen_some_input)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_ascii_hex::get_file_format_name()\n    const\n{\n    return \"Ascii Hex\";\n}\n\n\nint\nsrecord::input_file_ascii_hex::format_option_number(void)\n    const\n{\n    return arglex_tool::token_ascii_hex;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ascii_hex.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_ASCII_HEX_H\n#define SRECORD_INPUT_FILE_ASCII_HEX_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_ascii_hex class is used to repesent the parse\n  * state when reading an Ascii-Hex format input file.\n  */\nclass input_file_ascii_hex:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_ascii_hex();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_ascii_hex(const std::string &file_name);\n\n    /**\n      * The read_inner method is used to read a single record from\n      * the file.  The read method calls it.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The garbage_warning instance variable is used to remember whether\n      * a warning has already been issued if the file contains garbage.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * any data has been seen in the input to date.\n      */\n    bool seen_some_input;\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the input file, so it may be associated with data bytes.\n      */\n    unsigned long address;\n\n    /**\n      * The state instance variable is used to remember what state the\n      * input is in at present.\n      */\n    enum { state_initial, state_body, state_ignore } state;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_ascii_hex();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_ascii_hex(const input_file_ascii_hex &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_ascii_hex &operator=(const input_file_ascii_hex &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_ASCII_HEX_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/atmel_generic.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2006-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/atmel_generic.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_atmel_generic::~input_file_atmel_generic()\n{\n}\n\n\nsrecord::input_file_atmel_generic::input_file_atmel_generic(\n        const std::string &a_file_name, endian_t a_end) :\n    srecord::input_file(a_file_name),\n    seen_some_input(false),\n    end(a_end)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_atmel_generic::create_be(const std::string &a_file_name)\n{\n    return create(a_file_name, endian_big);\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_atmel_generic::create(const std::string &a_file_name,\n    endian_t a_end)\n{\n    return pointer(new srecord::input_file_atmel_generic(a_file_name, a_end));\n}\n\n\nbool\nsrecord::input_file_atmel_generic::read_inner(srecord::record &record)\n{\n    if (peek_char() < 0)\n        return false;\n\n    int address = get_3bytes_be();\n    if (get_char() != ':')\n        fatal_error(\"colon expected\");\n    unsigned char data[2];\n    if (end == endian_big)\n    {\n        data[1] = get_byte();\n        data[0] = get_byte();\n    }\n    else\n    {\n        data[0] = get_byte();\n        data[1] = get_byte();\n    }\n    if (get_char() != '\\n')\n        fatal_error(\"end of line expected\");\n\n    record = srecord::record(srecord::record::type_data, address * 2, data, 2);\n    return true;\n}\n\n\nbool\nsrecord::input_file_atmel_generic::read(srecord::record &record)\n{\n    if (!read_inner(record))\n    {\n        if (!seen_some_input)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_atmel_generic::get_file_format_name()\n    const\n{\n    return\n        (\n            end == endian_big\n        ?\n            \"Atmel Generic (big-endian)\"\n        :\n            \"Atmel Generic (little-endian)\"\n        );\n}\n\n\nint\nsrecord::input_file_atmel_generic::format_option_number(void)\n    const\n{\n    return\n        (\n            end == endian_big\n        ?\n            arglex_tool::token_atmel_generic_be\n        :\n            arglex_tool::token_atmel_generic_le\n        );\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/atmel_generic.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_ATMEL_GENERIC_H\n#define SRECORD_INPUT_FILE_ATMEL_GENERIC_H\n\n#include <srecord/endian.h>\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_atmel_generic class is used to represent the\n  * parse stat of an Atmel Genric formatted file.\n  */\nclass input_file_atmel_generic:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_atmel_generic();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create_be(const std::string &file_name);\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @param end\n      *     The endian-ness of the file\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name,\n        endian_t end = endian_big);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * the constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @param end\n      *     The byte order.\n      */\n    input_file_atmel_generic(const std::string &file_name, endian_t end);\n\n    /**\n      * The read_inner method is used to read a single record form\n      * the file.  The read method is a wrapper around it.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The seen_some_input instance variable is used to remember whther\n      * any input data has been seen to date.\n      */\n    bool seen_some_input;\n\n    /**\n      * The end instance variable is used to remember whether the\n      * input is big endian or little endian.\n      */\n    endian_t end;\n\n    /**\n      * The deafult constructor.  Do not use.\n      */\n    input_file_atmel_generic();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_atmel_generic(const input_file_atmel_generic &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_atmel_generic &operator=(const input_file_atmel_generic &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_ATMEL_GENERIC_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/binary.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/binary.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_binary::~input_file_binary()\n{\n}\n\n\nsrecord::input_file_binary::input_file_binary(const std::string &a_file_name) :\n    srecord::input_file(a_file_name),\n    address(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_binary::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_binary(a_file_name));\n}\n\n\nbool\nsrecord::input_file_binary::read(srecord::record &record)\n{\n#ifdef HAVE_SPARSE_LSEEK\n    //\n    // On Solaris, they have a couple of new lseek whences in order to\n    // navigate around holes in the file data.\n    //\n    //     fpathconf(fd, _PC_MIN_HOLE_SIZE);\n    //     lseek(fd, address, SEEK_DATA);\n    //     lseek(fd, address, SEEK_HOLE);\n    //\n    // Using these, it would be possible to actually report file holes\n    // via the srecord API.\n    //\n#endif\n\n    int c = get_char();\n    if (c < 0)\n        return false;\n    int length = 0;\n    unsigned char data[srecord::record::max_data_length];\n    for (;;)\n    {\n        data[length++] = c;\n        if (length >= (int)sizeof(data))\n            break;\n        c = get_char();\n        if (c < 0)\n            break;\n    }\n    record = srecord::record(srecord::record::type_data, address, data, length);\n    address += length;\n    return true;\n}\n\n\nbool\nsrecord::input_file_binary::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_binary::get_file_format_name()\n    const\n{\n    return \"Binary\";\n}\n\n\nint\nsrecord::input_file_binary::format_option_number(void)\n    const\n{\n    return arglex_tool::token_binary;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/binary.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_BINARY_H\n#define SRECORD_INPUT_FILE_BINARY_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_binary class is used to represent the parse\n  * state of a binary input stream.\n  */\nclass input_file_binary:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_binary();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See nase class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_binary(const std::string &file_name);\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the file.\n      */\n    unsigned long address;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_binary();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_binary(const input_file_binary &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_binary &operator=(const input_file_binary &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_BINARY_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/brecord.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/brecord.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_brecord::~input_file_brecord()\n{\n}\n\n\nsrecord::input_file_brecord::input_file_brecord(\n    const std::string &a_file_name\n) :\n    input_file(a_file_name),\n    seen_some_input(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_brecord::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_brecord(a_file_name));\n}\n\n\nbool\nsrecord::input_file_brecord::read_inner(record &result)\n{\n    if (peek_char() < 0)\n        return false;\n\n    unsigned long address = get_4bytes_be();\n    unsigned char length = get_byte();\n    if (length & 0x20)\n        fatal_error(\"read mode not supported\");\n    length &= 0x1F;\n    unsigned char data[32];\n    for (unsigned j = 0; j < length; ++j)\n        data[j] = get_byte();\n    if (get_char() != '\\n')\n        fatal_error(\"end of line expected\");\n\n    if (length == 0)\n    {\n        result = record(record::type_execution_start_address, address, 0, 0);\n    }\n    else\n    {\n        result = record(record::type_data, address, data, length);\n    }\n    return true;\n}\n\n\nbool\nsrecord::input_file_brecord::read(record &result)\n{\n    if (!read_inner(result))\n    {\n        if (!seen_some_input)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_brecord::get_file_format_name(void)\n    const\n{\n    return \"Motorola MC68EZ328 bootstrap b-record\";\n}\n\n\nint\nsrecord::input_file_brecord::format_option_number(void)\n    const\n{\n    return arglex_tool::token_brecord;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/brecord.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_BRECORD_H\n#define SRECORD_INPUT_FILE_BRECORD_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_brecord class is used to represent the parse\n  * state of a Motorola MC68EZ328 bootstrap b-record format input file.\n  */\nclass input_file_brecord:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_brecord();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_brecord(const std::string &file_name);\n\n    /**\n      * The read_inner method is used to read a record from the file.\n      * The read method is a wrapper around it.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * or not any data has been seen from this file to date.\n      */\n    bool seen_some_input;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_brecord();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_brecord(const input_file_brecord &);\n\n    /**\n      * The assigmne toperator.  Do not use.\n      */\n    input_file_brecord &operator=(const input_file_brecord &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_BRECORD_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/cosmac.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/cosmac.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_cosmac::~input_file_cosmac()\n{\n}\n\n\nsrecord::input_file_cosmac::input_file_cosmac(const std::string &a_file_name) :\n    input_file(a_file_name),\n    state('\\n'),\n    address(0),\n    seen_some_input(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_cosmac::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_cosmac(a_file_name));\n}\n\n\nbool\nsrecord::input_file_cosmac::read(record &result)\n{\n    for (;;)\n    {\n        int c = get_char();\n        switch (state)\n        {\n        case '\\n':\n            // want another command\n            if (c < 0)\n            {\n                if (!seen_some_input)\n                    fatal_error(\"file contains no data\");\n                return false;\n            }\n            if (c != '!')\n            {\n                format_error:\n                fatal_error(\"format error\");\n                // NOTREACHED\n            }\n            state = c;\n            break;\n\n        case '!':\n            // want the 2nd half of \"!M\"\n            if (c != 'M')\n                goto format_error;\n            state = c;\n            break;\n\n        case 'M':\n            // either we want an address, or we want a simicolon (an\n            // address will follow a semicolon)\n            if (c == ';')\n            {\n                state = c;\n                continue;\n            }\n            if (c == ' ')\n                continue;\n\n            address = 0;\n            for (int n = 0; ; ++n)\n            {\n                // Check the length of the address.  The RCA Cosmac only\n                // had 16-bit addresses, but we'll allow 32.\n                if (n >= 8)\n                    goto format_error;\n\n                get_char_undo(c);\n                address = (address << 4) + get_nibble();\n                c = get_char();\n                switch (c)\n                {\n                default:\n                    continue;\n\n                case ' ':\n                case ',':\n                    state = c;\n                    break;\n                }\n                break;\n            }\n\n        case ';':\n            if (c < 0)\n                goto format_error;\n            if (c == '\\n')\n                state = 'M';\n            break;\n\n        case ',':\n            if (c < 0)\n                goto format_error;\n            if (c == '\\n')\n                state = ' ';\n            break;\n\n        case ' ':\n            if (c == ';' || c == ',' || c == '\\n' || c == ' ')\n            {\n                state = c;\n                continue;\n            }\n            get_char_undo(c);\n            unsigned char data = get_byte();\n            result = record(record::type_data, address, &data, 1);\n            ++address;\n            seen_some_input = true;\n            return true;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_cosmac::get_file_format_name()\n    const\n{\n    return \"RCA Cosmac\";\n}\n\n\nint\nsrecord::input_file_cosmac::format_option_number(void)\n    const\n{\n    return arglex_tool::token_cosmac;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/cosmac.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_COSMAC_H\n#define SRECORD_INPUT_FILE_COSMAC_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_cosmac class is used to represent the parse\n  * state when reading an RCS Cosmac formatted file.\n  */\nclass input_file_cosmac:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_cosmac();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_cosmac(const std::string &file_name);\n\n    /**\n      * The state instance variable is used to remember where we are in\n      * parsing the !M command.\n      *\n      *   \\n  no command seen yet\n      *   !   have seen the ! character\n      *   M   have seen the !M characters, want an address\n      *   sp  have seen !Maaaa, want data bytes\n      *   ,   have seen , charcter, discarding to \\n, then resume sp state\n      *   ;   have seen , charcter, discarding to \\n, then resume M state\n      */\n    char state;\n\n    /**\n      * The address instance variable is used to remember what address\n      * we are up to in the input.\n      */\n    unsigned long address;\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * the file has any contents or not.\n      */\n    bool seen_some_input;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_cosmac();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_cosmac(const input_file_cosmac &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_cosmac &operator=(const input_file_cosmac &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_COSMAC_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/dec_binary.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2005-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/dec_binary.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_dec_binary::~input_file_dec_binary()\n{\n}\n\n\nsrecord::input_file_dec_binary::input_file_dec_binary(\n        const std::string &a_file_name) :\n    srecord::input_file(a_file_name),\n    current_pos(0),\n    current_length(0),\n    current_address(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_dec_binary::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_dec_binary(a_file_name));\n}\n\n\nbool\nsrecord::input_file_dec_binary::skip_nul()\n{\n    for (;;)\n    {\n        int c = peek_char();\n        if (c < 0)\n            return false;\n        if (c)\n            return true;\n        get_char();\n    }\n}\n\n\nint\nsrecord::input_file_dec_binary::get_byte()\n{\n    int c = get_char();\n    if (c < 0)\n        fatal_error(\"premature end-of-file\");\n    checksum_add(c);\n    return c;\n}\n\n\nbool\nsrecord::input_file_dec_binary::read(srecord::record &record)\n{\n    //\n    // The records in the file are much larger than SRecord usually\n    // handles, so we keep track of where we are within the current\n    // record.  When we run out, we go on to the next one.\n    //\n    if (current_pos >= current_length)\n    {\n        if (current_length)\n        {\n            // Verify the checksum at end of the record.\n            get_byte();\n            if (use_checksums() && checksum_get())\n            {\n                fatal_error(\"checksum mismatch (%02X)\", checksum_get());\n            }\n        }\n        current_pos = 0;\n        current_length = 0;\n        current_address = 0;\n\n        //\n        // You are allowed to have NUL characters between records.\n        // Presumably this is used to get recordss onto even\n        // byte boundardies and/or whole block boundaries.\n        //\n        if (!skip_nul())\n            return false;\n\n        checksum_reset();\n        int tag = get_word_le();\n        if (tag != 1)\n            fatal_error(\"record type %d unknown\", tag);\n        int length = get_word_le();\n        if (length < 6)\n            fatal_error(\"record length (%d) invalid\", length);\n        length -= 6;\n        current_address = get_word_le();\n        if (length == 0)\n        {\n            get_byte();\n            if (use_checksums() && checksum_get())\n            {\n                fatal_error(\"checksum mismatch (%02X)\", checksum_get());\n            }\n            srecord::record::type_t type =\n                srecord::record::type_execution_start_address;\n            record = srecord::record(type, current_address, 0, 0);\n            seek_to_end();\n            return true;\n        }\n        current_length = length;\n    }\n\n    //\n    // Read as many bytes as possible into the buffer.\n    //\n    unsigned char buffer[srecord::record::max_data_length];\n    int nbytes = srecord::record::max_data_length;\n    if (current_pos + nbytes > current_length)\n        nbytes = current_length - current_pos;\n    for (int j = 0; j < nbytes; ++j)\n        buffer[j] = get_byte();\n\n    //\n    // Create a data record and return.\n    //\n    srecord::record::type_t type = srecord::record::type_data;\n    record = srecord::record(type, current_address, buffer, nbytes);\n    current_address += nbytes;\n    current_pos += nbytes;\n    return true;\n}\n\n\nbool\nsrecord::input_file_dec_binary::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_dec_binary::get_file_format_name()\n    const\n{\n    return \"DEC Binary (XXDP)\";\n}\n\n\nint\nsrecord::input_file_dec_binary::format_option_number(void)\n    const\n{\n    return arglex_tool::token_dec_binary;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/dec_binary.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2003, 2006-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_DEC_BINARY_H\n#define SRECORD_INPUT_FILE_DEC_BINARY_H\n\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_dec_binary class is used to parse a DEC\n  * Binary (PDP 11 absolute loader XXDP) format file.\n  */\nclass input_file_dec_binary:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_dec_binary();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * A constructor.  The input is read from the named file (or\n      * the standard input if the file anme is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_dec_binary(const std::string &file_name);\n\n    /**\n      * The get_byte method is used to fetch a byte of input, and\n      * update the checksum.  We over-ride the base implementation,\n      * because we use raw bytes rather than two hex digits.\n      */\n    int get_byte();\n\n    /**\n      * This format has NUL characters for optional badding around\n      * blocks.  This method is used to skip past such padding.\n      * Returns true if there is more inoput available, or false at\n      * end of file.\n      */\n    bool skip_nul();\n\n    /**\n      * The current_pos instance variable is used to track out\n      * position within the current record.  We need todo this\n      * becase DEC Binary records can be significantly longer than\n      * other formats.\n      */\n    unsigned long current_pos;\n\n    /**\n      * The current_length instance variable is used to remember\n      * the length of the current record.  It is zero if there is no\n      * \"current\" record.\n      */\n    unsigned long current_length;\n\n    /**\n      * The current_address instance variable is used to track the\n      * load address of the current record.  It is updated each time\n      * we return a partial block, so that we alsoways return the\n      * correct load address.\n      */\n    unsigned long current_address;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_dec_binary(const input_file_dec_binary &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_dec_binary &operator=(const input_file_dec_binary &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_DEC_BINARY_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/emon52.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2005-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/emon52.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_emon52::~input_file_emon52()\n{\n}\n\n\nsrecord::input_file_emon52::input_file_emon52(const std::string &a_file_name) :\n    srecord::input_file(a_file_name)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_emon52::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_emon52(a_file_name));\n}\n\n\nvoid\nsrecord::input_file_emon52::skip_white_space(void)\n{\n    for (;;)\n    {\n        int c = peek_char();\n        if (c != ' ')\n            return;\n        get_char();\n    }\n}\n\n\nbool\nsrecord::input_file_emon52::read(srecord::record &record)\n{\n    //\n    // This format has no execution start address record type, and no\n    // magic start character.  So look ahead to see if there is anything\n    // more.\n    //\n    if (peek_char() < 0)\n        return false;\n\n    //\n    // Looks like there should be a record.  Read it all in.\n    //\n    int length = get_byte();\n    if (length == 0)\n        fatal_error(\"data length of zero is not valid\");\n    skip_white_space();\n    unsigned long address = get_word_be();\n    if (get_char() != ':')\n        fatal_error(\"colon expected\");\n    checksum_reset();\n    unsigned char buffer[256];\n    for (int j = 0; j < length; ++j)\n    {\n        skip_white_space();\n        buffer[j] = get_byte();\n    }\n    skip_white_space();\n    int csumX = checksum_get16();\n    int csum = get_word_be();\n    if (use_checksums() && csumX != csum)\n        fatal_error(\"checksum mismatch (%04X != %04X)\", csumX, csum);\n    if (get_char() != '\\n')\n        fatal_error(\"end-of-line expected\");\n\n    srecord::record::type_t type = srecord::record::type_data;\n    record = srecord::record(type, address, buffer, length);\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_emon52::get_file_format_name(void)\n    const\n{\n    return \"Elektor Monitor (EMON52)\";\n}\n\n\nint\nsrecord::input_file_emon52::format_option_number(void)\n    const\n{\n    return arglex_tool::token_emon52;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/emon52.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_EMON52_H\n#define SRECORD_INPUT_FILE_EMON52_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_emon52 class is used to parse an EMON52\n  * formatted file (Elektor Monitor, dunno what the 52 is for).\n  */\nclass input_file_emon52:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_emon52();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * A constructor.  The input is read from the named file (or\n      * the standard input if the file anme is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_emon52(const std::string &file_name);\n\n    /**\n      * The skip_white_space method is used to skip space characters.\n      * The format requires spaces in some locations, this method\n      * skips the space of present.\n      */\n    void skip_white_space(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_emon52();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_emon52(const input_file_emon52 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_emon52 &operator=(const input_file_emon52 &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_EMON52_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/fairchild.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2005-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/fairchild.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_fairchild::~input_file_fairchild()\n{\n}\n\n\nsrecord::input_file_fairchild::input_file_fairchild(\n    const std::string &a_filename\n) :\n    input_file(a_filename),\n    header_seen(false),\n    address(0),\n    file_contains_data(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_fairchild::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_fairchild(a_file_name));\n}\n\n\nint\nsrecord::input_file_fairchild::get_nibble()\n{\n    int n = input_file::get_nibble();\n    checksum_add(n);\n    return n;\n}\n\n\nint\nsrecord::input_file_fairchild::get_byte()\n{\n    // this differs from the srecord::input_file method only in that we\n    // don't add to the checksum.\n    int c1 = get_nibble();\n    int c2 = get_nibble();\n    return ((c1 << 4) | c2);\n}\n\n\nbool\nsrecord::input_file_fairchild::read(record &result)\n{\n    if (!header_seen)\n    {\n        bool garbage_warning = false;\n        for (;;)\n        {\n            int c = get_char();\n            if (c < 0)\n                fatal_error(\"format error\");\n            if (c == 'S')\n            {\n                get_char_undo(c);\n                break;\n            }\n            if (!garbage_warning)\n            {\n                fatal_error(\"garbage lines ignored\");\n                garbage_warning = true;\n            }\n        }\n        header_seen = true;\n    }\n    for (;;)\n    {\n        int c = get_char();\n        switch (c)\n        {\n        case -1:\n            fatal_error(\"no * end record\");\n\n        case '*':\n            if (!file_contains_data)\n                fatal_error(\"file contains no data\");\n            get_char_undo(c);\n            return false;\n\n        case 'S':\n            address = get_word_be();\n            break;\n\n        case 'X':\n            {\n                checksum_reset();\n                unsigned char data[8];\n                for (int j = 0; j < 8; ++j)\n                    data[j] = get_byte();\n                result = record(record::type_data, address, data, 8);\n                address += 8;\n                file_contains_data = true;\n\n                //\n                // Verify the checksum.\n                //\n                int sum1 = checksum_get() & 0xF;\n                int sum2 = get_nibble();\n                if (use_checksums() && sum1 != sum2)\n                    fatal_error(\"checksum error (%d != %d)\", sum1, sum2);\n            }\n            return true;\n\n        default:\n            //\n            // The documentation says to ignore all the other characters\n            // in the file.\n            //\n            break;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_fairchild::get_file_format_name()\n    const\n{\n    return \"Fairchild Fairbug\";\n}\n\n\nint\nsrecord::input_file_fairchild::format_option_number(void)\n    const\n{\n    return arglex_tool::token_fairchild;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/fairchild.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_FAIRCHILD_H\n#define SRECORD_INPUT_FILE_FAIRCHILD_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_fairchild class is used to represent the parse\n  * stat ewhen reading a file in Fairchild Fairbug format.\n  */\nclass input_file_fairchild:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_fairchild();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_fairchild(const std::string &file_name);\n\n    /**\n      * The get_nibble method gets a single hex-digit from input.\n      * We override the one in the base class because the checksum is\n      * nibble-based, not byte-based.\n      */\n    int get_nibble(void);\n\n    /**\n      * The get_byte method gets a two hex-digit from input and assembles\n      * them (big-endian) into a byte.  We override the one in the base\n      * class because the checksum is nibble-based, not byte-based.\n      */\n    int get_byte(void);\n\n    /**\n      * The header_seen instance variable is used to member whether the\n      * file header has been processed yet.\n      */\n    bool header_seen;\n\n    /**\n      * The address instance variable is used to member the address at\n      * the currebt point in the input file.\n      */\n    unsigned long address;\n\n    /**\n      * The file_contains_data instance variable is used to member\n      * whether any data records have been seen yet.\n      */\n    bool file_contains_data;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_fairchild();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_fairchild(const input_file_fairchild &);\n\n    /**\n      * The assignment operator.\n      */\n    input_file_fairchild &operator=(const input_file_fairchild &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_FAIRCHILD_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/fastload.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2005-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/fastload.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_fastload::~input_file_fastload()\n{\n}\n\n\nsrecord::input_file_fastload::input_file_fastload(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    seen_some_input(false),\n    address(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_fastload::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_fastload(a_file_name));\n}\n\n\nint\nsrecord::input_file_fastload::get_digit(void)\n{\n    int c = get_char();\n    switch (c)\n    {\n    case 'A': return 0;\n    case 'B': return 1;\n    case 'C': return 2;\n    case 'D': return 3;\n    case 'E': return 4;\n    case 'F': return 5;\n    case 'G': return 6;\n    case 'H': return 7;\n    case 'I': return 8;\n    case 'J': return 9;\n    case 'K': return 10;\n    case 'L': return 11;\n    case 'M': return 12;\n    case 'N': return 13;\n    case 'O': return 14;\n    case 'P': return 15;\n    case 'Q': return 16;\n    case 'R': return 17;\n    case 'S': return 18;\n    case 'T': return 19;\n    case 'U': return 20;\n    case 'V': return 21;\n    case 'W': return 22;\n    case 'X': return 23;\n    case 'Y': return 24;\n    case 'Z': return 25;\n    case 'a': return 26;\n    case 'b': return 27;\n    case 'c': return 28;\n    case 'd': return 29;\n    case 'e': return 30;\n    case 'f': return 31;\n    case 'g': return 32;\n    case 'h': return 33;\n    case 'i': return 34;\n    case 'j': return 35;\n    case 'k': return 36;\n    case 'l': return 37;\n    case 'm': return 38;\n    case 'n': return 39;\n    case 'o': return 40;\n    case 'p': return 41;\n    case 'q': return 42;\n    case 'r': return 43;\n    case 's': return 44;\n    case 't': return 45;\n    case 'u': return 46;\n    case 'v': return 47;\n    case 'w': return 48;\n    case 'x': return 49;\n    case 'y': return 50;\n    case 'z': return 51;\n    case '0': return 52;\n    case '1': return 53;\n    case '2': return 54;\n    case '3': return 55;\n    case '4': return 56;\n    case '5': return 57;\n    case '6': return 58;\n    case '7': return 59;\n    case '8': return 60;\n    case '9': return 61;\n    case ',': return 62;\n    case '.': return 63;\n    }\n    get_char_undo(c);\n    return -1;\n}\n\n\nunsigned long\nsrecord::input_file_fastload::get_number(int min_digits, int max_digits)\n{\n    unsigned long result = 0;\n    for (int ndigits = 0; ndigits < max_digits; ++ndigits)\n    {\n        int c = get_digit();\n        if (c < 0)\n        {\n            if (ndigits < min_digits)\n            {\n                fatal_error(\"base-64 number expected (%d < %d)\",\n                    ndigits, min_digits);\n            }\n            break;\n        }\n        result = (result << 6) | c;\n    }\n    return result;\n}\n\n\nvoid\nsrecord::input_file_fastload::expect_white_space(void)\n{\n    switch (peek_char())\n    {\n    case -1:\n    case ' ':\n    case '\\t':\n    case '\\r':\n    case '\\n':\n    case '/':\n        break;\n\n    default:\n        fatal_error(\"white space expected\");\n    }\n}\n\n\nbool\nsrecord::input_file_fastload::read_inner(srecord::record &record)\n{\n    unsigned long n;\n    unsigned char data[srecord::record::max_data_length];\n    unsigned long data_address = address;\n    srecord::record::type_t type;\n    int data_length = 0;\n    unsigned char the_byte;\n    for (;;)\n    {\n        switch (peek_char())\n        {\n        case -1:\n            return false;\n\n        case ' ':\n        case '\\t':\n        case '\\n':\n        case '\\r':\n            get_char();\n            break;\n\n        case '/':\n            if (data_length > 0)\n            {\n                got_a_record:\n                record =\n                    srecord::record\n                    (\n                        srecord::record::type_data,\n                        data_address,\n                        data,\n                        data_length\n                    );\n                return true;\n            }\n            get_char();\n            switch (get_char())\n            {\n            case 'A':\n                address = get_number(1, 6);\n                expect_white_space();\n                data_address = address;\n                break;\n\n            case 'B':\n                the_byte = get_number(1, 6);\n                data[data_length++] = the_byte;\n                checksum_add(the_byte);\n                expect_white_space();\n                address++;\n                // assert(data_length == 1);\n                break;\n\n            case 'C':\n                n = get_number(1, 6);\n                if (use_checksums())\n                {\n                    int csum = checksum_get16();\n                    if ((int)n != csum)\n                    {\n                        fatal_error(\"checksum mismatch (%04X != %04X)\",\n                            (int)n, csum);\n                    }\n                }\n                expect_white_space();\n                break;\n\n            case 'E':\n                get_number(1, 6);\n                seek_to_end();\n                type = srecord::record::type_execution_start_address;\n                record = srecord::record(type, address, 0, 0);\n                return true;\n\n            case 'K':\n                get_number(1, 6);\n                expect_white_space();\n                checksum_reset();\n                break;\n\n            case 'S':\n                // Ignore symbols\n                for (;;)\n                {\n                    int c = get_char();\n                    if (c < 0)\n                        fatal_error(\"end-of-input in symbol\");\n                    if (c == ',')\n                        break;\n                }\n                get_number(1, 6);\n                expect_white_space();\n                break;\n\n            case 'Z':\n                n = get_number(1, 6);\n                expect_white_space();\n                if (n >= srecord::record::max_data_length)\n                    fatal_error(\"clearing too many bytes (%lu)\", n);\n                memset(data, 0, n);\n                type = srecord::record::type_data;\n                record = srecord::record(type, address, data, n);\n                address += n;\n                return true;\n\n            default:\n                fatal_error(\"unknown command\");\n            }\n            break;\n\n        default:\n            if (data_length + 3 > srecord::record::max_data_length)\n                goto got_a_record;\n            n = get_number(4, 4);\n            the_byte = n >> 16;\n            data[data_length++] = the_byte;\n            checksum_add(the_byte);\n            the_byte = n >> 8;\n            data[data_length++] = the_byte;\n            checksum_add(the_byte);\n            the_byte = n;\n            data[data_length++] = the_byte;\n            checksum_add(the_byte);\n            address += 3;\n            break;\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_fastload::read(srecord::record &record)\n{\n    if (!read_inner(record))\n    {\n        if (!seen_some_input)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_fastload::get_file_format_name(void)\n    const\n{\n    return \"LSI Logic Fast Load\";\n}\n\n\nint\nsrecord::input_file_fastload::format_option_number(void)\n    const\n{\n    return arglex_tool::token_fast_load;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/fastload.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_FASTLOAD_H\n#define SRECORD_INPUT_FILE_FASTLOAD_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The fastload class is used to parse an LSI Logic Fast Load format file.\n  */\nclass input_file_fastload:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_fastload();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * A constructor.  The input is read from the named file (or\n      * the standard input if the file anme is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_fastload(const std::string &file_name);\n\n    /**\n      * Read one line (record) of input.  Called by the #read method.\n      * Returns false at end of file.\n      */\n    bool read_inner(record &);\n\n    /**\n      * Get a singe base-64 digit.  Returns 0..63 for a valid digit.\n      * Fatal error if not a valid base-64 digit.\n      */\n    int get_digit(void);\n\n    /**\n      * The get_number method is used to get a base-64 number.\n      * The ordering is big-endian, but like ordinary decimal numbers.\n      * Four digits is 24 bits.\n      */\n    unsigned long get_number(int min_digits, int max_digits);\n\n    /**\n      * The seen_some_input instance variable is used to\n      * remember whether any input has been seen.\n      */\n    bool seen_some_input;\n\n    /**\n      * The address instance variable is used to represent the\n      * current address within the file.  It is set by the /A command,\n      * and advanced by the data, /B and /Z commands.\n      */\n    unsigned long address;\n\n    /**\n      * The expect_white_space method is used to ensure that while\n      * space follows the various commands.  It doesn't consume any\n      * input, since it uses peek_char to do the checking.\n      */\n    void expect_white_space(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_fastload();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_fastload(const input_file_fastload &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_fastload &operator=(const input_file_fastload &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_FASTLOAD_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/formatted_binary.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/formatted_binary.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_formatted_binary::~input_file_formatted_binary()\n{\n}\n\n\nsrecord::input_file_formatted_binary::input_file_formatted_binary(\n    const std::string &a_file_name\n) :\n    input_file(a_file_name),\n    header_seen(false),\n    upper_bound(0),\n    address(0),\n    trailer_seen(false),\n    check_sum(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_formatted_binary::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_formatted_binary(a_file_name));\n}\n\n\nbool\nsrecord::input_file_formatted_binary::read(record &result)\n{\n    if (!header_seen)\n    {\n        // Skip leading NULs\n        int c;\n        for (;;)\n        {\n            c = get_char();\n            if (c)\n                break;\n        }\n        if (c != 0x08)\n        {\n            format_error:\n            fatal_error(\"format error\");\n            // NOTREACHED\n        }\n        c = get_char();\n        if (c != 0x1C)\n            goto format_error;\n        c = get_char();\n        int len = 4;\n        if (c == 0x2A)\n        {\n            c = get_char();\n            if (c != 0x49)\n                goto format_error;\n        }\n        else if (c == 0x3E)\n        {\n            c = get_char();\n            if (c != 0x6B)\n                goto format_error;\n            len = 8;\n        }\n        else\n            goto format_error;\n        c = get_char();\n        if (c != 0x08)\n            goto format_error;\n        c = get_char();\n        if (c != 0x00)\n            goto format_error;\n        upper_bound = 0;\n        while (len > 0)\n        {\n            c = get_char();\n            if (c < 0 || c >= 16)\n                goto format_error;\n            upper_bound = (upper_bound << 4) + c;\n            --len;\n        }\n        c = get_char();\n        if (c != 0xFF)\n            goto format_error;\n        header_seen = true;\n        address = 0;\n    }\n    if (address >= upper_bound)\n    {\n        if (!trailer_seen)\n        {\n            if (get_char() != 0)\n                goto format_error;\n            if (get_char() != 0)\n                goto format_error;\n            int c1 = get_char();\n            if (c1 < 0)\n                goto format_error;\n            int c2 = get_char();\n            if (c2 < 0)\n                goto format_error;\n            int x = (c1 << 8) + c2;\n            if ((check_sum & 0xFFFF) != (x & 0xFFFF))\n            {\n                fatal_error\n                (\n                    \"checksum mismatch (%04X != %04X)\",\n                    (check_sum & 0xFFFF),\n                    (x & 0xFFFF)\n                );\n            }\n            for (;;)\n            {\n                // skip trailing NULs\n                int c = get_char();\n                if (c < 0)\n                    break;\n                if (c != 0)\n                    goto format_error;\n            }\n            trailer_seen = true;\n        }\n        return false;\n    }\n\n    long datalen = upper_bound - address;\n    if (datalen > record::max_data_length)\n        datalen = record::max_data_length;\n    unsigned char data[record::max_data_length];\n    for (long j = 0; j < datalen; ++j)\n    {\n        int c = get_char();\n        if (c < 0)\n            goto format_error;\n        data[j] = c;\n        check_sum += c;\n    }\n    result = record(record::type_data, address, data, datalen);\n    address += datalen;\n    return true;\n}\n\n\nbool\nsrecord::input_file_formatted_binary::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_formatted_binary::get_file_format_name(void)\n    const\n{\n    return \"Formatted Binary\";\n}\n\n\nint\nsrecord::input_file_formatted_binary::format_option_number(void)\n    const\n{\n    return arglex_tool::token_formatted_binary;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/formatted_binary.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_FORMATTED_BINARY_H\n#define SRECORD_INPUT_FILE_FORMATTED_BINARY_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_formatted_binary class is used to represent the\n  * parse state when reading a file in the Formatted Binary format.\n  */\nclass input_file_formatted_binary:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_formatted_binary();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read (record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_formatted_binary(const std::string &file_name);\n\n    /**\n      * The header_seen instance variable is used to remember whether\n      * the file header has been seen yet.\n      */\n    bool header_seen;\n\n    /**\n      * The upper_bound instance variable is used to remember how long\n      * the header said the file was going to be.\n      */\n    unsigned long upper_bound;\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in extracting the data from the file.\n      */\n    unsigned long address;\n\n    /**\n      * The trailer_seen instance variable is used to remember whether\n      * the file trailer has been seen yet.\n      */\n    bool trailer_seen;\n\n    /**\n      * The check_sum instance variable is used to remember the simple\n      * sum of the data bytes in the file.\n      */\n    unsigned short check_sum;\n\n    /**\n      * The default constructor.\n      */\n    input_file_formatted_binary();\n\n    /**\n      * The copy constructor.\n      */\n    input_file_formatted_binary(const input_file_formatted_binary &);\n\n    /**\n      * The assignment operator.\n      */\n    input_file_formatted_binary &operator=(const input_file_formatted_binary &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_FORMATTED_BINARY_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/four_packed_code.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2005-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/four_packed_code.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_four_packed_code::~input_file_four_packed_code()\n{\n}\n\n\nsrecord::input_file_four_packed_code::input_file_four_packed_code(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    garbage_warning(false),\n    seen_some_input(false),\n    running_address(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_four_packed_code::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_four_packed_code(a_file_name));\n}\n\n\nint\nsrecord::input_file_four_packed_code::get_digit(void)\n{\n    int c = get_char();\n    switch (c)\n    {\n    case '%':   return  0;\n    case '&':   return  1;\n    case '\\'':  return  2;\n    case '(':   return  3;\n    case ')':   return  4;\n    case '+':   return  5;\n    case ',':   return  6;\n    case '-':   return  7;\n    case '.':   return  8;\n    case '/':   return  9;\n    case '0':   return 10;\n    case '1':   return 11;\n    case '2':   return 12;\n    case '3':   return 13;\n    case '4':   return 14;\n    case '5':   return 15;\n    case '6':   return 16;\n    case '7':   return 17;\n    case '8':   return 18;\n    case '9':   return 19;\n    case ':':   return 20;\n    case ';':   return 21;\n    case '<':   return 22;\n    case '=':   return 23;\n    case '>':   return 24;\n    case '?':   return 25;\n    case '@':   return 26;\n    case 'A':   return 27;\n    case 'B':   return 28;\n    case 'C':   return 29;\n    case 'D':   return 30;\n    case 'E':   return 31;\n    case 'F':   return 32;\n    case 'G':   return 33;\n    case 'H':   return 34;\n    case 'I':   return 35;\n    case 'J':   return 36;\n    case 'K':   return 37;\n    case 'L':   return 38;\n    case 'M':   return 39;\n    case 'N':   return 40;\n    case 'O':   return 41;\n    case 'P':   return 42;\n    case 'Q':   return 43;\n    case 'R':   return 44;\n    case 'S':   return 45;\n    case 'T':   return 46;\n    case 'U':   return 47;\n    case 'V':   return 48;\n    case 'W':   return 49;\n    case 'X':   return 50;\n    case 'Y':   return 51;\n    case 'Z':   return 52;\n    case '[':   return 53;\n    case '\\\\':  return 54;\n    case ']':   return 55;\n    case '^':   return 56;\n    case '_':   return 57;\n    case '`':   return 58;\n    case 'a':   return 59;\n    case 'b':   return 60;\n    case 'c':   return 61;\n    case 'd':   return 62;\n    case 'e':   return 63;\n    case 'f':   return 64;\n    case 'g':   return 65;\n    case 'h':   return 66;\n    case 'i':   return 67;\n    case 'j':   return 68;\n    case 'k':   return 69;\n    case 'l':   return 70;\n    case 'm':   return 71;\n    case 'n':   return 72;\n    case 'o':   return 73;\n    case 'p':   return 74;\n    case 'q':   return 75;\n    case 'r':   return 76;\n    case 's':   return 77;\n    case 't':   return 78;\n    case 'u':   return 79;\n    case 'v':   return 80;\n    case 'w':   return 81;\n    case 'x':   return 82;\n    case 'y':   return 83;\n    case 'z':   return 84;\n    }\n    fatal_error(\"base85 digit expected\");\n    // NOTREACHED\n    return -1;\n}\n\n\nint\nsrecord::input_file_four_packed_code::get_byte(void)\n{\n    if (get_byte_pos >= 4)\n        get_byte_pos = 0;\n    if (get_byte_pos == 0)\n    {\n        get_byte_value = (((get_digit() * 85 + get_digit()) * 85 +\n            get_digit()) * 85 + get_digit()) * 85 + get_digit();\n    }\n    unsigned char c = get_byte_value >> ((3 - get_byte_pos++) * 8);\n    checksum_add(c);\n    return c;\n}\n\n\nbool\nsrecord::input_file_four_packed_code::read_inner(srecord::record &record)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n            return false;\n        if (c == '$')\n            break;\n        if (c == '\\n')\n            continue;\n        if (!garbage_warning)\n        {\n            warning(\"ignoring garbage lines\");\n            garbage_warning = true;\n        }\n        for (;;)\n        {\n            c = get_char();\n            if (c < 0)\n                return false;\n            if (c == '\\n')\n                break;\n        }\n    }\n    checksum_reset();\n    get_byte(); // discard the checksum byte\n    int length = get_byte();\n    int format_code = get_word_be();\n    switch (length)\n    {\n    case 0:\n        if (format_code != 0)\n                fatal_error(\"format code must be zero\");\n        if (get_char() != '\\n')\n                fatal_error(\"end-of-line expected\");\n        while (get_char() >= 0)\n                ;\n        return false;\n\n    case 1:\n    case 2:\n    case 3:\n        fatal_error(\"bad length\");\n        length = 0;\n        break;\n\n    default:\n        length -= 4;\n        break;\n    }\n\n    unsigned long address = get_4bytes_be();\n    switch (format_code)\n    {\n    case 0:\n        break;\n\n    case 1:\n        // Ignore any address specified.\n        address = running_address;\n        break;\n\n    case 2:\n        // \"Relative\"  Just guessing...\n        address += running_address;\n        break;\n\n    default:\n        fatal_error(\"format code %d unknown\", format_code);\n    }\n\n    unsigned char buffer[256];\n    for (int j = 0; j < length; ++j)\n        buffer[j] = get_byte();\n    if (use_checksums() && checksum_get() != 0)\n        fatal_error(\"checksum mismatch\");\n    if (get_char() != '\\n')\n        fatal_error(\"end-of-line expected\");\n\n    srecord::record::type_t type = srecord::record::type_data;\n    if (length == 0)\n        type = srecord::record::type_execution_start_address;\n    record = srecord::record(type, address, buffer, length);\n    running_address = address + length;\n    return true;\n}\n\n\nbool\nsrecord::input_file_four_packed_code::read(srecord::record &record)\n{\n    if (!read_inner(record))\n    {\n        if (!seen_some_input && garbage_warning)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_four_packed_code::get_file_format_name(void)\n    const\n{\n    return \"Four Packed Code (FPC)\";\n}\n\n\nint\nsrecord::input_file_four_packed_code::format_option_number(void)\n    const\n{\n    return arglex_tool::token_four_packed_code;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/four_packed_code.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_FOUR_PACKED_CODE_H\n#define SRECORD_INPUT_FILE_FOUR_PACKED_CODE_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_four_packed_code represents an input file in\n  * the four packed code (FPC) format.  For extra points: who invented\n  * this format?  Where is it used?\n  */\nclass input_file_four_packed_code:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_four_packed_code();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.  The input will be read from the named file\n      * (or the standard input if the name is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_four_packed_code(const std::string &file_name);\n\n    /**\n      * The read_inner method is used to read a record (one line)\n      * from the input file.  Lines which don't start with \"$\"\n      * will be ignored.\n      */\n    bool read_inner(record &);\n\n    /**\n      * See base class for documentation.  We override the default\n      * implementation because we have to decode 5 characters (four\n      * bytes) at a time.  The usual get_word (etc) continue to work\n      * without additional modifications.\n      */\n    int get_byte(void);\n\n    /**\n      * The get_digit method is used to fetch one base85 digit from\n      * the input.\n      */\n    int get_digit(void);\n\n    /**\n      * The get_byte_pos instance variable is used by the get_byte\n      * method to track where were are positioned within the\n      * 5-character (4-byte) input multiple.  (Only the get_byte\n      * method may use this instance variable.)\n      */\n    unsigned get_byte_pos;\n\n    /**\n      * The get_byte_value instance variable is used by the bet_byte\n      * method to method to hold the value of a 5-character (4-byte)\n      * input multiple.  (Only the get_byte method may use this\n      * instance variable.)\n      */\n    unsigned long get_byte_value;\n\n    /**\n      * The garbage_waring instance variable is used by the read\n      * method to record whether or not a warning about non-format\n      * lines has been issued (only one warning is issued per file).\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used by the read\n      * and read_inner methods to record whether or not any valid\n      * input has been seen.\n      */\n    bool seen_some_input;\n\n    /**\n      * The running_address instance variable method is used by the\n      * read_inner method to record the current address.  This is\n      * so that record types 1 and 2 can be processed accurately.\n      */\n    unsigned long running_address;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_four_packed_code();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_four_packed_code(const input_file_four_packed_code &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_four_packed_code &operator=(const input_file_four_packed_code &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_FOUR_PACKED_CODE_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/guess.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex.h>\n#include <srecord/quit/exception.h>\n#include <srecord/input/file/aomf.h>\n#include <srecord/input/file/ascii_hex.h>\n#include <srecord/input/file/atmel_generic.h>\n#include <srecord/input/file/binary.h>\n#include <srecord/input/file/brecord.h>\n#include <srecord/input/file/dec_binary.h>\n#include <srecord/input/file/emon52.h>\n#include <srecord/input/file/fairchild.h>\n#include <srecord/input/file/fastload.h>\n#include <srecord/input/file/formatted_binary.h>\n#include <srecord/input/file/four_packed_code.h>\n#include <srecord/input/file/hexdump.h>\n#include <srecord/input/file/idt.h>\n#include <srecord/input/file/intel.h>\n#include <srecord/input/file/intel16.h>\n#include <srecord/input/file/logisim.h>\n#include <srecord/input/file/mif.h>\n#include <srecord/input/file/mips_flash.h>\n#include <srecord/input/file/mos_tech.h>\n#include <srecord/input/file/motorola.h>\n#include <srecord/input/file/msbin.h>\n#include <srecord/input/file/needham.h>\n#include <srecord/input/file/os65v.h>\n#include <srecord/input/file/ppb.h>\n#include <srecord/input/file/ppx.h>\n#include <srecord/input/file/signetics.h>\n#include <srecord/input/file/spasm.h>\n#include <srecord/input/file/spectrum.h>\n#include <srecord/input/file/stewie.h>\n#include <srecord/input/file/tektronix.h>\n#include <srecord/input/file/tektronix_extended.h>\n#include <srecord/input/file/ti_tagged.h>\n#include <srecord/input/file/ti_txt.h>\n#include <srecord/input/file/trs80.h>\n#include <srecord/input/file/vmem.h>\n#include <srecord/input/file/wilson.h>\n#include <srecord/record.h>\n\n\ntypedef srecord::input_file::pointer (*func_p)(const std::string &file_name);\n\nstatic func_p table[] =\n{\n    srecord::input_file_aomf::create,\n    srecord::input_file_ascii_hex::create,\n    srecord::input_file_atmel_generic::create_be,\n    srecord::input_file_brecord::create,\n    srecord::input_file_dec_binary::create,\n    srecord::input_file_emon52::create,\n    srecord::input_file_fairchild::create,\n    srecord::input_file_fastload::create,\n    srecord::input_file_formatted_binary::create,\n    srecord::input_file_four_packed_code::create,\n    srecord::input_file_idt::create,\n    srecord::input_file_intel::create,\n    srecord::input_file_intel16::create,\n    srecord::input_file_logisim::create,\n    srecord::input_file_mif::create,\n    srecord::input_file_mips_flash::create_be,\n    srecord::input_file_mos_tech::create,\n    srecord::input_file_motorola::create,\n    srecord::input_file_needham::create,\n    srecord::input_file_os65v::create,\n    srecord::input_file_ppb::create,\n    srecord::input_file_ppx::create,\n    srecord::input_file_signetics::create,\n    srecord::input_file_spasm::create_be,\n    srecord::input_file_spectrum::create,\n    srecord::input_file_stewie::create,\n    srecord::input_file_tektronix::create,\n    srecord::input_file_tektronix_extended::create,\n    srecord::input_file_ti_tagged::create,\n    srecord::input_file_ti_txt::create,\n    srecord::input_file_trs80::create,\n    srecord::input_file_msbin::create, // test after trs80\n    srecord::input_file_vmem::create,\n    srecord::input_file_wilson::create,\n    srecord::input_file_hexdump::create,\n};\n\n#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))\n#define ENDOF(a) ((a) + SIZEOF(a))\n\n\nsrecord::input_file::pointer\nsrecord::input_file::guess(const std::string &fn, arglex &cmdline)\n{\n    if (fn.empty() || fn == \"-\")\n    {\n        quit_default.fatal_error\n        (\n            \"the file format of the standard input must be specified explicitly\"\n        );\n    }\n\n    //\n    // Try each file format in turn.\n    //\n    quit_exception quitter;\n    for (func_p *tp = table; tp < ENDOF(table); ++tp)\n    {\n        //\n        // Create a new file reader\n        //\n        func_p func = *tp;\n        srecord::input_file::pointer ifp = func(fn);\n        try\n        {\n            //\n            // Set the exception-throwing quitter\n            // (it also silences all error and warning messages).\n            //\n            ifp->set_quit(quitter);\n            srecord::record record;\n\n            //\n            // Try to read something from the file.  If it is\n            // the wrong format, it will throw an exception.\n            //\n            if (ifp->read(record))\n            {\n                int tok = ifp->format_option_number();\n                const char *option = cmdline.token_name(tok);\n                quit_default.message\n                (\n                    \"%s: the file format can be accessed directly with \"\n                        \"the %s command line option (%s)\",\n                    fn.c_str(),\n                    option,\n                    srecord::arglex::abbreviate(option).c_str()\n                );\n\n                //\n                // It is necessary to nuke the old file reader.\n                // (a) Because it has the wrong quitter, but more importantly\n                // (b) because it is no longer positioned at the start of the\n                //     file, and the user *will* miss some data, also\n                // (c) we need a chance to use the input::command_line()\n                //     method.\n                //\n                ifp.reset();\n\n                //\n                // Return a brand-new file reader.\n                //\n                ifp = func(fn);\n                return ifp;\n            }\n        }\n        catch (quit_exception::vomit)\n        {\n        }\n\n        //\n        // Wrong format.\n        // Toss this one, and try another.\n        //\n        ifp.reset();\n    }\n\n    //\n    // If nothing else works, assume the file is binary.\n    //\n    quit_default.warning\n    (\n        \"%s: unable to determine the file format, assuming -Binary\",\n        fn.c_str()\n    );\n    return srecord::input_file_binary::create(fn);\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/hexdump.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/hexdump.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_hexdump::~input_file_hexdump()\n{\n}\n\n\nsrecord::input_file_hexdump::input_file_hexdump(const std::string &filename) :\n    input_file(filename),\n    address(0),\n    data_seen(false)\n{\n}\n\n\nsrecord::input_file_hexdump::pointer\nsrecord::input_file_hexdump::create(const std::string &filename)\n{\n    return pointer(new input_file_hexdump(filename));\n}\n\n\nsrecord::input_file_hexdump::token_t\nsrecord::input_file_hexdump::get_next_token(void)\n{\n    for (;;)\n    {\n        int sc = get_char();\n        if (sc < 0)\n            return token_eof;\n        unsigned char c = sc;\n        switch (c)\n        {\n        case '\\n':\n            return token_eoln;\n\n        case '#':\n        case ';':\n            // comments\n            return (discard_rest_of_line() ? token_eoln : token_eof);\n\n        case ' ':\n        case '\\t':\n        case '\\f':\n        case '\\r':\n        case '\\v':\n            break;\n\n        case ':':\n            return token_colon;\n\n        case '0': case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n            {\n                int c1 = get_nibble_value(c);\n                int c2 = get_nibble();\n                current_token_value = (c1 << 4) | c2;\n                return token_byte;\n            }\n\n        default:\n            return token_junk;\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_hexdump::discard_rest_of_line(void)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n            return false;\n        if (c == '\\n')\n            return true;\n    }\n}\n\n\nbool\nsrecord::input_file_hexdump::read(record &result)\n{\n    // file\n    //     : line\n    //     | file line\n    //     ;\n    // line\n    //     : address EOLN\n    //     : address data EOLN\n    //     | data EOLN\n    //     ;\n    // address\n    //     : data COLON\n    //     ;\n    // data\n    //     : BYTE\n    //     | data BYTE\n    //     ;\n    for (;;)\n    {\n        token_t tok = get_next_token();\n        switch (tok)\n        {\n        case token_eof:\n            return false;\n\n        default:\n            fatal_error(\"expected address\");\n\n        case token_eoln:\n            // Blank lines are OK.\n            // Comments arrive here, too.\n            continue;\n\n        case token_byte:\n            break;\n        }\n\n        unsigned char data[16];\n        unsigned nbytes = 0;\n        bool could_be_an_address = true;\n        for (;;)\n        {\n            data[nbytes++] = current_token_value;\n            if (nbytes >= 16)\n            {\n                tok = discard_rest_of_line() ? token_eoln : token_eof;\n                break;\n            }\n            if (nbytes > sizeof(address))\n                could_be_an_address = false;\n\n            tok = get_next_token();\n            if (tok == token_colon && could_be_an_address)\n            {\n                // it's actually an address\n                address = 0;\n                for (unsigned d = 0; d < nbytes; ++d)\n                    address = (address << 8) | data[d];\n                nbytes = 0;\n                could_be_an_address = false;\n                tok = get_next_token();\n                if (tok == token_byte)\n                    continue;\n            }\n            if (tok == token_eoln || tok == token_eof)\n                break;\n            if (tok != token_byte)\n            {\n                tok = discard_rest_of_line() ? token_eoln : token_eof;\n                break;\n            }\n        }\n\n        if (tok == token_eof)\n        {\n            if (!data_seen)\n                fatal_error(\"file contains no data\");\n            if (nbytes == 0)\n                return false;\n            goto yes;\n        }\n\n        if (nbytes > 0)\n        {\n            yes:\n            result = record(record::type_data, address, data, nbytes);\n            address += nbytes;\n            data_seen = true;\n            return true;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_hexdump::get_file_format_name(void)\n    const\n{\n    return \"hexdump\";\n}\n\n\nint\nsrecord::input_file_hexdump::format_option_number(void)\n    const\n{\n    return arglex_tool::token_hexdump;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/hexdump.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_HEXDUMP_H\n#define SRECORD_INPUT_FILE_HEXDUMP_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The input_file_hexdump class is used to represent the processing\n  * required to read in a hexadecimal dump.\n  */\nclass input_file_hexdump:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_hexdump();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param filename\n      *     The name of the file to be read.\n      */\n    static pointer create(const std::string &filename);\n\nprotected:\n    // See base class for documentation.\n    bool read(class record &rec);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param filename\n      *     The name of the file to be read.\n      */\n    input_file_hexdump(const std::string &filename);\n\n    enum token_t\n    {\n        token_eof,\n        token_byte,\n        token_colon,\n        token_eoln,\n        token_junk\n    };\n\n    /**\n      * The get_next_token method is used to read the next lexical token\n      * from the input.\n      *\n      * It will set the #current_token_value instance variable for token_byte\n      */\n    token_t get_next_token(void);\n\n    /**\n      * The discard_rest_of_line method is used to\n      * discard all characters until the next end of line character.\n      */\n    bool discard_rest_of_line(void);\n\n    /**\n      * The address instance variable is used to remember the current\n      * address of the next data record.  This is set and advanced by\n      * the #read method.\n      */\n    unsigned long address;\n\n    /**\n      * The data_seen instance variable is used to remember whether or\n      * not any data has been seen in the file.  This is used to issue\n      * an error when there is aparrently no data in the file, and this\n      * helps #guess to figure out the file is notof this type.\n      */\n    bool data_seen;\n\n    /**\n      * The current_token_value instance variable is used to remember\n      * the value of the most recent token_byte seen.\n      */\n    unsigned current_token_value;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_hexdump();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_hexdump(const input_file_hexdump &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_hexdump &operator=(const input_file_hexdump &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_HEXDUMP_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/idt.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/idt.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_idt::~input_file_idt()\n{\n}\n\n\nsrecord::input_file_idt::input_file_idt(\n    const std::string &a_file_name\n) :\n    input_file(a_file_name),\n    data_count(0),\n    seen_some_input(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_idt::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_idt(a_file_name));\n}\n\n\nvoid\nsrecord::input_file_idt::record_format_error(void)\n{\n    fatal_error(\"record format error\");\n}\n\n\nbool\nsrecord::input_file_idt::read_inner(record &result)\n{\n    int c = get_char();\n    if (c < 0)\n        return false;\n    if (c != 'S')\n        record_format_error();\n    int tag = get_nibble();\n    if (tag < 0)\n        record_format_error();\n    unsigned char csum = 0;\n    int line_length = get_char();\n    if (line_length < 0)\n        record_format_error();\n    csum += line_length;\n    if (line_length < 1)\n        fatal_error(\"line length invalid\");\n    record::data_t buffer[256];\n    for (int j = 0; j < line_length; ++j)\n    {\n        int c = get_char();\n        if (c < 0)\n            record_format_error();\n        buffer[j] = c;\n        csum += c;\n    }\n    if (use_checksums() && csum != 0xFF)\n        fatal_error(\"checksum mismatch (%02X != FF)\", csum);\n    --line_length;\n\n    int naddr = 2;\n    record::type_t type = record::type_unknown;\n    switch (tag)\n    {\n    default:\n        record_format_error();\n\n    case 0:\n        // header\n        type = record::type_header;\n        if (line_length < naddr)\n        {\n            // Some programs write Very short headers.\n            naddr = line_length;\n        }\n        break;\n\n    case 1:\n        // data\n        type = record::type_data;\n        break;\n\n    case 2:\n        // data\n        type = record::type_data;\n        naddr = 3;\n        break;\n\n    case 3:\n        // data\n        type = record::type_data;\n        naddr = 4;\n        break;\n\n    case 5:\n        // data count\n        type = record::type_data_count;\n        //\n        // This is documented as having 2 address bytes and\n        // no data bytes.  The Green Hills toolchain happily\n        // generates records with 4 address bytes.  We cope\n        // with this silently.\n        //\n        if (line_length >= 2 && line_length <= 4)\n            naddr = line_length;\n        break;\n\n    case 6:\n        // data count\n        type = record::type_data_count;\n        //\n        // Just in case some smarty-pants uses the Green Hills\n        // trick, we cope with address size crap the same as S5.\n        //\n        naddr = 3;\n        if (line_length == 4)\n            naddr = line_length;\n        break;\n\n    case 7:\n        // termination\n        type = record::type_execution_start_address;\n        naddr = 4;\n        break;\n\n    case 8:\n        // termination\n        type = record::type_execution_start_address;\n        naddr = 3;\n        break;\n\n    case 9:\n        // termination\n        type = record::type_execution_start_address;\n        break;\n    }\n    if (line_length < naddr)\n    {\n        fatal_error\n        (\n            \"data length too short (%d < %d) for data type (%x)\",\n            line_length,\n            naddr,\n            tag\n        );\n    }\n    record::address_t addr = record::decode_big_endian(buffer, naddr);\n    result = record(type, addr, buffer + naddr, line_length - naddr);\n    return true;\n}\n\n\nbool\nsrecord::input_file_idt::read(record &record)\n{\n    for (;;)\n    {\n        if (!read_inner(record))\n        {\n            if (!seen_some_input)\n                fatal_error(\"file contains no data\");\n            return false;\n        }\n        seen_some_input = true;\n        switch (record.get_type())\n        {\n        case record::type_unknown:\n            fatal_error(\"record type not recognised\");\n            break;\n\n        case record::type_header:\n            if (record.get_address())\n            {\n                warning(\"address in header record ignored\");\n                record.set_address(0);\n            }\n            break;\n\n        case record::type_data:\n            ++data_count;\n            if (record.get_length() == 0)\n            {\n                warning(\"empty data record ignored\");\n                continue;\n            }\n            break;\n\n        case record::type_data_count:\n            {\n                record::address_t addr = record.get_address();\n                record::address_t mask = 0xFFFF;\n                while (addr > mask)\n                    mask = ~(~mask << 8);\n                mask &= data_count;\n                if (addr != mask)\n                {\n                    fatal_error\n                    (\n                        \"data record count mismatch (file %ld, read %ld)\",\n                        (long)addr,\n                        (long)mask\n                    );\n                }\n            }\n            continue;\n\n        case record::type_execution_start_address:\n            if (record.get_length() > 0)\n            {\n                warning(\"data in termination record ignored\");\n                record.set_length(0);\n            }\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nbool\nsrecord::input_file_idt::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_idt::get_file_format_name()\n    const\n{\n    return \"IDT System Integration Manager binary\";\n}\n\n\nint\nsrecord::input_file_idt::format_option_number(void)\n    const\n{\n    return arglex_tool::token_idt;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/idt.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_IDT_H\n#define SRECORD_INPUT_FILE_IDT_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_idt class is used to represent the parse\n  * state of a IDT/sim binary format input file.\n  */\nclass input_file_idt:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_idt();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_idt(const std::string &file_name);\n\n    /**\n      * The data_count instance variable is used to remember the number\n      * of data lines has occurred fo far in the input file.\n      */\n    unsigned long data_count;\n\n    /**\n      * The read_inner method is used to read a record of input.\n      * The read method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The seen_some_input instance variable is used to remember where\n      * any data has been seen in this file yet.\n      */\n    bool seen_some_input;\n\n    /**\n      * The record_format_error is a wrapper around #fatal_error to\n      * complain abut format errors.\n      */\n    void record_format_error(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_idt();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_idt(const input_file_idt &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_idt &operator=(const input_file_idt &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_IDT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/intel.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2005-2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/intel.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_intel::~input_file_intel()\n{\n    if (pushback)\n        delete pushback;\n}\n\n\nsrecord::input_file_intel::input_file_intel(const std::string &a_file_name) :\n    srecord::input_file(a_file_name),\n    data_record_count(0),\n    garbage_warning(false),\n    seen_some_input(false),\n    termination_seen(false),\n    mode(mode_i8hex),\n    address_base(0),\n    pushback(0),\n    end_seen(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_intel::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_intel(a_file_name));\n}\n\n\nbool\nsrecord::input_file_intel::read_inner(srecord::record &record)\n{\n    if (pushback)\n    {\n        record = *pushback;\n        delete pushback;\n        pushback = 0;\n        return true;\n    }\n\n    //\n    // keep reading lines until something returnable comes along\n    //\n    for (;;)\n    {\n        //\n        // grab the first character of the line\n        //\n        int c = get_char();\n\n        //\n        // end of file means we are done\n        //\n        if (c < 0)\n            return false;\n\n        //\n        // quietly ignore blank lines\n        //\n        if (c == '\\n')\n            continue;\n\n        //\n        // If it doesn't start with a colon, it's a garbage line.\n        // Warn, and then ignore it.\n        //\n        if (c != ':')\n        {\n            if (!garbage_warning)\n            {\n                warning(\"ignoring garbage lines\");\n                garbage_warning = true;\n            }\n            for (;;)\n            {\n                c = get_char();\n                if (c < 0)\n                    return false;\n                if (c == '\\n')\n                    break;\n            }\n            continue;\n        }\n\n        //\n        // Looks like a real Intel-hex line.\n        //\n        unsigned char buffer[255+5];\n        checksum_reset();\n        buffer[0] = get_byte();\n        buffer[1] = get_byte();\n        buffer[2] = get_byte();\n        buffer[3] = get_byte();\n        for (int j = 0; j <= buffer[0]; ++j)\n            buffer[4 + j] = get_byte();\n        if (use_checksums())\n        {\n            int n = checksum_get();\n            if (n != 0)\n                fatal_error(\"checksum mismatch (%02X != 00)\", n);\n        }\n        if (get_char() != '\\n')\n            fatal_error(\"end-of-line expected\");\n\n        srecord::record::address_t address_field =\n            srecord::record::decode_big_endian(buffer + 1, 2);\n\n        srecord::record::type_t type = srecord::record::type_unknown;\n        switch (buffer[3])\n        {\n        case 0:\n            //\n            // data\n            //\n            switch (mode)\n            {\n            case mode_linear:\n                //\n                // linear addressing model\n                //\n                if\n                (\n                    (\n                        (long long)address_base + address_field\n                    <\n                        ((long long)1 << 32)\n                    )\n                &&\n                    (\n                        (long long)address_base + address_field + buffer[0]\n                    >\n                        ((long long)1 << 32)\n                    )\n                )\n                {\n                    int split =\n                        ((long long)1 << 32) - address_base - address_field;\n                    pushback =\n                        new srecord::record\n                        (\n                            srecord::record::type_data,\n                            0L,\n                            buffer + 4 + split,\n                            buffer[0] - split\n                        );\n                    buffer[0] = split;\n                }\n                break;\n\n            case mode_segmented:\n                //\n                // segmented addressing model\n                //\n                if (address_field + buffer[0] > (1L << 16))\n                {\n                    //\n                    // If the record would cross a segment boundary,\n                    // wrap around to the beginning of the segment.  We\n                    // do this by using \"pushback\" to remember additonal\n                    // data.\n                    //\n                    int split = (1L << 16) - address_field;\n                    pushback =\n                        new srecord::record\n                        (\n                            srecord::record::type_data,\n                            address_base + ((address_field + split) & 0xFFFF),\n                            buffer + 4 + split,\n                            buffer[0] - split\n                        );\n                    buffer[0] = split;\n                }\n                break;\n\n            case mode_i8hex:\n                break;\n            }\n            type = srecord::record::type_data;\n            break;\n\n        case 1:\n            //\n            // end-of-file record\n            //\n            if (buffer[0] != 0)\n                fatal_error(\"EOF data length field must be zero\");\n            end_seen = true;\n            seek_to_end();\n            switch (mode)\n            {\n            case mode_i8hex:\n                if (address_field != 0)\n                {\n                    record =\n                        srecord::record\n                        (\n                            srecord::record::type_execution_start_address,\n                            address_field,\n                            0,\n                            0\n                        );\n                    return true;\n                }\n                break;\n\n            case mode_linear:\n            case mode_segmented:\n                if (address_field != 0)\n                {\n                    warning\n                    (\n                        \"end-of-file record's address field should be zero, \"\n                            \"not 0x%04X\",\n                        address_field\n                    );\n                }\n                break;\n            }\n            return false;\n\n        case 2:\n            //\n            // extended segment address record\n            //\n            // Set the base address and addressing mode,\n            // and then loop for another record, this one\n            // isn't visable to the caller.\n            //\n            if (buffer[0] != 2)\n                fatal_error(\"length field must be 2\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_field =\n                srecord::record::decode_big_endian(buffer + 4, 2);\n            address_base = address_field << 4;\n            mode = mode_segmented;\n            continue;\n\n        case 3:\n            //\n            // start segment address record\n            //\n            if (buffer[0] != 4)\n                fatal_error(\"length field must be 4\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_field =\n                srecord::record::decode_big_endian(buffer + 4, 2) * 16 +\n                srecord::record::decode_big_endian(buffer + 6, 2);\n            record =\n                srecord::record\n                (\n                    srecord::record::type_execution_start_address,\n                    address_field,\n                    0,\n                    0\n                );\n            mode = mode_segmented;\n            return true;\n\n        case 4:\n            //\n            // extended linear address record\n            //\n            // Set the base address and addressing mode,\n            // and then loop for another record, this one\n            // isn't visable to the caller.\n            //\n            if (buffer[0] != 2)\n                fatal_error(\"length field must be 2\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_field =\n                srecord::record::decode_big_endian(buffer + 4, 2);\n            address_base = address_field << 16;\n            mode = mode_linear;\n            continue;\n\n        case 5:\n            //\n            // start linear address record\n            //\n            if (buffer[0] != 4)\n                fatal_error(\"length field must be 4\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_field = srecord::record::decode_big_endian(buffer + 4, 4);\n            record =\n                srecord::record\n                (\n                    srecord::record::type_execution_start_address,\n                    address_field,\n                    0,\n                    0\n                );\n            mode = mode_linear;\n            return true;\n        }\n\n        //\n        // data record or unknown\n        //\n        record =\n            srecord::record\n            (\n                type,\n                address_base + address_field,\n                buffer + 4,\n                buffer[0]\n            );\n        return true;\n    }\n}\n\n\nbool\nsrecord::input_file_intel::read(srecord::record &record)\n{\n    for (;;)\n    {\n        if (!read_inner(record))\n        {\n            if (!seen_some_input && garbage_warning)\n                fatal_error(\"file contains no data\");\n            if (data_record_count <= 0)\n                fatal_error(\"file contains no data\");\n            if (!termination_seen)\n            {\n                //\n                // Eric Weddington:  ''From looking at the \"Hexadecimal\n                // Object File Format Specification\" from Intel,\n                // Revision A, January 6, 1988, the Extended Segment\n                // Address Record (0x02) and the Extended Linear Address\n                // Record (0x04) are both optional. The respective\n                // addresses default to 0 until either type of record is\n                // encountered.''\n                //\n                termination_seen = true;\n#if 0\n                //\n                // We could synthesize an execution start address, but\n                // that means the input and output don't agree when a\n                // round-trip occurs.\n                //\n                record =\n                    srecord::record\n                    (\n                        srecord::record::type_execution_start_address,\n                        0,\n                        0,\n                        0\n                    );\n                return true;\n#endif\n            }\n            if (!end_seen)\n            {\n                warning(\"no end-of-file record\");\n                end_seen = true;\n            }\n            return false;\n        }\n        seen_some_input = true;\n        switch (record.get_type())\n        {\n        case srecord::record::type_unknown:\n            fatal_error(\"record type not recognised\");\n            break;\n\n        default:\n            // impossible\n            continue;\n\n        case srecord::record::type_data:\n            ++data_record_count;\n            if (record.get_length() == 0)\n            {\n                warning(\"empty data record ignored\");\n                continue;\n            }\n            break;\n\n        case srecord::record::type_execution_start_address:\n            if (termination_seen)\n                warning(\"redundant execution start address record\");\n            termination_seen = true;\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_intel::get_file_format_name()\n    const\n{\n    return \"Intel Hexadecimal (MCS-86)\";\n}\n\n\nint\nsrecord::input_file_intel::format_option_number(void)\n    const\n{\n    return arglex_tool::token_intel;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/intel.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_INTEL_H\n#define SRECORD_INPUT_FILE_INTEL_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_intel class is used to represent the parse state\n  * of an Intel Hex formatted file.\n  */\nclass input_file_intel:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_intel();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_intel(const std::string &file_name);\n\n    /**\n      * Read one record from the file.  The read method is a wrapper\n      * around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The data_record_count instance variable is used to remember the\n      * number of data records seen to date.\n      */\n    int data_record_count;\n\n    /**\n      * The garbage_warning instance variable is used to remember wherther\n      * or not a warning has already been issued about garbage lines\n      * of input.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * or not the file contains any data.\n      */\n    bool seen_some_input;\n\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether or not a termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    enum mode_t\n    {\n        mode_linear, // aka i32hex\n        mode_segmented, // aka i16hex\n        mode_i8hex\n    };\n\n    /**\n      * The mode instance variable is used to remember what addressing\n      * mode the file is currently in.\n      */\n    mode_t mode;\n\n    /**\n      * The address_base instance variable is used to remember the\n      * segment base address when in segmented addressing mode.\n      */\n    unsigned long address_base;\n\n    /**\n      * The pushback instance variable is used to remember the previous\n      * record in the file.  This is needed in some instances, but not always.\n      */\n    record *pushback;\n\n    /**\n      * The end_seen instance variable is used to remember whether or\n      * not the end of file has been seen yet.\n      */\n    bool end_seen;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_intel();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_intel(const input_file_intel &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_intel &operator=(const input_file_intel &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_INTEL_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/intel16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2005-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/intel16.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_intel16::~input_file_intel16()\n{\n    delete pushback;\n}\n\n\nsrecord::input_file_intel16::input_file_intel16(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    data_record_count(0),\n    garbage_warning(false),\n    seen_some_input(false),\n    termination_seen(false),\n    mode(linear),\n    address_base(0),\n    pushback(0),\n    end_seen(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_intel16::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_intel16(a_file_name));\n}\n\n\nbool\nsrecord::input_file_intel16::read_inner(record &result)\n{\n    if (pushback)\n    {\n        result = *pushback;\n        delete pushback;\n        pushback = 0;\n        return true;\n    }\n\n    //\n    // keep reading lines until something returnable comes along\n    //\n    for (;;)\n    {\n        //\n        // grab the first character of the line\n        //\n        int c = get_char();\n\n        //\n        // end of file means we are done\n        //\n        if (c < 0)\n            return false;\n\n        //\n        // quietly ignore blank lines\n        //\n        if (c == '\\n')\n            continue;\n\n        //\n        // If it doesn't start with a colon, it's a garbage line.\n        // Warn, and then ignore it.\n        //\n        if (c != ':')\n        {\n            if (!garbage_warning)\n            {\n                warning(\"ignoring garbage lines\");\n                garbage_warning = true;\n            }\n            for (;;)\n            {\n                c = get_char();\n                if (c < 0)\n                    return false;\n                if (c == '\\n')\n                    break;\n            }\n            continue;\n        }\n\n        //\n        // Looks like a real Intel-hex line.\n        //\n        unsigned char buffer[255*2+5];\n        checksum_reset();\n        buffer[0] = get_byte();\n        unsigned nbytes = buffer[0] << 1;\n        buffer[1] = get_byte();\n        buffer[2] = get_byte();\n        buffer[3] = get_byte();\n        for (unsigned j = 0; j <= nbytes; ++j)\n        {\n            // Note: the bytes are HI,LO and we need the other way around\n            buffer[4 + (j ^ 1)] = get_byte();\n        }\n        if (use_checksums())\n        {\n            int csum = checksum_get();\n            if (csum != 0x00)\n                fatal_error(\"checksum mismatch (%02X != 00)\", csum);\n        }\n        if (get_char() != '\\n')\n            fatal_error(\"end-of-line expected\");\n\n        record::address_t address_field =\n             2 * record::decode_big_endian(buffer + 1, 2);\n\n        record::type_t type = record::type_unknown;\n        switch (buffer[3])\n        {\n        case 0:\n            //\n            // data\n            //\n            if (mode == linear)\n            {\n                //\n                // linear addressing model\n                //\n                if\n                (\n                    (\n                        (long long)address_base + address_field\n                    <\n                        ((long long)1 << 32)\n                    )\n                &&\n                    (\n                        (long long)address_base + address_field + nbytes\n                    >\n                        ((long long)1 << 32)\n                    )\n                )\n                {\n                    int split =\n                        ((long long)1 << 32) - address_base - address_field;\n                    pushback =\n                        new record\n                        (\n                            record::type_data,\n                            0L,\n                            buffer + 4 + split,\n                            nbytes - split\n                        );\n                    nbytes = split;\n                }\n            }\n            else\n            {\n                //\n                // segmented addressing model\n                // (Does this make sense for INHX16?)\n                //\n                if (address_field + nbytes > (1L << 16))\n                {\n                    int split = (1L << 16) - address_field;\n                    pushback =\n                        new record\n                        (\n                            record::type_data,\n                            address_base + ((address_field + split) & 0xFFFF),\n                            buffer + 4 + split,\n                            nbytes - split\n                        );\n                    nbytes = split;\n                }\n            }\n            type = record::type_data;\n            break;\n\n        case 1:\n            //\n            // end-of-file record\n            //\n            if (nbytes != 0)\n                fatal_error(\"length field must be zero\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            end_seen = true;\n            seek_to_end();\n            return false;\n\n        case 2:\n            //\n            // extended segment address record\n            //\n            // Set the base address and addressing mode,\n            // and then loop for another record, this one\n            // isn't visable to the caller.\n            //\n            // (Does this make sense for INHX16?)\n            //\n            if (nbytes != 2)\n                fatal_error(\"length field must be 1\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_base = record::decode_big_endian(buffer + 4, 2) << 5;\n            mode = segmented;\n            continue;\n\n        case 3:\n            //\n            // start segment address record\n            //\n            if (nbytes != 4)\n                fatal_error(\"length field must be 4\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_field =\n                record::decode_big_endian(buffer + 4, 2) * 16 +\n                record::decode_big_endian(buffer + 6, 2);\n            result =\n                record\n                (\n                    record::type_execution_start_address,\n                    address_field << 1,\n                    0,\n                    0\n                );\n            return true;\n\n        case 4:\n            //\n            // extended linear address record\n            //\n            // Set the base address and addressing mode,\n            // and then loop for another record, this one\n            // isn't visable to the caller.\n            //\n            // (Does this make sense for INHX16?)\n            //\n            if (nbytes != 2)\n                fatal_error(\"length field must be 1\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_base = record::decode_big_endian(buffer + 4, 2) << 17;\n            mode = linear;\n            continue;\n\n        case 5:\n            //\n            // start linear address record\n            //\n            if (nbytes != 4)\n                fatal_error(\"length field must be 2\");\n            if (address_field != 0)\n                fatal_error(\"address field must be zero\");\n            address_field = record::decode_big_endian(buffer + 4, 4);\n            result =\n                record\n                (\n                    record::type_execution_start_address,\n                    address_field << 1,\n                    0,\n                    0\n                );\n            return true;\n        }\n\n        //\n        // data record or unknown\n        //\n        result =\n            record\n            (\n                type,\n                address_base + address_field,\n                buffer + 4,\n                nbytes\n            );\n        return true;\n    }\n}\n\n\nbool\nsrecord::input_file_intel16::read(record &result)\n{\n    for (;;)\n    {\n        if (!read_inner(result))\n        {\n            if (!seen_some_input && garbage_warning)\n                fatal_error(\"file contains no data\");\n            if (data_record_count <= 0)\n                fatal_error(\"file contains no data\");\n            if (!end_seen)\n            {\n                warning(\"no end-of-file record\");\n                termination_seen = true;\n            }\n            return false;\n        }\n        seen_some_input = true;\n        switch (result.get_type())\n        {\n        case record::type_unknown:\n            fatal_error(\"record type not recognised\");\n            break;\n\n        default:\n            // impossible\n            continue;\n\n        case record::type_data:\n            ++data_record_count;\n            if (result.get_length() == 0)\n            {\n                warning(\"empty data record ignored\");\n                continue;\n            }\n            break;\n\n        case record::type_execution_start_address:\n            if (termination_seen)\n                warning(\"redundant execution start address record\");\n            termination_seen = true;\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_intel16::get_file_format_name()\n    const\n{\n    return \"Intel Hexadecimal 16 (INHX16)\";\n}\n\n\nint\nsrecord::input_file_intel16::format_option_number(void)\n    const\n{\n    return arglex_tool::token_intel16;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/intel16.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_INTEL16_H\n#define SRECORD_INPUT_FILE_INTEL16_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_file_intel16 class is used to represent the parse state\n  * of an INHX16 formatted file.\n  */\nclass input_file_intel16:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_intel16();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_intel16(const std::string &file_name);\n\n    /**\n      * Read one record from the file.  The read method is a wrapper\n      * around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The data_record_count instance variable is used to remember the\n      * number of data records seen to date.\n      */\n    int data_record_count;\n\n    /**\n      * The garbage_warning instance variable is used to remember wherther\n      * or not a warning has already been issued about garbage lines\n      * of input.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * or not the file contains any data.\n      */\n    bool seen_some_input;\n\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether or not a termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * The mode instance variable is used to remember what addressing\n      * mode the file is currently in.\n      */\n    enum { linear, segmented } mode;\n\n    /**\n      * The address_base instance variable is used to remember the\n      * segment base address when in segmented addressing mode.\n      */\n    unsigned long address_base;\n\n    /**\n      * The pushback instance variable is used to remember the previous\n      * record in the file.  This is needed in some instances, but not always.\n      */\n    record *pushback;\n\n    /**\n      * The end_seen instance variable is used to remember whether or\n      * not the end of file has been seen yet.\n      */\n    bool end_seen;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_intel16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_intel16(const input_file_intel16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_intel16 &operator=(const input_file_intel16 &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_INTEL16_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/logisim.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/logisim.h>\n#include <srecord/string.h>\n\n\nsrecord::input_file_logisim::~input_file_logisim()\n{\n}\n\n\nsrecord::input_file_logisim::input_file_logisim(\n    const std::string &a_file_name\n) :\n    input_file(a_file_name),\n    address(0),\n    state(state_line_one)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_logisim::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_logisim(a_file_name));\n}\n\n\nstatic std::string\nquote_char(int c)\n{\n     if (c == EOF)\n        return \"EOF\";\n     if (c == '\\0')\n        return \"\\\\0\";\n     char buf[2] = { static_cast<char>(c), '\\0' };\n     return srecord::string_quote_c(buf);\n}\n\n\nvoid\nsrecord::input_file_logisim::read_inner_one(void)\n{\n    char buffer[512];\n    char *bp = buffer;\n    char *end = buffer + sizeof(buffer) - 1;\n    for (;;)\n    {\n        int c = get_char();\n        switch(c)\n        {\n        case EOF:\n            return;\n\n        case '\\n':\n            break;\n\n        default:\n            if (bp > end)\n                fatal_error(\"line too long\");\n            *bp++ = c;\n            continue;\n        }\n        break;\n    }\n    *bp = '\\0';\n    if (strcmp(buffer, \"v2.0 raw\"))\n        fatal_error(\"bad magic number\");\n    state = state_line_two;\n}\n\n\nvoid\nsrecord::input_file_logisim::read_inner_two(void)\n{\n    bool warned = false;\n    for (;;)\n    {\n        int c = get_char();\n        switch (c)\n        {\n        case EOF:\n            return;\n\n        case '\\n':\n            break;\n\n        case ' ':\n        case '\\t':\n        case '\\r':\n        case '\\f':\n        case '\\v':\n            continue;\n\n        default:\n            if (!warned)\n            {\n                warning(\"second line must be completely empty\");\n                warned = true;\n            }\n            continue;\n        }\n        break;\n    }\n    state = state_lines_of_data;\n}\n\n\nvoid\nsrecord::input_file_logisim::read_inner_job(void)\n{\n    char buffer[200];\n    char *bp = buffer;\n    char *end = buffer + (sizeof(buffer) - 1);\n    char *seen_star = 0;\n    for(;;)\n    {\n        if (jobs.size() > 20)\n            return;\n        int c = get_char();\n        switch (c)\n        {\n        case EOF:\n            return;\n\n        case ' ':\n        case '\\t':\n        case '\\r':\n        case '\\n':\n        case '\\f':\n            // ignore leading white space\n            continue;\n\n        default:\n            warning(\"ignoring junk %s\", quote_char(c).c_str());\n            break;\n\n        case '0': case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n            bp = buffer;\n            seen_star = 0;\n            for (;;)\n            {\n                if (bp >= end)\n                    fatal_error(\"datum too long\");\n                *bp++ = c;\n\n                c = get_char();\n                switch(c)\n                {\n                case '*':\n                    seen_star = bp + 1;\n                    // Fall through...\n\n                case '0': case '1': case '2': case '3': case '4':\n                case '5': case '6': case '7': case '8': case '9':\n                case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n                case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n                case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':\n                    continue;\n\n                case ' ':\n                case '\\n':\n                case '\\t':\n                case '\\r':\n                case '\\f':\n                default:\n                    get_char_undo(c);\n                    break;\n                }\n                break;\n            }\n            *bp = '\\0';\n\n            // now push it on the back of the jobs list\n            {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{\n            if (seen_star)\n            {\n                char *ep = 0;\n                long count = strtol(buffer, &ep, 10);\n                if (buffer == ep || *ep != '*')\n                    fatal_error(\"malformed datum\");\n\n                // The doco does not reveal a way to distingush\n                // 1-byte vs 2-byte or 4-byte items.  Also it\n                // doesn't specify endian-ness.\n                ep = 0;\n                unsigned long value = strtoul(seen_star, &ep, 16);\n                if (seen_star == ep || *ep != '\\0')\n                    fatal_error(\"malformed datum\");\n                datum_t job(address, count, value);\n                jobs.push_back(job);\n                address += count;\n                return;\n            }\n\n            // no star\n            char *ep = 0;\n            long n = strtol(buffer, &ep, 16);\n            if (buffer == ep || *ep != '\\0')\n                fatal_error(\"malformed datum\");\n            datum_t job(address, 1, n);\n            jobs.push_back(job);\n            ++address;\n            }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}\n            break;\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_logisim::read(class record &rec)\n{\n    for (;;)\n    {\n        if (state == state_line_one)\n            read_inner_one();\n        if (state == state_line_two)\n            read_inner_two();\n        assert(state == state_lines_of_data);\n\n        // So now we unwrap the run-length encoding\n        if (!jobs.empty())\n        {\n            datum_t job(jobs.front());\n            jobs.pop_front();\n\n            size_t max_data_size = record::maximum_data_length(address);\n            size_t data_size =\n                ((size_t)job.count > max_data_size ? max_data_size : job.count);\n            record::data_t data[data_size];\n            memset(data, job.value, data_size);\n            rec = record(record::type_data, job.address, data, data_size);\n            job.address += data_size;\n            job.count -= data_size;\n            if (job.count > 0)\n            {\n                jobs.push_back(job);\n            }\n            return true;\n        }\n        read_inner_job();\n\n        if (jobs.empty())\n            return false;\n    }\n}\n\n\nconst char *\nsrecord::input_file_logisim::get_file_format_name(void)\n    const\n{\n    return \"Logisim\";\n}\n\n\nint\nsrecord::input_file_logisim::format_option_number(void)\n    const\n{\n    return srecord::arglex_tool::token_logisim;\n}\n\n\nstd::string\nsrecord::input_file_logisim::datum_t::representation(void)\n    const\n{\n    char buffer[200];\n    snprintf\n    (\n        buffer,\n        sizeof(buffer),\n        \"{ address = 0x%04X, count = %ld, value = 0x%02X }\",\n        address,\n        count,\n        value\n    );\n    return buffer;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/logisim.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_LOGISIM_H\n#define SRECORD_INPUT_FILE_LOGISIM_H\n\n#include <inttypes.h>\n#include <list>\n\n#include <srecord/record.h>\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The input_file_logisim class is used to represent\n  * the processing required to parse Logisim rom data files.\n  *\n  *\n  * http://ozark.hendrix.edu/~burch/logisim/docs/2.3.0/guide/mem/menu.html\n  *\n  * Pop-up menus and files\n  *\n  * The pop-up menu for memory includes four options in addition to the\n  * options common to all components:\n  *\n  * Edit Contents:\n  *     Bring up a hex editor for editing the contents of memory.\n  * Clear Contents:\n  *     Resets all values in memory to 0.\n  * Load Image...:\n  *     Resets all values in memory based on the values found in a file\n  *     using the format described below.\n  * Save Image...:\n  *     Stores all values in memory into a file using the format\n  *     described below.\n  *\n  * The file format used for image files is intentionally simple; this\n  * permits you to write a program, such as an assembler, that generates\n  * memory images that can then be loaded into memory. As an example of\n  * this file format, if we had a 256-byte memory whose first five bytes\n  * were 2, 3, 0, 20, and -1, and all subsequent values were 0, then the\n  * image would be the following text file.\n  *\n  *    v2.0 raw\n  *\n  *    02\n  *    03\n  *    00\n  *    14\n  *    ff\n  *\n  * The first line identifies the file format used (currently, there is\n  * only one file format recognized). Subsequent values list the values\n  * in hexadecimal, starting from address 0; you can place several\n  * such values on the same line. Logisim will assume that any values\n  * unlisted in the file are zero.\n  *\n  * The image file can use run-length encoding; for example, rather\n  * than list the value 00 sixteen times in a row, the file can include\n  * 16*00 rather than repeat 00 sixteen times. Notice than the number of\n  * repetitions is written in base 10. Files produced by Logisim will\n  * use run-length encoding for runs of at least four values\n  */\nclass input_file_logisim:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_logisim();\n\n    static input_file::pointer create(const std::string &file_name);\n\n    enum state_t\n    {\n        state_line_one,\n        state_line_two,\n        state_lines_of_data,\n    };\n\nprotected:\n    // See base class for documentation\n    bool read(srecord::record &rec);\n\n    // See base class for documentation\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation\n    int format_option_number(void) const;\n\n    /**\n      * The constructor.\n      */\n    input_file_logisim(const std::string &file_name);\n\nprivate:\n    srecord::record::address_t address;\n    state_t state;\n\n    struct datum_t\n    {\n        datum_t() : address(0), count(1), value(0xFF) { }\n        datum_t(uint32_t aa, long ac, uint32_t av) :\n            address(aa), count(ac), value(av) { }\n        uint32_t address;\n        long count;\n        uint32_t value;\n        std::string representation(void) const;\n    };\n\n    std::list<datum_t> jobs;\n\n    bool read_inner(record &rec);\n    void read_inner_one(void);\n    void read_inner_two(void);\n    void read_inner_job(void);\n\n    /**\n      * The default constructor.\n      */\n    input_file_logisim();\n\n    /**\n      * The copy constructor.\n      */\n    input_file_logisim(const input_file_logisim &);\n\n    /**\n      * The assignment operator.\n      */\n    input_file_logisim &operator=(const input_file_logisim &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_LOGISIM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/mif.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/mif.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_mif::~input_file_mif()\n{\n}\n\n\nsrecord::input_file_mif::input_file_mif(const std::string &a_file_name) :\n    srecord::input_file(a_file_name),\n    state(state_header),\n    address(0),\n    lex_radix(10),\n    lex_addr_radix(16),\n    lex_data_radix(16),\n    width(8),\n    width_in_bytes(1)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_mif::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_mif(a_file_name));\n}\n\n\nsrecord::input_file_mif::token_t\nsrecord::input_file_mif::lex_addr(void)\n{\n    lex_radix = lex_addr_radix;\n    token_t result = lex();\n    lex_radix = 10;\n    return result;\n}\n\n\nsrecord::input_file_mif::token_t\nsrecord::input_file_mif::lex_data(void)\n{\n    lex_radix = lex_data_radix;\n    token_t result = lex();\n    lex_radix = 10;\n    return result;\n}\n\n\nsrecord::input_file_mif::token_t\nsrecord::input_file_mif::lex(void)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n            return token_eof;\n        switch (c)\n        {\n        case ' ':\n        case '\\t':\n        case '\\r':\n        case '\\n':\n            continue;\n\n        case '.':\n            c = get_char();\n            if (c == '.')\n                return token_dotdot;\n            if (c >= 0)\n                get_char_undo(c);\n            return token_dot;\n\n        case '=':\n            return token_equals;\n\n        case ':':\n            return token_colon;\n\n        case ';':\n            return token_semicolon;\n\n        case '%':\n            for (;;)\n            {\n                c = get_char();\n                if (c < 0 || c == '%')\n                    break;\n            }\n            continue;\n\n        case '-':\n            if (peek_char() == '-')\n            {\n                for (;;)\n                {\n                    c = get_char();\n                    if (c < 0 || c == '\\n')\n                        break;\n                }\n                continue;\n            }\n            return token_minus;\n\n        case '[':\n            return token_bracket_left;\n\n        case ']':\n            return token_bracket_right;\n\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':\n        case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':\n        case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':\n        case 'V': case 'W': case 'X': case 'Y': case 'Z':\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':\n        case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':\n        case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':\n        case 'v': case 'w': case 'x': case 'y': case 'z':\n        case '0': case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n        case '_':\n            {\n                std::string id;\n                for (;;)\n                {\n                    id += (char)c;\n                    c = get_char();\n                    if (c < 0)\n                        break;\n                    switch (c)\n                    {\n                    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n                    case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':\n                    case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':\n                    case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':\n                    case 'Y': case 'Z':\n                    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n                    case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':\n                    case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':\n                    case 's': case 't': case 'u': case 'v': case 'w': case 'x':\n                    case 'y': case 'z':\n                    case '0': case '1': case '2': case '3': case '4':\n                    case '5': case '6': case '7': case '8': case '9':\n                    case '_':\n                        continue;\n\n                    default:\n                        get_char_undo(c);\n                        break;\n                    }\n                    break;\n                }\n\n                //\n                // See if we are looking at a number.\n                //\n                // The only place there is the possibility of ambiguity\n                // is the \"DEC\" keyword, that could also be the 0xDEC\n                // number.  However, this only ever occurs in the\n                // radix-10 header portion, and will not be a problem\n                // (because strtol will reject it).\n                //\n                const char *cp = id.c_str();\n                char *ep = 0;\n                token_value = strtol(cp, &ep, lex_radix);\n                if (ep != cp && !*ep)\n                    return token_number;\n\n                //\n                // See if it is a known identifier.\n                //\n                if (id == \"ADDRESS_RADIX\")\n                    return token_address_radix;\n                if (id == \"BEGIN\")\n                    return token_begin;\n                if (id == \"BIN\")\n                    return token_bin;\n                if (id == \"CONTENT\")\n                    return token_content;\n                if (id == \"DATA_RADIX\")\n                    return token_data_radix;\n                if (id == \"DEC\")\n                    return token_dec;\n                if (id == \"DEPTH\")\n                    return token_depth;\n                if (id == \"END\")\n                    return token_end;\n                if (id == \"HEX\")\n                    return token_hex;\n                if (id == \"OCT\")\n                    return token_oct;\n                if (id == \"UNS\")\n                    return token_dec;\n                if (id == \"WIDTH\")\n                    return token_width;\n            }\n            return token_junk;\n\n        default:\n            return token_junk;\n        }\n    }\n}\n\n\nvoid\nsrecord::input_file_mif::syntax_error(const char *text)\n{\n    fatal_error(\"%s\", text);\n}\n\n\nvoid\nsrecord::input_file_mif::get_equals(void)\n{\n    if (lex() != token_equals)\n        syntax_error(\"equals (=) expected\");\n}\n\n\nlong\nsrecord::input_file_mif::get_number(void)\n{\n    if (lex() != token_number)\n        syntax_error(\"decimal number expected\");\n    return token_value;\n}\n\n\nvoid\nsrecord::input_file_mif::get_semicolon(void)\n{\n    if (lex() != token_semicolon)\n        syntax_error(\"semicolon (;) expected\");\n}\n\n\nvoid\nsrecord::input_file_mif::get_colon(void)\n{\n    if (lex() != token_colon)\n        syntax_error(\"colon (:) expected\");\n}\n\n\nint\nsrecord::input_file_mif::get_radix(void)\n{\n    switch (lex())\n    {\n    case token_hex:\n        return 16;\n\n    case token_oct:\n        return 8;\n\n    case token_bin:\n        return 2;\n\n    case token_dec:\n        break;\n\n    default:\n        syntax_error(\"radix specifier expected\");\n        // NOTREACHED\n    }\n    return 10;\n}\n\n\nbool\nsrecord::input_file_mif::read(srecord::record &record)\n{\n    unsigned char buffer[srecord::record::max_data_length];\n    size_t bufpos = 0;\n    unsigned address_range = 0;\n\n    for (;;)\n    {\n        switch (state)\n        {\n        case state_eof:\n            return false;\n\n        case state_header:\n            switch (lex())\n            {\n            default:\n                syntax_error(\"header expected\");\n\n            case token_depth:\n                get_equals();\n                get_number();\n                get_semicolon();\n                break;\n\n            case token_width:\n                get_equals();\n                width = get_number();\n                if (width < 1 || width > sizeof(buffer) * 8)\n                    syntax_error(\"width out of range\");\n                width_in_bytes = (width + 7) / 8;\n                get_semicolon();\n                break;\n\n            case token_address_radix:\n                get_equals();\n                lex_addr_radix = get_radix();\n                get_semicolon();\n                break;\n\n            case token_data_radix:\n                get_equals();\n                lex_data_radix = get_radix();\n                get_semicolon();\n                break;\n\n            case token_content:\n                if (lex() != token_begin)\n                    syntax_error(\"BEGIN expected\");\n                state = state_address;\n                break;\n            }\n            break;\n\n        case state_address:\n            address_range = 0;\n            switch (lex_addr())\n            {\n            default:\n                syntax_error(\"address expected\");\n                // NOTREACHED\n\n            case token_number:\n                address = token_value * width_in_bytes;\n                get_colon();\n                state = state_data;\n                break;\n\n            case token_end:\n                state = state_eof;\n                break;\n\n            case token_bracket_left:\n                {\n                    if (lex_addr() != token_number)\n                        syntax_error(\"start of address range expected\");\n                    unsigned long address_lo = token_value;\n                    if (lex_addr() != token_dotdot)\n                        syntax_error(\"dot dot (..) expected\");\n                    if (lex_addr() != token_number)\n                        syntax_error(\"end of address range expected\");\n                    unsigned long address_hi = token_value;\n                    if (address_hi < address_lo)\n                        syntax_error(\"address range backwards\");\n                    address_range = address_hi + 1 - address_lo;\n                    address_range *= width_in_bytes;\n                    if (address_range > sizeof(buffer))\n                        syntax_error(\"address range too large\");\n                    if (lex_addr() != token_bracket_right)\n                        syntax_error(\"right bracket ']' expected\");\n                    get_colon();\n                    address = address_lo;\n                    state = state_data;\n                }\n                break;\n            }\n            break;\n\n        case state_data:\n            switch (lex_data())\n            {\n            default:\n                syntax_error(\"data expected\");\n                // NOTREACHED\n\n            case token_number:\n                for (unsigned j = 0; j < width_in_bytes; ++j)\n                {\n                    unsigned jj = width_in_bytes - 1 - j;\n                    buffer[bufpos + jj] = token_value >> (jj << 3);\n                }\n                bufpos += width_in_bytes;\n                address += width_in_bytes;\n                if (bufpos + width_in_bytes > sizeof(buffer))\n                {\n                    if (address_range != 0)\n                        syntax_error(\"data too large for address range\");\n                    record =\n                        srecord::record\n                        (\n                            srecord::record::type_data,\n                            address - bufpos,\n                            buffer,\n                            bufpos\n                        );\n                    return true;\n                }\n                break;\n\n            case token_semicolon:\n                state = state_address;\n                if (bufpos > 0)\n                {\n                    if (address_range != 0)\n                    {\n                        if (bufpos > address_range)\n                            syntax_error(\"too much data for address range\");\n                        if (bufpos > 0 && bufpos < address_range)\n                        {\n                            // deliberately memcpy onto self\n                            // to repeat the data in the buffer\n                            size_t nbytes = address_range - bufpos;\n                            const unsigned char *end = buffer + address_range;\n                            const unsigned char *in = buffer;\n                            unsigned char *out = buffer + bufpos;\n                            while (out < end)\n                                *out++ = *in++;\n                            bufpos += nbytes;\n                            address += nbytes;\n                        }\n                    }\n                    record =\n                        srecord::record\n                        (\n                            srecord::record::type_data,\n                            address - bufpos,\n                            buffer,\n                            bufpos\n                        );\n                    return true;\n                }\n                break;\n            }\n            break;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_mif::get_file_format_name(void)\n    const\n{\n    return \"Memory Initialization File (MIF, Altera)\";\n}\n\n\nint\nsrecord::input_file_mif::format_option_number(void)\n    const\n{\n    return arglex_tool::token_memory_initialization_file;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/mif.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_MIF_H\n#define SRECORD_INPUT_FILE_MIF_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_mif class is used to represent the parse state\n  * when reading a Memory Initialization File (MIF) formatted file.\n  */\nclass input_file_mif:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_mif();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      * It is private on putpose, use the #create class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_mif(const std::string &file_name);\n\n    enum state_t\n    {\n        state_header,\n        state_eof,\n        state_address,\n        state_data\n    };\n\n    /**\n      * The state instance variable is used to remember the parse state\n      * as we progress through the file.\n      */\n    state_t state;\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the input file, so it may be associated with data bytes.\n      */\n    unsigned long address;\n\n    /**\n      * The lex_radix instance variable is used to remember the numeric\n      * radix to be used when parsing numbers.\n      */\n    unsigned lex_radix;\n\n    /**\n      * The lex_addr_radix instance variable is used to remember the\n      * numeric radix to be used when parsing address values.\n      */\n    unsigned lex_addr_radix;\n\n    /**\n      * The lex_data_radix instance variable is used to remember the\n      * numeric radix to be used when parsing data values.\n      */\n    unsigned lex_data_radix;\n\n    enum token_t\n    {\n        token_address_radix,\n        token_begin,\n        token_bin,\n        token_bracket_left,\n        token_bracket_right,\n        token_colon,\n        token_content,\n        token_data_radix,\n        token_dec,\n        token_depth,\n        token_dot,\n        token_dotdot,\n        token_end,\n        token_eof,\n        token_equals,\n        token_hex,\n        token_junk,\n        token_minus,\n        token_number,\n        token_oct,\n        token_semicolon,\n        token_width\n    };\n\n    /**\n      * The lex method is used to obtain the next lexical token from the\n      * input stream.\n      */\n    token_t lex(void);\n\n    /**\n      * The token_value instance variable is used to remember the\n      * numeric value of token_number returns from #lex.\n      */\n    long token_value;\n\n    /**\n      * The lex_addr method is used to obtain the next lexical token\n      * from the input stream, using the address radix.\n      */\n    token_t lex_addr(void);\n\n    /**\n      * The lex_data method is used to obtain the next lexical token\n      * from the input stream, using the data radix.\n      */\n    token_t lex_data(void);\n\n    /**\n      * The syntax_error method is used to report parse errors when\n      * reading the file.\n      *\n      * @param text\n      *     The text of the error message.\n      */\n    void syntax_error(const char *text);\n\n    void get_equals(void);\n    long get_number(void);\n    void get_semicolon(void);\n    int get_radix(void);\n    void get_colon(void);\n\n    unsigned width;\n    unsigned width_in_bytes;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_mif();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_mif(const input_file_mif &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_mif &operator=(const input_file_mif &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_MIF_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/mips_flash.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/mips_flash.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_mips_flash::~input_file_mips_flash()\n{\n}\n\n\nsrecord::input_file_mips_flash::input_file_mips_flash(\n    const std::string &a_file_name,\n    endian_t a_endian\n) :\n    input_file(a_file_name),\n    seen_some_input(false),\n    endian(a_endian),\n    address(0),\n    token(token_eof),\n    token_value(0),\n    seen_reset(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_mips_flash::create_be(const std::string &a_file_name)\n{\n    return pointer(new input_file_mips_flash(a_file_name, endian_big));\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_mips_flash::create_le(const std::string &a_file_name)\n{\n    return pointer(new input_file_mips_flash(a_file_name, endian_little));\n}\n\n\nvoid\nsrecord::input_file_mips_flash::tokenizer(void)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n        {\n            token = token_eof;\n            return;\n        }\n        switch (c)\n        {\n        case ' ':\n        case '\\t':\n        case '\\n':\n        case '\\r':\n            break;\n\n        case '!':\n            switch (get_char())\n            {\n            case 'C':\n                token = token_unlock;\n                return;\n\n            case 'E':\n                token = token_erase;\n                return;\n\n            case 'R':\n                token = token_reset;\n                return;\n\n            case 'S':\n                token = token_lock;\n                return;\n\n            default:\n                goto junk;\n            }\n\n        case '@':\n            token = token_at;\n            return;\n\n        case '>':\n            // throw away 8 characters\n            for (int j = 0; j < 8; ++j)\n                get_char();\n            break;\n\n        case '0': case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n            // get 8 digit hex number\n            get_char_undo(c);\n            token_value = 0;\n            for (int j = 0; j < 8; ++j)\n                token_value = (token_value << 4) | get_nibble();\n            token = token_number;\n            return;\n\n        default:\n            junk:\n            fatal_error(\"hexadecimal number expected\");\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_mips_flash::read_inner(record &result)\n{\n    if (!seen_reset)\n    {\n        tokenizer();\n        if (token != token_reset)\n            fatal_error(\"not a MIPS-Flash format file\");\n        seen_reset = true;\n        tokenizer();\n    }\n    for (;;)\n    {\n        switch (token)\n        {\n        case token_eof:\n            return false;\n\n        case token_at:\n            tokenizer();\n            if (token != token_number)\n                fatal_error(\"@ must be followed by a number\");\n            address = token_value;\n            tokenizer();\n            break;\n\n        case token_number:\n            if (endian == endian_big)\n            {\n                unsigned char data[4];\n                data[0] = token_value >> 24;\n                data[1] = token_value >> 16;\n                data[2] = token_value >> 8;\n                data[3] = token_value;\n                result = record(record::type_data, address, data, 4);\n            }\n            else\n            {\n                unsigned char data[4];\n                data[0] = token_value;\n                data[1] = token_value >> 8;\n                data[2] = token_value >> 16;\n                data[3] = token_value >> 24;\n                result = record(record::type_data, address, data, 4);\n            }\n            address += 4;\n            tokenizer();\n            return true;\n\n        case token_erase:\n        case token_lock:\n        case token_unlock:\n            // we ignore this\n            tokenizer();\n            break;\n\n        default:\n            fatal_error(\"syntax error\");\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_mips_flash::read(record &result)\n{\n    if (!read_inner(result))\n    {\n        if (!seen_some_input)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_mips_flash::get_file_format_name(void)\n    const\n{\n    return\n        (\n            endian == endian_big\n        ?\n            \"MIPS Flash (big-endian)\"\n        :\n            \"MIPS Flash (little-endian)\"\n        );\n}\n\n\nint\nsrecord::input_file_mips_flash::format_option_number(void)\n    const\n{\n    return\n        (\n            endian == endian_big\n        ?\n            arglex_tool::token_mips_flash_be\n        :\n            arglex_tool::token_mips_flash_le\n        );\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/mips_flash.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_MIPS_FLASH_H\n#define SRECORD_INPUT_FILE_MIPS_FLASH_H\n\n#include <srecord/endian.h>\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_mips_flash class is used to represent the\n  * parse state of a MIPS-Flash formatted input file.\n  */\nclass input_file_mips_flash:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_mips_flash();\n\n    /**\n      * The create_be class method is used to create new dynamically\n      * allocated instances of this class, big-endian byte order.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create_be(const std::string &file_name);\n\n    /**\n      * The create_le class method is used to create new dynamically\n      * allocated instances of this class, little-endian byte order.\n      * This is used by the --guess format.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create_le(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @param end\n      *     The byte order.\n      */\n    input_file_mips_flash(const std::string &file_name,\n        endian_t end = endian_big);\n\n    /**\n      * The read_inner method is used to read a record from the file.\n      * The read method is a wrapper around it.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * or not any data has been seen from this file to date.\n      */\n    bool seen_some_input;\n\n    /**\n      * The endian instance variable is used to remember whether the\n      * file is big-endian or little-endian.\n      */\n    endian_t endian;\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the input file, for when we build the next data record.\n      */\n    unsigned long address;\n\n    /**\n      * The tokenizer method is used to determine the next token in the\n      * input token stream.  It sets #token and #token_value before\n      * it returns.  If it finds an error it will issue a #fatal_error\n      * message and not return.\n      */\n    void tokenizer(void);\n\n    enum token_t\n    {\n        token_eof,\n        token_at,\n        token_erase,\n        token_lock,\n        token_number,\n        token_reset,\n        token_unlock,\n    };\n\n    /**\n      * The token instance variable is used to remember the kind of\n      * token was found by the preceeding #tokenizer call.\n      */\n    token_t token;\n\n    /**\n      * The token_value instance variable is used to remember the value\n      * of the number, if the preceeding #tokenizer call saw a number.\n      * Otherwise, its value is undefined.\n      */\n    unsigned long token_value;\n\n    /**\n      * The seen_reset instance variable is used to remember\n      * whether or not the initial '!R' token has already been seen.\n      */\n    bool seen_reset;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_mips_flash();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_mips_flash(const input_file_mips_flash &);\n\n    /**\n      * The assigmne toperator.  Do not use.\n      */\n    input_file_mips_flash &operator=(const input_file_mips_flash &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_MIPS_FLASH_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/mos_tech.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2005-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/mos_tech.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_mos_tech::~input_file_mos_tech()\n{\n}\n\n\nsrecord::input_file_mos_tech::input_file_mos_tech(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    garbage_warning(false),\n    seen_some_input(false),\n    data_record_count(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_mos_tech::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_mos_tech(a_file_name));\n}\n\n\nbool\nsrecord::input_file_mos_tech::read_inner(srecord::record &record)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n            return false;\n        if (c == 0x11)\n        {\n            // XOFF in the file also indicates end-of-file\n            while (get_char() >= 0)\n                ;\n            return false;\n        }\n        if (c == '\\0')\n            continue;\n        if (c == ';')\n            break;\n        if (c == '\\n')\n            continue;\n        if (!garbage_warning)\n        {\n            warning(\"ignoring garbage lines\");\n            garbage_warning = true;\n        }\n        for (;;)\n        {\n            c = get_char();\n            if (c < 0)\n                return false;\n            if (c == '\\n')\n                break;\n        }\n    }\n    checksum_reset();\n    int length = get_byte();\n    if (length == 0)\n    {\n        //\n        // This is a data count record,\n        // and also the end-of-file record.\n        //\n        if (peek_char() != '\\n' && peek_char() != '\\r')\n        {\n            //\n            // Only check the data count if it is present.\n            //\n            int nrecs = get_word_be();\n            int csumX = checksum_get16();\n            int csum = get_word_be();\n            // In the only file example I have, the count is repeated\n            // in the checksum, which would you make you think that the\n            // address field is added as a 16-bit value, except that\n            // only the data count line is wrong.  Sheesh.\n            if (use_checksums() && csumX != csum && csum != nrecs)\n                fatal_error(\"checksum mismatch (%04X != %04X)\", csumX, csum);\n            if (nrecs != data_record_count)\n            {\n                fatal_error\n                (\n                    \"data record count mismatch (%d != %d)\",\n                    nrecs,\n                    data_record_count\n                );\n            }\n        }\n        if (get_char() != '\\n')\n            fatal_error(\"end-of-line expected\");\n        while (get_char() >= 0)\n            ;\n        return false;\n    }\n\n    unsigned long address = get_word_be();\n    unsigned char buffer[256];\n    for (int j = 0; j < length; ++j)\n        buffer[j] = get_byte();\n    int csumX = checksum_get16();\n    int csum = get_word_be();\n    if (use_checksums() && csumX != csum)\n        fatal_error(\"checksum mismatch (%04X != %04X)\", csumX, csum);\n    if (get_char() != '\\n')\n        fatal_error(\"end-of-line expected\");\n\n    srecord::record::type_t type = srecord::record::type_data;\n    record = srecord::record(type, address, buffer, length);\n    ++data_record_count;\n    return true;\n}\n\n\nbool\nsrecord::input_file_mos_tech::read(srecord::record &record)\n{\n    if (!read_inner(record))\n    {\n        if (!seen_some_input && garbage_warning)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_mos_tech::get_file_format_name(void)\n    const\n{\n    return \"MOS Technology\";\n}\n\n\nint\nsrecord::input_file_mos_tech::format_option_number(void)\n    const\n{\n    return arglex_tool::token_mos_tech;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/mos_tech.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_MOS_TECH_H\n#define SRECORD_INPUT_FILE_MOS_TECH_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The mos_tech class is used to parse a MOS Technology format file.\n  */\nclass input_file_mos_tech:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_mos_tech();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * A constructor.  The input is read from the named file (or\n      * the standard input if the file anme is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_mos_tech(const std::string &file_name);\n\n    /**\n      * Read one line (record) of input.  Called by the #read method.\n      * Returns false at end of file.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The garbage_warning instance variable is used to remember\n      * whther or not a warning has been issued about non-format\n      * lines in the file.  Only one warning per file is issued.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to\n      * remember whether any input has been seen.\n      */\n    bool seen_some_input;\n\n    /**\n      * The data_record_count instance variable is used to remember the\n      * number of data records seen to date.\n      */\n    int data_record_count;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_mos_tech();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_mos_tech(const input_file_mos_tech &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_mos_tech &operator=(const input_file_mos_tech &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_MOS_TECH_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/motorola.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2005-2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/motorola.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_motorola::~input_file_motorola()\n{\n}\n\n\nsrecord::input_file_motorola::input_file_motorola(\n    const std::string &a_file_name\n) :\n    input_file(a_file_name),\n    data_count(0),\n    garbage_warning(false),\n    seen_some_input(false),\n    header_seen(false),\n    termination_seen(false),\n    address_shift(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_motorola::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_motorola(a_file_name));\n}\n\n\nvoid\nsrecord::input_file_motorola::command_line(arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        int n = cmdln->value_number();\n        cmdln->token_next();\n\n        //\n        // Shift Bytes Bits\n        //   0     1     8\n        //   1     2    16\n        //   2     4    32\n        //   3     8    64\n        //\n        switch (n)\n        {\n        case 1:\n        case 8:\n            address_shift = 0;\n            break;\n\n        case 2:\n        case 16:\n            address_shift = 1;\n            break;\n\n        case 4:\n        case 32:\n            address_shift = 2;\n            break;\n\n        case 64:\n            address_shift = 3;\n            break;\n\n        default:\n            fatal_error\n            (\n                \"-motorola address multiple %d not understood (do \"\n                    \"you need parentheses to group the expressions \"\n                    \"differently?)\",\n                n\n            );\n            // NOTREACHED\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_motorola::read_inner(record &result)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n            return false;\n        if (c == 'S')\n            break;\n        if (c == '\\n')\n            continue;\n        if (!garbage_warning)\n        {\n            warning(\"ignoring garbage lines\");\n            garbage_warning = true;\n        }\n        for (;;)\n        {\n            c = get_char();\n            if (c < 0)\n                return false;\n            if (c == '\\n')\n                break;\n        }\n    }\n    int tag = get_nibble();\n    checksum_reset();\n    int line_length = get_byte();\n    if (line_length < 1)\n        fatal_error(\"line length invalid\");\n    unsigned char buffer[256];\n    for (int j = 0; j < line_length; ++j)\n        buffer[j] = get_byte();\n    if (use_checksums())\n    {\n        int n = checksum_get();\n        if (n != 0xFF)\n            fatal_error(\"checksum mismatch (%02X != FF)\", n);\n    }\n    if (get_char() != '\\n')\n        fatal_error(\"end-of-line expected\");\n    --line_length;\n\n    int naddr = 2;\n    record::type_t type = record::type_unknown;\n    switch (tag)\n    {\n    case 0:\n        // header\n        type = record::type_header;\n        if (line_length < naddr)\n        {\n            // Some programs write Very short headers.\n            naddr = line_length;\n        }\n        break;\n\n    case 1:\n        // data\n        type = record::type_data;\n        break;\n\n    case 2:\n        // data\n        type = record::type_data;\n        naddr = 3;\n        break;\n\n    case 3:\n        // data\n        type = record::type_data;\n        naddr = 4;\n        break;\n\n    case 5:\n        // data count\n        type = record::type_data_count;\n        //\n        // This is documented as having 2 address bytes and\n        // no data bytes.  The Green Hills toolchain happily\n        // generates records with 4 address bytes.  We cope\n        // with this silently.\n        //\n        if (line_length >= 2 && line_length <= 4)\n            naddr = line_length;\n        break;\n\n    case 6:\n        // data count\n        type = record::type_data_count;\n        //\n        // Just in case some smarty-pants uses the Green Hills\n        // trick, we cope with address size crap the same as S5.\n        //\n        naddr = 3;\n        if (line_length == 4)\n            naddr = line_length;\n        break;\n\n    case 7:\n        // termination\n        type = record::type_execution_start_address;\n        naddr = 4;\n        break;\n\n    case 8:\n        // termination\n        type = record::type_execution_start_address;\n        naddr = 3;\n        break;\n\n    case 9:\n        // termination\n        type = record::type_execution_start_address;\n        break;\n    }\n    if (line_length < naddr)\n    {\n        fatal_error\n        (\n            \"data length too short (%d < %d) for data type (%x)\",\n            line_length,\n            naddr,\n            tag\n        );\n    }\n    long tmp_addr = record::decode_big_endian(buffer, naddr);\n    if (address_shift && type != record::type_data_count)\n        tmp_addr <<= address_shift;\n    result = record(type, tmp_addr, buffer + naddr, line_length - naddr);\n    return true;\n}\n\n\nbool\nsrecord::input_file_motorola::read(record &record)\n{\n    for (;;)\n    {\n        if (!read_inner(record))\n        {\n            if (!seen_some_input && garbage_warning)\n                fatal_error(\"file contains no data\");\n            if (!header_seen)\n            {\n                warning(\"no header record\");\n                header_seen = true;\n            }\n            if (data_count <= 0)\n                warning(\"file contains no data\");\n            if (!termination_seen)\n            {\n                warning(\"no execution start address record\");\n                termination_seen = true;\n            }\n            return false;\n        }\n        seen_some_input = true;\n        if (record.get_type() != record::type_header && !header_seen)\n        {\n            warning(\"no header record\");\n            header_seen = true;\n        }\n        if\n        (\n            record.get_type() != record::type_execution_start_address\n        &&\n            termination_seen\n        )\n        {\n            warning(\"termination record should be last\");\n            termination_seen = false;\n        }\n        switch (record.get_type())\n        {\n        case record::type_unknown:\n            fatal_error(\"record type not recognised\");\n            break;\n\n        case record::type_header:\n            if (header_seen)\n                warning(\"redundant header record\");\n            if (record.get_address())\n            {\n                warning(\"address in header record ignored\");\n                record.set_address(0);\n            }\n            header_seen = true;\n            break;\n\n        case record::type_data:\n            ++data_count;\n            if (record.get_length() == 0)\n            {\n                warning(\"empty data record ignored\");\n                continue;\n            }\n            break;\n\n        case record::type_data_count:\n            {\n                record::address_t addr = record.get_address();\n                record::address_t mask = 0xFFFF;\n                while (addr > mask)\n                    mask = ~(~mask << 8);\n                mask &= data_count;\n                if (addr != mask)\n                {\n                    fatal_error\n                    (\n                        \"data record count mismatch (file %ld, read %ld)\",\n                        (long)addr,\n                        (long)mask\n                    );\n                }\n            }\n            continue;\n\n        case record::type_execution_start_address:\n            if (record.get_length() > 0)\n            {\n                warning(\"data in termination record ignored\");\n                record.set_length(0);\n            }\n            if (termination_seen)\n                warning(\"redundant termination record\");\n            termination_seen = true;\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_motorola::get_file_format_name(void)\n    const\n{\n    return \"Motorola S-Record\";\n}\n\n\nint\nsrecord::input_file_motorola::format_option_number(void)\n    const\n{\n    return arglex_tool::token_motorola;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/motorola.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2005-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef LIB_INPUT_FILE_MOTOROLA_H\n#define LIB_INPUT_FILE_MOTOROLA_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_motorola class is used to represent the parse\n  * state of a Motorola S-Record formatted input file.\n  */\nclass input_file_motorola:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_motorola();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_motorola(const std::string &file_name);\n\n    /**\n      * The data_count instance variable is used to remember the number\n      * of data lines has occurred fo far in the input file.\n      */\n    unsigned long data_count;\n\n    /**\n      * The read_inner method is used to read a record of input.\n      * The read method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The garbage_warning instance variable is used to remember whether\n      * or not a warning about garbage input lines has been issued yet.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember where\n      * any data has been seen in this file yet.\n      */\n    bool seen_some_input;\n\n    /**\n      * The header_seen instance variable is used to remember whether\n      * or not the header record has been seen yet.\n      */\n    bool header_seen;\n\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether or not the termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * The address_shift method is used to remember how far to the left\n      * addresses need to be shifted to become byte addresses.\n      * The default is zero (0).\n      *\n      * This is because of some poorly though out \"extentions\" to the\n      * file format, for 16-bit and 32-bit data busses.  I say \"poory\n      * thought out\" because the no way (zero, zip, nada) of discovering\n      * this just by looking at the first data line in the file (and if\n      * the lines are jumbled just right, the first few lines are no\n      * more enlightening).\n      */\n    unsigned address_shift;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_motorola();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_motorola(const input_file_motorola &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_motorola &operator=(const input_file_motorola &);\n};\n\n};\n\n#endif // LIB_INPUT_FILE_MOTOROLA_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/msbin.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009-2011, 2013 Peter Miller\n//\n// Code contribution by David Kozub <zub@linux.fjfi.cvut.cz>\n// Copyright assigned to Peter Miller 27-Jan-2010.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <algorithm>\n#include <limits>\n#include <cstring>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/msbin.h>\n\n\nsrecord::input_file_msbin::~input_file_msbin()\n{\n    if (first_record_read)\n    {\n        // Check if data from file header were correct\n        if (lowest_address != image_start)\n        {\n            warning\n            (\n                \"image address header field is wrong (header = 0x%08lX, \"\n                    \"actual = 0x%08lX)\",\n                (unsigned long)image_start,\n                (unsigned long)lowest_address\n            );\n        }\n        if (highest_address - lowest_address + 1 != image_length)\n        {\n            warning\n            (\n                \"image length header field is wrong (header = 0x%08lX, \"\n                    \"actual = 0x%08lX)\",\n                (unsigned long)image_length,\n                (unsigned long)(highest_address - lowest_address + 1)\n            );\n        }\n    }\n}\n\n\nsrecord::input_file_msbin::input_file_msbin(const std::string &a_file_name) :\n    input_file(a_file_name),\n    header_read(false),\n    first_record_read(false),\n    execution_start_record_seen(false),\n    last_record_warning(false),\n    address(0),\n    remaining(0),\n    record_checksum(0),\n    running_checksum(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_msbin::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_msbin(a_file_name));\n}\n\n\nuint32_t\nsrecord::input_file_msbin::read_dword_le(void)\n{\n    unsigned char c[sizeof(uint32_t)];\n\n    for (size_t i = 0; i < sizeof(c); ++i)\n    {\n        int j = get_char();\n        if (j < 0)\n            fatal_error(\"short input file\");\n\n        assert(j <= std::numeric_limits<unsigned char>::max());\n        c[i] = (unsigned char)j;\n    }\n\n    return record::decode_little_endian(c, sizeof(c));\n}\n\n\nvoid\nsrecord::input_file_msbin::read_file_header(void)\n{\n    // Optional magic\n    static const unsigned char Magic[7] =\n        { 'B', '0', '0', '0', 'F', 'F', '\\n' };\n\n    // +1 so that buff can be reused for two dwords in case the magic is missing\n    unsigned char buff[sizeof(Magic) + 1];\n    for (size_t i = 0; i < sizeof(Magic); ++i)\n    {\n        int j = get_char();\n        if (j < 0)\n            fatal_error(\"short input file\");\n\n        assert(j <= std::numeric_limits<unsigned char>::max());\n        buff[i] = j;\n    }\n\n    BOOST_STATIC_ASSERT(sizeof(buff) >= sizeof(Magic));\n    if (memcmp(Magic, buff, sizeof(Magic)))\n    {\n        // Ok, there's no magic in the header. But it's optional anyway.\n\n        // Fill up to two dwords\n        BOOST_STATIC_ASSERT(sizeof(buff) == 2 * sizeof(uint32_t));\n        int j = get_char();\n        if (j < 0)\n            fatal_error(\"short input file\");\n        buff[sizeof(buff) - 1] = j;\n\n        // Read first dword\n        image_start = record::decode_little_endian(buff, sizeof(uint32_t));\n\n        // Read second dword\n        image_length =\n            record::decode_little_endian\n            (\n                buff + sizeof(uint32_t),\n                sizeof(uint32_t)\n            );\n    }\n    else\n    {\n        image_start = read_dword_le();\n        image_length = read_dword_le();\n    }\n\n    // What shall we do with the (useless) file header?\n    // Throw it away?\n    //warning(\"image_start = %08x\", (unsigned int)image_start);\n    //warning(\"image_length = %08x\", (unsigned int)image_length);\n}\n\n\nuint32_t\nsrecord::input_file_msbin::checksum(const unsigned char *data, size_t len)\n{\n    uint32_t sum = 0;\n\n    for (size_t i = 0; i < len; ++i)\n        sum += data[i];\n\n    return sum;\n}\n\n\nbool\nsrecord::input_file_msbin::read(record &result)\n{\n    // Read the file header if we haven't read it yet.\n    if (!header_read)\n    {\n        read_file_header();\n        header_read = true;\n    }\n\n    if (remaining == 0)\n    {\n        // No remaining data from any previous record. => Try to read\n        // next record header, if present.\n\n        if (peek_char() < 0)\n        {\n            // Check if we have seen the execution start address record.\n            if (!execution_start_record_seen)\n                warning(\"input file is missing the execution start record\");\n\n            return false; // end of file\n        }\n\n        if (execution_start_record_seen && !last_record_warning)\n        {\n            warning\n            (\n                \"the execution start record is not the last record; \"\n                \"reading further records\"\n            );\n            last_record_warning = true;\n        }\n\n        // Read header of the next record\n        address = read_dword_le();\n        remaining = read_dword_le();\n        record_checksum = read_dword_le();\n\n        // Reset running checksum\n        running_checksum = 0;\n\n        // Bookkeeping for tracking the address range - but ignore\n        // the execution start address record, as it has a special\n        // format!\n        if (address != 0)\n        {\n            if (!first_record_read)\n            {\n                lowest_address = address;\n                highest_address = address + remaining - 1;\n                first_record_read = true;\n            }\n            else\n            {\n                lowest_address = std::min(lowest_address, address);\n                highest_address =\n                    std::max(highest_address, address + remaining - 1);\n            }\n        }\n    }\n\n    if (address == 0)\n    {\n        // This is a special record specifying the execution start address.\n        if (record_checksum != 0 && use_checksums())\n        {\n            fatal_error\n            (\n                \"checksum of the execution start record is not 0, as \"\n                    \"required by specification (0x%08lX != 0x00000000)\",\n                (unsigned long)record_checksum\n            );\n        }\n\n        result = record(record::type_execution_start_address, remaining, 0, 0);\n\n        // This should be the last record - but if it was not, we try to read\n        // further and produce a warning.\n        remaining = 0;\n        execution_start_record_seen = true;\n        return true;\n    }\n\n    // Data record\n    // Read (part) of the record\n    unsigned char data[record::max_data_length];\n    const size_t to_read =\n        std::min(remaining, (uint32_t)record::max_data_length);\n\n    int c = get_char();\n    if (c < 0)\n    {\n        fatal_error(\"short input file\");\n        return false;\n    }\n\n    size_t read = 0;\n    while (read < to_read)\n    {\n        assert(c <= std::numeric_limits<unsigned char>::max());\n        data[read++] = c;\n        if (read >= to_read)\n            break;\n        c = get_char();\n        if (c < 0)\n        {\n            fatal_error(\"short input file\");\n            return false;\n        }\n    }\n\n    result = record(record::type_data, address, data, read);\n    address += read;\n    assert(remaining >= read);\n    remaining -= read;\n    running_checksum += checksum(data, read);\n\n    if (remaining == 0)\n    {\n        // All data in a record was read. => We can verify the checksum\n        // now.\n        if (running_checksum != record_checksum && use_checksums())\n        {\n            fatal_error\n            (\n                \"wrong record checksum (0x%08lX != 0x%08lX)\",\n                (unsigned long)running_checksum,\n                (unsigned long)record_checksum\n            );\n        }\n    }\n\n    return true;\n}\n\n\nbool\nsrecord::input_file_msbin::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_msbin::get_file_format_name(void)\n    const\n{\n    return \"Windows CE Binary Image Data Format\";\n}\n\n\nint\nsrecord::input_file_msbin::format_option_number(void)\n    const\n{\n    return arglex_tool::token_msbin;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/msbin.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009-2011, 2013 Peter Miller\n//\n// Code contribution by David Kozub <zub@linux.fjfi.cvut.cz>\n// Copyright assigned to Peter Miller 27-Jan-2010.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_MSBIN_H\n#define SRECORD_INPUT_FILE_MSBIN_H\n\n#include <stdint.h>\n#include <srecord/input/file.h>\n#include <srecord/record.h>\n#include <boost/static_assert.hpp>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_binary class is used to represent the parse\n  * state of msbin (Windows CE Binary Image Data Format) input stream.\n  *\n  * See http://msdn.microsoft.com/en-us/library/ms924510.aspx\n  * for a description of the format.\n  */\nclass input_file_msbin:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_msbin();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_msbin(const std::string &file_name);\n\n    /**\n      * The header_read instance variable is used to remember whether\n      * the file header was read already.\n      */\n    bool header_read;\n\n    /**\n      * The first_record_read instance variable is used to remember\n      * whether we read the header of at least a single record.\n      *\n      * While false, lowest_address and highest_address are not valid.\n      */\n    bool first_record_read;\n\n    /**\n      * The execution_start_record_seen instance variable is used to\n      * remember whether we already read the execution start address\n      * record, which is supposed to be the last record in a file.\n      */\n    bool execution_start_record_seen;\n\n    /**\n      * The last_record_warning instance variable is used to remember\n      * whether a warning about extra records after the execution start\n      * record was already issued.\n      */\n    bool last_record_warning;\n\n    /**\n      * The address instance variable is used to remember the current\n      * address.\n      */\n    record::address_t address;\n\n    /**\n      * The remaining instance variable is used to remember the number\n      * of bytes remaining in this record to be read.\n      */\n    uint32_t remaining;\n\n    /**\n      * The record_checksum instance variable is used to remember the\n      * checksum of the current record, as read from the record header.\n      */\n    uint32_t record_checksum;\n\n    /**\n      * The running_checksum instance variable is used to remember the\n      * checksum of the data read from this record so far.\n      */\n    uint32_t running_checksum;\n\n    /**\n      * The image_start instance variable is used to remember the image\n      * start, the lowest data address in the file, as read from the\n      * file header.\n      */\n    record::address_t image_start;\n\n    /**\n      * The image_length instance variable is used to remember the image\n      * length, as read from the file header.\n      */\n    record::address_t image_length;\n\n    /**\n      * The lowest_address instance variable is used to remember the\n      * lowest address encountered in records read so far.\n      */\n    record::address_t lowest_address;\n\n    /**\n      * The highest_address instance variable is used to remember the\n      * highest address encountered in records read so far.\n      */\n    record::address_t highest_address;\n\n    /**\n      * The read_file_header method is used to read the (optional) magic\n      * and the file header.\n      */\n    void read_file_header(void);\n\n    // Just to be sure we can fit uint32_t in address_t.\n    BOOST_STATIC_ASSERT(sizeof(record::address_t) >= sizeof(uint32_t));\n\n    /**\n      * The read_dword_le method is used to read a little endian double\n      * word from the input.\n      */\n    uint32_t read_dword_le(void);\n\n    /**\n      * The checksum method is used to calculate the checksum of a given\n      * data block.\n      *\n      * The checksum is additive, so:\n      *  checkum([Block1,Block2]) = checksum(Block1) + checksum(Block2)\n      *\n      * @param data\n      *     The data to be check-summed.\n      * @param len\n      *     The length in bytes of the data to be check-summed.\n      */\n    static uint32_t checksum(const unsigned char *data, size_t len);\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_msbin();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_msbin(const input_file_msbin &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_msbin &operator=(const input_file_msbin &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_MSBIN_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/needham.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/needham.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_needham::~input_file_needham()\n{\n}\n\n\nsrecord::input_file_needham::input_file_needham(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    seen_some_input(false),\n    address(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_needham::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_needham(a_file_name));\n}\n\n\nbool\nsrecord::input_file_needham::read(srecord::record &record)\n{\n    for (;;)\n    {\n        int c = peek_char();\n        if (c < 0)\n        {\n            if (!seen_some_input)\n                fatal_error(\"file contains no data\");\n            return false;\n        }\n        if (isxdigit(c))\n        {\n            unsigned char c = get_byte();\n            record =\n                srecord::record\n                (\n                    srecord::record::type_data,\n                    address,\n                    &c,\n                    1\n                );\n            seen_some_input = true;\n            ++address;\n            return true;\n        }\n        c = get_char();\n        switch (c)\n        {\n        case ' ':\n        case '\\t':\n        case '\\r':\n        case '\\n':\n        case '\\f':\n            break;\n\n        case '\\32':\n            // ignore ^Z characters\n            break;\n\n        default:\n            fatal_error(\"illegal character\");\n\n        case '$':\n            if (get_char() != 'A')\n                fatal_error(\"unknown command\");\n            address = 0;\n            int n = 0;\n            for (n = 0; n < 4 && peek_char() != ','; ++n)\n            {\n                int b = get_byte();\n                address = (address << 8) + b;\n            }\n            if (n < 2)\n                fatal_error(\"short address\");\n            if (get_char() != ',')\n                fatal_error(\"comma expected\");\n            break;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_needham::get_file_format_name(void)\n    const\n{\n    return \"Needham\";\n}\n\n\nint\nsrecord::input_file_needham::format_option_number(void)\n    const\n{\n    return arglex_tool::token_needham_hex;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/needham.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_NEEDHAM_H\n#define SRECORD_INPUT_FILE_NEEDHAM_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_needham class is used to represent the parse\n  * state of a file in Needham Hex format.\n  */\nclass input_file_needham:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_needham();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_needham(const std::string &file_name);\n\n    bool read_inner(record &);\n    bool garbage_warning;\n    bool seen_some_input;\n    unsigned long address;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_needham();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_needham(const input_file_needham &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_needham &operator=(const input_file_needham &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_NEEDHAM_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/os65v.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2002, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/os65v.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_os65v::~input_file_os65v()\n{\n}\n\n\nsrecord::input_file_os65v::input_file_os65v(const std::string &a_file_name) :\n    srecord::input_file(a_file_name),\n    seen_some_input(false),\n    address(0),\n    state(0),\n    ignore_the_rest(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_os65v::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_os65v(a_file_name));\n}\n\n\nbool\nsrecord::input_file_os65v::read_inner(srecord::record &record)\n{\n    for (;;)\n    {\n        if (ignore_the_rest)\n            return false;\n        int c = get_char();\n        switch (c)\n        {\n        case -1:\n            //\n            // End of file.\n            //\n            return false;\n\n        case '0': case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n            {\n                //\n                // We're looking at a number.\n                // It could be an address or a data byte.\n                //\n                get_char_undo(c);\n                unsigned long n = 0;\n                for (;;)\n                {\n                    n = (n << 4) | get_nibble();\n                    switch (peek_char())\n                    {\n                    case '0': case '1': case '2': case '3': case '4':\n                    case '5': case '6': case '7': case '8': case '9':\n                    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n                    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n                        continue;\n                    }\n                    break;\n                }\n                if (state == '.')\n                {\n                    address = n;\n                    continue;\n                }\n                if (state == '/')\n                {\n                    //\n                    // As a special case, writing 0 to address 0x00FD\n                    // also ends input (probably poking the \"do I read\n                    // audio input\" flag).\n                    //\n                    if (address == 0x00FD && n == 0)\n                    {\n                        ignore_the_rest = true;\n                        return false;\n                    }\n                    unsigned char buf[1];\n                    buf[0] = n;\n                    record =\n                        srecord::record\n                        (\n                            srecord::record::type_data,\n                            address,\n                            buf,\n                            1\n                        );\n                    return true;\n                }\n                fatal_error(\"mode not set\");\n                return false;\n            }\n\n        case 'G':\n            record =\n                srecord::record\n                (\n                    srecord::record::type_execution_start_address,\n                    address,\n                    0,\n                    0\n                );\n            ignore_the_rest = true;\n            return true;\n\n        case '\\r':\n            if (state == '/')\n                ++address;\n            if (peek_char() == '\\n')\n                get_char();\n            continue;\n\n        case '\\n':\n            if (state == '/')\n                ++address;\n            continue;\n\n        case '.':\n        case '/':\n            state = c;\n            continue;\n\n        default:\n            fatal_error(\"unknown command\");\n            return false;\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_os65v::read(srecord::record &record)\n{\n    if (!read_inner(record))\n    {\n        if (!seen_some_input)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_os65v::get_file_format_name(void)\n    const\n{\n    return \"Ohio Scientific\";\n}\n\n\nint\nsrecord::input_file_os65v::format_option_number(void)\n    const\n{\n    return arglex_tool::token_ohio_scientific;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/os65v.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2002, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_OS65V_H\n#define SRECORD_INPUT_FILE_OS65V_H\n\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_os65v class is used to represent the input state\n  * of an Ohio Scientific hexadecimal formatted file.\n  */\nclass input_file_os65v:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_os65v();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_os65v(const std::string &file_name);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_os65v();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_os65v(const input_file_os65v &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_os65v &operator=(const input_file_os65v &);\n\n    /**\n      * The read_inner method is used by the read method to get\n      * another portion of input.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * or not some valid inpout has been seen.\n      */\n    bool seen_some_input;\n\n    /**\n      * The address instance variable is used to remember the current\n      * address.  It is advanced for every byte read.\n      */\n    unsigned long address;\n\n    /**\n      * The state instance variable is used to member the current input\n      * state (unknown, address, data).\n      */\n    char state;\n\n    /**\n      * The ignore_the_rest instance variable is used to remember when\n      * it is time to ignore the rest of the file.  This happens after a\n      * \"return to monitor\" sequence, or after a \"GO\" command.\n      */\n    bool ignore_the_rest;\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_OS65V_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ppb.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cassert>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/ppb.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_ppb::~input_file_ppb()\n{\n}\n\n\nsrecord::input_file_ppb::input_file_ppb(const std::string &filename) :\n    input_file(filename),\n    address(0),\n    data_seen(false),\n    packet_address(-1uL),\n    packet_length(0),\n    packet_used(0)\n{\n}\n\n\nsrecord::input_file_ppb::pointer\nsrecord::input_file_ppb::create(const std::string &filename)\n{\n    return pointer(new input_file_ppb(filename));\n}\n\n\nbool\nsrecord::input_file_ppb::get_packet(void)\n{\n    int c = get_char();\n    if (c < 0)\n        return false;\n    if (c != 0x01)\n        packet_format_error();\n    unsigned char hdr[8];\n    for (int n = 0; n < 8; ++n)\n    {\n        c = get_char();\n        if (c < 0)\n            packet_format_error();\n        hdr[n] = c;\n    }\n    packet_length = record::decode_big_endian(hdr, 4);\n    if (packet_length > sizeof(packet))\n    {\n        fatal_error\n        (\n            \"payload size too large (%ld > %ld)\",\n            packet_length,\n            sizeof(packet)\n        );\n    }\n    packet_address = record::decode_big_endian(hdr + 4, 4);\n    unsigned char csum = 0;\n    for (size_t j = 0; j < packet_length; ++j)\n    {\n        if (j > 0 && (j % 1024) == 0)\n        {\n            c = get_char();\n            if (c < 0)\n                packet_format_error();\n            if (c != (unsigned char)-csum && use_checksums())\n            {\n                fatal_error\n                (\n                    \"intermediate checksum mismatch (expected %d, read %d)\",\n                    (unsigned char)-csum,\n                    c\n                );\n            }\n        }\n        c = get_char();\n        if (c < 0)\n            packet_format_error();\n        packet[j] = c;\n        csum += c;\n    }\n    c = get_char();\n    if (c < 0)\n        packet_format_error();\n    if (c != (unsigned char)-csum && use_checksums())\n    {\n        fatal_error\n        (\n            \"packet checksum mismatch (expected %d, read %d)\",\n            (unsigned char)-csum,\n            c\n        );\n    }\n    packet_used = 0;\n    return true;\n}\n\n\nbool\nsrecord::input_file_ppb::read(record &result)\n{\n    if (packet_used >= packet_length)\n    {\n        if (!get_packet())\n            return false;\n        if (packet_length == 0)\n            return false;\n    }\n    size_t size = packet_length - packet_used;\n    if (size > record::max_data_length)\n        size = record::max_data_length;\n    result =\n        record\n        (\n            record::type_data,\n            packet_address + packet_used,\n            packet + packet_used,\n            size\n        );\n    packet_used += size;\n    return true;\n}\n\n\nvoid\nsrecord::input_file_ppb::packet_format_error(void)\n{\n    fatal_error(\"packet not formatted correctly\");\n}\n\n\nbool\nsrecord::input_file_ppb::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_ppb::get_file_format_name(void)\n    const\n{\n    return \"Stag Prom Programmer binary (PPB)\";\n}\n\n\nint\nsrecord::input_file_ppb::format_option_number(void)\n    const\n{\n    return arglex_tool::token_ppb;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ppb.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_PPB_H\n#define SRECORD_INPUT_FILE_PPB_H\n\n#include <srecord/input/file.h>\n#include <srecord/record.h>\n\nnamespace srecord {\n\n/**\n  * The input_file_hexdump class is used to represent the processing\n  * required to read in a Stag Prom Programmer binary file.\n  */\nclass input_file_ppb:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_ppb();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param filename\n      *     The name of the file to be read.\n      */\n    static pointer create(const std::string &filename);\n\nprotected:\n    // See base class for documentation.\n    bool read(class record &rec);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param filename\n      *     The name of the file to be read.\n      */\n    input_file_ppb(const std::string &filename);\n\n    /**\n      * The address instance variable is used to remember the current\n      * address of the next data record.  This is set and advanced by\n      * the #read method.\n      */\n    record::address_t address;\n\n    /**\n      * The data_seen instance variable is used to remember whether or\n      * not any data has been seen in the file.  This is used to issue\n      * an error when there is aparrently no data in the file, and this\n      * helps #guess to figure out the file is notof this type.\n      */\n    bool data_seen;\n\n    /**\n      * The packet_address instance variable is used to remember the\n      * address of the first byte in the most recetly read packet.\n      */\n    unsigned long packet_address;\n\n    /**\n      * The packet instance variable is used to remember the most recent\n      * #packet_length data bytes read from the file in the most recent packet.\n      */\n    record::data_t packet[8192];\n\n    /**\n      * The packet_length instance variable is used to remember the\n      * number of data bytes in the #packet array.\n      */\n    size_t packet_length;\n\n    /**\n      * The packet_used instance variable is used to remember how many\n      * bytes of the most recently read packect have been consumed.\n      */\n    size_t packet_used;\n\n    /**\n      * The get_packet method is used to read another packet, setting\n      * the #packet and #packet_length and #packet_address and\n      * #packet_used instance variables.\n      */\n    bool get_packet(void);\n\n    /**\n      * The packet_format_error method is used to issue a #fatal_error\n      * message when a packet is malformed.\n      */\n    void packet_format_error(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_ppb();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_ppb(const input_file_ppb &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_ppb &operator=(const input_file_ppb &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_PPB_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ppx.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cassert>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/ppx.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_ppx::~input_file_ppx()\n{\n}\n\n\nsrecord::input_file_ppx::input_file_ppx(const std::string &filename) :\n    input_file(filename),\n    state(0),\n    token(token_eof),\n    token_value(0),\n    address(0),\n    data_seen(false),\n    dsum(0),\n    buffer_length(0)\n{\n}\n\n\nsrecord::input_file_ppx::pointer\nsrecord::input_file_ppx::create(const std::string &filename)\n{\n    return pointer(new input_file_ppx(filename));\n}\n\n\nvoid\nsrecord::input_file_ppx::get_next_token(void)\n{\n    for (;;)\n    {\n        int sc = get_char();\n        if (sc < 0)\n        {\n            token = token_eof;\n            return;\n        }\n        unsigned char c = sc;\n        switch (c)\n        {\n        case '*':\n            token = token_star;\n            return;\n\n        case '$':\n            token = token_end;\n            return;\n\n        case 'S':\n            token = token_sum;\n            return;\n\n        case ' ':\n        case '\\t':\n        case '\\f':\n        case '\\r':\n        case '\\v':\n        case '\\n':\n            break;\n\n        case '0': case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n            {\n                token_value = get_nibble_value(c);\n                int ndigits = 1;\n                for (;;)\n                {\n                    int sc = get_char();\n                    if (sc < 0)\n                        break;\n                    c = sc;\n                    switch (c)\n                    {\n                    case '0': case '1': case '2': case '3': case '4':\n                    case '5': case '6': case '7': case '8': case '9':\n                    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n                    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n                        token_value = (token_value << 4) | get_nibble_value(c);\n                        ++ndigits;\n                        continue;\n\n                    default:\n                        get_char_undo(c);\n                        break;\n                    }\n                    break;\n                }\n                if (ndigits > 2)\n                {\n                    token = token_address;\n                    return;\n                }\n                token = token_byte;\n                return;\n            }\n\n        default:\n            syntax_error();\n            break;\n        }\n    }\n}\n\n\nvoid\nsrecord::input_file_ppx::syntax_error(void)\n{\n    fatal_error(\"syntax error\");\n}\n\n\nbool\nsrecord::input_file_ppx::read(record &result)\n{\n    //\n    // file\n    //     : STAR lines end\n    //     ;\n    // lines\n    //     : line\n    //     | lines line\n    //     ;\n    // line\n    //     : ADDRESS bytes\n    //     ;\n    // bytes\n    //     : BYTE\n    //     | bytes BYTE\n    //     ;\n    // end\n    //     : END\n    //     | END SUM ADDRESS\n    //     ;\n    //\n    for (;;)\n    {\n        switch (state)\n        {\n        case 0:\n            get_next_token();\n            // file: . ASTERISK lines end;\n            switch (token)\n            {\n            case token_star:\n                get_next_token();\n                state = 1;\n                break;\n\n            default:\n                syntax_error();\n            }\n            break;\n\n        case 1:\n            // file: ASTERISK . lines end;\n            // file: ASTERISK lines . end;\n            // lines: . line\n            // lines: lines . line\n            // lines: lines line .\n            // line: . ADDRESS bytes\n            // end: . END\n            // end: . END SUM ADDRESS\n            switch (token)\n            {\n            case token_address:\n                if (address != token_value)\n                    assert(buffer_length == 0);\n                address = token_value;\n                get_next_token();\n                state = 3;\n                break;\n\n            case token_end:\n                get_next_token();\n                state = 2;\n                break;\n\n            default:\n                syntax_error();\n            }\n            break;\n\n        case 2:\n            // end: END .\n            // end: END . SUM ADDRESS\n            switch (token)\n            {\n            case token_eof:\n                state = 5;\n                break;\n\n            case token_sum:\n                get_next_token();\n                state = 4;\n                break;\n\n            default:\n                syntax_error();\n            }\n            break;\n\n        case 3:\n            // line: ADDRESS . bytes\n            // line: ADDRESS bytes .\n            // bytes: . BYTE\n            // bytes: bytes . BYTE\n            // bytes: bytes BYTE .\n            switch (token)\n            {\n            case token_address:\n            case token_end:\n                state = 1;\n\n                if (buffer_length)\n                {\n                    return_data_record:\n                    result =\n                        record\n                        (\n                            record::type_data,\n                            address - buffer_length,\n                            buffer,\n                            buffer_length\n                        );\n                    buffer_length = 0;\n                    return true;\n                }\n                break;\n\n            case token_byte:\n                dsum += token_value;\n                buffer[buffer_length++] = token_value;\n                ++address;\n                get_next_token();\n                data_seen = true;\n\n                if (buffer_length >= sizeof(buffer))\n                    goto return_data_record;\n                break;\n\n            default:\n                syntax_error();\n            }\n            break;\n\n        case 4:\n            // end: END SUM . ADDRESS\n            switch (token)\n            {\n            case token_address:\n                if (use_checksums() && dsum != token_value)\n                {\n                    fatal_error\n                    (\n                        \"checksum mismatch (calculated 0x%04X, given 0x%04X)\",\n                        dsum,\n                        token_value\n                    );\n                }\n                get_next_token();\n                state = 5;\n                break;\n\n            default:\n                syntax_error();\n            }\n            break;\n\n        case 5:\n            // file: ASTERISK lines end .\n            switch (token)\n            {\n            case token_eof:\n                if (!data_seen)\n                    fatal_error(\"no data seen\");\n                return false;\n\n            default:\n                syntax_error();\n            }\n            break;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_ppx::get_file_format_name(void)\n    const\n{\n    return \"Stag Prom Programmer hexadecimal (PPX)\";\n}\n\n\nint\nsrecord::input_file_ppx::format_option_number(void)\n    const\n{\n    return arglex_tool::token_ppx;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ppx.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_PPX_H\n#define SRECORD_INPUT_FILE_PPX_H\n\n#include <srecord/input/file.h>\n#include <srecord/record.h>\n\nnamespace srecord {\n\n/**\n  * The input_file_hexdump class is used to represent the processing\n  * required to read in a Stag Prog Programmer hexadecimal file.\n  */\nclass input_file_ppx:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_ppx();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param filename\n      *     The name of the file to be read.\n      */\n    static pointer create(const std::string &filename);\n\nprotected:\n    // See base class for documentation.\n    bool read(class record &rec);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param filename\n      *     The name of the file to be read.\n      */\n    input_file_ppx(const std::string &filename);\n\n    /**\n      * The state instance variable is used to remember the current\n      * processing state as the file is progressively parsed.  The parse\n      * is, of course, interrupted to return data records when they are seen.\n      */\n    int state;\n\n    enum token_t\n    {\n        token_eof,\n        token_star,\n        token_address,\n        token_byte,\n        token_end,\n        token_sum,\n    };\n\n    /**\n      * The token instance variable is used to remember the kind of the\n      * most recent token seen.  Set by the #get_next_token method.\n      */\n    token_t token;\n\n    /**\n      * The token_value instance variable is used to remember the value\n      * of the most recent token_byte or token_address seen.\n      * Set by the #get_next_token method.\n      */\n    unsigned token_value;\n\n    /**\n      * The get_next_token method is used to read the next lexical token\n      * from the input.\n      * It will set #token with the kind of token seen.\n      * It will set the #token_value instance variable for token_byte\n      * and token_address\n      */\n    void get_next_token(void);\n\n    /**\n      * The address instance variable is used to remember the current\n      * address of the next data record.  This is set and advanced by\n      * the #read method.\n      */\n    record::address_t address;\n\n    /**\n      * The data_seen instance variable is used to remember whether or\n      * not any data has been seen in the file.  This is used to issue\n      * an error when there is aparrently no data in the file, and this\n      * helps #guess to figure out the file is notof this type.\n      */\n    bool data_seen;\n\n    /**\n      * The syntax_error method is a convenience wrapper around\n      * #fatal_error to complain about syntax errors.\n      */\n    void syntax_error(void);\n\n    /**\n      * The dsum instance variable is used to remember the simple sum of\n      * the data bytes, and the data bytes alone.\n      */\n    unsigned short dsum;\n\n    /**\n      * The buffer instance variable is used to remember the most recent\n      * #buffer_length data bytes read from the file.\n      */\n    record::data_t buffer[record::max_data_length];\n\n    /**\n      * The buffer_length instance variable is used to remember the\n      * number of data bytes in the #buffer array.\n      */\n    size_t buffer_length;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_ppx();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_ppx(const input_file_ppx &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_ppx &operator=(const input_file_ppx &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_PPX_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/signetics.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2005-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/signetics.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_signetics::~input_file_signetics()\n{\n}\n\n\nsrecord::input_file_signetics::input_file_signetics(\n    const std::string &a_filename\n) :\n    srecord::input_file(a_filename),\n    garbage_warning(false),\n    seen_some_input(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_signetics::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_signetics(a_file_name));\n}\n\n\nvoid\nsrecord::input_file_signetics::checksum_add(unsigned char n)\n{\n    checksum ^= n;\n    checksum = (checksum << 1) | ((checksum >> 7) & 1);\n}\n\n\nbool\nsrecord::input_file_signetics::read_inner(srecord::record &record)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n            return false;\n        if (c == ':')\n            break;\n        if (c == '\\n')\n            continue;\n        if (!garbage_warning)\n        {\n            warning(\"ignoring garbage lines\");\n            garbage_warning = true;\n        }\n        for (;;)\n        {\n            c = get_char();\n            if (c < 0)\n                return false;\n            if (c == '\\n')\n                break;\n        }\n    }\n    checksum_reset();\n    long address = get_word_be();\n    int length = get_byte();\n    if (length == 0)\n    {\n        // this is the end indicator\n        if (get_char() != '\\n')\n            fatal_error(\"end-of-line expected\");\n        return false;\n    }\n\n    int running_checksum = checksum_get();\n    int csum = get_byte();\n    if (use_checksums() && running_checksum != csum)\n    {\n        fatal_error\n        (\n            \"address checksum mismatch (%02X != %02X)\",\n            running_checksum,\n            csum\n        );\n    }\n\n    checksum_reset();\n    unsigned char buffer[256];\n    for (int j = 0; j < length; ++j)\n        buffer[j] = get_byte();\n\n    running_checksum = checksum_get();\n    csum = get_byte();\n    if (use_checksums() && running_checksum != csum)\n    {\n        fatal_error\n        (\n            \"data checksum mismatch (%02X != %02X\",\n            running_checksum,\n            csum\n        );\n    }\n\n    if (get_char() != '\\n')\n        fatal_error(\"end-of-line expected\");\n\n    srecord::record::type_t type = srecord::record::type_data;\n    record = srecord::record(type, address, buffer, length);\n    return true;\n}\n\n\nbool\nsrecord::input_file_signetics::read(srecord::record &record)\n{\n    if (!read_inner(record))\n    {\n        if (!seen_some_input && garbage_warning)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_signetics::get_file_format_name(void)\n    const\n{\n    return \"Signetics\";\n}\n\n\nint\nsrecord::input_file_signetics::format_option_number(void)\n    const\n{\n    return arglex_tool::token_signetics;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/signetics.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_SIGNETICS_H\n#define SRECORD_INPUT_FILE_SIGNETICS_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_signetics class is used to represent reading a\n  * Signetics format file.\n  */\nclass input_file_signetics:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_signetics();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\n    /**\n      * See base class for documentation.  We over-ride this method\n      * because signetics uses its own XOR-ROL checksum algorithm.\n      */\n    void checksum_add(unsigned char);\n\nprivate:\n    /**\n      * The constructor.  The input will be read from the named file\n      * (or the standatd input if the filename is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_signetics(const std::string &file_name);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_signetics();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_signetics(const input_file_signetics &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_signetics &operator=(const input_file_signetics &);\n\n    /**\n      * The read_inner method is used to read one line/record from\n      * the input.  Used by the `read' method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The garbage_warning instance variable is used to remember\n      * whther or not a warning has been issued about non-format\n      * lines in the file.  Only one warning per file is issued.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to\n      * remember whether any input has been seen.\n      */\n    bool seen_some_input;\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_SIGNETICS_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/spasm.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2006-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/spasm.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_spasm::~input_file_spasm()\n{\n}\n\n\nsrecord::input_file_spasm::input_file_spasm(\n    const std::string &a_file_name,\n    endian_t a_end\n) :\n    input_file(a_file_name),\n    seen_some_input(false),\n    end(a_end)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_spasm::create_be(const std::string &a_file_name)\n{\n    return create(a_file_name, endian_big);\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_spasm::create(const std::string &a_file_name,\n    endian_t a_end)\n{\n    return pointer(new input_file_spasm(a_file_name, a_end));\n}\n\n\nbool\nsrecord::input_file_spasm::read_inner(record &result)\n{\n    if (peek_char() < 0)\n        return false;\n\n    int address = get_word_be();\n    if (get_char() != ' ')\n        fatal_error(\"space expected\");\n    unsigned char data[2];\n    if (end == endian_big)\n    {\n        data[1] = get_byte();\n        data[0] = get_byte();\n    }\n    else\n    {\n        data[0] = get_byte();\n        data[1] = get_byte();\n    }\n    if (get_char() != '\\n')\n        fatal_error(\"end of line expected\");\n\n    result =\n        record\n        (\n            record::type_data,\n            address * 2,                        // is this right??\n            data,\n            2\n        );\n    return true;\n}\n\n\nbool\nsrecord::input_file_spasm::read(record &result)\n{\n    if (!read_inner(result))\n    {\n        if (!seen_some_input)\n            fatal_error(\"file contains no data\");\n        return false;\n    }\n    seen_some_input = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_spasm::get_file_format_name(void)\n    const\n{\n    return\n        (\n            end == endian_big\n        ?\n            \"SPASM (big-endian)\"\n        :\n            \"SPASM (little-endian)\"\n        );\n}\n\n\nint\nsrecord::input_file_spasm::format_option_number(void)\n    const\n{\n    return\n        (\n            end == endian_big\n        ?\n            arglex_tool::token_spasm_be\n        :\n            arglex_tool::token_spasm_le\n        );\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/spasm.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001-2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_SPASM_H\n#define SRECORD_INPUT_FILE_SPASM_H\n\n#include <srecord/endian.h>\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_spasm class is used to represent the parse state\n  * of a SPASM formatted input file.\n  */\nclass input_file_spasm:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_spasm();\n\n    /**\n      * The create_be class method is used to create new dynamically\n      * allocated instances of this class.  This is used by the --guess\n      * format.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create_be(const std::string &file_name);\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @param end\n      *     The byte order of the file\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name, endian_t end);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @param end\n      *     The byte order.\n      */\n    input_file_spasm(const std::string &file_name, endian_t end = endian_big);\n\n    /**\n      * The read_inner method is used to read a record from the file.\n      * The read method is a wrapper around it.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * or not any data has been seen from this file to date.\n      */\n    bool seen_some_input;\n\n    /**\n      * The end instance variable is used to remember whether the\n      * file is big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_spasm();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_spasm(const input_file_spasm &);\n\n    /**\n      * The assigmne toperator.  Do not use.\n      */\n    input_file_spasm &operator=(const input_file_spasm &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_SPASM_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/spectrum.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/spectrum.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_spectrum::~input_file_spectrum()\n{\n}\n\n\nsrecord::input_file_spectrum::input_file_spectrum(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    header_seen(false),\n    trailer_seen(false),\n    file_contains_data(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_spectrum::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_spectrum(a_file_name));\n}\n\n\nint\nsrecord::input_file_spectrum::get_decimal()\n{\n    int c;\n    for (;;)\n    {\n        c = get_char();\n        if (c < 0)\n        {\n            format_error:\n            fatal_error(\"decimal number expected\");\n        }\n        if (isspace((unsigned char)c))\n            continue;\n        if (!isdigit((unsigned char)c))\n            goto format_error;\n        break;\n    }\n    int result = c - '0';\n    for (;;)\n    {\n        c = get_char();\n        if (c < 0)\n            break;\n        if (!isdigit((unsigned char)c))\n        {\n            get_char_undo(c);\n            break;\n        }\n        result = (result * 10) + (c - '0');\n    }\n    return result;\n}\n\n\nstatic inline bool\nis_binary_digit(int c)\n{\n    return ((c == '0' || c == '1'));\n}\n\n\nint\nsrecord::input_file_spectrum::get_binary()\n{\n    int c;\n    for (;;)\n    {\n        c = get_char();\n        if (c < 0)\n        {\n            format_error:\n            fatal_error(\"binary number expected\");\n        }\n        if (isspace((unsigned char)c))\n            continue;\n        if (!is_binary_digit((unsigned char)c))\n            goto format_error;\n        break;\n    }\n    int result = c - '0';\n    for (;;)\n    {\n        c = get_char();\n        if (!is_binary_digit(c))\n        {\n            get_char_undo(c);\n            break;\n        }\n        result = (result << 1) + (c - '0');\n    }\n    return result;\n}\n\n\nbool\nsrecord::input_file_spectrum::read(srecord::record &record)\n{\n    //\n    // Check for the file header\n    //\n    if (!header_seen)\n    {\n        bool garbage_warning = false;\n        for (;;)\n        {\n            int c = get_char();\n            if (c < 0)\n                fatal_error(\"no start character\");\n            if (c == 2)\n            {\n                header_seen = true;\n                break;\n            }\n            if (!garbage_warning)\n            {\n                warning(\"ignoring garbage lines\");\n                garbage_warning = true;\n            }\n        }\n    }\n\n    //\n    // Check for the file trailer.\n    //\n    if (trailer_seen)\n        return false;\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0 || c == 3)\n        {\n            if (!file_contains_data)\n                fatal_error(\"file contains no data\");\n            trailer_seen = true;\n            return false;\n        }\n        if (isspace((unsigned char)c))\n            continue;\n        get_char_undo(c);\n        break;\n    }\n\n    unsigned long address = get_decimal();\n    unsigned char data = get_binary();\n    record = srecord::record(srecord::record::type_data, address, &data, 1);\n    file_contains_data = true;\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_spectrum::get_file_format_name ()\n    const\n{\n    return \"Spectrum\";\n}\n\n\nint\nsrecord::input_file_spectrum::format_option_number(void)\n    const\n{\n    return arglex_tool::token_spectrum;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/spectrum.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_SPECTRUM_H\n#define SRECORD_INPUT_FILE_SPECTRUM_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_spectrum class is used to represent the parse\n  * state when reading from a file in Spectrum format.\n  */\nclass input_file_spectrum:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_spectrum();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_spectrum(const std::string &file_name);\n\n    /**\n      * The header_seen instance variable is used to remember whether\n      * the file header (the start character STX=0x02) has been seen yet.\n      */\n    bool header_seen;\n\n    /**\n      * The trailer_seen instance variable is used to remember whether\n      * the file trailer (the end character ETX=0x03) has been seen yet.\n      */\n    bool trailer_seen;\n\n    /**\n      * The file_contains_data instance variable is used to remember\n      * whether any file data has been seen yet.\n      */\n    bool file_contains_data;\n\n    /**\n      * The get_decimal method is used to get a decimal number from\n      * the input.  It must have at least one digit.\n      */\n    int get_decimal(void);\n\n    /**\n      * The get_binary method is used to get a binary number from\n      * the input.  It must have at least one digit.\n      */\n    int get_binary(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_spectrum();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_spectrum(const input_file_spectrum &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_spectrum &operator=(const input_file_spectrum &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_SPECTRUM_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/stewie.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/stewie.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_stewie::~input_file_stewie()\n{\n}\n\n\nsrecord::input_file_stewie::input_file_stewie(const std::string &a_file_name) :\n    input_file(a_file_name),\n    data_count(0),\n    garbage_warning(false),\n    seen_some_input(false),\n    header_seen(false),\n    termination_seen(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_stewie::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_stewie(a_file_name));\n}\n\n\nint\nsrecord::input_file_stewie::get_byte()\n{\n    int n = get_char();\n    if (n < 0)\n        fatal_error(\"premature end-of-file\");\n    checksum_add(n);\n    return n;\n}\n\n\nbool\nsrecord::input_file_stewie::read_inner(record &result)\n{\n    if (termination_seen)\n        return false;\n    int c = get_char();\n    if (c < 0)\n        return false;\n    if (c != 'S')\n    {\n        fatal_error(\"'S' expected\");\n        return false;\n    }\n    int tag = get_nibble();\n    switch (tag)\n    {\n    case 0:\n        // Header records are not like, Motorola hex.\n        // The header record is literally \"S003\"\n        if (get_char() != '0' || get_char() != '3')\n            fatal_error(\"format error\");\n        result = record(record::type_header, 0, 0, 0);\n        return true;\n\n    case 7:\n    case 8:\n    case 9:\n        result = record(record::type_execution_start_address, 0, 0, 0);\n        return true;\n    }\n    checksum_reset();\n    int line_length = get_byte();\n    if (line_length < 1)\n        fatal_error(\"record length invalid\");\n    unsigned char buffer[256];\n    for (int j = 0; j < line_length; ++j)\n        buffer[j] = get_byte();\n    if (use_checksums())\n    {\n        int n = checksum_get();\n        if (n != 0xFF)\n            fatal_error(\"checksum mismatch (%02X != FF)\", n);\n    }\n    --line_length;\n\n    int naddr = 2;\n    record::type_t type = record::type_unknown;\n    switch (tag)\n    {\n    case 1:\n        // data\n        type = record::type_data;\n        break;\n\n    case 2:\n        // data\n        type = record::type_data;\n        naddr = 3;\n        break;\n\n    case 3:\n        // data\n        type = record::type_data;\n        naddr = 4;\n        break;\n\n    case 5:\n        // data count\n        type = record::type_data_count;\n        //\n        // Just in case some smarty-pants uses the Green Hills trick, we\n        // cope with address size crap the same as Motorola S-Record.\n        //\n        if (line_length >= 2 && line_length <= 4)\n            naddr = line_length;\n        break;\n\n    case 6:\n        // data count\n        type = record::type_data_count;\n        //\n        // Just in case some smarty-pants uses the Green Hills trick, we\n        // cope with address size crap the same as Motorola S-Record.\n        //\n        naddr = 3;\n        if (line_length == 4)\n            naddr = line_length;\n        break;\n    }\n    if (line_length < naddr)\n    {\n        fatal_error\n        (\n            \"data length too short (%d < %d) for data type (%x)\",\n            line_length,\n            naddr,\n            tag\n        );\n    }\n    result =\n        record\n        (\n            type,\n            record::decode_big_endian(buffer, naddr),\n            buffer + naddr,\n            line_length - naddr\n        );\n    return true;\n}\n\n\nbool\nsrecord::input_file_stewie::read(record &result)\n{\n    for (;;)\n    {\n        if (!read_inner(result))\n        {\n            if (!seen_some_input && garbage_warning)\n                fatal_error(\"file contains no data\");\n            if (!header_seen)\n            {\n                warning(\"no header record\");\n                header_seen = true;\n            }\n            if (data_count <= 0)\n                warning(\"file contains no data\");\n            if (!termination_seen)\n            {\n                warning(\"no execution start address record\");\n                termination_seen = true;\n            }\n            return false;\n        }\n        seen_some_input = true;\n        if (result.get_type() != record::type_header && !header_seen)\n        {\n            warning(\"no header record\");\n            header_seen = true;\n        }\n        switch (result.get_type())\n        {\n        case record::type_unknown:\n            fatal_error(\"record type not recognised\");\n            break;\n\n        case record::type_header:\n            if (header_seen)\n                warning(\"redundant header record\");\n            if (result.get_address())\n            {\n                warning(\"address in header record ignored\");\n                result.set_address(0);\n            }\n            header_seen = true;\n            break;\n\n        case record::type_data:\n            ++data_count;\n            if (result.get_length() == 0)\n            {\n                warning(\"empty data record ignored\");\n                continue;\n            }\n            break;\n\n        case record::type_data_count:\n            {\n                record::address_t addr = result.get_address();\n                record::address_t mask = 0xFFFF;\n                while (addr > mask)\n                    mask = ~(~mask << 8);\n                mask &= data_count;\n                if (addr != mask)\n                {\n                    fatal_error\n                    (\n                        \"data record count mismatch (file %ld, read %ld)\",\n                        (long)addr,\n                        (long)mask\n                    );\n                }\n            }\n            continue;\n\n        case record::type_execution_start_address:\n            if (result.get_length() > 0)\n            {\n                warning(\"data in termination record ignored\");\n                result.set_length(0);\n            }\n            if (termination_seen)\n                warning(\"redundant termination record\");\n            termination_seen = true;\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nbool\nsrecord::input_file_stewie::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_stewie::get_file_format_name()\n    const\n{\n    return \"mobile phone signed binary (SBN)\";\n}\n\n\nint\nsrecord::input_file_stewie::format_option_number(void)\n    const\n{\n    return arglex_tool::token_stewie;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/stewie.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002-2004, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef LIB_INPUT_FILE_STEWIE_H\n#define LIB_INPUT_FILE_STEWIE_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_stewie class is used to represent the parse\n  * state of an input file in an undocumented binary format loosely\n  * based on the Motorola format.\n  */\nclass input_file_stewie:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_stewie();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int get_byte(void);\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_stewie(const std::string &file_name);\n\n    /**\n      * The data_count instance variable is used to remember the number\n      * of data lines has occurred so far in the input file.\n      */\n    unsigned long data_count;\n\n    /**\n      * The read_inner method is used to read a record of input.\n      * The read method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The garbage_warning instance variable is used to remember whether\n      * or not a warning about garbage input lines has been issued yet.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember where\n      * any data has been seen in this file yet.\n      */\n    bool seen_some_input;\n\n    /**\n      * The header_seen instance variable is used to remember whether\n      * or not the header record has been seen yet.\n      */\n    bool header_seen;\n\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether or not the termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_stewie();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_stewie(const input_file_stewie &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_stewie &operator=(const input_file_stewie &);\n};\n\n};\n\n#endif // LIB_INPUT_FILE_STEWIE_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/tektronix.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2005-2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/tektronix.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_tektronix::~input_file_tektronix()\n{\n    // make sure the termination record is done\n}\n\n\nsrecord::input_file_tektronix::input_file_tektronix(\n    const std::string &a_filename\n) :\n    srecord::input_file(a_filename),\n    data_record_count(0),\n    garbage_warning(false),\n    seen_some_input(false),\n    termination_seen(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_tektronix::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_tektronix(a_file_name));\n}\n\n\nint\nsrecord::input_file_tektronix::get_nibble(void)\n{\n    int n = srecord::input_file::get_nibble();\n    checksum_add(n);\n    return n;\n}\n\n\nint\nsrecord::input_file_tektronix::get_byte(void)\n{\n    // this differs from the srecord::input_file method only in that we\n    // don't add to the checksum.\n    int c1 = get_nibble();\n    int c2 = get_nibble();\n    return ((c1 << 4) | c2);\n}\n\n\nbool\nsrecord::input_file_tektronix::read_inner(srecord::record &record)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n            return false;\n        if (c == '/')\n            break;\n        if (c == '\\n')\n            continue;\n        if (!garbage_warning)\n        {\n            warning(\"ignoring garbage lines\");\n            garbage_warning = true;\n        }\n        for (;;)\n        {\n            c = get_char();\n            if (c < 0)\n                return false;\n            if (c == '\\n')\n                break;\n        }\n    }\n\n    if (peek_char() == '/')\n    {\n        //\n        // lines beginning with \"//\" are end-of-file records\n        //\n        seek_to_end();\n        return false;\n    }\n\n    unsigned char buffer[255+5];\n    checksum_reset();\n    buffer[0] = get_byte();\n    buffer[1] = get_byte();\n    buffer[2] = get_byte();\n    int nibble_checksum = checksum_get();\n    buffer[3] = get_byte();\n    if (use_checksums() && nibble_checksum != buffer[3])\n    {\n        fatal_error\n        (\n            \"header checksum mismatch (%02X != %02X)\",\n            nibble_checksum,\n            buffer[3]\n        );\n    }\n    if (buffer[2])\n    {\n        checksum_reset();\n        for (int j = 0; j < buffer[2]; ++j)\n            buffer[4 + j] = get_byte();\n        int data_checksum_calc = checksum_get();\n        int data_checksum_file = get_byte();\n        if (use_checksums() && data_checksum_calc != data_checksum_file)\n        {\n            fatal_error\n            (\n                \"data checksum mismatch (%02X != %02X)\",\n                data_checksum_calc,\n                data_checksum_file\n            );\n        }\n    }\n    if (get_char() != '\\n')\n        fatal_error(\"end-of-line expected\");\n\n    record =\n        srecord::record\n        (\n            (\n                buffer[2] == 0\n            ?\n                srecord::record::type_execution_start_address\n            :\n                srecord::record::type_data\n            ),\n            srecord::record::decode_big_endian(buffer, 2),\n            buffer + 4,\n            buffer[2]\n        );\n    return true;\n}\n\n\nbool\nsrecord::input_file_tektronix::read(srecord::record &record)\n{\n    for (;;)\n    {\n        if (!read_inner(record))\n        {\n            if (!seen_some_input && garbage_warning)\n                fatal_error(\"file contains no data\");\n            if (data_record_count <= 0)\n                fatal_error(\"file contains no data\");\n            if (!termination_seen)\n            {\n                warning(\"no execution start address record\");\n                termination_seen = true;\n            }\n            return false;\n        }\n        seen_some_input = true;\n        if\n        (\n            record.get_type() != srecord::record::type_execution_start_address\n        &&\n            termination_seen\n        )\n        {\n            warning(\"termination record should be last\");\n            termination_seen = false;\n        }\n        switch (record.get_type())\n        {\n        default:\n            // impossible\n            continue;\n\n        case srecord::record::type_data:\n            ++data_record_count;\n            break;\n\n        case srecord::record::type_execution_start_address:\n            if (termination_seen)\n                warning(\"redundant execution start address record\");\n            termination_seen = true;\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_tektronix::get_file_format_name(void)\n    const\n{\n    return \"Tektronix (16-bit)\";\n}\n\n\nint\nsrecord::input_file_tektronix::format_option_number(void)\n    const\n{\n    return arglex_tool::token_tektronix;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/tektronix.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_TEKTRONIX_H\n#define SRECORD_INPUT_FILE_TEKTRONIX_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_tektronix clas sis used to represent the parse\n  * state of an input file in Tektronix (non-extended) format.\n  */\nclass input_file_tektronix:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_tektronix();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_tektronix(const std::string &file_name);\n\n    /**\n      * The get_nibble method gets a single hex-digit from input.\n      * We override the one in the base class because the checksum is\n      * nibble-based, not byte-based.\n      */\n    int get_nibble(void);\n\n    /**\n      * The get_byte method gets a two hex-digit from input and assembles\n      * them (big-endian) into a byte.  We override the one in the base\n      * class because the checksum is nibble-based, not byte-based.\n      */\n    int get_byte(void);\n\n    /**\n      * The read_inner methos is used to read a single record from\n      * the input.  The read method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The data_record_count instance variable is used to remember the\n      * number of data records seen so far.\n      */\n    int data_record_count;\n\n    /**\n      * The garbage_warning instance variable is used to remember whether\n      * a warning about input line containing garbage has been issued yet.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember wheter\n      * the file contains any data so far.\n      */\n    bool seen_some_input;\n\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether the termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_tektronix();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_tektronix(const input_file_tektronix &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_tektronix &operator=(const input_file_tektronix &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_TEKTRONIX_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/tektronix_extended.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/tektronix_extended.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_tektronix_extended::~input_file_tektronix_extended()\n{\n}\n\n\nsrecord::input_file_tektronix_extended::input_file_tektronix_extended(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    garbage_warning(false),\n    seen_some_input(false),\n    termination_seen(false),\n    nibble_sum(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_tektronix_extended::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_tektronix_extended(a_file_name));\n}\n\n\nint\nsrecord::input_file_tektronix_extended::get_nibble(void)\n{\n    int n = inherited::get_nibble();\n    nibble_sum += n;\n    return n;\n}\n\n\nbool\nsrecord::input_file_tektronix_extended::read_inner(srecord::record &record)\n{\n    for (;;)\n    {\n        for (;;)\n        {\n            int c = get_char();\n            if (c < 0)\n                return false;\n            if (c == '%')\n                break;\n            if (c == '\\n')\n                continue;\n            if (!garbage_warning)\n            {\n                warning(\"ignoring garbage lines\");\n                garbage_warning = true;\n            }\n            for (;;)\n            {\n                c = get_char();\n                if (c < 0)\n                    return false;\n                if (c == '\\n')\n                    break;\n            }\n        }\n        nibble_sum = 0;\n        int length = get_byte();\n        if (length < 6)\n        {\n            // 2(length) + 1(tag) + 2(csum) + 1(addrlen)\n            fatal_error(\"line length invalid (%d < 6)\", length);\n        }\n        length -= 2;\n\n        int tag = get_nibble();\n        --length;\n\n        unsigned char csum_expected = get_byte();\n        // except the checksum itself\n        nibble_sum -= ((csum_expected >> 4) & 15) + (csum_expected & 15);\n        length -= 2;\n\n        int addr_len = get_nibble();\n        if (addr_len == 0)\n            addr_len = 16;\n        --length;\n        int addr_len_max = 2 * sizeof(srecord::record::address_t);\n        if (addr_len > addr_len_max)\n        {\n            fatal_error\n            (\n                \"address length too big (%d > %d)\",\n                addr_len,\n                addr_len_max\n            );\n        }\n        if (length < addr_len)\n        {\n            fatal_error\n            (\n                \"address length exceeds line length (%d > %d)\",\n                addr_len,\n                length\n            );\n        }\n\n        unsigned long address = 0;\n        while (addr_len > 0)\n        {\n            int n = get_nibble();\n            address = address * 16 + n;\n            --addr_len;\n            --length;\n        }\n        if (length & 1)\n            fatal_error(\"data length invalid (%d is odd)\", length);\n\n        unsigned char buffer[125];\n        for (int j = 0; j * 2 < length; ++j)\n        {\n            int n = get_byte();\n            buffer[j] = n;\n        }\n        if (csum_expected != nibble_sum)\n        {\n            fatal_error\n            (\n                \"checksum mismatch (file says 0x%02X, expected 0x%02X)\",\n                csum_expected,\n                nibble_sum\n            );\n        }\n        if (get_char() != '\\n')\n            fatal_error(\"end-of-line expected\");\n\n        srecord::record::type_t type = srecord::record::type_unknown;\n        switch (tag)\n        {\n        default:\n            fatal_error(\"unknown tag (%X)\", tag);\n            continue;\n\n        case 3:\n            // symbol record, ignore\n            continue;\n\n        case 6:\n            // data\n            type = srecord::record::type_data;\n            break;\n\n        case 8:\n            // termination\n            type = srecord::record::type_execution_start_address;\n            break;\n        }\n        record = srecord::record(type, address, buffer, length >> 1);\n        return true;\n    }\n}\n\n\nbool\nsrecord::input_file_tektronix_extended::read(srecord::record &record)\n{\n    for (;;)\n    {\n        if (!read_inner(record))\n        {\n            if (!seen_some_input)\n                fatal_error(\"file contains no data\");\n            if (!termination_seen)\n            {\n                warning(\"no execution start address record\");\n                termination_seen = true;\n            }\n            return false;\n        }\n        seen_some_input = true;\n        if\n        (\n            record.get_type() != srecord::record::type_execution_start_address\n        &&\n            termination_seen\n        )\n        {\n            warning(\"termination record should be last\");\n            termination_seen = false;\n        }\n        switch (record.get_type())\n        {\n        case srecord::record::type_unknown:\n        case srecord::record::type_header:\n        case srecord::record::type_data_count:\n            fatal_error(\"record type not recognised\");\n            break;\n\n        case srecord::record::type_data:\n            ++data_record_count;\n            if (record.get_length() == 0)\n            {\n                warning(\"empty data record ignored\");\n                continue;\n            }\n            break;\n\n        case srecord::record::type_execution_start_address:\n            if (record.get_length() > 0)\n            {\n                warning(\"data in execution start address record ignored\");\n                record.set_length(0);\n            }\n            if (termination_seen)\n                warning(\"redundant execution start address record\");\n            termination_seen = true;\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_tektronix_extended::get_file_format_name(void)\n    const\n{\n    return \"Tektronix Extended\";\n}\n\n\nint\nsrecord::input_file_tektronix_extended::format_option_number(void)\n    const\n{\n    return arglex_tool::token_tektronix_extended;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/tektronix_extended.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_TEKTRONIX_EXTENDED_H\n#define SRECORD_INPUT_FILE_TEKTRONIX_EXTENDED_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_tektronix_extended clas sis used to represent\n  * the parse state of an input file in Tektronix Extended format.\n  */\nclass input_file_tektronix_extended:\n    public input_file\n{\npublic:\n    // make the code around gt_nibble more readable.\n    typedef input_file inherited;\n\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_tektronix_extended();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\n    // See base class for documentation.\n    int get_nibble(void);\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_tektronix_extended(const std::string &file_name);\n\n    /**\n      * The data_record_count instance variable is used to remember the\n      * number of data records seen in the input so far.\n      */\n    int data_record_count;\n\n    /**\n      * The read_inner method is used to read a record of input.\n      * The read method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The garbage_warning instance variable is used to remember\n      * whether or not a warning about garbage line in the input has\n      * been issued yet.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * any data has been seen in this file yet.\n      */\n    bool seen_some_input;\n\n    /**\n      * The header_seen instance variable is used to remember whether\n      * the header record has been seen yet.\n      */\n    bool header_seen;\n\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether the termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * The nibble_sum instance variable is usd to remember the running\n      * checksum, of each nibble on the record line.\n      */\n    unsigned char nibble_sum;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_tektronix_extended();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_tektronix_extended(const input_file_tektronix_extended &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_tektronix_extended &operator=(\n        const input_file_tektronix_extended &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_TEKTRONIX_EXTENDED_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ti_tagged.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/ti_tagged.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_ti_tagged::~input_file_ti_tagged()\n{\n}\n\n\nsrecord::input_file_ti_tagged::input_file_ti_tagged(\n    const std::string &a_filename\n) :\n    input_file(a_filename),\n    address(0),\n    csum(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_ti_tagged::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_ti_tagged(a_file_name));\n}\n\n\nint\nsrecord::input_file_ti_tagged::get_char(void)\n{\n    int c = inherited::get_char();\n    if (c < 0 || c == '\\n')\n        csum = 0;\n    else\n        csum += c;\n    return c;\n}\n\n\nbool\nsrecord::input_file_ti_tagged::read(record &result)\n{\n    for (;;)\n    {\n        int c = get_char();\n        switch (c)\n        {\n        default:\n            fatal_error\n            (\n                (isprint(c) ? \"unknown tag '%c'\" : \"unknown tag (%02X)\"),\n                c\n            );\n\n        case -1:\n            return false;\n\n        case '*':\n            {\n                // followed by 2 data characters (1 data byte)\n                unsigned char data[1];\n                data[0] = get_byte();\n                result = record(record::type_data, address, data, 1);\n                ++address;\n                return true;\n            }\n\n        case ':':\n            // end of file\n            while (get_char() >= 0)\n                ;\n            return false;\n\n        case '0':\n            {\n                // file header\n                // 4 char: word count of the rest of the file (hex)\n                // 8 char: file name (ascii)\n                // we will ignore\n                get_word_be();\n                for (int n = 0; n < 8; ++n)\n                    get_char();\n            }\n            break;\n\n        case '7':\n            {\n                // checksum which the programmer verifies\n                int n = (-csum) & 0xFFFF;\n                int n2 = get_word_be();\n                if (n != n2)\n                {\n                    fatal_error\n                    (\n                        \"checksum mismatch (calculated %04X, file has %04X)\",\n                        n,\n                        n2\n                    );\n                }\n            }\n            break;\n\n        case '8':\n            // a checksum which the programmer ignores.\n            get_word_be();\n            break;\n\n        case '9':\n            // load address which represents a word location.\n            address = get_word_be();\n            break;\n\n        case 'B':\n            {\n                unsigned char data[2];\n                data[0] = get_byte();\n                data[1] = get_byte();\n                result = record(record::type_data, address, data, 2);\n                address += 2;\n                return true;\n            }\n\n        case 'F':\n            // denotes the end of a data record.\n            if (get_char() != '\\n')\n                fatal_error(\"end of line expected\");\n            break;\n\n        case 'K':\n            {\n                // file description\n                int n = get_word_be();\n                if (n < 5)\n                {\n                    bad_desc:\n                    fatal_error(\"broken description\");\n                }\n                n -= 5;\n                int max = 250;\n                unsigned char *buffer = new unsigned char [max];\n                for (int j = 0; j < n; ++j)\n                {\n                    c = get_char();\n                    if (c < 0 || c == '\\n')\n                            goto bad_desc;\n                    if (j < max)\n                            buffer[j] = c;\n                }\n                if (n > max)\n                    n = max;\n                result = record(record::type_header, 0, buffer, n);\n                delete [] buffer;\n            }\n            return true;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_ti_tagged::get_file_format_name(void)\n    const\n{\n    return \"Texas Instruments Tagged (SDSMAC)\";\n}\n\n\nint\nsrecord::input_file_ti_tagged::format_option_number(void)\n    const\n{\n    return arglex_tool::token_ti_tagged;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ti_tagged.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_TI_TAGGED_H\n#define SRECORD_INPUT_FILE_TI_TAGGED_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_ti_tagged class is used to represent the parse\n  * state of an input file in TI Tagged format.\n  */\nclass input_file_ti_tagged:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_ti_tagged();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_ti_tagged(const std::string &file_name);\n\n    /**\n      * The get_char method is used to get a character from the input.\n      * We override bacsie the checksum is character based, not byte\n      * based.\n      */\n    int get_char(void);\n\nprivate:\n    typedef input_file inherited;\n\n    /**\n      * The read_inner method is used to read a single line of input.\n      * the raed method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the input file.\n      */\n    unsigned long address;\n\n    /**\n      * The csum instance variable is used to remember the running\n      * checksum.\n      */\n    int csum;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_ti_tagged();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_ti_tagged(const input_file_ti_tagged &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_ti_tagged &operator=(const input_file_ti_tagged &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_TI_TAGGED_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ti_tagged_16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/ti_tagged_16.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_ti_tagged_16::~input_file_ti_tagged_16()\n{\n}\n\n\nsrecord::input_file_ti_tagged_16::input_file_ti_tagged_16(\n    const std::string &a_file_name\n) :\n    input_file(a_file_name),\n    address(0),\n    csum(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_ti_tagged_16::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_ti_tagged_16(a_file_name));\n}\n\n\nint\nsrecord::input_file_ti_tagged_16::get_char(void)\n{\n    int c = inherited::get_char();\n    if (c < 0 || c == '\\n')\n        csum = 0;\n    else\n        csum += c;\n    return c;\n}\n\n\nbool\nsrecord::input_file_ti_tagged_16::read(record &result)\n{\n    for (;;)\n    {\n        int c = get_char();\n        switch (c)\n        {\n        default:\n            fatal_error\n            (\n                (isprint(c) ? \"unknown tag '%c'\" : \"unknown tag (%02X)\"),\n                c\n            );\n\n        case -1:\n            return false;\n\n        case '*':\n            {\n                // followed by 2 data characters (1 data byte)\n                unsigned char data[1];\n                data[0] = get_byte();\n                result = record(record::type_data, address, data, 1);\n                ++address;\n                return true;\n            }\n\n        case ':':\n            // end of file\n            while (get_char() >= 0)\n                ;\n            return false;\n\n        case '0':\n            {\n                // file header\n                // 4 char: word count of the rest of the file (hex)\n                // 8 char: file name (ascii)\n                // we will ignore\n                get_word_be();\n                for (int n = 0; n < 8; ++n)\n                    get_char();\n            }\n            break;\n\n        case '7':\n            {\n                // checksum which the programmer verifies\n                int n = (-csum) & 0xFFFF;\n                int n2 = get_word_be();\n                if (n != n2)\n                {\n                    fatal_error\n                    (\n                        \"checksum mismatch (calculated %04X, file has %04X)\",\n                        n,\n                        n2\n                    );\n                }\n            }\n            break;\n\n        case '8':\n            // a checksum which the programmer ignores.\n            get_word_be();\n            break;\n\n        case '9':\n            // load address which represents a word location.\n            address = get_word_be() * 2;\n            break;\n\n        case 'B':\n            {\n                unsigned char data[2];\n                data[0] = get_byte();\n                data[1] = get_byte();\n                result = record(record::type_data, address, data, 2);\n                address += 2;\n                return true;\n            }\n\n        case 'F':\n            // denotes the end of a data record.\n            if (get_char() != '\\n')\n                fatal_error(\"end of line expected\");\n            break;\n\n        case 'K':\n            {\n                // file description\n                int n = get_word_be();\n                if (n < 5)\n                {\n                    bad_desc:\n                    fatal_error(\"broken description\");\n                }\n                n -= 5;\n                int max = 250;\n                unsigned char *buffer = new unsigned char [max];\n                for (int j = 0; j < n; ++j)\n                {\n                    c = get_char();\n                    if (c < 0 || c == '\\n')\n                            goto bad_desc;\n                    if (j < max)\n                            buffer[j] = c;\n                }\n                if (n > max)\n                    n = max;\n                result = record(record::type_header, 0, buffer, n);\n                delete [] buffer;\n            }\n            return true;\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_ti_tagged_16::get_file_format_name(void)\n    const\n{\n    return \"Texas Instruments SDSMAC (320)\";\n}\n\n\nint\nsrecord::input_file_ti_tagged_16::format_option_number(void)\n    const\n{\n    return arglex_tool::token_ti_tagged_16;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ti_tagged_16.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2007, 2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_TI_TAGGED_16_H\n#define SRECORD_INPUT_FILE_TI_TAGGED_16_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_ti_tagged_16 class is used to represent the\n  * parse state of an input file in Texas Instruments SDSMAC 320 format.\n  */\nclass input_file_ti_tagged_16:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_ti_tagged_16();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    /**\n      * The get_char method is used to get a character from the input.\n      * We override because the checksum is character based, not byte\n      * based.\n      */\n    int get_char(void);\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_ti_tagged_16(const std::string &file_name);\n\n    typedef input_file inherited;\n\n    /**\n      * The read_inner method is used to read a single line of input.\n      * the raed method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the input file.\n      */\n    unsigned long address;\n\n    /**\n      * The csum instance variable is used to remember the running\n      * checksum.\n      */\n    int csum;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_ti_tagged_16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_ti_tagged_16(const input_file_ti_tagged_16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_ti_tagged_16 &operator=(const input_file_ti_tagged_16 &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_TI_TAGGED_16_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ti_txt.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/ti_txt.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_ti_txt::~input_file_ti_txt()\n{\n}\n\n\nsrecord::input_file_ti_txt::input_file_ti_txt(const std::string &a_file_name) :\n    input_file(a_file_name),\n    seen_some_input(false),\n    address(0),\n    token(token_start_up),\n    token_value(0),\n    address_warning(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_ti_txt::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_ti_txt(a_file_name));\n}\n\n\nvoid\nsrecord::input_file_ti_txt::get_next_token(void)\n{\n    token_value = 0;\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n        {\n            token = token_end_of_file;\n            return;\n        }\n        switch (c)\n        {\n        case ' ':\n        case '\\t':\n        case '\\f':\n            // ignore all white space\n            break;\n\n        case '\\r':\n        case '\\n':\n            // ignore end of line\n            break;\n\n        case '\\32':\n            // ignore ^Z characters\n            break;\n\n        case '@':\n            token = token_at;\n            return;\n\n        case '0': case '1': case '2': case '3': case '4':\n        case '5': case '6': case '7': case '8': case '9':\n        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n            for (;;)\n            {\n                int n = get_nibble_value(c);\n                // assert(n >= 0);\n                token_value = (token_value << 4) | n;\n                c = get_char();\n                switch (c)\n                {\n                case '0': case '1': case '2': case '3': case '4':\n                case '5': case '6': case '7': case '8': case '9':\n                case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n                case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n                    break;\n\n                default:\n                    get_char_undo(c);\n                    token = token_number;\n                    return;\n                }\n            }\n\n        case 'Q':\n        case 'q':\n            token = token_q;\n            return;\n\n        default:\n            token = token_junk;\n            return;\n        }\n\n    }\n}\n\n\nbool\nsrecord::input_file_ti_txt::read(record &result)\n{\n    for (;;)\n    {\n        switch (token)\n        {\n        case token_start_up:\n            get_next_token();\n            if (token != token_at)\n                fatal_error(\"data must start with an address record\");\n            break;\n\n        case token_at:\n            get_next_token();\n            if (token != token_number)\n                fatal_error(\"@ must be followed by an address\");\n            address = token_value;\n#if 0\n            //\n            // Despite // http://www.ti.com/lit/pdf/slau101 section A.2\n            // stating that \"the execution start address must be even\",\n            // it doesn't have to be.\n            //\n            if (address & 1)\n                warning(\"addresses should be even\");\n#endif\n            if (address >= (1 << 20) && !address_warning)\n            {\n                warning(\"addresses (0x%08lX) too large\", address);\n                address_warning = true;\n            }\n            get_next_token();\n            break;\n\n        case token_number:\n            {\n                seen_some_input = true;\n                unsigned char buffer[record::max_data_length];\n                size_t n = 0;\n                for (;;)\n                {\n                    if (token_value >= 256)\n                        fatal_error(\"byte value (%ld) too large\", token_value);\n                    buffer[n++] = token_value;\n                    get_next_token();\n                    if (n >= record::max_data_length)\n                        break;\n                    if (token != token_number)\n                        break;\n                }\n                if (address >= (1 << 20) && !address_warning)\n                {\n                    warning(\"addresses (0x%08lX) too large\", address);\n                    address_warning = true;\n                }\n                result = record(record::type_data, address, buffer, n);\n                address += n;\n                return true;\n            }\n\n        case token_q:\n        case token_end_of_file:\n            if (!seen_some_input)\n                fatal_error(\"file contains no data\");\n            return false;\n\n        case token_junk:\n            fatal_error(\"illegal character\");\n        }\n    }\n}\n\n\nconst char *\nsrecord::input_file_ti_txt::get_file_format_name(void)\n    const\n{\n    return \"ti-txt (MSP430)\";\n}\n\n\nint\nsrecord::input_file_ti_txt::format_option_number(void)\n    const\n{\n    return arglex_tool::token_ti_txt;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/ti_txt.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2007, 2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_ti_txt_H\n#define SRECORD_INPUT_FILE_ti_txt_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_ti_txt class is used to repesent the parse\n  * state when reading a ti_txt (MSP430) format input file.\n  */\nclass input_file_ti_txt:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_ti_txt();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_ti_txt(const std::string &file_name);\n\n    /**\n      * The garbage_warning instance variable is used to remember whether\n      * a warning has already been issued if the file contains garbage.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * any data has been seen in the input to date.\n      */\n    bool seen_some_input;\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the input file, so it may be associated with data bytes.\n      */\n    unsigned long address;\n\n    enum token_t\n    {\n        token_start_up,\n        token_at,\n        token_end_of_file,\n        token_junk,\n        token_number,\n        token_q\n    };\n\n    /**\n      * the token instance variable is used to remember the type of the\n      * most recent token, as determined by the get_next_token method.\n      */\n    token_t token;\n\n    /**\n      * the token_value instance variable is used to remember the value\n      * of the most recent token, as determined by the get_next_token\n      * method.  Only meaningful for token_number, zero otherwise.\n      */\n    unsigned long token_value;\n\n    /**\n      * The address_warning instance variable is used to remember\n      * whether or not we have already warned about addresses which are\n      * too large.\n      */\n    bool address_warning;\n\n    /**\n      * The get_next_token method is used to partition the input into\n      * the next symbol.  All the digits of a hexadecimal number are\n      * considered a single symbol.\n      */\n    void get_next_token(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_ti_txt();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_ti_txt(const input_file_ti_txt &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_ti_txt &operator=(const input_file_ti_txt &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_ti_txt_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/trs80.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012, 2013 Peter Miller\n//\n// Code contribution by Eric Smith <eric@brouhaha.com>\n// Copyright assigned to Peter Miller 15-Mar-2012.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/endian.h>\n#include <srecord/input/file/trs80.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_trs80::~input_file_trs80()\n{\n    delete pending;\n    pending = 0;\n}\n\n\nsrecord::input_file_trs80::input_file_trs80(\n    const std::string &a_file_name\n) :\n    srecord::input_file(a_file_name),\n    termination_seen(false),\n    data_seen(false),\n    pending(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_trs80::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_trs80(a_file_name));\n}\n\n\nint\nsrecord::input_file_trs80::get_byte(void)\n{\n    int c = get_char();\n    if (c < 0)\n        fatal_error(\"premature end-of-file\");\n    return c;\n}\n\n\nbool\nsrecord::input_file_trs80::read(srecord::record &result)\n{\n    if (pending)\n    {\n        result = *pending;\n        delete pending;\n        pending = 0;\n        return true;\n    }\n\n    if (termination_seen)\n        return false;\n    for (;;)\n    {\n        //\n        // The general format of a load record is a one-byte record type,\n        // a one-byte record length, then the payload.  In the case of a\n        // data record, transfer record, or end record, the first two bytes\n        // of the payload are a memory address.\n        //\n        // In the case of Data Records only, Record Length byte values\n        // of zero to two are considered to be lengths of 256 to 258,\n        // respectively.\n        //\n        unsigned rec_type = get_byte();\n        unsigned payload_size = get_byte();\n        if (rec_type == 0x01 && payload_size <= 2)\n            payload_size += 256;\n        unsigned char payload[258];\n        for (unsigned j = 0; j < payload_size; ++j)\n            payload[j] = get_byte();\n\n        switch (rec_type)\n        {\n        case 0x01:\n            // data\n            {\n                assert(payload_size > 2);\n                long address = decode_word_le(payload);\n                const unsigned char *data = payload + 2;\n                unsigned data_size = payload_size - 2;\n                record::type_t type = record::type_data;\n                assert(data_size < 2 * record::max_data_length);\n                if (data_size > record::max_data_length)\n                {\n                    // We can't write long data records, but we *must*\n                    // be able to read them.\n                    unsigned half = data_size / 2;\n                    pending =\n                        new srecord::record\n                        (\n                            type,\n                            address + half,\n                            data + half,\n                            data_size - half\n                        );\n                    data_size = half;\n                }\n                result = srecord::record(type, address, data, data_size);\n                data_seen = true;\n                return true;\n            }\n\n        case 0x02:\n            // transfer\n        case 0x03:\n            // end w/o transfer\n            {\n                if (payload_size != 2)\n                {\n                    fatal_error\n                    (\n                        \"record type 0x%02X: payload size %d invalid\",\n                        rec_type,\n                        payload_size\n                    );\n                }\n                long address = decode_word_le(payload);\n                record::type_t type = record::type_execution_start_address;\n                result = srecord::record(type, address, 0, 0);\n                termination_seen = true;\n                return true;\n            }\n\n        case 0x05:\n            // comment\n            if (!data_seen)\n            {\n                // Use the comment record type as a kind of header record,\n                // if it occurs early enough in the file.\n                long address = 0;\n\n                // Get rid of unprintable characters (especially NUL)\n                {\n                    const unsigned char *ip = payload;\n                    const unsigned char *end = ip + payload_size;\n                    unsigned char *op = payload;\n                    while (ip < end)\n                    {\n                        if (isprint(*ip))\n                            *op++ = *ip;\n                        ++ip;\n                    }\n                    payload_size = op - payload;\n                }\n\n                record::type_t type = record::type_header;\n                if (payload_size > record::max_data_length)\n                    payload_size = record::max_data_length;\n                result = srecord::record(type, address, payload, payload_size);\n                return true;\n            }\n            break;\n\n        default:\n            // various, ignore\n            warning\n            (\n                \"record type 0x%02X unknown (payload size %u)\",\n                rec_type,\n                payload_size\n            );\n            break;\n        }\n    }\n}\n\n\nbool\nsrecord::input_file_trs80::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_trs80::get_file_format_name(void)\n    const\n{\n    return \"TRS80\";\n}\n\n\nint\nsrecord::input_file_trs80::format_option_number(void)\n    const\n{\n    return arglex_tool::token_trs80;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/trs80.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012, 2013 Peter Miller\n//\n// Code contribution by Eric Smith <eric@brouhaha.com>\n// Copyright assigned to Peter Miller 15-Mar-2012.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_TRS80_H\n#define SRECORD_INPUT_FILE_TRS80_H\n\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_trs80 class is used to parse a Radio Shack\n  * TRS-80 load module file.\n  */\nclass input_file_trs80:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_trs80();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &result);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether or not a termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * The data_seen instance variable is used to remember\n      * whether or not a data record has been seen yet.\n      */\n    bool data_seen;\n\n    /**\n      * A constructor.  The input is read from the named file (or\n      * the standard input if the file anme is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_trs80(const std::string &file_name);\n\n    /**\n      * The get_byte method is used to fetch a byte of input, and\n      * update the checksum.  We over-ride the base implementation,\n      * because we use raw bytes rather than two hex digits.\n      */\n    int get_byte(void);\n\n    /**\n      * The pending instance variable is used to remember the second\n      * half of large data packets, in the case where they must be splt.\n      */\n    record *pending;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_trs80(const input_file_trs80 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_trs80 &operator=(const input_file_trs80 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_TRS80_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/vmem.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2005-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/vmem.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_vmem::~input_file_vmem()\n{\n}\n\n\nsrecord::input_file_vmem::input_file_vmem(const std::string &a_file_name) :\n    srecord::input_file(a_file_name),\n    seen_some_input(false),\n    address(0)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_vmem::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::input_file_vmem(a_file_name));\n}\n\n\nbool\nsrecord::input_file_vmem::read(srecord::record &record)\n{\n    for (;;)\n    {\n        int c = get_char();\n        if (c < 0)\n        {\n            if (!seen_some_input)\n                fatal_error(\"file contains no data\");\n            return false;\n        }\n        if (c == '@')\n        {\n            // collect address\n            address = 0;\n            for (;;)\n            {\n                address = (address << 4) + get_nibble();\n                c = peek_char();\n                if (c < 0 || !isxdigit((unsigned char)c))\n                    break;\n            }\n            continue;\n        }\n        if (isspace((unsigned char)c))\n            continue;\n\n        if (c == '/')\n        {\n            c = get_char();\n            if (c == '/')\n            {\n                for (;;)\n                {\n                    c = get_char();\n                    if (c == '\\n' || c < 0)\n                        break;\n                }\n                continue;\n            }\n            if (c == '*')\n            {\n                for (;;)\n                {\n                    for (;;)\n                    {\n                        c = get_char();\n                        if (c < 0)\n                        {\n                            eof_within_comment:\n                            fatal_error(\"end-of-file within comment\");\n                        }\n                        if (c == '*')\n                            break;\n                    }\n                    for (;;)\n                    {\n                        c = get_char();\n                        if (c < 0)\n                            goto eof_within_comment;\n                        if (c != '*')\n                            break;\n                    }\n                    if (c =='/')\n                        break;\n                }\n                continue;\n            }\n            fatal_error(\"malformed comment\");\n        }\n\n        // collect value\n        get_char_undo(c);\n        unsigned char value[5];\n        size_t nbytes = 0;\n        while (nbytes < sizeof(value))\n        {\n            value[nbytes++] = get_byte();\n            c = peek_char();\n            if (c < 0 || !isxdigit((unsigned char)c))\n                break;\n        }\n        switch (nbytes)\n        {\n        default:\n            fatal_error(\"value has too many bytes (%d)\", (int)nbytes);\n\n        case 1:\n        case 2:\n        case 4:\n            record =\n                srecord::record\n                (\n                    srecord::record::type_data,\n                    address * nbytes,\n                    value,\n                    nbytes\n                );\n            break;\n        }\n\n        // This is not a byte address, it's a chunk address.\n        ++address;\n        seen_some_input = true;\n        return true;\n    }\n}\n\n\nconst char *\nsrecord::input_file_vmem::get_file_format_name(void)\n    const\n{\n    return \"Verilog VMEM\";\n}\n\n\nint\nsrecord::input_file_vmem::format_option_number(void)\n    const\n{\n    return arglex_tool::token_vmem;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/vmem.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_VMEM_H\n#define SRECORD_INPUT_FILE_VMEM_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_vmem class is used to repesent the parse\n  * state when reading a Verilog VMEM format input file.\n  */\nclass input_file_vmem:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_vmem();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_vmem(const std::string &file_name);\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * any data has been seen in the input to date.\n      */\n    bool seen_some_input;\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the input file, so it may be associated with data bytes.\n      */\n    unsigned long address;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_vmem();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_vmem(const input_file_vmem &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_vmem &operator=(const input_file_vmem &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_VMEM_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/wilson.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2005-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/file/wilson.h>\n#include <srecord/record.h>\n\n\nsrecord::input_file_wilson::~input_file_wilson()\n{\n}\n\n\nsrecord::input_file_wilson::input_file_wilson(const std::string &a_file_name) :\n    input_file(a_file_name),\n    garbage_warning(false),\n    seen_some_input(false),\n    termination_seen(false)\n{\n}\n\n\nsrecord::input_file::pointer\nsrecord::input_file_wilson::create(const std::string &a_file_name)\n{\n    return pointer(new input_file_wilson(a_file_name));\n}\n\n\nint\nsrecord::input_file_wilson::get_byte(void)\n{\n    int n = -1;\n    int c = get_char();\n    if (c >= 0x40 && c < 0xE0)\n        n = (c - 0x40);\n    else if (c >= 0xE0)\n        n = c;\n    else if (c >= 0x3A && c < 0x3E)\n    {\n        int c2 = get_char();\n        if (c2 >= 0x30 && c2 < 0x40)\n            n = ((c - 0x30) << 4) + (c2 - 0x30);\n        else\n            goto bomb;\n    }\n    else\n    {\n        bomb:\n        fatal_error(\"illegal character\");\n        // NOTREACHED\n    }\n    checksum_add(n);\n    return n;\n}\n\n\nbool\nsrecord::input_file_wilson::read_inner(record &result)\n{\n    int c;\n    for (;;)\n    {\n        c = get_char();\n        if (c < 0)\n            return false;\n        if (c == '#' || c == '\\'')\n            break;\n        if (c == '\\n')\n            continue;\n        if (!garbage_warning)\n        {\n            warning(\"ignoring garbage lines\");\n            garbage_warning = true;\n        }\n        for (;;)\n        {\n            c = get_char();\n            if (c < 0)\n                return false;\n            if (c == '\\n')\n                break;\n        }\n    }\n    int tag = c;\n    checksum_reset();\n    int line_length = get_byte();\n    if (line_length < 1)\n        fatal_error(\"line length invalid\");\n    unsigned char buffer[256];\n    for (int j = 0; j < line_length; ++j)\n        buffer[j] = get_byte();\n    if (use_checksums())\n    {\n        int n = checksum_get();\n        if (n != 0xFF)\n            fatal_error(\"checksum mismatch (%02X != FF)\", n);\n    }\n    if (get_char() != '\\n')\n        fatal_error(\"end-of-line expected\");\n    --line_length;\n\n    int naddr = 4;\n    record::type_t type = record::type_unknown;\n    switch (tag)\n    {\n    case '#':\n        // data\n        type = record::type_data;\n        break;\n\n    case '\\'':\n        // termination\n        type = record::type_execution_start_address;\n        break;\n    }\n    if (line_length < naddr)\n    {\n        fatal_error\n        (\n            \"data length too short (%d < %d) for data type (%x)\",\n            line_length,\n            naddr,\n            tag\n        );\n    }\n    result =\n        record\n        (\n            type,\n            record::decode_big_endian(buffer, naddr),\n            buffer + naddr,\n            line_length - naddr\n        );\n    return true;\n}\n\n\nbool\nsrecord::input_file_wilson::read(record &record)\n{\n    for (;;)\n    {\n        if (!read_inner(record))\n        {\n                if (!seen_some_input)\n                        fatal_error(\"file contains no data\");\n                if (!termination_seen)\n                {\n                        warning(\"no execution start address record\");\n                        termination_seen = true;\n                }\n                return false;\n        }\n        seen_some_input = true;\n        if\n        (\n                record.get_type() != record::type_execution_start_address\n        &&\n                termination_seen\n        )\n        {\n                warning(\"termination record should be last\");\n                termination_seen = false;\n        }\n        switch (record.get_type())\n        {\n        case record::type_unknown:\n        case record::type_header:\n        case record::type_data_count:\n            fatal_error(\"record type not recognised\");\n            break;\n\n        case record::type_data:\n            if (record.get_length() == 0)\n            {\n                    warning(\"empty data record ignored\");\n                    continue;\n            }\n            break;\n\n        case record::type_execution_start_address:\n            if (record.get_length() > 0)\n            {\n                    warning(\"data in execution start address record ignored\");\n                    record.set_length(0);\n            }\n            if (termination_seen)\n                    warning(\"redundant execution start address record\");\n            termination_seen = true;\n            break;\n        }\n        break;\n    }\n    return true;\n}\n\n\nbool\nsrecord::input_file_wilson::is_binary(void)\n    const\n{\n    return true;\n}\n\n\nconst char *\nsrecord::input_file_wilson::get_file_format_name(void)\n    const\n{\n    return \"Wilson (anyone know this format's real name?)\";\n}\n\n\nint\nsrecord::input_file_wilson::format_option_number(void)\n    const\n{\n    return arglex_tool::token_wilson;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file/wilson.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2008, 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_WILSON_H\n#define SRECORD_INPUT_FILE_WILSON_H\n\n#include <srecord/input/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_file_wilson clas sis used to represent the parse state\n  * of an input file in Wilson format.  (Named after the person who wasked\n  * for it; I still don't have an official definition of this format,\n  * but it is very much like a binary(ish) form of the Motorola format.)\n  */\nclass input_file_wilson:\n    public input_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_file_wilson();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      * @returns\n      *     smart pointer to new instance\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    const char *get_file_format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\n    // See base class for documentation.\n    int format_option_number(void) const;\n\n    /**\n      * The get_byte method is used to get a byte of input.  We override\n      * because the byte encoding is one character of input sometimes,\n      * and two characters of input at other times.\n      */\n    virtual int get_byte(void);\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file_wilson(const std::string &file_name);\n\nprivate:\n    /**\n      * The read_inner method is used to read a record from the input.\n      * The #read method is a wrapper around this method.\n      */\n    bool read_inner(record &);\n\n    /**\n      * The garbage_warning instance variable is used to remember whether\n      * a warning about garbage input has been issued yet.\n      */\n    bool garbage_warning;\n\n    /**\n      * The seen_some_input instance variable is used to remember whether\n      * this file contains any data so far.\n      */\n    bool seen_some_input;\n\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether the termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file_wilson();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file_wilson(const input_file_wilson &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_file_wilson &operator=(const input_file_wilson &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILE_WILSON_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cerrno>\n#include <cstdio>\n#include <cstring>\n#include <iostream>\n\n#include <srecord/input/file.h>\n\nbool srecord::input_file::ignore_checksums_default = false;\n\n\nsrecord::input_file::input_file() :\n    file_name(\"standard input\"),\n    line_number(1),\n    prev_was_newline(false),\n    vfp(stdin),\n    checksum(0),\n    ignore_checksums(ignore_checksums_default)\n{\n}\n\n\nbool\nsrecord::input_file::is_binary(void)\n    const\n{\n    return false;\n}\n\n\nsrecord::input_file::input_file(const std::string &a_file_name) :\n    file_name(a_file_name),\n    line_number(1),\n    prev_was_newline(false),\n    vfp(0),\n    checksum(0),\n    ignore_checksums(ignore_checksums_default)\n{\n    if (file_name == \"-\")\n    {\n        file_name = \"standard input\";\n        vfp = stdin;\n    }\n    else\n    {\n        //\n        // The call to fopen is deferred until the constructor has\n        // completed.  This is so that the virtual is_binary() method\n        // is available (it isn't in the base class constructor).\n        //\n    }\n}\n\n\nvoid *\nsrecord::input_file::get_fp(void)\n{\n    if (!vfp)\n    {\n        //\n        // The call to fopen is deferred until the constructor has\n        // completed.  This is so that the virtual is_binary() method\n        // is available (it isn't in the base class constructor).\n        //\n        const char *the_mode = \"r\";\n        if (is_binary())\n        {\n            the_mode = \"rb\";\n            line_number = 0;\n        }\n        vfp = fopen(file_name.c_str(), the_mode);\n        if (!vfp)\n            fatal_error_errno(\"open\");\n    }\n    return vfp;\n}\n\n\nsrecord::input_file::~input_file()\n{\n    FILE *fp = (FILE *)get_fp();\n    if (fp != stdin && fclose(fp))\n        fatal_error_errno(\"close\");\n}\n\n\nstd::string\nsrecord::input_file::filename(void)\n    const\n{\n    return file_name;\n}\n\n\nstd::string\nsrecord::input_file::filename_and_line(void)\n    const\n{\n    if (!vfp)\n        return file_name;\n    char buffer[20];\n    if (!is_binary())\n        sprintf(buffer, \": %d\", line_number);\n    else\n        sprintf(buffer, \": 0x%04X\", line_number);\n    return (file_name + buffer);\n}\n\n\nint\nsrecord::input_file::get_char(void)\n{\n    FILE *fp = (FILE *)get_fp();\n    if (prev_was_newline)\n        ++line_number;\n    int c = getc(fp);\n    if (c == EOF)\n    {\n        if (ferror(fp))\n            fatal_error_errno(\"read\");\n\n        //\n        // If this is a text file, but the last character wasn't\n        // a newline, insert one.\n        //\n        c = ((!is_binary() && !prev_was_newline) ? '\\n' : -1);\n    }\n    else if (c == '\\r' && !is_binary())\n    {\n        //\n        // If this is a text file, turn CRLF into LF.\n        // Leave all other sequences containing CR alone.\n        //\n        c = getc(fp);\n        if (c == EOF)\n        {\n            if (ferror(fp))\n                fatal_error_errno(\"read\");\n            c = '\\r';\n        }\n        else if (c != '\\n')\n        {\n            ungetc(c, fp);\n            c = '\\r';\n        }\n    }\n    if (is_binary() && c >= 0)\n        ++line_number;\n    prev_was_newline = (!is_binary() && c == '\\n');\n    return c;\n}\n\n\nvoid\nsrecord::input_file::get_char_undo(int c)\n{\n    if (c >= 0)\n    {\n        FILE *fp = (FILE *)get_fp();\n        prev_was_newline = false;\n        if (is_binary())\n            --line_number;\n        ungetc(c, fp);\n    }\n}\n\n\nint\nsrecord::input_file::peek_char(void)\n{\n    FILE *fp = (FILE *)get_fp();\n    int c = getc(fp);\n    if (c == EOF)\n    {\n        if (ferror(fp))\n            fatal_error_errno(\"read\");\n        c = -1;\n    }\n    else\n        ungetc(c, fp);\n    return c;\n}\n\n\nint\nsrecord::input_file::get_nibble_value(int c)\n{\n    switch (c)\n    {\n    case '0': case '1': case '2': case '3': case '4':\n    case '5': case '6': case '7': case '8': case '9':\n        return (c - '0');\n\n    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        return (c - 'a' + 10);\n\n    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n        return (c - 'A' + 10);\n    }\n    return -1;\n}\n\n\nint\nsrecord::input_file::get_nibble(void)\n{\n    int c = get_char();\n    int n = get_nibble_value(c);\n    if (n < 0)\n        fatal_error(\"hexadecimal digit expected\");\n    return n;\n}\n\n\nint\nsrecord::input_file::get_byte(void)\n{\n    int c1 = get_nibble();\n    int c2 = get_nibble();\n    int n = ((c1 << 4) | c2);\n    checksum_add(n);\n    return n;\n}\n\n\nunsigned\nsrecord::input_file::get_word_be(void)\n{\n    int b1 = get_byte();\n    int b2 = get_byte();\n    return ((b1 << 8) | b2);\n}\n\n\nunsigned\nsrecord::input_file::get_word_le(void)\n{\n    int b1 = get_byte();\n    int b2 = get_byte();\n    return (b1 | (b2 << 8));\n}\n\n\nunsigned long\nsrecord::input_file::get_3bytes_be(void)\n{\n    unsigned long b1 = get_byte();\n    unsigned long b2 = get_byte();\n    unsigned long b3 = get_byte();\n    return ((((b1 << 8) | b2) << 8) | b3);\n}\n\n\nunsigned long\nsrecord::input_file::get_3bytes_le(void)\n{\n    unsigned long b1 = get_byte();\n    unsigned long b2 = get_byte();\n    unsigned long b3 = get_byte();\n    return ((((b3 << 8) | b2) << 8) | b1);\n}\n\n\nunsigned long\nsrecord::input_file::get_4bytes_be(void)\n{\n    unsigned long b1 = get_byte();\n    unsigned long b2 = get_byte();\n    unsigned long b3 = get_byte();\n    unsigned long b4 = get_byte();\n    return ((((((b1 << 8) | b2) << 8) | b3) << 8) | b4);\n}\n\n\nunsigned long\nsrecord::input_file::get_4bytes_le(void)\n{\n    unsigned long b1 = get_byte();\n    unsigned long b2 = get_byte();\n    unsigned long b3 = get_byte();\n    unsigned long b4 = get_byte();\n    return ((((((b4 << 8) | b3) << 8) | b2) << 8) | b1);\n}\n\n\nint\nsrecord::input_file::checksum_get(void)\n    const\n{\n    return (checksum & 0xFF);\n}\n\n\nint\nsrecord::input_file::checksum_get16(void)\n    const\n{\n    return (checksum & 0xFFFF);\n}\n\n\nvoid\nsrecord::input_file::checksum_reset(void)\n{\n    checksum = 0;\n}\n\n\nvoid\nsrecord::input_file::checksum_add(unsigned char n)\n{\n    checksum += n;\n}\n\n\nvoid\nsrecord::input_file::seek_to_end(void)\n{\n    FILE *fp = (FILE *)get_fp();\n    fseek(fp, 0L, SEEK_END);\n}\n\n\nvoid\nsrecord::input_file::disable_checksum_validation(void)\n{\n    ignore_checksums = true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/file.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2008, 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILE_H\n#define SRECORD_INPUT_FILE_H\n\n#include <string>\n\n#include <srecord/input.h>\n\nnamespace srecord {\n\nclass arglex; // forward\n\n/**\n  * The srecord::input_file class is used to represent an generic input\n  * file. It provides many helper methods common to most file input\n  * classes.\n  */\nclass input_file:\n    public input\n{\npublic:\n    typedef boost::shared_ptr<input_file> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~input_file();\n\n    /**\n      * The guess class method is used to open a file of an unknown\n      * type.  It attempts all of the know formats one after the other.\n      *\n      * @param file_name\n      *     The name of the file to be opened.\n      * @param cmdln\n      *     The command line for context\n      */\n    static pointer guess(const std::string &file_name, arglex &cmdln);\n\n    /**\n      * The ignore_all_checksums method is used to set the global\n      * ignore checksums flag.  This is usually the result of an\n      * --ignore-checksums command line option.\n      */\n    static void ignore_all_checksums(void) { ignore_checksums_default = true; }\n\n    /**\n      * The format_option_number method is used to obtain the option number,\n      * which can then be turned into text via the arglex::token_name method.\n      */\n    virtual int format_option_number(void) const = 0;\n\nprotected:\n    // See base class for documentation.\n    virtual std::string filename(void) const;\n\n    // See base class for documentation.\n    virtual std::string filename_and_line(void) const;\n\n    // See base class for documentation.\n    void disable_checksum_validation(void);\n\nprotected:\n    /**\n      * The constructor.  The input will be taken from the named file\n      * (or the standard input if the filename is \"-\").\n      *\n      * Only derived classes may use this constructor.\n      *\n      * @param file_name\n      *     The name of the file to be read.\n      */\n    input_file(const std::string &file_name);\n\n    /**\n      * The get_char method is used to fetch a character from\n      * the input.  Usually, this is sufficient, however derived\n      * classes may over-ride it if they have a special case.\n      * Over-ride with caution, as it affects many other methods.\n      *\n      * The line_number instance variable is maintained, so that the\n      * filename_and_line method may report the current file location.\n      * This makes for more informative error messages.\n      */\n    virtual int get_char(void);\n\n    /**\n      * The get_char_undo method is used to return a character to\n      * the input.  (a later get_char or peak_char method will see\n      * it again).  Only one character may be pushed back.\n      */\n    virtual void get_char_undo(int);\n\n    /**\n      * The peek_char method is used to look at the next character\n      * of input, without actually consuming it (a later get_char\n      * or peak_char method will still see it).\n      */\n    int peek_char(void);\n\n    /**\n      * The get_nibble_value class method is used to translate a\n      * character into its hexadecimal value.\n      *\n      * @param c\n      *     The character to translate\n      * @returns\n      *     int; 0..9 for '0'..'9', 10..15 for 'a'..'f',\n      *     10..15 for 'A-Z', and -1 for everything else.\n      */\n    static int get_nibble_value(int c);\n\n    /**\n      * The get_nibble method is used to fetch one hexadecimal digit\n      * from the input, via the get_char method.  It is not case\n      * sensitive.  It returns a value for 0 to 15.  Characters which\n      * are not hexadecimal digits will result in a fatal error,\n      * and the method call will not return.\n      */\n    virtual int get_nibble(void);\n\n    /**\n      * The get_byte method is used to fetch a byte value from the\n      * input.  The default implementation is to call the get_nibble\n      * method twice, and assemble them big-endian (most significant\n      * nibble first).\n      *\n      * The value of the byte will be added to the running checksum,\n      * via the checksum_add method.\n      *\n      * Usually, this get_byte method implementation is sufficient for\n      * most input classes, however derived classes may over-ride\n      * it if they have a special case.  Over-ride with caution,\n      * as it affects many other methods.\n      */\n    virtual int get_byte(void);\n\n    /**\n      * The get_word_be method is used to fetch a 16-bit value from the\n      * input.  The get_byte method is called twice, and the two byte\n      * values are assembled big-endian (most significant byte first).\n      */\n    unsigned get_word_be(void);\n\n    /**\n      * The get_word_le method is used to fetch a 16-bit value from\n      * the input.  The get_byte method is called twice, and the two\n      * byte values are assembled little-endian (least significant byte\n      * first).\n      */\n    unsigned get_word_le(void);\n\n    /**\n      * The get_3bytes_be method is used to fetch a 24-bit value from\n      * the input.  The get_byte method is called three times,\n      * and the three byte values are assembles big-endian (most\n      * significant byte first).\n      */\n    unsigned long get_3bytes_be(void);\n\n    /**\n      * The get_3bytes_le method is used to fetch a 24-bit value from\n      * the input.  The get_byte method is called three times, and the\n      * three byte values are assembled little-endian (least significant\n      * byte first).\n      */\n    unsigned long get_3bytes_le(void);\n\n    /**\n      * The get_4bytes_be method is used to fetch a 32-bit value from\n      * the input.  The get_byte method is called four times,\n      * and the four byte values are assembled big-endian (most\n      * significant byte first).\n      */\n    unsigned long get_4bytes_be(void);\n\n    /**\n      * The get_4bytes_le method is used to fetch a 32-bit value from\n      * the input.  The get_byte method is called four times, and the\n      * four byte values are assembled little-endian (least significant\n      * byte first).\n      */\n    unsigned long get_4bytes_le(void);\n\n    /**\n      * The checksum_get method is used to get the current value of\n      * the running checksum (added to by the checksum_add method,\n      * usually called by the get_byte method).  Only the lower 8\n      * bits of the sum are returned.\n      */\n    int checksum_get(void) const;\n\n    /**\n      * The checksum_get16 method is used to get the current value of\n      * the running checksum (added to by the checksum_add method,\n      * usually called by the get_byte method).  Only the lower 16\n      * bits of the sum are returned.\n      */\n    int checksum_get16(void) const;\n\n    /**\n      * The checksum_add method is used to add another 8-bit value\n      * to the running checksum.\n      */\n    virtual void checksum_add(unsigned char n);\n\n    /**\n      * The checksum_rest method is used to set the running checksum\n      * to zero.\n      */\n    void checksum_reset(void);\n\n    /**\n      * The seek_to_end method is used to move the input position\n      * to the end of the file.\n      */\n    void seek_to_end(void);\n\n    /**\n      * The is_binary method is used to to determine whether or not\n      * a file format is binary (true) of text (false).  The default\n      * implementation always returns false (text).\n      */\n    virtual bool is_binary(void) const;\n\nprivate:\n    /**\n      * The file_name instance variable is used by the filename\n      * and filename_and_line methods to report the name of the\n      * input file.  This makes for informative error messages.\n      */\n    std::string file_name;\n\n    /**\n      * The line_number instance variable is used by the get_char\n      * method to remember the current line number.  It us used by the\n      * filename_and_line method to report the current file location.\n      */\n    int line_number;\n\n    /**\n      * The prev_was_newline instance variable is used by the\n      * get_char method to know when to increment the line number.\n      * It is not done when a newline is seen, but rather on reading\n      * the first character after a newline.  In this way, the error\n      * messages refer to the correct line, when if (when) it was\n      * the the error message must be issued only when the whole\n      * line has bean read in, including the newline.  error message.\n      */\n    bool prev_was_newline;\n\n    /**\n      * The vfp instance variable is used by the get_fp method to\n      * remember the file pointer.  You need to cast it to FILE* before\n      * you use it.  Never access this instance variable directly,\n      * always go via the get_fp method.  This ensures the file has\n      * been opened first!\n      */\n    void *vfp;\n\nprotected:\n    /**\n      * The checksum instance variable is used record the running\n      * checksum.  NEVER access this variable directly.  Always use\n      * the #checksum_reset method to set it mack to its initial state.\n      * Always use the checksum_add method to add a byte to it.\n      * Always use the #checksum_get or #checksum_get16 methods to\n      * read its value.\n      */\n    int checksum;\n\n    /**\n      * The use_checksums method is used to determine whether or not to\n      * validate checksums when data is read.\n      *\n      * @returns\n      *     bool; true if need to check checksums, false to ignore checksums.\n      */\n    bool use_checksums(void) const { return !ignore_checksums; }\n\nprivate:\n    /**\n      * The ignore_checksums instance variable is used to remember\n      * whether or not checksums should be ignored (true) or validated\n      * (false).\n      */\n    bool ignore_checksums;\n\n    /**\n      * The ignore_checksums_default class variable is used to remember\n      * the default checksum validation.  Defaults to false.\n      */\n    static bool ignore_checksums_default;\n\n    /**\n      * The get_fp method is used to get the stdio file pointer\n      * associated with this input file.  (By avoiding a FILE*\n      * declaration, we avoid having to include <stdio.h> for no\n      * particularly good reason.  Take care when casting.)\n      *\n      * If the file has not been opened yet, it will be opened by\n      * this method.\n      */\n    void *get_fp(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_file();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_file(const input_file &);\n\n    /**\n      * the assignment operator.  Do not use.\n      */\n    input_file &operator=(const input_file &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/and.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/and.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_and::~input_filter_and()\n{\n}\n\n\nsrecord::input_filter_and::input_filter_and(const input::pointer &a1,\n        int a2) :\n    input_filter(a1),\n    value(a2)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_and::create(const input::pointer &a_deeper, int a_mask)\n{\n    return pointer(new input_filter_and(a_deeper, a_mask));\n}\n\n\nbool\nsrecord::input_filter_and::read(record &result)\n{\n    if (!input_filter::read(result))\n        return false;\n    if (result.get_type() == record::type_data)\n    {\n        for (size_t j = 0; j < result.get_length(); ++j)\n            result.set_data(j, result.get_data(j) & value);\n    }\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/and.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_AND_H\n#define SRECORD_INPUT_FILTER_AND_H\n\n#include <srecord/input/filter.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_and clas sis used to represent the input state\n  * of a filter which bit-wise ANDs all incoming data bytes with a fixed\n  * value.\n  */\nclass input_filter_and:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_and();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input to be used as a data source.\n      * @param mask\n      *     The value to be bit-wise ANDed with each incoming data byte.\n      */\n    input_filter_and(const input::pointer &deeper, int mask);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param mask\n      *     The value to be bit-wise ANDed with each incoming data byte.\n      */\n    static pointer create(const input::pointer &deeper, int mask);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The value instance variable is used to remember the value to be\n      * bit-wise ANDed with each incoming data byte.\n      */\n    int value;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_and();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_and(const input_filter_and &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_and &operator=(const input_filter_and &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_AND_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/bitrev.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/bitrev.h>\n#include <srecord/input/filter/bitrev.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_bitrev::~input_filter_bitrev()\n{\n}\n\n\nsrecord::input_filter_bitrev::input_filter_bitrev(\n    const srecord::input::pointer &arg\n) :\n    srecord::input_filter(arg)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_bitrev::create(const srecord::input::pointer &a_deeper)\n{\n    return pointer(new srecord::input_filter_bitrev(a_deeper));\n}\n\n\nbool\nsrecord::input_filter_bitrev::read(srecord::record &record)\n{\n    if (!srecord::input_filter::read(record))\n        return false;\n    if (record.get_type() == srecord::record::type_data)\n    {\n        for (size_t j = 0; j < record.get_length(); ++j)\n            record.set_data(j, bitrev8(record.get_data(j)));\n    }\n    return true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/bitrev.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_BITREV_H\n#define SRECORD_INPUT_FILTER_BITREV_H\n\n#include <srecord/input/filter.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_bitrev clas sis used to represent the input state\n  * of a filter which reverses the order of bits in each data byte.\n  */\nclass input_filter_bitrev:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_bitrev();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input to be used as a data source.\n      */\n    input_filter_bitrev(const input::pointer &deeper);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      */\n    static pointer create(const input::pointer &deeper);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_bitrev();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_bitrev(const input_filter_bitrev &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_bitrev &operator=(const input_filter_bitrev &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_BITREV_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/byte_swap.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/byte_swap.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_byte_swap::~input_filter_byte_swap()\n{\n}\n\n\nsrecord::input_filter_byte_swap::input_filter_byte_swap(\n        const srecord::input::pointer &arg) :\n    srecord::input_filter(arg),\n    buffer(),\n    buffer_pos(0),\n    mask(1)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_byte_swap::create(const srecord::input::pointer &a_deeper)\n{\n    return pointer(new srecord::input_filter_byte_swap(a_deeper));\n}\n\n\nbool\nsrecord::input_filter_byte_swap::read(srecord::record &record)\n{\n    for (;;)\n    {\n        while\n        (\n            buffer.get_type() != srecord::record::type_data\n        ||\n            buffer_pos >= buffer.get_length()\n        )\n        {\n            if (!srecord::input_filter::read(buffer))\n                return false;\n            if (buffer.get_type() != srecord::record::type_data)\n            {\n                record = buffer;\n                record.set_address(record.get_address() ^ mask);\n                return true;\n            }\n            buffer_pos = 0;\n        }\n\n        unsigned long addr = (buffer.get_address() + buffer_pos) ^ mask;\n        unsigned char c = buffer.get_data(buffer_pos++);\n        record = srecord::record(srecord::record::type_data, addr, &c, 1);\n        return true;\n    }\n}\n\n\nvoid\nsrecord::input_filter_byte_swap::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->can_get_number())\n    {\n        int width = cmdln->get_number(\"width\");\n        switch (width)\n        {\n        case 2:\n        case 4:\n        case 8:\n            break;\n\n        case 16:\n            width = 2;\n            break;\n\n        case 32:\n            width = 4;\n            break;\n\n        case 64:\n            width = 8;\n            break;\n\n        case 128:\n            width = 16;\n            break;\n\n        case 256:\n            width = 32;\n            break;\n\n        default:\n            fatal_error(\"width %d not understood\", width);\n            // NOTREACHED\n        }\n        mask = width - 1;\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/byte_swap.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_BYTE_SWAP_H\n#define SRECORD_INPUT_FILTER_BYTE_SWAP_H\n\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_byte_swap class is used to reverse the\n  * even-addressed and odd-addressed bytes in an input source.\n  */\nclass input_filter_byte_swap:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_byte_swap();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data sourec to be byte-swapped.\n      */\n    input_filter_byte_swap(const input::pointer &deeper);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data sourec to be byte-swapped.\n      */\n    static pointer create(const input::pointer &deeper);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\nprivate:\n    /**\n      * The buffer instance variable is used to remember the data\n      * fetched from the deeper data source.\n      */\n    record buffer;\n\n    /**\n      * The buffer_pos instance variable is used to remeber the byte\n      * position within the buffer instance variable.\n      */\n    size_t buffer_pos;\n\n    /**\n      * The mask instance variable is used to remember the bit mask to\n      * be xor-ed with the address to form the byte-swapped address.\n      * It defaults to 1, but can be altered by command line option.\n      */\n    record::address_t mask;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_byte_swap();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_byte_swap(const input_filter_byte_swap &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_byte_swap &operator=(const input_filter_byte_swap &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_BYTE_SWAP_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum/bitnot.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/input/filter/checksum/bitnot.h>\n\n\nsrecord::input_filter_checksum_bitnot::~input_filter_checksum_bitnot()\n{\n}\n\n\nsrecord::input_filter_checksum_bitnot::input_filter_checksum_bitnot(\n        input::pointer a1, int a2, int a3, endian_t a_end, int a5) :\n    input_filter_checksum(a1, a2, a3, a_end, a5)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_checksum_bitnot::create(const input::pointer &a_deeper,\n    int a2, int a3, endian_t a_end, int a5)\n{\n    return\n        pointer\n        (\n            new input_filter_checksum_bitnot(a_deeper, a2, a3, a_end, a5)\n        );\n}\n\n\nsrecord::input_filter_checksum::sum_t\nsrecord::input_filter_checksum_bitnot::calculate()\n{\n    return ~sum;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum/bitnot.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_CHECKSUM_BITNOT_H\n#define SRECORD_INPUT_FILTER_CHECKSUM_BITNOT_H\n\n#include <srecord/input/filter/checksum.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_checksum_bitnot class is used to represent the\n  * state of a checksum filter that inserts a bitnot sum into the data.\n  */\nclass input_filter_checksum_bitnot:\n    public input_filter_checksum\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_checksum_bitnot();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input source being checksummed.\n      * @param address\n      *     The address to place the checksum.\n      * @param length\n      *     The number of bytes of checksum to be placed into the result.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The width of the values being summed.  Usually 1 byte, but\n      *     wider combinations are possible.  If you use something\n      *     wider, it is assumed that they are alligned on multiples of\n      *     that width, no provision for an offset is provided.\n      */\n    input_filter_checksum_bitnot(input::pointer deeper, int address,\n        int length, endian_t end, int width = 1);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     The address to place the checksum.\n      * @param length\n      *     The number of bytes of checksum to be placed into the result.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The width of the values being summed.  Usually 1 byte, but\n      *     wider combinations are possible.  If you use something\n      *     wider, it is assumed that they are alligned on multiples of\n      *     that width, no provision for an offset is provided.\n      */\n    static pointer create(const input::pointer &deeper, int address,\n        int length, endian_t end, int width = 1);\n\nprotected:\n    // See base class for documentation.\n    sum_t calculate();\n\nprivate:\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_checksum_bitnot();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_checksum_bitnot(const input_filter_checksum_bitnot &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_checksum_bitnot &operator=(\n            const input_filter_checksum_bitnot &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_CHECKSUM_BITNOT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum/negative.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/checksum/negative.h>\n\n\nsrecord::input_filter_checksum_negative::~input_filter_checksum_negative()\n{\n}\n\n\nsrecord::input_filter_checksum_negative::input_filter_checksum_negative(\n        const input::pointer &a1, int a2, int a3, endian_t a_end, int a5) :\n    input_filter_checksum(a1, a2, a3, a_end, a5)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_checksum_negative::create(const input::pointer &a_deeper,\n    int a2, int a3, endian_t a_end, int a5)\n{\n    return\n        pointer\n        (\n            new input_filter_checksum_negative(a_deeper, a2, a3, a_end, a5)\n        );\n}\n\n\nsrecord::input_filter_checksum::sum_t\nsrecord::input_filter_checksum_negative::calculate()\n{\n    return -sum;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum/negative.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_CHECKSUM_NEGATIVE_H\n#define SRECORD_INPUT_FILTER_CHECKSUM_NEGATIVE_H\n\n#include <srecord/input/filter/checksum.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_checksum_negative class is used to represent the\n  * state of a checksum filter that inserts a negative sum into the data.\n  */\nclass input_filter_checksum_negative:\n    public input_filter_checksum\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_checksum_negative();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input source being checksummed.\n      * @param address\n      *     The address to place the checksum.\n      * @param length\n      *     The number of bytes of checksum to be placed into the result.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The width of the values being summed.  Usually 1 byte, but\n      *     wider combinations are possible.  If you use something\n      *     wider, it is assumed that they are alligned on multiples of\n      *     that width, no provision for an offset is provided.\n      */\n    input_filter_checksum_negative(const input::pointer &deeper,\n        int address, int length, endian_t end, int width = 1);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     The address to place the checksum.\n      * @param length\n      *     The number of bytes of checksum to be placed into the result.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The width of the values being summed.  Usually 1 byte, but\n      *     wider combinations are possible.  If you use something\n      *     wider, it is assumed that they are alligned on multiples of\n      *     that width, no provision for an offset is provided.\n      */\n    static pointer create(const input::pointer &deeper, int address, int length,\n        endian_t end, int width = 1);\n\nprotected:\n    // See base class for document.\n    sum_t calculate();\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_checksum_negative();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_checksum_negative(const input_filter_checksum_negative &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_checksum_negative &operator=(\n        const input_filter_checksum_negative &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_CHECKSUM_NEGATIVE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum/positive.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/checksum/positive.h>\n\n\nsrecord::input_filter_checksum_positive::~input_filter_checksum_positive()\n{\n}\n\n\nsrecord::input_filter_checksum_positive::input_filter_checksum_positive(\n        const input::pointer &a1, int a2, int a3, endian_t a_end, int a5) :\n    input_filter_checksum(a1, a2, a3, a_end, a5)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_checksum_positive::create(const input::pointer &a_deeper,\n    int a2, int a3, endian_t a_end, int a5)\n{\n    return\n        pointer\n        (\n            new input_filter_checksum_positive(a_deeper, a2, a3, a_end, a5)\n        );\n}\n\n\nsrecord::input_filter_checksum::sum_t\nsrecord::input_filter_checksum_positive::calculate()\n{\n    return sum;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum/positive.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_CHECKSUM_POSITIVE_H\n#define SRECORD_INPUT_FILTER_CHECKSUM_POSITIVE_H\n\n#include <srecord/input/filter/checksum.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_checksum_positive class is used to represent the\n  * state of a checksum filter that inserts a positive sum into the data.\n  */\nclass input_filter_checksum_positive:\n    public input_filter_checksum\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_checksum_positive();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input source being checksummed.\n      * @param address\n      *     The address to place the checksum.\n      * @param length\n      *     The number of bytes of checksum to be placed into the result.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The width of the values being summed.  Usually 1 byte, but\n      *     wider combinations are possible.  If you use something\n      *     wider, it is assumed that they are alligned on multiples of\n      *     that width, no provision for an offset is provided.\n      */\n    input_filter_checksum_positive(const input::pointer &deeper, int address,\n        int length, endian_t end, int width = 1);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     The address to place the checksum.\n      * @param length\n      *     The number of bytes of checksum to be placed into the result.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The width of the values being summed.  Usually 1 byte, but\n      *     wider combinations are possible.  If you use something\n      *     wider, it is assumed that they are alligned on multiples of\n      *     that width, no provision for an offset is provided.\n      */\n    static pointer create(const input::pointer &deeper, int address, int length,\n        endian_t end, int width = 1);\n\nprotected:\n    // See base class for documentation.\n    sum_t calculate();\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_checksum_positive();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_checksum_positive(const input_filter_checksum_positive &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_checksum_positive &operator=(\n        const input_filter_checksum_positive &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_CHECKSUM_POSITIVE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2010, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n#include <srecord/input/filter/checksum.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_checksum::input_filter_checksum(\n    input::pointer a_input_filter,\n    int a_checksum_address,\n    int a_length,\n    endian_t a_end,\n    int a_width\n) :\n    input_filter(a_input_filter),\n    checksum_address(a_checksum_address),\n    length(a_length),\n    end(a_end),\n    sum(0),\n    width(a_width)\n{\n    if (length < 0)\n        length = 0;\n    else if (length > (int)sizeof(sum_t))\n        length = sizeof(sum_t);\n    if (width < 1)\n        width = 1;\n    else if (width > length)\n        width = length;\n}\n\n\nsrecord::input_filter_checksum::~input_filter_checksum()\n{\n}\n\n\nbool\nsrecord::input_filter_checksum::generate(record &result)\n{\n    if (length <= 0)\n        return false;\n    unsigned char chunk[sizeof(sum_t)];\n    sum_t value = calculate();\n    record::encode(chunk, value, length, end);\n    result = record(record::type_data, checksum_address, chunk, length);\n    length = 0;\n    return true;\n}\n\n\nbool\nsrecord::input_filter_checksum::read(record &record)\n{\n    if (!input_filter::read(record))\n        return generate(record);\n    if (record.get_type() == record::type_data)\n    {\n        if (width <= 1)\n        {\n            for (size_t j = 0; j < record.get_length(); ++j)\n            {\n                sum += record.get_data(j);\n            }\n        }\n        else if (end == endian_little)\n        {\n            // Little endian\n            for (size_t j = 0; j < record.get_length(); ++j)\n            {\n                sum += (sum_t)record.get_data(j) << (8 *\n                    ((record.get_address() + j) % width));\n            }\n        }\n        else\n        {\n            // Big endian\n            for (size_t j = 0; j < record.get_length(); ++j)\n            {\n                sum += (sum_t)record.get_data(j) << (8 *\n                    (width - 1 - ((record.get_address() + j)\n                    % width)));\n            }\n        }\n    }\n    return true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/checksum.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_CHECKSUM_H\n#define SRECORD_INPUT_FILTER_CHECKSUM_H\n\n\n#include <srecord/endian.h>\n#include <srecord/interval.h>\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_checksum class is an abstraction of various\n  * checksums to be ammplied to input sources.\n  */\nclass input_filter_checksum:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_checksum();\n\nprotected:\n    // See bas class for documentation.\n    bool read(record &record);\n\n    /**\n      * The constructor.\n      * May only be called by derived classes.\n      *\n      * @param deeper\n      *     The deeper input source being checksummed.\n      * @param address\n      *     The address to place the checksum.\n      * @param length\n      *     The number of bytes of checksum to be placed into the result.\n      * @param end\n      *     The byte order\n      * @param width\n      *     The width of the values being summed.  Usually 1 byte, but\n      *     wider combinations are possible.  If you use something\n      *     wider, it is assumed that they are alligned on multiples of\n      *     that width, no provision for an offset is provided.\n      */\n    input_filter_checksum(input::pointer deeper, int address,\n        int length, endian_t end, int width = 1);\n\n    typedef unsigned long sum_t;\n\n    /**\n      * The checksum_address instance variable is used to remember where\n      * to place the checksum at the end of the data.\n      */\n    int checksum_address;\n\n    /**\n      * The length instance variable is used to remember how many bytes\n      * of checksum are to be emitted.\n      */\n    int length;\n\n    /**\n      * The end instance variable is used to remember whether the\n      * summation for the checksum is bigendian or little endian.\n      */\n    endian_t end;\n\n    /**\n      * The sum instance variable is used to remember the running\n      * checksum of the incoming data source.\n      */\n    sum_t sum;\n\n    /**\n      * The width instance variable is used to remember the swathe width\n      * as the incoming bytes are added to the running sum.\n      * That is, now many bytes wide.\n      */\n    int width;\n\n    /**\n      * The calculate method is used to calculate the checksum to be\n      * written into the output, based on the \"sum\" instance variable.\n      */\n    virtual sum_t calculate(void) = 0;\n\n    /**\n      * The generate method is used to generate the final data record,\n      * once all of the deeper input has been passed through, based on\n      * the calculated checksum.\n      *\n      * @param record\n      *     Where to place the returned data.\n      * @returns\n      *     bool; false if end-of-file, true if data available\n      */\n    bool generate(record &record);\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_checksum();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_checksum(const input_filter_checksum &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_checksum &operator=(const input_filter_checksum &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_CHECKSUM_H\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/crop.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n#include <srecord/input/filter/crop.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_crop::~input_filter_crop()\n{\n}\n\n\nsrecord::input_filter_crop::input_filter_crop(\n        const srecord::input::pointer &a_deeper, const interval &a_range) :\n    srecord::input_filter(a_deeper),\n    range(a_range),\n    data(),\n    data_range()\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_crop::create(const srecord::input::pointer &a_deeper,\n    const interval &a_range)\n{\n    return pointer(new srecord::input_filter_crop(a_deeper, a_range));\n}\n\n\nbool\nsrecord::input_filter_crop::read(srecord::record &record)\n{\n    for (;;)\n    {\n        //\n        // If we are not holding any current data,\n        // fetch another record from out input.\n        //\n        if (data_range.empty())\n        {\n            //\n            // If the input is exhausted, we are done.\n            //\n            if (!srecord::input_filter::read(data))\n            {\n                return false;\n            }\n            switch (data.get_type())\n            {\n            default:\n                //\n                // If the input is of a type we don't\n                // care about, pass it through.\n                //\n                record = data;\n                return true;\n\n            case srecord::record::type_data:\n                //\n                // Data records are remembered, and\n                // doled out peicmeal, as they mask\n                // against the clip region.\n                //\n                data_range =\n                    interval\n                    (\n                        data.get_address(),\n                        data.get_address() + data.get_length()\n                    );\n                break;\n\n            case srecord::record::type_execution_start_address:\n                //\n                // Discard execution start address records which do not\n                // fall into the clip region.\n                //\n                if (!range.member(data.get_address()))\n                    continue;\n                record = data;\n                return true;\n            }\n        }\n\n        //\n        // Intersect the data left unprocessed in this record\n        // with the clip region.  There could be more than one\n        // region, but we only want the first one.  We will make\n        // another pass if there is more than one.\n        //\n        interval fragment = range * data_range;\n        if (fragment.empty())\n        {\n            data_range = interval();\n            continue;\n        }\n        fragment.first_interval_only();\n\n        //\n        // Construct the return record from the data held.\n        //\n        unsigned long lo = fragment.get_lowest();\n        unsigned long hi = fragment.get_highest();\n        record =\n            srecord::record\n            (\n                srecord::record::type_data,\n                lo,\n                data.get_data() + lo - data.get_address(),\n                hi - lo\n            );\n\n        //\n        // Subtract this segment from the data held.  If there\n        // is anything left, another pass will construct another\n        // data record for it.\n        //\n        data_range -= fragment;\n\n        //\n        // Success\n        //\n        return true;\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/crop.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_CROP_H\n#define SRECORD_INPUT_FILTER_CROP_H\n\n#include <srecord/interval.h>\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_crop filter is used to crop the data by\n  * selecting portions of the address range to be passed through.\n  */\nclass input_filter_crop:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_crop();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be cropped.\n      * @param range\n      *     The address range to be preserved.  The rest will be\n      *     ignored.\n      */\n    input_filter_crop(const input::pointer &deeper, const interval &range);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param range\n      *     The address range to be preserved.  The rest will be\n      *     ignored.\n      */\n    static pointer create(const input::pointer &deeper, const interval &range);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The range instance variable is used to remember the address\n      * range to be preserved.\n      */\n    interval range;\n\n    /**\n      * The dat instance variable is used to remember the current input\n      * data record being filtered.\n      */\n    record data;\n\n    /**\n      * The data_range instance variable is used to remember the address\n      * range in the incoming data.\n      */\n    interval data_range;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_crop();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_crop(const input_filter_crop &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_crop &operator=(const input_filter_crop &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_CROP_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/fill.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2004, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/interval.h>\n#include <srecord/input/filter/fill.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_fill::~input_filter_fill()\n{\n    delete [] filler_block;\n}\n\n\nsrecord::input_filter_fill::input_filter_fill(const input::pointer &a1,\n        int a2, const interval &a3) :\n    input_filter(a1),\n    filler_value(a2),\n    filler_block(0),\n    range(a3)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_fill::create(const input::pointer &a_deeper,\n    int a_value, const interval &a_range)\n{\n    return pointer(new input_filter_fill(a_deeper, a_value, a_range));\n}\n\n\nbool\nsrecord::input_filter_fill::generate(record &result)\n{\n    if (range.empty())\n        return false;\n    interval::data_t lo = range.get_lowest();\n    size_t rec_len = record::maximum_data_length(lo);\n    interval::data_t hi = lo + rec_len;\n    interval chunk(lo, hi);\n    chunk *= range;\n    chunk.first_interval_only();\n    size_t fill_block_size = 256;\n    if (!filler_block)\n    {\n        filler_block = new unsigned char [fill_block_size];\n        memset(filler_block, filler_value, fill_block_size);\n    }\n    rec_len = chunk.get_highest() - chunk.get_lowest();\n    assert(rec_len <= fill_block_size);\n    result = record(record::type_data, lo, filler_block, rec_len);\n    range -= chunk;\n    return true;\n}\n\n\nbool\nsrecord::input_filter_fill::read(record &result)\n{\n    if (!input_filter::read(result))\n        return generate(result);\n    if (result.get_type() == record::type_data)\n    {\n        range -=\n            interval\n            (\n                result.get_address(),\n                result.get_address() + result.get_length()\n            );\n    }\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/fill.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2004, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_FILL_H\n#define SRECORD_INPUT_FILTER_FILL_H\n\n#include <srecord/interval.h>\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_fill class is used to represent a filter\n  * which replaces in set data locations with constant data.\n  */\nclass input_filter_fill:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_fill();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param value\n      *     The byte value to fill with.\n      * @param range\n      *     The address range to be filled.\n      */\n    input_filter_fill(const input::pointer &deeper, int value,\n        const interval &range);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param value\n      *     The byte value to fill with.\n      * @param range\n      *     The address range to be filled.\n      */\n    static pointer create(const input::pointer &deeper, int value,\n        const interval &range);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The filler_value instance variable is used to remember the value\n      * to assign to fill bytes.\n      */\n    int filler_value;\n\n    /**\n      * The filler_block instance variable is used to remember the base\n      * of a dynamically allocated array of bytes, used to construct\n      * filler block records.\n      */\n    unsigned char *filler_block;\n\n    /**\n      * The range instance variable is used to remember the range of\n      * addresses to be filled.  As fill blocks are produced the range\n      * is reduced.\n      */\n    interval range;\n\n    /**\n      * The generate method is used to genetate fill records.\n      */\n    bool generate(record &record);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_fill();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_fill(const input_filter_fill &);\n\n    /**\n      * The assignment.  Do not use.\n      */\n    input_filter_fill &operator=(const input_filter_fill &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_FILL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval/length.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/interval/length.h>\n\n\nsrecord::input_filter_interval_length::~input_filter_interval_length()\n{\n}\n\n\nsrecord::input_filter_interval_length::input_filter_interval_length(\n        const pointer &a_deeper, long a_address, int a_length, endian_t a_end,\n        int a_width, bool inclusive) :\n    input_filter_interval(a_deeper, a_address, a_length, a_end, inclusive),\n    width(a_width < 1 ? 1 : a_width)\n{\n\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_interval_length::create(const pointer &a_deeper,\n    long a_address, int a_length, endian_t a_end, int a_width, bool inclusive)\n{\n    return\n        pointer\n        (\n            new input_filter_interval_length\n            (\n                a_deeper,\n                a_address,\n                a_length,\n                a_end,\n                a_width,\n                inclusive\n            )\n        );\n}\n\n\nlong\nsrecord::input_filter_interval_length::calculate_result()\n    const\n{\n    const interval &r = get_range();\n    return ((r.get_highest() - r.get_lowest()) / width);\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval/length.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_INTERVAL_LENGTH_H\n#define SRECORD_INPUT_FILTER_INTERVAL_LENGTH_H\n\n#include <srecord/input/filter/interval.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_interval_length class is used to represent a\n  * filter which injects the maximum minus minimum addresses of the data\n  * into the data.\n  */\nclass input_filter_interval_length:\n    public input_filter_interval\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_interval_length();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      * @param address\n      *     The address at which to place the length.\n      * @param length\n      *     The number of bytes of length to be inserted.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The number of bytes per unit of length.\n      * @param inclusive\n      *     true if the output location is included in the address\n      *     range, false if not\n      */\n    input_filter_interval_length(const input::pointer &deeper,\n        long address, int length, endian_t end, int width, bool inclusive);\n\npublic:\n    /**\n      * The create class method is used to create a new dynamically\n      * allocated instance of this class.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      * @param address\n      *     The address at which to place the length.\n      * @param length\n      *     The number of bytes of length to be inserted.\n      * @param end\n      *     The byte order.\n      * @param width\n      *     The number of bytes per unit of length.\n      * @param inclusive\n      *     true if the output location is included in the address\n      *     range, false if not\n      */\n    static pointer create(const input::pointer &deeper, long address,\n        int length, endian_t end, int width, bool inclusive);\n\nprotected:\n    // See base class for documentation.\n    long calculate_result() const;\n\nprivate:\n    /**\n      * The number of bytes per unit of length.\n      */\n    int width;\n\n    /**\n      * The default constructor.\n      */\n    input_filter_interval_length();\n\n    /**\n      * The copy constructor.\n      */\n    input_filter_interval_length(const input_filter_interval_length &);\n\n    /**\n      * The assignment operator.\n      */\n    input_filter_interval_length &operator=(\n        const input_filter_interval_length &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_INTERVAL_LENGTH_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval/maximum.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/interval/maximum.h>\n\n\nsrecord::input_filter_interval_maximum::~input_filter_interval_maximum()\n{\n}\n\n\nsrecord::input_filter_interval_maximum::input_filter_interval_maximum(\n        const pointer &a_deeper, long a_address, int a_length, endian_t a_end,\n        bool inclusive) :\n    input_filter_interval(a_deeper, a_address, a_length, a_end, inclusive)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_interval_maximum::create(const pointer &a_deeper,\n    long a_address, int a_length, endian_t a_end, bool inclusive)\n{\n    return\n        pointer\n        (\n            new input_filter_interval_maximum\n            (\n                a_deeper,\n                a_address,\n                a_length,\n                a_end,\n                inclusive\n            )\n        );\n}\n\n\nlong\nsrecord::input_filter_interval_maximum::calculate_result()\n    const\n{\n    return get_range().get_highest();\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval/maximum.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_INTERVAL_MAXIMUM_H\n#define SRECORD_INPUT_FILTER_INTERVAL_MAXIMUM_H\n\n#include <srecord/input/filter/interval.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_interval_maximum class is used to represent a\n  * filter which injects the maximum address (last used address + 1) of\n  * the data into the data.\n  */\nclass input_filter_interval_maximum:\n    public input_filter_interval\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_interval_maximum();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      * @param address\n      *     The address at which to place the maximum address.\n      * @param length\n      *     The number of bytes of the maximum address to be inserted.\n      * @param end\n      *     The byte order.\n      * @param inclusive\n      *     true if the output location is included in the address\n      *     range, false if not\n      */\n    input_filter_interval_maximum(const input::pointer &deeper, long address,\n        int length, endian_t end, bool inclusive);\n\npublic:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      * @param address\n      *     The address at which to place the maximum address.\n      * @param length\n      *     The number of bytes of the maximum address to be inserted.\n      * @param end\n      *     The byte order.\n      * @param inclusive\n      *     true if the output location is included in the address\n      *     range, false if not\n      */\n    static pointer create(const input::pointer &deeper, long address,\n        int length, endian_t end, bool inclusive);\n\nprotected:\n    // See base class for documentation.\n    long calculate_result() const;\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_interval_maximum();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_interval_maximum(const input_filter_interval_maximum &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_interval_maximum &operator=(\n        const input_filter_interval_maximum &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_INTERVAL_MAXIMUM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval/minimum.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/interval/minimum.h>\n\n\nsrecord::input_filter_interval_minimum::~input_filter_interval_minimum()\n{\n}\n\n\nsrecord::input_filter_interval_minimum::input_filter_interval_minimum(\n        const pointer &a_deeper, long a_address, int a_length, endian_t a_end,\n        bool inclusive) :\n    input_filter_interval(a_deeper, a_address, a_length, a_end, inclusive)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_interval_minimum::create(const pointer &a_deeper,\n    long a_address, int a_length, endian_t a_end, bool inclusive)\n{\n    return\n        pointer\n        (\n            new input_filter_interval_minimum\n            (\n                a_deeper,\n                a_address,\n                a_length,\n                a_end,\n                inclusive\n            )\n        );\n}\n\n\nlong\nsrecord::input_filter_interval_minimum::calculate_result()\n    const\n{\n    return get_range().get_lowest();\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval/minimum.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_INTERVAL_MINIMUM_H\n#define SRECORD_INPUT_FILTER_INTERVAL_MINIMUM_H\n\n#include <srecord/input/filter/interval.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_interval_minimum class is used to represent a\n  * filter which injects the minimum address of the data into the data.\n  */\nclass input_filter_interval_minimum:\n    public input_filter_interval\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_interval_minimum();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      * @param address\n      *     The address at which to place the minimum address.\n      * @param length\n      *     The number of bytes of minimum address to be inserted.\n      * @param end\n      *     The byte order.\n      * @param inclusive\n      *     true if the output location is included in the address\n      *     range, false if not\n      */\n    input_filter_interval_minimum(const pointer &deeper, long address,\n        int length, endian_t end, bool inclusive);\n\npublic:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      * @param address\n      *     The address at which to place the minimum address.\n      * @param length\n      *     The number of bytes of minimum address to be inserted.\n      * @param end\n      *     The byte order.\n      * @param inclusive\n      *     true if the output location is included in the address\n      *     range, false if not\n      */\n    static pointer create(const pointer &deeper, long address, int length,\n        endian_t end, bool inclusive);\n\nprotected:\n    // See base class for documentation.\n    long calculate_result() const;\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_interval_minimum();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_interval_minimum(const input_filter_interval_minimum &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_interval_minimum &operator=(\n        const input_filter_interval_minimum &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_INTERVAL_MINIMUM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/interval.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_interval::~input_filter_interval()\n{\n}\n\n\nsrecord::input_filter_interval::input_filter_interval(\n    const input::pointer &a_deeper,\n    long a_address,\n    int a_length,\n    endian_t a_end,\n    bool inclusive\n) :\n    input_filter(a_deeper),\n    address(a_address),\n    length(a_length <= 1 ? 1 : a_length >= 8 ? 8 : a_length),\n    end(a_end)\n{\n    if (inclusive)\n        range = interval(address, address + length);\n}\n\n\nbool\nsrecord::input_filter_interval::generate(record &result)\n{\n    if (length <= 0)\n        return false;\n    long value = calculate_result();\n    unsigned char chunk[8];\n    record::encode(chunk, value, length, end);\n    result = record(record::type_data, address, chunk, length);\n    length = 0;\n    return true;\n}\n\n\nbool\nsrecord::input_filter_interval::read(record &record)\n{\n    if (!input_filter::read(record))\n        return generate(record);\n    if (record.get_type() == record::type_data)\n    {\n        interval i(record.get_address(), record.get_address_end());\n        range += i;\n    }\n    return true;\n}\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/interval.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_INTERVAL_H\n#define SRECORD_INPUT_FILTER_INTERVAL_H\n\n#include <srecord/endian.h>\n#include <srecord/interval.h>\n#include <srecord/input/filter.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter_interval class is used to represent a filter\n  * which works with the interval representing the data's coverage,\n  * <i>exclusive</i> of where the result is to be placed.\n  */\nclass input_filter_interval:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_interval();\n\nprotected:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      * @param address\n      *     The address at which to place the interval.\n      * @param length\n      *     The number of bytes of interval to be inserted.\n      * @param end\n      *     The byte order.\n      * @param inclusive\n      *     true if the output location is included in the address\n      *     range, false if not\n      */\n    input_filter_interval(const input::pointer &deeper, long address,\n        int length, endian_t end, bool inclusive);\n\n    /**\n      * The calculate_result method is used to calculate the final value\n      * to be placed into the output.\n      */\n    virtual long calculate_result() const = 0;\n\n    /**\n      * The get_range method may be used to derived classes to get\n      * access to the address range covered by the input data.\n      */\n    const interval &get_range() const { return range; }\n\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The address instance variable is used to remember where the\n      * final result is to be placed.\n      */\n    long address;\n\n    /**\n      * The length instance variable is used to remember how many bytes\n      * are to be placed at the above address.\n      *\n      * 0 < length && length <= 8\n      * (a length of zero means we have already emitted the results)\n      */\n    int length;\n\n    /**\n      * The end instance variable is used to remember whether to use\n      * big endian order or little endian byte order.\n      */\n    endian_t end;\n\n    /**\n      * The range instance variable is used to remember the address\n      * range covered by the input data.\n      */\n    interval range;\n\n    /**\n      * The generate method is used to generate the final record with\n      * the interval data in it.\n      *\n      * @param record\n      *     where to put the result\n      */\n    bool generate(record &record);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_interval();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_interval(const input_filter_interval &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_interval &operator=(const input_filter_interval &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_INTERVAL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/adler16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/message/adler16.h>\n#include <srecord/memory/walker/adler16.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_adler16::~input_filter_message_adler16()\n{\n}\n\n\nsrecord::input_filter_message_adler16::input_filter_message_adler16(\n    const input::pointer &a_deeper,\n    unsigned long a_address,\n    endian_t a_end\n) :\n    input_filter_message(a_deeper),\n    address(a_address),\n    end(a_end)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_adler16::create(const input::pointer &a_deeper,\n    unsigned long a_address, endian_t a_end)\n{\n    return\n        pointer\n        (\n            new input_filter_message_adler16(a_deeper, a_address, a_end)\n        );\n}\n\n\nvoid\nsrecord::input_filter_message_adler16::process(const memory &input,\n    record &output)\n{\n    //\n    // Now calculate the Adler 16 checksum the bytes in order from\n    // lowest address to highest.  (Holes are ignored, not filled,\n    // warning already issued.)\n    //\n    memory_walker_adler16::pointer w = memory_walker_adler16::create();\n    input.walk(w);\n    unsigned short adler = w->get();\n\n    //\n    // Turn the Adler-16 checksum into the first data record.\n    //\n    unsigned char chunk[2];\n    record::encode(chunk, adler, sizeof(chunk), end);\n    output = record(record::type_data, address, chunk, sizeof(chunk));\n}\n\n\nconst char *\nsrecord::input_filter_message_adler16::get_algorithm_name()\n    const\n{\n    return \"Adler-16\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/adler16.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_ADLER16_H\n#define SRECORD_INPUT_FILTER_MESSAGE_ADLER16_H\n\n#include <srecord/adler16.h>\n#include <srecord/endian.h>\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message_adler16 class is used to represent the\n  * state of a checksum filter that inserts an Adler 16 checksum into\n  * the data.\n  */\nclass input_filter_message_adler16:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_adler16();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     Where to place the checksum.\n      * @param end\n      *     The byte order.\n      */\n    input_filter_message_adler16(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     Where to place the checksum.\n      * @param end\n      *     The byte order.\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where to place\n      * the Adler 16 checksum in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The end instance variable is used to remember whether the byte\n      * order is big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_adler16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_adler16(const input_filter_message_adler16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_adler16 &operator=(\n        const input_filter_message_adler16 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_MESSAGE_ADLER16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/adler32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/message/adler32.h>\n#include <srecord/memory/walker/adler32.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_adler32::~input_filter_message_adler32()\n{\n}\n\n\nsrecord::input_filter_message_adler32::input_filter_message_adler32(\n    const input::pointer &a_deeper,\n    unsigned long a_address,\n    endian_t a_end\n) :\n    input_filter_message(a_deeper),\n    address(a_address),\n    end(a_end)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_adler32::create(const input::pointer &a_deeper,\n    unsigned long a_address, endian_t a_end)\n{\n    return\n        pointer\n        (\n            new input_filter_message_adler32(a_deeper, a_address, a_end)\n        );\n}\n\n\nvoid\nsrecord::input_filter_message_adler32::process(const memory &input,\n    record &output)\n{\n    //\n    // Now calculate the Adler 32 checksum the bytes in order from\n    // lowest address to highest.  (Holes are ignored, not filled,\n    // warning issued already.)\n    //\n    memory_walker_adler32::pointer w =\n        memory_walker_adler32::create();\n    input.walk(w);\n    unsigned long adler = w->get();\n\n    //\n    // Turn the CRC into the first data record.\n    //\n    unsigned char chunk[4];\n    record::encode(chunk, adler, sizeof(chunk), end);\n    output = record(record::type_data, address, chunk, sizeof(chunk));\n}\n\n\nconst char *\nsrecord::input_filter_message_adler32::get_algorithm_name()\n    const\n{\n    return \"Adler-32\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/adler32.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_ADLER32_H\n#define SRECORD_INPUT_FILTER_MESSAGE_ADLER32_H\n\n#include <srecord/adler32.h>\n#include <srecord/endian.h>\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message_adler32 class is used to represent the\n  * state of a checksum filter that inserts an Adler 32 checksum into\n  * the data.\n  */\nclass input_filter_message_adler32:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_adler32();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to put the checksum\n      * @param end\n      *     The byte order.\n      */\n    input_filter_message_adler32(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to put the checksum\n      * @param end\n      *     The byte order.\n      */\n    static pointer create(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where to place\n      * the Adler 32 checksum in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The end instance variable is used to remember whether the byte\n      * order is big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_adler32();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_adler32(\n        const input_filter_message_adler32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_adler32 &operator=(\n        const input_filter_message_adler32 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_MESSAGE_ADLER32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/crc16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/message/crc16.h>\n#include <srecord/memory.h>\n#include <srecord/memory/walker/crc16.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_crc16::~input_filter_message_crc16()\n{\n}\n\n\nsrecord::input_filter_message_crc16::input_filter_message_crc16(\n        const input::pointer &deeper_arg, unsigned long address_arg,\n        endian_t a_end) :\n    input_filter_message(deeper_arg),\n    address(address_arg),\n    end(a_end),\n    seed_mode(crc16::seed_mode_ccitt),\n    augment_flag(true),\n    polynomial(crc16::polynomial_ccitt),\n    bitdir(crc16::bit_direction_most_to_least)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_crc16::create(const input::pointer &a_deeper,\n    unsigned long a_address, endian_t a_end)\n{\n    return\n        pointer\n        (\n            new input_filter_message_crc16(a_deeper, a_address, a_end)\n        );\n}\n\n\nvoid\nsrecord::input_filter_message_crc16::command_line(arglex_tool *cmdln)\n{\n    for (;;)\n    {\n        switch (cmdln->token_cur())\n        {\n        case arglex::token_number:\n            polynomial = cmdln->value_number();\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_most_to_least:\n            bitdir = crc16::bit_direction_most_to_least;\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_least_to_most:\n            bitdir = crc16::bit_direction_least_to_most;\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_xmodem:\n            seed_mode = crc16::seed_mode_xmodem;\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_ccitt:\n            seed_mode = crc16::seed_mode_ccitt;\n            polynomial = crc16::polynomial_ccitt;\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_polynomial:\n            // polynomial = crc16::polynomial_ansi;\n            switch (cmdln->token_next())\n            {\n            case arglex::token_number:\n                polynomial = cmdln->value_number();\n                break;\n\n            case arglex_tool::token_crc16_ccitt:\n                polynomial = crc16::polynomial_ccitt;\n                break;\n\n            case arglex::token_string:\n                polynomial =\n                    crc16::polynomial_by_name(cmdln->value_string().c_str());\n                break;\n\n            default:\n                fatal_error(\"expected --polynomial <name>\");\n            }\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_broken:\n            seed_mode = crc16::seed_mode_broken;\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_augment:\n            augment_flag = true;\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_augment_not:\n            augment_flag = false;\n            cmdln->token_next();\n            break;\n\n        default:\n            return;\n        }\n    }\n}\n\n\nvoid\nsrecord::input_filter_message_crc16::process(const memory &buffer,\n    record &result)\n{\n    //\n    // Now CRC16 the bytes in order from lowest address to highest.\n    // (Holes are ignored, not filled, warning already issued.)\n    //\n    memory_walker_crc16::pointer w =\n        memory_walker_crc16::create\n        (\n            seed_mode,\n            augment_flag,\n            polynomial,\n            bitdir\n        );\n    buffer.walk(w);\n    unsigned crc = w->get();\n\n    //\n    // Turn the CRC into the first data record.\n    //\n    unsigned char chunk[2];\n    record::encode(chunk, crc, sizeof(chunk), end);\n    result = record(record::type_data, address, chunk, sizeof(chunk));\n}\n\n\nconst char *\nsrecord::input_filter_message_crc16::get_algorithm_name()\n    const\n{\n    return \"CRC16\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/crc16.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2005-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_CRC16_H\n#define SRECORD_INPUT_FILTER_MESSAGE_CRC16_H\n\n#include <srecord/crc16.h>\n#include <srecord/endian.h>\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message_crc16 class is used to represent the\n  * state of a checksum filter that inserts a CRC16 into the data.\n  */\nclass input_filter_message_crc16:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_crc16();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to put the checksum\n      * @param end\n      *     The byte order.\n      */\n    input_filter_message_crc16(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to put the checksum\n      * @param end\n      *     The byte order.\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where to place\n      * the CRC in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The end instance variable is used to remember whether the byte\n      * order is big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The seed_mode instance variable is used to remember the desired\n      * seed for the CRC16 calculation.  Defaults to CCITT.\n      */\n    crc16::seed_mode_t seed_mode;\n\n    /**\n      * The augment_flag instance variable is used to remember whether\n      * or not the final 16-zero-bits augmentation should be applied to\n      * the CRC.  Almost always true.\n      */\n    bool augment_flag;\n\n    unsigned short polynomial;\n\n    /**\n      * The bitdir instance variable is used to rememebr the bit\n      * direction of the CRC.\n      */\n    crc16::bit_direction_t bitdir;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_crc16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_crc16(const input_filter_message_crc16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_crc16 &operator=(const input_filter_message_crc16 &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_MESSAGE_CRC16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/crc32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/message/crc32.h>\n#include <srecord/memory/walker/crc32.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_crc32::~input_filter_message_crc32()\n{\n}\n\n\nsrecord::input_filter_message_crc32::input_filter_message_crc32(\n    const input::pointer &a_deeper,\n    unsigned long a_address,\n    endian_t a_end\n) :\n    input_filter_message(a_deeper),\n    address(a_address),\n    end(a_end),\n    seed_mode(crc32::seed_mode_ccitt)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_crc32::create(const input::pointer &a_deeper,\n    unsigned long a_address, endian_t a_end)\n{\n    return\n        pointer\n        (\n            new input_filter_message_crc32(a_deeper, a_address, a_end)\n        );\n}\n\n\nvoid\nsrecord::input_filter_message_crc32::command_line(arglex_tool *cmdln)\n{\n    for (;;)\n    {\n        switch (cmdln->token_cur())\n        {\n        case arglex_tool::token_crc16_xmodem:\n            seed_mode = crc32::seed_mode_xmodem;\n            cmdln->token_next();\n            break;\n\n        case arglex_tool::token_crc16_ccitt:\n            seed_mode = crc32::seed_mode_ccitt;\n            cmdln->token_next();\n            break;\n\n        default:\n            return;\n        }\n    }\n}\n\n\nvoid\nsrecord::input_filter_message_crc32::process(const memory &input,\n    record &output)\n{\n    //\n    // Now CRC32 the bytes in order from lowest address to highest.\n    // (Holes are ignored, not filled, warning already issued.)\n    //\n    memory_walker_crc32::pointer w =\n        memory_walker_crc32::create(seed_mode);\n    input.walk(w);\n    unsigned long crc = w->get();\n\n    //\n    // Turn the CRC into the first data record.\n    //\n    unsigned char chunk[4];\n    record::encode(chunk, crc, sizeof(chunk), end);\n    output = record(record::type_data, address, chunk, sizeof(chunk));\n}\n\n\nconst char *\nsrecord::input_filter_message_crc32::get_algorithm_name()\n    const\n{\n    return \"CRC32\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/crc32.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2005-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_CRC32_H\n#define SRECORD_INPUT_FILTER_MESSAGE_CRC32_H\n\n#include <srecord/crc32.h>\n#include <srecord/endian.h>\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message_crc32 class is used to represent the\n  * state of a checksum filter that inserts a CRC32 into the data.\n  */\nclass input_filter_message_crc32:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_crc32();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    input_filter_message_crc32(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where to place\n      * the CRC in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The end instance variable is used to remember whether the byte\n      * order is big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The seed_mode instance variable is used to remember what the\n      * user wants for the initial seed.  The default is to use the\n      * standard CCITT seed.\n      */\n    crc32::seed_mode_t seed_mode;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_crc32();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_crc32(const input_filter_message_crc32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_crc32 &operator=(const input_filter_message_crc32 &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_MESSAGE_CRC32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/fletcher16.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/message/fletcher16.h>\n#include <srecord/memory/walker/fletcher16.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_fletcher16::~input_filter_message_fletcher16()\n{\n}\n\n\nsrecord::input_filter_message_fletcher16::input_filter_message_fletcher16(\n    const input::pointer &a_deeper,\n    unsigned long a_address,\n    endian_t a_end\n) :\n    input_filter_message(a_deeper),\n    address(a_address),\n    end(a_end),\n    sum1(0xFF),\n    sum2(0xFF),\n    answer(-1)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_fletcher16::create(\n    const input::pointer &a_deeper, unsigned long a_address,\n    endian_t a_end)\n{\n    return\n        pointer\n        (\n            new input_filter_message_fletcher16(a_deeper, a_address, a_end)\n        );\n}\n\n\nvoid\nsrecord::input_filter_message_fletcher16::command_line(\n    srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        sum1 = 0xFF & cmdln->get_number(\"sum1\");\n        sum2 = 0xFF & cmdln->get_number(\"sum2\");\n\n        if (cmdln->token_cur() == arglex::token_number)\n            answer = 0xFFFF & cmdln->get_number(\"answer\");\n    }\n}\n\n\nvoid\nsrecord::input_filter_message_fletcher16::process(const memory &input,\n    record &output)\n{\n    //\n    // Now calculate the Fletcher 16 checksum the bytes in order from\n    // lowest address to highest.  (Holes are ignored, not filled,\n    // warning issued already.)\n    //\n    memory_walker_fletcher16::pointer w =\n        memory_walker_fletcher16::create(sum1, sum2, answer, end);\n    input.walk(w);\n    unsigned short fletcher = w->get();\n\n    //\n    // Turn the Fletcher-16 checksum into the first data record.\n    //\n    unsigned char chunk[2];\n    record::encode(chunk, fletcher, sizeof(chunk), end);\n    output = record(record::type_data, address, chunk, sizeof(chunk));\n}\n\n\nconst char *\nsrecord::input_filter_message_fletcher16::get_algorithm_name()\n    const\n{\n    return \"Fletcher-16\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/fletcher16.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_FLETCHER16_H\n#define SRECORD_INPUT_FILTER_MESSAGE_FLETCHER16_H\n\n#include <srecord/fletcher16.h>\n#include <srecord/endian.h>\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message_fletcher16 class is used to represent\n  * the state of a checksum filter that inserts an Fletcher 16 checksum\n  * into the data.\n  */\nclass input_filter_message_fletcher16:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_fletcher16();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    input_filter_message_fletcher16(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name() const;\n\n    // See base class for documentation.\n    void command_line(srecord::arglex_tool *cmdln);\n\nprivate:\n    /**\n      * The address instance variable is used to remember where to place\n      * the Fletcher 16 checksum in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The end instance variable is used to remember whether the byte\n      * order is big-endian or little-endian.\n      */\n    endian_t end;\n\n    unsigned char sum1;\n\n    unsigned char sum2;\n\n    int answer;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_fletcher16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_fletcher16(const input_filter_message_fletcher16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_fletcher16 &operator=(\n        const input_filter_message_fletcher16 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_MESSAGE_FLETCHER16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/fletcher32.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/message/fletcher32.h>\n#include <srecord/memory/walker/fletcher32.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_fletcher32::~input_filter_message_fletcher32()\n{\n}\n\n\nsrecord::input_filter_message_fletcher32::input_filter_message_fletcher32(\n    const input::pointer &a_deeper,\n    unsigned long a_address,\n    endian_t a_end\n) :\n    input_filter_message(a_deeper),\n    address(a_address),\n    end(a_end)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_fletcher32::create(\n    const input::pointer &a_deeper, unsigned long a_address,\n    endian_t a_end)\n{\n    return\n        pointer\n        (\n            new input_filter_message_fletcher32(a_deeper, a_address, a_end)\n        );\n}\n\n\nvoid\nsrecord::input_filter_message_fletcher32::process(const memory &input,\n    record &output)\n{\n    //\n    // Now calculate the Fletcher 32 checksum the bytes in order from\n    // lowest address to highest.  (Holes are ignored, not filled,\n    // warning issued already.)\n    //\n    memory_walker_fletcher32::pointer w =\n        memory_walker_fletcher32::create();\n    input.walk(w);\n    unsigned long fletcher = w->get();\n\n    //\n    // Turn the CRC into the first data record.\n    //\n    unsigned char chunk[4];\n    record::encode(chunk, fletcher, sizeof(chunk), end);\n    output = record(record::type_data, address, chunk, sizeof(chunk));\n}\n\n\nconst char *\nsrecord::input_filter_message_fletcher32::get_algorithm_name()\n    const\n{\n    return \"Fletcher-32\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/fletcher32.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_FLETCHER32_H\n#define SRECORD_INPUT_FILTER_MESSAGE_FLETCHER32_H\n\n#include <srecord/fletcher32.h>\n#include <srecord/endian.h>\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message_fletcher32 class is used to represent\n  * the state of a checksum filter that inserts an Fletcher 32 checksum\n  * into the data.\n  */\nclass input_filter_message_fletcher32:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_fletcher32();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    input_filter_message_fletcher32(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where to place\n      * the Fletcher 32 checksum in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The end instance variable is used to remember whether the byte\n      * order is big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_fletcher32();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_fletcher32(const input_filter_message_fletcher32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_fletcher32 &operator=(\n        const input_filter_message_fletcher32 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_MESSAGE_FLETCHER32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/gcrypt.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/quit.h>\n#include <srecord/sizeof.h>\n#include <srecord/input/filter/message/gcrypt.h>\n#include <srecord/memory/walker/gcrypt.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_gcrypt::~input_filter_message_gcrypt()\n{\n}\n\n\nsrecord::input_filter_message_gcrypt::input_filter_message_gcrypt(\n    const input::pointer &a_deeper,\n    unsigned long a_address,\n    int a_algo,\n    bool a_hmac\n) :\n    input_filter_message(a_deeper),\n    algo(a_algo),\n    hmac(a_hmac),\n    address(a_address)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create(const input::pointer &a_deeper,\n    unsigned long a_address, int algo, bool hmac)\n{\n    return\n        pointer\n        (\n            new input_filter_message_gcrypt\n            (\n                a_deeper,\n                a_address,\n                algo,\n                hmac\n            )\n        );\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create(const input::pointer &a_deeper,\n    unsigned long a_address, const char *name, bool a_hmac)\n{\n    return create(a_deeper, a_address, algorithm_from_name(name), a_hmac);\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_md5(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_MD5);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_sha1(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_SHA1);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_rmd160(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_RMD160);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_md2(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_MD2);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_tiger(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_TIGER);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_haval(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_HAVAL);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_sha256(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_SHA256);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_sha384(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_SHA384);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_sha512(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_SHA512);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_sha224(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT_SHA224\n    return create(a_deeper, a_address, GCRY_MD_SHA224);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt SHA224 not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_md4(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_MD4);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_crc32(\n    const srecord::input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_CRC32);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_crc32_rfc1510(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_CRC32_RFC1510);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_crc24_rfc2440(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT\n    return create(a_deeper, a_address, GCRY_MD_CRC24_RFC2440);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt not available\");\n    return pointer();\n#endif\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_gcrypt::create_whirlpool(\n    const input::pointer &a_deeper, unsigned long a_address)\n{\n#ifdef HAVE_LIBGCRYPT_WHIRLPOOL\n    return create(a_deeper, a_address, GCRY_MD_WHIRLPOOL);\n#else\n    (void)a_deeper;\n    (void)a_address;\n    quit_default.fatal_error(\"libgcrypt WHIRLPOOL not available\");\n    return pointer();\n#endif\n}\n\n\nint\nsrecord::input_filter_message_gcrypt::algorithm_from_name(const char *name)\n{\n#ifdef HAVE_LIBGCRYPT\n    static int table[] =\n    {\n        GCRY_MD_MD5,\n        GCRY_MD_SHA1,\n        GCRY_MD_RMD160,\n        GCRY_MD_MD2,\n        GCRY_MD_TIGER,\n        GCRY_MD_HAVAL,\n        GCRY_MD_SHA256,\n        GCRY_MD_SHA384,\n        GCRY_MD_SHA512,\n#ifdef HAVE_LIBGCRYPT_SHA224\n        GCRY_MD_SHA224,\n#endif\n        GCRY_MD_MD4,\n        GCRY_MD_CRC32,\n        GCRY_MD_CRC32_RFC1510,\n        GCRY_MD_CRC24_RFC2440,\n#ifdef HAVE_LIBGCRYPT_WHIRLPOOL\n        GCRY_MD_WHIRLPOOL,\n#endif\n    };\n\n    for (const int *tp = table; tp < ENDOF(table); ++tp)\n    {\n        int algo = *tp;\n        if (0 == strcasecmp(name, gcry_md_algo_name(algo)))\n            return algo;\n    }\n#endif\n    quit_default.fatal_error(\"gcrypt algorithm \\\"%s\\\" unknown\", name);\n    return -1;\n}\n\n\nvoid\nsrecord::input_filter_message_gcrypt::process(const memory &input,\n    record &output)\n{\n#ifdef HAVE_LIBGCRYPT\n    // allocate the message digest handle\n    unsigned int flags = 0;\n    if (hmac)\n        flags |= GCRY_MD_FLAG_HMAC;\n    gcry_md_hd_t handle = 0;\n    gcry_error_t err = gcry_md_open(&handle, algo, flags);\n    if (err)\n        fatal_error(\"gcry_md_open: %s\", gcry_strerror(err));\n\n    // traverse the memory\n    memory_walker::pointer w = memory_walker_gcrypt::create(handle);\n    input.walk(w);\n\n    // generate the result\n    const unsigned char *data = gcry_md_read(handle, algo);\n    size_t data_size = gcry_md_get_algo_dlen(algo);\n    output = record(record::type_data, address, data, data_size);\n\n    // free the message digest handle\n    gcry_md_close(handle);\n#else\n    (void)input;\n    fatal_error(\"not compiled with libgcrypt support\");\n    output =\n        record\n        (\n            record::type_data,\n            address,\n            (const unsigned char *)\"oops\",\n            4\n        );\n#endif\n}\n\n\nconst char *\nsrecord::input_filter_message_gcrypt::get_algorithm_name()\n    const\n{\n#ifdef HAVE_LIBGCRYPT\n    return gcry_md_algo_name(algo);\n#else\n    return \"libgcrypt not available\";\n#endif\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/gcrypt.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_GCRYPT_H\n#define SRECORD_INPUT_FILTER_MESSAGE_GCRYPT_H\n\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message_gcrypt class is used to represent a\n  * filter that runs the data through one of the hashing algorithms in\n  * the gcrypt library.\n  *\n  * http://freshmeat.net/projects/libgcrypt/\n  * http://directory.fsf.org/project/libgcrypt/\n  */\nclass input_filter_message_gcrypt:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_gcrypt();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use one of the\n      * create_* class method instead.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param algo\n      *     The algorithm number (private to class).\n      * @param hmac\n      *     Turn the hash into a HMAC.\n      * @param address\n      *     Where to place the hash in memory.\n      * @param hmac\n      *     Add a message authentication code\n      */\n    input_filter_message_gcrypt(const input::pointer &deeper,\n        unsigned long address, int algo, bool hmac);\n\nprivate:\n    /**\n      * The create class method is used to create a new dynamically\n      * allocated instance of this class.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param algo\n      *     The algorithm to be used.  This is for debug.\n      *     The actual algorithm numbers are private to the class.\n      *     Choose a random number, it will likely segfault.  Seriously.\n      * @param address\n      *     Where to place the hash in memory.\n      * @param hmac\n      *     Add a message authentication code\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        int algo, bool hmac = false);\n\n    /**\n      * The algorithm_from_name class method is used to translate an\n      * algorithm name into an algorithm number.\n      *\n      * @param name\n      *     The name of the algorithm.\n      * @return\n      *     an algorithm number.  It does not return if the name is\n      *     unknown, it exits with a fatal error message instead.\n      */\n    static int algorithm_from_name(const char *name);\n\npublic:\n    /**\n      * The create class method is used to create a new dynamically\n      * allocated instance of this class.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      * @param algo\n      *     The algorithm to be used.  This is for debug.\n      *     The actual algorithm numbers are private to the class.\n      * @param hmac\n      *     Turn the hash into a HMAC.\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        const char *algo, bool hmac = false);\n\n    /**\n      * The create_md5 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates MD5 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_md5(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_sha1 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates SHA1 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_sha1(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_rmd160 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates RMD160 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_rmd160(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_md2 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates MD2 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_md2(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_tiger class method is used to create a new dynamically\n      * allocated instance of this class, that calculates TIGER/192 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_tiger(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_haval class method is used to create a new dynamically\n      * allocated instance of this class, that calculates HAVAL/160 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_haval(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_sha256 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates SHA-256 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_sha256(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_sha384 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates SHA-384 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_sha384(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_sha512 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates SHA-512 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_sha512(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_sha224 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates SHA-224 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_sha224(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_md4 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates MD4 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_md4(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_crc32 class method is used to create a new dynamically\n      * allocated instance of this class, that calculates CRC-32 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_crc32(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_crc32_rfc1510 class method is used to create a new\n      * dynamically allocated instance of this class, that calculates\n      * CRC32 RFC1510 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_crc32_rfc1510(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_crc24_rfc2440 class method is used to create a new\n      * dynamically allocated instance of this class, that calculates\n      * CRC24 RFC2440 hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_crc24_rfc2440(const input::pointer &deeper,\n        unsigned long address);\n\n    /**\n      * The create_whirlpool class method is used to create a new\n      * dynamically allocated instance of this class, that calculates\n      * WHIRLPOOL hashes.\n      *\n      * @param deeper\n      *     The source of data to be filtered.\n      * @param address\n      *     Where to place the hash in memory.\n      */\n    static pointer create_whirlpool(const input::pointer &deeper,\n        unsigned long address);\n\nprotected:\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name() const;\n\nprivate:\n    /**\n      * The algo instance variable is used to remember the algorithm\n      * number.\n      */\n    int algo;\n\n    /**\n      * The hmac instance variable is used to remember whether or not to\n      * turn the hash into a HMAC.\n      */\n    bool hmac;\n\n    /**\n      * The address instance variable is used to remember where to place\n      * the hash in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_gcrypt();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_gcrypt(const input_filter_message_gcrypt &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_gcrypt &operator=(const input_filter_message_gcrypt &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_MESSAGE_GCRYPT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/stm32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n//      From: Hendrik Beijeman <hbeyeman@gmail.com>\n//      To: pmiller@opensource.org.au\n//      Subject: Re: patch for srecord 1.59\n//      Date: Sat, 05 May 2012 06:26:02 +0200 (05/05/12 14:26:02)\n//\n//      I hereby formally assign all copyright to the author of srecord,\n//      Peter Miller.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/filter/message/stm32.h>\n#include <srecord/memory/walker/stm32.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message_stm32::~input_filter_message_stm32()\n{\n}\n\n\nsrecord::input_filter_message_stm32::input_filter_message_stm32(\n    const input::pointer &a_deeper,\n    unsigned long a_address,\n    endian_t a_end\n) :\n    input_filter_message(a_deeper),\n    address(a_address),\n    end(a_end)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_message_stm32::create(const input::pointer &a_deeper,\n    unsigned long a_address, endian_t a_end)\n{\n    return\n        pointer\n        (\n            new input_filter_message_stm32(a_deeper, a_address, a_end)\n        );\n}\n\n\nvoid\nsrecord::input_filter_message_stm32::command_line(arglex_tool *)\n{\n}\n\n\nvoid\nsrecord::input_filter_message_stm32::process(const memory &input,\n    record &output)\n{\n    //\n    // Now STM32 the bytes in order from lowest address to highest.\n    // (Holes are ignored, not filled, warning already issued.)\n    //\n    memory_walker_stm32::pointer w = memory_walker_stm32::create();\n    input.walk(w);\n    unsigned long crc = w->get();\n\n    //\n    // Turn the CRC into the first data record.\n    //\n    unsigned char chunk[4];\n    record::encode(chunk, crc, sizeof(chunk), end);\n    output = record(record::type_data, address, chunk, sizeof(chunk));\n}\n\n\nconst char *\nsrecord::input_filter_message_stm32::get_algorithm_name(void)\n    const\n{\n    return \"STM32\";\n}\n\n\nunsigned\nsrecord::input_filter_message_stm32::get_minimum_alignment(void)\n    const\n{\n    return 4;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message/stm32.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n//      From: Hendrik Beijeman <hbeyeman@gmail.com>\n//      To: pmiller@opensource.org.au\n//      Subject: Re: patch for srecord 1.59\n//      Date: Sat, 05 May 2012 06:26:02 +0200 (05/05/12 14:26:02)\n//\n//      I hereby formally assign all copyright to the author of srecord,\n//      Peter Miller.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_STM32_H\n#define SRECORD_INPUT_FILTER_MESSAGE_STM32_H\n\n#include <srecord/stm32.h>\n#include <srecord/endian.h>\n#include <srecord/input/filter/message.h>\n\nnamespace srecord\n{\n\n/**\n  * The input_filter_message_stm32 class represents the code required to\n  * calculate an STM32 (CRC) value.\n  * http://www.st.com/\n  */\nclass input_filter_message_stm32:\n    public input_filter_message\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message_stm32();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    input_filter_message_stm32(const input::pointer &deeper,\n        unsigned long address, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param address\n      *     where to place the checksum\n      * @param end\n      *     The byte order.\n      */\n    static pointer create(const input::pointer &deeper, unsigned long address,\n        endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    void process(const memory &input, record &output);\n\n    // See base class for documentation.\n    const char *get_algorithm_name(void) const;\n\n    // See base class for documentation.\n    unsigned get_minimum_alignment(void) const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where to place\n      * the CRC in memory.\n      */\n    unsigned long address;\n\n    /**\n      * The end instance variable is used to remember whether the byte\n      * order is big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message_stm32();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message_stm32(const input_filter_message_stm32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message_stm32 &operator=(const input_filter_message_stm32 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_MESSAGE_STM32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2012, 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/message.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_message::~input_filter_message()\n{\n}\n\n\nsrecord::input_filter_message::input_filter_message(\n    const input::pointer &a_deeper,\n    bool a_naked\n) :\n    input_filter(a_deeper),\n    naked(a_naked),\n    buffer_pos(0),\n    have_forwarded_header(false),\n    have_given_result(false),\n    have_forwarded_start_address(false)\n{\n}\n\n\nunsigned\nsrecord::input_filter_message::get_minimum_alignment(void)\n    const\n{\n    return 0;\n}\n\n\nbool\nsrecord::input_filter_message::read(record &result)\n{\n    //\n    // If we haven't read the deeper input yet, read all of it into\n    // a memory buffer, then message the bytes.\n    //\n    if (buffer.empty())\n    {\n        buffer.reader(ifp, defcon_ignore, defcon_warning);\n\n        unsigned multiple = get_minimum_alignment();\n        if (multiple >= 2 && !buffer.is_well_aligned(multiple))\n        {\n            warning\n            (\n                \"The %s filter uses %u-byte alignment, but unaligned \"\n                \"data is present.  Use a \\\"--fill 0xNN --within <input> \"\n                \"--range-padding %u\\\" filter *before* the %s filter to fix \"\n                \"this problem.  \"\n                \"See srec_info(1) for how to see the data ranges.\",\n                get_algorithm_name(),\n                multiple,\n                multiple,\n                get_algorithm_name()\n            );\n        }\n\n        if (buffer.has_holes())\n        {\n            warning\n            (\n                \"The data presented for %s calculation has at least one hole \"\n                \"in it.  This is bad.  It means that the in-memory \"\n                \"calculation performed by your embedded system will be \"\n                \"different than the calculation performed here.  You are \"\n                \"strongly advised to use the \\\"--fill 0xFF --over <inoput>\\\" \"\n                \"filter *before* the %s filter to ensure both calculations are \"\n                \"using the same byte values.  \"\n                \"See srec_info(1) for how to see the holes.\",\n                get_algorithm_name(),\n                get_algorithm_name()\n            );\n        }\n    }\n\n    //\n    // Pass on the header of the deeper file.\n    //\n    if (!have_forwarded_header)\n    {\n        have_forwarded_header = true;\n        record *rp = buffer.get_header();\n        if (rp)\n        {\n            result = *rp;\n            return true;\n        }\n    }\n\n    //\n    // Calculate the result.\n    //\n    if (!have_given_result)\n    {\n        have_given_result = true;\n        process(buffer, result);\n        return true;\n    }\n\n    //\n    // Now forward the rest of the data.\n    //\n    if (!naked)\n    {\n        unsigned long ret_address = buffer_pos;\n        unsigned char data[64];\n        size_t nbytes = sizeof(data);\n        if (buffer.find_next_data(ret_address, data, nbytes))\n        {\n            result = record(record::type_data, ret_address, data, nbytes);\n            buffer_pos = ret_address + nbytes;\n            return true;\n        }\n    }\n\n    //\n    // Now forward on the start address of the deeper file.  (We could\n    // have done it any time after reading the data, but we do last\n    // because that is where \"real\" format usually put it.)\n    //\n    if (!have_forwarded_start_address)\n    {\n        have_forwarded_start_address = true;\n        record *rp = buffer.get_execution_start_address();\n        if (rp)\n        {\n            result = *rp;\n            return true;\n        }\n    }\n\n    //\n    // All done.\n    //\n    return false;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/message.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_MESSAGE_H\n#define SRECORD_INPUT_FILTER_MESSAGE_H\n\n#include <srecord/input/filter.h>\n#include <srecord/memory.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_message class is used to represent an abstract\n  * base class for filters that must operate on the complete data, in\n  * order, in order to functions (e.g. CRC, message digest, etc).\n  *\n  * All of the machinery for accumulating the input data and eventually\n  * forwarding it on are in this common base class.  The only methods\n  * that a derived class must supply are data block processing and\n  * results creation.\n  */\nclass input_filter_message:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_message();\n\nprotected:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The data to be filtered.\n      * @param naked\n      *     Whether or not to forward the data: true means result only\n      *     with no data, false means result and data.\n      */\n    input_filter_message(const input::pointer &deeper, bool naked = false);\n\n    // See base class for documentation.\n    bool read(record &record);\n\n    /**\n      * The process method is used to process the data from the input.\n      *\n      * @param input\n      *     The memory representation to be processed.\n      * @param output\n      *     The filter's output.\n      */\n    virtual void process(const memory &input, record &output) = 0;\n\n    /**\n      * The get_algorithm_name method is used in error messages.\n      */\n    virtual const char *get_algorithm_name() const = 0;\n\n    /**\n      * The get_minimum_alignment method is used to obtain the minium\n      * require dbyte alignment.  Returns 0 if irrelevant.\n      */\n    virtual unsigned get_minimum_alignment(void) const;\n\nprivate:\n    /**\n      * The naked instance variable is used to remember whether or not\n      * to forward the data: true means result only with no data, false\n      * means result and data.\n      */\n    bool naked;\n\n    /**\n      * The buffer instance variable is used to remember the contents\n      * of the deeper file.  The deeper file must be read completely\n      * in order to calculate the result, and the input may be out of\n      * address order, necessitating this buffer.\n      */\n    memory buffer;\n\n    /**\n      * The buffer_pos instance variable is used to remember where we\n      * are up to in processing 'buffer'.\n      */\n    unsigned long buffer_pos;\n\n    /**\n      * The have_forwarded_header instance variable is used to remember\n      * whether we have returned the file header to our reader yet.\n      */\n    bool have_forwarded_header;\n\n    /**\n      * The have_given_result instance variable is used to remember\n      * whether we have returned the result to our reader yet.\n      */\n    bool have_given_result;\n\n    /**\n      * The have_forwarded_start_address instance variable is used to\n      * remember whether we have returned the execution start address to\n      * our reader yet.\n      */\n    bool have_forwarded_start_address;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_message();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_message(const input_filter_message &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_message &operator=(const input_filter_message &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_MESSAGE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/not.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/input/filter/not.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_not::~input_filter_not()\n{\n}\n\n\nsrecord::input_filter_not::input_filter_not(const input::pointer &arg) :\n    srecord::input_filter(arg)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_not::create(const srecord::input::pointer &a_deeper)\n{\n    return pointer(new srecord::input_filter_not(a_deeper));\n}\n\n\nbool\nsrecord::input_filter_not::read(srecord::record &record)\n{\n    if (!srecord::input_filter::read(record))\n        return false;\n    if (record.get_type() == srecord::record::type_data)\n    {\n        for (size_t j = 0; j < record.get_length(); ++j)\n            record.set_data(j, ~record.get_data(j));\n    }\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/not.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_NOT_H\n#define SRECORD_INPUT_FILTER_NOT_H\n\n#include <srecord/input/filter.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_not class is used to represent an input stream\n  * which bit-wise NOTs the data.\n  */\nclass input_filter_not:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_not();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The input source to be filtered.\n      */\n    input_filter_not(const input::pointer &deeper);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source\n      */\n    static pointer create(const input::pointer &deeper);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_not();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_not(const input_filter_not &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_not &operator=(const input_filter_not &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_NOT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/offset.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/offset.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_offset::~input_filter_offset()\n{\n}\n\n\nsrecord::input_filter_offset::input_filter_offset(\n        const srecord::input::pointer &a1, long a2) :\n    srecord::input_filter(a1),\n    nbytes(a2)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_offset::create(const srecord::input::pointer &a_deeper,\n    long nbytes)\n{\n    return pointer(new srecord::input_filter_offset(a_deeper, nbytes));\n}\n\n\nbool\nsrecord::input_filter_offset::read(srecord::record &record)\n{\n    if (!srecord::input_filter::read(record))\n        return false;\n    long addr = record.get_address() + nbytes;\n\n    //\n    // Cope with machines with 64-bit longs, since all the code assumes\n    // addresses are in the modulo-2**32 range.\n    //\n    // FIXME: need to cope with data records which span zero.\n    //\n    addr &= 0xFFFFFFFF;\n\n    record.set_address(addr);\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/offset.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_OFFSET_H\n#define SRECORD_INPUT_FILTER_OFFSET_H\n\n#include <srecord/input/filter.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_offset class is used to represent a filetr\n  * where the addresses of the the deeper input source are offset by a\n  * number of bytes.\n  */\nclass input_filter_offset:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_offset();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input stream.\n      * @param nbytes\n      *     The number of bytes to offset the addresses by.\n      *     The value may be negative.\n      */\n    input_filter_offset(const input::pointer &deeper, long nbytes);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param nbytes\n      *     The number of bytes to offset the addresses by.\n      *     The value may be negative.\n      */\n    static pointer create(const input::pointer &deeper, long nbytes);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The nbytes instance variable is used to remember the number of\n      * bytes to affset the data by.\n      */\n    long nbytes;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_offset();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_offset(const input_filter_offset &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_offset &operator=(const input_filter_offset &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_OFFSET_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/or.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/or.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_or::~input_filter_or()\n{\n}\n\n\nsrecord::input_filter_or::input_filter_or(const srecord::input::pointer &a1,\n        int a2) :\n    srecord::input_filter(a1),\n    value(a2)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_or::create(const input::pointer &a_deeper, int a_value)\n{\n    return pointer(new srecord::input_filter_or(a_deeper, a_value));\n}\n\n\nbool\nsrecord::input_filter_or::read(srecord::record &record)\n{\n    if (!srecord::input_filter::read(record))\n        return false;\n    if (record.get_type() == srecord::record::type_data)\n    {\n        for (size_t j = 0; j < record.get_length(); ++j)\n            record.set_data(j, record.get_data(j) | value);\n    }\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/or.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_OR_H\n#define SRECORD_INPUT_FILTER_OR_H\n\n#include <srecord/input/filter.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_and clas sis used to represent the input state\n  * of a filter which bit-wise ORs all incoming data bytes with a fixed\n  * value.\n  */\nclass input_filter_or:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_or();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input to be used as a data source.\n      * @param value\n      *     The value to be bit-wise ORed with each incoming data byte.\n      */\n    input_filter_or(const input::pointer &deeper, int value);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param value\n      *     The value to be bit-wise ORed with each incoming data byte.\n      */\n    static pointer create(const input::pointer &deeper, int value);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The value instance variable is used to remember the value to be\n      * bit-wise ORed with each incoming data byte.\n      */\n    int value;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_or();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_or(const input_filter_or &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_or &operator=(const input_filter_or &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_OR_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/random_fill.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n#include <srecord/r250.h>\n#include <srecord/input/filter/random_fill.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_random_fill::~input_filter_random_fill()\n{\n}\n\n\nsrecord::input_filter_random_fill::input_filter_random_fill(\n        const srecord::input::pointer &a1, const interval &a3) :\n    srecord::input_filter(a1),\n    range(a3)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_random_fill::create(const input::pointer &a_deeper,\n    const interval &a_range)\n{\n    return pointer(new srecord::input_filter_random_fill(a_deeper, a_range));\n}\n\n\nbool\nsrecord::input_filter_random_fill::generate(srecord::record &record)\n{\n    if (range.empty())\n        return false;\n    unsigned char buffer[srecord::record::max_data_length];\n    interval chunk(range.get_lowest(), range.get_lowest() + sizeof(buffer));\n    chunk *= range;\n    chunk.first_interval_only();\n    int nbytes = chunk.get_highest() - chunk.get_lowest();\n    for (int j = 0; j < nbytes; ++j)\n        buffer[j] = r250();\n    record =\n        srecord::record\n        (\n            srecord::record::type_data,\n            chunk.get_lowest(),\n            buffer,\n            nbytes\n        );\n    range -= chunk;\n    return true;\n}\n\n\nbool\nsrecord::input_filter_random_fill::read(srecord::record &record)\n{\n    if (!srecord::input_filter::read(record))\n        return generate(record);\n    if (record.get_type() == srecord::record::type_data)\n    {\n        range -=\n            interval\n            (\n                record.get_address(),\n                record.get_address() + record.get_length()\n            );\n    }\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/random_fill.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2004, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_RANDOM_FILL_H\n#define SRECORD_INPUT_FILTER_RANDOM_FILL_H\n\n#include <srecord/interval.h>\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_random_fill class is used to represent a filter\n  * which replaces in set data locations with random data.\n  */\nclass input_filter_random_fill:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_random_fill();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param range\n      *     the addres srange to be filled.\n      */\n    input_filter_random_fill(const input::pointer &deeper,\n        const interval &range);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param range\n      *     the addres srange to be filled.\n      */\n    static pointer create(const input::pointer &deeper, const interval &range);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The range instance variable is used to remember the range of\n      * addresses to be filled.  As fill blocks are produced the range\n      * is reduced.\n      */\n    interval range;\n\n    /**\n      * The generate method is used to genetate fill records.\n      */\n    bool generate(record &record);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_random_fill();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_random_fill(const input_filter_random_fill &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_random_fill &operator=(const input_filter_random_fill &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_RANDOM_FILL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/sequence.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/sequence.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_sequence::~input_filter_sequence()\n{\n}\n\n\nsrecord::input_filter_sequence::input_filter_sequence(\n        srecord::input::pointer arg) :\n    srecord::input_filter(arg),\n    last_address(0),\n    warned(false)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_sequence::create(srecord::input::pointer arg)\n{\n    return pointer(new srecord::input_filter_sequence(arg));\n}\n\n\nbool\nsrecord::input_filter_sequence::read(srecord::record &record)\n{\n    if (!srecord::input_filter::read(record))\n        return false;\n    if (record.get_type() == srecord::record::type_data)\n    {\n#if 0\n        fprintf(stderr, \"%s: %d: address = %08lX, length = %08X\\n\",\n            __FILE__, __LINE__,\n            record.get_address(),\n            record.get_length()\n           );\n#endif\n        if (!warned)\n        {\n            //\n            // Issue a warning if the data records are not in strictly\n            // ascending address order.\n            //\n            if (record.get_address() < last_address)\n            {\n                warning\n                (\n                    \"data records not in strictly ascending order \"\n                        \"(expected >= 0x%04lX, got 0x%04lX)\",\n                    last_address,\n                    long(record.get_address())\n                );\n                warned = true;\n            }\n        }\n        last_address = record.get_address() + record.get_length();\n    }\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/sequence.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_SEQUENCE_H\n#define SRECORD_INPUT_FILTER_SEQUENCE_H\n\n#include <srecord/input/filter.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_sequence class is used to represent an input\n  * filter which does not change the data in any way, but issues\n  * warnings if the data is not instrictly ascending address order.\n  */\nclass input_filter_sequence:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_sequence();\n\nprivate:\n    /**\n      * The constructor.\n      */\n    input_filter_sequence(input::pointer deeper);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      */\n    static pointer create(input::pointer deeper);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The last_address instance variable is used to remember the high\n      * water mark for data record addresses to date.  Records with data\n      * addresses less than this cause an \"out of sequence\" warning.\n      * It is check and updated by the read() method.\n      */\n    unsigned long last_address;\n\n    /**\n      * The warned instance variable is used to remember whether or not\n      * an \"out of sequence\" warning has already been issued for this\n      * file.\n      *\n      * We only issue a single warning, because the linker in some\n      * embedded too chains emit zillions of these as they walk across\n      * object files updating segemnts in parallel.\n      */\n    bool warned;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_sequence();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_sequence(const input_filter_sequence &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_sequence &operator=(const input_filter_sequence &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_SEQUENCE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/split.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/split.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_split::~input_filter_split()\n{\n}\n\n\nsrecord::input_filter_split::input_filter_split(const input::pointer &a1,\n        int a2, int a3, int a4) :\n    srecord::input_filter(a1),\n    modulus(a2),\n    offset(a2 - a3),\n    width(a4),\n    buffer(),\n    buffer_pos(0)\n{\n    //\n    // The offset is expressed as a positive number (by subtracting\n    // the inherently negative offset from the modulus).  This avoids\n    // modulo operator problems near zero.\n    //\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_split::create(const srecord::input::pointer &a_deeper,\n    int a2, int a3, int a4)\n{\n    return pointer(new srecord::input_filter_split(a_deeper, a2, a3, a4));\n}\n\n\nbool\nsrecord::input_filter_split::read(srecord::record &record)\n{\n    for (;;)\n    {\n        while\n        (\n            buffer.get_type() != srecord::record::type_data\n        ||\n            buffer_pos >= buffer.get_length()\n        )\n        {\n            if (!srecord::input_filter::read(buffer))\n                return false;\n            if (buffer.get_type() != srecord::record::type_data)\n            {\n                record = buffer;\n                return true;\n            }\n            buffer_pos = 0;\n        }\n\n        srecord::record::address_t addr =\n            (buffer.get_address() + offset + buffer_pos);\n        srecord::record::address_t phase = addr % modulus;\n        if (phase < width)\n        {\n            unsigned char c = buffer.get_data(buffer_pos++);\n            //\n            // Because the offset was made positive by\n            // subtracting it from the modulus (to avoid\n            // problems with the C modulo operator (%) near\n            // zero) this means the address is actually one\n            // multiple of modulus too high.  Subtract it\n            // off before the width multiplication.\n            //\n            addr = (addr / modulus - 1) * width + phase;\n            record = srecord::record(srecord::record::type_data, addr, &c, 1);\n            return true;\n        }\n        ++buffer_pos;\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/split.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_SPLIT_H\n#define SRECORD_INPUT_FILTER_SPLIT_H\n\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_split class is used to represent a filter\n  * which splits ints input source into piceces.  The data of each\n  * swathe then has the address adjusted to fill in the gaps.\n  *\n  * For example, this filter can be used to create each of the images\n  * for 8-bit EPROMS for systems which use a 16-bit bus.\n  *\n  * Note that you need to invoke this filter N times when you have N\n  * swathes, once for each swathe.\n  *\n  *                                                                        <pre>\n  *           --> |    modulus    | <--\n  * Input data:   |               |\n  * ~-+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-~\n  *   |   | X | X | 0 | 1 | X | X | 4 | 5 | X | X | 8 | 9 | X | X |   |\n  * ~-+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-~\n  *               |       |      /       /       /       /\n  *               |       |     /       /      /       /\n  *               |       |    /       /     /       /\n  *               |       |   /       /    /       /    This diagram shows\n  *               |       |  /       /   /       /      offset zero.  You\n  *               |       | /       /  /       /        would need a second\n  * Output data:  |       |/       //       /           pass with an offset\n  * ~-+---+---+---+---+---+---+---+---+---+---+---+-~   of two for the other\n  *   |   |   |   | 0 | 1 | 4 | 5 | 8 | 9 |   |   |     half of the data.\n  * ~-+---+---+---+---+---+---+---+---+---+---+---+-~\n  *               |       |\n  *           --> | width | <--                                           </pre>\n  */\nclass input_filter_split:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_split();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input source to be filtered.\n      * @param modulus\n      *     The number of bytes wide each swathe is.\n      * @param offset\n      *     The offset within the swathe.\n      * @param width\n      *     The width of each stripe within the swathe.\n      */\n    input_filter_split(const input::pointer &deeper, int modulus,\n        int offset, int width);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param modulus\n      *     The number of bytes wide each swathe is.\n      * @param offset\n      *     The offset within the swathe.\n      * @param width\n      *     The width of each stripe within the swathe.\n      */\n    static pointer create(const input::pointer &deeper, int modulus,\n        int offset, int width);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The modulus instance variable is used to remember the number of\n      * bytes wide each swathe is.\n      */\n    record::address_t modulus;\n\n    /**\n      * The offset instance variable is used to remember the offset\n      * within the swathe.\n      */\n    record::address_t offset;\n\n    /**\n      * The width instance variable is used to remember the width of\n      * each stripe within the swathe.\n      */\n    record::address_t width;\n\n    /**\n      * The buffer instance variable is used to remember the last lot\n      * of data read from the deeper inputs source, and currently being\n      * processed.\n      */\n    record buffer;\n\n    /**\n      * The buffer_pos instance variable is used to remember where we\n      * are up to in the \"buffer\" instance varaible.\n      */\n    size_t buffer_pos;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_split();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_split(const input_filter_split &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_split &operator=(const input_filter_split &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_SPLIT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/unfill.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/input/filter/unfill.h>\n\n\nsrecord::input_filter_unfill::~input_filter_unfill()\n{\n}\n\n\nsrecord::input_filter_unfill::input_filter_unfill(\n        const srecord::input::pointer &a1, int a2, int a3) :\n    srecord::input_filter(a1),\n    fill_value(a2),\n    fill_minimum(a3),\n    buffer(),\n    buffer_pos(0)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_unfill::create(const input::pointer &a_deeper, int a2,\n    int a3)\n{\n    return pointer(new srecord::input_filter_unfill(a_deeper, a2, a3));\n}\n\n\nbool\nsrecord::input_filter_unfill::read(srecord::record &record)\n{\n    for (;;)\n    {\n        while\n        (\n            buffer.get_type() != srecord::record::type_data\n        ||\n            buffer_pos >= buffer.get_length()\n        )\n        {\n            if (!srecord::input_filter::read(buffer))\n                return false;\n            if (buffer.get_type() != srecord::record::type_data)\n            {\n                record = buffer;\n                return true;\n            }\n            buffer_pos = 0;\n        }\n\n        int first_pos = buffer_pos;\n        unsigned long addr = buffer.get_address() + buffer_pos;\n        unsigned char c = buffer.get_data(buffer_pos++);\n        if (c == fill_value)\n        {\n            //\n            // Let runs of fill characters go through,\n            // if the run is shorter than the minimum.\n            // This is so that single bytes can be left in,\n            // but long patches are thrown away.\n            //\n            while (buffer_pos < buffer.get_length())\n            {\n                c = buffer.get_data(buffer_pos);\n                if (c != fill_value)\n                    break;\n                ++buffer_pos;\n            }\n            if (buffer_pos - first_pos < fill_minimum)\n            {\n                record =\n                    srecord::record\n                    (\n                        srecord::record::type_data,\n                        addr,\n                        buffer.get_data() + first_pos,\n                        buffer_pos - first_pos\n                    );\n                return true;\n            }\n        }\n        else\n        {\n            //\n            // Let runs of non-fill characters go straight through.\n            //\n            while (buffer_pos < buffer.get_length())\n            {\n                c = buffer.get_data(buffer_pos);\n                if (c == fill_value)\n                    break;\n                ++buffer_pos;\n            }\n            record =\n                srecord::record\n                (\n                    srecord::record::type_data,\n                    addr,\n                    buffer.get_data() + first_pos,\n                    buffer_pos - first_pos\n                );\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/unfill.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2005-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_UNFILL_H\n#define SRECORD_INPUT_FILTER_UNFILL_H\n\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_unfill class is used to represent a filter\n  * which makes holes in the data wherever a specified data byte value\n  * appears.\n  *\n  * This is the inverse of the srecord::input_filter_fill class.\n  *\n  * Usually this is used to find the actual limits of data from an\n  * extracted EPROM image; you can specify a minimum run length of the\n  * same byte, so that you don't simply get a 1/256 reduction in density\n  * in the middle of \"real\" data.\n  */\nclass input_filter_unfill:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_unfill();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input source to be filtered.\n      * @param value\n      *     The value of the bytes to be turned into holes.\n      * @param minimum\n      *     The minimum run length to be considered a hole.\n      */\n    input_filter_unfill(const input::pointer &deeper, int value, int minimum);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param value\n      *     The value of the bytes to be turned into holes.\n      * @param minimum\n      *     The minimum run length to be considered a hole.\n      */\n    static pointer create(const input::pointer &deeper, int value, int minimum);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The fill_value instance variable is used to remember the value\n      * of the bytes to be turned into holes.\n      */\n    record::data_t fill_value;\n\n    /**\n      * The fill_minimum instance variable is used to remember the\n      * minimum run length to be considered a hole.\n      */\n    record::address_t fill_minimum;\n\n    /**\n      * The buffer instance variable is used to remember the data\n      * that has been read from the deeper input source and is being\n      * processed to unfill certain valued bytes.\n      */\n    record buffer;\n\n    /**\n      * The fill_value instance variable is used to remember where we\n      * are up to in the \"buffer\" instance variable.\n      */\n    size_t buffer_pos;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_unfill();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_unfill(const input_filter_unfill &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_unfill &operator=(const input_filter_unfill &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_UNFILL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/unsplit.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/unsplit.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_unsplit::~input_filter_unsplit()\n{\n}\n\n\nsrecord::input_filter_unsplit::input_filter_unsplit(\n        const srecord::input::pointer &a1, int a2, int a3, int a4) :\n    srecord::input_filter(a1),\n    modulus(a2),\n    offset(a3),\n    width(a4),\n    buffer(),\n    buffer_pos(0)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_unsplit::create(const input::pointer &a_deeper, int a2,\n    int a3, int a4)\n{\n    return pointer(new srecord::input_filter_unsplit(a_deeper, a2, a3, a4));\n}\n\n\nbool\nsrecord::input_filter_unsplit::read(srecord::record &record)\n{\n    for (;;)\n    {\n        while\n        (\n            buffer.get_type() != srecord::record::type_data\n        ||\n            buffer_pos >= buffer.get_length()\n        )\n        {\n            if (!srecord::input_filter::read(buffer))\n                return false;\n            if (buffer.get_type() != srecord::record::type_data)\n            {\n                record = buffer;\n                return true;\n            }\n            buffer_pos = 0;\n        }\n\n        unsigned long addr = buffer.get_address() + buffer_pos;\n        unsigned char c = buffer.get_data(buffer_pos++);\n        int phase = addr % width;\n        addr = (addr / width) * modulus + phase + offset;\n        record = srecord::record(srecord::record::type_data, addr, &c, 1);\n        return true;\n    }\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/unsplit.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_UNSPLIT_H\n#define SRECORD_INPUT_FILTER_UNSPLIT_H\n\n#include <srecord/input/filter.h>\n#include <srecord/record.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_unsplit class is used to represent a filter\n  * whoch explosed the deeper input source.  This is the inverse of the\n  * srecord::input_filter_split class.  This can be used to takes the images\n  * of thwo parallel EPROM images and create a unified image when they\n  * are interleaved rather than consecutive.\n  *\n  * @sa\n  *    srecord::input_filter_split\n  */\nclass input_filter_unsplit:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_unsplit();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input source to be filtered.\n      * @param modulus\n      *     The number of bytes wide each swathe is.\n      * @param offset\n      *     The offset within the swathe.\n      * @param width\n      *     The width of each stripe within the swathe.\n      */\n    input_filter_unsplit(const input::pointer &deeper, int modulus, int offset,\n        int width);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param modulus\n      *     The number of bytes wide each swathe is.\n      * @param offset\n      *     The offset within the swathe.\n      * @param width\n      *     The width of each stripe within the swathe.\n      */\n    static pointer create(const input::pointer &deeper, int modulus, int offset,\n        int width);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The modulus instance variable is used to remember the number of\n      * bytes wide each swathe is.\n      */\n    record::address_t modulus;\n\n    /**\n      * The offset instance variable is used to remember the offset\n      * within the swathe.\n      */\n    record::address_t offset;\n\n    /**\n      * The width instance variable is used to remember the width of\n      * each stripe within the swathe.\n      */\n    record::address_t width;\n\n    /**\n      * The buffer instance variable is used to remember the last lot\n      * of data read from the deeper inputs source, and currently being\n      * processed.\n      */\n    record buffer;\n\n    /**\n      * The buffer_pos instance variable is used to remember where we\n      * are up to in the \"buffer\" instance varaible.\n      */\n    size_t buffer_pos;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_unsplit();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_unsplit(const input_filter_unsplit &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_unsplit &operator=(const input_filter_unsplit &);\n};\n\n};\n\n#endif // SRECORD_INPUT_FILTER_UNSPLIT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/xor.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter/xor.h>\n#include <srecord/record.h>\n\n\nsrecord::input_filter_xor::~input_filter_xor()\n{\n}\n\n\nsrecord::input_filter_xor::input_filter_xor(const srecord::input::pointer &a1,\n        int a2) :\n    srecord::input_filter(a1),\n    value(a2)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_filter_xor::create(const input::pointer &a_deeper, int a_mask)\n{\n    return pointer(new srecord::input_filter_xor(a_deeper, a_mask));\n}\n\n\nbool\nsrecord::input_filter_xor::read(srecord::record &record)\n{\n    if (!srecord::input_filter::read(record))\n        return false;\n    if (record.get_type() == srecord::record::type_data)\n    {\n        for (size_t j = 0; j < record.get_length(); ++j)\n            record.set_data(j, record.get_data(j) ^ value);\n    }\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter/xor.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_XOR_H\n#define SRECORD_INPUT_FILTER_XOR_H\n\n#include <srecord/input/filter.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_filter_xor clas sis used to represent the input state\n  * of a filter which bit-wise XORs all incoming data bytes with a fixed\n  * value.\n  */\nclass input_filter_xor:\n    public input_filter\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter_xor();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param deeper\n      *     The deeper input to be used as a data source.\n      * @param value\n      *     The value to be bit-wise XORed with each incoming data byte.\n      */\n    input_filter_xor(const input::pointer &deeper, int value);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     The incoming data source to be filtered\n      * @param value\n      *     The value to be bit-wise XORed with each incoming data byte.\n      */\n    static pointer create(const input::pointer &deeper, int value);\n\nprotected:\n    // See base class for documentation.\n    bool read(record &record);\n\nprivate:\n    /**\n      * The value instance variable is used to remember the value to be\n      * bit-wise XORed with each incoming data byte.\n      */\n    int value;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter_xor();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter_xor(const input_filter_xor &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter_xor &operator=(const input_filter_xor &);\n};\n\n};\n\n\n#endif // SRECORD_INPUT_FILTER_XOR_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/filter.h>\n\n\nsrecord::input_filter::~input_filter()\n{\n}\n\n\nsrecord::input_filter::input_filter(srecord::input::pointer arg) :\n    ifp(arg)\n{\n}\n\n\nstd::string\nsrecord::input_filter::filename()\n    const\n{\n    return ifp->filename();\n}\n\n\nstd::string\nsrecord::input_filter::filename_and_line()\n    const\n{\n    return ifp->filename_and_line();\n}\n\n\nbool\nsrecord::input_filter::read(srecord::record &record)\n{\n    return ifp->read(record);\n}\n\n\nconst char *\nsrecord::input_filter::get_file_format_name()\n    const\n{\n    return ifp->get_file_format_name();\n}\n\n\nvoid\nsrecord::input_filter::disable_checksum_validation()\n{\n    ifp->disable_checksum_validation();\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/filter.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2005-2008, 2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_FILTER_H\n#define SRECORD_INPUT_FILTER_H\n\n\n#include <srecord/input.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_filter class is an abstract interface for all of the\n  * various filters that can be applied to an incoming EPROM file.\n  *\n  * Each filter is-a input, but each also has-a deeper input, from which\n  * is obtained the data to be filtered.\n  */\nclass input_filter:\n    public input\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_filter();\n\n    // See base class for documentation.\n    bool read(class record &record);\n\n    // See base class for documentation.\n    std::string filename() const;\n\n    // See base class for documentation.\n    std::string filename_and_line() const;\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\n    // See base class for documentation.\n    void disable_checksum_validation();\n\nprotected:\n    /**\n      * The constructor.  Only derived classes may call.\n      *\n      * @param deeper\n      *     The deeper input to be filtered.\n      */\n    input_filter(input::pointer deeper);\n\n    //\n    // I'd like this to be private, but srecord::input_filter_crc16 and\n    // srecord::input_filter_crc32 need to access it directly, rather than\n    // going through the srecord::input_filter::read method.\n    //\n    pointer ifp;\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_filter();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_filter(const input_filter &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_filter &operator=(const input_filter &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_FILTER_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator/constant.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n\n#include <srecord/input/generator/constant.h>\n\n\nsrecord::input_generator_constant::~input_generator_constant()\n{\n}\n\n\nsrecord::input_generator_constant::input_generator_constant(\n        const interval &a_range, unsigned char a_datum) :\n    srecord::input_generator(a_range),\n    datum(a_datum)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_generator_constant::create(const interval &a_range,\n    unsigned char a_datum)\n{\n    return pointer(new srecord::input_generator_constant(a_range, a_datum));\n}\n\n\nunsigned char\nsrecord::input_generator_constant::generate_data(unsigned long)\n{\n    return datum;\n}\n\n\nstd::string\nsrecord::input_generator_constant::filename()\n    const\n{\n    char buffer[20];\n    snprintf(buffer, sizeof(buffer), \"constant 0x%2.2X\", datum);\n    return buffer;\n}\n\n\nconst char *\nsrecord::input_generator_constant::get_file_format_name()\n    const\n{\n    return \"constant\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator/constant.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_GENERATOR_CONSTANT_H\n#define SRECORD_INPUT_GENERATOR_CONSTANT_H\n\n#include <srecord/input/generator.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_generator_constant class is used to represent the\n  * state of a data generator which supplies constant bytes.\n  */\nclass input_generator_constant:\n    public input_generator\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_generator_constant();\n\nprivate:\n    /**\n      * The constructor.\n      */\n    input_generator_constant(const interval &range, unsigned char datum);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      */\n    static pointer create(const interval &range, unsigned char datum);\n\nprotected:\n    // See base class for documentation.\n    std::string filename() const;\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\n    // See base class for documentation.\n    unsigned char generate_data(unsigned long address);\n\nprivate:\n    /**\n      * The datum instance variable is used to remember the constant\n      * byte value to be generated.\n      */\n    unsigned char datum;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_generator_constant();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_generator_constant(const input_generator_constant &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_generator_constant &operator=(const input_generator_constant &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_GENERATOR_CONSTANT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator/random.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/r250.h>\n#include <srecord/input/generator/random.h>\n\n\nsrecord::input_generator_random::~input_generator_random()\n{\n}\n\n\nsrecord::input_generator_random::input_generator_random(\n        const interval &a_range) :\n    srecord::input_generator(a_range)\n{\n}\n\n\nsrecord::input::pointer\nsrecord::input_generator_random::create(const interval &a_range)\n{\n    return pointer(new srecord::input_generator_random(a_range));\n}\n\n\nunsigned char\nsrecord::input_generator_random::generate_data(unsigned long)\n{\n    return r250();\n}\n\n\nstd::string\nsrecord::input_generator_random::filename()\n    const\n{\n    return \"random\";\n}\n\n\nconst char *\nsrecord::input_generator_random::get_file_format_name()\n    const\n{\n    return \"random\";\n}\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator/random.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_GENERATOR_RANDOM_H\n#define SRECORD_INPUT_GENERATOR_RANDOM_H\n\n#include <srecord/input/generator.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_generator_random class is used to represent a factory\n  * which manufactures random data.\n  */\nclass input_generator_random:\n    public input_generator\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_generator_random();\n\nprivate:\n    /**\n      * The constructor.\n      */\n    input_generator_random(const interval &range);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      */\n    static pointer create(const interval &range);\n\nprotected:\n    // See base class for documentation.\n    std::string filename() const;\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\n    // See base class for documentation.\n    unsigned char generate_data(unsigned long address);\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_generator_random();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_generator_random(const input_generator_random &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_generator_random &operator=(const input_generator_random &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_GENERATOR_RANDOM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator/repeat.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/input/generator/repeat.h>\n\n\nsrecord::input_generator_repeat::~input_generator_repeat()\n{\n    delete [] data;\n}\n\n\nsrecord::input_generator_repeat::input_generator_repeat(\n        const interval &a_range, unsigned char *a_data, size_t a_length) :\n    srecord::input_generator(a_range),\n    address(a_range.get_lowest()),\n    data(0),\n    length(a_length)\n{\n    // assert(length > 0);\n    data = new unsigned char [length];\n    for (size_t j = 0; j < length; ++j)\n        data[j] = a_data[j];\n}\n\n\nsrecord::input::pointer\nsrecord::input_generator_repeat::create(const interval &a_range,\n    unsigned char *a_data, size_t a_length)\n{\n    return\n        pointer(new srecord::input_generator_repeat(a_range, a_data, a_length));\n}\n\n\nunsigned char\nsrecord::input_generator_repeat::generate_data(unsigned long addr)\n{\n    return data[(addr - address) % length];\n}\n\n\nstd::string\nsrecord::input_generator_repeat::filename()\n    const\n{\n    return \"generate repeat data\";\n}\n\n\nconst char *\nsrecord::input_generator_repeat::get_file_format_name()\n    const\n{\n    return \"generate repeat data\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator/repeat.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_GENERATOR_REPEAT_H\n#define SRECORD_INPUT_GENERATOR_REPEAT_H\n\n#include <srecord/input/generator.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_generator_repeat class is used to represent\n  * generating data which cycles over a fixed set of byte values.\n  */\nclass input_generator_repeat:\n    public input_generator\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_generator_repeat();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param range\n      *     The address range over which to generate data.\n      * @param data\n      *     Pointer to the base of an array of data to be repeated.\n      * @param length\n      *     The length of the array of data to be repeated.\n      */\n    input_generator_repeat(const interval &range, unsigned char *data,\n        size_t length);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param range\n      *     The address range over which to generate data.\n      * @param data\n      *     Pointer to the base of an array of data to be repeated.\n      * @param length\n      *     The length of the array of data to be repeated.\n      */\n    static pointer create(const interval &range, unsigned char *data,\n        size_t length);\n\nprotected:\n    // See base class for documentation.\n    unsigned char generate_data(unsigned long address);\n\n    // See base class for documentation.\n    std::string filename() const;\n\n    // See base class for documentation.\n    const char *get_file_format_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember the start of\n      * the generated data, so that modulo arithmentic will align the\n      * data repeats.\n      */\n    unsigned long address;\n\n    /**\n      * The data instance variable is used to remember the base of a\n      * dynamically allocated array of data to be repeated.\n      */\n    unsigned char *data;\n\n    /**\n      * The length instance variable is used to remember the lenth of\n      * the dynamically allocated array of data to be repeated.\n      */\n    size_t length;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    input_generator_repeat();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input_generator_repeat(const input_generator_repeat &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input_generator_repeat &operator=(const input_generator_repeat &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_GENERATOR_REPEAT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007-2010, 2013, 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/input/generator.h>\n#include <srecord/input/generator/constant.h>\n#include <srecord/input/generator/random.h>\n#include <srecord/input/generator/repeat.h>\n#include <srecord/record.h>\n#include <srecord/string.h>\n\n\nsrecord::input_generator::~input_generator()\n{\n}\n\n\nsrecord::input_generator::input_generator(const interval &a_range) :\n    range(a_range)\n{\n}\n\n\nbool\nsrecord::input_generator::read(srecord::record &result)\n{\n    //\n    // If there is not data left to generate,\n    // signal end-of-file\n    //\n    if (range.empty())\n        return false;\n\n    //\n    // Calculate the address range for this chunk of data.  Use the\n    // biggest record size available.\n    //\n    unsigned long addr = range.get_lowest();\n    interval partial(addr, addr + srecord::record::max_data_length);\n    partial *= range;\n\n    //\n    // Only supply the first sub-interval, if the generation range has\n    // holes in it.\n    //\n    partial.first_interval_only();\n\n    //\n    // Generate the data and build the result record.\n    //\n    result.set_type(srecord::record::type_data);\n    result.set_address(addr);\n    result.set_length(1);\n    interval::data_t size = partial.get_highest() - addr;\n    for (interval::data_t j = 0; j < size; ++j)\n    {\n        result.set_data_extend(j, generate_data(addr + j));\n    }\n\n    //\n    // Reduce the amount of data left to be generated.\n    //\n    range -= partial;\n\n    //\n    // Report that another record is available.\n    //\n    return true;\n}\n\n\nsrecord::input::pointer\nsrecord::input_generator::create(srecord::arglex_tool *cmdln)\n{\n    interval range = cmdln->get_interval_small(\"--generate\");\n    srecord::input::pointer result;\n    switch (cmdln->token_cur())\n    {\n    case srecord::arglex_tool::token_constant_be:\n        {\n            cmdln->token_next();\n            unsigned long datum =\n                cmdln->get_number(\"--generate --b-e-constant <datum>\");\n            int length =\n                cmdln->get_number(\"--generate --b-e-constant <length>\");\n            if (length <= 0 || length > 4)\n            {\n                cmdln->fatal_error\n                (\n                    \"length %d out of range [1..4]\",\n                    length\n                );\n            }\n            unsigned long over = (1uL << (8u * length)) - 1;\n            if (length < 4 && datum > over)\n            {\n                cmdln->fatal_error\n                (\n                    \"datum %lu out of range [0..%lu]\",\n                    datum,\n                    over\n                );\n            }\n            unsigned char data[4];\n            data[3] = datum;\n            data[2] = datum >> 8;\n            data[1] = datum >> 16;\n            data[0] = datum >> 24;\n            result =\n                srecord::input_generator_repeat::create\n                (\n                    range,\n                    data + 4 - length,\n                    length\n                );\n        }\n        break;\n\n    case srecord::arglex_tool::token_constant_le:\n        {\n            cmdln->token_next();\n            unsigned long datum =\n                cmdln->get_number(\"--generate --l-e-constant <datum>\");\n            int length =\n                cmdln->get_number(\"--generate --l-e-constant <length>\");\n            if (length <= 0 || length > 4)\n            {\n                cmdln->fatal_error\n                (\n                    \"length %d out of range [1..4]\",\n                    length\n                );\n            }\n            unsigned long over = (1uL << (8u * length)) - 1;\n            if (length < 4 && datum > over)\n            {\n                cmdln->fatal_error\n                (\n                    \"datum %lu out of range [0..%lu]\",\n                    datum,\n                    over\n                );\n            }\n            unsigned char data[4];\n            data[0] = datum;\n            data[1] = datum >> 8;\n            data[2] = datum >> 16;\n            data[3] = datum >> 24;\n            result = input_generator_repeat::create(range, data, length);\n        }\n        break;\n\n    case srecord::arglex_tool::token_constant:\n        {\n            cmdln->token_next();\n            int n = cmdln->get_number(\"--generate --constant\");\n            if (n < 0 || n > 255)\n            {\n                cmdln->fatal_error\n                (\n                    \"data byte %d out of range [0..255]\",\n                    n\n                );\n            }\n            result = srecord::input_generator_constant::create(range, n);\n        }\n        break;\n\n    case srecord::arglex_tool::token_random:\n        {\n            cmdln->token_next();\n            result = srecord::input_generator_random::create(range);\n        }\n        break;\n\n    case srecord::arglex_tool::token_repeat_data:\n        {\n            cmdln->token_next();\n            size_t length = 0;\n            size_t maxlen = 16;\n            unsigned char *data = new unsigned char [maxlen];\n            for (;;)\n            {\n                //\n                // Get the next byte value from the command line\n                // (there must be at least one).\n                //\n                long byte_value = cmdln->get_number(\"--repeat-data\");\n\n                //\n                // Make sure there is room for the next byte in the data array\n                //\n                if (length >= maxlen)\n                {\n                    size_t new_maxlen = maxlen * 2 + 16;\n                    unsigned char *new_data = new unsigned char [new_maxlen];\n                    memcpy(new_data, data, length);\n                    delete [] data;\n                    data = new_data;\n                    maxlen = new_maxlen;\n                }\n                if (byte_value < 0 || byte_value > 255)\n                {\n                    cmdln->fatal_error\n                    (\n                        \"data byte %ld out of range [0..255]\",\n                        byte_value\n                    );\n                }\n\n                //\n                // Stash this byte\n                //\n                data[length++] = byte_value;\n\n                //\n                // If there are no more numbers on the command line, we\n                // are done.\n                //\n                if (!cmdln->can_get_number())\n                    break;\n            }\n\n            //\n            // Build our new input data source.\n            //\n            if (length == 1)\n            {\n                result = input_generator_constant::create(range, data[0]);\n            }\n            else\n            {\n                result = input_generator_repeat::create(range, data, length);\n            }\n            delete [] data;\n        }\n        break;\n\n    case srecord::arglex_tool::token_repeat_string:\n        {\n            cmdln->token_next();\n            std::string s = cmdln->get_string(\"--repeat-string\");\n\n            // The users may use %nn on the command line,\n            // but we store a byte 0xnn in the header.\n            s = srecord::string_url_decode(s);\n\n            size_t len = s.size();\n            switch (len)\n            {\n            case 0:\n                cmdln->fatal_error(\"--repeat-string value may not be empty\");\n                // NOTREACHED\n\n            case 1:\n                result = srecord::input_generator_constant::create(range, s[0]);\n                break;\n\n            default:\n                result =\n                    srecord::input_generator_repeat::create\n                    (\n                        range,\n                        (unsigned char *)s.c_str(),\n                        s.size()\n                    );\n                break;\n            }\n        }\n        break;\n\n    default:\n        cmdln->fatal_error\n        (\n            \"the --generate option needs to be followed by a generation \"\n                \"type (e.g. --constant)\"\n        );\n        // NOTREACHED\n    }\n    return result;\n}\n\n\nvoid\nsrecord::input_generator::disable_checksum_validation()\n{\n    // Do nothing.\n    // None of the generators have checksums.\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/generator.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_GENERATOR_H\n#define SRECORD_INPUT_GENERATOR_H\n\n#include <srecord/input.h>\n#include <srecord/interval.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::input_generator class is used to represent the state of\n  * generating data from whole cloth.\n  */\nclass input_generator:\n    public input\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~input_generator();\n\n    /**\n      * The constructor.\n      *\n      * @param range\n      *     The data range over which data is to be generated.\n      */\n    input_generator(const interval &range);\n\n    /**\n      * The create class method may be used to create new instances of\n      * input data generators.\n      *\n      * @param cmdln\n      *     The command line arguments, for deciding what to generate.\n      */\n    static input::pointer create(arglex_tool *cmdln);\n\nprotected:\n    // See base class for documentation\n    bool read(record &record);\n\n    // See base class for documentation\n    void disable_checksum_validation();\n\n    /**\n      * The generate_data method is used to manufacture data for a\n      * specific address.\n      *\n      * @param address\n      *     The address to generate data for.\n      * @returns\n      *     one byte of data\n      */\n    virtual unsigned char generate_data(unsigned long address) = 0;\n\nprivate:\n    /**\n      * The range instance variable is used to remember the address\n      * range over which we are to generate data.  It shrinks as the\n      * data is generated.\n      */\n    interval range;\n\n    /**\n      * The default constructor.\n      */\n    input_generator();\n\n    /**\n      * The copy constructor.\n      */\n    input_generator(const input_generator &);\n\n    /**\n      * The assignment operator.\n      */\n    input_generator &operator=(const input_generator &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_GENERATOR_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/interval.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n#include <srecord/input.h>\n#include <srecord/input/interval.h>\n#include <srecord/record.h>\n\n\nsrecord::interval\nsrecord::input_interval(srecord::input::pointer ifp)\n{\n    interval range;\n    srecord::record record;\n    while (ifp->read(record))\n    {\n        if (record.get_type() != srecord::record::type_data)\n            continue;\n        range +=\n            interval\n            (\n                record.get_address(),\n                record.get_address() + record.get_length()\n            );\n    }\n    return range;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input/interval.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_INTERVAL_H\n#define SRECORD_INPUT_INTERVAL_H\n\n#include <srecord/interval.h>\n#include <srecord/input.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::input_interval function is used to read an input stream and\n  * build an interval based on the addresses which contain data within\n  * the input.\n  */\ninterval input_interval(srecord::input::pointer);\n\n};\n\n#endif // SRECORD_INPUT_INTERVAL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <errno.h>\n#include <iostream>\n#include <cstring>\n\n#include <srecord/input.h>\n#include <srecord/record.h>\n#include <srecord/quit/prefix.h>\n\n\nsrecord::input::input() :\n    quitter(&quit_default)\n{\n}\n\n\nsrecord::input::~input()\n{\n}\n\n\nvoid\nsrecord::input::fatal_error(const char *fmt, ...)\n    const\n{\n    va_list ap;\n    va_start(ap, fmt);\n    quit_prefix blab(*quitter, filename_and_line());\n    blab.fatal_error_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::input::fatal_error_errno(const char *fmt, ...)\n    const\n{\n    va_list ap;\n    va_start(ap, fmt);\n    quit_prefix blab(*quitter, filename_and_line());\n    blab.fatal_error_errno_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::input::warning(const char *fmt, ...)\n    const\n{\n    va_list ap;\n    va_start(ap, fmt);\n    quit_prefix blab(*quitter, filename_and_line());\n    blab.warning_v(fmt, ap);\n    va_end(ap);\n}\n\n\nstd::string\nsrecord::input::filename_and_line()\n    const\n{\n    return filename();\n}\n\n\nvoid\nsrecord::input::set_quit(quit &arg)\n{\n    quitter = &arg;\n}\n\n\nvoid\nsrecord::input::reset_quit()\n{\n    quitter = &quit_default;\n}\n\n\nvoid\nsrecord::input::command_line(srecord::arglex_tool *)\n{\n    // Do nothing.\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/input.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2005-2008, 2010, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INPUT_H\n#define SRECORD_INPUT_H\n\n#include <string>\n#include <stdarg.h>\n#include <boost/shared_ptr.hpp>\n\n#include <srecord/format_printf.h>\n\nnamespace srecord {\n\nclass arglex_tool; // forward\nclass quit; // forward\n\n/**\n  * The srecord::input class is used to represent an abstract EPROM load\n  * file source.  It could be one of many file formats, or a chain of\n  * filters applied to an input file.\n  */\nclass input\n{\npublic:\n    typedef boost::shared_ptr<input> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~input();\n\n    /**\n      * The read method is used to read one record from the input.\n      * It returns 0 at the end of the input, and 1 if a record is\n      * read successfully.\n      *\n      * See the srecord::record documentation (header file) for details\n      * of the various record types.\n      *\n      * Note: there is no guarantee that a header record will appear\n      * first, or that a execution start address record will appear last.\n      *\n      * @param rec\n      *     Where to put the returned data.\n      * @returns\n      *     bool; true if data was read, false if at end-of-file\n      */\n    virtual bool read(class record &rec) = 0;\n\n    /**\n      * The fatal_error method is used to report problems parsing\n      * the file.  Do not put a newline at the end of the message.\n      * Usually called from within derived class methods.  This method\n      * does not return.\n      *\n      * The file name and line number are automatically included\n      * in the message.  The filename_and_line method is called to\n      * determine them.\n      */\n    virtual void fatal_error(const char *, ...) const\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The fatal_error_errno method is used to report problems\n      * reading the input file.  Do not put a newline at the end\n      * of the message.  The string equivalent of errno is appended\n      * to the error message.  This method does not return.\n      *\n      * The file name and line number are automatically included\n      * in the message.  The filename_and_line method is called to\n      * determine them.\n      */\n    virtual void fatal_error_errno(const char *, ...) const\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The warning method is used to report potential (but non-fatal)\n      * problems parsing the file.      Do not put a newline at the\n      * end of the message.  Usually called from within derived\n      * class methods.\n      *\n      * The file name and line number are automatically included\n      * in the message.  The filename_and_line method is called to\n      * determine them.\n      */\n    virtual void warning(const char *, ...) const\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The filename method is used to get the name of the input file\n      * being processed.  Derived classes must supply this method.\n      */\n    virtual std::string filename(void) const = 0;\n\n    /**\n      * The filename_and_line method is used to get the name\n      * and current line number within the file.  The default\n      * implementation simply calls the filename method and returns\n      * that.  Text formats should be cleverer.\n      */\n    virtual std::string filename_and_line(void) const;\n\n    /**\n      * The get_file_format_name method is used to find out the name\n      * of the file format being read.  Derived classes must supply\n      * this method.\n      */\n    virtual const char *get_file_format_name(void) const = 0;\n\n    /**\n      * The set_quit method is used to set the disposition of the\n      * error messages, and the \"exit\" implementation.  The default\n      * is to write error messages on the standard error, and to\n      * exit using the standard C exit function.\n      */\n    void set_quit(quit &);\n\n    /**\n      * The reset_quit method is used to cause the disposition of\n      * the error messages, and the \"exit\" back to the default.\n      */\n    void reset_quit(void);\n\n    /**\n      * The disable_checksum_validation method is used to have this\n      * input stream ignore checksum errors.\n      */\n    virtual void disable_checksum_validation(void) = 0;\n\n    /**\n      * The command_line method is used by arglex_srec::get_input\n      * when parsing the command line, to give a format or filter an\n      * opportunity to grab extra arguments off the command line.  The\n      * default implementation does nothing.\n      *\n      * @param cmdln\n      *     Where to obtain information about the curreent parse state\n      *     of the command line.\n      */\n    virtual void command_line(srecord::arglex_tool *cmdln);\n\nprivate:\n    /**\n      * The quitter instance variable is used to remember how to quit.\n      * It is set by the set_quit and reset_quit.  It is used by\n      * the fatal_error, fatal_error_with_errno and warning methods.\n      */\n    quit *quitter;\n\nprotected:\n    /**\n      * The default constructor.  Only derived classes may call.\n      */\n    input();\n\nprivate:\n    /**\n      * The copy constructor.  Do not use.\n      */\n    input(const input &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    input &operator=(const input &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_INPUT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/interval/coverage.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n\n\nsrecord::interval::long_data_t\nsrecord::interval::coverage()\n    const\n{\n    long_data_t total = 0;\n    for (size_t j = 0; j < length; j+= 2)\n    {\n        long_data_t lo = data[j];\n        long_data_t hi =\n            (data[j + 1] == 0 ? ((long_data_t)1 << 32) : data[j + 1]);\n        total += (hi - lo);\n    }\n    return total;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/interval/flatten.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/interval.h>\n\n\nsrecord::interval\nsrecord::interval::flatten()\n    const\n{\n    if (length <= 2)\n        return *this;\n    return interval(get_lowest(), get_highest());\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/interval.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2004-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <iostream>\n\n#include <srecord/interval.h>\n\n\n//\n// NAME\n//      interval_create_empty - create an empty interval\n//\n// SYNOPSIS\n//      interval_ty *interval_create_empty(void);\n//\n// DESCRIPTION\n//      The interval_create_empty function is used to create\n//      an empty interval.\n//\n// RETURNS\n//      a pointer to the new interval in dynamic memory\n//\n// CAVEAT\n//      It is the responsibility of the caller to release the\n//      interval to dynamic memory when no longer required.\n//      Use the interval_free function for this purpose.\n//\n\nsrecord::interval::interval()\n{\n    length = 0;\n    size = 0;\n    scan_index = 0;\n    scan_next_datum = 0;\n    data = 0;\n    // assert(valid());\n}\n\n\nstatic inline srecord::interval::long_data_t\npromote(srecord::interval::data_t datum, size_t pos)\n{\n    if (datum == 0 && (pos & 1))\n        return ((srecord::interval::long_data_t)1 << 32);\n    return datum;\n}\n\n\n//\n// NAME\n//      interval_create_range - create a single range interval\n//\n// SYNOPSIS\n//      interval_ty *interval_create_range(interval_data_ty first,\n//          interval_data_ty last);\n//\n// DESCRIPTION\n//      The interval_create_range function is used to create an interval\n//      consisting of a single range, from first to last inclusive.\n//\n// ARGUMENTS\n//      first   - the start of the range\n//      last    - the end of the range (inclusive)\n//\n// RETURNS\n//      a pointer to the new interval in dynamic memory\n//\n// CAVEAT\n//      It is the responsibility of the caller to release the\n//      interval to dynamic memory when no longer required.\n//      Use the interval_free function for this purpose.\n//\n\nsrecord::interval::interval(data_t first, data_t last)\n{\n    length = 2;\n    size = 8;\n    data = new data_t[size + 1];\n    scan_index = 0;\n    scan_next_datum = 0;\n    if (first <= promote(last, 1))\n    {\n        data[0] = first;\n        data[1] = last;\n    }\n    else\n    {\n        data[0] = last;\n        data[1] = first;\n    }\n    data[2] = 2;\n    // assert(valid());\n}\n\n\nsrecord::interval::interval(data_t first)\n{\n    length = 2;\n    size = 8;\n    data = new data_t[size + 1];\n    scan_index = 0;\n    scan_next_datum = 0;\n    data[0] = first;\n    data[1] = first + 1;\n    data[2] = 2;\n    // assert(valid());\n}\n\n\nsrecord::interval::interval(const interval &arg)\n{\n    // assert(arg.valid());\n    length = arg.length;\n    size = length;\n    scan_index = 0;\n    scan_next_datum = 0;\n    if (size)\n    {\n        data = new data_t[size + 1];\n        for (size_t j = 0; j <= length; ++j)\n            data[j] = arg.data[j];\n    }\n    else\n        data = 0;\n    // assert(valid());\n}\n\n\nsrecord::interval &\nsrecord::interval::operator=(const interval &arg)\n{\n    if (this != &arg)\n    {\n        if (data)\n        {\n            delete [] data;\n            data = 0;\n        }\n        // assert(arg.valid());\n        length = arg.length;\n        size = length;\n        scan_index = 0;\n        scan_next_datum = 0;\n        if (size)\n        {\n            data = new data_t[size + 1];\n            for (size_t j = 0; j <= length; ++j)\n                data[j] = arg.data[j];\n        }\n        else\n            data = 0;\n        // assert(valid());\n    }\n    return *this;\n}\n\n\n//\n// NAME\n//      interval_free - release interval memory\n//\n// SYNOPSIS\n//      void interval_free(interval_ty *ip);\n//\n// DESCRIPTION\n//      The interval_free function is used to release the dynamic\n//      memory used by an interval back to the dynamic memory pool.\n//\n// ARGUMENTS\n//      ip      - the interval to release\n//\n\nsrecord::interval::~interval()\n{\n    // assert(valid());\n    if (data)\n    {\n        delete [] data;\n        data = 0;\n    }\n}\n\n\n//\n// NAME\n//      interval_valid - internal consistency check\n//\n// SYNOPSIS\n//      int interval_valid(interval_ty *ip);\n//\n// DESCRIPTION\n//      The interval_valid function is used to check the internal\n//      consistency of an interval.\n//\n// ARGUMENTS\n//      ip      - pointer to interval to check\n//\n// RETURNS\n//      int     1 if interval is valid\n//              0 if interval is not valid\n//\n// CAVEAT\n//      This function is only available if DEBUG is defined,\n//      and is intended for use in assert() statements.\n//\n\nbool\nsrecord::interval::valid()\n    const\n{\n    if (length > size)\n        return false;\n    if (length & 1)\n        return false;\n    if ((size == 0) != (data == 0))\n        return false;\n    if (length == 0)\n        return true;\n    if (data[length] != length)\n        return false;\n\n    //\n    // As a special case, an upper bound of zero means\n    // positive infinity.  It has to be the last one.\n    //\n    size_t max = length;\n    if (data[max - 1] == 0)\n        --max;\n\n    for (size_t j = 1; j < max; ++j)\n        if (data[j - 1] >= data[j])\n            return false;\n    return true;\n}\n\n\n//\n// NAME\n//      append - append datum to interval data\n//\n// SYNOPSIS\n//      void append(interval_ty **ipp, interval_data_ty datum);\n//\n// DESCRIPTION\n//      The append function is used to append a datum to\n//      the end of an interval under construction.\n//\n// ARGUMENTS\n//      ipp     - pointer to inerval pointer.\n//      datum   - value to append.\n//\n// CAVEAT\n//      The interval may move in dynamic memory, with is why ** is used.\n//      The interval will need to be normalized before you\n//      next use interval_valid.\n//\n\nvoid\nsrecord::interval::append(data_t datum)\n{\n    //\n    // should always be increasing\n    //\n    // assert(length < 1 || promote(datum, length) >=\n    //  promote(data[length - 1], length - 1));\n\n    //\n    // make it larger if necessary\n    //\n    if (length >= size)\n    {\n        size = size * 2 + 8;\n        data_t *tmp = new data_t[size + 1];\n        if (data)\n        {\n            for (size_t k = 0; k < length; ++k)\n                tmp[k] = data[k];\n            delete [] data;\n        }\n        data = tmp;\n    }\n\n    //\n    // remeber the datum\n    //\n    data[length++] = datum;\n\n    //\n    // elide empty sequences\n    //\n    // See the comment for the \"data\" instance variable; it is a\n    // series of [lo, hi) pairs.\n    //\n    // There are two cases here\n    //   length is odd:   [a, b) [b, ???)  -->   [a, ???)\n    //   length is even:  [a, a)           -->   {}\n    // Either way, discard the last two elements.\n    //\n    if (length >= 2 && data[length - 1] == data[length - 2])\n        length -= 2;\n}\n\n\n//\n// NAME\n//      interval_union - union of two intervals\n//\n// SYNOPSIS\n//      interval_ty *interval_union(interval_ty *left, interval_ty *right);\n//\n// DESCRIPTION\n//      The interval_union function is used to form the\n//      union of two intervals.\n//\n// ARGUMENTS\n//      left    - interval to be unioned with\n//      right   - another interval\n//\n// RETURNS\n//      a pointer to the new interval in dynamic memory\n//\n// CAVEAT\n//      It is the responsibility of the caller to release the\n//      interval to dynamic memory when no longer required.\n//      Use the interval_free function for this purpose.\n//\n\nsrecord::interval\nsrecord::interval::union_(const interval &left, const interval &right)\n{\n    // assert(left.valid());\n    // assert(right.valid());\n    interval result;\n    size_t left_pos = 0;\n    size_t right_pos = 0;\n    int count = 0;\n    for (;;)\n    {\n        int old_count = count;\n        data_t place;\n        if (left_pos < left.length)\n        {\n            if (right_pos < right.length)\n            {\n                long_data_t left_val =\n                    promote(left.data[left_pos], left_pos);\n                long_data_t right_val =\n                    promote(right.data[right_pos], right_pos);\n                if (left_val < right_val)\n                {\n                    count += (left_pos & 1 ? -1 : 1);\n                    place = left.data[left_pos++];\n                }\n                else\n                {\n                    count += (right_pos & 1 ? -1 : 1);\n                    place = right.data[right_pos++];\n                }\n            }\n            else\n            {\n                count += (left_pos & 1 ? -1 : 1);\n                place = left.data[left_pos++];\n            }\n        }\n        else\n        {\n            if (right_pos < right.length)\n            {\n                count += (right_pos & 1 ? -1 : 1);\n                place = right.data[right_pos++];\n            }\n            else\n                break;\n        }\n        if ((count >= 1) != (old_count >= 1))\n            result.append(place);\n    }\n    if (result.length)\n        result.data[result.length] = result.length;\n    // assert(result.valid());\n    return result;\n}\n\n\n//\n// NAME\n//      interval_intersection - intersection of two intervals\n//\n// SYNOPSIS\n//      interval_ty *interval_intersection(interval_ty *left,\n//          interval_ty *right);\n//\n// DESCRIPTION\n//      The interval_intersection function is used to form the\n//      intersection of two intervals.\n//\n// ARGUMENTS\n//      left    - interval to be intersected with\n//      right   - another interval\n//\n// RETURNS\n//      a pointer to the new interval in dynamic memory\n//\n// CAVEAT\n//      It is the responsibility of the caller to release the\n//      interval to dynamic memory when no longer required.\n//      Use the interval_free function for this purpose.\n//\n\nsrecord::interval\nsrecord::interval::intersection(const interval &left, const interval &right)\n{\n    // assert(left.valid());\n    // assert(right.valid());\n    interval result;\n    size_t left_pos = 0;\n    size_t right_pos = 0;\n    int count = 0;\n    for (;;)\n    {\n        int old_count = count;\n        data_t place;\n        if (left_pos < left.length)\n        {\n            if (right_pos < right.length)\n            {\n                long_data_t left_val =\n                    promote(left.data[left_pos], left_pos);\n                long_data_t right_val =\n                    promote(right.data[right_pos], right_pos);\n                if (left_val < right_val)\n                {\n                    count += (left_pos & 1 ? -1 : 1);\n                    place = left.data[left_pos++];\n                }\n                else\n                {\n                    count += (right_pos & 1 ? -1 : 1);\n                    place = right.data[right_pos++];\n                }\n            }\n            else\n            {\n                count += (left_pos & 1 ? -1 : 1);\n                place = left.data[left_pos++];\n            }\n        }\n        else\n        {\n            if (right_pos < right.length)\n            {\n                count += (right_pos & 1 ? -1 : 1);\n                place = right.data[right_pos++];\n            }\n            else\n                break;\n        }\n        if ((count >= 2) != (old_count >= 2))\n            result.append(place);\n    }\n    if (result.length)\n        result.data[result.length] = result.length;\n    // assert(result.valid());\n    return result;\n}\n\n\n//\n// NAME\n//      interval_difference - difference of two intervals\n//\n// SYNOPSIS\n//      interval_ty *interval_difference(interval_ty *left, interval_ty *right);\n//\n// DESCRIPTION\n//      The interval_difference function is used to form the\n//      difference of two intervals.\n//\n// ARGUMENTS\n//      left    - interval to take things out of\n//      right   - things to take out of it\n//\n// RETURNS\n//      a pointer to the new interval in dynamic memory\n//\n// CAVEAT\n//      It is the responsibility of the caller to release the\n//      interval to dynamic memory when no longer required.\n//      Use the interval_free function for this purpose.\n//\n\nsrecord::interval\nsrecord::interval::difference(const interval &left, const interval &right)\n{\n    // assert(left.valid());\n    // assert(right.valid());\n    interval result;\n    size_t left_pos = 0;\n    size_t right_pos = 0;\n    int count = 0;\n    for (;;)\n    {\n        int old_count = count;\n        data_t place;\n        if (left_pos < left.length)\n        {\n            if (right_pos < right.length)\n            {\n                long_data_t left_val = promote(left.data[left_pos], left_pos);\n                long_data_t right_val =\n                    promote(right.data[right_pos], right_pos);\n                if (left_val < right_val)\n                {\n                    count += (left_pos & 1 ? -1 : 1);\n                    place = left.data[left_pos++];\n                }\n                else\n                {\n                    count -= (right_pos & 1 ? -1 : 1);\n                    place = right.data[right_pos++];\n                }\n            }\n            else\n            {\n                count += (left_pos & 1 ? -1 : 1);\n                place = left.data[left_pos++];\n            }\n        }\n        else\n        {\n            if (right_pos < right.length)\n            {\n                count -= (right_pos & 1 ? -1 : 1);\n                place = right.data[right_pos++];\n            }\n            else\n                break;\n        }\n        if ((count >= 1) != (old_count >= 1))\n            result.append(place);\n    }\n    if (result.length)\n        result.data[result.length] = result.length;\n    // assert(result.valid());\n    return result;\n}\n\n\n//\n// NAME\n//      interval_member - test for membership\n//\n// SYNOPSIS\n//      int interval_member(interval_ty *, interval_data_ty datum);\n//\n// DESCRIPTION\n//      The interval_member function is used to test if a particular\n//      datum is included in an interval.\n//\n// ARGUMENTS\n//      ip      - interval to test\n//      datum   - value to test for\n//\n// RETURNS\n//      int     1 if is a member\n//              0 if is not a member\n//\n\nbool\nsrecord::interval::member(data_t datum)\n    const\n{\n    if (length == 0)\n        return false;\n    // assert(valid());\n    long min = 0;\n    long max = length - 2;\n    while (min <= max)\n    {\n        long mid = ((min + max) / 2) & ~1;\n        data_t lo = data[mid];\n        long_data_t hi = promote(data[mid + 1], mid + 1);\n        if (lo <= datum && datum < hi)\n            return true;\n        if (lo < datum)\n            min = mid + 2;\n        else\n            max = mid - 2;\n    }\n    return false;\n}\n\n\n//\n// NAME\n//      interval_scan_begin\n//\n// SYNOPSIS\n//      void interval_scan_begin(interval_ty *ip);\n//\n// DESCRIPTION\n//      The interval_scan_begin function is used to\n//      start traversing every datum in the interval.\n//\n// ARGUMENTS\n//      ip      - interval to scan\n//\n\nvoid\nsrecord::interval::scan_begin()\n{\n    // assert(valid());\n    // assert(!scan_index);\n    scan_index = 1;\n    if (length)\n        scan_next_datum = data[0];\n    else\n        scan_next_datum = 0;\n}\n\n\n//\n// NAME\n//      interval_scan_next\n//\n// SYNOPSIS\n//      int interval_scan_next(interval_ty *ip, interval_data_ty *datum);\n//\n// DESCRIPTION\n//      The interval_scan_next function is used to\n//      traverse every datum in the interval.\n//\n// ARGUMENTS\n//      ip      - interval to scan\n//      datum   - pointer to where to place datum\n//\n// RETURNS\n//      int     1 if datum available\n//              0 if reached end of interval\n//\n\nbool\nsrecord::interval::scan_next(data_t &datum)\n{\n    // assert(valid());\n    // assert(scan_index & 1);\n    if (scan_index >= length)\n        return false;\n    if (scan_next_datum >= promote(data[scan_index], scan_index))\n    {\n        scan_index += 2;\n        if (scan_index >= length)\n            return false;\n        scan_next_datum = data[scan_index - 1];\n    }\n    datum = scan_next_datum++;\n    return true;\n}\n\n\n//\n// NAME\n//      interval_scan_end\n//\n// SYNOPSIS\n//      void interval_scan_end(interval_ty *ip);\n//\n// DESCRIPTION\n//      The interval_scan_end function is used to\n//      finish traversing every datum in the interval.\n//\n// ARGUMENTS\n//      ip      - interval to scan\n//\n\nvoid\nsrecord::interval::scan_end()\n{\n    // assert(valid());\n    // assert(scan_index & 1);\n    scan_index = 0;\n    scan_next_datum = 0;\n}\n\n\nvoid\nsrecord::interval::first_interval_only()\n{\n    // assert(valid());\n    if (length > 2)\n    {\n        length = 2;\n        data[length] = length;\n    }\n}\n\n\nbool\nsrecord::interval::empty()\n    const\n{\n    return (length == 0);\n}\n\n\nbool\nsrecord::interval::equal(const interval &lhs, const interval &rhs)\n{\n    if (lhs.length != rhs.length)\n        return false;\n    for (size_t j = 0; j < lhs.length; ++j)\n        if (lhs.data[j] != rhs.data[j])\n            return false;\n    return true;\n}\n\n\nsrecord::interval::data_t\nsrecord::interval::get_lowest()\n    const\n{\n    // assert(valid());\n    return (length > 0 ? data[0] : 0);\n}\n\n\nsrecord::interval::data_t\nsrecord::interval::get_highest()\n    const\n{\n    // assert(valid());\n    return (length > 0 ? data[length - 1] : 0);\n}\n\n\nvoid\nsrecord::interval::print(std::ostream &os)\n    const\n{\n    if (length != 2)\n        os << \"(\";\n    for (size_t j = 0; j < length; j += 2)\n    {\n        if (j)\n            os << \", \";\n        os << data[j];\n        if (data[j] + 2 == data[j + 1])\n            os << \", \" << data[j] + 1;\n        else if (data[j] + 1 != data[j + 1])\n            os << \" - \" << (data[j + 1] - 1);\n    }\n    if (length != 2)\n        os << \")\";\n}\n\n\nstatic std::string\nto_string(srecord::interval::data_t x)\n{\n    int width = 4;\n    if (x >= 0x10000)\n        width += 2;\n    if (x >= 0x1000000)\n        width += 2;\n    char buffer[20];\n    snprintf(buffer, sizeof(buffer), \"0x%0*lX\", width, (unsigned long)x);\n    return buffer;\n}\n\n\nstd::string\nsrecord::interval::representation()\n    const\n{\n    std::string result;\n    result += '(';\n    for (size_t j = 0; j < length; j += 2)\n    {\n        if (j)\n            result += \", \";\n        result += to_string(data[j]);\n        if (data[j] + 2 == data[j + 1])\n        {\n            result += \", \";\n            result += to_string(data[j] + 1);\n        }\n        else if (data[j] + 1 != data[j + 1])\n        {\n            result += \" - \";\n            result += to_string(data[j + 1] - 1);\n        }\n    }\n    result += ')';\n    return result;\n}\n\n\nsrecord::interval\nsrecord::interval::pad(int mult)\n    const\n{\n    if (mult < 2)\n        return *this;\n    interval result;\n    for (size_t j = 0; j < length; j += 2)\n    {\n        data_t lo = data[j];\n        lo = (lo / mult) * mult;\n        data_t hi = data[j + 1];\n        hi = ((hi + mult - 1) / mult) * mult;\n        result += interval(lo, hi);\n    }\n    return result;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/interval.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_INTERVAL_H\n#define SRECORD_INTERVAL_H\n\n#include <cstddef>\n#include <stdint.h>\n#include <iostream>\n\nnamespace srecord\n{\n\n/**\n  * The interval class is used to represent a set of integer values,\n  * usually composed of runs of adjacent value.  Set arithmetic is\n  * implemented on these intervals.\n  */\nclass interval\n{\npublic:\n    /**\n      * The destructor.  It isn't virtual, so don't derive from this class.\n      */\n    ~interval();\n\n    /**\n      * The data_t type is used to parameterize the integr type used in\n      * the interval.\n      */\n    typedef uint32_t data_t;\n    typedef uint64_t long_data_t;\n\n    /**\n      * The default constructor.  The interval is empty.\n      */\n    interval();\n\n    /**\n      * The constructor.  The interval contains the single integer supplied.\n      *\n      * \\param val\n      *    The interval is constructed to contain the single interger\n      *    value supplied.\n      */\n    interval(data_t val);\n\n    /**\n      * The constructor.  The interval contains all values >= lo and < hi.\n      *\n      * \\param lo\n      *     The lower bound of the integers in the initial interval.\n      * \\param hi\n      *     The upper bound of the integers in the initial interval;\n      *     this value is not included.\n      */\n    interval(data_t lo, data_t hi);\n\n    /**\n      * The copy constructor.\n      */\n    interval(const interval &);\n\n    /**\n      * The assignment operator.\n      */\n    interval &operator=(const interval &);\n\n    /**\n      * The union_ class method is used to calculate the set union of\n      * two intervals.\n      */\n    static interval union_(const interval &, const interval &);\n\n    /**\n      * The intersection class method is used to calculate the set\n      * intersection of two intervals.\n      */\n    static interval intersection(const interval &, const interval &);\n\n    /**\n      * The difference class method is used to calculate the set\n      * difference of two intervals.\n      */\n    static interval difference(const interval &, const interval &);\n\n    /**\n      * The equal class method is used to test the equality of two\n      * intervals.\n      */\n    static bool equal(const interval &, const interval &);\n\n    /**\n      * The member method is used to test whether a given value is a\n      * member of the interval.\n      *\n      * \\param val\n      *     The value to test for membership\n      * \\returns\n      *     True if the given value is a member of the interval,\n      *     false if it is not.\n      */\n    bool member(data_t val) const;\n\n    /**\n      * The empty method is used to test whether the interval is empty.\n      *\n      * \\returns\n      *     True if the interval is empty,\n      *     false if the interval is not empty.\n      */\n    bool empty() const;\n\n    /**\n      * The first_interval_only method is used to crop the interval to the\n      * first (numerically least) run of consecutive integers in the set.\n      */\n    void first_interval_only();\n\n    /**\n      * The interval_scan_begin method is used to start traversing every\n      * integer value in the interval.\n      */\n    void scan_begin();\n\n    /**\n      * The interval_scan_next method is used to traverse every integer\n      * value in the interval.\n      */\n    bool scan_next(data_t &);\n\n    /**\n      * The interval_scan_end method is used to finish traversing every\n      * integer value in the interval.\n      */\n    void scan_end();\n\n    /**\n      * The get_lowest method is used to obtain the lower bound of\n      * the interval.  It is inclusive.\n      */\n    data_t get_lowest() const;\n\n    /**\n      * The get_highest method is used to obtain the upper bound of\n      * the interval.  It is exclusive (i.e. one beyond the highest\n      * integer in the set).\n      */\n    data_t get_highest() const;\n\n    /**\n      * The print method is used to print an interval on an output stream.\n      */\n    void print(std::ostream &) const;\n\n    /**\n      * The pad method is used to expand an interval by padding each\n      * sub-interval.  For each sub-interval the minimum is rounded\n      * down to a multiple of x, and the upper bound is rounded up to a\n      * multiple of x.\n      *\n      * @param x\n      *     The multiple to expand to.  No action is taken if x < 2.\n      * @returns\n      *     new padded interval.\n      */\n    interval pad(int x) const;\n\n    /**\n      * The representation method is used to manufacture a textural\n      * representation of this interval.\n      */\n    std::string representation() const;\n\n    /**\n      * The flatten method is used to convert an interval with holes\n      * in it to a simple interval with no holes in it, by using the\n      * mimimum and maximum values.\n      */\n    interval flatten() const;\n\n    /**\n      * The coverage method is used to obtain the size of the interval\n      * in bytes.\n      *\n      * @returns\n      *     The number of bytes cobered by the interval, NOT including\n      *     holes.  Because the result could be 2**32, the 64-bit result\n      *     is used so that this is representable.\n      */\n    long_data_t coverage() const;\n\nprivate:\n    /**\n      * The length instance variable is used to remember the length of\n      * the data instance variable.  This is almost always even, because\n      * the internal is a series of [lo, hi) sub-intervals.\n      */\n    size_t length;\n\n    /**\n      * The size instance variable is used to remember the maximum size\n      * of the data instance variable.  The length can go up and down\n      * depending on the calculation, but the size only ever rises.\n      */\n    size_t size;\n\n    /**\n      * The scan_index instance variable is used to remember where the\n      * scan us up to.  Used by the scan_next method, et al.\n      */\n    size_t scan_index;\n\n    /**\n      * The scan_next_datum instance variable is used to remember where\n      * the scan us up to.  Used by the scan_next method, et al.\n      */\n    data_t scan_next_datum;\n\n    /**\n      * The data instance variable is used to remember a pointer to\n      * the base of an array of interger values.  They come in [lo, hi)\n      * pairs.  As a sanity check, there is an extra item, wich contains\n      * the same value as the length instance variable.\n      */\n    data_t *data;\n\n    /**\n      * The valid method is used to test whether the interval is\n      * internally self-consistent.  Principally of use when debugging.\n      */\n    bool valid() const;\n\n    /**\n      * The append method is used to append another value to the end\n      * of an interval under construction.  This breaks the \"length is\n      * even\" assertion which usually applies; for this reason it is\n      * only to be used by the arithmetic operator implementations when\n      * calculating their results.\n      */\n    void append(data_t);\n};\n\n/**\n  * The equality operator is used to determine if two intervals are the\n  * same.\n  */\ninline bool\noperator == (const interval &lhs, const interval &rhs)\n{\n    return interval::equal(lhs, rhs);\n}\n\n/**\n  * The inequality operator is used to determine if two intervals are\n  * different.\n  */\ninline bool\noperator != (const interval &lhs, const interval &rhs)\n{\n    return !interval::equal(lhs, rhs);\n}\n\n/**\n  * The binary star operator is used to calculate the intersection of\n  * two intervals.\n  */\ninline interval\noperator * (const interval &lhs, const interval &rhs)\n{\n    return interval::intersection(lhs, rhs);\n}\n\n/**\n  * The star-and-replace operator is used to calculate the intersection\n  * of two intervals, and assign the result to the left-hand-side.\n  */\ninline interval &\noperator *= (interval &lhs, const interval &rhs)\n{\n    lhs = interval::intersection(lhs, rhs);\n    return lhs;\n}\n\n/**\n  * The binary plus operator is used to calculate the union of two\n  * intervals.\n  */\ninline interval\noperator + (const interval &lhs, const interval &rhs)\n{\n    return interval::union_(lhs, rhs);\n}\n\n/**\n  * The plus-and-replace operator is used to calculate the union of two\n  * intervals, and assign the result to the left-hand-side.\n  */\ninline interval &\noperator += (interval &lhs, const interval &rhs)\n{\n    lhs = interval::union_(lhs, rhs);\n    return lhs;\n}\n\n/**\n  * The binary minus operator is used to calculate the difference of two\n  * intervals.\n  */\ninline interval\noperator - (const interval &lhs, const interval &rhs)\n{\n    return interval::difference(lhs, rhs);\n}\n\n/**\n  * The minus-and-replace operator is used to calculate the difference\n  * of two intervals, and assign the result to the left-hand-side.\n  */\ninline interval &\noperator -= (interval &lhs, const interval &rhs)\n{\n    lhs = interval::difference(lhs, rhs);\n    return lhs;\n}\n\n/**\n  * The unary minus operator is used to calculate the logical complement\n  * (inverse, negative) of an interval.\n  */\ninline interval\noperator - (const interval &arg)\n{\n    return (interval(0, 0) - arg);\n}\n\n/**\n  * The binary left-shift operator is used to print an interval on an\n  * output stream.\n  */\ninline std::ostream &\noperator << (std::ostream &os, const interval &val)\n{\n    val.print(os);\n    return os;\n}\n\n};\n\n#endif // SRECORD_INTERVAL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/chunk.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <cstring>\n#include <srecord/memory/chunk.h>\n#include <srecord/memory/walker.h>\n\n\nsrecord::memory_chunk::memory_chunk(unsigned long arg) :\n    address(arg)\n{\n    memset(data, 0, sizeof(data));\n    memset(mask, 0, sizeof(mask));\n}\n\n\nsrecord::memory_chunk::memory_chunk(const srecord::memory_chunk &arg) :\n    address(arg.address)\n{\n    memcpy(data, arg.data, sizeof(data));\n    memcpy(mask, arg.mask, sizeof(mask));\n}\n\n\nsrecord::memory_chunk &\nsrecord::memory_chunk::operator=(const srecord::memory_chunk &arg)\n{\n    if (this != &arg)\n    {\n        address = arg.address;\n        memcpy(data, arg.data, sizeof(data));\n        memcpy(mask, arg.mask, sizeof(mask));\n    }\n    return *this;\n}\n\n\nsrecord::memory_chunk::~memory_chunk()\n{\n}\n\n\nvoid\nsrecord::memory_chunk::set(unsigned long offset, int datum)\n{\n    data[offset] = datum;\n    mask[offset >> 3] |= (1 << (offset & 7));\n}\n\n\nvoid\nsrecord::memory_chunk::walk(srecord::memory_walker::pointer w)\n    const\n{\n    for (int j = 0; j < size; ++j)\n    {\n        if (!set_p(j))\n            continue;\n        int k;\n        for (k = j + 1; k < size && set_p(k); ++k)\n            ;\n        w->observe(address * size + j, data + j, k - j);\n        j = k;\n    }\n}\n\n\nbool\nsrecord::memory_chunk::find_next_data(unsigned long &ret_addr, void *ret_data,\n        size_t &nbytes)\n    const\n{\n    for (unsigned j = ret_addr % size; j < size; ++j)\n    {\n        if (!set_p(j))\n            continue;\n        size_t max = j + nbytes;\n        if (max > size)\n            max = size;\n        unsigned k;\n        for (k = j + 1; k < max && set_p(k); ++k)\n            ;\n        nbytes = k - j;\n        memcpy(ret_data, data + j, nbytes);\n        ret_addr = address * size + j;\n        return true;\n    }\n    return false;\n}\n\n\nint\nsrecord::memory_chunk::get(unsigned long offset)\n{\n    return data[offset];\n}\n\n\nbool\nsrecord::memory_chunk::set_p(unsigned long offset)\n    const\n{\n    return (0 != (mask[offset >> 3] & (1 << (offset & 7))));\n}\n\n\nbool\nsrecord::memory_chunk::equal(const srecord::memory_chunk &lhs,\n    const srecord::memory_chunk &rhs)\n{\n    return\n    (\n        lhs.address == rhs.address\n    &&\n        0 == memcmp(lhs.data, rhs.data, sizeof(lhs.data))\n    &&\n        0 == memcmp(lhs.mask, rhs.mask, sizeof(lhs.mask))\n    );\n}\n\n\nunsigned long\nsrecord::memory_chunk::get_upper_bound()\n    const\n{\n    for (size_t j = size; j > 0; --j)\n    {\n        if (set_p(j - 1))\n            return (address * size + j);\n    }\n    // can't happen?\n    return (address * size);\n}\n\n\nunsigned long\nsrecord::memory_chunk::get_lower_bound()\n    const\n{\n    for (size_t j = 0; j < size; ++j)\n    {\n        if (set_p(j))\n            return (address * size + j);\n    }\n    // can't happen?\n    return (address * size);\n}\n\n\nbool\nsrecord::operator == (const srecord::memory_chunk &lhs,\n    const srecord::memory_chunk &rhs)\n{\n    return srecord::memory_chunk::equal(lhs, rhs);\n}\n\n\nbool\nsrecord::operator != (const srecord::memory_chunk &lhs,\n    const srecord::memory_chunk &rhs)\n{\n    return !srecord::memory_chunk::equal(lhs, rhs);\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/chunk.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2000, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_CHUNK_H\n#define SRECORD_MEMORY_CHUNK_H\n\n#include <stddef.h>\n\n#include <srecord/memory/walker.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::memory_chunk class is used to represent portion of memory.\n  * Not all bytes are actually set, so there is a bit map of which bytes\n  * actually contain data.\n  */\nclass memory_chunk\n{\npublic:\n    enum {\n    /**\n      * The size value is the size, in bytes, of each memory chunk.\n      *\n      * @note\n      *     Code that uses this value <b>shall not</b> assume that\n      *     it is, or will ever be, a power of 2.  The compiler will\n      *     optimize for you, don't do premature optimizations like bit\n      *     masks and bit shifts.\n      * @note\n      *     If you change this value, you will have to change tests\n      *     test/01/t0199a.sh and test/02/t0200a.sh to match,\n      *     otherwise it will fail.  Make sure that interactions with\n      *     srecord::output_filter_reblock are what you intended, too.\n      */\n    size = 7 * 256 };\n\n    /**\n      * The constructor.\n      */\n    memory_chunk(unsigned long address);\n\n    /**\n      * The copy constructor.\n      */\n    memory_chunk(const memory_chunk &);\n\n    /**\n      * The assignment operator.\n      */\n    memory_chunk &operator=(const memory_chunk &);\n\n    /**\n      * The destructor.\n      */\n    ~memory_chunk();\n\n    /**\n      * The set method is used to set the byte at the given offset within\n      * the chunk.\n      */\n    void set(unsigned long offset, int value);\n\n    /**\n      * The get method is used to get the value at the given offset\n      * within the chunk.\n      */\n    int get(unsigned long offset);\n\n    /**\n      * The get_p method is used to determine whether the byte at the\n      * given offset within the chunk contains valid data.\n      */\n    bool set_p(unsigned long) const;\n\n    /**\n      * The walk method is used to iterate across all of the bytes which\n      * are set within the chunk, calling the walker's observe method.\n      */\n    void walk(memory_walker::pointer) const;\n\n    /**\n      * The get_address method is used to get the address of the memory\n      * chunk.  This is NOT the address of the first byte, it is the\n      * chunk number.  To calculate the byte address, multiply by size.\n      */\n    unsigned long get_address() const { return address; }\n\n    /**\n      * The equal class method is used to determine wherther two memory\n      * chunks are equal.  The must have the same address, the same bit\n      * mask, and the same byte values on the valid bytes.\n      */\n    static bool equal(const memory_chunk &, const memory_chunk &);\n\n    /**\n      * The find_next_data method is used when iteratinbg across all of\n      * the bytes set within the chunk.\n      */\n    bool find_next_data(unsigned long &, void *, size_t &) const;\n\n    /**\n      * The get_upper_bound method is used to determine the upper bound\n      * (offset of last byte with valid data, plus one) of the chunk.\n      * It returns a memory byte address, NOT the chunk offset.\n      */\n    unsigned long get_upper_bound() const;\n\n    /**\n      * The get_lower_bound method is used to determine the lower bound\n      * (offset of first byte with valid data) of the chunk.\n      * It returns a memory byte address, NOT the chunk offset.\n      */\n    unsigned long get_lower_bound() const;\n\nprivate:\n    /**\n      * The address of the memory chunk.  This is NOT the address of\n      * the first byte, it is the chunk number.  To calculate the byte\n      * address, multiply by size.\n      */\n    unsigned long address;\n\n    /**\n      * The data array is used to remember the valus of valid data bytes.\n      */\n    unsigned char data[size];\n\n    /**\n      * The mask array is used to remember which values in the data\n      * array contain valid values.\n      */\n    unsigned char mask[(size + 7) / 8];\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    memory_chunk();\n};\n\nbool operator == (const srecord::memory_chunk &, const srecord::memory_chunk &);\nbool operator != (const srecord::memory_chunk &, const srecord::memory_chunk &);\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_CHUNK_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/adler16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/adler16.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_adler16::~memory_walker_adler16()\n{\n}\n\n\nsrecord::memory_walker_adler16::memory_walker_adler16()\n{\n}\n\n\nsrecord::memory_walker_adler16::pointer\nsrecord::memory_walker_adler16::create()\n{\n    return pointer(new srecord::memory_walker_adler16());\n}\n\n\nvoid\nsrecord::memory_walker_adler16::observe(unsigned long, const void *data,\n    int length)\n{\n    checksum.nextbuf(data, length);\n}\n\n\nunsigned\nsrecord::memory_walker_adler16::get()\n    const\n{\n    return checksum.get();\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/adler16.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_ADLER16_H\n#define SRECORD_MEMORY_WALKER_ADLER16_H\n\n#include <srecord/adler16.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_adler16 class is used to represent the parse\n  * state of a memory walker which calculates a running ADLER16 checksum.\n  */\nclass memory_walker_adler16:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_adler16> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_adler16();\n\nprivate:\n    /**\n      * The default constructor.  It is private on putpose, use the\n      * #create method instead.\n      */\n    memory_walker_adler16();\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      */\n    static pointer create();\n\n    /**\n      * The get method is used to get the ADLER16 checksum once all memory\n      * chunks have been processed by calls to our observe method.\n      */\n    unsigned get() const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    /**\n      * The checksum instance variable is used to remember the running\n      * state of the ADLER16 checksum calculation.\n      */\n    adler16 checksum;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_adler16(const memory_walker_adler16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_adler16 &operator=(const memory_walker_adler16 &);\n};\n\n};\n\n#endif // SRECORD_MEMORY_WALKER_ADLER16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/adler32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/adler32.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_adler32::~memory_walker_adler32()\n{\n}\n\n\nsrecord::memory_walker_adler32::memory_walker_adler32()\n{\n}\n\n\nsrecord::memory_walker_adler32::pointer\nsrecord::memory_walker_adler32::create()\n{\n    return pointer(new srecord::memory_walker_adler32());\n}\n\n\nvoid\nsrecord::memory_walker_adler32::observe(unsigned long, const void *data,\n    int length)\n{\n    checksum.nextbuf(data, length);\n}\n\n\nunsigned\nsrecord::memory_walker_adler32::get()\n    const\n{\n    return checksum.get();\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/adler32.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_ADLER32_H\n#define SRECORD_MEMORY_WALKER_ADLER32_H\n\n#include <srecord/adler32.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_adler32 class is used to represent the parse\n  * state of a memory walker which calculates a running ADLER32 checksum.\n  */\nclass memory_walker_adler32:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_adler32> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_adler32();\n\nprivate:\n    /**\n      * The default constructor.  It is private on putpose, use the\n      * #create method instead.\n      */\n    memory_walker_adler32();\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      */\n    static pointer create();\n\n    /**\n      * The get method is used to get the ADLER32 checksum once all memory\n      * chunks have been processed by calls to our observe method.\n      */\n    unsigned get() const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    /**\n      * The checksum instance variable is used to remember the running\n      * state of the ADLER32 checksum calculation.\n      */\n    adler32 checksum;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_adler32(const memory_walker_adler32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_adler32 &operator=(const memory_walker_adler32 &);\n};\n\n};\n\n#endif // SRECORD_MEMORY_WALKER_ADLER32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/alignment.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/alignment.h>\n\n\nsrecord::memory_walker_alignment::~memory_walker_alignment()\n{\n}\n\n\nsrecord::memory_walker_alignment::memory_walker_alignment(unsigned a_multiple) :\n    multiple(a_multiple),\n    current_address(0),\n    data_seen(false),\n    well_aligned(true)\n{\n    assert(multiple >= 2);\n}\n\n\nsrecord::memory_walker_alignment::pointer\nsrecord::memory_walker_alignment::create(unsigned a_multiple)\n{\n    return pointer(new memory_walker_alignment(a_multiple));\n}\n\n\nbool\nsrecord::memory_walker_alignment::is_well_aligned(void)\n    const\n{\n    return well_aligned;\n}\n\n\nvoid\nsrecord::memory_walker_alignment::observe(unsigned long address, const void *,\n    int data_size)\n{\n    if (data_seen && address != current_address)\n    {\n        // Check end.\n        if (current_address % multiple != 0)\n            well_aligned = false;\n    }\n\n    if (!data_seen || address != current_address)\n    {\n        // Check beginning.\n        if (address % multiple != 0)\n            well_aligned = false;\n    }\n\n    current_address = address + data_size;\n    data_seen = true;\n}\n\n\nvoid\nsrecord::memory_walker_alignment::observe_end(void)\n{\n    // Check last end.\n    if (data_seen && current_address % multiple != 0)\n        well_aligned = false;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/alignment.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_ALIGNMENT_H\n#define SRECORD_MEMORY_WALKER_ALIGNMENT_H\n\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_alignment class is used to represent the\n  * parse state of a memory walker which determines whether or not the\n  * data are well aligned.\n  */\nclass memory_walker_alignment:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_alignment> pointer;\n\n    /**\n      * The destructror.\n      */\n    virtual ~memory_walker_alignment();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of class.\n      *\n      * @param multiple\n      *     The multiple of bytes we expect for alignment.\n      */\n    static pointer create(unsigned multiple);\n\n    /**\n      * The is_continuous method is used to get the results of the\n      * calculation.\n      *\n      * @returns\n      *     true if the data has no holes, false if there are holes\n      */\n    bool is_well_aligned(void) const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\n    // See base class for documentation.\n    void observe_end(void);\n\nprivate:\n    /**\n      * The constructor.\n      * It is private on purpose, use the #create class method instead.\n      *\n      * @param multiple\n      *     The multiple of bytes we expect for alignment.\n      */\n    memory_walker_alignment(unsigned multiple);\n\n    unsigned multiple;\n    unsigned long current_address;\n    bool data_seen;\n    bool well_aligned;\n\n    /**\n      * The default constructor.\n      * Do not use.\n      */\n    memory_walker_alignment();\n\n    /**\n      * The copy constructor.  No not use.\n      */\n    memory_walker_alignment(const memory_walker_alignment &);\n\n    /**\n      * The assignment operator.  No not use.\n      */\n    memory_walker_alignment &operator=(const memory_walker_alignment &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_WALKER_ALIGNMENT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/compare.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <iostream>\n\n#include <srecord/memory.h>\n#include <srecord/memory/walker/compare.h>\n\n\nsrecord::memory_walker_compare::~memory_walker_compare()\n{\n}\n\n\nsrecord::memory_walker_compare::memory_walker_compare(const srecord::memory &a1,\n        bool a2) :\n    other(a1),\n    check_wrong(a2)\n{\n}\n\n\nsrecord::memory_walker_compare::pointer\nsrecord::memory_walker_compare::create(const srecord::memory &a1, bool a2)\n{\n    return pointer(new srecord::memory_walker_compare(a1, a2));\n}\n\n\nvoid\nsrecord::memory_walker_compare::observe(unsigned long addr, const void *p,\n    int len)\n{\n    interval wrongTemp;\n    interval unsetTemp;\n\n    unsigned char *data = (unsigned char *)p;\n    for (int j = 0; j < len; ++j)\n    {\n        if (other.set_p(addr + j))\n        {\n            if (check_wrong && data[j] != other.get(addr + j))\n                wrongTemp += interval(addr + j);\n        }\n        else\n            unsetTemp += interval(addr + j);\n    }\n\n    wrong += wrongTemp;\n    unset += unsetTemp;\n}\n\n\nstatic std::string\nspaces(int n)\n{\n    // inefficient, but it isn't used much.\n    std::string result;\n    while (n > 0)\n    {\n        result += \" \";\n        --n;\n    }\n    return result;\n}\n\n\nvoid\nsrecord::memory_walker_compare::print(const char *caption)\n    const\n{\n    std::ios::fmtflags old =\n        std::cout.setf\n        (\n            static_cast<std::ios::fmtflags>(std::ios::showbase + std::ios::hex),\n            static_cast<std::ios::fmtflags>\n            (\n                    std::ios::showbase\n                +\n                    std::ios::hex\n                +\n                    std::ios::dec\n                +\n                    std::ios::oct\n            )\n        );\n    if (!wrong.empty())\n        std::cout << \"Different:      \" << wrong << std::endl;\n    if (!unset.empty())\n    {\n        std::string s(caption);\n        std::cout << s << \" only:\" << spaces(10 - s.size()) << unset\n            << std::endl;\n    }\n    std::cout.flags(old);\n}\n\n\nbool\nsrecord::memory_walker_compare::same()\n    const\n{\n    return (wrong.empty() && unset.empty());\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/compare.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_COMPARE_H\n#define SRECORD_MEMORY_WALKER_COMPARE_H\n\n#include <srecord/interval.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\nclass memory; // forward\n\n/**\n  * The srecord::memory_walker_compare class is used to represent a memory\n  * walker which compares memory data with another memory instance.\n  *\n  * Note that this is strictly an improper subset comparison.  I.e. that\n  * all bytes passed to the observe method exists in the other memory\n  * instance.\n  *\n  * For a complete equality test, you need to use this comparison both\n  * ways round.\n  */\nclass memory_walker_compare:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_compare> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_compare();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use thr #create\n      * class method instead.\n      *\n      * @param other\n      *     The other memory instance to be checked against this one.\n      * @param check_wrong\n      *     Whether or not to check that the data agrees as well as the\n      *     address ranges.\n      */\n    memory_walker_compare(const memory &other, bool check_wrong);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param other\n      *     The other memory instance to be checked against this one.\n      * @param check_wrong\n      *     Whether or not to check that the data agrees as well as the\n      *     address ranges.\n      */\n    static pointer create(const memory &other, bool check_wrong);\n\n    // See base class for documentation.\n    virtual void observe(unsigned long, const void *, int);\n\n    /**\n      * The print method is used to print the results of the comparison\n      * on the standard output.\n      *\n      * @param caption\n      *     The text to place at the start of the listing.\n      */\n    void print(const char *caption) const;\n\n    /**\n      * The same method is used to discover whether the result of the\n      * comparison indicate that the two memory instances are the same.\n      */\n    bool same() const;\n\nprivate:\n    /**\n      * The other instance variable is used to remember the other memory\n      * instance to be checked against this one.\n      */\n    const memory &other;\n\n    /**\n      * The check_wrong instance variable is used to remember whether or\n      * not to check that the data agrees as well as the address ranges.\n      */\n    bool check_wrong;\n\n    /**\n      * The unset instance variable is used to remember which bytes of\n      * data given to the observe method are NOT present in the other\n      * memory instance.\n      */\n    interval unset;\n\n    /**\n      * The wrong instance variable is used to remember which bytes of\n      * data given to the observer method were different than the ones\n      * in the other memory instance.\n      */\n    interval wrong;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    memory_walker_compare();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_compare(const memory_walker_compare &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_compare &operator=(const memory_walker_compare &);\n};\n\n};\n\n#endif // SRECORD_MEMORY_WALKER_COMPARE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/continuity.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/memory/walker/continuity.h>\n\n\nsrecord::memory_walker_continuity::~memory_walker_continuity()\n{\n}\n\n\nsrecord::memory_walker_continuity::memory_walker_continuity() :\n    current_address(0),\n    data_seen(false),\n    nholes(0)\n{\n}\n\n\nsrecord::memory_walker_continuity::pointer\nsrecord::memory_walker_continuity::create()\n{\n    return pointer(new srecord::memory_walker_continuity());\n}\n\n\nvoid\nsrecord::memory_walker_continuity::observe(unsigned long addr, const void *,\n    int nbytes)\n{\n    if (data_seen)\n    {\n        if (current_address != addr)\n            ++nholes;\n    }\n    else\n    {\n        data_seen = true;\n    }\n    current_address = addr + nbytes;\n}\n\n\nbool\nsrecord::memory_walker_continuity::is_continuous()\n    const\n{\n    return (data_seen && nholes == 0);\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/continuity.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_CONTINUITY_H\n#define SRECORD_MEMORY_WALKER_CONTINUITY_H\n\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_crc16 class is used to represent the parse\n  * state of a memory walker which determines whether or not the data\n  * are continuous.\n  */\nclass memory_walker_continuity:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_continuity> pointer;\n\n    /**\n      * The destructror.\n      */\n    virtual ~memory_walker_continuity();\n\nprivate:\n    /**\n      * The default constructor.  It is private on purpose, use the\n      * #create class method instead.\n      */\n    memory_walker_continuity();\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of class.\n      */\n    static pointer create();\n\n    /**\n      * The is_continuous method is used to get the results of the\n      * calculation.\n      *\n      * @returns\n      *     true if the data has no holes, false if there are holes\n      */\n    bool is_continuous() const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    unsigned long current_address;\n    bool data_seen;\n    int nholes;\n\n    /**\n      * The copy constructor.  No not use.\n      */\n    memory_walker_continuity(const memory_walker_continuity &);\n\n    /**\n      * The assignment operator.  No not use.\n      */\n    memory_walker_continuity &operator=(const memory_walker_continuity &);\n};\n\n};\n\n#endif // SRECORD_MEMORY_WALKER_CONTINUITY_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/crc16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/crc16.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_crc16::~memory_walker_crc16()\n{\n    delete checksum;\n}\n\n\nsrecord::memory_walker_crc16::memory_walker_crc16(crc16::seed_mode_t seed_mode,\n    bool augment_flag, unsigned short polynomial, crc16::bit_direction_t bitdir)\n{\n    checksum = new crc16(seed_mode, augment_flag, polynomial, bitdir);\n}\n\n\nsrecord::memory_walker_crc16::pointer\nsrecord::memory_walker_crc16::create(crc16::seed_mode_t arg1, bool a_augment,\n    unsigned short polynomial, crc16::bit_direction_t a_bitdir)\n{\n    return\n        pointer\n        (\n            new srecord::memory_walker_crc16\n            (\n                arg1,\n                a_augment,\n                polynomial,\n                a_bitdir\n            )\n        );\n}\n\n\nvoid\nsrecord::memory_walker_crc16::observe(unsigned long, const void *data,\n    int length)\n{\n    checksum->nextbuf(data, length);\n}\n\n\nunsigned\nsrecord::memory_walker_crc16::get()\n    const\n{\n    return checksum->get();\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/crc16.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_CRC16_H\n#define SRECORD_MEMORY_WALKER_CRC16_H\n\n#include <srecord/crc16.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_crc16 class is used to represent the parse\n  * state of a memory walker which calculates a running CRC16 checksum.\n  */\nclass memory_walker_crc16:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_crc16> pointer;\n\n    /**\n      * The destructror.\n      */\n    virtual ~memory_walker_crc16();\n\nprivate:\n    /**\n      * The default constructor.  It is private on purpose, use the\n      * #create class method instead.\n      *\n      * @param seed_mode\n      *     The selector for the initial seed for the calculation\n      * @param augment_flag\n      *     Whether or not to augment the calculation\n      * @param polynomial\n      *     The CRC polynomial to be used.\n      * @param bitdir\n      *     the bit direction of the CRC.\n      */\n    memory_walker_crc16(crc16::seed_mode_t seed_mode, bool augment_flag,\n        unsigned short polynomial, crc16::bit_direction_t bitdir);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param seed_mode\n      *     The selector for the initial seed for the calculation\n      * @param augment_flag\n      *     Whether or not to augment the calculation\n      * @param polynomial\n      *     The CRC polynomial to be used.\n      * @param bitdir\n      *     the bit direction of the CRC\n      */\n    static pointer create(crc16::seed_mode_t seed_mode, bool augment_flag,\n        unsigned short polynomial, crc16::bit_direction_t bitdir);\n\n    /**\n      * The get method is used to get the CRC16 checksum once all memory\n      * chunks have been processed by calls to our observe method.\n      */\n    unsigned get() const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    /**\n      * The checksum instance variable is used to remember the running\n      * state of the CRC16 checksum calculation.\n      */\n    crc16 *checksum;\n\n    /**\n      * The copy constructor.  No not use.\n      */\n    memory_walker_crc16(const memory_walker_crc16 &);\n\n    /**\n      * The assignment operator.  No not use.\n      */\n    memory_walker_crc16 &operator=(const memory_walker_crc16 &);\n};\n\n};\n\n#endif // SRECORD_MEMORY_WALKER_CRC16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/crc32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/crc32.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_crc32::~memory_walker_crc32()\n{\n}\n\n\nsrecord::memory_walker_crc32::memory_walker_crc32(\n        crc32::seed_mode_t seed_mode) :\n    checksum(seed_mode)\n{\n}\n\n\nsrecord::memory_walker_crc32::pointer\nsrecord::memory_walker_crc32::create(crc32::seed_mode_t seed_mode)\n{\n    return pointer(new srecord::memory_walker_crc32(seed_mode));\n}\n\n\nvoid\nsrecord::memory_walker_crc32::observe(unsigned long, const void *data,\n    int length)\n{\n    checksum.nextbuf(data, length);\n}\n\n\nunsigned\nsrecord::memory_walker_crc32::get()\n    const\n{\n    return checksum.get();\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/crc32.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_CRC32_H\n#define SRECORD_MEMORY_WALKER_CRC32_H\n\n#include <srecord/crc32.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_crc32 class is used to represent the parse\n  * state of a memory walker which calculates a running CRC32 checksum.\n  */\nclass memory_walker_crc32:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_crc32> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_crc32();\n\nprivate:\n    /**\n      * The default constructor.  It is private on putpose, use the\n      * #create method instead.\n      *\n      * @param seed_mode\n      *     How to calculate the initial seed.\n      */\n    memory_walker_crc32(crc32::seed_mode_t seed_mode);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param seed_mode\n      *     How to calculate the initial seed.\n      */\n    static pointer create(crc32::seed_mode_t seed_mode);\n\n    /**\n      * The get method is used to get the CRC32 checksum once all memory\n      * chunks have been processed by calls to our observe method.\n      */\n    unsigned get() const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    /**\n      * The checksum instance variable is used to remember the running\n      * state of the CRC32 checksum calculation.\n      */\n    crc32 checksum;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_crc32(const memory_walker_crc32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_crc32 &operator=(const memory_walker_crc32 &);\n};\n\n};\n\n#endif // SRECORD_MEMORY_WALKER_CRC32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/fletcher16.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/fletcher16.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_fletcher16::~memory_walker_fletcher16()\n{\n}\n\n\nsrecord::memory_walker_fletcher16::memory_walker_fletcher16(\n    int a_sum1,\n    int a_sum2,\n    int a_answer,\n    endian_t a_end\n) :\n    checksum(a_sum1, a_sum2, a_answer, a_end)\n{\n}\n\n\nsrecord::memory_walker_fletcher16::pointer\nsrecord::memory_walker_fletcher16::create(int a_sum1, int a_sum2,\n    int a_answer, endian_t a_end)\n{\n    return\n        pointer(new memory_walker_fletcher16(a_sum1, a_sum2, a_answer, a_end));\n}\n\n\nvoid\nsrecord::memory_walker_fletcher16::observe(unsigned long, const void *data,\n    int data_size)\n{\n    checksum.nextbuf(data, data_size);\n}\n\n\nunsigned\nsrecord::memory_walker_fletcher16::get(void)\n    const\n{\n    return checksum.get();\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/fletcher16.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_FLETCHER16_H\n#define SRECORD_MEMORY_WALKER_FLETCHER16_H\n\n#include <srecord/fletcher16.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_fletcher16 class is used to represent the parse\n  * state of a memory walker which calculates a running Fletcher-16 checksum.\n  */\nclass memory_walker_fletcher16:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_fletcher16> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_fletcher16();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the\n      * #create method instead.\n      *\n      * @param sum1\n      *     The seed value for sum1.  Defaults to zero.\n      * @param sum2\n      *     The seed value for sum2.  Defaults to zero.\n      * @param answer\n      *     Set this to -1 to be completely ignored.\n      *     If >= 0, this is the desired outcome if the checksum\n      *     includes the checksum itself.  The checksum returned will be\n      *     calculated to return this desired outcome, when traversed,\n      *     rather than a pure Fletcher-16 checksum.\n      * @param end\n      *     The endian-ness of the checksum.  This is needed to\n      *     manipulate the answer.  Ignored if answer is ignored.\n      */\n    memory_walker_fletcher16(int sum1, int sum2, int answer, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param sum1\n      *     The seed value for sum1.  Defaults to zero.\n      * @param sum2\n      *     The seed value for sum2.  Defaults to zero.\n      * @param answer\n      *     Set this to -1 to be completely ignored.\n      *     If >= 0, this is the desired outcome if the checksum\n      *     includes the checksum itself.  The checksum returned will be\n      *     calculated to return this desired outcome, when traversed,\n      *     rather than a pure Fletcher-16 checksum.\n      * @param end\n      *     The endian-ness of the checksum.  This is needed to\n      *     manipulate the answer.  Ignored if answer is ignored.\n      */\n    static pointer create(int sum1, int sum2, int answer, endian_t end);\n\n    /**\n      * The get method is used to get the Fletcher-16 checksum once all memory\n      * chunks have been processed by calls to our #observe method.\n      */\n    unsigned get(void) const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long address, const void *data, int data_size);\n\nprivate:\n    /**\n      * The checksum instance variable is used to remember the running\n      * state of the Fletcher-16 checksum calculation.\n      */\n    fletcher16 checksum;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    memory_walker_fletcher16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_fletcher16(const memory_walker_fletcher16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_fletcher16 &operator=(const memory_walker_fletcher16 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_WALKER_FLETCHER16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/fletcher32.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/fletcher32.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_fletcher32::~memory_walker_fletcher32()\n{\n}\n\n\nsrecord::memory_walker_fletcher32::memory_walker_fletcher32()\n{\n}\n\n\nsrecord::memory_walker_fletcher32::pointer\nsrecord::memory_walker_fletcher32::create()\n{\n    return pointer(new srecord::memory_walker_fletcher32());\n}\n\n\nvoid\nsrecord::memory_walker_fletcher32::observe(unsigned long, const void *data,\n    int length)\n{\n    checksum.nextbuf(data, length);\n}\n\n\nunsigned\nsrecord::memory_walker_fletcher32::get()\n    const\n{\n    return checksum.get();\n}\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/fletcher32.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_FLETCHER32_H\n#define SRECORD_MEMORY_WALKER_FLETCHER32_H\n\n#include <srecord/fletcher32.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_fletcher32 class is used to represent the parse\n  * state of a memory walker which calculates a running Fletcher-32 checksum.\n  */\nclass memory_walker_fletcher32:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_fletcher32> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_fletcher32();\n\nprivate:\n    /**\n      * The default constructor.  It is private on putpose, use the\n      * #create method instead.\n      */\n    memory_walker_fletcher32();\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      */\n    static pointer create();\n\n    /**\n      * The get method is used to get the Fletcher-32 checksum once all memory\n      * chunks have been processed by calls to our observe method.\n      */\n    unsigned get() const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    /**\n      * The checksum instance variable is used to remember the running\n      * state of the Fletcher-32 checksum calculation.\n      */\n    fletcher32 checksum;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_fletcher32(const memory_walker_fletcher32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_fletcher32 &operator=(const memory_walker_fletcher32 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_WALKER_FLETCHER32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/gcrypt.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/memory/walker/gcrypt.h>\n\n\nsrecord::memory_walker_gcrypt::~memory_walker_gcrypt()\n{\n}\n\n\nsrecord::memory_walker_gcrypt::memory_walker_gcrypt(gcry_md_hd_t a_handle) :\n    handle(a_handle)\n{\n}\n\n\nsrecord::memory_walker::pointer\nsrecord::memory_walker_gcrypt::create(gcry_md_hd_t a_handle)\n{\n    return pointer(new srecord::memory_walker_gcrypt(a_handle));\n}\n\n\nvoid\nsrecord::memory_walker_gcrypt::observe(unsigned long, const void *data,\n    int length)\n{\n#ifdef HAVE_LIBGCRYPT\n    gcry_md_write(handle, data, length);\n#else\n    (void)data;\n    (void)length;\n#endif\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/gcrypt.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_GCRYPT_H\n#define SRECORD_MEMORY_WALKER_GCRYPT_H\n\n#include <srecord/config.h>\n#ifdef HAVE_LIBGCRYPT\n#include <gcrypt.h>\n#else\ntypedef void *gcry_md_hd_t;\n#endif\n\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::memory_walker_gcrypt class is used to represent walking\n  * memory and passing it to the gcrypt library in order to calculate a\n  * message digest.\n  */\nclass memory_walker_gcrypt:\n    public memory_walker\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_gcrypt();\n\nprivate:\n    /**\n      * The constructor.\n      * It is private on purpose, use the #create class method instead.\n      *\n      * @param handle\n      *     used to access the libgcrypt handle to the message digest\n      *     being calculated.\n      */\n    memory_walker_gcrypt(gcry_md_hd_t handle);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param handle\n      *     used to access the libgcrypt handle to the message digest\n      *     being calculated.\n      */\n    static pointer create(gcry_md_hd_t handle);\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    /**\n      * The handle instance variable is used to access the libgcrypt\n      * handle to the message digest being calculated.\n      */\n    gcry_md_hd_t handle;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    memory_walker_gcrypt();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_gcrypt(const memory_walker_gcrypt &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_gcrypt &operator=(const memory_walker_gcrypt &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_WALKER_GCRYPT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/stm32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n//      From: Hendrik Beijeman <hbeyeman@gmail.com>\n//      To: pmiller@opensource.org.au\n//      Subject: Re: patch for srecord 1.59\n//      Date: Sat, 05 May 2012 06:26:02 +0200 (05/05/12 14:26:02)\n//\n//      I hereby formally assign all copyright to the author of srecord,\n//      Peter Miller.\n//\n\n#include <cassert>\n#include <cstdio>\n\n#include <srecord/arglex.h>\n#include <srecord/memory/walker/stm32.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_stm32::~memory_walker_stm32()\n{\n}\n\n\nsrecord::memory_walker_stm32::memory_walker_stm32()\n{\n}\n\n\nsrecord::memory_walker_stm32::pointer\nsrecord::memory_walker_stm32::create(void)\n{\n    return pointer(new srecord::memory_walker_stm32());\n}\n\n\nvoid\nsrecord::memory_walker_stm32::observe(unsigned long, const void *data,\n    int length)\n{\n    checksum.nextbuf(data, length);\n}\n\n\nunsigned\nsrecord::memory_walker_stm32::get(void)\n    const\n{\n    return checksum.get();\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/stm32.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n//      From: Hendrik Beijeman <hbeyeman@gmail.com>\n//      To: pmiller@opensource.org.au\n//      Subject: Re: patch for srecord 1.59\n//      Date: Sat, 05 May 2012 06:26:02 +0200 (05/05/12 14:26:02)\n//\n//      I hereby formally assign all copyright to the author of srecord,\n//      Peter Miller.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_STM32_H\n#define SRECORD_MEMORY_WALKER_STM32_H\n\n#include <srecord/stm32.h>\n#include <srecord/memory/walker.h>\n\nnamespace srecord\n{\n\n/**\n  * The memory_walker_stm32 class is a vistor for calculating the CRC used by\n  * the hardware CRC unit on the STM32 series of ARM MPUs. The algo used by the\n  * STM32 hardware unit is just a CRC with a different polynomial and word-fed\n  * instead of byte-fed.  The MPU is little endian but srecord will compute the\n  * correct checksum regardless of the endianness of the generating platform.\n  * http://www.st.com/\n  */\nclass memory_walker_stm32:\n    public memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker_stm32> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker_stm32();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      */\n    static pointer create(void);\n\n    /**\n      * The get method is used to get the CRC32 (STM32) checksum once\n      * all memory chunks have been processed by calls to our observe\n      * method.\n      */\n    unsigned get(void) const;\n\nprotected:\n    // See base class for documentation.\n    void observe(unsigned long, const void *, int);\n\nprivate:\n    /**\n      * The default constructor.\n      * It is private on purpose, use the #create class method instead.\n      */\n    memory_walker_stm32();\n\n    /**\n      * The checksum instance variable is used to remember the running\n      * state of the CRC32 (STM32) checksum calculation.\n      */\n    stm32 checksum;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_stm32(const memory_walker_stm32 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_stm32 &operator=(const memory_walker_stm32 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_WALKER_STM32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/writer.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/memory/walker/writer.h>\n#include <srecord/output.h>\n\n\nsrecord::memory_walker_writer::~memory_walker_writer()\n{\n}\n\n\nsrecord::memory_walker_writer::memory_walker_writer(\n        const srecord::output::pointer &arg) :\n    op(arg)\n{\n}\n\n\nsrecord::memory_walker::pointer\nsrecord::memory_walker_writer::create(const srecord::output::pointer &arg)\n{\n    return pointer(new srecord::memory_walker_writer(arg));\n}\n\n\nvoid\nsrecord::memory_walker_writer::notify_upper_bound(unsigned long address)\n{\n    op->notify_upper_bound(address);\n}\n\n\nvoid\nsrecord::memory_walker_writer::observe(unsigned long address, const void *data,\n    int length)\n{\n    op->write_data(address, data, length);\n}\n\n\nvoid\nsrecord::memory_walker_writer::observe_header(const srecord::record *rp)\n{\n    op->write_header(rp);\n}\n\n\nvoid\nsrecord::memory_walker_writer::observe_start_address(const srecord::record *rp)\n{\n    op->write_execution_start_address(rp);\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker/writer.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_WRITER_H\n#define SRECORD_MEMORY_WALKER_WRITER_H\n\n#include <srecord/memory/walker.h>\n#include <srecord/output.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::memory_walker_writer class is used to write data to an\n  * output stream when a memory image is walked.\n  */\nclass memory_walker_writer:\n    public memory_walker\n{\npublic:\n    /**\n      * the destructor.\n      */\n    virtual ~memory_walker_writer();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param deeper\n      *     where to write the output\n      */\n    memory_walker_writer(const output::pointer &deeper);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param deeper\n      *     where to write the output\n      */\n    static pointer create(const output::pointer &deeper);\n\nprotected:\n    // See base class for documentation.\n    virtual void observe(unsigned long, const void *, int);\n\n    // See base class for documentation.\n    void notify_upper_bound(long unsigned);\n\n    // See base class for documentation.\n    void observe_header(const record *);\n\n    // See base class for documentation.\n    void observe_start_address(const record *);\n\nprivate:\n    /**\n      * The op instance variabel is used to remember where to send\n      * the output.\n      */\n    output::pointer op;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    memory_walker_writer();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker_writer(const memory_walker_writer &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker_writer &operator=(const memory_walker_writer &);\n};\n\n}\n\n#endif // SRECORD_MEMORY_WALKER_WRITER_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006, 2007, 2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/memory/walker.h>\n\n\nsrecord::memory_walker::memory_walker()\n{\n}\n\n\nsrecord::memory_walker::~memory_walker()\n{\n}\n\n\nvoid\nsrecord::memory_walker::notify_upper_bound(unsigned long)\n{\n    // Do nothing.\n}\n\n\nvoid\nsrecord::memory_walker::observe_header(const srecord::record *)\n{\n    // Do nothing.\n}\n\n\nvoid\nsrecord::memory_walker::observe_start_address(const srecord::record *)\n{\n    // Do nothing.\n}\n\n\nvoid\nsrecord::memory_walker::observe_end(void)\n{\n    // Do nothing.\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory/walker.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006-2008, 2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_WALKER_H\n#define SRECORD_MEMORY_WALKER_H\n\n#include <boost/shared_ptr.hpp>\n\nnamespace srecord {\n\nclass record; // forward\n\n/**\n  * The srecord::memory_walker class is used to represent an abstract handler\n  * for the action to perform when walking a memory image.\n  */\nclass memory_walker\n{\npublic:\n    typedef boost::shared_ptr<memory_walker> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~memory_walker();\n\n    /**\n      * The observe method is used by the memory walker to provide data.\n      * Derived classes are required to impliment this method, and do\n      * something with the data.\n      *\n      * @param address\n      *     The base address of this chunk of memory.\n      * @param data\n      *     The base address of this chunk of memory in memory.\n      * @param data_size\n      *     The size, in bytes, of this chunk of memory.\n      */\n    virtual void observe(unsigned long address, const void *data,\n        int data_size) = 0;\n\n    /**\n      * The observe_end method is called once all of the data blocks\n      * have been passed to the observer via the observe() method.\n      */\n    virtual void observe_end(void);\n\n    /**\n      * The notify_upper_bound method is used to notify the walker of\n      * the upper bound (highest address plus one) of the observe calls\n      * to come.  Shall be called before the any observe calls are made.\n      * By default, nothing happens.\n      *\n      * @param address\n      *     The address of the byte immediately beyond the used memory.\n      */\n    virtual void notify_upper_bound(unsigned long address);\n\n    /**\n      * The observe_header method is used to inform the walker of the\n      * header record.  The default does nothing.\n      *\n      * @param rec\n      *     The record to be processed.\n      */\n    virtual void observe_header(const record *rec = 0);\n\n    /**\n      * The observe_start_address method is used to inform the walker\n      * of the execution start address record.  The default does nothing.\n      *\n      * @param rec\n      *     The record to be processed.\n      */\n    virtual void observe_start_address(const record *rec = 0);\n\nprotected:\n    /**\n      * The default constructor.  May only be called by derived classes.\n      */\n    memory_walker();\n\nprivate:\n    /**\n      * The copy constructor.  Do not use.\n      */\n    memory_walker(const memory_walker &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    memory_walker &operator=(const memory_walker &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_WALKER_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2006-2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/input.h>\n#include <srecord/memory.h>\n#include <srecord/memory/walker/alignment.h>\n#include <srecord/memory/walker/compare.h>\n#include <srecord/memory/walker/continuity.h>\n#include <srecord/record.h>\n#include <srecord/string.h>\n\n\nsrecord::memory::memory() :\n    nchunks(0),\n    nchunks_max(0),\n    chunk(0),\n    cache(0),\n    find_next_chunk_index(0),\n    header(0),\n    execution_start_address(0)\n{\n}\n\n\nsrecord::memory::memory(const srecord::memory &rhs) :\n    nchunks(0),\n    nchunks_max(0),\n    chunk(0),\n    cache(0),\n    find_next_chunk_index(0),\n    header(0),\n    execution_start_address(0)\n{\n    copy(rhs);\n}\n\n\nsrecord::memory &\nsrecord::memory::operator=(const srecord::memory &rhs)\n{\n    if (&rhs != this)\n    {\n        clear();\n        copy(rhs);\n    }\n    return *this;\n}\n\n\nsrecord::memory::~memory()\n{\n    clear();\n}\n\n\nvoid\nsrecord::memory::clear(void)\n{\n    delete header;\n    header = 0;\n    delete execution_start_address;\n    execution_start_address = 0;\n    for (int j = 0; j < nchunks; ++j)\n        delete chunk[j];\n    if (chunk)\n        delete [] chunk;\n    nchunks = 0;\n    nchunks_max = 0;\n    chunk = 0;\n    cache = 0;\n}\n\n\nvoid\nsrecord::memory::copy(const srecord::memory &rhs)\n{\n    delete header;\n    header = 0;\n    if (rhs.header)\n        header = new srecord::record(*rhs.header);\n\n    delete execution_start_address;\n    execution_start_address = 0;\n    if (rhs.execution_start_address)\n    {\n        execution_start_address =\n            new srecord::record(*rhs.execution_start_address);\n    }\n\n    nchunks = rhs.nchunks;\n    while (nchunks_max < nchunks)\n        nchunks_max = nchunks_max * 2 + 4;\n    chunk = new srecord::memory_chunk * [nchunks_max];\n    for (int j = 0; j < nchunks; ++j)\n    {\n        // use copy-new to make the copies\n        chunk[j] = new srecord::memory_chunk(*(rhs.chunk[j]));\n    }\n}\n\n\nsrecord::memory_chunk *\nsrecord::memory::find(unsigned long address)\n    const\n{\n    //\n    // Speed things up if we've been there recently.\n    //\n    if (cache && cache->get_address() == address)\n        return cache;\n\n    //\n    // Binary chop to find the appropriate chunk.\n    //\n    int min = 0;\n    int max = nchunks - 1;\n    srecord::memory_chunk *mcp = 0;\n    while (min <= max)\n    {\n        int mid = (min + max) / 2;\n        mcp = chunk[mid];\n        if (mcp->get_address() == address)\n        {\n            cache = mcp;\n            return cache;\n        }\n        if (address < mcp->get_address())\n            max = mid - 1;\n        else\n            min = mid + 1;\n    }\n\n    //\n    // We need a new row.  Make sure there is enough room.\n    //\n    if (nchunks >= nchunks_max)\n    {\n        nchunks_max = nchunks_max * 2 + 4;\n        srecord::memory_chunk **tmp =\n            new srecord::memory_chunk * [nchunks_max];\n        for (int j = 0; j < nchunks; ++j)\n            tmp[j] = chunk[j];\n        delete [] chunk;\n        chunk = tmp;\n    }\n\n    //\n    // Insert the new chunk.\n    //\n    mcp = new srecord::memory_chunk(address);\n    for (int up = nchunks; up > min; --up)\n        chunk[up] = chunk[up - 1];\n    ++nchunks;\n    chunk[min] = mcp;\n\n    cache = mcp;\n    return mcp;\n}\n\n\nvoid\nsrecord::memory::set(unsigned long address, int datum)\n{\n    unsigned long address_hi = address / srecord::memory_chunk::size;\n    unsigned long address_lo = address % srecord::memory_chunk::size;\n    srecord::memory_chunk *mcp = find(address_hi);\n    mcp->set(address_lo, datum);\n}\n\n\nint\nsrecord::memory::get(unsigned long address)\n    const\n{\n    unsigned long address_hi = address / srecord::memory_chunk::size;\n    unsigned long address_lo = address % srecord::memory_chunk::size;\n    srecord::memory_chunk *mcp = find(address_hi);\n    return mcp->get(address_lo);\n}\n\n\nbool\nsrecord::memory::set_p(unsigned long address)\n    const\n{\n    unsigned long address_hi = address / srecord::memory_chunk::size;\n    unsigned long address_lo = address % srecord::memory_chunk::size;\n    srecord::memory_chunk *mcp = find(address_hi);\n    return mcp->set_p(address_lo);\n}\n\n\nbool\nsrecord::memory::equal(const srecord::memory &lhs, const srecord::memory &rhs)\n{\n    if (lhs.nchunks != rhs.nchunks)\n        return false;\n    for (int j = 0; j < lhs.nchunks; ++j)\n        if (lhs.chunk[j][0] != rhs.chunk[j][0])\n            return false;\n    return true;\n}\n\n\n\nbool\nsrecord::memory::compare(const srecord::memory &lhs, const srecord::memory &rhs)\n{\n    srecord::memory_walker_compare::pointer wlhs =\n        srecord::memory_walker_compare::create(rhs, true);\n    lhs.walk(wlhs);\n    wlhs->print(\"Left\");\n    srecord::memory_walker_compare::pointer wrhs =\n        srecord::memory_walker_compare::create(lhs, false);\n    rhs.walk(wrhs);\n    wrhs->print(\"Right\");\n    return (!wlhs->same() || !wrhs->same());\n}\n\n\nunsigned long\nsrecord::memory::get_lower_bound()\n    const\n{\n    if (nchunks == 0)\n        return 0;\n    return chunk[0]->get_lower_bound();\n}\n\n\nunsigned long\nsrecord::memory::get_upper_bound(void)\n    const\n{\n    if (nchunks == 0)\n        return 0;\n    return chunk[nchunks - 1]->get_upper_bound();\n}\n\n\nvoid\nsrecord::memory::walk(srecord::memory_walker::pointer w)\n    const\n{\n    w->notify_upper_bound(get_upper_bound());\n    w->observe_header(get_header());\n    for (int j = 0; j < nchunks; ++j)\n        chunk[j]->walk(w);\n    w->observe_end();\n\n    // Only write an execution start address record if we were given one.\n    if (execution_start_address)\n        w->observe_start_address(get_execution_start_address());\n}\n\n\nvoid\nsrecord::memory::reader(const srecord::input::pointer &ifp,\n    defcon_t redundant_bytes,\n    defcon_t contradictory_bytes)\n{\n    srecord::record record;\n    while (ifp->read(record))\n    {\n        switch (record.get_type())\n        {\n        case srecord::record::type_header:\n            if (!header)\n            {\n                header = new srecord::record(record);\n            }\n            break;\n\n        case srecord::record::type_unknown:\n        case srecord::record::type_data_count:\n            break;\n\n        case srecord::record::type_data:\n            //\n            // For each data byte, we have to check for duplicates.  We\n            // issue warnings for redundant settings, and we issue error\n            // for contradictory settings.\n            //\n            for (size_t j = 0; j < record.get_length(); ++j)\n            {\n                srecord::record::address_t address = record.get_address() + j;\n                int n = record.get_data(j);\n                if (set_p(address))\n                {\n                    int old = get(address);\n                    if (n == old)\n                    {\n                        // duplicate\n                        switch (redundant_bytes)\n                        {\n                        default:\n                        case defcon_ignore:\n                            break;\n\n                        case defcon_warning:\n                            ifp->warning\n                            (\n                                \"redundant 0x%08lX value (0x%02X)\",\n                                (long)address,\n                                n\n                            );\n                            break;\n\n                        case defcon_fatal_error:\n                            ifp->fatal_error\n                            (\n                                \"redundant 0x%08lX value (0x%02X)\",\n                                (long)address,\n                                n\n                            );\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        // contradicts\n                        switch (contradictory_bytes)\n                        {\n                        case defcon_ignore:\n                            break;\n\n                        case defcon_warning:\n                            ifp->warning\n                            (\n                                \"multiple 0x%08lX values (previous = 0x%02X, \"\n                                    \"this one = 0x%02X)\",\n                                (long)address,\n                                old,\n                                n\n                            );\n                            break;\n\n                        case defcon_fatal_error:\n                            ifp->fatal_error\n                            (\n                                \"multiple 0x%08lX values (previous = 0x%02X, \"\n                                    \"this one = 0x%02X)\",\n                                (long)address,\n                                old,\n                                n\n                            );\n                            break;\n                        }\n                    }\n                }\n                set(address, n);\n            }\n            break;\n\n        case srecord::record::type_execution_start_address:\n            if (!execution_start_address)\n            {\n                execution_start_address = new srecord::record(record);\n            }\n            break;\n        }\n    }\n}\n\n\nbool\noperator == (const srecord::memory &lhs, const srecord::memory &rhs)\n{\n    return srecord::memory::equal(lhs, rhs);\n}\n\n\nbool\noperator != (const srecord::memory &lhs, const srecord::memory &rhs)\n{\n    return !srecord::memory::equal(lhs, rhs);\n}\n\n\nsrecord::memory_chunk *\nsrecord::memory::find_next_chunk(unsigned long address)\n    const\n{\n    //\n    // This method is generally called sequentially, to visit each\n    // and every byte, in cases where walk() is not appropriate.\n    // As such, a binary chop isn't necessary.\n    //\n    if (find_next_chunk_index < nchunks)\n    {\n        srecord::memory_chunk *mcp = chunk[find_next_chunk_index];\n        if (mcp->get_address() > address)\n            find_next_chunk_index = 0;\n    }\n    else\n    {\n        find_next_chunk_index = 0;\n    }\n\n    while (find_next_chunk_index < nchunks)\n    {\n        srecord::memory_chunk *mcp = chunk[find_next_chunk_index];\n        if (mcp->get_address() >= address)\n            return mcp;\n        find_next_chunk_index++;\n    }\n    return 0;\n}\n\n\nbool\nsrecord::memory::find_next_data(unsigned long &address, void *data,\n    size_t &nbytes) const\n{\n    unsigned long address_hi = address / srecord::memory_chunk::size;\n    for (;;)\n    {\n        srecord::memory_chunk *mcp = find_next_chunk(address_hi);\n        if (!mcp)\n            return false;\n        if (mcp->find_next_data(address, data, nbytes))\n            return true;\n        address_hi = mcp->get_address() + 1;\n        address = address_hi * srecord::memory_chunk::size;\n    }\n}\n\n\nsrecord::record *\nsrecord::memory::get_header(void)\n    const\n{\n    return header;\n}\n\n\nvoid\nsrecord::memory::set_header(const std::string &text)\n{\n    // We do NOT call string_url_encode here, we decoded the command\n    // line, so that weird characters can be placed into the header.  Such\n    // as a terminating NUL character.  Re-encoding defeats the purpose.\n    delete header;\n    size_t len = text.size();\n    if (len > srecord::record::max_data_length)\n        len = srecord::record::max_data_length;\n    header =\n        new srecord::record\n        (\n            srecord::record::type_header,\n            0,\n            (srecord::record::data_t *)text.c_str(),\n            len\n        );\n}\n\n\nsrecord::record *\nsrecord::memory::get_execution_start_address(void)\n    const\n{\n    return execution_start_address;\n}\n\n\nvoid\nsrecord::memory::set_execution_start_address(unsigned long addr)\n{\n    delete execution_start_address;\n    execution_start_address =\n        new srecord::record\n        (\n            srecord::record::type_execution_start_address,\n            addr,\n            0,\n            0\n        );\n}\n\n\nbool\nsrecord::memory::has_holes(void)\n    const\n{\n    srecord::memory_walker_continuity::pointer sniffer =\n        srecord::memory_walker_continuity::create();\n    walk(sniffer);\n    return (!sniffer->is_continuous());\n}\n\n\nbool\nsrecord::memory::is_well_aligned(unsigned multiple)\n    const\n{\n    if (multiple < 2)\n        return true;\n    srecord::memory_walker_alignment::pointer sniffer =\n        srecord::memory_walker_alignment::create(multiple);\n    walk(sniffer);\n    return sniffer->is_well_aligned();\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/memory.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2006-2008, 2010, 2012-2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_MEMORY_H\n#define SRECORD_MEMORY_H\n\n#include <string>\n\n#include <srecord/defcon.h>\n#include <srecord/input.h>\n#include <srecord/memory/chunk.h>\n#include <srecord/memory/walker.h>\n#include <srecord/string.h>\n\nnamespace srecord {\n\nclass record; // forward\n\n/**\n  * The srecord::memory class is used to simulate memory contents.\n  * This allows staging of reord adta, and also validation of contents.\n  */\nclass memory\n{\npublic:\n    /**\n      * The default constructor.\n      */\n    memory();\n\n    /**\n      * The copy constructor.\n      */\n    memory(const memory &);\n\n    /**\n      * The assignment operator.\n      */\n    memory &operator=(const memory &);\n\n    /**\n      * The destructor.\n      */\n    ~memory();\n\n    /**\n      * The set method is used to set the byte at the given `address'\n      * to the given `value'.\n      *\n      * Uses the find() method to locate the chunk, and then calls\n      * the memory_chunk::set method, to set the byte within\n      * the chunk.\n      */\n    void set(unsigned long address, int value);\n\n    /**\n      * The get method is used to fetch the value of the byte at\n      * the given 'address'.\n      *\n      * If you fo a get on an address which has not been set() yet,\n      * the results are undefined.\n      *\n      * Uses the find() method to locate the chunk, and then calls\n      * the memory_chunk::get method, to get the byte within\n      * the chunk.\n      */\n    int get(unsigned long address) const;\n\n    /**\n      * The set_p method is used to determine whether the byte at\n      * the given address has been set() yet.  Returns true if\n      * already set, false if never been set.\n      *\n      * Uses the find() method to locate the chunk, and then calls\n      * the memory_chunk::set_p method, to get the status of\n      * the byte within the chunk.\n      */\n    bool set_p(unsigned long address) const;\n\n    /**\n      * The walk method is used to apply a memory_walker derived\n      * class to every byte of memory.\n      */\n    void walk(memory_walker::pointer) const;\n\n    /**\n      * The reader method is used to read the given `input' source\n      * into memory.  This method may be called multiple times,\n      * for multiple input files.\n      *\n      * If the input format supports headers, and the file has a\n      * header, the first header will be remembered, if set_header()\n      * was not called previously.\n      *\n      * @param input\n      *     The source of the byte stream\n      * @param redundant_bytes\n      *     ignore: do nothing\n      *     warning: issue a warning and continue (default)\n      *     error: issuse a atal error message, and exit failure.\n      * @param contradictory_bytes\n      *     If the value at any address is set more than once,\n      *     Thid argument controls what happeens.\n      *     ignore: do nothing\n      *     warning: issue a warning and continue (default)\n      *     error: issuse a atal error message, and exit failure (default).\n      */\n    void reader(const input::pointer &input, defcon_t redundant_bytes,\n        defcon_t contradictory_bytes);\n\n    /**\n      * The equal method may be used to determine if two memory\n      * instances are equal.\n      */\n    static bool equal(const memory &, const memory &);\n\n    /**\n      * The compare method may be used to determine if two memory\n      * instances are equal.  Verbose messages concerning the exact\n      * differences are printed if they are not equal.\n      */\n    static bool compare(const memory &, const memory &);\n\n    /**\n      * The find_next_data method may be used to locate data at or\n      * following the `address' given.  Returns false if there is\n      * no data meeting this criteria.\n      *\n      * If there is data, the `address' will be set to the start\n      * address of the data block.      At most `nbytes' of data will\n      * be transfetrred into the `data' array.  Then `nbytes' wil\n      * be set to the number of bytes transferred.      Returns true.\n      *\n      * Calls the find_next_chunk() method.\n      */\n    bool find_next_data(unsigned long &address, void *data,\n        size_t &nbytes) const;\n\n    /**\n      * The get_header method is used to determine the value of the\n      * header record set by either the reader() or set_header()\n      * methods.  If neither has set a header, a NULL is returned.\n      */\n    record *get_header(void) const;\n\n    /**\n      * The set_header method may be used to set the header command.\n      *\n      * @param value\n      *     The `value' string, to set the header.  The user may use URL\n      *     encoding for of the more interesting non-printable byte values\n      *     (eg. \"%3F\").\n      */\n    void set_header(const std::string &value);\n\n    /**\n      * The get_execution_start_address method is used to determine the\n      * value of the execution start address record set by either the\n      * reader() or set_execution_start_address() methods.  If neither\n      * has set an execution start address, NULL is returned.\n      */\n    record *get_execution_start_address(void) const;\n\n    /**\n      * The set_execution_start_address method may be used to set the\n      * execution start address record.\n      */\n    void set_execution_start_address(unsigned long value);\n\n    /**\n      * The has_holes method may be used to determine whether or not the\n      * memory data has \"holes\" in it.\n      *\n      * @returns\n      *     true if the memory data is not continuous (has at least\n      *     one hole), false if the memory data is continuous (has no\n      *     holes).\n      */\n    bool has_holes(void) const;\n\n    /**\n      * The get_lower_bound method is used to obtain the lower bound\n      * (lowest address) of the memory image.\n      */\n    unsigned long get_lower_bound() const;\n\n    /**\n      * The get_upper_bound method is used to obtain the upper bound\n      * (maximum address plus one) of the memory image.\n      */\n    unsigned long get_upper_bound() const;\n\n   /**\n      * The is_well_aligned method is used to test whether or not\n      * all of the data in the memory buffer is well aligned, on the\n      * given byte boundary.\n      *\n      * @param multiple\n      *     The desired byte alignment.\n      *\n      * @note\n      *     This isn't about holes, it's about the beginnings and\n      *     endings of each consecitice run of bytes.\n      */\n    bool is_well_aligned(unsigned multiple) const;\n\n    /**\n      * The empty method is used to determine whether or not this memory\n      * image has no data in it.\n      */\n    bool\n    empty(void)\n        const\n    {\n        return (nchunks == 0);\n    }\n\nprivate:\n    /**\n      * The nchunks instance variable is used to member how large\n      * our pool of memory chunks is.  It is always <= nchunks_max;\n      */\n    mutable int nchunks;\n\n    /**\n      * The max_chunks instance variable is used to rememberf the\n      * size of the chunk array, which holds the pool of memory chunks.\n      */\n    mutable int nchunks_max;\n\n    /**\n      * The chunk instance variable is used to hold the pointer to\n      * the base of the chunk array.  These chunks remember the\n      * settings of the various bytes.  By using a sparse array,\n      * we can cope with arbitrary memory usages.\n      */\n    mutable memory_chunk **chunk;\n\n    /**\n      * The find method is used to find the chunk which contains\n      * the given `address'.  The chunk will be created if it\n      * doesn't exist.\n      *\n      * Called by the get(), set() and set_p() methods.\n      */\n    memory_chunk *find(unsigned long address) const;\n\n    /**\n      * The cache instance variable is used to accellerate the find()\n      * method, based on the fact that most memory accesses are\n      * sequential, in the same chunk.\n      */\n    mutable memory_chunk *cache;\n\n    /**\n      * The find_next_chunk method is used to visit each and every\n      * byte, in cases where the walk() method is not appropriate.\n      * Called by the find_next_data() method.\n      */\n    memory_chunk *find_next_chunk(unsigned long) const;\n\n    /**\n      * The find_next_chunk_index instance variable is used by\n      * the find_next_chunk() method to keep track of where it is\n      * positioned across the chunk array.\n      */\n    mutable int find_next_chunk_index;\n\n    /**\n      * The header instance variable is used to track the file header.\n      * It is set by the reader() and set_header() methods.  It is\n      * read by the get_header() method.\n      */\n    record *header;\n\n    /**\n      * The execution_start_address instance variable is used to track\n      * the execution start address.  It is set by the reader() and\n      * set_execution_start_address() methods.  It is read by the\n      * get_execution_start_address() method.\n      */\n    record *execution_start_address;\n\n    /**\n      * The clear method is used to discard all data, as if when\n      * the instance was first constructed. Alsu used by the destructor.\n      */\n    void clear(void);\n\n    /**\n      * The copy method is used to copy the chunks from the `src' into\n      * this object.  Only to be used the the assignment operator.\n      */\n    void copy(const memory &src);\n};\n\n};\n\n/**\n  * The equality operator.  Used to test if two srecord::memory objects\n  * are equal.  Calls the srecord::memory::equal() method.\n  */\nbool operator == (const srecord::memory &, const srecord::memory &);\n\n/**\n  * The inequality operator.  Used to test if two srecord::memory objects\n  * are not equal.  Calls the srecord::memory::equal() method.\n  */\nbool operator != (const srecord::memory &, const srecord::memory &);\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_MEMORY_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/aomf.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/output/file/aomf.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_aomf::~output_file_aomf()\n{\n}\n\n\nsrecord::output_file_aomf::output_file_aomf(const std::string &a_file_name) :\n    srecord::output_file(a_file_name)\n{\n    if (line_termination == line_termination_native)\n        line_termination = line_termination_binary;\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_aomf::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_aomf(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_aomf::emit_record(int type, const unsigned char *data,\n    size_t length)\n{\n    checksum_reset();\n    put_byte(type);\n    put_word_le(length + 1);\n    for (size_t j = 0; j < length; ++j)\n        put_byte(data[j]);\n    put_byte(-checksum_get());\n}\n\n\nvoid\nsrecord::output_file_aomf::module_header_record(const char *name)\n{\n    //\n    // The TRN ID describes the system which created the file, and (by\n    // implication) the CPU type is 8051.  It isn't much good to us,\n    // because it doesn't admit that non-Intel systems or other CPUs exist.\n    //     0xFD -> ASM51\n    //     0xFE -> PL/M-51\n    //     0xFF -> RL51\n    //\n    unsigned char buffer[1 + 255 + 2];\n    size_t len = strlen(name);\n    if (len > 255)\n        len = 255;\n    buffer[0] = len;\n    memcpy(buffer + 1, name, len);\n    buffer[len + 1] = 0; // TRN ID\n    buffer[len + 2] = 0; // must be zero\n    emit_record(0x02, buffer, len + 3);\n}\n\n\nvoid\nsrecord::output_file_aomf::content_record(unsigned long address,\n    const unsigned char *data, size_t len)\n{\n    size_t maxlen = 4 * srecord::record::max_data_length;\n    while (len > 0)\n    {\n        unsigned char buffer[maxlen + 3];\n        buffer[0] = address >> 16; // this byte should be zero ;-)\n        buffer[1] = address; // \"offset\" is little-endian\n        buffer[2] = address >> 8;\n        int nbytes = (len > maxlen ? maxlen : len);\n        memcpy(buffer + 3, data, nbytes);\n        emit_record(0x06, buffer, len + 3);\n        address += nbytes;\n        data += nbytes;\n        len -= nbytes;\n    }\n}\n\n\nvoid\nsrecord::output_file_aomf::module_end_record(const char *name)\n{\n    unsigned char buffer[1 + 255 + 4];\n    size_t len = strlen(name);\n    if (len > 255)\n        len = 255;\n    buffer[0] = len;\n    memcpy(buffer + 1, name, len);\n    buffer[len + 1] = 0; // must be zero\n    buffer[len + 2] = 0; // must be zero\n    buffer[len + 3] = 0; // REG MSK\n    buffer[len + 4] = 0; // must be zero\n    emit_record(0x04, buffer, len + 5);\n}\n\n\nvoid\nsrecord::output_file_aomf::put_byte(unsigned char n)\n{\n    checksum_add(n);\n    put_char(n);\n    byte_offset++;\n}\n\n\nvoid\nsrecord::output_file_aomf::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        module_name.assign((const char *)record.get_data(),\n            record.get_length());\n        module_header_record(module_name.c_str());\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        if (!record.address_range_fits_into_n_bits(24))\n            data_address_too_large(record, 24);\n\n        //\n        // Write the data out.\n        //\n        content_record\n        (\n            record.get_address(),\n            record.get_data(),\n            record.get_length()\n        );\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        module_end_record(module_name.c_str());\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_aomf::line_length_set(int)\n{\n    // Ignore.\n}\n\n\nvoid\nsrecord::output_file_aomf::address_length_set(int)\n{\n    // Ignore (this is only a 16-bit format).\n}\n\n\nbool\nsrecord::output_file_aomf::preferred_block_size_set(int)\n{\n    // Irrelevant.\n    return true;\n}\n\n\nint\nsrecord::output_file_aomf::preferred_block_size_get()\n    const\n{\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_aomf::format_name()\n    const\n{\n    return \"AOMF\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/aomf.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_AOMF_H\n#define SRECORD_OUTPUT_FILE_AOMF_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_aomf class is used to represent the output\n  * state of a file in Intel Absolute Object Module Format (AOMF).\n  */\nclass output_file_aomf:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_aomf();\n\nprivate:\n    /**\n      * A constructor.  The input will be read from the named file\n      * (or the standard input if the file name is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_aomf(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\nprivate:\n    /**\n      * The emit_record method is used to emit records in the AOMF format.\n      * Each has an 8-but type, a 16-bit little-endian length, a payload,\n      * and an 8-bit 2s complement checksum.\n      */\n    void emit_record(int, const unsigned char *, size_t);\n\n    /**\n      * The module_header_record method is used to write an AOMF Module\n      * Header Record.\n      */\n    void module_header_record(const char*);\n\n    /**\n      * The content_record method is used to write an AOMF Content Record.\n      */\n    void content_record(unsigned long address, const unsigned char *data,\n        size_t length);\n\n    /**\n      * The module_header_record method is used to write an AOMF Module\n      * End Record.\n      */\n    void module_end_record(const char*);\n\n    /**\n      * See base class for documentation.  We are over-riding it\n      * because we use raw binary, so we call the #put_char method.\n      * This method also tracks the byte_offset, so that we can\n      * align to specific boundaries.  Calls the #checksum_add method.\n      */\n    void put_byte(unsigned char);\n\n    /**\n      * The byte_offset instance variable is used to track the location\n      * in the output file.  Maintained by the #put_byte method.\n      */\n    unsigned long byte_offset;\n\n    /**\n      * The module_name instance variable is used to remember the\n      * information form the Module Header Record for reproduction in\n      * the Module End Record (they are required to agree).\n      */\n    std::string module_name;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_aomf(const output_file_aomf &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_aomf &operator=(const output_file_aomf &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_AOMF_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ascii_hex.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/ascii_hex.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_ascii_hex::~output_file_ascii_hex()\n{\n    emit_end_of_file();\n}\n\n\nsrecord::output_file_ascii_hex::output_file_ascii_hex(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(0),\n    column(0),\n    pref_block_size(16),\n    line_length(pref_block_size * 3 - 1),\n    address_length(2),\n    start_code_emitted(false),\n    end_code_emitted(false)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_ascii_hex::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_ascii_hex(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_ascii_hex::emit_end_of_file()\n{\n    if (end_code_emitted)\n        return;\n\n    if (column)\n    {\n        if (column + 2 > line_length)\n            put_char('\\n');\n        else\n            put_char(' ');\n    }\n    put_char(3);\n    put_char('\\n');\n    column = 0;\n    end_code_emitted = true;\n\n    if (enable_footer_flag)\n    {\n        //\n        // According to the documentation we emit the checksum after\n        // the ETX, which should mean that it is ignored (?!?)\n        //\n        put_stringf(\"$S%4.4X,\\n\", checksum_get16());\n    }\n}\n\n\n\nvoid\nsrecord::output_file_ascii_hex::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // All header data is discarded\n        break;\n\n    case srecord::record::type_data:\n        if (!start_code_emitted)\n        {\n            put_char(2);\n            ++column;\n            start_code_emitted = true;\n\n            if (!enable_optional_address_flag)\n                address = (unsigned long)-1L;\n        }\n        if (address != record.get_address())\n        {\n            //\n            // figure out how wide the address is going to be.\n            //\n            address = record.get_address();\n            int address_width = 2;\n            if (address >= 0x1000000)\n                address_width = 4;\n            if (address >= 0x10000)\n                address_width = 3;\n            if (address_width < address_length)\n                address_width = address_length;\n            address_width *= 2;\n\n            //\n            // Throw a new line if the address isn't going to fit on\n            // this line.\n            //\n            if (column + 5 + address_width > line_length)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            else if (column)\n            {\n                put_char(' ');\n                ++column;\n            }\n\n            //\n            // Now write out the new address.  It is important not to\n            // disturb the checksum, so don't use the put_byte method.\n            //\n            put_stringf(\"$A%0*lX,\\n\", address_width, address);\n            column = 0;\n        }\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            if (column)\n            {\n                if (column + 3 > line_length)\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n                else\n                {\n                    put_char(' ');\n                    ++column;\n                }\n            }\n            put_byte(record.get_data(j));\n            ++address;\n            column += 2;\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        emit_end_of_file();\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_ascii_hex::line_length_set(int linlen)\n{\n    int n = (linlen + 1) / 3;\n    if (n < 1)\n        n = 1;\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n    line_length = pref_block_size * 3 - 1;\n}\n\n\nbool\nsrecord::output_file_ascii_hex::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > srecord::record::max_data_length)\n        return false;\n    pref_block_size = nbytes;\n    line_length = pref_block_size * 3 - 1;\n    return true;\n}\n\n\nvoid\nsrecord::output_file_ascii_hex::address_length_set(int n)\n{\n    if (n < 2)\n        n = 2;\n    if (n > 4)\n        n = 4;\n    address_length = n;\n}\n\n\nint\nsrecord::output_file_ascii_hex::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_ascii_hex::format_name()\n    const\n{\n    return \"Ascii-Hex\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ascii_hex.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_ASCII_HEX_H\n#define SRECORD_OUTPUT_FILE_ASCII_HEX_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_ascii_hex class is used to write a file in\n  * Ascii-Hex-Space format.\n  */\nclass output_file_ascii_hex:\n    public output_file\n{\npublic:\n    /**\n      * The destrutcor.\n      */\n    virtual ~output_file_ascii_hex();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_ascii_hex(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the output.  Used to limit the number of $A line emitted.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable is used to remember which column\n      * we are up to in the output.  Used to limit the length of lines\n      * in the output.\n      */\n    int column;\n\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * number of bytes in the preferred block size.\n      */\n    int pref_block_size;\n\n    /**\n      * The line_length instance variable is used to remember the\n      * maximum length of text lines.\n      */\n    int line_length;\n\n    /**\n      * The address_length instance variable is used to remember\n      * how many bytes of addresses are are to emit.\n      */\n    int address_length;\n\n    /**\n      * The start_code_emitted instance variable is used to remember\n      * whether or not the start code (Ctrl-B) has been emitted.\n      */\n    bool start_code_emitted;\n\n    /**\n      * The end_code_emitted instance variable is used to remember\n      * whether or not the end code (Ctrl-C) has been emitted.\n      */\n    bool end_code_emitted;\n\n    /**\n      * The emit_end_of_file method is used to write the ETX and\n      * checksum out to the file.  It is safe top call this method more\n      * than once, only one ETX will be written.\n      */\n    void emit_end_of_file();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_ascii_hex();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_ascii_hex(const output_file_ascii_hex &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_ascii_hex &operator=(const output_file_ascii_hex &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_ASCII_HEX_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/asm.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstring>\n\n#include <srecord/interval.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/asm.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_asm::~output_file_asm()\n{\n    if (!section_style && range.empty())\n    {\n        if (output_word)\n            emit_word(0xFFFF);\n        else\n            emit_byte(0xFF);\n    }\n    if (column)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n\n    //\n    // write out sections data\n    //\n    if (section_style)\n    {\n        // address\n        put_char('\\n');\n        if (dot_style)\n            put_stringf(\"        .global %s_address\\n\", prefix.c_str());\n        else\n            put_stringf(\"        PUBLIC  %s_address\\n\", prefix.c_str());\n        put_stringf(\"%s_address\\n\", prefix.c_str());\n        interval x = range;\n        while (!x.empty())\n        {\n            interval x2 = x;\n            x2.first_interval_only();\n            x -= x2;\n\n            unsigned long val = x2.get_lowest();\n            char buffer[20];\n            // We do it this way, rather than just making argument 3 a\n            // (?:) conditional, so that the compiler can tell us when\n            // we get the types wrong.  (Besides, it will optimize.)\n            if (hex_style)\n                snprintf(buffer, sizeof(buffer), \"0x%8.8lX\", val);\n            else\n                snprintf(buffer, sizeof(buffer), \"%lu\", val);\n            long len = strlen(buffer);\n\n            if (column && column + len + 2 > line_length)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            if (column == 0)\n            {\n                if (dot_style)\n                    put_stringf(\"        .long   \");\n                else\n                    put_stringf(\"        DL      \");\n                column = 16;\n            }\n            else\n            {\n                put_stringf(\", \");\n                column += 2;\n            }\n            put_string(buffer);\n            column += len;\n        }\n        if (column)\n        {\n            put_char('\\n');\n            column = 0;\n        }\n\n        // length_of_sections\n        put_char('\\n');\n        if (dot_style)\n        {\n            put_stringf\n            (\n                \"        .global %s_length_of_sections\\n\",\n                prefix.c_str()\n            );\n        }\n        else\n        {\n            put_stringf\n            (\n                \"        PUBLIC  %s_length_of_sections\\n\",\n                prefix.c_str()\n            );\n        }\n        put_stringf(\"%s_length_of_sections\\n\", prefix.c_str());\n        long nsections = 0;\n        x = range;\n        while (!x.empty())\n        {\n            interval x2 = x;\n            x2.first_interval_only();\n            x -= x2;\n            ++nsections;\n\n            unsigned long slen = x2.get_highest() - x2.get_lowest();\n            if (output_word)\n                slen /= 2;\n            char buffer[30];\n            if (hex_style)\n                snprintf(buffer, sizeof(buffer), \"0x%8.8lX\", slen);\n            else\n                snprintf(buffer, sizeof(buffer), \"%lu\", slen);\n            long len = strlen(buffer);\n            if (column && column + len + 2 > line_length)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            if (column == 0)\n            {\n                if (dot_style)\n                    put_stringf(\"        .long   \");\n                else\n                    put_stringf(\"        DL      \");\n                column = 16;\n            }\n            else\n            {\n                put_stringf(\", \");\n                column += 2;\n            }\n            put_string(buffer);\n            column += len;\n        }\n        if (column)\n        {\n            put_char('\\n');\n            column = 0;\n        }\n\n        // sections\n        put_char('\\n');\n        if (dot_style)\n            put_stringf(\"        .global %s_sections\\n\", prefix.c_str());\n        else\n            put_stringf(\"        PUBLIC  %s_sections\\n\", prefix.c_str());\n        put_stringf(\"%s_sections\\n\", prefix.c_str());\n        if (dot_style)\n            put_string(\"        .long   \");\n        else\n            put_string(\"        DL      \");\n        if (hex_style)\n            put_stringf(\"0x%4.4lX\\n\", nsections);\n        else\n            put_stringf(\"%lu\\n\", nsections);\n    }\n\n\n    if (enable_footer_flag)\n    {\n        unsigned long hi = range.get_highest();\n        put_stringf(\"; upper bound = 0x%4.4lX\\n\", hi);\n        unsigned long lo = range.get_lowest();\n        put_stringf(\"; lower bound = 0x%4.4lX\\n\", lo);\n    }\n    unsigned long len = range.get_highest() - range.get_lowest();\n    put_stringf(\"; length =      0x%4.4lX\\n\", len);\n\n    if (section_style)\n    {\n        if (dot_style)\n            put_stringf(\"        .end\\n\");\n        else\n            put_stringf(\"        END\\n\");\n    }\n}\n\n\nsrecord::output_file_asm::output_file_asm(const std::string &filename) :\n    srecord::output_file(filename),\n    prefix(\"eprom\"),\n    taddr(0),\n    column(0),\n    current_address(0),\n    line_length(75),\n    org_warn(false),\n    output_word(false),\n    dot_style(false),\n    section_style(false),\n    hex_style(false)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_asm::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_asm(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_asm::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_string)\n    {\n        prefix = cmdln->value_string();\n        cmdln->token_next();\n    }\n    for (;;)\n    {\n        switch (cmdln->token_cur())\n        {\n        case srecord::arglex_tool::token_a430:\n            cmdln->token_next();\n            // Generate \"IAR assembler compiler compliant\" output.\n            section_style = true;\n            hex_style = true;\n            break;\n\n        case srecord::arglex_tool::token_cl430:\n            cmdln->token_next();\n            // Generate \"Code Composer Essential compliant\" output.\n            dot_style = true;\n            section_style = true;\n            hex_style = true;\n            break;\n\n        case srecord::arglex_tool::token_style_dot:\n            cmdln->token_next();\n            dot_style = true;\n            break;\n\n        case srecord::arglex_tool::token_style_hexadecimal:\n            cmdln->token_next();\n            hex_style = true;\n            break;\n\n        case srecord::arglex_tool::token_style_hexadecimal_not:\n            cmdln->token_next();\n            hex_style = false;\n            break;\n\n        case srecord::arglex_tool::token_style_section:\n            cmdln->token_next();\n            section_style = true;\n            break;\n\n        case srecord::arglex_tool::token_output_word:\n            cmdln->token_next();\n            output_word = true;\n            break;\n\n        default:\n            return;\n        }\n    }\n}\n\n\nvoid\nsrecord::output_file_asm::emit_byte(int n)\n{\n    char buffer[8];\n    if (hex_style)\n        sprintf(buffer, \"0x%2.2X\", (unsigned char)n);\n    else\n        sprintf(buffer, \"%u\", (unsigned char)n);\n    int len = strlen(buffer);\n    if (column && (column + 1 + len) > line_length)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n    if (!column)\n    {\n        if (dot_style)\n        {\n            put_string(\"        .byte   \");\n            column = 16;\n        }\n        else\n        {\n            put_string(\"        DB      \");\n            column = 16;\n        }\n    }\n    else\n    {\n        put_char(',');\n        ++column;\n    }\n    put_string(buffer);\n    column += len;\n    ++current_address;\n}\n\n\nvoid\nsrecord::output_file_asm::emit_word(unsigned int n)\n{\n    char buffer[16];\n    if (hex_style)\n        snprintf(buffer, sizeof(buffer), \"0x%4.4X\", (unsigned short)n);\n    else\n        snprintf(buffer, sizeof(buffer), \"%u\", (unsigned short)n);\n    int len = strlen(buffer);\n    if (column && (column + 1 + len) > line_length)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n    if (!column)\n    {\n        if (dot_style)\n        {\n            put_string(\"        .short      \");\n            column = 20;\n        }\n        else\n        {\n            put_string(\"        DW      \");\n            column = 16;\n        }\n    }\n    else\n    {\n        put_char(',');\n        ++column;\n    }\n    put_string(buffer);\n    column += len;\n    current_address += 2;\n}\n\n\nvoid\nsrecord::output_file_asm::write(const srecord::record & record)\n{\n    switch (record.get_type())\n    {\n    default:\n        // ignore\n        break;\n\n    case srecord::record::type_header:\n        // emit header records as comments in the file\n        {\n            bool bol = true;\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                int c = *cp++;\n                if (c == '\\n')\n                {\n                    put_char(c);\n                    bol = true;\n                    continue;\n                }\n                if (bol)\n                    put_string(\"; \");\n                if (isprint(c))\n                    put_char(c);\n                bol = false;\n            }\n            if (!bol)\n                put_char('\\n');\n        }\n        break;\n\n    case srecord::record::type_data:\n        //\n        // emit the data prelude, if we have not done so already\n        //\n        if (section_style && range.empty())\n        {\n            if (dot_style)\n            {\n                put_stringf(\"        .global %s\\n\", prefix.c_str());\n                put_stringf(\"        .text\\n\");\n                put_stringf(\"%s\\n\", prefix.c_str());\n            }\n            else\n            {\n                put_stringf(\"        PUBLIC  %s\\n\", prefix.c_str());\n                put_stringf(\"        RSEG    CODE\\n\");\n                put_stringf(\"%s\\n\", prefix.c_str());\n            }\n\n            if (!enable_optional_address_flag)\n                current_address = (unsigned long)-1L;\n        }\n\n        if (current_address != record.get_address())\n        {\n            current_address = record.get_address();\n\n            if (!section_style)\n            {\n                if (column)\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n\n                const char *org = dot_style ? \".org\" : \"ORG\";\n                if (range.empty())\n                {\n                    put_stringf\n                    (\n                        \"; To avoid this next %s directive, use the \"\n                            \"--offset -0x%lX filter.\\n\",\n                        org,\n                        current_address\n                    );\n                }\n                else if (!org_warn)\n                {\n                    org_warn = true;\n                    put_stringf\n                    (\n                        \"; To avoid this next %s directive, use the \"\n                            \"--fill filter.\\n\",\n                        org\n                    );\n                }\n                put_stringf(\"        %-7s %lu\\n\", org, current_address);\n            }\n        }\n        if (output_word)\n        {\n            int len = record.get_length();\n            if (len & 1)\n                fatal_alignment_error(2);\n            range += interval(record.get_address(), record.get_address() + len);\n\n            //\n            // No attempt is made to align the data on even byte\n            // boundaries, use the --fill --range-pad filter for that.\n            //\n            for (int j = 0; j < len; j += 2)\n            {\n                unsigned char n1 = record.get_data(j);\n                unsigned char n2 = record.get_data(j + 1);\n                // little-endian\n                unsigned short n = n1 + (n2 << 8);\n                emit_word(n);\n            }\n        }\n        else\n        {\n            range +=\n                interval\n                (\n                    record.get_address(),\n                    record.get_address() + record.get_length()\n                );\n\n            for (size_t j = 0; j < record.get_length(); ++j)\n            {\n                emit_byte(record.get_data(j));\n            }\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        taddr = record.get_address();\n        if (enable_goto_addr_flag)\n        {\n            if (column)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            put_stringf(\"; execution start address = 0x%4.4lX\\n\", taddr);\n        }\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_asm::line_length_set(int n)\n{\n    line_length = n;\n}\n\n\nvoid\nsrecord::output_file_asm::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_asm::preferred_block_size_set(int nbytes)\n{\n    if (nbytes <= 0)\n        return false;\n    if (!output_word)\n        return true;\n    return ((nbytes & 1) == 0);\n}\n\n\nint\nsrecord::output_file_asm::preferred_block_size_get()\n    const\n{\n    //\n    // Use the largest we can get.\n    //\n    if (output_word)\n        return (srecord::record::max_data_length & ~1);\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_asm::format_name()\n    const\n{\n    return (output_word ? \"Assembler (16-bit)\" : \"Assembler (8-bit)\");\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/asm.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_ASM_H\n#define SRECORD_OUTPUT_FILE_ASM_H\n\n#include <srecord/output/file.h>\n#include <srecord/interval.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_asm class is used to represent an output file\n  * which emits assembler code.\n  */\nclass output_file_asm:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_asm();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_asm(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The prefix instance variable is used to remember the variable\n      * name prefix to be used in the output.\n      */\n    std::string prefix;\n\n    /**\n      * The taddr instance variabel is used to remember the\n      * termination address, to be emitted in the footer.\n      */\n    unsigned long taddr;\n\n    /**\n      * The range instance variable is used to remember the range\n      * of addresses present in the output.\n      */\n    interval range;\n\n    /**\n      * The column instance variable is used to remember the current\n      * printing column on the line.\n      */\n    int column;\n\n    /**\n      * The current_address instance variabel is used to remember\n      * the current address that the file is positioned at.  This is\n      * used to know whether we need to add padding.\n      */\n    unsigned long current_address;\n\n    /**\n      * The line_length instance variable is used to remember the\n      * maximum line length.  The output usually does not exceed it.\n      */\n    int line_length;\n\n    /**\n      * The org_warn instance variable is used to remember if the ORG\n      * directive warning comment has been issued.\n      */\n    bool org_warn;\n\n    /**\n      * The output_word instance variable is used to remember whether or not\n      * the input bytes should be emitted as word.\n      */\n    bool output_word;\n\n    /**\n      * The emit_byte method is used to emit a single byte.  It uses\n      * column to track the position, so as not to exceed line_length.\n      */\n    void emit_byte(int);\n\n    /**\n      * The emit_word method is used to emit 2 byte.  It uses\n      * column to track the position, so as not to exceed line_length.\n      * It is called by output_word addition.\n      */\n    void emit_word(unsigned int);\n\n    /**\n      * The emit_4byte method is used to emit a double word (4 Byte).  It uses\n      * column to track the position, so as not to exceed line_length.\n      */\n    void emit_4byte_array(unsigned long *);\n\n    /**\n      * The dot_style instance variable is used to remember whether or\n      * not \"dot\" style pseudo-ops are being used.  Such as:\n      *\n      *     not dot_style  dot_style\n      *     -------------  ------------------------\n      *     DB             .byte\n      *     DL             .long\n      *     DW             .short\n      *     END            .end\n      *     ORG            .org\n      *     PUBLIC         .global\n      */\n    bool dot_style;\n\n    /**\n      * The section_style instance variable is used to remember whether\n      * or not the output is to contain \"sections\".\n      *\n      * In non-section output, the output uses ORG (.org) directives to\n      * place the code at the appropriate addresses.  In section output,\n      * tables of addresses and lenthgs are emitted, and the actual data\n      * is intended to be relocated at run time.\n      */\n    bool section_style;\n\n    /**\n      * The hex_style is used to reember whether or not we are using\n      * hexadecimal constatnts or decimal constants.\n      */\n    bool hex_style;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_asm();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_asm(const output_file_asm &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_asm &operator=(const output_file_asm &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_ASM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/atmel_generic.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/atmel_generic.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_atmel_generic::~output_file_atmel_generic()\n{\n}\n\n\nsrecord::output_file_atmel_generic::output_file_atmel_generic(\n    const std::string &a_file_name,\n    endian_t a_end\n) :\n    srecord::output_file(a_file_name),\n    end(a_end)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_atmel_generic::create(const std::string &a_file_name,\n    endian_t a_end)\n{\n    return pointer(new srecord::output_file_atmel_generic(a_file_name, a_end));\n}\n\n\nvoid\nsrecord::output_file_atmel_generic::write(const srecord::record &record)\n{\n    // This format can't do header records or termination records\n    if (record.get_type() != srecord::record::type_data)\n        return;\n\n    if (!record.address_range_fits_into_n_bits(17))\n        data_address_too_large(record, 17);\n\n    long address = record.get_address();\n    if ((address & 1) || (record.get_length() & 1))\n        fatal_alignment_error(2);\n    for (size_t j = 0; j < record.get_length(); j += 2)\n    {\n        put_3bytes_be(address / 2);\n        put_char(':');\n        if (end == endian_big)\n        {\n            put_byte(record.get_data(j + 1));\n            put_byte(record.get_data(j));\n        }\n        else\n        {\n            put_byte(record.get_data(j));\n            put_byte(record.get_data(j + 1));\n        }\n        put_char('\\n');\n        address += 2;\n    }\n}\n\n\nvoid\nsrecord::output_file_atmel_generic::line_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nvoid\nsrecord::output_file_atmel_generic::address_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nbool\nsrecord::output_file_atmel_generic::preferred_block_size_set(int nbytes)\n{\n    return (nbytes == 2);\n}\n\n\nint\nsrecord::output_file_atmel_generic::preferred_block_size_get()\n    const\n{\n    //\n    // Use the largest we can get,\n    // but make sure it is an even number of bytes long.\n    //\n    return (srecord::record::max_data_length & ~1);\n}\n\n\nconst char *\nsrecord::output_file_atmel_generic::format_name()\n    const\n{\n    return \"Atmel-Generic\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/atmel_generic.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_ATMEL_GENERIC_H\n#define SRECORD_OUTPUT_FILE_ATMEL_GENERIC_H\n\n#include <srecord/endian.h>\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_ascii_hex class is used to write a file in\n  * Atmel Generic format.\n  */\nclass output_file_atmel_generic:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_atmel_generic();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The file to write the data to, or \"-\" to mean the standard\n      *     output.\n      * @param end\n      *     The byte order of the output.\n      */\n    output_file_atmel_generic(const std::string &file_name, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      * @param end\n      *     The byte order of the output.\n      */\n    static pointer create(const std::string &file_name, endian_t end);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The end instance variable is used to remember the byte order\n      * of the output, big-endian or little-endian.\n      */\n    endian_t end;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_atmel_generic();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_atmel_generic(const output_file_atmel_generic &);\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_atmel_generic &operator=(const output_file_atmel_generic &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_ATMEL_GENERIC_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/basic.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstring>\n\n#include <srecord/interval.h>\n#include <srecord/output/file/basic.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_basic::~output_file_basic()\n{\n    if (range.empty())\n        emit_byte(0xFF);\n    if (column)\n        put_char('\\n');\n\n    if (enable_footer_flag)\n    {\n        put_stringf(\"REM termination = %lu\\n\", taddr);\n        unsigned long start = range.get_lowest();\n        put_stringf(\"REM start = %lu\\n\", start);\n        unsigned long finish = range.get_highest();\n        put_stringf(\"REM finish = %lu\\n\", finish);\n    }\n    unsigned long len = range.get_highest() - range.get_lowest();\n    put_stringf(\"REM length = %lu\\n\", len);\n}\n\n\nsrecord::output_file_basic::output_file_basic(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    taddr(0),\n    column(0),\n    current_address(0),\n    line_length(75)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_basic::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_basic(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_basic::emit_byte(int n)\n{\n    char buffer[8];\n    sprintf(buffer, \"%d\", (unsigned char)n);\n    int len = strlen(buffer);\n    if (column && column + 1 + len > line_length)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n    if (!column)\n    {\n        put_string(\"DATA \");\n        column = 5;\n    }\n    else\n    {\n        put_char(',');\n        ++column;\n    }\n    put_string(buffer);\n    column += len;\n    ++current_address;\n}\n\n\nvoid\nsrecord::output_file_basic::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    default:\n        // ignore\n        break;\n\n    case srecord::record::type_header:\n        // emit header records as comments in the file\n        {\n            bool bol = true;\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n            int c = *cp++;\n            if (c == '\\n')\n            {\n                put_char(c);\n                bol = true;\n                continue;\n            }\n            if (bol)\n                put_string(\"REM \");\n            if (isprint(c))\n                put_char(c);\n            bol = false;\n            }\n            if (!bol)\n            put_char('\\n');\n        }\n        break;\n\n    case srecord::record::type_data:\n        if (range.empty())\n            current_address = record.get_address();\n        range +=\n            interval\n            (\n                record.get_address(),\n                record.get_address() + record.get_length()\n            );\n        while (current_address < record.get_address())\n            emit_byte(0xFF);\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            if (record.get_address() + j < current_address)\n                continue;\n            emit_byte(record.get_data(j));\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        taddr = record.get_address();\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_basic::line_length_set(int n)\n{\n    line_length = n;\n}\n\n\nvoid\nsrecord::output_file_basic::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_basic::preferred_block_size_set(int)\n{\n    // ignore\n    return true;\n}\n\n\nint\nsrecord::output_file_basic::preferred_block_size_get()\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    //\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_basic::format_name()\n    const\n{\n    return \"Basic\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/basic.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_BASIC_H\n#define SRECORD_OUTPUT_FILE_BASIC_H\n\n#include <srecord/output/file.h>\n#include <srecord/interval.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_basic class is used to emit record in BASIc\n  * format, using DATA statements.\n  */\nclass output_file_basic:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_basic();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_basic(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for docum,entation.\n    void write(const record &);\n\n    // See base class for docum,entation.\n    void line_length_set(int);\n\n    // See base class for docum,entation.\n    void address_length_set(int);\n\n    // See base class for docum,entation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The taddr instance variabel is used to remember the\n      * termination address, to be emitted in the footer.\n      */\n    unsigned long taddr;\n\n    /**\n      * The range instance variable is used to remember the range\n      * of addresses present in the output.\n      */\n    interval range;\n\n    /**\n      * The column instance variable is used to remember the current\n      * printing column on the line.\n      */\n    int column;\n\n    /**\n      * The current_address instance variabel is used to remember\n      * the current address that the file is positioned at.  This is\n      * used to know whether we need to add padding.\n      */\n    unsigned long current_address;\n\n    /**\n      * The line_length instance variable is used to remember the\n      * maximum line length.  The output usually does not exceed it.\n      */\n    int line_length;\n\n    /**\n      * The emit_byte method is used to emit a single byte.  It uses\n      * column to track the position, so as not to exceed line_length.\n      */\n    void emit_byte(int);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_basic();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_basic(const output_file_basic &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_basic &operator=(const output_file_basic &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_BASIC_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/binary.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2006-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/binary.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_binary::~output_file_binary()\n{\n}\n\n\nsrecord::output_file_binary::output_file_binary(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name)\n{\n    if (line_termination == line_termination_native)\n        line_termination = line_termination_binary;\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_binary::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_binary(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_binary::write(const srecord::record &record)\n{\n    // This format can't do header records or termination records\n    if (record.get_type() != srecord::record::type_data)\n        return;\n    seek_to(record.get_address());\n    const unsigned char *data = record.get_data();\n    int length = record.get_length();\n    while (length-- > 0)\n        put_char(*data++);\n}\n\n\nvoid\nsrecord::output_file_binary::line_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nvoid\nsrecord::output_file_binary::address_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nbool\nsrecord::output_file_binary::preferred_block_size_set(int)\n{\n    // Ignore.\n    return true;\n}\n\n\nint\nsrecord::output_file_binary::preferred_block_size_get()\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    //\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_binary::format_name()\n    const\n{\n    return \"Binary\";\n}\n\n\nbool\nsrecord::output_file_binary::is_binary(void)\n    const\n{\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/binary.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_BINARY_H\n#define SRECORD_OUTPUT_FILE_BINARY_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_binary class is used to represent an output\n  * file in raw binary format.\n  */\nclass output_file_binary:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_binary();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The file name to open and write output to.\n      */\n    output_file_binary(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_binary();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_binary(const output_file_binary &);\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_binary &operator=(const output_file_binary &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_BINARY_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/brecord.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007-2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/brecord.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_brecord::~output_file_brecord()\n{\n}\n\n\nsrecord::output_file_brecord::output_file_brecord(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    block_size(BUFFER_MAXIMUM_MAXIMUM)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_brecord::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_brecord(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_brecord::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_execution_start_address:\n        put_4bytes_be(record.get_address());\n        put_byte(0);\n        put_char('\\n');\n        break;\n\n    default:\n        // This format can't do any other record types\n        break;\n\n    case srecord::record::type_data:\n        put_4bytes_be(record.get_address());\n        assert(record.get_length() <= BUFFER_MAXIMUM_MAXIMUM);\n        put_byte(record.get_length());\n        for (unsigned j = 0; j < record.get_length(); ++j)\n            put_byte(record.get_data(j));\n        put_char('\\n');\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_brecord::line_length_set(int w)\n{\n    int x = (w - 10) / 2;\n    if (x < 2)\n        x = 2;\n    else if (x > BUFFER_MAXIMUM_MAXIMUM)\n        x = BUFFER_MAXIMUM_MAXIMUM;\n    block_size = x;\n}\n\n\nvoid\nsrecord::output_file_brecord::address_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nbool\nsrecord::output_file_brecord::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 2 || nbytes > BUFFER_MAXIMUM_MAXIMUM)\n        return false;\n    block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_brecord::preferred_block_size_get()\n    const\n{\n    return block_size;\n}\n\n\nconst char *\nsrecord::output_file_brecord::format_name()\n    const\n{\n    return \"B-Record\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/brecord.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_BRECORD_H\n#define SRECORD_OUTPUT_FILE_BRECORD_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_brecord class is used to represent an output\n  * files in Motorola MC68EZ328 bootstrap b-record format.\n  */\nclass output_file_brecord:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_brecord();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to write the output to.\n      *     The string \"-\" is understood to mean the standard output.\n      */\n    output_file_brecord(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.\n      *     The name \"-\" is understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    enum { BUFFER_MAXIMUM_MAXIMUM = 31 };\n    unsigned block_size;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_brecord();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_brecord(const output_file_brecord &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_brecord &operator=(const output_file_brecord &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_BRECORD_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/c.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2006-2010 Peter Miller\n// Copyright (C) 2014 Scott Finneran\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstring>\n\n#include <srecord/interval.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/c.h>\n#include <srecord/record.h>\n\n\nstatic std::string\ntoupper(const std::string &s)\n{\n    char *buffer = new char[s.size() + 1];\n    char *bp = buffer;\n    const char *cp = s.c_str();\n    while (*cp)\n    {\n        unsigned char c = *cp++;\n        if (islower(c))\n            *bp++ = toupper(c);\n        else\n            *bp++ = c;\n    }\n    std::string result(buffer, bp - buffer);\n    delete [] buffer;\n    return result;\n}\n\n\nstatic std::string\nidentifier(const std::string &s)\n{\n    char *buffer = new char[s.size() + 1];\n    char *bp = buffer;\n    const char *cp = s.c_str();\n    while (*cp)\n    {\n        unsigned char c = *cp++;\n        if (islower(c))\n            *bp++ = toupper(c);\n        else if (isalnum(c))\n            *bp++ = c;\n        else\n            *bp++ = '_';\n    }\n    std::string result(buffer, bp - buffer);\n    delete [] buffer;\n    return result;\n}\n\n\nsrecord::output_file_c::~output_file_c()\n{\n    //\n    // Finish initializing the data array.\n    //\n    emit_header();\n    if (range.empty())\n    {\n        if (output_word)\n            emit_word(0xFFFF);\n        else\n            emit_byte(0xFF);\n    }\n    if (column)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n    put_string(\"};\\n\");\n\n    int nsections = 0;\n    if (section_style)\n    {\n        //\n        // emit list of section addresses\n        //\n        put_string(\"\\n\");\n        if (constant)\n            put_string(\"const \");\n        put_stringf(\"unsigned long %s_address[] =\\n{\\n\", prefix.c_str());\n        interval x = range;\n        while (!x.empty())\n        {\n            interval x2 = x;\n            x2.first_interval_only();\n            x -= x2;\n            unsigned long address = x2.get_lowest();\n\n            std::string s = format_address(address);\n            int len = s.size();\n\n            if (column && column + len + 2 > line_length)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            if (column)\n            {\n                put_char(' ');\n                ++column;\n            }\n            put_string(s);\n            column += len;\n            put_char(',');\n            ++column;\n        }\n        if (column)\n        {\n            put_char('\\n');\n            column = 0;\n        }\n        put_stringf(\"};\\n\");\n\n        //\n        // emit list of section word addresses\n        // (assuming memoryaddresses are word-wide).\n        //\n        if (output_word)\n        {\n            if (constant)\n                put_string(\"const \");\n            put_stringf(\"unsigned long %s_word_address[] =\\n{\\n\",\n                        prefix.c_str());\n            x = range;\n            while (!x.empty())\n            {\n                interval x2 = x;\n                x2.first_interval_only();\n                x -= x2;\n                unsigned long address = x2.get_lowest() / 2;\n\n                std::string s = format_address(address);\n                int len = s.size();\n\n                if (column && column + len + 2 > line_length)\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n                if (column)\n                {\n                    put_char(' ');\n                    ++column;\n                }\n                put_string(s);\n                column += len;\n                put_char(',');\n                ++column;\n            }\n            if (column)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            put_stringf(\"};\\n\");\n        }\n\n        //\n        // emit list of section lengths\n        //\n        if (constant)\n            put_string(\"const \");\n        put_stringf\n        (\n            \"unsigned long %s_length_of_sections[] =\\n{\\n\",\n            prefix.c_str()\n        );\n        x = range;\n        while (!x.empty())\n        {\n            interval x2 = x;\n            x2.first_interval_only();\n            x -= x2;\n            unsigned long length = x2.get_highest() - x2.get_lowest();\n            ++nsections;\n\n            if (output_word)\n                length /= 2;\n            std::string s = format_address(length);\n            int len = s.size();\n\n            if (column && column + len + 2 > line_length)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            if (column)\n            {\n                put_char(' ');\n                ++column;\n            }\n            put_string(s);\n            column += len;\n            put_char(',');\n            ++column;\n        }\n        if (column)\n        {\n            put_char('\\n');\n            column = 0;\n        }\n        put_string(\"};\\n\");\n\n        //\n        // emit the number of sections\n        //\n        if (constant)\n            put_string(\"const \");\n        put_string(\"unsigned long \");\n        put_string(prefix.c_str());\n        put_string(\"_sections    = \");\n        put_string(format_address(nsections));\n        put_string(\";\\n\");\n    }\n\n    if (enable_goto_addr_flag)\n    {\n        if (constant)\n            put_string(\"const \");\n        put_stringf\n        (\n            \"unsigned long %s_termination = %s;\\n\",\n            prefix.c_str(),\n            format_address(taddr).c_str()\n        );\n    }\n    if (enable_footer_flag)\n    {\n        if (constant)\n            put_string(\"const \");\n        put_stringf\n        (\n            \"unsigned long %s_start       = %s;\\n\",\n            prefix.c_str(),\n            format_address(range.get_lowest()).c_str()\n        );\n        if (constant)\n            put_string(\"const \");\n        put_stringf\n        (\n            \"unsigned long %s_finish      = %s;\\n\",\n            prefix.c_str(),\n            format_address(range.get_highest()).c_str()\n        );\n    }\n\n    if (constant)\n        put_string(\"const \");\n    put_stringf\n    (\n        \"unsigned long %s_length      = %s;\\n\",\n        prefix.c_str(),\n        format_address(range.get_highest() - range.get_lowest()).c_str()\n    );\n\n    //\n    // Some folks prefer #define instead\n    //\n    put_char('\\n');\n\n    std::string PREFIX = toupper(prefix);\n    put_stringf\n    (\n        \"#define %s_TERMINATION %s\\n\",\n        PREFIX.c_str(),\n        format_address(taddr).c_str()\n    );\n    put_stringf\n    (\n        \"#define %s_START       %s\\n\",\n        PREFIX.c_str(),\n        format_address(range.get_lowest()).c_str()\n    );\n    put_stringf\n    (\n        \"#define %s_FINISH      %s\\n\",\n        PREFIX.c_str(),\n        format_address(range.get_highest()).c_str()\n    );\n    put_stringf\n    (\n        \"#define %s_LENGTH      %s\\n\",\n        PREFIX.c_str(),\n        format_address(range.get_highest() - range.get_lowest()).c_str()\n    );\n    if (section_style)\n    {\n        put_stringf\n        (\n            \"#define %s_SECTIONS    %s\\n\",\n            PREFIX.c_str(),\n            format_address(nsections).c_str()\n        );\n    }\n\n    if (include)\n    {\n        std::string insulation = identifier(include_file_name);\n        FILE *fp = fopen(include_file_name.c_str(), \"w\");\n        if (!fp)\n            fatal_error_errno(\"open %s\", include_file_name.c_str());\n        fprintf(fp, \"#ifndef %s\\n\", insulation.c_str());\n        fprintf(fp, \"#define %s\\n\", insulation.c_str());\n        fprintf(fp, \"\\n\");\n        if (enable_goto_addr_flag)\n        {\n            fprintf(fp, \"extern \");\n            if (constant)\n                fprintf(fp, \"const \");\n            fprintf\n            (\n                fp,\n                \"unsigned long %s_termination;\\n\",\n                prefix.c_str()\n            );\n        }\n        if (enable_footer_flag)\n        {\n            fprintf(fp, \"extern \");\n            if (constant)\n                fprintf(fp, \"const \");\n            fprintf(fp, \"unsigned long %s_start;\\n\", prefix.c_str());\n            fprintf(fp, \"extern \");\n            if (constant)\n                fprintf(fp, \"const \");\n            fprintf(fp, \"unsigned long %s_finish;\\n\", prefix.c_str());\n        }\n        fprintf(fp, \"extern \");\n        if (constant)\n            fprintf(fp, \"const \");\n        fprintf(fp, \"unsigned long %s_length;\\n\", prefix.c_str());\n        if (section_style)\n        {\n            fprintf(fp, \"extern \");\n            if (constant)\n                fprintf(fp, \"const \");\n            fprintf(fp, \"unsigned long %s_sections;\\n\", prefix.c_str());\n        }\n        fprintf(fp, \"extern \");\n        if (constant)\n            fprintf(fp, \"const \");\n        fprintf(fp, \"unsigned \");\n        if (output_word)\n            fprintf(fp, \"short\");\n        else\n            fprintf(fp, \"char\");\n        fprintf(fp, \" %s[];\\n\", prefix.c_str());\n        if (section_style)\n        {\n            fprintf(fp, \"extern \");\n            if (constant)\n                fprintf(fp, \"const \");\n            fprintf(fp, \"unsigned long\");\n            fprintf(fp, \" %s_address[];\\n\", prefix.c_str());\n            if (output_word)\n            {\n                fprintf(fp, \"extern \");\n                if (constant)\n                    fprintf(fp, \"const \");\n                fprintf(fp, \"unsigned long\");\n                fprintf(fp, \" %s_word_address[];\\n\", prefix.c_str());\n            }\n            fprintf(fp, \"extern \");\n            if (constant)\n                fprintf(fp, \"const \");\n            fprintf(fp, \"unsigned long\");\n            fprintf(fp, \" %s_length_of_sections[];\\n\", prefix.c_str());\n        }\n        fprintf(fp, \"\\n\");\n        fprintf(fp, \"#endif /* %s */\\n\", insulation.c_str());\n\n        if (fclose(fp))\n            fatal_error_errno(\"write %s\", include_file_name.c_str());\n    }\n}\n\n\nstatic const char *\nmemrchr(const char *data, char c, size_t len)\n{\n    if (!data)\n        return 0;\n    const char *result = 0;\n    while (len > 0)\n    {\n        const char *p = (const char *)memchr(data, c, len);\n        if (!p)\n            break;\n        result = p;\n        size_t chunk = p - data + 1;\n        data += chunk;\n        len -= chunk;\n    }\n    return result;\n}\n\n\nstatic std::string\nbuild_include_file_name(const std::string &filename)\n{\n    const char *fn = filename.c_str();\n    // Watch out for out base class adding a line number.\n    const char *colon = strstr(fn, \": \");\n    if (!colon)\n        colon = fn + strlen(fn);\n    const char *slash = memrchr(fn, '/', colon - fn);\n    if (!slash)\n        slash = memrchr(fn, '\\\\', colon - fn);\n    if (slash)\n        slash++;\n    else\n        slash = fn;\n    const char *ep = memrchr(slash, '.', colon - slash);\n    if (!ep)\n        ep = colon;\n    return (std::string(fn, ep - fn) + \".h\");\n}\n\n\nsrecord::output_file_c::output_file_c(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    prefix(\"eprom\"),\n    header_prefix(\"\"),\n    header_postfix(\"\"),\n    taddr(0),\n    header_done(false),\n    column(0),\n    current_address(0),\n    line_length(75),\n    address_length(4),\n    constant(true),\n    include(false),\n    include_file_name(build_include_file_name(a_file_name)),\n    output_word(false),\n    hex_style(true),\n    section_style(false)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_c::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_c(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_c::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_string)\n    {\n        prefix = cmdln->value_string();\n        cmdln->token_next();\n    }\n    for (;;)\n    {\n        switch (cmdln->token_cur())\n        {\n        case srecord::arglex_tool::token_constant:\n            cmdln->token_next();\n            constant = true;\n            break;\n\n        case srecord::arglex_tool::token_constant_not:\n            cmdln->token_next();\n            constant = false;\n            break;\n\n        case srecord::arglex_tool::token_include:\n            cmdln->token_next();\n            include = true;\n            break;\n\n        case srecord::arglex_tool::token_include_not:\n            cmdln->token_next();\n            include = false;\n            break;\n\n        case srecord::arglex_tool::token_c_compressed:\n            cmdln->token_next();\n            hex_style = true;\n            section_style = true;\n            break;\n\n        case srecord::arglex_tool::token_output_word:\n            cmdln->token_next();\n            output_word = true;\n            break;\n\n        case srecord::arglex_tool::token_style_hexadecimal:\n            cmdln->token_next();\n            hex_style = true;\n            break;\n\n        case srecord::arglex_tool::token_style_hexadecimal_not:\n            cmdln->token_next();\n            hex_style = false;\n            break;\n\n        case srecord::arglex_tool::token_prefix:\n            cmdln->token_next();\n            if (cmdln->token_cur() == arglex::token_string)\n            {\n                header_prefix = cmdln->value_string();\n                cmdln->token_next();\n            }\n            break;\n\n        case srecord::arglex_tool::token_postfix:\n            cmdln->token_next();\n            if (cmdln->token_cur() == arglex::token_string)\n            {\n                header_postfix = cmdln->value_string();\n                cmdln->token_next();\n            }\n            break;\n\n        case srecord::arglex_tool::token_style_section:\n        case srecord::arglex_tool::token_a430:\n        case srecord::arglex_tool::token_cl430:\n            cmdln->token_next();\n            section_style = true;\n            break;\n\n        default:\n            return;\n        }\n    }\n}\n\n\nvoid\nsrecord::output_file_c::emit_header()\n{\n    if (header_done)\n        return;\n\n    if (header_prefix.length() > 0)\n    {\n        put_string(header_prefix.c_str());\n        put_string(\" \");\n    }\n    if (constant)\n        put_stringf(\"const \");\n    if (output_word)\n        put_string(\"unsigned short\");\n    else\n        put_string(\"unsigned char\");\n    put_char(' ');\n    put_string(prefix.c_str());\n    put_string(\"[] \");\n    if (header_postfix.length() > 0)\n    {\n        put_string(header_postfix.c_str());\n        put_string(\" \");\n    }\n    put_string(\"=\\n{\\n\");\n    header_done = true;\n    column = 0;\n}\n\n\nvoid\nsrecord::output_file_c::emit_byte(int n)\n{\n    char buffer[30];\n    if (hex_style)\n        snprintf(buffer, sizeof(buffer), \"0x%2.2X\", (unsigned char)n);\n    else\n        snprintf(buffer, sizeof(buffer), \"%u\", (unsigned char)n);\n    int len = strlen(buffer);\n\n    if (column && column + 2 + len > line_length)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n    if (column)\n    {\n        put_char(' ');\n        ++column;\n    }\n    put_string(buffer);\n    column += len;\n    put_char(',');\n    ++column;\n}\n\n\nvoid\nsrecord::output_file_c::emit_word(unsigned int n)\n{\n    char buffer[30];\n    if (hex_style)\n        snprintf(buffer, sizeof(buffer), \"0x%4.4X\", (unsigned short)n);\n    else\n        snprintf(buffer, sizeof(buffer), \"%u\", (unsigned short)n);\n    int len = strlen(buffer);\n\n    if (column && column + 2 + len > line_length)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n    if (column)\n    {\n        put_char(' ');\n        ++column;\n    }\n    put_string(buffer);\n    column += len;\n    put_char(',');\n    ++column;\n}\n\n\nstd::string\nsrecord::output_file_c::format_address(unsigned long addr)\n{\n    char buffer[30];\n    if (hex_style)\n        snprintf(buffer, sizeof(buffer), \"0x%0*lX\", address_length * 2, addr);\n    else\n        snprintf(buffer, sizeof(buffer), \"%lu\", addr);\n    return buffer;\n}\n\n\nvoid\nsrecord::output_file_c::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    default:\n        // ignore\n        break;\n\n    case srecord::record::type_header:\n        // emit header records as comments in the file\n        {\n            put_string(\"/* \");\n            if (record.get_address() != 0)\n            {\n                unsigned long addr = record.get_address();\n                put_stringf(\"%08lX: \", addr);\n            }\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (isprint(c) || isspace(c))\n                    put_char(c);\n                else\n                    put_stringf(\"\\\\%o\", c);\n                // make sure we don't end the comment\n                if (c == '*' && cp < ep && *cp == '/')\n                    put_char(' ');\n            }\n            put_string(\" */\\n\");\n        }\n        break;\n\n    case srecord::record::type_data:\n        emit_header();\n        if (output_word)\n        {\n            if ((record.get_address() & 1) || (record.get_length() & 1))\n                fatal_alignment_error(2);\n\n            unsigned long min = record.get_address();\n            unsigned long max = record.get_address() + record.get_length();\n            if (!section_style && !range.empty())\n            {\n                // assert(current_address <= min);\n                while (current_address < min)\n                {\n                    emit_word(0xFFFF);\n                    current_address += 2;\n                }\n            }\n\n            range += interval(min, max);\n\n            for (size_t j = 0; j < record.get_length(); j += 2)\n            {\n                unsigned char n1 = record.get_data(j);\n                unsigned char n2 = record.get_data(j + 1);\n                // little endian\n                unsigned short n = n1 + (n2 << 8);\n                emit_word(n);\n            }\n            current_address = max;\n        }\n        else\n        {\n            unsigned long min = record.get_address();\n            unsigned long max = record.get_address() + record.get_length();\n            if (!section_style && !range.empty())\n            {\n                // assert(current_address <= min);\n                while (current_address < min)\n                {\n                    emit_byte(0xFF);\n                    ++current_address;\n                }\n            }\n\n            range += interval(min, max);\n            for (size_t j = 0; j < record.get_length(); ++j)\n            {\n                emit_byte(record.get_data(j));\n            }\n            current_address = max;\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        taddr = record.get_address();\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_c::line_length_set(int n)\n{\n    line_length = n;\n}\n\n\nvoid\nsrecord::output_file_c::address_length_set(int n)\n{\n    switch (n)\n    {\n    default:\n        address_length = 4;\n        break;\n\n    case 1:\n    case 2:\n    case 3:\n    case 4:\n        address_length = n;\n        break;\n\n    case 16:\n        address_length = 2;\n        break;\n\n    case 32:\n        address_length = 4;\n        break;\n    }\n}\n\n\nbool\nsrecord::output_file_c::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (output_word && (nbytes & 1))\n        return false;\n    return true;\n}\n\n\nint\nsrecord::output_file_c::preferred_block_size_get()\n    const\n{\n    //\n    // Use the largest we can get,\n    // but be careful about words.\n    //\n    if (output_word)\n        return (srecord::record::max_data_length & ~1);\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_c::format_name()\n    const\n{\n    return (output_word ? \"C-Array (16-bit)\" : \"C-Array (8-bit)\");\n}\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/c.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2005-2008, 2010 Peter Miller\n// Copyright (C) 2014 Scott Finneran\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_C_H\n#define SRECORD_OUTPUT_FILE_C_H\n\n#include <srecord/output/file.h>\n#include <srecord/interval.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_c class is used to represent an output file\n  * which emits C code.\n  */\nclass output_file_c:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_c();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    output_file_c(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The prefix instance variable is used to remember the variable\n      * name prefix to be used in the output.\n      */\n    std::string prefix;\n\n    /**\n      * The prefix instance variable is used to remember the definition\n      * prefix to be emitted in the header.\n      */\n    std::string header_prefix;\n\n    /**\n      * The postfix instance variable is used to remember the definition\n      * postfix to be emitted in the header.\n      */\n    std::string header_postfix;\n\n    /**\n      * The taddr instance variable is used to remember the\n      * termination address, to be emitted in the footer.\n      */\n    unsigned long taddr;\n\n    /**\n      * The range instance variable is used to remember the range\n      * of addresses present in the output.\n      */\n    interval range;\n\n    /**\n      * The header_done instance variable is used t remember whether\n      * the emit_header method has been called.\n      */\n    bool header_done;\n\n    /**\n      * The column instance variable is used to remember the current\n      * printing column on the line.\n      */\n    int column;\n\n    /**\n      * The current_address instance variabel is used to remember\n      * the current address that the file is positioned at.  This is\n      * used to know whether we need to add padding.\n      */\n    unsigned long current_address;\n\n    /**\n      * The line_length instance variable is used to remember the\n      * maximum line length.  The output usually does not exceed it.\n      */\n    int line_length;\n\n    /**\n      * The address_length instance variable is used toremember how\n      * many bytes to emit when emitting addresses.\n      */\n    int address_length;\n\n    /**\n      * The constant instance variable is used to remember whether or\n      * not to use the \"const\" keyword.\n      */\n    bool constant;\n\n    /**\n      * The include instance variable is used to remember whether or not\n      * to generate an include file.\n      */\n    bool include;\n\n    /**\n      * The include_file_name instance variable is used to remember the\n      * name of the include file to be generated.\n      */\n    std::string include_file_name;\n\n    /**\n      * The output_word instance variable is used to remember whether or not\n      * the input bytes should be emitted as word.\n      */\n    bool output_word;\n\n    /**\n      * The hex_style instance variable is used to remember whether or\n      * not we are to output number in hexadecimal (true) or decimal\n      * (false).\n      */\n    bool hex_style;\n\n    /**\n      * The section_style instance variable is used to remember whether\n      * or not the output is to contain \"sections\".\n      *\n      * In non-section output, padding of 0xFF is used to pad the data\n      * for correct addressing.  In section output, tables of addresses\n      * and lenthgs are emitted, and the actual data is intended to be\n      * relocated at run time.\n      */\n    bool section_style;\n\n    /**\n      * The emit_header method is used to emit the initial portion\n      * of the array declaration.  It does nothing if header_done\n      * is true.\n      */\n    void emit_header();\n\n    /**\n      * The emit_byte method is used to emit a single byte.  It uses\n      * column to track the position, so as not to exceed line_length.\n      */\n    void emit_byte(int);\n\n    /**\n      * The emit_byte method is used to emit a single byte.  It uses\n      * column to track the position, so as not to exceed line_length.\n      */\n    void emit_word(unsigned int);\n\n    /**\n      * The format_address method is used to format an address, taking\n      * the hex_style and address_length instance variable settings.\n      *\n      * @param addr\n      *     The adress to be formatted\n      */\n    std::string format_address(unsigned long addr);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_c();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_c(const output_file_c &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_c &operator=(const output_file_c &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_C_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/coe.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/progname.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/coe.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_coe::~output_file_coe()\n{\n    emit_header();\n    if (got_data)\n    {\n        put_stringf(\";\\n\");\n        got_data = false;\n    }\n    if (enable_header_flag && actual_depth != depth)\n    {\n        put_stringf\n        (\n            \"; depth = %lu; 0x%04lX\\n\",\n            actual_depth / width_in_bytes,\n            actual_depth / width_in_bytes\n        );\n    }\n}\n\n\nsrecord::output_file_coe::output_file_coe(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    address(0),\n    column(0),\n    depth(0),\n    width(8),\n    width_in_bytes(1),\n    actual_depth(0),\n    header_done(false),\n    pref_blk_sz(32),\n    got_data(false)\n{\n    line_length_set(80);\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_coe::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_coe(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_coe::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        width = cmdln->value_number();\n        cmdln->token_next();\n        switch (width)\n        {\n        default:\n            // yuck\n\n        case 1:\n        case 8:\n            width = 8;\n            width_in_bytes = 1;\n            break;\n\n        case 2:\n        case 16:\n            width = 16;\n            width_in_bytes = 2;\n            break;\n\n        case 4:\n        case 32:\n            width = 32;\n            width_in_bytes = 4;\n            break;\n\n        case 64:\n            width = 64;\n            width_in_bytes = 8;\n            break;\n        }\n        line_length_set(80);\n    }\n}\n\n\nvoid\nsrecord::output_file_coe::notify_upper_bound(unsigned long addr)\n{\n    depth = addr;\n    actual_depth = addr;\n}\n\n\nvoid\nsrecord::output_file_coe::emit_header(void)\n{\n    if (header_done)\n        return;\n    if (enable_header_flag)\n    {\n        put_stringf\n        (\n            \";\\n\"\n            \"; Generated automatically by %s -o --coe %d\\n\"\n            \";\\n\",\n            progname_get(),\n            width\n        );\n        if (actual_depth != 0)\n        {\n            put_stringf\n            (\n                \"; depth = %ld; 0x%04lX\\n\",\n                actual_depth / width_in_bytes,\n                actual_depth / width_in_bytes\n            );\n            put_stringf\n            (\n                \"; width = %d; 0x%02X\\n\",\n                width_in_bytes * 8,\n                width_in_bytes * 8\n            );\n        }\n        put_stringf(\"memory_initialization_radix = 16;\\n\");\n        put_stringf(\"memory_initialization_vector =\\n\");\n\n    }\n    header_done = true;\n}\n\n\nvoid\nsrecord::output_file_coe::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_unknown:\n        // Ignore.\n        break;\n\n    case srecord::record::type_header:\n        if (enable_header_flag && record.get_length() > 0)\n        {\n            put_string(\"; \");\n            if (record.get_address() != 0)\n            {\n                unsigned long addr = record.get_address();\n                put_stringf(\"%04lX: \", addr);\n            }\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (c == '\\n')\n                {\n                    put_string(\"\\n; \");\n                    continue;\n                }\n                if (!isprint(c))\n                    c = ' ';\n                put_char(c);\n            }\n            put_char('\\n');\n        }\n        break;\n\n    case srecord::record::type_data:\n        {\n            unsigned long addr = record.get_address();\n            unsigned len = record.get_length();\n            if ((addr % width_in_bytes) || (len % width_in_bytes))\n                fatal_alignment_error(width_in_bytes);\n            emit_header();\n\n            if (address != record.get_address())\n                fatal_hole_error(address, record.get_address());\n            if\n            (\n                (record.get_address() % width_in_bytes) != 0\n            ||\n                (record.get_length() % width_in_bytes) != 0\n            )\n                fatal_alignment_error(width_in_bytes);\n\n            for (unsigned j = 0; j < len; ++j)\n            {\n                if (got_data && (j % width_in_bytes) == 0)\n                    put_stringf(\",\\n\");\n                put_stringf(\"%02X\", record.get_data(j));\n                got_data = true;\n            }\n\n            unsigned long d = addr + len;\n            if (actual_depth < d)\n                actual_depth = d;\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        if (enable_data_count_flag)\n        {\n            if (got_data)\n            {\n                put_stringf(\";\\n\");\n                got_data = false;\n            }\n            unsigned long addr = record.get_address();\n            put_stringf(\"; data record count = %lu\\n\", addr);\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            if (got_data)\n            {\n                put_stringf(\";\\n\");\n                got_data = false;\n            }\n            unsigned long addr = record.get_address();\n            put_stringf(\"; start address = %04lX\\n\", addr);\n        }\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_coe::line_length_set(int len)\n{\n    int pref_mult = (len - 6) / (1 + 2 * width_in_bytes);\n    if (pref_mult < 1)\n        pref_mult = 1;\n    pref_blk_sz = pref_mult * width_in_bytes;\n}\n\n\nvoid\nsrecord::output_file_coe::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_coe::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if ((nbytes % width_in_bytes) != 0)\n        return false;\n    pref_blk_sz = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_coe::preferred_block_size_get(void)\n    const\n{\n    return pref_blk_sz;\n}\n\n\nconst char *\nsrecord::output_file_coe::format_name(void)\n    const\n{\n    return \"Coefficient (.COE) Files (Xilinx)\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/coe.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_COE_H\n#define SRECORD_OUTPUT_FILE_COE_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_coe class is used to represent the output state\n  * of a file in Coefficient File Format (Xilinx).\n  */\nclass output_file_coe:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_coe();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_coe(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation\n    void write(const record &);\n\n    // See base class for documentation\n    void line_length_set(int);\n\n    // See base class for documentation\n    void address_length_set(int);\n\n    // See base class for documentation\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\n    // See base class for documentation.\n    void notify_upper_bound(unsigned long addr);\n\nprivate:\n    /**\n      * The address instance variable is used to remember the next\n      * memory address to be written.  This is also used to detect holes\n      * in the input data.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable i sused to remember the output text\n      * column.  This is used to know when ti wrap lines.\n      */\n    int column;\n\n    /**\n      * The depth instance variable is used to remember how many bytes\n      * of data there is.  Kind of broken, because we don't know this\n      * when the header is actually printed.\n      */\n    unsigned long depth;\n\n    /**\n      * The width instance variable is used to remember how many bits\n      * there are per data item.  Default to 8 (traditional bytes).\n      */\n    unsigned width;\n\n    /**\n      * The width_in_bytes instance variable is used to remember how\n      * many bytes there are per data item.  Defaults to 1.\n      */\n    unsigned width_in_bytes;\n\n    /**\n      * The actual_depth instance variable is used to remember how many\n      * bytes of data there were.  This is printed in the footer.\n      */\n    unsigned long actual_depth;\n\n    /**\n      * The header_done instance variable is used to remember whether\n      * the emit_header method has already been called.\n      */\n    bool header_done;\n\n    /**\n      * The pref_blk_sz instance variable is used to remember the\n      * preferred block size, in bytes.\n      */\n    int pref_blk_sz;\n\n    /**\n      * The emit_header method is used to emit the file header,\n      * if necessary.\n      */\n    void emit_header(void);\n\n    /**\n      * The GotData instance variable is used to remember whether or not\n      * some data has been seen so far.  This is used to separate values\n      * with commas, but to suppress the first comma before the first\n      * data.\n      */\n    bool got_data;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_coe();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_coe(const output_file_coe &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_coe &operator=(const output_file_coe &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_COE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/cosmac.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/cosmac.h>\n#include <srecord/record.h>\n\nsrecord::output_file_cosmac::~output_file_cosmac()\n{\n}\n\n\nsrecord::output_file_cosmac::output_file_cosmac(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(0),\n    address_length(4),\n    line_length(80),\n    column(0),\n    header_required(true)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_cosmac::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_cosmac(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_cosmac::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n    case srecord::record::type_unknown:\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_address() >= (1uL << 24) && address_length < 8)\n            address_length = 8;\n        else if (record.get_address() >= (1uL << 16) && address_length < 6)\n            address_length = 6;\n\n        if (header_required)\n        {\n            address = record.get_address();\n            put_stringf(\"!M%.*lX \", (int)address_length, address);\n            column = address_length + 3;\n            header_required = false;\n\n            if (!enable_optional_address_flag)\n                address = (unsigned long)-1L;\n        }\n        if (address != record.get_address())\n        {\n            address = record.get_address();\n            put_stringf(\";\\n%.*lX \", (int)address_length, address);\n            column = address_length + 1;\n        }\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            if (column + 3 > line_length)\n            {\n                put_string(\",\\n\");\n                column = 0;\n            }\n            put_byte(record.get_data(j));\n            column += 2;\n            ++address;\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (column != 0)\n        {\n            put_char('\\n');\n            column = 0;\n            header_required = true;\n        }\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_cosmac::line_length_set(int x)\n{\n    line_length = (x < 4 ? 4 : x);\n}\n\n\nvoid\nsrecord::output_file_cosmac::address_length_set(int x)\n{\n    x *= 2;\n    if (x < 4)\n        x = 4;\n    if (x > 8)\n        x = 8;\n    address_length = x;\n}\n\n\nbool\nsrecord::output_file_cosmac::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    line_length = 2 * nbytes + 1;\n    return true;\n}\n\n\nint\nsrecord::output_file_cosmac::preferred_block_size_get()\n    const\n{\n    int n = ((line_length - 1) / 2);\n    if (n > record::max_data_length)\n        n = record::max_data_length;\n    return n;\n}\n\n\nconst char *\nsrecord::output_file_cosmac::format_name()\n    const\n{\n    return \"cosmac\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/cosmac.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_COSMAC_H\n#define SRECORD_OUTPUT_FILE_COSMAC_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_cosmac class is used to represent an output\n  * which emits RCA Cosmac format.\n  */\nclass output_file_cosmac:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_cosmac();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_cosmac(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember the current\n      * output address, so that file size can be optimized.\n      */\n    unsigned long address;\n\n    /**\n      * The address_length is used to remember the preferred number of\n      * characters used to represent an address in the output file.\n      * Defaults to 4 characters.\n      */\n    unsigned address_length;\n\n    /**\n      * The line_length instance variable is used to remember the maximum\n      * line length of the output.  Defaults to 80 characters.\n      */\n    unsigned line_length;\n\n    /**\n      * The column instance variable is used to remember which output\n      * column the current output position is on.\n      */\n    unsigned column;\n\n    /**\n      * The header_required instance variable is used to remember whether\n      * or not the header (the !M command) has been issued, or not.\n      */\n    bool header_required;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_cosmac();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_cosmac(const output_file_cosmac &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_cosmac &operator=(const output_file_cosmac &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_COSMAC_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/dec_binary.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/dec_binary.h>\n#include <srecord/record.h>\n\n#define BLOCK_SIZE 512\n#define BLOCK_SIZE_MASK (BLOCK_SIZE - 1)\n\n\nsrecord::output_file_dec_binary::~output_file_dec_binary()\n{\n    // Round off to a whole multiple of BLOCK_SIZE bytes.\n    while (byte_offset & BLOCK_SIZE_MASK)\n        put_byte(0);\n}\n\n\nsrecord::output_file_dec_binary::output_file_dec_binary(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    pref_block_size(preferred_block_size_calculate())\n{\n    if (line_termination == line_termination_native)\n        line_termination = line_termination_binary;\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_dec_binary::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_dec_binary(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_dec_binary::put_byte(unsigned char n)\n{\n    checksum_add(n);\n    put_char(n);\n    byte_offset++;\n}\n\n\nvoid\nsrecord::output_file_dec_binary::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        if (!record.address_range_fits_into_n_bits(16))\n            data_address_too_large(record, 16);\n\n#if 0\n        //\n        // Don't span block boundaries.\n        //\n        if\n        (\n            (byte_offset & ~BLOCK_SIZE_MASK)\n        !=\n            ((byte_offset + 6 + record.get_length())\n                & ~BLOCK_SIZE_MASK)\n        )\n        {\n            fprintf(stderr, \"%s: %d: spans block %4.4lX/%4.4lX\\n\", __FILE__,\n                __LINE__, byte_offset, byte_offset + 6 + record.get_length());\n            while (byte_offset & BLOCK_SIZE_MASK)\n                put_byte(0);\n        }\n#endif\n\n        //\n        // Write the data out.\n        //\n        checksum_reset();\n        put_word_le(1);\n        put_word_le(record.get_length() + 6);\n        put_word_le(record.get_address());\n        for (size_t j = 0; j < record.get_length(); ++j)\n            put_byte(record.get_data(j));\n        put_byte(-checksum_get());\n        if (byte_offset & 1)\n            put_byte(0);\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            checksum_reset();\n            put_word_le(1);\n            put_word_le(6);\n            put_word_le(record.get_address());\n            put_byte(-checksum_get());\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_dec_binary::line_length_set(int)\n{\n    // Ignore.\n}\n\n\nvoid\nsrecord::output_file_dec_binary::address_length_set(int)\n{\n    // Ignore (this is only a 16-bit format).\n}\n\n\nbool\nsrecord::output_file_dec_binary::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_dec_binary::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nint\nsrecord::output_file_dec_binary::preferred_block_size_calculate()\n{\n#if 0\n    //\n    // Because we don't cross BLOCK_SIZE boundaries, we need a number\n    // less than srecord::record::max_data_length that, when you add 7\n    // and double, gives\n    //\n    int max = BLOCK_SIZE;\n    for (;;)\n    {\n        if (max - 7 <= srecord::record::max_data_length)\n            return (max - 7);\n        max >>= 1;\n    }\n    return 1;\n#else\n    return srecord::record::max_data_length;\n#endif\n}\n\n\nconst char *\nsrecord::output_file_dec_binary::format_name()\n    const\n{\n    return \"DEC-Binary\";\n}\n\n\nbool\nsrecord::output_file_dec_binary::is_binary(void)\n    const\n{\n    return true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/dec_binary.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2005-2008, 2010-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_DEC_BINARY_H\n#define SRECORD_OUTPUT_FILE_DEC_BINARY_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_dec_binary class is used to write a DEC Binary\n  * (XXDP) formatted file.\n  */\nclass output_file_dec_binary:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_dec_binary();\n\nprivate:\n    /**\n      * A constructor.  The input will be read from the named file (or\n      * the standard input if the file name is \"-\"). It is private on\n      * purpose, use the create class method intead.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_dec_binary(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.  The input will be read from\n      * the named file (or the standard input if the file name is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * See base class for documentation.  We are over-riding it because\n      * we use raw binary, so we call the put_char() method.  This\n      * method also tracks the byte_offset, so that we can align to\n      * specific boundaries.  Calls the checksum_add() method.\n      */\n    void put_byte(unsigned char);\n\n    /**\n      * The byte_offset instance variable is used to track the location\n      * in the output file.  Maintained by the put_byte() method.\n      */\n    unsigned long byte_offset;\n\n    /**\n      * The pref_block_size is used to remember the preferred\n      * block size.  Set by the constructor.  Read by the\n      * preferred_block_size_get() method.\n      */\n    int pref_block_size;\n\n    /**\n      * The preferred_block_size_calculate method is used to determine\n      * the best block size to pack into 512 byte blocks.\n      */\n    static int preferred_block_size_calculate();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_dec_binary();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_dec_binary(const output_file_dec_binary &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_dec_binary &operator=(const output_file_dec_binary &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_DEC_BINARY_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/emon52.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/emon52.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_emon52::~output_file_emon52()\n{\n    // check for termination record\n}\n\n\nsrecord::output_file_emon52::output_file_emon52(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    pref_block_size(16)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_emon52::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_emon52(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_emon52::write(const srecord::record & record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        if (!record.address_range_fits_into_n_bits(16))\n            data_address_too_large(record, 16);\n        put_byte(record.get_length());\n        put_char(' ');\n        put_word_be(record.get_address());\n        put_char(':');\n        checksum_reset();\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            put_byte(record.get_data(j));\n            put_char(' ');\n        }\n        put_word_be(checksum_get16());\n        put_char('\\n');\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // This format can't do execution start address records\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_emon52::line_length_set(int linlen)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    //\n    int n = (linlen - 11) / 3;\n\n    //\n    // Constrain based on the file format.\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 255)\n        n = 255;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_emon52::address_length_set(int)\n{\n    // ignore (this is only a 16-bit format)\n}\n\n\nbool\nsrecord::output_file_emon52::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_emon52::preferred_block_size_get() const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_emon52::format_name()\n    const\n{\n    return \"Emon52\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/emon52.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_EMON52_H\n#define SRECORD_OUTPUT_FILE_EMON52_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_emon52 class is used to write an EMON52 formatted\n  * file (Elektor Monitor, dunno what the 52 is for).\n  */\nclass output_file_emon52:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_emon52();\n\nprivate:\n    /**\n      * A constructor.  The input will be read from the named file (or\n      * the standard input if the file name is \"-\"). It is private on\n      * purpose, use the create class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_emon52(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.  The input will be read from\n      * the named file (or the standard input if the file name is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The pref_block_size is used to remember the preferred block\n      * size.  Set by the line_length_set() method.  Read by the\n      * preferred_block_size_get() method.\n      */\n    int pref_block_size;\n\n    /**\n      * The write_inner method is used to write a single line (record)\n      * to the file.  Use by the write() method.\n      */\n    void write_inner(int type, unsigned long addr, int addr_len,\n        const void *data, int data_len);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_emon52();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_emon52(const output_file_emon52 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_emon52 &operator=(const output_file_emon52 &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_EMON52_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/fairchild.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/fairchild.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_fairchild::~output_file_fairchild()\n{\n}\n\n\nsrecord::output_file_fairchild::output_file_fairchild(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(~0uL)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_fairchild::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_fairchild(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_fairchild::put_nibble(unsigned n)\n{\n    srecord::output_file::put_nibble(n);\n    checksum_add(n & 15);\n}\n\n\nvoid\nsrecord::output_file_fairchild::put_byte(unsigned char n)\n{\n    // This differs from srecord::output_file::put_byte only in that it\n    // doesn't add to the checksum.\n    put_nibble(n >> 4);\n    put_nibble(n);\n}\n\n\nvoid\nsrecord::output_file_fairchild::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        if (!enable_optional_address_flag)\n            address = (unsigned long)-1L;\n        break;\n\n    case srecord::record::type_unknown:\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_data:\n        {\n            int len = record.get_length();\n            unsigned long new_addr = record.get_address();\n            if ((new_addr & 7) || (len & 7))\n                fatal_alignment_error(8);\n            if (address != new_addr)\n            {\n                put_stringf(\"S%4.4lX\\n\", new_addr);\n                address = new_addr;\n            }\n            for (int j = 0; j < len; j += 8)\n            {\n                put_char('X');\n                checksum_reset();\n\n                //\n                // Emit the one line of data.\n                //\n                put_byte(record.get_data(j));\n                put_byte(record.get_data(j + 1));\n                put_byte(record.get_data(j + 2));\n                put_byte(record.get_data(j + 3));\n                put_byte(record.get_data(j + 4));\n                put_byte(record.get_data(j + 5));\n                put_byte(record.get_data(j + 6));\n                put_byte(record.get_data(j + 7));\n                address += 8;\n\n                put_nibble(checksum_get());\n                put_char('\\n');\n            }\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        put_string(\"*\\n\");\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_fairchild::line_length_set(int)\n{\n    // ignore\n}\n\n\nvoid\nsrecord::output_file_fairchild::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_fairchild::preferred_block_size_set(int nbytes)\n{\n    return (nbytes == 8);\n}\n\n\nint\nsrecord::output_file_fairchild::preferred_block_size_get()\n    const\n{\n    return 8;\n}\n\n\nconst char *\nsrecord::output_file_fairchild::format_name()\n    const\n{\n    return \"Fairchild\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/fairchild.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_FAIRCHILD_H\n#define SRECORD_OUTPUT_FILE_FAIRCHILD_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_fairchild class is used to represent the running\n  * state when writing a file in Fairchild Fairbug format.\n  */\nclass output_file_fairchild:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_fairchild();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the create class\n      * method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_fairchild(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The put_nibble method puts a single hex-digit on the output.\n      * We override the one in the base class because the checksum is\n      * nibble-based, not byte-based.\n      */\n    void put_nibble(unsigned);\n\n    /**\n      * The put_byte method puts two hex-digits to the output.\n      * We override the one in the base class because the checksum is\n      * nibble-based, not byte-based.\n      */\n    void put_byte(unsigned char);\n\n    /**\n      * The address instance variable is used to remember the current\n      * memory position within the output.\n      */\n    unsigned long address;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_fairchild();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_fairchild(const output_file_fairchild &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_fairchild &operator=(const output_file_fairchild &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_FAIRCHILD_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/fastload.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/fastload.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_fastload::~output_file_fastload()\n{\n    if (bytes_since_checksum)\n    {\n        put_command('C', checksum_get16(), 3);\n        bytes_since_checksum = 0;\n    }\n    if (enable_footer_flag)\n        put_command('E', 0, 2);\n    if (column)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n}\n\n\nsrecord::output_file_fastload::output_file_fastload(\n    const std::string &a_filename\n) :\n    srecord::output_file(a_filename),\n    line_length(0),\n    address(~0uL),\n    column(0),\n    bytes_since_checksum(0),\n    max_since_checksum(0),\n    prev_was_command(false)\n{\n    line_length_set(80);\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_fastload::create(const std::string &a_filename)\n{\n    return pointer(new srecord::output_file_fastload(a_filename));\n}\n\n\nvoid\nsrecord::output_file_fastload::put_number(unsigned long n, int min_digits)\n{\n    unsigned char buffer[20];\n    unsigned char *bp = buffer;\n    while (n || min_digits > 0)\n    {\n        *bp++ = n & 63;\n        --min_digits;\n        n >>= 6;\n    }\n\n    static char digit[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\"\n        \"stuvwxyz0123456789,.\";\n    while (bp > buffer)\n    {\n        put_char(digit[*--bp]);\n        ++column;\n    }\n}\n\n\nstatic int\nnumber_width(unsigned long n)\n{\n    int result = 0;\n    while (n)\n    {\n        result++;\n        n >>= 6;\n    }\n    return result;\n}\n\n\nvoid\nsrecord::output_file_fastload::put_command(int c, unsigned long n, int ndigits)\n{\n    int width = number_width(n);\n    if (width < ndigits)\n        width = ndigits;\n    width += 2;\n    if (column + width > line_length)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n\n    put_char('/');\n    put_char(c);\n    column += 2;\n    put_number(n, ndigits);\n    prev_was_command = true;\n}\n\n\nvoid\nsrecord::output_file_fastload::write(const srecord::record &record)\n{\n    size_t j;\n\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        if (!enable_optional_address_flag)\n            address = (unsigned long)-1L;\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        if (record.get_address() != address)\n        {\n            address = record.get_address();\n            put_command('A', address, 3);\n        }\n        if (record.is_all_zero())\n        {\n            // These bytes don't add anything to the checksum.\n            put_command('Z', record.get_length(), 2);\n            address += record.get_length();\n            break;\n        }\n        for (j = 0; j + 3 <= record.get_length(); j += 3)\n        {\n            if (bytes_since_checksum >= max_since_checksum)\n            {\n                put_command('C', checksum_get16(), 3);\n                put_command('K', 0, 2);\n                checksum_reset();\n                bytes_since_checksum = 0;\n            }\n            unsigned char n1 = record.get_data(j);\n            checksum_add(n1);\n            unsigned char n2 = record.get_data(j + 1);\n            checksum_add(n2);\n            unsigned char n3 = record.get_data(j + 2);\n            checksum_add(n3);\n            unsigned long n = (n1 << 16) | (n2 << 8) | n3;\n            if (column + 4 > line_length || prev_was_command)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            put_number(n, 4);\n            bytes_since_checksum += 3;\n            prev_was_command = false;\n        }\n        for (; j < record.get_length(); ++j)\n        {\n            unsigned char n = record.get_data(j);\n            checksum_add(n);\n            put_command('B', (unsigned long)n, 2);\n            bytes_since_checksum++;\n        }\n        address += record.get_length();\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            if (bytes_since_checksum)\n            {\n                put_command('C', checksum_get16(), 3);\n                bytes_since_checksum = 0;\n            }\n            if (address != record.get_address())\n            {\n                address = record.get_address();\n                put_command('A', address, 3);\n            }\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_fastload::line_length_set(int linlen)\n{\n    line_length = linlen;\n    if (line_length < 10)\n        line_length = 10;\n\n    // Don't go bigger than this, or you get undetectable errors.\n    enum { MAX = 256 };\n\n    int bytes_on_last_line = ((line_length - 9) / 4) * 3;\n    if (bytes_on_last_line > MAX)\n        bytes_on_last_line = MAX;\n    else if (bytes_on_last_line < 0)\n        bytes_on_last_line = 0;\n\n    int bytes_on_other_lines = (line_length / 4) * 3;\n    if (bytes_on_other_lines > MAX)\n        bytes_on_other_lines = MAX;\n    else if (bytes_on_other_lines < 1)\n        bytes_on_other_lines = 1;\n\n    int num_other_lines =\n        (MAX - bytes_on_last_line) / bytes_on_other_lines;\n\n    max_since_checksum =\n        num_other_lines * bytes_on_other_lines + bytes_on_last_line;\n}\n\n\nvoid\nsrecord::output_file_fastload::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_fastload::preferred_block_size_set(int nbytes)\n{\n    if (nbytes > srecord::record::max_data_length)\n        return false;\n\n    // Don't go bigger than this, or you get undetectable errors.\n    enum { MAX = 256 };\n\n    int ll = (nbytes / 3) * 4;\n\n    int bytes_on_last_line = ((ll - 9) / 4) * 3;\n    if (bytes_on_last_line > MAX)\n        return false;\n    else if (bytes_on_last_line < 0)\n        return false;\n\n    int bytes_on_other_lines = (ll / 4) * 3;\n    if (bytes_on_other_lines > MAX)\n        return false;\n    else if (bytes_on_other_lines < 1)\n        return false;\n\n    int num_other_lines =\n        (MAX - bytes_on_last_line) / bytes_on_other_lines;\n\n    max_since_checksum =\n        num_other_lines * bytes_on_other_lines + bytes_on_last_line;\n\n    line_length = ll;\n    return true;\n}\n\n\nint\nsrecord::output_file_fastload::preferred_block_size_get()\n    const\n{\n    // Prefer a multiple of 3\n    return ((srecord::record::max_data_length / 3) * 3);\n}\n\n\nconst char *\nsrecord::output_file_fastload::format_name()\n    const\n{\n    return \"FastLoad\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/fastload.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_FASTLOAD_H\n#define SRECORD_OUTPUT_FILE_FASTLOAD_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_fastload class is used to write an LSI Logic\n  * Fast Load formatted file.\n  */\nclass output_file_fastload:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_fastload();\n\nprivate:\n    /**\n      * A constructor.  The output will be written to the named file (or\n      * the standard output if the file name is \"-\"). It is private on\n      * purpose, use the #create method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_fastload(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.  The output will be written\n      * to the named file (or the standard output if the file name is\n      * \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The line_length instance variable is used to remember the\n      * preferred line length for the output.\n      */\n    int line_length;\n\n    /**\n      * The address instance variable is used to track the current\n      * address location within the file.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable is used to track the current output\n      * column, to ensure that the lines don't exceed 80 characters.\n      */\n    int column;\n\n    /**\n      * The bytes_since_checksum instance variable is used to track how\n      * many bytes have ben emitted since the last checksum was issued.\n      * Don't leave it too long, or the checksum isn't any use.\n      */\n    int bytes_since_checksum;\n\n    /**\n      * The max_since_checksum instance variable is used to remember how\n      * many bytes to cover between issuing checksums.  This is done in\n      * such a way as to minimize line length.  There is no point going\n      * over 256 bytes, because it's a simple 16-bit additive sum.\n      */\n    int max_since_checksum;\n\n    /**\n      * The prev_was_command instance variable is used to track that was\n      * last output, bercase a newline must be thrown between commands\n      * and data, but not at any other time.\n      */\n    bool prev_was_command;\n\n    /**\n      * The write_inner method is used to write a single line (record)\n      * to the file.  Use by the write() method.\n      */\n    void write_inner(int type, unsigned long addr, int addr_len,\n            const void *data, int data_len);\n\n    /**\n      * The put_number method is used to write the given value to the\n      * output in base-64 (big endian) notation.\n      */\n    void put_number(unsigned long value, int ndigits);\n\n    /**\n      * The put_command method is used to write a command to the file,\n      * including the leading '/' and the trailing newline.\n      */\n    void put_command(int c, unsigned long n, int ndigits);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_fastload();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_fastload(const output_file_fastload &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_fastload &operator=(const output_file_fastload &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_FASTLOAD_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/formatted_binary.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/formatted_binary.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_formatted_binary::~output_file_formatted_binary()\n{\n    // assert(address == upper_bound);\n    if (address != upper_bound)\n        fatal_error(\"upper bound stuffed\");\n\n    put_char(0);\n    put_char(0);\n    put_char(check_sum >> 8);\n    put_char(check_sum);\n}\n\n\nsrecord::output_file_formatted_binary::output_file_formatted_binary(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    upper_bound(0),\n    address(0),\n    check_sum(0)\n{\n    if (line_termination == line_termination_native)\n        line_termination = line_termination_binary;\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_formatted_binary::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_formatted_binary(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_formatted_binary::notify_upper_bound(unsigned long arg)\n{\n    upper_bound = arg;\n    if (upper_bound == 0)\n        fatal_error(\"can't write file with no data\");\n}\n\n\nvoid\nsrecord::output_file_formatted_binary::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // assert(upper bound != 0);\n        if (upper_bound == 0)\n            fatal_error(\"must call srecord::output::notify_upper_bound first\");\n        if (upper_bound < (1uL << 16))\n        {\n            put_char(0x08); //     *\n            put_char(0x1C); //    ***\n            put_char(0x2A); //   * * *\n            put_char(0x49); //  *  *  *\n            put_char(0x08); //     *\n            put_char(0x00);\n            put_char((upper_bound >> 12) & 0x0F);\n            put_char((upper_bound >>  8) & 0x0F);\n            put_char((upper_bound >>  4) & 0x0F);\n            put_char( upper_bound        & 0x0F);\n        }\n        else\n        {\n            put_char(0x08); //     *\n            put_char(0x1C); //    ***\n            put_char(0x3E); //   *****\n            put_char(0x6B); //  ** * **\n            put_char(0x08); //     *\n            put_char(0x00);\n            put_char((upper_bound >> 28) & 0x0F);\n            put_char((upper_bound >> 24) & 0x0F);\n            put_char((upper_bound >> 20) & 0x0F);\n            put_char((upper_bound >> 16) & 0x0F);\n            put_char((upper_bound >> 12) & 0x0F);\n            put_char((upper_bound >>  8) & 0x0F);\n            put_char((upper_bound >>  4) & 0x0F);\n            put_char( upper_bound        & 0x0F);\n        }\n        put_char(0xFF);\n        break;\n\n    case srecord::record::type_data:\n        {\n            while (address < record.get_address())\n            {\n                put_char(0xFF);\n                ++address;\n            }\n            const unsigned char *data = record.get_data();\n            int length = record.get_length();\n            while (length-- > 0)\n            {\n                // assert(address < upper_bound);\n                if (address >= upper_bound)\n                    fatal_error(\"upper bound stuffed\");\n\n                check_sum += *data;\n                put_char(*data++);\n                ++address;\n            }\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // This format can't do execution start address records\n        break;\n\n    case srecord::record::type_unknown:\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_formatted_binary::line_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nvoid\nsrecord::output_file_formatted_binary::address_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nbool\nsrecord::output_file_formatted_binary::preferred_block_size_set(int nbytes)\n{\n    return (nbytes >= 1 || nbytes <= record::max_data_length);\n}\n\n\nint\nsrecord::output_file_formatted_binary::preferred_block_size_get()\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    //\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_formatted_binary::format_name()\n    const\n{\n    return \"Formatted-Binary\";\n}\n\n\nbool\nsrecord::output_file_formatted_binary::is_binary(void)\n    const\n{\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/formatted_binary.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_FORMATTED_BINARY_H\n#define SRECORD_OUTPUT_FILE_FORMATTED_BINARY_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_formatted_binary class is used to represent\n  * the current state when writing a file in the Formatted Binary format.\n  */\nclass output_file_formatted_binary:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_formatted_binary();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_formatted_binary(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void notify_upper_bound(long unsigned);\n\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * The upper_bound instance variable is used to remember the upper\n      * bound of memory addresses (maximum address plus one).\n      */\n    unsigned long upper_bound;\n\n    /**\n      * The address instance variable is used to remember the current\n      * output address, to know if padding is required.\n      */\n    unsigned long address;\n\n    /**\n      * The check_sum instance variable is used to remember the running\n      * sum of data baytes written to date.\n      */\n    unsigned short check_sum;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_formatted_binary();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_formatted_binary(const output_file_formatted_binary &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_formatted_binary &operator=(\n        const output_file_formatted_binary &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_FORMATTED_BINARY_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/forth.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2008-2010, 2012 Peter Miller\n// Copyright (C) 2008 Torsten Sadowski\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/forth.h>\n#include <srecord/record.h>\n#include <srecord/arglex/tool.h>\n\n\nsrecord::output_file_forth::~output_file_forth()\n{\n    emit_end_of_file();\n}\n\n\nsrecord::output_file_forth::output_file_forth(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    store_cmd(\"C!\")\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_forth::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_forth(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_forth::emit_end_of_file()\n{\n    put_char('\\n');\n\n    if (enable_footer_flag)\n    {\n        put_stringf(\"( THE END )\\n\");\n    }\n}\n\n\nvoid\nsrecord::output_file_forth::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        put_string(\"HEX\\n\");\n        break;\n\n    case srecord::record::type_data:\n        {\n            record::address_t address = record.get_address();\n            //\n            // Now write out the new address.  It is important not to\n            // disturb the checksum, so don't use the put_byte method.\n            //\n            for (size_t j = 0; j < record.get_length(); ++j)\n            {\n                put_byte(record.get_data(j));\n                put_char(' ');\n                put_word_be(address);\n                put_char(' ');\n                put_string(store_cmd);\n                ++address;\n                put_char('\\n');\n            }\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // Ignore.\n        // The destructor sill call emit_end_of_file();\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nconst char *\nsrecord::output_file_forth::format_name()\n    const\n{\n    return \"FORTH\";\n}\n\nvoid\nsrecord::output_file_forth::command_line(srecord::arglex_tool *cmdln)\n{\n    for (;;)\n    {\n        switch (cmdln->token_cur())\n        {\n        case srecord::arglex_tool::token_ram:\n            cmdln->token_next();\n            // Store into RAM\n            store_cmd = \"C!\";\n            break;\n\n        case srecord::arglex_tool::token_eeprom:\n            cmdln->token_next();\n            // Store into EEPROM\n            store_cmd = \"EEC!\";\n            break;\n\n        default:\n            return;\n        }\n    }\n}\n\n\nvoid\nsrecord::output_file_forth::line_length_set(int)\n{\n}\n\n\nvoid\nsrecord::output_file_forth::address_length_set(int)\n{\n}\n\n\nbool\nsrecord::output_file_forth::preferred_block_size_set(int nbytes)\n{\n    return (nbytes >= 1 && nbytes <= record::max_data_length);\n}\n\n\nint\nsrecord::output_file_forth::preferred_block_size_get() const\n{\n  return 16;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/forth.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2008, 2010 Peter Miller\n// Copyright (C) 2008 Torsten Sadowski\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_FORTH_H\n#define SRECORD_OUTPUT_FILE_FORTH_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_forth class is used to write a file that\n  * can be read by a FORTH system\n  */\nclass output_file_forth:\n    public output_file\n{\npublic:\n    /**\n      * The destrutcor.\n      */\n    virtual ~output_file_forth();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_forth(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n     * The FORTH store command to use. Either C! for RAM or EEC! for EEPROM\n     */\n    std::string store_cmd;\n\n    /**\n      * The emit_end_of_file method is used to write the ETX and\n      * checksum out to the file.  It is safe top call this method more\n      * than once, only one ETX will be written.\n      */\n    void emit_end_of_file();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_forth();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_forth(const output_file_forth &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_forth &operator=(const output_file_forth &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_FORTH_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/four_packed_code.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2005-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/output/file/four_packed_code.h>\n#include <srecord/record.h>\n\n\nstatic unsigned char digit[] = {\n    '%',                        //  0\n    '&',                        //  1\n    '\\'',                       //  2\n    '(',                        //  3\n    ')',                        //  4\n    '+',                        //  5\n    ',',                        //  6\n    '-',                        //  7\n    '.', //  8\n    '/', //  9\n    '0', // 10\n    '1', // 11\n    '2', // 12\n    '3', // 13\n    '4', // 14\n    '5', // 15\n    '6', // 16\n    '7', // 17\n    '8', // 18\n    '9', // 19\n    ':', // 20\n    ';', // 21\n    '<', // 22\n    '=', // 23\n    '>', // 24\n    '?', // 25\n    '@', // 26\n    'A', // 27\n    'B', // 28\n    'C', // 29\n    'D', // 30\n    'E', // 31\n    'F', // 32\n    'G', // 33\n    'H', // 34\n    'I', // 35\n    'J', // 36\n    'K', // 37\n    'L', // 38\n    'M', // 39\n    'N', // 40\n    'O', // 41\n    'P', // 42\n    'Q', // 43\n    'R', // 44\n    'S', // 45\n    'T', // 46\n    'U', // 47\n    'V', // 48\n    'W', // 49\n    'X', // 50\n    'Y', // 51\n    'Z', // 52\n    '[', // 53\n    '\\\\', // 54\n    ']', // 55\n    '^', // 56\n    '_', // 57\n    '`', // 58\n    'a', // 59\n    'b', // 60\n    'c', // 61\n    'd', // 62\n    'e', // 63\n    'f', // 64\n    'g', // 65\n    'h', // 66\n    'i', // 67\n    'j', // 68\n    'k', // 69\n    'l', // 70\n    'm', // 71\n    'n', // 72\n    'o', // 73\n    'p', // 74\n    'q', // 75\n    'r', // 76\n    's', // 77\n    't', // 78\n    'u', // 79\n    'v', // 80\n    'w', // 81\n    'x', // 82\n    'y', // 83\n    'z', // 84\n};\n\n\nsrecord::output_file_four_packed_code::~output_file_four_packed_code()\n{\n    put_string(\"$%%%%%\\n\");\n}\n\n\nsrecord::output_file_four_packed_code::output_file_four_packed_code(\n        const std::string &a_file_name):\n    srecord::output_file(a_file_name),\n    pref_block_size(32),\n    put_byte_pos(0),\n    put_byte_value(0)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_four_packed_code::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_four_packed_code(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_four_packed_code::put_byte(unsigned char n)\n{\n    put_byte_value |= (unsigned long)n << ((3 - put_byte_pos) << 3);\n    ++put_byte_pos;\n    if (put_byte_pos >= 4)\n    {\n        int n5 = put_byte_value % 85;\n        put_byte_value /= 85;\n        int n4 = put_byte_value % 85;\n        put_byte_value /= 85;\n        int n3 = put_byte_value % 85;\n        put_byte_value /= 85;\n        int n2 = put_byte_value % 85;\n        put_byte_value /= 85;\n        int n1 = put_byte_value;\n        put_char(digit[n1]);\n        put_char(digit[n2]);\n        put_char(digit[n3]);\n        put_char(digit[n4]);\n        put_char(digit[n5]);\n        put_byte_pos = 0;\n        put_byte_value = 0;\n    }\n}\n\n\nvoid\nsrecord::output_file_four_packed_code::write_inner(unsigned long address,\n    const void *data, int data_nbytes)\n{\n    //\n    // Make sure the line is not too long.\n    //\n    if (data_nbytes > 252)\n        fatal_error(\"data length (%d) too long\", data_nbytes);\n\n    //\n    // Assemble the data for this line.\n    //\n    unsigned char buffer[256];\n    buffer[0] = 0;\n    buffer[1] = 4 + data_nbytes;\n    buffer[2] = 0;\n    buffer[3] = 0;\n    srecord::record::encode_big_endian(buffer + 4, address, 4);\n    if (data_nbytes)\n    {\n        memcpy(buffer + 8, data, data_nbytes);\n        while (data_nbytes & 3)\n            buffer[8 + data_nbytes++] = 0;\n    }\n    int nbytes = 8 + data_nbytes;\n\n    //\n    // Calculate the checksum.\n    //\n    int checksum = 0;\n    for (int j = 0; j < nbytes; ++j)\n        checksum += buffer[j];\n    buffer[0] = -checksum;\n\n    //\n    // Emit the line as base85 text.\n    //\n    put_char('$');\n    for (int j = 0; j < nbytes; ++j)\n        put_byte(buffer[j]);\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_four_packed_code::write(const srecord::record & record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        break;\n\n    case srecord::record::type_data:\n        if (!record.address_range_fits_into_n_bits(16))\n            data_address_too_large(record, 16);\n        write_inner\n        (\n            record.get_address(),\n            record.get_data(),\n            record.get_length()\n        );\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // This format can't do execution start addresses.\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_four_packed_code::line_length_set(int linlen)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data bytes.\n    //\n    int n = (linlen - 11) / 5 * 4;\n\n    //\n    // Constrain based on the file format.\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 252)\n        n = 252;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nbool\nsrecord::output_file_four_packed_code::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes > 252)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_four_packed_code::preferred_block_size_get() const\n{\n    return pref_block_size;\n}\n\n\nvoid\nsrecord::output_file_four_packed_code::address_length_set(int)\n{\n    // Ignore.  We always emit a 32-bit address.\n}\n\n\nconst char *\nsrecord::output_file_four_packed_code::format_name()\n    const\n{\n    return \"Four-Packed-Code\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/four_packed_code.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_FOUR_PACKED_CODE_H\n#define SRECORD_OUTPUT_FILE_FOUR_PACKED_CODE_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_four_packed_code class is used to emit files\n  * in the Four Packed Code (FPC) format.\n  */\nclass output_file_four_packed_code:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_four_packed_code();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_four_packed_code(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The pref_block_size instance variable is used to\n      * remember the preferred block size.  Read by the the\n      * preferred_block_size_get method.  Set by the line_length_set\n      * method.\n      */\n    int pref_block_size;\n\n    /**\n      * The put_byte_pos instance variable is used by the put_byte\n      * method to remember where we are positioned within each\n      * 4-byte chunk.\n      */\n    unsigned put_byte_pos;\n\n    /**\n      * The put_byte_value instance variable is used by the put_byte\n      * method to remember the cumulative value of each 4-byte chunk.\n      * At the end of 4 bytes, the 5-character base85 encoding\n      * is issued.\n      */\n    unsigned long put_byte_value;\n\n    /**\n      * The write_inner method is used by the write method to\n      * write a single line of output.\n      */\n    void write_inner(unsigned long address, const void *data,\n        int data_length);\n\n    /**\n      * See base class for documentation.  We over-ride this method\n      * so that we can do the base85 encoding of each 4-byte chunk.\n      */\n    void put_byte(unsigned char);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_four_packed_code();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_four_packed_code(const output_file_four_packed_code &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_four_packed_code &operator=(\n        const output_file_four_packed_code &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_FOUR_PACKED_CODE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/hexdump.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/output/file/hexdump.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_hexdump::~output_file_hexdump()\n{\n    row_cache_print();\n    delete [] row_cache;\n}\n\n\nsrecord::output_file_hexdump::output_file_hexdump(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    number_of_columns(0),\n    row_cache_address((unsigned long)-1),\n    row_cache_address_mask(0),\n    row_cache_size(0),\n    row_cache(0),\n    address_length(4)\n{\n    line_length_set(80);\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_hexdump::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_hexdump(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_hexdump::command_line(srecord::arglex_tool *)\n{\n    // nothing (yet?)\n}\n\n\nvoid\nsrecord::output_file_hexdump::row_cache_print(void)\n{\n    if (row_cache_address == (unsigned long)(-1))\n        return;\n    char *cp = row_cache;\n    char *ep = cp + row_cache_size;\n    while (ep > cp && ep[-1] == ' ')\n        --ep;\n    while (cp < ep)\n        put_char(*cp++);\n    put_char('\\n');\n    memset(row_cache, ' ', row_cache_size);\n    row_cache_address = (unsigned long)-1;\n}\n\n\nstatic char\nhex_nybble(int n)\n{\n    return \"0123456789ABCDEF\"[n & 15];\n}\n\n\nstatic void\nhex_byte(char *buffer, int n)\n{\n    buffer[0] = hex_nybble(n >> 4);\n    buffer[1] = hex_nybble(n);\n}\n\n\nstatic void\nhex(char *buffer, long value, int nbytes)\n{\n    buffer += nbytes * 2;\n    while (nbytes > 0)\n    {\n        buffer -= 2;\n        hex_byte(buffer, value);\n        value >>= 8;\n        --nbytes;\n    }\n}\n\n\nvoid\nsrecord::output_file_hexdump::emit_byte(unsigned long address,\n    unsigned char data)\n{\n    if (row_cache_address != (unsigned long)(-1))\n    {\n        if (row_cache_address != (address & ~row_cache_address_mask))\n        {\n            // need to start a new row\n            row_cache_print();\n        }\n    }\n    if (row_cache_address == (unsigned long)(-1))\n    {\n        row_cache_address = address & ~row_cache_address_mask;\n        hex(row_cache, row_cache_address, address_length);\n        row_cache[address_length * 2] = ':';\n        row_cache[address_length * 2 + 3 + 3 * number_of_columns] = '#';\n    }\n    address &= row_cache_address_mask;\n    hex_byte(row_cache + address_length * 2 + 2 + 3 * address, data);\n    data &= 0x7F;\n    if (data < ' ' || data > '~')\n        data = '.';\n    row_cache[address_length * 2 + 4 + 3 * number_of_columns + address] = data;\n}\n\n\nvoid\nsrecord::output_file_hexdump::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    default:\n        // ignore\n        break;\n\n    case srecord::record::type_header:\n        // ignore\n        break;\n\n    case srecord::record::type_data:\n        {\n            unsigned long a = record.get_address();\n            for (size_t j = 0; j < record.get_length(); ++j)\n                emit_byte(a + j, record.get_data(j));\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n    }\n}\n\n\nint\nsrecord::output_file_hexdump::columns_to_line_length(int cols)\n{\n    // 0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n    //      ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^^\n    return (address_length * 2 + 4 + 4 * cols);\n}\n\n\nvoid\nsrecord::output_file_hexdump::line_length_set(int line_length)\n{\n    int n = 8;\n    while (columns_to_line_length(n << 1) <= line_length)\n        n <<= 1;\n    number_of_columns = n;\n    delete [] row_cache;\n    row_cache_size = columns_to_line_length(number_of_columns);\n    row_cache = new char [row_cache_size];\n    memset(row_cache, ' ', row_cache_size);\n    row_cache_address_mask = number_of_columns - 1;\n}\n\n\nbool\nsrecord::output_file_hexdump::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 2 || nbytes > record::max_data_length)\n        return false;\n    if ((nbytes & -nbytes) != nbytes)\n        return false;\n    number_of_columns = nbytes;\n    row_cache_address_mask = number_of_columns - 1;\n    return true;\n}\n\n\nvoid\nsrecord::output_file_hexdump::address_length_set(int)\n{\n    // Ignore\n}\n\n\nint\nsrecord::output_file_hexdump::preferred_block_size_get(void)\n    const\n{\n    //\n    // Use the largest we can get,\n    //\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_hexdump::format_name(void)\n    const\n{\n    return \"hexdump\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/hexdump.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_HEXDUMP_H\n#define SRECORD_OUTPUT_FILE_HEXDUMP_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_hexdump class is used to represent an output\n  * file which emits a hexadecimal dump (including ASCII) of the data.\n  */\nclass output_file_hexdump:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_hexdump();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_hexdump(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\nprivate:\n    /**\n      * The number_of_columns instance variable is used to remember how\n      * many columns of hex bytes to display on a single line.  It is\n      * always a power of two.\n      */\n    int number_of_columns;\n\n    /**\n      * The row_cache_address instance variable is used to remember\n      * where we are up to in printing our rows of data.  It is the\n      * address of the beginning of the row, NOT the current byte.\n      * The lower \"number_of_columns\" bits are always zero.\n      */\n    unsigned long row_cache_address;\n\n    /**\n      * The row_cache_address_mask instance variable is used to remember\n      * the mask to calculate the column within the output line, give a\n      * byte address.\n      */\n    unsigned long row_cache_address_mask;\n\n    /**\n      * The row_cache_size instance variable is used to remember the\n      * number of printing columns wide the output is.\n      */\n    size_t row_cache_size;\n\n    /**\n      * The row_cache instance variable is used to remember the text of\n      * the line to be printed.  It contains ASCII hex representations\n      * of the bytes \"written\" to this output.\n      */\n    char *row_cache;\n\n    /**\n      * The address_length instance variable is used to remember how\n      * many bytes to emit when emitting addresses.\n      */\n    int address_length;\n\n    /**\n      * The emit_byte method is used to emit a single byte.  It uses\n      * column to track the position, so as not to exceed line_length.\n      */\n    void emit_byte(unsigned long address, unsigned char data);\n\n    /**\n      * The row_cache_print method is used to print the row cache to the\n      * file and then erase the cache in preparation for another row.\n      */\n    void row_cache_print(void);\n\n    /**\n      * The columns_to_line_length method is used to\n      */\n    int columns_to_line_length(int cols);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_hexdump();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_hexdump(const output_file_hexdump &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_hexdump &operator=(const output_file_hexdump &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_HEXDUMP_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/idt.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/idt.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_idt::~output_file_idt()\n{\n    write_data_count();\n}\n\n\nsrecord::output_file_idt::output_file_idt(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    data_count(0),\n    pref_block_size(128),\n    address_length(4),\n    data_count_written(false)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_idt::create(const std::string &a_file_name)\n{\n    return pointer(new output_file_idt(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_idt::write_inner(int tag, unsigned long address,\n    unsigned address_nbytes, const unsigned char *data, size_t data_nbytes)\n{\n    //\n    // Make sure the line is not too long.\n    //\n    if (address_nbytes + data_nbytes > 254)\n    {\n        fatal_error\n        (\n            \"data length (%d+%ld>254) too long\",\n            address_nbytes,\n            (unsigned long)data_nbytes\n        );\n    }\n\n    // intro\n    put_char('S');\n    put_nibble(tag);\n    unsigned char line_length = address_nbytes + data_nbytes + 1;\n    put_char(line_length);\n    unsigned char csum = line_length;\n\n    // address\n    for (unsigned j = 0; j < address_nbytes; ++j)\n    {\n        unsigned char c = address >> (8 * (address_nbytes - 1 - j));\n        put_char(c);\n        csum += c;\n    }\n\n    // data\n    for (unsigned j = 0; j < data_nbytes; ++j)\n    {\n        unsigned char c = data[j];\n        put_char(c);\n        csum += c;\n    }\n\n    // checksum\n    put_char(~csum);\n}\n\n\nvoid\nsrecord::output_file_idt::write_data_count(void)\n{\n    if (data_count_written)\n        return;\n\n    if (enable_data_count_flag)\n    {\n        if (data_count < (1L << 16))\n            write_inner(5, data_count, 2, 0, 0);\n        else\n            write_inner(6, data_count, 3, 0, 0);\n    }\n    data_count_written = true;\n\n    //\n    // It is not clear in the spec whether the data count should be\n    // reset at this point.  It will not happen for srecord::cat, so it\n    // probably isn't a problem.\n    //\n    data_count = 0;\n}\n\n\nvoid\nsrecord::output_file_idt::write(const srecord::record &record)\n{\n    //\n    // Make sure the address is nicely aligned.\n    //\n    unsigned long addr = record.get_address();\n\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        if (enable_header_flag)\n            write_inner(0, 0, 2, record.get_data(), record.get_length());\n        break;\n\n    case srecord::record::type_data:\n        if (addr < (1uL << 16) && address_length <= 2)\n        {\n            write_inner\n            (\n                1,\n                addr,\n                2,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        else if (addr < (1UL << 24) && address_length <= 3)\n        {\n            write_inner\n            (\n                2,\n                addr,\n                3,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        else\n        {\n            write_inner\n            (\n                3,\n                addr,\n                4,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        ++data_count;\n        data_count_written = false;\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            write_data_count();\n\n            if (addr < (1UL << 16) && address_length <= 2)\n                write_inner(9, addr, 2, 0, 0);\n            else if (addr < (1UL << 24) && address_length <= 3)\n                write_inner(8, addr, 3, 0, 0);\n            else\n                write_inner(7, addr, 4, 0, 0);\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_idt::line_length_set(int)\n{\n    // This is a binary format.  Ignore.\n}\n\n\nvoid\nsrecord::output_file_idt::address_length_set(int n)\n{\n    if (n < 2)\n        n = 2;\n    else if (n > 4)\n        n = 4;\n    address_length = n;\n}\n\n\nbool\nsrecord::output_file_idt::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length - 4)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_idt::preferred_block_size_get(void)\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_idt::format_name(void)\n    const\n{\n    return \"IDT System Integration Manager binary\";\n}\n\n\nbool\nsrecord::output_file_idt::is_binary(void)\n    const\n{\n    return true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/idt.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_IDT_H\n#define SRECORD_OUTPUT_FILE_IDT_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::output_file_idt class is used to represent an output\n  * file which emits Integrated Device Technology (IDT) system\n  * integration module (IDT/sim) binary format.\n  *\n  * @sa\n  *     #srecord::output_file_motorola,\n  *     #srecord::output_file_wilson,\n  */\nclass output_file_idt:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_idt();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &rec);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int nbytes);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    output_file_idt(const std::string &file_name);\n\n    /**\n      * The data_count instance variable is used to remember the total\n      * number of ouput data lines have occurred to date.  Ths is used\n      * at the end of the file to emit an S5 record.\n      */\n    unsigned long data_count;\n\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * preferred number of data bytes (NOT encoded hex characters) to\n      * be placed in each output line.\n      */\n    int pref_block_size;\n\n    /**\n      * The address_length instance variable is used to remember the\n      * minimum number of address bytes to be emitted into output lines.\n      */\n    int address_length;\n\n    /**\n      * The data_count_written instance variable is used to remember\n      * whether or not we have written out the data count record.\n      * Usually this is done with the start arrdess record, but there\n      * are circumstances where it will be needed when the file is\n      * closed.\n      */\n    bool data_count_written;\n\n    /**\n      * The write_data_count method is used to write out a data count\n      * record, if one is required.\n      */\n    void write_data_count(void);\n\n    /**\n      * The write_inner method is used to write a line of output.\n      *\n      * @param tag\n      *     The tag value at the start of the line.  For example, and S1\n      *     line would have a tag of 1.\n      * @param address\n      *     The address of the first byte of data on the line.\n      * @param address_nbytes\n      *     The number of bytes of address to emit.\n      * @param data\n      *     The palyload of this line.\n      * @param data_nbytes\n      *     The number of bytes of payload.\n      */\n    void write_inner(int tag, unsigned long address, unsigned address_nbytes,\n        const unsigned char *data, size_t data_nbytes);\n\n    /**\n      * The default constructor.\n      * Do not use.\n      */\n    output_file_idt();\n\n    /**\n      * The copy constructor.\n      * Do not use.\n      */\n    output_file_idt(const output_file_idt &);\n\n    /**\n      * The assignment operator.\n      * Do not use.\n      */\n    output_file_idt &operator=(const output_file_idt &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_IDT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/intel.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/intel.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_intel::~output_file_intel()\n{\n    if (enable_footer_flag)\n        write_inner(1, 0L, 0, 0);\n}\n\n\nsrecord::output_file_intel::output_file_intel(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    address_base(0),\n    pref_block_size(32),\n    mode(mode_linear)\n{\n    // The address base always has the lower 16 bits set to zero.\n    // By making it be 1, we force the first data record to emit an\n    // address base record first.\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_intel::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_intel(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_intel::write_inner(int tag, unsigned long address,\n    const void *data, int data_nbytes)\n{\n    //\n    // Make sure the line is not too long.\n    //\n    if (data_nbytes >= 256)\n        fatal_error(\"data length (%d > 255) too long\", data_nbytes);\n\n    //\n    // Emit the line as hexadecimal text.\n    //\n    put_char(':');\n    checksum_reset();\n    put_byte(data_nbytes);\n    unsigned char tmp[2];\n    srecord::record::encode_big_endian(tmp, address, 2);\n    put_byte(tmp[0]);\n    put_byte(tmp[1]);\n    put_byte(tag);\n    const unsigned char *data_p = (const unsigned char *)data;\n    for (int j = 0; j < data_nbytes; ++j)\n        put_byte(data_p[j]);\n    put_byte(-checksum_get());\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_intel::write(const srecord::record &record)\n{\n    unsigned char tmp[4];\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        //\n        // This format can't do header records\n        //\n        if (!enable_optional_address_flag)\n            address_base = 1;\n        break;\n\n    case srecord::record::type_data:\n        switch (mode)\n        {\n        case mode_i8hex:\n            // This format is limited to 64KiB.\n            if (!record.address_range_fits_into_n_bits(16))\n                data_address_too_large(record, 16);\n            break;\n\n        case mode_segmented:\n            //\n            // Segmented mode has an ugly boundary condition.\n            //\n            {\n                // This format is limited to 1MiB.\n                if (!record.address_range_fits_into_n_bits(20))\n                    data_address_too_large(record, 20);\n\n                //\n                // If the record would cross a segment boundary, split the\n                // record across the boundary.  This avoids an ambiguity in\n                // the Intel spec.\n                //\n                srecord::record::address_t begin_segment =\n                    record.get_address() >> 16;\n                srecord::record::address_t end_segment =\n                    (record.get_address() + record.get_length() - 1) >> 16;\n                if (begin_segment != end_segment)\n                {\n                    int split = (1L << 16) - (record.get_address() & 0xFFFF);\n                    srecord::record part1\n                    (\n                        srecord::record::type_data,\n                        record.get_address(),\n                        record.get_data(),\n                        split\n                    );\n                    write(part1);\n                    srecord::record part2\n                    (\n                        srecord::record::type_data,\n                        record.get_address() + split,\n                        record.get_data() + split,\n                        record.get_length() - split\n                    );\n                    write(part2);\n                    return;\n                }\n            }\n            break;\n\n        case mode_linear:\n            break;\n        }\n\n        if ((record.get_address() & 0xFFFF0000) != address_base)\n        {\n            address_base = record.get_address() & 0xFFFF0000;\n            switch (mode)\n            {\n            case mode_linear:\n                srecord::record::encode_big_endian(tmp, address_base >> 16, 2);\n                write_inner(4, 0L, tmp, 2);\n                break;\n\n            case mode_segmented:\n                srecord::record::encode_big_endian(tmp, address_base >> 4, 2);\n                write_inner(2, 0L, tmp, 2);\n                break;\n\n            case mode_i8hex:\n                break;\n            }\n        }\n        write_inner\n        (\n            0,\n            record.get_address() & 0x0000FFFF,\n            record.get_data(),\n            record.get_length()\n        );\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            srecord::record::encode_big_endian(tmp, record.get_address(), 4);\n            switch (mode)\n            {\n            case mode_linear:\n                write_inner(5, 0L, tmp, 4);\n                break;\n\n            case mode_segmented:\n                write_inner(3, 0L, tmp, 4);\n                break;\n\n            case mode_i8hex:\n                // In ancient times, it went into the EOF record\n                write_inner(1, record.get_address(), 0, 0);\n                enable_footer_flag = false;\n                break;\n            }\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_intel::line_length_set(int n)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    //\n    n = (n - 11) / 2;\n\n    //\n    // Constrain based on the file format.\n    // (255 is the largest that will fit in the data size field)\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 255)\n        n = 255;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_intel::address_length_set(int x)\n{\n    if (x <= 2)\n    {\n        mode = mode_i8hex;\n    }\n    else if (x <= 3)\n    {\n        mode = mode_segmented;\n    }\n    else\n    {\n        mode = mode_linear;\n    }\n}\n\n\nbool\nsrecord::output_file_intel::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes > 255)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_intel::preferred_block_size_get()\n        const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_intel::format_name()\n    const\n{\n    return \"Intel-Hex\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/intel.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2006-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_INTEL_H\n#define SRECORD_OUTPUT_FILE_INTEL_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_intel class is used to write an EPROM load file\n  * in Intel Hex format.\n  */\nclass output_file_intel:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_intel();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_intel(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\nprivate:\n    /**\n      * The write_inner method is used to write a single line to the\n      * output file.\n      */\n    void write_inner(int, unsigned long, const void *, int);\n\n    /**\n      * The address_base instance variable is used to remember the\n      * current position within the output file\n      */\n    unsigned long address_base;\n\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * preferred number of bytes on each line of the output file.\n      */\n    int pref_block_size;\n\n    enum mode_t\n    {\n        mode_linear, // aka i32hex\n        mode_segmented, // aka i16hex\n        mode_i8hex\n    };\n\n    /**\n      * The mode instance variable is used to remember what addressing\n      * mode the file is currently in.  If set to \"segmented\" (via the\n      * address_length_set method) you get 16-bit MCS-86 output (record\n      * type 2, extended segment address record).  The default value of\n      * \"linear\" gets you 32-bit output (record type 4, extended linear\n      * address record).\n      */\n    mode_t mode;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_intel();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_intel(const output_file_intel &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_intel &operator=(const output_file_intel &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_INTEL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/intel16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/intel16.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_intel16::~output_file_intel16()\n{\n    if (enable_footer_flag)\n        write_inner(1, 0L, 0, 0);\n}\n\n\nsrecord::output_file_intel16::output_file_intel16(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address_base(0),\n    pref_block_size(32)\n{\n    // The address base always has the lower 16 bits set to zero.\n    // By making it be 1, we force the first data record to emit an\n    // address base record first.\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_intel16::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_intel16(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_intel16::write_inner(int tag, unsigned long address,\n    const void *data, int data_nbytes)\n{\n    //\n    // Make sure the line is not too long.\n    //\n    if (data_nbytes >= 255*2)\n        fatal_error(\"data length (%d > %d) too long\", data_nbytes, 255*2-1);\n\n    //\n    // Emit the line as hexadecimal text.\n    //\n    put_char(':');\n    checksum_reset();\n    put_byte(data_nbytes >> 1);\n    unsigned char tmp[2];\n    srecord::record::encode_big_endian(tmp, address, 2);\n    put_byte(tmp[0]);\n    put_byte(tmp[1]);\n    put_byte(tag);\n    const unsigned char *data_p = (const unsigned char *)data;\n    for (int j = 0; j < data_nbytes; ++j)\n    {\n        // Note: bytes are ordered HI,LO so we invert\n        put_byte(data_p[j ^ 1]);\n    }\n    put_byte(-checksum_get());\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_intel16::write(const srecord::record &record)\n{\n    unsigned char tmp[4];\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        //\n        // This format can't do header records\n        //\n        if (!enable_optional_address_flag)\n            address_base = 1;\n        break;\n\n    case srecord::record::type_data:\n        if ((record.get_address() & 1) || (record.get_length() & 1))\n            fatal_alignment_error(2);\n        if ((record.get_address() & 0xFFFE0000) != address_base)\n        {\n            address_base = record.get_address() & 0xFFFE0000;\n            srecord::record::encode_big_endian\n            (\n                tmp,\n                record.get_address() >> 17,\n                2\n            );\n            write_inner(4, 0L, tmp, 2);\n        }\n        write_inner\n        (\n            0,\n            (record.get_address() >> 1) & 0x0000FFFF,\n            record.get_data(),\n            record.get_length()\n        );\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag && record.get_address() != 0)\n        {\n            srecord::record::encode_big_endian\n            (\n                tmp,\n                record.get_address() >> 1,\n                4\n            );\n            write_inner(5, 0L, tmp, 4);\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_intel16::line_length_set(int n)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    //\n    n = ((n - 11) / 2) & ~1;\n\n    //\n    // Constrain based on the file format.\n    // (255*2 is the largest that will fit in the data size field)\n    //\n    if (n < 2)\n        n = 2;\n    else if (n > 255*2)\n        n = 255*2;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > (srecord::record::max_data_length & ~1))\n        n = (srecord::record::max_data_length & ~1);\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_intel16::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_intel16::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 2 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes & 1)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_intel16::preferred_block_size_get()\n        const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_intel16::format_name()\n    const\n{\n    return \"Intel-16\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/intel16.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_INTEL16_H\n#define SRECORD_OUTPUT_FILE_INTEL16_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_intel16 class is used to write an EPROM load file\n  * in INHX16 format.\n  */\nclass output_file_intel16:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_intel16();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_intel16(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The write_inner method is used toi write a single line to the\n      * output file.\n      */\n    void write_inner(int, unsigned long, const void *, int);\n\n    /**\n      * The address_base instance variable is used to remember the\n      * current position within the output file\n      */\n    unsigned long address_base;\n\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * preferred number of bytes on each line of the output file.\n      */\n    int pref_block_size;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_intel16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_intel16(const output_file_intel16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_intel16 &operator=(const output_file_intel16 &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_INTEL16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/line_termination.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex.h>\n#include <srecord/sizeof.h>\n#include <srecord/output/file.h>\n\n\nsrecord::output_file::line_termination_t\n  srecord::output_file::line_termination =\n    srecord::output_file::line_termination_native;\n\n\nsrecord::output_file::line_termination_t\nsrecord::output_file::line_termination_guess()\n{\n#if __dos__ || __windows__ || __WINDOWS__ || __CYGWIN__ | _WIN32\n    // Perform this test first, so that Cygwin thinks it's on Windows,\n    // rather than Unix.  This is because most Cygwin users are actually\n    // using the mingw executables, and are not actually using the\n    // Cygwin shell.\n    return line_termination_crlf;\n#elif __unix__ || UNIX\n    return line_termination_nl;\n#elif __macosx__\n    return line_termination_cr;\n#elif __primos__ || PRIMOS\n    return line_termination_primos;\n#else\n    return line_termination_binary;\n#endif\n}\n\n\nbool\nsrecord::output_file::line_termination_by_name(const std::string &name)\n{\n    struct table_t\n    {\n        const char *name;\n        line_termination_t end;\n    };\n    static const table_t table[] =\n    {\n        { \"Apple\", line_termination_cr },\n        { \"Binary\", line_termination_binary },\n        { \"Carriage_Return_Line_Feed\", line_termination_crlf },\n        { \"Carriage_Return\", line_termination_cr },\n        { \"DOS\", line_termination_crlf },\n        { \"Line_Feed\", line_termination_nl },\n        { \"LINUx\", line_termination_nl },\n        { \"Macintosh\", line_termination_cr },\n        { \"Macintosh_Operating_System_X\", line_termination_cr },\n        { \"NewLine\", line_termination_nl },\n        { \"Pr1mos\", line_termination_primos },\n        { \"Primos\", line_termination_primos },\n        { \"Prime\", line_termination_primos },\n        { \"Unix\", line_termination_nl },\n        { \"Windows\", line_termination_crlf },\n    };\n\n    for (const table_t *tp = table; tp < ENDOF(table); ++tp)\n    {\n        if (arglex::compare(tp->name, name.c_str()))\n        {\n            line_termination = tp->end;\n            return true;\n        }\n    }\n    return false;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/logisim.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio> // for snprintf\n#include <cstring>\n#include <cassert>\n\n#include <srecord/output/file/logisim.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_logisim::~output_file_logisim()\n{\n    if (column)\n        put_char('\\n');\n}\n\n\nsrecord::output_file_logisim::output_file_logisim(\n    const std::string &a_file_name\n) :\n    output_file(a_file_name),\n    address(0),\n    line_length(80),\n    column(0)\n{\n    put_string(\"v2.0 raw\\n\\n\");\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_logisim::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_logisim(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_logisim::emit(int count, int value)\n{\n    assert(count > 0);\n    char buffer[100];\n    if (count == 1)\n        snprintf(buffer, sizeof(buffer), \"%X\", value);\n    else\n        snprintf(buffer, sizeof(buffer), \"%d*%X\", count, value);\n    int buffer_length = strlen(buffer);\n\n    address += count;\n\n    if (column == 0)\n    {\n        // even if the word is 80 chars long, print it out\n        // if we are at the start of  a new line\n    }\n    else if (column + 1 + buffer_length <= line_length)\n    {\n        // separate each datum by white space.\n        put_char(' ');\n        ++column;\n    }\n    else\n    {\n        // will not fit on the current line,\n        // so throw a newline.\n        put_char('\\n');\n        column = 0;\n    }\n    put_string(buffer);\n    column += buffer_length;\n}\n\n\nvoid\nsrecord::output_file_logisim::write(const srecord::record &record)\n{\n    // This format can't do header records or termination records\n    if (record.get_type() != srecord::record::type_data)\n        return;\n\n    if (!record.address_range_fits_into_n_bits(16))\n        data_address_too_large(record, 16);\n\n    assert (address <= record.get_address());\n    while (address < record.get_address())\n    {\n#if 1\n        fatal_hole_error(address, record.get_address() - 1);\n#else\n        // fill holes with 0x00\n        // this format has no provision for switching adddress mid stream.\n        int count = record.get_address() - address;\n        if (count >= 512)\n            count = 512;\n        emit(count, 0x00);\n#endif\n    }\n\n    for (size_t j = 0; j < record.get_length(); ++j)\n    {\n        int value = record.get_data(j);\n\n        // look for runs, at least of length 4.\n        int count = 1;\n        while\n        (\n            j + count < record.get_length()\n        &&\n            record.get_data(j + count) == value\n        )\n        {\n             ++count;\n        }\n        // Logisim only uses counts when the runs are longer than 4.\n        if (count < 4)\n            count = 1;\n        j += count - 1;\n\n        emit(count, value);\n    }\n}\n\n\nvoid\nsrecord::output_file_logisim::line_length_set(int x)\n{\n    line_length = (x <= 0 ? 80 : (x < 20 ? 20 : x));\n}\n\n\nvoid\nsrecord::output_file_logisim::address_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nbool\nsrecord::output_file_logisim::preferred_block_size_set(int nbytes)\n{\n    (void)nbytes;\n    return false;\n}\n\n\nint\nsrecord::output_file_logisim::preferred_block_size_get(void)\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    //\n    return (srecord::record::max_data_length);\n}\n\n\nconst char *\nsrecord::output_file_logisim::format_name(void)\n    const\n{\n    return \"Logisim\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/logisim.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_LOGISIM_H\n#define SRECORD_OUTPUT_FILE_LOGISIM_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord {\n\n/**\n  * The output_file_logisim class is used to represent\n  * the processing neccessry to write a Logisim ROM file.\n  */\nclass output_file_logisim:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_logisim();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\nprivate:\n    /**\n      * The constructor.\n      * Use #create instead.\n      */\n    output_file_logisim(const std::string &file_name);\n\n    long address;\n    int line_length;\n    int column;\n\n    void emit(int count, int value);\n\n    /**\n      * The default constructor.\n      * Do not use.\n      */\n    output_file_logisim();\n\n    /**\n      * The copy constructor.\n      * Do not use.\n      */\n    output_file_logisim(const output_file_logisim &rhs);\n\n    /**\n      * The assignment operator.\n      * Do not use.\n      */\n    output_file_logisim &operator=(const output_file_logisim &rhs);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_LOGISIM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mem.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009, 2010, 2012, 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/progname.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/mem.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_mem::~output_file_mem()\n{\n    emit_header();\n    if (column)\n        put_char('\\n');\n    if (enable_header_flag && actual_depth != depth)\n        put_stringf(\"#Depth=%lu;\\n\", actual_depth / width_in_bytes);\n}\n\n\nsrecord::output_file_mem::output_file_mem(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    address(0),\n    column(0),\n    depth(0),\n    width(8),\n    width_in_bytes(1),\n    actual_depth(0),\n    header_done(false),\n    pref_blk_sz(32)\n{\n    line_length_set(80);\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_mem::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_mem(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_mem::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        width = cmdln->value_number();\n        cmdln->token_next();\n        switch (width)\n        {\n        case 1:\n        case 8:\n            width = 8; // ambiguous\n            width_in_bytes = 1;\n            break;\n\n        case 2:\n        case 16:\n            width = 16;\n            width_in_bytes = 2;\n            break;\n\n        case 4:\n        case 32:\n            width = 32;\n            width_in_bytes = 4;\n            break;\n\n        case 64:\n            width = 64;\n            width_in_bytes = 8; // ambiguous\n            break;\n\n        default:\n            fatal_error(\"-mem address multiple %d not understood\", width);\n        }\n        line_length_set(80);\n    }\n}\n\n\nvoid\nsrecord::output_file_mem::notify_upper_bound(unsigned long addr)\n{\n    depth = addr;\n    actual_depth = addr;\n}\n\n\nvoid\nsrecord::output_file_mem::emit_header(void)\n{\n    if (header_done)\n        return;\n    if (enable_header_flag)\n    {\n        if (column != 0)\n        {\n            put_char('\\n');\n            column = 0;\n        }\n        put_stringf(\"#Format=Hex\\n\"); // Bin | Hex | AddrHex\n        if (actual_depth != 0)\n        {\n            put_stringf(\"#Depth=%lu\\n\", actual_depth / width_in_bytes);\n        }\n        put_stringf(\"#Width=%d\\n\", width);\n        // 0: binary, 1: octal, 3: decimal, 3: hexadecimal\n        put_stringf(\"#AddrRadix=3\\n\");\n        put_stringf(\"#DataRadix=3\\n\");\n        put_stringf(\"#Data\\n\");\n\n        // Comments may be added to any of the data, but never add\n        // comments to the header.  The header ends here, so it is safe\n        // to add some additional information.\n        //\n        // Note that some widths are ambiguous\n        //    8 bits, 1 byte\n        //   16 bits, 2 bytes\n        //   32 bits, 4 bytes\n        //   64 bits, 8 bytes\n        // thus \"8\" is ambiguous\n        put_stringf\n        (\n            \"#\\n\"\n            \"# Generated automatically by %s -o --MEM %d\\n\"\n            \"#\\n\",\n            progname_get(),\n            (width == 8 ? 64 : width)\n        );\n    }\n    header_done = true;\n}\n\n\nvoid\nsrecord::output_file_mem::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_unknown:\n        // Ignore.\n        break;\n\n    case srecord::record::type_header:\n        if (enable_header_flag && record.get_length() > 0)\n        {\n            // Output the header record as a comment.\n            emit_header();\n\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (c == '\\n')\n                {\n                    if (column == 0)\n                        put_char('#');\n                    put_char('\\n');\n                    column = 0;\n                    continue;\n                }\n                if (!isprint(c))\n                    c = ' ';\n                if (column == 0)\n                {\n                    put_string(\"# \");\n                    column = 2;\n                    if (record.get_address() != 0)\n                    {\n                        unsigned long addr = record.get_address();\n                        put_stringf(\"%04lX: \", addr);\n                        column += 6;\n                    }\n                }\n                put_char(c);\n                ++column;\n            }\n            if (column > 0)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n        }\n        break;\n\n    case srecord::record::type_data:\n        {\n            unsigned long addr = record.get_address();\n            unsigned len = record.get_length();\n            if (address != addr)\n                fatal_hole_error(address, addr);\n            if ((addr % width_in_bytes) || (len % width_in_bytes))\n                fatal_alignment_error(width_in_bytes);\n            emit_header();\n\n            for (unsigned j = 0; j < len; ++j)\n            {\n                if (column > 0 && (j % width_in_bytes) == 0)\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n                put_byte(record.get_data(j));\n                column += 2;\n\n                if\n                (\n                    ((j + 1) % width_in_bytes) == 0\n                ||\n                    column + 1 + width_in_bytes * 2 > 80\n                )\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n            }\n\n            address = addr + len;\n            if (actual_depth < address)\n                actual_depth = address;\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        if (enable_data_count_flag)\n        {\n            if (column > 0)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            unsigned long addr = record.get_address();\n            put_stringf(\"# data record count = %lu\\n\", addr);\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            if (column > 0)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            unsigned long addr = record.get_address();\n            put_stringf(\"# execution start address = %04lX\\n\", addr);\n        }\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_mem::line_length_set(int len)\n{\n    int pref_mult = (len - 6) / (1 + 2 * width_in_bytes);\n    if (pref_mult < 1)\n        pref_mult = 1;\n    pref_blk_sz = pref_mult * width_in_bytes;\n}\n\n\nvoid\nsrecord::output_file_mem::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_mem::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes % width_in_bytes)\n        return false;\n    pref_blk_sz = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_mem::preferred_block_size_get(void)\n    const\n{\n    return pref_blk_sz;\n}\n\n\nconst char *\nsrecord::output_file_mem::format_name(void)\n    const\n{\n    return \"Lattice Memory Initialization Format (.mem)\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mem.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_MEM_H\n#define SRECORD_OUTPUT_FILE_MEM_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_mem class is used to represent the output state\n  * of a file in Memory Initialization File Format (.mem Lattice).\n  */\nclass output_file_mem:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_mem();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_mem(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation\n    void write(const record &);\n\n    // See base class for documentation\n    void line_length_set(int);\n\n    // See base class for documentation\n    void address_length_set(int);\n\n    // See base class for documentation\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\n    // See base class for documentation.\n    void notify_upper_bound(unsigned long addr);\n\nprivate:\n    /**\n      * The address instance variable is used to remember the next\n      * memory address to be written.  This is also used to detect holes\n      * in the input data.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable i sused to remember the output text\n      * column.  This is used to know when ti wrap lines.\n      */\n    int column;\n\n    /**\n      * The depth instance variable is used to remember how many bytes\n      * of data there is.  Kind of broken, because we don't know this\n      * when the header is actually printed.\n      */\n    unsigned long depth;\n\n    /**\n      * The width instance variable is used to remember how many bits\n      * there are per data item.  Default to 8 (traditional bytes).\n      */\n    unsigned width;\n\n    /**\n      * The width_in_bytes instance variable is used to remember how\n      * many bytes there are per data item.  Defaults to 1.\n      */\n    unsigned width_in_bytes;\n\n    /**\n      * The actual_depth instance variable is used to remember how many\n      * bytes of data there were.  This is printed in the footer.\n      */\n    unsigned long actual_depth;\n\n    /**\n      * The header_done instance variable is used to remember whether\n      * the emit_header method has already been called.\n      */\n    bool header_done;\n\n    /**\n      * The pref_blk_sz instance variable is used to remember the\n      * preferred block size, in bytes.\n      */\n    int pref_blk_sz;\n\n    /**\n      * The emit_header method is used to emit the file header,\n      * if necessary.\n      */\n    void emit_header(void);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_mem();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_mem(const output_file_mem &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_mem &operator=(const output_file_mem &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_MEM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mif.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/progname.h>\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/mif.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_mif::~output_file_mif()\n{\n    emit_header();\n    put_stringf(\"END;\\n\");\n    if (enable_header_flag && actual_depth != depth)\n        put_stringf(\"-- DEPTH = %lu;\\n\", actual_depth / width_in_bytes);\n}\n\n\nsrecord::output_file_mif::output_file_mif(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    depth(65536),\n    width(8),\n    width_in_bytes(1),\n    actual_depth(0),\n    header_done(false),\n    pref_blk_sz(32)\n{\n    line_length_set(80);\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_mif::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_mif(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_mif::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        width = cmdln->value_number();\n        cmdln->token_next();\n        switch (width)\n        {\n        default:\n            // yuck\n\n        case 1:\n        case 8:\n            width = 8;\n            width_in_bytes = 1;\n            break;\n\n        case 2:\n        case 16:\n            width = 16;\n            width_in_bytes = 2;\n            break;\n\n        case 4:\n        case 32:\n            width = 32;\n            width_in_bytes = 4;\n            break;\n\n        case 64:\n            width = 64;\n            width_in_bytes = 8;\n            break;\n        }\n        line_length_set(80);\n    }\n}\n\n\nvoid\nsrecord::output_file_mif::notify_upper_bound(unsigned long addr)\n{\n    depth = addr;\n    actual_depth = addr;\n}\n\n\nvoid\nsrecord::output_file_mif::emit_header()\n{\n    if (header_done)\n        return;\n    if (enable_header_flag)\n    {\n        put_stringf\n        (\n            \"--\\n\"\n            \"-- Generated automatically by %s -o --mif\\n\"\n            \"--\\n\",\n            progname_get()\n        );\n        if (actual_depth != 0)\n        {\n            put_stringf(\"DEPTH = %lu;\\n\", actual_depth / width_in_bytes);\n        }\n        else\n        {\n            put_stringf\n            (\n                \"DEPTH = %lu; \"\n                    \"-- see comment at end of file for the actual size\\n\",\n                depth / width_in_bytes\n            );\n        }\n        put_stringf(\"WIDTH = %d;\\n\", width);\n        put_stringf(\"ADDRESS_RADIX = HEX;\\n\");\n        put_stringf(\"DATA_RADIX = HEX;\\n\");\n    }\n    put_stringf(\"CONTENT BEGIN\\n\");\n    header_done = true;\n}\n\n\nvoid\nsrecord::output_file_mif::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_unknown:\n        // Ignore.\n        break;\n\n    case srecord::record::type_header:\n        if (enable_header_flag && record.get_length() > 0)\n        {\n            //\n            // Output the header record as a comment.\n            //\n            put_string(\"-- \");\n            if (record.get_address() != 0)\n            {\n                unsigned long addr = record.get_address();\n                put_stringf(\"%04lX: \", addr);\n            }\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (c == '\\n')\n                {\n                    put_string(\"\\n-- \");\n                    continue;\n                }\n                if (!isprint(c))\n                    c = ' ';\n                put_char(c);\n            }\n            put_char('\\n');\n        }\n        break;\n\n    case srecord::record::type_data:\n        {\n            unsigned long addr = record.get_address();\n            unsigned len = record.get_length();\n            if ((addr % width_in_bytes) || (len % width_in_bytes))\n                fatal_alignment_error(width_in_bytes);\n            emit_header();\n            put_stringf(\"%04lX:\", addr / width_in_bytes);\n            for (unsigned j = 0; j < len; ++j)\n            {\n                if ((j % width_in_bytes) == 0)\n                    put_stringf(\" \");\n                put_stringf(\"%02X\", record.get_data(j));\n            }\n            put_stringf(\";\\n\");\n\n            unsigned long d = addr + len;\n            if (actual_depth < d)\n                actual_depth = d;\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        if (enable_data_count_flag)\n        {\n            unsigned long addr = record.get_address();\n            put_stringf(\"-- data record count = %lu\\n\", addr);\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            unsigned long addr = record.get_address();\n            put_stringf(\"-- start address = %04lX\\n\", addr);\n        }\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_mif::line_length_set(int len)\n{\n    int pref_mult = (len - 6) / (1 + 2 * width_in_bytes);\n    if (pref_mult < 1)\n        pref_mult = 1;\n    pref_blk_sz = pref_mult * width_in_bytes;\n}\n\n\nvoid\nsrecord::output_file_mif::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_mif::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes % width_in_bytes)\n        return false;\n    pref_blk_sz = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_mif::preferred_block_size_get()\n    const\n{\n    return pref_blk_sz;\n}\n\n\nconst char *\nsrecord::output_file_mif::format_name()\n    const\n{\n    return \"Memory Initialization File (MIF, Altera)\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mif.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_MIF_H\n#define SRECORD_OUTPUT_FILE_MIF_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_mif class is used to represent the output state\n  * of a file in Memory Initialization File (MIF) format (Altera).\n  */\nclass output_file_mif:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_mif();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_mif(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation\n    void write(const record &);\n\n    // See base class for documentation\n    void line_length_set(int);\n\n    // See base class for documentation\n    void address_length_set(int);\n\n    // See base class for documentation\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    void notify_upper_bound(unsigned long addr);\n\nprivate:\n    /**\n      * The depth instance variable is used to remember how many bytes\n      * of data there is.  Kind of broken, because we don't know this\n      * when the header is actually printed.\n      */\n    unsigned long depth;\n\n    /**\n      * The width instance variable is used to remember how many bits\n      * there are per data item.  Default to 8 (traditional bytes).\n      */\n    unsigned width;\n\n    /**\n      * The width_in_bytes instance variable is used to remember how\n      * many bytes there are per data item.  Defaults to 1.\n      */\n    unsigned width_in_bytes;\n\n    /**\n      * The actual_depth instance variable is used to remember how many\n      * bytes of data there were.  This is printed in the footer.\n      */\n    unsigned long actual_depth;\n\n    /**\n      * The header_done instance variable is used to remember whether\n      * the emit_header method has already been called.\n      */\n    bool header_done;\n\n    /**\n      * The pref_blk_sz instance variable is used to remember the\n      * preferred block size, in bytes.\n      */\n    int pref_blk_sz;\n\n    /**\n      * The emit_header method is used to emit the file header,\n      * if necessary.\n      */\n    void emit_header();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_mif();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_mif(const output_file_mif &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_mif &operator=(const output_file_mif &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_MIF_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mips_flash.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/mips_flash.h>\n#include <srecord/record.h>\n#include <srecord/sizeof.h>\n\n\nsrecord::output_file_mips_flash::~output_file_mips_flash()\n{\n    buffer_flush_newline();\n\n    if (!base_set)\n        fatal_error(\"no data written\");\n    if (base == 0x1FC00000)\n    {\n        // Lock the flash.\n        put_string(\">LOCKFLSH\\n\");\n        put_string(\"@1fc00000 !S\\n\");\n        put_string(\"@1fc20000 !S\\n\");\n        put_string(\"@1fc40000 !S\\n\");\n        put_string(\"@1fc60000 !S\\n\");\n        put_string(\"@1fc80000 !S\\n\");\n        put_string(\"@1fca0000 !S\\n\");\n        put_string(\"@1fcc0000 !S\\n\");\n        put_string(\"@1fce0000 !S\\n\");\n    }\n    put_string(\">#DL_DONE\\n\");\n    put_string(\">FINISHED\\n\");\n}\n\n\nsrecord::output_file_mips_flash::output_file_mips_flash(\n    const std::string &a_filename,\n    endian_t a_endian\n) :\n    srecord::output_file(a_filename),\n    endian(a_endian),\n    address(0),\n    base(0),\n    base_set(false),\n    buffer_length(0),\n    line_length(80),\n    column(0)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_mips_flash::create_le(const std::string &a_file_name)\n{\n    return\n        pointer\n        (\n            new srecord::output_file_mips_flash(a_file_name, endian_little)\n        );\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_mips_flash::create_be(const std::string &a_file_name)\n{\n    return\n        pointer\n        (\n            new srecord::output_file_mips_flash(a_file_name, endian_big)\n        );\n}\n\n\nvoid\nsrecord::output_file_mips_flash::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            unsigned long byte_address = record.get_address() + j;\n            unsigned char byte = record.get_data(j);\n            bool new_sector =\n                !base_set || ((address >> 17) != (byte_address >> 17));\n            bool new_address = !base_set || (address != byte_address);\n\n            if (new_address || new_sector)\n            {\n                buffer_flush_newline();\n                address = byte_address;\n            }\n\n            if (!base_set)\n            {\n                address = byte_address;\n                base = address & ~0x1FFFF;\n                base_set = true;\n\n                // Reset the loader state machine.\n                put_string(\"!R\\n\");\n\n                // Remember the base address.\n                if (base == 0x1FC00000)\n                {\n                    // Unlock the flash.\n                    put_string(\">1fc00xxx @1fc00000 !C\\n\");\n                }\n            }\n\n            if (new_sector)\n            {\n                // Started a new sector, by erasing it.\n                unsigned long sbase = address & ~0x1FFFF;\n                put_stringf(\">%.5lxxxx \", sbase >> 12);\n                put_stringf(\"@%.8lx !E\\n\", sbase);\n                if (sbase != address)\n                    new_address = true;\n            }\n\n            if (new_address)\n            {\n                // If the address is not 4-byte aligned:\n                // complain, and suggest they use a fill filter.\n                address = byte_address;\n                if ((address & 3) != 0)\n                    fatal_alignment_error(4);\n\n                // Set new write address.\n                put_stringf(\"@%.8lx\\n\", address);\n            }\n\n            if (new_address || new_sector || (address & 0x0FFF) == 0)\n            {\n                // Update the display.\n                put_stringf(\">%.8lx\\n\", address);\n            }\n\n            ++address;\n            buffer[buffer_length++] = byte;\n            if (buffer_length >= sizeof(buffer))\n                buffer_flush();\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore, this is the input count, not the output count\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // ignore, this format doesn't have it\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_mips_flash::buffer_flush_newline(void)\n{\n    buffer_flush();\n    if (column)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n}\n\n\nvoid\nsrecord::output_file_mips_flash::buffer_flush(void)\n{\n    if (!buffer_length)\n        return;\n    if ((buffer_length & 3) != 0)\n        fatal_alignment_error(4);\n    const unsigned char *end = buffer + buffer_length;\n    for (const unsigned char *bp = buffer; bp < end; bp += 4)\n    {\n        if (column)\n        {\n            if (column + 9 > line_length)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            else\n            {\n                put_char(' ');\n                ++column;\n            }\n        }\n        if (endian == endian_big)\n        {\n            put_byte(bp[0]);\n            put_byte(bp[1]);\n            put_byte(bp[2]);\n            put_byte(bp[3]);\n        }\n        else\n        {\n            put_byte(bp[3]);\n            put_byte(bp[2]);\n            put_byte(bp[1]);\n            put_byte(bp[0]);\n        }\n        column += 8;\n    }\n    buffer_length = 0;\n}\n\n\nvoid\nsrecord::output_file_mips_flash::line_length_set(int w)\n{\n    // ignore (fixed line length)\n    if (w > 0)\n        line_length = w;\n}\n\n\nvoid\nsrecord::output_file_mips_flash::address_length_set(int)\n{\n    // ignore (this is only a 32-bit format)\n}\n\n\nint\nsrecord::output_file_mips_flash::preferred_block_size_get(void)\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    // But make sure it is an multiple of 4 bytes long.\n    //\n    return (srecord::record::max_data_length & ~3);\n}\n\n\nbool\nsrecord::output_file_mips_flash::preferred_block_size_set(int n)\n{\n    // Irrelevant.\n    return ((n & 3) == 0);\n}\n\n\nconst char *\nsrecord::output_file_mips_flash::format_name(void)\n    const\n{\n    return\n        (\n            endian == endian_big\n        ?\n            \"MIPS-Flash (big-endian)\"\n        :\n            \"MIPS-Flash (little-endian)\"\n        );\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mips_flash.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_MIPS_FLASH_H\n#define SRECORD_OUTPUT_FILE_MIPS_FLASH_H\n\n#include <srecord/output/file.h>\n#include <srecord/endian.h>\n\nnamespace srecord {\n\n/**\n  * The output_file_mips_flash class is used to write a MIPS-Flash\n  * formatted file.\n  */\nclass output_file_mips_flash:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_mips_flash();\n\n    /**\n      * The create_le class method is used to create new dynamically\n      * allocated instances of this class, using little-endian byte\n      * ordering.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create_le(const std::string &file_name);\n\n    /**\n      * The create_be class method is used to create new dynamically\n      * allocated instances of this class, using big-endian byte\n      * ordering.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create_be(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create_le\n      * or #create_be class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      * @param endian\n      *     The byte order to expect.\n      */\n    output_file_mips_flash(const std::string &file_name, endian_t endian);\n\n    /**\n      * The write_inner method is used to write a single line (record)\n      * to the file.  Use by the write() method.\n      */\n    void write_inner(int type, unsigned long addr, int addr_len,\n        const void *data, int data_len);\n\n    /**\n      * The endia instance variable is used to remember whetehr this\n      * file is big-endian or little-endian.\n      */\n    endian_t endian;\n\n    /**\n      * The address instance variable is used to remember the address at\n      * which the next byte is to be placed.\n      */\n    unsigned long address;\n\n    /**\n      * The base instance variable is used to remember teh base address\n      * of the current flash segment.\n      */\n    unsigned long base;\n\n    /**\n      * The base_set instance variable is used to remember whether or\n      * not the #base instance varaible has been set yet.  This also\n      * implies no data has been seen yet.\n      */\n    bool base_set;\n\n    /**\n      * The buffer instance variable is used to remember the accumulated\n      * data so far.  Must be a multiple of 4 bytes long.\n      */\n    unsigned char buffer[256];\n\n    /**\n      * The buffer_length instance variable is used to remember how many\n      * bytes of the #buffer array have been consumed to date.\n      */\n    size_t buffer_length;\n\n    /**\n      * The buffer_flush method is used to write the #buffer_length\n      * bytes of data in the #buffer array to the file.  The\n      * #buffer_length has been reset to zero on return.\n      */\n    void buffer_flush(void);\n\n    /**\n      * The buffer_flush_newline method is used to write the datam,\n      * using the #buffer_flush method, and then issue a newline if the\n      * output is not at the beginning of a new line.\n      */\n    void buffer_flush_newline(void);\n\n    /**\n      * The line_length instance variable is used to remember the\n      * preferred line length for the output, in fixed width character\n      * columns.\n      */\n    int line_length;\n\n    /**\n      * The column instance variable is used to rememebr the current\n      * output column.  If zero, it means we are positioned at the\n      * beginning of a new line of text.\n      */\n    int column;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_mips_flash();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_mips_flash(const output_file_mips_flash &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_mips_flash &operator=(const output_file_mips_flash &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_MIPS_FLASH_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mos_tech.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/mos_tech.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_mos_tech::~output_file_mos_tech()\n{\n    if (data_record_count && enable_data_count_flag)\n    {\n        put_char(';');\n        checksum_reset();\n        put_byte(0);\n        put_word_be(data_record_count);\n        // In the only file example I have, the count is repeated\n        // in the checksum, which would you make you think that the\n        // address field is added as a 16-bit value, except that\n        // only the data count line is wrong.  Sheesh.\n        put_word_be(data_record_count);\n        //put_word(checksum_get16());\n        put_char('\\n');\n        data_record_count = 0;\n    }\n}\n\n\nsrecord::output_file_mos_tech::output_file_mos_tech(\n    const std::string &a_filename\n) :\n    srecord::output_file(a_filename),\n    pref_block_size(24),\n    data_record_count(0)\n{\n    // The block size of 24 comes from the sole example I have seen of a\n    // valid MOS Tech file.\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_mos_tech::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_mos_tech(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_mos_tech::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        if (!record.address_range_fits_into_n_bits(16))\n            data_address_too_large(record, 16);\n        put_char(';');\n        checksum_reset();\n        put_byte(record.get_length());\n        put_word_be(record.get_address());\n        for (size_t j = 0; j < record.get_length(); ++j)\n            put_byte(record.get_data(j));\n        put_word_be(checksum_get16());\n        put_char('\\n');\n        ++data_record_count;\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore, this is the input count, not the output count\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // ignore, this format doesn't have it\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_mos_tech::line_length_set(int linlen)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    // ';' <len> <addr> ...data... <cs>\n    // 1 +  2 +  4 +    2*n +      2       <= linlen\n    //\n    int n = (linlen - 9) / 2;\n\n    //\n    // Constrain based on the file format.\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 255)\n        n = 255;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_mos_tech::address_length_set(int)\n{\n    // ignore (this is only a 16-bit format)\n}\n\n\nbool\nsrecord::output_file_mos_tech::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_mos_tech::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_mos_tech::format_name()\n    const\n{\n    return \"MOS-Tech\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/mos_tech.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_MOS_TECH_H\n#define SRECORD_OUTPUT_FILE_MOS_TECH_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_mos_tech class is used to write a MOS Technology\n  * formatted file.\n  */\nclass output_file_mos_tech:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_mos_tech();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_mos_tech(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The pref_block_size is used to remember the preferred block\n      * size.  Set by the line_length_set() method.  Read by the\n      * preferred_block_size_get() method.\n      */\n    int pref_block_size;\n\n    /**\n      * The data_record_count instance variable is used to remember the\n      * number of data records priesent in the output.  This is used\n      * when writing the end-of-file record.\n      */\n    int data_record_count;\n\n    /**\n      * The write_inner method is used to write a single line (record)\n      * to the file.  Use by the write() method.\n      */\n    void write_inner(int type, unsigned long addr, int addr_len,\n        const void *data, int data_len);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_mos_tech();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_mos_tech(const output_file_mos_tech &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_mos_tech &operator=(const output_file_mos_tech &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_MOS_TECH_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/motorola.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/motorola.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_motorola::~output_file_motorola()\n{\n    write_data_count();\n    // check for termination record\n}\n\n\nsrecord::output_file_motorola::output_file_motorola(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    data_count(0),\n    pref_block_size(32),\n    address_length(2),\n    address_shift(0),\n    data_count_written(false)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_motorola::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_motorola(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_motorola::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        int n = cmdln->value_number();\n        cmdln->token_next();\n\n        //\n        // Shift Bytes Bits\n        //   0     1     8\n        //   1     2    16\n        //   2     4    32\n        //   3     8    64\n        //\n        switch (n)\n        {\n        case 1:\n        case 8:\n            address_shift = 0;\n            break;\n\n        case 2:\n        case 16:\n            address_shift = 1;\n            break;\n\n        case 4:\n        case 32:\n            address_shift = 2;\n            break;\n\n        case 64:\n            address_shift = 3;\n            break;\n\n        default:\n            fatal_error(\"-motorola address multiple %d not understood\", n);\n            // NOTREACHED\n        }\n    }\n}\n\n\nvoid\nsrecord::output_file_motorola::write_inner(int tag, unsigned long address,\n    int address_nbytes, const void *data, int data_nbytes)\n{\n    //\n    // Make sure the line is not too long.\n    //\n    if (address_nbytes + data_nbytes > 254)\n    {\n        fatal_error\n        (\n            \"data length (%d+%d) too long\",\n            address_nbytes,\n            data_nbytes\n        );\n    }\n\n    //\n    // Assemble the data for this line.\n    //\n    unsigned char buffer[256];\n    int line_length = address_nbytes + data_nbytes + 1;\n    buffer[0] = line_length;\n    srecord::record::encode_big_endian(buffer + 1, address, address_nbytes);\n    if (data_nbytes)\n        memcpy(buffer + 1 + address_nbytes, data, data_nbytes);\n\n    //\n    // Emit the line as hexadecimal text.\n    //\n    put_char('S');\n    put_nibble(tag);\n    checksum_reset();\n    for (int j = 0; j < line_length; ++j)\n        put_byte(buffer[j]);\n    put_byte(~checksum_get());\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_motorola::write_data_count()\n{\n    if (data_count_written)\n        return;\n\n    if (enable_data_count_flag)\n    {\n        if (data_count < (1L << 16))\n            write_inner(5, data_count, 2, 0, 0);\n        else\n            write_inner(6, data_count, 3, 0, 0);\n    }\n    data_count_written = true;\n\n    //\n    // It is not clear in the spec whether the data count should be\n    // reset at this point.  It will not happen for srecord::cat, so it\n    // probably isn't a problem.\n    //\n    data_count = 0;\n}\n\n\nvoid\nsrecord::output_file_motorola::write(const srecord::record &record)\n{\n    //\n    // Make sure the address is nicely aligned.\n    // FIXME: cope with this more elegantly.\n    //\n    unsigned long shifted_address = record.get_address();\n    if (address_shift)\n    {\n        if (shifted_address & ((1 << address_shift) - 1))\n        {\n            fatal_error\n            (\n                \"address 0x%04lX not aligned on %d byte boundary\",\n                shifted_address,\n                (1 << address_shift)\n            );\n        }\n        shifted_address >>= address_shift;\n    }\n\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        if (enable_header_flag)\n            write_inner(0, 0, 2, record.get_data(), record.get_length());\n        break;\n\n    case srecord::record::type_data:\n        if (shifted_address < (1UL << 16) && address_length <= 2)\n        {\n            write_inner\n            (\n                1,\n                shifted_address,\n                2,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        else if (shifted_address < (1UL << 24) && address_length <= 3)\n        {\n            write_inner\n            (\n                2,\n                shifted_address,\n                3,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        else\n        {\n            write_inner\n            (\n                3,\n                shifted_address,\n                4,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        ++data_count;\n        data_count_written = false;\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            write_data_count();\n\n            if (shifted_address < (1UL << 16) && address_length <= 2)\n                write_inner(9, shifted_address, 2, 0, 0);\n            else if (shifted_address < (1UL << 24) && address_length <= 3)\n                write_inner(8, shifted_address, 3, 0, 0);\n            else\n                write_inner(7, shifted_address, 4, 0, 0);\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_motorola::line_length_set(int linlen)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    // 'S' <tag> <size1:2> <addr1:8> ...data... <cs1:2>\n    // 1 +  1 +  2 +       8 +       2*n +      2       <= linlen\n    //\n    int n = (linlen - 14) / 2;\n\n    //\n    // Constrain based on the file format.\n    //\n    // The size field (max 255) includes the size of the data,\n    // the size of the address (up to 4 bytes) and the size of the\n    // size (1 byte), thus 250 (255 - 4 - 1) bytes of data is\n    // the safest maximum.      We could make it based on the address,\n    // but that's probably overkill.\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 250)\n        n = 250;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_motorola::address_length_set(int n)\n{\n    if (n < 2)\n        n = 2;\n    else if (n > 4)\n        n = 4;\n    address_length = n;\n}\n\n\nbool\nsrecord::output_file_motorola::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_motorola::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_motorola::format_name()\n    const\n{\n    return \"Motorola S-Record\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/motorola.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_MOTOROLA_H\n#define SRECORD_OUTPUT_FILE_MOTOROLA_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_motorola class is used to represent an output\n  * file which emits Motorola S-Record format.\n  *\n  * @sa\n  *     #srecord::output_file_idt,\n  *     #srecord::output_file_wilson,\n  */\nclass output_file_motorola:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_motorola();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    output_file_motorola(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\nprivate:\n    /**\n      * The data_count instance variable is used to remember the total\n      * number of ouput data lines have occurred to date.  Ths is used\n      * at the end of the file to emit an S5 record.\n      */\n    unsigned long data_count;\n\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * preferred number of data bytes (NOT encoded hex characters) to\n      * be placed in each output line.\n      */\n    int pref_block_size;\n\n    /**\n      * The address_length instance variable is used to remember the\n      * minimum number of address bytes to be emitted into output lines.\n      */\n    int address_length;\n\n    /**\n      * The address_shift method is used to remember how far to the left\n      * addresses need to be shifted to become byte addresses.\n      * The default is zero (0).\n      *\n      * This is because of some poorly though out \"extentions\" to this\n      * file format, for 16-bit and 32-bit data busses.  I say \"poory\n      * thought out\" because the no way (zero, zip, nada) of discovering\n      * this just by looking at the data.\n      */\n    int address_shift;\n\n    /**\n      * The data_count_written instance variable is used to remember\n      * whether or not we have written out the data count record.\n      * Usually this is done with the start arrdess record, but there\n      * are circumstances where it will be needed when the file is\n      * closed.\n      */\n    bool data_count_written;\n\n    /**\n      * The write_data_count method is used to write out a data count\n      * record, if one is required.\n      */\n    void write_data_count(void);\n\n    /**\n      * The write_inner method is used to write a line of output.\n      *\n      * @param tag\n      *     The tag value at the start of the line.  For example, and S1\n      *     line would have a tag of 1.\n      * @param address\n      *     The address of the first byte of data on the line.\n      * @param address_nbytes\n      *     The number of bytes of address to emit.\n      * @param data\n      *     The palyload of this line.\n      * @param data_nbytes\n      *     The number of bytes of payload.\n      */\n    void write_inner(int tag, unsigned long address, int address_nbytes,\n        const void *data, int data_nbytes);\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_motorola(const output_file_motorola &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_motorola &operator=(const output_file_motorola &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_MOTOROLA_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/msbin.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// Code contribution by David Kozub <zub@linux.fjfi.cvut.cz>\n// Copyright assigned to Peter Miller 27-Jan-2010.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/msbin.h>\n\n\nsrecord::output_file_msbin::~output_file_msbin()\n{\n    flush_pending_records();\n\n    if (start_address_set && enable_goto_addr_flag)\n    {\n        if (beginning_of_file)\n        {\n            // This could be possible to support, but then a file\n            // header with fake data would have to be generated.\n            fatal_error(\"no data, only the execution start record present\");\n        }\n        write_record_header(0, start_address, 0);\n    }\n    else\n    {\n        warning\n        (\n            \"no execution start address record present, although \"\n            \"it's required by format specification\"\n        );\n    }\n}\n\n\nsrecord::output_file_msbin::output_file_msbin(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    start_address_set(false),\n    start_address(0),\n    beginning_of_file(true)\n{\n    line_termination = line_termination_binary;\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_msbin::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_msbin(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_msbin::write_dword_le(uint32_t d)\n{\n    unsigned char c[sizeof(uint32_t)];\n\n    srecord::record::encode_little_endian(c, d, sizeof(c));\n\n    for (size_t i = 0; i < sizeof(c); ++i)\n        put_char(c[i]);\n}\n\n\nuint32_t\nsrecord::output_file_msbin::checksum(const unsigned char *data, size_t len)\n{\n    uint32_t sum = 0;\n\n    for (size_t i = 0; i < len; ++i)\n        sum += data[i];\n\n    return sum;\n}\n\n\nvoid\nsrecord::output_file_msbin::write_file_header(uint32_t start, uint32_t length)\n{\n    // Write magic\n    static const unsigned char Magic[7] =\n        { 'B', '0', '0', '0', 'F', 'F', '\\n' };\n    for (size_t i = 0; i < sizeof(Magic); ++i)\n        put_char(Magic[i]);\n\n    // Write header itself\n    write_dword_le(start);\n    write_dword_le(length);\n}\n\n\nvoid\nsrecord::output_file_msbin::write_record_header(uint32_t addr, uint32_t length,\n    uint32_t checksum)\n{\n    write_dword_le(addr);\n    write_dword_le(length);\n    write_dword_le(checksum);\n}\n\n\nvoid\nsrecord::output_file_msbin::write_data(const record &r)\n{\n    const unsigned char *data = r.get_data();\n    size_t length = r.get_length();\n    while (length-- > 0)\n        put_char(*data++);\n}\n\n\nvoid\nsrecord::output_file_msbin::flush_pending_records(const record *r)\n{\n    if (!pending_records.empty() || r != NULL)\n    {\n        // write header\n        const record::address_t start =\n            (\n                pending_records.empty()\n            ?\n                r->get_address()\n            :\n                pending_records.front()->get_address()\n            );\n\n        const record::address_t end =\n            (\n                r\n            ?\n                r->get_address_end()\n            :\n                pending_records.back()->get_address_end()\n            );\n\n        record_vector::const_iterator it;\n        uint32_t chksum = 0;\n        for (it = pending_records.begin(); it != pending_records.end(); ++it)\n            chksum += checksum((*it)->get_data(), (*it)->get_length());\n\n        if (r)\n            chksum += checksum(r->get_data(), r->get_length());\n\n        write_record_header(start, end - start, chksum);\n\n        // write data\n        for (it = pending_records.begin(); it != pending_records.end(); ++it)\n            write_data(*(*it));\n\n        if (r)\n            write_data(*r);\n\n        pending_records.clear();\n    }\n}\n\n\nvoid\nsrecord::output_file_msbin::append_pending_record(const record &r)\n{\n    static const char *warning_size_exceeded =\n        \"cannot concatenate records: internal memory limit \"\n        \"exceeded; creating a new record\";\n\n    if (r.get_address() == 0)\n    {\n        fatal_error\n        (\n            \"the MsBin format cannot express a data value at \"\n            \"the address 0\"\n        );\n    }\n\n    // check if record can be appended\n    if\n    (\n        pending_records.empty()\n    ||\n        pending_records.back()->get_address_end() == r.get_address()\n    )\n    {\n        // can be possibly appended, check size constraints\n        size_t pending_size = 0;\n        for (record_vector::const_iterator it = pending_records.begin();\n            it != pending_records.end(); ++it)\n            pending_size += (*it)->get_length();\n\n        if (pending_size + r.get_length() > MAX_PENDING_DATA_SIZE)\n        {\n            // cannot append the record due to max pending data size\n            // limit, but r immediatelly follows pending_records =>\n            // flush (pending_records, r)\n            warning(\"%s\", warning_size_exceeded);\n            flush_pending_records(&r);\n        }\n        else\n            pending_records.push_back(boost::shared_ptr<record>(new record(r)));\n    }\n    else\n    {\n        flush_pending_records();\n        assert(pending_records.empty());\n\n        if (r.get_length() > MAX_PENDING_DATA_SIZE)\n        {\n            // r cannot be stored at all => write it out immediatelly\n            warning(\"%s\", warning_size_exceeded);\n            flush_pending_records(&r);\n        }\n        else\n            pending_records.push_back(boost::shared_ptr<record>(new record(r)));\n    }\n}\n\n\nvoid\nsrecord::output_file_msbin::notify_upper_bound(unsigned long addr)\n{\n    upper_bound = addr;\n}\n\n\nvoid\nsrecord::output_file_msbin::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_execution_start_address:\n        // Just note down the execution start address. It must be\n        // the last record in the MsBin format.\n        start_address = record.get_address();\n        start_address_set = true;\n        break;\n\n    case srecord::record::type_data:\n        if (beginning_of_file)\n        {\n            const unsigned long start = record.get_address();\n            const unsigned long length = upper_bound - start;\n            write_file_header(start, length);\n            beginning_of_file = false;\n        }\n        assert\n        (\n            record.get_length() == 0\n        ||\n            record.get_address() + record.get_length() <= upper_bound\n        );\n        append_pending_record(record);\n        break;\n\n    case srecord::record::type_header:\n    case srecord::record::type_data_count:\n    case srecord::record::type_unknown:\n        // Ignore.\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_msbin::line_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nvoid\nsrecord::output_file_msbin::address_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nbool\nsrecord::output_file_msbin::preferred_block_size_set(int nbytes)\n{\n    return (nbytes >= 1 && nbytes <= record::max_data_length);\n}\n\n\nint\nsrecord::output_file_msbin::preferred_block_size_get()\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    //\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_msbin::format_name()\n    const\n{\n    return \"Windows CE Binary Image Data Format\";\n}\n\n\nbool\nsrecord::output_file_msbin::is_binary(void)\n    const\n{\n    return true;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/msbin.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2009-2011 Peter Miller\n//\n// Code contribution by David Kozub <zub@linux.fjfi.cvut.cz>\n// Copyright assigned to Peter Miller 27-Jan-2010.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_MSBIN_H\n#define SRECORD_OUTPUT_FILE_MSBIN_H\n\n#include <stdint.h>\n#include <srecord/output/file.h>\n#include <srecord/record.h>\n#include <vector>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_msbin class is used to represent an output\n  * file in Windows CE Binary Image Data Format.\n  *\n  * See http://msdn.microsoft.com/en-us/library/ms924510.aspx\n  * for a description of the format.\n  */\nclass output_file_msbin:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_msbin();\n\nprivate:\n    /**\n      * The constructor.\n      *\n      * @param file_name\n      *     The file name to open and write output to.\n      */\n    output_file_msbin(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The file name to open to write data to.  The name \"-\" is\n      *     understood to mean the standard output.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    void notify_upper_bound(unsigned long addr);\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * MAX_PENDING_DATA_SIZE is the upper limit of the size of data\n      * we are willing to keep in the pending_records vector.\n      * (50MiB)\n      */\n    enum { MAX_PENDING_DATA_SIZE = 50*1024*1024 };\n\n    /**\n      * The write_dword_le method is used to write a little endian\n      * double word into the output.\n      *\n      * @param d\n      *     The data to be written.\n      */\n    void write_dword_le(uint32_t d);\n\n    /**\n      * The checksum method is used to calculate the checksum of a given\n      * data block.\n      *\n      * The checksum is additive, so:\n      *  checkum([Block1,Block2]) = checksum(Block1) + checksum(Block2)\n      *\n      * @param data\n      *     The data to be check-summed.\n      * @param len\n      *     The length of the data to be check-summed.\n      */\n    static uint32_t checksum(const unsigned char *data, size_t len);\n\n    /**\n      * The write_file_header method is used to write the file header\n      * (including the magic bytes) into the output.\n      *\n      * @param start\n      *     The least address in the file.\n      * @param length\n      *     The span of addresses in the file.\n      */\n    void write_file_header(uint32_t start, uint32_t length);\n\n    /**\n      * The write_record_header method is used to write a record header\n      * into the output.\n      *\n      * @param addr\n      *     The address of the first by of the record.\n      * @param length\n      *     The number of bytes of data in the record.\n      * @param checksum\n      *     The checksum of the data bytes in the record.\n      */\n    void write_record_header(uint32_t addr, uint32_t length, uint32_t checksum);\n\n    /**\n      * The write_data method is used to write the data contrained in\n      * a record to the output.\n      *\n      * @param r\n      *     The record containing the data to be written to output.\n      */\n    void write_data(const record &r);\n\n    /**\n      * The flush_pending_records method is used to write out all the\n      * data contained in the vector pending_records plus optionally\n      * a record r to the output, forming a single record in the output.\n      * The vector pending_records is cleared.\n      *\n      * @param r\n      *     Optional pointer to a record that should be treated as if\n      *     it's the last element of pending_records vector.\n      */\n    void flush_pending_records(const record *r = NULL);\n\n    /**\n      * The append_pending_record handles addind a new record. If the\n      * new record could form a single continuous record in the output\n      * file and this would fit in the MAX_PENDING_DATA_SIZE limit,\n      * it's appended to the pending_records vector. Otherwise,\n      * pending records are written to the output and depending on the\n      * size of the record to be added, it's either copied to the\n      * pending_records vector, or written directly to the output.\n      *\n      * @param r\n      *     The record to be added.\n      */\n    void append_pending_record(const record &r);\n\n    /**\n      * The start_address_set instance variable is used to remember\n      * whether the #start_address instance variable is valid.\n      *\n      * Becomes true once we encounter a record of type\n      * record::type_execution_start_address.\n      */\n    bool start_address_set;\n\n    /**\n      * The start_address instance variable is used to remember\n      * the execution start address, taken from a record of type\n      * record::type_execution_start_address.\n      */\n    record::address_t start_address;\n\n    /**\n      * The upper_bound instance variable is used to remember the upper\n      * bound address as received via the #notify_upper_bound method.\n      */\n    record::address_t upper_bound;\n\n    /**\n      * The beginning_of_file instance variable is used to remember\n      * that we haven't written the file header yet.\n      */\n    bool beginning_of_file;\n\n    /**\n      * Type holding copies of records.\n      */\n    typedef std::vector<boost::shared_ptr<record> > record_vector;\n\n    /**\n      * The pending_records instance variable is used to keep pending\n      * records before they can be written to the output file.\n      * This is needed to implement the concatenation of adjacent\n      * records.\n      */\n    record_vector pending_records;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_msbin();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_msbin(const output_file_msbin &);\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_msbin &operator=(const output_file_msbin &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_MSBIN_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/needham.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/needham.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_needham::~output_file_needham()\n{\n    if (column)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n}\n\n\nsrecord::output_file_needham::output_file_needham(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(0),\n    column(0),\n    pref_block_size(16),\n    address_length(4)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_needham::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_needham(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_needham::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // ignore\n        if (!enable_optional_address_flag)\n            address = (unsigned long)-1L;\n        break;\n\n    case srecord::record::type_data:\n        if (address != record.get_address())\n        {\n            if (column + 4 > pref_block_size)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            else if (column)\n                put_char(' ');\n            address = record.get_address();\n            int width = 2;\n            if (address >= 0x1000000)\n                width = 4;\n            if (address >= 0x10000)\n                width = 3;\n            if (width < address_length)\n                width = address_length;\n            put_stringf(\"$A%0*lX,\\n\", width * 2, address);\n            column = 0;\n        }\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            if (column)\n                put_char(' ');\n            put_byte(record.get_data(j));\n            ++address;\n            ++column;\n            if (column >= pref_block_size)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_needham::line_length_set(int linlen)\n{\n    int n = (linlen + 1) / 3;\n    if (n < 1)\n        n = 1;\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_needham::address_length_set(int n)\n{\n    if (n < 2)\n        n = 2;\n    if (n > 4)\n        n = 4;\n    address_length = n;\n}\n\n\nbool\nsrecord::output_file_needham::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_needham::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_needham::format_name()\n    const\n{\n    return \"Needham\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/needham.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_NEEDHAM_H\n#define SRECORD_OUTPUT_FILE_NEEDHAM_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_needham class is used to represent\n  */\nclass output_file_needham:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_needham();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_needham(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where in the\n      * file the output has reached.  This is used to fill gaps.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable is used to remember the column of\n      * the output text we have reached.  This is used when calculating\n      * when to throw new lines.\n      */\n    int column;\n\n    /**\n      * The pref_block_size instance variable is used to remember The\n      * preferred line length of the output text.\n      */\n    int pref_block_size;\n\n    /**\n      * The address_length instance variable is used to remember the\n      * minimum number of bytes to use for addresses in the output text.\n      */\n    int address_length;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_needham();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_needham(const output_file_needham &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_needham &operator=(const output_file_needham &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_NEEDHAM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/os65v.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/os65v.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_os65v::~output_file_os65v()\n{\n    //\n    // The OS65 audio tape loader seems to have had two ways of\n    // stopping.  The first is to goto the address given by the 'G'\n    // command.  The second is to poke into the monitor's RAM into the\n    // variable which controls whether or not to keep loading from the\n    // audio tape.  If we have seen (and emitted) a goto address, don't\n    // bother with the poke to stop looping.\n    //\n    if (!(seen_start_address && enable_goto_addr_flag) && enable_footer_flag)\n    {\n        //\n        // Note: we output a newline, even though the original OS65\n        // used CR line termination.  The newline simply triggers the\n        // behaviour controlled by the line_termination class variable.\n        //\n        put_string(\".00FD/00\\n\");\n    }\n}\n\n\nsrecord::output_file_os65v::output_file_os65v(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    address(0),\n    state(0),\n    seen_start_address(false)\n{\n    if (line_termination == line_termination_native)\n    {\n        //\n        // Unless over-ridden on the command line, use CR line\n        // termination.  This probably isn't ideal, but it is backwards\n        // compatible.\n        //\n        line_termination = line_termination_cr;\n    }\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_os65v::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_os65v(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_os65v::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // All header data is discarded\n        break;\n\n    case srecord::record::type_data:\n        if (seen_start_address)\n            fatal_error(\"more data following execution start address (bug)\");\n        if\n        (\n            address != record.get_address()\n        ||\n            (state == 0 && !enable_optional_address_flag)\n        )\n        {\n            address = record.get_address();\n            put_stringf(\".%04lX/\", address);\n            state = '/';\n        }\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            unsigned char n = record.get_data(j);\n            if (address == 0x00FD && n == 0)\n            {\n                // Actually, it's probably a bad idea to write on any of\n                // the OS65 operating system's RAM.\n                fatal_error(\"you may not write 00 to 00FD in this format\");\n            }\n            put_byte(n);\n\n            //\n            // Note: we output a newline, even though the original OS65\n            // used CR line termination.  The newline simply triggers\n            // the behaviour controlled by the line_termination class\n            // variable.\n            //\n            put_char('\\n');\n            ++address;\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            if (address != record.get_address() || state == 0)\n            {\n                address = record.get_address();\n                put_stringf(\".%04lX\", address);\n                state = '.';\n            }\n            put_char('G');\n\n            // The line termination will not be read, but it makes the\n            // automated test script easier to write.\n            put_char('\\n');\n        }\n        seen_start_address = true;\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_os65v::line_length_set(int)\n{\n    // Irrelevant.  Ignore.\n}\n\n\nvoid\nsrecord::output_file_os65v::address_length_set(int)\n{\n    // Irrelevant.  Ignore.\n}\n\n\nbool\nsrecord::output_file_os65v::preferred_block_size_set(int nbytes)\n{\n    return (nbytes == 1);\n}\n\n\nint\nsrecord::output_file_os65v::preferred_block_size_get()\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    //\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_os65v::mode(void)\n    const\n{\n    return \"wb\";\n}\n\n\nconst char *\nsrecord::output_file_os65v::format_name()\n    const\n{\n    return \"OS65V\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/os65v.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_OS65V_H\n#define SRECORD_OUTPUT_FILE_OS65V_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_os65v class is used to represent the file state\n  * of an OS65V output file, in OS65V format.\n  */\nclass output_file_os65v:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_os65v();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_os65v(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation\n    void write(const record &);\n\n    // See base class for documentation\n    void line_length_set(int);\n\n    // See base class for documentation\n    void address_length_set(int);\n\n    // See base class for documentation\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation\n    const char *mode(void) const;\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember the current\n      * file location.\n      */\n    unsigned long address;\n\n    /**\n      * The output mode is either address mode ('.') or data mode ('/').\n      * Initially the file is in an unidentified mode (NUL).\n      */\n    char state;\n\n    /**\n      * The seen_start_address instance variable is used to remember\n      * whether or not an execution start address has been seen.\n      * Normally this is only given at the end of data.  This variable\n      * is used to determine whether to emit thre \"return to monitor\"\n      * sequence, if a \"GO\" command has not been issued.\n      */\n    bool seen_start_address;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_os65v();\n\n    /**\n      * Copy constructor.  Do not use.\n      */\n    output_file_os65v(const output_file_os65v &);\n\n    /**\n      * Assignment operator.  Do not use.\n      */\n    output_file_os65v &operator=(const output_file_os65v &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_OS65V_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ppb.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/output/file/ppb.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_ppb::~output_file_ppb()\n{\n    if (!seen_some_data)\n        fatal_error(\"no data records\");\n    if (buffer_length > 0)\n        buffer_flush();\n    packet(0, 0, 0);\n}\n\n\nsrecord::output_file_ppb::output_file_ppb(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(-1uL),\n    buffer_length(0),\n    seen_some_data(false)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_ppb::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_ppb(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_ppb::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    default:\n        // ignore\n        break;\n\n    case srecord::record::type_header:\n        // ignore\n        break;\n\n    case srecord::record::type_data:\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            unsigned char data = record.get_data(j);\n            unsigned long data_address = record.get_address() + j;\n\n            if (data_address != address)\n            {\n                buffer_flush();\n                address = data_address;\n            }\n            buffer[buffer_length++] = data;\n            ++address;\n            if (buffer_length >= sizeof(buffer))\n                buffer_flush();\n            seen_some_data = true;\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_ppb::line_length_set(int)\n{\n    // Ignore.\n}\n\n\nbool\nsrecord::output_file_ppb::preferred_block_size_set(int nbytes)\n{\n    return (nbytes >= 2 && nbytes <= record::max_data_length);\n}\n\n\nvoid\nsrecord::output_file_ppb::address_length_set(int)\n{\n    // Ignore\n}\n\n\nint\nsrecord::output_file_ppb::preferred_block_size_get(void)\n    const\n{\n    // Use the largest we can get.\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_ppb::format_name(void)\n    const\n{\n    return \"Stag Prom Programmer Binary\";\n}\n\n\nvoid\nsrecord::output_file_ppb::put_bin_4be(unsigned long value)\n{\n    put_char(value >> 24);\n    put_char(value >> 16);\n    put_char(value >> 8);\n    put_char(value);\n}\n\n\nvoid\nsrecord::output_file_ppb::packet(unsigned long address,\n    const unsigned char *data, size_t data_size)\n{\n    enum { SOH = 1 };\n    enum { CSLEN = 1024 };\n\n    put_char(SOH);\n    put_bin_4be(data_size);\n    put_bin_4be(address);\n    unsigned char chksum = 0;\n    for (size_t j = 0; j < data_size; ++j)\n    {\n        if (j > 0 && (j % CSLEN) == 0)\n            put_char(-chksum);\n        put_char(data[j]);\n        chksum += data[j];\n    }\n    put_char(-chksum);\n}\n\n\nvoid\nsrecord::output_file_ppb::buffer_flush(void)\n{\n    if (buffer_length > 0)\n    {\n        packet(address - buffer_length, buffer, buffer_length);\n        buffer_length = 0;\n    }\n}\n\n\nbool\nsrecord::output_file_ppb::is_binary(void)\n    const\n{\n    return true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ppb.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_PPB_H\n#define SRECORD_OUTPUT_FILE_PPB_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord {\n\n/**\n  * The output_file_ppb class is used to represent the processing\n  * required to write a Stag Prom Programmer binary file.\n  */\nclass output_file_ppb:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_ppb();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_ppb(const std::string &file_name);\n\n    /**\n      * The address instance variable is used to remember the address of\n      * the next data byte to be parsed.\n      */\n    unsigned long address;\n\n    /**\n      * The buffer instance variable is used to remember the accumulated\n      * data bytes to be written to the file.\n      */\n    unsigned char buffer[8192];\n\n    /**\n      * The buffer_length instance variable is used to remember how many\n      * bytes are valid in the #buffer array.\n      */\n    unsigned buffer_length;\n\n    /**\n      * The seen_some_data instance variable is used to remember whether\n      * or not any data has been written to the file yet.\n      */\n    bool seen_some_data;\n\n    /**\n      * The buffer_flush method is used to write out the #buffer_length\n      * bytes in the #buffer instance variable.\n      */\n    void buffer_flush(void);\n\n    /**\n      * The packet method is used to write out the #buffer as an\n      * appropriately constructed packet.\n      */\n    void packet(unsigned long address, const unsigned char *data,\n        size_t data_size);\n\n    /**\n      * The put_bin_4be method is used to write out 4 binary bytes of a\n      * 32-bit value, big endian ordering.\n      */\n    void put_bin_4be(unsigned long value);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_ppb();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_ppb(const output_file_ppb &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_ppb &operator=(const output_file_ppb &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_PPB_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ppx.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/output/file/ppx.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_ppx::~output_file_ppx()\n{\n    if (column)\n    {\n        if (column + 7 > line_length)\n        {\n            put_char('\\n');\n            column = 0;\n        }\n        else\n        {\n            put_char(' ');\n            ++column;\n        }\n    }\n    put_string(\"$S\");\n    put_word_be(dsum);\n    put_char('\\n');\n    column = 0;\n}\n\n\nsrecord::output_file_ppx::output_file_ppx(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    started(false),\n    address(0),\n    line_length(80),\n    column(0),\n    dsum(0)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_ppx::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_ppx(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_ppx::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    default:\n        // ignore\n        break;\n\n    case srecord::record::type_header:\n        // ignore\n        break;\n\n    case srecord::record::type_data:\n        if (!started)\n        {\n            put_string(\"*\\n\");\n            started = true;\n            column = 0;\n        }\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            unsigned char data = record.get_data(j);\n            unsigned long data_address = record.get_address() + j;\n\n            if (data_address >= (1uL << 16))\n                data_address_too_large(record, 16);\n\n            if (data_address != address)\n            {\n                if (column)\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n                address = data_address;\n            }\n            if (column)\n            {\n                if (column + 3 > line_length)\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n                else\n                {\n                    put_char(' ');\n                    ++column;\n                }\n            }\n            if (column == 0)\n            {\n                put_word_be(address);\n                put_char(' ');\n                column = 5;\n            }\n            put_byte(data);\n            column += 2;\n            dsum += data;\n            ++address;\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_ppx::line_length_set(int ll)\n{\n    line_length = (ll >= 7 ? ll : 7);\n}\n\n\nbool\nsrecord::output_file_ppx::preferred_block_size_set(int nbytes)\n{\n    return (nbytes >= 2 && nbytes <= record::max_data_length);\n}\n\n\nvoid\nsrecord::output_file_ppx::address_length_set(int)\n{\n    // Ignore\n}\n\n\nint\nsrecord::output_file_ppx::preferred_block_size_get(void)\n    const\n{\n    //\n    // Use the largest we can get,\n    //\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_ppx::format_name(void)\n    const\n{\n    return \"Stag Prom Programmer Hexadecimal\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ppx.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_PPX_H\n#define SRECORD_OUTPUT_FILE_PPX_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord {\n\n/**\n  * The output_file_ppx class is used to represent the processing\n  * required to write a file in PPX or Stag Hex format.\n  */\nclass output_file_ppx:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_ppx();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name(void) const;\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_ppx(const std::string &file_name);\n\n    /**\n      * The started instance variable is used to remember whether or not\n      * we have emitted the start sequence.\n      */\n    bool started;\n\n    /**\n      * The address instance variable is used to remember the address of\n      * the next data byte to be parsed.\n      */\n    unsigned long address;\n\n    /**\n      * The line_length instance variable is used to remember how long\n      * the output lines are to be.\n      */\n    int line_length;\n\n    /**\n      * The column instance variable is used to remember the current\n      * output column.  Used for determining when to start a new line.\n      */\n    int column;\n\n    /**\n      * The dsum instance variable is used to remember the simple sum of\n      * all the data bytes, but not the address bytes.\n      */\n    unsigned short dsum;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_ppx();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_ppx(const output_file_ppx &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_ppx &operator=(const output_file_ppx &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_PPX_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/signetics.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/signetics.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_signetics::~output_file_signetics()\n{\n    put_char(':');\n    put_word_be(last_address);\n    put_byte(0);\n    put_char('\\n');\n}\n\n\nsrecord::output_file_signetics::output_file_signetics(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    pref_block_size(32),\n    last_address(0)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_signetics::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_signetics(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_signetics::checksum_add(unsigned char n)\n{\n    checksum ^= n;\n    checksum = (checksum << 1) | ((checksum >> 7) & 1);\n}\n\n\nvoid\nsrecord::output_file_signetics::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        if (!record.address_range_fits_into_n_bits(16))\n            data_address_too_large(record, 16);\n        put_char(':');\n        checksum_reset();\n        put_word_be(record.get_address());\n        put_byte(record.get_length());\n        put_byte(checksum_get());\n        checksum_reset();\n        for (size_t j = 0; j < record.get_length(); ++j)\n            put_byte(record.get_data(j));\n        put_byte(checksum_get());\n        put_char('\\n');\n        last_address = record.get_address() + record.get_length();\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // This format can't do execution start address records\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_signetics::line_length_set(int linlen)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    //\n    int             n = (linlen - 11) / 2;\n\n    //\n    // Constrain based on the file format.\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 255)\n        n = 255;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_signetics::address_length_set(int)\n{\n    // ignore (this is only a 16-bit format)\n}\n\n\nbool\nsrecord::output_file_signetics::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes > 255)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_signetics::preferred_block_size_get() const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_signetics::format_name()\n    const\n{\n    return \"Signetics\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/signetics.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_SIGNETICS_H\n#define SRECORD_OUTPUT_FILE_SIGNETICS_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\nclass record; // forward\n\n/**\n  * The srecord::output_file_signetics class is used to represent output to\n  * a file using the Signetiocs format.\n  */\nclass output_file_signetics:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_signetics();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_signetics(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    /**\n      * See base class for documentation.  We over-ride the base\n      * implementation because signetics uses its own XOR-ROL algorithm.\n      */\n    void checksum_add(unsigned char);\n\nprivate:\n    /**\n      * The pref_block_size is used to remember the preferred block\n      * size.  Set by the line_length_set() method.  Read by the\n      * preferred_block_size_get() method.\n      */\n    int pref_block_size;\n\n    /**\n      * The last_address instance variable is used to remember the\n      * address immediatly beyond the last adress of data in the file.\n      * This is used to write the file termination record.\n      */\n    unsigned long last_address;\n\n    /**\n      * The write_inner method is used to write one line/record to the\n      * output.  It is called by the write() method.\n      */\n    void write_inner(int, unsigned long, int, const void *, int);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_signetics();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_signetics(const output_file_signetics &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_signetics &operator=(const output_file_signetics &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_SIGNETICS_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/spasm.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/spasm.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_spasm::~output_file_spasm()\n{\n}\n\n\nsrecord::output_file_spasm::output_file_spasm(\n    const std::string &a_file_name,\n    endian_t a_end\n) :\n    srecord::output_file(a_file_name),\n    end(a_end)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_spasm::create(const std::string &a_file_name,\n    endian_t a_end)\n{\n    return pointer(new srecord::output_file_spasm(a_file_name, a_end));\n}\n\n\nvoid\nsrecord::output_file_spasm::write(const srecord::record &record)\n{\n    // This format can't do header records or termination records\n    if (record.get_type() != srecord::record::type_data)\n        return;\n\n    if (!record.address_range_fits_into_n_bits(17))\n        data_address_too_large(record, 17);\n\n    srecord::record::address_t address = record.get_address();\n    if ((address & 1) || (record.get_length() & 1))\n        fatal_alignment_error(2);\n\n    for (size_t j = 0; j < record.get_length(); j += 2)\n    {\n        put_word_be(address / 2);\n        put_char(' ');\n        if (end == endian_big)\n        {\n            put_byte(record.get_data(j + 1));\n            put_byte(record.get_data(j));\n        }\n        else\n        {\n            put_byte(record.get_data(j));\n            put_byte(record.get_data(j + 1));\n        }\n        put_char('\\n');\n        address += 2;\n    }\n}\n\n\nvoid\nsrecord::output_file_spasm::line_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nvoid\nsrecord::output_file_spasm::address_length_set(int)\n{\n    //\n    // Irrelevant.  Ignore.\n    //\n}\n\n\nbool\nsrecord::output_file_spasm::preferred_block_size_set(int nbytes)\n{\n    return (nbytes == 2);\n}\n\n\nint\nsrecord::output_file_spasm::preferred_block_size_get()\n    const\n{\n    //\n    // Irrelevant.  Use the largest we can get.\n    // But make sure it is an even number of bytes long.\n    //\n    return (srecord::record::max_data_length & ~1);\n}\n\n\nconst char *\nsrecord::output_file_spasm::format_name()\n    const\n{\n    return \"Spasm\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/spasm.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_SPASM_H\n#define SRECORD_OUTPUT_FILE_SPASM_H\n\n#include <srecord/endian.h>\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_spasm class is used to represent an output\n  * files in SPASM format.\n  */\nclass output_file_spasm:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_spasm();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      * @param end\n      *     The byte order of the file\n      */\n    output_file_spasm(const std::string &file_name, endian_t end);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      * @param end\n      *     The byte order of the file\n      */\n    static pointer create(const std::string &file_name,\n        endian_t end = endian_big);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The end instance variable is used to remember the byte order of\n      * the file.\n      */\n    endian_t end;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_spasm();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_spasm(const output_file_spasm &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_spasm &operator=(const output_file_spasm &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_SPASM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/spectrum.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/spectrum.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_spectrum::~output_file_spectrum()\n{\n    if (enable_footer_flag)\n        put_char(3);\n}\n\n\nsrecord::output_file_spectrum::output_file_spectrum(\n    const std::string &a_filename\n) :\n    srecord::output_file(a_filename)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_spectrum::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_spectrum(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_spectrum::put_decimal(unsigned long n)\n{\n    put_stringf(\"%4.4lu\", n);\n}\n\n\nvoid\nsrecord::output_file_spectrum::put_binary(unsigned char n)\n{\n    for (unsigned char bit = 0x80; bit; bit >>= 1)\n    {\n        put_char((n & bit) ? '1' : '0');\n    }\n}\n\n\nvoid\nsrecord::output_file_spectrum::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        if (enable_header_flag)\n            put_char(2);\n        break;\n\n    case srecord::record::type_data:\n        {\n            unsigned long address = record.get_address();\n            int length = record.get_length();\n            for (int j = 0; j < length; ++j)\n            {\n                put_decimal(address + j);\n                put_char(' ');\n                put_binary(record.get_data(j));\n                put_char('\\n');\n            }\n        }\n        break;\n\n    case srecord::record::type_execution_start_address:\n    case srecord::record::type_unknown:\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_spectrum::line_length_set(int)\n{\n    // ignore\n}\n\n\nvoid\nsrecord::output_file_spectrum::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_spectrum::preferred_block_size_set(int nbytes)\n{\n    return (nbytes == 1);\n}\n\n\nint\nsrecord::output_file_spectrum::preferred_block_size_get()\n    const\n{\n    return srecord::record::max_data_length;\n}\n\n\nconst char *\nsrecord::output_file_spectrum::format_name()\n    const\n{\n    return \"Spectrum\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/spectrum.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_SPECTRUM_H\n#define SRECORD_OUTPUT_FILE_SPECTRUM_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_spectrum class is used to represent the running\n  * state when writing a file in Spectrum format.\n  */\nclass output_file_spectrum:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_spectrum();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_spectrum(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The put_decimal method is used to write the decimal address to\n      * the output, as a decimal (base 10) number.  It will have at\n      * least four digits.\n      */\n    void put_decimal(unsigned long);\n\n    /**\n      * The put_binary method is used to write the binary data to the\n      * output, as a binary (base 2) number.  It will have exactly\n      * eight digits.\n      */\n    void put_binary(unsigned char);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_spectrum();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_spectrum(const output_file_spectrum &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_spectrum &operator=(const output_file_spectrum &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_SPECTRUM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/stewie.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010, 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/output/file/stewie.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_stewie::~output_file_stewie()\n{\n    if (enable_footer_flag)\n    {\n        //\n        // Even though struct Motorola compatibility would seem to\n        // indicate the S7, S8 or S9 could terminate the file, only\n        // S8 seems to work.\n        //\n        write_inner(8, 0, 0, 0, 0);\n    }\n}\n\n\nsrecord::output_file_stewie::output_file_stewie(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    data_count(0),\n    address_length(2),\n    preferred_block_size(128)\n{\n    if (line_termination == line_termination_native)\n        line_termination = line_termination_binary;\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_stewie::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_stewie(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_stewie::put_byte(unsigned char n)\n{\n    put_char(n);\n    checksum_add(n);\n}\n\n\nvoid\nsrecord::output_file_stewie::write_inner(int tag, unsigned long address,\n    int address_nbytes, const void *data, int data_nbytes)\n{\n    //\n    // Make sure the record is not too long.\n    //\n    if (address_nbytes + data_nbytes > 254)\n    {\n        fatal_error\n        (\n            \"data length (%d + %d > 254) too long\",\n            address_nbytes,\n            data_nbytes\n        );\n    }\n\n    //\n    // Assemble the data for this record.\n    //\n    unsigned char buffer[256];\n    int line_length = address_nbytes + data_nbytes + 1;\n    buffer[0] = line_length;\n    srecord::record::encode_big_endian(buffer + 1, address, address_nbytes);\n    if (data_nbytes)\n        memcpy(buffer + 1 + address_nbytes, data, data_nbytes);\n\n    //\n    // Emit the record as binary data.\n    //\n    put_char('S');\n    put_nibble(tag);\n    switch (tag)\n    {\n    case 0:\n        put_char('0');\n        put_char('3');\n        break;\n\n    case 7:\n    case 8:\n    case 9:\n        break;\n\n    default:\n        checksum_reset();\n        for (int j = 0; j < line_length; ++j)\n            put_byte(buffer[j]);\n        put_byte(~checksum_get());\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_stewie::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        if (enable_header_flag)\n        {\n            //\n            // Even though it starts with S0, the header record has a\n            // fixed format, so we don't bother passing it any data.\n            //\n            write_inner(0, 0, 0, 0, 0);\n        }\n        break;\n\n    case srecord::record::type_data:\n        if\n        (\n            record.get_address() < (1UL << 16)\n        &&\n            address_length <= 2\n        )\n        {\n            write_inner\n            (\n                1,\n                record.get_address(),\n                2,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        else if\n        (\n            record.get_address() < (1UL << 24)\n        &&\n            address_length <= 3\n        )\n        {\n            write_inner\n            (\n                2,\n                record.get_address(),\n                3,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        else\n        {\n            write_inner\n            (\n                3,\n                record.get_address(),\n                4,\n                record.get_data(),\n                record.get_length()\n            );\n        }\n        ++data_count;\n        break;\n\n    case srecord::record::type_data_count:\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_stewie::line_length_set(int n)\n{\n    if (n < 1)\n        n = 1;\n    else if (n > 250)\n        n = 250;\n    preferred_block_size = n;\n}\n\n\nbool\nsrecord::output_file_stewie::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes > 250)\n        return false;\n    preferred_block_size = nbytes;\n    return true;\n}\n\n\nvoid\nsrecord::output_file_stewie::address_length_set(int n)\n{\n    if (n < 2)\n        n = 2;\n    else if (n > 4)\n        n = 4;\n    address_length = n;\n}\n\n\nint\nsrecord::output_file_stewie::preferred_block_size_get()\n    const\n{\n    return preferred_block_size;\n}\n\n\nconst char *\nsrecord::output_file_stewie::format_name()\n    const\n{\n    return \"Stewie\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/stewie.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_STEWIE_H\n#define SRECORD_OUTPUT_FILE_STEWIE_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_stewie class is used to represent the current\n  * state of an output file in an undocumented binary format loosely\n  * based on the Motorola format.\n  */\nclass output_file_stewie:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_stewie();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_stewie(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void put_byte(unsigned char);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The data_count instance variable is used to remember how many\n      * data records have occurred so far in the output file.\n      */\n    unsigned long data_count;\n\n    /**\n      * The address_length instance variable is used to remember the\n      * minimum number of bytes to use for addresses.\n      */\n    int address_length;\n\n    /**\n      * The preferred_block_size instance variable is used to remember\n      * the prefrred block size for records.\n      */\n    int preferred_block_size;\n\n    /**\n      * Write a data record.\n      */\n    void write_inner(int, unsigned long, int, const void *, int);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_stewie();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_stewie(const output_file_stewie &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_stewie &operator=(const output_file_stewie &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_STEWIE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/tektronix.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/tektronix.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_tektronix::~output_file_tektronix()\n{\n    // make sure terminator is written\n}\n\n\nsrecord::output_file_tektronix::output_file_tektronix(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    pref_block_size(32)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_tektronix::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_tektronix(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_tektronix::put_nibble(int n)\n{\n    srecord::output_file::put_nibble(n);\n    checksum_add(n & 15);\n}\n\n\nvoid\nsrecord::output_file_tektronix::put_byte(unsigned char n)\n{\n    // This differs from srecord::output_file::put_byte only in that it\n    // doesn't add to the checksum.\n    put_nibble(n >> 4);\n    put_nibble(n);\n}\n\n\nvoid\nsrecord::output_file_tektronix::write_inner(unsigned long address,\n    const void *data, int data_nbytes)\n{\n    //\n    // Make sure the line is not too long.\n    //\n    if (data_nbytes >= 256)\n        fatal_error(\"data length (%d > 255) too long\", data_nbytes);\n\n    //\n    // Emit the line as hexadecimal text.\n    //\n    put_char('/');\n    unsigned char tmp[2];\n    srecord::record::encode_big_endian(tmp, address, 2);\n    checksum_reset();\n    put_byte(tmp[0]);\n    put_byte(tmp[1]);\n    put_byte(data_nbytes);\n    put_byte(checksum_get());\n    if (data_nbytes)\n    {\n        checksum_reset();\n        const unsigned char *data_p = (const unsigned char *)data;\n        for (int j = 0; j < data_nbytes; ++j)\n            put_byte(data_p[j]);\n        put_byte(checksum_get());\n    }\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_tektronix::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header reocrds\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() == 0)\n                break; // ignore\n        if (!record.address_range_fits_into_n_bits(16))\n            data_address_too_large(record, 16);\n        write_inner\n        (\n            record.get_address(),\n            record.get_data(),\n            record.get_length()\n        );\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            if (record.get_address() >= (1UL << 16))\n            {\n                unsigned long addr = record.get_address();\n                fatal_error\n                (\n                    \"execution start address (0x%08lX > 0xFFFF) too large\",\n                    addr\n                );\n            }\n            write_inner(record.get_address(), 0, 0);\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_tektronix::line_length_set(int n)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    //\n    n = (n - 11) / 2;\n\n    //\n    // Constrain based on the file format.\n    // (255 is the largest that will fit in the data length field)\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 255)\n        n = 255;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_tektronix::address_length_set(int)\n{\n    // ignore (this is a 16-bit format)\n}\n\n\nbool\nsrecord::output_file_tektronix::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes > 255)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_tektronix::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_tektronix::format_name()\n    const\n{\n    return \"Tektronix\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/tektronix.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_TEKTRONIX_H\n#define SRECORD_OUTPUT_FILE_TEKTRONIX_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_tektronix class is used to represent an output\n  * file which is in Tektronix format.\n  */\nclass output_file_tektronix:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_tektronix();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_tektronix(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void put_nibble(int);\n\n    // See base class for documentation.\n    void put_byte(unsigned char);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * preferred number of data bytes (NOT encoded hex characters) to\n      * be placed in each output line.\n      */\n    int pref_block_size;\n\n    /**\n      * The write_inner method is used to write a line of output.\n      *\n      * @param address\n      *     The address of the first byte of data on the line.\n      * @param data\n      *     The palyload of this line.\n      * @param data_nbytes\n      *     The number of bytes of payload.\n      */\n    void write_inner(unsigned long address, const void *data, int data_nbytes);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_tektronix();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_tektronix(const output_file_tektronix &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_tektronix &operator=(const output_file_tektronix &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_TEKTRONIX_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/tektronix_extended.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2008, 2010, 2012, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/tektronix_extended.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_tektronix_extended::~output_file_tektronix_extended()\n{\n    // check for termination record\n}\n\n\nsrecord::output_file_tektronix_extended::output_file_tektronix_extended(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    pref_block_size(32),\n    address_length(4)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_tektronix_extended::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_tektronix_extended(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_tektronix_extended::write_inner(int tag,\n    unsigned long addr, int addr_nbytes, const void *data_p, int data_nbytes)\n{\n    if (addr_nbytes < address_length)\n        addr_nbytes = address_length;\n    unsigned char buf[260];\n    int record_length = 6 + (addr_nbytes + data_nbytes) * 2;\n    if (record_length >= 256)\n    {\n        fatal_error\n        (\n            \"record too long (%d > 255, dmax=%d)\",\n            record_length,\n            (125 - 2 * addr_nbytes)/2\n        );\n    }\n    int csum = 0;\n    int pos = 0;\n    csum += buf[pos++] = 0; // lengh hi, fill in later\n    csum += buf[pos++] = 0; // lengh lo, fill in later\n    csum += buf[pos++] = tag;\n    csum += buf[pos++] = 0; // checksum hi, fill in later\n    csum += buf[pos++] = 0; // checksum lo, fill in later\n    csum += buf[pos++] = addr_nbytes * 2;  // size of addr, in nybbles\n    int j;\n    for (j = 0; j < 2 * addr_nbytes; ++j)\n        csum += buf[pos++] = (addr >> (4 * (2*addr_nbytes-1 - j))) & 15;\n    const unsigned char *data = (const unsigned char *)data_p;\n    for (j = 0; j < data_nbytes; ++j)\n    {\n        csum += buf[pos++] = (data[j] >> 4) & 15;\n        csum += buf[pos++] =  data[j]       & 15;\n    }\n\n    // now insert the record length\n    csum += buf[0] = (pos >> 4) & 15;\n    csum += buf[1] =  pos       & 15;\n\n    // now insert the checksum...\n    buf[3] = (csum >> 4) & 15;\n    buf[4] =  csum       & 15;\n\n    // emit the line\n    put_char('%');\n    for (j = 0; j < pos; ++j)\n        put_nibble(buf[j]);\n    put_char('\\n');\n}\n\n\nstatic int\naddr_width(unsigned long n)\n{\n    if (n < (1uL << 16))\n        return 2;\n    if (n < (1uL << 24))\n        return 3;\n    return 4;\n}\n\n\nvoid\nsrecord::output_file_tektronix_extended::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header records\n        break;\n\n    case srecord::record::type_data:\n        write_inner\n        (\n            6,\n            record.get_address(),\n            addr_width(record.get_address()),\n            record.get_data(),\n            record.get_length()\n        );\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            write_inner\n            (\n                8,\n                record.get_address(),\n                addr_width(record.get_address()),\n                0,\n                0\n            );\n        }\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_tektronix_extended::line_length_set(int linlen)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    //\n    int n = (linlen - 15) / 2;\n\n    //\n    // Constrain based on the file format.\n    //\n    // The size field (max 255 nibbles) includes the size of the\n    // data and the size of the address (up to 9 nibbles).  Thus 123\n    // ((255 - 9)/2) bytes of data is the safest maximum.  We could\n    // make it based on the address, but that's probably overkill.\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 123)\n        n = 123;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_tektronix_extended::address_length_set(int n)\n{\n    if (n < 2)\n        n = 2;\n    if (n > 4)\n        n = 4;\n    address_length = n;\n}\n\n\nbool\nsrecord::output_file_tektronix_extended::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes > 123)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_tektronix_extended::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_tektronix_extended::format_name()\n    const\n{\n    return \"Tektronix-Extended\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/tektronix_extended.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_TEKTRONIX_EXTENDED_H\n#define SRECORD_OUTPUT_FILE_TEKTRONIX_EXTENDED_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_tektronix_extended class is used to represent\n  * an output file which is in Tektronix Extended format.\n  */\nclass output_file_tektronix_extended:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_tektronix_extended();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_tektronix_extended(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * preferred number of data bytes (NOT encoded hex characters) to\n      * be placed in each output line.\n      */\n    int pref_block_size;\n\n    /**\n      * The address_length instance variable is used to remember the\n      * minimum number of address bytes to be emitted into output lines.\n      */\n    int address_length;\n\n    /**\n      * The write_inner method is used to write a line of output.\n      *\n      * @param tag\n      *     The tag value at the start of the line.\n      * @param address\n      *     The address of the first byte of data on the line.\n      * @param address_nbytes\n      *     The number of bytes of address to emit.\n      * @param data\n      *     The palyload of this line.\n      * @param data_nbytes\n      *     The number of bytes of payload.\n      */\n    void write_inner(int tag, unsigned long address, int address_nbytes,\n        const void *data, int data_nbytes);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_tektronix_extended();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_tektronix_extended(const output_file_tektronix_extended &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_tektronix_extended &operator=(\n        const output_file_tektronix_extended &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_TEKTRONIX_EXTENDED_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ti_tagged.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/ti_tagged.h>\n#include <srecord/record.h>\n\n#include <cctype>\n\n\nsrecord::output_file_ti_tagged::~output_file_ti_tagged()\n{\n    if (column)\n        put_eoln();\n    if (enable_footer_flag)\n    {\n        put_char(':');\n        put_char('\\n');\n    }\n}\n\n\nsrecord::output_file_ti_tagged::output_file_ti_tagged(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(0),\n    column(0),\n    line_length(74),\n    csum(0)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_ti_tagged::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_ti_tagged(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_ti_tagged::put_char(int c)\n{\n    if (c == '\\n')\n    {\n        csum = 0;\n        column = 0;\n    }\n    else\n    {\n        csum += (unsigned char)c;\n        ++column;\n    }\n    inherited::put_char(c);\n}\n\nvoid\nsrecord::output_file_ti_tagged::put_eoln()\n{\n    put_char('7');\n    put_word_be(-csum);\n    put_char('F');\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_ti_tagged::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        if (enable_header_flag)\n        {\n            put_stringf(\"K%4.4X\", (unsigned)(5 + record.get_length()));\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (!isprint(c))\n                    c = ' ';\n                put_char(c);\n            }\n        }\n        if (!enable_optional_address_flag)\n            address = (unsigned long)-1;\n        break;\n\n    case srecord::record::type_data:\n        {\n            if (!record.address_range_fits_into_n_bits(16))\n                data_address_too_large(record, 16);\n            assert(record.get_length() > 0);\n            if (record.get_length() == 0)\n                break;\n            if (address != record.get_address())\n            {\n                address = record.get_address();\n                if (column + 5 > line_length)\n                    put_eoln();\n                put_char('9');\n                put_word_be(address);\n            }\n            size_t pos = 0;\n            for (; pos + 2 <= record.get_length(); pos += 2)\n            {\n                if (column + 5 > line_length)\n                    put_eoln();\n                put_char('B');\n                put_byte(record.get_data(pos));\n                put_byte(record.get_data(pos + 1));\n                address += 2;\n            }\n            for (; pos < record.get_length(); ++pos)\n            {\n                if (column + 3 > line_length)\n                    put_eoln();\n                put_char('*');\n                put_byte(record.get_data(pos));\n                ++address;\n            }\n        }\n        break;\n\n    case srecord::record::type_data_count:\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_ti_tagged::line_length_set(int linlen)\n{\n    // reduce the line length by 6 characters, to account for the\n    // checksum, so we don't keep subtracting it later.\n    line_length = linlen - 6;\n\n    // make sure the line is long enough to do anything useful\n    if (line_length < 5)\n        line_length = 5;\n}\n\n\nvoid\nsrecord::output_file_ti_tagged::address_length_set(int)\n{\n    // ignore (this is a 16-bit format)\n}\n\n\nbool\nsrecord::output_file_ti_tagged::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 2 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes & 1)\n        return false;\n    line_length = (nbytes / 2) * 5;\n    return true;\n}\n\n\nint\nsrecord::output_file_ti_tagged::preferred_block_size_get()\n    const\n{\n    int n = (line_length / 5) * 2;\n    if (n < 1)\n        n = 1;\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    return n;\n}\n\n\nconst char *\nsrecord::output_file_ti_tagged::format_name()\n    const\n{\n    return \"TI-Tagged\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ti_tagged.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_TI_TAGGED_H\n#define SRECORD_OUTPUT_FILE_TI_TAGGED_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_ti_tagged class is used to represent the output\n  * state of a file in Texas Instruments Tagged format.\n  */\nclass output_file_ti_tagged:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_ti_tagged();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_ti_tagged(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void put_char(int);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    typedef output_file inherited;\n\n    /**\n      * The address instance variable is used to remember the current\n      * address within the output file.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable is used to remember the current\n      * text column within the output file.  This is so that we can\n      * decide when to throw a new line.\n      */\n    int column;\n\n    /**\n      * The line_length instance variable is used to remember the maximum\n      * permitted text line length.  This is so that we can decide when\n      * to throw a new line.\n      */\n    int line_length;\n\n    /**\n      * The csum instance variable is used to remember the 16-bit running\n      * total of the bytes emitted so far.  It gets reset by put_eoln.\n      */\n    int csum;\n\n    /**\n      * The put_eoln method is used to output the line termination,\n      * which includes a checksum.\n      */\n    void put_eoln();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_ti_tagged();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_ti_tagged(const output_file_ti_tagged &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_ti_tagged &operator=(const output_file_ti_tagged &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_TI_TAGGED_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ti_tagged_16.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2007-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/ti_tagged_16.h>\n#include <srecord/record.h>\n\n#include <cctype>\n\n\nsrecord::output_file_ti_tagged_16::~output_file_ti_tagged_16()\n{\n    if (column)\n        put_eoln();\n    if (enable_footer_flag)\n    {\n        put_char(':');\n        put_char('\\n');\n    }\n}\n\n\nsrecord::output_file_ti_tagged_16::output_file_ti_tagged_16(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(0),\n    column(0),\n    line_length(74),\n    csum(0)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_ti_tagged_16::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_ti_tagged_16(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_ti_tagged_16::put_char(int c)\n{\n    if (c == '\\n')\n    {\n        csum = 0;\n        column = 0;\n    }\n    else\n    {\n        csum += (unsigned char)c;\n        ++column;\n    }\n    inherited::put_char(c);\n}\n\n\nvoid\nsrecord::output_file_ti_tagged_16::put_eoln()\n{\n    put_char('7');\n    put_word_be(-csum);\n    put_char('F');\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_ti_tagged_16::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        if (enable_header_flag)\n        {\n            put_stringf(\"K%4.4X\", (int)(5 + record.get_length()));\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (!isprint(c))\n                    c = ' ';\n                put_char(c);\n            }\n        }\n        if (!enable_optional_address_flag)\n            address = (unsigned long)-1L;\n        break;\n\n    case srecord::record::type_data:\n        {\n            if (!record.address_range_fits_into_n_bits(17))\n                data_address_too_large(record, 17);\n\n            //\n            // we can't start at an odd address,\n            // but don't test for odd lengths\n            //\n            if (record.get_address() & 1)\n                fatal_alignment_error(2);\n\n            // assert(record.get_length() > 0);\n            if (record.get_length() == 0)\n                break;\n            if (address != record.get_address())\n            {\n                address = record.get_address();\n                if (column + 5 > line_length)\n                    put_eoln();\n                put_char('9');\n                put_word_be(address >> 1);\n            }\n            size_t pos = 0;\n            for (; pos + 2 <= record.get_length(); pos += 2)\n            {\n                if (column + 5 > line_length)\n                    put_eoln();\n                put_char('B');\n                put_byte(record.get_data(pos));\n                put_byte(record.get_data(pos + 1));\n                address += 2;\n            }\n            for (; pos < record.get_length(); ++pos)\n            {\n                if (column + 3 > line_length)\n                    put_eoln();\n                put_char('*');\n                put_byte(record.get_data(pos));\n                ++address;\n            }\n        }\n        break;\n\n    case srecord::record::type_data_count:\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_ti_tagged_16::line_length_set(int linlen)\n{\n    // reduce the line length by 6 characters, to account for the\n    // checksum, so we don't keep subtracting it later.\n    line_length = linlen - 6;\n\n    // make sure the line is long enough to do anything useful\n    if (line_length < 5)\n        line_length = 5;\n}\n\n\nvoid\nsrecord::output_file_ti_tagged_16::address_length_set(int)\n{\n    // ignore (addresses are always 16 bits)\n}\n\n\nbool\nsrecord::output_file_ti_tagged_16::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 2 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes & 1)\n        return false;\n    line_length = 5 * (nbytes / 2);\n    return true;\n}\n\n\nint\nsrecord::output_file_ti_tagged_16::preferred_block_size_get()\n    const\n{\n    int n = (line_length / 5) * 2;\n    if (n < 2)\n        n = 2;\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    return (n & ~1);\n}\n\n\nconst char *\nsrecord::output_file_ti_tagged_16::format_name()\n    const\n{\n    return \"TI-Tagged-16\";\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ti_tagged_16.h",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_TI_TAGGED_16_H\n#define SRECORD_OUTPUT_FILE_TI_TAGGED_16_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_ti_tagged_16 class is used to represent the\n  * output state of a file in Texas Instruments SDSMAC (320) format.\n  */\nclass output_file_ti_tagged_16:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_ti_tagged_16();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_ti_tagged_16(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void put_char(int);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    typedef output_file inherited;\n\n    /**\n      * The address instance variable is used to remember the current\n      * address within the output file.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable is used to remember the current\n      * text column within the output file.  This is so that we can\n      * decide when to throw a new line.\n      */\n    int column;\n\n    /**\n      * The line_length instance variable is used to remember the maximum\n      * permitted text line length.  This is so that we can decide when\n      * to throw a new line.\n      */\n    int line_length;\n\n    /**\n      * The csum instance variable is used to remember the 16-bit running\n      * total of the bytes emitted so far.  It gets reset by put_eoln.\n      */\n    int csum;\n\n    /**\n      * The put_eoln method is used to output the line termination,\n      * which includes a checksum.\n      */\n    void put_eoln();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_ti_tagged_16();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_ti_tagged_16(const output_file_ti_tagged_16 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_ti_tagged_16 &operator=(const output_file_ti_tagged_16 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_TI_TAGGED_16_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ti_txt.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2007-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/ti_txt.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_ti_txt::~output_file_ti_txt()\n{\n    if (column > 0)\n        put_char('\\n');\n    put_stringf(\"q\\n\");\n    column = 0;\n}\n\n\nsrecord::output_file_ti_txt::output_file_ti_txt(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    address(),\n    address_set(false),\n    address_length(2),\n    pref_block_size(16),\n    column(0),\n    line_length(pref_block_size * 3 - 1)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_ti_txt::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_ti_txt(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_ti_txt::put_byte_wrap(unsigned char c)\n{\n    if (column && column + 3 > line_length)\n    {\n        put_char('\\n');\n        column = 0;\n    }\n    if (column)\n    {\n        put_char(' ');\n        ++column;\n    }\n    put_byte(c);\n    ++address;\n    column += 2;\n}\n\n\nvoid\nsrecord::output_file_ti_txt::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // All header data is discarded\n        if (enable_optional_address_flag)\n            address_set = true;\n        break;\n\n    case srecord::record::type_data:\n        if (!address_set || address != record.get_address())\n        {\n            if (column > 0)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n\n            address = record.get_address();\n            address_set = true;\n\n            int width = 2;\n            if (address >= 0x1000000)\n                width = 4;\n            if (address >= 0x10000)\n                width = 3;\n            if (width < address_length)\n                width = address_length;\n            width *= 2;\n            put_stringf(\"@%0*lX\\n\", width, address);\n        }\n        for (size_t j = 0; j < record.get_length(); ++j)\n        {\n            put_byte_wrap(record.get_data(j));\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_ti_txt::line_length_set(int linlen)\n{\n    int n = (linlen + 1) / 3;\n    if (n < 1)\n        n = 1;\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n    line_length = pref_block_size * 3 - 1;\n}\n\n\nvoid\nsrecord::output_file_ti_txt::address_length_set(int n)\n{\n    if (n < 2)\n        n = 2;\n    if (n > 4)\n        n = 4;\n    address_length = n;\n}\n\n\nbool\nsrecord::output_file_ti_txt::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    pref_block_size = nbytes;\n    line_length = pref_block_size * 3 - 1;\n    return true;\n}\n\n\nint\nsrecord::output_file_ti_txt::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_ti_txt::format_name()\n    const\n{\n    return \"TI-Txt\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/ti_txt.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2007, 2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_ti_txt_H\n#define SRECORD_OUTPUT_FILE_ti_txt_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_ti_txt class is used to write a file in\n  * ti_txt (MSP430) format.\n  */\nclass output_file_ti_txt:\n    public output_file\n{\npublic:\n    /**\n      * The destrutcor.\n      */\n    virtual ~output_file_ti_txt();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_ti_txt(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The address instance variable is used to remember where we\n      * are up to in the output.  Used to limit the number of @ lines\n      * emitted.\n      */\n    unsigned long address;\n\n    /**\n      * The address_set instance variable is used to remember whether or\n      * not we have emitted the first address line.  The first address,\n      * even if it is zero, is not optional.\n      */\n    bool address_set;\n\n    /**\n      * The address_length instance variable is used to remember how\n      * many bytes of address to emit.  Range: 2 to 4.  Default: 2.\n      */\n    int address_length;\n\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * number of bytes in the preferred block size.\n      *\n      * The format definition says it must be exactly 16.  We will allow\n      * some leeway.\n      */\n    int pref_block_size;\n\n    /**\n      * The column instance variable is used to remember which column\n      * we are up to in the output.  Used to limit the length of lines\n      * in the output.\n      */\n    int column;\n\n    /**\n      * The line_length instance variable is used to remember how many\n      * columns wide the line is allowed to be.\n      *\n      * The format defintion says exactly 16 bytes per line (implying a\n      * line length 47 characters).  We will allow some leeway.\n      */\n    int line_length;\n\n    /**\n      * The put_byte_wrap method is used to write all data bytes to\n      * the file.  It calls the put_byte method to do all the work,\n      * but first it checks to see if this byte will fit on the line,\n      * considering the line_length and throwing a newline if necessary.\n      * The address is advanced by one.  The column is adjusted, too.\n      */\n    void put_byte_wrap(unsigned char c);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_ti_txt();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_ti_txt(const output_file_ti_txt &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_ti_txt &operator=(const output_file_ti_txt &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_ti_txt_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/trs80.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// Code contribution by Eric Smith <eric@brouhaha.com>\n// Copyright assigned to Peter Miller 15-Mar-2012.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/file/trs80.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_trs80::~output_file_trs80()\n{\n    if (!termination_seen)\n    {\n        put_byte(0x03);  // record type - END w/o transfer\n        put_byte(0x02);  // length\n        put_word_le(0x0000);\n    }\n}\n\n\nsrecord::output_file_trs80::output_file_trs80(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    termination_seen(false),\n    pref_block_size(253)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_trs80::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_trs80(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_trs80::put_byte(unsigned char n)\n{\n    put_char(n);\n    ++byte_offset;\n}\n\n\nvoid\nsrecord::output_file_trs80::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format can't do header record,\n        // but we will borrow the comment type.\n        {\n            size_t len = record.get_length();\n            if (len > 0)\n            {\n                if (len > 255)\n                    len = 255;\n                put_byte(0x05);\n                put_byte(len);\n                for (size_t j = 0; j < len; ++j)\n                    put_byte(record.get_data(j));\n            }\n        }\n        break;\n\n    case srecord::record::type_data:\n        if (record.get_length() < 1)\n            return;\n        if (!record.address_range_fits_into_n_bits(16))\n            data_address_too_large(record, 16);\n\n        //\n        // Write the data out.\n        //\n        put_byte(0x01);\n        put_byte((record.get_length() + 2) & 0xFF);\n        put_word_le(record.get_address());\n        for (size_t j = 0; j < record.get_length(); ++j)\n            put_byte(record.get_data(j));\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n        {\n            put_byte(0x02);  // record type - END w/ transfer\n            put_byte(0x02);  // length\n            put_word_le(record.get_address());\n        }\n        termination_seen = true;\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_trs80::line_length_set(int)\n{\n    // Ignore.\n}\n\n\nvoid\nsrecord::output_file_trs80::address_length_set(int)\n{\n    // Ignore (this is only a 16-bit format).\n}\n\n\nbool\nsrecord::output_file_trs80::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > 256)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_trs80::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_trs80::format_name()\n    const\n{\n    return \"TRS80\";\n}\n\n\nbool\nsrecord::output_file_trs80::is_binary(void)\n    const\n{\n    return true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/trs80.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// Code contribution by Eric Smith <eric@brouhaha.com>\n// Copyright assigned to Peter Miller 15-Mar-2012.\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_TRS80_H\n#define SRECORD_OUTPUT_FILE_TRS80_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_trs80 class is used to write a TRS-80 binary\n  * file.\n  */\nclass output_file_trs80:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_trs80();\n\nprivate:\n    /**\n      * A constructor.  The input will be read from the named file (or\n      * the standard input if the file name is \"-\"). It is private on\n      * purpose, use the create class method intead.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file_trs80(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.  The input will be read from\n      * the named file (or the standard input if the file name is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * The termination_seen instance variable is used to remember\n      * whether or not a termination record has been seen yet.\n      */\n    bool termination_seen;\n\n    /**\n      * See base class for documentation.  We are over-riding it because\n      * we use raw binary, so we call the put_char() method.  This\n      * method also tracks the byte_offset, so that we can align to\n      * specific boundaries.  Calls the checksum_add() method.\n      */\n    void put_byte(unsigned char);\n\n    /**\n      * The byte_offset instance variable is used to track the location\n      * in the output file.  Maintained by the put_byte() method.\n      */\n    unsigned long byte_offset;\n\n    /**\n      * The pref_block_size is used to remember the preferred\n      * block size.  Set by the constructor.  Read by the\n      * preferred_block_size_get() method.\n      */\n    int pref_block_size;\n\n    /**\n      * The preferred_block_size_calculate method is used to determine\n      * the best block size to pack into 512 byte blocks.\n      */\n    static int preferred_block_size_calculate();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_trs80();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_trs80(const output_file_trs80 &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_trs80 &operator=(const output_file_trs80 &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_TRS80_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/vhdl.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000 Hendrik De Vloed <hendrik.devloed@ugent.be>\n// Copyright (C) 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n#include <srecord/interval.h>\n#include <srecord/output/file/vhdl.h>\n#include <srecord/record.h>\n#include <srecord/progname.h>\n\n\nsrecord::output_file_vhdl::~output_file_vhdl()\n{\n    emit_header();\n    put_stringf(\"  others => %s_dont_care\\n\" \" );\\n\", prefix.c_str());\n    if (enable_footer_flag)\n    {\n        put_stringf(\"end package body %s_pack;\\n\", prefix.c_str());\n    }\n}\n\n\nsrecord::output_file_vhdl::output_file_vhdl(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    bytes_per_word(1),\n    prefix(\"eprom\"),\n    header_done(false)\n{\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_vhdl::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_vhdl(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_vhdl::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        int a1 = cmdln->value_number();\n        cmdln->token_next();\n\n        if (a1 > 0)\n        {\n            unsigned a2 = (unsigned)a1;\n            if (a2 > sizeof(unsigned long))\n                a2 = sizeof(unsigned long);\n            bytes_per_word = a2;\n        }\n    }\n    if (cmdln->token_cur() == arglex::token_string)\n    {\n        prefix = cmdln->value_string();\n        cmdln->token_next();\n    }\n}\n\n\nvoid\nsrecord::output_file_vhdl::emit_header()\n{\n    if (header_done)\n        return;\n    if (enable_header_flag)\n    {\n        put_stringf\n        (\n            \"--\\n\"\n            \"-- Generated automatically by %s -VHDL - do not edit\\n\"\n            \"--\\n\",\n            progname_get()\n        );\n        put_stringf\n        (\n            \"library IEEE;\\n\"\n            \"use IEEE.numeric_std.all;\\n\"\n            \"use work.%s_defs_pack.all;\\n\\n\",\n            prefix.c_str()\n        );\n        put_stringf(\"package %s_pack is\\n\", prefix.c_str());\n        put_stringf\n        (\n            \" constant %s_rom : %s_rom_array;\\n\",\n            prefix.c_str(),\n            prefix.c_str()\n        );\n        put_stringf(\"end package %s_pack;\\n\\n\", prefix.c_str());\n        put_stringf(\"package body %s_pack is\\n\", prefix.c_str());\n    }\n    put_stringf\n    (\n        \" constant %s_rom : %s_rom_array := %s_rom_array'(\\n\",\n        prefix.c_str(),\n        prefix.c_str(),\n        prefix.c_str()\n    );\n    header_done = true;\n}\n\n\nvoid\nsrecord::output_file_vhdl::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_unknown:\n        // Ignore.\n        break;\n\n    case srecord::record::type_header:\n        if (enable_header_flag && record.get_length() > 0)\n        {\n            //\n            // Output the header record as a comment.\n            //\n            put_string(\"-- \");\n            if (record.get_address() != 0)\n            {\n                unsigned long addr = record.get_address();\n                put_stringf(\"%08lX: \", addr);\n            }\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (c == '\\n')\n                {\n                    put_string(\"\\n-- \");\n                    continue;\n                }\n                if (!isprint(c))\n                    c = ' ';\n                put_char(c);\n            }\n            put_char('\\n');\n        }\n        break;\n\n    case srecord::record::type_data:\n        //\n        // Make sure the data is aligned.\n        //\n        if\n        (\n            bytes_per_word > 1\n        &&\n            (\n                (record.get_address() % bytes_per_word)\n            ||\n                (record.get_length() % bytes_per_word)\n            )\n        )\n        {\n            fatal_alignment_error(bytes_per_word);\n        }\n\n        emit_header();\n        for (size_t j = 0; j < record.get_length(); j += bytes_per_word)\n        {\n            srecord::record::address_t current_word = 0;\n            for (unsigned k = 0; k < bytes_per_word; ++k)\n                current_word = (current_word << 8) + record.get_data(j + k);\n            put_stringf\n            (\n                \"  %lu => %s_entry(%lu),\\n\",\n                (unsigned long)((record.get_address() + j) / bytes_per_word),\n                prefix.c_str(),\n                (unsigned long)current_word\n            );\n        }\n        break;\n\n    case srecord::record::type_data_count:\n        // Ignore.\n        break;\n\n    case srecord::record::type_execution_start_address:\n        // Ignore.\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_vhdl::line_length_set(int)\n{\n    // ignore\n}\n\n\nvoid\nsrecord::output_file_vhdl::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_vhdl::preferred_block_size_set(int nbytes)\n{\n    if (nbytes > 1 || nbytes > record::max_data_length)\n        return false;\n    if (bytes_per_word > 1 && 0 != (nbytes % bytes_per_word))\n        return false;\n    return true;\n}\n\n\nint\nsrecord::output_file_vhdl::preferred_block_size_get()\n    const\n{\n    //\n    // Use the largest we can get, but it has to be a multiple of our\n    // word size.\n    //\n    int n = srecord::record::max_data_length;\n    if (bytes_per_word > 1)\n        n -= (n % bytes_per_word);\n    return n;\n}\n\n\nconst char *\nsrecord::output_file_vhdl::format_name()\n    const\n{\n    return \"VHDL\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/vhdl.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000 Hendrik De Vloed <hendrik.devloed@ugent.be>\n// Copyright (C) 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_VHDL_H\n#define SRECORD_OUTPUT_FILE_VHDL_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_vhdl class is used to represent the state out\n  * an output file in VHDL format.\n  */\nclass output_file_vhdl:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_vhdl();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_vhdl(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation\n    void write(const record &);\n\n    // See base class for documentation\n    void line_length_set(int);\n\n    // See base class for documentation\n    void address_length_set(int);\n\n    // See base class for documentation\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The bytes_per_word instance variable is used to remember how\n      * many bytes to emit per output row.  This is because words are\n      * packed into an arry of values larger than a single byte.\n      */\n    unsigned bytes_per_word;\n\n    /**\n      * The prefix instance variable is used to remember the prefix of\n      * the various names emitted into the output.\n      */\n    std::string prefix;\n\n    /**\n      * The header_done instance variable is used to remember whether\n      * the emit_header method has already been called.\n      */\n    bool header_done;\n\n    /**\n      * The emit_header method is used to emit the file header,\n      * if necessary.\n      */\n    void emit_header();\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_vhdl();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_vhdl(const output_file_vhdl &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_vhdl &operator=(const output_file_vhdl &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_VHDL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/vmem.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n\n#include <srecord/arglex/tool.h>\n#include <srecord/output/file/vmem.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_vmem::~output_file_vmem()\n{\n    if (column)\n        put_char('\\n');\n}\n\n\n//\n// The default number of bits is 32.\n// If you change this, you must also change the following files:\n//     lib/srec/output/file/vmem.cc\n//     man/man1/srecord::cat.1\n//\n#define DEFAULT_MEM_WIDTH 32\n\n\n//\n// Calculate log2(bytes_per_word)\n//\n// For example...\n// Return  Num    Num\n// Value   Bytes  Bits\n//   0      1       8\n//   1      2      16\n//   2      4      32\n//   3      8      64\n//   4     16     128\n//\nstatic unsigned\ncalc_width_shift(int x)\n{\n    //\n    // The user could be giving a number of bytes.\n    // (But the range is limited to those values not easily confused\n    // with a number of bits.)\n    //\n    if (x == 1)\n        return 0;\n    if (x == 2)\n        return 1;\n    if (x == 4)\n        return 2;\n\n    //\n    // Number of bits.\n    //\n    if (x == 8)\n        return 0;\n    if (x == 16)\n        return 1;\n    if (x == 32)\n        return 2;\n    if (x == 64)\n        return 3;\n    if (x == 128)\n        return 4;\n\n    //\n    // The default number of bits is 32.\n    // If you change this, you must also change the following files:\n    //     man/man1/srecord::cat.1\n    //     lib/srec/arglex_output.cc\n    //\n    return 2;\n}\n\n\nstatic unsigned\ncalc_width_mask(int x)\n{\n    return ((1uL << calc_width_shift(x)) - 1uL);\n}\n\n\nsrecord::output_file_vmem::output_file_vmem(const std::string &a_file_name) :\n    srecord::output_file(a_file_name),\n    bytes_per_word(4),\n    address(0),\n    column(0),\n    pref_block_size(4 * bytes_per_word),\n    width_shift(calc_width_shift(8 * bytes_per_word)),\n    width_mask(calc_width_mask(8 * bytes_per_word))\n{\n    line_length_set(80);\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_vmem::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_vmem(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_vmem::command_line(srecord::arglex_tool *cmdln)\n{\n    if (cmdln->token_cur() == arglex::token_number)\n    {\n        int n = cmdln->value_number();\n        cmdln->token_next();\n\n        width_shift = calc_width_shift(n);\n        bytes_per_word = 1u << width_shift;\n        width_mask = calc_width_mask(n);\n\n        //\n        // Recalculate the preferred block size\n        // for an 80 column line.\n        //\n        line_length_set(80);\n    }\n}\n\n\nvoid\nsrecord::output_file_vmem::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // emit header records as comments in the file\n        if (enable_header_flag && record.get_length() > 0)\n        {\n            put_string(\"/* \");\n            if (record.get_address() != 0)\n            {\n                unsigned long addr = record.get_address();\n                put_stringf(\"%08lX: \", addr);\n            }\n            const unsigned char *cp = record.get_data();\n            const unsigned char *ep = cp + record.get_length();\n            while (cp < ep)\n            {\n                unsigned char c = *cp++;\n                if (c == '\\n')\n                    put_stringf(\"\\n * \");\n                else if (isprint(c) || isspace(c))\n                    put_char(c);\n                else\n                    put_stringf(\"\\\\%o\", c);\n                // make sure we don't end the comment\n                if (c == '*' && cp < ep && *cp == '/')\n                    put_char(' ');\n            }\n            put_string(\" */\\n\");\n        }\n        if (!enable_optional_address_flag)\n            address = (unsigned long)-1L;\n        break;\n\n    case srecord::record::type_data:\n        //\n        // make sure the data is aligned properly\n        //\n        if\n        (\n            (record.get_address() & width_mask)\n        ||\n            (record.get_length() & width_mask)\n        )\n            fatal_alignment_error(1u << width_shift);\n\n        //\n        // If we need to advance the address, it has to be at the start\n        // of a line.\n        //\n        if (address != record.get_address())\n        {\n            if (column)\n            {\n                put_char('\\n');\n                column = 0;\n            }\n            address = record.get_address();\n        }\n\n        //\n        // emit the data bytes\n        //\n        for (size_t j = 0; j < record.get_length(); j += bytes_per_word)\n        {\n            //\n            // Each line starts with an address.\n            // The addresses are actually divided by the memory width,\n            // rather than being byte adddresses.\n            //\n            // The presence of the @ character would seem to imply this\n            // is optional.  It would be easy to figure out that an\n            // address is an address, and not a data byte.\n            //\n            if (column == 0)\n                put_stringf(\"@%08lX\", address >> width_shift);\n\n            //\n            // Put a space between each word\n            //\n            put_char(' ');\n\n            //\n            // emit the bytes of the word\n            //\n            for (unsigned k = 0; k < bytes_per_word; ++k)\n            {\n                //\n                // Write the byte and crank the address.\n                //\n                put_byte(record.get_data(j + k));\n                ++address;\n\n                //\n                // Crank the column.\n                // If the line is too long, finish it.\n                //\n                ++column;\n                if (column >= pref_block_size)\n                {\n                    put_char('\\n');\n                    column = 0;\n                }\n            }\n        }\n        break;\n\n    case srecord::record::type_data_count:\n    case srecord::record::type_execution_start_address:\n        // ignore\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n    }\n}\n\n\nvoid\nsrecord::output_file_vmem::line_length_set(int linlen)\n{\n    int nwords = (linlen - 9) / (bytes_per_word * 2 + 1);\n    int max_words = srecord::record::max_data_length >> width_shift;\n    if (nwords > max_words)\n        nwords = max_words;\n    if (nwords < 1)\n        nwords = 1;\n    pref_block_size = nwords * bytes_per_word;\n}\n\n\nvoid\nsrecord::output_file_vmem::address_length_set(int)\n{\n    // ignore\n}\n\n\nbool\nsrecord::output_file_vmem::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (bytes_per_word > 1 && 0 != (nbytes % bytes_per_word))\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_vmem::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_vmem::format_name()\n    const\n{\n    return \"VMem\";\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/vmem.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_VMEM_H\n#define SRECORD_OUTPUT_FILE_VMEM_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_vmem class is used to write a file in\n  * Verilog VMEM format, to be loaded using the $readmemh() call.\n  */\nclass output_file_vmem:\n    public output_file\n{\npublic:\n    /**\n      * The destrutcor.\n      */\n    virtual ~output_file_vmem();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_vmem(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\nprivate:\n    /**\n      * The bytes_per_word instance variable is used to remember how\n      * many bytes go into each word of data.\n      */\n    unsigned bytes_per_word;\n\n    /**\n      * The address instance variable is used to remember where we are\n      * up to in the output.\n      */\n    unsigned long address;\n\n    /**\n      * The column instance variable is used to remember which column\n      * we are up to in the output.  Used to limit the length of lines\n      * in the output.\n      */\n    int column;\n\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * number of bytes in the preferred block size.\n      */\n    int pref_block_size;\n\n    /**\n      * The width_shift instance variable is used to remember the number\n      * of bits to shift addresses when emitting them.  This is based\n      * on the memory width passed to the constructor.\n      */\n    unsigned width_shift;\n\n    /**\n      * The width_mask instance variable is used to remember the lower\n      * bits to the right of the addresses shift.  This is most frequently\n      * used to determine the boundaries of memory-width chunks of bytes.\n      * This value is simply a pre-caluculation of ((1u << width_shift) - 1u).\n      */\n    unsigned width_mask;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_vmem();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_vmem(const output_file_vmem &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_vmem &operator=(const output_file_vmem &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_VMEM_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/wilson.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2006-2008, 2010-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/output/file/wilson.h>\n#include <srecord/record.h>\n\n\nsrecord::output_file_wilson::~output_file_wilson()\n{\n}\n\n\nsrecord::output_file_wilson::output_file_wilson(\n    const std::string &a_file_name\n) :\n    srecord::output_file(a_file_name),\n    pref_block_size(32)\n{\n    if (line_termination == line_termination_native)\n        line_termination = line_termination_binary;\n}\n\n\nsrecord::output::pointer\nsrecord::output_file_wilson::create(const std::string &a_file_name)\n{\n    return pointer(new srecord::output_file_wilson(a_file_name));\n}\n\n\nvoid\nsrecord::output_file_wilson::put_byte(unsigned char n)\n{\n    static const char *table[256] =\n    {\n        \"@\",    \"A\",    \"B\",    \"C\",    \"D\",    \"E\",    \"F\",    \"G\",\n        \"H\",    \"I\",    \"J\",    \"K\",    \"L\",    \"M\",    \"N\",    \"O\",\n        \"P\",    \"Q\",    \"R\",    \"S\",    \"T\",    \"U\",    \"V\",    \"W\",\n        \"X\",    \"Y\",    \"Z\",    \"[\",    \"\\\\\",   \"]\",    \"^\",    \"_\",\n        \"`\",    \"a\",    \"b\",    \"c\",    \"d\",    \"e\",    \"f\",    \"g\",\n        \"h\",    \"i\",    \"j\",    \"k\",    \"l\",    \"m\",    \"n\",    \"o\",\n        \"p\",    \"q\",    \"r\",    \"s\",    \"t\",    \"u\",    \"v\",    \"w\",\n        \"x\",    \"y\",    \"z\",    \"{\",    \"|\",    \"}\",    \"~\",    \"\\177\",\n        \"\\200\", \"\\201\", \"\\202\", \"\\203\", \"\\204\", \"\\205\", \"\\206\", \"\\207\",\n        \"\\210\", \"\\211\", \"\\212\", \"\\213\", \"\\214\", \"\\215\", \"\\216\", \"\\217\",\n        \"\\220\", \"\\221\", \"\\222\", \"\\223\", \"\\224\", \"\\225\", \"\\226\", \"\\227\",\n        \"\\230\", \"\\231\", \"\\232\", \"\\233\", \"\\234\", \"\\235\", \"\\236\", \"\\237\",\n        \"\\240\", \"\\241\", \"\\242\", \"\\243\", \"\\244\", \"\\245\", \"\\246\", \"\\247\",\n        \"\\250\", \"\\251\", \"\\252\", \"\\253\", \"\\254\", \"\\255\", \"\\256\", \"\\257\",\n        \"\\260\", \"\\261\", \"\\262\", \"\\263\", \"\\264\", \"\\265\", \"\\266\", \"\\267\",\n        \"\\270\", \"\\271\", \"\\272\", \"\\273\", \"\\274\", \"\\275\", \"\\276\", \"\\277\",\n        \"\\300\", \"\\301\", \"\\302\", \"\\303\", \"\\304\", \"\\305\", \"\\306\", \"\\307\",\n        \"\\310\", \"\\311\", \"\\312\", \"\\313\", \"\\314\", \"\\315\", \"\\316\", \"\\317\",\n        \"\\320\", \"\\321\", \"\\322\", \"\\323\", \"\\324\", \"\\325\", \"\\326\", \"\\327\",\n        \"\\330\", \"\\331\", \"\\332\", \"\\333\", \"\\334\", \"\\335\", \"\\336\", \"\\337\",\n        \":0\",   \":1\",   \":2\",   \":3\",   \":4\",   \":5\",   \":6\",   \":7\",\n        \":8\",   \":9\",   \"::\",   \":;\",   \":<\",   \":=\",   \":>\",   \":?\",\n        \";0\",   \";1\",   \";2\",   \";3\",   \";4\",   \";5\",   \";6\",   \";7\",\n        \";8\",   \";9\",   \";:\",   \";;\",   \";<\",   \";=\",   \";>\",   \";?\",\n        \"<0\",   \"<1\",   \"<2\",   \"<3\",   \"<4\",   \"<5\",   \"<6\",   \"<7\",\n        \"<8\",   \"<9\",   \"<:\",   \"<;\",   \"<<\",   \"<=\",   \"<>\",   \"<?\",\n        \"=0\",   \"=1\",   \"=2\",   \"=3\",   \"=4\",   \"=5\",   \"=6\",   \"=7\",\n        \"=8\",   \"=9\",   \"=:\",   \"=;\",   \"=<\",   \"==\",   \"=>\",   \"=?\",\n        \"\\340\", \"\\341\", \"\\342\", \"\\343\", \"\\344\", \"\\345\", \"\\346\", \"\\347\",\n        \"\\350\", \"\\351\", \"\\352\", \"\\353\", \"\\354\", \"\\355\", \"\\356\", \"\\357\",\n        \"\\360\", \"\\361\", \"\\362\", \"\\363\", \"\\364\", \"\\365\", \"\\366\", \"\\367\",\n        \"\\370\", \"\\371\", \"\\372\", \"\\373\", \"\\374\", \"\\375\", \"\\376\", \"\\377\",\n    };\n    put_string(table[n]);\n    checksum_add(n);\n}\n\n\nvoid\nsrecord::output_file_wilson::write_inner(int tag, unsigned long address,\n    const void *data, int data_nbytes)\n{\n    //\n    // Make sure the line is not too long.\n    //\n    if (data_nbytes > 250)\n        fatal_error(\"data length (%d > 250) too long\", data_nbytes);\n\n    //\n    // Assemble the data for this line.\n    //\n    unsigned char buffer[256];\n    int line_length = data_nbytes + 5;\n    buffer[0] = line_length;\n    srecord::record::encode_big_endian(buffer + 1, address, 4);\n    if (data_nbytes)\n        memcpy(buffer + 5, data, data_nbytes);\n\n    //\n    // Emit the line as hexadecimal text.\n    //\n    put_char(tag);\n    checksum_reset();\n    for (int j = 0; j < line_length; ++j)\n        put_byte(buffer[j]);\n    put_byte(~checksum_get());\n    put_char('\\n');\n}\n\n\nvoid\nsrecord::output_file_wilson::write(const srecord::record &record)\n{\n    switch (record.get_type())\n    {\n    case srecord::record::type_header:\n        // This format doesn't appear to have header records\n        break;\n\n    case srecord::record::type_data:\n        write_inner\n        (\n            '#',\n            record.get_address(),\n            record.get_data(),\n            record.get_length()\n        );\n        break;\n\n    case srecord::record::type_data_count:\n        // ignore\n        break;\n\n    case srecord::record::type_execution_start_address:\n        if (enable_goto_addr_flag)\n            write_inner('\\'', record.get_address(), 0, 0);\n        break;\n\n    case srecord::record::type_unknown:\n        fatal_error(\"can't write unknown record type\");\n        break;\n    }\n}\n\n\nvoid\nsrecord::output_file_wilson::line_length_set(int linlen)\n{\n    //\n    // Given the number of characters, figure the maximum number of\n    // data baytes.\n    // <tag> <size1:2> <addr4:8> ...data... <cs1:2>\n    // 1 +   2 +       8 +       2*n +      2       <= linlen\n    //\n    int n = (linlen - 15) / 2;\n\n    //\n    // Constrain based on the file format.\n    //\n    // The size field (max 255) includes the size of the data,\n    // the size of the address (4 bytes) and the size of the\n    // size (1 byte), thus 250 (255 - 4 - 1) bytes of data is\n    // the safest maximum.\n    //\n    if (n < 1)\n        n = 1;\n    else if (n > 250)\n        n = 250;\n\n    //\n    // An additional constraint is the size of the srecord::record\n    // data buffer.\n    //\n    if (n > srecord::record::max_data_length)\n        n = srecord::record::max_data_length;\n    pref_block_size = n;\n}\n\n\nvoid\nsrecord::output_file_wilson::address_length_set(int)\n{\n    // ignore  (this may change if I ever get a formal spec for\n    // this format)\n}\n\n\nbool\nsrecord::output_file_wilson::preferred_block_size_set(int nbytes)\n{\n    if (nbytes < 1 || nbytes > record::max_data_length)\n        return false;\n    if (nbytes > 250)\n        return false;\n    pref_block_size = nbytes;\n    return true;\n}\n\n\nint\nsrecord::output_file_wilson::preferred_block_size_get()\n    const\n{\n    return pref_block_size;\n}\n\n\nconst char *\nsrecord::output_file_wilson::format_name()\n    const\n{\n    return \"Wilson\";\n}\n\n\nbool\nsrecord::output_file_wilson::is_binary(void)\n    const\n{\n    return true;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file/wilson.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000-2002, 2005-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_WILSON_H\n#define SRECORD_OUTPUT_FILE_WILSON_H\n\n#include <srecord/output/file.h>\n\nnamespace srecord\n{\n\n/**\n  * The srecord::output_file_wilson class is used to represent an output\n  * file which is in \"wilson\" format.  This file format was reverse\n  * engineered, it wasn't documented anywhere.  More information would\n  * be welcome.\n  *\n  * @sa\n  *     #srecord::output_file_motorola,\n  *     #srecord::output_file_idt,\n  */\nclass output_file_wilson:\n    public output_file\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file_wilson();\n\nprivate:\n    /**\n      * The constructor.  It is private on purpose, use the #create\n      * class method instead.\n      *\n      * @param file_name\n      *     The name of the file to be written.  The special name \"-\"\n      *     indicates the standard output is to be used.\n      */\n    output_file_wilson(const std::string &file_name);\n\npublic:\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instances of this class.\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    static pointer create(const std::string &file_name);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    void put_byte(unsigned char);\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    bool is_binary(void) const;\n\nprivate:\n    /**\n      * The pref_block_size instance variable is used to remember the\n      * preferred number of data bytes (NOT encoded hex characters) to\n      * be placed in each output line.\n      */\n    int pref_block_size;\n\n    /**\n      * The write_inner method is used to write a line of output.\n      *\n      * @param tag\n      *     The tag value at the start of the line.\n      * @param address\n      *     The address of the first byte of data on the line.\n      * @param data\n      *     The palyload of this line.\n      * @param data_nbytes\n      *     The number of bytes of payload.\n      */\n    void write_inner(int tag, unsigned long address, const void *data,\n        int data_nbytes);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_file_wilson();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file_wilson(const output_file_wilson &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file_wilson &operator=(const output_file_wilson &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_FILE_WILSON_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2002, 2005-2012, 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cerrno>\n#include <cstdio>\n#include <iostream>\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include <srecord/arglex.h>\n#include <srecord/sizeof.h>\n#include <srecord/output/file.h>\n#include <srecord/record.h>\n\n\nbool srecord::output_file::enable_header_flag = true;\nbool srecord::output_file::enable_data_count_flag = true;\nbool srecord::output_file::enable_goto_addr_flag = true;\nbool srecord::output_file::enable_footer_flag = true;\nbool srecord::output_file::enable_optional_address_flag = false;\n\n\nsrecord::output_file::~output_file()\n{\n    FILE *fp = (FILE *)get_fp();\n    if (fflush(fp))\n        fatal_error_errno(\"write\");\n    if (fp != stdout && fclose(fp))\n        fatal_error_errno(\"close\");\n}\n\n\nsrecord::output_file::output_file() :\n    file_name(\"standard output\"),\n    line_number(1),\n    vfp(0),\n    checksum(0),\n    position(0),\n    is_regular(true)\n{\n    vfp = stdout;\n    set_is_regular();\n    line_termination = line_termination_binary;\n}\n\n\nsrecord::output_file::output_file(const std::string &a_file_name) :\n    file_name(a_file_name),\n    line_number(1),\n    vfp(0),\n    checksum(0),\n    position(0),\n    is_regular(true)\n{\n    if (file_name == \"-\")\n    {\n        file_name = \"standard output\";\n        vfp = stdout;\n        set_is_regular();\n        line_termination = line_termination_binary;\n    }\n    else\n    {\n        //\n        // The call to fopen is deferred until the constructor has\n        // completed.  This is so that the line_termination can be set\n        // correctly.\n        //\n    }\n}\n\n\nbool\nsrecord::output_file::is_binary(void)\n    const\n{\n    return false;\n}\n\n\nvoid *\nsrecord::output_file::get_fp(void)\n{\n    if (!vfp)\n    {\n        //\n        // The call to fopen is deferred until the constructor has\n        // completed.  This is so that the line_termination can be set\n        // correctly.\n        //\n#ifdef __CYGWIN__\n        if (line_termination == line_termination_native && !is_binary())\n        {\n            vfp = fopen(file_name.c_str(), \"w\");\n            if (!vfp)\n                fatal_error_errno(\"open\");\n            line_termination = line_termination_binary;\n        }\n        else\n#endif\n        {\n            vfp = fopen(file_name.c_str(), \"wb\");\n            if (!vfp)\n                fatal_error_errno(\"open\");\n        }\n        set_is_regular();\n    }\n    return vfp;\n}\n\n\nconst std::string\nsrecord::output_file::filename()\n    const\n{\n    char buffer[20];\n    sprintf(buffer, \": %d\", line_number);\n    return (file_name + buffer);\n}\n\n\nvoid\nsrecord::output_file::put_char(int c)\n{\n    FILE *fp = (FILE *)get_fp();\n    if (c == '\\n' && !is_binary())\n    {\n        ++line_number;\n        for (;;)\n        {\n            switch (line_termination)\n            {\n            case line_termination_native:\n                line_termination = line_termination_guess();\n                continue;\n\n            case line_termination_primos:\n                putc('\\n', fp);\n                ++position;\n                if (position & 1)\n                {\n                    putc(0, fp);\n                    ++position;\n                }\n                break;\n\n            case line_termination_nl:\n                putc('\\n', fp);\n                ++position;\n                break;\n\n            case line_termination_cr:\n                putc('\\r', fp);\n                ++position;\n                break;\n\n            case line_termination_crlf:\n                putc('\\r', fp);\n                ++position;\n                putc('\\n', fp);\n                ++position;\n                break;\n            }\n            break;\n        }\n    }\n    else\n    {\n        putc(c, fp);\n        ++position;\n    }\n    if (ferror(fp))\n        fatal_error_errno(\"write\");\n}\n\n\nvoid\nsrecord::output_file::put_nibble(int n)\n{\n    put_char(\"0123456789ABCDEF\"[n & 15]);\n}\n\n\nvoid\nsrecord::output_file::put_byte(unsigned char n)\n{\n    put_nibble(n >> 4);\n    put_nibble(n);\n    checksum_add(n);\n}\n\n\nvoid\nsrecord::output_file::put_word_be(int n)\n{\n    put_byte(n >> 8);\n    put_byte(n);\n}\n\n\nvoid\nsrecord::output_file::put_word_le(int n)\n{\n    put_byte(n);\n    put_byte(n >> 8);\n}\n\n\nvoid\nsrecord::output_file::put_3bytes_be(unsigned long n)\n{\n    put_byte(n >> 16);\n    put_byte(n >> 8);\n    put_byte(n);\n}\n\n\nvoid\nsrecord::output_file::put_3bytes_le(unsigned long n)\n{\n    put_byte(n);\n    put_byte(n >> 8);\n    put_byte(n >> 16);\n}\n\n\nvoid\nsrecord::output_file::put_4bytes_be(unsigned long n)\n{\n    put_byte(n >> 24);\n    put_byte(n >> 16);\n    put_byte(n >> 8);\n    put_byte(n);\n}\n\n\nvoid\nsrecord::output_file::put_4bytes_le(unsigned long n)\n{\n    put_byte(n);\n    put_byte(n >> 8);\n    put_byte(n >> 16);\n    put_byte(n >> 24);\n}\n\n\nint\nsrecord::output_file::checksum_get(void)\n{\n    return (checksum & 0xFF);\n}\n\n\nint\nsrecord::output_file::checksum_get16(void)\n{\n    return (checksum & 0xFFFF);\n}\n\n\nvoid\nsrecord::output_file::checksum_reset(void)\n{\n    checksum = 0;\n}\n\nvoid\nsrecord::output_file::checksum_add(unsigned char n)\n{\n    checksum += n;\n}\n\n\nvoid\nsrecord::output_file::seek_to(unsigned long address)\n{\n    //\n    // Seeking on non-regular files is problematic.  Avoid doing\n    // this if possible.  (Usually we can, srecord::cat emits records\n    // in ascending address order.)\n    //\n    if (!is_regular)\n    {\n        while (position < address)\n            put_char(0);\n    }\n    if (address == position)\n        return;\n\n    //\n    // We'll have to try a seek.\n    //\n    FILE *fp = (FILE *)get_fp();\n    errno = 0;\n    if (fseek(fp, address, 0) < 0)\n    {\n        if (errno == EINVAL && address >= 0x80000000uL)\n        {\n            warning\n            (\n                \"It appears that the implementation of fseek on your \"\n                \"system is unable to cope with addresses which have \"\n                \"the most significant bit set (this is POSIX and ANSI \"\n                \"C conforming behaviour).  You probably did not intend \"\n                \"to create a %3.1fGB file.  See the manual for a \"\n                \"description of the --offset filter, remembering that \"\n                \"you can give negative offsets.\",\n                ((double)address / (double)(1uL << 30))\n            );\n        }\n        fatal_error_errno(\"seek 0x%lX\", address);\n    }\n    position = address;\n}\n\n\nvoid\nsrecord::output_file::put_string(const char *s)\n{\n    while (*s)\n        put_char(*s++);\n}\n\n\nvoid\nsrecord::output_file::put_string(const std::string &s)\n{\n    const char *cp = s.c_str();\n    const char *ep = cp + s.size();\n    while (cp < ep)\n        put_char(*cp++);\n}\n\n\nvoid\nsrecord::output_file::put_stringf(const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    char buffer[1000];\n    vsprintf(buffer, fmt, ap);\n    va_end(ap);\n    put_string(buffer);\n}\n\n\nvoid\nsrecord::output_file::enable_header(bool yesno)\n{\n    enable_header_flag = yesno;\n}\n\n\nvoid\nsrecord::output_file::enable_data_count(bool yesno)\n{\n    enable_data_count_flag = yesno;\n}\n\n\nvoid\nsrecord::output_file::enable_goto_addr(bool yesno)\n{\n    enable_goto_addr_flag = yesno;\n}\n\n\nvoid\nsrecord::output_file::enable_footer(bool yesno)\n{\n    enable_footer_flag = yesno;\n}\n\n\nvoid\nsrecord::output_file::enable_optional_address(bool yesno)\n{\n    enable_optional_address_flag = yesno;\n}\n\n\nbool\nsrecord::output_file::enable_by_name(const std::string &name, bool yesno)\n{\n    struct table_t\n    {\n        const char *name;\n        void (*func)(bool);\n    };\n\n    static const table_t table[] =\n    {\n        { \"Header\", &srecord::output_file::enable_header },\n        { \"Data_Count\", &srecord::output_file::enable_data_count },\n        { \"Execution_Start_Address\", &srecord::output_file::enable_goto_addr },\n        { \"Footer\", &srecord::output_file::enable_footer },\n        { \"Optional_Address\",\n          &srecord::output_file::enable_optional_address },\n    };\n\n    for (const table_t *tp = table; tp < ENDOF(table); ++tp)\n    {\n        if (arglex::compare(tp->name, name.c_str()))\n        {\n            tp->func(yesno);\n            return true;\n        }\n    }\n    return false;\n}\n\n\nvoid\nsrecord::output_file::set_is_regular(void)\n{\n    FILE *fp = (FILE *)vfp;\n    struct stat st;\n    is_regular = fstat(fileno(fp), &st) == 0 && S_ISREG(st.st_mode);\n}\n\n\nvoid\nsrecord::output_file::fatal_hole_error(unsigned long lo, unsigned long hi)\n{\n    fatal_error\n    (\n        \"The %s output format is unable to cope with holes in the data,\"\n        \"however there is a hole at 0x%04lX..0x%04lX.\",\n        format_name(),\n        lo,\n        hi - 1\n    );\n}\n\n\nvoid\nsrecord::output_file::fatal_alignment_error(int multiple)\n{\n    if (multiple > 4)\n    {\n        fatal_error\n        (\n            \"The %s output format uses %d-byte alignment, but unaligned \"\n                \"data is present.  Use a \\\"--fill 0xNN --within <input> \"\n                \"--range-padding %d\\\" filter to fix this problem.\",\n            format_name(),\n            multiple,\n            multiple\n        );\n    }\n    else\n    {\n        fatal_error\n        (\n            \"The %s output format uses %d-bit data, but unaligned \"\n                \"data is present.  Use a \\\"--fill 0xNN --within \"\n                \"<input> --range-padding %d\\\" filter to fix this \"\n                \"problem.\",\n            format_name(),\n            multiple * 8,\n            multiple\n        );\n    }\n}\n\n\nvoid\nsrecord::output_file::data_address_too_large(const srecord::record &record,\n    unsigned nbits) const\n{\n    unsigned long lo = record.get_address();\n    unsigned long hi = lo + record.get_length() - 1;\n    assert(nbits <= 32);\n    if (nbits > 0)\n    {\n        int prec = (nbits + 3) / 4;\n        fatal_error\n        (\n            \"data address range (0x%.*lX..0x%.*lX) is too large, \"\n                \"the available range is only (0x%.*lx..0x%.*lX)\",\n            prec,\n            lo,\n            prec,\n            hi,\n            prec,\n            0uL,\n            prec,\n            (1uL << nbits) - 1\n        );\n    }\n    fatal_error(\"data address (0x%lX..0x%lX) too large\", lo, hi);\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/file.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998-2003, 2005-2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILE_H\n#define SRECORD_OUTPUT_FILE_H\n\n#include <string>\n#include <srecord/output.h>\n#include <srecord/format_printf.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::output_file class is used to represent a generic output file.\n  * It provides a numnber of services useful to many output file formats.\n  */\nclass output_file:\n    public output\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_file();\n\n    /**\n      * The default constructor.\n      * Output will be sent to the standard output.\n      */\n    output_file();\n\n    /**\n      * The constructor.  The output will be sent to the named file (or\n      * the standard output if the file name is \"-\").\n      *\n      * @param file_name\n      *     The name of the file to be written.\n      */\n    output_file(const std::string &file_name);\n\n    // See base class for documentation.\n    virtual const std::string filename(void) const;\n\n    /**\n      * The enable_header class method is used to enable or disable\n      * the writing of header records into output file, if the format\n      * supports optional header records.\n      *\n      * @param yesno\n      *     true if header records should be written, false if not\n      */\n    static void enable_header(bool yesno);\n\n    /**\n      * The enable_data_count class method is used to enable or disable\n      * the writing of data record count records into output file, if\n      * the format supports optional data record count records.\n      *\n      * @param yesno\n      *     true if data record count records should be written, false\n      *     if not\n      */\n    static void enable_data_count(bool yesno);\n\n    /**\n      * The enable_goto_addr class method is used to enable or disable\n      * the writing of execution start address records into output file,\n      * if the format supports optional execution start address records.\n      *\n      * @param yesno\n      *     true if execution start address records should be written,\n      *     false if not\n      */\n    static void enable_goto_addr(bool yesno);\n\n    /**\n      * The enable_footer class method is used to enable or disable\n      * the writing of footer records into output file, if the format\n      * supports optional footer records.\n      *\n      * @param yesno\n      *     true if footer records should be written, false if not\n      */\n    static void enable_footer(bool yesno);\n\n    /**\n      * The enable_by_name class method is used to enable or disable\n      * the writing of various records into output file.\n      *\n      * @param name\n      *     the name of the record type to enable or disable\n      * @param yesno\n      *     true if should be enable, false if sjould be disabled\n      * @returns\n      *     true if name understood, false if not (to trigger diagnostic\n      *     error message)\n      */\n    static bool enable_by_name(const std::string &name, bool yesno);\n\n    /**\n      * The line_termination_by_name method is used to force line\n      * termination to a particular style, rather than the current\n      * operating system's native text format.\n      *\n      * @param name\n      *     The name of the line termination style to be used,\n      *     e.g. \"crlf\" or \"nl\".\n      * @returns\n      *     true if successful, false if name unknown\n      */\n    static bool line_termination_by_name(const std::string &name);\n\nprotected:\n    /**\n      * The put_char method is used to send a character to the output.\n      * Usually, this is sufficient, however derived classes may\n      * over-ride it if they have a special case.  Over-ride with\n      * caution, as it affects many other methods.\n      */\n    virtual void put_char(int c);\n\n    /**\n      * The put_nibble method is used to send a hexadecimal digit (0..9,\n      * A..F) to the output.  It calls put_char to send the output.\n      */\n    void put_nibble(int value);\n\n    /**\n      * The put_byte method is used to send a byte value to the output.\n      * The default implementation is to call the put_nibble method\n      * twice, big-endian (most significant nibble first).\n      *\n      * The value of the byte will be added to the running checksum, via\n      * the #checksum_add method.\n      *\n      * Usually, this #put_byte method implemention is sufficient for\n      * most output classes, however derived classes may over-ride it if\n      * they have a special case.  Over-ride with caution, as it affects\n      * many other methods.\n      */\n    virtual void put_byte(unsigned char value);\n\n    /**\n      * The put_word_be method is used to send a 16-bit value to the\n      * output.  The #put_byte method is called twice, and the two byte\n      * values are sent big-endian (most significant byte first).\n      */\n    virtual void put_word_be(int value);\n\n    /**\n      * The put_word_le method is used to send a 16-bit value to the\n      * output.  The #put_byte method is called twice, and the two byte\n      * values are sent little-endian (least significant byte first).\n      */\n    virtual void put_word_le(int value);\n\n    /**\n      * The put_3bytes_be method is used to send a 24-bit value to the\n      * output.  The #put_byte method is called three times, and the\n      * three byte values are sent big-endian (most significant byte\n      * first).\n      */\n    virtual void put_3bytes_be(unsigned long value);\n\n    /**\n      * The put_3bytes_le method is used to send a 24-bit value to the\n      * output.  The #put_byte method is called three times, and the\n      * three byte values are sent little-endian (least significant byte\n      * first).\n      */\n    virtual void put_3bytes_le(unsigned long value);\n\n    /**\n      * The put_4bytes_be method is used to send a 32-bit value to the\n      * output.  The #put_byte method is called four times, and the\n      * four byte values are sent big-endian (most significant byte\n      * first).\n      */\n    virtual void put_4bytes_be(unsigned long value);\n\n    /**\n      * The put_4bytes_le method is used to send a 32-bit value to the\n      * output.  The #put_byte method is called four times, and the\n      * four byte values are sent little-endian (least significant byte\n      * first).\n      */\n    virtual void put_4bytes_le(unsigned long value);\n\n    /**\n      * The checksum_reset method is used to set the running checksum to\n      * zero.\n      */\n    void checksum_reset(void);\n\n    /**\n      * The checksum_add method is used to add another 8-bit value to\n      * the running checksum.\n      *\n      * The default implementation uses a simple addition.  Derived\n      * classesmay override if they need to.  Do this with caution, as\n      * it affects other methods.\n      */\n    virtual void checksum_add(unsigned char n);\n\n    /**\n      * The checksum_get method is used to get the current value of the\n      * running checksum (added to by the #checksum_add method, usually\n      * called by the #put_byte method).  Only the lower 8 bits of the\n      * sum are returned.\n      */\n    int checksum_get(void);\n\n    /**\n      * The checksum_get16 method is used to get the current value of\n      * the running checksum (added to by the #checksum_add method,\n      * usually called by the #put_byte method).  Only the lower 16\n      * bits of the sum are returned.\n      */\n    int checksum_get16(void);\n\n    /**\n      * The seek_to method is used to move the output position to the\n      * specified location in the output file.\n      */\n    void seek_to(unsigned long);\n\n    /**\n      * The put_string method is used to send a nul-terminated C string\n      * to the output.  Multiple calls to #put_char are made.\n      */\n    void put_string(const char *text);\n\n    /**\n      * The put_string method is used to send C++ string\n      * to the output.  Multiple calls to #put_char are made.\n      *\n      * @param text\n      *     The string to print.\n      */\n    void put_string(const std::string &text);\n\n    /**\n      * The put_stringf method is used to send a formatted string to the\n      * output.  The format and operation ios similar to the standard\n      * printf function.  Multiple calls to #put_char are made.\n      */\n    void put_stringf(const char *, ...)             FORMAT_PRINTF(2, 3);\n\n    /**\n      * The enable_header_flag class variable is set by the\n      * #enable_header method, to remember whether or not header\n      * records are to be emitted (if the format supports optional\n      * header records).\n      */\n    static bool enable_header_flag;\n\n    /**\n      * The enable_data_count_flag class variable is set by the\n      * #enable_data_count method, to remember whether or not data\n      * record count records are to be emitted (if the format supports\n      * optional data record count records).\n      */\n    static bool enable_data_count_flag;\n\n    /**\n      * The enable_goto_addr_flag class variable is set by the\n      * #enable_goto_addr method, to remember whether or not execution\n      * start address records are to be emitted (if the format supports\n      * optional execution start address records).\n      */\n    static bool enable_goto_addr_flag;\n\n    /**\n      * The enable_footer_flag class variable is set by the\n      * #enable_footer method, to remember whether or not footer\n      * records (end-of-file record) are to be emitted (if the format\n      * supports optional footer records).\n      */\n    static bool enable_footer_flag;\n\n    /**\n      * The enable_optional_address_records class variable is used\n      * to remember whether or not to emit optional address records.\n      * Defaults to true.  Set by the #enable_by_name method.\n      */\n    static bool enable_optional_address_flag;\n\n    /**\n      * The enable_footer class method is used to enable or disable\n      * emitting optional address records.\n      *\n      * @param yesno\n      *     true if records should be written, false if not\n      */\n    static void enable_optional_address(bool yesno);\n\n    enum line_termination_t\n    {\n        line_termination_native,\n        line_termination_crlf,\n        line_termination_nl,\n        line_termination_binary = line_termination_nl,\n        line_termination_cr,\n        line_termination_primos\n    };\n\n    /**\n      * The line_termination class variable is used to remember the\n      * desired line termination style.  Defaults to the native style of\n      * the current operating system.\n      */\n    static line_termination_t line_termination;\n\n    /**\n      * The line_termination_guess class method is used to figure out\n      * the line termination style of the host environment.\n      */\n    static line_termination_t line_termination_guess(void);\n\nprivate:\n    /**\n      * The file_name instance variable is used by the #filename and\n      * filename_and_line methods to report the name of the input\n      * file.  This makes for informative error mesages.\n      */\n    std::string file_name;\n\n    /**\n      * The line_number instance variable is used by the get_char\n      * method to remember the current line number.  It us used by the\n      * filename_and_line method to report the current file location.\n      */\n    int line_number;\n\n    /**\n      * The vfp instance variable is used by the #get_fp method to\n      * remember the file pointer.  You need to cast it to FILE* befor\n      * you use it.  Never access this instance variable directly,\n      * always go via the #get_fp method.  This ensures the file has\n      * been opened first!\n      */\n    void *vfp;\n\nprotected:\n    /**\n      * The checksum instance variable is used record the running\n      * checksum.  NEVER access this variable directly.  Always use the\n      * #checksum_reset method to set it mack to its initial state.\n      * Always use the #checksum_add method to add a byte to it.\n      * Always use the #checksum_get or #checksum_get16 methods to\n      * read its value.\n      */\n    int checksum;\n\n    /**\n      * The fatal_alignment_error method is used to report problems\n      * with unaligned data in formats that require aligned data.  It\n      * suggests a fill to fix the problem.\n      *\n      * @param alignment\n      *     The necessary byte alignment\n      */\n    void fatal_alignment_error(int alignment);\n\n    /**\n      * The fatal_hole_error method is used to report problems with\n      * holes in the data, for formats that cannot cope with them.\n      */\n    void fatal_hole_error(unsigned long lo, unsigned long hi);\n\n    /**\n      * The data_address_too_large method is used to report fatal\n      * problems with data records, in the case where some or all of the\n      * address span of a record falls outside the format's ability to\n      * represent addresses.\n      *\n      * @param record\n      *     The offending data record.\n      * @param nbits\n      *     The number of bits in the available address range\n      */\n    void data_address_too_large(const record &record, unsigned nbits) const;\n\nprivate:\n    /**\n      * The position instance variable is used to remember the\n      * current position within the output file.  Set by the put_char\n      * method, and the seek_to method.  Used by the seek_to method.\n      */\n    unsigned long position;\n\n    /**\n      * The is_regular instance variable is used to remember whther\n      * or not the file is a regular file.  This is set by the\n      * set_is_regular method.  It is used by the seek_to method.\n      */\n    bool is_regular;\n\n    /**\n      * The set_is_regular method shall be used whenever vfp is assigned,\n      * to estanblish whther the output file is a regular file or a\n      * special file (like a pipe).\n      */\n    void set_is_regular(void);\n\n    /**\n      * The get_fp method is used to get the stdio file pointer\n      * associated with this input file.  (By avoiding a FILE*\n      * declaraion, we avoid having to include <stdio.h> for not\n      * particularly good reason.  Take care when casting.)\n      *\n      * If the file has not been opened yet, it will be opened by this\n      * method.\n      */\n    void *get_fp(void);\n\n    /**\n      * The is_binary method is used to to determine whether or not\n      * a file format is binary (true) of text (false).  The default\n      * implementation always returns false (text).\n      */\n    virtual bool is_binary(void) const;\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_file(const output_file &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_file &operator=(const output_file &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/filter/reblock.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n#include <cstring>\n\n#include <srecord/output/filter/reblock.h>\n#include <srecord/record.h>\n\n\nsrecord::output_filter_reblock::~output_filter_reblock()\n{\n    if (buffer_pos != 0)\n        flush_buffer(false);\n    delete [] buffer;\n}\n\n\nsrecord::output_filter_reblock::output_filter_reblock(\n    const output::pointer &a_deeper,\n    bool a_align\n) :\n    output_filter(a_deeper),\n    align(a_align),\n    block_size(0),\n    buffer_address(0),\n    buffer(0),\n    buffer_pos(0),\n    buffer_max(0)\n{\n    track_block_size();\n\n    // We allocate a large-ish buffer to start with.  The idea is we\n    // will fill it up before we deeper->write it, this will minimize\n    // the number of memmove() calls.\n    buffer_max = 1 << 14;\n    buffer = new unsigned char [buffer_max];\n\n    assert(buffer_max > 2 * record::max_data_length);\n}\n\n\nsrecord::output_filter_reblock::pointer\nsrecord::output_filter_reblock::create(const output::pointer &a_deeper,\n    bool a_align)\n{\n    return pointer(new output_filter_reblock(a_deeper, a_align));\n}\n\n\nvoid\nsrecord::output_filter_reblock::track_block_size(void)\n{\n    block_size = output_filter::preferred_block_size_get();\n}\n\n\nvoid\nsrecord::output_filter_reblock::line_length_set(int n)\n{\n    output_filter::line_length_set(n);\n    track_block_size();\n}\n\n\nvoid\nsrecord::output_filter_reblock::address_length_set(int n)\n{\n    output_filter::address_length_set(n);\n    track_block_size();\n}\n\n\nint\nsrecord::output_filter_reblock::preferred_block_size_get(void)\n    const\n{\n    return record::max_data_length;\n}\n\n\nbool\nsrecord::output_filter_reblock::preferred_block_size_set(int nbytes)\n{\n    if (!output_filter::preferred_block_size_set(nbytes))\n        return false;\n    track_block_size();\n    return true;\n}\n\n\nvoid\nsrecord::output_filter_reblock::write(const record &r)\n{\n    if (r.get_type() != record::type_data)\n    {\n        flush_buffer(false);\n        output_filter::write(r);\n        return;\n    }\n    if (r.get_length() == 0)\n        return;\n    if (buffer_pos != 0)\n    {\n        if (r.get_address() != buffer_address + buffer_pos)\n        {\n            flush_buffer(false);\n        }\n        else if (buffer_pos + r.get_length() > buffer_max)\n        {\n            flush_buffer(true);\n        }\n    }\n    assert(buffer_pos + r.get_length() <= buffer_max);\n    if (buffer_pos == 0)\n    {\n        buffer_address = r.get_address();\n    }\n    assert(buffer);\n    memcpy(buffer + buffer_pos, r.get_data(), r.get_length());\n    buffer_pos += r.get_length();\n    assert(buffer_pos <= buffer_max);\n\n    // We don't call the deeper->write method immediately, that could\n    // cause one memmove call per write (expensive).  Instead we collect\n    // up a whole bunch that can be done sequentially, leaving fewer\n    // than block_size bytes to shuffle.\n}\n\n\nvoid\nsrecord::output_filter_reblock::flush_buffer(bool partial)\n{\n    if (buffer_pos == 0)\n        return;\n\n    size_t p = 0;\n    if (align)\n    {\n        unsigned residual = (buffer_address % block_size);\n        if (residual)\n        {\n            size_t size = block_size - residual;\n            if (size > buffer_pos)\n            {\n                size = buffer_pos;\n                record r2(record::type_data, buffer_address, buffer, size);\n                output_filter::write(r2);\n                buffer_pos = 0;\n                buffer_address = 0;\n                return;\n            }\n            record r2(record::type_data, buffer_address, buffer, size);\n            output_filter::write(r2);\n            p += size;\n        }\n    }\n\n    while (p < buffer_pos)\n    {\n        size_t size = block_size;\n        if (p + size > buffer_pos)\n        {\n            if (partial)\n                break;\n            size = buffer_pos - p;\n        }\n        record r2(record::type_data, buffer_address + p, buffer + p, size);\n        output_filter::write(r2);\n        p += size;\n    }\n    if (p == buffer_pos)\n    {\n        buffer_pos = 0;\n        buffer_address = 0;\n    }\n    else\n    {\n        // Shuffle down.\n        buffer_pos -= p;\n        buffer_address += p;\n        memmove(buffer, buffer + p, buffer_pos);\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/filter/reblock.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILTER_REBLOCK_H\n#define SRECORD_OUTPUT_FILTER_REBLOCK_H\n\n#include <srecord/output/filter.h>\n\nnamespace srecord {\n\n/**\n  * The output_filter_reblock class is used to represent a filter that\n  * repacks output records so that they exactly align with the output\n  * format's preferred block size.\n  *\n  * This can also be used to remove artifacts of whatever the SRecord\n  * internal memory chunk size happens to be.\n  */\nclass output_filter_reblock:\n    public output_filter\n{\npublic:\n    typedef boost::shared_ptr<output_filter_reblock> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~output_filter_reblock();\n\n    /**\n      * The create class method is used to create new dynamically\n      * allocated instanced of this class.\n      *\n      * @param deeper\n      *     Where to send our filtered output.\n      * @param align\n      *     Whether or not to align data records on block boundaries\n      *     (that is, to use non-optimal short writes after holes to force\n      *     alignment).\n      */\n    static pointer create(const output::pointer &deeper, bool align = false);\n\nprotected:\n    // See base class for documentation.\n    void write(const record &r);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get(void) const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\nprivate:\n    /**\n      * The constructor.\n      * It is private on purpose, use the #create class method instead.\n      *\n      * @param deeper\n      *     Where to send our filtered output.\n      * @param align\n      *     Whether or not to align data records on block boundaries\n      *     (that is, to use non-optimal short writes after holes to force\n      *     alignment).\n      */\n    output_filter_reblock(const output::pointer &deeper, bool align);\n\n    /**\n      * The align instance variable is used to remember whether or\n      * not to use shoirt writes after holds to force records to be\n      * on block_size boundaries, rather than as tightly packed as\n      * pissible.\n      */\n    bool align;\n\n    /**\n      * The block_size instance variable is used to remember the\n      * block size (in bytes) we are packing to.  It is cache of the\n      * deeper->preferred_block_size_get() value, the cahce is updated\n      * at strategic times, by calling the #track_block_size method.\n      */\n    unsigned block_size;\n\n    /**\n      * The buffer_address instance variable is used to remember the\n      * byte address of the first byte of the output buffer.  Not\n      * meaningful if #buffer_pos is zero.\n      */\n    unsigned long buffer_address;\n\n    /**\n      * The buffer instance variable is used to remember the base\n      * address of a buffer allocated from dynamic memory.  The\n      * allocatred size may be found in the #buffer_max instance\n      * variable.\n      *\n      * assert(!buffer == !buffer_max);\n      */\n    unsigned char *buffer;\n\n    /**\n      * The buffer_pos instance variable is used to remember how many\n      * bytes of the #buffer have been used to date.\n      *\n      * assert(buffer_pos < buffer_max);\n      */\n    size_t buffer_pos;\n\n    /**\n      * The buffer_max instance variable is used to remember how many\n      * data bytes were allocated when the #buffer was created.\n      */\n    size_t buffer_max;\n\n    /**\n      * The track_block_size method is used to re-cache the\n      * deeper->preferred_bock_size_get whenever that value could have\n      * changed.\n      */\n    void track_block_size(void);\n\n    /**\n      * The flush_buffer method is used to write the accumulkated\n      * contents of the #buffer to the deeper output.\n      *\n      * @param partial\n      *     Whether or not to write a partial record at the end.  True\n      *     for partial record, false for no short record (which could\n      *     leave some residual bytes in the #buffer).\n      */\n    void flush_buffer(bool partial);\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_filter_reblock();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_filter_reblock(const output_filter_reblock &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_filter_reblock &operator=(const output_filter_reblock &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILTER_REBLOCK_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/filter.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/output/filter.h>\n\n\nsrecord::output_filter::~output_filter()\n{\n}\n\n\nsrecord::output_filter::output_filter(const output::pointer &a_deeper) :\n    deeper(a_deeper)\n{\n}\n\n\nvoid\nsrecord::output_filter::write(const record &r)\n{\n    deeper->write(r);\n}\n\n\nvoid\nsrecord::output_filter::line_length_set(int n)\n{\n    deeper->line_length_set(n);\n}\n\n\nvoid\nsrecord::output_filter::address_length_set(int n)\n{\n    deeper->address_length_set(n);\n}\n\n\nint\nsrecord::output_filter::preferred_block_size_get(void)\n    const\n{\n    return deeper->preferred_block_size_get();\n}\n\n\nbool\nsrecord::output_filter::preferred_block_size_set(int nbytes)\n{\n    return deeper->preferred_block_size_set(nbytes);\n}\n\n\nconst std::string\nsrecord::output_filter::filename(void)\n    const\n{\n    return deeper->filename();\n}\n\n\nconst char *\nsrecord::output_filter::format_name()\n    const\n{\n    return deeper->format_name();\n}\n\n\nvoid\nsrecord::output_filter::notify_upper_bound(unsigned long addr)\n{\n    deeper->notify_upper_bound(addr);\n}\n\n\nvoid\nsrecord::output_filter::command_line(arglex_tool *cmdln)\n{\n    deeper->command_line(cmdln);\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output/filter.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_FILTER_H\n#define SRECORD_OUTPUT_FILTER_H\n\n#include <srecord/output.h>\n\nnamespace srecord {\n\n/**\n  * The output_filter class is used to represent a generic output\n  * manipulation.  Usually the major manipulations are done on input,\n  * these filters are output-specific.\n  */\nclass output_filter:\n    public output\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~output_filter();\n\nprotected:\n    /**\n      * The constructor.\n      * For use by derived classes only.\n      *\n      * @param deeper\n      *     Where to send our filtered output.\n      */\n    output_filter(const output::pointer &deeper);\n\n    // See base class for documentation.\n    void write(const record &r);\n\n    // See base class for documentation.\n    void line_length_set(int);\n\n    // See base class for documentation.\n    void address_length_set(int);\n\n    // See base class for documentation.\n    int preferred_block_size_get() const;\n\n    // See base class for documentation.\n    bool preferred_block_size_set(int nbytes);\n\n    // See base class for documentation.\n    const std::string filename() const;\n\n    // See base class for documentation.\n    const char *format_name() const;\n\n    // See base class for documentation.\n    void notify_upper_bound(unsigned long addr);\n\n    // See base class for documentation.\n    void command_line(arglex_tool *cmdln);\n\nprivate:\n    /**\n      * The deeper instance vatiable is used to remember where to send\n      * our filtered output.\n      */\n    output::pointer deeper;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    output_filter();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output_filter(const output_filter &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output_filter &operator=(const output_filter &);\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_OUTPUT_FILTER_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cerrno>\n#include <cstdio>\n#include <cstring>\n\n#include <srecord/quit.h>\n#include <srecord/output.h>\n#include <srecord/record.h>\n\n\nsrecord::output::output()\n{\n}\n\n\nsrecord::output::~output()\n{\n}\n\n\nvoid\nsrecord::output::fatal_error(const char *fmt, ...)\n    const\n{\n    va_list ap;\n    va_start(ap, fmt);\n    fatal_error_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::output::fatal_error_v(const char *fmt, va_list ap)\n    const\n{\n    char buf[1024];\n    vsnprintf(buf, sizeof(buf), fmt, ap);\n    quit_default.fatal_error(\"%s: %s\", filename().c_str(), buf);\n}\n\n\nvoid\nsrecord::output::fatal_error_errno(const char *fmt, ...)\n    const\n{\n    va_list ap;\n    va_start(ap, fmt);\n    fatal_error_errno_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::output::fatal_error_errno_v(const char *fmt, va_list ap)\n    const\n{\n    int n = errno;\n    char buf[1024];\n    vsnprintf(buf, sizeof(buf), fmt, ap);\n    quit_default.fatal_error_errno\n    (\n        \"%s: %s: %s [%d]\",\n        filename().c_str(),\n        buf,\n        strerror(n),\n        n\n    );\n}\n\n\nvoid\nsrecord::output::warning(const char *fmt, ...)\n    const\n{\n    va_list ap;\n    va_start(ap, fmt);\n    warning_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::output::warning_v(const char *fmt, va_list ap)\n    const\n{\n    char buf[1024];\n    vsnprintf(buf, sizeof(buf), fmt, ap);\n    quit_default.warning(\"%s: %s\", filename().c_str(), buf);\n}\n\n\nvoid\nsrecord::output::write_header(const srecord::record *rp)\n{\n    if (rp)\n    {\n        // Make sure we are writing a header record\n        srecord::record record(*rp);\n        record.set_type(srecord::record::type_header);\n        write(record);\n    }\n    else\n    {\n        //\n        // This is the default header record.\n        // If you want to change it, this is the place.\n        //\n        static char hdr[] = \"http://srecord.sourceforge.net/\";\n        srecord::record record\n        (\n            srecord::record::type_header,\n            (srecord::record::address_t)0,\n            (const srecord::record::data_t *)hdr,\n            strlen(hdr)\n        );\n        write(record);\n    }\n}\n\n\nvoid\nsrecord::output::write_data(unsigned long address, const void *data,\n    size_t length)\n{\n    const srecord::record::data_t *data_p =\n        (const srecord::record::data_t *)data;\n    size_t block_size = preferred_block_size_get();\n    while (length > 0)\n    {\n        int nbytes = (length > block_size ? block_size : length);\n        srecord::record\n            record(srecord::record::type_data, address, data_p, nbytes);\n        write(record);\n        address += nbytes;\n        data_p += nbytes;\n        length -= nbytes;\n    }\n}\n\n\nvoid\nsrecord::output::write_execution_start_address(const srecord::record *rp)\n{\n    if (rp)\n    {\n        // Make sure we are writing an execution start address record\n        srecord::record record(*rp);\n        record.set_type(srecord::record::type_execution_start_address);\n        write(record);\n    }\n    else\n    {\n        //\n        // This is the default execution start address record.\n        // If you want to change it, this is the place.\n        //\n        srecord::record\n            record(srecord::record::type_execution_start_address, 0, 0, 0);\n        write(record);\n    }\n}\n\n\nvoid\nsrecord::output::notify_upper_bound(unsigned long)\n{\n}\n\n\nvoid\nsrecord::output::command_line(srecord::arglex_tool *)\n{\n    // Do nothing.\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/output.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2006-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_OUTPUT_H\n#define SRECORD_OUTPUT_H\n\n#include <cstdarg>\n#include <string>\n#include <boost/shared_ptr.hpp>\n\n#include <srecord/format_printf.h>\n\nnamespace srecord {\n\nclass arglex_tool; // forward\nclass record; // forward\n\n/**\n  * The srecord::output class is used to represent an abstract output vector.\n  * It could be a file, it could be a filter first, before it reaches\n  * a file.\n  */\nclass output\n{\npublic:\n    typedef boost::shared_ptr<output> pointer;\n\n    /**\n      * The destructor.\n      */\n    virtual ~output();\n\n    /**\n      * The write method is used to write a recordonto an output.\n      * Derived classes must implement this method.\n      *\n      * @param rec\n      *     The record to be written.\n      */\n    virtual void write(const record &rec) = 0;\n\n    /**\n      * The write_header method is used to write a header record\n      * to the output.  If no record is specified, a default\n      * record will be supplied.  The write method will be called.\n      */\n    virtual void write_header(const record * = 0);\n\n    /**\n      * The write_data method is used to write data to the output.\n      * A suitable data record wil be produced.  The #write method\n      * will be called.\n      */\n    virtual void write_data(unsigned long, const void *, size_t);\n\n    /**\n      * The write_execution_start_address method is used to write an\n      * execution start address record to the output.  If no record is\n      * specified, a default record will be supplied.  The #write method\n      * will be called.\n      */\n    virtual void write_execution_start_address(const record * = 0);\n\n    /**\n      * The set_line_length method is used to set the maximum\n      * length of an output line, for those formats for which\n      * this is a meaningful concept, and the line length is at\n      * all controllable.  Derived classes must implement this method.\n      *\n      * @param cols\n      *     The page width in fixed width text columns.\n      */\n    virtual void line_length_set(int cols) = 0;\n\n    /**\n      * The address_length_set method is used to set the minimum\n      * number of bytes to be written for addresses in the output,\n      * for those formats for which this is a meaningful concept, and\n      * the address length is at all controllable.  Derived classes\n      * must implement this method.\n      *\n      * @param nbytes\n      *     The number of byte to use for the address (2..4).\n      */\n    virtual void address_length_set(int nbytes) = 0;\n\n    /**\n      * The preferred_block_size_get method is used to get the\n      * proferred block size of the output fformat.  Often, but not\n      * always, influenced by the line_lebgth_set method.  Derived\n      * classes must implement this method.\n      */\n    virtual int preferred_block_size_get(void) const = 0;\n\n    /**\n      * The preferred_block_size_set method is is to set a precific\n      * number of bytes for the preferred block size.\n      *\n      * @param nbytes\n      *     The exact number of bytes to be returned by the\n      *     #preferred_block_size_get method.\n      * @returns\n      *     There are format-specific limitations on block sizes, this\n      *     method will return true if the setting was acceptable, false\n      *     if the format is incapable of using the specified block\n      *     size.\n      */\n    virtual bool preferred_block_size_set(int nbytes) = 0;\n\n    /**\n      * The fatal_error method is used to report fatal errors.\n      * The 'fmt' string is in the same style a standard C printf\n      * function.  It calls the fatal_error_v method.  This method\n      * does not return.\n      */\n    virtual void fatal_error(const char *fmt, ...) const\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The fatal_error_v method is used to report fatal errors.\n      * The 'fmt' string is in the same style a standard C vprintf\n      * function.  It calls global exit.  This method does not return.\n      */\n    virtual void fatal_error_v(const char *fmt, va_list ap) const;\n\n    /**\n      * The fatal_error_errno method is used to report fatal errors,\n      * and append the string equivalent of errno.  The 'fmt' string\n      * is in the same style a standard C printf function.  It calls\n      * global exit().  This method does not return.\n      */\n    virtual void fatal_error_errno(const char *fmt, ...) const\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The fatal_error_errno_v method is used to report fatal\n      * errors.  The 'fmt' string is in the same style a standard C\n      * vprintf function.  It calls the global exit function.\n      * This method does not return.\n      */\n    virtual void fatal_error_errno_v(const char *fmt, va_list ap) const;\n\n    /**\n      * The warning method is used to likely but non-fatal errors.\n      * The 'fmt' string is in the same style a standard C printf\n      * function.  It calls the #warning_v method.\n      */\n    virtual void warning(const char *fmt, ...) const\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The warning_v method is used to report likely but non-fatal\n      * errors.  The 'fmt' string is in the same style a standard\n      * C vprintf function.\n      */\n    virtual void warning_v(const char *fmt, va_list ap) const;\n\n    /**\n      * The filename method is used to determine the name of the\n      * output file.  It is used for the various error messages.\n      * Derived classes must implement this method.\n      */\n    virtual const std::string filename(void) const = 0;\n\n    /**\n      * The format_name method is used to obtain the name of this output\n      * format.\n      */\n    virtual const char *format_name(void) const = 0;\n\n    /**\n      * The notify_upper_bound method is used to notify the output class\n      * of the upper bound (highest address plus one) of the output\n      * to come.  Shall be called before the head or any data records\n      * are written.\n      *\n      * @param addr\n      *     One past the highest used memory byte.\n      */\n    virtual void notify_upper_bound(unsigned long addr);\n\n    /**\n      * The command_line method is used by arglex_srec::get_output when\n      * parsing the command line, to give the format an opportunity\n      * to grab extra arguments off the command line.  The default\n      * implementation does nothing.\n      *\n      * @param cmdln\n      *     Where to obtain information about the curreent parse stat of\n      *     the command line.\n      */\n    virtual void command_line(arglex_tool *cmdln);\n\nprotected:\n    /**\n      * The default constructor.  Only derived classes may use.\n      */\n    output();\n\nprivate:\n    /**\n      * The copy constructor.  Do not use.\n      */\n    output(const output &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    output &operator=(const output &);\n};\n\n};\n\n#endif // SRECORD_OUTPUT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/patchlevel.h",
    "content": "#define PATCHLEVEL \"1.64.D001\"\n#define COPYRIGHT_YEARS \"1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014\"\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/pretty_size.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n\n#include <srecord/pretty_size.h>\n\n\nstd::string\nsrecord::pretty_size(long long x, int width)\n{\n    double tmp = x;\n    bool negative = false;\n    if (x < 0)\n    {\n        negative = true;\n        tmp = -tmp;\n    }\n    const char *suffix = \" kMGTPEZY\";\n    while (tmp >= 1024)\n    {\n        tmp /= 1024;\n        ++suffix;\n    }\n    if (*suffix == ' ')\n        suffix = \"\";\n    else\n        --width;\n    if (width < 1)\n        width = 1;\n    if (negative)\n        tmp = -tmp;\n    char buffer[20];\n    int prec = 0;\n    if (tmp >= 100)\n        prec = 0;\n    else if (tmp >= 10)\n        prec = 1;\n    else\n        prec = 2;\n    snprintf(buffer, sizeof(buffer), \"%*.*f%.1s\", width, prec, tmp, suffix);\n    return buffer;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/pretty_size.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_PRETTY_SIZE_H\n#define SRECORD_PRETTY_SIZE_H\n\n#include <string>\n\nnamespace srecord\n{\n\n/**\n  * The pretty_size function is used to convert a number into a smaller\n  * number with a multiplying suffix (kMGT...).\n  *\n  * @param x\n  *     The number to be converted.\n  * @param width\n  *     The width of the field you would like to print the number in.\n  *     More than six is unnecessary.\n  * @returns\n  *     a string, including the suffix.\n  */\nstd::string pretty_size(long long x, int width = 0);\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_PRETTY_SIZE_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/progname.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#include <cstring>\n\n#include <srecord/progname.h>\n\n\nstatic char *progname;\n\n\nvoid\nsrecord::progname_set(char *s)\n{\n    for (;;)\n    {\n        char            *cp1;\n        char            *cp2;\n\n        cp1 = strrchr(s, '/');\n        if (!cp1)\n            cp1 = s;\n        else\n        {\n            if (!cp1[1])\n            {\n                *cp1 = 0;\n                continue;\n            }\n            ++cp1;\n        }\n\n        cp2 = strrchr(s, '\\\\');\n        if (!cp2)\n            cp2 = s;\n        else\n        {\n            if (!cp2[1])\n            {\n                *cp2 = 0;\n                continue;\n            }\n            ++cp2;\n        }\n\n        progname = (cp1 > cp2 ? cp1 : cp2);\n        // avoid some libtool nonsense\n        if (0 == memcmp(progname, \"lt-\", 3))\n            progname += 3;\n        size_t len = strlen(progname);\n        if\n        (\n            progname[len - 4] == '.'\n        &&\n            (progname[len - 3] == 'e' || progname[len - 3] == 'E')\n        &&\n            (progname[len - 2] == 'x' || progname[len - 2] == 'X')\n        &&\n            (progname[len - 1] == 'e' || progname[len - 1] == 'E')\n        )\n            progname[len - 4] = '\\0';\n        return;\n    }\n}\n\n\nconst char *\nsrecord::progname_get()\n{\n    return (progname ? progname : \"???\");\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/progname.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_PROGNAME_H\n#define SRECORD_PROGNAME_H\n\nnamespace srecord\n{\n\n/**\n  * The progname_set function is used by main() to set the name of the\n  * currently executing programme.\n  */\nvoid progname_set(char *);\n\n/**\n  * The progname_get function is used to retrieve the name of the\n  * currently executing programme.  Used by error messages.\n  */\nconst char *progname_get();\n\n};\n\n#endif // SRECORD_PROGNAME_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit/exception.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/quit/exception.h>\n\n\nsrecord::quit_exception::~quit_exception()\n{\n}\n\n\nsrecord::quit_exception::quit_exception()\n{\n}\n\n\nvoid\nsrecord::quit_exception::exit(int)\n{\n    throw vomit();\n}\n\n\nvoid\nsrecord::quit_exception::message_v(const char *, va_list)\n{\n    // don't say anything\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit/exception.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_QUIT_EXCEPTION_H\n#define SRECORD_QUIT_EXCEPTION_H\n\n#include <srecord/quit.h>\n\nnamespace srecord\n{\n\n/**\n  * The quit_exception class is use to represent a quit handler which\n  * throws an exception, rather than call global exit.\n  */\nclass quit_exception:\n    public quit\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~quit_exception();\n\n    /**\n      * The default constructor.\n      */\n    quit_exception();\n\n    /**\n      * the vomit class is used for the throw.\n      */\n    class vomit { };\n\nprotected:\n    // see base class for documentation\n    virtual void exit(int n);\n\n    // see base class for documentation\n    virtual void message_v(const char *fmt, va_list);\n\nprivate:\n    /**\n      * The copy constructor.  Do not use.\n      */\n    quit_exception(const quit_exception &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    quit_exception &operator=(const quit_exception &);\n};\n\n};\n\n#endif // SRECORD_QUIT_EXCEPTION_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit/normal.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2006-2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdarg>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <iostream>\n\n#include <srecord/progname.h>\n#include <srecord/quit/normal.h>\n\n\nsrecord::quit_normal::~quit_normal()\n{\n}\n\n\nsrecord::quit_normal::quit_normal()\n{\n}\n\n\nvoid\nsrecord::quit_normal::exit(int n)\n{\n    ::exit(n);\n}\n\n\nvoid\nsrecord::quit_normal::message_v(const char *fmt, va_list ap)\n{\n    char buf[2000];\n    snprintf(buf, sizeof(buf), \"%s: \", progname_get());\n    size_t len = strlen(buf);\n    vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);\n\n    std::cout.flush();\n\n    int column = 0;\n    char *cp = buf;\n    for (;;)\n    {\n        unsigned char c = *cp++;\n        if (!c)\n            break;\n        if (isspace(c) || !isprint(c))\n            continue;\n\n        std::string word;\n        for (;;)\n        {\n            word += c;\n            c = *cp;\n            if (!c)\n                break;\n            if (isspace(c) || !isprint(c))\n                break;\n            ++cp;\n        }\n        if (!column)\n        {\n            std::cerr << word;\n            column = word.size();\n        }\n        else if (column + 1 + word.size() > 80)\n        {\n            std::cerr << std::endl << \"    \";\n            column = 4;\n            std::cerr << word;\n            column += word.size();\n        }\n        else\n        {\n            std::cerr << ' ';\n            ++column;\n            std::cerr << word;\n            column += word.size();\n        }\n    }\n    std::cerr << std::endl;\n    std::cerr.flush();\n}\n\n\nstatic srecord::quit_normal quit_normal_default;\nsrecord::quit &srecord::quit_default = quit_normal_default;\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit/normal.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_QUIT_NORMAL_H\n#define SRECORD_QUIT_NORMAL_H\n\n#include <srecord/quit.h>\n\nnamespace srecord\n{\n\n/**\n  * The quit_normal class is used to represent a quit handler which\n  * behaves in the \"normal\" way: print error message son the standard\n  * error, and exit via the gloibal exit function.\n  */\nclass quit_normal:\n    public quit\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~quit_normal();\n\n    /**\n      * The default constructor.\n      */\n    quit_normal();\n\nprotected:\n    // see base class for documentation\n    virtual void exit(int);\n\n    // see base class for documentation\n    virtual void message_v(const char *, va_list);\n\nprivate:\n    /**\n      * The copy constructor.  Do not use.\n      */\n    quit_normal(const quit_normal &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    quit_normal &operator=(const quit_normal &);\n};\n\n};\n\n#endif // SRECORD_QUIT_NORMAL_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit/prefix.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstdarg>\n\n#include <srecord/quit/prefix.h>\n\n\nsrecord::quit_prefix::~quit_prefix()\n{\n}\n\n\nsrecord::quit_prefix::quit_prefix(quit &a1, const char *a2) :\n    prefix(a2),\n    deeper(a1)\n{\n}\n\n\nsrecord::quit_prefix::quit_prefix(quit &a1, const std::string &a2) :\n    prefix(a2),\n    deeper(a1)\n{\n}\n\n\nvoid\nsrecord::quit_prefix::exit(int n)\n{\n    deeper.exit(n);\n}\n\n\nvoid\nsrecord::quit_prefix::message_v(const char *fmt, va_list ap)\n{\n    if (prefix != \"\")\n    {\n        char buf[1024];\n        vsnprintf(buf, sizeof(buf), fmt, ap);\n        deeper.message\n        (\n            \"%.*s: %s\",\n            (int)prefix.length(),\n            prefix.data(),\n            buf\n        );\n    }\n    else\n        deeper.message_v(fmt, ap);\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit/prefix.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_QUIT_PREFIX_H\n#define SRECORD_QUIT_PREFIX_H\n\n#include <string>\n#include <srecord/quit.h>\n\nnamespace srecord\n{\n\n/**\n  * The quit_prefix class is used to filter the messages issued to include\n  * a line prefix.  The message is then passed ot a deeper quit handler.\n  */\nclass quit_prefix:\n    public quit\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~quit_prefix();\n\n    /**\n      * A constructor.  The given handler is used to process the\n      * messages, once prefixed.  The given string is used as the\n      * line prefix.\n      */\n    quit_prefix(quit &deeper, const char *prefix);\n\n    /**\n      * A constructor.  The given handler is used to process the\n      * messages, once prefixed.  The given string is used as the\n      * line prefix.\n      */\n    quit_prefix(quit &deeper, const std::string &prefix);\n\n    // See base class for documentation.\n    virtual void exit(int);\n\n    // See base class for documentation.\n    virtual void message_v(const char *, va_list);\n\nprivate:\n    /**\n      * The prefix instance variable is used to remember the line\n      * prefix to use.\n      */\n    std::string prefix;\n\n    /**\n      * The deepr instance variable is used to remember which handler\n      * is to be used to process the error messages once the refix\n      * has been added.\n      */\n    quit &deeper;\n\n    /**\n      * The default constructor.  Do not use.\n      */\n    quit_prefix();\n\n    /**\n      * The copy constructor.  Do not use.\n      */\n    quit_prefix(const quit_prefix &);\n\n    /**\n      * The assignment operator.  Do not use.\n      */\n    quit_prefix &operator=(const quit_prefix &);\n};\n\n};\n\n#endif // SRECORD_QUIT_PREFIX_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cerrno>\n#include <cstdarg>\n#include <cstdio>\n#include <cstring>\n\n#include <srecord/quit.h>\n\n\nsrecord::quit::~quit()\n{\n}\n\n\nsrecord::quit::quit()\n{\n}\n\n\nsrecord::quit::quit(const quit &)\n{\n}\n\n\nsrecord::quit &\nsrecord::quit::operator=(const quit &)\n{\n    return *this;\n}\n\n\nvoid\nsrecord::quit::fatal_error(const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    fatal_error_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::quit::fatal_error_v(const char *fmt, va_list ap)\n{\n    message_v(fmt, ap);\n    exit(1);\n}\n\n\nvoid\nsrecord::quit::fatal_error_errno(const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    fatal_error_errno_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::quit::fatal_error_errno_v(const char *fmt, va_list ap)\n{\n    int n = errno;\n    char buf[1024];\n    vsnprintf(buf, sizeof(buf), fmt, ap);\n    fatal_error(\"%s: %s\", buf, strerror(n));\n}\n\n\nvoid\nsrecord::quit::warning(const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    warning_v(fmt, ap);\n    va_end(ap);\n}\n\n\nvoid\nsrecord::quit::warning_v(const char *fmt, va_list ap)\n{\n    char buf[1024];\n    vsnprintf(buf, sizeof(buf), fmt, ap);\n    message(\"warning: %s\", buf);\n}\n\n\nvoid\nsrecord::quit::message(const char *fmt, ...)\n{\n    va_list ap;\n    va_start(ap, fmt);\n    message_v(fmt, ap);\n    va_end(ap);\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/quit.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2000, 2002, 2003, 2006-2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_QUIT_H\n#define SRECORD_QUIT_H\n\n#include <stdarg.h>\n#include <srecord/format_printf.h>\n\nnamespace srecord\n{\n\n/**\n  * The quit class is an abstract class for reporting error messages,\n  * both fatal and non-fatal.\n  */\nclass quit\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~quit();\n\n    /**\n      * The default constructor.\n      */\n    quit();\n\n    /**\n      * The copy constructor.\n      */\n    quit(const quit &);\n\n    /**\n      * The assignment operator.\n      */\n    quit &operator=(const quit &);\n\n    /**\n      * The fatal_error method is used to report fatal errors.\n      * The `fmt' string is in the same style a standard C printf\n      * function.  It calls the fatal_error_v method.  This method\n      * does not return.\n      */\n    virtual void fatal_error(const char *fmt, ...)\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The fatal_error_v method is used to report fatal errors.\n      * The `fmt' string is in the same style a standard C vprintf\n      * function.  It calls the message_v and exit methods.\n      * This method does not return.\n      */\n    virtual void fatal_error_v(const char *, va_list);\n\n    /**\n      * The fatal_error_errno method is used to report fatal errors,\n      * and append the string equivalent of errno.      The `fmt' string\n      * is in the same style a standard C printf function.      It calls\n      * the fatal_error_errno_v method.  This method does not return.\n      */\n    virtual void fatal_error_errno(const char *fmt, ...)\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The fatal_error_errno_v method is used to report fatal\n      * errors.  The `fmt' string is in the same style a standard C\n      * vprintf function.  It calls the message_v and exit methods.\n      * This method does not return.\n      */\n    virtual void fatal_error_errno_v(const char *, va_list);\n\n    /**\n      * The warning method is used to likely but non-fatal errors.\n      * The `fmt' string is in the same style a standard C printf\n      * function.  It calls the warning_v method.\n      */\n    virtual void warning(const char *fmt, ...)\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The warning_v method is used to report likely but non-fatal\n      * errors.  The `fmt' string is in the same style a standard\n      * C vprintf function.  It calls the message_v method.\n      */\n    virtual void warning_v(const char *, va_list);\n\n    /**\n      * The message method is used to send an error message to a\n      * suitable destination.  The `fmt' string is in the same style\n      * a standard C printf function.  The message_v method is called.\n      */\n    virtual void message(const char *fmt, ...)\n                                                        FORMAT_PRINTF(2, 3);\n    /**\n      * The message_v method is used to send an error message to\n      * a suitable destination.  The `fmt' string is in the same\n      * style a standard C vprintf function.  Derived classes are\n      * required to supply this method.\n      */\n    virtual void message_v(const char *, va_list) = 0;\n\n    /**\n      * The exit method is used to terminate execution.  It could\n      * call the global exit function, or it could throw an exception, or\n      * some other action, but it shall NOT return.  Derived classes\n      * are required to supply this method.\n      */\n    virtual void exit(int) = 0;\n};\n\n/**\n  * The quit_default variable is a reference to a quit implementation.\n  * It should be used unless there is a good reason not to.\n  */\nextern quit &quit_default;\n\n};\n\n#endif // SRECORD_QUIT_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/r250.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006, 2007, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but\n// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdlib>\n#include <ctime>\n#include <unistd.h>\n\n#include <srecord/r250.h>\n\nstatic  unsigned long   buf[250];\nstatic  unsigned long   *pos;\n\n\nstatic inline int\nrand8(void)\n{\n    return ((rand() >> 7) & 255);\n}\n\n\nstatic inline long\nrand32(void)\n{\n    return\n        (\n            ((unsigned long)rand8() << 24)\n        |\n            ((unsigned long)rand8() << 16)\n        |\n            ((unsigned long)rand8() << 8)\n        |\n            (unsigned long)rand8()\n        );\n}\n\n\n#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))\n#define ENDOF(a) ((a) + SIZEOF(a))\n\nstatic bool ready;\n\n\nstatic void\nr250_init(void)\n{\n    ready = true;\n\n    //\n    // initialize crummy linear congruential\n    //\n    time_t now;\n    time(&now);\n    srand(now + getpid());\n\n    //\n    // position to start of array\n    //\n    pos = buf;\n\n    //\n    // initialise contents of array\n    //\n    unsigned long *bp;\n    for (bp = buf; bp < ENDOF(buf); ++bp)\n        *bp = rand32();\n\n    //\n    // make sure the bits are linearly independent\n    //\n    unsigned long bit;\n    for (bit = 1, bp = buf + 3; bit; bp += 11, bit <<= 1)\n    {\n        if (bp >= ENDOF(buf))\n            bp -= SIZEOF(buf);\n        *bp = (*bp & ~(bit - 1)) | bit;\n    }\n}\n\n\nunsigned long\nsrecord::r250(void)\n{\n    if (!ready)\n        r250_init();\n    unsigned long *other = pos + 103;\n    if (other >= ENDOF(buf))\n        other -= SIZEOF(buf);\n    *pos ^= *other;\n    unsigned long result = *pos++;\n    if (pos >= ENDOF(buf))\n        pos = buf;\n    return result;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/r250.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2004, 2006-2008, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n// License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_R250_H\n#define SRECORD_R250_H\n\nnamespace srecord\n{\n\n/**\n  * The r250 function is used to produce a 32-bit random number.\n  * It repeats every 2**256 samples, long enough for most purposes.\n  */\nunsigned long r250(void);\n\n};\n\n#endif // SRECORD_R250_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/record.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001, 2002, 2006-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n\n#include <cassert>\n#include <cstring>\n\n#include <srecord/record.h>\n\n\nsrecord::record::record():\n    type(type_unknown),\n    address(0),\n    length(0)\n{\n}\n\n\nsrecord::record::record(const srecord::record &arg) :\n    type(arg.type),\n    address(arg.address),\n    length(arg.length)\n{\n    if (arg.length > 0)\n        memcpy(data, arg.data, arg.length);\n}\n\n\nsrecord::record::record(type_t arg) :\n    type(arg),\n    address(0),\n    length(0)\n{\n}\n\n\nsrecord::record::record(type_t a1, address_t a2) :\n    type(a1),\n    address(a2),\n    length(0)\n{\n}\n\n\nsrecord::record::record(type_t a1, address_t a2, const data_t *a3, size_t a4) :\n    type(a1),\n    address(a2),\n    length(a4)\n{\n    assert(length <= max_data_length);\n    if (length > 0)\n        memcpy(data, a3, length);\n}\n\n\nsrecord::record &\nsrecord::record::operator=(const srecord::record &arg)\n{\n    if (this != &arg)\n    {\n        type = arg.type;\n        address = arg.address;\n        length = arg.length;\n        if (arg.length > 0)\n            memcpy(data, arg.data, arg.length);\n    }\n    return *this;\n}\n\n\nsrecord::record::~record()\n{\n}\n\n\nsize_t\nsrecord::record::maximum_data_length(address_t address)\n{\n    // FIXME: this is format specific\n    if (address < ((address_t)1 << 16))\n        return 252;\n    if (address < ((address_t)1 << 24))\n        return 251;\n    return 250;\n}\n\n\nsrecord::record::address_t\nsrecord::record::decode_big_endian(const data_t *buffer, size_t length)\n{\n    assert(length <= sizeof(address_t));\n    address_t result = 0;\n    while (length-- > 0)\n        result = (result << 8) | *buffer++;\n    return result;\n}\n\n\nsrecord::record::address_t\nsrecord::record::decode_little_endian(const data_t *buffer, size_t length)\n{\n    assert(length <= sizeof(address_t));\n    address_t result = 0;\n    buffer += length;\n    while (length > 0)\n    {\n        --length;\n        --buffer;\n        result = (result << 8) | *buffer;\n    }\n    return result;\n}\n\n\nvoid\nsrecord::record::encode_big_endian(data_t *buffer, address_t value,\n    size_t length)\n{\n    assert(length <= sizeof(address_t));\n    while (length > 0)\n    {\n        --length;\n        buffer[length] = value;\n        value >>= 8;\n    }\n}\n\n\nvoid\nsrecord::record::encode_little_endian(data_t *buffer, address_t value,\n    size_t length)\n{\n    assert(length <= sizeof(address_t));\n    while (length-- > 0)\n    {\n        *buffer++ = value;\n        value >>= 8;\n    }\n}\n\n\nbool\nsrecord::record::is_all_zero()\n    const\n{\n    for (size_t j = 0; j < length; ++j)\n        if (data[j])\n            return false;\n    return true;\n}\n\n\nvoid\nsrecord::record::set_data_extend(size_t n, data_t d)\n{\n    assert(n < max_data_length);\n    if (n < max_data_length)\n    {\n        data[n] = d;\n        if (length <= n)\n            length = n + 1;\n    }\n}\n\n\nbool\nsrecord::record::address_range_fits_into_n_bits(unsigned nbits)\n    const\n{\n    assert(nbits > 0);\n    assert(nbits <= 32);\n    return ((address >> nbits) < 1 && ((address + length - 1) >> nbits) < 1);\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/record.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2001-2003, 2005-2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_RECORD_H\n#define SRECORD_RECORD_H\n\n#include <cstddef>\n#include <stdint.h>\n\n#include <srecord/endian.h>\n\nnamespace srecord {\n\n/**\n  * The srecord::record class is used to represent a data record read\n  * from a file.  (It is not limited to any particular file format.)\n  * The records may be of various types.\n  */\nclass record\n{\npublic:\n    /**\n      * The destructor.  It isn't virtual, so don't derive anything\n      * from this class.\n      */\n    ~record();\n\n    /**\n      * The type of the various record types.\n      */\n    enum type_t\n    {\n        type_unknown,\n        type_header,\n        type_data,\n        type_data_count,\n        type_execution_start_address\n    };\n\n    /**\n      * The type of record addresses.\n      */\n    typedef uint32_t address_t;\n\n    /**\n      * The type of record data values.\n      */\n    typedef uint8_t data_t;\n\n    /**\n      * The default constructor.  The record will have an\n      * indeterminate type, zero address, and no data.\n      */\n    record();\n\n    /**\n      * The copy constructor.\n      */\n    record(const record &);\n\n    /**\n      * A constructor.  The record will have the given type, a zero\n      * address and no data.\n      */\n    record(type_t);\n\n    /**\n      * A constructor.  The record will have the given type, the\n      * given address and no data.\n      */\n    record(type_t, address_t);\n\n    /**\n      * A constructor.  The record will have the given type, the\n      * given address and a copy of the given data.\n      *\n      * @param the_type\n      *     What kind of record this is\n      * @param the_address\n      *     The memory address of the first byte of data, the rest\n      *     increase by one each.\n      * @param the_data\n      *     The bytes of data for the record.\n      * @param the_data_length\n      *     How long the data is.\n      *     assert(the_data_length < max_data_length);\n      */\n    record(type_t the_type, address_t the_address, const data_t *the_data,\n        size_t the_data_length);\n\n    /**\n      * The assignment operator.\n      */\n    record &operator=(const record &);\n\n    /**\n      * The get_address method is used to get the address of the\n      * record.\n      */\n    address_t get_address(void) const { return address; }\n\n    /**\n      * The get_address_end method is used to get the address \"off\n      * the end\" of this record.\n      */\n    address_t get_address_end(void) const { return (address + length); }\n\n    /**\n      * The address_range_fits_into_n_bits method is used to test whether or\n      * not this record's address range fits within the given number of bits.\n      *\n      * @param nbits\n      *     The number of bits, e.g. 16\n      * @returns\n      *     true if the address range will fit, or false if it will not fit\n      */\n    bool address_range_fits_into_n_bits(unsigned nbits) const;\n\n    /**\n      * The set_address method is used to set the address of the\n      * record.\n      */\n    void set_address(address_t arg) { address = arg; }\n\n    /**\n      * The get_length method is used to get the length (number of\n      * bytes) of the record data.\n      */\n    size_t get_length(void) const { return length; }\n\n    /**\n      * The set_length method is used to set the number of data\n      * bytes in the record data.\n      *\n      * @param arg\n      *      The new record length.  Note that you can reduce the\n      *      length, but you can't increase it.\n      */\n    void\n    set_length(size_t arg)\n    {\n        if (arg < length)\n            length = arg;\n    }\n\n    /**\n      * The get_data method is used to get a ponter to the baseof\n      * the record data.\n      *\n      * Note: Accessing beyond get_length() bytes will give an\n      * undefined value.\n      */\n    const data_t *get_data(void) const { return data; }\n\n    /**\n      * The get_data method is used to fetch the nth data value.\n      *\n      * Note: For perfoemance reasons, no range checking is\n      * performed.  Accessing beyond get_length() bytes will give\n      * an undefined value.\n      *\n      * @param n\n      *     The index into the data array, zero based.\n      *     Values when n is in excess of #length are undefined.\n      */\n    int get_data(size_t n) const { return data[n]; }\n\n    /**\n      * The is_all_zero method is used to determin if the record\n      * contains data bytes which are all zero.\n      */\n    bool is_all_zero(void) const;\n\n    /**\n      * The set_data method is used to set values in the data array.\n      * No range checking is performed.  The record length is not\n      * consulted or adjusted.\n      *\n      * @param n\n      *     The index into the data array, zero based.\n      *     Results when n is in excess of #length are undefined.\n      * @param d\n      *     The new data value.\n      */\n    void set_data(size_t n, data_t d) { data[n] = d; }\n\n    /**\n      * The set_data_extend method is used to set values in the data array.\n      * The record length is adjusted if necessary.\n      *\n      * @param n\n      *     The index into the data array, zero based.\n      *     If this is beyond #length, then #length will be extended.\n      *     assert(n < max_data_length);\n      * @param d\n      *     The new data value.\n      */\n    void set_data_extend(size_t n, data_t d);\n\n    /**\n      * The get_type method is used to get the type of the record.\n      */\n    type_t get_type(void) const { return type; }\n\n    /**\n      * The set_type method is used to set the type of the record.\n      */\n    void set_type(type_t arg) { type = arg; }\n\n    /**\n      * The maximum_data_length method is used to determine the\n      * maximum data length possible within a record, for a given\n      * address.\n      *\n      * @param addr\n      *     The address of the record.  Some formats trade data size of\n      *     address size, for a constant maximum line length.\n      */\n    static size_t maximum_data_length(address_t addr);\n\n    /**\n      * The decode_big_endian method is used to extract 'len'\n      * bytes from the given 'data' and assemble a big-endian value\n      * (most significant byte first).\n      *\n      * @param data\n      *     The data to be decodes\n      * @param len\n      *     Length of the data, in bytes\n      * @returns\n      *     the decoded value\n      */\n    static address_t decode_big_endian(const data_t *data, size_t len);\n\n    /**\n      * The decode_little_endian method is used to extract 'len' bytes\n      * from the given 'data' and assemble a little-endian value (least\n      * significant byte first).\n      *\n      * @param data\n      *     The data to be decodes\n      * @param len\n      *     Length of the data, in bytes\n      * @returns\n      *     the decoded value\n      */\n    static address_t decode_little_endian(const data_t *data, size_t len);\n\n    /**\n      * The decode method is used to extract 'len' bytes\n      * from the given 'data' and assemble a valu\n      *\n      * @param data\n      *     The data to be decodes\n      * @param len\n      *     Length of the data, in bytes\n      * @param end\n      *     The byte order of the data.\n      * @returns\n      *     the decoded value\n      */\n    static address_t\n    decode(const data_t *data, size_t len, endian_t end)\n    {\n        return\n            (\n                end == endian_big\n            ?\n                decode_big_endian(data, len)\n            :\n                decode_little_endian(data, len)\n            );\n    }\n\n    /**\n      * The encode_big_endian method is used to break down 'val' into\n      * 'len' bytes of 'data' orderdd big-endian (most significan\n      * byte first).\n      *\n      * @param data\n      *     Where to place the encoded data\n      * @param val\n      *     The value to be encoded\n      * @param len\n      *     The number of bytes to use to encode the data.\n      *     Bits above the 8*len resolution will be discarded.\n      */\n    static void encode_big_endian(data_t *data, address_t val, size_t len);\n\n    /**\n      * The encode_little_endian method is used to break down\n      * 'val' into 'len' bytes of 'data' orderdd big-endian (least\n      * significan byte first).\n      *\n      * @param data\n      *     Where to place the encoded data\n      * @param val\n      *     The value to be encoded\n      * @param len\n      *     The number of bytes to use to encode the data.\n      *     Bits above the 8*len resolution will be discarded.\n      */\n    static void encode_little_endian(data_t *data, address_t val, size_t len);\n\n    /**\n      * The encode method is used to break down 'val' into 'len' bytes\n      * of 'data'\n      *\n      * @param data\n      *     Where to place the encoded data\n      * @param val\n      *     The value to be encoded\n      * @param len\n      *     The number of bytes to use to encode the data.\n      *     Bits above the 8*len resolution will be discarded.\n      * @param end\n      *     The byte order\n      */\n    static void\n    encode(data_t *data, address_t val, size_t len, endian_t end)\n    {\n        if (end == endian_big)\n            encode_big_endian(data, val, len);\n        else\n            encode_little_endian(data, val, len);\n    }\n\n    enum {\n    /**\n      * The max_data_length is the largest number of data bytes\n      * which any record can hold.\n      */\n    max_data_length = 255 };\n\nprivate:\n    /**\n      * The type instance variable is used to remember the type of\n      * the record.\n      */\n    type_t type;\n\n    /**\n      * The address instance variable is used to remember the address\n      * of the record.\n      */\n    address_t address;\n\n    /**\n      * The length instance variable is used to remember the number\n      * of valid bytes in the #data array.\n      */\n    size_t length;\n\n    /**\n      * The data instance variable is used to remember the data\n      * of the record.  Only the first #length bytes are valid,\n      * the rest are undefined.\n      */\n    data_t data[max_data_length];\n};\n\n};\n\n#endif // SRECORD_RECORD_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/sizeof.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2008, 2010, 2011 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General\n// Public License along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_SIZEOF_H\n#define SRECORD_SIZEOF_H\n\n#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))\n#define ENDOF(a) ((a) + SIZEOF(a))\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_SIZEOF_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/srecord.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2010-2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_SRECORD_H\n#define SRECORD_SRECORD_H\n\n#include <srecord/input.h>\n#include <srecord/input/catenate.h>\n#include <srecord/input/file.h>\n#include <srecord/input/file/aomf.h>\n#include <srecord/input/file/ascii_hex.h>\n#include <srecord/input/file/atmel_generic.h>\n#include <srecord/input/file/binary.h>\n#include <srecord/input/file/brecord.h>\n#include <srecord/input/file/coe.h>\n#include <srecord/input/file/cosmac.h>\n#include <srecord/input/file/dec_binary.h>\n#include <srecord/input/file/emon52.h>\n#include <srecord/input/file/fairchild.h>\n#include <srecord/input/file/fastload.h>\n#include <srecord/input/file/formatted_binary.h>\n#include <srecord/input/file/four_packed_code.h>\n#include <srecord/input/file/intel.h>\n#include <srecord/input/file/logisim.h>\n#include <srecord/input/file/mem.h>\n#include <srecord/input/file/mif.h>\n#include <srecord/input/file/mips_flash.h>\n#include <srecord/input/file/mos_tech.h>\n#include <srecord/input/file/msbin.h>\n#include <srecord/input/file/needham.h>\n#include <srecord/input/file/os65v.h>\n#include <srecord/input/file/ppb.h>\n#include <srecord/input/file/ppx.h>\n#include <srecord/input/file/signetics.h>\n#include <srecord/input/file/spasm.h>\n#include <srecord/input/file/spectrum.h>\n#include <srecord/input/file/srecord.h>\n#include <srecord/input/file/stewie.h>\n#include <srecord/input/file/tektronix.h>\n#include <srecord/input/file/tektronix_extended.h>\n#include <srecord/input/file/ti_tagged.h>\n#include <srecord/input/file/ti_tagged_16.h>\n#include <srecord/input/file/ti_txt.h>\n#include <srecord/input/file/trs80.h>\n#include <srecord/input/file/vmem.h>\n#include <srecord/input/file/wilson.h>\n#include <srecord/input/filter.h>\n#include <srecord/input/filter/and.h>\n#include <srecord/input/filter/bitrev.h>\n#include <srecord/input/filter/byte_swap.h>\n#include <srecord/input/filter/checksum.h>\n#include <srecord/input/filter/checksum/bitnot.h>\n#include <srecord/input/filter/checksum/negative.h>\n#include <srecord/input/filter/checksum/positive.h>\n#include <srecord/input/filter/crop.h>\n#include <srecord/input/filter/fill.h>\n#include <srecord/input/filter/interval.h>\n#include <srecord/input/filter/interval/length.h>\n#include <srecord/input/filter/interval/maximum.h>\n#include <srecord/input/filter/interval/minimum.h>\n#include <srecord/input/filter/message.h>\n#include <srecord/input/filter/message/adler16.h>\n#include <srecord/input/filter/message/adler32.h>\n#include <srecord/input/filter/message/crc16.h>\n#include <srecord/input/filter/message/crc32.h>\n#include <srecord/input/filter/message/fletcher16.h>\n#include <srecord/input/filter/message/fletcher32.h>\n#include <srecord/input/filter/message/gcrypt.h>\n#include <srecord/input/filter/not.h>\n#include <srecord/input/filter/offset.h>\n#include <srecord/input/filter/or.h>\n#include <srecord/input/filter/random_fill.h>\n#include <srecord/input/filter/sequence.h>\n#include <srecord/input/filter/split.h>\n#include <srecord/input/filter/unfill.h>\n#include <srecord/input/filter/unsplit.h>\n#include <srecord/input/filter/xor.h>\n#include <srecord/input/generator.h>\n#include <srecord/input/generator/constant.h>\n#include <srecord/input/generator/random.h>\n#include <srecord/input/generator/repeat.h>\n#include <srecord/memory.h>\n#include <srecord/memory/chunk.h>\n#include <srecord/memory/walker.h>\n#include <srecord/memory/walker/compare.h>\n#include <srecord/memory/walker/continuity.h>\n#include <srecord/memory/walker/gcrypt.h>\n#include <srecord/memory/walker/writer.h>\n#include <srecord/output.h>\n#include <srecord/output/file.h>\n#include <srecord/output/file/aomf.h>\n#include <srecord/output/file/ascii_hex.h>\n#include <srecord/output/file/asm.h>\n#include <srecord/output/file/atmel_generic.h>\n#include <srecord/output/file/basic.h>\n#include <srecord/output/file/binary.h>\n#include <srecord/output/file/brecord.h>\n#include <srecord/output/file/c.h>\n#include <srecord/output/file/cosmac.h>\n#include <srecord/output/file/dec_binary.h>\n#include <srecord/output/file/emon52.h>\n#include <srecord/output/file/fairchild.h>\n#include <srecord/output/file/fastload.h>\n#include <srecord/output/file/formatted_binary.h>\n#include <srecord/output/file/forth.h>\n#include <srecord/output/file/four_packed_code.h>\n#include <srecord/output/file/hexdump.h>\n#include <srecord/output/file/intel.h>\n#include <srecord/output/file/intel16.h>\n#include <srecord/output/file/logisim.h>\n#include <srecord/output/file/mif.h>\n#include <srecord/output/file/mips_flash.h>\n#include <srecord/output/file/mos_tech.h>\n#include <srecord/output/file/msbin.h>\n#include <srecord/output/file/needham.h>\n#include <srecord/output/file/os65v.h>\n#include <srecord/output/file/ppb.h>\n#include <srecord/output/file/ppx.h>\n#include <srecord/output/file/signetics.h>\n#include <srecord/output/file/spasm.h>\n#include <srecord/output/file/spectrum.h>\n#include <srecord/output/file/srecord.h>\n#include <srecord/output/file/stewie.h>\n#include <srecord/output/file/tektronix.h>\n#include <srecord/output/file/tektronix_extended.h>\n#include <srecord/output/file/ti_tagged.h>\n#include <srecord/output/file/ti_tagged_16.h>\n#include <srecord/output/file/ti_txt.h>\n#include <srecord/output/file/trs80.h>\n#include <srecord/output/file/vhdl.h>\n#include <srecord/output/file/vmem.h>\n#include <srecord/output/file/wilson.h>\n#include <srecord/quit.h>\n#include <srecord/quit/exception.h>\n#include <srecord/quit/normal.h>\n#include <srecord/quit/prefix.h>\n#include <srecord/record.h>\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_SRECORD_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/stm32.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n//      From: Hendrik Beijeman <hbeyeman@gmail.com>\n//      To: pmiller@opensource.org.au\n//      Subject: Re: patch for srecord 1.59\n//      Date: Sat, 05 May 2012 06:26:02 +0200 (05/05/12 14:26:02)\n//\n//      I hereby formally assign all copyright to the author of srecord,\n//      Peter Miller.\n//\n\n#include <iostream>\n#include <srecord/stm32.h>\n\n//\n// This code is mostly copied from the CRC32 implementation. The only\n// difference is that the STM32 operates on WORDs whereas the CRC32 is\n// byte-oriented.  In addition the STM32 uses a different polynomial.\n//\n#define POLYNOMIAL 0x04C11DB7\n\n\nsrecord::stm32::~stm32()\n{\n}\n\n\nsrecord::stm32::stm32() :\n    state(0xFFFFFFFF),\n    cnt(0)\n{\n}\n\n\nsrecord::stm32::stm32(const stm32 &arg) :\n    state(arg.state),\n    cnt(0)\n{\n    while (cnt < arg.cnt)\n    {\n        buf[cnt] = arg.buf[cnt];\n        ++cnt;\n    }\n}\n\n\nsrecord::stm32 &\nsrecord::stm32::operator=(const stm32 &arg)\n{\n    if (this != &arg)\n    {\n        state = arg.state;\n\n        cnt = 0;\n        while (cnt < arg.cnt)\n        {\n            buf[cnt] = arg.buf[cnt];\n            ++cnt;\n        }\n    }\n    return *this;\n}\n\n\n//\n// The STM32 hardware CRC calculation uses CRC polynomial 0x04C11DB7\n// and operates only on words.\n//\nstatic unsigned long\nstm32_crc(unsigned long crc, unsigned long data)\n{\n    crc ^= data;\n    for (int j = 0; j < 32; ++j)\n    {\n        if (crc & 0x80000000)\n            crc = (crc << 1) ^ POLYNOMIAL;\n        else\n            crc = (crc << 1);\n    }\n    return crc;\n}\n\n\nvoid\nsrecord::stm32::generator(void)\n{\n    unsigned long data = 0;\n    for (size_t j = 0; j < wordsize; j++)\n        data |= (buf[j] << (8 * j));\n    state = stm32_crc(state, data);\n    cnt = 0;\n}\n\n\nvoid\nsrecord::stm32::next(unsigned char x)\n{\n    buf[cnt++] = x;\n    if (cnt == wordsize)\n        generator();\n}\n\n\nvoid\nsrecord::stm32::nextbuf(const void *data, size_t nbytes)\n{\n    const unsigned char *dp = (const unsigned char *)data;\n    while (nbytes > 0)\n    {\n        --nbytes;\n        next(*dp++);\n    }\n}\n\n\nunsigned long\nsrecord::stm32::get(void)\n    const\n{\n    return state;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/stm32.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2012 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n//\n//      From: Hendrik Beijeman <hbeyeman@gmail.com>\n//      To: pmiller@opensource.org.au\n//      Subject: Re: patch for srecord 1.59\n//      Date: Sat, 05 May 2012 06:26:02 +0200 (05/05/12 14:26:02)\n//\n//      I hereby formally assign all copyright to the author of srecord,\n//      Peter Miller.\n//\n\n#ifndef SRECORD_STM32_H\n#define SRECORD_STM32_H\n\n#include <stddef.h>\n\nnamespace srecord\n{\n\n/**\n  * The stm32 class is used to represent the running value of a 32-bit\n  * cyclic redundancy check of series of bytes, for the STM32 series of\n  * microcontrollers.\n  * http://www.st.com/\n  */\nclass stm32\n{\npublic:\n    /**\n      * The destructor.\n      */\n    virtual ~stm32();\n\n    /**\n      * The default constructor.\n      */\n    stm32();\n\n    /**\n      * The copy constructor.\n      */\n    stm32(const stm32 &);\n\n    /**\n      * The assignment operator.\n      */\n    stm32 &operator=(const stm32 &);\n\n    /**\n      * The get method is used to obtain the running value of the cyclic\n      * redundancy check.\n      */\n    unsigned long get(void) const;\n\n    /**\n      * The next method is used to advance the state by one byte.\n      */\n    void next(unsigned char c);\n\n    /**\n      * The nextbuf method is used to advance the state by a series of bytes.\n      */\n    void nextbuf(const void *data, size_t data_size);\n\n    /**\n      * Word size on the STM32\n      */\n    static const size_t wordsize = 4;\n\nprivate:\n    /**\n      * Run the generator on the filled buffer.  The generator assumes\n      * the incomming bytestream is in little-endian order, which is safe\n      * considering this is for the STM32F series MPUs.\n      */\n    void generator(void);\n\n    /**\n      * The state instance variable is used to remember the running\n      * value of the 32-bit cyclic redundancy check.\n      */\n    unsigned long state;\n\n    /**\n      * Current counter of the byte feeding\n      */\n    size_t cnt;\n\n    /**\n      * Buffer the incomming stream to build a word to feed to the\n      * CRC generator.\n      */\n    unsigned char buf[wordsize];\n};\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_CRC32_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/string/quote_c.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/string.h>\n\n\nstd::string\nsrecord::string_quote_c(const std::string &arg)\n{\n    std::string result;\n    result += '\"';\n    const char *cp = arg.c_str();\n    for (;;)\n    {\n        unsigned char c = *cp++;\n        switch (c)\n        {\n        case '\\0':\n            result += '\"';\n            return result;\n\n        case '\\t':\n            result += \"\\\\t\";\n            break;\n\n        case '\\n':\n            result += \"\\\\n\";\n            break;\n\n        case '\\r':\n            result += \"\\\\r\";\n            break;\n\n        case '\\f':\n            result += \"\\\\f\";\n            break;\n\n        case '\\\\':\n            result += \"\\\\\\\\\";\n            break;\n\n        default:\n            if (isprint((unsigned char)c))\n                result += c;\n            else\n            {\n                result += '\\\\';\n                result += '0' + ((c >> 6) & 3);\n                result += '0' + ((c >> 3) & 7);\n                result += '0' + (c & 7);\n            }\n            break;\n        }\n    }\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/string/url_decode.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <sstream>\n\n#include <srecord/string.h>\n\n\nstatic bool\nunhex_nybble(char c, int &result)\n{\n    switch (c)\n    {\n    case '0': case '1': case '2': case '3': case '4':\n    case '5': case '6': case '7': case '8': case '9':\n        result = (c - '0');\n        return true;\n\n    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n        result = (c - 'A' + 10);\n        return true;\n\n    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n        result = (c - 'a' + 10);\n        return true;\n\n    default:\n        return false;\n    }\n}\n\n\nstatic bool\nunhex_byte(const char *text, char &retval)\n{\n    int c1 = 0;\n    if (!unhex_nybble(text[0], c1))\n        return false;\n    int c2 = 0;\n    if (!unhex_nybble(text[1], c2))\n        return false;\n    retval = ((c1 << 4) | c2);\n    return true;\n}\n\n\nstd::string\nsrecord::string_url_decode(const std::string &text)\n{\n    const char *begin = text.c_str();\n    const char *cur = begin;\n    const char *end = begin + text.size();\n    std::stringstream result;\n    while (cur < end)\n    {\n        unsigned char c = *cur++;\n        if (c == '%')\n        {\n            if (end - cur >= 1 && *cur == '%')\n            {\n                result << c;\n                ++cur;\n            }\n            else\n            {\n                if (end - cur >= 2)\n                {\n                    char whatsit;\n                    if (unhex_byte(cur, whatsit))\n                    {\n                        result << whatsit;\n                        cur += 2;\n                    }\n                }\n            }\n        }\n        else\n        {\n            result << c;\n        }\n    }\n    return result.str();\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/string/url_encode.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013, 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <sstream>\n#include <cstring>\n\n#include <srecord/string.h>\n\n\nstatic char\nnybble(unsigned x)\n{\n    x &= 0x0F;\n    if (x < 10)\n        return ('0' + x);\n    return (('A' - 10) + x);\n}\n\n\nstatic bool\nneeds_quoting(unsigned char x)\n{\n    if (x == '%')\n        return true;\n    if (x >= 0x80)\n        return true;\n    return !isprint(x);\n}\n\n\nstd::string\nsrecord::string_url_encode(const std::string &text)\n{\n    const char *begin = text.c_str();\n    const char *end = begin + text.size();\n    const char *cur = begin;\n    std::stringstream result;\n    while (cur < end)\n    {\n        unsigned char c = *cur++;\n        if (needs_quoting(c))\n        {\n            result << '%';\n            result << nybble(c >> 4);\n            result << nybble(c);\n        }\n        else\n        {\n            result << c;\n        }\n    }\n    return result.str();\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/string.h",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\n// more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_STRING_H\n#define SRECORD_STRING_H\n\n#include <string>\n\nnamespace srecord {\n\n/**\n  * The string_url_encode function build a new string by adding url\n  * quoting (\"$FF\")\n  */\nstd::string string_url_encode(const std::string &text);\n\n/**\n  * The string_url_decode function build a new string by removing url\n  * quoting (\"$FF\")\n  */\nstd::string string_url_decode(const std::string &text);\n\nstd::string string_quote_c(const std::string &text);\n\n};\n\n// vim: set ts=8 sw=4 et :\n#endif // SRECORD_STRING_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/versn_stamp.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2006, 2007, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify it\n// under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at your\n// option) any later version.\n//\n// This program is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\n// for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <iostream>\n\n#include <srecord/versn_stamp.h>\n#include <srecord/patchlevel.h>\n#include <srecord/progname.h>\n\n\nconst char *\nsrecord::version_stamp(void)\n{\n    return PATCHLEVEL;\n}\n\n\nconst char *\nsrecord::copyright_years(void)\n{\n    return COPYRIGHT_YEARS;\n}\n\n\nvoid\nsrecord::print_version(void)\n{\n    std::cout << progname_get() << \" version \" << version_stamp() << std::endl;\n    std::cout << \"Copyright (C) \" << copyright_years() << \" Peter Miller\"\n        << std::endl;\n    std::cout << std::endl;\n    std::cout << \"The \" << progname_get()\n        << \" program comes with ABSOLUTELY NO WARRANTY;\" << std::endl;\n    std::cout << \"for details use the '\" << progname_get()\n        << \" -LICense' command.\" << std::endl;\n    std::cout << \"The \" << progname_get()\n        << \" program is free software, and you are welcome\" << std::endl;\n    std::cout << \"to redistribute it under certain conditions; for\"\n        << std::endl;\n    std::cout << \"details use the '\" << progname_get() << \" -LICense' command.\"\n        << std::endl;\n}\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/versn_stamp.h",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 1998, 1999, 2002, 2006, 2007, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General\n// Public License along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n#ifndef SRECORD_COMMON_VERSN_STAMP_H\n#define SRECORD_COMMON_VERSN_STAMP_H\n\nnamespace srecord\n{\n\n/**\n  * The version_stamp function is used to obtain the version number,\n  * as a string.  This reflects Aegis' idea of the version, so you can\n  * re-create that Aegis version easily.\n  */\nconst char *version_stamp(void);\n\n/**\n  * The copyright_years function is used to obtain the range of\n  * copyright years for the copyright notice.  This reflects Aegis'\n  * tracking of the project, and updated automatically.\n  */\nconst char *copyright_years(void);\n\n/**\n  * The print_version function is used to print the program version, and\n  * brief copyright notice, to the standard output.\n  */\nvoid print_version(void);\n\n};\n\n#endif // SRECORD_COMMON_VERSN_STAMP_H\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord/vsnprintf.cc",
    "content": "//\n// srecord - manipulate eprom load files\n// Copyright (C) 2002, 2006, 2007, 2010 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as\n// published by the Free Software Foundation; either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General\n// Public License along with this program. If not, see\n// <http://www.gnu.org/licenses/>.\n//\n\n\n#include <srecord/config.h>\n\n\n#ifndef HAVE_SNPRINTF\n\nextern \"C\" int\nsnprintf(char *str, size_t size, const char *format, ...)\n{\n    va_start(ap, format);\n    vsnprintf(str, size, format, ap);\n    va_end(ap);\n}\n\n#endif\n\n\n#ifndef HAVE_VSNPRINTF\n\nextern \"C\" int\nvsnprintf(char *str, size_t size, const char *format, va_list ap)\n{\n    // We'll just have to hope for the best...\n    vsprintf(str, format, ap);\n}\n\n#endif\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/srecord-1.64.spec",
    "content": "#\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#\n#    W   W    A    RRRR   N   N   III  N   N  III  N   N   GGG\n#    W   W   A A   R   R  NN  N    I   NN  N   I   NN  N  G   G\n#    W   W  A   A  RRRR   N N N    I   N N N   I   N N N  G\n#    W W W  AAAAA  R R    N  NN    I   N  NN   I   N  NN  G  GG\n#    W W W  A   A  R  R   N   N    I   N   N   I   N   N  G   G\n#     W W   A   A  R   R  N   N   III  N   N  III  N   N   GGG\n#\n# Warning: DO NOT send patches which fix this file. IT IS NOT the original\n# source file. This file is GENERATED from the Aegis repository file manifest.\n# If you find a bug in this file, it could well be an Aegis bug.\n#\n# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n#\nSummary: srecord\nName: srecord\nVersion: 1.64.D001\nRelease: 1\nLicense: GPL\nGroup: Development/Tools\nSource: http://srecord.sourceforge.net/%{name}-%{version}.tar.gz\nURL: http://srecord.sourceforge.net/\nBuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)\nBuildPrereq: boost-devel, diffutils, ghostscript, groff, libgcrypt-devel\nBuildPrereq: libtool, sharutils\n\n%description\nThis package contains the shared libraries for programs that manipulate EPROM\nload files.\n\n%package bin\nSummary: srecord programs\n\n%description bin\nThe srecord package is a collection of powerful tools for manipulating EPROM\nload files. It reads and writes numerous EPROM file formats, and can perform\nmany different manipulations.\n\n%package libs0\nSummary: srecord libraries\nGroup: Development/Tools\n\n%description libs0\nThis package contains the shared libraries for programs that manipulate EPROM\nload files.\n\n%package devel\nSummary: srecord development files\nGroup: Development/Tools\nRequires: srecord-libs%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release}\n\n%description devel\nThis package contains static libraries and header files for compiling programs\nthat manipulate EPROM load files.\n\n%post\n/sbin/ldconfig\n\n%postun\n/sbin/ldconfig\n\n\n%prep\n%setup -q\n\n\n%build\n%configure --sysconfdir=/etc --prefix=%{_prefix} --mandir=%{_mandir}\nmake\n\n\n%install\nrm -rf $RPM_BUILD_ROOT\nmake DESTDIR=$RPM_BUILD_ROOT install\nrm -f $RPM_BUILD_ROOT/usr/lib/*.la\n\n\n%check\nmake sure\n\n\n%clean\nrm -rf $RPM_BUILD_ROOT\n\n\n%files bin\n%defattr (-,root,root,-)\n%doc LICENSE BUILDING README\n%doc %{_datarootdir}/doc/srecord/BUILDING.pdf\n%doc %{_datarootdir}/doc/srecord/README.pdf\n%doc %{_datarootdir}/doc/srecord/change_log.pdf\n%doc %{_datarootdir}/doc/srecord/reference.pdf\n%{_bindir}/srec_cat\n%{_bindir}/srec_cmp\n%{_bindir}/srec_info\n%{_mandir}/man1/srec_cat.1\n%{_mandir}/man1/srec_cmp.1\n%{_mandir}/man1/srec_examples.1\n%{_mandir}/man1/srec_info.1\n%{_mandir}/man1/srec_input.1\n%{_mandir}/man1/srec_license.1\n%{_mandir}/man5/srec_aomf.5\n%{_mandir}/man5/srec_ascii_hex.5\n%{_mandir}/man5/srec_atmel_generic.5\n%{_mandir}/man5/srec_binary.5\n%{_mandir}/man5/srec_brecord.5\n%{_mandir}/man5/srec_coe.5\n%{_mandir}/man5/srec_cosmac.5\n%{_mandir}/man5/srec_dec_binary.5\n%{_mandir}/man5/srec_emon52.5\n%{_mandir}/man5/srec_fairchild.5\n%{_mandir}/man5/srec_fastload.5\n%{_mandir}/man5/srec_formatted_binary.5\n%{_mandir}/man5/srec_forth.5\n%{_mandir}/man5/srec_fpc.5\n%{_mandir}/man5/srec_idt.5\n%{_mandir}/man5/srec_intel.5\n%{_mandir}/man5/srec_intel16.5\n%{_mandir}/man5/srec_logisim.5\n%{_mandir}/man5/srec_mem.5\n%{_mandir}/man5/srec_mif.5\n%{_mandir}/man5/srec_mips_flash.5\n%{_mandir}/man5/srec_mos_tech.5\n%{_mandir}/man5/srec_motorola.5\n%{_mandir}/man5/srec_msbin.5\n%{_mandir}/man5/srec_needham.5\n%{_mandir}/man5/srec_os65v.5\n%{_mandir}/man5/srec_ppb.5\n%{_mandir}/man5/srec_ppx.5\n%{_mandir}/man5/srec_signetics.5\n%{_mandir}/man5/srec_spasm.5\n%{_mandir}/man5/srec_spectrum.5\n%{_mandir}/man5/srec_stewie.5\n%{_mandir}/man5/srec_tektronix.5\n%{_mandir}/man5/srec_tektronix_extended.5\n%{_mandir}/man5/srec_ti_tagged.5\n%{_mandir}/man5/srec_ti_tagged_16.5\n%{_mandir}/man5/srec_ti_txt.5\n%{_mandir}/man5/srec_trs80.5\n%{_mandir}/man5/srec_vmem.5\n%{_mandir}/man5/srec_wilson.5\n\n\n%files libs\n%defattr (-,root,root,-)\n%{_libdir}/libsrecord.so.*\n\n\n%files devel\n%defattr (-,root,root,-)\n%{_includedir}/srecord/adler16.h\n%{_includedir}/srecord/adler32.h\n%{_includedir}/srecord/crc16.h\n%{_includedir}/srecord/crc32.h\n%{_includedir}/srecord/defcon.h\n%{_includedir}/srecord/endian.h\n%{_includedir}/srecord/fletcher16.h\n%{_includedir}/srecord/fletcher32.h\n%{_includedir}/srecord/format_printf.h\n%{_includedir}/srecord/input.h\n%{_includedir}/srecord/input/catenate.h\n%{_includedir}/srecord/input/file.h\n%{_includedir}/srecord/input/file/aomf.h\n%{_includedir}/srecord/input/file/ascii_hex.h\n%{_includedir}/srecord/input/file/atmel_generic.h\n%{_includedir}/srecord/input/file/binary.h\n%{_includedir}/srecord/input/file/brecord.h\n%{_includedir}/srecord/input/file/cosmac.h\n%{_includedir}/srecord/input/file/dec_binary.h\n%{_includedir}/srecord/input/file/emon52.h\n%{_includedir}/srecord/input/file/fairchild.h\n%{_includedir}/srecord/input/file/fastload.h\n%{_includedir}/srecord/input/file/formatted_binary.h\n%{_includedir}/srecord/input/file/four_packed_code.h\n%{_includedir}/srecord/input/file/intel.h\n%{_includedir}/srecord/input/file/logisim.h\n%{_includedir}/srecord/input/file/mif.h\n%{_includedir}/srecord/input/file/mips_flash.h\n%{_includedir}/srecord/input/file/mos_tech.h\n%{_includedir}/srecord/input/file/msbin.h\n%{_includedir}/srecord/input/file/needham.h\n%{_includedir}/srecord/input/file/os65v.h\n%{_includedir}/srecord/input/file/ppb.h\n%{_includedir}/srecord/input/file/ppx.h\n%{_includedir}/srecord/input/file/signetics.h\n%{_includedir}/srecord/input/file/spasm.h\n%{_includedir}/srecord/input/file/spectrum.h\n%{_includedir}/srecord/input/file/stewie.h\n%{_includedir}/srecord/input/file/tektronix.h\n%{_includedir}/srecord/input/file/tektronix_extended.h\n%{_includedir}/srecord/input/file/ti_tagged.h\n%{_includedir}/srecord/input/file/ti_tagged_16.h\n%{_includedir}/srecord/input/file/ti_txt.h\n%{_includedir}/srecord/input/file/trs80.h\n%{_includedir}/srecord/input/file/vmem.h\n%{_includedir}/srecord/input/file/wilson.h\n%{_includedir}/srecord/input/filter.h\n%{_includedir}/srecord/input/filter/and.h\n%{_includedir}/srecord/input/filter/bitrev.h\n%{_includedir}/srecord/input/filter/byte_swap.h\n%{_includedir}/srecord/input/filter/checksum.h\n%{_includedir}/srecord/input/filter/checksum/bitnot.h\n%{_includedir}/srecord/input/filter/checksum/negative.h\n%{_includedir}/srecord/input/filter/checksum/positive.h\n%{_includedir}/srecord/input/filter/crop.h\n%{_includedir}/srecord/input/filter/fill.h\n%{_includedir}/srecord/input/filter/interval.h\n%{_includedir}/srecord/input/filter/interval/length.h\n%{_includedir}/srecord/input/filter/interval/maximum.h\n%{_includedir}/srecord/input/filter/interval/minimum.h\n%{_includedir}/srecord/input/filter/message.h\n%{_includedir}/srecord/input/filter/message/adler16.h\n%{_includedir}/srecord/input/filter/message/adler32.h\n%{_includedir}/srecord/input/filter/message/crc16.h\n%{_includedir}/srecord/input/filter/message/crc32.h\n%{_includedir}/srecord/input/filter/message/fletcher16.h\n%{_includedir}/srecord/input/filter/message/fletcher32.h\n%{_includedir}/srecord/input/filter/message/gcrypt.h\n%{_includedir}/srecord/input/filter/not.h\n%{_includedir}/srecord/input/filter/offset.h\n%{_includedir}/srecord/input/filter/or.h\n%{_includedir}/srecord/input/filter/random_fill.h\n%{_includedir}/srecord/input/filter/sequence.h\n%{_includedir}/srecord/input/filter/split.h\n%{_includedir}/srecord/input/filter/unfill.h\n%{_includedir}/srecord/input/filter/unsplit.h\n%{_includedir}/srecord/input/filter/xor.h\n%{_includedir}/srecord/input/generator.h\n%{_includedir}/srecord/input/generator/constant.h\n%{_includedir}/srecord/input/generator/random.h\n%{_includedir}/srecord/input/generator/repeat.h\n%{_includedir}/srecord/interval.h\n%{_includedir}/srecord/memory.h\n%{_includedir}/srecord/memory/chunk.h\n%{_includedir}/srecord/memory/walker.h\n%{_includedir}/srecord/memory/walker/compare.h\n%{_includedir}/srecord/memory/walker/continuity.h\n%{_includedir}/srecord/memory/walker/gcrypt.h\n%{_includedir}/srecord/memory/walker/writer.h\n%{_includedir}/srecord/output.h\n%{_includedir}/srecord/output/file.h\n%{_includedir}/srecord/output/file/aomf.h\n%{_includedir}/srecord/output/file/ascii_hex.h\n%{_includedir}/srecord/output/file/asm.h\n%{_includedir}/srecord/output/file/atmel_generic.h\n%{_includedir}/srecord/output/file/basic.h\n%{_includedir}/srecord/output/file/binary.h\n%{_includedir}/srecord/output/file/brecord.h\n%{_includedir}/srecord/output/file/c.h\n%{_includedir}/srecord/output/file/cosmac.h\n%{_includedir}/srecord/output/file/dec_binary.h\n%{_includedir}/srecord/output/file/emon52.h\n%{_includedir}/srecord/output/file/fairchild.h\n%{_includedir}/srecord/output/file/fastload.h\n%{_includedir}/srecord/output/file/formatted_binary.h\n%{_includedir}/srecord/output/file/forth.h\n%{_includedir}/srecord/output/file/four_packed_code.h\n%{_includedir}/srecord/output/file/hexdump.h\n%{_includedir}/srecord/output/file/intel.h\n%{_includedir}/srecord/output/file/intel16.h\n%{_includedir}/srecord/output/file/logisim.h\n%{_includedir}/srecord/output/file/mif.h\n%{_includedir}/srecord/output/file/mips_flash.h\n%{_includedir}/srecord/output/file/mos_tech.h\n%{_includedir}/srecord/output/file/msbin.h\n%{_includedir}/srecord/output/file/needham.h\n%{_includedir}/srecord/output/file/os65v.h\n%{_includedir}/srecord/output/file/ppb.h\n%{_includedir}/srecord/output/file/ppx.h\n%{_includedir}/srecord/output/file/signetics.h\n%{_includedir}/srecord/output/file/spasm.h\n%{_includedir}/srecord/output/file/spectrum.h\n%{_includedir}/srecord/output/file/stewie.h\n%{_includedir}/srecord/output/file/tektronix.h\n%{_includedir}/srecord/output/file/tektronix_extended.h\n%{_includedir}/srecord/output/file/ti_tagged.h\n%{_includedir}/srecord/output/file/ti_tagged_16.h\n%{_includedir}/srecord/output/file/ti_txt.h\n%{_includedir}/srecord/output/file/trs80.h\n%{_includedir}/srecord/output/file/vhdl.h\n%{_includedir}/srecord/output/file/vmem.h\n%{_includedir}/srecord/output/file/wilson.h\n%{_includedir}/srecord/quit.h\n%{_includedir}/srecord/quit/exception.h\n%{_includedir}/srecord/quit/normal.h\n%{_includedir}/srecord/quit/prefix.h\n%{_includedir}/srecord/record.h\n%{_includedir}/srecord/srecord.h\n%{_includedir}/srecord/string.h\n%{_libdir}/pkgconfig/srecord.pc\n%{_mandir}/man3/srecord.3\n%{_mandir}/man3/srecord_license.3\n%{_libdir}/libsrecord.a\n%{_libdir}/libsrecord.so\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0001a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"basic srecord functionality\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1130000285F245F2212226A000424290008237C2A\nS11300100002000800082629001853812341001813\nS113002041E900084E42234300182342000824A952\nS107003000144ED492\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000285F245F2212226A000424290008237C0002000800082629001853812341001851\nS117002041E900084E42234300182342000824A900144ED418\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0002a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec_cmp functionality\"\n. test_prelude\n\ncat > test.in1 << 'fubar'\nS00600004844521B\nS1130000285F245F2212226A000424290008237C2A\nS11300100002000800082629001853812341001813\nS113002041E900084E42234300182342000824A952\nS107003000144ED492\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in2 << 'fubar'\nS00600004844521B\nS117002041E900084E42234300182342000824A900144ED418\nS1230000285F245F2212226A000424290008237C0002000800082629001853812341001851\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp -dsw test.in1 test.in2\nif test $? -ne 0; then fail; fi\n\ncat > test.in3 << 'fubar'\nS00600004844521B\nS117002041E900084E42234300182342000824A900144ED418\nS1230000285F245F2212226A000424290008237C0002000800082629001853812341001851\nS10400F0000B\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp -dsw test.in1 test.in3 > LOG 2>&1\nif test $? -ne 2; then cat LOG; fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0003a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2002, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel functionality\"\n. test_prelude\n\ncat > test.in << 'fubar'\n:10000000DB00E60F5F1600211100197ED300C3004C\n:1000100000000101030307070F0F1F1F3F3F7F7FF2\n:01002000FFE0\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000DB00E60F5F1600211100197ED300C30000000101030307070F0F1F1F3F3F7F7F4A\nS1040020FFDC\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -intel -o test.out -motorola -header HDR > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000DB00E60F5F1600211100197ED300C30000000101030307070F0F1F1F3F3F7F7F4A\nS1040020FFDC\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:020000040000FA\n:20000000DB00E60F5F1600211100197ED300C30000000101030307070F0F1F1F3F3F7F7F4E\n:01002000FFE0\n:0400000500000000F7\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -motorola -o test.out -intel > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.in1 << 'fubar'\n:10000000DB00E60F5F1600211100197ED300C3004C\n:1000100000000101030307070F0F1F1F3F3F7F7FF2\n:01002000FFE0\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in2 << 'fubar'\n:20000000DB00E60F5F1600211100197ED300C30000000101030307070F0F1F1F3F3F7F7F4E\n:01002000FFE0\n:0400000500000000F7\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp test.in1 -intel test.in2 -intel > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0004a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"offset filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1130000285F245F2212226A000424290008237C2A\nS11300100002000800082629001853812341001813\nS113002041E900084E42234300182342000824A952\nS107003000144ED492\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230013285F245F2212226A000424290008237C000200080008262900185381234100183E\nS117003341E900084E42234300182342000824A900144ED405\nS5030002FA\nS9030013E9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 19 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0005a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"binary file\"\n. test_prelude\n\ncat > test.in << 'fubar'\nHello, World!\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS110000048656C6C6F2C20576F726C642186\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -binary -crop 0 13 -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nHello, World!\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -binary\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0006a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"crop filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300005468697320697320612074657374206F66207468652063726F702066696C746589\nS1230020722E0A5765206E6565642061206C6172676520656E6F75676820626C6F636B20FD\nS1210040746F206578657273697A6520616C6C206F66207468652063617365732E0A16\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n#\n# [===data===]\n#      [========crop========]\n#\ncat > test.ok << 'fubar'\nS00600004844521B\nS123003220656E6F75676820626C6F636B20746F206578657273697A6520616C6C206F66F9\nS10F0052207468652063617365732E0AD6\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crop 50 10000 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n#       [===data===]\n# [===crop===]\n#\ncat > test.ok << 'fubar'\nS00600004844521B\nS11900805468697320697320612074657374206F662074686520FB\nS5030001FB\nS90300807C\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 128 -crop 50 150 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# [======data======]\n#    [===crop===]\n#\ncat > test.ok << 'fubar'\nS00600004844521B\nS117003220656E6F75676820626C6F636B20746F2065786580\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crop 50 70 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n#    [===data===]\n# [======crop======]\n#\ncat > test.ok << 'fubar'\nS00600004844521B\nS12300805468697320697320612074657374206F66207468652063726F702066696C746509\nS12300A0722E0A5765206E6565642061206C6172676520656E6F75676820626C6F636B207D\nS12100C0746F206578657273697A6520616C6C206F66207468652063617365732E0A96\nS5030003F9\nS90300807C\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 128 -crop 50 10000 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# [===data===]\n#              [===crop===]\n#\ncat > test.ok << 'fubar'\nS00600004844521B\nS5030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crop 10000 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n#              [===data===]\n# [===crop===]\n#\nsrec_cat test.in -offset 256 -crop 0 128 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0007a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2002, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"exclude filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000436F70797269676874202843292031393938205065746572204D696C6C65723B94\nS11900200A416C6C207269676874732072657365727665642E0A3A\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:020000040000FA\n:05000000436F707972EE\n:20000A002843292031393938205065746572204D696C6C65723B0A416C6C20726967687406\n:0C002A00732072657365727665642E0A9F\n:0400000500000000F7\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat - -exclude 5 10 -o - -intel < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0008a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fill filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000436F70797269676874202843292031393938205065746572204D696C6C65723B94\nS11900200A416C6C207269676874732072657365727665642E0A3A\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000436F707972FFFFFFFFFF2843292031393938205065746572204D696C6C65723B65\nS12300200A416C6C207269676874732072657365727665642E0AFFFFFFFFFFFFFFFFFFFF3A\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat - -exclude 5 10 -fill 0xFF 0 64 < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0009a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 1998, 1999, 2006-2008, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"length filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000436F70797269676874202843292031393938205065746572204D696C6C65723B94\nS11900200A416C6C207269676874732072657365727665642E0A3A\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS107010000000236BF\nS1230300436F70797269676874202843292031393938205065746572204D696C6C65723B91\nS11903200A416C6C207269676874732072657365727665642E0A37\nS5030003F9\nS9030300F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat - -offset 0x300 -length-be 0x100 < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS107010036020000BF\nS1230300436F70797269676874202843292031393938205065746572204D696C6C65723B91\nS11903200A416C6C207269676874732072657365727665642E0A37\nS5030003F9\nS9030300F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat - -offset 0x300 -length-le 0x100 < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0010a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"c-array format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned char bogus[] =\n{\n0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,\n0x21, 0x0A,\n};\nconst unsigned long bogus_termination = 0x00000000;\nconst unsigned long bogus_start       = 0x00000000;\nconst unsigned long bogus_finish      = 0x0000000E;\nconst unsigned long bogus_length      = 0x0000000E;\n\n#define BOGUS_TERMINATION 0x00000000\n#define BOGUS_START       0x00000000\n#define BOGUS_FINISH      0x0000000E\n#define BOGUS_LENGTH      0x0000000E\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -c-array bogus\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0011a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-crop -within\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000436F70797269676874202843292031393938205065746572204D696C6C65723B94\nS119002020416C6C207269676874732072657365727665642E0A24\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > mask << 'fubar'\nS00600004844521B\nS10700005858585898\nS10700105858585888\nS10700205858585878\nS10700305858585868\nS5030004F8\nS9030030CC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1070000436F70795D\nS10700103938205007\nS107002020416C6C9F\nS10700307276656417\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crop -within mask -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0012a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-crop -over\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000436F70797269676874202843292031393938205065746572204D696C6C65723B94\nS119002020416C6C207269676874732072657365727665642E0A24\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > mask << 'fubar'\nS00600004844521B\nS10700005858585898\nS10700105858585888\nS10700205858585878\nS5030003F9\nS9030030CC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000436F70797269676874202843292031393938205065746572204D696C6C65723B94\nS107002020416C6C9F\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crop -over mask -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0013a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 1998, 1999, 2006-2008, 2012, 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"checksum filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS10701000000047380\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in --Checksum_Positive_Big_Endian 0x100 -o  test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS106010073040081\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in --checksum-pos-little-endian 0x100 3 -o  test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0014a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998-2000, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec_info\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"HDR\"\nExecution Start Address: 00000000\nData:   0000 - 000D\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0015a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 1998, 1999, 2006-2008, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"maximum filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS21201000048656C6C6F2C20576F726C64210A79\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10702000001000EE7\nS21201000048656C6C6F2C20576F726C64210A79\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -maximum-be 0x0200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff -c test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10702000E000100E7\nS21201000048656C6C6F2C20576F726C64210A79\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -maximum-le 0x0200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff -c test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0016a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 1998, 1999, 2006-2008, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"minimum filter\";\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS21201000048656C6C6F2C20576F726C64210A79\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS107020000000200F4\nS21201000048656C6C6F2C20576F726C64210A79\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -minimum-be 0x0200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff -c test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS107020000020000F4\nS21201000048656C6C6F2C20576F726C64210A79\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -minimum-le 0x0200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff -c test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0017a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"generous input\"\n. test_prelude\n\ncat > test.in << 'fubar'\nignore garbage lines\nS111000048656C6C6F2C20576F726C64210A7B\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -header HDR > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.in << 'fubar'\nignore garbage lines\n:0E00000048656C6C6F2C20576F726C64210A7F\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -intel -o test.out -header HDR > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0018a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"default input\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0019a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"tektronix write\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030100FB\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/00000E0E48656C6C6F2C20576F726C64210AB3\n/01000001\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -mot -o test.out -tek\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0020a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"tektronix write\"\n. test_prelude\n\ncat > test.in << 'fubar'\n/00000E0E48656C6C6F2C20576F726C64210AB3\n/01000001\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030100FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -tek -o test.out -mot -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0021a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel segment addressing\"\n. test_prelude\n\ncat > test.in << 'fubar'\n:020000021000EC\n:20FFFD002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AA4\n:0400000300000000F9\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS2210100002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A1B\nS20701FFFD2A2A2A7D\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -dsw test.in -int -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0022a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel 32-bit output\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:020000040001F9\n:0E00000048656C6C6F2C20576F726C64210A7F\n:0400000500010000F6\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 0x10000 -o test.out -intel\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# make sure we can read out own output\n#\nsrec_cat test.out -intel -o test.out2 -intel\nif test $? -ne 0; then fail; fi\n\ndiff test.out test.out2\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0023a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"tektronix input\"\n. test_prelude\n\ncat > test.in << 'fubar'\n/00000E0E48656C6C6F2C20576F726C64210AB3\n/00000000\n// This is the end of the file\nignore this line completely\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -tek -o test.out -mot -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0024a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"split filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS123000054686520717569636B2062726F776E20666F78206A756D7073206F76657220740A\nS11000206865206C617A7920646F672E0A90\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS11A0000546571696B626F6E66786A6D736F65206820617964670A55\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -split 2 0 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS121000068657175636B6272776E666F206A6D70206F65727468206C7A79646F2E0A9C\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -split 3 1 2 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0025a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"unsplit filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS105000048654D\nS10500036C6C1F\nS10500066F2C59\nS105000920577A\nS105000C6F720D\nS105000F6C641B\nS1050012210ABD\nS5030007F5\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -unsplit 3 0 2 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0026a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"unsplit filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nHello, World!\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nHello, World!\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bin -split 2 0 -o test.even > log 2>&1\nif test $? -ne 0; then cat log; fail; fi\n\nsrec_cat test.in -bin -split 2 1 -o test.odd > log 2>&1\nif test $? -ne 0; then cat log; fail; fi\n\nsrec_cat test.even -unsplit 2 0 test.odd -unsplit 2 1 \\\n        -o test.out -bin > log 2>&1\nif test $? -ne 0; then cat log; fail; fi\n\ndiff test.out test.ok\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0027a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"or filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS11100004A676E6E6F2E22576F726E66230A69\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -or 0x02 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0028a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"and filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048646C6C6C2C20546C706C6420088A\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -and 0xFC -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0029a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1998, 1999, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"xor filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000068454C4C4F0C00774F524C44012A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -xor 0x20 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0030a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 1999, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"WindowsNT binary\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS11A0000546869732069730A61206E617374790D0A746573742E0D85\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.int -bin > log 2>&1\nif test $? -ne 0; then cat log; fail; fi\n\nsrec_cat test.int -bin -o test.out -header HDR > log 2>&1\nif test $? -ne 0; then cat log; fail; fi\n\ndiff test.in test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0031a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2006-2008, 2013 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"line length\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1190000416E642057696E646F7773204D75737420446965210AA2\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1090000416E6420576903\nS10900066E646F777320A5\nS109000C4D7573742044DD\nS10700126965210AED\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -line-leng 26\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0032a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000-2002, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"data only\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS111000048656C6C6F2C20576F726C64210A7B\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -data-only\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\n:020000040000FA\n:0E00000048656C6C6F2C20576F726C64210A7F\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -intel -data-only\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\n/00000E0E48656C6C6F2C20576F726C64210AB3\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -tek -data-only\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0033a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"wilson format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS123000016BCE78D82BA86FC3BB52876C7509572DE88A48326862D938186AFDE8C4C65A2C0\nS1230020094C308B06B687416CAFB833004DA5DED54962FCD08F8F51153E2FA18B9444947D\nS1230040E0741FE62AA7289656E0C9562D6E3503B897FF88268ED93BCC08DD579D21EB7DC0\nS10E0060950B64BFB28C56086C1F5F48\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.uue << 'fubar'\nS00600004844521B\nS1230000236540404040563B3CE7CDC23B3AC6FC7B3B3568B63C3790D5B23D3EC83A34C3D3\nS123002066C66DD3C1C63A3F3D3ECC8CA53A323B3E0A236540404060498C70CB463B36C7B3\nS123004081AC3A3F3B3873408D3A353D3E3D3589A2FC3D30CFCF91557E6F3A31CBD484D480\nS1230060BB0A236540404080E0B45FE66A3A3768D696E03C39966DAE75433B38D7FFC86632\nS1230080CE3D397B3C3C483D3D97DD61EBBD3B3E0A2350404040A0D54BA43B3F3B32CC9683\nS11100A048AC5F9F860A274540404040FA0A5C\nS5030006F6\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.ok.uue -o test.ok -bin\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -wilson\nif test $? -ne 0; then fail; fi\n\ncmp test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# Test input\n#\nmv test.out test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS123000016BCE78D82BA86FC3BB52876C7509572DE88A48326862D938186AFDE8C4C65A2C0\nS1230020094C308B06B687416CAFB833004DA5DED54962FCD08F8F51153E2FA18B9444947D\nS1230040E0741FE62AA7289656E0C9562D6E3503B897FF88268ED93BCC08DD579D21EB7DC0\nS10E0060950B64BFB28C56086C1F5F48\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -wilson -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0034a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"byte swap filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000065486C6C2C6F5720726F646C0A217B\nS5030001FB\nS9030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bs -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0035a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ascii-hex format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\n# test writing the format\n#\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.srec << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS123000002202441303132332C0A3438203635203643203643203646203243203230203528\nS12100203720364620373220364320363420323120304120030A2453303437332C0A83\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.ok.srec -o test.ok -bin\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 0x123 -o test.out -asc-hex\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n#\n# test reading the format\n#\ncat > test.in.uue << 'fubar'\nS00600004844521B\nS123000002203438203635203643203643203646203243203230202441303031332C203514\nS11900203720364620373220364320363420323120304120030A06\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.uue -o test.in -bin\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10A000048656C6C6F2C20B5\nS10A0013576F726C64210AAF\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -asc-hex -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0036a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2006-2008, 2010 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-tagged format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\n# Test writing the format\n#\ncat > test.in << 'fubar'\nS00600004844521B\nS10A000048656C6C6F2C20B5\nS10A0123576F726C64210A9E\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nK0008HDR90000B4865B6C6CB6F2C*2090123B576FB726CB6421*0A7F3DCF\n:\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ti-tagged\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n\n# --------------------------------------------------------------------------\n#\n# Test reading the format\n#\ncat > test.ok << 'fubar'\nS00A00006F756768696E6704\nS10A000048656C6C6F2C20B5\nS10A0123576F726C64210A9E\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in << 'fubar'\nK000Coughing7FBBAF\nB4865B6C6CB6F2C*207FBBDF\n90123B576FB726CB6421*0A7FAD2F\n:\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -ti-tagged -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0037a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2003, 2006-2008, 2013 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"tekext format, write\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n%2A6DE80000006B48656C6C6F2C20576F726C64210A\n%0E82F80000006B\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -off 107 -o test.out -tekext 2> LOG\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0037b.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2003, 2006-2008, 2013 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"tekext format, read\"\n. test_prelude\n\n#\n# Test reading this format\n#\ncat > test.in << 'fubar'\n%1A626810000000202020202020\n%0E81F810000000\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS30B1000000020202020202024\nS5030001FB\nS70510000000EA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -tekext -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0038a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"mos-tech format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\n# make sure we can write the format\n#\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n;0E000048656C6C6F2C20576F726C64210A0481\n;0000010001\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -mos-tech\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n\n# --------------------------------------------------------------------------\n#\n# make sure we can read the format\n#\ncat > test.in << 'fubar'\n;0E000048656C6C6F2C20576F726C64210A0481\n;0000010001\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -mos-tech -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0039a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"format guessing\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"HDR\"\nExecution Start Address: 00000000\nData:   0000 - 000D\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.in -guess > test.out 2>test.err\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n#\ncat > test.in << 'fubar'\n:0E00000048656C6C6F2C20576F726C64210A7F\n:0400000500000000F7\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nFormat: Intel Hexadecimal (MCS-86)\nExecution Start Address: 00000000\nData:   0000 - 000D\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.in -guess > test.out 2>test.err\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n#\ncat > test.in << 'fubar'\nK0005B4865B6C6CB6F2CB2057B6F72B6C64B210A7F6C7F\n:\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nFormat: Texas Instruments Tagged (SDSMAC)\nData:   0000 - 000D\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.in -guess > test.out 2>test.err\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0040a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec_cmp --verbose\"\n. test_prelude\n\ncat > test.one << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C642E0A6E\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.two << 'fubar'\nS00600004844521B\nS111000068656C6C6F5F5F686F726C642E0ACB\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok1 << 'fubar'\nDifferent:      (0x1, 0x2, 0x4 - 0xd)\nLeft only:      0xe\nRight only:     0x0\nExecution start address 1 not equal to 0.\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok2 << 'fubar'\nDifferent:      (0x1, 0x2, 0x4 - 0xd)\nLeft only:      0xe\nRight only:     0\nExecution start address 1 not equal to 0.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp -verbose test.one -offset 1 test.two > test.out 2>&1\nif test $? -ne 2; then fail; fi\n\ndiff test.ok1 test.out > LOG 2>&1 || diff test.ok2 test.out >> LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0050a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 2000, 2006-2008, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"positive checksum\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1070100480DF92782\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -checksum-pos-be 0x100 4 4 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1070100470EF92782\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -checksum-pos-le 0x100 4 4 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0051a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 2000, 2006-2008, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"2s compl checksum\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1070100B7F206D96F\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -checksum-neg-be 0x100 4 4 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1070100B9F106D86F\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -checksum-neg-le 0x100 4 4 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0052a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"VHDL output\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n-- HDR\n--\n-- Generated automatically by srec_cat -VHDL - do not edit\n--\nlibrary IEEE;\nuse IEEE.numeric_std.all;\nuse work.eprom_defs_pack.all;\n\npackage eprom_pack is\n constant eprom_rom : eprom_rom_array;\nend package eprom_pack;\n\npackage body eprom_pack is\n constant eprom_rom : eprom_rom_array := eprom_rom_array'(\n  0 => eprom_entry(72),\n  1 => eprom_entry(101),\n  2 => eprom_entry(108),\n  3 => eprom_entry(108),\n  4 => eprom_entry(111),\n  5 => eprom_entry(44),\n  6 => eprom_entry(32),\n  7 => eprom_entry(87),\n  8 => eprom_entry(111),\n  9 => eprom_entry(114),\n  10 => eprom_entry(108),\n  11 => eprom_entry(100),\n  12 => eprom_entry(33),\n  13 => eprom_entry(10),\n  others => eprom_dont_care\n );\nend package body eprom_pack;\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -vhdl\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0053a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 2000, 2001, 2006-2008, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"crc16\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1050100A46BEA\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0055a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 2000, 2001, 2006-2008, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"crc32\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1070100B4E89E8439\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc32be 0x100 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0056a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"C-array\"\n. test_prelude\n\nmkdir foo\ntest $? -eq 0 || no_result\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10A000048656C6C6F2C2DA8\nS10A0010576F726C64210AB2\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned char eprom[] =\n{\n0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x2D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0A,\n};\nconst unsigned long eprom_termination = 0x00000000;\nconst unsigned long eprom_start       = 0x00000000;\nconst unsigned long eprom_finish      = 0x00000017;\nconst unsigned long eprom_length      = 0x00000017;\n\n#define EPROM_TERMINATION 0x00000000\n#define EPROM_START       0x00000000\n#define EPROM_FINISH      0x00000017\n#define EPROM_LENGTH      0x00000017\nfubar\ntest $? -eq 0 || no_result\n\nsrec_cat test.in -o foo/test.out -ca -incl\ntest $? -eq 0 || fail\n\ndiff test.ok foo/test.out\ntest $? -eq 0 || fail\n\ncat > test.h.ok << 'fubar'\n#ifndef FOO_TEST_H\n#define FOO_TEST_H\n\nextern const unsigned long eprom_termination;\nextern const unsigned long eprom_start;\nextern const unsigned long eprom_finish;\nextern const unsigned long eprom_length;\nextern const unsigned char eprom[];\n\n#endif /* FOO_TEST_H */\nfubar\ntest $? -eq 0 || no_result\n\ndiff test.h.ok foo/test.h\ntest $? -eq 0 || fail\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0057a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2000, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"C-array output\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300005468652070726F626C656D206F63637572726564207768656E2074686572652009\nS123002077617320612066696C746572207573656420696E206164646974696F6E20746F13\nS1230040207468650A432D4172726179206F757470757420666F726D61742E2020497420FD\nS1230060707574206578747261207374756666206F6E2074686520737461636B2C20616EE8\nS12300806420736F20736F6D650A432D417272617920696E7374616E636520766172696101\nS12300A0626C65732C207768696368206A7573742068617070656E656420746F20626520E2\nS12300C07A65726F2C206A7573742068617070656E640A6E6F20746F206265207A65726F99\nS11400E02C206D616B696E672061206D6573732E0AB7\nS5030008F4\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned char eprom[] =\n{\n0x54, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6F, 0x62, 0x6C, 0x65, 0x6D, 0x20,\n0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x72, 0x20, 0x75, 0x73, 0x65,\n0x64, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F,\n0x6E, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x0A, 0x43, 0x2D, 0x41,\n0x72, 0x72, 0x61, 0x79, 0x20, 0x6F, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,\n0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x2E, 0x20, 0x20, 0x49, 0x74, 0x20,\n0x70, 0x75, 0x74, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x73, 0x74,\n0x75, 0x66, 0x66, 0x20, 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,\n0x74, 0x61, 0x63, 0x6B, 0x2C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x73, 0x6F,\n0x20, 0x73, 0x6F, 0x6D, 0x65, 0x0A, 0x43, 0x2D, 0x41, 0x72, 0x72, 0x61,\n0x79, 0x20, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x20, 0x76,\n0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x73, 0x2C, 0x20, 0x77, 0x68,\n0x69, 0x63, 0x68, 0x20, 0x6A, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x70,\n0x70, 0x65, 0x6E, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x62, 0x65, 0x20,\n0x7A, 0x65, 0x72, 0x6F, 0x2C, 0x20, 0x6A, 0x75, 0x73, 0x74, 0x20, 0x68,\n0x61, 0x70, 0x70, 0x65, 0x6E, 0x64, 0x0A, 0x6E, 0x6F, 0x20, 0x74, 0x6F,\n0x20, 0x62, 0x65, 0x20, 0x7A, 0x65, 0x72, 0x6F, 0x2C, 0x20, 0x6D, 0x61,\n0x6B, 0x69, 0x6E, 0x67, 0x20, 0x61, 0x20, 0x6D, 0x65, 0x73, 0x73, 0x2E,\n0x0A,\n};\nconst unsigned long eprom_termination = 0x00000000;\nconst unsigned long eprom_start       = 0x00000000;\nconst unsigned long eprom_finish      = 0x000000F1;\nconst unsigned long eprom_length      = 0x000000F1;\n\n#define EPROM_TERMINATION 0x00000000\n#define EPROM_START       0x00000000\n#define EPROM_FINISH      0x000000F1\n#define EPROM_LENGTH      0x000000F1\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -exclude 13 42 -o test.out -ca\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0058a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008, 2014 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-multiple\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1140000436F6D706C65746520527562626973680AB9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -rb=ignore -cb=ignore > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\nsrec_cmp -dsw test.in test.out -rb=ignore -cb=ignore > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0059a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-addr-len\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS3130000000048656C6C6F2C20576F726C64210A79\nS5030001FB\nS70500000000FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -addrlen=4\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0060a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"memory chunk iterator\"\n. test_prelude\n\ncat > test.in.srec << 'fubar'\nS00A0000746573742E696E30\nS1230000D46EBDDE679162F728C97423D8B8ACD103E3E275D6383B02A05DBFA2F9F475B021\nS1230020421C58D8C68B45162F288CBFF07FEB22E184550747074F93FB1C32DE00169D3F5A\nS123004069EB95183E0AFCF7C59C6ECF3E1425664AA9324C43FF7EE9A3AAE11A466229882A\nS1230060E1B1D00B068995A22340314D5363D7B5883D464362A99C67CCE2BA035ECFF5BD80\nS12300800D9FA8D055F00CA046A175A3AA06DFA3232EF2CDCB3DD4CC4814838914F4834625\nS12300A012E0306409C153A71892CAAE6BBE28D94F9469349B461636ACE8891F047C9B5D45\nS12300C0B9F62AFD38EEFC127AD925F2156274BE0443900DBE4E74BE5EDE3843D35DDE9781\nS12300E080A2D28BB22F67A6AC364D997BB2C680F43A37704548C9D0039E689E63CAE3DFC3\nS12301002C6BD9B1863463E0359AFAE53BC18B3AAE6335FBD15E67A0F4456032ED4B8BA3A6\nS12301203261893DAF1688419614BA7F18054B6AA9714D01C367BBE5B42F4C0266803DE6B3\nS1230140AE87D6A56A446F9B26D059048ACDE643320A111D9F5A15F279EEDD8CFBC7976865\nS12301608550C61ADC78E3EE58DF4BFB3752930EDA44DAA3AD36D2D6A1A0538A6E7274AEB4\nS12301806B2D9D85D4723A3ED39460251CAF52E60529A6E73C82723FBA105FF62D795F376F\nS12301A0B541DC43ABE6773867C232E55AFF44099D124A8BDABE28B580FD8BE2AB21D5D7A5\nS12301C02B7DE36C620D1247E4A8B03067FE5D636F2AF1A0B58C450E4F7721FEE2291BED15\nS12301E0FAA657F6BF9CCC2B9FC719DF0BB9BF7A92C72DF9B895F442137387C32171D049E4\nS5030010EC\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nDifferent:      0x40 - 0x43\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.srec -o test.in -bin\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bin -exclude 0x40 0x44 -becrc32 0x40 -o test.out -bin \\\n    > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\nsrec_cmp -v test.in -bin test.out -bin > log\nif test $? -ne 2; then fail; fi\n\ndiff test.ok log\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0061a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"bitwise-not filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1110000B79A939390D3DFA8908D939BDEF56F\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -not -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0062a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"unfill filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300002BB62152DF32840E10AE628F87804D0D90C8F4719185F4AC539F8FF4BD33EABD56\nS123002046B5634BBE65A1205FE4F3E67F8247C1EB8D180BE2636EB2498F09DBE31E44D336\nS1230040C89EDF7157401A5CB159FCBF2E061D736D0AF2BEDA14B58D4482CE5E80C8658BCF\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS12300002BB62152DF32840E10AE628F87804D0D90C8F4719185F4AC539F8FF4BD33EABD56\nS10E002046B5634BBE65A1205FE4F30E\nS123002C7F8247C1EB8D180BE2636EB2498F09DBE31E44D3C89EDF7157401A5CB159FCBF4B\nS117004C2E061D736D0AF2BEDA14B58D4482CE5E80C8658B57\nS5030004F8\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -unfill 0xE6 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0063a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"SPASM write\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n0000 6548\n0001 6C6C\n0002 2C6F\n0003 5720\n0004 726F\n0005 646C\n0006 0A21\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -spasm\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\n0000 4865\n0001 6C6C\n0002 6F2C\n0003 2057\n0004 6F72\n0005 6C64\n0006 210A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -spasmle\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\n0001 6C6C\n0002 6F2C\n0003 2057\n0004 6F72\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crop 2 10 -o test.out -spasmle\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0065a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"SPASM read\"\n. test_prelude\n\ncat > test.in << 'fubar'\n0000 6548\n0001 6C6C\n0002 2C6F\n0003 5720\n0004 726F\n0005 646C\n0006 0A21\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -spasm -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0066a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"tektronix format write\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300007035569B64D86309D19FA14439839DD06C3768B1E17406A4BEC3720F13BCB3F0F1\nS12300202C3F4EC78A52260314DEA57281952564FADA8110A2C0A098E8929EF401780AAE53\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/000020027035569B64D86309D19FA14439839DD06C3768B1E17406A4BEC3720F13BCB3F0AE\n/002020042C3F4EC78A52260314DEA57281952564FADA8110A2C0A098E8929EF401780AAEB3\n/00000000\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -tek\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0067a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fill filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\n:0400000501D0010025\n:0200000401D029\n:200000000000000054444D202020202020202020202020202020000000000000000000001B\n:200020000000000000000000000000000000000000000000000000000000000000000000C0\n:040040000000C39069\n:10010000FAFCE91100000090C36689C0E9A306006B\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS32501D0000454444D202020202020202020202020202020000000000000000000000000000040\nS32501D00024000000000000000000000000000000000000000000000000000000000000C39092\nS32501D00044FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5\nS32501D00064FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5\nS32501D00084FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5\nS32501D000A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85\nS32501D000C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65\nS32501D000E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFCE91151\nS32501D0010400000090C36689C0E9A30600FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84\nS32501D00124FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04\nS32501D00144FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4\nS32501D00164FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4\nS32501D00184FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4\nS32501D001A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84\nS32501D001C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64\nS32501D001E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44\nS32501D00204FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23\nS32501D00224FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03\nS32501D00244FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3\nS32501D00264FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3\nS32501D00284FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3\nS32501D002A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83\nS32501D002C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63\nS32501D002E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43\nS32501D00304FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22\nS32501D00324FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02\nS32501D00344FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2\nS32501D00364FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2\nS32501D00384FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2\nS32501D003A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82\nS32501D003C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62\nS32101D003E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42\nS5030020DC\nS70501D0010028\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -intel \\\n        -exclude 0x1D00000 0x1D00004 \\\n        -fill 0xff 0x1D00004 0x1D00400 \\\n        -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0068a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Atmel Generic read\"\n. test_prelude\n\ncat > test.in << 'fubar'\n000000:2c01\n000001:9413\n000002:940e\n000003:0050\n000050:0c12\n000051:9508\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10B00002C019413940E00502E\nS10700A00C1295089D\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -ag -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0069a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Atmel Generic write\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10B00002C019413940E00502E\nS10700A00C1295089D\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n000000:2C01\n000001:9413\n000002:940E\n000003:0050\n000050:0C12\n000051:9508\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ag\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0070a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"FourPackedCode format\"\n. test_prelude\n\n#---------------------------------------------------------------------------\n#\n# Test reading the format\n#\ncat > test.in << 'fubar'\n$kL&@h%%,:,B.\\?00EPuX0K3rO0JI))\n$;UPR'%%,:<Hn&FCG:at<GVF(;G9wIw\n$7FD1p%%,:LHmy:>GTV%/KJ7@GE[kYz\n$B[6\\;%%,:\\KIn?GFWY/qKI1G5:;-_e\n$%%%%%\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS123B000576F77212044696420796F75207265616C6C7920676F207468726F7567682061DF\nS120B0206C6C20746861742074726F75626C6520746F207265616420746869733F73\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fpc -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#---------------------------------------------------------------------------\n#\n# Test writing the format\n#\ncat > test.ok << 'fubar'\n$mbw6)%%,:,B.\\?00EPuX0K3rO0JI))Hn&FCG:at<GVF(;G9wIw\n$K%6Re%%,:LHmy:>GTV%/KJ7@GE[kYzKIn?GFWY/qKI1G5:;-_e\n$%%%%%\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fpc -o test.out -fpc\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0071a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Signetics format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\n# Test reading the format\n#\ncat > test.in << 'fubar'\n:B00010A5576F77212044696420796F75207265617B\n:B01010E56C6C7920676F207468726F756768206136\n:B02010256C6C20746861742074726F75626C652068\n:B0300D5F746F207265616420746869733FD1\n:B03D00\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS123B000576F77212044696420796F75207265616C6C7920676F207468726F7567682061DF\nS120B0206C6C20746861742074726F75626C6520746F207265616420746869733F73\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -signetics -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n#\n# Test writing the format\n#\ncat > test.ok << 'fubar'\n:B00020C5576F77212044696420796F75207265616C6C7920676F207468726F75676820614D\n:B0201D3F6C6C20746861742074726F75626C6520746F207265616420746869733FDC\n:B03D00\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -signetics -o test.out -signetics\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\nsrec_cmp test.in -sig test.out -sig\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0072a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"EMON52 format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\n# Test reading the format.\n#\ncat > test.in << 'fubar'\n10 0000:57 6F 77 21 20 44 69 64 20 79 6F 75 20 72 65 61 0564\n10 0010:6C 6C 79 20 67 6F 20 74 68 72 6F 75 67 68 20 61 05E9\n10 0020:6C 6C 20 74 68 69 73 20 74 72 6F 75 62 6C 65 20 05ED\n10 0030:74 6F 20 72 65 61 64 20 74 68 69 73 20 73 74 72 05F0\n04 0040:69 6E 67 21 015F\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000576F77212044696420796F75207265616C6C7920676F207468726F75676820618F\nS12300206C6C20746869732074726F75626C6520746F2072656164207468697320737472DF\nS1070040696E672159\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -emon52 -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n#\n# Test writing the format.\n#\ncat > test.ok << 'fubar'\n10 0000:57 6F 77 21 20 44 69 64 20 79 6F 75 20 72 65 61 0564\n10 0010:6C 6C 79 20 67 6F 20 74 68 72 6F 75 67 68 20 61 05E9\n10 0020:6C 6C 20 74 68 69 73 20 74 72 6F 75 62 6C 65 20 05ED\n10 0030:74 6F 20 72 65 61 64 20 74 68 69 73 20 73 74 72 05F0\n04 0040:69 6E 67 21 015F\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -emon52 -o test.out -emon52\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\nsrec_cmp test.in -emon52 test.out -emon52\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0073a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec_cat -header\"\n. test_prelude\n\ncat > test.in << 'fubar'\nHello, World!\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS01100005468697320697320612074657374F9\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bin -o test.out -header \"This is a test\" > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"This is a test\"\nData:   0000 - 000D\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.out > test.out2 2> LOG\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out2\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0075a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2003, 2006-2008, 2014 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"DEC Binary format\"\n. test_prelude\n\n# -------------------------------------------------------------------------\n#\n# Test reading the format.\n#\n# (This is a tad verbose, but it's a \"real\" DEC Binary file,\n# found in the wild on the Internet.)\n#\ncat > test.in.srec << 'fubar'\nS00600004844521B\nS123000000000000000000000000000000000000000000000000000001000A0000005F0072\nS1230020DC00BA00000000000001000A0004000002E0000F00000000000001000A00080013\nS12300400202E0000900000000000001000A000C000402E0000300000000000001000A00A4\nS123006010000602E000FD00000000000001000A0014000A02E000F5000000000000010086\nS12300800A0018000802E000F300000000000001000A0040008A13C000580000000000005D\nS12300A001000A00D000DE138000B400000000000001000A00D4004A14800043000000003C\nS12300C0000001000A00D8003202E000090000000000000100740044000000000000000063\nS12300E00000000000000000000000000000000000000000000000000000000000000000FC\nS12301000000000000000000000000000000000000000000000000000000000000000000DB\nS12301200000000000000000000000CE000000000000009E0000000000000000000000004F\nS12301400000000000B0002B00000000000001006401DC000500C0152A18C115FC1F01E090\nS1230160810C810CD01500F7100AC10AFB06C015E034C115FE3F01E0810C810CD01500F7CC\nS1230180100AC10AFB061F0AFEFFC615FE3FC0153E01011402030914FC01DF092801FD01E0\nS12301A00100C0176C0006031F0A6C001F106E00DF093A0587004400FFFF4600BAFF480085\nS12301C00000560000005A00000054001027580078EC5C0010AA5E00D85960004B00AA2505\nS12301E071026200FFFF68003075700000006E0000006C0000008400000094000000960023\nS1230200CE00CE002814980000009E00940100F4F21666FF4000C2340000BA340000DA34A4\nS12302200000CA340000D23400008C16F2168E1628179016AC179216C617F416F09D0E177F\nS1230240F09D2A17F09D4617F09D6217F09D7C17F09D9617F09DAE17F09DC817F09DE2173E\nS1230260F09DFC17F09D1618F09D9A00F4019C000A00C02500F70000000000000000000081\nS12302800000DF15CE009600DF152814CE001F0A9400DF15F21600F4DF15400066FFC615E3\nS12302A0FE3F1F0AFEFF5F0022011F0A94002610661077000000000000010064013A02C112\nS12302C0159E165F003E14041045101F0A80001F0A8200DF15FF7F86000715260ADF09C8EF\nS12302E0020E01E6150040DF09C802DF278200840002040E0A0401DF20840001040E0A80AD\nS123030010C2E780000380020BCE550020C245C0FFC200020C1F108000C110C3E782000388\nS123032080030BCE554000C345C0FF5F1082005F20860002045F10860083508355D510CCB4\nS1230340011515CA01D51500F7150A87000095C1174A00DF095E12A6100093C1174C00DFC1\nS1230360095E128EE0009DFFFFC1174C00DF095E12A6100095C1174A00DF095E128265834C\nS123038015030B8700DF0B68005103C0176400C1150429DF094A11C0156400DF096C12DF0A\nS12303A0106600C110C0176E00DF094A11C015DC05DF096C12C3E768000581030ADF1500B5\nS12303C0F7C0250C01030BDF0BC0250803D720D00705041F0AC025DF55000002F4DF1068E2\nS12303E000020AC0150A00DF096C12C365DC37DF106A00C0176600C115D73EDF094A1100A9\nS123040011DF096C12DF104E00C010C1174A00DF095E129F105000C0174E00C11776000068\nS1230420000000000100640198034C00DF095E12C2E56E0A9F1052008700DF1500F7C0259C\nS12304401F0A6600DF15DC376A00DF6768006A001F0A4E001F0A5000DF1592F5520087003C\nS12304600110C4176400840C840C840C029D66279F0A8A00C3178A00C345E0FFC39C7327D5\nS1230480C2609F608C00C3178C00C345FCFFC4150C00C515B027C3659327D5949590C56512\nS12304A00600C40AFA069F0A9000DF45FCFF9000DF6580018E00DF457FFC8E00DF15548C28\nS12304C0A827DF579000A827DF578E00A827C015A2275F004202C0174600078017204CFFBA\nS12304E00A06C06568010780F9011720B4000307C0E56801FA811F1046000280C0656801D6\nS1230500C00C1F1CDC314A0017201C020205C0E5D0021F1C90324C008700C117500001802D\nS1230520010BC0176E00DF094A11C015B80BDF096C12DF0B50000180030BC210830CC367D1\nS123054054009F605400E610C1100180010BC0176E00DF094A11C0155802C3675600420B18\nS1230560DF096C12D60B0180030BDF605C009F105600C11752000180010BC0176E00DF091D\nS12305804A11C015B80BDF09CB00000000000001006401F6046C12DF0B52000180030BC246\nS12305A010830CC36758009F605800E610C1100180010BC0176E00DF094A11C0155802C3F1\nS12305C0675A00420BDF096C12D60B0180030BDF605E009F105A008700DF15C0FF8400C50A\nS12305E01744001F0A4400C0176E0041110180010BDF094A11C0153C00C3674800420BDF19\nS1230600096C12C50B0180030BDF6046009F104800DF094404DF6502009200C1179200C141\nS123062045FDFF411CAC34C015D8266610DF0942029F15BA34DF1786008800DF1760006463\nS123064000DF090003DF098804C4175C00C4658057840C840C840C840C840C1F1172000589\nS123066011C40CC465F02800150063800C1F107C00C0E75E00000B1F107E00DF0B66000890\nS123068007C0158835DF09CE03DF158835C23402011F0AC234C4177200368117210A0033C2\nS12306A00717217A033504C4175E0053811721A86134041721C2014D07DF177200B4348498\nS12306C00C840C840C840C840CC4652B001F11B634DF0B9E000403DF09EC0C1F0A9E00DF47\nS12306E0097815C4177E00C4E510000C80C0158002DF0915000000000000010064015406AE\nS1230700060E9F119E00DF09EC0C1F0A9E00DF09320E8700C0150D00C115FC1F0801C0156C\nS12307207703C1151C2003010011C1156220C00CC00CC00CC00CC00CC0E580571F105C00B9\nS12307405F10CA341F0A68001F0A5400C3175E00830C830C0181030BDF1058005F003A054F\nS1230760CE279E006C03C0177200C0E509001F107400C00CC00CC00CC00CC00CC0E5805761\nS12307801F107600DF09040F9F139E00C0175C00C0E776000310C00C0360830CDF10B4346D\nS12307A0020AC0153000DF096C12C3677400DF107800C30CC410C015300080E08510011DFE\nS12307C0F028DF093A12E6104011011DF228DF093A12020AC015300083650580030BDF09A2\nS12307E06C12030B0201DF096C12C410830C830CDF107C00DF090C101F117A00C0175E00C0\nS12308000310C30C0360830CC3651700DF10B634DF651800B63403E1C4100180030B020A4F\nS1230820C0150300C30CDF096C12C40B0180030BDF107E00DF095608DF090A0A8700C0173C\nS12308405C00C0E7760017201E00070717204402A105C0177200C00A8A01C0177200D700D7\nS1230860000000000001001000B207C0E511008501D70BBA0757000000000000010014005F\nS1230880BA070000E90357211E00E606170AC607CE00000000000001006401C607C607DF8A\nS12308A0154424CA345F000A0957210F00DC06D7275800A8FD3507DF155223CA341F0ABA5D\nS12308C034DF09320E57211A00CE061721A8FD2807DF157E23CA34E6150300DF0B54000176\nS12308E0818E0A2610DF09900CDFE51000B634DF09040FDF09320E57211A00B506DF0B66A3\nS123090000B203260A2610DF09900CDF15B823CA34DF09040FA80157211100A5061721A8AF\nS1230920FD5C07DF15FE23CA34DF09320EDF097815C5177E002981572103002907C41758C1\nS1230940001721A8FD15051721D4FE160517216AFF1705D727CA340A2102021F0ACA34C0A8\nS12309601778002610DF09CA0C8115C10C7900EC0FDF15AC20CA34F301DF15D820CA34EF8E\nS123098001DF150A21CA34EB015721F6FF26071F0A6000DF15C201AA251F0AC2341F0AD286\nS12309A034C50B0103DC80C41758001721A8FD15071721D4FE0F0717216AFF09071721B0EA\nS12309C0FF0307C0154E211601C01576211301C015A4211001C015CE210D01DF151222CAC0\nS12309E034C0152000DF09060EDF09040F1F0ABA34DF09320E1F0AC2341F105F00000000E7\nS1230A000000010064012409CA34D727540064001B06D72754009CFF1705D7274600F1FF2D\nS1230A201805D72746000F001406C1177800C10C401CF22840ECF02802100180020B9720FA\nS1230A4030000C04DF09060BC0175400C115C6220701C0174600C11558220201C1151423EB\nS1230A605F10C234C1177800E6150300C00B01818E0A6610DF09900CC10C421CF22842EC6D\nS1230A80F0288310C30C8360830C830CC2E08310830CC26006809720D3FF0804C215D3FF2D\nS1230AA0050197202D000207C2152D00C3155A00C00B0180030BC2609F104600C11792002E\nS1230AC0C1650200C145FDFF5F109200411CAC346610DF094404C015D826DF0942029F1551\nS1230AE0BA34DFE50700B634DF09AA130A00D7277E0096007704C515CA35C41764001721C3\nS1230B003F000207C4153F00440C440C440C440CC4457FFCC455509C1511D72746002D0011\nS1230B206106D7274600D3FF5D05C1174A000180010BC017B634C0E77A000410DF094A11EA\nS1230B40C0174C00DF096C12C460DF0B4A000181030BC367B434D510D5177A00D51500B029\nS1230B60C4E596003F80F100000000000001006401820A040B0011C1176400DF094A11836E\nS1230B800C830C830C830C3403E610C2156009820C820C8E2001868E10C217B000C315C01B\nS1230BA0FFC2677000820AC240809C6627C2675200C240C040C000000C440AC445FFDFC420\nS1230BC05500400051819C6627C14040501510C0654020C04500C01510CE0AE206D51500B2\nS1230BE0F70D0A9F10B000D60BDF15CA35D23487001F0AD2348700DF09AA13FCFFDF17B423\nS1230C00347A26DF17B6347C26DF157826D234DF357F007000FC02DF0BBA075203C31710F7\nS1230C2026C3E7B434C2171226C2E77C26C2650300A6100203DF09360CC3171026C3E77A59\nS1230C4026C3651900E610020ADF09360CDF15A224CA34DF09AA13F8FF1F0ACA34DF09AAF0\nS1230C6013FEFF0E0B8313020ADF09360C83158215020B0203DF09360CDF09AA13FEFFDF8F\nS1230C806504005E00DF65D00768001F0A58001F0A6C00C615FE3F1F0ACA341F0A46001F23\nS1230CA00A5400DF151E006000DF092801DF0B9E00F2021F0ABA341F0AC234DF09AA1303F5\nS1230CC000E6150100E6177800DF09900CC215E8FFAC00000000000001006401E00BC31588\nS1230CE03000C5177000050C0186030BE610DF09360C8315020ADF09360CDF177A26AC2678\nS1230D00DF177C26AE26DF651400AC26DF15A826C234C0177800DF09720CDF09720CE6156B\nS1230D2002002610DF09900CDF15D624CA34DF09AA130A00C515800AC30B0380C515C00AFF\nS1230D40030B5F11720C050AC20B0503850A83100280030B050BC0177A26DF09720C1F10E1\nS1230D607A265F617C26DF09760CC30AF606870000008700DF3507007000FC03DF0978152D\nS1230D80DF3507007000FC02DF09781587002611841D0400840C0C86F60C0600F60C0600BC\nS1230DA0F60C0600F60C0600F4C5F00013300301F4C50F001330B4DD060013308415B613E8\nS1230DC00400C665040087002611841D0400840C049D13300486840C840C840C840CC44532\nS1230DE0F0FE3611040084158700DF093C0DC417F028840C840C840C840C840CC465170062\nS1230E0015111F118200D515508CC015F028C06508000412840C840C840C840C840CC46507\nS1230E201700DF09780DF301D51500F70D0ADF152A18DA34DF09660D8700A610040000005E\nS1230E40000000010064013E0DE610261066102611DF15E100A0001F0ADA341F0ABA07C5A9\nS1230E60152A18D5155498D515A0F0150A7E000A00B6130C008415841581158015831582D4\nS1230E80158700E6150002172100040587C415FF031F2182000803C40B0480040ADF0B8278\nS1230EA0000203CE550040DF0AA2001B809F0AA400DF45FCFFA4009F0AA400DF17A400A207\nS1230EC000DF658002A600DF457FFCA6009F0AA800DF45FCFFA800CD17A600CD57A800D51A\nS1230EE055048CC4E782000880040BC445C0FF1FE18200C45540000401C445C0FF1F6182D3\nS1230F000084551511DF0AA0000206CE6502008700C11772004410C10CC165F028E61503DA\nS1230F20004514431045E201818E0A2611DF09900C11E023E0800C000BFB0287001F0AAE1F\nS1230F40001F0AC2341F0AD234DF55000002F4C515CA35C417AC00840AC400040C4463C4E8\nS1230F60457FFCC455509C1511DF09980EDF55000002F4DFE50A00AE00DF09980ED51500D6\nS1230F80F70D0ADF15CA35C234DF55000002F4DF652100AE00D727AE00C000D907DF09AA3B\nS1230FA0130500DF15E2FFB9000000000000010064019C0E4600E615F100DF094404801D78\nS1230FC0FAFF800C800AC0677000C067AC001F10AC00C045E0FF049C7327C467AE001B8126\nS1230FE00011C1174C00DF095E12C267B4341381C255004095100011C1174A00DF095E1234\nS1231000C267B634078195109F0A4600CE0AD506D60B8700250A150A150AF601DF093C0DED\nS12310201F0AAA00C0177400C00CC065F0280412DF090C10C40B0280040A050117210004CA\nS12310400287C415FF0315111F118200D515508C26110414DF090C1001118415020A26104A\nS1231060C0150C0001E10880C1E50600010B4310DF096C12030B0501C16506004310DF0935\nS12310806C12C110021080159F0AAA00D727AA0003000405DF15DF0A700F0701D727AA0043\nS12310A0FDFF0306DF159F0A700FC467AA0044602611DF09780D010104018415C20AE40698\nS12310C0C701C2177400CE151300C01518008310C30CC365F028A610820ADF09CA0C8415D9\nS12310E0C40CFC09FC0FD30BC0653000CE0AF306D60BD51500F70D0ADF09660DDF152A189E\nS1231100DA3487009007EE07200840084008D207B8078800000000000001006401FA0FB8AB\nS123112007040E1E10B81028103210E010900714112611C40C8465840C840C840CC4651796\nS1231140008700DF093C1000001700E8FFDF093C10A6FF1000EEFFDF093C105A001000EE70\nS1231160FF5721961F3A826610A610E61026112610801D0A00D51500989513E6174600C41C\nS123118012DF090C102611C41C0200DF090C108465840C1F14460004641F1284001511F3F0\nS12311A022020008030482DF65EAFF46000301DF6516004600DF0944044111C015D826DF2B\nS12311C0094202250A250A9F154600DF09440480158415831582158115D60B87005721C69D\nS12311E01F2A821F10AC26C412DF090C100111C41C0200DF090C104460840C1F11AE26C154\nS123120015A82613015721C21F16821F10DC25C412DF090C100111C41C0200DF090C10449C\nS123122060840C1F11DE25C115D8254414172100F702031511FA018700DF0BC60717031798\nS12312402019001407172070031104C41C0200C4220104C412DF090C101F1112261F101029\nS1231260269F11BA07D51500F7D5150C268700030A40200586421025030110A1001A000011\nS123128000000000010064015811020102102003420C1F87420C2187420C2487420C278764\nS12312A0420C2A87420C2D87420C3087420C3387420C3687420C3987420C3C87420C3F87DE\nS12312C0420C4287420C4587420C4887020A431087004310C30C420C02864360420BC30C1F\nS12312E0420C02864360420BC30C420C02864360420BC30C420C02864360420BC30C420CDD\nS123130002864360420BC30C420C02864360420BC30C420C02864360420BC30C420C028682\nS12313204360420BC30C420C02864360420BC30C420C02864360420BC30C420C0286436047\nS1231340420BC30C420C02864360420BC30C420C02864360420BC30C420C02864360420B7D\nS1231360C30C420C02864360420B8700C00B0780000BC10B0780010BDF094A118700C10BFB\nS1231380FB80010BDF094A11030B420B020B8700DF093A12C30C420CC30C420C8700C30CCC\nS12313A0420C02E03E80C30C420C02603F80C30C420C02604080C30C420C02604180C30CAF\nS12313C0420C02604280C30C420C02604380C30C420C02604480C30C420C02604580C30CFF\nS12313E0420C02604680C30C6D00000000000001006401B612420C02604780C30C420C0273\nS1231400604880C30C420C02604980C30C420C02604A80C30C420C02604B80C30C420C02A6\nS1231420604C80C30C420C02604D8002608700830AC30C420C02E0C181830AC30C420C02CD\nS1231440E0C081830AC30C420C02E0BF81830AC30C420C02E0BE81830AC30C420C02E0BD87\nS123146081830AC30C420C02E0BC81830AC30C420C02E0BB81830AC30C420C02E0BA81830C\nS12314800AC30C420C02E0B981830AC30C420C02E0B881830AC30C420C02E0B781830AC32C\nS12314A00C420C02E0B681830AC30C420C02E0B581830AC30C420C02E0B481830AC30C4294\nS12314C00C02E0B381830A8700DF55400066FF9F0A6C009F0A7000DF350F00700004021F13\nS12314E00A3A151F0A3C150200DF1500F7C025801F0000C117700002100180000BC1653C5C\nS123150000C00AFC060100DF0978155F207000FA82CE650200C20BD7815F00DC00261066E9\nS123152010C0179600C11F16E01B03E01700F4C8650200E0152414572200F70B02F10B0274\nS1231540000F036010C8650400E0152414411C0200F2016E00000000000001006401141459\nS12315601F1096005F1000F481158015020007140114E8019F0A9400C1179400C10C411C26\nS1231580061503021F0A9400F701DF152814CE00C015CE00D70126106610C11794005F2062\nS12315A09A000603DF150F009C005F109A002801DF0A9C002580C10C79004015C11706F41C\nS12315C0C14500FCC1650D00C017AA25C00CC00CC00CC0E7AA250160810C810C810C5F10DB\nS12315E0AA25C1E5DB01810C57200A000280C1150A00C12564000204C11564005F106000CD\nS1231600DF55010000F4811580150200411C0615C01798000303F045080002005F1098003D\nS1231620F15518000200EC01C0179800E9031F0A980031108C16F04508000200E101411CDC\nS123164006155F1CFEFF44005F103A155F103C15D7019E16B216C616DA16F2160C172817A7\nS1231660441760177A179417AC17C617E017FA171418B034C034C834D034D83422255625DE\nS1231680422576258825000000000000DC14DC14DC14DC14C014C014C014C014C014C014DF\nS12316A0C014C014C014C014C014C01422142214221422142214F214F214F214F214BC004C\nS12316C000000000000100640172157014F214F21426106610A610E61026116611040A0570\nS12316E01D8C162003011D96164311C3650A00F1101200431FFCFF401DFEFF0A03C30B010E\nS123170080030B020ADF096C12FD0BFCFF0180030B051D9616C010C1150A004161DF0974B7\nS123172016D40BDD01DF27600062000803C115B825C01760001F106200DF097416851584F4\nS12317401583158215811580158700D1952000172010271F86D1952000260A172064002481\nS1231760050310020AC0156400DF096C12C30CC3651428DF095816DF0958168310C30CC39E\nS1231780651428DF095816CE11DF095816C66502008700E611D195300017201027DE87B154\nS12317A08AFFFFC0E51027F8010210C3151428E101F60B02000902D7A230000402D195207D\nS12317C000830A8700B6110200D1948700C00BBD80000BDF09F2154010E0A52000FD02C87E\nS12317E0952D008700F2160C172817441700009E16B216C616DA16A0F0F09E0000DA020095\nS12318008020202020202000E0FC16A0F0F09EFA00DA02008020202020202000E01617A0B1\nS1231820F0F09EF401DA020080B600000000000001006001D01620202020202000E03217EE\nS1231840A0F0F09EEE02DA02008020202020202000E04E177E000000B0F0F09D8403F700EC\nS12318600080204845494748542000F700005E000000B0F0F09D8403E100008020414C5480\nS123188049545544452000F700005C000000B0F0F09D8403CB0000802044495354414E4331\nS12318A0452000F7000068000A00B0F0F09D8403B5000080204655454C204C45465400F7DF\nS12318C000006A000000B0F0F09D84039F000080205745494748542000F700006600000062\nS12318E0B0F0F09D840389000080205448525553542000F7000046000000B0F0F09D84030C\nS12319007300008020414E474C4500F7000058000A00B0F0F09D84035D0000802056455252\nS12319202056454C00F7000054000A00B0F0F09D84034700008020484F522056454C00F7C5\nS123194000005200F401B0F0F09D840331000080205645522041434300F700005000F401A7\nS1231960B0F0F09D84031B00008020484F522041434300F7000070003C00B0F0F09D8403CD\nS123198005000080205345434F4E445300F700001500000000000001001B00FC1F509F1E3F\nS12319A00058020080424F592C2041524520594F5500B700000000000001000F001020D84F\nS12319C08720494E45505400C100000000000001002A00182000F70000509F0D0258020069\nS12319E0802020594F552048415645204A555354204352415348454400CD00000000000095\nS1231A00010028003C20509F0D023A020080494E544F205448452045444745204F462054EA\nS1231A204845204D4F4F4E0042000000000000010050005E2000F70000509F32008A020007\nS1231A4080534F5252592C20425554205748454E20594F55204C4F534520545620434F5698\nS1231A6045524147452C20594F5520414C534F204C4F534520594F5552204655454C0099BF\nS1231A8000000000000001003200A82000F70000589F640002000080544F4F204641535433\nS1231AA02E20594F5527524520474F494E4720544F20435241534800000000000000000130\nS1231AC0003900D42000F70000509F6400BC02008042455454455220535441525420534C1A\nS1231AE04F57494E472049542055502050524554545920534F4F4E00AA00000000000001CA\nS1231B00004A00062100F70000509F64000200008054414B45204954204E49434520414EB4\nS1231B204420454153592E20412050455246454354204C414E44494E4720495320554E4473\nS1231B40455220382046505300CC00000000000001002F004A2100F70000509F640058027E\nS1231B60008046414E5441535449432C20412050455246454354204C414E44494E4700D1A0\nS1231B8000000000000001003400722100F70000509F640058020080434F4E4752415455F2\nS1231BA04C4154494F4E53204F4E204120474F4F44204C414E44494E470013000000000070\nS1231BC00001003000A02100F70000509F640058020080544845204C414E44494E47205776\nS1231BE041532041204C4954544C452046415354004400000000000001004B00CA2100F73E\nS1231C000000509F640058020080544845204C414E44494E472057415320544F4F204641D1\nS1231C20535420414E442044414D4147452057415320444F4E4520544F2054484520534877\nS1231C404950002100000000000001004D000E2200F70000589F64002602008057454C4C1A\nS1231C602C20594F55204345525441494E4C5920424C45572054484154204F4E452E20540D\nS1231C80484552452057455245204E4F205355525649524F525300CE00000000000001003E\nS1231CA04700542200F70000509F64003A0200804255542054484520414E474C4520574132\nS1231CC05320544F4F20475245415420414E442054484520534849502054495050454420BA\nS1231CE04F564552008F000000000000010025009422509F64001C020080534F5252592C7D\nS1231D0020425554205448455245205745524520005200000000000001001700B22298874C\nS1231D204E4F5087205355525649564F5253007E00000000000001005400C22200F700007A\nS1231D40509F64003A0200804255542054484520484F52495A4F4E54414C2056454C4F43C1\nS1231D604954592057415320544F4F2047524541542C20414E4420594F55204352415348EC\nS1231D80454420414E59574159001D00000000000001004400102300E09422509F64003A05\nS1231DA002008042555420544845205445525241494E20495320544F4F20524F5547482CDD\nS1231DC020414E4420594F5520544950504544204F56455200D100000000000001003200A9\nS1231DE04E2300E09422509F64003A020080594F55204A55535420435241534845442049E3\nS1231E004E544F205448415420524F434B0040000000000000010041007A2300E094225028\nS1231E209F64003A020080594F55204A5553542043524153484544204F4E20544F50204F23\nS1231E404620414E204F4C44204C554E4152204D4F44554C45004400000000000001004D70\nS1231E6000B42300E09422509F320003000080594F552048415645204A555354205641509F\nS1231E804F52495A454420412050524556494F55534C5920504C414E54454420414D455261\nS1231EA04943414E20464C414700C100000000000001004D00FA2300F70000509F64003A19\nS1231EC00200804E49434520574F524B2E20594F55204A55535420435241534845442049C6\nS1231EE04E544F20412050524556494F55534C592043524153484544205348495000D70005\nS1231F00000000000001004300402400E09422509F0A003A02008057656C6C2C20796F758D\nS1231F20277665206A7573742064657374726F79656420746865206F6E6C79204D6163440A\nS1231F406F6E616C6427730095000000000000010028007C24509F0A001C0200806F6E20E3\nS1231F60746865206D6F6F6E2E2057686174206120434C4F442E00B60000000000000100B9\nS1231F803B009E2400F70000509F960002000080B0F054574F2043484545534542555247AB\nS1231FA045525320414E44204120424947204D414320544F20474F2E00A5000000000000B0\nS1231FC001005100D22400F70000509F320002000080B0F0544841542753204F4E4520535B\nS1231FE04D414C4C205354455020464F522041204D414E2C204F4E45204749414E54204CCA\nS123200045415020464F52204D414E4B494E442E001E000000000000010064011C2500F7D3\nS12320200000F1FF1098A0F0B10377016496146000000C4008000C2008200C40082000F7C7\nS123204000009CFF1098A0F0B1034A0164962860000000E030250F001098A0F0BB03770176\nS12320606496144000000C6008000C0008200C60082000F7000064001098A0F0BB034A0136\nS123208064962840000000E06425F49D80F0B303BC0260900040FA200300FA000040FA205B\nS12320A00300FA000040FA204098AC03000000902B6000003720000000802020202020208C\nS12320C0252000F70000589E5E01BC0200804655454C204C4F5700F70000D79DA0F00000F4\nS12320E000000088482708630642064002410441064304400242004142414243424246413F\nS12321004643444044414461486100F70000D49FA0F00000000000880009008E1E40005B09\nS12321205E40007BD48A0006084000434840802900904920000000F73C260088000BD48F1A\nS1232140C3288A40894086408540844082408440054181400441824181400041C140C24113\nS12321604441C1404541C440C240C440C540C640C940CA40832800F70000D09D6D000000AB\nS1232180000000010064017A26000000000088000104614462040205408040814001408113\nS12321A0600061C1604140C140804041008342C522036300F70000D49AA0F00000000000AF\nS12321C0881240D795104000000040082010600000D69400000300104000000000020010BE\nS12321E060000000F70000BC0280F0BC02548E5602FA005E02F2085E02F2145E02FA1D5ECF\nS123220002061D5E020E145E020E085E0206005E02FA005602EF005E02EFF05E0211F05E98\nS12322200211005E02EF00BC02548F5E02E0E8560211005E0220E8BC02D48C5602EFF25EE9\nS123224002E4EE560211F25E021CEEBC02548E560224E85E021CE85602E4E85E02DCE856DB\nS123226002FDF05E02F9EB5E0207EB5E0203F056020000C00200E2E1E0DEDCDAD7D4D1CEE7\nS1232280CBC800010306040301FEFAF9FBFE020305060201FFFCFAFBFD000405070400FF98\nS12322A0FDFFECF0F3F6F9FCFE000204070A0D1014BC0280F0BC0200005602FAEB5E020095\nS12322C0005E02FBEB5E0200005E02FCEB5E0200005E02FDEB5E0200005E02FEEB5E02005C\nS12322E0005E02FFEB5E02CF00000000000001006401D82700005E0200EB5E0200005E02F1\nS123230001EB5E0200005E0202EB5E0200005E0203EB5E0200005E0204EB5E0200005E0203\nS123232005EB5E0200005E0206EB56020000C00230303031303230333034303530363037C2\nS1232340303830393130313131323133313431353136313731383139323032313232323323\nS12323603234323532363237323832393330333133323333333433353336333733383339DB\nS12323803430343134323433343434353436343734383439353035313532353335343535B7\nS12323A035363537353835393630363136323633363436353636363736383639373037316F\nS12323C0373237333734373537363737373837393830383138323833383438353836383739\nS12323E0383838393930393139323933393439353936393739383939CE02CE02CE02EE0251\nS1232400EE02EE020E030E030E032E030C03EE02BF028A026C023F02F401A40190015E01EF\nS12324200E01F600C800B4006B001800360035003300520050004E006D006B004A0048009C\nS1232440460045006300620080007E007D007B007A00360000000000000100640136299825\nS123246000B600AE00A6009E00B500AD00A5009C0094008C0083005B0053004B00B600A11A\nS123248000EC0078004300AE009900C50050003B0062037B00C900FA0013012C0177019A04\nS12324A00143029E0328077307DD074708D1085B09E5094F0AB90A430BCD0B380C9A0C7D81\nS12324C00C9F0C620C440C470C490C6C0CAE0C510CB40CD60C190D3B0D3E0D600DC30D654F\nS12324E00D700D7A0D650D4F0D3A0D440D2F0DF90CE40CAE0CB90C830C6E0C380C230C0D28\nS12325000CF80B020C0D0C170C7B0C5F0C430CA70C8A0B6E0B120B960ABA0A9E0AC10AA5C3\nS123252009090ACD09D109140A180A3C0AA00A040B670B2B0B8F0AB30A970B5A0B3E0CE25B\nS12325400B660B2A0BC70AA409C2095F095C093A0917089407B2070F08EC078A07070784CD\nS123256006E2061F077C065A06F705940572064F068C06EA06A706640682063F069C057A7E\nS1232580059705340592056F06EC054A052705640542041F047C047A04B7049404B2042FDD\nS12325A0040C03EA02C702A5034404440503062307420742082109C109400AC00A650000E3\nS12325C00000000001006401942A1F0BBF0B5E0C5E0DFD0D7D0E7C0F1C10DB105B116111F5\nS12325E06712ED1213137913BF13C5138C14F214D8155E16E4166A17101873181619B819CE\nS12326003B1ADD1A601BE21B851C081D8A1D0D1E6F1E121F941F17209920D020E6213D22A3\nS123262093224923C0239624AC244325D926CF278928A3291D2A372B302C6A2C842C7E2D38\nS1232640F82DD12EAB2F45303F313932A53211333D338933B633E2332E347A34A634F334D2\nS12326603F358B35F73563368F36CD36AC3629378737E4378238FF389D391A3A983AA239B2\nS12326800C39F63760370A3774365E35A83452343C330431CD2C56291F27C8230023F821C4\nS12326A0F0200820001F5A1E551DCF1C2A1CA41BFF1A591AF4194E19291883177E16181648\nS12326C073158D14E813031368122E11B40FFA0EE00CC60B6C0A520A78095E09A4088A0883\nS12326E030072407D8076C08E00834090809DC08B008E40818096D09CF09710A140BB60B99\nS1232700390C9B0C3E0DA00D020E850E270FAA0F0C108F101111B3115612D8127B13FD13AE\nS12327206014C2144515A715E500000000000001006401F22B4916AC164E17D1173318967E\nS123274018F8187A191D1A9F1A021BA41B471CA91C0C1DA21B991A3019E617FD1594148AA3\nS123276013A112B711AE10450FBB0D240CEC0A55091D08E5052E0536047F03470290004052\nS123278000F1FF81FF8EFF9BFFC8FFF6FF0200F1FF1D004A003800450052005F00580031D2\nS12327A000490022003B0033002C0044001D0016000E00070020005500AB0000013601CC60\nS12327C0012B026A02A902080347036603A503E4034404A304E20441058005BF051E063D9E\nS12327E0065C069C06DB061A0759079807D707160855089408D40813095209B109F0092FA0\nS12328000A6E0AAD0ACC0A0C0B2B0B6A0BA90B080C270C660CA50CE40C440D1C0DB40C8D0E\nS12328200B650C3E0D760D4E0DE70C9F0C780D460C540C230C110C800B130BA60A390AAC86\nS1232840093F0945096A09CF09140A3A0A9F0AA40AE90AEE0AD40AB40A950A550A360A16F6\nS12328600AF709D709B8099809790959093A093A093B093B09F808B408B0082C086908F00D\nS12328800718086008C8085008B807E0074807900778077A00000000000001006401502D15\nS12328A04007A8065006D80540052805D004B803E0030804700418042004C803B0021803B0\nS12328C00003E802700257012A01BC01EE012101D300A50098004A009C00AE00E10093002C\nS12328E0C6FFD9FFABFF5DFF8F00C101F302A6031303A1028E027C026A02D701450193015D\nS1232900A0010E01DC00690057006500F3FFC1FF2E009B008900B700A40032001F000D0045\nS12329207B006800D600E40011011F018D00FA004801160143019101FF016C01DA00C800F8\nS1232940D400A000AC009800840070005C00480034003F005E005D005C005A00590078006E\nS12329607700750074005300510050004F006E006C008B008A00880067008600A500830024\nS1232980A200C1009F00B900B3008C006600800099009300AC008600A0009900B300CC003D\nS12329A0A600A0009900B300AC00A600A00099007D006E005F00500055005200570054000A\nS12329C05100560067007D008C009800870082007D00580053002E00280023001E00190063\nS12329E034002F002A0025003F003D005A0078007500730070004E004B00680046000F0025\nS1232A00000000000001006401AE2E430021003E003C0039003700340051006F008C008A18\nS1232A2000A700A500A200C0008900B3007C00E6005001790183012D0196012001AA01D393\nS1232A40011D02A7011002FA01C4016D013701C1002A01B401FE01E701D1015B0104014E29\nS1232A6001B801A101AB0155013E01E80092001B004500AF0018010201CC0015019F01A9E5\nS1232A8001D2019C014601CF01190223021E039902940250022B0286020202FD02F802F321\nS1232AA0026B03E20339047004C7041F057605CD0544069B06D3062A078107B8072F0887D6\nS1232AC008BE0835096C09A40976098809DB094D0920094C09580964099109BD09C909D527\nS1232AE009020A0E0A1A0A260A530A7F0AAB0AD70A210B4A0B740BDD0AC70A100BFA0AE31B\nS1232B000ACD09B60AC00A090B530B1C0B060BEF09D90A420B4C0BD50A3F0BE80AD20ABB6C\nS1232B200A450A6E0A5709C1090A0AF40ADD0A070BF009BA098309AD09D6094009090973E0\nS1232B4009DC09C609AF09F909020AEC09F5091F0A680A520997097C09610847086C08D1E3\nS1232B6007B6079C08610846093E000000000000010064010C30AC09005000000005000047\nS1232B8000000000000000000000055500000000000000050000550555000005055550056F\nS1232BA05555500505000550050005000055000555055505055055555505555555055505E9\nS1232BC05555550505555550555555500055050555555555055505500555555555555555E5\nS1232BE00500500000000500000000505500000000000500000500050000050500000000B9\nS1232C000000050000000000005000000000000000000055555055055505555555555555AF\nS1232C2055555555555555555555555500000050555500000000000000000500050005008B\nS1232C4000000000005555555555555555505555050500000500505000000000000050507F\nS1232C60050050050555050005050500050000000000005000000055555555555555505040\nS1232C805555555550555555055550505555555555555055555555555555555055050505E9\nS1232CA0505055555555555555000000000000000050500000000000005000000000000528\nS1232CC0000005000000000000000050550000000000000066000000000000010077006AFE\nS1232CE03100550500000000007606505550005050005555000500500555500050500500E6\nS1232D0000500500505000005000555000500050000005000000000000000000000500001B\nS1232D2000000000000000500500000055005005000050555550555555555555505055054E\nS1232D405555555500555555555555555555555555050A00000000000001006401DC31009D\nS1232D60001E013C02590377049405B106CD07E808030A1D0B360C4E0D660E7C0F9010A4F2\nS1232D8011B612C713D614E415F016FA170219081A0C1B0E1C0E1D0C1E071F0020F620EA59\nS1232DA021DB22CA23B5249E258426672747282329FD29D32AA62B752C412D0A2ECE2E90AE\nS1232DC02F4D300731BD316F321D33C7336D340F35AD354636DC366D37FA37823806398689\nS1232DE039013A783AEA3A573BC03B243C833CDE3C343D853DD23D193E5C3E9A3ED33E079C\nS1232E003F363F613F863FA63FC23FD83FEA3FF63FFE3F0040FE3FF63FEA3FD83FC23FA664\nS1232E203F863F613F363F073FD33E9A3E5C3E193ED23D853D343DDE3C833C243CC03B5788\nS1232E403BEA3A783A013A863906398238FA376D37DC364636AD350F356D34C7331D336F87\nS1232E6032BD3107314D30902FCE2E0A2E412D752CA62BD32AFD2923294728672784269EF2\nS1232E8025B524CA23DB22EA21F6200020071F0C1E0E1D0E1C0C1B081A0219FA17F016E401\nS1232EA015D614C713B612A41190107C0F660E4E0D360C1D0B030AE808CD07B1065E00006E\nS1232EC000000000010064013A339405770459033C021E010000E4FEC6FDA7FC8BFB6EFA18\nS1232EE051F935F818F7FDF5E3F4CAF3B2F29CF186F070EF5CEE4AED3BEC2AEB1EEA11E9FD\nS1232F0008E800E7FAE5F4E4F2E3F2E2F6E1F9E002E00ADF16DE25DD38DC4BDB62DA7CD93A\nS1232F209BD8BBD7DDD605D62DD55CD48BD3BFD2F8D132D172D0B3CFFBCE45CE93CDE5CC5C\nS1232F403BCC95CBF3CA55CABAC926C995C808C87EC7FAC67CC601C68AC518C5ABC442C4DC\nS1232F60DEC37DC322C3CCC27BC230C2E7C1A4C168C12FC1F9C0CAC0A1C07CC05AC040C0AA\nS1232F8028C018C00AC004C000C004C00AC018C028C040C05AC07CC0A1C0CAC0F9C02FC1E7\nS1232FA068C1A4C1E7C130C27BC2CCC222C37DC3DEC342C4ABC418C58AC501C67CC6FAC6EA\nS1232FC07EC708C895C826C9BAC955CAF3CA95CB3BCCE5CC93CD45CEFBCEB3CF72D033D111\nS1232FE0F8D1BFD28BD35CD42DD505D6DDD6BBD79BD87CD962DA4BDB38DC25DD16DE0ADFA6\nS123300000E0F9E0F6E1F2E2F2E3F4E4FAE500E708E812E91EEA2AEB3BEC4AED5CEE70EFC6\nS123302086F09CF1B2F2CAF3CB00000000000001004E009834E3F4FDF518F735F851F96E85\nS1233040FA8BFBA7FCC6FDE4FEE0343435509880F00000000000F7000000F7000000F700EA\nS12330600000F7000000F7000000F7000000F7000000F7000000F7000000F70000E50000A6\nS12330800000000001006401E03405000500050005000500C615FE3F1F0AFEFFDF154635EC\nS12330A004001F0A0600DF0B8CFB1F0A8EFBDF095A35DF1583008EFBDF095A35DF15830051\nS12330C08EFBDF095A35DF154B008EFBDF095A35DF152F008EFBDF095A35DF1546008EFBC7\nS12330E0DF095A35DF150D008EFBDF095A3501019625DF15400066FFDF15623500F4DF0997\nS1233100AA131E00DF8B8CFBFD808700D09D00008A02A0F000802020202020202020202092\nS12331202020202020204720205220204520204520205420204920204E2020472020530D16\nS12331400A202020202020202020202020202020202D20202D20202D20202D20202D202040\nS12331602D20202D20202D20202D0D0A0A0A202020202042454341555345204F46204348B4\nS1233180414E47455320494E20544845204E4154494F4E414C20504F4C4943592C205448B7\nS12331A045204C554E41520D0A4558504C4F5241544F52592050524F4752414D2049532090\nS12331C04F4E434520414741494E2046554E4354494F4E494E472C20414E4420594F552086\nS12331E0484156450D0A42454500000000000001005E003E36454E2043484F53454E20411D\nS123320053205448452050494C4F5420494E20434F4D4D414E44204F4620544845204C5561\nS12332204E4152204D4F44554C452E0D0A2020202020594F55204D495353494F4E204953E3\nS123324020544F204C414E44204F4E20008A0000000000000100180096361880B0F04D6136\nS1233260726520417373616265742C004F00000000000001003A01A8361080A0F02041205A\nS123328042415252454E20414E440D0A48415253482057415354454C414E442042454C49F1\nS12332A04556454420494E43415041424C45204F4620535550504F5254494E4720414E594F\nS12332C0204B4E4F574E20464F524D204F46204C4946452E0D0A0D0A2020202020554E460F\nS12332E04F5254554E4154454C592C20544845205350414345204147454E43592043484F29\nS1233300534520544F2055534520414E20494E464552494F520D0A4252414E44204F4620C1\nS12333204D494E49434F4D505554455220494E20544845204C554E4152204C414E444552BD\nS12333402C20414E44204954204841530D0A4A5553542044494544204F4E20594F552E20D6\nS1233360594F55204D555354204E4F57204C414E4420554E444552204D414E55414C2043B1\nS12333804F4E54524F4C2E0D0A0D0A202020202020202020202A2A2A2A2A2020474F4F4474\nS12333A0204C55434B20202A2A2A2A2A00E000000000000001000A00DC3700E062356B00C8\nS12333C0000000000001000600E034E50000000000000000000000000000000000000000E9\nS12333E00000000000000000000000000000000000000000000000000000000000000000C9\nS12334000000000000000000000000000000000000000000000000000000000000000000A8\nS1233420000000000000000000000000000000000000000000000000000000000000000088\nS1233440000000000000000000000000000000000000000000000000000000000000000068\nS1233460000000000000000000000000000000000000000000000000000000000000000048\nS1233480000000000000000000000000000000000000000000000000000000000000000028\nS12334A0000000000000000000000000000000000000000000000000000000000000000008\nS12334C00000000000000000000000000000000000000000000000000000000000000000E8\nS12334E00000000000000000000000000000000000000000000000000000000000000000C8\nS1233500000000000000000000000000000000000000000000000000FF00000000000000A8\nS1233520000000000000000000000000000000000000000000000000000000000000000087\nS1233540000000000000000000000000000000000000000000000000000000000000000067\nS1233560000000000000000000000000000000000000000000000000000000000000000047\nS1233580000000000000000000000000000000000000000000000000000000000000000027\nS12335A0000000000000000000000000000000000000000000000000000000000000000007\nS12335C00000000000000000000000000000000000000000000000000000000000000000E7\nS12335E00000000000000000000000000000000000000000000000000000000000000000C7\nS50301B04B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.srec -o test.in -bin\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS11F00005F00DC000002E0000202E0000402E0000602E0000A02E0000802E0003B\nS12300408A13C000000000000000000000000000000000000000000000000000000000003F\nS123006000000000000000000000000000000000000000000000000000000000000000007C\nS123008000000000000000000000000000000000000000000000CE000000000000009E00F0\nS11500A000000000000000000000000000000000B0009A\nS12300D0DE1380004A1480003202E0000500C0152A18C115FC1F01E0810C810CD01500F7C5\nS12300F0100AC10AFB06C015E034C115FE3F01E0810C810CD01500F7100AC10AFB061F0A24\nS1230110FEFFC615FE3FC0153E01011402030914FC01DF092801FD010100C0176C00060312\nS12301301F0A6C001F106E00DF093A0587004400FFFF4600BAFF48000000560000005A0092\nS1230150000054001027580078EC5C0010AA5E00D85960004B00AA2571026200FFFF6800EA\nS12301703075700000006E0000006C00000084000000940000009600CE00CE00281498005E\nS123019000009E00940100F4F21666FF4000C2340000BA340000DA340000CA340000D23481\nS12301B000008C16F2168E1628179016AC179216C617F416F09D0E17F09D2A17F09D46173C\nS12301D0F09D6217F09D7C17F09D9617F09DAE17F09DC817F09DE217F09DFC17F09D16180C\nS12301F0F09D9A00F4019C000A00C02500F7000000000000000000000000DF15CE009600F5\nS1230210DF152814CE001F0A9400DF15F21600F4DF15400066FFC615FE3F1F0AFEFF5F00E9\nS123023022011F0A940026106610C1159E165F003E14041045101F0A80001F0A8200DF1532\nS1230250FF7F86000715260ADF09C8020E01E6150040DF09C802DF278200840002040E0A62\nS12302700401DF20840001040E0A8010C2E780000380020BCE550020C245C0FFC200020CA3\nS12302901F108000C110C3E782000380030BCE554000C345C0FF5F1082005F2086000204E7\nS12302B05F10860083508355D510CC011515CA01D51500F7150A87000095C1174A00DF09BD\nS12302D05E12A6100093C1174C00DF095E128EE0009DFFFFC1174C00DF095E12A610009505\nS12302F0C1174A00DF095E1282658315030B8700DF0B68005103C0176400C1150429DF0990\nS12303104A11C0156400DF096C12DF106600C110C0176E00DF094A11C015DC05DF096C1205\nS1230330C3E768000581030ADF1500F7C0250C01030BDF0BC0250803D720D00705041F0A3F\nS1230350C025DF55000002F4DF106800020AC0150A00DF096C12C365DC37DF106A00C01767\nS12303706600C115D73EDF094A110011DF096C12DF104E00C010C1174A00DF095E129F1028\nS12303905000C0174E00C1174C00DF095E12C2E56E0A9F1052008700DF1500F7C0251F0AB8\nS12303B06600DF15DC376A00DF6768006A001F0A4E001F0A5000DF1592F5520087000110E5\nS12303D0C4176400840C840C840C029D66279F0A8A00C3178A00C345E0FFC39C7327C26055\nS12303F09F608C00C3178C00C345FCFFC4150C00C515B027C3659327D5949590C5650600BF\nS1230410C40AFA069F0A9000DF45FCFF9000DF6580018E00DF457FFC8E00DF15548CA827EF\nS1230430DF579000A827DF578E00A827C015A2275F004202C0174600078017204CFF0A0609\nS1230450C06568010780F9011720B4000307C0E56801FA811F1046000280C0656801C00CAA\nS12304701F1CDC314A0017201C020205C0E5D0021F1C90324C008700C11750000180010B7E\nS1230490C0176E00DF094A11C015B80BDF096C12DF0B50000180030BC210830CC36754001A\nS12304B09F605400E610C1100180010BC0176E00DF094A11C0155802C3675600420BDF0915\nS12304D06C12D60B0180030BDF605C009F105600C11752000180010BC0176E00DF094A113B\nS12304F0C015B80BDF096C12DF0B52000180030BC210830CC36758009F605800E610C1101E\nS12305100180010BC0176E00DF094A11C0155802C3675A00420BDF096C12D60B0180030BDC\nS1230530DF605E009F105A008700DF15C0FF8400C51744001F0A4400C0176E00411101809E\nS1230550010BDF094A11C0153C00C3674800420BDF096C12C50B0180030BDF6046009F106F\nS12305704800DF094404DF6502009200C1179200C145FDFF411CAC34C015D8266610DF093D\nS123059042029F15BA34DF1786008800DF1760006400DF090003DF098804C4175C00C465E4\nS12305B08057840C840C840C840C840C1F1172000511C40CC465F02800150063800C1F1084\nS12305D07C00C0E75E00000B1F107E00DF0B66000807C0158835DF09CE03DF158835C2347D\nS12305F002011F0AC234C4177200368117210A00330717217A033504C4175E005381172112\nS1230610A86134041721C2014D07DF177200B434840C840C840C840C840CC4652B001F1192\nS1230630B634DF0B9E000403DF09EC0C1F0A9E00DF097815C4177E00C4E510000C80C0159E\nS12306508002DF09060E9F119E00DF09EC0C1F0A9E00DF09320E8700C0150D00C115FC1F91\nS12306700801C0157703C1151C2003010011C1156220C00CC00CC00CC00CC00CC0E5805717\nS12306901F105C005F10CA341F0A68001F0A5400C3175E00830C830C0181030BDF10580013\nS12306B05F003A05CE279E006C03C0177200C0E509001F107400C00CC00CC00CC00CC00CF0\nS12306D0C0E580571F107600DF09040F9F139E00C0175C00C0E776000310C00C0360830C79\nS11306F0DF10B434020AC0153000DF096C12C3677E\nS12307007400DF107800C30CC410C015300080E08510011DF028DF093A12E6104011011D8E\nS1230720F228DF093A12020AC015300083650580030BDF096C12030B0201DF096C12C4102A\nS1230740830C830CDF107C00DF090C101F117A00C0175E000310C30C0360830CC365170016\nS1230760DF10B634DF651800B63403E1C4100180030B020AC0150300C30CDF096C12C40B27\nS12307800180030BDF107E00DF095608DF090A0A8700C0175C00C0E7760017201E000707DD\nS12307A017204402A105C0177200C00A8A01C0177200C0E511008501D70B0000E9035721A9\nS12307C01E00E606170AC607DF154424CA345F000A0957210F00DC06D7275800A8FD3507B1\nS12307E0DF155223CA341F0ABA34DF09320E57211A00CE061721A8FD2807DF157E23CA344A\nS1230800E6150300DF0B540001818E0A2610DF09900CDFE51000B634DF09040FDF09320EE3\nS123082057211A00B506DF0B6600B203260A2610DF09900CDF15B823CA34DF09040FA80107\nS123084057211100A5061721A8FD5C07DF15FE23CA34DF09320EDF097815C5177E0029816C\nS1230860572103002907C41758001721A8FD15051721D4FE160517216AFF1705D727CA34C1\nS12308800A2102021F0ACA34C01778002610DF09CA0C8115C10C7900EC0FDF15AC20CA3426\nS12308A0F301DF15D820CA34EF01DF150A21CA34EB015721F6FF26071F0A6000DF15C20183\nS12308C0AA251F0AC2341F0AD234C50B0103DC80C41758001721A8FD15071721D4FE0F077B\nS12308E017216AFF09071721B0FF0307C0154E211601C01576211301C015A4211001C015F7\nS1230900CE210D01DF151222CA34C0152000DF09060EDF09040F1F0ABA34DF09320E1F0A5C\nS1230920C2341F10CA34D727540064001B06D72754009CFF1705D7274600F1FF1805D72761\nS123094046000F001406C1177800C10C401CF22840ECF02802100180020B972030000C04B6\nS1230960DF09060BC0175400C115C6220701C0174600C11558220201C11514235F10C234A7\nS1230980C1177800E6150300C00B01818E0A6610DF09900CC10C421CF22842ECF028831008\nS12309A0C30C8360830C830CC2E08310830CC26006809720D3FF0804C215D3FF05019720FC\nS12309C02D000207C2152D00C3155A00C00B0180030BC2609F104600C1179200C1650200A4\nS12309E0C145FDFF5F109200411CAC346610DF094404C015D826DF0942029F15BA34DFE5A8\nS1230A000700B634DF09AA130A00D7277E0096007704C515CA35C417640017213F0002070D\nS1230A20C4153F00440C440C440C440CC4457FFCC455509C1511D72746002D006106D727D5\nS1230A404600D3FF5D05C1174A000180010BC017B634C0E77A000410DF094A11C0174C000D\nS1230A60DF096C12C460DF0B4A000181030BC367B434D510D5177A00D51500B0C4E59600EE\nS1230A803F80040B0011C1176400DF094A11830C830C830C830C3403E610C2156009820CBD\nS1230AA0820C8E2001868E10C217B000C315C0FFC2677000820AC240809C6627C267520066\nS1230AC0C240C040C000000C440AC445FFDFC45500400051819C6627C14040501510C065E0\nS1230AE04020C04500C01510CE0AE206D51500F70D0A9F10B000D60BDF15CA35D234870030\nS1230B001F0AD2348700DF09AA13FCFFDF17B4347A26DF17B6347C26DF157826D234DF35CF\nS1230B207F007000FC02DF0BBA075203C3171026C3E7B434C2171226C2E77C26C26503009C\nS1230B40A6100203DF09360CC3171026C3E77A26C3651900E610020ADF09360CDF15A2242B\nS1230B60CA34DF09AA13F8FF1F0ACA34DF09AA13FEFF0E0B8313020ADF09360C83158215FA\nS1230B80020B0203DF09360CDF09AA13FEFFDF6504005E00DF65D00768001F0A58001F0AA0\nS1230BA06C00C615FE3F1F0ACA341F0A46001F0A5400DF151E006000DF092801DF0B9E008F\nS1230BC0F2021F0ABA341F0AC234DF09AA130300E6150100E6177800DF09900CC215E8FF8C\nS1230BE0C3153000C5177000050C0186030BE610DF09360C8315020ADF09360CDF177A2673\nS1230C00AC26DF177C26AE26DF651400AC26DF15A826C234C0177800DF09720CDF09720C95\nS1230C20E61502002610DF09900CDF15D624CA34DF09AA130A00C515800AC30B0380C515CF\nS1230C40C00A030B5F11720C050AC20B0503850A83100280030B050BC0177A26DF09720C47\nS1230C601F107A265F617C26DF09760CC30AF606870000008700DF3507007000FC03DF098C\nS1230C807815DF3507007000FC02DF09781587002611841D0400840C0C86F60C0600F60C36\nS1230CA00600F60C0600F60C0600F4C5F00013300301F4C50F001330B4DD060013308415AC\nS1230CC0B6130400C665040087002611841D0400840C049D13300486840C840C840C840C73\nS1230CE0C445F0FE3611040084158700DF093C0DC417F028840C840C840C840C840CC46571\nS1230D00170015111F118200D515508CC015F028C06508000412840C840C840C840C840C1A\nS1230D20C4651700DF09780DF301D51500F70D0ADF152A18DA34DF09660D8700A610E61044\nS1230D40261066102611DF15E100A0001F0ADA341F0ABA07C5152A18D5155498D515A0F0AA\nS1230D60150A7E000A00B6130C008415841581158015831582158700E615000217210004A7\nS1230D800587C415FF031F2182000803C40B0480040ADF0B82000203CE550040DF0AA2005B\nS1230DA01B809F0AA400DF45FCFFA4009F0AA400DF17A400A200DF658002A600DF457FFCF0\nS1230DC0A6009F0AA800DF45FCFFA800CD17A600CD57A800D555048CC4E782000880040B7D\nS1230DE0C445C0FF1FE18200C45540000401C445C0FF1F61820084551511DF0AA0000206ED\nS1230E00CE6502008700C11772004410C10CC165F028E61503004514431045E201818E0A7E\nS1230E202611DF09900C11E023E0800C000BFB0287001F0AAE001F0AC2341F0AD234DF558B\nS1230E40000002F4C515CA35C417AC00840AC400040C4463C4457FFCC455509C1511DF0998\nS1230E60980EDF55000002F4DFE50A00AE00DF09980ED51500F70D0ADF15CA35C234DF557F\nS1230E80000002F4DF652100AE00D727AE00C000D907DF09AA130500DF15E2FF4600E61539\nS1230EA0F100DF094404801DFAFF800C800AC0677000C067AC001F10AC00C045E0FF049C98\nS1230EC07327C467AE001B810011C1174C00DF095E12C267B4341381C255004095100011C0\nS1230EE0C1174A00DF095E12C267B634078195109F0A4600CE0AD506D60B8700250A150ADC\nS1230F00150AF601DF093C0D1F0AAA00C0177400C00CC065F0280412DF090C10C40B0280F4\nS1230F20040A0501172100040287C415FF0315111F118200D515508C26110414DF090C1008\nS1230F4001118415020A2610C0150C0001E10880C1E50600010B4310DF096C12030B0501D0\nS1230F60C16506004310DF096C12C110021080159F0AAA00D727AA0003000405DF15DF0A2C\nS1230F80700F0701D727AA00FDFF0306DF159F0A700FC467AA0044602611DF09780D0101DE\nS1230FA004018415C20AE406C701C2177400CE151300C01518008310C30CC365F028A61089\nS1230FC0820ADF09CA0C8415C40CFC09FC0FD30BC0653000CE0AF306D60BD51500F70D0A6D\nS1230FE0DF09660DDF152A18DA3487009007EE07200840084008D207B807B807040E1E10EC\nS1231000B81028103210E010900714112611C40C8465840C840C840CC46517008700DF098F\nS12310203C1000001700E8FFDF093C10A6FF1000EEFFDF093C105A001000EEFF5721961FD4\nS12310403A826610A610E61026112610801D0A00D51500989513E6174600C412DF090C1053\nS12310602611C41C0200DF090C108465840C1F14460004641F1284001511F32202000803F8\nS12310800482DF65EAFF46000301DF6516004600DF0944044111C015D826DF094202250AFF\nS12310A0250A9F154600DF09440480158415831582158115D60B87005721C61F2A821F1040\nS12310C0AC26C412DF090C100111C41C0200DF090C104460840C1F11AE26C115A826130178\nS12310E05721C21F16821F10DC25C412DF090C100111C41C0200DF090C104460840C1F1195\nS1231100DE25C115D8254414172100F702031511FA018700DF0BC607170317201900140785\nS1231120172070031104C41C0200C4220104C412DF090C101F1112261F1010269F11BA0707\nS1231140D51500F7D5150C268700030A40200586421025030110A100020102102003420C5D\nS12311601F87420C2187420C2487420C2787420C2A87420C2D87420C3087420C3387420C7E\nS12311803687420C3987420C3C87420C3F87420C4287420C4587420C4887020A4310870027\nS12311A04310C30C420C02864360420BC30C420C02864360420BC30C420C02864360420B19\nS12311C0C30C420C02864360420BC30C420C02864360420BC30C420C02864360420BC30C7D\nS12311E0420C02864360420BC30C420C02864360420BC30C420C02864360420BC30C420CDE\nS123120002864360420BC30C420C02864360420BC30C420C02864360420BC30C420C028683\nS12312204360420BC30C420C02864360420BC30C420C02864360420B8700C00B0780000BAC\nS1231240C10B0780010BDF094A118700C10BFB80010BDF094A11030B420B020B8700DF09F4\nS12312603A12C30C420CC30C420C8700C30C420C02E03E80C30C420C02603F80C30C420C45\nS123128002604080C30C420C02604180C30C420C02604280C30C420C02604380C30C420C48\nS12312A002604480C30C420C02604580C30C420C02604680C30C420C02604780C30C420C18\nS12312C002604880C30C420C02604980C30C420C02604A80C30C420C02604B80C30C420CE8\nS12312E002604C80C30C420C02604D8002608700830AC30C420C02E0C181830AC30C420C0F\nS123130002E0C081830AC30C420C02E0BF81830AC30C420C02E0BE81830AC30C420C02E083\nS1231320BD81830AC30C420C02E0BC81830AC30C420C02E0BB81830AC30C420C02E0BA8113\nS1231340830AC30C420C02E0B981830AC30C420C02E0B881830AC30C420C02E0B781830AAD\nS1231360C30C420C02E0B681830AC30C420C02E0B581830AC30C420C02E0B481830AC30C54\nS1231380420C02E0B381830A8700DF55400066FF9F0A6C009F0A7000DF350F007000040231\nS12313A01F0A3A151F0A3C150200DF1500F7C025801F0000C117700002100180000BC165BA\nS12313C03C00C00AFC060100DF0978155F207000FA82CE650200C20BD7815F00DC00261055\nS12313E06610C0179600C11F16E01B03E01700F4C8650200E0152414572200F70B02F10B52\nS123140002000F036010C8650400E0152414411C0200F2011F1096005F1000F48115801541\nS1231420020007140114E8019F0A9400C1179400C10C411C061503021F0A9400F701DF15F1\nS12314402814CE00C015CE00D70126106610C11794005F209A000603DF150F009C005F10BB\nS12314609A002801DF0A9C002580C10C79004015C11706F4C14500FCC1650D00C017AA2533\nS1231480C00CC00CC00CC0E7AA250160810C810C810C5F10AA25C1E5DB01810C57200A0098\nS12314A00280C1150A00C12564000204C11564005F106000DF55010000F481158015020017\nS12314C0411C0615C01798000303F045080002005F109800F15518000200EC01C017980019\nS12314E0E9031F0A980031108C16F04508000200E101411C06155F1CFEFF44005F103A1545\nS12315005F103C15D7019E16B216C616DA16F2160C172817441760177A179417AC17C617CF\nS1231520E017FA171418B034C034C834D034D834222556254225762588250000000000001E\nS1231540DC14DC14DC14DC14C014C014C014C014C014C014C014C014C014C014C014C014D7\nS123156022142214221422142214F214F214F214F2147014F214F21426106610A610E61059\nS123158026116611040A051D8C162003011D96164311C3650A00F1101200431FFCFF401D87\nS12315A0FEFF0A03C30B0180030B020ADF096C12FD0BFCFF0180030B051D9616C010C11548\nS12315C00A004161DF097416D40BDD01DF27600062000803C115B825C01760001F106200DE\nS12315E0DF0974168515841583158215811580158700D1952000172010271F86D195200042\nS1231600260A1720640024050310020AC0156400DF096C12C30CC3651428DF095816DF09A3\nS123162058168310C30CC3651428DF095816CE11DF095816C66502008700E611D1953000A6\nS123164017201027DE87B18AFFFFC0E51027F8010210C3151428E101F60B02000902D7A216\nS123166030000402D1952000830A8700B6110200D1948700C00BBD80000BDF09F21540108F\nS1231680E0A52000FD02C8952D008700F2160C172817441700009E16B216C616DA16A0F0F4\nS12316A0F09E0000DA02008020202020202000E0FC16A0F0F09EFA00DA0200802020202096\nS12316C0202000E01617A0F0F09EF401DA02008020202020202000E03217A0F0F09EEE0253\nS12316E0DA02008020202020202000E04E177E000000B0F0F09D8403F700008020484549E6\nS12317004748542000F700005E000000B0F0F09D8403E100008020414C54495455444520BC\nS123172000F700005C000000B0F0F09D8403CB0000802044495354414E43452000F70000D1\nS123174068000A00B0F0F09D8403B5000080204655454C204C45465400F700006A00000032\nS1231760B0F0F09D84039F000080205745494748542000F7000066000000B0F0F09D840379\nS123178089000080205448525553542000F7000046000000B0F0F09D8403730000802041CD\nS12317A04E474C4500F7000058000A00B0F0F09D84035D000080205645522056454C00F70A\nS12317C0000054000A00B0F0F09D84034700008020484F522056454C00F700005200F401DE\nS12317E0B0F0F09D840331000080205645522041434300F700005000F401B0F0F09D84039C\nS12318001B00008020484F522041434300F7000070003C00B0F0F09D8403050000802053EA\nS10D182045434F4E445300F7000007\nS1231FFC509F1E0058020080424F592C2041524520594F55D88720494E45505400F70000B9\nS123201C509F0D02580200802020594F552048415645204A555354204352415348454400C7\nS123203C509F0D023A020080494E544F205448452045444745204F4620544845204D4F4F95\nS123205C4E0000F70000509F32008A020080534F5252592C20425554205748454E20594FFE\nS123207C55204C4F534520545620434F5645524147452C20594F5520414C534F204C4F53BC\nS123209C4520594F5552204655454C0000F70000589F640002000080544F4F20464153540C\nS12320BC2E20594F5527524520474F494E4720544F2043524153480000F70000509F6400C5\nS12320DCBC02008042455454455220535441525420534C4F57494E472049542055502050F9\nS12320FC524554545920534F4F4E00F70000509F64000200008054414B45204954204E4964\nS123211C434520414E4420454153592E20412050455246454354204C414E44494E47204994\nS123213C5320554E4445522038204650530000F70000509F64005802008046414E5441534C\nS123215C5449432C20412050455246454354204C414E44494E4700F70000509F6400580208\nS123217C0080434F4E47524154554C4154494F4E53204F4E204120474F4F44204C414E449C\nS123219C494E470000F70000509F640058020080544845204C414E44494E472057415320F4\nS12321BC41204C4954544C4520464153540000F70000509F640058020080544845204C41D0\nS12321DC4E44494E472057415320544F4F204641535420414E442044414D4147452057419A\nS12321FC5320444F4E4520544F20544845205348495000F70000589F640026020080574578\nS123221C4C4C2C20594F55204345525441494E4C5920424C45572054484154204F4E452E27\nS123223C2054484552452057455245204E4F205355525649524F525300F70000509F64008D\nS123225C3A0200804255542054484520414E474C452057415320544F4F204752454154205F\nS123227C414E4420544845205348495020544950504544204F564552509F64001C020080E3\nS123229C534F5252592C2042555420544845524520574552452098874E4F50872053555290\nS12322BC5649564F525300F70000509F64003A0200804255542054484520484F52495A4F28\nS12322DC4E54414C2056454C4F434954592057415320544F4F2047524541542C20414E4451\nS10722FC20594F55BD\nS1232300204352415348454420414E595741590000E09422509F64003A02008042555420F6\nS1232320544845205445525241494E20495320544F4F20524F5547482C20414E4420594F29\nS12323405520544950504544204F5645520000E09422509F64003A020080594F55204A5581\nS12323605354204352415348454420494E544F205448415420524F434B0000E09422509F19\nS123238064003A020080594F55204A5553542043524153484544204F4E20544F50204F4617\nS12323A020414E204F4C44204C554E4152204D4F44554C4500E09422509F320003000080A9\nS12323C0594F552048415645204A555354205641504F52495A454420412050524556494F28\nS12323E055534C5920504C414E54454420414D45524943414E20464C414700F70000509FE4\nS123240064003A0200804E49434520574F524B2E20594F55204A555354204352415348458F\nS12324204420494E544F20412050524556494F55534C5920435241534845442053484950E9\nS123244000E09422509F0A003A02008057656C6C2C20796F75277665206A7573742064651F\nS12324607374726F79656420746865206F6E6C79204D6163446F6E616C642773509F0A00F5\nS12324801C0200806F6E20746865206D6F6F6E2E2057686174206120434C4F442E0000F7B9\nS12324A00000509F960002000080B0F054574F204348454553454255524745525320414EE1\nS12324C044204120424947204D414320544F20474F2E00F70000509F320002000080B0F08F\nS12324E0544841542753204F4E4520534D414C4C205354455020464F522041204D414E2CA6\nS1232500204F4E45204749414E54204C45415020464F52204D414E4B494E442E00F7000092\nS1232520F1FF1098A0F0B10377016496146000000C4008000C2008200C40082000F70000C2\nS12325409CFF1098A0F0B1034A0164962860000000E030250F001098A0F0BB037701649677\nS1232560144000000C6008000C0008200C60082000F7000064001098A0F0BB034A01649631\nS12325802840000000E06425F49D80F0B303BC0260900040FA200300FA000040FA2003004D\nS12325A0FA000040FA204098AC03000000902B600000372000000080202020202020252045\nS12325C000F70000589E5E01BC0200804655454C204C4F5700F70000D79DA0F00000000034\nS12325E00088482708630642064002410441064304400242004142414243424246414643B1\nS1232600444044414461486100F70000D49FA0F00000000000880009008E1E40005B5E40EF\nS1232620007BD48A0006084000434840802900904920000000F73C260088000BD48FC328C8\nS12326408A40894086408540844082408440054181400441824181400041C140C241444174\nS1232660C1404541C440C240C440C540C640C940CA40832800F70000D09D00000000008810\nS12326800001046144620402054080408140014081600061C1604140C14080404100834272\nS12326A0C522036300F70000D49AA0F00000000000881240D7951040000000400820106066\nS12326C00000D6940000030010400000000002001060000000F70000BC0280F0BC02548E02\nS12326E05602FA005E02F2085E02F2145E02FA1D5E02061D5E020E145E020E085E0206006C\nS12327005E02FA005602EF005E02EFF05E0211F05E0211005E02EF00BC02548F5E02E0E8EB\nS1232720560211005E0220E8BC02D48C5602EFF25E02E4EE560211F25E021CEEBC02548ED6\nS1232740560224E85E021CE85602E4E85E02DCE85602FDF05E02F9EB5E0207EB5E0203F037\nS123276056020000C00200E2E1E0DEDCDAD7D4D1CECBC800010306040301FEFAF9FBFE0229\nS12327800305060201FFFCFAFBFD000405070400FFFDFFECF0F3F6F9FCFE000204070A0D4C\nS12327A01014BC0280F0BC0200005602FAEB5E0200005E02FBEB5E0200005E02FCEB5E021B\nS12327C000005E02FDEB5E0200005E02FEEB5E0200005E02FFEB5E0200005E0200EB5E024F\nS12327E000005E0201EB5E0200005E0202EB5E0200005E0203EB5E0200005E0204EB5E021F\nS123280000005E0205EB5E0200005E0206EB56020000C0023030303130323033303430354A\nS123282030363037303830393130313131323133313431353136313731383139323032313A\nS1232840323232333234323532363237323832393330333133323333333433353336333704\nS12328603338333934303431343234333434343534363437343834393530353135323533CE\nS1232880353435353536353735383539363036313632363336343635363636373638363986\nS12328A0373037313732373337343735373637373738373938303831383238333834383562\nS12328C038363837383838393930393139323933393439353936393739383939CE02CE024F\nS12328E0CE02EE02EE02EE020E030E030E032E030C03EE02BF028A026C023F02F401A4013B\nS123290090015E010E01F600C800B4006B001800360035003300520050004E006D006B0059\nS12329204A004800460045006300620080007E007D007B007A009800B600AE00A6009E0001\nS1232940B500AD00A5009C0094008C0083005B0053004B00B600A100EC0078004300AE0088\nS12329609900C50050003B0062037B00C900FA0013012C0177019A0143029E0328077307E4\nS1232980DD074708D1085B09E5094F0AB90A430BCD0B380C9A0C7D0C9F0C620C440C470C64\nS12329A0490C6C0CAE0C510CB40CD60C190D3B0D3E0D600DC30D650D700D7A0D650D4F0D53\nS12329C03A0D440D2F0DF90CE40CAE0CB90C830C6E0C380C230C0D0CF80B020C0D0C170CC9\nS12329E07B0C5F0C430CA70C8A0B6E0B120B960ABA0A9E0AC10AA509090ACD09D109140A4E\nS1232A00180A3C0AA00A040B670B2B0B8F0AB30A970B5A0B3E0CE20B660B2A0BC70AA40931\nS1232A20C2095F095C093A0917089407B2070F08EC078A0707078406E2061F077C065A0621\nS1232A40F705940572064F068C06EA06A706640682063F069C057A059705340592056F06A9\nS1232A60EC054A052705640542041F047C047A04B7049404B2042F040C03EA02C702A5036E\nS1232A804404440503062307420742082109C109400AC00A1F0BBF0B5E0C5E0DFD0D7D0E75\nS1232AA07C0F1C10DB105B1161116712ED1213137913BF13C5138C14F214D8155E16E416BD\nS1232AC06A17101873181619B8193B1ADD1A601BE21B851C081D8A1D0D1E6F1E121F941FF1\nS1232AE017209920D020E6213D2293224923C0239624AC244325D926CF278928A3291D2ADD\nS1232B00372B302C6A2C842C7E2DF82DD12EAB2F45303F313932A53211333D338933B63384\nS1232B20E2332E347A34A634F3343F358B35F73563368F36CD36AC3629378737E4378238D5\nS1232B40FF389D391A3A983AA2390C39F63760370A3774365E35A83452343C330431CD2CDD\nS1232B6056291F27C8230023F821F0200820001F5A1E551DCF1C2A1CA41BFF1A591AF4199B\nS1232B804E19291883177E16181673158D14E813031368122E11B40FFA0EE00CC60B6C0A3C\nS1232BA0520A78095E09A4088A0830072407D8076C08E00834090809DC08B008E4081809FB\nS1232BC06D09CF09710A140BB60B390C9B0C3E0DA00D020E850E270FAA0F0C108F101111F5\nS1232BE0B3115612D8127B13FD136014C2144515A7154916AC164E17D11733189618F81846\nS1232C007A191D1A9F1A021BA41B471CA91C0C1DA21B991A3019E617FD1594148A13A11240\nS1232C20B711AE10450FBB0D240CEC0A55091D08E5052E0536047F03470290004000F1FF63\nS1232C4081FF8EFF9BFFC8FFF6FF0200F1FF1D004A003800450052005F00580031004900B4\nS1232C6022003B0033002C0044001D0016000E00070020005500AB0000013601CC012B02B6\nS1232C806A02A902080347036603A503E4034404A304E20441058005BF051E063D065C069F\nS1232CA09C06DB061A0759079807D707160855089408D40813095209B109F0092F0A6E0AC1\nS1232CC0AD0ACC0A0C0B2B0B6A0BA90B080C270C660CA50CE40C440D1C0DB40C8D0B650C50\nS1232CE03E0D760D4E0DE70C9F0C780D460C540C230C110C800B130BA60A390AAC093F09ED\nS1232D0045096A09CF09140A3A0A9F0AA40AE90AEE0AD40AB40A950A550A360A160AF70978\nS1232D20D709B8099809790959093A093A093B093B09F808B408B0082C086908F00718082B\nS1232D406008C8085008B807E0074807900778074007A8065006D80540052805D004B803AB\nS1232D60E0030804700418042004C803B00218030003E802700257012A01BC01EE01210164\nS1232D80D300A50098004A009C00AE00E1009300C6FFD9FFABFF5DFF8F00C101F302A60385\nS1232DA01303A1028E027C026A02D70145019301A0010E01DC00690057006500F3FFC1FFC7\nS1232DC02E009B008900B700A40032001F000D007B006800D600E40011011F018D00FA008E\nS1232DE04801160143019101FF016C01DA00C800D400A000AC009800840070005C0048003A\nS1232E0034003F005E005D005C005A00590078007700750074005300510050004F006E00E8\nS1232E206C008B008A00880067008600A5008300A200C1009F00B900B3008C006600800090\nS1232E4099009300AC008600A0009900B300CC00A600A0009900B300AC00A600A00099003B\nS1232E607D006E005F00500055005200570054005100560067007D008C00980087008200AA\nS1232E807D00580053002E00280023001E00190034002F002A0025003F003D005A00780056\nS1232EA07500730070004E004B0068004600430021003E003C0039003700340051006F002D\nS1232EC08C008A00A700A500A200C0008900B3007C00E6005001790183012D019601200157\nS1232EE0AA01D3011D02A7011002FA01C4016D013701C1002A01B401FE01E701D1015B015A\nS1232F0004014E01B801A101AB0155013E01E80092001B004500AF0018010201CC00150136\nS1232F209F01A901D2019C014601CF01190223021E039902940250022B0286020202FD0220\nS1232F40F802F3026B03E20339047004C7041F057605CD0544069B06D3062A078107B80702\nS1232F602F088708BE0835096C09A40976098809DB094D0920094C09580964099109BD096B\nS1232F80C909D509020A0E0A1A0A260A530A7F0AAB0AD70A210B4A0B740BDD0AC70A100BB6\nS1232FA0FA0AE30ACD09B60AC00A090B530B1C0B060BEF09D90A420B4C0BD50A3F0BE80A78\nS1232FC0D20ABB0A450A6E0A5709C1090A0AF40ADD0A070BF009BA098309AD09D60940092A\nS1232FE009097309DC09C609AF09F909020AEC09F5091F0A680A520997097C0961084708FF\nS12330006C08D107B6079C0861084609AC090050000000050000000000000000000000003D\nS123302005550000000000000005000055055500000505555005555550050500055005006C\nS12330400500005500055505550505505555550555555505550555555505055555505555F5\nS1233060555000550505555555550555055005555555555555550500500000000500000093\nS1233080005055000000000005000005000500000505000000000000050000000000005019\nS12330A000000000000000000055555055055505555555555555555555555555555555550E\nS12330C0555500000050555500000000000000000500050005000000000000555555555590\nS12330E05555555055550505000005005050000000000000505005005005055505000505C1\nS1233100050005000000000000500000005555555555555550505555555550555555055561\nS123312050505555555555555055555555555555555055050505505055555555555555004E\nS1233140000000000000005050000000000000500000000000050000050000000000000071\nS123316000505500000000000000005505000000000076065055500050500055550005008C\nS12331805005555000505005000050050050500000500055500050005000000500000000FD\nS12331A0000000000000050000000000000000005005000000550050050000505555505568\nS11E31C0555555555550505505555555550055555555555555555555555505F8\nS12331DC00001E013C02590377049405B106CD07E808030A1D0B360C4E0D660E7C0F901016\nS12331FCA411B612C713D614E415F016FA170219081A0C1B0E1C0E1D0C1E071F0020F6201F\nS123321CEA21DB22CA23B5249E258426672747282329FD29D32AA62B752C412D0A2ECE2ED3\nS123323C902F4D300731BD316F321D33C7336D340F35AD354636DC366D37FA3782380639FE\nS123325C8639013A783AEA3A573BC03B243C833CDE3C343D853DD23D193E5C3E9A3ED33E9C\nS123327C073F363F613F863FA63FC23FD83FEA3FF63FFE3F0040FE3FF63FEA3FD83FC23F83\nS123329CA63F863F613F363F073FD33E9A3E5C3E193ED23D853D343DDE3C833C243CC03BB9\nS12332BC573BEA3A783A013A863906398238FA376D37DC364636AD350F356D34C7331D331F\nS12332DC6F32BD3107314D30902FCE2E0A2E412D752CA62BD32AFD292329472867278426A1\nS12332FC9E25B524CA23DB22EA21F6200020071F0C1E0E1D0E1C0C1B081A0219FA17F016C7\nS123331CE415D614C713B612A41190107C0F660E4E0D360C1D0B030AE808CD07B1069405CE\nS123333C770459033C021E010000E4FEC6FDA7FC8BFB6EFA51F935F818F7FDF5E3F4CAF3F7\nS123335CB2F29CF186F070EF5CEE4AED3BEC2AEB1EEA11E908E800E7FAE5F4E4F2E3F2E251\nS123337CF6E1F9E002E00ADF16DE25DD38DC4BDB62DA7CD99BD8BBD7DDD605D62DD55CD42C\nS123339C8BD3BFD2F8D132D172D0B3CFFBCE45CE93CDE5CC3BCC95CBF3CA55CABAC926C9EC\nS12333BC95C808C87EC7FAC67CC601C68AC518C5ABC442C4DEC37DC322C3CCC27BC230C28E\nS12333DCE7C1A4C168C12FC1F9C0CAC0A1C07CC05AC040C028C018C00AC004C000C004C0DB\nS12333FC0AC018C028C040C05AC07CC0A1C0CAC0F9C02FC168C1A4C1E7C130C27BC2CCC246\nS123341C22C37DC3DEC342C4ABC418C58AC501C67CC6FAC67EC708C895C826C9BAC955CA59\nS123343CF3CA95CB3BCCE5CC93CD45CEFBCEB3CF72D033D1F8D1BFD28BD35CD42DD505D6CE\nS123345CDDD6BBD79BD87CD962DA4BDB38DC25DD16DE0ADF00E0F9E0F6E1F2E2F2E3F4E4D9\nS123347CFAE500E708E812E91EEA2AEB3BEC4AED5CEE70EF86F09CF1B2F2CAF3E3F4FDF52A\nS123349C18F735F851F96EFA8BFBA7FCC6FDE4FEE0343435509880F00000000000F7000084\nS12334BC00F7000000F7000000F7000000F7000000F7000000F7000000F7000000F7000034\nS12334DC00F7000005000500050005000500C615FE3F1F0AFEFFDF15463504001F0A0600DC\nS12334FCDF0B8CFB1F0A8EFBDF095A35DF1583008EFBDF095A35DF1583008EFBDF095A3524\nS123351CDF154B008EFBDF095A35DF152F008EFBDF095A35DF1546008EFBDF095A35DF15FB\nS123353C0D008EFBDF095A3501019625DF15400066FFDF15623500F4DF09AA131E00DF8B5C\nS123355C8CFBFD808700D09D00008A02A0F0008020202020202020202020202020202020B7\nS123357C4720205220204520204520205420204920204E2020472020530D0A2020202020CC\nS123359C20202020202020202020202D20202D20202D20202D20202D20202D20202D2020B0\nS12335BC2D20202D0D0A0A0A202020202042454341555345204F46204348414E47455320A0\nS12335DC494E20544845204E4154494F4E414C20504F4C4943592C20544845204C554E4150\nS12335FC520D0A4558504C4F5241544F52592050524F4752414D204953204F4E434520413F\nS123361C4741494E2046554E4354494F4E494E472C20414E4420594F5520484156450D0A70\nS123363C4245454E2043484F53454E204153205448452050494C4F5420494E20434F4D4D10\nS123365C414E44204F4620544845204C554E4152204D4F44554C452E0D0A202020202059FB\nS123367C4F55204D495353494F4E20495320544F204C414E44204F4E20001880B0F04D61C3\nS123369C726520417373616265742C001080A0F020412042415252454E20414E440D0A4877\nS12336BC415253482057415354454C414E442042454C494556454420494E43415041424C3F\nS12336DC45204F4620535550504F5254494E4720414E59204B4E4F574E20464F524D204F1D\nS12336FC46204C4946452E0D0A0D0A2020202020554E464F5254554E4154454C592C205488\nS123371C4845205350414345204147454E43592043484F534520544F2055534520414E2068\nS123373C494E464552494F520D0A4252414E44204F46204D494E49434F4D505554455220FC\nS123375C494E20544845204C554E4152204C414E4445522C20414E44204954204841530D54\nS123377C0A4A5553542044494544204F4E20594F552E20594F55204D555354204E4F5720E1\nS123379C4C414E4420554E444552204D414E55414C20434F4E54524F4C2E0D0A0D0A202091\nS12337BC20202020202020202A2A2A2A2A2020474F4F44204C55434B20202A2A2A2A2A004D\nS10737DC00E062356E\nS503018279\nS90334E0E8\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -decbin -o test.out -header HDR -multiple > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n#\n# Test writing the format.\n#\nsrec_cat test.in -decbin -o test.out -decbin -multi > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\nsrec_cmp -dsw test.in -decbin test.out -decbin -multi > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0076a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2001, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Fast Load format\"\n. test_prelude\n\n#\n# Test the Fast Load format\n#\ncat > test.in << 'fubar'\nS00600004844521B\nS123000067C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339FC99A45\nS123002066320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC871F\nS123004070E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5CF9\nS1230060021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B3F0\nS123008005EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C514735AC55E4B7963B5\nS12300A03B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF5E5\nS12300C00BE11A1C7F23F829F8A41B13B5CA4EE8983238E0794D3D34BC5F4E77FACB6C0589\nS12300E0AC86212BAA1A55A2BE70B5733B045CD33694B3AFE2F0E49E4F321549FD824EA92A\nS104010008F2\nS12301052954489A0ABCD50E18A844AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DAD2E\nS1230125D47647DE321CEC4AC430F62023856CFBB20704F4EC0BB920BA86C33E05F1ECD92D\nS12301456733B79950A3E314D3D934F75EA0F210A8F6059401BEB4BC4478FA4969E623D044\nS12301651ADA696A7E4C7E5125B34884533A94FB319990325744EE9BBCE9E525CF08F5E942\nS1230185E25E5360AAD2B2D085FA54D835E8D466826498D9A8877565705A8A3F6280294421\nS12301A5DE7CA5894E5759D351ADAC869580EC17E485F18C0C66F17CC07CBB22FCE466DA97\nS12301C5610B63AF62BC83B4692F3AFFAF271693AC071FB86D11342D8DEF4F89D4B6633514\nS12301E5C1C7E4248367D8ED9612EC453902D8E50AF89D7709D1A596C1F41F95AA82CA6CF0\nS123020549AE90CD1668BAAC7AA6F2B4A8CA99B2C2372ACB08CF61C9C3805E6E0328DA4CCB\nS1230225D76A19EDD2D3994C798B0022569AD418D1FEE4D9CD45A391C601FFC92AD9150168\nS1230245432FEE150287617C13629E69FC7281CD7165A63E000000000000000000000000C8\nS1230265000000000000000000000000000000000000000000000000000000000000000075\nS1230285000000000000000000000000000000000000000000000000000000000000000055\nS12302A500000000000000000000000000000000000000000000007097DE0C56891A2B21FF\nS12302C51B01070DD8FD8B16C2A1A4E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE133D\nS12302E5EFE520C7E2ABDDA44D81881C531AEEEB66244C3B791EA8ACFB6A68F358460647CD\nS12303052B260E0DD2EBB21F6C3A3BC0542AABBA4EF8F6C7169E731108DB0460220AA74DB4\nS123032531B55B03A00D220D475DCD9B877856D5704C9C86EA0F98F2EB9C530DA7FA5AD843\nS1230345B0B5DB50C2FD5D095A2AA5E2A3FBB71347549A316332234ECE765B7571B64D2157\nS12303656B28712E25CF3780F9DC629CD719B01E6D4A4FD17C731F4AE97BC05A310D7B9C04\nS123038536EDCA5BBC02DBB5DE3D52B65702D4C44C2495C897B5128030D2DB61E056FD1678\nS12303A543C871FFCA4DB5A88A075EE10933A655573B1DEEF02F6E20024981E2A07FF8E34C\nS12303C54769E311B698B9419F1822A84BC8FDA2041A90F449FE154B48962DE81525CB5C58\nS11E03E58FAE6D45462786E53FA98D8A718A2C75A4BC6AEEBA7F39021567EA05\nS5030021DB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/AAAA\nZ8Zpc1H.Suwpzbqr8vvjRnzCVPgb6OeNdlouYzOfyZpmMg23MVijWiVdBRdY6V7Uq7LNxpu0VBEOgnRB\nIT3ch3DpPqFB4fxnPgF,l,rca5aPOFwq7LA7,zKvPFTsGNtcAhr,Q.v6qjr7KdHmBTx8lHXYvmGJ,Vy7\nqJkPlbHr8bMF7.cA6aE65coLy9BIR2S9HyMeqBx7ZMUUc1rFXkt5YztwZCQRngncqtSs8hsQrzszzeNQ\nSEcVXLtvIhm6m331C,EaHH8j,Cn4pBsTtcpO6JgyOOB5TT00vF9Od.rLbAWshiErqhpV/CHGL/KAA\nor5wtXM7BFzTNpSzr,Lw5J5PMhVJ.YJO/BCp/BAI/AAEF\nKVRImgq81Q4YqESsW.OOTNctmwlC5QbEM6.No4R.La3UdkfeMhzsSsQw9iAjhWz7sgcE9OwLuSC6hsM,\nBfHs2Wczt5lQo,MU09k0916g8hCo9gWUAb60vER4,klp5iPQGtppan5MflEls0iEUzqU,zGZkDJXRO6b\nvOnlJc8I9eniXlNgqtKy0IX6VNg16NRmgmSY2aiHdWVwWoo.YoApRN58pYlOV1nTUa2shpWA7BfkhfGM\nDGbxfMB8uyL85GbaYQtjr2K8g7RpLzr.rycW/CHhe/KAA\nk6wHH7htETQtje9PidS2YzXBx,Qkg2fY7ZYS7EU5AtjlCviddwnRpZbB9B,VqoLKbEmukM0WaLqseqby\ntKjKmbLCNyrLCM9hycOAXm4DKNpM12oZ7dLTmUx5iwAiVprUGNH,5NnNRaORxgH.ySrZFQFDL,4VAodh\nfBNinmn8coHNcWWmPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/CESc/KAA\nAHCX3gxWiRorIRsBBw3Y.YsWwqGk48.SktKYSzVh1VXRbDPdwrz37d4T7,Ugx,Kr3aRNgYgcUxru62Yk\nTDt5Hqis,2po81hGBkcrJg4N0uuyH2w6O8BUKqu6Tvj2xxaecxEI2wRgIgqnTTG1WwOgDSINR13Nm4d4\nVtVwTJyG6g,Y8uucUw2n,lrYsLXbUML9XQlaKqXio.u3E0dUmjFjMiNOznZbdXG2TSFrKHEuJc83gPnc\nYpzXGbAebUpP0XxzH0rpe8BaMQ17nDbtylu8Atu13j1StlcC1MRMJJXIl7USgDDS22Hg/CG7n/KAA\nVv0WQ8hx.8pNtaiKB17hCTOmVVc7He7wL24gAkmB4qB.,ONHaeMRtpi5QZ8YIqhLyP2iBBqQ9En,FUtI\nli3oFSXLXI,ubUVGJ4blP6mNinGKLHWkvGruun85AhVn/BDq/CC0B/AAAA/EAA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -fastload\nif test $? -ne 0; then fail; fi\n\nsrec_cmp test.in test.out -fastload\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0077a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2002, 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"os65v format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS111000048656C6C6F2C20576F726C64210A7B\nS9031000EC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n.0000/48\n65\n6C\n6C\n6F\n2C\n20\n57\n6F\n72\n6C\n64\n21\n0A\n.00FD/00\nfubar\nif test $? -ne 0; then no_result; fi\n\n# This is the actual test\nsrec_cat test.in -o test.out -os65v -eol=nl -disable=esa > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\n.0000/48\n65\n6C\n6C\n6F\n2C\n20\n57\n6F\n72\n6C\n64\n21\n0A\n.1000G\nfubar\nif test $? -ne 0; then no_result; fi\n\n# This is the actual test\nsrec_cat test.in -o test.out -os65v -eol=nl > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\nmv test.out test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9031000EC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -os -o test.out -header HDR > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0078a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2002, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"motorola S5\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS32100011AA8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37\nS32100011AC4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B\nS30D00011AE0FFFFFFFFFFFFFFFFFF\nS50500000003F7\nS70500001000EA\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS224011AA8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38\nS224011AC8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18\nS5030002FA\nS9031000EC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0079a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2002, 2003, 2006-2008, 2010 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"input -max-addr\"\n. test_prelude\n\ncat > test.in1 << 'fubar'\nS00600004844521B\nS10A000048656C6C6F2C20B5\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in2 << 'fubar'\nS00600004844521B\nS10A0000576F726C64210AC2\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in1 test.in2 -offset -max-addr test.in1 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10A000048656C6C6F2C20B5\nS10A0010576F726C64210AB2\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in1 test.in2 -offset -max-addr test.in1 -ru 16 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0080a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ASM format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300004E6F77206973207468652074696D6520666F7220616C6C20676F6F64206D656E93\nS123002020746F20636F6D6520746F2074686520616964206F6620746865697220706172AF\nS107004074792E0A93\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n; HDR\n        DB      78,111,119,32,105,115,32,116,104,101,32,116,105,109,101,32\n        DB      102,111,114,32,97,108,108,32,103,111,111,100,32,109,101,110\n        DB      32,116,111,32,99,111,109,101,32,116,111,32,116,104,101,32\n        DB      97,105,100,32,111,102,32,116,104,101,105,114,32,112,97,114\n        DB      116,121,46,10\n; execution start address = 0x0000\n; upper bound = 0x0044\n; lower bound = 0x0000\n; length =      0x0044\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -asm\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0081a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"BASIC output format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300004E6F77206973207468652074696D6520666F7220616C6C20676F6F64206D656E93\nS123002020746F20636F6D6520746F2074686520616964206F6620746865697220706172AF\nS107004074792E0A93\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nREM HDR\nDATA 78,111,119,32,105,115,32,116,104,101,32,116,105,109,101,32,102,111,114\nDATA 32,97,108,108,32,103,111,111,100,32,109,101,110,32,116,111,32,99,111\nDATA 109,101,32,116,111,32,116,104,101,32,97,105,100,32,111,102,32,116,104\nDATA 101,105,114,32,112,97,114,116,121,46,10\nREM termination = 0\nREM start = 0\nREM finish = 68\nREM length = 68\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -basic\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0082a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Needham Hex format\"\n. test_prelude\n\n# ------ test writing Needham Hex format -----------------------------------\n\ncat > test.in << 'fubar'\nS111000048656C6C6F2C20576F726C64210A7B\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n$A00000000,\n48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -nh > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ------ test writing Needham Hex format -----------------------------------\n\ncat > test.ok2 << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.out -nh -o test.out2 > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok2 test.out2\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0083a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Cosmac format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS12300004B33195800334FA288C4E25FD5D2113274295C8CC3AECB1CC0F79DB4D33B8E1FB2\nS12300206EA7776EDAC611638AF3C260C5D39239FCEEC5C09C91DC5D8879115BB49F7A227B\nS123004046F19021B7A184429446A259193492152258D5BFE9B11C712A2DCCDECC47001272\nS1230060389133F032B732C7FDD4201608B32C2A0B01E9F4B30565DD3231BCFE78BC11B1A0\nS12300804D44A180FCD347F9A76710AF1A3CD9253DC319F0C87ECEFBB08AF928460AD9944A\nS12300A04F7A144B4D5B44F4C254A3DD907D02CE401CBE089A8C034A16FD735D074CF156AF\nS10D00C0C705A11460E609223AAC5A\nS12300CBCB290299691E5772B8E47503FA7276577AC248D0894D729EAD58A7D09253CF5D1E\nS12300EB7DD1F6E6EF4E58A832CEAB2C402184BAE3CC8B6D1AFD0BC755B297E705674582CC\nS123010B383B692889C1D0BB8F7BE8D09C6C8A7F3815EC5212F71A67A9B14FAF1894315189\nS123012BCF9A79595C4914EBC4FCBB606846DFA15BCCF36EC30DD56DBF241CD7B84D2888A3\nS123014BE8A1E144EAF52FAEF2EB0E5A31EEFB8CBAEFFA7DFCD0EABBF40693AD54BB353CF0\nS123016B5D1680470BAFF6FD9A0458CBF25358AC42522A3F2214FA171B8DC46F49F9ABA6CD\nS123018B0F2BED1ADAE31875E87040DAC3988706EBB1450DC53F24E0CDE84F16E1FABCF0D4\nS12301AB25A90B008D23757593B54F564ED65C3987A1464DE16B2DAE537DC4357780259DB3\nS12301CB29309DB653122BE6C77B3D1551994ED93B95261C0053CA53D08E88480EAEE537C1\nS12301EBDE82EE329419185B945571E6EFBFBF2A54E546543810A8099E3051ACDE36E3BD2E\nS123020BB8D1EF4CEB07A77F5D18654CD824762C09BC8142CC294B6A599C1638D2F9F58A70\nS123022BCBE4D6B6EB7D3548969B946EBF0A9AC9C61B0B924456FC9EF212D6C40CCB4ED7E4\nS123024BAF248D9AA1C2E3375D77A51D8240E6485BF1DBA047D73E39EA14FDF6DF4BCD8EC0\nS123026B6F5A28101C0B487A83ED97052D7D4D896E2829B50067EEEA7BEBE05A36ADE8A536\nS123028B0710B5231CFD9D9FEB34A418B1F1A11F1ACAD41A31C204ACADE406E391EE889840\nS12302AC3EBB1B3B59BA268D5E3F3F4FE05E69AB3383DCF58789A36B8F86FC7E0F947D4DFB\nS10D02CC509888A952AF36B0EE75C1\nS12302D7CED4697907EC56FC74DF9FDF6E26DCEC35706982C0010A6953B9A003A715037665\nS12302F7E96CEFF05845EDCC248CAC93B2887FE7F8E969B9EA74223E2DC241D5D8444BC1DC\nS1220317B03AB209809FD5A42B8137DE09B7C502A02FBB8AA3DDC8D0A00AA5784EF039D4\nS12303372BEB08AB8ADD4FB65F8794683E596ADE8825682B0331FCA33BA11B89925488BDEE\nS1230357409068CA6EB780CD3E14357C6EA05AF6C5C322C8F41E6B2FBF86B851DB410E1BFC\nS1230377D176E53F2E660C6C7A42E9E8E243DFA7060170FA1FDB29DE62E2303D233E58F4E3\nS1230397B53D34E3A3404F1E823806647CE50C82E67C7D0557A6E4B98814F6AB524EA007D4\nS12303B78CD4EA2F143A4D977254FBEE3907712083EE25DB9409941D1D8BC870D96877653B\nS12303D73C6295519CE2E80E36E3FD70EB6E906E5CB549F0BFDE0DDC69D64C423EC4A87B6B\nS10C03F7263DCCC21FB4D0569778\nS5030022DA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n!M0000 ;\n0000 4B33195800334FA288C4E25FD5D2113274295C8CC3AECB1CC0F79DB4D33B8E1F6EA7776EDA,\nC611638AF3C260C5D39239FCEEC5C09C91DC5D8879115BB49F7A2246F19021B7A184429446A259,\n193492152258D5BFE9B11C712A2DCCDECC470012389133F032B732C7FDD4201608B32C2A0B01E9,\nF4B30565DD3231BCFE78BC11B14D44A180FCD347F9A76710AF1A3CD9253DC319F0C87ECEFBB08A,\nF928460AD9944F7A144B4D5B44F4C254A3DD907D02CE401CBE089A8C034A16FD735D074CF156C7,\n05A11460E609223AAC;\n00CB CB290299691E5772B8E47503FA7276577AC248D0894D729EAD58A7D09253CF5D7DD1F6E6EF,\n4E58A832CEAB2C402184BAE3CC8B6D1AFD0BC755B297E705674582383B692889C1D0BB8F7BE8D0,\n9C6C8A7F3815EC5212F71A67A9B14FAF18943151CF9A79595C4914EBC4FCBB606846DFA15BCCF3,\n6EC30DD56DBF241CD7B84D2888E8A1E144EAF52FAEF2EB0E5A31EEFB8CBAEFFA7DFCD0EABBF406,\n93AD54BB353C5D1680470BAFF6FD9A0458CBF25358AC42522A3F2214FA171B8DC46F49F9ABA60F,\n2BED1ADAE31875E87040DAC3988706EBB1450DC53F24E0CDE84F16E1FABCF025A90B008D237575,\n93B54F564ED65C3987A1464DE16B2DAE537DC4357780259D29309DB653122BE6C77B3D1551994E,\nD93B95261C0053CA53D08E88480EAEE537DE82EE329419185B945571E6EFBFBF2A54E546543810,\nA8099E3051ACDE36E3BDB8D1EF4CEB07A77F5D18654CD824762C09BC8142CC294B6A599C1638D2,\nF9F58ACBE4D6B6EB7D3548969B946EBF0A9AC9C61B0B924456FC9EF212D6C40CCB4ED7AF248D9A,\nA1C2E3375D77A51D8240E6485BF1DBA047D73E39EA14FDF6DF4BCD8E6F5A28101C0B487A83ED97,\n052D7D4D896E2829B50067EEEA7BEBE05A36ADE8A50710B5231CFD9D9FEB34A418B1F1A11F1ACA,\nD41A31C204ACADE406E391EE8898;\n02AC 3EBB1B3B59BA268D5E3F3F4FE05E69AB3383DCF58789A36B8F86FC7E0F947D4D509888A952,\nAF36B0EE75;\n02D7 CED4697907EC56FC74DF9FDF6E26DCEC35706982C0010A6953B9A003A7150376E96CEFF058,\n45EDCC248CAC93B2887FE7F8E969B9EA74223E2DC241D5D8444BC1B03AB209809FD5A42B8137DE,\n09B7C502A02FBB8AA3DDC8D0A00AA5784EF039;\n0337 2BEB08AB8ADD4FB65F8794683E596ADE8825682B0331FCA33BA11B89925488BD409068CA6E,\nB780CD3E14357C6EA05AF6C5C322C8F41E6B2FBF86B851DB410E1BD176E53F2E660C6C7A42E9E8,\nE243DFA7060170FA1FDB29DE62E2303D233E58F4B53D34E3A3404F1E823806647CE50C82E67C7D,\n0557A6E4B98814F6AB524EA0078CD4EA2F143A4D977254FBEE3907712083EE25DB9409941D1D8B,\nC870D96877653C6295519CE2E80E36E3FD70EB6E906E5CB549F0BFDE0DDC69D64C423EC4A87B26,\n3DCCC21FB4D05697\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -cosmac\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# now test reading the Cosmsc format\n#\nsrec_cmp test.in test.out -cosmac\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0085a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Formatted Binary format\"\n. test_prelude\n\n# ---------- test reading Formatted Binary ---------------------------------\n\ncat > test.in.srec << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS1230000081C2A49080000000200FF010204081020408055AA0102030405060708090A0BFC\nS11200200C0D0E0F10111213141516000002FB15\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.srec -o test.in -bin\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS1230000010204081020408055AA0102030405060708090A0B0C0D0E0F10111213141516E1\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp test.in -fb test.ok\nif test $? -ne 0; then fail; fi\n\n# ---------- test writing Formatted Binary ---------------------------------\n\ncat > test.in.srec << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.srec -o test.in -bin\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.srec << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS1200000081C2A4908000000000EFF48656C6C6F2C20576F726C64210A0000047349\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.ok.srec -o test.ok -bin\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bin -o test.out -fb\nif test $? -ne 0; then fail; fi\n\ncmp test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0086a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Spectrum format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.srec << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS123000002303030302030313030313030300A303030312030313130303130310A3030306F\nS1230020322030313130313130300A303030332030313130313130300A3030303420303126\nS12300403130313131310A303030352030303130313130300A3030303620303031303030F4\nS123006030300A303030372030313031303131310A303030382030313130313131310A30F4\nS12300803030392030313131303031300A303031302030313130313130300A3030313120C4\nS12300A030313130303130300A303031322030303130303030310A3030313320303030309C\nS10900C0313031300A0367\nS5030007F5\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\nsrec_cat test.ok.srec -o test.ok -bin\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -spectrum\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\nsrec_cmp test.out -spectrum test.in\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0087a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Fairchild Fairbug format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS0000\nX48656C6C6F2C2057C\nX6F726C64210AFFFF3\n*\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding=8 \\\n    -o test.out -fairchild\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\nsrec_cmp test.in test.out -fairchild -unfill 0xFF\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0088a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008, 2010 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"INHX16 format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:010000040000FB\n:0700000065486C6C2C6F5720726F646C0A2186\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -inhx16\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n\ncat > test.in << 'fubar'\n:010000040000FB\n:0700000065486C6C2C6F5720726F646C0A2186\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS111000048656C6C6F2C20576F726C64210A7B\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -inhx16 -o test.out -data-only\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0089a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008, 2013 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Verilog VMEM format\"\n. test_prelude\n\n# ---------- Test Writing (32-bit) -----------------------------------------\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\n@00000000 48656C6C 6F2C2057 6F726C64 210AFFFF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding 4 \\\n    -o test.out -vmem\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- Test Writing (16-bit) -----------------------------------------\n\ncat > test.ok << 'fubar'\n/* hello */\n@00000000 4865 6C6C 6F2C 2057 6F72 6C64 210A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -vmem 16 -header hello\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- Test Writing (8-bit) ------------------------------------------\n\ncat > test.ok << 'fubar'\n/* HDR */\n@00000000 48 65 6C\n@00000003 6C 6F 2C\n@00000006 20 57 6F\n@00000009 72 6C 64\n@0000000C 21 0A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -vmem 8 -line-leng 20\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- Test Reading (32-bit) -----------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS113000048656C6C6F2C20576F726C64210AFFFF7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in << 'fubar'\n@00000000 48656C6C\n@1 6F2C2057\n@00000002\n6F726C64\n@0003 210AFFFF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp test.ok test.in -vmem\nif test $? -ne 0; then fail; fi\n\n# ---------- Test Reading (16-bit) -----------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in << 'fubar'\n// comment\n@0 4865 6C6C 6F2C 2057 6F72\n@0005\n6C64\n210A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp test.ok test.in -vmem\nif test $? -ne 0; then fail; fi\n\n# ---------- Test Reading (8-bit) ------------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in << 'fubar'\n@0 48 65 6C /* comment **/ 6C 6F 2C 20 57\n@8 6F 72 6C 64 21 0A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp test.ok test.in -vmem\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0090a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2003, 2006-2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel segment output\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:020000021000EC\n:0E00000048656C6C6F2C20576F726C64210A7F\n:0400000300010000F8\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 0x10000 -o test.out -intel -al=3\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0091a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2004, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Verilog VMEM format\"\n. test_prelude\n\n# ---------- Test Writing (64-bit) -----------------------------------------\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\n@00000000 48656C6C6F2C2057 6F726C64210AFFFF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding 8 \\\n    -o test.out -vmem 64\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- Test Writing (128-bit) ----------------------------------------\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\n@00000000 48656C6C6F2C20576F726C64210AFFFF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-pad 16 \\\n    -o test.out -vmem 128\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0092a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2004, 2006-2008 Peter Miller\n#       Copyright (C) 2014 Scott Finneran\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"AOMF format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\n# Check writing AOMF\n#\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.srec << 'fubar'\nS00500004F4B60\nS12300000207000348445200001606120000214348656C6C6F2C20576F726C64210A1104D8\nS10E00200900034844520000000012D5\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 0x4321 -header HDR -o test.out -aomf\nif test $? -ne 0; then fail; fi\n\nsrec_cat test.ok.srec -o test.ok -bin\nif test $? -ne 0; then no_result; fi\n\ncmp test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# --------------------------------------------------------------------------\n#\n# check reading AOMF\n#\n\nmv test.out test.in\nif test $? -ne 0; then no_result; fi\n\ncat > ok << 'fubar'\nFormat: Intel Absolute Object Module Format (AOMF)\nHeader: \"HDR\"\nData:   4321 - 432E\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.in -aomf > test.out\nif test $? -ne 0; then fail; fi\n\ndiff ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0093a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2004, 2006-2008 Peter Miller\n#       Copyright (C) 2014 Scott Finneran\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"AOMF format\"\n. test_prelude\n\ncat > test.in.srec << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS1230000020C00085352454354455354FF007E100B000008535245435445535470123A0090\nS1230020010040F00F00094352435F53544152540040F20F00074352435F4C454E0040F41C\nS12300400F000543524331360040BC00000B43524331365F5441424C45B4120C000000006A\nS12300607F0000044D41494E3A100D00020A43524331365F464153540B065200003100AA67\nS123008082AB83AC08AD09AE0AAF0B8E008F011EBEFF011FE84960308B0079008C828D83D4\nS12300A0E493F9A3AC82AD83E96825E0F5F09000BC5002058393F8E5F00493F98A037A0073\nS12300C0E86202E9620380C38A828B832263121B000300310030000035003200004A00342A\nS12300E000007A003600007E00370025100D00050A43524331365F46415354081007000259\nS1230100044D41494EBE064100007F00900FF0E493FA740193FB8A088B09900FF2E493F508\nS12301200A740193F50B900000120031AA82AB83900FF4E493FC740193FDEAB50406EBB528\nS12301400502800280FE80FE22DA120B00000042FF00000353554DAA12200003007F00392D\nS123016000007F003D0000A3003F0000B700410000B700440000BB00450082100700050448\nS12301804D41494EBB100B00030853524543544553546D101200000F4F544845525F5344D2\nS12301A043435F53545546300635000000000202C032FFFFFFFFFFFFFF32FFFFFFFFFFFF8E\nS12301C0FF32FFFFFFFFFFFFFF32FFFFFFFFFFFFFF32FFFFFFFFFFFFFF3212007F80FEE971\nS12301E006500200BC0000002110422063308440A550C660E770088129914AA16BB18CC1F4\nS1230200ADD1CEE1EFF13112100273325222B5529442F772D662399318837BB35AA3BDD3BF\nS12302209CC3FFF3DEE36224433420040114E664C774A44485546AA54BB528850995EEE5FF\nS1230240CFF5ACC58DD55336722611163006D776F6669556B4465BB77AA719973887DFF77F\nS1230260FEE79DD7BCC7C448E5588668A7784008611802282338CCC9EDD98EE9AFF94889B7\nS123028069990AA92BB9F55AD44AB77A966A711A500A333A122AFDDBDCCBBFFB9EEB799BBF\nS12302A0588B3BBB1AABA66C877CE44CC55C222C033C600C411CAEED8FFDECCDCDDD2AAD7F\nS12302C00BBD688D499D977EB66ED55EF44E133E322E511E700E9FFFBEEFDDDFFCCF1BBF7F\nS12302E03AAF599F788F8891A981CAB1EBA10CD12DC14EF16FE18010A100C230E3200450F4\nS1230300254046706760B9839893FBA3DAB33DC31CD37FE35EF3B1029012F322D2323542DE\nS1230320145277625672EAB5CBA5A89589856EF54FE52CD50DC5E234C324A01481046674DE\nS1230340476424540544DBA7FAB79987B8975FE77EF71DC73CD7D326F2369106B01657669E\nS12303607676154634564CD96DC90EF92FE9C899E9898AB9ABA94458654806782768C01896\nS1230380E1088238A3287DCB5CDB3FEB1EFBF98BD89BBBAB9ABB754A545A376A167AF10ADE\nS12303A0D01AB32A923A2EFD0FED6CDD4DCDAABD8BADE89DC98D267C076C645C454CA23C5E\nS12303C0832CE01CC10C1FEF3EFF5DCF7CDF9BAFBABFD98FF89F176E367E554E745E932E9E\nS12303E0B23ED10EF01E7582002275810B1202BCE582600302002C7900E94400601B7A009F\nS1230400900308780075A000E493F2A308B8000205A0D9F4DAF275A0FF7800E84400600C80\nS12304207900900000E4F0A3D8FCD9FAF6D8FD02002CF7101200030F4F544845525F5344F5\nS11C044043435F535455462D040E0008535245435445535400000F006A4B\nS5030023D9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.srec -o test.in -bin\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00B0000535245435445535487\nS12300000202C032FFFFFFFFFFFFFF32FFFFFFFFFFFFFF32FFFFFFFFFFFFFF32FFFFFFFF69\nS1230020FFFFFF32FFFFFFFFFFFFFF3212007F80FEAA82AB83AC08AD09AE0AAF0B8E008F00\nS1230040011EBEFF011FE84960308B0079008C828D83E493F9A3AC82AD83E96825E0F5F011\nS12300609000BC5002058393F8E5F00493F98A037A00E86202E9620380C38A828B832290B6\nS12300800FF0E493FA740193FB8A088B09900FF2E493F50A740193F50B900000120031AA37\nS12300A082AB83900FF4E493FC740193FDEAB50406EBB50502800280FE80FE220000211060\nS12300C0422063308440A550C660E770088129914AA16BB18CC1ADD1CEE1EFF131121002F8\nS12300E073325222B5529442F772D662399318837BB35AA3BDD39CC3FFF3DEE36224433434\nS123010020040114E664C774A44485546AA54BB528850995EEE5CFF5ACC58DD55336722677\nS123012011163006D776F6669556B4465BB77AA719973887DFF7FEE79DD7BCC7C448E55833\nS12301408668A7784008611802282338CCC9EDD98EE9AFF9488969990AA92BB9F55AD44AF7\nS1230160B77A966A711A500A333A122AFDDBDCCBBFFB9EEB799B588B3BBB1AABA66C877C33\nS1230180E44CC55C222C033C600C411CAEED8FFDECCDCDDD2AAD0BBD688D499D977EB66E77\nS12301A0D55EF44E133E322E511E700E9FFFBEEFDDDFFCCF1BBF3AAF599F788F8891A98151\nS12301C0CAB1EBA10CD12DC14EF16FE18010A100C230E3200450254046706760B9839893F7\nS12301E0FBA3DAB33DC31CD37FE35EF3B1029012F322D2323542145277625672EAB5CBA533\nS1230200A89589856EF54FE52CD50DC5E234C324A01481046674476424540544DBA7FAB776\nS12302209987B8975FE77EF71DC73CD7D326F2369106B01657667676154634564CD96DC932\nS12302400EF92FE9C899E9898AB9ABA94458654806782768C018E1088238A3287DCB5CDBF6\nS12302603FEB1EFBF98BD89BBBAB9ABB754A545A376A167AF10AD01AB32A923A2EFD0FED32\nS12302806CDD4DCDAABD8BADE89DC98D267C076C645C454CA23C832CE01CC10C1FEF3EFF76\nS12302A05DCF7CDF9BAFBABFD98FF89F176E367E554E745E932EB23ED10EF01E758200228C\nS12302C075810B1202BCE582600302002C7900E94400601B7A00900308780075A000E49317\nS12302E0F2A308B8000205A0D9F4DAF275A0FF7800E84400600C7900900000E4F0A3D8FCED\nS10B0300D9FAF6D8FD02002C25\nS5030019E3\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -dsw test.in -aomf -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0095a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2004, 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"stewie format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS110000048656C6C6F2C20576F726C640A9D\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.srec << 'fubar'\nS0030000FC\nS11C000053303033533110000048656C6C6F2C20576F726C640A9D5338EF\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.ok.srec -o test.ok -bin\nif test $? -ne 0; then fail; fi\n\n#\n# Read Motorola format and write Stewie format.\n#\nsrec_cat test.in -o test.out -stewie\nif test $? -ne 0; then fail; fi\n\ncmp test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# Read Stewie format and write Motorola format.\n#\nsrec_cat test.out -stewie -o test.out2 -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.in test.out2\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0096a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2005-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"CRLF\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS109000068656C6C6F0AD8\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.srec << 'fubar'\nS1230000533032323030303036383734373437303341324632463733373236353633364603\nS12300203732363432453733364637353732363336353636364637323637363532453645C8\nS123004036353734324631440D0A53313039303030303638363536433643364630414438E1\nS11100600D0A533530333030303146420D0A2C\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.ok.srec -o test.ok -bin > LOG 2>&1\nif test $? -ne 0; then cat LOG; no_result; fi\n\nsrec_cat test.in -o test.out -crlf > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ncmp test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0097a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2005-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"motorola --ignore-checksums\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS006000048445200\nS1230000285F245F2212226A000424290008237C0002000800082629001853812341001800\nS117002041E900084E42234300182342000824A900144ED400\nS503000200\nS903000000\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000285F245F2212226A000424290008237C0002000800082629001853812341001851\nS117002041E900084E42234300182342000824A900144ED418\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in --ignore-checksums -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0098a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2005-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"vmem format\"\n. test_prelude\n\ncat > test.in << 'fubar'\n:1000A0000302050C3000800C010C2600E307560A01\n:1000B0000302020C2600030210022700E3075E0A77\n:0600C000F002530A500A91\n:0203FE00500AA3\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* http://srecord.sourceforge.net/ */\n@00000050 0203 0C05 0030 0C80 0C01 0026 07E3 0A56 0203 0C02 0026 0203 0210 0027\n@0000005E 07E3 0A5E 02F0 0A53 0A50\n@000001FF 0A50\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -intel -byteswap -o test.out -vmem 16\ntest $? -eq 0 || fail\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/00/t0099a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2005-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"motorola 2 (word addresses)\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300004A8E641A273D44AD3588C7BF3F860EA96BB6035EED9CEB5F4637D105E34FD8229E\nS123002044A3AB427AF583A2AC951B0C61ECAA63F074A4BC8E6367BCD2F1BC0DD548D42815\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS12300004A8E641A273D44AD3588C7BF3F860EA96BB6035EED9CEB5F4637D105E34FD8229E\nS123001044A3AB427AF583A2AC951B0C61ECAA63F074A4BC8E6367BCD2F1BC0DD548D42825\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -mot 2\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\nsrec_cat test.out 2 -o test.back\nif test $? -ne 0; then fail; fi\n\ndiff test.in test.back\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0100a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2005-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"byte swap\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10B000057202C6F6C6C65485D\nS109000A0A21646C726F10\nS5030002FA\nS9030007F5\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bs 8 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0101a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel hex\"\n. test_prelude\n\ncat > test.in << 'fubar'\n:200000000000C0C1C1810140C30103C00280C241C60106C00780C7410500C5C1C4810440A0\n:20002000CC010CC00D80CD410F00CFC1CE810E400A00CAC1CB810B40C90109C00880C84100\n:20004000D80118C01980D9411B00DBC1DA811A401E00DEC1DF811F40DD011DC01C80DC41E0\n:200060001400D4C1D5811540D70117C01680D641D20112C01380D3411100D1C1D081104040\n:20008000F00130C03180F1413300F3C1F28132403600F6C1F7813740F50135C03480F44120\n:2000A0003C00FCC1FD813D40FF013FC03E80FE41FA013AC03B80FB413900F9C1F881384080\n:2000C0002800E8C1E9812940EB012BC02A80EA41EE012EC02F80EF412D00EDC1EC812C4060\n:2000E000E40124C02580E5412700E7C1E68126402200E2C1E3812340E10121C02080E041C0\n:20010000A00160C06180A1416300A3C1A28162406600A6C1A7816740A50165C06480A4419F\n:200120006C00ACC1AD816D40AF016FC06E80AE41AA016AC06B80AB416900A9C1A8816840FF\n:200140007800B8C1B9817940BB017BC07A80BA41BE017EC07F80BF417D00BDC1BC817C40DF\n:20016000B40174C07580B5417700B7C1B68176407200B2C1B3817340B10171C07080B0413F\n:20018000500090C191815140930153C052809241960156C057809741550095C1948154401F\n:2001A0009C015CC05D809D415F009FC19E815E405A009AC19B815B40990159C0588098417F\n:2001C000880148C0498089414B008BC18A814A404E008EC18F814F408D014DC04C808C415F\n:2001E000440084C185814540870147C046808641820142C043808341410081C180814040BF\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:020000040020DA\n:200000000000C0C1C1810140C30103C00280C241C60106C00780C7410500C5C1C4810440A0\n:20002000CC010CC00D80CD410F00CFC1CE810E400A00CAC1CB810B40C90109C00880C84100\n:20004000D80118C01980D9411B00DBC1DA811A401E00DEC1DF811F40DD011DC01C80DC41E0\n:200060001400D4C1D5811540D70117C01680D641D20112C01380D3411100D1C1D081104040\n:20008000F00130C03180F1413300F3C1F28132403600F6C1F7813740F50135C03480F44120\n:2000A0003C00FCC1FD813D40FF013FC03E80FE41FA013AC03B80FB413900F9C1F881384080\n:2000C0002800E8C1E9812940EB012BC02A80EA41EE012EC02F80EF412D00EDC1EC812C4060\n:2000E000E40124C02580E5412700E7C1E68126402200E2C1E3812340E10121C02080E041C0\n:20010000A00160C06180A1416300A3C1A28162406600A6C1A7816740A50165C06480A4419F\n:200120006C00ACC1AD816D40AF016FC06E80AE41AA016AC06B80AB416900A9C1A8816840FF\n:200140007800B8C1B9817940BB017BC07A80BA41BE017EC07F80BF417D00BDC1BC817C40DF\n:20016000B40174C07580B5417700B7C1B68176407200B2C1B3817340B10171C07080B0413F\n:20018000500090C191815140930153C052809241960156C057809741550095C1948154401F\n:2001A0009C015CC05D809D415F009FC19E815E405A009AC19B815B40990159C0588098417F\n:2001C000880148C0498089414B008BC18A814A404E008EC18F814F408D014DC04C808C415F\n:2001E000440084C185814540870147C046808641820142C043808341410081C180814040BF\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -intel -offset 0x200000 -o test.out -inte > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0102a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec_output_file_asm\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n; HDR\n; To avoid this next ORG directive, use the --offset -0x64 filter.\n        ORG     100\n        DB      72,101,108,108,111,44,32,87,111,114,108,100,33,10\n; To avoid this next ORG directive, use the --fill filter.\n        ORG     150\n        DB      72,101,108,108,111,44,32,87,111,114,108,100,33,10\n; upper bound = 0x00A4\n; lower bound = 0x0064\n; length =      0x0040\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -offset 100 test.in -offset 150 \\\n        -o test.out -asm > log 2>&1\nif test $? -ne 0; then cat log; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0103a.sh",
    "content": "#!/bin/sh\n#\n# srecord - manipulate eprom load files\n# Copyright (C) 2006-2008, 2010, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"command line parsing\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00E00004170706C696361746D6F7473\nS12327E0F5A639C0139B32163E25FD5CF1040C7E4EA87EB9D0F5C60DEB7CCC9EDAF72D2C50\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00E00004170706C696361746D6F7473\nS12327E0F5A639C0139B32163E25FD5CF1040C7E4EA87EB9D0F5C60DEB7CCC9EDAF72D2C50\nS10528002D465F\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -checksum_neg_be '(' -max-addr test.in ')' 2 2 > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0105a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2006-2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"command line @file arguments\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS111010048656C6C6F2C20576F726C64210A7A\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > args << 'fubar'\ntest.in\n--offset=0x100\n-o test.out\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat @args > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0106a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"b-record\"\n. test_prelude\n\ncat > test.in << 'fubar'\n000000000E48656C6C6F2C20576F726C64210A\n0000002A00\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS903002AD2\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cmp test.in -brec test.ok -mot\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0107a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"write b-record\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS903002AD2\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n000000000E48656C6C6F2C20576F726C64210A\n0000002A00\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -mot -o test.out -brec\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0108a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"TI-Tagged\"\n. test_prelude\n\ncat > test.in << 'fubar'\n00050        7FDD4F\n90000BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F400F\n90010BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FFF\n90020BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FEF\n90030BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FDF\n90040BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FCF\n:\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC\nS1230020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC\nS1130040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -tit -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0109a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2007, 2008, 2010 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-tagged-16 format\"\n. test_prelude\n\n# --------------------------------------------------------------------------\n#\n# Test writing the format\n#\ncat > test.in << 'fubar'\nS00600004844521B\nS10A000048656C6C6F2C20B5\nS10A0123576F726C64210A9E\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nK0008HDR90000B4865B6C6CB6F2CB20FF90091BFF57B6F72B6C64B210A7F290F\n:\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding 2 \\\n        -o test.out -ti-tagged-16\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n\n# --------------------------------------------------------------------------\n#\n# Test reading the format\n#\ncat > test.in << 'fubar'\n00028        7FDCFF\nK000Coughing7FBBAF\n90000BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F400F\n90008BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3F8F\n90010BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FFF\n90018BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3F7F\n90020BFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFFBFFFF7F3FEF\n:\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00A00006F756768696E6704\nS1230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC\nS1230020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC\nS1130040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -ti-tagged-16 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0110a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ascii-hex\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS321000000007FD243A67FF343A63FC0003F3BDE700C3BE0000193FE00007FFA02A6A8\nS3210000001C93FE00047FFB02A693FE00087FD242A67FF342A648001F040000000074\nS3210000003800000000000000000000000000000000000000000000000000000000A6\nS32100000054000000000000000000000000000000000000000000000000000000008A\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > x.awk << 'fubar'\n{\n    line = $0\n    sub(/\\^B/, \"\\2\", line)\n    sub(/\\^C/, \"\\3\", line)\n    print line\n}\nfubar\nif test $? -ne 0; then no_result; fi\n\nawk -f x.awk > test.ok << 'fubar'\n^B $A0000,\n7F D2 43 A6 7F F3 43 A6 3F C0 00 3F 3B DE 70 0C\n3B E0 00 01 93 FE 00 00 7F FA 02 A6 93 FE 00 04\n7F FB 02 A6 93 FE 00 08 7F D2 42 A6 7F F3 42 A6\n48 00 1F 04 00 00 00 00 00 00 00 00 00 00 00 00\n00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00\n^C\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ah -data-only > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0111a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-txt\"\n. test_prelude\n\n# this example taken from TI documentation\ncat > test.in << 'fubar'\n@F000\n31 40 00 03 B2 40 80 5A 20 01 D2 D3 22 00 D2 E3\n21 00 3F 40 E8 FD 1F 83 FE 23 F9 3F\n@FFFE\n00 F0\nQ\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS11FF00031400003B240805A2001D2D32200D2E321003F40E8FD1F83FE23F93F93\nS105FFFE00F00D\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -ti-txt -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0112a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-txt\"\n. test_prelude\n\n# this example taken from TI documentation\ncat > test.in << 'fubar'\nS00600004844521B\nS11FF00031400003B240805A2001D2D32200D2E321003F40E8FD1F83FE23F93F93\nS105FFFE00F00D\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n@F000\n31 40 00 03 B2 40 80 5A 20 01 D2 D3 22 00 D2 E3\n21 00 3F 40 E8 FD 1F 83 FE 23 F9 3F\n@FFFE\n00 F0\nq\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ti-txt > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0113a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-txt\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1050001656C28\nS106000520576F0E\nS104000A648D\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n@0001\n65 6C\n@0005\n20 57 6F\n@000A\n64\nq\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ti-txt > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0115a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-txt\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS123DEAD99F2B9CB79D3EEF88FC6A940ABCD71A6F0525E0C139D0A2C261F622553F03DED78\nS123DECDE2F6B85BCAA653596CFD9917CA0BBEBB5D1CC770B9D29CDFF1FF0545EF4232D19F\nS123DEED39EA2D0391805CFD7DF5154800D3035EEFCACEA89C6B888E6A8DD359CF052A08DC\nS123DF0DEF570B80D8677E555D939D5D66A0BB556B8AFD07F585955F1268B8E26DE2EA5DFC\nS123DF2D3AF6DD125D5B67BAEE051854A5D3A9105DA718522CADB13F166921834C0BE08631\nS123DF4D01BE985F19FF190804315CAA0506BA62ADD2B5D980661896D039191C45FAA24659\nS123DF6DB83AA5D139BFD93EF036E8F53CA258E9750DC2F573DB8B4314A45F599E01A0569D\nS123DF8D3B4528750401B3F5379BEA733D425CB24F1FA7C3FA32060ED76668756708CCA3DA\nS123DFAD4DF41852F5CB472D6631A0A374FD56C31CFD8616308D2407F38C7C5A9448FDE260\nS5030009F3\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n@DEAD\n99 F2 B9 CB 79 D3 EE F8 8F C6 A9 40 AB CD 71 A6\nF0 52 5E 0C 13 9D 0A 2C 26 1F 62 25 53 F0 3D ED\nE2 F6 B8 5B CA A6 53 59 6C FD 99 17 CA 0B BE BB\n5D 1C C7 70 B9 D2 9C DF F1 FF 05 45 EF 42 32 D1\n39 EA 2D 03 91 80 5C FD 7D F5 15 48 00 D3 03 5E\nEF CA CE A8 9C 6B 88 8E 6A 8D D3 59 CF 05 2A 08\nEF 57 0B 80 D8 67 7E 55 5D 93 9D 5D 66 A0 BB 55\n6B 8A FD 07 F5 85 95 5F 12 68 B8 E2 6D E2 EA 5D\n3A F6 DD 12 5D 5B 67 BA EE 05 18 54 A5 D3 A9 10\n5D A7 18 52 2C AD B1 3F 16 69 21 83 4C 0B E0 86\n01 BE 98 5F 19 FF 19 08 04 31 5C AA 05 06 BA 62\nAD D2 B5 D9 80 66 18 96 D0 39 19 1C 45 FA A2 46\nB8 3A A5 D1 39 BF D9 3E F0 36 E8 F5 3C A2 58 E9\n75 0D C2 F5 73 DB 8B 43 14 A4 5F 59 9E 01 A0 56\n3B 45 28 75 04 01 B3 F5 37 9B EA 73 3D 42 5C B2\n4F 1F A7 C3 FA 32 06 0E D7 66 68 75 67 08 CC A3\n4D F4 18 52 F5 CB 47 2D 66 31 A0 A3 74 FD 56 C3\n1C FD 86 16 30 8D 24 07 F3 8C 7C 5A 94 48 FD E2\nq\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ti-txt > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0116a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-txt\"\n. test_prelude\n\ncat > test.in << 'fubar'\n@DEAD\n99 F2 B9 CB 79 D3 EE F8 8F C6 A9 40 AB CD 71 A6\nF0 52 5E 0C 13 9D 0A 2C 26 1F 62 25 53 F0 3D ED\nE2 F6 B8 5B CA A6 53 59 6C FD 99 17 CA 0B BE BB\n5D 1C C7 70 B9 D2 9C DF F1 FF 05 45 EF 42 32 D1\n39 EA 2D 03 91 80 5C FD 7D F5 15 48 00 D3 03 5E\nEF CA CE A8 9C 6B 88 8E 6A 8D D3 59 CF 05 2A 08\nEF 57 0B 80 D8 67 7E 55 5D 93 9D 5D 66 A0 BB 55\n6B 8A FD 07 F5 85 95 5F 12 68 B8 E2 6D E2 EA 5D\n3A F6 DD 12 5D 5B 67 BA EE 05 18 54 A5 D3 A9 10\n5D A7 18 52 2C AD B1 3F 16 69 21 83 4C 0B E0 86\n01 BE 98 5F 19 FF 19 08 04 31 5C AA 05 06 BA 62\nAD D2 B5 D9 80 66 18 96 D0 39 19 1C 45 FA A2 46\nB8 3A A5 D1 39 BF D9 3E F0 36 E8 F5 3C A2 58 E9\n75 0D C2 F5 73 DB 8B 43 14 A4 5F 59 9E 01 A0 56\n3B 45 28 75 04 01 B3 F5 37 9B EA 73 3D 42 5C B2\n4F 1F A7 C3 FA 32 06 0E D7 66 68 75 67 08 CC A3\n4D F4 18 52 F5 CB 47 2D 66 31 A0 A3 74 FD 56 C3\n1C FD 86 16 30 8D 24 07 F3 8C 7C 5A 94 48 FD E2\nq\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS123DEAD99F2B9CB79D3EEF88FC6A940ABCD71A6F0525E0C139D0A2C261F622553F03DED78\nS123DECDE2F6B85BCAA653596CFD9917CA0BBEBB5D1CC770B9D29CDFF1FF0545EF4232D19F\nS123DEED39EA2D0391805CFD7DF5154800D3035EEFCACEA89C6B888E6A8DD359CF052A08DC\nS123DF0DEF570B80D8677E555D939D5D66A0BB556B8AFD07F585955F1268B8E26DE2EA5DFC\nS123DF2D3AF6DD125D5B67BAEE051854A5D3A9105DA718522CADB13F166921834C0BE08631\nS123DF4D01BE985F19FF190804315CAA0506BA62ADD2B5D980661896D039191C45FAA24659\nS123DF6DB83AA5D139BFD93EF036E8F53CA258E9750DC2F573DB8B4314A45F599E01A0569D\nS123DF8D3B4528750401B3F5379BEA733D425CB24F1FA7C3FA32060ED76668756708CCA3DA\nS123DFAD4DF41852F5CB472D6631A0A374FD56C31CFD8616308D2407F38C7C5A9448FDE260\nS5030009F3\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -ti-txt -o test.out -header HDR > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0117a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-asm -a430\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS111011148656C6C6F2C20576F726C64210A69\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n; HDR\n        PUBLIC  prefix\n        RSEG    CODE\nprefix\n        DB      0x48,0x65,0x6C,0x6C,0x6F,0x2C,0x20,0x57,0x6F,0x72,0x6C,0x64\n        DB      0x21,0x0A,0x48,0x65,0x6C,0x6C,0x6F,0x2C,0x20,0x57,0x6F,0x72\n        DB      0x6C,0x64,0x21,0x0A\n\n        PUBLIC  prefix_address\nprefix_address\n        DL      0x00000000, 0x00000111\n\n        PUBLIC  prefix_length_of_sections\nprefix_length_of_sections\n        DL      0x0000000E, 0x0000000E\n\n        PUBLIC  prefix_sections\nprefix_sections\n        DL      0x0002\n; upper bound = 0x011F\n; lower bound = 0x0000\n; length =      0x011F\n        END\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -asm prefix -a430 > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0118a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-asm -cl430\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS111011148656C6C6F2C20576F726C64210A69\nS5030002FA\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n; HDR\n        .global eprom\n        .text\neprom\n        .byte   0x48,0x65,0x6C,0x6C,0x6F,0x2C,0x20,0x57,0x6F,0x72,0x6C,0x64\n        .byte   0x21,0x0A,0x48,0x65,0x6C,0x6C,0x6F,0x2C,0x20,0x57,0x6F,0x72\n        .byte   0x6C,0x64,0x21,0x0A\n\n        .global eprom_address\neprom_address\n        .long   0x00000000, 0x00000111\n\n        .global eprom_length_of_sections\neprom_length_of_sections\n        .long   0x0000000E, 0x0000000E\n\n        .global eprom_sections\neprom_sections\n        .long   0x0002\n; upper bound = 0x011F\n; lower bound = 0x0000\n; length =      0x011F\n        .end\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -asm -cl430 > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0119a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-asm -word-output\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10500000011E9\nS107000333445566C3\nS10500088899D1\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n; HDR\n        DW      0x1100\n; To avoid this next ORG directive, use the --fill filter.\n        ORG     3\n        DW      0x4433,0x6655\n        ORG     8\n        DW      0x9988\n; upper bound = 0x000A\n; lower bound = 0x0000\n; length =      0x000A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -asm -ow -hex-style > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0120a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fill range padding\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000748656C6C6F2C20576F726C64210A74\nS111002048656C6C6F2C20576F726C64210A5B\nS111004248656C6C6F2C20576F726C64210A39\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1170004FFFFFF48656C6C6F2C20576F726C64210AFFFFFF77\nS113002048656C6C6F2C20576F726C64210AFFFF5B\nS1130040FFFF48656C6C6F2C20576F726C64210A3B\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-pad 4 \\\n        -o test.out > LOG 2>&1\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0121a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-c-array -output-word\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000748656C6C6F2C20576F726C64210A74\nS111002048656C6C6F2C20576F726C64210A5B\nS111004248656C6C6F2C20576F726C64210A39\nS5030003F9\nS9030007F5\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned short eprom[] =\n{\n0x48FF, 0x6C65, 0x6F6C, 0x202C, 0x6F57, 0x6C72, 0x2164, 0xFF0A, 0xFFFF,\n0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x6548, 0x6C6C, 0x2C6F, 0x5720, 0x726F,\n0x646C, 0x0A21, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,\n0xFFFF, 0xFFFF, 0xFFFF, 0x6548, 0x6C6C, 0x2C6F, 0x5720, 0x726F, 0x646C,\n0x0A21,\n};\nconst unsigned long eprom_termination = 0x00000007;\nconst unsigned long eprom_start       = 0x00000006;\nconst unsigned long eprom_finish      = 0x00000050;\nconst unsigned long eprom_length      = 0x0000004A;\n\n#define EPROM_TERMINATION 0x00000007\n#define EPROM_START       0x00000006\n#define EPROM_FINISH      0x00000050\n#define EPROM_LENGTH      0x0000004A\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.h.ok << 'fubar'\n#ifndef TEST_H\n#define TEST_H\n\nextern const unsigned long eprom_termination;\nextern const unsigned long eprom_start;\nextern const unsigned long eprom_finish;\nextern const unsigned long eprom_length;\nextern const unsigned short eprom[];\n\n#endif /* TEST_H */\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding=2 \\\n    -o test.out -c-array -ow -include\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.h.ok test.h\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0122a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-c-array -section-style\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000748656C6C6F2C20576F726C64210A74\nS111002048656C6C6F2C20576F726C64210A5B\nS111004248656C6C6F2C20576F726C64210A39\nS5030003F9\nS9030007F5\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned char eprom[] =\n{\n0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,\n0x21, 0x0A, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72,\n0x6C, 0x64, 0x21, 0x0A, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57,\n0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0A,\n};\n\nconst unsigned long eprom_address[] =\n{\n0x00000007, 0x00000020, 0x00000042,\n};\nconst unsigned long eprom_length_of_sections[] =\n{\n0x0000000E, 0x0000000E, 0x0000000E,\n};\nconst unsigned long eprom_sections    = 0x00000003;\nconst unsigned long eprom_termination = 0x00000007;\nconst unsigned long eprom_start       = 0x00000007;\nconst unsigned long eprom_finish      = 0x00000050;\nconst unsigned long eprom_length      = 0x00000049;\n\n#define EPROM_TERMINATION 0x00000007\n#define EPROM_START       0x00000007\n#define EPROM_FINISH      0x00000050\n#define EPROM_LENGTH      0x00000049\n#define EPROM_SECTIONS    0x00000003\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -c-array -section-style\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- one more time, with words ----------------------------------------\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned short eprom[] =\n{\n0x48FF, 0x6C65, 0x6F6C, 0x202C, 0x6F57, 0x6C72, 0x2164, 0xFF0A, 0x6548,\n0x6C6C, 0x2C6F, 0x5720, 0x726F, 0x646C, 0x0A21, 0x6548, 0x6C6C, 0x2C6F,\n0x5720, 0x726F, 0x646C, 0x0A21,\n};\n\nconst unsigned long eprom_address[] =\n{\n0x00000006, 0x00000020, 0x00000042,\n};\nconst unsigned long eprom_word_address[] =\n{\n0x00000003, 0x00000010, 0x00000021,\n};\nconst unsigned long eprom_length_of_sections[] =\n{\n0x00000008, 0x00000007, 0x00000007,\n};\nconst unsigned long eprom_sections    = 0x00000003;\nconst unsigned long eprom_termination = 0x00000007;\nconst unsigned long eprom_start       = 0x00000006;\nconst unsigned long eprom_finish      = 0x00000050;\nconst unsigned long eprom_length      = 0x0000004A;\n\n#define EPROM_TERMINATION 0x00000007\n#define EPROM_START       0x00000006\n#define EPROM_FINISH      0x00000050\n#define EPROM_LENGTH      0x0000004A\n#define EPROM_SECTIONS    0x00000003\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding=2 \\\n    -o test.out -c-array -section-style -ow\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- one more time, with decimal words -----------------------------\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned short eprom[] =\n{\n18687, 27749, 28524, 8236, 28503, 27762, 8548, 65290, 25928, 27756, 11375,\n22304, 29295, 25708, 2593, 25928, 27756, 11375, 22304, 29295, 25708, 2593,\n};\n\nconst unsigned long eprom_address[] =\n{\n6, 32, 66,\n};\nconst unsigned long eprom_word_address[] =\n{\n3, 16, 33,\n};\nconst unsigned long eprom_length_of_sections[] =\n{\n8, 7, 7,\n};\nconst unsigned long eprom_sections    = 3;\nconst unsigned long eprom_termination = 7;\nconst unsigned long eprom_start       = 6;\nconst unsigned long eprom_finish      = 80;\nconst unsigned long eprom_length      = 74;\n\n#define EPROM_TERMINATION 7\n#define EPROM_START       6\n#define EPROM_FINISH      80\n#define EPROM_LENGTH      74\n#define EPROM_SECTIONS    3\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding=2 \\\n    -o test.out -c-array -section-style -ow -dec-style\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- one more time, with words and a generated include file -----------\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned short eprom[] =\n{\n0x48FF, 0x6C65, 0x6F6C, 0x202C, 0x6F57, 0x6C72, 0x2164, 0xFF0A, 0x6548,\n0x6C6C, 0x2C6F, 0x5720, 0x726F, 0x646C, 0x0A21, 0x6548, 0x6C6C, 0x2C6F,\n0x5720, 0x726F, 0x646C, 0x0A21,\n};\n\nconst unsigned long eprom_address[] =\n{\n0x00000006, 0x00000020, 0x00000042,\n};\nconst unsigned long eprom_word_address[] =\n{\n0x00000003, 0x00000010, 0x00000021,\n};\nconst unsigned long eprom_length_of_sections[] =\n{\n0x00000008, 0x00000007, 0x00000007,\n};\nconst unsigned long eprom_sections    = 0x00000003;\nconst unsigned long eprom_termination = 0x00000007;\nconst unsigned long eprom_start       = 0x00000006;\nconst unsigned long eprom_finish      = 0x00000050;\nconst unsigned long eprom_length      = 0x0000004A;\n\n#define EPROM_TERMINATION 0x00000007\n#define EPROM_START       0x00000006\n#define EPROM_FINISH      0x00000050\n#define EPROM_LENGTH      0x0000004A\n#define EPROM_SECTIONS    0x00000003\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok.h << 'fubar'\n#ifndef TEST_H\n#define TEST_H\n\nextern const unsigned long eprom_termination;\nextern const unsigned long eprom_start;\nextern const unsigned long eprom_finish;\nextern const unsigned long eprom_length;\nextern const unsigned long eprom_sections;\nextern const unsigned short eprom[];\nextern const unsigned long eprom_address[];\nextern const unsigned long eprom_word_address[];\nextern const unsigned long eprom_length_of_sections[];\n\n#endif /* TEST_H */\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding=2 \\\n    -o test.out -c-array -section-style -ow -include\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok.h test.h\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0123a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-generate -constant\"\n. test_prelude\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS113000D2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A3F\nS5030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat --generate 13 29 --constant 42 -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0125a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-generate -repeat-data\"\n. test_prelude\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS224012345DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFB2\nS224012365DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF92\nS219012385DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDE47\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -generate 0x12345 0x1239A -repeat-data 0xDE 0xAD 0xBE 0xEF \\\n        -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0126a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-generate -repeat-string\"\n. test_prelude\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS224012345436F707972696768742028432920313831322054636861696B6F76736B792E201B\nS22401236520436F707972696768742028432920313831322054636861696B6F76736B792EFB\nS2190123852020436F707972696768742028432920313831322084\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -generate 0x12345 0x1239A \\\n        -repeat-string 'Copyright (C) 1812 Tchaikovsky.  ' \\\n        -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0127a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-generate -random\"\n. test_prelude\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"HDR\"\nExecution Start Address: 00000000\nData:   0123 - 0455\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -generate 0x123 0x456 -random \\\n        -o test.srec -header HDR -start-addr 0\nif test $? -ne 0; then fail; fi\n\nsrec_info test.srec > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0128a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"interval arithmetic\"\n. test_prelude\n\n# ---------- set difference ------------------------------------------------\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"HDR\"\nExecution Start Address: 00000000\nData:   0000 - 00FF\n        0E00 - 0FFF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -generate { 0 0x1000 -diff 0x100 0xE00 } -random \\\n    -o test.srec -header HDR -start-addr 0\nif test $? -ne 0; then fail; fi\n\nsrec_info test.srec > test.out\nif test $? -ne 0; then no_result; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- set intersection ----------------------------------------------\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"HDR\"\nExecution Start Address: 00000000\nData:   0100 - 0FFF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -generate { 0 0x1000 -intersect 0x100 0xE000 } -random \\\n    -o test.srec -header HDR -start-addr 0\nif test $? -ne 0; then fail; fi\n\nsrec_info test.srec > test.out\nif test $? -ne 0; then no_result; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- set union -----------------------------------------------------\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"HDR\"\nExecution Start Address: 00000000\nData:   0080 - 00C7\n        0190 - 0257\n        0320 - 03E7\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -generate { { 0 200 400 600 800 1000 } -intersect 0x80 0xE000 } \\\n    -random \\\n    -o test.srec -header HDR -start-addr 0\nif test $? -ne 0; then fail; fi\n\nsrec_info test.srec > test.out\nif test $? -ne 0; then no_result; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0129a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"assembler alignment\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800000001020304ED\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 2: The Assembler (16-bit) output format uses 16-bit data,\n    but unaligned data is present. Use a \"--fill 0xNN --within <input>\n    --range-padding 2\" filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -asm -output-words > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0130a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"atmel generic format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800000001020304ED\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 1: The Atmel-Generic output format uses 16-bit data, but\n    unaligned data is present. Use a \"--fill 0xNN --within <input>\n    --range-padding 2\" filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -atmel-generic > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0131a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"c-array -output-words\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800000001020304ED\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 4: The C-Array (16-bit) output format uses 16-bit data, but\n    unaligned data is present. Use a \"--fill 0xNN --within <input>\n    --range-padding 2\" filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -c-array -output-words > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0132a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel-hex-16 format\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800000001020304ED\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 1: The Intel-16 output format uses 16-bit data, but\n    unaligned data is present. Use a \"--fill 0xNN --within <input>\n    --range-padding 2\" filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -inhx16 > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0133a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fairchild alignment\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800000001020304ED\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 1: The Fairchild output format uses 8-byte alignment, but\n    unaligned data is present. Use a \"--fill 0xNN --within <input>\n    --range-padding 8\" filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -fairchild > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0135a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"spasm alignment\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800000001020304ED\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 1: The Spasm output format uses 16-bit data, but unaligned\n    data is present. Use a \"--fill 0xNN --within <input> --range-padding 2\"\n    filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -spasm > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0136a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ti-tagged-16 alignment\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800050001020304E8\nS5030001FB\nS9030005F7\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 1: The TI-Tagged-16 output format uses 16-bit data, but\n    unaligned data is present. Use a \"--fill 0xNN --within <input>\n    --range-padding 2\" filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ti-tagged-16 > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0137a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"vhdl alignment\";\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800000001020304ED\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 2: The VHDL output format uses 16-bit data, but unaligned\n    data is present. Use a \"--fill 0xNN --within <input> --range-padding 2\"\n    filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -vhdl 2 > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0138a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"vhdl alignment\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10800050001020304E8\nS5030001FB\nS9030005F7\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n-- HDR\n--\n-- Generated automatically by srec_cat -VHDL - do not edit\n--\nlibrary IEEE;\nuse IEEE.numeric_std.all;\nuse work.eprom_defs_pack.all;\n\npackage eprom_pack is\n constant eprom_rom : eprom_rom_array;\nend package eprom_pack;\n\npackage body eprom_pack is\n constant eprom_rom : eprom_rom_array := eprom_rom_array'(\n  1 => eprom_entry(258),\n  2 => eprom_entry(50593792),\n  others => eprom_dont_care\n );\nend package body eprom_pack;\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0 -within test.in -range-padding 4 \\\n        -o test.out -vhdl 4\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\n-- HDR\n--\n-- Generated automatically by srec_cat -VHDL - do not edit\n--\nlibrary IEEE;\nuse IEEE.numeric_std.all;\nuse work.eprom_defs_pack.all;\n\npackage eprom_pack is\n constant eprom_rom : eprom_rom_array;\nend package eprom_pack;\n\npackage body eprom_pack is\n constant eprom_rom : eprom_rom_array := eprom_rom_array'(\n  2 => eprom_entry(65280),\n  3 => eprom_entry(258),\n  4 => eprom_entry(772),\n  others => eprom_dont_care\n );\nend package body eprom_pack;\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -within test.in -range-padding 2 \\\n        -o test.out -vhdl 2\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0139a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2007, 2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Verilog VMEM alignment\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_cat: test.out: 2: The VMem output format uses 32-bit data, but unaligned\n    data is present. Use a \"--fill 0xNN --within <input> --range-padding 4\"\n    filter to fix this problem.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -vmem > LOG 2>&1\nif test $? -ne 1; then cat LOG; fail; fi\n\ndiff test.ok LOG\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0150a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"CRC16\"\n. test_prelude\n\n#\n# Build the CRC16 test vectors\n#\ncp /dev/null zero.length.file\ntest $? -eq 0 || no_result\necho A | dd bs=1 count=1 2>/dev/null > single.a.file\ntest $? -eq 0 || no_result\necho 123456789 | dd bs=9 count=1 2>/dev/null > nine.digits.file\ntest $? -eq 0 || no_result\n\necho \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" |\ndd bs=64 count=1 2>/dev/null > upper-case-a.64.file\ntest $? -eq 0 || no_result\ncat upper-case-a.64.file upper-case-a.64.file upper-case-a.64.file \\\n        upper-case-a.64.file > upper-case-a.256.file\ntest $? -eq 0 || no_result\n\n#\n# now we run the test vectors with and without augmentation\n#\ntest_crc16 < zero.length.file > test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 < single.a.file >> test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 < nine.digits.file >> test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 < upper-case-a.256.file >> test.out\ntest $? -eq 0 || fail\n\ncat > test.ok << 'fubar'\n0x1D0F\n\n0x9479\n\n0xE5CC\n\n0xE938\nfubar\nif test $? -ne 0; then no_result; fi\n\ndiff -u test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0151a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"CRC16\"\n. test_prelude\n\n#\n# Build the CRC16 test vectors\n#\ncp /dev/null zero.length.file\ntest $? -eq 0 || no_result\necho A | dd bs=1 count=1 2>/dev/null > single.a.file\ntest $? -eq 0 || no_result\necho 123456789 | dd bs=9 count=1 2>/dev/null > nine.digits.file\ntest $? -eq 0 || no_result\n\necho \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" |\ndd bs=64 count=1 2>/dev/null > upper-case-a.64.file\ntest $? -eq 0 || no_result\ncat upper-case-a.64.file upper-case-a.64.file upper-case-a.64.file \\\n        upper-case-a.64.file > upper-case-a.256.file\ntest $? -eq 0 || no_result\n\n#\n# now we run the test vectors with and without augmentation\n#\ntest_crc16 -x < zero.length.file > test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 -x < single.a.file >> test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 -x < nine.digits.file >> test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 -x < upper-case-a.256.file >> test.out\ntest $? -eq 0 || fail\n\ncat > test.ok << 'fubar'\n0x0000\n\n0x58E5\n\n0x31C3\n\n0xABE3\nfubar\nif test $? -ne 0; then no_result; fi\n\ndiff -u test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0152a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"CRC16\"\n. test_prelude\n\n#\n# Build the CRC16 test vectors\n#\ncp /dev/null zero.length.file\ntest $? -eq 0 || no_result\necho A | dd bs=1 count=1 2>/dev/null > single.a.file\ntest $? -eq 0 || no_result\necho 123456789 | dd bs=9 count=1 2>/dev/null > nine.digits.file\ntest $? -eq 0 || no_result\n\necho \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" |\ndd bs=64 count=1 2>/dev/null > upper-case-a.64.file\ntest $? -eq 0 || no_result\ncat upper-case-a.64.file upper-case-a.64.file upper-case-a.64.file \\\n        upper-case-a.64.file > upper-case-a.256.file\ntest $? -eq 0 || no_result\n\n#\n# now we run the test vectors with and without augmentation\n#\ntest_crc16 -a < zero.length.file > test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 -a < single.a.file >> test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 -a < nine.digits.file >> test.out\ntest $? -eq 0 || fail\necho >> test.out\ntest $? -eq 0 || no_result\n\ntest_crc16 -a < upper-case-a.256.file >> test.out\ntest $? -eq 0 || fail\n\ncat > test.ok << 'fubar'\n0xFFFF\n\n0xE1B1\n\n0xA69D\n\n0xA4CE\nfubar\nif test $? -ne 0; then no_result; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0153a.sh",
    "content": "#!/bin/sh\n#\n# srecord - The \"srecord\" program.\n# Copyright (C) 2007, 2008, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"CRC16 -no-aug\"\n. test_prelude\n\n# ---------- First Test Vector: Zero Length Data ---------------------------\n\ncat > test.in << 'fubar'\nS01300007A65726F206C656E6774682064617461D0\nS5030000FC\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS01300007A65726F206C656E6774682064617461D0\nS10501001D0FCD\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -o test.out 2> LOG\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS01300007A65726F206C656E6774682064617461D0\nS1050100FFFFFB\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -no-augment -o test.out 2> LOG\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- Second Test Vector: Single 'A' character -----------------------\n\ncat > test.in << 'fubar'\nS015000073696E676C652041206368617261637465723A\nS104000041BA\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS015000073696E676C652041206368617261637465723A\nS104000041BA\nS10501009479EC\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS015000073696E676C652041206368617261637465723A\nS104000041BA\nS1050100E1B167\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -no-augment -o test.out 2>/dev/null\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- Third Test Vector: Single nine \"123456789\" digits -------------\n\ncat > test.in << 'fubar'\nS00E00006E696E6520646967697473A3\nS10C000031323334353637383916\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00E00006E696E6520646967697473A3\nS10C000031323334353637383916\nS1050100E5CC48\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00E00006E696E6520646967697473A3\nS10C000031323334353637383916\nS1050100A69DB6\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -no-augment -o test.out 2>/dev/null\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- Fourth Test Vector: 256 'A' characters ------------------------\n\ncat > test.in << 'fubar'\nS0150000323536206F662041206368617261637465722A\nS12300004141414141414141414141414141414141414141414141414141414141414141BC\nS123002041414141414141414141414141414141414141414141414141414141414141419C\nS123004041414141414141414141414141414141414141414141414141414141414141417C\nS123006041414141414141414141414141414141414141414141414141414141414141415C\nS123008041414141414141414141414141414141414141414141414141414141414141413C\nS12300A041414141414141414141414141414141414141414141414141414141414141411C\nS12300C04141414141414141414141414141414141414141414141414141414141414141FC\nS12300E04141414141414141414141414141414141414141414141414141414141414141DC\nS5030008F4\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS0150000323536206F662041206368617261637465722A\nS12300004141414141414141414141414141414141414141414141414141414141414141BC\nS123002041414141414141414141414141414141414141414141414141414141414141419C\nS123004041414141414141414141414141414141414141414141414141414141414141417C\nS123006041414141414141414141414141414141414141414141414141414141414141415C\nS123008041414141414141414141414141414141414141414141414141414141414141413C\nS12300A041414141414141414141414141414141414141414141414141414141414141411C\nS12300C04141414141414141414141414141414141414141414141414141414141414141FC\nS12300E04141414141414141414141414141414141414141414141414141414141414141DC\nS1050100E938D8\nS5030009F3\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS0150000323536206F662041206368617261637465722A\nS12300004141414141414141414141414141414141414141414141414141414141414141BC\nS123002041414141414141414141414141414141414141414141414141414141414141419C\nS123004041414141414141414141414141414141414141414141414141414141414141417C\nS123006041414141414141414141414141414141414141414141414141414141414141415C\nS123008041414141414141414141414141414141414141414141414141414141414141413C\nS12300A041414141414141414141414141414141414141414141414141414141414141411C\nS12300C04141414141414141414141414141414141414141414141414141414141414141FC\nS12300E04141414141414141414141414141414141414141414141414141414141414141DC\nS1050100A4CE87\nS5030009F3\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16be 0x100 -no-augment -o test.out 2>/dev/null\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0155a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"hexdump\"\n. test_prelude\n\ncat > test.in << 'fubar'\nNow is the time for all good men to come to the aid of their party.\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 4E 6F 77 20 69 73 20 74                6D 65 20  #Now is t     me\n00000010: 66 6F 72 20 61 6C 6C 20 67 6F 6F 64 20 6D 65 6E  #for all good men\n00000020: 20 74 6F 20 63 6F 6D 65 20 74                    # to come t\n00000030:                      74 68 65 69 72 20 70 61 72  #       their par\n00000040: 74 79 2E 0A                                      #ty..\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bin -exclude 0x08 0x0D 0x2a 0x37 -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0156a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - The \"srecord\" program.\n#       Copyright (C) 2007, 2008, 2010, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec_input minus expr\"\n. test_prelude\n\ncat > in.srec << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS12301234E6F77206973207468652074696D6520666F7220616C6C20676F6F64206D656E6F\nS123014320746F20636F6D6520746F2074686520616964206F66207468656972207061728B\nS107016374792E0A6F\nS5030003F9\nS9030123D8\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nFormat: Motorola S-Record\nHeader: \"http://srecord.sourceforge.net/\"\nExecution Start Address: 00000000\nData:   0000 - 0043\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat in.srec -offset - -minimum-address in.srec -o out.srec\nif test $? -ne 0; then fail; fi\n\nsrec_info out.srec > test.out\nif test $? -ne 0; then no_result; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0157a.sh",
    "content": "#!/bin/sh\n#\n# srecord - The \"srecord\" program.\n# Copyright (C) 2008, 2011, 2012 Peter Miller\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"CRC16\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS1050100A69DB6\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-b-e 0x100 -ccitt -no-augment -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS1050100E5CC48\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-b-e 0x100 -ccitt -augment -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS1050100BEEF4C\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-b-e 0x100 -xmodem -no-augment -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS105010031C305\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-b-e 0x100 -xmodem -augment -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS105010029B11F\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-b-e 0x100 -broken -augment -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10E0000313233343536373839E5CC63\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-b-e -max-address test.in -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10E0000313233343536373839CCE563\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-l-e -max-address test.in -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0158a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - Manipulate EPROM load files\n#       Copyright (C) 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"parentheses\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS113000054686973206973206120746573742E0ABF\nS113002054686973206973206120746573742E0A9F\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1130010FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat '(' test.in -and 0 -fill 0xFF -over test.in ')' -unfill 0 \\\n    -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0159a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - manipulate eprom load files\n#       Copyright (C) 2008 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"crc32 -xmodem\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00A0000746573742E696E30\nS1230000D46EBDDE679162F728C97423D8B8ACD103E3E275D6383B02A05DBFA2F9F475B021\nS1230020421C58D8C68B45162F288CBFF07FEB22E184550747074F93FB1C32DE00169D3F5A\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00A0000746573742E696E30\nS1230000D46EBDDE679162F728C97423D8B8ACD103E3E275D6383B02A05DBFA2F9F475B021\nS1230020421C58D8C68B45162F288CBFF07FEB22E184550747074F93FB1C32DE00169D3F5A\nS10700407B63EE3DAF\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -becrc32 0x40 -xmodem -o test.out > LOG 2>&1\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0160a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - Manipulate EPROM load files\n#       Copyright (C) 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"interval subtraction\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS005000068741E\nS104000010EB\nS1040002F108\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncp test.in test.ok\nif test $? -ne 0; then no_result; fi\n\n#\n# strictly speaking, the braces are redundant, but they are there (a) to\n# help the human reader, and (b) if we change the presedence.\n#\nsrec_cat test.in -fill 0xff -over { test.in -exclude -within test.in } \\\n    -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0161a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2008, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"exclusive filters\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000448656C6C6F2C20576F726C64210A77\nS111010048656C6C6F2C20576F726C64210A7A\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n# ---------- excl-len-be ---------------------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000448656C6C6F2C20576F726C64210A77\nS111010048656C6C6F2C20576F726C64210A7A\nS10702000000010AEB\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -elenbe 0x200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- excl-len-le ---------------------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000448656C6C6F2C20576F726C64210A77\nS111010048656C6C6F2C20576F726C64210A7A\nS10702000A010000EB\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -elenle 0x200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- excl-max-be ---------------------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000448656C6C6F2C20576F726C64210A77\nS111010048656C6C6F2C20576F726C64210A7A\nS10702000000010EE7\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -emaxbe 0x200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- excl-max-le ---------------------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000448656C6C6F2C20576F726C64210A77\nS111010048656C6C6F2C20576F726C64210A7A\nS10702000E010000E7\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -emaxle 0x200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- excl-min-be ---------------------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000448656C6C6F2C20576F726C64210A77\nS111010048656C6C6F2C20576F726C64210A7A\nS107020000000004F2\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -eminbe 0x200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- excl-min-le ---------------------------------------------------\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000448656C6C6F2C20576F726C64210A77\nS111010048656C6C6F2C20576F726C64210A7A\nS107020004000000F2\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -eminle 0x200 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0162a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - Manipulate EPROM load files\n#       Copyright (C) 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"MOS Tech output\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n;0E000048656C6C6F2C20576F726C64210A0481\n;0000010001\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -mos-tech 2>LOG\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0163a.sh",
    "content": "#!/bin/sh\n#\n#       srecord - Manipulate EPROM load files\n#       Copyright (C) 2008, 2011 Peter Miller\n#\n#       This program is free software; you can redistribute it and/or modify\n#       it under the terms of the GNU General Public License as published by\n#       the Free Software Foundation; either version 3 of the License, or\n#       (at your option) any later version.\n#\n#       This program is distributed in the hope that it will be useful,\n#       but WITHOUT ANY WARRANTY; without even the implied warranty of\n#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#       GNU General Public License for more details.\n#\n#       You should have received a copy of the GNU General Public License\n#       along with this program. If not, see\n#       <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"motorola --disable=data-count\"\n. test_prelude\n\ncat > test.in << 'fubar'\nHello, World!\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS10D000048656C6C6F2C20576F727A\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bin -crop 0 10 -o test.out --disable=data-count --disable=head\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0165a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2008, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"class srec_output_file_forth\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nHEX\n48 0000 C!\n65 0001 C!\n6C 0002 C!\n6C 0003 C!\n6F 0004 C!\n2C 0005 C!\n20 0006 C!\n57 0007 C!\n6F 0008 C!\n72 0009 C!\n6C 000A C!\n64 000B C!\n21 000C C!\n0A 000D C!\n\n( THE END )\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -forth\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0166a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2008, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"catenate vs parentheses\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS31502001000EDAC0123212223240200100CA723D28651\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat                                                                 \\\n    \\(                                                                   \\\n        test.in --exclude 0x02001000 0x2001010                           \\\n        -generate 0x02001000 0x02001004 -repeat-data 0xED 0xAC 0x01 0x23 \\\n        -generate 0x02001004 0x02001008 -repeat-data 0x21 0x22 0x23 0x24 \\\n    \\)                                                                   \\\n    --length-b-e 0x02001008 4                                            \\\n    -checksum-neg_b-e 0x0200100C 4 4                                     \\\n    -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0167a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2008, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"number from --minimum\"\n. test_prelude\n\ncat > x1.srec << 'fubar'\nS00600004844521B\nS10D000A01010101010101010101DE\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > x2.srec << 'fubar'\nS00600004844521B\nS10D002802020202020202020202B6\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS123000A0101010101010101010100000000000000000000000000000000000000000202C4\nS10B002A0202020202020202BA\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat \\\n        x1.srec \\\n        x2.srec -fill 0 -maximum-address x1.srec -minimum-address x2.srec \\\n        -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0168a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"length's width\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS107100000000004E4\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in --excl-length-b-e 0x1000 4 3 -o test.out\nif test $? -ne 0; then fail; fi\n\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0169a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"write MIF\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n-- HDR\n--\n-- Generated automatically by srec_cat -o --mif\n--\nDEPTH = 14;\nWIDTH = 8;\nADDRESS_RADIX = HEX;\nDATA_RADIX = HEX;\nCONTENT BEGIN\n0000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A;\n-- start address = 0000\nEND;\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -mif\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0170a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read MIF\"\n. test_prelude\n\ncat > test.in << 'fubar'\nDEPTH = 14;\nWIDTH = 8;\nADDRESS_RADIX = HEX;\nDATA_RADIX = HEX;\nCONTENT BEGIN\n0000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A;\nEND;\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -mif -o test.out -header=HDR -start-address=0\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0171a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read MIF\"\n. test_prelude\n\ncat > test.in << 'fubar'\nDEPTH = 14;\nWIDTH = 8;\nADDRESS_RADIX = HEX;\nDATA_RADIX = HEX;\nCONTENT BEGIN\n[0..77]: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A;\n78: 01 02 03 04;\n[80..ff]: 00;\nEND;\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A 48 65  #Hello, World!.He\n00000010: 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A 48 65 6C 6C  #llo, World!.Hell\n00000020: 6F 2C 20 57 6F 72 6C 64 21 0A 48 65 6C 6C 6F 2C  #o, World!.Hello,\n00000030: 20 57 6F 72 6C 64 21 0A 48 65 6C 6C 6F 2C 20 57  # World!.Hello, W\n00000040: 6F 72 6C 64 21 0A 48 65 6C 6C 6F 2C 20 57 6F 72  #orld!.Hello, Wor\n00000050: 6C 64 21 0A 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64  #ld!.Hello, World\n00000060: 21 0A 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A  #!.Hello, World!.\n00000070: 48 65 6C 6C 6F 2C 20 57 01 02 03 04              #Hello, W....\n00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n000000A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n000000B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n000000D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\n000000F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  #................\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -mif -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0172a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"adler32\"\n. test_prelude\n\n# This test vector is from the Wikipedia page...\ncat > test.in << 'fubar'\nS00600004844521B\nS10C000057696B6970656469615C\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n# ...as is this test result.\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000057696B6970656469615C\nS107010011E6039865\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -adler32-b-e 0x100 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0173a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"adler16\"\n. test_prelude\n\n# This test vector is from the Wikipedia page...\ncat > test.in << 'fubar'\nS00600004844521B\nS10C000057696B6970656469615C\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n# ...as is this test result.\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000057696B6970656469615C\nS105010040A712\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -adler16-b-e 0x100 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0175a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fletcher-32\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000C36C09725AD4A01E201DA1A055152E6E7C8B730F5D797537921D012417C3A6B7AC\nS12300201D8B87A0D025963300A265DF089B0C220CD5BFAB3CB6BB4A2C889FBB9682399641\nS12300403607BA01F47D2B80B7C4B995FA7C50DD8AD002DA16F69C39483D2BE7938B1ADA5C\nS1230060AB1673CA8723FC9AE7FD214AB5A0BBC8FCCB86DF45EC40688BF7C3BD631A61181A\nS1230080262B761798329E52F62798C4E3B033EBF20049DA6DC1C028861F33AEA1A1FA04A9\nS12300A0C91186FE09CF99FF79E85717202D77A0F948361DB2D33BDA87F4E964B67ADFCA6C\nS12300C002E6C5C480A5AF4B57BBF65E8A631058910B091E0739D9C6B6F4CC8F44DB72FA9F\nS12300E077B9F7E9FFEE7FF109A8395B23A6B58E6E4836BA387322D7A1B5598BF453106102\nS123010000A5E8E16A268A50C22E140084CCE01A6F568A3B2A52005B94294F7DA03814C619\nS12301202600EB506596D2F6CDE22453A09892171AB028418E3D688BF60FC97E5256E35D6B\nS123014006F7173DF1A3E7CE83E65057F6337240E6E6823FCD22570BBF75E041C83CD9A95D\nS12301609F8ABF6C2A43ABA782113A7D7213CAA89B1A71807A4A8AE58F67D722DE2EC3117F\nS123018038E77849D0F2598840C925A1FC83E6359338E71F964640CBDC8E99D3A8EA094BFB\nS12301A0551F6387019D1B0725A0A2DC1F52CF7303CE41D2E98FE61F4918F42B27E0D30567\nS12301C037D940A14676CBED2D301AFD06D7796B8F25EBF23B98792AD11DB93A11B9A8180F\nS12301E04C83494EDFD91C6B97D965F7435A79BB1E0E082AD334987953CAA727F9DB175419\nS1230200999A6AB50E7104B6AA908AD9EDEC088C2E988511A805E9E8E69FAE402275C46A33\nS12302205110F8711CB4BF0ED457D16CA6D85D958282BD5AD61DD5577E4601D2B79F2DBC6B\nS1230240B501F0E59E1624DAFDA6F9AF9ACBE605B7D8BA423901697AAF6272A78F76D745CF\nS12302607CDEE99E1F96802852D1B1CB6C39405B334D972B546B90F11A0D5370A12C27B14C\nS123028003F1FBD72BA9D650D2ADEA6B2DB8B1BF9BDC881703B91DE4784FE3B5F30DD870F7\nS12302A0F70FA98E3A590EFACA9AEB28DE7CA9AD93DB2349E4D356FC67BA390D17702AD070\nS12302C013B0B8B298405C0164BED85BADF3E92FE6076DA8B8CAF427BE3C967EEFB77043A5\nS12302E0D78D926EBD4D016378D264A16A5874BBEEAE16B679CE67C481D4B1C8BB04C51D9F\nS12303003DF6F1A3C74EC6B8631CDF828842D8A4C5CF579C5FBBF55E6DBC01C2559B779979\nS123032007BF6BCC0DE4B1DBE48866FAF2B963EED88F0EB10E7B39A574B24FCB6A0EB6C8B4\nS123034058735035228CD32F35534BBF007B341619507F71C21F3DEE97197DBA5746443BDA\nS123036073C17D37B6A6C4818AAF14F3ABBD2A84278159DADEE2CF916AB0608929B38AC373\nS12303808E246943447D9BC17FD85F5D5CA6CB0219216572154450CA96B64F6CB551B8D1E2\nS12303A04C226E5F247F42231258CDB69F482686CD8BFEBD8666DB7DCE61C85430D462B2BC\nS12303C0E5628A6657551CFD92164373DFE773A0FA917664E52EDA95FC90F8B8C125024D8E\nS12303E07A576ECB34DE1B9A6B8600390FCBC3992180BAA770B58CB263D9BC7C5EB734E5C1\nS5030020DC\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00001000: 76 F8 02 84                                      #vx..\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fletcher-32-b-e 0x1000 -crop 0x1000 0x1004 -o test.out -hexdum\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0176a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fletcher-16\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS1230000C36C09725AD4A01E201DA1A055152E6E7C8B730F5D797537921D012417C3A6B7AC\nS12300201D8B87A0D025963300A265DF089B0C220CD5BFAB3CB6BB4A2C889FBB9682399641\nS12300403607BA01F47D2B80B7C4B995FA7C50DD8AD002DA16F69C39483D2BE7938B1ADA5C\nS1230060AB1673CA8723FC9AE7FD214AB5A0BBC8FCCB86DF45EC40688BF7C3BD631A61181A\nS1230080262B761798329E52F62798C4E3B033EBF20049DA6DC1C028861F33AEA1A1FA04A9\nS12300A0C91186FE09CF99FF79E85717202D77A0F948361DB2D33BDA87F4E964B67ADFCA6C\nS12300C002E6C5C480A5AF4B57BBF65E8A631058910B091E0739D9C6B6F4CC8F44DB72FA9F\nS12300E077B9F7E9FFEE7FF109A8395B23A6B58E6E4836BA387322D7A1B5598BF453106102\nS123010000A5E8E16A268A50C22E140084CCE01A6F568A3B2A52005B94294F7DA03814C619\nS12301202600EB506596D2F6CDE22453A09892171AB028418E3D688BF60FC97E5256E35D6B\nS123014006F7173DF1A3E7CE83E65057F6337240E6E6823FCD22570BBF75E041C83CD9A95D\nS12301609F8ABF6C2A43ABA782113A7D7213CAA89B1A71807A4A8AE58F67D722DE2EC3117F\nS123018038E77849D0F2598840C925A1FC83E6359338E71F964640CBDC8E99D3A8EA094BFB\nS12301A0551F6387019D1B0725A0A2DC1F52CF7303CE41D2E98FE61F4918F42B27E0D30567\nS12301C037D940A14676CBED2D301AFD06D7796B8F25EBF23B98792AD11DB93A11B9A8180F\nS12301E04C83494EDFD91C6B97D965F7435A79BB1E0E082AD334987953CAA727F9DB175419\nS1230200999A6AB50E7104B6AA908AD9EDEC088C2E988511A805E9E8E69FAE402275C46A33\nS12302205110F8711CB4BF0ED457D16CA6D85D958282BD5AD61DD5577E4601D2B79F2DBC6B\nS1230240B501F0E59E1624DAFDA6F9AF9ACBE605B7D8BA423901697AAF6272A78F76D745CF\nS12302607CDEE99E1F96802852D1B1CB6C39405B334D972B546B90F11A0D5370A12C27B14C\nS123028003F1FBD72BA9D650D2ADEA6B2DB8B1BF9BDC881703B91DE4784FE3B5F30DD870F7\nS12302A0F70FA98E3A590EFACA9AEB28DE7CA9AD93DB2349E4D356FC67BA390D17702AD070\nS12302C013B0B8B298405C0164BED85BADF3E92FE6076DA8B8CAF427BE3C967EEFB77043A5\nS12302E0D78D926EBD4D016378D264A16A5874BBEEAE16B679CE67C481D4B1C8BB04C51D9F\nS12303003DF6F1A3C74EC6B8631CDF828842D8A4C5CF579C5FBBF55E6DBC01C2559B779979\nS123032007BF6BCC0DE4B1DBE48866FAF2B963EED88F0EB10E7B39A574B24FCB6A0EB6C8B4\nS123034058735035228CD32F35534BBF007B341619507F71C21F3DEE97197DBA5746443BDA\nS123036073C17D37B6A6C4818AAF14F3ABBD2A84278159DADEE2CF916AB0608929B38AC373\nS12303808E246943447D9BC17FD85F5D5CA6CB0219216572154450CA96B64F6CB551B8D1E2\nS12303A04C226E5F247F42231258CDB69F482686CD8BFEBD8666DB7DCE61C85430D462B2BC\nS12303C0E5628A6657551CFD92164373DFE773A0FA917664E52EDA95FC90F8B8C125024D8E\nS12303E07A576ECB34DE1B9A6B8600390FCBC3992180BAA770B58CB263D9BC7C5EB734E5C1\nS5030020DC\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00001000: 86 6F                                            #.o\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fletcher-16-b-e 0x1000 -crop 0x1000 0x1004 -o test.out -hexdum\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0177a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"MD5 filter\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS109000068656C6C6F0AD8\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n# This is reported by md5sum:\n# b1946ac92492d2347c6235b4d2611184\ncat > test.ok << 'fubar'\nS00600004844521B\nS109000068656C6C6F0AD8\nS1130100B1946AC92492D2347C6235B4D261118428\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -md5 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if libgcrypt not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    SRecord appears to have been compiled without the gcrypt\"\n        echo \"    library, this test is therefore declared to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0178a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"SHA1\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS108000068656C6C6FE3\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS108000068656C6C6FE3\nS1170100AAF4C61DDCC5E8A2DABEDE0F3B482CD9AEA9434D47\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -sha1 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if liggcrypt not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    SRecord appears to have been compiled without the gcrypt\"\n        echo \"    library, this test is therefore declared to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0179a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"bitrev\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000012A63636F63404EAF64E362684503E\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bitrev -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# round trip test\nsrec_cat test.out -bitrev -o test.out2\nif test $? -ne 0; then fail; fi\n\ndiff test.in test.out2\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0180a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"bitrev wider\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1110000A612363634F6EA044EF6263650843E\nS5030001FB\nS9030001FB\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -bitrev 2 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# round trip test\nsrec_cat test.out -bitrev 2 -o test.out2\nif test $? -ne 0; then fail; fi\n\ndiff test.in test.out2\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0181a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"RMD160\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS117010017DDB889638EAE70DFDAED3B7DDAAD77F9856B71ED\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -rmd160 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if libgcrypt not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    SRecord appears to have been compiled without the gcrypt\"\n        echo \"    library, this test is therefore declared to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0182a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009-2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"SHA224\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS11F0100C547CF5D6BF6B795ABBE4C5CC7CAC00F1D5EC17BCD74281EA89E61089C\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt SHA224 not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -sha224 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if SHA224 not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    Your gcrypt library does not appear to have SHA224 support,\"\n        echo \"    this test is therefore declaraed to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0\nthen\n    fail\nfi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0183a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"SHA256\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1230100C98C24B677EFF44860AFEA6F493BBAEC5BB1C4CBB209C6FC2BBB47F66FF2AD31FE\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -sha256 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if libgcrypt not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    SRecord appears to have been compiled without the gcrypt\"\n        echo \"    library, this test is therefore declared to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0185a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"SHA384\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1230100D195483C9B554356BA50A855A605AAEE134612DCFDD05988FC605181D93603F2F7\nS113012015A0D07812A0B333FC2CCC75025736F549\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -sha384 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if libgcrypt not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    SRecord appears to have been compiled without the gcrypt\"\n        echo \"    library, this test is therefore declared to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0186a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"SHA512\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS1230100921618BC6D9F8059437C5E0397B13F973AB7C7A7B81F0CA31B70BF448FD800A4BE\nS123012060B67EFDA0020088BC97BF7D9DA97A9E2CE7B20D46E066462EC44CF60284F9A715\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -sha512 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if libgcrypt not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    SRecord appears to have been compiled without the gcrypt\"\n        echo \"    library, this test is therefore declared to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0187a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009-2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"whirlpool\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS123010057C5BED7FD14B12E6DFEC8EF2B4D73C3E54509BEC56C4AC9F91516C0803EB2AE33\nS1230120BC45ABAE0769DED7D05E667C4A9C3F10F8E2CB06F1F0BB80D7406C7C9FF6CE4787\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > ok2 << 'fubar'\nsrec_cat: libgcrypt WHIRLPOOL not available\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -whirlpool 0x100 -o test.out > LOG 2>&1\nif test $? -ne 0\nthen\n    # if SHA224 not available, pass by default\n    if diff ok2 LOG > /dev/null 2> /dev/null\n    then\n        echo\n        echo \"    Your gcrypt library does not appear to have WHIRLPOOL\"\n        echo \"    support, this test is therefore declared to pass by default.\"\n        echo\n        pass\n    fi\n\n    # some other error\n    cat LOG\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0188a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2014 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"l2h-crc-16\"\n. test_prelude\n\necho \"123456789\" | dd bs=9 count=1 > test.in 2>/dev/null\nif test $? -ne 0; then no_result; fi\n\n# augmented\n\ncat > test.ok << 'fubar'\n0xD1A2\nfubar\nif test $? -ne 0; then no_result; fi\n\n# This uses the low-to-high flag, reversing the order of the bits within\n# each byte as they flow through the algorithm.  This is done *inside*\n# the crc16 table and updcrc code.\ntest_crc16 -r < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# Now we double check.  We use the old high-to-low code, but we bitrev\n# each byte before we feed it to the algorithm, and then bitrev the\n# resulting CRC.  This should give identical answers to the above.\ntest_crc16 -h < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# un-augmented\n\ncat > test.ok << 'fubar'\n0x1E67\nfubar\nif test $? -ne 0; then no_result; fi\n\n# This uses the low-to-high flag, reversing the order of the bits within\n# each byte as they flow through the algorithm.  This is done *inside*\n# the crc16 table and updcrc code.\ntest_crc16 -a -r < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# Now we double check.  We use the old high-to-low code, but we bitrev\n# each byte before we feed it to the algorithm, and then bitrev the\n# resulting CRC.  This should give identical answers to the above.\ntest_crc16 -a -h < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0189a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"crc16 -ltm\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10C000031323334353637383916\nS10501001E6774\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -crc16-b-e 0x100 -least-to-most -no-augment -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0191a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel segment boundary\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111FFF848656C6C6F2C20576F726C64210A84\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:020000020000FC\n:08FFF80048656C6C6F2C20576A\n:020000021000EC\n:060000006F726C64210A1E\n:0400000300000000F9\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -intel --address-length=3\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0192a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel segment round-trip\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111FFF848656C6C6F2C20576F726C64210A84\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.middle -intel --address-length=3\nif test $? -ne 0; then fail; fi\n\n# make sure that round-trip data is identical\nsrec_cat test.middle -intel -o test.out --header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.in test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0193a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"generate const-l-e\"\n. test_prelude\n\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS107000801020304E6\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat --generate 8 12 -const-l-e 0x4030201 4 -o test.out -header HDR -esa 0\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0195a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009, 2011, 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"generate const-b-e\"\n. test_prelude\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS10B00080403020104030201D8\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -generate 8 16 -const-b-e 0x04030201 4 -o test.out -header HDR -esa 0\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0196a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009 David Kozub <zub@linux.fjfi.cvut.cz>\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"msbin round-trip\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111FFF848656C6C6F2C20576F726C64210A84\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.middle -MsBin\nif test $? -ne 0; then fail; fi\n\n# make sure that round-trip data is identical\nsrec_cat test.middle -MsBin -o test.out --header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.in test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0197a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009 David Kozub <zub@linux.fjfi.cvut.cz>\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"msbin read\"\n. test_prelude\n\n# Simple msbin file with three data records\n# 80000000: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF\n# 80000040: DE AD BE EF\n# 80001000: 56 78 9A\n# and the execution start address set to 0x80000004\n# encoded as Motorola:\ncat > test.in << 'fubar'\nS00600004844521B\nS12300004230303046460A0000008003100000000000800F000000F8070000112233445554\nS123002066778899AABBCCDDEEFF400000800400000038030000DEADBEEF001000800300F9\nS118004000006801000056789A00000000040000800000000052\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n# Equivalent Motorola file\ncat > test.ok << 'fubar'\nS00600004844521B\nS31480000000112233445566778899AABBCCDDEEFF73\nS30980000040DEADBEEFFE\nS3088000100056789AFF\nS5030003F9\nS7058000000476\nfubar\nif test $? -ne 0; then no_result; fi\n\n# reconstruct original msbin binary\nsrec_cat test.in -o test.msbin -binary\nif test $? -ne 0; then no_result; fi\n\n# decode the msbin file\nsrec_cat test.msbin -MsBin -o test.out --header HDR\nif test $? -ne 0; then fail; fi\n\n# test if the decoded msbin file is identical\ndiff test.out test.ok\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0198a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2009 David Kozub <zub@linux.fjfi.cvut.cz>\n# Copyright (C) 2009, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"msbin write\"\n. test_prelude\n\n# Simple Motorola file\ncat > test.in << 'fubar'\nS00600004844521B\nS31480000000112233445566778899AABBCCDDEEFF73\nS30980000040DEADBEEFFE\nS3088000100056789AFF\nS5030003F9\nS7058000000476\nfubar\nif test $? -ne 0; then no_result; fi\n\n# Target msbin file, encoded as Motorola:\ncat > test.ok.src << 'fubar'\nS00600004844521B\nS12300004230303046460A0000008003100000000000800F000000F8070000112233445554\nS123002066778899AABBCCDDEEFF400000800400000038030000DEADBEEF001000800300F9\nS118004000006801000056789A00000000040000800000000052\nS5030003F9\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n# reconstruct original msbin binary\nsrec_cat test.ok.src -o test.ok -binary\nif test $? -ne 0; then no_result; fi\n\n# encode test.in into MsBin format\nsrec_cat test.in -o test.out -MsBin\nif test $? -ne 0; then fail; fi\n\n# test if the encoded msbin file is identical\ncmp test.out test.ok\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/01/t0199a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# written by David Kozub <zub@linux.fjfi.cvut.cz>\n# Copyright assigned to Peter Miller 27-Jan-2010\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"msbin concatenate records\"\n. test_prelude\n\n# Generate a long enough test data\nsrec_cat -generate 1 1048577 -repeat-string 'MsBinConcatenateRecordsTest' -execution-start-address=1 -o test.in\nif test $? -ne 0; then no_result; fi\n\n# Test a round-trip srec->MsBin->srec\nsrec_cat test.in -o test.msbin -MsBin\nif test $? -ne 0; then fail; fi\n\nsrec_cat test.msbin -MsBin -o test.out\nif test $? -ne 0; then fail; fi\n\n# test if the resulting srec file is identical to the generated input\ncmp test.in test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0200a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srecord::output_filter_reblock\"\n. test_prelude\n\n# Note: the position of this data depends on srecord::memory_chunk::size\n#        defined in srecord/memory/chunk.h\n# This test of of data alignment spanning a chunk boundary.\n# If you change that value, you will have to change this test.\ncat > test.in << 'fubar'\nS00600004844521B\nS12306E0000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F06\nS1230700202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3FE5\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS322000006E0000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C61\nS322000006FD1D1E1F202122232425262728292A2B2C2D2E2F30313233343536373839FB\nS30B0000071A3A3B3C3D3E3F68\nS5030003F9\nS70500000000FA\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out --address-length=4 \\\n        --output-block-size=29  --output-block-packing\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0201a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"intel vs enable=optional-address\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:0E00000048656C6C6F2C20576F726C64210A7F\n:0400000500000000F7\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -intel --enable=optional-address\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0202a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fletcher16 defaults\"\n. test_prelude\n\nsrec_cat - -o test.in -bin << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n0x7728\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_fletcher16 < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0203a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fletcher16 seed\"\n. test_prelude\n\nsrec_cat - -o test.in -bin << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n0x7837\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_fletcher16 1 1 < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0205a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2010, 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"fletcher16 answer\"\n. test_prelude\n\nsrec_cat - -o test.in -bin << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n\n# Note that 0 == 0xFF mod 255\n\ncat > test.ok << 'fubar'\n0x6028\n0xFFFF\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_fletcher16 0 0 0x0000 < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n\n# try again for different answer\n\ncat > test.ok << 'fubar'\n0x91A4\n0xADDE\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_fletcher16 0 0 0xDEAD < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# try again for different answer\n\ncat > test.ok << 'fubar'\n0x8CCA\n0xCEFA\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_fletcher16 0 0 0xFACE < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# try again for different answer\n\ncat > test.ok << 'fubar'\n0x8227\n0x2143\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_fletcher16 0 0 0x4321 < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0206a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ancient Intel end-of-file records\"\n. test_prelude\n\ncat > test.in << 'fubar'\n:1000000012C02CC02BC02AC029C028C027C026C0BF\n:1000100025C0FBC123C080C245C2EBC11FC01EC0AA\n:1017F000000000000201010053454C20200034BBD2\n:00FF0F01F1\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n:020000040000FA\n:2000000012C02CC02BC02AC029C028C027C026C025C0FBC123C080C245C2EBC11FC01EC079\n:1017F000000000000201010053454C20200034BBD2\n:040000050000FF0FE9\n:00000001FF\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -intel -o test.out -intel > log 2>&1\nif test $? -ne 0\nthen\n    cat log\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0207a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-gen -repeat-string nnn\"\n. test_prelude\n\ncat > test.ok << 'fubar'\n00000000: 39 38 37 39 38 37 39 38 37 39 38 37 39 38 37 39  #9879879879879879\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat -gen 0 16 -repeat-string 987 -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0209a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"hexdump input\"\n. test_prelude\n\ncat > test.in << 'fubar'\n00000000:\n          22\n             49 20 64 6F 6E 27 74 20 63 61 72 65 20 69 66  #\"I don't care if\n00000010: 20 69 74 20 77 6F 72 6B 73 20 6F 6E 20 79 6F 75  # it works on you\n00000020: 72 20 6D 61 63 68 69 6E 65 2C 20 77 65 20 61 72  #r machine, we ar\n00000030: 65 6E 27 74 20 73 68 69 70 70 69 6E 67 20 79 6F  #en't shipping yo\n00000040: 75 72 0A 6D 61 63 68 69 6E 65 2E 22 20 2D 2D 20  #ur.machine.\" --\n00000050: 56 69 64 69 75 20 50 6C 61 74 6F 6E 0A           #Vidiu Platon.\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1230000224920646F6E2774206361726520696620697420776F726B73206F6E20796F75FE\nS123002072206D616368696E652C207765206172656E2774207368697070696E6720796F42\nS120004075720A6D616368696E652E22202D2D20566964697520506C61746F6E0A56\nS5030003F9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -hexdump -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0210a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"write mips flash\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n!R\n>00000xxx @00000000 !E\n@00000000\n>00000000\n48656C6C 6F2C2057 6F726C64 210A0000\n>#DL_DONE\n>FINISHED\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in --fill 0x00 --within test.in --range-padding 4 \\\n    -o test.out --mips-flash-be\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\ncat > test.ok << 'fubar'\n!R\n>1fc00xxx @1fc00000 !C\n>1fc00xxx @1fc00000 !E\n@1fc00000\n>1fc00000\n48656C6C 6F2C2057 6F726C64 210A0000\n>LOCKFLSH\n@1fc00000 !S\n@1fc20000 !S\n@1fc40000 !S\n@1fc60000 !S\n@1fc80000 !S\n@1fca0000 !S\n@1fcc0000 !S\n@1fce0000 !S\n>#DL_DONE\n>FINISHED\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat '(' test.in --fill 0x00 --within test.in --range-padding 4 ')' \\\n    --offset 0x1FC00000 -o test.out --mips-flash-be\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0211a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read mips flash\"\n. test_prelude\n\ncat > test.in << 'fubar'\n!R\n>00000xxx @00000000 !E\n@00000000\n>00000000\n48656C6C 6F2C2057 6F726C64 210A0000\n>#DL_DONE\n>FINISHED\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A 00 00  #Hello, World!...\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -mips-flash-be -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ----------  Must Also Cope With Erase  -----------------------------------\n\ncat > test.in << 'fubar'\n!R\n>1fc00xxx @1fc00000 !C\n>1fc00xxx @1fc00000 !E\n@1fc00000\n>1fc00000\n48656C6C 6F2C2057 6F726C64 210A0000\n>LOCKFLSH\n@1fc00000 !S\n@1fc20000 !S\n@1fc40000 !S\n@1fc60000 !S\n@1fc80000 !S\n@1fca0000 !S\n@1fcc0000 !S\n@1fce0000 !S\n>#DL_DONE\n>FINISHED\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n1FC00000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A 00 00  #Hello, World!...\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -mips-flash-be -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0212a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ppx hex\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n*\n0000 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A $S0473\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -ppx\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0213a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"ppx hex read\"\n. test_prelude\n\ncat > test.in << 'fubar'\n*\n0000 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0010 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0020 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0030 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0040 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0050 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0060 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0070 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78\n0080 12 34 56 78 12 34 56 78 12 34 56 78 12 34 56 78 $S26D0\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS123000012345678123456781234567812345678123456781234567812345678123456783C\nS123002012345678123456781234567812345678123456781234567812345678123456781C\nS12300401234567812345678123456781234567812345678123456781234567812345678FC\nS12300601234567812345678123456781234567812345678123456781234567812345678DC\nS1130080123456781234567812345678123456781C\nS5030005F7\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -ppx -o test.out -header HDR\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0215a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"write stag ppb\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 01 00 00 00 0E 00 00 00 00 48 65 6C 6C 6F 2C 20  #.........Hello,\n00000010: 57 6F 72 6C 64 21 0A 8D 01 00 00 00 00 00 00 00  #World!..........\n00000020: 00 00                                            #..\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out.2 -ppb\nif test $? -ne 0; then fail; fi\n\nsrec_cat test.out.2 -bin -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0216a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read stag prom prog bin\"\n. test_prelude\n\ncat > test.in.2 << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.2 -mot -o test.in -ppb\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A        #Hello, World!.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -ppb -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0217a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"write IDT/sim\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 53 30 06 00 00 48 44 52 1B 53 33 13 00 00 00 00  #S0...HDR.S3.....\n00000010: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A 79 53  #Hello, World!.yS\n00000020: 35 03 00 01 FB 53 37 05 00 00 00 00 FA           #5...{S7.....z\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out.2 -idt\nif test $? -ne 0; then fail; fi\n\nsrec_cat test.out.2 -bin -o test.out -hexdump\nif test $? -ne 0; then no_result; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0218a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read idt/sim\"\n. test_prelude\n\ncat > test.in.2 << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.2 -o test.in -idt\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A        #Hello, World!.\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -idt -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0219a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2011 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"option --guess\"\n. test_prelude\n\ncat > test.in << 'fubar'\n*\n0000 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A $S0473\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nsrec_info: test.in: the file format can be accessed directly with the\n    -Prom_Pogrammer_heXadecimal command line option (-ppx)\nFormat: Stag Prom Programmer hexadecimal (PPX)\nData:   0000 - 000D\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.in --guess > test.out 2>&1\nif test $? -ne 0\nthen\n    cat test.out\n    fail\nfi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0220a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012, 2014 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"crc-16-ansi\"\n. test_prelude\n\necho \"123456789\" | dd bs=9 count=1 > test.in  2>/dev/null\nif test $? -ne 0; then no_result; fi\n\n# If anyone has the ANSI stantda test vectors,\n# I'd rather use those.\ncat > test.ok << 'fubar'\n0x9ECF\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_crc16 -p ansi < test.in > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0221a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read TRS-80\"\n. test_prelude\n\ncat > test.in.in << 'fubar'\n05 03 48 44 52\n01 10 00 00 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A\n02 02 00 00\nfubar\ntest $? -eq 0 || no_result\n\ncat > test.ok.1 << 'fubar'\nFormat: TRS80\nHeader: \"HDR\"\nExecution Start Address: 00000000\nData:   0000 - 000D\nfubar\ntest $? -eq 0 || no_result\n\ncat > test.ok.2 << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\ntest $? -eq 0 || no_result\n\n# now build the TRS80 formatted file\nsrec_cat test.in.in -nh -o test.in -bin\ntest $? -eq 0 || no_result\n\nsrec_info test.in -trs80 > test.out\ntest $? -eq 0 || fail\n\ndiff test.ok.1 test.out\ntest $? -eq 0 || fail\n\nsrec_cat test.in -trs80 -o test.out\ntest $? -eq 0 || fail\n\ndiff test.ok.2 test.out\ntest $? -eq 0 || fail\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0222a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"write TRS80\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\n# this is a hexdump of the TRS80 binary file               #\ncat > test.ok << 'fubar'\n00000000: 05 03 48 44 52 01 10 00 00 48 65 6C 6C 6F 2C 20  #..HDR....Hello,\n00000010: 57 6F 72 6C 64 21 0A 02 02 00 00                 #World!.....\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.trs80 -trs80\nif test $? -ne 0; then fail; fi\n\nsrec_cat test.trs80 -bin -o test.out -hexdump\nif test $? -ne 0; then no_result; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0223a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"stm32-le\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A FF FF  #Hello, World!...\n00000100: B9 77 FC C7                                      #9w|G\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -over test.in -range-pad 4 -stm32-le 0x100 \\\n    -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0225a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"stm32-be\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A FF FF  #Hello, World!...\n00000100: C7 FC 77 B9                                      #G|w9\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -fill 0xFF -over test.in -range-pad 4 -stm32-be 0x100 \\\n    -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0227a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"trs80 long data records\"\n. test_prelude\n\ncat > test.in.srec << 'fubar'\nS00600004844521B\nS1230000051200006F6F2C206C6F6F6B2C207368696E79210102000000000000000000004B\nS12300200000000000000000000000000000000000000000000000000000000000000000BC\nS123004000000000000000000000000000000000000000000000000000000000000000009C\nS123006000000000000000000000000000000000000000000000000000000000000000007C\nS123008000000000000000000000000000000000000000000000000000000000000000005C\nS12300A000000000000000000000000000000000000000000000000000000000000000003C\nS12300C000000000000000000000000000000000000000000000000000000000000000001C\nS12300E00000000000000000000000000000000000000000000000000000000000000000FC\nS11F010000000000000000000000000000000000000000000000000003020000DA\nS5030009F3\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in.srec -o test.in -bin\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS01300006F6F2C206C6F6F6B2C207368696E792175\nS12300000000000000000000000000000000000000000000000000000000000000000000DC\nS12300200000000000000000000000000000000000000000000000000000000000000000BC\nS123004000000000000000000000000000000000000000000000000000000000000000009C\nS123006000000000000000000000000000000000000000000000000000000000000000007C\nS123008000000000000000000000000000000000000000000000000000000000000000005C\nS12300A000000000000000000000000000000000000000000000000000000000000000003C\nS12300C000000000000000000000000000000000000000000000000000000000000000001C\nS12300E00000000000000000000000000000000000000000000000000000000000000000FC\nS5030008F4\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -trs80 -o test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0228a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec_cat -o -coe\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS113000048656C6C6F2C20576F726C64215C6E0AAF\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n; HDR\n;\n; Generated automatically by srec_cat -o --coe 8\n;\n; depth = 16; 0x0010\n; width = 8; 0x08\nmemory_initialization_radix = 16;\nmemory_initialization_vector =\n48,\n65,\n6C,\n6C,\n6F,\n2C,\n20,\n57,\n6F,\n72,\n6C,\n64,\n21,\n5C,\n6E,\n0A;\n; start address = 0000\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -coe\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0229a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012, 2014 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Lattice .mem output\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000048656C6C6F2C20576F726C64210A7B\nS5030001FB\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n#Format=Hex\n#Depth=4\n#Width=32\n#AddrRadix=3\n#DataRadix=3\n#Data\n#\n# Generated automatically by srec_cat -o --MEM 32\n#\n# HDR\n48656C6C\n6F2C2057\n6F726C64\n210A0000\n# execution start address = 0000\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in --fill 0 0 16 -o test.out -mem 32\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0230a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2012, 2014 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"output -mem 32\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS12300007A855C178405C14B8D7FD703E20D2CE168B84570C1E3C731585CDB2A0778C73F44\nS123002012E9F486314236DF5970FF26621CA5258187CBF48A046FB8209B20F9E125668F3E\nS1230040F085A32C0A8F99828E20E2F3DC37EC233E84D1F3566D912C759FFC9450BFDB2942\nS1230060AC4CAFBA1BFED2EA0D227CEA52B50791F4944C07216A9880512B315D97E71506F1\nS123008055BE88AB42A5216190F75676992F189F8E3331A257E01835C1E814D8070EF5C95B\nS12300A054BA0A6B2F63BE739540574845B791F7FB39D2D86412B238B5EE92DEECC01F0BD7\nS12300C06836D6825D8D81E372E573FA04A8248E2AF9E7613F64B3F2C4AF6D71A15A18326D\nS12300E068B0514E7F730F815465DA4FC1113D58C4878DACFDF0755EA7613D7AA213E7C11A\nS12301007CA4D8C2E40FCE0F68316B925EBEF9B4467C1B8D7291031739C18EBCEAAFDF7738\nS1230120EE09D2ECE6696357E621359CE1503B076684C930AF0AE5A26F59738668577AA4F1\nS1230140B7FC922263D256E91263BEB59D20DBB8C0E24E6827E5829976094F72836EFAA33B\nS12301605BD9F49F4D00617FC4B33048AFA398526B18C420B0A822B80F905F2665034EC128\nS1230180D07FA72ED264DBFD73095E41509F2D420BD20094B000C5EAFA075BD23B00BD3D7D\nS12301A0008A21062B53C8C500F4EC001356D8F81DE7C2009B0C002676683FD0F7B7C16C0B\nS12301C0D1D87583F73334072E6B8896BE12B90CE488601891E38339CA6481A232F0CAEE8A\nS12301E02F5AECA53801A936D8DA5DF184E38F731BA4043AE48E3D5EE7A003606BF2ACA0C3\nS12302006D973A5A73567E0E5196FE738BD254F40059F811F11BC47DBBAC137ADBB2A739E0\nS1230220FC7AA42AE79C75E03BC28C7ECE6B7D31E51F5259F9A76E7C296C72FC66CE63C11C\nS12302400031EA7E59779DBBD7B8E6942657F71235581AD897070099C9975CF79F17DBBE92\nS123026073C6C857B828B7327BD152D2A0A1129AD272E1BF05CAC03B4F68E6A77D7323E017\nS123028038720012FA456A7BA37F5535A097D06B37465A6ACCE86173EB430EDBB7F858D89D\nS12302A01A91F4F4B5F802A7C33C605C6E13E1D7B2814F944574DD505D1931E3B70F89FD8B\nS12302C05F7A1F8E97C4E7EB1E6298A10C6A6D854D5A0B64B0484CA9BD73948D5443AC2788\nS12302E0FEC1CAEF05EB5C748873826D936613112A8559D3C5A83C4A84175FECEB08A1F67D\nS1230300DF1CCB448C9234D79E343B1690F75666B75E5B94617AC948E25387D9DB7FD23C53\nS1230320E23050F5CA24A4A7955096F4115722109624F176E308927B9BC3A7F2D61E0519FE\nS12303408E5A000A67DBB21283CF650503E974B00F1034C826E811801F5998D8AACF19247D\nS1230360DD5FFE9C08D9C4115AD67BCF922B889E83976896276D9276C8BC4CFA739097D6A2\nS12303800C68B255D06C735278577DC24D35200369D21D9C1210F374CAECCD0FC0CFA36881\nS12303A0F5F1A58B3E07FA729B1EFA631C139CAFA28261FB01B342C5AD59F8EF4F1863D51B\nS12303C0B0C90EF4BC507A89651736C1C8C3429E52ACA4FDCE8D5E247795EC42058A00E884\nS12303E0B500387C92595B40FB00AA9A004B1D02F353A0CA001277007832CE461D3F4300CB\nS5030020DC\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n#Format=Hex\n#Depth=256\n#Width=32\n#AddrRadix=3\n#DataRadix=3\n#Data\n#\n# Generated automatically by srec_cat -o --MEM 32\n#\n# HDR\n7A855C17\n8405C14B\n8D7FD703\nE20D2CE1\n68B84570\nC1E3C731\n585CDB2A\n0778C73F\n12E9F486\n314236DF\n5970FF26\n621CA525\n8187CBF4\n8A046FB8\n209B20F9\nE125668F\nF085A32C\n0A8F9982\n8E20E2F3\nDC37EC23\n3E84D1F3\n566D912C\n759FFC94\n50BFDB29\nAC4CAFBA\n1BFED2EA\n0D227CEA\n52B50791\nF4944C07\n216A9880\n512B315D\n97E71506\n55BE88AB\n42A52161\n90F75676\n992F189F\n8E3331A2\n57E01835\nC1E814D8\n070EF5C9\n54BA0A6B\n2F63BE73\n95405748\n45B791F7\nFB39D2D8\n6412B238\nB5EE92DE\nECC01F0B\n6836D682\n5D8D81E3\n72E573FA\n04A8248E\n2AF9E761\n3F64B3F2\nC4AF6D71\nA15A1832\n68B0514E\n7F730F81\n5465DA4F\nC1113D58\nC4878DAC\nFDF0755E\nA7613D7A\nA213E7C1\n7CA4D8C2\nE40FCE0F\n68316B92\n5EBEF9B4\n467C1B8D\n72910317\n39C18EBC\nEAAFDF77\nEE09D2EC\nE6696357\nE621359C\nE1503B07\n6684C930\nAF0AE5A2\n6F597386\n68577AA4\nB7FC9222\n63D256E9\n1263BEB5\n9D20DBB8\nC0E24E68\n27E58299\n76094F72\n836EFAA3\n5BD9F49F\n4D00617F\nC4B33048\nAFA39852\n6B18C420\nB0A822B8\n0F905F26\n65034EC1\nD07FA72E\nD264DBFD\n73095E41\n509F2D42\n0BD20094\nB000C5EA\nFA075BD2\n3B00BD3D\n008A2106\n2B53C8C5\n00F4EC00\n1356D8F8\n1DE7C200\n9B0C0026\n76683FD0\nF7B7C16C\nD1D87583\nF7333407\n2E6B8896\nBE12B90C\nE4886018\n91E38339\nCA6481A2\n32F0CAEE\n2F5AECA5\n3801A936\nD8DA5DF1\n84E38F73\n1BA4043A\nE48E3D5E\nE7A00360\n6BF2ACA0\n6D973A5A\n73567E0E\n5196FE73\n8BD254F4\n0059F811\nF11BC47D\nBBAC137A\nDBB2A739\nFC7AA42A\nE79C75E0\n3BC28C7E\nCE6B7D31\nE51F5259\nF9A76E7C\n296C72FC\n66CE63C1\n0031EA7E\n59779DBB\nD7B8E694\n2657F712\n35581AD8\n97070099\nC9975CF7\n9F17DBBE\n73C6C857\nB828B732\n7BD152D2\nA0A1129A\nD272E1BF\n05CAC03B\n4F68E6A7\n7D7323E0\n38720012\nFA456A7B\nA37F5535\nA097D06B\n37465A6A\nCCE86173\nEB430EDB\nB7F858D8\n1A91F4F4\nB5F802A7\nC33C605C\n6E13E1D7\nB2814F94\n4574DD50\n5D1931E3\nB70F89FD\n5F7A1F8E\n97C4E7EB\n1E6298A1\n0C6A6D85\n4D5A0B64\nB0484CA9\nBD73948D\n5443AC27\nFEC1CAEF\n05EB5C74\n8873826D\n93661311\n2A8559D3\nC5A83C4A\n84175FEC\nEB08A1F6\nDF1CCB44\n8C9234D7\n9E343B16\n90F75666\nB75E5B94\n617AC948\nE25387D9\nDB7FD23C\nE23050F5\nCA24A4A7\n955096F4\n11572210\n9624F176\nE308927B\n9BC3A7F2\nD61E0519\n8E5A000A\n67DBB212\n83CF6505\n03E974B0\n0F1034C8\n26E81180\n1F5998D8\nAACF1924\nDD5FFE9C\n08D9C411\n5AD67BCF\n922B889E\n83976896\n276D9276\nC8BC4CFA\n739097D6\n0C68B255\nD06C7352\n78577DC2\n4D352003\n69D21D9C\n1210F374\nCAECCD0F\nC0CFA368\nF5F1A58B\n3E07FA72\n9B1EFA63\n1C139CAF\nA28261FB\n01B342C5\nAD59F8EF\n4F1863D5\nB0C90EF4\nBC507A89\n651736C1\nC8C3429E\n52ACA4FD\nCE8D5E24\n7795EC42\n058A00E8\nB500387C\n92595B40\nFB00AA9A\n004B1D02\nF353A0CA\n00127700\n7832CE46\n1D3F4300\n# execution start address = 0000\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -mem 32 -esa 0\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0231a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read -tek-ex csum bug\"\n. test_prelude\n\ncat > test.in << 'fubar'\nHello, World!\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.in << 'fubar'\n%4E6E280000000054495041635953580D5953580600030001000E00050200000300000001595358\n%4E664800000020C0168311C0BB000077367735F7317726C4353C055A00BF0746674E5628008001\n%0E81E800000000\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nFormat: Tektronix Extended\nExecution Start Address: 00000000\nData:   0000 - 003F\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_info test.in -tex > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0232a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"options ambiguous\"\n. test_prelude\n\ntest_arglex_ambiguous\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0233a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"srec-cat -checksum-be\"\n. test_prelude\n\n# ----------  Positive Checksum  ----------------------------------------------\n#\n# Test the checksum of all bytes 0x01\n#\nsrec_cat -gen 0 0x10 --const 0x01 \\\n        -header=HDR -esa 0 \\\n        > test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS113000001010101010101010101010101010101DC\nS107040000000010E4\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -Checksum_Big_Endian 0x400 > test.out 2> LOG\nif test $? -ne 0; then cat LOG; fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ----------  Positive Checksum  ----------------------------------------------\n#\n# Test the checksum of all bytes 0xFF\n#\nsrec_cat -gen 0 0x10 --const 0xFF \\\n        -header=HDR -esa 0 \\\n        > test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC\nS107040000000FF0F5\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -Checksum_Pos_Big_Endian 0x400 > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0235a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"url_decode\"\n. test_prelude\n\ncat > test.in << 'fubar'\nHello, World!%20%45\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nHello, World! E\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_url_decode --decode test.in test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0236a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"url_encode\"\n. test_prelude\n\ntest_url_decode --decode > test.in << 'fubar'\na%01b%02c%03\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\na%01b%02c%03\nfubar\nif test $? -ne 0; then no_result; fi\n\ntest_url_decode --encode test.in test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0237a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"Tec-ext format, read\"\n. test_prelude\n\ncat > test.in << 'fubar'\n%1561C3100202020202020\n%0E82F80000006B\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000100: 20 20 20 20 20 20                                #\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -tek-ext -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0238a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"filter checksum negative\"\n. test_prelude\n\n\n# ----------  Negative Checksum  ----------------------------------------------\n#\n# Test the checksum of all bytes 0x01\n#\nsrec_cat -gen 0 0x10 --const 0x01 \\\n        -header=HDR -esa 0 \\\n        > test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS113000001010101010101010101010101010101DC\nS1070400FFFFFFF007\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -Checksum_Neg_Big_Endian 0x400 4 > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ----------  Negative Checksum  ----------------------------------------------\n#\n# Test the checksum of all bytes 0xFF\n#\nsrec_cat -gen 0 0x10 --const 0xFF \\\n        -header=HDR -esa 0 \\\n        > test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC\nS1070400FFFFF010F6\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -Checksum_Neg_Big_Endian 0x400 4 > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0239a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"filter checksum bitnot\"\n. test_prelude\n\n\n# ----------  Bitnot Checksum  ----------------------------------------------\n#\n# Test the checksum of all bytes 0x01\n#\nsrec_cat -gen 0 0x10 --const 0x01 \\\n        -header=HDR -esa 0 \\\n        > test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS113000001010101010101010101010101010101DC\nS1070400FFFFFFEF08\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -Checksum_BitNot_Big_Endian 0x400 4 > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ----------  Bitnot Checksum  ----------------------------------------------\n#\n# Test the checksum of all bytes 0xFF\n#\nsrec_cat -gen 0 0x10 --const 0xFF \\\n        -header=HDR -esa 0 \\\n        > test.in\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nS00600004844521B\nS1130000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC\nS1070400FFFFF00FF7\nS5030002FA\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -Checksum_BitNot_Big_Endian 0x400 4 > test.out\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0250a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"read logisim\"\n. test_prelude\n\ncat > test.in << 'fubar'\nv2.0 raw\n\n02\n03\n00\n14\nff\n123*8F\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n00000000: 02 03 00 14 FF 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\n00000010: 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\n00000020: 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\n00000030: 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\n00000040: 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\n00000050: 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\n00000060: 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\n00000070: 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F 8F  #................\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -logi -o test.out -hexdump\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0251a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2013 Peter Miller\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"write Logisim\"\n. test_prelude\n\nsrec_cat - -motorola -disable=esa -o test.bin -bin << 'fubar'\nS0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D\nS12300001FF38F46DDCCC11A0FE4E64DC0CD6DC1825F1F87CC8A6DE3B250CBC1CEC6204CD5\nS12300209598FDBBAD725DFDE909FFE0F041ED568677064CBCAC4A9FDD996A7046BAD55103\nS12300402D6BD57A6B2DFA954C8B3439806F6F3FE0DF8341BB51CD9462EBF8F2122200A5AD\nS1230060DAB18AD410A9EF790AD57A54977C3639831D60C3D89CE9AD4233B111B122C87E26\nS1230080249794BAC6BAB8F19FDD641C551242D7C88EB0E202392DD7AB0CC331963D2F7169\nS12300A058B984E55B8369028DAB82E8F51FAA5313C1FA2763F5FDA4BBB44346385621CD64\nS12300C039D0C45B1B62BCC04E181740B9F0386E8FBA0437B99D34FDCF3A5721D0EB05960D\nS12300E01C108CCB8ABC2D3C6D598C15C68E1B48EFE8DC164099AA2E2292052726A107CEB6\nS1230100D8591490D2B031F162A31F0E9DB8E172B780423D20CBD393038F46A8D0DA3ACF4E\nS12301202107CFB4EB70898F5AF1D9D24D8F835C83CBD5EA1554B0B6E1B0BA0123EF82240C\nS1230140946BACC301F23C87EDBECA79BE0811B6202300A85823DB43CAFDCD8A4AC6C9D8A9\nS12301606318A1D8E89B0AE645E1DCBF7DC7607C8D29A0376830B45291A44D3A4E0BA86EDD\nS12301809383C7C655E4352B2AE4B1C7CEA9F006BECE68FD67F4BFC6BCDB7159297308E274\nS12301A0C3561C5D63239B5C0E8F0041CC414A077CED8080941FBE118D4EF804A12F68D323\nS12301C005926EEC5DD3F6ABBE338FF0ACCB8FF4D91F19130276F04CDD9FAE80445B5ED59B\nS12301E05738A43E7CB399467F56135B705E0884C53752F259B3BCE50AAF92C0C1E1B9523A\nS1230200F765AA1A26092D8308D80B07C4244A977BCCB9EB783A13EE368072787DD0E8D5D8\nS12302203994F5A4AEDDAE52C0DDEE4F0E45C1BF1BA697B5A43CF09B08D852BC19513A6CA6\nS1230240B574052A562BB437E733F4075511305FFBA47CC53C1CF98D1ED7CC0CF639E8C06A\nS12302601D2C8F3A8EE88E21527E5147A564268631BC381799E222D181E6950ACD72015ED8\nS123028091F6B54F2B472E3B3C58E7CBB13F61103012CF3759D9E75C787931164379D76362\nS12302A021D8E2ABC2EDA89BF80676CCE5EDB5DF7F1C58C013B4C9C49CF7D00B07B815498A\nS12302C0012FF93EFA43F85A0F56261BB8108987A4FF594043BAFD3F796704D9B513574A0B\nS12302E040663C4E718813950F39AD84A6BB3E69ECA1DC0D841EF6CA411A7485ECC7DB915D\nS12303006CDBEDDB976EEA56F83DFC16141C771B70376943E09AE2D5B36CC60A9FDB1CD69D\nS1230320F4BE227D2BE578A1FC3A1FC6EFF860F09973972807B4A9CB5A85C17DE5F8150FD5\nS12303405407099F66F516CBE0CA0EB147A52C58DB9DECC4DDE32606BE38F44A204183470E\nS1230360968D9CC6527468B52A2B450360291553FF6C582430207053E665C148AE6438C625\nS1230380AFC463C3DEA3DF70256493D3DF8A6B24C1BF9E17E3C8B4780F6FB20001AB1C1BEA\nS12303A0E9CC8C5B1EAB65894264CEBB7D8AA1A9C7C419DA3BD121D8FB0FA5C13EAFDCB4F6\nS12303C067ACFAF813BF676D6623DA711AB69FD640D3D5D7DD7DDE9875D1B110FB293B5F01\nS12303E0FAAA3B6CD0F971A7E1B022E6A210695E4BCC083CCB358D643E23E1A18E8AD4A5FB\nS5030020DC\nS9030000FC\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\nv2.0 raw\n\n1F F3 8F 46 DD CC C1 1A F E4 E6 4D C0 CD 6D C1 82 5F 1F 87 CC 8A 6D E3 B2 50 CB\nC1 CE C6 20 4C 95 98 FD BB AD 72 5D FD E9 9 FF E0 F0 41 ED 56 86 77 6 4C BC AC\n4A 9F DD 99 6A 70 46 BA D5 51 2D 6B D5 7A 6B 2D FA 95 4C 8B 34 39 80 6F 6F 3F E0\nDF 83 41 BB 51 CD 94 62 EB F8 F2 12 22 0 A5 DA B1 8A D4 10 A9 EF 79 A D5 7A 54\n97 7C 36 39 83 1D 60 C3 D8 9C E9 AD 42 33 B1 11 B1 22 C8 7E 24 97 94 BA C6 BA B8\nF1 9F DD 64 1C 55 12 42 D7 C8 8E B0 E2 2 39 2D D7 AB C C3 31 96 3D 2F 71 58 B9\n84 E5 5B 83 69 2 8D AB 82 E8 F5 1F AA 53 13 C1 FA 27 63 F5 FD A4 BB B4 43 46 38\n56 21 CD 39 D0 C4 5B 1B 62 BC C0 4E 18 17 40 B9 F0 38 6E 8F BA 4 37 B9 9D 34 FD\nCF 3A 57 21 D0 EB 5 96 1C 10 8C CB 8A BC 2D 3C 6D 59 8C 15 C6 8E 1B 48 EF E8 DC\n16 40 99 AA 2E 22 92 5 27 26 A1 7 CE D8 59 14 90 D2 B0 31 F1 62 A3 1F E 9D B8 E1\n72 B7 80 42 3D 20 CB D3 93 3 8F 46 A8 D0 DA 3A CF 21 7 CF B4 EB 70 89 8F 5A F1\nD9 D2 4D 8F 83 5C 83 CB D5 EA 15 54 B0 B6 E1 B0 BA 1 23 EF 82 24 94 6B AC C3 1\nF2 3C 87 ED BE CA 79 BE 8 11 B6 20 23 0 A8 58 23 DB 43 CA FD CD 8A 4A C6 C9 D8\n63 18 A1 D8 E8 9B A E6 45 E1 DC BF 7D C7 60 7C 8D 29 A0 37 68 30 B4 52 91 A4 4D\n3A 4E B A8 6E 93 83 C7 C6 55 E4 35 2B 2A E4 B1 C7 CE A9 F0 6 BE CE 68 FD 67 F4\nBF C6 BC DB 71 59 29 73 8 E2 C3 56 1C 5D 63 23 9B 5C E 8F 0 41 CC 41 4A 7 7C ED\n80 80 94 1F BE 11 8D 4E F8 4 A1 2F 68 D3 5 92 6E EC 5D D3 F6 AB BE 33 8F F0 AC\nCB 8F F4 D9 1F 19 13 2 76 F0 4C DD 9F AE 80 44 5B 5E D5 57 38 A4 3E 7C B3 99 46\n7F 56 13 5B 70 5E 8 84 C5 37 52 F2 59 B3 BC E5 A AF 92 C0 C1 E1 B9 52 F7 65 AA\n1A 26 9 2D 83 8 D8 B 7 C4 24 4A 97 7B CC B9 EB 78 3A 13 EE 36 80 72 78 7D D0 E8\nD5 39 94 F5 A4 AE DD AE 52 C0 DD EE 4F E 45 C1 BF 1B A6 97 B5 A4 3C F0 9B 8 D8\n52 BC 19 51 3A 6C B5 74 5 2A 56 2B B4 37 E7 33 F4 7 55 11 30 5F FB A4 7C C5 3C\n1C F9 8D 1E D7 CC C F6 39 E8 C0 1D 2C 8F 3A 8E E8 8E 21 52 7E 51 47 A5 64 26 86\n31 BC 38 17 99 E2 22 D1 81 E6 95 A CD 72 1 5E 91 F6 B5 4F 2B 47 2E 3B 3C 58 E7\nCB B1 3F 61 10 30 12 CF 37 59 D9 E7 5C 78 79 31 16 43 79 D7 63 21 D8 E2 AB C2 ED\nA8 9B F8 6 76 CC E5 ED B5 DF 7F 1C 58 C0 13 B4 C9 C4 9C F7 D0 B 7 B8 15 49 1 2F\nF9 3E FA 43 F8 5A F 56 26 1B B8 10 89 87 A4 FF 59 40 43 BA FD 3F 79 67 4 D9 B5\n13 57 4A 40 66 3C 4E 71 88 13 95 F 39 AD 84 A6 BB 3E 69 EC A1 DC D 84 1E F6 CA\n41 1A 74 85 EC C7 DB 91 6C DB ED DB 97 6E EA 56 F8 3D FC 16 14 1C 77 1B 70 37 69\n43 E0 9A E2 D5 B3 6C C6 A 9F DB 1C D6 F4 BE 22 7D 2B E5 78 A1 FC 3A 1F C6 EF F8\n60 F0 99 73 97 28 7 B4 A9 CB 5A 85 C1 7D E5 F8 15 F 54 7 9 9F 66 F5 16 CB E0 CA\nE B1 47 A5 2C 58 DB 9D EC C4 DD E3 26 6 BE 38 F4 4A 20 41 83 47 96 8D 9C C6 52\n74 68 B5 2A 2B 45 3 60 29 15 53 FF 6C 58 24 30 20 70 53 E6 65 C1 48 AE 64 38 C6\nAF C4 63 C3 DE A3 DF 70 25 64 93 D3 DF 8A 6B 24 C1 BF 9E 17 E3 C8 B4 78 F 6F B2\n0 1 AB 1C 1B E9 CC 8C 5B 1E AB 65 89 42 64 CE BB 7D 8A A1 A9 C7 C4 19 DA 3B D1\n21 D8 FB F A5 C1 3E AF DC B4 67 AC FA F8 13 BF 67 6D 66 23 DA 71 1A B6 9F D6 40\nD3 D5 D7 DD 7D DE 98 75 D1 B1 10 FB 29 3B 5F FA AA 3B 6C D0 F9 71 A7 E1 B0 22 E6\nA2 10 69 5E 4B CC 8 3C CB 35 8D 64 3E 23 E1 A1 8E 8A D4 A5\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.bin -bin -o test.out -logisim\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# dog food it\nsrec_cmp test.bin -bin test.out -logisim\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/02/t0253a.sh",
    "content": "#!/bin/sh\n#\n# srecord - Manipulate EPROM load files\n# Copyright (C) 2014 Scott Finneran\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or (at\n# your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n\nTEST_SUBJECT=\"-c-array -section-style\"\n. test_prelude\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000748656C6C6F2C20576F726C64210A74\nS111002048656C6C6F2C20576F726C64210A5B\nS111004248656C6C6F2C20576F726C64210A39\nS5030003F9\nS9030007F5\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\n__root __no_init const unsigned char eprom[] @0x20000000 =\n{\n0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,\n0x21, 0x0A, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72,\n0x6C, 0x64, 0x21, 0x0A, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57,\n0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0A,\n};\n\nconst unsigned long eprom_address[] =\n{\n0x00000007, 0x00000020, 0x00000042,\n};\nconst unsigned long eprom_length_of_sections[] =\n{\n0x0000000E, 0x0000000E, 0x0000000E,\n};\nconst unsigned long eprom_sections    = 0x00000003;\nconst unsigned long eprom_termination = 0x00000007;\nconst unsigned long eprom_start       = 0x00000007;\nconst unsigned long eprom_finish      = 0x00000050;\nconst unsigned long eprom_length      = 0x00000049;\n\n#define EPROM_TERMINATION 0x00000007\n#define EPROM_START       0x00000007\n#define EPROM_FINISH      0x00000050\n#define EPROM_LENGTH      0x00000049\n#define EPROM_SECTIONS    0x00000003\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -c-array -section-style \\\n    -prefix=\"__root __no_init\" -postfix=\"@0x20000000\"\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- one more time, with only prefix -------------------------\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000748656C6C6F2C20576F726C64210A74\nS5030001FB\nS9030007F5\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\n__root __no_init const unsigned char eprom[] =\n{\n0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,\n0x21, 0x0A,\n};\nconst unsigned long eprom_termination = 0x00000007;\nconst unsigned long eprom_start       = 0x00000007;\nconst unsigned long eprom_finish      = 0x00000015;\nconst unsigned long eprom_length      = 0x0000000E;\n\n#define EPROM_TERMINATION 0x00000007\n#define EPROM_START       0x00000007\n#define EPROM_FINISH      0x00000015\n#define EPROM_LENGTH      0x0000000E\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -c-array -prefix=\"__root __no_init\"\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n# ---------- one more time, with only postfix -------------------------\n\ncat > test.in << 'fubar'\nS00600004844521B\nS111000748656C6C6F2C20576F726C64210A74\nS5030001FB\nS9030007F5\nfubar\nif test $? -ne 0; then no_result; fi\n\ncat > test.ok << 'fubar'\n/* HDR */\nconst unsigned char eprom[] @0x20000000 =\n{\n0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,\n0x21, 0x0A,\n};\nconst unsigned long eprom_termination = 0x00000007;\nconst unsigned long eprom_start       = 0x00000007;\nconst unsigned long eprom_finish      = 0x00000015;\nconst unsigned long eprom_length      = 0x0000000E;\n\n#define EPROM_TERMINATION 0x00000007\n#define EPROM_START       0x00000007\n#define EPROM_FINISH      0x00000015\n#define EPROM_LENGTH      0x0000000E\nfubar\nif test $? -ne 0; then no_result; fi\n\nsrec_cat test.in -o test.out -c-array -postfix=\"@0x20000000\"\nif test $? -ne 0; then fail; fi\n\ndiff test.ok test.out\nif test $? -ne 0; then fail; fi\n\n#\n# The things tested here, worked.\n# No other guarantees are made.\n#\npass\n\n# vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/arglex_ambiguous/main.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <srecord/arglex/tool.h>\n\n\nint\nmain(int argc, char **argv)\n{\n    srecord::arglex_tool cmdline(argc, argv);\n    cmdline.token_first();\n\n    //\n    // Consume the command line.  It should be empty.\n    //\n    while (cmdline.token_cur() != srecord::arglex::token_eoln)\n    {\n        cmdline.default_command_line_processing();\n    }\n\n    //\n    // Check the options, to ensure they are all mutually exclusive.\n    //\n    cmdline.test_ambiguous();\n\n    //\n    // success\n    //\n    return 0;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/crc16/main.cc",
    "content": "//\n// srecord - The \"srecord\" program.\n// Copyright (C) 2007-2010, 2012, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstdlib>\n#include <unistd.h>\n#include <getopt.h>\n\n#include <srecord/bitrev.h>\n#include <srecord/crc16.h>\n#include <srecord/progname.h>\n#include <srecord/quit.h>\n#include <srecord/versn_stamp.h>\n\n\nstatic void\nusage(void)\n{\n    fprintf(stderr, \"Usage: [ -av ] %s\\n\", srecord::progname_get());\n    exit(1);\n}\n\n\nstatic const struct option options[] =\n{\n    { \"augment\", 0, 0, 'a' },\n    { \"broken\", 0, 0, 'b' },\n    { \"ccitt\", 0, 0, 'c' },\n    { \"help\", 0, 0, 'h' },\n    { \"polynomial\", 1, 0, 'p' },\n    { \"reverse\", 0, 0, 'r' },\n    { \"table\", 0, 0, 't' },\n    { \"version\", 0, 0, 'V' },\n    { \"xmodem\", 0, 0, 'x' },\n};\n\n\nint\nmain(int argc, char **argv)\n{\n    srecord::progname_set(argv[0]);\n    srecord::crc16::seed_mode_t seed_mode = srecord::crc16::seed_mode_ccitt;\n    bool augment = true;\n    unsigned short polynomial = srecord::crc16::polynomial_ccitt;\n    bool print_table = false;\n    srecord::crc16::bit_direction_t bitdir =\n        srecord::crc16::bit_direction_most_to_least;\n    bool h_flag = false;\n    for (;;)\n    {\n        int c = getopt_long(argc, argv, \"abchp:rtVx\", options, 0);\n        if (c == EOF)\n            break;\n        switch (c)\n        {\n        case 'a':\n            augment = !augment;\n            break;\n\n        case 'b':\n            seed_mode = srecord::crc16::seed_mode_broken;\n            break;\n\n        case 'c':\n            seed_mode = srecord::crc16::seed_mode_ccitt;\n            break;\n\n        case 'h':\n            h_flag = true;\n            break;\n\n        case 'p':\n            {\n                char *ep = 0;\n                polynomial = strtol(optarg, &ep, 0);\n                if (ep == optarg || *ep)\n                    polynomial = srecord::crc16::polynomial_by_name(optarg);\n            }\n            break;\n\n        case 'r':\n            bitdir = srecord::crc16::bit_direction_least_to_most;\n            break;\n\n        case 't':\n            print_table = true;\n            break;\n\n        case 'x':\n            seed_mode = srecord::crc16::seed_mode_xmodem;\n            break;\n\n        case 'V':\n            srecord::print_version();\n            return 0;\n\n        default:\n            usage();\n            // NOTREACHED\n        }\n    }\n    if (optind != argc)\n        usage();\n\n    srecord::crc16 check(seed_mode, augment, polynomial, bitdir);\n    if (print_table)\n    {\n        check.print_table();\n        return 0;\n    }\n    for (;;)\n    {\n        char buffer[1024];\n        int n = read(0, buffer, sizeof(buffer));\n        if (n < 0)\n            srecord::quit_default.fatal_error_errno(\"read stdin\");\n        if (!n)\n            break;\n        if (h_flag)\n        {\n            for (int j = 0; j < n; ++j)\n                buffer[j] = srecord::bitrev8(buffer[j]);\n        }\n        check.nextbuf(buffer, n);\n    }\n\n    // The h_flags is use to validate the crc16 least-to-most code.\n    // Because that code calculate the CRC bit reversed, we bit reverse\n    // here so that we can test for identical-ness.\n    if (h_flag)\n        printf(\"0x%04X\\n\", srecord::bitrev16(check.get()));\n    else\n        printf(\"0x%04X\\n\", check.get());\n    return 0;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/fletcher16/main.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2010, 2011, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstdlib>\n#include <unistd.h>\n\n#include <srecord/fletcher16.h>\n\n\nstatic void\nusage(void)\n{\n    fprintf(stderr, \"Usage: test_fletcher16 [ <sum1> <sum2> [ <answer> ]]\\n\");\n    exit(1);\n}\n\n\nint\nmain(int argc, char **argv)\n{\n    unsigned char sum1 = 0xFF;\n    unsigned char sum2 = 0xFF;\n    int answer = -1;\n    if (argc == 2 && argv[1][0] == '-')\n        return 0;\n    switch (argc)\n    {\n    case 4:\n        answer = strtol(argv[3], 0, 0);\n        // Fall through...\n\n    case 3:\n        sum2 = strtol(argv[2], 0, 0);\n        sum1 = strtol(argv[1], 0, 0);\n        break;\n\n    case 1:\n        break;\n\n    default:\n        usage();\n    }\n\n    srecord::fletcher16 checksum(sum1, sum2, answer, srecord::endian_little);\n    srecord::fletcher16 checksum1(sum1, sum2, -1);\n    for (;;)\n    {\n        char buffer[1024];\n        int n = read(0, buffer, sizeof(buffer));\n        if (n <= 0)\n            break;\n        checksum.nextbuf(buffer, n);\n        checksum1.nextbuf(buffer, n);\n    }\n    printf(\"0x%04X\\n\", checksum.get());\n    if (answer >= 0)\n    {\n        fflush(stdout);\n        unsigned n = checksum.get();\n\n        // big endian ?!?\n        checksum1.next(n >> 8);\n        checksum1.next(n & 0xFF);\n        printf(\"0x%04X\\n\", checksum1.get());\n    }\n    return 0;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/gecos/main.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2014 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <pwd.h>\n#include <string>\n#include <unistd.h>\n#include <vector>\n\n#include <srecord/arglex.h>\n\n\ntypedef std::vector<std::string> string_list_t;\n\n\nstatic std::string\ntrim(const std::string &text)\n{\n    bool white_space = false;\n    std::string result;\n    const char *cp = text.c_str();\n    for (;;)\n    {\n        unsigned char c = *cp++;\n        if (!c)\n            break;\n        if (isspace(c))\n        {\n            white_space = !result.empty();\n        }\n        else\n        {\n            if (white_space)\n                result += ' ';\n            result += c;\n            white_space = false;\n        }\n    }\n    return result;\n}\n\n\nstatic void\nsplit(string_list_t &result, const char *text, const char *sep)\n{\n    const char *ep = text;\n    for (;;)\n    {\n        if (*ep == '\\0')\n            return;\n\n        const char *p = strpbrk(ep, sep);\n        if (!p)\n        {\n            std::string name(ep);\n            result.push_back(trim(name));\n            return;\n        }\n\n        std::string name(ep, p - ep);\n        result.push_back(trim(name));\n        ep = p + 1;\n    }\n}\n\n\nint\nmain(int argc, char **argv)\n{\n    srecord::arglex cmdline(argc, argv);\n    cmdline.token_first();\n    for (;;cmdline.token_next())\n    {\n        switch (cmdline.token_cur())\n        {\n        case srecord::arglex::token_version:\n            return EXIT_SUCCESS;\n\n        case srecord::arglex::token_eoln:\n            break;\n\n        default:\n            cmdline.default_command_line_processing();\n            continue;\n        }\n        break;\n    }\n\n    struct passwd *pw;\n    pw = getpwuid(getuid());\n    if (!pw)\n    {\n        fprintf(stderr, \"getpwui(%d) failed\", getuid());\n        return EXIT_FAILURE;\n    }\n\n    string_list_t gecos;\n    split(gecos, pw->pw_gecos, \",\");\n\n    string_list_t words;\n    split(words, gecos[0].c_str(), \" \\t\\n\");\n\n    if (words.size() >= 1)\n        printf(\" -una %s\\n\", words[0].c_str());\n    if (words.size() >= 2)\n        printf(\" -gna %s\\n\", words[1].c_str());\n\n    return EXIT_SUCCESS;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/hyphen/main.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2010, 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cstdio>\n#include <cstdlib>\n#include <getopt.h>\n#include <string>\n\n#include <srecord/progname.h>\n#include <srecord/quit.h>\n#include <srecord/versn_stamp.h>\n\n\nstatic int number_of_errors;\n\n\nstatic bool\nread_one_line(const char *filename, FILE *fp, std::string &result)\n{\n    for (;;)\n    {\n        int c = getc(fp);\n        if (c == EOF)\n        {\n            if (ferror(fp))\n            {\n                srecord::quit_default.fatal_error_errno(\"read %s\", filename);\n            }\n            return !result.empty();\n        }\n        if (c == '\\n')\n            return true;\n        result += (unsigned char)c;\n    }\n}\n\n\nstatic void\ncheck(const char *filename)\n{\n    FILE *fp = fopen(filename, \"r\");\n    if (!fp)\n        srecord::quit_default.fatal_error_errno(\"open %s\", filename);\n    int line_number = 0;\n    for (;;)\n    {\n        std::string line;\n        if (!read_one_line(filename, fp, line))\n            break;\n        ++line_number;\n        switch (line.c_str()[0])\n        {\n        case '.':\n        case '\\0':\n        case '\\'':\n            continue;\n\n        default:\n            {\n                int n = 0;\n                const char *cp = line.c_str();\n                for (;;)\n                {\n                    unsigned char c = *cp++;\n                    switch (c)\n                    {\n                    case '\\0':\n                        break;\n\n                    case '-':\n                        if (cp == line.c_str() + 1 || cp[-2] != '\\\\')\n                        {\n                            ++n;\n                        }\n                        continue;\n\n                    default:\n                        continue;\n                    }\n                    break;\n                }\n                switch (n)\n                {\n                case 0:\n                    break;\n\n                case 1:\n                    fprintf\n                    (\n                        stderr,\n                        \"%s: %d: unescaped minus character\\n\",\n                        filename,\n                        line_number\n                    );\n                    ++number_of_errors;\n                    break;\n\n                default:\n                    fprintf\n                    (\n                        stderr,\n                        \"%s: %d: %d unescaped minus characters\\n\",\n                        filename,\n                        line_number,\n                        n\n                    );\n                    ++number_of_errors;\n                    break;\n                }\n            }\n            continue;\n        }\n        break;\n    }\n    fclose(fp);\n}\n\n\nstatic void\nusage(void)\n{\n    const char *prog = srecord::progname_get();\n    fprintf(stderr, \"Usage: %s <filename>...\\n\", prog);\n    fprintf(stderr, \"       %s --version\\n\", prog);\n    exit(1);\n}\n\n\nstatic struct option options[] =\n{\n    { \"version\", 0, 0, 'V' },\n    { 0, 0, 0, 0 }\n};\n\n\nint\nmain(int argc, char **argv)\n{\n    srecord::progname_set(argv[0]);\n    for (;;)\n    {\n        int c = getopt_long(argc, argv, \"V\", options, 0);\n        switch (c)\n        {\n        case EOF:\n            break;\n\n        case 'V':\n            srecord::print_version();\n            return 0;\n\n        default:\n            usage();\n        }\n        break;\n    }\n    if (optind >= argc)\n        usage();\n    for (;;)\n    {\n        check(argv[optind]);\n        ++optind;\n        if (optind >= argc)\n            break;\n    }\n    if (number_of_errors > 0)\n    {\n        srecord::quit_default.fatal_error\n        (\n            \"found %d error%s\",\n            number_of_errors,\n            (number_of_errors == 1 ? \"\" : \"s\")\n        );\n    }\n    return 0;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test/url_decode/main.cc",
    "content": "//\n// srecord - Manipulate EPROM load files\n// Copyright (C) 2013 Peter Miller\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 3 of the License, or (at\n// your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n// General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n//\n\n#include <cctype>\n#include <cstdio>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <getopt.h>\n#include <string>\n\n#include <srecord/progname.h>\n#include <srecord/string.h>\n#include <srecord/versn_stamp.h>\n\n\nstatic void\nusage(void)\n{\n    const char *prog;\n\n    prog = srecord::progname_get();\n    fprintf(stderr, \"Usage: %s -decode [ <infile> [ <outfile> ]]\\n\", prog);\n    fprintf(stderr, \"       %s -encode [ <infile> [ <outfile> ]]\\n\", prog);\n    exit(EXIT_FAILURE);\n}\n\n\nstatic void\ntest_url_decode(void)\n{\n    for (;;)\n    {\n        char buf[1000];\n        if (!fgets(buf, sizeof(buf), stdin))\n            break;\n        size_t len = strlen(buf);\n        while (len > 0 && isspace((unsigned char)buf[len - 1]))\n            --len;\n        std::string s(buf, len);\n        printf(\"%s\\n\", srecord::string_url_decode(s).c_str());\n    }\n}\n\n\nstatic void\ntest_url_encode(void)\n{\n    for (;;)\n    {\n        char buf[1000];\n        if (!fgets(buf, sizeof(buf), stdin))\n            break;\n        size_t len = strlen(buf);\n        while (len > 0 && isspace((unsigned char)buf[len - 1]))\n            --len;\n        std::string s(buf, len);\n        printf(\"%s\\n\", srecord::string_url_encode(s).c_str());\n    }\n}\n\n\nint\nmain(int argc, char **argv)\n{\n    srecord::progname_set(argv[0]);\n    typedef void (*func_t)(void);\n    func_t func = NULL;\n    for (;;)\n    {\n        static const\n        struct option options[] =\n        {\n            { \"decode\", 0, 0, 'd' },\n            { \"encode\", 0, 0, 'e' },\n            { \"version\", 0, 0, 'V' },\n            { 0, 0, 0,0 }\n        };\n        int c = getopt_long(argc, argv, \"deV\", options, NULL);\n        if (c == -1)\n            break;\n\n        switch ((unsigned char)c)\n        {\n        case 'd':\n            func = test_url_decode;\n            break;\n\n        case 'e':\n            func = test_url_encode;\n            break;\n\n        case 'V':\n            srecord::print_version();\n            return EXIT_SUCCESS;\n\n        default:\n            fprintf(stderr, \"unknown '%c' option\\n\", c);\n            usage();\n            return EXIT_FAILURE;\n        }\n    }\n    if (!func)\n        usage();\n    switch (argc - optind)\n    {\n    case 0:\n        break;\n\n    case 2:\n        if (!freopen(argv[optind + 1], \"w\", stdout))\n        {\n            perror(argv[optind + 1]);\n            return EXIT_FAILURE;\n        }\n        // fall through...\n\n    case 1:\n        if (!freopen(argv[optind], \"r\", stdin))\n        {\n            perror(argv[optind]);\n            return EXIT_FAILURE;\n        }\n        break;\n\n    default:\n        usage();\n    }\n\n    (*func)();\n\n    return EXIT_SUCCESS;\n}\n\n\n// vim: set ts=8 sw=4 et :\n"
  },
  {
    "path": "tools/cc65/osic1p/srecord-1.64/test_hyphen/module.cook",
    "content": "/*\n * srecord - Manipulate EPROM load files\n * Copyright (C) 2010 Peter Miller\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or (at\n * your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nall += test_hyphen/.checked ;\n\nroff_files =\n    [sort\n        [match_mask %0%.man [source_files]]\n        [match_mask %0%.so [source_files]]\n        [match_mask man/%0%.1 [source_files]]\n        [match_mask man/%0%.3 [source_files]]\n        [match_mask man/%0%.5 [source_files]]\n    ]\n    ;\n\ntest_hyphen/.checked: [arch]/bin/test_hyphen [roff_files]\n{\n    [resolve [arch]/bin/test_hyphen] [resolve [roff_files]] ;\n}\n"
  },
  {
    "path": "tools/cc65/telestrat/mfmlib.h",
    "content": "/**********************************************************************************/\r\n/*                                                                                */\r\n/* MFM disk library routines v1.0                                                 */\r\n/*                                                                                */\r\n/* F.Frances 2/12/01                                                              */\r\n/*                                                                                */\r\n/**********************************************************************************/\r\n\r\n\r\nint open_disk(char *filename); /* parameter: disk image name (eg. \"sedoric.dsk\") */\r\nint close_disk();\t/* this is mandatory before leaving your program */\r\n\r\nint read_sector(char *sector_buf, int cylinder, int head, int sector);\r\nint write_sector(char *sector_buf, int cylinder, int head, int sector);\r\n\r\n\r\n/* All routines return the following error values */\r\n\r\n#define OK 0\r\n#define NO_OPENED_DISK 1\r\n#define DISK_ALREADY_OPENED 2\r\n#define CANNOT_OPEN_DISK 3\r\n#define INVALID_DISK 4\r\n#define TRACK_NOT_FOUND 5\r\n#define SECTOR_ID_NOT_FOUND 6\r\n#define SECTOR_DATA_NOT_FOUND 7\r\n"
  },
  {
    "path": "tools/cc65/telestrat/old2mfm.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\nFILE *fd;\r\nchar bigbuf[1024*1024];\r\nchar header[256];\r\nchar trackbuf[6400];\r\nint sides, tracks, sectors, geometry=1;\r\nint offset_first_id;\r\nint gap2;\r\nint gap3;\r\nchar old_signature[]=\"ORICDISK\";\r\nchar new_signature[]=\"MFM_DISK\";\r\n\r\n\r\nvoid init_track(int n)\r\n{\r\n\tint i,j,offset=0;\r\n\r\n\tfor (i=0;i<offset_first_id-12;i++) trackbuf[offset++]=0x4E;\r\n\tfor (j=0;j<n;j++) {\r\n\t\tfor (i=0;i<12;i++) trackbuf[offset++]=0;\r\n\t\tfor (i=0;i<3;i++) trackbuf[offset++]=0xA1;\r\n\t\ttrackbuf[offset++]=0xFE;\r\n\t\tfor (i=0;i<6;i++) offset++;\r\n/*                for (i=0;i<gap2-12;i++) trackbuf[offset++]=0x4E;\r\n*/ for (i=0;i<gap2-12;i++) trackbuf[offset++]=0x22;\r\n\t\tfor (i=0;i<12;i++) trackbuf[offset++]=0;\r\n\t\tfor (i=0;i<3;i++) trackbuf[offset++]=0xA1;\r\n\t\ttrackbuf[offset++]=0xFB;\r\n\t\tfor (i=0;i<258;i++) offset++;\r\n\t\tfor (i=0;i<gap3-12;i++) trackbuf[offset++]=0x4E;\r\n\t}\r\n\twhile (offset<6400) trackbuf[offset++]=0x4E;\r\n}\r\n\r\nunsigned int crctab[256] =\r\n{\r\n\t0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,\r\n\t0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\r\n\t0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,\r\n\t0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\r\n\t0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,\r\n\t0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\r\n\t0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,\r\n\t0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\r\n\t0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n\t0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\r\n\t0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, \r\n\t0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, \r\n\t0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, \r\n\t0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, \r\n\t0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,\r\n\t0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, \r\n\t0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,\r\n\t0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, \r\n\t0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,\r\n\t0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\r\n\t0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,\r\n\t0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\r\n\t0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,\r\n\t0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n\t0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,\r\n\t0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\r\n\t0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,\r\n\t0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\r\n\t0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,\r\n\t0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\r\n\t0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\r\n\t0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\r\n};\r\n\t\r\nvoid compute_crc(unsigned char *ptr,int count)\r\n{\r\n\tint i;\r\n\tunsigned short crc=0xFFFF,byte;\r\n\tfor (i=0;i<count;i++) {\r\n\t\tbyte= *ptr++;\r\n\t\tcrc=(crc<<8)^crctab[(crc>>8)^byte];\r\n\t}\r\n\t*ptr++=crc>>8;\r\n\t*ptr++=crc&0xFF;\r\n}\r\n\r\n\r\n\r\nint main(int argc,char *argv[])\r\n{\r\n        int i,s,t,offset;\r\n\r\n        printf(\"Old -> MFM v1.2\\n\");\r\n\tif (argc!=2) {\r\n\t\tprintf(\"Usage: oric2mfm <diskimage>\\n\");\r\n\t\tprintf(\"(converts old Euphoric disk image format to new MFM format)\\n\");\r\n\t\texit(1);\r\n\t}\r\n\tfd=fopen(argv[1],\"r+b\");\r\n\tif (fd==NULL) {\r\n\t\tprintf(\"Unable to open %s for read/write operation\\n\",argv[1]);\r\n\t\texit(1);\r\n\t}\r\n\tfread(header,8,1,fd);\r\n\tif (strncmp(header,old_signature,8)!=0) {\r\n\t\tprintf(\"%s is not an old disk image\\n\",argv[1]);\r\n\t\texit(1);\r\n\t}\r\n\tfread(&sides,1,4,fd); fread(&tracks,1,4,fd); fread(&sectors,1,4,fd);\r\n\tfread(header+20,256-20,1,fd);\r\n\tfread(bigbuf,sides*tracks*sectors,256,fd);\r\n\tfseek(fd,0,SEEK_SET);\r\n\r\n        switch (sectors) {\r\n                case 15: case 16: case 17:\r\n                        offset_first_id=72; gap2=34; gap3=50;\r\n                        break;\r\n                case 18:\r\n                        offset_first_id=12; gap2=34; gap3=46;\r\n                        break;\r\n\t\t\tcase 19:\r\n\t\t\t\t  offset_first_id=36; gap2=34; gap3=20;\r\n\t\t\t\t  break;\r\n                default:\r\n                        printf(\"unrealistic sectors per track number\\n\");\r\n                        exit(1);\r\n        }\r\n\tinit_track(sectors);\r\n\r\n\tfwrite(new_signature,8,1,fd);\r\n\tfwrite(&sides,1,4,fd); fwrite(&tracks,1,4,fd); fwrite(&geometry,1,4,fd);\r\n\tfwrite(header+20,256-20,1,fd);\r\n\r\n\tfor(s=0;s<sides;s++)\r\n\t  for(t=0;t<tracks;t++) {\r\n            offset=offset_first_id;\r\n\t    for(i=0;i<sectors;i++) {\r\n              trackbuf[offset+4]=t;\r\n              trackbuf[offset+5]=s;\r\n              trackbuf[offset+6]=i+1;\r\n              trackbuf[offset+7]=1;\r\n              compute_crc(trackbuf+offset,4+4);\r\n              offset+=4+6;\r\n              offset+=gap2;\r\n              memcpy(trackbuf+offset+4,bigbuf+((s*tracks+t)*sectors+i)*256,256);\r\n              compute_crc(trackbuf+offset,4+256);\r\n              offset+=256+6;\r\n              offset+=gap3;\r\n\t    }\r\n\t    fwrite(trackbuf,6400,1,fd);\r\n\t  }\r\n\treturn 0;\r\n}\r\n"
  },
  {
    "path": "tools/cc65/telestrat/sedoric3.h",
    "content": "\r\n\r\n\t0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n\t0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x53,0x45,0x44,0x4F,0x52,0x49,0x43,0x20,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n\t0x53,0x45,0x44,0x4F,0x52,0x49,0x43,0x20,0x56,0x33,0x2E,0x30,0x30,0x36,0x20,0x30,\r\n\t0x31,0x2F,0x30,0x31,0x2F,0x39,0x36,0x0D,0x0A,0x55,0x70,0x67,0x72,0x61,0x64,0x65,\r\n\t0x64,0x20,0x62,0x79,0x20,0x52,0x61,0x79,0x20,0x4D,0x63,0x4C,0x61,0x75,0x67,0x68,\r\n\t0x6C,0x69,0x6E,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0D,0x0A,0x61,0x6E,\r\n\t0x64,0x20,0x41,0x6E,0x64,0x72,0x7B,0x20,0x43,0x68,0x7B,0x72,0x61,0x6D,0x79,0x20,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0D,0x0A,0x0D,0x0A,\r\n\t0x53,0x65,0x65,0x20,0x53,0x45,0x44,0x4F,0x52,0x49,0x43,0x33,0x2E,0x46,0x49,0x58,\r\n\t0x20,0x66,0x69,0x6C,0x65,0x20,0x66,0x6F,0x72,0x20,0x69,0x6E,0x66,0x6F,0x72,0x6D,\r\n\t0x61,0x74,0x69,0x6F,0x6E,0x20,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n\r\n\t0x00,0x00,0xFF,0x00,0xD0,0x9F,0xD0,0x9F,0x02,0xB9,0x01,0x00,0xFF,0x00,0x00,0xB9,\r\n\t0xE4,0xB9,0x00,0x00,0xE6,0x12,0x00,0x78,0xA9,0x7F,0x8D,0x0E,0x03,0xA9,0x10,0xA0,\r\n\t0x07,0x8D,0x6B,0x02,0x8C,0x6C,0x02,0xA9,0x86,0x8D,0x14,0x03,0xA9,0xBA,0xA0,0xB9,\r\n\t0x20,0x1A,0x00,0xA9,0x84,0x8D,0x14,0x03,0xA2,0x02,0xBD,0xFD,0xCC,0x9D,0xF7,0xCC,\r\n\t0xCA,0x10,0xF7,0xA2,0x37,0xA0,0x80,0xA9,0x00,0x18,0x79,0x00,0xC9,0xC8,0xD0,0xF9,\r\n\t0xEE,0x37,0xB9,0xCA,0xD0,0xF3,0xA2,0x04,0xA8,0xF0,0x08,0xAD,0x01,0xB9,0xA8,0xD0,\r\n\t0x02,0xA2,0x3C,0x84,0x00,0xA9,0x7B,0xA0,0xB9,0x8D,0xFE,0xFF,0x8C,0xFF,0xFF,0xA9,\r\n\t0x05,0x8D,0x12,0x03,0xA9,0x85,0x8D,0x14,0x03,0xA9,0x88,0x8D,0x10,0x03,0xA0,0x00,\r\n\t0x58,0xAD,0x18,0x03,0x30,0xFB,0xAD,0x13,0x03,0x99,0x00,0xC4,0xC8,0x4C,0x6C,0xB9,\r\n\t0xA9,0x84,0x8D,0x14,0x03,0x68,0x68,0x68,0xAD,0x10,0x03,0x29,0x1C,0xD0,0xD5,0xEE,\r\n\t0x76,0xB9,0xEE,0x12,0x03,0xCA,0xF0,0x1F,0xAD,0x12,0x03,0xCD,0x00,0xB9,0xD0,0xC1,\r\n\t0xA9,0x58,0x8D,0x10,0x03,0xA0,0x03,0x88,0xD0,0xFD,0xAD,0x10,0x03,0x4A,0xB0,0xFA,\r\n\t0xA9,0x01,0x8D,0x12,0x03,0xD0,0xAA,0xA9,0xC0,0x8D,0x0E,0x03,0x4C,0x00,0xC4,0x0C,\r\n\t0x11,0x53,0x45,0x44,0x4F,0x52,0x49,0x43,0x20,0x56,0x33,0x2E,0x30,0x0A,0x0D,0x60,\r\n\t0x20,0x31,0x39,0x38,0x35,0x20,0x4F,0x52,0x49,0x43,0x20,0x49,0x4E,0x54,0x45,0x52,\r\n\t0x4E,0x41,0x54,0x49,0x4F,0x4E,0x41,0x4C,0x0D,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0x02,0x53,0x59,0x53,0x54,0x45,0x4D,0x44,0x4F,0x53,0x01,0x00,0x02,0x00,\r\n\t0x02,0x00,0x00,0x42,0x4F,0x4F,0x54,0x55,0x50,0x43,0x4F,0x4D,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0x14,0xFF,0x4F,0x00,0x00,0x3C,0x00,0x00,0x05,0x00,0x06,\r\n\t0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0A,0x00,0x0B,0x00,0x0C,0x00,0x0D,0x00,0x0E,\r\n\t0x00,0x0F,0x00,0x10,0x00,0x11,0x01,0x01,0x01,0x02,0x01,0x03,0x01,0x04,0x01,0x05,\r\n\t0x01,0x06,0x01,0x07,0x01,0x08,0x01,0x09,0x01,0x0A,0x01,0x0B,0x01,0x0C,0x01,0x0D,\r\n\t0x01,0x0E,0x01,0x0F,0x01,0x10,0x01,0x11,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,\r\n\t0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0A,0x02,0x0B,0x02,0x0C,\r\n\t0x02,0x0D,0x02,0x0E,0x02,0x0F,0x02,0x10,0x02,0x11,0x03,0x01,0x03,0x02,0x03,0x03,\r\n\t0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0A,0x03,0x0B,\r\n\t0x03,0x0C,0x03,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0xAD,0x07,0xC0,0x4A,0xA9,0x00,0x6A,0x8D,0x24,0xC0,0x10,0x0F,0xA9,0x50,0x8D,0x56,\r\n\t0x02,0x4A,0x85,0x31,0x85,0x32,0x8D,0x57,0x02,0xD0,0x06,0xA9,0x5D,0x85,0x31,0x85,\r\n\t0x32,0xEE,0xC1,0x02,0xEE,0xC2,0x02,0xA2,0x00,0xBD,0x00,0xC6,0x2C,0x24,0xC0,0x10,\r\n\t0x03,0xBD,0x00,0xC7,0x9D,0x00,0x04,0xE8,0xD0,0xEF,0xA9,0x4C,0xA0,0x00,0xA2,0x04,\r\n\t0x85,0xEF,0x84,0xF0,0x86,0xF1,0xA9,0x88,0xA0,0xC4,0x2C,0x24,0xC0,0x10,0x26,0x8D,\r\n\t0x45,0x02,0x8E,0x46,0x02,0x8C,0x48,0x02,0x8E,0x49,0x02,0xA9,0x5B,0x8D,0x3C,0x02,\r\n\t0x8E,0x3D,0x02,0xA9,0x09,0xA0,0x01,0x8D,0x4E,0x02,0x8C,0x4F,0x02,0xA9,0x0F,0xA2,\r\n\t0x70,0xA0,0xD0,0xD0,0x12,0x8D,0x29,0x02,0x8E,0x2A,0x02,0x8C,0x2C,0x02,0x8E,0x2D,\r\n\t0x02,0xA9,0x07,0xA2,0xE4,0xA0,0xCF,0x8D,0x6A,0x02,0x8E,0xF9,0x02,0x8C,0xFA,0x02,\r\n\t0xA2,0x04,0xA9,0xA5,0xA0,0xD0,0x8D,0xFE,0xFF,0x8C,0xFF,0xFF,0xA9,0x67,0xA0,0x61,\r\n\t0x8D,0xF5,0x02,0x8E,0xF6,0x02,0x8C,0xFC,0x02,0x8E,0xFD,0x02,0xA9,0x00,0x8D,0x09,\r\n\t0xC0,0x8D,0x0A,0xC0,0x8D,0x0B,0xC0,0x8D,0x0C,0xC0,0x8D,0x15,0xC0,0x8D,0x18,0xC0,\r\n\t0x8D,0xDF,0x02,0x8D,0x48,0xC0,0x85,0x87,0xA9,0x85,0xA0,0xD6,0x8D,0x1D,0xC0,0x8C,\r\n\t0x1E,0xC0,0xAD,0x11,0x03,0x8D,0x0C,0xC0,0xA9,0x23,0xA0,0xDE,0xA2,0x80,0x8D,0x66,\r\n\t0xC0,0x8C,0x67,0xC0,0x8E,0x68,0xC0,0x8D,0x69,0xC0,0x8C,0x6A,0xC0,0x8E,0x6B,0xC0,\r\n\t0x8D,0x6C,0xC0,0x8C,0x6D,0xC0,0x8E,0x6E,0xC0,0x8D,0x6F,0xC0,0x8C,0x70,0xC0,0x8E,\r\n\r\n\t0x71,0xC0,0xA9,0x2E,0x8D,0x75,0xC0,0xA9,0x1A,0xA0,0x00,0x8D,0xF0,0x04,0x8C,0xF1,\r\n\t0x04,0xA5,0x00,0xF0,0x12,0xA2,0xFF,0xE8,0xBD,0x74,0xC5,0x9D,0x00,0xB9,0xD0,0xF7,\r\n\t0xA9,0x00,0xA0,0xB9,0x20,0xEC,0x04,0xA9,0x14,0xA0,0x01,0x20,0x5D,0xDA,0xA2,0x08,\r\n\t0xBD,0x00,0xC1,0x9D,0x39,0xC0,0xE0,0x05,0x90,0x03,0x9D,0x3D,0xC0,0xCA,0x10,0xF0,\r\n\t0x20,0xA3,0xEB,0x20,0xD8,0xD5,0xE0,0xF7,0x16,0xF8,0xA2,0x41,0xBD,0x1E,0xC1,0x95,\r\n\t0x36,0xCA,0x10,0xF8,0xA9,0x3A,0x85,0x35,0x20,0x06,0xD2,0xA9,0xBD,0xA0,0xC4,0x2C,\r\n\t0x24,0xC0,0x30,0x02,0xA9,0xCD,0x8D,0xF0,0x04,0x8C,0xF1,0x04,0xA2,0x34,0xA0,0x00,\r\n\t0x58,0x4C,0x71,0x04,0x0A,0x8C,0x81,0x2A,0x2A,0x20,0x57,0x41,0x52,0x4E,0x49,0x4E,\r\n\t0x47,0x20,0x2A,0x2A,0x88,0x87,0x44,0x4F,0x53,0x20,0x69,0x73,0x20,0x61,0x6C,0x74,\r\n\t0x65,0x72,0x65,0x64,0x20,0x21,0x0D,0x0A,0x00,0x4C,0x64,0xD3,0x60,0xAD,0xAE,0xC5,\r\n\t0xAE,0xAF,0xC5,0x8D,0x01,0xC0,0x8E,0x02,0xC0,0xAD,0xB0,0xC5,0xD0,0xDB,0x27,0x09,\r\n\t0x1A,0x49,0x4E,0x20,0x44,0x52,0x49,0x56,0x45,0xA0,0x4C,0x4F,0x41,0x44,0x20,0x44,\r\n\t0x49,0x53,0x43,0x53,0x20,0x46,0x4F,0x52,0x20,0x42,0x41,0x43,0x4B,0x55,0x50,0x20,\r\n\t0x46,0x52,0x4F,0x4D,0xA0,0x20,0x54,0x4F,0xA0,0x0D,0x0A,0x4C,0x4F,0x41,0x44,0x20,\r\n\t0x53,0x4F,0x55,0x52,0x43,0x45,0x20,0x44,0x49,0x53,0x43,0xA0,0x0D,0x0A,0x4C,0x4F,\r\n\t0x41,0x44,0x20,0x54,0x41,0x52,0x47,0x45,0x54,0x20,0x44,0x49,0x53,0x41,0x2D,0x2B,\r\n\r\n\t0xC9,0x30,0x90,0x04,0xC9,0x3A,0x90,0x35,0x86,0x0F,0xAA,0x30,0x2E,0x85,0xC1,0x68,\r\n\t0xAA,0x68,0x48,0xE0,0xF7,0xD0,0x04,0xC9,0xC8,0xF0,0x09,0xE0,0x58,0xD0,0x18,0xC9,\r\n\t0xCA,0xD0,0x14,0x24,0x18,0x6E,0xFC,0x04,0xA0,0xFF,0xC8,0xB1,0xE9,0xF0,0x11,0xC9,\r\n\t0x3A,0xF0,0x0D,0xC9,0xD4,0xD0,0xF3,0x8A,0x48,0xA5,0xC1,0xA6,0x0F,0x4C,0x41,0xEA,\r\n\t0x68,0x20,0xE9,0x04,0x20,0x67,0x04,0x0E,0xFC,0x04,0xB0,0x03,0x4C,0xAD,0xC8,0xEA,\r\n\t0xEA,0xEA,0x60,0x20,0x77,0x04,0xB1,0x16,0x4C,0x77,0x04,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xA9,0x8E,0xA0,0xF8,0xD0,0x04,0xA9,0xAE,0xA0,0xD3,0x8D,0xF0,0x04,0x8C,0xF1,\r\n\t0x04,0x20,0x77,0x04,0x20,0xEF,0x04,0x08,0x48,0x78,0xAD,0xFB,0x04,0x49,0x02,0x8D,\r\n\t0xFB,0x04,0x8D,0x14,0x03,0x68,0x28,0x60,0x2C,0x0D,0x03,0x50,0x0F,0x48,0xA9,0x04,\r\n\t0x2D,0x6A,0x02,0xF0,0x03,0xEE,0x74,0x02,0x68,0x4C,0x03,0xEC,0x68,0x68,0x85,0xF2,\r\n\t0x68,0xAA,0xA9,0x36,0xA0,0xD1,0xD0,0xC3,0x20,0xF2,0x04,0x68,0x40,0x8D,0x14,0x03,\r\n\t0x6C,0xFC,0xFF,0x18,0x20,0x77,0x04,0x48,0xA9,0x04,0x48,0xA9,0xA8,0x48,0x08,0xB0,\r\n\t0x03,0x4C,0x28,0x02,0x20,0x88,0xF8,0xA9,0x17,0xA0,0xEC,0x20,0x6B,0x04,0x4C,0x75,\r\n\t0xC4,0xA9,0x04,0x48,0xA9,0xF1,0x48,0x8A,0x48,0x98,0x48,0x20,0xF2,0x04,0x4C,0x70,\r\n\t0xD2,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0x4C,0x87,0x04,0x4C,0x71,0x04,0x4C,\r\n\t0x00,0x00,0x4C,0x77,0x04,0x4C,0xB3,0x04,0x4C,0xB4,0x04,0x84,0x00,0x00,0x00,0x00,\r\n\r\n\t0xC9,0x30,0x90,0x04,0xC9,0x3A,0x90,0x35,0x86,0x0F,0xAA,0x30,0x2E,0x85,0xC1,0x68,\r\n\t0xAA,0x68,0x48,0xE0,0x0E,0xD0,0x04,0xC9,0xC9,0xF0,0x09,0xE0,0x8A,0xD0,0x18,0xC9,\r\n\t0xCA,0xD0,0x14,0x24,0x18,0x6E,0xFC,0x04,0xA0,0xFF,0xC8,0xB1,0xE9,0xF0,0x11,0xC9,\r\n\t0x3A,0xF0,0x0D,0xC9,0xD4,0xD0,0xF3,0x8A,0x48,0xA5,0xC1,0xA6,0x0F,0x4C,0xB9,0xEC,\r\n\t0x68,0x20,0xE9,0x04,0x20,0x67,0x04,0x0E,0xFC,0x04,0xB0,0x03,0x4C,0xC1,0xC8,0x6E,\r\n\t0x52,0x02,0x60,0x20,0x77,0x04,0xB1,0x16,0x4C,0x77,0x04,0xA9,0x45,0xA0,0xD8,0xD0,\r\n\t0x0A,0xA9,0x8E,0xA0,0xF8,0xD0,0x04,0xA9,0xAE,0xA0,0xD3,0x8D,0xF0,0x04,0x8C,0xF1,\r\n\t0x04,0x20,0x77,0x04,0x20,0xEF,0x04,0x08,0x48,0x78,0xAD,0xFB,0x04,0x49,0x02,0x8D,\r\n\t0xFB,0x04,0x8D,0x14,0x03,0x68,0x28,0x60,0x2C,0x0D,0x03,0x50,0x0F,0x48,0xA9,0x04,\r\n\t0x2D,0x6A,0x02,0xF0,0x03,0xEE,0x74,0x02,0x68,0x4C,0x22,0xEE,0x68,0x68,0x85,0xF2,\r\n\t0x68,0xAA,0xA9,0x36,0xA0,0xD1,0xD0,0xC3,0x20,0xF2,0x04,0x68,0x40,0x8D,0x14,0x03,\r\n\t0x6C,0xFC,0xFF,0x18,0x20,0x77,0x04,0x48,0xA9,0x04,0x48,0xA9,0xA8,0x48,0x08,0xB0,\r\n\t0x03,0x4C,0x44,0x02,0x20,0xB8,0xF8,0xA9,0x17,0xA0,0xEC,0x20,0x6B,0x04,0x4C,0x71,\r\n\t0xC4,0xA9,0x04,0x48,0xA9,0xF1,0x48,0x8A,0x48,0x98,0x48,0x20,0xF2,0x04,0x4C,0x06,\r\n\t0xD3,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0x4C,0x87,0x04,0x4C,0x71,0x04,0x4C,\r\n\t0x00,0x00,0x4C,0x77,0x04,0x4C,0xB3,0x04,0x4C,0xB4,0x04,0x84,0x00,0x00,0x00,0x00,\r\n\r\n\t0x07,0x45,0x57,0x4B,0x00,0x18,0x07,0x08,0x59,0x7B,0x06,0x09,0x00,0x42,0x41,0x52,\r\n\t0x05,0x66,0x25,0x00,0x00,0x5B,0x27,0x00,0x1B,0x3F,0x04,0x0A,0x00,0x5E,0x3D,0x0D,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x22,0xFF,\r\n\t0x6D,0x62,0x02,0x0C,0x00,0x0F,0x72,0x00,0x03,0x31,0x29,0x00,0x00,0x0E,0x1E,0x0B,\r\n\t0x17,0xB2,0xA8,0xF1,0x00,0x8C,0xA6,0x18,0x90,0xC9,0x16,0x19,0x00,0x92,0xA2,0xBC,\r\n\t0x15,0x9C,0xCA,0x00,0x00,0xD2,0x9B,0x10,0xEB,0x8D,0x14,0x1A,0x00,0x87,0xC8,0x1D,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0xA5,0x00,0x00,0x00,0xD1,0xFF,\r\n\t0xA4,0x9A,0x12,0x1C,0x00,0x1F,0xCB,0x00,0x13,0x91,0xED,0x00,0x00,0x1E,0xB5,0x1B,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4F,0x4B,0x45,0x23,0x32,0x46,0x35,0x2C,0xA3,\r\n\t0x20,0x20,0x44,0x4F,0x4B,0x45,0x23,0x32,0x46,0x35,0x2C,0x23,0x34,0x36,0x37,0x8D,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4F,0x4B,0x45,0x23,0x32,0x46,0x39,0x2C,0xA3,\r\n\t0x20,0x44,0x4F,0x4B,0x45,0x23,0x32,0x46,0x39,0x2C,0x23,0x44,0x30,0x37,0x30,0x8D,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4F,0x4B,0x45,0x23,0x32,0x46,0x43,0x2C,0xA3,\r\n\t0x20,0x20,0x44,0x4F,0x4B,0x45,0x23,0x32,0x46,0x43,0x2C,0x23,0x34,0x36,0x31,0x8D,\r\n\t0x20,0x20,0x20,0x20,0x50,0x41,0x50,0x45,0x52,0x30,0x3A,0x49,0x4E,0x4B,0x37,0x8D,\r\n\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x41,0x4C,0x4C,0x23,0x46,0x38,0x44,0x30,0x8D,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFE,\r\n\t0x20,0x20,0x20,0x20,0x3F,0x48,0x45,0x58,0x24,0x28,0x50,0x45,0x45,0x4B,0x28,0xA3,\r\n\t0x20,0x20,0x20,0x20,0x3F,0x48,0x45,0x58,0x24,0x28,0x44,0x45,0x45,0x4B,0x28,0xA3,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x50,0x45,0x45,0x4B,0x28,0xA3,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x45,0x45,0x4B,0x28,0xA3,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x50,0x4F,0x4B,0x45,0xA3,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4F,0x4B,0x45,0xA3,\r\n\t0x48,0x45,0x58,0x24,0xA8,0x43,0x41,0x4C,0x4C,0xA3,0x54,0x45,0x58,0x54,0x8D,0x46,\r\n\t0x4F,0x52,0x49,0x3D,0x31,0x54,0xCF,0x4C,0x45,0x46,0x54,0x24,0xA8,0x4D,0x49,0x44,\r\n\t0x24,0xA8,0x52,0x49,0x47,0x48,0x54,0x24,0xA8,0x53,0x54,0x52,0x24,0xA8,0x55,0x4E,\r\n\t0x50,0x52,0x4F,0x54,0x8D,0xE0,0x55,0x53,0x49,0x4E,0xC7,0x56,0x49,0x45,0x57,0x48,\r\n\t0x49,0x52,0x45,0x53,0xA2,0x56,0x55,0x53,0x45,0x52,0x8D,0x57,0x49,0x44,0x54,0xC8,\r\n\t0x57,0x49,0x4E,0x44,0x4F,0xD7,0x21,0x52,0x45,0x53,0x54,0x4F,0x52,0xC5,0x50,0x50,\r\n\t0x80,0x00,0x50,0x50,0x45,0x4E,0x44,0x00,0x5A,0x45,0x52,0x54,0x59,0x00,0x43,0x43,\r\n\t0x45,0x4E,0x54,0x00,0x4F,0x58,0x00,0x41,0x43,0x4B,0x55,0x50,0x00,0x55,0x49,0x4C,\r\n\r\n\t0x44,0x00,0x48,0x41,0x4E,0x47,0x45,0x00,0x4C,0x4F,0x53,0x45,0x00,0x4F,0x50,0x59,\r\n\t0x00,0x52,0x45,0x41,0x54,0x45,0x57,0x00,0x52,0x45,0x53,0x45,0x43,0x00,0x48,0x4B,\r\n\t0x53,0x55,0x4D,0x00,0x45,0x96,0x45,0x00,0x45,0x53,0x54,0x52,0x4F,0x59,0x00,0x45,\r\n\t0x4C,0x42,0x41,0x4B,0x00,0x45,0x4C,0x00,0x49,0x52,0x00,0x54,0x52,0x41,0x43,0x4B,\r\n\t0x00,0x4E,0x55,0x4D,0x00,0x4E,0x41,0x4D,0x45,0x00,0x4B,0x45,0x59,0x00,0x53,0x59,\r\n\t0x53,0x00,0x54,0x52,0x41,0x43,0x4B,0x00,0x52,0x52,0x97,0x00,0x52,0x52,0x47,0x4F,\r\n\t0x54,0x4F,0x00,0x52,0x52,0x4F,0x52,0x00,0x52,0x52,0xD2,0x00,0x52,0x52,0x00,0x53,\r\n\t0x41,0x56,0x45,0x00,0x58,0x54,0x00,0x49,0x45,0x4C,0x44,0x00,0x52,0x53,0x45,0x43,\r\n\t0x00,0x43,0x55,0x52,0x00,0x4E,0x49,0x54,0x00,0x4E,0x53,0x54,0x52,0x00,0x4E,0x49,\r\n\t0x53,0x54,0x00,0x55,0x4D,0x50,0x00,0x45,0x59,0x99,0x00,0x45,0x59,0x49,0x46,0x00,\r\n\t0x45,0x59,0x55,0x53,0x45,0x00,0x45,0x59,0x44,0x45,0x46,0x00,0x45,0x59,0xB8,0x00,\r\n\t0x45,0x59,0x53,0x41,0x56,0x45,0x00,0x45,0x59,0x00,0x49,0x4E,0x45,0x00,0x53,0x45,\r\n\t0x54,0x00,0x55,0x53,0x49,0x4E,0x47,0x00,0x55,0xE3,0x47,0x00,0x92,0x00,0x49,0x4E,\r\n\t0x50,0x55,0x54,0x00,0x4F,0x41,0x44,0x00,0x44,0x49,0x52,0x00,0x54,0x59,0x50,0x45,\r\n\t0x00,0x43,0x55,0x52,0x00,0x4F,0x56,0x45,0x00,0x45,0x52,0x47,0x45,0x00,0x55,0x4D,\r\n\t0x00,0x55,0x54,0x00,0x4C,0x44,0x00,0x50,0x45,0x4E,0x00,0x55,0x54,0x00,0x52,0x4F,\r\n\r\n\t0x54,0x00,0x52,0x00,0x4D,0x41,0x50,0x00,0x55,0x49,0x54,0x00,0x57,0x45,0x52,0x54,\r\n\t0x59,0x00,0x45,0x53,0x55,0x4D,0x45,0x00,0x53,0x45,0x54,0x00,0x45,0x57,0x49,0x4E,\r\n\t0x44,0x00,0x45,0x4E,0x55,0x4D,0x00,0x45,0x4E,0x00,0xD1,0x4F,0x4D,0x00,0x41,0x4E,\r\n\t0x44,0x4F,0x4D,0x00,0x45,0x53,0x54,0x4F,0x52,0x45,0x00,0x45,0x53,0x45,0x54,0x00,\r\n\t0x57,0x41,0x50,0x00,0x45,0x45,0x4B,0x00,0x54,0x52,0x55,0x4E,0x00,0x54,0x98,0x00,\r\n\t0x59,0x53,0x54,0x45,0x4D,0x00,0x54,0x41,0x54,0x55,0x53,0x00,0x41,0x56,0x45,0x55,\r\n\t0x00,0x41,0x56,0x45,0x4D,0x00,0x41,0x56,0x45,0x4F,0x00,0x41,0x56,0x45,0x00,0x45,\r\n\t0x41,0x52,0x43,0x48,0x00,0x59,0x53,0x00,0x4D,0x41,0x50,0x00,0x4B,0x45,0x4E,0x00,\r\n\t0x41,0x4B,0x45,0x00,0x59,0x50,0x45,0x00,0x52,0x41,0x43,0x4B,0x00,0x53,0x45,0x52,\r\n\t0x00,0x4E,0x54,0x4B,0x45,0x4E,0x00,0xE3,0x47,0x00,0x4E,0x50,0x52,0x4F,0x54,0x00,\r\n\t0x49,0x45,0x57,0xA2,0x00,0x55,0x53,0x45,0x52,0x00,0x49,0x44,0x54,0x48,0x00,0x49,\r\n\t0x4E,0x44,0x4F,0x57,0x00,0x9A,0x00,0x5D,0x00,0xFF,0x00,0xDE,0xC9,0x00,0x04,0xF4,\r\n\t0xC9,0x04,0x03,0x02,0xCA,0x07,0x06,0x24,0xCA,0x0D,0x0B,0x58,0xCA,0x18,0x07,0x77,\r\n\t0xCA,0x1F,0x02,0xCC,0xCC,0x21,0x00,0x81,0xCA,0x21,0x01,0x85,0xCA,0x22,0x03,0x93,\r\n\t0xCA,0x25,0x01,0x97,0xCA,0x26,0x07,0xBA,0xCA,0x2D,0x0A,0xE5,0xCA,0x37,0x02,0xEE,\r\n\t0xCA,0x39,0x01,0xF1,0xCA,0x3A,0x03,0xFB,0xCA,0x3D,0x04,0x08,0xCB,0x41,0x02,0x12,\r\n\r\n\t0xCB,0x43,0x09,0x40,0xCB,0x4C,0x0D,0x7C,0xCB,0x59,0x04,0x8D,0xCB,0x5D,0x04,0xA0,\r\n\t0xCB,0x61,0x02,0xAA,0xCB,0x63,0x02,0xCC,0xCC,0x65,0x00,0xCC,0xCC,0x65,0x00,0xCC,\r\n\t0xCC,0x65,0x00,0xB5,0xCB,0x65,0x03,0x06,0xFE,0x06,0xFE,0xDD,0xEB,0x90,0xEB,0xDD,\r\n\t0xF0,0x50,0xF1,0xDF,0xFE,0x47,0xF1,0x8C,0xFB,0x56,0xF1,0x4C,0xDE,0xBB,0xF9,0xFE,\r\n\t0xE9,0x41,0xF1,0x43,0xE4,0x36,0xE4,0x45,0xE4,0x43,0xE3,0x38,0xF1,0x29,0xF1,0x44,\r\n\t0xF1,0x23,0xF1,0x26,0xF1,0x38,0xF1,0x98,0xE9,0x98,0xE9,0xAF,0xE9,0xAF,0xE9,0x7E,\r\n\t0xE9,0xDF,0xDD,0xEC,0xE9,0xBE,0xFB,0x9B,0xF9,0xF4,0xEB,0x68,0xF1,0x2D,0xEC,0x2C,\r\n\t0xF1,0x11,0xFE,0x1F,0xDA,0x1F,0xDA,0xAF,0xD9,0xFC,0xD9,0xFC,0xD9,0xCC,0xDD,0x0A,\r\n\t0xE7,0x78,0xF0,0x72,0xFC,0x35,0xF0,0x35,0xF0,0x93,0xEC,0x93,0xEC,0xF6,0xDF,0xCF,\r\n\t0xE7,0x94,0xFE,0xEB,0xEB,0x35,0xF1,0x3B,0xF1,0x24,0xEB,0x1E,0xE7,0xAE,0xE0,0x4F,\r\n\t0xFA,0xCA,0xF9,0xF5,0xE9,0xBF,0xE7,0x8F,0xF9,0xF4,0xE7,0xE0,0xEB,0xBA,0xE9,0x74,\r\n\t0xFC,0xBA,0xFA,0x4D,0xF1,0x36,0xE5,0x95,0xE7,0x95,0xE7,0xD8,0xE7,0xB7,0xE7,0x3A,\r\n\t0xEA,0x53,0xF1,0x52,0xE8,0x52,0xE8,0xFB,0xE9,0xF2,0xE9,0x4C,0xDD,0x49,0xDD,0x52,\r\n\t0xDD,0x4F,0xDD,0xFB,0xE5,0x59,0xF1,0x95,0xF9,0x9C,0xE8,0xDE,0xF8,0x97,0xFE,0x2F,\r\n\t0xF1,0x7E,0xEA,0xE0,0xE8,0x98,0xEE,0xF8,0xE9,0xEF,0xE9,0x20,0xF1,0x3F,0xE7,0x0F,\r\n\t0xF2,0xD8,0xE7,0x03,0xEC,0x3D,0xE8,0x43,0x4F,0x4D,0x42,0x41,0x4B,0x43,0x4F,0x4D,\r\n\r\n\t0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x42,0x41,0x4B,0x28,0x50,0x35,0x5D,\r\n\t0x00,0x00,0x01,0x01,0xFA,0xBF,0x23,0x34,0x36,0x37,0xFF,0x7B,0x0E,0xFA,0x35,0x10,\r\n\t0x81,0xC9,0x0F,0xDA,0xA2,0xC6,0xC9,0x88,0x02,0x88,0x02,0x4F,0x46,0x46,0x53,0x45,\r\n\t0x54,0xC7,0x81,0xC2,0x82,0x45,0xD3,0x66,0xA5,0xC8,0xA3,0x8F,0xD2,0x42,0xB5,0x98,\r\n\t0xE0,0xB1,0xBE,0xAE,0xAA,0x82,0x93,0xAE,0xAA,0xB1,0xBE,0x93,0x82,0x40,0x10,0x08,\r\n\t0x1C,0x02,0x1E,0x22,0x1E,0x00,0x5C,0x00,0x00,0x1E,0x20,0x20,0x20,0x1E,0x04,0x7B,\r\n\t0x04,0x08,0x1C,0x22,0x3E,0x20,0x1E,0x00,0x7C,0x10,0x08,0x22,0x22,0x22,0x26,0x1A,\r\n\t0x00,0x7D,0x10,0x08,0x1C,0x22,0x3E,0x20,0x1E,0x00,0x7E,0x1C,0x22,0x1C,0x22,0x3E,\r\n\t0x20,0x1E,0x00,0x41,0x58,0x59,0x50,0xB8,0x0A,0x64,0xE8,0x10,0x00,0x00,0x03,0x27,\r\n\t0x84,0xA4,0xC4,0xE4,0x45,0x4E,0x45,0x4C,0x49,0x4E,0x4F,0x4D,0x53,0x4B,0x46,0x54,\r\n\t0x45,0x4F,0x52,0x41,0x52,0x58,0x52,0x59,0x52,0x50,0x45,0x46,0x53,0x54,0x45,0x44,\r\n\t0x45,0x58,0x43,0x58,0x43,0x59,0x46,0x50,0x46,0x53,0x53,0x43,0x4A,0x4B,0x45,0x46,\r\n\t0x49,0x4C,0x45,0x20,0x4E,0x4F,0x54,0x20,0x46,0x4F,0x55,0x4E,0xC4,0x44,0x52,0x49,\r\n\t0x56,0x45,0x20,0x4E,0x4F,0x54,0x20,0x49,0x4E,0x20,0x4C,0x49,0x4E,0xC5,0x49,0x4E,\r\n\t0x56,0x41,0x4C,0x49,0x44,0x20,0x46,0x49,0x4C,0x45,0x20,0x4E,0x41,0x4D,0xC5,0x44,\r\n\t0x49,0x53,0x4B,0x20,0x49,0x2F,0xCF,0x57,0x52,0x49,0x54,0x45,0x20,0x50,0x52,0x4F,\r\n\r\n\t0x54,0x45,0x43,0x54,0x45,0xC4,0x57,0x49,0x4C,0x44,0x43,0x41,0x52,0x44,0x28,0x53,\r\n\t0x29,0x20,0x4E,0x4F,0x54,0x20,0x41,0x4C,0x4C,0x4F,0x57,0x45,0xC4,0x46,0x49,0x4C,\r\n\t0x45,0x20,0x41,0x4C,0x52,0x45,0x41,0x44,0x59,0x20,0x45,0x58,0x49,0x53,0x54,0xD3,\r\n\t0x44,0x49,0x53,0x4B,0x20,0x46,0x55,0x4C,0xCC,0x49,0x4C,0x4C,0x45,0x47,0x41,0x4C,\r\n\t0x20,0x51,0x55,0x41,0x4E,0x54,0x49,0x54,0xD9,0x53,0x59,0x4E,0x54,0x41,0xD8,0x55,\r\n\t0x4E,0x4B,0x4E,0x4F,0x57,0x27,0x4E,0x20,0x46,0x4F,0x52,0x4D,0x41,0xD4,0x54,0x59,\r\n\t0x50,0x45,0x20,0x4D,0x49,0x53,0x4D,0x41,0x54,0x43,0xC8,0x46,0x49,0x4C,0x45,0x20,\r\n\t0x54,0x59,0x50,0x45,0x20,0x4D,0x49,0x53,0x4D,0x41,0x54,0x43,0xC8,0x46,0x49,0x4C,\r\n\t0x45,0x20,0x4E,0x4F,0x54,0x20,0x4F,0x50,0x45,0xCE,0x46,0x49,0x4C,0x45,0x20,0x41,\r\n\t0x4C,0x52,0x45,0x41,0x44,0x59,0x20,0x4F,0x50,0x45,0xCE,0x45,0x4E,0x44,0x20,0x4F,\r\n\t0x46,0x20,0x46,0x49,0x4C,0xC5,0x42,0x41,0x44,0x20,0x52,0x45,0x43,0x4F,0x52,0x44,\r\n\t0x20,0x4E,0x55,0x4D,0x42,0x45,0xD2,0x46,0x49,0x45,0x4C,0x44,0x20,0x4F,0x56,0x45,\r\n\t0x52,0x46,0x4C,0x4F,0xD7,0x53,0x54,0x52,0x49,0x4E,0x47,0x20,0x54,0x4F,0x4F,0x20,\r\n\t0x4C,0x4F,0x4E,0xC7,0x55,0x4E,0x4B,0x4E,0x4F,0x57,0x27,0x4E,0x20,0x46,0x49,0x45,\r\n\t0x4C,0x44,0x20,0x4E,0x41,0x4D,0xC5,0x0A,0x0D,0x54,0x52,0x41,0x43,0x4B,0xBA,0x20,\r\n\t0x53,0x45,0x43,0x54,0x4F,0x52,0xBA,0x20,0x57,0x52,0x49,0x54,0x45,0x20,0x46,0x41,\r\n\r\n\t0x55,0x4C,0x54,0xA0,0x20,0x52,0x45,0x41,0x44,0x20,0x46,0x41,0x55,0x4C,0x54,0xA0,\r\n\t0x0A,0x0D,0x20,0x42,0x52,0x45,0x41,0x4B,0x20,0x4F,0x4E,0x20,0x42,0x59,0x54,0x45,\r\n\t0x20,0xA3,0x0D,0x0A,0x44,0x72,0x69,0x76,0x65,0xA0,0x20,0x56,0x33,0x20,0x28,0x4D,\r\n\t0x73,0x74,0x29,0xA0,0x20,0x73,0x65,0x63,0x74,0x6F,0x72,0x73,0x20,0x66,0x72,0x65,\r\n\t0x65,0x20,0xA8,0x20,0x46,0x69,0x6C,0x65,0x73,0xA0,0x20,0x49,0x53,0x20,0x50,0x52,\r\n\t0x4F,0x54,0x45,0x43,0x54,0x45,0xC4,0x20,0x28,0x59,0x29,0x65,0x73,0x20,0x6F,0x72,\r\n\t0x20,0x28,0x4E,0x29,0x6F,0xBA,0x20,0x44,0x45,0x4C,0x45,0x54,0x45,0x44,0x0D,0x8A,\r\n\t0x49,0x4E,0x53,0x45,0x52,0x54,0x20,0x4D,0x41,0x53,0x54,0x45,0x52,0xA0,0x41,0x4E,\r\n\t0x44,0x20,0x50,0x52,0x45,0x53,0x53,0x20,0x27,0x52,0x45,0x54,0x55,0x52,0x4E,0xA7,\r\n\t0x20,0x41,0x4C,0x52,0x45,0x41,0x44,0x59,0x20,0x45,0x58,0x49,0x53,0x54,0x53,0x0A,\r\n\t0x8D,0x20,0x2D,0x2D,0x3E,0xA0,0x55,0x53,0x45,0x52,0xA0,0x20,0x56,0x33,0x20,0x28,\r\n\t0x53,0x6C,0x76,0x29,0xA0,0x20,0x28,0x54,0x79,0x70,0x65,0xBD,0x29,0xA0,0x20,0x44,\r\n\t0x49,0x53,0x43,0x20,0x49,0x4E,0x20,0x44,0x52,0x49,0x56,0x45,0xA0,0x08,0xAD,0x0E,\r\n\t0x03,0x48,0x98,0x48,0xA9,0x40,0x8D,0x0E,0x03,0x20,0xE9,0xCF,0x68,0xA8,0x68,0x8D,\r\n\t0x0E,0x03,0x28,0xA9,0xFF,0x2C,0x17,0xC0,0x60,0xA0,0x02,0x8C,0x06,0xC0,0xA0,0x08,\r\n\t0x8C,0x07,0xC0,0x48,0x8E,0x05,0xC0,0xAC,0x00,0xC0,0xB9,0x90,0xCD,0x2C,0x01,0xC0,\r\n\r\n\t0x10,0x02,0x09,0x10,0x8D,0xFB,0x04,0xCC,0x0B,0xC0,0xF0,0x0A,0x8C,0x0B,0xC0,0x20,\r\n\t0xEA,0xD0,0x90,0x02,0x68,0x60,0xAD,0x03,0xC0,0xAC,0x04,0xC0,0x85,0xF3,0x84,0xF4,\r\n\t0x78,0xA9,0x20,0x2C,0x05,0xC0,0x10,0x29,0x50,0x02,0xF0,0x25,0xAD,0x01,0xC0,0xCD,\r\n\t0x0C,0xC0,0xF0,0x06,0x48,0x8A,0x09,0x04,0xAA,0x68,0x29,0x7F,0xCD,0x11,0x03,0xF0,\r\n\t0x10,0x8A,0xA2,0x18,0x20,0xF3,0xCF,0x8D,0x05,0xC0,0xAA,0xAD,0x13,0x03,0x8D,0x11,\r\n\t0x03,0xAD,0x01,0xC0,0x8D,0x0C,0xC0,0x29,0x7F,0x8D,0x13,0x03,0xAD,0x02,0xC0,0x8D,\r\n\t0x12,0x03,0xA0,0x00,0x8A,0x30,0x03,0x88,0xD0,0xFD,0xAD,0xFB,0x04,0x09,0x01,0x8D,\r\n\t0x14,0x03,0x8E,0x10,0x03,0x8A,0x29,0xF0,0xC9,0xE0,0x58,0xF0,0x04,0x29,0x20,0xD0,\r\n\t0x12,0xAD,0x18,0x03,0x30,0xFB,0xAD,0x13,0x03,0x91,0xF3,0xC8,0xD0,0xF3,0xE6,0xF4,\r\n\t0x4C,0x81,0xD0,0xAD,0x18,0x03,0x30,0xFB,0xB1,0xF3,0x8D,0x13,0x03,0xC8,0xD0,0xF3,\r\n\t0xE6,0xF4,0x4C,0x93,0xD0,0x2C,0x14,0x03,0x10,0x03,0x4C,0xF5,0x04,0x68,0x68,0x68,\r\n\t0xAD,0xFB,0x04,0x8D,0x14,0x03,0x18,0xAD,0x10,0x03,0x29,0x5C,0xA8,0xAE,0x05,0xC0,\r\n\t0x30,0x02,0xA0,0x00,0x8C,0x17,0xC0,0x29,0x40,0xD0,0x0F,0x98,0x29,0x10,0xF0,0x0D,\r\n\t0xCE,0x06,0xC0,0xF0,0x05,0x20,0xEA,0xD0,0x90,0x0D,0x38,0x68,0x60,0x98,0x29,0x0C,\r\n\t0xF0,0xF9,0xCE,0x07,0xC0,0xF0,0xF3,0x4C,0xF7,0xCF,0x8A,0x48,0xAD,0x03,0xC0,0x48,\r\n\t0xAD,0x04,0xC0,0x48,0xA9,0x60,0xA0,0xC0,0x8D,0x03,0xC0,0x8C,0x04,0xC0,0xAD,0x06,\r\n\r\n\t0xC0,0xA2,0xC0,0xA0,0x01,0x20,0xEB,0xCF,0x8D,0x06,0xC0,0x68,0x8D,0x04,0xC0,0x68,\r\n\t0x8D,0x03,0xC0,0xB0,0x06,0xAD,0x12,0x03,0x8D,0x11,0x03,0x68,0xAA,0x8E,0x05,0xC0,\r\n\t0x60,0xAD,0xFB,0x04,0x8D,0x14,0x03,0xAD,0x10,0x03,0x4A,0x90,0x05,0xA9,0xD0,0x8D,\r\n\t0x10,0x03,0x38,0x4C,0xF8,0x04,0x86,0xF3,0xA2,0x04,0x20,0x6C,0xD3,0x38,0xA6,0xF3,\r\n\t0xA5,0xF2,0xE9,0x02,0xB0,0x01,0xCA,0x48,0x8A,0x20,0x13,0xD6,0x68,0x20,0x13,0xD6,\r\n\t0x58,0xA2,0xFF,0x9A,0x20,0xD8,0xD5,0xAD,0xC4,0xA0,0xC4,0x60,0x20,0xD8,0xD5,0xF8,\r\n\t0xC3,0xF4,0xC3,0x60,0x20,0xD8,0xD5,0x48,0xC4,0x44,0xC4,0x60,0xA2,0x4D,0x2C,0xA9,\r\n\t0xA3,0x20,0xD8,0xD5,0x85,0xC4,0x7E,0xC4,0x20,0xD8,0xD5,0xA3,0xC4,0x96,0xC4,0x60,\r\n\t0x20,0xD8,0xD5,0xB5,0xC4,0xA8,0xC4,0x60,0xA5,0x9A,0xA4,0x9B,0x20,0xD8,0xD5,0x73,\r\n\t0xC5,0x63,0xC5,0x60,0x20,0xD8,0xD5,0x0A,0xC6,0xFA,0xC5,0x60,0x20,0xD8,0xD5,0xDE,\r\n\t0xC6,0xB3,0xC6,0x60,0x20,0xD8,0xD5,0xEE,0xC6,0xC3,0xC6,0x60,0x20,0xD8,0xD5,0x65,\r\n\t0xC7,0x3A,0xC7,0x60,0x20,0xD8,0xD5,0x99,0xC7,0x6C,0xC7,0x60,0x20,0xD8,0xD5,0x40,\r\n\t0xC8,0x16,0xC8,0x60,0x20,0xD8,0xD5,0x3D,0xC8,0x2F,0xC8,0x60,0x20,0xD8,0xD5,0x1F,\r\n\t0xC9,0x52,0xC9,0x60,0x20,0xD8,0xD5,0xF1,0xC9,0x23,0xCA,0x60,0x20,0xD8,0xD5,0x1C,\r\n\t0xCA,0x4E,0xCA,0x20,0xD8,0xD5,0x0D,0xCA,0x3F,0xCA,0x60,0x20,0xD8,0xD5,0x41,0xCA,\r\n\t0x73,0xCA,0x60,0x20,0x9E,0xD3,0x20,0xD8,0xD5,0x98,0xCA,0xE2,0xCA,0x60,0x20,0xD8,\r\n\r\n\t0xD5,0xEF,0xCA,0x39,0xCB,0x60,0x20,0xD8,0xD5,0x9F,0xCB,0xF0,0xCB,0x60,0x20,0xD8,\r\n\t0xD5,0x12,0xCC,0xD9,0xCC,0x60,0x20,0x24,0xD2,0x18,0x24,0x38,0x20,0xD8,0xD5,0x7D,\r\n\t0xCE,0x09,0xCF,0x60,0x20,0xD8,0xD5,0x8B,0xCE,0x17,0xCF,0x60,0xA9,0x2C,0x20,0xD8,\r\n\t0xD5,0xDB,0xCF,0x67,0xD0,0x4C,0xA1,0xD3,0x20,0xD8,0xD5,0xFC,0xD0,0x88,0xD1,0x85,\r\n\t0xD3,0x84,0xD4,0x60,0x20,0xD8,0xD5,0x58,0xD1,0xE8,0xD1,0x60,0x20,0xD8,0xD5,0x17,\r\n\t0xD2,0xA9,0xD2,0x60,0x20,0xD8,0xD5,0xED,0xD3,0x99,0xD4,0x60,0x20,0xD8,0xD5,0x19,\r\n\t0xD4,0xD2,0xD4,0x60,0x20,0xD8,0xD5,0xF0,0xD4,0xAB,0xD5,0x60,0x20,0xD8,0xD5,0xC7,\r\n\t0xD6,0x82,0xD7,0x60,0x20,0x1B,0xD2,0x20,0xD8,0xD5,0x15,0xD7,0xD0,0xD7,0x60,0x20,\r\n\t0x16,0xD2,0x20,0xD8,0xD5,0x10,0xD8,0xCB,0xD8,0x60,0x20,0xD8,0xD5,0x6B,0xD8,0x26,\r\n\t0xD9,0x60,0x20,0xD8,0xD5,0x96,0xD9,0x22,0xDA,0x60,0x20,0xD8,0xD5,0x80,0xDA,0x0B,\r\n\t0xDB,0x60,0x20,0xD8,0xD5,0x97,0xDA,0x22,0xDB,0x60,0x20,0xD8,0xD5,0xB7,0xDC,0xED,\r\n\t0xDC,0x60,0x20,0xD8,0xD5,0xE0,0xDD,0xE4,0xDD,0x60,0x20,0xD8,0xD5,0x73,0xDE,0x7B,\r\n\t0xDE,0x60,0x20,0xD8,0xD5,0xA5,0xDE,0xAD,0xDE,0x60,0x20,0xD8,0xD5,0xD5,0xD8,0x40,\r\n\t0xDF,0x60,0x20,0xD8,0xD5,0xD1,0xE0,0xD5,0xE0,0x60,0x20,0xD8,0xD5,0x6D,0xE2,0x71,\r\n\t0xE2,0x60,0x20,0xD8,0xD5,0x79,0xE3,0x7D,0xE3,0x60,0x20,0xD8,0xD5,0x87,0xE3,0x8B,\r\n\t0xE3,0x60,0x20,0xD8,0xD5,0x8E,0xE3,0x92,0xE3,0x60,0x20,0xD8,0xD5,0x9D,0xE7,0x53,\r\n\r\n\t0xE8,0x60,0x20,0xD8,0xD5,0x05,0xE9,0x78,0xEB,0x60,0x20,0xD8,0xD5,0xC7,0xEC,0xE0,\r\n\t0xED,0x60,0x20,0xD8,0xD5,0x79,0xF0,0x10,0xF1,0x60,0x20,0xD8,0xD5,0x94,0xF4,0xEF,\r\n\t0xF4,0x60,0x20,0xD8,0xD5,0x35,0xF5,0x90,0xF5,0x60,0x20,0xD8,0xD5,0xCB,0xF7,0x01,\r\n\t0xF8,0x60,0x20,0xD8,0xD5,0x3E,0xF9,0x82,0xF9,0x60,0x20,0xD8,0xD5,0xE2,0x00,0xE2,\r\n\t0x00,0x60,0x20,0xD8,0xD5,0xE8,0x00,0xE8,0x00,0x60,0xA0,0x09,0x2C,0xA0,0x00,0xBD,\r\n\t0xF7,0xCC,0x99,0x29,0xC0,0xC8,0xE8,0xC0,0x0C,0xD0,0xF4,0x60,0xAD,0x0D,0xC0,0xAC,\r\n\t0x0E,0xC0,0xD0,0x12,0xAD,0x0F,0xC0,0xAC,0x10,0xC0,0xD0,0x0A,0xA9,0xE6,0xA0,0xCE,\r\n\t0xD0,0x04,0xA9,0xBE,0xA0,0xCD,0x85,0x18,0x84,0x19,0xA0,0x00,0xCA,0x30,0x0C,0xE6,\r\n\t0x18,0xD0,0x02,0xE6,0x19,0xB1,0x18,0x10,0xF6,0x30,0xF1,0xC8,0xB1,0x18,0x08,0x29,\r\n\t0x7F,0x20,0x2A,0xD6,0x28,0x10,0xF4,0x60,0x20,0x3A,0xD3,0x4C,0xA1,0xD3,0x20,0x42,\r\n\t0xD3,0x08,0xC9,0x61,0x90,0x06,0xC9,0x7B,0xB0,0x02,0x29,0xDF,0x28,0x60,0xA2,0x00,\r\n\t0x8E,0xFD,0x04,0xBA,0x8E,0x23,0xC0,0xA5,0xE9,0xA4,0xEA,0x8D,0x1F,0xC0,0x8C,0x20,\r\n\t0xC0,0x20,0x9E,0xD3,0xE9,0x41,0xA0,0x1A,0x90,0x08,0xC9,0x1A,0xB0,0x04,0xA8,0x20,\r\n\t0x3A,0xD3,0x98,0x0A,0x0A,0xA8,0xB9,0xBB,0xCB,0x85,0x18,0xB9,0xBC,0xCB,0x85,0x19,\r\n\t0xB9,0xBE,0xCB,0x85,0xF2,0xBE,0xBD,0xCB,0xC6,0xF2,0x30,0x3C,0xA0,0xFF,0xC8,0xB1,\r\n\t0x18,0xF0,0x24,0x85,0xF3,0xB1,0xE9,0xC9,0x61,0x90,0x06,0xC9,0x7B,0xB0,0x02,0x29,\r\n\r\n\t0xDF,0xC5,0xF3,0xF0,0xE9,0xC8,0xB1,0x18,0xD0,0xFB,0xE8,0x38,0x98,0x65,0x18,0x85,\r\n\t0x18,0x90,0xD5,0xE6,0x19,0xB0,0xD1,0x8A,0x0A,0xAA,0xBD,0x28,0xCC,0x48,0xBD,0x27,\r\n\t0xCC,0x48,0x20,0xE3,0xD1,0x4C,0x9E,0xD3,0xAD,0x1F,0xC0,0xAC,0x20,0xC0,0x85,0xE9,\r\n\t0x84,0xEA,0x20,0x9E,0xD3,0xF0,0x12,0xA0,0xFF,0xC8,0xB1,0xE9,0xF0,0x0C,0xC9,0x3A,\r\n\t0xF0,0x08,0xC9,0xD3,0xD0,0xF3,0x4C,0xBA,0xF5,0x60,0xA9,0x00,0x4C,0xF9,0xDF,0x38,\r\n\t0x24,0x18,0xA9,0x80,0x08,0x85,0xF4,0x46,0xF5,0xAD,0x09,0xC0,0x8D,0x28,0xC0,0xA2,\r\n\t0x0B,0xA9,0x20,0x85,0xF3,0x9D,0x29,0xC0,0xCA,0x10,0xFA,0x28,0x10,0x62,0xB0,0x3B,\r\n\t0x20,0x9E,0xD3,0xD0,0x0C,0xA9,0x0C,0x85,0xF2,0x20,0xB5,0xD5,0xF0,0x03,0x4C,0x03,\r\n\t0xD5,0xC9,0x2C,0xF0,0xF0,0xC9,0xC3,0xF0,0xEC,0x38,0xE9,0x41,0xA8,0xC9,0x04,0xB0,\r\n\t0x1A,0x20,0x98,0xD3,0xF0,0x08,0xC9,0xC3,0xF0,0x04,0xC9,0x2C,0xD0,0x05,0x8C,0x28,\r\n\t0xC0,0xB0,0xD2,0xA5,0xE9,0xD0,0x02,0xC6,0xEA,0xC6,0xE9,0x20,0x24,0xD2,0x20,0x74,\r\n\t0xD2,0x85,0xF3,0xA8,0x88,0x30,0x7B,0xB1,0x91,0xC9,0x20,0xD0,0x02,0xC6,0xF3,0x88,\r\n\t0x10,0xF5,0xA5,0xE9,0x48,0xA5,0xEA,0x48,0xA5,0x91,0x85,0xE9,0xA5,0x92,0x85,0xEA,\r\n\t0x20,0x9E,0xD3,0xE9,0x41,0xAA,0xC9,0x04,0xB0,0x2F,0xA0,0x01,0xB1,0xE9,0xC9,0x2D,\r\n\t0xF0,0x04,0xC9,0xCD,0xD0,0x23,0x8E,0x28,0xC0,0xC6,0xF3,0xC6,0xF3,0xF0,0x4E,0x20,\r\n\t0x98,0xD3,0x20,0x98,0xD3,0xD0,0x12,0x24,0xF4,0x30,0x37,0x68,0x68,0x20,0xBD,0xD7,\r\n\r\n\t0x8E,0x09,0xC0,0x20,0xBD,0xD7,0x4C,0x9E,0xD3,0xA2,0x00,0xA9,0x09,0x85,0xF2,0x46,\r\n\t0xF6,0x20,0x9E,0xD3,0x24,0xF6,0x30,0x12,0xC9,0x2E,0xD0,0x0E,0x66,0xF6,0xE0,0x0A,\r\n\t0xB0,0x1B,0xA9,0x0C,0x85,0xF2,0xA2,0x08,0xD0,0x15,0xC9,0x2C,0xD0,0x06,0x24,0xF4,\r\n\t0x10,0x27,0x30,0x78,0x20,0x67,0xD5,0x9D,0x29,0xC0,0x98,0xE4,0xF2,0xB0,0x6D,0xC6,\r\n\t0xF3,0xF0,0x10,0xE8,0x24,0xF5,0x30,0xCC,0x20,0x98,0xD3,0xD0,0xC7,0x24,0xF4,0x10,\r\n\t0x08,0x30,0x59,0x68,0x85,0xEA,0x68,0x85,0xE9,0xAD,0x32,0xC0,0xC9,0x20,0xD0,0xA3,\r\n\t0xA2,0x00,0x20,0x4A,0xD3,0xF0,0x9C,0x24,0xF5,0x30,0x24,0xA8,0x10,0x43,0x85,0xF5,\r\n\t0x29,0x7F,0x85,0x24,0xA9,0xE9,0xA0,0xC0,0x85,0x16,0x84,0x17,0xA0,0x00,0xC6,0x24,\r\n\t0x30,0x0D,0xE6,0x16,0xD0,0x02,0xE6,0x17,0x20,0x53,0x04,0x10,0xF5,0x30,0xEF,0xA0,\r\n\t0x00,0xE6,0x16,0xD0,0x02,0xE6,0x17,0x20,0x53,0x04,0x48,0xA0,0x01,0x20,0x53,0x04,\r\n\t0xA8,0x68,0x08,0x29,0x7F,0x28,0x10,0x19,0x46,0xF5,0x10,0x17,0xA2,0x02,0x4C,0x7E,\r\n\t0xD6,0xC9,0x2A,0xD0,0x0E,0xA9,0x3F,0x9D,0x29,0xC0,0xE8,0xE4,0xF2,0xD0,0xF8,0xCA,\r\n\t0x60,0xE6,0xF3,0xC9,0x3F,0xF0,0x10,0xC9,0x30,0x90,0xE1,0xC9,0x3A,0x90,0x08,0xC9,\r\n\t0x41,0x90,0xD9,0xC9,0x5B,0xB0,0xD5,0x60,0x85,0x0C,0x84,0x0D,0x08,0x68,0x85,0x27,\r\n\t0x18,0x68,0x85,0x0E,0x69,0x04,0xA8,0x68,0x85,0x0F,0x69,0x00,0x48,0x98,0x48,0xA0,\r\n\t0x01,0xAD,0x24,0xC0,0x10,0x02,0xA0,0x03,0xB1,0x0E,0x8D,0xF0,0x04,0xC8,0xB1,0x0E,\r\n\r\n\t0x8D,0xF1,0x04,0xA4,0x0D,0xA5,0x27,0x48,0xA5,0x0C,0x28,0x4C,0x71,0x04,0x18,0x69,\r\n\t0x41,0x50,0x17,0x48,0x4A,0x4A,0x4A,0x4A,0x20,0x1E,0xD6,0x68,0x29,0x0F,0xC9,0x0A,\r\n\t0x90,0x02,0x69,0x06,0x18,0x69,0x30,0x2C,0xA9,0x20,0xC9,0x0D,0xD0,0x06,0xA9,0x00,\r\n\t0x85,0x30,0xA9,0x0D,0x4C,0x0E,0xD2,0x85,0x91,0x84,0x92,0xA0,0x00,0xB1,0x91,0xF0,\r\n\t0x06,0x20,0x2A,0xD6,0xC8,0xD0,0xF6,0x60,0xA2,0x14,0x20,0x6C,0xD3,0xAD,0x00,0xC0,\r\n\t0x20,0x0E,0xD6,0x20,0x06,0xD2,0xA2,0x0D,0x20,0x6C,0xD3,0x58,0x20,0x69,0xD6,0x78,\r\n\t0x08,0x20,0x06,0xD2,0x20,0x06,0xD2,0x28,0x60,0x20,0x02,0xD3,0xC9,0x1B,0xF0,0x05,\r\n\t0xC9,0x0D,0xD0,0xF5,0x18,0x60,0x20,0x69,0xD6,0x90,0xFA,0x68,0x68,0x60,0xE8,0x8E,\r\n\t0xFD,0x04,0x6C,0x1D,0xC0,0x8A,0x20,0xDE,0xD7,0xA5,0xA8,0xA4,0xA9,0xC0,0xFF,0xD0,\r\n\t0x01,0x98,0x8D,0xFE,0x04,0x8C,0xFF,0x04,0x20,0xF2,0xD7,0x20,0xC4,0xD1,0x58,0x2C,\r\n\t0x18,0xC0,0x10,0x25,0xAE,0x23,0xC0,0x9A,0xAD,0x1B,0xC0,0xAC,0x1C,0xC0,0x85,0xA8,\r\n\t0x84,0xA9,0xAD,0x19,0xC0,0xAC,0x1A,0xC0,0x85,0xE9,0x84,0xEA,0xAD,0x1F,0xC0,0xAC,\r\n\t0x20,0xC0,0x8D,0x21,0xC0,0x8C,0x22,0xC0,0x60,0x20,0x0A,0xD3,0xAE,0xFD,0x04,0xE0,\r\n\t0x04,0xD0,0x33,0xA2,0x00,0x20,0x6C,0xD3,0xAD,0x01,0xC0,0x20,0x13,0xD6,0xAD,0x05,\r\n\t0xC0,0x29,0xF0,0x49,0xF0,0xF0,0x14,0xA2,0x01,0x20,0x6C,0xD3,0xAD,0x02,0xC0,0x20,\r\n\t0x13,0xD6,0xA2,0x03,0xAD,0x05,0xC0,0x29,0x20,0xF0,0x02,0xA2,0x02,0x20,0x6C,0xD3,\r\n\r\n\t0xAD,0x17,0xC0,0x20,0x13,0xD6,0xAE,0xFD,0x04,0xCA,0x20,0x06,0xD2,0xA9,0x3F,0x20,\r\n\t0x2A,0xD6,0xE0,0x1A,0xB0,0x05,0x20,0x72,0xD3,0x30,0x20,0xE0,0x31,0x90,0x15,0xA2,\r\n\t0x10,0x20,0x6C,0xD3,0xAD,0xFD,0x04,0xA0,0x00,0x8C,0x4C,0xC0,0xA2,0x01,0x20,0x58,\r\n\t0xD7,0x4C,0x3B,0xD7,0x8A,0xE9,0x19,0xAA,0x20,0x5C,0xD3,0x4C,0x78,0xD1,0x38,0x24,\r\n\t0x18,0x08,0x4E,0x6A,0x02,0x28,0x2E,0x6A,0x02,0xA9,0x01,0x4C,0x2A,0xD3,0xA2,0x00,\r\n\t0xA0,0x00,0x2C,0xA2,0x03,0x2C,0xA2,0x02,0x85,0xF3,0x84,0xF4,0xA9,0x00,0x8D,0x73,\r\n\t0xC0,0xA9,0xFF,0x85,0xF2,0xE6,0xF2,0x38,0xA5,0xF3,0xA8,0xFD,0x88,0xCD,0x85,0xF3,\r\n\t0xA5,0xF4,0x48,0xFD,0x8C,0xCD,0x85,0xF4,0x68,0xB0,0xEA,0x84,0xF3,0x85,0xF4,0xA5,\r\n\t0xF2,0xF0,0x05,0x8D,0x73,0xC0,0xD0,0x09,0xAC,0x73,0xC0,0xD0,0x04,0xAD,0x4C,0xC0,\r\n\t0x2C,0x09,0x30,0x20,0x2A,0xD6,0xCA,0x10,0xC8,0xA5,0xF3,0x4C,0x24,0xD6,0x38,0x24,\r\n\t0x18,0x66,0xF2,0xA2,0x0B,0xBD,0x29,0xC0,0xC9,0x3F,0xF0,0x05,0xCA,0x10,0xF6,0x38,\r\n\t0x60,0x26,0xF2,0x90,0xFB,0xA2,0x05,0x2C,0xA2,0x01,0x4C,0x7E,0xD6,0xAC,0x28,0xC0,\r\n\t0x8C,0x00,0xC0,0xB9,0x39,0xC0,0xF0,0xF0,0x60,0xA2,0x0E,0x2C,0xA2,0x10,0x2C,0xA2,\r\n\t0x12,0x2C,0xA2,0x14,0x2C,0xA2,0x16,0x2C,0xA2,0x06,0x2C,0xA2,0x04,0x2C,0xA2,0x00,\r\n\t0x2C,0xA2,0x0A,0x2C,0xA2,0x1E,0x2C,0xA2,0x20,0x2C,0xA2,0x22,0x2C,0xA2,0x24,0xA0,\r\n\t0x00,0x2C,0xA2,0x02,0x2C,0xA2,0x08,0x2C,0xA2,0x18,0x2C,0xA2,0x1A,0x2C,0xA2,0x1C,\r\n\r\n\t0x2C,0xA2,0x0C,0x85,0xF2,0xBD,0x94,0xCD,0x85,0xB4,0xBD,0x95,0xCD,0x85,0xB5,0x98,\r\n\t0xA4,0xF2,0x20,0xCA,0xD2,0x20,0x44,0xD2,0xAA,0x4C,0xC2,0xD2,0xE6,0x16,0xD0,0x02,\r\n\t0xE6,0x17,0xA0,0x00,0x2C,0x48,0xC0,0x50,0x03,0x4C,0x53,0x04,0xB1,0x16,0xF0,0x3F,\r\n\t0x10,0x3F,0x2C,0x48,0xC0,0x10,0x38,0x29,0x7F,0x60,0x8D,0x00,0x03,0xA9,0x08,0x2D,\r\n\t0x00,0x03,0x60,0x38,0x24,0x18,0x6E,0x4A,0xC0,0x20,0x02,0xD3,0x08,0x8D,0x46,0xC0,\r\n\t0x8E,0x47,0xC0,0x2C,0x49,0xC0,0x10,0x1A,0x2C,0x4A,0xC0,0x30,0x07,0xE0,0x4E,0x90,\r\n\t0x03,0x4E,0x49,0xC0,0x20,0x1C,0xD8,0x10,0x03,0x4E,0x49,0xC0,0x29,0x7F,0x28,0x24,\r\n\t0xE2,0x60,0x28,0x10,0xFC,0xA9,0x00,0x8D,0x4B,0xC0,0x8D,0x48,0xC0,0xA9,0x0E,0xA2,\r\n\t0xEF,0x20,0x22,0xD3,0xA9,0x15,0x20,0x3A,0xD8,0xD0,0x38,0xAD,0x46,0xC0,0xAE,0x47,\r\n\t0xC0,0x2C,0x3D,0xC0,0x10,0xD9,0xAD,0x08,0x02,0xA2,0x05,0xDD,0x41,0xCD,0xF0,0x0C,\r\n\t0xCA,0x10,0xF8,0xAD,0x46,0xC0,0xAE,0x47,0xC0,0x4C,0x6F,0xD8,0xAD,0x08,0x02,0x48,\r\n\t0xBD,0x47,0xCD,0x8D,0x08,0x02,0x20,0x1A,0xD3,0xAA,0x68,0x8D,0x08,0x02,0x8A,0x29,\r\n\t0x7F,0x10,0xE3,0xA9,0x17,0x20,0x3A,0xD8,0xD0,0x07,0xA9,0x14,0x20,0x3A,0xD8,0xF0,\r\n\t0x02,0xA9,0x40,0x0D,0x08,0x02,0x29,0x7F,0xAA,0xBD,0x00,0xC8,0xA8,0xC8,0xD0,0x03,\r\n\t0x4C,0x63,0xD9,0xC8,0xF0,0x6C,0xC9,0x20,0x6A,0x8D,0x48,0xC0,0x2A,0x30,0x04,0x90,\r\n\t0x02,0xE9,0x20,0x29,0x7F,0xAA,0xA9,0xE9,0xA0,0xC0,0x2C,0x48,0xC0,0x70,0x29,0x30,\r\n\r\n\t0x06,0xA9,0x7F,0xA0,0xC8,0xD0,0x21,0xA5,0xF2,0x48,0x20,0x30,0xEA,0xA0,0x00,0xB9,\r\n\t0xBD,0xCB,0xE8,0xC8,0xC8,0xC8,0xC8,0xC5,0xF2,0x90,0xF4,0x8E,0x4B,0xC0,0xA6,0xF2,\r\n\t0xCA,0x68,0x85,0xF2,0xA9,0xDD,0xA0,0xC9,0x85,0x16,0x84,0x17,0xCA,0x30,0x07,0x20,\r\n\t0x1C,0xD8,0x10,0xFB,0x30,0xF6,0x20,0x1C,0xD8,0xC9,0x20,0xF0,0xF9,0xA5,0x16,0xD0,\r\n\t0x02,0xC6,0x17,0xC6,0x16,0xAD,0x4B,0xC0,0x38,0x6E,0x49,0xC0,0xAE,0x47,0xC0,0x4C,\r\n\t0x6F,0xD8,0xA9,0x7F,0x2C,0x4A,0xC0,0x30,0xF3,0xAE,0x47,0xC0,0xF0,0xEE,0xCA,0xA9,\r\n\t0x08,0xD0,0xEC,0xAC,0x42,0xC0,0xAD,0x43,0xC0,0x20,0xCA,0xD2,0x20,0xD2,0xD2,0xA2,\r\n\t0x00,0x86,0x17,0xCA,0x86,0x16,0xE8,0xBD,0x01,0x01,0xD0,0xFA,0x9D,0x02,0x01,0x8A,\r\n\t0x48,0xAD,0x42,0xC0,0xAC,0x43,0xC0,0x85,0x33,0x84,0x34,0x20,0x9C,0xD1,0x68,0xAA,\r\n\t0xA9,0x20,0x90,0x02,0xA9,0x2A,0x9D,0x01,0x01,0x18,0xAD,0x44,0xC0,0x6D,0x42,0xC0,\r\n\t0x8D,0x42,0xC0,0xAD,0x45,0xC0,0x6D,0x43,0xC0,0x8D,0x43,0xC0,0xA9,0x0D,0xD0,0x98,\r\n\t0x20,0x7F,0xD2,0xE0,0x10,0xB0,0x3E,0x8A,0x0A,0x0A,0x0A,0x0A,0x48,0x20,0x2C,0xD2,\r\n\t0x20,0x24,0xD2,0x20,0x74,0xD2,0xC9,0x11,0xB0,0x2E,0xA8,0xF0,0x2B,0x68,0xAA,0xA9,\r\n\t0x10,0x85,0xF2,0xA9,0x20,0x9D,0x80,0xC8,0xE8,0xC6,0xF2,0xD0,0xF8,0x88,0xCA,0xB1,\r\n\t0x91,0x09,0x80,0x9D,0x80,0xC8,0xCA,0x88,0x30,0x35,0xB1,0x91,0xF0,0x07,0x30,0x05,\r\n\t0x9D,0x80,0xC8,0x90,0xF1,0xA2,0x08,0x2C,0xA2,0x12,0x4C,0x7E,0xD6,0x20,0x7F,0xD2,\r\n\r\n\t0x4E,0xDF,0x02,0x20,0x02,0xD3,0x10,0xFB,0xAD,0x08,0x02,0xAC,0x09,0x02,0xC0,0xA4,\r\n\t0xF0,0x04,0xC0,0xA7,0xD0,0x02,0x09,0x40,0x29,0x7F,0xA8,0x8A,0x99,0x00,0xC8,0x60,\r\n\t0x20,0x7F,0xD2,0x08,0x78,0x8A,0x48,0x4A,0x4A,0x4A,0x29,0x07,0xAA,0x18,0xA9,0xFF,\r\n\t0x2A,0xCA,0x10,0xFC,0xAA,0xA9,0x0E,0x20,0x22,0xD3,0x68,0x29,0x07,0x09,0xB8,0x20,\r\n\t0x3A,0xD8,0x85,0xD0,0x28,0x20,0xEB,0xD1,0x4E,0xFC,0x04,0x60,0x20,0x2E,0xE6,0xEA,\r\n\t0x20,0x60,0xDA,0xAE,0x00,0xC2,0xE8,0xF0,0x74,0xA2,0x0A,0xD0,0x22,0xA2,0xC1,0x2C,\r\n\t0xA2,0xC2,0x2C,0xA2,0xC3,0x8E,0x04,0xC0,0xA2,0x00,0x8E,0x03,0xC0,0x8D,0x01,0xC0,\r\n\t0x8C,0x02,0xC0,0xA2,0x88,0x20,0xCD,0xCF,0xF0,0x53,0xA2,0x03,0x50,0x01,0xE8,0x4C,\r\n\t0x7E,0xD6,0xAD,0x25,0xC0,0xAC,0x26,0xC0,0xD0,0x0A,0x4C,0x80,0xDC,0xEA,0xA2,0xC2,\r\n\t0x2C,0xA2,0xC1,0x2C,0xA2,0xC3,0x8E,0x04,0xC0,0xA2,0x00,0x8E,0x03,0xC0,0x8D,0x01,\r\n\t0xC0,0x8C,0x02,0xC0,0xA2,0xA8,0xD0,0xCD,0xA9,0x00,0xA0,0xC1,0x8D,0x03,0xC0,0x8C,\r\n\t0x04,0xC0,0xD0,0xF0,0xAE,0x27,0xC0,0xA0,0x08,0x20,0xC3,0xDA,0xA9,0x2E,0x20,0x2A,\r\n\t0xD6,0xA0,0x02,0xBD,0x00,0xC3,0x20,0x2A,0xD6,0xE8,0x88,0x10,0xF6,0x60,0xA9,0xC1,\r\n\t0x2C,0xA9,0xC2,0x2C,0xA9,0xC3,0x85,0x0F,0xA9,0x00,0x85,0x0E,0xA0,0x00,0x98,0x91,\r\n\t0x0E,0xC8,0xD0,0xFB,0x60,0xAD,0x25,0xC0,0xAC,0x26,0xC0,0x20,0x63,0xDA,0xAE,0x27,\r\n\t0xC0,0xA0,0xF0,0xB9,0x39,0xBF,0x9D,0x00,0xC3,0xE8,0xC8,0xD0,0xF6,0x60,0xAD,0x25,\r\n\r\n\t0xC0,0xAC,0x26,0xC0,0x20,0x63,0xDA,0xAE,0x27,0xC0,0xA0,0xF0,0xBD,0x00,0xC3,0x99,\r\n\t0x39,0xBF,0xE8,0xC8,0xD0,0xF6,0x60,0xA0,0xF4,0xB9,0x35,0xBF,0xC9,0x3F,0xF0,0x05,\r\n\t0xDD,0x00,0xC3,0xD0,0x1C,0xE8,0xC8,0xD0,0xF0,0xAE,0x27,0xC0,0x60,0x20,0x4C,0xDA,\r\n\t0xA9,0x14,0xA0,0x04,0x8D,0x25,0xC0,0x8C,0x26,0xC0,0x20,0x63,0xDA,0xA2,0x10,0xD0,\r\n\t0x07,0xAD,0x27,0xC0,0x18,0x69,0x10,0xAA,0x8E,0x27,0xC0,0xEC,0x02,0xC3,0xD0,0xC7,\r\n\t0xAD,0x00,0xC3,0xAC,0x01,0xC3,0xD0,0xDC,0x60,0x20,0xA5,0xDB,0xD0,0x34,0xAD,0x08,\r\n\t0xC2,0xC9,0x05,0xB0,0x0A,0xAD,0x02,0xC0,0x69,0x03,0xA8,0xA9,0x14,0xD0,0x03,0x20,\r\n\t0x6C,0xDC,0x8D,0x00,0xC3,0x8C,0x01,0xC3,0xEE,0x08,0xC2,0x20,0x8A,0xDA,0x20,0x82,\r\n\t0xDA,0xAD,0x00,0xC3,0xAC,0x01,0xC3,0x8D,0x25,0xC0,0x8C,0x26,0xC0,0x20,0xD4,0xDA,\r\n\t0xA2,0x10,0x8A,0x8E,0x27,0xC0,0x18,0x69,0x10,0x8D,0x02,0xC3,0xEE,0x04,0xC2,0xD0,\r\n\t0x1E,0xEE,0x05,0xC2,0x60,0xA9,0x14,0xA0,0x04,0x8D,0x25,0xC0,0x8C,0x26,0xC0,0x20,\r\n\t0x63,0xDA,0xAE,0x02,0xC3,0xD0,0x08,0xAD,0x00,0xC3,0xAC,0x01,0xC3,0xD0,0xEA,0x60,\r\n\t0x8D,0x58,0xC0,0x8C,0x59,0xC0,0x8D,0x5A,0xC0,0x8C,0x5B,0xC0,0x20,0xCE,0xDA,0xA2,\r\n\t0x01,0x8E,0x5E,0xC0,0x20,0x6C,0xDC,0x8D,0x5C,0xC0,0x8C,0x5D,0xC0,0x8D,0x01,0xC0,\r\n\t0x8C,0x02,0xC0,0xA2,0x08,0xBD,0x51,0xC0,0x9D,0x03,0xC1,0xCA,0x10,0xF7,0x8E,0x02,\r\n\t0xC1,0xA2,0x0C,0x8E,0x5F,0xC0,0xAD,0x58,0xC0,0x0D,0x59,0xC0,0xF0,0x58,0xAD,0x58,\r\n\r\n\t0xC0,0xD0,0x03,0xCE,0x59,0xC0,0xCE,0x58,0xC0,0x20,0x6C,0xDC,0xAE,0x5F,0xC0,0x9D,\r\n\t0x00,0xC1,0xE8,0x98,0x9D,0x00,0xC1,0xE8,0xD0,0xD9,0xAD,0x58,0xC0,0x0D,0x59,0xC0,\r\n\t0xF0,0x34,0xAC,0x01,0xC1,0xD0,0x1C,0x20,0x6C,0xDC,0x8D,0x00,0xC1,0x48,0x8C,0x01,\r\n\t0xC1,0x98,0x48,0x20,0xA8,0xDA,0x68,0x8D,0x02,0xC0,0x68,0x8D,0x01,0xC0,0xEE,0x5E,\r\n\t0xC0,0xD0,0x0C,0x20,0xA8,0xDA,0xAD,0x00,0xC1,0xAC,0x01,0xC1,0x20,0x5D,0xDA,0x20,\r\n\t0xCE,0xDA,0xA2,0x02,0xD0,0x9D,0xA9,0x00,0x8D,0x00,0xC1,0x8D,0x01,0xC1,0x20,0xA8,\r\n\t0xDA,0xAD,0x5C,0xC0,0xAC,0x5D,0xC0,0x4C,0x5D,0xDA,0x18,0x24,0x38,0xAD,0x02,0xC2,\r\n\t0xAA,0x0D,0x03,0xC2,0xD0,0x07,0x90,0x5C,0xA2,0x07,0x4C,0x7E,0xD6,0x4C,0x7F,0xE6,\r\n\t0x24,0x2F,0x10,0x05,0x08,0x20,0x3A,0xE6,0x28,0xA0,0x02,0xA9,0x14,0x4C,0x8E,0xDA,\r\n\t0xA9,0x01,0xA0,0x00,0x48,0x3D,0x10,0xC2,0xD0,0x05,0x68,0x0A,0xC8,0xD0,0xF5,0x68,\r\n\t0x49,0xFF,0x3D,0x10,0xC2,0x9D,0x10,0xC2,0xA9,0x00,0x85,0xF3,0x8A,0x0A,0x26,0xF3,\r\n\t0x0A,0x26,0xF3,0x0A,0x26,0xF3,0x85,0xF2,0x98,0x05,0xF2,0xA2,0xFF,0x38,0xE8,0xA8,\r\n\t0xED,0x07,0xC2,0xB0,0xF8,0xC6,0xF3,0x10,0xF4,0x8A,0xEC,0x06,0xC2,0x90,0x05,0xED,\r\n\t0x06,0xC2,0x09,0x80,0xC8,0x60,0x88,0xAA,0x10,0x06,0x29,0x7F,0x18,0x6D,0x06,0xC2,\r\n\t0xAA,0xA9,0x00,0x85,0xF3,0xE0,0x00,0xF0,0x0B,0x18,0x6D,0x07,0xC2,0x90,0x02,0xE6,\r\n\t0xF3,0xCA,0xD0,0xF5,0x85,0xF2,0x18,0x98,0x65,0xF2,0x90,0x02,0xE6,0xF3,0x48,0x29,\r\n\r\n\t0x07,0xA8,0x68,0x46,0xF3,0x6A,0x46,0xF3,0x6A,0x46,0xF3,0x4C,0xC4,0xE6,0xA9,0x00,\r\n\t0x2A,0x88,0x10,0xFC,0x60,0x20,0xD6,0xDC,0x1D,0x10,0xC2,0xDD,0x10,0xC2,0xF0,0x0C,\r\n\t0x9D,0x10,0xC2,0xEE,0x02,0xC2,0xD0,0x04,0xEE,0x03,0xC2,0x18,0x60,0x20,0xD6,0xDC,\r\n\t0x49,0xFF,0x3D,0x10,0xC2,0xDD,0x10,0xC2,0xF0,0xF2,0x9D,0x10,0xC2,0xAD,0x02,0xC2,\r\n\t0xD0,0x03,0xCE,0x03,0xC2,0xCE,0x02,0xC2,0x18,0x60,0xA9,0x40,0x2C,0xA9,0xC0,0x2C,\r\n\t0xA9,0x80,0x2C,0xA9,0x00,0x20,0x28,0xDE,0x20,0x4F,0xD4,0x20,0x9E,0xD7,0x20,0x9E,\r\n\t0xD3,0xD0,0x03,0x4C,0x0B,0xDE,0x20,0x2C,0xD2,0xC9,0x54,0xD0,0x1C,0x20,0x98,0xD3,\r\n\t0x20,0xFA,0xD2,0x8C,0x56,0xC0,0x8D,0x57,0xC0,0x4E,0x51,0xC0,0x38,0x2E,0x51,0xC0,\r\n\t0xD0,0xDC,0xA9,0x40,0x8D,0x51,0xC0,0xD0,0xD5,0xC9,0x41,0xD0,0x0E,0x20,0x98,0xD3,\r\n\t0x20,0xFA,0xD2,0x8C,0x52,0xC0,0x8D,0x53,0xC0,0x90,0xE7,0xC9,0x45,0xD0,0x0E,0x20,\r\n\t0x98,0xD3,0x20,0xFA,0xD2,0x8C,0x54,0xC0,0x8D,0x55,0xC0,0x90,0xD5,0xC9,0xC7,0xD0,\r\n\t0x72,0x20,0x98,0xD3,0xD0,0x6D,0x4E,0x51,0xC0,0x38,0x2E,0x51,0xC0,0x30,0x4C,0xAD,\r\n\t0x52,0xC0,0xAC,0x53,0xC0,0x8D,0x56,0xC0,0x8C,0x57,0xC0,0x90,0x3E,0x20,0x4F,0xD4,\r\n\t0xA9,0x00,0xA0,0xC8,0x8D,0x52,0xC0,0x8C,0x53,0xC0,0xA9,0xDD,0xA0,0xC9,0xD0,0x1E,\r\n\t0x20,0x4F,0xD4,0xAD,0x1F,0x02,0xD0,0x08,0xA2,0x80,0xA0,0xBB,0xA9,0xDF,0xD0,0x06,\r\n\t0xA2,0x00,0xA0,0xA0,0xA9,0x3F,0x8E,0x52,0xC0,0x8C,0x53,0xC0,0xA0,0xBF,0xA2,0x40,\r\n\r\n\t0x20,0x3B,0xDE,0xA9,0xC0,0x8D,0x4D,0xC0,0x20,0x9E,0xD7,0x38,0xAD,0x54,0xC0,0xED,\r\n\t0x52,0xC0,0x8D,0x4F,0xC0,0xAD,0x55,0xC0,0xED,0x53,0xC0,0x8D,0x50,0xC0,0xB0,0x7C,\r\n\t0xA2,0x08,0x2C,0xA2,0x09,0x4C,0x7E,0xD6,0x8D,0x4D,0xC0,0xA5,0x9A,0xA4,0x9B,0x8D,\r\n\t0x52,0xC0,0x8C,0x53,0xC0,0xA5,0x9C,0xA4,0x9D,0xA2,0x80,0x8D,0x54,0xC0,0x8C,0x55,\r\n\t0xC0,0x8E,0x51,0xC0,0xA9,0x00,0x8D,0x56,0xC0,0x8D,0x57,0xC0,0x60,0x20,0x4F,0xD4,\r\n\t0x20,0xDE,0xDF,0x20,0x02,0xD3,0x10,0xFB,0xC9,0x03,0xF0,0xF0,0xC9,0x13,0xD0,0x1C,\r\n\t0x20,0x40,0xD7,0xA9,0xD0,0xA0,0xBB,0x8D,0x52,0xC0,0x8C,0x53,0xC0,0xA9,0xB7,0xA0,\r\n\t0xBF,0xA2,0x60,0x20,0x00,0xDE,0x20,0x3E,0xD7,0x4C,0x53,0xDE,0xC9,0x17,0xD0,0x0E,\r\n\t0xAC,0x69,0x02,0xA9,0x7F,0xAC,0x69,0x02,0x91,0x12,0xA9,0x09,0xD0,0x09,0xC9,0x0D,\r\n\t0xD0,0x05,0x20,0x2A,0xD6,0xA9,0x0A,0x20,0x2A,0xD6,0xD0,0xB7,0x78,0x20,0x2D,0xDB,\r\n\t0xF0,0x6F,0xAD,0x4D,0xC0,0xF0,0x16,0xC9,0x80,0xF0,0x0D,0xC9,0xC0,0xF0,0x16,0x20,\r\n\t0x07,0xDB,0x4C,0x1B,0xDF,0xA2,0x02,0x2C,0xA2,0x06,0x4C,0x7E,0xD6,0x20,0x64,0xE2,\r\n\t0xB0,0x2D,0x4C,0x11,0xDF,0xA0,0x02,0xB9,0x32,0xC0,0x48,0x88,0x10,0xF9,0xA0,0x02,\r\n\t0xB9,0x32,0xC0,0xD9,0xFA,0xCC,0xD0,0x05,0x88,0x10,0xF5,0x30,0xD8,0xA2,0x03,0x20,\r\n\t0x4A,0xD3,0x20,0x30,0xDB,0xF0,0x0A,0x20,0x64,0xE2,0x90,0x05,0x68,0x68,0x68,0x58,\r\n\t0x60,0xA0,0x00,0x68,0x99,0x32,0xC0,0xC8,0xC0,0x03,0xD0,0xF7,0x20,0x30,0xDB,0xAE,\r\n\r\n\t0x27,0xC0,0xB9,0xFA,0xCC,0x9D,0x09,0xC3,0xE8,0xC8,0xC0,0x03,0xD0,0xF4,0x20,0x82,\r\n\t0xDA,0xA2,0x03,0xA9,0x00,0x9D,0x35,0xC0,0xCA,0x10,0xFA,0xAE,0x50,0xC0,0xA0,0x00,\r\n\t0xE8,0x8A,0xD0,0x01,0xC8,0x20,0xC0,0xDB,0xAD,0x52,0xC0,0xAC,0x53,0xC0,0x88,0x8D,\r\n\t0x03,0xC0,0x8C,0x04,0xC0,0xA0,0x0A,0xEE,0x04,0xC0,0xAD,0x50,0xC0,0xF0,0x17,0xCE,\r\n\t0x50,0xC0,0x20,0x28,0xE2,0xB9,0x00,0xC1,0x8D,0x01,0xC0,0xB9,0x01,0xC1,0x8D,0x02,\r\n\t0xC0,0x20,0xA4,0xDA,0xF0,0xE1,0x20,0x28,0xE2,0xB9,0x00,0xC1,0x48,0xB9,0x01,0xC1,\r\n\t0x48,0x20,0xCE,0xDA,0xAD,0x03,0xC0,0xAC,0x04,0xC0,0x85,0xF2,0x84,0xF3,0xA0,0xFF,\r\n\t0xC8,0xB1,0xF2,0x99,0x00,0xC1,0xCC,0x4F,0xC0,0xD0,0xF5,0x68,0xA8,0x68,0x20,0x91,\r\n\t0xDA,0x18,0xAD,0x5A,0xC0,0x6D,0x5E,0xC0,0x90,0x03,0xEE,0x5B,0xC0,0x6D,0x37,0xC0,\r\n\t0x8D,0x37,0xC0,0xAD,0x38,0xC0,0x29,0x0F,0x6D,0x5B,0xC0,0x09,0x40,0x8D,0x38,0xC0,\r\n\t0xAD,0x35,0xC0,0xAC,0x36,0xC0,0xF0,0x1D,0x20,0x5D,0xDA,0xAD,0x00,0xC1,0xAC,0x01,\r\n\t0xC1,0xD0,0xF5,0xAD,0x5C,0xC0,0xAC,0x5D,0xC0,0x8D,0x00,0xC1,0x8C,0x01,0xC1,0x20,\r\n\t0xA4,0xDA,0x4C,0xD4,0xDF,0xAD,0x5C,0xC0,0xAC,0x5D,0xC0,0x8D,0x35,0xC0,0x8C,0x36,\r\n\t0xC0,0x20,0x59,0xDB,0x20,0x8A,0xDA,0x20,0xEE,0xDA,0x58,0x4C,0x82,0xDA,0xAD,0x1F,\r\n\t0x02,0xF0,0x10,0x4C,0x6F,0xD1,0xA9,0x00,0xA2,0x03,0x9D,0x4D,0xC0,0xCA,0x10,0xFA,\r\n\t0x8E,0x72,0xC0,0x60,0x4C,0x23,0xDE,0xA9,0x80,0x20,0x54,0xD4,0x20,0x9E,0xD7,0x20,\r\n\r\n\t0xE6,0xDF,0x20,0x9E,0xD3,0xF0,0x4B,0xD0,0x05,0x20,0x98,0xD3,0xF0,0x44,0x20,0x2C,\r\n\t0xD2,0xA0,0x40,0xC9,0x56,0xF0,0x06,0xC9,0x4E,0xD0,0x0C,0xA0,0x80,0xAD,0x4D,0xC0,\r\n\t0xD0,0xD2,0x8C,0x4D,0xC0,0xF0,0xE2,0xC9,0x4A,0xD0,0x09,0xAD,0x4E,0xC0,0xD0,0xC4,\r\n\t0xA2,0x80,0x30,0x17,0xC9,0x41,0xD0,0xBC,0xAD,0x4E,0xC0,0xD0,0xB7,0x20,0x98,0xD3,\r\n\t0x20,0xFA,0xD2,0x8C,0x52,0xC0,0x8D,0x53,0xC0,0xA2,0x40,0x8E,0x4E,0xC0,0x30,0xB9,\r\n\t0x10,0xB0,0x20,0xE5,0xE0,0x2C,0x4D,0xC0,0x50,0x2B,0xAD,0x51,0xC0,0x20,0xE1,0xD7,\r\n\t0xAD,0x52,0xC0,0xAC,0x53,0xC0,0x20,0xF8,0xD7,0xAD,0x56,0xC0,0xAC,0x57,0xC0,0x20,\r\n\t0xFE,0xD7,0x18,0xAD,0x52,0xC0,0x6D,0x4F,0xC0,0x48,0xAD,0x53,0xC0,0x6D,0x50,0xC0,\r\n\t0xA8,0x68,0x20,0xFB,0xD7,0xAD,0x4D,0xC0,0x0A,0x30,0x50,0x2A,0x49,0x01,0x2D,0x51,\r\n\t0xC0,0x4A,0xAD,0x51,0xC0,0x10,0x0D,0x08,0x20,0xB4,0xE0,0x28,0x90,0x03,0x4C,0xAC,\r\n\t0xD1,0x4C,0x80,0xD1,0x90,0x35,0xAD,0x56,0xC0,0xAC,0x57,0xC0,0x4C,0x6B,0x04,0xA0,\r\n\t0x01,0x98,0x91,0x9A,0x08,0x78,0x20,0x88,0xD1,0xA4,0x92,0xA5,0x91,0x18,0x69,0x02,\r\n\t0x90,0x01,0xC8,0x85,0x9C,0x84,0x9D,0x85,0x9E,0x84,0x9F,0x85,0xA0,0x84,0xA1,0xA5,\r\n\t0xA6,0xA4,0xA7,0x85,0xA2,0x84,0xA3,0x28,0x4C,0xCC,0xD1,0x58,0x60,0xA2,0x00,0x2C,\r\n\t0xA2,0x0C,0x4C,0x7E,0xD6,0x20,0x2D,0xDB,0xF0,0xF3,0x78,0x38,0x6E,0x72,0xC0,0xBD,\r\n\t0x0C,0xC3,0xBC,0x0D,0xC3,0x20,0x5D,0xDA,0xA2,0x02,0xBD,0x00,0xC1,0xC9,0xFF,0xF0,\r\n\r\n\t0x0D,0xE8,0xD0,0xF6,0xAD,0x00,0xC1,0xAC,0x01,0xC1,0xF0,0xCF,0xD0,0xE7,0xBD,0x01,\r\n\t0xC1,0x85,0xF9,0x29,0xC0,0xD0,0x05,0x2C,0x4D,0xC0,0x50,0xC4,0x2C,0x4E,0xC0,0x70,\r\n\t0x19,0x10,0x0B,0xA4,0x9D,0xA5,0x9C,0xE9,0x02,0xB0,0x09,0x88,0x90,0x06,0xBD,0x02,\r\n\t0xC1,0xBC,0x03,0xC1,0x8D,0x52,0xC0,0x8C,0x53,0xC0,0x38,0xBD,0x04,0xC1,0xFD,0x02,\r\n\t0xC1,0x8D,0x4F,0xC0,0xBD,0x05,0xC1,0xFD,0x03,0xC1,0x8D,0x50,0xC0,0x18,0xAD,0x52,\r\n\t0xC0,0x8D,0x03,0xC0,0x6D,0x4F,0xC0,0x48,0xAD,0x53,0xC0,0xA8,0x88,0x8C,0x04,0xC0,\r\n\t0x6D,0x50,0xC0,0xA8,0x2C,0x72,0xC0,0x10,0x0C,0xBD,0x06,0xC1,0x8D,0x56,0xC0,0xBD,\r\n\t0x07,0xC1,0x8D,0x57,0xC0,0xBD,0x08,0xC1,0x85,0xF7,0xBD,0x09,0xC1,0x85,0xF8,0x2C,\r\n\t0x4D,0xC0,0x50,0x35,0xAD,0x53,0xC0,0x20,0x13,0xD6,0xAD,0x52,0xC0,0x20,0x13,0xD6,\r\n\t0x20,0x28,0xD6,0x98,0x20,0x13,0xD6,0x68,0x20,0x13,0xD6,0x20,0x28,0xD6,0xA5,0xF9,\r\n\t0x20,0x13,0xD6,0x20,0x28,0xD6,0xAD,0x57,0xC0,0x20,0x13,0xD6,0xAD,0x56,0xC0,0x20,\r\n\t0x13,0xD6,0x20,0x28,0xD6,0x20,0x06,0xD2,0x24,0x68,0x8A,0x18,0x69,0x06,0xA8,0x20,\r\n\t0x28,0xE2,0xA5,0xF7,0xD0,0x02,0xC6,0xF8,0xC6,0xF7,0xEE,0x04,0xC0,0xA5,0xF7,0x05,\r\n\t0xF8,0xF0,0x09,0x20,0x28,0xE2,0x20,0x50,0xE2,0x4C,0xC2,0xE1,0xAD,0x03,0xC0,0xAE,\r\n\t0x04,0xC0,0x85,0xF5,0x86,0xF6,0x20,0x28,0xE2,0x98,0x48,0xA9,0x00,0xA2,0xC2,0x8D,\r\n\t0x03,0xC0,0x8E,0x04,0xC0,0x2C,0x4D,0xC0,0x70,0x0E,0x20,0x50,0xE2,0xA0,0xFF,0xC8,\r\n\r\n\t0xB9,0x00,0xC2,0x91,0xF5,0xCC,0x4F,0xC0,0xD0,0xF5,0x68,0xA8,0x20,0x28,0xE2,0xB0,\r\n\t0x3D,0x98,0xAA,0xAD,0x72,0xC0,0x10,0x0D,0x4E,0x72,0xC0,0xA9,0x00,0x8D,0x4E,0xC0,\r\n\t0xA5,0xF9,0x8D,0x51,0xC0,0x4C,0xFA,0xE0,0xC8,0xC8,0xD0,0x1D,0xAD,0x03,0xC0,0x48,\r\n\t0xAD,0x04,0xC0,0x48,0xAD,0x00,0xC1,0xAC,0x01,0xC1,0xF0,0x0F,0x20,0x5D,0xDA,0x68,\r\n\t0x8D,0x04,0xC0,0x68,0x8D,0x03,0xC0,0xA0,0x02,0x18,0x60,0x38,0x68,0x68,0x58,0x60,\r\n\t0xB9,0x00,0xC1,0x8D,0x01,0xC0,0xB9,0x01,0xC1,0x8D,0x02,0xC0,0x2C,0x4D,0xC0,0x70,\r\n\t0xE9,0x4C,0x73,0xDA,0x18,0x24,0x38,0xAE,0x27,0xC0,0xBC,0x0F,0xC3,0x30,0x61,0xAD,\r\n\t0x04,0xC2,0xD0,0x03,0xCE,0x05,0xC2,0xCE,0x04,0xC2,0xBD,0x0C,0xC3,0x48,0xBD,0x0D,\r\n\t0xC3,0x48,0x38,0xAD,0x02,0xC3,0xE9,0x10,0x8D,0x02,0xC3,0xA8,0xA9,0x10,0x85,0xF2,\r\n\t0xB9,0x00,0xC3,0x86,0xF3,0xC4,0xF3,0xF0,0x03,0x9D,0x00,0xC3,0xA9,0x00,0x99,0x00,\r\n\t0xC3,0xE8,0xC8,0xC6,0xF2,0xD0,0xE9,0x68,0xA8,0x68,0x20,0x5D,0xDA,0xAD,0x01,0xC0,\r\n\t0xAC,0x02,0xC0,0x20,0x15,0xDD,0xA2,0x02,0xBD,0x00,0xC1,0xC9,0xFF,0xF0,0x1D,0xE8,\r\n\t0xD0,0xF6,0xAD,0x00,0xC1,0xAC,0x01,0xC1,0xD0,0xE0,0x20,0x8A,0xDA,0x4C,0x82,0xDA,\r\n\t0xB0,0x03,0x20,0xB4,0xDA,0xA2,0x09,0x20,0x6C,0xD3,0x38,0x60,0xBD,0x08,0xC1,0x85,\r\n\t0xF5,0xBD,0x09,0xC1,0x85,0xF6,0x8A,0x18,0x69,0x0A,0xAA,0x8A,0x48,0xBD,0x00,0xC1,\r\n\t0xBC,0x01,0xC1,0x20,0x15,0xDD,0x68,0xAA,0xE8,0xE8,0xD0,0x16,0xAD,0x00,0xC1,0xAC,\r\n\r\n\t0x01,0xC1,0xF0,0xC6,0x20,0x5D,0xDA,0xAD,0x01,0xC0,0xAC,0x02,0xC0,0x20,0x15,0xDD,\r\n\t0xA2,0x02,0xA4,0xF5,0xD0,0x02,0xC6,0xF6,0xC6,0xF5,0xA5,0xF5,0x05,0xF6,0xD0,0xCB,\r\n\t0xF0,0x96,0x20,0xB4,0xDA,0xA9,0x20,0x8D,0x4C,0xC0,0xAE,0x27,0xC0,0xBD,0x0F,0xC3,\r\n\t0x08,0x29,0x0F,0xA8,0xBD,0x0E,0xC3,0x20,0x56,0xD7,0xA9,0x20,0x28,0x10,0x02,0xA9,\r\n\t0x50,0x4C,0x2A,0xD6,0x20,0x51,0xD4,0x08,0x78,0xA9,0x14,0xA0,0x01,0x20,0x5D,0xDA,\r\n\t0x20,0x4C,0xDA,0xA2,0x05,0x20,0x6C,0xD3,0xAD,0x28,0xC0,0x20,0x0E,0xD6,0xA2,0x06,\r\n\t0xAC,0x0A,0xC2,0xF0,0x12,0xA2,0x11,0x88,0xF0,0x0D,0xA2,0x12,0x20,0x6C,0xD3,0xAD,\r\n\t0x0A,0xC2,0x20,0x2A,0xD6,0xA2,0x13,0x20,0x6C,0xD3,0xA0,0xEB,0xB9,0x1E,0xC0,0x20,\r\n\t0x2A,0xD6,0xC8,0xD0,0xF7,0x20,0x1F,0xE4,0x20,0x06,0xD2,0x20,0x30,0xDB,0xD0,0x09,\r\n\t0xF0,0x33,0x78,0x20,0x1F,0xE4,0x20,0x41,0xDB,0xF0,0x27,0x20,0x22,0xE3,0x20,0x41,\r\n\t0xDB,0xF0,0x1C,0x20,0x28,0xD6,0x20,0x28,0xD6,0x20,0x22,0xE3,0x58,0x20,0x02,0xD3,\r\n\t0x10,0xE0,0x20,0x02,0xD3,0x10,0xFB,0xC9,0x20,0xF0,0xD7,0xC9,0x1B,0xD0,0xF3,0x20,\r\n\t0x06,0xD2,0x20,0x06,0xD2,0xA9,0x2A,0x8D,0x4C,0xC0,0xAD,0x02,0xC2,0xAC,0x03,0xC2,\r\n\t0x20,0x56,0xD7,0xA2,0x07,0x20,0x6C,0xD3,0xA9,0x00,0x8D,0x4C,0xC0,0xA9,0x44,0x2C,\r\n\t0x09,0xC2,0x30,0x02,0xA9,0x53,0x20,0x2A,0xD6,0xA9,0x2F,0x20,0x2A,0xD6,0xAD,0x06,\r\n\t0xC2,0xA2,0x01,0x20,0x50,0xD7,0xA9,0x2F,0x20,0x2A,0xD6,0xAD,0x07,0xC2,0x20,0x4E,\r\n\r\n\t0xD7,0xA9,0x29,0x20,0x2A,0xD6,0xEA,0xEA,0xEA,0xA9,0x20,0x8D,0x4C,0xC0,0xAD,0x04,\r\n\t0xC2,0xAC,0x05,0xC2,0xA2,0x01,0x20,0x58,0xD7,0x28,0xA2,0x08,0x20,0x6C,0xD3,0x2C,\r\n\t0xF1,0x02,0x30,0x0C,0xAD,0x6A,0x02,0x29,0x20,0xD0,0x05,0xAD,0x24,0xC0,0x10,0x03,\r\n\t0x4C,0x06,0xD2,0x60,0x4C,0x23,0xDE,0x20,0x0D,0xE6,0xD0,0xF8,0xA2,0x09,0x20,0x4D,\r\n\t0xD3,0x38,0xB0,0x08,0x38,0x24,0x18,0x08,0x20,0x51,0xD4,0x28,0x6E,0x72,0xC0,0x20,\r\n\t0x2D,0xDB,0xD0,0x03,0x4C,0xDD,0xE0,0x20,0xA0,0xD7,0x90,0x17,0x20,0x64,0xE2,0x90,\r\n\t0x46,0x60,0x20,0x2A,0xD6,0x20,0x06,0xD2,0x20,0x41,0xDB,0xAE,0x27,0xC0,0x20,0x48,\r\n\t0xDB,0xF0,0x34,0x20,0xB4,0xDA,0x2C,0x72,0xC0,0x30,0x20,0xA2,0x0A,0x20,0x6C,0xD3,\r\n\t0x20,0x02,0xD3,0x20,0xA1,0xD3,0xC9,0x4E,0xF0,0xD8,0xC9,0x1B,0xF0,0xD3,0xC9,0x59,\r\n\t0xD0,0xEE,0x20,0x2A,0xD6,0x20,0x06,0xD2,0x20,0xB4,0xDA,0x20,0x66,0xE2,0xB0,0xC5,\r\n\t0xA2,0x0B,0x20,0x6C,0xD3,0x30,0xC4,0xA9,0x00,0x85,0xF5,0xAD,0x04,0xC2,0xAE,0x05,\r\n\t0xC2,0x18,0x24,0x38,0xE9,0x0F,0xE6,0xF5,0xB0,0xF9,0xCA,0x10,0xF6,0xAE,0x08,0xC2,\r\n\t0xE4,0xF5,0xF0,0x9D,0xCA,0xA9,0x14,0xA0,0x04,0x86,0xF5,0xC6,0xF5,0xD0,0x06,0x8D,\r\n\t0x5C,0xC0,0x8C,0x5D,0xC0,0x20,0x5D,0xDA,0xAD,0x00,0xC1,0xAC,0x01,0xC1,0xD0,0xEB,\r\n\t0xA0,0x10,0x84,0xF5,0x20,0xA5,0xDB,0xA4,0xF5,0xCC,0x02,0xC1,0xF0,0x14,0xB9,0x00,\r\n\t0xC1,0x9D,0x00,0xC3,0xC8,0xE8,0x8E,0x02,0xC3,0xD0,0xEE,0x84,0xF5,0x20,0x82,0xDA,\r\n\r\n\t0xF0,0xE2,0x20,0x82,0xDA,0xCE,0x08,0xC2,0xAD,0x5C,0xC0,0xAC,0x5D,0xC0,0x20,0x63,\r\n\t0xDA,0xAD,0x00,0xC3,0x48,0xAD,0x01,0xC3,0x48,0xA9,0x00,0x8D,0x00,0xC3,0x8D,0x01,\r\n\t0xC3,0x20,0xA4,0xDA,0x68,0xA8,0x68,0xAE,0x08,0xC2,0xE0,0x05,0x90,0x03,0x20,0x15,\r\n\t0xDD,0x20,0x8A,0xDA,0x4C,0xA7,0xE4,0x20,0x51,0xD4,0xA2,0x0B,0xBD,0x29,0xC0,0x9D,\r\n\t0x00,0xC1,0xCA,0x10,0xF7,0xAD,0x28,0xC0,0x48,0xA9,0xC3,0x20,0x2E,0xD2,0x20,0x51,\r\n\t0xD4,0x68,0xCD,0x28,0xC0,0xD0,0x13,0xA2,0x0C,0xBC,0x29,0xC0,0xBD,0x00,0xC1,0x9D,\r\n\t0x29,0xC0,0xC9,0x3F,0xF0,0x07,0xC0,0x3F,0xD0,0x07,0x4C,0xAC,0xD5,0xC0,0x3F,0xD0,\r\n\t0xF9,0x98,0x9D,0x10,0xC1,0xCA,0x10,0xE1,0x20,0x2D,0xDB,0xD0,0x08,0x4C,0xDD,0xE0,\r\n\t0x20,0x41,0xDB,0xF0,0x76,0xAD,0x25,0xC0,0xAC,0x26,0xC0,0x85,0xF5,0x84,0xF6,0x86,\r\n\t0xF7,0xA0,0x00,0xB9,0x29,0xC0,0xC9,0x3F,0xD0,0x05,0xBD,0x00,0xC3,0xB0,0x03,0xB9,\r\n\t0x10,0xC1,0x99,0x29,0xC0,0xE8,0xC8,0xC0,0x0C,0xD0,0xE8,0xBD,0x00,0xC3,0x99,0x29,\r\n\t0xC0,0xE8,0xC8,0xC0,0x10,0xD0,0xF4,0x20,0x30,0xDB,0x08,0xF0,0x08,0x20,0xB4,0xDA,\r\n\t0xA2,0x0E,0x20,0x6C,0xD3,0xA5,0xF5,0xA4,0xF6,0x8D,0x25,0xC0,0x8C,0x26,0xC0,0xA6,\r\n\t0xF7,0x8E,0x27,0xC0,0x28,0xD0,0x17,0x20,0x63,0xDA,0x20,0xB4,0xDA,0x20,0xEE,0xDA,\r\n\t0xA2,0x0F,0x20,0x6C,0xD3,0x20,0x82,0xDA,0x20,0xB4,0xDA,0x20,0x06,0xD2,0xA0,0x0B,\r\n\t0xB9,0x00,0xC1,0x99,0x29,0xC0,0x88,0x10,0xF7,0x30,0x85,0x60,0x20,0x51,0xD4,0x20,\r\n\r\n\t0x2D,0xDB,0x08,0xA9,0x00,0x28,0xF0,0x02,0xA9,0x01,0x4C,0xD5,0xD7,0xAC,0x09,0xC0,\r\n\t0x20,0x9E,0xD3,0xF0,0x0D,0xE9,0x41,0xC9,0x04,0xB0,0x07,0xA8,0x20,0xC0,0xD7,0x4C,\r\n\t0x98,0xD3,0x20,0xC0,0xD7,0x4C,0x9E,0xD3,0x4C,0xDD,0xE0,0x4C,0xD2,0xE2,0xA9,0x14,\r\n\t0xA0,0x02,0x84,0x2F,0x60,0xA0,0x03,0x4C,0x8B,0xDC,0x18,0x24,0x38,0x48,0x98,0x48,\r\n\t0xAD,0x01,0xC0,0x48,0xAD,0x02,0xC0,0x48,0xA2,0x06,0xBD,0x02,0xC2,0x48,0xCA,0x10,\r\n\t0xF9,0xB0,0x08,0x20,0x35,0xE6,0x20,0x4C,0xDA,0xF0,0x0C,0x86,0x2F,0x20,0x89,0xDC,\r\n\t0xA9,0x14,0xA0,0x03,0x20,0x50,0xDA,0xA2,0x00,0x68,0x9D,0x02,0xC2,0xE8,0xE0,0x07,\r\n\t0x90,0xF7,0x68,0x8D,0x02,0xC0,0x68,0x8D,0x01,0xC0,0x68,0xA8,0x68,0x38,0x60,0xA2,\r\n\t0x00,0xBD,0x10,0xC2,0xD0,0x11,0xE8,0xE0,0xF0,0xD0,0xF6,0x24,0x2F,0x10,0x03,0x4C,\r\n\t0x78,0xDC,0x20,0x3C,0xE6,0xB0,0xE8,0xAD,0x02,0xC2,0xD0,0x03,0xCE,0x03,0xC2,0xCE,\r\n\t0x02,0xC2,0x24,0x2F,0x30,0x03,0x4C,0x90,0xDC,0xA9,0x60,0x8D,0xA8,0xDC,0x20,0x90,\r\n\t0xDC,0xA9,0xA9,0x8D,0xA8,0xDC,0x8A,0xA2,0x00,0x18,0x69,0xF0,0x90,0x01,0xE8,0x86,\r\n\t0xF3,0x4C,0xAD,0xDC,0x6A,0xA6,0xF3,0xD0,0x04,0xC9,0xF0,0x90,0x0F,0x24,0x2F,0x30,\r\n\t0x03,0x20,0x3C,0xE6,0x38,0xE9,0xF0,0xAA,0x38,0x4C,0x0E,0xDD,0x24,0x2F,0x10,0xF7,\r\n\t0x20,0x3A,0xE6,0xB0,0xF2,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0x20,0x4D,0xE9,0x90,0x09,\r\n\t0xAD,0x07,0x03,0x8D,0x05,0x03,0xA9,0x40,0x2C,0xA9,0x00,0x8D,0x0B,0x03,0x60,0x20,\r\n\t0x7F,0xD2,0x08,0x78,0x8E,0x01,0x03,0xAD,0x00,0x03,0x29,0xEF,0x8D,0x00,0x03,0x09,\r\n\t0x10,0x8D,0x00,0x03,0x28,0xA9,0x02,0x2C,0x0D,0x03,0xF0,0xFB,0x60,0x4C,0x23,0xDE,\r\n\t0x08,0xA2,0x00,0x28,0xF0,0x08,0xC9,0x8F,0xD0,0x04,0x20,0x98,0xD3,0xE8,0x8A,0x48,\r\n\t0x2C,0x24,0xC0,0x30,0x02,0xE8,0xE8,0xBD,0x0C,0xCD,0xAA,0x20,0x9E,0xD3,0xF0,0x03,\r\n\t0x20,0x7F,0xD2,0x2C,0x24,0xC0,0x30,0x13,0x68,0x86,0x31,0x8A,0x38,0xE9,0x08,0xB0,\r\n\t0xFC,0x49,0xFF,0xE9,0x06,0x18,0x65,0x31,0x85,0x32,0x60,0x2C,0xF1,0x02,0x10,0x0A,\r\n\t0x68,0xD0,0xE6,0x8E,0x57,0x02,0x8D,0x59,0x02,0x60,0x68,0xF0,0xDC,0x8E,0x56,0x02,\r\n\t0xA9,0x00,0x8D,0x58,0x02,0x60,0xF0,0x06,0x20,0x16,0xD2,0x4C,0xE2,0xD2,0xAD,0x04,\r\n\t0x03,0xAC,0x05,0x03,0x85,0xD0,0x84,0xD1,0xAD,0x08,0x03,0xAC,0x09,0x03,0x85,0xD2,\r\n\t0x84,0xD3,0x4C,0x9B,0xE7,0x4C,0x23,0xDE,0xD0,0xFB,0x78,0xA9,0x00,0x4C,0xAD,0x04,\r\n\t0x20,0x4D,0xE9,0x90,0x11,0xAC,0x24,0xC0,0xD0,0x03,0x6E,0xF1,0x02,0x4C,0xBC,0xD1,\r\n\t0x20,0xC5,0xE7,0x20,0x44,0xE3,0x4C,0xC4,0xD1,0x08,0xA6,0x9A,0xA4,0x9B,0x28,0xF0,\r\n\t0x0A,0x20,0xFA,0xD2,0x20,0x9C,0xD1,0xA6,0xCE,0xA4,0xCF,0x8A,0xD0,0x01,0x88,0xCA,\r\n\t0x86,0xB0,0x84,0xB1,0x60,0xD0,0xBE,0xAD,0x3E,0x04,0xAC,0x3F,0x04,0x85,0xF0,0x84,\r\n\r\n\t0xF1,0x08,0x78,0x2C,0x24,0xC0,0x10,0x20,0xA9,0x22,0xA0,0xEE,0x8D,0x45,0x02,0x8C,\r\n\t0x46,0x02,0xA9,0x78,0xA0,0xEB,0x8D,0x3C,0x02,0x8C,0x3D,0x02,0xA9,0xB2,0xA0,0xF8,\r\n\t0x8D,0x48,0x02,0x8C,0x49,0x02,0x28,0x60,0xA9,0x03,0xA0,0xEC,0x8D,0x29,0x02,0x8C,\r\n\t0x2A,0x02,0xA9,0x30,0xA0,0xF4,0x8D,0x2C,0x02,0x8C,0x2D,0x02,0x28,0x60,0xAD,0x13,\r\n\t0xC0,0xAC,0x14,0xC0,0x85,0xE9,0x84,0xEA,0xAD,0x11,0xC0,0xAC,0x12,0xC0,0x85,0xA8,\r\n\t0x84,0xA9,0x60,0x20,0x5C,0xD2,0x20,0x24,0xD2,0x20,0x74,0xD2,0xC9,0x44,0xB0,0x3A,\r\n\t0xAA,0xA8,0x88,0xB1,0x91,0x99,0x35,0x00,0x88,0x10,0xF8,0xC8,0xB9,0x10,0xCD,0x95,\r\n\t0x35,0xE8,0xC0,0x0A,0xD0,0xF5,0xA5,0xE9,0xA4,0xEA,0x8D,0x13,0xC0,0x8C,0x14,0xC0,\r\n\t0xA5,0xA8,0xA4,0xA9,0x8D,0x11,0xC0,0x8C,0x12,0xC0,0xA9,0x34,0xA0,0x00,0xA2,0x3A,\r\n\t0x85,0xE9,0x84,0xEA,0x86,0x34,0x88,0x84,0xA9,0x60,0x4C,0x77,0xE9,0x20,0x5C,0xD2,\r\n\t0x20,0x38,0xD2,0x20,0x74,0xD2,0xC9,0x4F,0xB0,0xF0,0xAA,0xA8,0xB1,0x91,0x99,0x35,\r\n\t0x00,0x88,0x10,0xF8,0xC8,0x94,0x35,0xA5,0xE9,0x48,0xA9,0x35,0x85,0xE9,0x20,0x94,\r\n\t0xD1,0x68,0x85,0xE9,0x98,0x38,0xE9,0x05,0x20,0x64,0xD2,0xA4,0xD0,0x88,0xB9,0x35,\r\n\t0x00,0x91,0xD1,0x88,0x10,0xF8,0xA0,0x02,0xB9,0xD0,0x00,0x91,0xB6,0x88,0x10,0xF8,\r\n\t0x60,0x20,0x38,0xD2,0x20,0x74,0xD2,0xAA,0xF0,0xF6,0x85,0xF3,0xA2,0x00,0xA0,0x00,\r\n\t0xA9,0xE9,0x85,0x16,0xA9,0xC0,0x85,0x17,0x84,0xF2,0xB1,0x91,0x10,0x2B,0x29,0x7F,\r\n\r\n\t0xF0,0x13,0x85,0x26,0xA0,0x00,0xE6,0x16,0xD0,0x02,0xE6,0x17,0x20,0x53,0x04,0x10,\r\n\t0xF5,0xC6,0x26,0xD0,0xF1,0xA0,0x01,0xE8,0xF0,0x1E,0x20,0x53,0x04,0x08,0x29,0x7F,\r\n\t0x9D,0xFF,0xC0,0xC8,0x28,0x10,0xF0,0x30,0x06,0xE8,0xF0,0x0C,0x9D,0xFF,0xC0,0xC6,\r\n\t0xF3,0xF0,0x08,0xA4,0xF2,0xC8,0xD0,0xB8,0x4C,0x77,0xE9,0x8A,0x20,0x64,0xD2,0xA4,\r\n\t0xD0,0x88,0xB9,0x00,0xC1,0x91,0xD1,0x98,0xD0,0xF7,0x4C,0xD6,0xE8,0xA0,0x02,0xB1,\r\n\t0xE9,0x29,0xDF,0xD9,0x2E,0xCD,0xD0,0x05,0x88,0x10,0xF4,0x30,0x0F,0xA0,0x02,0xB1,\r\n\t0xE9,0x29,0xDF,0xD9,0x2B,0xCD,0xD0,0x0C,0x88,0x10,0xF4,0x18,0x08,0xA0,0x03,0x20,\r\n\t0xE3,0xD1,0x28,0x60,0x4C,0x23,0xDE,0xA2,0x12,0x4C,0x7E,0xD6,0x4C,0x20,0xDE,0x20,\r\n\t0x4D,0xE9,0xA9,0x00,0x8D,0x1C,0xC0,0x8D,0x1B,0xC0,0x6A,0x8D,0x18,0xC0,0xA0,0x37,\r\n\t0xA2,0xFF,0x8C,0x19,0xC0,0x8E,0x1A,0xC0,0x60,0x20,0xFA,0xD2,0x8D,0x1C,0xC0,0x8C,\r\n\t0x1B,0xC0,0x20,0x9C,0xD1,0xA6,0xCF,0xA4,0xCE,0xD0,0x01,0xCA,0x88,0x4C,0x92,0xE9,\r\n\t0x20,0x7F,0xD2,0xE0,0x32,0x90,0xC5,0xCA,0x4C,0x7E,0xD6,0xF0,0x06,0xA9,0x90,0x20,\r\n\t0x2E,0xD2,0xC8,0x08,0xAD,0x21,0xC0,0xAC,0x22,0xC0,0x85,0xE9,0x84,0xEA,0xAD,0xFE,\r\n\t0x04,0xAC,0xFF,0x04,0x85,0xA8,0x84,0xA9,0x28,0xF0,0x03,0x4C,0xDC,0xD1,0xC6,0xEA,\r\n\t0xA0,0xFF,0xB1,0xE9,0xC9,0x3A,0xF0,0x02,0xA0,0xFB,0x4C,0xE3,0xD1,0xA0,0x03,0x2C,\r\n\t0xA0,0x51,0x2C,0xA0,0x54,0x2C,0xA0,0x57,0x2C,0xA0,0x5A,0x2C,0xA0,0x5D,0x2C,0xA0,\r\n\r\n\t0x79,0xA2,0x60,0x4C,0x5E,0xF1,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xE8,0x86,0xF2,0xA2,0x3F,0x60,0x86,0x30,0x4C,0x3E,0xD7,0x20,0x38,0xD2,0x85,0xB8,\r\n\t0x84,0xB9,0xA5,0x28,0x48,0xA5,0x29,0x48,0x20,0x2C,0xD2,0x20,0x38,0xD2,0x85,0x91,\r\n\t0x84,0x92,0x68,0xC5,0x29,0xD0,0x20,0x68,0xC5,0x28,0xD0,0x1B,0xA0,0x01,0x24,0x28,\r\n\t0x30,0x06,0x24,0x29,0x30,0x03,0xC8,0xC8,0xC8,0xB1,0x91,0xAA,0xB1,0xB8,0x91,0x91,\r\n\t0x8A,0x91,0xB8,0x88,0x10,0xF3,0x60,0xA2,0x0B,0x4C,0x7E,0xD6,0x4C,0x20,0xDE,0x20,\r\n\t0x7F,0xD2,0x8A,0xC9,0x04,0xB0,0xF5,0x0A,0x65,0xD4,0x85,0xF6,0xAA,0xBD,0x68,0xC0,\r\n\t0x85,0xF7,0xA9,0x00,0xA2,0x03,0x95,0xF2,0xCA,0x10,0xFB,0x20,0x9E,0xD3,0xC9,0x2C,\r\n\t0xD0,0x46,0x20,0x98,0xD3,0xA0,0x04,0xD9,0x83,0xCD,0xF0,0x05,0x88,0x10,0xF8,0x30,\r\n\t0x37,0x20,0x98,0xD3,0xC0,0x04,0xD0,0x22,0x20,0xFA,0xD2,0xA6,0xF6,0x9D,0x67,0xC0,\r\n\t0x98,0x9D,0x66,0xC0,0x20,0x9E,0xD3,0xF0,0x0A,0x20,0x2C,0xD2,0xA9,0x4F,0x20,0x2E,\r\n\t0xD2,0xA2,0x80,0x8A,0xA6,0xF6,0x9D,0x68,0xC0,0x60,0x98,0x48,0x20,0x7F,0xD2,0x68,\r\n\t0xA8,0x96,0xF2,0x20,0x9E,0xD3,0xD0,0xB3,0xA4,0xF4,0xA5,0xF5,0x48,0xA6,0xF6,0xBD,\r\n\t0x66,0xC0,0x8D,0xF0,0x04,0xBD,0x67,0xC0,0x8D,0xF1,0x04,0xA5,0xF2,0xA6,0xF3,0x24,\r\n\r\n\t0xF7,0x10,0x07,0x28,0x20,0x22,0xEB,0x4C,0x0E,0xEB,0x28,0x20,0x71,0x04,0x48,0x08,\r\n\t0x8A,0x48,0x98,0x20,0xCF,0xD7,0x68,0x20,0xCC,0xD7,0x68,0x20,0xD2,0xD7,0x68,0x4C,\r\n\t0xC9,0xD7,0x6C,0xF0,0x04,0xA0,0x03,0xB9,0x3E,0xC0,0x99,0x42,0xC0,0x88,0x10,0xF7,\r\n\t0x20,0x9E,0xD3,0xF0,0x5B,0xC9,0x80,0xD0,0x39,0x20,0x98,0xD3,0xA6,0x9A,0xA5,0x9B,\r\n\t0x86,0xCE,0x85,0xCF,0xA0,0x00,0xB1,0xCE,0xAA,0xC8,0xB1,0xCE,0xF0,0x10,0x48,0xC8,\r\n\t0xB1,0xCE,0x8D,0x42,0xC0,0xC8,0xB1,0xCE,0x8D,0x43,0xC0,0x68,0xD0,0xE2,0x18,0xAD,\r\n\t0x42,0xC0,0x6D,0x44,0xC0,0x8D,0x42,0xC0,0xAD,0x43,0xC0,0x6D,0x45,0xC0,0x8D,0x43,\r\n\t0xC0,0x60,0xC9,0x2C,0xF0,0x0E,0x20,0xFA,0xD2,0x8D,0x43,0xC0,0x8C,0x42,0xC0,0x20,\r\n\t0x9E,0xD3,0xF0,0x0C,0x20,0x2C,0xD2,0x20,0xFA,0xD2,0x8D,0x45,0xC0,0x8C,0x44,0xC0,\r\n\t0x60,0x20,0x4D,0xE9,0x20,0xDE,0xDF,0xAD,0x3D,0xC0,0x29,0x80,0x90,0x02,0x09,0x40,\r\n\t0x8D,0x3D,0xC0,0x2C,0x3D,0xC0,0x70,0x05,0xA2,0x05,0x4C,0x32,0xD3,0xA9,0x06,0x85,\r\n\t0xF2,0xA2,0x00,0xA9,0x08,0x85,0xF3,0x85,0xF5,0xBD,0x4D,0xCD,0xE8,0x0A,0x0A,0x26,\r\n\t0xF5,0x0A,0x26,0xF5,0x85,0xF4,0xA5,0xF5,0x69,0x94,0x85,0xF5,0xA0,0x00,0xBD,0x4D,\r\n\t0xCD,0x91,0xF4,0xE8,0xC8,0xC6,0xF3,0xD0,0xF5,0xC6,0xF2,0xD0,0xD6,0x60,0xA9,0xC0,\r\n\t0x2C,0xA9,0x00,0x8D,0x3D,0xC0,0x20,0xDE,0xDF,0x4C,0xA3,0xEB,0xAD,0x69,0x02,0xAC,\r\n\t0x68,0x02,0x4C,0xFB,0xEB,0xAD,0x19,0x02,0xAC,0x1A,0x02,0x48,0x98,0x20,0xE7,0xD7,\r\n\r\n\t0x68,0x4C,0xE4,0xD7,0x08,0x48,0xAD,0xF9,0x02,0xAC,0xFA,0x02,0x8D,0xF0,0x04,0x8C,\r\n\t0xF1,0x04,0x68,0x28,0x4C,0xEC,0x04,0xA9,0x10,0xA0,0x07,0x8D,0x6B,0x02,0x8C,0x6C,\r\n\t0x02,0xA9,0x0F,0x8D,0x6A,0x02,0xA9,0x0C,0x20,0x2A,0xD6,0x4C,0xA3,0xEB,0x20,0x24,\r\n\t0xD2,0x20,0x74,0xD2,0x85,0xF2,0xA8,0x88,0xB1,0x91,0x99,0x00,0xC1,0x98,0xD0,0xF7,\r\n\t0x20,0x2C,0xD2,0x20,0x24,0xD2,0x20,0x74,0xD2,0x85,0xF3,0x86,0xB8,0x84,0xB9,0x20,\r\n\t0x2C,0xD2,0x20,0x7F,0xD2,0xD0,0x37,0xCA,0x86,0xF6,0xE4,0xF2,0xB0,0x33,0xA5,0xF2,\r\n\t0xF0,0x1C,0xA6,0xF3,0xF0,0x18,0xA5,0xF6,0x85,0xF7,0xA9,0xC1,0x85,0xF8,0xA0,0x00,\r\n\t0xB1,0xF7,0xD1,0xB8,0xD0,0x0E,0xC8,0xCA,0xD0,0xF6,0xA4,0xF6,0xC8,0x2C,0xA0,0x00,\r\n\t0x98,0x4C,0xDB,0xD7,0xE6,0xF6,0xA5,0xF6,0xC5,0xF2,0xF0,0xF2,0xD0,0xD4,0x4C,0x23,\r\n\t0xDE,0x4C,0x20,0xDE,0xAA,0xAD,0x6A,0x02,0x48,0xE0,0xC6,0xD0,0x1E,0x20,0x98,0xD3,\r\n\t0x20,0x40,0xD7,0x20,0x92,0xD2,0xA4,0x20,0x85,0x12,0x84,0x13,0x8E,0x68,0x02,0xAE,\r\n\t0xF8,0x02,0x8E,0x69,0x02,0x20,0x36,0xEA,0x20,0x2C,0xD2,0x20,0x24,0xD2,0x24,0x28,\r\n\t0x10,0x15,0x20,0x77,0xD2,0xF0,0x05,0xA0,0x00,0xB1,0x91,0x2C,0xA9,0x2E,0x8D,0x75,\r\n\t0xC0,0x20,0x2C,0xD2,0x20,0x24,0xD2,0x20,0x19,0xD2,0x20,0x82,0xD2,0x8A,0xF0,0x4B,\r\n\t0x86,0xF2,0xA9,0x3B,0x20,0x2E,0xD2,0x84,0xF3,0x20,0x2E,0xED,0x20,0x1B,0xD2,0x20,\r\n\t0x9E,0xD3,0xF0,0x25,0x20,0x2C,0xD2,0x20,0xA1,0xD3,0xA2,0x04,0x86,0xF4,0x06,0xF4,\r\n\r\n\t0xDD,0xBA,0xCD,0xF0,0x05,0xCA,0x10,0xF6,0x30,0x1E,0xA5,0xF4,0x45,0xF3,0xC5,0xF3,\r\n\t0x90,0x16,0x85,0xF3,0x20,0x98,0xD3,0xD0,0xDB,0x20,0x36,0xED,0x20,0x8E,0xEE,0x68,\r\n\t0x8D,0x6A,0x02,0xA5,0xF4,0x4C,0xD8,0xD7,0x4C,0x23,0xDE,0x4C,0x20,0xDE,0x20,0x38,\r\n\t0xD2,0x85,0xB8,0x84,0xB9,0x60,0xA5,0xF3,0x29,0x08,0xD0,0x16,0x20,0x40,0xD7,0xA6,\r\n\t0xF2,0xAD,0x75,0xC0,0x20,0x2A,0xD6,0xCA,0xD0,0xFA,0x20,0x40,0xD7,0xA6,0xF2,0x20,\r\n\t0x69,0xEE,0x20,0x3E,0xD7,0xA2,0x00,0xA0,0x26,0xAD,0x6A,0x02,0x29,0x20,0xF0,0x02,\r\n\t0xA0,0x28,0x84,0xF5,0x20,0x43,0xD8,0x10,0xFB,0xC9,0x14,0xF0,0x23,0xC9,0x7F,0xD0,\r\n\t0x0E,0x8A,0xF0,0xF0,0x20,0x73,0xEE,0xAD,0x75,0xC0,0x20,0x2A,0xD6,0xA9,0x08,0xC9,\r\n\t0x0E,0xD0,0x05,0x20,0x69,0xEE,0xF0,0xB4,0xC9,0x04,0xF0,0x04,0xC9,0x1A,0xD0,0x05,\r\n\t0x20,0x2A,0xD6,0xD0,0xCF,0xC9,0x20,0x90,0x14,0x20,0x2A,0xD6,0xE8,0xE4,0xF2,0xD0,\r\n\t0xC3,0x24,0xF3,0x50,0xA5,0xCA,0x20,0x73,0xEE,0xA0,0x06,0xD0,0x57,0xA0,0x00,0xC9,\r\n\t0x0D,0xF0,0x49,0xC8,0xC9,0x1B,0xF0,0x44,0xC8,0xC9,0x08,0xD0,0x09,0x8A,0xF0,0x3C,\r\n\t0xCA,0x20,0x73,0xEE,0xD0,0x9E,0xC8,0xC9,0x09,0xD0,0x0E,0xE8,0xE4,0xF2,0xF0,0x05,\r\n\t0x20,0x76,0xEE,0xD0,0xBE,0xCA,0x4C,0xFC,0xED,0xC8,0xC9,0x0A,0xD0,0x0F,0x18,0x8A,\r\n\t0x65,0xF5,0xB0,0x18,0xC5,0xF2,0xB0,0x14,0xAA,0xA9,0x0A,0xD0,0xA3,0xC8,0xC9,0x0B,\r\n\t0xD0,0xA1,0x8A,0xE5,0xF5,0x90,0x05,0xAA,0xA9,0x0B,0xD0,0x94,0xC0,0x02,0x90,0x04,\r\n\r\n\t0xA5,0xF3,0x30,0x8F,0x84,0xF4,0x20,0x40,0xD7,0xE8,0xE4,0xF2,0xB0,0x05,0x20,0x76,\r\n\t0xEE,0xD0,0xF6,0xA5,0xF2,0x20,0x64,0xD2,0xA4,0xF2,0x84,0xF5,0xAC,0x69,0x02,0xB1,\r\n\t0x12,0xC9,0x20,0xB0,0x02,0x09,0x80,0xA4,0xF5,0x88,0x08,0x91,0xD1,0x20,0x73,0xEE,\r\n\t0x28,0xD0,0xE7,0xA6,0xF2,0x20,0x76,0xEE,0xCA,0xD0,0xFA,0x06,0xF3,0x06,0xF3,0xA4,\r\n\t0xF2,0x88,0xB1,0xD1,0xCD,0x75,0xC0,0xD0,0x18,0xA9,0x20,0x24,0xF3,0x10,0x02,0x91,\r\n\t0xD1,0x50,0x06,0x20,0x2A,0xD6,0x20,0x73,0xEE,0x20,0x73,0xEE,0x98,0xD0,0xE2,0x24,\r\n\t0xC8,0x20,0x76,0xEE,0xC4,0xF2,0xD0,0xF8,0x60,0x8A,0xF0,0x06,0x20,0x73,0xEE,0xCA,\r\n\t0xD0,0xF7,0x60,0xA9,0x08,0x2C,0xA9,0x09,0x24,0x68,0x48,0x20,0x2A,0xD6,0xAD,0x6A,\r\n\t0x02,0x29,0x20,0xD0,0x07,0xAD,0x69,0x02,0x29,0xFE,0xF0,0xED,0x68,0x60,0xA0,0x02,\r\n\t0xB9,0xD0,0x00,0x91,0xB8,0x88,0x10,0xF8,0x60,0x20,0x16,0xD2,0x20,0xD2,0xD2,0x20,\r\n\t0x2C,0xD2,0x20,0x24,0xD2,0x20,0x74,0xD2,0x85,0x22,0x20,0xCE,0xDA,0xA9,0x30,0xA0,\r\n\t0x2B,0x84,0xD7,0x85,0xD8,0x85,0xD9,0x85,0xC5,0xA2,0x09,0x95,0xCD,0xCA,0xD0,0xFB,\r\n\t0xAD,0x00,0x01,0xC9,0x2D,0xF0,0x02,0xA9,0x2B,0x85,0xC4,0x86,0xF4,0x86,0xF5,0xA9,\r\n\t0x20,0x85,0xF6,0xA0,0x01,0x84,0xF2,0x88,0x2C,0xA2,0x09,0xC8,0xB9,0x00,0x01,0xF0,\r\n\t0x25,0xC9,0x2E,0xF0,0xF4,0xC9,0x45,0xF0,0x0B,0x95,0xC5,0xE0,0x09,0xB0,0x02,0x84,\r\n\t0xF2,0xE8,0xD0,0xE7,0xB9,0x01,0x01,0x85,0xD7,0xB9,0x02,0x01,0xAA,0xB9,0x03,0x01,\r\n\r\n\t0xF0,0x02,0x85,0xD9,0x86,0xD8,0xA6,0xF2,0xA0,0x08,0xB5,0xC4,0xCA,0x10,0x02,0xA9,\r\n\t0x20,0x99,0xC5,0x00,0x88,0x10,0xF3,0x2C,0x84,0xF5,0xA4,0xF4,0xC4,0x22,0xD0,0x28,\r\n\t0xA9,0x00,0x85,0xD7,0x20,0x9E,0xD3,0xF0,0x18,0xA5,0xF5,0x20,0x64,0xD2,0xA8,0x88,\r\n\t0xB9,0x00,0xC1,0x91,0xD1,0x98,0xD0,0xF7,0x20,0x2C,0xD2,0x20,0x38,0xD2,0x4C,0xD6,\r\n\t0xE8,0xA9,0x00,0xA0,0xC1,0x4C,0x37,0xD6,0x20,0x2B,0xF0,0xC9,0x5E,0xD0,0x19,0xA2,\r\n\t0xFD,0xBD,0xDA,0xFF,0x2C,0xA9,0x20,0x2C,0xA5,0xC4,0x99,0x00,0xC1,0xC8,0xD0,0x03,\r\n\t0x4C,0x77,0xE9,0xE8,0xD0,0xEB,0xF0,0xB0,0xC9,0x2B,0xF0,0xEC,0xC9,0x2D,0xD0,0x08,\r\n\t0xAD,0x00,0x01,0x4A,0xB0,0xE2,0x90,0xDD,0xC9,0x23,0xD0,0x07,0x20,0xA7,0xEF,0xA2,\r\n\t0x09,0xD0,0x10,0xC9,0x25,0xD0,0x32,0x20,0xA7,0xEF,0xC5,0xF2,0x90,0x25,0xA9,0x09,\r\n\t0xE5,0xF3,0xAA,0xC6,0xF3,0x10,0x03,0x4C,0x18,0xEF,0xB5,0xC5,0x29,0x7F,0x99,0x00,\r\n\t0xC1,0xC8,0xF0,0x12,0xE8,0xD0,0xEC,0x20,0x2B,0xF0,0xE9,0x30,0x85,0xF3,0xC9,0x0A,\r\n\t0xB0,0x01,0x60,0x4C,0x20,0xDE,0x4C,0x77,0xE9,0xC9,0x21,0xD0,0x3F,0x20,0xA7,0xEF,\r\n\t0x38,0xA9,0x09,0xE5,0xF3,0x85,0xF3,0xAA,0xB5,0xC5,0xC5,0xF6,0xF0,0x5A,0xA9,0x30,\r\n\t0xE8,0xE8,0xE0,0x12,0xF0,0x04,0x95,0xC5,0xD0,0xF7,0xA6,0xF3,0xE8,0xB5,0xC5,0xC9,\r\n\t0x35,0xA9,0x30,0x95,0xC5,0x90,0x41,0xCA,0x30,0x3E,0xB5,0xC5,0xC5,0xF6,0xD0,0x04,\r\n\t0xE6,0xF2,0xA9,0x30,0xC9,0x39,0xF0,0xE9,0x69,0x01,0x90,0xE7,0xC9,0x40,0xD0,0x07,\r\n\r\n\t0x20,0xA7,0xEF,0x69,0x08,0x90,0xBE,0xC9,0x26,0xF0,0x03,0x4C,0x5A,0xEF,0x20,0x2B,\r\n\t0xF0,0xC9,0x30,0xD0,0x02,0x09,0x80,0xAA,0xA0,0x00,0xB9,0xC5,0x00,0xC5,0xF6,0xD0,\r\n\t0x05,0x96,0xC5,0xC8,0xD0,0xF4,0x86,0xF6,0x4C,0x1A,0xEF,0xA4,0xF4,0xB1,0x91,0xE6,\r\n\t0xF4,0xA4,0xF5,0xA2,0xFF,0x60,0x20,0xC5,0xE7,0x20,0x99,0xEE,0x4C,0xD6,0xE7,0xA2,\r\n\t0x05,0xBD,0x1A,0xCD,0x9D,0xDF,0xBF,0xBD,0x1F,0xCD,0x9D,0xE9,0xBF,0xCA,0xD0,0xF1,\r\n\t0xE8,0x8E,0x72,0xC0,0xA9,0x41,0xA0,0x4E,0x85,0xB4,0x84,0xB5,0x20,0x44,0xD2,0x20,\r\n\t0xBA,0xD2,0xA9,0xE0,0xA0,0xBF,0x20,0xAA,0xD2,0xA2,0xE0,0xA0,0xBF,0x20,0xC2,0xD2,\r\n\t0xAD,0x1F,0x02,0xD0,0x03,0x4C,0x6F,0xD1,0x60,0x20,0x3F,0xF0,0x20,0x16,0xD2,0xA2,\r\n\t0xE5,0xA0,0xBF,0x20,0xC2,0xD2,0xA2,0x00,0x86,0xF2,0xA9,0xE0,0xA0,0xBF,0x20,0xBA,\r\n\t0xD2,0xA6,0xF2,0xF0,0x09,0x20,0xF2,0xD2,0x20,0xDA,0xD2,0x4C,0xA1,0xF0,0x20,0xEA,\r\n\t0xD2,0xA9,0xE5,0xA0,0xBF,0x20,0xAA,0xD2,0x20,0x8A,0xD2,0xAA,0xF0,0x04,0xC8,0xD0,\r\n\t0x01,0xE8,0x8A,0xA6,0xF2,0x9D,0xE2,0x02,0x98,0x9D,0xE1,0x02,0xE8,0xE8,0xE0,0x02,\r\n\t0xF0,0xC6,0x4E,0x72,0xC0,0x90,0x0C,0x20,0x2C,0xD2,0x20,0xFA,0xD2,0x8C,0xE5,0x02,\r\n\t0x8D,0xE6,0x02,0x20,0x12,0xD3,0x4E,0xE0,0x02,0x90,0x9D,0x4C,0x7C,0xE9,0x20,0x3F,\r\n\t0xF0,0x20,0x7F,0xD2,0x86,0xF3,0x20,0x2C,0xD2,0x20,0x7F,0xD2,0x86,0xF4,0xA9,0x04,\r\n\t0x85,0xF5,0xA9,0x00,0x85,0xF6,0xA6,0xF6,0x8A,0x49,0x01,0x85,0xF6,0xB4,0xF3,0xA9,\r\n\r\n\t0x00,0x20,0xCA,0xD2,0x20,0x7F,0xF0,0xA9,0xE0,0xA0,0xBF,0x20,0xBA,0xD2,0xA9,0xEA,\r\n\t0xA0,0xBF,0x20,0xA2,0xD2,0xA2,0xE0,0xA0,0xBF,0x20,0xC2,0xD2,0xC6,0xF5,0xD0,0xD6,\r\n\t0x60,0xA0,0x1B,0x2C,0xA0,0x18,0x2C,0xA0,0x15,0x2C,0xA0,0x12,0x2C,0xA0,0x0F,0x2C,\r\n\t0xA0,0x0C,0xA2,0x56,0xD0,0x28,0xA2,0x42,0x2C,0xA2,0x56,0x2C,0xA2,0x4C,0xA0,0x09,\r\n\t0xD0,0x1C,0xA2,0x42,0x2C,0xA2,0x56,0x2C,0xA2,0x4C,0xA0,0x06,0xD0,0x10,0xA2,0x42,\r\n\t0x2C,0xA2,0x47,0x2C,0xA2,0x4C,0x2C,0xA2,0x51,0x2C,0xA2,0x56,0xA0,0x03,0xA9,0xC4,\r\n\t0x48,0x98,0x48,0xEC,0x15,0xC0,0xF0,0x51,0x2C,0xA2,0x5B,0x8A,0x48,0xA2,0x0C,0x20,\r\n\t0x6C,0xD3,0xAD,0x0A,0xC0,0x8D,0x00,0xC0,0x20,0x48,0xD6,0x58,0x08,0xA9,0x0B,0x20,\r\n\t0x2A,0xD6,0x28,0x90,0x0A,0x68,0xC9,0x5B,0xF0,0x02,0x68,0x68,0x4C,0xDC,0xD1,0x20,\r\n\t0x4C,0xDA,0xAD,0x07,0xC2,0x8D,0x4B,0xC0,0xAD,0x0A,0xC2,0xD0,0xD0,0xA2,0xFF,0x68,\r\n\t0x8D,0x15,0xC0,0x38,0xA8,0xE8,0xED,0x07,0xC2,0xF0,0x02,0xB0,0xF7,0x8E,0x01,0xC0,\r\n\t0xA2,0x04,0xA9,0xC4,0x20,0xE5,0xF1,0x38,0x24,0x18,0x6E,0x16,0xC0,0xA2,0x03,0xBD,\r\n\t0x00,0xC4,0x9D,0x0D,0xC0,0xCA,0x10,0xF7,0xAD,0x15,0xC0,0xC9,0x5B,0xF0,0x03,0x4C,\r\n\t0x9E,0xD3,0xA2,0x63,0xA9,0x30,0xA0,0x00,0x8C,0x01,0xC0,0xC8,0x20,0xE5,0xF1,0x20,\r\n\t0x9E,0xD3,0x4C,0x04,0xC4,0x86,0xF5,0x8D,0x04,0xC0,0xA9,0x00,0x8D,0x03,0xC0,0x78,\r\n\t0x8C,0x02,0xC0,0x20,0x73,0xDA,0xEE,0x04,0xC0,0xAC,0x02,0xC0,0xCC,0x4B,0xC0,0x90,\r\n\r\n\t0x05,0xEE,0x01,0xC0,0xA0,0x00,0xC8,0xC6,0xF5,0xD0,0xE5,0x58,0x60,0x4C,0xE0,0xE0,\r\n\t0xF0,0x27,0x20,0x4F,0xD4,0x20,0x9E,0xD7,0x20,0xE6,0xDF,0xA9,0x00,0xA0,0xC4,0x8D,\r\n\t0x52,0xC0,0x8C,0x53,0xC0,0xA9,0x40,0x8D,0x4E,0xC0,0x20,0xE5,0xE0,0xAD,0x51,0xC0,\r\n\t0x29,0x20,0xF0,0xD9,0xA9,0x01,0x8D,0x15,0xC0,0xAC,0x15,0xC0,0x88,0xD0,0xCE,0xAD,\r\n\t0x6A,0x02,0x48,0x08,0x20,0xDE,0xDF,0xA9,0xB8,0xA0,0xBB,0x85,0xF2,0x84,0xF3,0xA9,\r\n\t0xE8,0xA0,0xC3,0x85,0xF4,0x84,0xF5,0xA2,0x04,0xA0,0x18,0xB1,0xF4,0x91,0xF2,0xC8,\r\n\t0xD0,0xF9,0xE6,0xF3,0xE6,0xF5,0xCA,0xD0,0xF2,0x20,0x27,0xF3,0x20,0x09,0xF3,0x20,\r\n\t0x3E,0xD7,0x58,0x20,0x45,0xD8,0x10,0xFB,0x78,0xC9,0x03,0xF0,0x68,0xC9,0x7F,0xD0,\r\n\t0x15,0xA9,0x08,0x20,0xEC,0xF2,0x30,0xE7,0x20,0xCA,0xF2,0xD0,0x15,0xA9,0x09,0x20,\r\n\t0x2A,0xD6,0xA9,0x7F,0xD0,0x04,0xC9,0x20,0x90,0x0A,0x20,0x2A,0xD6,0xA9,0x08,0x20,\r\n\t0x2A,0xD6,0xA9,0x09,0xC9,0x08,0x90,0xF2,0xC9,0x0C,0xF0,0xC3,0x90,0x12,0xC9,0x0E,\r\n\t0xF0,0xBD,0xC9,0x0D,0xD0,0xE4,0xA9,0x09,0x20,0xEC,0xF2,0x20,0xCA,0xF2,0xF0,0xF8,\r\n\t0x20,0xEC,0xF2,0x20,0xCA,0xF2,0xD0,0xF8,0xF0,0xA5,0x48,0x20,0x40,0xD7,0x18,0xA5,\r\n\t0x12,0x69,0x30,0x85,0xF8,0xA5,0x13,0x69,0x08,0x85,0xF9,0xAC,0x69,0x02,0xB1,0xF8,\r\n\t0xA8,0x68,0xC0,0x7F,0x60,0x28,0x20,0x25,0xF3,0x4C,0x20,0xF3,0x46,0xF2,0x20,0x2A,\r\n\t0xD6,0xAC,0x68,0x02,0xC0,0x01,0xF0,0x04,0xC0,0x1B,0xD0,0x0A,0x24,0xF2,0x30,0x08,\r\n\r\n\t0x66,0xF2,0x49,0x01,0xD0,0xE8,0x24,0xF2,0x60,0xA9,0x1E,0x20,0x2A,0xD6,0x20,0x06,\r\n\t0xD2,0x20,0xCA,0xF2,0xF0,0x0E,0xA9,0x09,0x20,0xEC,0xF2,0x10,0xF4,0x68,0x68,0x28,\r\n\t0x68,0x8D,0x6A,0x02,0x60,0x18,0x24,0x38,0x6E,0x72,0xC0,0x20,0x09,0xF3,0xA9,0x57,\r\n\t0xA0,0xC9,0x85,0xB4,0x84,0xB5,0xA9,0x00,0x85,0xF6,0x85,0xF7,0xA0,0x01,0x84,0x26,\r\n\t0x88,0x84,0x29,0x84,0x27,0x88,0x84,0x28,0xA4,0xF6,0xA6,0xF7,0xE6,0xF6,0xD0,0x02,\r\n\t0xE6,0xF7,0x20,0xD1,0x04,0xA0,0x00,0xB1,0xB6,0x85,0xF2,0xC8,0xB1,0xB6,0x85,0x91,\r\n\t0xC8,0xB1,0xB6,0x85,0x92,0xA2,0x00,0x2C,0x72,0xC0,0x10,0x14,0xE4,0xF2,0x8A,0xE8,\r\n\t0xF0,0x59,0xA8,0xB1,0x91,0x90,0x1C,0xA9,0x7F,0xAC,0x69,0x02,0x91,0x12,0xB0,0x11,\r\n\t0xAC,0x69,0x02,0xB1,0x12,0xC9,0x7F,0xD0,0x02,0xA9,0x20,0x9D,0x00,0xC1,0xE8,0xF0,\r\n\t0x3A,0xA9,0x09,0x20,0x2A,0xD6,0x20,0xCA,0xF2,0xF0,0xCC,0x2C,0x72,0xC0,0x30,0x1C,\r\n\t0x86,0xF2,0x8A,0x20,0x64,0xD2,0xA0,0x00,0xB9,0x00,0xC1,0x91,0xD1,0xC8,0xC4,0xF2,\r\n\t0xD0,0xF6,0xA0,0x02,0xB9,0xD0,0x00,0x91,0xB6,0x88,0x10,0xF8,0xA9,0x09,0x20,0xEC,\r\n\t0xF2,0x30,0x0B,0x20,0xCA,0xF2,0xD0,0xF4,0x4C,0x3C,0xF3,0x4C,0x77,0xE9,0x60,0xA5,\r\n\t0x0A,0x0A,0x69,0x08,0xD0,0x0B,0xA0,0x04,0xB1,0x9E,0x48,0xC8,0xB1,0x9E,0xA8,0x68,\r\n\t0x2C,0xA0,0x00,0x18,0x65,0x9E,0x85,0xF2,0x48,0x98,0x65,0x9F,0x85,0xF3,0xAA,0x68,\r\n\t0xA0,0x00,0x60,0xA0,0x00,0xA5,0x9F,0xC5,0xA1,0xF0,0x07,0xB1,0x9E,0xC8,0x31,0x9E,\r\n\r\n\t0x30,0x22,0xA6,0x9E,0xA4,0x9F,0xA9,0x02,0x85,0xF2,0xA9,0x88,0x20,0x56,0xF4,0xA0,\r\n\t0x00,0x8C,0x81,0xC0,0x98,0x91,0x9E,0xC8,0xD0,0xFB,0xA0,0x05,0xB9,0x25,0xCD,0x91,\r\n\t0x9E,0x88,0x10,0xF8,0x60,0x48,0x84,0xF3,0x86,0xF9,0x18,0xA0,0x86,0xB1,0x9E,0xC5,\r\n\t0xF9,0xC8,0xB1,0x9E,0xE5,0xF3,0x90,0x0F,0x88,0x18,0x68,0x48,0x71,0x9E,0x91,0x9E,\r\n\t0xC8,0xB1,0x9E,0x65,0xF2,0x91,0x9E,0x88,0x88,0x88,0xD0,0xE1,0x8A,0x65,0x9E,0xAA,\r\n\t0xA5,0xF3,0x65,0x9F,0xA8,0x68,0x86,0xCE,0x84,0xCF,0x18,0x65,0xA0,0x85,0xC7,0x48,\r\n\t0xA5,0xA0,0xA4,0xA1,0x85,0xC9,0xA5,0xA1,0x85,0xCA,0x65,0xF2,0x85,0xC8,0xA8,0x68,\r\n\t0x4C,0x5C,0xD1,0x48,0x20,0xF3,0xF3,0x68,0xAA,0x18,0x08,0x90,0x0A,0x18,0x24,0x38,\r\n\t0x08,0x20,0xF3,0xF3,0x20,0x7F,0xD2,0xE0,0x40,0xB0,0x1A,0x86,0x0A,0x20,0xCF,0xF3,\r\n\t0xC8,0x28,0xB1,0xF2,0xD0,0x0A,0xB0,0x0A,0xA2,0x0D,0x2C,0xA2,0x0E,0x4C,0x7E,0xD6,\r\n\t0xB0,0xF9,0x4C,0x9E,0xD3,0x4C,0x20,0xDE,0xA9,0x88,0xA0,0x00,0x20,0xE3,0xF3,0x85,\r\n\t0x06,0x86,0x07,0xA5,0x0A,0x0A,0x69,0x08,0xA8,0x20,0xD8,0xF3,0x85,0x00,0x18,0x69,\r\n\t0x17,0x85,0x02,0x85,0x04,0x8A,0x85,0x01,0x69,0x00,0x85,0x03,0x69,0x01,0x85,0x05,\r\n\t0xC8,0xB1,0x00,0x8D,0x83,0xC0,0x88,0xB1,0x00,0x85,0x0B,0x60,0x18,0x65,0x02,0x85,\r\n\t0x02,0x90,0x02,0xE6,0x03,0x60,0xA9,0x80,0x2C,0xA9,0x00,0x2C,0xA9,0x01,0x2C,0xA9,\r\n\t0x40,0x8D,0x82,0xC0,0xA9,0x06,0x20,0xE1,0xF3,0xB1,0xF2,0x85,0xF4,0xC8,0xB1,0xF2,\r\n\r\n\t0x85,0xF5,0x20,0xD6,0xF3,0xA5,0xF4,0x05,0xF5,0xF0,0x54,0xA5,0xF4,0xD0,0x02,0xC6,\r\n\t0xF5,0xC6,0xF4,0xA0,0x06,0x2C,0x82,0xC0,0x10,0x0C,0x38,0xB1,0xF2,0xE5,0x0A,0xD0,\r\n\t0x31,0xA8,0x91,0xF2,0xF0,0x2C,0x50,0x20,0xA0,0x00,0xB1,0xF2,0xD0,0x24,0xA5,0xF2,\r\n\t0xA4,0xF3,0x85,0xF4,0x84,0xF5,0x60,0xA0,0x09,0xAD,0x82,0xC0,0xD0,0xF0,0xB1,0xF2,\r\n\t0x99,0x76,0xC0,0x88,0x10,0xF8,0x30,0xE6,0x88,0x30,0xEC,0xB1,0xF2,0xD9,0x76,0xC0,\r\n\t0xF0,0xF6,0xA9,0x0A,0x18,0x65,0xF2,0x85,0xF2,0x90,0xAA,0xE6,0xF3,0xB0,0xA6,0x2C,\r\n\t0x82,0xC0,0x50,0x48,0xA0,0x04,0xB1,0x9E,0x48,0xAA,0xC8,0xB1,0x9E,0x48,0xA8,0x8A,\r\n\t0x20,0xE3,0xF3,0x20,0x2E,0xF5,0x68,0xA8,0x68,0xAA,0xA9,0x00,0x85,0xF2,0xA9,0x64,\r\n\t0x20,0x25,0xF4,0x38,0xA0,0x04,0xB1,0x9E,0xE9,0x64,0x91,0x9E,0xC8,0xB1,0x9E,0xE9,\r\n\t0x00,0x91,0x9E,0xA0,0x06,0xA9,0x09,0x71,0x9E,0x91,0x9E,0xC8,0xB1,0x9E,0x69,0x00,\r\n\t0x91,0x9E,0xA9,0x00,0xA0,0x63,0x91,0xF4,0x88,0x10,0xFB,0x60,0x30,0x06,0x4E,0x82,\r\n\t0xC0,0x90,0x02,0x18,0x60,0xA2,0x13,0x4C,0x7E,0xD6,0x20,0x40,0xF6,0x20,0xF3,0xF3,\r\n\t0xA9,0xD3,0x20,0x2E,0xD2,0x20,0x2E,0xED,0x20,0xE9,0xF4,0x20,0x7A,0xF6,0xAD,0x7C,\r\n\t0xC0,0x85,0x0A,0x20,0xA8,0xF4,0xAD,0x7D,0xC0,0x20,0xDC,0xF4,0xA6,0x0B,0xCA,0xD0,\r\n\t0x08,0xAE,0x7F,0xC0,0xAC,0x7E,0xC0,0xD0,0x0E,0xA0,0x00,0xB1,0x02,0xC8,0xAA,0xB1,\r\n\t0x02,0xA8,0xA9,0x02,0x20,0xDC,0xF4,0x84,0xF5,0x8A,0x30,0x29,0xD0,0x0C,0xA5,0x02,\r\n\r\n\t0xA4,0x03,0x20,0xBA,0xD2,0x4C,0x20,0xF6,0xEA,0xEA,0x0A,0x0A,0xA0,0x00,0xB1,0x02,\r\n\t0xA8,0x85,0xF2,0xA9,0x00,0xB0,0x06,0xA0,0x01,0xB1,0x02,0xA4,0xF2,0x20,0x54,0xD2,\r\n\t0xA5,0x29,0x4C,0xFE,0xD1,0xA5,0xF5,0x20,0x64,0xD2,0xA8,0xF0,0x08,0x88,0xB1,0x02,\r\n\t0x91,0xD1,0x98,0xD0,0xF8,0x4C,0x8E,0xEE,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xA2,0x0A,0xA9,0x00,0x9D,0x75,0xC0,0xCA,0xD0,0xFA,0xA5,0x0A,0x8D,0x7C,0xC0,0x20,\r\n\t0x9E,0xD3,0x4C,0x58,0xF6,0x20,0x98,0xD3,0xF0,0x72,0xC9,0x80,0xB0,0x6E,0xC9,0x28,\r\n\t0xF0,0x0A,0xE0,0x05,0xF0,0xEF,0x9D,0x76,0xC0,0xE8,0xD0,0xE9,0x20,0x98,0xD3,0x20,\r\n\t0x7F,0xD2,0x8E,0x7B,0xC0,0xA9,0x29,0x4C,0x2E,0xD2,0xAD,0x7F,0xC0,0x8D,0x7F,0xC0,\r\n\t0x0A,0x4C,0x1C,0xD2,0xA9,0x00,0x85,0xF2,0x8D,0x85,0xC0,0x85,0x08,0x85,0x09,0xAD,\r\n\t0x83,0xC0,0xA2,0x08,0x85,0xF3,0x46,0xF3,0x90,0x15,0x18,0xA5,0x33,0x6D,0x85,0xC0,\r\n\t0x8D,0x85,0xC0,0xA5,0x34,0x65,0x08,0x85,0x08,0xA5,0xF2,0x65,0x09,0x85,0x09,0x06,\r\n\t0x33,0x26,0x34,0x26,0xF2,0xCA,0xD0,0xDE,0x20,0xCD,0xF6,0x20,0xA8,0xF4,0x18,0xAD,\r\n\t0x85,0xC0,0x65,0x06,0x85,0x06,0x90,0x02,0xE6,0x07,0xA0,0x00,0x60,0x20,0xA8,0xF4,\r\n\t0x18,0xA5,0x08,0xA6,0x09,0x69,0x02,0x90,0x01,0xE8,0xA0,0x0A,0x38,0xF1,0x04,0x48,\r\n\t0xC8,0x8A,0xF1,0x04,0xA8,0x68,0x90,0x03,0x20,0x5A,0xF7,0xA2,0xFF,0x18,0xA5,0x08,\r\n\t0x69,0x05,0x85,0x08,0x90,0x02,0xE6,0x09,0x38,0xA5,0x08,0xA8,0xE9,0x7F,0x85,0x08,\r\n\r\n\t0xA5,0x09,0xE9,0x00,0x85,0x09,0xE8,0xB0,0xF0,0xC8,0x98,0x0A,0x8D,0x84,0xC0,0x85,\r\n\t0xF8,0x8A,0x48,0x20,0xA8,0xF4,0x68,0x18,0x65,0x05,0x85,0x05,0x85,0xF7,0xAC,0x84,\r\n\t0xC0,0x20,0x36,0xF7,0x4C,0x36,0xF7,0x20,0xA8,0xF4,0xA5,0xF7,0x85,0x05,0xA4,0xF8,\r\n\t0x20,0x33,0xF7,0xA2,0xA8,0x2C,0xA2,0x88,0xB1,0x04,0x8D,0x01,0xC0,0xC8,0xB1,0x04,\r\n\t0x8D,0x02,0xC0,0xA5,0x06,0x8D,0x03,0xC0,0xA5,0x07,0x8D,0x04,0xC0,0xE6,0x07,0xC8,\r\n\t0xD0,0x04,0xE6,0x05,0xA0,0x02,0x4C,0x75,0xDA,0x60,0x8D,0x58,0xC0,0x8C,0x59,0xC0,\r\n\t0x0D,0x59,0xC0,0xF0,0xF4,0x20,0x4C,0xDA,0x20,0xA8,0xF4,0xA0,0x02,0xB1,0x00,0xF0,\r\n\t0x14,0x18,0x65,0x05,0x85,0x05,0xC6,0x05,0xA0,0x00,0xB1,0x04,0xAA,0xC8,0xB1,0x04,\r\n\t0xC8,0xE6,0x05,0xD0,0x0A,0xA0,0x13,0xB1,0x00,0xAA,0xC8,0xB1,0x00,0xA0,0x0C,0x8E,\r\n\t0x01,0xC0,0x8D,0x02,0xC0,0x20,0x5F,0xF8,0xC8,0xB1,0x04,0xF0,0x05,0xC8,0xD0,0xF8,\r\n\t0xF0,0x34,0x88,0xAD,0x58,0xC0,0x0D,0x59,0xC0,0xF0,0x57,0x20,0x5F,0xF8,0xAD,0x58,\r\n\t0xC0,0xD0,0x03,0xCE,0x59,0xC0,0xCE,0x58,0xC0,0x8C,0x5F,0xC0,0x20,0x38,0xF8,0x84,\r\n\t0xF2,0xAC,0x5F,0xC0,0x91,0x04,0xC8,0xA5,0xF2,0x91,0x04,0xC8,0xD0,0xD5,0xAD,0x58,\r\n\t0xC0,0x0D,0x59,0xC0,0xF0,0x2C,0x20,0x4C,0xF8,0x85,0xF5,0x84,0xF6,0xA0,0x00,0x91,\r\n\t0x04,0xC8,0xA5,0xF6,0x91,0x04,0x20,0xA4,0xDA,0xA5,0xF5,0xA4,0xF6,0x8D,0x01,0xC0,\r\n\t0x8C,0x02,0xC0,0x20,0x6A,0xF8,0xA9,0x00,0xA8,0x91,0x04,0xC8,0xD0,0xFB,0xA0,0x02,\r\n\r\n\t0xD0,0xA1,0x20,0xA4,0xDA,0xA0,0x06,0xB1,0x00,0x99,0x22,0xC0,0xC8,0xC0,0x17,0xD0,\r\n\t0xF6,0x20,0x30,0xDB,0xD0,0x03,0x4C,0xDD,0xE0,0x20,0xEE,0xDA,0x20,0x8A,0xDA,0x20,\r\n\t0x82,0xDA,0x20,0xA8,0xF4,0xA0,0x13,0xB1,0x00,0x8D,0x01,0xC0,0xC8,0xB1,0x00,0x8D,\r\n\t0x02,0xC0,0x20,0x5F,0xF8,0x4C,0xA4,0xDA,0xA0,0x0A,0xE6,0x03,0xB1,0x02,0x18,0x69,\r\n\t0x01,0x91,0x02,0xC8,0xB1,0x02,0x69,0x00,0x91,0x02,0xC6,0x03,0xA0,0x15,0xB1,0x00,\r\n\t0x18,0x69,0x01,0x91,0x00,0xC8,0xB1,0x00,0x69,0x00,0x91,0x00,0x4C,0x6C,0xDC,0xA5,\r\n\t0x04,0x8D,0x03,0xC0,0xA5,0x05,0x8D,0x04,0xC0,0x60,0xE6,0x05,0x18,0xA0,0x02,0xB1,\r\n\t0x00,0x69,0x01,0x91,0x00,0xA5,0x04,0xA4,0x05,0x20,0x85,0xF8,0xA9,0x01,0x85,0xF2,\r\n\t0xA9,0x00,0x4C,0x25,0xF4,0x38,0xE5,0x9E,0xAA,0x98,0xE5,0x9F,0xA8,0x60,0x20,0x4C,\r\n\t0xD2,0xA5,0xD4,0xA6,0xD3,0x10,0x0C,0x49,0xFF,0x18,0x69,0x01,0xE0,0xFF,0xF0,0x07,\r\n\t0x4C,0x20,0xDE,0xE0,0x00,0xD0,0xF9,0x20,0x73,0xF4,0x20,0xA8,0xF4,0x30,0x23,0xD0,\r\n\t0x1E,0xAD,0x83,0xC0,0x24,0xD3,0x30,0x0B,0xA0,0x04,0xB1,0x04,0x48,0xC8,0xB1,0x04,\r\n\t0xA8,0x68,0x2C,0xA0,0x00,0x24,0xA8,0x85,0xF2,0x98,0xA4,0xF2,0x4C,0x54,0xD2,0x4C,\r\n\t0xE0,0xE0,0x20,0x0E,0xFD,0xF0,0xEF,0x24,0xD3,0x30,0xE8,0xA9,0x00,0xF0,0xE4,0x20,\r\n\t0x56,0xF9,0xD0,0x06,0x20,0x6B,0xF9,0x4C,0x73,0xDA,0xB0,0x11,0x20,0x1F,0xF9,0x08,\r\n\t0x78,0x20,0x84,0xF6,0xB1,0x06,0x91,0x02,0xC8,0xD0,0xF9,0x28,0x60,0x20,0x2E,0xED,\r\n\r\n\t0x20,0xD9,0xFD,0x8A,0x20,0x7D,0xF6,0xA5,0x06,0xA4,0x07,0x85,0x02,0x84,0x03,0x20,\r\n\t0xDC,0xF5,0x20,0x9E,0xD3,0xF0,0xE5,0x20,0x2C,0xD2,0x4C,0xFD,0xF8,0x18,0x24,0x38,\r\n\t0x08,0x20,0xFA,0xD2,0xA0,0x04,0xB1,0x04,0xC5,0x33,0xC8,0xB1,0x04,0xE5,0x34,0xB0,\r\n\t0x08,0x28,0x90,0x07,0xA2,0x10,0x4C,0x7E,0xD6,0x28,0x60,0xA0,0x04,0xA5,0x33,0x91,\r\n\t0x04,0xC8,0xA5,0x34,0x91,0x04,0x20,0x5F,0xF8,0xA0,0x13,0xB1,0x00,0x48,0xC8,0xB1,\r\n\t0x00,0xA8,0x68,0x4C,0x9E,0xDA,0x20,0x7D,0xF4,0x20,0x2C,0xD2,0x20,0xA8,0xF4,0x48,\r\n\t0xA0,0x06,0xB1,0x00,0x8D,0x00,0xC0,0x68,0xC9,0x01,0x60,0x20,0x7F,0xD2,0x8E,0x01,\r\n\t0xC0,0x20,0x2C,0xD2,0x20,0x7F,0xD2,0x8E,0x02,0xC0,0xF0,0x06,0x20,0x2C,0xD2,0x20,\r\n\t0x0D,0xE6,0x20,0xA8,0xF4,0xA5,0x02,0xA4,0x03,0x8D,0x03,0xC0,0x8C,0x04,0xC0,0x60,\r\n\t0x20,0x0D,0xE6,0x4C,0x4C,0xDA,0x20,0x0D,0xE6,0x4C,0x8A,0xDA,0x20,0x7F,0xD2,0x8A,\r\n\t0x48,0x29,0x7F,0xCD,0x06,0xC2,0xB0,0x20,0x20,0x2C,0xD2,0x20,0x7F,0xD2,0x8A,0xCA,\r\n\t0x30,0x16,0xEC,0x07,0xC2,0xB0,0x11,0xA8,0x68,0x4C,0x15,0xDD,0x20,0x6C,0xDC,0x48,\r\n\t0x98,0x20,0xED,0xD7,0x68,0x4C,0xEA,0xD7,0x4C,0x20,0xDE,0x20,0x56,0xF9,0xD0,0x06,\r\n\t0x20,0x6B,0xF9,0x4C,0xA4,0xDA,0xB0,0x17,0x20,0x1D,0xF9,0x08,0x78,0x20,0x84,0xF6,\r\n\t0xB1,0x02,0x91,0x06,0xC8,0xCC,0x83,0xC0,0xD0,0xF6,0x20,0x27,0xF7,0x28,0x60,0x20,\r\n\t0x24,0xD2,0x20,0x0E,0xFD,0xD0,0x24,0xA2,0x05,0xA0,0x00,0x24,0x28,0x10,0x0D,0xA5,\r\n\r\n\t0xD3,0xA6,0xD4,0x85,0x91,0x86,0x92,0xB1,0x91,0xAA,0xA0,0x80,0x8C,0x7F,0xC0,0x20,\r\n\t0x39,0xFA,0xA9,0xFF,0x20,0xCC,0xFD,0x91,0x02,0x30,0x10,0x20,0xD9,0xFD,0x48,0x8A,\r\n\t0x20,0x7D,0xF6,0x20,0x2A,0xFD,0x68,0xAA,0x20,0x39,0xFA,0x20,0x9E,0xD3,0xF0,0x06,\r\n\t0x20,0x2C,0xD2,0x4C,0xEF,0xF9,0x4C,0x46,0xFD,0x8E,0x7E,0xC0,0xA5,0x06,0xA4,0x07,\r\n\t0x85,0x02,0x84,0x03,0x18,0xA0,0x00,0x20,0x9E,0xFC,0x20,0xA8,0xF4,0x4C,0x38,0xFE,\r\n\t0x48,0x20,0x98,0xD3,0x20,0x2C,0xD2,0x68,0xC9,0x44,0xD0,0x20,0xAD,0x09,0xC0,0x8D,\r\n\t0x00,0xC0,0x20,0x7F,0xF4,0xF0,0x06,0x20,0x2C,0xD2,0x20,0x0D,0xE6,0xA9,0x00,0xA0,\r\n\t0x01,0x20,0xCB,0xFA,0xA0,0x06,0xAD,0x00,0xC0,0x91,0x00,0x60,0xC9,0x52,0xD0,0x12,\r\n\t0xA9,0x00,0xA0,0x08,0x20,0x08,0xFB,0xD0,0xF2,0x20,0x2C,0xD2,0x4C,0xD8,0xF9,0x4C,\r\n\t0x23,0xDE,0xC9,0x53,0xD0,0xF9,0xA9,0x80,0xA0,0x10,0x20,0x08,0xFB,0x08,0xA0,0x03,\r\n\t0xA9,0x0C,0x91,0x00,0xC8,0xA9,0x00,0x91,0x00,0xC8,0x91,0x00,0x28,0xD0,0x09,0xA0,\r\n\t0x00,0xA9,0xFF,0x91,0x02,0x4C,0x46,0xFD,0x4C,0x44,0xFD,0x20,0xC0,0xFA,0x30,0xDD,\r\n\t0x20,0x7D,0xF4,0x20,0xA8,0xF4,0x30,0xB3,0x4C,0xE0,0xE0,0x48,0x98,0x48,0xA0,0x05,\r\n\t0xB1,0x9E,0xD0,0x02,0xA0,0x03,0x88,0xB1,0x9E,0xAA,0x48,0xC8,0xB1,0x9E,0x48,0xA8,\r\n\t0xA9,0x01,0x85,0xF2,0xA9,0x21,0x20,0x25,0xF4,0x20,0xCF,0xF3,0xC8,0x68,0x91,0xF2,\r\n\t0x88,0x68,0x91,0xF2,0x20,0xA8,0xF4,0x68,0x91,0x00,0x68,0xC8,0x91,0x00,0x8D,0x83,\r\n\r\n\t0xC0,0x60,0x4C,0xE0,0xE0,0x4C,0x20,0xDE,0x85,0x0B,0x84,0xF9,0x20,0x4F,0xD4,0x20,\r\n\t0x9E,0xD7,0x20,0x2C,0xD2,0x20,0x7F,0xF4,0x20,0x2D,0xDB,0x08,0xD0,0x22,0xA2,0x00,\r\n\t0x24,0x0B,0x30,0x0A,0x20,0x2C,0xD2,0x20,0x7F,0xD2,0xE0,0x03,0x90,0xD7,0xA9,0x00,\r\n\t0x8D,0x52,0xC0,0x8D,0x53,0xC0,0xA8,0x8A,0xA6,0xF9,0x20,0x00,0xDE,0x20,0x30,0xDB,\r\n\t0xBD,0x0C,0xC3,0xBC,0x0D,0xC3,0x20,0x5D,0xDA,0xAD,0x03,0xC1,0xC5,0xF9,0xD0,0xB2,\r\n\t0xAD,0x06,0xC1,0xA4,0x0B,0x20,0xCB,0xFA,0xA0,0x07,0xAE,0x27,0xC0,0xBD,0x00,0xC3,\r\n\t0x91,0x00,0xE8,0xC8,0xC0,0x17,0xD0,0xF5,0xA9,0xFF,0xA0,0x02,0x91,0x00,0xC6,0x05,\r\n\t0x20,0x6A,0xF8,0x20,0x5F,0xF8,0x20,0x73,0xDA,0xA0,0x00,0xB1,0x04,0x8D,0x01,0xC0,\r\n\t0xC8,0xB1,0x04,0x8D,0x02,0xC0,0xD0,0xE8,0x20,0x74,0xFA,0x28,0x60,0xF0,0x11,0x20,\r\n\t0x7D,0xF4,0x20,0xAF,0xFB,0x20,0x9E,0xD3,0xF0,0x14,0x20,0x2C,0xD2,0x4C,0x8F,0xFB,\r\n\t0x20,0xF3,0xF3,0xA9,0x63,0x85,0x0A,0x20,0xAF,0xFB,0xC6,0x0A,0x10,0xF9,0x60,0x20,\r\n\t0xCF,0xF3,0x98,0xC8,0x91,0xF2,0x4C,0xE6,0xF4,0x4C,0xE0,0xE0,0x4C,0x23,0xDE,0x20,\r\n\t0x7D,0xF4,0x20,0x2C,0xD2,0x20,0xA8,0xF4,0x30,0xEF,0xAD,0x80,0xC0,0xC5,0x0A,0xF0,\r\n\t0x05,0xA9,0x00,0x8D,0x81,0xC0,0x20,0x40,0xF6,0xA9,0xC3,0x20,0x2E,0xD2,0xF0,0xDC,\r\n\t0x48,0x20,0x98,0xD3,0x68,0xA0,0x00,0xA2,0x05,0xC9,0xC0,0xF0,0x1A,0xA2,0x02,0xC8,\r\n\t0xC9,0x25,0xF0,0x13,0xCA,0xA0,0x40,0xC9,0x4F,0xF0,0x0C,0xC9,0x24,0xD0,0xBD,0x20,\r\n\r\n\t0x7F,0xD2,0x8A,0xF0,0x4F,0xA0,0x80,0x8C,0x7F,0xC0,0x8E,0x7E,0xC0,0xAD,0x81,0xC0,\r\n\t0xA4,0x0A,0x8D,0x7D,0xC0,0x8C,0x7C,0xC0,0x18,0xA6,0x0B,0xD0,0x05,0x69,0x02,0x20,\r\n\t0x57,0xFC,0x6D,0x7E,0xC0,0x20,0x57,0xFC,0x8D,0x81,0xC0,0x20,0xEC,0xF4,0xB0,0x03,\r\n\t0x20,0xEF,0xF4,0xA0,0x09,0xB9,0x76,0xC0,0x91,0xF4,0x88,0x10,0xF8,0xA2,0x00,0x20,\r\n\t0x9E,0xD3,0xD0,0x04,0x8E,0x81,0xC0,0x60,0x20,0x2E,0xD2,0xD0,0x89,0xA5,0x0A,0x8D,\r\n\t0x80,0xC0,0x18,0x60,0x4C,0x20,0xDE,0xF0,0x10,0xB0,0x13,0xAE,0x83,0xC0,0xF0,0xF2,\r\n\t0xCD,0x83,0xC0,0xF0,0xED,0x90,0xEB,0xB0,0x05,0xAE,0x83,0xC0,0xF0,0xE4,0xA2,0x11,\r\n\t0x4C,0x7E,0xD6,0x18,0x24,0x38,0x08,0x20,0xF3,0xF3,0x20,0x40,0xF6,0xA9,0xD5,0x20,\r\n\t0x2E,0xD2,0x20,0x24,0xD2,0x20,0xE9,0xF4,0x20,0x7A,0xF6,0x20,0xA8,0xF4,0xAD,0x7C,\r\n\t0xC0,0x85,0x0A,0xAC,0x7D,0xC0,0xAE,0x7E,0xC0,0xA5,0x0B,0xD0,0x0C,0x28,0x08,0xAD,\r\n\t0x7F,0xC0,0x91,0x02,0xC8,0x8A,0x91,0x02,0xC8,0x98,0x20,0xDC,0xF4,0x28,0xA0,0x00,\r\n\t0xAD,0x7F,0xC0,0x30,0x22,0xF0,0x19,0x20,0x4C,0xD2,0xA0,0x00,0xA5,0xD4,0x91,0x02,\r\n\t0x2C,0x7F,0xC0,0x50,0x05,0xA5,0xD3,0xD0,0x8B,0x60,0xC8,0xA5,0xD3,0x91,0x02,0x60,\r\n\t0xA6,0x02,0xA4,0x03,0x4C,0xC2,0xD2,0x08,0x20,0x74,0xD2,0x85,0xD0,0xAC,0x7E,0xC0,\r\n\t0xF0,0x07,0xA9,0x20,0x88,0x91,0x02,0xD0,0xFB,0x28,0xB0,0x0E,0xEA,0xEA,0xC4,0xD0,\r\n\t0xB0,0x07,0xB1,0x91,0x91,0x02,0xC8,0xD0,0xF5,0x60,0xA4,0xD0,0xF0,0x0F,0x88,0xC6,\r\n\r\n\t0xD0,0xB1,0x91,0xCE,0x7E,0xC0,0xAC,0x7E,0xC0,0x91,0x02,0xD0,0xED,0x60,0x20,0xA8,\r\n\t0xF4,0xA0,0x03,0xB1,0x00,0x8D,0x86,0xC0,0xC8,0xB1,0x00,0x8D,0x87,0xC0,0xC8,0xB1,\r\n\t0x00,0x8D,0x88,0xC0,0xA8,0xB1,0x02,0xC9,0xFF,0x60,0x20,0xA8,0xF4,0xA0,0x05,0xAD,\r\n\t0x88,0xC0,0x91,0x00,0x88,0xAD,0x87,0xC0,0x91,0x00,0x88,0xAD,0x86,0xC0,0xD1,0x00,\r\n\t0x91,0x00,0xF0,0xE5,0x18,0x24,0x38,0x08,0x20,0xA8,0xF4,0xA5,0x02,0xA4,0x03,0x8D,\r\n\t0x03,0xC0,0x8C,0x04,0xC0,0xA0,0x04,0xB1,0x00,0x18,0x65,0x05,0x85,0x05,0x88,0xB1,\r\n\t0x00,0xA8,0xB1,0x04,0x48,0xC8,0xB1,0x04,0xA8,0x68,0x28,0x90,0x03,0x4C,0x9E,0xDA,\r\n\t0x4C,0x6D,0xDA,0x20,0xCC,0xFD,0x91,0x02,0x38,0x24,0x18,0x20,0xCC,0xFD,0xC8,0xD0,\r\n\t0x42,0x90,0x21,0x20,0x46,0xFD,0xA0,0x02,0xB1,0x00,0xA0,0x04,0xD1,0x00,0xD0,0x14,\r\n\t0x88,0xB1,0x00,0xA8,0xC8,0xC8,0xF0,0x05,0xC8,0xB1,0x04,0xD0,0x07,0xA9,0x03,0xA0,\r\n\t0x00,0x20,0x5A,0xF7,0x20,0xA8,0xF4,0xA0,0x03,0xB1,0x00,0x18,0x69,0x02,0xD0,0x0A,\r\n\t0xA0,0x04,0xB1,0x00,0x69,0x00,0x91,0x00,0xA9,0x02,0xA0,0x03,0x91,0x00,0x20,0x44,\r\n\t0xFD,0xA0,0x00,0x98,0xA0,0x05,0x91,0x00,0xA8,0xB1,0x02,0x60,0xA0,0x05,0x48,0xB1,\r\n\t0x00,0xA8,0x68,0x60,0xA2,0x0F,0x4C,0x7E,0xD6,0x20,0x0E,0xFD,0xF0,0xF6,0xA0,0x00,\r\n\t0x91,0x06,0x20,0x7A,0xFD,0xA0,0x01,0x91,0x06,0xC8,0x84,0xF5,0x85,0xF6,0xE6,0xF6,\r\n\t0x20,0x7A,0xFD,0xA4,0xF5,0xE6,0xF5,0x91,0x06,0xC6,0xF6,0xD0,0xF3,0xA0,0x00,0xB1,\r\n\r\n\t0x06,0xAA,0xC8,0xB1,0x06,0x60,0xEA,0x20,0xC0,0xFA,0xA9,0xFF,0x85,0x33,0x85,0x34,\r\n\t0x30,0x09,0x20,0xC0,0xFA,0x20,0x2C,0xD2,0x20,0xFA,0xD2,0x08,0x78,0xA5,0x33,0x05,\r\n\t0x34,0xF0,0x13,0xA5,0x33,0xD0,0x02,0xC6,0x34,0xC6,0x33,0x20,0x0E,0xFD,0xF0,0x06,\r\n\t0x20,0xD9,0xFD,0x4C,0x1D,0xFE,0x28,0x60,0xA0,0x00,0xB1,0x06,0x20,0x73,0xFD,0xA0,\r\n\t0x01,0xB1,0x06,0xC8,0x84,0xF7,0x85,0xF8,0xE6,0xF8,0x20,0x73,0xFD,0xA4,0xF7,0xB1,\r\n\t0x06,0xE6,0xF7,0xC6,0xF8,0xD0,0xF3,0x60,0x46,0xF2,0x46,0xF4,0xA2,0x0C,0xCA,0x30,\r\n\t0x22,0xBD,0x91,0xC0,0x9D,0x29,0xC0,0xBC,0x9E,0xC0,0xC9,0x3F,0xF0,0x08,0xC0,0x3F,\r\n\t0xD0,0xEC,0x66,0xF2,0xD0,0xE8,0x66,0xF4,0x24,0x16,0x70,0xE2,0xC0,0x3F,0xF0,0xDE,\r\n\t0x4C,0xAC,0xD5,0x24,0xF2,0x10,0x0C,0xA2,0x0C,0xBD,0x9D,0xC0,0xC9,0x3F,0xD0,0xF0,\r\n\t0xCA,0xD0,0xF6,0x58,0x60,0x20,0xC5,0xE7,0x20,0xC0,0xFA,0x20,0x02,0xD3,0x10,0x0C,\r\n\t0x20,0x3D,0xFF,0xC9,0x20,0xF0,0x05,0xC9,0x03,0xD0,0xF5,0x60,0x20,0x0E,0xFD,0xF0,\r\n\t0x16,0x20,0xD9,0xFD,0xF0,0xE5,0x85,0xF2,0x8A,0x10,0x0F,0xC8,0xB1,0x06,0x20,0x2A,\r\n\t0xD6,0xC6,0xF2,0xD0,0xF6,0xF0,0xD4,0x4C,0xD6,0xE7,0x18,0xA5,0x06,0xA4,0x07,0x69,\r\n\t0x02,0x90,0x01,0xC8,0x20,0xBA,0xD2,0x20,0xD2,0xD2,0x20,0x37,0xD6,0x4C,0x9B,0xFE,\r\n\t0x20,0x07,0xFE,0x20,0x00,0xFF,0x20,0x3D,0xFF,0xA4,0xF2,0xC9,0x03,0xF0,0x48,0xC9,\r\n\t0x0D,0xD0,0x05,0x20,0x1B,0xFF,0xA9,0x0A,0x20,0x1B,0xFF,0x84,0xF2,0x4C,0xE6,0xFE,\r\n\r\n\t0x20,0xA8,0xF4,0xA9,0x80,0x91,0x06,0xC8,0xA9,0xD8,0x91,0x06,0xA9,0x00,0xC8,0x84,\r\n\t0xF2,0x91,0x06,0xC8,0xC0,0xDA,0xD0,0xF9,0xA0,0x02,0x60,0x91,0x06,0x20,0x2A,0xD6,\r\n\t0xC8,0xC0,0xDA,0xD0,0xF5,0x20,0x38,0xFE,0xA9,0xFF,0x20,0xCC,0xFD,0x91,0x02,0x20,\r\n\t0x46,0xFD,0xA0,0x02,0x4C,0x00,0xFF,0x20,0x25,0xFF,0x4C,0x46,0xFD,0x20,0x45,0xD8,\r\n\t0x10,0xFB,0x60,0x4C,0x36,0xED,0x4C,0x98,0xD3,0x4C,0x9E,0xD3,0x4C,0x4F,0xD4,0x4C,\r\n\t0x51,0xD4,0x4C,0x64,0xD3,0x4C,0xF3,0xF3,0x4C,0xA8,0xF4,0x4C,0xD9,0xFD,0x4C,0x38,\r\n\t0xFE,0x4C,0x46,0xFD,0x4C,0x2A,0xD6,0x4C,0x13,0xD6,0x4C,0x37,0xD6,0x4C,0xD8,0xD5,\r\n\t0x4C,0xEA,0xE0,0x4C,0xE5,0xE0,0x4C,0x28,0xDE,0x4C,0xE6,0xDF,0x4C,0x9C,0xDE,0x4C,\r\n\t0x66,0xE2,0x4C,0x2D,0xDD,0x4C,0x15,0xDD,0x4C,0x6C,0xDC,0x4C,0xC0,0xDB,0x4C,0x59,\r\n\t0xDB,0x4C,0xA5,0xDB,0x4C,0x41,0xDB,0x4C,0x30,0xDB,0x4C,0x2D,0xDB,0x4C,0x07,0xDB,\r\n\t0x4C,0xFE,0xDA,0x4C,0xEE,0xDA,0x4C,0xCE,0xDA,0x4C,0xA4,0xDA,0x4C,0x9E,0xDA,0x4C,\r\n\t0x91,0xDA,0x4C,0x82,0xDA,0x4C,0x8A,0xDA,0x4C,0x73,0xDA,0x4C,0x6D,0xDA,0x4C,0x5D,\r\n\t0xDA,0x4C,0x4C,0xDA,0x4C,0xCD,0xCF,0x53,0x45,0x44,0x4F,0x52,0x49,0x43,0x20,0x31,\r\n\t0x2E,0x30,0x20,0x70,0x61,0x72,0x20,0x46,0x2E,0x42,0x52,0x4F,0x43,0x48,0x45,0x20,\r\n\t0x65,0x74,0x20,0x44,0x2E,0x53,0x45,0x42,0x42,0x41,0x47,0x28,0x63,0x29,0x20,0x31,\r\n\t0x39,0x38,0x35,0x20,0x45,0x55,0x52,0x45,0x4B,0x41,0x21,0xD1,0x10,0x23,0x7B,0xB9,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0xC4,0xFF,0xC7,0x00,0x00,0x04,0x00,0x03,0x0F,0x03,0x10,\r\n\t0x03,0x11,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0x00,0x00,0x4C,0x32,0xC4,0x4C,0xEC,0xC6,0x4C,0x56,0xC7,0xA2,0x03,0xBD,\r\n\t0x3E,0xC0,0x9D,0xE4,0xC6,0xCA,0x10,0xF7,0x8E,0xEA,0xC6,0x8E,0xEB,0xC6,0xE8,0x8E,\r\n\t0xE8,0xC6,0x8E,0xE9,0xC6,0x60,0x20,0x98,0xD3,0xE8,0xE8,0xE0,0x08,0xD0,0x06,0x4C,\r\n\t0x23,0xDE,0x20,0x0D,0xC4,0x20,0x9E,0xD3,0xF0,0x14,0xC9,0x2C,0xF0,0xE8,0x86,0xF2,\r\n\t0x20,0xFA,0xD2,0xA6,0xF2,0x9D,0xE5,0xC6,0x98,0x9D,0xE4,0xC6,0x90,0xE7,0xA5,0xA6,\r\n\t0xA4,0xA7,0x85,0x04,0x84,0x05,0xA5,0x9A,0xA4,0x9B,0x85,0x00,0x84,0x01,0xA5,0x9C,\r\n\t0xA4,0x9D,0x85,0x02,0x84,0x03,0x20,0xA8,0xC4,0x4C,0xB4,0xE0,0x86,0x33,0x85,0x34,\r\n\t0xA5,0x00,0xA6,0x01,0x4C,0xDC,0xC6,0x91,0xF4,0xE6,0xE9,0xD0,0x02,0xE6,0xEA,0xE6,\r\n\t0xF4,0xD0,0x0D,0xE6,0xF5,0x60,0x98,0x18,0x65,0x08,0x85,0x08,0x90,0x02,0xE6,0x09,\r\n\t0x60,0x98,0x18,0x65,0x0A,0x85,0x0A,0x90,0xF7,0xE6,0x0B,0x60,0x18,0xA9,0x05,0x65,\r\n\t0xF4,0x85,0xF4,0x90,0xEB,0xE6,0xF5,0x60,0x78,0xA4,0x01,0xA6,0x00,0xD0,0x01,0x88,\r\n\t0xCA,0x86,0xCE,0x84,0xCF,0x86,0x08,0x84,0x09,0x86,0x0A,0x84,0x0B,0xA5,0x02,0xA4,\r\n\t0x03,0x85,0xC9,0x84,0xCA,0xA5,0x04,0xA4,0x05,0x85,0xC7,0x84,0xC8,0x20,0xD4,0xC6,\r\n\t0xE6,0xC8,0xA5,0xC7,0xA4,0xC8,0x85,0xE9,0x84,0xEA,0xA5,0xCE,0xA4,0xCF,0x85,0xF4,\r\n\t0x84,0xF5,0xA9,0xF3,0xA0,0x00,0x85,0xF8,0x84,0xF9,0xA0,0x00,0xB1,0xE9,0xD0,0x25,\r\n\t0xA0,0x02,0xB1,0xE9,0xF0,0x0E,0xA0,0x00,0xA2,0x04,0xB1,0xE9,0x20,0x77,0xC4,0xCA,\r\n\r\n\t0x10,0xF8,0x30,0xE6,0x91,0xF4,0x88,0x10,0xFB,0xA0,0x04,0x91,0xF8,0x4C,0x99,0xC5,\r\n\t0x20,0x77,0xC4,0xD0,0xD5,0xC9,0x97,0xF0,0x14,0xC9,0x9B,0xF0,0x10,0xC9,0xC8,0xF0,\r\n\t0x0C,0xC9,0xC9,0xF0,0x08,0xC9,0x9A,0xF0,0x04,0xC9,0x98,0xD0,0xE3,0x20,0x77,0xC4,\r\n\t0xB1,0xE9,0xF0,0xB6,0xC9,0x20,0xF0,0xF5,0xC9,0x30,0x90,0xD4,0xC9,0x97,0xF0,0xED,\r\n\t0xC9,0x9B,0xF0,0xE9,0xC9,0x3A,0xB0,0xC8,0xC8,0xB1,0xE9,0xF0,0x1A,0xC9,0x27,0xF0,\r\n\t0x16,0xC9,0x30,0x90,0x06,0xC9,0x3A,0x90,0xEF,0xF0,0x0C,0xC9,0xC8,0xF0,0x08,0xC9,\r\n\t0x2C,0xF0,0x04,0xC9,0x20,0xD0,0x83,0x48,0xA9,0x00,0x91,0xE9,0xA6,0xF4,0x8A,0xA0,\r\n\t0x03,0x91,0xF8,0xC8,0xA5,0xF5,0x91,0xF8,0x86,0xF8,0x85,0xF9,0x20,0xFA,0xD2,0xA0,\r\n\t0x02,0x91,0xF4,0x88,0xA5,0x33,0x91,0xF4,0x88,0xA9,0xFF,0x91,0xF4,0x20,0x9C,0xC4,\r\n\t0x68,0x91,0xE9,0xC9,0x2C,0xF0,0x96,0xD0,0xCC,0xA6,0x00,0xA5,0x01,0x18,0xA0,0x01,\r\n\t0x86,0xF4,0x85,0xF5,0xB1,0xF4,0xF0,0x22,0xA0,0x03,0xC8,0xB1,0xF4,0xF0,0x0A,0xC9,\r\n\t0xFF,0xD0,0xF7,0x98,0x69,0x04,0xA8,0x90,0xF2,0x98,0x38,0x65,0xF4,0xAA,0xA0,0x00,\r\n\t0x91,0xF4,0x98,0x65,0xF5,0xC8,0x91,0xF4,0x90,0xD6,0xA6,0xF6,0xA5,0xF7,0xF0,0x23,\r\n\t0x86,0xF4,0x85,0xF5,0xA0,0x01,0xB1,0xF4,0xAA,0xC8,0xB1,0xF4,0x20,0x6C,0xC4,0xA0,\r\n\t0x01,0xA5,0xCE,0x91,0xF4,0xC8,0xA5,0xCF,0x91,0xF4,0xC8,0xB1,0xF4,0xAA,0xC8,0xB1,\r\n\t0xF4,0xD0,0xDB,0xAE,0xEA,0xC6,0xAD,0xEB,0xC6,0x20,0x6C,0xC4,0xA0,0x01,0xB1,0xCE,\r\n\r\n\t0x48,0xA9,0x00,0x91,0xCE,0xAE,0xE8,0xC6,0xAD,0xE9,0xC6,0x20,0x6C,0xC4,0xA0,0x03,\r\n\t0xAD,0xE5,0xC6,0x91,0xCE,0x88,0xAD,0xE4,0xC6,0x91,0xCE,0x18,0x6D,0xE6,0xC6,0x8D,\r\n\t0xE4,0xC6,0xAD,0xE5,0xC6,0x6D,0xE7,0xC6,0x8D,0xE5,0xC6,0xB0,0x10,0xA0,0x00,0xB1,\r\n\t0xCE,0xAA,0xC8,0xB1,0xCE,0xF0,0x18,0x86,0xCE,0x85,0xCF,0xD0,0xD1,0x68,0x20,0x0D,\r\n\t0xC4,0xA0,0x03,0x8A,0x99,0xE4,0xC6,0x88,0x10,0xFA,0xEE,0xE6,0xC6,0xD0,0xA4,0x68,\r\n\t0x91,0xCE,0xA5,0xF7,0xF0,0x42,0xA0,0x01,0xB1,0xF6,0x85,0xF8,0xC8,0xB1,0xF6,0x85,\r\n\t0xF9,0xC8,0xB1,0xF6,0x48,0xC8,0xB1,0xF6,0x48,0xA0,0x03,0xB1,0xF8,0x48,0x88,0xB1,\r\n\t0xF8,0xA8,0x68,0x20,0xCA,0xD2,0x20,0xD2,0xD2,0xA0,0x00,0xB9,0x01,0x01,0xF0,0x05,\r\n\t0x91,0xF6,0xC8,0xD0,0xF6,0xA9,0xFF,0xC0,0x05,0xF0,0x05,0x91,0xF6,0xC8,0xD0,0xF7,\r\n\t0x68,0x85,0xF7,0x68,0x85,0xF6,0xB0,0xBA,0xA0,0x00,0xB1,0x08,0xF0,0x13,0xC9,0xFF,\r\n\t0xF0,0x05,0x91,0x0A,0xC8,0xD0,0xF3,0x20,0x91,0xC4,0xC8,0x20,0x86,0xC4,0x4C,0x98,\r\n\t0xC6,0xC8,0xC8,0xB1,0x08,0x08,0x88,0x88,0xA2,0x04,0xB1,0x08,0x91,0x0A,0xC8,0xCA,\r\n\t0x10,0xF8,0x28,0xF0,0x09,0x20,0x86,0xC4,0x20,0x91,0xC4,0x4C,0x98,0xC6,0x88,0x88,\r\n\t0x58,0x4C,0x91,0xC4,0x20,0xD8,0xD5,0xFB,0xC3,0xF7,0xC3,0x60,0x20,0xD8,0xD5,0xE8,\r\n\t0xC6,0xBD,0xC6,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xF3,0xD1,0x20,\r\n\t0x9C,0xD1,0xA5,0xCE,0x85,0xF2,0x86,0xF3,0xA9,0xFF,0x85,0x33,0x85,0x34,0xA9,0xCD,\r\n\r\n\t0x20,0x2E,0xD2,0xF0,0x09,0x20,0xF3,0xD1,0xE6,0x33,0xD0,0x02,0xE6,0x34,0x20,0x9C,\r\n\t0xD1,0xA5,0xCE,0x38,0xE5,0xF2,0x85,0xF4,0x8A,0xE5,0xF3,0x85,0xF5,0x90,0xC4,0x08,\r\n\t0x78,0xA0,0x00,0xA5,0xCE,0xC5,0xA0,0xA5,0xCF,0xE5,0xA1,0x90,0x17,0xA2,0x04,0xB5,\r\n\t0x9C,0xE5,0xF4,0x95,0x9C,0xB5,0x9D,0xE5,0xF5,0x95,0x9D,0xCA,0xCA,0x10,0xF0,0x20,\r\n\t0x88,0xD1,0x28,0x60,0xB1,0xCE,0x91,0xF2,0xE6,0xCE,0xD0,0x02,0xE6,0xCF,0xE6,0xF2,\r\n\t0xD0,0xD1,0xE6,0xF3,0xD0,0xCD,0x20,0xFA,0xD2,0x84,0xF2,0x85,0xF3,0x20,0x2C,0xD2,\r\n\t0x20,0xFA,0xD2,0x84,0xF4,0x85,0xF5,0x20,0x2C,0xD2,0x20,0xFA,0xD2,0x84,0xF6,0x85,\r\n\t0xF7,0x08,0x78,0x38,0xA5,0xF4,0xE5,0xF2,0xA8,0xA5,0xF5,0xE5,0xF3,0xAA,0x90,0x48,\r\n\t0x86,0xF9,0xA5,0xF6,0xC5,0xF2,0xA5,0xF7,0xE5,0xF3,0xB0,0x3F,0x98,0x49,0xFF,0x69,\r\n\t0x01,0xA8,0x85,0xF8,0x90,0x03,0xCA,0xE6,0xF5,0x38,0xA5,0xF6,0xE5,0xF8,0x85,0xF6,\r\n\t0xB0,0x02,0xC6,0xF7,0x18,0xA5,0xF5,0xE5,0xF9,0x85,0xF5,0xE8,0xB1,0xF4,0x91,0xF6,\r\n\t0xC8,0xD0,0xF9,0xE6,0xF5,0xE6,0xF7,0xCA,0xF0,0x3C,0xB1,0xF4,0x91,0xF6,0xC8,0xB1,\r\n\t0xF4,0x91,0xF6,0xC8,0xD0,0xF4,0xF0,0xEB,0x4C,0x20,0xDE,0x8A,0x18,0x65,0xF3,0x85,\r\n\t0xF3,0x8A,0x18,0x65,0xF7,0x85,0xF7,0xE8,0x88,0xB1,0xF2,0x91,0xF6,0x98,0xD0,0xF8,\r\n\t0xC6,0xF3,0xC6,0xF7,0xCA,0xF0,0x0F,0x88,0xB1,0xF2,0x91,0xF6,0x88,0xB1,0xF2,0x91,\r\n\t0xF6,0x98,0xD0,0xF3,0xF0,0xEA,0x28,0x60,0x4C,0xB4,0x04,0x84,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0xC4,0xFF,0xC7,0x00,0x00,0x04,0x00,0x04,0x03,0x04,0x04,\r\n\t0x04,0x05,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0xB0,0xC5,0x20,0xDE,0xDF,0x20,0x0D,0xE6,0x8C,0xF9,0xC0,0xF0,0x05,0xA9,\r\n\t0xC3,0x20,0x2E,0xD2,0x20,0x0D,0xE6,0x8C,0xFA,0xC0,0xA2,0x06,0x20,0x64,0xD3,0x20,\r\n\t0x02,0xD3,0x10,0xFB,0x20,0xA1,0xD3,0xC9,0x59,0xF0,0x08,0xC9,0x1B,0xD0,0x01,0x60,\r\n\t0x18,0xA9,0x4E,0x6E,0x74,0xC0,0x20,0x2A,0xD6,0x20,0x06,0xD2,0x20,0x06,0xD2,0xAD,\r\n\t0xF9,0xC0,0xCD,0xFA,0xC0,0x18,0xD0,0x01,0x38,0x6E,0x72,0xC0,0x30,0x18,0xA2,0x01,\r\n\t0x20,0x64,0xD3,0xAD,0xF9,0xC0,0x20,0x0E,0xD6,0xA2,0x02,0x20,0x64,0xD3,0xAD,0xFA,\r\n\t0xC0,0x20,0x0E,0xD6,0xD0,0x14,0xA2,0x03,0x20,0x64,0xD3,0xA2,0x00,0x20,0x64,0xD3,\r\n\t0xAD,0xF9,0xC0,0x20,0x0E,0xD6,0x38,0x6E,0x73,0xC0,0xA2,0x05,0x20,0x64,0xD3,0x20,\r\n\t0x69,0xD6,0x90,0x01,0x60,0xAD,0xF9,0xC0,0x8D,0x00,0xC0,0x20,0x4C,0xDA,0xA9,0x00,\r\n\t0xA0,0x01,0x91,0x9A,0x20,0xB4,0xE0,0xA9,0x00,0x2C,0x09,0xC2,0x10,0x05,0x20,0xA3,\r\n\t0xC4,0xA9,0x80,0x8D,0x01,0xC0,0x8D,0xAE,0xC5,0xAD,0x09,0xC2,0x29,0x80,0x0D,0x06,\r\n\t0xC2,0x8D,0xA5,0xC6,0xA9,0x51,0x2C,0x74,0xC0,0x10,0x02,0xA9,0x6E,0xA2,0xFF,0xAC,\r\n\t0x07,0xC2,0x8C,0xA3,0xC6,0x18,0x6D,0x06,0xC2,0x90,0x01,0xE8,0x88,0xD0,0xF6,0x8D,\r\n\t0xFB,0xC0,0x8E,0xFC,0xC0,0xC8,0x8C,0x02,0xC0,0x8C,0xAF,0xC5,0x88,0xA9,0x92,0x2C,\r\n\t0x74,0xC0,0x30,0x02,0xA9,0xAF,0x8D,0xFD,0xC0,0x8D,0xB0,0xC5,0x2C,0x72,0xC0,0x10,\r\n\t0x1F,0x2C,0x73,0xC0,0x30,0x1A,0x20,0x06,0xD2,0xA2,0x03,0x98,0x48,0xF0,0x01,0xE8,\r\n\r\n\t0x20,0x64,0xD3,0xA2,0x05,0x20,0x64,0xD3,0x68,0xA8,0x20,0x69,0xD6,0x90,0x01,0x60,\r\n\t0x78,0xB9,0xF9,0xC0,0x8D,0x00,0xC0,0x2C,0x74,0xC0,0x10,0x12,0x98,0xF0,0x0F,0x4E,\r\n\t0x74,0xC0,0x20,0x41,0xC6,0x4E,0x73,0xC0,0xA0,0x00,0x8C,0x01,0xC0,0xC8,0xA9,0x00,\r\n\t0x8D,0x03,0xC0,0xA9,0x06,0x8D,0x04,0xC0,0x4E,0x73,0xC0,0x98,0xF0,0x05,0x20,0xA4,\r\n\t0xDA,0xF0,0x03,0x20,0x73,0xDA,0xEE,0x04,0xC0,0xAE,0x02,0xC0,0xEC,0x07,0xC2,0xD0,\r\n\t0x05,0xEE,0x01,0xC0,0xA2,0x00,0xE8,0x8E,0x02,0xC0,0xCE,0xFD,0xC0,0xD0,0xDC,0x58,\r\n\t0x98,0x49,0x01,0xA8,0xD0,0x37,0xAD,0xFC,0xC0,0x30,0x24,0xAD,0x01,0xC0,0xAE,0x02,\r\n\t0xC0,0x8D,0xAE,0xC5,0x8E,0xAF,0xC5,0x38,0xAD,0xFB,0xC0,0xE9,0xAF,0x8D,0xFB,0xC0,\r\n\t0xB0,0x0A,0xCE,0xFC,0xC0,0x10,0x05,0x69,0xAF,0x4C,0xE6,0xC4,0x4C,0xE4,0xC4,0xAD,\r\n\t0x01,0xC0,0x4D,0x09,0xC2,0x30,0x05,0xA2,0x07,0x4C,0x64,0xD3,0x60,0xAD,0xAE,0xC5,\r\n\t0xAE,0xAF,0xC5,0x8D,0x01,0xC0,0x8E,0x02,0xC0,0xAD,0xB0,0xC5,0xD0,0xDB,0x00,0x00,\r\n\t0x00,0x49,0x4E,0x20,0x44,0x52,0x49,0x56,0x45,0xA0,0x4C,0x4F,0x41,0x44,0x20,0x44,\r\n\t0x49,0x53,0x43,0x53,0x20,0x46,0x4F,0x52,0x20,0x42,0x41,0x43,0x4B,0x55,0x50,0x20,\r\n\t0x46,0x52,0x4F,0x4D,0xA0,0x20,0x54,0x4F,0xA0,0x0D,0x0A,0x4C,0x4F,0x41,0x44,0x20,\r\n\t0x53,0x4F,0x55,0x52,0x43,0x45,0x20,0x44,0x49,0x53,0x43,0xA0,0x0D,0x0A,0x4C,0x4F,\r\n\t0x41,0x44,0x20,0x54,0x41,0x52,0x47,0x45,0x54,0x20,0x44,0x49,0x53,0x43,0xA0,0x0D,\r\n\r\n\t0x0A,0x41,0x4E,0x44,0x20,0x50,0x52,0x45,0x53,0x53,0x20,0x52,0x45,0x54,0x55,0x52,\r\n\t0x4E,0xA0,0x0D,0x0A,0x46,0x6F,0x72,0x6D,0x61,0x74,0x20,0x54,0x41,0x52,0x47,0x45,\r\n\t0x54,0x20,0x64,0x69,0x73,0x63,0x20,0x28,0x59,0x2F,0x4E,0x29,0xBA,0x0D,0x0A,0x0A,\r\n\t0x42,0x61,0x63,0x6B,0x75,0x70,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x0D,\r\n\t0x8A,0x0E,0xA5,0xC6,0xA9,0x00,0x2A,0x8D,0xA6,0xC6,0xA9,0xA7,0xA0,0xC6,0x20,0x37,\r\n\t0xD6,0x20,0x40,0xD7,0x4E,0xA5,0xC6,0x20,0x3C,0xC7,0xAD,0xA6,0xC6,0xF0,0x0B,0xA9,\r\n\t0xC4,0xA0,0xC6,0x20,0x37,0xD6,0x38,0x20,0x3C,0xC7,0xA9,0xD9,0xA0,0xC6,0x4C,0x37,\r\n\t0xD6,0x28,0x4E,0x0C,0x00,0x03,0xF6,0x01,0xFC,0x28,0x4E,0xFF,0x0C,0x00,0x03,0xF5,\r\n\t0x01,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0xF7,0x16,0x4E,0x0C,0x00,\r\n\t0x03,0xF5,0x01,0xFB,0x00,0x00,0x01,0xF7,0x28,0x4E,0xFF,0x00,0x98,0x00,0xB1,0x70,\r\n\t0x98,0x64,0x01,0x11,0x12,0x00,0x00,0x0D,0x0A,0x0A,0x46,0x6F,0x72,0x6D,0x61,0x74,\r\n\t0x69,0x6E,0x67,0x20,0x53,0x69,0x64,0x65,0x20,0x30,0x20,0x54,0x72,0x61,0x63,0x6B,\r\n\t0x20,0x30,0x30,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x31,0x20,\r\n\t0x54,0x72,0x61,0x63,0x6B,0x20,0x30,0x30,0x00,0x0A,0x0A,0x0D,0x11,0x44,0x6F,0x6E,\r\n\t0x65,0x00,0xA9,0x48,0x8D,0x15,0xD0,0x20,0xCD,0xCF,0xA9,0x60,0x8D,0x15,0xD0,0x60,\r\n\t0xAD,0x9F,0xC6,0xAC,0xA0,0xC6,0x85,0x0A,0x84,0x0B,0xA2,0x00,0xA0,0x00,0xAD,0x01,\r\n\r\n\t0xC0,0x29,0x7F,0x91,0x0A,0xC8,0xA5,0xF8,0x91,0x0A,0xC8,0xA5,0xF7,0x18,0x69,0x01,\r\n\t0x20,0x31,0xC7,0x91,0x0A,0x18,0xAD,0xA1,0xC6,0x65,0x0A,0x85,0x0A,0xAD,0xA2,0xC6,\r\n\t0x65,0x0B,0x85,0x0B,0xE8,0xEC,0xA3,0xC6,0xD0,0xD2,0xA5,0xF7,0x6D,0xA3,0xC6,0xE9,\r\n\t0x04,0xCD,0xA4,0xC6,0x90,0x03,0xED,0xA3,0xC6,0x85,0xF7,0x60,0x08,0x08,0xAD,0xA3,\r\n\t0xC6,0x85,0xF6,0x8D,0xA4,0xC6,0xEE,0xA4,0xC6,0xA0,0x0C,0xC9,0x13,0xB0,0x08,0xA0,\r\n\t0x1E,0xC9,0x12,0xB0,0x02,0xA0,0x28,0x8C,0x98,0xC6,0x18,0x98,0x69,0x3C,0x8D,0xA1,\r\n\t0xC6,0xAD,0xA5,0xC6,0x85,0xF5,0xAD,0x9B,0xC6,0xAC,0x9C,0xC6,0x85,0x0A,0x84,0x0B,\r\n\t0x8D,0x03,0xC0,0x8C,0x04,0xC0,0x28,0xA9,0x00,0xAA,0xA8,0x2A,0x85,0xF8,0x28,0x6A,\r\n\t0x8D,0x01,0xC0,0x86,0xF7,0xAD,0xA3,0xC6,0xC9,0x12,0xB0,0x06,0x20,0xDA,0xC7,0xA9,\r\n\t0x70,0x2C,0xA9,0x10,0x8D,0x9F,0xC6,0xA2,0x0B,0x20,0xDA,0xC7,0xC6,0xF6,0xD0,0xF7,\r\n\t0xA9,0x4E,0x91,0x0A,0xC8,0xD0,0xFB,0xE6,0x0B,0xA6,0x0B,0xEC,0x9E,0xC6,0xD0,0xF2,\r\n\t0xA2,0x08,0x20,0xE2,0xC6,0x20,0xF0,0xC6,0xA2,0xF0,0x20,0x75,0xDA,0xA9,0x08,0x20,\r\n\t0x2A,0xD6,0x20,0x2A,0xD6,0xA2,0x30,0x8E,0x4C,0xC0,0xAD,0x01,0xC0,0x29,0x7F,0x20,\r\n\t0x4E,0xD7,0xEE,0x01,0xC0,0xC6,0xF5,0xD0,0xDC,0x60,0xBD,0x71,0xC6,0xE8,0xC9,0xFF,\r\n\t0xF0,0x13,0x85,0x0C,0xBD,0x71,0xC6,0xE8,0x91,0x0A,0xC8,0xD0,0x02,0xE6,0x0B,0xC6,\r\n\t0x0C,0xD0,0xF5,0xF0,0xE5,0x60,0xE6,0x0B,0xC6,0x0C,0xD0,0xF5,0xF0,0xE5,0x60,0x00,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0xC4,0xFF,0xC7,0x00,0x00,0x04,0x00,0x04,0x08,0x04,0x09,\r\n\t0x04,0x0A,0x04,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0xDC,0xC7,0xB8,0xC7,0x4C,0x15,0xC4,0x4C,0x25,0xC5,0x4C,0x95,0xC6,0x4C,0x77,0xE9,\r\n\t0xA2,0x1A,0x4C,0x7E,0xD6,0x08,0xA9,0x00,0x85,0xF5,0x85,0xF6,0x8D,0x4C,0xC0,0x46,\r\n\t0xF7,0x46,0xF8,0x38,0x66,0xF9,0x38,0x6E,0xF2,0x02,0x28,0xD0,0x11,0x46,0xF9,0xAD,\r\n\t0x8B,0xC0,0x85,0xF4,0x78,0xAC,0x89,0xC0,0xAE,0x8A,0xC0,0x4C,0x86,0xC4,0x20,0x24,\r\n\t0xD2,0x20,0x74,0xD2,0x85,0xF4,0x8D,0x8B,0xC0,0xA8,0xF0,0x58,0xC0,0x50,0xB0,0xBD,\r\n\t0x88,0xB1,0x91,0xF0,0xBB,0x99,0xAA,0xC0,0x88,0x10,0xF6,0x20,0x9E,0xD3,0xF0,0x1C,\r\n\t0x20,0x2C,0xD2,0xC9,0x53,0xD0,0x09,0x66,0xF7,0x20,0x98,0xD3,0xD0,0xF2,0xF0,0x0C,\r\n\t0xA9,0x4D,0x20,0x2E,0xD2,0x08,0x38,0x66,0xF8,0x28,0xD0,0xE4,0xA6,0x9B,0xA4,0x9A,\r\n\t0x8C,0x89,0xC0,0x8E,0x8A,0xC0,0x98,0xD0,0x01,0xCA,0x88,0x84,0xF2,0x86,0xF3,0x24,\r\n\t0xF7,0x10,0x01,0x78,0xA6,0xF3,0xA4,0xF2,0xC8,0xD0,0x01,0xE8,0x84,0xCE,0x86,0xCF,\r\n\t0xA0,0x02,0xB1,0xF2,0xF0,0x5A,0xC8,0xB1,0xF2,0x85,0x33,0xC8,0xB1,0xF2,0x85,0x34,\r\n\t0xA9,0x05,0x18,0x65,0xF2,0x85,0xF2,0x90,0x02,0xE6,0xF3,0xA0,0x00,0xB1,0xF2,0xD0,\r\n\t0x04,0xC0,0x00,0xF0,0xCF,0xBE,0xAA,0xC0,0xE0,0x5F,0xF0,0x0D,0xD9,0xAA,0xC0,0xF0,\r\n\t0x08,0xE6,0xF2,0xD0,0xE6,0xE6,0xF3,0xD0,0xE2,0xC8,0xC4,0xF4,0xD0,0xDF,0xE6,0xF5,\r\n\t0xD0,0x02,0xE6,0xF6,0xA5,0xF4,0x24,0xF7,0x30,0xC8,0x20,0x28,0xD6,0x20,0xB4,0xD1,\r\n\t0xA4,0xCE,0xA6,0xCF,0x24,0xF9,0x30,0x8E,0x8C,0x89,0xC0,0x8E,0x8A,0xC0,0x58,0x60,\r\n\r\n\t0x24,0xF7,0x10,0xFA,0xA5,0xF5,0xA4,0xF6,0x20,0xF5,0xD7,0x24,0xF8,0x30,0xEF,0x20,\r\n\t0x06,0xD2,0xA5,0xF5,0xA4,0xF6,0x20,0x53,0xD7,0x58,0xA2,0x00,0x4C,0x64,0xD3,0x4C,\r\n\t0x10,0xC4,0x4C,0x77,0xE9,0x20,0x24,0xD2,0x20,0x74,0xD2,0xA8,0x84,0xF8,0xF0,0x0F,\r\n\t0x88,0xC0,0x4E,0xB0,0xED,0xB1,0x91,0x99,0x00,0xC1,0xF0,0xE3,0x88,0x10,0xF6,0xA9,\r\n\t0xC3,0x20,0x2E,0xD2,0x20,0x24,0xD2,0x20,0x74,0xD2,0xA8,0x84,0xF7,0xF0,0x14,0x88,\r\n\t0xC0,0x4E,0xB0,0xCE,0xB1,0x91,0xF0,0xC7,0x99,0x00,0xC2,0x88,0x10,0xF6,0xA9,0x00,\r\n\t0x8D,0x4C,0xC0,0xA5,0xF8,0xF0,0x98,0x38,0xA5,0xF7,0xE5,0xF8,0x85,0xF9,0xA5,0x9C,\r\n\t0xA4,0x9D,0x85,0xC9,0x84,0xCA,0xA4,0x9B,0xA6,0x9A,0xD0,0x01,0x88,0xCA,0x86,0xF4,\r\n\t0x84,0xF5,0x86,0xCE,0x84,0xCF,0xA4,0xA3,0xA6,0xA2,0xD0,0x01,0x88,0xCA,0x8A,0x85,\r\n\t0xC7,0x84,0xC8,0x20,0x5C,0xD1,0x78,0xA4,0xC8,0xA6,0xC7,0xC8,0x86,0xF2,0x84,0xF3,\r\n\t0x46,0x00,0xA0,0x00,0x98,0xD0,0x3D,0x24,0x00,0x10,0x0B,0xA5,0xF4,0x38,0xE9,0x05,\r\n\t0x85,0xF4,0xB0,0x02,0xC6,0xF5,0xA0,0x02,0xB1,0xF2,0xF0,0x76,0xA2,0x70,0x86,0xF6,\r\n\t0xC8,0xB1,0xF2,0xC8,0x85,0x33,0xB1,0xF2,0x85,0x34,0x20,0x7D,0xC6,0x38,0x66,0x00,\r\n\t0xA0,0x00,0xB1,0xF2,0x91,0xF4,0xF0,0xCC,0xBE,0x00,0xC1,0xE0,0x5F,0xF0,0x10,0xD9,\r\n\t0x00,0xC1,0xF0,0x0B,0x46,0x00,0xC6,0xF6,0xF0,0x4E,0x20,0x5A,0xC6,0xD0,0xE1,0xC8,\r\n\t0xC4,0xF8,0xD0,0xDE,0xA5,0xF4,0x18,0x65,0xF9,0xA6,0xF5,0x90,0x01,0xE8,0xE4,0xF3,\r\n\r\n\t0x90,0x06,0xD0,0x50,0xC5,0xF2,0xB0,0x4C,0xA4,0xF7,0xF0,0x19,0x46,0x00,0xB9,0x00,\r\n\t0xC2,0x91,0xF4,0xC6,0xF6,0xF0,0x21,0x88,0x10,0xF4,0xA5,0xF7,0x18,0x65,0xF4,0x85,\r\n\t0xF4,0x90,0x02,0xE6,0xF5,0xA5,0xF8,0x18,0x65,0xF2,0x85,0xF2,0x90,0xA2,0xE6,0xF3,\r\n\t0xD0,0x9E,0x91,0xF4,0x58,0x4C,0xB4,0xE0,0xA0,0x00,0x20,0x60,0xC6,0xB1,0xF2,0xD0,\r\n\t0xF7,0x20,0x67,0xC6,0xA2,0x02,0x20,0x64,0xD3,0xA5,0x33,0xA4,0x34,0x20,0x53,0xD7,\r\n\t0x58,0x4C,0x0D,0xC4,0x20,0x67,0xC6,0x4C,0x6C,0xD1,0xE6,0xF4,0xD0,0x02,0xE6,0xF5,\r\n\t0xE6,0xF2,0xD0,0x02,0xE6,0xF3,0x60,0xA0,0x00,0xB1,0xF2,0x91,0xF4,0xD0,0x09,0xA0,\r\n\t0x02,0xB1,0xF2,0xF0,0xBD,0x20,0x7D,0xC6,0x20,0x5A,0xC6,0xD0,0xEA,0xA2,0x04,0xA0,\r\n\t0x00,0x20,0x5A,0xC6,0xB1,0xF2,0x91,0xF4,0xCA,0x10,0xF6,0x60,0x4C,0xDD,0xE0,0x4C,\r\n\t0xE0,0xE0,0x68,0x68,0x60,0x20,0x4F,0xD4,0x08,0x48,0x2C,0x16,0xC0,0x10,0x0A,0xA2,\r\n\t0x03,0x20,0x64,0xD3,0x20,0x48,0xD6,0xB0,0xE9,0x68,0x28,0x18,0xF0,0x09,0x20,0x2C,\r\n\t0xD2,0xA9,0x4C,0x20,0x2E,0xD2,0x38,0x6E,0x74,0xC0,0x20,0x2D,0xDB,0xF0,0xCD,0xBD,\r\n\t0x0C,0xC3,0xBC,0x0D,0xC3,0x20,0x5D,0xDA,0x2C,0x03,0xC1,0x10,0xC2,0xAD,0x06,0xC1,\r\n\t0xED,0x04,0xC1,0x48,0xAD,0x07,0xC1,0xED,0x05,0xC1,0xA8,0x18,0x68,0x65,0xA0,0x48,\r\n\t0x98,0x65,0xA1,0xA8,0xC8,0x68,0x20,0x64,0xD1,0xA5,0xA0,0xA4,0xA1,0xC8,0x8D,0x52,\r\n\t0xC0,0x8C,0x53,0xC0,0x20,0xE6,0xDF,0xA2,0x40,0x8E,0x4E,0xC0,0xAE,0x27,0xC0,0x20,\r\n\r\n\t0xEA,0xE0,0xAD,0x6A,0x02,0x48,0x20,0x40,0xD7,0xA5,0x9A,0xA4,0x9B,0x85,0xCE,0x84,\r\n\t0xCF,0xAD,0x52,0xC0,0xAC,0x53,0xC0,0x85,0xF8,0x84,0xF9,0x78,0xA2,0x20,0x8E,0x4C,\r\n\t0xC0,0x86,0xF5,0x2C,0x74,0xC0,0x30,0x05,0xA2,0x01,0x20,0x64,0xD3,0xA0,0x01,0xB1,\r\n\t0xF8,0xD0,0x11,0x68,0x8D,0x6A,0x02,0x58,0x24,0xF5,0x10,0x05,0xA2,0x1B,0x4C,0x7E,\r\n\t0xD6,0x4C,0x06,0xD2,0xC8,0xB1,0xF8,0x85,0x33,0x48,0xC8,0xB1,0xF8,0x85,0x34,0xA8,\r\n\t0x68,0x2C,0x74,0xC0,0x30,0x08,0x20,0x53,0xD7,0xA2,0x05,0x20,0x69,0xEE,0xA0,0x03,\r\n\t0xC8,0xB1,0xF8,0xD0,0xFB,0x84,0xF6,0xA0,0x01,0x20,0xA4,0xD1,0x90,0x04,0x66,0xF5,\r\n\t0x30,0x39,0xA5,0xA0,0xA4,0xA1,0x85,0xC9,0x84,0xCA,0x38,0x65,0xF6,0x85,0xC7,0x48,\r\n\t0x98,0x69,0x00,0x85,0xC8,0xA8,0x68,0x20,0x5C,0xD1,0xA2,0x02,0x38,0xB5,0x9C,0x65,\r\n\t0xF6,0x95,0x9C,0x90,0x02,0xF6,0x9D,0xCA,0xCA,0x10,0xF1,0xA4,0xF6,0xB1,0xF8,0x91,\r\n\t0xCE,0x88,0x10,0xF9,0xA5,0xCE,0xA4,0xCF,0x20,0x8C,0xD1,0x38,0xA5,0xF6,0x65,0xF8,\r\n\t0x85,0xF8,0x90,0x02,0xE6,0xF9,0x4C,0x2D,0xC7,0x20,0x46,0x6F,0x75,0x6E,0x64,0x73,\r\n\t0x0A,0x8D,0x0A,0x0D,0x4D,0x65,0x72,0x67,0x69,0x6E,0x67,0x20,0x6C,0x69,0x6E,0x65,\r\n\t0xBA,0x0A,0x0D,0x4C,0x49,0x4E,0x45,0x20,0xBA,0x4C,0x4F,0x41,0xC4,0x49,0x4E,0x56,\r\n\t0x41,0x4C,0x49,0x44,0x20,0x53,0x54,0x52,0x49,0x4E,0xC7,0x4C,0x49,0x4E,0x45,0x53,\r\n\t0x20,0x41,0x4C,0x52,0x45,0x41,0x44,0x59,0x20,0x45,0x58,0x49,0x53,0x54,0xD3,0x00,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0xC4,0xFF,0xC7,0x00,0x00,0x04,0x00,0x04,0x0D,0x04,0x0E,\r\n\t0x04,0x0F,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0x8F,0xC7,0xC9,0x4D,0xF0,0x07,0xC9,0x4F,0xD0,0x09,0xA0,0x00,0x2C,0xA0,\r\n\t0x40,0x20,0x98,0xD3,0x2C,0xA0,0x80,0x84,0x16,0xA9,0x00,0x85,0x07,0x20,0x51,0xD4,\r\n\t0x20,0xDE,0xDF,0xA2,0x0C,0xBD,0x28,0xC0,0x9D,0x90,0xC0,0xCA,0x10,0xF7,0x20,0x9E,\r\n\t0xD3,0xF0,0x09,0xC9,0x2C,0xF0,0x05,0xA9,0xC3,0x20,0x2E,0xD2,0x20,0x51,0xD4,0x48,\r\n\t0xA2,0x0C,0xBD,0x28,0xC0,0x9D,0x9D,0xC0,0x24,0x16,0x50,0x07,0xC9,0x3F,0xD0,0x03,\r\n\t0x4C,0xAC,0xD5,0xCA,0x10,0xEC,0x68,0xF0,0x1E,0x20,0x2C,0xD2,0xC9,0x43,0xD0,0x08,\r\n\t0xA5,0x07,0x09,0x40,0x85,0x07,0xD0,0x0A,0xC9,0x4E,0xF0,0x03,0x4C,0x23,0xDE,0x0A,\r\n\t0x85,0x07,0x20,0x98,0xD3,0xD0,0xE2,0x20,0x58,0xFE,0xAD,0x90,0xC0,0x8D,0x00,0xC0,\r\n\t0x24,0x07,0x30,0x0B,0xCD,0x9D,0xC0,0xF0,0x06,0xA5,0x07,0x09,0x80,0x85,0x07,0x20,\r\n\t0x06,0xD2,0x24,0x07,0x30,0x0C,0xA2,0x00,0x20,0x64,0xD3,0x20,0x48,0xD6,0x90,0x2B,\r\n\t0x58,0x60,0xA2,0x03,0x20,0x64,0xD3,0xAD,0x90,0xC0,0x20,0x0E,0xD6,0xA2,0x04,0x20,\r\n\t0x64,0xD3,0xAD,0x9D,0xC0,0x20,0x0E,0xD6,0x20,0x06,0xD2,0xA2,0x0D,0x20,0x6C,0xD3,\r\n\t0x20,0x69,0xD6,0xB0,0xDB,0x20,0x06,0xD2,0x20,0x06,0xD2,0x20,0x2D,0xDB,0xD0,0x03,\r\n\t0x4C,0xDD,0xE0,0x86,0xF9,0x24,0x07,0x50,0x2B,0x20,0xB4,0xDA,0xA2,0x0A,0x20,0x6C,\r\n\t0xD3,0x58,0x20,0x02,0xD3,0x20,0xA1,0xD3,0xC9,0x1B,0xF0,0xB4,0xC9,0x4E,0xD0,0x03,\r\n\t0x4C,0x77,0xC5,0xC9,0x59,0xD0,0xEB,0x20,0x2A,0xD6,0x20,0x06,0xD2,0x24,0x07,0x30,\r\n\r\n\t0x03,0x20,0x06,0xD2,0xAD,0x25,0xC0,0x48,0xAD,0x26,0xC0,0x48,0xAD,0x27,0xC0,0x48,\r\n\t0x20,0x8D,0xC5,0x68,0xA8,0x85,0xF9,0x68,0x8D,0x02,0xC0,0x8D,0x26,0xC0,0x68,0x90,\r\n\t0x03,0x4C,0xA0,0xC4,0x8D,0x01,0xC0,0x8D,0x25,0xC0,0xAD,0x90,0xC0,0x8D,0x00,0xC0,\r\n\t0x24,0x16,0x50,0x06,0x8C,0x27,0xC0,0x20,0x73,0xDA,0xA6,0x05,0xD0,0x05,0x20,0x06,\r\n\t0xD2,0x10,0x17,0x20,0xB4,0xDA,0xA6,0x05,0x24,0x16,0x50,0x02,0xA2,0x07,0xE0,0x09,\r\n\t0xB0,0x05,0x20,0x64,0xD3,0x30,0x03,0x20,0x6C,0xD3,0x20,0x58,0xFE,0x24,0xF4,0x10,\r\n\t0x26,0x24,0x07,0x30,0x0D,0x20,0x06,0xD2,0xA2,0x00,0x20,0x64,0xD3,0x20,0x48,0xD6,\r\n\t0xB0,0x4A,0x20,0x73,0xDA,0xF0,0x06,0x20,0x2A,0xD6,0x20,0x06,0xD2,0xA5,0xF9,0x20,\r\n\t0x44,0xDB,0xF0,0x03,0x4C,0xD3,0xC4,0x58,0xA2,0x05,0x4C,0x64,0xD3,0x78,0xA9,0x00,\r\n\t0x85,0x0A,0x85,0x0B,0x8D,0x4D,0xC0,0x85,0x04,0x85,0xF5,0xA9,0x80,0x85,0x06,0xAD,\r\n\t0x90,0xC0,0x8D,0x00,0xC0,0x46,0xF9,0x24,0x04,0x10,0x13,0x24,0x07,0x30,0x1A,0x20,\r\n\t0x06,0xD2,0xA2,0x00,0x20,0x64,0xD3,0x20,0x48,0xD6,0x90,0x0D,0x58,0x60,0xAE,0x27,\r\n\t0xC0,0xBD,0x0C,0xC3,0xBC,0x0D,0xC3,0xD0,0x04,0xA5,0x00,0xA4,0x01,0x20,0x5D,0xDA,\r\n\t0xA0,0xB4,0x8C,0x04,0xC0,0x84,0xF6,0xAE,0x04,0xC0,0xE0,0x05,0xF0,0x1D,0x20,0x73,\r\n\t0xDA,0x06,0x06,0x20,0x0C,0xC7,0xAC,0x04,0xC0,0x8C,0x8F,0xC0,0xB0,0x0D,0xA8,0x20,\r\n\t0x2A,0xE2,0x78,0xB0,0x05,0x38,0x66,0x06,0x30,0xDD,0x18,0x66,0x04,0xAD,0x9D,0xC0,\r\n\r\n\t0x8D,0x00,0xC0,0x24,0x07,0x30,0x0A,0xA2,0x01,0x20,0x64,0xD3,0x20,0x48,0xD6,0xB0,\r\n\t0xAB,0x38,0x66,0xF9,0x24,0x04,0x50,0x0A,0xA5,0x02,0xA4,0x03,0x20,0x5D,0xDA,0x38,\r\n\t0xF0,0x4B,0xAE,0x27,0xC0,0xA0,0x00,0xB9,0x9E,0xC0,0xC9,0x3F,0xD0,0x03,0xBD,0x00,\r\n\t0xC3,0x99,0x29,0xC0,0xE8,0xC8,0xC0,0x0C,0xD0,0xED,0xA9,0x00,0x99,0x29,0xC0,0xC8,\r\n\t0xC0,0x10,0xD0,0xF8,0x20,0x2D,0xDB,0xF0,0x1D,0x24,0x16,0x30,0x0F,0x50,0x05,0x20,\r\n\t0x07,0xDB,0xF0,0x12,0x20,0x64,0xE2,0x90,0x0A,0xA9,0x00,0x2C,0xA9,0x0E,0x85,0x05,\r\n\t0x18,0x58,0x60,0xA9,0x06,0x2C,0xA9,0x08,0x85,0x05,0x38,0x66,0x06,0xA9,0x00,0xA0,\r\n\t0xB4,0x85,0xF5,0x84,0xF6,0x8C,0x04,0xC0,0x90,0x04,0x24,0x06,0x10,0x59,0xAD,0x04,\r\n\t0xC0,0x48,0x08,0x90,0x15,0x66,0x06,0x20,0x6C,0xDC,0x8D,0x00,0xC1,0x8C,0x01,0xC1,\r\n\t0x20,0x15,0xDD,0xA5,0x02,0xA4,0x03,0x20,0x91,0xDA,0xA0,0x0B,0xB1,0xF5,0x99,0x4E,\r\n\t0xC0,0x88,0xD0,0xF8,0xAD,0x58,0xC0,0x48,0xAC,0x59,0xC0,0x20,0xC0,0xDB,0x68,0x18,\r\n\t0x65,0x0A,0x85,0x0A,0x48,0xA5,0x0B,0x6D,0x5B,0xC0,0x85,0x0B,0x68,0x6D,0x5E,0xC0,\r\n\t0x85,0x0A,0x90,0x02,0xE6,0x0B,0x28,0xB0,0x0A,0xAD,0x5C,0xC0,0xAC,0x5D,0xC0,0x85,\r\n\t0x08,0x84,0x09,0x68,0x8D,0x04,0xC0,0x06,0x06,0x20,0x0C,0xC7,0xAC,0x04,0xC0,0x84,\r\n\t0xF6,0x88,0xCC,0x8F,0xC0,0xB0,0x97,0x24,0x04,0x10,0x03,0x4C,0x9F,0xC5,0xA5,0x08,\r\n\t0xA4,0x09,0x8D,0x5C,0xC0,0x8C,0x5D,0xC0,0xA5,0x0A,0xA4,0x0B,0xA2,0x00,0x8E,0x5E,\r\n\r\n\t0xC0,0x8D,0x5A,0xC0,0x8C,0x5B,0xC0,0x20,0x81,0xDF,0x18,0x60,0x90,0x0A,0xA9,0x0A,\r\n\t0xAE,0x0A,0xC1,0xAC,0x0B,0xC1,0xB0,0x09,0xAE,0x8D,0xC0,0xAC,0x8E,0xC0,0xAD,0x8C,\r\n\t0xC0,0xE8,0xD0,0x01,0xC8,0x86,0xF7,0x84,0xF8,0xA8,0x20,0x7C,0xC7,0xA5,0xF7,0xD0,\r\n\t0x02,0xC6,0xF8,0xC6,0xF7,0xCE,0x04,0xC0,0xAE,0x04,0xC0,0xE0,0x05,0xF0,0x2B,0xA5,\r\n\t0xF7,0x05,0xF8,0xF0,0x24,0x20,0x28,0xE2,0xC0,0x02,0xD0,0x03,0x20,0x7C,0xC7,0x24,\r\n\t0xF9,0x30,0x05,0x20,0x50,0xE2,0xF0,0xD5,0xB9,0x00,0xC1,0x8D,0x01,0xC0,0xB9,0x01,\r\n\t0xC1,0x8D,0x02,0xC0,0x20,0xA4,0xDA,0xF0,0xC4,0x18,0x24,0xF9,0x10,0x0D,0x8C,0x8C,\r\n\t0xC0,0xA5,0xF7,0xA4,0xF8,0x8D,0x8D,0xC0,0x8C,0x8E,0xC0,0x60,0xAD,0x01,0xC0,0xAE,\r\n\t0x02,0xC0,0x24,0xF9,0x30,0x05,0x85,0x00,0x86,0x01,0x60,0x85,0x02,0x86,0x03,0x60,\r\n\t0x4C,0x4F,0x41,0x44,0x20,0x53,0x4F,0x55,0x52,0x43,0xC5,0x4C,0x4F,0x41,0x44,0x20,\r\n\t0x54,0x41,0x52,0x47,0x45,0xD4,0xBF,0x4C,0x4F,0x41,0x44,0x20,0x44,0x49,0x53,0x43,\r\n\t0x53,0x20,0x46,0x4F,0x52,0x20,0x43,0x4F,0x50,0x59,0x20,0x46,0x52,0x4F,0x4D,0xA0,\r\n\t0x20,0x54,0x4F,0xA0,0x0A,0x0D,0x43,0x6F,0x70,0x79,0x20,0x63,0x6F,0x6D,0x70,0x6C,\r\n\t0x65,0x74,0x65,0x0A,0x8D,0x20,0x4F,0x56,0x45,0x52,0x57,0x52,0x49,0x54,0x54,0x45,\r\n\t0x4E,0x0A,0x8D,0x20,0x41,0x50,0x50,0x45,0x4E,0x44,0x45,0x44,0x0A,0x8D,0x20,0x43,\r\n\t0x52,0x45,0x41,0x54,0x45,0x44,0x0A,0x8D,0xC6,0x0C,0xD0,0xF5,0xF0,0xE5,0x60,0x00,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0xC4,0xFF,0xC7,0x00,0x00,0x04,0x00,0x05,0x01,0x05,0x02,\r\n\t0x05,0x03,0x05,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0xF0,0xC6,0x4C,0x5A,0xC5,0x4C,0x1F,0xC4,0x4C,0x3E,0xC4,0x4C,0x46,0xC4,\r\n\t0x4C,0x09,0xC5,0x4C,0xD8,0xC4,0x4C,0x22,0xC5,0x4C,0xFD,0xC5,0x4C,0x2A,0xC6,0x20,\r\n\t0x8E,0xC6,0xA2,0x15,0x20,0x69,0xEE,0xA9,0x15,0xA0,0x88,0xA2,0x09,0x20,0xD6,0xC5,\r\n\t0xA4,0xF4,0x88,0xF0,0x06,0x20,0x06,0xD2,0x20,0xA4,0xDA,0x4C,0x06,0xD2,0x20,0x0D,\r\n\t0xE6,0x20,0xDB,0xC6,0x38,0x24,0x18,0xA0,0x00,0x84,0xF2,0xAA,0xF0,0x52,0x6E,0x72,\r\n\t0xC0,0x10,0x09,0x20,0x4C,0xDA,0x20,0xD4,0xC6,0x20,0x2C,0xD2,0xC9,0x2C,0xF0,0x2B,\r\n\t0x20,0x7F,0xD2,0xC9,0x3B,0xD0,0x0B,0x20,0x98,0xD3,0xA9,0x44,0x20,0x2E,0xD2,0xA9,\r\n\t0x80,0x2C,0xA9,0x00,0x85,0xF7,0x8A,0x20,0xA1,0xC4,0xF0,0x02,0x05,0xF7,0xA4,0xF2,\r\n\t0x99,0x00,0xC1,0x2C,0x72,0xC0,0x30,0x03,0x99,0x39,0xC0,0xE6,0xF2,0xA5,0xF2,0xC9,\r\n\t0x04,0xB0,0x05,0x20,0x9E,0xD3,0xD0,0xC1,0x2C,0x72,0xC0,0x10,0x03,0x4C,0xA4,0xDA,\r\n\t0x60,0xA8,0xF0,0x08,0xC9,0x15,0x90,0x2D,0xC9,0x66,0xB0,0x29,0x60,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0x4C,0x20,0xDE,0x20,0x0D,0xE6,0xF0,0xC3,0x20,0xDB,0xC6,\r\n\t0x20,0xD4,0xC6,0x20,0x2C,0xD2,0xC9,0x2C,0xF0,0x0E,0x20,0xFA,0xD2,0x8C,0x05,0xC1,\r\n\t0x8D,0x06,0xC1,0x20,0x9E,0xD3,0xF0,0x0E,0x20,0x2C,0xD2,0xF0,0x09,0x20,0xFA,0xD2,\r\n\r\n\t0x8C,0x07,0xC1,0x8D,0x08,0xC1,0x4C,0xA4,0xDA,0x20,0x90,0xC6,0xA2,0x3C,0x20,0x69,\r\n\t0xEE,0xA9,0x3C,0xA0,0x88,0xA2,0x1E,0x20,0xD6,0xC5,0xA4,0xF4,0x88,0xF0,0x8D,0x4C,\r\n\t0xA4,0xDA,0x20,0x8E,0xC6,0x20,0x06,0xD2,0x20,0x8A,0xC6,0x20,0x06,0xD2,0xA9,0x00,\r\n\t0xA0,0xC1,0x20,0x5E,0xC5,0xA2,0x05,0x20,0x64,0xD3,0xA2,0x0C,0x20,0x64,0xD3,0xA2,\r\n\t0x0D,0x2C,0x04,0xC1,0x70,0x01,0xE8,0x20,0x64,0xD3,0xA2,0x0F,0x2C,0x04,0xC1,0x30,\r\n\t0x01,0xE8,0x20,0x64,0xD3,0xA2,0x11,0x4C,0x64,0xD3,0xA9,0x39,0xA0,0xC0,0x85,0xF8,\r\n\t0x84,0xF9,0xA9,0x30,0x8D,0x4C,0xC0,0xA0,0x00,0x84,0xF7,0xA2,0x06,0x20,0x64,0xD3,\r\n\t0xA5,0xF7,0x20,0x0E,0xD6,0xA9,0x3A,0x20,0x2A,0xD6,0x20,0x28,0xD6,0xA4,0xF7,0xB1,\r\n\t0xF8,0xD0,0x07,0xA2,0x0B,0x20,0x64,0xD3,0x30,0x1B,0x48,0x29,0x7F,0x20,0x4E,0xD7,\r\n\t0xA2,0x07,0x20,0x64,0xD3,0x68,0x30,0x03,0xA2,0x08,0x2C,0xA2,0x09,0x20,0x64,0xD3,\r\n\t0xA2,0x0A,0x20,0x64,0xD3,0xA4,0xF7,0xC8,0xC0,0x04,0x90,0xBD,0xA9,0x20,0x8D,0x4C,\r\n\t0xC0,0x20,0x06,0xD2,0xA2,0x03,0x20,0x64,0xD3,0xA0,0x05,0x20,0xCB,0xC5,0xA2,0x02,\r\n\t0x20,0x64,0xD3,0xA0,0x07,0x20,0xCB,0xC5,0x4C,0x06,0xD2,0xB1,0xF8,0x48,0xC8,0xB1,\r\n\t0xF8,0xA8,0x68,0x4C,0x53,0xD7,0x85,0xF2,0x86,0xF9,0x84,0xF3,0xA9,0x20,0x8D,0x75,\r\n\t0xC0,0x20,0x36,0xED,0x20,0x3E,0xD7,0xA6,0xF4,0xCA,0xD0,0x01,0x60,0xA0,0x00,0xA6,\r\n\t0xF9,0xB1,0xD1,0x9D,0x00,0xC1,0xE8,0xC8,0xC4,0xF2,0xD0,0xF5,0x60,0x20,0xCE,0xC6,\r\n\r\n\t0x20,0xDB,0xC6,0xA9,0x00,0xF0,0x18,0x20,0x2C,0xD2,0xC9,0x41,0xD0,0x07,0x20,0x98,\r\n\t0xD3,0xA9,0x80,0xD0,0x07,0xA9,0x53,0x20,0x2E,0xD2,0xA9,0x40,0x0D,0x04,0xC1,0x8D,\r\n\t0x04,0xC1,0x20,0x9E,0xD3,0xD0,0xE0,0x4C,0xA4,0xDA,0x20,0x06,0xD2,0xA2,0x04,0x20,\r\n\t0x64,0xD3,0xA9,0x30,0x8D,0x4C,0xC0,0xA2,0x00,0x86,0xF9,0x86,0xF8,0xA9,0x80,0x85,\r\n\t0xF7,0x20,0x06,0xD2,0xA5,0xF9,0x20,0x4E,0xD7,0xA9,0x3A,0x20,0x2A,0xD6,0x20,0x28,\r\n\t0xD6,0xA6,0xF8,0xBD,0x80,0xC8,0x08,0x29,0x7F,0xC9,0x20,0xD0,0x04,0x24,0xF7,0x30,\r\n\t0x1B,0x85,0xF7,0xB0,0x14,0x20,0x28,0xD6,0xA5,0xF7,0x09,0x40,0x20,0x2A,0xD6,0xAC,\r\n\t0x69,0x02,0x88,0x09,0x80,0x91,0x12,0xD0,0x03,0x20,0x2A,0xD6,0x28,0x30,0x03,0xE8,\r\n\t0xD0,0xD1,0xE6,0xF9,0xE8,0xD0,0xB4,0x4C,0x06,0xD2,0x18,0x08,0x90,0x11,0x38,0x24,\r\n\t0x18,0x08,0x20,0x0D,0xE6,0x2C,0x16,0xC0,0x10,0x05,0x20,0xA0,0xC7,0xB0,0x2E,0x20,\r\n\t0xD4,0xC6,0xA9,0x00,0x85,0xF8,0xC6,0xF4,0x28,0x90,0x08,0xA9,0x14,0xA2,0x00,0xA0,\r\n\t0x09,0xD0,0x06,0xA9,0x3B,0xA2,0x01,0xA0,0x1E,0x84,0xF3,0x48,0x20,0x64,0xD3,0x68,\r\n\t0xAA,0xA0,0x00,0xB1,0xF3,0x20,0x2A,0xD6,0xC8,0xCA,0x10,0xF7,0x18,0x60,0x20,0x0D,\r\n\t0xE6,0x8C,0x00,0xC0,0xA9,0x14,0xA0,0x01,0x4C,0x5D,0xDA,0x2C,0x16,0xC0,0x10,0x10,\r\n\t0xA2,0x12,0x20,0x64,0xD3,0x20,0x48,0xD6,0x58,0x90,0x05,0x68,0x68,0x4C,0x06,0xD2,\r\n\t0x60,0x0A,0x0D,0x44,0x69,0x73,0x63,0x20,0x6E,0x61,0x6D,0x65,0xBA,0x0A,0x0D,0x49,\r\n\r\n\t0x6E,0x69,0x74,0x20,0x73,0x74,0x61,0x74,0x65,0x6D,0x65,0x6E,0x74,0xBA,0x0A,0x0D,\r\n\t0x4E,0x75,0x6D,0x20,0x73,0x74,0x65,0x70,0x20,0x20,0xBA,0x0A,0x0D,0x4E,0x75,0x6D,\r\n\t0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0xBA,0x0A,0x0D,0x55,0x73,0x65,0x72,0x20,0x66,\r\n\t0x6F,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x3A,0x0A,0x8D,0x0A,0x0D,0x4B,0x65,0x79,\r\n\t0x62,0x6F,0x61,0x72,0x64,0xBA,0x0A,0x0D,0x44,0x72,0x69,0x76,0x65,0xA0,0x20,0x74,\r\n\t0x72,0x61,0x63,0x6B,0x73,0xA0,0x73,0x69,0x6E,0x67,0x6C,0x65,0xA0,0x64,0x6F,0x75,\r\n\t0x62,0x6C,0x65,0xA0,0x73,0x69,0x64,0x65,0x64,0xA0,0x75,0x6E,0x63,0x6F,0x6E,0x6E,\r\n\t0x65,0x63,0x74,0x65,0x64,0xA0,0x41,0x43,0x43,0x45,0x4E,0x54,0xA0,0x53,0x45,0x54,\r\n\t0xAC,0x4F,0x46,0x46,0xAC,0x41,0xDA,0x51,0xD7,0x45,0x52,0x54,0x59,0x0A,0x8D,0x4C,\r\n\t0x4F,0x41,0xC4,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0x2C,0x16,0xC0,0x10,0x14,0xA2,0x12,0x20,0x64,0xD3,0x20,0x48,0xD6,0x58,0x90,0x09,\r\n\t0x68,0x68,0x68,0x68,0x68,0x20,0x06,0xD2,0x38,0x60,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\t0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0xC4,0xFF,0xC7,0x00,0x00,0x04,0x00,0x05,0x06,0x05,0x07,\r\n\t0x05,0x08,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0x06,0xC4,0x4C,0x82,0xC4,0x0D,0x0A,0x46,0x6F,0x72,0x6D,0x61,0x74,0x20,\r\n\t0x28,0x59,0x2F,0x4E,0x29,0xBA,0x0D,0x0A,0x0A,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,\r\n\t0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x58,0x58,0x2F,0x58,0x58,\r\n\t0x2F,0x58,0xD8,0x0D,0x0A,0x49,0x6E,0x69,0x74,0x20,0x61,0x6E,0x6F,0x74,0x68,0x65,\r\n\t0x72,0x20,0x64,0x69,0x73,0x63,0x20,0x28,0x59,0x2F,0x4E,0x29,0xBA,0x0D,0x0A,0x0A,\r\n\t0x4D,0x61,0x73,0x74,0x65,0x72,0x20,0x64,0x69,0x73,0x63,0x20,0x28,0x59,0x2F,0x4E,\r\n\t0x29,0xBA,0x0D,0x0A,0x0A,0x49,0x6E,0x69,0x74,0x20,0x73,0x74,0x61,0x74,0x65,0x6D,\r\n\t0x65,0x6E,0x74,0xBA,0x01,0x02,0x03,0x04,0x07,0x0A,0x0D,0x10,0x4C,0x20,0xDE,0x4C,\r\n\t0x23,0xDE,0xA2,0x11,0x20,0x0D,0xE6,0xF0,0x0E,0x20,0x2C,0xD2,0x20,0x7F,0xD2,0xE0,\r\n\t0x10,0x90,0xE9,0xE0,0x14,0xB0,0xE5,0x8E,0xAC,0xC6,0xAC,0x00,0xC0,0xB9,0x39,0xC0,\r\n\t0x29,0x7F,0xAA,0x20,0x9E,0xD3,0xF0,0x0E,0x20,0x2C,0xD2,0x20,0x7F,0xD2,0xE0,0x15,\r\n\t0x90,0xCA,0xE0,0x66,0xB0,0xC6,0x8E,0xAE,0xC6,0xAE,0x00,0xC0,0xBC,0x39,0xC0,0x20,\r\n\t0x9E,0xD3,0xF0,0x11,0x20,0x2C,0xD2,0xA0,0xFF,0xC9,0x44,0xF0,0x05,0xC8,0xC9,0x53,\r\n\t0xD0,0xAD,0x20,0x98,0xD3,0x98,0x29,0x80,0x0D,0xAE,0xC6,0x8D,0xAE,0xC6,0x20,0xD1,\r\n\t0xDA,0xA9,0xFF,0xA2,0x10,0x9D,0x00,0xC2,0xE8,0xD0,0xFA,0xE8,0x8E,0x08,0xC2,0x8D,\r\n\t0x00,0xC2,0xAD,0xAE,0xC6,0x29,0x7F,0xAA,0xA9,0x00,0xA8,0x18,0x6D,0xAC,0xC6,0x90,\r\n\r\n\t0x01,0xC8,0xCA,0xD0,0xF6,0x2C,0xAE,0xC6,0x10,0x06,0x0A,0x48,0x98,0x2A,0xA8,0x68,\r\n\t0x4C,0x19,0xC5,0x8E,0x15,0x31,0x4C,0x35,0xE6,0x8D,0x02,0xC2,0x8C,0x03,0xC2,0xA2,\r\n\t0x00,0x20,0x64,0xD3,0x20,0x0F,0xC6,0x90,0x03,0x20,0x4A,0xC6,0x20,0xCE,0xDA,0xA2,\r\n\t0x01,0x20,0x64,0xD3,0xA9,0x20,0x8D,0x75,0xC0,0xA2,0x15,0x20,0x69,0xEE,0xA0,0x88,\r\n\t0xA9,0x15,0xA2,0x09,0x20,0x24,0xC6,0xA2,0x08,0xBD,0x39,0xC0,0x9D,0x00,0xC1,0xCA,\r\n\t0x10,0xF7,0xA2,0x04,0x20,0x64,0xD3,0xA9,0x3C,0xA2,0x1E,0xA0,0x80,0x20,0x24,0xC6,\r\n\t0xA9,0x14,0xA0,0x01,0x20,0x91,0xDA,0x20,0xCE,0xDA,0xA9,0x10,0x8D,0x02,0xC1,0xA9,\r\n\t0x14,0xA0,0x04,0x20,0x91,0xDA,0xAD,0xAE,0xC6,0x8D,0x09,0xC2,0x29,0x7F,0x8D,0x06,\r\n\t0xC2,0xAD,0xAC,0xC6,0x8D,0x07,0xC2,0xA2,0x03,0x20,0x64,0xD3,0x20,0x0F,0xC6,0xA0,\r\n\t0x53,0xA2,0x08,0x90,0x04,0xA0,0x4D,0xA2,0x63,0x86,0xF9,0xA9,0x00,0x2A,0x49,0x01,\r\n\t0x8D,0x16,0x31,0x8D,0x0A,0xC2,0x98,0x20,0x2A,0xD6,0xAE,0xAC,0xC6,0xE8,0x20,0x13,\r\n\t0xC5,0x20,0x06,0xD2,0xA9,0x00,0xA0,0x30,0x8D,0x03,0xC0,0x8C,0x04,0xC0,0xA0,0x00,\r\n\t0x8C,0x01,0xC0,0xC8,0x78,0x8C,0x02,0xC0,0xAD,0x01,0xC0,0x20,0x2D,0xDD,0x20,0xA4,\r\n\t0xDA,0xEE,0x04,0xC0,0xAC,0x02,0xC0,0xCC,0xAC,0xC6,0x90,0x05,0xEE,0x01,0xC0,0xA0,\r\n\t0x00,0xC8,0xC6,0xF9,0xD0,0xDF,0x58,0xA2,0x07,0x86,0xF9,0xA6,0xF9,0xA9,0x14,0xBC,\r\n\t0x74,0xC4,0x20,0x2D,0xDD,0xC6,0xF9,0x10,0xF2,0x20,0x89,0xDC,0xA2,0x02,0x20,0x64,\r\n\r\n\t0xD3,0x20,0x0F,0xC6,0x90,0x06,0x20,0x06,0xD2,0x4C,0xDE,0xC4,0x4C,0x06,0xD2,0x20,\r\n\t0x02,0xD3,0x10,0xFB,0x20,0xA1,0xD3,0xC9,0x1B,0xF0,0x06,0xC9,0x59,0xF0,0x01,0x18,\r\n\t0x60,0x68,0x68,0x60,0x85,0xF8,0x85,0xF2,0x86,0xF9,0x84,0xF3,0x20,0x36,0xED,0x20,\r\n\t0x3E,0xD7,0xA6,0xF4,0xCA,0xD0,0x03,0x68,0x68,0x60,0xA0,0x00,0xA6,0xF9,0xB1,0xD1,\r\n\t0x9D,0x00,0xC1,0xE8,0xC8,0xC4,0xF8,0xD0,0xF5,0x60,0xAD,0xAE,0xC6,0x29,0x7F,0xEA,\r\n\t0x8D,0xAF,0xC6,0xA9,0xB0,0xA0,0xC6,0x20,0x37,0xD6,0x20,0x40,0xD7,0xEA,0xEA,0xEA,\r\n\t0x20,0x45,0xC7,0xAD,0xAE,0xC6,0x10,0x0B,0xA9,0xCD,0xA0,0xC6,0x20,0x37,0xD6,0x38,\r\n\t0x20,0x45,0xC7,0xA9,0xE2,0xA0,0xC6,0x4C,0x37,0xD6,0x28,0x4E,0x0C,0x00,0x03,0xF6,\r\n\t0x01,0xFC,0x28,0x4E,0xFF,0x0C,0x00,0x03,0xF5,0x01,0xFE,0x01,0x00,0x01,0x00,0x01,\r\n\t0x00,0x01,0x01,0x01,0xF7,0x16,0x4E,0x0C,0x00,0x03,0xF5,0x01,0xFB,0x00,0x00,0x01,\r\n\t0xF7,0x28,0x4E,0xFF,0x00,0x98,0x00,0xB1,0x70,0x98,0x64,0x01,0x11,0x12,0x00,0x00,\r\n\t0x0D,0x0A,0x0A,0x46,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6E,0x67,0x20,0x53,0x69,0x64,\r\n\t0x65,0x20,0x30,0x20,0x54,0x72,0x61,0x63,0x6B,0x20,0x30,0x30,0x00,0x08,0x08,0x08,\r\n\t0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x31,0x20,0x54,0x72,0x61,0x63,0x6B,0x20,0x30,\r\n\t0x30,0x00,0x0A,0x0A,0x0D,0x11,0x46,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6E,0x67,0x20,\r\n\t0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x00,0xAD,0xA8,0xC6,0xAC,0xA9,0xC6,0x85,\r\n\r\n\t0x0A,0x84,0x0B,0xA2,0x00,0xA0,0x00,0xAD,0x01,0xC0,0x29,0x7F,0x91,0x0A,0xC8,0xA5,\r\n\t0xF8,0x91,0x0A,0xC8,0xA5,0xF7,0x18,0x69,0x01,0x20,0x3A,0xC7,0x91,0x0A,0x18,0xAD,\r\n\t0xAA,0xC6,0x65,0x0A,0x85,0x0A,0xAD,0xAB,0xC6,0x65,0x0B,0x85,0x0B,0xE8,0xEC,0xAC,\r\n\t0xC6,0xD0,0xD2,0xA5,0xF7,0x6D,0xAC,0xC6,0xE9,0x04,0xCD,0xAD,0xC6,0x90,0x03,0xED,\r\n\t0xAC,0xC6,0x85,0xF7,0x60,0x08,0x08,0xAD,0xAC,0xC6,0x85,0xF6,0x8D,0xAD,0xC6,0xEE,\r\n\t0xAD,0xC6,0xA0,0x0C,0xC9,0x13,0xB0,0x08,0xA0,0x1E,0xC9,0x12,0xB0,0x02,0xA0,0x28,\r\n\t0x8C,0xA1,0xC6,0x18,0x98,0x69,0x3C,0x8D,0xAA,0xC6,0xAD,0xAF,0xC6,0x85,0xF5,0xAD,\r\n\t0xA4,0xC6,0xAC,0xA5,0xC6,0x85,0x0A,0x84,0x0B,0x8D,0x03,0xC0,0x8C,0x04,0xC0,0x28,\r\n\t0xA9,0x00,0xAA,0xA8,0x2A,0x85,0xF8,0x28,0x6A,0x8D,0x01,0xC0,0x86,0xF7,0xAD,0xAC,\r\n\t0xC6,0xC9,0x12,0xB0,0x06,0x20,0xE3,0xC7,0xA9,0x70,0x2C,0xA9,0x10,0x8D,0xA8,0xC6,\r\n\t0xA2,0x0B,0x20,0xE3,0xC7,0xC6,0xF6,0xD0,0xF7,0xA9,0x4E,0x91,0x0A,0xC8,0xD0,0xFB,\r\n\t0xE6,0x0B,0xA6,0x0B,0xEC,0xA7,0xC6,0xD0,0xF2,0xA2,0x08,0x20,0xCD,0xCF,0x20,0xF9,\r\n\t0xC6,0xA2,0xF0,0x20,0x75,0xDA,0xA9,0x08,0x20,0x2A,0xD6,0x20,0x2A,0xD6,0xA2,0x30,\r\n\t0x8E,0x4C,0xC0,0xAD,0x01,0xC0,0x29,0x7F,0x20,0x4E,0xD7,0xEE,0x01,0xC0,0xC6,0xF5,\r\n\t0xD0,0xDC,0x60,0xBD,0x7A,0xC6,0xE8,0xC9,0xFF,0xF0,0x13,0x85,0x0C,0xBD,0x7A,0xC6,\r\n\t0xE8,0x91,0x0A,0xC8,0xD0,0x02,0xE6,0x0B,0xC6,0x0C,0xD0,0xF5,0xF0,0xE5,0x60,0x00,\r\n\r\n\t0x00,0x00,0xFF,0x40,0x00,0xC4,0xFF,0xC7,0x00,0x00,0x04,0x00,0x05,0x0B,0x05,0x0C,\r\n\t0x05,0x0D,0x05,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n\r\n\t0x00,0x00,0x00,0x00,0xD0,0x0C,0xA2,0x02,0xBD,0xFD,0xCC,0x9D,0xF7,0xCC,0xCA,0x10,\r\n\t0xF7,0x60,0xC9,0xBA,0xD0,0x11,0xA0,0xFD,0xB9,0xFA,0xCB,0x20,0x2A,0xD6,0xC8,0xD0,\r\n\t0xF7,0x20,0x06,0xD2,0x4C,0x3A,0xD3,0x20,0x24,0xD2,0x20,0x74,0xD2,0xC9,0x03,0xD0,\r\n\t0x1E,0xA0,0x03,0x88,0x30,0x0B,0xB1,0x91,0x20,0xA1,0xD3,0x20,0xC7,0xD5,0x4C,0x33,\r\n\t0xC4,0xA0,0x02,0xB1,0x91,0x20,0xA1,0xD3,0x99,0xF7,0xCC,0x88,0x10,0xF5,0x60,0x4C,\r\n\t0xAC,0xD5,0x4C,0xDF,0xC6,0x4C,0xFF,0xC5,0x4C,0xA1,0xC6,0x4C,0xA4,0xC6,0x4C,0xD3,\r\n\t0xC6,0x20,0x60,0x20,0x31,0x39,0x39,0x36,0x20,0x41,0x6E,0x64,0x72,0x7B,0x20,0x43,\r\n\t0x68,0x7B,0x72,0x61,0x6D,0x79,0x20,0x4C,0x23,0xDE,0x78,0x20,0x51,0xD4,0xA0,0x00,\r\n\t0x84,0x00,0x20,0x9E,0xD3,0xF0,0x0E,0x20,0x2C,0xD2,0xC9,0xC7,0xD0,0xE9,0x85,0x00,\r\n\t0x20,0x98,0xD3,0xD0,0xE2,0x20,0x30,0xDB,0xF0,0x22,0xBD,0x0C,0xC3,0xBC,0x0D,0xC3,\r\n\t0x20,0x5D,0xDA,0xA2,0x02,0xBD,0x00,0xC1,0xC9,0xFF,0xF0,0x12,0xE8,0xD0,0xF6,0xAD,\r\n\t0x00,0xC1,0xAC,0x01,0xC1,0xD0,0xE9,0x20,0x41,0xDB,0xD0,0xDE,0x58,0x60,0x8A,0x48,\r\n\t0x20,0xB4,0xDA,0x68,0xAA,0x20,0x28,0xD6,0xBD,0x03,0xC1,0x20,0x13,0xD6,0xBD,0x02,\r\n\t0xC1,0x20,0x13,0xD6,0x20,0x28,0xD6,0x38,0xBD,0x04,0xC1,0x48,0xFD,0x02,0xC1,0x8D,\r\n\t0x4F,0xC0,0xBD,0x05,0xC1,0xA8,0xFD,0x03,0xC1,0x8D,0x50,0xC0,0x98,0x20,0x13,0xD6,\r\n\t0x68,0x20,0x13,0xD6,0x20,0x28,0xD6,0xBD,0x01,0xC1,0x85,0xF9,0x20,0x13,0xD6,0x20,\r\n\r\n\t0x28,0xD6,0xBD,0x07,0xC1,0x20,0x13,0xD6,0xBD,0x06,0xC1,0x20,0x13,0xD6,0x20,0x28,\r\n\t0xD6,0x18,0xA9,0x00,0x85,0x6A,0x8D,0x03,0xC0,0x6D,0x4F,0xC0,0x85,0x64,0xA9,0x06,\r\n\t0x85,0x6B,0xA8,0x88,0x8C,0x04,0xC0,0x6D,0x50,0xC0,0x85,0x65,0xA5,0xF9,0x30,0x06,\r\n\t0xE6,0x64,0xD0,0x02,0xE6,0x65,0xBD,0x08,0xC1,0x85,0xF7,0xBD,0x09,0xC1,0x85,0xF8,\r\n\t0x8A,0x18,0x69,0x06,0xA8,0x20,0x28,0xE2,0xA5,0xF7,0xD0,0x02,0xC6,0xF8,0xC6,0xF7,\r\n\t0xEE,0x04,0xC0,0xA5,0xF7,0x05,0xF8,0xF0,0x09,0x20,0x28,0xE2,0x20,0x50,0xE2,0x4C,\r\n\t0x48,0xC5,0xAD,0x03,0xC0,0xAE,0x04,0xC0,0x85,0xF5,0x86,0xF6,0x20,0x28,0xE2,0x98,\r\n\t0x48,0xA9,0x00,0xA2,0xC2,0x8D,0x03,0xC0,0x8E,0x04,0xC0,0x20,0x50,0xE2,0xA0,0xFF,\r\n\t0xC8,0xB9,0x00,0xC2,0x91,0xF5,0xCC,0x4F,0xC0,0xD0,0xF5,0xA0,0x00,0x84,0x68,0x84,\r\n\t0x69,0xA5,0x6A,0xC5,0x64,0xA5,0x6B,0xE5,0x65,0xB0,0x14,0xA5,0x68,0x71,0x6A,0x85,\r\n\t0x68,0xA5,0x69,0x69,0x00,0x85,0x69,0xE6,0x6A,0xD0,0xE6,0xE6,0x6B,0xD0,0xE2,0x20,\r\n\t0x28,0xD6,0xA5,0x69,0x20,0x13,0xD6,0xA5,0x68,0x20,0x13,0xD6,0x20,0x06,0xD2,0x58,\r\n\t0xA4,0x00,0xF0,0x29,0xA0,0xFF,0x88,0xF0,0x14,0x20,0x02,0xD3,0xC9,0x1B,0xF0,0x26,\r\n\t0xC9,0x20,0xD0,0xF2,0x20,0x02,0xD3,0x10,0xFB,0xC9,0x20,0xF0,0xF7,0x78,0x68,0xA8,\r\n\t0x20,0x28,0xE2,0xB0,0x05,0x98,0xAA,0x4C,0xA5,0xC4,0x4C,0xB7,0xC4,0x20,0x02,0xD3,\r\n\t0x10,0xFB,0xC9,0x1B,0xD0,0xE7,0xEA,0x60,0x00,0x4C,0xDD,0xE0,0x4C,0xD2,0xE2,0x20,\r\n\r\n\t0x4F,0xD4,0x20,0x9E,0xD7,0x20,0x2D,0xDB,0xF0,0xEF,0xBD,0x0F,0xC3,0x30,0xED,0xBD,\r\n\t0x0C,0xC3,0xBC,0x0D,0xC3,0x20,0x5D,0xDA,0x20,0x9E,0xD3,0xF0,0x73,0x20,0x2C,0xD2,\r\n\t0xC9,0x41,0xD0,0x39,0x20,0x98,0xD3,0x20,0xFA,0xD2,0x98,0xA4,0x34,0x48,0x85,0xF6,\r\n\t0x84,0xF7,0x38,0xAD,0x06,0xC1,0xED,0x04,0xC1,0x48,0xAD,0x07,0xC1,0xED,0x05,0xC1,\r\n\t0xAA,0x68,0x18,0x65,0xF6,0x8D,0x06,0xC1,0x8A,0x65,0xF7,0x8D,0x07,0xC1,0x68,0x8D,\r\n\t0x04,0xC1,0x8C,0x05,0xC1,0x20,0x9E,0xD3,0xF0,0x44,0x20,0x2C,0xD2,0xC9,0x54,0xD0,\r\n\t0x12,0x20,0x98,0xD3,0x20,0xFA,0xD2,0xA6,0x33,0xA4,0x34,0x20,0x9E,0xD3,0xF0,0x17,\r\n\t0x4C,0x23,0xDE,0xC9,0xC7,0xD0,0xF9,0x20,0x98,0xD3,0xD0,0xF4,0x2C,0x03,0xC1,0x30,\r\n\t0x06,0xAE,0x04,0xC1,0xAC,0x05,0xC1,0x8E,0x08,0xC1,0x8C,0x09,0xC1,0xA9,0x01,0x2C,\r\n\t0xA9,0x00,0x85,0xF5,0xAD,0x03,0xC1,0x29,0xFE,0x05,0xF5,0x8D,0x03,0xC1,0x4C,0xA4,\r\n\t0xDA,0xA9,0x80,0x2C,0xA9,0x00,0x85,0xF9,0x20,0x51,0xD4,0xD0,0x2F,0x20,0x2D,0xDB,\r\n\t0xF0,0x1E,0x20,0xA0,0xD7,0x90,0x10,0xAE,0x27,0xC0,0xBD,0x0F,0xC3,0x29,0x7F,0x05,\r\n\t0xF9,0x9D,0x0F,0xC3,0x4C,0x82,0xDA,0x20,0xB7,0xC6,0x20,0x41,0xDB,0xD0,0xF8,0x60,\r\n\t0x4C,0xDD,0xE0,0x20,0x0D,0xE6,0xD0,0x04,0x8C,0x0A,0xC0,0x60,0x4C,0x23,0xDE,0x20,\r\n\t0xD8,0xD5,0xBB,0xE9,0x33,0xEC,0x78,0x20,0x51,0xD4,0xA0,0x00,0x84,0x00,0x20,0x9E,\r\n\t0xD3,0xF0,0x0E,0x20,0x2C,0xD2,0xC9,0xC7,0xD0,0xE2,0x85,0x00,0x20,0x98,0xD3,0xD0,\r\n\r\n\t0xDB,0x20,0x30,0xDB,0xF0,0x22,0xBD,0x0C,0xC3,0xBC,0x0D,0xC3,0x20,0x5D,0xDA,0xA2,\r\n\t0x02,0xBD,0x00,0xC1,0xC9,0xFF,0xF0,0x19,0xE8,0xD0,0xF6,0xAD,0x00,0xC1,0xAC,0x01,\r\n\t0xC1,0xD0,0xE9,0x20,0x41,0xDB,0xD0,0xDE,0x58,0x20,0xD8,0xD5,0xA9,0xE9,0x21,0xEC,\r\n\t0x60,0xBD,0x01,0xC1,0x29,0x40,0xF0,0xEB,0xBD,0x03,0xC1,0x85,0xF9,0xC9,0xA0,0x90,\r\n\t0xE2,0xBD,0x05,0xC1,0x48,0xC9,0xC0,0xB0,0xDA,0x8A,0x48,0x20,0xB4,0xDA,0x68,0xAA,\r\n\t0x20,0x06,0xD2,0x38,0xBD,0x04,0xC1,0xFD,0x02,0xC1,0x8D,0x4F,0xC0,0x68,0xE5,0xF9,\r\n\t0x8D,0x50,0xC0,0xBD,0x02,0xC1,0x8D,0x03,0xC0,0xA4,0xF9,0x88,0x8C,0x04,0xC0,0xBD,\r\n\t0x08,0xC1,0x85,0xF7,0xBD,0x09,0xC1,0x85,0xF8,0x8A,0x18,0x69,0x06,0xA8,0x20,0x28,\r\n\t0xE2,0xA5,0xF7,0xD0,0x02,0xC6,0xF8,0xC6,0xF7,0xEE,0x04,0xC0,0xA5,0xF7,0x05,0xF8,\r\n\t0xF0,0x08,0x20,0x28,0xE2,0x20,0x50,0xE2,0xF0,0xE7,0x58,0xAD,0x03,0xC0,0xAE,0x04,\r\n\t0xC0,0x85,0xF5,0x86,0xF6,0x20,0x28,0xE2,0x98,0x48,0xA9,0x00,0xA2,0xC2,0x8D,0x03,\r\n\t0xC0,0x8E,0x04,0xC0,0x20,0x50,0xE2,0xA0,0xFF,0xC8,0xB9,0x00,0xC2,0x91,0xF5,0xCC,\r\n\t0x4F,0xC0,0xD0,0xF5,0xA4,0x00,0xF0,0x2D,0xA0,0xFF,0x88,0xF0,0x14,0x20,0x02,0xD3,\r\n\t0xC9,0x1B,0xF0,0x1D,0xC9,0x20,0xD0,0xF2,0x20,0x02,0xD3,0x10,0xFB,0xC9,0x20,0xF0,\r\n\t0xF7,0x78,0x68,0xA8,0x20,0x28,0xE2,0xB0,0x05,0x98,0xAA,0x4C,0x11,0xC7,0x4C,0x23,\r\n\t0xC7,0x68,0x4C,0x29,0xC7,0x20,0x02,0xD3,0x10,0xFB,0xC9,0x1B,0xF0,0xF3,0xD0,0xE1,\r\n\r\n"
  },
  {
    "path": "tools/cc65/telestrat/tap2dsk.c",
    "content": "/* tap2dsk : converts an Oric tape image to a sedoric/stratsed dsk image */\r\n/* (c) F.Frances 2004 */\r\n\r\n/* Limitations :\r\n *   - only 1 bitmap sector, thus limits the capacity to ~2048 sectors\r\n *   - only 1 side with 80 tracks max.\r\n */\r\n\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#define NBTRACKS 21\r\n#define NBSECT 17\r\n\r\ntypedef unsigned char byte;\r\ntypedef byte sector[256];\r\n\r\nstruct {\r\n\tchar signature[8];\r\n\tint sides;\r\n\tint tracks;\r\n\tint sect;\r\n\tchar pad[256-20];\r\n} imageheader = { \"ORICDISK\", 1, NBTRACKS, NBSECT };\r\n\r\nsector disk[80][NBSECT];\r\nsector directory,descriptor;\r\nsector system_sect={\t// some system parameters\r\n\t0xD0,0xD0,0xD0,0xD0,\t// drive table\r\n\t0,\t\t\t// keyboard type\r\n\t100,0,10,0,\t// RENUM parameters\r\n\t'T','A','P','2','D','S','K',' ','S','A','M','P','L','E',' ','D','I','S','C',' ',' '\r\n};\r\nsector bitmap={\r\n\t0xFF,\t\t// signature\r\n\t0,\r\n\t0,0,\t\t// number of free sectors\r\n\t0,0,\t\t// number of files\r\n\tNBTRACKS,\t// number of tracks/side\r\n\tNBSECT,\t\t// number of sectors/track\r\n\t1,\t\t\t// number of directory sectors\r\n\tNBTRACKS,\t// number of tracks + 128 if double sided\r\n\t0\t\t\t// master/slave/gameinit indicator\r\n};\r\n\r\nbyte sedoric[]=\r\n{\r\n#include \"sedoric3.h\"\r\n};\r\n\r\nint track,sect=1;\r\nint dir_offset=0x10;\r\nint used_sectors;\r\n\r\n\r\n\r\nvoid allocate_sector(int track, int sect, byte *contents)\r\n{\r\n\tint linear_sector=track*NBSECT+sect-1;\r\n\tbitmap[0x10+linear_sector/8] &= ~(1<<linear_sector%8);\r\n\tmemcpy(disk[track][sect-1],contents,sizeof(sector));\r\n\tused_sectors++;\r\n}\r\n\r\nvoid find_free_sector(byte *contents)\r\n{\r\n\tint linear_sector=0;\r\n\twhile ((bitmap[0x10+linear_sector/8] & (1<<linear_sector%8)) == 0)\r\n\t\tlinear_sector++;\r\n\r\n\ttrack=linear_sector/NBSECT;\r\n\tsect=linear_sector%NBSECT+1;\r\n\tif (track==80) {\r\n\t\tfprintf(stderr,\"Not enough space on sample disc\");\r\n\t\texit(1);\r\n\t}\r\n\tallocate_sector(track,sect,contents);\r\n}\r\n\r\nvoid update_sector(int track, int sect, byte *contents)\r\n{\r\n\tmemcpy(disk[track][sect-1],contents,sizeof(sector));\r\n}\r\n\r\nvoid convert_basename(char *dest, char *name)\r\n{\r\n\tstatic int filenumber=0;\r\n\tint dest_offset=0, src_offset=0;\r\n\tprintf(\"Storing \");\r\n\twhile (dest_offset<9 && src_offset<17 && name[src_offset]) {\r\n\t\tif (name[src_offset]>='a' && name[src_offset]<='z')\r\n\t\t\tname[src_offset]-=0x20;\r\n\t\tif (name[src_offset]>='0' && name[src_offset]<='9' \r\n\t\t\t|| name[src_offset]>='A' && name[src_offset]<='Z') {\r\n\t\t\t\tputchar(name[src_offset]);\r\n\t\t\t\tdest[dest_offset++]=name[src_offset];\r\n\t\t}\r\n\t\tsrc_offset++;\r\n\t}\r\n\tif (dest_offset) {\r\n\t\twhile (dest_offset<9)\r\n\t\t\tdest[dest_offset++]=' ';\r\n\t} else {\r\n\t\tprintf(\"NONAME%03d\",filenumber);\r\n\t\tsprintf(dest,\"NONAME%03d\",filenumber++);\r\n\t}\r\n}\r\n\r\nvoid store_file(byte *buf, char *name, byte *header)\r\n{\r\n\tint start=(header[6]<<8)+header[7];\r\n\tint end=(header[4]<<8)+header[5];\r\n\tint exec=header[3];\r\n\tint block=header[2];\r\n\tint sectors=(end-start)/sizeof(sector)+1;\r\n\tint desc_sect,desc_track;\r\n\tint desc_off=0x0C;\r\n\tint offset;\r\n\r\n\tmemset(descriptor,0,sizeof(sector));\r\n\tfind_free_sector(descriptor);\r\n\tdesc_track=track; desc_sect=sect;\r\n\tdescriptor[2]=0xFF;\r\n\tdescriptor[3]=(block?0x40:0x80)+(exec?1:0);\r\n\tdescriptor[4]=header[7];\r\n\tdescriptor[5]=header[6];\r\n\tdescriptor[6]=header[5];\r\n\tdescriptor[7]=header[4];\r\n\tif (exec) {\r\n\t\tdescriptor[8]=descriptor[4];\r\n\t\tdescriptor[9]=descriptor[5];\r\n\t} else {\r\n\t\tdescriptor[8]=descriptor[9]=0;\r\n\t}\r\n\tdescriptor[10]=sectors&0xFF;\r\n\tdescriptor[11]=sectors>>8;\r\n\r\n\tconvert_basename(directory+dir_offset,name);\r\n\tif (exec) {\r\n\t\tsprintf(directory+dir_offset+9,\"COM\");\r\n\t\tprintf(\".COM\");\r\n\t} else {\r\n\t\tsprintf(directory+dir_offset+9,\"%s\",block?\"BIN\":\"BAS\");\r\n\t\tprintf(\".%s\",block?\"BIN\":\"BAS\");\r\n\t}\r\n\tprintf(\"\\n\");\r\n\tdirectory[dir_offset+12]=desc_track;\r\n\tdirectory[dir_offset+13]=desc_sect;\r\n\tdirectory[dir_offset+14]=sectors+1+(sectors>=(256-12)/2?1:0); // Sedoric bug work-around : allocate a second descriptor when exactly 122 sectors of data\r\n\tdirectory[dir_offset+15]=0x40; // UNPROT\r\n\r\n\twhile (sectors--) {\r\n\t\tfind_free_sector(buf);\r\n\t\tbuf+=sizeof(sector);\r\n\t\tdescriptor[desc_off++]=track;\r\n\t\tdescriptor[desc_off++]=sect;\r\n\t\tif (desc_off==0x100) {\t\t\t// Sedoric bug work-around : allocate a second descriptor when the first is full, even if not needed\r\n\t\t\tfind_free_sector(descriptor);\r\n\t\t\tdescriptor[0]=track;\r\n\t\t\tdescriptor[1]=sect;\r\n\t\t\tupdate_sector(desc_track,desc_sect,descriptor);\r\n\t\t\tmemset(descriptor,0,sizeof(sector));\r\n\t\t\tdesc_track=track;\r\n\t\t\tdesc_sect=sect;\r\n\t\t\tdesc_off=2;\r\n\t\t}\r\n\t}\r\n\tupdate_sector(desc_track,desc_sect,descriptor);\r\n}\r\n\r\nint main(int argc, char *argv[])\r\n{\r\n\tbyte header[9];\r\n\tchar name[17];\r\n\tbyte file_buffer[48*1024];\r\n\tFILE *tape, *dsk;\r\n\tint dir_track=20, dir_sect=4;\r\n\tint tracks=21; // minimum track number\r\n\tint total_sectors,free_sectors;\r\n\tint tape_num,i;\r\n\r\n\tprintf(\"Tap2dsk V2.0\\n\");\r\n\tif (argc<2) {\r\n\t\tfprintf(stderr,\"Usage: tap2dsk <tape_image1> ...<tape_imageN> <old_disk_image>\\n\");\r\n\t\texit(1);\r\n\t}\r\n\r\n\tdsk=fopen(argv[argc-1],\"wb\");\r\n\tif (dsk==NULL) {\r\n\t\tfprintf(stderr,\"Cannot open %s for writing\\n\",argv[2]);\r\n\t\texit(1);\r\n\t}\r\n\r\n\tmemset(bitmap+0x10,0xFF,sizeof(sector)-0x10);\r\n\tfor (i=0; i<99; i++) {\t// 99 secteurs pour sedoric\r\n\t\tint track= i/NBSECT;\r\n\t\tint sector = i%NBSECT + 1;\r\n\t\tallocate_sector(track,sector,sedoric+i*256);\r\n\t}\r\n\tallocate_sector(20,1,system_sect);\r\n\tallocate_sector(20,2,bitmap);\r\n\tallocate_sector(20,4,directory);\r\n\r\n\tfor (tape_num=1; tape_num<argc-1; tape_num++) {\r\n\t\ttape=fopen(argv[tape_num],\"rb\");\r\n\t\tif (tape==NULL) {\r\n\t\t\tfprintf(stderr,\"Cannot read tape image %s\\n\",argv[1]);\r\n\t\t\texit(1);\r\n\t\t}\r\n\t\tprintf(\"Reading %s\\n\",argv[tape_num]);\r\n\r\n\r\n\t\twhile (fgetc(tape)!=EOF) {\r\n\t\t\tint start,end,i;\r\n\t\t\twhile (fgetc(tape)!=0x24)\r\n\t\t\t\t;\r\n\t\t\tfor (i=0;i<9;i++) header[i]=fgetc(tape);\r\n\t\t\tfor (i=0;i<17;i++) {\r\n\t\t\t\tname[i]=fgetc(tape);\r\n\t\t\t\tif (name[i]==0) break;\r\n\t\t\t}\r\n\t\t\tstart=(header[6]<<8)+header[7];\r\n\t\t\tend=(header[4]<<8)+header[5];\r\n\t\t\tfor (i=0; i<end+1-start; i++)\r\n\t\t\t\tfile_buffer[i]=fgetc(tape);\r\n\t\t\tprintf(\"Found %s\\n\",name);\r\n\t\t\tstore_file(file_buffer,name,header);\r\n\t\t\tbitmap[4]++; // number of files\r\n\t\t\tdir_offset+=16;\r\n\t\t\tif (dir_offset==0x100) {\r\n\t\t\t\tfind_free_sector(directory);\r\n\t\t\t\tdirectory[0]=track;\r\n\t\t\t\tdirectory[1]=sect;\r\n\t\t\t\tupdate_sector(dir_track,dir_sect,directory);\r\n\t\t\t\tmemset(directory,0,sizeof(sector));\r\n\t\t\t\tdir_track=track;\r\n\t\t\t\tdir_sect=sect;\r\n\t\t\t\tdir_offset=0x10;\r\n\t\t\t\tupdate_sector(dir_track,dir_sect,directory);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfclose(tape);\r\n\t\ttape=NULL;\r\n\t}\r\n\tdirectory[2]=dir_offset;\r\n\tupdate_sector(dir_track,dir_sect,directory);\r\n\r\n\tif (track>=tracks) tracks=track+1;\r\n\ttotal_sectors=tracks*NBSECT;\r\n\tfree_sectors=total_sectors-used_sectors;\r\n\tbitmap[2]=free_sectors & 0xFF;\r\n\tbitmap[3]=free_sectors >> 8;\r\n\tbitmap[6]=tracks;\r\n\tbitmap[9]=tracks;\r\n\tupdate_sector(20,2,bitmap);\r\n\r\n\timageheader.tracks=tracks;\r\n\tfwrite(&imageheader,sizeof(imageheader),1,dsk);\r\n\tfor (track=0;track<tracks;track++)\r\n\t\tfor (sect=1;sect<=NBSECT;sect++)\r\n\t\t\tfwrite(disk[track][sect-1],sizeof(sector),1,dsk);\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "tools/cc65/telestrat/tap2dsk.txt",
    "content": "Tape to disk V2 README :\r\n\r\nThis is a PC tool that builds a Sedoric3 master disk image (.dsk) from the files found in zero or more Oric tape images (.tap). The program is provided in both binary forms for DOS/Windows users, and in source form for unix/mac/other users.\r\nBeware that the disk image uses the obsolete Oric disk image format, not the one that is currently used by Euphoric. This means that you need to further convert the disk image to the new format, using the old2mfm tool.\r\n\r\nExamples of use:\r\n\r\n\ttap2dsk newdisk.dsk\r\n\told2mfm newdisk.dsk\r\n\r\n\t=> this builds an empty master Sedoric disk image\r\n\r\n\ttap2dsk krillys.tap krillys.dsk\r\n\told2mfm krillys.dsk\r\n\r\n\t=> this takes all the files in krillys.tap and stores them in a bootable Sedoric disk\r\n\r\n\ttap2dsk *.tap bigdisk.dsk\r\n\told2mfm bigdisk.dsk\r\n\r\n\t=> this takes all the files in all tape images and stores them in a bootable Sedoric disk\r\n\r\nSome remarks:\r\n- the size of the disk image is made as small as possible. As a minimum, it will be 21 tracks, single sided (this allows faster writing to real floppies with writedsk). When the tape image contains a lot of data, the disk image extends to up to 80 tracks. It always has 17 sectors per track, and it is always single sided. Minimal space is wasted in only 3 sectors (system sector, bitmap sector and directory sector) instead of 16 in a usual slave disk. This means that the smallest disk image (21 tracks) still offers 88.5 KB free. More directory sectors are allocated when needed.\r\n- a tape image may contain several files, this program will converts all of them into the disk image, provided they are in standard tape format.\r\n- the name of the files inside the disk images are extracted from the tape image, but as an Oric program name might be as long as 17 characters, it is truncated to 9 characters. Every non-alphanumeric character is removed (non-alphanumeric characters aren't allowed with Sedoric). Beware, tap2dsk does not provide name-collision detection, so it may generate a disk containing two files with the same name.\r\n- Also, an Oric program on tape might have a zero-length name. In this case, tap2dsk generates a unique name such as NONAME001.\r\n\r\nEnjoy,\r\n\r\nFabrice\r\n\r\n"
  },
  {
    "path": "tools/cmoc/coco/file2dsk/Source/Makefile",
    "content": "ifneq ($(COMSPEC),)\r\nDO_WIN:=1\r\nendif\r\nifneq ($(ComSpec),)\r\nDO_WIN:=1\r\nendif \r\n\r\nifeq ($(DO_WIN),1)\r\nEXEEXT = .exe\r\nendif\r\n\r\nifeq ($(DO_WIN),1)\r\nCOMPILEDEXT = .exe\r\nelse\r\nCOMPILEDEXT = .out\r\nendif\r\n\r\nAS = gcc\r\n\r\nfile2dsk:\tfile2dsk.c\r\n\t$(AS) -w $< -o$@$(COMPILEDEXT)\r\n\r\nfile2dsk40:\tfile2dsk.c\r\n\t$(AS) $< -o$@$(COMPILEDEXT) -DTRACKS40\r\n\r\nfile2dsk80:\tfile2dsk.c\r\n\t$(AS) $< -o$@$(COMPILEDEXT) -DTRACKS80\r\n\r\nall:\tfile2dsk file2dsk40 file2dsk80\r\n\r\nclean:\r\n\trm -f *.$(COMPILEDEXT)\r\n"
  },
  {
    "path": "tools/cmoc/coco/file2dsk/Source/file2dsk.c",
    "content": "// File2DSK - Command line CoCo DSK creation utility\r\n// Version 1.0.8 (Jun 28, 2016)\r\n//\r\n// Freeware, copyright 2006 by Patrick Benny (chipple.net)\r\n// Inspired by DiskTape v1.1 copyright 1998 by Jean-Francois Morin\r\n// http://www.chipple.net/coco/file2dsk/\r\n//\r\n// Modified by Guillaume Major\r\n//\r\n// DESCRIPTION\r\n// ~~~~~~~~~~~\r\n// This utility creates a regular 35-track CoCo virtual disk DSK file\r\n// for use in emulators that support the format.\r\n\r\n// SYNTAX\r\n// ~~~~~~\r\n//  1. file2dsk <src_file1> [src_file2 .. [src_fileN]]\r\n//     e.g. file2dsk program1.bin program2.bas (creates PROGRAM1.DSK)\r\n//  2. file2dsk <dest_file.dsk> <src_file1> [src_file2 .. [src_fileN]]\r\n//     e.g. file2dsk mydisk.dsk program1.bin program2.bas\r\n//\r\n// In Windows, files can also be simply drag-and-dropped onto this program.\r\n//\r\n// Running the program without any arguments will allow creating a DSK\r\n// containing only one file by inputing its filename.\r\n\r\n// FEATURES\r\n// ~~~~~~~~\r\n// - Automatically detects type and mode of BIN and binary BAS files\r\n// - Allows specifying type and mode for non-detected files\r\n// - Writes tracks in CoCo's standard order, from tracks 16-17 outwards\r\n\r\n// SOME LIMITATIONS\r\n// ~~~~~~~~~~~~~~~~\r\n// - Doesn't create disks of formats other than the following:\r\n//   1 side, 35 track, 18 sectors/trk, 256 bytes/sct\r\n// - Cannot add files to existing disks. Writing to an existing DSK\r\n//   will overwrite (after confirmation).\r\n// - Filenames longer than XXXXXXXX.XXX are truncated, and\r\n//   non-alphanumeric characters other than -#$%&'()@ [space] are removed.\r\n// - It IS possible to put several files of the same name on a same DSK,\r\n//   so be careful.\r\n\r\n// VERSION HISTORY\r\n// ~~~~~~~~~~~~~~~\r\n// 1.0.8  2016/6/28  Fills GAT track with 0xFF instead of 0x00\r\n// 1.0.7  2006/5/26  Now allows file type 3 (Text editor source file)\r\n// 1.0.6  2006/5/22  Now allows characters -#$%&'()@ [space] in filenames\r\n// 1.0.5  2006/4/24  Bug fix (created disks were always full)\r\n// 1.0.4  2006/4/21  Now compiles on Linux (Thanks to mannequin!)\r\n// 1.0.3  2006/4/20  Bug fix\r\n// 1.0.2  2006/4/13  First public release\r\n\r\n// Special thanks to Jean-Francois Morin for his utility DiskTape v1.1 that\r\n// inspired me to create File2DSK. I used a few lines from DiskTape's code\r\n// to get started, and borrowed logic to determine a file's type and mode.\r\n\r\n// Thanks also to Mannequin for helping to make the source compilable on Linux,\r\n// and to Jason Law for bug reporting.\r\n\r\n\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <stdlib.h>\r\n#include <sys/stat.h>\r\n#include <unistd.h>\r\n\r\n#define C_iFilenameMaxLen     200      // Maximum filename length\r\n\r\n#ifdef TRACKS80\r\n#define C_iDiskSize           0x5a000  // Total disk size (360K)\r\n#define C_iDiskNbGranules     158      // Number of granules\r\n#else\r\n#ifdef TRACKS40\r\n#define C_iDiskSize           0x2D000  // Total disk size\r\n#define C_iDiskNbGranules     78       // Number of granules\r\n#else\r\n#define C_iDiskSize           0x27600  // Total disk size\r\n#define C_iDiskNbGranules     68       // Number of granules\r\n#endif // TRACKS40\r\n#endif // TRACKS80\r\n\r\n#define C_iDiskGATTrackPos    0x13200  // GAT track offset\r\n#define C_iDiskGATTrackGATPos 0x100    // GAT offset within GAT track\r\n#define C_iDiskGATTrackDirPos 0x200    // Dir offset within GAT track\r\n\r\n\r\n// This block for implementing getch() for both Win and Linux\r\n#ifdef WIN32\r\n#include <conio.h>\r\n#else\r\n#include <termios.h>\r\n#include <unistd.h>\r\n#include <ctype.h>\r\n#include <fcntl.h>\r\n\r\n// Function getch\r\n//          ~~~~~\r\n// Linux (possibly POSIX) replacement for Windows' \"conio.h\"\r\n//\r\nint getch (void)\r\n{\r\n\t/* Ripped from                                             *\r\n\t * <http://cboard.cprogramming.com/showthread.php?t=27714> */\r\n\tstruct termios oldt, newt;\r\n\tint ch;\r\n\r\n\ttcgetattr (STDIN_FILENO, &oldt);\r\n\tnewt = oldt;\r\n\tnewt.c_lflag &= ~(ICANON | ECHO);\r\n\ttcsetattr (STDIN_FILENO, TCSANOW, &newt);\r\n\tch = getchar ();\r\n\ttcsetattr (STDIN_FILENO, TCSANOW, &oldt);\r\n\r\n\treturn ch;\r\n}\r\n#endif\r\n\r\nunsigned char file_type = 0; // File type (0, 1, 2)\r\nunsigned char file_mode = 0; // 00-Binary, FF-ASCII\r\nunsigned char force_file_type = 0;\r\nunsigned char force_file_mode = 0;\r\n\r\n// Function strtoupper\r\n//          ~~~~~~~~~~\r\n// Converts a string to uppercase.\r\n//\r\n// Parameters:\r\n//    psz  String that will be converted to uppercase\r\n//\r\n// Returns a pointer to converted string (same as input) for convenience\r\n//\r\nchar * strtoupper (char *psz) {\r\n    int iLen = strlen(psz);  // Length of string\r\n    int iPos;                // Counter for position\r\n    for (iPos = 0; iPos < iLen; iPos++)\r\n        psz[iPos] = toupper(psz[iPos]);\r\n    return psz;\r\n}\r\n\r\n// Function AddFile\r\n//          ~~~~~~~\r\n// Add a file to the disk\r\n//\r\n// Parameters:\r\n//    pszFilename  Pointer to the input fileame\r\n//    fOut         Output DSK file handle\r\n//    cLast        1 if last file, otherwise 0\r\n//\r\n// Returns 1 if ok to continue,\r\n//      or 0 if error encountered (input file can't be open, disk full)\r\n//\r\nchar AddFile(char *pszFilename, \r\n             FILE *fOut,\r\n             char cLast) {\r\n\r\n    // Static disk-related data\r\n    static unsigned char szDisk[C_iDiskSize];\r\n    static unsigned char szGATTrack[0x900*2];\r\n\r\n#ifdef TRACKS80    \r\n    static const unsigned char szGATOrder[C_iDiskNbGranules] = \r\n        {0x20,0x21,0x22,0x23,0x1e,0x1f,0x24,0x25,0x1c,0x1d,0x26,0x27,0x1a,0x1b,0x28,0x29,\r\n         0x18,0x19,0x2a,0x2b,0x16,0x17,0x2c,0x2d,0x14,0x15,0x2e,0x2f,0x12,0x13,0x30,0x31,\r\n         0x10,0x11,0x32,0x33,0x0e,0x0f,0x34,0x35,0x0c,0x0d,0x36,0x37,0x0a,0x0b,0x38,0x39,\r\n         0x08,0x09,0x3a,0x3b,0x06,0x07,0x3c,0x3d,0x04,0x05,0x3e,0x3f,0x02,0x03,0x40,0x41,\r\n         0x00,0x01,0x42,0x43,\r\n         // extra\r\n         0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,\r\n         0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,\r\n         0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,\r\n         0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,0x81,0x82,0x83,\r\n         0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,\r\n         0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d};\r\n#else\r\n#ifdef TRACKS40\r\n    static const unsigned char szGATOrder[C_iDiskNbGranules] = \r\n        {0x20,0x21,0x22,0x23,0x1e,0x1f,0x24,0x25,0x1c,0x1d,0x26,0x27,0x1a,0x1b,0x28,0x29,\r\n         0x18,0x19,0x2a,0x2b,0x16,0x17,0x2c,0x2d,0x14,0x15,0x2e,0x2f,0x12,0x13,0x30,0x31,\r\n         0x10,0x11,0x32,0x33,0x0e,0x0f,0x34,0x35,0x0c,0x0d,0x36,0x37,0x0a,0x0b,0x38,0x39,\r\n         0x08,0x09,0x3a,0x3b,0x06,0x07,0x3c,0x3d,0x04,0x05,0x3e,0x3f,0x02,0x03,0x40,0x41,\r\n         0x00,0x01,0x42,0x43,\r\n         // extra\r\n         0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d};\r\n#else\r\n    static const unsigned char szGATOrder[C_iDiskNbGranules] = \r\n        {0x20,0x21,0x22,0x23,0x1e,0x1f,0x24,0x25,0x1c,0x1d,0x26,0x27,0x1a,0x1b,0x28,0x29,\r\n         0x18,0x19,0x2a,0x2b,0x16,0x17,0x2c,0x2d,0x14,0x15,0x2e,0x2f,0x12,0x13,0x30,0x31,\r\n         0x10,0x11,0x32,0x33,0x0e,0x0f,0x34,0x35,0x0c,0x0d,0x36,0x37,0x0a,0x0b,0x38,0x39,\r\n         0x08,0x09,0x3a,0x3b,0x06,0x07,0x3c,0x3d,0x04,0x05,0x3e,0x3f,0x02,0x03,0x40,0x41,\r\n         0x00,0x01,0x42,0x43};\r\n#endif // TRACKS40\r\n#endif // TRACKS80 \r\n    static unsigned char cCurGranule = 0;\r\n    static unsigned char cNextGranule = 0;\r\n    static int iFileNo = 0;\r\n\r\n    FILE *fIn;                        // Input file handle\r\n    int iBytesRead = 0;               // Number of bytes read from input file\r\n    unsigned char cFirstGranule = 0;  // Index of first granule of current file\r\n    long iPos;                        // Counter for loop when writing DSK\r\n\r\n    char *pszTemp = NULL;             // Temp string pointer\r\n    char cTemp;                       // One character\r\n    int iFilenameLen = 0;             // Filename length\r\n    int iAnswer;                      // User's answer to getch() question\r\n    unsigned char cFileType,          // File type (0, 1, 2)\r\n                  cFileMode;          // File mode (0, 255)\r\n\r\n                                      // statFile for getting file size\r\n#ifdef WIN32\r\n    struct _stat statFile;\r\n#else\r\n    struct stat statFile;\r\n#endif\r\n\r\n\r\n    // Open input file\r\n    if ((fIn = fopen(pszFilename, \"rb\")) == NULL) {\r\n        perror(\"Error opening input file\");\r\n        return 0;\r\n    }\r\n    // Get file size\r\n    fseek(fIn, 0, SEEK_SET);\r\n#ifdef WIN32\r\n    _stat(pszFilename, &statFile);\r\n#else\r\n    stat(pszFilename, &statFile);\r\n#endif\r\n    // If file size larger then number of space left on remaining granules,\r\n    // display \"Disk full\" error and abort.\r\n    if ((unsigned long)statFile.st_size > (sizeof(szGATOrder)-cCurGranule)*0x900) {\r\n        printf(\"Disk full.\\n\");\r\n        return 1;\r\n    }\r\n\r\n    // If first file, initialize disk\r\n    if (iFileNo == 0) {\r\n        // Initialize whole disk with 0xff, GAT track with 0xff, \r\n        // GAT index sector with 0x00, GAT index with 0xff\r\n        memset(szDisk,0xff,sizeof(szDisk));\r\n        memset(szGATTrack,0xff,sizeof(szGATTrack));\r\n        memset(&szGATTrack[C_iDiskGATTrackGATPos],0x00,0x100);\r\n        memset(&szGATTrack[C_iDiskGATTrackGATPos],0xff,C_iDiskNbGranules);\r\n    }\r\n\r\n    // Copy file to disk, one granule at a time\r\n    cFirstGranule = cNextGranule;\r\n    while (!ferror(fIn) && !feof(fIn) && cNextGranule < sizeof(szGATOrder)) {\r\n        cCurGranule = cNextGranule;\r\n        iBytesRead = fread(&szDisk[szGATOrder[cNextGranule]*0x900], sizeof(unsigned char), 0x900, fIn);\r\n        cNextGranule++;\r\n        szGATTrack[0x100+szGATOrder[cCurGranule]] = !feof(fIn) ? szGATOrder[cNextGranule] : (0xc1+iBytesRead/0x100);\r\n    }\r\n\r\n    // Close input file\r\n    fclose(fIn);\r\n\r\n     if (force_file_type) {\r\n         cFileType = file_type;\r\n         switch (cFileType) {\r\n             case 0: \r\n                cFileMode = 0; // BASIC / Binary\r\n                printf(\"File type: BASIC. \");\r\n                break;\r\n               \r\n             case 1: \r\n               cFileMode = 0xFF; // DATA / ASCII\r\n               printf(\"File type: Data. \");   \r\n               break;\r\n             \r\n             case 2: \r\n                cFileMode = 0; // Machine Language / Binary\r\n                printf(\"File type: Machine language. \");\r\n                break;\r\n                \r\n             case 3: \r\n                cFileMode = 0xFF; // Editor / ASCII\r\n                printf(\"File type: Text. \");\r\n                break;\r\n         }\r\n         \r\n         if (force_file_mode) {\r\n             cFileMode = file_mode;\r\n         }\r\n\r\n        printf(\"File mode: \");\r\n        switch (cFileMode) {\r\n            case 0x00: printf(\"Binary.\\n\"); break;\r\n            case 0xff: printf(\"ASCII.\\n\");  break;\r\n        }\r\n     }\r\n     else {\r\n    \r\n        // File type\r\n        // Evaluate file type from first character read\r\n        switch (szDisk[szGATOrder[cFirstGranule]*0x900]) {\r\n            case 0x00:  // Machine language / Binary\r\n                printf(\"File type: Machine language. File mode: Binary.\\n\");\r\n                cFileType = 2;\r\n                cFileMode = 0;\r\n                break;\r\n            case 0xff:  // BASIC / Binary\r\n                printf(\"File type: BASIC. File mode: Binary.\\n\");\r\n                cFileType = 0;\r\n                cFileMode = 0;\r\n                break;\r\n\r\n            default:\r\n            \r\n                printf(\"File type unknown (might be an ASCII BASIC program or a data file).\\n\");\r\n                // Query file type\r\n                printf(\"Enter file type (0 = BASIC, 1 = Data, 2 = ML, 3 = Text): \");\r\n                while ((iAnswer = getch()) < '0' || iAnswer > '3') {\r\n                    if (iAnswer == -1 || iAnswer == 3) {\r\n                        printf(\"Aborted.\");\r\n                        return 0;\r\n                    }\r\n                }\r\n                // Evaluate file type from user input\r\n                cFileType = iAnswer-'0';\r\n                printf(\"\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\");\r\n                printf(\"File type:                                              \");\r\n                printf(\"\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\");\r\n                switch (cFileType) {\r\n                    case 0x00: printf(\"BASIC. \"); break;\r\n                    case 0x01: printf(\"Data. \");  break;\r\n                    case 0x02: printf(\"Machine language. \");    break;\r\n                    case 0x03: printf(\"Text. \");    break;\r\n                }\r\n\r\n                // Input file mode\r\n                switch (cFileType) {\r\n                    case 0x00:\r\n                    case 0x01:\r\n                    case 0x03:\r\n                        printf(\"Enter file mode (0 = Binary, [1] = ASCII): \");\r\n                        break;\r\n                    case 0x02:\r\n                        printf(\"Enter file mode ([0] = Binary, 1 = ASCII): \");\r\n                        break;\r\n                }\r\n                while ((iAnswer = getch()) != '0'  // Binary\r\n                    && iAnswer != '1'              // ASCII\r\n                    && iAnswer != 13               // Enter (default)\r\n                    && iAnswer != 32) {            // Space (default)\r\n                    if (iAnswer == -1 || iAnswer == 3) {\r\n                        printf(\"Aborted.\");\r\n                        return 0;\r\n                    }\r\n                }\r\n                switch (iAnswer) {\r\n                    case '0':  // Binary\r\n                        cFileMode = 0;\r\n                        break;\r\n                    case '1':  // ASCII\r\n                        cFileMode = (char)0xff;\r\n                    case 13:   // Enter (default)\r\n                    case 32:   // Space (default)\r\n                        switch (cFileType) {\r\n                            case 0x00: \r\n                            case 0x01:\r\n                            case 0x03:\r\n                                cFileMode = (char)0xff;\r\n                                break;\r\n                            case 0x02:\r\n                                cFileMode = 0;\r\n                                break;\r\n                        }\r\n                        break;\r\n                }\r\n                printf(\"\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\");\r\n                printf(\"File mode:                                \");\r\n                printf(\"\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\\x8\");\r\n                switch (cFileMode) {\r\n                    case 0x00: printf(\"Binary.\\n\"); break;\r\n                    case 0xff: printf(\"ASCII.\\n\");  break;\r\n                }\r\n\r\n                break;\r\n        }\r\n    }\r\n    printf(\"\\n\");\r\n\r\n    // Initialize disk's GAT directory file data with 0x00\r\n    memset(&szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20],0x00,0x20);\r\n\r\n    // Copy filename to GAT directory file data\r\n    // Make filename uppercase\r\n    strtoupper(pszFilename);\r\n    // Cut after last backslash\r\n    if ((pszTemp = strrchr(pszFilename, '\\\\')) == NULL)\r\n        pszTemp = pszFilename;\r\n    else\r\n        pszTemp = pszTemp++;\r\n    // Write filename\r\n    while ((cTemp = pszTemp[0]) != '.' && cTemp != 0x00 && iFilenameLen < 8) {\r\n        cTemp = toupper(cTemp);\r\n        if (strchr(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-#$%&'()@ \",cTemp) != NULL)\r\n            szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+(iFilenameLen++)] = cTemp;\r\n        pszTemp++;\r\n    }\r\n    while (iFilenameLen < 8)\r\n        szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+(iFilenameLen++)] = ' ';\r\n    if ((pszTemp = strrchr(pszTemp,'.')) != NULL) {\r\n        pszTemp++;\r\n        while ((cTemp = pszTemp[0]) != 0x00 && iFilenameLen < 11) {\r\n            cTemp = toupper(cTemp);\r\n            if (strchr(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-#$%&'()@ \",cTemp) != NULL)\r\n                szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+(iFilenameLen++)] = cTemp;\r\n            pszTemp++;\r\n        }\r\n    }\r\n    while (iFilenameLen < 11)\r\n        szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+(iFilenameLen++)] = ' ';\r\n\r\n    // Set file type\r\n    // BASIC -> 0x00, Data -> 0x01, ML -> 0x02\r\n    szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+0x0b] = cFileType;\r\n    // Set file mode (correct pos?)\r\n    // ASCII -> 0x00, Binary -> 0xff\r\n    szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+0x0c] = cFileMode;\r\n    // Set file first granule\r\n    szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+0x0d] = szGATOrder[cFirstGranule];\r\n    // Set file last granule length (MSB)\r\n    szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+0x0e] = (char)(iBytesRead != 0 && iBytesRead % 0x100 == 0 ? 0x01 : 0x00);\r\n    // Set file last granule length (LSB)\r\n    szGATTrack[C_iDiskGATTrackDirPos+iFileNo*0x20+0x0f] = (char)(iBytesRead % 0x100);\r\n\r\n    iFileNo++;\r\n\r\n    // Write disk\r\n    if (cLast == 1) {\r\n        // Move 0x13200+ of one track to make room for GAT\r\n        memmove(\r\n            &szDisk[C_iDiskGATTrackPos+0x900*2],\r\n            &szDisk[C_iDiskGATTrackPos],\r\n            sizeof(szDisk)-C_iDiskGATTrackPos-0x900*2);\r\n\r\n        // Copy GAT track to disk\r\n        memcpy(&szDisk[C_iDiskGATTrackPos],szGATTrack,sizeof(szGATTrack));\r\n\r\n        for (iPos = 0; iPos < sizeof(szDisk); iPos++)\r\n            fprintf(fOut, \"%c\", szDisk[iPos]);\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\n// Main function\r\nint main(int argc, char **argv) {\r\n    FILE *outfile;            // Output file handle (for writing DSK)\r\n    FILE *infile = NULL;      // Input file handle (for testing existance)\r\n    char szInFile[C_iFilenameMaxLen+1],     // Input filename (when user-input)\r\n         szOutFile[C_iFilenameMaxLen+4+1];  // Output DSK filename\r\n    int iArg;                 // Counter to loop through arguments\r\n    char cContinue = 1;       // Set to 0 if adding a file fails\r\n    char *pszExt;             // Pointer to extension within filename\r\n    char cInputStartArg = 1;  // Start argument containing input filename\r\n                              //  (changed to 2 if DSK output file specified)\r\n    int iAnswer;              // User's answer to getch() question\r\n    char cFirstTry = 1;       // 1 if first try inputting filename, otherwise 0\r\n   \r\n    // Display header\r\n    printf(\"File2DSK - Command line CoCo DSK creation utility\\n\");\r\n    printf(\"Version 1.0.8 (Jun 28, 2016)\\n\");\r\n    printf(\"Freeware, copyright 2006 by Patrick Benny\\n\");\r\n    printf(\"Inspired by DiskTape v1.1 copyright 1998 by Jean-Francois Morin\\n\");\r\n    printf(\"Modified by Guillaume Major\\n\\n\");\r\n\r\n    printf(\"http://www.chipple.net/coco/file2dsk/\\n\");\r\n#ifdef TRACKS80    \r\n    printf(\"This utility creates a 80 tracks CoCo virtual disk DSK file.\\n\\n\");\r\n#else\r\n#ifdef TRACKS40\r\n    printf(\"This utility creates a 40 tracks CoCo virtual disk DSK file.\\n\\n\");\r\n#else\r\n    printf(\"This utility creates a regular 35 tracks CoCo virtual disk DSK file.\\n\\n\");\r\n#endif // TRACKS40\r\n#endif // TRACKS80\r\n\r\n    int opt;\r\n    while ((opt = getopt(argc, argv, \"0123ba\")) != -1) {\r\n      switch (opt) {\r\n      case '0':\r\n      case '1':\r\n      case '2':\r\n      case '3':\r\n        file_type = opt-'0';\r\n        force_file_type = 1;\r\n        break;\r\n      case 'b':\r\n        file_mode = 0;\r\n        force_file_mode = 1;\r\n        break;\r\n      case 'a':\r\n        file_mode = 0xff;\r\n        force_file_mode = 1;\r\n        break;\r\n      default:\r\n        exit(EXIT_FAILURE);\r\n      }\r\n    }\r\n\r\n    if (optind >= argc) {\r\n        // Display instructions\r\n        printf(\"Syntax:\\n\");\r\n        printf(\"  1. file2dsk <src_file1> [src_file2 .. [src_fileN]]\\n\");\r\n        printf(\"     e.g. file2dsk program1.bin program2.bas (creates PROGRAM1.DSK)\\n\");\r\n        printf(\"  2. file2dsk <dest_file.dsk> <src_file1> [src_file2 .. [src_fileN]]\\n\");\r\n        printf(\"     e.g. file2dsk mydisk.dsk program1.bin program2.bas\\n\");\r\n        printf(\"In Windows, input files can also be simply drag-and-dropped onto this program.\\n\\n\");\r\n\r\n        printf(\"To create a DSK with only one file, enter filename. (Ctrl-C to quit)\\n\");\r\n\r\n        // Ask for filename until a valid filename is input\r\n        do {\r\n            // Display error message if not first try\r\n            if (cFirstTry == 0)\r\n                perror(\"Error opening input file\");\r\n            else\r\n                cFirstTry = 0;\r\n            // Get user input\r\n            printf(\"Input file (BIN, BAS, etc.): \");\r\n            fgets(szInFile, C_iFilenameMaxLen, stdin);\r\n            // Remove trailing new line\r\n            szInFile[strlen(szInFile)-1] = '\\0';\r\n        }\r\n        while (szInFile[0] != '\\0' && (infile = fopen(szInFile, \"rb\")) == NULL);\r\n        if (infile != NULL)\r\n            fclose(infile);\r\n\r\n        // If blank string input, abort\r\n        if (szInFile[0] == '\\0') {\r\n            printf(\"Aborted.\");\r\n            exit(1);\r\n        }\r\n        strcpy(szOutFile,strtoupper(szInFile));\r\n    }\r\n    else {\r\n\r\n        // Make all arguments uppercase\r\n        for (iArg = optind; iArg < argc && cContinue == 1; iArg++)\r\n            strtoupper(argv[iArg]);\r\n        // Set output filename\r\n        strcpy(szOutFile,argv[optind]);\r\n    }\r\n\r\n    // Adjust output file name\r\n    if (strstr(szOutFile,\".DSK\") != NULL)\r\n        optind++;\r\n    else {\r\n        if ((pszExt = strrchr(szOutFile,'.')) == NULL)\r\n            strcat(szOutFile,\".DSK\");\r\n        else\r\n            strcpy(pszExt,\".DSK\");\r\n    }\r\n    printf(\"Output DSK file: %s\\n\", szOutFile);\r\n\r\n    // Check whether output file exists\r\n    if ((outfile = fopen(szOutFile, \"r\")) != NULL) {\r\n        fclose(outfile);\r\n        printf(\"DSK file already exists, overwrite? Y/[N] \");\r\n        while ((iAnswer = toupper(getch())) != 'Y'\r\n            && iAnswer != 'N' \r\n            && iAnswer != 13    // Enter\r\n            && iAnswer != 32    // Space\r\n            && iAnswer != 3     // CTRL+C\r\n            && iAnswer != -1);  // Break?\r\n        if (iAnswer != 'Y') {\r\n            printf(\"Aborted.\");\r\n            exit(1);\r\n        }\r\n        printf(\"\\x8\\x8\\x8\\x8\\x8\\x8Y    \\n\\n\");\r\n    }\r\n\r\n    // Open output file\r\n    if ((outfile = fopen(szOutFile, \"wb\")) == NULL) {\r\n        perror(\"Error opening output file\");\r\n        exit(1);\r\n    }\r\n\r\n    // Add input file(s)\r\n    if (argc <= 1)\r\n        cContinue = AddFile(szInFile, outfile, 1);\r\n    else {\r\n        for (iArg = optind; iArg < argc && cContinue == 1; iArg++) {\r\n            printf(\"Input file: %s\\n\", argv[iArg]);\r\n            cContinue = AddFile(argv[iArg], outfile, (char)((iArg==argc-1)?1:0));\r\n        }\r\n    }\r\n\r\n    // Close output file\r\n    fclose(outfile);\r\n\r\n    // Check if disk creation successful\r\n    if (cContinue == 1)\r\n        printf(\"Done.\\n\");\r\n    else {\r\n        // Delete output file\r\n        unlink(szOutFile);\r\n        printf(\"Aborted.\\n\");\r\n    }\r\n\r\n    exit(0);\r\n}\r\n"
  },
  {
    "path": "tools/cmoc/coco/file2dsk/version_1.0.8.txt",
    "content": ""
  },
  {
    "path": "tools/cmoc/dragon/bin2cas.pl",
    "content": "#!/usr/bin/env perl\n\n#!/usr/bin/perl -wT\n\n# bin2cas.pl - convert binary data to CAS or WAV with optional autorun\n\n# Copyright (C) 2017 Ciaran Anscomb\n# License: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl-3.0.html>.\n# This is free software: you are free to change and redistribute it.\n# There is NO WARRANTY, to the extent permitted by law.\n#\n# Special exception: Code included in output (such as \"dunzip\") is not\n# considered to be part of this program, so the GPL doesn't apply to the\n# results.\n\n# See the output of \"bin2cas.pl --help\" for detailed usage information, with\n# examples.\n\n# Pre-v2.0: really rubbish\n# Pre-v3.0: getting better, but still limited\n# v3.0: complete overhaul\n#       supports multiple parts\n#       builds reasonably arbitrary autorun loader\n#       update VDG & SAM configs during loading\n#       manual cursor flasher for when video offset changed\n# v3.0a: tweak default samplerate to 12kHz if fast mode used\n#        slightly increase speed in fast mode\n# v3.1: default timing uses varying pulse widths to account for ROM delays\n#       --timing option selects between \"rom\" and \"simple\" timing\n#       fast cycle timing better at 9600Hz, so dropped default back\n#       slightly faster WAV creation by caching runs of samples\n# v3.2: don't redirect STDOUT\n#       new option --lds inserts stack adjustment code into autorun\n#       license foo, --version\n# v3.3: actually drop default to 9600Hz\n#       dzip using temp files under windows\n# v3.4: add --no-delay, --block-size, --gapped, --pause, --wav-bits\n#       --cas, --wav deprecated, use --mode or rely on file extension\n#       fix --no-eof\n#       tweak waveform output\n# v3.5: add --poke\n# v3.6: use Getopt::Long and Pod::Usage\n#       remove deprecated --dunzip\n#       accept $ as well as 0x to indicate hex argument\n# v3.7: add --vxor\n# v3.8: dzipped data needs *3* bytes clear of overlap!\n# v3.9: actually, dzip offset depends on number of runs at end\n# v3.10: include load_part, dunzip pointers at known address\n# v3.11: add --omit\n\nuse strict;\n\nrequire v5.10;\n\nuse Getopt::Long;\nuse Pod::Usage;\nuse File::Temp qw/tempfile tempdir/;\nuse Math::Trig;\nrequire bytes;\n\nuse constant VERSION => \"3.11\";\n\nuse constant {\n\tTYPE_BASIC => 0,\n\tTYPE_DATA => 1,\n\tTYPE_BINARY => 2,\n};\n\nuse constant {\n\tDDOS_TYPE_BASIC => 1,\n\tDDOS_TYPE_BINARY => 2,\n};\n\nuse constant {\n\tENCODING_BINARY => 0,\n\tENCODING_ASCII => 0xff,\n};\n\nuse constant {\n\tGAP_FALSE => 0,\n\tGAP_TRUE => 0xff,\n};\n\nuse constant {\n\tBLOCK_NAMEFILE => 0,\n\tBLOCK_DATA => 1,\n\tBLOCK_EOF => 0xff,\n};\n\nuse constant {\n\tINPUT_RAW => 0,\n\tINPUT_DRAGONDOS => 1,\n\tINPUT_COCO => 2,\n};\n\nuse constant DEFAULT_SAMPLE_RATE => 9600;\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n# Sekr1t options support writing specific games as accurately as possible:\n\n# Tube Way Army:\n# Loader: --name \"TWA\" --load 0 --exec 0 --gapped --timing rom\n# Delay: --pause --pause\n# Game: --no-filename --block-size 128 --block-fmt twa --timing twa\n\n# Superkid:\n# Loader: --name \"SUPERKID\" --load 0x012c --exec 0x4000 --timing rom\n# Block0: --no-filename --no-eof --timing sk.b0\n# Screen0: --no-filename --no-delay --no-eof --timing sk.s0\n#          --block-fmt bare --block-size 0\n# Screen1: --no-filename --no-delay --no-eof --timing sk.s1\n#          --block-fmt bare --block-size 0\n# Game: --no-filename --no-delay --no-eof --timing sk.g\n#       --block-fmt bare --block-size 0\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n# Map DragonDOS filetypes to tape filetypes.\n\nmy %ddos_to_tape_type = (\n\t\tDDOS_TYPE_BASIC => TYPE_BASIC,\n\t\tDDOS_TYPE_BINARY => TYPE_BINARY,\n\t\t);\n\n# Wave data.\n\nmy @wav_header = (\n\t\t0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00,\n\t\t0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20,\n\t\t0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,\n\t\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t\t0x01, 0x00, 0x08, 0x00, 0x64, 0x61, 0x74, 0x61,\n\t\t0x00, 0x00, 0x00, 0x00\n\t\t);\n\n# Timings\n\n# 'cycles' is the nominal number of CPU cycles (SAM / 16) in the waveform for\n# each bit (0, 1), the rest are pulse specs.\n\n# Pulse spec is three pairs of pulse delays (first pulse, second pulse):\n# - first bit of first byte\n# - remaining bits in each byte\n# - first bit of subsequent bytes\n\n# 'leader' is pulse spec while writing leader bytes and the sync byte\n# 'first' is pulse spec for the first byte in a block\n# 'rest' is pulse spec for remaining bytes in a block (until next leader)\n\n# The \"rom\" spec is intended to be the \"best fit\" for the Dragon ROM -\n# that is, the ROM will count an \"ideal\" pulse width for each bit. This should\n# improve reliability.\n\nmy %timing_simple = (\n\t\t'cycles' => [ 813, 435 ],\n\t\t'leader0' => [ 0, 0, 0, 0 ],\n\t\t'leader' => [ 0, 0, 0, 0 ],\n\t\t'type' => [ 46, 0, 0, 0 ],\n\t\t'size' => [ 46, 0, 0, 0 ],\n\t\t'data0' => [ 46, 0, 0, 0 ],\n\t\t'data' => [ 46, 0, 0, 0 ],\t\t# 818.75, 440.75 -> 629.75\n\t\t'sum' => [ 46, 0, 0, 0 ],\n\t\t);\n\nmy %timing_rom = (\n\t\t'cycles' => [ 26*28, 13*28 ],\n\t\t'leader0' => [ 205, 5, 68, 5 ],\n\t\t'leader' => [ 68, 5, 68, 5 ],\n\t\t'type' => [ 81, 5, 67, 5 ],\n\t\t'size' => [ 120, 5, 67, 5 ],\n\t\t'data0' => [ 120, 5, 67, 5 ],\n\t\t'data' => [ 120, 5, 67, 5 ],\t\t# 806.625, 442.625 -> 625.625\n\t\t'sum' => [ 120, 5, 67, 5 ],\n\t\t);\n\nmy %timing_fast = (\n\t\t'cycles' => [ 18*28, 7*28 ],\n\t\t'leader0' => [ 205, 5, 68, 5 ],\n\t\t'leader' => [ 68, 5, 68, 5 ],\n\t\t'type' => [ 81, 5, 67, 5 ],\n\t\t'size' => [ 120, 5, 67, 5 ],\n\t\t'data0' => [ 120, 5, 67, 5 ],\n\t\t'data' => [ 120, 5, 67, 5 ],\t\t# 582.625, 274.625 -> 428.125\n\t\t'sum' => [ 120, 5, 67, 5 ],\n\t\t);\n\nmy %timing_twa = (\n\t\t'cycles' => [ 26*28, 13*28 ],\n\t\t'leader0' => [ 114, 5, 54, 5 ],\n\t\t'leader' => [ 54, 5, 54, 5 ],\n\t\t'size' => [ 67, 5, 58, 5 ],\n\t\t'type' => [ 82, 5, 58, 5 ],\n\t\t'data0' => [ 101, 5, 58, 5 ],\n\t\t'data' => [ 106, 5, 58, 5 ],\t\t# 797.0, 433.0 -> 615.0\n\t\t'sum' => [ 106, 5, 58, 5 ],\n\t\t);\n\nmy %timing_sk_b0 = (\n\t\t'cycles' => [ 25*28, 11*28 ],\n\t\t'leader0' => [ 205, 5, 68, 5 ],\n\t\t'leader' => [ 68, 5, 68, 5 ],\n\t\t'type' => [ 81, 5, 67, 5 ],\n\t\t'size' => [ 120, 5, 67, 5 ],\n\t\t'data0' => [ 120, 5, 67, 5 ],\n\t\t'data' => [ 120, 5, 67, 5 ],\n\t\t'sum' => [ 120, 5, 67, 5 ],\n\t\t);\n\nmy %timing_sk_s0 = (\n\t\t'cycles' => [ 25*28, 11*28 ],\n\t\t'data0' => [ 89, 5, 67, 5 ],\n\t\t'data' => [ 112, 5, 67, 5 ],\n\t\t);\n\nmy %timing_sk_s1 = (\n\t\t'cycles' => [ 25*28, 11*28 ],\n\t\t'data0' => [ 115, 5, 67, 5 ],\n\t\t'data' => [ 112, 5, 67, 5 ],\n\t\t);\n\nmy %timing_sk_g = (\n\t\t'cycles' => [ 25*28, 11*28 ],\n\t\t'leader' => [ 132, 5, 67, 5 ],\n\t\t'data0' => [ 125, 5, 67, 5 ],\n\t\t'data' => [ 132, 5, 67, 5 ],\n\t\t'adj_period' => 8,\n\t\t'adj' => 6,\n\t\t);\n\nmy %timing_by_name = (\n\t\t'simple' => \\%timing_simple,\n\t\t'rom' => \\%timing_rom,\n\t\t'fast' => \\%timing_fast,\n\t\t'twa' => \\%timing_twa,\n\t\t'sk.b0' => \\%timing_sk_b0,\n\t\t'sk.s0' => \\%timing_sk_s0,\n\t\t'sk.s1' => \\%timing_sk_s1,\n\t\t'sk.g' => \\%timing_sk_g,\n\t\t);\n\n# Block format strings\n\nmy %fmt_strings = (\n\t'bare' => 'd',\n\t'twa' => 'iSTdCo',\n\t'normal' => 'itsdco',\n);\n\n# Autorun headers can include optional parts, concatenated and subject to\n# linking.\n\nmy @code_load_0 = (\n\t\"load_part\",\n\t\t0x9f, 0x7e,\t\t# stx\t<$7e\n\t\t0xad, 0x9f, 0xa0, 0x04,\t# jsr\t[CSRDON]\n\t\"l0\",\n);\n\nmy @code_load_flash = (\n\t\t0xb6, \">flash_addr\",\t# lda\t>flash_addr\n\t\t0x88, 0x40,\t\t# eora\t#$40\n\t# flash code starts off disabled (first load will still be in text mode)\n\t\"mod_flash\",\n\t\t0x8c, \">flash_addr\",\t# cmpx\t>flash_addr\n);\n\nmy @code_load_1 = (\n\t\t0xad, 0x9f, 0xa0, 0x06,\t# jsr\t[BLKIN]\n\t\t0x26, \"\\&<do_io_error\",\t# bne\tdo_io_error\n\t\t0x9f, 0x7e,\t\t# stx\t<$7e\n\t\t0x96, 0x7c,\t\t# lda\t<$7c\n\t\t0x4c,\t\t\t# inca\n\t\t0x26, \"\\&<l0\",\t\t# bne\tl0\n\t\"cas_off\",\n\t\t0xb6, 0xff, 0x21,\t# lda\t>$ff21\n\t\t0x84, 0xf7,\t\t# anda\t#$f7\n\t\t0xb7, 0xff, 0x21,\t# sta\t>$ff21\n\t\"do_rts\",\n\t\t0x39,\t\t\t# rts\n\t\"do_io_error\",\n\t\t0x8d, \"\\&<cas_off\",\t# bsr\tcas_off\n\t\t0x8e, \">io_error\",\t# ldx\t#io_error\n\t\t0x8d, \"\\&<out_string\",\t# bsr\tout_string\n\t\"l1\",\n\t\t0x20, \"\\&<l1\",\t\t# bra\tl1\n\t\"out_string\",\n\t\t0xa6, 0x80,\t\t# lda\t,x+\n\t\t0x27, \"\\&<do_rts\",\t# beq\tdo_rts\n\t\t0xad, 0x9f, 0xa0, 0x02,\t# jsr\t[OUTCH]\n\t\t0x20, \"\\&<out_string\",\t# bra\tout_string\n\t\"io_error\",\n\t\t0x49, 0x2f, 0x4f, 0x20,\t# fcc\t\"I/O \"\n\t\t0x45, 0x52, 0x52, 0x4f,\t# fcc\t\"ERRO\"\n\t\t0x52, 0x00,\t\t# fcc\t\"R\",0\n);\n\nmy @code_disable_flasher = (\n\t\t0x86, 0x8c,\t\t# lda\t#$8c\t\t; cmpx\n\t\t0xb7, \">mod_flash\",\t# sta\tmod_flash\n);\n\nmy @code_enable_flasher = (\n\t\t0x86, 0xb7,\t\t# lda\t#$8c\t\t; sta\n\t\t0xb7, \">mod_flash\",\t# sta\tmod_flash\n);\n\nmy @code_test_arch = (\n\t\t0xb6, 0xa0, 0x00,\t# lda\t$a000\n\t\t0x84, 0x20,\t\t# anda\t#$20\n\t\t0x97, 0x10,\t\t# sta\t<$10\n);\n\nmy @code_fast = (\n\t\t0xcc, \">fast_pw\",\t# ldd\t#fast_pw\n\t\t0x0d, 0x10,\t\t# tst\t<$10\n\t\t0x26, \"\\&<fl1\",\t\t# bne\tfl1\n\t\t0xdd, 0x92,\t\t# std\t<$92\n\t\t0x97, 0x94,\t\t# sta\t<$94\n\t\t0x20, \"\\&<fl2\",\t\t# bra\tfl2\n\t\"fl1\",\n\t\t0xdd, 0x90,\t\t# std\t<$90\n\t\t0x97, 0x8f,\t\t# sta\t<$8f\n\t\"fl2\",\n);\n\nmy @code_dunzip = (\n\t\"dunzip\",\n\t\t0x34, 0x06,\t\t# pshs\td\n\t\"dunz_loop\",\n\t\t0xec, 0x81,\t\t# ldd\t,x++\n\t\t0x2a, \"\\&<dunz_run\",\t# bpl\tdunz_run\n\t\t0x5d,\t\t\t# tstb\n\t\t0x2a, \"\\&<dunz_7_7\",\t# bpl\tdunz_7_7\n\t\"dunz_14_8\",\n\t\t0x58,\t\t\t# lslb\n\t\t0x47,\t\t\t# asra\n\t\t0x56,\t\t\t# rorb\n\t\t0x31, 0xcb,\t\t# leay\td,u\n\t\t0xe6, 0x80,\t\t# ldb\t,x+\n\t\t0x20, \"\\&<dl0\",\t\t# bra\tdl0\n\t\"dunz_7_7\",\n\t\t0x31, 0xc6,\t\t# leay\ta,u\n\t\"dl0\",\n\t\t0xa6, 0xa0,\t\t# lda\t,y+\n\t\t0xa7, 0xc0,\t\t# sta\t,u+\n\t\t0x5c,\t\t\t# incb\n\t\t0x28, \"\\&<dl0\",\t\t# bvc\tdl0\n\t\t0x20, \"\\&<dl2\",\t\t# bra\tdl2\n\t\"dl1\",\n\t\t0xe6, 0x80,\t\t# ldb\t,x+\n\t\"dunz_run\",\n\t\t0xe7, 0xc0,\t\t# stb\t,u+\n\t\t0x4c,\t\t\t# inca\n\t\t0x28, \"\\&<dl1\",\t\t# bvc\tdl1\n\t\"dl2\",\n\t\t0xac, 0xe4,\t\t# cmpx\t,s\n\t\t0x25, \"\\&<dunz_loop\",\t# blo\tdunz_loop\n\t\t0x35, 0x86,\t\t# puls\td,pc\n);\n\n# Reverse dunzip.  Ok to reuse labels as only one will be included.\n\nmy @code_dunzipr = (\n\t\"dunzip\",\n\t\t0x34, 0x06,\t\t# pshs\td\n\t\"dunz_loop\",\n\t\t0xec, 0x83,\t\t# ldd\t,--x\n\t\t0x2b, \"\\&<dunz_run\",\t# bmi\tdunz_run\n\t\t0x5d,\t\t\t# tstb\n\t\t0x2a, \"\\&<dunz_7_7\",\t# bpl\tdunz_7_7\n\t\"dunz_14_8\",\n\t\t0x58,\t\t\t# lslb\n\t\t0x44,\t\t\t# lsra\n\t\t0x56,\t\t\t# rorb\n\t\t0x31, 0xcb,\t\t# leay\td,u\n\t\t0xe6, 0x82,\t\t# ldb\t,-x\n\t\t0x20, \"\\&<dj0\",\t\t# bra\tdj0\n\t\"dunz_7_7\",\n\t\t0x31, 0xc6,\t\t# leay\ta,u\n\t\"dj0\",\n\t\t0x31, 0x21,\t\t# leay\t1,y\n\t\"dl0\",\n\t\t0xa6, 0xa2,\t\t# lda\t,-y\n\t\t0xa7, 0xc2,\t\t# sta\t,-u\n\t\t0x5c,\t\t\t# incb\n\t\t0x28, \"\\&<dl0\",\t\t# bvc\tdl0\n\t\t0x20, \"\\&<dl2\",\t\t# bra\tdl2\n\t\"dl1\",\n\t\t0xe6, 0x82,\t\t# ldb\t,-x\n\t\"dunz_run\",\n\t\t0xe7, 0xc2,\t\t# stb\t,-u\n\t\t0x4c,\t\t\t# inca\n\t\t0x26, \"\\&<dl1\",\t\t# bne\tdl1\n\t\"dl2\",\n\t\t0xac, 0xe4,\t\t# cmpx\t,s\n\t\t0x22, \"\\&<dunz_loop\",\t# bhi\tdunz_loop\n\t\t0x35, 0x86,\t\t# puls\td,pc\n);\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n# Output options\n\nmy $out_filename;\nmy $wav_out;\nmy $sample_rate;\nmy $bits_per_sample = 8;\n\n# Global options\n\nmy $autorun = 0;\nmy $leader = 256;\n\n# Per-file options\n\nmy $input_mode = INPUT_RAW;\nmy $want_name;\nmy $want_load;\nmy $want_exec;\nmy $want_zload;\nmy $want_fnblock;\n\nmy $want_delay = 1;\nmy $block_size = 255;\nmy $block_fmt = 'normal';\nmy $want_dzip = 0;\nmy $want_vxor = 0;\nmy $want_eof = 1;\nmy $want_eof_data = 0;\nmy $want_gapped = 0;\nmy $want_timing;\nmy $want_omit = 0;\n\nmy $want_flasher = 0;\n\n# Persistent\n\nmy $autorun_name;\nmy $autorun_exec;\nmy $any_dzip = 0;\nmy $any_fast = 0;\nmy $any_flasher = 0;\nmy $reverse_dzip = 0;\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nmy $out_fd;\n\n# Relocation\n\nmy $mc_org;\nmy $mc_pc;\nmy %mc_label = ();\nmy @mc_link;\nmy $mc_data;\n\n# WAV\n\nmy $num_channels = 1;\nmy $sample_count = 0;\nmy $ao_error = 0;\nmy %sinewaves = ();\nmy $normal_timing = 'rom';\nmy $timing;\n\nmy $adj_period = 0;\nmy $adj = 0;\nmy $adj_count = 0;\n\n# this combination of slow cycle pulse width boundaries seems to allow reliable\n# tape speed variance of at least +/-7% when emitting 30% faster data to a\n# 9600Hz WAV\n$mc_label{'fast_pw'} = 0x0c06;\n\n# de-taint PATH for call out to dzip\nif ($ENV{'PATH'} =~ /^(.*)$/) {\n\t$ENV{'PATH'} = $1;\n}\n\nmy @files = ();\nmy %file = ();\n\nGetopt::Long::Configure(\"gnu_getopt\", \"pass_through\");\n\n# helper to parse integer options - allow hex values prefixed by $ or 0x\nsub eval_int {\n\tmy $string = shift;\n\t$string =~ s/^\\$/0x/;\n\tif ($string =~ /^(\\d+|0x[\\da-f]+)$/i) {\n\t\treturn eval $1;\n\t}\n\tdie \"invalid number format: $string\\n\";\n}\n\nGetOptions(\n\t\t# Output options:\n\t\t\"output|o=s\" => \\$out_filename,\n\t\t\"mode|m=s\" => sub {\n\t\t\tshift;\n\t\t\tmy $v = lc(shift @ARGV);\n\t\t\t$wav_out = ($v eq 'wav');\n\t\t},\n\t\t\"cas\" => sub { $wav_out = 0; },\n\t\t\"wav-out|wav\" => sub { $wav_out = 1; },\n\t\t\"wav-rate|r=s\" => sub { shift; $sample_rate = eval_int(shift) },\n\t\t\"wav-bits=s\" => sub { shift; $bits_per_sample = eval_int(shift) },\n\n\t\t# Global options:\n\t\t\"autorun|A!\" => \\$autorun,\n\t\t\"leader=s\" => sub { shift; $leader = eval_int(shift) },\n\n\t\t# Per-file options:\n\t\t\"B\" => sub { $input_mode = INPUT_RAW; },\n\t\t\"D\" => sub { $input_mode = INPUT_DRAGONDOS; },\n\t\t\"C\" => sub { $input_mode = INPUT_COCO; },\n\n\t\t\"name|n=s\" => sub {\n\t\t\tshift;\n\t\t\t$want_name = shift;\n\t\t\t$autorun_name = $want_name;\n\t\t},\n\t\t\"load|l=s\" => sub { shift; $want_load = eval_int(shift) },\n\t\t\"exec|e=s\" => sub {\n\t\t\tshift;\n\t\t\t$want_exec = eval_int(shift);\n\t\t\t$autorun_exec = $want_exec;\n\t\t},\n\t\t\"zload=s\" => sub { shift; $want_zload = eval_int(shift) },\n\t\t\"filename!\" => \\$want_fnblock,\n\n\t\t\"delay!\" => \\$want_delay,\n\t\t\"block-size=s\" => sub { shift; $block_size = eval_int(shift) },\n\t\t\"block-fmt=s\" => \\$block_fmt,\n\t\t\"eof!\" => \\$want_eof,\n\t\t\"gapped!\" => \\$want_gapped,\n\t\t\"timing|T=s\" => sub {\n\t\t\tshift;\n\t\t\t$want_timing = shift;\n\t\t\t$any_fast = 1 if ($want_timing eq 'fast');\n\t\t},\n\t\t\"fast\" => sub {\n\t\t\t$want_timing = 'fast';\n\t\t\t$any_fast = 1;\n\t\t},\n\t\t\"no-fast\" => sub { undef $want_timing; },\n\t\t\"omit!\" => \\$want_omit,\n\n\t\t\"no-flasher|noflasher\" => sub { $want_flasher = 0; },\n\t\t\"flasher\" => sub {\n\t\t\t$want_flasher = 1;\n\t\t\t$any_flasher = 1;\n\t\t},\n\t\t\"vxor|x=s\" => sub {\n\t\t\tshift;\n\t\t\t$want_vxor = shift;\n\t\t},\n\t\t\"no-vxor|novxor\" => sub { $want_vxor = 0; },\n\t\t\"i=s\" => sub { shift; push @files, input_file(shift); },\n\n\t\t# Per-file persistent options:\n\t\t\"dzip|z\" => sub {\n\t\t\t$want_dzip = 1;\n\t\t\t$any_dzip = 1;\n\t\t},\n\t\t\"no-dzip|nodzip\" => sub { $want_dzip = 0; },\n\t\t\"reverse-dzip\" => sub { $reverse_dzip = 1; },\n\t\t\"eof-data|E!\" => \\$want_eof_data,\n\n\t\t# Inter-file options:\n\t\t\"lds=s\" => sub {\n\t\t\tshift;\n\t\t\tpush @files, { 'code' => \"lds\", 'value' => eval_int(shift) };\n\t\t},\n\t\t\"pause\" => sub {\n\t\t\tpush @files, { 'code' => \"pause\", 'value' => 0 };\n\t\t},\n\t\t\"sam-f=s\" => sub {\n\t\t\tshift;\n\t\t\tpush @files, { 'code' => \"set_sam_f\", 'value' => eval_int(shift) };\n\t\t},\n\t\t\"sam-v=s\" => sub {\n\t\t\tshift;\n\t\t\tmy $v = eval_int(shift);\n\t\t\tpush @files, { 'code' => \"set_sam_v\", 'value' => $v };\n\t\t},\n\t\t\"vdg=s\" => sub {\n\t\t\tshift;\n\t\t\tpush @files, { 'code' => \"set_vdg\", 'value' => eval_int(shift) };\n\t\t},\n\t\t\"poke=s\" => sub {\n\t\t\tshift;\n\t\t\tmy $v = shift;\n\t\t\tpush @files, { 'code' => \"poke\", 'value' => $v };\n\t\t},\n\n\t\t# Other options:\n\t\t\"version\" => \\&version_text,\n\t\t\"help|?\" => sub { pod2usage(-verbose => 2); },\n\n\t\t# pass_through option means anything else hits this, so die if\n\t\t# it looks like an option we don't handle, else treat it as an\n\t\t# input file:\n\t\t\"<>\" => sub {\n\t\t\tmy $file = shift;\n\t\t\tdie \"Unrecognised option: $file\\n\" if ($file =~ /^-/);\n\t\t\tpush @files, input_file($file);\n\t\t},\n\t  ) or exit(2);\n\ndie \"invalid value for --wav-bits\\n\" if ($bits_per_sample != 8 && $bits_per_sample != 16);\n\nif (defined $out_filename && $out_filename =~ /(.*)/) {\n\t$out_filename = $1;  # de-taint\n} else {\n\tdie \"No output filename specified\\n\";\n}\n\nif (@ARGV) {\n\tshift @ARGV;  # discard --\n\twhile (@ARGV) {\n\t\tpush @files, input_file(shift @ARGV);\n\t}\n}\n\n# Prepare output stream.\n\nopen($out_fd, \">\", $out_filename) or die $!;\nbinmode $out_fd;\nif ($out_filename =~ /\\.cas$/i) {\n\t$wav_out //= 0;\n} elsif ($out_filename =~ /\\.wav$/i) {\n\t$wav_out //= 1;\n}\n\n$sample_rate //= DEFAULT_SAMPLE_RATE;\nmy $sam_rate = 14318180;\nmy $bytes_per_sample = $bits_per_sample >> 3;\n\n# WAV header?\nif ($wav_out) {\n\t# NumChannels\n\t$wav_header[22] = $num_channels;\n\t$wav_header[23] = ($num_channels >> 8) & 0xff;\n\t# SampleRate\n\t$wav_header[24] = $sample_rate & 0xff;\n\t$wav_header[25] = ($sample_rate >> 8) & 0xff;\n\t$wav_header[26] = ($sample_rate >> 16) & 0xff;\n\t$wav_header[27] = ($sample_rate >> 24) & 0xff;\n\t# ByteRate\n\tmy $byte_rate = $sample_rate * $num_channels * $bytes_per_sample;\n\t$wav_header[28] = $byte_rate & 0xff;\n\t$wav_header[29] = ($byte_rate >> 8) & 0xff;\n\t$wav_header[30] = ($byte_rate >> 16) & 0xff;\n\t$wav_header[31] = ($byte_rate >> 24) & 0xff;\n\t# BlockAlign\n\tmy $block_align = ($num_channels * $bits_per_sample) / 8;\n\t$wav_header[32] = $block_align & 0xff;\n\t$wav_header[33] = ($block_align >> 8) & 0xff;\n\t# BitsPerSample\n\t$wav_header[34] = $bits_per_sample & 0xff;\n\t$wav_header[35] = ($bits_per_sample >> 8) & 0xff;\n\tprint $out_fd pack(\"C*\", @wav_header);\n}\n\n# Write file(s).\n\nwrite_autorun(\\@files) if ($autorun);\nwrite_all_files(\\@files);\n\n# Close output.\n\nif ($wav_out) {\n\t# rewrite Subchunk2Size\n\t$sample_count *= $bytes_per_sample;\n\tseek($out_fd, 40, 0);\n\tprint $out_fd pack(\"C\", $sample_count & 0xff);\n\tprint $out_fd pack(\"C\", ($sample_count >> 8) & 0xff);\n\tprint $out_fd pack(\"C\", ($sample_count >> 16) & 0xff);\n\tprint $out_fd pack(\"C\", ($sample_count >> 24) & 0xff);\n\t# rewrite ChunkSize\n\t$sample_count += 36;\n\tseek($out_fd, 4, 0);\n\tprint $out_fd pack(\"C\", $sample_count & 0xff);\n\tprint $out_fd pack(\"C\", ($sample_count >> 8) & 0xff);\n\tprint $out_fd pack(\"C\", ($sample_count >> 16) & 0xff);\n\tprint $out_fd pack(\"C\", ($sample_count >> 24) & 0xff);\n}\n\nexit 0;\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nsub reset_default_options {\n\t$input_mode = INPUT_RAW;\n\tundef $want_name;\n\tundef $want_load;\n\tundef $want_exec;\n\tundef $want_zload;\n\tundef $want_fnblock;\n\t$want_delay = 1;\n\t$block_size = 255;\n\t$block_fmt = 'normal';\n\t$want_eof = 1;\n\t$want_gapped = 0;\n\tundef $want_timing;\n\t$want_flasher = 0;\n\t$want_vxor = 0;\n}\n\n# Read a file, applying current default options, reset default options.\n\nsub input_file {\n\tmy ($filename,$file) = @_;\n\t$file //= {};\n\n\t# defaults\n\t$file->{'fnblock'} //= $want_fnblock;\n\t$file->{'delay'} //= $want_delay;\n\t$file->{'block_size'} //= $block_size;\n\t$file->{'block_fmt'} //= $block_fmt;\n\t$file->{'eof'} //= $want_eof;\n\t$file->{'eof_data'} //= $want_eof_data;\n\t$file->{'gapped'} //= $want_gapped;\n\t$file->{'timing'} //= $want_timing;\n\t$file->{'flasher'} //= $want_flasher;\n\t$file->{'omit'} //= $want_omit;\n\n\t# read in appropriate mode\n\t$file = do {\n\t\tif ($input_mode == INPUT_DRAGONDOS) {\n\t\t\tread_dragondos($filename, $file);\n\t\t} elsif ($input_mode == INPUT_COCO) {\n\t\t\tread_coco($filename, $file);\n\t\t} else {\n\t\t\tread_raw($filename, $file);\n\t\t}\n\t};\n\n\t# overrides\n\t$file->{'name'} = $want_name if (defined $want_name);\n\t$file->{'load'} = $want_load if (defined $want_load);\n\t$file->{'exec'} = $want_exec if (defined $want_exec);\n\t$file->{'zload'} = $want_zload if (defined $want_zload);\n\n\tdie \"No data\\n\" unless exists $file->{'segments'};\n\n\t# XXX only deal with single-segment binaries for now\n\tcoalesce_file($file);\n\n\tvxor_file($file) if ($want_vxor);\n\tdzip_file($file) if ($want_dzip);\n\n\treset_default_options();\n\n\treturn $file;\n}\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n# File readers\n\nsub open_file {\n\tmy ($filename,$file) = @_;\n\t$file //= {};\n\topen(my $in, \"<\", $filename) or die \"Failed to open $filename: $!\\n\";\n\tbinmode $in;\n\tif ($filename =~ /^([^\\.]{1,8})/) {\n\t\t$file->{'name'} //= uc $1;\n\t}\n\treturn $in;\n}\n\n# Raw binary: just slurp data into one segment\nsub read_raw {\n\tmy ($filename,$file) = @_;\n\t$file //= {};\n\tmy $in = open_file($filename, $file);\n\tmy %segment = (\n\t\t'start' => 0,\n\t\t'size' => 0,\n\t\t'data' => \"\",\n\t);\n\tmy $data;\n\tmy $rsize;\n\tdo {\n\t\t$rsize = read $in, $data, 0x10000;\n\t\t$segment{'data'} .= $data;\n\t\t$segment{'size'} += $rsize;\n\t} while ($rsize == 0x10000);\n\t$file->{'segments'} = [ \\%segment ];\n\tclose $in;\n\treturn $file;\n}\n\n# DragonDOS binary - single segment only\nsub read_dragondos {\n\tmy ($filename,$file) = @_;\n\tmy $in = open_file($filename, $file);\n\n\tgetc($in);  # skip $55\n\tmy $type = unpack(\"C\", getc($in));\n\tmy $start = (unpack(\"C\", getc($in)) << 8) | unpack(\"C\", getc($in));\n\tmy $size = (unpack(\"C\", getc($in)) << 8) | unpack(\"C\", getc($in));\n\tmy $exec = (unpack(\"C\", getc($in)) << 8) | unpack(\"C\", getc($in));\n\tgetc($in);  # skip $aa\n\n\tmy $data;\n\tmy $rsize = read $in, $data, $size;\n\tif ($rsize != $size) {\n\t\tprint STDERR \"Warning: short read from DragonDOS binary\\n\";\n\t}\n\tmy %segment = (\n\t\t'start' => $start,\n\t\t'data' => $data,\n\t\t'size' => $rsize,\n\t);\n\t$file->{'segments'} = [ \\%segment ];\n\tclose $in;\n\n\t$file->{'type'} //= $ddos_to_tape_type{$type} // TYPE_BINARY;\n\t$file->{'exec'} //= $exec;\n\treturn $file;\n}\n\n# CoCo (DECB) - binaries can contain multiple segments\n\n# BASIC files are: $ff size>>8 size data*\n# BINARY files are: ($00 size>>8 size data*)+ $ff 00 00 exec>>8 exec\n#   (binaries can contain multiple segments)\n\nsub read_coco {\n\tmy ($filename,$file) = @_;\n\tmy $in = open_file($filename, $file);\n\n\tmy $type;\n\tmy $exec;\n\n\twhile (my $stype = getc($in)) {\n\t\t$stype = unpack(\"C\", $stype);\n\n\t\tmy $start;\n\t\tmy $size = (unpack(\"C\", getc($in)) << 8) | unpack(\"C\", getc($in));\n\n\t\tif ($stype == 0x00) {\n\t\t\t$type //= TYPE_BINARY;\n\t\t\t$start = (unpack(\"C\", getc($in)) << 8) | unpack(\"C\", getc($in));\n\t\t} elsif (!defined $type && $stype == 0xff) {\n\t\t\t$type = TYPE_BASIC;\n\t\t\t$start = 0;\n\t\t\t$exec = 0;\n\t\t} elsif ($stype == 0xff) {\n\t\t\tif ($size != 0) {\n\t\t\t\t# XXX is this dodgy?\n\t\t\t\tprintf STDERR \"Warning: EXEC segment with non-zero size in CoCo binary\\n\";\n\t\t\t}\n\t\t\t$exec = (unpack(\"C\", getc($in)) << 8) | unpack(\"C\", getc($in));\n\t\t} else {\n\t\t\tprintf STDERR \"Warning: skipping data in CoCo binary\\n\";\n\t\t\tlast;\n\t\t}\n\n\t\tif ($size > 0) {\n\t\t\tmy $data;\n\t\t\tmy $rsize = read $in, $data, $size;\n\t\t\tif ($rsize != $size) {\n\t\t\t\tprint STDERR \"Warning: short read from CoCo binary\\n\";\n\t\t\t}\n\t\t\tpush @{$file->{'segments'}}, {\n\t\t\t\t'start' => $start,\n\t\t\t\t'data' => $data,\n\t\t\t\t'size' => $rsize,\n\t\t\t};\n\t\t}\n\t}\n\tclose $in;\n\n\t$file->{'type'} //= $type // TYPE_BINARY;\n\t$file->{'exec'} //= $exec if (defined $exec);\n\treturn $file;\n}\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n# Replace zero or more segments with exactly one zero-padded segment. All\n# other file information preserved.\n\nsub coalesce_file {\n\tmy $file = shift;\n\treturn if (exists $file->{'segments'} && scalar(@{$file->{'segments'}}) == 1);\n\tmy $old_segments = $file->{'segments'} // [];\n\tmy %segment = ();\n\tmy $end;\n\tfor my $s (sort { $a->{'start'} <=> $b->{'start'} } @{$old_segments}) {\n\t\tmy $start = $s->{'start'};\n\t\t$segment{'start'} //= $start;\n\t\t$end //= $start;\n\t\tmy $size = bytes::length($s->{'data'});\n\t\tmy $new_end = $start + $size;\n\t\t# TODO\n\t\tif ($start < $end) {\n\t\t\tdie \"Can't handle overlapping segments\\n\";\n\t\t}\n\t\t# TODO\n\t\tif ($end >= 0x10000) {\n\t\t\tdie \"Segment too large\\n\";\n\t\t}\n\t\tif ($start > $end) {\n\t\t\t$segment{'data'} .= \"\\0\" x ($start - $end);\n\t\t}\n\t\t$segment{'data'} .= $s->{'data'};\n\t\t$end = $new_end;\n\t}\n\t$segment{'data'} //= \"\";\n\t$segment{'start'} //= 0;\n\t$end //= $segment{'start'};\n\t$segment{'size'} = $end - $segment{'start'};\n\t$file->{'segments'} = [ \\%segment ];\n}\n\n# Pass file data to dzip. Replaces data, preserves original file metadata and\n# \"osize\" records original data size.\n\nsub dzip_file {\n\tmy $file = shift;\n\tcoalesce_file($file);  # single-segment only\n\tmy $segment = $file->{'segments'}[0];\n\tmy $osize = $segment->{'size'} // bytes::length($segment->{'data'});\n\tmy $zdata = \"\";\n\tmy $cfd;\n\tmy $tmp_filename;\n\tif ($^O eq 'MSWin32') {\n\t\t# So windows doesn't support forked pipes or list open(). Ack!\n\t\t# Ok, write binary to a temporary file, dzip it, then read in\n\t\t# the results. This is dumb.\n\t\tmy $tmp_dir = tempdir(CLEANUP => 1);  # auto-clean on exit\n\t\tmy $tmp_fd;\n\t\t($tmp_fd, $tmp_filename) = tempfile(DIR => $tmp_dir);\n\t\tbinmode $tmp_fd;\n\t\tprint $tmp_fd $segment->{'data'};\n\t\tclose $tmp_fd;\n\t\tmy $opts = $reverse_dzip ? \"-rk\" : \"-k\";\n\t\tsystem(\"dzip\", $opts, $tmp_filename);\n\t\topen($cfd, \"<\", \"$tmp_filename.dz\") or die \"Can't open dzipped tempfile\\n\";\n\t} else {\n\t\t# For everything else, just pass the binary out to a fork\n\t\t# running dzip. No race.\n\t\tmy $pid = open($cfd, \"-|\") // die \"Failed to open pipe to dzip\\n\";\n\t\tif ($pid == 0) {\n\t\t\tmy $opts = $reverse_dzip ? \"-rc\" : \"-c\";\n\t\t\topen(my $zfd, \"|-\", \"dzip\", $opts) // exit 0;\n\t\t\tbinmode $zfd;\n\t\t\tprint $zfd $segment->{'data'};\n\t\t\tclose $zfd;\n\t\t\texit 0;\n\t\t}\n\t}\n\tbinmode $cfd;\n\t{\n\t\tlocal $/ = undef;\n\t\t$zdata = <$cfd>;\n\t}\n\tclose $cfd;\n\tif ($^O eq 'MSWin32') {\n\t\tunlink \"$tmp_filename.dz\";\n\t}\n\t# reposition...\n\tmy $zsize = bytes::length($zdata);\n\tdie \"No data from pipe to dzip\\n\" unless ($zsize > 0);\n\t$segment->{'dzip'} = 1;\n\t$segment->{'data'} = $zdata;\n\t$segment->{'size'} = $zsize;\n\t$segment->{'osize'} = $osize;\n\tif ($reverse_dzip) {\n\t\t$segment->{'zoffset'} = rdzip_end_runcount(\\$zdata);\n\t} else {\n\t\t$segment->{'zoffset'} = dzip_end_runcount(\\$zdata);\n\t}\n}\n\n# Skim through zipped data.  The number of consecutive runs at the end of the\n# zipped data is the number of bytes required to not overlap.\n\nsub dzip_end_runcount {\n\tmy $zdata = shift;\n\tmy @data = unpack(\"C*\", $$zdata);\n\tmy $length = scalar(@data);\n\tmy $runcount = 0;\n\tmy $max_runcount = 0;\n\tmy $i = 0;\n\twhile ($i < $length) {\n\t\tmy $a = $data[$i++];\n\t\tif ($a & 0x80) {\n\t\t\t$max_runcount = $runcount if ($runcount > $max_runcount);\n\t\t\t$runcount = 0;\n\t\t\tif ($data[$i] & 0x80) {\n\t\t\t\t$i++;\n\t\t\t}\n\t\t\t$i++;\n\t\t} else {\n\t\t\t$runcount++;\n\t\t\t$i += (128 - $a);\n\t\t}\n\t}\n\treturn $max_runcount;\n}\n\nsub rdzip_end_runcount {\n\tmy $zdata = shift;\n\tmy @data = unpack(\"C*\", $$zdata);\n\tmy $length = scalar(@data);\n\tmy $runcount = 0;\n\tmy $i = $length;\n\twhile ($i > 0) {\n\t\t$i -= 2;\n\t\tmy $a = $data[$i];\n\t\tif ($a & 0x80) {\n\t\t\t$runcount = 0;\n\t\t\tif ($data[$i] & 0x80) {\n\t\t\t\t$i--;\n\t\t\t}\n\t\t} else {\n\t\t\t$runcount++;\n\t\t\t$i -= (127 - $a);\n\t\t}\n\t}\n\treturn $runcount;\n}\n\nsub vxor_file {\n\tmy $file = shift;\n\tcoalesce_file($file);  # single-segment only\n\tmy $segment = $file->{'segments'}[0];\n\tmy $size = $segment->{'size'} // bytes::length($segment->{'data'});\n\tmy @vdata = ();\n\tmy $stride = $want_vxor;\n\tmy @vxor = (0) x $stride;\n\tfor my $i (0..$size-1) {\n\t\tmy $c = unpack(\"C\", substr($segment->{'data'}, $i, 1));\n\t\t$vdata[$i] = $c ^ $vxor[$i % $stride];\n\t\t$vxor[$i % $stride] = $c;\n\t}\n\t$segment->{'vxor'} = 1;\n\t$segment->{'stride'} = $stride;\n\t$segment->{'data'} = pack(\"C*\", @vdata);\n}\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nsub set_timing {\n\tmy $name = shift;\n\t$name //= $normal_timing;\n\tif ($name eq 'simple' || $name eq 'rom') {\n\t\t$normal_timing = $name;\n\t}\n\tdie \"invalid timing name '$name'\\n\" unless exists $timing_by_name{$name};\n\t$timing = $timing_by_name{$name};\n}\n\n# Write a file.\n\nsub write_file {\n\tmy $file = shift;\n\n\t# defaults\n\t$file->{'fnblock'} //= 1;\n\t$file->{'eof'} //= 1;\n\tset_timing($file->{'timing'});\n\n\t# XXX only deal with single-segment files\n\tcoalesce_file();\n\tmy $segment0 = $file->{'segments'}[0];\n\n\t# Write filename block if required.\n\tif ($file->{'fnblock'}) {\n\t\tmy $name = $file->{'name'} // \"BINARY\";\n\t\tmy $type = $file->{'type'} // TYPE_BINARY;\n\t\tmy $encoding = $file->{'encoding'} // ENCODING_BINARY;\n\t\tmy $gap = $file->{'gapped'} ? GAP_TRUE : GAP_FALSE;\n\t\tmy $load = $file->{'load'} // $segment0->{'start'} // 0x0e00;\n\t\tmy $exec = $file->{'exec'} // $load;\n\t\tmy $fndata = sprintf(\"\\%-8s\", $name);\n\t\t$fndata .= pack(\"CCCnn\", $type, $encoding, $gap, $exec, $load);\n\t\twrite_leader();\n\t\tblock_out(BLOCK_NAMEFILE, $fndata, $file->{'block_fmt'});\n\t}\n\n\t# Write file data.\n\twrite_leader() if (!$file->{'gapped'} && $file->{'delay'});\n\tmy $data = $segment0->{'data'};\n\tmy $size = $segment0->{'size'};\n\tmy $ptr = 0;\n\twhile ($size > 0) {\n\t\twrite_leader() if ($file->{'gapped'});\n\t\tmy $bsize;\n\t\tif ($file->{'block_size'} > 0 && $size > $file->{'block_size'}) {\n\t\t\t$bsize = $file->{'block_size'};\n\t\t} else {\n\t\t\t$bsize = $size;\n\t\t}\n\t\t$size -= $bsize;\n\t\tif ($size == 0 && $file->{'eof'}) {\n\t\t\tif ($file->{'eof_data'}) {\n\t\t\t\tblock_out(BLOCK_EOF, bytes::substr($data, $ptr, $bsize), $file->{'block_fmt'});\n\t\t\t} else {\n\t\t\t\tblock_out(BLOCK_DATA, bytes::substr($data, $ptr, $bsize), $file->{'block_fmt'});\n\t\t\t\twrite_leader() if ($file->{'gapped'});\n\t\t\t\tblock_out(BLOCK_EOF, \"\", $file->{'block_fmt'});\n\t\t\t}\n\t\t} else {\n\t\t\tblock_out(BLOCK_DATA, bytes::substr($data, $ptr, $bsize), $file->{'block_fmt'});\n\t\t}\n\t\t$ptr += $bsize;\n\t}\n}\n\n# Write an autorun file, using data from a list of files.\n\nsub write_autorun {\n\tmy $files = shift;\n\n\t# Ensure autorun program is stored at normal speed.\n\tset_timing();\n\n\tmy $vdg = 0;\n\tmy $sam_v = 0;\n\tmy $sam_f = 2;  # 0x0400\n\tmy $flasher = 0;\n\t$mc_label{'flash_addr'} = 0x0400;\n\n\tmy $name = $autorun_name // \"AUTORUN\";\n\n\t# Construct a special filename block to autorun. This builds the data\n\t# out of blocks of code and then \"links\" it, as the contents can vary\n\t# (multiple files to load, fast loading, dunzipping data).\n\n\t# The standard part of the filename block.\n\tmcdata_org(0x01da);\n\tmcdata_add(\\sprintf(\"\\%-8s\", $name));\t# filename\n\tmcdata_add([\n\t\t\tTYPE_BINARY,\t\t# file type: machine code\n\t\t\tENCODING_BINARY,\t# ascii flag: binary\n\t\t\tGAP_FALSE,\t\t# gap flag: continuous\n\t\t\"colon\",\n\t\t\t0x3a, 0x00,\t\t# exec address (convenient ':')\n\t\t\t0x00, 0xa6,\t\t# load address: BASIC next\n\t\t\"load_part_ptr\", \">load_part\",\n\t\t]);\n\tif ($any_dzip) {\n\t\tmcdata_add([\n\t\t\"dunzip_ptr\", \">dunzip\",\n\t\t\t]);\n\t}\n\tmcdata_add([\n\t\t\"exec_loader\",\t\t\t# main code starts at $01eb or $01ed\n\t]);\n\n\t# Include fast timing setup if necessary.\n\tif ($any_fast && $wav_out) {\n\t\tmcdata_add(\\@code_test_arch);\n\t\tmcdata_add(\\@code_fast);\n\t}\n\n\t# For each file, add loading instructions.\n\tmy $last_exec = 0;\n\tfor my $file (@{$files}) {\n\t\t# defaults when autorunning\n\t\t$file->{'fnblock'} //= 0;\n\t\t$file->{'eof_data'} //= 1;\n\t\t# TODO: currently no provision for switching speed mid-load:\n\t\t$file->{'timing'} = 'fast' if ($any_fast);\n\n\t\t# a \"file\" might just be some specific code instructions\n\t\tmy $code = $file->{'code'} // \"\";\n\t\tmy $value = $file->{'value'} // 0;\n\t\tif ($code eq \"set_vdg\") {\n\t\t\t$value &= 0xf8;\n\t\t\tif ($vdg != $value) {\n\t\t\t\tmcdata_add([\n\t\t\t\t\t\t0x86, $file->{'value'},\t# lda\t#value\n\t\t\t\t\t\t0xb7, 0xff, 0x22,\t# sta\t>$ff22\n\t\t\t\t\t]);\n\t\t\t}\n\t\t\t$vdg = $value;\n\t\t} elsif ($code eq \"set_sam_v\") {\n\t\t\tfor my $i (0..2) {\n\t\t\t\tmy $bit = (1 << $i);\n\t\t\t\tnext if ((($sam_v ^ $value) & $bit) == 0);\n\t\t\t\tmy $addr = 0xc0 + $i * 2;\n\t\t\t\t$addr++ if ($value & $bit);\n\t\t\t\tmcdata_add([\n\t\t\t\t\t\t0xb7, 0xff, $addr,\t# sta\t>$ffxx\n\t\t\t\t\t]);\n\t\t\t}\n\t\t\t$sam_v = $value & 7;\n\t\t} elsif ($code eq \"set_sam_f\") {\n\t\t\tfor my $i (0..6) {\n\t\t\t\tmy $bit = (1 << $i);\n\t\t\t\tnext if ((($sam_f ^ $value) & $bit) == 0);\n\t\t\t\tmy $addr = 0xc6 + $i * 2;\n\t\t\t\t$addr++ if ($value & $bit);\n\t\t\t\tmcdata_add([\n\t\t\t\t\t\t0xb7, 0xff, $addr,\t# sta\t>$ffxx\n\t\t\t\t\t]);\n\t\t\t}\n\t\t\t$sam_f = $value & 0x7f;\n\t\t\t$mc_label{'flash_addr'} = $sam_f * 512;\n\t\t} elsif ($code eq \"lds\") {\n\t\t\tmcdata_add([\n\t\t\t\t\t0x10, 0xce, $value>>8, $value&0xff,\t# lds\t#value\n\t\t\t\t\t]);\n\t\t} elsif ($code eq \"poke\") {\n\t\t\tmy ($aa,$vv) = split(/,/, $value);\n\t\t\tmy $addr = eval_int($aa);\n\t\t\tmy $val = eval_int($vv);\n\t\t\tmcdata_add([\n\t\t\t\t\t0x86, $val&0xff,\t\t# lda\t#value\n\t\t\t\t\t0xb7, $addr>>8, $addr&0xff,\t# sta\t>addr\n\t\t\t\t\t]);\n\t\t} elsif ($code eq \"pause\") {\n\t\t\twrite_pause();\n\t\t} elsif ($file->{'omit'}) {\n\t\t\tnext;\n\t\t} else {\n\t\t\tmy $segment0 = $file->{'segments'}[0];\n\t\t\tmy $load = $file->{'load'} // $segment0->{'start'};\n\t\t\tmy $size = $segment0->{'size'};\n\t\t\tmy $oload = $load;\n\t\t\tmy $osize = $size;\n\t\t\tif ($segment0->{'dzip'}) {\n\t\t\t\t$osize = $segment0->{'osize'};\n\t\t\t\tmy $zoffset = $segment0->{'zoffset'};\n\t\t\t\tif ($reverse_dzip) {\n\t\t\t\t\t$load = $file->{'zload'} // $oload - 3;\n\t\t\t\t} else {\n\t\t\t\t\t$load = $file->{'zload'} // $oload + $osize + $zoffset - $size;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmy $end = $load + $size;\n\t\t\tmy $fflasher = $file->{'flasher'} // 0;\n\t\t\tif ($flasher && !$fflasher) {\n\t\t\t\tmcdata_add(\\@code_disable_flasher);\n\t\t\t} elsif (!$flasher && $fflasher) {\n\t\t\t\tmcdata_add(\\@code_enable_flasher);\n\t\t\t}\n\t\t\t$flasher = $fflasher;\n\t\t\tmcdata_add([\n\t\t\t\t\t0x8e, $load>>8, $load&0xff,\t# ldx\t#load\n\t\t\t\t\t0x8d, \"\\&<load_part\",\t# bsr\tload_part\n\t\t\t\t]);\n\t\t\tif (!$reverse_dzip && $segment0->{'dzip'}) {\n\t\t\t\tmcdata_add([\n\t\t\t\t\t\t0x8e, $load>>8, $load&0xff,\t# ldx\t#load\n\t\t\t\t\t\t0xcc, $end>>8, $end&0xff,\t# ldd\t#end\n\t\t\t\t\t\t0xce, $oload>>8, $oload&0xff,\t# ldu\t#oload\n\t\t\t\t\t\t0x8d, \"\\&<dunzip\",\t# bsr\tdunzip\n\t\t\t\t\t]);\n\t\t\t}\n\t\t\tif ($reverse_dzip && $segment0->{'dzip'}) {\n\t\t\t\tmy $end = $oload + $osize;\n\t\t\t\tmcdata_add([\n\t\t\t\t\t\t0xcc, $load>>8, $load&0xff,\t# ldd\t#load\n\t\t\t\t\t\t0xce, $end>>8, $end&0xff,\t# ldu\t#end\n\t\t\t\t\t\t0x8d, \"\\&<dunzip\",\t# bsr\tdunzip\n\t\t\t\t\t]);\n\t\t\t}\n\t\t\tif ($segment0->{'vxor'}) {\n\t\t\t\tmy $stride = $segment0->{'stride'};\n\t\t\t\tmy $start = $oload + $stride;\n\t\t\t\tmy $end = $oload + $osize;\n\t\t\t\tmcdata_add([\n\t\t\t\t\t\t0x8e, $start>>8, $start&0xff,\t# ldx #start\n\t\t\t\t\t\t0xa6, 0x88, 0x100-$stride,\t# lda -stride,x\n\t\t\t\t\t\t0xa8, 0x84,\t\t# eora ,x\n\t\t\t\t\t\t0xa7, 0x80,\t\t# sta ,x+\n\t\t\t\t\t\t0x8c, $end>>8, $end&0xff,\t# cmpx #end\n\t\t\t\t\t\t0x25, 0xf4,\t# blo loop\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t$last_exec = $file->{'exec'};\n\t\t}\n\t}\n\t$mc_label{'exec'} = $autorun_exec // $last_exec // 0;\n\n\t# Finally, JMP to the program.\n\tmcdata_add([\n\t\t\t0x7e, \">exec\",\t\t# jmp\texec\n\t\t\t]);\n\n\t# Optional and non-optional chunks of code in support of above.\n\tmcdata_add(\\@code_load_0);\n\tmcdata_add(\\@code_load_flash) if ($any_flasher);\n\tmcdata_add(\\@code_load_1);\n\tif ($any_dzip) {\n\t\tif ($reverse_dzip) {\n\t\t\tmcdata_add(\\@code_dunzipr);\n\t\t} else {\n\t\t\tmcdata_add(\\@code_dunzip);\n\t\t}\n\t}\n\n\t# Link - replace all symbol references with actual addresses.\n\tmcdata_link();\n\n\t# Write filename block.\n\twrite_leader();\n\tblock_out(BLOCK_NAMEFILE, $mc_data);\n\n\t# Now the data portion of the loader. Tiny, just overwrites \"next\n\t# basic token with a pointer to that convenient ':' in the filename\n\t# block, and makes BASIC JMP to the loader code.\n\tmcdata_org(0x00a6);\n\tmcdata_add([\n\t\t\t\">colon\",\t\t# fdb\tcolon\n\t\t\t0x7e, \">exec_loader\",\t# jmp\texec_loader\n\t\t\t]);\n\tmcdata_link();\n\twrite_leader();\n\tblock_out(BLOCK_EOF, $mc_data);\n}\n\n# Write a list of files\n\nsub write_all_files {\n\tmy $files = shift;\n\tfor my $file (@{$files}) {\n\t\tmy $code = (exists $file->{'code'}) ? $file->{'code'} : \"\";\n\t\tmy $value = $file->{'value'} // 0;\n\t\tif ($code eq 'pause') {\n\t\t\twrite_pause();\n\t\t} elsif ($code eq '') {\n\t\t\twrite_file($file);\n\t\t}\n\t}\n\tbytes_out(\"U\", $timing->{'leader'}) if ($leader > 0);\n}\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nsub write_pause {\n\tif ($wav_out) {\n\t\tsample_out(0x80, 0xda5c * 8);\n\t\t$ao_error = 0.5;\n\t} else {\n\t\tbytes_out(\"U\" x 94, $timing->{'leader'});\n\t\t# NOTE: CAS files can't be fast, but if they were, typical\n\t\t# pause would be 136 leader bytes\n\t}\n}\n\nsub write_leader {\n\twrite_pause();\n\tbytes_out(\"U\" x $leader, $timing->{'leader'});\n}\n\nsub block_out {\n\tmy ($btype,$data,$fmt) = @_;\n\t$fmt = $fmt_strings{$fmt // 'normal'};\n\tmy $bsize = bytes::length($data);\n\tmy $sum = 0;\n\t$adj_period = $timing->{'adj_period'} // 0;\n\t$adj = $timing->{'adj'} // 0;\n\t$adj_count = 0;\n\tfor my $c (split(//, $fmt)) {\n\t\tmy $eor = 0;\n\t\t$eor = 0xff if ($c eq uc $c);\n\t\t$c = lc $c;\n\t\tif ($c eq 'i') {\n\t\t\t# block in: leader byte, $3c\n\t\t\tbytes_out(pack(\"C*\", 0x55, 0x3c), $timing->{'leader'});\n\t\t} elsif ($c eq 'o') {\n\t\t\t# block out: leader byte, initial timing\n\t\t\tbytes_out(pack(\"C\", 0x55), $timing->{'leader0'});\n\t\t} elsif ($c eq 't') {\n\t\t\t# block type\n\t\t\tbytes_out(pack(\"C\", $btype^$eor), $timing->{'type'});\n\t\t\t$sum += $btype;\n\t\t} elsif ($c eq 's') {\n\t\t\t# block size\n\t\t\tbytes_out(pack(\"C\", $bsize^$eor), $timing->{'size'});\n\t\t\t$sum += $bsize;\n\t\t} elsif ($c eq 'c') {\n\t\t\t# block checksum\n\t\t\tbytes_out(pack(\"C\", ($sum^$eor)&0xff), $timing->{'size'});\n\t\t} elsif ($c eq 'd') {\n\t\t\t# block data (invert not supported yet)\n\t\t\tbytes_out($data, $timing->{'data0'}, $timing->{'data'});\n\t\t\tfor (unpack(\"C*\", $data)) {\n\t\t\t\t$sum += $_;\n\t\t\t}\n\t\t}\n\t}\n}\n\nsub ao_period {\n\tmy $cycles = shift;\n\tmy $period = ($sample_rate * $cycles * 16) / $sam_rate;\n\tmy $iperiod = int($period);\n\t$ao_error += ($period - $iperiod);\n\t$iperiod += int($ao_error);\n\t$ao_error -= int($ao_error);\n\treturn $iperiod;\n}\n\nsub bytes_out {\n\tmy $data = shift;\n\tmy $pspec = shift;\n\tmy $delay0 = $pspec->[0];\n\tmy $delay1 = $pspec->[1];\n\tif (!$wav_out) {\n\t\tprint $out_fd $data;\n\t\treturn;\n\t}\n\tfor my $byte (unpack(\"C*\", $data)) {\n\t\tfor (0..7) {\n\t\t\tmy $cycles = $timing->{'cycles'}->[$byte  &1] / 2;\n\t\t\tmy $p0 = $cycles + $delay0;\n\t\t\tmy $p1 = $cycles + $delay1;\n\t\t\tif ($adj_count >= $adj_period) {\n\t\t\t\t$p0 += $adj;\n\t\t\t\t$adj_count = 0;\n\t\t\t}\n\t\t\tmy $period0 = ao_period($p0);\n\t\t\tmy $period1 = ao_period($p1);\n\t\t\tprint $out_fd sinewave($period0, $period1);\n\t\t\t$sample_count += $period0 + $period1;\n\t\t\t$byte >>= 1;\n\t\t\t$delay0 = $pspec->[2];\n\t\t\t$delay1 = $pspec->[3];\n\t\t}\n\t\t$pspec = shift if (@_);\n\t\t$delay0 = $pspec->[0];\n\t\t$delay1 = $pspec->[1];\n\t\t$adj_count++;\n\t}\n}\n\nsub sample_out {\n\tmy $samp = shift;\n\tmy $cycles = shift;\n\tmy $period = ao_period($cycles);\n\tmy $fmt = \"C\";\n\tif ($bits_per_sample == 16) {\n\t\t$samp = ($samp - 0x80) * 0x100;\n\t\t$fmt = \"s\";\n\t}\n\tprint $out_fd pack($fmt, $samp) x $period;\n\t$sample_count += $period;\n}\n\nsub sinewave {\n\tmy $period0 = shift;\n\tmy $period1 = shift // $period0;\n\tif (exists $sinewaves{\"$period0,$period1\"}) {\n\t\treturn $sinewaves{\"$period0,$period1\"};\n\t}\n\tmy $fmt = \"C*\";\n\tmy $mul = 0x66;\n\tmy $off = 0x80;\n\tif ($bits_per_sample == 16) {\n\t\t$fmt = \"s*\";\n\t\t$mul = 0x6600;\n\t\t$off = 0;\n\t}\n\tmy $sw = pack($fmt,\n\t\t\t(map {\n\t\t\t my $v = sin((pi*($_-0.5))/$period0);\n\t\t\t int(($v * $mul) + $off); } (1..$period0)),\n\t\t\t(map {\n\t\t\t my $v = sin(pi+((pi*($_-0.5))/$period1));\n\t\t\t int(($v * $mul) + $off); } (1..$period1)));\n\t#print \"$period0,$period1: \".unpack(\"H*\", $sw).\"\\n\";\n\t$sinewaves{\"$period0,$period1\"} = $sw;\n\treturn $sw;\n}\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n# Initialise machine code data. Note, does not clear label table.\n\nsub mcdata_org {\n\t$mc_org = shift;\n\t$mc_pc = $mc_org;\n\t@mc_link = ();\n\t$mc_data = \"\";\n}\n\n# Add machine code data.\n\nsub mcdata_add {\n\tmy $text = shift;\n\tif (ref($text) eq 'ARRAY') {\n\t\tfor my $byte (@{$text}) {\n\t\t\tif ($byte =~ /^[a-z]/) {\n\t\t\t\t$mc_label{$byte} = $mc_pc;\n\t\t\t} elsif ($byte =~ /^\\&?</) {\n\t\t\t\t$mc_pc++;\n\t\t\t\tpush @mc_link, [ $byte, $mc_pc ];\n\t\t\t\t$mc_data .= \"\\x00\";\n\t\t\t} elsif ($byte =~ /^\\&?>/) {\n\t\t\t\t$mc_pc += 2;\n\t\t\t\tpush @mc_link, [ $byte, $mc_pc ];\n\t\t\t\t$mc_data .= \"\\x00\\x00\";\n\t\t\t} else {\n\t\t\t\t$mc_pc++;\n\t\t\t\t$mc_data .= pack(\"C\", $byte);\n\t\t\t}\n\t\t}\n\t} elsif (ref($text) eq 'SCALAR') {\n\t\t$mc_data .= $$text;\n\t\t$mc_pc += bytes::length($$text);\n\t}\n}\n\n# \"Link\" the machine code - replace all the entries in @mc_link with computed\n# values.\n\nsub mcdata_link {\n\tfor my $r (@mc_link) {\n\t\tmy $rlabel = $r->[0];\n\t\tmy $pc = $r->[1];\n\t\tmy $off = $pc - $mc_org;\n\t\tif ($rlabel =~ /^(\\&)?([<>])(.*)/) {\n\t\t\tmy ($rel,$size,$label) = ($1,$2,$3);\n\t\t\tmy $addr = $mc_label{$label} or die \"missing label: $label\\n\";\n\t\t\t$size = ($size eq '<') ? 1 : 2;\n\t\t\t$off -= $size;\n\t\t\t$addr -= $pc if ($rel);\n\t\t\tmy $subdata;\n\t\t\tif ($size == 1) {\n\t\t\t\t$subdata = pack(\"C\", $addr & 0xff);\n\t\t\t} else {\n\t\t\t\t$subdata = pack(\"n\", $addr & 0xffff);\n\t\t\t}\n\t\t\tbytes::substr($mc_data, $off, $size, $subdata);\n\t\t}\n\t}\n}\n\n# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nsub version_text {\n\tprintf \"bin2cas.pl %s\\n\", VERSION;\n\tprint <<EOF;\nCopyright (C) 2017 Ciaran Anscomb\nLicense: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl-3.0.html>.\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nSpecial exception: Code included in output (such as \"dunzip\") is not\nconsidered to be part of this program, so the GPL doesn't apply to the\nresults.\nEOF\n\texit 0;\n}\n\n__END__\n\n=encoding utf8\n\n=head1 NAME\n\nB<bin2cas.pl> - convert binary data to CAS or WAV with optional autorun\n\n=head1 SYNOPSIS\n\nB<bin2cas.pl> [I<option>]... I<input-file> [[I<option>]... I<input-file>]...\n\n=head1 DESCRIPTION\n\nCreates CAS or WAV cassette images from Dragon or Tandy CoCo binary input. WAV\noutput timing are tweaked to target the delays in the ROM tape loading routines\nexactly.\n\nOptionally generates complex autorunning code supporting dzip-compressed parts,\nfaster waveforms, and video mode changing between parts.\n\n=head1 OPTIONS\n\nOutput options:\n\n=over\n\n=item B<-o>, B<--output> I<file>\n\noutput filename (required)\n\n=item B<-m>, B<--mode> I<mode>\n\noutput file mode (cas, wav) [from filename]\n\n=item B<-r>, B<--wav-rate> I<rate>\n\nsample rate in Hz for WAV output [9600]\n\n=item B<--wav-bits> I<n>\n\nbits per sample (8, 16) [8]\n\n=back\n\nGlobal options:\n\n=over\n\n=item B<-A>, B<--autorun>\n\nbuild a single autorunning program\n\n=item B<--leader> I<count>\n\nleader length (in bytes) [256]\n\n=item B<--reverse-dzip>\n\ndzipped files are streamed in reverse\n\n=back\n\nPer-file options:\n\n=over\n\n=item B<-B>\n\nfile is raw binary (default)\n\n=item B<-D>\n\nfile is DragonDOS binary\n\n=item B<-C>\n\nfile is CoCo RS-DOS (DECB) binary\n\n=back\n\n=over\n\n=item B<-n>, B<--name> I<name>\n\nname in filename block [from filename]\n\n=item B<-l>, B<--load> I<addr>\n\nload address [0x0000]\n\n=item B<-e>, B<--exec> I<addr>\n\nexec address [0x0000]\n\n=item B<--zload> I<addr>\n\noverride automatic load address for dzipped file\n\n=item B<--no-filename>\n\nno filename block required [default when B<--autorun>]\n\n=back\n\n=over\n\n=item B<--no-delay>\n\nno initial delay / leader before data\n\n=item B<--block-size> I<n>\n\nmaximum block size [255]\n\n=item B<--no-eof>\n\ndon't emit EOF block\n\n=item B<--gapped>\n\nwrite gapped file\n\n=item B<-T>, B<--timing> I<name>\n\ntiming spec (rom, fast, simple) [rom]\n\n=item B<--fast>\n\nalias for B<--timing fast>\n\n=back\n\n=over\n\n=item B<--flasher>\n\nenable cursor flasher in autorun\n\n=item B<-x>, B<--vxor> I<stride>\n\napply vertical-XOR to file with given stride\n\n=item B<-i> I<file>\n\ninput filename (prevents I<file> being parsed as an option if it begins with\n\"-\")\n\n=back\n\nPer-file persistent options:\n\n=over\n\n=item B<-z>, B<--dzip>\n\ndzip file data (dunzip to autorun)\n\n=item B<-E>, B<--eof-data>\n\nEOF blocks allowed to contain data (non-standard)\n\n=back\n\nInter-file options:\n\n=over\n\n=item B<--lds> I<a>\n\nset the stack pointer to I<a>\n\n=item B<--pause>\n\ninsert (additional) half second pause before next file\n\n=item B<--sam-f> I<f>\n\nset SAM display offset to I<f> * 512\n\n=item B<--sam-v> I<v>\n\nset SAM VDG mode to I<v> (0-7, see SAM docs)\n\n=item B<--vdg> I<mode>\n\nset VDG mode before next file\n\n=item B<--poke> I<addr>,I<value>\n\nset one specific byte at I<addr> to I<value>\n\n=back\n\nOther options:\n\n=over\n\n=item B<--help>\n\nshow this help\n\n=item B<--version>\n\nshow program version\n\n=back\n\n=head1 USAGE\n\nThe default sample rate for WAV output is 9600Hz, which has proved to survive\nspeed variations well when loading on real hardware, while keeping file size to\na minimum. However, if you are going to write the output to tape, it is highly\nrecommended that you specify a higher rate, e.g., with B<-r 48000>.\n\nPer-file options apply to the next input file. Persistent options apply to all\nsubsequent files, the rest are reset to defaults after each file.\n\nThe B<--autorun> option generates a special loader file containing instructions\nfor each input file, intended to create a single autorunning program. It\nchanges the defaults for input files to: B<--no-filename> B<--eof-data>.\n\nWhen autorunning, the following options apply to the program as a whole, not\njust the next file: B<--name>, B<--exec>.\n\nIf the B<--omit> option is used, subsequent data parts are not included in the\nautorunning loader code.  Useful if handling loading yourself.\n\nTo compress data, the \"dzip\" tool is required to be in your PATH.\n\nCompressed data can overlap the destination, but some non-overlapping clearance\nis required depending on the input.  The default is to calculate the clearance\nrequired and otherwise overlap the destination as much as possible.  Sometimes\nthe extra bytes required stray somewhere inconvenient, so this calculated\naddress can be overridden with the B<--zload> option. e.g., the extra bytes\nbeyond a text loading screen encroaches into DOS workspace ($0600), so\nB<--zload 0x0e00> would ensure the zipped data was loaded beyond it (usefully,\nthe end user then doesn't get to I<see> the zipped data loading in this case).\n\nThe order of compressed data can be reversed using B<--reverse-dzip>. In this\ncase, the extra required byte where source and destination overlap must be\nI<before> the destination area.  This is probably only useful when data resides\nright at the top of RAM. This is a global option: if one dzipped part is\nreversed, all are.\n\nFor loading screens, \"vertical XOR\" may help achieve better compression.\nGenerally, you'll want to specify a stride of 32 (bytes per line).\n\nThe default timing spec (\"rom\") accounts for the slight variations of delay in\nthe Dragon ROM before it starts to count a pulse width. The \"simple\" timing\nspec is closer to the output of CSAVE. The \"fast\" timing spec is similar to\n\"rom\", but with shortened cycle widths; code is added to the autorun file to\nsupport this.\n\nUse the B<--flasher> option when the SAM display offset has been changed, e.g.,\nduring a custom loading screen. The ROM routine will continue to flash $0400,\nbut this will not be visible, so this adds code to do it manually.\n\nNormally the stack pointer is left at the top of BASIC. Use the B<--lds> option\nto adjust it at any point.\n\n=head1 EXAMPLES\n\nA very simple example:\n\n    $0 -o game.cas -D game.bin\n\nBuilds a non-autorunning CAS file from the DragonDOS binary F<game.bin>. Load &\nexec addresses are taken from the header of the input binary.\n\nA more complex example:\n\n    $0 --autorun -r 22050 -o game.wav --eof-data --dzip --timing fast \\\n            -B --load 0x0e00 --vxor 32 screen.bin \\\n            --vdg 8 --sam-v 4 --sam-f 7 \\\n            -C --flasher game.bin\n\nBuilds an autorunning 22kHz WAV file with two parts - a loading screen and the\nmain game. Each part is dzipped, and a small amount of space is saved by\ncombining the last data block with the EOF indicator. Vertical XOR is applied\nto the loading screen to improve compression. Each part is written using\nshorter cycles - just over 30% faster than usual.\n\nThe loading screen data is a raw binary, so the load address is specified.\nOnce the screen has been loaded (including unzipping into place, and reversing\nthe vertical XOR), the VDG is put into alpha/semigraphics mode with CSS=1, the\nSAM is configured to G3C (these two combined configure Semigraphics 12 mode),\nand the SAM display offset set to $0e00.\n\nThe game code is taken from a CoCo RS-DOS binary which contains load and exec\ninformation. Extra cursor flashing code is added to the autorunner, as the\ndisplay offset is no longer $0400. As the last input file, its exec address is\nused to autorun once loading is complete.\n\n=cut\n"
  },
  {
    "path": "tools/cmoc/dragon/bin2cas.txt",
    "content": "NAME\n    bin2cas.pl - convert binary data to CAS or WAV with optional autorun\n\nSYNOPSIS\n    bin2cas.pl [*option*]... *input-file* [[*option*]... *input-file*]...\n\nDESCRIPTION\n    Creates CAS or WAV cassette images from Dragon or Tandy CoCo binary\n    input. WAV output timing are tweaked to target the delays in the ROM\n    tape loading routines exactly.\n\n    Optionally generates complex autorunning code supporting dzip-compressed\n    parts, faster waveforms, and video mode changing between parts.\n\nOPTIONS\n    Output options:\n\n    -o, --output *file*\n        output filename (required)\n\n    -m, --mode *mode*\n        output file mode (cas, wav) [from filename]\n\n    -r, --wav-rate *rate*\n        sample rate in Hz for WAV output [9600]\n\n    --wav-bits *n*\n        bits per sample (8, 16) [8]\n\n    Global options:\n\n    -A, --autorun\n        build a single autorunning program\n\n    --leader *count*\n        leader length (in bytes) [256]\n\n    --reverse-dzip\n        dzipped files are streamed in reverse\n\n    Per-file options:\n\n    -B  file is raw binary (default)\n\n    -D  file is DragonDOS binary\n\n    -C  file is CoCo RS-DOS (DECB) binary\n\n    -n, --name *name*\n        name in filename block [from filename]\n\n    -l, --load *addr*\n        load address [0x0000]\n\n    -e, --exec *addr*\n        exec address [0x0000]\n\n    --zload *addr*\n        override automatic load address for dzipped file\n\n    --no-filename\n        no filename block required [default when --autorun]\n\n    --no-delay\n        no initial delay / leader before data\n\n    --block-size *n*\n        maximum block size [255]\n\n    --no-eof\n        don't emit EOF block\n\n    --gapped\n        write gapped file\n\n    -T, --timing *name*\n        timing spec (rom, fast, simple) [rom]\n\n    --fast\n        alias for --timing fast\n\n    --flasher\n        enable cursor flasher in autorun\n\n    -x, --vxor *stride*\n        apply vertical-XOR to file with given stride\n\n    -i *file*\n        input filename (prevents *file* being parsed as an option if it\n        begins with \"-\")\n\n    Per-file persistent options:\n\n    -z, --dzip\n        dzip file data (dunzip to autorun)\n\n    -E, --eof-data\n        EOF blocks allowed to contain data (non-standard)\n\n    Inter-file options:\n\n    --lds *a*\n        set the stack pointer to *a*\n\n    --pause\n        insert (additional) half second pause before next file\n\n    --sam-f *f*\n        set SAM display offset to *f* * 512\n\n    --sam-v *v*\n        set SAM VDG mode to *v* (0-7, see SAM docs)\n\n    --vdg *mode*\n        set VDG mode before next file\n\n    --poke *addr*,*value*\n        set one specific byte at *addr* to *value*\n\n    Other options:\n\n    --help\n        show this help\n\n    --version\n        show program version\n\nUSAGE\n    The default sample rate for WAV output is 9600Hz, which has proved to\n    survive speed variations well when loading on real hardware, while\n    keeping file size to a minimum. However, if you are going to write the\n    output to tape, it is highly recommended that you specify a higher rate,\n    e.g., with -r 48000.\n\n    Per-file options apply to the next input file. Persistent options apply\n    to all subsequent files, the rest are reset to defaults after each file.\n\n    The --autorun option generates a special loader file containing\n    instructions for each input file, intended to create a single\n    autorunning program. It changes the defaults for input files to:\n    --no-filename --eof-data.\n\n    When autorunning, the following options apply to the program as a whole,\n    not just the next file: --name, --exec.\n\n    If the --omit option is used, subsequent data parts are not included in\n    the autorunning loader code. Useful if handling loading yourself.\n\n    To compress data, the \"dzip\" tool is required to be in your PATH.\n\n    Compressed data can overlap the destination, but some non-overlapping\n    clearance is required depending on the input. The default is to\n    calculate the clearance required and otherwise overlap the destination\n    as much as possible. Sometimes the extra bytes required stray somewhere\n    inconvenient, so this calculated address can be overridden with the\n    --zload option. e.g., the extra bytes beyond a text loading screen\n    encroaches into DOS workspace ($0600), so --zload 0x0e00 would ensure\n    the zipped data was loaded beyond it (usefully, the end user then\n    doesn't get to *see* the zipped data loading in this case).\n\n    The order of compressed data can be reversed using --reverse-dzip. In\n    this case, the extra required byte where source and destination overlap\n    must be *before* the destination area. This is probably only useful when\n    data resides right at the top of RAM. This is a global option: if one\n    dzipped part is reversed, all are.\n\n    For loading screens, \"vertical XOR\" may help achieve better compression.\n    Generally, you'll want to specify a stride of 32 (bytes per line).\n\n    The default timing spec (\"rom\") accounts for the slight variations of\n    delay in the Dragon ROM before it starts to count a pulse width. The\n    \"simple\" timing spec is closer to the output of CSAVE. The \"fast\" timing\n    spec is similar to \"rom\", but with shortened cycle widths; code is added\n    to the autorun file to support this.\n\n    Use the --flasher option when the SAM display offset has been changed,\n    e.g., during a custom loading screen. The ROM routine will continue to\n    flash $0400, but this will not be visible, so this adds code to do it\n    manually.\n\n    Normally the stack pointer is left at the top of BASIC. Use the --lds\n    option to adjust it at any point.\n\nEXAMPLES\n    A very simple example:\n\n        $0 -o game.cas -D game.bin\n\n    Builds a non-autorunning CAS file from the DragonDOS binary game.bin.\n    Load & exec addresses are taken from the header of the input binary.\n\n    A more complex example:\n\n        $0 --autorun -r 22050 -o game.wav --eof-data --dzip --timing fast \\\n                -B --load 0x0e00 --vxor 32 screen.bin \\\n                --vdg 8 --sam-v 4 --sam-f 7 \\\n                -C --flasher game.bin\n\n    Builds an autorunning 22kHz WAV file with two parts - a loading screen\n    and the main game. Each part is dzipped, and a small amount of space is\n    saved by combining the last data block with the EOF indicator. Vertical\n    XOR is applied to the loading screen to improve compression. Each part\n    is written using shorter cycles - just over 30% faster than usual.\n\n    The loading screen data is a raw binary, so the load address is\n    specified. Once the screen has been loaded (including unzipping into\n    place, and reversing the vertical XOR), the VDG is put into\n    alpha/semigraphics mode with CSS=1, the SAM is configured to G3C (these\n    two combined configure Semigraphics 12 mode), and the SAM display offset\n    set to $0e00.\n\n    The game code is taken from a CoCo RS-DOS binary which contains load and\n    exec information. Extra cursor flashing code is added to the autorunner,\n    as the display offset is no longer $0400. As the last input file, its\n    exec address is used to autorun once loading is complete.\n\n"
  },
  {
    "path": "tools/cmoc/mo5/f2k5.c",
    "content": "#include <stdint.h>\r\n#include <stdio.h>\r\n#include <string.h>\r\n\r\nint main(int argc, char* argv[])\r\n{\r\n    const uint8_t sync[] = {\r\n            1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3C,0x5A\r\n    };\r\n    while(--argc > 0)\r\n    {\r\n        uint8_t l;\r\n        char* path = argv[argc];\r\n        FILE *in, *out;\r\n        in = fopen(path, \"rb\");\r\n        out = fopen(\"FILE.K5\", \"wb\");\r\n\r\n        // HEADER BLOCK\r\n        fwrite(sync, 1, sizeof(sync), out);\r\n\r\n        uint8_t head[17];\r\n        l = 0;\r\n        head[l++] = 0; head[l++] = 16;\r\n        for(int i = 0; l < 13;)\r\n        {\r\n                if(i >= strlen(path)) break;\r\n                if(path[i] == '.') i++;\r\n                if(path[i] == '/') {\r\n                        l = 2;\r\n                        i++;\r\n                        continue;\r\n                }\r\n                head[l++] = path[i++];\r\n        }\r\n\r\n        while(l < 13) head[l++] = ' ';\r\n\r\n        head[l++] = 2;\r\n        head[l++] = 0;\r\n        head[l++] = 0;\r\n        head[l] = 0;\r\n\r\n        for(int i = 2; i < l; i++)\r\n                head[l] += head[i];\r\n        head[l] = -head[l];\r\n        l++;\r\n        fwrite(head, 1, 17, out);\r\n\r\n        // DATA BLOCKS\r\n        for(;;)\r\n        {\r\n                uint8_t buf[254];\r\n                l = fread(buf, 1, 254, in);\r\n                if(l <= 0) break;\r\n\r\n                fwrite(sync, 1, sizeof(sync), out);\r\n                head[0] = 1;\r\n                head[1] = l + 2;\r\n                fwrite(head, 1, 2, out);\r\n                fwrite(buf, 1, l, out);\r\n\r\n                head[0] = 0;\r\n                while(l > 0)\r\n                        head[0] -= buf[--l];\r\n                fwrite(head, 1, 1, out);\r\n        }\r\n\r\n        // FOOTER BLOCK\r\n        fwrite(sync, 1, sizeof(sync), out);\r\n        head[0] = 255;\r\n        head[1] = 2;\r\n        head[2] = 0;\r\n        fwrite(head, 1, 3, out);\r\n\r\n        fclose(in);\r\n        fclose(out);\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/dfloppy.c",
    "content": "/*  Lecture des disquettes Thomson sous MS-DOS\n *  Version 2.1\n *  Copyright (C) 2000-2003 Eric Botcazou\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n/* Limitations:\n *  - les faces 1 des disquettes ne sont pas accessibles,\n *  - les disquettes simple densit (format FM) ne sont pas lisibles.\n */\n\n#ifndef SCAN_DEPEND\n   #include <stdio.h>\n   #include <stddef.h>\n   #include <bios.h>\n   #include <dpmi.h>\n   #include <sys/movedata.h>\n#endif\n\n#include \"floppy.h\"\n\n\n#define DISK_RETRY     3\n\nstruct floppy_cmd {\n   int cmd;\n   int head;\n   int track;\n   int sector;\n   int nsects;\n   void *buffer;\n};\n\nstatic int drive_type[2];\nstatic int dpt_addr = 0;\n\n#define DPT_SIZE      11\n\nstatic unsigned char pc_dpt[DPT_SIZE];\n\n\n\n/* SetDiskParameters:\n *  Initialise les paramtres disquette pour le format Thomson.\n */\nstatic void SetDiskParameters(int density)\n{\n   unsigned char to_dpt[DPT_SIZE];\n\n   if (!dpt_addr) {\n      /* on rcupre le vecteur 0x1E du BIOS qui pointe sur la table\n         des paramtres de la disquette */\n      _dosmemgetl(0x1E*4, 1, &dpt_addr);\n\n      /* on sauvegarde les paramtres originaux */\n      _dosmemgetb(dpt_addr, DPT_SIZE, pc_dpt);\n   }\n\n   /* on fixe les nouveaux paramtres */\n   to_dpt[0x0]=0xDF;  /* spec1                      */\n   to_dpt[0x1]=0x02;  /* spec2                      */\n   to_dpt[0x2]=0x25;  /* motor turn off delay       */\n   to_dpt[0x3]=density - 1;  /* sector size = 128*2^n */\n   to_dpt[0x4]=0x10;  /* 16 sectors/track           */\n   to_dpt[0x5]=0x1B;  /* gap between sectors        */\n   to_dpt[0x6]=(density == 1 ? 0x80 : 0xFF);  /* data length */\n   to_dpt[0x7]=0x2C;  /* gap when formatting        */\n   to_dpt[0x8]=0xE5;  /* filler byte                */\n   to_dpt[0x9]=0x0F;  /* head settle time           */\n   to_dpt[0xA]=0x08;  /* motor start time           */\n   _dosmemputb(to_dpt, DPT_SIZE, dpt_addr);\n\n   /* reset */\n   biosdisk(0, 0, 0, 0, 1, 0, NULL);\n}\n\n\n\n/* ExecCommand:\n *  Excute la commande spcifie (via l'interruption 13h du BIOS).\n */\nstatic int ExecCommand(int drive, int density, struct floppy_cmd *fd_cmd)\n{\n   int i;\n   int ret=0x10;\n\n   SetDiskParameters(density);\n\n   for (i=0; i<DISK_RETRY; i++) {\n      ret=biosdisk(fd_cmd->cmd, drive, fd_cmd->head, fd_cmd->track,\n                    fd_cmd->sector, fd_cmd->nsects, fd_cmd->buffer);\n\n      if (ret==0)  /* commande OK? */\n         break;\n\n      if ((i>1) && (ret==0x11)) { /* commande non OK mais corrige par ctrl? */\n         ret=0;\n         break;\n      }\n\n      /* reset du lecteur */\n      biosdisk(0, 0, 0, 0, 1, 0, NULL);\n   }\n\n   switch (ret) {\n\n      case 0x02:  /* address mark not found */\n         return 0x04;   /* erreur sur l'adresse */\n\n      case 0x03:  /* disk write-protected */\n         return 0x01;   /* disk protg en criture */\n\n      case 0x04:  /* sector not found */\n      case 0x07:  /* drive parameter activity failed */\n      case 0x10:  /* data read (CRC or ECC) error */\n      case 0x0A:  /* bad sector flag detected */\n      case 0x0B:  /* bad track flag detected */\n         return 0x08;   /* erreur sur les donnes */\n\n      case 0x06:  /* floppy disk removed */\n      case 0x80:  /* disk timed out or failed to respond */\n         return 0x10;   /* lecteur non prt */\n\n      default:\n         return 0;  /* OK */\n   }\n}\n\n\n\n/* FloppyReadSector:\n *  Lit le secteur spcifi sur la disquette.\n */\nint FloppyReadSector(int drive, int density, int track, int sector, int nsects, unsigned char data[])\n{\n   struct floppy_cmd fd_cmd;\n\n   fd_cmd.cmd    = 2;\n   fd_cmd.head   = drive%2;\n   fd_cmd.track  = track;\n   fd_cmd.sector = sector;\n   fd_cmd.nsects = nsects;\n   fd_cmd.buffer = data;\n\n   return ExecCommand(drive/2, density, &fd_cmd);\n}\n\n\n\n/* FloppyWriteSector:\n *  Ecrit le secteur spcifi sur la disquette.\n */\nint FloppyWriteSector(int drive, int density, int track, int sector, int nsects, const unsigned char data[])\n{\n   struct floppy_cmd fd_cmd;\n\n   fd_cmd.cmd    = 3;\n   fd_cmd.head   = drive%2;\n   fd_cmd.track  = track;\n   fd_cmd.sector = sector;\n   fd_cmd.nsects = nsects;\n   fd_cmd.buffer = (unsigned char *)data;\n\n   return ExecCommand(drive/2, density, &fd_cmd);\n}\n\n\n\n/* FloppyFormatTrack:\n *  Formate la piste en utilisant la table des headers spcifie.\n */\nint FloppyFormatTrack(int drive, int density, int track, const unsigned char header_table[])\n{\n   struct floppy_cmd fd_cmd;\n   int format_type = 0;\n\n   /* slection du format de formatage */\n   switch (drive_type[drive/2]) {\n\n      case 1:\n         /* 320/360 kb in 360 kb drive */\n         format_type = 1;\n         break;\n\n      case 2:\n         /* 320/360 kb in 1.2 Mb drive */\n         format_type = 2;\n         break;\n\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n         /* 720 kb in 720 kb/1.44 Mb/2.88 Mb drive */\n         format_type = 4;\n         break;\n   }\n\n   biosdisk(23, drive/2, 0, 0, 1, format_type, NULL);\n\n   fd_cmd.cmd    = 5;\n   fd_cmd.head   = drive%2;\n   fd_cmd.track  = track;\n   fd_cmd.sector = 1;\n   fd_cmd.nsects = 16;\n   fd_cmd.buffer = (unsigned char *)header_table;\n\n   return ExecCommand(drive/2, density, &fd_cmd);\n}\n\n\n\n/* FloppyInit:\n *  Initialise le module de lecture de disquettes.\n */\nint FloppyInit(struct floppy_info *fi, int enable_write_support)\n{\n   __dpmi_regs r;\n   int i, num_drives = 0;\n\n   (void) enable_write_support;\n\n   for (i=0; i<2; i++) {\n      /* get drive parameters (int 13h, function 08h) */\n      r.h.ah = 0x08;\n      r.h.dl = i;\n\n      __dpmi_int(0x13, &r);\n\n      if (r.x.flags&1) {  /* CF set? */\n         drive_type[i] = 0;\n\n         fi->drive_type[2*i] = 0;\n         fi->drive_type[2*i+1] = 0;\n      }\n      else {\n         if (r.h.bl > 6) {\n            drive_type[i] = 0;\n\n            fi->drive_type[2*i] = 0;\n            fi->drive_type[2*i+1] = 0;\n         }\n         else {\n            drive_type[i] = r.h.bl;\n\n            fi->drive_type[2*i] = r.h.bl;\n            fi->drive_type[2*i+1] = 0;  /* face 1 unsupported */\n         }\n\n         num_drives++;\n      }\n   }\n\n   fi->num_drives = num_drives;\n   fi->fm_support = 0;\n   fi->write_support = 1;\n\n   return num_drives;\n}\n\n\n\n/* FloppyExit:\n *  Met au repos le module de lecture de disquettes.\n */\nvoid FloppyExit(void)\n{\n   if (dpt_addr) {\n      /* restaure les paramtres originaux */\n      _dosmemputb(pc_dpt, DPT_SIZE, dpt_addr);\n\n      /* reset */\n      biosdisk(0, 0, 0, 0, 1, 0, NULL);\n\n      dpt_addr = 0;\n   }\n}\n\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/floppy.h",
    "content": "/*  Lecture des disquettes Thomson sur PC\n *  Version 2.1\n *  Copyright (C) 2000-2003 Eric Botcazou\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n\n#ifndef FLOPPY_H\n#define FLOPPY_H\n\nstruct floppy_info {\n   int num_drives;\n   int drive_type[4];\n   int fm_support;\n   int write_support;\n};\n\n/* drive type: 1 (5\"25 - 360 kb)\n *             2 (5\"25 - 1.2 Mb)\n *             3 (3\"5  - 720 kb)\n *             4 (3\"5 - 1.44 Mb)\n *             5 (3\"5 - 2.88 Mb)\n *             6 (3\"5 - 2.88 Mb)\n */\n\nextern int FloppyInit(struct floppy_info *fi, int enable_write_support);\nextern void FloppyExit(void);\n\nextern int FloppyReadSector(int drive, int density, int track, int sector, int nsects, unsigned char data[]);\nextern int FloppyWriteSector(int drive, int density, int track, int sector, int nsects, const unsigned char data[]);\nextern int FloppyFormatTrack(int drive, int density, int track, const unsigned char header_table[]);\n\n#endif\n\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/lfloppy.c",
    "content": "/*  Lecture des disquettes Thomson sous Linux\n *  Version 2.1\n *  Copyright (C) 2000-2003 Eric Botcazou\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n\n#include \"floppy.h\"\n\n#if defined(linux)\n#ifndef SCAN_DEPEND\n   #include <stdio.h>\n   #include <fcntl.h>\n   #include <unistd.h>\n   #include <sys/ioctl.h>\n   #include <linux/fd.h>\n   #include <linux/fdreg.h>\n#endif\n\n\n#define DISK_RETRY   3\n\nstatic int rw_flag;\nstatic int fd[2] = {-1, -1};\nstatic int drive_type[2];\n\n#define IS_5_INCHES(drive) ((drive_type[drive]>0) && (drive_type[drive]<3))\n\n#define SET_NO_MULTITRACK(lval)  (lval &= ~0x80)\n#define SET_NO_MFM(lval)  (lval &= ~0x40)\n\n\n\n/* ResetDrive:\n *  Rinitialise le lecteur de disquettes.\n */\nstatic void ResetDrive(int drive, int density)\n{\n   struct floppy_struct fd_prm;\n\n   fd_prm.head    = (density == 1 ? 1 : 2);  /* nr of heads */\n   fd_prm.track   = (IS_5_INCHES(drive) ? 40 : 80);  /* nr of tracks */\n   fd_prm.sect    = (density == 1 ? 4 : 8);  /* sectors per track (512-byte sector) */\n   fd_prm.size    = fd_prm.head * fd_prm.track * fd_prm.sect;  /* nr of sectors total */\n   fd_prm.stretch = 0;\n   fd_prm.gap     = 0x1B;\n   fd_prm.rate    = (density == 1 ? 0xB1 : 0x3A);  /* cf /usr/include/linux/fd.h */\n   fd_prm.spec1   = 0xDF;\n   fd_prm.fmt_gap = 0x2C;\n\n   ioctl(fd[drive], FDSETPRM, &fd_prm);\n}\n\n\n\n/* OpenDrive:\n *  Obtient le descripteur de fichier pour le lecteur de disquettes.\n */\nstatic int OpenDrive(int drive, int density)\n{\n   char dev_str[16]=\"\";\n\n   if (drive > (1 << 5))\n       return 0;\n\n   snprintf(dev_str, sizeof(dev_str), \"/dev/fd%d\", drive);\n\n   if ((fd[drive]=open(dev_str, O_RDWR | O_NDELAY))<0)\n       return 0;\n\n   ResetDrive(drive, density);\n   return 1;\n\n/*\n   if (rw_flag) {\n      if ((fd[drive]=open(dev_str, O_RDWR | O_NDELAY))>=0)\n         goto success;\n   }\n   else {\n      if ((fd[drive]=open(dev_str, O_RDONLY | O_NDELAY))>=0)\n         goto success;\n   }\n\n   return 0;\n\n  success:\n    ResetDrive(drive, density);\n    return 1;\n*/\n}\n\n\n\n/* ExecCommand:\n *  Excute la commande spcifie via l'appel ioctl() FDRAWCMD.\n */\nstatic int ExecCommand(int drive, int density, struct floppy_raw_cmd *fd_cmd)\n{\n   int i, ret = 0;\n\n   if (fd[drive]<0 && !OpenDrive(drive, density))\n      return 0x10;  /* lecteur non prt */\n\n   for (i=0; i<DISK_RETRY; i++) {\n      ret=ioctl(fd[drive], FDRAWCMD, fd_cmd);\n\n      if (ret >= 0)\n         break;\n\n      ResetDrive(drive, density);\n   }\n\n   if (ret<0)\n      return 0x10;  /* lecteur non prt */\n\n#ifdef DEBUG\n   printf(\"fd_cmd reply: \");\n   for (i=0; i<3; i++)\n      printf(\"ST%d=%02x \", i, fd_cmd->reply[i]);\n   printf(\"\\n\");\n#endif\n\n   switch (fd_cmd->reply[1]) { /* ST1 */\n\n      case 0x01:  /* Missing Address Mark */\n         return 0x04;   /* erreur sur l'adresse */\n\n      case 0x02:  /* Write Protected */\n         return 0x01;   /* disk protg en criture */\n\n      case 0x04:  /* No Data - unreadable */\n         return 0x08;   /* erreur sur les donnes */\n\n      case 0x20:  /* CRC error in data or addr */\n         if (fd_cmd->reply[2]==0x20)\n            return 0x08;   /* erreur sur les donnes */\n         else\n            return 0x04;   /* erreur sur l'adresse */\n\n      default:\n         return 0;  /* OK */\n   }\n}\n\n\n\n/* FloppyReadSector:\n *  Lit le secteur spcifi sur la disquette.\n */\nint FloppyReadSector(int drive, int density, int track, int sector, int nsects, unsigned char data[])\n{\n   struct floppy_raw_cmd fd_cmd;\n   int pc_drive = drive/2;\n\n   /* paramtres de commande */\n   fd_cmd.flags  = FD_RAW_READ | FD_RAW_INTR | FD_RAW_NEED_SEEK;\n   fd_cmd.data   = data;\n   fd_cmd.length = (density == 1 ? 128 : 256)*nsects;  /* buffer length */\n   fd_cmd.rate   = IS_5_INCHES(pc_drive) ? 1 : 2;\n   fd_cmd.track  = IS_5_INCHES(pc_drive) ? track*2 : track;  /* physical cylinder */\n\n   fd_cmd.cmd[0] = FD_READ;\n   fd_cmd.cmd[1] = (drive%2) << 2;  /* physical head */\n   fd_cmd.cmd[2] = track;  /* logical cylinder */\n   fd_cmd.cmd[3] = 0;  /* logical head */\n   fd_cmd.cmd[4] = sector;\n   fd_cmd.cmd[5] = density - 1;  /* sector size = 128*2^n */\n   fd_cmd.cmd[6] = 16;  /* num sectors */\n   fd_cmd.cmd[7] = 0x1B;  /* gap */\n   fd_cmd.cmd[8] = 0xFF;\n   fd_cmd.cmd_count = 9;\n\n   SET_NO_MULTITRACK(fd_cmd.cmd[0]);\n\n   if (density == 1)\n      SET_NO_MFM(fd_cmd.cmd[0]);  /* FM coding */\n\n   return ExecCommand(pc_drive, density, &fd_cmd);\n}\n\n\n\n/* FloppyWriteSector:\n *  Ecrit le secteur spcifi sur la disquette.\n */\nint FloppyWriteSector(int drive, int density, int track, int sector, int nsects, const unsigned char data[])\n{\n   struct floppy_raw_cmd fd_cmd;\n   int pc_drive = drive/2;\n\n   /* paramtres de commande */\n   fd_cmd.flags  = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_NEED_SEEK;\n   fd_cmd.data   = (unsigned char *)data;\n   fd_cmd.length = (density == 1 ? 128 : 256)*nsects;  /* buffer length */\n   fd_cmd.rate   = IS_5_INCHES(pc_drive) ? 1 : 2;\n   fd_cmd.track  = IS_5_INCHES(pc_drive) ? track*2 : track;  /* physical cylinder */\n\n   fd_cmd.cmd[0] = FD_WRITE;\n   fd_cmd.cmd[1] = (drive%2) << 2;  /* physical head */\n   fd_cmd.cmd[2] = track;  /* logical cylinder */\n   fd_cmd.cmd[3] = 0;  /* logical head */\n   fd_cmd.cmd[4] = sector;\n   fd_cmd.cmd[5] = density - 1;  /* sector size = 128*2^n */\n   fd_cmd.cmd[6] = 16;  /* num sectors */\n   fd_cmd.cmd[7] = 0x1B;  /* gap */\n   fd_cmd.cmd[8] = 0xFF;\n   fd_cmd.cmd_count = 9;\n\n   SET_NO_MULTITRACK(fd_cmd.cmd[0]);\n\n   if (density == 1)\n      SET_NO_MFM(fd_cmd.cmd[0]);  /* FM coding */\n\n   return ExecCommand(pc_drive, density, &fd_cmd);\n}\n\n\n\n/* FloppyFormatTrack:\n *  Formate la piste en utilisant la table des headers spcifie.\n */\nint FloppyFormatTrack(int drive, int density, int track, const unsigned char header_table[])\n{\n   struct floppy_raw_cmd fd_cmd;\n   int pc_drive = drive/2;\n\n   /* paramtres de commande */\n   fd_cmd.flags  = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_NEED_SEEK;\n   fd_cmd.data   = (unsigned char *)header_table;\n   fd_cmd.length = 64;\n   fd_cmd.rate   = IS_5_INCHES(pc_drive) ? 1 : 2;\n   fd_cmd.track  = IS_5_INCHES(pc_drive) ? track*2 : track;  /* physical cylinder */\n\n   fd_cmd.cmd[0] = FD_FORMAT;\n   fd_cmd.cmd[1] = (drive%2) << 2;\n   fd_cmd.cmd[2] = density - 1;  /* sector size = 128*2^n */\n   fd_cmd.cmd[3] = 16;  /* num sectors */\n   fd_cmd.cmd[4] = 0x2C;\n   fd_cmd.cmd[5] = 0xE5;  /* filler_byte */\n   fd_cmd.cmd_count = 6;\n\n   SET_NO_MULTITRACK(fd_cmd.cmd[0]);  /* nop */\n\n   if (density == 1)\n      SET_NO_MFM(fd_cmd.cmd[0]);  /* FM coding */\n\n   return ExecCommand(pc_drive, density, &fd_cmd);\n}\n\n\n\n/* FloppyInit:\n *  Initialise le module de lecture de disquettes.\n */\nint FloppyInit(struct floppy_info *fi, int enable_write_support)\n{\n   struct floppy_drive_params fd_params;\n   char dev_str[16];\n   int i, num_drives = 0;\n\n   for (i=0; i<2; i++) {\n      /* get drive type */\n      snprintf(dev_str, sizeof(dev_str), \"/dev/fd%d\", i);\n\n      if ((fd[i]=open(dev_str, O_RDWR | O_NDELAY))<0) {\n         drive_type[i] = 0;\n         fi->drive_type[2*i] = 0;\n         fi->drive_type[2*i+1] = 0;\n      }\n      else {\n         ioctl(fd[i], FDGETDRVPRM, &fd_params);\n         close(fd[i]);\n         fd[i] = -1;\n\n         if (fd_params.cmos > 6) {\n            drive_type[i] = 0;\n            fi->drive_type[2*i] = 0;\n            fi->drive_type[2*i+1] = 0;\n         }\n         else {\n            drive_type[i] = fd_params.cmos;\n            fi->drive_type[2*i] = fd_params.cmos;\n            fi->drive_type[2*i+1] = fd_params.cmos;\n         }\n\n         num_drives++;\n      }\n   }\n\n   fi->num_drives = num_drives;\n   fi->fm_support = 1;\n   fi->write_support = enable_write_support;\n\n   rw_flag = enable_write_support;\n   \n   return num_drives;\n}\n\n\n\n/* FloppyExit:\n *  Met au repos le module de lecture de disquettes.\n */\nvoid FloppyExit(void)\n{\n   int i;\n\n   for (i=0; i<2; i++) {\n      if (fd[i] >= 0) {\n         close(fd[i]);\n         fd[i] = -1;\n      }\n   }\n}\n\n#else\n\n/* Dummy implementation for system without the linux floppy disk API */\n\nint FloppyReadSector(int drive, int density, int track, int sector, int nsects, unsigned char data[])\n{\n    (void)drive;\n    (void)density;\n    (void)track;\n    (void)sector;\n    (void)nsects;\n    (void)data;\n    return 0x10;\n}\n\nint FloppyFormatTrack(int drive, int density, int track, const unsigned char header_table[])\n{\n    (void)drive;\n    (void)density;\n    (void)track;\n    (void)header_table;\n    return 0x10;\n}\n\nint FloppyWriteSector(int drive, int density, int track, int sector, int nsects, const unsigned char data[])\n{\n    (void)drive;\n    (void)density;\n    (void)track;\n    (void)sector;\n    (void)nsects;\n    (void)data;\n    return 0x10;\n}\n\nint FloppyInit(struct floppy_info *fi, int enable_write_support)\n{\n    (void)fi;\n    (void)enable_write_support;\n    /* return number of drive : 0 */\n    return 0;\n}\n\nvoid FloppyExit(void)\n{\n}\n#endif\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/libsap.c",
    "content": "/*  LibSAP\n *  Version 0.9.4\n *  Copyright (C) 2000-2003 Eric Botcazou\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n\n#include <ctype.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include \"libsap.h\"\n\n\nint sap_errno;\n\n\n#define FILENAME_LENGTH 128\n#define MAX_ARCHIVE       8\n\n#define SAP_MAGIC_NUM  0xB3\n#define SAP_HEADER_SIZE  66\nstatic const char sap_header[]=\"\\0SYSTEME D'ARCHIVAGE PUKALL S.A.P. \"\n                               \"(c) Alexandre PUKALL Avril 1998\";\n\n\nstatic const int sap_format_table[][3] = {\n   { SAP_NTRACKS1, SAP_SECTSIZE1, SAP_TRACKSIZE1 },\n   { SAP_NTRACKS2, SAP_SECTSIZE2, SAP_TRACKSIZE2 }\n};\n\n#define SAP_NTRACKS(f)      sap_format_table[f-SAP_FORMAT1][0]\n#define SAP_SECTSIZE(f)     sap_format_table[f-SAP_FORMAT1][1]\n#define SAP_TRACKSIZE(f)    sap_format_table[f-SAP_FORMAT1][2]\n\n#define SAP_EXTSECTSIZE(f)  (SAP_SECTSIZE(f) + sizeof(sapsector_t) - SAP_SECTSIZE1)\n\n\nstatic short int crcpuk_temp;\n\nstatic short int puktable[]={\n   0x0000, 0x1081, 0x2102, 0x3183,\n   0x4204, 0x5285, 0x6306, 0x7387,\n   0x8408, 0x9489, 0xa50a, 0xb58b,\n   0xc60c, 0xd68d, 0xe70e, 0xf78f\n};\n\n\n#define NO_ARCHIVE     0\n#define EMPTY_ARCHIVE  1\n#define FILLED_ARCHIVE 2\n#define FULL_ARCHIVE   3\n\nstatic struct {\n   int format;\n   int state;\n   int ntracks;\n   FILE *file;\n} archive[MAX_ARCHIVE+1];\n\n#define ID_FORMAT(id)   archive[id].format\n#define ID_STATE(id)    archive[id].state\n#define ID_NTRACKS(id)  archive[id].ntracks\n#define ID_FILE(id)     archive[id].file\n\n\n/* constants for the TO logical disk format */\n#define TO_NSECTS                16\n#define TO_SECTOR_PER_BLOCK      8\n\n#define TO_SECTSIZE1             255  /* not 256 */\n#define TO_FAT_START1            257\n#define TO_NBLOCKS1              160\n#define TO_BLOCKSIZE1            (TO_SECTOR_PER_BLOCK*TO_SECTSIZE1)\n#define TO_FILESIZE_MAX1         (TO_NBLOCKS1-2)\n#define TO_DIR_START1            512\n\n#define TO_SECTSIZE2             127  /* not 128 */\n#define TO_FAT_START2            129\n#define TO_NBLOCKS2              80\n#define TO_BLOCKSIZE2            (TO_SECTOR_PER_BLOCK*TO_SECTSIZE2)\n#define TO_FILESIZE_MAX2         (TO_NBLOCKS2-2)\n#define TO_DIR_START2            256\n\n#define TO_FILLER_BYTE           0xE5\n#define TO_TAG_RESERVED          0xFE\n#define TO_TAG_FREE              0xFF\n#define TO_END_BLOCK_OFFSET      0xC0\n\n#define TO_DIRENTRY_LENGTH       32\n#define TO_NAME                  0\n#define TO_NAME_LENGTH           8\n#define TO_EXT                   8\n#define TO_EXT_LENGTH            3\n#define TO_FILE_TYPE             11\n#define TO_DATA_TYPE             12\n#define TO_FIRST_BLOCK           13\n#define TO_END_SIZE              14\n#define TO_COMMENT               16\n#define TO_COMMENT_LENGTH        8\n#define TO_DATE_DAY              24\n#define TO_DATE_MONTH            25\n#define TO_DATE_YEAR             26\n#define TO_CHG_MODE              30\n#define TO_CHG_CHECKSUM          31\n\n#define TO_DIRENTRY_PER_SECTOR1  8\n#define TO_NDIRENTRIES1          (TO_NSECTS-2)*TO_DIRENTRY_PER_SECTOR1\n\n#define TO_DIRENTRY_PER_SECTOR2  4\n#define TO_NDIRENTRIES2          (TO_NSECTS-2)*TO_DIRENTRY_PER_SECTOR2\n\nstatic const int to_format_table[][8] = {\n   { TO_SECTSIZE1, TO_FAT_START1, TO_NBLOCKS1, TO_BLOCKSIZE1,\n     TO_FILESIZE_MAX1, TO_DIR_START1, TO_DIRENTRY_PER_SECTOR1, TO_NDIRENTRIES1 },\n   { TO_SECTSIZE2, TO_FAT_START2, TO_NBLOCKS2, TO_BLOCKSIZE2,\n     TO_FILESIZE_MAX2, TO_DIR_START2, TO_DIRENTRY_PER_SECTOR2, TO_NDIRENTRIES2 }\n};\n\n#define TO_SECTSIZE(f)             to_format_table[f-SAP_FORMAT1][0]\n#define TO_FAT_START(f)            to_format_table[f-SAP_FORMAT1][1]\n#define TO_NBLOCKS(f)              to_format_table[f-SAP_FORMAT1][2]\n#define TO_BLOCKSIZE(f)            to_format_table[f-SAP_FORMAT1][3]\n#define TO_FILESIZE_MAX(f)         to_format_table[f-SAP_FORMAT1][4]\n#define TO_DIR_START(f)            to_format_table[f-SAP_FORMAT1][5]\n#define TO_DIRENTRY_PER_SECTOR(f)  to_format_table[f-SAP_FORMAT1][6]\n#define TO_NDIRENTRIES(f)          to_format_table[f-SAP_FORMAT1][7]\n\n\n/* constants for the TO memory layout */\n#define TO_BANKSIZE             16384\n\n\n/* file types */\nenum {\n   FTYPE_BASIC,\n   FTYPE_DATA,\n   FTYPE_MACHINE,\n   FTYPE_ASM,\n   FTYPE_OTHERS,\n   FTYPE_PARAGRAPHE = 0xA\n};\n\nstatic char ftype_sym[5] = { 'B', 'D', 'M', 'A', '*' };\n\nenum {\n   DTYPE_BINARY,\n   DTYPE_ASCII = 0xFF,\n   DTYPE_OTHERS = 2\n};\n\nstatic char dtype_sym[3] = { 'B', 'A', '*' };\n\nstruct extension_t {\n   char tag[TO_EXT_LENGTH+1];\n   unsigned char ftype;\n   unsigned char dtype;\n};\n\nenum {\n   EXT_TYPE_BAS,\n   EXT_TYPE_DAT,\n   EXT_TYPE_ASC,\n   EXT_TYPE_ASM,\n   EXT_TYPE_BIN,\n   EXT_TYPE_MAP,\n   EXT_TYPE_CHG,\n   EXT_TYPE_CFG,\n   EXT_TYPE_BAT,\n   EXT_TYPE_CAR,\n   EXT_TYPE_PAR,\n   EXT_TYPE_UNKNOWN,\n   EXT_TYPE_MAX\n};\n\nstatic struct extension_t ext_type[EXT_TYPE_MAX] = {\n   { \"BAS\", FTYPE_BASIC,      DTYPE_BINARY },\n   { \"DAT\", FTYPE_DATA,       DTYPE_ASCII  },\n   { \"ASC\", FTYPE_DATA,       DTYPE_ASCII  },\n   { \"ASM\", FTYPE_ASM,        DTYPE_ASCII  },\n   { \"BIN\", FTYPE_MACHINE,    DTYPE_BINARY },\n   { \"MAP\", FTYPE_MACHINE,    DTYPE_BINARY },\n   { \"CHG\", FTYPE_DATA,       DTYPE_ASCII  },\n   { \"CFG\", FTYPE_MACHINE,    DTYPE_BINARY },\n   { \"BAT\", FTYPE_BASIC,      DTYPE_BINARY },\n   { \"CAR\", FTYPE_DATA,       DTYPE_ASCII  },\n   { \"PAR\", FTYPE_PARAGRAPHE, DTYPE_BINARY },\n   { \"???\", FTYPE_MACHINE,    DTYPE_BINARY }\n};\n\n\n#define MIN(x,y)     (((x) < (y)) ? (x) : (y))\n\n\n\n/************************************************/\n/***    private functions: helper routines    ***/\n/************************************************/\n\n\n/* get_id:\n *  Finds the first empty id, returns 0 if has failed.\n */\nstatic int get_id(void)\n{\n   int i;\n\n   for (i=MAX_ARCHIVE; i>0; i--) {\n      if (archive[i].state == NO_ARCHIVE)\n         break;\n   }\n\n   return i;\n}\n\n\n\n/* clean_string:\n *  Helper function to clean up character strings.\n */\nstatic inline void clean_string(unsigned char *str)\n{\n   while (*str) {\n      if ((*str<32) || (*str>127))\n         *str = '#';\n\n      str++;\n   }\n}\n\n\n\n/************************************************/\n/***   private functions: SAP format support  ***/\n/************************************************/\n\n\n/* crc_pukall:\n *  Computes the new CRC from the c data.\n */\nstatic void crc_pukall(short int c)\n{\n   short int index;\n\n   index = (crcpuk_temp ^ c) & 0xf;\n   crcpuk_temp = ((crcpuk_temp>>4) & 0xfff) ^ puktable[index];\n\n   c >>= 4;\n\n   index = (crcpuk_temp ^ c) & 0xf;\n   crcpuk_temp = ((crcpuk_temp>>4) & 0xfff) ^ puktable[index];\n}\n\n\n\n/* do_crc:\n *  Computes the CRC for the specified SAP sector.\n */\nstatic void do_crc(sapsector_t *sapsector, int format)\n{\n   int i;\n\n   crcpuk_temp = 0xffff;\n\n   crc_pukall(sapsector->format);\n   crc_pukall(sapsector->protection);\n   crc_pukall(sapsector->track);\n   crc_pukall(sapsector->sector);\n\n   for (i=0; i<SAP_SECTSIZE(format); i++)\n      crc_pukall(sapsector->data[i]);\n}\n\n\n\n/* do_read_sector: \n *  Performs the low-level read operation for the specified sector.\n */\nstatic void do_read_sector(sapID id, sapsector_t *sapsector)\n{\n   unsigned char buffer[sizeof(sapsector_t)];\n   int format = ID_FORMAT(id);\n   int i;\n   size_t unused_size_t;\n\n   unused_size_t=fread(buffer, sizeof(char), SAP_EXTSECTSIZE(format), ID_FILE(id));\n\n   sapsector->format     = buffer[0];\n   sapsector->protection = buffer[1];\n   sapsector->track      = buffer[2];\n   sapsector->sector     = buffer[3];\n\n   for (i=0; i<SAP_SECTSIZE(format); i++)\n       sapsector->data[i] = buffer[4+i]^SAP_MAGIC_NUM;\n\n   sapsector->data[SAP_SECTSIZE(format)] = buffer[4+i];\n   sapsector->data[SAP_SECTSIZE(format)+1] = buffer[4+i+1];\n   (void)unused_size_t;\n}\n\n\n\n/* do_write_sector:\n *  Performs the low-level write operation for the specified sector.\n */\nstatic void do_write_sector(sapID id, sapsector_t *sapsector)\n{\n   unsigned char buffer[sizeof(sapsector_t)];\n   int format = ID_FORMAT(id);\n   int i;\n\n   /* fill in the write buffer */\n   buffer[0] = sapsector->format;\n   buffer[1] = sapsector->protection;\n   buffer[2] = sapsector->track;\n   buffer[3] = sapsector->sector;\n\n   for (i=0; i<SAP_SECTSIZE(format); i++)\n      buffer[4+i] = sapsector->data[i]^SAP_MAGIC_NUM;\n\n   /* compute the CRC */\n   do_crc(sapsector, format);\n   buffer[4+i] = sapsector->data[SAP_SECTSIZE(format)] = (crcpuk_temp>>8)&0xff;\n   buffer[4+i+1] = sapsector->data[SAP_SECTSIZE(format)+1] = crcpuk_temp&0xff;\n\n   fwrite(buffer, sizeof(char), SAP_EXTSECTSIZE(format), ID_FILE(id));\n}\n\n\n\n/* seek_pos:\n *  Seeks the specified position in the SAP archive.\n */\nstatic void seek_pos(sapID id, int track, int sect)\n{\n   int pos;\n\n   pos = SAP_HEADER_SIZE + (track*SAP_NSECTS + sect-1) * SAP_EXTSECTSIZE(ID_FORMAT(id));\n\n   fseek(ID_FILE(id), pos, SEEK_SET);\n}\n\n\n\n/************************************************/\n/***  private functions: Thomson DOS support  ***/\n/************************************************/\n\n\n\n/* get_file_size:\n *  Returns the size in blocks of the specified file on disk.\n */\nstatic int get_file_size(int format, int n, const unsigned char trk20_data[])\n{\n   const unsigned char *fat_data, *entry_data;\n   int block, size = 0;\n\n   fat_data = trk20_data + TO_FAT_START(format);\n   entry_data = trk20_data + TO_DIR_START(format) + n*TO_DIRENTRY_LENGTH;\n\n   block = entry_data[TO_FIRST_BLOCK];\n\n   while ((block<TO_NBLOCKS(format)) && (size<TO_FILESIZE_MAX(format))) {\n      size++;\n      block = fat_data[block];\n   }\n\n   return size;\n}\n\n\n\n/* get_dskf:\n *  Returns the amount of free space in blocks on disk.\n */\nstatic int get_dskf(int format, const unsigned char trk20_data[])\n{\n   const unsigned char *fat_data;\n   int i, dskf = 0;\n\n   fat_data = trk20_data + TO_FAT_START(format);\n\n   for (i=0; i<TO_NBLOCKS(format); i++) {\n      if (fat_data[i] == TO_TAG_FREE)\n         dskf++;\n   }\n\n   return dskf;\n}\n\n\n\n/* extract_dir_entry:\n *  Extracts one dir entry and returns the number of characters.\n */\nstatic int extract_dir_entry(int format, char buffer[], int buffer_size, int n, const unsigned char trk20_data[])\n{\n   const unsigned char *entry_data;\n   char name[TO_NAME_LENGTH+1], ext[TO_EXT_LENGTH+1], date[9], *comment;\n   unsigned char ftype, dtype;\n   int i, len, size;\n\n   entry_data = trk20_data + TO_DIR_START(format) + n*TO_DIRENTRY_LENGTH;\n\n   comment = malloc(TO_COMMENT_LENGTH+1);\n\n   if ((entry_data[TO_NAME] == 0) || (entry_data[TO_NAME] == TO_TAG_FREE))\n      return 0;\n\n   if (entry_data[TO_NAME] == 1) {\n      /* display only comment (if any) */\n      if (entry_data[TO_COMMENT]) {\n         comment[0] = '\\0';\n         strncat(comment, (const char *)(entry_data+TO_COMMENT), TO_COMMENT_LENGTH);\n\n         for (i=1; i<TO_COMMENT_LENGTH; i++) {\n            if (comment[i] == 18) { /* DC2 (repetition) ? */\n               len = strlen(comment);\n               comment = realloc(comment, len + comment[i+1]);\n               memmove(comment+i+comment[i+1], comment+i+2, len - (i+2) + 1);\n               memset(comment+i, comment[i-1], comment[i+1]);\n            }\n         }\n\n         return sprintf(buffer, \"%30s%s\\n\", \"\", comment);\n      }\n      else {\n         return 0;\n      }\n   }\n\n   /* name */\n   name[0] = 0;\n   strncat(name, (const char *)(entry_data+TO_NAME), TO_NAME_LENGTH);\n   clean_string((unsigned char *)name);\n\n   /* extension */\n   ext[0] = 0;\n   strncat(ext, (const char *)(entry_data+TO_EXT), TO_EXT_LENGTH);\n   clean_string((unsigned char *)ext);\n\n   /* file type */\n   ftype = entry_data[TO_FILE_TYPE];\n   ftype = (ftype > 3 ? ftype_sym[4] : ftype_sym[ftype]);\n\n   /* data type */\n   dtype = entry_data[TO_DATA_TYPE];\n   dtype = (dtype == 0 ? dtype_sym[0] : (dtype == 0xFF ? dtype_sym[1] : dtype_sym[2]));\n\n   /* size */\n   size = get_file_size(format, n, trk20_data) * ((TO_BLOCKSIZE(format) + 1024) / 1024);\n\n   /* date */\n   if ((entry_data[TO_DATE_DAY] >= 1) && (entry_data[TO_DATE_DAY] <= 31) &&\n       (entry_data[TO_DATE_MONTH] >= 1) && (entry_data[TO_DATE_MONTH] <= 12) &&\n       (entry_data[TO_DATE_YEAR] <= 99))\n      sprintf(date, \"%2d-%2d-%2d\", entry_data[TO_DATE_DAY], entry_data[TO_DATE_MONTH], entry_data[TO_DATE_YEAR]);\n   else\n      date[0] = 0;\n\n   /* comment */\n   comment[0] = 0;\n   if (entry_data[TO_COMMENT])\n      strncat(comment, (const char *)(entry_data+TO_COMMENT), TO_COMMENT_LENGTH);\n\n   /* display the entry */\n   i = sprintf(buffer, \"%-8s %-3s %c %c %-3d %-8s %s\\n\", name, ext, ftype, dtype, size, date, comment);\n   free(comment);\n\n   return i;\n\n   (void) buffer_size;  /* DJGPP 2.03 lacks snprintf() */\n}\n\n\n\n/* get_filename:\n *  Detects whether the file entry is valid and returns the filename if so.\n */\nstatic int get_filename(char filename[], const unsigned char entry_data[])\n{\n   int i, j;\n\n   if ((entry_data[TO_NAME] == 0) || (entry_data[TO_NAME] == TO_TAG_FREE))\n      return -1;\n\n   /* name */\n   strncpy(filename, (const char *)(entry_data+TO_NAME), TO_NAME_LENGTH);\n\n   for (i=0; i<TO_NAME_LENGTH; i++) {\n      if (filename[i] == 32)\n         break;\n   }\n\n   filename[i++] = '.';\n   filename[i] = 0;\n\n   /* extension */\n   strncat(filename, (const char *)(entry_data+TO_EXT), TO_EXT_LENGTH);\n\n   for (j=0; j<TO_EXT_LENGTH; j++) {\n      if (filename[i+j] == 32)\n         break;\n   }\n\n   if (filename[i+j-1] == '.')\n      filename[i+j-1] = 0;\n   else\n      filename[i+j] = 0;\n\n   return 0;\n}\n\n\n\n/* decode_filename:\n *  Decodes the specified raw filename into a valid dir entry.\n */\nstatic void decode_filename(unsigned char entry_data[], const char filename[], int file_size)\n{\n   const char *p;\n   char shortname[128];\n   char ext[TO_EXT_LENGTH+1];\n   int i, type, len, ext_len = 0;\n   FILE *file;\n\n   /* zero the entry data */\n   memset(entry_data + TO_NAME, 32, TO_NAME_LENGTH + TO_EXT_LENGTH);\n   entry_data[TO_COMMENT] = 0;\n   memset(entry_data + TO_COMMENT+1, 32, TO_COMMENT_LENGTH-1);\n   memset(entry_data + TO_DATE_DAY, 0, TO_DIRENTRY_LENGTH - TO_DATE_DAY);\n\n   /* find short name */\n   len = strlen(filename);\n   p = filename + len - 1;   \n\n   while ((p>=filename) && (*p != '/'))\n      p--;\n\n   shortname[0] = 0;\n   strncat(shortname, p+1, sizeof(shortname) - 1);\n\n   /* find extension */\n   len = strlen(shortname);\n   p = shortname + len - 1;\n\n   while ((p>=shortname) && (*p != '.'))\n      p--;\n\n   if (p < shortname) {  /* no extension? */\n      memcpy(entry_data+TO_NAME, shortname, MIN(TO_NAME_LENGTH, len));\n      type = EXT_TYPE_MAX-1;\n   }\n   else {\n      /* name */\n      memcpy(entry_data+TO_NAME, shortname, MIN(TO_NAME_LENGTH, p - shortname));\n\n      /* extension */\n      ext_len = MIN(TO_EXT_LENGTH, shortname + len - 1 - p);\n      memcpy(entry_data+TO_EXT, p+1, ext_len);\n\n      /* build upper case extension */\n      ext[0] = 0;\n      strncat(ext, p+1, ext_len);\n      for (i=0; i<ext_len; i++)\n         ext[i] = toupper(ext[i]);\n\n      /* search for a standard extension */\n      for (type=0; type<EXT_TYPE_MAX-1; type++) {\n         if (strcmp(ext_type[type].tag, ext) == 0)\n            break;\n      }\n   }\n\n   /* set file and data types */\n   entry_data[TO_FILE_TYPE] = ext_type[type].ftype;\n   entry_data[TO_DATA_TYPE] = ext_type[type].dtype;\n\n   /* special treatment */\n   switch (type) {\n\n      case EXT_TYPE_BAS:\n         /* differentiate ASCII from BINARY data */\n         file = fopen(filename, \"rb\");\n         if (file) {\n            if ((fgetc(file) == '\\r') && (fgetc(file) == '\\n'))\n               entry_data[TO_DATA_TYPE] = DTYPE_ASCII;\n            fclose(file);\n         }\n         break;\n\n      case EXT_TYPE_CHG:\n         /* automatic launch + number of requested banks */\n         entry_data[TO_CHG_MODE] = 0x80 | ((file_size/TO_BANKSIZE)&0x3F);\n\n         /* 8-bit checksum */\n         for (i=0; i<TO_NAME_LENGTH; i++)\n            entry_data[TO_CHG_CHECKSUM] += entry_data[i];\n         break;\n   }\n}\n\n\n\n/* seek_file:\n *  Seeks a file in the specified directory and returns its index number if found.\n */\nstatic int seek_file(int format, const char filename[], const unsigned char dir_data[])\n{\n   char entry_name[TO_NAME_LENGTH + 1 + TO_EXT_LENGTH + 1];\n   int i;\n\n   for (i=0; i<TO_NDIRENTRIES(format); i++) {\n      if ((get_filename(entry_name, dir_data+i*TO_DIRENTRY_LENGTH) == 0) && (strcmp(entry_name, filename) == 0))\n         return i;\n   }\n\n   return -1;\n}\n\n\n\n/* wildcard handling code by Michael Bulkin (M.A.Bukin@inp.nsk.su) */\n#define WCD_MATCH_TRY 0\n#define WCD_MATCH_ONE 1\n#define WCD_MATCH_ANY 2\n\n\nstruct WCD_MATCH_DATA\n{\n   int type;\n   const char *s1;\n   const char *s2;\n};\n\n\n\n/* wcdcmp:\n *  Compares two strings ('*' matches any number of characters,\n *  '?' matches any character).\n */\nstatic int wcdcmp(const char *s1, const char *s2)\n{\n   static unsigned int size = 0;\n   static struct WCD_MATCH_DATA *data = NULL;\n   const char *s1end;\n   int index, c1, c2;\n\n   /* handle NULL arguments */\n   if ((!s1) && (!s2)) {\n      if (data) {\n         free(data);\n         data = NULL;\n      }\n\n      return 1;\n   }\n\n   s1end = s1 + strlen(s1);\n\n   /* allocate larger working area if necessary */\n   if (data && (size < strlen(s2))) {\n      free(data);\n      data = NULL;\n   }\n\n   if (!data) {\n      size = strlen(s2);\n      data = malloc(sizeof(struct WCD_MATCH_DATA) * size * 2 + 1);\n      if (!data)\n         return 1;\n   }\n\n   index = 0;\n   data[0].s1 = s1;\n   data[0].s2 = s2;\n   data[0].type = WCD_MATCH_TRY;\n\n   while (index >= 0) {\n      s1 = data[index].s1;\n      s2 = data[index].s2;\n      c1 = *s1;\n      c2 = *s2;\n\n      switch (data[index].type) {\n\n      case WCD_MATCH_TRY:\n         if (c2 == 0) {\n            /* pattern exhausted */\n            if (c1 == 0)\n               return 0;\n            else\n               index--;\n         }\n         else if (c1 == 0) {\n            /* string exhausted */\n            while (*s2 == '*')\n               s2++;\n            if (*s2 == 0)\n               return 0;\n            else\n               index--;\n         }\n         else if (c2 == '*') {\n            /* try to match the rest of pattern with empty string */\n            data[index++].type = WCD_MATCH_ANY;\n            data[index].s1 = s1end;\n            data[index].s2 = s2 + 1;\n            data[index].type = WCD_MATCH_TRY;\n         }\n         else if ((c2 == '?') || (c1 == c2)) {\n            /* try to match the rest */\n            data[index++].type = WCD_MATCH_ONE;\n            data[index].s1 = s1 + 1;\n            data[index].s2 = s2 + 1;\n            data[index].type = WCD_MATCH_TRY;\n         }\n         else\n            index--;\n         break;\n\n      case WCD_MATCH_ONE:\n         /* the rest of string did not match, try earlier */\n         index--;\n         break;\n\n      case WCD_MATCH_ANY:\n         /* rest of string did not match, try add more chars to string tail */\n         if (--data[index + 1].s1 >= s1) {\n            data[index + 1].type = WCD_MATCH_TRY;\n            index++;\n         }\n         else\n            index--;\n         break;\n\n      default:\n         /* this is a bird? This is a plane? No it's a bug!!! */\n         return 1;\n      }\n   }\n\n   return 1;\n}\n\n\n\n/* seek_wilcard:\n *  Seeks a wildcard in the specified directory and returns its index number if found.\n */\nstatic int seek_wildcard(int format, char filename[], const char pattern[], const unsigned char dir_data[])\n{\n   char entry_name[TO_NAME_LENGTH + 1 + TO_EXT_LENGTH + 1];\n   static int i = 0;\n   int j;\n\n   while (i<TO_NDIRENTRIES(format)) {\n      j = i++;\n\n      if ((get_filename(entry_name, dir_data+j*TO_DIRENTRY_LENGTH) == 0) && (wcdcmp(entry_name, pattern) == 0)) {\n         strcpy(filename, entry_name);\n         return j;\n      }\n   }\n\n   i = 0;\n\n   /* to avoid leaking memory */\n   wcdcmp(NULL, NULL);\n\n   return -1;\n}\n\n\n\n/* find_free_block_sym:\n *  Finds a free block using a symmetrical search.\n */\nstatic int find_free_block_sym(int format, unsigned char fat_data[])\n{\n   int block;\n\n   block = TO_NBLOCKS(format)/2 - 1;\n\n   while (block < TO_NBLOCKS(format)) {\n      if (fat_data[block] == TO_TAG_FREE)\n         return block;\n\n      if (fat_data[TO_NBLOCKS(format) - block - 2] == TO_TAG_FREE)  /* fat_data[-1] is always 0 */\n         return TO_NBLOCKS(format) - block - 2;\n\n      block++;\n   }\n\n   return -1;\n}\n\n\n\n/* find_free_block_rel:\n *  Finds a free block using a relative search.\n */\nstatic int find_free_block_rel(int format, int block, unsigned char fat_data[])\n{\n   if (block < TO_NBLOCKS(format)/2) {\n      while (block >= 0) {\n         if (fat_data[block] == TO_TAG_FREE)\n            break;\n\n         block--;\n      }\n   }\n   else {\n      while (block < TO_NBLOCKS(format)) {\n         if (fat_data[block] == TO_TAG_FREE)\n            break;\n\n         block++;\n      }\n   }\n\n   if ((block<0) || (block>=TO_NBLOCKS(format)))\n      block = find_free_block_sym(format, fat_data);\n\n   return block;\n}\n\n\n\n/* do_add_file:\n *  Performs the low-level add operation for the specified file entry.\n */\nstatic void do_add_file(sapID id, FILE *file, int file_size, unsigned char entry_data[], int n, unsigned char trk20_data[])\n{\n   sapsector_t sapsector;\n   unsigned char *fat_data;\n   unsigned int block, next_block;\n   int sect;\n   size_t unused_size_t;\n\n   /* find the first block */\n   fat_data = trk20_data + TO_FAT_START(ID_FORMAT(id));\n\n   block = find_free_block_sym(ID_FORMAT(id), fat_data);\n   entry_data[TO_FIRST_BLOCK] = block;\n\n   sapsector.format = 0;\n   sapsector.protection = 0;\n\n   /* write full blocks */\n   while (file_size > TO_BLOCKSIZE(ID_FORMAT(id))) {\n      sapsector.track =  block/2;\n      sapsector.sector = 1 + (block%2 ? TO_SECTOR_PER_BLOCK : 0);\n      seek_pos(id, sapsector.track, sapsector.sector);\n\n      for (sect=0; sect<TO_SECTOR_PER_BLOCK; sect++) {\n         unused_size_t=fread(sapsector.data, sizeof(char), TO_SECTSIZE(ID_FORMAT(id)), file);\n         do_write_sector(id, &sapsector);\n         sapsector.sector++;\n      }\n\n      fat_data[block] = TO_TAG_RESERVED;  /* temporarily reserved */\n      next_block = find_free_block_rel(ID_FORMAT(id), block, fat_data);\n\n      fat_data[block] = next_block;\n      block = next_block;\n\n      file_size -= TO_BLOCKSIZE(ID_FORMAT(id));\n   }\n\n   /* write remaining full sectors */\n   sapsector.track = block/2;\n   sapsector.sector = 1 + (block%2 ? TO_SECTOR_PER_BLOCK : 0);\n   seek_pos(id, sapsector.track, sapsector.sector);\n\n   fat_data[block] = TO_END_BLOCK_OFFSET + 1;\n\n   while (file_size > TO_SECTSIZE(ID_FORMAT(id))) {\n      unused_size_t=fread(sapsector.data, sizeof(char), TO_SECTSIZE(ID_FORMAT(id)), file);\n      do_write_sector(id, &sapsector);\n      sapsector.sector++;\n\n      fat_data[block]++;\n      file_size -= TO_SECTSIZE(ID_FORMAT(id));\n   }\n\n   /* write remaining individual bytes */\n   unused_size_t=fread(sapsector.data, sizeof(char), TO_SECTSIZE(ID_FORMAT(id)), file);\n   do_write_sector(id, &sapsector);\n\n   entry_data[TO_END_SIZE] = file_size>>8;\n   entry_data[TO_END_SIZE+1] = file_size;\n\n   /* write the new entry into the directory */\n   memcpy(trk20_data + TO_DIR_START(ID_FORMAT(id)) + n*TO_DIRENTRY_LENGTH, entry_data, TO_DIRENTRY_LENGTH);\n   (void)unused_size_t;\n}\n\n\n\n/* do_delete_file:\n *  Performs the low-level delete operation for the specified file entry and\n *  returns the size of file.\n */\nstatic int do_delete_file(sapID id, const char filename[], int n, unsigned char trk20_data[])\n{\n   unsigned char *fat_data, *entry_data;\n   int block, old_block, size = 0;\n\n   (void) filename;\n\n   fat_data = trk20_data + TO_FAT_START(ID_FORMAT(id));\n   entry_data = trk20_data + TO_DIR_START(ID_FORMAT(id)) + n*TO_DIRENTRY_LENGTH;\n\n   /* delete the file entry */\n   entry_data[TO_NAME] = 0;\n\n   /* read start block */\n   block = entry_data[TO_FIRST_BLOCK];\n\n   /* mark FAT entries with the TO_TAG_FREE tag */\n   while ((block<TO_NBLOCKS(ID_FORMAT(id))) && (size<TO_FILESIZE_MAX(ID_FORMAT(id)))) {\n      old_block = block;\n      block = fat_data[block];\n      fat_data[old_block] = TO_TAG_FREE;\n      size++;\n   }\n\n   size *= TO_BLOCKSIZE(ID_FORMAT(id));\n\n   if (block > TO_END_BLOCK_OFFSET+1)\n      size += (block - TO_END_BLOCK_OFFSET - 1) * TO_SECTSIZE(ID_FORMAT(id));\n\n   size += (entry_data[TO_END_SIZE]<<8) + entry_data[TO_END_SIZE+1];\n\n   return size;\n}\n\n\n\n/* do_extract_file:\n *  Performs the low-level extract operation for the specified file entry and\n *  returns the size of file.\n */\nstatic int do_extract_file(sapID id, const char filename[], int n, unsigned char trk20_data[])\n{\n   sapsector_t sapsector;\n   unsigned char *fat_data, *entry_data;\n   int sect, end_size, size = 0;\n   unsigned int block;\n   FILE *file;\n\n   fat_data = trk20_data + TO_FAT_START(ID_FORMAT(id));\n   entry_data = trk20_data + TO_DIR_START(ID_FORMAT(id)) + n*TO_DIRENTRY_LENGTH;\n\n   /* read start block */\n   block = entry_data[TO_FIRST_BLOCK];\n\n   if ((file=fopen(filename, \"wb\")) == NULL) {\n      sap_errno = SAP_EPERM;\n      return 0;\n   }\n\n   /* extract full blocks */\n   while ((fat_data[block]<TO_NBLOCKS(ID_FORMAT(id))) && (size<TO_FILESIZE_MAX(ID_FORMAT(id)))) {\n      seek_pos(id, block/2, 1 + (block%2 ? TO_SECTOR_PER_BLOCK : 0));\n\n      for (sect=0; sect<TO_SECTOR_PER_BLOCK; sect++) {\n         do_read_sector(id, &sapsector);\n         fwrite(sapsector.data, sizeof(char), TO_SECTSIZE(ID_FORMAT(id)), file);\n      }\n\n      block = fat_data[block];\n      size++;\n   }\n\n   size *= TO_BLOCKSIZE(ID_FORMAT(id));\n\n   /* extract remaining full sectors */\n   seek_pos(id, block/2, 1 + (block%2 ? TO_SECTOR_PER_BLOCK : 0));\n\n   for (sect=0; sect<(fat_data[block] - TO_END_BLOCK_OFFSET - 1); sect++) {\n      do_read_sector(id, &sapsector);\n      fwrite(sapsector.data, sizeof(char), TO_SECTSIZE(ID_FORMAT(id)), file);\n      size += TO_SECTSIZE(ID_FORMAT(id));\n   }\n\n   /* extract remaining individual bytes */\n   do_read_sector(id, &sapsector);\n   end_size = (entry_data[TO_END_SIZE]<<8) + entry_data[TO_END_SIZE+1];\n   fwrite(sapsector.data, sizeof(char), end_size, file);\n   size += end_size;\n\n   fclose(file);\n\n   return size;\n}\n\n\n\n/************************************************/\n/***       public low-level functions         ***/\n/************************************************/\n\n\n/* _ExtractDir:\n *  Extract the directory from track 20 and returns the number of lines.\n */\nint _ExtractDir(char buffer[], int buffer_size, int drive, int density, const unsigned char trk20_data[])\n{\n   unsigned char disk_name[TO_NAME_LENGTH+1];\n   int dskf, i, len, pos, lines = 0;\n   int format = (density == 1 ? SAP_FORMAT2 : SAP_FORMAT1);\n\n   /* name of the volume */\n   strncpy((char *)disk_name, (const char *)trk20_data, TO_NAME_LENGTH);\n\n   if ((disk_name[0] == 0) || (disk_name[0] == TO_TAG_FREE)) {\n      strcpy((char *)disk_name, \"No Name \");\n   }\n   else {\n      disk_name[TO_NAME_LENGTH] = 0;\n      clean_string(disk_name);\n   }\n\n   /* dskf */\n   dskf = get_dskf(format, trk20_data) * ((TO_BLOCKSIZE(format) + 1024) / 1024);\n\n   /* header */\n   pos = sprintf(buffer, \"%s density   %d:%s DSKF = %d\\n\", (density == 1 ? \"Single\" : \"Double\"), drive, disk_name, dskf);\n   lines++;\n\n   /* directory entries */\n   for (i=0; i<TO_NDIRENTRIES(format); i++) {\n      len = extract_dir_entry(format, buffer+pos, buffer_size-pos, i, trk20_data);\n\n      if (len>0) {\n         pos += len;\n         lines++;\n      }\n   }\n\n   return lines;\n}\n\n\n\n/* _ForEachFile:\n *  Executes the specified callback funtion on each file matching the pattern.\n */\nint _ForEachFile(sapID id, const char pattern[], sapfilecb_t callback, int save_back)\n{\n   char filename[TO_NAME_LENGTH + 1 + TO_EXT_LENGTH + 1];\n   unsigned char trk20_data[SAP_TRACKSIZE1], *dir_data;\n   int n, ret = 0;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return 0;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return 0;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return 0;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   /* read track 20 */\n   sap_ReadSectorEx(id, 20, 1, SAP_NSECTS, trk20_data);\n\n   dir_data = trk20_data + TO_DIR_START(ID_FORMAT(id));\n\n   if (strpbrk(pattern, \"?*\")) {  /* wildcards? */\n      while ((n=seek_wildcard(ID_FORMAT(id), filename, pattern, dir_data)) >= 0)\n         ret += callback(id, filename, n, trk20_data);\n   }\n   else {\n      n = seek_file(ID_FORMAT(id), pattern, dir_data);\n\n      if (n<0)\n         sap_errno = SAP_ENOENT;\n      else\n         ret = callback(id, pattern, n, trk20_data);\n   }\n\n   if (save_back) {\n      /* save track 20 */\n      sap_WriteSectorEx(id, 20, 1, SAP_NSECTS, trk20_data);\n   }\n\n   return ret;\n}\n\n\n\n/************************************************/\n/***  API functions: physical format support  ***/\n/************************************************/\n\n\n/* OpenArchive:\n *  Opens an existing archive,\n *  returns the sapID on success or SAP_ERROR on error.\n */\nsapID sap_OpenArchive(const char filename[], int *format)\n{\n   char header[SAP_HEADER_SIZE];\n   sapID id;\n   size_t unused_size_t;\n\n   /* seek for an empty id */\n   if (!(id=get_id())) {\n      sap_errno = SAP_ETOOMANY;\n      return SAP_ERROR;\n   }\n\n   if ((ID_FILE(id)=fopen(filename, \"rb+\")) == NULL) {\n      sap_errno = SAP_ENOENT;\n      return SAP_ERROR;\n   }\n\n   /* read the header */ \n   unused_size_t=fread(header, sizeof(char), SAP_HEADER_SIZE, ID_FILE(id));\n\n   /* find the format */\n   if ((header[0] != SAP_FORMAT1) && (header[0] != SAP_FORMAT2)) {\n      fclose(ID_FILE(id));\n      sap_errno = SAP_EBADF;\n      return SAP_ERROR;\n   }\n\n   *format = header[0];\n   \n   /* check the header */\n   header[0] = 0;\n\n   if (strncmp(header, sap_header, SAP_HEADER_SIZE) != 0) {\n      fclose(ID_FILE(id));\n      sap_errno = SAP_EBADF;\n      return SAP_ERROR;\n   }\n\n   ID_FORMAT(id) = *format;\n   ID_STATE(id) = FULL_ARCHIVE;\n   ID_NTRACKS(id) = SAP_NTRACKS(*format);\n\n   return id;\n   (void)unused_size_t;\n}\n\n\n\n/* CreateArchive:\n *  Creates an archive skeleton and writes the header,\n *  returns the sapID on success or SAP_ERROR on error.\n */\nsapID sap_CreateArchive(const char filename[], int format)\n{\n   char header[SAP_HEADER_SIZE];\n   sapID id;\n\n   if ((format != SAP_FORMAT1) && (format != SAP_FORMAT2)) {\n      sap_errno = SAP_EINVAL;\n      return SAP_ERROR;\n   }\n\n   /* seek for an empty id */\n   if (!(id=get_id())) {\n      sap_errno = SAP_ETOOMANY;\n      return SAP_ERROR;\n   }\n\n   if ((ID_FILE(id)=fopen(filename, \"wb\")) == NULL) {\n      sap_errno = SAP_EPERM;\n      return SAP_ERROR;\n   }\n\n   /* write the header */\n   memcpy(header, sap_header, SAP_HEADER_SIZE);\n   header[0] = format;\n\n   fwrite(header, sizeof(char), SAP_HEADER_SIZE, ID_FILE(id));\n\n   ID_FILE(id) = freopen(filename, \"rb+\", ID_FILE(id));\n   seek_pos(id, 0 ,1);\n\n   ID_FORMAT(id) = format;\n   ID_STATE(id) = EMPTY_ARCHIVE;\n   ID_NTRACKS(id) = 0;\n\n   return id;\n}\n\n\n\n/* CloseArchive:\n *  Closes the archive, filling it up with empty tracks if needed,\n *  returns SAP_OK on success or SAP_ERROR on error.\n */\nint sap_CloseArchive(sapID id)\n{\n   sapsector_t sapsector;\n   int format = ID_FORMAT(id);\n   int track, sect;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return SAP_ERROR;\n\n      case EMPTY_ARCHIVE:\n      case FILLED_ARCHIVE:\n         sapsector.format = 0;\n         sapsector.protection = 0;\n         memset(sapsector.data, TO_FILLER_BYTE, SAP_SECTSIZE(format));\n\n         for (track=ID_NTRACKS(id); track<SAP_NTRACKS(format); track++) {\n            for (sect=1; sect<=SAP_NSECTS; sect++) {\n               sapsector.track = track;\n               sapsector.sector = sect;\n               do_write_sector(id, &sapsector);\n            }\n         }\n         break;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   fclose(ID_FILE(id));\n   ID_STATE(id) = NO_ARCHIVE;\n\n   return SAP_OK;\n}\n\n\n\n/* FillArchive:\n *  Fills an empty archive sector by sector, it's up to\n *  the user to call it the right number of times,\n *  returns SAP_OK on success or SAP_ERROR on error.\n */\nint sap_FillArchive(sapID id, sapsector_t *sapsector)\n{\n   static int sect;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return SAP_ERROR;\n\n      case EMPTY_ARCHIVE:\n         ID_STATE(id) = FILLED_ARCHIVE;\n         sect = 1;\n         /* no break */\n#if defined(__GNUC__) && (__GNUC__ >= 7)\n         __attribute__ ((fallthrough));\n#endif\n\n      case FILLED_ARCHIVE:\n         do_write_sector(id, sapsector);\n\n         if (++sect == SAP_NSECTS+1) {\n            sect = 1;\n\n            if (++ID_NTRACKS(id) == SAP_NTRACKS(ID_FORMAT(id)))\n               ID_STATE(id) = FULL_ARCHIVE;\n         }\n         break;\n\n      case FULL_ARCHIVE:\n         sap_errno = SAP_ENOSPC;\n         return SAP_ERROR;\n   } /* end of switch */\n\n   return SAP_OK;\n}\n\n\n\n/* ReadSector:\n *  Reads the specified sector and returns SAP_OK or a flagged code:\n *    SAP_NO_STD_FMT: non standard format\n *    SAP_PROTECTED : protected sector\n *    SAP_BAD_SECTOR: bad sector identifiers\n *    SAP_CRC_ERROR : CRC error\n */\nint sap_ReadSector(sapID id, int track, int sect, sapsector_t *sapsector)\n{\n   int flag = SAP_OK;\n   int format = ID_FORMAT(id);\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return SAP_ERROR;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EEMPTY;\n         return SAP_ERROR;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return SAP_ERROR;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   seek_pos(id, track, sect);\n   do_read_sector(id, sapsector);\n\n   if (sapsector->format != 0)\n      flag |= SAP_NO_STD_FMT;\n\n   if (sapsector->protection != 0)\n      flag |= SAP_PROTECTED;\n\n   if ((sapsector->track != track) || (sapsector->sector != sect))\n      flag |= SAP_BAD_SECTOR;\n\n   do_crc(sapsector, format);\n\n   if ((sapsector->data[SAP_SECTSIZE(format)] != ((crcpuk_temp>>8)&0xff))\n        || (sapsector->data[SAP_SECTSIZE(format)] != (crcpuk_temp&0xff)))\n      flag |= SAP_CRC_ERROR;\n\n   return flag;\n}\n\n\n\n/* ReadSectorEx:\n *  Reads one or more sectors from the same track,\n *  returns SAP_OK on success or SAP_ERROR on error.\n */\nint sap_ReadSectorEx(sapID id, int track, int sect, int nsects, unsigned char data[])\n{\n   sapsector_t sapsector;\n   int format = ID_FORMAT(id);\n   int i;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return SAP_ERROR;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EEMPTY;\n         return SAP_ERROR;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return SAP_ERROR;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   seek_pos(id, track, sect);\n\n   for (i=0; i<nsects; i++) {\n      do_read_sector(id, &sapsector);\n      memcpy(data + i*SAP_SECTSIZE(format), sapsector.data, SAP_SECTSIZE(format));\n   }\n\n   return SAP_OK;\n}\n\n\n\n/* WriteSector:\n *  Writes the specified sector and\n *  returns SAP_OK on success or SAP_ERROR on error.\n */\nint sap_WriteSector(sapID id, int track, int sect, sapsector_t *sapsector)\n{\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return SAP_ERROR;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EEMPTY;\n         return SAP_ERROR;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return SAP_ERROR;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   seek_pos(id, track, sect);\n   do_write_sector(id, sapsector);\n\n   return SAP_OK;\n}\n\n\n\n/* WriteSectorEx:\n *  Writes one or more sectors into the same track,\n *  returns SAP_OK on success or SAP_ERROR on error.\n */\nint sap_WriteSectorEx(sapID id, int track, int sect, int nsects, const unsigned char data[])\n{\n   sapsector_t sapsector;\n   int format = ID_FORMAT(id);\n   int i;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return SAP_ERROR;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EEMPTY;\n         return SAP_ERROR;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return SAP_ERROR;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   seek_pos(id, track, sect);\n\n   sapsector.format = 0;\n   sapsector.protection = 0;\n   sapsector.track = track;\n\n   for (i=0; i<nsects; i++) {\n      memcpy(sapsector.data, data + i*SAP_SECTSIZE(format), SAP_SECTSIZE(format));\n      sapsector.sector = sect + i;\n      do_write_sector(id, &sapsector);\n   }\n\n   return SAP_OK;\n}\n\n\n\n/************************************************/\n/***  API functions: logical format support   ***/\n/************************************************/\n\n\n/* FormatArchive:\n *  Formats an archive using the Thomson BASIC DOS format,\n *  returns SAP_OK on success or SAP_ERROR on error.\n */\nint sap_FormatArchive(sapID id, int capacity)\n{\n   int format = ID_FORMAT(id);\n   int track, sect;\n\n   sapsector_t sapsector;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return SAP_ERROR;\n\n      case EMPTY_ARCHIVE:\n         break;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return SAP_ERROR;\n\n      case FULL_ARCHIVE:\n         seek_pos(id, 0, 1);\n         break;\n   }\n\n   if (!(capacity == SAP_TRK40) && !(capacity == SAP_TRK80)) {\n      sap_errno = SAP_EINVAL;\n      return SAP_ERROR;\n   }\n\n   sapsector.format = 0;\n   sapsector.protection = 0;\n   memset(sapsector.data, TO_FILLER_BYTE, SAP_SECTSIZE(format));\n\n   for (track=0; track<SAP_NTRACKS(format); track++) {\n      for (sect=1; sect<SAP_NSECTS+1; sect++) {\n         sapsector.track = track;\n         sapsector.sector = sect;\n         do_write_sector(id, &sapsector);\n      }\n   }\n\n   /* write track 20 */\n   sapsector.track = 20;\n   memset(sapsector.data, TO_TAG_FREE, SAP_SECTSIZE(format));\n   seek_pos(id, 20, 1);\n\n   for (sect=1; sect<SAP_NSECTS+1; sect++) {\n      sapsector.sector = sect;\n      do_write_sector(id, &sapsector);\n   }\n\n   /* FAT */\n   sapsector.track = 20;\n   sapsector.sector = 2;\n   memset(sapsector.data, TO_TAG_RESERVED, SAP_SECTSIZE(format));\n\n   /* first byte */\n   sapsector.data[0] = 0;\n\n   /* lower zone */\n   memset(sapsector.data + 1, TO_TAG_FREE, 40);\n\n   /* upper zone */\n   if (capacity == SAP_TRK80)  /* not (format == SAP_FORMAT1) */\n      memset(sapsector.data + 43, TO_TAG_FREE, TO_NBLOCKS1 - 43 + 1);\n   else\n      memset(sapsector.data + 43, TO_TAG_FREE, TO_NBLOCKS2 - 43 + 1);\n\n   seek_pos(id, 20, 2);\n   do_write_sector(id, &sapsector);\n\n   ID_STATE(id) = FULL_ARCHIVE;\n   ID_NTRACKS(id) = SAP_NTRACKS(format);\n\n   return SAP_OK;\n}\n\n\n\n/* ListArchive:\n *  Builds a list of files contained in the archive,\n *  returns the number of lines on success or 0 on error.\n */\nint sap_ListArchive(sapID id, char buffer[], int buffer_size)\n{\n   unsigned char trk20_data[SAP_TRACKSIZE1];\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return 0;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EEMPTY;\n         return 0;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return 0;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   /* read track 20 */\n   sap_ReadSectorEx(id, 20, 1, SAP_NSECTS, trk20_data);\n\n   return _ExtractDir(buffer, buffer_size, 0, ID_FORMAT(id) == SAP_FORMAT1 ? 2 : 1, trk20_data);\n}\n\n\n\n/* AddFile:\n *  Adds the specified file to the archive,\n *  returns the size of the file in bytes on success or 0 on error.\n */\nint sap_AddFile(sapID id, const char filename[])\n{\n   unsigned char entry_data[TO_DIRENTRY_LENGTH];\n   unsigned char trk20_data[SAP_TRACKSIZE1], *fat_data, *dir_data;\n   int free_n=-1, prev_n=-1;\n   int i, dskf, file_size = 0;\n   FILE *file;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return 0;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return 0;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return 0;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   /* open the file */\n   if ((file=fopen(filename, \"rb\")) == NULL) {\n      sap_errno = SAP_ENOENT;\n      return 0;\n   }\n\n   /* find size of the file */\n   while (fgetc(file) != EOF)\n      file_size++;\n\n   if (file_size == 0) {\n      fclose(file);\n      sap_errno = SAP_ENFILE;\n      return 0;\n   }\n\n   fseek(file, 0, SEEK_SET);\n\n   /* decode the filename */\n   decode_filename(entry_data, filename, file_size);\n\n   /* read track 20 */\n   sap_ReadSectorEx(id, 20, 1, SAP_NSECTS, trk20_data);\n\n   fat_data = trk20_data + TO_FAT_START(ID_FORMAT(id));\n   dir_data = trk20_data + TO_DIR_START(ID_FORMAT(id));\n\n   /* simultaneously seek already free entry and previous entry */\n   for (i=0; i<TO_NDIRENTRIES(ID_FORMAT(id)); i++) {\n      if ((dir_data[i*TO_DIRENTRY_LENGTH] == 0) || (dir_data[i*TO_DIRENTRY_LENGTH] == TO_TAG_FREE)) {\n         if (free_n<0)\n            free_n = i;\n      }\n      else {\n         if (strncmp((const char *)(dir_data+i*TO_DIRENTRY_LENGTH), (const char *)entry_data, TO_NAME_LENGTH + TO_EXT_LENGTH) == 0) {\n            prev_n = i;\n            break;\n         }\n      }\n   }\n\n   if ((free_n<0) && (prev_n<0)) {\n      fclose(file);\n      sap_errno = SAP_ENOSPC;\n      return 0;\n   }\n\n   /* test for enough free disk space */\n   dskf = get_dskf(ID_FORMAT(id), trk20_data);\n\n   if (prev_n >=0)\n      dskf += get_file_size(ID_FORMAT(id), prev_n, trk20_data);\n\n   if ((dskf*TO_BLOCKSIZE(ID_FORMAT(id))) < file_size) {\n      sap_errno = SAP_EFBIG;\n      fclose(file);\n      return 0;\n   }\n\n   /* delete previous entry */\n   if (prev_n >= 0) {\n      do_delete_file(id, filename, prev_n, trk20_data);\n      free_n = prev_n;\n   }\n\n   /* phew! we can finally add the file... */\n   do_add_file(id, file, file_size, entry_data, free_n, trk20_data);\n\n   /* update directory and FAT */\n   sap_WriteSectorEx(id, 20, 1, SAP_NSECTS, trk20_data);\n\n   fclose(file);\n\n   return file_size;\n   (void)fat_data;\n}\n\n\n\n/* DeleteFile:\n *  Deletes the specified files from the archive,\n *  returns the total size of the files in bytes on success or 0 on error.\n */\nint sap_DeleteFile(sapID id, const char pattern[])\n{\n   return _ForEachFile(id, pattern, do_delete_file, 1);\n}\n\n\n\n/* ExtractFile:\n *  Extracts the specified files from the archive,\n *  returns the total size of the files in bytes on success or 0 on error.\n */\nint sap_ExtractFile(sapID id, const char pattern[])\n{\n   return _ForEachFile(id, pattern, do_extract_file, 0);\n}\n\n\n\n/* GetFileInfo:\n *  Fills in a structure with the info for the specified file\n *  returns SAP_OK on success or SAP_ERROR on error.\n */\nint sap_GetFileInfo(sapID id, const char filename[], sapfileinfo_t *info)\n{\n   unsigned char trk20_data[SAP_TRACKSIZE1], *dir_data, *fat_data, *entry_data;\n   struct tm tim;\n   int n, block, i=0;\n\n   switch (ID_STATE(id)) {\n\n      case NO_ARCHIVE:\n         sap_errno = SAP_EINVAL;\n         return 0;\n\n      case EMPTY_ARCHIVE:\n         sap_errno = SAP_EEMPTY;\n         return 0;\n\n      case FILLED_ARCHIVE:\n         sap_errno = SAP_EBUSY;\n         return 0;\n\n      case FULL_ARCHIVE:\n         break;\n   }\n\n   /* read track 20 */\n   sap_ReadSectorEx(id, 20, 1, SAP_NSECTS, trk20_data);\n\n   dir_data = trk20_data + TO_DIR_START(ID_FORMAT(id));\n\n   n = seek_file(ID_FORMAT(id), filename, dir_data);\n\n   if (n<0) {\n      sap_errno = SAP_ENOENT;\n      return SAP_ERROR;\n   }\n\n   fat_data = trk20_data + TO_FAT_START(ID_FORMAT(id));\n   entry_data = trk20_data + TO_DIR_START(ID_FORMAT(id)) + n*TO_DIRENTRY_LENGTH;\n\n   /* block chain */\n   info->nblocks = get_file_size(ID_FORMAT(id), n, trk20_data);\n   info->block = malloc(info->nblocks*sizeof(int));\n\n   block = entry_data[TO_FIRST_BLOCK];\n\n   while ((block<TO_NBLOCKS(ID_FORMAT(id))) && (i<TO_FILESIZE_MAX(ID_FORMAT(id)))) {\n      info->block[i++] = block;\n      block = fat_data[block];\n   }\n\n   /* common attributes */\n   info->size = info->nblocks*TO_BLOCKSIZE(ID_FORMAT(id)) + entry_data[TO_END_SIZE];\n   info->file_type = entry_data[TO_FILE_TYPE];\n   info->data_type = entry_data[TO_DATA_TYPE];\n\n   /* date */\n   if ((entry_data[TO_DATE_DAY] >= 1) && (entry_data[TO_DATE_DAY] <= 31) &&\n       (entry_data[TO_DATE_MONTH] >= 1) && (entry_data[TO_DATE_MONTH] <= 12) &&\n       (entry_data[TO_DATE_YEAR] <= 99)) {\n      memset(&tim, 0, sizeof(struct tm));\n      tim.tm_mday = entry_data[TO_DATE_DAY];\n      tim.tm_mon = entry_data[TO_DATE_MONTH];\n      tim.tm_year = entry_data[TO_DATE_YEAR];\n      info->date = mktime(&tim);\n   }\n   else {\n      info->date = 0;\n   }\n\n   /* comment */\n   info->comment[0] = '\\0';\n   if (entry_data[TO_COMMENT])\n      strncat(info->comment, (const char *)(entry_data+TO_COMMENT), TO_COMMENT_LENGTH);\n\n   return SAP_OK;\n   (void)fat_data;\n}\n\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/libsap.h",
    "content": "/*  LibSAP\n *  Version 0.9.3\n *  Copyright (C) 2000-2003 Eric Botcazou\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n\n#ifndef LIBSAP_H\n#define LIBSAP_H\n\n#include <stdio.h>\n#include <time.h>\n\n\n/* constants for the SAP physical file formats */\n#define SAP_NSECTS      16\n\n#define SAP_NTRACKS1    80\n#define SAP_SECTSIZE1   256\n#define SAP_TRACKSIZE1  (SAP_NSECTS*SAP_SECTSIZE1)\n\n#define SAP_NTRACKS2    40\n#define SAP_SECTSIZE2   128\n#define SAP_TRACKSIZE2  (SAP_NSECTS*SAP_SECTSIZE2)\n\n\n/* types used by the library */\ntypedef unsigned int sapID;\n\ntypedef struct {\n   unsigned char format;\n   unsigned char protection;\n   unsigned char track;\n   unsigned char sector;\n   unsigned char data[258];\n} sapsector_t;  /* type of a SAP sector */\n\ntypedef struct {\n   int size;\n   int file_type;\n   int data_type;\n   time_t date;\n   char comment[9];\n   int nblocks;\n   int *block;\n} sapfileinfo_t;\n\ntypedef int (*sapfilecb_t)(sapID id, const char filename[], int n, unsigned char trk20_data[]);\n\n\n/* return values */\n#define SAP_OK          0\n#define SAP_NO_STD_FMT  (1<<0)\n#define SAP_PROTECTED   (1<<1)\n#define SAP_BAD_SECTOR  (1<<2)\n#define SAP_CRC_ERROR   (1<<3)\n#define SAP_ERROR       (1<<7)\n\n\n/* errno values */\nextern int sap_errno;\n\n#define SAP_EBADF     1\n#define SAP_EBUSY     2\n#define SAP_EEMPTY    3\n#define SAP_EFBIG     4\n#define SAP_EINVAL    5\n#define SAP_ENFILE    6\n#define SAP_ENOENT    7\n#define SAP_ENOSPC    8\n#define SAP_EPERM     9\n#define SAP_ETOOMANY  10\n\n\n/* low-level functions */\nextern int _ExtractDir(char buffer[], int buffer_size, int drive, int density, const unsigned char trk20_data[]);\nextern int _ForEachFile(sapID id, const char pattern[], sapfilecb_t callback, int save_back);\n\n\n/* physical format API functions */\n#define SAP_FORMAT1  1\n#define SAP_FORMAT2  2\n\nextern sapID sap_OpenArchive(const char filename[], int *format);\nextern sapID sap_CreateArchive(const char filename[], int format);\nextern int   sap_CloseArchive(sapID id);\nextern int   sap_FillArchive(sapID id, sapsector_t *sector);\nextern int   sap_ReadSector(sapID id, int track, int sect, sapsector_t *sector);\nextern int   sap_ReadSectorEx(sapID id, int track, int sect, int nsects, unsigned char data[]);\nextern int   sap_WriteSector(sapID id, int track, int sect, sapsector_t *sector);\nextern int   sap_WriteSectorEx(sapID id, int track, int sect, int nsects, const unsigned char data[]);\n\n\n/* logical format API functions */\n#define SAP_TRK40   1\n#define SAP_TRK80   2\n\nextern int   sap_FormatArchive(sapID id, int capacity);\nextern int   sap_ListArchive(sapID id, char buffer[], int buffer_size);\nextern int   sap_AddFile(sapID id, const char filename[]);\nextern int   sap_DeleteFile(sapID id, const char pattern[]);\nextern int   sap_ExtractFile(sapID id, const char pattern[]);\nextern int   sap_GetFileInfo(sapID id, const char filename[], sapfileinfo_t *info);\n\n#endif\n\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/licence.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) 19yy  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) 19yy name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/makefile",
    "content": "#\r\n#  Makefile for building sap2 and sapfs.\r\n#\r\n#  Available options:\r\n#\r\n#     Environment variables:\r\n#        FRENCH=1          (by default) create a french build (djgpp only).\r\n#        ENGLISH=1         create an english build (djgpp only).\r\n#\r\n#     Targets: \r\n#        all:              build executables files\r\n#        clean:            remove objects and executable files.\r\n#\r\n\r\nifdef DJDIR\r\n\r\ninclude makefile.dj\r\n\r\nelse\r\n\r\ninclude makefile.lnx\r\n\r\nendif\r\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/makefile.dj",
    "content": "##########################################################################\n# targets:                                                               #\n#  all (default) : build sap2 and sapfs                                  #\n#  clean         : delete all rebuildable files                          #\n########################################################################## \n\n\n################\n# object files #\n################ \n\nOBJ_DIR =\nOBJ_SAP = $(OBJ_DIR)sap2.o $(OBJ_DIR)libsap.o $(OBJ_DIR)dfloppy.o\nOBJ_SAPFS = $(OBJ_DIR)sapfs.o $(OBJ_DIR)libsap.o\n\n\n##################\n# compiler flags #\n##################\n\nCC = gcc\n\nWFLAGS = \n#-Wall -W -Werror\n\nDFLAGS = -g\n\nOFLAGS = -fsigned-char -O2 -fomit-frame-pointer\n\nifdef DEBUGMODE\n   CFLAGS = $(WFLAGS) $(DFLAGS)\nelse\n   CFLAGS = $(WFLAGS) $(OFLAGS)\nendif\n\nifdef ENGLISH\n    CFLAGS += -DENGLISH_LANGUAGE\nelse\n    CFLAGS += -DFRENCH_LANGUAGE\nendif\n\n\n################\n# target rules #\n################\n\n.PHONY: all install clean\n\nall: sap2.exe sapfs.exe\n\nclean:\n\tif exist sap2.exe del sap2.exe\n\tif exist sapfs.exe del sapfs.exe\n\tdel $(OBJ_DIR)*.o\n\nsap2.exe: $(OBJ_SAP)\nifdef DEBUGMODE\n\t$(CC) -o sap2.exe -w $(OBJ_SAP)\nelse\n\t$(CC) -s -o sap2.exe -w $(OBJ_SAP)\nendif\n\nsapfs.exe: $(OBJ_SAPFS)\nifdef DEBUGMODE\n\t$(CC) -o sapfs.exe -w $(OBJ_SAPFS)\nelse\n\t$(CC) -s -o sapfs.exe -w $(OBJ_SAPFS)\nendif\n\n$(OBJ_DIR)%.o: %.c\n\t$(CC) -c $(CFLAGS) -w -o $@ $<\n\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/makefile.lnx",
    "content": "##########################################################################\n# targets:                                                               #\n#  all (default) : build sap2 and sapfs                                  #\n#  install       : build and install sap2 and sapfs in $(HOME)/emu/sap   #\n#  clean         : delete all rebuildable files                          #\n########################################################################## \n\n\n################\n# object files #\n################\n\nOBJ_DIR =\nOBJ_SAP = $(OBJ_DIR)sap2.o $(OBJ_DIR)libsap.o $(OBJ_DIR)lfloppy.o\nOBJ_SAPFS = $(OBJ_DIR)sapfs.o $(OBJ_DIR)libsap.o\n\n\n##################\n# compiler flags #\n##################\n\n# default to gcc compiler\nifeq (default,$(origin CC))\n  CC = gcc\nendif\n\nWFLAGS = -w\n#-Wall -W -Werror\n#WFLAGS = -Wall -W\n\nOFLAGS = -fsigned-char -O2 -fomit-frame-pointer\n\nCFLAGS += $(WFLAGS)\nCFLAGS += $(OFLAGS)\n\n\n################\n# target rules #\n################\n\n.PHONY: all install clean\n\nall: sap2 sapfs\n\ninstall: sap2 sapfs\n\tcp sap2 sapfs licence.txt sap2.txt sapfs.txt $(HOME)/emu/sap\n\nclean:\n\trm -f sap2 sapfs $(OBJ_DIR)*.o\n\nsap2: $(OBJ_SAP) \n\t$(CC) -s -w -o sap2 $(OBJ_SAP)\n\nsapfs: $(OBJ_SAPFS)\n\t$(CC) -s -w -o sapfs $(OBJ_SAPFS)\n\n$(OBJ_DIR)%.o: %.c\n\t$(CC) -c $(CFLAGS) -w -o $@ $<\n\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/readme.txt",
    "content": "\nVoir la documentation pour plus d'informations\n\nSee the documentation for more informations\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/sap2.c",
    "content": "/*  SAP2\n *  Version 2.1\n *  Copyright (C) 2000-2003 Eric Botcazou\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n/*  version 1.0: programme fonctionnel sous MSDOS et Linux\n *          1.1: retour au format PC  la sortie du programme\n *          1.2: ajout d'un mode de fonctionnement batch\n *          2.0: support des disquettes 5\"25 et de deux lecteurs PC\n *          2.1: support de la simple densit\n */\n\n\n#include <ctype.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#if defined(linux) || defined(__FreeBSD__)\n#    include <locale.h>\n#endif\n#include \"libsap.h\"\n#include \"floppy.h\"\n\n\n#define SAP2_VERSION_STR \"2.0.93\"\n\n#ifdef linux\n   #define SAP2_PLATFORM_STR \"Linux\"\n#else\n   #define SAP2_PLATFORM_STR \"MSDOS\"\n#endif\n\n#define FILENAME_LENGTH 128\n\n\n/* horrible hack pour supporter les accents... */\n#ifdef linux\n/* UTF-8 */\nstatic char eacute[] = \"\\xc3\\xa9\";\nstatic char egrave[] = \"\\xc3\\xa8\";\nstatic char agrave[] = \"\\xc3\\xa0\";\nstatic char ugrave[] = \"\\xc3\\xb9\";\n#else\n/* Latin-1 (ISO8859-1, etc.) */\nstatic char eacute[] = \"\\x82\";\nstatic char egrave[] = \"\\x8a\";\nstatic char agrave[] = \"\\x85\";\nstatic char ugrave[] = \"\\x97\";\n#endif\n\n\n/* pour l'affichage du rpertoire */\n#define PAGE_HEIGHT 22\n\nstatic int is_fr=0;\n\nstatic struct floppy_info fi;\nstatic char *drive_type_name[7] = { \"non disponible\",\n                                    \"5\\\"25 - 360 ko\",\n                                    \"5\\\"25 - 1.2 Mo\",\n                                    \"3\\\"5 -  720 ko\",\n                                    \"3\\\"5 - 1.44 Mo\",\n                                    \"3\\\"5 - 2.88 Mo\",\n                                    \"3\\\"5 - 2.88 Mo\" };\n\n#define IS_5_INCHES(drive) ((fi.drive_type[drive]>0) && (fi.drive_type[drive]<3))\n\n\n\n/* term_puts:\n *  Affiche une chane de caractres en respectant la taille du terminal.\n */\nstatic void term_puts(const char buffer[], int lines, int page_height)\n{\n   const char *start_cur, *end_cur;\n   char trash[8];\n   int i;\n   char *unused_char;\n\n   start_cur = end_cur = buffer;\n\n   while (lines>page_height) {\n      for (i=0; i<page_height; i++) {\n         while (*end_cur++ != '\\n')\n            ;\n      }\n\n      fwrite(start_cur, sizeof(char), end_cur-start_cur, stdout);\n\n      unused_char=fgets(trash, 7, stdin);\n      printf(is_fr?\"Appuyer sur <Return>\":\"Press <Return> key\");\n      getchar();\n      printf(\"\\n\");\n      ungetc('\\n', stdin);\n\n      start_cur = end_cur;\n      lines -= page_height;\n   }\n\n   puts(end_cur);\n   (void)unused_char;\n}\n\n\n\n/* ViewDiskDir:\n *  Affiche le rpertoire d'une disquette TO.\n */\nstatic int ViewDiskDir(int drive, int density, int page_height)\n{\n   unsigned char data[512*SAP_NSECTS];\n   char buffer[4096];\n   int lines;\n\n   if (FloppyReadSector(drive, density, 20, 1, SAP_NSECTS, data) != 0)\n      return 1;\n\n   /* on rduit la FAT  80 blocks pour les disquettes 5\"25 DD */\n   if (IS_5_INCHES(drive) && density == 2)\n      memset(data + SAP_SECTSIZE1 + 1 + SAP_NTRACKS1, 0xFE, SAP_NTRACKS1);\n\n   /* fonction bas-niveau de libSAP */\n   lines = _ExtractDir(buffer, sizeof(buffer), drive, density, data);\n\n   if ((page_height<0) || (lines<=page_height))\n      puts(buffer);\n   else\n      term_puts(buffer, lines, page_height);\n\n   return 0;\n}\n\n\n\n/* ViewArchiveDir:\n *  Affiche le rpertoire d'une archive SAP.\n */\nstatic int ViewArchiveDir(const char sap_name[], int page_height)\n{\n   char buffer[4096];\n   sapID sap_file;\n   int format, lines;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR)\n      return 1;\n\n   lines = sap_ListArchive(sap_file, buffer, sizeof(buffer));\n\n   if (lines == 0)\n      return 2;\n\n   if ((page_height<0) || (lines<=page_height))\n      puts(buffer);\n   else\n      term_puts(buffer, lines, page_height);\n\n   sap_CloseArchive(sap_file);\n   return 0;\n}\n\n\n\n/* CreateEmptyArchive:\n *  Cre une archive SAP vide (mais formate).\n */\nstatic int CreateEmptyArchive(const char sap_name[], int format, int capacity)\n{\n   sapID sap_file;\n\n   if ((sap_file=sap_CreateArchive(sap_name, format)) == SAP_ERROR)\n      return 1;\n\n   sap_FormatArchive(sap_file, capacity);\n   sap_CloseArchive(sap_file);\n\n   return 0;\n}\n\n\n\n/* BuildSectorMap:\n *  Construit la carte des secteurs d'une piste\n *  en fonction du facteur d'entrelacement.\n */\nstatic void BuildSectorMap(int *sector_map, int factor)\n{\n   int sect, loc=0;\n\n   /* mise  zro de la table */\n   memset(sector_map, 0, sizeof(int)*SAP_NSECTS);\n\n   for (sect=1; sect<=SAP_NSECTS; sect++) {\n      while (sector_map[loc] != 0)\n         loc=(loc+1)%SAP_NSECTS;\n\n      sector_map[loc]=sect;\n\n      loc=(loc+factor)%SAP_NSECTS;\n   }\n}\n\n\n\n/* FormatDisk:\n *  Formate une disquette 3\"5 - 720 ko au format Thomson.\n */\nstatic int FormatDisk(int drive, int density, int factor, int verbose)\n{\n   int num_tracks, sect_size;\n   int track, sect, pos, i;\n   int sector_map[SAP_NSECTS];\n   unsigned char header_table[512];\n   unsigned char buffer[512*SAP_NSECTS];\n\n   /* dtermination du nombre de pistes */\n   if (IS_5_INCHES(drive))\n      num_tracks = SAP_NTRACKS2;\n   else\n      num_tracks = SAP_NTRACKS1;\n\n   /* et de la taille du secteur */\n   if (density == 1)\n      sect_size = SAP_SECTSIZE2;\n   else\n      sect_size = SAP_SECTSIZE1;\n\n   /* construction de la carte des secteurs pour chaque piste,\n       partir du facteur d'entrelacement */\n   BuildSectorMap(sector_map, factor);\n\n   /* formatage des pistes */\n   for (track=0; track<num_tracks; track++) {\n      if (verbose) {\n         if (is_fr)\n             printf(\"\\r formatage piste %d\", track);\n         else\n             printf(\"\\r formatting track %d\", track);\n         fflush(stdout);\n      }\n\n      /* construction de la table des headers */\n      for (sect=1, pos=0; sect<=SAP_NSECTS; sect++, pos+=4) {\n         header_table[pos]   = track;\n         header_table[pos+1] = 0;\n         header_table[pos+2] = sector_map[sect-1];\n         header_table[pos+3] = density - 1;\n      }\n\n      if (FloppyFormatTrack(drive, density, track, header_table) != 0)\n         return 1;\n   }\n\n   if (verbose) {\n      if (is_fr)\n          printf(\"\\n construction de la FAT (piste 20)\");\n      else\n          printf(\"\\n building FAT (track 20)\");\n      fflush(stdout);\n   }\n\n   for (i=0; i<sect_size*SAP_NSECTS; i++)\n      buffer[i] = 0xFF;\n\n   /* pour MS-DOS (voir teo/src/dos/ddisk.c) */\n   buffer[i]=0;\n\n   if (FloppyWriteSector(drive, density, 20, 1, SAP_NSECTS, buffer) != 0)\n      return 2;\n\n   buffer[0] = 0;\n   buffer[41] = 0xFE;\n   buffer[42] = 0xFE;\n\n   /* pour MS-DOS (voir teo/src/dos/ddisk.c) */\n   buffer[sect_size] = 0;\n\n   if (FloppyWriteSector(drive, density, 20, 2, 1, buffer) != 0)\n      return 2;\n\n   if (verbose)\n      printf(\"\\n\");\n\n   return 0;\n}\n\n\n\n/* shrink_fat_160_to_80:\n *  Rduit la taille de la FAT de 160  80 blocks.\n */\nstatic void shrink_fat_160_to_80(unsigned char fat_data[])\n{\n   int i;\n\n   for (i=0; i<SAP_NTRACKS1; i++) {\n      if (fat_data[1 + SAP_NTRACKS1 + i] != 0xFF)\n         return;\n   }\n\n   memset(fat_data + 1 + SAP_NTRACKS1, 0xFE, SAP_NTRACKS1);\n}\n\n\n\n/* PackArchive:\n *  Transfre le contenu d'une disquette TO dans une archive SAP.\n */\nstatic int PackArchive(const char sap_name[], int drive, int density, int verbose)\n{\n   int num_tracks, sect_size;\n   int track, sect;\n   sapID sap_file;\n   sapsector_t sapsector;\n   unsigned char buffer[512*SAP_NSECTS];\n\n   if ((sap_file=sap_CreateArchive(sap_name, density == 1 ? SAP_FORMAT2 : SAP_FORMAT1)) == SAP_ERROR)\n      return 1;\n\n   /* dtermination du nombre de pistes */\n   if (IS_5_INCHES(drive))\n      num_tracks = SAP_NTRACKS2;\n   else\n      num_tracks = SAP_NTRACKS1;\n\n   /* et de la taille du secteur */\n   if (density == 1)\n      sect_size = SAP_SECTSIZE2;\n   else\n      sect_size = SAP_SECTSIZE1;\n\n   for (track=0; track<num_tracks; track++) {\n      if (verbose) {\n         if (is_fr)\n             printf(\"\\r lecture piste %d\", track);\n         else\n             printf(\"\\r reading track %d\", track);\n         fflush(stdout);\n      }\n\n      if (FloppyReadSector(drive, density, track, 1, SAP_NSECTS, buffer) != 0) {\n         /* erreur dans la piste, on essaie secteur par secteur */\n         for (sect=1; sect<=SAP_NSECTS; sect++) {\n            sapsector.format     = 0;\n            sapsector.protection = 0;\n            sapsector.track      = track;\n            sapsector.sector     = sect;\n\n            if (FloppyReadSector(drive, density, track, sect, 1, buffer) != 0) {\n               /* erreur de lecture du secteur */\n               if (verbose)\n               {\n                  if (is_fr)\n                      printf(\"\\n   secteur %d illisible\", sect);\n                  else\n                      printf(\"\\n   sector %d unreadable\", sect);\n               }\n\n               sapsector.format = 4;\n               memset(sapsector.data, 0xF7, sect_size);\n            }\n            else {\n               memcpy(sapsector.data, buffer, sect_size);\n            }\n\n            /* traitement spcial de la FAT pour les disquettes 5\"25 DD */\n            if ((track == 20) && (sect == 2) && IS_5_INCHES(drive) && (density == 2))\n               shrink_fat_160_to_80(sapsector.data);\n\n            sap_FillArchive(sap_file, &sapsector);\n         }\n\n         if ((track < num_tracks-1) && verbose)\n            printf(\"\\n\");\n      }\n      else {\n         for (sect=1; sect<=SAP_NSECTS; sect++) {\n            sapsector.format     = 0;\n            sapsector.protection = 0;\n            sapsector.track      = track;\n            sapsector.sector     = sect;\n\n            memcpy(sapsector.data, buffer+(sect-1)*sect_size, sect_size);\n\n            /* traitement spcial de la FAT pour les disquettes 5\"25 DD */\n            if ((track == 20) && (sect == 2) && IS_5_INCHES(drive) && (density == 2))\n               shrink_fat_160_to_80(sapsector.data);\n\n            sap_FillArchive(sap_file, &sapsector);\n         }\n      }\n   }\n\n   if (verbose)\n      printf(\"\\n\");\n\n   sap_CloseArchive(sap_file);\n   return 0;\n}\n\n\n\n/* UnpackArchive:\n *  Transfre le contenu d'une archive SAP vers une disquette TO.\n */\nstatic int UnpackArchive(const char sap_name[], int drive, int density, int verbose)\n{\n   int format, num_tracks, sect_size;\n   int track, sect;\n   sapID sap_file;\n   sapsector_t sapsector;\n   unsigned char buffer[512*SAP_NSECTS];\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR)\n      return 1;\n\n   /* vrification du format */\n   if (((format == SAP_FORMAT1) && (density != 2)) || ((format == SAP_FORMAT2) && (density != 1)))\n      return 1;\n\n   /* dtermination du nombre de pistes */\n   if (IS_5_INCHES(drive))\n      num_tracks = SAP_NTRACKS2;\n   else\n      num_tracks = SAP_NTRACKS1;\n\n   /* et de la taille du secteur */\n   if (density == 1)\n      sect_size = SAP_SECTSIZE2;\n   else\n      sect_size = SAP_SECTSIZE1;\n\n   for (track=0; track<num_tracks; track++) {\n      if (verbose) {\n         if (is_fr)\n             printf(\"\\r %scriture piste %d\", eacute, track);\n         else\n             printf(\"\\r writing track %d\",track);\n         fflush(stdout);\n      }\n\n      for (sect=1; sect<=SAP_NSECTS; sect++) {\n         sapsector.format     = 0;\n         sapsector.protection = 0;\n         sapsector.track      = track;\n         sapsector.sector     = sect;\n\n         if (sap_ReadSector(sap_file, track, sect, &sapsector) == SAP_ERROR) {\n            sap_CloseArchive(sap_file);\n            return 2;\n         }\n         else {\n            memcpy(buffer+(sect-1)*sect_size, sapsector.data, sect_size);\n         }\n      }\n\n      /* pour MS-DOS (voir teo/src/dos/ddisk.c) */\n      buffer[SAP_NSECTS*sect_size] = 0;\n\n      if (FloppyWriteSector(drive, density, track, 1, SAP_NSECTS, buffer) != 0) {\n         sap_CloseArchive(sap_file);\n         return 3;\n      }\n   }\n\n   if (verbose)\n      printf(\"\\n\");\n\n   sap_CloseArchive(sap_file);\n   return 0;\n}\n\n\n\n/* get_drive:\n *  Helper pour obtenir le numro de lecteur.\n */\nstatic void get_drive(int *drive, int *density)\n{\n   char trash[8];\n   char *unused_char;\n\n   if (fi.num_drives > 1) {\n      do {\n         if (is_fr)\n             printf(\" num%sro du lecteur: \", eacute);\n         else\n             printf(\" drive number: \");\n         if (!scanf(\"%d\", drive))\n            unused_char=fgets(trash, 7, stdin);\n      }\n      while ((*drive<0) || (*drive>3) || (fi.drive_type[*drive]==0));\n   }\n   else {\n      for (*drive=0; *drive<4; (*drive)++) {\n         if (fi.drive_type[*drive] > 0)\n            break;\n      }\n   }\n\n   if (fi.fm_support && IS_5_INCHES(*drive)) {\n      do {\n         if (is_fr)\n             printf(\" densit%s (1:simple, 2:double): \", eacute);\n         else\n             printf(\" density (1:simple, 2:double): \");\n\n         if (!scanf(\"%d\", density))\n            unused_char=fgets(trash, 7, stdin);\n      }\n      while ((*density<1) || (*density>2));\n   }\n   else\n      *density = 2;\n   (void)unused_char;\n}\n\n\n\n/* interactive_main:\n *  Point d'entre du programme interactif.\n */\nstatic void interactive_main(void)\n{\n   int c, ret;\n   char trash[8];\n   int drive, density, format, factor;\n   char sap_name[FILENAME_LENGTH];\n   char *unused_char;\n   int unused_int;\n\n   while (1) {\n      if (is_fr)\n      {\n          printf(\"SAP2, syst%sme d'archivage pour disquettes 3\\\"5 et 5\\\"25 Thomson\\n\", egrave);\n          printf(\"version \"SAP2_VERSION_STR\" (\"SAP2_PLATFORM_STR\") copyright (C) 2000-2003 Eric Botcazou\\n\");\n          printf(\" bas%s sur SAP copyright (C) Alexandre Pukall Avril 1998\\n\\n\", eacute);\n      }\n      else\n      {\n          printf(\"SAP2, archiving system for Thomson 3\\\"5 and 5\\\"25 floppies\\n\");\n          printf(\"version \"SAP2_VERSION_STR\" (\"SAP2_PLATFORM_STR\") copyright (C) 2000-2003 Eric Botcazou\\n\");\n          printf(\" based on SAP copyright (C) Alexandre Pukall April 1998\\n\\n\");\n      }\n\n      if (fi.drive_type[0] > 0) {\n         if (is_fr)\n             printf(\"Lecteur A: (%s) --> lecteur 0\", drive_type_name[fi.drive_type[0]]);\n         else\n             printf(\"Drive A: (%s) --> drive 0\", drive_type_name[fi.drive_type[0]]);\n\n         if (fi.drive_type[1] > 0)\n         {\n            if (is_fr)\n                printf(\" + lecteur 1\\n\");\n            else\n                printf(\" + drive 1\\n\");\n         }\n         else\n            printf(\"\\n\");\n      }\n      else {\n         if (is_fr)\n             printf(\"Lecteur A: (%s)\\n\", drive_type_name[0]);\n         else\n             printf(\"Drive A: (%s)\\n\", drive_type_name[0]);\n      }\n\n      if (fi.drive_type[2] > 0) {\n         if (is_fr)\n             printf(\"Lecteur B: (%s) --> lecteur 2\", drive_type_name[fi.drive_type[2]]);\n         else\n             printf(\"Drive B: (%s) --> drive 2\", drive_type_name[fi.drive_type[2]]);\n\n         if (fi.drive_type[3] > 0)\n         {\n             if (is_fr)\n                 printf(\" + lecteur 3\\n\\n\");\n             else\n                 printf(\" + drive 3\\n\\n\");\n         }\n         else\n            printf(\"\\n\\n\");\n      }\n      else {\n         if (is_fr)\n             printf(\"Lecteur B: (%s)\\n\\n\", drive_type_name[0]);\n         else\n             printf(\"Drive B: (%s)\\n\\n\", drive_type_name[0]);\n      }\n\n      if (is_fr)\n      {\n          printf(\"Transfert TO-->PC:\\n\");\n          printf(\" 1. Visualiser le contenu d'une disquette Thomson\\n\");\n          printf(\" 2. Cr%ser une archive SAP vide\\n\", eacute);\n          printf(\" 3. Archiver une disquette Thomson vers une archive SAP\\n\");\n\n          printf(\"Transfert PC-->TO:\\n\");\n          printf(\" 4. Visualiser le contenu d'une archive SAP\\n\");\n          printf(\" 5. Formater une disquette 3\\\"5 (720 ko) ou 5\\\"25 au format Thomson\\n\");\n          printf(\" 6. D%ssarchiver une archive SAP vers une disquette Thomson\\n\", eacute);\n          printf(\"Autres commandes:\\n\");\n          printf(\" 7. Quitter\\n\\n\");\n      }\n      else\n      {\n          printf(\"TO-->PC transfer:\\n\");\n          printf(\" 1. Display directory of a Thomson floppy\\n\");\n          printf(\" 2. Create an empty SAP archive\\n\");\n          printf(\" 3. Archive a Thomson floppy to a SAP archive\\n\");\n          printf(\"PC-->TO transfer:\\n\");\n          printf(\" 4. Display directory of a SAP archive\\n\");\n          printf(\" 5. Initialize a Thomson formatted 3\\\"5 (720 ko) or 5\\\"25 floppy\\n\");\n          printf(\" 6. Unarchive a SAP archive to a Thomson floppy\\n\");\n          printf(\"Other commands:\\n\");\n          printf(\" 7. Quit\\n\\n\");\n      }\n\n      do {\n         if (is_fr)\n             printf(\"Votre choix: \");\n         else\n             printf(\"Your choice: \");\n         if (!scanf(\"%d\", &c))\n            unused_char=fgets(trash, 7, stdin);\n      }\n      while ((c<1) || (c>7));\n\n      switch (c) {\n\n         case 1:\n            if (is_fr)\n                printf(\"Visualisation du contenu d'une disquette:\\n\");\n            else\n                printf(\"Displaying disk directory:\\n\");\n\n            get_drive(&drive, &density);\n            printf(\"\\n\");\n\n            ret = ViewDiskDir(drive, density, PAGE_HEIGHT);\n            if (ret == 1)\n            {\n               if (is_fr)\n                   printf(\"*** Erreur: r%spertoire illisible ***\\n\", eacute);\n               else\n                   printf(\"*** Error: directory unreadable ***\\n\");\n            }\n            break;\n\n         case 2:\n            if (is_fr)\n               printf(\"Cr%sation d'une archive vide:\\n\", eacute);\n            else\n               printf(\"Creating an empty archive:\\n\");\n\n\n            if (is_fr)\n                printf(\" nom de l'archive %s cr%ser (sans extension): \", agrave, eacute);\n            else\n                printf(\" name of archive to create (without extension): \");\n            unused_int=scanf(\"%s\", sap_name);\n            strcat(sap_name, \".sap\");\n\n            do {\n               if (is_fr)\n                   printf(\" format (1:5\\\"25 SD, 2:5\\\"25 DD, 3:3\\\"5 DD): \");\n               else\n                   printf(\" format type (1:5\\\"25 SD, 2:5\\\"25 DD, 3:3\\\"5 DD): \");\n               if (!scanf(\"%d\", &format))\n                  unused_char=fgets(trash, 7, stdin);\n            }\n            while ((format<1) || (format>3));\n\n            ret = CreateEmptyArchive(sap_name, (format == 1 ? SAP_FORMAT2 : SAP_FORMAT1), (format == 3 ? SAP_TRK80 : SAP_TRK40));\n            if (ret == 1)\n            {\n               if (is_fr)\n                   printf(\"*** Erreur: impossible de cr%ser le fichier %s ***\\n\", eacute, sap_name);\n               else\n                   printf(\"*** Error: impossible to create the file %s ***\\n\", sap_name);\n            }\n            break;\n\n         case 3:\n            if (is_fr)\n                printf(\"Archivage d'une disquette:\\n\");\n            else\n                printf(\"Archiving a disk:\\n\");\n\n            if (is_fr)\n                printf(\" nom de l'archive %s cr%ser (sans extension): \", agrave, eacute);\n            else\n                printf(\" name of the archive to create (without extension): \");\n            unused_int=scanf(\"%s\", sap_name);\n            strcat(sap_name, \".sap\");\n\n            get_drive(&drive, &density);\n            ret = PackArchive(sap_name, drive, density, 1);\n            if (ret == 1)\n            {\n               if (is_fr)\n                   printf(\"*** Erreur: impossible de cr%ser le fichier %s ***\\n\", eacute, sap_name);\n               else\n                   printf(\"*** Error: unable to create the file %s ***\\n\", sap_name);\n            }\n\n            break;\n\n         case 4:\n            if (is_fr)\n                printf(\"Visualisation du contenu d'une archive:\\n\");\n            else\n                printf(\"Displaying archive directory:\\n\");\n\n            if (is_fr)\n                printf(\" nom de l'archive (sans extension): \");\n            else\n                printf(\" name of the archive (without extension): \");\n\n            unused_int=scanf(\"%s\", sap_name);\n            strcat(sap_name, \".sap\");\n\n            printf(\"\\n\");\n\n            ret = ViewArchiveDir(sap_name, PAGE_HEIGHT);\n            if (ret == 1)\n            {\n                if (is_fr)\n                   printf(\"*** Erreur: impossible d'ouvrir le fichier %s ***\\n\", sap_name);\n                else\n                   printf(\"*** Error: unable to open the file %s ***\\n\", sap_name);\n            }\n            else if (ret == 2)\n            {\n                if (is_fr)\n                    printf(\"*** Erreur: archive SAP corrompue ***\\n\");\n                else\n                    printf(\"*** Error: SAP archive corrupted ***\\n\");\n            }\n            break;\n\n         case 5:\n            if (is_fr)\n            {\n                printf(\"Formatage d'une disquette au format Thomson:\\n\");\n                printf(\" Si la disquette est une 3\\\"5 - 1.44 Mo, occulter l'encoche\\n\");\n                printf(\" de droite (recto et verso) avec un morceau de scotch.\\n\");\n            }\n            else\n            {\n                printf(\"Initializing a Thomson formatted floppy:\\n\");\n                printf(\" If the floppy is 3\\\"5 - 1.44 Mo, obsruct the high-capacity\\n\");\n                printf(\" hole (both sides) with a piece of tape.\\n\");\n            }\n\n            get_drive(&drive, &density);\n\n            do {\n               if (is_fr)\n                   printf(\" facteur d'entrelacement ([1..%d], %d recommand%s): \", SAP_NSECTS-1, (SAP_NSECTS-1)/2, eacute);\n               else\n                   printf(\" interleaving ([1..%d], %d recommanded): \", SAP_NSECTS-1, (SAP_NSECTS-1)/2);\n               if (!scanf(\"%d\", &factor))\n                  unused_char=fgets(trash, 7, stdin);\n            }\n            while ((factor<1) || (factor>(SAP_NSECTS-1)));\n\n            ret = FormatDisk(drive, density, factor, 1);\n            if (ret == 1)\n            {\n               if (is_fr)\n                   printf(\"\\n*** Erreur: impossible de formater la disquette ***\\n\");\n               else\n                   printf(\"\\n*** Error: unable to format floppy ***\\n\");\n            }\n            else if (ret == 2)\n            {\n               if (is_fr)\n                   printf(\"*** Erreur: impossible d'%scrire sur la disquette ***\\n\", eacute);\n               else\n                   printf(\"*** Error: unable to write on floppy ***\\n\");\n            }\n            break;\n\n         case 6:\n            if (is_fr)\n                printf(\"D%ssarchivage vers une disquette:\\n\", eacute);\n            else\n                printf(\"Unarchiving to a floppy:\\n\");\n\n            get_drive(&drive, &density);\n\n            if (is_fr)\n                printf(\" nom de l'archive (sans extension): \");\n            else\n                printf(\" archive name (without extension): \");\n            unused_int=scanf(\"%s\", sap_name);\n            strcat(sap_name, \".sap\");\n\n            ret = UnpackArchive(sap_name, drive, density, 1);\n            if (ret == 1)\n            {\n               if (is_fr)\n                   printf(\"*** Erreur: impossible d'ouvrir le fichier %s ***\\n\", sap_name);\n               else\n                   printf(\"*** Error: unable to open the file %s ***\\n\", sap_name);\n            }\n            else if (ret == 2)\n            {\n               if (is_fr)\n                   printf(\"*** Erreur: archive SAP corrompue ***\\n\");\n               else\n                   printf(\"*** Error: SAP archive corrupted ***\\n\");\n            }\n            else if (ret == 3)\n            {\n               if (is_fr)\n                   printf(\"\\n*** Erreur: impossible d'%scrire sur la disquette ***\\n\", eacute);\n               else\n                   printf(\"\\n*** Error: unable to write on floppy ***\\n\");\n            }\n            break;\n\n         case 7:\n            return;\n      }\n\n      unused_char=fgets(trash, 7, stdin);\n      if (is_fr)\n          printf(\"Appuyer sur <Return>\");\n      else\n          printf(\"Press <Return>\");\n      fflush(stdout);\n      getchar();\n      printf(\"\\n\");\n   }\n   (void)unused_char;\n   (void)unused_int;\n}\n\n\n#define COMMAND_MAX  8\n\nstatic char *short_command[] = {\"-h\", \"-v\", \"-d\", \"-c\", \"-p\", \"-t\", \"-f\", \"-u\"};\nstatic char *long_command[] = {\"--help\", \"--version\", \"--dir\", \"--create\", \"--pack\", \"--list\", \"--format\", \"--unpack\"};\n\n\n\n/* usage:\n *  Affiche les commandes d'utilisation du programme et quitte.\n */\nstatic void usage(const char prog_name[])\n{\n   fprintf(stderr, \"Usage: %s  -h --help | -v --version | -t --list | -p --pack | -u --unpack\\n\", prog_name);\n   fprintf(stderr, \"               -c --create | -d --dir | -f --format\\n\");\n   exit(EXIT_FAILURE);\n}\n\n\n\n/* main:\n *  Point d'entre du programme.\n */\nint main(int argc, char *argv[])\n{\n   int ret = 0;\n   int i;\n\n#ifdef DJGPP\n#ifdef FRENCH_LANGUAGE\n    is_fr = 1;\n#else\n    is_fr = 0;\n#endif\n#else\n   char *lang=getenv(\"LANG\");\n    if (lang==NULL) lang=\"fr_FR\";\n    //setlocale(LC_ALL, \"fr_FR.UTF8\");\n    if (strncmp(lang,\"fr\",2)==0)\n        is_fr=1;\n    else\n        is_fr=0;\n#endif\n\n   if (argc < 2) { /* no argument? */\n      if (FloppyInit(&fi, 1) > 0) {\n         interactive_main();\n         FloppyExit();\n      }\n      else {\n         ret = 1;\n      }\n   }\n   else {\n      if (argv[1][0] == '-') {\n\n         switch (argv[1][1]) {\n\n            case '-':  /* long commands */\n               for (i=0; i<COMMAND_MAX; i++) {\n                  if (strcmp(argv[1], long_command[i]) == 0) {\n                     argv[1] = short_command[i];\n                     return main(argc, argv);\n                  }\n               }\n\n               usage(argv[0]);\n               break;\n\n            case 'h':  /* help */\n               if (is_fr)\n               {\n                   printf(\"SAP2 est un syst%sme d'archivage pour disquettes 3\\\"5 et 5\\\"25 Thomson. Il permet\\n\", egrave);\n                   printf(\"de cr%ser des images de disquettes sous forme d'archive SAP.\\n\\n\", eacute);\n                   printf(\"Usage:\\n\");\n                   printf(\"    %s (mode interactif)\\n\", argv[0]);\n                   printf(\"    %s commande1 archive.sap [lecteur] [densit%s]\\n\", argv[0], eacute);\n                   printf(\"    %s commande2 archive.sap [nb pistes] [densit%s]\\n\", argv[0], eacute);\n                   printf(\"    %s commande3 lecteur [densit%s] [entrelacement]\\n\", argv[0], eacute);\n                   printf(\"o%s la commande1 est prise parmi les suivantes:\\n\", ugrave);\n                   printf(\"  -h, --help          affiche cette aide\\n\");\n                   printf(\"  -v, --version       affiche la version du programme\\n\");\n                   printf(\"  -t, --list          affiche la liste des fichiers de l'archive SAP\\n\");\n                   printf(\"  -p, --pack          archive une disquette Thomson vers une archive SAP\\n\");\n                   printf(\"  -u, --unpack        d%ssarchive une archive SAP vers une disquette Thomson\\n\", eacute);\n                   printf(\"et o%s la commande2 est prise parmi les suivantes:\\n\", ugrave);\n                   printf(\"  -c, --create        cr%se une archive SAP vide\\n\", eacute);\n                   printf(\"et o%s la commande3 est prise parmi les suivantes:\\n\", ugrave);\n                   printf(\"  -d, --dir           affiche le contenu d'une disquette Thomson\\n\");\n                   printf(\"  -f, --format        formate une disquette au format Thomson\\n\");\n               }\n               else\n               {\n                   printf(\"SAP2 is an archiving system for Thomson 3\\\"5 et 5\\\"25 floppies. It allows you\\n\");\n                   printf(\"to create disk images as SAP archives.\\n\\n\");\n                   printf(\"Usage:\\n\");\n                   printf(\"    %s (interactive mode)\\n\", argv[0]);\n                   printf(\"    %s command1 archive.sap [lecteur] [density]\\n\", argv[0]);\n                   printf(\"    %s command2 archive.sap [nb tracks] [density]\\n\", argv[0]);\n                   printf(\"    %s command3 drive [density] [interleave]\\n\", argv[0]);\n                   printf(\"where command1 is token among the following:\\n\");\n                   printf(\"  -h, --help          display this help\\n\");\n                   printf(\"  -v, --version       display program version\\n\");\n                   printf(\"  -t, --list          display the list of the SAP archive files\\n\");\n                   printf(\"  -p, --pack          archive a Thomson floppy to a SAP archive\\n\");\n                   printf(\"  -u, --unpack        unarchive a SAP archive to a Thomson floppy\\n\");\n                   printf(\"and where commande2 is token among the following:\\n\");\n                   printf(\"  -c, --create        create an empty SAP archive\\n\");\n                   printf(\"and where commande3 is token among the following:\\n\");\n                   printf(\"  -d, --dir           display dir of a Thomson floppy\\n\");\n                   printf(\"  -f, --format        create a Thomson formatted floppy\\n\");\n               }\n               break;\n\n            case 'v':  /* version */\n               if (is_fr)\n                   printf(\"SAP2 version \"SAP2_VERSION_STR\" pour \"SAP2_PLATFORM_STR\", copyright (C) 2000-2003 Eric Botcazou.\\n\");\n               else\n                   printf(\"SAP2 version \"SAP2_VERSION_STR\" for \"SAP2_PLATFORM_STR\", copyright (C) 2000-2003 Eric Botcazou.\\n\");\n               break;\n\n            case 'd':  /* dir */\n               if (argc < 3)\n                  usage(argv[0]);\n\n               if (FloppyInit(&fi, 0) > 0) {\n                  ret = ViewDiskDir(atoi(argv[2]), argc > 3 ? atoi(argv[3]) : 2, -1);\n                  FloppyExit();\n               }\n               else {\n                  ret = 1;\n               }\n               break;\n\n            case 'c':  /* create */\n               if (argc < 3)\n                  usage(argv[0]);\n\n               if (argc < 4) {\n                  ret = CreateEmptyArchive(argv[2], SAP_FORMAT1, SAP_TRK80);\n               }\n               else if (argc == 4){\n                  if (atoi(argv[3]) == 40)\n                     ret = CreateEmptyArchive(argv[2], SAP_FORMAT1, SAP_TRK40);\n                  else if (atoi(argv[3]) == 80)\n                     ret = CreateEmptyArchive(argv[2], SAP_FORMAT1, SAP_TRK80);\n                  else\n                     ret = 1;\n               }\n               else {\n                  if (atoi(argv[3]) == 40)\n                     ret = CreateEmptyArchive(argv[2], (atoi(argv[4]) == 1 ? SAP_FORMAT2 : SAP_FORMAT1), SAP_TRK40);\n                  else if (atoi(argv[3]) == 80)\n                     ret = CreateEmptyArchive(argv[2], (atoi(argv[4]) == 1 ? SAP_FORMAT2 : SAP_FORMAT1), SAP_TRK80);\n                  else\n                     ret = 1;\n               }\n               break;\n\n            case 'p':  /* pack */\n               if (argc < 4)\n                  usage(argv[0]);\n\n               if (FloppyInit(&fi, 0) > 0) {\n                  ret = PackArchive(argv[2], atoi(argv[3]), argc > 4 ? atoi(argv[4]) : 2, 0);\n                  FloppyExit();\n               }\n               else {\n                  ret = 1;\n               }\n               break;\n\n            case 't':  /* list */\n               if (argc < 3)\n                  usage(argv[0]);\n\n               ret = ViewArchiveDir(argv[2], -1);\n               break;\n\n            case 'f':  /* format */\n               if (argc < 3)\n                  usage(argv[0]);\n\n               if (FloppyInit(&fi, 1) > 0) {\n                  if (argc == 3)\n                     ret = FormatDisk(atoi(argv[2]), 2, (SAP_NSECTS-1)/2, 0);\n                  else if (argc == 4)\n                     ret = FormatDisk(atoi(argv[2]), atoi(argv[3]), (SAP_NSECTS-1)/2, 0);\n                  else\n                     ret = FormatDisk(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), 0);\n\n                  FloppyExit();\n               }\n               else {\n                  ret = 1;\n               }\n               break;\n\n            case 'u':  /* unpack */\n               if (argc < 4)\n                  usage(argv[0]);\n\n               if (FloppyInit(&fi, 1) > 0) {\n                  ret = UnpackArchive(argv[2], atoi(argv[3]), argc > 4 ? atoi(argv[4]) : 2, 0);\n                  FloppyExit();\n               }\n               else {\n                  ret = 1;\n               }\n               break;\n\n            default:\n               usage(argv[0]);\n         }  /* end of switch */\n      }\n      else {\n         usage(argv[0]);\n      }\n   }\n\n   return ret;\n}\n\n"
  },
  {
    "path": "tools/cmoc/mo5/sap/sapfs.c",
    "content": "/*  SAPfs\n *  Version 0.9.4\n *  Copyright (C) 2001-2003 Eric Botcazou\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n */\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include <dirent.h>\n#include <sys/stat.h>\n#if defined(linux) || defined(__FreeBSD__)\n#    include <locale.h>\n#endif\n#include \"libsap.h\"\n\n\n#define SAPFS_VERSION_STR \"0.9.4\"\n\n#ifdef linux\n   #define SAPFS_PLATFORM_STR \"Linux\"\n#else\n   #define SAPFS_PLATFORM_STR \"MSDOS\"\n#endif\n\n#define FILENAME_LENGTH 512\n\n\n/* ugly hack to support French accents */\n#ifdef linux\n/* UTF-8 */\nstatic char eacute[] = \"\\xc3\\xa9\";\nstatic char egrave[] = \"\\xc3\\xa8\";\nstatic char agrave[] = \"\\xc3\\xa0\";\nstatic char ugrave[] = \"\\xc3\\xb9\";\n#else\n/* Latin-1 (ISO8859-1, etc.) */\nstatic char eacute[] = \"\\x82\";\nstatic char egrave[] = \"\\x8a\";\nstatic char agrave[] = \"\\x85\";\nstatic char ugrave[] = \"\\x97\";\n#endif\n\nstatic int is_fr=0;\n\n\n/* PrintErrorMessage:\n *  Prints the error message corresponding to the specified error.\n */\nstatic void PrintErrorMessage(int errno, const char str[])\n{\n   switch (errno) {\n\n      case SAP_EBADF:\n         if (is_fr)\n             fprintf(stderr, \"Erreur: le fichier %s n'est pas une archive SAP valide.\\n\", str);\n         else\n             fprintf(stderr, \"Error: the file %s is not a valid SAP archive.\\n\", str);\n         break;\n\n      case SAP_EFBIG:\n         if (is_fr)\n             fprintf(stderr, \"Erreur: le fichier %s est de taille trop importante.\\n\", str);\n         else\n             fprintf(stderr, \"Error: the file %s is too large.\\n\", str);\n         break;\n\n      case SAP_ENFILE:\n         if (is_fr)\n            fprintf(stderr, \"Erreur: le fichier %s est vide.\\n\", str);\n         else\n            fprintf(stderr, \"Error: the file %s is empty.\\n\", str);\n         break;\n\n      case SAP_ENOENT:\n         if (is_fr)\n            fprintf(stderr, \"Erreur: le fichier %s est introuvable.\\n\", str);\n         else\n            fprintf(stderr, \"Error: file %s not found.\\n\", str);\n         break;\n\n      case SAP_ENOSPC:\n         if (is_fr)\n            fprintf(stderr, \"Erreur: le r%spertoire de l'archive est plein.\\n\", eacute);\n         else\n            fprintf(stderr, \"Error: archive directory is full.\\n\");\n         break;\n\n      case SAP_EPERM:\n         if (is_fr)\n            fprintf(stderr, \"Erreur: impossible de cr%ser le fichier %s.\\n\", eacute, str);\n         else\n            fprintf(stderr, \"Error: unable to create the file %s.\\n\", str);\n         break;\n   }\n}\n\n\n\n/* put_separator:\n *  Helper function to add a missing directory separator.\n */\nstatic void put_separator(char filename[])\n{\n   int last;\n\n   last = strlen(filename) - 1;\n\n   if (filename[last] != '/')\n      filename[last + 1] = '/';\n}\n\n\n\n/* CreateEmptyArchive:\n *  Creates a new archive using the specified name.\n */\nstatic int CreateEmptyArchive(const char sap_name[], int format, int capacity)\n{\n   sapID sap_file;\n\n   if ((sap_file=sap_CreateArchive(sap_name, format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   sap_FormatArchive(sap_file, capacity);\n   sap_CloseArchive(sap_file);\n\n   return 0;\n}\n\n\n\n/* FormatArchive:\n *  Formats the specified already existing archive.\n */\nstatic int FormatArchive(const char sap_name[], int capacity)\n{\n   sapID sap_file;\n   int format;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   sap_FormatArchive(sap_file, capacity);\n   sap_CloseArchive(sap_file);\n\n   return 0;\n}\n\n\n\n/* VerifyArchive:\n *  Verifies one or more sectors from the specified archive.\n */\nstatic int VerifyArchive(const char sap_name[], int track, int sect)\n{\n   sapsector_t sapsector;\n   sapID sap_file;\n   int format, ntracks, s, t, flag;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   ntracks = (format == SAP_FORMAT1 ? SAP_NTRACKS1 : SAP_NTRACKS2);\n\n   /* check track number */\n   if (track<0) {\n      t = 0;\n      track = ntracks-1;\n   }\n   else {\n      if (track>=ntracks) {\n         if (is_fr)\n             fprintf(stderr, \"Erreur: num%sro de piste invalide.\\n\", eacute);\n         else\n             fprintf(stderr, \"Error: invalid track number.\\n\");\n         sap_CloseArchive(sap_file);\n         return 1;\n      }\n\n      t = track;\n   }\n\n   /* check sector number */\n   if (sect<0) {\n      s = 1;\n      sect = SAP_NSECTS;\n   }\n   else {\n      if ((sect<1) || (sect>SAP_NSECTS)) {\n         if (is_fr)\n             fprintf(stderr, \"Erreur: num%sro de secteur invalide.\\n\", eacute);\n         else\n             fprintf(stderr, \"Error: invalid sector number.\\n\");\n         sap_CloseArchive(sap_file);\n         return 1;\n      }\n\n      s = sect;\n   }\n\n   while (t <= track) {\n      while (s <= sect) {\n         flag = sap_ReadSector(sap_file, t, s, &sapsector);\n\n         if (flag != SAP_OK) {\n            printf(\"track %d sector %02d: \", t, s);\n\n            if (flag & SAP_NO_STD_FMT)\n               printf(\"<format=%d> \", sapsector.format);\n\n            if (flag & SAP_PROTECTED)\n               printf(\"<protection=%d> \", sapsector.protection);\n\n            if (flag & SAP_BAD_SECTOR)\n               printf(\"<track=%d sector=%d> \", sapsector.track, sapsector.sector);\n\n            if (flag & SAP_CRC_ERROR)\n               printf(\"<CRC error>\");\n\n            printf(\"\\n\");\n         }\n\n         s++;\n      }  /* end of while (s <= sect) */\n\n      s = 1;\n      t++;\n   }  /* end of while (t <= track ) */\n\n   sap_CloseArchive(sap_file);\n\n   return 0;\n}\n\n\n\n/* DumpArchive:\n *  Dumps one or more sectors from the specified archive.\n */\nstatic int DumpArchive(const char sap_name[], int track, int sect)\n{\n   sapsector_t sapsector;\n   unsigned char c;\n   sapID sap_file;\n   int format, ntracks, i,j,s,t;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   ntracks = (format == SAP_FORMAT1 ? SAP_NTRACKS1 : SAP_NTRACKS2);\n\n   /* check track number */\n   if (track<0) {\n      t = 0;\n      track = ntracks-1;\n   }\n   else {\n      if (track>=ntracks) {\n         if (is_fr)\n             fprintf(stderr, \"Erreur: num%sro de piste invalide.\\n\", eacute);\n         else\n             fprintf(stderr, \"Error: invalid track number.\\n\");\n         sap_CloseArchive(sap_file);\n         return 1;\n      }\n\n      t = track;\n   }\n\n   /* check sector number */\n   if (sect<0) {\n      s = 1;\n      sect = SAP_NSECTS;\n   }\n   else {\n      if ((sect<1) || (sect>SAP_NSECTS)) {\n         if (is_fr)\n             fprintf(stderr, \"Erreur: num%sro de secteur invalide.\\n\", eacute);\n         else\n             fprintf(stderr, \"Error: invalid sector number.\\n\");\n         sap_CloseArchive(sap_file);\n         return 1;\n      }\n\n      s = sect;\n   }\n\n   while (t <= track) {\n      while (s <= sect) {\n         sap_ReadSector(sap_file, t, s, &sapsector);\n\n         printf(\"track id: %02d\\n\", sapsector.track);\n         printf(\"sector id: %02d\\n\", sapsector.sector);\n         printf(\"format: %d\\n\", sapsector.format);\n         printf(\"protection: %d\\n\", sapsector.protection);\n         printf(\"data:\\n\");\n\n         for (i=0; i< (format == SAP_FORMAT1 ? 16 : 8); i++) {\n            for (j=0; j<16; j++) {\n               c = sapsector.data[i*16+j];\n               printf(\"%02X \", c);\n            }\n\n            for (j=0; j<16; j++) {\n               c = sapsector.data[i*16+j];\n\n               if ((c>=32) && (c<=125))\n                  putchar(c);\n               else\n                  putchar('.');\n            }\n\n            printf(\"\\n\");\n         }\n\n         s++;\n      }  /* end of while (s <= sect) */\n\n      s = 1;\n      t++;\n   }  /* end of while (t <= track ) */\n\n   sap_CloseArchive(sap_file);\n\n   return 0;\n}\n\n\n\n/* ListArchive:\n *  Lists the files contained in the specified archive.\n */\nstatic int ListArchive(const char sap_name[])\n{\n   char buffer[4096];\n   sapID sap_file;\n   int format;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   sap_ListArchive(sap_file, buffer, sizeof(buffer));\n   puts(buffer);\n   sap_CloseArchive(sap_file);\n\n   return 0;\n}\n\n\n\n/* PrintFileInfo:\n *  Prints the info for the specified file.\n */\nstatic int PrintFileInfo(const char sap_name[], char filename[])\n{\n   int format, i, ret = 0;\n   sapID sap_file;\n   sapfileinfo_t info;\n   char tmp[64];\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   if (sap_GetFileInfo(sap_file, filename, &info) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, filename);\n      ret = 1;\n   }\n   else {\n      printf(\"name: %s\\n\", filename);\n      printf(\"size: %d bytes\\n\", info.size);\n      printf(\"file type: %d\\n\", info.file_type);\n      printf(\"data type: %d\\n\", info.data_type);\n\n      if (info.date) {\n         strftime(tmp, sizeof(tmp), \"%m/%d/%Y %H:%M \", localtime(&info.date));\n         printf(\"date: %s\\n\", tmp);\n      }\n\n      if (info.comment[0])\n         printf(\"comment: %s\\n\", info.comment);\n\n      printf(\"blocks: \");\n      for (i=0; i<info.nblocks; i++)\n         printf(\"%d \", info.block[i]);\n      printf(\"\\n\");\n\n      free(info.block);\n   }\n\n   sap_CloseArchive(sap_file);\n\n   return ret;\n}\n\n\n\n/* ExtractFile:\n *  Extracts one or more files from the specified archive.\n */\nstatic int ExtractFile(const char sap_name[], char *filename[], int nfiles)\n{\n   int format, i, len, ret = 0;\n   sapID sap_file;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   for (i=0; i<nfiles; i++) {\n      len = sap_ExtractFile(sap_file, filename[i]);\n\n      if (len == 0) {\n         PrintErrorMessage(sap_errno, filename[i]);\n         ret = 1;\n         break;\n      }\n   }\n\n   sap_CloseArchive(sap_file);\n\n   return ret;\n}\n\n\n\n/* AddFile:\n *  Adds one or more files to the specified archive.\n */\nstatic int AddFile(const char sap_name[], char *filename[], int nfiles)\n{\n   char pathname[FILENAME_LENGTH];\n   int format, i, len = 0, ret = 0;\n   struct stat s;\n   struct dirent *entry;\n   sapID sap_file;\n   DIR *dir;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   for (i=0; i<nfiles; i++) {\n      /* get file statistics */\n      if (stat(filename[i], &s) != 0) {\n         if (is_fr)\n             fprintf(stderr, \"Erreur: le fichier %s est introuvable.\\n\", filename[i]);\n         else\n             fprintf(stderr, \"Error: file %s not found.\\n\", filename[i]);\n         ret = 1;\n         break;\n      }\n\n      if (S_ISDIR(s.st_mode)) {  /* directory? */\n         if ((dir=opendir(filename[i])) == NULL) {\n            if (is_fr)\n                fprintf(stderr, \"Erreur: le r%spertoire %s est inaccessible en lecture.\\n\", eacute, filename[i]);\n            else\n                fprintf(stderr, \"Error: directory %s can not be read.\\n\", filename[i]);\n            ret = 1;\n            break;\n         }\n\n         /* add every entry in turn */\n         while ((entry = readdir(dir)) != NULL) {\n            if (strcmp(entry->d_name, \".\") && strcmp(entry->d_name, \"..\")) {\n               strncpy(pathname, filename[i], FILENAME_LENGTH - 1);\n               put_separator(pathname);\n               strncat(pathname, entry->d_name, FILENAME_LENGTH - strlen(pathname) - 1);\n               len = sap_AddFile(sap_file, pathname);\n\n               if (len == 0) {\n                  PrintErrorMessage(sap_errno, pathname);\n                  ret = 1;\n                  break;\n               }\n            }\n         }\n\n         closedir(dir);\n      }\n      else {\n         len = sap_AddFile(sap_file, filename[i]);\n      }\n\n      if (len == 0) {\n         if (ret == 0) {\n            PrintErrorMessage(sap_errno, filename[i]);\n            ret = 1;\n         }\n         break;\n      }\n   }\n\n   sap_CloseArchive(sap_file);\n\n   return ret;\n}\n\n\n\n/* DeleteFile:\n *  Deletes one or more files from the specified archive.\n */\nstatic int DeleteFile(const char sap_name[], char *filename[], int nfiles)\n{\n   int format, i, len, ret = 0;\n   sapID sap_file;\n\n   if ((sap_file=sap_OpenArchive(sap_name, &format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, sap_name);\n      return 1;\n   }\n\n   for (i=0; i<nfiles; i++) {\n      len = sap_DeleteFile(sap_file, filename[i]);\n\n      if (len == 0) {\n         PrintErrorMessage(sap_errno, filename[i]);\n         ret = 1;\n         break;\n      }\n   }\n\n   sap_CloseArchive(sap_file);\n\n   return ret;\n}\n\n\n\n/* CopyArchive:\n *  Copies one or more sectors from the source archive to the dest archive.\n */\nstatic int CopyArchive(const char src_name[], const char dest_name[], int track, int sect)\n{\n   sapsector_t sapsector;\n   sapID src_file, dest_file;\n   int src_format, dest_format, ntracks, s, t;\n\n   if ((src_file=sap_OpenArchive(src_name, &src_format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, src_name);\n      return 1;\n   }\n\n   if ((dest_file=sap_OpenArchive(dest_name, &dest_format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, dest_name);\n      sap_CloseArchive(src_file);\n      return 1;\n   }\n\n   if (src_format != dest_format) {\n      if (is_fr)\n          fprintf(stderr, \"Erreur: archives de format diff%srent.\\n\", eacute);\n      else\n          fprintf(stderr, \"Error: archives have different format.\\n\");\n      goto Error;\n   }\n\n   ntracks = (src_format == SAP_FORMAT1 ? SAP_NTRACKS1 : SAP_NTRACKS2);\n\n   /* check track number */\n   if (track<0) {\n      t = 0;\n      track = ntracks-1;\n   }\n   else {\n      if (track>=ntracks) {\n         if (is_fr)\n             fprintf(stderr, \"Erreur: num%sro de piste invalide.\\n\", eacute);\n         else\n             fprintf(stderr, \"Error: invalid track number.\\n\");\n         goto Error;\n      }\n\n      t = track;\n   }\n\n   /* check sector number */\n   if (sect<0) {\n      s = 1;\n      sect = SAP_NSECTS;\n   }\n   else {\n      if ((sect<1) || (sect>SAP_NSECTS)) {\n         if (is_fr)\n             fprintf(stderr, \"Erreur: num%sro de secteur invalide.\\n\", eacute);\n         else\n             fprintf(stderr, \"Error: invalid sector number.\\n\");\n         goto Error;\n      }\n\n      s = sect;\n   }\n\n   while (t <= track) {\n      while (s <= sect) {\n         sap_ReadSector(src_file, t, s, &sapsector);\n         sap_WriteSector(dest_file, t, s, &sapsector);\n\n         s++;\n      }  /* end of while (s <= sect) */\n\n      s = 1;\n      t++;\n   }  /* end of while (t <= track ) */\n\n   sap_CloseArchive(dest_file);\n   sap_CloseArchive(src_file);\n   return 0;\n\n Error:\n   sap_CloseArchive(src_file);\n   sap_CloseArchive(dest_file);\n   return 1;\n}\n\n\n\n/* MoveSector:\n *  Copies with deplacement one sector from the source archive to the dest archive.\n */\nstatic int MoveSector(const char src_name[], int src_track, int src_sect,\n                        const char dest_name[], int dest_track, int dest_sect)\n{\n   sapsector_t sapsector;\n   sapID src_file, dest_file;\n   int src_format, dest_format, ntracks;\n\n   if ((src_file=sap_OpenArchive(src_name, &src_format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, src_name);\n      return 1;\n   }\n\n   if ((dest_file=sap_OpenArchive(dest_name, &dest_format)) == SAP_ERROR) {\n      PrintErrorMessage(sap_errno, dest_name);\n      sap_CloseArchive(src_file);\n      return 1;\n   }\n\n   if (src_format != dest_format) {\n      if (is_fr)\n          fprintf(stderr, \"Erreur: archives de format diff%srent.\\n\", eacute);\n      else\n          fprintf(stderr, \"Error: archives have different format.\\n\");\n      goto Error;\n   }\n\n   ntracks = (src_format == SAP_FORMAT1 ? SAP_NTRACKS1 : SAP_NTRACKS2);\n\n   /* check track number */\n   if ((src_track<0) || (src_track>=ntracks)) {\n      if (is_fr)\n          fprintf(stderr, \"Erreur: num%sro de piste invalide.\\n\", eacute);\n      else\n          fprintf(stderr, \"Error: invalid track number.\\n\");\n      goto Error;\n   }\n\n   /* check sector number */\n   if ((src_sect<1) || (src_sect>SAP_NSECTS)) {\n      if (is_fr)\n          fprintf(stderr, \"Erreur: num%sro de secteur invalide.\\n\", eacute);\n      else\n          fprintf(stderr, \"Error: invalid sector number.\\n\");\n      goto Error;\n   }\n\n   /* check track number */\n   if ((dest_track<0) || (dest_track>=ntracks)) {\n      if (is_fr)\n          fprintf(stderr, \"Erreur: num%sro de piste invalide.\\n\", eacute);\n      else\n          fprintf(stderr, \"Error: invalid track number.\\n\");\n      goto Error;\n   }\n\n   /* check sector number */\n   if ((dest_sect<1) || (dest_sect>SAP_NSECTS)) {\n      if (is_fr)\n          fprintf(stderr, \"Erreur: num%sro de secteur invalide.\\n\", eacute);\n      else\n          fprintf(stderr, \"Error: invalid sector number.\\n\");\n      goto Error;\n   }\n\n   sap_ReadSector(src_file, src_track, src_sect, &sapsector);\n\n   sapsector.track = dest_track;\n   sapsector.sector = dest_sect;\n\n   sap_WriteSector(dest_file, dest_track, dest_sect, &sapsector);\n\n   sap_CloseArchive(src_file);\n   sap_CloseArchive(dest_file);\n   return 0;\n\n Error:\n   sap_CloseArchive(src_file);\n   sap_CloseArchive(dest_file);\n   return 1;\n}\n\n\n#define COMMAND_MAX  14\n\nstatic char *short_command[] = { \"-h\", \"-v\", \"-c\", \"-f\", \"-w\", \"-u\",\n                                 \"-t\", \"-i\", \"-x\", \"-y\", \"-a\", \"-d\", \"-k\", \"-m\" };\nstatic char *long_command[] = { \"--help\", \"--version\", \"--create\", \"--format\", \"--verify\", \"--dump\",\n                                \"--list\", \"--info\", \"--extract\", \"--extract-all\", \"--add\", \"--delete\",\n                                \"--copy\", \"--move\" };\n\n\n/* usage:\n *  Displays the commands and quits.\n */\nstatic void usage(const char prog_name[])\n{\n   fprintf(stderr, \"Usage: %s -h --help | -v --version | -c --create |  -f --format\\n\", prog_name);\n   fprintf(stderr, \"               -w --verify | -d --dump | -t --list | -i --info\\n\");\n   fprintf(stderr, \"               -x --extract[-all] | -a --add | -d --delete\\n\");\n   exit(EXIT_FAILURE);\n}\n\n\n\n/* main:\n *  Entry point for the program.\n */\nint main(int argc, char *argv[])\n{\n   int i, ret = 0;\n   char *star = \"*\";\n\n#ifdef DJGPP\n#ifdef FRENCH_LANGUAGE\n    is_fr = 1;\n#else\n    is_fr = 0;\n#endif\n#else\n    char *lang=getenv(\"LANG\");\n    if (lang==NULL) lang=\"fr_FR\";\n    //setlocale(LC_ALL, \"fr_FR.UTF8\");\n    if (strncmp(lang,\"fr\",2)==0)\n        is_fr=-1;\n    else\n        is_fr=0;\n#endif\n   if (argc < 2)  /* no argument? */\n      usage(argv[0]);\n\n   if (argv[1][0] == '-') {\n\n      switch (argv[1][1]) {\n\n         case '-':  /* long commands */\n            for (i=0; i<COMMAND_MAX; i++) {\n               if (strcmp(argv[1], long_command[i]) == 0) {\n                  argv[1] = short_command[i];\n                  return main(argc, argv);\n               }\n            }\n\n            usage(argv[0]);\n            break;\n\n         case 'h':  /* help */\n            if (is_fr)\n            {\n                printf(\"SAPfs est un outil de manipulation des archives SAP qui permet de r%saliser\\n\", eacute);\n                printf(\"sur ces archives les op%srations naturelles d'un syst%sme de fichiers.\\n\\n\", eacute, egrave);\n                printf(\"Usage:\\n\");\n                printf(\"    %s commande1 archive.sap [fichier...] [piste] [sect]\\n\", argv[0]);\n                printf(\"    %s commande2 archive.sap [nb pistes] [densit%s]\\n\", argv[0], eacute);\n                printf(\"    %s commande3 archive.sap archive2.sap [piste] [sect]\\n\", argv[0]);\n                printf(\"    %s commande4 archive1.sap piste sect archive2.sap piste sect\\n\", argv[0]);\n                printf(\"o%s la commande1 est prise parmi les suivantes:\\n\", ugrave);\n                printf(\"  -h, --help          affiche cette aide\\n\");\n                printf(\"  -v, --version       affiche la version du programme\\n\");\n                printf(\"  -w, --verify        effectue une v%srification d'un ou plusieurs secteurs\\n\", eacute);\n                printf(\"  -u, --dump          affiche le contenu d'un ou plusieurs secteurs\\n\");\n                printf(\"  -t, --list          affiche la liste des fichiers de l'archive SAP\\n\");\n                printf(\"  -i, --info          affiche les informations relatives %s un fichier\\n\", agrave);\n                printf(\"  -x, --extract       extrait un ou plusieurs fichiers de l'achive SAP\\n\");\n                printf(\"      --extract-all   extrait tous les fichiers de l'archive SAP\\n\");\n                printf(\"  -a, --add           ajoute un ou plusieurs fichiers %s l'archive SAP\\n\", agrave);\n                printf(\"  -d, --delete        d%struit un ou plusieurs fichiers de l'archive SAP\\n\", eacute);\n                printf(\"et o%s la commande2 est prise parmi les suivantes:\\n\", ugrave);\n                printf(\"  -c, --create        cr%se une archive SAP vide\\n\", eacute);\n                printf(\"  -f, --format        formate une archive SAP\\n\");\n                printf(\"et o%s la commande3 est prise parmi les suivantes:\\n\", ugrave);\n                printf(\"  -k, --copy          copie un ou plusieurs secteurs\\n\");\n                printf(\"et o%s la commande4 est prise parmi les suivantes:\\n\", ugrave);\n                printf(\"  -m, --move          copie un secteur avec d%splacement\\n\", eacute);\n            }\n            else\n            {\n                printf(\"SAPfs is a tool to manage SAP archives which allows you to\\n\");\n                printf(\"operate on those archives like a standard file system.\\n\\n\");\n                printf(\"Usage:\\n\");\n                printf(\"    %s command1 archive.sap [file...] [track] [sector]\\n\", argv[0]);\n                printf(\"    %s command2 archive.sap [nb tracks] [density]\\n\", argv[0]);\n                printf(\"    %s command3 archive.sap archive2.sap [track] [sector]\\n\", argv[0]);\n                printf(\"    %s command4 archive1.sap track sector archive2.sap track sector\\n\", argv[0]);\n                printf(\"where commande1 is one of the following:\\n\");\n                printf(\"  -h, --help          display this help\\n\");\n                printf(\"  -v, --version       display the program version\\n\");\n                printf(\"  -w, --verify        verify one sector and more\\n\");\n                printf(\"  -u, --dump          display the contents of one sector and more\\n\");\n                printf(\"  -t, --list          display the file list of SAP archive\\n\");\n                printf(\"  -i, --info          display file informations\\n\");\n                printf(\"  -x, --extract       extract one file or more frome SAP archive\\n\");\n                printf(\"      --extract-all   extract all files from SAP archive\\n\");\n                printf(\"  -a, --add           add one file or more to SAP archive\\n\");\n                printf(\"  -d, --delete        delete one file or more of SAP archive\\n\");\n                printf(\"and where command2 is one of the following:\\n\");\n                printf(\"  -c, --create        create an empty SAP archive\\n\");\n                printf(\"  -f, --format        format a SAP archive\\n\");\n                printf(\"and where commande3 is one of the following:\\n\");\n                printf(\"  -k, --copy          copy one sector or more\\n\");\n                printf(\"and where commande4 is one of the following:\\n\");\n                printf(\"  -m, --move          copy and move a sector\\n\");\n            }\n            break;\n\n         case 'v':  /* version */\n            if (is_fr)\n                printf(\"SAPfs version \"SAPFS_VERSION_STR\" pour \"SAPFS_PLATFORM_STR\", copyright (C) 2001-2003 Eric Botcazou.\\n\");\n            else\n                printf(\"SAPfs version \"SAPFS_VERSION_STR\" for \"SAPFS_PLATFORM_STR\", copyright (C) 2001-2003 Eric Botcazou.\\n\");\n            break;\n\n         case 'c':  /* create */\n            if (argc < 3)\n               usage(argv[0]);\n\n            if (argc < 4) {\n               ret = CreateEmptyArchive(argv[2], SAP_FORMAT1, SAP_TRK80);\n            }\n            else if (argc == 4){\n               if (atoi(argv[3]) == 40)\n                  ret = CreateEmptyArchive(argv[2], SAP_FORMAT1, SAP_TRK40);\n               else if (atoi(argv[3]) == 80)\n                  ret = CreateEmptyArchive(argv[2], SAP_FORMAT1, SAP_TRK80);\n               else\n                  ret = 1;\n            }\n            else {\n               if (atoi(argv[3]) == 40)\n                  ret = CreateEmptyArchive(argv[2], (atoi(argv[4]) == 1 ? SAP_FORMAT2 : SAP_FORMAT1), SAP_TRK40);\n               else if (atoi(argv[3]) == 80)\n                  ret = CreateEmptyArchive(argv[2], (atoi(argv[4]) == 1 ? SAP_FORMAT2 : SAP_FORMAT1), SAP_TRK80);\n               else\n                  ret = 1;\n            }\n            break;\n\n         case 'f':  /* format */\n            if (argc < 3)\n               usage(argv[0]);\n\n            if (argc < 4) {\n               ret = FormatArchive(argv[2], SAP_TRK80);\n            }\n            else {\n               if (atoi(argv[3]) == 80)\n                  ret = FormatArchive(argv[2], SAP_TRK80);\n               else if (atoi(argv[3]) == 40)\n                  ret = FormatArchive(argv[2], SAP_TRK40);\n               else\n                  ret = 1;\n            }\n            break;\n\n         case 'w':  /* verify */\n            if (argc < 3)\n               usage(argv[0]);\n\n            if (argc < 4)\n               ret = VerifyArchive(argv[2], -1, -1);\n            else if (argc < 5)\n               ret = VerifyArchive(argv[2], atoi(argv[3]), -1);\n            else\n               ret = VerifyArchive(argv[2], atoi(argv[3]), atoi(argv[4]));\n            break;\n\n\n         case 'u':  /* dump */\n            if (argc < 3)\n               usage(argv[0]);\n\n            if (argc < 4)\n               ret = DumpArchive(argv[2], -1, -1);\n            else if (argc < 5)\n               ret = DumpArchive(argv[2], atoi(argv[3]), -1);\n            else\n               ret = DumpArchive(argv[2], atoi(argv[3]), atoi(argv[4]));\n            break;\n\n         case 't':  /* list */\n            if (argc < 3)\n               usage(argv[0]);\n\n            ret = ListArchive(argv[2]);\n            break;\n\n         case 'i':  /* info */\n            if (argc < 4)\n               usage(argv[0]);\n\n            ret = PrintFileInfo(argv[2], argv[3]);\n            break;\n\n         case 'x':  /* extract */\n            if (argc < 4)\n               usage(argv[0]);\n\n            ret = ExtractFile(argv[2], argv+3, argc-3);\n            break;\n\n         case 'y':  /* extract all */\n            if (argc < 3)\n               usage(argv[0]);\n\n            ret = ExtractFile(argv[2], &star, 1);\n            break;\n\n         case 'a':  /* add */\n            if (argc < 4)\n               usage(argv[0]);\n\n            ret = AddFile(argv[2], argv+3, argc-3);\n            break;\n\n         case 'd':  /* delete */\n            if (argc < 4)\n               usage(argv[0]);\n\n            ret = DeleteFile(argv[2], argv+3, argc-3);\n            break;\n\n         case 'k':  /* copy */\n            if (argc < 4)\n               usage(argv[0]);\n\n            if (argc < 5)\n               ret = CopyArchive(argv[2], argv[3], -1, -1);\n            else if (argc < 6)\n               ret = CopyArchive(argv[2], argv[3], atoi(argv[4]), -1);\n            else\n               ret = CopyArchive(argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));\n            break;\n\n         case 'm':  /* move */\n            if (argc != 8)\n               usage(argv[0]);\n\n            ret = MoveSector(argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]), atoi(argv[7]));\n            break;\n\n         default:\n            usage(argv[0]);\n      }  /* end of switch */\n   }\n\n   return ret;\n}\n\n"
  },
  {
    "path": "tools/cmoc/to7/k7tools/getmemo7.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifndef DJGPP\n#    include <locale.h>\n#endif\n\nint tab[4]={0xff,0x01,0x03c,0x01};\n\nFILE *fw,*fr;\nint noct;\nstatic int is_fr=0;\n\n/* ugly hack to support French accents */\n#ifdef DJGPP\nstatic char ucirc[] = \"\";\nstatic char agrave[] = \"\";\nstatic char eacute[] = \"\";\nstatic char ecirc[]  = \"\";\n#else\nstatic char ucirc[] = \"û\";\nstatic char agrave[] = \"à\";\nstatic char eacute[] = \"é\";\nstatic char ecirc[]  = \"ê\";\n#endif\n\nint mygetc(void)\n{\n    int a=fgetc(fr);\n\n    if (a==EOF)\n    {\n        printf(is_fr?\"erreur : fichier source incomplet\\n\":\"error : incomplete source file\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    return a&255;\n}\n\n\nint myputc(int a)\n{\n    fputc(a,fw);\n\n    noct++;\n\n    if (noct==0x4000)\n    {\n         fclose(fw);\n         printf(\"ok\\n\");\n         exit(EXIT_SUCCESS);\n    }\n\n    return 0;\n}\n\n\nint main(int argc,char **argv)\n{\n    int i,step;\n    int c,n;\n    char buf[256];\n\n#ifdef DJGPP\n#ifdef FRENCH_LANGUAGE\n    is_fr = 1;\n#else\n    is_fr = 0;\n#endif\n#else\n    char *lang=getenv(\"LANG\");\n    if (lang==NULL) lang=\"fr_FR\";        \n    setlocale(LC_ALL, \"fr_FR.UTF8\");    \n    if (strncmp(lang,\"fr\",2)==0) \n        is_fr=-1;\n#endif\n\n    if (is_fr)\n    {\n        printf(\"GetMemo7 1.0 par Sylvain HUET\\n\");\n        printf(\"R%scuperation d'une cartouche Memo7 %s partir d'un fichier .k7\\n\",eacute,agrave);\n        printf(\"La cartouche a d%s %stre sauvegard%se par : SAVEM\\\"MEMO7\\\",0,&H3FFF,0\\n\\n\",ucirc,ecirc,eacute);\n    }\n    else\n    {\n        printf(\"GetMemo7 1.0 by Sylvain HUET\\n\");\n        printf(\"Get a memo7 cartridge from a k7 file\\n\");\n        printf(\"Cartridge must have been saved by : SAVEM\\\"MEMO7\\\",0,&H3FFF,0\\n\\n\");\n    }\n\n    if ((argc<2)\n      ||((strcmp(\".k7\",&argv[1][strlen(argv[1])-3]))\n          &&(strcmp(\".K7\",&argv[1][strlen(argv[1])-3]))))\n    {\n        printf(is_fr?\"usage : getmemo7 fichier.k7\\n\":\"usage : getmemo7 file.k7\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    strcpy(buf,argv[1]);\n    strcpy(&buf[strlen(buf)-3],\".rom\");\n\n    if (is_fr)\n        printf(\"ouverture de %s\\n\",argv[1]);\n    else\n        printf(\"open %s\\n\",argv[1]);\n    \n\n    if ((fr=fopen(argv[1],\"rb\"))==NULL)\n    {\n        printf(is_fr?\"fichier introuvable\\n\":\"file not found\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    if (is_fr)\n        printf(\"%scriture de %s\\n\",eacute,buf);\n    else\n        printf(\"write %s\\n\",buf);\n\n    if ((fw=fopen(buf,\"wb\"))==NULL)\n    {\n        if (is_fr)\n            printf(\"%scriture impossible\\n\",eacute);\n        else\n            printf(\"can't write\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    noct=0;\n    step=0;\n\n    while (1)\n    {\n        c=mygetc();\n\n        if (c==tab[step])\n            step++;\n        else if (c==tab[0])\n            step=1;\n        else step=0;\n\n        if (step==4)\n        {\n            n=mygetc();\n            if (noct==0)\n            {\n                for(i=0;i<5;i++) mygetc();\n                for(i=0;i<n-5;i++) myputc(mygetc());\n            }\n            else\n                for(i=0;i<n;i++) myputc(mygetc());\n\n            step=0;\n        }\n    }\n\n    exit(EXIT_SUCCESS);\n}\n\n"
  },
  {
    "path": "tools/cmoc/to7/k7tools/getrom.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifndef DJGPP\n#    include <locale.h>\n#endif\n\n/* ugly hack to support French accents */\n#ifdef DJGPP\nstatic char ucirc[] = \"\";\nstatic char agrave[] = \"\";\nstatic char eacute[] = \"\";\nstatic char ecirc[]  = \"\";\n#else\nstatic char ucirc[] = \"û\";\nstatic char agrave[] = \"à\";\nstatic char eacute[] = \"é\";\nstatic char ecirc[]  = \"ê\";\n#endif\n\nint tab[4]={0xff,0x01,0x03c,0x01};\n\nFILE *fw,*fr;\nint noct;\nstatic int is_fr=0;\n\n\nint mygetc()\n{\n    int a=fgetc(fr);\n\n    if (a==EOF)\n    {\n        printf(is_fr?\"erreur : fichier source incomplet\\n\":\"error : incomplete source file\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    return a&255;\n}\n\n\nint myputc(int a)\n{\n    fputc(a,fw);\n\n    noct++;\n\n    if (noct==0x1800)\n    {\n        fclose(fw);\n        printf(\"ok\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    return 0;\n}\n\n\nint main(int argc,char **argv)\n{\n    int i,step;\n    int c,n;\n    char buf[256];\n\n#ifdef DJGPP\n#ifdef FRENCH_LANGUAGE\n    is_fr = 1;\n#else\n    is_fr = 0;\n#endif\n#else\n    char *lang=getenv(\"LANG\");\n    if (lang==NULL) lang=\"fr_FR\";        \n    setlocale(LC_ALL, \"fr_FR.UTF8\");    \n    if (strncmp(lang,\"fr\",2)==0) \n        is_fr=-1;\n#endif\n\n    if (is_fr)\n    {\n        printf(\"GetROM 1.0 par Sylvain HUET\\n\");\n        printf(\"R%scuperation de la ROM du TO7 %s partir d'un fichier .k7\\n\",eacute,agrave);\n        printf(\"La ROM a d%s %stre sauvegard%se par : SAVEM\\\"ROM\\\",&HE800,&HFFFF,0\\n\\n\",ucirc,ecirc,eacute);\n    }\n    else\n    {\n        printf(\"GetROM 1.0 by Sylvain HUET\\n\");\n        printf(\"Get the ROM of a TO7 from a k7 file\\n\");\n        printf(\"The ROM must have been saved by : SAVEM\\\"ROM\\\",&HE800,&HFFFF,0\\n\\n\");\n    }\n\n    if ((argc<2)\n      ||((strcmp(\".k7\",&argv[1][strlen(argv[1])-3]))\n          &&(strcmp(\".K7\",&argv[1][strlen(argv[1])-3]))))\n    {\n        printf(is_fr?\"usage : getrom fichier.k7\\n\":\"usage : getrom file.k7\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    strcpy(buf,argv[1]);\n    strcpy(&buf[strlen(buf)-3],\".rom\");\n\n    if (is_fr)\n        printf(\"ouverture de %s\\n\",argv[1]);\n    else\n        printf(\"open %s\\n\",argv[1]);\n\n    if ((fr=fopen(argv[1],\"rb\"))==NULL)\n    {\n        printf(is_fr?\"fichier introuvable\\n\":\"file not found\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    if (is_fr)\n        printf(\"%scriture de %s\\n\",eacute,buf);\n    else\n        printf(\"write %s\\n\",buf);\n\n    if ((fw=fopen(buf,\"wb\"))==NULL)\n    {\n        if (is_fr)\n            printf(\"%scriture impossible\\n\",eacute);\n        else\n            printf(\"can't write\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    noct=0;\n    step=0;\n\n    while (1)\n    {\n        c=mygetc();\n        if (c==tab[step])\n            step++;\n        else if (c==tab[0])\n            step=1;\n        else step=0;\n\n        if (step==4)\n        {\n            n=mygetc();\n            if (noct==0)\n            {\n                for(i=0;i<5;i++) mygetc();\n                for(i=0;i<n-5;i++) myputc(mygetc());\n            }\n            else\n                for(i=0;i<n;i++) myputc(mygetc());\n\n            step=0;\n        }\n    }\n\n    exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "tools/cmoc/to7/k7tools/makefile",
    "content": "#\r\n#  Makefile for building getmemo7, getrom and wav2k7.\r\n#\r\n#  Available options:\r\n#\r\n#     Environment variables:\r\n#        FRENCH=1          (by default) create a french build (djgpp only).\r\n#        ENGLISH=1         create an english build (djgpp only).\r\n#\r\n#     Targets: \r\n#        all:              build executables files\r\n#        clean:            remove objects and executable files.\r\n#\r\n\r\nifdef DJDIR\r\n\r\ninclude makefile.dj\r\n\r\nelse\r\n\r\ninclude makefile.lnx\r\n\r\nendif\r\n"
  },
  {
    "path": "tools/cmoc/to7/k7tools/makefile.dj",
    "content": "##################\n# compiler flags #\n##################\n\nCC = gcc\n\nWFLAGS = -Wall\n\nOFLAGS = -O2\n\nCFLAGS = $(WFLAGS) $(OFLAGS)\n\nmsdos = 1\n\nifdef ENGLISH\n    CFLAGS += -DENGLISH_LANGUAGE\nelse\n    CFLAGS += -DFRENCH_LANGUAGE\nendif\n\n################\n# target rules #\n################\n\n.PHONY: all clean\n\nall: getmemo7.exe getrom.exe wav2k7.exe\n\ngetmemo7.exe: getmemo7.c\n\t$(CC) -s $(CFLAGS) -o getmemo7.exe getmemo7.c\n\ngetrom.exe: getrom.c\n\t$(CC) -s $(CFLAGS) -o getrom.exe getrom.c\n\nwav2k7.exe: wav2k7.c\n\t$(CC) -s $(CFLAGS) -o wav2k7.exe wav2k7.c\n\nclean:\n\tif exist getmemo7.exe del getmemo7.exe\n\tif exist getrom.exe del getrom.exe\n\tif exist wav2k7.exe del wav2k7.exe\n"
  },
  {
    "path": "tools/cmoc/to7/k7tools/makefile.lnx",
    "content": "##################\n# compiler flags #\n##################\n\n# default to gcc compiler\nifeq (default,$(origin CC))\n  CC = gcc\nendif\n\nWFLAGS = -Wall\n\nOFLAGS = -O2\n\nCFLAGS += $(WFLAGS)\nCFLAGS += $(OFLAGS)\n\nLDFLAGS += -s\n\nlinux = 1\n\n################\n# target rules #\n################\n\nBINARIES = getmemo7 getrom wav2k7\n\n.PHONY: all clean\n\nall: $(BINARIES)\n\nclean:\n\t$(RM) $(BINARIES)\n"
  },
  {
    "path": "tools/cmoc/to7/k7tools/readme.txt",
    "content": "\nVoir la documentation pour plus d'informations\n\nSee the documentation for more informations\n"
  },
  {
    "path": "tools/cmoc/to7/k7tools/wav2k7.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifndef DJGPP\n#    include <locale.h>\n#endif\n\n/* ugly hack to support French accents */\n#ifdef DJGPP\nstatic char eacute[] = \"‚\";\n#else\nstatic char eacute[] = \"Ã©\";\n#endif\n\nstatic int is_fr=0;\n\n\nint mygetc(FILE *f)\n{\n  if (fgetc(f)==EOF) return EOF;\n  return fgetc(f);\n}\t\n\nint myputc(int c,FILE *f)\n{\n  return fputc(c,f);\n}\t\n\nint main(int argc, char **argv)\n{\n  FILE *fp,*fw;\n  int i,l;\n  int a,b,c;\n  int octet;\n  int actuel;\n  int state,k=0;\n  int j;\n  int tampon;\n  char *filename;\n  char outputname[1024];\n  \n#ifdef DJGPP\n#ifdef FRENCH_LANGUAGE\n    is_fr = 1;\n#else\n    is_fr = 0;\n#endif\n#else\n    char *lang=getenv(\"LANG\");\n    if (lang==NULL) lang=\"fr_FR\";        \n    setlocale(LC_ALL, \"fr_FR.UTF8\");    \n    if (strncmp(lang,\"fr\",2)==0) \n        is_fr=-1;\n#endif\n\n  printf(\"conversion .wav 44,1KHz -> .k7 to7\\n\");\n  printf(\"version 2.1\\n\");\n  \n  if (argc<2)\n    {\n      printf(is_fr?\"usage :  wav2k7 fichier.wav\\n\":\"usage :  wav2k7 file.wav\\n\");\n      printf(\"usage : wav2k7 fichier.wav\\n\");\n      return 0;\n    }\n  filename=argv[1];\n\n  l=strlen(filename)-4;\n  \n  if ((l<1)||((strcmp(&filename[l],\".wav\"))&&(strcmp(&filename[l],\".WAV\"))))\n    {\n      printf(is_fr?\"usage : mauvais format\\n\":\"usage : bad format\\n\");\n      return 0;\n    }\n  \n    if (is_fr)\n        printf(\"ouverture de %s\\n\",filename);\n    else\n        printf(\"open %s\\n\",filename);\n\n\n  fp=fopen(filename,\"rb\");\n  if (fp==NULL)\n    {\n      printf(is_fr?\"fichier introuvable\\n\":\"file not found\\n\");\n      return 0;\n    }\n  \n  strcpy(outputname,filename);\n  strcpy(outputname+l,\".k7\\0\");\n\n    if (is_fr)\n        printf(\"cr%sation de %s\\n\",eacute,outputname);\n    else\n        printf(\"creation of %s\\n\",outputname);\n\n  fw=fopen(outputname,\"wb\");\n  if (fw==NULL)\n    {\n        if (is_fr)\n            printf(\"%scriture impossible\\n\",eacute);\n        else\n            printf(\"can't write\\n\");\n        return 0;\n    }\n  \n  for(i=0;i<44;i++) fgetc(fp);\n  \n  \n  a=mygetc(fp);\n  b=mygetc(fp);\n  l=0;\n  i=0;\n  \n  tampon=0;\n  j=0;\n  \n  octet=-1;\n  actuel=1;\n  state=0; \n  /* 0:attente de 0, 1:1ere boucle, 2: lecture de l'octet, 3:2e boucle */\n  while(1)\n    {\n      if (tampon==0)\n        {\n          do\n            {\n              if ((c=mygetc(fp))==EOF)\n                {\n                  fclose(fp);\n                  fclose(fw);\n                  return 0;\n                }\t\n              i++;\n              tampon++;\n                \n                if ((b>=a)&&(b>c))\n                  {\n                    if (i==3) actuel=1;\n                    if ((i==4)&&(l==4)) actuel=1;\n                    if ((i==5)||(i==6)) actuel=0;\n                    if (i>6) actuel=1;\n                    l=i;\n                    i=0;\n                  }\n              a=b; b=c;\n            }\n          while(i);\n        }\n      tampon--;\n      \n      switch(state) \n        {\n        case 0:\n          k=0;\n          if (actuel==0) state=1;\n          break;\n        case 1:\n          k++;\n          if (k==12)\n            {\n              k=0;\n              octet=256;\n              if (actuel==0) state=2;\n              else state=0;\n            }\n          break;\n        case 2:\n          k++;\n          if ((k==24)||(k==49))\n            {\n              octet=(octet>>1)+256*actuel;\n              if (octet&1)\n                {\t\n                  octet>>=1;\n                  myputc(octet,fw);\n                  k=0;\n                  state=3;\n                  j++;\n                }\n            }\n          if (k==49) k=0;\n          break;\n        case 3:\n          k++;\n          if (k==24) state=0;\n          break;\n        } \n    } \n}\n"
  },
  {
    "path": "tools/cpm/imd118sc/ANY2IMD.C",
    "content": "/*\r\n * ANY2IMD - Any format to ImageDisk .IMD via floppy write/read\r\n *\r\n * A simple way to convert ANY image type to .IMD format is to simply write\r\n * the image to a floppy disk using whatever tool was designed for that\r\n * purpose, and then read it back with ImageDisk. This works, however it\r\n * gets tedious because you need to run both the disk-creator and ImageDisk\r\n * separately for each file  you wish to convert, entering the filename twice\r\n * (once for each program), and noting and re-entering the comment field.\r\n *\r\n * ANY2IMD simplifies this process process by building a list of files of\r\n * the foreign image type and automatically entering the names into the\r\n * programs, as well as capturing the comment field displayed by the\r\n * foreign imaging program and entering it into the .IMD file.\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. This source\r\n * code is provided for informational purposes only, and I provide no\r\n * support for it, technical or otherwise.\r\n *\r\n * Copyright 2007-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, however this is\r\n * for the purpose of keeping a say in it's disposition. I encourage the\r\n * use of ideas, algorithms and code fragments contained herein to be used\r\n * in the creation of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include <keys.h>\r\n#include \"version.h\"\r\n\r\n#define\tTICK\tpeekw(0x40,0x6C)\r\n\r\n#define\tENTER\t0x1C0D\t\t\t\t// Scancode for ENTER key\r\n#define\tSPACE\t0x3920\t\t\t\t// Scancode for SPACE key\r\n#define\tESC\t\t0x011B\t\t\t\t// Scancode for ESC   key\r\n\r\nunsigned\r\n\tX,\t\t\t\t\t\t\t\t// Current screen X position\r\n\tY,\t\t\t\t\t\t\t\t// Current screen Y position\r\n\tC,\t\t\t\t\t\t\t\t// Input character\r\n\tVseg = 0xB800,\t\t\t\t\t// Video segment (Assumes COLOR)\r\n\tTimer,\t\t\t\t\t\t\t// Active timer\r\n\tPtop,\t\t\t\t\t\t\t// Top of string pool\r\n\tFcount,\t\t\t\t\t\t\t// Count of files\r\n\tFcurrent,\t\t\t\t\t\t// Current file\r\n\tscrbuf[25][80];\t\t\t\t\t// Screen save buffer\r\n\r\nint\r\n\tCx=0,\t\t\t\t\t\t\t// Capture X position\r\n\tCy=0,\t\t\t\t\t\t\t// Capture Y position\r\n\tCw=50,\t\t\t\t\t\t\t// Capture Width\r\n\tCh=10,\t\t\t\t\t\t\t// Capture Height\r\n\tFx = -1,\t\t\t\t\t\t// File display X position\r\n\tFy = -1;\t\t\t\t\t\t// File display Y position\r\n\r\nFILE\r\n\t*fp;\r\n\r\nunsigned char\r\n\tImd,\t\t\t\t\t\t\t// IMD is active (reading disk)\r\n\tPrompt = 255,\t\t\t\t\t// Prompt for operation\r\n\tDidcap,\t\t\t\t\t\t\t// Capture was performed\r\n\tFflag,\t\t\t\t\t\t\t// Filename update flag\r\n\tSactive,\t\t\t\t\t\t// Script is active flag\r\n\t*Sptr,\t\t\t\t\t\t\t// Script pointer\r\n\t*Fptr,\t\t\t\t\t\t\t// Active filename pointer\r\n\t*ptr,\t\t\t\t\t\t\t// General pointer\r\n\t*Iname = \"ANY2IMD\",\t\t\t\t// .INI filename\r\n\tKdel,\t\t\t\t\t\t\t// Key delay\r\n\tWcmd[129],\t\t\t\t\t\t// Write executable command\r\n\tRcmd[129],\t\t\t\t\t\t// Read  executable command\r\n\tTail[128],\t\t\t\t\t\t// Command execution tail\r\n\tWscript[129],\t\t\t\t\t// Write script\r\n\tRscript[129],\t\t\t\t\t// Read  script\r\n\tpool[4096],\t\t\t\t\t\t// Filename storage pool\r\n\tcapbuf[2107];\t\t\t\t\t// Video capture buffer\r\n\r\n// Prefix codes for \"ALPHA\" keys\r\nchar alpha_prefix[] = {\r\n\t0x1E, 0x30, 0x2E, 0x20, 0x12, 0x21, 0x22, 0x23, 0x17, 0x24,\r\n\t0x25, 0x26, 0x32, 0x31, 0x18, 0x19, 0x10, 0x13, 0x1F, 0x14,\r\n\t0x16, 0x2F, 0x11, 0x2D, 0x15, 0x2C };\r\n\r\n// Codes for misc. ASCII keys\r\nunsigned ascii_prefix[] = {\r\n\t0x3920, 0x0231, 0x0332, 0x0433, 0x0534, 0x0635, 0x0736, 0x0837,\r\n\t0x0938, 0x0A39, 0x0B30, 0x0C2D, 0x0D3D, 0x2B5C, 0x297E, 0x0221,\r\n\t0x0340, 0x0423, 0x0524, 0x0625, 0x0826, 0x092A, 0x0A28, 0x0B29,\r\n\t0x0C5F, 0x0D2B, 0x2B7C, 0x1A5B, 0x1B5D, 0x273B, 0x2827, 0x332C,\r\n\t0x342E, 0x352F, 0x1A7B, 0x1B7D, 0x273A, 0x2822, 0x333C, 0x343E,\r\n\t0x353F, 0x2960, 0x075E,\t0 };\r\n\r\n// Names for special keys\r\nunsigned key_names[] = {\r\n\t'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F0',\t\t// 80-89\r\n\t'S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9', 'S0',\t\t// 8A-93\r\n\t'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C0',\t\t// 94-9D\r\n\t'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A0',\t\t// 9E-A7\r\n\t'EN', 'BS', 'TB', 'BT',\t\t\t\t\t\t\t\t\t\t\t// A8-AB\r\n\t'ES', 'IN', 'DL', 'K+', 'K-',\t\t\t\t\t\t\t\t\t// AC-B0\r\n\t'LA', 'RA', 'UA', 'DA',\t\t\t\t\t\t\t\t\t\t\t// B1-B4\r\n\t'HO', 'EN', 'PU', 'PD',\t\t\t\t\t\t\t\t\t\t\t// B5-B8\r\n\t0 };\r\n\r\n// Key codes not easily calculated from table position\r\nunsigned misc_code[] = {\r\n\t0x1C0D, 0x0E08, 0x0F09, 0x0F00,\t\t\t// Enter, Backspace, Tab, Backtab\r\n\t0x011B, 0x5200, 0x5300, 0x4E2b, 0x4A2D,\t// Esc, Ins, Del, Key+, Key-\r\n\t0x4B00, 0x4D00, 0x4800, 0x5000,\t\t\t// Left, Right, Up, Down\r\n\t0x4700, 0x4F00, 0x4900, 0x5100 };\t\t// Home, End, PgUp, PgDn\r\n#define\tNUM_MISC\t17\r\n\r\n/*\r\n * Locate extension for a filename\r\n */\r\nunsigned char *findext(unsigned char *source)\r\n{\r\n\tunsigned char *p;\r\n\tunsigned char d;\r\n\td = 0;\r\n\tfor(;;) switch(*source++) {\r\n\t\tcase 0   : return d ? p : 0;\r\n\t\tcase '.' : d = 255; p = source; continue;\r\n\t\tcase ':' :\r\n\t\tcase '\\\\': d = 0; }\r\n}\r\n\r\n/*\r\n * Get a value element from the command option\r\n */\r\nunsigned getvalue(unsigned char e)\r\n{\r\n\tunsigned v, c;\r\n\tunsigned char *p;\r\n\tp = ptr;\r\n\tv = 0;\r\n\tdo {\r\n\t\tif(isspace(c = *ptr++))\r\n\t\t\tcontinue;\r\n\t\tif((c -= '0') > 9) {\r\n\t\t\tprintf(\"Bad number: %s\\n\", p);\r\n\t\t\texit(-1); }\r\n\t\tv = (v * 10) + c; }\r\n\twhile(*ptr != e);\r\n\tif(e)\r\n\t\t++ptr;\r\n\treturn v;\r\n}\r\n\r\n/*\r\n * Process command argument\r\n */\r\nvoid command_option(void)\r\n{\r\n\tunsigned i, v;\r\n\tunsigned char *p, c, name[13];\r\n\r\n\tv = (toupper(*ptr++) << 8) | toupper(*ptr++);\r\n\r\n\t// Check for double-character options\r\n\tif(*ptr++ == '=') switch(v) {\r\n\t\tdefault:\r\n\t\t\tprintf(\"Bad option: %s\\n\", ptr-3);\r\n\t\t\texit(-1);\r\n\t\tcase 'CC' :\r\n\t\t\tCx = getvalue(',');\r\n\t\t\tCy = getvalue(',');\r\n\t\t\tCw = getvalue(',');\r\n\t\t\tCh = getvalue(0);\r\n\t\t\treturn;\r\n\t\tcase 'FD' :\r\n\t\t\tFx = getvalue(',');\r\n\t\t\tFy = getvalue(0);\r\n\t\t\treturn;\r\n\t\tcase 'WE' : memset(Wcmd, 0, sizeof(Wcmd)); strcpy(Wcmd, ptr);\treturn;\r\n\t\tcase 'RE' : memset(Rcmd, 0, sizeof(Rcmd)); strcpy(Rcmd, ptr);\treturn;\r\n\t\tcase 'WS' : p = Wscript;\t\t\tgoto dokey;\r\n\t\tcase 'RS' : p = Rscript;\t\t\tdokey:\r\n\t\t\tdo {\r\n\t\t\t\tif((c = *ptr++) == '~') {\t\t\t// Lead-in\r\n\t\t\t\t\tif((v = *ptr++) != '~') {\t\t// Special command\r\n\t\t\t\t\t\tswitch(v = (toupper(v) << 8) | toupper(*ptr++)) {\r\n\t\t\t\t\t\tcase 'WA' :\r\n\t\t\t\t\t\t\tc = getvalue(';') / 55;\r\n\t\t\t\t\t\t\t*p++ = 0xF0;\r\n\t\t\t\t\t\t\tgoto found;\r\n\t\t\t\t\t\tcase 'FN' :\tc = 0xF1; goto found;\r\n\t\t\t\t\t\tcase 'CC' : c = 0xF2; goto found;\r\n\t\t\t\t\t\tcase 'ST' : c = 0xF3; goto found; }\r\n\t\t\t\t\t\tfor(i=0; key_names[i]; ++i) {\r\n\t\t\t\t\t\t\tif(key_names[i] == v) {\r\n\t\t\t\t\t\t\t\tc = i | 0x80;\r\n\t\t\t\t\t\t\t\tgoto found; } }\r\n\t\t\t\t\t\tprintf(\"Unknown escape: ~%c%c\\n\", v >> 8, v & 255);\r\n\t\t\t\t\t\texit(-1); } }\r\n\t\tfound:\t*p++ = c; }\r\n\t\t\twhile(c);\r\n\t\t\treturn; }\r\n\r\n\t// Check for single-character options\r\n\tswitch(v) {\r\n\tcase '/I' : Iname = ptr-1; return;\r\n\tcase '/P' : Prompt = 0;\treturn; }\r\n\r\n\t// Load filenames\r\n\tif(find_first(ptr-3, 0, name, &i, &i, &i, &i, &i)) {\r\n\t\tprintf(\"Could not find: %s\\n\", ptr-3);\r\n\t\texit(-1); }\r\n\tdo {\r\n\t\t++Fcount;\r\n\t\tp = name;\r\n\t\tdo {\r\n\t\t\tif(*p == '.')\t\t// Trim extension\r\n\t\t\t\t*p = 0; }\r\n\t\twhile(*p++);\r\n\t\tp = name;\r\n\t\twhile(pool[Ptop++] = *p++);\r\n\t\tif(Ptop >= sizeof(pool))\r\n\t\t\tabort(\"Memory exhausted\"); }\r\n\twhile !find_next(name, &i, &i, &i, &i, &i);\r\n}\r\n\r\n/*\r\n * INT-16 (BIOS keyboard services) replacement interrupt handler\r\n */\r\nasm {\r\nSAVAX\tDW\t\t0\t\t\t\t// Saved AX during interrupt processing\r\nDOS_SS\tDW\t\t0\t\t\t\t// DOS saved SS when MC active\r\nDOS_SP\tDW\t\t0\t\t\t\t// DOS saved SP when MC active\r\nMC_SP\tDW\t\t06000h\t\t\t// Stack to use for MC\r\n;\r\n; INT-16 handler\r\n;\r\nINT16:\tCMP\t\tAH,1\t\t\t\t; 0 or 1 (CHECK/GET)\r\n\t\tJA\t\tdoint\t\t\t\t; No, pass to original handler\r\n; AH=0 (Get) or AH=1 (Check) - context switch to MC code to process\r\n\t\tCLI\r\n\t\tMOV\t\tCS:DOS_SS,SS\t\t; Save the DOS stack segment\r\n\t\tMOV\t\tCS:DOS_SP,SP\t\t; Save the DOS stack pointer\r\n\t\tMOV\t\tCS:SAVAX,AX\t\t\t; Save AX\r\n\t\tMOV\t\tAX,CS\t\t\t\t; Get CS\r\n\t\tMOV\t\tSS,AX\t\t\t\t; Set SP\r\n\t\tMOV\t\tSP,CS:MC_SP\t\t\t; Get MICRO-C stack pointer\r\n\t\tPUSH\tBX\r\n\t\tPUSH\tCX\r\n\t\tPUSH\tDX\r\n\t\tPUSH\tSI\r\n\t\tPUSH\tDI\r\n\t\tPUSH\tES\r\n\t\tPUSH\tDS\r\n\t\tMOV\t\tDS,AX\r\n\t\tPUSH\tCS:SAVAX\t\t\t; Pass AX as parameter\r\n\t\tSTI\r\n\t\tCALL\t_keyboard\t\t\t; Invoke MC handler\r\n\t\tCLI\r\n\t\tPOP\t\tBX\t\t\t\t\t; Clear stacked parm\r\n\t\tPOP\t\tDS\r\n\t\tPOP\t\tES\r\n\t\tPOP\t\tDI\r\n\t\tPOP\t\tSI\r\n\t\tPOP\t\tDX\r\n\t\tPOP\t\tCX\r\n\t\tPOP\t\tBX\r\n\t\tMOV\t\tSS,CS:DOS_SS\t\t; Restore DOS stack segment\r\n\t\tMOV\t\tSP,CS:DOS_SP\t\t; Restore DOS SP\r\n\t\tSTI\r\n\t\tAND\t\tAX,AX\t\t\t\t; Key returned?\r\n\t\tJNZ\t\tgoh\t\t\t\t\t; Yes, return to caller\r\n\t\tMOV\t\tAX,CS:SAVAX\t\t\t; Restore parm & pass to native\r\n; Long jump to interrupt handler\r\ndoint:\tDB\t\t0EAh\t\t\t\t; Far JMP\r\nINT16O:\tDW\t\t0\t\t\t\t\t; Original handler segment\r\nINT16S:\tDW\t\t0\t\t\t\t\t; Original handler offset\r\ngoh:\tRETF\t2\r\n}\r\n\r\n/*\r\n * Test for character via direct BIOS call to original handller\r\n */\r\nunsigned tstchar(void) asm\r\n{\r\n\t\tMOV\t\tAH,01h\t\t\t\t; Test for char\r\n\t\tPUSHF\t\t\t\t\t\t; Fake interrupt\r\n\t\tPUSH\tCS\t\t\t\t\t; Fake long call\r\n\t\tCALL\tdoint\t\t\t\t; Execute handler\r\n\t\tJNZ\t\tisok\t\t\t\t; We have character\r\n\t\tXOR\t\tAX,AX\t\t\t\t; Reset to zero\r\nisok:\r\n}\r\n\r\n/*\r\n * Get character via direct BIOS call to original handler\r\n */\r\nunsigned getchar(void) asm\r\n{\r\n\t\tXOR\t\tAH,AH\t\t\t\t; Get char\r\n\t\tPUSHF\t\t\t\t\t\t; Fake interrupt\r\n\t\tPUSH\tCS\t\t\t\t\t; Fake long call\r\n\t\tCALL\tdoint\t\t\t\t; Execute handler\r\n}\r\n\r\n/*\r\n * Allocate INT16 interrupt vector (install out handler)\r\n */\r\nvoid getint(void) asm\r\n{\r\n; Read OLD vector & save for later restore\r\n\t\tMOV\t\tAX,3516h\t\t\t; Get INT 16 vector\r\n\t\tINT\t\t21h\t\t\t\t\t; Ask DOS\r\n\t\tMOV\t\tWORD PTR INT16O,BX\t; Save offset\r\n\t\tMOV\t\tWORD PTR INT16S,ES\t; Save segment\r\n; Set vectors to our handler\r\n\t\tMOV\t\tDX,OFFSET INT16\r\n\t\tMOV\t\tAX,2516h\t\t\t; Set INT vector\r\n\t\tINT\t\t21h\t\t\t\t\t; Ask DOS\r\n}\r\n\r\n/*\r\n * Release INT16 interrupt vector\r\n */\r\nvoid relint(void) asm\r\n{\r\n\t\tPUSH\tDS\t\t\t\t\t; Save DS\r\n\t\tMOV\t\tDX,CS:WORD PTR INT16O\t; Read old handler offset\r\n\t\tMOV\t\tAX,CS:WORD PTR INT16S\t; Read old handler segment\r\n\t\tMOV\t\tDS,AX\t\t\t\t; Most be in DS\r\n\t\tOR\t\tAX,DX\t\t\t\t; Did we record it?\r\n\t\tJZ\t\tnoint\t\t\t\t; No, never installed\r\n\t\tMOV\t\tAX,2516h\t\t\t; Set INT vector\r\n\t\tINT\t\t21h\t\t\t\t\t; Ask DOS\r\nnoint:\tPOP\t\tDS\t\t\t\t\t; Restore DS\r\n}\r\n\r\n/*\r\n * Compute scancode from ASCII/Encoded byte value\r\n */\r\nunsigned scancode(unsigned char c)\r\n{\r\n\tunsigned i, k;\r\n\r\n\tif(isalpha(c))\t\t\t\t\t\t\t\t// A-Z\r\n\t\treturn (alpha_prefix[(c & 0x1F) - 1] << 8) | c;\r\n\r\n\tfor(i=0; k = ascii_prefix[i]; ++i) {\t\t// Other ASCII\r\n\t\tif((k & 255) == c)\r\n\t\t\treturn k; }\r\n\r\n\t// Handle special cases\r\n\tif((c >= 0x80) && (c < 0x8A)) {\t\t\t\t// F1-F10\r\n\t\tk = 0x3B;\r\n\t\tc -= 0x80;\r\n\t\tgoto dofunc; }\r\n\tif((c >= 0x8A) & (c < 0x94)) {\t\t\t\t// Shift F1-F10\r\n\t\tk = 0x54;\r\n\t\tc -= 0x8A;\r\n\t\tgoto dofunc; }\r\n\tif((c >= 0x94) && (c < 0x9E)) {\t\t\t\t// Ctrl F1-F10\r\n\t\tk = 0x5E;\r\n\t\tc -= 0x94;\r\n\t\tgoto dofunc; }\r\n\tif((c >= 0x9E) && (c < 0xA8)) {\t\t\t\t// Alt F1-F10\r\n\t\tk = 0x68;\r\n\t\tc -= 0x9E;\r\ndofunc:\treturn (k + c) << 8; }\r\n\r\n\tif((c >= 0xA8) && (c < (0xA8+NUM_MISC)))\t// Misc. function\r\n\t\treturn misc_code[c - 0xA8];\r\n\r\n\treturn 0;\t\t\t\t\t\t\t\t\t// Unknown\r\n}\r\n\r\n/*\r\n * Local video functions\r\n */\r\n\r\n// Write character to video screen\r\nvoid vputc(unsigned x, unsigned y, unsigned char c)\r\n{\r\n\tif((x > 79) || (y > 24))\r\n\t\tabort(\"Bad offset\");\r\n\tpoke(Vseg, (x*2) + (y*160), c);\r\n}\r\n\r\n// Write string to video screen\r\nvoid vputs(unsigned char *s)\r\n{\r\n\twhile(*s) {\r\n\t\tvputc(X++, Y, *s++);\r\n\t\tif(X >= 80) {\r\n\t\t\tX = 0;\r\n\t\t\t++Y; } }\r\n}\r\n\r\n// Formatted print to video screen\r\nregister void vprintf(unsigned args)\r\n{\r\n\tunsigned char buffer[81];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tvputs(buffer);\r\n}\r\n\r\n/*\r\n * Clear screen & home physical cursor\r\n */\r\nvoid vcls(void)\r\n{\r\n\tunsigned i;\r\n\r\n\tfor(i=X=Y=0; i < 4000; i += 2)\r\n\t\tpoke(Vseg, i, 0x0720);\r\n\tasm {\r\n\t\tMOV\t\tAH,02h\t\t\t// Set cursor\r\n\t\tXOR\t\tDX,DX\t\t\t// Row=0 Column=0\r\n\t\tMOV\t\tBH,DL\t\t\t// Page = 0\r\n\t\tINT\t\t10h\t\t\t\t// Ask BIOS\r\n\t}\r\n}\r\n\r\n/*\r\n * Capture applicaton screen to 'scrbuf'\r\n */\r\nvoid capture_screen(void)\r\n{\r\n\tunsigned i, j, o;\r\n\tfor(i=o=0; i < 25; ++i) {\r\n\t\tfor(j=0; j < 80; ++j)\r\n\t\t\tscrbuf[i][j] = peekw(Vseg, (j*2)+o);\r\n\t\to += 160; }\r\n}\r\n\r\n/*\r\n * Restore applicaton screen from 'scrbuf'\r\n */\r\nvoid restore_screen(void)\r\n{\r\n\tunsigned i, j, o;\r\n\tfor(i=o=0; i < 25; ++i) {\r\n\t\tfor(j=0; j < 80; ++j)\r\n\t\t\tpokew(Vseg, (j*2)+o, scrbuf[i][j]);\r\n\t\to += 160; }\r\n}\r\n\r\n/*\r\n * Capture text from application screen at Cx,Cy,Cw,Ch\r\n */\r\nunsigned capture(unsigned char *ptr)\r\n{\r\n\tunsigned i, j, o;\r\n\tunsigned char *p, *p1;\r\n\tp = ptr;\r\n\to = (Cy * 160) + (Cx*2);\r\n\tfor(i=0; i < Ch; ++i) {\r\n\t\tp1 = p;\r\n\t\tfor(j=0; j < Cw; ++j)\r\n\t\t\t*p++ = peek(Vseg, (j*2)+o);\r\n\t\twhile(p1 < p) {\r\n\t\t\tif((*p1 < ' ') || (*p1 > 0x7E))\r\n\t\t\t\t*p1 = ' ';\r\n\t\t\t++p1; }\r\n\t\to += 160;\r\ntrim:\tif(j) switch(*(p-1)) {\r\n\t\tcase ' ':\r\n\t\tcase 0 : --j; --p; goto trim; }\r\n\t\t*p++ = '\\n'; }\r\n\t*p++ = 0;\r\n\treturn p - ptr;\r\n}\r\n\r\n/*\r\n * Test for and buffer keystroke (part of setup_capture)\r\n */\r\nvoid xtstc(void)\r\n{\r\n\tunsigned i;\r\n\tif(!C) {\r\n\t\tfor(i=0; i < 5; ++i) {\r\n\t\t\tdelay(55);\r\n\t\t\tif(tstchar()) {\r\n\t\t\t\tC = getchar();\r\n\t\t\t\tbreak; } } }\r\n}\r\n\r\n/*\r\n * Setup capture window\r\n */\r\nint setup_capture(void)\r\n{\r\n\tunsigned i, w, h;\r\n\tchar f;\r\n\r\n\tC = 0;\r\n\tf = 0xDB;\r\n\tfor(;;) {\r\n\t\t// Force within 80x25 screen limits\r\n\t\tif(Cx < 0) Cx = 0;\r\n\t\tif(Cx > 79) Cx = 79;\r\n\t\tif(Cy < 0) Cy = 0;\r\n\t\tif(Cy > 24) Cy = 24;\r\n\t\tif(Cw < 1) Cw = 1;\r\n\t\tif(Ch < 1) Ch = 1;\r\n\t\tif((Cx+Cw) > 80) Cw = 80 - Cx;\r\n\t\tif((Cy+Ch) > 25) Ch = 25 - Cy;\r\n\t\t// Draw box\r\n\t\tw = Cw - 1;\r\n\t\th = Ch - 1;\r\n\t\tfor(i=1; i < w; ++i) {\r\n\t\t\tvputc(Cx+i, Cy, 0xC4);\r\n\t\t\tvputc(Cx+i, Cy+h, 0xC4); }\r\n\t\tfor(i=1; i < h; ++i) {\r\n\t\t\tvputc(Cx, Cy+i, 0xB3);\r\n\t\t\tvputc(Cx+w, Cy+i, 0xB3); }\r\n\t\tvputc(Cx, Cy, f);\r\n\t\tvputc(Cx+w, Cy, f);\r\n\t\tvputc(Cx, Cy+h, f);\r\n\t\tvputc(Cx+w, Cy+h, 0xDB);\r\n\t\txtstc();\t\t\t// Check for character\r\n\t\t// Clear box (restore underlying text)\r\n\t\tfor(i=0; i < w; ++i) {\r\n\t\t\tvputc(Cx+i, Cy, scrbuf[Cy][Cx+i]);\r\n\t\t\tvputc(Cx+i, Cy+h, scrbuf[Cy+h][Cx+i]); }\r\n\t\tfor(i=0; i < h; ++i) {\r\n\t\t\tvputc(Cx, Cy+i, scrbuf[Cy+i][Cx]);\r\n\t\t\tvputc(Cx+w, Cy+i, scrbuf[Cy+i][Cx+w]); }\r\n\t\tvputc(Cx, Cy, scrbuf[Cy][Cx]);\r\n\t\tvputc(Cx+w, Cy, scrbuf[Cy][Cx+w]);\r\n\t\tvputc(Cx, Cy+h, scrbuf[Cy+h][Cx]);\r\n\t\tvputc(Cx+w, Cy+h, scrbuf[Cy+h][Cx+w]);\r\n\t\txtstc();\t\t\t// Check for character\r\n\t\t// Act on any received command keys\r\n\t\ti = C;\r\n\t\tC = 0;\r\n\t\tswitch(i) {\r\n\t\tcase ESC\t: return 0;\t\t\t// Escape (cancel)\r\n\t\tcase ENTER\t: return 255;\t\t// Enter  (accept)\r\n\t\tcase _F1\t: f ^= 0x1E; }\r\n\t\tif(f == 0xC5) switch(i) {\t\t// Move - adjust Cw,Ch\r\n\t\tcase _UA\t: --Ch;\t\t\tcontinue;\r\n\t\tcase _DA\t: ++Ch;\t\t\tcontinue;\r\n\t\tcase _LA\t: --Cw;\t\t\tcontinue;\r\n\t\tcase _RA\t: ++Cw;\t\t\tcontinue; }\r\n\t\telse switch(i) {\t\t\t\t// Resize - Adjust Cx,Cy\r\n\t\tcase _UA\t: --Cy;\t\t\tcontinue;\r\n\t\tcase _DA\t: ++Cy;\t\t\tcontinue;\r\n\t\tcase _LA\t: --Cx;\t\t\tcontinue;\r\n\t\tcase _RA\t: ++Cx;\t\t\tcontinue; } }\r\n}\r\n\r\n/*\r\n * Keyboard interrupt handler\r\n */\r\nvoid keyboard(unsigned ax)\r\n{\r\n\tunsigned r;\r\n\r\n//\tstatic unsigned c;\t\t\t\t// Debug only\r\n//\tX=Y=0; vprintf(\"%-5u %04x[%02x%02x] %04x\", ++c, Sptr, Sptr[0], Sptr[1], ptr);\r\n//\tif(ptr) vprintf(\"[%02x %02x]\", ptr[0], ptr[1]);\r\n\r\n\t// Update application screen with filename\r\n\t// when it is likely to have changed.\r\n\tif(!Fflag) {\r\n\t\tif(Fx >= 0) {\r\n\t\t\tX=Fx; Y = Fy;\r\n\t\t\tvprintf(\"%s \", Fptr); }\r\n\t\tFflag = 255; }\r\n\r\n\r\ndoinput:\r\n\tif(ptr) {\t\t\t// Key entry string active - perform it\r\n\t\tif(*ptr) {\r\n\t\t\tif(ax & 0xFF00) {\t\t// Test for character\r\n\t\t\t\tr = TICK;\r\n\t\t\t\tif(Timer == r)\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\tTimer = r;\r\n\t\t\t\treturn scancode(*ptr); }\r\n\t\t\treturn scancode(*ptr++); }\r\n\t\tptr = 0; }\r\n\r\nxscript:\t// If a script is active, continue execution\r\n\tif(Sactive && *Sptr) {\r\n\t\tif(ax & 0xFF00) {\t\t\t\t// Test for character\r\n\t\t\tr = TICK;\r\n\t\t\tif(Timer == r)\t\t\t\t// Always wait 1 tick\r\n\t\t\t\treturn 0;\r\n\t\t\tTimer = r;\r\n\t\t\tif(Kdel) {\t\t\t\t\t// Delay requested\r\n\t\t\t\t--Kdel;\r\n\t\t\t\treturn 0; }\r\n\t\t\tswitch(*Sptr++) {\r\n\t\t\tcase 0xF0 :\t\t\t\t\t// Delay\r\n\t\t\t\tKdel = *Sptr++;\r\n\t\t\t\treturn 0;\r\n\t\t\tcase 0xF1 :\t\t\t\t\t// Enter filename (full)\r\n\t\t\t\tptr = Fptr;\r\n\t\t\t\tgoto doinput;\r\n\t\t\tcase 0xF2 :\t\t\t\t\t// Capture input\r\n\t\t\t\tcapture_screen();\r\n\t\t\t\tif(setup_capture()) {\t// Display/update window\r\n\t\t\t\t\tDidcap = 255;\t\t// Indicate we proceeded\r\n\t\t\t\tcapture(capbuf); }\t\t// Perform the actual capture\r\n\t\t\t\trestore_screen();\r\n\t\t\t\tFflag = 0;\t\t\t\t// Refresh filename\r\n\t\t\t\tgoto xscript;\t\t\t// continue script\r\n\t\t\tcase 0xF3 :\t\t\t\t\t// Pause script\r\n\t\t\t\tSactive = Fflag = 0;\r\n\t\t\t\tgoto dokey; }\r\n\t\t\treturn scancode(*--Sptr); }\r\n\r\n\t\tswitch(r = *Sptr++) {\r\n\t\tcase 0xF0 :\t\t\t\t\t\t// Ignore delay for GET\r\n\t\t\t++Sptr;\t\t\t\t\t\t// Skip operand\r\n\t\t\tgoto xscript;\r\n\t\tcase 0xF1 :\t\t\t\t\t\t// Enter filename (full)\r\n\t\t\tptr = Fptr;\r\n\t\t\tgoto doinput;\r\n\t\tcase 0xF2 :\t\t\t\t\t\t// Capture input\r\n\t\t\tcapture_screen();\r\n\t\t\tif(setup_capture()) {\t\t// Display/update window\r\n\t\t\t\tDidcap = 255;\t\t\t// Indicate we proceeded\r\n\t\t\tcapture(capbuf); }\t\t\t// Perform the actual capture\r\n\t\t\trestore_screen();\r\n\t\t\tFflag = 0;\r\n\t\t\tgoto xscript;\r\n\t\tcase 0xF3 :\t\t\t\t\t\t// Pause script\r\n\t\t\tSactive = Fflag = 0;\r\n\t\t\tgoto dokey; }\r\n\t\treturn scancode(r); }\r\n\r\ndokey:\r\n\t// No special processing - test for real-key\r\n\tif(ax & 0xFF00) {\t\t\t\t\t// Test for character\r\n\t\tr = tstchar();\t\t\t\t\t// Test key via BIOS\r\n\t\tif(r == 0x7500) {\t\t\t\t// Special key (CTRL-END)\r\n\t\t\tif(!Sactive) {\t\t\t\t// Is script paused?\r\n\t\t\t\tgetchar();\t\t\t\t// Clear from buffer\r\n\t\t\t\tTimer = TICK;\t\t\t// Init timer\r\n\t\t\t\tSactive = 255;\t\t\t// Restart script\r\n\t\t\t\tFflag = 0;\t\t\t\t// Redisplay name\r\n\t\t\t\tgoto xscript; }\t\t\t// And proceed\r\n\t\t\tr = 0; }\r\n\t\treturn r; }\r\n\r\n\tr = getchar();\t\t\t\t\t\t// Get key via BIOS\r\n\tif(r == 0x7500) {\t\t\t\t\t// Special key (CTRL-END)\r\n\t\tif(!Sactive) {\t\t\t\t\t// Is script paused?\r\n\t\t\tTimer = TICK;\t\t\t\t// Init timer\r\n\t\t\tSactive = 255;\t\t\t\t// Restart script\r\n\t\t\tFflag = 0;\t\t\t\t\t// Redisplay name\r\n\t\t\tgoto xscript; }\t\t\t\t// And proceed\r\n\t\tgoto dokey; }\r\n\r\n\treturn r;\r\n}\r\n\r\n/*\r\n * Set script string to execute & command tail\r\n */\r\nvoid setcmd(unsigned char *p, unsigned char *t)\r\n{\r\n\tunsigned char *p1;\r\n\r\n\tSptr = p;\r\n\tSactive = 255;\r\n\tTimer = TICK;\r\n\tKdel = 5;\r\n\tFflag = ptr = 0;\r\n\r\n\tp = Tail;\r\n\tfor(;;) switch(*p = *t++) {\r\n\t\tcase 0 :\r\n\t\t\treturn;\r\n\t\tcase '~' :\t\t\t// Filename pointer\r\n\t\t\tif((toupper(*t) == 'F') && (toupper(t[1]) == 'N')) {\r\n\t\t\t\tp1 = Fptr;\r\n\t\t\t\twhile(*p = *p1++)\r\n\t\t\t\t\t++p;\r\n\t\t\t\tt += 2;\r\n\t\t\t\tcontinue; }\r\n\t\tdefault:\r\n\t\t\t++p; }\r\n}\r\n\r\n/*\r\n * Display next-up command & prompt for action\r\n */\r\nint showcmd(unsigned char op)\r\n{\r\n\tvcls();\r\n\tif(Prompt) {\r\n\t\tprintf(\"File %u of %u\\n\", Fcurrent, Fcount);\r\n\t\tprintf(\"Exec: %s\\n\", op ? Rcmd : Wcmd);\r\n\t\tprintf(\"Opts: %s\\n\", Tail);\r\n\t\tif(Didcap)\r\n\t\t\tprintf(\"Comment captured: Cx=%u Cy=%u Cw=%u Ch=%u\\n\", Cx, Cy, Cw, Ch);\r\n\t\tprintf(\"%sing '%s' %s floppy- ENTER to proceed, SPACE to skip, ESC to stop.\\n\",\r\n\t\t\top ? \"READ\" : \"WRITE\", Fptr, op ? \"from\" : \"to\");\r\n\r\n\t\tfor(;;) switch(getchar()) {\r\n\t\t\tcase ESC:\r\n\t\t\t\trelint();\r\n\t\t\t\texit(-1);\r\n\t\t\tcase SPACE :\r\n\t\t\t\treturn 255;\r\n\t\t\tcase ENTER :\r\n\t\t\t\tvcls();\r\n\t\t\t\treturn 0; } }\r\n\treturn 0;\r\n}\r\n\r\nunsigned char help[] = { \"\\\r\nANY-2-IMageDisk \"#VERSION\" / \"#__DATE__\"\\n\\\r\nCopyright 2007-\"#CYEAR\" Dave Dunfield - All rights reserved.\\n\\n\\\r\nUse:\tANY2IMD filespec... [options]\\n\\n\\\r\nopts:\t/Ifile\t\t- Process file.INI\t\t[ANY2IMD]\\n\\\r\n\t/P\t\t- do not Pause before commands\\n\\\r\n\tCC=x,y,w,h\t- Comment Capture window\t[0,0,50,10]\\n\\\r\n\tRE=execfile [*1]- Read Executable file\\n\\\r\n\tWE=execfile [*1]- Write Executable file\\n\\\r\n\tRS=string [*2]\t- Read Script\t\t\t[none]\\n\\\r\n\tWS=string [*2]\t- Write Script\t\t\t[none]\\n\\\r\n\\nOptions may also be placed in .INI - processed at startup.\\n\\\r\n[*1] Can give command options in .INI\\n\\\r\n[*2] See documentation for control codes.\\n\" };\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tunsigned i, t;\r\n\tunsigned char *Wt, *Rt;\r\n\r\n\t// Process command line arguments\r\n\tfor(i=1; i < argc; ++i) {\r\n\t\tptr = argv[i];\r\n\t\tcommand_option(); }\r\n\r\n\t// Look for .INI file in current directory\r\n\tsprintf(Tail, \"%s.INI\", Iname);\r\n\tif(fp = fopen(Tail, \"r\"))\t\t// From current dir\r\n\t\tgoto doini;\r\n\t// Not found - look for .INI in home directory\r\n\tWt = Rt = argv[0];\r\n\twhile(*Wt) switch(*Wt++) {\r\n\t\tcase ':' :\r\n\t\tcase '\\\\' : Rt = Wt; }\r\n\t*Rt = 0;\r\n\tsprintf(Tail, \"%s%s.INI\", argv[0], Iname);\r\n\tif(fp = fopen(Tail, \"r\")) {\r\ndoini:\twhile(fgets(ptr = capbuf+256, 128, fp)) {\r\n\t\t\twhile(isspace(*ptr))\r\n\t\t\t\t++ptr;\r\n\t\t\tswitch(*ptr) {\r\n\t\t\tcase ';' :\r\n\t\t\tcase 0 : continue; }\r\n\t\t\tfor(t=0;  ptr[t]; ++t);\r\n\t\t\twhile(t && isspace(ptr[t-1]))\r\n\t\t\t\t--t;\r\n\t\t\tptr[t] = 0;\r\n\t\t\tcommand_option(); } }\r\n\r\n\tif(!Ptop)\t\t\t// No images - display help\r\n\t\tabort(help);\r\n\r\n\tif(!(*Wcmd && *Rcmd))\r\n\t\tabort(\"No Read/Write program defined.\");\r\n\r\n\t// Setup Read/Write command/tail buffers for exec()\r\n\tWt = Wcmd;\r\n\twhile(*Wt) {\r\n\t\tif(isspace(*Wt++)) {\r\n\t\t\t*(Wt-1) = 0;\r\n\t\t\tbreak; } }\r\n\tRt = Rcmd;\r\n\twhile(*Rt) {\r\n\t\tif(isspace(*Rt++)) {\r\n\t\t\t*(Rt-1) = 0;\r\n\t\t\tbreak; } }\r\n\r\n\tasm {\t\t// Drop stack by 2k for interrupt\r\n\t\tMOV\t\tAX,SP\r\n\t\tSUB\t\tAX,2048\r\n\t\tMOV\t\tCS:MC_SP,AX\r\n\t}\r\n\r\n\t// Walk list of files, running Read program, then Write program\r\n\tt = 0;\r\n\twhile(t < Ptop) {\r\n\t\t// Get next .TD0 file to process\r\n\t\tFptr = &pool[t];\t\t\t// Get filename\r\n\t\twhile(pool[t++]);\t\t\t// Advance to next\r\n\t\t++Fcurrent;\r\n\r\n\t\t// Execute Read program\r\n\t\tmemset(capbuf, 0, sizeof(capbuf));\t// Clear capture\r\n\t\tsetcmd(Wscript, Wt);\t\t\t\t// Set for read script\r\n\t\tgetint();\t\t\t\t\t\t\t// Allocate interrupts\r\n\t\tif(showcmd(Imd = Didcap = 0)) {\r\n\t\t\trelint();\r\n\t\t\tcontinue; }\r\n\t\ti = exec(Wcmd, Tail);\t\t\t\t// Run read program\r\n\t\tif(i)\r\n\t\t\tprintf(\"%s failed(%u)\\n\", Wcmd, i);\r\n\r\n\t\t// Trim comment\r\n\t\tif(*(ptr = capbuf)) {\r\n\t\t\twhile(*ptr && (*ptr == '\\n'))\r\n\t\t\t\t++ptr;\r\n\t\t\tfor(i=0; ptr[i]; ++i);\r\n\t\t\twhile(i) {\r\n\t\t\t\tif(ptr[i-1] != '\\n')\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t--i; }\r\n\t\t\tptr[i++] = '\\n';\r\n\t\t\tptr[i] = 0; }\r\n\r\n\t\t// If we captured - write empty .IMD file with comment\r\n\t\tif(Didcap) {\r\n\t\t\tsprintf(scrbuf, \"%s.IMD\", Fptr);\r\n\t\t\tfp = fopen(scrbuf, \"wvq\");\r\n\t\t\tfprintf(fp, \"IMD from %s\\n\", Fptr);\r\n\t\t\tfputs(ptr, fp);\r\n\t\t\tfclose(fp); }\r\n\r\n\t\t// Execute ImageDisk to write file (read floppy)\r\n\t\tsetcmd(Rscript, Rt);\r\n\t\tif(!showcmd(Imd = 255)) {\r\n\t\t\ti = exec(Rcmd, Tail);\r\n\t\t\tif(i)\r\n\t\t\t\tprintf(\"%s failed(%u)\\n\", Wcmd, i); }\r\n\t\trelint(); }\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/BIN2IMD.C",
    "content": "/*\r\n * Program to convert raw binary data into .IMD image format.\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. It is being\r\n * provided for informational purposes only, and I provide no support for\r\n * it, technical or otherwise.\r\n *\r\n * Copyright 2005-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, however this is\r\n * for the purpose of keeping a say in it's disposition. I encourage the\r\n * use of ideas, algorithms and code fragments contained herein to be used\r\n * in the creation of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include \"version.h\"\r\n\r\nunsigned char\r\n\t*ptr,\t\t\t\t// General parse pointer\r\n\t*ptr1,\t\t\t\t// General pointer\r\n\tTwoside,\t\t\t// Double sided indicator\r\n\tVerbose,\t\t\t// Display detail information\r\n\tFill,\t\t\t\t// Fill value\r\n\tCompress = 255,\t\t// Compress sectors\r\n\tIfile[65],\t\t\t// Input filename\r\n\tOfile[65],\t\t\t// Output filename\r\n\tFfile[200],\t\t\t// Format file\r\n\tBuffer[32768];\t\t// Comment/track buffer\r\nunsigned\r\n\tDay,\t\t\t\t// Current day\r\n\tMonth,\t\t\t\t// Current month\r\n\tYear,\t\t\t\t// Current year\r\n\tHour,\t\t\t\t// Current hour\r\n\tMinute,\t\t\t\t// Current minite\r\n\tSecond,\t\t\t\t// Current second\r\n\tFmtnext = -1,\t\t// Next format record\r\n\tCylinder,\t\t\t// Current cylinder\r\n\tCylinders = -1,\t\t// Number of cylinders\r\n\tCmtsize;\t\t\t// Comment size\r\n\r\nstruct SIDE {\r\n\tunsigned Mode;\t\t\t\t// Data-rate/Density\r\n\tunsigned Ssize;\t\t\t\t// Sector size (encoded)\r\n\tunsigned SSize;\t\t\t\t// Sector size (plain)\r\n\tunsigned Nsec;\t\t\t\t// Number of sectors/track\r\n\tunsigned CMsize;\t\t\t// Cylinder numbering map size\r\n\tunsigned HMsize;\t\t\t// Head numbering map size\r\n\tunsigned char Smap[256];\t// Sector numbering map\r\n\tunsigned char Cmap[256];\t// Cylinder numbering map\r\n\tunsigned char Hmap[256];\t// Head numbering map\r\n\t} Side0, Side1;\r\n\r\nFILE\r\n\t*fpi,\t\t\t// Binary file in\r\n\t*fpo,\t\t\t// IMD file out\r\n\t*fpf;\t\t\t// Detail record fp\r\n\r\n/*\r\n * Report an error\r\n */\r\nregister error(unsigned args)\r\n{\r\n\tunsigned char buffer[100], *p;\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tif(p = ptr1) {\r\n\t\twhile(*p) {\r\n\t\t\tif(isspace(*p)) {\r\n\t\t\t\t*p = 0;\r\n\t\t\t\tbreak; }\r\n\t\t\t++p; }\r\n\t\tfputs(ptr1, stdout);\r\n\t\tfputs(\": \", stdout); }\r\n\tfputs(buffer, stdout);\r\n\texit(-1);\r\n}\r\n\r\n/*\r\n * Open a file with default extension\r\n */\r\nvoid filename(unsigned char *p, unsigned char *name, unsigned char *ext)\r\n{\r\n\tunsigned char d;\r\nrd:\td = 255;\r\n\tfor(;;) switch(*p++ = *name++) {\r\n\t\tcase 0 :\r\n\t\t\tif(d)\r\n\t\t\t\tstrcpy(p-1, ext);\r\n\t\t\treturn;\r\n\t\tcase ':' :\r\n\t\tcase '\\\\':\tgoto rd;\r\n\t\tcase '.' :\td = 0;\t}\r\n}\r\n\r\n/*\r\n * Obtain a number from the command line\r\n */\r\nunsigned char get_num(unsigned *value, unsigned l, unsigned h)\r\n{\r\n\tunsigned c, v, b;\r\n\tb = 10;\r\n\tswitch(*ptr) {\r\n\tcase '$' : b = 16;\tgoto l1;\r\n\tcase '@' : b = 8;\tgoto l1;\r\n\tcase '%' : b = 1;\r\n\tl1: ++ptr; }\r\n\tv = 0;\r\n\tc = *ptr;\r\n\tfor(;;) {\r\n\t\tif((c >= '0') && (c <= '9'))\r\n\t\t\tc -= '0';\r\n\t\telse if((c >= 'A') && (c <= 'F'))\r\n\t\t\tc -= ('A'-10);\r\n\t\telse if((c >= 'a') && (c <= 'f'))\r\n\t\t\tc -= ('a'-10);\r\n\t\telse\r\n\t\t\tc = 65535;\r\n\t\tif(c >= b)\r\n\t\t\terror(\"Bad digit '%c'\", *ptr);\r\n\t\tv = (v * b) + c;\r\n\t\tswitch(c = *++ptr) {\r\n\t\tcase ' ' :\r\n\t\tcase '\\t' :\r\n\t\tcase ',' :\r\n\t\tcase '-' :\r\n\t\tcase '.' : ++ptr;\r\n\t\tcase 0 :\r\n\t\t\tif((v < l) || (v > h))\r\n\t\t\t\terror(\"Value %u out of range %u-%u\", v, l, h);\r\n\t\t\t*value = v;\r\n\t\t\treturn c; } }\r\n}\r\n\r\n/*\r\n * Check a size value and issue error if it exceeds set limit\r\n */\r\nvoid checksize(unsigned v, unsigned s)\r\n{\r\n\tif(v > s)\r\n\t\terror(\"Too large (exceeds %u bytes)\", s);\r\n}\r\n\r\n/*\r\n * Obtain a map value from the command line\r\n */\r\nvoid get_map(unsigned char map[], unsigned *size, unsigned l, unsigned h)\r\n{\r\n\tunsigned c, i, j, s;\r\n\ts = 0;\r\ntop:\r\n\tc = get_num(&i, l, h);\r\n\tchecksize(s, 255);\r\n\tmap[s++] = i;\r\nnext:\r\n\tswitch(c) {\r\n\tcase ',' : goto top;\r\n\tcase '-' :\r\n\t\tc = get_num(&j, l, h);\r\n\t\tif(j > i) {\r\n\t\t\twhile(i < j) {\r\n\t\t\t\tchecksize(s, 255);\r\n\t\t\t\tmap[s++] = ++i; } }\r\n\t\telse {\r\n\t\t\twhile(i > j) {\r\n\t\t\t\tchecksize(s, 255);\r\n\t\t\t\tmap[s++] = --i; } }\r\n\t\tgoto next;\r\n\tcase '.' :\r\n\t\tc = get_num(&j, 0, 256);\r\n\t\twhile(--j) {\r\n\t\t\tchecksize(s, 255);\r\n\t\t\tmap[s++] = i; }\r\n\t\tgoto next;\r\n\t} *size = s;\r\n}\r\n\r\n/*\r\n * Check a map for duplicate entries\r\n */\r\nvoid check_dup(unsigned char map[], unsigned size)\r\n{\r\n\tunsigned i, j;\r\n\tunsigned char flags[256];\r\n\tmemset(flags, 0, sizeof(flags));\r\n\tfor(i=0; i < size; ++i) {\r\n\t\tif(flags[j=map[i]])\r\n\t\t\terror(\"Duplicate entry %u\", j);\r\n\t\tflags[j] = 255; }\r\n}\r\n\r\n/*\r\n * Parse a (command-line/file) option value\r\n */\r\nint option(char flag)\r\n{\r\n\tunsigned i, j;\r\n\tstruct SIDE *s;\r\n\tunsigned char fname[65], f;\r\n\tFILE *fp;\r\n\tstatic unsigned Strans[] = { 128, 256, 512, 1024, 2048, 4096, 8192 };\r\n\r\n\tptr1 = ptr;\r\n\tswitch(i = (toupper(*ptr++) << 8) | toupper(*ptr++)) {\r\n\tcase '/1' : Twoside = 0;\t\t\t\t\t\t\tgoto ret0;\r\n\tcase '/2' : Twoside = 255;\t\t\t\t\t\t\tgoto ret0;\r\n\tcase '/V' : switch(*ptr++) {\r\n\t\tcase '0' : Verbose = 0;\t\t\t\t\t\t\tgoto ret0;\r\n\t\tcase '1' : Verbose = 255;\t\t\t\t\t\tgoto ret0;\r\n\t\t} --ptr; Verbose = 15;\t\t\t\t\t\t\tgoto ret0;\r\n\tcase '/C' : Compress = 255;\t\t\t\t\t\t\tgoto ret0;\r\n\tcase '/U' : Compress = 0;\t\t\t\t\t\t\tgoto ret0;\r\n\tcase 'F=' : get_num(&i, 1, 255); Fill = i;\t\t\tgoto ret0;\r\n\tcase 'N=' : get_num(&Cylinders, 1, 256);\t\t\tgoto ret1;\r\n\tcase 'C=' :\r\n\t\tif(*ptr == '@') {\r\n\t\t\tfilename(fname, ptr+1, \".TXT\");\r\n\t\t\tfp = fopen(fname, \"rvqb\");\r\n\t\t\twhile((i = getc(fp)) != EOF) {\r\n\t\t\t\tchecksize(Cmtsize, sizeof(Buffer));\r\n\t\t\t\tBuffer[Cmtsize++] = i; }\r\n\t\t\tfclose(fp);\r\n\t\t\twhile(*ptr && isspace(*ptr))\r\n\t\t\t\t++ptr;\r\n\t\t\tgoto ret1; }\r\n\t\tfor(;;) switch(i = *ptr) {\r\n\t\t\tcase 0 :\r\n\t\t\tcase ' ': ++ptr;\r\n\t\t\tcase '\\t':\r\n\t\t\t\tBuffer[Cmtsize++] = 0x0D;\r\n\t\t\t\tBuffer[Cmtsize++] = 0x0A;\r\n\t\t\t\tgoto ret1;\r\n\t\t\tcase '~' : i = ' ';\r\n\t\t\tdefault: ++ptr;\r\n\t\t\t\tchecksize(Cmtsize, sizeof(Buffer));\r\n\t\t\t\tBuffer[Cmtsize++] = i; }\r\n\tret1: if(flag)\r\n\t\terror(\"Not allowed in track records\");\r\n\tret0: return 0; }\r\n\ts = Side0;\r\n\tf = 255;\r\n\tswitch(*ptr) {\r\n\tcase '1' : s = Side1; Twoside = 255;\r\n\tcase '0' : f = 0; ++ptr; }\r\n\tif(*ptr++ == '=') switch(i) {\r\n\tcase 'DM' : get_num(&j, 0, 5);\r\n\t\ts->Mode = j;\r\n\t\tif(f) Side1.Mode = j;\r\n\t\tgoto ret0;\r\n\tcase 'SS' : get_num(&j, 0, 8192);\r\n\t\tfor(i=0; i < sizeof(Strans); ++i) {\r\n\t\t\tif(Strans[i] == j) {\r\n\t\t\t\ts->Ssize = i;\r\n\t\t\t\ts->SSize = j;\r\n\t\t\t\tif(f) {\r\n\t\t\t\t\tSide1.Ssize = Side0.Ssize;\r\n\t\t\t\t\tSide1.SSize = Side0.SSize; }\r\n\t\t\t\tgoto ret0; } }\r\n\t\terror(\"Bad sector size\");\r\n\tcase 'SM' : get_map(s->Smap, &s->Nsec, 0, 255);\r\n\t\tif(f) memcpy(Side1.Smap, Side0.Smap, Side1.Nsec = Side0.Nsec);\r\n\t\tgoto ret0;\r\n\tcase 'CM' : get_map(s->Cmap, &s->CMsize, 0, 255);\r\n\t\tif(f) memcpy(Side1.Cmap, Side0.Cmap, Side1.CMsize = Side0.CMsize);\r\n\t\tgoto ret0;\r\n\tcase 'HM' : get_map(s->Hmap, &s->HMsize, 0, 1);\r\n\t\tif(f) memcpy(Side1.Hmap, Side0.Hmap, Side1.HMsize = Side0.HMsize);\r\n\t\tgoto ret0;\r\n\t} return 255;\r\n}\r\n\r\n/*\r\n * Display a map value\r\n */\r\nvoid showmap(unsigned char *title, unsigned char Map[], unsigned size)\r\n{\r\n\tunsigned i, j;\r\n\tprintf(\"%5s:\", title);\r\n\tfor(i=j=0; i < size; ++i) {\r\n\t\tif(++j > 18) {\r\n\t\t\tprintf(\"\\n     \");\r\n\t\t\tj = 1; }\r\n\t\tprintf(\"%4u\", Map[i]); }\r\n\tputc('\\n', stdout);\r\n}\r\n\r\n/*\r\n * Validate settings before generating image\r\n */\r\nvoid validate(unsigned side)\r\n{\r\n\tunsigned i, j;\r\n\tstruct SIDE *s;\r\n\tunsigned char flags[256];\r\n\r\n\tif(side) {\r\n\t\ts = Side1;\r\n\t\tptr1 = \"Side1\"; }\r\n\telse {\r\n\t\ts = Side0;\r\n\t\tptr1 = \"Side0\"; }\r\n\tif(Verbose) {\r\n\t\tprintf(\"%3u/%u:  Mode:%u  Sectors:%u  Ssize:%u/%u\\n\",\r\n\t\t\tCylinder, side, s->Mode, s->Nsec, s->Ssize, s->SSize);\r\n\t\tif(Verbose & 0xF0) {\r\n\t\t\tshowmap(\"Smap\", s->Smap, s->Nsec);\r\n\t\t\tif(s->HMsize) showmap(\"Hmap\", s->Hmap, s->HMsize);\r\n\t\t\tif(s->CMsize) showmap(\"Cmap\", s->Cmap, s->CMsize); } }\r\n\r\n\tif(s->Mode > 5)\r\n\t\terror(\"Data Mode must be defined.\");\r\n\r\n\tif(!s->SSize)\r\n\t\terror(\"Sector Size must be defined\");\r\n\r\n\tif(!s->Nsec)\r\n\t\terror(\"At least 1 sector must be defined\");\r\n\r\n\tif(\t(s->CMsize && (s->CMsize != s->Nsec)) || (s->HMsize && (s->HMsize != s->Nsec)) )\r\n\t\terror(\"Cylinder/Head maps must match sector map size\");\r\n\r\n\tmemset(flags, 0, sizeof(flags));\r\n\tfor(i=0; i < s->Nsec; ++i) {\r\n\t\tif(flags[j=s->Smap[i]])\r\n\t\t\terror(\"Duplicate sector map entry %u\", j);\r\n\t\tflags[j] = 255; }\r\n\tptr1 = 0;\r\n}\r\n\r\n/*\r\n * Skip to next non-blank in input\r\n */\r\nunsigned char *skip(void)\r\n{\r\n\twhile(isspace(*ptr))\r\n\t\t++ptr;\r\n\treturn *ptr;\r\n}\r\n\r\n/*\r\n * Read disk format data from command option file\r\n */\r\nvoid read_format(void)\r\n{\r\nagain:\r\n\tif(!fgets(ptr = Ffile, sizeof(Ffile)-1, fpf)) {\r\n\t\tFmtnext = -1;\r\n\t\treturn; }\r\n\tswitch(skip()) {\r\n\tcase ';' :\r\n\tcase 0 : goto again; }\r\n\tget_num(&Fmtnext, 0, 65535);\r\n}\r\n\r\n/*\r\n * High-speed test for compressable sector (all bytes same value)\r\n */\r\nint issame() asm\r\n{\r\n\t\tMOV\t\tBX,OFFSET DGRP:_Buffer\r\n\t\tMOV\t\tCX,4[BP]\t\t\t; Get sector size\r\n\t\tMOV\t\tAL,[BX]\t\t\t\t; Get byte1\r\n\t\tDEC\t\tCX\t\t\t\t\t; Backup count\r\niss1:\tINC\t\tBX\t\t\t\t\t; Next in source\r\n\t\tCMP\t\tAL,[BX]\t\t\t\t; Does it match?\r\n\t\tJNZ\t\tiss2\t\t\t\t; No, report different\r\n\t\tLOOP\tiss1\t\t\t\t; Check entire sector\r\n\t\tMOV\t\tAL,255\t\t\t\t; Return !0\r\n\t\tPOP\t\tBP\t\t\t\t\t; Restore BP\r\n\t\tRET\r\niss2:\tXOR\t\tAX,AX\t\t\t\t; Return 0\r\n}\r\n\r\n/*\r\n * Write a .IMD format track record\r\n */\r\nvoid write_track(unsigned char head)\r\n{\r\n\tunsigned i, j, size;\r\n\tstruct SIDE *s;\r\n\r\n\ts = head ? Side0 : Side1;\r\n\tif(s->CMsize) head |= 0x80;\r\n\tif(s->HMsize) head |= 0x40;\r\n\r\n\tputc(s->Mode, fpo);\r\n\tputc(Cylinder, fpo);\r\n\tputc(head, fpo);\r\n\tputc(s->Nsec, fpo);\r\n\tputc(s->Ssize, fpo);\r\n\r\n\tfput(s->Smap, s->Nsec, fpo);\r\n\tif(s->CMsize) fput(s->Cmap, s->CMsize, fpo);\r\n\tif(s->HMsize) fput(s->Hmap, s->HMsize, fpo);\r\n\r\n\tsize = s->SSize;\r\n\tfor(i=0; i < s->Nsec; ++i) {\r\n\t\tif(fpi) {\r\n\t\t\tj = fget(Buffer, size, fpi);\r\n\t\t\tif(size != j) {\r\n\t\t\t\tmemset(Buffer+j, Fill, size-j);\r\n\t\t\t\tprintf(\"Input file is smaller than output image (ends at CHS %u/%u/%u)\\n\", Cylinder, head, i);\r\n\t\t\t\tfclose(fpi);\r\n\t\t\t\tfpi = 0; } }\r\n\t\telse\r\n\t\t\tmemset(Buffer, Fill, size);\r\n\t\tif(Compress) {\r\n\t\t\tif(issame(size)) {\r\n\t\t\t\tputc(0x02, fpo);\r\n\t\t\t\tputc(Buffer[0], fpo);\r\n\t\t\t\tcontinue; } }\r\n\t\tputc(0x01, fpo);\r\n\t\tfput(Buffer, s->SSize, fpo); }\r\n}\r\n\r\nunsigned char help[] = { \"Copyright 2005-\"#CYEAR\" Dave Dunfield - All rights reserved.\\n\\\r\n\\nUse: BIN2IMD binary-input-file IMD-output-file [option-file] [options]\\n\\n\\\r\nopts:\t/1\t\t\t- 1-sided output\\n\\\r\n\t/2\t\t\t- 2-sided output\\n\\\r\n\t/C\t\t\t- write Compressed sectors\\n\\\r\n\t/U\t\t\t- write Uncompressed sectors\\n\\\r\n\t/V[0|1]\t\t\t- Verbose output\\n\\\r\n\tC=text | @file\t\t- image Comment\\n\\\r\n\tN=#cylinders\t\t- set Number of output cylinders\\n\\\r\n\tDM[s]=0-5\t\t- track Data Mode\\n\\\r\n\tSS[s]=128-8192\t\t- track Sector Size\\n\\\r\n\tSM[s]=n[,n-n][n.#]\t- track Sector numbering Map\\n\\\r\n\tCM[s]=n[,n-n][n.#]\t- track/sector Cylinder\t Map\\n\\\r\n\tHM[s]=n[,n-n][n.#]\t- track/sector Head\t Map\\n\" };\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tunsigned i;\r\n\r\n\tfputs(\"BINary-2-IMageDisk \"#VERSION\" / \"#__DATE__\"\\n\", stdout);\r\n\r\n\tSide0.Mode = Side1.Mode = 255;\r\n\r\n\tfor(i=1; i < argc; ++i) {\r\n\t\tptr = argv[i];\r\n\t\tif(!option(0)) continue;\t\t// Option was recognized\r\n\t\tif(!*Ifile) {\t\t\t\t\t// 1st file = input\r\n\t\t\tfilename(Ifile, argv[i], \".BIN\");\r\n\t\t\tcontinue; }\r\n\t\tif(!*Ofile) {\t\t\t\t\t// 2nd file = output\r\n\t\t\tfilename(Ofile, argv[i], \".IMD\");\r\n\t\t\tcontinue; }\r\n\t\tif(*Ffile)\t\t\t\t\t\t// 3rd file = option\r\n\t\t\terror(\"Bad option\");\r\n\t\tfilename(Ffile, argv[i], \".B2I\"); }\r\n\tptr1 = 0;\r\n\r\n\tif(!(*Ifile && *Ofile))\t\t\t\t// Insufficent files\r\n\t\tabort(help);\r\n\r\n\t// If option file, open it and read first set of parameters\r\n\t// Apply them if they apply to track-0\r\n\tif(*Ffile) {\r\n\t\tfpf = fopen(Ffile, \"rvq\");\r\n\t\tread_format();\r\n\t\tif(!Fmtnext) {\t\t\t// Initial parameters\r\n\t\t\twhile(skip())\r\n\t\t\t\toption(0);\r\n\t\t\tread_format(); } }\r\n\r\n\tvalidate(0);\t\t\t\t// Validate side-0 settings\r\n\tif(Twoside)\r\n\t\tvalidate(1);\t\t\t// Validate side-1 settings\r\n\r\n\tif(Cylinders == -1)\r\n\t\terror(\"N= (cylinders) not specified\");\r\n\r\n\tfpi = fopen(Ifile, \"rvqb\");\r\n\tfpo = fopen(Ofile, \"wvqb\");\r\n\r\n\tget_date(&Day, &Month, &Year);\r\n\tget_time(&Hour, &Minute, &Second);\r\n\tfprintf(fpo, \"IMD \"#VERSION\": %2u/%02u/%04u %2u:%02u:%02u\\r\\n\",\r\n\t\tDay, Month, Year,\r\n\t\tHour, Minute, Second);\r\n\r\n\tif(Cmtsize)\t\t\t\t\t// Output comment if enabled\r\n\t\tfput(Buffer, Cmtsize, fpo);\r\n\tputc(0x1A, fpo);\r\n\r\n\t// For each cylinder write side0 and side1(if enabled) records\r\n\tfor(Cylinder = 0; Cylinder < Cylinders; ++Cylinder) {\r\n\t\tif(Cylinder == Fmtnext) {\r\n\t\t\twhile(skip())\r\n\t\t\t\toption(255);\r\n\t\t\tvalidate(0);\r\n\t\t\tif(Twoside)\r\n\t\t\t\tvalidate(1);\r\n\t\t\tread_format(); }\r\n\t\twrite_track(0);\r\n\t\tif(Twoside)\r\n\t\t\twrite_track(1); }\r\n\r\n\t// Close files + test for excess data in input file\r\n\tfclose(fpo);\r\n\tif(fpi)\t{\r\n\t\tif(fget(Buffer, sizeof(Buffer), fpi))\r\n\t\t\tprintf(\"Input file is larger than output image.\\n\");\r\n\t\tfclose(fpi); }\r\n\tif(fpf) fclose(fpf);\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/DMK2IMD.C",
    "content": "/*\r\n * DMK2IMD - Convert .DMK images to ImageDisk .IMD format\r\n *\r\n * DMK is a popular emulator disk format, which records all track\r\n * data including formatting fields.\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. This source\r\n * code is provided for informational purposes only, and I provide no\r\n * support for it, technical or otherwise.\r\n *\r\n * Copyright 2007-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, however this is\r\n * for the purpose of keeping a say in it's disposition. I encourage the\r\n * use of ideas, algorithms and code fragments contained herein to be used\r\n * in the creation of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include <file.h>\r\n#include \"version.h\"\r\n\r\n#define\tA1A1A1\t0xCDB4\t\t\t// CRC of: 0xA1, 0xA1, 0xA1\r\n\r\n// DMK Image file header\r\nstruct DMK_header {\r\n\tunsigned char\tWP;\t\t\t// Write protect\r\n\tunsigned char\tTracks;\t\t// #tracks\r\n\tunsigned\t\tTsize;\t\t// Track size\r\n\tunsigned char\tDflags;\t\t// Disk flags\r\n\tunsigned char\tFiller[7];\t// Not-used\r\n\tunsigned\t\tNatflag[2];\t// Native mode flag\r\n} Dheader;\r\n\r\nunsigned\r\n\tSeg,\t\t\t\t// Allocated segment\r\n\tP,\t\t\t\t\t// Segment read position\r\n\tNsec,\t\t\t\t// Number of sectors\r\n\tcrctab[256],\t\t// CRC generator table\r\n\tOmap[256];\t\t\t// Data offset map\r\n\r\nunsigned char\r\n\t*File,\t\t\t\t// Filename\r\n\t*Wfile,\t\t\t\t// Write file\r\n\t*Comment,\t\t\t// Comment filename\r\n\t*ptr,\t\t\t\t// General pointer\r\n\tSD,\t\t\t\t\t// Single density flag\r\n\tSD2,\t\t\t\t// SD emulation (2 accesses)\r\n\tForceSD,\t\t\t// Force SD mode\r\n\tAMflag,\t\t\t\t// Address mark encountered flag\r\n\tUdam,\t\t\t\t// User defined data address mark handling\r\n\tWstop = 255,\t\t// Stop on warnings\r\n\tDatarate = 255,\t\t// Datarate value\r\n\tVerbose = 255,\t\t// Allow messages\r\n\tNmap[256],\t\t\t// Numbering map\r\n\tCmap[256],\t\t\t// Cylinder map\r\n\tHmap[256],\t\t\t// Head map\r\n\tSmap[256],\t\t\t// Size map\r\n\tSDmap[256],\t\t\t// Density select map\r\n\tSTmap[256];\t\t\t// Sector type map\r\n\r\nFILE\r\n\t*fpi,\r\n\t*fpo;\r\n\r\n/*\r\n * Debug aid - dump track data memory\r\n *\r\nvoid dump(unsigned a, unsigned l)\r\n{\r\n\tint c;\r\n\tunsigned i, j;\r\n\r\n\tfor(i=0; i < l; i += 16) {\r\n\t\tprintf(\"\\n%04x\", i);\r\n\t\tfor(j=0; j < 16; ++j) {\r\n\t\t\tif(!(j & 3)) putc(' ', stdout);\r\n\t\t\tprintf(\" %02x\", peek(Seg, a+j)); }\r\n\t\tprintf(\"   \");\r\n\t\tfor(j=0; j < 16; ++j) {\r\n\t\t\tc = peek(Seg, a++);\r\n\t\t\tputc( ((c < ' ') || (c > 0x7E)) ? '.' : c, stdout); } }\r\n} */\r\n\r\n/*\r\n * Report error with formatted message and exit\r\n */\r\nregister error(unsigned args)\r\n{\r\n\tunsigned char buffer[100];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tfputs(buffer, stdout);\r\n\tputc('\\n', stdout);\r\n\tif(fpo) fclose(fpo);\r\n\tif(fpi) fclose(fpi);\r\n\texit(-1);\r\n}\r\n\r\n/*\r\n * Warning/Error with formatted message\r\n */\r\nregister warn(unsigned args)\r\n{\r\n\tunsigned char buffer[100];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tfputs(buffer, stdout);\r\n\tputc('\\n', stdout);\r\n\tif(Wstop) {\r\n\t\tif(fpo) fclose(fpo);\r\n\t\tif(fpi) fclose(fpi);\r\n\t\texit(-1); }\r\n}\r\n\r\n/*\r\n * Get a byte from the DMK track with SD duplication if needed\r\n */\r\nunsigned char A, B;\r\nunsigned char getbyte(void)\r\n{\r\n\tasm {\r\n\t\tMOV\t\tES,DGRP:_Seg\t\t\t// Get segment\r\n\t\tMOV\t\tBX,DGRP:_P\t\t\t\t// Get pointer\r\n\t\tMOV\t\tAH,DGRP:_SD2\t\t\t// SD-2 reads\r\n\t\tMOV\t\tAL,ES:[BX]\t\t\t\t// Read data\r\n\t\tINC\t\tBX\t\t\t\t\t\t// Next\r\n\t\tAND\t\tAH,AH\t\t\t\t\t// enabled?\r\n\t\tJZ\t\tgb1\t\t\t\t\t\t// No, it's OK\r\n\t\tMOV\t\tAH,ES:[BX]\t\t\t\t// Read 2nd\r\n\t\tINC\t\tBX\t\t\t\t\t\t// Next\r\n\t\tCMP\t\tAL,AH\t\t\t\t\t// Match?\r\n\t\tJNZ\t\tgb2\t\t\t\t\t\t// No - fail\r\n\t\tXOR\t\tAH,AH\t\t\t\t\t// Clear high\r\ngb1:\tMOV\t\tDGRP:_P,BX\t\t\t\t// Resave\r\n\t\tPOP\t\tBP\t\t\t\t\t\t// Restore stack frame\r\n\t\tRET\r\ngb2:\tMOV\t\tDGRP:_A,AL\t\t\t\t// Save 1st\r\n\t\tMOV\t\tDGRP:_B,AH\t\t\t\t// Save 2nd\r\n\t}\r\n\terror(\"SD data mismatch at %04x %02x!=%02x\", P, A, B);\r\n}\r\n\r\n/*\r\n * Get a word from the DMK track with byte reversal & SD dup if needed\r\n */\r\nunsigned getword(void)\r\n{\r\n\tunsigned l, h;\r\n\th = getbyte();\r\n\tl = getbyte();\r\n\treturn (h << 8) | l;\r\n}\r\n\r\n/*\r\n * CRC using reversed byte/bit ordering\r\n */\r\nunsigned crc(unsigned length, unsigned crc)\r\n{\r\n\tdo {\r\n\t\tcrc = (crc << 8) ^ crctab[((crc >> 8) ^ getbyte()) & 255]; }\r\n\twhile(--length);\r\n\treturn crc;\r\n}\r\n\r\n/*\r\n * Test for block of data being the same in local segment\r\n */\r\nint issame(unsigned char *p, unsigned l)\r\n{\r\n\tunsigned char c;\r\n\tc = *p++;\r\n\twhile(--l) {\r\n\t\tif(*p++ != c)\r\n\t\t\treturn 0; }\r\n\treturn 255;\r\n}\r\n\r\n/*\r\n * Test for block of data being the same in external segment\r\n */\r\nint isxsame(unsigned p, unsigned l)\r\n{\r\n\tunsigned char c;\r\n\tif(SD2)\r\n\t\tl *= 2;\r\n\tc = peek(Seg, p++);\r\n\twhile(--l) {\r\n\t\tif(peek(Seg, p++) != c)\r\n\t\t\treturn 0; }\r\n\treturn 255;\r\n}\r\n\r\n/*\r\n * Display DMK header information to file\r\n */\r\nvoid showheader(FILE *fp)\r\n{\r\n\tunsigned char f;\r\n\tf = Dheader.Dflags;\r\n\tfprintf(fp, \"Tracks:%ux%u %cS%cD\", Dheader.Tracks, Dheader.Tsize,\r\n\t\t(f & 0x10) ? 'S' : 'D', (f & 0x40) ? 'S' : 'M');\r\n\tif(f & 0x80) fputs(\" Ign-D\", fp);\r\n\tif(Dheader.WP) fputs(\" WP\", fp);\r\n\tputc('\\n', fp);\r\n}\r\n\r\n/*\r\n * Copy filename & append extension if required\r\n */\r\nvoid filename(unsigned char *file, unsigned char *ext, char dropext)\r\n{\r\n\tunsigned char ef, *dest, *p;\r\n\tdest = Smap;\r\n\tef = p = 0;\r\n\tfor(;;) switch(*dest++ = *file++) {\r\n\t\tcase 0 :\t\t\t\t\t\t// End of string\r\n\t\t\tif(dropext && p)\t\t\t// Remove extension from source\r\n\t\t\t\t*(p-1) = 0;\r\n\t\t\tif(!ef)\t\t\t\t\t\t// No extension - add\r\n\t\t\t\tstrcpy(dest-1, ext);\r\n\t\t\treturn;\r\n\t\tcase ':' :\t\t\t\t\t\t// Disk specifier\r\n\t\tcase '\\\\' : p = ef = 0;\t\t\t// Directory specifier\r\n\t\t\tcontinue;\r\n\t\tcase '.' :\t\t\t\t\t\t// Extension specifier\r\n\t\t\tp = file;\r\n\t\t\tef = 255; }\r\n}\r\n\r\nchar help[] = { \"\\\r\nDMK-2-IMageDisk \"#VERSION\" / \"#__DATE__\"\\n\\\r\nCopyright 2007-\"#CYEAR\" Dave Dunfield - All rights reserved.\\n\\n\\\r\nUse: DMK2IMD filename[.DMK] [options]\\n\\n\\\r\nOpts:\t/C[filename]\t- insert Comment record\\n\\\r\n\t/H\t\t- force High density\t(500kbps)\\n\\\r\n\t/L\t\t- force Low  density\t(250kbps)\\n\\\r\n\t/S\t\t- force Single-density image\\n\\\r\n\t/UD\t\t- allow User defined DAM - treat as Deleted\\n\\\r\n\t/UN\t\t- allow User defined DAM - treat as Normal\\n\\\r\n\t/W\t\t- continue after Warning\\n\\\r\n\tO=file[.IMD]\t- specify output file\t\t[filename.IMD]\\n\\\r\n\" };\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tint c;\r\n\tunsigned i, j, k, s, t, p, so;\r\n\r\n\t// Process command line arguments\r\n\tfor(i=1; i < argc; ++i) {\r\n\t\tptr = argv[i];\r\n\t\tswitch((toupper(*ptr++) << 8) | toupper(*ptr++)) {\r\n\t\tcase '/C' : Comment = ptr;\t\t\tcontinue;\r\n\t\tcase '/L' : Datarate = 2;\t\t\tcontinue;\r\n\t\tcase '/H' : Datarate = 0;\t\t\tcontinue;\r\n\t\tcase '/S' : ForceSD = 255;\t\t\tcontinue;\r\n\t\tcase '/W' : Wstop = 0;\t\t\t\tcontinue;\r\n\t\tcase 'O=' : Wfile = ptr;\t\t\tcontinue;\r\n\t\tcase '/U' : switch(toupper(*ptr)) {\r\n\t\t\tcase 'N' : Udam = 255;\t\t\tcontinue;\r\n\t\t\tcase 'D' : Udam = 15;\t\t\tcontinue; }\r\n\t\t} if(File)\r\n\t\t\tabort(help);\r\n\t\tFile = ptr-2; }\r\n\r\n\tif(!File)\r\n\t\tabort(help);\r\n\r\n\tif(!(Seg = alloc_seg(4096)))\r\n\t\tabort(\"Out of memory\");\r\n\r\n\t// If comment file specified, preload it into buffer\r\n\tj = k = 0;\r\n\tif(Comment && *Comment) {\r\n\t\tfpi = fopen(Comment, \"rvq\");\r\n\t\twhile((c = getc(fpi)) != EOF)\r\n\t\t\tpoke(Seg, j++, c);\r\n\t\tfclose(fpi); }\r\n\r\n\tIOB_size = 4096;\r\n\r\n\t// Open files\r\n\tfilename(File, \".DMK\", 255);\r\n\tfpi = fopen(Smap, \"rvqb\");\r\n\tfilename(Wfile || File, \".IMD\", 0);\r\n\tfpo = fopen(Smap, \"wvqb\");\r\n\r\n\t// Read header\r\n\tfget(Dheader, sizeof(Dheader), fpi);\r\n\tif(Verbose)\r\n\t\tshowheader(stdout);\r\n\r\n\t// Generate IMD comment\r\n\tfputs(\"IMD DMK \", fpo);\r\n\tshowheader(fpo);\r\n\tif(Comment) {\r\n\t\tif(j) {\t\t\t\t// Already preloaded\r\n\t\t\tfor(i=0; i < j; ++i)\r\n\t\t\t\tputc(k=peek(Seg, i), fpo); }\r\n\t\telse {\t\t\t\t// Prompt for input\r\n\t\t\tprintf(\"Enter image file comment - ^Z to end:\\n\");\r\n\t\t\twhile((i = getc(stdin)) != EOF)\r\n\t\t\t\tputc(k=i, fpo); }\r\n\t\tif(k != '\\n')\r\n\t\t\tputc('\\n', fpo); }\r\n\tputc(0x1A, fpo);\t\t// Ascii EOF - terminate comment\r\n\r\n\tif(ForceSD)\r\n\t\tDheader.Dflags |= 0x40;\r\n\r\n\t// If data rate not specified, make a \"guess\" based on tracksize\r\n\tif(Datarate > 2) {\r\n\t\ti = Dheader.Tsize;\r\n\t\tif(Dheader.Dflags & 0x40)\t\t// Single-density\r\n\t\t\ti *= 2;\t\t\t\t\t\t// Double the bits\r\n\t\tDatarate = (i < 6500) ? 2 : 0;\r\n\t\tif(Verbose)\r\n\t\t\tprintf(\"Assuming %ukbps data rate.\\n\", Datarate ? 250 : 500); }\r\n\r\n\t// Build the high-speed CRC table\r\n\tfor(i=0; i < 256 ; ++i) {\r\n\t\tk = i << 8;\r\n\t\tfor(j=0; j < 8; ++j)\r\n\t\t\tk = (k << 1) ^ ((k & 0x8000) ? 0x1021 : 0);\r\n\t\tcrctab[i] = k; }\r\n\r\n\tfor(t = 0; t < Dheader.Tracks; ++t) {\r\n\t\tfor(i=0; i < Dheader.Tsize; ++i) {\r\n\t\t\tif((c = getc(fpi)) == EOF)\r\n\t\t\t\terror(\"%u/ Unexpected EOF in DMK image\", t);\r\n\t\t\tpoke(Seg, i, c); }\r\n\t\tNsec = so = 0;\r\n\t\twhile((Nsec < 128) && (s = peekw(Seg, so))) {\r\n\t\t\tso += 2;\r\n\t\t\tif(SDmap[Nsec] = SD2 = SD = (s & 0x8000) ? 0 : 255) {\t// SD\r\n\t\t\t\tif(Dheader.Dflags & 0xC0)\t\t// Physical format is SD\r\n\t\t\t\t\tSD2 = 0; }\t\t\t\t\t// No need to emulate\r\n\t\t\tP = p = s & 0x3FFF;\t\t\t\t\t// DMK address mark offset\r\n\t\t\tif((p < 128) || (p >= Dheader.Tsize)) {\r\n\t\t\t\twarn(\"%u/%u Sector offset %04x out of range\", t, Nsec, p);\r\n\t\t\t\tcontinue; }\t\t\t\t\t\t// NoSector\r\n\t\t\tif(peek(Seg, P) != 0xFE) {\r\n\t\t\t\twarn(\"%u/%u Invalid ID address mark: %02x\", t, Nsec, peek(Seg, s));\r\n\t\t\t\tcontinue; }\t\t\t\t\t\t// NoSector\r\n\r\n\t\t\t// Check header CRC & Extract data\r\n\t\t\ti = crc(5, SD ? -1 : A1A1A1);\r\n\t\t\tif(getword() != i) {\r\n\t\t\t\twarn(\"%u/%u ID CRC error\", t, Nsec);\r\n\t\t\t\tcontinue; }\t\t\t\t\t\t// NoSector\r\n\r\n\t\t\t// Extract ID fields\r\n\t\t\tP = p;\t\t\t\t\t\t\t\t// Reset input pointer\r\n\t\t\tgetbyte();\t\t\t\t\t\t\t// Skip address mark\r\n\t\t\tCmap[Nsec] = getbyte();\t\t\t\t// Get Cylinder\r\n\t\t\tHmap[Nsec] = getbyte();\t\t\t\t// Get Head\r\n\t\t\tNmap[Nsec] = getbyte();\t\t\t\t// Get Number\r\n\t\t\tSmap[Nsec] = s = getbyte();\t\t\t// Get Size\r\n\t\t\tSTmap[Nsec] = 1;\t\t\t\t\t// Assume normal data\r\n\t\t\tgetword();\t\t\t\t\t\t\t// Clear CRC\r\n\r\n\t\t\t// Validate data block\r\n\t\t\tk = 50;\r\nfindam:\t\tif(!--k) {\r\n\t\t\t\twarn(\"%u/%u Did not find DAM\", t, Nsec);\r\n\t\t\t\tOmap[Nsec] = 0;\t\t\t\t\t// Data unavailable\r\n\t\t\t\tgoto skipdata; }\r\n\t\t\tswitch(i = getbyte()) {\r\n\t\t\tdefault: goto findam;\r\n\t\t\tcase 0xF9 :\t\t\t\t\t\t\t// User defined ...\r\n\t\t\tcase 0xFA :\t\t\t\t\t\t\t// Data marks\r\n\t\t\t\tif(!Udam)\r\n\t\t\t\t\terror(\"%u/%u User defined DAM %02x\", t, Nsec, i);\r\n\t\t\t\tif(Udam & 0xF0)\r\n\t\t\t\t\tbreak;\r\n\t\t\tcase 0xF8 : STmap[Nsec] = 3;\t\t// Deleted data mark\r\n\t\t\tcase 0xFB : }\t\t\t\t\t\t// Normal data mark\r\n\r\n\t\t\t// Check data CRC\r\n\t\t\tOmap[Nsec] = P;\t\t\t\t\t\t// Record offset\r\n\t\t\tP -= (SD2 ? 2 : 1);\r\n\t\t\ti = crc((128 << s) + 1, SD ? -1 : A1A1A1);\r\n\t\t\tif(getword() != i) {\r\n\t\t\t\twarn(\"%u/%u Data CRC error\", t, Nsec);\r\n\t\t\t\tSTmap[Nsec] += 4; }\r\nskipdata:\t++Nsec; }\r\n\r\n\t\tif(!Nsec)\t\t// No sectors on this track\r\n\t\t\tcontinue;\r\n\r\n\t\t// Check conditions IMD cannot currently handle (due to 765 limitation)\r\n\t\tif(!issame(SDmap, Nsec))\r\n\t\t\terror(\"%u/%u PC cannot format mixed density within a track\", t, Nsec);\r\n\t\tif(!issame(Smap, Nsec))\r\n\t\t\terror(\"%u/%u PC cannot format mixed sector size within a track\", t, Nsec);\r\n\r\n\t\t// Generate an IMD track record\r\n\t\tputc((SD ? 0x00 : 0x03) + Datarate, fpo);\t// Encoding type\r\n\t\tif(Dheader.Dflags & 0x10) {\t\t\t\t\t// Single-sided\r\n\t\t\ti = t;\t\t\t\t\t\t\t\t\t// Track index as is\r\n\t\t\tj = 0; }\t\t\t\t\t\t\t\t// Head always even\r\n\t\telse {\r\n\t\t\ti = t >> 1;\t\t\t\t\t\t\t\t// Track index / 2\r\n\t\t\tj = t & 1; }\t\t\t\t\t\t\t// Head = even/odd\r\n\t\tif((*Hmap != j) || !issame(Hmap, Nsec))\t\t// Head map required\r\n\t\t\tj |= 0x40;\r\n\t\tif((*Cmap != i) || !issame(Cmap, Nsec))\t\t// Cylinder map required\r\n\t\t\tj |= 0x80;\r\n\t\tputc(i, fpo);\t\t\t\t\t\t\t\t// Cylinder\r\n\t\tputc(j, fpo);\t\t\t\t\t\t\t\t// Head\r\n\t\tputc(Nsec, fpo);\t\t\t\t\t\t\t// # sectors\r\n\t\tputc(*Smap, fpo);\t\t\t\t\t\t\t// Sector size\r\n\t\tfput(Nmap, Nsec, fpo);\t\t\t\t\t\t// Sector numbering map\r\n\t\tif(j & 0x80)\t\t\t\t\t\t\t\t// Cylinder numbering map\r\n\t\t\tfput(Cmap, Nsec, fpo);\r\n\t\tif(j & 0x40)\t\t\t\t\t\t\t\t// Head numbering map\r\n\t\t\tfput(Hmap, Nsec, fpo);\r\n\r\n\t\t// Generate the sector data records\r\n\t\ts = (unsigned)128 << *Smap;\t\t\t\t\t// Actual sector size\r\n\t\tfor(i=0; i < Nsec; ++i) {\r\n\t\t\tSD2 = SDmap[i];\t\t\t\t\t\t\t// Single density\r\n\t\t\tif(Dheader.Dflags & 0xC0)\t\t\t\t// Physical format is SD\r\n\t\t\t\tSD2 = 0;\t\t\t\t\t\t\t// No need to emulate\r\n\t\t\tif(!(P = Omap[i])) {\t\t\t\t\t// Data unavailable\r\n\t\t\t\tputc(0x00, fpo);\r\n\t\t\t\tcontinue; }\r\n\t\t\tif(isxsame(P, s)) {\t\t\t\t\t\t// Compressed\r\n\t\t\t\tputc(STmap[i] + 1, fpo);\r\n\t\t\t\tputc(getbyte(), fpo); }\r\n\t\t\telse  {\t\t\t\t\t\t\t\t\t// Normal data\r\n\t\t\t\tputc(STmap[i], fpo);\r\n\t\t\t\tfor(j=0; j < s; ++j)\r\n\t\t\t\t\tputc(getbyte(), fpo); } } }\r\n\r\n\tfclose(fpo);\r\n\tfclose(fpi);\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/IMD.C",
    "content": "/*\r\n * ImageDisk - A PC based floppy disk archival/restore utility\r\n *\r\n * ImageDisk is a program to read entire diskette images into files\r\n * (type .IMD), and to recreate a copy of the diskette from that image.\r\n * A detailed analysis is performed on the diskette, and information about\r\n * the formatting is recorded in the image file. This allows ImageDisk to\r\n * work with virtually any soft sectored diskette format that is compatible\r\n * with the PC's type 765 floppy diskette controller and drives.\r\n *\r\n * ImageDisk performs direct hardware access to the floppy disk controller\r\n * chip, and therefore cannot run under operating systems which do not\r\n * permit application programs such access. These include Windows NT,\r\n * 2000 and XP. I strongly recommend running the program under pure DOS.\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. This source\r\n * code is provided for informational purposes only, and I provide no\r\n * support for it, technical or otherwise.\r\n *\r\n * Copyright 2005-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, however this is\r\n * for the purpose of keeping a say in it's disposition. I encourage the\r\n * use of ideas, algorithms and code fragments contained herein to be used\r\n * in the creation of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\t\t\t\t// Standard I/O definition\r\n#include <file.h>\t\t\t\t// File system definitions\r\n#include <window.h>\t\t\t\t// Windowing definitions\r\n#include <keys.h>\t\t\t\t// BIOS key codes\r\n#include <setjmp.h>\t\t\t\t// setjmp/longjmp definitions\r\n#include \"version.h\"\t\t\t// Version indicator\r\n\r\n// Misc options and parameters\r\n#define\tMSEC\t\t256\t\t\t// Maximum sectors/track supported\r\n#define\tCFG_X\t\t45\t\t\t// Settings X position\r\n#define\tCFG_Y\t\t2\t\t\t// Settings Y position\r\n#define\tSFILES\t\t110\t\t\t// Number of files that can be selected\r\n#define\tTIMEOUT\t\t36\t\t\t// 2 seconds (55ms ticks)\r\n#define\tMDEL\t\t100\t\t\t// Minimum delay\r\n\r\n// Status index values\r\n#define\tST_TOTAL\t0\t\t\t// Total sector count\r\n#define\tST_COMP\t\t1\t\t\t// Number Compressed\r\n#define\tST_DAM\t\t2\t\t\t// Number Deleted\r\n#define\tST_BAD\t\t3\t\t\t// Number Bad\r\n#define\tST_UNAVAIL\t4\t\t\t// Number unavailable\r\n\r\n// The low-level FDC functions are coded both in 'C' for readability,\r\n// and in hand-optimized assembler to improve performance on PC/XT class\r\n// Machines - define the following \"CIO\" symbol to enable the C versions.\r\n//#define\t\t\tCIO\t\t\t// Define for 'C' versions of I/O functions\r\n\r\n// Help file index markers\r\n#define\tHINDEX\t\t0\t\t\t// Main help index\r\n#define\tHCMD\t\t1\t\t\t// Command line options\r\n#define\tHMAIN\t\t2\t\t\t// Main operating window\r\n#define\tHSET\t\t3\t\t\t// Settings\r\n#define\tHALIGN\t\t4\t\t\t// Align/Test\r\n#define\tHEXCL\t\t5\t\t\t// Sector exclusion map\r\n#define\tHFILE\t\t6\t\t\t// File selection\r\n#define\tHENTRY\t\t7\t\t\t// Data entry\r\n\r\n// Special PC video characters\r\n#define\tBDONE\t\t0xDF\t\t// Bottom side done\r\n#define\tTDONE\t\t0xDC\t\t// Top side done\r\n#define\tCONE\t\t0xF9\t\t// Cylinder scale - ONE marker\r\n#define\tCFIVE\t\t0x04\t\t// Cylinder scale - FIVE marker\r\n\r\n// Help system constants\r\n#define\tLINK_S\t\t('N'-0x40)\t// Start of link marker\r\n#define\tLINK_E\t\t('O'-0x40)\t// End   of link marker\r\n#define\tTAB_SIZE\t4\t\t\t// Spacing of TABs\r\n#define\tLINKS\t\t25\t\t\t// Maximum # links per screen\r\n\r\n// Comment editor parameters\r\n#define\tLNUM\t\t8\t\t\t// Number of lines\r\n#define\tLSIZE\t\t63\t\t\t// Size of each line\r\n#define\tLS1\t\t\t64\t\t\t// Lsize+1 (Total size required = LNUM*LS1)\r\n\r\n#define\tTICK peekw(0x40,0x6C)\t// BIOS Clock Tick\r\n\r\n#define\tFDCS\t\t(FDC+2)\t\t// Offset to FDC status register\r\n#define\tFDCD\t\t(FDC+3)\t\t// Offset to FDC data   register\r\n\r\n// Video attribute indexes\r\n#define\tAT_STAT\t\t0\t\t\t// Status window- normal\r\n#define\tAR_STAT\t\t1\t\t\t// Status window- reversed\r\n#define\tAH_STAT\t\t2\t\t\t// Status window- hilited\r\n#define\tAT_MAIN\t\t3\t\t\t// Main window\t- normal\r\n#define\tAR_MAIN\t\t4\t\t\t// Main window\t- reversed\r\n#define\tAH_MAIN\t\t5\t\t\t// Main window\t- hilited\r\n#define\tAT_POP\t\t6\t\t\t// pop-ups\t\t- normal\r\n#define\tAR_POP\t\t7\t\t\t// pop-ups\t\t- reversed\r\n#define\tAT_HELP\t\t8\t\t\t// Help window\t- normal\r\n#define\tAT_LINK\t\t9\t\t\t// Help link\t- normal\r\n#define\tAH_LINK\t\t10\t\t\t// Help link\t- hilited\r\n\r\nunsigned char video[] = {\t\t// Color video attributes\r\n\t0x47, 0x74, 0x4B, 0x17, 0x71, 0x1E, 0x70, 0x07, 0x70, 0x71, 0x17 };\r\nunsigned char mvideo[] = {\t\t// Mono video attributes\r\n\t0x70, 0x07, 0x1F, 0x07, 0x70, 0x07, 0x70, 0x07, 0x07, 0x0A, 0x70 };\r\n\r\n// Diskette side specific parameters\r\nstruct SIDE {\r\n\tunsigned Stop;\t\t\t\t// Top of sector list (# sectors)\r\n\tunsigned Lmsn;\t\t\t\t// Mode/Ssize/Nsectors\r\n\tunsigned char Mode;\t\t\t// Mode (rate/Density)\r\n\tunsigned char Ssize;\t\t// Sector size (128 << Ssize)\r\n\tunsigned char Eot;\t\t\t// Last sector in track\r\n\tunsigned char Smap[MSEC];\t// Sector numbering map\r\n\tunsigned char Cmap[MSEC];\t// Sector cylinder map\r\n\tunsigned char Hmap[MSEC]; }\t// Sector head map\r\n\t\tS0,\t\t\t\t\t\t// Side-1 structure\r\n\t\tS1,\t\t\t\t\t\t// Side-2 structure\r\n\t\t*S;\t\t\t\t\t\t// Pointer to current side\r\n\r\nunsigned\r\n\tWdata,\t\t\t\t// Write data\r\n\tFIseg,\t\t\t\t// Floppy interrupt segment\r\n\tFIoff,\t\t\t\t// Floppy interrupt offset\r\n\tSEG,\t\t\t\t// External segment\t(aligned to 64k boundary)\r\n\tDMA,\t\t\t\t// DMA segment \t\t(advanced for each read/write)\r\n\tFDC = 0x3F2,\t\t// Base address of FDC\r\n\tMsn,\t\t\t\t// Mode, Sector-size, Nsectors\r\n\tLmsn,\t\t\t\t// Last Msn (for change detect)\r\n\tRcount,\t\t\t\t// Top of FDC result list (#results)\r\n\tStop,\t\t\t\t// Top of track sector list (#sectors)\r\n\tTimeout,\t\t\t// FDC timeout counter\r\n\tPPort,\t\t\t\t// Parallel port address (0=Disabled)\r\n\tSKdel = 55,\t\t\t// Seek delay\r\n\tRetry = 5,\t\t\t// Maximum retries\r\n\tCpass = 3,\t\t\t// Number of cleaning passes\r\n\tSTcount[5],\t\t\t// Status counts\r\n\tLkey,\t\t\t\t// Last keypress detected\r\n// The following must be together and initialized as they are\r\n// save and restored as a FSSIZE-byte block\r\n\tFn=9, Fm=5,\t\t\t// Format parameters (Mode, Sec/track)\r\n\tFs=2, Fss=1;\t\t// Format parameters (Sec-size, Starting#)\r\nunsigned char\r\n\tFfill = 0xE5,\t\t// Format fill byte\r\n\tIntl = 0,\t\t\t// Interleave factor\r\n#define FSSIZE 10\t\t// Size of saved block\r\n\tFMTflag,\t\t\t// Format saved flag\r\n\tFMTsave[11];\t\t// Format save buffer\r\n\r\nunsigned char\r\n\t*ptr,\t\t\t\t// General pointer\r\n\t*ptr1,\t\t\t\t// General pointer\r\n\tTGman,\t\t\t\t// Manual TG43 setting\r\n\tTGcyl = 43,\t\t\t// TG43 cylinder number\r\n\tPPlow = 0xF0,\t\t// Pport-TG43 low value\r\n\tPPhigh = 0x0F,\t\t// Pport-TG43 high value\r\n\tDstep = 0x55,\t\t// Double-Step flag\t\t\t(55 = As original)\r\n\tDds,\t\t\t\t// Active double-step\r\n\tDana = 255,\t\t\t// Detailed analysis\t\t(0\t= Enable)\r\n\tDam = 255,\t\t\t// Allow Deleted-Data Address-Mark\r\n\tBad,\t\t\t\t// Keep Bad sectors\r\n\tFmtOK,\t\t\t\t// Format parameters set\r\n\tFa0,\t\t\t\t// Force side0 analysis\r\n\tFa1,\t\t\t\t// Force side1 analysis\r\n\tDrive,\t\t\t\t// Selected drive\t\t\t(0=3=A-D)\r\n\tMaxdrive = 2,\t\t// Number of drives supported on FDC\r\n\tCylinders = 80,\t\t// Number of cylinders\r\n\tCylinder,\t\t\t// Current Cylinder\r\n\tHead,\t\t\t\t// Current Head\r\n\tHflag,\t\t\t\t// Optional bits encoded with HEAD\r\n\tSector,\t\t\t\t// Current Sector\r\n\tSsize,\t\t\t\t// Sector size (128 << Ssize)\r\n\tSide1 = 0x55,\t\t// Read side-1\t\t\t\t(55 = As original)\r\n\tSs1,\t\t\t\t// Active side-1\r\n\tGl = 0x1B,\t\t\t// Gap length (write) 0x18\r\n\tGlf = 0x54,\t\t\t// Gap length (format) 0x30\r\n\tXgl = 255,\t\t\t// Override gap length (write)\r\n\tXglf = 255,\t\t\t// Override gap length (format)\r\n\tSPsrt = 8,\t\t\t// Step rate\r\n\tSPhlt = 127,\t\t// Head load time\r\n\tSPhut = 15,\t\t\t// Head unload time\r\n\tNintl,\t\t\t\t// Interleave was changed\r\n\tLrate,\t\t\t\t// Locked data rate\t\t\t(Fn = active)\r\n\tEot,\t\t\t\t// Last sector in track\r\n\tMode,\t\t\t\t// Bitrate/Density selector\r\n\tLc,\t\t\t\t\t// Last Cylinder accessed\r\n\tLh = 255,\t\t\t// Last Head accessed\r\n\tMfm,\t\t\t\t// DoubleDensity indicator\r\n\tXhelp,\t\t\t\t// Startup Help flag (0=Enable)\r\n\tResync,\t\t\t\t// Resync state counter\r\n\tResult[15],\t\t\t// Results from FDC\r\n\tScale[81],\t\t\t// Scale characters (for display)\r\n\t*Smap,\t\t\t\t// Current sector numbering map\r\n\t*Cmap,\t\t\t\t// Current sector cylinder map\r\n\t*Hmap,\t\t\t\t// Current sector head map\r\n\tSflag[MSEC],\t\t// Current sector flags\r\n\tSskip[MSEC],\t\t// Sector skip flags\r\n\tImap[MSEC],\t\t\t// Interleave map\r\n\tbuffer[512];\t\t// General buffer\r\n\t\r\nunsigned Mtext[] = {\t// Translate Mode%3 to actual data rate\r\n\t500, 300, 250 };\r\n\r\n// Mode translation table\r\nunsigned char Mtran[] = { 0, 1, 2, 3, 4, 5 };\r\n\r\n// Digital Output Register - Drive seleect (0-3) values\r\nunsigned char DORsel[] = { 0x14, 0x25, 0x46, 0x87 };\r\n\r\nstruct WINDOW\r\n\t*swin,\t\t\t\t// Status window\r\n\t*pwin,\t\t\t\t// Progress window\r\n\t*mwin;\t\t\t\t// Main output window\r\n\r\njmp_buf\r\n\txmain;\t\t\t\t// Exit to main\r\n\r\n// Table of Sector size/number to gap lengths\r\nunsigned char gl_table[] = {\r\n\t0x00, 0x1A, 0x07, 0x1B,\t// 8\" FM\r\n\t0x01, 0x0F, 0x0E, 0x2A,\r\n\t0x02, 0x08, 0x1B, 0x3A,\r\n\t0x03, 0x04, 0x47, 0x8A,\r\n\t0x04, 0x02, 0xC8, 0xFF,\r\n\t0x05, 0x01, 0xC8, 0xFF,\r\n\t0x01, 0x1A, 0x0E, 0x36,\t// 8\" MFM\r\n\t0x02, 0x0F, 0x1B, 0x54,\r\n//\t0x02, 0x10, 0x18, 0x3C,\r\n\t0x03, 0x08, 0x35, 0x74,\r\n\t0x04, 0x04, 0x99, 0xFF,\r\n\t0x05, 0x02, 0xC8, 0xFF,\r\n\t0x06, 0x01, 0xC8, 0xFF,\r\n\t0x00, 0x12, 0x07, 0x09,\t// 5\" FM\r\n\t0x00, 0x10, 0x10, 0x19,\r\n\t0x01, 0x08, 0x18, 0x30,\r\n\t0x02, 0x04, 0x46, 0x87,\r\n\t0x03, 0x02, 0xC8, 0xFF,\r\n\t0x04, 0x01, 0xC8, 0xFF,\r\n\t0x01, 0x12, 0x0A, 0x0C,\t// 5\" MFM\r\n\t0x01, 0x10, 0x20, 0x32,\r\n\t0x02, 0x08, 0x2A, 0x50,\r\n\t0x02, 0x09, 0x18, 0x40,\r\n\t0x02, 0x0A, 0x07, 0x0E,\r\n\t0x03, 0x04, 0x8D, 0xF0,\r\n\t0x04, 0x02, 0xC8, 0xFF,\r\n\t0x05, 0x01, 0xC8, 0xFF,\r\n//\t0x02, 0x0F, 0x2A, 0x50,\t// 1.2MB 5.25\r\n\t0x02, 0x12, 0x1B, 0x54,\t// 1.4MB 3.5\r\n\t0xFF };\r\n\r\nFILE\r\n\t*fp;\t\t\t\t\t// General file pointer\r\n\r\nunsigned char\r\n\tDirectory[70],\t\t\t// Select file: Saved directory\r\n\t*Dip;\t\t\t\t\t// Select file: Directory pointer\r\n\r\nextern char *ARGV[];\t\t// Help: to access program name\r\n\r\n/*\r\n * Restore format parms if changed\r\n */\r\nvoid fmtrest(void)\r\n{\r\n\tif(FMTflag == 0x55) {\r\n\t\tmemcpy(&Fn, FMTsave, FSSIZE);\r\n\t\tFMTflag = 0; }\r\n}\r\n\r\n/*\r\n * Check for format changed\r\n */\r\nint format_changed(void)\r\n{\r\n\tMsn = ((Mode * Ssize) << 8) | Stop;\r\n\tif(Msn != Lmsn) {\r\n\t\tLmsn = Msn;\r\n\t\treturn 255; }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Turn off the parallel port TG43 output\r\n */\r\nvoid ppoff(void)\r\n{\r\n\tif(PPort)\r\n\t\tout(PPort, PPlow);\r\n}\r\n\r\n/*\r\n * Update the Cylinder and Head indicators and select correct side structure\r\n */\r\nvoid upCH(void)\r\n{\r\n\tw_gotoxy(15, 0, swin);\r\n\tw_printf(swin, \"T%-3u H%u\", Cylinder, Head);\r\n\r\n\t// Copy the parameters for this side to globals for easy access.\r\n\t// (This should just be a struct pointer, however the original\r\n\t//  program used a set of globals and this was an easy to way\r\n\t//  to enhance it to support side specific data without a lot of\r\n\t//  changes.\r\n\tS = Head ? S1 : S0;\r\n\tMode\t= S->Mode;\r\n\tSsize\t= S->Ssize;\r\n\tStop\t= S->Stop;\r\n\tEot\t\t= S->Eot;\r\n\tSmap\t= S->Smap;\r\n\tCmap\t= S->Cmap;\r\n\tHmap\t= S->Hmap;\r\n}\r\n\r\n/*\r\n * Begin a new status line, with cylinder/head indicator if changed.\r\n */\r\nregister newch(unsigned args)\r\n{\r\n\tunsigned char buffer[81];\r\n\t_format_(nargs() * 2 + & args, buffer);\r\n\tif((Cylinder != Lc) || (Head != Lh))\r\n\t\twprintf(\"\\n%3u/%u: \", Lc = Cylinder, Lh=Head);\r\n\telse\r\n\t\twputs(\"\\n     : \");\r\n\twputs(buffer);\r\n}\r\n\r\n/*\r\n * Reorder the sectors to the requested interleave.\r\n * If necessary, calculate optimal interleave.\r\n */\r\nvoid interleave(void)\r\n{\r\n\tunsigned i, j, k;\r\n\tunsigned char D, E, F, G, *map;\r\n\r\n\tNintl = 255;\r\n\r\n\t// First sort sector numbering map to obtain a\r\n\t// sequential list of sectors\r\n\tmap = buffer+256;\r\n\tmemcpy(Sflag, Smap, Stop);\r\n\tfor(i=0; i < Stop; ++i)\r\n\t\tmap[i] = i;\r\n\tfor(i=0; i < Stop; ++i) {\r\n\t\tD = Sflag[i];\r\n\t\tF = map[i];\r\n\t\tfor(j=i+1; j < Stop; ++j) {\r\n\t\t\tE = Sflag[j];\r\n\t\t\tif(E < D) {\r\n\t\t\t\tG = map[j];\r\n\t\t\t\tSflag[j] = D;\r\n\t\t\t\tSflag[i] = D = E;\r\n\t\t\t\tmap[j] = F;\r\n\t\t\t\tmap[i] = F = G; } } }\r\n\r\n\tif(Intl == 255) {\t\t// Best guess - calculate interleave\r\n\t\t// Scan sector map to determine interleave occurances\r\n\t\tmemset(buffer, 0, Stop);\r\n\t\tfor(i=j=k=0; i < Stop; ++i) {\r\n\t\t\tD = Sflag[i];\r\n\t\t\tE = Sflag[(i+1)%Stop];\r\n\t\t\twhile(Smap[j] != D)\r\n\t\t\t\tj = (j + 1) % Stop;\r\n\t\t\twhile(Smap[k] != E)\r\n\t\t\t\tk = (k + 1) % Stop;\r\n\t\t\tE = (k >= j) ? k-j : Stop-(j-k);\r\n\t\t\t++buffer[E]; }\r\n\r\n\t\t// Locate best interleave value\r\n\t\tD = k = 0;\r\n\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\tif(buffer[i] > D) {\r\n\t\t\t\tk = i;\r\n\t\t\t\tD = buffer[i]; } } }\r\n\telse\r\n\t\tk = Intl;\r\n\r\n\tw_gotoxy(58, 0, swin);\r\n\tw_printf(swin, \"%u:1\", k);\r\n\r\n\t// Regenerate the Sector Numbering Map using\r\n\t// the sector list and requested interleave\r\n\tmemset(buffer, 0, Stop);\r\n\tfor(i=j=0; i < Stop; ++i) {\r\n\t\twhile(buffer[j])\r\n\t\t\tj = (j + 1) % Stop;\r\n\t\tImap[j] = map[i];\r\n\t\tbuffer[j] = 255;\r\n\t\tj = (j + k) % Stop; }\r\n}\r\n\r\n/*\r\n * Update individual map value\r\n */\r\nvoid update_int(unsigned char *map)\r\n{\r\n\tunsigned i;\r\n\tmemcpy(buffer, map, Stop);\r\n\tfor(i=0; i < Stop; ++i)\r\n\t\tmap[i] = buffer[Imap[i]];\r\n}\r\n\r\n/*\r\n * Compute gap length and update format displays\r\n */\r\nvoid compute_gl(unsigned char iupdate)\r\n{\r\n\tunsigned i, s, gl, glf;\r\n\r\n\t// First, look to see if Ssize/Nsec combination is in our table\r\n\tfor(i=0; (s = gl_table[i]) != 0xFF; i += 4) {\r\n\t\tif((s == Ssize) && (gl_table[i+1] == Stop)) {\r\n\t\t\tgl = gl_table[i+2];\r\n\t\t\tglf = gl_table[i+3];\r\n\t\t\tgoto exit; } }\r\n\r\n\t// Rough calculation to approximate usable gaps\r\n\tswitch(Mtext[Mode % 3]) {\r\n\tcase 300 :\r\n\tcase 250 : i = 3125-104;\tbreak;\r\n\tcase 500 : i = 5208-173; }\r\n\r\n\tif(Mfm)\t\t// DD: 144+GL2 + Nx(62+SS+GL1)\r\n\t\tglf = (((i*2)-144) / Stop) - 62;\r\n\telse\t\t// SD: 73+GL2 + Nx(33+SS+GL1)\r\n\t\tglf = ((i - 73) / Stop) - 33;\r\n\r\n\tgl = 128 << Ssize;\r\n\tif((glf <= gl) || ((glf -= gl) < 13))\r\n\t\tglf = 13;\r\n\tgl = (glf * 2) / 3;\r\n\tif((gl -= (gl / 5)) < 7)\r\n\t\tgl = 7;\r\n\tif(gl > 200)\r\n\t\tgl = 200;\r\n\tif(glf > 255)\r\n\t\tglf = 255;\r\n\r\nexit:\r\n\t// If fixed gaps are not selected, copy in new values\r\n\tif(Xgl) Gl = gl;\r\n\tif(Xglf) Glf = glf;\r\n\r\n\t// Update format displays\r\n\tw_gotoxy(40, Nintl = 0, swin);\r\n\tw_printf(swin, \"%2ux%-5u%-4u%-3u\", Stop, 128 << Ssize, Gl, Glf);\r\n\tMsn = ((Mode * Ssize) << 8) | Stop;\r\n\tif(S->Lmsn != Msn) {\r\n\t\tS->Lmsn = Msn;\r\n\t\tnewch(\"%uk %cD - %u sectors of %u bytes - G1:%u G2:%u\",\r\n\t\t\tMtext[Mode % 3], Mfm ? 'D' : 'S', Stop, 128 << Ssize, Gl, Glf);\r\n\t\tif(Intl) {\r\n\t\t\tinterleave();\r\n\t\t\tif(iupdate) {\r\n\t\t\t\tupdate_int(Smap);\r\n\t\t\t\tif(Hflag & 0x80)\tupdate_int(Cmap);\r\n\t\t\t\tif(Hflag & 0x40)\tupdate_int(Hmap); } } }\r\n\tw_gotoxy(0, 1, swin);\r\n\tfor(i=0; i < Stop; ++i)\r\n\t\tw_printf(swin, \" %u\", Smap[i]);\r\n}\r\n\r\n/*\r\n * Update the cylinder bar graph with status character\r\n */\r\nvoid Cstat(unsigned char c)\r\n{\r\n\tif(c) {\t\t// Status char - write in head position\r\n\t\tif(Cylinder >= 80) {\t// More than 80, restart with highlight\r\n\t\t\t*pwin  = video[AH_STAT];\r\n\t\t\tw_gotoxy(Cylinder % 80, Head ? 0 : 2, pwin);\r\n\t\t\tw_putc(c, pwin);\r\n\t\t\t*pwin = video[AT_STAT];\r\n\t\t\treturn; }\r\n\t\tw_gotoxy(Cylinder, Head ? 0 : 2, pwin);\r\n\t\tw_putc(c, pwin); }\r\n\r\n\t// Update status bar position indicator only\r\n\tw_gotoxy(Cylinder, 1, pwin);\r\n\t*pwin = video[AR_STAT];\r\n\tw_putc(Scale[Cylinder], pwin);\r\n\t*pwin = video[AT_STAT];\r\n}\r\n\r\n/*\r\n * Update full status bar display for random cylinder\r\n */\r\nvoid upCYL(void)\r\n{\r\n\tunsigned i;\r\n\tw_gotoxy(0, 1, pwin);\r\n\tfor(i=0; i < 80; ++i) {\r\n\t\t*pwin = video[(i > Cylinder) ? AT_STAT : AR_STAT];\r\n\t\tw_putc(Scale[i], pwin); }\r\n\t*pwin = video[AT_STAT];\r\n}\r\n\r\n/*\r\n * Display function prompt text on left-hand side of screen\r\n */\r\nvoid prompt(unsigned char *p[], unsigned x)\r\n{\r\n\tunsigned y, i, w;\r\n\tunsigned char *ip;\r\n\r\n\tfor(y=i=0; y < 17; ++y) {\r\n\t\twgotoxy(x, y+2);\r\n\t\tif(ip = p[i])\r\n\t\t\t++i;\r\n\t\telse\r\n\t\t\tip = \"\";\r\n\t\tw = 40;\r\n\t\tif(*ip && (*ip < ' ')) {\r\n\t\t\tw -= *ip;\r\n\t\t\twputf(\"\", *ip++); }\r\n\t\twputf(ip, w); }\r\n}\r\n\r\n/*\r\n * Draw the blank cylinder bar-graph\r\n */\r\nvoid draw_scale(void)\r\n{\r\n\tw_gotoxy(0, 1, pwin);\r\n\tw_puts(Scale, pwin);\r\n}\r\n\r\n/*\r\n * Close pending windows\r\n */\r\nvoid wcloseall(struct WINDOW *level)\r\n{\r\n\twhile(W_OPEN != level)\r\n\t\twclose();\r\n}\r\n\r\n/*\r\n * Display a title on a window\r\n */\r\nvoid wintitle(unsigned x, char *ptr)\r\n{\r\n\tunsigned char buffer[6];\r\n\tmemcpy(buffer, W_OPEN, 6);\r\n\tW_OPEN[1] &= (~WBOX3 >> 8);\r\n\t--W_OPEN[3];\r\n\twgotoxy(x,0);\r\n\twprintf(\" %s \", ptr);\r\n\tmemcpy(W_OPEN, buffer, 6);\r\n}\r\n\r\n/*\r\n * Deselect current drive\r\n */\r\nvoid deselect_drive(void)\r\n{\r\n\tout(0x0A, 6);\t\t\t// Mask DMA channel\r\n\tppoff();\t\t\t\t// Release PPT\r\n\tout(FDC, 0x04);\t\t\t// Disable FDC\r\n}\r\n\r\n/*\r\n * Report an error and return to main screen\r\n */\r\nregister void error(unsigned args)\r\n{\r\n\t_format_(nargs() * 2 + &args, Sflag);\r\n\tif(fp) {\r\n\t\tfclose(fp);\r\n\t\tfp=0; }\r\n\tif(!mwin) {\t\t\t// Not started yet\r\n\t\tprintf(\"%s : %s\\n\", ptr1, Sflag);\r\n\t\texit(-1); }\r\n\tout(FDC, 0);\t\t// Reset disk\r\n\tdelay(MDEL);\r\n\twcloseall(mwin);\t// Back to main window\r\n\tdeselect_drive();\r\n\tfmtrest();\r\n\tlongjmp(xmain, Sflag);\r\n}\r\n\r\n/*\r\n * Process multiple error messages via global ptr\r\n */\r\nvoid merror(unsigned char *p)\r\n{\r\n\tif(ptr) {\t\t// Already have one pending\r\n\t\twputc('\\n');\r\n\t\twputs(ptr); }\r\n\tptr = p;\t\t// Queue this one\r\n}\r\n\r\n/*\r\n * Help commnd - Implements \"hypertext\" screens\r\n */\r\nvoid help(unsigned section)\r\n{\r\n\tint c, lx, ly, ox, oy;\r\n\tunsigned i, j, size, ncount;\r\n\tunsigned char *ptr, l;\r\n\tunsigned char xs[LINKS], ys[LINKS], names[LINKS][25], link[LINKS];\r\n\r\n\tptr = ARGV[i=j=l=0];\r\n\tmemset(Sflag, Xhelp = 255, sizeof(Sflag));\r\n\twhile(*ptr) {\r\n\t\tif((buffer[i++] = *ptr++) == '.')\r\n\t\t\tj = i; }\r\n\tstrcpy(buffer+j, \"HLP\");\r\n\tif(!(fp = fopen(buffer, \"rb\")))\r\n\t\terror(\"%s not found\", buffer);\r\n\tif((TGcyl&PPlow&PPhigh) == 255) {\r\n\t\twgotoxy(0, 0);\r\n\t\twprintf(\"%04x\\n%04x\", fp+(10+512), asm\" MOV AX,SP\"); }\r\n\r\n\t/* Locate the section in question */\r\nlookup:\r\n\tSflag[l] = section;\r\nlookup1:\r\n\tsize = getc(fp);\r\n\tsize |= getc(fp) << 8;\r\n\tif(section--) {\r\n\t\tfseek(fp, 0, size, 1);\r\n\t\tgoto lookup1; }\r\n\r\n\t/* Draw the screen */\r\n\twopen(5, 4, 70, 17, (unsigned)video[AT_HELP]|WSAVE|WCOPEN|WBOX1);\r\n\twcursor_off();\r\n\ti = ncount = ptr = 0;\r\n\twhile(buffer[i++] = getc(fp));\r\n\twintitle(0, buffer);\r\n\r\n\tif(Sflag[(l-1)&255] != 255)\r\n\t\twintitle(46, \"F1=Back ESC=exitHelp\");\r\n\telse\r\n\t\twintitle(54, \"ESC=exitHelp\");\r\n\r\n\twgotoxy(0, 0);\r\n\twhile(i++ < size) switch(c = getc(fp)) {\r\n\t\tcase LINK_S :\t/* Start link */\r\n\t\t\tptr = names[ncount];\r\n\t\t\txs[ncount] = W_OPEN->WINcurx;\r\n\t\t\tys[ncount] = W_OPEN->WINcury;\r\n\t\t\t*W_OPEN = video[AT_LINK];\r\n\t\t\tbreak;\r\n\t\tcase LINK_E :\t/* End link */\r\n\t\t\tlink[ncount++] = getc(fp);\r\n\t\t\t*ptr = ptr = 0;\r\n\t\t\t*W_OPEN = video[AT_HELP];\r\n\t\t\t++i;\r\n\t\t\tbreak;\r\n\t\tcase '\\t' :\t\t/* Horizontal TAB */\r\n\t\t\tdo\r\n\t\t\t\twputc(' ');\r\n\t\t\twhile(W_OPEN->WINcurx % TAB_SIZE);\r\n\t\t\tbreak;\r\n\t\tcase 0 :\r\n\t\t\tc = '\\n';\r\n\t\tdefault:\r\n\t\t\twputc(c);\r\n\t\t\tif(ptr)\r\n\t\t\t\t*ptr++ = c; }\r\n\r\n\t/* Allow user to select field & link to new screen */\r\n\ti = section = 0;\r\n\tfor(;;) {\r\n\t\twgotoxy(xs[section], ys[section]);\r\n\t\t*W_OPEN = video[AT_LINK];\r\n\t\twputs(names[section]);\r\nrecmd:\twgotoxy(xs[i], ys[i]);\r\n\t\t*W_OPEN = video[AH_LINK];\r\n\t\twputs(names[section = i]);\r\n\t\t*W_OPEN = video[AT_HELP];\r\n\t\tswitch(c = toupper(wgetc())) {\t\t/* User keystroke */\r\n\t\t\tcase _KLA :\t\t\t\t/* Left arrow - previous field */\r\n\t\t\t\ti = (i ? i : ncount) - 1;\r\n\t\t\t\tcontinue;\r\n\t\t\tcase _KRA :\t\t\t\t/* Right arrow - next field */\r\n\t\t\t\ti = (i + 1) % ncount;\r\n\t\t\t\tcontinue;\r\n\t\t\tcase _KHO : i = 0; \t\t\tcontinue;\r\n\t\t\tcase _KEN : i = ncount-1;\tcontinue;\r\n\t\t\tcase _KUA : ox = oy = -1000; goto dofind;\r\n\t\t\tcase _KDA : ox = oy = 1000;\r\n\t\t\tdofind:\r\n\t\t\t\tsize = i;\r\n\t\t\t\tfor(j = 0; j < ncount; ++j) {\r\n\t\t\t\t\tlx = (int)xs[j] - (int)xs[i];\r\n\t\t\t\t\tly = (int)ys[j] - (int)ys[i];\r\n\t\t\t\t\tif(c == _KUA) {\r\n\t\t\t\t\t\tif((ly >= 0) || (ly < oy)) continue; }\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif((ly <= 0) || (ly > oy))\tcontinue; }\r\n\t\t\t\t\tif(abs(lx) > abs(ox)) continue;\r\n\t\t\t\t\tsize = j;\r\n\t\t\t\t\tox = lx;\r\n\t\t\t\t\toy = ly; }\r\n\t\t\t\ti = size;\r\n\t\t\t\tcontinue;\r\n\t\t\tcase 0x1B:\t\t\t\t/* Escape exit */\r\n\t\t\t\twclose();\r\n\t\t\t\tfclose(fp); *buffer = fp = 0;\r\n\t\t\t\treturn;\r\n\t\t\tcase '\\n' :\t\t\t\t/* Enter - chain to menu */\r\n\t\t\t\tsection = link[i];\r\n\t\t\t\t++l;\r\n\t\t\tgo:\trewind(fp);\r\n\t\t\t\twclose();\r\n\t\t\t\tgoto lookup;\r\n\t\t\tcase _K1 :\t\t\t\t// Back\r\n\t\t\tcase _KBS:\r\n\t\t\t\t--l;\r\n\t\t\t\tif((section = Sflag[l]) != 255)\r\n\t\t\t\t\tgoto go;\r\n\t\t\t\t++l;\r\n\t\t\t\tgoto recmd; }\r\n\t\t// Search for next link beginning with entered character\r\n\t\tj = i;\r\n\t\twhile((toupper(*names[i=(i+1)%ncount]) != c) && (i != j)); }\r\n}\r\n\r\n/*\r\n * Floppy disk interrupt handler - send EOI and set 'done' flag\r\n */\r\nasm {\r\nXFDONE\tDB\t\t0\t\t\t\t; 'DONE' flag\r\nFINT:\tPUSH\tAX\t\t\t\t; Save AX\r\n\t\tMOV\t\tAL,20h\t\t\t; Get EOT\r\n\t\tOUT\t\t20h,AL\t\t\t; Send to PIC\r\n\t\tMOV\t\tCS:XFDONE,255\t; Set flag\r\n\t\tPOP\t\tAX\t\t\t\t; Restore AX\r\n\t\tIRET\r\n}\r\n\r\n#ifdef CIO\r\n#define XFreset asm\" MOV CS:XFDONE,0\"\r\n#define\tXFget asm {\\\r\n\tXOR\t\tAH,AH\\\r\n\tMOV\t\tAL,CS:XFDONE\\\r\n}\r\n#else\r\n/*\r\n * Stub for ASM callable delay\r\n */\r\nasm {\r\nXDEL:\tPUSH\tDX\t\t\t\t; Save DS\r\n\t\tPUSH\tAX\t\t\t\t; Save AX\r\n\t\tCALL\t_delay\t\t\t; Perform delay\r\n\t\tPOP\t\tAX\t\t\t\t; Restore AX\r\n\t\tPOP\t\tDX\t\t\t\t; Restore DX\r\n\t\tRET\r\n}\r\n#endif\r\n\r\n/*\r\n * ESC key detected - exit with message\r\n */\r\nvoid xabort(void)\r\n{\r\n\terror(\"Abort by operator\");\r\n}\r\n\r\n#ifdef CIO\r\n/*\r\n * Test for operator abort and exit if ESC pressed\r\n */\r\nvoid tstabt(void)\r\n{\r\n\tunsigned i;\r\n\tif(i = kbtst()) {\r\n\t\tif((Lkey = i) == 0x1B) {\r\n\t\t\txabort(); } }\r\n}\r\n#endif\r\n\r\n/*\r\n * Write command byte to FDC\r\n */\r\n#ifdef\tCIO\r\nvoid wrfdc(unsigned char b)\r\n{\r\n\tunsigned char r;\r\n\tstatic unsigned char c = 0;\r\n\r\n\tasm {\t// Reset BIOS timeout counter\r\n\t\tXOR\tAX,AX\r\n\t\tMOV\tES,AX\r\n\t\tMOV\tBYTE PTR ES:[440h],255\r\n\t}\r\ntop:\r\n\tdo {\r\n\t\tif(!--c)\r\n\t\t\ttstabt();\r\n\t\tr = in(FDCS); }\r\n\twhile(!(r & 0x80));\r\n\r\n\tif(r & 0x40) {\r\n\t\tin(FDCD);\r\n\t\tgoto top; }\r\n\r\n\tout(FDCD, b);\r\n}\r\n#else\r\nvoid wrfdc(b) asm\r\n{\r\n\t\tXOR\t\tAX,AX\t\t\t\t; Begin with zero\r\n\t\tMOV\t\tES,AX\t\t\t\t; Address low memory\r\n\t\tMOV\t\tBYTE PTR ES:[0440h],255\t; Reset BIOS timeout\r\n\t\tMOV\t\tCL,AL\t\t\t\t; Zero \"hung\" counter\r\nwrf1:\tDEC\t\tCL\t\t\t\t\t; Reduce timeout\r\n\t\tJNZ\t\twrf2\t\t\t\t; Not yet\r\n\t\tCALL\t_kbtst\t\t\t\t; Test for key\r\n\t\tAND\t\tAX,AX\t\t\t\t; Any key?\r\n\t\tJZ\t\twrf2\t\t\t\t; No\r\n\t\tMOV\t\tDGRP:_Lkey,AX\t\t; Save last RX key\r\n\t\tCMP\t\tAL,1Bh\t\t\t\t; Abort request?\r\n\t\tJNZ\t\twrf2\t\t\t\t; No\r\n\t\tJMP\t\t_xabort\t\t\t\t; Process the abort\r\nwrf2:\tMOV\t\tDX,DGRP:_FDC\t\t; Address the FDC\r\n\t\tADD\t\tDX,2\t\t\t\t; Offset to FDCS\r\n\t\tIN\t\tAL,DX\t\t\t\t; Read status\r\n\t\tTEST\tAL,80h\t\t\t\t; Ready?\r\n\t\tJZ\t\twrf1\t\t\t\t; No, wait for it\r\n\t\tINC\t\tDX\t\t\t\t\t; Advance to FDCD\r\n\t\tTEST\tAL,40h\t\t\t\t; Ready for output?\r\n\t\tJZ\t\twrf3\t\t\t\t; Yes, proceed\r\n\t\tIN\t\tAL,DX\t\t\t\t; Mo - read to clear\r\n\t\tJMP\tshort wrf1\t\t\t\t; And go again\r\nwrf3:\tMOV\t\tAX,4[BP]\t\t\t; Get data to write\r\n\t\tOUT\t\tDX,AL\t\t\t\t; Write to FDC data\r\n}\r\n#endif\r\n\r\n/*\r\n * Wait for interrupt from the FDC\r\n * Last byte of command is sent here so that we can enable\r\n * interrupt before commands begins.\r\n */\r\n#ifdef\tCIO\r\nvoid waitirq(unsigned char c)\r\n{\r\n\tunsigned t;\r\n\tXFreset;\r\n\twrfdc(c);\r\n\tt = TICK;\r\n\tdo {\r\n\t\tif(XFget) {\r\n\t\t\tout(FDC, DORsel[Drive]);\r\n\t\t\treturn; } }\r\n\twhile((TICK - t) < 75);\r\n\terror(\"No interrupt from FDC\");\r\n}\r\n#else\r\nvoid waitirq(c)\r\n{\r\n\tasm {\r\n\t\tMOV\t\tCS:XFDONE,0\t\t\t; Reset indicator\r\n\t\tMOV\t\tAX,4[BP]\t\t\t; Get argument\r\n\t\tPUSH\tAX\t\t\t\t\t; Pass it\r\n\t\tCALL\t_wrfdc\t\t\t\t; Write it\r\n\t\tPOP\t\tAX\t\t\t\t\t; Cleanup\r\n\t\tXOR\t\tAX,AX\t\t\t\t; Get zero\r\n\t\tMOV\t\tES,AX\t\t\t\t; ES = seg0\r\n\t\tMOV\t\tCX,ES:[046ch]\t\t; Read BIOS tick\r\nwai1:\tCMP\t\tCS:XFDONE,0\t\t\t; Done flag set?\r\n\t\tJZ\t\twai2\t\t\t\t; No, keep trying\r\n\t\tMOV\t\tBL,DGRP:_Drive\t\t; Get drive\r\n\t\tXOR\t\tBH,BH\t\t\t\t; Zero high\r\n\t\tMOV\t\tAL,DGRP:_DORsel[BX]\t; Get index\r\n\t\tMOV\t\tDX,DGRP:_FDC\t\t; Get I/O address\r\n\t\tOUT\t\tDX,AL\t\t\t\t; Write it\r\n\t\tPOP\t\tBP\r\n\t\tRET\r\nwai2:\tMOV\t\tAX,ES:[046Ch]\t\t; Read BIOS tick\r\n\t\tSUB\t\tAX,CX\t\t\t\t; Calculate elapsed\r\n\t\tCMP\t\tAX,55\t\t\t\t; Over?\r\n\t\tJBE\t\twai1\t\t\t\t; Wait for it\r\n\t}\r\n\terror(\"No interrupt from FDC\");\r\n}\r\n#endif\r\n\r\n/*\r\n * Initialize data transfer mode (rate and density)\r\n * and update status display.\r\n */\r\nvoid initmode(void)\r\n{\r\n\tunsigned x;\r\n\tMfm = (Mode / 3) ? 0x40 : 0x00;\r\n\tout(FDC+5, x = Mode % 3);\r\n\tw_gotoxy(3, 0, swin);\r\n\tw_printf(swin, \"%3uk %cD\", Mtext[x], Mfm ? 'D' : 'S');\r\n}\r\n\r\n/*\r\n * Initialize DMA channel\r\n */\r\nvoid initdma(unsigned char mode, unsigned count)\r\n{\r\n\tdisable();\r\n\tout(0x0A, 6);\t\t\t\t\t\t// Mask channel\r\n\tout(FDC, DORsel[Drive] | 0x08);\t\t// Enable DMA & IRQ\r\n\tout(0x0B, mode);\t\t\t\t\t// Set mode\r\n\tout(0x0C, 0);\t\t\t\t\t\t// Clear byte pointer\r\n\tout(0x81, DMA >> 12);\t\t\t\t// Dma page\r\n\tout(0x04, (DMA << 4) & 255);\t\t// Dma address low\r\n\tout(0x04, (DMA >> 4) & 255);\t\t// Dma address high\r\n\tout(0x05, --count);\t\t\t\t\t// count low\r\n\tout(0x05, count >> 8);\t\t\t\t// count high\r\n\tout(0x0A, 2);\t\t\t\t\t\t// Unmask channel\r\n\tenable();\r\n}\r\n\r\n/*\r\n * Write command sequence to FDC\r\n */\r\nvoid wrcmd(unsigned c)\r\n{\r\n\twrfdc(c|Mfm);\r\n\twrfdc(Head ? (Drive|4) : Drive);\r\n}\r\n\r\n/*\r\n * Read byte from FDC\r\n */\r\n#ifdef\tCIO\r\nint rdfdc(void)\r\n{\r\n\tunsigned t;\r\n\tunsigned char r;\r\n\tstatic unsigned char c = 0;\r\n\r\n\tt = TICK;\r\n\tdo {\r\n\t\tif(!--c) {\r\n\t\t\ttstabt();\r\n\t\t\tif((TICK - t) > Timeout) {\r\n\t\t\t\tTimeout = 10;\r\n\t\t\t\tResult[0] = 0x48;\r\n\t\t\t\treturn -1; } }\r\n\t\tr = in(FDCS); }\r\n\twhile(!(r & 0x80));\r\n\r\n\tif(!(r & 0x40))\r\n\t\treturn -1;\r\n\r\n\treturn in(FDCD);\r\n}\r\n#else\r\nint rdfdc(void) asm\r\n{\r\n\t\tXOR\t\tAX,AX\t\t\t; Get zero\r\n\t\tMOV\t\tES,AX\t\t\t; Address low memory\r\n\t\tMOV\t\tBX,ES:[046Ch]\t; Get BIOS tick\r\n\t\tMOV\t\tCL,AL\t\t\t; Zero \"hung\" counter\r\nrdf1:\tDEC\t\tCL\t\t\t\t; Reduce timeout\r\n\t\tJNZ\t\trdf2\t\t\t; Not yet\r\n\t\tCALL\t_kbtst\t\t\t; Test for key\r\n\t\tAND\t\tAX,AX\t\t\t; Key available?\r\n\t\tJZ\t\trdf2\t\t\t; No key\r\n\t\tMOV\t\tDGRP:_Lkey,AX\t; Save last\r\n\t\tCMP\t\tAL,01Bh\t\t\t; Escape?\r\n\t\tJNZ\t\trdf2\t\t\t; No\r\n\t\tCALL\t_xabort\t\t\t; Abort\r\nrdf2:\tMOV\t\tAX,ES:[046Ch]\t; Get BIOS tick\r\n\t\tSUB\t\tAX,BX\t\t\t; Calculate elapsed\r\n\t\tCMP\t\tAX,DGRP:_Timeout; Timeout expired\r\n\t\tJBE\t\trdf4\t\t\t; No, wait for it\r\n\t\tMOV\t\tDGRP:_Timeout,10; Set default timeout\r\n\t\tMOV\t\tAL,48h\t\t\t; Indicate failed\r\n\t\tMOV\t\tDGRP:_Result,AL\t; Set Result[0]\r\nrdf3:\tMOV\t\tAX,-1\t\t\t; Indicate failure\r\n\t\tJMP\t\trdf5\t\t\t; And exit\r\nrdf4:\tMOV\t\tDX,DGRP:_FDC\t; FDC address\r\n\t\tADD\t\tDX,2\t\t\t; Offset to FDCS\r\n\t\tIN\t\tAL,DX\t\t\t; Read it\r\n\t\tTEST\tAL,80h\t\t\t; Data ready?\r\n\t\tJZ\t\trdf1\t\t\t; Wait for it\r\n\t\tTEST\tAL,40h\t\t\t; Providing data\r\n\t\tJZ\t\trdf3\t\t\t; No - error\r\n\t\tINC\t\tDX\t\t\t\t; Advance to FDCD\r\n\t\tIN\t\tAL,DX\t\t\t; Read data\r\n\t\tXOR\t\tAH,AH\t\t\t; Zero high\r\nrdf5:\r\n}\r\n#endif\r\n\r\n/*\r\n * Read result stream from FDC\r\n */\r\nint result(unsigned m)\r\n{\r\n\tunsigned d;\r\n\tmemset(Result, Rcount = 0, sizeof(Result));\r\n\twhile(m) {\r\n\t\t--m;\r\n\t\tif((d = rdfdc()) & 0xFF00)\r\n\t\t\tbreak;\r\n\t\tResult[Rcount++] = d; }\r\n\treturn Result[0] & 0xC0;\t// 0xC0  0xD8\r\n}\r\n\r\n/*\r\n * Recalibrate the FDC head\r\n */\r\nvoid recal(void)\r\n{\r\n\tunsigned char x;\r\n\tx = 2;\r\n\tppoff();\r\n\tdo {\r\n\t\twrfdc(0x07);\r\n\t\tout(FDC, DORsel[Drive] | 0x08);\t\t// Enable IRQ\r\n\t\twaitirq(Drive);\r\n\t\tdo {\r\n\t\t\tdelay(MDEL);\r\n\t\t\twrfdc(0x08);\t\t// Sense interrupt\r\n\t\t\tresult(2); }\r\n\t\twhile(in(FDCS) & 0x0F);\t// Still seeking\r\n\t\tdelay(MDEL); }\r\n\twhile(--x);\r\n\tCylinder = 0;\r\n}\r\n\r\n/*\r\n * Seek to track\r\n */\r\nvoid seek(unsigned c)\r\n{\r\n\tCylinder = c;\r\n\tif(c = kbtst()) {\r\n\t\tif((Lkey = c) == 0x1B)\r\n\t\t\txabort(); }\r\n\tdelay(55);\r\n\twrfdc(0x0F);\t\t\t\t\t// Seek command\r\n\twrfdc(Drive);\t\t\t\t\t// Drive ID\r\n\tout(FDC, DORsel[Drive] | 0x08);\t// Enable IRQ\r\n\twaitirq(Dds ? Cylinder+Cylinder : Cylinder); // cylinder\r\n\tdo {\r\n\t\tdelay(55);\r\n\t\twrfdc(0x08);\t\t\t\t// Sense interrupt\r\n\t\tresult(2); }\r\n\twhile(in(FDCS) & 0x0F);\t\t\t// Still seeking\r\n\tif(SKdel)\r\n\t\tdelay(SKdel);\r\n}\r\n\r\n/*\r\n * Resync and retry head position\r\n */\r\nvoid resync(void)\r\n{\r\n\tunsigned c;\r\n\tc = Cylinder;\r\n\tswitch(++Resync) {\r\n\tcase 1 : Cstat('E');\treturn;\r\n\tcase 2 :\t\t\t// 1st retry - Step in/out\r\n\tcase 5 :\r\n\t\tCstat('1');\r\n\t\tif(c) {\r\n\t\t\tseek(c-1);\tdelay(200);\r\n\t\t\tseek(c);\tdelay(200); }\r\n\t\treturn;\r\n\tcase 3 :\t\t\t// Second retry - step out/in\r\n\tcase 6 :\r\n\t\tCstat('2');\r\n\t\tif(c < Cylinder) {\r\n\t\t\tseek(c+1);\t\tdelay(200);\r\n\t\t\tseek(c);\t\tdelay(200); }\r\n\t\treturn;\r\n\tcase 4 :\t\t\t// Third retry - recalibrate the head\r\n\tcase 7 :\r\n\t\tCstat('3');\r\n\t\trecal(); delay(250);\r\n\t\tseek(c);\r\n\t\treturn;\r\n\tcase 8 :\t\t\t// Forth retry - deselect/select\r\n\t\tCstat('4');\r\n\t\tdeselect_drive();\r\n\t\tdelay(1000);\r\n\t\tout(FDC, DORsel[Drive]);\r\n\t\tdelay(500);\r\n\t\tinitmode();\r\n\t\tResync = 1; }\r\n}\r\n\r\n/*\r\n * Read sector ID passing under head\r\n */\r\nint readid(void)\r\n{\r\n\twrcmd(0x0A);\r\n\treturn result(7);\r\n}\r\n\r\n/*\r\n * Report a disk error\r\n */\r\nvoid diskerror(char *t)\r\n{\r\n\tunsigned char r, f, *p;\r\n\tf = p = 0;\r\n\tnewch(\"%s error <%u>\", t, Sector);\r\n\tif(Result[0] & 0x08) wputs(p=\" EC\");\r\n\tr = Result[1];\r\n\tif(r & 0x80) wputs(p=\" EndCyl\");\r\n\tif(r & 0x20) wputs(p=\" Data\");\r\n\tif(r & 0x10) wputs(p=\" Overun\");\r\n\tif(r & 0x04) wputs(p=\" NoData\");\r\n\tif(r & 0x02) { wputs(p=\" WriteProt\"); f = 255; }\r\n\tif(r & 0x01) wputs(p=\" NoAdrMark\");\r\n\tif(!p) {\r\n\t\twprintf(\" %02x %02x %02x\",\r\n\t\t\tResult[0], Result[1], Result[2]); }\r\n\tif(f)\r\n\t\terror(\"Fatal error\");\r\n}\r\n\r\n/*\r\n * Read a sector from the disk\r\n */\r\nint read_sector(unsigned index)\r\n{\r\n\tunsigned r;\r\n\tr = Resync;\r\nretry:\r\n\twrcmd(0x06);\r\n\twrfdc(Cmap[index]);\t\t\t\t// Cylinder\r\n\twrfdc(Hmap[index]);\t\t\t\t// Head\r\n\twrfdc(Sector = Smap[index]);\t// Sector\r\n\twrfdc(Ssize);\t\t\t\t\t// N\r\n\twrfdc(Sector);\t\t\t\t\t// EOT (Was Eot)\r\n\twrfdc(Gl);\t\t\t\t\t\t// GL\r\n\tinitdma(0x46, 128 << Ssize);\r\n\twaitirq(Ssize ? 255 : 128);\r\n\tresult(7);\r\n\tif(Result[0] & 0xC0) {\r\n\t\tif(++r >= Retry) {\r\n\t\t\tdiskerror(\"Read\");\r\n\t\t\treturn 255; }\r\n\t\tresync();\r\n\t\tgoto retry; }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Write a sector to the drive\r\n */\r\nint write_sector(unsigned index, unsigned char df)\r\n{\r\n\tunsigned r;\r\n\tr = Resync = 0;\r\nretry:\r\n\twrcmd((df & 2 ) ? 0x09 : 0x05);\r\n\twrfdc(Cmap[index]);\t\t\t\t// Cylinder\r\n\twrfdc(Hmap[index]);\t\t\t\t// Head\r\n\twrfdc(Sector = Smap[index]);\t// Sector\r\n\twrfdc(Ssize);\t\t\t\t\t// N\r\n\twrfdc(Sector);\t\t\t\t\t// EOT (Was Eot)\r\n\twrfdc(Gl);\t\t\t\t\t\t// GL\r\n\tinitdma(0x4A, 128 << Ssize);\r\n\twaitirq(Ssize ? 255 : 128);\r\n\tresult(7);\r\n\tif(Result[0] & 0xC0) {\r\n\t\tif(++r >= Retry) {\r\n\t\t\tdiskerror(\"Write\");\r\n\t\t\treturn 255; }\r\n\t\tresync();\r\n\t\tgoto retry; }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Adjust the data rate up or down\r\n */\r\nvoid adjmode(unsigned char dec)\r\n{\r\n\tif(Lrate & 0xF0) {\t\t// Locked rate\r\n\t\tdec = Lrate & 7;\r\n\t\tS->Mode = Mode = (Mode == dec) ? (dec+3) : dec;\r\n\t\treturn; }\r\n\r\n\tif(dec)\r\n\t\tS->Mode = Mode = Mode ? Mode-1 : 5;\r\n\telse\r\n\t\tS->Mode = Mode = (Mode + 1) % 6;\r\n}\r\n\r\n/*\r\n * Analyze disk track\r\n */\r\nint analyze_track(unsigned char xf)\r\n{\r\n\tunsigned i, s, n, h, l, h1, l1, c;\r\n\tunsigned char hd, cy, *f;\r\n\r\n\tDMA = SEG;\r\n\tupCH();\r\n\tHflag = Nintl = 0; Resync = 1;\r\n\tTimeout = TIMEOUT;\r\n\r\n\t// First time through - always do full analysis\r\n\tif(Head) {\r\n\t\tif(Fa1) { Fa1 = 0; goto X0; } }\r\n\telse {\r\n\t\tif(Fa0) { Fa0 = 0; goto X0; } }\r\n\r\n\t// If not full analysis - check to see if still reading valid id's\r\n\tif(xf && Dana) {\r\n\t\tinitmode();\r\n\t\tif(!readid()) {\r\n\t\t\thd= Result[4];\r\n\t\t\ts = Result[5];\r\n\t\t\tif(Result[6] == Ssize) for(i=0; i < Stop; ++i) {\r\n\t\t\t\tif((Smap[i] == s) && (Hmap[i] == hd)) {\r\n\t\t\t\t\tif(format_changed())\r\n\t\t\t\t\t\tcompute_gl(255);\r\n\t\t\t\t\tw_gotoxy(0, 1, swin);\r\n\t\t\t\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\t\t\t\tif(Hmap[i] != Head) Hflag |= 0x40;\r\n\t\t\t\t\t\tw_printf(swin, \" %u\", Smap[i]); }\r\n\t\t\t\t\tw_cleol(swin);\r\n\t\t\t\t\treturn 0; } } } }\r\n\r\nX0:\t// Full analysis required\r\n\tw_gotoxy(0, 1, swin); w_cleol(swin);\r\n\tmemset(Smap, Stop = i = h = c = 0, MSEC);\r\n\tmemset(Sflag, 0, MSEC);\r\n\tadjmode(255);\t\t// Backup to insure quick fail on re-analyze\r\n\r\n\tl = l1 = 65535;\r\n\r\n\t// Find bad access mode to line up on sector boundary\r\n\tfor(;;) {\r\n\t\tinitmode();\r\n\t\tif(readid())\r\n\t\t\tbreak;\r\n\t\tadjmode(0); }\r\n\r\n\t// We should be at index hole after failed read-id\r\n\t// Read sector id's to determine interleave\r\n\ti = 0;\r\nX1:\tadjmode(0);\r\n\tinitmode();\r\n\tResync = f = 0;\r\n\r\n\tfor(;;) {\r\n\t\tif(readid()) {\t\t// Failed to read ID\r\n\t\t\tif(Stop)\t\t\t// We already have sectors\r\n\t\t\t\treturn 255;\t\t// So report failure (should not happen)\r\n\t\t\tif(++i < 12) { goto X1; }\r\n\t\t\t\treturn 255; }\t// No ID after timeout (should not happen)\r\n\t\tcy= Result[3];\t\t\t// Cylinder\r\n\t\thd= Result[4];\t\t\t// Head\r\n\t\ts = Result[5];\t\t\t// Size\r\n\t\tn = Result[6];\t\t\t// Number\r\n\t\tif(Sflag[s]++) {\r\n\t\t\tswitch(Sflag[s]) {\r\n\t\t\tcase  4 :\r\n\t\t\t\tif(((h-l)+1) == c)\r\n\t\t\t\t\tgoto X2;\r\n\t\t\t\tcontinue;\r\n\t\t\tcase 20 : f = \"Missing sectors\"; goto X2;\r\n\t\t\tcase 8 :\r\n\t\t\tcase 12 :\r\n\t\t\tcase 16 : resync(); }\r\n\t\t\tcontinue; }\r\n\t\tif((Cmap[Stop] = cy) != Cylinder)\r\n\t\t\tHflag |= 0x80;\r\n\t\tif((Hmap[Stop] = hd) != Head)\r\n\t\t\tHflag |= 0x40;\r\n\t\tSmap[Stop++] = s;\r\n\t\tif(s < l) l = s;\r\n\t\tif(s > h) h = s;\r\n\t\t++c; }\r\n\r\nX2:\r\n\tS->Ssize = Ssize = n;\r\n\tS->Eot = Eot = h;\r\n\tS->Stop = Stop;\r\n\r\n\tfor(i=h1=0; i < Stop; ++i) {\r\n\t\ts = Sflag[Smap[i]];\r\n\t\tif(s > h1) h1 = s;\r\n\t\tif(s < l1) l1 = s; }\r\n\tif((h1 - l1) > 2)\r\n\t\tf = \"Unable to determine interleave\";\r\n\tif(f)\r\n\t\tnewch(f);\r\n\tcompute_gl(255);\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Write analasis information to file\r\n */\r\nvoid write_ana(void)\r\n{\r\n\tputc(Mtran[Mode], fp);\r\n\tputc(Cylinder, fp);\r\n\tputc(Head|Hflag, fp);\r\n\tputc(Stop, fp);\r\n\tputc(Ssize, fp);\r\n\tif(Stop) {\r\n\t\tfput(Smap, Stop, fp);\r\n\t\tif(Hflag & 0x80)\r\n\t\t\tfput(Cmap, Stop, fp);\r\n\t\tif(Hflag & 0x40)\r\n\t\t\tfput(Hmap, Stop, fp); }\r\n}\r\n\r\n/*\r\n * Write null_track record to output file\r\n */\r\nvoid write_null(void)\r\n{\r\n\tputc(0, fp);\r\n\tputc(Cylinder, fp);\r\n\tputc(Head, fp);\r\n\tputc(0, fp);\r\n\tputc(0, fp);\r\n}\r\n\r\n/*\r\n * High-speed test for compressable sector (all bytes same value)\r\n */\r\nint issame() asm\r\n{\r\n\t\tMOV\t\tES,DGRP:_DMA\t\t; Get DMA segment\r\n\t\tXOR\t\tBX,BX\t\t\t\t; Zero offset\r\n\t\tMOV\t\tCX,4[BP]\t\t\t; Get sector size\r\n\t\tMOV\t\tAL,ES:[BX]\t\t\t; Get byte1\r\n\t\tDEC\t\tCX\t\t\t\t\t; Backup count\r\niss1:\tINC\t\tBX\t\t\t\t\t; Next in source\r\n\t\tCMP\t\tAL,ES:[BX]\t\t\t; Does it match?\r\n\t\tJNZ\t\tiss2\t\t\t\t; No, report different\r\n\t\tLOOP\tiss1\t\t\t\t; Check entire sector\r\n\t\tMOV\t\tAL,255\t\t\t\t; Return !0\r\n\t\tPOP\t\tBP\t\t\t\t\t; Restore BP\r\n\t\tRET\r\niss2:\tXOR\t\tAX,AX\t\t\t\t; Return 0\r\n}\r\n\r\n/*\r\n * Write sector data to file\r\n */\r\nvoid write_data(unsigned char v)\r\n{\r\n\tunsigned s, o;\r\n\t++STcount[ST_TOTAL];\r\n\tif(!v) {\r\n\t\t++STcount[ST_UNAVAIL];\r\n\t\tputc(0, fp);\r\n\t\treturn; }\r\n\tif(v & 2) ++STcount[ST_DAM];\r\n\tif(v & 4) ++STcount[ST_BAD];\r\n\tif(issame(s = 128 << Ssize)) {\r\n\t\t++STcount[ST_COMP];\r\n\t\tputc(v+1, fp);\r\n\t\tputc(peek(DMA, 0), fp);\r\n\t\treturn; }\r\n\tputc(v, fp);\r\n\to = 0;\r\n\tdo {\r\n\t\tputc(peek(DMA, o++), fp); }\r\n\twhile(--s);\r\n}\r\n\r\n/*\r\n * Advance DMA address by sector size\r\n */\r\nvoid bumpdma(void)\r\n{\r\n\tDMA += ((unsigned)(128 << Ssize) + 31) >> 4;\r\n}\r\n\r\n/*\r\n * Reset FDC subsystem to known state (start of function)\r\n */\r\nvoid reset(void)\r\n{\r\n\tRcount = Stop = Mfm = Cylinder = Head = Sector = Ssize =\r\n\tEot = Resync = Lkey = 0;\r\n\tFa0 = Fa1 = Lh = 255;\r\n\tLmsn = -1;\r\n\tTimeout = TIMEOUT;\r\n\tDds = Dstep;\r\n\tSs1 = Side1;\r\n\tDMA = SEG;\r\n\tif(Dam) Dam = 255;\t// Reset DAM indicator\r\n\tmemset(S0, 0, sizeof(S0));\r\n\tmemset(S1, 0, sizeof(S1));\r\n\tmemset(STcount, 0, sizeof(STcount));\r\n\tTGman &= 0xF0;\r\n\r\n\tS0.Mode = S1.Mode = Mode = Lrate & 7;\r\n\r\n\tasm {\t// Reset BIOS timeout counter\r\n\t\tXOR\tAX,AX\r\n\t\tMOV\tES,AX\r\n\t\tMOV\tBYTE PTR ES:[440h],255\r\n\t}\r\n\tout(FDC, 0); delay(MDEL); out(FDC, 4); delay(MDEL);\r\n\tout(0x3F2, 4);\t// Insure primary is clear\r\n\tout(0x372, 4);\t// Insure secondary is clear\r\n\twrfdc(0x03);\t// Specify\r\n\twrfdc((SPsrt << 4) | SPhut);\t// Step, head unload\r\n\twrfdc(SPhlt << 1);\t\t\t\t// Head load, DMA\r\n\tresult(0);\r\n\tppoff();\r\n\tw_clwin(swin);\r\n\tw_printf(swin, \"%c: \", Drive+'A');\r\n\tw_clwin(pwin);\r\n\tout(FDC, DORsel[Drive]);\r\n\tdelay(500);\r\n\tupCH();\r\n\tinitmode();\r\n\trecal(); delay(500);\r\n}\r\n\r\nvoid showstat(void)\r\n{\r\n\tunsigned i, v;\r\n\tunsigned char f;\r\n\tstatic void *st_names[] = {\r\n\t\t\"Compressed\", \"Deleted\", \"Bad\", \"Unavail\" };\r\n\r\n\twprintf(\"\\n%u sectors\", STcount[ST_TOTAL]);\r\n\tfor(f=i=0; i < 4; ++i) {\r\n\t\tif(v = STcount[i+1]) {\r\n\t\t\twprintf(\"%s%u %s\", f ? \", \" : \" (\", v, st_names[i]);\r\n\t\t\tf = 255; } }\r\n\tif(f)\r\n\t\twputc(')');\r\n}\r\n\r\n/*\r\n * Prompt for disk to be inserted\r\n */\r\nvoid pwait(unsigned char *t)\r\n{\r\n\tunsigned w;\r\n\tw = strlen(t) + 58;\r\n\twopen(40-(w/2), 20, w, 3, (unsigned)video[AT_POP]|WSAVE|WBOX1|WCOPEN);\r\n\twprintf(\"Insert disk to %s - press ENTER to proceed, ESC to cancel.\", t);\r\n\tfor(;;) switch(wgetc()) {\r\n\t\tcase 0x1B:\r\n\t\t\twclose();\r\n\t\t\terror(\"Abort by operator\");\r\n\t\tcase '\\n' :\r\n\t\t\twclose();\r\n\t\t\treturn; }\r\n}\r\n\r\n/*\r\n * Test and report disk RPM\r\n */\r\nvoid rpm(void)\r\n{\r\n\tunsigned t, t1, c, l1[2], l2[2];\r\n\tunsigned char id, id1, p;\r\n\tstatic unsigned L1091[] = { 1091, 0 };\r\n\tstatic unsigned L200[] = { 200, 0 };\r\n\tstatic char *rpm_prompt[] = {\r\n\t\t\"RPM:\",\r\n\t\t\"\",\r\n\t\t\"Please insure that the drive\",\r\n\t\t\"contains a formatted diskette\",\r\n\t\t\"\",\r\n\t\t\"Press SPACE to recalculate\",\r\n\t\t\"      ESC to end test.\",\r\n\t\t0 };\r\n\r\n\twclwin();\r\n\tprompt(rpm_prompt, 5);\r\n\tpwait(\"TEST-RPM\");\r\n\r\ntop:\r\n\twgotoxy(0, 9);\r\n\treset();\r\n\r\n\tif(analyze_track(0))\r\n\t\treturn;\r\n\r\n\tid = Smap[p = 0];\r\nrestart:\r\n\tc = 0;\r\n\tfor(;;) {\r\n\t\tif(readid())\r\n\t\t\tgoto top;\r\n\t\tid1 = Result[5];\r\n\t\tif(id1 == id) {\r\n\t\t\tt = TICK;\r\n\t\t\tbreak; } }\r\n\r\n\tfor(;;) {\r\n\t\tif(readid())\r\n\t\t\tgoto top;\r\n\t\tid1 = Result[5];\r\n\t\tif(id1 == id) {\r\n\t\t\tt1 = TICK - t;\r\n\t\t\t++c;\r\n\t\t\tlongset(l1, c);\r\n\t\t\tlongmul(l1, L1091);\r\n\t\t\tlongadd(l1, L200);\r\n\t\t\tlongset(l2, t1);\r\n\t\t\tlongdiv(l1, l2);\r\n\t\t\tw_gotoxy(0, 1, pwin);\r\n\t\t\tw_printf(pwin, \"%-5u %-5u %-3u RPM: %u\", c, t1, id, t1 = l1[0]);\r\n\t\t\tif(t1 >= 500) {\r\n\t\t\t\tif(++p >= Stop)\r\n\t\t\t\t\terror(\"Cannot lock onto disk\");\r\n\t\t\t\tid = Smap[p]; } }\r\n\t\telse {\r\n\t\t\tif(Lkey == ' ') {\r\n\t\t\t\tLkey = 0;\r\n\t\t\t\tgoto restart; } } }\r\n}\r\n\r\n/*\r\n * Write image file header\r\n */\r\nvoid write_header(void)\r\n{\r\n\tunsigned day, month, year, hour, minute, second;\r\n\r\n\tget_date(&day, &month, &year);\r\n\tget_time(&hour, &minute, &second);\r\n\tfprintf(fp, \"IMD \"#VERSION\": %2u/%02u/%04u %2u:%02u:%02u\\r\\n\",\r\n\t\tday, month, year,\r\n\t\thour, minute, second);\r\n}\r\n\r\n/*\r\n * Edit comment\r\n */\r\nvoid edit(void)\r\n{\r\n\tunsigned i, t;\r\n\tstatic char *form[] = {\r\n\t\t(LSIZE+4)<<8|(LNUM+2),\r\n\t\t\"\\x00\\x00\\x3F\",\r\n\t\t\"\\x00\\x01\\x3F\",\r\n\t\t\"\\x00\\x02\\x3F\",\r\n\t\t\"\\x00\\x03\\x3F\",\r\n\t\t\"\\x00\\x04\\x3F\",\r\n\t\t\"\\x00\\x05\\x3F\",\r\n\t\t\"\\x00\\x06\\x3F\",\r\n\t\t\"\\x00\\x07\\x3F\",\r\n\t\t0 };\r\n\twputs(\"\\nEnter comment (ESC to exit):\");\r\n\twform(37-(LSIZE/2), 12-(LNUM/2), WSAVE|WCOPEN|WBOX1|video[AT_POP], form,\r\n\t\tbuffer, &buffer[LS1], &buffer[LS1*2], &buffer[LS1*3], &buffer[LS1*4],\r\n\t\t&buffer[LS1*5], &buffer[LS1*6], &buffer[LS1*7]);\r\n\tfor(t=(LS1*LNUM); t; t -= LS1) {\r\n\t\tif(buffer[t-LS1])\r\n\t\t\tbreak; }\r\n\twrite_header();\r\n\twputc('\\r'); wcleow();\r\n\tfor(i=0; i < t; i += LS1) {\r\n\t\tif(i) wputc('\\n');\r\n\t\twputs(buffer+i);\r\n\t\tfputs(buffer+i, fp);\r\n\t\tputc('\\r', fp);\r\n\t\tputc('\\n', fp); }\r\n\tputc(0x1A, fp);\r\n}\r\n\r\n/*\r\n * Perform TG43 processing\r\n * - Update parallel port if required\r\n * - Pause if manual control enabled\r\n */\r\nvoid tg43(unsigned char wflag)\r\n{\r\n\tunsigned char c;\r\n\r\n\tc = (Cylinder > TGcyl) ? 0x0F : 0x00;\r\n\tif(PPort)\r\n\t\tout(PPort, c ? PPhigh : PPlow);\r\n\r\n\tif(TGman & wflag) {\t\t// Manual control enabled\r\n\t\tif((TGman & 0x0F) != c) {\t\t// Crossed boundary\r\n\t\t\tTGman = c | 0xF0;\r\n\t\t\twopen(15, 10, 50, 4, (unsigned)video[AT_POP]|WSAVE|WBOX1|WCOPEN);\r\n\t\t\twprintf(\"Head has crossed the cylinder %u boundary.\", TGcyl);\r\n\t\t\twputs(\"\\nPress ENTER to proceed, ESC to cancel.\");\r\n\t\t\tfor(;;) switch(wgetc()) {\r\n\t\t\t\tcase 0x1B:\r\n\t\t\t\t\twclose();\r\n\t\t\t\t\terror(\"Abort by operator\");\r\n\t\t\t\tcase '\\n' :\r\n\t\t\t\t\twclose();\r\n\t\t\t\t\treturn; } } }\r\n}\r\n\r\n/*\r\n * Calculate the correct sector data flag value for this sector\r\n */\r\nunsigned sector_data_flag(char err, char msg)\r\n{\r\n\tunsigned char s;\r\n\ts = 0;\r\n\tif(err) {\t\t\t// Read error occured\r\n\t\tif(Bad) {\t\t// Do we keep bad sectors?\r\n\t\t\tif(!(Result[1] & 0x96)) {\r\n\t\t\t\tif((Result[2] & 0x21) == 0x20) {\r\n\t\t\t\t\ts |= 4;\r\n\t\t\t\t\twputs(msg ? \" - Recording bad sector\" : \"b\");\r\n\t\t\t\t\tgoto keep; } } }\r\n\t\twputs(msg ? \" - Unavailable\" : \"u\");\r\n\t\treturn 0; }\r\nkeep:\r\n\tif(Result[2] & 0x40) {\r\n\t\tif(Dam) {\r\n\t\t\tif(Dam == 255) {\r\n\t\t\t\tDam = 15;\r\n\t\t\t\tif(msg)\r\n\t\t\t\t\tnewch(\"Deleted-Data\");\r\n\t\t\t\telse\r\n\t\t\t\t\twputc('d'); }\r\n\t\t\ts |= 2; } }\r\n\treturn s+1;\r\n}\r\n\r\n/*\r\n * Read entire disk into file\r\n */\r\nint read_disk(void)\r\n{\r\n\tunsigned i, e;\r\n\tunsigned char f, sf[MSEC];\r\n\r\n//\tmemset(buffer, 0, sizeof(buffer));\r\n\tif(fp = fopen(Directory, \"r\")) {\r\n\t\tfgets(Sflag, sizeof(Sflag), fp);\r\n\t\twprintf(\"\\n%s\", Sflag);\r\n\t\tptr = buffer;\r\n\t\tfor(i=0; i < LNUM; ++i) {\r\n\t\t\tif(!fgets(ptr, LS1, fp))\r\n\t\t\t\tbreak;\r\n\t\t\twprintf(\"\\n%s\", ptr);\r\n\t\t\tptr += LS1; }\r\n\t\tfclose(fp);\r\n\t\tptr = 0;\r\n\t\twprintf(\"\\nProceed (Y/N)?\");\r\n\t\tgetkey: switch(i = toupper(wgetc())) {\r\n\t\t\tdefault: goto getkey;\r\n\t\t\tcase 'N' :\r\n\t\t\t\treturn 255;\r\n\t\t\tcase 'Y' : }\r\n\t\twgotoxy(0, 2); wcleow(); wgotoxy(79, 0); }\r\n\r\n\tif(!(fp = fopen(Directory, \"wb\")))\r\n\t\terror(\"Cannot write file\");\r\n\tedit();\r\n\tpwait(\"READ\");\r\n\treset();\r\n\tdraw_scale();\r\n\tfor(Cylinder = 0; Cylinder < Cylinders; ++Cylinder) {\r\n\t\tf = 255;\r\n\t\tHead = 0;\r\n\t\tCstat(0);\r\n\t\tseek(Cylinder);\r\n\t\ttg43(0);\r\nra1:\tif(Sskip[Cylinder] & 1) {\r\n\t\t\tCstat('X');\r\n\t\t\tgoto ra1a; }\r\n\t\tCstat('A');\r\n\t\tif(analyze_track(f)) {\r\n\t\t\tif(Dana)\r\n\t\t\t\tbreak;\r\n\t\t\tCstat('N');\r\n\t\t\twrite_null();\r\n\t\t\tgoto ra1a; }\r\n\t\tif(!(Hflag & 0x80))\r\n\t\t\tmemset(Cmap, Cylinder, Stop);\r\n\t\tCstat('R');\r\n\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\tif(e=read_sector(i)) {\r\n\t\t\t\tif(Retry&&f) { f = 0; wputs(\" - Reanalyzing\"); goto ra1; } }\r\n\t\t\tsf[i] = sector_data_flag(e, 255);\r\n\t\t\tbumpdma(); }\r\n\t\twrite_ana();\r\n\t\tDMA = SEG;\r\n\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\twrite_data(sf[i]);\r\n\t\t\tbumpdma(); }\r\n\t\tCstat(BDONE);\r\nra1a:\tif(Ss1) {\r\n\t\t\tf = 255;\r\n\t\t\tHead = 1;\r\nra2:\t\tif(Sskip[Cylinder] & 2) {\r\n\t\t\t\tCstat('X');\r\n\t\t\t\tgoto ra3; }\r\n\t\t\tCstat('A');\r\n\t\t\ti = analyze_track(f);\r\n\t\t\tif(Ss1 == 0x55) {\r\n\t\t\t\tif(i) {\r\n\t\t\t\t\tSs1 = 0;\r\n\t\t\t\t\tnewch(\"Single-sided\");\r\n\t\t\t\t\tgoto ra3; }\r\n\t\t\t\telse {\r\n\t\t\t\t\tSs1 = 0xAA;\r\n\t\t\t\t\tnewch(\"Double-sided\"); } }\r\n\t\t\telse if(i) {\r\n\t\t\t\tif(Dana)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tCstat('N');\r\n\t\t\t\twrite_null();\r\n\t\t\t\tgoto ra3; }\r\n\t\t\tif(!(Hflag & 0x80))\r\n\t\t\t\tmemset(Cmap, Cylinder, Stop);\r\n\t\t\tCstat('R');\r\n\t\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\t\tif(e=read_sector(i)) {\r\n\t\t\t\t\tif(Retry&&f) { f = 0; wputs(\" - Reanalyzing\"); goto ra2; } }\r\n\t\t\t\tsf[i] = sector_data_flag(e, 255);\r\n\t\t\t\tbumpdma(); }\r\n\t\t\twrite_ana();\r\n\t\t\tDMA = SEG;\r\n\t\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\t\twrite_data(sf[i]);\r\n\t\t\t\tbumpdma(); }\r\n\t\t\tCstat(TDONE); }\r\nra3:\tif(Dds == 0x55) {\r\n\t\t\tDds = Head = 0;\r\n\t\t\tseek(4);\r\n\t\t\tif(analyze_track(255))\r\n\t\t\t\terror(\"Cannot read disk\");\r\n\t\t\tif(readid())\r\n\t\t\t\terror(\"Cannot read disk\");\r\n\t\t\tswitch(Result[3]) {\r\n\t\t\tdefault: error(\"Seek error %u Result[3]\");\r\n\t\t\tcase 4 : Dds = 0;\tbreak;\r\n\t\t\tcase 2 : Dds = 0xAA; }\r\n\t\t\trecal(); delay(500); }\r\n\t\tif(!Cylinder)\r\n\t\t\tnewch(\"%s-step\", Dds ? \"Double\" : \"Single\"); }\r\n\r\n\tfclose(fp);\r\n\tshowstat();\r\n\treturn fp = 0;\r\n}\r\n\r\n/*\r\n * Format a track\r\n */\r\nvoid format_track(void)\r\n{\r\n\tunsigned i, o, r;\r\n\tunsigned char s;\r\n\r\n//wprintf(\"\\nF T%-2u H%u St%u Ss%02x\", Cylinder, Head, Stop, Ssize);\r\n\tTimeout = TIMEOUT;\r\n\tinitmode();\r\n\tr = Nintl = Resync = 0;\r\n\tif(format_changed())\r\n\t\tcompute_gl(0);\r\n\telse if(Intl)\r\n\t\tinterleave();\r\n\tif(!Nintl) {\t// Default 1:1 map\r\n\t\tfor(i=0; i < Stop; ++i)\r\n\t\t\tImap[i] = i; }\r\nretry:\r\n\tDMA = SEG;\r\n\tw_gotoxy(0, 1, swin); w_cleol(swin);\r\n\tfor(i=o=0; i < Stop; ++i) {\r\n\t\tw_printf(swin, \" %u\", s=Smap[Imap[i]]);\r\n\t\tpoke(DMA, o++, Cmap[Imap[i]]);\r\n\t\tpoke(DMA, o++, Hmap[Imap[i]]);\r\n\t\tpoke(DMA, o++, s);\r\n\t\tpoke(DMA, o++, Ssize); }\r\n\r\n\twrcmd(0x0D);\r\n\twrfdc(Ssize);\r\n\twrfdc(Stop);\r\n\twrfdc(Glf);\r\n\tinitdma(0x4A, o);\r\n\twaitirq(Ffill);\r\n\r\n\tresult(7);\r\n\tif(Result[0] & 0xC0) {\r\n\t\tif(++r >= Retry) {\r\n\t\t\tdiskerror(\"Format\");\r\n\t\t\treturn 255; }\r\n\t\tresync();\r\n\t\tgoto retry; }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Write an entire disk\r\n */\r\nvoid write_disk(void)\r\n{\r\n\tunsigned i, o, s, m;\r\n\tunsigned char c, d, h, hf, xf, lc, bs;\r\n\r\n\th = hf = 255;\r\n\tlc = 0;\r\n\tif(!(fp = fopen(Directory, \"rb\")))\r\n\t\terror(\"Cannot read file\");\r\n\twputc('\\n');\r\ntxt: switch(i = getc(fp)) {\r\n\t\tdefault:\r\n\t\t\tif((i < ' ') || (i > '~'))\r\n\t\t\t\tgoto txt;\r\n\t\tcase 0x0A :\r\n\t\t\twputc(i);\r\n\t\t\tgoto txt;\r\n\t\tcase EOF :\r\n\t\t\tfclose(fp); fp = 0;\r\n\t\t\terror(\"File format error\");\r\n\t\tcase 0x1A : }\r\n\tpwait(\"WRITE\");\r\n\treset();\r\n\tdraw_scale();\r\n\r\n\twhile((i = getc(fp)) != EOF) {\r\n\t\tm = Mtran[i];\r\n\t\tc = getc(fp);\t\t// Cylinder\r\n\t\tif(c >= Cylinders) {\r\n\t\t\twputs(\"\\nImage exceeds configured Cylinders\");\r\n\t\t\tbreak; }\r\n\t\td = getc(fp);\t\t// Head\r\n\t\tif(Head = d & 0x0F)\r\n\t\t\th = 0x55;\r\n\t\tif(hf && c) {\r\n\t\t\tif(h == 0x55)\r\n\t\t\t\tnewch(\"Double-sided\");\r\n\t\t\telse\r\n\t\t\t\tnewch(\"Single-sided\");\r\n\t\t\tnewch(\"%s-step\", Dds ? \"Double\" : \"Single\");\r\n\t\t\thf = 0; }\r\n\t\tif(c != Cylinder) {\r\n\t\t\twhile(lc < c) {\r\n\t\t\t\tCylinder = lc++;\r\n\t\t\t\tCstat(0); }\r\n\t\t\tCylinder = c;\r\n\t\t\tCstat(0);\r\n\t\t\tseek(c); }\r\n\t\tupCH();\r\n\t\tS->Mode = Mode = m;\r\n\t\ttg43(255);\r\n\t\tS->Stop = Stop = getc(fp);\r\n\t\tS->Ssize = Ssize = getc(fp);\r\n\t\tS->Eot = Eot = Stop; // ?\r\n\t\tif(!Stop) {\r\n\t\t\tCstat('N');\r\n\t\t\tcontinue; }\r\n\t\tfget(Smap, Stop, fp);\r\n\t\tif(d & 0x80)\t\t// Cylinder ID override\r\n\t\t\tfget(Cmap, Stop, fp);\r\n\t\telse\r\n\t\t\tmemset(Cmap, Cylinder, Stop);\r\n\t\tif(d & 0x40)\t\t// Head ID override\r\n\t\t\tfget(Hmap, Stop, fp);\r\n\t\telse\r\n\t\t\tmemset(Hmap, Head, Stop);\r\n//\t\tdelay(250);\r\n\t\txf = ((Head ? 0x02 : 0x01)) & Sskip[Cylinder];\r\n\t\tif(!xf) {\r\n\t\t\tCstat('F');\r\n\t\t\tformat_track();\r\n\t\t\tCstat('W'); }\r\n\t\tw_gotoxy(0, 1, swin); w_cleol(swin);\r\n\t\tfor(bs=i=0; i < Stop; ++i) {\r\n\t\t\tw_printf(swin, \" %u\", Smap[i]);\r\n\t\t\to = 0;\r\n\t\t\ts = 128 << Ssize;\r\n\t\t\t++STcount[ST_TOTAL];\r\n\t\t\tif(c = getc(fp)) {\t\t// Data available\r\n\t\t\t\tif(--c & 1) {\t\t\t// Compressed\r\n\t\t\t\t\t++STcount[ST_COMP];\r\n\t\t\t\t\td = getc(fp);\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tpoke(DMA, o++, d); }\r\n\t\t\t\t\twhile(--s); }\r\n\t\t\t\telse {\t\t\t\t\t// Normal\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tpoke(DMA, o++, getc(fp)); }\r\n\t\t\t\t\twhile(--s); }\r\n\t\t\t\tif(c & 2) {\t\t\t\t// deleted\r\n\t\t\t\t\tif(Dam) {\r\n\t\t\t\t\t\t++STcount[ST_DAM];\r\n\t\t\t\t\t\tif(Dam == 255) {\r\n\t\t\t\t\t\t\tDam = 15;\r\n\t\t\t\t\t\t\tnewch(\"Deleted-Data\"); } } }\r\n\t\t\t\tif(c & 4) {\t\t\t\t// Bad\r\n\t\t\t\t\t++STcount[ST_BAD];\r\n\t\t\t\t\tif(!bs) {\r\n\t\t\t\t\t\tnewch(\"Image track contains bad sectors\");\r\n\t\t\t\t\t\tbs = 255; } }\r\n\t\t\t\tif(!xf)\r\n\t\t\t\t\twrite_sector(i, c); }\r\n\t\t\telse\r\n\t\t\t\t++STcount[ST_UNAVAIL]; }\r\n\t\tif(xf)\r\n\t\t\tCstat('X');\r\n\t\telse\r\n\t\t\tCstat(Head ? TDONE : BDONE); }\r\n\tfclose(fp); fp=0;\r\n\tshowstat();\r\n}\r\n\r\n/*\r\n * Perform head cleaning \"scrub\"\r\n */\r\nvoid scrub(unsigned c)\r\n{\r\n\tif(c >= Cylinders)\r\n\t\tc = Cylinders-1;\r\n\tupCYL();\r\n\tseek(c);\r\n\tdelay(MDEL);\r\n}\r\n\r\n/*\r\n * Show numeric field in config display\r\n */\r\nunsigned show_num(unsigned v, unsigned b)\r\n{\r\n\tunsigned i, s;\r\n\tunsigned char stack[5];\r\n\ts = 0;\r\n\tdo {\r\n\t\ti = (v % b);\r\n\t\tstack[s++] = (i > 9) ? i+('0'+7) : i + '0'; }\r\n\twhile(v /= b);\r\n\ti = s;\r\n\tdo {\r\n\t\twputc(stack[--s]); }\r\n\twhile(s);\r\n\treturn i;\r\n}\r\n\r\n/*\r\n * Get numeric field for config display\r\n */\r\nunsigned get_num(unsigned x, unsigned y, unsigned b, unsigned d, unsigned l, unsigned h)\r\n{\r\n\tunsigned w, i, c, v, x1;\r\n\tunsigned char f;\r\n\tstatic unsigned char *gn_prompt[] = {\r\n\t\t\"Enter value:\",\r\n\t\t\"\",\r\n\t\t\"Press: ENTER to accept new value.\",\r\n\t\t\"\\x07ESC   to cancel with no change.\",\r\n\t\t\"\\x07SPACE to restore original value.\",\r\n\t\t\"\\x07BKSP  to remove last digit.\",\r\n\t\t0 };\r\n\r\n\tprompt(gn_prompt, 5);\r\n\twgotoxy(x, y);\r\n\tshow_num(l, b);\r\n\twputc('-');\r\n\tw = show_num(h, b);\r\n\twputs(\" : \");\r\n\tx1 = W_OPEN->WINcurx;\r\nredef:\r\n\tf = 255;\r\n\tv = d;\r\n\tfor(;;) {\r\n\t\twgotoxy(x1, y);\r\n\t\t*mwin = video[AR_MAIN];\r\n\t\ti = show_num(v, b);\r\n\t\twhile(i < w) {\r\n\t\t\twputc(' ');\r\n\t\t\t++i; }\r\n\t\t*mwin = video[AR_MAIN];\r\n\t\tswitch(c = wgetc()) {\r\n\t\tcase ' ' : goto redef;\r\n\t\tcase 0x1B: v = -1; goto doexit;\r\n\t\tcase '\\n' :\r\n\t\t\tif((v < l) || (v > h)) {\r\n\t\t\t\tbeep(750, 200);\r\n\t\t\t\tcontinue; }\r\n\t\tdoexit:\r\n\t\t\t*mwin = video[AT_MAIN];\r\n\t\t\twgotoxy(x, y);\r\n\t\t\twcleol();\r\n\t\t\treturn v;\r\n\t\tcase '\\b' :\r\n\t\tcase _KBS :\r\n\t\t\t*mwin = video[AT_MAIN];\r\n\t\t\tv /= b;\r\n\t\t\tf = 0;\r\n\t\t\tcontinue; }\r\n\t\tif(isdigit(c))\r\n\t\t\tc -= '0';\r\n\t\telse if((c >= 'A') && (c <= 'F'))\r\n\t\t\tc -= ('A'-10);\r\n\t\telse if((c >= 'a') && (c <= 'f'))\r\n\t\t\tc -= ('a'-10);\r\n\t\telse\r\n\t\t\tcontinue;\r\n\t\tif(c >= b)\r\n\t\t\tcontinue;\r\n\t\tif(f)\r\n\t\t\tv = f = 0;\r\n\t\ti = (v * b) + c;\r\n\t\tif(i <= h)\r\n\t\t\tv = i; }\r\n}\r\n\r\n/*\r\n * Prompt for format specific parameters\r\n */\r\nint fmtprompt(char test)\r\n{\r\n\tunsigned i;\r\n\tstatic char *mmenu[] = {\r\n\t\t\"500 kbps FM\",\r\n\t\t\"300 kbps FM\",\r\n\t\t\"250 kbps FM\",\r\n\t\t\"500 kbps MFM\",\r\n\t\t\"300 kbps MFM\",\r\n\t\t\"250 kbps MFM\",\r\n\t\t0 };\r\n\tstatic char *smenu[] = {\r\n\t\t\"128\",\r\n\t\t\"256\",\r\n\t\t\"512\",\r\n\t\t\"1024\",\r\n\t\t\"2048\",\r\n\t\t\"4096\",\r\n\t\t\"8192\",\r\n\t\t0 };\r\n\r\n\twgotoxy(CFG_X, CFG_Y); wputs(\"Sectors/Track?\");\r\n\tif((i = get_num(CFG_X+15, CFG_Y, 10, Fn, 1, 255)) == -1)\r\n\t\treturn 0;\r\n\twprintf(\"%u\", Fn = i);\r\n\twgotoxy(CFG_X, CFG_Y+1); wputs(\"Start sector?\");\r\n\tif((i = get_num(CFG_X+15, CFG_Y+1, 10, Fss, 1, 255)) == -1)\r\n\t\treturn 0;\r\n\tFss = i;\r\n\twclwin();\r\n\twprintf(\"%s sided, %s step\",\r\n\t\tSide1 ? \"Double\" : \"Single\",\r\n\t\tDstep ? \"Double\" : \"Single\");\r\n\tif((Intl == 255) || !(i = Intl))\r\n\t\ti = 1;\r\n\twprintf(\", %u sectors/track, starting at %u, interleave: %u:1\",\r\n\t\tFn, Fss, i);\r\n\twputs(\"\\nData rate/type: \");\r\n\tif(wmenu(50, 7, WSAVE|WCOPEN|WBOX1|video[AT_POP], mmenu, &Fm))\r\n\t\treturn 0;\r\n\twprintf(\"%s, Sector size: \", mmenu[Fm]);\r\n\tif(wmenu(50, 7, WSAVE|WCOPEN|WBOX1|video[AT_POP], smenu, &Fs))\r\n\t\treturn 0;\r\n\twprintf(\"%s\", smenu[Fs]);\r\n\tif(test) {\r\n\t\twgotoxy(CFG_X, CFG_Y+2); wputs(\"Write pattern?\");\r\n\t\tWdata = get_num(CFG_X+15, CFG_Y+2, 16, Wdata, 0, 0xFFFF); }\r\n\treturn FmtOK = 255;\r\n}\r\n\r\n/*\r\n * Setup maps for format\r\n */\r\nvoid fmtsetup(void)\r\n{\r\n\tunsigned i;\r\n\r\n\tS0.Mode = Fm;\r\n\tS0.Eot = S0.Stop = Fn;\r\n\tS0.Ssize = Fs;\r\n\tfor(i=0; i < Fn; ++i)\r\n\t\tS0.Smap[i] = Fss+i;\r\n\tmemcpy(S1, S0, sizeof(S1));\r\n\tmemset(S0.Hmap, 0, Fn);\r\n\tmemset(S1.Hmap, 1, Fn);\r\n}\r\n\r\n/*\r\n * Low-Level format function\r\n */\r\nint format(unsigned char fmt)\r\n{\r\n\tunsigned char f, d;\r\n\r\n\twclwin();\r\n\tptr = 0;\r\n\tif(Side1 == 0x55)\r\n\t\tptr = \"You MUST pick one/two sides\";\r\n\tif(Dstep == 0x55)\r\n\t\tmerror(\"You MUST pick single/double step\");\r\n\tif(fmt) {\r\n\t\tif((Intl == 255) || !Intl)\r\n\t\t\tmerror(\"You MUST specify interleave\"); }\r\n\tif(ptr)\r\n\t\terror(ptr);\r\n\r\n\tif(fmt) {\r\n\t\td = 'F';\r\n\t\tif(!fmtprompt(0))\r\n\t\t\treturn;\r\n\t\tpwait(\"FORMAT\"); }\r\n\telse {\r\n\t\td = 'E';\r\n\t\tpwait(\"ERASE\");\r\n\t\tmemcpy(FMTsave, &Fn, FSSIZE);\r\n\t\tFMTflag = 0x55;\r\n\t\tFn = 1; Fm = 5; Fs = 6; Fss = 1; Intl = 1; Ffill = 0xFF; }\r\n\r\n\treset();\r\n\tfmtsetup();\r\n\tdraw_scale();\r\n\r\n\tf = 255;\r\n\tfor(Cylinder = 0; Cylinder < Cylinders; ++Cylinder) {\r\n\t\tHead = 0;\r\n\t\tCstat(0);\r\n\t\tseek(Cylinder);\r\n\t\tupCH();\r\n\t\ttg43(255);\r\n\t\tif(Sskip[Cylinder] & 1)\r\n\t\t\tCstat('X');\r\n\t\telse {\r\n\t\t\tCstat(d);\r\n\t\t\tmemset(S0.Cmap, Cylinder, Fn);\r\n\t\t\tformat_track();\r\n\t\t\tif(f) { f=0; memcpy(S1.Smap, S0.Smap, Fn); }\r\n\t\t\tCstat(BDONE); }\r\n\t\tif(Ss1) {\r\n\t\t\tHead = 1;\r\n\t\t\tupCH();\r\n\t\t\tif(Sskip[Cylinder] & 2)\r\n\t\t\t\tCstat('X');\r\n\t\t\telse {\r\n\t\t\t\tCstat(d);\r\n\t\t\t\tmemset(S1.Cmap, Cylinder, Fn);\r\n\t\t\t\tformat_track();\r\n\t\t\t\tif(f) { f=0; memcpy(S0.Smap, S1.Smap, Fn); }\r\n\t\t\t\tCstat(TDONE); } } }\r\n\tfmtrest();\r\n}\r\n\r\n/*\r\n * Alignment/Test function\r\n */\r\nvoid align(void)\r\n{\r\n\tunsigned i, s, t, y, n, ct, df, sf[MSEC];\r\n\tstatic unsigned char bf, sm[32];\r\n\tstatic unsigned char *align_prompt[] = {\r\n\t\t\"Insert formatted\",\r\n\t\t\"diskette\",\r\n\t\t\"\",\r\n\t\t\"A   = Analyze\",\r\n\t\t\"B   = Beep on/off\",\r\n\t\t\"D   = read Data\",\r\n\t\t\"F   = Format\",\r\n\t\t\"H   = Head 0/1\",\r\n\t\t\"I   = track Image\",\r\n\t\t\"P   = fmt Parms\",\r\n\t\t\"R   = Recal/seek\",\r\n\t\t\"S   = Step S/D\",\r\n\t\t\"W   = Write data\",\r\n\t\t\"Z   = Zero track\",\r\n\t\t\"0-9 = seek 0-90\",\r\n\t\t\"+/- = Seek +/-1\",\r\n\t\t\"X   = eXit\",\r\n\t\t0 };\r\n\tstatic unsigned char sflag[] = { 'F', 'W', 'R', 'Z', 'D' };\r\n\r\n\tmemset(sm, y = n = ct = i = 0, sizeof(sm));\r\nrewin:\r\n\twclwin();\r\n\tprompt(align_prompt, 1);\r\n\tif(!i)\r\n\t\tpwait(\"ALIGN/TEST\");\r\n\treset();\r\n\tif(Dds = 0x55) Dds = 0;\r\n\twopen(20, 5, 60, 20, (unsigned)video[AT_MAIN]|WCOPEN|WSCROLL|WWRAP);\r\n\tanalyze_track(0);\r\n\twputc('\\n');\r\n\r\nrestep:\r\n\tw_gotoxy(65, 0, swin);\r\n\tw_puts(Dds ? \"Double\" : \"Single\", swin);\r\n\tw_puts(\" step\", swin);\r\nreshow:\r\n\tdf = 0;\r\nreshow1:\r\n\tupCYL();\r\n\tfor(;;) {\r\n\t\tif(readid()) {\r\n\t\t\twprintf(\"\\n?\");\r\n\t\t\tmemset(sm, y = n = df = 0, sizeof(sm)); }\r\n\t\telse {\r\n\t\t\tt = Result[3];\r\n\t\t\ts = Result[5] & 0x1F;\r\n\t\t\twprintf(\"\\r%-3u%3u\", t, s);\r\n\t\t\tif(sm[s] < 2) {\r\n\t\t\t\t++sm[s];\r\n\t\t\t\tif(t == ct)\r\n\t\t\t\t\t++y;\r\n\t\t\t\telse\r\n\t\t\t\t\t++n; }\r\n\t\t\telse {\r\n\t\t\t\twprintf(\" %u %u\\n\", y, n);\r\n\t\t\t\tif(!bf)\r\n\t\t\t\t\tbeep(500+(y*100), 100);\r\n\t\t\t\tmemset(sm, y=n=0, sizeof(sm)); } }\r\n\r\n\t\twrfdc(0x04);\r\n\t\twrfdc(Head ? (Drive|4) : Drive);\r\n\t\tresult(1);\r\n\t\tt = Result[0];\r\n\t\tw_gotoxy(25, i=0, swin);\r\n\t\tdo {\r\n\t\t\ts = sflag[i++];\r\n\t\t\tif(!(t & 0x80))\r\n\t\t\t\ts += ('a'-'A');\r\n\t\t\tw_putc(s, swin);\r\n\t\t\tt <<= 1; }\r\n\t\twhile(i < sizeof(sflag));\r\n\r\n\t\tif(i = Lkey) {\r\n\t\t\tLkey = 0;\r\n\t\t\tswitch(toupper(i)) {\r\n\t\t\tcase '?' :\r\n\t\t\tcase _F1 : help(HALIGN);\tcontinue;\r\n\t\t\tcase ' ' : switch(i=wgetc()) {\r\n\t\t\t\tcase 0x1B : xabort();\r\n\t\t\t\tcase ' ' : i = 0; }\r\n\t\t\t\tLkey = i; goto reshow;\r\n\t\t\tcase '+' :\r\n\t\t\tcase '=' :\r\n\t\t\tcase _UA: ++ct; goto doseek;\r\n\t\t\tcase '-' :\r\n\t\t\tcase '_' :\r\n\t\t\tcase _DA: if(ct) --ct; goto doseek;\r\n\t\t\tcase 'X' : wclose(); return;\r\n\t\t\tcase 'H' : Head = Head ? 0 : 1; upCH(); df=0;\tcontinue;\r\n\t\t\tcase 'B' : bf = bf ? 0 : 255;\t\t\t\t\tcontinue;\r\n\t\t\tcase 'S' : Dds = Dds ? 0 : 255;\t\t\t\t\tgoto restep;\r\n\t\t\tcase 'R' : recal();\r\n\t\t\t\tdelay(500);\r\n\t\t\t\tif(ct) {\r\n\t\t\t\t\tseek(ct);\r\n\t\t\t\t\tdelay(MDEL); }\r\n\t\t\t\tgoto reshow;\r\n\t\t\tcase 'D' :\r\n\t\t\t\tanalyze_track(0);\r\n\t\t\t\twputs(\"\\nData:\");\r\n\t\t\t\tDMA = SEG;\r\n\t\t\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\t\t\twprintf(\" %u\", Smap[i]);\r\n\t\t\t\t\tsf[i] = sector_data_flag(read_sector(i), 0);\r\n\t\t\t\t\tbumpdma(); }\r\n\t\t\t\twputc('\\n');\r\n\t\t\t\tdf = 255;\r\n\t\t\t\tgoto reshow1;\r\n\t\t\tcase 'I' :\r\n\t\t\t\tif(df) {\r\n\t\t\t\t\tsprintf(buffer, \"$C%uH%u.IMD\", Cylinder, Head);\r\n\t\t\t\t\tif(fp = fopen(buffer, \"wb\")) {\r\n\t\t\t\t\t\twrite_header();\r\n\t\t\t\t\t\tputc(0x1A, fp);\r\n\t\t\t\t\t\twrite_ana();\r\n\t\t\t\t\t\tDMA = SEG;\r\n\t\t\t\t\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\t\t\t\t\twrite_data(sf[i]);\r\n\t\t\t\t\t\t\tbumpdma(); }\r\n\t\t\t\t\t\tfclose(fp);\r\n\t\t\t\t\t\twprintf(\"\\n%s written\\n\", buffer);\r\n\t\t\t\t\t\tgoto reshow1; } }\r\n\t\t\t\tbeep(750, 200);\r\n\t\t\t\tcontinue;\r\n\t\t\tcase 'W' :\r\n\t\t\t\tanalyze_track(0);\r\n\t\t\t\twputs(\"\\nWrite:\");\r\n\t\t\t\tfor(i=0; i < 16384; ++i)\r\n\t\t\t\t\tpokew(SEG, i+i, Wdata);\r\n\t\t\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\t\t\twprintf(\" %u\", Smap[i]);\r\n\t\t\t\t\tDMA = SEG;\r\n\t\t\t\t\twrite_sector(i, 0); }\r\n\t\t\t\twputc('\\n');\r\n\t\t\t\tgoto reshow;\r\n\t\t\tcase 'P' :\r\n\t\t\t\twclose();\r\n\t\t\t\twclwin();\r\n\t\t\t\tfmtprompt(255);\r\n\t\t\t\tgoto rewin;\r\n\t\t\tcase 'F' :\r\n\t\t\t\twputs(\"\\nFormat\");\r\n\t\t\t\tif(!FmtOK) {\r\n\t\t\t\t\twputs(\" - Must set P)aramaters\\n\");\r\n\t\t\t\t\tcontinue; }\r\n\t\t\t\ts = Intl;\r\n\t\t\t\tif((Intl == 255) || !Intl)\r\n\t\t\t\t\tIntl = 1;\r\n\t\t\t\tfmtsetup();\r\n\t\t\t\tupCH();\r\n\t\t\t\tS->Lmsn = Lmsn = -1;\r\n\t\t\t\tmemset(Cmap, Cylinder, Fn);\r\n\t\t\t\tformat_track();\r\n\t\t\t\tIntl = s;\r\n\t\t\tcase 'A' : analyze_track(0); wputc('\\n');\tgoto reshow;\r\n\t\t\tcase 'Z' : recal(); ct = 0; delay(500);\t\tgoto reshow; }\r\n\t\t\tif(isdigit(i)) {\r\n\t\t\t\tct = (i-'0') * 10;\r\n\t\t\tdoseek:\r\n\t\t\t\tseek(ct);\r\n\t\t\t\tupCH();\r\n\t\t\t\tdelay(MDEL);\r\n\t\t\t\tgoto reshow; } } }\r\n}\r\n\r\n/*\r\n * Configuration (Settings) item-name/prompt text\r\n */\r\nunsigned char *Cprompt[] = {\r\n\t\"Drive\",\t\t\t// 0\r\n\t\"Cylinders\",\t\t// 1\r\n\t\"Sides\",\t\t\t// 2\r\n\t\"Double-step\",\t\t// 3\r\n\t\"R/W    gap\",\t\t// 4\r\n\t\"Format gap\",\t\t// 5\r\n\t\"Format fill\",\t\t// 6\r\n\t\"Full analysis\",\t// 7\r\n\t\"Interleave\",\t\t// 8\r\n\t\"Retries    \",\t\t// 9\r\n\t\"Keep bad sector\",\t// 10\r\n\t\"500 kbps ->\",\t\t// 11\r\n\t\"300 kbps ->\",\t\t// 12\r\n\t\"250 kbps ->\",\t\t// 13\r\n\t0 };\r\n\r\n/*\r\n * Display current configuration\r\n */\r\nvoid show_config(unsigned n)\r\n{\r\n\tunsigned char *p, v;\r\n\twgotoxy(CFG_X, n+CFG_Y);\r\n\twputf(Cprompt[n], 15);\r\n\t*mwin = video[AT_MAIN];\r\n\twputs(\": \");\r\n\tswitch(n) {\r\n\tcase 0 : wputc(Drive+'A');\treturn;\r\n\tcase 1 : wprintf(\"%-3u\", Cylinders);\treturn;\r\n\tcase 2 : switch(Side1) {\r\n\t\tcase 0x00 : p = \"One\";\tbreak;\r\n\t\tcase 0xFF : p = \"Two\";\tbreak;\r\n\t\tdefault: p = \"As original\"; Side1 = 0x55; }\r\nshowp:\twputf(p, 15);\r\n\t\treturn;\r\n\tcase 3 : switch(Dstep) {\r\n\t\tcase 0x00 : p = \"Off\";\tbreak;\r\n\t\tcase 0xFF : p = \"On\";\tbreak;\r\n\t\tdefault: p = \"As original\"; Dstep = 0x55; }\r\n\t\tgoto showp;\r\n\tcase 4 :\tp = Xgl; v = Gl;\r\n\tshowgap:\r\n\t\tif(!p) { wprintf(\"%-3u\", v); return; }\r\n\t\twputs(\"Calculated\");\r\n\t\treturn;\r\n\tcase 5 :\tp = Xglf; v = Glf; goto showgap;\r\n\tcase 6 :\twprintf(\"%02x\", Ffill);\t\t\treturn;\r\n\tcase 7 :\twputs(Dana ? \"No \" : \"Yes\");\treturn;\r\n\tcase 9 :\twprintf(\"%-3u\", Retry);\t\t\treturn;\r\n\tcase 8 :\r\n\t\tswitch(Intl) {\r\n\t\tcase  0 : wputs(\"As read\");\t\tbreak;\r\n\t\tcase 255: wputs(\"BestGuess\");\tbreak;\r\n\t\tdefault: wprintf(\"%u:1\", Intl); }\r\n\t\twcleol();\r\n\t\treturn;\r\n\tcase 10: wputs(Bad ? \"Yes\" : \"No \");\t\treturn;\r\n\tcase 11:\r\n\tcase 12:\r\n\tcase 13:\twprintf(\"%3u kbps\", Mtext[Mtran[n-11]]); }\r\n}\r\n\r\n/*\r\n * Edit configuration\r\n */\r\nvoid config(void)\r\n{\r\n\tunsigned n;\r\n\tunsigned char *ip, *ip1;\r\n\tstatic unsigned p;\r\n\tstatic char *config_prompt[] = {\r\n\t\t\"Select item to configure\",\r\n\t\t\"with the Up/Down arrows.\",\r\n\t\t\"\",\r\n\t\t\"Press: SPACE to change value\",\r\n\t\t\"\\x07ESC   to exit\",\r\n\t\t0 };\r\n\twclwin();\r\nreprompt:\r\n\tprompt(config_prompt, 5);\r\nredraw:\r\n\tfor(n=0; Cprompt[n]; ++n) {\r\n\t\tif(p == n) *mwin = video[AR_MAIN];\r\n\t\tshow_config(n); }\r\n\tfor(;;) {\r\n\t\tswitch(wgetc()) {\r\n\t\tcase '?' :\r\n\t\tcase _K1  : help(HSET);\t\t\t\tcontinue;\r\n\t\tcase _KDA : if(++p >= n) p = 0;\t\tgoto redraw;\r\n\t\tcase _KUA : p = (p ? p : n) - 1;\tgoto redraw;\r\n\t\tcase 0x1B : wclwin(); return;\r\n\t\tcase ' ' :\r\n//\t\t\tshow_config(p);\r\n\t\t\tswitch(p) {\r\n\t\t\tcase 0 :\r\n\t\t\t\tif(++Drive >= Maxdrive)\r\n\t\t\t\t\tDrive = 0;\r\n\t\t\t\tgoto redraw;\r\n\t\t\tcase 1 :\r\n\t\t\t\tif((n = get_num(CFG_X+17, p+CFG_Y, 10, Cylinders, 1, 255)) != -1)\r\n\t\t\t\t\tCylinders = n;\r\n\t\t\t\tgoto reprompt;\r\n\t\t\tcase 2 : ip = &Side1;\r\nT0055FF:\t\tswitch(*ip) {\r\n\t\t\t\t\tcase 0x00 : *ip = 0xFF;\tgoto redraw;\r\n\t\t\t\t\tcase 0x55 : *ip = 0x00; goto redraw; }\r\n\t\t\t\t*ip = 0x55; goto redraw;\r\n\t\t\tcase 3 : ip = &Dstep;\tgoto T0055FF;\r\n\t\t\tcase 4 : ip = &Xgl; ip1 = &Gl;\r\nOPTNUM:\t\t\tif(!*ip) { *ip = 255; goto redraw; }\r\n\t\t\t\tif((n = get_num(CFG_X+17, p+CFG_Y, 10, *ip1, 1, 255)) != -1) {\r\n\t\t\t\t\t*ip = 0;\r\n\t\t\t\t\t*ip1 = n; }\r\n\t\t\t\tgoto reprompt;\r\n\t\t\tcase 5 : ip = &Xglf; ip1 = &Glf; goto OPTNUM;\r\n\t\t\tcase 6 :\r\n\t\t\t\tif((n = get_num(CFG_X+17, p+CFG_Y, 16, Ffill, 0, 255)) != -1)\r\n\t\t\t\t\tFfill = n;\r\n\t\t\t\tgoto reprompt;\r\n\t\t\tcase 7 : Dana = Dana ? 0 : 255;\t\tgoto redraw;\r\n\t\t\tcase 8 :\r\n\t\t\t\tswitch(Intl) {\r\n\t\t\t\tcase 0  : Intl = 255;\tgoto redraw;\r\n\t\t\t\tdefault : Intl = 0;\t\tgoto redraw;\r\n\t\t\t\tcase 255: wcleol();\r\n\t\t\t\t\tif((n = get_num(CFG_X+17, p+CFG_Y, 10, 1, 1, 99)) != -1)\r\n\t\t\t\t\t\tIntl = n;\r\n\t\t\t\t\tgoto reprompt; }\r\n\t\t\tcase 9 :\r\n\t\t\t\tif((n = get_num(CFG_X+17, p+CFG_Y, 10, Retry, 0, 255)) != -1)\r\n\t\t\t\t\tRetry = n;\r\n\t\t\t\tgoto reprompt;\r\n\t\t\tcase 10 :\tBad = Bad ? 0 : 255;\tgoto redraw;\r\n\t\t\tcase 11 :\r\n\t\t\tcase 12:\r\n\t\t\tcase 13:\r\n\t\t\t\tif(++Mtran[n=p-11] > 2) Mtran[n] = 0;\r\n\t\t\t\tMtran[n+3] = Mtran[n] + 3;\r\n\t\t\t\tgoto redraw;\r\n\t} } }\r\n}\r\n\r\n/*\r\n * Get current directory name\r\n */\r\nvoid getcurrent(void)\r\n{\r\n\tDirectory[Dip=0] = get_drive() + 'A';\r\n\tDirectory[1] = ':';\r\n\tDirectory[2] = '\\\\';\r\n\tgetdir(Directory+3);\r\n}\r\n\r\n/*\r\n * Select a file via window panel\r\n */\r\nint selectfile(unsigned char *match, char new)\r\n{\r\n\tunsigned a, i, Nt, Pt;\r\n\tunsigned char name[13], *n[SFILES], pool[SFILES*9], *p;\r\n\r\n\t// Find end of directory index\r\n\tif(Dip)\r\n\t\t*Dip = 0;\r\nnewdir:\r\n\tDip = Directory; while(*Dip) ++Dip;\r\n\tif(*(Dip-1) == '\\\\')\r\n\t\t--Dip;\r\n\t*Dip = '\\\\';\r\n\t// Scan for all files & build name list\r\n\tstpcpy(Dip+1, \"*.*\");\r\n\tNt = Pt = 0;\r\n\tif(!find_first(Directory, DIRECTORY, p = name, &i, &i, &a, &i, &i)) do {\r\n\t\tif(Nt >= SFILES)\r\n\t\t\tbreak;\r\n\t\tif(a & DIRECTORY) {\r\n\t\t\tif(!strcmp(p, \".\"))\r\n\t\t\t\tcontinue;\r\n\t\t\tn[Nt++] = &pool[Pt];\r\n\t\t\tpool[Pt++] = 1;\t// Insure sorts first!\r\n\t\t\twhile(pool[Pt++] = *p++);\r\n\t\t\tcontinue; }\r\n\t\twhile(*p) {\r\n\t\t\tif(!strcmp(p, match)) {\r\n\t\t\t\t*p = 0;\tp = name;\r\n\t\t\t\tn[Nt++] = &pool[Pt];\r\n\t\t\t\twhile(pool[Pt++] = *p++);\r\n\t\t\t\tbreak; }\r\n\t\t\t++p; } }\r\n\twhile !find_next(p=name, &i, &i, &a, &i, &i);\r\n\r\n\t*Dip = 0;\r\n\tif(new || !Nt) goto manent;\r\n\r\n\t// Sort the name list\r\n\tfor(i=0; i < Nt; ++i) {\r\n\t\tfor(a=i+1; a < Nt; ++a) {\r\n\t\t\tif(strcmp(n[a], n[i]) < 0) {\r\n\t\t\t\tp = n[i];\r\n\t\t\t\tn[i] = n[a];\r\n\t\t\t\tn[a] = p; } } }\r\n\t// Convert directory pref\r\n\tfor(i=0; i < Nt; ++i) {\r\n\t\tif(*(p = n[i]) != 1)\r\n\t\t\tbreak;\r\n\t\twhile(p[1]) {\r\n\t\t\t*p = p[1];\r\n\t\t\t++p; }\r\n\t\t*p = '\\\\'; }\r\n\r\n\ti = ((Nt + 4) / 5) + 2;\r\n\twopen(4, 12-(i/2), 71, i, REVERSE|WSAVE|WBOX1|WCOPEN);\r\n\twintitle(0, Directory);\r\n\ta = 0;\r\n\twcursor_off();\r\ndraw:\r\n\tfor(i=0; i < Nt; ++i) {\r\n\t\twgotoxy((i % 5) * 14, i / 5);\r\n\t\tif(i == a) *W_OPEN = NORMAL;\r\n\t\twputs(n[i]);\r\n\t\t*W_OPEN = REVERSE; }\r\n\tfor(;;) switch(wgetc()) {\r\n\t\tcase _KLA : if(a) { --a; goto draw; }\r\n\t\tcase _KEN : a = Nt-1; goto draw;\r\n\t\tcase _KRA : if(++a < Nt) goto draw;\r\n\t\tcase _KHO : a = 0;\tgoto draw;\r\n\t\tcase _KUA : if(a > 4) a -= 5; goto draw;\r\n\t\tcase _KDA : if((a+5) < Nt) a += 5; goto draw;\r\n\t\tcase '\\n' :\r\n\t\t\t*Dip = '\\\\';\r\n\t\t\tp = n[a]; while(p[1]) ++p;\r\n\t\t\tif(*p == '\\\\') {\t\t// Directory\r\n\t\t\t\t*p = 0;\r\n\t\t\t\tif(strcmp(p = n[a], \"..\")) {\t// Not UP\r\n\t\t\t\t\tstpcpy(Dip+1, p);\r\n\t\tnewdir1:\twclose();\r\n\t\t\t\t\tgoto newdir; }\r\n\t\t\t\t// Go up one directory\r\n\t\t\t\twhile(Dip > Directory) {\r\n\t\t\t\t\tif(*--Dip == '\\\\') {\r\n\t\t\t\t\t\t*Dip = 0;\r\n\t\t\t\t\t\tgoto newdir1; } }\r\n\t\t\t\tgetcurrent();\r\n\t\t\t\tgoto newdir1; }\r\n\t\t\tconcat(Dip+1, n[a], match);\r\n\t\t\twclose();\r\n\t\t\treturn 255;\r\n\t\tcase '?' :\r\n\t\tcase _K1 : help(HFILE);\t\tcontinue;\r\n\t\tcase _K2 :\r\n\t\t\twclose();\r\n\t\tmanent:\r\n\t\t\tstpcpy(pool, Directory); Pt = Dip;\r\n\t\t\twopen(4, 10, 71, 4, REVERSE|WSAVE|WBOX1|WCOPEN);\r\n\t\t\twintitle(0, Directory);\r\n\t\t\twclwin(); wputs(\"Enter filename (or directory ending with '\\\\'):\");\r\n\t\t\t*Dip = '\\\\';\r\n\t\t\t*(Dip+1) = a = 0;\r\n\t\tmanent1:\r\n\t\t\tswitch(wgets(0x100, 1, p = Dip = Directory, sizeof(Directory)-1)) {\r\n\t\t\tcase _K1 : help(HENTRY);\r\n\t\t\tdefault : goto manent1;\r\n\t\t\tcase '\\n' :\r\n\t\t\t\tnew = 0;\r\n\t\t\t\twhile(i = *p++) switch(i) {\r\n\t\t\t\t\tcase ':' :\r\n\t\t\t\t\tcase '\\\\': Dip = p-1; a = 0; continue;\r\n\t\t\t\t\tcase '.' : a = 255; }\r\n\t\t\t\twclose();\r\n\t\t\t\tif(*(p-2) == '\\\\') goto newdir;\r\n\t\t\t\tif(!a)\r\n\t\t\t\t\tstpcpy(p-1, match);\r\n\t\t\t\treturn 255;\r\n\t\t\tcase 0x1B:\r\n\t\t\t\tstpcpy(Directory, pool);\r\n\t\t\t\tDip = Pt;\r\n\t\t\t\tif(Nt && !new) {\r\n\t\t\t\t\twclose();\r\n\t\t\t\t\tgoto newdir; } }\r\n\t\tcase 0x1B :\r\n\t\tcase _K10 :\r\n\t\t\twclose();\r\n\t\t\treturn 0; }\r\n}\r\n\r\n/*\r\n * Skip to next non-blank\r\n */\r\nint skip(void)\r\n{\r\n\twhile(isspace(*ptr))\r\n\t\t++ptr;\r\n\treturn *ptr;\r\n}\r\n\r\n/*\r\n * Obtain a numeric value from command input\r\n */\r\nunsigned number(unsigned base, unsigned low, unsigned high)\r\n{\r\n\tunsigned c, v;\r\n\tunsigned char f;\r\n\tv = f = 0;\r\n\tskip();\r\n\tfor(;;) {\r\n\t\tif(isdigit(c = *ptr))\r\n\t\t\tc -= '0';\r\n\t\telse if((c >= 'A') && (c <= 'F'))\r\n\t\t\tc -= ('A'-10);\r\n\t\telse if((c >= 'a') && (c <= 'f'))\r\n\t\t\tc -= ('a'-10);\r\n\t\telse switch(c) {\r\n\t\t\tcase 0 :\r\n\t\t\tcase ',':\r\n\t\t\t\tif(f) {\r\n\t\t\t\t\tif((v < low) || (v > high))\r\n\t\t\t\t\t\terror(((base == 16) ?\r\n\t\t\t\t\t\t\t\"Value (%x) out of range: %x-%x\\n\" :\r\n\t\t\t\t\t\t\t\"Value (%u) out of range: %u-%u\\n\" ),\r\n\t\t\t\t\t\t\tv, low, high);\r\n\t\t\t\t\treturn v; }\r\n\t\t\tdefault: error(\"Bad number\"); }\r\n\t\tif(c >= base)\r\n\t\t\terror(\"Bad numeric value\");\r\n\t\tf = 255;\r\n\t\tv = (v * base) + c;\r\n\t\t++ptr; }\r\n}\r\n\r\n/*\r\n * Test for additional command option value (comma separated)\r\n */\r\nint tnext(void)\r\n{\r\n\tif(*ptr == ',') {\r\n\t\t++ptr;\r\n\t\treturn 255; }\r\n\tif(*ptr)\r\n\t\terror(\"Syntax error\");\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Process a single command line option\r\n */\r\nvoid cmdparm(unsigned char *fm)\r\n{\r\n\tunsigned c, i;\r\n\tunsigned char d;\r\n\tstatic unsigned char nest = 5;\r\n\tswitch(skip()) {\r\n\tcase '$' :\r\n\t\tptr1 = ARGV[c=i=0];\r\n\t\twhile(*ptr1) {\r\n\t\t\tif((buffer[i++] = *ptr1++) == '\\\\')\r\n\t\t\t\tc = i; }\r\n\t\tstrcpy(buffer+c, ptr+1);\r\n\t\tptr1 = buffer;\r\n\t\tgoto dofile;\r\n\tcase ';' :\r\n\tcase 0:\treturn; }\r\n\r\n\tptr1 = ptr;\r\n\tswitch(c = (toupper(*ptr++) << 8) | toupper(*ptr++)) {\r\n\tcase '/A' : Drive = 0;\t\t\t\t\t\t\t\treturn;\r\n\tcase '/B' : Drive = 1;\t\t\t\t\t\t\t\treturn;\r\n\tcase '/C' : Drive = 2;\t\t\t\t\t\t\t\tgoto set4;\r\n\tcase '/D' : Drive = 3;\t\t\t\t\t\t\t\tset4:\r\n\tcase '/4' :\tMaxdrive = 4;\t\t\t\t\t\t\treturn;\r\n\tcase '/S' :\r\n\t\t\tFDC = 0x372;\r\n\t\t\tif(*ptr)\r\n\t\t\t\tFDC = number(16, 0, 65535);\r\n\t\t\treturn;\r\n\tcase '/F' : Dana = 0;\t\t\t\t\t\t\t\treturn;\r\n\tcase '/H' : Xhelp = 255;\t\t\t\t\t\t\treturn;\r\n\tcase '/M' : memcpy(video, mvideo, sizeof(video));\treturn;\r\n\tcase '/N' : Dam = 0;\t\t\t\t\t\t\t\treturn;\r\n\tcase '/K' : Bad = 255;\t\t\t\t\t\t\t\treturn;\r\n\tcase 'C=' : Cylinders = number(10, 1, 255);\t\t\treturn;\r\n\tcase 'D=' : stpcpy(Directory, ptr);\t\t\t\t\treturn;\r\n\tcase 'X=' :\td = 3;\t\t\t\t\t\t\t\t\tdoexc:\r\n\t\tc = i = number(10, 0, 255);\r\n\t\tif(tnext())\r\n\t\t\tc = number(10, 0, 255);\r\n\t\twhile(i <= c)\r\n\t\t\tSskip[i++] |= d;\r\n\t\treturn;\r\n\tcase 'R=' : Retry = number(10, 0, 255);\t\t\t\t\treturn;\r\n\tcase 'S=' :\tSide1 = (number(10, 1, 2)-1) && 0xFF;\t\treturn;\r\n\tcase '?'<<8:\r\n\tcase '/?' :\r\n\tcase '-?' :\thelp(HCMD);\texit(0); }\r\n\tif(*ptr++ == '=') switch(c) {\r\n\t\tcase 'T5' : c = 0;\t\tgoto dotran;\r\n\t\tcase 'T3' : c = 1;\t\tgoto dotran;\r\n\t\tcase 'T1' : c = 2;\t\tdotran:\r\n\t\t\tswitch(number(10, 0, 65535)) {\r\n\t\t\tdefault: error(\"Bad transfer rate\");\r\n\t\t\tcase 500: i = 0;\tbreak;\r\n\t\t\tcase 300: i = 1;\tbreak;\r\n\t\t\tcase 250: i = 2; }\r\n\t\t\tMtran[c] = i; Mtran[c+3] = i+3;\r\n\t\t\treturn;\r\n\t\tcase 'LR': switch(number(10, 0, 65535)) {\r\n\t\t\tdefault: error(\"Bad rate\");\r\n\t\t\tcase 500: Lrate = 0xF0;\tbreak;\r\n\t\t\tcase 300: Lrate = 0xF1;\tbreak;\r\n\t\t\tcase 250: Lrate = 0xF2; }\r\n\t\t\treturn;\r\n\t\tcase 'IL' :\tIntl = *ptr ? number(10, 1, 99) : 255;\treturn;\r\n\t\tcase 'X0' : d=1;\t\t\t\t\t\t\t\t\tgoto doexc;\r\n\t\tcase 'X1' : d=2;\t\t\t\t\t\t\t\t\tgoto doexc;\r\n\t\tcase 'FF' : Ffill = number(16, 0, 255);\t\t\t\treturn;\r\n\t\tcase 'DS' : Dstep = number(10, 0, 1) && 0xFF;\t\treturn;\r\n\t\tcase 'CP' : Cpass = number(10, 1, 9);\t\t\t\treturn;\r\n\t\tcase 'GW' : Xgl = 0; Gl = number(10, 0, 255);\t\treturn;\r\n\t\tcase 'GF' : Xglf =0;Glf = number(10, 0, 255);\t\treturn;\r\n\t\tcase 'SD' : SKdel= number(10, 0, 2000);\t\t\t\treturn;\r\n\t\tcase 'SR' : SPsrt = 16 - number(10, 1, 16);\t\t\treturn;\r\n\t\tcase 'HL' : SPhlt = number(10, 2, 254) / 2;\t\t\treturn;\r\n\t\tcase 'HU' : SPhut = number(10, 16, 240) / 16;\t\treturn;\r\n\t\tcase 'TG' :\r\n\t\t\tswitch(toupper(*ptr++)) {\r\n\t\t\tcase 'P' :\r\n\t\t\t\tif((PPort = number(16, 1, 65535)) < 4)\r\n\t\t\t\t\tPPort = peekw(0x40, (PPort*2)+6);\r\n\t\t\t\tswitch(PPort) {\r\n\t\t\t\tdefault:sprintf(Scale, \"\\nWarning: non-standard LPT address: %04x\\n\", PPort);\r\n\t\t\t\tcase 0x378:\r\n\t\t\t\tcase 0x278:\r\n\t\t\t\tcase 0x3BC: }\r\n\t\t\t\tif(tnext()) {\r\n\t\t\t\t\tTGcyl = number(10, 0, 255);\r\n\t\t\t\t\tif(tnext()) {\r\n\t\t\t\t\t\tPPlow = number(16, 0, 255);\r\n\t\t\t\t\t\tif(tnext())\r\n\t\t\t\t\t\t\tPPhigh = number(16, 0, 255); } }\r\n\t\t\t\treturn;\r\n\t\t\tcase 'M' :\r\n\t\t\t\tTGman = 0xF0;\r\n\t\t\t\tif(tnext())\r\n\t\t\t\t\tTGcyl = number(10, 0, 255);\r\n\t\t\t\treturn; }\r\n\t\t\terror(\"Bad TG= selection\"); }\r\n\r\ndofile:\r\n\tconcat(S1.Smap, ptr1, \".CMD\");\r\n\tif(i = fopen(S1.Smap, fm)) {\r\n\t\tif(!--nest)\r\n\t\t\terror(\"CMD nested too deep\");\r\n\t\twhile(fgets(ptr = S1.Smap, MSEC-1, i))\r\n\t\t\tcmdparm(\"rvq\");\r\n\t\tfclose(i);\r\n\t\t++nest; }\r\n}\r\n\r\n/*\r\n * Sector exclusion mapping function\r\n */\r\nvoid ssmap(void)\r\n{\r\n\tunsigned i;\r\n\tstatic unsigned char p;\r\n\tunsigned char c, d;\r\n\twclwin(); wgotoxy(30, d=0); wputs(\"Track Exclusion map\");\r\n\twgotoxy(10, 19);\r\n\twputs(\"\\x1B\\x18\\x19\\x1A=select, SPACE=toggle, F1=Help, F2=Toggle-ALL, ESC=exit\");\r\n\tfor(;;) {\r\n\t\tfor(i=0; i < MSEC; ++i) {\r\n\t\t\tc = Sskip[i];\r\n\t\t\tif(i == p) *W_OPEN = video[AR_MAIN];\r\n\t\t\twgotoxy((i/16)*5, (i%16)+2); wprintf(\"%3u\", i);\r\n\t\t\t*W_OPEN = video[AH_MAIN]; wputc(\" \\x19\\x18\\x12\"[c&3]);\r\n\t\t\t*W_OPEN = video[AT_MAIN]; }\r\n\t\tswitch(wgetc()) {\r\n\t\tcase '?':\r\n\t\tcase _K1: help(HEXCL);\tcontinue;\r\n\t\tcase _K2:\r\n\t\t\td = (d+1) & 3;\r\n\t\t\tfor(i=0; i < MSEC; ++i)\r\n\t\t\t\tSskip[i] = d;\r\n\t\t\tcontinue;\r\n\t\tcase _KUA: --p;\t\tcontinue;\r\n\t\tcase _KDA: ++p;\t\tcontinue;\r\n\t\tcase _KRA: p += 16;\tcontinue;\r\n\t\tcase _KLA: p -= 16; continue;\r\n\t\tcase ' ' : Sskip[p] = (Sskip[p] + 1) & 0x03;\tcontinue;\r\n\t\tcase 0x1B:\treturn; } }\r\n}\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tunsigned i, j;\r\n\tstatic unsigned char *main_prompt[] = {\r\n\t\t\"S)ettings\",\r\n\t\t\"R)ead disk  into file\",\r\n\t\t\"W)rite disk from file\",\r\n\t\t\"F)ormat disk\",\r\n\t\t\"E)rase disk\",\r\n\t\t\"A)lignment/test\",\r\n\t\t\"C)lean head\",\r\n\t\t\"T)est RPM\",\r\n\t\t\"X)clusion map\",\r\n\t\t\"\",\r\n\t\t\"F1  = Help\",\r\n\t\t\"ESC = exit\",\r\n\t\t0 };\r\n\tstatic unsigned char *scrub_prompt[] = {\r\n\t\t\"Make sure CYLINDERS matches drive\",\r\n\t\t\"\",\r\n\t\t\"Insert cleaning diskette\",\r\n\t\t\"\",\r\n\t\t\"Press: ENTER to proceed\",\r\n\t\t\"\\x07ESC  to cancel\",\r\n\t\t0 };\r\n\r\n\t// Determine video type\r\n\twopen(0, 0, 10, 10, 0); wclose();\r\n\tif(W_BASE == 0xB000)\t\t// Monochrome - switch attributes\r\n\t\tmemcpy(video, mvideo, sizeof(video));\r\n\r\n\t// Get default directory and process command line arguments\r\n\tgetcurrent();\r\n\tptr = \"$IMD\";\r\n\tcmdparm(\"r\");\r\n\r\n\tfor(i=1; i < argc; ++i) {\r\n\t\tptr = argv[i];\r\n\t\tcmdparm(\"rvq\"); }\r\n\r\n\t// Establish 32k DMA segment aligned on 32k boundary\r\n\tif(!(SEG = alloc_seg(4096)))\t\t// 64k segment\r\n\t\tabort(\"Out of memory\");\r\n\tSEG = (SEG + 0x7FF) & 0xF800;\t\t// Advance to nearest 32k boundary\r\n\r\n\t// Open windows & display startup messages\r\n\tswin = wopen(0, 0, 80, 2, (unsigned)video[AT_STAT]|WSAVE|WCOPEN);\r\n\twgotoxy(23, 1); wputs(\"** ImageDisk \"#VERSION\" / \"#__DATE__\" **\");\r\n\tpwin = wopen(0, 2, 80, 3, (unsigned)video[AT_STAT]|WSAVE|WCOPEN);\r\n\twgotoxy(13, 1); wputs(\"Copyright 2005-\"#CYEAR\" Dave Dunfield - All rights reserved.\");\r\n\tif(*Scale) wputs(Scale);\r\n\tmwin = wopen(0, 5, 80, 20, (unsigned)video[AT_MAIN]|WSAVE|WCOPEN|WWRAP|WSCROLL);\r\n\r\n\twcursor_off();\r\n\r\n\t// Build scale for display\r\n\tfor(i=0; i < 80; ++i) {\r\n\t\tif(!(i%5))\r\n\t\t\tj = (i%10) ? CFIVE : (i/10)+'0';\r\n\t\telse\r\n\t\t\tj = CONE;\r\n\t\tScale[i] = j; }\r\n\r\n\t// Take over floppy hardware interrupt\r\n\tasm {\r\n\t\tMOV\t\tAX,350Eh\t\t; Get vector 14 (FDC interrupt)\r\n\t\tINT\t\t21h\t\t\t\t; Ask DOS\r\n\t\tMOV\t\tDGRP:_FIseg,ES\t; Save segment\r\n\t\tMOV\t\tDGRP:_FIoff,BX\t; Save offset\r\n\t\tMOV\t\tDX,OFFSET FINT\t; New offset\r\n\t\tPUSH\tDS\r\n\t\tPUSH\tCS\r\n\t\tPOP\t\tDS\r\n\t\tMOV\t\tAX,250Eh\t\t; Set vector 14\r\n\t\tINT\t\t21h\t\t\t\t; Ask DOS\r\n\t\tPOP\t\tDS\r\n\t}\r\n\r\n\t// We return here in error/abort conditions\r\n\tptr = setjmp(xmain);\r\n\tif(!Xhelp)\t\t\t\t\t// Show help first time only\r\n\t\thelp(HINDEX);\r\n\r\ntop:\r\n\tdeselect_drive();\r\n\tif(ptr) {\t\t\t\t\t// Error message to display\r\n\t\twputc('\\n');\r\n\t\twcleol();\r\n\t\twputs(ptr);\r\n\t\twputs(\" - press ENTER for main menu\");\r\n\t\tptr = 0;\r\n\t\twhile(wgetc() != '\\n'); }\r\n\twclwin();\r\n\tprompt(main_prompt, 10);\r\n\tfor(i=0; Cprompt[i]; ++i)\t// Display current settings\r\n\t\tshow_config(i);\r\n\r\n\t// Prompt for and execute top-level command\r\nrecmd:\r\n\tswitch(toupper(wgetc())) {\r\n\tcase 'S' : config(); goto top;\r\n\tcase 'R' :\r\n\t\tmemset(buffer, 0, sizeof(buffer));\r\n\trdagain:\r\n\t\twclwin(); wputs(\"Read disk into file\");\r\n\t\tif(selectfile(\".IMD\", 255)) {\r\n\t\t\twclwin(); wprintf(\"Read into %s\", Directory);\r\n\t\t\tif(read_disk()) goto rdagain;\r\n\t\t\tptr = \"Read complete\"; }\r\n\t\tgoto top;\r\n\tcase 'W' :\r\n\t\twclwin();\r\n\t\tif(Dstep == 0x55)\r\n\t\t\terror(\"You MUST pick single/double step\");\r\n\t\twputs(\"Write disk from file\");\r\n\t\tif(selectfile(\".IMD\", 0)) {\r\n\t\t\twclwin(); wprintf(\"Write from %s\", Directory);\r\n\t\t\twrite_disk();\r\n\t\t\tptr = \"Write complete\"; }\r\n\t\tgoto top;\r\n\tcase 'F' :\r\n\t\tformat(255);\r\n\t\tgoto top;\r\n\tcase 'E' :\r\n\t\tformat(0);\r\n\t\tgoto top;\r\n\tcase 'A' : align();\t\t\t\tgoto top;\r\n\tcase 'C' :\r\n\t\twgotoxy(5, 0); wputs(\"Number of passes\");\r\n\t\tif((i = get_num(25, 0, 10, Cpass, 1, 9)) != -1) {\r\n\t\t\twprintf(\"%u\", Cpass = i);\r\n\t\t\tprompt(scrub_prompt, 5);\r\n\r\n\t\t\tpwait(\"CLEAN-HEADS\");\r\n\t\t\twclwin(); wputs(\"Cleaning disk heads, pass:\");\r\n\t\t\treset(); draw_scale();\r\n\t\t\tif(Dds == 0x55) Dds = 0;\r\n\t\t\tj = (Cylinders < 16) ? 2 : (Cylinders / 8);\r\n\t\t\tfor(Head = 0; Head < Cpass;) {\r\n\t\t\t\twprintf(\" %u\", ++Head);\r\n\t\t\t\tfor(i=0; i < Cylinders; i += j) {\r\n\t\t\t\t\tscrub(i+(j-1));\r\n\t\t\t\t\tscrub(i); }\r\n\t\t\t\tdraw_scale();\r\n\t\t\t\trecal(); } }\r\n\t\tgoto top;\r\n\tcase 'T' :\trpm();\t\t\t\tgoto top;\r\n\tcase 'X' :\tssmap();\t\t\tgoto top;\r\n\tcase '?' :\r\n\tcase _K1 :\thelp(HMAIN);\t\tgoto top;\r\n\tcase 0x1B:\r\n\t\tdeselect_drive();\r\n\t\tasm {\r\n\t\t\tMOV\t\tDX,DGRP:_FIoff\t; Get offset\r\n\t\t\tPUSH\tDS\t\t\t\t; Save DS\r\n\t\t\tMOV\t\tDS,DGRP:_FIseg\t; Get segment\r\n\t\t\tMOV\t\tAX,250Eh\t\t; Set vector\r\n\t\t\tINT\t\t21h\t\t\t\t; Ask DOS\r\n\t\t\tPOP\t\tDS\t\t\t\t; Restore DS\r\n\t\t\t}\r\n\t\twcloseall(0);\r\n\t\tasm {\r\n\t\t\tXOR\t\tAH,AH\t\t\t; 00 = Reset\r\n\t\t\tMOV\t\tDL,AH\t\t\t; Drive A\r\n\t\t\tINT\t\t13h\t\t\t\t; BIOS: Reset diskette\r\n\t\t}\r\n\t\treturn; }\r\n\tbeep(750, 200);\r\n\tgoto recmd;\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/IMDA.C",
    "content": "/*\r\n * ImageDisk Analyser\r\n *\r\n * Analyses a disk image and recommends drive/options to recreate.\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. It is being\r\n * provided for informational purposes only, and I provide no support for\r\n * it, technical or otherwise.\r\n *\r\n * Copyright 2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, for the purpose\r\n * of keeping a say in it's disposition however I encourage the use of ideas,\r\n * algorithms and code fragments contained herein to be used in the creation\r\n * of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include \"version.h\"\r\n\r\n#define\tB500\t62500\t\t// 500,000 / 8\r\n#define\tB300\t37500\t\t// 300,000 / 8\r\n#define\tB250\t31250\t\t// 200,000 / 8\r\n#define\tSOVH\t85\t\t\t// Guesstimate of sector overhead\r\n#define\tCOVH\t85\t\t\t// Guesstimate of cylinder overhead\r\n\r\nunsigned\r\n\tSsize,\t\t\t\t\t// Decoded sector size\r\n\tDsize,\t\t\t\t\t// Data size\r\n\tHsize,\t\t\t\t\t// Highest data size\r\n\tNtop;\t\t\t\t\t// Top of note list\r\nFILE\r\n\t*Fp;\t\t\t\t\t// General file pointer\r\nunsigned char\r\n\t*Ptr,\t\t\t\t\t// General pointer\r\n\t*Fptr,\t\t\t\t\t// Filename pointer\r\n\tNotes[8],\t\t\t\t// Notes\r\n\tFilename[65],\t\t\t// Input filename\r\n\tVerbose = 255,\t\t\t// Verbose output\r\n\t// Statistics\r\n\tModes,\t\t\t\t\t// Modes user\r\n\tHcyl,\t\t\t\t\t// Highest cylinder\r\n\tHhead,\t\t\t\t\t// Highest head\r\n\t// Data read from disk\r\n\tMode,\t\t\t\t\t// Track mode\r\n\tCyl,\t\t\t\t\t// Track cylinder\r\n\tHead,\t\t\t\t\t// Track head\r\n\tNsec,\t\t\t\t\t// Track #sectors\r\n\tSsiz,\t\t\t\t\t// Sector size\r\n\tNmap[256],\t\t\t\t// Sector Numbering map\r\n\tCmap[256],\t\t\t\t// Sector Cylinder map\r\n\tHmap[256],\t\t\t\t// Sector Head map\r\n\tBuffer[8192];\t\t\t// General buffer\r\n\r\nunsigned char Sig[] = { 'I', 'M', 'D' };\r\n\r\nunsigned char *Note_text[] = {\r\n\"40 track image will use only first 1/2 of 80-track drive.\\n\",\r\n\"77 track image likely from 8\\\" drive.\\n\",\r\n\"Should fit on 360rpm drive, 300rpm drive will leave long end gap.\\n\",\r\n\"\"\r\n};\r\n\r\nunsigned char Help[] = { \"Copyright \"#CYEAR\" Dave Dunfield - All rights reserved.\\n\\\r\n\\nUse: IMDA image[.IMD] [options]\\n\\n\\\r\nopts:\t/Q\t\t- Quiet: inhibit informational output\\n\" };\r\n\r\n// Drive descriptor flags\r\n#define\tD38\t\t0x0000\t// 3.5\" DD 80-track\r\n#define\tH38\t\t0x0001\t// 3.5\" HD 80-track\r\n#define\tD54\t\t0x0002\t// 5.25\" DD 40-track\r\n#define\tD58\t\t0x0003\t// 5.25\" DD 80-track\r\n#define\tH58\t\t0x0004\t// 5.25\" HD 80-track\r\n#define\tD8\t\t0x0005\t// 8\" 77-track\r\n#define\tDSTEP\t0x0010\t// Double-stepping\r\n#define\tT32\t\t0x0020\t// Translate 300->250\r\n#define\tT23\t\t0x0040\t// Translate 250->300\r\n#define\tNOT1\t0x0100\t// fits on 40 tracks\r\n#define\tNOT2\t0x0200\t// 77 track drive\r\n#define\tNOT3\t0x0400\t// fits on a 360\r\n\r\n// Display drive type and applicable options\r\nvoid Drive(unsigned f)\r\n{\r\n\tunsigned i, j;\r\n\r\n\tputc('\\n', stdout);\r\n\tswitch(f & 7) {\r\n\tcase 0 : printf(\" 3.5\\\" DD 80-track\");\tbreak;\r\n\tcase 1 : printf(\" 3.5\\\" HD 80-track\");\tbreak;\r\n\tcase 2 : printf(\" 5.25\\\" DD 40-track\");\tbreak;\r\n\tcase 3 : printf(\" 5.25\\\" QD 80-track\");\tbreak;\r\n\tcase 4 : printf(\" 5.25\\\" HD 80-track\");\tbreak;\r\n\tcase 5 : printf(\" 8\\\" 77-track\");\t\t\t}\r\n\tif(f & 0xFF00) {\r\n\t\tprintf(\"   NOTE:\", f);\r\n\t\tfor(i=1; i < 8; ++i) {\r\n\t\t\tif((0x80 << i) & f) {\r\n\t\t\t\tfor(j=0; j < Ntop; ++j) {\r\n\t\t\t\t\tif(Notes[j] == i)\r\n\t\t\t\t\t\tgoto oknote; }\r\n\t\t\t\tNotes[Ntop++] = i;\r\n\t\toknote:\tprintf(\" *%u\", j+1); } } }\r\n\r\n\tputc('\\n', stdout);\r\n\tprintf(\"   Double-step: %s\\n\", (f & DSTEP) ? \"ON\" : \"OFF\");\r\n\tif(f & T32) printf(\"   300 kbps -> 250 kbps\\n\");\r\n\tif(f & T23) printf(\"   250 kbps -> 300 kbps\\n\");\r\n}\r\n\r\n// Generate a filename with optional extension\r\nint filename(unsigned char *d, unsigned char *s, unsigned char *e)\r\n{\r\n\tunsigned char f;\r\n\tf = 0;\r\n\tfor(;;) switch(*d++ = toupper(*s++)) {\r\n\t\tcase '.' : f = 255;\t\t\t\tcontinue;\r\n\t\tcase ':' :\r\n\t\tcase '\\\\': f = 0;\tFptr = d;\tcontinue;\r\n\t\tcase 0 :\r\n\t\t\tif(!f)\r\n\t\t\t\tstrcpy(d-1, e);\r\n\t\t\treturn; }\r\n}\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tunsigned i, j, k;\r\n\r\n\tfputs(\"IMageDisk Analyzer \"#VERSION\" / \"#__DATE__\"\\n\", stdout);\r\n\r\n\t// Process command line\r\n\tfor(i=1; i < argc; ++i) {\r\n\t\tPtr = argv[i];\r\n\t\tswitch((toupper(*Ptr++)<<8) | toupper(*Ptr++)) {\r\n\t\tcase '-Q' :\r\n\t\tcase '/Q' : Verbose = 0;\t\tcontinue;\r\n\t\t} if(Fp)\r\n\t\t\tabort(Help);\r\n\t\tfilename(Fptr = Filename, argv[1], \".IMD\");\r\n\t\tFp = fopen(Filename, \"rvqb\"); }\r\n\r\n\tif(!Fp)\r\n\t\tabort(Help);\r\n\r\n\t// Skip & display IMD comment\r\n\tj = 0;\r\n\twhile((i = getc(Fp)) != 0x1A) {\r\n\t\tif(i == EOF)\r\n\t\t\tabort(\"EOF on input\\n\");\r\n\t\tif(j >= sizeof(Buffer))\r\n\t\t\tabort(\"Comment too large\\n\");\r\n\t\tBuffer[j++] = i; }\r\n\tBuffer[j] = 0;\r\n\tif(Verbose)\r\n\t\tfputs(Buffer, stdout);\r\n\r\n\t// Process track records\r\n\tfor(;;) {\r\n\t\t// Read in sector information\r\n\t\tif((Mode = getc(Fp)) == EOF)\r\n\t\t\tbreak;\r\n\t\tif(Mode > 0x05)\r\n\t\t\tabort(\"Bad MODE value\");\r\n\t\tif((Cyl = getc(Fp)) == EOF)\r\n\t\t\tabort(\"EOF on Cylinder\\n\");\r\n\t\tif((Head = getc(Fp)) == EOF)\r\n\t\t\tabort(\"EOF on Head\\n\");\r\n\t\tif((Nsec = getc(Fp)) == EOF)\r\n\t\t\tabort(\"EOF on #sectors\\n\");\r\n\t\tif((Ssiz = getc(Fp)) == EOF)\r\n\t\t\tabort(\"EOF on Ssize\\n\");\r\n\t\tif(Ssiz > 0x06)\r\n\t\t\tabort(\"Bad Ssize value\\n\");\r\n\t\tSsize = 0x80 << Ssiz;\r\n\t\tDsize = ((Ssize+SOVH) * Nsec) + COVH;\r\n\t\tif(fget(Nmap, Nsec, Fp) != Nsec)\t// Skip numbering map\r\n\t\t\tabort(\"EOF on SNmap\\n\");\r\n\t\tif(Head & 0x80) {\t\t\t\t\t// Skip cylinder map if present\r\n\t\t\tif(fget(Cmap, Nsec, Fp) != Nsec)\r\n\t\t\t\tabort(\"EOF in SCmap\\n\"); }\r\n\t\tif(Head & 0x40) {\t\t\t\t\t// Skip head map if present\r\n\t\t\tif(fget(Hmap, Nsec, Fp) != Nsec)\r\n\t\t\t\tabort(\"EOF in SHmap\\n\"); }\r\n\t\tfor(i=0; i < Nsec; ++i) {\t\t\t// Skip data records\r\n\t\t\tif(j = getc(Fp)) {\r\n\t\t\t\tk = ((j-1) & 1) ? 1 : Ssize;\r\n\t\t\t\tif(fget(Buffer, k, Fp) != k)\r\n\t\t\t\t\tabort(\"EOF in data\\n\"); } }\r\n\t\tModes |= 1 << (Mode % 3);\t\t\t// Keep all modes\r\n\t\tif(Cyl > Hcyl)\t\t\t\t\t\t// Track highest cylinder\r\n\t\t\tHcyl = Cyl;\r\n\t\tif((Head & 0x3F) > Hhead)\t\t\t// Track highest head\r\n\t\t\tHhead = Head & 0x3F;\r\n\t\tif(Dsize > Hsize)\t\t\t\t\t// Track highest data size\r\n\t\t\tHsize = Dsize;\r\n\t}\r\n\tfclose(Fp);\r\n\t++Hcyl;\r\n\tif(Verbose) {\t\t// Display summary\r\n\t\tprintf(\"Required cylinders: %u\\n\", Hcyl);\r\n\t\tprintf(\"Required heads    : %u\\n\", Hhead+1);\r\n\t\tprintf(\"Data rate         :\");\r\n\t\tif(Modes & 4) printf(\" 250kbps\");\r\n\t\tif(Modes & 2) printf(\" 300kbps\");\r\n\t\tif(Modes & 1) printf(\" 500kbps\");\r\n\t\tprintf(\"\\nEst. maximum track: %u bytes\\n\", Hsize); }\r\n\tswitch(Modes) {\r\n\tdefault: abort(\"Mixed data rates - unknown drive\\n\");\r\n\tcase 0x00: abort(\"Appears to contain no data\\n\");\r\n\tcase 0x04:\r\n\tcase 0x02:\r\n\tcase 0x01: }\r\n\r\n\t// Display drives and options that seem appropriate\r\n\tprintf(\"\\nPossible drives/options to write %s :\\n\", Fptr);\r\n\ti = (Hcyl <= 40) ? DSTEP : 0;\r\n\tswitch(Modes) {\r\n\tcase 0x01:\t// 500kbps\r\n\t\tj = (Hsize < (B500/6)) ? NOT3 : 0;\r\n\t\tk = (Hcyl == 77) ? NOT2 : 0;\r\n\t\tDrive(H38|j|k);\r\n\t\tif(Hsize < (B500/6)) {\r\n\t\t\tDrive(H58|k);\r\n\t\t\tif(Hcyl <= 77)\r\n\t\t\t\tDrive(D8); }\r\n\t\tbreak;\r\n\tcase 0x02:\t// 300kbps\r\n\t\tj = i ? NOT1 : 0;\r\n\t\tif(!i)\r\n\t\t\tDrive(D54|T32);\r\n\t\tDrive((D58|T32)|i);\r\n\t\tDrive(H58|i);\r\n\t\tDrive((D38|T32)|j);\r\n\t\tDrive((H38|T32)|j);\r\n\t\tbreak;\r\n\tcase 0x04:\t// 250kbps\r\n\t\tj = i ? NOT1 : 0;\r\n\t\tif(i)\r\n\t\t\tDrive(D54);\r\n\t\tDrive(D58|i);\r\n\t\tDrive((H58|i)|T23);\r\n\t\tDrive(D38|j);\r\n\t\tDrive(H38|j);\r\n\t}\r\n\tif(Ntop)\r\n\t\tputc('\\n', stdout);\r\n\tfor(i=0; i < Ntop; ++i) {\r\n\t\tprintf(\"*%u \", i+1);\r\n\t\tfputs(Note_text[Notes[i]-1], stdout); }\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/IMDU.C",
    "content": "/*\r\n * ImageDisk Utility\r\n *\r\n * This program performs a number of utility functions with .IMD files\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. It is being\r\n * provided for informational purposes only, and I provide no support for\r\n * it, technical or otherwise.\r\n *\r\n * Copyright 2005-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, for the purpose\r\n * of keeping a say in it's disposition however I encourage the use of ideas,\r\n * algorithms and code fragments contained herein to be used in the creation\r\n * of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include \"version.h\"\r\n\r\n#define\tTSIZE\t32768\t\t\t\t// Max size of track\r\n\r\n// Status index values\r\n#define\tST_TOTAL\t0\t\t\t\t// Total sector count\r\n#define\tST_COMP\t\t1\t\t\t\t// Number Compressed\r\n#define\tST_DAM\t\t2\t\t\t\t// Number Deleted\r\n#define\tST_BAD\t\t3\t\t\t\t// Number Bad\r\n#define\tST_UNAVAIL\t4\t\t\t\t// Number unavailable\r\n\r\nstruct TRACK {\r\n\tunsigned Mode,\t\t\t\t\t// Data rate/density\r\n\tunsigned Cyl,\t\t\t\t\t// Current cylinder\r\n\tunsigned Head,\t\t\t\t\t// Current head\r\n\tunsigned Nsec,\t\t\t\t\t// Number of sectors\r\n\tunsigned Size;\t\t\t\t\t// Sector size\r\n\tunsigned Tseg;\t\t\t\t\t// Text (data) segment\r\n\tunsigned char Hflag;\t\t\t// Extra bits embedded in Head\r\n\tunsigned char Smap[256];\t\t// Sector numbering map\r\n\tunsigned char Cmap[256];\t\t// Cylinder numbering map\r\n\tunsigned char Hmap[256];\t\t// Head numbering map\r\n\tunsigned char Sflag[256]; }\t\t// Sector type flags\r\n\t\tt1, t2, *AI;\r\n\r\nunsigned\r\n\tLmode,\t\t\t\t// Last track mode\r\n\tLnsec,\t\t\t\t// Last track number sectors\r\n\tLsize,\t\t\t\t// Last track sector size\r\n\tH0tracks,\t\t\t// Number of head-0 tracks\r\n\tH1tracks,\t\t\t// Number of head-1 tracks\r\n\tSTcount[5];\t\t\t// Statistics counters\r\n\r\nunsigned char\r\n\t*ptr,\t\t\t\t// General global pointer\r\n\t*Wfile,\t\t\t\t// File to write\r\n\t*Mfile,\t\t\t\t// File to merge\r\n\t*CIfile,\t\t\t// File to inject comments\r\n\t*CEfile,\t\t\t// File to extract comments\r\n\tRcomment,\t\t\t// Replace comment flag\r\n\tIoutput = 255,\t\t// IMD format output\r\n\tVerbose = 255,\t\t// Generate verbose output\r\n\tWflag = 255,\t\t// !warn if no outputput file\r\n\tXmode = 255,\t\t// Ignore mode differences\r\n\tDam = 255,\t\t\t// Deleted address marks\r\n\tBad = 255,\t\t\t// Convert bad sectors\r\n\tFill,\t\t\t\t// Value to fill missing sectors\r\n\tFflag,\t\t\t\t// Fill missing sectors\r\n\tCflag,\t\t\t\t// Compressed sector conversion\r\n\tYes,\t\t\t\t// Supress overwrite prompt\r\n\tDetail,\t\t\t\t// Display detail output\r\n\tIntl,\t\t\t\t// Interleave setting (0=Nochange, 255=BestGuess)\r\n\tTracks[256],\t\t// Track read flags\r\n\tLsmap[256],\t\t\t// Last sector map\r\n\tIndex[256],\t\t\t// Sector index map\r\n\tImap[256],\t\t\t// Interleave map\r\n\tSskip[256];\t\t\t// Skip (exclude) map\r\n\r\n// Mode (data rate) index to value conversion table\r\nunsigned Mtext[] = { 500, 300, 250 };\r\n\r\n// Encoded sector size to actual size conversion table\r\nunsigned xsize[] = { 128, 256, 512, 1024, 2048, 4096, 8192 };\r\n\r\n// Table for mode translation\r\nunsigned char Tmode[] = { 0, 1, 2, 3, 4, 5 };\r\n\r\nFILE\r\n\t*fp,\t\t\t// Input file\r\n\t*fpm,\t\t\t// Merge file\r\n\t*fpw;\t\t\t// Write (output) file\r\n\r\nunsigned char help[] = { \"Copyright 2005-\"#CYEAR\" Dave Dunfield - All rights reserved.\\n\\\r\n\\nUse: IMDU image [[merge-image] [output-image]] [options]\\n\\n\\\r\nopts:\t/B\t\t\t- output Binary image\\n\\\r\n\t/C\t\t\t- Compress \\\"all-same\\\" sectors\\n\\\r\n\t/D\t\t\t- display track/sector Detail\\n\\\r\n\t/E\t\t\t- Expand compressed sectors to full data\\n\\\r\n\t/M\t\t\t- ignore Mode difference in merge/compare\\n\\\r\n\t/NB\t\t\t- force Non-Bad data\\n\\\r\n\t/ND\t\t\t- force Non-Deleted data\\n\\\r\n\t/Q\t\t\t- Quiet: supress warnings\\n\\\r\n\t/Y\t\t\t- auto-Yes (no overwrite prompt)\\n\\\r\n\tAC=file[.TXT]\t\t- Append Comment from file\t[none]\\n\\\r\n\tEC=file[.TXT]\t\t- Extract Comment to file\t[none]\\n\\\r\n\tF=xx\t\t\t- missing sector Fill value\t[00]\\n\\\r\n\tIL=[1-99]\t\t- reInterLeave(blank=BestGuess)\t[As read]\\n\\\r\n\tRC=file[.TXT]\t\t- Replace Comment from file\t[none]\\n\\\r\n\tT2=250/300/500\t\t- 250khz Translate\t\t[250]\\n\\\r\n\tT3=250/300/500\t\t- 300khz Translate\t\t[300]\\n\\\r\n\tT5=250/300/500\t\t- 500khz Translate\t\t[500]\\n\\\r\n\tX=track[,to_track]\t- eXclude entire track(s)\t[None]\\n\\\r\n\tX0=track[,to_track]\t- eXclude track(s) side 0 only\t[None]\\n\\\r\n\tX1=track[,to_track]\t- eXclude track(s) side 1 only\t[None]\\n\" };\r\n\r\n/*\r\n * --- External segment oriented file I/O functions for IMDU ---\r\n */\r\nasm\t\" EXTRN\t?getc:NEAR, ?putc:NEAR\";\t// Alternate library access points\r\n\r\n/*\r\n * Get a block of data from a file\r\n */\r\nunsigned seg_get(seg, offset, size, fp) asm\r\n{\r\n\t\tMOV\t\tSI,4[BP]\t\t; Get FP\r\n\t\tMOV\t\tDI,8[BP]\t\t; Get BLOCK\r\n\t\tMOV\t\tES,10[BP]\t\t; Get segment\r\n\t\tXOR\t\tCX,CX\t\t\t; Zero count\r\nfget1:\tPUSH\tCX\t\t\t\t; Save count\r\n\t\tCALL\t?getc\t\t\t; Get a character\r\n\t\tPOP\t\tCX\t\t\t\t; Restore\r\n\t\tAND\t\tAH,AH\t\t\t; End of file?\r\n\t\tJNZ\t\tfget2\t\t\t; Yes, terminate early\r\n\t\tMOV\t\tES:[DI],AL\t\t; Write it\r\n\t\tINC\t\tDI\t\t\t\t; Advance to next\r\n\t\tINC\t\tCX\t\t\t\t; Reduce count\r\n\t\tCMP\t\tCX,6[BP]\t\t; At end?\r\n\t\tJB\t\tfget1\t\t\t; do them all\r\nfget2:\tMOV\t\tAX,CX\t\t\t; Return count\r\n}\r\n\r\n/*\r\n * Write a block of data to a file\r\n */\r\nunsigned seg_put(seg, offset, size, fp) asm\r\n{\r\n\t\tMOV\t\tSI,4[BP]\t\t; Get FP\r\n\t\tMOV\t\tDI,8[BP]\t\t; Get BLOCK\r\n\t\tMOV\t\tES,10[BP]\t\t; Get segment\r\n\t\tXOR\t\tCX,CX\t\t\t; Zero count\r\n\t\tXOR\t\tAH,AH\t\t\t; Zero high\r\nfput1:\tMOV\t\tAL,ES:[DI]\t\t; Get next char\r\n\t\tPUSH\tCX\t\t\t\t; Save count\r\n\t\tCALL\t?putc\t\t\t; Write the character\r\n\t\tPOP\t\tCX\t\t\t\t; Restore count\r\n\t\tAND\t\tAH,AH\t\t\t; Error?\r\n\t\tJNZ\t\tfput2\t\t\t; Yes, quit\r\n\t\tINC\t\tDI\t\t\t\t; Advance to next\r\n\t\tINC\t\tCX\t\t\t\t; Advance count\r\n\t\tCMP\t\tCX,6[BP]\t\t; At end?\r\n\t\tJB\t\tfput1\t\t\t; No, keep going\r\nfput2:\tMOV\t\tAX,CX\t\t\t; Return count\r\n}\r\n\r\n/*\r\n * Set external data to constant value\r\n */\r\nvoid seg_set(seg, offset, value, size) asm\r\n{\r\n\t\tMOV\t\tCX,4[BP]\t\t\t; Get size\r\n\t\tMOV\t\tAL,6[BP]\t\t\t; Get value\r\n\t\tMOV\t\tDI,8[BP]\t\t\t; Get offset\r\n\t\tMOV\t\tES,10[BP]\t\t\t; Get segment\r\n\tREP\tSTOSB\t\t\t\t\t\t; Store the data\r\n}\r\n\r\n/*\r\n * Copy one external block to another\r\n */\r\nvoid seg_copy(dseg, doffset, sseg, soffset, size) asm\r\n{\r\n\t\tPUSH\tDS\t\t\t\t\t; Save out segment\r\n\t\tMOV\t\tCX,4[BP]\t\t\t; Get size\r\n\t\tMOV\t\tSI,6[BP]\t\t\t; Get source offset\r\n\t\tMOV\t\tDI,10[BP]\t\t\t; Get dest offset\r\n\t\tMOV\t\tES,12[BP]\t\t\t; Get dest segment\r\n\t\tMOV\t\tDS,8[BP]\t\t\t; Get source segment\r\n\tREP\tMOVSB\r\n\t\tPOP\t\tDS\t\t\t\t\t; Restore segment\r\n}\r\n\r\n/*\r\n * Compare two external data blocks\r\n */\r\nint seg_cmp(seg1, off1, seg2, off2, size) asm\r\n{\r\n\t\tPUSH\tDS\t\t\t\t\t; Save DS\r\n\t\tMOV\t\tCX,4[BP]\t\t\t; Get size\r\n\t\tMOV\t\tSI,6[BP]\t\t\t; Get source offset\r\n\t\tMOV\t\tDI,10[BP]\t\t\t; Get dest offset\r\n\t\tMOV\t\tES,12[BP]\t\t\t; Get dest segment\r\n\t\tMOV\t\tDS,8[BP]\t\t\t; Get source segment\r\n\t\tMOV\t\tAH,255\t\t\t\t; Assume fail\r\nsegc1:\tMOV\t\tAL,ES:[DI]\t\t\t; Get from seg1\r\n\t\tCMP\t\tAL,[SI]\t\t\t\t; Match?\r\n\t\tJNZ\t\tsegc2\t\t\t\t; Fail\r\n\t\tINC\t\tDI\t\t\t\t\t; Next dest\r\n\t\tINC\t\tSI\t\t\t\t\t; Next source\r\n\t\tLOOP\tsegc1\t\t\t\t; Do them all\r\n\t\tXOR\t\tAX,AX\t\t\t\t; Zero result\r\nsegc2:\tPOP\t\tDS\t\t\t\t\t; Restore DS\r\n}\r\n\r\n/*\r\n * High-speed test for compressable sector (all bytes same value)\r\n */\r\nint issame(seg, offset, size) asm\r\n{\r\n\t\tMOV\t\tCX,4[BP]\t\t\t; Get sector size\r\n\t\tMOV\t\tBX,6[BP]\t\t\t; Get offset\r\n\t\tMOV\t\tES,8[BP]\t\t\t; Get segment\r\n\t\tMOV\t\tAL,ES:[BX]\t\t\t; Get byte1\r\n\t\tDEC\t\tCX\t\t\t\t\t; Backup count\r\niss1:\tINC\t\tBX\t\t\t\t\t; Next in source\r\n\t\tCMP\t\tAL,ES:[BX]\t\t\t; Does it match?\r\n\t\tJNZ\t\tiss2\t\t\t\t; No, report different\r\n\t\tLOOP\tiss1\t\t\t\t; Check entire sector\r\n\t\tMOV\t\tAL,255\t\t\t\t; Return !0\r\n\t\tPOP\t\tBP\t\t\t\t\t; Restore BP\r\n\t\tRET\r\niss2:\tXOR\t\tAX,AX\t\t\t\t; Return 0\r\n}\r\n\r\n/*\r\n * Display new cylinder/head if it has changed\r\n */\r\nvoid xch(void)\r\n{\r\n\tstatic unsigned C = -1, H;\r\n\tif((t1.Cyl != C) || (t1.Head != H))\r\n\t\tprintf(\"%2u/%u \", C = t1.Cyl, H = t1.Head);\r\n\telse\r\n\t\tprintf(\"     \");\r\n}\r\n\r\n/*\r\n * Display error message and exit\r\n */\r\nregister error(unsigned args)\r\n{\r\n\tunsigned char buffer[100];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\txch();\r\n\tfputs(buffer, stdout);\r\n\tif(fpm)\r\n\t\tfclose(fpm);\r\n\tif(fp)\r\n\t\tfclose(fp);\r\n\texit(-1);\r\n}\r\n\r\n/*\r\n * Display warning message\r\n */\r\nregister warn(unsigned args)\r\n{\r\n\tunsigned char buffer[100];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tif(Verbose) {\r\n\t\txch();\r\n\t\tfputs(buffer, stdout);\r\n\t\tputc('\\n', stdout); }\r\n}\r\n\r\n/*\r\n * Load a track from an image into memory\r\n */\r\nint load_track(struct TRACK *t, FILE *fp)\r\n{\r\n\tunsigned c, i, m, h, n, s;\r\n\tunsigned char *d;\r\n\tAI = t;\r\n\tif((m = getc(fp)) == EOF)\r\n\t\treturn 0;\r\n\tt->Mode = m;\r\n\tif((t->Cyl = getc(fp)) == EOF)\r\n\t\terror(\"EOF at Cylinder\");\r\n\tif((h = getc(fp)) == EOF)\r\n\t\terror(\"EOF at Head\");\r\n\tt->Head = h & 0x0F;\r\n\tt->Hflag = (h & 0xF0);\r\n\tif((t->Nsec = n = getc(fp)) == EOF)\r\n\t\terror(\"EOF at Nsec\");\r\n\tif((t->Size = s = getc(fp)) == EOF)\r\n\t\terror(\"EOF at Size\");\r\n\tif(m > 5) {\r\n\t\terror(\"Mode value %u out of range 0-5\\n\", m);\r\n\t\tt->Mode = 0; }\r\n\tif((h & 0x0F) > 1) {\r\n\t\terror(\"Head value %u out of range 0-1\\n\", h);\r\n\t\tt->Head = 0; }\r\n\tif(s > 6) {\r\n\t\terror(\"Size value %u out of range 0-6\\n\", s);\r\n\t\tt->Size = 0; }\r\n\r\n\ts = xsize[s];\r\n\r\n\tif(n) {\r\n\t\tif(fget(t->Smap, n, fp) != n)\r\n\t\t\terror(\"EOF in Sector Map\");\r\n\r\n\t\tif(h & 0x80) {\r\n\t\t\tif(fget(t->Cmap, n, fp) != n)\r\n\t\t\t\terror(\"EOF in Cylinder Map\"); }\r\n\t\telse\r\n\t\t\tmemset(t->Cmap, t->Cyl, n);\r\n\r\n\t\tif(h & 0x40) {\r\n\t\t\tif(fget(t->Hmap, n, fp) != n)\r\n\t\t\t\terror(\"EOF in Head Map\"); }\r\n\t\telse\r\n\t\t\tmemset(t->Hmap, h, n); }\r\n\r\n\tif((n*s) > TSIZE)\r\n\t\terror(\"Data block two large\");\r\n\r\n\t// Decode sector data blocks\r\n\td = 0;\r\n\tfor(i=0; i < n; ++i) {\r\n\t\tswitch(c = getc(fp)) {\r\n\t\tcase EOF: error(\"EOF at sector %u/%u flag\", i, t->Smap[i]);\r\n\t\tcase 0 :\t\t// Missing data\r\n\t\t\tseg_set(t->Tseg, d, Fill, s);\r\n\t\t\tm = 255;\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tm = 0;\r\n\t\t\tif(--c & 0x01) {\t\t// Compressed\r\n\t\t\t\tm |= 1;\r\n\t\t\t\tif((h = getc(fp)) == EOF)\r\n\t\t\t\t\terror(\"EOF in sector %u/%u comress data\", i, t->Smap[i]);\r\n\t\t\t\tseg_set(t->Tseg, d, h, s); }\r\n\t\t\telse {\t\t\t\t// Normal\r\n\t\t\t\tif(seg_get(t->Tseg, d, s, fp) != s)\r\n\t\t\t\t\terror(\"EOF in sector %u/%u data\", i, t->Smap[i]); }\r\n\t\t\tif(c & 0x02) {\t\t// Deleted data\r\n\t\t\t\tif(!Dam) m |= 2; }\r\n\t\t\tif(c & 0x04) {\r\n\t\t\t\tif(Bad) m |= 4; } }\r\n\t\tt->Sflag[i] = m+1;\r\n\t\td += s; }\r\n\treturn 255;\r\n}\r\n\r\n/*\r\n * Reorder the sectors to the requested interleave.\r\n * If necessary, calculate optimal interleave.\r\n */\r\nvoid interleave(struct TRACK *t)\r\n{\r\n\tunsigned i, j, k, n;\r\n\tunsigned char D, E, F, G, Slist[256], Sbuf[256];\r\n\tunsigned char map[256];\r\n\r\n\t// First sort sector numbering map to obtain a\r\n\t// sequential list of sectors\r\n\tmemcpy(Slist, t->Smap, n = t->Nsec);\r\n\r\n\tfor(i=0; i < n; ++i)\r\n\t\tmap[i] = i;\r\n\tfor(i=0; i < n; ++i) {\r\n\t\tD = Slist[i];\r\n\t\tF = map[i];\r\n\t\tfor(j=i+1; j < n; ++j) {\r\n\t\t\tE = Slist[j];\r\n\t\t\tif(E < D) {\r\n\t\t\t\tG = map[j];\r\n\t\t\t\tSlist[j] = D;\r\n\t\t\t\tSlist[i] = D = E;\r\n\t\t\t\tmap[j] = F;\r\n\t\t\t\tmap[i] = F = G; } } }\r\n\tif(Intl == 255) {\t\t// Best guess - calculate interleave\r\n\t\t// Scan sector map to determine interleave occurances\r\n\t\tmemset(Sbuf, 0, n);\r\n\t\tfor(i=j=k=0; i < n; ++i) {\r\n\t\t\tD = Slist[i];\r\n\t\t\tE = Slist[(i+1) % n];\r\n\t\t\twhile(t->Smap[j] != D)\r\n\t\t\t\tj = (j + 1) % n;\r\n\t\t\twhile(t->Smap[k] != E)\r\n\t\t\t\tk = (k + 1) % n;\r\n\t\t\tE = (k >= j) ? k-j : n-(j-k);\r\n\t\t\t++Sbuf[E]; }\r\n\r\n\t\t// Locate best interleave value\r\n\t\tD = k = 0;\r\n\t\tfor(i=0; i < n; ++i) {\r\n\t\t\tif(Sbuf[i] > D) {\r\n\t\t\t\tk = i;\r\n\t\t\t\tD = Sbuf[i]; } } }\r\n\telse\r\n\t\tk = Intl;\r\n\r\n\t// Regenerate the Sector Numbering Map using\r\n\t// the sector list and requested interleave\r\n\tmemset(Sbuf, 0, n);\r\n\tfor(i=j=0; i < n; ++i) {\r\n\t\twhile(Sbuf[j])\r\n\t\t\tj = (j + 1) % n;\r\n\t\tImap[j] = map[i];\r\n\t\tSbuf[j] = 255;\r\n\t\tj = (j + k) % n; }\r\n}\r\n\r\n/*\r\n * Update individual map value with interleave\r\n */\r\nvoid inter_update(unsigned char map[], unsigned n)\r\n{\r\n\tunsigned i;\r\n\tunsigned char temp[256];\r\n\tmemcpy(temp, map, n);\r\n\tfor(i=0; i < n; ++i)\r\n\t\tmap[i] = temp[Imap[i]];\r\n}\r\n\r\n/*\r\n * Write track from memory to output file\r\n */\r\nvoid write_track(struct TRACK *t, FILE *fp)\r\n{\r\n\tunsigned i, j, n, s;\r\n\tunsigned char f;\r\n\r\n\t// Don't write excluded tracks\r\n\tif(f = Sskip[t->Cyl]) {\r\n\t\tif((t->Head ? 2 : 1) & f)\r\n\t\t\treturn; }\r\n\r\n\t// Build index table to access sector data\r\n\tn = t->Nsec;\r\n\ts = xsize[t->Size];\r\n\tfor(i=j=0; i < n; ++i) {\r\n\t\tIndex[i] = j >> 7;\r\n\t\tj += s; }\r\n\r\n\t// Adjust interleave according to parameters\r\n\tif(Intl) {\r\n\t\tinterleave(t);\r\n\t\tinter_update(t->Smap, n);\r\n\t\tinter_update(t->Sflag, n);\r\n\t\tif(t->Hflag & 0x80)\r\n\t\t\tinter_update(t->Cmap, n);\r\n\t\tif(t->Hflag & 0x40)\r\n\t\t\tinter_update(t->Hmap, n);\r\n\t\tinter_update(Index, n); }\r\n\r\n\t// If Binary output - write data only\r\n\tif(!Ioutput) {\r\n\t\tfor(i=0; i < n; ++i)\r\n\t\t\tseg_put(t->Tseg, Index[i]<<7, s, fp);\r\n\t\treturn; }\r\n\r\n\t// Output track header\r\n\tputc(Tmode[t->Mode], fp);\r\n\tputc(t->Cyl, fp);\r\n\tputc(t->Head | t->Hflag, fp);\r\n\tputc(n, fp);\r\n\tputc(t->Size, fp);\r\n\tif(n) {\r\n\t\tfput(t->Smap, n, fp);\r\n\t\tif(t->Hflag & 0x80)\r\n\t\t\tfput(t->Cmap, n, fp);\r\n\t\tif(t->Hflag & 0x40)\r\n\t\t\tfput(t->Hmap, n, fp); }\r\n\r\n\t// Output sector data\r\n\tfor(i=0; i < n; ++i) {\r\n\t\tj = Index[i] << 7;\r\n\t\tif(f = t->Sflag[i])\t\t// Data available\r\n\t\t\t--f;\r\n\t\telse {\r\n\t\t\tif(!Fflag) {\t\t// No sector data\r\n\t\t\t\tputc(0, fp);\r\n\t\t\t\tcontinue; } }\r\n\t\tif(f & 0x01) {\t\t\t// Compressed\r\n\t\t\tif(Cflag & 0xF0)\r\n\t\t\t\tf &= ~1; }\r\n\t\telse if(Cflag & 0x0F) {\t// Not compressed\r\n\t\t\tif(issame(t->Tseg, j, s))\r\n\t\t\t\tf |= 1; }\r\n\t\tputc(f+1, fp);\r\n\t\tif(f & 1)\r\n\t\t\tputc(peek(t->Tseg, j), fp);\r\n\t\telse\r\n\t\t\tseg_put(t->Tseg, j, s, fp); }\r\n}\r\n\r\n/*\r\n * Update statistics counters\r\n */\r\nvoid update_stats(struct TRACK *t)\r\n{\r\n\tunsigned i, b;\r\n\tif(t->Head)\r\n\t\t++H1tracks;\r\n\telse\r\n\t\t++H0tracks;\r\n\tfor(i=0; i < t->Nsec; ++i) {\r\n\t\t++STcount[ST_TOTAL];\t\t\t\t// Total sectors\r\n\t\tif(b = t->Sflag[i]) {\r\n\t\t\t--b;\r\n\t\t\tif(b & 1) ++STcount[ST_COMP];\t// Compressed\r\n\t\t\tif(b & 2) ++STcount[ST_DAM];\t// Deleted\r\n\t\t\tif(b & 4) ++STcount[ST_BAD]; }\t// Bad\r\n\t\telse\r\n\t\t\t++STcount[ST_UNAVAIL]; }\t\t// Unavail\r\n}\r\n\r\n/*\r\n * Parse a filename and append extension if none supplied\r\n */\r\nvoid filename(unsigned char *name, unsigned char *ext)\r\n{\r\n\tunsigned char d, *p;\r\n\tp = Lsmap;\r\nrd:\td = 255;\r\n\tfor(;;) switch(*p++ = *name++) {\r\n\t\tcase 0 :\r\n\t\t\tif(d)\r\n\t\t\t\tstrcpy(p-1, ext);\r\n\t\t\treturn;\r\n\t\tcase ':' :\r\n\t\tcase '\\\\':\tgoto rd;\r\n\t\tcase '.' :\td = 0;\t}\r\n}\r\n\r\n/*\r\n * Test for additional command option value (comma separated)\r\n */\r\nint tnext(void)\r\n{\r\n\tif(*ptr == ',') {\r\n\t\t++ptr;\r\n\t\treturn 255; }\r\n\tif(*ptr)\r\n\t\terror(\"Syntax error\");\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Obtain a numeric value from command input\r\n */\r\nunsigned number(unsigned base, unsigned low, unsigned high)\r\n{\r\n\tunsigned c, v;\r\n\tunsigned char f;\r\n\tv = f = 0;\r\n\tfor(;;) {\r\n\t\tif(isdigit(c = *ptr))\r\n\t\t\tc -= '0';\r\n\t\telse if((c >= 'A') && (c <= 'F'))\r\n\t\t\tc -= ('A'-10);\r\n\t\telse if((c >= 'a') && (c <= 'f'))\r\n\t\t\tc -= ('a'-10);\r\n\t\telse switch(c) {\r\n\t\t\tcase 0 :\r\n\t\t\tcase ',':\r\n\t\t\t\tif(f) {\r\n\t\t\t\t\tif((v < low) || (v > high))\r\n\t\t\t\t\t\terror(((base == 16) ?\r\n\t\t\t\t\t\t\t\"Value (%x) out of range: %x-%x\\n\" :\r\n\t\t\t\t\t\t\t\"Value (%u) out of range: %u-%u\\n\" ),\r\n\t\t\t\t\t\t\tv, low, high);\r\n\t\t\t\t\treturn v; }\r\n\t\t\tdefault: error(\"Bad number\"); }\r\n\t\tif(c >= base)\r\n\t\t\terror(\"Bad numeric value\");\r\n\t\tf = 255;\r\n\t\tv = (v * base) + c;\r\n\t\t++ptr; }\r\n}\r\n\r\n/*\r\n * Validate track data * insert from merge\r\n */\r\nvoid check_track(void)\r\n{\r\n\tunsigned i, x, m, c, h, h1, n, s;\r\n\tm = t1.Mode;\r\n\tc = t1.Cyl;\r\n\th = t1.Head;\r\n\tn = t1.Nsec;\r\n\ts = xsize[t1.Size];\r\n\r\n\tif(t2.Cyl >= c) {\r\n\t\tif((t2.Cyl > c) || (t2.Head > h)) {\r\n//printf(\"Rewind\\n\");\r\n\t\t\trewind(fpm);\r\n\t\t\twhile((x = getc(fpm)) != 0x1A) {\r\n\t\t\t\tif(x == EOF) {\r\n\t\t\t\t\twarn(\"EOF in merge comment\");\r\n\t\t\t\t\treturn; } }\r\n\t\t\tif(!load_track(t2, fpm)) {\r\n\t\t\t\twarn(\"No tracks in merge file\");\r\n\t\t\t\treturn; } } }\r\n\r\n\twhile((t2.Cyl != c) || (t2.Head != h)) {\r\n\t\th1 = 1 << t2.Head;\r\n//printf(\"%u %u/%u %02x\\n\", c, t2.Cyl, t2.Head, Tracks[t2.Cyl]);\r\n\t\tif(!(Tracks[t2.Cyl] & h1)) {\r\n\t\t\tif((t2.Cyl < c) || ((t2.Cyl == c) && (t2.Head < h))) {\r\n\t\t\t\twarn(\"Adding track %u/%u from mergefile\", t2.Cyl, t2.Head);\r\n\t\t\t\tTracks[t2.Cyl] |= h1;\r\n\t\t\t\tupdate_stats(t2);\r\n\t\t\t\tif(fpw)\r\n\t\t\t\t\twrite_track(t2, fpw); } }\r\n\t\tif(!load_track(t2, fpm)) {\r\n\t\t\twarn(\"Track not found in merge file\");\r\n\t\t\treturn; } }\r\n\r\n\tif((t2.Mode != m) && Xmode) {\r\n\t\twarn(\"Incompatible track mode\");\r\n\t\treturn; }\r\n\tif(t2.Size != t1.Size) {\r\n\t\twarn(\"Incompatible sector size\");\r\n\t\treturn; }\r\n\r\n\t// Check for compatible data in merge file\r\n\tfor(i=0; i < n; ++i)\r\n\t\tcheck_sector(i);\r\n\r\n\t// Scan track and insert any missing sectors\r\n\tfor(i=0; i < t2.Nsec; ++i) {\r\n\t\tc = t2.Smap[i];\r\n\t\tfor(x=0; x < t1.Nsec; ++x) {\r\n\t\t\tif(t1.Smap[x] == c)\r\n\t\t\t\tgoto secfound; }\r\n\t\t// Sector to add\r\n\t\twarn(\"Adding sector %u/%u\", n, c);\r\n\t\tt1.Smap[n] = c;\r\n\t\tt1.Cmap[n] = t2.Cmap[i];\r\n\t\tt1.Hmap[n] = t2.Hmap[i];\r\n\t\tt1.Sflag[n] = t2.Sflag[i];\r\n\t\tseg_copy(t1.Tseg, n*s, t2.Tseg, i*s, s);\r\n\t\tt1.Nsec = ++n;\r\n\tsecfound: }\r\n}\r\n\r\n/*\r\n * Check an individual sector from input/merge files\r\n */\r\nint check_sector(unsigned i)\r\n{\r\n\tunsigned s, j, si, f, f1, f2;\r\n\r\n\ts = t1.Smap[i];\r\n\tfor(j=0; j < t2.Nsec; ++j) {\r\n\t\tif(t2.Smap[j] == s)\r\n\t\t\tgoto secok; }\r\n\twarn(\"Sector %u not found in merge image\", s);\r\n\treturn 0;\r\n\r\nsecok:\t// Sector was found\r\n\tsi = xsize[t1.Size];\r\n\tf2 = t2.Sflag[j];\r\n\tif(!(f1 = t1.Sflag[i])) {\r\n\t\tif(f2) {\r\n\t\t\twarn(\"Filling in sector %u/%u\", i, s);\r\n\t\t\tt1.Sflag[i] = f2;\r\n\t\t\tseg_copy(t1.Tseg, i*si, t2.Tseg, j*si, si);\r\n\t\t\treturn 255; }\r\n\t\twarn(\"Sector %u/%u data missing in merge image\", i, s);\r\n\t\treturn 0; }\r\n\r\n\t// We have sector data\r\n\tif(!f2)\t\t\t\t\t// No merge sector data\r\n\t\treturn 0;\r\n\t--f1;\r\n\t--f2;\r\n\tf = f1 ^ f2;\r\n\tif(f & 2)\r\n\t\twarn(\"Deleted data status differs: %u %u\", i, j);\r\n\tif(f & 4)\r\n\t\twarn(\"Bad sector status differs: %u %u\", i, j);\r\n\tif(seg_cmp(t1.Tseg, i*si, t2.Tseg, j*si, si)) {\r\n\t\twarn(\"Merge data differs from orignal %u %u\", i, j); }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tint c;\r\n\tunsigned i, s, t;\r\n\tunsigned char f;\r\n\tstatic *st_names[] = { \"Compressed\", \"Deleted\", \"Bad\", \"Unavail\" };\r\n\r\n\tfputs(\"IMageDisk Utility \"#VERSION\" / \"#__DATE__\"\\n\", stdout);\r\n\r\n\t// Process command line arguments\r\n\tfor(i=1; i < argc; ++i) {\r\n\t\tptr = argv[i];\r\n\t\tswitch(s = (toupper(*ptr++) << 8) | toupper(*ptr++)) {\r\n\t\tcase '-B' :\r\n\t\tcase '/B' : Ioutput = Wflag = 0; \t\tcontinue;\r\n\t\tcase '-D' :\r\n\t\tcase '/D' : Detail = 255;\t\t\t\tcontinue;\r\n\t\tcase '-Q' :\r\n\t\tcase '/Q' : Verbose = 0;\t\t\t\tcontinue;\r\n\t\tcase '-Y' :\r\n\t\tcase '/Y' : Yes = 255;\t\t\t\t\tcontinue;\r\n\t\tcase '-C' :\r\n\t\tcase '/C' : Cflag = 0x0F; Wflag = 0;\tcontinue;\r\n\t\tcase '-E' :\r\n\t\tcase '/E' : Cflag = 0xF0; Wflag = 0;\tcontinue;\r\n\t\tcase '-M' :\r\n\t\tcase '/M' : Xmode = 0;\t\t\t\t\tcontinue;\r\n\t\tcase '-N' :\r\n\t\tcase '/N' :\tswitch(toupper(*ptr)) {\r\n\t\t\tcase 'D' : Dam = Wflag = 0;\t\t\tcontinue;\r\n\t\t\tcase 'B' : Bad = Wflag = 0; }\t\tcontinue;\r\n\t\t\tgoto xhelp;\r\n\t\tcase 'F=' : Fill = number(16, Wflag = 0, 255);\r\n\t\t\t\t\tFflag = 255;\t\t\t\tcontinue;\r\n\t\tcase 'X=' :\tf = 3;\r\n\t\tdoexc:\r\n\t\t\tc = s = number(10, Wflag = 0, 255);\r\n\t\t\tif(tnext())\r\n\t\t\t\tc = number(10, 0, 255);\r\n\t\t\twhile(s <= c)\r\n\t\t\t\tSskip[s++] |= f;\r\n\t\t\tcontinue;\r\n\t\t} if(*ptr++ == '=') switch(s) {\r\n\t\tcase 'RC' : Rcomment = 255;\r\n\t\tcase 'AC' : CIfile = ptr;\t\t\t\tcontinue;\r\n\t\tcase 'EC' : CEfile = ptr;\t\t\t\tcontinue;\r\n\t\tcase 'X0' : f = 1;\t\t\t\t\t\tgoto doexc;\r\n\t\tcase 'X1' : f = 2;\t\t\t\t\t\tgoto doexc;\r\n\t\tcase 'IL' : Intl = *ptr ? number(10, 1, 99) : 255;\r\n\t\t\t\t\tWflag = 0;\t\t\t\t\tcontinue;\r\n\t\tcase 'T5' :\ts = 0;\t\t\t\t\t\tgoto dotran;\r\n\t\tcase 'T3' : s = 1;\t\t\t\t\t\tgoto dotran;\r\n\t\tcase 'T2' : s = 3;\r\n\t\tdotran: switch(number(10, Wflag = 0, 65535)) {\r\n\t\t\tdefault: goto xhelp;\r\n\t\t\tcase 500 : c = 0;\t\tbreak;\r\n\t\t\tcase 300 : c = 1;\t\tbreak;\r\n\t\t\tcase 250 : c = 2; }\r\n\t\t\tTmode[s] = c;\r\n\t\t\tTmode[s+3] = c+3;\r\n\t\t\tcontinue; }\r\n\t\tif(!fp) {\t\t\t\t\t\t\t\t\t\t\t// 1st = Input\r\n\t\t\tfilename(ptr-3, \".IMD\");\r\n\t\t\tfp = fopen(Lsmap, \"rvqb\");\r\n\t\t\tcontinue; }\r\n\t\tif(!Mfile) { Mfile = ptr-3;\t\t\t\tcontinue; }\t// 2nd = Merge\r\n\t\tif(!Wfile) { Wfile = ptr-3; \t\t\tcontinue; }\t// 3rd = Output\r\n\t\txhelp: abort(help); }\r\n\r\n\tif(!fp) goto xhelp;\t\t\t\t// No input file - issue help/exit\r\n\r\n\t// Allocate 2 32k segments for track data\r\n\tif(!(s = alloc_seg(4096)))\r\n\t\tabort(\"Out of memory\");\r\n\tt2.Tseg = (t1.Tseg = s) + 2048;\r\n\r\n\t// Read and display input file comment, saving it to segment\r\n\tt = 0;\r\n\twhile((c = getc(fp)) != 0x1A) {\r\n\t\tif(c == EOF)\r\n\t\t\tabort(\"EOF in comment\");\r\n\t\tputc(c, stdout);\r\n\t\tpoke(s, t++, c); }\r\n\r\n\t// If extracting comment, retrieve from segment and write to file\r\n\tif(CEfile) {\r\n\t\tfilename(CEfile, \".TXT\");\r\n\t\tfpw = fopen(Lsmap, \"wvq\");\r\n\t\tfor(i=0; i < t; ++i)\r\n\t\t\tputc(peek(s, i), fpw);\r\n\t\tfclose(fpw); }\r\n\r\n\tif(Rcomment)\t// Replacing - reset segment top\r\n\t\tt = 0;\r\n\r\n\t// If inserting comment - append to segment\r\n\tif(CIfile) {\r\n\t\tWflag = 0;\r\n\t\tfilename(CIfile, \".TXT\");\r\n\t\tfpw = fopen(Lsmap, \"rvqb\");\r\n\t\twhile((c = getc(fpw)) != EOF)\r\n\t\t\tpoke(s, t++, c);\r\n\t\tfclose(fpw); }\r\n\tfpw = 0;\r\n\r\n\t// 2nd filename (Merge) is actually output if no 3rd file and\r\n\t// other options indicate we are convertng data\r\n\tif(Mfile) {\r\n\t\tif(Wfile || Wflag) {\r\n\t\t\tfilename(Mfile, \".IMD\");\r\n\t\t\tfpm = fopen(Lsmap, \"rvqb\"); }\r\n\t\telse\r\n\t\t\tWfile = Mfile; }\r\n\r\n\tif(Wfile) {\t\t\t\t\t\t// We are writing output\r\n\t\tif(!(Ioutput | Intl)) {\t\t// Binary output with no IL=\r\n\t\t\tIntl = 1;\r\n\t\t\tif(Verbose)\r\n\t\t\t\tprintf(\"Assuming 1:1 for Binary output\\n\"); }\r\n\t\tfilename(Wfile, Ioutput ? \".IMD\" : \".BIN\");\r\n\t\t// Test for file already existing and prompt for overwrite\r\n\t\tif(!Yes) if(fpw = fopen(Lsmap, \"rb\")) {\r\n\t\t\tprintf(\"%s already exists - proceed(Y/N)?\", Lsmap);\r\n\t\t\txxx: switch(kbget()) {\r\n\t\t\t\tdefault: goto xxx;\r\n\t\t\t\tcase 0x1B:\r\n\t\t\t\tcase 0x03:\r\n\t\t\t\tcase 'n' :\r\n\t\t\t\tcase 'N' : printf(\"N\\n\"); return;\r\n\t\t\t\tcase 'y' :\r\n\t\t\t\tcase 'Y' : printf(\"Y\\n\"); }\r\n\t\t\tfclose(fpw); }\r\n\t\tfpw = fopen(Lsmap, \"wvqb\"); }\r\n\telse {\t\t// No output file specified\r\n\t\tif(!Wflag)\t\t// Error if we are converting\r\n\t\t\tabort(\"No output file.\");\r\n\t\tif(Verbose && fpm)\r\n\t\t\tprintf(\"No output file - compare only.\\n\"); }\r\n\r\n\t// If writing a .IMD file, output the comment (saved in segment)\r\n\tif(Ioutput && fpw) {\r\n\t\tfor(i=0; i < t; ++i)\r\n\t\t\tputc(peek(s, i), fpw);\r\n\t\tputc(0x1A, fpw); }\r\n\r\n\tt2.Cyl = t2.Head = -1;\r\n\r\n\t// If merging, build track map for input and skip merge comment\r\n\tif(fpm) {\r\n\t\twhile(load_track(t1, fp)) {\r\n\t\t\tTracks[t1.Cyl] |= (1 << t1.Head); }\r\n\t\trewind(fp);\r\n\t\twhile((c = getc(fp)) != 0x1A) {\r\n\t\t\tif(c == EOF)\r\n\t\t\t\tabort(\"EOF in comment\"); } }\r\n\r\n\t// Process input file & compare/merge\r\n\tf = 255;\r\n\twhile(load_track(t1, fp)) {\r\n\t\tif(fpm)\r\n\t\t\tcheck_track();\r\n\t\tupdate_stats(t1);\r\n\r\n\t\ts = xsize[t1.Size];\r\n\t\tif((t1.Mode != Lmode) || (t1.Nsec != Lnsec) || (t1.Size != Lsize))\r\n\t\t\tf = 255;\r\n\t\tif(f) {\r\n\t\t\txch();\r\n\t\t\tif(!t1.Nsec) {\r\n\t\t\t\tprintf(\"No data\\n\");\r\n\t\t\t\tf = 0;\r\n\t\t\t\tcontinue; }\r\n\t\t\tprintf(\"%u kbps %cD  %ux%u\\n\",\r\n\t\t\t\tMtext[(Lmode = t1.Mode) % 3],\r\n\t\t\t\t(Lmode > 2) ? 'D' : 'S',\r\n\t\t\t\tLnsec = t1.Nsec, xsize[Lsize = t1.Size]); }\r\n\t\tif(f || memcmp(t1.Smap, Lsmap, sizeof(Lsmap))) {\r\n\t\t\tf = 255;\r\n\t\t\tmemcpy(Lsmap, t1.Smap, sizeof(Lsmap));\r\n\t\t\tif(Detail) {\r\n\t\t\t\txch();\r\n\t\t\t\tfor(i=0; i < t1.Nsec; ++i) {\r\n\t\t\t\t\tif(t1.Nsec < 19)\r\n\t\t\t\t\t\tputc(' ', stdout);\r\n\t\t\t\t\tprintf(\"%-3u\", t1.Smap[i]); }\r\n\t\t\t\tputc('\\n', stdout); } }\r\n\t\tif(Detail) {\t\t// Display detail records\r\n\t\t\tif(t1.Hflag & 0x80) {\r\n\t\t\t\tprintf(\" CL: \");\r\n\t\t\t\tfor(i=0; i < t1.Nsec; ++i) {\r\n\t\t\t\t\tif(t1.Nsec < 19)\r\n\t\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t\tprintf(\"%-3u\", t1.Cmap[i]); }\r\n\t\t\t\tprintf(\"\\n\"); }\r\n\t\t\tif(t1.Hflag & 0x40) {\r\n\t\t\t\tprintf(\" HD: \");\r\n\t\t\t\tfor(i=0; i < t1.Nsec; ++i) {\r\n\t\t\t\t\tif(t1.Nsec < 19)\r\n\t\t\t\t\t\tprintf(\" \");\r\n\t\t\t\t\tprintf(\"%-3u\", t1.Hmap[i]); }\r\n\t\t\t\tprintf(\"\\n\"); }\r\n\t\t\txch();\r\n\t\t\tfor(i=0; i < t1.Nsec; ++i) {\r\n\t\t\t\tif(t1.Nsec < 19)\r\n\t\t\t\t\tprintf(\" \");\r\n\t\t\t\tif(!(f = t1.Sflag[i])) {\r\n\t\t\t\t\tprintf(\"U  \");\r\n\t\t\t\t\tcontinue; }\r\n\t\t\t\t--f;\r\n\t\t\t\tc = (f & 4) ? 'B' : 'D';\r\n\t\t\t\tif(f & 0x20) c += ('a'-'A');\r\n\t\t\t\tif(f & 1)\r\n\t\t\t\t\tprintf(\"%c%02x\", c, peek(t1.Tseg, i*s));\r\n\t\t\t\telse\r\n\t\t\t\t\tprintf(\"%c  \", c); }\r\n\t\t\tprintf(\"\\n\"); }\r\n\t\tf = 0;\r\n\t\tif(fpw)\r\n\t\t\twrite_track(t1, fpw); }\r\n\r\n\t// Add extra tracks (beyond end) from merge file\r\n\tif(fpm) {\r\n\t\trewind(fpm);\r\n\t\twhile((c = getc(fpm)) != 0x1A) {\r\n\t\t\tif(c == EOF) {\r\n\t\t\t\twarn(\"EOF in merge comment\");\r\n\t\t\t\treturn; } }\r\n\t\twhile(load_track(t2, fpm)) {\r\n\t\t\tif(!(Tracks[t2.Cyl] & (1 << t2.Head))) {\r\n\t\t\t\twarn(\"Adding track %u/%u from mergefile\", t2.Cyl, t2.Head);\r\n\t\t\t\tupdate_stats(t2);\r\n\t\t\t\tif(fpw)\r\n\t\t\t\t\twrite_track(t2, fpw); } } }\r\n\r\n\t// Display summary\r\n\tprintf(\"%u tracks(%u/%u), %u sectors\",\r\n\t\tH0tracks+H1tracks, H0tracks, H1tracks, STcount[ST_TOTAL]);\r\n\tfor(f=i=0; i < 4; ++i) {\r\n\t\tif(s = STcount[i+1]) {\r\n\t\t\tprintf(\"%s%u %s\", f ? \", \" : \" (\", s, st_names[i]);\r\n\t\t\tf = 255; } }\r\n\tif(f)\r\n\t\tputc(')', stdout);\r\n\tputc('\\n', stdout);\r\n\r\n\t// Close files\r\n\tif(fpw)\r\n\t\tfclose(fpw);\r\n\tif(fpm)\r\n\t\tfclose(fpm);\r\n\tif(fp)\r\n\t\tfclose(fp);\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/IMDV.C",
    "content": "/*\r\n * ImageDisk Viewer\r\n *\r\n * This program allows examination of the content of a .IMD image file.\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. It is being\r\n * provided for informational purposes only, and I provide no support for\r\n * it, technical or otherwise.\r\n *\r\n * Copyright 2007-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, for the purpose\r\n * of keeping a say in it's disposition however I encourage the use of ideas,\r\n * algorithms and code fragments contained herein to be used in the creation\r\n * of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include <window.h>\r\n#include <file.h>\r\n#include \"version.h\"\r\n\r\nstruct WINDOW\r\n\t*swin,\t\t\t// Status window\r\n\t*iwin,\t\t\t// Informational window\r\n\t*mwin;\t\t\t// Main window\r\n\r\nHANDLE\r\n\t*fh;\t\t\t// Open file handle\r\n\r\nFILE\r\n\t*fp,\t\t\t// General file pointer\r\n\t*fps;\t\t\t// Output file\r\n\r\nint\r\n\tEdit,\t\t\t// Edit position\r\n\tHl, Hh;\t\t\t// Highlight portion\r\n\r\nunsigned\r\n\tNsect,\t\t\t// Current # sectors\r\n\tSecsize,\t\t// Sector size\r\n\tSector,\t\t\t// Current logical sector\r\n\tPsector,\t\t// Current physical sector\r\n\tTrack,\t\t\t// Current track\r\n\tTracks,\t\t\t// Total number of track records\r\n\tMstring = 5,\t// Minimum scan-string length\r\n\tWidth = 80,\t\t// scan-string output width\r\n\tH, L,\t\t\t// File position\r\n\tFt, Fs, Fp,\t\t// Find (search) Track/Sector/Position\r\n\tT[512][2],\t\t// Track offsets\r\n\tS[256][2];\t\t// Sector offsets (within current track)\r\n\r\nunsigned char\r\n\t*File,\t\t\t// File name pointer\r\n\t*Custom,\t\t// Custom character set name\r\n\t*Ptr,\t\t\t// General pointer\r\n\tIleave = 255,\t// Interleave option\r\n\tRDonly = 255,\t// Read-only option\r\n\tCsearch = 255,\t// Case insensitive search option\r\n\tXor,\t\t\t// Data XOR value\r\n\tCharset,\t\t// Selected character set\r\n\tMode,\t\t\t// Current track mode\r\n\tSmode,\t\t\t// Sector record type\r\n\tSflag,\t\t\t// Status update flag\r\n\tFflag,\t\t\t// Find-flag\r\n\tFcs,\t\t\t// Find case-convert\r\n\tCylinder,\t\t// Current cylinder\r\n\tHead,\t\t\t// Current head\r\n\tSsize,\t\t\t// Current sector size\r\n\tFinput[65],\t\t// Search input buffer\r\n\tFstring[65],\t// Search string\r\n\tSmap[256],\t\t// Sector numbering map\r\n\tCmap[256],\t\t// Cylinder numbering map\r\n\tHmap[256],\t\t// Head numbering map\r\n\tOmap[256],\t\t// Sector ordering map (for interleave)\r\n\tCset[256],\t\t// Custom character set\r\n\tSecdata[8192];\t// Sector data buffer\r\n\r\nunsigned\t\t\t// Sector size translate table\r\n\tSector_size[] = { 128, 256, 512, 1024, 2048, 4096, 8192 };\r\n\r\nunsigned char *Sector_mode[] = {\t// Data mode translate table\r\n\t\"500Khz  FM\",\r\n\t\"300Khz  FM\",\r\n\t\"250Khz  FM\",\r\n\t\"500Khz MFM\",\r\n\t\"300Khz MFM\",\r\n\t\"250Khz MFM\" };\r\n\r\nunsigned char ebcdic[] = {\t// ASCII to Ebcdic translation table\r\n0x00,0x01,0x02,0x03,0x9C,0x09,0x86,0x7F,0x97,0x8D,0x8E,0x0B,0x0C,0x0D,0x0E,0x0F,\r\n0x10,0x11,0x12,0x13,0x9D,0x85,0x08,0x87,0x18,0x19,0x92,0x8F,0x1C,0x1D,0x1E,0x1F,\r\n0x80,0x81,0x82,0x83,0x84,0x0A,0x17,0x1B,0x88,0x89,0x8A,0x8B,0x8C,0x05,0x06,0x07,\r\n0x90,0x91,0x16,0x93,0x94,0x95,0x96,0x04,0x98,0x99,0x9A,0x9B,0x14,0x15,0x9E,0x1A,\r\n' ', 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,'[', '.', '<', '(', '+', '!',\r\n'&', 0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,']', '$', '*', ')', ';', '^',\r\n'-', '/', 0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,'|', ',', '%', '_', '>', '?',\r\n0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,0xC0,0xC1,0xC2,'`', ':', '#', '@', 0x27,'=', '\"',\r\n0xC3,'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,\r\n0xCA,'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,\r\n0xD1,'~', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,\r\n0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,\r\n'{', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,\r\n'}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,\r\n0x5C,0x9F,'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,\r\n'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0xFA,0xFB,0xFC,0xFD,0xFE,0xFF };\r\n\r\nunsigned char *search_text[] = {\t\t// Text entry form for search-text\r\n\t76<<8|3,\r\n\t\"\\x01\\x00\\x40Text?\",\r\n\t0 };\r\nunsigned char *search_byte[] = {\t\t// Text entry form for search-Hex\r\n\t76<<8|3,\r\n\t\"\\x01\\x00\\x40Bytes?\",\r\n\t0 };\r\n\r\n// Command line help\r\nunsigned char help[] = { \"Copyright 2007-\"#CYEAR\" Dave Dunfield - All rights reserved.\\n\\\r\n\\nUse: IMDV image[.IMD] [options]\\n\\n\\\r\nOpts:\t/C\t\t- Case-sensitive searches\\n\\\r\n\t/E\t\t- use Ebcdic displays\\n\\\r\n\t/I\t\t- ignore Interleave in sector ordering\\n\\\r\n\t/W\t\t- allow Write to file (edit)\\n\\\r\n\tC=file[.CHR]\t- use Custom character-set\t\t[none]\\n\\\r\n\tE=file[.CHR]\t- Edit custom character-set\t\t[no]\\n\\\r\n\tM=n\t\t- Minimum scan-string length\t\t[5]\\n\\\r\n\tS=file[.TXT]\t- extract scan-Strings to file\t\t[no]\\n\\\r\n\tW=n\t\t- Width of scan-string output\t\t[80]\\n\\\r\n\tX=xx\t\t- Xor sector data with hex value\t[00]\\n\" };\r\n\r\n// Main menu help\r\nunsigned char mhelp[] = { \"\\n\\n\\n\\\r\n   Up/Dn\t= Select track\\n\\\r\n Left/Right\t= Select sector\\n\\\r\n Home/End\t= Start/End of track sector list\\n\\\r\n^Home/^End\t= First/Last sector on disk\\n\\\r\n PgUp/PgDn\t= Page data display\\n\\\r\n   ENTER\t= Edit sector\\n\\\r\n\tF1\t\t= Display help\\n\\\r\n\tF2\t\t= Toggle character-set display\\n\\\r\n\tF3\t\t= Search for string from current track\\n\\\r\n\tF4\t\t= Search again\\n\\\r\n\tF5\t\t= Display all strings from current track onward\\n\\\r\n  ESC/F10\t= Exit\" };\r\n\r\n// Sector editor help\r\nunsigned char ehelp[] = { \"\\n\\n\\n\\\r\n Left/Right\t= Move by one position\\n\\\r\n   Up/Dn\t= Move by one line\\n\\\r\n PgUp/PgDn\t= Move by one screen\\n\\\r\n Home/End\t= Move to start/end of line\\n\\\r\n^Home/^End\t= Move to start/end of sector\\n\\\r\n\tF1\t\t= Display help\\n\\\r\n\tF2\t\t= Toggle character-set display\\n\\\r\n\tF3\t\t= Toggle HEX/ASCII edit mode\\n\\\r\n   F10\t\t= Exit\" };\r\n\r\n// Character-set editor help\r\nunsigned char chelp[] = { \"\\n\\n\\n\\n\\n\\n\\n\\\r\n   Up/Dn\t= Move by -/+ 1 position\\n\\\r\n Left/Right\t= Move by -/+ 16 positions\\n\\\r\n\tF1\t\t= Display help\\n\\\r\n\tF2\t\t= Set character unprintable\\n\\\r\n\tF4\t\t= Load ASCII  character set\\n\\\r\n\tF5\t\t= Load EBCDIC chraacter set\\n\\\r\n   F10\t\t= Exit\\n\\\r\n\tc\t\t= Set printable character translation\" };\r\n\r\n// Index values for video attributes\r\n#define\tINORM\t0\t\t// Informational window - normal\r\n#define\tMNORM\t1\t\t// Main window - normal\r\n#define\tENORM\t2\t\t// Edit window - normal\r\n#define\tIHILITE\t3\t\t// Informational window - hilight\r\n#define\tMHILITE\t4\t\t// Main window - hilight\r\n#define\tEHILITE\t5\t\t// Edit window - hilight\r\n#define\tMWEAK\t6\t\t// Main window - de-emphasis\r\n\r\nunsigned char\r\n\t*Attrs,\t\t\t\t// Active attributes\r\n\tCattrs[]  = {\t\t// Color attributes\r\n\t\t0x47,\t\t\t// Informational window\r\n\t\t0x17,\t\t\t// Main window\r\n\t\t0x67,\t\t\t// Edit window\r\n\t\t0x4E,\t\t\t// Informational hilight\r\n\t\t0x1E,\t\t\t// Main hilight\r\n\t\t0x6E,\t\t\t// Edit hilight\r\n\t\t0x13 },\t\t\t// Main de-emphasis\r\n\tMattrs[] = {\t\t// Monochrome attributes\r\n\t\t0x70,\t\t\t// Informational window\r\n\t\t0x07,\t\t\t// Main window\r\n\t\t0x70,\t\t\t// Edit window\r\n\t\t0x07,\t\t\t// Informational hilight\r\n\t\t0x70,\t\t\t// Main hilight\r\n\t\t0x07,\t\t\t// Edit hilight\r\n\t\t0x07 };\t\t\t// Main de-emphasis\r\n\r\n/*\r\n * Display formatted error message & exit\r\n */\r\nregister error(unsigned args)\r\n{\r\n\tunsigned char buffer[81];\r\n\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tif(swin) {\r\n\t\twclose();\r\n\t\twclose();\r\n\t\twclose(); }\r\n\tfputs(buffer, stderr);\r\n\texit(-1);\r\n}\r\n\r\n/*\r\n * Update status line with formatted message\r\n */\r\nregister status(unsigned args)\r\n{\r\n\tunsigned char buffer[81];\r\n\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tif(!swin) {\r\n\t\tfputs(buffer, stderr);\r\n\t\tputc('\\n', stderr);\r\n\t\texit(-1); }\r\n\tw_clwin(swin);\r\n\tw_puts(buffer, swin);\r\n\tSflag = 255;\r\n}\r\n\r\n/*\r\n * Get charcter from file & record position\r\n */\r\nint Getc()\r\n{\r\n\tunsigned char c;\r\n\r\n\tif(!read(&c, 1, fh))\r\n\t\treturn -1;\r\n\tif(!++L)\r\n\t\t++H;\r\n\treturn c;\r\n}\r\n\r\n/*\r\n * Get character from file & record position, error on EOF\r\n */\r\nint Gete()\r\n{\r\n\tunsigned char c;\r\n\r\n\tif(!read(&c, 1, fh))\r\n\t\terror(\"Corrupt image file\");\r\n\tif(!++L)\r\n\t\t++H;\r\n\treturn c;\r\n}\r\n\r\n/*\r\n * Get block of data from file  & update position counter\r\n */\r\nvoid Getb(unsigned char *dest, unsigned size)\r\n{\r\n\tunsigned i;\r\n\r\n\tif(size) {\r\n\t\tif(read(dest, size, fh) != size)\r\n\t\t\terror(\"Corrupt image file\");\r\n\t\ti = L;\r\n\t\tL += size;\r\n\t\tif(L < i)\r\n\t\t\t++H; }\r\n}\r\n\r\n/*\r\n * Get Y/N response\r\n */\r\nint yn(void)\r\n{\r\n\tswitch(wgetc()) {\r\n\tcase 'y' :\r\n\tcase 'Y' : return 255;\r\n\tcase 'n' :\r\n\tcase 'N' :\r\n\tcase 0x1B: return 0; }\r\n}\r\n\r\n/*\r\n * Wait for SPACE or ESC\r\n */\r\nint space(void)\r\n{\r\n\tfor(;;) switch(wgetc()) {\r\n\t\tcase ' ' : return 0;\r\n\t\tcase _K10:\r\n\t\tcase 0x1B: return 255; }\r\n}\r\n\r\n/*\r\n * Display help screen\r\n */\r\nvoid display_help(unsigned char *screen)\r\n{\r\n\tunsigned char c;\r\n\r\n\twclwin();\r\n\twhile(c = *screen++) {\r\n\t\tif(c == '\\t') {\t\t\t\t\t\t// Expand tabs  at 4-char intervals\r\n\t\t\tdo\r\n\t\t\t\twputc(' ');\r\n\t\t\twhile(mwin->WINcurx & 3); }\r\n\t\telse\r\n\t\t\twputc(c); }\r\n\r\n\twgotoxy(0, mwin->WINheight-1);\r\n\twputs(\"Press SPACE to continue.\");\r\n\tspace();\r\n}\r\n\r\n/*\r\n * Invert bits in sector data according to XOR mask\r\n */\r\nvoid invert(void)\r\n{\r\n\tunsigned i;\r\n\tif(Xor) {\r\n\t\tfor(i=0; i < Secsize; ++i)\r\n\t\t\tSecdata[i] ^= Xor; }\r\n}\r\n\r\n/*\r\n * Read a track from the input file\r\n */\r\nint read_track(void)\r\n{\r\n\tunsigned i;\r\n\tunsigned char s;\r\n\r\n\t// Read trach header & validate\r\n\tif((i = Getc()) == EOF)\t\t\t// Mode byte if another track\r\n\t\treturn -1;\r\n\r\n\tif((Mode = i) > 5)\t\t\t\t\t// Date mode\r\n\t\terror(\"Bad mode value\");\r\n\tCylinder = Gete();\t\t\t\t\t// Cylinder number\r\n\tif(((Head = Gete()) & 0x3F) > 1)\t// Head number\r\n\t\terror(\"Bad head value\");\r\n\tNsect = Gete();\t\t\t\t\t\t// # sectors/track\r\n\tif((Ssize = Gete()) > 6)\t\t\t// Encoded sector size\r\n\t\terror(\"Bad sector-size value\");\r\n\tSecsize = Sector_size[Ssize];\t\t// Actual sector size\r\n\r\n\tGetb(Smap, Nsect);\t\t\t\t\t// Sector numbering map\r\n\r\n\tif(Head & 0x80)\r\n\t\tGetb(Cmap, Nsect);\t\t\t\t\t\t\t// Custom cylinder map\r\n\telse\r\n\t\tmemset(Cmap, Cylinder, sizeof(Cmap));\t\t// Otherwise, all same\r\n\r\n\tif(Head & 0x40)\r\n\t\tGetb(Hmap, Nsect);\t\t\t\t\t\t\t// Custom head map\r\n\telse\r\n\t\tmemset(Hmap, Head & 0x3F, sizeof(Hmap));\t// Otherwise, all same\r\n\r\n\t// Scan sectors & record offsets (this track only)\r\n\tfor(i=0; i < Nsect; ++i) {\r\n\t\tS[i][0] = L; S[i][1] = H;\r\n\t\tif(s = Gete()) {\r\n\t\t\tif((s-1) & 0x01)\r\n\t\t\t\tGete();\t\t\t// Compressed\r\n\t\t\telse\r\n\t\t\t\tGetb(Secdata, Secsize); } }\r\n\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Read current physical sector from input file\r\n */\r\nvoid read_sector(void)\r\n{\r\n\tlseek(fh, H=S[Psector][1], L=S[Psector][0], 0);\t\t// Position\r\n\tif(Smode = Gete()) {\r\n\t\tif((Smode-1) & 1)\r\n\t\t\tmemset(Secdata, Gete(), Secsize);\r\n\t\telse\r\n\t\t\tGetb(Secdata, Secsize);\r\n\t\tinvert(); }\r\n}\r\n\r\n/*\r\n * Build sector re-numbering map for current track interleave\r\n */\r\nvoid map_sectors(void)\r\n{\r\n\tunsigned i, j;\r\n\tunsigned char map[256], c;\r\n\r\n\t// Begin with unsorted list\r\n\tfor(i=0; i < Nsect; ++i)\r\n\t\tOmap[i] = i;\r\n\r\n\t// If interleave is enabled, build index by sorting Sector\r\n\t// numbering map and re-order our list to match.\r\n\tif(Ileave) {\r\n\t\tmemcpy(map, Smap, Nsect);\t\t\t// Copy to preserve original\r\n\t\tfor(i=0; i < Nsect; ++i) {\r\n\t\t\tfor(j=i+1; j < Nsect; ++j) {\r\n\t\t\t\tif(map[j] < map[i]) {\r\n\t\t\t\t\tc = map[j];\t\t\t\t// Sort sector map\r\n\t\t\t\t\tmap[j] = map[i];\r\n\t\t\t\t\tmap[i] = c;\r\n\t\t\t\t\tc = Omap[j];\t\t\t// Copy movement to interleave\r\n\t\t\t\t\tOmap[j] = Omap[i];\r\n\t\t\t\t\tOmap[i] = c; } } } }\r\n}\r\n\r\n/*\r\n * Display printable character with character-set translation (if enabled)\r\n */\r\nvoid showchar(unsigned char c)\r\n{\r\n\tif(Charset)\r\n\t\tc = ebcdic[c];\r\n\twputc( ((c >= ' ') && (c < 0x7F)) ? c : '.');\r\n}\r\n\r\n/*\r\n * Draw the edit screen\r\n */\r\nvoid draw_edit(unsigned char Na, unsigned char Ha)\r\n{\r\n\tunsigned a, i, j, p;\r\n\ta = Edit;\r\n\t*mwin = Na;\r\n\twgotoxy(0, 0); wcleol();\r\n\tfor(i=0; i < 16; ++i) {\r\n\t\twgotoxy(0, i+1);\r\n\t\twcleol();\r\n\t\tif(a >= Secsize)\r\n\t\t\tcontinue;\r\n\t\twprintf(\" %04x \", p=a);\r\n\t\tfor(j=0; j < 16; ++j) {\r\n\t\t\tif(!(j & 3))\r\n\t\t\t\twputc(' ');\r\n\t\t\t*mwin = ((p >= Hl) && (p < Hh)) ? Ha : Na;\r\n\t\t\twprintf(\" %02x\", Secdata[p++]); }\r\n\t\twgotoxy(62, i+1);\r\n\t\tfor(j=0; j < 16; ++j) {\r\n\t\t\t*mwin = ((a >= Hl) && (a < Hh)) ? Ha : Na;\r\n\t\t\tshowchar(Secdata[a++]); }\r\n\t\t*mwin = Na; }\r\n\twgotoxy(0, 17); wcleol();\r\n}\r\n\r\n/*\r\n * Convert input character to HEX nibble\r\n */\r\nint ctoh(unsigned c)\r\n{\r\n\tif(isdigit(c))\r\n\t\treturn c - '0';\r\n\tif((c >= 'a') && (c <= 'f'))\r\n\t\treturn c - ('a'-10);\r\n\tif((c >= 'A') && (c <= 'F'))\r\n\t\treturn c - ('A'-10);\r\n\treturn -1;\r\n}\r\n\r\n/*\r\n * Cycle through character set options\r\n */\r\nvoid charset(unsigned step)\r\n{\r\n\tunsigned i;\r\n\tunsigned char c, *p;\r\n\r\n\tif(step) switch(++Charset) {\r\n\t\tcase 2 :\t\t\t\t// Ebcdic -> Custom\r\n\t\t\tif(Custom)\r\n\t\t\t\tgoto swapch;\r\n\t\t\tCharset = 0;\r\n\t\t\tbreak;\r\n\t\tcase 3 :\t\t\t\t// Custom -> ASCII\r\n\t\t\tCharset = 0;\r\n\t\tswapch:\r\n\t\t\tfor(i=0; i < 256; ++i) {\r\n\t\t\t\tc = Cset[i];\r\n\t\t\t\tCset[i] = ebcdic[i];\r\n\t\t\t\tebcdic[i] = c; } }\r\n\r\n\t// Update display with currently selected character set indicator\r\n\tw_gotoxy(72, 5, iwin);\r\n\tswitch(Charset) {\r\n\tdefault: Charset = 0;\r\n\tcase 0 : p = \"ASCII\";\tbreak;\r\n\tcase 1 : p = \"EBCDIC\";\tbreak;\r\n\tcase 2 : p = Custom; }\r\n\tw_printf(iwin, \"%8s\", p);\r\n}\r\n\r\n/*\r\n * Sector editor\r\n */\r\nvoid edit(void)\r\n{\r\n\tint c, d;\r\n\tunsigned x, y, ss;\r\n\tunsigned char so, rd, cf, *p;\r\n\tstatic int Offset;\r\n\tstatic unsigned char Emode;\r\n\r\n\tif(RDonly) {\t\t\t// Do not allow edit of file read-only\r\n\t\tp = \"READ ONLY\";\r\n\teabort:\r\n\t\tstatus(\"Cannot edit: %s\", p);\r\n\t\treturn; }\r\n\tif(!(c = Smode)) {\r\n\t\tp = \"No data\"; goto eabort; }\r\n\tif((Smode-1) & 1) {\r\n\t\tp = \"Compressed\"; goto eabort; }\r\n\r\n\tcf = Hl = Hh = 0;\r\n\twcursor_line();\r\n\tss = (Secsize < 256) ? 128 : 256;\r\n\trd = 255;\r\n\tstatus(\"SECTOR EDIT:  F1=Help  F2=Charset  F3=Mode  F10=Exit\");\r\n\r\n\tfor(;;) {\r\n\t\twhile(Offset < 0) {\t\t// Normalize offset to screen\r\n\t\t\tOffset += 16;\r\n\t\t\tEdit -= 16;\r\n\t\t\trd = 255; }\r\n\t\twhile(Offset >= ss) {\t// Normalize offset to screen\r\n\t\t\tOffset -= 16;\r\n\t\t\tEdit += 16;\r\n\t\t\trd = 255; }\r\n\t\tif((Edit+ss) > Secsize) {\t// Handle over-top case\r\n\t\t\tEdit = (Secsize < 256) ? 0 : Secsize - 256;\r\n\t\t\tOffset = ss - 1; }\r\n\t\tif(Edit < 0)\t\t\t// Reset if under\r\n\t\t\tEdit = Offset = 0;\r\n\t\tif(rd) {\t\t\t\t// Redraw has been requested\r\n\t\t\tcharset(rd = 0);\r\n\t\t\tdraw_edit(Attrs[ENORM], Attrs[EHILITE]); }\r\n\t\t// Calculate screen location & position cursor\r\n\t\ty = (Offset >> 4) + 1;\r\n\t\tx = Offset & 15;\r\n\t\tif(Emode)\r\n\t\t\twgotoxy(62+x, y);\r\n\t\telse\r\n\t\t\twgotoxy((x*3)+(x>>2)+8, y);\r\n\t\tso = Offset;\r\n\t\tswitch(c=wgetc()) {\t\t\t// Process command keys\r\n\t\tcase _KRA : ++Offset;\t\tcontinue;\t\t\t\t\t// Move right\r\n\t\tcase _KLA : --Offset; \t\tcontinue;\t\t\t\t\t// Move left\r\n\t\tcase _KDA : Offset += 16;\tcontinue;\t\t\t\t\t// Move down\r\n\t\tcase _KUA : Offset -= 16;\tcontinue;\t\t\t\t\t// Move up\r\n\t\tcase _KPD : Edit += 256;\tgoto redraw;\t\t\t\t// Page down\r\n\t\tcase _KPU : Edit -= 256;\tgoto redraw;\t\t\t\t// Page up\r\n\t\tcase _KHO : Offset = (Offset - 1) & 0xFFF0;\tcontinue;\t// Start of line\r\n\t\tcase _KEN : Offset = (Offset + 1) | 0x0F;\tcontinue;\t// End of line\r\n\t\tcase _CHO : Edit = Offset = 0;\tgoto redraw;\t\t\t// Go to start\r\n\t\tcase _CEN :\t\t\t\t\t\t\t\t\t\t\t\t// Go to end\r\n\t\t\tEdit = (Secsize < 256) ? 0 : Secsize-256;\r\n\t\t\tOffset = ss - 1;\r\n\tredraw:\trd = 255;\t\t\t// Request screen redraw\r\n\t\t\tcontinue;\r\n\t\tcase _K1 : display_help(ehelp); rd=255;\t\t\tcontinue;\t// Help\r\n\t\tcase _K2 : charset(255); rd = 255;\t\t\t\tcontinue;\t// Charset\r\n\t\tcase _K3 : Emode = Emode ? 0 : 255;\t\t\t\tcontinue;\t// Mode\r\n\t\tcase _K10 :\t\t\t\t\t\t\t\t\t\t\t\t\t// Exit\r\n\t\t\tif(cf) {\r\n\t\t\t\tstatus(\"Write changed sector (Y/N)?\");\r\n\t\t\t\tif(yn()) {\r\n\t\t\t\t\tlseek(fh, H=S[Psector][1], L=S[Psector][0], 0);\r\n\t\t\t\t\tinvert();\r\n\t\t\t\t\twrite(&Smode, 1, fh);\r\n\t\t\t\t\twrite(Secdata, Secsize, fh);\r\n\t\t\t\t\tp = \"Sector written\"; }\r\n\t\t\t\telse\r\n\t\t\t\t\tp = \"Sector discarded\"; }\r\n\t\t\telse\r\n\t\t\t\tp = \"No changes\";\r\n\t\t\tstatus(p);\r\n\t\t\twcursor_off();\r\n\t\t\t*mwin = Attrs[MNORM];\r\n\t\t\treturn; }\r\n\t\t// Not a control key - attempt data entry\r\n\t\tif(!Emode) {\t\t// HEX data entry\r\n\t\t\tif((d = ctoh(c)) == -1)\r\n\t\t\t\tcontinue;\r\n\t\t\twputc(c);\r\n\t\t\tif((c = ctoh(wgetc())) != -1) {\r\n\t\t\t\tSecdata[Edit+Offset] = c = (d << 4) | c; } }\r\n\t\telse {\t\t\t\t// ASCII data entry\r\n\t\t\tif(c & 0xFF80)\r\n\t\t\t\tcontinue;\r\n\t\t\tif(Charset) {\t// Alternate character set - reverse lookup\r\n\t\t\t\tfor(d = 0; d < 256; ++d)\r\n\t\t\t\t\tif(ebcdic[d] == c)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\tif((c = d) & 0xFF00)\t// Skip if not found\r\n\t\t\t\t\tcontinue; }\r\n\t\t\tSecdata[Edit+Offset] = c; }\r\n\t\twgotoxy((x*3)+(x>>2)+8, y);\t\t// Update HEX\r\n\t\twprintf(\"%02x\", c);\r\n\t\twgotoxy(62+x, y);\t\t\t\t// Update printable\r\n\t\tshowchar(c);\r\n\t\t++Offset;\t\t\t\t\t\t// Advance position\r\n\t\tcf = 255; }\t\t\t\t\t\t// Note changed\r\n}\r\n\r\n/*\r\n * Parse a filename and append extension if none supplied\r\n */\r\nvoid filename(unsigned char *name, unsigned char *ext)\r\n{\r\n\tunsigned char d, *p;\r\n\tp = Omap;\r\nrd:\td = 255;\r\n\tfor(;;) switch(*p++ = *name++) {\r\n\t\tcase 0 :\r\n\t\t\tif(d)\r\n\t\t\t\tstrcpy(p-1, ext);\r\n\t\t\treturn;\r\n\t\tcase ':' :\r\n\t\tcase '\\\\':\tgoto rd;\r\n\t\tcase '.' :\td = 0;\t}\r\n}\r\n\r\n/*\r\n * Display line of output with page pauses\r\n */\r\nint Pline;\t\t// Pause line counter\r\nint pause(unsigned char *buffer)\r\n{\r\n\tif(fps) {\r\n\t\tfputs(buffer, fps);\r\n\t\tputc('\\n', fps);\r\n\t\treturn 0; }\r\n\r\n\tif(Pline >= 17) {\r\n\t\tstatus(\"SPACE to continue, ESC to stop\");\r\n\t\tif(space()) {\r\n\t\t\tstatus(\"Aborted\");\r\n\t\t\treturn 255; }\r\n\t\tstatus(\"\");\r\n\t\twclwin();\r\n\t\twputs(buffer);\r\n\t\treturn Pline = 0; }\r\n\twgotoxy(0, ++Pline);\r\n\twputs(buffer);\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Extract and display printable strings from image\r\n */\r\nvoid find_strings(void)\r\n{\r\n\tunsigned l, p, t, s;\r\n\tunsigned char buffer[1025], c, nl;\r\n\r\n\tnl = l = 0;\r\n\tPline = -1;\r\n\tfor(t=Track; t < Tracks; ++t) {\r\n\t\tlseek(fh, H=T[t][1], L=T[t][0], 0);\r\n\t\tread_track();\r\n\t\tmap_sectors();\r\n\t\tfor(s = 0; s < Nsect; ++s) {\r\n\t\t\tPsector = Omap[s];\r\n\t\t\tread_sector();\r\n\t\t\tfor(p=0; p < Secsize; ++p) {\r\n\t\t\t\tc = Secdata[p];\r\n\t\t\t\tif(Charset)\r\n\t\t\t\t\tc = ebcdic[c];\r\n\t\t\t\tif((c < ' ') || (c > 0x7E)) {\r\n\t\t\t\t\tnl = 255;\r\n\t\t\t\t\tcontinue; }\r\n\t\t\t\tif(l >= Width)\r\n\t\t\t\t\tnl = 255;\r\n\t\t\t\tif(nl) {\r\n\t\t\t\t\tif(l >= Mstring) {\r\n\t\t\t\t\t\tbuffer[l] = 0;\r\n\t\t\t\t\t\tif(pause(buffer)) return; }\r\n\t\t\t\t\tnl = l = 0; }\r\n\t\t\t\tbuffer[l++] = c; } } }\r\n\tif(l >= Mstring) {\r\n\t\tbuffer[l] = 0;\r\n\t\tif(pause(buffer)) return; }\r\n\tif(mwin) {\r\n\t\tstatus(\"All strings found\");\r\n\t\tspace(); }\r\n}\r\n\r\n/*\r\n * Compare using circular buffer\r\n */\r\nunsigned Slen, Spos;\t\t\t// Scan length & Sosition\r\nunsigned char Sbuffer[65];\t\t// Scan buffer\r\nint Fcompare(unsigned char *s)\r\n{\r\n\tunsigned p;\r\n\tp = Spos;\r\n\tdo {\r\n\t\tif(Sbuffer[p] != *s++)\r\n\t\t\treturn 0;\r\n\t\tif(++p >= Slen)\r\n\t\t\tp = 0; }\r\n\twhile(p != Spos);\r\n\treturn 255;\r\n}\r\n\r\n/*\r\n * Find string in image data\r\n */\r\nvoid find(char again)\r\n{\r\n\tunsigned char c;\r\n\r\n\tstatus(\"Search: %s\", Finput);\r\n\tif(again)\t\t// Repeated search\r\n\t\tgoto findagain;\r\n\r\n\t// Initial search, clear the circular buffer\r\n\tmemset(Sbuffer, Spos = 0, sizeof(Sbuffer));\r\n\r\n\t// Read each track/sector and scan\r\n\tfor(Ft=Track; Ft < Tracks; ++Ft) {\t\t\t// Each track\r\n\t\tlseek(fh, H=T[Ft][1], L=T[Ft][0], 0);\r\n\t\tread_track();\r\n\t\tmap_sectors();\r\n\t\tfor(Fs = 0; Fs < Nsect; ++Fs) {\t\t\t// Each sector\r\n\t\t\tPsector = Omap[Fs];\r\n\t\t\tread_sector();\r\n\t\t\tfor(Fp=0; Fp < Secsize; ++Fp) {\t\t// Each byte\r\n\t\t\t\tc = Secdata[Fp];\r\n\t\t\t\tif(Charset)\t\t\t\t\t\t// Charcter set translation\r\n\t\t\t\t\tc = ebcdic[c];\r\n\t\t\t\tSbuffer[Spos] = Fcs ? toupper(c) : c;\r\n\t\t\t\tif(++Spos >= Slen)\r\n\t\t\t\t\tSpos = 0;\r\n\t\t\t\tif(Fcompare(Fstring)) {\t\t\t// Found match\r\n\t\t\t\t\tTrack = Ft;\r\n\t\t\t\t\tSector = Fs;\r\n\t\t\t\t\tHl = (Hh = Fp + 1) - Slen;\r\n\t\t\t\t\tif(Hl < 0) Hl = 0;\r\n\t\t\t\t\twhile(Hl < Edit)\r\n\t\t\t\t\t\tEdit -= 16;\r\n\t\t\t\t\twhile((Edit+256) < Hl)\r\n\t\t\t\t\t\tEdit += 16;\r\n\t\t\t\t\tstatus(\"Found '%s' [%04x]\", Finput, Fp);\r\n\t\t\t\t\tFflag = 255;\r\n\t\t\t\t\treturn; }\r\n// To repeat a search, we jump to the end of the loop, allowing it\r\n// to continue with the existing Ft, Fs and Fp values.\r\nfindagain: } } }\r\n\tstatus(\"Not found: '%s'\", Finput);\r\n\tHl = Hh = 0;\r\n}\r\n\r\n/*\r\n * Character set editor\r\n */\r\nvoid edit_charset(unsigned char *file)\r\n{\r\n\tint c;\r\n\tunsigned i;\r\n\tunsigned char p;\r\n\r\n\t// Add extension (if necessary) & read file into buffer\r\n\tfilename(file, \".CHR\");\r\n\tif(fp = fopen(Omap, \"rb\")) {\r\n\t\tif(fget(Cset, 256, fp) != 256)\t\t// Too small\r\n\t\t\tabort(\"Bad character set\");\r\n\t\tif(getc(fp) != EOF)\t\t\t\t\t// Too big\r\n\t\t\tabort(\"Bad character set\");\r\n\t\tfclose(fp); }\r\n\r\n\t// Open windows & display title\r\n\tswin = wopen(0, 0, 80, 1, WSAVE|WCOPEN|0x70);\r\n\tAttrs = (W_BASE == 0xB000) ? Mattrs : Cattrs;\r\n\tmwin = wopen(0, 1, 80, 24, WSAVE|WCOPEN|Attrs[MNORM]);\r\n\twcursor_off();\r\n\tstatus(\"ImageDisk Viewer \"#VERSION\" / \"#__DATE__\" - Copyright 2007-\"#CYEAR\" Dave Dunfield\");\r\n\r\nretitle:\r\n\twgotoxy(0, 0);\r\n\twprintf(fp ? \"Editing: %s\" : \"New: %s\", Omap);\r\n\r\n\tp = 0;\r\nredraw:\r\n\t// Display character set showing current settings\r\n\tfor(i=0; i < 256; ++i) {\r\n\t\twgotoxy((i >> 4) * 5, (i & 15) + 4);\r\n\t\t*mwin = Attrs[(i == p) ?  MHILITE : MWEAK];\r\n\t\twprintf(\"%02x=\", i);\r\n\t\t*mwin = Attrs[MNORM];\r\n\t\tc = Cset[i];\r\n\t\twputc( ((c >= ' ') && (c < 0x7F)) ? c : 0xA8); }\r\n\tfor(;;) {\r\n\t\ti = p;\r\n\t\tc = wgetc();\r\n\t\tif(Sflag) {\t\t// Status changed - reshow default\r\n\t\t\tstatus(\".CHR Editor:  F1=Help  F2=Non-print  F5=LoadASCII  F6=LoadEBCDIC  F10=EXIT\");\r\n\t\t\tSflag = 0; }\r\n\t\tswitch(c) {\r\n\t\tcase 0x1B :\t\t\t\t// Exit\r\n\t\tcase _K10 :\r\n\t\t\tstatus(\"Resave file (Y/N)?\");\r\n\t\t\tc = yn();\r\n\t\t\twclose();\r\n\t\t\twclose();\r\n\t\t\tif(c) {\r\n\t\t\t\tfp = fopen(Omap, \"wvqb\");\r\n\t\t\t\tfput(Cset, 256, fp);\r\n\t\t\t\tfclose(fp); }\r\n\t\t\treturn;\r\n\t\tcase _K1 : display_help(chelp); wclwin();\tgoto retitle;\t\t\t// Help\r\n\t\tcase _K2 : Cset[p] = 0;\tgoto redraw;\t\t\t\t\t\t\t\t// Non-print\r\n\t\tcase _K5 : for(i=0; i < 256; ++i) Cset[i] = i; goto redraw;\t\t\t// ASCII\r\n\t\tcase _K6 : for(i=0; i < 256; ++i) Cset[i] = ebcdic[i]; goto redraw;\t// EBCDIC\r\n\t\tcase _KLA :\t\t\t\t\t\t\t\t// Move left\r\n\t\t\tif(p)\t\t\tp -= 16;\r\n\t\t\tif(i > 0x0F)\tgoto redraw;\r\n\t\tcase _KUA : --p;\tgoto redraw;\t\t// Move up\r\n\t\tcase _KRA :\t\t\t\t\t\t\t\t// Move right\r\n\t\t\tif(p != 0xFF)\tp += 16;\r\n\t\t\tif(i < 0xF0)\tgoto redraw;\r\n\t\tcase _KDA : ++p;\tgoto redraw;\t\t// Move down\r\n\t\tdefault:\r\n\t\t\tif((c >= ' ') && (c < 0x7F)) {\t\t// Enter display character\r\n\t\t\t\tCset[p++] = c;\r\n\t\t\t\tgoto redraw; } } }\r\n}\r\n\r\nint skip()\r\n{\r\n\twhile(isspace(*Ptr))\r\n\t\t++Ptr;\r\n\treturn *Ptr;\r\n}\r\n\r\n/*\r\n * Get value\r\n */\r\nint value(unsigned *d, unsigned b, unsigned l, unsigned h, unsigned char *n)\r\n{\r\n\tunsigned c, v;\r\n\tunsigned char f;\r\n\r\n\tswitch(*Ptr) {\r\n\tcase '%' : b = 2;\tgoto newb;\r\n\tcase '@' : b = 8;\tgoto newb;\r\n\tcase '.' : b = 10;\tgoto newb;\r\n\tcase '$' : b = 16;\tnewb:\r\n\t\t++Ptr; }\r\n\r\n\tv = f = 0;\r\n\tfor(;;) {\r\n\t\tc = *Ptr;\r\n\t\tif((c >= '0') && (c <= '9'))\r\n\t\t\tc -= '0';\r\n\t\telse if((c >= 'a') && (c <= 'f'))\r\n\t\t\tc -= ('a' - 10);\r\n\t\telse if((c >= 'A') && (c <= 'F'))\r\n\t\t\tc -= ('A' - 10);\r\n\t\telse\r\n\t\t\tc = 0xFFFF;\r\n\t\tif(c >= b) {\r\n\t\t\tswitch(*Ptr) {\r\n\t\t\tcase ' ' :\r\n\t\t\tcase 0 :\r\n\t\t\t\tif(f) {\r\n\t\t\t\t\tif((v < l) || (v > h)) {\r\n\t\t\t\t\t\tstatus(\"%s value out of range\", n);\r\n\t\t\t\t\t\treturn 255; }\r\n\t\t\t\t\t*d = v;\r\n\t\t\t\t\treturn 0 ; } }\r\n\t\t\tstatus(\"Bad %s value\", n);\r\n\t\t\treturn 255; }\r\n\t\tv = (v * b) + c;\r\n\t\t++Ptr;\r\n\t\tf = 255; }\r\n}\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tint c;\r\n\tunsigned i;\r\n\r\n\tfputs(\"IMageDisk Viewer \"#VERSION\" / \"#__DATE__\"\\n\", stdout);\r\n\r\n\tfor(i=1; i < argc; ++i) {\t\t// Parse command line arguments\r\n\t\tPtr = argv[i];\r\n\t\tswitch((toupper(*Ptr++) << 8) | toupper(*Ptr++)) {\r\n\t\tcase '-C' :\r\n\t\tcase '/C' : Csearch = 0;\t\tcontinue;\t// Case sensitive search\r\n\t\tcase '-E' :\r\n\t\tcase '/E' : Charset = 1;\t\tcontinue;\t// Ebcdic display\r\n\t\tcase '-I' :\r\n\t\tcase '/I' : Ileave = 0;\t\t\tcontinue;\t// Disable interleave\r\n\t\tcase '-W' :\r\n\t\tcase '/W' : RDonly = 0;\t\t\tcontinue;\t// Allow update\r\n\t\tcase 'C=' :\t\t\t\t\t\t\t\t\t// Custom character set\r\n\t\t\tfilename(Custom = Ptr, \".CHR\");\r\n\t\t\tfp = fopen(Omap, \"rvqb\");\r\n\t\t\tmemcpy(Cset, ebcdic, 256);\r\n\t\t\tif(fget(ebcdic, 256, fp) != 256)\r\n\t\t\t\tabort(\"Bad character set\");\r\n\t\t\tif(getc(fp) != EOF)\r\n\t\t\t\tabort(\"Bad character set\");\r\n\t\t\tfclose(fp);\r\n\t\t\tCharset = 2;\r\n\t\t\twhile(*Ptr = toupper(c = *Ptr)) {\r\n\t\t\t\tif(c == '.') {\r\n\t\t\t\t\t*Ptr = 0;\r\n\t\t\t\t\tcontinue; }\r\n\t\t\t\t++Ptr;\r\n\t\t\t\tif(c == '\\\\') {\r\n\t\t\t\t\tCustom = Ptr;\r\n\t\t\t\t\tcontinue; } }\r\n\t\t\tcontinue;\r\n\t\tcase 'E=' : edit_charset(Ptr);\treturn;\t\t// Edit character set\r\n\t\tcase 'M=' :\t\t\t\t\t\t\t\t\t// Minimum string length\r\n\t\t\tif(value(&Mstring, 10, 1, 65535, \"M=\")) return;\r\n\t\t\tcontinue;\r\n\t\tcase 'S=' :\t\t\t\t\t\t\t\t\t// Scan strings to file\r\n\t\t\tfilename(Ptr, \".TXT\");\r\n\t\t\tfps = fopen(Omap, \"wvq\");\r\n\t\t\tcontinue;\r\n\t\tcase 'W=' :\t\t\t\t\t\t\t\t\t// Output width\r\n\t\t\tif(value(&Width, 10, 1, 65535, \"W=\")) return;\r\n\t\t\tcontinue;\r\n\t\tcase 'X=' : \t\t\t\t\t\t\t\t// Data XOR value\r\n\t\t\tif(value(&c, 16, 0, 255, \"X=\")) return;\r\n\t\t\tXor = c;\r\n\t\t\tcontinue;\r\n\t\t} if(File)\r\n\t\t\tabort(help);\r\n\t\tFile = Ptr-2; }\r\n\r\n\tif(!File)\r\n\t\tabort(help);\r\n\r\n\tfilename(File, \".IMD\");\r\n\tif(!(fh = open(Omap, (RDonly) ? F_READ|F_BINARY : F_READ|F_WRITE|F_BINARY)))\r\n\t\terror(\"Cannot open: %s\", Omap);\r\n\r\n\t// Read and echo comment\r\n\twhile((c = Gete()) != 0x1A) {\r\n\t\tif(c == EOF)\r\n\t\t\tabort(\"Corrupt image file\");\r\n\t\tputc(c, stdout); }\r\n\r\n\t// Record position of each track\r\n\tfor(;;) {\r\n\t\tT[Tracks][0] = L; T[Tracks][1] = H;\r\n\t\tif(read_track())\r\n\t\t\tbreak;\r\n\t\t++Tracks; }\r\n\r\n\t// If scan-output file specified, extract strings & exit\r\n\tif(fps) {\r\n\t\tfind_strings();\r\n\t\tfclose(fps);\r\n\t\treturn; }\r\n\r\n\t// Open user-interface windows\r\n\tswin = wopen(0, 6, 80, 1, WSAVE|WCOPEN|0x70);\r\n\tAttrs = (W_BASE == 0xB000) ? Mattrs : Cattrs;\r\n\tiwin = wopen(0, 0, 80, 6, WSAVE|WCOPEN|Attrs[INORM]);\r\n\tmwin = wopen(0, 7, 80, 18, WSAVE|WCOPEN|Attrs[MNORM]);\r\n\tstatus(\"ImageDisk Viewer \"#VERSION\" / \"#__DATE__\" - Copyright 2007-\"#CYEAR\" Dave Dunfield\");\r\n\twcursor_off();\r\n\r\n\tTrack = Sector = 0;\r\n\r\nnew_track:\t\t// Read track & setup corresponding globals\r\n\tlseek(fh, H=T[Track][1], L=T[Track][0], 0);\r\n\tread_track();\r\n\tmap_sectors();\r\n\tif(!(Head & 0x80)) memset(Cmap, Cylinder, sizeof(Cmap));\r\n\tif(!(Head & 0x40)) memset(Hmap, Head & 0x3F, sizeof(Hmap));\r\n\tif(Sector >= Nsect)\r\n\t\tSector = Nsect-1;\r\n\tif(Edit >= Secsize)\r\n\t\tEdit = 0;\r\n\r\nnew_sect:\t\t// Read sector into buffer & display information\r\n\tPsector = Omap[Sector];\r\n\tread_sector();\r\n\tw_clwin(iwin);\r\n\tw_printf(iwin, \"Physical C/H/S:%3u/%u/%u\", Cylinder, Head & 0x3F, Psector+1);\r\n\tw_gotoxy(50, 0, iwin);\r\n\tw_printf(iwin, \"Logical C/H/S:%3u/%u/%u\\n\\n\", Cmap[Psector], Hmap[Psector], Smap[Psector]);\r\n\tfor(i=0; i < Nsect; ++i) {\r\n\t\t*iwin = Attrs[(i == Psector) ? IHILITE : INORM];\r\n\t\tw_printf(iwin, \" %u\", Smap[i]); }\r\n\t*iwin = Attrs[INORM];\r\n\tw_printf(iwin, \"\\n\\n%s, %u sectors of %u bytes, \", Sector_mode[Mode], Nsect, Secsize);\r\n\tif(!(c = Smode))\r\n\t\tw_puts(\"No data\");\r\n\telse {\r\n\t\t--c;\r\n\t\tif(c & 4) w_puts(\"Bad \", iwin);\r\n\t\tw_puts(c & 2 ? \"Deleted \" : \"Normal \", iwin);\r\n\t\tw_puts(c & 1 ? \"Compressed\" : \"Data\", iwin); }\r\n\r\n\tif(Fflag)\r\n\t\tFflag = 0;\t\t\t// Found, leave hilight on, reset flag\r\n\telse\r\n\t\tHh = Hl = 0;\t\t// Not found, hilight off\r\n\r\nredraw:\t\t\t// Redraw screen\r\n\tcharset(0);\r\n\tif(Edit < 0)\r\n\t\tEdit = 0;\r\n\tdraw_edit(Attrs[MNORM], Attrs[MHILITE]);\r\nrecmd:\r\n\tfor(;;) {\t// Command loop - interpret keypresses\r\n\t\tc = wgetc();\r\n\t\tif(Sflag) {\t\t// Status changed - reshow default\r\n\t\t\tstatus(\"IMDV: F1=Help  F2=Charset  F3=SearchT  F4=SearchB F5=Again  F6=Strings  F10=Exit\");\r\n\t\t\tSflag = 0; }\r\n\t\tswitch(c) {\r\n\t\tcase _KRA :\t\t// Move to next sector\r\n\t\tnxtsect:\r\n\t\t\tif((Sector+1) < Nsect) { ++Sector; goto new_sect; }\r\n\t\t\tif((Track+1) < Tracks) Sector = 0;\r\n\t\tcase _KDA :\t\t// Move to next track\r\n\t\tfwdtrack:\r\n\t\t\tif((Track + 1) >= Tracks) continue;\r\n\t\t\t++Track; goto new_track;\r\n\t\tcase _KLA :\t\t// Move to previous sector\r\n\t\tprevsec:\r\n\t\t\tif(Sector) { --Sector; goto new_sect; }\r\n\t\t\tif(Track) Sector = 255;\r\n\t\tcase _KUA :\t\t// Move to previous track\r\n\t\tbacktrack:\r\n\t\t\tif(!Track) continue;\r\n\t\t\t--Track; goto new_track;\r\n\t\tcase _KPU :\t\t// Scroll data display backward\r\n\t\t\tif(!Edit) {\r\n\t\t\t\tif(Sector | Track) {\r\n\t\t\t\t\tEdit = Secsize - 256;\r\n\t\t\t\t\tgoto prevsec; } }\r\n\t\t\tEdit -= 256;\r\n\t\t\tgoto redraw;\r\n\t\tcase _KPD :\t\t// Scroll data display forward\r\n\t\t\tif((Edit + 512) < Secsize) {\r\n\t\t\t\tEdit += 256;\r\n\t\t\t\tgoto redraw; }\r\n\t\t\tif(((Edit + 256) == Secsize) || (Secsize < 256)) {\r\n\t\t\t\tif( ((Sector+1) < Nsect) || ((Track+1) < Tracks) ) {\r\n\t\t\t\t\tEdit = 0;\r\n\t\t\t\t\tgoto nxtsect; } }\r\n\t\t\tEdit = Secsize - 256;\r\n\t\t\tgoto redraw;\r\n\t\tcase _CHO :\t\t\t\t\t\t// Beginning\r\n\t\t\tTrack = Sector = Edit = 0;\r\n\t\t\tgoto new_track;\r\n\t\tcase _CEN :\t\t\t\t\t\t// End\r\n\t\t\tTrack = Tracks-1;\r\n\t\t\tSector = Nsect - 1;\r\n\t\t\tEdit = Secsize - 256;\r\n\t\t\tgoto new_track;\r\n\t\tcase _KHO :\t\t// Back to start sectors in tracks\r\n\t\t\tif(!Sector) goto backtrack;\r\n\t\t\tSector = 0; goto new_sect;\r\n\t\tcase _KEN :\t\t// Fwd to end sectors in tracks\r\n\t\t\tif((Sector+1) == Nsect) goto fwdtrack;\r\n\t\t\tSector = Nsect - 1; goto new_track;\r\n\t\tcase '\\n' : edit();\tgoto new_sect;\t\t\t\t\t// Edit sector\r\n\t\tcase _K1 :\r\n\t\tcase '?' : display_help(mhelp);\tgoto redraw;\t\t// Help display\r\n\t\tcase _K2 : charset(255); goto redraw;\t\t\t\t// ASCII/EBCDIC\r\n\t\tcase _K3 :\t\t\t\t\t\t\t\t\t\t\t// Find ASCII\r\n\t\t\tif(wform(2, 10, WSAVE|WCOPEN|WBOX1|0x70, search_text, Finput))\r\n\t\t\t\tcontinue;\r\n\t\t\tstrcpy(Fstring, Finput);\r\n\t\t\tSlen = strlen(Fstring);\r\n\t\t\tif(Fcs = Csearch)\r\n\t\t\t\tstrupr(Fstring);\r\n\t\t\tc = 0;\r\n\t\t\tgoto gofind;\r\n\t\tcase _K4 :\t\t\t\t\t\t\t\t\t\t\t// Find HEX\r\n\t\t\tif(wform(2, 10, WSAVE|WCOPEN|WBOX1|0x70, search_byte, Ptr = Finput))\r\n\t\t\t\tcontinue;\r\n\t\t\ti = Slen = 0;\r\n\t\t\twhile(skip()) {\r\n\t\t\t\tif(value(&c, 16, 0, 255, \"byte\"))\r\n\t\t\t\t\tgoto recmd;\r\n\t\t\t\tFstring[i++] = c; }\r\n\t\t\tSlen = i;\r\n\t\t\tFcs = c = 0;\r\n\t\tcase _K5 :\t\t\t\t\t\t\t\t\t\t\t// Repeat search\r\ngofind:\t\tif(Slen) {\r\n\t\t\t\tfind(c);\r\n\t\t\t\tgoto new_track; }\r\n\t\t\tcontinue;\r\n\t\tcase _K6 : wclwin(); find_strings(); goto new_track;\t// Strings\r\n\t\tcase _K10:\r\n\t\tcase 0x1B:\t\t\t\t\t\t\t\t\t\t\t// Exit\r\n\t\t\tclose(fh);\r\n\t\t\twclose();\r\n\t\t\twclose();\r\n\t\t\twclose();\r\n\t\t\treturn; } }\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/README.TXT",
    "content": "ImageDisk\r\n---------\r\nImageDisk is a program to read entire diskette images into files (type .IMD),\r\nand to recreate a copy of the diskette from that image. A detailed analysis\r\nis performed on the diskette, and information about the formatting is recorded\r\nin the image file. This allows ImageDisk to work with virtually any soft-\r\nsectored diskette format that is compatible with the PC's type 765 floppy\r\ndiskette controller and drives.\r\n\r\nThe ImageDisk Disk Image File (.IMD) format specification has been released\r\ninto the public domain and I wish to encourage others to write software which\r\ncreates and manipulates .IMD files, especially under other operating and/or\r\nhost systems.\r\n\r\nThe executable ImageDisk program, utilities and complete documentation are\r\navailable in another archive - for general information on the program, please\r\nrefer to this material.\r\n\r\n\r\nImageDisk Source Code\r\n---------------------\r\nThis archive contains the full ImageDisk source code, including the main\r\nIMD program as well as the AMDA, IMDU, IMDV, TESTFDC, BIN2IMD, TD02IMD,\r\nDMK2IMD and ANY2IMD utilities.\r\n\r\n\r\n                            Terms and Condtiions\r\n\r\nThe ImageDisk source code consisting of the files IMD.C, IMDA.C IMDU.C,\r\nIMDV.C, TESTFDC.C, BIN2IMD.C, TD02IMD.C, DMK2IMD.C and ANY2IMD.C is copyright\r\nmaterial, and is licensed under the following terms and conditions:\r\n\r\n-   No support, technical or otherwise is offered for the source code.\r\n\r\n-   Use of source code is entirely at your own risk. The author makes no\r\n    guarantee of the suitability of this code for any particular purpose.\r\n\r\n-   The code is NOT \"open source\", and is NOT being offered under GPL or\r\n    any other \"open source\" license. The code is for personal use only.\r\n\r\n-   You may use the ideas and algorithms expressed within this code in\r\n    your own software with no restriction.\r\n\r\n-   You may NOT distribute this source code or significant portions\r\n    thereof in any form. You may direct third parties to my web site\r\n    where I will maintain the latest version of the source code.\r\n\r\nAll rights and permissions not listed above are explicitly reserved by the\r\nauthor.\r\n\r\nPlease note:\r\n\r\nThe main intentions of these license terms are:\r\n\r\n-   To avoid a high support load on myself.\r\n\r\n-   To avoid multiple/conflicting public versions of the PC/DOS\r\n    ImageDisk package.\r\n\r\n-   To allow me to remain informed on other ImageDisk developments.\r\n\r\n-   To insure the program remains non-commercial.\r\n\r\nIf you wish to enhance the PC/DOS version of ImageDisk or develop it for\r\nanother platform, please contact me - I am very accomodating.\r\n\r\n\r\nAdditional notes:\r\n-----------------\r\nThis code was developed using my own Micro-C/PC compiler. Micro-C/PC is\r\navailable free from my commercial site www.dunfield.com. This is not a\r\nmainstream toolset and some features and library functions work differently\r\nthan you may expect. ImageDisk makes use of non-standard features and library\r\nfunctions and will not compile under a different toolset without significant\r\nmodification. Please do not contact me for assistance in porting this code to\r\nanother toolset - I maintain the PC/DOS version of ImageDisk for my tools only.\r\n\r\nIf you do compile ImageDisk under Micro-C/PC, please note that some assemblers\r\n(notably MASM) cannot handle the large output file it generates. You will\r\neither have to break the program down into smaller source files, or use\r\na different assembler (Borlands TASM 1.0 works well for me).\r\n\r\nThe source code files are written assuming tabs occuring at 4 character\r\nintervals - these will display with incorrect spacing if you edit the files\r\nwith an editor set to the standard MSDOS tabs at 8 character intervals.\r\nFor those who do not have an editor which can handle tabs at 4 character\r\nintervals, I have included a program REMTAB.COM which will replace all tabs\r\nin the source files with the correct number of spaces to retain proper\r\nformatting.\r\n\r\nImageDisk is a \"created by necessity\" program which deals with a difficult\r\nproblem (accessing non-standard floppy disk formats on widely varying PC\r\nhardware). It was initially hacked together in a weekend, and subsequently\r\nbludgeoned into it's current form over many months of my own experience with\r\nit as well as user reports of it's strengths and weaknesses. Within the source\r\ncode you will find gotos, casted pointers, inline assembly language and other\r\nthings some people don't like - if you find these offensive, strongly disagree\r\nwith my coding style, or otherwise have difficulty with the source code -\r\nplease delete it now. If you have legitimate improvements, or bug reports -\r\nI'm all ears, but I have neither time nor desire to haggle over matters of\r\npersonal opinion.\r\n\r\nEnjoy,\r\n\r\nDave Dunfield\r\n\r\nTo contact me, see the \"contact me\" link on my classic computers website:\r\n    www.classiccmp.org/dunfield\r\n\r\nor use the \"technical support\" link on my commercial website:\r\n    www.dunfield.com\r\n\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/TD02IMD.C",
    "content": "/*\r\n * TD02IMD - Convert Teledisk .TD0 images to ImageDisk .IMD format\r\n *\r\n * TD02IMD reads a teledisk .TD0 image file, and reformats it into an\r\n * ImageDisk .IMD file.\r\n *\r\n * Note that the Teledisk file format is closed and completely undocumented.\r\n * TD02IMD relies on information obtained by reverse engineering and may not\r\n * be able to handle all Teledisk images. I have included my notes on the\r\n * Teledisk file format in the file TD0NOTES.TXT\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. This source\r\n * code is provided for informational purposes only, and I provide no\r\n * support for it, technical or otherwise.\r\n *\r\n * Copyright 2007-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, however this is\r\n * for the purpose of keeping a say in it's disposition. I encourage the\r\n * use of ideas, algorithms and code fragments contained herein to be used\r\n * in the creation of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include <file.h>\r\n#include \"version.h\"\r\n\r\n// Debug flags\r\n#define\tDEBUG_DUMPH 0x80\t\t// Dump disk header\r\n#define\tDEBUG_DUMPT\t0x40\t\t// Dump Track headers\r\n#define\tDEBUG_DUMPS\t0x20\t\t// Dump Sector headers\r\n#define\tDEBUG_SHOWS 0x02\t\t// Show sectors processed\r\n#define\tDEBUG_ONE\t0x01\t\t// Do only one track\r\n\r\n// LZSS parameters\r\n#define SBSIZE\t\t4096\t\t\t\t// Size of Ring buffer\r\n#define LASIZE\t\t60\t\t\t\t\t// Size of Look-ahead buffer\r\n#define THRESHOLD\t2\t\t\t\t\t// Minimum match for compress\r\n\r\n// Huffman coding parameters\r\n#define N_CHAR\t(256-THRESHOLD+LASIZE)\t// Character code (= 0..N_CHAR-1)\r\n#define TSIZE\t\t(N_CHAR*2-1)\t\t// Size of table\r\n#define ROOT\t\t(TSIZE-1)\t\t\t// Root position\r\n#define MAX_FREQ\t0x8000\t\t\t\t// Update when cumulative frequency reaches this value\r\n\r\nunsigned\r\n\tparent[TSIZE+N_CHAR],\t// parent nodes (0..T-1) and leaf positions (rest)\r\n\tson[TSIZE],\t\t\t\t// pointers to child nodes (son[], son[]+1)\r\n\tfreq[TSIZE+1];\t\t\t// frequency table\r\n\tBits, Bitbuff,\t\t\t// buffered bit count and left-aligned bit buffer\r\n\tGBcheck,\t\t\t\t// Getbyte check down-counter\r\n\tGBr,\t\t\t\t\t// Ring buffer position\r\n\tGBi,\t\t\t\t\t// Decoder index\r\n\tGBj,\t\t\t\t\t// Decoder index\r\n\tGBk;\t\t\t\t\t// Decoder index\r\n\r\nunsigned char\r\n\tDebug,\t\t\t\t\t// Debug mode\r\n\tWarn,\t\t\t\t\t// Warning level\r\n\tWmask,\t\t\t\t\t// Warning mask\r\n\tGBstate,\t\t\t\t// Decoder state\r\n\tEof,\t\t\t\t\t// End-of-file indicator\r\n\tAdvcomp,\t\t\t\t// Advanced compression enabled\r\n\tring_buff[SBSIZE+LASIZE-1];\t// text buffer for match strings\r\n\r\nFILE\r\n\t*fpi,\t\t\t\t\t// Input file pointer\r\n\t*fpo;\t\t\t\t\t// Output file pointer\r\n\r\n/*\r\n * LZSS decoder - based in part on Haruhiko Okumura's LZHUF.C\r\n */\r\n\r\nunsigned char d_code[256] = {\t\t// Huffman decoder tables\r\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r\n0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r\n0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,\r\n0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,\r\n0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,\r\n0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\r\n0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,\r\n0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,\r\n0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F,\r\n0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13,\r\n0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17,\r\n0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F,\r\n0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27,\r\n0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F,\r\n0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F };\r\n\r\nunsigned char d_len[] = { 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7 };\r\n\r\n/*\r\n * Initialise the decompressor trees and state variables\r\n */\r\nvoid init_decompress()\r\n{\r\n\tunsigned i, j;\r\n\r\n\tfor(i = j = 0; i < N_CHAR; ++i) {\t\t// Walk up\r\n\t\tfreq[i] = 1;\r\n\t\tson[i] = i + TSIZE;\r\n\t\tparent[i+TSIZE] = i; }\r\n\r\n\twhile(i <= ROOT) {\t\t\t\t\t\t// Back down\r\n\t\tfreq[i] = freq[j] + freq[j+1];\r\n\t\tson[i] = j;\r\n\t\tparent[j] = parent[j+1] = i++;\r\n\t\tj += 2; }\r\n\r\n\tmemset(ring_buff, ' ', sizeof ring_buff);\r\n\tAdvcomp = freq[TSIZE] = 0xFFFF;\r\n\tparent[ROOT] = Bitbuff = Bits = 0;\r\n\tGBr = SBSIZE - LASIZE;\r\n}\r\n\r\n/*\r\n * Increment frequency tree entry for a given code\r\n */\r\nvoid update(int c)\r\n{\r\n\tunsigned i, j, k, f, l;\r\n\r\n\tif(freq[ROOT] == MAX_FREQ) {\t\t// Tree is full - rebuild\r\n\t\t// Halve cumulative freq for leaf nodes\r\n\t\tfor(i = j = 0; i < TSIZE; ++i) {\r\n\t\t\tif(son[i] >= TSIZE) {\r\n\t\t\t\tfreq[j] = (freq[i] + 1) / 2;\r\n\t\t\t\tson[j] = son[i];\r\n\t\t\t\t++j; } }\r\n\r\n\t\t// make a tree - first connect children nodes\r\n\t\tfor(i = 0, j = N_CHAR; j < TSIZE; i += 2, ++j) {\r\n\t\t\tk = i + 1;\r\n\t\t\tf = freq[j] = freq[i] + freq[k];\r\n\t\t\tfor(k = j - 1; f < freq[k]; --k);\r\n\t\t\t++k;\r\n\t\t\tl = (j - k) * sizeof(freq[0]);\r\n\r\n\t\t\tmemmove(&freq[k+1], &freq[k], l);\r\n\t\t\tfreq[k] = f;\r\n\t\t\tmemmove(&son[k+1], &son[k], l);\r\n\t\t\tson[k] = i; }\r\n\r\n\t\t// Connect parent nodes\r\n\t\tfor(i = 0 ; i < TSIZE ; ++i)\r\n\t\t\tif((k = son[i]) >= TSIZE)\r\n\t\t\t\tparent[k] = i;\r\n\t\t\telse\r\n\t\t\t\tparent[k] = parent[k+1] = i; }\r\n\r\n\tc = parent[c+TSIZE];\r\n\tdo {\r\n\t\tk = ++freq[c];\r\n\t\t// Swap nodes if necessary to maintain frequency ordering\r\n\t\tif(k > freq[l = c+1]) {\r\n\t\t\twhile(k > freq[++l]);\r\n\t\t\tfreq[c] = freq[--l];\r\n\t\t\tfreq[l] = k;\r\n\t\t\tparent[i = son[c]] = l;\r\n\t\t\tif(i < TSIZE)\r\n\t\t\t\tparent[i+1] = l;\r\n\t\t\tparent[j = son[l]] = c;\r\n\t\t\tson[l] = i;\r\n\t\t\tif(j < TSIZE)\r\n\t\t\t\tparent[j+1] = c;\r\n\t\t\tson[c] = j;\r\n\t\t\tc = l; } }\r\n\twhile(c = parent[c]);\t// Repeat up to root\r\n}\r\n\r\n/*\r\n * Get a byte from the input file and flag Eof at end\r\n */\r\nunsigned GetChar()\r\n{\r\n\tunsigned c;\r\n\tif((c = getc(fpi)) == EOF) {\r\n\t\tc = 0;\r\n\t\tEof = 255; }\r\n\treturn c;\r\n}\r\n\r\n/*\r\n * Get a single bit from the input stream\r\n */\r\nunsigned GetBit()\r\n{\r\n\tunsigned t;\r\n\tif(!Bits--) {\r\n\t\tBitbuff |= GetChar() << 8;\r\n\t\tBits = 7; }\r\n\r\n\tt = Bitbuff >> 15;\r\n\tBitbuff <<= 1;\r\n\treturn t;\r\n}\r\n\r\n/*\r\n * Get a byte from the input stream - NOT bit-aligned\r\n */\r\nunsigned GetByte()\r\n{\r\n\tunsigned t;\r\n\tif(Bits < 8)\r\n\t\tBitbuff |= GetChar() << (8-Bits);\r\n\telse\r\n\t\tBits -= 8;\r\n\r\n\tt = Bitbuff >> 8;\r\n\tBitbuff <<= 8;\r\n\treturn t;\r\n}\r\n\r\n/*\r\n * Decode a character value from table\r\n */\r\nunsigned DecodeChar()\r\n{\r\n\tunsigned c;\r\n\r\n\t// search the tree from the root to leaves.\r\n\t// choose node #(son[]) if input bit == 0\r\n\t// choose node #(son[]+1) if input bit == 1\r\n\tc = ROOT;\r\n\twhile((c = son[c]) < TSIZE)\r\n\t\tc += GetBit();\r\n\r\n\tupdate(c -= TSIZE);\r\n\treturn c;\r\n}\r\n\r\n/*\r\n * Decode a compressed string index from the table\r\n */\r\nunsigned DecodePosition()\r\n{\r\n\tunsigned i, j, c;\r\n\r\n\t// Decode upper 6 bits from given table\r\n\ti = GetByte();\r\n\tc = d_code[i] << 6;\r\n\r\n\t// input lower 6 bits directly\r\n\tj = d_len[i >> 4];\r\n\twhile(--j)\r\n\t\ti = (i << 1) | GetBit();\r\n\r\n\treturn (i & 0x3F) | c;\r\n}\r\n\r\n/*\r\n * Report error and terminate (formatted output)\r\n */\r\nregister error(unsigned args)\r\n{\r\n\tunsigned char buffer[100];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tif(fpo) fclose(fpo);\r\n\tif(fpi) fclose(fpi);\r\n\tfputs(buffer, stdout);\r\n\texit(-1);\r\n}\r\n\r\n/*\r\n * Get a byte from the input file - decompress if required\r\n *\r\n * This implements a state machine to perform the LZSS decompression\r\n * allowing us to decompress the file \"on the fly\", without having to\r\n * have it all in memory.\r\n */\r\nint getbyte()\r\n{\r\n\tunsigned c;\r\n\r\n\t--GBcheck;\r\n\tif(!Advcomp)\t\t\t// No compression\r\n\t\treturn getc(fpi);\r\n\r\n\tfor(;;) {\t\t\t\t// Decompressor state machine\r\n\t\tif(Eof)\t\t\t\t\t// End of file has been flagged\r\n\t\t\treturn -1;\r\n\t\tif(!GBstate) {\t\t\t// Not in the middle of a string\r\n\t\t\tc = DecodeChar();\r\n\t\t\tif(c < 256) {\t\t// Direct data extraction\r\n\t\t\t\tring_buff[GBr++] = c;\r\n\t\t\t\tGBr &= (SBSIZE-1);\r\n\t\t\t\treturn c; }\r\n\t\t\tGBstate = 255;\t\t// Begin extracting a compressed string\r\n\t\t\tGBi = (GBr - DecodePosition() - 1) & (SBSIZE-1);\r\n\t\t\tGBj = c - 255 + THRESHOLD;\r\n\t\t\tGBk = 0; }\r\n\t\tif(GBk < GBj) {\t\t\t// Extract a compressed string\r\n\t\t\tring_buff[GBr++] = c = ring_buff[(GBk++ + GBi) & (SBSIZE-1)];\r\n\t\t\tGBr &= (SBSIZE-1);\r\n\t\t\treturn c; }\r\n\t\tGBstate = 0; }\t\t\t// Reset to non-string state\r\n}\r\n\r\n/*\r\n * Get a word from the input file via getbyte (for compression)\r\n */\r\nunsigned getword()\r\n{\r\n\tunsigned w;\r\n\tw = getbyte();\r\n\treturn (getbyte() << 8) | w;\r\n}\r\n\r\n/*\r\n * Get a block from the input file via getbyte (for compression)\r\n */\r\nint getblock(unsigned char *p, unsigned size, unsigned char *e)\r\n{\r\n\tint c;\r\n\tchar eof;\r\n\teof = 0;\r\n\twhile(size) {\r\n\t\t--size;\r\n\t\tif((c = getbyte()) == -1) {\r\n\t\t\teof = 255;\r\n\t\t\tif(e)\r\n\t\t\t\terror(\"EOF reading %s\", e);\r\n\t\t\tbreak; }\r\n\t\t*p++ = c; }\r\n\treturn eof;\r\n}\r\n\r\n// Teledisk sector flag meanings\r\n#define\tSEC_DUP\t\t0x01\t\t// Sector was duplicated\r\n#define\tSEC_CRC\t\t0x02\t\t// Sector has CRC error\r\n#define\tSEC_DAM\t\t0x04\t\t// Sector has Deleted Address Mark\r\n#define\tSEC_DOS\t\t0x10\t\t// Sector not allocated\r\n#define\tSEC_NODAT\t0x20\t\t// Sector has no data field\r\n#define\tSEC_NOID\t0x40\t\t// Sector has no ID field\r\n\r\n// Main image file header\r\nstruct td0_header {\r\n\tunsigned \t\tSig;\t\t// TD Signature\r\n\tunsigned char\tSequence;\t// Volume sequence number\r\n\tunsigned char\tChecksig;\t// Check signature for multi-volume sets\r\n\tunsigned char\tTDversion;\t// Teledisk version\r\n\tunsigned char\tDatarate;\t// Data rate\r\n\tunsigned char\tDrivetype;\t// Source drive type\r\n\tunsigned char\tStepping;\t// Stepping type\r\n\tunsigned char\tDOSmode;\t// Read according to DOS allocation\r\n\tunsigned char\tSides;\t\t// # of sizes read\r\n\tunsigned Hcrc;\t\t\t\t// Header crc\r\n} Header;\r\nunsigned char Htemplate[] = {\t// Debug output template\r\n\"sig:\\x81 seq:\\x80 cseq:\\x80 ver:\\x80 Den:\\x80 Dtyp:\\x80 Tden:\\x80 DOS:\\x80 Side:\\x80 Crc:\\x81\\n\" };\r\n\r\n// Individual track header\r\nstruct track_header {\r\n\tunsigned char\tTsectors;\t// number sectors/track\r\n\tunsigned char\tTcylinder;\t// Physical cylinder\r\n\tunsigned char\tTside;\t\t// Physical side\r\n\tunsigned char\tTcrc;\t\t// Crc of header\r\n} Thead;\r\nunsigned char Ttemplate[] = {\t// Debug output template\r\n\"T#sec:\\x80 cyl:\\x80 side:x80 crc:\\x80\\n\" };\r\n\r\n// Individual sector header\r\nstruct sector_header {\r\n\tunsigned char\tScylinder;\t// Cylinder number in ID field\r\n\tunsigned char\tSside;\t\t// Side number in ID field\r\n\tunsigned char\tSsector;\t// Sector number in ID field\r\n\tunsigned char\tSsize;\t\t// Size of sector\r\n\tunsigned char\tSflags;\t\t// Sector control flags\r\n\tunsigned char\tScrc;\t\t// Sector header CRC\r\n} Shead;\r\nunsigned char Stemplate[] = {\t// Debug output template\r\n\"Scyl:\\x80 side:\\x80 num:\\x80 size:\\x80 flag:\\x80 crc:\\x80\" };\r\n\r\n// Data block header - follows sector header only if data present\r\nstruct data_header {\r\n\tunsigned\t\tDoffset;\t// Offset to next data block\r\n\tunsigned char\tDmethod;\t// Method of compression\r\n} Dhead;\r\nunsigned char Dtemplate[] = {\t// Debug output template\r\n\" offset:\\x81 method:\\x80\\n\" };\r\n\r\nunsigned\r\n\tTracks,\t\t\t// Total # of tracks processed\r\n\tSectors,\t\t// Total number of sectors processed\r\n\tMode,\t\t\t// Current track mode\r\n\tSize,\t\t\t// Current sector size\r\n\tCylinder,\t\t// Current cylinder\r\n\tHead,\t\t\t// Current head\r\n\tStop,\t\t\t// Top of sector numbering map\r\n\tDlow,\t\t\t// Debug output - track low\r\n\tDhigh = 255,\t// Debug output - track high\r\n\tMaxsec = -1,\t// Maxumum sector number\r\n\tSremove,\t\t// Removed sector count\r\n\tDseg,\t\t\t// Sector data segment\r\n\tDtop,\t\t\t// Segment top\r\n\tDoffset[256];\t// Data offset\r\n\r\nunsigned char\r\n\tFM = 255,\t\t// Assume FM if disk marked FM\r\n\tVerbose = 255,\t// Verbose output\r\n\tLowden = 255,\t// Convert low-density\r\n\t*ptr,\t\t\t// General pointer\r\n\tRflags,\t\t\t// Remove flags\r\n\tRdup,\t\t\t// Remove duplicates\r\n\tNmap[256],\t\t// Sector numbering map\r\n\tCmap[256],\t\t// Sector cylinder map\r\n\tHmap[256],\t\t// Sector head map\r\n\tSmap[256],\t\t// Sector size map\r\n\tFmap[256],\t\t// Sector flag bytes\r\n\tStype[256];\t\t// Sector type flags\r\n\r\n// Various header value to text tables\r\nunsigned char *dt_text[] = { \"5.25-96/48\", \"5.25\", \"5.25-96\", \"3.5\", \"3.5\", \"8\\\"\", \"3.5\" };\r\nunsigned char *dr_txt[] = { \"LD\", \"LD\", \"HD\" };\r\nunsigned char *dr_step[] = { \"S\", \"D\", \"E\" };\r\n\r\nstatic char CR[] = { \"\\r\\n\" };\r\n\r\nregister warn(unsigned args)\r\n{\r\n\tunsigned char buffer[65];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tif(!(*buffer & Wmask)) {\t\t\r\n\t\tprintf(\"%02u/%u: %s\\n\", Cylinder, Head, buffer+1);\r\n\t\tWmask |= *buffer; }\r\n}\r\n\r\n/*\r\n * Lookup value index in table and return static string\r\n */\r\nunsigned char *txt(unsigned v, unsigned char *t[], unsigned s)\r\n{\r\n\tstatic unsigned char buf[20];\r\n\tif(v >= (s/2))\r\n\t\tsprintf(buf, \"<unknown %02x>\", v);\r\n\telse\r\n\t\tstrcpy(buf, t[v]);\r\n\treturn buf;\r\n}\r\n#define\tTXT(v, t) txt(v, t, sizeof(t))\r\n\r\n/*\r\n * Output character only if debug output enabled\r\n */\r\nvoid Dputc(int c)\r\n{\r\n\tunsigned t;\r\n\tt = Thead.Tcylinder;\r\n\tif((t >= Dlow) && (t <= Dhigh))\r\n\t\tputc(c, stdout);\r\n}\r\n\r\n/*\r\n * Print formatted string via debug output\r\n */\r\nregister Dprintf(unsigned args)\r\n{\r\n\tunsigned char buffer[100], *p;\r\n\t_format_(nargs() * 2 + &args, p = buffer);\r\n\twhile(*p)\r\n\t\tDputc(*p++);\r\n}\r\n\r\n/*\r\n * Dump header information for debug\r\n */\r\nvoid dump(unsigned char *p, unsigned char *t, unsigned char Mask)\r\n{\r\n\tunsigned char c;\r\n\r\n\tif(Debug & Mask)\r\n\t\tfor(;;) switch(c = *t++) {\r\n\t\tcase 0 : return;\r\n\t\tcase 0x80 : Dprintf(\"%02x\", *p++);\t\t\t\t\tcontinue;\r\n\t\tcase 0x81 : Dprintf(\"%04x\", *(unsigned*)p); p += 2;\tcontinue;\r\n\t\tcase 0x82 : Dprintf(\"%d\", *p++);\t\t\t\t\tcontinue;\r\n\t\tcase 0x83 : Dprintf(\"%d\", *(unsigned*)p);\tp += 2;\tcontinue;\r\n\t\tdefault: Dputc(c); }\r\n}\r\n\r\n/*\r\n * Compute Cyclic Redundancy Check (CRC) over block of data\r\n */\r\nunsigned compute_crc(const unsigned char *p, unsigned len, unsigned crc)\r\n{\r\n\tunsigned i;\r\n\twhile(len) {\r\n\t\t--len;\r\n        crc ^= (*p++ << 8);\r\n        for(i = 0; i < 8 ; ++i)\r\n            crc = (crc << 1) ^ ((crc & 0x8000) ? 0xA097 : 0); }\r\n    return crc;\r\n}\r\n\r\n/*\r\n * Display TD0 comment record\r\n */\r\nvoid show_comment(void)\r\n{\r\n\tunsigned c, i, j, nl, crc, len;\r\n\tunsigned char y, mo, d, h, mi, s;\r\n\r\n\tcrc = getword();\t\t// Comment block CRC\r\n\tlen = getword();\t\t// Comemnt block length\r\n\ty\t= getbyte();\t\t// Year\r\n\tmo\t= getbyte();\t\t// Month\r\n\td\t= getbyte();\t\t// Day\r\n\th\t= getbyte();\t\t// Hour\r\n\tmi\t= getbyte();\t\t// Minute\r\n\ts\t= getbyte();\t\t// Second\r\n\r\n\tc = compute_crc(&len, 8, j = nl = 0);\t// Relies on MC allocation!\r\n\r\n\tsprintf(Cmap, \" %u/%02u/%04u %u:%02u:%02u\", d, mo+1, (unsigned)y+1900, h, mi, s);\r\n\tfputs(Cmap, stdout); putc('\\n', stdout);\r\n\r\n\tif(fpo) {\t\t// Write to output file if enabled\r\n\t\tfputs(Cmap, fpo);\r\n\t\tfputs(CR, fpo); }\r\n\r\n\twhile(j < len) {\t\t\t\t// Process each character\r\n\t\t++j;\r\n\t\ti = getbyte();\r\n\t\tc = compute_crc(&i, 1, c);\t// Update CRC\r\n\t\tif(!i) {\t\t\t\t\t// Pending new line\r\n\t\t\t++nl;\r\n\t\t\tcontinue; }\r\n\t\twhile(nl) {\t\t\t\t\t// Flush pending NLs before output\r\n\t\t\t--nl;\r\n\t\t\tputc('\\n', stdout);\r\n\t\t\tif(fpo)\r\n\t\t\t\tfputs(CR, fpo); }\r\n\t\tputc(i, stdout);\t\t\t// Output character\r\n\t\tif(fpo) {\r\n\t\t\tif(i == '\\n')\r\n\t\t\t\tputc('\\r', fpo);\r\n\t\t\tputc(i, fpo); } }\r\n\tif(crc != c)\t\t\t\t\t// Validate\r\n\t\terror(\"\\nComment CRC error!\");\r\n}\r\n\r\n/*\r\n * Read sector from TD0 image and buffer.\r\n */\r\nvoid process_sector(void)\r\n{\r\n\tunsigned c, i, j, End;\r\n\tunsigned char b1, b2;\r\n\tunsigned char sbuf[8192];\r\n\r\n\t++Sectors;\r\n\r\n\t// Read and decode sector header\r\n\tgetblock(Shead, sizeof(Shead), \"sector header\");\r\n\tdump(Shead, Stemplate, DEBUG_DUMPS);\r\n\r\n\tNmap[Stop] = Shead.Ssector;\r\n\tCmap[Stop] = Shead.Scylinder;\r\n\tif((Hmap[Stop] = Shead.Sside) & 0xFE)\r\n\t\twarn(\"\\x01Head not 0 or 1\");\r\n\tif((Smap[Stop] = Shead.Ssize) > 6)\r\n\t\terror(\"Unknown sector size\");\r\n\tFmap[Stop] = Shead.Sflags;\r\n\tSize = 128 << Shead.Ssize;\r\n\tStype[Stop] = (Shead.Sflags & SEC_DAM) ? 3 : 1;\t// IMD sector type\r\n\tif(Shead.Sflags & SEC_CRC)\r\n\t\tStype[Stop] += 4;\t\t\t\t\t\t\t// Indicate data-error\r\n\tEnd = Dtop + Size;\r\n\tDoffset[Stop] = Dtop;\r\n\r\n\tif(Shead.Sflags & SEC_NODAT) {\t\t\t\t\t// No data\r\n\t\tStype[Stop] = 0; }\r\n\telse if(Shead.Sflags & SEC_DOS) {\t\t\t\t// DOS (no data)\r\n\t\twhile(Dtop < End)\r\n\t\t\tpoke(Dseg, Dtop++, 0xE5); }\r\n\telse {\t\t\t\t\t\t\t\t\t\t\t// DATA available\r\n\t\tgetblock(Dhead, sizeof(Dhead), \"data header\");\r\n\t\tdump(Dhead, Dtemplate, DEBUG_DUMPS);\r\n\t\tGBcheck = Dhead.Doffset - 1;\r\n\t\twhile(Dtop < End) switch(Dhead.Dmethod) {\r\n\t\t\tcase 0 :\t\t\t\t\t\t\t\t// Raw sector data\r\n\t\t\t\twhile(Dtop < End)\r\n\t\t\t\t\tpoke(Dseg, Dtop++, getbyte());\r\n\t\t\t\tcontinue;\r\n\t\t\tcase 1 :\t\t\t\t\t\t\t\t// Repeated 2-byte pattern\r\n\t\t\t\tc = getword();\t\t\t\t\t\t\t// Count\r\n\t\t\t\tb1 = getbyte();\t\t\t\t\t\t\t// First byte\r\n\t\t\t\tb2 = getbyte();\t\t\t\t\t\t\t// Second byte\r\n\t\t\t\twhile(c) {\r\n\t\t\t\t\t--c;\r\n\t\t\t\t\tpoke(Dseg, Dtop++, b1);\r\n\t\t\t\t\tpoke(Dseg, Dtop++, b2); }\r\n\t\t\t\tcontinue;\r\n\t\t\tcase 2 :\t\t\t\t\t\t\t// RLE block\r\n\t\t\t\tif(!(c = getbyte())) {\t\t\t\t// Literal data block\r\n\t\t\t\t\tc = getbyte();\t\t\t\t\t// Count\r\n\t\t\t\t\twhile(c) {\r\n\t\t\t\t\t\t--c;\r\n\t\t\t\t\t\tpoke(Dseg, Dtop++, getbyte()); }\r\n\t\t\t\t\tcontinue; }\r\n\t\t\t\t// Repeated fragment\r\n\t\t\t\ti = 1 << c;\t\t\t\t\t\t\t// Length\r\n\t\t\t\tc = getbyte();\t\t\t\t\t\t// Count\r\n\t\t\t\tgetblock(sbuf, i, \"sector data\");\t// Fragment\r\n\t\t\t\twhile(c) {\t\t\t\t\t\t\t// # fragments\r\n\t\t\t\t\t--c;\r\n\t\t\t\t\tfor(j=0; j < i; ++j)\t\t\t// Copy in one\r\n\t\t\t\t\t\tpoke(Dseg, Dtop++, sbuf[j]); }\r\n\t\t\t\tcontinue;\r\n\t\t\tdefault:\r\n\t\t\t\tprintf(\"Unknown data mode: %02x\\n\", Dhead.Dmethod); } }\r\n\tif(Debug & DEBUG_SHOWS)\r\n\t\tDprintf(\" %u %x %u\\n\", Stop, Stype[Stop], Dtop);\r\n\t++Stop;\r\n\tif(GBcheck)\r\n\t\terror(\"Sector data size/offset mismatch\");\r\n}\r\n\r\n/*\r\n * Test for block of data being the same\r\n */\r\nint issame(unsigned char *d, unsigned char v, unsigned s)\r\n{\r\n\twhile(s) {\r\n\t\t--s;\r\n\t\tif(*d++ != v)\r\n\t\t\treturn 0; }\r\n\treturn 255;\r\n}\r\n\r\n/*\r\n * Write sector data to output file\r\n */\r\nvoid write_data(unsigned index)\r\n{\r\n\tunsigned t, s, d, p, Size, End;\r\n\tunsigned char b;\r\n\r\n\tif(t = Stype[index]) {\t\t// Data available\r\n\t\ts = Smap[index];\r\n\t\tSize = 128 << s;\r\n\t\tEnd = (p = d = Doffset[index]) + Size;\r\n\t\tb = peek(Dseg, p++);\r\n\t\twhile(p < End) {\r\n\t\t\tif(peek(Dseg, p++) != b)\r\n\t\t\t\tgoto full; }\r\n\t\tputc(t+1, fpo);\r\n\t\tputc(b, fpo);\r\n\t\treturn;\r\nfull:\tputc(t, fpo);\r\n\t\twhile(d < End)\r\n\t\t\tputc(peek(Dseg, d++), fpo);\r\n\t\treturn; }\r\n}\r\n\r\n/*\r\n * Remove any sectors from a track according to configured options.\r\n */\r\nvoid remove_sectors(void)\r\n{\r\n\tunsigned i, j, n;\r\n\tunsigned char sdup[256];\r\n\tif(Rdup)\r\n\t\tmemset(sdup, 0, sizeof(sdup));\r\n\tfor(i=j=0; i < Stop; ++i) {\r\n\t\tif(Fmap[i] & Rflags) {\t\t\t\t\t// Remove by flags\r\nremove:\t\t++Sremove;\r\n\t\t\tcontinue; }\r\n\t\tif(Nmap[i] > Maxsec) goto remove;\t\t// Out of range\r\n\t\tif(Rdup) {\t\t\t\t\t\t\t\t// Remove duplicates\r\n\t\t\tn = Nmap[i];\r\n\t\t\tif(sdup[n]) {\t\t\t\t\t\t// Sector is duplicated\r\n\t\t\t\tif(Rdup & 0xF0) {\t\t\t\t// Keep last\r\n\t\t\t\t\tn = sdup[n]-1;\r\n\t\t\t\t\tCmap[n] = Cmap[i];\r\n\t\t\t\t\tHmap[n] = Hmap[i];\r\n\t\t\t\t\tSmap[n] = Smap[i];\r\n\t\t\t\t\tFmap[n] = Fmap[i];\r\n\t\t\t\t\tStype[n] = Stype[i];\r\n\t\t\t\t\tDoffset[n] = Doffset[i]; }\r\n\t\t\t\tcontinue; }\r\n\t\t\tsdup[n] = i+1; }\r\n\t\t// Keep this sector\r\n\t\tNmap[j] = Nmap[i];\r\n\t\tCmap[j] = Cmap[i];\r\n\t\tHmap[j] = Hmap[i];\r\n\t\tSmap[j] = Smap[i];\r\n\t\tFmap[j] = Fmap[i];\r\n\t\tStype[j] = Stype[i];\r\n\t\tDoffset[j] = Doffset[i];\r\n\t\t++j; }\r\n\tStop = j;\r\n}\r\n\r\n/*\r\n * Get number from command line\r\n */\r\nunsigned getnum(unsigned b)\r\n{\r\n\tunsigned v, c;\r\n\tchar f;\r\n\tv = f = 0;\r\n\tfor(;;) {\r\n\t\tif(isdigit(c = *ptr))\r\n\t\t\tc -= '0';\r\n\t\telse if((c >= 'a') && (c <= 'f'))\r\n\t\t\tc -= ('a'-10);\r\n\t\telse if((c >= 'A') && (c <= 'F'))\r\n\t\t\tc -= ('A'-10);\r\n\t\telse {\r\n\t\t\tif(!f) switch(c) {\r\n\t\t\t\tcase '$' : b = 16; ++ptr; continue;\r\n\t\t\t\tcase '.' : b = 10; ++ptr; continue; }\r\n\t\t\tswitch(c) {\r\n\t\t\tcase 0 :\r\n\t\t\tcase ',' :\r\n\t\t\t\tif(!f)\r\n\t\t\t\t\terror(\"Bad numeric argument\");\r\n\t\t\t\treturn v; }\r\n\t\t\terror(\"Bad numeric argument\"); }\r\n\t\tif(c >= b)\r\n\t\t\terror(\"Bad numeric argument\");\r\n\t\tv = (v * b) + c;\r\n\t\tf = 255;\r\n\t\t++ptr; }\r\n}\r\n\r\n/*\r\n * Copy filename & append extension if required\r\n */\r\nvoid filename(unsigned char *file, unsigned char *ext, char dropext)\r\n{\r\n\tunsigned char ef, *dest, *p;\r\n\tdest = Smap;\r\n\tef = p = 0;\r\n\tfor(;;) switch(*dest++ = *file++) {\r\n\t\tcase 0 :\t\t\t\t\t\t// End of string\r\n\t\t\tif(dropext && p)\t\t\t// Remove extension from source\r\n\t\t\t\t*(p-1) = 0;\r\n\t\t\tif(!ef)\t\t\t\t\t\t// No extension - add\r\n\t\t\t\tstrcpy(dest-1, ext);\r\n\t\t\treturn;\r\n\t\tcase ':' :\t\t\t\t\t\t// Disk specifier\r\n\t\tcase '\\\\' : p = ef = 0;\t\t\t// Directory specifier\r\n\t\t\tcontinue;\r\n\t\tcase '.' :\t\t\t\t\t\t// Extension specifier\r\n\t\t\tp = file;\r\n\t\t\tef = 255; }\r\n}\r\n\r\nchar help[] = { \"\\\r\nTD0-2-IMageDisk \"#VERSION\" / \"#__DATE__\"\\n\\\r\nCopyright 2007-\"#CYEAR\" Dave Dunfield - All rights reserved.\\n\\n\\\r\nUse:\tTD02IMD filename[.TD0] [options]\\n\\n\\\r\nOpts:\t/Dx,l,h\t- enable Debug options\\n\\\r\n\t/F\t- don't assume whole disk is FM if file FM indicator set\\n\\\r\n\t/L\t- don't convert 300kbps (LD in HD drive) to 250 (standard LD)\\n\\\r\n\t/Q\t- Quiet: less informational output.\\n\\\r\n\t/RF\t- remove Repeated (duplicate) sectors, keep First\\n\\\r\n\t/RL\t- remove Repeated (duplicate) sectors, keep Last\\n\\\r\n\tF=ACDIN\t- remove sectors based on status Flags\t\t[none]\\n\\\r\n\t\t  A=deletedaddressmark C=crcerror D=dos I=noid N=nodata\\n\\\r\n\tM=n\t- Maximum sector number (remove any higher)\t[255]\\n\\\r\n\tO=file\t- specify Output filename\t\t\t[filename.IMD]\\n\\\r\n\tW=CDHIN\t- inhibit Warnings:\\n\\\r\n\t\tC: CRC error (bad sector)\\n\\\r\n\t\tD: Duplicate sector numbers\\n\\\r\n\t\tH: Head not 0 or 1\\n\\\r\n\t\tI: No ID field - possible bogus sector\\n\\\r\n\t\tN: No DATA field\\n\\\r\n\" };\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tint c;\r\n\tunsigned i, s;\r\n\tunsigned char f;\r\n\tstatic char *File, *Ofile;\r\n\tstatic char RF[] = { \"|CA|DNI|\" };\t// F= option bits\r\n\tstatic char WN[] = { \"HDINC\" };\t\t// Warning disable\r\n\r\n\t// Parse command line arguments\r\n\tfor(s = 1; s < argc; ++s) {\r\n\t\tptr = argv[s];\r\n\t\tswitch((toupper(*ptr++) << 8) | toupper(*ptr++)) {\r\n\t\tcase '/D' :\r\n\t\t\tDebug = getnum(16);\r\n\t\t\tif(*ptr++ == ',') Dlow = Dhigh = getnum(10);\r\n\t\t\tif(*ptr++ == ',') Dhigh = getnum(10);\r\n\t\t\tcontinue;\r\n\t\tcase '/F' :\tFM = 0;\t\t\t\t\tcontinue;\r\n\t\tcase '/L' : Lowden = 0;\t\t\t\tcontinue;\r\n\t\tcase '/Q' :\tVerbose = 0;\t\t\tcontinue;\r\n\t\tcase '/R' : switch(toupper(*ptr++)) {\r\n\t\t\tcase 'F' : Rdup = 0x0F;\t\t\tcontinue;\r\n\t\t\tcase 'L' : Rdup = 255;\t\t\tcontinue; }\r\n\t\t\tabort(help);\r\n\t\tcase 'M=' : Maxsec = getnum(10);\tcontinue;\r\n\t\tcase 'O=' : Ofile = ptr;\t\t\tcontinue;\r\n\t\tcase 'F=' :\r\n\t\t\twhile(c = toupper(*ptr++)) {\r\n\t\t\t\ti = 0;\r\n\t\t\t\twhile(RF[i] != c) {\r\n\t\t\t\t\tif(!RF[i++])\r\n\t\t\t\t\t\tabort(help); }\r\n\t\t\t\tRflags |= 1 << i; }\r\n\t\t\t\tcontinue;\r\n\t\tcase 'W=' :\r\n\t\t\tdo {\r\n\t\t\t\tc = toupper(*ptr);\r\n\t\t\t\tfor(i=0; f = WN[i]; ++i) {\r\n\t\t\t\t\tif(f == c) {\r\n\t\t\t\t\t\tWarn |= (1 << i);\r\n\t\t\t\t\t\tgoto nxt; } }\r\n\t\t\t\tabort(help); nxt: }\r\n\t\t\twhile(*++ptr);\r\n\t\t\tcontinue;\r\n\t\t} if(File)\r\n\t\t\tabort(help);\r\n\t\tFile = ptr-2; }\r\n\r\n\tif(!File)\r\n\t\tabort(help);\r\n\r\n\tif(!(Dseg = alloc_seg(4096)))\r\n\t\tabort(\"Out of memory\");\r\n\r\n\t// Open .TD0 file, read and validate header\r\n\tIOB_size = 4096;\r\n\tfilename(File, \".TD0\", 255);\r\n\tfpi = fopen(Smap, \"rvqb\");\r\n\tfget(Header, sizeof(Header), fpi);\r\n\tdump(Header, Htemplate, DEBUG_DUMPH);\r\n\tc = 0;\r\n\tif(compute_crc(Header, 10, 0) != Header.Hcrc) {\r\n\t\tprintf(\"Header CRC failure\");\r\n\t\tc = 255; }\r\n\tswitch(Header.Sig) {\r\n\tdefault:\r\n\t\tprintf(\"No TD signature\");\r\n\t\tc = 255;\r\n\t\tbreak;\r\n\tcase 'dt' :\r\n\t\tinit_decompress();\r\n\tcase 'DT' : }\r\n\tif(c) exit(-1);\r\n\r\n\t// Generate initial comment, then display comment record\r\n\tptr += sprintf(ptr = Cmap, \"TD %u.%u %s\", Header.TDversion >> 4,\r\n\t\tHeader.TDversion & 15, TXT(Header.Drivetype, dt_text));\r\n\tc = Header.Datarate;\r\n\tptr += sprintf(ptr, \" %s %sFM\", TXT(c & 0x7F, dr_txt), (c & 0x80) ? \"\" : \"M\");\r\n\tptr += sprintf(ptr, \" %s-step, %u sides\", TXT(Header.Stepping & 0x7F, dr_step), Header.Sides);\r\n\tif(Advcomp) ptr += sprintf(ptr, \" ADV\");\r\n\tif(Header.DOSmode) ptr += sprintf(ptr, \", DOS\");\r\n\tif(Verbose)\r\n\t\tfputs(Cmap, stdout);\r\n\tfilename(Ofile || File, \".IMD\", 0);\r\n\tfpo = fopen(Smap, \"wvqb\");\r\n\tif(fpo) {\r\n\t\tfputs(\"IMD \", fpo);\r\n\t\tfputs(Cmap, fpo); }\r\n\tif(Header.Stepping & 0x80) show_comment();\r\n\tif(Verbose)\r\n\t\tputc('\\n', stdout);\r\n\tif(fpo) {\r\n\t\tfputs(CR, fpo);\r\n\t\tputc(0x1A, fpo); }\t\t// EOF marker\r\n\r\n\tif((Header.Datarate & 0x7F) > 2)\r\n\t\terror(\"Unknown data rate\");\r\n\r\n\t// Process each track and build .IMD track record\r\n\twhile(!getblock(Thead, sizeof(Thead), 0)) {\r\n\t\tdump(Thead, Ttemplate, DEBUG_DUMPT);\r\n\t\tif(Thead.Tsectors == 0xFF)\t\t\t// EOF marker\r\n\t\t\tbreak;\r\n\t\tif((compute_crc(Thead, 3, 0) & 0xFF) != Thead.Tcrc)\r\n\t\t\terror(\"Track header CRC error\");\r\n\t\tif(Thead.Tside & 0x7E)\r\n\t\t\terror(\"Unknown track-side indicator\");\r\n\r\n\t\t// Compute IMD mode byte\r\n\t\tMode = (2 - (Header.Datarate & 0x0F)) + 3;\t// Inital mode based on rate\r\n\t\tif((Mode == 4) && Lowden)\t\t\t\t\t// 300->250\r\n\t\t\tMode = 3;\r\n\t\tif(Thead.Tside & 0x80)\t\t\t\t\t\t// Sector FM indicator\r\n\t\t\tMode -= 3;\r\n\t\telse if((Header.Datarate & 0x80) && FM)\t\t// Disk FM indicator\r\n\t\t\tMode -= 3;\r\n\r\n\t\tCylinder = Thead.Tcylinder;\r\n\t\tHead = Thead.Tside & 1;\r\n\t\tDtop = Stop = 0;\t\t\t\t\t\t\t// Reset buffers\r\n\t\tWmask = Warn;\r\n\t\t++Tracks;\r\n\r\n\t\t// Read each sector, buffer & build maps\r\n\t\tfor(s=0; s < Thead.Tsectors; ++s)\r\n\t\t\tprocess_sector();\r\n\t\tif(!issame(Smap, Size = Smap[0], Stop))\t// 765 cannot do mixed sector sizes\r\n\t\t\terror(\"Cannot do mixed sector size within track\");\r\n\t\tif(!issame(Cmap, Cylinder, Stop))\t\t// Cylinder map required\r\n\t\t\tHead |= 0x80;\r\n\t\tif(!issame(Hmap, Head & 0x0F, Stop))\t// Head map required\r\n\t\t\tHead |= 0x40;\r\n\r\n\t\t// Remove sectors as requested\r\n\t\tremove_sectors();\r\n\r\n\t\tfor(i=0; i < Stop; ++i) {\r\n\t\t\tf = Fmap[i];\r\n\t\t\tif(f & 0x40)\r\n\t\t\t\twarn(\"\\x04No ID field - possible bogus sector\");\r\n\t\t\tif(f & 0x20)\r\n\t\t\t\twarn(\"\\x08No DATA field\");\r\n\t\t\tif(f & 0x02)\r\n\t\t\t\twarn(\"\\x10CRC error (bad sector)\");\r\n\t\t\tfor(s=i+1; s < Stop; ++s) {\r\n\t\t\t\tif(Nmap[i] == Nmap[s]) {\r\n\t\t\t\t\twarn(\"\\x02Duplicate sector numbers\");\r\n\t\t\t\t\tbreak; } } }\r\n\r\n\t\t// Write out the IMD track record\r\n\t\tif(fpo && Stop) {\r\n\t\t\tputc(Mode, fpo);\t\t\t\t\t\t// Sector mode/type\r\n\t\t\tputc(Cylinder, fpo);\t\t\t\t\t// Physical cylinder\r\n\t\t\tputc(Head, fpo);\t\t\t\t\t\t// Physical head\r\n\t\t\tputc(Stop, fpo);\t\t\t\t\t\t// # sectors\r\n\t\t\tputc(Size, fpo);\t\t\t\t\t\t// Sector size\r\n\t\t\tfor(s=0; s < Stop; ++s)\t\t\t\t\t// Sector numbering map\r\n\t\t\t\tputc(Nmap[s], fpo);\r\n\t\t\tif(Head & 0x80) {\t\t\t\t\t\t// Cylinder numbering map\r\n\t\t\t\tfor(s=0; s < Stop; ++s)\r\n\t\t\t\t\tputc(Cmap[s], fpo); }\r\n\t\t\tif(Head & 0x40) {\t\t\t\t\t\t// Head numbering map\r\n\t\t\t\tfor(s=0; s < Stop; ++s)\r\n\t\t\t\t\tputc(Hmap[s], fpo); }\r\n\t\t\tfor(s=Dtop=0; s < Stop; ++s)\t\t\t// Output sector data\r\n\t\t\t\twrite_data(s);\r\n\t\t\tif(Debug & DEBUG_ONE)\r\n\t\t\t\tbreak; } }\r\n\r\n\tif(fpo)\r\n\t\tfclose(fpo);\r\n\r\n\tfclose(fpi);\r\n\r\n\tif(Verbose) {\r\n\t\tprintf(\"%u tracks, %u sectors converted\", Tracks, Sectors);\r\n\t\tif(Sremove) printf(\", %u sectors removed\", Sremove);\r\n\t\tprintf(\".\\n\"); }\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/TD0NOTES.TXT",
    "content": "\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n                                    Teledisk\r\n\r\n                               Image File Format\r\n\r\n                                     Notes\r\n\r\n\r\n\r\n\r\n\r\n                                  PRELIMINARY\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n                                 Dave Dunfield\r\n                                 April 2, 2007\r\n\r\n                          Last revised: July 28, 2008\r\n\f\r\n\r\n\r\n                              Teledisk .TD0 notes\r\n\r\n                               TABLE OF CONTENTS\r\n\r\n\r\n                                                                         Page\r\n\r\n     1. Introduction                                                        1\r\n\r\n        1.1 Acknowlegements                                                 1\r\n\r\n     2. Image file Format                                                   2\r\n\r\n\r\n     3. Image Header                                                        2\r\n\r\n        3.1 Signature (2 bytes)                                             2\r\n        3.2 Sequence (1 byte)                                               2\r\n        3.3 CheckSequence (1 byte)                                          3\r\n        3.4 Teledisk version (1 byte)                                       3\r\n        3.5 Data rate (1 byte)                                              3\r\n        3.6 Drive type (1 byte)                                             3\r\n        3.7 Stepping (1 byte)                                               3\r\n        3.8 DOS allocation flag (1 byte)                                    4\r\n        3.9 Sides (1 byte)                                                  4\r\n        3.10 Cyclic Redundancy Check (2 bytes)                              4\r\n\r\n     4. Comment Header / Data block                                         4\r\n\r\n        4.1 Cyclic Redundancy Check (2 bytes)                               4\r\n        4.2 Data length (2 bytes)                                           4\r\n        4.3 Year (1 byte)                                                   5\r\n        4.4 Month (1 byte)                                                  5\r\n        4.5 Day (1 byte)                                                    5\r\n        4.6 Hour, Minite, Second (1 byte each)                              5\r\n        4.7 Comment data block (variable size)                              5\r\n\r\n     5. Track Header                                                        6\r\n\r\n        5.1 Number of sectors (1 byte)                                      6\r\n        5.2 Cylinder number (1 byte)                                        6\r\n        5.3 Side/Head number (1 byte)                                       6\r\n        5.4 Cyclic Redundancy Check (1 byte)                                6\r\n\r\n     6. Sector Header                                                       7\r\n\r\n        6.1 Cylinder number (1 byte)                                        7\r\n        6.2 Side/Head (1 byte)                                              7\r\n        6.3 Sector number (1 byte)                                          7\r\n        6.4 Sector size (1 byte)                                            8\r\n        6.5 Flags                                                           8\r\n        6.6 Cyclic Redundancy Check (1 byte)                                8\r\n\r\n     7. Sector Data Header                                                  9\r\n\f\r\n    Teledisk .TD0 notes                                    Table of Contents\r\n\r\n                                                                         Page\r\n        7.1 Data block size (2 bytes)                                       9\r\n        7.2 Encoding method (1 byte)                                        9\r\n\f    Teledisk .TD0 notes                                              Page: 1\r\n\r\n\r\n    1. Introduction\r\n\r\n       Teledisk is a program which reads non-PC format diskettes into  image\r\n       files for archival and can later recreate a copy of the original disk\r\n       from the image file.  Once popular for archival of  classic  computer\r\n       software,  Teledisk has  been  withdrawn  from  the  market  by  it's\r\n       manufacturer and is no longer  legally  available.  This  presents  a\r\n       problem for those  people  who  have  data  archived  with  Teledisk,\r\n       because the file format is proprietary and not  documented  rendering\r\n       the data useless without the program.\r\n\r\n       In my development of ImageDisk  (a replacement for Teledisk),  I have\r\n       created a utility to convert Teledisk .TD0 images into ImageDisk .IMD\r\n       format - in doing so,  I have researched the  Teledisk  format,  read\r\n       other peoples notes,  done some reverse engineering myself,  and come\r\n       to what I  believe  is  a  somewhat  complete  understanding  of  the\r\n       contents of a .TD0 image file.\r\n\r\n       This document presents my notes  on  the  Teledisk  .TD0  image  file\r\n       format.\r\n\r\n       This document is a work in progress.  If you have any information  to\r\n       add,  corrections etc.  Please contact me.  I can be reached via  the\r\n       contact information on my web site.\r\n\r\n                       http://www.classiccmp.org/dunfield\r\n\r\n       1.1 Acknowlegements\r\n\r\n          The following people whom I have never met have saved me  tons  of\r\n          time by  making  the  results  of  their  related  efforts  freely\r\n          available.\r\n\r\n        Will Krantz    - Wrote a program called wteledisk which converts\r\n                         TX50 .TD0 into binary files for an emulator.\r\n                         Published a web page with his notes and source.\r\n\r\n        Sergey Erokhin - Provided more details for Wills web page.\r\n\r\n        Simon Owen     - Published source code to read some .TD0 files\r\n                         for his SimCoupe emulator.\r\n\r\n        Haruhika       - Published LZSS-Huffman source code which has\r\n        Okumura          become \"the reference\" for many implementations.\r\n\f    Teledisk .TD0 notes                                              Page: 2\r\n\r\n\r\n    2. Image file Format\r\n\r\n       The overall disk image file has this format:\r\n\r\n        Image header                (12 bytes)\r\n        ;If the image was created using \"Advanced Compression\", everything\r\n        ;below this line is compressed with LZSS-Huffman encoding.\r\n        Optional comment header     (10 bytes)\r\n        Optional comment data       (Variable size)\r\n          ;For each track on the disk ...\r\n          Track header              (4 bytes)\r\n            ;For each sector within the track\r\n            Sector header           (6 bytes)\r\n            Optional data header    (3 bytes)\r\n            Optional data block     (variable size)\r\n        ;Image ends with Trackheader beginning with 255 (FF hex)\r\n\r\n       If the Teledisk image was generated with \"Advanced Data Compression\",\r\n       all parts of the file following  \"Image Header\"  are compressed as  a\r\n       single block with LZSS-Huffman encoding with the string lookup buffer\r\n       preset to all spaces  (ASCII  20).  With  \"normal\"  compression,  the\r\n       remainder of the file  is  not  compressed/encoded  (other  than  the\r\n       sector RLE compression).\r\n\r\n    3. Image Header\r\n\r\n       The image header describes global information about the  disk  image.\r\n       It is never compressed, and is laid out in the following format:\r\n\r\n        Signature                   (2 bytes)\r\n        Sequence                    (1 byte)\r\n        Checksequence               (1 byte)\r\n        Teledisk version            (1 byte)\r\n        Data rate                   (1 byte)\r\n        Drive type                  (1 byte)\r\n        Stepping                    (1 byte)\r\n        DOS allocation flag         (1 byte)\r\n        Sides                       (1 byte)\r\n        Cyclic Redundancy Check     (2 bytes)\r\n\r\n       3.1 Signature (2 bytes)\r\n\r\n          - Contains 'TD' for normal compression\r\n\r\n          - Contains 'td' for advanced compression\r\n\r\n       3.2 Sequence (1 byte)\r\n\r\n        - Early Teledisk document indicates that this  begins  with  00  and\r\n          increments for each member of a multi-volume set.\r\n\r\n        - TDCHECK reports  \"bad header\"  if this value is  set  to  anything\r\n          other than 00.\r\n\f    Teledisk .TD0 notes                                              Page: 3\r\n\r\n\r\n       3.3 CheckSequence (1 byte)\r\n\r\n        - Early Teledisk document indicates that this must be the  same  for\r\n          each member of a multi-volume set\r\n\r\n       3.4 Teledisk version (1 byte)\r\n\r\n        - Encodes the version number of the Teledisk program  which  created\r\n          the image in the form High-nibble.low-nibble. eg: 15 = 1.5\r\n\r\n       3.5 Data rate (1 byte)\r\n\r\n        - Encodes the data rate used for the diskette in lower 2 bits.\r\n\r\n             0 = 250kbps\r\n             1 = 300kbps\r\n             2 = 500kbps\r\n\r\n        - High bit indicates single-density diskette  (I believe this is for\r\n          older versions only which did not support mixed density disks).\r\n\r\n       3.6 Drive type (1 byte)\r\n\r\n        - Indicates the type of drive the disk was made on.\r\n\r\n        - Early Teledisk document indicates the encoding is:\r\n\r\n             1 = 360k\r\n             2 = 1.2M\r\n             3 = 720k\r\n             4 = 1.44M\r\n\r\n        - Experimentation with TDCHECK indicates  that  the  text  generated\r\n          from the various encoding is:\r\n\r\n             0 = 5.25 96 tpi disk in 48 tpi drive\r\n             1 = 5.25\r\n             2 = 5.25 48-tpi\r\n             3 = 3.5\r\n             4 = 3.5\r\n             5 = 8-inch\r\n             6 = 3.5\r\n\r\n        - Use Data rate to determine appropriate drive density.\r\n\r\n       3.7 Stepping (1 byte)\r\n\r\n        - Encodes step type in lower 2 bits\r\n\r\n             0 = Single-Step\r\n             1 = Double-step\r\n             2 = Even-only step (96 tpi disk in 48 tpi drive)\r\n\r\n        - High bit indicates presence of optional comment block\r\n\f    Teledisk .TD0 notes                                              Page: 4\r\n\r\n\r\n       3.8 DOS allocation flag (1 byte)\r\n\r\n        - non-zero means the disk was read using the DOS FAT table  to  skip\r\n          unallocted sectors.\r\n\r\n       3.9 Sides (1 byte)\r\n\r\n        - Encodes the number of sides read from the disk.\r\n\r\n             01 = One\r\n             anything-else = Two\r\n\r\n       3.10 Cyclic Redundancy Check (2 bytes)\r\n\r\n          This field contains the error-checking cyclic redundancy check for\r\n          the header calculated with the polynomial value 41111  (A097  hex)\r\n          using an input preset value of 0.  The CRC is calculated over  the\r\n          first 10 bytes of the header, and should match the value stored in\r\n          this field.\r\n\r\n    4. Comment Header / Data block\r\n\r\n       The comment block encodes an ASCII comment as well  as  the  creation\r\n       date.  It's presence is indicated by the high bit of  the  \"Stepping\"\r\n       field in the image header being set.\r\n\r\n       When present,  it occurs immediately after the Image  header  in  the\r\n       following format:\r\n\r\n        Cyclic Redundancy Check     (2 bytes)\r\n        Data length                 (2 bytes)\r\n        Year since 1900             (1 byte)\r\n        Month                       (1 byte)\r\n        Day                         (1 byte)\r\n        Hour                        (1 byte)\r\n        Minite                      (1 byte)\r\n        Second                      (1 byte)\r\n\r\n       Following the comment header are comment line records,  consisting of\r\n       ASCII text terminated by NUL (00) bytes.\r\n\r\n       4.1 Cyclic Redundancy Check (2 bytes)\r\n\r\n          This 16-bit field contains the  error-checking  cyclic  redundancy\r\n          check for the header calculated with the  polynomial  value  41111\r\n          (A097 hex) using an input preset value of 0. The CRC is calculated\r\n          over the entire header block  (beginning at offset 2 - just  after\r\n          the CRC) and the data records.\r\n\r\n       4.2 Data length (2 bytes)\r\n\r\n          This is the length of the comment data  block  which  follows  the\r\n          comment header.  To display the comment data, read and output this\r\n          many bytes following the header,  translating NUL (00)  bytes into\r\n          newline sequences.\r\n\f    Teledisk .TD0 notes                                              Page: 5\r\n\r\n\r\n       4.3 Year (1 byte)\r\n\r\n          Gives the year the image was created as an offset from  1900.  eg:\r\n          2007 is encoded as 2007 - 1900 = 107 (6B hex).\r\n\r\n       4.4 Month (1 byte)\r\n\r\n          Gives the month the image was created  using  a  zero  index.  ie:\r\n          0=January, 11=December.\r\n\r\n       4.5 Day (1 byte)\r\n\r\n          Gives the day  (of the month)  the image was created using a range\r\n          of 1-31.\r\n\r\n       4.6 Hour, Minite, Second (1 byte each)\r\n\r\n          Gives the time of day the image was created using 24-hour time.\r\n\r\n       4.7 Comment data block (variable size)\r\n\r\n          Contains the ASCII text of the  comment  as  NUL  (00)  terminated\r\n          lines.  The size of this block is given by  \"Data length\"  in  the\r\n          comment header.  To display the comment,  read  and  output  \"Data\r\n          length bytes\"  from this block,  translating NUL  (00)  bytes into\r\n          newline sequences.\r\n\f    Teledisk .TD0 notes                                              Page: 6\r\n\r\n\r\n    5. Track Header\r\n\r\n       Every disk track recorded in  the  image  will  begin  with  a  track\r\n       header, which has the following format:\r\n\r\n        Number of sectors           (1 byte)\r\n        Cylinder number             (1 byte)\r\n        Side/Head number            (1 byte)\r\n        Cyclic Redundancy Check     (1 byte)\r\n\r\n       5.1 Number of sectors (1 byte)\r\n\r\n          This field indicates how many sectors are recorded for this track.\r\n          This also indicates how many sector headers  to  expect  following\r\n          the track header.\r\n\r\n          A number of sectors of 255 (FF hex) indicates the end of the track\r\n          list.  No other fields occur in this record,  and the CRC  is  not\r\n          checked.\r\n\r\n       5.2 Cylinder number (1 byte)\r\n\r\n          This field encodes the physical cylinder  number  (head  position)\r\n          for this track, in a range of 0-(#tracks on drive-1).\r\n\r\n       5.3 Side/Head number (1 byte)\r\n\r\n          This field encodes the disk side  (0 or 1)  that this track occurs\r\n          on in it's lower bit.\r\n\r\n          The high bit of this field is  used  to  indicate  the  track  was\r\n          recorded in single-density.  This allows mixed-density disks to be\r\n          represented (FM on some tracks, and MFM on others).\r\n\r\n          FM disks that I recorded had this bit set for every track, and NOT\r\n          the FM indicator in bit 7 of the  \"Data rate\"  field of the  image\r\n          header.  I cannot confirm this,  but I suspect that early versions\r\n          of Teledisk did not support mixed density disks, using only the FM\r\n          bit in the image header.  If this is the case, then a track should\r\n          be interpreted as single density if either of the two FM indicator\r\n          bits are set.\r\n\r\n       5.4 Cyclic Redundancy Check (1 byte)\r\n\r\n          This  8-bit  field  contains  the   lower   byte   of   a   16-bit\r\n          error-checking cyclic redundancy check for the  header  calculated\r\n          with the polynomial value 41111  (A097 hex)  using an input preset\r\n          value of 0.  The CRC is calculated over the first three  bytes  of\r\n          the header and should match the forth byte.\r\n\r\n       Track headers and sector block lists occur until all  tracks  on  the\r\n       disk have been accounted for.  When the last track record and  sector\r\n       block list has been read,  a 255  (FF hex)  byte indicates the end of\r\n       the image.\r\n\f    Teledisk .TD0 notes                                              Page: 7\r\n\r\n\r\n    6. Sector Header\r\n\r\n       Following the  Track  header  will  be  a  number  of  sector  blocks\r\n       consisting of a sector header and optional  data  header/data  block.\r\n       The number of sector blocks is indicated by the  \"Number of  sectors\"\r\n       field in the track header.\r\n\r\n       Each sector header has the following format:\r\n\r\n        Cylinder number             (1 byte)\r\n        Side/Head                   (1 byte)\r\n        Sector number               (1 byte)\r\n        Sector size                 (1 byte)\r\n        Flags                       (1 byte)\r\n        Cyclic Redundancy Check     (1 byte)\r\n\r\n       6.1 Cylinder number (1 byte)\r\n\r\n          This field indicates the logical cylinder number which is  written\r\n          in the ID field of the disk  sector.  For  most  disk  formats  it\r\n          matches the Cylinder number indicated in the track header, however\r\n          this  does  NOT  have  to  be  the  case  -  some  formats  encode\r\n          non-physical cylinder numbers.\r\n\r\n       6.2 Side/Head (1 byte)\r\n\r\n          This field indicates the  logical  Side/Head  indicator  which  is\r\n          written in the ID field of the disk sector.  For most disk formats\r\n          it matches the Side/Head number indicated  in  the  track  header,\r\n          however this does NOT have to be the case -  some  formats  encode\r\n          non-physical Side/Head numbers.\r\n\r\n       6.3 Sector number (1 byte)\r\n\r\n          This field indicates the logical sector number which is wrtten  in\r\n          the ID field of the disk sector.  Sector numbers do not have to be\r\n          in any particular order  (the ordering of the  sectors  determines\r\n          the interleave factor of the track), do not necessarily begin at 0\r\n          or 1, and are not necessarily an unbroken series of numbers.  Some\r\n          formats encode seemingly arbitrary sector numbers.\r\n\r\n          Teledisk sometimes creates bogus sectors headers to describe  data\r\n          that is not in a properly formatted sector.  These  extra  sectors\r\n          appear to be created with sector numbers begining at 100.\r\n\f    Teledisk .TD0 notes                                              Page: 8\r\n\r\n\r\n       6.4 Sector size (1 byte)\r\n\r\n          Indicates the size of  the  sector,  according  to  the  following\r\n          table:\r\n\r\n            0 = 128 bytes           4 = 2048 bytes\r\n            1 = 256 bytes           5 = 4096 bytes\r\n            2 = 512 bytes           6 = 8192 bytes\r\n            3 = 1024 bytes\r\n\r\n          Note that disk formats exist which  have  different  sector  sizes\r\n          within the same track,  and Teledisk will encode  them  this  way,\r\n          however the PC 765  floppy  disk  controller  cannot  format  such\r\n          tracks, and the disk can not be recreated.\r\n\r\n       6.5 Flags\r\n\r\n          This is a bit field indicating characteristics that Teledisk noted\r\n          about the sector when it  was  recorded.  The  field  contain  the\r\n          logical OR of the following byte values:\r\n\r\n             01 = Sector was duplicated within a track\r\n             02 = Sector was read with a CRC error\r\n             04 = Sector has a \"deleted-data\" address mark\r\n             10 = Sector data was skipped based on DOS allocation [note]\r\n             20 = Sector had an ID field but not data [note]\r\n             40 = Sector had data but no ID field (bogus header)\r\n\r\n          note:  Bit values 20 or 10 indicate  that  NO  SECTOR  DATA  BLOCK\r\n          FOLLOWS.\r\n\r\n          The meaning of some of these bits was taken  from  early  Teledisk\r\n          documentation,  and may not be accurate - For example,  I've  seen\r\n          images where sectors were duplicated within a track and the 01 bit\r\n          was NOT set.\r\n\r\n       6.6 Cyclic Redundancy Check (1 byte)\r\n\r\n          This  8-bit  field  contains  the   lower   byte   of   a   16-bit\r\n          error-checking cyclic redundancy check for the sector header, data\r\n          header and sector data calculated with the polynomial value  41111\r\n          (A097 hex) using an input preset value of 0. The CRC is calculated\r\n          over the first five bytes of the sector header,  the entire sector\r\n          data header and the sector data block.  The calculated CRC  should\r\n          match the value stored in the fourth byte of the sector header.\r\n\f    Teledisk .TD0 notes                                              Page: 9\r\n\r\n\r\n    7. Sector Data Header\r\n\r\n       The sector data header occurs following the sector header  only  when\r\n       sector data is present.  This is indicated by bits 10 and 20  of  the\r\n       Flags value NOT being set. When present it has the following format:\r\n\r\n        Data block size             (2 bytes)\r\n        Encoding method             (1 byte)\r\n\r\n       7.1 Data block size (2 bytes)\r\n\r\n          This indicates the size of the sector data  block,  including  the\r\n          encoding method (ie: data block size + 1).\r\n\r\n       7.2 Encoding method (1 byte)\r\n\r\n          This field describes how the sector data is encoded.  It can  have\r\n          three possible values:\r\n\r\n          7.2.1 0 - Raw sector data\r\n\r\n             Encoding method == 0 indicates that \"sector size\"  bytes of raw\r\n             sector data follow.  This is the actual data  content  for  the\r\n             sector.\r\n\r\n          7.2.2 1 - Repeated 2-byte pattern\r\n\r\n             Encoding method == 1 indicates that a repeated  2-byte  pattern\r\n             is used.  Note that this may occur  multiple  times  until  the\r\n             entire sector has been  recreated,  as  determined  by  \"sector\r\n             size\" in the sector header.\r\n\r\n             Each entry consits of two 16-bit values.  The first is a  count\r\n             value indicating how many times the second (the data value)  is\r\n             repeated.\r\n\r\n          7.2.3 2 - Run Length Encoded data\r\n\r\n             Encoding == 2 indicates that an RLE  data  block  occurs.  Note\r\n             that this may occur multiple times until the entire sector  has\r\n             been recreated,  as determined by  \"sector size\"  in the sector\r\n             header.\r\n\r\n             Each entry begins with a 1 byte length value or 00.\r\n\r\n             If 00,  then this entry is for a literal block.  The next  byte\r\n             indicates a length 'n',  and the following 'n' bytes are copied\r\n             into  the  sector  data  as  raw  bytes  (similar  to  Encoding\r\n             method==0 except for only a portion of the sector).\r\n\r\n             If not 00,  then the length 'l'  is determined as the value * 2\r\n             (ie:  2-510).  The next byte indicates a repeat  count  'r'.  A\r\n             block of  'l'  bytes is then  read  once  from  the  file,  and\r\n             repeated in the sector data 'r' times.\r\n\r\n          Sector headers and data blocks occur until  all  sectors  for  the\r\n          track have been accounted for.\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/TESTFDC.C",
    "content": "/*\r\n * TESTFDC - a program to evaluate a PC floppy disk controller.\r\n *\r\n * This program evaluates the floppy disk controller in your system to\r\n * determine how well it performs at single/double density at various data\r\n * rates.  It also tests MFM operation with 128 byte sectors.  Many PCs\r\n * cannot access these disk types.  If you plan to use my ImageDisk program\r\n * to archive and restore non-PC format disks, this program should help you\r\n * find a PC thats up to the task.\r\n *\r\n * TESTFDC performs direct hardware access to the floppy disk controller\r\n * chip, and therefore cannot run under operating systems which do not\r\n * permit application programs such access. These include Windows NT,\r\n * 2000 and XP. I strongly recommend running the program under pure DOS.\r\n *\r\n * This program is compiled using my own development tools, and will not\r\n * build under mainstream compilers without significant work. This source\r\n * code is provided for informational purposes only, and I provide no\r\n * support for it, technical or otherwise.\r\n *\r\n * Copyright 2007-2012 Dave Dunfield\r\n * All rights reserved.\r\n *\r\n * For the record: I am retaining copyright on this code, however this is\r\n * for the purpose of keeping a say in it's disposition. I encourage the\r\n * use of ideas, algorithms and code fragments contained herein to be used\r\n * in the creation of compatible programs on other platforms (eg: Linux).\r\n */\r\n#include <stdio.h>\r\n#include <setjmp.h>\r\n#include \"version.h\"\r\n\r\n#define\tTIMEOUT\t36\t\t\t// 2 seconds (55ms ticks)\r\n#define\tMDEL\t100\t\t\t// Minimum delay\r\n\r\n#define\tFDCS\t(FDC+2)\t\t// Offset to FDC status register\r\n#define\tFDCD\t(FDC+3)\t\t// Offset to FDC data   register\r\n\r\n// Report indexes\r\n#define\tSD250\t0\r\n#define\tSD300\t1\r\n#define\tSD500\t2\r\n#define\tDD250\t3\r\n#define\tDD300\t4\r\n#define\tDD500\t5\r\n#define\tXD250\t6\r\n#define\tXD300\t7\r\n#define\tXD500\t8\r\n\r\nunsigned\r\n\tFIseg,\t\t\t\t\t// Floppy interrupt segment\r\n\tFIoff,\t\t\t\t\t// Floppy interrupt offset\r\n\tLkey,\t\t\t\t\t// Last key pressed\r\n\tFDC = 0x3F2,\t\t\t// Base address of FDC\r\n\tSEG,\t\t\t\t\t// External segment (aligned to 64k boundary)\r\n\tDMA,\t\t\t\t\t// DMA segment\r\n\tTimeout,\t\t\t\t// FDC timeout counter\r\n\tRcount,\t\t\t\t\t// Top of FDC result list\t(#results)\r\n\tStop,\t\t\t\t\t// Top of sector list\t\t(#sectors)\r\n\tSKdel = 55;\t\t\t\t// Seek delay\r\n\r\nunsigned char\r\n\tFdone,\t\t\t\t\t// FDC interrupt done\r\n\tDrive = 255,\t\t\t// Selected drive (0-3 = A-D)\r\n\tDtype = 255,\t\t\t// Drive type\r\n\tCylinders = 80,\t\t\t// Number of cylinders\r\n\tCylinder,\t\t\t\t// Current cylinder\r\n\tHead,\t\t\t\t\t// Current head\r\n\tSector,\t\t\t\t\t// Current sector\r\n\tSsize,\t\t\t\t\t// Sector size\r\n\tMode,\t\t\t\t\t// Data rate / Density\r\n\tMfm,\t\t\t\t\t// Double-density indicator\r\n\tStest = 255,\t\t\t// Test Single-Density\r\n\tDtest = 255,\t\t\t// Test Double-Density\r\n\tXtest = 255,\t\t\t// Test MFM-128 byte sector mode\r\n\t*Rfile,\t\t\t\t\t// Report file\r\n\tGl = 0x1B,\t\t\t\t// Gap length\r\n\tGlf = 0x54,\t\t\t\t// Gap length (format)\r\n\tFfill = 0xE5,\t\t\t// Format fill byte\r\n\tSPsrt = 8,\t\t\t\t// Step rate\r\n\tSPhlt = 127,\t\t\t// Head load time\r\n\tSPhut = 15,\t\t\t\t// Head unload time\r\n\tEskip,\t\t\t\t\t// Error skip mode\r\n\tResult[15],\t\t\t\t// Results from FDC\r\n\tResync,\t\t\t\t\t// Resync state counter\r\n\tTexit,\t\t\t\t\t// Test new exit code\r\n\tSmap[256],\t\t\t\t// Sector numbering map\r\n\tReport[9];\t\t\t\t// Final report\r\n\r\njmp_buf\r\n\txjump;\t\t\t\t\t// Exit to main\r\n\r\nFILE\r\n\t*fp;\t\t\t\t\t// General file pointer\r\n\r\nunsigned Mtext[] = {\t\t// Translate Mode%3 to actual data rate\r\n\t500, 300, 250 };\r\n\r\n// Digital Output Register - Drive select (0-3) values\r\nunsigned char DORsel[] = { 0x14, 0x25, 0x46, 0x87 };\r\n\r\nunsigned char *drives[] = {\t\t// Drive type table\r\n\t\"360\",\r\n\t\"720\",\r\n\t\"1.2\",\r\n\t\"1.44\",\r\n\t0 };\r\n\r\nunsigned char *Mdesc[] = {\t\t// Mode descriptions\r\n\t\"Single-Density\",\r\n\t\"Double-Density\",\r\n\t\"Double/128byte\" };\r\n\r\n// Mode tables:\t\t\t  #s  Si  Md  Gl  Glf Mode Report\r\nunsigned char SL300[] = { 12,  0,  2,  7,  9,   0, SD250 };\r\nunsigned char SH300[] = { 15,  0,  0, 16, 25,   0, SD500 };\r\nunsigned char DL300[] = {  9,  2,  5, 27, 28,   1, DD250 };\r\nunsigned char DH300[] = { 18,  2,  3, 27, 28,   1, DD500 };\r\nunsigned char XL300[] = { 23,  0,  5, 27, 28,   2, XD250 };\r\nunsigned char XH300[] = { 50,  0,  3, 27, 60,   2, XD500 };\r\n\r\nunsigned char SL360[] = { 12,  0,  1,  7,  9,   0, SD300 };\r\nunsigned char SH360[] = { 26,  0,  0,  7, 27,   0, SD500 };\r\nunsigned char DL360[] = {  9,  2,  4, 27, 28,   1, DD300 };\r\nunsigned char DH360[] = { 15,  2,  3, 42, 80,   1, DD500 };\r\nunsigned char XL360[] = { 23,  0,  4, 27, 28,   2, XD300 };\r\nunsigned char XH360[] = { 41,  0,  3, 27, 28,   2, XD500 };\r\n\r\nunsigned char help[] = { \"\\n\\\r\nEvaluates the floppy controller in your system to determine how it performs at\\n\\\r\nsingle/double density at various data rates. Also tests MFM operation with 128\\n\\\r\nbyte sectors. If you plan to use ImageDisk to archive and restore non-PC format\\n\\\r\ndisks, this program should help you find a PC thats up to the task.\\n\\\r\n\\nUse: TESTFDC drive [type-override] [options]\\n\\n\\\r\ndrive:\tPhysical floppy drive to test (A: - D:)\\n\\n\\\r\ntype\t\t360 = DD 40 track\t 1.2 = HD 80-track (5.25)\\n\\\r\noverride:\t720 = DD 80 track\t1.44 = HD 80-track (3.5)\\n\\n\\\r\nopts:\t/D\t- skip standard Double-density test (should always work)\\n\\\r\n\t/R\t- please Read this!\\n\\\r\n\tR=file\t- Write final report to file.\\n\\\r\n\t/S\t- skip Single-density test\\n\\\r\n\t/X\t- eXclude MFM/128 test\\n\\\r\n\\nYou will be prompted to insert low and/or high density media.   TESTFDC  only\\n\\\r\nwrites to the top 5 tracks of the disk,  allowing you to use a single disk to\\n\\\r\nboot and to test. TESTFDC should be run from a bare DOS boot (no windows).\\n\" };\r\n\r\nunsigned char help1[] = { \"\\n\\\r\nI am attempting to build a registry of mainboard and add-in floppy controllers\\n\\\r\nand their capabilities. The latest version of this registry can be found with\\n\\\r\nthe TESTFDC program at: http://www.classiccmp.org/dunfield/img\\n\\n\\\r\nIf you test a system/controller not already listed, or exhibiting results\\n\\\r\ndiffering from those that I have on file - please use the R=file option to\\n\\\r\nsave the TESTFDC report(s) and send them to me along with:\\n\\n\\\r\n - The manufacturer and model number of your mainboard or add-in controller\\n\\\r\n - The floppy controller chip used.\\n\\n\\\r\nMy contact information is available on the site.\\n\\n\\Dave Dunfield.\\n\" };\r\n\r\n/*\r\n * Deselect current drive\r\n */\r\nvoid deselect_drive(void)\r\n{\r\n\tout(0x0A, 6);\t\t// Mask channel-2 DMA\r\n\tout(FDC, 0x04);\t\t// Disable FDC\r\n}\r\n\r\n/*\r\n * Report error with formatted message and terminate\r\n */\r\nregister error(unsigned args)\r\n{\r\n\tunsigned char buffer[100];\r\n\t_format_(nargs() * 2 + &args, buffer);\r\n\tprintf(\" %s\\n\", buffer);\r\n\tout(FDC, 0);\r\n\tdelay(MDEL);\r\n\tdeselect_drive();\r\n\tlongjmp(xjump, buffer);\r\n}\r\n\r\n/*\r\n * Floppy disk interrupt handler - send EOI and set Fdone flag\r\n */\r\nasm {\r\nFINT:\tPUSH\tAX\t\t\t\t; Save AX\r\n\t\tMOV\t\tAL,20h\t\t\t; Get EOT\r\n\t\tOUT\t\t20h,AL\t\t\t; Send to PIC\r\n\t\tMOV\t\tCS:_Fdone,255\t; Set flag\r\n\t\tPOP\t\tAX\t\t\t\t; Restore AX\r\n\t\tIRET\r\n}\r\n\r\n/*\r\n * Stub for ASM callable delay\r\n */\r\nasm {\r\nXDEL:\tPUSH\tDX\t\t\t\t; Save DS\r\n\t\tPUSH\tAX\t\t\t\t; Save AX\r\n\t\tCALL\t_delay\t\t\t; Perform delay\r\n\t\tPOP\t\tAX\t\t\t\t; Restore AX\r\n\t\tPOP\t\tDX\t\t\t\t; Restore DX\r\n\t\tRET\r\n}\r\n\r\n/*\r\n * ESC key detected - exit with message\r\n */\r\nvoid xabort(void)\r\n{\r\n\tEskip = 255;\r\n\terror(\"!Abort by operator\");\r\n}\r\n\r\n/*\r\n * Write command byte to FDC\r\n */\r\nvoid wrfdc(b) asm\r\n{\r\n\t\tXOR\t\tAX,AX\t\t\t\t; Begin with zero\r\n\t\tMOV\t\tES,AX\t\t\t\t; Address low memory\r\n\t\tMOV\t\tBYTE PTR ES:[0440h],255\t; Reset BIOS timeout\r\n\t\tMOV\t\tCL,AL\t\t\t\t; Zero \"hung\" counter\r\nwrf1:\tDEC\t\tCL\t\t\t\t\t; Reduce timeout\r\n\t\tJNZ\t\twrf2\t\t\t\t; Not yet\r\n\t\tCALL\t_kbtst\t\t\t\t; Test for key\r\n\t\tAND\t\tAX,AX\t\t\t\t; Any key?\r\n\t\tJZ\t\twrf2\t\t\t\t; No\r\n\t\tMOV\t\tDGRP:_Lkey,AX\t\t; Save last RX key\r\n\t\tCMP\t\tAL,1Bh\t\t\t\t; Abort request?\r\n\t\tJNZ\t\twrf2\t\t\t\t; No\r\n\t\tJMP\t\t_xabort\t\t\t\t; Process the abort\r\nwrf2:\tMOV\t\tDX,DGRP:_FDC\t\t; Address the FDC\r\n\t\tADD\t\tDX,2\t\t\t\t; Offset to FDCS\r\n\t\tIN\t\tAL,DX\t\t\t\t; Read status\r\n\t\tTEST\tAL,80h\t\t\t\t; Ready?\r\n\t\tJZ\t\twrf1\t\t\t\t; No, wait for it\r\n\t\tINC\t\tDX\t\t\t\t\t; Advance to FDCD\r\n\t\tTEST\tAL,40h\t\t\t\t; Ready for output?\r\n\t\tJZ\t\twrf3\t\t\t\t; Yes, proceed\r\n\t\tIN\t\tAL,DX\t\t\t\t; No - read to clear\r\n\t\tJMP\tshort wrf1\t\t\t\t; And go again\r\nwrf3:\tMOV\t\tAX,4[BP]\t\t\t; Get data to write\r\n\t\tOUT\t\tDX,AL\t\t\t\t; Write to FDC data\r\n}\r\n\r\n/*\r\n * Wait for interrupt from the FDC\r\n * Last byte of command is sent here so that we can enable\r\n * interrupt before commands begins.\r\n */\r\nvoid waitirq(c)\r\n{\r\n\tasm {\r\n\t\tMOV\t\tDGRP:_Fdone,0\t\t; Reset indicator\r\n\t\tMOV\t\tAX,4[BP]\t\t\t; Get argument\r\n\t\tPUSH\tAX\t\t\t\t\t; Pass it\r\n\t\tCALL\t_wrfdc\t\t\t\t; Write it\r\n\t\tPOP\t\tAX\t\t\t\t\t; Cleanup\r\n\t\tXOR\t\tAX,AX\t\t\t\t; Get zero\r\n\t\tMOV\t\tES,AX\t\t\t\t; ES = seg0\r\n\t\tMOV\t\tCX,ES:[046ch]\t\t; Read BIOS tick\r\nwai1:\tCMP\t\tDGRP:_Fdone,0\t\t; Done flag set?\r\n\t\tJZ\t\twai2\t\t\t\t; No, keep trying\r\n\t\tMOV\t\tBL,DGRP:_Drive\t\t; Get drive\r\n\t\tXOR\t\tBH,BH\t\t\t\t; Zero high\r\n\t\tMOV\t\tAL,DGRP:_DORsel[BX]\t; Get index\r\n\t\tMOV\t\tDX,DGRP:_FDC\t\t; Get I/O address\r\n\t\tOUT\t\tDX,AL\t\t\t\t; Write it\r\n\t\tPOP\t\tBP\r\n\t\tRET\r\nwai2:\tMOV\t\tAX,ES:[046Ch]\t\t; Read BIOS tick\r\n\t\tSUB\t\tAX,CX\t\t\t\t; Calculate elapsed\r\n\t\tCMP\t\tAX,55\t\t\t\t; Over?\r\n\t\tJBE\t\twai1\t\t\t\t; Wait for it\r\n\t}\r\n\tEskip = 255;\r\n\terror(\"!No FDC interrupt\");\r\n}\r\n\r\n/*\r\n * Initialize data transfer mode (rate and density)\r\n */\r\nvoid initmode(void)\r\n{\r\n\tunsigned x;\r\n\tMfm = (Mode / 3) ? 0x40 : 0x00;\r\n\tout(FDC+5, x = Mode % 3);\r\n}\r\n\r\n/*\r\n * Initialize DMA channel\r\n */\r\nvoid initdma(unsigned char mode, unsigned count)\r\n{\r\n\tdisable();\r\n\tout(0x0A, 6);\t\t\t\t\t\t// Mask channel\r\n\tout(FDC, DORsel[Drive] | 0x08);\t\t// Enable DMA & IRQ\r\n\tout(0x0B, mode);\t\t\t\t\t// Set mode\r\n\tout(0x0C, 0);\t\t\t\t\t\t// Clear byte pointer\r\n\tout(0x81, DMA >> 12);\t\t\t\t// Dma page\r\n\tout(0x04, (DMA << 4) & 255);\t\t// Dma address low\r\n\tout(0x04, (DMA >> 4) & 255);\t\t// Dma address high\r\n\tout(0x05, --count);\t\t\t\t\t// count low\r\n\tout(0x05, count >> 8);\t\t\t\t// count high\r\n\tout(0x0A, 2);\t\t\t\t\t\t// Unmask channel\r\n\tenable();\r\n}\r\n\r\n/*\r\n * Write command sequence to FDC\r\n */\r\nvoid wrcmd(unsigned c)\r\n{\r\n\twrfdc(c|Mfm);\r\n\twrfdc(Head ? (Drive|4) : Drive);\r\n}\r\n\r\n/*\r\n * Read byte from FDC\r\n */\r\nint rdfdc(void) asm\r\n{\r\n\t\tXOR\t\tAX,AX\t\t\t; Get zero\r\n\t\tMOV\t\tES,AX\t\t\t; Address low memory\r\n\t\tMOV\t\tBX,ES:[046Ch]\t; Get BIOS tick\r\n\t\tMOV\t\tCL,AL\t\t\t; Zero \"hung\" counter\r\nrdf1:\tDEC\t\tCL\t\t\t\t; Reduce timeout\r\n\t\tJNZ\t\trdf2\t\t\t; Not yet\r\n\t\tCALL\t_kbtst\t\t\t; Test for key\r\n\t\tAND\t\tAX,AX\t\t\t; Key available?\r\n\t\tJZ\t\trdf2\t\t\t; No key\r\n\t\tMOV\t\tDGRP:_Lkey,AX\t; Save last\r\n\t\tCMP\t\tAL,01Bh\t\t\t; Escape?\r\n\t\tJNZ\t\trdf2\t\t\t; No\r\n\t\tCALL\t_xabort\t\t\t; Abort\r\nrdf2:\tMOV\t\tAX,ES:[046Ch]\t; Get BIOS tick\r\n\t\tSUB\t\tAX,BX\t\t\t; Calculate elapsed\r\n\t\tCMP\t\tAX,DGRP:_Timeout; Timeout expired\r\n\t\tJBE\t\trdf4\t\t\t; No, wait for it\r\n\t\tMOV\t\tDGRP:_Timeout,10; Set default timeout\r\n\t\tMOV\t\tAL,48h\t\t\t; Indicate failed\r\n\t\tMOV\t\tDGRP:_Result,AL\t; Set Result[0]\r\nrdf3:\tMOV\t\tAX,-1\t\t\t; Indicate failure\r\n\t\tJMP\t\trdf5\t\t\t; And exit\r\nrdf4:\tMOV\t\tDX,DGRP:_FDC\t; FDC address\r\n\t\tADD\t\tDX,2\t\t\t; Offset to FDCS\r\n\t\tIN\t\tAL,DX\t\t\t; Read it\r\n\t\tTEST\tAL,80h\t\t\t; Data ready?\r\n\t\tJZ\t\trdf1\t\t\t; Wait for it\r\n\t\tTEST\tAL,40h\t\t\t; Providing data\r\n\t\tJZ\t\trdf3\t\t\t; No - error\r\n\t\tINC\t\tDX\t\t\t\t; Advance to FDCD\r\n\t\tIN\t\tAL,DX\t\t\t; Read data\r\n\t\tXOR\t\tAH,AH\t\t\t; Zero high\r\nrdf5:\r\n}\r\n\r\n/*\r\n * Read result stream from FDC\r\n */\r\nint result(unsigned m)\r\n{\r\n\tunsigned d;\r\n\tmemset(Result, Rcount = 0, sizeof(Result));\r\n\twhile(m) {\r\n\t\t--m;\r\n\t\tif((d = rdfdc()) & 0xFF00)\r\n\t\t\tbreak;\r\n\t\tResult[Rcount++] = d; }\r\n\treturn Result[0] & 0xC0;\t// 0xC0  0xD8\r\n}\r\n\r\n/*\r\n * Recalibrate the FDC head\r\n */\r\nvoid recal(void)\r\n{\r\n\tchar x;\r\n\tx = 2;\r\n\tdo {\r\n\t\twrfdc(0x07);\r\n\t\tout(FDC, DORsel[Drive] | 0x08);\t\t// Enable IRQ\r\n\t\twaitirq(Drive);\r\n\t\tdo {\r\n\t\t\tdelay(MDEL);\r\n\t\t\twrfdc(0x08);\t\t// Sense interrupt\r\n\t\t\tresult(2); }\r\n\t\twhile(in(FDCS) & 0x0F);\t// Still seeking\r\n\t\tdelay(MDEL); }\r\n\twhile(--x);\r\n\tCylinder = 0;\r\n}\r\n\r\n/*\r\n * Seek to track\r\n */\r\nvoid seek(unsigned c)\r\n{\r\n\tCylinder = c;\r\n\tdelay(55);\r\n\tif(c = kbtst()) {\r\n\t\tif((Lkey = c) == 0x1B)\r\n\t\t\txabort(); }\r\n\twrfdc(0x0F);\t\t\t\t\t// Seek command\r\n\twrfdc(Drive);\t\t\t\t\t// Drive ID\r\n\tout(FDC, DORsel[Drive] | 0x08);\t// Enable IRQ\r\n\twaitirq(Cylinder); \t\t\t\t// cylinder\r\n\tdo {\r\n\t\tdelay(55);\r\n\t\twrfdc(0x08);\t\t\t\t// Sense interrupt\r\n\t\tresult(2); }\r\n\twhile(in(FDCS) & 0x0F);\t\t\t// Still seeking\r\n\tif(SKdel)\r\n\t\tdelay(SKdel);\r\n}\r\n\r\n/*\r\n * Resync and retry head position\r\n */\r\nint resync(void)\r\n{\r\n\tunsigned c;\r\n\tif(Result[1] & 0x02)\t// Write protect\r\n\t\treturn 255;\r\n\tc = Cylinder;\r\n\tswitch(++Resync) {\r\n\tcase 2 :\r\n\tcase 4 :\r\n\t\trecal(); delay(250); seek(c);\r\n\tcase 1 :\r\n\tcase 3 :\r\n\t\treturn 0; }\r\n\treturn 255;\r\n}\r\n\r\n/*\r\n * Read sector ID passing under head\r\n */\r\nint readid(void)\r\n{\r\n\twrcmd(0x0A);\r\n\treturn result(7);\r\n}\r\n\r\n/*\r\n * Report a disk error\r\n */\r\nvoid diskerror()\r\n{\r\n\tunsigned char r, *p;\r\n\tp = 0;\r\n\tprintf(\" !error (%u)\", Sector);\r\n\tif(Result[0] & 0x08) printf(p=\" EC\");\r\n\tr = Result[1];\r\n\tif(r & 0x80) printf(p=\" EndCyl\");\r\n\tif(r & 0x20) printf(p=\" Data\");\r\n\tif(r & 0x10) printf(p=\" Overun\");\r\n\tif(r & 0x04) printf(p=\" NoSector\");\r\n\tif(r & 0x02) { Eskip = 255; printf(p=\" WriteProt\"); }\r\n\tif(r & 0x01) printf(p=\" NoAdrMark\");\r\n\tif(!p) {\r\n\t\tprintf(\" %02x %02x %02x\",\r\n\t\t\tResult[0], Result[1], Result[2]); }\r\n\terror(\"\");\r\n}\r\n\r\n/*\r\n * Read a sector from the disk\r\n */\r\nint read_sector(unsigned index)\r\n{\r\n\tunsigned r;\r\n\tr = Resync = 0;\r\nretry:\r\n\twrcmd(0x06);\r\n\twrfdc(Cylinder);\t\t\t\t// Cylinder\r\n\twrfdc(Head);\t\t\t\t\t// Head\r\n\twrfdc(index+1);\t\t\t\t\t// Sector\r\n\twrfdc(Ssize);\t\t\t\t\t// N\r\n\twrfdc(Sector);\t\t\t\t\t// EOT\r\n\twrfdc(Gl);\t\t\t\t\t\t// GL\r\n\tinitdma(0x46, 128 << Ssize);\r\n\twaitirq(Ssize ? 255 : 128);\r\n\tresult(7);\r\n\tif(Result[0] & 0xC0) {\r\n\t\tif(resync()) {\r\n\t\t\tdiskerror();\r\n\t\t\treturn 255; }\r\n\t\tgoto retry; }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Write a sector to the disk\r\n */\r\nint write_sector(unsigned index)\r\n{\r\n\tunsigned r;\r\n\tr = Resync = 0;\r\nretry:\r\n\twrcmd(0x05);\r\n\twrfdc(Cylinder);\t\t\t\t// Cylinder\r\n\twrfdc(Head);\t\t\t\t\t// Head\r\n\twrfdc(index+1);\t\t\t\t\t// Sector\r\n\twrfdc(Ssize);\t\t\t\t\t// N\r\n\twrfdc(Sector);\t\t\t\t\t// EOT\r\n\twrfdc(Gl);\t\t\t\t\t\t// GL\r\n\tinitdma(0x4A, 128 << Ssize);\r\n\twaitirq(Ssize ? 255 : 128);\r\n\tresult(7);\r\n\tif(Result[0] & 0xC0) {\r\n\t\tif(resync()) {\r\n\t\t\tdiskerror();\r\n\t\t\treturn 255; }\r\n\t\tgoto retry; }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Advance DMA address by sector size\r\n */\r\nvoid bumpdma(void)\r\n{\r\n\tDMA +=  (((128 << Ssize) + 31) / 16);\r\n}\r\n\r\n/*\r\n * Reset FDC subsystem to known state (start of function)\r\n */\r\nvoid reset(void)\r\n{\r\n//\tStop = Mfm = Ssize =\r\n\tRcount = Cylinder = Head = Sector = Resync = Lkey = 0;\r\n\tTimeout = TIMEOUT;\r\n\tDMA = SEG;\r\n\r\n\tasm {\t// Reset BIOS timeout counter\r\n\t\tXOR\tAX,AX\r\n\t\tMOV\tES,AX\r\n\t\tMOV\tBYTE PTR ES:[440h],255\r\n\t}\r\n\tout(0x0A, 6);\t// Mask channel-2 DMA\r\n\tout(FDC, 0); delay(MDEL); out(FDC, 4); delay(MDEL);\r\n\tout(0x3F2, 4);\t// Insure primary is clear\r\n\tout(0x372, 4);\t// Insure secondary is clear\r\n\twrfdc(0x03);\t// Specify\r\n\twrfdc((SPsrt << 4) | SPhut);\t// Step, head unload\r\n\twrfdc(SPhlt << 1);\t\t\t\t// Head load, DMA\r\n\tresult(0);\r\n\tout(FDC, DORsel[Drive]);\r\n\tdelay(500);\r\n\tinitmode();\r\n\trecal();\r\n\tdelay(500);\r\n}\r\n\r\n/*\r\n * Format a track\r\n */\r\nint format_track(void)\r\n{\r\n\tunsigned i, o, r;\r\n\r\n\tTimeout = TIMEOUT;\r\n\tinitmode();\r\n\tr = Resync = 0;\r\n\r\nretry:\r\n\tDMA = SEG;\r\n\tfor(i=o=0; i < Stop; ++i) {\r\n\t\tpoke(DMA, o++, Cylinder);\r\n\t\tpoke(DMA, o++, Head);\r\n\t\tpoke(DMA, o++, Smap[i]);\r\n\t\tpoke(DMA, o++, Ssize); }\r\n\r\n\twrcmd(0x0D);\r\n\twrfdc(Ssize);\r\n\twrfdc(Stop);\r\n\twrfdc(Glf);\r\n\tinitdma(0x4A, o);\r\n\twaitirq(Ffill);\r\n\r\n\tresult(7);\r\n\tif(Result[0] & 0xC0) {\r\n\t\tif(resync()) {\r\n\t\t\tdiskerror();\r\n\t\t\treturn 255; }\r\n\t\tgoto retry; }\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Perform test for a given mode table entry\r\n */\r\nint test_mode(unsigned char *mtable)\r\n{\r\n\tunsigned i, s, r;\r\n\r\n\tif(setjmp(xjump))\r\n\t\treturn 255;\r\n\r\n\tStop\t= mtable[0];\r\n\tSsize\t= mtable[1];\r\n\tMode\t= mtable[2];\r\n\tGl\t\t= mtable[3];\r\n\tGlf\t\t= mtable[4];\r\n\tr\t\t= mtable[6];\r\n\r\n\r\n\tprintf(\"%uk %s:\", Mtext[Mode%3], Mdesc[mtable[5]]);\r\n\r\n\tif(Eskip) {\t\t\t\t\t\t// Error/Exit - skip test\r\n\t\tprintf(\" !Skipped\\n\");\r\n\t\treturn 255; }\r\n\r\n\tReport[r] = 1;\t\t\t\t\t// Assume failed (guilty until proven innocent)\r\n\t// Build sector interleave table\r\n\tfor(i=s=0; i < Stop; ++i) {\r\n\t\tSmap[s] = i+1;\r\n\t\tif((s += 2) >= Stop)\r\n\t\t\ts = 1; }\r\n\r\n\t// Initialize a recognizable data buffer\r\n\ts = (128 << Ssize) * Stop;\r\n\tfor(i=0; i < s; ++s)\r\n\t\tpoke(SEG, i, i);\r\n\r\n\t// Format the disk to the specified mode\r\n\tprintf(\" Format\");\r\n\treset();\r\n\tfor(Cylinder = Cylinders - 5; Cylinder < Cylinders; ++Cylinder) {\r\n\t\tHead = 0;\r\n\t\tseek(Cylinder);\r\n\t\tformat_track(); }\r\n\r\n\t// Write sectors with data\r\n\tprintf(\" Write\");\r\n\tfor(Cylinder = Cylinders - 5; Cylinder < Cylinders; ++Cylinder) {\r\n\t\tseek(Cylinder);\r\n\t\tDMA = SEG;\r\n\t\tfor(i = 0; i < Stop; ++i)\r\n\t\t\twrite_sector(i); }\r\n\r\n\tfor(i=0; i < s; ++i)\t\t// Clear the data buffer\r\n\t\tpoke(SEG, i, 0);\r\n\r\n\t// Read content back and verify\r\n\tprintf(\" Verify\");\r\n\tfor(Cylinder = Cylinders - 5; Cylinder < Cylinders; ++Cylinder) {\r\n\t\tseek(Cylinder);\r\n\t\tDMA = SEG;\r\n\t\tfor(i = 0; i < Stop; ++i)\r\n\t\t\tread_sector(i);\r\n\t\tfor(i=0; i < s; ++i) {\r\n\t\t\tif(peek(SEG, i) != (i & 255)) {\r\n\t\t\t\tprintf(\" Failed\\n\");\r\n\t\t\t\treturn 255; } } }\r\n\r\n\t// If we get here - test passed.\r\n\tprintf(\" Ok\\n\");\r\n\tReport[r] = 2;\t\t// Correct our assumption - this one worked!\r\n\treturn 0;\r\n}\r\n\r\n/*\r\n * Prompt for media change\r\n */\r\nint prompt(unsigned char *p)\r\n{\r\n\tunsigned r;\r\n\tunsigned char buffer[100];\r\n\r\n\tdeselect_drive();\r\n\tEskip = 0;\r\n\tsprintf(buffer, \"Insert %smedia - Press ENTER or ESC to skip:\", p);\r\n\tfputs(p=buffer, stdout);\r\n\tfor(;;) switch(kbget()) {\r\n\tcase 0x1B: r = 0; goto exit;\r\n\tcase '\\r':\r\n\tcase '\\n': r = 255; goto exit; }\r\nexit:\r\n\tputc('\\r', stdout);\r\n\twhile(*p) {\r\n\t\t++p;\r\n\t\tputc(' ', stdout); }\r\n\tputc('\\r', stdout);\r\n\treturn r;\r\n}\r\n\r\n/*\r\n * Get drive type from BIOS\r\n */\r\nunsigned get_drive_type(drive) asm\r\n{\r\n\tMOV\t\tDL,4[BP]\t\t; Get drive index\r\n\tMOV\t\tAH,08h\t\t\t; BIOS function\r\n\tINT\t\t13h\t\t\t\t; Call BIOS\r\n\tMOV\t\tAX,BX\t\t\t; Gesult\r\n}\r\n\r\n/*\r\n * Generate the final report\r\n */\r\nvoid final_report(FILE *fp)\r\n{\r\n\tunsigned i, l, d, m, y, h, mi, s;\r\n\tstatic unsigned char *rtext[] = {\r\n\t\t\"Single-Density at %u kbps \",\r\n\t\t\"Double-Density at %u kbps \",\r\n\t\t\"Double-Density at %u kbps / 128 byte sectors \" };\r\n\tstatic unsigned char *rpass[] = {\r\n\t\t\"Not tested\",\r\n\t\t\"Failed\",\r\n\t\t\"Passed\" };\r\n\tstatic unsigned rrate[] = {\r\n\t\t250, 300, 500,  250, 300, 500,  250, 300, 500 };\r\n\r\n\tget_date(&d, &m, &y);\r\n\tget_time(&h, &mi, &s);\r\n\r\n\tfprintf(fp,\"Report on FDC capabilities, issued %u/%02u/%04u %u:%02u:%02u:\\n\",\r\n\t\td, m, y, h, mi, s);\r\n\tfor(i=0; i < 9; ++i) {\r\n\t\tl = fprintf(fp, rtext[i/3], rrate[i]);\r\n\t\twhile(l < 55) {\r\n\t\t\tputc('.', fp);\r\n\t\t\t++l; }\r\n\t\tfprintf(fp, \" %s\\n\", rpass[Report[i]]); }\r\n}\r\n\r\n/*\r\n * Main program\r\n */\r\nmain(int argc, char *argv[])\r\n{\r\n\tunsigned i, j;\r\n\tunsigned char *p;\r\n\r\n\tprintf(\"TESTFDC \"#VERSION\" / \"#__DATE__\"\\nCopyright 2007-\"#CYEAR\" Dave Dunfield - All rights reserved.\\n\");\r\n\r\n\t// Parse command line arguments\r\n\tfor(i=1; i < argc; ++i) {\r\n\t\tp = argv[i];\r\n\t\tswitch((toupper(*p++) << 8) | toupper(*p++)) {\r\n\t\tcase 'A:' : Drive = 0;\t\t\tcontinue;\r\n\t\tcase 'B:' : Drive = 1;\t\t\tcontinue;\r\n\t\tcase 'C:' : Drive = 2;\t\t\tcontinue;\r\n\t\tcase 'D:' : Drive = 3;\t\t\tcontinue;\r\n\t\tcase '/D' : Dtest = 0;\t\t\tcontinue;\r\n\t\tcase '/R' : abort(help1);\t\tcontinue;\r\n\t\tcase '/S' : Stest = 0;\t\t\tcontinue;\r\n\t\tcase '/E' : Texit = atox(p);\tcontinue;\r\n\t\tcase '/X' : Xtest = 0;\t\t\tcontinue;\r\n\t\tcase 'R=' : Rfile = p;\t\t\tcontinue; }\r\n\t\tfor(j=0; drives[j]; ++j) {\r\n\t\t\tif(!strcmp(p-2, drives[j])) {\r\n\t\t\t\tDtype = j;\r\n\t\t\t\tgoto found; } }\r\ndohelp:\r\n\t\tfputs(help, stdout);\r\n\t\treturn;\r\nfound: }\r\n\r\n\tif(Drive & 0xF0)\t\t\t\t// No drive specified\r\n\t\tgoto dohelp;\r\n\r\n\tSEG = alloc_seg(4096);\t\t\t// 64k segment\r\n\tSEG = (SEG+0x7FF) & 0xF800;\t\t// Advance to nearest 32k boundary\r\n\r\n\t// Determine and display BIOS drive type\r\n\tp = \"Unknown\"; i = 255;\r\n\tswitch(get_drive_type(Drive)) {\r\n\tcase 0 : p=\"Not installed\";\tbreak;\r\n\tcase 1 : p=\"360K DD, 40-track\"; i = 0;\tbreak;\r\n\tcase 2 : p=\"1.2M HD, 80-track\"; i = 2;\tbreak;\r\n\tcase 3 : p=\"720k DD, 80-track\"; i = 1;\tbreak;\r\n\tcase 4 : p=\"1.44M HD, 80-track\";i = 3;\tbreak;\r\n\tdefault: p=\"Unknown\"; }\r\n\tprintf(\"BIOS reports drive %c: as %s.\\n\", Drive+'A', p);\r\n\r\n\t// Determine drive type to use based on BIOS/override\r\n\tif(Dtype & 0xF0) {\t\t\t\t// No override\r\n\t\tif((Dtype = i) &  0xF0)\t\t// Set to BIOS - error if n/a\r\n\t\t\tabort(\"You must specify a drive type for this drive.\\n\"); }\r\n\telse {\r\n\t\tswitch(Dtype) {\r\n\t\tdefault: goto dohelp;\r\n\t\tcase 0 : p = \"360K DD, 40-track\";\tbreak;\r\n\t\tcase 1 : p = \"720k DD, 80-track\";\tbreak;\r\n\t\tcase 2 : p = \"1.2M HD, 80-track\";\tbreak;\r\n\t\tcase 3 : p = \"1.44M HD, 80-track\";\t}\r\n\t\tprintf(\"Testing as: %s\\n\", p); }\r\n\r\n\t// Take over floppy hardware interrupt\r\n\tasm {\r\n\t\tMOV\t\tAX,350Eh\t\t; Get vector 14 (FDC interrupt)\r\n\t\tINT\t\t21h\t\t\t\t; Ask DOS\r\n\t\tMOV\t\tDGRP:_FIseg,ES\t; Save segment\r\n\t\tMOV\t\tDGRP:_FIoff,BX\t; Save offset\r\n\t\tMOV\t\tDX,OFFSET FINT\t; New offset\r\n\t\tMOV\t\tAX,250Eh\t\t; Set vector 14\r\n\t\tINT\t\t21h\t\t\t\t; Ask DOS\r\n\t}\r\n\r\n\t// Perform tests apropriate to the drive\r\n\tswitch(Dtype) {\r\n\tcase 0 :\t\t// 360\r\n\t\tCylinders = 40;\r\n\tcase 1 :\t\t// 720\r\n\t\tif(prompt(\"\")) {\r\n\t\t\tif(Stest)\r\n\t\t\t\ttest_mode(SL300);\r\n\t\t\tif(Dtest)\r\n\t\t\t\ttest_mode(DL300);\r\n\t\t\tif(Xtest)\r\n\t\t\t\ttest_mode(XL300); }\r\n\t\tbreak;\r\n\tcase 2 :\t\t// 1.2\r\n\t\tif(prompt(\"low density \")) {\r\n\t\t\tif(Stest)\r\n\t\t\t\ttest_mode(SL360);\r\n\t\t\tif(Dtest)\r\n\t\t\t\ttest_mode(DL360);\r\n\t\t\tif(Xtest)\r\n\t\t\t\ttest_mode(XL360); }\r\n\t\tif(prompt(\"high density \")) {\r\n\t\t\tif(Stest)\r\n\t\t\t\ttest_mode(SH360);\r\n\t\t\tif(Dtest)\r\n\t\t\t\ttest_mode(DH360);\r\n\t\t\tif(Xtest)\r\n\t\t\t\ttest_mode(XH360); }\r\n\t\tbreak;\r\n\tcase 3 :\t\t// 1.4\r\n\t\tif(prompt(\"low density \")) {\r\n\t\t\tif(Stest)\r\n\t\t\t\ttest_mode(SL300);\r\n\t\t\tif(Dtest)\r\n\t\t\t\ttest_mode(DL300);\r\n\t\t\tif(Xtest)\r\n\t\t\t\ttest_mode(XL300); }\r\n\t\tif(prompt(\"high density \")) {\r\n\t\t\tif(Stest)\r\n\t\t\t\ttest_mode(SH300);\r\n\t\t\tif(Dtest)\r\n\t\t\t\ttest_mode(DH300);\r\n\t\t\tif(Xtest)\r\n\t\t\t\ttest_mode(XH300); }\r\n\t}\r\n\r\n\t// Release FDC\r\n\tdeselect_drive();\r\n\tasm {\r\n\t\tMOV\t\tDX,DGRP:_FIoff\t; Get offset\r\n\t\tPUSH\tDS\t\t\t\t; Save DS\r\n\t\tMOV\t\tDS,DGRP:_FIseg\t; Get segment\r\n\t\tMOV\t\tAX,250Eh\t\t; Set vector\r\n\t\tINT\t\t21h\t\t\t\t; Ask DOS\r\n\t\tPOP\t\tDS\t\t\t\t; Restore DS\r\n\t}\r\n\r\n\tif(Texit) {\r\n\t\tif(Texit & 1) {\t\t\t\t\t// Reset FDC\r\n\t\t\tout(FDC, 0);\r\n\t\t\tdelay(MDEL);\r\n\t\t\tout(FDC, 4);\r\n\t\t\tdelay(MDEL); }\r\n\t\tif(Texit & 2)\r\n\t\t\tpoke(0x40, 0x3E, 0x0F);\t\t// All drives recalibrate\r\n\t\tif(Texit & 4) {\r\n\t\t\tout(FDC+5, 0);\t\t\t\t// Reset data rate\r\n\t\t\tpoke(0x40, 0x8B, 0); }\t\t// Indicate 500khz\r\n\t\tif(Texit & 8) {\r\n\t\t\tpoke(0x40, 0x90, 0);\t\t// Unknown media A:\r\n\t\t\tpoke(0x40, 0x92, 0); } }\t// Unknown media B:\r\n\r\n\tasm {\r\n\t\tXOR\t\tAH,AH\t\t\t; 00 = Reset\r\n\t\tMOV\t\tDL,AH\t\t\t; Drive A\r\n\t\tINT\t\t13h\t\t\t\t; BIOS: Reset diskette\r\n\t}\r\n\r\n\t// Display final report\r\n\tputc('\\n', stdout);\r\n\tfinal_report(stdout);\r\n\tif(Rfile) {\t\t\t\t// Output to file requested\r\n\t\tfp = fopen(Rfile, \"wvq\");\r\n\t\tfinal_report(fp);\r\n\t\tfclose(fp);\r\n\t\tprintf(\"Written to: %s\\n\", Rfile); }\r\n}\r\n"
  },
  {
    "path": "tools/cpm/imd118sc/VERSION.H",
    "content": "/*\r\n * Current ImageDisk version\r\n */\r\n#define\tVERSION\t1.18\r\n#define\tCYEAR\t2012\t// Current year\r\n"
  },
  {
    "path": "tools/generic/CC1541/Makefile",
    "content": "# CC1541_CFLAGS = -std=c99 -pipe -O2 -Wall -Wextra -pedantic\nCC1541_CFLAGS = -std=c99 -pipe -O2 -Wno-error=\"format-truncation\"\n# CC1541_CFLAGS = -std=c99 -pipe -O2\nALL_TARGETS = cc1541\n\nifneq ($(ENABLE_MAN),)\nALL_TARGETS += man\nendif\n\nifneq ($(ENABLE_WERROR),)\nCC1541_CFLAGS += -Werror\nendif\n\noverride CFLAGS := $(CC1541_CFLAGS) $(CFLAGS)\n\nprefix ?= /usr/local\nbindir ?= $(prefix)/bin\nmandir ?= $(prefix)/share/man\n\nINSTALL ?= install\n\nVERSION := $(shell grep 'define VERSION' cc1541.c | cut -d\\\" -f2)\n\nCC1541_SRC := Makefile transwarp\\ v0.84.prg transwarp\\ v0.86.prg $(wildcard *.c *.h *.in *.sln *.vcxproj* LICENSE* README*)\n\nall: $(ALL_TARGETS)\n\ncc1541: cc1541.c\n\ncc1541.1.txt: cc1541.1.txt.in\n\tsed -e \"s/@@VERSION@@/$(VERSION)/g\" < cc1541.1.txt.in > cc1541.1.txt\n\ncc1541.1: cc1541.1.txt\n\ta2x -d manpage -f manpage cc1541.1.txt\n\nman: cc1541.1\n\ntest_cc1541: test_cc1541.c\n\ncheck: cc1541 test_cc1541\n\t./test_cc1541 ./cc1541\n\ntest: check\n\ninstall: all\n\t$(INSTALL) -Dpm 0755 ./cc1541 $(DESTDIR)$(bindir)/cc1541\nifneq ($(ENABLE_MAN),)\n\t$(INSTALL) -Dpm 0644 ./cc1541.1 $(DESTDIR)$(mandir)/man1/cc1541.1\nendif\n\ncc1541-$(VERSION).tar: $(CC1541_SRC)\n\trm -rf cc1541-$(VERSION)/ *~ README.md.T\n\tmkdir -p cc1541-$(VERSION)\n\tcp -a $(CC1541_SRC) cc1541-$(VERSION)/\n\tchmod 0644 cc1541-$(VERSION)/*\n\ttar cf cc1541-$(VERSION).tar cc1541-$(VERSION)/\n\trm -rf cc1541-$(VERSION)/\n\ncc1541-$(VERSION).tar.bz2: cc1541-$(VERSION).tar\n\tbzip2 -9cz < cc1541-$(VERSION).tar > cc1541-$(VERSION).tar.bz2\n\ncc1541-$(VERSION).tar.gz: cc1541-$(VERSION).tar\n\tgzip -9c < cc1541-$(VERSION).tar > cc1541-$(VERSION).tar.gz\n\ncc1541-$(VERSION).tar.xz: cc1541-$(VERSION).tar\n\txz -ce < cc1541-$(VERSION).tar > cc1541-$(VERSION).tar.xz\n\ncc1541-$(VERSION).zip: $(CC1541_SRC)\n\trm -rf cc1541-$(VERSION)/ *~ README.md.T\n\tmkdir -p cc1541-$(VERSION)\n\tcp -a $(CC1541_SRC) cc1541-$(VERSION)/\n\tchmod 0644 cc1541-$(VERSION)/*\n\tzip -9r cc1541-$(VERSION).zip cc1541-$(VERSION)/\n\trm -rf cc1541-$(VERSION)/\n\ndist-bz2: cc1541-$(VERSION).tar.bz2\ndist-gz:  cc1541-$(VERSION).tar.gz\ndist-xz:  cc1541-$(VERSION).tar.xz\ndist-zip: cc1541-$(VERSION).zip\ndist-all: dist-bz2 dist-gz dist-xz dist-zip\n\ndist: dist-gz dist-zip\n\ndist-check: dist\n\ttar xf cc1541-$(VERSION).tar.gz\n\t$(MAKE) -C cc1541-$(VERSION)/ all check\n\trm -rf cc1541-$(VERSION)/\n\ncodestyle: cc1541.c test_cc1541.c\n\tastyle --style=kr -n -s -z2 cc1541.c test_cc1541.c\n\nwrap: cc1541.1.txt.in LICENSE.txt README.md\n\tfor f in $^; do \\\n\t  fold -s -w 70 < $$f | perl -pe 's/[\\t\\040]+$$//' > $$f.T; \\\n\t  mv -f $$f.T $$f; \\\n\tdone\n\nclean:\n\trm -rf cc1541-$(VERSION)/ *~ README.md.T *.o *.orig cc1541 test_cc1541 cc1541-$(VERSION).* cc1541.1 cc1541.1.txt\n\n.PHONY: all check clean codestyle dist dist-all dist-bz2 dist-check dist-gz dist-xz dist-zip install man test wrap\n\n.NOTPARALLEL: cc1541-$(VERSION).tar cc1541-$(VERSION).zip\n"
  },
  {
    "path": "tools/generic/CC1541/README.md",
    "content": "# README #\n\nThis is cc1541, a tool for creating Commodore 1541 Floppy disk\nimages in D64, D71 or D81 format with custom sector interleaving\netc.  Also supports extended tracks 35-40 using either SPEED DOS or\nDOLPHIN DOS BAM-formatting. Furthermore supports writing Transwarp\ndisk images for the fantastically fast loader by Krill.\n\nOriginally written by JackAsser, with improvements and fixes by\nKrill, some more improvements by Claus and further improvements by\nBjörn Esser.\n\nThe program is provided under the terms of the MIT license, please\nrefer to the included LICENSE.txt file for its terms and conditions.\n\nThe public source code repository can be found here:\nhttps://bitbucket.org/PTV_Claus/cc1541/src/master/\n\n## Usage examples ##\n\n* \"cc1541 -h\" shows the command line help\n* \"cc1541 image.d64\" lists the content of image.d64\n* \"cc1541 -f program -w program.prg image.d64\" adds the file\n  program.prg to image.d64 (or creates the image if it does not\n  exist yet) using the name \"program\"\n* \"cc1541 -f program1 -w program1.prg -f program2 -w program2.prg\n  image.d64\" adds two files under the names program1 and program2\n* \"cc1541 -s 4 -f program -w program.prg image.d64\" writes a file\n  with a dedicated sector interleave for a fastloader (the best\n  value depends on the used fastloader and its configuration)\n* \"cc1541 -f game -W game.prg -f 'transwarp v0.86' -w transwarp.prg\n  Transwarp-Game.d64\" creates a Transwarp disk image with the\n  required boot file.\n* \"cc1541 -T DEL -f ---------------- -L image.d64\" creates a DEL \n  entry as separator.\n\n## Version history ##\n\nv3.4\n\n* Support for Transwarp 0.86 and later\n* Commandline option -R added for restoring deleted or formatted\n  files\n* -L switch added to create directory entries without writing a \n  file\n* -a switch added to print a cc1541 command line that re-creates\n  the directory art of the given disk image\n* -T now also allows a number as parameter\n* Files with file type DEL will now actually be written, use\n  -L if you do not want that\n* Improved verbose allocation printout\n* More robustness against invalid t/s links\n* Added support for underscore in PETSCII filenames\n* Bugfix: no endless loops for cyclic directory chains anymore\n\nv3.3\n\n* Transwarp encoding added\n* Verbose mode displays file allocation on unmodified images\n* Optimised non-standard interleave scheme\n* Added unicode printout option for PETSCII, special thanks to\n  Jonas Minnberg for helping with Linux support and inverse\n  characters!\n* Output file is not touched when no change is requested\n* Bugfix: Fixed crash on write protected output file\n* Bugfix: Spacing in directory printout was not correct when\n  file size is more than 999 blocks\n\nv3.2\n\n* -N switch added to allow duplicate file names\n* Trying to create loop file with the same name as the referenced\n  file now throws an error, if not -N is also specified\n* Changed default next file first sector on new track to 0 to align\n  with Commodore DOS\n* Interleave violations are now shown in block allocation printout\n* Block allocation for loop files is not displayed anymore when\n  referenced file was also written\n* Bugfix: Fixed file index printout for block allocation\n* Bugfix: Correct interleave is now displayed for loop files when\n  referenced file was also written\n\nv3.1\n\n* Bugfix: overwriting files did not work correctly when there was a\n  free slot in the directory before the file to overwrite\n* Bugfix: Filetype, open and protected flags were not reset after\n  writing a file\n* Bugfix: default disk name and id were wrong in command line help\n\nv3.0\n\n* ASCII to PETSCII conversion added, this breaks backward\n  compatibility (and therefore warrants a major version increase)!\n* Support for D81 images\n* Default printout is now a full directory similar to how it would be\n  displayed on a Commodore machine\n* -v switch added for verbose output of file and block allocation\n* -M switch added to specify number of characters for filename hash\n  calculation for latest Krill loader\n* -m switch added to skip filename collision check\n* -B switch added to allow setting the displayed file size\n* -o switch added to prevent overwriting of existing files on an image\n* -V switch added to validate images before editing them\n* -T switch added to allow setting the file type\n* -O switch added to allow setting the open flag\n* -P switch added to allow setting the protected flag\n* Hex escapes are now also allowed for disk name and ID\n* When no disk file name is provided, only the base name of the input\n  file is used as disk file name instead of the full path\n* Bugfix: fixed memory access issue for filenames with 16 letters\n* Bugfix: fixed endless loop when reaching track 53 on a D71\n* Bugfix: fixed that (shadow) directory track would be used for data\n  when the shadow directory is a neighbour of the actual directory\n* Bugfix: G64 output is now an optional additional output using -g,\n  avoiding the utterly broken reading of G64 files\n* Bugfix: loop files have actual file size per default instead of 0\n* Bugfix: printouts to stderr and stdout are more consistent now\n\nv2.0\n\n* The first version with a release number\n* All existing modifications consolidated (hopefully)\n* G64 output dependent on output file name instead of a source code\n  define\n* Converted to ANSI C99\n* MSVC build files added\n* getopt removed\n* Simple test suite added\n* Bugfix: hex escape was not considered for file overwrite detection\n* Bugfix: first sector per track was ignored for track 1\n* Bugfix: default sector interleave was ignored for first file\n"
  },
  {
    "path": "tools/generic/CC1541/cc1541.c",
    "content": "/*******************************************************************************\n* Copyright (c) 2008-2022 JackAsser, Krill, Claus, Björn Esser\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in\n* all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*******************************************************************************/\n\n#define VERSION \"3.4\"\n\n#define _CRT_SECURE_NO_WARNINGS /* avoid security warnings for MSVC */\n\n#include <ctype.h>\n#include <locale.h>\n#include <math.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <wchar.h>\n\n#ifdef _WIN32\n#include <io.h>\n#include <fcntl.h>\n#include <stdint.h>\n#endif\n\n#define min(a, b) (((a) < (b)) ? (a) : (b))\n\n#ifdef _WIN32\n#include <windows.h>\n#define FILESEPARATOR '\\\\'\n#else\n#define FILESEPARATOR '/'\n#endif\n\n#define DIRENTRIESPERBLOCK     8\n#define DIRTRACK_D41_D71       18\n#define DIRTRACK_D81           40\n#define SECTORSPERTRACK_D81    40\n#define MAXNUMFILES_D81        ((SECTORSPERTRACK_D81 - 3) * DIRENTRIESPERBLOCK)\n#define DIRENTRYSIZE           32\n#define BLOCKSIZE              256\n#define BLOCKOVERHEAD          2\n#define TRACKLINKOFFSET        0\n#define SECTORLINKOFFSET       1\n#define FILETYPEOFFSET         2\n#define FILETYPEDEL            0\n#define FILETYPESEQ            1\n#define FILETYPEPRG            2\n#define FILETYPEUSR            3\n#define FILETYPEREL            4\n#define FILETYPETRANSWARPMASK  0x100\n#define FILETRACKOFFSET        3\n#define FILESECTOROFFSET       4\n#define FILENAMEOFFSET         5\n#define FILENAMEMAXSIZE        16\n#define FILENAMEEMPTYCHAR      (' ' | 0x80)\n#define TRANSWARPSIGNATROFFSLO 21\n#define TRANSWARPSIGNATURELO   'T'\n#define TRANSWARPSIGNATROFFSHI 22\n#define TRANSWARPSIGNATUREHI   'W'\n#define DIRDATACHECKSUMOFFSET  23\n#define TRANSWARPTRACKOFFSET   24\n#define FILECHECKSUMOFFSET     25\n#define LOADADDRESSLOOFFSET    26\n#define LOADADDRESSHIOFFSET    27\n#define ENDADDRESSLOOFFSET     28\n#define ENDADDRESSHIOFFSET     29\n#define FILEBLOCKSLOOFFSET     30\n#define FILEBLOCKSHIOFFSET     31\n#define D64NUMBLOCKS           (664 + 19)\n#define D64SIZE                (D64NUMBLOCKS * BLOCKSIZE)\n#define D64SIZE_EXTENDED       (D64SIZE + 5 * 17 * BLOCKSIZE)\n#define D71SIZE                (D64SIZE * 2)\n#define D81SIZE                (D81NUMTRACKS * SECTORSPERTRACK_D81 * BLOCKSIZE)\n#define D64NUMTRACKS           35\n#define D64NUMTRACKS_EXTENDED  (D64NUMTRACKS + 5)\n#define D71NUMTRACKS           (D64NUMTRACKS * 2)\n#define D81NUMTRACKS           80\n#define BAM_OFFSET_SPEED_DOS   0xac\n#define BAM_OFFSET_DOLPHIN_DOS 0xc0\n#define DIRSLOTEXISTS          0\n#define DIRSLOTFOUND           1\n#define DIRSLOTNOTFOUND        2\n/* for sector chain analysis */\n#define UNALLOCATED            0 /* unused as of now */\n#define ALLOCATED              1 /* part of a valid sector chain */\n#define FILESTART              2 /* analysed to be the start of a sector chain */\n#define FILESTART_TRUNCATED    3 /* analysed to be the start of a sector chain, was truncated */\n#define POTENTIALLYALLOCATED   4 /* currently being analysed */\n/* error codes for sector chain validation */\n#define VALID                  0 /* valid chain */\n#define ILLEGAL_TRACK          1 /* ends with illegal track pointer */\n#define ILLEGAL_SECTOR         2 /* ends with illegal sector pointer */\n#define LOOP                   3 /* loop in current chain */\n#define COLLISION              4 /* collision with other file */\n#define CHAINED                5 /* ends at another file start */\n#define CHAINED_TRUNCATED      6 /* ends at start of a truncated file */\n#define FIRST_BROKEN           7 /* issue already in first sector */\n/* undelete levels */\n#define RESTORE_DIR_ONLY        0 /* Only restore all dir entries without touching any t/s links */\n#define RESTORE_VALID_FILES     1 /* Fix dir entries for files with valid t/s chains */\n#define RESTORE_VALID_CHAINS    2 /* Also add wild sector chains with valid t/s chains */\n#define RESTORE_INVALID_FILES   3 /* Also fix dir entries with invalid t/s chains */\n#define RESTORE_INVALID_CHAINS  4 /* Also add and fix wild invalid t/s chains */\n#define RESTORE_INVALID_SINGLES 5 /* Also include single block files */\n/* error codes for directory */\n#define DIR_OK                 0\n#define DIR_ILLEGAL_TS         1\n#define DIR_CYCLIC_TS          2\n\n#define TRANSWARP                \"TRANSWARP\"\n#define TRANSWARPBASEBLOCKSIZE   0xc0\n#define TRANSWARPBUFFERBLOCKSIZE 0x1f\n#define TRANSWARPBLOCKSIZE       (TRANSWARPBASEBLOCKSIZE + TRANSWARPBUFFERBLOCKSIZE)\n#define TRANSWARPKEYSIZE         29 /* 232 bits */\n#define TRANSWARPKEYHASHROUNDS   33\n\n/* Table for conversion of uppercase PETSCII to Unicode */\nstatic unsigned int p2u_uppercase_tab[256] = {\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    ' ', '!', '\\\"', '#', '$', '%', '&', 0x2019, '(', ')', '*', '+', ',', '-', '.', '/',\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',\n    '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', 0xa3, ']', 0x2191, 0x2190,\n    0x1fb79, 0x2660, 0x1fb72, 0x1fb78, 0x1fb77, 0x1fb76, 0x1fb7a, 0x1fb71, 0x1fb74, 0x256e, 0x2570, 0x256f, 0x1fb7c, 0x2572, 0x2571, 0x1fb7d,\n    0x1fb7e, 0x25cf, 0x1fb7b, 0x2665, 0x1fb70, 0x256d, 0x2573, 0x25cb, 0x2663, 0x1fb75, 0x2666, 0x253c, 0x1fb8c, 0x2502, 0x3c0, 0x25e5,\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    ' ', 0x258c, 0x2584, 0x2594, 0x2581, 0x258e, 0x1fb95, 0x1fb75, 0x1fb8f, 0x25e4, 0x1fb75, 0x251c, 0x2597, 0x2514, 0x2510, 0x2581,\n    0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d, 0x2590, 0x2594, 0x2580, 0x2583, 0x1fb7f, 0x2596, 0x259d, 0x2518, 0x2598, 0x259a,\n    0x2500, 0x2660, 0x1fb72, 0x2500, 0x1fb77, 0x1fb76, 0x1fb7a, 0x1fb71, 0x1fb74, 0x256e, 0x2570, 0x256f, 0x1fb7c, 0x2572, 0x2571, 0x1fb7d,\n    0x1fb7e, 0x25cf, 0x1fb7b, 0x2665, 0x1fb70, 0x256d, 0x2573, 0x25cb, 0x2663, 0x1fb75, 0x2666, 0x253c, 0x1fb8c, 0x2502, 0x3c0, 0x25e5,\n    ' ', 0x258c, 0x2584, 0x2594, 0x2581, 0x258e, 0x1fb95, 0x1fb75, 0x1fb8f, 0x25e4, 0x1fb75, 0x251c, 0x2597, 0x2514, 0x2510, 0x2581,\n    0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d, 0x1fb88, 0x1fb82, 0x1fb83, 0x2583, 0x1fb7f, 0x2596, 0x259d, 0x2518, 0x2598, 0x3c0\n};\n\n/* Table for conversion of lowercase PETSCII to Unicode */\nstatic unsigned int p2u_lowercase_tab[256] = {\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    ' ', '!', '\\\"', '#', '$', '%', '&', 0x2019, '(', ')', '*', '+', ',', '-', '.', '/',\n    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',\n    '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',\n    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', 0xa3, ']', 0x2191, 0x2190,\n    0x1fb79, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0x253c, 0x1fb8c, 0x2502, 0x1fb95, 0x1fb98,\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',\n    ' ', 0x258c, 0x2584, 0x2594, 0x2581, 0x258e, 0x1fb95, 0x1fb75, 0x1fb8f, 0x1fb99, 0x1fb75, 0x251c, 0x2597, 0x2514, 0x2510, 0x2581,\n    0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d, 0x2590, 0x2594, 0x2580, 0x2583, 0x1fb7f, 0x2713, 0x259d, 0x2518, 0x2598, 0x259a,\n    0x2500, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0x253c, 0x1fb8c, 0x2502, 0x1fb95, 0x1fb98,\n    ' ', 0x258c, 0x2584, 0x2594, 0x2581, 0x258e, 0x1fb95, 0x1fb75, 0x1fb8f, 0x1fb99, 0x1fb75, 0x251c, 0x2597, 0x2514, 0x2510, 0x2581,\n    0x250c, 0x2534, 0x252c, 0x2524, 0x258e, 0x258d, 0x1fb88, 0x1fb82, 0x1fb83, 0x2583, 0x2713, 0x2596, 0x259d, 0x2518, 0x2598, 0x1fb96\n};\n\ntypedef struct {\n    const unsigned char* alocalname;                  /* local file name or name of loop file in ASCII */\n    unsigned char        plocalname[FILENAMEMAXSIZE]; /* loop file in PETSCII */\n    unsigned char        pfilename[FILENAMEMAXSIZE];  /* disk file name in PETSCII */\n    int                  direntryindex;\n    int                  direntrysector;\n    int                  direntryoffset;\n    int                  sectorInterleave;\n    int                  first_sector_new_track;\n    int                  track;\n    int                  sector;\n    int                  nrSectors;\n    int                  nrSectorsShown;\n    int                  filetype;\n    int                  mode;\n    int                  force_new;\n    int                  size;\n    int                  last_track;\n    bool                 have_key;\n    unsigned char        key[TRANSWARPKEYSIZE];\n} imagefile;\n\nenum mode {\n    MODE_BEGINNING_SECTOR_MASK   = 0x003f, /* 6 bits */\n    MODE_MIN_TRACK_MASK          = 0x0fc0, /* 6 bits */\n    MODE_MIN_TRACK_SHIFT         = 6,\n    MODE_SAVETOEMPTYTRACKS       = 0x1000,\n    MODE_FITONSINGLETRACK        = 0x2000,\n    MODE_SAVECLUSTEROPTIMIZED    = 0x4000,\n    MODE_LOOPFILE                = 0x8000,\n    MODE_TRANSWARPBOOTFILE       = 0x10000,\n    MODE_NOFILE                  = 0x20000\n};\n\ntypedef enum {\n    IMAGE_D64,\n    IMAGE_D64_EXTENDED_SPEED_DOS,\n    IMAGE_D64_EXTENDED_DOLPHIN_DOS,\n    IMAGE_D71,\n    IMAGE_D81\n} image_type;\n\nstatic const char *filetypename_uc[] = {\n    \"DEL\", \"SEQ\", \"PRG\", \"USR\", \"REL\", \"CBM\", \"???\", \"???\",\n    \"???\", \"???\", \"???\", \"???\", \"???\", \"???\", \"???\", \"???\"\n};\n\nstatic const char *filetypename_lc[] = {\n    \"del\", \"seq\", \"prg\", \"usr\", \"rel\", \"cbm\", \"???\", \"???\",\n    \"???\", \"???\", \"???\", \"???\", \"???\", \"???\", \"???\", \"???\"\n};\n\nstatic const char *error_name[] = {\n    \"no error\", \"illegal track\", \"illegal sector\", \"loop\", \"collision\", \"chained\", \"chained\", \"first block broken\"\n};\n\nstatic const char *dir_error_string[] = {\n    \"no error\", \"illegal track or sector in directory sector chain\", \"cycle in directory sector chain\"\n};\n\nstatic const int\nsectors_per_track[] = {\n    /*  1-17 */ 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\n    /* 18-24 */ 19,19,19,19,19,19,19,\n    /* 25-30 */ 18,18,18,18,18,18,\n    /* 31-35 */ 17,17,17,17,17,\n    /* 36-52 */ 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\n    /* 53-59 */ 19,19,19,19,19,19,19,\n    /* 60-65 */ 18,18,18,18,18,18,\n    /* 66-70 */ 17,17,17,17,17\n};\n\nstatic const int\nsectors_per_track_extended[] = {\n    /*  1-17 */ 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\n    /* 18-24 */ 19,19,19,19,19,19,19,\n    /* 25-30 */ 18,18,18,18,18,18,\n    /* 31-35 */ 17,17,17,17,17,\n    /* 36-40 */ 17,17,17,17,17,\n    /* 41-57 */ 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,\n    /* 58-64 */ 19,19,19,19,19,19,19,\n    /* 65-70 */ 18,18,18,18,18,18,\n    /* 71-75 */ 17,17,17,17,17,\n    /* 76-80 */ 17,17,17,17,17\n};\n\nstatic int quiet           = 0;  /* global quiet flag */\nstatic int verbose         = 0;      /* global verbose flag */\nstatic int num_files       = 0;      /* number of files to be written provided by the user */\nstatic int max_hash_length = 16;     /* number of bytes of the filenames to calculate the hash over */\nstatic int unicode         = 0;      /* which unicode mapping to use: 0 = none, 1 = upper case, 2 = lower case */\nstatic int modified        = 0;      /* image needs to be written */\nstatic int dir_error       = DIR_OK; /* directory has an error */\n\n/* Prints the command line help */\nstatic void\nusage()\n{\n    printf(\"\\n*** This is cc1541 version \" VERSION \" built on \" __DATE__ \" ***\\n\\n\");\n    printf(\"Usage: cc1541 [options] image.[d64|d71|d81]\\n\\n\");\n    printf(\"-n diskname   Disk name, default='cc1541'.\\n\");\n    printf(\"-i id         Disk ID, default='00 2a'.\\n\");\n    printf(\"-w localname  Write local file to disk, if filename is not set then the\\n\");\n    printf(\"              local name is used. After file written, the filename is unset.\\n\");\n    printf(\"-W localname  Like -w, but encode file in Transwarp format.\\n\");\n    printf(\"              Provide Transwarp bootfile as last file using\\n\");\n    printf(\"              \\\"-f 'transwarp vX.YZ' -w 'transwarp vX.YZ.prg'\\\"\\n\");\n    printf(\"-K key        Set an encryption key for Transwarp files, a string of up to 29\\n\");\n    printf(\"              characters.\\n\");\n    printf(\"-f filename   Use filename as name when writing next file, use prefix # to\\n\");\n    printf(\"              include arbitrary PETSCII characters (e.g. -f \\\"start#a0,8,1\\\").\\n\");\n    printf(\"-o            Do not overwrite if file with same name exists already.\\n\");\n    printf(\"-V            Do not modify image unless it is in valid CBM DOS format.\\n\");\n    printf(\"-T filetype   Filetype for next file, allowed parameters are PRG, SEQ, USR, REL\\n\");\n    printf(\"              and DEL, or a decimal number between 0 and 255. Default is PRG.\\n\");\n    printf(\"-P            Set write protect flag for next file.\\n\");\n    printf(\"-O            Set open flag for next file.\\n\");\n    printf(\"-N            Force creation of a new directory entry, even if a file with the\\n\");\n    printf(\"              same name exists already.\\n\");\n    printf(\"-l filename   Write loop file (an additional dir entry) to existing file to\\n\");\n    printf(\"              disk, set filename with -f.\\n\");\n    printf(\"-L            Add dir entry without writing file (track and sector will be 0),\\n\");\n    printf(\"              requires a filename given with -f.\\n\");\n    printf(\"-B numblocks  Write the given value as file size in blocks to the directory for\\n\");\n    printf(\"              the next file.\\n\");\n    printf(\"-M numchars   Hash computation maximum filename length, this must\\n\");\n    printf(\"              match loader option FILENAME_MAXLENGTH in Krill's Loader.\\n\");\n    printf(\"              Default is 16.\\n\");\n    printf(\"-m            Ignore filename hash collisions, without this switch a collision\\n\");\n    printf(\"              results in an error.\\n\");\n    printf(\"-d track      Maintain a shadow directory (copy of the actual directory without\\n\");\n    printf(\"              a valid BAM).\\n\");\n    printf(\"-t            Use directory track to also store files (makes -x useless)\\n\");\n    printf(\"              (default no).\\n\");\n    printf(\"-u numblocks  When using -t, amount of dir blocks to leave free (default=2).\\n\");\n    printf(\"-x            Don't split files over directory track hole (default split files).\\n\");\n    printf(\"-F            Next file first sector on a new track (default=0).\\n\");\n    printf(\"              Any negative value assumes aligned tracks and uses current\\n\");\n    printf(\"              sector + interleave. After each file, the value falls back to the\\n\");\n    printf(\"              default. Not applicable for D81.\\n\");\n    printf(\"-S value      Default sector interleave, default=10.\\n\");\n    printf(\"              At track end, reduces this by 1 to accommodate large tail gap.\\n\");\n    printf(\"              If negative, no special treatment of tail gap. Not applicable for\\n\");\n    printf(\"              D81.\\n\");\n    printf(\"-s value      Next file sector interleave, valid after each file.\\n\");\n    printf(\"              At track end, reduces this by 1 to accommodate large tail gap.\\n\");\n    printf(\"              If negative, no special treatment of tail gap.\\n\");\n    printf(\"              The interleave value falls back to the default value set by -S\\n\");\n    printf(\"              after the first sector of the next file. Not applicable for D81.\\n\");\n    printf(\"-e            Start next file on an empty track (default start sector is\\n\");\n    printf(\"              current sector plus interleave).\\n\");\n    printf(\"-E            Try to fit file on a single track.\\n\");\n    printf(\"-r track      Restrict next file blocks to the specified track or higher.\\n\");\n    printf(\"-b sector     Set next file beginning sector to the specified value.\\n\");\n    printf(\"              Not applicable for D81.\\n\");\n    printf(\"-c            Save next file cluster-optimized (d71 only).\\n\");\n    printf(\"-4            Use tracks 35-40 with SPEED DOS BAM formatting.\\n\");\n    printf(\"-5            Use tracks 35-40 with DOLPHIN DOS BAM formatting.\\n\");\n    printf(\"-R level      Try to restore deleted and formatted files.\\n\");\n    printf(\"              level 0: Only restore dir entries without touching any t/s links.\\n\");\n    printf(\"              level 1: Fix dir entries for files with valid t/s chains.\\n\");\n    printf(\"              level 2: Also add wild sector chains with valid t/s chains.\\n\");\n    printf(\"              level 3: Also fix dir entries with invalid t/s chains.\\n\");\n    printf(\"              level 4: Also add and fix wild invalid t/s chains.\\n\");\n    printf(\"              level 5: Also add reasonable wild single blocks.\\n\");\n    printf(\"-g filename   Write additional g64 output file with given name.\\n\");\n    printf(\"-a            Print command line options that would create the same directory as\\n\");\n    printf(\"              the one in the given image (for directory art import).\\n\");\n    printf(\"-U mapping    Print PETSCII as Unicode (requires Unicode 13.0 font, e.g.\\n\");\n    printf(\"              UNSCII). Use mapping 0 for ASCII output, 1 for upper case, 2 for\\n\");\n    printf(\"              lower case, default is 0.\\n\");\n    printf(\"-q            Be quiet.\\n\");\n    printf(\"-v            Be verbose.\\n\");\n    printf(\"-h            Print this command line help.\\n\");\n    printf(\"\\n\");\n\n    exit(-1);\n}\n\n/* Returns a pointer to the filename in a path */\nstatic const unsigned char*\nbasename(const unsigned char* path)\n{\n    const unsigned char* name;\n    (name = (unsigned char*)strrchr((char *)path, FILESEPARATOR)) ? ++name : (name = path);\n    return name;\n}\n\n/* Calculates a hash from a filename to be used by Krill's Loader */\nstatic unsigned int\nfilenamehash(const unsigned char *filename)\n{\n    int pos = min(max_hash_length, (int)strlen((char *)filename));\n    while ((pos > 0) && (((unsigned char) filename[pos - 1]) == FILENAMEEMPTYCHAR)) {\n        --pos;\n    }\n\n    unsigned char hashlo = pos;\n    unsigned char hashhi = pos;\n    int carry = 1;\n\n    for (int i = pos - 1; i >= 0; --i) {\n        unsigned int sum = hashlo + filename[i] + carry;\n        carry = (sum >= 256) ? 1 : 0;\n        sum &= 0xff;\n        hashlo = sum;\n        sum += hashhi + carry;\n        carry = (sum >= 256) ? 1 : 0;\n        hashhi = sum;\n    }\n\n    return (hashhi << 8) | hashlo;\n}\n\n/* Returns the size of an image in bytes */\nstatic unsigned int\nimage_size(image_type type)\n{\n    switch (type) {\n    case IMAGE_D64:\n        return D64SIZE;\n\n    case IMAGE_D64_EXTENDED_SPEED_DOS:\n    /* fall through */\n    case IMAGE_D64_EXTENDED_DOLPHIN_DOS:\n        return D64SIZE_EXTENDED;\n\n    case IMAGE_D71:\n        return D71SIZE;\n\n    case IMAGE_D81:\n        return D81SIZE;\n\n    default:\n        return 0;\n    }\n}\n\n/* Returns the number of tracks in an image */\nstatic unsigned int\nimage_num_tracks(image_type type)\n{\n    switch (type) {\n    case IMAGE_D64:\n        return D64NUMTRACKS;\n\n    case IMAGE_D64_EXTENDED_SPEED_DOS:\n    /* fall through */\n    case IMAGE_D64_EXTENDED_DOLPHIN_DOS:\n        return D64NUMTRACKS_EXTENDED;\n\n    case IMAGE_D71:\n        return D71NUMTRACKS;\n\n    case IMAGE_D81:\n        return D81NUMTRACKS;\n\n    default:\n        return 0;\n    }\n}\n\n/* Returns the number of sectors for a given track */\nstatic int\nnum_sectors(image_type type, int track)\n{\n    return (type == IMAGE_D81) ? SECTORSPERTRACK_D81\n           : (((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) ? sectors_per_track_extended[track - 1]\n              : sectors_per_track[track - 1]);\n}\n\n/* Returns the number of blocks in an image */\nstatic unsigned int\nimage_num_blocks(image_type type)\n{\n    int num_blocks = 0;\n    for (unsigned int t = 1; t <= image_num_tracks(type); t++) {\n        num_blocks += num_sectors(type, t);\n    }\n    return num_blocks;\n}\n\n/* Returns the directory track of an image */\nstatic int\ndirtrack(image_type type)\n{\n    return (type == IMAGE_D81) ? DIRTRACK_D81 : DIRTRACK_D41_D71;\n}\n\n/* Converts an ASCII character to PETSCII */\nstatic unsigned char\na2p(unsigned char a)\n{\n    switch (a) {\n    case '\\n':\n        return 0x0d;\n    case '_':\n        return 0xa4;\n    case 0x7e:\n        return 0xff;\n    default:\n        if ((a >= 0x5b) && (a < 0x5f)) {\n            return a;\n        }\n        if ((a >= 0x60) && (a <= 0x7e)) {\n            return a ^ 0x20;\n        }\n        if ((a >= 'A') && (a <= 'Z')) {\n            return a | 0x80;\n        }\n        return a;\n    }\n}\n\n/* Converts a PETSCII character to ASCII */\nstatic unsigned char\np2a(unsigned char p)\n{\n    switch (p) {\n    case 0x0a:\n    case 0x0d:\n        return '\\n';\n    case 0x40:\n    case 0x60:\n        return p;\n    case 0xa0:\n    case 0xe0:\n        return ' ';\n    case 0xa4:\n    case 0xe4:\n        return '_';\n    default:\n        switch (p & 0xe0) {\n        case 0x40:\n        case 0x60:\n            p ^= 0x20;\n            break;\n        case 0xc0:\n            p ^= 0x80;\n            break;\n        }\n    }\n    return ((isprint(p) ? p : '.'));\n}\n\n/* Converts an ASCII string to PETSCII filled up with Shift-Space to length */\nstatic void\nascii2petscii(const unsigned char* ascii, unsigned char* petscii, int len)\n{\n    int pos = 0;\n    while (ascii[pos] != '\\0' && pos < len) {\n        petscii[pos] = a2p(ascii[pos]);\n        ++pos;\n    }\n    while (pos < len) {\n        petscii[pos] = FILENAMEEMPTYCHAR;\n        ++pos;\n    }\n}\n\n/* Prints a PETSCII filename as ASCII with escapes */\nstatic void\nprint_filename_with_escapes(const unsigned char* petscii, int len)\n{\n    /* find end of petscii string */\n    while(len > 1 && petscii[len-1] == 0xa0) {\n        len--;\n    }\n    for(int ppos = 0; ppos < len; ppos++) {\n        unsigned char c = petscii[ppos];\n        if((c >= 48 && c <= 57) || (c >= 65 && c <= 90) || (c >= 97 && c <= 122) || c == 32) {\n            switch (c & 0xe0) {\n            case 0x40:\n            case 0x60:\n                putchar(c ^ 0x20);\n                break;\n            default:\n                putchar(c);\n            }\n        } else {\n            printf(\"#%02x\", c);\n        }\n    }\n}\n\n/* Determines length of 0xa0 terminated PETSCII string */\nstatic int\npstrlen(const unsigned char* string)\n{\n    int len = 0;\n    while(string[len] != 0xa0 && len < FILENAMEMAXSIZE) {\n        len++;\n    }\n    return len;\n}\n\n/* Writes digit decimal number into PETSCII string */\n#define PPUTNUM_BUF_LEN 17\nstatic void\npputnum(unsigned char* string, unsigned int num)\n{\n    char buffer[PPUTNUM_BUF_LEN];\n    snprintf(buffer, PPUTNUM_BUF_LEN, \"%d\", num);\n    for(unsigned int len = 0; len < strlen(buffer); len++) {\n        string[len] = a2p(buffer[len]);\n    }\n}\n\n/* Writes 2 digit decimal number into PETSCII string */\n#define PPUTNUM2_BUF_LEN 3\nstatic void\npputnum2(unsigned char* string, unsigned int num)\n{\n    char buffer[PPUTNUM2_BUF_LEN];\n    snprintf(buffer, PPUTNUM2_BUF_LEN, \"%02d\", num);\n    for(unsigned int len = 0; len < strlen(buffer); len++) {\n        string[len] = a2p(buffer[len]);\n    }\n}\n\n/* Writes 4 digit hex number into PETSCII string */\n#define PPUTHEX_BUF_LEN 5\nstatic void\npputhex(unsigned char* string, unsigned int num)\n{\n    char buffer[PPUTHEX_BUF_LEN];\n    snprintf(buffer, PPUTHEX_BUF_LEN, \"%04x\", num);\n    for(int len = 0; len < 4; len++) {\n        string[len] = a2p(buffer[len]);\n    }\n}\n\n/* Converts a two digit hex string to an int */\nstatic unsigned int\nhex2int(char hex)\n{\n    if ((hex < '0' || hex > '9') && (hex < 'a' || hex > 'f')) {\n        fprintf(stderr, \"ERROR: Invalid hex string in filename\\n\");\n\n        exit(-1);\n    }\n    if (hex <= '9') {\n        hex -= '0';\n    } else {\n        hex -= 'a' - 10;\n    }\n    return (unsigned int)hex;\n}\n\n/* Converts an ASCII string to PETSCII with escape evaluation filled up with emptychar to length */\nstatic void\nevalhexescape(const unsigned char* ascii, unsigned char* petscii, int len, unsigned char emptychar)\n{\n    int read = 0, write = 0;\n\n    while (ascii[read] != '\\0' && write < len) {\n        if (ascii[read] == '#') {\n            unsigned int hi = hex2int(ascii[++read]);\n            unsigned int lo = hex2int(ascii[++read]);\n            petscii[write] = (unsigned char)(16 * hi + lo);\n        } else {\n            petscii[write] = a2p(ascii[read]);\n        }\n        read++;\n        write++;\n    }\n    while (write < len) {\n        petscii[write] = emptychar;\n        ++write;\n    }\n}\n\n/* Converts a unicode character to utf8 */\nchar* utf8_encode(int c, char* out)\n{\n    if (c < 0x80)\n        *out++ =(c & 0xff);\n    else if (c < 0x800) {\n        *out++ = (0xC0 | ((c >> 6) & 0x1f));\n        *out++ = (0x80 | (c & 0x3f));\n    } else if (c < 0x10000) {\n        *out++ = (0xE0 | ((c >> 12) & 0xf));\n        *out++ = (0x80 | ((c >> 6) & 0x3f));\n        *out++ = (0x80 | (c & 0x3f));\n    } else {\n        *out++ = (0xF0 | ((c >> 18) & 0x07));\n        *out++ = (0x80 | ((c >> 12) & 0x3f));\n        *out++ = (0x80 | ((c >> 6) & 0x3f));\n        *out++ = (0x80 | (c & 0x3f));\n    }\n    return out;\n}\n\n#ifdef _WIN32\n/* Enables console formatting under Windows if possible */\nstatic bool\nEnableVTMode()\n{\n    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);\n    if (hOut == INVALID_HANDLE_VALUE) {\n        return false;\n    }\n    DWORD dwMode = 0;\n    if (!GetConsoleMode(hOut, &dwMode)) {\n        return false;\n    }\n    dwMode |= 0x0004; /* ENABLE_VIRTUAL_TERMINAL_PROCESSING not defined for older SDKs */\n    if (!SetConsoleMode(hOut, dwMode)) {\n        return false;\n    }\n    return true;\n}\n#endif\n\n/* Enables reverse printing to console */\nvoid reverse_print_on()\n{\n#ifdef _WIN32\n    /* Avoid escape values for inverse printing under Windows if they are not supported by the console */\n    if (EnableVTMode()) {\n        printf(\"\\033[7m\");\n    }\n#else\n    printf(\"\\033[7m\");\n#endif\n}\n\n/* Disables reverse printing to console */\nvoid reverse_print_off()\n{\n#ifdef _WIN32\n    /* Avoid escape values for inverse printing under Windows if they are not supported by the console */\n    if (EnableVTMode()) {\n        printf(\"\\033[m\");\n    }\n#else\n    printf(\"\\033[m\");\n#endif\n}\n\n/* Prints a PETSCII character */\nstatic void\nputp(unsigned char petscii, FILE *file)\n{\n    if (unicode) {\n        int u;\n        int reverse = 0;\n\n        if (petscii < 0x20 || (petscii >= 0x80 && petscii <= 0x9f)) {\n            reverse = 1;\n            reverse_print_on();\n            petscii += 0x40;\n        }\n\n        if (unicode == 1) {\n            u = p2u_uppercase_tab[petscii];\n        } else {\n            u = p2u_lowercase_tab[petscii];\n        }\n\n#ifdef _WIN32\n        _setmode(_fileno(file), _O_U16TEXT);\n        putwc(u, file);\n        _setmode(_fileno(file), _O_TEXT);\n#else\n        {\n            char temp[5];\n            *utf8_encode(u, temp) = 0; /* fancy way to zero-terminate temp after conversion */\n            fputs(temp, file);\n        }\n#endif\n\n        if(reverse) {\n            reverse_print_off();\n        }\n    } else {\n        putc(p2a(petscii), file);\n    }\n}\n\n/* Prints a PETSCII string */\nstatic void\nprint_petscii(unsigned char *petscii, int len)\n{\n    for(int i = 0; i < len; i++) {\n        putp(petscii[i], stdout);\n    }\n}\n\n/* Prints the given PETSCII filename like the C64 when listing the directory */\nstatic void\nprint_dirfilename(unsigned char* pfilename)\n{\n    int ended = 0;\n    putc('\\\"', stdout);\n    for (int pos = 0; pos < FILENAMEMAXSIZE; pos++) {\n        unsigned char c = pfilename[pos];\n        if (c == FILENAMEEMPTYCHAR) {\n            if (!ended) {\n                putc('\\\"', stdout);\n                ended = 1;\n            } else {\n                putc(' ', stdout);\n            }\n        } else {\n            putp(c, stdout);\n        }\n    }\n    if (!ended) {\n        putc('\\\"', stdout);\n    } else {\n        putc(' ', stdout);\n    }\n}\n\n/* Prints the given PETSCII filename */\nstatic void\nprint_filename(FILE *file, unsigned char* pfilename)\n{\n    putc('\\\"', file);\n    for (int pos = 0; pos < FILENAMEMAXSIZE; pos++) {\n        if (pfilename[pos] == FILENAMEEMPTYCHAR) {\n            break;\n        }\n        putp(pfilename[pos], file);\n    }\n    putc('\\\"', file);\n}\n\n/* Calculates the overall sector index from a given track and sector, returns -1 for invalid track/sector */\nstatic int\nlinear_sector(image_type type, int track, int sector)\n{\n    if ((track < 1) || (track > ((type == IMAGE_D81) ? D81NUMTRACKS : ((type == IMAGE_D64) ? D64NUMTRACKS : (type == IMAGE_D71 ? D71NUMTRACKS : D64NUMTRACKS_EXTENDED))))) {\n        return -1;\n    }\n\n    int numsectors = num_sectors(type, track);\n    if ((sector < 0) || (sector >= numsectors)) {\n        return -1;\n    }\n\n    int linear_sector = 0;\n    for (int i = 0; i < track - 1; i++) {\n        linear_sector += num_sectors(type, i + 1);\n    }\n    linear_sector += sector;\n\n    return linear_sector;\n}\n\n/* Returns the image offset of the bam entry for a given track */\nstatic int\nget_bam_offset(image_type type, unsigned int track)\n{\n    int bam;\n    unsigned int offset;\n\n    if (type == IMAGE_D81) {\n        if (track <= 40) {\n            bam = linear_sector(type, dirtrack(type), 1 /* sector */) * BLOCKSIZE;\n            offset = bam + (track * 6) + 11;\n        } else {\n            bam = linear_sector(type, dirtrack(type), 2 /* sector */) * BLOCKSIZE;\n            offset = bam + ((track - 40) * 6) + 11;\n        }\n    } else if ((type == IMAGE_D71) && (track > D64NUMTRACKS)) {\n        /* access second side bam */\n        bam = linear_sector(type, dirtrack(type) + D64NUMTRACKS, 0) * BLOCKSIZE;\n        offset = bam + (track - D64NUMTRACKS - 1) * 3;\n    } else {\n        if (((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) && (track > D64NUMTRACKS)) {\n            track -= D64NUMTRACKS;\n            bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE + ((type == IMAGE_D64_EXTENDED_SPEED_DOS) ? BAM_OFFSET_SPEED_DOS : BAM_OFFSET_DOLPHIN_DOS);\n        } else {\n            bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE;\n        }\n        offset = bam + track * 4 + 1;\n    }\n    return offset;\n}\n\n/* Checks if a given sector is marked as free in the BAM and also not used by directory */\nstatic int\nis_sector_free(image_type type, const unsigned char* image, int track, int sector, int numdirblocks, int dir_sector_interleave)\n{\n    int bam;\n    const unsigned char* bitmap;\n\n    if (sector < 0) {\n        fprintf(stderr, \"ERROR: Illegal sector %d for track %d\\n\", sector, track);\n\n        exit(-1);\n    }\n\n    if (type == IMAGE_D81) {\n        if (track <= 40) {\n            bam = linear_sector(type, dirtrack(type), 1 /* sector */) * BLOCKSIZE;\n            bitmap = image + bam + (track * 6) + 11;\n        } else {\n            bam = linear_sector(type, dirtrack(type), 2 /* sector */) * BLOCKSIZE;\n            bitmap = image + bam + ((track - 40) * 6) + 11;\n        }\n    } else if ((type == IMAGE_D71) && (track > D64NUMTRACKS)) {\n        /* access second side bam */\n        bam = linear_sector(type, dirtrack(type) + D64NUMTRACKS, 0) * BLOCKSIZE;\n        bitmap = image + bam + (track - D64NUMTRACKS - 1) * 3;\n    } else {\n        if (((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) && (track > D64NUMTRACKS)) {\n            track -= D64NUMTRACKS;\n            bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE + ((type == IMAGE_D64_EXTENDED_SPEED_DOS) ? BAM_OFFSET_SPEED_DOS : BAM_OFFSET_DOLPHIN_DOS);\n        } else {\n            bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE;\n        }\n        bitmap = image + bam + (track * 4) + 1;\n    }\n\n    int byte = sector >> 3;\n    int bit = sector & 7;\n\n    int is_not_dir_block = 1;\n    if ((track == dirtrack(type)) && (numdirblocks > 0)) {\n        int dirsector = 0;\n        int s = 2;\n        for (int i = 0; is_not_dir_block && (i < numdirblocks); i++) {\n            switch (i) {\n            case 0:\n                dirsector = 0;\n                break;\n\n            case 1:\n                dirsector = 1;\n                break;\n\n            default:\n                dirsector += dir_sector_interleave;\n                if (dirsector >= num_sectors(type, track)) {\n                    dirsector = s;\n                    s++;\n                }\n                break;\n            }\n            is_not_dir_block = (sector != dirsector);\n        }\n    }\n\n    return is_not_dir_block && ((bitmap[byte] & (1 << bit)) != 0);\n}\n\n/* Marks given sector in BAM */\nstatic void\nmark_sector(image_type type, unsigned char* image, int track, int sector, int free)\n{\n    if (free != is_sector_free(type, image, track, sector, 0, 0)) {\n        int bam;\n        unsigned char* bitmap;\n        if (type == IMAGE_D81) {\n            if (track <= 40) {\n                bam = linear_sector(type, dirtrack(type), 1 /* sector */) * BLOCKSIZE;\n                bitmap = image + bam + (track * 6) + 11;\n            } else {\n                bam = linear_sector(type, dirtrack(type), 2 /* sector */) * BLOCKSIZE;\n                bitmap = image + bam + ((track - 40) * 6) + 11;\n            }\n\n            /* update number of free sectors on track */\n            if (free) {\n                ++bitmap[-1];\n            } else {\n                --bitmap[-1];\n            }\n        } else if ((type == IMAGE_D71) && (track > D64NUMTRACKS)) {\n            /* access second side bam */\n            bam = linear_sector(type, dirtrack(type) + D64NUMTRACKS, 0) * BLOCKSIZE;\n            bitmap = image + bam + (track - D64NUMTRACKS - 1) * 3;\n\n            /* update number of free sectors on track */\n            if (free) {\n                image[bam + 0xdd + track - D64NUMTRACKS - 1]++;\n            } else {\n                image[bam + 0xdd + track - D64NUMTRACKS - 1]--;\n            }\n        } else {\n            if (((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) && (track > D64NUMTRACKS)) {\n                track -= D64NUMTRACKS;\n                bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE + ((type == IMAGE_D64_EXTENDED_SPEED_DOS) ? BAM_OFFSET_SPEED_DOS : BAM_OFFSET_DOLPHIN_DOS);\n            } else {\n                bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE;\n            }\n            bitmap = image + bam + (track * 4) + 1;\n\n            /* update number of free sectors on track */\n            if (free) {\n                ++image[bam + (track * 4)];\n            } else {\n                --image[bam + (track * 4)];\n            }\n        }\n\n        /* update bitmap */\n        int byte = sector >> 3;\n        int bit = sector & 7;\n\n        if (free) {\n            bitmap[byte] |= 1 << bit;\n        } else {\n            bitmap[byte] &= ~(1 << bit);\n        }\n    }\n}\n\n/* Returns offset for header on directory track */\nstatic int\nget_header_offset(image_type type)\n{\n    int offset;\n\n    if (type == IMAGE_D81) {\n        offset = 4;\n    } else {\n        offset = 0x90;\n    }\n    return offset;\n}\n\n/* Returns offset for id on directory track */\nstatic int\nget_id_offset(image_type type)\n{\n    int offset;\n\n    if (type == IMAGE_D81) {\n        offset = 0x16;\n    } else {\n        offset = 0xa2;\n    }\n    return offset;\n}\n\n/* Updates the directory with the given header and id */\nstatic void\nupdate_directory(image_type type, unsigned char* image, unsigned char* header, unsigned char* id, int shadowdirtrack)\n{\n    unsigned int bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE;\n\n    if (type != IMAGE_D81) {\n        image[bam + 0x03] = (type == IMAGE_D71) ? 0x80 : 0x00;\n    }\n\n    /* Set header and ID */\n    unsigned char pheader[FILENAMEMAXSIZE];\n    unsigned char pid[5];\n    evalhexescape(header, pheader, FILENAMEMAXSIZE, FILENAMEEMPTYCHAR);\n    evalhexescape(id, pid, 5, FILENAMEEMPTYCHAR);\n    memcpy(image + bam + get_header_offset(type), pheader, FILENAMEMAXSIZE);\n    memcpy(image + bam + get_id_offset(type), pid, 5);\n\n    if (type == IMAGE_D81) {\n        unsigned int bam = linear_sector(type, dirtrack(type), 1 /* sector */) * BLOCKSIZE;\n        image[bam + 0x04] = id[0];\n        image[bam + 0x05] = id[1];\n\n        bam = linear_sector(type, dirtrack(type), 2 /* sector */) * BLOCKSIZE;\n        image[bam + 0x04] = id[0];\n        image[bam + 0x05] = id[1];\n    }\n\n    if (shadowdirtrack > 0) {\n        unsigned int shadowbam = linear_sector(type, shadowdirtrack, 0 /* sector */) * BLOCKSIZE;\n        memcpy(image + shadowbam, image + bam, BLOCKSIZE);\n\n        image[shadowbam + 0x00] = shadowdirtrack;\n    }\n}\n\n/* Writes an empty directory and BAM */\nstatic void\ninitialize_directory(image_type type, unsigned char* image, unsigned char* header, unsigned char* id, int shadowdirtrack)\n{\n    unsigned int dir = linear_sector(type, dirtrack(type), 0 /* sector */) * BLOCKSIZE;\n\n    /* Clear image */\n    memset(image, 0, image_size(type));\n\n    /* Write initial BAM */\n    if (type == IMAGE_D81) {\n        image[dir + 0x00] = dirtrack(type);\n        image[dir + 0x01] = 3;\n        image[dir + 0x02] = 0x44;\n\n        image[dir + 0x14] = FILENAMEEMPTYCHAR;\n        image[dir + 0x15] = FILENAMEEMPTYCHAR;\n\n        image[dir + 0x1b] = FILENAMEEMPTYCHAR;\n        image[dir + 0x1c] = FILENAMEEMPTYCHAR;\n\n        unsigned int bam = linear_sector(type, dirtrack(type), 1 /* sector */) * BLOCKSIZE;\n        image[bam + 0x00] = dirtrack(type);\n        image[bam + 0x01] = 2;\n        image[bam + 0x02] = 0x44;\n        image[bam + 0x03] = 0xbb;\n        image[bam + 0x06] = 0xc0;\n\n        bam = linear_sector(type, dirtrack(type), 2 /* sector */) * BLOCKSIZE;\n        image[bam + 0x00] = 0;\n        image[bam + 0x01] = 255;\n        image[bam + 0x02] = 0x44;\n        image[bam + 0x03] = 0xbb;\n        image[bam + 0x06] = 0xc0;\n    } else {\n        image[dir + 0x00] = dirtrack(type);\n        image[dir + 0x01] = 1;\n        image[dir + 0x02] = 0x41;\n        image[dir + 0x03] = (type == IMAGE_D71) ? 0x80 : 0x00;\n\n        image[dir + 0xa0] = FILENAMEEMPTYCHAR;\n        image[dir + 0xa1] = FILENAMEEMPTYCHAR;\n\n        image[dir + 0xa7] = FILENAMEEMPTYCHAR;\n        image[dir + 0xa8] = FILENAMEEMPTYCHAR;\n        image[dir + 0xa9] = FILENAMEEMPTYCHAR;\n        image[dir + 0xaa] = FILENAMEEMPTYCHAR;\n    }\n\n    /* Mark all sectors unused */\n    for (unsigned int t = 1; t <= image_num_tracks(type); t++) {\n        for (int s = 0; s < num_sectors(type, t); s++) {\n            mark_sector(type, image, t, s, 1 /* free */);\n        }\n    }\n\n    /* Reserve space for BAM */\n    mark_sector(type, image, dirtrack(type), 0 /* sector */, 0 /* not free */);\n    if (type == IMAGE_D71) {\n        mark_sector(type, image, dirtrack(type) + D64NUMTRACKS, 0 /* sector */, 0 /* not free */);\n    } else if (type == IMAGE_D81) {\n        mark_sector(type, image, dirtrack(type), 1 /* sector */, 0 /* not free */);\n        mark_sector(type, image, dirtrack(type), 2 /* sector */, 0 /* not free */);\n    }\n\n    /* first dir block */\n    unsigned int dirblock = linear_sector(type, dirtrack(type), (type == IMAGE_D81) ? 3 : 1) * BLOCKSIZE;\n    image[dirblock + SECTORLINKOFFSET] = 255;\n    mark_sector(type, image, dirtrack(type), (type == IMAGE_D81) ? 3 : 1 /* sector */, 0 /* not free */);\n\n    if (shadowdirtrack > 0) {\n        dirblock = linear_sector(type, shadowdirtrack, (type == IMAGE_D81) ? 3 : 1 /* sector */) * BLOCKSIZE;\n        image[dirblock + SECTORLINKOFFSET] = 255;\n\n        mark_sector(type, image, shadowdirtrack, 0 /* sector */, 0 /* not free */);\n        mark_sector(type, image, shadowdirtrack, (type == IMAGE_D81) ? 3 : 1 /* sector */, 0 /* not free */);\n    }\n\n    update_directory(type, image, header, id, shadowdirtrack);\n}\n\n/* Computes Transwarp dirdata checksum */\nstatic unsigned char\ntranswarp_dirdata_checksum(const unsigned char *image, int dir_entry_offset)\n{\n    int dirdata_checksum = 0;\n    int carry = 1;\n    for (int offset = DIRDATACHECKSUMOFFSET; offset <= FILEBLOCKSLOOFFSET; ++offset) {\n        dirdata_checksum += (image[dir_entry_offset + offset] + carry);\n        carry = (dirdata_checksum >= 0x0100) ? 1 : 0;\n        dirdata_checksum &= 0xff;\n    }\n\n    return dirdata_checksum;\n}\n\n/* Checks if a given dir entry points to a Transwarp file */\nstatic bool\nis_transwarp_file(const unsigned char *image, int dir_entry_offset)\n{\n    return (image[dir_entry_offset + TRANSWARPSIGNATROFFSLO] == TRANSWARPSIGNATURELO)\n           && (image[dir_entry_offset + TRANSWARPSIGNATROFFSHI] == TRANSWARPSIGNATUREHI)\n           && (transwarp_dirdata_checksum(image, dir_entry_offset) == 0);\n}\n\n/* Checks if a given dir entry points to the Transwarp bootfile */\nstatic bool\nis_transwarp_bootfile(const unsigned char *image, int dir_entry_offset)\n{\n    return memcmp(image + dir_entry_offset + FILENAMEOFFSET, TRANSWARP, strlen(TRANSWARP)) == 0;\n}\n\n/* Return Transwarp file stat */\nstatic int\ntranswarp_stat(image_type type, const unsigned char *image, int dir_entry_offset, int *start_track, int *end_track, int *low_track, int *high_track)\n{\n    *start_track = 0;\n    *end_track = 0;\n    *low_track = 0;\n    *high_track = 0;\n\n    int filesize = (image[dir_entry_offset + ENDADDRESSLOOFFSET]  | (image[dir_entry_offset + ENDADDRESSHIOFFSET] << 8))\n                   - (image[dir_entry_offset + LOADADDRESSLOOFFSET] | (image[dir_entry_offset + LOADADDRESSHIOFFSET] << 8));\n    if (filesize <= 0) {\n        return 0;\n    }\n\n    *start_track = image[dir_entry_offset + TRANSWARPTRACKOFFSET];\n    *end_track = *start_track;\n\n    int size = filesize;\n\n    while (filesize > 0) {\n        filesize -= (TRANSWARPBLOCKSIZE * num_sectors(type, *end_track));\n        if (filesize > 0) {\n            *end_track = (*end_track < DIRTRACK_D41_D71) ? (*end_track - 1) : (*end_track + 1);\n        }\n    }\n\n    *low_track = (*start_track < *end_track) ? *start_track : *end_track;\n    *high_track = (*start_track > *end_track) ? *start_track : *end_track;\n\n    return size;\n}\n\n/* Return Transwarp file stat */\nstatic int\ntranswarp_size(image_type type, int start_track, int end_track, int filesize,\n               int *transwarp_blocks, int *nonredundant_blocks, int *redundant_blocks, int *nonredundant_blocks_on_last_track)\n{\n    *transwarp_blocks = 0;\n\n    int last_track_sectors;\n    if (start_track <= end_track) {\n        for (int track = start_track; track <= end_track; ++track) {\n            last_track_sectors = num_sectors(type, track);\n            *transwarp_blocks += last_track_sectors;\n        }\n    } else {\n        for (int track = start_track; track >= end_track; --track) {\n            last_track_sectors = num_sectors(type, track);\n            *transwarp_blocks += last_track_sectors;\n        }\n    }\n\n    int spare_bytes = TRANSWARPBLOCKSIZE - (filesize % TRANSWARPBLOCKSIZE);\n    if (spare_bytes == TRANSWARPBLOCKSIZE) {\n        spare_bytes = 0;\n    }\n\n    *nonredundant_blocks = (filesize / TRANSWARPBLOCKSIZE) + ((spare_bytes == 0) ? 0 : 1);\n    *redundant_blocks = *transwarp_blocks - *nonredundant_blocks;\n    *nonredundant_blocks_on_last_track = last_track_sectors - *redundant_blocks;\n\n    return spare_bytes;\n}\n\n/* Deletes a file from disk and BAM, but leaves the directory entry */\nstatic void\nwipe_file(image_type type, unsigned char* image, imagefile* file)\n{\n    int b = linear_sector(type, dirtrack(type), file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n\n    if (is_transwarp_file(image, b)) {\n        int start_track;\n        int end_track;\n        int low_track;\n        int high_track;\n        int filesize = transwarp_stat(type, image, b, &start_track, &end_track, &low_track, &high_track);\n        if (filesize <= 0) {\n            fprintf(stderr, \"ERROR: Cannot overwrite Transwarp file \");\n            print_filename(stderr, file->pfilename);\n            fprintf(stderr, \"\\n\");\n\n            exit(-1);\n        }\n\n        for (int track = low_track; track <= high_track; ++track) {\n            for (int sector = 0; sector < num_sectors(type, track); ++sector) {\n                int block_offset = linear_sector(type, track, sector) * BLOCKSIZE;\n                memset(image + block_offset, 0, BLOCKSIZE);\n                mark_sector(type, image, track, sector, 1 /* free */);\n            }\n        }\n\n        return;\n    }\n\n    unsigned int track = image[b + FILETRACKOFFSET];\n    unsigned int sector = image[b + FILESECTOROFFSET];\n\n    if (sector >= 0x80) {\n        return; /* loop file */\n    }\n\n    while (track != 0) {\n        int block_offset = linear_sector(type, track, sector) * BLOCKSIZE;\n        int next_track = image[block_offset + TRACKLINKOFFSET];\n        int next_sector = image[block_offset + SECTORLINKOFFSET];\n        memset(image + block_offset, 0, BLOCKSIZE); /* this also fixes any cyclic t/s chain */\n        mark_sector(type, image, track, sector, 1 /* free */);\n        track = next_track;\n        sector = next_sector;\n    }\n}\n\n/* Sets image offset to the next DIR entry, returns false when the DIR end was reached */\nstatic bool\nnext_dir_entry(image_type type, const unsigned char* image, int *track, int *sector, int *offset, char *blockmap)\n{\n    int b = linear_sector(type, *track, *sector); /* assuming here that the given t/s is valid */\n    blockmap[b] = 1;\n    if (*offset % BLOCKSIZE == 7 * DIRENTRYSIZE) {\n        /* last entry in sector */\n        int next_track = image[b * BLOCKSIZE + TRACKLINKOFFSET];\n        if (next_track == 0) {\n            /* this was the last DIR sector */\n            return false;\n        }\n        int next_sector = image[b * BLOCKSIZE + SECTORLINKOFFSET];\n        b = linear_sector(type, next_track, next_sector);\n        if(b < 0) {\n            dir_error = DIR_ILLEGAL_TS;\n            return false;\n        }\n        if(blockmap[b]) {\n            dir_error = DIR_CYCLIC_TS;\n            return false;\n        }\n        *track = next_track;\n        *sector = next_sector;\n        *offset = 0;\n    } else {\n        *offset += DIRENTRYSIZE;\n    }\n    return true;\n}\n\n/* Finds all filenames with the given hash */\nstatic int\ncount_hashes(image_type type, const unsigned char* image, unsigned int hash, bool print)\n{\n    int num = 0;\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int dt = dirtrack(type);\n    int offset = 0;\n    do {\n        int dirblock = linear_sector(type, dt, ds) * BLOCKSIZE + offset;\n        int filetype = image[dirblock + FILETYPEOFFSET];\n\n        if (filetype != FILETYPEDEL) {\n            unsigned char *filename = (unsigned char *) image + dirblock + FILENAMEOFFSET;\n            if (hash == filenamehash(filename)) {\n                ++num;\n\n                if (print) {\n                    printf(\" [$%04x] \", filenamehash(filename));\n                    print_filename(stdout, filename);\n                    printf(\"\\n\");\n                }\n            }\n        }\n    } while (next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n\n    return num;\n}\n\n/* Checks if multiple filenames have the same hash */\nstatic bool\ncheck_hashes(image_type type, const unsigned char* image)\n{\n    bool collision = false;\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n    printf(\"\\n\");\n\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int dt = dirtrack(type);\n    int offset = 0;\n    do {\n        int dirblock = linear_sector(type, dt, ds) * BLOCKSIZE + offset;\n        int filetype = image[dirblock + FILETYPEOFFSET];\n\n        if (filetype != FILETYPEDEL) {\n            unsigned char *filename = (unsigned char *) image + dirblock + FILENAMEOFFSET;\n            if (count_hashes(type, image, filenamehash(filename), false /* print */) > 1) {\n                collision = 1;\n                fprintf(stderr, \"Hash of filename \");\n                print_filename(stderr, filename);\n                fprintf(stderr, \" [$%04x] is not unique\\n\", filenamehash(filename));\n                count_hashes(type, image, filenamehash(filename), true /* print */);\n            }\n        }\n    } while (next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n    return collision;\n}\n\n/* Searches for an existing DIR entry with the given name, returns false if it does not exist */\nstatic bool\nfind_existing_file(image_type type, unsigned char* image, unsigned char* filename, int *index, int *track, int *sector, int *offset)\n{\n    *track = dirtrack(type);\n    *sector = (type == IMAGE_D81) ? 3 : 1;\n    *offset = 0;\n    *index = 0;\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n\n    do {\n        int b = linear_sector(type, *track, *sector) * BLOCKSIZE + *offset;\n        int filetype = image[b + FILETYPEOFFSET];\n        if(filetype != 0 && memcmp(image + b + FILENAMEOFFSET, filename, FILENAMEMAXSIZE) == 0) {\n            return true;\n        }\n        ++(*index);\n    } while (next_dir_entry(type, image, track, sector, offset, blockmap));\n\n    free(blockmap);\n    return false;\n}\n\n/* Returns an empty DIR slot, allocates a new DIR sector if required */\nstatic void\nnew_dir_slot(image_type type, unsigned char* image, int dir_sector_interleave, int shadowdirtrack, int *index, int *dirsector,  int *entry_offset, imagefile files[])\n{\n    int track = dirtrack(type);\n    *dirsector = (type == IMAGE_D81) ? 3 : 1;\n    *entry_offset = 0;\n    int lindex = 0;\n\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n\n    do {\n        int b = linear_sector(type, track, *dirsector) * BLOCKSIZE + *entry_offset;\n        if (image[b + FILETYPEOFFSET] == FILETYPEDEL) {\n            /* Check if the apparently free slot is used by a new filetype 0 file */\n            bool used = false;\n            for(int f = 0; f < num_files; f++) {\n                if(files[f].direntryindex == lindex) {\n                    used = true;\n                    break;\n                }\n            }\n            if(!used) {\n                *index = lindex;\n                free(blockmap);\n                return; /* found an empty slot */\n            }\n        }\n        ++lindex;\n    } while (next_dir_entry(type, image, &track, dirsector, entry_offset, blockmap));\n    free(blockmap);\n\n    /* allocate new dir block */\n    int last_sector = *dirsector;\n    int next_sector = -1;\n    for (int s = 1; s < num_sectors(type, dirtrack(type)); s++) {\n        int sector = (last_sector + s * dir_sector_interleave) % num_sectors(type, dirtrack(type));\n        if (is_sector_free(type, image, dirtrack(type), sector, 0, 0)) {\n            next_sector = sector;\n            break;\n        }\n    }\n    if (next_sector == -1) {\n        fprintf(stderr, \"ERROR: Dir track full\\n\");\n        exit(-1);\n    }\n    int b = linear_sector(type, dirtrack(type), last_sector) * BLOCKSIZE;\n    image[b + TRACKLINKOFFSET] = dirtrack(type);\n    image[b + SECTORLINKOFFSET] = next_sector;\n\n    mark_sector(type, image, dirtrack(type), next_sector, 0 /* not free */);\n    b = linear_sector(type, dirtrack(type), next_sector) * BLOCKSIZE;\n    memset(image + b, 0, BLOCKSIZE);\n    image[b + SECTORLINKOFFSET] = 255;\n    *dirsector = next_sector;\n    *entry_offset = 0;\n\n    if (shadowdirtrack > 0) {\n        b = linear_sector(type, shadowdirtrack, last_sector) * BLOCKSIZE;\n        image[b + TRACKLINKOFFSET] = shadowdirtrack;\n        image[b + SECTORLINKOFFSET] = next_sector;\n        mark_sector(type, image, shadowdirtrack, next_sector, 0 /* not free */);\n\n        b = linear_sector(type, shadowdirtrack, next_sector) * BLOCKSIZE;\n        memset(image + b, 0, BLOCKSIZE);\n        image[b + SECTORLINKOFFSET] = 255;\n    }\n    *index = lindex;\n}\n\n/* Returns suitable index and offset for given filename (either existing slot when overwriting, first free slot or slot in newly allocated segment) */\nstatic bool\nfind_dir_slot(image_type type, unsigned char* image, unsigned char* filename, int dir_sector_interleave, int shadowdirtrack, int *index, int *dirsector,  int *entry_offset, imagefile files[])\n{\n    int track;\n    if(find_existing_file(type, image, filename, index, &track, dirsector, entry_offset)) {\n        return true;\n    }\n    new_dir_slot(type, image, dir_sector_interleave, shadowdirtrack, index, dirsector, entry_offset, files);\n    return false;\n}\n\n/* Adds the specified new entries to the directory */\nstatic void\ncreate_dir_entries(image_type type, unsigned char* image, imagefile* files, int num_files, int dir_sector_interleave, unsigned int shadowdirtrack, int nooverwrite)\n{\n    /* this does not check for uniqueness of filenames */\n\n    int num_overwritten_files = 0;\n\n    if (verbose && num_files > 0) {\n        printf(\"\\nCreating dir entries:\\n\");\n    }\n\n    for (int i = 0; i < num_files; i++) {\n        /* find or create slot */\n        imagefile *file = files + i;\n\n        if (verbose) {\n            printf(\"  \");\n            print_dirfilename(file->pfilename);\n        }\n\n        if(file->force_new) {\n            new_dir_slot(type, image, dir_sector_interleave, shadowdirtrack, &file->direntryindex, &file->direntrysector, &file->direntryoffset, files);\n        } else if (find_dir_slot(type, image, file->pfilename, dir_sector_interleave, shadowdirtrack, &file->direntryindex, &file->direntrysector, &file->direntryoffset, files)) {\n            if (nooverwrite) {\n                fprintf(stderr, \"ERROR: Filename exists on disk image already and -o was set\\n\");\n                exit(-1);\n            }\n\n            wipe_file(type, image, file);\n            num_overwritten_files++;\n        }\n\n        int file_entry_offset = linear_sector(type, dirtrack(type), file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n        image[file_entry_offset + FILETYPEOFFSET] = file->filetype & 0xff;\n        if (verbose && (file->filetype & FILETYPETRANSWARPMASK)) {\n            printf(\" [Transwarp]\");\n        }\n        memcpy(image + file_entry_offset + FILENAMEOFFSET, file->pfilename, FILENAMEMAXSIZE);\n\n        if (is_transwarp_bootfile(image, file_entry_offset)) {\n            if (file->filetype & FILETYPETRANSWARPMASK) {\n                if (verbose) {\n                    printf(\"\\n\");\n                }\n\n                fprintf(stderr, \"ERROR: Attempt to write Transwarp bootfile as Transwarp file\\n\");\n\n                exit(-1);\n            }\n\n            file->mode |= MODE_TRANSWARPBOOTFILE;\n            if (verbose) {\n                printf(\" [Transwarp bootfile]\");\n            }\n\n            if (i != 0) {\n                // allocate Transwarp bootfile first\n                if ((files[0].mode & MODE_TRANSWARPBOOTFILE) != 0) {\n                    if (verbose) {\n                        printf(\"\\n\");\n                    }\n\n                    fprintf(stderr, \"ERROR: Multiple Transwarp bootfiles\\n\");\n                    exit(-1);\n                }\n\n                imagefile transwarp_bootfile = *file;\n                for (int j = i; j > 0; --j) {\n                    files[j] = files[j - 1];\n                }\n                files[0] = transwarp_bootfile;\n                file = files;\n            }\n        }\n\n        if (shadowdirtrack > 0) {\n            file_entry_offset = linear_sector(type, shadowdirtrack, file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n            image[file_entry_offset + FILETYPEOFFSET] = file->filetype;\n            memcpy(image + file_entry_offset + FILENAMEOFFSET, file->pfilename, FILENAMEMAXSIZE);\n        }\n\n        if (verbose) {\n            printf(\"\\n\");\n        }\n    }\n\n    if (!quiet && (num_overwritten_files > 0)) {\n        printf(\"%d out of %d files exist and will be overwritten\\n\", num_overwritten_files, num_files);\n    }\n}\n\n/* Prints the allocated tracks and sectors for every file */\nstatic void\nprint_file_allocation(image_type type, const unsigned char* image, imagefile* files, int num_files)\n{\n    if (num_files <= 0) {\n        imagefile existing_files[144];\n        memset(existing_files, 0, sizeof existing_files);\n\n        int t = dirtrack(type);\n        int s = (type == IMAGE_D81) ? 3 : 1;\n        int o = 0;\n        char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n        if(blockmap == NULL) {\n            fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n            exit(-1);\n        }\n\n        do {\n            int b = linear_sector(type, t, s) * BLOCKSIZE + o;\n            int filetype = image[b + FILETYPEOFFSET] & 0xf;\n            switch (filetype) {\n            case FILETYPEPRG: {\n                int track = image[b + FILETRACKOFFSET];\n                int sector = image[b + FILESECTOROFFSET];\n                int b = linear_sector(type, track, sector);\n                if(b >= 0) {\n                    unsigned char *filename = (unsigned char *) image + b + FILENAMEOFFSET;\n                    memcpy(existing_files[num_files].pfilename, filename, FILENAMEMAXSIZE);\n                    existing_files[num_files].track = track;\n                    existing_files[num_files].sector = sector;\n                    existing_files[num_files].direntryindex = num_files;\n                    existing_files[num_files].direntrysector = s;\n                    existing_files[num_files].direntryoffset = o;\n                    existing_files[num_files].nrSectors = image[b + FILEBLOCKSLOOFFSET] + 256 * image[b + FILEBLOCKSHIOFFSET];\n\n                    if (is_transwarp_file(image, b)) {\n                        existing_files[num_files].filetype = filetype | FILETYPETRANSWARPMASK;\n                        existing_files[num_files].sectorInterleave = 1;\n\n                        int start_track;\n                        int end_track;\n                        int low_track;\n                        int high_track;\n                        int filesize = transwarp_stat(type, image, b, &start_track, &end_track, &low_track, &high_track);\n\n                        existing_files[num_files].size = filesize;\n\n                        existing_files[num_files].track = start_track;\n                        existing_files[num_files].last_track = end_track;\n\n                        ++num_files;\n\n                        break;\n                    }\n\n                    while (true) {\n                        b = linear_sector(type, track, sector);\n                        if(b < 0) {\n                            break; // TODO: print info about illegal t/s\n                        }\n                        int offset = b * BLOCKSIZE;\n                        int next_track = image[offset + 0];\n                        int next_sector = image[offset + 1];\n                        if ((track == 0) || (next_track == 0)) {\n                            break;\n                        }\n                        if ((track == next_track) && (next_sector > sector)) {\n                            existing_files[num_files].sectorInterleave = next_sector - sector;\n                            break;\n                        }\n                        track = next_track;\n                        sector = next_sector;\n                    }\n\n                    ++num_files;\n\n                    break;\n                }\n            }\n\n            default:\n                break;\n            }\n        } while (next_dir_entry(type, image, &t, &s, &o, blockmap));\n        free(blockmap);\n        files = existing_files;\n    }\n\n    if(num_files > 0) {\n        printf(\"\\nFile allocation:\\n\");\n    }\n\n    for (int i = 0; i < num_files; i++) {\n        printf(\"%02d/%02d %3d (0x%02x 0x%02x:0x%02x) \", files[i].track, files[i].sector, files[i].nrSectors & 0xffff,\n               files[i].direntryindex, files[i].direntrysector, files[i].direntryoffset);\n        if (files[i].alocalname) {\n            printf(\"\\\"%s\\\" => \", files[i].alocalname);\n        }\n        print_filename(stdout, files[i].pfilename);\n        printf(\" (SL: %d)\", files[i].sectorInterleave);\n\n        if ((files[i].mode & MODE_LOOPFILE) && (files[i].sectorInterleave != 0)) {\n            printf(\"\\n\");\n\n            continue;\n        }\n\n        if (files[i].filetype & FILETYPETRANSWARPMASK) {\n            int transwarp_blocks;\n            int nonredundant_blocks;\n            int redundant_blocks;\n            int nonredundant_blocks_on_last_track;\n            int spare_bytes = transwarp_size(type, files[i].track, files[i].last_track, files[i].size, &transwarp_blocks, &nonredundant_blocks, &redundant_blocks, &nonredundant_blocks_on_last_track);\n\n            int num_blocks = 0;\n            int filesize = files[i].size + 2;\n            while (filesize > 0) {\n                ++num_blocks;\n                filesize -= 254;\n            }\n\n            printf(\"\\n          Transwarp: %d total/%d actual (%d standard) blocks, tracks %d-%d, %d used and %d redundant block%s on last track, 0x%x spare bytes in last block, size 0x%x\\n\",\n                   transwarp_blocks, nonredundant_blocks, num_blocks,\n                   (files[i].track < files[i].last_track) ? files[i].track : files[i].last_track,\n                   (files[i].track >= files[i].last_track) ? files[i].track : files[i].last_track,\n                   nonredundant_blocks_on_last_track, redundant_blocks, (redundant_blocks == 1) ? \"\" : \"s\",\n                   spare_bytes, files[i].size);\n\n            continue;\n        }\n\n        int track = files[i].track;\n        int sector = files[i].sector;\n\n        bool firsttrack = true;\n        int firstsector = sector;\n        bool fileblocks[SECTORSPERTRACK_D81];\n        memset(fileblocks, 0, sizeof fileblocks);\n        fileblocks[sector] = true;\n\n        int j = 0;\n        while (track != 0) {\n            if (j == 0) {\n                printf(\"\\n          \");\n            }\n            printf(\"%02d/%02d\", track, sector);\n            int b = linear_sector(type, track, sector);\n            if(b < 0) {\n                break; // TODO: print info about illegal t/s link?\n            }\n            int offset = b * BLOCKSIZE;\n            int next_track = image[offset + 0];\n            int next_sector = image[offset + 1];\n            if ((track != next_track) && (next_track != 0)) {\n                /* track change */\n                if (next_sector != 0) {\n                    /* interleave violation */\n                    printf(\"!-\");\n                } else {\n                    printf(\" -\");\n                }\n            } else if ((next_sector < sector) && (next_track != 0)) {\n                /* sector wrap */\n                int expected_next_sector = ((sector + abs(files[i].sectorInterleave)) % num_sectors(type, track));\n                if (expected_next_sector > 0) {\n                    --expected_next_sector;\n                }\n                bool on_nonempty_firsttrack = (expected_next_sector < next_sector) && firsttrack && (firstsector != 0);\n                if ((expected_next_sector != next_sector) && (!on_nonempty_firsttrack)) {\n                    while ((expected_next_sector < next_sector) && fileblocks[expected_next_sector]) {\n                        ++expected_next_sector;\n                    }\n                    if (expected_next_sector != next_sector) {\n                        /* interleave violation */\n                        printf(\"!.\");\n                    } else {\n                        printf(\" .\");\n                    }\n                } else {\n                    printf(\" .\");\n                }\n            } else if (((next_sector - sector) != abs(files[i].sectorInterleave)) && (next_track != 0)) {\n                /* interleave violation */\n                printf(\" !\");\n            } else {\n                printf(\"  \");\n            }\n\n            if (track != next_track) {\n                memset(fileblocks, 0, sizeof fileblocks);\n                firsttrack = false;\n            }\n            track = next_track;\n            sector = next_sector;\n            if (next_track != 0) {\n                fileblocks[sector] = true;\n            }\n\n            j++;\n            if (j == 10) {\n                j = 0;\n            }\n        }\n        printf(\"\\n\");\n    }\n    printf(\"\\n\");\n}\n\n\nstatic void\nassign_blocktags(image_type type, const unsigned char *image, int(*blocktags)[SECTORSPERTRACK_D81])\n{\n    char c = '@';\n\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int dt = dirtrack(type);\n    int offset = 0;\n    do {\n        int dirblock = linear_sector(type, dt, ds) * BLOCKSIZE + offset;\n        int filetype = image[dirblock + FILETYPEOFFSET] & 0xf;\n        if (filetype != 0) {\n            int filetrack = image[dirblock + FILETRACKOFFSET];\n            int filesector = image[dirblock + FILESECTOROFFSET];\n\n            if (is_transwarp_file(image, dirblock)) {\n                int start_track;\n                int end_track;\n                int low_track;\n                int high_track;\n                int filesize = transwarp_stat(type, image, dirblock, &start_track, &end_track, &low_track, &high_track);\n                if (filesize <= 0) {\n                    continue;\n                }\n\n                int transwarp_blocks;\n                int nonredundant_blocks;\n                int redundant_blocks;\n                int nonredundant_blocks_on_last_track;\n                transwarp_size(type, start_track, end_track, filesize, &transwarp_blocks, &nonredundant_blocks, &redundant_blocks, &nonredundant_blocks_on_last_track);\n\n                for (int track = low_track; track <= high_track; ++track) {\n                    for (int sector = 0; sector < SECTORSPERTRACK_D81; ++sector) {\n                        blocktags[track][sector] = c + (((track == end_track) && (sector >= nonredundant_blocks_on_last_track)) ? 256 : 0);\n                    }\n                }\n            } else {\n                bool new_track = true;\n                while (filetrack != 0) {\n                    int b = linear_sector(type, filetrack, filesector);\n                    if(b < 0) {\n                        break;\n                    }\n                    int block_offset = b * BLOCKSIZE;\n                    int next_track = image[block_offset + TRACKLINKOFFSET];\n                    int next_sector = image[block_offset + SECTORLINKOFFSET];\n\n                    blocktags[filetrack][filesector] = c + (new_track ? 256 : 0);\n                    new_track = (filetrack != next_track);\n\n                    filetrack = next_track;\n                    filesector = next_sector;\n                }\n            }\n\n            switch (c) {\n            default:\n                ++c;\n                break;\n            case 'Z':\n                c = '0';\n                break;\n            case '9':\n                c = 'a';\n                break;\n            case 'z':\n                c = '@';\n                break;\n            }\n        }\n\n    } while (next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n}\n\n/* Returns true if the file starting on the given filetrack and filesector uses the given track */\nstatic bool\nfileontrack(image_type type, const unsigned char *image, int track, int filetrack, int filesector)\n{\n    while (filetrack != 0) {\n        if (filetrack == track) {\n            return true;\n        }\n\n        int b = linear_sector(type, filetrack, filesector);\n        if(b < 0) {\n            return false;\n        }\n        int block_offset = b * BLOCKSIZE;\n        int next_track = image[block_offset + TRACKLINKOFFSET];\n        int next_sector = image[block_offset + SECTORLINKOFFSET];\n        filetrack = next_track;\n        filesector = next_sector;\n    }\n\n    return false;\n}\n\n/* Prints all filenames of files that use the given track */\nstatic void\nprint_track_usage(image_type type, const unsigned char *image, int(*blocktags)[SECTORSPERTRACK_D81], int track)\n{\n\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int dt = dirtrack(type);\n    int offset = 0;\n    do {\n        int dirblock = linear_sector(type, dt, ds) * BLOCKSIZE + offset;\n        int filetype = image[dirblock + FILETYPEOFFSET] & 0xf;\n        if (filetype != 0) {\n            int filetrack = image[dirblock + FILETRACKOFFSET];\n            int filesector = image[dirblock + FILESECTOROFFSET];\n            bool ontrack = (type == IMAGE_D71) ? fileontrack(type, image, track, (filetrack > D64NUMTRACKS) ? filetrack - D64NUMTRACKS : filetrack + D64NUMTRACKS, filesector) : false;\n\n            if (is_transwarp_file(image, dirblock)) {\n                int start_track;\n                int end_track;\n                int low_track;\n                int high_track;\n                int filesize = transwarp_stat(type, image, dirblock, &start_track, &end_track, &low_track, &high_track);\n                if (filesize <= 0) {\n                    continue;\n                }\n\n                ontrack = (low_track <= track) && (track <= high_track);\n                if (ontrack == false) {\n                    continue;\n                }\n\n                filetrack = start_track;\n            }\n\n            if (ontrack || fileontrack(type, image, track, filetrack, filesector)) {\n                unsigned char *filename = (unsigned char *) image + dirblock + FILENAMEOFFSET;\n                if (track == filetrack) {\n                    reverse_print_on();\n                }\n                printf(\"%c\", blocktags[filetrack][filesector]);\n                if (track == filetrack) {\n                    reverse_print_off();\n                }\n                printf(\": \");\n                print_filename(stdout, filename);\n                printf(\" \");\n            }\n        }\n    } while (next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n}\n\n/* Prints the BAM allocation map and returns the number of free blocks */\nstatic int\ncheck_bam(image_type type, const unsigned char* image)\n{\n    int sectorsFree = 0;\n    int sectorsFreeOnDirTrack = 0;\n    int sectorsOccupied = 0;\n    int sectorsOccupiedOnDirTrack = 0;\n\n    int blocktags[D81NUMTRACKS][SECTORSPERTRACK_D81];\n\n    if (verbose) {\n        memset(blocktags, 0, sizeof blocktags);\n        assign_blocktags(type, image, blocktags);\n\n        printf(\"Block allocation:\\n\");\n    }\n\n    int max_track = (type == IMAGE_D81) ? D81NUMTRACKS\n                    : (((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) ? D64NUMTRACKS_EXTENDED\n                       : D64NUMTRACKS);\n    for (int t = 1; t <= max_track; t++) {\n\n        if (verbose) {\n            printf(\"  %2d: \", t);\n        }\n        for (int s = 0; s < num_sectors(type, t); s++) {\n            if (is_sector_free(type, image, t, s, 0, 0)) {\n                if (verbose) {\n                    printf(\".\");\n                }\n                if (t != dirtrack(type)) {\n                    sectorsFree++;\n                } else {\n                    sectorsFreeOnDirTrack++;\n                }\n            } else {\n                if (verbose) {\n                    int blocktag = blocktags[t][s];\n                    if (blocktag == 0) {\n                        blocktag = '#';\n                    }\n                    if (blocktag >= 256) {\n                        reverse_print_on();\n                    }\n                    printf(\"%c\", blocktag);\n                    if (blocktag >= 256) {\n                        reverse_print_off();\n                    }\n                }\n                if (t != dirtrack(type)) {\n                    sectorsOccupied++;\n                } else {\n                    sectorsOccupiedOnDirTrack++;\n                }\n            }\n        }\n\n        if (type == IMAGE_D71) {\n            for (int i = num_sectors(type, t); i < 23; i++) {\n                if (verbose) {\n                    printf(\" \");\n                }\n            }\n            int t2 = t + D64NUMTRACKS;\n\n            if (verbose) {\n                printf(\"%2d: \", t2);\n            }\n            for (int s = 0; s < num_sectors(type, t2); s++) {\n                if (is_sector_free(type, image, t2, s, 0, 0)) {\n                    if (verbose) {\n                        printf(\".\");\n                    }\n                    if (t2 != dirtrack(type)) {\n                        sectorsFree++;\n                    } else {\n                        /* track 53 is usually empty except the extra BAM block */\n                        sectorsFreeOnDirTrack++;\n                    }\n                } else {\n                    if (verbose) {\n                        printf(\"#\");\n                    }\n                    sectorsOccupied++;\n                }\n            }\n        }\n\n        for (int i = ((type == IMAGE_D81) ? 42 : 23) - num_sectors(type, t); i > 0; --i) {\n            if (verbose) {\n                printf(\" \");\n            }\n        }\n        if (verbose) {\n            print_track_usage(type, image, blocktags, t);\n            printf(\"\\n\");\n        }\n    }\n    if (verbose) {\n        printf(\"%3d/%3d blocks free (%d/%d including dir track)\\n\", sectorsFree, sectorsFree + sectorsOccupied,\n               sectorsFree + sectorsFreeOnDirTrack, sectorsFree + sectorsFreeOnDirTrack + sectorsOccupied + sectorsOccupiedOnDirTrack);\n    }\n\n    return sectorsFree;\n}\n\n/* Prints the filetype like the C64 when listing the directory */\nstatic void\nprint_filetype(int filetype)\n{\n    if ((filetype & 0x80) == 0) {\n        printf(\"*\");\n    } else {\n        printf(\" \");\n    }\n    if(unicode == 1) {\n        printf(\"%s\", filetypename_uc[filetype & 0xf]);\n    } else {\n        printf(\"%s\", filetypename_lc[filetype & 0xf]);\n    }\n    if ((filetype & 0x40) != 0) {\n        printf(\"<\");\n    } else {\n        printf(\" \");\n    }\n}\n\n/* Prints the directory like the C64 when listing the directory */\nstatic void\nprint_directory(image_type type, unsigned char* image, int blocks_free)\n{\n    unsigned char* bam = image + linear_sector(type, dirtrack(type), 0) * BLOCKSIZE;\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n\n    printf(\"\\n0 \");\n    reverse_print_on();\n    printf(\"\\\"\");\n    print_petscii(bam + get_header_offset(type), 16);\n    printf(\"\\\" \");\n    print_petscii(bam + get_id_offset(type), 5);\n    reverse_print_off();\n\n    if (verbose) {\n        printf(\"   fn hash\");\n    }\n    printf(\"\\n\");\n\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int dt = dirtrack(type);\n    int offset = 0;\n    do {\n        int dirblock = linear_sector(type, dt, ds) * BLOCKSIZE + offset;\n        int filetype = image[dirblock + FILETYPEOFFSET];\n        int blocks = image[dirblock + FILEBLOCKSLOOFFSET] + 256 * image[dirblock + FILEBLOCKSHIOFFSET];\n\n        if (filetype != FILETYPEDEL) {\n            unsigned char* filename = (unsigned char*)image + dirblock + FILENAMEOFFSET;\n            printf(\"%-3d  \", blocks);\n            print_dirfilename(filename);\n            print_filetype(filetype);\n            if (verbose) {\n                printf(\" [$%04x]\", filenamehash(filename));\n            }\n            printf(\"\\n\");\n        }\n    } while (next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n    if(unicode == 1) {\n        printf(\"%d BLOCKS FREE.\\n\", blocks_free);\n    } else {\n        printf(\"%d blocks free.\\n\", blocks_free);\n    }\n}\n\n/* Performs GCR encoding on 32 bit value */\n\nstatic const unsigned char NIBBLE_TO_GCR[] = {\n    0x0a, 0x0b, 0x12, 0x13,\n    0x0e, 0x0f, 0x16, 0x17,\n    0x09, 0x19, 0x1a, 0x1b,\n    0x0d, 0x1d, 0x1e, 0x15\n};\n\nstatic void\nencode_4_bytes_gcr(char* in, char* out)\n{\n    out[0] = (NIBBLE_TO_GCR[(in[0] >> 4) & 0xf] << 3) | (NIBBLE_TO_GCR[ in[0]       & 0xf] >> 2); /* 11111222 */\n    out[1] = (NIBBLE_TO_GCR[ in[0]       & 0xf] << 6) | (NIBBLE_TO_GCR[(in[1] >> 4) & 0xf] << 1) | (NIBBLE_TO_GCR[ in[1]       & 0xf] >> 4); /* 22333334 */\n    out[2] = (NIBBLE_TO_GCR[ in[1]       & 0xf] << 4) | (NIBBLE_TO_GCR[(in[2] >> 4) & 0xf] >> 1); /* 44445555 */\n    out[3] = (NIBBLE_TO_GCR[(in[2] >> 4) & 0xf] << 7) | (NIBBLE_TO_GCR[ in[2]       & 0xf] << 2) | (NIBBLE_TO_GCR[(in[3] >> 4) & 0xf] >> 3); /* 56666677 */\n    out[4] = (NIBBLE_TO_GCR[(in[3] >> 4) & 0xf] << 5) |  NIBBLE_TO_GCR[ in[3]       & 0xf]; /* 77788888 */\n}\n\n/* Transwarp encoding utility functions */\n\nstatic void\ngenerate_gcr_decoding_table(const unsigned char nibble_to_gcr[], int8_t gcr_to_nibble[])\n{\n    for (int i = 0; i < 32; ++i) {\n        gcr_to_nibble[i] = -(i + 1);\n    }\n\n    for (int i = 0; i < 16; ++i) {\n        gcr_to_nibble[nibble_to_gcr[i]] = i;\n    }\n}\n\nstatic unsigned char\neven_bits(unsigned char value)\n{\n    return (((value >> 6) & 1) << 3)\n           | (((value >> 4) & 1) << 2)\n           | (((value >> 2) & 1) << 1)\n           | (((value >> 0) & 1) << 0);\n}\n\nstatic unsigned char\nodd_bits(unsigned char value)\n{\n    return (((value >> 7) & 1) << 3)\n           | (((value >> 5) & 1) << 2)\n           | (((value >> 3) & 1) << 1)\n           | (((value >> 1) & 1) << 0);\n}\n\ntypedef struct transwarp_encode_context {\n    unsigned int  version;\n    unsigned char previous;\n    unsigned char previous1;\n    unsigned char previous2;\n    unsigned char accu;\n    unsigned char carry;\n    unsigned char recvcarry;\n    unsigned char carry2;\n    unsigned char sendaccu;\n    unsigned char sendcarry;\n} transwarp_encode_context;\n\nstatic const int ENCODE[5][64] = {\n    {\n        0xf6, 0xee, 0xf5, 0xed, 0x9a, 0xde, 0x96, 0xda, 0xf3, 0xea, 0xf2, 0x9e, 0x93, 0xd6, 0x92, 0xd3,\n        0xd2, 0xca, 0xce, 0xbe, 0xb3, 0x7e, 0xb2, 0x7d, 0xcd, 0xba, 0xcb, 0xb6, 0xae, 0x7b, 0xaa, 0x7a,\n        0x76, 0x6e, 0x75, 0x6d, 0x5e, 0x5b, 0x5d, 0x5a, 0x73, 0x6b, 0x72, 0x6a, 0xdb, 0x9d, 0xeb, 0xd5,\n        0x56, 0x4e, 0x55, 0x4d, 0xbd, 0xb5, 0xbb, 0xad, 0x53, 0x4b, 0x52, 0xdd, 0xab, 0x4a, 0x9b, 0x95\n    }, {\n        0xf6, 0xee, 0xf5, 0xed, 0x9a, 0xde, 0x96, 0xda, 0xf3, 0xea, 0xf2, 0x9e, 0x93, 0xd6, 0x92, 0xef,\n        0xe7, 0x7c, 0x9f, 0x74, 0xe6, 0x6c, 0xdf, 0xa6, 0x9c, 0xba, 0x94, 0xb6, 0xae, 0x7b, 0xaa, 0x7a,\n        0x76, 0x6e, 0x75, 0x6d, 0x5e, 0x5b, 0x5d, 0x5a, 0x73, 0x6b, 0x72, 0x6a, 0xdb, 0xd7, 0xeb, 0xe5,\n        0x56, 0x64, 0x55, 0x5c, 0xbd, 0xb5, 0xbb, 0xad, 0x65, 0x54, 0x5f, 0xdd, 0xab, 0xa7, 0x9b, 0xa5\n    }, {\n        0xa5, 0xa7, 0xa9, 0xab, 0xd5, 0xd7, 0xd9, 0xdb, 0x95, 0x99, 0x9b, 0x97, 0xe5, 0x9d, 0xeb, 0xe9\n    }, {\n        0xf6, 0xee, 0xf5, 0xed, 0x69, 0xde, 0x59, 0xda, 0xb9, 0xea, 0xb7, 0x6f, 0x57, 0xd6, 0x4f, 0xef,\n        0xe7, 0xca, 0xce, 0xbe, 0xe6, 0xbf, 0xdf, 0xa6, 0xcd, 0xba, 0xcb, 0xb6, 0xae, 0x7b, 0xaa, 0x7a,\n        0x76, 0x6e, 0x75, 0x6d, 0x5e, 0x5b, 0x5d, 0x5a, 0x67, 0x6b, 0x66, 0x6a, 0xe9, 0xd7, 0xeb, 0xe5,\n        0x56, 0x4e, 0x55, 0x4d, 0xbd, 0xb5, 0xbb, 0xad, 0x65, 0x4b, 0x5f, 0xdd, 0xab, 0xa7, 0xa9, 0xa5\n    }, {\n        0xcf, 0xaf, 0xc9, 0x79, 0x69, 0xde, 0x59, 0xda, 0xb9, 0x77, 0xb7, 0x6f, 0x57, 0xd6, 0x4f, 0xd3,\n        0xd2, 0xca, 0xce, 0xbe, 0xb3, 0x7e, 0xb2, 0x7d, 0xcd, 0xba, 0xcb, 0xb6, 0xae, 0x7b, 0xaa, 0x7a,\n        0x76, 0x6e, 0x75, 0x6d, 0x5e, 0x5b, 0x5d, 0x5a, 0x73, 0x6b, 0x72, 0x6a, 0xdb, 0xd7, 0xd9, 0xd5,\n        0x56, 0x4e, 0x55, 0x4d, 0xbd, 0xb5, 0xbb, 0xad, 0x53, 0x4b, 0x52, 0xdd, 0xab, 0x4a, 0xa9, 0x49\n    }\n};\n\nstatic const int DECODE[256] = {\n    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, 0x00, 0x02, 0x12,   -1, 0x14, 0x16, 0x68,\n        -1,   -1, 0x18, 0x1a, 0x12, 0x1c, 0x1e, 0x6a,   -1, 0x6c, 0x24, 0x26, 0x14, 0x2c, 0x2e, 0x18,\n        -1,   -1,   -1,   -1, 0x16, 0x1a, 0x38, 0x3a,   -1, 0x6e, 0x30, 0x32, 0x46, 0x34, 0x36, 0x70,\n        -1,   -1, 0x38, 0x3a, 0x54, 0x3c, 0x3e, 0x72,   -1, 0x74, 0x40, 0x42, 0x56, 0x44, 0x46,   -1,\n        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n        -1,   -1, 0x68, 0x6a, 0x58, 0x80, 0x6c, 0x8a,   -1, 0x82, 0x6e, 0x88, 0x5a, 0xa2, 0x70, 0x5c,\n        -1,   -1,   -1,   -1,   -1, 0x00, 0x44, 0x02,   -1, 0x08, 0x48, 0x0a,   -1, 0x04, 0x4a, 0x76,\n        -1,   -1, 0x4c, 0x4e,   -1, 0x06, 0x50, 0x78,   -1, 0x7a, 0x52, 0x0c,   -1, 0x0e, 0x54, 0x46,\n        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1, 0x7c, 0x56, 0x58,   -1, 0x5a, 0x5c, 0x7e,\n        -1,   -1, 0x5e, 0x60,   -1, 0x20, 0x62, 0x22,   -1, 0x28, 0x64, 0x2a,   -1, 0x10, 0x66, 0x4c,\n        -1,   -1,   -1,   -1,   -1, 0xa0, 0x4e, 0x5e,   -1, 0xaa, 0x72, 0xa8,   -1, 0x74, 0x76, 0x60,\n        -1,   -1, 0x78, 0x7a,   -1, 0x7c, 0x7e,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1\n    };\n\nstatic unsigned char\nencode_read_diff(const int encode[64], unsigned char *accu, unsigned char *carry, unsigned char value)\n{\n    unsigned char value_to_encode;\n\n    unsigned char target = DECODE[encode[value]] & 0x7e;\n    for (value_to_encode = 0; value_to_encode < 64; ++value_to_encode) {\n        unsigned char val = DECODE[encode[value_to_encode]] + *accu + *carry;\n        if ((val & 0x7e) == target) {\n            break;\n        }\n    }\n    if (value_to_encode >= 64) {\n        printf(\"Encoding error, 0x%x = 0x%x + %d + ?\\n\", target, *accu, *carry);\n        for (value_to_encode = 0; value_to_encode < 64; ++value_to_encode) {\n            unsigned char val = DECODE[encode[value_to_encode]] + *accu + *carry;\n            printf(\"%d: 0x%x <- 0x%x\\n\", value_to_encode, val & 0x7e, DECODE[encode[value_to_encode]]);\n        }\n\n        fprintf(stderr, \"ERROR: Transwarp encoding error\\n\");\n        exit(-2);\n    }\n\n    int sum = DECODE[encode[value_to_encode]] + *accu + *carry;\n    *accu = sum;\n    *carry = sum >= 256;\n\n    unsigned char check = DECODE[encode[value]];\n    if ((*accu & 0x7e) != (check & 0x7e)) {\n        fprintf(stderr, \"ERROR: Transwarp encoding error, 0x%x: actual 0x%x != 0x%x expected\\n\", DECODE[encode[check & 0x3f]], *accu, check);\n        exit(-3);\n    }\n\n    unsigned char temp = (*carry << 7) | (*accu >> 1);\n    *carry = *accu & 1;\n    *accu = (*carry << 7) | ((temp & 0xfb) >> 1);\n    *carry = (*accu >> 6) & 1;\n\n    return encode[value_to_encode];\n}\n\nunsigned char\nencode_send_diff(unsigned char value, unsigned char *accu, unsigned char *carry)\n{\n    value = (value & ~((1 << 3) | (1 << 0)))\n            | (((value >> 3) & 1) << 0)\n            | (((value >> 0) & 1) << 3);\n    value ^= 0xff;\n\n    int diff = value - *accu - *carry;\n    *carry = (diff < 0);\n\n    *accu = value;\n\n    *accu = (((*accu >> 7) & 1) << 7)\n            | (((*accu >> 1) & 1) << 6)\n            | (((*accu >> 7) & 1) << 5)\n            | (*carry << 4)\n            | (((*accu >> 6) & 1) << 2)\n            | (((*accu >> 5) & 1) << 1);\n    *carry = (*accu >> 6) & 1;\n\n    return diff;\n}\n\nstatic unsigned char\nencode_receive_diff(const transwarp_encode_context *ctx, unsigned char in, unsigned char *previous, unsigned char *carry)\n{\n    int offset = (ctx->version <= 84) ? 0 : 2;\n\n    int out = in - *carry - offset;\n    int diff = out - ((*previous & 0xc0) | (out & 0x3f));\n    *carry = (diff < 0);\n    out = ((out ^ *previous) & 0x3f) | diff;\n    *previous = in;\n\n    return out;\n}\n\nstatic unsigned char\nencode_buffer_byte(const int encode[][64], unsigned char previous, unsigned char *carry, unsigned char in, unsigned char *out)\n{\n    unsigned char even = (previous >> 1) ^ in;\n    unsigned char odd = ((*carry << 7) | (previous >> 1)) ^ in;\n\n    *carry = previous & 1;\n\n    out[(31 * 5) + 4] = encode[2][even_bits(even)];\n    out[4] = encode[2][odd_bits(odd)];\n\n    return in;\n}\n\nstatic void\nencode_base_bytes(const unsigned char scramble[][256],\n                  transwarp_encode_context *ctx, const unsigned char in[3], unsigned char *out)\n{\n    unsigned char in0 = encode_receive_diff(ctx, in[0], &(ctx->previous), &(ctx->recvcarry));\n    unsigned char in1 = encode_receive_diff(ctx, in[1], &(ctx->previous), &(ctx->recvcarry));\n    unsigned char in2 = encode_receive_diff(ctx, in[2], &(ctx->previous), &(ctx->recvcarry));\n\n    in0 = scramble[0][in0];\n    in1 = scramble[1][in1];\n    in2 = scramble[2][in2];\n\n    unsigned char val3 = in0 & 0x3f;\n    out[0] = encode_read_diff(ENCODE[3], &(ctx->accu), &(ctx->carry), val3);\n\n    unsigned char val4 = ((in0 >> 6)\n                          | (in1 << 2)) & 0x3f;\n    out[1] = encode_read_diff(ENCODE[4], &(ctx->accu), &(ctx->carry), val4);\n\n    unsigned char val0 = ((in1 >> 4)\n                          | (in2 << 4)) & 0x3f;\n    out[2] = encode_read_diff(ENCODE[0], &(ctx->accu), &(ctx->carry), val0);\n\n    unsigned char val1 = in2 >> 2;\n    out[3] = encode_read_diff(ENCODE[1], &(ctx->accu), &(ctx->carry), val1);\n}\n\nstatic unsigned char\ncrc8(unsigned char value)\n{\n    for (int i = 0; i < 8; ++i) {\n        value = (value & 0x80) ? ((value << 1) ^ 0x31) : (value << 1);\n    }\n\n    return value;\n}\n\nstatic bool\ndecode_5_bytes_gcr(const int8_t decoding_map[], const unsigned char *in, unsigned char *out)\n{\n    unsigned char gcr_hi;\n    unsigned char gcr_lo;\n\n    gcr_hi = in[0] >> 3;\n    gcr_lo = ((in[0] & 0x7) << 2) | (in[1] >> 6);\n    int out0 = (decoding_map[gcr_hi] << 4) | decoding_map[gcr_lo];\n\n    gcr_hi = (in[1] & 0x3e) >> 1;\n    gcr_lo = ((in[1] & 0x1) << 4) | (in[2] >> 4);\n    int out1 = (decoding_map[gcr_hi] << 4) | decoding_map[gcr_lo];\n\n    gcr_hi = ((in[2] & 0xf) << 1) | (in[3] >> 7);\n    gcr_lo = (in[3] & 0x7c) >> 2;\n    int out2 = (decoding_map[gcr_hi] << 4) | decoding_map[gcr_lo];\n\n    gcr_hi = ((in[3] & 0x3) << 3) | (in[4] >> 5);\n    gcr_lo = in[4] & 0x1f;\n    int out3 = (decoding_map[gcr_hi] << 4) | decoding_map[gcr_lo];\n\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = out3;\n\n    return (out0 | out1 | out2 | out3) >= 0;\n}\n\nstatic int\ndecode_gcr_block(const int8_t decoding_map[], const unsigned char *encoded, unsigned char decoded[])\n{\n    bool ok = decode_5_bytes_gcr(decoding_map, encoded, decoded);\n    decoded[0] = decoded[1];\n    decoded[1] = decoded[2];\n    decoded[2] = decoded[3];\n\n    int computed_checksum = decoded[0] ^ decoded[1] ^ decoded[2];\n\n    int i = 5;\n    for (int j = 3; i < 320; i += 5, j += 4) {\n        ok &= decode_5_bytes_gcr(decoding_map, encoded + i, decoded + j);\n        computed_checksum ^= decoded[j] ^ decoded[j + 1] ^ decoded[j + 2] ^ decoded[j + 3];\n    }\n\n    unsigned char last_byte[4];\n    ok &= decode_5_bytes_gcr(decoding_map, encoded + i, last_byte);\n    decoded[255] = last_byte[0];\n\n    computed_checksum ^= last_byte[0];\n    computed_checksum = ok ? computed_checksum : -1;\n\n    return ok ? computed_checksum : -1;\n}\n\nstatic int\nencode_transwarp_block(const unsigned char scramble[][256], const int8_t gcr_to_nibble[32],\n                       transwarp_encode_context* ctx, const unsigned char *indata, int filepos, unsigned char encoded[325])\n{\n    const unsigned char *unencoded = indata + filepos;\n\n    unsigned char data[TRANSWARPBLOCKSIZE];\n    if (filepos < 2) {\n        for (int i = filepos, j = 0; j < TRANSWARPBLOCKSIZE; ++i, ++j) {\n            data[j] = (i < 0) ? ' ' : ((i < 2) ? 0 : indata[i]);\n        }\n\n        unencoded = data;\n    }\n\n    unsigned char semiencoded[TRANSWARPBUFFERBLOCKSIZE];\n\n    for (int i = TRANSWARPBUFFERBLOCKSIZE - 1; i >= 0; --i) {\n        unsigned char value = encode_receive_diff(ctx, unencoded[TRANSWARPBASEBLOCKSIZE + i], &(ctx->previous2), &(ctx->carry2));\n\n        value = scramble[3][value];\n\n        semiencoded[i] = encode_send_diff(value, &(ctx->sendaccu), &(ctx->sendcarry));\n    }\n\n    unsigned char buffer_previous = ctx->previous1;\n    unsigned char buffer_carry = 0;\n    for (int i = 0; i < TRANSWARPBUFFERBLOCKSIZE; ++i) {\n        int shuffle = (TRANSWARPBUFFERBLOCKSIZE - 1) - (i / 2) - ((i & 1) ? ((TRANSWARPBUFFERBLOCKSIZE / 2) + 1) : 0);\n        unsigned char value = semiencoded[shuffle];\n        buffer_previous = encode_buffer_byte(ENCODE, buffer_previous, &buffer_carry, value, encoded + 3 + (5 * (TRANSWARPBUFFERBLOCKSIZE - 1 - shuffle)));\n    }\n\n    unsigned char previous = unencoded[TRANSWARPBASEBLOCKSIZE - 1];\n\n    const int CRCSTEP = 8;\n\n    for (int i = 0; i < TRANSWARPBASEBLOCKSIZE; i += CRCSTEP) {\n        previous = crc8(previous);\n        previous ^= unencoded[i];\n    }\n    previous = crc8(previous);\n\n    if (filepos > ((21 * TRANSWARPBLOCKSIZE) + 2)) {\n        const int BACKCHECKOFFS = (21 * TRANSWARPBLOCKSIZE) + TRANSWARPBUFFERBLOCKSIZE;\n        previous ^= indata[filepos - BACKCHECKOFFS];\n        previous = crc8(previous);\n        previous ^= indata[filepos - BACKCHECKOFFS + TRANSWARPBUFFERBLOCKSIZE - 1];\n        previous = crc8(previous);\n    }\n\n    char head_data[4] = { 7, 0, 0, 0 };\n    encode_4_bytes_gcr(head_data, (char *) encoded);\n    char tail_data[4] = { 0, 0, 0, 0 };\n    encode_4_bytes_gcr(tail_data, (char *) encoded + 320);\n\n    unsigned char accu = ctx->previous;\n    unsigned char carry = 0;\n    for (int i = 0; i < TRANSWARPBASEBLOCKSIZE; ++i) {\n        encode_receive_diff(ctx, unencoded[i], &accu, &carry);\n    }\n\n    unsigned char receive_checksum = (-previous - carry);\n\n    unsigned char checksum = receive_checksum ^ (buffer_previous >> 1);\n\n    unsigned char odd = odd_bits(checksum);\n\n    odd ^= (buffer_carry << 3);\n\n    static const unsigned char ENCODE_TOP[] = {\n        0x05,\n        0x07,\n        0x0d,\n        0x0b\n    };\n    encoded[2] = (encoded[2] & 0xf0) | ENCODE_TOP[odd & 0x3];\n\n    encoded[317] = ENCODE[2][even_bits(checksum)];\n\n    encoded[322] = ENCODE[2][odd & 0xc];\n\n    unsigned char top_2_bits = encoded[2];\n    unsigned char middle_4_bits = encoded[317];\n    unsigned char bottom_2_bits = encoded[322];\n\n    ctx->recvcarry = 0;\n\n    ctx->accu = 0;\n    ctx->carry = 0;\n    for (int i = 0, j = 0; i < TRANSWARPBASEBLOCKSIZE; i += 3, j += 5) {\n        encode_base_bytes(scramble, ctx, unencoded + i, encoded + 3 + j);\n\n        ctx->accu = 8;\n        ctx->carry = 0;\n\n        unsigned char target = encoded[3 + j + 4];\n        unsigned char target_accu = DECODE[target];\n        unsigned char target_check = ENCODE[2][odd_bits(target_accu)];\n\n        if (target != target_check) {\n            fprintf(stderr, \"ERROR: Transwarp encoding error, [%d] 0x%x != 0x%x <- 0x%x\\n\", i, target, target_check, DECODE[target]);\n\n            exit(-4);\n        }\n\n        unsigned char store = ctx->accu ^ target_accu;\n        encoded[3 + j + 4] = ENCODE[2][odd_bits(store)];\n\n        unsigned char stored = DECODE[encoded[3 + j + 4]];\n        ctx->accu ^= stored;\n\n        if (ctx->accu != target_accu) {\n            fprintf(stderr, \"ERROR: Transwarp encoding error, [%d] actual 0x%x != 0x%x expected <- 0x%x\\n\", i, ctx->accu, target_accu, stored);\n\n            exit(-5);\n        }\n    }\n    if (carry != ctx->recvcarry) {\n        fprintf(stderr, \"ERROR: Transwarp encoding error, carry %d != %d recvcarry\\n\", carry, ctx->recvcarry);\n\n        exit(-6);\n    }\n\n    unsigned char top_fix = encoded[2] ^ (DECODE[encoded[322]] & 0xf);\n    top_fix = ((top_fix >> 2) & 2) | ((top_fix >> 1) & 1);\n    encoded[2] = (encoded[2] & 0xf0) | ENCODE_TOP[top_fix];\n    encoded[322] = (encoded[322] & 0xf0) | 0x5;\n\n    unsigned char block_checksum;\n    block_checksum = DECODE[middle_4_bits];\n    block_checksum = (block_checksum >> 1) | (buffer_carry << 7);\n    block_checksum ^= DECODE[bottom_2_bits];\n    block_checksum ^= (top_2_bits & 0xa);\n\n    if (block_checksum != checksum) {\n        fprintf(stderr, \"ERROR: Transwarp encoding error, actual 0x%x != 0x%x expected, 0x%x -> [0x%x] -> 0x%x -> 0x%x -> [0x%x]\\n\", block_checksum, checksum, checksum & 0xaa, ((checksum & 0xaa) >> 1) | (checksum & 0xaa), odd, ENCODE[2][odd], DECODE[encoded[317]]);\n\n        exit(-1);\n    }\n\n    unsigned char gcr_decoded[4];\n    bool ok = decode_5_bytes_gcr(gcr_to_nibble, encoded + 320, gcr_decoded);\n    int gcr_checksum = ok ? gcr_decoded[1] : -1;\n\n    unsigned char decoded[256];\n    int computed_checksum = decode_gcr_block(gcr_to_nibble, encoded, decoded);\n\n    ok &= decode_5_bytes_gcr(gcr_to_nibble, encoded, gcr_decoded);\n    gcr_decoded[1] ^= gcr_checksum ^ computed_checksum;\n\n    encode_4_bytes_gcr((char *) gcr_decoded, (char *) encoded);\n\n    return ok == 0;\n}\n\nstatic void\npermute(unsigned char *key, int len, int *set)\n{\n    for (int i = 0; i < (len - 1); ++i) {\n        int divisor = len - i;\n\n        int remainder = 0;\n        for (int i = TRANSWARPKEYSIZE - 12; i >= 0; --i) {\n            int dividend = (remainder << 8) | key[i];\n            remainder = dividend % divisor;\n            key[i] = dividend / divisor;\n        }\n\n        int n = set[remainder];\n        set[remainder] = set[divisor - 1];\n        set[divisor - 1] = n;\n    }\n}\n\n/* Write file to disk using Transwarp encoding */\nstatic unsigned long long\nwrite_transwarp_file(image_type type, unsigned char *image, imagefile *file, unsigned char *filedata, int *filesize, unsigned int version, bool transwarp_bootfile_fits_on_dir_track)\n{\n    file->size = *filesize - 2;\n\n    unsigned int track = DIRTRACK_D41_D71 - 1;\n\n    if ((file->mode & MODE_MIN_TRACK_MASK) > 0) {\n        /* for Transwarp files, a set minimum track is the file's starting track */\n        track = (file->mode & MODE_MIN_TRACK_MASK) >> MODE_MIN_TRACK_SHIFT;\n    } else {\n        /* allocate */\n        bool free_tracks[40];\n        for (unsigned int t = 1; t <= image_num_tracks(type); ++t) {\n            bool track_free = true;\n            for (int sector = 0; sector < num_sectors(type, t); ++sector) {\n                if (is_sector_free(type, image, t, sector, 0 /* numdirblocks */, 0 /* dir_sector_interleave */) == false) {\n                    track_free = false;\n                    break;\n                }\n            }\n            free_tracks[t - 1] = track_free;\n        }\n\n        /* below dir track */\n        while (track > 0) {\n            if (free_tracks[track - 1]) {\n                int filesize = file->size;\n                int t = track;\n                while ((filesize > 0)\n                        && (t > 0)) {\n                    filesize -= (TRANSWARPBLOCKSIZE * num_sectors(type, t));\n                    if (filesize >= 0) {\n                        if (free_tracks[t - 1] == false) {\n                            break;\n                        }\n                        --t;\n                    }\n                }\n\n                if (filesize <= 0) {\n                    break;\n                }\n            }\n            --track;\n        }\n\n        if (track <= 0) {\n            /* above dir track */\n            track = DIRTRACK_D41_D71 + (transwarp_bootfile_fits_on_dir_track ? 1 : 2);\n            while (track <= image_num_tracks(type)) {\n                if (free_tracks[track - 1]) {\n                    int filesize = file->size;\n                    int t = track;\n                    while (filesize > 0) {\n                        filesize -= (TRANSWARPBLOCKSIZE * num_sectors(type, t));\n                        if (filesize >= 0) {\n                            if (free_tracks[t - 1] == false) {\n                                break;\n                            }\n                            ++t;\n                        }\n                    }\n\n                    if (filesize <= 0) {\n                        break;\n                    }\n                }\n                ++track;\n            }\n        }\n    }\n\n    file->track = track;\n    file->sector = 0;\n\n    int8_t gcr_to_nibble[32];\n    generate_gcr_decoding_table(NIBBLE_TO_GCR, gcr_to_nibble);\n\n    unsigned char key[TRANSWARPKEYSIZE];\n    memset(key, 0, sizeof key);\n\n    if (file->have_key != 0) {\n        if ((filedata[0] == 0x01)\n                && (filedata[1] == 0x08)) {\n            srand((unsigned int) time(NULL));\n\n            unsigned int linelink = ((filedata[3] << 8) | filedata[2]) - 0x0801 + 2;\n            if ((linelink > 0)\n                    && ((linelink - 2) < (unsigned int) file->size)\n                    && ((filedata[linelink - 1] | filedata[linelink] | filedata[linelink + 1]) == 0)) {\n                while (filedata[linelink] == 0) {\n                    filedata[linelink] = rand();\n                }\n            }\n\n            filedata[2] = rand();\n            while ((filedata[3] == 0)\n                    || (filedata[3] == 8)) {\n                filedata[3] = rand();\n            }\n\n            int file_size = file->size;\n            int filetrack = track;\n            while (file_size > 0) {\n                file_size -= (TRANSWARPBLOCKSIZE * num_sectors(type, filetrack));\n                if (file_size > 0) {\n                    filetrack = (filetrack < DIRTRACK_D41_D71) ? (filetrack - 1) : (filetrack + 1);\n                }\n            }\n            int spare_blocks = (0 - file_size) / TRANSWARPBLOCKSIZE;\n            int spare_bytes = TRANSWARPBLOCKSIZE - (file->size % TRANSWARPBLOCKSIZE);\n            spare_bytes = (spare_blocks * TRANSWARPBLOCKSIZE) + ((spare_bytes != TRANSWARPBLOCKSIZE) ? spare_bytes : 0);\n            while (spare_bytes > (0x0801 - 0x0400)) {\n                spare_bytes -= TRANSWARPBLOCKSIZE;\n            }\n            if (spare_bytes > 0) {\n                int loadaddress = (filedata[1] << 8) | filedata[0];\n                loadaddress -= spare_bytes;\n                filedata[0] = loadaddress;\n                filedata[1] = loadaddress >> 8;\n                memmove(filedata + 2 + spare_bytes, filedata + 2, file->size);\n                filedata[spare_bytes + 1] = 0;\n                for (int i = 2; i <= spare_bytes; ++i) {\n                    filedata[i] = rand();\n                }\n                file->size += spare_bytes;\n                *filesize += spare_bytes;\n            }\n        }\n\n        memcpy(key, file->key, sizeof key);\n\n        for (int round = TRANSWARPKEYHASHROUNDS; round > 0; --round) {\n            for (int i = 0; i < (TRANSWARPKEYSIZE - 1); ++i) {\n                key[i] ^= key[i + 1];\n            }\n\n            for (int i = TRANSWARPKEYSIZE - 1; i >= 0; --i) {\n                int product = key[i] * 0x6b;\n                key[i] = product;\n                int msb = product >> 8;\n                for (int j = i + 1; j < TRANSWARPKEYSIZE; ++j) {\n                    msb += key[j];\n                    key[j] = msb;\n                    msb >>= 8;\n                }\n            }\n\n            int sum = round;\n            for (int i = 0; i < TRANSWARPKEYSIZE; ++i) {\n                sum += key[i];\n                key[i] = sum;\n                sum >>= 8;\n            }\n        }\n    }\n\n    unsigned long long dirdatakey = (key[TRANSWARPKEYSIZE - 1] * (1ULL << 56))\n                                    + (key[TRANSWARPKEYSIZE - 2] * (1ULL << 48))\n                                    + (key[TRANSWARPKEYSIZE - 3] * (1ULL << 40))\n                                    + (key[TRANSWARPKEYSIZE - 4] * (1ULL << 32))\n                                    + (key[TRANSWARPKEYSIZE - 5] * (1ULL << 24))\n                                    + (key[TRANSWARPKEYSIZE - 6] * (1ULL << 16))\n                                    + (key[TRANSWARPKEYSIZE - 7] * (1ULL << 8))\n                                    + key[TRANSWARPKEYSIZE - 8];\n\n    int initial_buffer_store_value = key[TRANSWARPKEYSIZE - 9];\n    int initial_buffer_recvaccu_value = key[TRANSWARPKEYSIZE - 10];\n    int initial_block_recvaccu_value = key[TRANSWARPKEYSIZE - 11];\n\n    unsigned char scramble[4][256];\n    for (int i = 0; i < 4; ++i) {\n        int set[] = { 0, 2, 4, 1, 3, 5 };\n        if (file->have_key) {\n            permute(key, 6, set);\n        }\n\n        int set2[3][4];\n        for (int j = 0; j < 3; ++j) {\n            int set3[] = { 0, 1, 2, 3 };\n            if (file->have_key) {\n                permute(key, 4, set3);\n            }\n            for (int k = 0; k < 4; ++k) {\n                for (int l = 0; l < 4; ++l) {\n                    if (k == set3[l]) {\n                        set2[j][k] = l;\n                        break;\n                    }\n                }\n            }\n        }\n\n        for (int j = 0; j < 256; ++j) {\n            unsigned char scrambled = (set2[0][(((j >> set[0]) & 1) << 0)\n                                               | (((j >> set[3]) & 1) << 1)] << 0)\n                                      | (set2[1][(((j >> set[1]) & 1) << 0)\n                                                 | (((j >> set[4]) & 1) << 1)] << 2)\n                                      | (set2[2][(((j >> set[2]) & 1) << 0)\n                                                 | (((j >> set[5]) & 1) << 1)] << 4)\n                                      | (j & 0xc0);\n            scramble[i][j] = scrambled;\n        }\n    }\n\n    int sectors[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };\n    if (file->have_key != 0) {\n        permute(key, 17, sectors);\n    }\n\n    transwarp_encode_context ctx;\n    memset(&ctx, 0, sizeof ctx);\n    ctx.version = version;\n\n    ctx.previous1 = initial_buffer_store_value;\n\n    bool done = false;\n    int block_index = 0;\n    int total_blocks = 0;\n\n    int filepos = 2;\n\n    for (; !done; (track >= DIRTRACK_D41_D71) ? ++track : --track) {\n        if ((track < 1)\n                || (track > image_num_tracks(type))) {\n            fprintf(stderr, \"ERROR: Disk full (track %d out of range) while writing Transwarp file \", track);\n            print_filename(stderr, file->pfilename);\n            fprintf(stderr, \"\\n\");\n            exit(-4);\n        }\n\n        int next_track_pos = filepos + (num_sectors(type, track) * TRANSWARPBLOCKSIZE);\n        bool last_track = (next_track_pos >= *filesize);\n        if (last_track) {\n            int sector = 0;\n            for (int s = 0; s < num_sectors(type, track); ++s) {\n                sectors[s] = sector;\n                if ((filepos + ((sector + 1) * TRANSWARPBLOCKSIZE)) >= *filesize) {\n                    sector = 0;\n                } else {\n                    ++sector;\n                }\n            }\n        }\n        int next_track_block_index = block_index + num_sectors(type, track);\n        int trackpos = filepos;\n\n        transwarp_encode_context trackctx = ctx;\n\n        for (int sector = 0; sector < num_sectors(type, track); ++sector) {\n            if (is_sector_free(type, image, track, sector, 0 /* numdirblocks */, 0 /* dir_sector_interleave */) == false) {\n                fprintf(stderr, \"ERROR: t%d/s%d not free for Transwarp file \", track, sector);\n                print_filename(stderr, file->pfilename);\n                fprintf(stderr, \"\\n\");\n                check_bam(type, image);\n\n                exit(-5);\n            }\n\n            bool last_block = false;\n            int pos = trackpos + (sectors[sector] * TRANSWARPBLOCKSIZE);\n            if ((pos + TRANSWARPBLOCKSIZE) >= *filesize) {\n                pos = *filesize - TRANSWARPBLOCKSIZE;\n                last_block = true;\n            }\n\n            unsigned char encoded[320 + 5];\n            unsigned char previous = block_index + sectors[sector];\n            previous ^= initial_block_recvaccu_value;\n\n            ctx.previous = previous;\n            ctx.previous2 = initial_buffer_recvaccu_value;\n\n            int error = encode_transwarp_block((const unsigned char (*)[256]) scramble, gcr_to_nibble, &ctx, filedata, pos, encoded);\n            if (error) {\n                fprintf(stderr, \"ERROR: encoding error on t%d/s%d\\n\", track, sector);\n\n                exit(-6);\n            }\n\n            unsigned char decoded[256];\n            int checksum = decode_gcr_block(gcr_to_nibble, encoded, decoded);\n            if (checksum < 0) {\n                fprintf(stderr, \"ERROR: decoding error on t%d/s%d\\n\", track, sector);\n\n                exit(-7);\n            }\n\n            int offset = linear_sector(type, track, sector) * BLOCKSIZE;\n            memcpy(image + offset, decoded, BLOCKSIZE);\n\n            ++total_blocks;\n\n            if (last_block) {\n                ctx = trackctx;\n                done = true;\n            }\n\n            mark_sector(type, image, track, sector, 0 /* not free */);\n        }\n\n        filepos = next_track_pos;\n        block_index = next_track_block_index;\n        file->last_track = track;\n    }\n\n    file->nrSectors = total_blocks;\n\n    return dirdatakey;\n}\n\n/* Write files to disk */\nstatic void\nwrite_files(image_type type, unsigned char *image, imagefile *files, int num_files, int usedirtrack, int dirtracksplit, int shadowdirtrack, int numdirblocks, int dir_sector_interleave)\n{\n    unsigned char track = 1;\n    unsigned char sector = 0;\n    int bytes_to_write = 0;\n    int lastTrack = track;\n    int lastSector = sector;\n    int lastOffset = linear_sector(type, lastTrack, lastSector) * BLOCKSIZE;\n    int lastMinTrack = track;\n    bool transwarp_bootfile_fits_on_dir_track = false;\n\n    /* make sure the first file already takes first sector per track into account */\n    if (num_files > 0) {\n        sector = (type == IMAGE_D81) ? 0 : files[0].first_sector_new_track;\n    }\n\n    int transwarp_version = 100;\n\n    for (int i = 0; i < num_files; i++) {\n        imagefile *file = files + i;\n        if ((file->mode & MODE_TRANSWARPBOOTFILE) != 0) {\n            int fileSize = 0;\n\n            struct stat st;\n            if (stat((char*)files[i].alocalname, &st) == 0) {\n                fileSize = (int)st.st_size;\n            }\n\n            int version_major;\n            int version_minor;\n            if (sscanf((char *) basename(files[i].alocalname), \"transwarp v%d.%d\", &version_major, &version_minor) == 2) {\n                transwarp_version = (version_major * 100) + version_minor;\n            }\n\n            int num_blocks = (fileSize / 254) + ((fileSize % 254 == 0) ? 0 : 1);\n            transwarp_bootfile_fits_on_dir_track = (num_blocks <= 17);\n\n            break;\n        }\n    }\n\n    for (int i = 0; i < num_files; i++) {\n        imagefile *file = files + i;\n        if (type == IMAGE_D81) {\n            file->sectorInterleave = 1; /* caught in command line parsing anyway, but does not hurt */\n        }\n\n        int file_usedirtrack = usedirtrack;\n        int file_numdirblocks = numdirblocks;\n\n        if ((file->mode & MODE_NOFILE)) {\n            if (file->nrSectorsShown == -1) {\n                file->nrSectorsShown = file->nrSectors;\n            }\n            file->track = 0;\n            file->sector = 0;\n            int entryOffset = linear_sector(type, dirtrack(type), file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n            image[entryOffset + FILETRACKOFFSET] = file->track;\n            image[entryOffset + FILESECTOROFFSET] = file->sector;\n            image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectorsShown & 255;\n            image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectorsShown >> 8;\n            if (shadowdirtrack > 0) {\n                entryOffset = linear_sector(type, shadowdirtrack, file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n                image[entryOffset + FILETRACKOFFSET] = file->track;\n                image[entryOffset + FILESECTOROFFSET] = file->sector;\n                image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectors & 255;\n                image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectors >> 8;\n            }\n        } else if (!(file->mode & MODE_LOOPFILE)) { /* loop files are handled later */\n\n            int fileSize = 0;\n\n            struct stat st;\n            if (stat((char*)files[i].alocalname, &st) == 0) {\n                fileSize = (int)st.st_size;\n            }\n\n            if ((file->mode & MODE_TRANSWARPBOOTFILE) != 0) {\n                file_usedirtrack = true;\n                file_numdirblocks = transwarp_bootfile_fits_on_dir_track ? 2 : 4;\n                file->sectorInterleave = -4;\n                file->mode = (file->mode & ~MODE_BEGINNING_SECTOR_MASK) | (10 + 1);\n                file->first_sector_new_track = 10;\n                track = DIRTRACK_D41_D71;\n            }\n\n            unsigned char* filedata = (unsigned char*)calloc(fileSize + ((file->filetype & FILETYPETRANSWARPMASK) ? (21 * TRANSWARPBLOCKSIZE) : 0), sizeof(unsigned char));\n            if (filedata == NULL) {\n                fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n\n                exit(-1);\n            }\n            FILE* f = fopen((char*)file->alocalname, \"rb\");\n            if (f == NULL) {\n                fprintf(stderr, \"ERROR: Could not open file \\\"%s\\\" for reading\\n\", file->alocalname);\n\n                exit(-1);\n            }\n            if (fread(filedata, fileSize, 1, f) != 1) {\n                fprintf(stderr, \"ERROR: Unexpected filesize when reading %s\\n\", file->alocalname);\n                exit(-1);\n            }\n            fclose(f);\n\n            if ((!(file->filetype & FILETYPETRANSWARPMASK))\n                    && ((file->mode & MODE_MIN_TRACK_MASK) > 0)) {\n                int minTrack = (file->mode & MODE_MIN_TRACK_MASK) >> MODE_MIN_TRACK_SHIFT;\n                if (lastMinTrack != minTrack) {\n                    lastMinTrack = minTrack;\n                    track = minTrack;\n                    /* note that track may be smaller than lastTrack now */\n                    if (track > image_num_tracks(type)) {\n                        fprintf(stderr, \"ERROR: Invalid minimum track %u for file %s (\", track, file->alocalname);\n                        print_filename(stderr, file->pfilename);\n                        fprintf(stderr, \") specified\\n\");\n\n                        exit(-1);\n                    }\n                    while ((!file_usedirtrack)\n                            && ((track == dirtrack(type))\n                                || (track == shadowdirtrack)\n                                || ((type == IMAGE_D71) && (track == (D64NUMTRACKS + dirtrack(type)))))) { /* .d71 track 53 is usually empty except the extra BAM block */\n                        ++track; /* skip dir track */\n                    }\n                    if (abs(((int) track) - lastTrack) > 1) {\n                        /* previous file's last track and this file's beginning track have tracks in between */\n                        sector = (type == IMAGE_D81) ? 0 : file->first_sector_new_track;\n                    }\n                }\n            } else {\n                lastMinTrack = 0;\n            }\n\n            if ((file->mode & MODE_BEGINNING_SECTOR_MASK) > 0) {\n                sector = (file->mode & MODE_BEGINNING_SECTOR_MASK) - 1;\n            }\n\n            if ((!(file->filetype & FILETYPETRANSWARPMASK))\n                    && (((file->mode & MODE_SAVETOEMPTYTRACKS) != 0)\n                        || ((file->mode & MODE_FITONSINGLETRACK) != 0))) {\n\n                /* find first empty track */\n                int found = 0;\n                while (!found) {\n                    for (int s = 0; s < num_sectors(type, track); s++) {\n                        if (is_sector_free(type, image, track, s, file_usedirtrack ? file_numdirblocks : 0, dir_sector_interleave)) {\n                            if (s == (num_sectors(type, track) - 1)) {\n                                found = 1;\n                                /* In first pass, use sector as left by previous file (or as set by -b) to reach first file block quickly. */\n                                /* Claus: according to Krill, on real HW tracks are not aligned anyway, so it does not make a difference. */\n                                /* Emulators tend to reset the disk angle on track changes, so this should rather be 3. */\n                                if (sector >= num_sectors(type, track)) {\n                                    if ((file->mode & MODE_BEGINNING_SECTOR_MASK) > 0) {\n                                        fprintf(stderr, \"ERROR: Invalid beginning sector %u on track %u for file %s (\", sector, track, file->alocalname);\n                                        print_filename(stderr, file->pfilename);\n                                        fprintf(stderr, \") specified\\n\");\n\n                                        exit(-1);\n                                    }\n\n                                    sector %= num_sectors(type, track);\n                                }\n                            }\n                        } else {\n                            int prev_track = track;\n                            if (file->mode & MODE_SAVECLUSTEROPTIMIZED) {\n                                if (track > D64NUMTRACKS) {\n                                    int next_track = track - D64NUMTRACKS + 1; /* to next track on first side */\n                                    if (next_track < D64NUMTRACKS) {\n                                        track = next_track;\n                                    } else {\n                                        ++track; /* disk full */\n                                    }\n                                } else {\n                                    track += D64NUMTRACKS; /* to same track on second side */\n                                }\n                            } else {\n                                ++track;\n                            }\n                            while ((!file_usedirtrack)\n                                    && ((track == dirtrack(type))\n                                        || (track == shadowdirtrack)\n                                        || ((type == IMAGE_D71) && (track == D64NUMTRACKS + dirtrack(type))))) { /* .d71 track 53 is usually empty except the extra BAM block */\n                                ++track; /* skip dir track */\n                            }\n                            if (file->mode & MODE_FITONSINGLETRACK) {\n                                int file_size = fileSize;\n                                int first_sector = -1;\n                                for (int s = 0; s < num_sectors(type, prev_track); s++) {\n                                    if (is_sector_free(type, image, prev_track, s, file_usedirtrack ? file_numdirblocks : 0, dir_sector_interleave)) {\n                                        if (first_sector < 0) {\n                                            first_sector = s;\n                                        }\n                                        file_size -= BLOCKSIZE + BLOCKOVERHEAD;\n                                        if (file_size <= 0) {\n                                            found = 1;\n                                            track = prev_track;\n                                            sector = first_sector;\n                                            break;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if (track > image_num_tracks(type)) {\n                                fprintf(stderr, \"ERROR: Disk full, file %s (\", file->alocalname);\n                                print_filename(stderr, file->pfilename);\n                                fprintf(stderr, \")\\n\");\n\n                                exit(-1);\n                            }\n                            break;\n                        }\n                    } /* for each sector on track */\n\n                    if ((track == (lastTrack + 2))\n                            && ((file->mode & MODE_BEGINNING_SECTOR_MASK) == 0)) {\n                        /* previous file's last track and this file's beginning track have tracks in between now */\n                        sector = 0;\n                    }\n                } /* while not found */\n            }\n\n            if ((file->mode & MODE_BEGINNING_SECTOR_MASK) > 0) {\n                if (sector != ((file->mode & MODE_BEGINNING_SECTOR_MASK) - 1)) {\n                    fprintf(stderr, \"ERROR: Specified beginning sector of file %s (\", file->alocalname);\n                    print_filename(stderr, file->pfilename);\n                    fprintf(stderr, \") not free on track %u\\n\", track);\n\n                    exit(-1);\n                }\n            }\n\n            /* found start track, now save file */\n            if (type == IMAGE_D81) {\n                sector = 0;\n            }\n\n            int byteOffset = 0;\n            int bytesLeft = fileSize;\n\n            unsigned long long key0 = 0;\n            if (file->filetype & FILETYPETRANSWARPMASK) {\n                key0 = write_transwarp_file(type, image, file, filedata, &fileSize, transwarp_version, transwarp_bootfile_fits_on_dir_track);\n\n                bytesLeft = 0;\n            }\n\n            while (bytesLeft > 0) {\n                /* Find free track & sector, starting from current T/S forward one revolution, then the next track etc... skip dirtrack (unless -t is active) */\n                /* If the file didn't fit before dirtrack then restart on dirtrack + 1 and try again (unless -t is active). */\n                /* If the file didn't fit before track 36/41/71 then the disk is full. */\n\n                int blockfound = 0;\n                int findSector = 0;\n\n                while (!blockfound) {\n                    /* find spare block on the current track */\n                    for (int s = sector; s < sector + num_sectors(type, track); s++) {\n                        findSector = s % num_sectors(type, track);\n\n                        if (is_sector_free(type, image, track, findSector, file_usedirtrack ? file_numdirblocks : 0, dir_sector_interleave)) {\n                            blockfound = 1;\n                            break;\n                        }\n                    }\n\n                    if (!blockfound) {\n                        /* find next track, use some magic to make up for track seek delay */\n                        int prev_track = track;\n                        int seek_delay = 1;\n                        if (file->mode & MODE_SAVECLUSTEROPTIMIZED) {\n                            if (track > D64NUMTRACKS) {\n                                track = track - D64NUMTRACKS + 1;\n                            } else {\n                                track += D64NUMTRACKS;\n                                seek_delay = 0; /* switching to the other side, no head movement */\n                            }\n                        } else {\n                            ++track;\n                        }\n                        if (type == IMAGE_D81) {\n                            sector = 0;\n                        } else if (file->first_sector_new_track < 0) {\n                            sector += seek_delay - 1;\n                        } else if ((file->sectorInterleave < 0)\n                                   && ((file->mode & MODE_TRANSWARPBOOTFILE) == 0)) {\n                            sector += seek_delay;\n                        } else {\n                            sector = file->first_sector_new_track;\n                        }\n                        sector += num_sectors(type, prev_track);\n                        sector %= num_sectors(type, prev_track);\n\n                        while ((!file_usedirtrack)\n                                && ((track == dirtrack(type))\n                                    || (track == shadowdirtrack)\n                                    || ((type == IMAGE_D71) && (track == D64NUMTRACKS + dirtrack(type))))) { /* .d71 track 53 is usually empty except the extra BAM block */\n                            /* Delete old fragments and restart file */\n                            if (!dirtracksplit) {\n                                if (file->nrSectors > 0) {\n                                    int deltrack = file->track;\n                                    int delsector = file->sector;\n                                    while (deltrack != 0) {\n                                        int b = linear_sector(type, deltrack, delsector);\n                                        if(b < 0) {\n                                            break;\n                                        }\n                                        int offset = b * BLOCKSIZE;\n                                        mark_sector(type, image, deltrack, delsector, 1 /* free */);\n                                        deltrack = image[offset + 0];\n                                        delsector = image[offset + 1];\n                                        memset(image + offset, 0, BLOCKSIZE);\n                                    }\n                                }\n\n                                bytesLeft = fileSize;\n                                byteOffset = 0;\n                                file->nrSectors = 0;\n                            }\n                            ++track;\n                        }\n\n                        if (track > image_num_tracks(type)) {\n                            if (verbose) {\n                                print_file_allocation(type, image, files, num_files);\n                                check_bam(type, image);\n                            }\n\n                            fprintf(stderr, \"ERROR: Disk full, file %s (\", file->alocalname);\n                            print_filename(stderr, file->pfilename);\n                            fprintf(stderr, \")\\n\");\n                            free(filedata);\n\n                            exit(-1);\n                        }\n                    }\n                } /* while not block found */\n\n                sector = findSector;\n                int offset = linear_sector(type, track, sector) * BLOCKSIZE;\n\n                if (bytesLeft == fileSize) {\n                    file->track = track;\n                    file->sector = sector;\n                    lastTrack = track;\n                    lastSector = sector;\n                    lastOffset = offset;\n                } else {\n                    image[lastOffset + 0] = track;\n                    image[lastOffset + 1] = sector;\n                }\n\n                /* write sector */\n                bytes_to_write = min(BLOCKSIZE - BLOCKOVERHEAD, bytesLeft);\n                memcpy(image + offset + 2, filedata + byteOffset, bytes_to_write);\n\n                bytesLeft -= bytes_to_write;\n                byteOffset += bytes_to_write;\n\n                lastTrack = track;\n                lastSector = sector;\n                lastOffset = offset;\n\n                mark_sector(type, image, track, sector, 0 /* not free */);\n\n                if (num_sectors(type, track) <= abs(file->sectorInterleave)) {\n                    fprintf(stderr, \"ERROR: Invalid interleave %d on track %u (%d sectors), file %s (\", file->sectorInterleave, track, num_sectors(type, track), file->alocalname);\n                    print_filename(stderr, file->pfilename);\n                    fprintf(stderr, \")\\n\");\n\n                    exit(-1);\n                }\n\n                sector += abs(file->sectorInterleave);\n                if (sector >= num_sectors(type, track)) {\n                    sector -= num_sectors(type, track);\n                    if ((file->sectorInterleave >= 0) && (sector > 0)) {\n                        --sector; /* subtract one after wrap (supposedly due to large tail gap) */\n                    }\n                }\n\n                file->nrSectors++;\n            } /* while bytes left */\n\n            if (!(file->filetype & FILETYPETRANSWARPMASK)) {\n                image[lastOffset + 0] = 0x00;\n                image[lastOffset + 1] = bytes_to_write + 1;\n            }\n\n            /* update directory entry */\n            int entryOffset = linear_sector(type, dirtrack(type), file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n            image[entryOffset + FILETRACKOFFSET] = file->track;\n            image[entryOffset + FILESECTOROFFSET] = file->sector;\n\n            if (file->filetype & FILETYPETRANSWARPMASK) {\n                image[entryOffset + FILETRACKOFFSET] = 0;\n                image[entryOffset + FILESECTOROFFSET] = 0;\n\n                image[entryOffset + TRANSWARPSIGNATROFFSLO] = TRANSWARPSIGNATURELO;\n                image[entryOffset + TRANSWARPSIGNATROFFSHI] = TRANSWARPSIGNATUREHI;\n\n                image[entryOffset + TRANSWARPTRACKOFFSET] = file->track;\n\n                image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectors;\n                image[entryOffset + FILEBLOCKSHIOFFSET] = (file->nrSectors >> 8);\n                if (image[entryOffset + FILEBLOCKSHIOFFSET] > 0) {\n                    fprintf(stderr, \"ERROR: Transwarp file \\\"%s\\\" is %d > 255 blocks big\\n\", file->alocalname, file->nrSectors);\n\n                    exit(-8);\n                }\n\n                int loadaddress = (filedata[1] << 8) | filedata[0];\n                image[entryOffset + LOADADDRESSLOOFFSET] = loadaddress;\n                image[entryOffset + LOADADDRESSHIOFFSET] = (loadaddress >> 8);\n                int endaddress = loadaddress + fileSize - 2;\n                image[entryOffset + ENDADDRESSLOOFFSET] = endaddress;\n                image[entryOffset + ENDADDRESSHIOFFSET] = (endaddress >> 8);\n\n                unsigned char file_checksum = 0xff;\n                for (int i = 2; i < fileSize; ++i) {\n                    file_checksum ^= filedata[i];\n                    file_checksum = crc8(file_checksum);\n                }\n                image[entryOffset + FILECHECKSUMOFFSET] = file_checksum;\n\n                image[entryOffset + DIRDATACHECKSUMOFFSET] = 0;\n                image[entryOffset + DIRDATACHECKSUMOFFSET] = (0x0100 - transwarp_dirdata_checksum(image, entryOffset));\n                unsigned char dirdata_checksum = transwarp_dirdata_checksum(image, entryOffset);\n                if (dirdata_checksum != 0) {\n                    if (dirdata_checksum == 1) {\n                        --image[entryOffset + DIRDATACHECKSUMOFFSET];\n                    }\n                    dirdata_checksum = transwarp_dirdata_checksum(image, entryOffset);\n                    if (dirdata_checksum != 0) {\n                        fprintf(stderr, \"ERROR: Encoding error with \\\"%s\\\", 0x%x\\n\", file->alocalname, dirdata_checksum);\n\n                        exit(-9);\n                    }\n                }\n\n                if (file->have_key != 0) {\n                    for (int offset = DIRDATACHECKSUMOFFSET; offset <= FILEBLOCKSLOOFFSET; ++offset) {\n                        image[entryOffset + offset] ^= key0;\n                        key0 >>= 8;\n                    }\n\n                    file->nrSectors = image[entryOffset + FILEBLOCKSLOOFFSET];\n                }\n            }\n\n            if (file->nrSectorsShown < 0) {\n                file->nrSectorsShown = file->nrSectors;\n            }\n            image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectorsShown & 255;\n            image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectorsShown >> 8;\n\n            if (shadowdirtrack > 0) {\n                entryOffset = linear_sector(type, shadowdirtrack, file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n                image[entryOffset + FILETRACKOFFSET] = file->track;\n                image[entryOffset + FILESECTOROFFSET] = file->sector;\n\n                image[entryOffset + FILEBLOCKSLOOFFSET] = file->nrSectors & 255;\n                image[entryOffset + FILEBLOCKSHIOFFSET] = file->nrSectors >> 8;\n            }\n\n            free(filedata);\n        }\n    } /* for each file */\n\n    /* Set track/sector of Transwarp file entries to Transwarp bootfile */\n    int transwarp_boot_track = 0;\n    int transwarp_boot_sector = 0;\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n\n    for (int i = 0; i < num_files; i++) {\n        imagefile *file = files + i;\n        if (file->filetype & FILETYPETRANSWARPMASK) {\n            if (transwarp_boot_track == 0) {\n                /* find Transwarp bootfile */\n\n                int t = dirtrack(type);\n                int s = (type == IMAGE_D81) ? 3 : 1;\n                int o = 0;\n\n                do {\n                    int b = linear_sector(type, t, s) * BLOCKSIZE + o;\n                    int filetype = image[b + FILETYPEOFFSET] & 0xf;\n                    if (filetype == FILETYPEDEL) {\n                        continue;\n                    }\n\n                    if (is_transwarp_file(image, b)) {\n                        continue;\n                    }\n\n                    if (!is_transwarp_bootfile(image, b)) {\n                        continue;\n                    }\n\n                    int filetrack = image[b + FILETRACKOFFSET];\n                    int filesector = image[b + FILESECTOROFFSET];\n                    if (filetrack == 0) {\n                        continue;\n                    }\n\n                    if (verbose) {\n                        printf(\"\\nTranswarp bootfile at T%d/S%d\\n\", filetrack, filesector);\n                    }\n\n                    transwarp_boot_track = filetrack;\n                    transwarp_boot_sector = filesector;\n\n                    break;\n                } while (next_dir_entry(type, image, &t, &s, &o, blockmap));\n            }\n\n            if (transwarp_boot_track == 0) {\n                fprintf(stderr, \"ERROR: No Transwarp bootfile provided\\n\");\n\n                exit(-10);\n            }\n\n            int b = linear_sector(type, dirtrack(type), file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n            image[b + FILETRACKOFFSET] = transwarp_boot_track;\n            image[b + FILESECTOROFFSET] = transwarp_boot_sector;\n        }\n    }\n    free(blockmap);\n\n    /* update loop files */\n    for (int i = 0; i < num_files; i++) {\n        imagefile *file = files + i;\n        if (((file->filetype & 0xf) != FILETYPEDEL) && (file->mode & MODE_LOOPFILE)) {\n            int track, sector, offset;\n            int index;\n            if (find_existing_file(type, image, file->plocalname, &index, &track, &sector, &offset)) {\n                /* read track/sector and nrSectors from disk image */\n                int b = linear_sector(type, track, sector) * BLOCKSIZE + offset;\n                file->track = image[b + FILETRACKOFFSET];\n                file->sector = image[b + FILESECTOROFFSET];\n                file->nrSectors = image[b + FILEBLOCKSLOOFFSET] + (image[b + FILEBLOCKSHIOFFSET] << 8);\n\n                /* update directory entry */\n                b = linear_sector(type, dirtrack(type), file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n                image[b + FILETRACKOFFSET] = file->track;\n                image[b + FILESECTOROFFSET] = file->sector;\n\n                if (file->nrSectorsShown == -1) {\n                    file->nrSectorsShown = file->nrSectors;\n                }\n                image[b + FILEBLOCKSLOOFFSET] = file->nrSectorsShown & 255;\n                image[b + FILEBLOCKSHIOFFSET] = file->nrSectorsShown >> 8;\n\n                if (shadowdirtrack > 0) {\n                    b = linear_sector(type, shadowdirtrack, file->direntrysector) * BLOCKSIZE + file->direntryoffset;\n                    image[b + FILETRACKOFFSET] = file->track;\n                    image[b + FILESECTOROFFSET] = file->sector;\n\n                    image[b + FILEBLOCKSLOOFFSET] = file->nrSectors & 255;\n                    image[b + FILEBLOCKSHIOFFSET] = file->nrSectors >> 8;\n                }\n\n                for (int j = 0; j < num_files; j++) {\n                    imagefile *other_file = files + j;\n                    if ((i != j)\n                            && (file->track == other_file->track)\n                            && (file->sector == other_file->sector)) {\n                        file->sectorInterleave = other_file->sectorInterleave;\n\n                        break;\n                    }\n                }\n\n                continue;\n            } else {\n                fprintf(stderr, \"ERROR: Loop source file '%s' (%d) not found\\n\", file->alocalname, i + 1);\n                exit(-1);\n            }\n        }\n    }\n}\n\n/* Writes 16 bit value to file */\nstatic size_t\nwrite16(unsigned int value, FILE* f)\n{\n    char byte = value & 0xff;\n    size_t bytes_written = fwrite(&byte, 1, 1, f);\n\n    byte = (value >> 8) & 0xff;\n    bytes_written += fwrite(&byte, 1, 1, f);\n\n    return bytes_written;\n}\n\n/* Writes 32 bit value to file */\nstatic size_t\nwrite32(unsigned int value, FILE* f)\n{\n    size_t bytes_written = write16(value, f);\n    bytes_written += write16(value >> 16, f);\n\n    return bytes_written;\n}\n\n/* Writes image as G64 file */\nstatic int\ngenerate_uniformat_g64(unsigned char* image, const char *imagepath)\n{\n    FILE* f = fopen(imagepath, \"wb\");\n\n    size_t filepos = 0;\n\n    static const char signature[] = \"GCR-1541\";\n    filepos += fwrite(signature, 1, sizeof signature - 1, f);\n\n    const char version = 0;\n    filepos += fwrite(&version, 1, 1, f);\n\n    const char num_tracks = 35 * 2;\n    filepos += fwrite(&num_tracks, 1, 1, f);\n\n    const unsigned int track_size = 7692; /* = track_bytes on tracks 1..17 */\n    filepos += write16(track_size, f);\n\n    const unsigned int table_size = num_tracks * 4;\n    const unsigned int tracks_offset = (int)filepos + (table_size * 2);\n\n    for (int track = 0; track < num_tracks; ++track) {\n        unsigned int track_offset = 0;\n\n        if ((track & 1) == 0) {\n            track_offset = tracks_offset + ((track >> 1) * (2 + track_size));\n        }\n\n        filepos += write32(track_offset, f);\n    }\n\n    for (int track = 0; track < num_tracks; ++track) {\n        unsigned int bit_rate = 0;\n\n        if ((track & 1) == 0) {\n            switch (sectors_per_track[track >> 1]) {\n            case 21:\n                bit_rate = 3;\n                break;\n            case 19:\n                bit_rate = 2;\n                break;\n            case 18:\n                bit_rate = 1;\n                break;\n            case 17:\n                bit_rate = 0;\n                break;\n            }\n        }\n\n        filepos += write32(bit_rate, f);\n    }\n\n    const unsigned char sync[] = { 0xff, 0xff, 0xff, 0xff, 0xff };\n    const char gap[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };\n    char header_gcr[10];\n\n    const unsigned int block_size =\n        (sizeof sync)\n        + (sizeof header_gcr)\n        + (sizeof gap)\n        + (sizeof sync)\n        + 325; /* data */\n\n    const char id[3] = { '2', 'A', '\\0' };\n\n    bool is_uniform = true;\n\n    for (int track = 0; track < (num_tracks >> 1); ++track) {\n        int track_bytes = 0;\n        int num_sectors = sectors_per_track[track];\n        switch (num_sectors) {\n        case 21:\n            track_bytes = 7692;\n            break; /* = track_size */\n        case 19:\n            track_bytes = 7142;\n            break;\n        case 18:\n            track_bytes = 6666;\n            break;\n        case 17:\n            track_bytes = 6250;\n            break;\n        }\n\n        filepos += write16(track_bytes, f);\n        size_t track_begin = filepos;\n\n        int data_bytes = num_sectors * block_size;\n        int gap_size = (track_bytes - data_bytes) / num_sectors;\n        if (gap_size < 0) {\n            printf(\"\\nERROR: Track too small for G64 output\\n\");\n            fclose(f);\n\n            return -1;\n        }\n\n        float average_gap_remainder = (((float) (track_bytes - data_bytes)) / num_sectors) - gap_size;\n        if (average_gap_remainder >= 1.0f) {\n            average_gap_remainder = 0.0f; /* 0..1 */\n        }\n\n        float remainder = 0.0f;\n        for (int sector = 0; sector < num_sectors; ++sector) {\n            unsigned int gap_bytes = gap_size;\n            remainder += average_gap_remainder;\n            if (remainder >= 0.5f) {\n                remainder -= 1.0f;\n                ++gap_bytes;\n            }\n\n            filepos += fwrite(sync, 1, sizeof sync, f);\n            char header[8] = {\n                0x08, /* header ID */\n                (char) (sector ^ (track + 1) ^ id[1] ^ id[0]), /* checksum */\n                (char) sector,\n                (char) (track + 1),\n                id[1],\n                id[0],\n                0x0f, 0x0f\n            };\n\n            encode_4_bytes_gcr(header, header_gcr);\n            encode_4_bytes_gcr(header + 4, header_gcr + 5);\n\n            filepos += fwrite(header_gcr, 1, sizeof header_gcr, f);\n            filepos += fwrite(gap, 1, sizeof gap, f);\n\n            filepos += fwrite(sync, 1, sizeof sync, f);\n\n            char group[5];\n\n            char checksum = image[0] ^ image[1] ^ image[2];\n            char data[4] = { 0x07, (char) image[0], (char) image[1], (char) image[2] };\n            encode_4_bytes_gcr(data, group);\n            filepos += fwrite(group, 1, sizeof group, f);\n            for (int i = 0; i < 0x3f; ++i) {\n                data[0] = image[(i * 4) + 3];\n                data[1] = image[(i * 4) + 4];\n                data[2] = image[(i * 4) + 5];\n                data[3] = image[(i * 4) + 6];\n                encode_4_bytes_gcr(data, group);\n                filepos += fwrite(group, 1, sizeof group, f);\n                checksum ^= (data[0] ^ data[1] ^ data[2] ^ data[3]);\n            }\n            data[0] = image[0xff];\n            data[1] = data[0] ^ checksum;\n            data[2] = 0;\n            data[3] = 0;\n            encode_4_bytes_gcr(data, group);\n            filepos += fwrite(group, 1, sizeof group, f);\n\n            for (int i = gap_bytes; i > 0; --i) {\n                filepos += fwrite(gap, 1, 1, f);\n            }\n\n            image += 0x0100;\n        } /* for each sector */\n\n        size_t tail_gap = track_bytes - filepos + track_begin;\n        if (tail_gap > 0) {\n            for (size_t i = tail_gap; i > 0; --i) {\n                filepos += fwrite(gap, 1, 1, f);\n            }\n\n            is_uniform = false;\n        }\n\n        for (int i = (track_size - track_bytes); i > 0; --i) {\n            filepos += fwrite(sync, 1, 1, f);\n        }\n    } /* for each track */\n\n    fclose(f);\n\n    if (!is_uniform) {\n        printf(\"\\nWARNING: \\\"%s\\\" is not UniFormAt'ed\\n\", imagepath);\n    }\n\n    return 0;\n}\n\n/* Generates a unique filename, either based on the proposed name, or using track and sector. */\nstatic void\ngenerate_unique_filename(image_type type, unsigned char *image, unsigned char *name, int track, int sector, int start, char marker)\n{\n    int i, t, s, o;\n    if(name[0] == 0xa0 || name[0] == 0) {\n        /* no name provided, create one */\n        name[0] = a2p('t');\n        pputnum2(name+1, track);\n        name[3] = a2p('s');\n        pputnum2(name+4, sector);\n        name[6] = a2p('$');\n        pputhex(name+7, start);\n        for(int pos = 11; pos < FILENAMEMAXSIZE; pos++) {\n            name[pos] = 0xa0;\n        }\n    }\n    int marker_pos = pstrlen(name);\n    if(marker_pos > FILENAMEMAXSIZE-1) {\n        marker_pos = FILENAMEMAXSIZE-1;\n    }\n    if(marker) {\n        name[marker_pos] = marker;\n    } else {\n        marker_pos++;\n    }\n    int appendix = 1;\n    int appendix_len = 2;\n    int namelen = pstrlen(name);\n    while(find_existing_file(type, image, name, &i, &t, &s, &o)) {\n        marker_pos = namelen + appendix_len;\n        if(marker_pos > FILENAMEMAXSIZE-1) {\n            marker_pos = FILENAMEMAXSIZE-1;\n            if(!marker) {\n                marker_pos++;\n            }\n        }\n        if(marker) {\n            name[marker_pos] = marker;\n        }\n        int appendix_pos = marker_pos - appendix_len;\n        name[appendix_pos] = '.';\n        pputnum(name + appendix_pos + 1, appendix);\n        appendix++;\n        if(appendix == 10) {\n            appendix_len++;\n        }\n        if(appendix == 100) {\n            appendix_len++;\n        }\n    }\n}\n\n/* Count number of blocks in file, assumes valid t/s chain */\nstatic int\ncount_blocks(image_type type, unsigned char *image, unsigned int track, int sector)\n{\n    int num = 0;\n    while(track != 0) {\n        int b = linear_sector(type, track, sector);\n        if(b < 0) {\n            break;\n        }\n        int block_offset = b * BLOCKSIZE;\n        track = image[block_offset + TRACKLINKOFFSET];\n        sector = image[block_offset + SECTORLINKOFFSET];\n        num++;\n    };\n    return num;\n}\n\n/* Overwrites all blocks that are marked as potentially allocated with the given value */\nstatic void\nmark_sector_chain(image_type type, unsigned char *image, char* atab, unsigned int track, int sector, unsigned int last_track, int last_sector, int mark)\n{\n    if(track <= 0 || track > image_num_tracks(type) || sector < 0 || sector > num_sectors(type, track)) {\n        return;\n    }\n    while(1) {\n        int b = linear_sector(type, track, sector);\n        atab[b] = mark;\n        if(track == last_track && sector == last_sector) {\n            break;\n        }\n        int block_offset = b * BLOCKSIZE;\n        track = image[block_offset + TRACKLINKOFFSET];\n        sector = image[block_offset + SECTORLINKOFFSET];\n    };\n}\n\n/* Validates sector chain starting at track/sector, returns how and in which t/s the chain ends */\nstatic int\nvalidate_sector_chain(image_type type, unsigned char* image, char* atab, unsigned int track, int sector, unsigned int *last_track, int *last_sector)\n{\n    *last_track = track;\n    *last_sector = sector;\n    if(track == 0 || track > image_num_tracks(type)) {\n        return FIRST_BROKEN;\n    }\n    if(sector >= num_sectors(type, track)) {\n        return FIRST_BROKEN;\n    }\n    if(atab[linear_sector(type, track, sector)] != UNALLOCATED) {\n        return FIRST_BROKEN;\n    }\n    while (1) {\n        atab[linear_sector(type, track, sector)] = POTENTIALLYALLOCATED;\n        int block_offset = linear_sector(type, track, sector) * BLOCKSIZE;\n        unsigned int next_track = image[block_offset + TRACKLINKOFFSET];\n        int next_sector = image[block_offset + SECTORLINKOFFSET];\n        if (next_track == 0) {\n            return VALID; /* end of valid chain */\n        }\n        if (next_track > image_num_tracks(type)) {\n            return ILLEGAL_TRACK;\n        }\n        if (next_sector >= num_sectors(type, next_track)) {\n            return ILLEGAL_SECTOR;\n        }\n        switch(atab[linear_sector(type, next_track, next_sector)]) {\n        case POTENTIALLYALLOCATED:\n            return LOOP;\n        case ALLOCATED:\n            return COLLISION;\n        case FILESTART:\n            return CHAINED;\n        case FILESTART_TRUNCATED:\n            return CHAINED_TRUNCATED;\n        }\n        track = next_track;\n        sector = next_sector;\n        *last_track = track;\n        *last_sector = sector;\n    }\n}\n\nstatic void\ninit_atab(image_type type, unsigned char* image, char* atab)\n{\n    int dt = dirtrack(type);\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int offset = 0;\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n\n    do {\n        int db = linear_sector(type, dt, ds);\n        atab[db] = ALLOCATED;\n        int filetype = image[db * BLOCKSIZE + offset + FILETYPEOFFSET] & 0xf;\n        if(filetype != FILETYPEDEL) {\n            int track = image[db * BLOCKSIZE + offset + FILETRACKOFFSET];\n            int sector = image[db * BLOCKSIZE + offset + FILESECTOROFFSET];\n            unsigned int last_track;\n            int last_sector;\n            int error = validate_sector_chain(type, image, atab, track, sector, &last_track, &last_sector);\n            if(error != VALID) {\n                printf(\"WARNING: file \");\n                print_filename(stdout, &image[db * BLOCKSIZE + offset + FILENAMEOFFSET]);\n                printf(\" seems corrupt (%s)\\n\", error_name[error]);\n            }\n            mark_sector_chain(type, image, atab, track, sector, last_track, last_sector, ALLOCATED);\n        }\n    } while(next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n}\n\n/* Write atab into BAM */\nstatic void\nwrite_atab(image_type type, unsigned char* image, char* atab)\n{\n    for(unsigned int t = 1; t <= image_num_tracks(type); t++) {\n        for(int s = 0; s < num_sectors(type, t); s++) {\n            int b = linear_sector(type, t, s);\n            int free = (atab[b] == UNALLOCATED);\n            if(!free) {\n                /* keep allocated BAM entries, only add new ones */\n                mark_sector(type, image, t, s, 0);\n            }\n        }\n    }\n}\n\n/* Try to undelete a file given the directory entry, returns true if successful */\nstatic bool\nundelete_file(image_type type, unsigned char* image, int dt, int ds, int offset, char* atab, int level)\n{\n    unsigned int last_track;\n    int last_sector;\n    char marker = 0;\n    int dirblock = linear_sector(type, dt, ds) * BLOCKSIZE;\n    int track = image[dirblock + offset + FILETRACKOFFSET];\n    int sector = image[dirblock + offset + FILESECTOROFFSET];\n    int error = validate_sector_chain(type, image, atab, track, sector, &last_track, &last_sector);\n    if(error == VALID || ((level == RESTORE_DIR_ONLY || level >= RESTORE_INVALID_FILES) && error != FIRST_BROKEN)) {\n        unsigned char name[17];\n        if(error != VALID) {\n            if(level != RESTORE_DIR_ONLY) {\n                /* terminate chain */\n                int block_offset = linear_sector(type, last_track, last_sector) * BLOCKSIZE;\n                image[block_offset + TRACKLINKOFFSET] = 0;\n                marker = '<';\n            }\n        }\n        /* restore dir entry */\n        memcpy(&name, &image[dirblock + offset + FILENAMEOFFSET], 16);\n        name[16] = 0;\n        int b = linear_sector(type, track, sector);\n        int address = image[b * BLOCKSIZE + 2] + 256 * image[b * BLOCKSIZE + 3];\n        generate_unique_filename(type, image, name, track, sector, address, marker);\n        memcpy(&image[dirblock + offset + FILENAMEOFFSET], &name, 16);\n        image[dirblock + offset + FILETYPEOFFSET] = 0x82; /* original file type is lost, use closed PRG instead */\n        mark_sector_chain(type, image, atab, track, sector, last_track, last_sector, ALLOCATED);\n        if(level != RESTORE_DIR_ONLY) {\n            int size = count_blocks(type, image, track, sector);\n            image[dirblock + offset + FILEBLOCKSHIOFFSET] = size / 256;\n            image[dirblock + offset + FILEBLOCKSLOOFFSET] = size % 256;\n        }\n        return true;\n    }\n    if(error != FIRST_BROKEN) {\n        mark_sector_chain(type, image, atab, track, sector, last_track, last_sector, UNALLOCATED);\n    }\n    return false;\n}\n\n/* search for scratched directory entries and restore them */\nstatic int\nundelete(image_type type, unsigned char* image, char* atab, int level)\n{\n    int dt = dirtrack(type);\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int nsectors = num_sectors(type, dt);\n    int offset = 0;\n    int num_undeleted = 0;\n    int final_dt, final_ds; /* last linked directory sector and track */\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n\n    bool* searched = calloc(nsectors, sizeof(bool));\n    if(searched == NULL) {\n        fprintf(stderr, \"ERROR: error allocating memory\");\n        exit(-1);\n    }\n\n    /* go through directory sector chain */\n    do {\n        if(dt == dirtrack(type)) {\n            searched[ds] = true;\n        }\n        final_dt = dt;\n        final_ds = ds;\n        int db = linear_sector(type, dt, ds);\n        mark_sector(type, image, dt, ds, 0); /* needs to be updated in BAM, so that dir allocation works correctly later */\n        atab[db] = ALLOCATED;\n        int dirblock = db * BLOCKSIZE;\n        int filetype = image[dirblock + offset + FILETYPEOFFSET];\n        if(filetype == FILETYPEDEL && image[dirblock + offset + FILENAMEOFFSET] != 0 && undelete_file(type, image, dt, ds, offset, atab, level)) { /* filename starting with 0 means that likely there was no file */\n            num_undeleted++;\n        }\n    } while(next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n\n    /* search for unlinked dir sectors */\n    dt = dirtrack(type);\n    for(ds = (type == IMAGE_D81) ? 3 : 1; ds < nsectors; ds++) {\n        if(!searched[ds]) {\n            int found = 1;\n            for(offset = 0; offset < DIRENTRIESPERBLOCK*DIRENTRYSIZE; offset += DIRENTRYSIZE) {\n                if(!undelete_file(type, image, dt, ds, offset, atab, level)) {\n                    found = 0;\n                    break;\n                }\n            }\n            if(found) {\n                num_undeleted += 8;\n                if(!quiet) {\n                    printf(\"Relinking directory sector %d\\n\", ds);\n                }\n                /* link found dir sector */\n                int block_offset = linear_sector(type, final_dt, final_ds) * BLOCKSIZE;\n                image[block_offset + TRACKLINKOFFSET] = dt;\n                image[block_offset + SECTORLINKOFFSET] = ds;\n                /* terminate found dir sector */\n                int db = linear_sector(type, dt, ds);\n                block_offset = db * BLOCKSIZE;\n                image[block_offset + TRACKLINKOFFSET] = 0;\n                final_dt = dt;\n                final_ds = ds;\n                mark_sector(type, image, dt, ds, 0); /* needs to be updated in BAM, so that dir allocation works correctly later */\n                atab[db] = ALLOCATED;\n            }\n        }\n    }\n    free(searched);\n    write_atab(type, image, atab);\n    return num_undeleted;\n}\n\n/* add new DIR entries for wild chains */\nstatic void\nadd_wild_to_dir(image_type type, unsigned char* image, char* atab, imagefile files[])\n{\n    /* create a DIR entry for each FILESTART */\n    for(unsigned int t = 1; t <= image_num_tracks(type); t++) {\n        for(int s = 0; s < num_sectors(type, t); s++) {\n            int b = linear_sector(type, t, s);\n            if(atab[b] == FILESTART || atab[b] == FILESTART_TRUNCATED) {\n                char marker = atab[b] == FILESTART ? 0 : '<';\n                unsigned char name[17];\n                name[0] = 0xa0;\n                int dir_index, dir_sector, dir_offset;\n                atab[b] = ALLOCATED;\n                new_dir_slot(type, image, (type == IMAGE_D81 ? 1 : 3), 0, &dir_index, &dir_sector, &dir_offset, files); /* TODO: handle full directory more gracefully */\n                int db = linear_sector(type, dirtrack(type), dir_sector);\n                atab[db] = ALLOCATED; /* make sure that potentially new dir block is marked as used */\n                int offset = db * BLOCKSIZE + dir_offset;\n                image[offset + FILETYPEOFFSET] = 0x82; /* closed PRG */\n                image[offset + FILETRACKOFFSET] = t;\n                image[offset + FILESECTOROFFSET] = s;\n                image[offset + FILENAMEOFFSET] = 0xa0; /* no proposed filename */\n                int address = image[b * BLOCKSIZE + 2] + 256 * image[b * BLOCKSIZE + 3];\n                generate_unique_filename(type, image, name, t, s, address, marker);\n                memcpy(&image[offset + FILENAMEOFFSET], name, 16);\n                int size = count_blocks(type, image, t, s);\n                image[offset + FILEBLOCKSHIOFFSET] = size / 256;\n                image[offset + FILEBLOCKSLOOFFSET] = size % 256;\n            }\n        }\n    }\n}\n\n/* search for wild valid chains of unallocated sectors */\nstatic int\nundelete_wild(image_type type, unsigned char* image, char* atab, int level, imagefile files[])\n{\n    int num_undeleted = 0;\n    int max_bam_sector = (type == IMAGE_D81) ? 2 : 0;\n    unsigned int dt = dirtrack(type);\n    /* search for well terminated sector chains */\n    for(unsigned int t = 1; t <= image_num_tracks(type); t++) {\n        for(int s = 0; s < num_sectors(type, t); s++) {\n            int b = linear_sector(type, t, s);\n            if(atab[b] == UNALLOCATED && (t != dt || s > max_bam_sector)) { /* ignore bam sectors */\n                unsigned int last_track;\n                int last_sector;\n                int error = validate_sector_chain(type, image, atab, t, s, &last_track, &last_sector);\n                int last_block = linear_sector(type, last_track, last_sector);\n                if(error == CHAINED || error == CHAINED_TRUNCATED) {\n                    mark_sector_chain(type, image, atab, t, s, last_track, last_sector, ALLOCATED);\n                    atab[b] = (error == CHAINED) ? FILESTART : CHAINED_TRUNCATED;\n                    int chained_track = image[last_block * BLOCKSIZE + TRACKLINKOFFSET];\n                    int chained_sector = image[last_block * BLOCKSIZE + SECTORLINKOFFSET];\n                    int chained_block = linear_sector(type, chained_track, chained_sector);\n                    atab[chained_block] = ALLOCATED; /* overwrite FILESTART */\n                } else if(error == VALID) {\n                    if(last_track == t && last_sector == s) {\n                        if(level == RESTORE_INVALID_SINGLES) {\n                            /* single block files should have all 0 after file end */\n                            bool valid = false;\n                            int last_byte = image[last_block * BLOCKSIZE + SECTORLINKOFFSET];\n                            if(image[last_block * BLOCKSIZE + TRACKLINKOFFSET] == 0 && last_byte >= 2) {\n                                valid = true;\n                                for(int i = last_byte + 1; i <= 255; i++) {\n                                    if(image[last_block * BLOCKSIZE + i] != 0) {\n                                        valid = false;\n                                        break;\n                                    }\n                                }\n                            }\n                            if(valid) {\n                                atab[b] = FILESTART;\n                                num_undeleted++;\n                            } else {\n                                atab[b] = UNALLOCATED;\n                            }\n                            atab[b] = valid ? FILESTART : UNALLOCATED;\n                        } else {\n                            atab[b] = UNALLOCATED;\n                        }\n                    } else {\n                        mark_sector_chain(type, image, atab, t, s, last_track, last_sector, ALLOCATED);\n                        atab[b] = FILESTART;\n                        image[last_block * BLOCKSIZE + TRACKLINKOFFSET] = 0;\n                        num_undeleted++;\n                    }\n                } else {\n                    if(error != FIRST_BROKEN) {\n                        mark_sector_chain(type, image, atab, t, s, last_track, last_sector, UNALLOCATED);\n                    }\n                }\n            }\n        }\n    }\n    if(num_undeleted) {\n        write_atab(type, image, atab);\n        add_wild_to_dir(type, image, atab, files);\n    }\n    return num_undeleted;\n}\n\n/* search for wild invalid chains of unallocated sectors and fix them */\nstatic int\nundelete_fix_wild(image_type type, unsigned char* image, char* atab, imagefile files[])\n{\n    int num_undeleted = 0;\n    int max_bam_sector = (type == IMAGE_D81) ? 2 : 0;\n    unsigned int dt = dirtrack(type);\n    /* search for broken sector chains */\n    for(unsigned int t = 1; t <= image_num_tracks(type); t++) {\n        for(int s = 0; s < num_sectors(type, t); s++) {\n            int b = linear_sector(type, t, s);\n            if(atab[b] == UNALLOCATED && (t != dt || s > max_bam_sector)) { /* ignore bam sectors */\n                unsigned int last_track;\n                int last_sector;\n                int error = validate_sector_chain(type, image, atab, t, s, &last_track, &last_sector);\n                int last_block = linear_sector(type, last_track, last_sector);\n                if(error == CHAINED || error == CHAINED_TRUNCATED) {\n                    mark_sector_chain(type, image, atab, t, s, last_track, last_sector, ALLOCATED);\n                    atab[b] = (error == CHAINED) ? FILESTART : FILESTART_TRUNCATED;\n                    int chained_track = image[last_block * BLOCKSIZE + TRACKLINKOFFSET];\n                    int chained_sector = image[last_block * BLOCKSIZE + SECTORLINKOFFSET];\n                    int chained_block = linear_sector(type, chained_track, chained_sector);\n                    atab[chained_block] = ALLOCATED; /* overwrite FILESTART */\n                } else if(t != last_track || s != last_sector) {\n                    mark_sector_chain(type, image, atab, t, s, last_track, last_sector, ALLOCATED);\n                    atab[b] = FILESTART_TRUNCATED;\n                    image[last_block * BLOCKSIZE + TRACKLINKOFFSET] = 0;\n                    image[last_block * BLOCKSIZE + SECTORLINKOFFSET] = 255;\n                    num_undeleted++;\n                } else {\n                    if(error != FIRST_BROKEN) {\n                        mark_sector_chain(type, image, atab, t, s, last_track, last_sector, UNALLOCATED);\n                    }\n                }\n            }\n        }\n    }\n    if(num_undeleted) {\n        write_atab(type, image, atab);\n        add_wild_to_dir(type, image, atab, files);\n    }\n    return num_undeleted;\n}\n\n/* Tries to restore any deleted or formatted files */\nstatic void\nrestore(image_type type, unsigned char* image, int level, imagefile files[])\n{\n    int num_undeleted = 0;\n    /* create block allocation table */\n    char *atab = (char *)calloc(image_num_blocks(type), sizeof(char));\n    if (atab == NULL) {\n        fprintf(stderr, \"ERROR: error allocating memory\");\n        exit(-1);\n    }\n    init_atab(type, image, atab);\n    if(level == RESTORE_DIR_ONLY) {\n        num_undeleted += undelete(type, image, atab, RESTORE_DIR_ONLY);\n    } else {\n        num_undeleted += undelete(type, image, atab, RESTORE_VALID_FILES);\n        if(level >= RESTORE_VALID_CHAINS) {\n            num_undeleted += undelete_wild(type, image, atab, RESTORE_VALID_CHAINS, files);\n        }\n        if(level >= RESTORE_INVALID_FILES) {\n            num_undeleted += undelete(type, image, atab, RESTORE_INVALID_FILES);\n        }\n        if(level >= RESTORE_INVALID_CHAINS) {\n            num_undeleted += undelete_fix_wild(type, image, atab, files);\n        }\n        if(level >= RESTORE_INVALID_SINGLES) {\n            num_undeleted += undelete_wild(type, image, atab, RESTORE_INVALID_SINGLES, files);\n        }\n    }\n    free(atab);\n    if(num_undeleted) {\n        modified = 1;\n    }\n    if(!quiet) {\n        printf(\"%d files undeleted\", num_undeleted);\n        if(num_undeleted) {\n            printf(\", '<' at filename end marks truncated files\");\n        }\n        printf(\"\\n\");\n    }\n}\n\n/* Prints a command line to create dir art like the given image */\nstatic void\nconvert_to_commandline(image_type type, unsigned char* image)\n{\n    char *blockmap = calloc(image_num_blocks(type), sizeof(char));\n    if(blockmap == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        exit(-1);\n    }\n    printf(\"\\nCommandline to create directory art: -m -n \\\"\");\n    unsigned int bam = linear_sector(type, dirtrack(type), 0) * BLOCKSIZE;\n    print_filename_with_escapes(image + bam + get_header_offset(type), FILENAMEMAXSIZE);\n    printf(\"\\\" -i \\\"\");\n    print_filename_with_escapes(image + bam + get_id_offset(type), 5);\n    printf(\"\\\" \");\n\n    int ds = (type == IMAGE_D81) ? 3 : 1;\n    int dt = dirtrack(type);\n    int offset = 0;\n    do {\n        int dirblock = linear_sector(type, dt, ds) * BLOCKSIZE + offset;\n        int filetype = image[dirblock + FILETYPEOFFSET];\n        if (filetype) {\n            if(filetype != 0x82) {\n                printf(\"-T %d \", filetype);\n            }\n            int size = image[dirblock + FILEBLOCKSLOOFFSET] + 256 * image[dirblock + FILEBLOCKSHIOFFSET];\n            if(size != 0) {\n                printf(\"-B %d \", size);\n            }\n            unsigned char *filename = (unsigned char *) image + dirblock + FILENAMEOFFSET;\n            printf(\"-N -f \\\"\");\n            print_filename_with_escapes(filename, FILENAMEMAXSIZE);\n            printf(\"\\\" -L \");\n        }\n    } while (next_dir_entry(type, image, &dt, &ds, &offset, blockmap));\n    free(blockmap);\n    printf(\"\\n\\n\");\n}\n\n/* Performs strict CBM DOS validation on the image */\nstatic void\nvalidate(image_type type, unsigned char* image)\n{\n    /* create block allocation table */\n    char *atab = (char *)calloc(image_num_blocks(type), sizeof(int));\n    if (atab == NULL) {\n        fprintf(stderr, \"ERROR: error allocating memory\");\n        exit(-1);\n    }\n    /* check format specifier */\n    int format = image[linear_sector(type, dirtrack(type), 0) * BLOCKSIZE + 2];\n    if (format != 0x41) {\n        fprintf(stderr, \"ERROR: validation failed, format specifier in directory (0x%02x) does not specify 1541 (0x41)\\n\", format);\n        exit(-1);\n    }\n    /* check each directory entry and set block allocation table */\n    atab[linear_sector(type, dirtrack(type), 0)] = ALLOCATED;\n    unsigned int dt = dirtrack(type);\n    int dirsector = 1;\n    unsigned int start_track = 1;\n    while (start_track != 0) {\n        atab[linear_sector(type, dt, dirsector)] = ALLOCATED;\n        int dirblock = linear_sector(type, dt, dirsector) * BLOCKSIZE;\n        for (int direntry = 0; direntry < DIRENTRIESPERBLOCK; direntry++) {\n            int entryOffset = direntry * DIRENTRYSIZE;\n            int filetype = image[dirblock + entryOffset + FILETYPEOFFSET] & 0xf;\n            if (filetype > 4) {\n                fprintf(stderr, \"ERROR: validation failed, illegal file type (0x%02x) in directory\\n\", filetype);\n                exit(-1);\n            }\n            if (filetype != 0) { /* skip deleted entries */\n                start_track = image[dirblock + entryOffset + FILETRACKOFFSET];\n                int start_sector = image[dirblock + entryOffset + FILESECTOROFFSET];\n                if (start_track == 0 || start_track > image_num_tracks(type)) {\n                    fprintf(stderr, \"ERROR: validation failed, illegal track reference (%u) in directory\\n\", start_track);\n                    exit(-1);\n                }\n                if (start_sector >= num_sectors(type, start_track)) {\n                    fprintf(stderr, \"ERROR: validation failed, illegal sector reference (track %u, sector %d) in directory\\n\", start_track, start_sector);\n                    exit(-1);\n                }\n                if (atab[linear_sector(type, start_track, start_sector)] == ALLOCATED) {\n                    fprintf(stderr, \"ERROR: validation failed, file starts in the middle of another file (track %u, sector %d)\\n\", start_track, start_sector);\n                    exit(-1);\n                }\n                if (atab[linear_sector(type, start_track, start_sector)] != FILESTART) { /* loop files are allowed */\n                    unsigned int error_track;\n                    int error_sector;\n                    int result = validate_sector_chain(type, image, atab, start_track, start_sector, &error_track, &error_sector);\n                    switch(result) {\n                    case ILLEGAL_TRACK:\n                        fprintf(stderr, \"ERROR: validation failed, illegal track reference in file sector chain at track %d, sector %d\\n\", error_track, error_sector);\n                        exit(-1);\n                    case ILLEGAL_SECTOR:\n                        fprintf(stderr, \"ERROR: validation failed, illegal sector reference in file sector chain at track %d, sector %d\\n\", error_track, error_sector);\n                        exit(-1);\n                    case LOOP:\n                        fprintf(stderr, \"ERROR: validation failed, loop in file sector chain at track %d, sector %d\\n\", error_track, error_sector);\n                        exit(-1);\n                    case COLLISION:\n                    case CHAINED:\n                        fprintf(stderr, \"ERROR: validation failed, collision with existing file in file sector chain at track %d, sector %d\\n\", error_track, error_sector);\n                        exit(-1);\n                    }\n                    atab[linear_sector(type, start_track, start_sector)] = FILESTART;\n                }\n            }\n        }\n        dt = image[dirblock + TRACKLINKOFFSET];\n        dirsector = image[dirblock + SECTORLINKOFFSET];\n        if (dt == 0) {\n            break;\n        }\n    }\n    /* check BAM for consistency with block allocation table */\n    for (unsigned int t = 1; t <= image_num_tracks(type); t++) {\n        unsigned char* bitmap = image + get_bam_offset(type, t);\n        int num_free = 0;\n        for (int s = 0; s < num_sectors(type, t); s++) {\n            int atab_used = (atab[linear_sector(type, t, s)] != UNALLOCATED);\n            int bam_used = ((bitmap[s >> 3] & (1 << (s & 7))) == 0);\n            num_free += (1 - bam_used);\n            if (bam_used != atab_used) {\n                fprintf(stderr, \"ERROR: validation failed, BAM (%s) is not consistent with files (%s) for track %u sector %d\\n\", bam_used ? \"used\" : \"free\", atab_used ? \"used\" : \"free\", t, s);\n                exit(-1);\n            }\n        }\n        if (*(bitmap - 1) != num_free) {\n            fprintf(stderr, \"ERROR: validation failed, BAM number of free blocks (%d) is not consistent with bitmap (%#02x%#02x%#02x) for track %u\\n\", *(bitmap - 1), *bitmap, *(bitmap + 1), *(bitmap + 2), t);\n            exit(-1);\n        }\n    }\n    free(atab);\n    if(!quiet) {\n        fprintf(stderr, \"CBM DOS validation passed\\n\");\n    }\n}\n\nint\nmain(int argc, char* argv[])\n{\n    imagefile files[MAXNUMFILES_D81];\n    memset(files, 0, sizeof files);\n\n    image_type type = IMAGE_D64;\n    char* imagepath = NULL;\n    char* filename_g64 = NULL;\n    unsigned char* header  = (unsigned char*)\"cc1541\";\n    unsigned char* id      = (unsigned char*)\"00 2a\";\n    int dirtracksplit = 1;\n    int usedirtrack = 0;\n    unsigned int shadowdirtrack = 0;\n\n    int default_first_sector_new_track = 0;\n    int first_sector_new_track = 0;\n    int defaultSectorInterleave = 10;\n    int sectorInterleave = 0;\n    int dir_sector_interleave = 3;\n    int numdirblocks = 2;\n    int nrSectorsShown = -1;\n    unsigned char* filename = NULL;\n    int set_header = 0;\n    int nooverwrite = 0;\n    int dovalidate = 0;\n    int restore_level = -1;\n    int ignore_collision = 0;\n    int filetype = 0x82; /* default is closed PRG */\n    bool filetype_set = false;\n    bool print_art_commandline = false;\n\n    /* flags to detect illegal settings for Transwarp or D81 */\n    int transwarp_set = 0;\n    int sector_interleave_set = 0;\n    int default_sector_interleave_set = 0;\n    int file_start_sector_set = 0;\n    int new_track_start_sector_set = 0;\n\n    int retval = 0;\n\n    int i, j;\n\n    if (argc == 1 || strcmp(argv[argc-1], \"-h\") == 0) {\n        usage();\n    }\n    for (j = 1; j < argc - 1; j++) {\n        if (strcmp(argv[j], \"-n\") == 0) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -n\\n\");\n                return -1;\n            }\n            header = (unsigned char*)argv[++j];\n            set_header = 1;\n            modified = 1;\n        } else if (strcmp(argv[j], \"-i\") == 0) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -i\\n\");\n                return -1;\n            }\n            id = (unsigned char*)argv[++j];\n            set_header = 1;\n            modified = 1;\n        } else if (strcmp(argv[j], \"-M\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &max_hash_length)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -M\\n\");\n                return -1;\n            }\n            if ((max_hash_length < 1) || (max_hash_length > FILENAMEMAXSIZE)) {\n                fprintf(stderr, \"ERROR: Hash computation maximum filename length %d specified\\n\", max_hash_length);\n                return -1;\n            }\n        } else if (strcmp(argv[j], \"-m\") == 0) {\n            ignore_collision = 1;\n        } else if (strcmp(argv[j], \"-F\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &first_sector_new_track)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -F\\n\");\n                return -1;\n            }\n            new_track_start_sector_set = 1;\n        } else if (strcmp(argv[j], \"-S\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &defaultSectorInterleave)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -S\\n\");\n                return -1;\n            }\n            default_sector_interleave_set = 1;\n        } else if (strcmp(argv[j], \"-s\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &sectorInterleave)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -s\\n\");\n                return -1;\n            }\n            sector_interleave_set = 1;\n        } else if (strcmp(argv[j], \"-f\") == 0) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -f\\n\");\n                return -1;\n            }\n            filename = (unsigned char*)argv[++j];\n        } else if (strcmp(argv[j], \"-e\") == 0) {\n            files[num_files].mode |= MODE_SAVETOEMPTYTRACKS;\n        } else if (strcmp(argv[j], \"-E\") == 0) {\n            files[num_files].mode |= MODE_FITONSINGLETRACK;\n        } else if (strcmp(argv[j], \"-r\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &i)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -r\\n\");\n                return -1;\n            }\n            if ((i < 1) || (((i << MODE_MIN_TRACK_SHIFT) & MODE_MIN_TRACK_MASK) != (i << MODE_MIN_TRACK_SHIFT))) {\n                fprintf(stderr, \"ERROR: Invalid minimum track %d specified\\n\",  i);\n                return -1;\n            }\n            files[num_files].mode = (files[num_files].mode & ~MODE_MIN_TRACK_MASK) | (i << MODE_MIN_TRACK_SHIFT);\n        } else if (strcmp(argv[j], \"-b\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &i)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -b\\n\");\n                return -1;\n            }\n            if ((i < 0) || (i >= num_sectors(type, 1))) {\n                fprintf(stderr, \"ERROR: Invalid beginning sector %d specified\\n\", i);\n                return -1;\n            }\n            files[num_files].mode = (files[num_files].mode & ~MODE_BEGINNING_SECTOR_MASK) | (i + 1);\n            file_start_sector_set = 1;\n        } else if (strcmp(argv[j], \"-c\") == 0) {\n            files[num_files].mode |= MODE_SAVECLUSTEROPTIMIZED;\n        } else if (strcmp(argv[j], \"-o\") == 0) {\n            nooverwrite = 1;\n        } else if (strcmp(argv[j], \"-V\") == 0) {\n            dovalidate = 1;\n        } else if (strcmp(argv[j], \"-T\") == 0) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -T\\n\");\n                return -1;\n            }\n            if (strcmp(argv[j + 1], \"DEL\") == 0) {\n                filetype = (filetype & 0xf0) | FILETYPEDEL;\n            } else if (strcmp(argv[j + 1], \"SEQ\") == 0) {\n                filetype = (filetype & 0xf0) | FILETYPESEQ;\n            } else if (strcmp(argv[j + 1], \"PRG\") == 0) {\n                filetype = (filetype & 0xf0) | FILETYPEPRG;\n            } else if (strcmp(argv[j + 1], \"USR\") == 0) {\n                filetype = (filetype & 0xf0) | FILETYPEUSR;\n            } else if (strcmp(argv[j + 1], \"REL\") == 0) {\n                filetype = (filetype & 0xf0) | FILETYPEREL;\n            } else {\n                char* dummy;\n                filetype = strtol(argv[j + 1], &dummy, 10);\n                if(dummy == argv[j + 1] || *dummy != 0 || filetype < 0 || filetype > 255) {\n                    fprintf(stderr, \"ERROR: Error parsing argument for -T\\n\");\n                    return -1;\n                }\n            }\n            filetype_set = true;\n            j++;\n        } else if (strcmp(argv[j], \"-O\") == 0) {\n            filetype &= 0x7f;\n        } else if (strcmp(argv[j], \"-P\") == 0) {\n            filetype |= 0x40;\n        } else if (strcmp(argv[j], \"-N\") == 0) {\n            files[num_files].force_new = 1;\n        } else if (strcmp(argv[j], \"-K\") == 0) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -K\\n\");\n                return -1;\n            }\n            evalhexescape((unsigned char *) argv[++j], files[num_files].key, TRANSWARPKEYSIZE, 0);\n            files[num_files].have_key = true;\n        } else if ((strcmp(argv[j], \"-w\") == 0)\n                   || (strcmp(argv[j], \"-W\") == 0)) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for %s\\n\", argv[j]);\n                return -1;\n            }\n            files[num_files].alocalname = (unsigned char*)argv[j + 1];\n            if (filename == NULL) {\n                ascii2petscii(basename(files[num_files].alocalname), files[num_files].pfilename, FILENAMEMAXSIZE); /* do not eval escapes when converting the filename, as the local filename could contain the escape char */\n            } else {\n                evalhexescape(filename, files[num_files].pfilename, FILENAMEMAXSIZE, FILENAMEEMPTYCHAR);\n            }\n            files[num_files].sectorInterleave = sectorInterleave ? sectorInterleave : defaultSectorInterleave;\n            files[num_files].first_sector_new_track = first_sector_new_track;\n            files[num_files].nrSectorsShown = nrSectorsShown;\n            files[num_files].filetype = filetype;\n            files[num_files].direntryindex = -1;\n\n            if (strcmp(argv[j], \"-W\") == 0) {\n                transwarp_set = true;\n                if(!filetype_set && files[num_files].have_key) {\n                    files[num_files].filetype = (filetype & 0xf0) | FILETYPEUSR | FILETYPETRANSWARPMASK;\n                } else {\n                    files[num_files].filetype = filetype | FILETYPETRANSWARPMASK;\n                }\n                files[num_files].sectorInterleave = 1;\n            }\n\n            first_sector_new_track = default_first_sector_new_track;\n            filename = NULL;\n            sectorInterleave = 0;\n            nrSectorsShown = -1;\n            filetype = 0x82;\n            filetype_set = false;\n            num_files++;\n            modified = 1;\n            j++;\n        } else if (strcmp(argv[j], \"-l\") == 0) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -l\\n\");\n                return -1;\n            }\n            files[num_files].alocalname = (unsigned char*)argv[j + 1];\n            evalhexescape(files[num_files].alocalname, files[num_files].plocalname, FILENAMEMAXSIZE, FILENAMEEMPTYCHAR);\n            if (filename == NULL) {\n                fprintf(stderr, \"ERROR: Loop files require a filename set with -f\\n\");\n                return -1;\n            }\n            evalhexescape(filename, files[num_files].pfilename, FILENAMEMAXSIZE, FILENAMEEMPTYCHAR);\n            if(memcmp(files[num_files].pfilename, files[num_files].plocalname, FILENAMEMAXSIZE) == 0 && !files[num_files].force_new) {\n                fprintf(stderr, \"ERROR: Loop file cannot have the same name as the file they refer to, unless with -N\\n\");\n                return -1;\n            }\n            files[num_files].mode |= MODE_LOOPFILE;\n            files[num_files].sectorInterleave = 0;\n            files[num_files].first_sector_new_track = first_sector_new_track;\n            first_sector_new_track = default_first_sector_new_track;\n            files[num_files].nrSectorsShown = nrSectorsShown;\n            files[num_files].filetype = filetype;\n            files[num_files].direntryindex = -1;\n            filename = NULL;\n            sectorInterleave = 0;\n            nrSectorsShown = -1;\n            filetype = 0x82;\n            filetype_set = false;\n            num_files++;\n            modified = 1;\n            j++;\n        } else if (strcmp(argv[j], \"-L\") == 0) {\n            if (filename == NULL) {\n                fprintf(stderr, \"ERROR: Writing no file using -L requires disk filename set with -f\\n\");\n                return -1;\n            }\n            evalhexescape(filename, files[num_files].pfilename, FILENAMEMAXSIZE, FILENAMEEMPTYCHAR);\n            files[num_files].nrSectorsShown = nrSectorsShown;\n            files[num_files].filetype = filetype;\n            files[num_files].direntryindex = -1;\n            files[num_files].mode |= MODE_NOFILE;\n\n            first_sector_new_track = default_first_sector_new_track;\n            filename = NULL;\n            sectorInterleave = 0;\n            nrSectorsShown = -1;\n            filetype = 0x82;\n            filetype_set = false;\n            num_files++;\n            modified = 1;\n        } else if (strcmp(argv[j], \"-x\") == 0) {\n            dirtracksplit = 0;\n        } else if (strcmp(argv[j], \"-t\") == 0) {\n            usedirtrack = 1;\n        } else if (strcmp(argv[j], \"-d\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%u\", &shadowdirtrack)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -d\\n\");\n                return -1;\n            }\n            modified = 1;\n        } else if (strcmp(argv[j], \"-u\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &numdirblocks)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -u\\n\");\n                return -1;\n            }\n        } else if (strcmp(argv[j], \"-B\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &nrSectorsShown)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -B\\n\");\n                return -1;\n            }\n            if (nrSectorsShown < 0 || nrSectorsShown > 65535) {\n                fprintf(stderr, \"ERROR: Argument must be between 0 and 65535 for -B\\n\");\n                return -1;\n            }\n        } else if (strcmp(argv[j], \"-4\") == 0) {\n            type = IMAGE_D64_EXTENDED_SPEED_DOS;\n            modified = 1;\n        } else if (strcmp(argv[j], \"-R\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &restore_level)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -R\\n\");\n                return -1;\n            }\n            if(restore_level < 0 || restore_level > 5) {\n                fprintf(stderr, \"ERROR: Argument must be between 0 and 5 for -R\\n\");\n                return -1;\n            }\n        } else if (strcmp(argv[j], \"-5\") == 0) {\n            type = IMAGE_D64_EXTENDED_DOLPHIN_DOS;\n            modified = 1;\n        } else if (strcmp(argv[j], \"-a\") == 0) {\n            print_art_commandline = true;\n        } else if(strcmp(argv[j], \"-g\") == 0) {\n            if (argc < j + 2) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -g\\n\");\n                return -1;\n            }\n            filename_g64 = argv[++j];\n        } else if (strcmp(argv[j], \"-U\") == 0) {\n            if ((argc < j + 2) || !sscanf(argv[++j], \"%d\", &unicode)) {\n                fprintf(stderr, \"ERROR: Error parsing argument for -U\\n\");\n                return -1;\n            }\n            if(unicode < 0 || unicode > 2) {\n                fprintf(stderr, \"ERROR: Argument must be between 0 and 2 for -U\\n\");\n                return -1;\n            }\n        } else if (strcmp(argv[j], \"-q\") == 0) {\n            quiet = 1;\n        } else if (strcmp(argv[j], \"-v\") == 0) {\n            verbose = 1;\n        } else if (strcmp(argv[j], \"-h\") == 0) {\n            usage();\n        } else {\n            fprintf(stderr, \"ERROR: Error parsing command line at \\\"%s\\\"\\n\", argv[j]);\n            printf(\"Use -h for help.\\n\");\n            return -1;\n        }\n    }\n    if (j >= argc) {\n        fprintf(stderr, \"ERROR: No image file provided, or misparsed last option\\n\");\n        return -1;\n    }\n    imagepath = argv[argc-1];\n\n    if (strlen(imagepath) >= 4) {\n        if (strcmp(imagepath + strlen(imagepath) - 4, \".d71\") == 0) {\n            if ((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) {\n                fprintf(stderr, \"ERROR: Extended .d71 images are not supported\\n\");\n                return -1;\n            }\n            type = IMAGE_D71;\n        } else if (strcmp(imagepath + strlen(imagepath) - 4, \".d81\") == 0) {\n            if ((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) {\n                fprintf(stderr, \"ERROR: Extended .d81 images are not supported\\n\");\n                return -1;\n            }\n            type = IMAGE_D81;\n            dir_sector_interleave = 1;\n        }\n    }\n\n    if(shadowdirtrack > image_num_tracks(type) || (int)shadowdirtrack == dirtrack(type) || (type == IMAGE_D71 && (int)shadowdirtrack == dirtrack(type) + D64NUMTRACKS)) {\n        fprintf(stderr, \"ERROR: Invalid shadow directory track\\n\");\n        return -1;\n    }\n\n    if (type != IMAGE_D64) {\n        if (transwarp_set\n                && (type != IMAGE_D64_EXTENDED_SPEED_DOS)\n                && (type != IMAGE_D64_EXTENDED_DOLPHIN_DOS)) {\n            fprintf(stderr, \"ERROR: Transwarp encoding is not supported for non-D64 images\\n\");\n            return -1;\n        }\n\n        if (filename_g64 != NULL) {\n            fprintf(stderr, \"ERROR: G64 output is only supported for non-extended D64 images\\n\");\n            return -1;\n        }\n    }\n\n    /* Check for unsupported settings for D81 */\n    if (type == IMAGE_D81) {\n        if (default_sector_interleave_set) {\n            fprintf(stderr, \"ERROR: -S is not supported for D81 images\\n\");\n            return -1;\n        }\n        if (sector_interleave_set) {\n            fprintf(stderr, \"ERROR: -s is not supported for D81 images\\n\");\n            return -1;\n        }\n        if (new_track_start_sector_set) {\n            fprintf(stderr, \"ERROR: -F is not supported for D81 images\\n\");\n            return -1;\n        }\n        if (file_start_sector_set) {\n            fprintf(stderr, \"ERROR: -b is not supported for D81 images\\n\");\n            return -1;\n        }\n    }\n\n    /* Change locale from C to default to allow unicode printouts */\n    if(unicode != 0) {\n        setlocale(LC_ALL, \"\");\n    }\n\n    /* quiet has precedence over verbose */\n    if(quiet) {\n        verbose = 0;\n    }\n\n    /* open image */\n    unsigned int imagesize = image_size(type);\n    unsigned char* image = (unsigned char*)calloc(imagesize, sizeof(unsigned char));\n    if (image == NULL) {\n        fprintf(stderr, \"ERROR: Memory allocation error\\n\");\n        return -1;\n    }\n    FILE* f = fopen(imagepath, \"rb\");\n    if (f == NULL) {\n        modified = 1;\n        if (!quiet) {\n            printf(\"Adding %d files to new image %s\\n\", num_files, basename((unsigned char*)imagepath));\n        }\n        initialize_directory(type, image, header, id, shadowdirtrack);\n    } else {\n        if (!quiet) {\n            printf(\"Adding %d files to existing image %s\\n\", num_files, basename((unsigned char*)imagepath));\n        }\n        size_t read_size = fread(image, 1, imagesize, f);\n        fclose(f);\n        if (read_size != imagesize) {\n            if (((type == IMAGE_D64_EXTENDED_SPEED_DOS) || (type == IMAGE_D64_EXTENDED_DOLPHIN_DOS)) && (read_size == D64SIZE)) {\n                /* Clear extra tracks */\n                memset(image + image_size(IMAGE_D64), 0, image_size(type) - image_size(IMAGE_D64));\n\n                /* Mark all extra sectors unused */\n                for (unsigned int t = D64NUMTRACKS + 1; t <= image_num_tracks(type); t++) {\n                    for (int s = 0; s < num_sectors(type, t); s++) {\n                        mark_sector(type, image, t, s, 1 /* free */);\n                    }\n                }\n            } else {\n                fprintf(stderr, \"ERROR: Wrong filesize: expected to read %u bytes, but read %u bytes\\n\", imagesize, (unsigned int) read_size);\n                return -1;\n            }\n        }\n        if (dovalidate) {\n            validate(type, image);\n        }\n        if (restore_level >= 0) {\n            restore(type, image, restore_level, files);\n        }\n        if (set_header) {\n            update_directory(type, image, header, id, shadowdirtrack);\n        }\n    }\n\n    /* Print command line before adding anything to the image */\n    if(print_art_commandline) {\n        convert_to_commandline(type, image);\n    }\n\n    /* Create directory entries */\n    create_dir_entries(type, image, files, num_files, dir_sector_interleave, shadowdirtrack, nooverwrite);\n\n    /* Write files and mark sectors in BAM */\n    write_files(type, image, files, num_files, usedirtrack, dirtracksplit, shadowdirtrack, numdirblocks, dir_sector_interleave);\n\n    /* Print allocation info */\n    if (verbose) {\n        print_file_allocation(type, image, files, num_files);\n    }\n    int blocks_free = check_bam(type, image);\n\n    /* Print directory */\n    if (!quiet) {\n        print_directory(type, image, blocks_free);\n    }\n\n    /* Show directory issues if present */\n    if(dir_error != DIR_OK) {\n        fprintf(stdout, \"WARNING: %s\\n\", dir_error_string[dir_error]);\n    }\n\n    /* Save image */\n    if(modified) {\n        f = fopen(imagepath, \"wb\");\n        if (f == NULL || fwrite(image, imagesize, 1, f) != 1) {\n            fprintf(stderr, \"ERROR: Failed to write %s\\n\", imagepath);\n            retval = -1;\n        }\n        if (f != NULL) {\n            fclose(f);\n        }\n    }\n\n    /* Save optional g64 image */\n    if (filename_g64 != NULL) {\n        /* retval might be set to -1 already.  Thus we need to take its\n        previous state and OR it with the following return value. */\n        retval |= generate_uniformat_g64(image, filename_g64);\n    }\n\n    if (!ignore_collision && check_hashes(type, image)) {\n        fprintf(stderr, \"\\nERROR: Filename hash collision detected, image is not compatible with Krill's Loader. Use -m to ignore this error.\\n\");\n        retval = -1;\n    }\n\n    free(image);\n\n    return retval;\n}\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/COPYING",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year  name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/ChangeLog",
    "content": "Mon Oct 30 21:09:52 2006  Christian Groessler  <chris@groessler.org>\n\n\t* blockop.c (dos_bios_write): implemented\n\t* version.h: version updated to 0.61\n\nMon Oct 19 20:41:32 2006  Christian Groessler  <chris@groessler.org>\n\n\t* Makefile: add support for compiling with djgpp.\n\t* blockop.c (read_phys_block, write_phys_block): add DOS support.\n\t(cleanup_int1e, setup_int1e, blkno_to_chs, dos_bios_read):\n\timplemented for DOS support.\n\t* imgopen.c (open_img_rw, open_img_ro, open_img_new): add DOS\n\tsupport.\n\t(is_dos_drive): implemented for DOS support.\n\tmain.c (main): add DOS support.\n\nWed Oct 18 22:08:28 2006  Christian Groessler  <chris@groessler.org>\n\n\t* rwserv.c (do_rm): more than one file to delete can be\n\tspecified.\n\t* version.h: version updated to 0.60\n\nWed Jul 12 00:19:36 2006  Christian Groessler  <cpg@aladdin.de>\n\n\t* Makefile: fix dependencies for main.o, roserv.o, and rwserv.o.\n\t* roserv.c (do_get, do_mget): close files after usage.\n\t* rwserv.c (do_put_one_file): ditto.\n\t* cmdopts.h, main.c, roprotos.h, roserv.c: add \"lsl\" command line\n\tparameter.\n\nWed Apr  5 20:28:36 2006  Christian Groessler  <cpg@aladdin.de>\n\n\t* util.c (get_file): skip remaining extents if file is already\n\tcompletely written.  add a debug message\n\t* main.c (main): add support for mget and mput commands\n\t* roserv.c (do_mget): implemented\n\t* rwprotos.h: add do_mget prototype\n\t* rwserv.c (do_put_one_file, do_put): rename do_put to\n\tdo_put_one_file and change argments.  implement new do_put which\n\tuses do_put_one_file.\n\t(do_mput): implemented\n\t* version.h: version updated to 0.59\n\nFri Jan 16 21:39:26 2004  Christian Groessler  <cpg@aladdin.de>\n\n\t* Makefile: add MacOS-X/Darwin CFLAGS\n\t* blockop.c (read_file_block, write_file_block): skip 0x10 blocks\n\tat block 0x200, not 0x201\n\t* main.c, rwserv.c, util.c: fix/add debug messages\n\t* version.h: version updated to 0.58\n\nFri Nov 23 02:17:37 2001  Christian Groessler  <cpg@aladdin.de>\n\n\t* blockop.c: included stdlib.h to suppress warning\n\t* main.c: use COPYRIGHT_STRING from version.h\n\t* version.h: COPYRIGHT_STRING added.  version updated to 0.57\n\nMon Nov 19 01:40:59 2001  Christian Groessler  <cpg@aladdin.de>\n\n\t* pcosdir.h: add volname to disk_header structure\n\t* roserv.c (do_ls): display volume label if present\n\t* rwserv.c (do_new): remove paths in generated PCOS file names\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/Makefile",
    "content": "# $Id: Makefile,v 1.22 2006/10/30 20:18:25 chris Exp $\n#\n# Makefile for\n# Olivetti M20 PCOS diskette access utility\n# Copyright (C) 2000,2001,2004,2006 by Christian Groessler\n#\n# This program is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License\n# as published by the Free Software Foundation; either version 2\n# of the License, or (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; see the file COPYING.  If not, write\n# to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n# Boston, MA 02110-1301, USA.\n\nCC = cc\n#CC = i386-go32-gcc\n#E = .exe\n# currently, the -DLINUX, -DNETBSD, etc. defines aren't really used in the code\n# these switches are for Linux/x86\n# CFLAGS = -O2 -DUNIX -DLINUX -D__32BIT__ -DCPG_LITTLE_ENDIAN -Wall -Wstrict-prototypes # -DDEBUG\n\nCFLAGS = -O2 -w -DUNIX -DLINUX -D__32BIT__ -DCPG_LITTLE_ENDIAN\n\n\n# these switches are for Linux/ia64 or Linux/alpha\n#CFLAGS = -O2 -DUNIX -DLINUX -D__64BIT__ -DCPG_LITTLE_ENDIAN -Wall -Wstrict-prototypes\n# these switches are for Linux/ppc\n#CFLAGS = -O2 -DUNIX -DLINUX -D__32BIT__ -DCPG_BIG_ENDIAN -Wall -Wstrict-prototypes\n# these switches are for Darwin/ppc\n#CFLAGS = -O2 -DUNIX -DMACOSX -D__32BIT__ -DCPG_BIG_ENDIAN -Wall -Wstrict-prototypes # -DDEBUG\n# these switches are for NetBSD/i386\n#CFLAGS = -O2 -DUNIX -DNETBSD -D__32BIT__ -DCPG_LITTLE_ENDIAN -Wall -Wstrict-prototypes\n# these switches are for FreeBSD/i386\n#CFLAGS = -O2 -DUNIX -DFREEBSD -D__32BIT__ -DCPG_LITTLE_ENDIAN -Wall -Wstrict-prototypes\n# these switches are for DJGPP\n#CFLAGS = -O2 -DDOS -D__32BIT__ -DCPG_LITTLE_ENDIAN -Wall -Wstrict-prototypes # -DDEBUG\n\nall: m20$E\n\nclean:\n\trm -f m20 m20$E main.o core roserv.o imgopen.o blockop.o util.o rwserv.o\n\nm20$E: main.o util.o roserv.o imgopen.o blockop.o rwserv.o\n\t$(CC) $(LDFLAGS) -o $@ main.o util.o roserv.o imgopen.o blockop.o rwserv.o\n\nmain.o: main.c cpgtypes.h pcosdir.h fhdr.h cpgdefs.h packend.h packstrt.h cmdopts.h \\\n\troprotos.h imgopen.h version.h rwprotos.h\n\t$(CC) $(CFLAGS) -c -o $@ main.c\n\nroserv.o: roserv.c roprotos.h pcosdir.h blockop.h cpgtypes.h util.h cpgdefs.h util.h\n\t$(CC) $(CFLAGS) -c -o $@ roserv.c\n\nrwserv.o: rwserv.c rwprotos.h pcosdir.h blockop.h cpgtypes.h util.h cpgdefs.h fhdr.h util.h\n\t$(CC) $(CFLAGS) -c -o $@ rwserv.c\n\nimgopen.o: imgopen.c imgopen.h\n\t$(CC) $(CFLAGS) -c -o $@ imgopen.c\n\nblockop.o: blockop.c blockop.h cpgtypes.h cpgdefs.h\n\t$(CC) $(CFLAGS) -c -o $@ $*.c\n\nutil.o: util.c util.h cpgtypes.h pcosdir.h blockop.h cpgdefs.h fhdr.h\n\t$(CC) $(CFLAGS) -c -o $@ $*.c\n\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/README",
    "content": "$Id: README,v 1.7 2006/10/30 20:21:47 chris Exp $\n\nOlivetti M20 floppy tools, (c) Christian Groessler, chris@groessler.org\n=======================================================================\n\nSee the file COPYING for license details.\n\nThis is a tool to access Olivetti M20 floppies and their images. Reading\nand writing files is supported.\n\n\nInstalling on Linux/x86:\n------------------------\n\ntype \"make\"\nsome files will be compiled, generating a executable called \"m20\"\n\n\nInstalling on other systems:\n----------------------------\n\nedit Makefile and type \"make\"\nI've tried it on Solaris/x86 and it worked, for other systems your\nmileage may vary.\nThis version worked on disk images only, to access real M20 floppies\nyou'll need Linux or NetBSD.\nThe DOS version supports only 40track/360K floppy drives. It does not\nwork with 1.2M drives.\n\n\nOther software that's required:\n-------------------------------\n\nIn order to read and write real M20 floppies, a dd like tool which\nsupports skipping (not by reading and discarding, but by seeking) the\ninput and output files is needed.\nI use sdd by Jrg Schilling <schilling@fokus.gmd.de>, you can find it\non ftp://ftp.fokus.gmd.de/pub/unix/sdd .\n\nfdutils-5.4 for Linux, you can get it from\nftp://metalab.unc.edu/pub/Linux/utils/disk-management/fdutils-5.4.tar.gz\nor the newest version at\nftp://ftp.tux.org/pub/knaff/fdutils\nThe fdutils are needed to access non-standard (e.g. 256 byte sectors)\nfloppies, like those used on the M20.\n\nOn NetBSD, you'll need the patch in PR15199 to access non-standard\nfloppies.\n\n\nReading and writing diskette images\n-----------------------------------\n\nAfter installing fdutils and sdd, you can get an image of an existing\nM20 floppy by issuing the commands\n\n\n# set floppy parameters (here we're using the 2nd drive)\n# do this after inserting the disk into the drive\nsetfdprm /dev/fd1 OLI320\n\n# read diskette image\nsdd iseek=4096 oseek=4096 if=/dev/fd1 of=m20disk.img bs=256 count=1104\n\n\nPlease note that we're skipping the first 4096 bytes of the\nfloppy. These are the blocks of Track 0/Head 0. Track 0/Head 0 is\nformatted in FM mode, which isn't readable by many PC floppy\ncontrollers.\n\nThis is no problem when reading existing M20 floppies as there seems\nnothing important to be stored in this area. I was able to read all\nfiles of a full disk without reading this area.\n\nIt _is_ a problem when creating new disks on the PC as the M20 doesn't\naccept disks where this area is formatted differently. So you cannot\ncreate new M20 disks on the PC.\nWhat is possible is to format the disk on the M20 and then write a\nnew image to it on the PC.\n\nThe command to write a new/modified M20 image to floppy disk is\nsomething like this:\n\n\n# set floppy parameters (here we're using the 2nd drive)\n# do this after inserting the disk into the drive\nsetfdprm /dev/fd1 OLI320\n\n# write image to diskette\nsdd iseek=4096 oseek=4096 of=/dev/fd1 if=m20disk.img bs=256 count=1104\n\n\nIn the time between reading the image and writing the image back\nyou can modify the image's contents with the supplied \"m20\" command :-)\n\n\nUsing the m20 command\n---------------------\n\nIf you start m20 w/o arguments it will print a short usage overview:\n\n\nusage: m20 <image file> <option>\n       option can be one of\n          ls      - list files on image\n          lsl     - verbosely list files on image\n          cat     - show file from image\n          get     - get file from image\n          mget    - get multiple files from image\n          put     - put file onto image\n          mput    - put multiple files onto image\n          rm      - delete file on image\n          new     - create a new empty image\n          version - display program version\n\n\nShort description of the options:\n\nls:\tdisplay contents of image (file names). Only the file names\n\tare listed, one in each line, for easy use with the mget\n\toption.\n\te.g.\n\t\tm20 m20disk.img ls | xargs m20 m20disk.img mget\n\nlsl:\tdisplay contents of image (file names) in a format similar to\n\tthe PCOS vl command.\n\te.g.\n\t\tm20 m20disk.img lsl\n\ncat:\tprint contents of (ascii) file from image\n\te.g.\n\t\tm20 m20disk.img cat file.txt\n\nget:\tget a file from the image (i.e. copy to host file system),\n\toptionally renaming it\n\te.g.\n\t\tm20 m20disk.img get PCOS.SAV\n\t\t(this will copy the PCOS.SAV file from the image to a\n\t\tPCOS.SAV file on the host file system)\n\tor\n\t\tm20 m20disk.img get PCOS.SAV newname.bin\n\t\t(this will copy the PCOS.SAV file from the image to a\n\t\tnewname.bin file on the host file system)\n\nmget:\tget multiple files from the image (i.e. copy to host file\n\tsystem)\n\te.g.\n\t\tm20 m20disk.img get PCOS.SAV file1 file2\n\t\t(this will copy the PCOS.SAV, file1, and file2 files\n\t\tfrom the image to a files with the same name on the\n\t\thost file system)\n\nput:\tput host file onto image, optionally renaming it\n\te.g.\n\t\tm20 m20disk.img put runz.batz\n\t\t(this will copy the file runz.batz onto the image)\n\tor\n\t\tm20 m20disk.img put runz.batz newname.bin\n\t\t(this will copy the file runz.batz onto the image and\n\t\tname it newname.bin there)\n\nmput:\tput host files onto image\n\te.g.\n\t\tm20 m20disk.img put runz.batz file1 file2\n\t\t(this will copy the files runz.batz, file1, and file2\n\t\tonto the image)\n\nrm:\tremove files from image\n\te.g.\n\t\tm20 m20disk.img rm basic.cmd file1 file2\n\t\t(this will delete the files basic.cmd, file1, and\n\t\tfile2 from the image)\n\nnew:\tcreate a fresh empty image (format disk)\n\te.g.\n\t\tm20 newimage.img new\n\t\t(you will have to populate the image with the put\n\t\tcommand)\n\nWhat else?\n----------\n\nNothing I know of. If you have comments/suggestions/etc., please\ncontact me at chris@groessler.org\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/blockop.c",
    "content": "/* $Id: blockop.c,v 1.7 2006/10/30 20:12:04 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: disk block operations\n * Copyright (C) 2000,2004,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <string.h>\n#include \"cpgtypes.h\"\n#include \"blockop.h\"\n\nint read_file_blocks(FILE *disk,int blockno,int numblks,cpg_u8_t *buffer)\n{\n    int err;\n    while(numblks--) {\n        if ((err = read_file_block(disk,blockno,buffer))) {\n            fprintf(stderr,\"read_file_blocks: error %d\\n\",err);\n            exit(55);\n        }\n        blockno++;\n        buffer += 256;\n    }\n    return(0);\n}\n\nint read_phys_blocks(FILE *disk,int blockno,int numblks,cpg_u8_t *buffer)\n{\n    int err;\n    while(numblks--) {\n        if ((err = read_phys_block(disk,blockno,buffer))) {\n            fprintf(stderr,\"read_phys_blocks: error %d\\n\",err);\n            exit(55);\n        }\n        blockno++;\n        buffer += 256;\n    }\n    return(0);\n}\n\nint write_file_blocks(FILE *disk,int blockno,int numblks,cpg_u8_t *buffer)\n{\n    int err;\n    while(numblks--) {\n        if ((err = write_file_block(disk,blockno,buffer))) {\n            fprintf(stderr,\"write_file_blocks: error %d\\n\",err);\n            exit(65);\n        }\n        blockno++;\n        buffer += 256;\n    }\n    return(0);\n}\n\nint write_phys_blocks(FILE *disk,int blockno,int numblks,cpg_u8_t *buffer)\n{\n    int err;\n    while(numblks--) {\n        if ((err = write_phys_block(disk,blockno,buffer))) {\n            fprintf(stderr,\"write_phys_blocks: error %d\\n\",err);\n            exit(65);\n        }\n        blockno++;\n        buffer += 256;\n    }\n    return(0);\n}\n\nint read_file_block(FILE *disk,int blockno,cpg_u8_t *buffer)\n{\n    if (blockno >= 0x200) blockno += 0x10;\n    return(read_phys_block(disk,blockno,buffer));\n}\n\nint write_file_block(FILE *disk,int blockno,cpg_u8_t *buffer)\n{\n    if (blockno >= 0x200) blockno += 0x10;\n    return(write_phys_block(disk,blockno,buffer));\n}\n\n#ifdef DOS\n\n#include <dpmi.h>\n#include <go32.h>\n\nstatic int firstcall = 1;\nstatic __dpmi_raddr oldint1e;\n\nvoid cleanup_int1e(void)\n{\n    __dpmi_set_real_mode_interrupt_vector(0x1e, &oldint1e);\n    /* don't free dosdpbseg since it isn't needed */\n}\n\nstatic void setup_int1e(void)\n{\n    int dosdpbseg, scratch;\n    __dpmi_raddr newint1e;\n    unsigned char xferbuf;\n\n    firstcall = 0;\n\n    /* get old Int 1EH vector */\n    __dpmi_get_real_mode_interrupt_vector(0x1e, &oldint1e);\n#ifdef DEBUG\n    printf(\"old INT 1EH vector: %04X:%04X\\n\", oldint1e.segment, oldint1e.offset16);\n#endif\n\n    /* allocate own disk parameter block in real memory */\n    dosdpbseg = __dpmi_allocate_dos_memory(1, &scratch);\n\n    /* copy the contents (11 bytes, we copy 16 bytes) to our parameter block */\n    movedata(_go32_conventional_mem_selector(), oldint1e.segment * 16 + oldint1e.offset16,\n             _go32_conventional_mem_selector(), dosdpbseg * 16,\n             16);\n\n    /* modify our parameter block for 256 byte sectors and 16 sectors per track */\n    xferbuf = 1;   /* 256 byte sector */\n    dosmemput(&xferbuf, 1, dosdpbseg * 16 + 3);\n    xferbuf = 16;   /* sectors per track */\n    dosmemput(&xferbuf, 1, dosdpbseg * 16 + 4);\n\n    /* point Int 1EH vector to our disk parameter block */\n    newint1e.segment = dosdpbseg;\n    newint1e.offset16 = 0;\n    __dpmi_set_real_mode_interrupt_vector(0x1e, &newint1e);\n#ifdef DEBUG\n    printf(\"new INT 1EH vector: %04X:%04X\\n\", newint1e.segment, newint1e.offset16);\n#endif\n\n    /* restore Int 1EH vector at program exit */\n    atexit(cleanup_int1e);\n}\n\n#define blkno_to_chs(blkno,cyl,head,sec) do { \\\n                                             cyl = blkno / 32; \\\n                                             head = (blkno / 16) & 1; \\\n                                             sec = (blkno % 16) + 1; \\\n                                         } \\\n                                         while (0)\n\nstatic int dos_bios_read(FILE *disk,int blockno,cpg_u8_t *buffer)\n{\n    __dpmi_regs regs;\n    unsigned int drive, cyl, head, sec;\n\n    if (firstcall) setup_int1e();\n\n    /* setup registers and call BIOS Int 13H function 2 (read sectors) */\n\n    drive = (unsigned int)disk;\n    blkno_to_chs(blockno,cyl,head,sec);\n\n#ifdef DEBUG\n    printf(\"reading sector %u (cyl %u, head %u, sec %u)\\n\",\n           blockno,\n           cyl, head, sec);\n#endif\n\n    regs.x.ax = 0x0201;    /* AH: read sectors, AL: # of sectors */\n    regs.h.ch = cyl;       /* CL: low eight bits of cylinder # */\n    regs.h.cl = sec;       /* CH: sector # (bits 0-5), high 2 bits of cylinder # */\n    regs.h.dh = head;      /* DH: head # */\n    regs.h.dl = drive;     /* DL: drive # */\n    regs.x.es = __tb >> 4;\n    regs.x.bx = __tb & 0x0f;\n\n    __dpmi_int(0x13, &regs);  /* call BIOS */\n    if (regs.x.flags & 1) {   /* if carry flag set -> error */\n        fprintf(stderr,\"dos_bios_read: BIOS call failed: status code: 0x%02x\\n\",regs.h.ah);\n        exit(51);\n    }\n\n    /* copy sector data to return buffer */\n    dosmemget((__tb >> 4) * 16 + (__tb & 0x0f), 256, buffer);\n\n    return(0);\n}\n\nstatic int dos_bios_write(FILE *disk,int blockno,cpg_u8_t *buffer)\n{\n    __dpmi_regs regs;\n    unsigned int drive, cyl, head, sec;\n\n    if (firstcall) setup_int1e();\n\n    /* setup registers and call BIOS Int 13H function 3 (write sectors) */\n\n    drive = (unsigned int)disk;\n    blkno_to_chs(blockno,cyl,head,sec);\n\n    /* copy sector data to realmode buffer */\n    dosmemput(buffer, 256, (__tb >> 4) * 16 + (__tb & 0x0f));\n\n#ifdef DEBUG\n    printf(\"writing sector %u (cyl %u, head %u, sec %u)\\n\",\n           blockno,\n           cyl, head, sec);\n#endif\n\n    regs.x.ax = 0x0301;    /* AH: write sectors, AL: # of sectors */\n    regs.h.ch = cyl;       /* CL: low eight bits of cylinder # */\n    regs.h.cl = sec;       /* CH: sector # (bits 0-5), high 2 bits of cylinder # */\n    regs.h.dh = head;      /* DH: head # */\n    regs.h.dl = drive;     /* DL: drive # */\n    regs.x.es = __tb >> 4;\n    regs.x.bx = __tb & 0x0f;\n\n    __dpmi_int(0x13, &regs);  /* call BIOS */\n    if (regs.x.flags & 1) {   /* if carry flag set -> error */\n        fprintf(stderr,\"dos_bios_write: BIOS call failed: status code: 0x%02x\\n\",regs.h.ah);\n        exit(61);\n    }\n\n    return(0);\n}\n\n#endif\n\nint read_phys_block(FILE *disk,int blockno,cpg_u8_t *buffer)\n{\n    if (blockno > 0x460) {\n        fprintf(stderr,\"read_phys_block: access outa bounds - block %d\\n\",blockno);\n        exit(50);\n    }\n#ifdef DOS\n    if ((unsigned int)disk < 'Z' - 'A')\n        return(dos_bios_read(disk,blockno,buffer));\n#endif\n    if (fseek(disk,blockno * 256,SEEK_SET)) {\n        fprintf(stderr,\"read_phys_block: fseek failed: %s\\n\",strerror(errno));\n        exit(51);\n    }\n    if (fread(buffer,256,1,disk) != 1) {\n        fprintf(stderr,\"read_phys_block: fread failed %s\\n\",strerror(errno));\n        exit(52);\n    }\n    return(0);\n}\n\nint write_phys_block(FILE *disk,int blockno,cpg_u8_t *buffer)\n{\n    if (blockno > 0x460) {\n        fprintf(stderr,\"write_phys_block: access outa bounds - block %d\\n\",blockno);\n        exit(60);\n    }\n#ifdef DOS\n    if ((unsigned int)disk < 'Z' - 'A')\n        return(dos_bios_write(disk,blockno,buffer));\n#endif\n    if (fseek(disk,blockno * 256,SEEK_SET)) {\n        fprintf(stderr,\"write_phys_block: fseek failed: %s\\n\",strerror(errno));\n        exit(61);\n    }\n    if (fwrite(buffer,256,1,disk) != 1) {\n        fprintf(stderr,\"write_phys_block: fwrite failed %s\\n\",strerror(errno));\n        exit(62);\n    }\n    return(0);\n}\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/blockop.h",
    "content": "/* $Id: blockop.h,v 1.3 2006/04/05 18:55:00 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: disk block public functions\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __BLOCKOP_H__\n#define __BLOCKOP_H__\n\nextern int read_file_block(FILE *,int,cpg_u8_t *);\nextern int read_phys_block(FILE *,int,cpg_u8_t *);\nextern int write_file_block(FILE *,int,cpg_u8_t *);\nextern int write_phys_block(FILE *,int,cpg_u8_t *);\nextern int read_file_blocks(FILE *,int,int,cpg_u8_t *);\nextern int read_phys_blocks(FILE *,int,int,cpg_u8_t *);\nextern int write_file_blocks(FILE *,int,int,cpg_u8_t *);\nextern int write_phys_blocks(FILE *,int,int,cpg_u8_t *);\n\n#endif /* #ifndef __BLOCKOP_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/cmdopts.h",
    "content": "/* $Id: cmdopts.h,v 1.6 2006/07/11 22:22:31 chris Exp $\n *\n * PCOS diskette access utility command line option defines\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __CMDOPTS_H__\n#define __CMDOPTS_H__\n\n#define LS_OPTION      10\n#define LSL_OPTION     11\n#define CAT_OPTION     12\n#define GET_OPTION     13\n#define MGET_OPTION    14\n#define PUT_OPTION     15\n#define MPUT_OPTION    16\n#define DEL_OPTION     17\n#define NEW_OPTION     18\n#define VERSION_OPTION 19\n\n#endif /* #ifndef __CMDOPTS_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/cpgdefs.h",
    "content": "/* $Id: cpgdefs.h,v 1.7 2006/04/05 18:55:00 chris Exp $\n *\n * CPG's compiler independence and miscellaneous defines\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __CPGDEFS_H__\n#define __CPGDEFS_H__\n\n#ifdef SALFORD\n#  define ALIGN_ 8\n#endif\n\n#ifndef ALIGN_\n#  define ALIGN_\n#endif\n\n#ifdef __GNUC__\n#  if ((__GNUC__==2) && (__GNUC_MINOR__>=7)) || (__GNUC__>2)\n#  define ALIGN_2 __attribute__ ((packed))\n#  define _NEWGNUC_\n#  endif\n#  define CPG_INLINE __inline__\n#endif\n\n#ifdef __WATCOMC__\n#  define WPACK _Packed\n#endif\n\n#ifndef ALIGN_2\n#  define ALIGN_2\n#endif\n\n#ifndef WPACK\n#  define WPACK\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER >= 900)\n#  define _NEWMSC_\n#endif\n\n#ifndef CPG_INLINE\n#  define CPG_INLINE\n#endif\n\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#ifdef CPG_LITTLE_ENDIAN\n\n#define READBE16(a) ((*(cpg_u8_t *)(a))<<8)|(*(((cpg_u8_t *)(a))+1))\n#define READBE32(a) ((*(cpg_u8_t *)(a))<<24)|(*(((cpg_u8_t *)(a))+1)<<16)|(*(((cpg_u8_t *)(a))+2)<<8)|(*(((cpg_u8_t *)(a))+3))\n#define WRITEBE16(a,v) do { \\\n                     cpg_u8_t *h = (cpg_u8_t *)(a); \\\n                     *h = (v)>>8; \\\n                     *(h+1) = v; } while (0)\n\n#define WRITEBE32(a,v) do { \\\n                     cpg_u8_t *h = (cpg_u8_t *)(a); \\\n                     *h = (v)>>24; \\\n                     *(h+1) = (v)>>16; \\\n                     *(h+2) = (v)>>8; \\\n                     *(h+3) = v; } while (0)\n\n#endif\n\n#ifdef CPG_BIG_ENDIAN\n\n#define READBE16(a) (*(a))\n#define READBE32(a) (*(a))\n#define WRITEBE16(a,v) (*(a)=(v))\n#define WRITEBE32(a,v) (*(a)=(v))\n\n#endif\n\n#endif /* #ifndef __CPGDEFS_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/cpgtypes.h",
    "content": "/* $Id: cpgtypes.h,v 1.4 2006/04/05 18:55:01 chris Exp $\n *\n * Generic type defines\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n *\n * The types are:\n * --------------\n * cpg_u8_t  - 8bit  value, unsigned\n * cpg_s8_t  - 8bit  value, signed\n * cpg_u16_t - 16bit value, unsigned\n * cpg_s16_t - 16bit value, signed\n * cpg_u32_t - 32bit value, unsigned\n * cpg_s32_t - 32bit value, signed\n * cpg_u64_t - 64bit value, unsigned   (not all compilers support this)\n * cpg_s64_t - 64bit value, signed     (not all compilers support this)\n * cpg_ptr_t - a pointer is guaranteed to fit into this\n */\n\n#ifndef _CPGTYPES_H_\n#define _CPGTYPES_H_\n\n/* some common default word sizes */\n#if (defined(WINNT) || defined(WIN95) || defined(WIN32) || defined(SOLARIS) || \\\n    defined(SCO) || defined(DJGPP)) && !defined(__32BIT__) && !defined(WIN64)\n#define __32BIT__\n#endif\n#if defined(WIN64) && !defined(__64BIT__)\n#define __64BIT__\n#endif\n#if defined(LINUX)\n#  if defined(__alpha__) && !defined(__64BIT__)\n#    define __64BIT__\n#    define __LP64__\n#  endif\n#  if defined(__ia64__) && !defined(__64BIT__)\n#    define __64BIT__\n#  endif\n#  if defined(__i386__) && !defined(__32BIT__)\n#    define __32BIT__\n#  endif\n#endif\n\n#if !defined(__16BIT__) && !defined(__32BIT__) && !defined(__64BIT__)\n#error \"Word size unknown! (need __16BIT__ or __32BIT__ or __64BIT__)\"\n#endif\n\ntypedef unsigned char  cpg_u8_t;\ntypedef   signed char  cpg_s8_t;\ntypedef unsigned short cpg_u16_t;\ntypedef   signed short cpg_s16_t;\n#ifndef WIN64\ntypedef unsigned long  cpg_ptr_t;    /* a pointer will always fit into a long */\n#else\ntypedef unsigned __int64 cpg_ptr_t;\n#endif\n\n#ifdef __16BIT__\ntypedef unsigned long  cpg_u32_t;\ntypedef   signed long  cpg_s32_t;\ntypedef unsigned long  cpg_u64_t[2];\ntypedef   signed long  cpg_s64_t[2];\n#else\n#if defined(WIN32) || defined(WINNT) || defined(WIN95) /* DWORD kack */\ntypedef unsigned long  cpg_u32_t;\ntypedef   signed long  cpg_s32_t;\n#else\ntypedef unsigned int   cpg_u32_t;\ntypedef   signed int   cpg_s32_t;\n#endif\n\n#ifdef __32BIT__\n#ifdef __GNUC__\ntypedef unsigned long long cpg_u64_t;\ntypedef   signed long long cpg_s64_t;\n#else\n#if (defined(_MSC_VER) && (_MSC_VER >= 900)) || (defined(__WATCOMC__) && (__WATCOMC__+1 >= 1100+1))\ntypedef unsigned __int64 cpg_u64_t;\ntypedef   signed __int64 cpg_s64_t;\n#else\ntypedef unsigned long  cpg_u64_t[2];\ntypedef   signed long  cpg_s64_t[2];\n#endif /* not defined _MSC_VER and not defined __GNUC__ and not defined __WATCOMC__ */\n#endif /* not defined __GNUC__ */\n#endif /* #ifdef __32BIT__ */\n\n#ifdef __64BIT__\n#ifndef WIN64\ntypedef unsigned long  cpg_u64_t;\ntypedef   signed long  cpg_s64_t;\n#else\ntypedef unsigned __int64 cpg_u64_t;\ntypedef   signed __int64 cpg_s64_t;\n#endif /* defined WIN64 */\n#endif /* defined __64BIT__ */\n#endif /* not defined __16BIT__ */\n\n#endif /* #ifndef _CPGTYPES_H_ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/fhdr.h",
    "content": "/* $Id: fhdr.h,v 1.5 2006/04/05 20:40:39 chris Exp $\n *\n * PCOS diskette file header structure\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __FHDR_H__\n#define __FHDR_H__\n\n/* all entries are big-endian! */\n\n#include \"packstrt.h\"\n\nWPACK struct ALIGN_ extent {\n    cpg_u32_t startsec;\n    cpg_u16_t numsecs;\n} ALIGN_2;\n\n#define MAX_FILE_EXTENTS 38\n\nWPACK struct ALIGN_ file_header { /* sizeof: 256 bytes */\n    cpg_u32_t     filelen;\n    cpg_u16_t     extents;\n    cpg_u8_t      unknown[16];\n    cpg_u16_t     unknown2;\n    struct extent extentlist[MAX_FILE_EXTENTS];\n    cpg_u32_t     link;        /* 0xffffffff for last */\n} ALIGN_2;\n\n#include \"packend.h\"\n#endif /* #ifndef __FHDR_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/imgopen.c",
    "content": "/* $Id: imgopen.c,v 1.6 2006/10/19 23:38:50 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: image open routines\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n *\n * These routines open the image file.\n * On DOS, if the filename is \"[A-Z]:\", it's the disk drive and no\n * open is performed. The functions will encode the drive in the\n * returned FILE *. 0 - A:, 1 - B:, etc.\n */\n\n#include <stdio.h>\n#include \"imgopen.h\"\n\n#ifdef DOS\n#include <ctype.h>  /* toupper() */\n\n/*\n * checks whether file name parameter refers to a DOS drive\n * if yes, update file * to reflect this drive\n * returns 0/1 for drive/no drive\n */\nstatic int is_dos_drive(char *name,FILE **file)\n{\n    char c;\n    int drvnum;\n    if (strlen(name) == 2 && *(name + 1) == ':') {\n        c = toupper(*name);\n        drvnum = c - 'A';\n        if (drvnum > 'Z' - 'A') return(1);  /* invalid drive letter */\n        *file = (FILE *)(drvnum);\n        return(0);\n    }\n    else return(1);\n}\n#endif\n\nint open_img_rw(char *name,FILE **file)\n{\n#ifdef DOS\n    int ret;\n    if (!(ret = is_dos_drive(name, file))) return(ret);\n#endif\n    *file = fopen(name,\"rb+\");\n    if (!*file) return(1);\n    return(0);\n}\n\nint open_img_ro(char *name,FILE **file)\n{\n#ifdef DOS\n    int ret;\n    if (!(ret = is_dos_drive(name, file))) return(ret);\n#endif\n    *file = fopen(name,\"rb\");\n    if (!*file) return(1);\n    return(0);\n}\n\nint open_img_new(char *name,FILE **file)\n{\n#ifdef DOS\n    int ret;\n    if (!(ret = is_dos_drive(name, file))) return(ret);\n#endif\n    *file = fopen(name,\"wb\");\n    if (!*file) return(1);\n    return(0);\n}\n\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/imgopen.h",
    "content": "/* $Id: imgopen.h,v 1.4 2006/04/05 18:55:01 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: image open routines prototypes\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __IMGOPEN_H__\n#define __IMGOPEN_H__\n\nextern int open_img_rw(char *,FILE **);\nextern int open_img_ro(char *,FILE **);\nextern int open_img_new(char *,FILE **);\n\n#endif /* #ifndef __IMGOPEN_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/main.c",
    "content": "/* $Id: main.c,v 1.15 2006/10/19 23:41:25 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility\n * Copyright (C) 2000,2001,2004,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include \"version.h\"\n#include \"cpgtypes.h\"\n#include \"cpgdefs.h\"\n#include \"fhdr.h\"\n#include \"pcosdir.h\"\n#include \"cmdopts.h\"\n#include \"roprotos.h\"\n#include \"rwprotos.h\"\n#include \"imgopen.h\"\n\nstatic char issue[] = \"m20 v\" VERSION_ASCII\n                      \"\\n\" COPYRIGHT_STRING \"\\n\";\n\nint main(int argc,char **argv)\n{\n    int option,lsl=FALSE;\n    FILE *image = NULL;\n\n#ifdef DEBUG /* until I know all entries of the disk structures, I may need this code.... */\n    printf(\"sizeof struct file_header: %ld\\n\",(long)sizeof(struct file_header));\n    printf(\"sizeof struct dir_sector:  %ld\\n\",(long)sizeof(struct dir_sector));\n#endif\n\n    if (argc <=2) {\n        if (argc == 2 && !strcmp(*(argv+1),\"version\")) goto version;\n      errline:\n        fprintf(stderr,VERSION_ASCII);\n        fprintf(stderr,\"usage: %s <image file> <option>\\n\",*argv);\n        fprintf(stderr,\"       option can be one of\\n\");\n        fprintf(stderr,\"          ls      - list files on image\\n\");\n        fprintf(stderr,\"          lsl     - verbosely list files on image\\n\");\n        fprintf(stderr,\"          cat     - show file from image\\n\");\n        fprintf(stderr,\"          get     - get file from image\\n\");\n        fprintf(stderr,\"          mget    - get multiple files from image\\n\");\n        fprintf(stderr,\"          put     - put file onto image\\n\");\n        fprintf(stderr,\"          mput    - put multiple files onto image\\n\");\n        fprintf(stderr,\"          rm      - delete files from image\\n\");\n        fprintf(stderr,\"          new     - create a new empty image\\n\");\n        fprintf(stderr,\"          version - display program version\\n\");\n        return(1);\n    }\n\n    if (!strcmp(*(argv+2),\"lsl\") || !strcmp(*(argv+2),\"dir\"))\n        option = LSL_OPTION;\n    else if (!strcmp(*(argv+2),\"ls\"))\n        option = LS_OPTION;\n    else if (!strcmp(*(argv+2),\"cat\") || !strcmp(*(argv+2),\"type\"))\n        option = CAT_OPTION;\n    else if (!strcmp(*(argv+2),\"rm\") || !strcmp(*(argv+2),\"del\"))\n        option = DEL_OPTION;\n    else if (!strcmp(*(argv+2),\"get\"))\n        option = GET_OPTION;\n    else if (!strcmp(*(argv+2),\"mget\"))\n        option = MGET_OPTION;\n    else if (!strcmp(*(argv+2),\"put\"))\n        option = PUT_OPTION;\n    else if (!strcmp(*(argv+2),\"mput\"))\n        option = MPUT_OPTION;\n    else if (!strcmp(*(argv+2),\"new\"))\n        option = NEW_OPTION;\n    else if (!strcmp(*(argv+2),\"version\"))\n        option = VERSION_OPTION;\n    else goto errline;\n\n    switch(option) {\n        case LSL_OPTION:\n            lsl = TRUE;\n            /* fall thru */\n        case LS_OPTION:\n            if (open_img_ro(*(argv+1),&image)) {\n              open_file_err:\n                fprintf(stderr,\"%s: cannot open image file: %s: %s\\n\",*argv,*(argv+1),strerror(errno));\n                return(option);\n            }\n            do_ls(&image,argc-2,argv+2,lsl);\n            break;\n        case CAT_OPTION:\n            if (open_img_ro(*(argv+1),&image)) {\n                goto open_file_err;\n            }\n            do_cat(&image,argc-2,argv+2);\n            break;\n        case GET_OPTION:\n            if (open_img_ro(*(argv+1),&image)) {\n                goto open_file_err;\n            }\n            do_get(&image,argc-2,argv+2);\n            break;\n        case MGET_OPTION:\n            if (open_img_ro(*(argv+1),&image)) {\n                goto open_file_err;\n            }\n            do_mget(&image,argc-2,argv+2);\n            break;\n        case PUT_OPTION:\n            if (open_img_rw(*(argv+1),&image)) {\n                goto open_file_err;\n            }\n            do_put(&image,argc-2,argv+2);\n            break;\n        case MPUT_OPTION:\n            if (open_img_rw(*(argv+1),&image)) {\n                goto open_file_err;\n            }\n            do_mput(&image,argc-2,argv+2);\n            break;\n        case NEW_OPTION:\n            if (open_img_new(*(argv+1),&image)) {\n                goto open_file_err;\n            }\n            do_new(&image,argc-2,argv+2);\n            break;\n        case DEL_OPTION:\n            if (open_img_rw(*(argv+1),&image)) {\n                goto open_file_err;\n            }\n            do_rm(&image,argc-2,argv+2);\n            break;\n        case VERSION_OPTION:\n      version:\n            printf(\"%s: %d.%02d\\n\",*argv,MAJOR_VERSION,MINOR_VERSION);\n    }\n\n#ifdef DOS\n    if ((unsigned int)image > 'Z' - 'A') fclose(image);  /* DOS version may record the floppy drive there */\n#else\n    if (image) fclose(image);\n#endif\n    return(0);\n}\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/packend.h",
    "content": "/* $Id: packend.h,v 1.4 2006/04/05 18:55:01 chris Exp $\n *\n * end structure packing for different compilers\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#if !defined(_NEWGNUC_) && !defined(__WATCOMC__) && !defined(_NEWMSC_)\n#  pragma pack()\n#endif\n#ifdef _NEWMSC_\n#  pragma pack(pop,_cpg_label_)\n#endif\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/packstrt.h",
    "content": "/* $Id: packstrt.h,v 1.4 2006/04/05 18:55:02 chris Exp $\n *\n * start structure packing for different compilers\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n/* packing start */\n#if !defined(_NEWGNUC_) && !defined(__WATCOMC__) && !defined(_NEWMSC_)\n#  pragma pack(1)\n#endif\n#ifdef _NEWMSC_\n#  pragma pack(push,_cpg_label_,1)\n#endif\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/pcosdir.h",
    "content": "/* $Id: pcosdir.h,v 1.9 2006/04/05 18:55:03 chris Exp $\n *\n * PCOS diskette directory structure\n * Copyright (C) 2000,2001,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __PCOSDIR_H__\n#define __PCOSDIR_H__\n\n/* internal directory structure used by m20floppy */\n\nstruct m20dir_entry {\n    cpg_u8_t  name[16];\n    cpg_u32_t size;\n    cpg_u32_t alloc_size;\n    cpg_u16_t extents;\n    cpg_u16_t flags;\n    cpg_u16_t startsec;\n};\n\nstruct m20dir {\n    cpg_u32_t           entries;    /* # of entries in the following array */\n    struct m20dir_entry files[1];\n};\n\n#define m20dir_hdr_size (sizeof(struct m20dir) - sizeof(struct m20dir_entry))\n\n#define PCOS_DIR_ENTRIES_BLOCK 14  /* # of dir entries in one diskette block */\n#define PCOS_NUM_DIR_BLOCKS    14  /* # of blocks containing the directory */\n#define PCOS_MAX_DIR_ENTRIES   (PCOS_DIR_ENTRIES_BLOCK * PCOS_NUM_DIR_BLOCKS)\n                    /* size of memory needed to hold full directory */\n#define M20DIR_SIZE (PCOS_MAX_DIR_ENTRIES * \\\n                     sizeof(struct m20dir_entry) + m20dir_hdr_size)\n\n\n/* directory structures used by PCOS on disk */\n/* all entries are big-endian! */\n\n#include \"packstrt.h\"\n\nWPACK struct ALIGN_ direntry {\n    cpg_u8_t  name[16];  /* in fact 14 only, don't know what the other 2 bytes are... */\n                         /* in my tests they are always 0 */\n    cpg_u16_t startsec;\n} ALIGN_2;\n\nWPACK struct ALIGN_ dir_sector {\n    struct direntry files[PCOS_DIR_ENTRIES_BLOCK];\n    cpg_u32_t       link;\n}  ALIGN_2;\n\n/* block free bitmap + etc (sector 0x200) */\n\n#define NUM_FILE_BLOCKS 0x8a    /* available blocks for files (-16, directory blocks not considered) */\n\nWPACK struct ALIGN_ disk_header {\n    cpg_u8_t  volname[15];           /* volume name (max. 14 chars w/terminating zero) */\n    cpg_u8_t  unknown1[13];          /* purpose unknown at this time */\n    cpg_u16_t sernum_or_unknown;     /* purpose unknown at this time */\n    cpg_u8_t  unknown2[0x1a];        /* purpose unknown at this time */\n    cpg_u8_t  bfl[NUM_FILE_BLOCKS];  /* block free list */\n}  ALIGN_2;\n\n#include \"packend.h\"\n#endif /* #ifndef __PCOSDIR_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/roprotos.h",
    "content": "/* $Id: roprotos.h,v 1.5 2006/07/11 22:22:31 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: image readonly services functions\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __ROPROTOS_H__\n#define __ROPROTOS_H__\n\nextern void do_ls(FILE **,int,char **,int);\nextern void do_cat(FILE **,int,char **);\nextern void do_get(FILE **,int,char **);\nextern void do_mget(FILE **,int,char **);\n\n#endif /* #ifndef __ROPROTOS_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/roserv.c",
    "content": "/* $Id: roserv.c,v 1.13 2006/07/11 22:22:31 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: image readonly services\n * Copyright (C) 2000,2001,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include \"cpgdefs.h\"\n#include \"cpgtypes.h\"\n#include \"roprotos.h\"\n#include \"blockop.h\"\n#include \"pcosdir.h\"\n#include \"util.h\"\n\nstatic const char spaces[]=\"                \"; /* 16 space characters */\nstruct m20dir *diskdir;\n\n/* show directory */\nvoid do_ls(FILE **file,int argc,char **argv,int lsl)\n{\n    int i;\n    char nambuf[18];\n    char scbuf[256];\n    struct disk_header *dskhdr = (struct disk_header *)scbuf;\n\n    if (read_phys_block(*file,0x200,(void *)dskhdr)) {\n        fprintf(stderr,\"do_ls: cannot read main disk block\\n\");\n        return;\n    }\n    if (get_dir(*file,&diskdir)) {\n        fprintf(stderr,\"do_ls: get_dir error!\\n\");\n        return;\n    }\n    if (lsl) printf(\"\\n\");\n    if (lsl && dskhdr->volname[0]) {  /* disk has a volume name */\n        printf(\"Volume name: %s\\n\",dskhdr->volname);\n    }\n    if (lsl)\n        printf(\"# of files: %d\\t\\tfree blocks: %d\\n\",\n               diskdir->entries,\n               get_free_blocks(dskhdr,NULL,NULL));\n    if (lsl && diskdir->entries) {\n        printf(\"\\nNAME            \\tSIZE\\tBLOCKS\\tALLBL\\tEXTENTS\\n\");\n        printf(\"--------------  \\t----\\t------\\t-----\\t-------\\n\");\n    }\n    for (i=0; i<diskdir->entries; i++) {\n        if (lsl) {\n            strcpy(nambuf,diskdir->files[i].name);\n            strncpy(nambuf + strlen(nambuf),spaces,16-strlen(nambuf));\n            nambuf[16] = 0;\n            printf(\"%s\\t%lu\\t%lu\\t%lu\\t%lu\\n\",\n                   nambuf,(unsigned long)diskdir->files[i].size,\n                   (unsigned long)((diskdir->files[i].size + 0xff) >> 8),\n                   (unsigned long)((diskdir->files[i].alloc_size) >> 8),\n                   (unsigned long)diskdir->files[i].extents);\n        }\n        else {\n            puts(diskdir->files[i].name);\n        }\n    }\n    if (lsl) printf(\"\\n\");\n}\n\n/* cat a file */\nvoid do_cat(FILE **file,int argc,char **argv)\n{\n    int i,found = -1;\n    char *srcfile;\n\n    if (argc != 2) {\n        fprintf(stderr,\"need srcname argument\\n\");\n        return;\n    }\n    srcfile = *(argv+1);\n\n    /* get contents of diskette */\n    if (get_dir(*file,&diskdir)) {\n        fprintf(stderr,\"do_cat: get_dir error!\\n\");\n        return;\n    }\n\n    /* search requested file */\n    for (i=0; i<diskdir->entries; i++) {\n        if (!strcmp(diskdir->files[i].name,srcfile)) {\n            found = i;\n            break;\n        }\n    }\n    if (found == -1) {\n        fprintf(stderr,\"%s not found on diskette\\n\",srcfile);\n        return;\n    }\n    get_file(*file,&diskdir->files[i],stdout);  /* copy file out */\n}\n\n/* copy a file to host */\nvoid do_get(FILE **file,int argc,char **argv)\n{\n    int i,found = -1;\n    char *srcfile,*destfile;\n    FILE *dest;\n\n    if (argc != 2 && argc != 3) {\n        fprintf(stderr,\"need srcname [destname] argument\\n\");\n        return;\n    }\n    srcfile = *(argv+1);\n    if (argc == 2) destfile = srcfile;\n    else destfile = *(argv+2);\n\n#ifdef DEBUG\n    printf(\"srcfile: %s, destfile: %s\\n\",srcfile,destfile);\n#endif\n\n    /* get contents of diskette */\n    if (get_dir(*file,&diskdir)) {\n        fprintf(stderr,\"do_get: get_dir error!\\n\");\n        return;\n    }\n\n    /* search requested file */\n    for (i=0; i<diskdir->entries; i++) {\n        if (!strcmp(diskdir->files[i].name,srcfile)) {\n            found = i;\n            break;\n        }\n    }\n    if (found == -1) {\n        fprintf(stderr,\"%s not found on diskette\\n\",srcfile);\n        return;\n    }\n\n    /* open/create destination file */\n    dest = fopen(destfile,\"wb\");\n    if (! dest) {\n        fprintf(stderr,\"cannot open destination file %s: %s\\n\",destfile,strerror(errno));\n        return;\n    }\n\n    /* copy file out */\n    get_file(*file,&diskdir->files[i],dest);\n\n    /* close the destination file */\n    if (fclose(dest)) {\n        fprintf(stderr,\"cannot close destination file %s: %s\\n\",destfile,strerror(errno));\n    }\n}\n\n/* copy many files to host */\nvoid do_mget(FILE **file,int argc,char **argv)\n{\n    int i,f,found = -1;\n    char *filename;\n    FILE *dest;\n\n    if (argc < 2) {\n        fprintf(stderr,\"no files to get\\n\");\n        return;\n    }\n\n    argc--;  /* skip command argument */\n    f = 0;   /* files start at argv[1] (start with f=1: see f++ in while() loop) */\n\n    /* get contents of diskette */\n    if (get_dir(*file,&diskdir)) {\n        fprintf(stderr,\"do_get: get_dir error!\\n\");\n        return;\n    }\n\n    while (f++,argc--) {\n        filename = *(argv+f);\n\n#ifdef DEBUG\n        printf(\"mgetting %s\\n\",filename);\n#endif\n\n        /* search requested file */\n        for (i=0,found=-1; i<diskdir->entries; i++) {\n            if (!strcmp(diskdir->files[i].name,filename)) {\n                found = i;\n                break;\n            }\n        }\n        if (found == -1) {\n            fprintf(stderr,\"%s not found on diskette -- ignoring\\n\",filename);\n            continue;\n        }\n\n        /* open/create destination file */\n        dest = fopen(filename,\"wb\");\n        if (! dest) {\n            fprintf(stderr,\"cannot open destination file %s: %s\\n\",filename,strerror(errno));\n            return;\n        }\n\n        /* copy file out */\n        get_file(*file,&diskdir->files[i],dest);\n\n        /* close the destination file */\n        if (fclose(dest)) {\n            fprintf(stderr,\"cannot close destination file %s: %s  (ignored)\\n\",filename,strerror(errno));\n        }\n    }\n\n    return;\n}\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/rwprotos.h",
    "content": "/* $Id: rwprotos.h,v 1.5 2006/04/05 21:19:19 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: image write services functions\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __RWPROTOS_H__\n#define __RWPROTOS_H__\n\nextern void do_new(FILE **,int,char **);\nextern void do_rm(FILE **,int,char **);\nextern void do_put(FILE **,int,char **);\nextern void do_mput(FILE **,int,char **);\n\n#endif /* #ifndef __RWPROTOS_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/rwserv.c",
    "content": "/* $Id: rwserv.c,v 1.13 2006/10/17 22:33:52 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: image write services\n * Copyright (C) 2000,2001,2004,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <unistd.h>\n#include <sys/stat.h>\n#include \"cpgdefs.h\"\n#include \"cpgtypes.h\"\n#include \"rwprotos.h\"\n#include \"blockop.h\"\n#include \"pcosdir.h\"\n#include \"fhdr.h\"\n#include \"util.h\"\n\nextern struct m20dir *diskdir;\n\n/* create a new, empty image */\nvoid do_new(FILE **file,int argc,char **argv)\n{\n    cpg_u8_t *imgbuf;\n    int i,j;\n\n    imgbuf = malloc(286720);  /* total image size: 1120 blocks */\n    if (! imgbuf) {\n        fprintf(stderr,\"do_new: cannot allocate memory: %s\\n\",strerror(errno));\n        return;\n    }\n\n    memset(imgbuf,0,286720);\n    memset(imgbuf+0x1000,0xff,0x100);\n    memset(imgbuf+0x20200,0xff,0x21000-0x20200);\n    *(imgbuf+0x2001c) = 7;\n    *(imgbuf+0x2001d) = 0x32;\n    *(imgbuf+0x20038) = 0xff;\n    *(imgbuf+0x20039) = 0xff;\n    for (j=3,i=0x202f0; i<0x20ff0; i+=0x100,j++) {\n        *(imgbuf + i + 0xc) = 0;\n        *(imgbuf + i + 0xd) = 0;\n        *(imgbuf + i + 0xe) = 0;\n        *(imgbuf + i + 0xf) = j;\n    }\n    if (fwrite(imgbuf,286720,1,*file) != 1) {\n        fprintf(stderr,\"do_new: cannot write image file: %s\\n\",strerror(errno));\n        return;\n    }\n}\n\n/* it's a hack - itzchakh */\nstatic void do_put_one_file(FILE **file,char *srcfile,char *destfile)\n{\n    cpg_u8_t *databuf;\n    struct dir_sector blkbuf;\n    cpg_u32_t blknum;\n    int found,free_blocks,max_free,max_free_num;\n    int i,needed_blocks,extents = 0;\n    int filephysflag,index,end = FALSE;\n    struct stat statbuf;\n    cpg_u8_t xbuf[256];\n    struct disk_header *dskhdr = (struct disk_header *)xbuf;\n    struct file_header fhdr;\n    FILE *infile;\n    char *pcos_destfile_p;\n    char pcos_destfile[16];\n    cpg_u32_t fhdr_blocknum;\n    off_t filesize,curoff = 0,last_size = 0;\n\n    if (stat(srcfile,&statbuf)) {\n        fprintf(stderr,\"cannot stat %s: %s\\n\",srcfile,strerror(errno));\n        return;\n    }\n\n    /* make pcos_destfile: strip directories if present */\n    memset(pcos_destfile,0,16);\n    while (*(destfile + strlen(destfile) - 1) == '/' && *destfile)\n        *(destfile + strlen(destfile) - 1) = 0;  /* remove trailing \"/\" */\n    pcos_destfile_p = strrchr(destfile,'/');\n    if (pcos_destfile_p) {\n        if (*(pcos_destfile_p+1)) {\n            strncpy(pcos_destfile,pcos_destfile_p+1,14);\n        }\n        else {\n            fprintf(stderr,\"empty destination file '%s'\\n\",destfile);\n            return;\n        }\n    }\n    else {\n        strncpy(pcos_destfile,destfile,14);\n    }\n\n    /* do a first sanity check on the file size, so we don't need to read the\n     * m20 disk to find out the file won't fit\n     */\n    if (statbuf.st_size > 1088 * 256) {\n        fprintf(stderr,\"file too big\\n\");\n        return;\n    }\n    filesize = statbuf.st_size;\n    needed_blocks = (statbuf.st_size + 255) >> 8;  /* doesn't account for file description block */\n\n    /* open input file */\n    infile = fopen(srcfile,\"rb\");\n    if (! infile) {\n        fprintf(stderr,\"cannot open input file %s: %s\\n\",srcfile,strerror(errno));\n        return;\n    }\n\n    /* get contents of diskette */\n    if (get_dir(*file,&diskdir)) {\n        fprintf(stderr,\"do_put: get_dir error!\\n\");\n        return;\n    }\n\n    /* get block map block */\n    if (read_phys_block(*file,0x200,(void *)dskhdr)) {\n        fprintf(stderr,\"do_put: cannot read main disk block\\n\");\n        return;\n    }\n    /* calc # of free blocks */\n    free_blocks = get_free_blocks(dskhdr,NULL,NULL);\n\n    /* allocate buffer for copying file data */\n    databuf = malloc(286720);  /* max size: 1120 blocks */\n    if (! databuf) {\n        fprintf(stderr,\"do_put: cannot allocate memory: %s\\n\",strerror(errno));\n        return;\n    }\n\n    /* search whether a file with same name is already on disk */\n    for (found=-1,i=0; i<diskdir->entries; i++) {\n        if (!strncmp(diskdir->files[i].name,pcos_destfile,14)) {\n            found = i;\n            break;\n        }\n    }\n\n    /* if yes, check that the # of blocks used by the file and\n     * the # of free blocks together are greater than or\n     * equal the blocks needed for the new file.\n     */\n    if (found != -1) {\n        if (free_blocks + (diskdir->files[found].alloc_size >> 8) <= needed_blocks) {\n            fprintf(stderr,\"do_put: not enough free space on disk\\n\");\n            return;\n        }\n        /* yes, it will fit. delete the old file first... */\n        rm_file(*file,&diskdir->files[found],dskhdr,KEEP_DIR_ENTRY);  /* delete file */\n    }\n    /* if no, the check is only with the free blocks */\n    else {\n        if (free_blocks <= needed_blocks) {\n            fprintf(stderr,\"do_put: not enough free space on disk\\n\");\n            return;\n        }\n    }\n    get_free_blocks(dskhdr,&max_free,&max_free_num);\n#ifdef DEBUG\n    printf(\"XXXX max_free_num: %d, fhdr = %d\\n\",max_free_num,max_free);\n    printf(\"XXXX needed_blocks: %d\\n\",needed_blocks);\n#endif\n    fhdr_blocknum = max_free_num++;  /* block number of file description block */\n    max_free--;\n    memset(&fhdr,0,sizeof(fhdr));\n    /* occupy file description block in global block list */\n    set_blk_bits(dskhdr,fhdr_blocknum,1);\n    while (needed_blocks && max_free) {\n\n        if (curoff + max_free * 256 > filesize) {\n            end = TRUE;\n            max_free = (filesize - curoff + 255) >> 8;\n            last_size = filesize - curoff;\n        }\n\n        /* enter the extent into the file description block */\n        WRITEBE32(&fhdr.extentlist[extents].startsec,max_free_num);\n        WRITEBE16(&fhdr.extentlist[extents].numsecs,max_free);\n        extents++;\n        if (extents > MAX_FILE_EXTENTS) {\n            fprintf(stderr,\"do_put: too many extents!\\n\");\n            return;\n        }\n\n        /* occupy blocks in global block list */\n        set_blk_bits(dskhdr,max_free_num,max_free);\n\n#ifdef DEBUG\n        printf(\"XXX reading %d bytes... (max_free_num=%d)\\n\",max_free << 8,max_free_num);\n#endif\n        /* write an extent */\n        if (end) {\n            memset(databuf,0,(last_size + 255) & ~255);\n            if (fread(databuf,last_size,1,infile) != 1) {\n                fprintf(stderr,\"do_put: cannot read end from source file: %s\\n\",strerror(errno));\n                return;\n            }\n        }\n        else {\n            if (fread(databuf,max_free << 8,1,infile) != 1) {\n                fprintf(stderr,\"do_put: cannot read from source file: %s\\n\",strerror(errno));\n                return;\n            }\n        }\n        for (i=0; i<max_free; i++) {\n#ifdef DEBUG\n            dumpbuf(databuf + (i << 8),max_free_num + i);\n#endif\n            if (write_file_block(*file,max_free_num + i,(void *)(databuf + (i << 8)))) {\n                fprintf(stderr,\"do_put: cannot write block %d\\n\",max_free_num + i);\n                return;\n            }\n        }\n        needed_blocks -= max_free;\n        curoff += max_free << 8;\n        if (end) break;\n        get_free_blocks(dskhdr,&max_free,&max_free_num);\n#ifdef DEBUG\n        printf(\"XXXX max_free_num: %d\\n\",max_free_num);\n#endif\n    }\n    if (needed_blocks) {\n        fprintf(stderr,\"internal error in do_put!!\\n\");\n        return;\n    }\n    WRITEBE32(&fhdr.filelen,statbuf.st_size);\n    WRITEBE16(&fhdr.extents,extents);\n    /* write file description block */\n    if (write_file_block(*file,fhdr_blocknum,(void *)&fhdr)) {\n        fprintf(stderr,\"do_put: cannot write file description block\\n\");\n        return;\n    }\n    /* update directory entry */\n    if (found != -1) {\n        /* file already existed, only change start block # */\n        if (find_dir_name(*file,\n                          &diskdir->files[found],\n                          &filephysflag,\n                          &index,\n                          &blknum,\n                          &blkbuf) == -1) {\n            fprintf(stderr,\"do_put: internal error #2\\n\");\n            return;\n        }\n      finishname:\n        WRITEBE16(&blkbuf.files[index].startsec,fhdr_blocknum);\n        /* write back the directory sector */\n        if (filephysflag) {\n            if (write_file_block(*file,blknum,(void *)&blkbuf)) {\n                fprintf(stderr,\"do_put: (file) cannot update dir block\\n\");\n                return;\n            }\n        }\n        else {\n            if (write_phys_block(*file,blknum,(void *)&blkbuf)) {\n                fprintf(stderr,\"do_put: (phys) cannot update dir block\\n\");\n                return;\n            }\n        }\n    }\n    else {\n        /* new file */\n        if (find_empty_dirent(*file,&filephysflag,&index,&blknum,&blkbuf) == -1) {\n            fprintf(stderr,\"do_put: directory full\\n\");\n            return;\n        }\n        memset(blkbuf.files[index].name,0,sizeof(blkbuf.files[index].name));\n        strncpy(blkbuf.files[index].name,pcos_destfile,14);\n        goto finishname;\n    }\n    /* write back the modified block */\n    if (write_phys_block(*file,0x200,(void *)dskhdr)) {\n        fprintf(stderr,\"do_put: cannot write main disk block\\n\");\n        return;\n    }\n    /* close the input file */\n    if (fclose(infile)) {\n        fprintf(stderr,\"cannot close input file %s: %s  (ignored)\\n\",srcfile,strerror(errno));\n    }\n}\n\nvoid do_put(FILE **file,int argc,char **argv)\n{\n    char *srcfile,*destfile;\n\n    if (argc != 2 && argc != 3) {\n        fprintf(stderr,\"need srcname [destname] argument\\n\");\n        return;\n    }\n    srcfile = *(argv+1);\n    if (argc == 2) destfile = srcfile;\n    else destfile = *(argv+2);\n\n    do_put_one_file(file,srcfile,destfile);\n}\n\nvoid do_mput(FILE **file,int argc,char **argv)\n{\n    int f;\n    char *filename;\n\n    if (argc < 2) {\n        fprintf(stderr,\"no files to put\\n\");\n        return;\n    }\n\n    argc--;  /* skip command argument */\n    f = 0;   /* files start at argv[1] (start with f=1: see f++ in while() loop) */\n\n    while (f++,argc--) {\n        filename = *(argv+f);\n\n#ifdef DEBUG\n        printf(\"mputting %s\\n\",filename);\n#endif\n\n        do_put_one_file(file,filename,filename);\n    }\n}\n\nvoid do_rm(FILE **file,int argc,char **argv)\n{\n    int i,found = -1;\n    char *srcfile;\n    char scbuf[256];\n    struct disk_header *dskhdr = (struct disk_header *)scbuf;\n\n    if (argc-- < 2) {\n        fprintf(stderr,\"need name argument\\n\");\n        return;\n    }\n    argv++;\n\n    if (read_phys_block(*file,0x200,(void *)dskhdr)) {\n        fprintf(stderr,\"do_rm: cannot read main disk block\\n\");\n        return;\n    }\n\n    /* get contents of diskette */\n    if (get_dir(*file,&diskdir)) {\n        fprintf(stderr,\"do_rm: get_dir error!\\n\");\n        return;\n    }\n\n    while (argc) {\n        srcfile = *argv;\n\n        /* search requested file */\n        for (i=0; i<diskdir->entries; i++) {\n            if (!strcmp(diskdir->files[i].name,srcfile)) {\n                found = i;\n                break;\n            }\n        }\n\n        if (found == -1) {\n            fprintf(stderr,\"%s not found on diskette\\n\",srcfile);\n            /*return;*/\n        }\n        else rm_file(*file,&diskdir->files[i],dskhdr,RM_DIR_ENTRY);  /* delete file */\n        argc--;\n        argv++;\n    }\n\n    /* write back the modified block */\n    if (write_phys_block(*file,0x200,(void *)dskhdr)) {\n        fprintf(stderr,\"do_rm: cannot write main disk block\\n\");\n        return;\n    }\n}\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/util.c",
    "content": "/* $Id: util.c,v 1.13 2006/04/05 21:21:05 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: utility routines\n * Copyright (C) 2000,2004,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <string.h>\n#include \"cpgtypes.h\"\n#include \"cpgdefs.h\"\n#include \"pcosdir.h\"\n#include \"fhdr.h\"\n#include \"util.h\"\n#include \"blockop.h\"\n\n/* find an empty directory entry */\n/* returns 0 for success, -1 for error */\nint find_empty_dirent(FILE *floppy,\n                      int *filephysflag,\n                      int *index,\n                      cpg_u32_t *blknum,\n                      struct dir_sector *blockbuf)\n{\n    /* *** modified block copy of find_dir_name() code *** */\n    int i;\n\n    *filephysflag = 0;\n\n    /* read all directory blocks until a free filename slot occurs */\n    for (i = 0;  i < PCOS_NUM_DIR_BLOCKS; i++) {  /* all directory blocks */\n        /* read block */\n        if (read_phys_block(floppy,*blknum = 0x202 + i,(void *)blockbuf)) {\n            fprintf(stderr,\"find_empty_name: cannot read dir block\\n\");\n            return(-1);\n        }\n        for (*index = 0; *index < PCOS_DIR_ENTRIES_BLOCK; (*index)++) {  /* loop over all entries in this block */\n            if (blockbuf->files[*index].name[0] == 0xff) {\n\n                /* ta-da! found an entry! */\n                return(0);\n\n            }\n        }\n    }\n    /* if we enter this loop,\n     * main directory chunk has been extended to file blocks area,\n     * because directory is too big\n     */\n    *filephysflag = 1;\n    while (blockbuf->link != 0xffffffff) {\n        if (read_file_block(floppy,*blknum = READBE32(&blockbuf->link),(void *)blockbuf)) {\n            fprintf(stderr,\"find_emtpy_name: cannot read dir block (2)\\n\");\n            return(-1);\n        }\n/* --- same as above, simple block copy --- */\n        for (*index = 0; *index < PCOS_DIR_ENTRIES_BLOCK; (*index)++) {  /* loop over all entries in this block */\n            if (blockbuf->files[*index].name[0] == 0xff) {\n\n                /* ta-da! found an entry! */\n                return(0);\n\n            }\n        }\n/* --- */\n    }\n#ifdef DEBUG\n    fprintf(stderr,\"find_empty_name(): leave - no empty entry found\\n\");\n#endif\n    return(-1);\n}\n\n/* find a directory entry */\n/* returns 0 for success, -1 for error */\nint find_dir_name(FILE *floppy,\n                  struct m20dir_entry *ent,\n                  int *filephysflag,\n                  int *index,\n                  cpg_u32_t *blknum,\n                  struct dir_sector *blockbuf)\n{\n    int i;\n\n    *filephysflag = 0;\n\n    /* read all directory blocks until a filename starting with 0xff 0xff\n     * or our filename is encountered\n     */\n    for (i = 0;  i < PCOS_NUM_DIR_BLOCKS; i++) {  /* all directory blocks */\n        /* read block */\n        if (read_phys_block(floppy,*blknum = 0x202 + i,(void *)blockbuf)) {\n            fprintf(stderr,\"find_dir_name: cannot read dir block\\n\");\n            return(-1);\n        }\n        for (*index = 0; *index < PCOS_DIR_ENTRIES_BLOCK; (*index)++) {  /* loop over all entries in this block */\n            if (blockbuf->files[*index].name[0] == 0xff) {\n                /* if 2nd char also is 0xff, end of used directory structure has been reached */\n                if (blockbuf->files[*index].name[1] == 0xff) {\n                    goto notfound;  /* end of used directory sectors */\n                }\n                /* deleted entry */\n                continue;\n            }\n            if (!strcmp(ent->name,blockbuf->files[*index].name)) {\n                goto found;\n            }\n        }\n    }\n    /* if we enter this loop,\n     * main directory chunk has been extended to file blocks area,\n     * because directory is too big\n     */\n    *filephysflag = 1;\n    while (blockbuf->link != 0xffffffff) {\n        if (read_file_block(floppy,*blknum = READBE32(&blockbuf->link),(void *)blockbuf)) {\n            fprintf(stderr,\"find_dir_name: cannot read dir block (2)\\n\");\n            return(-1);\n        }\n/* --- same as above, simple block copy --- */\n        for (*index = 0; *index < PCOS_DIR_ENTRIES_BLOCK; (*index)++) {  /* loop over all entries in this block */\n            if (blockbuf->files[*index].name[0] == 0xff) {\n                /* if 2nd char also is 0xff, end of used directory structure has been reached */\n                if (blockbuf->files[*index].name[1] == 0xff) {\n                    goto notfound;  /* end of used directory sectors */\n                }\n                /* deleted entry */\n                continue;\n            }\n            if (!strcmp(ent->name,blockbuf->files[*index].name)) {\n                goto found;\n            }\n        }\n/* --- */\n    }\n  notfound:\n#ifdef DEBUG\n    fprintf(stderr,\"find_dir_name(): leave - file not found\\n\");\n#endif\n    return(-1);\n\n    /* we found what */\n  found:\n#ifdef DEBUG\n    fprintf(stderr,\"find_dir_name(): found\\n\");\n#endif\n    return(0);\n}\n\n/* disable a directory entry */\n/* returns 0 for success, -1 for error */\nstatic int rm_dir_name(FILE *floppy,struct m20dir_entry *ent)\n{\n    int j;\n    struct dir_sector blockbuf;\n    int filephysflag = 0;\n    cpg_u32_t blknum;\n\n#ifdef DEBUG\n    fprintf(stderr,\"*** rm_dir_name for %s\\n\",ent->name);\n#endif\n\n    if (find_dir_name(floppy,ent,&filephysflag,&j,&blknum,&blockbuf) == -1)\n        return(-1);\n\n    /* save first char at end of name */\n    blockbuf.files[j].name[13] = blockbuf.files[j].name[0];\n    blockbuf.files[j].name[0] = 0xff;  /* disable entry */\n    ent->name[0] = 0xff;  /* !!! better recreate directory table */\n    /* write back the modified sector */\n    if (filephysflag) {\n        if (write_file_block(floppy,blknum,(void *)&blockbuf)) {\n            fprintf(stderr,\"rm_dir_name: (file) cannot update dir block\\n\");\n            return(-1);\n        }\n    }\n    else {\n        if (write_phys_block(floppy,blknum,(void *)&blockbuf)) {\n            fprintf(stderr,\"rm_dir_name: (phys) cannot update dir block\\n\");\n            return(-1);\n        }\n    }\n    return(0);\n}\n\nstatic int get_file_data(FILE *floppy,struct m20dir_entry *ent)\n{\n    int i;\n    cpg_u32_t alloc_size,ext_blocks;\n    struct file_header blockbuf;\n\n    if (read_file_block(floppy,ent->startsec,(void *)&blockbuf)) {\n        fprintf(stderr,\"get_file_data: cannot read file description block\\n\");\n        return(-1);\n    }\n    /* get values */\n    ent->size = READBE32(&blockbuf.filelen);\n    ent->extents = READBE16(&blockbuf.extents);\n    ent->flags = 0;\n    for (i=0, ext_blocks=0; i<ent->extents && i<38; i++)\n        ext_blocks += READBE16(&blockbuf.extentlist[i].numsecs);\n    ext_blocks++;  /* account for file description block */\n    alloc_size = ext_blocks << 8;\n    ent->alloc_size = alloc_size;\n    return(0);\n}\n\n/* returns 0 for success, -1 for error */\nint get_dir(FILE *floppy,struct m20dir **m20dir)\n{\n    cpg_u32_t ce;\n    int i,j;\n    int dirsize = M20DIR_SIZE;\n    struct dir_sector blockbuf;\n\n#ifdef DEBUG\n    fprintf(stderr,\"get_dir(): entered\\n\");\n#endif\n\n    *m20dir = malloc(dirsize);   /* allocate space for directory table */\n    if (! *m20dir) {\n        fprintf(stderr,\"get_dir: malloc failed!\\n\");\n        return(-1);\n    }\n    memset(*m20dir,0,M20DIR_SIZE);\n\n    /* read all directory blocks until a filename starting with 0xff 0xff is encountered */\n    for (i = 0;  i < PCOS_NUM_DIR_BLOCKS; i++) {  /* all directory blocks */\n        /* read block */\n        if (read_phys_block(floppy,0x202 + i,(void *)&blockbuf)) {\n            fprintf(stderr,\"get_dir: cannot read dir block\\n\");\n            return(-1);\n        }\n        for (j = 0; j < PCOS_DIR_ENTRIES_BLOCK; j++) {  /* all files in 1 block */\n            if (blockbuf.files[j].name[0] == 0xff) {\n                /* if 2nd char also is 0xff, end of used directory structure has been reached */\n                if (blockbuf.files[j].name[1] == 0xff) {\n                    goto done;  /* end of used directory sectors */\n                }\n                /* deleted entry */\n                continue;\n            }\n            ce = (*m20dir)->entries;\n            strcpy((*m20dir)->files[ce].name,blockbuf.files[j].name);\n            (*m20dir)->files[ce].startsec = READBE16(&blockbuf.files[j].startsec);\n            if (get_file_data(floppy,&((*m20dir)->files[ce]))) {\n                fprintf(stderr,\"get_dir: get_file_data failed\\n\");\n                return(-1);\n            }\n            (*m20dir)->entries++;\n        }\n    }\n    /* if we enter this loop,\n     * main directory chunk has been extended to file blocks area,\n     * because directory is too big\n     */\n    while (blockbuf.link != 0xffffffff) {\n        if (read_file_block(floppy,READBE32(&blockbuf.link),(void *)&blockbuf)) {\n            fprintf(stderr,\"get_dir: cannot read dir block (2)\\n\");\n            return(-1);\n        }\n        *m20dir = realloc(*m20dir,dirsize + PCOS_DIR_ENTRIES_BLOCK * sizeof(struct m20dir_entry));\n        if (! *m20dir) {\n            fprintf(stderr,\"cannot realloc memory: %s\\n\",strerror(errno));\n            return(-1);\n        }\n        dirsize += PCOS_DIR_ENTRIES_BLOCK * sizeof(struct m20dir_entry);\n/* --- same as above, simple block copy --- */\n        for (j = 0; j < PCOS_DIR_ENTRIES_BLOCK; j++) {  /* all files in 1 block */\n            if (blockbuf.files[j].name[0] == 0xff) {\n                /* if 2nd char also is 0xff, end of used directory structure has been reached */\n                if (blockbuf.files[j].name[1] == 0xff) {\n                    goto done;  /* end of used directory sectors */\n                }\n                /* deleted entry */\n                continue;\n            }\n            ce = (*m20dir)->entries;\n            strcpy((*m20dir)->files[ce].name,blockbuf.files[j].name);\n            (*m20dir)->files[ce].startsec = READBE16(&blockbuf.files[j].startsec);\n            if (get_file_data(floppy,&((*m20dir)->files[ce]))) {\n                fprintf(stderr,\"get_dir: get_file_data failed\\n\");\n                return(-1);\n            }\n            (*m20dir)->entries++;\n        }\n/* --- */\n    }\n  done:\n#ifdef DEBUG\n    fprintf(stderr,\"get_dir(): leave\\n\");\n#endif\n    return(0);\n}\n\n/* returns 0 for success, -1 for error */\nint get_file(FILE *floppy,struct m20dir_entry *srcfile,FILE *destfile)\n{\n    cpg_u32_t size,extents,startblk,writesize,curpos;\n    struct file_header hdrbuf;\n    cpg_u16_t extblocks;\n    cpg_u8_t *transbuf;\n    int i;\n\n    transbuf = malloc(300000);\n    if (! transbuf) {\n        fprintf(stderr,\"get_file: cannot allocate memory: %s\\n\",strerror(errno));\n        return(-1);\n    }\n    if (read_file_block(floppy,srcfile->startsec,(void *)&hdrbuf)) {\n        fprintf(stderr,\"get_file: cannot read file description block\\n\");\n        return(-1);\n    }\n    /* get values */\n    size = READBE32(&hdrbuf.filelen);\n    extents = READBE16(&hdrbuf.extents);\n\n#ifdef DEBUG\n    printf(\"start sector: %lu, file size %lu, extents: %lu\\n\",\n           (unsigned long)srcfile->startsec,(unsigned long)size,(unsigned long)extents);\n#endif\n\n    for (i=0,curpos=0; i<extents && curpos<size; i++) {\n        /* read extent */\n        extblocks = READBE16(&hdrbuf.extentlist[i].numsecs);\n        startblk = READBE32(&hdrbuf.extentlist[i].startsec);\n#ifdef DEBUG\n        printf(\"extent: start block: %lu, # of blocks = %lu\\n\",(unsigned long)startblk,(unsigned long)extblocks);\n#endif\n        if ((extblocks << 8) > 300000) {\n            fprintf(stderr,\"file too big: %lu\\n\",(unsigned long)(extblocks << 8));\n            return(-1);\n        }\n        if (read_file_blocks(floppy,startblk,extblocks,transbuf)) {\n            fprintf(stderr,\"get_file: cannot read file contents\\n\");\n            return(-1);\n        }\n        /* if it's the last extent, adjust write size to real file len */\n        writesize = extblocks << 8;\n        if (curpos + writesize > size) {\n#ifdef DEBUG\n            fprintf(stderr,\"get_file: length from extents: %u, length from header: %u\\n\",\n                    curpos + writesize,size);\n#endif\n            writesize = size - curpos;\n        }\n#ifdef DEBUG\n        printf(\"writesize: %d\\n\",writesize);\n#endif\n        if (fwrite(transbuf,writesize,1,destfile) != 1) {\n            fprintf(stderr,\"get_file: cannot write: %s\\n\",strerror(errno));\n            return(-1);\n        }\n        curpos += writesize;\n    }\n    return(0);\n}\n\n#define is_blk_free(x,y) \\\n    (!(*(((cpg_u8_t *)(x))+((y)>>3)) & (0x80>>((y)&7))))\n\n#define clr_blk(x,y) \\\n    do { *(((cpg_u8_t *)(x))+((y)>>3)) &= ~(0x80>>((y)&7)); } while (0)\n\n#define set_blk(x,y) \\\n    do { *(((cpg_u8_t *)(x))+((y)>>3)) |= (0x80>>((y)&7)); } while (0)\n\nstatic void CPG_INLINE clr_blk_bits(struct disk_header *dskhdr,cpg_u32_t sect,cpg_u16_t numsec)\n{\n    int i;\n    cpg_u8_t *bfl = dskhdr->bfl;\n    for (i=sect; i<sect+numsec; i++) clr_blk(bfl,i);\n}\n\nvoid CPG_INLINE set_blk_bits(struct disk_header *dskhdr,cpg_u32_t sect,cpg_u16_t numsec)\n{\n    int i;\n    cpg_u8_t *bfl = dskhdr->bfl;\n    for (i=sect; i<sect+numsec; i++) set_blk(bfl,i);\n}\n\n/* return # of free blocks and opt. biggest chunk of free blocks */\nint get_free_blocks(struct disk_header *dskhdr,int *max_free,int *max_free_num)\n{\n    int free_blocks = 0;\n    int max_free_blocks = 0;\n    int max_free_blk_num = 0;\n    int cur_free_blocks = 0;\n    int cur_free_blk_num = 0;\n    int last_free = FALSE;\n    int prev_free = FALSE;\n    int i;\n\n#ifdef DEBUG\n    printf(\"Block bitmap:\\n\");\n    for (i=0; i<NUM_FILE_BLOCKS; i++) {\n        printf(\"0x%02x \",dskhdr->bfl[i]);\n        if ((i & 15) == 15) printf(\"\\n\");\n    }\n    printf(\"\\n\");\n#endif\n\n    for (i=0; i<NUM_FILE_BLOCKS*8; i++) {\n        if (is_blk_free(dskhdr->bfl,i)) {\n            free_blocks++;\n            cur_free_blocks++;\n            if (! prev_free) {\n                prev_free = TRUE;\n                cur_free_blk_num = i;\n            }\n            last_free = TRUE;\n        }\n        else {\n            if (prev_free) {\n                if (cur_free_blocks > max_free_blocks) {\n                    max_free_blocks = cur_free_blocks;\n                    max_free_blk_num = cur_free_blk_num;\n                }\n            }\n            cur_free_blocks = cur_free_blk_num = 0;\n            prev_free = FALSE;\n            last_free = FALSE;\n        }\n    }\n    if (last_free && prev_free) {\n        if (cur_free_blocks > max_free_blocks) {\n            max_free_blocks = cur_free_blocks;\n            max_free_blk_num = cur_free_blk_num;\n        }\n    }\n    if (max_free) *max_free = max_free_blocks;\n    if (max_free_num) *max_free_num = max_free_blk_num;\n    return(free_blocks);\n}\n\n/* returns 0 for success, -1 for error */\nint rm_file(FILE *floppy,struct m20dir_entry *ent,struct disk_header *dskhdr,int flag)\n{\n    cpg_u32_t sect;\n    cpg_u16_t numsec;\n    struct file_header blockbuf;\n    int i;\n\n    /* read file descrition block */\n    if (read_file_block(floppy,ent->startsec,(void *)&blockbuf)) {\n        fprintf(stderr,\"rm file: cannot read file description block\\n\");\n        return(-1);\n    }\n\n    /* clear blocks from block free bitmap */\n    for (i=0; i<ent->extents; i++) {  /* for all extents */\n        sect = READBE32(&blockbuf.extentlist[i].startsec);\n        numsec = READBE16(&blockbuf.extentlist[i].numsecs);\n        clr_blk_bits(dskhdr,sect,numsec);  /* clear the bits */\n    }\n    /* clear file description block from block free bitmap */\n    clr_blk_bits(dskhdr,ent->startsec,1);\n\n    if (flag == RM_DIR_ENTRY) {\n        /* disable entry in the directory */\n        if (rm_dir_name(floppy,ent)) {\n            fprintf(stderr,\"rm_file: rm_dir_name failed!\\n\");\n            return(1);\n        }\n    }\n\n    return(0);\n}\n\n#ifdef DEBUG\n\nvoid dumpbuf(cpg_u8_t *data,int bufnum)\n{\n    int i;\n    printf(\"\\nDUMP OF BUFFER %d (0x%x)\\n\",bufnum,bufnum);\n    for (i=0; i<256; i++) {\n        if (!(i&15)) printf(\"\\n%02X - \",i);\n        printf(\"%02X \",*(data+i));\n    }\n    printf(\"\\n\");\n}\n\n#endif\n\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/util.h",
    "content": "/* $Id: util.h,v 1.7 2006/04/05 18:55:05 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: utility routines declarations\n * Copyright (C) 2000,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __UTIL_H__\n#define __UTIL_H__\n\n/* flags for rm_file */\n#define RM_DIR_ENTRY   0\n#define KEEP_DIR_ENTRY 1\n\nextern int get_dir(FILE *,struct m20dir **);\nextern int get_file(FILE *,struct m20dir_entry *,FILE *);\nextern int get_free_blocks(struct disk_header *,int *,int *);\nextern int rm_file(FILE *,struct m20dir_entry *,struct disk_header *,int);\nextern int find_dir_name(FILE *,struct m20dir_entry *,int *,int *,cpg_u32_t *,struct dir_sector *);\nextern int find_empty_dirent(FILE *,int *,int *,cpg_u32_t *,struct dir_sector *);\n// extern void CPG_INLINE set_blk_bits(struct disk_header *,cpg_u32_t,cpg_u16_t);\nextern void set_blk_bits(struct disk_header *,cpg_u32_t,cpg_u16_t);\n\n#ifdef DEBUG\nextern void dumpbuf(cpg_u8_t *,int);\n#endif\n\n#endif /* #ifndef __UTIL_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/olivetti_m20/m20floppy-0.61/version.h",
    "content": "/* $Id: version.h,v 1.13 2006/10/30 20:06:53 chris Exp $\n *\n * Olivetti M20 PCOS diskette access utility: version information\n * Copyright (C) 2000,2001,2004,2006 by Christian Groessler\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; see the file COPYING.  If not, write\n * to the Free Software Foundation, 51 Franklin Street - Fifth Floor,\n * Boston, MA 02110-1301, USA.\n */\n\n#ifndef __VERSION_H__\n#define __VERSION_H__\n\n#define MAJOR_VERSION 0\n#define MINOR_VERSION 61\n#define VERSION_ASCII \"0.61\"\n\n#define COPYRIGHT_STRING \"Copyright 2000,2001,2004,2006 Christian Groessler <chris@groessler.org>\"\n\n#endif /* #ifndef __VERSION_H__ */\n/* Local Variables: */\n/* c-file-style: \"cpg\" */\n/* c-basic-offset: 4 */\n/* End: */\n"
  },
  {
    "path": "tools/ti99/cart_header.asm",
    "content": "# GROM header\n  byte 0xAA, 0x01, 0x00, 0x00\n\n# Start of power-up chain (unused)\n  data 0x0000\n\n# Start of program chain\n  data program_record\n\n# Start of DSR chain (unused)\n  data 0x0000 \n\n# Start of subprogram list (unused)\n# This doubles as the terminator of the program chain\nprogram_record:\n  data  0x0000    # Next program chain record\n  data  _start    # Entry point for program\n  nstring \"XCHASE\"  # Name of program\n  even\n"
  },
  {
    "path": "tools/ti99/crt0.c",
    "content": "/* Entry point for C runtime initilization code\n*\n* This will set initial values for data memory and otherwise create\n* the conditions needed for the C environment */\nextern int main(void);\n\n#ifdef __cplusplus\nextern \"C\"\n#endif\n\nvoid _start2(void)\n{\n  /* Fill .data section with initial values */\n  {\n    extern int __VAL_START;\n    extern int __DATA_START;\n    extern int __DATA_END;\n    char *src = (char*)&__VAL_START;\n    char *dst = (char*)&__DATA_START;\n    while(dst < (char*)&__DATA_END)\n    {\n      *dst++ = *src++;\n    }\n  } \n\n  /* Erase .bss section */\n  {\n    extern int __BSS_START;\n    extern int __BSS_END;\n    char *dst = (char*)&__BSS_START;\n    while(dst < (char*)&__BSS_END)\n    {\n      *dst++ = 0;\n    }\n  }\n\n#ifdef __cplusplus\n  /* Call all initial constructors.\n  * The .ctors section is filled with function pointers to constructors. \n  * Iterate through them and call each function. */\n  {\n    extern int __CTOR_START;\n    extern int __CTOR_END;\n    typedef void(*funcptr)(void);\n    funcptr *ctor = (funcptr*)&__CTOR_START;\n    while(ctor < (funcptr*)&__CTOR_END)\n    {\n      (*(ctor++))();\n    }\n  }\n#endif\n\n  /* Start running C code */\n  main();\n\n  /* We cannot properly handle a return from C code.\n  * Instead, just spin here until the console is reset */\n  while(1);\n}\n\n#ifdef __cplusplus\nextern \"C\"\n#endif\nvoid _start(void)\n{\n  /* Disable interrupts\n  *\n  * This will disable console reset via keyboard, music playback,\n  * sprite automotion, etc. But will make the environment much simpler\n  * to work in. Users can re-enable interrupts later if they wish. */\n  asm(\"\\tlimi 0\");\n\n  /* Set initial workspace\n  *\n  * The registers will be located at the start of scratchpad memory */\n  asm(\"\\tlwpi >8300\");\n\n  /* Create the stack before declaring any variables */\n  asm(\"\\tli sp, >4000\");\n\n  /* Call the second part directly to prevent a stack for this function */\n  asm(\"\\tb @_start2\");\n}\n\n\n"
  },
  {
    "path": "tools/ti99/crt0_ea5.asm",
    "content": " def _start\n def _init_data\n\n# Entry point for C runtime initilization code\n#\n# This will set initial values for data memory and otherwise create\n# the conditions needed for the C environment\n_start:\n\n# Disable interrupts\n#\n# This will disable console reset via keyboard, music playback,\n# sprite automotion, etc. But will make the environment much simpler\n# to work in. Users can re-enable interrupts later if they wish.\n  limi 0\n\n# Set initial workspace\n#\n# The registers will be located at the start of scratchpad memory \n  lwpi >8300\n\n# Initialize data segment to known values\n  li   r0, _init_data  # Point to data initialization structure\n  mov  *r0+, r1        # R1 = Start of data section\n  mov  *r0+, r2        # R2 = Location of initial data\n  mov  *r0+, r3        # R3 = Size of data section\n  jeq  data_copy_end   # If size is 0, skip the loop\n  \n  # Copy loop for data initialization\ndata_copy_top:\n  mov  *r2+, *r1+      \n  dect r3\n  jgt  data_copy_top\ndata_copy_end:\n\n# Initialize BSS segment to zeroes\n  mov  *r0+, r1        # R1 = Start of BSS section\n  mov  *r0, r2         # R2 = Size of BSS section\n  jeq  bss_clear_end   # If size is 0, skip the loop\n\n  # Clearing loop for BSS initialization\nbss_clear_top:\n  clr  *r1+\n  dect r2\n  jgt  bss_clear_top\nbss_clear_end:\n\n# zero the 'zero value' at >8320\n  clr @>8320\n\n# Create the stack\n  li sp, >4000\n\n# Start running C code\n  bl @main\n\n# reset the console on return\n  blwp @>0000\n\n\n# Data initialization structure\n#\n# This structure will be filled in by the ELF conversion program\n# after link time.\n_init_data:\n  data   # Start of data section\n  data   # Location of initial contents of data section\n  data   # Size of data section\n  data   # Start of BSS section\n  data   # Size of BSS section\n\n"
  },
  {
    "path": "tools/ti99/ea5split/Makefile",
    "content": "all:\r\n\tgcc ea5split.c -o ea5split\r\n\r\nclean:\r\n\trm ea5split\r\n"
  },
  {
    "path": "tools/ti99/ea5split/ea5split.c",
    "content": "#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <ctype.h>\r\n\r\nchar header[128]=\" TIFILES\";\r\nchar empty_sector[256];\r\n\r\nvoid write16(FILE* f,int v) {\r\n\tchar c[2];\r\n\tc[0]=v>>8;\r\n\tc[1]=v&0xFF;\r\n\tfwrite(c,2,1,f);\r\n}\r\n\r\nvoid generate_header(int sectors,char eof_offset) {\r\n\theader[0]=7;\r\n\tint i;\r\n\tfor(i=8;i<=128;i++)header[i]=0;\r\n\theader[8]=sectors/256;\r\n\theader[9]=sectors&0xFF;\r\n\theader[10]=1;\r\n\theader[12]=eof_offset;\r\n}\r\n\r\nvoid str_toupper(char* s) {\r\n\tint l=strlen(s);\r\n\tint i;\r\n\tfor(i=0;i<l;i++)s[i]=toupper(s[i]);\r\n}\r\n\r\nint main(int argc,char** argv) {\r\n\tif(argc!=2) {\r\n\t\tprintf(\"Usage:\\n\");\r\n\t\tprintf(\"ea5split <ea5_file>\\n\");\r\n\t\treturn(1);\r\n\t}\r\n\r\n\tFILE* f;\r\n\tf=fopen(argv[1],\"rb\");\r\n\tif(f==NULL) {\r\n\t\tprintf(\"Cannot open \\\"%s\\\"\\n\",argv[1]);\r\n\t\treturn(1);\r\n\t}\r\n\tfseek(f,0,SEEK_END);\r\n\tint l=ftell(f);\r\n\tfseek(f,0,SEEK_SET);\r\n\t\r\n\tunsigned char* data=malloc(l);\r\n\tfread(data,l,1,f);\r\n\tfclose(f);\r\n\t\r\n\tint load_address=data[4]*256+data[5];\r\n\tint end_address=load_address+l-6-1;\r\n\tif(end_address>0xFFFF || end_address>0x3FFF && end_address<0xA000) {\r\n\t\tprintf(\"Program loaded outside expansion RAM\\n\");\r\n\t\tfree(data);\r\n\t\treturn(1);\r\n\t}\r\n\t\r\n\tchar* ext=strchr(argv[1],'.');\r\n\tchar* name=malloc(strlen(argv[1])+1);\r\n\tstrcpy(name,argv[1]);\r\n\tif(ext!=NULL)name[ext-argv[1]]='\\0';\r\n\r\n\r\n\tint files_number=(l-6)/(0x2000-6);\r\n\tif((l-6)%(0x2000-6))files_number++;\r\n\tstr_toupper(name);\r\n\tint name_l=strlen(name);\r\n\tchar c=name[name_l-1]+files_number-1;\r\n\tif(c>'Z' && c<'a' || c>'z') {\r\n\t\tname[name_l]='1';\r\n\t\tname[name_l+1]='\\0';\r\n\t}\r\n\t\r\n\tchar* filename=malloc(strlen(name));\r\n\t\r\n\tint i,l2,l3,offset,sect,i2;\r\n\tfor(i=0;i<256;i++)empty_sector[i]=0;\r\n\toffset=6;\r\n\tfor(i=0;i<files_number;i++) {\r\n\t\tstrcpy(filename,name);\r\n\t\t\r\n\t\tl2=l-offset;\r\n\t\tif(l2>0x2000-6) {\r\n\t\t\tl2=0x2000-6;\r\n\t\t\tl3=0x2000;\r\n\t\t}\r\n\t\telse l3=l2+6;\r\n\t\tif(l3%256)sect=l3/256+1;\r\n\t\telse sect=l3/256;\r\n\t\tgenerate_header(sect,l3%256);\r\n\t\t\r\n\t\tf=fopen(filename,\"wb\");\r\n\t\tfwrite(header,128,1,f);\r\n\t\tif(i==files_number-1)write16(f,0x0000);\r\n\t\telse write16(f,0xFFFF);\r\n\t\twrite16(f,l2);\r\n\t\twrite16(f,load_address);\r\n\t\tfwrite(data+offset,l2,1,f);\r\n\t\tl3=(l2+6)%256;\r\n\t\tif(l3)fwrite(empty_sector,256-l3,1,f);\r\n\t\tfclose(f);\r\n\t\t\r\n\t\tload_address+=l2;\r\n\t\toffset+=l2;\r\n\t\tname[strlen(name)-1]++;\r\n\t}\r\n\t\r\n\tfree(name);\r\n\tfree(data);\r\n\tfree(filename);\r\n\r\n\treturn(0);\r\n}\r\n"
  },
  {
    "path": "tools/ti99/ea5tocart.txt",
    "content": "java -jar ../tools/ti99/ea5tocart.jar ../build/XTREX1 \"Stinger\"\r\n"
  },
  {
    "path": "tools/ti99/elf2ea5/Makefile",
    "content": "all:\n\tgcc elf2ea5.c -o elf2ea5\n\nclean:\n\trm elf2ea5\n\n"
  },
  {
    "path": "tools/ti99/elf2ea5/elf.h",
    "content": "// This code is based on version 1.2 of the ELF specification\n\n\n#ifndef ELFFORMAT_H\n#define ELFFORMAT_H\n\n/*\n *******************************************************************************\n *                               Header Files\n *******************************************************************************\n */\n\n\n/*\n *******************************************************************************\n *                             Defined Constants\n *******************************************************************************\n */\n\n// Size of the ELF identification string\n#define EI_NIDENT 16\n\n\n// These are indexes into the ELF file header \"e_ident\" arra\nenum\n{\n   EI_MAG0    = 0,  // File identification (0x7F)\n   EI_MAG1    = 1,  // File identification ('E')\n   EI_MAG2    = 2,  // File identification ('L')\n   EI_MAG3    = 3,  // File identification ('F')\n   EI_CLASS   = 4,  // File class\n   EI_DATA    = 5,  // Data encoding\n   EI_VERSION = 6,  // File version\n   EI_PAD     = 7   // Start of padding bytes\n};\n\n// These are values for the Elf32_Ehdr.e_ident[EI_CLASS] record\nenum\n{\n   ELFCLASSNONE = 0,  // Invalid class\n   ELFCLASS32   = 1,  // 32-bit objects\n   ELFCLASS64   = 2   // 64-bit objects\n};\n\n// These are values for the Elf32_Ehdr.e_ident[EI_DATA] record\nenum\n{\n   ELFDATANONE = 0,  // Invalid data encoding\n   ELFDATA2LSB = 1,  // Data stored in LSB format (0x01020304 -> [04][03][02][01])\n   ELFDATA2MSB = 2,  // Data stored in MSB format (0x01020304 -> [01][02][03][04])\n};\n\n// These are special section ID numbers\nenum\n{\n   SHN_UNDEF     = 0,       // An unused or undefined section\n   SHN_LORESERVE = 0xff00,  // Lower limit of reserved section ID's\n   SHN_LOPROC    = 0xff00,  // Lower limit of processor-specific section ID's\n   SHN_HIPROC    = 0xff1f,  // Upper limit of processor-specific section ID's\n   SHN_ABS       = 0xfff1,  // Symbols located reletive to ABS cannot be relocated\n   SHN_COMMON    = 0xfff2,  // Symbols located relative to COMMON are treated as unallocated global data\n   SHN_HIRESERVE = 0xffff   // Upper limit of reserved section ID's\n};\n\n// Section type ID's\nenum\n{\n   SHT_NULL     = 0,           // Section is unused\n   SHT_PROGBITS = 1,           // Section holds program data\n   SHT_SYMTAB   = 2,           // Section holds a symbol table\n   SHT_STRTAB   = 3,           // Section holds a string table\n   SHT_RELA     = 4,           // Section holds relocation info with explicit addends\n   SHT_HASH     = 5,           // Section holds symbol hash table\n   SHT_DYNAMIC  = 6,           // Section holds dynamic linking information\n   SHT_NOTE     = 7,           // Section holds note information\n   SHT_NOBITS   = 8,           // Section occupies no space in the file\n   SHT_REL      = 9,           // Section holds relocation info without explicit addends\n   SHT_SHLIB    = 10,          // Undefined usage\n   SHT_DYNSYM   = 11,          // Undefined usage\n   SHT_LOPROC   = 0x70000000,  // Lower bound on sections with processor-specific usage \n   SHT_HIPROC   = 0x7fffffff,  // Upper bound on sections with processor-specific usage \n   SHT_LOUSER   = 0x80000000,  // Lower bound on sections for application usage \n   SHT_HIUSER   = 0xffffffff   // Upper bound on sections for application usage \n};\n\n// These are section attribute flags\nenum\n{\n   SHF_WRITE     = 0x1,        // Section is writable \n   SHF_ALLOC     = 0x2,        // Allocate memory for this section\n   SHF_EXECINSTR = 0x4,        // Section is executable\n   SHF_MASKPROC  = 0xf0000000  // Mask of processor-specific flags\n};\n\n// These are symbol binding ID's (stored in upper 4 bits of Elf32_Sym.st_info)\nenum\n{\n   STB_LOCAL  = 0,   // Symbol is local to this file\n   STB_GLOBAL = 1,   // Symbol is visible to other files\n   STB_WEAK   = 2,   // Similar to GLOBAL, but lower precedence\n   STB_LOPROC = 13,  // Lower limit for processor-specific types\n   STB_HIPROC = 15   // Upper limit for processor-specific types\n};\n\n// These are symbol type ID's (stored in lower 4 bits of Elf32_Sym.st_info)\nenum\n{\n   STT_NOTYPE  = 0,   // Type not specified\n   STT_OBJECT  = 1,   // This is a data object\n   STT_FUNC    = 2,   // This is a function or executable code\n   STT_SECTION = 3,   // This is a section \n   STT_FILE    = 4,   // The source code file for this object file\n   STT_LOPROC  = 13,  // Lower limit for processor-specific bindings\n   STT_HIPROC  = 15   // Upper limit for processor-specific bindings\n};\n\n// These are relocation type ID's (derived from existing object files, possibly incorrect or incomplete)\nenum\n{\n   R_PPC_REL14     = 0x0B,  // A 14-bit relative address, as used in conditional branch instructions\n   R_PPC_REL24     = 0x0A,  // A 24-bit relative address, as used in unconditional branch instructions\n   R_PPC_ADDR16_HA = 0x06,  // The upper 16-bits of an absolute address\n   R_PPC_ADDR16_LO = 0x04,  // The lower 16-bits of an absolute address\n   R_PPC_ADDR32    = 0x01   // A full 32-bit absolute address\n};\n\n\n/*\n *******************************************************************************\n *                                Data Types\n *******************************************************************************\n */\n\ntypedef unsigned int   Elf32_Addr;   // Unsigned program address\ntypedef unsigned short Elf32_Half;   // Unsigned medium integer\ntypedef unsigned int   Elf32_Off;    // Unsigned file offset\ntypedef int            Elf32_Sword;  // Signed large integer\ntypedef unsigned int   Elf32_Word;   // Unsigned large integer\n\n// This defines the ELF header\ntypedef struct \n{\n   unsigned char e_ident[EI_NIDENT];  // Elf header identifier\n   Elf32_Half    e_type;              // Object file type\n   Elf32_Half    e_machine;           // Machine archetecture ID\n   Elf32_Word    e_version;           // ELF version number\n   Elf32_Addr    e_entry;             // Virtual address of entry point\n   Elf32_Off     e_phoff;             // File index to program header table\n   Elf32_Off     e_shoff;             // File index to section header table\n   Elf32_Word    e_flags;             // Processor specific flags\n   Elf32_Half    e_ehsize;            // Size of the ELF header\n   Elf32_Half    e_phentsize;         // Size of a program header entry\n   Elf32_Half    e_phnum;             // Number of program header entries\n   Elf32_Half    e_shentsize;         // Size of a section header entry\n   Elf32_Half    e_shnum;             // Number of section header entries\n   Elf32_Half    e_shstrndx;          // Section index for section header string table\n} Elf32_Ehdr;\n\n// This defines a section header entry\ntypedef struct \n{\n   Elf32_Word sh_name;       // Index in the string table of this section's name\n   Elf32_Word sh_type;       // Section type ID\n   Elf32_Word sh_flags;      // Section flags\n   Elf32_Addr sh_addr;       // Address at which this section appears in process memory\n   Elf32_Off  sh_offset;     // File index to start of the section\n   Elf32_Word sh_size;       // Size of this section in the file\n   Elf32_Word sh_link;       // Section index link\n   Elf32_Word sh_info;       // Extra section info\n   Elf32_Word sh_addralign;  // Alignment constraints\n   Elf32_Word sh_entsize;    // Size of fixed-size entries (if any) in this section\n} Elf32_Shdr;\n\n// This defines a symbol table entry\ntypedef struct \n{\n   Elf32_Word    st_name;    // Index in the string table of this section's name\n   Elf32_Addr    st_value;   // In relocatable files, this is the alignment of \n                             // the symbol if it is in a COMMON section. \n                             // Otherwise, this is the offset to the symbol from\n                             // the start of the section\n                             // In exectuable and shared object files, this is\n                             // the virtual address of this symbol.\n\n   Elf32_Word    st_size;    // Size of the object\n   unsigned char st_info;    // Binding << 4 | Type \n   unsigned char st_other;   // Undefined, not used\n   Elf32_Half    st_shndx;   // Index of section this object is in\n} Elf32_Sym;\n\n// This defines a relocation record for REL sections\ntypedef struct \n{\n   Elf32_Addr r_offset;  // Executables or shared object: virtual address to fixup\n                         // Others: Offset from section start to fixup\n   Elf32_Word r_info;    // Symbol index << 8 | Type\n} Elf32_Rel;\n\n// This defines a relocation record for RELA sections\ntypedef struct\n{\n   Elf32_Addr  r_offset;  // Executables or shared object: virtual address to fixup\n                          // Others: Offset from section start to fixup\n   Elf32_Word  r_info;    // Symbol index << 8 | Type\n   Elf32_Sword r_addend;  // Value to add to the fixup value\n} Elf32_Rela;\n\n\n#endif\n"
  },
  {
    "path": "tools/ti99/elf2ea5/elf2ea5.c",
    "content": "/*\nThis code is based on version 1.2 of the ELF specification\n\nThis program converts an ELF32 source file for a TMS9900 target into a\nTI99/4A EA5 binary file.\n\nThis is done by copying the .text and .data sections to the output file.\nThe .text section is placed at the start of the file, and the .data section\nis placed immediately after that.\n\nAssumptions:\n\nThe entry point for the executable is at the start of the .text ssection.\nThere is a \"_init_data\" symbol followed by space for a ten byte record.\nThat record holds the data required to initialize the .data and.bss \nsections once the EA5 image has been loaded.\n*/\n\n\n/*\n ****************************************************************************\n *                                Header Files\n ****************************************************************************\n */\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include \"elf.h\"\n\n\n/*\n ****************************************************************************\n *                                Data Types\n ****************************************************************************\n */\n\n// Structure used to store initialization data\ntypedef struct\n{\n   short data_addr;    // Start of data section\n   short data_src;     // Location of initial contents of data section\n   short data_size;    // Size of data section\n   short bss_addr;     // Start of BSS section\n   short bss_size;     // Size of BSS section\n} init_data_struct;\n\n\n/*\n ****************************************************************************\n *                            Function Prototypes\n ****************************************************************************\n */\n\nstatic unsigned int   reverseBytes4(unsigned int value);\nstatic unsigned short reverseBytes2(unsigned short value);\nstatic unsigned int   dontReverseBytes4(unsigned int value);\nstatic unsigned short dontReverseBytes2(unsigned short value);\n\nstatic void convertElfHeader(Elf32_Ehdr *ptr);\nstatic void convertSymbolEntry(Elf32_Sym *ptr);\nstatic void convertSectionHeader(Elf32_Shdr *ptr);\n\n\n/*\n ****************************************************************************\n *                                Global Data\n ****************************************************************************\n */\n\n// Pointers to file data translation functions, assume no translation needed\nstatic unsigned int   (*convert4)(unsigned int value)   = dontReverseBytes4;\nstatic unsigned short (*convert2)(unsigned short value) = dontReverseBytes2;\n\nstatic Elf32_Ehdr  header;  // The ELF header for this file\n\n\n/*\n ****************************************************************************\n *                                   Code\n ****************************************************************************\n */\n\n\n/*===========================================================================\n *                                copy_block\n *===========================================================================\n * Description: Copy a block of data\n *\n * Parameters:  input  - Input file\n *              output - Output file\n *              size   - Number of bytes to copy\n *\n * Returns:     1 - None\n */\nint copy_block(FILE* input, FILE* output, int size)\n{\n   char buffer[1024];\n   int readsize = 1024;\n\n   if(size < readsize) readsize = size;\n   while(size >= readsize && size > 0)\n   {\n      if(fread(buffer, readsize, 1, input) <= 0)\n      {\n         return(0);               \n      }\n      fwrite(buffer, readsize, 1, output);\n      size -= readsize;\n      if(size < readsize) readsize = size;\n   }\n   return(1);\n}\n\n\n/*\n *===========================================================================\n *                                main\n *===========================================================================\n * Description: Entry point for program\n *\n * Parameters:  argc - Number of arguments\n *              argv - Argument list\n *\n * Returns:     \n */\nint main(int argc, char **argv)\n{\n   FILE       *input;         // The currently open ELF file\n   FILE       *output;        // The output file\n   Elf32_Shdr *all_sections;  // Section header entry\n   Elf32_Shdr *section;       // Section header entry\n   int         i;             // Section entry counter\n   Elf32_Sym   symbol;        // Symbol table entry\n   char *strtab;              // Copy of the string table\n   int init_data_addr = 0;    // Address of \"_init_data\" symbol\n\n   Elf32_Shdr *text_section   = NULL;\n   Elf32_Shdr *data_section   = NULL;\n   Elf32_Shdr *bss_section    = NULL;\n   Elf32_Shdr *symtab_section = NULL;\n   Elf32_Shdr *strtab_section = NULL;\n\n   int size;\n   init_data_struct init_data;\n   short ea5_header[3];\n   int image_size;\n\n   // Check arguments\n   if(argc < 3)\n   {\n      printf(\"Usage:\\n\");\n      printf(\"elf2cart <elf_file> <cart_file>\\n\");\n      printf(\"\\n\");\n\n      return(1);\n   }\n\n   // Attempt to open file\n   input = fopen(argv[1], \"rb\");\n   if(input == NULL)\n   {\n      // Could not open file\n      printf(\"Cannot open \\\"%s\\\"\\n\", argv[1]);\n      return(1);\n   }\n\n   // Skip to start of the section entries\n   fseek(input, header.e_shoff, SEEK_SET);\n\n   // Read ELF header\n   if(fread(&header, sizeof(Elf32_Ehdr), 1, input) <= 0)\n   {\n      printf(\"Error: File too short, invalid ELF header\\n\");\n      return(1);\n   }\n\n   // Validate this as an ELF file\n   if(header.e_ident[0] != 0x7F ||\n      header.e_ident[1] != 'E'  ||\n      header.e_ident[2] != 'L'  ||\n      header.e_ident[3] != 'F')\n   {\n      // This is not a valid ELF file\n      printf(\"Error: Missing signature, this is not an ELF file\\n\");\n      return(1);\n   }\n\n   // Determine endianness of the file\n   if(header.e_ident[EI_DATA] == ELFDATA2MSB)\n   {\n      // We need to reverse all bytes read or saved from the file\n      convert4 = reverseBytes4;\n      convert2 = reverseBytes2;\n   }\n   else\n   {\n      // No need to reverse data, we can use it natively\n      convert4 = dontReverseBytes4;\n      convert2 = dontReverseBytes2;\n   }\n\n   // Convert the header data to native format\n   convertElfHeader(&header);\n/*\n   printf(\"\\nELF Header\\n\");\n   printf(\"====================\\n\");\n   printf(\"type      = 0x%X\\n\", header.e_type     );\n   printf(\"machine   = 0x%X\\n\", header.e_machine  );\n   printf(\"version   = 0x%X\\n\", header.e_version  );\n   printf(\"entry     = 0x%X\\n\", header.e_entry    );\n   printf(\"phoff     = 0x%X\\n\", header.e_phoff    );\n   printf(\"shoff     = 0x%X\\n\", header.e_shoff    );\n   printf(\"flags     = 0x%X\\n\", header.e_flags    );\n   printf(\"ehsize    = 0x%X\\n\", header.e_ehsize   );\n   printf(\"phentsize = 0x%X\\n\", header.e_phentsize);\n   printf(\"phnum     = 0x%X\\n\", header.e_phnum    );\n   printf(\"shentsize = 0x%X\\n\", header.e_shentsize);\n   printf(\"shnum     = 0x%X\\n\", header.e_shnum    );\n   printf(\"shstrndx  = 0x%X\\n\", header.e_shstrndx );\n*/\n   // Make sure this is a TMS9900 file\n   if(header.e_machine != 0xABBA)\n   {\n      printf(\"Error: Not for TMS9900, cannot convert\\n\");\n      return(1);\n   } \n\n   // Read the section headers\n\n   // Move file pointer to the start of the headers\n   fseek(input, header.e_shoff, SEEK_SET);\n\n   // Load all section entries\n   all_sections = malloc(header.e_shnum * sizeof(Elf32_Shdr));\n   for(i = 0; i < header.e_shnum; i++)\n   {\n      // Read in a section entry\n      section = &all_sections[i];\n      if(fread(section, sizeof(Elf32_Shdr), 1, input) <= 0)\n      {\n         printf(\"Error: Early end of file\\n\");\n         return(1);               \n      }\n\n      // Convert to native format\n      convertSectionHeader(section);\n   }\n\n   // Get section names  \n   for(i = 0; i < header.e_shnum; i++)\n   {\n      char name[64];\n      section = &all_sections[i];\n\n      fseek(input,\n            all_sections[header.e_shstrndx].sh_offset +\n            section->sh_name, SEEK_SET);\n      if(fread(name, 64, 1, input) <= 0)\n      {\n         printf(\"Error: Early end of file\\n\");\n         return(1);               \n      }      \n\n      if(strcmp(name, \".text\") == 0)     text_section   = section;\n      if(strcmp(name, \".data\") == 0)     data_section   = section;\n      if(strcmp(name, \".bss\" ) == 0)     bss_section    = section;\n      if(section->sh_type == SHT_SYMTAB) symtab_section = section;\n      if(section->sh_type == SHT_STRTAB) strtab_section = section;\n/*            \n      printf(\"\\n\\nSECTION %d\\n\",i);\n      printf(\"====================\\n\");\n      printf(\"name=%s\\n\", name);\n      printf(\"sh_name      = %d\\n\", section->sh_name     );\n      printf(\"sh_type      = %d\\n\", section->sh_type     );\n      printf(\"sh_flags     = %d\\n\", section->sh_flags    );\n      printf(\"sh_addr      = %d\\n\", section->sh_addr     );\n      printf(\"sh_offset    = %d\\n\", section->sh_offset   );\n      printf(\"sh_size      = %d\\n\", section->sh_size     );\n      printf(\"sh_link      = %d\\n\", section->sh_link     );\n      printf(\"sh_info      = %d\\n\", section->sh_info     );\n      printf(\"sh_addralign = %d\\n\", section->sh_addralign);\n      printf(\"sh_entsize   = %d\\n\", section->sh_entsize  );\n*/\n   }\n\n   // If there's no .text section, there's no code to execute\n   if(text_section == NULL)\n   {\n      printf(\"Error: No .text section found\\n\");\n      return(1);\n   }\n\n   // Build initialization structure\n   // If the .data section is located immediately after the .text \n   // section n the loaded image, no need to fill out the .data\n   // initializer fields as the TI loader will take care of that\n   // for us when it loads the EA5 file.\n   memset(&init_data, 0, sizeof(init_data_struct));\n   if(data_section != NULL &&\n      data_section->sh_addr != text_section->sh_addr +\n                               text_section->sh_size)\n   {\n      init_data.data_addr   = convert2(data_section->sh_addr);\n      init_data.data_size   = convert2(data_section->sh_size);\n      init_data.data_src    = convert2(text_section->sh_addr +\n                                       text_section->sh_size);\n   }\n   if(bss_section != NULL)\n   {\n      init_data.bss_addr    = convert2(bss_section->sh_addr);\n      init_data.bss_size    = convert2(bss_section->sh_size);\n   }\n\n   // Try to find \"_init_data\" symbol\n   if(strtab_section == NULL)\n   {\n      printf(\"Warning: No string table section found\\n\");\n      return(1);\n   }\n   else\n   {\n      // Load symbol table into memory\n      strtab = malloc(strtab_section->sh_size);\n      fseek(input, strtab_section->sh_offset, SEEK_SET);\n      if(fread(strtab, strtab_section->sh_size, 1, input) <= 0)\n      {\n         printf(\"Error: Early end of file\\n\");\n         return(1);               \n      }      \n\n      // Find \"_init_data\" symbol\n      if(symtab_section == NULL)\n      {\n         // If there is no symbol table, we can't fill out the\n         // initialization record. That might still be OK.\n         printf(\"Warning: No symbol table section found\\n\");\n      }\n      else \n      {\n         // Read through the symbol table entries \n         fseek(input, symtab_section->sh_offset, SEEK_SET);\n         for(i=0; i<symtab_section->sh_size; i+=sizeof(Elf32_Sym))\n         {\n            if(fread(&symbol, sizeof(Elf32_Sym), 1, input) <= 0)\n            {\n               printf(\"Error: Early end of file\\n\");\n               return(1);               \n            }      \n            if(strcmp(\"_init_data\", &strtab[convert4(symbol.st_name)]) == 0)\n            {\n               init_data_addr = convert4(symbol.st_value);\n               break;\n            }\n         }\n      }\n      free(strtab);\n   }\n\n   // Open output file   \n   output = fopen(argv[2], \"wb\");\n   if(output == NULL)\n   {\n      // Could not open file\n      printf(\"Error: Cannot open \\\"%s\\\"\\n\", argv[2]);\n      return(1);\n   }\n\n   // Calculate image size (.text + .data)\n   image_size = text_section->sh_size;\n   if(data_section != NULL)\n     image_size += data_section->sh_size;\n\n   // Write EA5 header\n   //\n   // The EA5 loader assumes the entry point is the load address\n   ea5_header[0] = 0;                                // Last in file chain\n   ea5_header[1] = convert2(image_size + 6);         // Image + header size\n   ea5_header[2] = convert2(text_section->sh_addr);  // Load address\n   fwrite(ea5_header, 6, 1, output);\n\n   // Copy all .text section data to \"_init_data\" symbol\n   fseek(input, text_section->sh_offset, SEEK_SET);\n   size = text_section->sh_size;\n   if(init_data_addr == 0)\n   {\n      printf(\"Warning: no \\\"_init_data\\\" symbol found\\n\");\n   }\n   else\n   {\n      if(copy_block(input, output, \n                    init_data_addr - text_section->sh_addr) == 0)\n      {\n         printf(\"Error: Early end of file\\n\");\n         return(1);               \n      }\n      // Save initialization record to the output file\n      fwrite(&init_data, sizeof(init_data_struct), 1, output);\n\n      // Skip the initialization record bytes in the input file\n      if(fread(&init_data, sizeof(init_data_struct), 1, input) <= 0)\n      {\n         printf(\"Early end of file, giving up\\n\");\n         return(1);               \n      }\n\n      // Adjust size for remaining part      \n      size -= init_data_addr - text_section->sh_addr + sizeof(init_data_struct);\n   }\n\n   // Copy all .text data after \"_init_data\" symbol\n   if(copy_block(input, output, size) == 0)\n   {\n      printf(\"Error: Early end of file\\n\");\n      return(1);               \n   }\n\n   // Copy .data section\n   if(data_section != NULL)\n   {\n      fseek(input, data_section->sh_offset, SEEK_SET);\n      if(copy_block(input, output, data_section->sh_size) == 0)\n      {\n         printf(\"Error: Early end of file\\n\");\n         return(1);               \n      }\n   }\n\n   // All done, clean up\n   fclose(input);\n   fclose(output);\n\n   return(0);\n}\n\n\n/*\n *===========================================================================\n *                               reverseBytes4\n *===========================================================================\n * Description: Reverse the order of byytes in a 4-byte value\n *\n * Parameters:  value - The value to reverse\n *\n * Returns:     int - The reversed value\n */\nstatic unsigned int reverseBytes4(unsigned int value)\n{\n   return( ((value & 0x000000FF) << 24) |\n           ((value & 0x0000FF00) << 8 ) |\n           ((value & 0x00FF0000) >> 8 ) |\n           ((value & 0xFF000000) >> 24) );\n}\n\n\n/*\n *===========================================================================\n *                               reverseBytes2\n *===========================================================================\n * Description: Reverse the order of byytes in a 2-byte value\n *\n * Parameters:  value - The value to reverse\n *\n * Returns:     int - The reversed value\n */\nstatic unsigned short reverseBytes2(unsigned short value)\n{\n   return( ((value & 0x00FF) << 8) |\n           ((value & 0xFF00) >> 8) );\n}\n\n\n/*\n *===========================================================================\n *                               dontReverseBytes4\n *===========================================================================\n * Description: Do nothing to the value, just return it\n *\n * Parameters:  value - The value to ignore\n *\n * Returns:     int - The ignored value\n */\nstatic unsigned int dontReverseBytes4(unsigned int value)\n{\n   return(value);\n}\n\n\n/*\n *===========================================================================\n *                            dontReverseBytes2\n *===========================================================================\n * Description: Do nothing to the value, just return it\n *\n * Parameters:  value - The value to ignore\n *\n * Returns:     int - The ignored value\n */\nstatic unsigned short dontReverseBytes2(unsigned short value)\n{\n   return(value);\n}\n\n\n/*\n *===========================================================================\n *                            convertElfHeader\n *===========================================================================\n * Description: Convert the ELF header to/from native format\n *\n * Parameters:  ptr - Pointer to the header\n *\n * Returns:     None\n */\nvoid convertElfHeader(Elf32_Ehdr *ptr)\n{\n   ptr->e_type      = convert2(ptr->e_type     );\n   ptr->e_machine   = convert2(ptr->e_machine  );\n   ptr->e_version   = convert4(ptr->e_version  );\n   ptr->e_entry     = convert4(ptr->e_entry    );\n   ptr->e_phoff     = convert4(ptr->e_phoff    );\n   ptr->e_shoff     = convert4(ptr->e_shoff    );\n   ptr->e_flags     = convert4(ptr->e_flags    );\n   ptr->e_ehsize    = convert2(ptr->e_ehsize   );\n   ptr->e_phentsize = convert2(ptr->e_phentsize);\n   ptr->e_phnum     = convert2(ptr->e_phnum    );\n   ptr->e_shentsize = convert2(ptr->e_shentsize);\n   ptr->e_shnum     = convert2(ptr->e_shnum    );\n   ptr->e_shstrndx  = convert2(ptr->e_shstrndx );\n}\n\n\n/*\n *===========================================================================\n *                            convertSectionHeader\n *===========================================================================\n * Description: Convert the section header to/from native format\n *\n * Parameters:  ptr - Pointer to the header\n *\n * Returns:     None\n */\nvoid convertSectionHeader(Elf32_Shdr *ptr)\n{\n   ptr->sh_name      = convert4(ptr->sh_name     );\n   ptr->sh_type      = convert4(ptr->sh_type     );\n   ptr->sh_flags     = convert4(ptr->sh_flags    );\n   ptr->sh_addr      = convert4(ptr->sh_addr     );\n   ptr->sh_offset    = convert4(ptr->sh_offset   );\n   ptr->sh_size      = convert4(ptr->sh_size     );\n   ptr->sh_link      = convert4(ptr->sh_link     );\n   ptr->sh_info      = convert4(ptr->sh_info     );\n   ptr->sh_addralign = convert4(ptr->sh_addralign);\n   ptr->sh_entsize   = convert4(ptr->sh_entsize  );\n}\n\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/.gitignore",
    "content": "*~\n\\#*\n.#*\n*.o\n*.u\n*.i\n*.s\n*.obj\n*.exe\n*.bin\n*.lis\n*.lst\n*.map\n*.sym\n*.def\n*.zip\n*.err\n*.abs\n*.reloc\n*.bac\n/asmsrc/*.c\n/asmsrc/*.h\nabcread\nabctext\nabcwrite\ndeinter\nithabs\ncasdecode\ncasencode\nbin2abc\n/autoconf/aclocal.m4\n/config.log\n/config.status\n/config/config.h\n/Makefile\n/rel\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/Makefile.in",
    "content": "MAKEFLAGS += -R -r\n\ntop_srcdir      = @top_srcdir@\nsrcdir          = @srcdir@\nVPATH           = @srcdir@\nprefix          = @prefix@\nexec_prefix     = @exec_prefix@\nbindir          = @bindir@\nmandir          = @mandir@\ndatarootdir     = @datarootdir@\n\nCC\t\t= @CC@\nCPPFLAGS\t= @CPPFLAGS@ @DEFS@ -I.\nCFLAGS\t\t= $(CPPFLAGS) @CFLAGS@\nLDFLAGS\t\t= $(CFLAGS) @LDFLAGS@\nLIBS\t\t= @LIBS@\n\nMKDIR\t\t= @MKDIR_P@\nPERL\t\t= perl\nRM_F\t\t= rm -f\nZ80ASM          = @Z80ASM@\nINSTALL         = @INSTALL@\n\nO\t\t= @OBJEXT@\nX\t\t= @EXEEXT@\n\n# Programs that may require libraries not on this system\nEXTRA_PROGS     = @EXTRA_PROGS@\n\n.SUFFIXES:\n\n.SECONDARY:\n\n.DELETE_ON_ERROR:\n\nDIRS  = . asmsrc\n\nASM    = $(wildcard asmsrc/*.asm)\nASMINC = $(wildcard asmsrc/*.inc)\nASMC   = $(ASM:.asm=.c)\nASMH   = $(ASM:.asm=.h)\nASMO   = $(ASM:.asm=.$(O))\n\n#PROGS  = abcwrite abcread deinter abctext $(EXTRA_PROGS)\n\nPROGS  = abcwrite $(EXTRA_PROGS)\nEXE    = $(patsubst %,%$(X),$(PROGS))\nHDRS   = $(wildcard *.h)\n\nall : $(EXE)\n\n%.bin %.map: %.asm $(ASMINC)\n\t$(Z80ASM) -b -l -m -s -I$(<D) $<\n\n.PHONY: asmsrc\nasmsrc: $(ASMC) $(ASMH)\n\nMKCSRC = asmsrc/mkcsrc.pl\n%.c %.h: %.bin %.map $(MKCSRC)\n\t$(PERL) $(MKCSRC) $(*F) $*.bin $*.map $*.c $*.h\n\nasmsrc/%.$(O): asmsrc/%.c asmsrc/%.h\n\n%.$(O): %.c $(HDRS)\n\t$(CC) $(CFLAGS) -c -o $@ $<\n\nabcwrite$(X): abcwrite.$(O) mangle.$(O) util.$(O) formats.$(O) \\\n\t\tabcfile.$(O) clib/dirent.$(O)\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)\n\nabcread$(X): abcread.$(O) unmangle.$(O) util.$(O) formats.$(O)\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)\n\nabctext$(X): abctext.$(O)\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)\n\ndeinter$(X): deinter.$(O) util.$(O)\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)\n\ncasdecode$(X): casdecode.$(O) unmangle.$(O)\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)\n\ncasencode$(X): casencode.$(O) mangle.$(O) unmangle.$(O) abcfile.$(O) util.$(O)\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)\n\nbac80.$(O): asmsrc/bac80.h asmsrc/bac80r.h\n\nbac800.$(O): asmsrc/bac800.h asmsrc/bac800d.h asmsrc/bac800a.h\n\nbin2abc$(X): bin2abc.$(O) ihex.$(O) abs.$(O) bas.$(O) relocs.$(O) \\\n\t\tbac80.$(O) bac800.$(O) mangle.$(O) $(ASMO)\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)\n\nclean:\n\trm -f $(EXE)\n\tfor d in $(DIRS); do \\\n\t\tfor e in .$(O) .s .i .bak '~' .lis .lst .def .sym .err; do \\\n\t\t\trm -f $${d}/*$${e} ; \\\n\t\tdone ; \\\n\t\trm -f $${d}/\\#* ; \\\n\tdone\n\nconfclean:\n\trm -f config/config.h config.*\n\nasmclean:\n\trm -f asmsrc/*.c asmsrc/*.h asmsrc/*.bin asmsrc/*.map \\\n\t      asmsrc/*.lis asmsrc/*.lst\n\nallclean: clean asmclean confclean\n\nspotless: allclean confclean\n\trm -f config/configure config/aclocal.m4 \\\n\t      config/config.h.in config/unconfig.h\n\ninstall: all\n\t$(INSTALL) $(EXE) $(bindir)\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/README.txt",
    "content": "For any program, type \"program --help\" for usage instructions.\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/_gitignore",
    "content": "*~\n\\#*\n.#*\n*.o\n*.u\n*.i\n*.s\n*.obj\n*.exe\n*.bin\n*.lis\n*.lst\n*.map\n*.sym\n*.def\n*.zip\n*.err\n*.abs\n*.reloc\n*.bac\n/asmsrc/*.c\n/asmsrc/*.h\nabcread\nabctext\nabcwrite\ndeinter\nithabs\ncasdecode\ncasencode\nbin2abc\n/autoconf/aclocal.m4\n/autoconf/helpers\n/config\n/config.log\n/config.status\n/configure\n/Makefile\n/rel\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/abcdisk.h",
    "content": "#ifndef ABCDISK_H\n#define ABCDISK_H\n\n#include \"compiler.h\"\n#include \"patchlevel.h\"\n\n/* Integer divide with rounding */\n#define DIV_ROUND(x,y) (((x)+(y)/2)/(y))\n\n/*\n * Default cassette speeds; this seems to be what ABC800 generates\n * (slightly rounded numbers.)  A real ABC80 seems slightly quicker,\n * around 750 baud, but can be interrupted by NMI generating a glitch.\n */\n#define CAS_DIVISOR_ABC80\t129\n#define CAS_DIVISOR_ABC800\t35\n#define CAS_SIO_CLOCK\t\t(1500000/16)\n\n#define CAS_BAUDRATE_ABC80\tDIV_ROUND(CAS_SIO_CLOCK, CAS_DIVISOR_ABC80)\n#define CAS_BAUDRATE_ABC800\tDIV_ROUND(CAS_SIO_CLOCK, CAS_DIVISOR_ABC800)\n\n/*\n * Windows has a different signature for mkdir(), but fortunately also\n * has an alias _mkdir() to look for...\n */\n#ifdef HAVE__MKDIR\n# define make_dir(x) _mkdir(x)\n#else\n# define make_dir(x) mkdir((x), 0777)\n#endif\n\nstruct diskfmt {\n    const char *name;\t        /* Format name */\n    unsigned int c, h, s;\t/* Disk geometry, if known */\n    unsigned int sectors;       /* Total sectors (max 1911 clusters) */\n    unsigned int cluster_shift; /* Size of a cluster, log2 */\n    unsigned int syssec;\t/* First system sector (bitmap) */\n    unsigned int dirsec[2];\t/* First directory sector (main, backup) */\n    unsigned int dirsecs;\t/* Number of directory sectors */\n    unsigned int il;\t\t/* Interleave factor (normally 1) */\n    unsigned int iloffs;\t/* Interleave offset (always 0?) */\n    unsigned int dstart;\t/* Beginning of actual data */\n    bool chflip;\t\t/* Flip heads and cylinders? */\n};\n\nstruct disk;\n\nstruct directory {\n    struct disk *disk;          /* This directory belongs to... */\n    unsigned char *bitmap;      /* Directory entry \"bitmap\" area */\n    unsigned int dirsec;\t/* First directory sector */\n    unsigned int headsec;       /* File header sector for UFD */\n};\n\nstruct sectmeta {\n    unsigned char flags;\n};\n\nstruct disk {\n    const struct diskfmt *fmt;  /* Format descriptor */\n    unsigned char *image;       /* Image of the disk */\n    unsigned char *bitmap;      /* Pointer to the bitmap inside the disk */\n    struct sectmeta *meta;\t/* Per sector backend metadata */\n    struct directory mfd;       /* MFD directory descriptor */\n};\n\n#define MAX_CLUST      (239*8)\t/* Absolute theoretical maximum */\n#define MAX_CLUSTSHIFT 5\t/* Otherwise we get > 64K sectors */\n#define MAX_SECTORS    (MAX_CLUST << MAX_CLUSTSHIFT)\n\nconst struct diskfmt *get_format(const char *);\nvoid show_formats(FILE *);\nstruct disk * safe_alloc\nallocate_disk(const struct diskfmt *fmt);\nvoid free_disk(struct disk *);\nvoid disk_update_ptrs(struct disk *);\n\nunsigned char *make_abcfile(FILE *f, int *sizep);\n\nextern const char *program;\nvoid * safe_malloc(1) xmalloc(size_t);\nvoid * safe_malloc(1) xzalloc(size_t);\nvoid *xrealloc(void *, size_t);\n\nstatic inline void mark_used(struct disk *disk, unsigned int cluster)\n{\n    disk->bitmap[cluster >> 3] |= (0x80 >> (cluster & 7));\n}\n\nstatic inline int is_used(struct disk *disk, unsigned int cluster)\n{\n    return !!(disk->bitmap[cluster >> 3] & (0x80 >> (cluster & 7)));\n}\n\n/*\n * Get a pointer to a certain sector, accounting for all the\n * various permutation options.\n */\nuint8_t *get_sector(const struct disk *disk, unsigned int sectnr);\n\n/*\n * Convert a filename in ABC format to a lower-case filename\n * in host encoding\n */\nsize_t unmangle_filename(char *out, const unsigned char *in);\n\n/*\n * Convert a filename in host encoding to a filename in ABC format\n * Returns 0 for OK, -1 for failure (filename cannot be converted.)\n */\nint mangle_name(unsigned char *dst, const char *src);\n\n/*\n * Makes a filename suitable for embedding in a buffer.\n */\nint embed_name(unsigned char *dst, size_t len, const char *src);\n\n#endif /* ABCDISK_H */\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/abcfile.c",
    "content": "/*\n * readfile.c\n *\n * Read a host file and if necessary convert it to ABC format.\n */\n\n#include \"abcdisk.h\"\n\n/*\n * Get the contents of a file, and guess whether or not it's a text file;\n * then convert it to ABC format (not including block headers, so only\n * 253 bytes of data.)\n */\n\nunsigned char *make_abcfile(FILE *f, int *sizep)\n{\n    unsigned char buffer[256];\n    int i, n;\n    int size = 0;\n    int binary = 0;\n    unsigned char *data, *dp;\n    int blocks;\n\n    if (!f)\n        return NULL;\n\n    while ((n = fread(buffer, 1, sizeof buffer, f))) {\n        if (!binary)\n            for (i = 0; i < n; i++) {\n                if ((buffer[i] & 0x80) || buffer[i] == 0x00\n                    || buffer[i] == 0x03) {\n                    binary = 1;\n                    break;\n                }\n            }\n\n        size += n;\n    }\n\n    rewind(f);\n\n    if (binary) {\n        blocks = (size + 252) / 253;\n        data = xmalloc(blocks * 253);\n        fread(data, size, 1, f);\n        memset(data + size, 0, blocks * 253 - size);\n        size = blocks * 253;\n    } else {\n        int blocks = (size + 251) / 252 + 1;\n        data = xmalloc(blocks * 253);\n\n        dp = data;\n        while (memset(buffer, 0, 253), (n = fread(buffer, 1, 252, f))) {\n            for (i = 0; i < n; i++) {\n                if (buffer[i] == '\\n')\n                    buffer[i] = '\\r';\n            }\n            buffer[n] = '\\x03';\n\n            memcpy(dp, buffer, 253);\n            dp += 253;\n        }\n\n        /* Ending block */\n        memset(buffer, 0, 6);\n        buffer[6] = '\\x03';\n        memcpy(dp, buffer, 253);\n        dp += 253;\n\n        size = dp - data;\n    }\n\n    fclose(f);\n\n    *sizep = size;\n\n    return data;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/abcread.c",
    "content": "/*\n * abcread.c\n *\n * Program to extract the contents from an ABC/UFD-DOS filesystem\n */\n#include \"abcdisk.h\"\n\nenum sectflags {\n    SF_NOT_SEEN,\n    SF_SEEN_SYS,\n    SF_SEEN_MFD,\n    SF_SEEN_UFD,\n    SF_SEEN_HDR,\n    SF_SEEN_FILE,\n};\n\nstatic const char * const seen[] =\n{\n    \"???\", \"system\", \"mfd\", \"ufd\", \"header\", \"file\"\n};\n\nstruct pathinfo {\n    const char *infile;\t       /* Host input file */\n    const char *outdir;\t       /* Host output directory */\n    char *dirpath;\t       /* Host directory path buffer */\n    char *abcpath;\t       /* Pointer into dirpath after outdir */\n    size_t dirpath_len;\t       /* Current length of dirpath */\n    size_t dirpath_size;       /* Allocated length of dirpath */\n};\n\n/* Copy files as given by tree on stdin */\nstatic int\nextract_dir_sector(struct pathinfo *path, struct directory *dir,\n\t\t   int sectnr, int sectindex)\n{\n    struct disk *disk = dir->disk;\n    const uint8_t *sector = get_sector(disk, sectnr);\n    int err = 0;\n    int i;\n    size_t dirpath_len = path->dirpath_len;\n\n#ifdef DEBUG\n    printf(\"directory: %s, sectnr %d (0x%x), sectindex %d (%d)\\n\",\n\t   *path->abcpath ? path->abcpath : \"/\", sectnr, sectnr,\n\t   sectindex, dir->bitmap[sectindex]);\n#endif\n\n    /*\n     * 16 directory entries per sector, but get the number\n     * from the \"bitmap\".\n     */\n    for (i = 0; i < dir->bitmap[sectindex]; i++) {\n\tunsigned int hsect, dsect;\n\tconst uint8_t *header;\n\tconst uint8_t *entry = sector + (i << 4);\n\tuint8_t *sector;\n\tunsigned skip, nsec, cleft, len;\n\tbool is_ufd;\n\tstruct directory ufd;\n\tFILE *f = NULL;\n\tenum sectflags whatami;\n\tbool check_sector;\n\n\tpath->dirpath_len = dirpath_len;\n\n\thsect = (entry[0] << 3) + (entry[1] >> 5);\n\thsect <<= disk->fmt->cluster_shift;\n\tif (!hsect || (entry[0] & entry[1]) == 0xff ||\n\t    entry[4] == 0x00 || entry[4] == 0xff)\n\t    continue;           /* Empty slot */\n\n\theader = get_sector(disk, hsect);\n\n\t/* Length of file in sectors, including header block */\n\tlen = entry[2] + (entry[3] << 8);\n\n\t/*\n\t * Early version of ABC-DOS didn't fill in the length field; those\n\t * versions all had cluster size == 1 so we can just read until the\n\t * header block runs out...\n\t */\n\tif (len == 0)\n\t    len = disk->fmt->sectors;\n\n\t/* 128 is a kind of extremely conservative value due to multibyte\n\t   blowup */\n\tif (path->dirpath_size - path->dirpath_len < 128) {\n\t    size_t abcpath_delta = path->abcpath - path->dirpath;\n\t    path->dirpath_size += 4096;\n\t    path->dirpath = xrealloc(path->dirpath, path->dirpath_size);\n\t    path->abcpath = path->dirpath + abcpath_delta;\n\t}\n\n\tpath->dirpath_len +=\n\t    unmangle_filename(path->dirpath + path->dirpath_len, entry + 4);\n\n\tis_ufd = !memcmp(entry + 12, \"Ufd\", 3);\n\n\tif (hsect >= disk->fmt->sectors) {\n\t    fprintf(stderr,\n\t\t    \"%s:%s: header sector out of range %u/%u (dir %d:%d)\\n\",\n\t\t    path->infile, path->abcpath,\n\t\t    hsect, disk->fmt->sectors, sectnr, i);\n\t    err++;\n\t    continue;\n\t} else if (disk->meta[hsect].flags &&\n\t\t   (!is_ufd && disk->meta[hsect].flags != SF_SEEN_HDR)) {\n\t    /*\n\t     * Note: a file header can be seen more than once, because\n\t     * some disks actually use something like \"hard links\"\n\t     * (shared data). Don't allow this for UFDs, or we could\n\t     * end up recursing indefinitely...\n\t     */\n\t    fprintf(stderr, \"%s:%s: header sector already visited as %s: %u/%u (dir %d:%d)\\n\",\n\t\t    path->infile, path->abcpath,\n\t\t    seen[disk->meta[hsect].flags],\n\t\t    hsect, disk->fmt->sectors, sectnr, i);\n\t    err++;\n\t    continue;\n\t}\n\tdisk->meta[hsect].flags = SF_SEEN_HDR;\n\n\tif (is_ufd) {\n\t    if (path->outdir)\n\t\tmake_dir(path->dirpath);\n\t    path->dirpath[path->dirpath_len++] = '/';\n\t    path->dirpath[path->dirpath_len] = '\\0';\n\t    memset(&ufd, 0, sizeof ufd);\n\t    ufd.disk = disk;\n\t    ufd.headsec = hsect;\n\t    ufd.dirsec = hsect + 2;\n\t    len = 18;\t\t/* Header+bitmap+16 directory sectors, max */\n\t    if (!path->outdir) {\n\t\t/* Directory listing, print directories before their content */\n\t\tprintf(\"      %s\\n\", path->abcpath);\n\t    }\n\t} else if (path->outdir) {\n            f = fopen(path->dirpath, \"wb\");\n\t}\n\n        /* Skip the header block for a file, header block and bitmap for UFD */\n        skip = 1;\n        cleft = 0;\n        dsect = -1;\n\tsector = NULL;\n        header += 4;\n\tnsec = 1;\n\tcheck_sector = true;\n\n        while (len--) {\n            if (cleft) {\n                dsect++;\n            } else {\n                if ((header[0] & header[1]) == 0xff)\n                    break;      /* Premature end of data */\n\n                dsect = (header[0] << 3) + (header[1] >> 5);\n                dsect <<= disk->fmt->cluster_shift;\n                cleft = ((header[1] & 31) + 1) << disk->fmt->cluster_shift;\n\n#ifdef DEBUG\n\t\tprintf(\"%s: hsect %d (0x%x) dsect %d (0x%x), count %d\\n\",\n\t\t       path->abcpath, hsect, hsect, dsect, dsect, cleft);\n#endif\n\n                header += 2;\n            }\n            cleft--;\n\n            if (skip) {\n                skip--;\n\t\tcontinue;\n\t    }\n\n\t    whatami = is_ufd ? SF_SEEN_UFD : SF_SEEN_FILE;\n\t    if (dsect >= disk->fmt->sectors) {\n\t\tfprintf(stderr,\n\t\t\t\"%s:%s: %s sector out of range %u/%u (dir %d:%d hdr %u)\\n\",\n\t\t\tpath->infile, path->abcpath,\n\t\t\tis_ufd ? \"ufd\" : \"file\",\n\t\t\tdsect, disk->fmt->sectors, sectnr, i, hsect);\n\t\terr++;\n\t\tbreak;\n\t    } else if (disk->meta[dsect].flags &&\n\t\t       (whatami == SF_SEEN_UFD ||\n\t\t\tdisk->meta[dsect].flags != whatami)) {\n\t\tfprintf(stderr,\n\t\t\t\"%s:%s: %s sector already visited as %s: %u/%u (dir %d:%d hdr %u)\\n\",\n\t\t\tpath->infile, path->abcpath,\n\t\t\tis_ufd ? \"ufd\" : \"file\",\n\t\t\tseen[disk->meta[dsect].flags],\n\t\t\tdsect, disk->fmt->sectors, sectnr, i, hsect);\n\t\terr++;\n\t\tbreak;\n\t    }\n\t    disk->meta[dsect].flags = whatami;\n\n\t    sector = get_sector(disk, dsect);\n\n\t    if (check_sector) {\n\t\tunsigned int sect_seq = sector[1] + (sector[2] << 8);\n\t\tif (sector[0] != (i << 4) + sectindex) {\n\t\t    fprintf(stderr, \"%s:%s%s: bad ID in prefix (sec %u #%u dir %d:%d hdr %u prefix %02x)\\n\",\n\t\t\t    path->infile, path->abcpath,\n\t\t\t    is_ufd ? \" (ufd)\" : \"\",\n\t\t\t    dsect, nsec, sectnr, i, hsect, sector[0]);\n\t\t} else if (sect_seq != nsec) {\n\t\t    fprintf(stderr, \"%s:%s%s: bad sequence number %u (sec %u #%u dir %d:%d hdr %u)\\n\",\n\t\t\t    path->infile, path->abcpath,\n\t\t\t    is_ufd ? \" (ufd)\" : \"\", sect_seq,\n\t\t\t    dsect, nsec, sectnr, i, hsect);\n\t\t}\n\t    }\n\n\t    if (is_ufd) {\n\t\tif (!ufd.bitmap) {\n\t\t    ufd.bitmap = sector + 239;\n\t\t    /*\n\t\t     * The actual UFD sectors don't have the normal\n\t\t     * 3-byte prefix\n\t\t     */\n\t\t    check_sector = false;\n\t\t} else {\n\t\t    err += extract_dir_sector(path, &ufd, dsect, nsec-2);\n\t\t}\n            } else if (f) {\n\t\tfwrite(sector + 3, 1, 253, f);\n            }\n\n\t    nsec++;\n\t}\n\n\tif (f) {\n\t    if (ferror(f) || fflush(f) || fclose(f)) {\n\t\tfprintf(stderr, \"%s: %s: %s\\n\", program, path->dirpath,\n\t\t\tstrerror(errno));\n\t\texit(1);\n\t    }\n\t}\n\n\tif (!path->outdir && !is_ufd) {\n\t    /* Directory listing */\n\t    printf(\"%5u %s\\n\", nsec, path->abcpath);\n\t}\n    }\n\n    path->dirpath[path->dirpath_len = dirpath_len] = '\\0';\n\n    return err;\n}\n\nstatic void usage(void)\n{\n    fprintf(stderr, \"abcdisk %s\\n\", VERSION);\n    fprintf(stderr, \"Usage: %s format|auto diskimage [outdir]\\n\", program);\n    fprintf(stderr, \"       if outdir is omitted, show directory listing\\n\");\n    show_formats(stderr);\n    exit(64);\t\t\t/* EX_USAGE */\n}\n\nstatic bool valid_format(struct disk *disk, struct diskfmt *fmt)\n{\n    int i;\n    unsigned int minclust, maxclust, nclust;\n    unsigned int sectors, minsectors;\n    int cluster_shift;\n    const uint8_t *syssec, *empty; /* System and empty-system sectors */\n\n    disk->fmt = fmt;\n    syssec = get_sector(disk, fmt->syssec);\n    empty  = get_sector(disk, fmt->syssec+1);\n\n    if (fmt->cluster_shift) {\n\tif (empty[255] != 0 && empty[255] != fmt->cluster_shift)\n\t    return false;\n\tcluster_shift = fmt->cluster_shift;\n    } else {\n\tcluster_shift = empty[255];\n    }\n    if (cluster_shift > 5)\n\treturn false;\t\t/* Otherwise > 64K sectors */\n\n    /*\n     * For old DOS we need 24 system sectors; for UFD-DOS we need\n     * 32.\n     */\n    minsectors = fmt->syssec + 18;\n\n    /*\n     * To be valid, both the syssec and the empty sec need to follow:\n     *\n     * 1. At least 24 sectors at the start need to be marked busy.\n     * 2. Any bit set in the first 239 bytes of the empty sector\n     *    must also be set in the system sector.\n     * 3. Bytes 239-254 in the system sector must be in the range 0-16,\n     *    with the number in the empty sector less than or equal\n     *    to the system sector at least for the first 8.\n     * 4. Byte 239 cannot be 0.\n     * 5. Byte 255 in the system sector must be 0 or = byte 255 in the\n     *    empty sector (= cluster size.)\n     */\n\n    for (minclust = 0; minclust < 239*8; minclust++) {\n\tif (!(empty[minclust >> 3] & (0x80 >> (minclust & 7))))\n\t    break;\n    }\n\n    if (minclust == 239*8)\n\treturn false;\t\t/* Not a single usable cluster */\n    if ((minclust << cluster_shift) < minsectors)\n\treturn false;\t\t/* Not enough space for the system */\n\n    for (i = 0; i < 239; i++) {\n\tif (empty[i] & ~syssec[i])\n\t    return false;\n    }\n\n    if (syssec[239] == 0)\n\treturn false;\n\n    for (i = 239; i < 239+8; i++) {\n\tif (syssec[i] > 16 || empty[i] > syssec[i])\n\t    return false;\n    }\n\n    /*\n     * Some DOS versions seem to stuff different information in the\n     * empty sector here, like free sectors, so don't check\n     * the empty sector in this range?\n     */\n    for (i = 239+8; i < 239+16; i++) {\n\tif (syssec[i] > 16)\n\t    return false;\n    }\n\n    if (syssec[255] != 0 && syssec[255] != empty[255])\n\treturn false;\n\n    /*\n     * Clusters marked unusable in the backup system track at the end\n     * can be interpreted as the length of the disk. It MAY be caused\n     * by bad sectors, but it doesn't actually matter.\n     */\n    for (maxclust = 239*8-1; maxclust >= minclust; maxclust--) {\n\tif (!(empty[maxclust >> 3] & (0x80 >> (maxclust & 7))))\n\t    break;\n    }\n\n    nclust = maxclust + 1;\n    sectors = nclust << cluster_shift;\n    if (sectors < minsectors)\n\treturn false;\n\n    /*\n     * Try to figure out the location and length of the MFD. 16 refers\n     * to the backup directory on ABC-DOS and the only directory on\n     * UFD-DOS, so it is always safe for reading.\n     */\n    fmt->dirsec[0] = fmt->dirsec[1] = 16;\n    for (i = 0; i < 16; i++) {\n\tif (syssec[239+i] < 1 || syssec[239+i] > 16)\n\t    break;\n    }\n\n    fmt->cluster_shift = cluster_shift;\n    fmt->sectors = sectors;\n    fmt->dirsecs = i;\n\n#ifdef DEBUG\n    printf(\"interleave: %u  syssec: %u  cluster: %d  sectors: %u\\n\",\n\t   fmt->il, fmt->syssec, 1 << cluster_shift, fmt->sectors);\n#endif\n\n    disk_update_ptrs(disk);\n    return true;\n}\n\nstatic const struct diskfmt *guess_format(struct disk *disk)\n{\n    static struct diskfmt fmt;\n    static const unsigned char clust_shifts[] = { 0, 2, 5 };\n    struct trackperm {\n\tunsigned int s;\n\tunsigned int dstart;\n\tbool chflip;\n    };\n    static const struct trackperm trackperm[] = {\n\t{ 16, 0, false },\t/* Most common */\n\t{ 26, 0, false },\t/* 8\" disks */\n\t{ 26, 26, false },\t/* 8\" disks without stripped track 0 */\n\t{ 26, 26, true },\t/* d:o with sec/cyl reversed */\n    };\n    size_t cf, tp;\n\n    disk->fmt = &fmt;\n    fmt.name = \"auto\";\n\n    /*\n     * These apply to 8\" drives, which is the only case\n     * where this actually matters for reading...\n     */\n    fmt.c = 77;\n    fmt.h =  2;\n\n    /*\n     * Last resort loop: try to force the cluster shift\n     * (0 = attempt autodetect)\n     */\n    for (cf = 0; cf < ARRAY_SIZE(clust_shifts); cf++) {\n\tfmt.cluster_shift = clust_shifts[cf];\n\n\t/*\n\t * This is used for interleave detection. Not sure if there\n\t * is any sane way to look for other interleaved track sizes...\n\t * definitely not without analyzing disk dumps in more detail.\n\t */\n\tfor (tp = 0; tp < ARRAY_SIZE(trackperm); tp++) {\n\t    fmt.s      = trackperm[tp].s;\n\t    fmt.dstart = trackperm[tp].dstart;\n\t    fmt.chflip = trackperm[tp].chflip;\n\n\t    /* Try no interleaving first of all */\n\t    fmt.iloffs = 0;\n\t    fmt.il = 1;\n\n\t    do {\n\t\t/* Try 6 and 14 as the system sector */\n\t\tfor (fmt.syssec = 6; fmt.syssec <= 14; fmt.syssec += 8) {\n\t\t    if (valid_format(disk, &fmt))\n\t\t\treturn &fmt;\n\t\t}\n\n\t\t/* The most common seem to be 1 and 7, so try in that order... */\n\t\tfmt.il = (fmt.il + 6) % fmt.s;\n\t    } while (fmt.il > 1);\n\t}\n    }\n\n    return disk->fmt = NULL;\t/* Can't autodetect */\n}\n\nint main(int argc, char *argv[])\n{\n    struct disk *disk;\n    const struct diskfmt *fmt;\n    FILE *f;\n    unsigned int i;\n    const char *format, *infile, *outdir;\n    struct pathinfo path;\n    size_t outdir_len;\n    int err = 0;\n\n    setlocale(LC_ALL, \"\");\n\n    program = argv[0];\n\n    if (argc < 3 || argc > 4)\n\tusage();\n\n    format = argv[1];\n    infile = argv[2];\n    outdir = argv[3];\n\n    f = !strcmp(infile, \"-\") ? stdin : fopen(infile, \"rb\");\n    if (!f) {\n       perror(infile);\n       exit(65);\t\t/* EX_NOINPUT */\n    }\n\n    if (!strcmp(format, \"auto\") || !format[0]) {\n\tfmt = NULL;\n    } else if (!(fmt = get_format(format))) {\n\tusage();\n    }\n\n    disk = allocate_disk(fmt);\n\n    /* Don't error out on a short image; it might still be readable */\n    fread(disk->image, 1, (fmt ? fmt->sectors : MAX_SECTORS) << 8, f);\n    if (ferror(f)) {\n       perror(infile);\n       exit(1);\n    }\n    if (f != stdin)\n        fclose(f);\n\n    if (!fmt) {\n\tfmt = guess_format(disk);\n\tif (!fmt) {\n\t    fprintf(stderr, \"%s: unable to guess disk format (corrupt?)\\n\", infile);\n\t    exit(76);\t\t/* EX_PROTOCOL */\n\t}\n    }\n\n    /* If the target directory doesn't exist, try to create it */\n    if (outdir && make_dir(outdir) && errno != EEXIST) {\n\tperror(outdir);\n\texit(73);\t\t/* EX_CANTCREAT */\n    }\n\n    memset(&path, 0, sizeof path);\n    path.infile       = infile;\n    path.outdir       = outdir;\n    path.dirpath_len  = outdir_len = outdir ? strlen(outdir) : 0;\n    path.dirpath_size = path.dirpath_len + 8192; /* Kind of arbirary */\n    path.dirpath      = xmalloc(path.dirpath_size);\n    if (outdir_len) {\n\tchar term = outdir[outdir_len-1];\n\n\tmemcpy(path.dirpath, outdir, outdir_len);\n\n\tif (term != '/'\n#if defined(__MSDOS__) || defined(__WIN32__)\n\t    && term != '\\\\' && term != ':'\n#endif\n\t    ) {\n\t    path.dirpath[path.dirpath_len++] = '/';\n\t}\n    }\n    path.abcpath = path.dirpath + path.dirpath_len;\n    *path.abcpath = '\\0';\n\n    /* Process the MFD */\n    disk->mfd.disk    = disk;\n    disk->mfd.bitmap  = get_sector(disk, disk->fmt->syssec) + 239;\n    disk->mfd.headsec = 0;\t/* MFDs don't have file headers */\n\n    for (i = 0; i < disk->fmt->dirsecs; i++) {\n\terr += extract_dir_sector(&path, &disk->mfd, disk->fmt->dirsec[0]+i, i);\n    }\n    free_disk(disk);\n    free(path.dirpath);\n\n    return err ? 64 : 0;\t/* EX_DATAERR */\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/abctext.c",
    "content": "#include \"compiler.h\"\n#include \"patchlevel.h\"\n\n/*\n * Convert an ABC text file in binary form to more normal form,\n * optionally with character set conversion.\n */\n\n#ifndef MB_LEN_MAX\n# define MB_LEN_MAX 256\t\t/* Excessive but should be safe */\n#endif\n\nstatic const wchar_t abcchartbl[256] =\n    L\"\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\"\n    L\"\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\n    L\" !\\\"#¤%&'()*+,-./0123456789:;<=>?\"\n    L\"ÉABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÅÜ_\"\n    L\"éabcdefghijklmnopqrstuvwxyzäöåü\\x25fc\"\n\n    /* Any better idea what to do with the high half? */\n    L\"\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\"\n    L\"\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\"\n    L\"\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\"\n    L\"\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\"\n    L\"\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\"\n    L\"\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\"\n    L\"\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\"\n    L\"\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\";\n\nstatic int fputc_convert(int c, FILE *f)\n{\n    unsigned char abcchar = c;\n\n    fputwc(abcchartbl[abcchar], f);\n    return ferror(f) ? EOF : abcchar;\n}\n\nconst char *program;\n\nstatic void usage(void)\n{\n    fprintf(stderr, \"abcdisk %s\\n\", VERSION);\n    fprintf(stderr, \"Usage: %s [-c] [abcfile [textfile]]\\n\", program);\n    fprintf(stderr, \"       -c : convert to host (multi)byte encoding\\n\");\n    exit(1);\n}\n\nint main(int argc, char *argv[])\n{\n    FILE *f = stdin;\n    FILE *out = stdout;\n    char buf[253], *p;\n    int n;\n    char lastbyte;\n    int (*fput_char)(int, FILE *) = fputc;\n    char * const *arg = &argv[1];\n\n    setlocale(LC_ALL, \"\");\n\n    (void)argc;\n    program = argv[0];\n\n    if (*arg && (*arg)[0] == '-' && (*arg)[1]) {\n\tswitch ((*arg)[1]) {\n\tcase 'c':\n\t    fput_char = fputc_convert;\n\t    break;\n\tdefault:\n\t    usage();\n\t    break;\n\t}\n\targ++;\n    }\n\n    if (*arg && strcmp(*arg, \"-\")) {\n        f = fopen(*arg, \"rb\");\n\tif (!f) {\n\t    perror(*arg);\n\t    exit(1);\n\t}\n    }\n\n    if (*arg)\n\targ++;\n\n    if (*arg && strcmp(*arg, \"-\")) {\n\tout = fopen(*arg, \"wt\");\n\tif (!out) {\n\t    perror(*arg);\n\t    exit(1);\n\t}\n    }\n\n    lastbyte = 0;\n\n    while ((n = fread(buf, 1, 253, f)) > 0) {\n        if (!memcmp(buf, \"\\0\\0\\0\\0\\0\\0\", 6))\n            break;              /* End of file */\n\n        p = buf;\n        while (n--) {\n\t    unsigned char c = *p++;\n            if (lastbyte == '\\t') {\n                /* TAB + count is used for compressed spaces */\n                while (c--)\n                    fput_char(' ', out);\n            } else {\n                switch (c) {\n                case '\\t':\n                    break;\t/* Skip for now, process on next iteration */\n                case '\\3':\n                    n = 0;      /* ETX, jump to next block */\n                    break;\n\t\tcase '\\r':\n\t\t    fput_char('\\n', out);\n\t\t    break;\n\t\tcase '\\n':\n\t\t    if (lastbyte != '\\r')\n\t\t\tfput_char('\\n', out);\n\t\t    break;\n                default:\n                    fput_char(c, out);\n                    break;\n                }\n            }\n\t    if (c != '\\3')\n\t\tlastbyte = c;\n        }\n    }\n\n    fflush(out);\n\n    /* Exit closes files as appropriate */\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/abcwrite.c",
    "content": "/*\n * abcwrite.c\n *\n * Program to build a populated ABC-DOS hard disk image\n */\n#include \"abcdisk.h\"\n\n/*\n * Find a free cluster in the bitmap; return the cluster number\n */\nstatic int get_cluster(struct disk *disk, unsigned int cluster_hint)\n{\n    unsigned int nclust, i, x, nc, best, bnc;\n\n    best = -1;\n    bnc = 0;\n\n    nclust = disk->fmt->sectors << disk->fmt->cluster_shift;\n\n    for (i = 0; i < nclust; i++) {\n        if (!is_used(disk, i)) {\n            /* How long is this? */\n            for (x = i, nc = 0; i < nclust && nc < cluster_hint; i++) {\n                if (is_used(disk, i))\n                    break;\n                nc++;\n            }\n            if (nc == cluster_hint) {\n                /* Found as big as we wanted */\n                mark_used(disk, x);\n                return x;\n            } else if (nc > bnc) {\n                best = x;\n                bnc = nc;\n            }\n        }\n    }\n\n    if (bnc) {\n        /* We found *something* at least... */\n        mark_used(disk, best);\n        return best;\n    }\n\n    fprintf(stderr, \"%s: output disk full\\n\", program);\n    exit(1);\n}\n\n/*\n * Create a file object and return the first sector number.\n */\nstatic unsigned int\ncreate_file(struct directory *dir, const unsigned char *mangled_name,\n\t    unsigned char *data, int size, int ufd)\n{\n    struct disk *disk = dir->disk;\n    int cluster;\n    unsigned int nblocks, secperclust, clusters;\n    unsigned int dirs, dirp;             /* Directory (sector,position) */\n    unsigned char *dirent;\n    unsigned int blockno, sector, header, cleft;\n    unsigned char *hdata, *dp;\n\n    if (!data)\n        return 0;\t       /* No data, not even an empty buffer */\n\n    nblocks = (size + 252) / 253 + 1;\n    secperclust = 1 << disk->fmt->cluster_shift;\n    clusters = (nblocks + secperclust - 1) >> disk->fmt->cluster_shift;\n\n    /* Find and create directory entry */\n    dirp = -1;\n    for (dirs = 0; dirs < disk->fmt->dirsecs; dirs++) {\n        if (dir->bitmap[0xEF + dirs] < 0x10) {\n            dirp = dir->bitmap[0xEF + dirs]++;\n            break;\n        }\n    }\n\n    if (dirs >= disk->fmt->dirsecs) {\n        /* Directory full */\n        fprintf(stderr, \"%s: directory full\\n\", program);\n        return 0;\n    }\n\n    dirent = get_sector(disk, dir->dirsec + dirs) + (dirp << 4);\n    memcpy(dirent + 4, mangled_name, 11);\n\n    /* Allocate first cluster */\n    cluster = get_cluster(disk, clusters--);\n    if (cluster < 0) {\n        fprintf(stderr, \"get_cluster = %d\\n\", cluster);\n        return 0;\n    }\n\n    dirent[0] = cluster >> 3;\n    dirent[1] = cluster << 5;\n    dirent[2] = nblocks & 0xFF;\n    dirent[3] = nblocks >> 8;\n\n    /* Create \"file header\" */\n    header = sector = cluster << disk->fmt->cluster_shift;\n    hdata = dp = get_sector(disk, sector++);\n    cleft = secperclust - 1;    /* Left in the first cluster */\n\n    memset(hdata, 0, 256);\n\n    *hdata++ = (dirp << 4) + dirs;\n    *hdata++ = 0;               /* Header = block 0 */\n    *hdata++ = 0;               /* Header = block 0 */\n    *hdata++ = 0xFF;\n    /* Starting extent has one cluster in it */\n    hdata[0] = cluster >> 3;\n    hdata[1] = (cluster << 5) + 0;      /* Bits[4:0] = extend size minus one */\n\n    /* Actually copy the file */\n    blockno = 0;\n    while (size) {\n        int nbytes = (size > 253) ? 253 : size;\n\n        blockno++;\n\n        if (cleft) {\n\t    dp = get_sector(disk, sector++); /* Subsequent sector */\n            cleft--;\n        } else {\n            cluster = get_cluster(disk, clusters--);\n            if (cluster < 0) {\n                fprintf(stderr, \"get_cluster = %d\\n\", cluster);\n                return 0;\n            }\n\t    sector = cluster << disk->fmt->cluster_shift;\n\t    dp = get_sector(disk, sector++);\n\t    cleft = secperclust - 1;    /* Left in the first cluster */\n            if (cluster == ((hdata[0] << 3) + (hdata[1] >> 5) + 1) &&\n                (hdata[1] & 31) < 31) {\n                hdata[1]++;\n            } else {\n                hdata += 2;\n                hdata[0] = cluster >> 3;\n                hdata[1] = (cluster << 5) + 0;\n            }\n        }\n\n        if (ufd && blockno > 1) {\n            memset(dp, 0xff, 256);\n        } else {\n            dp[0] = (dirp << 4) + dirs;\n            dp[1] = blockno & 0xFF;\n            dp[2] = blockno >> 8;\n            memcpy(dp + 3, data, 253);\n            data += 253;\n        }\n\n        size -= nbytes;\n    }\n\n    /* Terminate the hdata */\n    hdata += 2;\n    hdata[0] = 0xFF;\n    hdata[1] = 0xFF;\n\n    return header;\n}\n\n/*\n * Copy a file\n */\nstatic int copy_file(struct directory *dir, const char *filename)\n{\n    int size;\n    unsigned char mangled_name[12];\n    unsigned char *data;\n    unsigned int header;\n\n    data = make_abcfile(fopen(filename, \"rb\"), &size);\n\n    mangle_name(mangled_name, filename);\n\n    header = create_file(dir, mangled_name, data, size, 0);\n    free(data);\n    return header ? 0 : -1;\n}\n\n/*\n * Create a UFD\n */\nstatic struct directory *make_ufd(struct directory *dir, const char *filename)\n{\n    unsigned char mangled_name[12];\n    unsigned char bitmap[253];\n    unsigned int header;\n    const uint8_t *hdata;\n    struct directory *ufd;\n    int dirs_block = dir->headsec ? dir->headsec + 2 : 0;\n    struct disk *disk = dir->disk;\n\n    ufd = xmalloc(sizeof(struct directory));\n    memset(ufd, 0, sizeof *ufd);\n    ufd->disk = disk;\n\n    mangle_name(mangled_name, filename);\n    memcpy(mangled_name + 8, \"Ufd\", 4);\n\n    memset(bitmap, 0, sizeof bitmap);\n    bitmap[0] = dirs_block & 0xFF;\n    bitmap[1] = dirs_block >> 8;\n\n    header = create_file(dir, mangled_name, bitmap,\n                         (disk->fmt->dirsecs + 1) * 253, 1);\n    if (!header) {\n        fprintf(stderr, \"%s: invalid file header\\n\", program);\n        return NULL;\n    }\n    hdata = get_sector(disk, header);\n\n    if ((hdata[6] & hdata[7]) != 0xff) {\n        fprintf(stderr, \"%s: discontiguous UFD (disk too fragmented)\\n\",\n                program);\n        return NULL;\n    }\n\n    ufd->bitmap  = get_sector(disk, header + 1);\n    ufd->dirsec  = header + 2;\n    ufd->headsec = header;\n\n    /* The UFD bitmap contains two copies of the self-pointer... */\n    ufd->bitmap[5] = ufd->bitmap[0];\n\n    return ufd;\n}\n\n/* Copy files as given by tree on stdin */\nstatic int get_files(struct directory *ufd, const char *dirpath)\n{\n    struct stat st;\n    DIR *d;\n    struct dirent *de;\n    struct directory *subdir;\n    size_t dirlen, filelen;\n    char *filename;\n\n    d = opendir(dirpath);\n    if (!d) {\n        /* Directory error or not a directory */\n\n        int err = errno;\n        int rv;\n\n        /* Is it a single file? */\n        rv = copy_file(ufd, dirpath);\n        if (rv) {\n            errno = err;\n            perror(dirpath);\n        }\n        return rv;\n    }\n\n    dirlen = strlen(dirpath);\n\n    while ((de = readdir(d))) {\n        if (de->d_name[0] == '.')\n            continue;\n\n        filelen = strlen(de->d_name);\n        filename = xmalloc(dirlen + filelen + 2);\n        memcpy(filename, dirpath, dirlen);\n        filename[dirlen] = '/';\n        memcpy(filename + dirlen + 1, de->d_name, filelen + 1);\n\n        if (stat(filename, &st)) {\n            perror(filename);\n            continue;\n        }\n        if (S_ISDIR(st.st_mode)) {\n            subdir = make_ufd(ufd, filename);\n            if (subdir)\n                get_files(subdir, filename);\n            else\n                fprintf(stderr, \"%s: make_ufd(%s) failed\\n\", program, filename);\n        } else {\n            copy_file(ufd, filename);\n        }\n        free(filename);\n    }\n    closedir(d);\n\n    return 0;\n}\n\n/*\n * DOSGEN uses 0x40, CP/M uses 0xe5; in either case it doesn't seem to\n * matter. Use 0xff because it stands out and it is friendly for flash-\n * based media.\n */\n#define FORMAT_BYTE\t0xff\n\n/* Create an empty filesystem; disk->fmt must be valid */\nstatic void dosgen(struct disk *disk)\n{\n    unsigned int i, j, starter;\n    const struct diskfmt *fmt = disk->fmt;\n    size_t size = fmt->sectors << 8;\n    int secperclust = 1 << fmt->cluster_shift;\n    uint8_t *emptysys;\n\n    disk_update_ptrs(disk);\n\n    /* Fill disk with format byte */\n    memset(disk->image, FORMAT_BYTE, size);\n\n    /* Create empty bitmap */\n    memset(disk->bitmap, 0, 256);\n    for (i = fmt->sectors >> fmt->cluster_shift; i < MAX_CLUST; i++)\n        mark_used(disk, i);     /* Mark nonexistent clusters busy */\n\n    /*\n     * 239..254 is the MFD \"bitmap\"; some DOSGEN seem to only set 0x01\n     * for the first directory sector?\n     */\n    memset(&disk->bitmap[239], 0x01, fmt->dirsecs);\n\n    /* Mark all clusters containing system sectors used */\n    starter = ((fmt->dirsec[0] > fmt->dirsec[1])\n\t       ? fmt->dirsec[0] : fmt->dirsec[1]) + fmt->dirsecs;\n    starter = (starter + secperclust - 1) >> fmt->cluster_shift;\n    for (i = 0; i < starter; i++)\n        mark_used(disk, i);\n\n    /* Copy bitmap to backup empty bitmap (= bad block map) */\n    emptysys = get_sector(disk, fmt->syssec+1);\n    memcpy(emptysys, disk->bitmap, 256);\n\n    /*\n     * UFD-DOS DOSGEN writes the cluster shift to the last byte in the\n     * *empty* bitmap only.\n     */\n    emptysys[255] = fmt->cluster_shift;\n\n    /* Create MFD directory sectors */\n    for (i = 0; i < 2; i++) {\n\tunsigned int dsec = fmt->dirsec[i];\n\tif (!dsec)\n\t    continue;\n\tfor (j = 0; j < fmt->dirsecs; j++) {\n\t    uint8_t *p = get_sector(disk, dsec + j);\n\t    memset(p, 0x00, 16);\t/* Reserved entry */\n\t    memset(p + 16, 0xff, 256-16);\n\t}\n    }\n}\n\nint main(int argc, char *argv[])\n{\n    struct disk *disk;\n    const struct diskfmt *fmt;\n    FILE *f;\n\n    setlocale(LC_ALL, \"\");\n\n    program = argv[0];\n\n    if (argc != 4 || !(fmt = get_format(argv[1]))) {\n\tfprintf(stderr, \"abcdisk %s\\n\", VERSION);\n        fprintf(stderr, \"Usage: %s format indir outfile\\n\", argv[0]);\n        show_formats(stderr);\n        return 1;\n    }\n\n    /* Allocate disk buffer and create a filesyste */\n    disk = allocate_disk(fmt);\n    dosgen(disk);\n\n    /* Install files */\n    if (get_files(&disk->mfd, argv[2]))\n        return 1;               /* No files to be had */\n\n    /* Create backup MFD if it exists */\n    if (fmt->dirsec[1]) {\n\tunsigned int ds;\n\tfor (ds = 0; ds < fmt->dirsecs; ds++) {\n\t    memcpy(get_sector(disk, fmt->dirsec[1] + ds),\n\t\t   get_sector(disk, fmt->dirsec[0] + ds), 255);\n\t}\n    }\n\n    /* Finally, write out image */\n    f = !strcmp(argv[3], \"-\") ? stdout : fopen(argv[3], \"wb\");\n    if (!f) {\n        perror(argv[3]);\n        return 1;\n    }\n    fwrite(disk->image, 1, fmt->sectors << 8, f);\n    fflush(f);\n    if (ferror(f)) {\n      perror(argv[3]);\n      return 1;\n    }\n    if (f != stdout)\n        fclose(f);\n\n    free_disk(disk);\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/abs.c",
    "content": "#include \"compiler.h\"\n#include \"bin2abc.h\"\n\nstruct abs_data_hdr {\n    uint8_t type;               /* 0 for data */\n    uint8_t data_bytes;\n    uint8_t zero;               /* Reserved */\n    uint8_t addrh;\n    uint8_t addrhx;\n    uint8_t addrl;\n    uint8_t addrlx;\n};\n\n/*\n * This is the minimum space needed in a record to be able to fit\n * at least one byte worth of data: header + csum + 2 byte end of record\n */\n#define MINSPACE ((int)sizeof(struct abs_data_hdr)+3+1)\n\nstatic void\nwrite_buffer(FILE * out, const uint8_t * buf, int buf_len, int buf_address,\n             int *spaceinrecord_ptr)\n{\n    int spaceinrecord = *spaceinrecord_ptr;\n    struct abs_data_hdr hdr;\n    uint8_t csum;\n    int i;\n\n    memset(&hdr, 0, sizeof hdr);\n\n    csum = 0;\n    for (i = 0; i < buf_len; i++)\n        csum += buf[i];\n\n    hdr.data_bytes = buf_len;\n    hdr.addrh = buf_address >> 8;\n    hdr.addrhx = ~hdr.addrh;\n    hdr.addrl = buf_address;\n    hdr.addrlx = ~hdr.addrl;\n\n    fwrite(&hdr, 1, sizeof hdr, out);\n    fwrite(buf, 1, buf_len, out);\n    putc(csum, out);\n\n    spaceinrecord -= (buf_len + sizeof hdr + 1);\n\n    if (spaceinrecord < MINSPACE) {\n        putc(0xff, out);\n        spaceinrecord--;\n        putc(0x00, out);\n        spaceinrecord--;\n\n        while (spaceinrecord--)\n            putc(0, out);\n\n        spaceinrecord = 253;\n    }\n\n    *spaceinrecord_ptr = spaceinrecord;\n}\n\nint writeabs(FILE *out, struct bindata *in)\n{\n    const uint8_t *data;\n    const bool *isset;\n    int spaceinrecord = 253;\n    int nextaddr = 0;\n    int addr;\n    uint8_t buf[256];\n    int buf_address = 0;\n    int buf_len = 0;\n\n    apply_relocs(in);\n\n    data = in->data;\n    isset = in->isset;\n\n    for (addr = 0; addr < MAX_ADDR; addr++) {\n\tif (isset[addr]) {\n            bool newheader = false;\n\n            if (buf_len) {\n                if (addr != nextaddr) {\n                    int padding = addr - nextaddr;\n                    if (padding <= (int)sizeof(struct abs_data_hdr) + 1 &&\n                        padding <= spaceinrecord - MINSPACE + 1) {\n                        /* Short stretch of nothing. Just convert it to zero. */\n                        memset(buf + buf_len, 0, padding);\n                        buf_len += padding;\n                    } else {\n                        newheader = true;\n                    }\n                }\n\n                if (spaceinrecord < buf_len - MINSPACE)\n                    newheader = true;   /* Can't fit at least one more byte */\n\n                if (newheader) {\n                    write_buffer(out, buf, buf_len, buf_address,\n                                 &spaceinrecord);\n                    buf_len = 0;\n                    buf_address = addr;\n                }\n            } else {\n\t\tbuf_address = addr;\n\t    }\n\n            buf[buf_len++] = data[addr];\n            nextaddr = addr + 1;\n        }\n    }\n\n    if (buf_len)\n        write_buffer(out, buf, buf_len, buf_address, &spaceinrecord);\n\n    /* Write entry point */\n    write_buffer(out, NULL, 0, in->entrypoint, &spaceinrecord);\n\n    /* Pad to end of record */\n    while (spaceinrecord--)\n        putc(0, out);\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/bac80.asm",
    "content": ";;\n;; ABC80 .bac loader loading at a fixed address\n;;\n\n\tinclude \"setup80.inc\"\n\n_start:\n\tinclude \"start80.inc\"\n\nset_load_addr:\n\tdefc LOAD=set_load_addr+1\n\tld de,0\t\t\t; Load address\n\n\tinclude \"copy80.inc\"\n\n\t;; All done, jump to entry point\n\t;; The stack is all set up for return to CHAIN, NEW or END\ndone:\n\tdefc ENTRY=done+1\t; Entry point address\n\tjp 0\n\n\tinclude \"end80.inc\"\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/bac80.inc",
    "content": "\torg 0\t\t\t; This code must be position-independent\n\n\tdefc END=00C9h\t\t; END routine in BASIC ROM\n\tdefc BOFA=65052\n\n\tld bc,END\t\t; END entry point in BASIC (B = 0!)\n\tpush bc\t\t\t; Save as return address\n\tld hl,(BOFA)\t\t; BOFA = start of data\n\tpush hl\t\t\t; Save for reloc routine\n\tld e,l\n\tld d,h\n\tld c,(hl)\t\t; First BASIC line = BASIC prefix\n\tadd hl,bc\t\t; Skip prefix\n\n\t;; Copy the data into place\ncopy_loop:\n\tld a,(hl)\t\t; BASIC line length\n\tsub 8\t\t\t; 6 byte header, 2 byte trailer\n\tjr c,reloc\t\t; END is shorter than any data line\n\n\tld c,6\t\t\t; BC <- 6 (header length)\n\tadd hl,bc\t\t; Skip header\n\n\t; Copy payload data\n\tld c,a\t\t\t; BC <- len since B = 0\n\tldir\n\n\t; Skip trailer (2 bytes)\n\tinc hl\n\tinc hl\n\n\tjr copy_loop\n\n\t;; BC =  relocation delta\n\t;; DE -> data (initially _start)\n\t;; HL -> relocations\n\nsetdelta:\n\tdefc DELTA=setdelta+1\n\tld bc,0\t\t\t; Delta for starting address (0 = start at DE)\n\tld a,c\n\tadd e\n\tld c,a\n\tld a,b\n\tadc d\n\tld b,a\n\nreloc:\n\tld a,(hl)\n\tcp 80h\t\t\t; JR doesn't support testing the sign bit\n\tjr nc,reloc_large\n\n\t; Apply relocation: HL += 1, DE += A, (DE) += BC, DE += 2\nreloc_apply:\n\tinc hl\n\n\tadd e\n\tld e,a\n\tjr nc,nocarry\n\tinc d\nnocarry:\n\n\tld a,(de)\n\tadd c\n\tld (de),a\n\tinc de\n\tld a,(de)\n\tadc b\n\tld (de),a\n\tinc de\n\tjr reloc\n\n\t; Large jump (> 127 bytes) or end\n\t; 80h = END, 81-FFh are large jump biased by 8100h in *bigendian* order\nreloc_large:\n\tsub 81h\n\tjr c,done\n\tinc hl\n\tadd d\n\tld d,a\n\tld a,(hl)\n\tjr reloc_apply\n\n\t; All done, jump to entry point\n\t; Note: top of stack is 00C9h -> END, so a RET from the\n\t; target routine if the same as END.\ndone:\n\tdefc DENTRY=done+1\n\tld bc,DENTRY\t\t; Offset from final address ptr to entry point\n\tadd hl,bc\n\tjp (hl)\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/bac800.asm",
    "content": ";\n; .bac application loader for ABC800\n;\n\n\tinclude \"setup800.inc\"\n\tinclude \"run800.inc\"\n\n\t;; Relocator setup code. In order to support saving and\n\t;; re-loading programs, this must handle being restarted at\n\t;; either the same or a different address and do the right\n\t;; thing with the relocations having already been run before.\n\n_start:\t\t\t\t; HL points here\n\tdefc NEGDATAPTR=_start+1 ; _start - <start of data>\n\t;; Subtract the length of the (added) relocations from this value\n\t;; so that 0 offset = start of program\n\tld bc,0\t\t\t; Current base address\n\tld a,l\n\tsub c\n\tld c,a\n\tld a,h\n\tsbc b\n\tld b,a\n\tor c\n\tjr z,done\t\t; If the relocation delta is zero, done\n\n\tpush hl\n\tld de,reloc_data - _start\n\tadd hl,de\n\tpop de\n\n\tinclude \"relocate.inc\"\n\n\t; All done, jump to entry point.  A RET will return to BASIC\n\t; which will execute an END statement.\ndone:\n\tdefc ENTRY=done+1\t; Relocation here\n\tjp 0\t\t\t; Entry relative to start of program\nLAST_RELOC:\t\t\t; Relocation data pointer left here\n\n\t; Relocation data follows immediately afterwards\nreloc_data:\n\t; Our internal relocations first\n\tdefb NEGDATAPTR - _start\n\tdefb ENTRY - NEGDATAPTR - 2\n_end:\n\t;; Follows: compacted relocations, program,\n\t;; trailer: 00 00 00 00 FF FB FF = no long variables\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/bac800a.asm",
    "content": ";;;\n;;; .bac application loader for ABC800 for applications linked at an\n;;; absolute address. As this address by necessity will have to be below the\n;;; stack and above the heap, this means the application needs to exist\n;;; twice in memory, but requires less of the tool chain.\n;;;\n\n\tinclude \"setup800.inc\"\n\tinclude \"run800.inc\"\n\n_start:\t\t\t\t; HL points here\n\tld de,_end - _start\n\tadd hl,de\t\t; F.C <- 0\n\n\tpush hl\n_ldde:\n\tdefc ADDRESS=_ldde+1\n\tld hl,0\n\tpush hl\n\tld de,(HEAP)\n\tsbc hl,de\n\tld a,201\t\t; Out of memory\n\tjp c,SOFTNOCO\n\tpop de\n\tpop hl\n\t\n_ldbc:\n\tdefc LENGTH=_ldbc+1\n\tld bc,0\n\tldir\n\tdefc ENTRY=done+1\ndone:\n\tjp 0\n\n_end:\n\t;; Follows: program,\n\t;; trailer: 00 00 00 00 FF FB FF = no long variables\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/bac800d.asm",
    "content": ";\n; .bac device driver (load at BOTTOM) loader for ABC800\n;\n; RET returns to BASIC, which by default ENDs, see run800.inc.\n;\n\n\tinclude \"setup800.inc\"\n\tinclude \"run800.inc\"\n\n_start:\t\t\t\t; HL points here\n\tpush hl\n\tld de,reloc_data - _start\n\tadd hl,de\n\tex (sp),hl\t\t; On top of stack now: -> reloc_data\n\nset_data_offset:\n\tdefc DATA_OFFSET=set_data_offset+1\n\tld de,0\n\tadd hl,de\n\t;; HL -> input data\n\n\tld de,(BOTM)\n\tpush de\n\nset_data_len:\n\tdefc DATA_LEN=set_data_len+1\n\tld bc,0\n\tldir\n\n\tpop de\t\t\t; DE -> data to relocate\n\tld c,e\t\t\t; Relocation delta == target address\n\tld b,d\n\tpop hl\t\t\t; HL -> relocations\n\n\tpush de\t\t\t; Save data address\n\n\tinclude \"relocate.inc\"\n\ndone:\n\tdefc ENTRY=done+1\n\tld hl,0\n\tpop de\t\t\t; DE -> data address\n\tadd hl,de\n\tjp (hl)\t\t\t; Jump to entrypoint\n\n\t; Relocation data follows immediately afterwards\nreloc_data:\n_end:\n\n\t;; Follows: compacted relocations, program,\n\t;; trailer: 00 00 00 00 FF FB FF = no long variables\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/bac80r.asm",
    "content": ";;\n;; Relocating ABC80 .bac loader loading at BOFA\n;;\n;; To load a device driver, move BOFA to the desired address\n;; after initialization, and use the CHAIN/NEW option.\n;;\n\n\tinclude \"setup80.inc\"\n\n_start:\n\tinclude \"start80.inc\"\n\n\tld de,(BOFA)\t\t; BOFA = start of data\n\tpush de\t\t\t; Save for done\n\tpush de\t\t\t; Save for relocation\n\n\tinclude \"copy80.inc\"\n\nset_reloc_len:\n\tdefc NEG_RELOC_LEN=set_reloc_len+1\n\tld hl,0\t\t\t; Negative (length of relocation data + 1)\n\tadd hl,de\n\n\t;;\n\t;; Move EOFA to the end of our data\n\t;; This is probably unnecessary but easy to do\n\t;; The C code will already have inserted a 01h byte to this address\n\t;;\n\tld (EOFA),hl\n\tinc hl\t\t\t; HL -> relocations\n\tpop de\t\t\t; DE -> data (= BOFA)\n\n\t;; Set a delta if needed.  This loader only supports an\n\t;; 8-bit delta\n\tld a,e\nsetdelta:\n\tdefc DELTA=setdelta+1\n\tadd a,0\n\tld c,a\n\tld a,d\n\tadc a,0\n\tld b,a\n\n\tinclude \"relocate.inc\"\n\n\t;; All done, jump to entry point\n\t;; The stack is all set up for return to CHAIN, NEW or END\ndone:\n\tdefc ENTRY=done+1\t; relative to BOFA\n\tld bc,0\n\tpop hl\t\t\t; HL -> load address (= BOFA)\n\tadd hl,bc\n\tjp (hl)\n\n\tinclude \"end80.inc\"\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/copy80.inc",
    "content": ";; -*- asm -*-\n;;\n;; Copy ABC80 encapsulated data into place.\n;; This routine explicitly can do overlapping copies as\n;; long as they are *downward*.\n;;\n;; DE -> target location for the data\n;;\n\n\tld hl,(BOFA)\n\tld b,0\n\tld c,(hl)\t\t; Skip the first line\n\tadd hl,bc\n\ncopy_loop:\n\tld a,(hl)\t\t; BASIC line length\n\tsub 8\t\t\t; 6 byte header, 2 byte trailer\n\tjr c,copy_done\t\t; END/STOP is shorter than any data line\n\n\t; Skip length byte + line number (2 bytes) + string opcode (3 bytes)\n\tld c,6\n\tadd hl,bc\t\t; Skip header\n\n\t; Copy payload data\n\tld c,a\t\t\t; BC <- len since B = 0\n\tldir\n\n\t; Skip trailer = expression end + CR (2 bytes)\n\tinc hl\n\tinc hl\n\n\tjr copy_loop\n\ncopy_done:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/end80.inc",
    "content": "_enddata:\n\tdefb 0xbb\t\t; Terminate string expression\n_end:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/mkcsrc.pl",
    "content": "#!/usr/bin/perl\n\n# Convert a binary and a map file to a C file\n\nuse bytes;\nuse strict;\nuse File::Spec;\n\nmy ($prefix, $bin, $map, $c, $h, $i) = @ARGV;\n\nif (!defined($h)) {\n    die \"Usage: $0 prefix file.bin file.map file.c file.h [common.h]\\n\";\n}\n\nopen(BIN, '<:raw', $bin) or die;\nopen(MAP, '<', $map) or die;\nopen(C, '>', $c) or die;\nopen(H, '>', $h) or die;\n\nmy $bindata;\nmy $binlen = read(BIN, $bindata, 65536);\n\nclose(BIN);\n\nmy %syms = ();\nwhile (defined(my $line = <MAP>)) {\n    if ($line =~ /^(\\S+)\\s*\\=\\s*\\$?([0-9a-f]+)/i) {\n\t$syms{$1} = hex $2;\n    }\n}\nclose(MAP);\n\n# Symbols sorted in order of appearance\nmy @ssym = sort { $syms{$a} <=> $syms{$b} } keys(%syms);\n\nmy $hguard = \"BIN_\\U$h\";\n$hguard =~ s/[^A-Z0-9_]/_/g;\n\nprint H \"#ifndef $hguard\\n\";\nprint H \"#define $hguard 1\\n\\n\";\n\nprint H \"extern unsigned char ${prefix}_bin[${binlen}];\\n\\n\";\n\nforeach my $s (@ssym) {\n    printf H \"#define %-31s 0x%04x\\n\", $prefix.'_SYM_'.$s, $syms{$s};\n}\n\nprint H \"\\n#endif /* $hguard */\\n\";\n\nclose(H);\n\nprint C \"#include \\\"$h\\\"\\n\\n\";\n\nprint C \"unsigned char ${prefix}_bin[${binlen}] = {\\n\";\n\nmy $rlen = 0;\nmy $pfx = \"\\t\";\n\nmy @bin = unpack(\"C*\", $bindata);\n\nmy $pfx = \"\\t\";\nmy $rlen = 0;\nfor (my $i = 0; $i < $binlen; $i++) {\n    printf C '%s0x%02x', $pfx, shift(@bin);\n    $rlen++;\n    if ($rlen >= 8) {\n\t$pfx = \",\\n\\t\";\n\t$rlen = 0;\n    } else {\n\t$pfx = \", \";\n    }\n}\nprintf C \"\\n};\\n\";\n\nclose(C);\n\nif ($i) {\n    # See if we need to append this to the common include file\n    my ($ivol,$idir,$ifile) = File::Spec->splitpath($i);\n    my $habs = File::Spec->rel2abs($h);\n    my $found = 0;\n    $idir = File::Spec->catdir($ivol, $idir) if ($ivol ne '');\n\n    open(I, '+>>', $i) or die;\n    while (defined(my $line = <I>)) {\n\tchomp $line;\n\tif ($line =~ /^\\s*\\#\\s*include\\s+\\\"(.*)\\\"\\s*$/) {\n\t    my $iabs = File::Spec->rel2abs($1, $idir);\n\t    $found = 1 if ($habs eq $iabs);\n\t}\n    }\n\n    if (!$found) {\n\t# Need to add this header to the common include file\n\tprintf I \"#include \\\"%s\\\"\\n\", File::Spec->abs2rel($habs, $idir);\n    }\n    close(I);\n}\n\nexit(0);\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/relocate.inc",
    "content": "\t;; BC =  relocation delta\n\t;; DE -> data (initially _start)\n\t;; HL -> relocations\nreloc:\n\tld a,(hl)\n\tcp 80h\t\t\t; JR doesn't support testing the sign bit\n\tjr nc,reloc_large\n\n\t; Apply relocation: HL += 1, DE += A, (DE) += BC, DE += 2\nreloc_apply:\n\tinc hl\n\n\tadd e\n\tld e,a\n\tjr nc,nocarry\n\tinc d\nnocarry:\n\n\tld a,(de)\n\tadd c\n\tld (de),a\n\tinc de\n\tld a,(de)\n\tadc b\n\tld (de),a\n\tinc de\n\tjr reloc\n\n\t; Large jump (> 127 bytes) or end\n\t; 80h = END, 81-FFh are large jump biased by 8100h in *bigendian* order\nreloc_large:\n\tsub 81h\n\tjr c,reloc_done\n\tinc hl\n\tadd d\n\tld d,a\n\tld a,(hl)\n\tjr reloc_apply\n\nreloc_done:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/run800.inc",
    "content": ";;\n;; BASIC byte prefix to invoke the loader.  On return try to execute\n;; a CHAIN, which will fail if the filename is invalid; at that point\n;; ON ERROR GOTO will point to END.  If desired the ON ERROR GOTO\n;; pointer at FF42h can be pointed to a different chunk of BASIC\n;; bytecode instead; to override the CHAIN string even if valid\n;; use RST 10h to trigger an error instead of returning.\n;;\n;; The filename string (if valid) should be padded with CR.\n;;\n_basic:\n\tdefb 133\t\t; ON ERROR GOTO\nb1:\tdefw b_end-b1-1\n\tdefb 221 + 11\t\t; PUSH int 11\n\tdefb 209\t\t; Function call, 1 parameter\n\tdefb 25\t\t\t; SYS()\t\tSYS(11) = BOFA\n\tdefb 199\t\t; PUSH int\n\tdefw _start\n\tdefb 156\t\t; + int\n\tdefb 209\t\t; Function call, 1 parameter\n\tdefb 23\t\t\t; CALL()\n\tdefb 184\t\t; End int expression\n\tdefb 134, 11\t\t; CHAIN\n\tdefb 203, 16\t\t; String, 16 bytes\nb_chainstr:\n\tdefm \":CHAINFILE:HERE:\"\t; This is an invalid filename\n\tdefb 185\t\t; End string expression (executes CHAIN)\nb_end:\n\tdefb 146\t\t; END\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/setup80.inc",
    "content": "\torg 0\t\t\t; This code must be position-independent\n\n\tdefc END=00C9h\t\t; END routine in BASIC ROM\n\tdefc RLINEo=0D71h\t; Run line in BASIC ROM (11273)\n\tdefc RLINEn=0D6Fh\t; Run line in BASIC ROM (9913)\n\tdefc CHAINPTR=0E64h\t; Pointer to CHAIN\n\tdefc BOFA=65052\n\tdefc EOFA=65054\n\tdefc ONERR=65076\t; Target for ON ERROR GOTO\n\n\t; Encode explicitly as this has to be a contiguous BASIC statement\n\tdefb 0xcb\t\t; String expression\n\tdefb '\"'\n\tdefb _enddata - _data\t; Length of string data\n_data:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/setup800.inc",
    "content": ";\n; Common setup code for ABC800\n;\n\n\tdefc BOFA=65286\n\tdefc EOFA=65288\n\tdefc HEAP=65290\n\tdefc BOTM=65292\n\tdefc TOPM=65294\n\tdefc TOPP=65296\n\n\tdefc SOFTNOCO=0012h\t; Error routine (A = error number)\n\tdefc HLBOFA=003Bh\t; LD HL,BOFA\n\tdefc IXBOFA=003Fh\t; LD IX,BOFA\n\tdefc HLPROG=0044h\t; LD HL,BOFA+20 (after header)\n\n\t;; First, the ABC800 BAC file header\n_header:\n\tdefb 8Fh\t\t; BASIC II\n\tdefb 0\n\tdefb 21h\t\t; Program flags (meaning unclear)\n\tdefb 0\nPRGSZ:\tdefw _end + 7\t\t; Adjust to total file length (7 = trailer)\n\tdefw 0\t\t\t; Scalar variable area size\n\tdefw 0\t\t\t; Address for scalar variable area\n\tdefw 0\t\t\t; Variable count\nCOMSZ:\tdefw 0\t\t\t; COMMON area size (memory reserved @ BOTM)\n\tdefw 0\t\t\t; COMMON declarations checksum\n\tdefw 0\t\t\t; Address for the first DEF statement\n\tdefw 0\t\t\t; Address for the first DATA statement\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/asmsrc/start80.inc",
    "content": ";;; -*- asm -*-\n;;;\n;;; Common initialization code and chaining setup for ABC80. If an\n;;; invalid string starting with : is set up as the chained string\n;;; (this is set up in the prefix by bin2abc) then call END instead.\n;;;\n;;; This sets up everything on the stack so that this is not dependent\n;;; on the program still being there on exit; a simple RET will do the\n;;; right thing here.\n;;;\n\n\tpop hl\t\t\t; Return address\n\tpop de\t\t\t; P-code position\n\tinc de\t\t\t; Skip end of integer statement\n\trst 56\t\t\t; Evaluate P-code expression\n\t;; This puts the chain filename address on the stack\n\tpop bc\t\t\t; Stack delta\n\tpop hl\t\t\t; Address of string\n\tpush hl\t\t\t; Put it back...\n\tpush bc\n\n\tld de,END\n\tld a,(hl)\t\t; First character in string\n\tcp a,':'\t\t; Invalid filename\n\tjr z,gotretn\t\t; Return to END\n\n\tld de,(CHAINPTR)\t; Pointer to the CHAIN routine\n\tinc de\t\t\t; Skip RST 56h (eval expression, already done)\ngotretn:\n\tpush de\t\t\t; Return address\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/helpers/compile",
    "content": "#! /bin/sh\n# Wrapper for compilers which do not understand '-c -o'.\n\nscriptversion=2018-03-07.03; # UTC\n\n# Copyright (C) 1999-2021 Free Software Foundation, Inc.\n# Written by Tom Tromey <tromey@cygnus.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\nnl='\n'\n\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent tools from complaining about whitespace usage.\nIFS=\" \"\"\t$nl\"\n\nfile_conv=\n\n# func_file_conv build_file lazy\n# Convert a $build file to $host form and store it in $file\n# Currently only supports Windows hosts. If the determined conversion\n# type is listed in (the comma separated) LAZY, no conversion will\n# take place.\nfunc_file_conv ()\n{\n  file=$1\n  case $file in\n    / | /[!/]*) # absolute file, and not a UNC file\n      if test -z \"$file_conv\"; then\n\t# lazily determine how to convert abs files\n\tcase `uname -s` in\n\t  MINGW*)\n\t    file_conv=mingw\n\t    ;;\n\t  CYGWIN* | MSYS*)\n\t    file_conv=cygwin\n\t    ;;\n\t  *)\n\t    file_conv=wine\n\t    ;;\n\tesac\n      fi\n      case $file_conv/,$2, in\n\t*,$file_conv,*)\n\t  ;;\n\tmingw/*)\n\t  file=`cmd //C echo \"$file \" | sed -e 's/\"\\(.*\\) \" *$/\\1/'`\n\t  ;;\n\tcygwin/* | msys/*)\n\t  file=`cygpath -m \"$file\" || echo \"$file\"`\n\t  ;;\n\twine/*)\n\t  file=`winepath -w \"$file\" || echo \"$file\"`\n\t  ;;\n      esac\n      ;;\n  esac\n}\n\n# func_cl_dashL linkdir\n# Make cl look for libraries in LINKDIR\nfunc_cl_dashL ()\n{\n  func_file_conv \"$1\"\n  if test -z \"$lib_path\"; then\n    lib_path=$file\n  else\n    lib_path=\"$lib_path;$file\"\n  fi\n  linker_opts=\"$linker_opts -LIBPATH:$file\"\n}\n\n# func_cl_dashl library\n# Do a library search-path lookup for cl\nfunc_cl_dashl ()\n{\n  lib=$1\n  found=no\n  save_IFS=$IFS\n  IFS=';'\n  for dir in $lib_path $LIB\n  do\n    IFS=$save_IFS\n    if $shared && test -f \"$dir/$lib.dll.lib\"; then\n      found=yes\n      lib=$dir/$lib.dll.lib\n      break\n    fi\n    if test -f \"$dir/$lib.lib\"; then\n      found=yes\n      lib=$dir/$lib.lib\n      break\n    fi\n    if test -f \"$dir/lib$lib.a\"; then\n      found=yes\n      lib=$dir/lib$lib.a\n      break\n    fi\n  done\n  IFS=$save_IFS\n\n  if test \"$found\" != yes; then\n    lib=$lib.lib\n  fi\n}\n\n# func_cl_wrapper cl arg...\n# Adjust compile command to suit cl\nfunc_cl_wrapper ()\n{\n  # Assume a capable shell\n  lib_path=\n  shared=:\n  linker_opts=\n  for arg\n  do\n    if test -n \"$eat\"; then\n      eat=\n    else\n      case $1 in\n\t-o)\n\t  # configure might choose to run compile as 'compile cc -o foo foo.c'.\n\t  eat=1\n\t  case $2 in\n\t    *.o | *.[oO][bB][jJ])\n\t      func_file_conv \"$2\"\n\t      set x \"$@\" -Fo\"$file\"\n\t      shift\n\t      ;;\n\t    *)\n\t      func_file_conv \"$2\"\n\t      set x \"$@\" -Fe\"$file\"\n\t      shift\n\t      ;;\n\t  esac\n\t  ;;\n\t-I)\n\t  eat=1\n\t  func_file_conv \"$2\" mingw\n\t  set x \"$@\" -I\"$file\"\n\t  shift\n\t  ;;\n\t-I*)\n\t  func_file_conv \"${1#-I}\" mingw\n\t  set x \"$@\" -I\"$file\"\n\t  shift\n\t  ;;\n\t-l)\n\t  eat=1\n\t  func_cl_dashl \"$2\"\n\t  set x \"$@\" \"$lib\"\n\t  shift\n\t  ;;\n\t-l*)\n\t  func_cl_dashl \"${1#-l}\"\n\t  set x \"$@\" \"$lib\"\n\t  shift\n\t  ;;\n\t-L)\n\t  eat=1\n\t  func_cl_dashL \"$2\"\n\t  ;;\n\t-L*)\n\t  func_cl_dashL \"${1#-L}\"\n\t  ;;\n\t-static)\n\t  shared=false\n\t  ;;\n\t-Wl,*)\n\t  arg=${1#-Wl,}\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for flag in $arg; do\n\t    IFS=\"$save_ifs\"\n\t    linker_opts=\"$linker_opts $flag\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  ;;\n\t-Xlinker)\n\t  eat=1\n\t  linker_opts=\"$linker_opts $2\"\n\t  ;;\n\t-*)\n\t  set x \"$@\" \"$1\"\n\t  shift\n\t  ;;\n\t*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)\n\t  func_file_conv \"$1\"\n\t  set x \"$@\" -Tp\"$file\"\n\t  shift\n\t  ;;\n\t*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])\n\t  func_file_conv \"$1\" mingw\n\t  set x \"$@\" \"$file\"\n\t  shift\n\t  ;;\n\t*)\n\t  set x \"$@\" \"$1\"\n\t  shift\n\t  ;;\n      esac\n    fi\n    shift\n  done\n  if test -n \"$linker_opts\"; then\n    linker_opts=\"-link$linker_opts\"\n  fi\n  exec \"$@\" $linker_opts\n  exit 1\n}\n\neat=\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try '$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: compile [--help] [--version] PROGRAM [ARGS]\n\nWrapper for compilers which do not understand '-c -o'.\nRemove '-o dest.o' from ARGS, run PROGRAM with the remaining\narguments, and rename the output as expected.\n\nIf you are trying to build a whole package this is not the\nright script to run: please start by reading the file 'INSTALL'.\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"compile $scriptversion\"\n    exit $?\n    ;;\n  cl | *[/\\\\]cl | cl.exe | *[/\\\\]cl.exe | \\\n  icl | *[/\\\\]icl | icl.exe | *[/\\\\]icl.exe )\n    func_cl_wrapper \"$@\"      # Doesn't return...\n    ;;\nesac\n\nofile=\ncfile=\n\nfor arg\ndo\n  if test -n \"$eat\"; then\n    eat=\n  else\n    case $1 in\n      -o)\n\t# configure might choose to run compile as 'compile cc -o foo foo.c'.\n\t# So we strip '-o arg' only if arg is an object.\n\teat=1\n\tcase $2 in\n\t  *.o | *.obj)\n\t    ofile=$2\n\t    ;;\n\t  *)\n\t    set x \"$@\" -o \"$2\"\n\t    shift\n\t    ;;\n\tesac\n\t;;\n      *.c)\n\tcfile=$1\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n      *)\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n    esac\n  fi\n  shift\ndone\n\nif test -z \"$ofile\" || test -z \"$cfile\"; then\n  # If no '-o' option was seen then we might have been invoked from a\n  # pattern rule where we don't need one.  That is ok -- this is a\n  # normal compilation that the losing compiler can handle.  If no\n  # '.c' file was seen then we are probably linking.  That is also\n  # ok.\n  exec \"$@\"\nfi\n\n# Name of file we expect compiler to create.\ncofile=`echo \"$cfile\" | sed 's|^.*[\\\\/]||; s|^[a-zA-Z]:||; s/\\.c$/.o/'`\n\n# Create the lock directory.\n# Note: use '[/\\\\:.-]' here to ensure that we don't use the same name\n# that we are using for the .o file.  Also, base the name on the expected\n# object file name, since that is what matters with a parallel build.\nlockdir=`echo \"$cofile\" | sed -e 's|[/\\\\:.-]|_|g'`.d\nwhile true; do\n  if mkdir \"$lockdir\" >/dev/null 2>&1; then\n    break\n  fi\n  sleep 1\ndone\n# FIXME: race condition here if user kills between mkdir and trap.\ntrap \"rmdir '$lockdir'; exit 1\" 1 2 15\n\n# Run the compile.\n\"$@\"\nret=$?\n\nif test -f \"$cofile\"; then\n  test \"$cofile\" = \"$ofile\" || mv \"$cofile\" \"$ofile\"\nelif test -f \"${cofile}bj\"; then\n  test \"${cofile}bj\" = \"$ofile\" || mv \"${cofile}bj\" \"$ofile\"\nfi\n\nrmdir \"$lockdir\"\nexit $ret\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC0\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/helpers/config.guess",
    "content": "#!/usr/bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright 1992-2022 Free Software Foundation, Inc.\n\n# shellcheck disable=SC2006,SC2268 # see below for rationale\n\ntimestamp='2022-05-25'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <https://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n#\n# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.\n#\n# You can get the latest version of this script from:\n# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess\n#\n# Please send patches to <config-patches@gnu.org>.\n\n\n# The \"shellcheck disable\" line above the timestamp inhibits complaints\n# about features and limitations of the classic Bourne shell that were\n# superseded or lifted in POSIX.  However, this script identifies a wide\n# variety of pre-POSIX systems that do not have POSIX shells at all, and\n# even some reasonably current systems (Solaris 10 as case-in-point) still\n# have a pre-POSIX /bin/sh.\n\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOptions:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright 1992-2022 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\n# Just in case it came from the environment.\nGUESS=\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\ntmp=\n# shellcheck disable=SC2172\ntrap 'test -z \"$tmp\" || rm -fr \"$tmp\"' 0 1 2 13 15\n\nset_cc_for_build() {\n    # prevent multiple calls if $tmp is already set\n    test \"$tmp\" && return 0\n    : \"${TMPDIR=/tmp}\"\n    # shellcheck disable=SC2039,SC3028\n    { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n\t{ test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir \"$tmp\" 2>/dev/null) ; } ||\n\t{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir \"$tmp\" 2>/dev/null) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n\t{ echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; }\n    dummy=$tmp/dummy\n    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in\n\t,,)    echo \"int x;\" > \"$dummy.c\"\n\t       for driver in cc gcc c89 c99 ; do\n\t\t   if ($driver -c -o \"$dummy.o\" \"$dummy.c\") >/dev/null 2>&1 ; then\n\t\t       CC_FOR_BUILD=$driver\n\t\t       break\n\t\t   fi\n\t       done\n\t       if test x\"$CC_FOR_BUILD\" = x ; then\n\t\t   CC_FOR_BUILD=no_compiler_found\n\t       fi\n\t       ;;\n\t,,*)   CC_FOR_BUILD=$CC ;;\n\t,*,*)  CC_FOR_BUILD=$HOST_CC ;;\n    esac\n}\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif test -f /.attbin/uname ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\ncase $UNAME_SYSTEM in\nLinux|GNU|GNU/*)\n\tLIBC=unknown\n\n\tset_cc_for_build\n\tcat <<-EOF > \"$dummy.c\"\n\t#include <features.h>\n\t#if defined(__UCLIBC__)\n\tLIBC=uclibc\n\t#elif defined(__dietlibc__)\n\tLIBC=dietlibc\n\t#elif defined(__GLIBC__)\n\tLIBC=gnu\n\t#else\n\t#include <stdarg.h>\n\t/* First heuristic to detect musl libc.  */\n\t#ifdef __DEFINED_va_list\n\tLIBC=musl\n\t#endif\n\t#endif\n\tEOF\n\tcc_set_libc=`$CC_FOR_BUILD -E \"$dummy.c\" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`\n\teval \"$cc_set_libc\"\n\n\t# Second heuristic to detect musl libc.\n\tif [ \"$LIBC\" = unknown ] &&\n\t   command -v ldd >/dev/null &&\n\t   ldd --version 2>&1 | grep -q ^musl; then\n\t\tLIBC=musl\n\tfi\n\n\t# If the system lacks a compiler, then just pick glibc.\n\t# We could probably try harder.\n\tif [ \"$LIBC\" = unknown ]; then\n\t\tLIBC=gnu\n\tfi\n\t;;\nesac\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tUNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \\\n\t    /sbin/sysctl -n hw.machine_arch 2>/dev/null || \\\n\t    /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \\\n\t    echo unknown)`\n\tcase $UNAME_MACHINE_ARCH in\n\t    aarch64eb) machine=aarch64_be-unknown ;;\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    earmv*)\n\t\tarch=`echo \"$UNAME_MACHINE_ARCH\" | sed -e 's,^e\\(armv[0-9]\\).*$,\\1,'`\n\t\tendian=`echo \"$UNAME_MACHINE_ARCH\" | sed -ne 's,^.*\\(eb\\)$,\\1,p'`\n\t\tmachine=${arch}${endian}-unknown\n\t\t;;\n\t    *) machine=$UNAME_MACHINE_ARCH-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently (or will in the future) and ABI.\n\tcase $UNAME_MACHINE_ARCH in\n\t    earm*)\n\t\tos=netbsdelf\n\t\t;;\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\tset_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep -q __ELF__\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t\tos=netbsd\n\t\t;;\n\tesac\n\t# Determine ABI tags.\n\tcase $UNAME_MACHINE_ARCH in\n\t    earm*)\n\t\texpr='s/^earmv[0-9]/-eabi/;s/eb$//'\n\t\tabi=`echo \"$UNAME_MACHINE_ARCH\" | sed -e \"$expr\"`\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase $UNAME_VERSION in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo \"$UNAME_RELEASE\" | sed -e 's/[-_].*//' | cut -d. -f1,2`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\tGUESS=$machine-${os}${release}${abi-}\n\t;;\n    *:Bitrig:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`\n\tGUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE\n\t;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\tGUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE\n\t;;\n    *:SecBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`\n\tGUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE\n\t;;\n    *:LibertyBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\\.//'`\n\tGUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE\n\t;;\n    *:MidnightBSD:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE\n\t;;\n    *:ekkoBSD:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE\n\t;;\n    *:SolidBSD:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE\n\t;;\n    *:OS108:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE\n\t;;\n    macppc:MirBSD:*:*)\n\tGUESS=powerpc-unknown-mirbsd$UNAME_RELEASE\n\t;;\n    *:MirBSD:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE\n\t;;\n    *:Sortix:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-sortix\n\t;;\n    *:Twizzler:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-twizzler\n\t;;\n    *:Redox:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-redox\n\t;;\n    mips:OSF1:*.*)\n\tGUESS=mips-dec-osf1\n\t;;\n    alpha:OSF1:*:*)\n\t# Reset EXIT trap before exiting to avoid spurious non-zero exit code.\n\ttrap '' 0\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase $ALPHA_CPU_TYPE in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=alpha ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=alpha ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=alpha ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=alphaev5 ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=alphaev56 ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=alphapca56 ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=alphapca57 ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=alphaev6 ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=alphaev67 ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=alphaev68 ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=alphaev68 ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=alphaev68 ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=alphaev69 ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=alphaev7 ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=alphaev79 ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\tOSF_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`\n\tGUESS=$UNAME_MACHINE-dec-osf$OSF_REL\n\t;;\n    Amiga*:UNIX_System_V:4.0:*)\n\tGUESS=m68k-unknown-sysv4\n\t;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-amigaos\n\t;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-morphos\n\t;;\n    *:OS/390:*:*)\n\tGUESS=i370-ibm-openedition\n\t;;\n    *:z/VM:*:*)\n\tGUESS=s390-ibm-zvmoe\n\t;;\n    *:OS400:*:*)\n\tGUESS=powerpc-ibm-os400\n\t;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\tGUESS=arm-acorn-riscix$UNAME_RELEASE\n\t;;\n    arm*:riscos:*:*|arm*:RISCOS:*:*)\n\tGUESS=arm-unknown-riscos\n\t;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\tGUESS=hppa1.1-hitachi-hiuxmpp\n\t;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tcase `(/bin/universe) 2>/dev/null` in\n\t    att) GUESS=pyramid-pyramid-sysv3 ;;\n\t    *)   GUESS=pyramid-pyramid-bsd   ;;\n\tesac\n\t;;\n    NILE*:*:*:dcosx)\n\tGUESS=pyramid-pyramid-svr4\n\t;;\n    DRS?6000:unix:4.0:6*)\n\tGUESS=sparc-icl-nx6\n\t;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) GUESS=sparc-icl-nx7 ;;\n\tesac\n\t;;\n    s390x:SunOS:*:*)\n\tSUN_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\n\tGUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL\n\t;;\n    sun4H:SunOS:5.*:*)\n\tSUN_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\n\tGUESS=sparc-hal-solaris2$SUN_REL\n\t;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\tSUN_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\n\tGUESS=sparc-sun-solaris2$SUN_REL\n\t;;\n    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)\n\tGUESS=i386-pc-auroraux$UNAME_RELEASE\n\t;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\tset_cc_for_build\n\tSUN_ARCH=i386\n\t# If there is a compiler, see if it is configured for 64-bit objects.\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\n\t# This test works for both compilers.\n\tif test \"$CC_FOR_BUILD\" != no_compiler_found; then\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS=\"\" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tSUN_ARCH=x86_64\n\t    fi\n\tfi\n\tSUN_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\n\tGUESS=$SUN_ARCH-pc-solaris2$SUN_REL\n\t;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\tSUN_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\n\tGUESS=sparc-sun-solaris3$SUN_REL\n\t;;\n    sun4*:SunOS:*:*)\n\tcase `/usr/bin/arch -k` in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\tSUN_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/-/_/'`\n\tGUESS=sparc-sun-sunos$SUN_REL\n\t;;\n    sun3*:SunOS:*:*)\n\tGUESS=m68k-sun-sunos$UNAME_RELEASE\n\t;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x$UNAME_RELEASE\" = x && UNAME_RELEASE=3\n\tcase `/bin/arch` in\n\t    sun3)\n\t\tGUESS=m68k-sun-sunos$UNAME_RELEASE\n\t\t;;\n\t    sun4)\n\t\tGUESS=sparc-sun-sunos$UNAME_RELEASE\n\t\t;;\n\tesac\n\t;;\n    aushp:SunOS:*:*)\n\tGUESS=sparc-auspex-sunos$UNAME_RELEASE\n\t;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n\tGUESS=m68k-atari-mint$UNAME_RELEASE\n\t;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\tGUESS=m68k-atari-mint$UNAME_RELEASE\n\t;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n\tGUESS=m68k-atari-mint$UNAME_RELEASE\n\t;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n\tGUESS=m68k-milan-mint$UNAME_RELEASE\n\t;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n\tGUESS=m68k-hades-mint$UNAME_RELEASE\n\t;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n\tGUESS=m68k-unknown-mint$UNAME_RELEASE\n\t;;\n    m68k:machten:*:*)\n\tGUESS=m68k-apple-machten$UNAME_RELEASE\n\t;;\n    powerpc:machten:*:*)\n\tGUESS=powerpc-apple-machten$UNAME_RELEASE\n\t;;\n    RISC*:Mach:*:*)\n\tGUESS=mips-dec-mach_bsd4.3\n\t;;\n    RISC*:ULTRIX:*:*)\n\tGUESS=mips-dec-ultrix$UNAME_RELEASE\n\t;;\n    VAX*:ULTRIX*:*:*)\n\tGUESS=vax-dec-ultrix$UNAME_RELEASE\n\t;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\tGUESS=clipper-intergraph-clix$UNAME_RELEASE\n\t;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\tset_cc_for_build\n\tsed 's/^\t//' << EOF > \"$dummy.c\"\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" &&\n\t  dummyarg=`echo \"$UNAME_RELEASE\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`\"$dummy\" \"$dummyarg\"` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\tGUESS=mips-mips-riscos$UNAME_RELEASE\n\t;;\n    Motorola:PowerMAX_OS:*:*)\n\tGUESS=powerpc-motorola-powermax\n\t;;\n    Motorola:*:4.3:PL8-*)\n\tGUESS=powerpc-harris-powermax\n\t;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\tGUESS=powerpc-harris-powermax\n\t;;\n    Night_Hawk:Power_UNIX:*:*)\n\tGUESS=powerpc-harris-powerunix\n\t;;\n    m88k:CX/UX:7*:*)\n\tGUESS=m88k-harris-cxux7\n\t;;\n    m88k:*:4*:R4*)\n\tGUESS=m88k-motorola-sysv4\n\t;;\n    m88k:*:3*:R3*)\n\tGUESS=m88k-motorola-sysv3\n\t;;\n    AViiON:dgux:*:*)\n\t# DG/UX returns AViiON for all architectures\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif test \"$UNAME_PROCESSOR\" = mc88100 || test \"$UNAME_PROCESSOR\" = mc88110\n\tthen\n\t    if test \"$TARGET_BINARY_INTERFACE\"x = m88kdguxelfx || \\\n\t       test \"$TARGET_BINARY_INTERFACE\"x = x\n\t    then\n\t\tGUESS=m88k-dg-dgux$UNAME_RELEASE\n\t    else\n\t\tGUESS=m88k-dg-dguxbcs$UNAME_RELEASE\n\t    fi\n\telse\n\t    GUESS=i586-dg-dgux$UNAME_RELEASE\n\tfi\n\t;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\tGUESS=m88k-dolphin-sysv3\n\t;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\tGUESS=m88k-motorola-sysv3\n\t;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\tGUESS=m88k-tektronix-sysv3\n\t;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\tGUESS=m68k-tektronix-bsd\n\t;;\n    *:IRIX*:*:*)\n\tIRIX_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/-/_/g'`\n\tGUESS=mips-sgi-irix$IRIX_REL\n\t;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\tGUESS=romp-ibm-aix    # uname -m gives an 8 hex-code CPU id\n\t;;                    # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\tGUESS=i386-ibm-aix\n\t;;\n    ia64:AIX:*:*)\n\tif test -x /usr/bin/oslevel ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=$UNAME_VERSION.$UNAME_RELEASE\n\tfi\n\tGUESS=$UNAME_MACHINE-ibm-aix$IBM_REV\n\t;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\tset_cc_for_build\n\t\tsed 's/^\t\t//' << EOF > \"$dummy.c\"\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" && SYSTEM_NAME=`\"$dummy\"`\n\t\tthen\n\t\t\tGUESS=$SYSTEM_NAME\n\t\telse\n\t\t\tGUESS=rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\tGUESS=rs6000-ibm-aix3.2.4\n\telse\n\t\tGUESS=rs6000-ibm-aix3.2\n\tfi\n\t;;\n    *:AIX:*:[4567])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El \"$IBM_CPU_ID\" | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif test -x /usr/bin/lslpp ; then\n\t\tIBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \\\n\t\t\t   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`\n\telse\n\t\tIBM_REV=$UNAME_VERSION.$UNAME_RELEASE\n\tfi\n\tGUESS=$IBM_ARCH-ibm-aix$IBM_REV\n\t;;\n    *:AIX:*:*)\n\tGUESS=rs6000-ibm-aix\n\t;;\n    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)\n\tGUESS=romp-ibm-bsd4.4\n\t;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\tGUESS=romp-ibm-bsd$UNAME_RELEASE    # 4.3 with uname added to\n\t;;                                  # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\tGUESS=rs6000-bull-bosx\n\t;;\n    DPX/2?00:B.O.S.:*:*)\n\tGUESS=m68k-bull-sysv3\n\t;;\n    9000/[34]??:4.3bsd:1.*:*)\n\tGUESS=m68k-hp-bsd\n\t;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\tGUESS=m68k-hp-bsd4.4\n\t;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*.[0B]*//'`\n\tcase $UNAME_MACHINE in\n\t    9000/31?)            HP_ARCH=m68000 ;;\n\t    9000/[34]??)         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif test -x /usr/bin/getconf; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n\t\t    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n\t\t    case $sc_cpu_version in\n\t\t      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0\n\t\t      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1\n\t\t      532)                      # CPU_PA_RISC2_0\n\t\t\tcase $sc_kernel_bits in\n\t\t\t  32) HP_ARCH=hppa2.0n ;;\n\t\t\t  64) HP_ARCH=hppa2.0w ;;\n\t\t\t  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20\n\t\t\tesac ;;\n\t\t    esac\n\t\tfi\n\t\tif test \"$HP_ARCH\" = \"\"; then\n\t\t    set_cc_for_build\n\t\t    sed 's/^\t\t//' << EOF > \"$dummy.c\"\n\n\t\t#define _HPUX_SOURCE\n\t\t#include <stdlib.h>\n\t\t#include <unistd.h>\n\n\t\tint main ()\n\t\t{\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t    long bits = sysconf(_SC_KERNEL_BITS);\n\t\t#endif\n\t\t    long cpu  = sysconf (_SC_CPU_VERSION);\n\n\t\t    switch (cpu)\n\t\t\t{\n\t\t\tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n\t\t\tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n\t\t\tcase CPU_PA_RISC2_0:\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t\t    switch (bits)\n\t\t\t\t{\n\t\t\t\tcase 64: puts (\"hppa2.0w\"); break;\n\t\t\t\tcase 32: puts (\"hppa2.0n\"); break;\n\t\t\t\tdefault: puts (\"hppa2.0\"); break;\n\t\t\t\t} break;\n\t\t#else  /* !defined(_SC_KERNEL_BITS) */\n\t\t\t    puts (\"hppa2.0\"); break;\n\t\t#endif\n\t\t\tdefault: puts (\"hppa1.0\"); break;\n\t\t\t}\n\t\t    exit (0);\n\t\t}\nEOF\n\t\t    (CCOPTS=\"\" $CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" 2>/dev/null) && HP_ARCH=`\"$dummy\"`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif test \"$HP_ARCH\" = hppa2.0w\n\tthen\n\t    set_cc_for_build\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS=\"\" $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep -q __LP64__\n\t    then\n\t\tHP_ARCH=hppa2.0w\n\t    else\n\t\tHP_ARCH=hppa64\n\t    fi\n\tfi\n\tGUESS=$HP_ARCH-hp-hpux$HPUX_REV\n\t;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*.[0B]*//'`\n\tGUESS=ia64-hp-hpux$HPUX_REV\n\t;;\n    3050*:HI-UX:*:*)\n\tset_cc_for_build\n\tsed 's/^\t//' << EOF > \"$dummy.c\"\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" && SYSTEM_NAME=`\"$dummy\"` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\tGUESS=unknown-hitachi-hiuxwe2\n\t;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)\n\tGUESS=hppa1.1-hp-bsd\n\t;;\n    9000/8??:4.3bsd:*:*)\n\tGUESS=hppa1.0-hp-bsd\n\t;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\tGUESS=hppa1.0-hp-mpeix\n\t;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)\n\tGUESS=hppa1.1-hp-osf\n\t;;\n    hp8??:OSF1:*:*)\n\tGUESS=hppa1.0-hp-osf\n\t;;\n    i*86:OSF1:*:*)\n\tif test -x /usr/sbin/sysversion ; then\n\t    GUESS=$UNAME_MACHINE-unknown-osf1mk\n\telse\n\t    GUESS=$UNAME_MACHINE-unknown-osf1\n\tfi\n\t;;\n    parisc*:Lites*:*:*)\n\tGUESS=hppa1.1-hp-lites\n\t;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\tGUESS=c1-convex-bsd\n\t;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\tGUESS=c34-convex-bsd\n\t;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\tGUESS=c38-convex-bsd\n\t;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\tGUESS=c4-convex-bsd\n\t;;\n    CRAY*Y-MP:*:*:*)\n\tCRAY_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'`\n\tGUESS=ymp-cray-unicos$CRAY_REL\n\t;;\n    CRAY*[A-Z]90:*:*:*)\n\techo \"$UNAME_MACHINE\"-cray-unicos\"$UNAME_RELEASE\" \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\tCRAY_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'`\n\tGUESS=t90-cray-unicos$CRAY_REL\n\t;;\n    CRAY*T3E:*:*:*)\n\tCRAY_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'`\n\tGUESS=alphaev5-cray-unicosmk$CRAY_REL\n\t;;\n    CRAY*SV1:*:*:*)\n\tCRAY_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'`\n\tGUESS=sv1-cray-unicos$CRAY_REL\n\t;;\n    *:UNICOS/mp:*:*)\n\tCRAY_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'`\n\tGUESS=craynv-cray-unicosmp$CRAY_REL\n\t;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`\n\tFUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/ /_/'`\n\tGUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\n\t;;\n    5000:UNIX_System_V:4.*:*)\n\tFUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo \"$UNAME_RELEASE\" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`\n\tGUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\n\t;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\tGUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE\n\t;;\n    sparc*:BSD/OS:*:*)\n\tGUESS=sparc-unknown-bsdi$UNAME_RELEASE\n\t;;\n    *:BSD/OS:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE\n\t;;\n    arm:FreeBSD:*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tset_cc_for_build\n\tif echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_PCS_VFP\n\tthen\n\t    FREEBSD_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[-(].*//'`\n\t    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi\n\telse\n\t    FREEBSD_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[-(].*//'`\n\t    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf\n\tfi\n\t;;\n    *:FreeBSD:*:*)\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tcase $UNAME_PROCESSOR in\n\t    amd64)\n\t\tUNAME_PROCESSOR=x86_64 ;;\n\t    i386)\n\t\tUNAME_PROCESSOR=i586 ;;\n\tesac\n\tFREEBSD_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[-(].*//'`\n\tGUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL\n\t;;\n    i*:CYGWIN*:*)\n\tGUESS=$UNAME_MACHINE-pc-cygwin\n\t;;\n    *:MINGW64*:*)\n\tGUESS=$UNAME_MACHINE-pc-mingw64\n\t;;\n    *:MINGW*:*)\n\tGUESS=$UNAME_MACHINE-pc-mingw32\n\t;;\n    *:MSYS*:*)\n\tGUESS=$UNAME_MACHINE-pc-msys\n\t;;\n    i*:PW*:*)\n\tGUESS=$UNAME_MACHINE-pc-pw32\n\t;;\n    *:SerenityOS:*:*)\n        GUESS=$UNAME_MACHINE-pc-serenity\n        ;;\n    *:Interix*:*)\n\tcase $UNAME_MACHINE in\n\t    x86)\n\t\tGUESS=i586-pc-interix$UNAME_RELEASE\n\t\t;;\n\t    authenticamd | genuineintel | EM64T)\n\t\tGUESS=x86_64-unknown-interix$UNAME_RELEASE\n\t\t;;\n\t    IA64)\n\t\tGUESS=ia64-unknown-interix$UNAME_RELEASE\n\t\t;;\n\tesac ;;\n    i*:UWIN*:*)\n\tGUESS=$UNAME_MACHINE-pc-uwin\n\t;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\tGUESS=x86_64-pc-cygwin\n\t;;\n    prep*:SunOS:5.*:*)\n\tSUN_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\n\tGUESS=powerpcle-unknown-solaris2$SUN_REL\n\t;;\n    *:GNU:*:*)\n\t# the GNU system\n\tGNU_ARCH=`echo \"$UNAME_MACHINE\" | sed -e 's,[-/].*$,,'`\n\tGNU_REL=`echo \"$UNAME_RELEASE\" | sed -e 's,/.*$,,'`\n\tGUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL\n\t;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\tGNU_SYS=`echo \"$UNAME_SYSTEM\" | sed 's,^[^/]*/,,' | tr \"[:upper:]\" \"[:lower:]\"`\n\tGNU_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[-(].*//'`\n\tGUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC\n\t;;\n    *:Minix:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-minix\n\t;;\n    aarch64:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    aarch64_be:Linux:*:*)\n\tUNAME_MACHINE=aarch64_be\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' /proc/cpuinfo 2>/dev/null` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n\tesac\n\tobjdump --private-headers /bin/sh | grep -q ld.so.1\n\tif test \"$?\" = 0 ; then LIBC=gnulibc1 ; fi\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    arm*:Linux:*:*)\n\tset_cc_for_build\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_EABI__\n\tthen\n\t    GUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\telse\n\t    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t| grep -q __ARM_PCS_VFP\n\t    then\n\t\tGUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi\n\t    else\n\t\tGUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf\n\t    fi\n\tfi\n\t;;\n    avr32*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    cris:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-axis-linux-$LIBC\n\t;;\n    crisv32:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-axis-linux-$LIBC\n\t;;\n    e2k:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    frv:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    hexagon:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    i*86:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-pc-linux-$LIBC\n\t;;\n    ia64:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    k1om:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    m32r*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    m68*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    mips:Linux:*:* | mips64:Linux:*:*)\n\tset_cc_for_build\n\tIS_GLIBC=0\n\ttest x\"${LIBC}\" = xgnu && IS_GLIBC=1\n\tsed 's/^\t//' << EOF > \"$dummy.c\"\n\t#undef CPU\n\t#undef mips\n\t#undef mipsel\n\t#undef mips64\n\t#undef mips64el\n\t#if ${IS_GLIBC} && defined(_ABI64)\n\tLIBCABI=gnuabi64\n\t#else\n\t#if ${IS_GLIBC} && defined(_ABIN32)\n\tLIBCABI=gnuabin32\n\t#else\n\tLIBCABI=${LIBC}\n\t#endif\n\t#endif\n\n\t#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6\n\tCPU=mipsisa64r6\n\t#else\n\t#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6\n\tCPU=mipsisa32r6\n\t#else\n\t#if defined(__mips64)\n\tCPU=mips64\n\t#else\n\tCPU=mips\n\t#endif\n\t#endif\n\t#endif\n\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tMIPS_ENDIAN=el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tMIPS_ENDIAN=\n\t#else\n\tMIPS_ENDIAN=\n\t#endif\n\t#endif\nEOF\n\tcc_set_vars=`$CC_FOR_BUILD -E \"$dummy.c\" 2>/dev/null | grep '^CPU\\|^MIPS_ENDIAN\\|^LIBCABI'`\n\teval \"$cc_set_vars\"\n\ttest \"x$CPU\" != x && { echo \"$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI\"; exit; }\n\t;;\n    mips64el:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    openrisc*:Linux:*:*)\n\tGUESS=or1k-unknown-linux-$LIBC\n\t;;\n    or32:Linux:*:* | or1k*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    padre:Linux:*:*)\n\tGUESS=sparc-unknown-linux-$LIBC\n\t;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\tGUESS=hppa64-unknown-linux-$LIBC\n\t;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;\n\t  PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;\n\t  *)    GUESS=hppa-unknown-linux-$LIBC ;;\n\tesac\n\t;;\n    ppc64:Linux:*:*)\n\tGUESS=powerpc64-unknown-linux-$LIBC\n\t;;\n    ppc:Linux:*:*)\n\tGUESS=powerpc-unknown-linux-$LIBC\n\t;;\n    ppc64le:Linux:*:*)\n\tGUESS=powerpc64le-unknown-linux-$LIBC\n\t;;\n    ppcle:Linux:*:*)\n\tGUESS=powerpcle-unknown-linux-$LIBC\n\t;;\n    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-ibm-linux-$LIBC\n\t;;\n    sh64*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    sh*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    tile*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    vax:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-dec-linux-$LIBC\n\t;;\n    x86_64:Linux:*:*)\n\tset_cc_for_build\n\tCPU=$UNAME_MACHINE\n\tLIBCABI=$LIBC\n\tif test \"$CC_FOR_BUILD\" != no_compiler_found; then\n\t    ABI=64\n\t    sed 's/^\t    //' << EOF > \"$dummy.c\"\n\t    #ifdef __i386__\n\t    ABI=x86\n\t    #else\n\t    #ifdef __ILP32__\n\t    ABI=x32\n\t    #endif\n\t    #endif\nEOF\n\t    cc_set_abi=`$CC_FOR_BUILD -E \"$dummy.c\" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`\n\t    eval \"$cc_set_abi\"\n\t    case $ABI in\n\t\tx86) CPU=i686 ;;\n\t\tx32) LIBCABI=${LIBC}x32 ;;\n\t    esac\n\tfi\n\tGUESS=$CPU-pc-linux-$LIBCABI\n\t;;\n    xtensa*:Linux:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-linux-$LIBC\n\t;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\tGUESS=i386-sequent-sysv4\n\t;;\n    i*86:UNIX_SV:4.2MP:2.*)\n\t# Unixware is an offshoot of SVR4, but it has its own version\n\t# number series starting with 2...\n\t# I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n\t# Use sysv4.2uw... so that sysv4* matches it.\n\tGUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION\n\t;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\tGUESS=$UNAME_MACHINE-pc-os2-emx\n\t;;\n    i*86:XTS-300:*:STOP)\n\tGUESS=$UNAME_MACHINE-unknown-stop\n\t;;\n    i*86:atheos:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-atheos\n\t;;\n    i*86:syllable:*:*)\n\tGUESS=$UNAME_MACHINE-pc-syllable\n\t;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)\n\tGUESS=i386-unknown-lynxos$UNAME_RELEASE\n\t;;\n    i*86:*DOS:*:*)\n\tGUESS=$UNAME_MACHINE-pc-msdosdjgpp\n\t;;\n    i*86:*:4.*:*)\n\tUNAME_REL=`echo \"$UNAME_RELEASE\" | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\tGUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL\n\telse\n\t\tGUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL\n\tfi\n\t;;\n    i*86:*:5:[678]*)\n\t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\tGUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\t;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\tGUESS=$UNAME_MACHINE-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\tGUESS=$UNAME_MACHINE-pc-sco$UNAME_REL\n\telse\n\t\tGUESS=$UNAME_MACHINE-pc-sysv32\n\tfi\n\t;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n\t# uname -m prints for DJGPP always 'pc', but it prints nothing about\n\t# the processor, so we play safe by assuming i586.\n\t# Note: whatever this is, it MUST be the same as what config.sub\n\t# prints for the \"djgpp\" host, or else GDB configure will decide that\n\t# this is a cross-build.\n\tGUESS=i586-pc-msdosdjgpp\n\t;;\n    Intel:Mach:3*:*)\n\tGUESS=i386-pc-mach3\n\t;;\n    paragon:*:*:*)\n\tGUESS=i860-intel-osf1\n\t;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  GUESS=i860-stardent-sysv$UNAME_RELEASE    # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  GUESS=i860-unknown-sysv$UNAME_RELEASE     # Unknown i860-SVR4\n\tfi\n\t;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\tGUESS=m68010-convergent-sysv\n\t;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\tGUESS=m68k-convergent-sysv\n\t;;\n    M680?0:D-NIX:5.3:*)\n\tGUESS=m68k-diab-dnix\n\t;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3\"$OS_REL\"; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3\"$OS_REL\"; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4; exit; } ;;\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\n\tOS_REL='.3'\n\ttest -r /etc/.relid \\\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t    && { echo i486-ncr-sysv4.3\"$OS_REL\"; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3\"$OS_REL\"; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3\"$OS_REL\"; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\tGUESS=m68k-unknown-lynxos$UNAME_RELEASE\n\t;;\n    mc68030:UNIX_System_V:4.*:*)\n\tGUESS=m68k-atari-sysv4\n\t;;\n    TSUNAMI:LynxOS:2.*:*)\n\tGUESS=sparc-unknown-lynxos$UNAME_RELEASE\n\t;;\n    rs6000:LynxOS:2.*:*)\n\tGUESS=rs6000-unknown-lynxos$UNAME_RELEASE\n\t;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)\n\tGUESS=powerpc-unknown-lynxos$UNAME_RELEASE\n\t;;\n    SM[BE]S:UNIX_SV:*:*)\n\tGUESS=mips-dde-sysv$UNAME_RELEASE\n\t;;\n    RM*:ReliantUNIX-*:*:*)\n\tGUESS=mips-sni-sysv4\n\t;;\n    RM*:SINIX-*:*:*)\n\tGUESS=mips-sni-sysv4\n\t;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\tGUESS=$UNAME_MACHINE-sni-sysv4\n\telse\n\t\tGUESS=ns32k-sni-sysv\n\tfi\n\t;;\n    PENTIUM:*:4.0*:*)\t# Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n\t\t\t# says <Richard.M.Bartel@ccMail.Census.GOV>\n\tGUESS=i586-unisys-sysv4\n\t;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\tGUESS=hppa1.1-stratus-sysv4\n\t;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\tGUESS=i860-stratus-sysv4\n\t;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\tGUESS=$UNAME_MACHINE-stratus-vos\n\t;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\tGUESS=hppa1.1-stratus-vos\n\t;;\n    mc68*:A/UX:*:*)\n\tGUESS=m68k-apple-aux$UNAME_RELEASE\n\t;;\n    news*:NEWS-OS:6*:*)\n\tGUESS=mips-sony-newsos6\n\t;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif test -d /usr/nec; then\n\t\tGUESS=mips-nec-sysv$UNAME_RELEASE\n\telse\n\t\tGUESS=mips-unknown-sysv$UNAME_RELEASE\n\tfi\n\t;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\tGUESS=powerpc-be-beos\n\t;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\tGUESS=powerpc-apple-beos\n\t;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\tGUESS=i586-pc-beos\n\t;;\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\n\tGUESS=i586-pc-haiku\n\t;;\n    ppc:Haiku:*:*)\t# Haiku running on Apple PowerPC\n\tGUESS=powerpc-apple-haiku\n\t;;\n    *:Haiku:*:*)\t# Haiku modern gcc (not bound by BeOS compat)\n\tGUESS=$UNAME_MACHINE-unknown-haiku\n\t;;\n    SX-4:SUPER-UX:*:*)\n\tGUESS=sx4-nec-superux$UNAME_RELEASE\n\t;;\n    SX-5:SUPER-UX:*:*)\n\tGUESS=sx5-nec-superux$UNAME_RELEASE\n\t;;\n    SX-6:SUPER-UX:*:*)\n\tGUESS=sx6-nec-superux$UNAME_RELEASE\n\t;;\n    SX-7:SUPER-UX:*:*)\n\tGUESS=sx7-nec-superux$UNAME_RELEASE\n\t;;\n    SX-8:SUPER-UX:*:*)\n\tGUESS=sx8-nec-superux$UNAME_RELEASE\n\t;;\n    SX-8R:SUPER-UX:*:*)\n\tGUESS=sx8r-nec-superux$UNAME_RELEASE\n\t;;\n    SX-ACE:SUPER-UX:*:*)\n\tGUESS=sxace-nec-superux$UNAME_RELEASE\n\t;;\n    Power*:Rhapsody:*:*)\n\tGUESS=powerpc-apple-rhapsody$UNAME_RELEASE\n\t;;\n    *:Rhapsody:*:*)\n\tGUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE\n\t;;\n    arm64:Darwin:*:*)\n\tGUESS=aarch64-apple-darwin$UNAME_RELEASE\n\t;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tcase $UNAME_PROCESSOR in\n\t    unknown) UNAME_PROCESSOR=powerpc ;;\n\tesac\n\tif command -v xcode-select > /dev/null 2> /dev/null && \\\n\t\t! xcode-select --print-path > /dev/null 2> /dev/null ; then\n\t    # Avoid executing cc if there is no toolchain installed as\n\t    # cc will be a stub that puts up a graphical alert\n\t    # prompting the user to install developer tools.\n\t    CC_FOR_BUILD=no_compiler_found\n\telse\n\t    set_cc_for_build\n\tfi\n\tif test \"$CC_FOR_BUILD\" != no_compiler_found; then\n\t    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t   (CCOPTS=\"\" $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\t   grep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tcase $UNAME_PROCESSOR in\n\t\t    i386) UNAME_PROCESSOR=x86_64 ;;\n\t\t    powerpc) UNAME_PROCESSOR=powerpc64 ;;\n\t\tesac\n\t    fi\n\t    # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc\n\t    if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \\\n\t\t   (CCOPTS=\"\" $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\t   grep IS_PPC >/dev/null\n\t    then\n\t\tUNAME_PROCESSOR=powerpc\n\t    fi\n\telif test \"$UNAME_PROCESSOR\" = i386 ; then\n\t    # uname -m returns i386 or x86_64\n\t    UNAME_PROCESSOR=$UNAME_MACHINE\n\tfi\n\tGUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE\n\t;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = x86; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\tGUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE\n\t;;\n    *:QNX:*:4*)\n\tGUESS=i386-pc-qnx\n\t;;\n    NEO-*:NONSTOP_KERNEL:*:*)\n\tGUESS=neo-tandem-nsk$UNAME_RELEASE\n\t;;\n    NSE-*:NONSTOP_KERNEL:*:*)\n\tGUESS=nse-tandem-nsk$UNAME_RELEASE\n\t;;\n    NSR-*:NONSTOP_KERNEL:*:*)\n\tGUESS=nsr-tandem-nsk$UNAME_RELEASE\n\t;;\n    NSV-*:NONSTOP_KERNEL:*:*)\n\tGUESS=nsv-tandem-nsk$UNAME_RELEASE\n\t;;\n    NSX-*:NONSTOP_KERNEL:*:*)\n\tGUESS=nsx-tandem-nsk$UNAME_RELEASE\n\t;;\n    *:NonStop-UX:*:*)\n\tGUESS=mips-compaq-nonstopux\n\t;;\n    BS2000:POSIX*:*:*)\n\tGUESS=bs2000-siemens-sysv\n\t;;\n    DS/*:UNIX_System_V:*:*)\n\tGUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE\n\t;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"${cputype-}\" = 386; then\n\t    UNAME_MACHINE=i386\n\telif test \"x${cputype-}\" != x; then\n\t    UNAME_MACHINE=$cputype\n\tfi\n\tGUESS=$UNAME_MACHINE-unknown-plan9\n\t;;\n    *:TOPS-10:*:*)\n\tGUESS=pdp10-unknown-tops10\n\t;;\n    *:TENEX:*:*)\n\tGUESS=pdp10-unknown-tenex\n\t;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\tGUESS=pdp10-dec-tops20\n\t;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\tGUESS=pdp10-xkl-tops20\n\t;;\n    *:TOPS-20:*:*)\n\tGUESS=pdp10-unknown-tops20\n\t;;\n    *:ITS:*:*)\n\tGUESS=pdp10-unknown-its\n\t;;\n    SEI:*:*:SEIUX)\n\tGUESS=mips-sei-seiux$UNAME_RELEASE\n\t;;\n    *:DragonFly:*:*)\n\tDRAGONFLY_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/[-(].*//'`\n\tGUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL\n\t;;\n    *:*VMS:*:*)\n\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase $UNAME_MACHINE in\n\t    A*) GUESS=alpha-dec-vms ;;\n\t    I*) GUESS=ia64-dec-vms ;;\n\t    V*) GUESS=vax-dec-vms ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\tGUESS=i386-pc-xenix\n\t;;\n    i*86:skyos:*:*)\n\tSKYOS_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/ .*$//'`\n\tGUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL\n\t;;\n    i*86:rdos:*:*)\n\tGUESS=$UNAME_MACHINE-pc-rdos\n\t;;\n    i*86:Fiwix:*:*)\n\tGUESS=$UNAME_MACHINE-pc-fiwix\n\t;;\n    *:AROS:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-aros\n\t;;\n    x86_64:VMkernel:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-esx\n\t;;\n    amd64:Isilon\\ OneFS:*:*)\n\tGUESS=x86_64-unknown-onefs\n\t;;\n    *:Unleashed:*:*)\n\tGUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE\n\t;;\nesac\n\n# Do we have a guess based on uname results?\nif test \"x$GUESS\" != x; then\n    echo \"$GUESS\"\n    exit\nfi\n\n# No uname command or uname output not recognized.\nset_cc_for_build\ncat > \"$dummy.c\" <<EOF\n#ifdef _SEQUENT_\n#include <sys/types.h>\n#include <sys/utsname.h>\n#endif\n#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)\n#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)\n#include <signal.h>\n#if defined(_SIZE_T_) || defined(SIGLOST)\n#include <sys/utsname.h>\n#endif\n#endif\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n  \"4\"\n#else\n  \"\"\n#endif\n  ); exit (0);\n#endif\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n  struct utsname un;\n\n  uname(&un);\n  if (strncmp(un.version, \"V2\", 2) == 0) {\n    printf (\"i386-sequent-ptx2\\n\"); exit (0);\n  }\n  if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n    printf (\"i386-sequent-ptx1\\n\"); exit (0);\n  }\n  printf (\"i386-sequent-ptx\\n\"); exit (0);\n#endif\n\n#if defined (vax)\n#if !defined (ultrix)\n#include <sys/param.h>\n#if defined (BSD)\n#if BSD == 43\n  printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#else\n#if BSD == 199006\n  printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#else\n  printf (\"vax-dec-bsd\\n\"); exit (0);\n#endif\n#endif\n#else\n  printf (\"vax-dec-bsd\\n\"); exit (0);\n#endif\n#else\n#if defined(_SIZE_T_) || defined(SIGLOST)\n  struct utsname un;\n  uname (&un);\n  printf (\"vax-dec-ultrix%s\\n\", un.release); exit (0);\n#else\n  printf (\"vax-dec-ultrix\\n\"); exit (0);\n#endif\n#endif\n#endif\n#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)\n#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)\n#if defined(_SIZE_T_) || defined(SIGLOST)\n  struct utsname *un;\n  uname (&un);\n  printf (\"mips-dec-ultrix%s\\n\", un.release); exit (0);\n#else\n  printf (\"mips-dec-ultrix\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" 2>/dev/null && SYSTEM_NAME=`\"$dummy\"` &&\n\t{ echo \"$SYSTEM_NAME\"; exit; }\n\n# Apollos put the system type in the environment.\ntest -d /usr/apollo && { echo \"$ISP-apollo-$SYSTYPE\"; exit; }\n\necho \"$0: unable to guess system type\" >&2\n\ncase $UNAME_MACHINE:$UNAME_SYSTEM in\n    mips:Linux | mips64:Linux)\n\t# If we got here on MIPS GNU/Linux, output extra information.\n\tcat >&2 <<EOF\n\nNOTE: MIPS GNU/Linux systems require a C compiler to fully recognize\nthe system type. Please install a C compiler and try again.\nEOF\n\t;;\nesac\n\ncat >&2 <<EOF\n\nThis script (version $timestamp), has failed to recognize the\noperating system you are using. If your script is old, overwrite *all*\ncopies of config.guess and config.sub with the latest versions from:\n\n  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess\nand\n  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub\nEOF\n\nour_year=`echo $timestamp | sed 's,-.*,,'`\nthisyear=`date +%Y`\n# shellcheck disable=SC2003\nscript_age=`expr \"$thisyear\" - \"$our_year\"`\nif test \"$script_age\" -lt 3 ; then\n   cat >&2 <<EOF\n\nIf $0 has already been updated, send the following data and any\ninformation you think might be pertinent to config-patches@gnu.org to\nprovide the necessary information to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = \"$UNAME_MACHINE\"\nUNAME_RELEASE = \"$UNAME_RELEASE\"\nUNAME_SYSTEM  = \"$UNAME_SYSTEM\"\nUNAME_VERSION = \"$UNAME_VERSION\"\nEOF\nfi\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/helpers/config.sub",
    "content": "#!/usr/bin/sh\n# Configuration validation subroutine script.\n#   Copyright 1992-2022 Free Software Foundation, Inc.\n\n# shellcheck disable=SC2006,SC2268 # see below for rationale\n\ntimestamp='2022-01-03'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <https://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n\n\n# Please send patches to <config-patches@gnu.org>.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# You can get the latest version of this script from:\n# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\n# The \"shellcheck disable\" line above the timestamp inhibits complaints\n# about features and limitations of the classic Bourne shell that were\n# superseded or lifted in POSIX.  However, this script identifies a wide\n# variety of pre-POSIX systems that do not have POSIX shells at all, and\n# even some reasonably current systems (Solaris 10 as case-in-point) still\n# have a pre-POSIX /bin/sh.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS\n\nCanonicalize a configuration name.\n\nOptions:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright 1992-2022 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo \"$1\"\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Split fields of configuration type\n# shellcheck disable=SC2162\nsaved_IFS=$IFS\nIFS=\"-\" read field1 field2 field3 field4 <<EOF\n$1\nEOF\nIFS=$saved_IFS\n\n# Separate into logical components for further validation\ncase $1 in\n\t*-*-*-*-*)\n\t\techo Invalid configuration \\`\"$1\"\\': more than four components >&2\n\t\texit 1\n\t\t;;\n\t*-*-*-*)\n\t\tbasic_machine=$field1-$field2\n\t\tbasic_os=$field3-$field4\n\t\t;;\n\t*-*-*)\n\t\t# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two\n\t\t# parts\n\t\tmaybe_os=$field2-$field3\n\t\tcase $maybe_os in\n\t\t\tnto-qnx* | linux-* | uclinux-uclibc* \\\n\t\t\t| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \\\n\t\t\t| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \\\n\t\t\t| storm-chaos* | os2-emx* | rtmk-nova*)\n\t\t\t\tbasic_machine=$field1\n\t\t\t\tbasic_os=$maybe_os\n\t\t\t\t;;\n\t\t\tandroid-linux)\n\t\t\t\tbasic_machine=$field1-unknown\n\t\t\t\tbasic_os=linux-android\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tbasic_machine=$field1-$field2\n\t\t\t\tbasic_os=$field3\n\t\t\t\t;;\n\t\tesac\n\t\t;;\n\t*-*)\n\t\t# A lone config we happen to match not fitting any pattern\n\t\tcase $field1-$field2 in\n\t\t\tdecstation-3100)\n\t\t\t\tbasic_machine=mips-dec\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\t*-*)\n\t\t\t\t# Second component is usually, but not always the OS\n\t\t\t\tcase $field2 in\n\t\t\t\t\t# Prevent following clause from handling this valid os\n\t\t\t\t\tsun*os*)\n\t\t\t\t\t\tbasic_machine=$field1\n\t\t\t\t\t\tbasic_os=$field2\n\t\t\t\t\t\t;;\n\t\t\t\t\tzephyr*)\n\t\t\t\t\t\tbasic_machine=$field1-unknown\n\t\t\t\t\t\tbasic_os=$field2\n\t\t\t\t\t\t;;\n\t\t\t\t\t# Manufacturers\n\t\t\t\t\tdec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \\\n\t\t\t\t\t| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \\\n\t\t\t\t\t| unicom* | ibm* | next | hp | isi* | apollo | altos* \\\n\t\t\t\t\t| convergent* | ncr* | news | 32* | 3600* | 3100* \\\n\t\t\t\t\t| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \\\n\t\t\t\t\t| ultra | tti* | harris | dolphin | highlevel | gould \\\n\t\t\t\t\t| cbm | ns | masscomp | apple | axis | knuth | cray \\\n\t\t\t\t\t| microblaze* | sim | cisco \\\n\t\t\t\t\t| oki | wec | wrs | winbond)\n\t\t\t\t\t\tbasic_machine=$field1-$field2\n\t\t\t\t\t\tbasic_os=\n\t\t\t\t\t\t;;\n\t\t\t\t\t*)\n\t\t\t\t\t\tbasic_machine=$field1\n\t\t\t\t\t\tbasic_os=$field2\n\t\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t*)\n\t\t# Convert single-component short-hands not valid as part of\n\t\t# multi-component configurations.\n\t\tcase $field1 in\n\t\t\t386bsd)\n\t\t\t\tbasic_machine=i386-pc\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\ta29khif)\n\t\t\t\tbasic_machine=a29k-amd\n\t\t\t\tbasic_os=udi\n\t\t\t\t;;\n\t\t\tadobe68k)\n\t\t\t\tbasic_machine=m68010-adobe\n\t\t\t\tbasic_os=scout\n\t\t\t\t;;\n\t\t\talliant)\n\t\t\t\tbasic_machine=fx80-alliant\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\taltos | altos3068)\n\t\t\t\tbasic_machine=m68k-altos\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tam29k)\n\t\t\t\tbasic_machine=a29k-none\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\tamdahl)\n\t\t\t\tbasic_machine=580-amdahl\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tamiga)\n\t\t\t\tbasic_machine=m68k-unknown\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tamigaos | amigados)\n\t\t\t\tbasic_machine=m68k-unknown\n\t\t\t\tbasic_os=amigaos\n\t\t\t\t;;\n\t\t\tamigaunix | amix)\n\t\t\t\tbasic_machine=m68k-unknown\n\t\t\t\tbasic_os=sysv4\n\t\t\t\t;;\n\t\t\tapollo68)\n\t\t\t\tbasic_machine=m68k-apollo\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tapollo68bsd)\n\t\t\t\tbasic_machine=m68k-apollo\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\taros)\n\t\t\t\tbasic_machine=i386-pc\n\t\t\t\tbasic_os=aros\n\t\t\t\t;;\n\t\t\taux)\n\t\t\t\tbasic_machine=m68k-apple\n\t\t\t\tbasic_os=aux\n\t\t\t\t;;\n\t\t\tbalance)\n\t\t\t\tbasic_machine=ns32k-sequent\n\t\t\t\tbasic_os=dynix\n\t\t\t\t;;\n\t\t\tblackfin)\n\t\t\t\tbasic_machine=bfin-unknown\n\t\t\t\tbasic_os=linux\n\t\t\t\t;;\n\t\t\tcegcc)\n\t\t\t\tbasic_machine=arm-unknown\n\t\t\t\tbasic_os=cegcc\n\t\t\t\t;;\n\t\t\tconvex-c1)\n\t\t\t\tbasic_machine=c1-convex\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\tconvex-c2)\n\t\t\t\tbasic_machine=c2-convex\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\tconvex-c32)\n\t\t\t\tbasic_machine=c32-convex\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\tconvex-c34)\n\t\t\t\tbasic_machine=c34-convex\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\tconvex-c38)\n\t\t\t\tbasic_machine=c38-convex\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\tcray)\n\t\t\t\tbasic_machine=j90-cray\n\t\t\t\tbasic_os=unicos\n\t\t\t\t;;\n\t\t\tcrds | unos)\n\t\t\t\tbasic_machine=m68k-crds\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tda30)\n\t\t\t\tbasic_machine=m68k-da30\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tdecstation | pmax | pmin | dec3100 | decstatn)\n\t\t\t\tbasic_machine=mips-dec\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tdelta88)\n\t\t\t\tbasic_machine=m88k-motorola\n\t\t\t\tbasic_os=sysv3\n\t\t\t\t;;\n\t\t\tdicos)\n\t\t\t\tbasic_machine=i686-pc\n\t\t\t\tbasic_os=dicos\n\t\t\t\t;;\n\t\t\tdjgpp)\n\t\t\t\tbasic_machine=i586-pc\n\t\t\t\tbasic_os=msdosdjgpp\n\t\t\t\t;;\n\t\t\tebmon29k)\n\t\t\t\tbasic_machine=a29k-amd\n\t\t\t\tbasic_os=ebmon\n\t\t\t\t;;\n\t\t\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\t\t\tbasic_machine=m68k-ericsson\n\t\t\t\tbasic_os=ose\n\t\t\t\t;;\n\t\t\tgmicro)\n\t\t\t\tbasic_machine=tron-gmicro\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tgo32)\n\t\t\t\tbasic_machine=i386-pc\n\t\t\t\tbasic_os=go32\n\t\t\t\t;;\n\t\t\th8300hms)\n\t\t\t\tbasic_machine=h8300-hitachi\n\t\t\t\tbasic_os=hms\n\t\t\t\t;;\n\t\t\th8300xray)\n\t\t\t\tbasic_machine=h8300-hitachi\n\t\t\t\tbasic_os=xray\n\t\t\t\t;;\n\t\t\th8500hms)\n\t\t\t\tbasic_machine=h8500-hitachi\n\t\t\t\tbasic_os=hms\n\t\t\t\t;;\n\t\t\tharris)\n\t\t\t\tbasic_machine=m88k-harris\n\t\t\t\tbasic_os=sysv3\n\t\t\t\t;;\n\t\t\thp300 | hp300hpux)\n\t\t\t\tbasic_machine=m68k-hp\n\t\t\t\tbasic_os=hpux\n\t\t\t\t;;\n\t\t\thp300bsd)\n\t\t\t\tbasic_machine=m68k-hp\n\t\t\t\tbasic_os=bsd\n\t\t\t\t;;\n\t\t\thppaosf)\n\t\t\t\tbasic_machine=hppa1.1-hp\n\t\t\t\tbasic_os=osf\n\t\t\t\t;;\n\t\t\thppro)\n\t\t\t\tbasic_machine=hppa1.1-hp\n\t\t\t\tbasic_os=proelf\n\t\t\t\t;;\n\t\t\ti386mach)\n\t\t\t\tbasic_machine=i386-mach\n\t\t\t\tbasic_os=mach\n\t\t\t\t;;\n\t\t\tisi68 | isi)\n\t\t\t\tbasic_machine=m68k-isi\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tm68knommu)\n\t\t\t\tbasic_machine=m68k-unknown\n\t\t\t\tbasic_os=linux\n\t\t\t\t;;\n\t\t\tmagnum | m3230)\n\t\t\t\tbasic_machine=mips-mips\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tmerlin)\n\t\t\t\tbasic_machine=ns32k-utek\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tmingw64)\n\t\t\t\tbasic_machine=x86_64-pc\n\t\t\t\tbasic_os=mingw64\n\t\t\t\t;;\n\t\t\tmingw32)\n\t\t\t\tbasic_machine=i686-pc\n\t\t\t\tbasic_os=mingw32\n\t\t\t\t;;\n\t\t\tmingw32ce)\n\t\t\t\tbasic_machine=arm-unknown\n\t\t\t\tbasic_os=mingw32ce\n\t\t\t\t;;\n\t\t\tmonitor)\n\t\t\t\tbasic_machine=m68k-rom68k\n\t\t\t\tbasic_os=coff\n\t\t\t\t;;\n\t\t\tmorphos)\n\t\t\t\tbasic_machine=powerpc-unknown\n\t\t\t\tbasic_os=morphos\n\t\t\t\t;;\n\t\t\tmoxiebox)\n\t\t\t\tbasic_machine=moxie-unknown\n\t\t\t\tbasic_os=moxiebox\n\t\t\t\t;;\n\t\t\tmsdos)\n\t\t\t\tbasic_machine=i386-pc\n\t\t\t\tbasic_os=msdos\n\t\t\t\t;;\n\t\t\tmsys)\n\t\t\t\tbasic_machine=i686-pc\n\t\t\t\tbasic_os=msys\n\t\t\t\t;;\n\t\t\tmvs)\n\t\t\t\tbasic_machine=i370-ibm\n\t\t\t\tbasic_os=mvs\n\t\t\t\t;;\n\t\t\tnacl)\n\t\t\t\tbasic_machine=le32-unknown\n\t\t\t\tbasic_os=nacl\n\t\t\t\t;;\n\t\t\tncr3000)\n\t\t\t\tbasic_machine=i486-ncr\n\t\t\t\tbasic_os=sysv4\n\t\t\t\t;;\n\t\t\tnetbsd386)\n\t\t\t\tbasic_machine=i386-pc\n\t\t\t\tbasic_os=netbsd\n\t\t\t\t;;\n\t\t\tnetwinder)\n\t\t\t\tbasic_machine=armv4l-rebel\n\t\t\t\tbasic_os=linux\n\t\t\t\t;;\n\t\t\tnews | news700 | news800 | news900)\n\t\t\t\tbasic_machine=m68k-sony\n\t\t\t\tbasic_os=newsos\n\t\t\t\t;;\n\t\t\tnews1000)\n\t\t\t\tbasic_machine=m68030-sony\n\t\t\t\tbasic_os=newsos\n\t\t\t\t;;\n\t\t\tnecv70)\n\t\t\t\tbasic_machine=v70-nec\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tnh3000)\n\t\t\t\tbasic_machine=m68k-harris\n\t\t\t\tbasic_os=cxux\n\t\t\t\t;;\n\t\t\tnh[45]000)\n\t\t\t\tbasic_machine=m88k-harris\n\t\t\t\tbasic_os=cxux\n\t\t\t\t;;\n\t\t\tnindy960)\n\t\t\t\tbasic_machine=i960-intel\n\t\t\t\tbasic_os=nindy\n\t\t\t\t;;\n\t\t\tmon960)\n\t\t\t\tbasic_machine=i960-intel\n\t\t\t\tbasic_os=mon960\n\t\t\t\t;;\n\t\t\tnonstopux)\n\t\t\t\tbasic_machine=mips-compaq\n\t\t\t\tbasic_os=nonstopux\n\t\t\t\t;;\n\t\t\tos400)\n\t\t\t\tbasic_machine=powerpc-ibm\n\t\t\t\tbasic_os=os400\n\t\t\t\t;;\n\t\t\tOSE68000 | ose68000)\n\t\t\t\tbasic_machine=m68000-ericsson\n\t\t\t\tbasic_os=ose\n\t\t\t\t;;\n\t\t\tos68k)\n\t\t\t\tbasic_machine=m68k-none\n\t\t\t\tbasic_os=os68k\n\t\t\t\t;;\n\t\t\tparagon)\n\t\t\t\tbasic_machine=i860-intel\n\t\t\t\tbasic_os=osf\n\t\t\t\t;;\n\t\t\tparisc)\n\t\t\t\tbasic_machine=hppa-unknown\n\t\t\t\tbasic_os=linux\n\t\t\t\t;;\n\t\t\tpsp)\n\t\t\t\tbasic_machine=mipsallegrexel-sony\n\t\t\t\tbasic_os=psp\n\t\t\t\t;;\n\t\t\tpw32)\n\t\t\t\tbasic_machine=i586-unknown\n\t\t\t\tbasic_os=pw32\n\t\t\t\t;;\n\t\t\trdos | rdos64)\n\t\t\t\tbasic_machine=x86_64-pc\n\t\t\t\tbasic_os=rdos\n\t\t\t\t;;\n\t\t\trdos32)\n\t\t\t\tbasic_machine=i386-pc\n\t\t\t\tbasic_os=rdos\n\t\t\t\t;;\n\t\t\trom68k)\n\t\t\t\tbasic_machine=m68k-rom68k\n\t\t\t\tbasic_os=coff\n\t\t\t\t;;\n\t\t\tsa29200)\n\t\t\t\tbasic_machine=a29k-amd\n\t\t\t\tbasic_os=udi\n\t\t\t\t;;\n\t\t\tsei)\n\t\t\t\tbasic_machine=mips-sei\n\t\t\t\tbasic_os=seiux\n\t\t\t\t;;\n\t\t\tsequent)\n\t\t\t\tbasic_machine=i386-sequent\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tsps7)\n\t\t\t\tbasic_machine=m68k-bull\n\t\t\t\tbasic_os=sysv2\n\t\t\t\t;;\n\t\t\tst2000)\n\t\t\t\tbasic_machine=m68k-tandem\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tstratus)\n\t\t\t\tbasic_machine=i860-stratus\n\t\t\t\tbasic_os=sysv4\n\t\t\t\t;;\n\t\t\tsun2)\n\t\t\t\tbasic_machine=m68000-sun\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tsun2os3)\n\t\t\t\tbasic_machine=m68000-sun\n\t\t\t\tbasic_os=sunos3\n\t\t\t\t;;\n\t\t\tsun2os4)\n\t\t\t\tbasic_machine=m68000-sun\n\t\t\t\tbasic_os=sunos4\n\t\t\t\t;;\n\t\t\tsun3)\n\t\t\t\tbasic_machine=m68k-sun\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tsun3os3)\n\t\t\t\tbasic_machine=m68k-sun\n\t\t\t\tbasic_os=sunos3\n\t\t\t\t;;\n\t\t\tsun3os4)\n\t\t\t\tbasic_machine=m68k-sun\n\t\t\t\tbasic_os=sunos4\n\t\t\t\t;;\n\t\t\tsun4)\n\t\t\t\tbasic_machine=sparc-sun\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tsun4os3)\n\t\t\t\tbasic_machine=sparc-sun\n\t\t\t\tbasic_os=sunos3\n\t\t\t\t;;\n\t\t\tsun4os4)\n\t\t\t\tbasic_machine=sparc-sun\n\t\t\t\tbasic_os=sunos4\n\t\t\t\t;;\n\t\t\tsun4sol2)\n\t\t\t\tbasic_machine=sparc-sun\n\t\t\t\tbasic_os=solaris2\n\t\t\t\t;;\n\t\t\tsun386 | sun386i | roadrunner)\n\t\t\t\tbasic_machine=i386-sun\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\t\tsv1)\n\t\t\t\tbasic_machine=sv1-cray\n\t\t\t\tbasic_os=unicos\n\t\t\t\t;;\n\t\t\tsymmetry)\n\t\t\t\tbasic_machine=i386-sequent\n\t\t\t\tbasic_os=dynix\n\t\t\t\t;;\n\t\t\tt3e)\n\t\t\t\tbasic_machine=alphaev5-cray\n\t\t\t\tbasic_os=unicos\n\t\t\t\t;;\n\t\t\tt90)\n\t\t\t\tbasic_machine=t90-cray\n\t\t\t\tbasic_os=unicos\n\t\t\t\t;;\n\t\t\ttoad1)\n\t\t\t\tbasic_machine=pdp10-xkl\n\t\t\t\tbasic_os=tops20\n\t\t\t\t;;\n\t\t\ttpf)\n\t\t\t\tbasic_machine=s390x-ibm\n\t\t\t\tbasic_os=tpf\n\t\t\t\t;;\n\t\t\tudi29k)\n\t\t\t\tbasic_machine=a29k-amd\n\t\t\t\tbasic_os=udi\n\t\t\t\t;;\n\t\t\tultra3)\n\t\t\t\tbasic_machine=a29k-nyu\n\t\t\t\tbasic_os=sym1\n\t\t\t\t;;\n\t\t\tv810 | necv810)\n\t\t\t\tbasic_machine=v810-nec\n\t\t\t\tbasic_os=none\n\t\t\t\t;;\n\t\t\tvaxv)\n\t\t\t\tbasic_machine=vax-dec\n\t\t\t\tbasic_os=sysv\n\t\t\t\t;;\n\t\t\tvms)\n\t\t\t\tbasic_machine=vax-dec\n\t\t\t\tbasic_os=vms\n\t\t\t\t;;\n\t\t\tvsta)\n\t\t\t\tbasic_machine=i386-pc\n\t\t\t\tbasic_os=vsta\n\t\t\t\t;;\n\t\t\tvxworks960)\n\t\t\t\tbasic_machine=i960-wrs\n\t\t\t\tbasic_os=vxworks\n\t\t\t\t;;\n\t\t\tvxworks68)\n\t\t\t\tbasic_machine=m68k-wrs\n\t\t\t\tbasic_os=vxworks\n\t\t\t\t;;\n\t\t\tvxworks29k)\n\t\t\t\tbasic_machine=a29k-wrs\n\t\t\t\tbasic_os=vxworks\n\t\t\t\t;;\n\t\t\txbox)\n\t\t\t\tbasic_machine=i686-pc\n\t\t\t\tbasic_os=mingw32\n\t\t\t\t;;\n\t\t\tymp)\n\t\t\t\tbasic_machine=ymp-cray\n\t\t\t\tbasic_os=unicos\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tbasic_machine=$1\n\t\t\t\tbasic_os=\n\t\t\t\t;;\n\t\tesac\n\t\t;;\nesac\n\n# Decode 1-component or ad-hoc basic machines\ncase $basic_machine in\n\t# Here we handle the default manufacturer of certain CPU types.  It is in\n\t# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tcpu=hppa1.1\n\t\tvendor=winbond\n\t\t;;\n\top50n)\n\t\tcpu=hppa1.1\n\t\tvendor=oki\n\t\t;;\n\top60c)\n\t\tcpu=hppa1.1\n\t\tvendor=oki\n\t\t;;\n\tibm*)\n\t\tcpu=i370\n\t\tvendor=ibm\n\t\t;;\n\torion105)\n\t\tcpu=clipper\n\t\tvendor=highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tcpu=m68k\n\t\tvendor=apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tcpu=powerpc\n\t\tvendor=apple\n\t\t;;\n\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tcpu=m68000\n\t\tvendor=att\n\t\t;;\n\t3b*)\n\t\tcpu=we32k\n\t\tvendor=att\n\t\t;;\n\tbluegene*)\n\t\tcpu=powerpc\n\t\tvendor=ibm\n\t\tbasic_os=cnk\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tcpu=pdp10\n\t\tvendor=dec\n\t\tbasic_os=tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tcpu=pdp10\n\t\tvendor=dec\n\t\tbasic_os=tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tcpu=m68k\n\t\tvendor=motorola\n\t\t;;\n\tdpx2*)\n\t\tcpu=m68k\n\t\tvendor=bull\n\t\tbasic_os=sysv3\n\t\t;;\n\tencore | umax | mmax)\n\t\tcpu=ns32k\n\t\tvendor=encore\n\t\t;;\n\telxsi)\n\t\tcpu=elxsi\n\t\tvendor=elxsi\n\t\tbasic_os=${basic_os:-bsd}\n\t\t;;\n\tfx2800)\n\t\tcpu=i860\n\t\tvendor=alliant\n\t\t;;\n\tgenix)\n\t\tcpu=ns32k\n\t\tvendor=ns\n\t\t;;\n\th3050r* | hiux*)\n\t\tcpu=hppa1.1\n\t\tvendor=hitachi\n\t\tbasic_os=hiuxwe2\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tcpu=hppa1.0\n\t\tvendor=hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tcpu=m68000\n\t\tvendor=hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tcpu=m68k\n\t\tvendor=hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tcpu=hppa1.0\n\t\tvendor=hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tcpu=hppa1.1\n\t\tvendor=hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tcpu=hppa1.1\n\t\tvendor=hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tcpu=hppa1.1\n\t\tvendor=hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tcpu=hppa1.1\n\t\tvendor=hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tcpu=hppa1.0\n\t\tvendor=hp\n\t\t;;\n\ti*86v32)\n\t\tcpu=`echo \"$1\" | sed -e 's/86.*/86/'`\n\t\tvendor=pc\n\t\tbasic_os=sysv32\n\t\t;;\n\ti*86v4*)\n\t\tcpu=`echo \"$1\" | sed -e 's/86.*/86/'`\n\t\tvendor=pc\n\t\tbasic_os=sysv4\n\t\t;;\n\ti*86v)\n\t\tcpu=`echo \"$1\" | sed -e 's/86.*/86/'`\n\t\tvendor=pc\n\t\tbasic_os=sysv\n\t\t;;\n\ti*86sol2)\n\t\tcpu=`echo \"$1\" | sed -e 's/86.*/86/'`\n\t\tvendor=pc\n\t\tbasic_os=solaris2\n\t\t;;\n\tj90 | j90-cray)\n\t\tcpu=j90\n\t\tvendor=cray\n\t\tbasic_os=${basic_os:-unicos}\n\t\t;;\n\tiris | iris4d)\n\t\tcpu=mips\n\t\tvendor=sgi\n\t\tcase $basic_os in\n\t\t    irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tbasic_os=irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tminiframe)\n\t\tcpu=m68000\n\t\tvendor=convergent\n\t\t;;\n\t*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tcpu=m68k\n\t\tvendor=atari\n\t\tbasic_os=mint\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tcpu=mips\n\t\tvendor=sony\n\t\tbasic_os=newsos\n\t\t;;\n\tnext | m*-next)\n\t\tcpu=m68k\n\t\tvendor=next\n\t\tcase $basic_os in\n\t\t    openstep*)\n\t\t        ;;\n\t\t    nextstep*)\n\t\t\t;;\n\t\t    ns2*)\n\t\t      basic_os=nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      basic_os=nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnp1)\n\t\tcpu=np1\n\t\tvendor=gould\n\t\t;;\n\top50n-* | op60c-*)\n\t\tcpu=hppa1.1\n\t\tvendor=oki\n\t\tbasic_os=proelf\n\t\t;;\n\tpa-hitachi)\n\t\tcpu=hppa1.1\n\t\tvendor=hitachi\n\t\tbasic_os=hiuxwe2\n\t\t;;\n\tpbd)\n\t\tcpu=sparc\n\t\tvendor=tti\n\t\t;;\n\tpbb)\n\t\tcpu=m68k\n\t\tvendor=tti\n\t\t;;\n\tpc532)\n\t\tcpu=ns32k\n\t\tvendor=pc532\n\t\t;;\n\tpn)\n\t\tcpu=pn\n\t\tvendor=gould\n\t\t;;\n\tpower)\n\t\tcpu=power\n\t\tvendor=ibm\n\t\t;;\n\tps2)\n\t\tcpu=i386\n\t\tvendor=ibm\n\t\t;;\n\trm[46]00)\n\t\tcpu=mips\n\t\tvendor=siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tcpu=romp\n\t\tvendor=ibm\n\t\t;;\n\tsde)\n\t\tcpu=mipsisa32\n\t\tvendor=sde\n\t\tbasic_os=${basic_os:-elf}\n\t\t;;\n\tsimso-wrs)\n\t\tcpu=sparclite\n\t\tvendor=wrs\n\t\tbasic_os=vxworks\n\t\t;;\n\ttower | tower-32)\n\t\tcpu=m68k\n\t\tvendor=ncr\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tcpu=f301\n\t\tvendor=fujitsu\n\t\t;;\n\tw65)\n\t\tcpu=w65\n\t\tvendor=wdc\n\t\t;;\n\tw89k-*)\n\t\tcpu=hppa1.1\n\t\tvendor=winbond\n\t\tbasic_os=proelf\n\t\t;;\n\tnone)\n\t\tcpu=none\n\t\tvendor=none\n\t\t;;\n\tleon|leon[3-9])\n\t\tcpu=sparc\n\t\tvendor=$basic_machine\n\t\t;;\n\tleon-*|leon[3-9]-*)\n\t\tcpu=sparc\n\t\tvendor=`echo \"$basic_machine\" | sed 's/-.*//'`\n\t\t;;\n\n\t*-*)\n\t\t# shellcheck disable=SC2162\n\t\tsaved_IFS=$IFS\n\t\tIFS=\"-\" read cpu vendor <<EOF\n$basic_machine\nEOF\n\t\tIFS=$saved_IFS\n\t\t;;\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t\tcpu=$basic_machine\n\t\tvendor=pc\n\t\t;;\n\t# These rules are duplicated from below for sake of the special case above;\n\t# i.e. things that normalized to x86 arches should also default to \"pc\"\n\tpc98)\n\t\tcpu=i386\n\t\tvendor=pc\n\t\t;;\n\tx64 | amd64)\n\t\tcpu=x86_64\n\t\tvendor=pc\n\t\t;;\n\t# Recognize the basic CPU types without company name.\n\t*)\n\t\tcpu=$basic_machine\n\t\tvendor=unknown\n\t\t;;\nesac\n\nunset -v basic_machine\n\n# Decode basic machines in the full and proper CPU-Company form.\ncase $cpu-$vendor in\n\t# Here we handle the default manufacturer of certain CPU types in canonical form. It is in\n\t# some cases the only manufacturer, in others, it is the most popular.\n\tcraynv-unknown)\n\t\tvendor=cray\n\t\tbasic_os=${basic_os:-unicosmp}\n\t\t;;\n\tc90-unknown | c90-cray)\n\t\tvendor=cray\n\t\tbasic_os=${Basic_os:-unicos}\n\t\t;;\n\tfx80-unknown)\n\t\tvendor=alliant\n\t\t;;\n\tromp-unknown)\n\t\tvendor=ibm\n\t\t;;\n\tmmix-unknown)\n\t\tvendor=knuth\n\t\t;;\n\tmicroblaze-unknown | microblazeel-unknown)\n\t\tvendor=xilinx\n\t\t;;\n\trs6000-unknown)\n\t\tvendor=ibm\n\t\t;;\n\tvax-unknown)\n\t\tvendor=dec\n\t\t;;\n\tpdp11-unknown)\n\t\tvendor=dec\n\t\t;;\n\twe32k-unknown)\n\t\tvendor=att\n\t\t;;\n\tcydra-unknown)\n\t\tvendor=cydrome\n\t\t;;\n\ti370-ibm*)\n\t\tvendor=ibm\n\t\t;;\n\torion-unknown)\n\t\tvendor=highlevel\n\t\t;;\n\txps-unknown | xps100-unknown)\n\t\tcpu=xps100\n\t\tvendor=honeywell\n\t\t;;\n\n\t# Here we normalize CPU types with a missing or matching vendor\n\tarmh-unknown | armh-alt)\n\t\tcpu=armv7l\n\t\tvendor=alt\n\t\tbasic_os=${basic_os:-linux-gnueabihf}\n\t\t;;\n\tdpx20-unknown | dpx20-bull)\n\t\tcpu=rs6000\n\t\tvendor=bull\n\t\tbasic_os=${basic_os:-bosx}\n\t\t;;\n\n\t# Here we normalize CPU types irrespective of the vendor\n\tamd64-*)\n\t\tcpu=x86_64\n\t\t;;\n\tblackfin-*)\n\t\tcpu=bfin\n\t\tbasic_os=linux\n\t\t;;\n\tc54x-*)\n\t\tcpu=tic54x\n\t\t;;\n\tc55x-*)\n\t\tcpu=tic55x\n\t\t;;\n\tc6x-*)\n\t\tcpu=tic6x\n\t\t;;\n\te500v[12]-*)\n\t\tcpu=powerpc\n\t\tbasic_os=${basic_os}\"spe\"\n\t\t;;\n\tmips3*-*)\n\t\tcpu=mips64\n\t\t;;\n\tms1-*)\n\t\tcpu=mt\n\t\t;;\n\tm68knommu-*)\n\t\tcpu=m68k\n\t\tbasic_os=linux\n\t\t;;\n\tm9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)\n\t\tcpu=s12z\n\t\t;;\n\topenrisc-*)\n\t\tcpu=or32\n\t\t;;\n\tparisc-*)\n\t\tcpu=hppa\n\t\tbasic_os=linux\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tcpu=i586\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)\n\t\tcpu=i686\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tcpu=i686\n\t\t;;\n\tpentium4-*)\n\t\tcpu=i786\n\t\t;;\n\tpc98-*)\n\t\tcpu=i386\n\t\t;;\n\tppc-* | ppcbe-*)\n\t\tcpu=powerpc\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tcpu=powerpcle\n\t\t;;\n\tppc64-*)\n\t\tcpu=powerpc64\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tcpu=powerpc64le\n\t\t;;\n\tsb1-*)\n\t\tcpu=mipsisa64sb1\n\t\t;;\n\tsb1el-*)\n\t\tcpu=mipsisa64sb1el\n\t\t;;\n\tsh5e[lb]-*)\n\t\tcpu=`echo \"$cpu\" | sed 's/^\\(sh.\\)e\\(.\\)$/\\1\\2e/'`\n\t\t;;\n\tspur-*)\n\t\tcpu=spur\n\t\t;;\n\tstrongarm-* | thumb-*)\n\t\tcpu=arm\n\t\t;;\n\ttx39-*)\n\t\tcpu=mipstx39\n\t\t;;\n\ttx39el-*)\n\t\tcpu=mipstx39el\n\t\t;;\n\tx64-*)\n\t\tcpu=x86_64\n\t\t;;\n\txscale-* | xscalee[bl]-*)\n\t\tcpu=`echo \"$cpu\" | sed 's/^xscale/arm/'`\n\t\t;;\n\tarm64-* | aarch64le-*)\n\t\tcpu=aarch64\n\t\t;;\n\n\t# Recognize the canonical CPU Types that limit and/or modify the\n\t# company names they are paired with.\n\tcr16-*)\n\t\tbasic_os=${basic_os:-elf}\n\t\t;;\n\tcrisv32-* | etraxfs*-*)\n\t\tcpu=crisv32\n\t\tvendor=axis\n\t\t;;\n\tcris-* | etrax*-*)\n\t\tcpu=cris\n\t\tvendor=axis\n\t\t;;\n\tcrx-*)\n\t\tbasic_os=${basic_os:-elf}\n\t\t;;\n\tneo-tandem)\n\t\tcpu=neo\n\t\tvendor=tandem\n\t\t;;\n\tnse-tandem)\n\t\tcpu=nse\n\t\tvendor=tandem\n\t\t;;\n\tnsr-tandem)\n\t\tcpu=nsr\n\t\tvendor=tandem\n\t\t;;\n\tnsv-tandem)\n\t\tcpu=nsv\n\t\tvendor=tandem\n\t\t;;\n\tnsx-tandem)\n\t\tcpu=nsx\n\t\tvendor=tandem\n\t\t;;\n\tmipsallegrexel-sony)\n\t\tcpu=mipsallegrexel\n\t\tvendor=sony\n\t\t;;\n\ttile*-*)\n\t\tbasic_os=${basic_os:-linux-gnu}\n\t\t;;\n\n\t*)\n\t\t# Recognize the canonical CPU types that are allowed with any\n\t\t# company name.\n\t\tcase $cpu in\n\t\t\t1750a | 580 \\\n\t\t\t| a29k \\\n\t\t\t| aarch64 | aarch64_be \\\n\t\t\t| abacus \\\n\t\t\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \\\n\t\t\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \\\n\t\t\t| alphapca5[67] | alpha64pca5[67] \\\n\t\t\t| am33_2.0 \\\n\t\t\t| amdgcn \\\n\t\t\t| arc | arceb | arc32 | arc64 \\\n\t\t\t| arm | arm[lb]e | arme[lb] | armv* \\\n\t\t\t| avr | avr32 \\\n\t\t\t| asmjs \\\n\t\t\t| ba \\\n\t\t\t| be32 | be64 \\\n\t\t\t| bfin | bpf | bs2000 \\\n\t\t\t| c[123]* | c30 | [cjt]90 | c4x \\\n\t\t\t| c8051 | clipper | craynv | csky | cydra \\\n\t\t\t| d10v | d30v | dlx | dsp16xx \\\n\t\t\t| e2k | elxsi | epiphany \\\n\t\t\t| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \\\n\t\t\t| h8300 | h8500 \\\n\t\t\t| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t\t\t| hexagon \\\n\t\t\t| i370 | i*86 | i860 | i960 | ia16 | ia64 \\\n\t\t\t| ip2k | iq2000 \\\n\t\t\t| k1om \\\n\t\t\t| le32 | le64 \\\n\t\t\t| lm32 \\\n\t\t\t| loongarch32 | loongarch64 | loongarchx32 \\\n\t\t\t| m32c | m32r | m32rle \\\n\t\t\t| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \\\n\t\t\t| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \\\n\t\t\t| m88110 | m88k | maxq | mb | mcore | mep | metag \\\n\t\t\t| microblaze | microblazeel \\\n\t\t\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t\t\t| mips16 \\\n\t\t\t| mips64 | mips64eb | mips64el \\\n\t\t\t| mips64octeon | mips64octeonel \\\n\t\t\t| mips64orion | mips64orionel \\\n\t\t\t| mips64r5900 | mips64r5900el \\\n\t\t\t| mips64vr | mips64vrel \\\n\t\t\t| mips64vr4100 | mips64vr4100el \\\n\t\t\t| mips64vr4300 | mips64vr4300el \\\n\t\t\t| mips64vr5000 | mips64vr5000el \\\n\t\t\t| mips64vr5900 | mips64vr5900el \\\n\t\t\t| mipsisa32 | mipsisa32el \\\n\t\t\t| mipsisa32r2 | mipsisa32r2el \\\n\t\t\t| mipsisa32r3 | mipsisa32r3el \\\n\t\t\t| mipsisa32r5 | mipsisa32r5el \\\n\t\t\t| mipsisa32r6 | mipsisa32r6el \\\n\t\t\t| mipsisa64 | mipsisa64el \\\n\t\t\t| mipsisa64r2 | mipsisa64r2el \\\n\t\t\t| mipsisa64r3 | mipsisa64r3el \\\n\t\t\t| mipsisa64r5 | mipsisa64r5el \\\n\t\t\t| mipsisa64r6 | mipsisa64r6el \\\n\t\t\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t\t\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t\t\t| mipsr5900 | mipsr5900el \\\n\t\t\t| mipstx39 | mipstx39el \\\n\t\t\t| mmix \\\n\t\t\t| mn10200 | mn10300 \\\n\t\t\t| moxie \\\n\t\t\t| mt \\\n\t\t\t| msp430 \\\n\t\t\t| nds32 | nds32le | nds32be \\\n\t\t\t| nfp \\\n\t\t\t| nios | nios2 | nios2eb | nios2el \\\n\t\t\t| none | np1 | ns16k | ns32k | nvptx \\\n\t\t\t| open8 \\\n\t\t\t| or1k* \\\n\t\t\t| or32 \\\n\t\t\t| orion \\\n\t\t\t| picochip \\\n\t\t\t| pdp10 | pdp11 | pj | pjl | pn | power \\\n\t\t\t| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \\\n\t\t\t| pru \\\n\t\t\t| pyramid \\\n\t\t\t| riscv | riscv32 | riscv32be | riscv64 | riscv64be \\\n\t\t\t| rl78 | romp | rs6000 | rx \\\n\t\t\t| s390 | s390x \\\n\t\t\t| score \\\n\t\t\t| sh | shl \\\n\t\t\t| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \\\n\t\t\t| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \\\n\t\t\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \\\n\t\t\t| sparclite \\\n\t\t\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \\\n\t\t\t| spu \\\n\t\t\t| tahoe \\\n\t\t\t| thumbv7* \\\n\t\t\t| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \\\n\t\t\t| tron \\\n\t\t\t| ubicom32 \\\n\t\t\t| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \\\n\t\t\t| vax \\\n\t\t\t| visium \\\n\t\t\t| w65 \\\n\t\t\t| wasm32 | wasm64 \\\n\t\t\t| we32k \\\n\t\t\t| x86 | x86_64 | xc16x | xgate | xps100 \\\n\t\t\t| xstormy16 | xtensa* \\\n\t\t\t| ymp \\\n\t\t\t| z8k | z80)\n\t\t\t\t;;\n\n\t\t\t*)\n\t\t\t\techo Invalid configuration \\`\"$1\"\\': machine \\`\"$cpu-$vendor\"\\' not recognized 1>&2\n\t\t\t\texit 1\n\t\t\t\t;;\n\t\tesac\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $vendor in\n\tdigital*)\n\t\tvendor=dec\n\t\t;;\n\tcommodore*)\n\t\tvendor=cbm\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif test x$basic_os != x\nthen\n\n# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just\n# set os.\ncase $basic_os in\n\tgnu/linux*)\n\t\tkernel=linux\n\t\tos=`echo \"$basic_os\" | sed -e 's|gnu/linux|gnu|'`\n\t\t;;\n\tos2-emx)\n\t\tkernel=os2\n\t\tos=`echo \"$basic_os\" | sed -e 's|os2-emx|emx|'`\n\t\t;;\n\tnto-qnx*)\n\t\tkernel=nto\n\t\tos=`echo \"$basic_os\" | sed -e 's|nto-qnx|qnx|'`\n\t\t;;\n\t*-*)\n\t\t# shellcheck disable=SC2162\n\t\tsaved_IFS=$IFS\n\t\tIFS=\"-\" read kernel os <<EOF\n$basic_os\nEOF\n\t\tIFS=$saved_IFS\n\t\t;;\n\t# Default OS when just kernel was specified\n\tnto*)\n\t\tkernel=nto\n\t\tos=`echo \"$basic_os\" | sed -e 's|nto|qnx|'`\n\t\t;;\n\tlinux*)\n\t\tkernel=linux\n\t\tos=`echo \"$basic_os\" | sed -e 's|linux|gnu|'`\n\t\t;;\n\t*)\n\t\tkernel=\n\t\tos=$basic_os\n\t\t;;\nesac\n\n# Now, normalize the OS (knowing we just have one component, it's not a kernel,\n# etc.)\ncase $os in\n\t# First match some system type aliases that might get confused\n\t# with valid system types.\n\t# solaris* is a basic system type, with this one exception.\n\tauroraux)\n\t\tos=auroraux\n\t\t;;\n\tbluegene*)\n\t\tos=cnk\n\t\t;;\n\tsolaris1 | solaris1.*)\n\t\tos=`echo \"$os\" | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\tsolaris)\n\t\tos=solaris2\n\t\t;;\n\tunixware*)\n\t\tos=sysv4.2uw\n\t\t;;\n\t# es1800 is here to avoid being matched by es* (a different OS)\n\tes1800*)\n\t\tos=ose\n\t\t;;\n\t# Some version numbers need modification\n\tchorusos*)\n\t\tos=chorusos\n\t\t;;\n\tisc)\n\t\tos=isc2.2\n\t\t;;\n\tsco6)\n\t\tos=sco5v6\n\t\t;;\n\tsco5)\n\t\tos=sco3.2v5\n\t\t;;\n\tsco4)\n\t\tos=sco3.2v4\n\t\t;;\n\tsco3.2.[4-9]*)\n\t\tos=`echo \"$os\" | sed -e 's/sco3.2./sco3.2v/'`\n\t\t;;\n\tsco*v* | scout)\n\t\t# Don't match below\n\t\t;;\n\tsco*)\n\t\tos=sco3.2v2\n\t\t;;\n\tpsos*)\n\t\tos=psos\n\t\t;;\n\tqnx*)\n\t\tos=qnx\n\t\t;;\n\thiux*)\n\t\tos=hiuxwe2\n\t\t;;\n\tlynx*178)\n\t\tos=lynxos178\n\t\t;;\n\tlynx*5)\n\t\tos=lynxos5\n\t\t;;\n\tlynxos*)\n\t\t# don't get caught up in next wildcard\n\t\t;;\n\tlynx*)\n\t\tos=lynxos\n\t\t;;\n\tmac[0-9]*)\n\t\tos=`echo \"$os\" | sed -e 's|mac|macos|'`\n\t\t;;\n\topened*)\n\t\tos=openedition\n\t\t;;\n\tos400*)\n\t\tos=os400\n\t\t;;\n\tsunos5*)\n\t\tos=`echo \"$os\" | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\tsunos6*)\n\t\tos=`echo \"$os\" | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\twince*)\n\t\tos=wince\n\t\t;;\n\tutek*)\n\t\tos=bsd\n\t\t;;\n\tdynix*)\n\t\tos=bsd\n\t\t;;\n\tacis*)\n\t\tos=aos\n\t\t;;\n\tatheos*)\n\t\tos=atheos\n\t\t;;\n\tsyllable*)\n\t\tos=syllable\n\t\t;;\n\t386bsd)\n\t\tos=bsd\n\t\t;;\n\tctix* | uts*)\n\t\tos=sysv\n\t\t;;\n\tnova*)\n\t\tos=rtmk-nova\n\t\t;;\n\tns2)\n\t\tos=nextstep2\n\t\t;;\n\t# Preserve the version number of sinix5.\n\tsinix5.*)\n\t\tos=`echo \"$os\" | sed -e 's|sinix|sysv|'`\n\t\t;;\n\tsinix*)\n\t\tos=sysv4\n\t\t;;\n\ttpf*)\n\t\tos=tpf\n\t\t;;\n\ttriton*)\n\t\tos=sysv3\n\t\t;;\n\toss*)\n\t\tos=sysv3\n\t\t;;\n\tsvr4*)\n\t\tos=sysv4\n\t\t;;\n\tsvr3)\n\t\tos=sysv3\n\t\t;;\n\tsysvr4)\n\t\tos=sysv4\n\t\t;;\n\tose*)\n\t\tos=ose\n\t\t;;\n\t*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)\n\t\tos=mint\n\t\t;;\n\tdicos*)\n\t\tos=dicos\n\t\t;;\n\tpikeos*)\n\t\t# Until real need of OS specific support for\n\t\t# particular features comes up, bare metal\n\t\t# configurations are quite functional.\n\t\tcase $cpu in\n\t\t    arm*)\n\t\t\tos=eabi\n\t\t\t;;\n\t\t    *)\n\t\t\tos=elf\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t*)\n\t\t# No normalization, but not necessarily accepted, that comes below.\n\t\t;;\nesac\n\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\nkernel=\ncase $cpu-$vendor in\n\tscore-*)\n\t\tos=elf\n\t\t;;\n\tspu-*)\n\t\tos=elf\n\t\t;;\n\t*-acorn)\n\t\tos=riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tkernel=linux\n\t\tos=gnu\n\t\t;;\n\tarm*-semi)\n\t\tos=aout\n\t\t;;\n\tc4x-* | tic4x-*)\n\t\tos=coff\n\t\t;;\n\tc8051-*)\n\t\tos=elf\n\t\t;;\n\tclipper-intergraph)\n\t\tos=clix\n\t\t;;\n\thexagon-*)\n\t\tos=elf\n\t\t;;\n\ttic54x-*)\n\t\tos=coff\n\t\t;;\n\ttic55x-*)\n\t\tos=coff\n\t\t;;\n\ttic6x-*)\n\t\tos=coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=domain\n\t\t;;\n\ti386-sun)\n\t\tos=sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=sunos3\n\t\t;;\n\tm68*-cisco)\n\t\tos=aout\n\t\t;;\n\tmep-*)\n\t\tos=elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=elf\n\t\t;;\n\tmips*-*)\n\t\tos=elf\n\t\t;;\n\tor32-*)\n\t\tos=coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=sunos4.1.1\n\t\t;;\n\tpru-*)\n\t\tos=elf\n\t\t;;\n\t*-be)\n\t\tos=beos\n\t\t;;\n\t*-ibm)\n\t\tos=aix\n\t\t;;\n\t*-knuth)\n\t\tos=mmixware\n\t\t;;\n\t*-wec)\n\t\tos=proelf\n\t\t;;\n\t*-winbond)\n\t\tos=proelf\n\t\t;;\n\t*-oki)\n\t\tos=proelf\n\t\t;;\n\t*-hp)\n\t\tos=hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=sysv\n\t\t;;\n\t*-cbm)\n\t\tos=amigaos\n\t\t;;\n\t*-dg)\n\t\tos=dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=luna\n\t\t;;\n\t*-next)\n\t\tos=nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=ptx\n\t\t;;\n\t*-crds)\n\t\tos=unos\n\t\t;;\n\t*-ns)\n\t\tos=genix\n\t\t;;\n\ti370-*)\n\t\tos=mvs\n\t\t;;\n\t*-gould)\n\t\tos=sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=bsd\n\t\t;;\n\t*-encore)\n\t\tos=bsd\n\t\t;;\n\t*-sgi)\n\t\tos=irix\n\t\t;;\n\t*-siemens)\n\t\tos=sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=coff\n\t\t;;\n\t*-*bug)\n\t\tos=coff\n\t\t;;\n\t*-apple)\n\t\tos=macos\n\t\t;;\n\t*-atari*)\n\t\tos=mint\n\t\t;;\n\t*-wrs)\n\t\tos=vxworks\n\t\t;;\n\t*)\n\t\tos=none\n\t\t;;\nesac\n\nfi\n\n# Now, validate our (potentially fixed-up) OS.\ncase $os in\n\t# Sometimes we do \"kernel-libc\", so those need to count as OSes.\n\tmusl* | newlib* | relibc* | uclibc*)\n\t\t;;\n\t# Likewise for \"kernel-abi\"\n\teabi* | gnueabi*)\n\t\t;;\n\t# VxWorks passes extra cpu info in the 4th filed.\n\tsimlinux | simwindows | spe)\n\t\t;;\n\t# Now accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST end in a * to match a version number.\n\tgnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \\\n\t     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \\\n\t     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \\\n\t     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \\\n\t     | hiux* | abug | nacl* | netware* | windows* \\\n\t     | os9* | macos* | osx* | ios* \\\n\t     | mpw* | magic* | mmixware* | mon960* | lnews* \\\n\t     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \\\n\t     | aos* | aros* | cloudabi* | sortix* | twizzler* \\\n\t     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \\\n\t     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \\\n\t     | mirbsd* | netbsd* | dicos* | openedition* | ose* \\\n\t     | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \\\n\t     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \\\n\t     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \\\n\t     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \\\n\t     | udi* | lites* | ieee* | go32* | aux* | hcos* \\\n\t     | chorusrdb* | cegcc* | glidix* | serenity* \\\n\t     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \\\n\t     | midipix* | mingw32* | mingw64* | mint* \\\n\t     | uxpv* | beos* | mpeix* | udk* | moxiebox* \\\n\t     | interix* | uwin* | mks* | rhapsody* | darwin* \\\n\t     | openstep* | oskit* | conix* | pw32* | nonstopux* \\\n\t     | storm-chaos* | tops10* | tenex* | tops20* | its* \\\n\t     | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \\\n\t     | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \\\n\t     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \\\n\t     | skyos* | haiku* | rdos* | toppers* | drops* | es* \\\n\t     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \\\n\t     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \\\n\t     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \\\n\t     | fiwix* )\n\t\t;;\n\t# This one is extra strict with allowed versions\n\tsco3.2v2 | sco3.2v[4-9]* | sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\t;;\n\tnone)\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`\"$1\"\\': OS \\`\"$os\"\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# As a final step for OS-related things, validate the OS-kernel combination\n# (given a valid OS), if there is a kernel.\ncase $kernel-$os in\n\tlinux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \\\n\t\t   | linux-musl* | linux-relibc* | linux-uclibc* )\n\t\t;;\n\tuclinux-uclibc* )\n\t\t;;\n\t-dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )\n\t\t# These are just libc implementations, not actual OSes, and thus\n\t\t# require a kernel.\n\t\techo \"Invalid configuration \\`$1': libc \\`$os' needs explicit kernel.\" 1>&2\n\t\texit 1\n\t\t;;\n\tkfreebsd*-gnu* | kopensolaris*-gnu*)\n\t\t;;\n\tvxworks-simlinux | vxworks-simwindows | vxworks-spe)\n\t\t;;\n\tnto-qnx*)\n\t\t;;\n\tos2-emx)\n\t\t;;\n\t*-eabi* | *-gnueabi*)\n\t\t;;\n\t-*)\n\t\t# Blank kernel with real OS is always fine.\n\t\t;;\n\t*-*)\n\t\techo \"Invalid configuration \\`$1': Kernel \\`$kernel' not known to work with OS \\`$os'.\" 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\ncase $vendor in\n\tunknown)\n\t\tcase $cpu-$os in\n\t\t\t*-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t*-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t*-cnk* | *-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t*-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t*-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t*-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t*-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t*-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t*-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t*-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t*-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t*-clix*)\n\t\t\t\tvendor=intergraph\n\t\t\t\t;;\n\t\t\t*-mvs* | *-opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t*-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\ts390-* | s390x-*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t*-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t*-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t*-vxsim* | *-vxworks* | *-windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t*-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t*-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t*-mpw* | *-macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t*-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t*-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\t;;\nesac\n\necho \"$cpu-$vendor-${kernel:+$kernel-}$os\"\nexit\n\n# Local variables:\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/helpers/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2020-11-14.01; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# 'make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\ntab='\t'\nnl='\n'\nIFS=\" $tab$nl\"\n\n# Set DOITPROG to \"echo\" to test this script.\n\ndoit=${DOITPROG-}\ndoit_exec=${doit:-exec}\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\n# Create dirs (including intermediate dirs) using mode 755.\n# This is like GNU 'install' as of coreutils 8.32 (2020).\nmkdir_umask=22\n\nbackupsuffix=\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nis_target_a_directory=possibly\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -p            pass -p to $cpprog.\n  -s            $stripprog installed files.\n  -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\nBy default, rm is invoked with -f; when overridden with RMPROG,\nit's up to you to specify -f if you want it.\n\nIf -S is not specified, no backups are attempted.\n\nEmail bug reports to bug-automake@gnu.org.\nAutomake home page: https://www.gnu.org/software/automake/\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n        shift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n        case $mode in\n          *' '* | *\"$tab\"* | *\"$nl\"* | *'*'* | *'?'* | *'['*)\n            echo \"$0: invalid mode: $mode\" >&2\n            exit 1;;\n        esac\n        shift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n        shift;;\n\n    -p) cpprog=\"$cpprog -p\";;\n\n    -s) stripcmd=$stripprog;;\n\n    -S) backupsuffix=\"$2\"\n        shift;;\n\n    -t)\n        is_target_a_directory=always\n        dst_arg=$2\n        # Protect names problematic for 'test' and other utilities.\n        case $dst_arg in\n          -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n        esac\n        shift;;\n\n    -T) is_target_a_directory=never;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --) shift\n        break;;\n\n    -*) echo \"$0: invalid option: $1\" >&2\n        exit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\n# We allow the use of options -d and -T together, by making -d\n# take the precedence; this is for compatibility with GNU install.\n\nif test -n \"$dir_arg\"; then\n  if test -n \"$dst_arg\"; then\n    echo \"$0: target directory not allowed when installing a directory.\" >&2\n    exit 1\n  fi\nfi\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n    # Protect names problematic for 'test' and other utilities.\n    case $dst_arg in\n      -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n    esac\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call 'install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  if test $# -gt 1 || test \"$is_target_a_directory\" = always; then\n    if test ! -d \"$dst_arg\"; then\n      echo \"$0: $dst_arg: Is not a directory.\" >&2\n      exit 1\n    fi\n  fi\nfi\n\nif test -z \"$dir_arg\"; then\n  do_exit='(exit $ret); exit $ret'\n  trap \"ret=129; $do_exit\" 1\n  trap \"ret=130; $do_exit\" 2\n  trap \"ret=141; $do_exit\" 13\n  trap \"ret=143; $do_exit\" 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n        u_plus_rw=\n      else\n        u_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n        u_plus_rw=\n      else\n        u_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names problematic for 'test' and other utilities.\n  case $src in\n    -* | [=\\(\\)!]) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n    # Don't chown directories that already exist.\n    if test $dstdir_status = 0; then\n      chowncmd=\"\"\n    fi\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n    dst=$dst_arg\n\n    # If destination is a directory, append the input filename.\n    if test -d \"$dst\"; then\n      if test \"$is_target_a_directory\" = never; then\n        echo \"$0: $dst_arg: Is a directory\" >&2\n        exit 1\n      fi\n      dstdir=$dst\n      dstbase=`basename \"$src\"`\n      case $dst in\n\t*/) dst=$dst$dstbase;;\n\t*)  dst=$dst/$dstbase;;\n      esac\n      dstdir_status=0\n    else\n      dstdir=`dirname \"$dst\"`\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  case $dstdir in\n    */) dstdirslash=$dstdir;;\n    *)  dstdirslash=$dstdir/;;\n  esac\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n        # With -d, create the new directory with the user-specified mode.\n        # Otherwise, rely on $mkdir_umask.\n        if test -n \"$dir_arg\"; then\n          mkdir_mode=-m$mode\n        else\n          mkdir_mode=\n        fi\n\n        posix_mkdir=false\n\t# The $RANDOM variable is not portable (e.g., dash).  Use it\n\t# here however when possible just to lower collision chance.\n\ttmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\n\ttrap '\n\t  ret=$?\n\t  rmdir \"$tmpdir/a/b\" \"$tmpdir/a\" \"$tmpdir\" 2>/dev/null\n\t  exit $ret\n\t' 0\n\n\t# Because \"mkdir -p\" follows existing symlinks and we likely work\n\t# directly in world-writeable /tmp, make sure that the '$tmpdir'\n\t# directory is successfully created first before we actually test\n\t# 'mkdir -p'.\n\tif (umask $mkdir_umask &&\n\t    $mkdirprog $mkdir_mode \"$tmpdir\" &&\n\t    exec $mkdirprog $mkdir_mode -p -- \"$tmpdir/a/b\") >/dev/null 2>&1\n\tthen\n\t  if test -z \"$dir_arg\" || {\n\t       # Check for POSIX incompatibilities with -m.\n\t       # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t       # other-writable bit of parent directory when it shouldn't.\n\t       # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t       test_tmpdir=\"$tmpdir/a\"\n\t       ls_ld_tmpdir=`ls -ld \"$test_tmpdir\"`\n\t       case $ls_ld_tmpdir in\n\t\t d????-?r-*) different_mode=700;;\n\t\t d????-?--*) different_mode=755;;\n\t\t *) false;;\n\t       esac &&\n\t       $mkdirprog -m$different_mode -p -- \"$test_tmpdir\" && {\n\t\t ls_ld_tmpdir_1=`ls -ld \"$test_tmpdir\"`\n\t\t test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t       }\n\t     }\n\t  then posix_mkdir=:\n\t  fi\n\t  rmdir \"$tmpdir/a/b\" \"$tmpdir/a\" \"$tmpdir\"\n\telse\n\t  # Remove any dirs left behind by ancient mkdir implementations.\n\t  rmdir ./$mkdir_mode ./-p ./-- \"$tmpdir\" 2>/dev/null\n\tfi\n\ttrap '' 0;;\n    esac\n\n    if\n      $posix_mkdir && (\n        umask $mkdir_umask &&\n        $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n        /*) prefix='/';;\n        [-=\\(\\)!]*) prefix='./';;\n        *)  prefix='';;\n      esac\n\n      oIFS=$IFS\n      IFS=/\n      set -f\n      set fnord $dstdir\n      shift\n      set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n        test X\"$d\" = X && continue\n\n        prefix=$prefix$d\n        if test -d \"$prefix\"; then\n          prefixes=\n        else\n          if $posix_mkdir; then\n            (umask $mkdir_umask &&\n             $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n            # Don't fail if two instances are running concurrently.\n            test -d \"$prefix\" || exit 1\n          else\n            case $prefix in\n              *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n              *) qprefix=$prefix;;\n            esac\n            prefixes=\"$prefixes '$qprefix'\"\n          fi\n        fi\n        prefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n        # Don't fail if two instances are running concurrently.\n        (umask $mkdir_umask &&\n         eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n          test -d \"$dstdir\" || exit 1\n        obsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=${dstdirslash}_inst.$$_\n    rmtmp=${dstdirslash}_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask &&\n     { test -z \"$stripcmd\" || {\n\t # Create $dsttmp read-write so that cp doesn't create it read-only,\n\t # which would cause strip to fail.\n\t if test -z \"$doit\"; then\n\t   : >\"$dsttmp\" # No need to fork-exec 'touch'.\n\t else\n\t   $doit touch \"$dsttmp\"\n\t fi\n       }\n     } &&\n     $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"     2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"  2>/dev/null` &&\n       set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       set +f &&\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # If $backupsuffix is set, and the file being installed\n      # already exists, attempt a backup.  Don't worry if it fails,\n      # e.g., if mv doesn't support -f.\n      if test -n \"$backupsuffix\" && test -f \"$dst\"; then\n        $doit $mvcmd -f \"$dst\" \"$dst$backupsuffix\" 2>/dev/null\n      fi\n\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n        # Now remove or move aside any old file at destination location.\n        # We try this two ways since rm can't unlink itself on some\n        # systems and the destination file might be busy for other\n        # reasons.  In this case, the final cleanup might fail but the new\n        # file should still install successfully.\n        {\n          test ! -f \"$dst\" ||\n          $doit $rmcmd \"$dst\" 2>/dev/null ||\n          { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n            { $doit $rmcmd \"$rmtmp\" 2>/dev/null; :; }\n          } ||\n          { echo \"$0: cannot unlink or rename $dst\" >&2\n            (exit 1); exit 1\n          }\n        } &&\n\n        # Now rename the file to the real destination.\n        $doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC0\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_add_cflags.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_ADD_CFLAGS(variable, flag [,actual_flag [,success [,failure]]]])\ndnl\ndnl Attempt to add the given option to xFLAGS, if it doesn't break\ndnl compilation.  If the option to be tested is different than the\ndnl option that should actually be added, add the option to be\ndnl actually added as a second argument.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_ADD_CFLAGS], [PA_ADD_FLAGS(CFLAGS, [$1], [$2], [$3], [$4])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_add_cppflags.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_ADD_CPPFLAGS(variable, flag [,actual_flag [,success [,failure]]]])\ndnl\ndnl Attempt to add the given option to xFLAGS, if it doesn't break\ndnl compilation.  If the option to be tested is different than the\ndnl option that should actually be added, add the option to be\ndnl actually added as a second argument.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_ADD_CPPFLAGS], [PA_ADD_FLAGS(CPPFLAGS, [$1], [$2], [$3], [$4])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_add_flags.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_ADD_FLAGS(variable, flag [,actual_flag [,success [,failure]]])\ndnl\ndnl Attempt to add the given option to CPPFLAGS, if it doesn't break\ndnl compilation.  If the option to be tested is different than the\ndnl option that should actually be added, add the option to be\ndnl actually added as a second argument.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_ADD_FLAGS],\n[AC_MSG_CHECKING([if $CC accepts $2])\n pa_add_flags__old_flags=\"$$1\"\n $1=\"$$1 $2\"\n AC_LINK_IFELSE(\n  [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],\n   [printf(\"Hello, World!\\n\");])],\n  [AC_MSG_RESULT([yes])\n   $1=\"$pa_add_flags__old_flags ifelse([$3],[],[$2],[$3])\"\n   AC_DEFINE(PA_SYM([$1_],[$2]), 1,\n    [Define to 1 if compiled with the `$2' compiler flag])\n   $4],\n  [AC_MSG_RESULT([no])\n   $1=\"$pa_add_flags__old_flags\"\n   $5])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_add_headers.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_ADD_HEADERS(headers...)\ndnl\ndnl Call AC_CHECK_HEADERS(), and add to ac_includes_default if found\ndnl --------------------------------------------------------------------------\nAC_DEFUN([_PA_ADD_HEADER],\n[AC_CHECK_HEADERS([$1],[ac_includes_default=\"$ac_includes_default\n#include <$1>\"\n])\n])\n\nAC_DEFUN([PA_ADD_HEADERS],\n[m4_map_args_w([$1],[_PA_ADD_HEADER(],[)])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_add_ldflags.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_ADD_LDFLAGS(variable, flag [,actual_flag [,success [,failure]]]])\ndnl\ndnl Attempt to add the given option to xFLAGS, if it doesn't break\ndnl compilation.  If the option to be tested is different than the\ndnl option that should actually be added, add the option to be\ndnl actually added as a second argument.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_ADD_LDFLAGS], [PA_ADD_FLAGS(LDFLAGS, [$1], [$2], [$3], [$4])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_arg_bool.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_ARG_BOOL(option,helptext,default,enabled_action,disabled_action)\ndnl\ndnl  The last three arguments are optional; default can be yes or no.\ndnl\ndnl  Simpler-to-use versions of AC_ARG_ENABLED, that include the\ndnl  test for $enableval and the AS_HELP_STRING definition. This is only\ndnl  to be used for boolean options.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_ARG_BOOL],\n[m4_pushdef([pa_default],m4_default(m4_normalize([$3]),[no]))\n m4_pushdef([pa_option],m4_case(pa_default,[yes],[disable],[enable]))\n AC_ARG_ENABLE([$1],\n  [AS_HELP_STRING([--]m4_defn([pa_option])[-$1],[$2])],\n  [pa_arg_bool_enableval=\"$enableval\"],\n  [pa_arg_bool_enableval=\"]m4_defn([pa_default])[\"])\n m4_popdef([pa_option], [pa_default])\n AS_IF([test x\"$pa_arg_bool_enableval\" != xno], [$4], [$5])\n])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_arg_enabled.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_ARG_ENABLED(option,helptext,enabled_action,disabled_action)\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_ARG_ENABLED],[PA_ARG_BOOL([$1],[$2],no,[$3],[$4])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_check_bad_stdc_inline.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_CHECK_BAD_STDC_INLINE\ndnl\ndnl Some versions of gcc seem to apply -Wmissing-prototypes to C99\ndnl inline functions, which means we need to use GNU inline syntax\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_CHECK_BAD_STDC_INLINE],\n[AC_MSG_CHECKING([if $CC supports C99 external inlines])\n AC_COMPILE_IFELSE([AC_LANG_SOURCE([\nAC_INCLUDES_DEFAULT\n\n/* Don't mistake GNU inlines for c99 */\n#if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__)\n# error \"Using gnu inline standard\"\n#endif\n\ninline int foo(int x)\n{\n\treturn x+1;\n}\n ])],\n [AC_MSG_RESULT([yes])\n  AC_DEFINE([HAVE_STDC_INLINE], 1,\n    [Define to 1 if your compiler supports C99 extern inline])],\n [AC_MSG_RESULT([no])\n  PA_ADD_CFLAGS([-fgnu89-inline])])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_func_attribute.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_FUNC_ATTRIBUTE(attribute_name)\ndnl\ndnl See if this compiler supports the equivalent of a specific gcc\ndnl attribute on a function, using the __attribute__(()) syntax.\ndnl All arguments except the attribute name are optional.\ndnl\ndnl PA_FUNC_ATTRIBUTE(attribute, attribute_opts, return_type,\ndnl                   prototype_args, call_args, altname)\ndnl\ndnl This tests the attribute both on a function pointer and on a\ndnl direct function, as some gcc [and others?] versions have problems\ndnl with attributes on function pointers, and we might as well check both.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([_PA_FUNC_ATTRIBUTE],\n[m4_define([_pa_faa],ifelse([$2],[],[],[($2)]))\n m4_define([_pa_fam],ifelse([$2],[],[],[(m4_join([,],m4_for(_pa_n,1,m4_count($2),1,[m4_quote([x]_pa_n),])))]))\n m4_define([_pa_suf],ifelse([$2],[],[],[m4_count($2)]))\n m4_define([_pa_mac],ifelse([$6],[],[$1_func]_pa_suf,[$6]))\n AC_MSG_CHECKING([if $CC supports the $1]_pa_faa[ function attribute])\n AC_COMPILE_IFELSE([AC_LANG_SOURCE([\nAC_INCLUDES_DEFAULT\nextern ifelse([$3],[],[void *],[$3])  __attribute__(([$1]_pa_faa))\n  bar(ifelse([$4],[],[int],[$4]));\nifelse([$3],[],[void *],[$3]) foo(void);\nifelse([$3],[],[void *],[$3]) foo(void)\n{\n\tifelse([$3],[void],[],[return])\n\t\tbar(ifelse([$5],[],[1],[$5]));\n}\n ])],\n [AC_MSG_RESULT([yes])\n  AC_DEFINE(PA_SYM([HAVE_FUNC_ATTRIBUTE],_pa_suf,[_$1]), 1,\n    [Define to 1 if your compiler supports __attribute__(($1)) on functions])],\n [AC_MSG_RESULT([no])])\n AH_BOTTOM(m4_quote(m4_join([],\n [#ifndef ],_pa_mac,[\n# ifdef ],PA_SYM([HAVE_FUNC_ATTRIBUTE],_pa_suf,[_$1]),[\n#  define ],_pa_mac,m4_quote(_pa_fam),[ __attribute__(($1],m4_quote(_pa_fam),[))\n# else\n#  define ],_pa_mac,m4_quote(_pa_fam),[\n# endif\n#endif])))\n])\n\nAC_DEFUN([_PA_FUNC_PTR_ATTRIBUTE],\n[m4_define([_pa_faa],ifelse([$2],[],[],[($2)]))\n m4_define([_pa_fam],ifelse([$2],[],[],[(m4_join([,],m4_for(_pa_n,1,m4_count($2),1,[m4_quote([x]_pa_n),])))]))\n m4_define([_pa_suf],ifelse([$2],[],[],[m4_count($2)]))\n m4_define([_pa_mac],ifelse([$6],[],[$1_func]_pa_suf,[$6])_ptr)\n AC_MSG_CHECKING([if $CC supports the $1]_pa_faa[ function attribute on pointers])\n AC_COMPILE_IFELSE([AC_LANG_SOURCE([\nAC_INCLUDES_DEFAULT\nextern ifelse([$3],[],[void *],[$3])  __attribute__(([$1]_pa_faa))\n  (*bar1)(ifelse([$4],[],[int],[$4]));\nifelse([$3],[],[void *],[$3]) foo1(void);\nifelse([$3],[],[void *],[$3]) foo1(void)\n{\n\tifelse([$3],[void],[],[return])\n\t\tbar1(ifelse([$5],[],[1],[$5]));\n}\n\ntypedef ifelse([$3],[],[void *],[$3])  __attribute__(([$1]_pa_faa))\n  (*bar_t)(ifelse([$4],[],[int],[$4]));\nextern bar_t bar2;\nifelse([$3],[],[void *],[$3]) foo2(void);\nifelse([$3],[],[void *],[$3]) foo2(void)\n{\n\tifelse([$3],[void],[],[return])\n\t\tbar2(ifelse([$5],[],[1],[$5]));\n}\n ])],\n [AC_MSG_RESULT([yes])\n  AC_DEFINE(PA_SYM([HAVE_FUNC_PTR_ATTRIBUTE],_pa_suf,[_$1]), 1,\n    [Define to 1 if your compiler supports __attribute__(($1)) on function pointers])],\n [AC_MSG_RESULT([no])])\n AH_BOTTOM(m4_quote(m4_join([],\n [#ifndef ],_pa_mac,[\n# ifdef ],PA_SYM([HAVE_FUNC_PTR_ATTRIBUTE],_pa_suf,[_$1]),[\n#  define ],_pa_mac,m4_quote(_pa_fam),[ __attribute__(($1],m4_quote(_pa_fam),[))\n# else\n#  define ],_pa_mac,m4_quote(_pa_fam),[\n# endif\n#endif])))\n])\n\nAC_DEFUN([PA_FUNC_ATTRIBUTE],\n[_PA_FUNC_ATTRIBUTE([$1],[$2],[$3],[$4],[$5],[$6])\n _PA_FUNC_PTR_ATTRIBUTE([$1],[$2],[$3],[$4],[$5],[$6])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_func_attribute_error.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_FUNC_ATTRIBUTE_ERROR\ndnl\ndnl See if this compiler supports __attribute__((error(\"foo\")))\ndnl The generic version of this doesn't work as it makes the compiler\ndnl throw an error by design.\ndnl\ndnl This doesn't use a function pointer because there is no need:\ndnl the error function will never be a function pointer.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_FUNC_ATTRIBUTE_ERROR],\n[AC_MSG_CHECKING([if $CC supports the error function attribute])\n AC_COMPILE_IFELSE([AC_LANG_SOURCE([\nAC_INCLUDES_DEFAULT\nextern void __attribute__((error(\"message\"))) barf(void);\nvoid foo(void);\nvoid foo(void)\n{\n\tif (0)\n\t\tbarf();\n}\n ])],\n [AC_MSG_RESULT([yes])\n  AC_DEFINE([HAVE_FUNC_ATTRIBUTE_ERROR], 1,\n [Define to 1 if your compiler supports __attribute__((error)) on functions])],\n [AC_MSG_RESULT([no])])\n])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_have_func.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_HAVE_FUNC(func_name)\ndnl\ndnl Look for a function with the specified arguments which could be\ndnl a builtin/intrinsic function.\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_HAVE_FUNC],\n[AC_MSG_CHECKING([for $1])\n AC_LINK_IFELSE([AC_LANG_SOURCE([\nAC_INCLUDES_DEFAULT\nint main(void) {\n    (void)$1$2;\n    return 0;\n}\n ])],\n [AC_MSG_RESULT([yes])\n  AC_DEFINE(AS_TR_CPP([HAVE_$1]), 1,\n  [Define to 1 if you have the `$1' intrinsic function.])],\n [AC_MSG_RESULT([no])])\n])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autoconf/m4/pa_sym.m4",
    "content": "dnl --------------------------------------------------------------------------\ndnl PA_SYM(prefix, string)\ndnl\ndnl Convert a (semi-) arbitrary string to a CPP symbol\ndnl --------------------------------------------------------------------------\nAC_DEFUN([PA_SYM],\n[m4_bpatsubsts(m4_quote(m4_toupper([$*])),\n [,],[],[[^ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]+],[_],[^._?\\(.*\\)_.$],[[\\1]])])\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/autogen.sh",
    "content": "#!/bin/sh -xe\n#\n# Run this script to regenerate autoconf files\n#\nrecheck=false\nif [ x\"$1\" = x--recheck ]; then\n    recheck=true\n    config=$(sh config.status --config 2>/dev/null)\nfi\n\n# This allows for overriding the default autoconf programs\nAUTOCONF=\"${AUTOCONF:-${AUTOTOOLS_PREFIX}autoconf}\"\nAUTOMAKE=\"${AUTOMAKE:-${AUTOTOOLS_PREFIX}automake}\"\nACLOCAL=\"${ACLOCAL:-${AUTOTOOLS_PREFIX}aclocal}\"\nAUTOHEADER=\"${AUTOHEADER:-${AUTOTOOLS_PREFIX}autoheader}\"\n\nmkdir -p autoconf autoconf/helpers config\nautolib=\"`\"$AUTOMAKE\" --print-libdir`\"\nif test ! x\"$autolib\" = x; then\n    for prg in install-sh compile config.guess config.sub; do\n\t# Update autoconf helpers if and only if newer ones are available\n\tif test -f \"$autolib\"/\"$prg\" && \\\n\t\t( set +xe ; \\\n\t\t  test -f autoconf/helpers/\"$prg\" && sed -n \\\n\t\t    -e 's/^scriptver=/scriptversion=/' \\\n\t\t    -e 's/^timestamp=/scriptversion=/' \\\n\t\t    -e 's/^scriptversion=['\\''\"]?\\([^'\\''\"]*\\).*$/\\1/p' \\\n\t\t\t  \"$autolib\"/\"$prg\" autoconf/helpers/\"$prg\" | \\\n\t\t\t  sort -c 2>/dev/null ; \\\n\t\t  test $? -ne 0 )\n\tthen\n\t    cp -f \"$autolib\"/\"$prg\" autoconf/helpers\n\tfi\n    done\nfi\nmv -f autoconf/aclocal.m4 autoconf/aclocal.m4.old 2>/dev/null || true\nmkdir -p autoconf/m4.old autoconf/m4\nmv -f autoconf/m4/*.m4 autoconf/m4.old/ 2>/dev/null || true\nACLOCAL_PATH=\"${ACLOCAL_PATH}${ACLOCAL_PATH:+:}`pwd`/autoconf/m4.old\"\nexport ACLOCAL_PATH\n\"$ACLOCAL\" --install --output=autoconf/aclocal.m4 -I autoconf/m4\nif test ! -f autoconf/aclocal.m4; then\n    # aclocal failed, revert to previous files\n    mv -f autoconf/m4.old/*.m4 autoconf/m4/ 2>/dev/null || true\n    mv -f autoconf/aclocal.m4.old autoconf/aclocal.m4 2>/dev/null || true\nfi\nrm -rf autoconf/*m4.old\n\"$AUTOHEADER\" -B autoconf\n\"$AUTOCONF\" -B autoconf\nrm -rf autom4te.cache config.log config.status config/config.h Makefile\n\nif $recheck; then\n    # This bizarre statement has to do with how config.status quotes its output\n    echo exec sh configure $config | sh -\nfi\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/bac80.c",
    "content": "#include \"abcdisk.h\"\n#include \"bin2abc.h\"\n#include \"asmsrc/bac80.h\"\n#include \"asmsrc/bac80r.h\"\n\n#define BLKSIZE\t253\n\nstruct basic_block {\n    FILE *out;\n    int bytes;                  /* Bytes in buffer */\n    int outbytes;               /* Bytes already written to file */\n    uint16_t lineno;\n    uint8_t *stringptr;        /* Accumulating string data, pointer to len */\n    uint8_t data[BLKSIZE];\n};\n\n#define LINEHDR 3\t\t/* Bytes for the BASIC line header */\n#define LINEEND 1\t\t/* Trailing overhead for BASIC line */\n#define STRHDR  (LINEHDR+3)\t/* Leading overhead bytes for string data */\n#define STREND  (LINEEND+1)\t/* Trailing overhead bytes for string data */\n#define BLKFREE (BLKSIZE-1)\t/* Usable bytes in a block (1 byte for EOB) */\n\n/* Finalize and output a data block */\nstatic void writeblock(struct basic_block *blk, bool final)\n{\n    int bytes = blk->bytes;\n\n    if (!bytes && !final)\n        return;\n\n    assert(bytes < BLKSIZE);\n\n    blk->data[bytes++] = final;\n    memset(blk->data + bytes, 0, BLKSIZE - bytes);\n    fwrite(blk->data, 1, BLKSIZE, blk->out);\n\n    blk->outbytes += BLKSIZE;\n    blk->bytes = 0;\n    blk->stringptr = NULL;\n}\n\n/*\n * Close a BASIC string being emitted.\n */\nstatic void closestring(struct basic_block *blk)\n{\n    uint8_t *p = blk->data + blk->bytes;\n\n    if (!blk->stringptr)\n        return;\n\n    *p++ = 0xbb;\t\t/* End string expression */\n    *p++ = 0x0d;                /* Terminating CR */\n\n    blk->bytes += STREND;\n    blk->stringptr = NULL;\n}\n\n/*\n * Emit data encapsulated in BASIC strings.  Multiple chunks can be\n * merged into common strings and strings can be broken up between\n * blocks.\n */\nstatic void stringdata(struct basic_block *blk, const uint8_t *data, int len)\n{\n    while (len) {\n        int copylen;\n        uint8_t *p = blk->data + blk->bytes;\n\n        if (!blk->stringptr) {\n\t    if (blk->bytes >= BLKFREE - (STRHDR+STREND)) {\n                /* Not enough space for any string */\n                writeblock(blk, false);\n                continue;\n            }\n            blk->stringptr = p;\n            *p++ = STRHDR + STREND;\t/* Overhead per statement */\n            p = set16(p, ++blk->lineno);\n            *p++ = 0xcb;\t\t/* String */\n\t    *p++ = '\"';\t\t\t/* Deliminator (unused) */\n\t    *p++ = 0;\t\t\t/* Length of string */\n            blk->bytes += STRHDR;\n        }\n\n        copylen = (BLKFREE - STREND) - blk->bytes;\n        if (copylen > len)\n            copylen = len;\n\n        if (copylen <= 0) {\n            /* Not enough space left in this block for even one byte */\n            closestring(blk);\n            continue;\n        }\n\n        memcpy(p, data, copylen);\n\n        p = blk->stringptr;\n        p[0] += copylen;\n        p[5] += copylen;\n\n\tdata += copylen;\n        blk->bytes += copylen;\n        len -= copylen;\n    }\n}\n\n/*\n * Emit a standalone BASIC statement, without encapsulating it in a string.\n */\nstatic void bacstmt(struct basic_block *blk, const uint8_t * data, int len)\n{\n    uint8_t *p;\n\n    if (blk->stringptr)\n\tclosestring(blk);\t/* Close any open string data */\n\n    if (len > BLKFREE - (LINEHDR+LINEEND) - blk->bytes)\n        writeblock(blk, false);\n\n    p = &blk->data[blk->bytes];\n    *p++ = len + (LINEHDR+LINEEND);\t/* Length of statement */\n    p = set16(p, ++blk->lineno);        /* Line number */\n    p = mempcpy(p, data, len);\t\t/* Actual bytecode data */\n    *p++ = 0x0d;\t\t\t/* Terminating CR */\n\n    blk->bytes = p - blk->data;\n}\n\n/*\n * BASIC statement for the original RUN with CHAIN option\n *\n * PRINT CALL(PEEK(65054%)+SWAP%(65055%)-xxxx%) \":CHAINFILE:HERE:\"+\"\"\n *\n * 65054 = EOFA, since we have the loader at the end.\n * The +\"\" forces BASIC to copy the string to the stack instead of\n * pointing into the P-code.\n */\nstatic uint8_t run_prefix[] = {\n    0x84, 0xc7, 0x1e, 0xfe, 0xce, 0x36, 0xc7, 0x1f,\n    0xfe, 0xce, 0x36, 0xce, 0x34, 0xf5, 0xc7,\n    0, 0,                       /* = loader length */\n    0xf8, 0xce, 0x3a, 0xba,\n    0xcb, '\"', 16,\t\t/* String expression */\n    ':', 'C', 'H', 'A', 'I', 'N', 'F', 'I',\n    'L', 'E', ':', 'H', 'E', 'R', 'E', ':',\n    0xcb, '\"', 0, 0xf6,\t\t/* +\"\" */\n    0xbb\t\t\t/* End string expression */\n};\n#define RUN_CALL_OFFSET 15\n#define RUN_CHAIN_OFFSET (RUN_CALL_OFFSET+9)\n\n/*\n * This is the BASIC statement:\n *  1 IF CALL(yyyy%)\n * followed by an end of program marker (1 byte) (which also = END).\n *\n * This includes the BASIC statement encapsulation, since this is\n * part of the payload.\n *\n * The address yyyy% is set to the entry point via a normal relocation.\n */\nstatic uint8_t restart_prefix[] = {\n    11,\t\t\t\t/*  0 - line len */\n    0x01, 0x00,\t\t\t/*  1 - line no */\n    0x88,\t\t\t/*  3 - IF */\n    0xc7, 0, 0,\t\t\t/*  4 - address */\n    0xce, 0x3a,\t\t\t/*  7 - CALL() */\n    0xba,\t\t\t/*  8 - end integer */\n    0x87, 0x01,\t\t\t/* 10 - skip one byte if false */\n    0x0d,\t\t\t/* 12 - end of line */\n    0x01\t\t\t/* 13 - End of BASIC program */\n};\n#define RESTART_CALL_OFFSET 5\n\n/*\n * STOP statement, used as end-of-data marker.  Technically,\n * any BASIC statement of 2 bytes or less would work here.\n */\nstatic const uint8_t stop_stmt[] = {\n    0x86, 0x89\t\t\t/* BASIC bytecode for STOP */\n};\n\n/*\n * Main routine\n */\nint writebac80(FILE *out, struct bindata *in)\n{\n    struct basic_block blk;\n    uint8_t *loader;\n    int reloclen = 0;\n    int loader_len;\n    int loader_offset = 1;      /* 1 for the statement terminal CR */\n    int pfxlen = 0;\n\n    memset(&blk, 0, sizeof blk);\n    blk.data[0] = 0x82;         /* Program start marker, not in memory */\n    blk.bytes = 1;\n    blk.out = out;\n\n    if (in->relocs) {\n        /* This is a relocatable binary, load it at BOFA */\n        loader = bac80r_bin;\n        loader_len = bac80r_SYM__end;\n        loader_offset += (loader_len - bac80r_SYM__start);\n\n        if (!in->driver) {\n            /* Application, add a restart prefix to payload */\n            pfxlen = sizeof restart_prefix;\n            set16(restart_prefix + RESTART_CALL_OFFSET, in->entrypoint);\n            push_reloc(in, RESTART_CALL_OFFSET - pfxlen);\n        }\n        loader[bac80r_SYM_DELTA] = pfxlen;\n        set16(loader + bac80r_SYM_ENTRY, in->entrypoint + pfxlen);\n\n        reloclen = pack_relocs(in, pfxlen, false);\n        if (reloclen < 0)\n            return -1;\n\n        set16(loader + bac80r_SYM_NEG_RELOC_LEN, -(reloclen+1));\n    } else {\n        /* This is to be loaded at a fixed address */\n        loader = bac80_bin;\n        loader_len = bac80_SYM__end;\n        loader_offset += (loader_len - bac80_SYM__start);\n\n        set16(loader + bac80_SYM_ENTRY, in->entrypoint);\n        set16(loader + bac80_SYM_LOAD, in->origin);\n    }\n\n    set16(run_prefix + RUN_CALL_OFFSET, loader_offset);\n    embed_name(run_prefix + RUN_CHAIN_OFFSET, CHAIN_LEN, in->chain);\n\n    /* Emit the RUN call prefix */\n    bacstmt(&blk, run_prefix, sizeof run_prefix);\n\n    /* Emit the restart prefix, if applicable */\n    stringdata(&blk, restart_prefix, pfxlen);\n\n    /* Emit the actual binary data */\n    stringdata(&blk, in->data + in->origin, in->datalen);\n\n    /* Emit relocation information */\n    if (in->relocs) {\n        stringdata(&blk, (const uint8_t *)\"\\1\", 1);     /* EOFA marker */\n        stringdata(&blk, in->packed_relocs, in->packed_relocs_len);\n    }\n\n    /* Emit STOP statement to indicate end of data blocks */\n    bacstmt(&blk, stop_stmt, sizeof stop_stmt);\n\n    /* Emit loader */\n    bacstmt(&blk, loader, loader_len);\n\n    /* Write the final block */\n    writeblock(&blk, true);\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/bac800.c",
    "content": "#include \"abcdisk.h\"\n#include \"bin2abc.h\"\n#include \"asmsrc/bac800.h\"\n#include \"asmsrc/bac800d.h\"\n#include \"asmsrc/bac800a.h\"\n\n/* This trailer simply means \"this program has no long variable names */\nstatic const uint8_t trailer[] = {\n    0x00, 0x00, 0x00, 0x00, 0xff, 0xfb, 0xff\n};\n\nint writebac800(FILE *out, struct bindata *in)\n{\n    uint8_t *loader;\n    int loaderlen, reloclen;\n    int padding;\n    const char *chain;\n\n    if (!in->relocs && !in->origin) {\n\t/*\n\t * Make this a warning, because right now we can't tell the case\n\t * where there zero relocations...\n\t */\n        fprintf(stderr,\n\t\t\"%s: warning: ABC800 .bac files should be relocatable\\n\",\n                program_name);\n    }\n\n    if (in->origin) {\n\tloader = bac800a_bin;\n        loaderlen = sizeof bac800a_bin;\n\treloclen = 0;\n\tset16(loader + bac800a_SYM_ENTRY, in->entrypoint);\n        set16(loader + bac800a_SYM_ADDRESS, in->origin);\n\tset16(loader + bac800a_SYM_LENGTH, in->datalen);\n    } else {\n\tint relocoffset;\n\t\n\tif (in->driver) {\n\t    loader = bac800d_bin;\n\t    loaderlen = sizeof bac800d_bin;\n\t    relocoffset = 0;\n\t    set16(loader + bac800d_SYM_ENTRY, in->entrypoint);\n\t} else {\n\t    loader = bac800_bin;\n\t    loaderlen = sizeof bac800_bin;\n\t    relocoffset = bac800_SYM__end - bac800_SYM_LAST_RELOC;\n\t    set16(loader + bac800_SYM_ENTRY, in->entrypoint);\n\t}\n\n\treloclen = pack_relocs(in, relocoffset, !in->driver);\n\tif (reloclen < 0)\n\t    return -1;\n\n\tif (in->driver) {\n\t    set16(loader + bac800d_SYM_DATA_OFFSET,\n\t\t  loaderlen + reloclen - bac800d_SYM__start);\n\t    set16(loader + bac800d_SYM_COMSZ, in->datalen);\n\t} else {\n\t    set16(loader + bac800_SYM_NEGDATAPTR,\n\t\t  -(loaderlen + reloclen - bac800_SYM__start));\n\t}\n    }\n\n    /* These fields are common to all */\n    set16(loader + bac800_SYM_PRGSZ,\n\t  loaderlen + reloclen + in->datalen + sizeof trailer);\n\n    chain = in->chain;\n    if (!chain[0])\n\tchain = \"NUL:\";\n\n    embed_name(loader + bac800_SYM_b_chainstr, CHAIN_LEN, chain);\n\n    /* The loader already includes the header and BASIC prefix */\n    fwrite(loader, 1, loaderlen, out);\n    if (reloclen)\n\tfwrite(in->packed_relocs, 1, reloclen, out);\n    fwrite(in->data + in->origin, 1, in->datalen, out);\n    fwrite(trailer, 1, sizeof trailer, out);\n\n    /* Pad to the end of a 253-byte sector */\n    padding = 252 - (loaderlen + reloclen + in->datalen +\n\t\t     sizeof trailer - 1) % 253;\n    while (padding--)\n        putc(0, out);\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/bas.c",
    "content": "#include \"compiler.h\"\n#include \"bin2abc.h\"\n\n#define MAXLINE 79\n\nint writebas(FILE *out, struct bindata *in)\n{\n    const uint8_t *data;\n    const bool *isset;\n    int nextaddr = 0;\n    int addr;\n    char buf[MAXLINE+1];\n    int buf_len = 0;\n    int line = in->firstline;\n\n    apply_relocs(in);\n\n    data = in->data;\n    isset = in->isset;\n\n    for (addr = 0; addr < MAX_ADDR; addr++) {\n        if (isset[addr]) {\n            if (buf_len) {\n                if (addr != nextaddr || buf_len > MAXLINE-5) {\n\t\t    buf[buf_len++] = '\\n';\n\t\t    fwrite(buf, 1, buf_len, out);\n\t\t    buf_len = 0;\n\t\t}\n\t    }\n\n\t    if (!buf_len) {\n\t\tbuf_len = snprintf(buf, sizeof buf, \"%d POKE %d%%\",\n\t\t\t\t   line++, addr);\n\t    }\n\n\t    buf_len += snprintf(buf + buf_len, sizeof buf - buf_len,\n\t\t\t\t\",%d%%\", data[addr]);\n\t    nextaddr = addr + 1;\n\t}\n    }\n\n    if (buf_len) {\n\tbuf[buf_len++] = '\\n';\n\tfwrite(buf, 1, buf_len, out);\n    }\n\n    if (in->subroutine) {\n\tfprintf(out, \"%d RETURN\\n\", line++);\n    } else {\n\tif (in->entrypoint >= 0)\n\t    fprintf(out, \"%d Z%%=CALL(%d%%)\\n\", line++, in->entrypoint);\n\n\tswitch (in->chain[0]) {\n\tcase ':':\n\t    fprintf(out, \"%d END\\n\", line++);\n\t    break;\n\tcase '\\0':\n\tcase ' ':\n\t    /* Make it work on both ABC80 and 800 */\n\t    fprintf(out, \"%d ON ERROR GOTO %d\\n\", line, line+2);\n\t    fprintf(out, \"%d CHAIN \\\"\\\"\\n\", line+1); /* ABC80 */\n\t    fprintf(out, \"%d CHAIN \\\"NUL:\\\"\\n\", line+2); /* ABC800 */\n\t    line += 3;\n\t    break;\n\tdefault:\n\t    fprintf(out, \"%d CHAIN \\\"%s\\\"\\n\", line++, in->chain);\n\t    break;\n\t}\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/bin2abc.c",
    "content": "/*\n * bin2abc.c\n *\n * Convert a binary file either in binary or ith format to an ABC80/800\n * .bac, .abs, or .bas (POKE) file.\n */\n\n#include \"abcdisk.h\"\n#include \"bin2abc.h\"\n\nFILE *open_file(const char *filename, const char *mode)\n{\n    FILE *f;\n\n    if (is_stdio(filename)) {\n        f = (mode[0] == 'w') ? stdout : stdin;\n    } else {\n        f = fopen(filename, mode);\n        if (!f) {\n            fprintf(stderr, \"%s: %s: %s\\n\", program_name, filename,\n                    strerror(errno));\n            return NULL;\n        }\n    }\n\n    clearerr(f);\n    return f;\n}\n\nint close_file(FILE * f)\n{\n    int err;\n\n    if (!f)\n\treturn 0;\n\n    err = ferror(f);\n\n    if (f != stdin && f != stdout && f != stderr)\n        err |= fclose(f);\n\n    return err;\n}\n\nsize_t read_file(void *buf, size_t buflen, const char *filename)\n{\n    FILE *f;\n    size_t n;\n\n    f = open_file(filename, \"rb\");\n    if (!f)\n        return 0;\n\n    n = fread(buf, 1, buflen, f);\n\n    close_file(f);\n    return n;\n}\n\nstatic int read_binary(struct bindata *in, const char *filename,\n\t\t       uint16_t offset)\n{\n    size_t i, n;\n\n    n = read_file(in->data + offset, MAX_ADDR - offset, filename);\n    if (!n)\n        return -1;\n\n    for (i = offset; i < offset + n; i++)\n        in->isset[i] = true;\n\n    return offset + n;\n}\n\n#define CHAIN_LEN 16\nstatic const char no_chain[] = \":CHAINFILE:HERE:\";\n\n/*\n * Search for a autochain filename in the header of a .bac file\n * and change it if we can find one.\n */\nstatic void patch_chain(const char *filename, const char *chain)\n{\n    uint8_t block[253];\n    FILE *f;\n    const uint8_t *searchfor;\n    static const uint8_t search80[4]  = {0xba, 0xcb, '\"', CHAIN_LEN};\n    static const uint8_t search800[4] = {0x86, 0x0b, 0xcb, CHAIN_LEN};\n    uint8_t *p, endbyte;\n    int limit, i;\n\n    errno = 0;\n\n    f = open_file(filename, \"r+b\");\n    if (!f)\n\treturn;\n\n    /* Should definitely be in the first file block */\n    if (fread(block, 1, sizeof block, f) != sizeof block)\n\tgoto failure;\n\n    if ((block[0] & 0xf0) != 0x80) {\n\t/* Definitely not a .bac file */\n\tgoto failure;\n    }\n\n    if (block[0] & 0x08) {\n\t/* Looks like an ABC800 .bac file */\n\tp = block + 0x14;\n\tlimit = sizeof block - 0x14;\n\tsearchfor = search800;\n\tendbyte = 0xb9;\n\tif (!chain[0]) {\n\t    /* The wipeout name is NUL: on ABC800, not an empty string */\n\t    chain = \"NUL:\";\n\t}\n    } else {\n\t/* Looks like an ABC80 .bac file */\n\tp = block + 4;\n\tlimit = block[1] - 3 - 1; /* 3 for line header, 1 for final CR */\n\tsearchfor = search80;\n\tendbyte = 0xbb;\n    }\n\n    /* Point p to the actual string */\n    p += 4;\n\n    /* The subtract is because we must able to fit the string+prefix+endbyte */\n    for (limit -= CHAIN_LEN+5; limit >= 0; p++, limit--) {\n\tif (memcmp(p-4, searchfor, 4) || p[CHAIN_LEN] != endbyte)\n\t    continue;\n\n\t/*\n\t * Looks plausible. Now make sure the field looks like an\n\t * embedded filename field.\n\t */\n\tfor (i = 0; i < CHAIN_LEN; i++) {\n\t    uint8_t c = p[i];\n\t    if (c != '\\r' && !(c == '.') && !(c == ':') &&\n\t\t!(c >= '0' && c <= '9') &&\n\t\t!(c >= 'A' && c < '_'))\n\t\tbreak;\t\t/* Not possible */\n\t}\n\n\tif (i == CHAIN_LEN)\n\t    break;\t\t/* Found it! */\n    }\n\n    if (limit < 0)\n\tgoto failure;\n\n    /* We got it! */\n    embed_name(p, CHAIN_LEN, chain);\n    fseek(f, p - block, SEEK_SET);\n    if ((fwrite(p, 1, CHAIN_LEN, f) != CHAIN_LEN) || fflush(f))\n\tgoto failure;\n\n    goto success;\n\nfailure:\n    fprintf(stderr, \"%s: %s: %s\\n\", program_name, filename,\n\t    errno ? strerror(errno)\n\t    : \"unable to find chain file name to patch\");\n\nsuccess:\n    fclose(f);\n    return;\n}\n\nconst char *program_name;\n\nstatic no_return usage(void)\n{\n    fprintf(stderr, \"abcdisk %s\\n\", VERSION);\n    fprintf(stderr, \"Type %s --help for usage instructions\\n\", program_name);\n    exit(1);\n}\n\n/* Helper functions that error out on a missing argument */\nstatic char *short_arg(char opt, char *arg)\n{\n    if (!arg) {\n        fprintf(stderr, \"%s: the -%c option requires an argument\\n\",\n                program_name, opt);\n        usage();\n    }\n    return arg;\n}\n\nstatic char *long_arg(const char *opt, char *arg)\n{\n    if (!arg) {\n        fprintf(stderr, \"%s: the --%s option requires an argument\\n\",\n                program_name, opt);\n        usage();\n    }\n    return arg;\n}\n\n#define SHORT_ARG()\tshort_arg(optchr, *option++)\n#define LONG_ARG()\tlong_arg(optstr,  *option++)\n\nstatic unsigned long intarg(const char *arg)\n{\n    char *ep;\n    unsigned long v;\n\n    v = strtoul(arg, &ep, 0);\n    if (!ep[0])\n        return v;\n\n    fprintf(stderr, \"%s: invalid integer argument: %s\\n\", program_name, arg);\n    usage();\n}\n\n/*\n * If filename is non-NULL return filename, otherwise either\n * no_chain or \"\" depending on \"driver\"\n */\nstatic const char *chainfile(const char *filename, bool driver)\n{\n    if (filename)\n\treturn filename;\n\n    return driver ? \"\" : no_chain;\n}\n\nstatic no_return help(void)\n{\n    printf(\"abcdisk %s\\n\", VERSION);\n    printf(\"Usage: %s [options...] inputfiles...\\n\"\n           \"Options:\\n\"\n           \"  -1, --bac80       generate a .bac file for ABC80\\n\"\n           \"  -2, --bac800      generate a .bac file for ABC800\\n\"\n\t   \"  -t, --bas         generate a .bas file\\n\"\n\t   \"      --firstline # first line number in .bas file\\n\"\n\t   \"      --subroutine  .bas file ends in RETURN\\n\"\n           \"  -a, --abs         generate an .abs file\\n\"\n           \"  -o, --output ...  send output to a file instead of stdout\\n\"\n           \"  -r, --reloc ...   read a relocation file (.reloc from z80asm)\\n\"\n           \"  -b, --binary      input files are binary\\n\"\n           \"  -i, --ihex        input files are in Intel hex format\\n\"\n           \"  -d, --driver      generate .bac files suitable for device drivers\\n\"\n           \"  -D, --app         generate .bac files suitable for applications\\n\"\n\t   \"  -c, --chain       run another program after termination\\n\"\n\t   \"  -n, --new         erase program after execution\\n\"\n\t   \"  -C, --no-chain    do not chain another program, normal END\\n\"\n\t   \"  -p, --patch       patch in a new chain target in an existing file\\n\"\n           \"  -s, --origin #    specify the load address for a binary file\\n\"\n           \"  -e, --entry #     specify the entry point of the program\\n\"\n           \"  -z, --bss #       pad the output with # bytes of zero\\n\"\n           \"  -h, --help        show this help text\\n\"\n\t   \"      --version     print the program version\\n\"\n\t   , program_name);\n    exit(0);\n}\n\nenum output {\n    OUT_BAC80,\n    OUT_BAC800,\n    OUT_ABS,\n    OUT_BAS\n};\n\nint main(int argc, char *argv[])\n{\n    bool ihex = false;\n    char **option, *optstr, optchr;\n    enum output output = OUT_BAC80;\n    int bss = 0;\n    const char *outputfile = NULL;\n    bool patch_mode = false;\n    FILE *out;\n    int nextloadaddr;\n    int firstaddr, lastaddr, i;\n    int err = 0;\n    struct bindata *in;\n\n    program_name = argv[0];\n    (void)argc;\n\n    // in = calloc(sizeof *in, 1);\n    in = calloc(1,sizeof *in);\n\n    in->entrypoint = -1;\n    in->firstline = 1;\n    in->subroutine = false;\n    in->driver = false;\n    in->origin = -1;\n    nextloadaddr = 0;\n\n    /* Aren't modern computers nice? */\n    in->data = calloc(MAX_ADDR, 1);\n    in->isset = calloc(MAX_ADDR, sizeof(bool));\n\n    option = &argv[1];\n    while ((optstr = *option++) != NULL) {\n        if (optstr[0] == '-') {\n            optstr++;\n            optchr = *optstr++;\n\n            if (optchr == '-') {\n                if (!strcmp(optstr, \"abc80\") || !strcmp(optstr, \"bac80\")) {\n                    output = OUT_BAC80;\n                } else if (!strcmp(optstr, \"abc800\") ||\n                           !strcmp(optstr, \"bac800\")) {\n                    output = OUT_BAC800;\n                } else if (!strcmp(optstr, \"abs\")) {\n                    output = OUT_ABS;\n\t\t} else if (!strcmp(optstr, \"bas\")) {\n\t\t    output = OUT_BAS;\n                } else if (!strcmp(optstr, \"reloc\")) {\n\t\t    read_reloc_file(in, LONG_ARG());\n                } else if (!strcmp(optstr, \"ihex\") ||\n                           !strcmp(optstr, \"ith\") ||\n                           !strcmp(optstr, \"intel\") || !strcmp(optstr, \"hex\")) {\n                    ihex = true;\n                } else if (!strcmp(optstr, \"binary\")) {\n                    ihex = false;\n                } else if (!strcmp(optstr, \"entry\")) {\n                    in->entrypoint = intarg(LONG_ARG());\n                } else if (!strcmp(optstr, \"driver\") ||\n                           !strcmp(optstr, \"no-app\")) {\n                    in->driver = true;\n                } else if (!strcmp(optstr, \"app\") ||\n                           !strcmp(optstr, \"no-driver\")) {\n                    in->driver = false;\n\t\t} else if (!strcmp(optstr, \"chain\")) {\n\t\t    in->chain = LONG_ARG();\n\t\t} else if (!strcmp(optstr, \"new\")) {\n\t\t    in->chain = \"\";\n\t\t} else if (!strcmp(optstr, \"no-chain\") ||\n\t\t\t   !strcmp(optstr, \"end\")) {\n\t\t    in->chain = no_chain;\n\t\t} else if (!strcmp(optstr, \"patch\")) {\n\t\t    patch_mode = true;\n                } else if (!strcmp(optstr, \"output\")) {\n                    outputfile = LONG_ARG();\n                } else if (!strcmp(optstr, \"start\") ||\n                           !strcmp(optstr, \"origin\")) {\n\t\t    nextloadaddr = intarg(LONG_ARG());\n\t\t    if (in->origin == -1 || nextloadaddr < in->origin)\n\t\t\tin->origin = nextloadaddr;\n                } else if (!strcmp(optstr, \"entry\") ||\n                           !strcmp(optstr, \"entrypoint\")) {\n                    in->entrypoint = intarg(LONG_ARG());\n                } else if (!strcmp(optstr, \"bss\") || !strcmp(optstr, \"zero\")) {\n                    bss += intarg(LONG_ARG());\n\t\t} else if (!strcmp(optstr, \"firstline\")) {\n\t\t    in->firstline = intarg(LONG_ARG());\n\t\t} else if (!strcmp(optstr, \"subroutine\")) {\n\t\t    in->subroutine = true;\n\t\t} else if (!strcmp(optstr, \"version\")) {\n\t\t    printf(\"abcdisk %s\\n\", VERSION);\n\t\t    exit(0);\n                } else if (!strcmp(optstr, \"help\")) {\n                    help();\n                } else {\n                    fprintf(stderr, \"%s: unknown option --%s\\n\",\n                            program_name, optstr);\n                    usage();\n                }\n            } else {\n                /* Short option */\n                while (optchr) {\n                    switch (optchr) {\n                    case '1':  /* For \"BASIC I\" */\n                        output = OUT_BAC80;\n                        break;\n                    case '2':  /* For \"BASIC II\" */\n                        output = OUT_BAC800;\n                        break;\n                    case 'a':\n                        output = OUT_ABS;\n                        break;\n\t\t    case 't':\n\t\t\toutput = OUT_BAS;\n\t\t\tbreak;\n                    case 'i':\n                        ihex = true;\n                        break;\n                    case 'b':\n                        ihex = false;\n                        break;\n                    case 'r':\n                        read_reloc_file(in, SHORT_ARG());\n                        break;\n                    case 'e':\n                        in->entrypoint = intarg(SHORT_ARG());\n                        break;\n                    case 's':\n                        nextloadaddr = intarg(SHORT_ARG());\n\t\t\tif (in->origin == -1 || nextloadaddr < in->origin)\n\t\t\t    in->origin = nextloadaddr;\n                        break;\n                    case 'o':\n                        outputfile = SHORT_ARG();\n                        break;\n                    case 'd':\n                        in->driver = true;\n                        break;\n                    case 'D':\n                        in->driver = false;\n                        break;\n\t\t    case 'c':\n\t\t\tin->chain = SHORT_ARG();\n\t\t\tbreak;\n\t\t    case 'n':\n\t\t\tin->chain = \"\";\n\t\t\tbreak;\n\t\t    case 'C':\n\t\t\tin->chain = no_chain;\n\t\t\tbreak;\n\t\t    case 'p':\n\t\t\tpatch_mode = true;\n\t\t\tbreak;\n                    case 'z':\n                        bss += intarg(SHORT_ARG());\n                        break;\n                    case 'h':\n                        help();\n                        break;\n                    default:\n                        fprintf(stderr, \"%s: unknown option -%c\\n\",\n                                program_name, optchr);\n                        usage();\n                        break;\n                    }\n                    optchr = *optstr++;\n                }\n            }\n        } else {\n            /* Not an option, input file */\n\t    if (patch_mode) {\n\t\tpatch_chain(optstr, chainfile(in->chain, in->driver));\n\t    } else {\n\t\t/* Read input file */\n\t\tif (ihex)\n\t\t    nextloadaddr = readihex(in, optstr);\n\t\telse\n\t\t    nextloadaddr = read_binary(in, optstr, nextloadaddr);\n\t    }\n        }\n    }\n\n    if (patch_mode)\n\treturn 0;\n\n    in->chain = chainfile(in->chain, in->driver);\n\n    /* Find the first and last addresses in the data array */\n    firstaddr = -1;\n    lastaddr = -1;\n    for (i = 0; i < MAX_ADDR; i++) {\n        if (in->isset[i]) {\n            lastaddr = i;\n            if (firstaddr < 0)\n                firstaddr = i;\n        }\n    }\n\n    if (firstaddr < 0 && !bss) {\n        fprintf(stderr, \"%s: no input data!\\n\", program_name);\n\tusage();\n    }\n\n    if (in->origin == -1 || firstaddr < in->origin)\n\tin->origin = firstaddr;\n\n    if (in->entrypoint == -1)\n\tin->entrypoint = in->origin;\n\n    /* Add a zero-filled section after the last data */\n    if (bss) {\n        uint8_t *dp = in->data + lastaddr;\n        bool *ip = in->isset + lastaddr;\n\n        lastaddr += bss;\n\n        memset(dp, 0, bss);\n        while (bss--)\n            *ip++ = true;\n    }\n\n    in->datalen = lastaddr - in->origin + 1;\n\n    out = open_file(outputfile, \"wb\");\n    if (!out) {\n        fprintf(stderr, \"%s: %s: %s\\n\", program_name, outputfile,\n                strerror(errno));\n        exit(1);\n    }\n\n    switch (output) {\n    case OUT_BAC80:\n        err = writebac80(out, in);\n        break;\n\n    case OUT_BAC800:\n        err = writebac800(out, in);\n        break;\n\n    case OUT_ABS:\n\terr = writeabs(out, in);\n        break;\n\n    case OUT_BAS:\n\terr = writebas(out, in);\n\tbreak;\n    }\n\n    err |= close_file(out);\n\n    if (err && !is_stdio(outputfile)) {\n\tif (errno)\n\t    fprintf(stderr, \"%s: %s: %s\\n\", program_name, outputfile,\n\t\t    strerror(errno));\n        remove(outputfile);\n    }\n\n    return !!err;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/bin2abc.h",
    "content": "#ifndef BIN2ABC_H\n#define BIN2ABC_H\n\n#include \"compiler.h\"\n\n/*\n * Input available to output formats. Not all of them are relevant to\n * all output formats.\n */\nstruct bindata {\n    uint8_t *data;\t \t/* The actual data buffer */\n    bool *isset;\t\t/* Bytes actually written to */\n    uint16_t *relocs;\t\t/* Relocations (NULL for non-relocatable) */\n    uint8_t *packed_relocs;\t/* Packed relocations buffer */\n    int origin;\t\t\t/* Load address */\n    int datalen;\t\t/* Set bytes past origin */\n    int entrypoint;\t\t/* Entry point address (possibly relative) */\n    int firstline;\t\t/* Line number to start at */\n    int nrelocs;\t\t/* Number of relocations */\n    int packed_relocs_len;\t/* Length of packed relocations */\n    bool subroutine;\t\t/* Generate a subroutine for GOSUB */\n    bool driver;\t\t/* Options suitable for a driver? */\n    const char *chain;\t\t/* Filename for chaining */\n};\n\n#define MAX_ADDR 65536\n\nstatic inline bool is_stdio(const char *filename)\n{\n    return !filename || !filename[0] || (filename[0] == '-' && !filename[1]);\n}\n\nstatic inline uint8_t *set16(uint8_t *data, uint16_t val)\n{\n    *data++ = val;\n    *data++ = val >> 8;\n    return data;\n}\n\nstatic inline uint16_t get16(const uint8_t *data)\n{\n    return data[0] + (data[1] << 8);\n}\n\nstatic inline uint16_t letohs(uint16_t v)\n{\n#ifdef WORDS_LITTEENDIAN\n    return v;\n#else\n    return (uint16_t) ((v >> 8) | (v << 8));\n#endif\n}\n\nFILE *open_file(const char *filename, const char *mode);\nint close_file(FILE * f);\nsize_t read_file(void *buf, size_t buflen, const char *filename);\nint readihex(struct bindata *in, const char *filename);\n\nvoid read_reloc_file(struct bindata *in, const char *filename);\nvoid push_reloc(struct bindata *in, uint16_t reloc);\nint pack_relocs(struct bindata *in, int delta, bool adjust);\nvoid apply_relocs(struct bindata *in);\n\n#define CHAIN_LEN 16\n\nint writeabs(FILE *out, struct bindata *in);\nint writebac80(FILE *out, struct bindata *in);\nint writebac800(FILE *out, struct bindata *in);\nint writebas(FILE *out, struct bindata *in);\n\nextern const char *program_name;\n\n#endif /* BIN2ABC_H */\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/casdecode.c",
    "content": "/*\n * Decode ABC80 cassette files\n *\n * Uses libsndfile to parse the input file format.\n */\n\n#include \"abcdisk.h\"\n#include <sndfile.h>\n#include <math.h>\n\nstatic unsigned int xtime;\n\nstatic void output_block(uint8_t * buf, uint8_t * csum)\n{\n    uint16_t csum1, csum2;\n    int i;\n    static FILE *f;\n    static uint16_t block;\n    static char filename[64];\n    int err = 0;\n\n    if (!buf) {\n        err = 1;                /* Notification of a bad block */\n    } else {\n        csum2 = csum[0] + (csum[1] << 8);\n\n        csum1 = 0x03;           /* Checksum includes ETX */\n        for (i = 0; i < 256; i++)\n            csum1 += buf[i];\n\n        if (csum1 == csum2) {\n            if (!memcmp(buf, \"\\xff\\xff\\xff\", 3)) {\n                if (f)\n                    fclose(f);\n\n                unmangle_filename(filename, buf + 3);\n                f = fopen(filename, \"wb\");\n                if (!f) {\n                    perror(filename);\n                    exit(1);\n                }\n                block = 0;\n                printf(\"File: %s\\n\", filename);\n            } else if (!f || buf[0] != 0x00 ||\n                       (buf[1] + (buf[2] << 8)) != block) {\n                printf(\"Bad block ID: %02x %02x %02x\\n\",\n                       buf[0], buf[1], buf[2]);\n                err = 1;\n            } else {\n                block++;\n                fwrite(buf + 3, 1, 253, f);\n            }\n        } else {\n            printf(\"Checksum error: got %04x data %04x\\n\", csum2, csum1);\n            err = 1;\n        }\n    }\n\n    if (err && f) {\n        fclose(f);\n        remove(filename);\n        f = NULL;\n    }\n}\n\nstatic void output_bit(unsigned int bit)\n{\n    enum state {\n        st_leader,\n        st_sync,\n        st_stx,\n        st_data,\n        st_etx,\n        st_csum\n    };\n    static enum state st = st_leader;\n    static unsigned int ctr = 0;\n    static unsigned int bits = 0;\n    static uint8_t data = 0;\n    static uint8_t buf[256];\n    static uint8_t csum[2];\n\n    data = (data >> 1) + (bit << 7);    /* Bigendian bit order... */\n    bits++;\n\n    switch (st) {\n    case st_leader:\n        ctr++;\n        if (bit == 1)\n            ctr = 0;\n        if (ctr > 128)          /* After 128 zeroes start looking for sync */\n            st = st_sync;\n        break;\n\n    case st_sync:\n        if (data == 0x16) {\n            st = st_stx;        /* Sync acquired */\n            bits = 0;\n        }\n        break;\n\n    case st_stx:\n        if (bits < 8)\n            break;\n        bits = 0;\n        ctr = 0;\n        if (data == 0x02) {\n            st = st_data;\n        } else if (data == 0x16) {\n            /* Got another SYNC */\n        } else {\n            printf(\"Got %02x when expecting SYNC or STX\\n\", data);\n            output_block(NULL, NULL);\n            st = st_leader;     /* ERROR */\n        }\n        break;\n\n    case st_data:\n        if (bits < 8)\n            break;\n        bits = 0;\n        buf[ctr++] = data;\n        if (ctr == 256)\n            st = st_etx;\n        break;\n\n    case st_etx:\n        if (bits < 8)\n            break;\n        bits = 0;\n        ctr = 0;\n        if (data == 0x03)\n            st = st_csum;\n        else {\n            printf(\"Got %02x when expecting ETX\\n\", data);\n            output_block(NULL, NULL);\n            st = st_leader;     /* ERROR */\n        }\n        break;\n\n    case st_csum:\n        if (bits < 8)\n            break;\n        bits = 0;\n        csum[ctr++] = data;\n        if (ctr == 2) {\n            output_block(buf, csum);\n            ctr = 0;\n            st = st_leader;\n        }\n        break;\n    }\n}\n\nstatic void process_flank(unsigned int time)\n{\n    static unsigned int since_start = 0;\n    static unsigned int captured = 0;\n\n    since_start += time;\n\n    if (since_start < xtime / 4) {\n        printf(\"Quick flank: %u:%u\\n\", since_start, xtime);\n    } else if (since_start < xtime * 3 / 4) {\n        captured = 1;\n    } else if (since_start < xtime * 5 / 4) {\n        output_bit(captured);\n        since_start = captured = 0;\n    } else {\n        printf(\"Slow flank: %u:%u\\n\", since_start, xtime);\n        since_start = 0;\n    }\n}\n\nint main(int argc, char *argv[])\n{\n    SNDFILE *f;\n    double samp, osamp, scale;\n    double v, k, cutoff, thresh;\n    double *frame;\n    unsigned int state;\n    unsigned int time, ptime;\n    int i;\n    SF_INFO sfinfo;\n\n    setlocale(LC_ALL, \"\");\n\n    if (argc < 2 || (argv[1][0] == '-' && !argv[1][1])) {\n\tfprintf(stderr, \"abcdisk %s\\n\", VERSION);\n\tfprintf(stderr, \"Usage: %s inputfile [threshold_hz [cutoff]]\\n\", argv[0]);\n\texit(1);\n    }\n\n    memset(&sfinfo, 0, sizeof sfinfo);\n    f = sf_open(argv[1], SFM_READ, &sfinfo);\n    if (!f) {\n\tfprintf(stderr, \"%s: %s: %s\\n\", argv[0], argv[1], sf_strerror(NULL));\n\texit(1);\n    }\n\n    thresh = ((argc > 2) ? atof(argv[2]) : CAS_BAUDRATE_ABC800*3)/32768.0;\n    cutoff = (argc > 3) ? atof(argv[3]) : 0.0;\n\n    k = exp(-cutoff / sfinfo.samplerate);\n    xtime = sfinfo.samplerate / CAS_BAUDRATE_ABC80;\n\n    state = time = ptime = 0;\n    samp = osamp = 0.0;\n    v = 0.0;\n\n    frame = calloc(sizeof *frame, sfinfo.channels);\n    if (!frame) {\n\tperror(argv[0]);\n\texit(1);\n    }\n    scale = 1.0/sfinfo.channels;\n\n    while (sf_readf_double(f, frame, 1) == 1) {\n\t/* Average between channels */\n\tsamp = 0.0;\n\tfor (i = 0; i < sfinfo.channels; i++)\n\t    samp += frame[i];\n\tsamp *= scale;\n\n\t/* samp is now a normalized value in the range +/- 1.0 */\n\n        /* Emulate high pass filter in ABC80 */\n        v = (v * k) + (samp - osamp);\n        osamp = samp;\n\n        if (v >= thresh) {\n            if (!state) {\n                state = 1;\n                process_flank(time - ptime);\n                ptime = time;\n            }\n        } else if (v <= -thresh) {\n            if (state) {\n                state = 0;\n                process_flank(time - ptime);\n                ptime = time;\n            }\n        }\n        time++;\n    }\n\n    sf_close(f);\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/casencode.c",
    "content": "/*\n * Encode ABC80 cassette files\n *\n * Uses libsndfile to create the desired output format.\n */\n\n#include \"abcdisk.h\"\n#include <sndfile.h>\n#include <math.h>\n#include <ctype.h>\n\n#define MAX_CHANNELS\t\t32 /* Need to put a limit somewhere... */\nstatic double fbuf[MAX_CHANNELS];  /* Single sample frame buffer */\n\n/*\n * Cassette I/O\n */\nstruct modulator_state {\n    int32_t parity;\t\t/* Last carrier state (+1/-1) */\n    uint32_t fraction;\t\t/* Fraction of last sample left (out of 2^32) */\n};\n\n/* Cassette block data format */\nstruct cas_block {\n    uint8_t leadin[32];         /* 0x00 */\n    uint8_t sync[3];            /* 0x16 */\n    uint8_t stx;                /* 0x02 */\n    uint8_t blktype;            /* 0x00 for data, 0xff for filename */\n    uint8_t blkno[2];           /* Block number (littleendian) */\n    uint8_t data[253];          /* Actual data */\n    uint8_t etx;                /* 0x03 */\n    uint8_t csum[2];            /* Checksum */\n    uint8_t leadout[1];\t\t/* 0x00 */\n};\n\n/* Cassette block + metadata */\nstruct cas_block_info {\n    struct cas_block blk;\n    const uint8_t *data;\t/* Input data to be written */\n    const char *filename;\t/* For error messages */\n    unsigned char mangled_name[12];\n    int block_nr;\t\t/* Note: -1 is valid here */\n    unsigned int data_blocks;\n    unsigned int offset;\t/* Offset in input data */\n    unsigned int baudrate;\n    unsigned int divisor;\n    struct modulator_state ms;\n};\n\nstatic inline bool is_sndformat(int format)\n{\n    /* The major format must be != 0 */\n    return format & SF_FORMAT_TYPEMASK;\n}\n\n/* Unencoded binary formats */\n#define FORMAT_BINARY\t1\t/* Includes framing data */\n#define FORMAT_BLOCK\t2\t/* Just the blocks */\n\nstatic void version(void)\n{\n    fprintf(stderr, \"abcdisk %s\\n\", VERSION);\n}\n\nstatic const char *_progname;\n\nstatic void usage(int err)\n{\n    version();\n    fprintf(stderr, \"Usage: %s [options] inputfile[=outname]...\\n\"\n\t    \"Options:\\n\"\n\t    \"-o outputfile  write to a file instead of standard output\\n\"\n\t    \"-s samplerate  sample rate of output file (default 11025)\\n\"\n\t    \"-c channels    channels in output file (default 1)\\n\"\n\t    \"-b baudrate    output baud rate (default %d, ABC800 can use %d)\\n\"\n\t    \"-S             ABC80 baud rate (%d)\\n\"\n\t    \"-F             ABC800 baud rate (%d)\\n\"\n\t    \"-f format      output sound file format (default wav)\\n\"\n\t    \"-f help        list available output formats\\n\"\n\t    \"-C             equivalent to -f cas\\n\"\n\t    \"-B             equivalent to -f blk\\n\"\n\t    \"-v             print verbose status messages\\n\"\n\t    \"-q             print no status messages\\n\"\n\t    \"-V             print version and exit\\n\"\n\t    \"-h             print this help text and exit\\n\"\n\t    , _progname,\n\t    CAS_BAUDRATE_ABC80, CAS_BAUDRATE_ABC800,\n\t    CAS_BAUDRATE_ABC80, CAS_BAUDRATE_ABC800);\n    exit(err);\n}\n\nstatic const char *getstrarg(char ***argp)\n{\n    const char *arg;\n\n    arg = *++(*argp);\n    if (!arg)\n\tusage(1);\n    return arg;\n}\n\nstatic unsigned long getnumarg(char ***argp)\n{\n    const char *arg = getstrarg(argp);\n    char *ep;\n    unsigned long rv;\n\n    errno = 0;\n    rv = strtoul(arg, &ep, 0);\n    if (errno || *ep) {\n\tusage(1);\n\treturn ULONG_MAX;\n    }\n    return rv;\n}\n\nstatic void list_formats(FILE *f)\n{\n    int fmt_count, i;\n\n    sf_command(NULL, SFC_GET_FORMAT_MAJOR_COUNT, &fmt_count, sizeof fmt_count);\n\n    fprintf(f, \"%-7s %s\\n\", \"cas\", \"unmodulated cassette data\");\n    fprintf(f, \"%-7s %s\\n\", \"blk\", \"cassette block data without framing\");\n\n    for (i = 0; i < fmt_count; i++) {\n\tSF_FORMAT_INFO sfi;\n\tsfi.format = i;\n\tsf_command(NULL, SFC_GET_FORMAT_MAJOR, &sfi, sizeof sfi);\n\tfprintf(f, \"%-7s %s\\n\", sfi.extension, sfi.name);\n    }\n}\n\n/* Pick the preferred subtype */\nstatic int refine_format(SF_INFO *sfinfo)\n{\n    static const int priorities[] = {\n\t[SF_FORMAT_DPCM_16] = 1,\n\t[SF_FORMAT_PCM_16]  = 2,\n\t[SF_FORMAT_DPCM_8]  = 3,\n\t[SF_FORMAT_PCM_S8]  = 4,\n\t[SF_FORMAT_PCM_U8]  = 5,\n\t[SF_FORMAT_ULAW]    = 6,\n\t[SF_FORMAT_ALAW]    = 7,\n\t[SF_FORMAT_PCM_24]  = 8,\n\t[SF_FORMAT_PCM_32]  = 9,\n\t[SF_FORMAT_FLOAT]   = 10,\n\t[SF_FORMAT_DOUBLE]  = 11\n    };\n    int fmt_count, i;\n    int best_format   = sfinfo->format;\n    int best_priority = INT_MAX;\n\n    if (sfinfo->format & SF_FORMAT_SUBMASK) {\n\tif (sf_format_check(sfinfo))\n\t    return 0;\t\t/* Already have a valid subtype */\n    }\n\n    sf_command(NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &fmt_count, sizeof fmt_count);\n\n    for (i = 0; i < fmt_count; i++) {\n\tSF_FORMAT_INFO sfi;\n\tint priority;\n\n\tsfi.format = i;\n\tsf_command(NULL, SFC_GET_FORMAT_SUBTYPE, &sfi, sizeof sfi);\n\tif (!sfi.format)\n\t    continue;\n\tsfinfo->format = (sfinfo->format & ~SF_FORMAT_SUBMASK) |\n\t    (sfi.format & SF_FORMAT_SUBMASK);\n\tif (!sf_format_check(sfinfo))\n\t    continue;\t\t/* Not supported for this major format */\n\n\tpriority = sfi.format + 100;\n\n\tif ((size_t)sfi.format < sizeof(priorities)/sizeof(priorities[0]) &&\n\t    priorities[sfi.format]) {\n\t    priority = priorities[sfi.format];\n\t}\n\n\tif (priority < best_priority) {\n\t    best_format   = sfinfo->format;\n\t    best_priority = priority;\n\t}\n    }\n\n    sfinfo->format = best_format;\n    return 0;\n}\n\n\nstatic int getformatarg(char ***argp)\n{\n    const char *arg = getstrarg(argp);\n    int fmt_count, i;\n\n    if (!strcmp(arg, \"cas\") || !strcmp(arg, \"bin\") || !strcmp(arg, \"binary\"))\n\treturn FORMAT_BINARY;\n\n    if (!strcmp(arg, \"blk\") || !strcmp(arg, \"block\") || !strcmp(arg, \"blocks\"))\n\treturn FORMAT_BLOCK;\n\n    sf_command(NULL, SFC_GET_FORMAT_MAJOR_COUNT, &fmt_count, sizeof fmt_count);\n\n    if (!arg[0] || !strcmp(arg, \"help\") || !strcmp(arg, \"list\")) {\n\tlist_formats(stdout);\n\texit(0);\n    }\n\n    for (i = 0; i < fmt_count; i++) {\n\tSF_FORMAT_INFO sfi;\n\tsfi.format = i;\n\tsf_command(NULL, SFC_GET_FORMAT_MAJOR, &sfi, sizeof sfi);\n\tif (!strcmp(arg, sfi.extension))\n\t    return sfi.format;\n    }\n\n    /* Not found, output list */\n    fprintf(stderr, \"%s: unknown output format: %s\\n\"\n\t    \"Known formats are:\\n\",\n\t    _progname, arg);\n    list_formats(stderr);\n    exit(1);\n}\n\n/*\n * Fudge the baud rate so it seems to match what ABC800 produces;\n * returns the divisor byte to be put in the header.\n */\nstatic unsigned int fudge_baudrate(unsigned int *baudrate)\n{\n\tunsigned int divisor;\n\n\tdivisor = DIV_ROUND(CAS_SIO_CLOCK, *baudrate);\n\t*baudrate = DIV_ROUND(CAS_SIO_CLOCK, divisor);\n\treturn divisor == CAS_DIVISOR_ABC80 ? 0 : divisor;\n}\n\nstatic void cas_format_block(struct cas_block_info *cbi)\n{\n    const uint8_t *csumptr;\n    uint16_t csum;\n    int i;\n\n    memset(cbi->blk.leadin, 0, sizeof cbi->blk.leadin);\n    memset(cbi->blk.leadout, 0, sizeof cbi->blk.leadout);\n    memset(cbi->blk.sync, 0x16, sizeof cbi->blk.sync);\n    cbi->blk.stx      = 0x02;\n    cbi->blk.blktype  = -(cbi->block_nr < 0);\n    cbi->blk.blkno[0] = cbi->block_nr;\n    cbi->blk.blkno[1] = cbi->block_nr >> 8;\n    cbi->blk.etx      = 0x03;\n\n    csumptr = &cbi->blk.blktype;\n    csum = 0;\n    for (i = 0; i < 257; i++)\n        csum += *csumptr++;\n\n    cbi->blk.csum[0] = csum;\n    cbi->blk.csum[1] = csum >> 8;\n}\n\nstatic void cas_format_header(struct cas_block_info *cbi)\n{\n    cbi->ms.parity   = -1;\n    cbi->ms.fraction =  0;\n    cbi->block_nr = -1;\n    memset(cbi->blk.data, 0, sizeof cbi->blk.data);\n    memcpy(cbi->blk.data, cbi->mangled_name, 11);\n\n    /* ABC800 puts a code for the divisor in the header */\n    cbi->blk.data[12]  = cbi->divisor;\n\n    /* ABC-klubben standard: block count encoded in the header */\n    cbi->blk.data[251] = cbi->data_blocks;\n    cbi->blk.data[252] = cbi->data_blocks >> 8;\n\n    cas_format_block(cbi);\n}\n\nstatic bool is_stdio(const char *filename)\n{\n    return !filename || !filename[0] || (filename[0] == '-' && !filename[1]);\n}\n\nstatic SNDFILE *create_sndfile(const char *filename, SF_INFO *sfinfo)\n{\n    SNDFILE *sf = NULL;\n    const char *errname;\n\n    errno = 0;\n\n    if (is_stdio(filename)) {\n\tfilename = NULL;\n\terrname = \"stdout\";\n    }\n\n    if (is_sndformat(sfinfo->format)) {\n\trefine_format(sfinfo);\n\tif (!sf_format_check(sfinfo)) {\n\t    fprintf(stderr, \"%s: %s: invalid parameters for data format\\n\",\n\t\t    _progname, errname);\n\t    exit(1);\n\t}\n\tif (!filename)\n\t    sf = sf_open_fd(fileno(stdout), SFM_WRITE, sfinfo, 0);\n\telse\n\t    sf = sf_open(filename, SFM_WRITE, sfinfo);\n    } else {\n\tif (!filename) {\n\t    sf = (SNDFILE *)stdout;\n\t} else {\n\t    sf = (SNDFILE *)fopen(filename, \"wb\");\n\t}\n    }\n\n    if (!sf) {\n\tfprintf(stderr, \"%s: %s: %s\\n\", _progname, errname,\n\t\tis_sndformat(sfinfo->format)\n\t\t? sf_strerror(NULL) : strerror(errno));\n\texit(1);\n    }\n\n    return sf;\n}\n\nstatic FILE *open_input(char *filename, unsigned char mangled[12])\n{\n    FILE *f;\n    char *outname = strrchr(filename, '\\0');\n\n    while (--outname >= filename) {\n\tif (*outname == '=') {\n\t    *outname++ = '\\0';\n\t} else if (*outname != '.' && !isalnum(*outname)) {\n\t    outname++;\n\t    break;\n\t} else if (outname == filename) {\n\t    break;\n\t}\n    }\n\n    if (is_stdio(filename))\n\tfilename = NULL;\n\n    if (!*outname) {\n\toutname = filename;\n\tif (!outname) {\n\t    outname = \"stdin\";\n\t}\n    }\n\n    if (mangle_name(mangled, outname)) {\n\tfprintf(stderr, \"%s: %s: invalid ABC output filename: %s\\n\",\n\t\t_progname, filename, outname);\n\texit(1);\n    }\n    if (is_stdio(filename))\n\tfilename = NULL;\n\n    if (!filename)\n\tf = stdin;\n    else\n\tf = fopen(filename, \"rb\");\n\n    if (!f) {\n\tfprintf(stderr, \"%s: %s: %s\\n\", _progname,\n\t\tfilename ? filename : \"stdin\", strerror(errno));\n\texit(1);\n    }\n\n    return f;\n}\n\nstatic int write_samples(SNDFILE *sf, SF_INFO *sfinfo, int64_t mdata,\n\t\t\t unsigned int count)\n{\n    int channels = sfinfo->channels;\n    int c;\n    double fdata;\n\n    assert(mdata >= -((int64_t)1 << 32) &&\n\t   mdata <=  ((int64_t)1 << 32));\n\n    fdata = ldexp(mdata, -32);\n    for (c = 0; c < channels; c++)\n\tfbuf[c] = fdata;\n\n    while (count--)\n\tif (sf_writef_double(sf, fbuf, 1) != 1)\n\t    return -1;\n\n    return 0;\n}\n\n/* Encode a block with FM modulation */\nstatic int modulate(SNDFILE *sf, SF_INFO *sfinfo, struct cas_block_info *cbi)\n{\n    const uint8_t *p = (const uint8_t *)&cbi->blk;\n    size_t bytes = sizeof cbi->blk;\n    uint64_t sle;\t\t/* samples/half bit * 2^32 */\n\n    sle = (((uint64_t)sfinfo->samplerate << 31) +\n\t   ((uint64_t)cbi->baudrate << 30))\n\t/ cbi->baudrate;\n\n    assert(sle >> 32);\n\n    while (bytes--) {\n\tint bits = 8;\n\tuint8_t d = *p++;\n\twhile (bits--) {\n\t    int h;\n\t    int bit = d & 1;\n\t    d >>= 1;\n\n\t    for (h = 1; h >= 0; h--) {\n\t\tint old_parity = cbi->ms.parity;\n\t\tuint32_t fraction = cbi->ms.fraction;\n\t\tuint32_t samples  = (sle + fraction) >> 32;\n\t\tint new_parity = (h | bit) ? -old_parity : old_parity;\n\t\tint64_t mdata;\n\n\t\tmdata = old_parity * (int64_t)fraction +\n\t\t  new_parity * (((int64_t)1 << 32) - fraction);\n\t\twrite_samples(sf, sfinfo, mdata, 1);\n\n\t\tmdata = (int64_t)new_parity << 32;\n\t\twrite_samples(sf, sfinfo, mdata, samples-1);\n\n\t\tcbi->ms.parity   = new_parity;\n\t\tcbi->ms.fraction = fraction + (uint32_t)sle;\n\t    }\n\t}\n    }\n\n    /* Anything left over, or silence */\n    write_samples(sf, sfinfo, (int64_t)cbi->ms.fraction * cbi->ms.parity, 1);\n\n    /* Post-block gap: 1.5 s after title block, 0.5 s after data blocks */\n    write_samples(sf, sfinfo, 0,\n\t\t  (((cbi->block_nr == -1) ? 3 : 1) * sfinfo->samplerate) >> 1);\n\n    return 0;\n}\n\n/* Encode or write a block */\nstatic bool encode_block(SNDFILE *sf, SF_INFO *sfinfo, struct cas_block_info *cbi)\n{\n    if (!is_sndformat(sfinfo->format)) {\n\tFILE *f = (FILE *)sf;\n\tsize_t bytes = 0;\n\tconst void *data = NULL;\n\n\tswitch (sfinfo->format) {\n\tcase FORMAT_BINARY:\n\t    data  = &cbi->blk;\n\t    bytes = sizeof cbi->blk;\n\t    break;\n\tcase FORMAT_BLOCK:\n\t    data  = &cbi->blk.blktype;\n\t    bytes = 256;\t/* blktype+blkno+data */\n\t    break;\n\tdefault:\n\t    break;\n\t}\n\tif (fwrite(data, 1, bytes, f) != bytes)\n\t\treturn true;\n\tif (sfinfo->format == FORMAT_BINARY) {\n\t    /* Post-block gap; encode as ones in lieu of silence */\n\t    unsigned int postgap = (((cbi->block_nr == -1) ? 3 : 1)\n\t\t\t\t    * cbi->baudrate) >> 4;\n\t    while (postgap--)\n\t\tfputc(0xff, f);\n\t}\n\tfflush(f);\n\treturn !!ferror(f);\n    } else {\n\treturn modulate(sf, sfinfo, cbi);\n    }\n}\n\nstatic void set_title(SNDFILE *sf, struct cas_block_info *cbi)\n{\n    char unmangled_name[128];\n\n    unmangle_filename(unmangled_name, cbi->mangled_name);\n    sf_set_string(sf, SF_STR_TITLE, unmangled_name);\n    sf_set_string(sf, SF_STR_COMMENT,\n\t\t  cbi->divisor ? \"ABC800 cassette data\" :\n\t\t  \"ABC80 cassette data\");\n}\n\nstatic int insert_silence(SNDFILE *sf, SF_INFO *sfinfo, int sec)\n{\n    return write_samples(sf, sfinfo, 0, sfinfo->samplerate * sec);\n}\n\nstatic int process_input_file(SNDFILE *sf, SF_INFO *sfinfo, char *filename,\n\t\t\t      unsigned int baudrate, bool first)\n{\n    FILE *in;\n    struct cas_block_info cbi;\n    int bytes, blocks;\n\n    memset(&cbi, 0, sizeof cbi);\n    in = open_input(filename, cbi.mangled_name);\n\n    cbi.filename = filename;\n    cbi.data = make_abcfile(in, &bytes); /* Also closes the input file */\n    cbi.data_blocks = blocks = bytes / 253;\n\n    if (is_sndformat(sfinfo->format)) {\n\tif (first) {\n\t    cbi.baudrate = baudrate;\n\t    cbi.divisor  = fudge_baudrate(&cbi.baudrate);\n\t    set_title(sf, &cbi);\n\t} else {\n\t    insert_silence(sf, sfinfo, 5);\n\t}\n    }\n\n    /* The header block is always encoded at ABC80 speed */\n    cbi.baudrate = CAS_BAUDRATE_ABC80;\n    cbi.divisor = fudge_baudrate(&cbi.baudrate);\n\n    cas_format_header(&cbi);\n    if (encode_block(sf, sfinfo, &cbi))\n\treturn -1;\n\n    /* Now we can switch to a higher speed */\n    cbi.baudrate = baudrate;\n    cbi.divisor  = fudge_baudrate(&cbi.baudrate);\n\n    while (blocks--) {\n\tcbi.block_nr++;\n\n\tmemcpy(cbi.blk.data, cbi.data + cbi.offset, 253);\n\tcas_format_block(&cbi);\n\tif (encode_block(sf, sfinfo, &cbi))\n\t    return -1;\n\n\tcbi.offset += 253;\n    }\n    return 0;\n}\n\nstatic void close_output(SNDFILE *sf, SF_INFO *sfinfo)\n{\n    if (is_sndformat(sfinfo->format)) {\n\tsf_close(sf);\n    } else if ((FILE *)sf != stdout) {\n\tfclose((FILE *)sf);\n    }\n}\n\nint main(int argc, char *argv[])\n{\n    SNDFILE *sf;\n    unsigned int baudrate = CAS_BAUDRATE_ABC80;\n    const char *outputfile = NULL;\n    char *inputfile;\n    const char *arg;\n    bool first;\n    char **argp = &argv[0];\n    SF_INFO sfinfo = {\n\t.samplerate = 11025,\n\t.channels   = 1,\n\t.format     = SF_FORMAT_WAV\n    };\n\n    (void)argc;\n\n    _progname = argv[0];\n\n    setlocale(LC_ALL, \"\");\n\n    while ((arg = *++argp) && arg[0] == '-' && arg[1]) {\n\tchar opt;\n\twhile ((opt = *++arg)) {\n\t    switch (opt) {\n\t    case 'f':\n\t\tsfinfo.format = getformatarg(&argp);\n\t\tbreak;\n\t    case 's':\n\t\tsfinfo.samplerate = getnumarg(&argp);\n\t\tbreak;\n\t    case 'c':\n\t\tsfinfo.channels = getnumarg(&argp);\n\t\tbreak;\n\t    case 'r':\n\t\tbaudrate = getnumarg(&argp);\n\t\tbreak;\n\t    case 'F':\n\t\tbaudrate = CAS_BAUDRATE_ABC800;\n\t\tbreak;\n\t    case 'S':\n\t\tbaudrate = CAS_BAUDRATE_ABC80;\n\t\tbreak;\n\t    case 'C':\n\t\tsfinfo.format = FORMAT_BINARY; /* Unencoded output */\n\t\tbreak;\n\t    case 'B':\n\t\tsfinfo.format = FORMAT_BLOCK; /* Block data output */\n\t\tbreak;\n\t    case 'v':\n\t\t/* Reserved for verbose output */\n\t\tbreak;\n\t    case 'V':\n\t\tversion();\n\t\texit(0);\n\t\tbreak;\n\t    case 'h':\n\t\tusage(0);\n\t\tbreak;\n\t    case 'q':\n\t\t/* Reserved for quiet output */\n\t\tbreak;\n\t    case 'o':\n\t\toutputfile = getstrarg(&argp);\n\t\tbreak;\n\t    default:\n\t\tfprintf(stderr, \"%s: unknown option: -%c\\n\", _progname, opt);\n\t\tusage(1);\n\t\tbreak;\n\t    }\n\t}\n    }\n\n    if (!*argp) {\n\tfprintf(stderr, \"%s: no input files!\\n\", _progname);\n\texit(1);\n    }\n\n    if (sfinfo.channels < 1 || sfinfo.channels > MAX_CHANNELS) {\n\tfprintf(stderr, \"%s: %s: invalid number of channels: %d\\n\",\n\t\t_progname, is_stdio(outputfile) ? \"stdout\" : outputfile,\n\t\tsfinfo.channels);\n\texit(1);\n    }\n    if (sfinfo.samplerate < (int)(4*baudrate)) {\n\tfprintf(stderr, \"%s: %s: sample rate %d too low for baud rate %u\\n\",\n\t\t_progname, is_stdio(outputfile) ? \"stdout\" : outputfile,\n\t\tsfinfo.samplerate, baudrate);\n\texit(1);\n    }\n\n    sf = create_sndfile(outputfile, &sfinfo);\n\n    first = true;\n    while ((inputfile = *argp++)) {\n\tprocess_input_file(sf, &sfinfo, inputfile, baudrate, first);\n\tfirst = false;\n    }\n\n    close_output(sf, &sfinfo);\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/clib/dirent.c",
    "content": "/*\n\n    Implementation of POSIX directory browsing functions and types for Win32.\n\n    Author:  Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com)\n    History: Created March 1997. Updated June 2003 and July 2012.\n    Rights:  See end of file.\n\n*/\n\n#include \"../abcdisk.h\"\n\n#ifndef HAVE_DIRENT_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\ntypedef intptr_t handle_type;\n\nstruct DIR\n{\n    handle_type         handle; /* -1 for failed rewind */\n    struct _finddata_t  info;\n    struct dirent       result; /* d_name null iff first time */\n    char                *name;  /* null-terminated char string */\n};\n\nDIR *opendir(const char *name)\n{\n    DIR *dir = 0;\n\n    if(name && name[0])\n    {\n        size_t base_length = strlen(name);\n        const char *all = /* search pattern must end with suitable wildcard */\n            strchr(\"/\\\\\", name[base_length - 1]) ? \"*\" : \"/*\";\n\n        if((dir = (DIR *) malloc(sizeof *dir)) != 0 &&\n           (dir->name = (char *) malloc(base_length + strlen(all) + 1)) != 0)\n        {\n            strcat(strcpy(dir->name, name), all);\n\n            if((dir->handle =\n                (handle_type) _findfirst(dir->name, &dir->info)) != -1)\n            {\n                dir->result.d_name = 0;\n            }\n            else /* rollback */\n            {\n                free(dir->name);\n                free(dir);\n                dir = 0;\n            }\n        }\n        else /* rollback */\n        {\n            free(dir);\n            dir   = 0;\n            errno = ENOMEM;\n        }\n    }\n    else\n    {\n        errno = EINVAL;\n    }\n\n    return dir;\n}\n\nint closedir(DIR *dir)\n{\n    int result = -1;\n\n    if(dir)\n    {\n        if(dir->handle != -1)\n        {\n            result = _findclose(dir->handle);\n        }\n\n        free(dir->name);\n        free(dir);\n    }\n\n    if(result == -1) /* map all errors to EBADF */\n    {\n        errno = EBADF;\n    }\n\n    return result;\n}\n\nstruct dirent *readdir(DIR *dir)\n{\n    struct dirent *result = 0;\n\n    if(dir && dir->handle != -1)\n    {\n        if(!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1)\n        {\n            result         = &dir->result;\n            result->d_name = dir->info.name;\n        }\n    }\n    else\n    {\n        errno = EBADF;\n    }\n\n    return result;\n}\n\nvoid rewinddir(DIR *dir)\n{\n    if(dir && dir->handle != -1)\n    {\n        _findclose(dir->handle);\n        dir->handle = (handle_type) _findfirst(dir->name, &dir->info);\n        dir->result.d_name = 0;\n    }\n    else\n    {\n        errno = EBADF;\n    }\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n/*\n\n    Copyright Kevlin Henney, 1997, 2003, 2012. All rights reserved.\n\n    Permission to use, copy, modify, and distribute this software and its\n    documentation for any purpose is hereby granted without fee, provided\n    that this copyright and permissions notice appear in all copies and\n    derivatives.\n    \n    This software is supplied \"as is\" without express or implied warranty.\n\n    But that said, if there are any problems please get in touch.\n\n*/\n#endif /* HAVE_DIRENT_H */\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/clib/dirent.h",
    "content": "#ifndef DIRENT_INCLUDED\n#define DIRENT_INCLUDED\n\n/*\n\n    Declaration of POSIX directory browsing functions and types for Win32.\n\n    Author:  Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com)\n    History: Created March 1997. Updated June 2003.\n    Rights:  See end of file.\n    \n*/\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\ntypedef struct DIR DIR;\n\nstruct dirent\n{\n    char *d_name;\n};\n\nDIR           *opendir(const char *);\nint           closedir(DIR *);\nstruct dirent *readdir(DIR *);\nvoid          rewinddir(DIR *);\n\n/*\n\n    Copyright Kevlin Henney, 1997, 2003. All rights reserved.\n\n    Permission to use, copy, modify, and distribute this software and its\n    documentation for any purpose is hereby granted without fee, provided\n    that this copyright and permissions notice appear in all copies and\n    derivatives.\n    \n    This software is supplied \"as is\" without express or implied warranty.\n\n    But that said, if there are any problems please get in touch.\n\n*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/compiler.h",
    "content": "/*\n * Common definitions that we need for everything\n */\n\n#ifndef COMPILER_H\n#define COMPILER_H\n\n//#ifdef HAVE_CONFIG_H\n# include \"config/config.h\"\n//#else\n//# error \"Need compiler-specific hacks here\"\n//#endif\n\n/* On Microsoft platforms we support multibyte character sets in filenames */\n#define _MBCS 1\n\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#else\n# include \"clib/inttypes.h\"\t/* Ersatz header file */\n#endif\n\n/* These header files should pretty much always be included... */\n#include <assert.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <limits.h>\n#include <string.h>\n#include <errno.h>\n#include <time.h>\n#include <locale.h>\n#include <wchar.h>\n\n#ifdef HAVE_FCNTL_H\n# include <fcntl.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n\n#ifdef HAVE_IO_H\n# include <io.h>\n#endif\n#ifdef HAVE_WINDOWS_H\n# include <windows.h>\n#endif\n#ifdef HAVE_DIRECT_H\n# include <direct.h>\n#endif\n\n#ifdef HAVE_DIRENT_H\n# include <dirent.h>\n#else\n# include \"clib/dirent.h\"\n#endif\n\n#ifndef __cplusplus\t\t/* C++ has false, true, bool as keywords */\n# ifdef HAVE_STDBOOL_H\n#  include <stdbool.h>\n# else\n/* This is sort of dangerous, since casts will behave different than\n   casting to the standard boolean type.  Always use !!, not (bool). */\n//typedef enum bool { false, true } bool;\n# endif\n#endif\n\n/*\n * Endianness, if we can get this from the compiler.  It's better\n * than relying on autoconf, if we can, because of \"fat binaries\".\n */\n#ifdef __BYTE_ORDER__\n# undef WORDS_LITTLEENDIAN\n# undef WORDS_BIGENDIAN\n# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n#  define WORDS_LITTLEENDIAN 1\n# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n#  define WORDS_BIGENDIAN 1\n# endif\n#elif defined(__i386__) || defined(__386__) || \\\n  defined(__x86_64__) || defined(__amd64__)\n/* It's an x86, so we know it's littleendian */\n# undef WORDS_LITTLEENDIAN\n# undef WORDS_BIGENDIAN\n# define WORDS_LITTLEENDIAN 1\n#endif\n\n/*\n * mempcpy() replacement\n */\n#ifndef HAVE_MEMPCPY\nstatic inline void *mempcpy(void *dest, const void *src, size_t n)\n{\n    memcpy(dest, src, n);\n    return (char *)dest + n;\n}\n#endif\n\n/*\n * asprintf()\n */\n#ifndef HAVE_ASPRINTF\nextern int asprintf(char **, const char *, ...);\n#endif\n\n/*\n * mode_t\n */\n#ifndef HAVE_MODE_T\ntypedef int mode_t;\n#endif\n\n/*\n * Hack to support external-linkage inline functions\n */\n#ifndef HAVE_STDC_INLINE\n# ifdef __GNUC__\n#  ifdef __GNUC_STDC_INLINE__\n#   define HAVE_STDC_INLINE\n#  else\n#   define HAVE_GNU_INLINE\n#  endif\n# elif defined(__GNUC_GNU_INLINE__)\n/* Some other compiler implementing only GNU inline semantics? */\n#   define HAVE_GNU_INLINE\n# elif defined(__STDC_VERSION__)\n#  if __STDC_VERSION__ >= 199901L\n#   define HAVE_STDC_INLINE\n#  endif\n# endif\n#endif\n\n#ifdef HAVE_STDC_INLINE\n# define extern_inline inline\n#elif defined(HAVE_GNU_INLINE)\n# define extern_inline extern inline\n# define inline_prototypes\n#else\n# define inline_prototypes\n#endif\n\n/*\n * Hints to the compiler that a particular branch of code is more or\n * less likely to be taken.\n */\n#if HAVE___BUILTIN_EXPECT\n# define likely(x)\t__builtin_expect(!!(x), 1)\n# define unlikely(x)\t__builtin_expect(!!(x), 0)\n#else\n# define likely(x)\t(!!(x))\n# define unlikely(x)\t(!!(x))\n#endif\n\n/*\n * How to tell the compiler that a function doesn't return\n */\n#ifdef HAVE_STDNORETURN_H\n# include <stdnoreturn.h>\n# define no_return noreturn void\n#elif defined(HAVE_FUNC_ATTRIBUTE_NORETURN)\n# define no_return void __attribute__((noreturn))\n#elif defined(_MSC_VER)\n# define no_return __declspec(noreturn) void\n#else\n# define no_return void\n#endif\n\n/*\n * How to tell the compiler that a function is pure arithmetic\n */\n#ifdef HAVE_FUNC_ATTRIBUTE_CONST\n# define const_func __attribute__((const))\n#else\n# define const_func\n#endif\n\n/*\n * This function has no side effects, but depends on its arguments,\n * memory pointed to by its arguments, or global variables.\n * NOTE: functions that return a value by modifying memory pointed to\n * by a pointer argument are *NOT* considered pure.\n */\n#ifdef HAVE_FUNC_ATTRIBUTE_PURE\n# define pure_func __attribute__((pure))\n#else\n# define pure_func\n#endif\n\n/* Determine probabilistically if something is a compile-time constant */\n#ifdef HAVE___BUILTIN_CONSTANT_P\n# define is_constant(x) __builtin_constant_p(x)\n#else\n# define is_constant(x) false\n#endif\n\n/* Provide a substitute for offsetof() if we don't have one.  This\n   variant works on most (but not *all*) systems... */\n#ifndef offsetof\n# define offsetof(t,m) ((size_t)&(((t *)0)->m))\n#endif\n\n/* The container_of construct: if p is a pointer to member m of\n   container class c, then return a pointer to the container of which\n   *p is a member. */\n#ifndef container_of\n# define container_of(p, c, m) ((c *)((char *)(p) - offsetof(c,m)))\n#endif\n\n/*\n * Hints about malloc-like functions that never return NULL\n */\n#ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL\n# define never_null __attribute__((returns_nonnull))\n#else\n# define never_null\n#endif\n\n#ifdef HAVE_FUNC_ATTRIBUTE_MALLOC\n# define safe_alloc never_null __attribute__((malloc))\n#else\n# define safe_alloc never_null\n#endif\n\n#ifdef HAVE_FUNC_ATTRIBUTE_ALLOC_SIZE\n# define safe_malloc(s) safe_alloc __attribute__((alloc_size(s)))\n# define safe_malloc2(s1,s2) safe_alloc __attribute__((alloc_size(s1,s2)))\n# define safe_realloc(s) never_null __attribute__((alloc_size(s)))\n#else\n# define safe_malloc(s) safe_alloc\n# define safe_malloc2(s1,s2) safe_alloc\n# define safe_realloc(s) never_null\n#endif\n\n#ifdef HAVE_FUNC_ATTRIBUTE_SENTINEL\n# define end_with_null __attribute__((sentinel))\n#else\n# define end_with_null\n#endif\n\n/* Useful construct */\n#define ARRAY_SIZE(x) ((sizeof x)/(sizeof *(x)))\n\n#endif /* COMPILER_H */\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/config/config.h.in",
    "content": "/* config/config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Define if building universal (internal helper macro) */\n#undef AC_APPLE_UNIVERSAL_BUILD\n\n/* Define to 1 if compiled with the `-fdata-sections' compiler flag */\n#undef CFLAGS_FDATA_SECTIONS\n\n/* Define to 1 if compiled with the `-ffast-math' compiler flag */\n#undef CFLAGS_FFAST_MATH\n\n/* Define to 1 if compiled with the `-ffunction-sections' compiler flag */\n#undef CFLAGS_FFUNCTION_SECTIONS\n\n/* Define to 1 if compiled with the `-fgnu89-inline' compiler flag */\n#undef CFLAGS_FGNU89_INLINE\n\n/* Define to 1 if compiled with the `-flto' compiler flag */\n#undef CFLAGS_FLTO\n\n/* Define to 1 if compiled with the `-fno-common' compiler flag */\n#undef CFLAGS_FNO_COMMON\n\n/* Define to 1 if compiled with the `-fno-omit-frame-pointer' compiler flag */\n#undef CFLAGS_FNO_OMIT_FRAME_POINTER\n\n/* Define to 1 if compiled with the `-fsanitize=address' compiler flag */\n#undef CFLAGS_FSANITIZE_ADDRESS\n\n/* Define to 1 if compiled with the `-fsanitize=undefined' compiler flag */\n#undef CFLAGS_FSANITIZE_UNDEFINED\n\n/* Define to 1 if compiled with the `-fstack-protector' compiler flag */\n#undef CFLAGS_FSTACK_PROTECTOR\n\n/* Define to 1 if compiled with the `-fvisibility=hidden' compiler flag */\n#undef CFLAGS_FVISIBILITY_HIDDEN\n\n/* Define to 1 if compiled with the `-fwrapv' compiler flag */\n#undef CFLAGS_FWRAPV\n\n/* Define to 1 if compiled with the `-Wl,--gc-sections' compiler flag */\n#undef CFLAGS_WL_GC_SECTIONS\n\n/* Define to 1 if compiled with the `-I\"$f\"' compiler flag */\n#undef CPPFLAGS_I_F\n\n/* Define to 1 if compiled with the `-pedantic' compiler flag */\n#undef CPPFLAGS_PEDANTIC\n\n/* Define to 1 if compiled with the `-U__STRICT_ANSI__' compiler flag */\n#undef CPPFLAGS_U_STRICT_ANSI\n\n/* Define to 1 if compiled with the `-W' compiler flag */\n#undef CPPFLAGS_W\n\n/* Define to 1 if compiled with the `-Wall' compiler flag */\n#undef CPPFLAGS_WALL\n\n/* Define to 1 if compiled with the `-Werror' compiler flag */\n#undef CPPFLAGS_WERROR\n\n/* Define to 1 if compiled with the `-Werror=attributes' compiler flag */\n#undef CPPFLAGS_WERROR_ATTRIBUTES\n\n/* Define to 1 if compiled with the `-Werror=comment' compiler flag */\n#undef CPPFLAGS_WERROR_COMMENT\n\n/* Define to 1 if compiled with the `-Werror=implicit' compiler flag */\n#undef CPPFLAGS_WERROR_IMPLICIT\n\n/* Define to 1 if compiled with the `-Werror=missing-braces' compiler flag */\n#undef CPPFLAGS_WERROR_MISSING_BRACES\n\n/* Define to 1 if compiled with the `-Werror=missing-declarations' compiler\n   flag */\n#undef CPPFLAGS_WERROR_MISSING_DECLARATIONS\n\n/* Define to 1 if compiled with the `-Werror=missing-prototypes' compiler flag\n   */\n#undef CPPFLAGS_WERROR_MISSING_PROTOTYPES\n\n/* Define to 1 if compiled with the `-Werror=pointer-arith' compiler flag */\n#undef CPPFLAGS_WERROR_POINTER_ARITH\n\n/* Define to 1 if compiled with the `-Werror=return-type' compiler flag */\n#undef CPPFLAGS_WERROR_RETURN_TYPE\n\n/* Define to 1 if compiled with the `-Werror=strict-prototypes' compiler flag\n   */\n#undef CPPFLAGS_WERROR_STRICT_PROTOTYPES\n\n/* Define to 1 if compiled with the `-Werror=trigraphs' compiler flag */\n#undef CPPFLAGS_WERROR_TRIGRAPHS\n\n/* Define to 1 if compiled with the `-Werror=unknown-warning-option' compiler\n   flag */\n#undef CPPFLAGS_WERROR_UNKNOWN_WARNING_OPTION\n\n/* Define to 1 if compiled with the `-Werror=vla' compiler flag */\n#undef CPPFLAGS_WERROR_VLA\n\n/* Define to 1 if compiled with the `-Wpedantic-ms-format' compiler flag */\n#undef CPPFLAGS_WPEDANTIC_MS_FORMAT\n\n/* Define to 1 if compiled with the `-Wstringop-truncation' compiler flag */\n#undef CPPFLAGS_WSTRINGOP_TRUNCATION\n\n/* Define to 1 if you have the <direct.h> header file. */\n#undef HAVE_DIRECT_H\n\n/* Define to 1 if you have the <dirent.h> header file. */\n#undef HAVE_DIRENT_H\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#undef HAVE_FCNTL_H\n\n/* Define to 1 if you have the `fstat' function. */\n#undef HAVE_FSTAT\n\n/* Define to 1 if your compiler supports __attribute__((alloc_size)) on\n   functions */\n#undef HAVE_FUNC_ATTRIBUTE1_ALLOC_SIZE\n\n/* Define to 1 if your compiler supports __attribute__((format)) on functions\n   */\n#undef HAVE_FUNC_ATTRIBUTE1_FORMAT\n\n/* Define to 1 if your compiler supports __attribute__((cold)) on functions */\n#undef HAVE_FUNC_ATTRIBUTE_COLD\n\n/* Define to 1 if your compiler supports __attribute__((const)) on functions\n   */\n#undef HAVE_FUNC_ATTRIBUTE_CONST\n\n/* Define to 1 if your compiler supports __attribute__((error)) on functions\n   */\n#undef HAVE_FUNC_ATTRIBUTE_ERROR\n\n/* Define to 1 if your compiler supports __attribute__((malloc)) on functions\n   */\n#undef HAVE_FUNC_ATTRIBUTE_MALLOC\n\n/* Define to 1 if your compiler supports __attribute__((noreturn)) on\n   functions */\n#undef HAVE_FUNC_ATTRIBUTE_NORETURN\n\n/* Define to 1 if your compiler supports __attribute__((pure)) on functions */\n#undef HAVE_FUNC_ATTRIBUTE_PURE\n\n/* Define to 1 if your compiler supports __attribute__((returns_nonnull)) on\n   functions */\n#undef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL\n\n/* Define to 1 if your compiler supports __attribute__((sentinel)) on\n   functions */\n#undef HAVE_FUNC_ATTRIBUTE_SENTINEL\n\n/* Define to 1 if your compiler supports __attribute__((alloc_size)) on\n   function pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE1_ALLOC_SIZE\n\n/* Define to 1 if your compiler supports __attribute__((format)) on function\n   pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE1_FORMAT\n\n/* Define to 1 if your compiler supports __attribute__((cold)) on function\n   pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE_COLD\n\n/* Define to 1 if your compiler supports __attribute__((const)) on function\n   pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE_CONST\n\n/* Define to 1 if your compiler supports __attribute__((malloc)) on function\n   pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE_MALLOC\n\n/* Define to 1 if your compiler supports __attribute__((noreturn)) on function\n   pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE_NORETURN\n\n/* Define to 1 if your compiler supports __attribute__((pure)) on function\n   pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE_PURE\n\n/* Define to 1 if your compiler supports __attribute__((returns_nonnull)) on\n   function pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE_RETURNS_NONNULL\n\n/* Define to 1 if your compiler supports __attribute__((sentinel)) on function\n   pointers */\n#undef HAVE_FUNC_PTR_ATTRIBUTE_SENTINEL\n\n/* Define to 1 if you have the <intrin.h> header file. */\n#undef HAVE_INTRIN_H\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the <io.h> header file. */\n#undef HAVE_IO_H\n\n/* Define to 1 if you have the `mempcpy' function. */\n#undef HAVE_MEMPCPY\n\n/* Define to 1 if you have the <minix/config.h> header file. */\n#undef HAVE_MINIX_CONFIG_H\n\n/* Define to 1 if the system has the type `mode_t'. */\n#undef HAVE_MODE_T\n\n/* Define to 1 if you have the `stat' function. */\n#undef HAVE_STAT\n\n/* Define to 1 if stdbool.h conforms to C99. */\n#undef HAVE_STDBOOL_H\n\n/* Define to 1 if your compiler supports C99 extern inline */\n#undef HAVE_STDC_INLINE\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdio.h> header file. */\n#undef HAVE_STDIO_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <stdnoreturn.h> header file. */\n#undef HAVE_STDNORETURN_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if the system has the type `struct stat'. */\n#undef HAVE_STRUCT_STAT\n\n/* Define to 1 if the system has the type `struct _stat64'. */\n#undef HAVE_STRUCT__STAT64\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#undef HAVE_SYS_TIME_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to 1 if you have the <wchar.h> header file. */\n#undef HAVE_WCHAR_H\n\n/* Define to 1 if you have the <windows.h> header file. */\n#undef HAVE_WINDOWS_H\n\n/* Define to 1 if the system has the type `_Bool'. */\n#undef HAVE__BOOL\n\n/* Define to 1 if you have the `_findfirst' function. */\n#undef HAVE__FINDFIRST\n\n/* Define to 1 if you have the `_findfirst64' function. */\n#undef HAVE__FINDFIRST64\n\n/* Define to 1 if you have the `_fstat64' function. */\n#undef HAVE__FSTAT64\n\n/* Define to 1 if you have the `_mkdir' function. */\n#undef HAVE__MKDIR\n\n/* Define to 1 if you have the `_stat64' function. */\n#undef HAVE__STAT64\n\n/* Define to 1 if you have the `__builtin_constant_p' intrinsic function. */\n#undef HAVE___BUILTIN_CONSTANT_P\n\n/* Define to 1 if you have the `__builtin_expect' intrinsic function. */\n#undef HAVE___BUILTIN_EXPECT\n\n/* Define to 1 if compiled with the `-L\"$f\"' compiler flag */\n#undef LDFLAGS_L_F\n\n/* Define to 1 if compiled with the `-Wl,--as-needed' compiler flag */\n#undef LDFLAGS_WL_AS_NEEDED\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* Define to 1 if all of the C90 standard headers exist (not just the ones\n   required in a freestanding environment). This macro is provided for\n   backward compatibility; new code need not use it. */\n#undef STDC_HEADERS\n\n/* Enable extensions on AIX 3, Interix.  */\n#ifndef _ALL_SOURCE\n# undef _ALL_SOURCE\n#endif\n/* Enable general extensions on macOS.  */\n#ifndef _DARWIN_C_SOURCE\n# undef _DARWIN_C_SOURCE\n#endif\n/* Enable general extensions on Solaris.  */\n#ifndef __EXTENSIONS__\n# undef __EXTENSIONS__\n#endif\n/* Enable GNU extensions on systems that have them.  */\n#ifndef _GNU_SOURCE\n# undef _GNU_SOURCE\n#endif\n/* Enable X/Open compliant socket functions that do not require linking\n   with -lxnet on HP-UX 11.11.  */\n#ifndef _HPUX_ALT_XOPEN_SOCKET_API\n# undef _HPUX_ALT_XOPEN_SOCKET_API\n#endif\n/* Identify the host operating system as Minix.\n   This macro does not affect the system headers' behavior.\n   A future release of Autoconf may stop defining this macro.  */\n#ifndef _MINIX\n# undef _MINIX\n#endif\n/* Enable general extensions on NetBSD.\n   Enable NetBSD compatibility extensions on Minix.  */\n#ifndef _NETBSD_SOURCE\n# undef _NETBSD_SOURCE\n#endif\n/* Enable OpenBSD compatibility extensions on NetBSD.\n   Oddly enough, this does nothing on OpenBSD.  */\n#ifndef _OPENBSD_SOURCE\n# undef _OPENBSD_SOURCE\n#endif\n/* Define to 1 if needed for POSIX-compatible behavior.  */\n#ifndef _POSIX_SOURCE\n# undef _POSIX_SOURCE\n#endif\n/* Define to 2 if needed for POSIX-compatible behavior.  */\n#ifndef _POSIX_1_SOURCE\n# undef _POSIX_1_SOURCE\n#endif\n/* Enable POSIX-compatible threading on Solaris.  */\n#ifndef _POSIX_PTHREAD_SEMANTICS\n# undef _POSIX_PTHREAD_SEMANTICS\n#endif\n/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */\n#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__\n# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__\n#endif\n/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */\n#ifndef __STDC_WANT_IEC_60559_BFP_EXT__\n# undef __STDC_WANT_IEC_60559_BFP_EXT__\n#endif\n/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */\n#ifndef __STDC_WANT_IEC_60559_DFP_EXT__\n# undef __STDC_WANT_IEC_60559_DFP_EXT__\n#endif\n/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */\n#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__\n# undef __STDC_WANT_IEC_60559_FUNCS_EXT__\n#endif\n/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */\n#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__\n# undef __STDC_WANT_IEC_60559_TYPES_EXT__\n#endif\n/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */\n#ifndef __STDC_WANT_LIB_EXT2__\n# undef __STDC_WANT_LIB_EXT2__\n#endif\n/* Enable extensions specified by ISO/IEC 24747:2009.  */\n#ifndef __STDC_WANT_MATH_SPEC_FUNCS__\n# undef __STDC_WANT_MATH_SPEC_FUNCS__\n#endif\n/* Enable extensions on HP NonStop.  */\n#ifndef _TANDEM_SOURCE\n# undef _TANDEM_SOURCE\n#endif\n/* Enable X/Open extensions.  Define to 500 only if necessary\n   to make mbstate_t available.  */\n#ifndef _XOPEN_SOURCE\n# undef _XOPEN_SOURCE\n#endif\n\n\n/* Define to 1 if your processor stores words with the most significant byte\n   first (like Motorola and SPARC, unlike Intel and VAX). */\n#undef WORDS_BIGENDIAN\n\n/* Define to 1 if your processor stores words with the least significant byte\n   first (like Intel and VAX, unlike Motorola and SPARC). */\n#undef WORDS_LITTLEENDIAN\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n#undef inline\n#endif\n\n/* Define to the equivalent of the C99 'restrict' keyword, or to\n   nothing if this is not supported.  Do not define if restrict is\n   supported only directly.  */\n#undef restrict\n/* Work around a bug in older versions of Sun C++, which did not\n   #define __restrict__ or support _Restrict or __restrict__\n   even though the corresponding Sun C compiler ended up with\n   \"#define restrict _Restrict\" or \"#define restrict __restrict__\"\n   in the previous line.  This workaround can be removed once\n   we assume Oracle Developer Studio 12.5 (2016) or later.  */\n#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__\n# define _Restrict\n# define __restrict__\n#endif\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n#undef size_t\n\n#ifndef noreturn_func\n# ifdef HAVE_FUNC_ATTRIBUTE_NORETURN\n#  define noreturn_func __attribute__((noreturn))\n# else\n#  define noreturn_func\n# endif\n#endif\n\n#ifndef sentinel_func_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE_SENTINEL\n#  define sentinel_func_ptr __attribute__((sentinel))\n# else\n#  define sentinel_func_ptr\n# endif\n#endif\n\n#ifndef format_func1\n# ifdef HAVE_FUNC_ATTRIBUTE1_FORMAT\n#  define format_func1(x1) __attribute__((format(x1)))\n# else\n#  define format_func1(x1)\n# endif\n#endif\n\n#ifndef format_func1_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE1_FORMAT\n#  define format_func1_ptr(x1) __attribute__((format(x1)))\n# else\n#  define format_func1_ptr(x1)\n# endif\n#endif\n\n#ifndef const_func\n# ifdef HAVE_FUNC_ATTRIBUTE_CONST\n#  define const_func __attribute__((const))\n# else\n#  define const_func\n# endif\n#endif\n\n#ifndef const_func_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE_CONST\n#  define const_func_ptr __attribute__((const))\n# else\n#  define const_func_ptr\n# endif\n#endif\n\n#ifndef pure_func\n# ifdef HAVE_FUNC_ATTRIBUTE_PURE\n#  define pure_func __attribute__((pure))\n# else\n#  define pure_func\n# endif\n#endif\n\n#ifndef pure_func_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE_PURE\n#  define pure_func_ptr __attribute__((pure))\n# else\n#  define pure_func_ptr\n# endif\n#endif\n\n#ifndef cold_func\n# ifdef HAVE_FUNC_ATTRIBUTE_COLD\n#  define cold_func __attribute__((cold))\n# else\n#  define cold_func\n# endif\n#endif\n\n#ifndef cold_func_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE_COLD\n#  define cold_func_ptr __attribute__((cold))\n# else\n#  define cold_func_ptr\n# endif\n#endif\n\n#ifndef noreturn_func_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE_NORETURN\n#  define noreturn_func_ptr __attribute__((noreturn))\n# else\n#  define noreturn_func_ptr\n# endif\n#endif\n\n#ifndef returns_nonnull_func\n# ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL\n#  define returns_nonnull_func __attribute__((returns_nonnull))\n# else\n#  define returns_nonnull_func\n# endif\n#endif\n\n#ifndef returns_nonnull_func_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE_RETURNS_NONNULL\n#  define returns_nonnull_func_ptr __attribute__((returns_nonnull))\n# else\n#  define returns_nonnull_func_ptr\n# endif\n#endif\n\n#ifndef malloc_func\n# ifdef HAVE_FUNC_ATTRIBUTE_MALLOC\n#  define malloc_func __attribute__((malloc))\n# else\n#  define malloc_func\n# endif\n#endif\n\n#ifndef malloc_func_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE_MALLOC\n#  define malloc_func_ptr __attribute__((malloc))\n# else\n#  define malloc_func_ptr\n# endif\n#endif\n\n#ifndef alloc_size_func1\n# ifdef HAVE_FUNC_ATTRIBUTE1_ALLOC_SIZE\n#  define alloc_size_func1(x1) __attribute__((alloc_size(x1)))\n# else\n#  define alloc_size_func1(x1)\n# endif\n#endif\n\n#ifndef alloc_size_func1_ptr\n# ifdef HAVE_FUNC_PTR_ATTRIBUTE1_ALLOC_SIZE\n#  define alloc_size_func1_ptr(x1) __attribute__((alloc_size(x1)))\n# else\n#  define alloc_size_func1_ptr(x1)\n# endif\n#endif\n\n#ifndef sentinel_func\n# ifdef HAVE_FUNC_ATTRIBUTE_SENTINEL\n#  define sentinel_func __attribute__((sentinel))\n# else\n#  define sentinel_func\n# endif\n#endif\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.71.\n#\n#\n# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,\n# Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nas_nop=:\nif test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1\nthen :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse $as_nop\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\n\n# Reset variables that may have inherited troublesome values from\n# the environment.\n\n# IFS needs to be set, to space, tab, and newline, in precisely that order.\n# (If _AS_PATH_WALK were called with IFS unset, it would have the\n# side effect of setting IFS to empty, thus disabling word splitting.)\n# Quoting is to prevent editors from complaining about space-tab.\nas_nl='\n'\nexport as_nl\nIFS=\" \"\"\t$as_nl\"\n\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# Ensure predictable behavior from utilities with locale-dependent output.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# We cannot yet rely on \"unset\" to work, but we need these variables\n# to be unset--not just set to an empty or harmless value--now, to\n# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct\n# also avoids known problems related to \"unset\" and subshell syntax\n# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).\nfor as_var in BASH_ENV ENV MAIL MAILPATH CDPATH\ndo eval test \\${$as_var+y} \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\n\n# Ensure that fds 0, 1, and 2 are open.\nif (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi\nif (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi\nif (exec 3>&2)            ; then :; else exec 2>/dev/null; fi\n\n# The user is always right.\nif ${PATH_SEPARATOR+false} :; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    test -r \"$as_dir$0\" && as_myself=$as_dir$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  printf \"%s\\n\" \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n\n# Use a proper internal environment variable to ensure we don't fall\n  # into an infinite loop, continuously re-executing ourselves.\n  if test x\"${_as_can_reexec}\" != xno && test \"x$CONFIG_SHELL\" != x; then\n    _as_can_reexec=no; export _as_can_reexec;\n    # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\nprintf \"%s\\n\" \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\n  fi\n  # We don't want this to propagate to other subprocesses.\n          { _as_can_reexec=; unset _as_can_reexec;}\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"as_nop=:\nif test \\${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1\nthen :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse \\$as_nop\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" )\nthen :\n\nelse \\$as_nop\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\nblah=\\$(echo \\$(echo blah))\ntest x\\\"\\$blah\\\" = xblah || exit 1\ntest -x / || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null\nthen :\n  as_have_required=yes\nelse $as_nop\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null\nthen :\n\nelse $as_nop\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    as_run=a \"$as_shell\" -c \"$as_bourne_compatible\"\"$as_required\" 2>/dev/null\nthen :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if as_run=a \"$as_shell\" -c \"$as_bourne_compatible\"\"$as_suggested\" 2>/dev/null\nthen :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\nIFS=$as_save_IFS\nif $as_found\nthen :\n\nelse $as_nop\n  if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      as_run=a \"$SHELL\" -c \"$as_bourne_compatible\"\"$as_required\" 2>/dev/null\nthen :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi\nfi\n\n\n      if test \"x$CONFIG_SHELL\" != x\nthen :\n  export CONFIG_SHELL\n             # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\nprintf \"%s\\n\" \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\nfi\n\n    if test x$as_have_required = xno\nthen :\n  printf \"%s\\n\" \"$0: This script requires a shell more modern than all\"\n  printf \"%s\\n\" \"$0: the shells that I found on your system.\"\n  if test ${ZSH_VERSION+y} ; then\n    printf \"%s\\n\" \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    printf \"%s\\n\" \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    printf \"%s\\n\" \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n# as_fn_nop\n# ---------\n# Do nothing but, unlike \":\", preserve the value of $?.\nas_fn_nop ()\n{\n  return $?\n}\nas_nop=as_fn_nop\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`printf \"%s\\n\" \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null\nthen :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse $as_nop\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null\nthen :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse $as_nop\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n# as_fn_nop\n# ---------\n# Do nothing but, unlike \":\", preserve the value of $?.\nas_fn_nop ()\n{\n  return $?\n}\nas_nop=as_fn_nop\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  printf \"%s\\n\" \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { printf \"%s\\n\" \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have\n  # already done that, so ensure we don't try to do so again and fall\n  # in an infinite loop.  This has already happened in practice.\n  _as_can_reexec=no; export _as_can_reexec\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\n\n# Determine whether it's possible to make 'echo' print without a newline.\n# These variables are no longer used directly by Autoconf, but are AC_SUBSTed\n# for compatibility with existing Makefiles.\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\n# For backward compatibility with old third-party macros, we provide\n# the shell variables $as_echo and $as_echo_n.  New code should use\n# AS_ECHO([\"message\"]) and AS_ECHO_N([\"message\"]), respectively.\nas_echo='printf %s\\n'\nas_echo_n='printf %s'\n\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME=''\nPACKAGE_TARNAME=''\nPACKAGE_VERSION=''\nPACKAGE_STRING=''\nPACKAGE_BUGREPORT=''\nPACKAGE_URL=''\n\nac_unique_file=\"abcwrite.c\"\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stddef.h>\n#ifdef HAVE_STDIO_H\n# include <stdio.h>\n#endif\n#ifdef HAVE_STDLIB_H\n# include <stdlib.h>\n#endif\n#ifdef HAVE_STRING_H\n# include <string.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_header_c_list=\nac_subst_vars='LTLIBOBJS\nLIBOBJS\nCC_RANLIB\nCC_AR\nZ80ASM\nMKDIR_P\nEXTRA_PROGS\nEGREP\nGREP\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\nSET_MAKE\nLN_S\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\nac_prefix_program\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nrunstatedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nwith_libsndfile\nwith_z80asm\nwith_z88dk\nenable_sections\nenable_lto\nenable_sanitizer\nenable_werror\nenable_ccache\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nrunstatedir='${localstatedir}/run'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: \\`$ac_useropt'\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`printf \"%s\\n\" \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: \\`$ac_useropt'\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`printf \"%s\\n\" \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -runstatedir | --runstatedir | --runstatedi | --runstated \\\n  | --runstate | --runstat | --runsta | --runst | --runs \\\n  | --run | --ru | --r)\n    ac_prev=runstatedir ;;\n  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \\\n  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \\\n  | --run=* | --ru=* | --r=*)\n    runstatedir=$ac_optarg ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: \\`$ac_useropt'\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`printf \"%s\\n\" \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: \\`$ac_useropt'\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`printf \"%s\\n\" \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    printf \"%s\\n\" \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      printf \"%s\\n\" \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     printf \"%s\\n\" \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir runstatedir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures this package to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-sections       compile with function/data section support\n  --enable-lto            compile with gcc-style link time optimization\n  --enable-sanitizer      compile with sanitizers enabled\n  --enable-werror         compile with -Werror to error out on any warning\n  --enable-ccache         compile with ccache\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-libsndfile=dir   location of libsndfile install\n  --with-z80asm=name      name of z88dk z80asm assembler with --reloc-info\n                          support\n  --with-z88dk=path       path to z88dk executables (used for z80asm)\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`printf \"%s\\n\" \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`printf \"%s\\n\" \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for configure.gnu first; this name is used for a wrapper for\n    # Metaconfig's \"Configure\" on case-insensitive file systems.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      printf \"%s\\n\" \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nconfigure\ngenerated by GNU Autoconf 2.71\n\nCopyright (C) 2021 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest.beam\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext\nthen :\n  ac_retval=0\nelse $as_nop\n  printf \"%s\\n\" \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\nprintf %s \"checking for $2... \" >&6; }\nif eval test \\${$3+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  eval \"$3=yes\"\nelse $as_nop\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\nprintf \"%s\\n\" \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_check_type LINENO TYPE VAR INCLUDES\n# -------------------------------------------\n# Tests whether TYPE exists after having included INCLUDES, setting cache\n# variable VAR accordingly.\nac_fn_c_check_type ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\nprintf %s \"checking for $2... \" >&6; }\nif eval test \\${$3+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  eval \"$3=no\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain (void)\n{\nif (sizeof ($2))\n\t return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain (void)\n{\nif (sizeof (($2)))\n\t    return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n\nelse $as_nop\n  eval \"$3=yes\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\nprintf \"%s\\n\" \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_type\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that\n# executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }\nthen :\n  ac_retval=0\nelse $as_nop\n  printf \"%s\\n\" \"$as_me: program exited with status $ac_status\" >&5\n       printf \"%s\\n\" \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t test -x conftest$ac_exeext\n       }\nthen :\n  ac_retval=0\nelse $as_nop\n  printf \"%s\\n\" \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\nprintf %s \"checking for $2... \" >&6; }\nif eval test \\${$3+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n   which can conflict with char $2 (); below.  */\n\n#include <limits.h>\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain (void)\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  eval \"$3=yes\"\nelse $as_nop\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\nprintf \"%s\\n\" \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_func\nac_configure_args_raw=\nfor ac_arg\ndo\n  case $ac_arg in\n  *\\'*)\n    ac_arg=`printf \"%s\\n\" \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n  esac\n  as_fn_append ac_configure_args_raw \" '$ac_arg'\"\ndone\n\ncase $ac_configure_args_raw in\n  *$as_nl*)\n    ac_safe_unquote= ;;\n  *)\n    ac_unsafe_z='|&;<>()$`\\\\\"*?[ ''\t' # This string ends in space, tab.\n    ac_unsafe_a=\"$ac_unsafe_z#~\"\n    ac_safe_unquote=\"s/ '\\\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\\\)'/ \\\\1/g\"\n    ac_configure_args_raw=`      printf \"%s\\n\" \"$ac_configure_args_raw\" | sed \"$ac_safe_unquote\"`;;\nesac\n\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by $as_me, which was\ngenerated by GNU Autoconf 2.71.  Invocation command line was\n\n  $ $0$ac_configure_args_raw\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    printf \"%s\\n\" \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`printf \"%s\\n\" \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Sanitize IFS.\n  IFS=\" \"\"\t$as_nl\"\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    printf \"%s\\n\" \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    printf \"%s\\n\" \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`printf \"%s\\n\" \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      printf \"%s\\n\" \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      printf \"%s\\n\" \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`printf \"%s\\n\" \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\tprintf \"%s\\n\" \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      printf \"%s\\n\" \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      printf \"%s\\n\" \"$as_me: caught signal $ac_signal\"\n    printf \"%s\\n\" \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\nprintf \"%s\\n\" \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\nprintf \"%s\\n\" \"#define PACKAGE_NAME \\\"$PACKAGE_NAME\\\"\" >>confdefs.h\n\nprintf \"%s\\n\" \"#define PACKAGE_TARNAME \\\"$PACKAGE_TARNAME\\\"\" >>confdefs.h\n\nprintf \"%s\\n\" \"#define PACKAGE_VERSION \\\"$PACKAGE_VERSION\\\"\" >>confdefs.h\n\nprintf \"%s\\n\" \"#define PACKAGE_STRING \\\"$PACKAGE_STRING\\\"\" >>confdefs.h\n\nprintf \"%s\\n\" \"#define PACKAGE_BUGREPORT \\\"$PACKAGE_BUGREPORT\\\"\" >>confdefs.h\n\nprintf \"%s\\n\" \"#define PACKAGE_URL \\\"$PACKAGE_URL\\\"\" >>confdefs.h\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nif test -n \"$CONFIG_SITE\"; then\n  ac_site_files=\"$CONFIG_SITE\"\nelif test \"x$prefix\" != xNONE; then\n  ac_site_files=\"$prefix/share/config.site $prefix/etc/config.site\"\nelse\n  ac_site_files=\"$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site\"\nfi\n\nfor ac_site_file in $ac_site_files\ndo\n  case $ac_site_file in #(\n  */*) :\n     ;; #(\n  *) :\n    ac_site_file=./$ac_site_file ;;\nesac\n  if test -f \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\nprintf \"%s\\n\" \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\nprintf \"%s\\n\" \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\nprintf \"%s\\n\" \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\nas_fn_append ac_header_c_list \" stdio.h stdio_h HAVE_STDIO_H\"\n# Test code for whether the C compiler supports C89 (global declarations)\nac_c_conftest_c89_globals='\n/* Does the compiler advertise C89 conformance?\n   Do not test the value of __STDC__, because some compilers set it to 0\n   while being otherwise adequately conformant. */\n#if !defined __STDC__\n# error \"Compiler does not advertise C89 conformance\"\n#endif\n\n#include <stddef.h>\n#include <stdarg.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7 src/conf.sh.  */\nstruct buf { int x; };\nstruct buf * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not \\xHH hex character constants.\n   These do not provoke an error unfortunately, instead are silently treated\n   as an \"x\".  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously \\x00 != x always comes out true, for an\n   array size at least.  It is necessary to write \\x00 == 0 to get something\n   that is true only with -std.  */\nint osf4_cc_array ['\\''\\x00'\\'' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) '\\''x'\\''\nint xlc6_cc_array[FOO(a) == '\\''x'\\'' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),\n               int, int);'\n\n# Test code for whether the C compiler supports C89 (body of main).\nac_c_conftest_c89_main='\nok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);\n'\n\n# Test code for whether the C compiler supports C99 (global declarations)\nac_c_conftest_c99_globals='\n// Does the compiler advertise C99 conformance?\n#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L\n# error \"Compiler does not advertise C99 conformance\"\n#endif\n\n#include <stdbool.h>\nextern int puts (const char *);\nextern int printf (const char *, ...);\nextern int dprintf (int, const char *, ...);\nextern void *malloc (size_t);\n\n// Check varargs macros.  These examples are taken from C99 6.10.3.5.\n// dprintf is used instead of fprintf to avoid needing to declare\n// FILE and stderr.\n#define debug(...) dprintf (2, __VA_ARGS__)\n#define showlist(...) puts (#__VA_ARGS__)\n#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))\nstatic void\ntest_varargs_macros (void)\n{\n  int x = 1234;\n  int y = 5678;\n  debug (\"Flag\");\n  debug (\"X = %d\\n\", x);\n  showlist (The first, second, and third items.);\n  report (x>y, \"x is %d but y is %d\", x, y);\n}\n\n// Check long long types.\n#define BIG64 18446744073709551615ull\n#define BIG32 4294967295ul\n#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)\n#if !BIG_OK\n  #error \"your preprocessor is broken\"\n#endif\n#if BIG_OK\n#else\n  #error \"your preprocessor is broken\"\n#endif\nstatic long long int bignum = -9223372036854775807LL;\nstatic unsigned long long int ubignum = BIG64;\n\nstruct incomplete_array\n{\n  int datasize;\n  double data[];\n};\n\nstruct named_init {\n  int number;\n  const wchar_t *name;\n  double average;\n};\n\ntypedef const char *ccp;\n\nstatic inline int\ntest_restrict (ccp restrict text)\n{\n  // See if C++-style comments work.\n  // Iterate through items via the restricted pointer.\n  // Also check for declarations in for loops.\n  for (unsigned int i = 0; *(text+i) != '\\''\\0'\\''; ++i)\n    continue;\n  return 0;\n}\n\n// Check varargs and va_copy.\nstatic bool\ntest_varargs (const char *format, ...)\n{\n  va_list args;\n  va_start (args, format);\n  va_list args_copy;\n  va_copy (args_copy, args);\n\n  const char *str = \"\";\n  int number = 0;\n  float fnumber = 0;\n\n  while (*format)\n    {\n      switch (*format++)\n\t{\n\tcase '\\''s'\\'': // string\n\t  str = va_arg (args_copy, const char *);\n\t  break;\n\tcase '\\''d'\\'': // int\n\t  number = va_arg (args_copy, int);\n\t  break;\n\tcase '\\''f'\\'': // float\n\t  fnumber = va_arg (args_copy, double);\n\t  break;\n\tdefault:\n\t  break;\n\t}\n    }\n  va_end (args_copy);\n  va_end (args);\n\n  return *str && number && fnumber;\n}\n'\n\n# Test code for whether the C compiler supports C99 (body of main).\nac_c_conftest_c99_main='\n  // Check bool.\n  _Bool success = false;\n  success |= (argc != 0);\n\n  // Check restrict.\n  if (test_restrict (\"String literal\") == 0)\n    success = true;\n  char *restrict newvar = \"Another string\";\n\n  // Check varargs.\n  success &= test_varargs (\"s, d'\\'' f .\", \"string\", 65, 34.234);\n  test_varargs_macros ();\n\n  // Check flexible array members.\n  struct incomplete_array *ia =\n    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));\n  ia->datasize = 10;\n  for (int i = 0; i < ia->datasize; ++i)\n    ia->data[i] = i * 1.234;\n\n  // Check named initializers.\n  struct named_init ni = {\n    .number = 34,\n    .name = L\"Test wide string\",\n    .average = 543.34343,\n  };\n\n  ni.number = 58;\n\n  int dynamic_array[ni.number];\n  dynamic_array[0] = argv[0][0];\n  dynamic_array[ni.number - 1] = 543;\n\n  // work around unused variable warnings\n  ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\\''x'\\''\n\t || dynamic_array[ni.number - 1] != 543);\n'\n\n# Test code for whether the C compiler supports C11 (global declarations)\nac_c_conftest_c11_globals='\n// Does the compiler advertise C11 conformance?\n#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L\n# error \"Compiler does not advertise C11 conformance\"\n#endif\n\n// Check _Alignas.\nchar _Alignas (double) aligned_as_double;\nchar _Alignas (0) no_special_alignment;\nextern char aligned_as_int;\nchar _Alignas (0) _Alignas (int) aligned_as_int;\n\n// Check _Alignof.\nenum\n{\n  int_alignment = _Alignof (int),\n  int_array_alignment = _Alignof (int[100]),\n  char_alignment = _Alignof (char)\n};\n_Static_assert (0 < -_Alignof (int), \"_Alignof is signed\");\n\n// Check _Noreturn.\nint _Noreturn does_not_return (void) { for (;;) continue; }\n\n// Check _Static_assert.\nstruct test_static_assert\n{\n  int x;\n  _Static_assert (sizeof (int) <= sizeof (long int),\n                  \"_Static_assert does not work in struct\");\n  long int y;\n};\n\n// Check UTF-8 literals.\n#define u8 syntax error!\nchar const utf8_literal[] = u8\"happens to be ASCII\" \"another string\";\n\n// Check duplicate typedefs.\ntypedef long *long_ptr;\ntypedef long int *long_ptr;\ntypedef long_ptr long_ptr;\n\n// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.\nstruct anonymous\n{\n  union {\n    struct { int i; int j; };\n    struct { int k; long int l; } w;\n  };\n  int m;\n} v1;\n'\n\n# Test code for whether the C compiler supports C11 (body of main).\nac_c_conftest_c11_main='\n  _Static_assert ((offsetof (struct anonymous, i)\n\t\t   == offsetof (struct anonymous, w.k)),\n\t\t  \"Anonymous union alignment botch\");\n  v1.i = 2;\n  v1.w.k = 5;\n  ok |= v1.i != 5;\n'\n\n# Test code for whether the C compiler supports C11 (complete).\nac_c_conftest_c11_program=\"${ac_c_conftest_c89_globals}\n${ac_c_conftest_c99_globals}\n${ac_c_conftest_c11_globals}\n\nint\nmain (int argc, char **argv)\n{\n  int ok = 0;\n  ${ac_c_conftest_c89_main}\n  ${ac_c_conftest_c99_main}\n  ${ac_c_conftest_c11_main}\n  return ok;\n}\n\"\n\n# Test code for whether the C compiler supports C99 (complete).\nac_c_conftest_c99_program=\"${ac_c_conftest_c89_globals}\n${ac_c_conftest_c99_globals}\n\nint\nmain (int argc, char **argv)\n{\n  int ok = 0;\n  ${ac_c_conftest_c89_main}\n  ${ac_c_conftest_c99_main}\n  return ok;\n}\n\"\n\n# Test code for whether the C compiler supports C89 (complete).\nac_c_conftest_c89_program=\"${ac_c_conftest_c89_globals}\n\nint\nmain (int argc, char **argv)\n{\n  int ok = 0;\n  ${ac_c_conftest_c89_main}\n  return ok;\n}\n\"\n\nas_fn_append ac_header_c_list \" stdlib.h stdlib_h HAVE_STDLIB_H\"\nas_fn_append ac_header_c_list \" string.h string_h HAVE_STRING_H\"\nas_fn_append ac_header_c_list \" inttypes.h inttypes_h HAVE_INTTYPES_H\"\nas_fn_append ac_header_c_list \" stdint.h stdint_h HAVE_STDINT_H\"\nas_fn_append ac_header_c_list \" strings.h strings_h HAVE_STRINGS_H\"\nas_fn_append ac_header_c_list \" sys/stat.h sys_stat_h HAVE_SYS_STAT_H\"\nas_fn_append ac_header_c_list \" sys/types.h sys_types_h HAVE_SYS_TYPES_H\"\nas_fn_append ac_header_c_list \" unistd.h unistd_h HAVE_UNISTD_H\"\nas_fn_append ac_header_c_list \" wchar.h wchar_h HAVE_WCHAR_H\"\nas_fn_append ac_header_c_list \" minix/config.h minix_config_h HAVE_MINIX_CONFIG_H\"\n\n# Auxiliary files required by this configure script.\nac_aux_files=\"install-sh config.guess config.sub\"\n\n# Locations in which to look for auxiliary files.\nac_aux_dir_candidates=\"${srcdir}/autoconf/helpers\"\n\n# Search for a directory containing all of the required auxiliary files,\n# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.\n# If we don't find one directory that contains all the files we need,\n# we report the set of missing files from the *first* directory in\n# $ac_aux_dir_candidates and give up.\nac_missing_aux_files=\"\"\nac_first_candidate=:\nprintf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files\" >&5\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in $ac_aux_dir_candidates\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n  as_found=:\n\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}:  trying $as_dir\" >&5\n  ac_aux_dir_found=yes\n  ac_install_sh=\n  for ac_aux in $ac_aux_files\n  do\n    # As a special case, if \"install-sh\" is required, that requirement\n    # can be satisfied by any of \"install-sh\", \"install.sh\", or \"shtool\",\n    # and $ac_install_sh is set appropriately for whichever one is found.\n    if test x\"$ac_aux\" = x\"install-sh\"\n    then\n      if test -f \"${as_dir}install-sh\"; then\n        printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}:   ${as_dir}install-sh found\" >&5\n        ac_install_sh=\"${as_dir}install-sh -c\"\n      elif test -f \"${as_dir}install.sh\"; then\n        printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}:   ${as_dir}install.sh found\" >&5\n        ac_install_sh=\"${as_dir}install.sh -c\"\n      elif test -f \"${as_dir}shtool\"; then\n        printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}:   ${as_dir}shtool found\" >&5\n        ac_install_sh=\"${as_dir}shtool install -c\"\n      else\n        ac_aux_dir_found=no\n        if $ac_first_candidate; then\n          ac_missing_aux_files=\"${ac_missing_aux_files} install-sh\"\n        else\n          break\n        fi\n      fi\n    else\n      if test -f \"${as_dir}${ac_aux}\"; then\n        printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}:   ${as_dir}${ac_aux} found\" >&5\n      else\n        ac_aux_dir_found=no\n        if $ac_first_candidate; then\n          ac_missing_aux_files=\"${ac_missing_aux_files} ${ac_aux}\"\n        else\n          break\n        fi\n      fi\n    fi\n  done\n  if test \"$ac_aux_dir_found\" = yes; then\n    ac_aux_dir=\"$as_dir\"\n    break\n  fi\n  ac_first_candidate=false\n\n  as_found=false\ndone\nIFS=$as_save_IFS\nif $as_found\nthen :\n\nelse $as_nop\n  as_fn_error $? \"cannot find required auxiliary files:$ac_missing_aux_files\" \"$LINENO\" 5\nfi\n\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nif test -f \"${ac_aux_dir}config.guess\"; then\n  ac_config_guess=\"$SHELL ${ac_aux_dir}config.guess\"\nfi\nif test -f \"${ac_aux_dir}config.sub\"; then\n  ac_config_sub=\"$SHELL ${ac_aux_dir}config.sub\"\nfi\nif test -f \"$ac_aux_dir/configure\"; then\n  ac_configure=\"$SHELL ${ac_aux_dir}configure\"\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\nprintf \"%s\\n\" \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\nprintf \"%s\\n\" \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\nprintf \"%s\\n\" \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\nprintf \"%s\\n\" \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\nprintf \"%s\\n\" \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\nprintf \"%s\\n\" \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`printf \"%s\\n\" \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\nprintf \"%s\\n\" \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`${MAKE-make} distclean' and/or \\`rm $cache_file'\n\t    and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\nac_config_headers=\"$ac_config_headers config/config.h\"\n\n\n\n\nWINELOADER=/dev/null\nexport WINELOADER\n\nif test \"x$prefix\" = xNONE; then\n  printf %s \"checking for prefix by \" >&6\n  # Extract the first word of \"abcwrite\", so it can be a program name with args.\nset dummy abcwrite; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_path_ac_prefix_program+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  case $ac_prefix_program in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_ac_prefix_program=\"$ac_prefix_program\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_path_ac_prefix_program=\"$as_dir$ac_word$ac_exec_ext\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nac_prefix_program=$ac_cv_path_ac_prefix_program\nif test -n \"$ac_prefix_program\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_prefix_program\" >&5\nprintf \"%s\\n\" \"$ac_prefix_program\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n  if test -n \"$ac_prefix_program\"; then\n    prefix=`$as_dirname -- \"$ac_prefix_program\" ||\n$as_expr X\"$ac_prefix_program\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_prefix_program\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_prefix_program\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_prefix_program\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X\"$ac_prefix_program\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    prefix=`$as_dirname -- \"$prefix\" ||\n$as_expr X\"$prefix\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$prefix\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$prefix\" : 'X\\(//\\)$' \\| \\\n\t X\"$prefix\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X\"$prefix\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  fi\nfi\n\n\n\n\n\n  # Make sure we can run config.sub.\n$SHELL \"${ac_aux_dir}config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error $? \"cannot run $SHELL ${ac_aux_dir}config.sub\" \"$LINENO\" 5\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\nprintf %s \"checking build system type... \" >&6; }\nif test ${ac_cv_build+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"${ac_aux_dir}config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error $? \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"${ac_aux_dir}config.sub\" $ac_build_alias` ||\n  as_fn_error $? \"$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\nprintf \"%s\\n\" \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\nprintf %s \"checking host system type... \" >&6; }\nif test ${ac_cv_host+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"${ac_aux_dir}config.sub\" $host_alias` ||\n    as_fn_error $? \"$SHELL ${ac_aux_dir}config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\nprintf \"%s\\n\" \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\n\n\n\n\n\n\n\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_ac_ct_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\nprintf \"%s\\n\" \"$ac_ct_CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_ac_ct_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\nprintf \"%s\\n\" \"$ac_ct_CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}clang\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}clang; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}clang\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"clang\", so it can be a program name with args.\nset dummy clang; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_ac_ct_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"clang\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\nprintf \"%s\\n\" \"$ac_ct_CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\nprintf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion -version; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\nprintf %s \"checking whether the C compiler works... \" >&6; }\nac_link_default=`printf \"%s\\n\" \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\nthen :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test ${ac_cv_exeext+y} && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse $as_nop\n  ac_file=''\nfi\nif test -z \"$ac_file\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nprintf \"%s\\n\" \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\nprintf %s \"checking for C compiler default output file name... \" >&6; }\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\nprintf \"%s\\n\" \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\nprintf %s \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\nthen :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse $as_nop\n  { { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\nprintf \"%s\\n\" \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain (void)\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\nprintf %s \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\nprintf \"%s\\n\" \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\nprintf %s \"checking for suffix of object files... \" >&6; }\nif test ${ac_cv_objext+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\nthen :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse $as_nop\n  printf \"%s\\n\" \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\nprintf \"%s\\n\" \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C\" >&5\nprintf %s \"checking whether the compiler supports GNU C... \" >&6; }\nif test ${ac_cv_c_compiler_gnu+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_compiler_gnu=yes\nelse $as_nop\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\nprintf \"%s\\n\" \"$ac_cv_c_compiler_gnu\" >&6; }\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+y}\nac_save_CFLAGS=$CFLAGS\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\nprintf %s \"checking whether $CC accepts -g... \" >&6; }\nif test ${ac_cv_prog_cc_g+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_g=yes\nelse $as_nop\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n\nelse $as_nop\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_g\" >&6; }\nif test $ac_test_CFLAGS; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\nac_prog_cc_stdc=no\nif test x$ac_prog_cc_stdc = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features\" >&5\nprintf %s \"checking for $CC option to enable C11 features... \" >&6; }\nif test ${ac_cv_prog_cc_c11+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_prog_cc_c11=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_c_conftest_c11_program\n_ACEOF\nfor ac_arg in '' -std=gnu11\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_c11=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam\n  test \"x$ac_cv_prog_cc_c11\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\nfi\n\nif test \"x$ac_cv_prog_cc_c11\" = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\nprintf \"%s\\n\" \"unsupported\" >&6; }\nelse $as_nop\n  if test \"x$ac_cv_prog_cc_c11\" = x\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\nprintf \"%s\\n\" \"none needed\" >&6; }\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_c11\" >&6; }\n     CC=\"$CC $ac_cv_prog_cc_c11\"\nfi\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11\n  ac_prog_cc_stdc=c11\nfi\nfi\nif test x$ac_prog_cc_stdc = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features\" >&5\nprintf %s \"checking for $CC option to enable C99 features... \" >&6; }\nif test ${ac_cv_prog_cc_c99+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_prog_cc_c99=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_c_conftest_c99_program\n_ACEOF\nfor ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_c99=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam\n  test \"x$ac_cv_prog_cc_c99\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\nfi\n\nif test \"x$ac_cv_prog_cc_c99\" = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\nprintf \"%s\\n\" \"unsupported\" >&6; }\nelse $as_nop\n  if test \"x$ac_cv_prog_cc_c99\" = x\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\nprintf \"%s\\n\" \"none needed\" >&6; }\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_c99\" >&6; }\n     CC=\"$CC $ac_cv_prog_cc_c99\"\nfi\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99\n  ac_prog_cc_stdc=c99\nfi\nfi\nif test x$ac_prog_cc_stdc = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features\" >&5\nprintf %s \"checking for $CC option to enable C89 features... \" >&6; }\nif test ${ac_cv_prog_cc_c89+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_c_conftest_c89_program\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\nfi\n\nif test \"x$ac_cv_prog_cc_c89\" = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\nprintf \"%s\\n\" \"unsupported\" >&6; }\nelse $as_nop\n  if test \"x$ac_cv_prog_cc_c89\" = x\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\nprintf \"%s\\n\" \"none needed\" >&6; }\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_c89\" >&6; }\n     CC=\"$CC $ac_cv_prog_cc_c89\"\nfi\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89\n  ac_prog_cc_stdc=c89\nfi\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\nac_header= ac_cache=\nfor ac_item in $ac_header_c_list\ndo\n  if test $ac_cache; then\n    ac_fn_c_check_header_compile \"$LINENO\" $ac_header ac_cv_header_$ac_cache \"$ac_includes_default\"\n    if eval test \\\"x\\$ac_cv_header_$ac_cache\\\" = xyes; then\n      printf \"%s\\n\" \"#define $ac_item 1\" >> confdefs.h\n    fi\n    ac_header= ac_cache=\n  elif test $ac_header; then\n    ac_cache=$ac_item\n  else\n    ac_header=$ac_item\n  fi\ndone\n\n\n\n\n\n\n\n\nif test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes\nthen :\n\nprintf \"%s\\n\" \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n\n\n\n\n\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__\" >&5\nprintf %s \"checking whether it is safe to define __EXTENSIONS__... \" >&6; }\nif test ${ac_cv_safe_to_define___extensions__+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#         define __EXTENSIONS__ 1\n          $ac_includes_default\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_safe_to_define___extensions__=yes\nelse $as_nop\n  ac_cv_safe_to_define___extensions__=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__\" >&5\nprintf \"%s\\n\" \"$ac_cv_safe_to_define___extensions__\" >&6; }\n\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined\" >&5\nprintf %s \"checking whether _XOPEN_SOURCE should be defined... \" >&6; }\nif test ${ac_cv_should_define__xopen_source+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_should_define__xopen_source=no\n    if test $ac_cv_header_wchar_h = yes\nthen :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n          #include <wchar.h>\n          mbstate_t x;\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n            #define _XOPEN_SOURCE 500\n            #include <wchar.h>\n            mbstate_t x;\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_should_define__xopen_source=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source\" >&5\nprintf \"%s\\n\" \"$ac_cv_should_define__xopen_source\" >&6; }\n\n  printf \"%s\\n\" \"#define _ALL_SOURCE 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define _DARWIN_C_SOURCE 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define _GNU_SOURCE 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define _HPUX_ALT_XOPEN_SOCKET_API 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define _NETBSD_SOURCE 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define _OPENBSD_SOURCE 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define _POSIX_PTHREAD_SEMANTICS 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define __STDC_WANT_IEC_60559_BFP_EXT__ 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define __STDC_WANT_IEC_60559_DFP_EXT__ 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define __STDC_WANT_LIB_EXT2__ 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define __STDC_WANT_MATH_SPEC_FUNCS__ 1\" >>confdefs.h\n\n  printf \"%s\\n\" \"#define _TANDEM_SOURCE 1\" >>confdefs.h\n\n  if test $ac_cv_header_minix_config_h = yes\nthen :\n  MINIX=yes\n    printf \"%s\\n\" \"#define _MINIX 1\" >>confdefs.h\n\n    printf \"%s\\n\" \"#define _POSIX_SOURCE 1\" >>confdefs.h\n\n    printf \"%s\\n\" \"#define _POSIX_1_SOURCE 2\" >>confdefs.h\n\nelse $as_nop\n  MINIX=\nfi\n  if test $ac_cv_safe_to_define___extensions__ = yes\nthen :\n  printf \"%s\\n\" \"#define __EXTENSIONS__ 1\" >>confdefs.h\n\nfi\n  if test $ac_cv_should_define__xopen_source = yes\nthen :\n  printf \"%s\\n\" \"#define _XOPEN_SOURCE 500\" >>confdefs.h\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_ac_ct_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\nprintf \"%s\\n\" \"$ac_ct_CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_ac_ct_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\nprintf \"%s\\n\" \"$ac_ct_CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}clang\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}clang; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}clang\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\nprintf \"%s\\n\" \"$CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"clang\", so it can be a program name with args.\nset dummy clang; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_ac_ct_CC+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"clang\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\nprintf \"%s\\n\" \"$ac_ct_CC\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\nprintf \"%s\\n\" \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\nprintf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion -version; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\nprintf \"%s\\n\" \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C\" >&5\nprintf %s \"checking whether the compiler supports GNU C... \" >&6; }\nif test ${ac_cv_c_compiler_gnu+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_compiler_gnu=yes\nelse $as_nop\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\nprintf \"%s\\n\" \"$ac_cv_c_compiler_gnu\" >&6; }\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+y}\nac_save_CFLAGS=$CFLAGS\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\nprintf %s \"checking whether $CC accepts -g... \" >&6; }\nif test ${ac_cv_prog_cc_g+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_g=yes\nelse $as_nop\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n\nelse $as_nop\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_g\" >&6; }\nif test $ac_test_CFLAGS; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\nac_prog_cc_stdc=no\nif test x$ac_prog_cc_stdc = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features\" >&5\nprintf %s \"checking for $CC option to enable C11 features... \" >&6; }\nif test ${ac_cv_prog_cc_c11+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_prog_cc_c11=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_c_conftest_c11_program\n_ACEOF\nfor ac_arg in '' -std=gnu11\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_c11=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam\n  test \"x$ac_cv_prog_cc_c11\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\nfi\n\nif test \"x$ac_cv_prog_cc_c11\" = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\nprintf \"%s\\n\" \"unsupported\" >&6; }\nelse $as_nop\n  if test \"x$ac_cv_prog_cc_c11\" = x\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\nprintf \"%s\\n\" \"none needed\" >&6; }\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_c11\" >&6; }\n     CC=\"$CC $ac_cv_prog_cc_c11\"\nfi\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11\n  ac_prog_cc_stdc=c11\nfi\nfi\nif test x$ac_prog_cc_stdc = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features\" >&5\nprintf %s \"checking for $CC option to enable C99 features... \" >&6; }\nif test ${ac_cv_prog_cc_c99+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_prog_cc_c99=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_c_conftest_c99_program\n_ACEOF\nfor ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_c99=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam\n  test \"x$ac_cv_prog_cc_c99\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\nfi\n\nif test \"x$ac_cv_prog_cc_c99\" = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\nprintf \"%s\\n\" \"unsupported\" >&6; }\nelse $as_nop\n  if test \"x$ac_cv_prog_cc_c99\" = x\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\nprintf \"%s\\n\" \"none needed\" >&6; }\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_c99\" >&6; }\n     CC=\"$CC $ac_cv_prog_cc_c99\"\nfi\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99\n  ac_prog_cc_stdc=c99\nfi\nfi\nif test x$ac_prog_cc_stdc = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features\" >&5\nprintf %s \"checking for $CC option to enable C89 features... \" >&6; }\nif test ${ac_cv_prog_cc_c89+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_c_conftest_c89_program\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\nfi\n\nif test \"x$ac_cv_prog_cc_c89\" = xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\nprintf \"%s\\n\" \"unsupported\" >&6; }\nelse $as_nop\n  if test \"x$ac_cv_prog_cc_c89\" = x\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\nprintf \"%s\\n\" \"none needed\" >&6; }\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\nprintf \"%s\\n\" \"$ac_cv_prog_cc_c89\" >&6; }\n     CC=\"$CC $ac_cv_prog_cc_c89\"\nfi\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89\n  ac_prog_cc_stdc=c89\nfi\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\nprintf %s \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\nprintf \"%s\\n\" \"no, using $LN_S\" >&6; }\nfi\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\nprintf %s \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`printf \"%s\\n\" \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval test \\${ac_cv_prog_make_${ac_make}_set+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\n\n  # Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\nprintf %s \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif test ${ac_cv_path_install+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    # Account for fact that we put trailing slashes in our PATH walk.\ncase $as_dir in #((\n  ./ | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif as_fn_executable_p \"$as_dir$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir/\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test ${ac_cv_path_install+y}; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\nprintf \"%s\\n\" \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const\" >&5\nprintf %s \"checking for an ANSI C-conforming const... \" >&6; }\nif test ${ac_cv_c_const+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain (void)\n{\n\n#ifndef __cplusplus\n  /* Ultrix mips cc rejects this sort of thing.  */\n  typedef int charset[2];\n  const charset cs = { 0, 0 };\n  /* SunOS 4.1.1 cc rejects this.  */\n  char const *const *pcpcc;\n  char **ppc;\n  /* NEC SVR4.0.2 mips cc rejects this.  */\n  struct point {int x, y;};\n  static struct point const zero = {0,0};\n  /* IBM XL C 1.02.0.0 rejects this.\n     It does not let you subtract one const X* pointer from another in\n     an arm of an if-expression whose if-part is not a constant\n     expression */\n  const char *g = \"string\";\n  pcpcc = &g + (g ? g-g : 0);\n  /* HPUX 7.0 cc rejects these. */\n  ++pcpcc;\n  ppc = (char**) pcpcc;\n  pcpcc = (char const *const *) ppc;\n  { /* SCO 3.2v4 cc rejects this sort of thing.  */\n    char tx;\n    char *t = &tx;\n    char const *s = 0 ? (char *) 0 : (char const *) 0;\n\n    *t++ = 0;\n    if (s) return 0;\n  }\n  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */\n    int x[] = {25, 17};\n    const int *foo = &x[0];\n    ++foo;\n  }\n  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */\n    typedef const int *iptr;\n    iptr p = 0;\n    ++p;\n  }\n  { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying\n       \"k.c\", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */\n    struct s { int j; const int *ap[3]; } bx;\n    struct s *b = &bx; b->j = 5;\n  }\n  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */\n    const int foo = 10;\n    if (!foo) return 0;\n  }\n  return !cs[0] && !zero.x;\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_c_const=yes\nelse $as_nop\n  ac_cv_c_const=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const\" >&5\nprintf \"%s\\n\" \"$ac_cv_c_const\" >&6; }\nif test $ac_cv_c_const = no; then\n\nprintf \"%s\\n\" \"#define const /**/\" >>confdefs.h\n\nfi\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for inline\" >&5\nprintf %s \"checking for inline... \" >&6; }\nif test ${ac_cv_c_inline+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_c_inline=no\nfor ac_kw in inline __inline__ __inline; do\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifndef __cplusplus\ntypedef int foo_t;\nstatic $ac_kw foo_t static_foo (void) {return 0; }\n$ac_kw foo_t foo (void) {return 0; }\n#endif\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_c_inline=$ac_kw\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n  test \"$ac_cv_c_inline\" != no && break\ndone\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline\" >&5\nprintf \"%s\\n\" \"$ac_cv_c_inline\" >&6; }\n\ncase $ac_cv_c_inline in\n  inline | yes) ;;\n  *)\n    case $ac_cv_c_inline in\n      no) ac_val=;;\n      *) ac_val=$ac_cv_c_inline;;\n    esac\n    cat >>confdefs.h <<_ACEOF\n#ifndef __cplusplus\n#define inline $ac_val\n#endif\n_ACEOF\n    ;;\nesac\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword\" >&5\nprintf %s \"checking for C/C++ restrict keyword... \" >&6; }\nif test ${ac_cv_c_restrict+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_c_restrict=no\n   # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:\n   # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html\n   # Put 'restrict' last, because C++ lacks it.\n   for ac_kw in __restrict__ __restrict _Restrict restrict; do\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\ntypedef int *int_ptr;\n\t   int foo (int_ptr $ac_kw ip) { return ip[0]; }\n\t   int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */\n\t   int bar (int ip[$ac_kw]) { return ip[0]; }\n\nint\nmain (void)\n{\nint s[1];\n\t   int *$ac_kw t = s;\n\t   t[0] = 0;\n\t   return foo (t) + bar (t);\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_c_restrict=$ac_kw\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n     test \"$ac_cv_c_restrict\" != no && break\n   done\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict\" >&5\nprintf \"%s\\n\" \"$ac_cv_c_restrict\" >&6; }\n\n case $ac_cv_c_restrict in\n   restrict) ;;\n   no) printf \"%s\\n\" \"#define restrict /**/\" >>confdefs.h\n ;;\n   *)  printf \"%s\\n\" \"#define restrict $ac_cv_c_restrict\" >>confdefs.h\n ;;\n esac\n\nac_fn_c_check_type \"$LINENO\" \"size_t\" \"ac_cv_type_size_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_size_t\" = xyes\nthen :\n\nelse $as_nop\n\nprintf \"%s\\n\" \"#define size_t unsigned int\" >>confdefs.h\n\nfi\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian\" >&5\nprintf %s \"checking whether byte ordering is bigendian... \" >&6; }\nif test ${ac_cv_c_bigendian+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_cv_c_bigendian=unknown\n    # See if we're dealing with a universal compiler.\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifndef __APPLE_CC__\n\t       not a universal capable compiler\n\t     #endif\n\t     typedef int dummy;\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n\n\t# Check for potential -arch flags.  It is not universal unless\n\t# there are at least two -arch flags with different values.\n\tac_arch=\n\tac_prev=\n\tfor ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do\n\t if test -n \"$ac_prev\"; then\n\t   case $ac_word in\n\t     i?86 | x86_64 | ppc | ppc64)\n\t       if test -z \"$ac_arch\" || test \"$ac_arch\" = \"$ac_word\"; then\n\t\t ac_arch=$ac_word\n\t       else\n\t\t ac_cv_c_bigendian=universal\n\t\t break\n\t       fi\n\t       ;;\n\t   esac\n\t   ac_prev=\n\t elif test \"x$ac_word\" = \"x-arch\"; then\n\t   ac_prev=arch\n\t fi\n       done\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if sys/param.h defines the BYTE_ORDER macro.\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t     #include <sys/param.h>\n\nint\nmain (void)\n{\n#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\\n\t\t     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\\n\t\t     && LITTLE_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  # It does; now see whether it defined to BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t\t#include <sys/param.h>\n\nint\nmain (void)\n{\n#if BYTE_ORDER != BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_c_bigendian=yes\nelse $as_nop\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain (void)\n{\n#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  # It does; now see whether it defined to _BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain (void)\n{\n#ifndef _BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_c_bigendian=yes\nelse $as_nop\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # Compile a test program.\n      if test \"$cross_compiling\" = yes\nthen :\n  # Try to guess by grepping values from an object file.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nunsigned short int ascii_mm[] =\n\t\t  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };\n\t\tunsigned short int ascii_ii[] =\n\t\t  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };\n\t\tint use_ascii (int i) {\n\t\t  return ascii_mm[i] + ascii_ii[i];\n\t\t}\n\t\tunsigned short int ebcdic_ii[] =\n\t\t  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };\n\t\tunsigned short int ebcdic_mm[] =\n\t\t  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };\n\t\tint use_ebcdic (int i) {\n\t\t  return ebcdic_mm[i] + ebcdic_ii[i];\n\t\t}\n\t\textern int foo;\n\nint\nmain (void)\n{\nreturn use_ascii (foo) == use_ebcdic (foo);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then\n\t      ac_cv_c_bigendian=yes\n\t    fi\n\t    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then\n\t      if test \"$ac_cv_c_bigendian\" = unknown; then\n\t\tac_cv_c_bigendian=no\n\t      else\n\t\t# finding both strings is unlikely to happen, but who knows?\n\t\tac_cv_c_bigendian=unknown\n\t      fi\n\t    fi\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\n\n\t     /* Are we little or big endian?  From Harbison&Steele.  */\n\t     union\n\t     {\n\t       long int l;\n\t       char c[sizeof (long int)];\n\t     } u;\n\t     u.l = 1;\n\t     return u.c[sizeof (long int) - 1] == 1;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"\nthen :\n  ac_cv_c_bigendian=no\nelse $as_nop\n  ac_cv_c_bigendian=yes\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\n    fi\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian\" >&5\nprintf \"%s\\n\" \"$ac_cv_c_bigendian\" >&6; }\n case $ac_cv_c_bigendian in #(\n   yes)\n     printf \"%s\\n\" \"#define WORDS_BIGENDIAN 1\" >>confdefs.h\n;; #(\n   no)\n     printf \"%s\\n\" \"#define WORDS_LITTLEENDIAN 1\" >>confdefs.h\n ;; #(\n   universal)\n\nprintf \"%s\\n\" \"#define AC_APPLE_UNIVERSAL_BUILD 1\" >>confdefs.h\n\n     ;; #(\n   *)\n     as_fn_error $? \"unknown endianness\n presetting ac_cv_c_bigendian=no (or yes) will help\" \"$LINENO\" 5 ;;\n esac\n\n\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\nprintf %s \"checking for grep that handles long lines and -e... \" >&6; }\nif test ${ac_cv_path_GREP+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_prog in grep ggrep\n   do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_GREP\" || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  printf %s 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    printf \"%s\\n\" 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\nprintf \"%s\\n\" \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n# Autoupdate added the next two lines to ensure that your configure\n# script's behavior did not change.  They are probably safe to remove.\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\nprintf %s \"checking for egrep... \" >&6; }\nif test ${ac_cv_path_EGREP+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_prog in egrep\n   do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_EGREP\" || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  printf %s 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    printf \"%s\\n\" 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\nprintf \"%s\\n\" \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n\nac_fn_c_check_type \"$LINENO\" \"_Bool\" \"ac_cv_type__Bool\" \"$ac_includes_default\"\nif test \"x$ac_cv_type__Bool\" = xyes\nthen :\n\nprintf \"%s\\n\" \"#define HAVE__BOOL 1\" >>confdefs.h\n\n\nfi\n\n   { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99\" >&5\nprintf %s \"checking for stdbool.h that conforms to C99... \" >&6; }\nif test ${ac_cv_header_stdbool_h+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdbool.h>\n\n             #ifndef __bool_true_false_are_defined\n               #error \"__bool_true_false_are_defined is not defined\"\n             #endif\n             char a[__bool_true_false_are_defined == 1 ? 1 : -1];\n\n             /* Regardless of whether this is C++ or \"_Bool\" is a\n                valid type name, \"true\" and \"false\" should be usable\n                in #if expressions and integer constant expressions,\n                and \"bool\" should be a valid type name.  */\n\n             #if !true\n               #error \"'true' is not true\"\n             #endif\n             #if true != 1\n               #error \"'true' is not equal to 1\"\n             #endif\n             char b[true == 1 ? 1 : -1];\n             char c[true];\n\n             #if false\n               #error \"'false' is not false\"\n             #endif\n             #if false != 0\n               #error \"'false' is not equal to 0\"\n             #endif\n             char d[false == 0 ? 1 : -1];\n\n             enum { e = false, f = true, g = false * true, h = true * 256 };\n\n             char i[(bool) 0.5 == true ? 1 : -1];\n             char j[(bool) 0.0 == false ? 1 : -1];\n             char k[sizeof (bool) > 0 ? 1 : -1];\n\n             struct sb { bool s: 1; bool t; } s;\n             char l[sizeof s.t > 0 ? 1 : -1];\n\n             /* The following fails for\n                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */\n             bool m[h];\n             char n[sizeof m == h * sizeof m[0] ? 1 : -1];\n             char o[-1 - (bool) 0 < 0 ? 1 : -1];\n             /* Catch a bug in an HP-UX C compiler.  See\n         https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html\n         https://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html\n              */\n             bool p = true;\n             bool *pp = &p;\n\n             /* C 1999 specifies that bool, true, and false are to be\n                macros, but C++ 2011 and later overrule this.  */\n             #if __cplusplus < 201103\n              #ifndef bool\n               #error \"bool is not defined\"\n              #endif\n              #ifndef false\n               #error \"false is not defined\"\n              #endif\n              #ifndef true\n               #error \"true is not defined\"\n              #endif\n             #endif\n\n             /* If _Bool is available, repeat with it all the tests\n                above that used bool.  */\n             #ifdef HAVE__BOOL\n               struct sB { _Bool s: 1; _Bool t; } t;\n\n               char q[(_Bool) 0.5 == true ? 1 : -1];\n               char r[(_Bool) 0.0 == false ? 1 : -1];\n               char u[sizeof (_Bool) > 0 ? 1 : -1];\n               char v[sizeof t.t > 0 ? 1 : -1];\n\n               _Bool w[h];\n               char x[sizeof m == h * sizeof m[0] ? 1 : -1];\n               char y[-1 - (_Bool) 0 < 0 ? 1 : -1];\n               _Bool z = true;\n               _Bool *pz = &p;\n             #endif\n\nint\nmain (void)\n{\n\n             bool ps = &s;\n             *pp |= p;\n             *pp |= ! p;\n\n             #ifdef HAVE__BOOL\n               _Bool pt = &t;\n               *pz |= z;\n               *pz |= ! z;\n             #endif\n\n             /* Refer to every declared value, so they cannot be\n                discarded as unused.  */\n             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !j + !k\n                     + !l + !m + !n + !o + !p + !pp + !ps\n             #ifdef HAVE__BOOL\n                     + !q + !r + !u + !v + !w + !x + !y + !z + !pt\n             #endif\n                    );\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  ac_cv_header_stdbool_h=yes\nelse $as_nop\n  ac_cv_header_stdbool_h=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h\" >&5\nprintf \"%s\\n\" \"$ac_cv_header_stdbool_h\" >&6; }\n\nif test $ac_cv_header_stdbool_h = yes; then\n\nprintf \"%s\\n\" \"#define HAVE_STDBOOL_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"inttypes.h\" \"ac_cv_header_inttypes_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_inttypes_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_INTTYPES_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"stdnoreturn.h\" \"ac_cv_header_stdnoreturn_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_stdnoreturn_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_STDNORETURN_H 1\" >>confdefs.h\n\nfi\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fwrapv\" >&5\nprintf %s \"checking if $CC accepts -fwrapv... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fwrapv\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fwrapv\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FWRAPV 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -U__STRICT_ANSI__\" >&5\nprintf %s \"checking if $CC accepts -U__STRICT_ANSI__... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -U__STRICT_ANSI__\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -U__STRICT_ANSI__\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_U_STRICT_ANSI 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-common\" >&5\nprintf %s \"checking if $CC accepts -fno-common... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fno-common\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fno-common\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FNO_COMMON 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -ffast-math\" >&5\nprintf %s \"checking if $CC accepts -ffast-math... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -ffast-math\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -ffast-math\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FFAST_MATH 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wl,--as-needed\" >&5\nprintf %s \"checking if $CC accepts -Wl,--as-needed... \" >&6; }\n pa_add_flags__old_flags=\"$LDFLAGS\"\n LDFLAGS=\"$LDFLAGS -Wl,--as-needed\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   LDFLAGS=\"$pa_add_flags__old_flags -Wl,--as-needed\"\n\nprintf \"%s\\n\" \"#define LDFLAGS_WL_AS_NEEDED 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   LDFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fstack-protector\" >&5\nprintf %s \"checking if $CC accepts -fstack-protector... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fstack-protector\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fstack-protector\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FSTACK_PROTECTOR 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n       for ac_header in intrin.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"intrin.h\" \"ac_cv_header_intrin_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_intrin_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_INTRIN_H 1\" >>confdefs.h\n ac_includes_default=\"$ac_includes_default\n#include <intrin.h>\"\n\nfi\n\ndone\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for __builtin_expect\" >&5\nprintf %s \"checking for __builtin_expect... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nint main(void) {\n    (void)__builtin_expect(1,1);\n    return 0;\n}\n\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE___BUILTIN_EXPECT 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for __builtin_constant_p\" >&5\nprintf %s \"checking for __builtin_constant_p... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nint main(void) {\n    (void)__builtin_constant_p(0);\n    return 0;\n}\n\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE___BUILTIN_CONSTANT_P 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\nac_fn_c_check_header_compile \"$LINENO\" \"dirent.h\" \"ac_cv_header_dirent_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_dirent_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_DIRENT_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"sys/types.h\" \"ac_cv_header_sys_types_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_types_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_SYS_TYPES_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"sys/stat.h\" \"ac_cv_header_sys_stat_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_stat_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_SYS_STAT_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"sys/time.h\" \"ac_cv_header_sys_time_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_time_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_SYS_TIME_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"unistd.h\" \"ac_cv_header_unistd_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_unistd_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_UNISTD_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"fcntl.h\" \"ac_cv_header_fcntl_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_fcntl_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_FCNTL_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"io.h\" \"ac_cv_header_io_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_io_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_IO_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"windows.h\" \"ac_cv_header_windows_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_windows_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_WINDOWS_H 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_header_compile \"$LINENO\" \"direct.h\" \"ac_cv_header_direct_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_direct_h\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_DIRECT_H 1\" >>confdefs.h\n\nfi\n\n\nac_fn_c_check_func \"$LINENO\" \"mempcpy\" \"ac_cv_func_mempcpy\"\nif test \"x$ac_cv_func_mempcpy\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_MEMPCPY 1\" >>confdefs.h\n\nfi\n\n\nac_fn_c_check_type \"$LINENO\" \"struct _stat64\" \"ac_cv_type_struct__stat64\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_struct__stat64\" = xyes\nthen :\n\nprintf \"%s\\n\" \"#define HAVE_STRUCT__STAT64 1\" >>confdefs.h\n\n\nfi\n\nac_fn_c_check_type \"$LINENO\" \"struct stat\" \"ac_cv_type_struct_stat\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_struct_stat\" = xyes\nthen :\n\nprintf \"%s\\n\" \"#define HAVE_STRUCT_STAT 1\" >>confdefs.h\n\n\nfi\n\nac_fn_c_check_func \"$LINENO\" \"stat\" \"ac_cv_func_stat\"\nif test \"x$ac_cv_func_stat\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_STAT 1\" >>confdefs.h\n\nfi\nac_fn_c_check_func \"$LINENO\" \"_stat64\" \"ac_cv_func__stat64\"\nif test \"x$ac_cv_func__stat64\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE__STAT64 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_func \"$LINENO\" \"fstat\" \"ac_cv_func_fstat\"\nif test \"x$ac_cv_func_fstat\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE_FSTAT 1\" >>confdefs.h\n\nfi\nac_fn_c_check_func \"$LINENO\" \"_fstat64\" \"ac_cv_func__fstat64\"\nif test \"x$ac_cv_func__fstat64\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE__FSTAT64 1\" >>confdefs.h\n\nfi\n\n\nac_fn_c_check_type \"$LINENO\" \"mode_t\" \"ac_cv_type_mode_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_mode_t\" = xyes\nthen :\n\nprintf \"%s\\n\" \"#define HAVE_MODE_T 1\" >>confdefs.h\n\n\nfi\n\n\nac_fn_c_check_func \"$LINENO\" \"_mkdir\" \"ac_cv_func__mkdir\"\nif test \"x$ac_cv_func__mkdir\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE__MKDIR 1\" >>confdefs.h\n\nfi\n\nac_fn_c_check_func \"$LINENO\" \"_findfirst\" \"ac_cv_func__findfirst\"\nif test \"x$ac_cv_func__findfirst\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE__FINDFIRST 1\" >>confdefs.h\n\nfi\nac_fn_c_check_func \"$LINENO\" \"_findfirst64\" \"ac_cv_func__findfirst64\"\nif test \"x$ac_cv_func__findfirst64\" = xyes\nthen :\n  printf \"%s\\n\" \"#define HAVE__FINDFIRST64 1\" >>confdefs.h\n\nfi\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for library containing exp\" >&5\nprintf %s \"checking for library containing exp... \" >&6; }\nif test ${ac_cv_search_exp+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\nchar exp ();\nint\nmain (void)\n{\nreturn exp ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' m\ndo\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"\nthen :\n  ac_cv_search_exp=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext\n  if test ${ac_cv_search_exp+y}\nthen :\n  break\nfi\ndone\nif test ${ac_cv_search_exp+y}\nthen :\n\nelse $as_nop\n  ac_cv_search_exp=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_exp\" >&5\nprintf \"%s\\n\" \"$ac_cv_search_exp\" >&6; }\nac_res=$ac_cv_search_exp\nif test \"$ac_res\" != no\nthen :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\nfi\n\n\n\n# Check whether --with-libsndfile was given.\nif test ${with_libsndfile+y}\nthen :\n  withval=$with_libsndfile;\nfi\n\nif test x\"$with_libsndfile\" != xno\nthen :\n  if test x\"$with_libsndfile\" != x -a x\"$with_libsndfile\" != xyes\nthen :\n  for f in \"$with_libsndfile\"/lib*; do\n   if test -d \"$f\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -L\\\"$f\\\"\" >&5\nprintf %s \"checking if $CC accepts -L\\\"$f\\\"... \" >&6; }\n pa_add_flags__old_flags=\"$LDFLAGS\"\n LDFLAGS=\"$LDFLAGS -L\"$f\"\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   LDFLAGS=\"$pa_add_flags__old_flags -L\"$f\"\"\n\nprintf \"%s\\n\" \"#define LDFLAGS_L_F 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   LDFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n  done\n  for f in \"$with_libsndfile\"/include*; do\n   if test -d \"$f\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -I\\\"$f\\\"\" >&5\nprintf %s \"checking if $CC accepts -I\\\"$f\\\"... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -I\"$f\"\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -I\"$f\"\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_I_F 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n  done\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for library containing sf_readf_double\" >&5\nprintf %s \"checking for library containing sf_readf_double... \" >&6; }\nif test ${ac_cv_search_sf_readf_double+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\nchar sf_readf_double ();\nint\nmain (void)\n{\nreturn sf_readf_double ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' sndfile sndfile-1\ndo\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"\nthen :\n  ac_cv_search_sf_readf_double=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext\n  if test ${ac_cv_search_sf_readf_double+y}\nthen :\n  break\nfi\ndone\nif test ${ac_cv_search_sf_readf_double+y}\nthen :\n\nelse $as_nop\n  ac_cv_search_sf_readf_double=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sf_readf_double\" >&5\nprintf \"%s\\n\" \"$ac_cv_search_sf_readf_double\" >&6; }\nac_res=$ac_cv_search_sf_readf_double\nif test \"$ac_res\" != no\nthen :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n  EXTRA_PROGS='casdecode casencode'\nfi\n\n\nfi\n\n\n\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p\" >&5\nprintf %s \"checking for a race-free mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if test ${ac_cv_path_mkdir+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   as_fn_executable_p \"$as_dir$ac_prog$ac_exec_ext\" || continue\n\t   case `\"$as_dir$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir ('*'coreutils) '* | \\\n\t     'BusyBox '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test ${ac_cv_path_mkdir+y}; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\nprintf \"%s\\n\" \"$MKDIR_P\" >&6; }\n\n\n\n_pa_check_z80asm='z88dk/z80asm z88dk-z80asm z80asm'\n\n# Check whether --with-z80asm was given.\nif test ${with_z80asm+y}\nthen :\n  withval=$with_z80asm; _pa_check_z80asm=\"'$withval' $_pa_check_z80asm\"\nfi\n\n\n_pa_search_path_Z80ASM=\"${PATH_SEPARATOR}$PATH\"\n\n# Check whether --with-z88dk was given.\nif test ${with_z88dk+y}\nthen :\n  withval=$with_z88dk; _pa_search_path_Z80ASM=\"${PATH_SEPARATOR}${withval}${_pa_search_path_Z80ASM}\"\nfi\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for z80asm from zd88k\" >&5\nprintf %s \"checking for z80asm from zd88k... \" >&6; }\nif test ${ac_cv_path_Z80ASM+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -z \"$Z80ASM\"; then\n  ac_path_Z80ASM_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $_pa_search_path_Z80ASM\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_prog in $_pa_check_z80asm\n   do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_Z80ASM=\"$as_dir$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_Z80ASM\" || continue\n\n    if \"$ac_path_Z80ASM\" 2>&1 | grep -q '^Z80 Module Assembler' > /dev/null 2>&1\n    then\n        ac_cv_path_Z80ASM=\"$ac_path_Z80ASM\"\n\tac_path_Z80ASM_found=':'\n    fi\n\n      $ac_path_Z80ASM_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_Z80ASM\"; then\n    ac_cv_path_Z80ASM='not found'\n  fi\nelse\n  ac_cv_path_Z80ASM=$Z80ASM\nfi\n\nfi\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_Z80ASM\" >&5\nprintf \"%s\\n\" \"$ac_cv_path_Z80ASM\" >&6; }\n\nZ80ASM=z80asm\nif test x\"$ac_cv_path_Z80ASM\" != x'not found'\nthen :\n\n        Z80ASM=\"$ac_cv_path_Z80ASM\"\n        EXTRA_PROGS=\"$EXTRA_PROGS bin2abc\"\n\nfi\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=attributes\" >&5\nprintf %s \"checking if $CC accepts -Werror=attributes... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=attributes\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=attributes\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_ATTRIBUTES 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the noreturn function attribute\" >&5\nprintf %s \"checking if $CC supports the noreturn function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((noreturn))\n  bar(int);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_NORETURN 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the noreturn function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the noreturn function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((noreturn))\n  (*bar1)(int);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(1);\n}\n\ntypedef void *  __attribute__((noreturn))\n  (*bar_t)(int);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE_NORETURN 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the returns_nonnull function attribute\" >&5\nprintf %s \"checking if $CC supports the returns_nonnull function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((returns_nonnull))\n  bar(int);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the returns_nonnull function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the returns_nonnull function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((returns_nonnull))\n  (*bar1)(int);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(1);\n}\n\ntypedef void *  __attribute__((returns_nonnull))\n  (*bar_t)(int);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE_RETURNS_NONNULL 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the malloc function attribute\" >&5\nprintf %s \"checking if $CC supports the malloc function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((malloc))\n  bar(int);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_MALLOC 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the malloc function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the malloc function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((malloc))\n  (*bar1)(int);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(1);\n}\n\ntypedef void *  __attribute__((malloc))\n  (*bar_t)(int);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE_MALLOC 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the alloc_size((1)) function attribute\" >&5\nprintf %s \"checking if $CC supports the alloc_size((1)) function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((alloc_size((1))))\n  bar(int);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE1_ALLOC_SIZE 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the alloc_size((1)) function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the alloc_size((1)) function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((alloc_size((1))))\n  (*bar1)(int);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(1);\n}\n\ntypedef void *  __attribute__((alloc_size((1))))\n  (*bar_t)(int);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE1_ALLOC_SIZE 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the sentinel function attribute\" >&5\nprintf %s \"checking if $CC supports the sentinel function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((sentinel))\n  bar(const char *, ...);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(\"a\",\"b\",NULL);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_SENTINEL 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the sentinel function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the sentinel function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((sentinel))\n  (*bar1)(const char *, ...);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(\"a\",\"b\",NULL);\n}\n\ntypedef void *  __attribute__((sentinel))\n  (*bar_t)(const char *, ...);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(\"a\",\"b\",NULL);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE_SENTINEL 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the format((printf,1,2)) function attribute\" >&5\nprintf %s \"checking if $CC supports the format((printf,1,2)) function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern int  __attribute__((format((printf,1,2))))\n  bar(const char *, ...);\nint foo(void);\nint foo(void)\n{\n\treturn\n\t\tbar(\"%d\",1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE1_FORMAT 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the format((printf,1,2)) function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the format((printf,1,2)) function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern int  __attribute__((format((printf,1,2))))\n  (*bar1)(const char *, ...);\nint foo1(void);\nint foo1(void)\n{\n\treturn\n\t\tbar1(\"%d\",1);\n}\n\ntypedef int  __attribute__((format((printf,1,2))))\n  (*bar_t)(const char *, ...);\nextern bar_t bar2;\nint foo2(void);\nint foo2(void)\n{\n\treturn\n\t\tbar2(\"%d\",1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE1_FORMAT 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the const function attribute\" >&5\nprintf %s \"checking if $CC supports the const function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((const))\n  bar(int);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_CONST 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the const function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the const function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((const))\n  (*bar1)(int);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(1);\n}\n\ntypedef void *  __attribute__((const))\n  (*bar_t)(int);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE_CONST 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the pure function attribute\" >&5\nprintf %s \"checking if $CC supports the pure function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((pure))\n  bar(int);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_PURE 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the pure function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the pure function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((pure))\n  (*bar1)(int);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(1);\n}\n\ntypedef void *  __attribute__((pure))\n  (*bar_t)(int);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE_PURE 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the cold function attribute\" >&5\nprintf %s \"checking if $CC supports the cold function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((cold))\n  bar(int);\nvoid * foo(void);\nvoid * foo(void)\n{\n\treturn\n\t\tbar(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_COLD 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n\n\n { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the cold function attribute on pointers\" >&5\nprintf %s \"checking if $CC supports the cold function attribute on pointers... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void *  __attribute__((cold))\n  (*bar1)(int);\nvoid * foo1(void);\nvoid * foo1(void)\n{\n\treturn\n\t\tbar1(1);\n}\n\ntypedef void *  __attribute__((cold))\n  (*bar_t)(int);\nextern bar_t bar2;\nvoid * foo2(void);\nvoid * foo2(void)\n{\n\treturn\n\t\tbar2(1);\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_PTR_ATTRIBUTE_COLD 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports the error function attribute\" >&5\nprintf %s \"checking if $CC supports the error function attribute... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\nextern void __attribute__((error(\"message\"))) barf(void);\nvoid foo(void);\nvoid foo(void)\n{\n\tif (0)\n\t\tbarf();\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_FUNC_ATTRIBUTE_ERROR 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n\n # Check whether --enable-sections was given.\nif test ${enable_sections+y}\nthen :\n  enableval=$enable_sections; pa_arg_bool_enableval=\"$enableval\"\nelse $as_nop\n  pa_arg_bool_enableval=\"no\"\nfi\n\n\n if test x\"$pa_arg_bool_enableval\" != xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -ffunction-sections\" >&5\nprintf %s \"checking if $CC accepts -ffunction-sections... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -ffunction-sections\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -ffunction-sections\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FFUNCTION_SECTIONS 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fdata-sections\" >&5\nprintf %s \"checking if $CC accepts -fdata-sections... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fdata-sections\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fdata-sections\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FDATA_SECTIONS 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wl,--gc-sections\" >&5\nprintf %s \"checking if $CC accepts -Wl,--gc-sections... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -Wl,--gc-sections\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -Wl,--gc-sections\"\n\nprintf \"%s\\n\" \"#define CFLAGS_WL_GC_SECTIONS 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n\n\n\n\n # Check whether --enable-lto was given.\nif test ${enable_lto+y}\nthen :\n  enableval=$enable_lto; pa_arg_bool_enableval=\"$enableval\"\nelse $as_nop\n  pa_arg_bool_enableval=\"no\"\nfi\n\n\n if test x\"$pa_arg_bool_enableval\" != xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -flto\" >&5\nprintf %s \"checking if $CC accepts -flto... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -flto\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -flto\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FLTO 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n      ccbase=`echo \"$CC\" | awk '{ print $1; }'`\n  for ac_prog in ${ccbase}-ar\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC_AR+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC_AR\"; then\n  ac_cv_prog_CC_AR=\"$CC_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC_AR=\"$ac_prog\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC_AR=$ac_cv_prog_CC_AR\nif test -n \"$CC_AR\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC_AR\" >&5\nprintf \"%s\\n\" \"$CC_AR\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n  test -n \"$CC_AR\" && break\ndone\ntest -n \"$CC_AR\" || CC_AR=\"$ac_cv_prog_AR\"\n\n  AR=\"$CC_AR\"\n  for ac_prog in ${ccbase}-ranlib\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\nprintf %s \"checking for $ac_word... \" >&6; }\nif test ${ac_cv_prog_CC_RANLIB+y}\nthen :\n  printf %s \"(cached) \" >&6\nelse $as_nop\n  if test -n \"$CC_RANLIB\"; then\n  ac_cv_prog_CC_RANLIB=\"$CC_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC_RANLIB=\"$ac_prog\"\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC_RANLIB=$ac_cv_prog_CC_RANLIB\nif test -n \"$CC_RANLIB\"; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: $CC_RANLIB\" >&5\nprintf \"%s\\n\" \"$CC_RANLIB\" >&6; }\nelse\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\nfi\n\n\n  test -n \"$CC_RANLIB\" && break\ndone\ntest -n \"$CC_RANLIB\" || CC_RANLIB=\"$ac_cv_prog_RANLIB\"\n\n  RANLIB=\"$CC_RANLIB\"\nfi\n\n\n\n\n # Check whether --enable-sanitizer was given.\nif test ${enable_sanitizer+y}\nthen :\n  enableval=$enable_sanitizer; pa_arg_bool_enableval=\"$enableval\"\nelse $as_nop\n  pa_arg_bool_enableval=\"no\"\nfi\n\n\n if test x\"$pa_arg_bool_enableval\" != xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-omit-frame-pointer\" >&5\nprintf %s \"checking if $CC accepts -fno-omit-frame-pointer... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fno-omit-frame-pointer\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fno-omit-frame-pointer\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FNO_OMIT_FRAME_POINTER 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fsanitize=address\" >&5\nprintf %s \"checking if $CC accepts -fsanitize=address... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fsanitize=address\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fsanitize=address\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FSANITIZE_ADDRESS 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fsanitize=undefined\" >&5\nprintf %s \"checking if $CC accepts -fsanitize=undefined... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fsanitize=undefined\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fsanitize=undefined\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FSANITIZE_UNDEFINED 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fvisibility=hidden\" >&5\nprintf %s \"checking if $CC accepts -fvisibility=hidden... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fvisibility=hidden\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fvisibility=hidden\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FVISIBILITY_HIDDEN 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -W\" >&5\nprintf %s \"checking if $CC accepts -W... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -W\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -W\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_W 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wall\" >&5\nprintf %s \"checking if $CC accepts -Wall... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Wall\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Wall\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WALL 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -pedantic\" >&5\nprintf %s \"checking if $CC accepts -pedantic... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -pedantic\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -pedantic\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_PEDANTIC 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=unknown-warning-option\" >&5\nprintf %s \"checking if $CC accepts -Werror=unknown-warning-option... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=unknown-warning-option\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=unknown-warning-option\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_UNKNOWN_WARNING_OPTION 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wpedantic-ms-format\" >&5\nprintf %s \"checking if $CC accepts -Wpedantic-ms-format... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Wpedantic-ms-format\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Wno-pedantic-ms-format\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WPEDANTIC_MS_FORMAT 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Wstringop-truncation\" >&5\nprintf %s \"checking if $CC accepts -Wstringop-truncation... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Wstringop-truncation\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Wno-stringop-truncation\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WSTRINGOP_TRUNCATION 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\n # Check whether --enable-werror was given.\nif test ${enable_werror+y}\nthen :\n  enableval=$enable_werror; pa_arg_bool_enableval=\"$enableval\"\nelse $as_nop\n  pa_arg_bool_enableval=\"no\"\nfi\n\n\n if test x\"$pa_arg_bool_enableval\" != xno\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror\" >&5\nprintf %s \"checking if $CC accepts -Werror... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=implicit\" >&5\nprintf %s \"checking if $CC accepts -Werror=implicit... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=implicit\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=implicit\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_IMPLICIT 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=missing-braces\" >&5\nprintf %s \"checking if $CC accepts -Werror=missing-braces... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=missing-braces\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=missing-braces\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_MISSING_BRACES 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=return-type\" >&5\nprintf %s \"checking if $CC accepts -Werror=return-type... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=return-type\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=return-type\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_RETURN_TYPE 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=trigraphs\" >&5\nprintf %s \"checking if $CC accepts -Werror=trigraphs... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=trigraphs\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=trigraphs\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_TRIGRAPHS 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=pointer-arith\" >&5\nprintf %s \"checking if $CC accepts -Werror=pointer-arith... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=pointer-arith\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=pointer-arith\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_POINTER_ARITH 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=strict-prototypes\" >&5\nprintf %s \"checking if $CC accepts -Werror=strict-prototypes... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=strict-prototypes\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=strict-prototypes\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_STRICT_PROTOTYPES 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=missing-prototypes\" >&5\nprintf %s \"checking if $CC accepts -Werror=missing-prototypes... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=missing-prototypes\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=missing-prototypes\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_MISSING_PROTOTYPES 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=missing-declarations\" >&5\nprintf %s \"checking if $CC accepts -Werror=missing-declarations... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=missing-declarations\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=missing-declarations\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_MISSING_DECLARATIONS 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=comment\" >&5\nprintf %s \"checking if $CC accepts -Werror=comment... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=comment\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=comment\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_COMMENT 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -Werror=vla\" >&5\nprintf %s \"checking if $CC accepts -Werror=vla... \" >&6; }\n pa_add_flags__old_flags=\"$CPPFLAGS\"\n CPPFLAGS=\"$CPPFLAGS -Werror=vla\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags -Werror=vla\"\n\nprintf \"%s\\n\" \"#define CPPFLAGS_WERROR_VLA 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CPPFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\n\nfi\n\n\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC supports C99 external inlines\" >&5\nprintf %s \"checking if $CC supports C99 external inlines... \" >&6; }\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n$ac_includes_default\n\n/* Don't mistake GNU inlines for c99 */\n#if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__)\n# error \"Using gnu inline standard\"\n#endif\n\ninline int foo(int x)\n{\n\treturn x+1;\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n\nprintf \"%s\\n\" \"#define HAVE_STDC_INLINE 1\" >>confdefs.h\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fgnu89-inline\" >&5\nprintf %s \"checking if $CC accepts -fgnu89-inline... \" >&6; }\n pa_add_flags__old_flags=\"$CFLAGS\"\n CFLAGS=\"$CFLAGS -fgnu89-inline\"\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain (void)\n{\nprintf(\"Hello, World!\\n\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"\nthen :\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\nprintf \"%s\\n\" \"yes\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags -fgnu89-inline\"\n\nprintf \"%s\\n\" \"#define CFLAGS_FGNU89_INLINE 1\" >>confdefs.h\n\n\nelse $as_nop\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\nprintf \"%s\\n\" \"no\" >&6; }\n   CFLAGS=\"$pa_add_flags__old_flags\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext\n\n\n\n # Check whether --enable-ccache was given.\nif test ${enable_ccache+y}\nthen :\n  enableval=$enable_ccache; pa_arg_bool_enableval=\"$enableval\"\nelse $as_nop\n  pa_arg_bool_enableval=\"no\"\nfi\n\n\n if test x\"$pa_arg_bool_enableval\" != xno\nthen :\n  CC=\"ccache $CC\"\nfi\n\n\nac_config_files=\"$ac_config_files Makefile\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test ${\\1+y} || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\nprintf \"%s\\n\" \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\nprintf \"%s\\n\" \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`printf \"%s\\n\" \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\nprintf \"%s\\n\" \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nas_nop=:\nif test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1\nthen :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse $as_nop\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\n\n# Reset variables that may have inherited troublesome values from\n# the environment.\n\n# IFS needs to be set, to space, tab, and newline, in precisely that order.\n# (If _AS_PATH_WALK were called with IFS unset, it would have the\n# side effect of setting IFS to empty, thus disabling word splitting.)\n# Quoting is to prevent editors from complaining about space-tab.\nas_nl='\n'\nexport as_nl\nIFS=\" \"\"\t$as_nl\"\n\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# Ensure predictable behavior from utilities with locale-dependent output.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# We cannot yet rely on \"unset\" to work, but we need these variables\n# to be unset--not just set to an empty or harmless value--now, to\n# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct\n# also avoids known problems related to \"unset\" and subshell syntax\n# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).\nfor as_var in BASH_ENV ENV MAIL MAILPATH CDPATH\ndo eval test \\${$as_var+y} \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\n\n# Ensure that fds 0, 1, and 2 are open.\nif (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi\nif (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi\nif (exec 3>&2)            ; then :; else exec 2>/dev/null; fi\n\n# The user is always right.\nif ${PATH_SEPARATOR+false} :; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  case $as_dir in #(((\n    '') as_dir=./ ;;\n    */) ;;\n    *) as_dir=$as_dir/ ;;\n  esac\n    test -r \"$as_dir$0\" && as_myself=$as_dir$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  printf \"%s\\n\" \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  printf \"%s\\n\" \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null\nthen :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse $as_nop\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null\nthen :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse $as_nop\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n# Determine whether it's possible to make 'echo' print without a newline.\n# These variables are no longer used directly by Autoconf, but are AC_SUBSTed\n# for compatibility with existing Makefiles.\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\n# For backward compatibility with old third-party macros, we provide\n# the shell variables $as_echo and $as_echo_n.  New code should use\n# AS_ECHO([\"message\"]) and AS_ECHO_N([\"message\"]), respectively.\nas_echo='printf %s\\n'\nas_echo_n='printf %s'\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`printf \"%s\\n\" \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by $as_me, which was\ngenerated by GNU Autoconf 2.71.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nReport bugs to the package provider.\"\n\n_ACEOF\nac_cs_config=`printf \"%s\\n\" \"$ac_configure_args\" | sed \"$ac_safe_unquote\"`\nac_cs_config_escaped=`printf \"%s\\n\" \"$ac_cs_config\" | sed \"s/^ //; s/'/'\\\\\\\\\\\\\\\\''/g\"`\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config='$ac_cs_config_escaped'\nac_cs_version=\"\\\\\nconfig.status\nconfigured by $0, generated by GNU Autoconf 2.71,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2021 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    printf \"%s\\n\" \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    printf \"%s\\n\" \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`printf \"%s\\n\" \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`printf \"%s\\n\" \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error $? \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    printf \"%s\\n\" \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X $SHELL '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\printf \"%s\\n\" \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  printf \"%s\\n\" \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"config/config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS config/config.h\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files\n  test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$ac_tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_tt=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_tt\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error $? \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    \"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`printf \"%s\\n\" \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  printf \"%s\\n\" \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\nprintf \"%s\\n\" \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`printf \"%s\\n\" \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\nprintf \"%s\\n\" X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`printf \"%s\\n\" \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`printf \"%s\\n\" \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      printf \"%s\\n\" \"/* $configure_input  */\" >&1 \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$ac_tmp/config.h\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$ac_tmp/config.h\" >/dev/null 2>&1; then\n      { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\nprintf \"%s\\n\" \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$ac_tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    printf \"%s\\n\" \"/* $configure_input  */\" >&1 \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error $? \"could not create -\" \"$LINENO\" 5\n  fi\n ;;\n\n\n  esac\n\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { printf \"%s\\n\" \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\nprintf \"%s\\n\" \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/configure.ac",
    "content": "dnl Process this file with autoconf 2.69 or later to produce\ndnl a configure script.\nAC_PREREQ([2.69])\n\nAC_CONFIG_MACRO_DIR(autoconf)\nAC_CONFIG_MACRO_DIRS(autoconf)\n\nAC_INIT(abcwrite.c)\nAC_CONFIG_HEADERS(config/config.h)\n\nAC_CONFIG_AUX_DIR(autoconf/helpers)\n\ndnl If we have wine installed, don't run it when checking for cross-compile\nWINELOADER=/dev/null\nexport WINELOADER\n\nAC_PREFIX_PROGRAM(abcwrite)\n\ndnl Get canonical target (\"host\") name\nAC_CANONICAL_HOST\n\ndnl Checks for programs.\nAC_USE_SYSTEM_EXTENSIONS\nAC_PROG_CC\nAC_PROG_CC_C99\nAC_PROG_LN_S\nAC_PROG_MAKE_SET\nAC_PROG_INSTALL\n\ndnl Checks for typedefs, structures, and compiler characteristics.\nAC_C_CONST\nAC_C_INLINE\nAC_C_RESTRICT\nAC_TYPE_SIZE_T\n\ndnl Check for endianness\nAC_C_BIGENDIAN(AC_DEFINE(WORDS_BIGENDIAN),AC_DEFINE(WORDS_LITTLEENDIAN),,)\nAH_TEMPLATE(WORDS_BIGENDIAN,\n[Define to 1 if your processor stores words with the most significant\nbyte first (like Motorola and SPARC, unlike Intel and VAX).])\nAH_TEMPLATE(WORDS_LITTLEENDIAN,\n[Define to 1 if your processor stores words with the least significant\nbyte first (like Intel and VAX, unlike Motorola and SPARC).])\n\ndnl Checks for standard header files.\nAC_HEADER_STDC\nAC_HEADER_STDBOOL\nAC_CHECK_HEADERS(inttypes.h)\nAC_CHECK_HEADERS(stdnoreturn.h)\n\ndnl Force gcc and gcc-compatible compilers treat signed integers\ndnl as 2's complement\nPA_ADD_CFLAGS([-fwrapv])\n\ndnl Some environments abuse __STRICT_ANSI__ to disable some\ndnl function declarations\nPA_ADD_CPPFLAGS([-U__STRICT_ANSI__])\n\ndnl Don't put things in common if we can avoid it.  We don't want to\ndnl assume all compilers support common, and this will help find those\ndnl problems.  This also works around an OSX linker problem.\nPA_ADD_CFLAGS([-fno-common])\n\ndnl No need for super strict IEEE compatibility\nPA_ADD_CFLAGS([-ffast-math])\n\ndnl Can we drop unneeded libraries?\nPA_ADD_LDFLAGS([-Wl,--as-needed])\n\ndnl gcc stack protector; also needed for MinGW to build dirent.h correctly...\nPA_ADD_CFLAGS([-fstack-protector])\n\ndnl Compiler intrinsics\nPA_ADD_HEADERS(intrin.h)\nPA_HAVE_FUNC(__builtin_expect, (1,1))\nPA_HAVE_FUNC(__builtin_constant_p, (0))\n\nAC_CHECK_HEADERS(dirent.h)\nAC_CHECK_HEADERS(sys/types.h)\nAC_CHECK_HEADERS(sys/stat.h)\nAC_CHECK_HEADERS(sys/time.h)\nAC_CHECK_HEADERS(unistd.h)\nAC_CHECK_HEADERS(fcntl.h)\nAC_CHECK_HEADERS(io.h)\nAC_CHECK_HEADERS(windows.h)\nAC_CHECK_HEADERS(direct.h)\n\ndnl Useful functions...\nAC_CHECK_FUNCS(mempcpy)\n\ndnl These types are POSIX-specific, and Windows does it differently...\nAC_CHECK_TYPES([struct _stat64])\nAC_CHECK_TYPES([struct stat])\nAC_CHECK_FUNCS([stat _stat64])\nAC_CHECK_FUNCS([fstat _fstat64])\n\ndnl Newer versions of POSIX have this\nAC_CHECK_TYPES(mode_t)\n\ndnl Windows directory handling\nAC_CHECK_FUNCS(_mkdir)\nAC_CHECK_FUNCS([_findfirst _findfirst64])\n\ndnl Math\nAC_SEARCH_LIBS(exp, [m])\n\ndnl libsndfile\nAC_ARG_WITH([libsndfile],\n  AS_HELP_STRING([--with-libsndfile=dir],\n  [location of libsndfile install]))\nAS_IF([test x\"$with_libsndfile\" != xno],\n[AS_IF([test x\"$with_libsndfile\" != x -a x\"$with_libsndfile\" != xyes],\n [for f in \"$with_libsndfile\"/lib*; do\n   AS_IF([test -d \"$f\"], [PA_ADD_LDFLAGS([-L\"$f\"])])\n  done\n  for f in \"$with_libsndfile\"/include*; do\n   AS_IF([test -d \"$f\"], [PA_ADD_CPPFLAGS([-I\"$f\"])])\n  done\n ])\nAC_SEARCH_LIBS(sf_readf_double, [sndfile sndfile-1],\n [EXTRA_PROGS='casdecode casencode'])\n])\nAC_SUBST(EXTRA_PROGS)\n\ndnl Programs\nAC_PROG_MKDIR_P\nAC_PROG_INSTALL\n\ndnl To build the assembly sources, we need z80asm from z88dk\n_pa_check_z80asm='z88dk-z80asm'\nAC_ARG_WITH([z80asm],\n    AS_HELP_STRING([--with-z80asm=name],\n    [name of z88dk z80asm assembler with --reloc-info support]),\n    [_pa_check_z80asm=\"'$withval' $_pa_check_z80asm\"])\n\n_pa_search_path_Z80ASM=\"${PATH_SEPARATOR}$PATH\"\nAC_ARG_WITH([z88dk],\n    AS_HELP_STRING([--with-z88dk=path],\n    [path to z88dk executables (used for z80asm)]),\n    [_pa_search_path_Z80ASM=\"${PATH_SEPARATOR}${withval}${_pa_search_path_Z80ASM}\"])\n\nAC_CACHE_CHECK([for z80asm from zd88k],\n[ac_cv_path_Z80ASM],\n[AC_PATH_PROGS_FEATURE_CHECK([Z80ASM],\n\t[$_pa_check_z80asm],\n  [[\n    if \"$ac_path_Z80ASM\" 2>&1 | grep -q '^Z80 Module Assembler' > /dev/null 2>&1\n    then\n        ac_cv_path_Z80ASM=\"$ac_path_Z80ASM\"\n\tac_path_Z80ASM_found=':'\n    fi\n    ]],\n    [ac_cv_path_Z80ASM='not found'],\n    [$_pa_search_path_Z80ASM])])\n\nZ80ASM=z88dk-z80asm\nAS_IF([test x\"$ac_cv_path_Z80ASM\" != x'not found'],\n      [\n        Z80ASM=\"$ac_cv_path_Z80ASM\"\n        EXTRA_PROGS=\"$EXTRA_PROGS bin2abc\"\n      ])\nAC_SUBST(Z80ASM)\n\ndnl\ndnl Check for supported gcc attributes; some compilers (e.g. Sun CC)\ndnl support these, but don't define __GNUC__ as they don't support\ndnl some other features of gcc.\ndnl\nPA_ADD_CPPFLAGS([-Werror=attributes])\nPA_FUNC_ATTRIBUTE(noreturn)\nPA_FUNC_ATTRIBUTE(returns_nonnull)\nPA_FUNC_ATTRIBUTE(malloc)\nPA_FUNC_ATTRIBUTE(alloc_size, (1))\nPA_FUNC_ATTRIBUTE(sentinel,,, [const char *, ...], [\"a\",\"b\",NULL])\nPA_FUNC_ATTRIBUTE(format, [(printf,1,2)], int, [const char *, ...], [\"%d\",1])\nPA_FUNC_ATTRIBUTE(const)\nPA_FUNC_ATTRIBUTE(pure)\nPA_FUNC_ATTRIBUTE(cold)\nPA_FUNC_ATTRIBUTE_ERROR\n\ndnl\ndnl support function sections (if available)\ndnl\nPA_ARG_ENABLED([sections],\n [compile with function/data section support],\n [PA_ADD_CFLAGS([-ffunction-sections])\n  PA_ADD_CFLAGS([-fdata-sections])\n  PA_ADD_CFLAGS([-Wl,--gc-sections])],\n [])\n\ndnl\ndnl support LTO\ndnl\nPA_ARG_ENABLED([lto],\n [compile with gcc-style link time optimization],\n [PA_ADD_CFLAGS([-flto])\n  dnl Note: we use _PROG rather than _TOOL since we are prepending the full\n  dnl CC name which ought to already contain the host triplet if needed\n  ccbase=`echo \"$CC\" | awk '{ print $1; }'`\n  AC_CHECK_PROGS(CC_AR, [${ccbase}-ar], [$ac_cv_prog_AR])\n  AR=\"$CC_AR\"\n  AC_CHECK_PROGS(CC_RANLIB, [${ccbase}-ranlib], [$ac_cv_prog_RANLIB])\n  RANLIB=\"$CC_RANLIB\"], [])\n\ndnl\ndnl support sanitizers (if available)\ndnl\nPA_ARG_ENABLED([sanitizer],\n [compile with sanitizers enabled],\n [PA_ADD_CFLAGS([-fno-omit-frame-pointer])\n  PA_ADD_CFLAGS([-fsanitize=address])\n  PA_ADD_CFLAGS([-fsanitize=undefined])])\n\ndnl\ndnl Don't make symbols visible, there is no point and it just\ndnl makes the code slower.\ndnl\nPA_ADD_CFLAGS([-fvisibility=hidden])\n\ndnl If we have gcc, add appropriate code cleanliness options\nPA_ADD_CPPFLAGS([-W])\nPA_ADD_CPPFLAGS([-Wall])\nPA_ADD_CPPFLAGS([-pedantic])\ndnl LLVM doesn't error out on invalid -W options unless this option is\ndnl specified first.  Enable this so this script can actually discover\ndnl which -W options are possible for this compiler.\nPA_ADD_CPPFLAGS([-Werror=unknown-warning-option])\ndnl Suppress format warning on Windows targets due to their <inttypes.h>\nPA_ADD_CPPFLAGS([-Wpedantic-ms-format],[-Wno-pedantic-ms-format])\ndnl This is needed because we intentionally expect strncpy() to fill\ndnl in a zero-padded (not zero-terminated) buffer in several backends\nPA_ADD_CPPFLAGS([-Wstringop-truncation],[-Wno-stringop-truncation])\ndnl PA_ADD_CPPFLAGS([-Wwrite-strings])\nPA_ARG_ENABLED([werror],\n [compile with -Werror to error out on any warning],\n [PA_ADD_CPPFLAGS([-Werror])],\n [PA_ADD_CPPFLAGS([-Werror=implicit])\n  PA_ADD_CPPFLAGS([-Werror=missing-braces])\n  PA_ADD_CPPFLAGS([-Werror=return-type])\n  PA_ADD_CPPFLAGS([-Werror=trigraphs])\n  PA_ADD_CPPFLAGS([-Werror=pointer-arith])\n  PA_ADD_CPPFLAGS([-Werror=strict-prototypes])\n  PA_ADD_CPPFLAGS([-Werror=missing-prototypes])\n  PA_ADD_CPPFLAGS([-Werror=missing-declarations])\n  PA_ADD_CPPFLAGS([-Werror=comment])\n  PA_ADD_CPPFLAGS([-Werror=vla])]\n)\n\ndnl\ndnl On some versions of gcc, -Werror=missing-prototypes causes problems\ndnl with C99-style external inlines.  Test this *after* adding the -Werror\ndnl options.\ndnl\nPA_CHECK_BAD_STDC_INLINE\n\ndnl\ndnl support ccache\ndnl\nPA_ARG_ENABLED([ccache], [compile with ccache], [CC=\"ccache $CC\"], [])\n\nAC_CONFIG_FILES([Makefile])\nAC_OUTPUT\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/deinter.c",
    "content": "/*\n * deinter.c\n *\n * Undo software interleaving\n */\n\n#include \"abcdisk.h\"\n\nint main(int argc, char *argv[])\n{\n    int sectsize;\n    int ileave;\n    int ilsize;\n    FILE *f;\n    char *buf;\n    int i, j;\n\n    if (argc < 2 || (argv[1][0] == '-' && !argv[1][1])) {\n\tfprintf(stderr, \"abcdisk %s\\n\", VERSION);\n        fprintf(stderr, \"Usage: %s file [ileave [ilsize [sector]]]\\n\", argv[0]);\n        exit(1);\n    }\n\n    f = fopen(argv[1], \"rb\");\n    if (!f) {\n        perror(argv[1]);\n        exit(1);\n    }\n\n    ileave = (argc > 2) ? atoi(argv[2]) : 7;\n    ilsize = (argc > 3) ? atoi(argv[3]) : 16;\n    sectsize = (argc > 4) ? atoi(argv[4]) : 256;\n\n    buf = xmalloc(sectsize * ilsize);\n\n    while (fread(buf, 1, sectsize * ilsize, f))\n        for (i = 0, j = 0; i < ilsize; i++, j = (j + ileave) % ilsize)\n            fwrite(buf + j * sectsize, 1, sectsize, stdout);\n\n    fclose(f);\n\n    return 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/formats.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include \"abcdisk.h\"\n\n#define F(c,h,s) (c),(h),(s),((c)*(h)*(s))\n\nstatic const struct diskfmt formats[] = {\n    { \"fd2\",\t    F( 40,1, 8), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"dd80\",\t    F( 40,1, 8), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"fd2d\",\t    F( 40,1,16), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"dd82\",\t    F( 40,1,16), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"abc830\",     F( 40,1,16), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"mo\",         F( 40,1,16), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"fd4d\",       F( 40,2,16), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"dd84\",       F( 40,2,16), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"abc832\",     F( 80,2,16), 2, 14, { 16, 0 }, 16, 1, 0, 0, false },\n    { \"abc832-old\", F( 80,2,16), 2, 14, { 8, 16 },  8, 1, 0, 0, false },\n    { \"abc834\",     F( 80,2,16), 2, 14, { 16, 0 }, 16, 1, 0, 0, false },\n    { \"mf\",         F( 80,2,16), 2, 14, { 16, 0 }, 16, 1, 0, 0, false },\n    /*\n     * 8\" floppies have a different logical sector/track (126/2/16)\n     * mapping than the physical one (which is 77/2/26), and\n     * then the last virtual track is only partially filled.\n     * Furthermore, the first physical track (26 sectors) is unused.\n     */\n    { \"abc838\",     77, 2, 26, 3978, 2,  6, { 8, 16 },  8, 1, 0, 0, false },\n    { \"abc838-ufd\", 77, 2, 26, 3978, 2, 14, { 16, 0 }, 16, 1, 0, 0, false },\n    { \"sf\",         77, 2, 26, 3978, 2, 14, { 16, 0 }, 16, 1, 0, 0, false },\n    { \"hd\",         F(238,8,32),     5, 14, { 16, 0 }, 16, 1, 0, 0, false },\n\n    /* MEG80 ROM-disk: extended MO drive with 48 tracks */\n    { \"rom\",        F( 48,1,16), 0,  6, { 8, 16 },  8, 1, 0, 0, false },\n};\n\nstatic const int nformats = (sizeof(formats)/sizeof(formats[0]));\n\nconst struct diskfmt *get_format(const char *name)\n{\n    const struct diskfmt *fmt;\n    int i;\n\n    for (i = 0, fmt = formats; i < nformats; i++, fmt++) {\n\tif (!strcmp(fmt->name, name))\n\t    return fmt;\n    }\n\n    return NULL;\n}\n\nvoid show_formats(FILE *f)\n{\n    const struct diskfmt *fmt;\n    int i;\n\n    fprintf(f, \"Format      Tracks  Sides  Sec/trk  Cluster  Sectors  Total  System   MFD\\n\");\n\n    for (i = 0, fmt = formats; i < nformats; i++, fmt++) {\n\tfprintf(f, \"%-11s %4d %6d %7d %9d %9d %6dK %7d %3d/%2d\\n\",\n\t\tfmt->name, fmt->c, fmt->h, fmt->s,\n\t\t1 << fmt->cluster_shift,\n\t\tfmt->sectors, fmt->sectors >> 2, fmt->syssec,\n\t\tfmt->dirsec[0], fmt->dirsecs);\n    }\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/ihex.c",
    "content": "#include \"bin2abc.h\"\n\n#include <ctype.h>\n\n#define MAXLINE BUFSIZ\n\nstatic int hexval(unsigned char c)\n{\n    if (!isxdigit(c))\n        return -1;\n\n    c &= 0x4f;\n    if (c > 9)\n        c -= ('A' - 10);\n    return c;\n}\n\nstatic long gethex(char **pp, uint8_t * csum, int bytes)\n{\n    long v = 0;\n    int sh = 0;\n    const char *p = *pp;\n\n    while (bytes--) {\n        int c1, c2;\n\n        c1 = hexval(*p++);\n        if (c1 < 0) {\n            v = -1L;\n            break;\n        }\n        c2 = hexval(*p++);\n        if (c2 < 0) {\n            v = -1L;\n            break;\n        }\n        c2 += (c1 << 4);\n        if (csum)\n            *csum += c2;\n\n        v += (unsigned long)c2 << sh;\n        sh += 8;\n    }\n\n    *pp = (char *)p;\n    return v;\n}\n\nstatic int parse_line(char *p, uint8_t *data, bool *isset, int *entrypt)\n{\n    uint8_t csum;\n    int databytes, type, checksum;\n    int d, n, i;\n    int address;\n    uint8_t buf[256];\n    int myentry;\n    int rv = 0;\n\n    csum = 0;\n\n    if ((databytes = gethex(&p, &csum, 1)) < 0)\n        goto fail;\n\n    if ((address = gethex(&p, &csum, 2)) < 0)\n        goto fail;\n\n    if ((type = gethex(&p, &csum, 1)) < 0)\n        goto fail;\n\n    myentry = *entrypt;\n\n    switch (type) {\n    case 0:\n        /* Data record */\n        if (myentry < 0)\n            myentry = address;\n        for (n = 0; n < databytes; n++) {\n            if ((d = gethex(&p, &csum, 1)) < 0)\n                goto fail;\n\n            buf[n] = d;\n        }\n        break;\n\n    case 1:\n        /* End of file/entry point record */\n        if (databytes != 0)\n            goto fail;\n\n        rv = -2;\n        if (address > 0)        /* Unofficial but common extension */\n            myentry = address;\n        break;\n\n    case 5:\n        /* Linear start address (entrypoint) */\n        if (databytes != 4)\n            goto fail;\n\n        myentry = gethex(&p, &csum, 4);\n        break;\n\n    default:\n        goto fail;              /* Unknow record */\n    }\n\n    if ((checksum = gethex(&p, NULL, 1)) < 0)\n        goto fail;\n\n    if (checksum != (uint8_t) - csum)\n        goto fail;\n\n    if (type == 0) {\n        memcpy(data + address, buf, databytes);\n        for (i = 0; i < databytes; i++)\n            isset[address + i] = true;\n    }\n\n    if (((unsigned int)myentry & ~0xffffU) == 0)\n        *entrypt = myentry;\n\n    return rv;\n\nfail:\n    errno = EINVAL;\n    return -1;\n}\n\nint readihex(struct bindata *in, const char *filename)\n{\n    char buffer[MAXLINE];\n    FILE *f;\n    unsigned int line = 0;\n    int err = 0;\n    int entry = -1;\n\n    f = open_file(filename, \"rt\");\n    if (!f)\n        return -1;\n\n    while (fgets(buffer, sizeof buffer, f)) {\n        line++;\n\n        if (buffer[0] != ':')\n            continue;\n\n        err = parse_line(buffer + 1, in->data, in->isset, &entry);\n\n        if (err == -2) {\n            err = 0;            /* Not actually an error */\n            break;              /* End of file */\n        } else if (err < 0) {\n            fprintf(stderr, \"%s: %s:%u: invalid Intel hex line format\\n\",\n                    program_name, filename, line);\n\t    break;\n        }\n    }\n    err |= close_file(f);\n\n    if (!err && in->entrypoint < 0)\n\tin->entrypoint = entry;\n\n    return err;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/mangle.c",
    "content": "/*\n * mangle.c:\n *\n * Converts filenames into ABC syntax (mangled and plain)\n *\n * Returns 0 for OK, -1 for failure (filename cannot be converted)\n */\n\n#include \"abcdisk.h\"\n\nstatic const wchar_t srcset[] =\n    L\"0123456789_.\"\n    L\"ÉABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÅÜÆØ\"\n    L\"éabcdefghijklmnopqrstuvwxyzäöåüæø\";\nstatic const unsigned char dstset[] =\n    \"0123456789_.\"\n    \"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^[\\\\\"\n    \"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^[\\\\\";\n\n/* Produces a mangled name, without dot */\nint mangle_name(unsigned char *dst, const char *src)\n{\n    unsigned char *d = dst;\n    const char *s, *p;\n    wchar_t sc;\n    const wchar_t *scp;\n    char dc;\n    int n;\n\n    if ((p = strrchr(src, '/')))\n        s = p + 1;\n    else\n        s = src;\n\n    memset(dst, ' ', 11);\n    dst[11] = '\\0';\n\n    mbtowc(NULL, NULL, 0);      /* Reset the shift state */\n\n    while (d < dst + 11 && (n = mbtowc(&sc, s, (size_t) ~ 0)) > 0) {\n        s += n;\n\n        if ((scp = wcschr(srcset, sc))) {\n            dc = dstset[scp - srcset];\n        } else {\n            dc = '_';\n        }\n\n        if (dc == '.')\n            d = dst + 8;\n        else\n            *d++ = dc;\n    }\n\n    return *s ? -1 : 0;\n}\n\n/*\n * Produces an unformatted filename in a buffer padded with CR.\n */\nint embed_name(unsigned char *dst, size_t len, const char *src)\n{\n    unsigned char *d = dst;\n    const char *s = src;\n    wchar_t sc;\n    const wchar_t *scp;\n    char dc;\n    int n;\n\n    memset(dst, '\\r', len);\n\n    mbtowc(NULL, NULL, 0);      /* Reset the shift state */\n\n    while (d < dst + len && (n = mbtowc(&sc, s, (size_t) ~ 0)) > 0) {\n        s += n;\n\n        if ((scp = wcschr(srcset, sc))) {\n            dc = dstset[scp - srcset];\n        } else if (sc == L':') {\n\t    dc = ':';\n\t} else {\n\t    return -1;\n\t}\n\t*d++ = dc;\n    }\n\n    return *s ? -1 : 0;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/mkrel",
    "content": "#!/bin/bash -xe\n\nproject=abcdisk\nwindll=''\nwinlib=\"$HOME/winlib\"\nreldir=../rel\nhere=\"$(pwd)\"\noutfile=casdecode\t# More or less any executable\nxlibs=\"$HOME/xlibs\"\t# Local install for cross-platform library packages\n\npv=\"$(git describe --abbrev=4)\"\n\nif [ -z \"$pv\" ]; then\n    set +x\n    echo \"$0: no version number obtained!\" 1>&2\n    exit 1\nfi\n\n\nrm -rf \"$reldir\"/\"$pv\"\nmkdir -p \"$reldir\"/\"$pv\"\ncd \"$reldir\"/\"$pv\"\n\n( cd \"$here\" && git archive --format=tar --prefix=\"$pv\"/ HEAD ) | \\\n    tar xvvf -\ncd \"$pv\"\n./autogen.sh\n./configure\nmake asmsrc\nmake clean confclean\ncd ..\ntar cvvf \"$pv\".tar \"$pv\"\nrm -f \"$pv\".tar.xz \"$pv\".tar.gz\nxz -9ek \"$pv\".tar\ngzip -9 \"$pv\".tar\n\n# Do a native build to make sure we checked in what we were support to...\nnative=$(sh \"$pv\"/autoconf/helpers/config.guess)\n# Other targets\ntargets='x86_64-w64-mingw32'\n\n# Search for Windows DLLs. This tries to get the transitive closure\n# of all DLLs that we use that are actually present in $dlldir.\nget_dlls () {\n    local x\n    local f\n    for x; do\n\tfor f in $(\"$target\"-strings $x | egrep -i '^[^[:space:]]+\\.dll$'); do\n\t    if [ ! -f \"$f\" ]; then\n\t\t# -maxdepth 4 is just a safety valve...\n\t\tdllfile=$(find -L $dllsearchdirs -maxdepth 4 \\\n\t\t\t       -type f -iname \"$f\" -print -quit)\n\t\tif [ -f \"$dllfile\" ]; then\n\t\t    cp \"$dllfile\" \"$f\"\n\t\t    get_dlls \"$f\"\n\t\tfi\n\t    fi\n\tdone\n    done\n}\n\nfor target in $native $targets; do\n    (\n\tsndfilepath=\"$xlibs/$target/libsndfile\"\n\tif [ -d \"$sndfilepath\"  ]; then\n\t    sndfileopt=\"--with-libsndfile=$sndfilepath\"\n\telse\n\t    sndfileopt=''\n\t    sndfilepath=''\n\tfi\n\n\tmkdir \"$target\"\n\tcd \"$target\"\n\ttar xf ../\"$pv\".tar.xz\n\t(\n\t    cd \"$pv\"\n\t    ./configure --host=\"$target\" \"$sndfileopt\"\n\t    make clean\n\t    make -j\n\t)\n\t# Windows?\n\tif [ -f \"$pv\"/\"$outfile\".exe ]; then\n\t    cc=$(sed -ne 's/^CC[[:space:]]*=[[:space:]]*//p' \"$pv\"/Makefile)\n\t    sysroot=$(\"$cc\" -print-sysroot)\n\t    if [ -d \"$sysroot\" ]; then\n\t\tdllsearchdirs=\"$sysroot $sndfilepath\"\n\t\t( cd \"$pv\" && get_dlls *.exe )\n\t    fi\n\t    mv \"$pv\" _build\n\t    mkdir \"$pv\"\n\t    cp $(find _build -type f \\( -iname '*.exe' -o -iname '*.dll' \\)) \\\n\t       \"$pv\"/\n\t    rm -f _build/stdout.txt _build/stderr.txt || true\n\t    for f in $(find _build -type f -iname '*.txt'); do\n\t\ttodos < \"$f\" > \"$pv\"/\"$(basename \"$f\")\"\n\t    done\n\t    zip -9r -o \"$pv\".zip \"$pv\"\n\tfi\n    )\ndone\n\nln x86_64-w64-mingw32/\"$pv\".zip \"$pv\"-win64.zip\n#ln i686-w64-mingw32/\"$pv\".zip   \"$pv\"-win32.zip\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/patchlevel.h",
    "content": "#define VERSION \"2.7\"\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/relocs.c",
    "content": "#include \"compiler.h\"\n#include \"bin2abc.h\"\n\n/*\n * Make sure we have a relocation buffer; also marks the output as relocatable\n */\nstatic void do_make_relocatable(struct bindata *in)\n{\n    if (likely(in->relocs))\n\treturn;\n\n    in->relocs = calloc(MAX_ADDR+1, sizeof(uint16_t));\n    in->nrelocs = 0;\n}\n\n/*\n * Load a file of relocations\n */\nvoid read_reloc_file(struct bindata *in, const char *filename)\n{\n    size_t n, i;\n\n    do_make_relocatable(in);\n\n    n = read_file(in->relocs + in->nrelocs, 2 * (MAX_ADDR - in->nrelocs),\n\t\t  filename);\n    n >>= 1;\n\n#ifdef WORDS_LITTLEENDIAN\n    (void)i;\t\t\t/* Already loaded */\n#else\n    /* Host byte order */\n    for (i = 0; i < n; i++) {\n        in->relocs[in->nrelocs + i] = letohs(in->relocs[in->nrelocs + i]);\n    }\n#endif\n    in->nrelocs += n;\n}\n\n/*\n * Push additional relocations onto the list\n */\nvoid push_reloc(struct bindata *in, uint16_t r)\n{\n    do_make_relocatable(in);\n    in->relocs[in->nrelocs++] = r;\n}\n\n/*\n * Pack relocations; this is done in place.\n * The value delta is added to the first replocation skip.\n *\n * If adjust is set then the first relocation is adjusted to\n * add the size of the relocation data itself to it.\n */\nstatic int sort_base;\n\n/*\n * Sort addresses, keeping in mind the sort_base starting point\n * Correct wraparound behavior here is really important!\n */\nstatic int sort_addrs(const void *p1, const void *p2)\n{\n    uint16_t a1 = *(const uint16_t *)p1 - sort_base;\n    uint16_t a2 = *(const uint16_t *)p2 - sort_base;\n\n    return a1 - a2;\n}\n\nint pack_relocs(struct bindata *in, int delta, bool adjust)\n{\n    uint8_t *p, *rbuf;\n    const uint16_t *rp;\n    uint16_t r, r0;\n    unsigned int rd;\n    int last;\n    int len;\n    int nrelocs = in->nrelocs;\n\n    sort_base = -delta;\n    qsort(in->relocs, nrelocs, sizeof *(in->relocs), sort_addrs);\n\n    /* +2 bytes for end marker and possibly adjustment */\n    in->packed_relocs = calloc(nrelocs+1, 2);\n\n    p = rbuf = in->packed_relocs + 1;  /* +1 in case we need adjust */\n\n    rp = in->relocs;\n    r0 = *rp + delta;\t\t/* Save the first relocation */\n\n    last = 0;\n    while (nrelocs--) {\n\tr = *rp++ + delta;\n\trd = r - last;\n        if (rd == 0) {\n            continue;           /* Duplicated relocation */\n        } else if (rd < 0x80) {\n            *p++ = rd;\n        } else if (rd < 0x7eff) {\n            *p++ = (rd >> 8) + 0x81;\n            *p++ = rd;\n        } else {\n            fprintf(stderr,\n                    \"%s: impossibly large relocation jump: 0x%x bytes\\n\",\n                    program_name, r);\n            return -1;\n        }\n        last = r + 2;\n    }\n    *p++ = 0x80;                /* End markerxs */\n    len = p - rbuf;\n\n    /* If len == 1 then all we have is the end marker, nothing to adjust */\n    if (len > 1 && adjust) {\n\tuint16_t r1 = r0 + len;\n\n        if (r1 > 0x7f) {\n            if (r0 <= 0x7f) {\n                rbuf--;         /* We saved a byte for this just in case */\n                r1++;           /* Add one more byte to the reloc length */\n                len++;\n            }\n\n            rbuf[0] = (r1 >> 8) + 0x81;\n            rbuf[1] = r1;\n        } else {\n            rbuf[0] = r1;\n        }\n    }\n\n    /* XXX: this loses the buffer for free(). */\n    in->packed_relocs = rbuf;\n    return in->packed_relocs_len = len;\n}\n\n/*\n * Apply relocations; this is the only option when dealing with\n * absolute file formats like .abs.\n */\nvoid apply_relocs(struct bindata *in)\n{\n    int origin = in->origin;\n    uint8_t *data = in->data;\n    const uint16_t *rp = in->relocs;\n    int i;\n\n    if (!rp)\n\treturn;\n\n    for (i = 0; i < in->nrelocs; i++) {\n\tuint16_t r = *rp++ + origin;\n\n\tset16(data+r, get16(data+r) + origin);\n    }\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/tag",
    "content": "#!/bin/bash\n\nproject='abcdisk'\n\nif [ -z \"$1\" ]; then\n    echo \"Usage: $0 version\" 1>&2\n    exit 1\nfi\n\nif [ \"$(git diff --cached | wc -l)\" != 0 ]; then\n    echo \"$0: changes already in git cache\" 1>&2\n    exit 1\nfi\n\necho \"#define VERSION \\\"$1\\\"\" > patchlevel.h\ngit add patchlevel.h\ngit commit -m \"$project $1\"\ngit tag -a -m \"$project $1\" \"$project-$1\"\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/unmangle.c",
    "content": "/*\n * unmangle.c\n *\n * Convert a filename in ABC encoding (without dot) to a proper filename\n * in host encoding.\n */\n\n#include \"abcdisk.h\"\n\nsize_t unmangle_filename(char *outbuf, const unsigned char *in)\n{\n    static const wchar_t my_tolower[256] =\n        L\"\\000\\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\"\n        L\"\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\n        L\" !\\\"#¤%&'()*+,-./0123456789:;<=>?\"\n        L\"éabcdefghijklmnopqrstuvwxyzäöåü_\"\n        L\"éabcdefghijklmnopqrstuvwxyzäöåü\\377\"\n        L\"\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\"\n        L\"\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\"\n        L\"\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\"\n        L\"\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\"\n        L\"\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\"\n        L\"\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\"\n        L\"\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\"\n        L\"\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377\";\n    int i;\n    char *out = outbuf;\n\n    wctomb(NULL, 0);\n\n    for (i = 0; i < 8; i++) {\n        if (*in != ' ')\n            out += wctomb(out, my_tolower[*in]);\n        in++;\n    }\n\n    if (memcmp(in, \"   \", 3) && memcmp(in, \"Ufd\", 3)) {\n        out += wctomb(out, L'.');\n        for (i = 0; i < 3; i++) {\n            if (*in != ' ')\n                out += wctomb(out, my_tolower[*in]);\n            in++;\n        }\n    }\n\n    *out = '\\0';\n\n    return out - outbuf;\n}\n"
  },
  {
    "path": "tools/z88dk/abc80/abcdisk-2.7/util.c",
    "content": "#include \"abcdisk.h\"\n\nconst char *program;\n\nvoid *xmalloc(size_t len)\n{\n    void *p;\n\n    if (!len)\n\tlen = 1;\n\n    p = malloc(len);\n\n    if (!p) {\n        perror(program);\n        exit(1);\n    }\n\n    return p;\n}\n\nvoid *xzalloc(size_t len)\n{\n    void *p;\n\n    if (!len)\n\tlen = 1;\n\n    p = calloc(len, 1);\n\n    if (!p) {\n        perror(program);\n        exit(1);\n    }\n\n    return p;\n}\n\nvoid *xrealloc(void *p, size_t newlen)\n{\n    if (!newlen)\n\tnewlen = 1;\n\n    p = realloc(p, newlen);\n\n    if (!p) {\n\tperror(program);\n\texit(1);\n    }\n\n    return p;\n}\n\n/*\n * Get a pointer to a certain sector, accounting for all the\n * various permutation options.\n */\nuint8_t *get_sector(const struct disk *disk, unsigned int sectnr)\n{\n    const struct diskfmt *fmt = disk->fmt;\n    unsigned int sintrack, track, sector;\n\n    sectnr  += fmt->dstart;\n    sintrack = sectnr % fmt->s;\n    track    = sectnr / fmt->s;\n\n    if (fmt->chflip) {\n\tunsigned int head     = track % fmt->h;\n\tunsigned int cyl      = track / fmt->h;\n\n\ttrack = cyl + head * fmt->c;\n    }\n\n    sector = (track * fmt->s) + ((sintrack * fmt->il + fmt->iloffs) % fmt->s);\n    return disk->image + (sector << 8);\n}\n\n/* Update data pointers after a change in fmt */\nvoid disk_update_ptrs(struct disk *disk)\n{\n    size_t metasize;\n    const struct diskfmt *fmt = disk->fmt;\n\n    if (!fmt)\n\treturn;\n\n    /* The MFD bitmap is the system sector */\n    disk->mfd.disk     = disk;\n    disk->mfd.bitmap  = disk->bitmap = get_sector(disk, fmt->syssec);\n    disk->mfd.dirsec  = fmt->dirsec[0];\n    disk->mfd.headsec = 0;\n\n    /* Per-sector metadata available to programs */\n    metasize = fmt->sectors * sizeof(struct sectmeta);\n    disk->meta = xrealloc(disk->meta, metasize);\n    memset(disk->meta, 0, metasize);\n}\n\nstruct disk *allocate_disk(const struct diskfmt *fmt)\n{\n    struct disk *disk = xzalloc(sizeof(struct disk));\n    size_t size = (fmt ? fmt->sectors : MAX_SECTORS) << 8;\n\n    disk->fmt = fmt;\n    disk->image = xmalloc(size);\n\n    /* Fill with FF mostly in case of a truncated disk image */\n    memset(disk->image, 0xff, size);\n\n    disk_update_ptrs(disk);\n    return disk;\n}\n\nvoid free_disk(struct disk *disk)\n{\n    if (disk) {\n\tfree(disk->image);\n\tfree(disk->meta);\n\tfree(disk);\n    }\n}\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/borra.bat",
    "content": "del *.obj\r\ndel *.sym"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cambios.txt",
    "content": "Cambios:\r\n\r\n11.11.2010\r\n*cpc_PrintGphStr0. Optimizado el cdigo, mucho menor y ms gil. Cdigo de Kevin Thacker utilizado en su juego Blue Angel 69.\r\n*cpc_PrintGphStr0M1. Optimizado el cdigo, mucho menor y ms gil. Basado en la idea del cdigo anterior.\r\n*cpc_PrintGphStr2X,cpc_PrintGphStrXY2X,cpc_PrintGphStrM12X,cpc_PrintGphStrXYM12X. Nuevas funciones para escribir caracteres grficos al doble de altura.Ejemplo 005 - Text\r\n\r\n13.04.2010\r\n*Vuelta atrs con alguna cosa: cpc_ShowTileMap vuelve al estado del 29.06.2009 y se borra cpc_ShowTileMap2.\r\n*cpc_ShowScrTileMap: Se aade esta funcin para mostrar el area visible del area de pantalla de un golpe. Ideal para actualizar la pantalla tras un scroll. Se debe ejecutar la primera vez que se muestre la pantalla de tiles de scroll.\r\n*cpc_ShowScrTileMap2: Se aade esta funcin para mostrar el area visible del area de pantalla de un golpe. Ideal para actualizar la pantalla tras un scroll. \r\n\r\n08.09.2009\r\n*Cambio importante en area de tiles. Se define pantalla virtual y pantalla real. Ambas no tienen porqu coincidir, se permite definir un margen horizontal y uno vertical donde no se ver nada. Con esto se consigue la impresin de ver entrar y salir a los sprites de la pantalla ya que se vern cortados.\r\n*TileMapConf.asm: Se definen dos nuevas constantes: T_WH y T_HH. stas indican tanto el margen de tiles derecho/izquierdo y superior/inferior invisible. \r\n*cpc_ShowTileMap2: Se aade esta funcin para mostrar el area visible del area de pantalla de un golpe. Ideal para actualizar la pantalla tras un scroll. \r\n*cpc_PutSpTileMapO: Rutina para hacer que los tiles que ocupa un sprite en pantalla se puedan borrar cuando el sprite sale de la misma.\r\n*cpc_ScrollLeft0,cpc_ScrollRight0: Rutinas modificadas para hacer el scroll del mapa de tiles: Actan contra el superbuffer y contra el mapa de tiles.             \r\n*cpc_ScrollLeft, cpc_ScrollRight: Por ahora se desactivan.\r\n*Se cambia el ejemplo previo de scroll por uno nuevo que demuestra el uso del scroll de mapa de tiles con sprites. (Ejemplo 12)\r\n\r\n\r\n29.06.2009\r\n*cpc_ShowTileMap: Ampliada la funcionalidad para soportar 255 tiles en lugar de 254.  \r\n\r\n30.03.2009\r\n*cpc_ClrScr: Rellena la pantalla con la tinta 0\r\n*cpc_DisableFirmware: Desactiva el salto de las interrupciones al firmware.\r\n*cpc_PrintGphStrStd: Rutina para escribir en modo 0 caracteres de 8x8 pixels.\r\n*cpc_PrintGphStrStdXY: Rutina para escribir en modo 0 caracteres de 8x8 pixels.\r\n*cpc_ShowTileMap: Quitada la desactivacin de interrupciones que tena.\r\n*cpc_RRI, cpc_RLI: Corregido un bug al usar un registro ndice.\r\n*cpc_ScanKeyboard: Rutina nueva para escanear todo el teclado, tomada de los artculos de programacin de teclado de CPCWiki\r\n*cpc_TestKeyF: Nueva rutina para usar despus de cpc_ScanKeyboard,comprueba si una tecla se ha pulsado. Si se van a probar 3  ms teclas es ms rpida que la rutina anterior cpc_TestKey\r\n\r\n\r\n23.03.2009\r\n*cpc_RRI: <- moves a screen rectangle une byte to the left, most left byte goes to the right side (no bytes lost)\r\n*cpc_RLI: -> moves a screen rectangle une byte to the rightmost left byte goes to the left side (no bytes lost)\r\n\r\n20.03.2009\r\n*cpc_TouchTiles: Rutina nueva para marcar un recuadro de tiles como tocado\r\n\r\n\r\n23.02.2009\r\n*cpc_GetTiles: Rutina nueva que captura un rea de tiles y lo guarda en un buffer.\r\n*cpc_PutTiles: Rutina nueva que enva desde un buffer un rea de tiles al mapa de tiles.\r\n\r\n22.02.2009\r\n*cpc_UpdScr: Se ha optimizado el cdigo para que sea ms rpida, aunque ahora ocupa ms.\r\n*cpc_PutCpTileMapo2b: Rutina nueva para dibujar sprites compilados en el buffer del mapa de tiles. \r\n\r\n20.02.2009\r\n*En las rutinas relacionadas con el ancho del mapa de tiles se da la opcin de utilizar una rutina de multiplicacin personalizada antes de compilar la librera, de este modo se mejora la velocidad de operacin. En caso de no personalizar esta rutina se usa la rutina de multiplicacin genrica.\r\n\r\n19.02.2009\r\n*cpc_PutSpTileMap: Optimizado el cdigo de bsqueda de tiles tocados por un sprite: Ms corto y rpido.\r\n\r\n16.02.2009\r\n*cpc_PutTrSpriteTileMap2b: Rutina nueva similar a cpc_PutTrSpTileMap2b pero sin hacer el clculo interno de la posicin en el superbuffer. Por eso requiere utilizar cpc_SpUpdX y cpc_SpUpdY para actualizar la posicin del sprite. O hacerlo del modo habitual pero ejecutandi luego cpc_SuperbufferAddress() despus de actualizar la posicin.\r\n*cpc_UpdateTileMap: Se ha actualizado para incluir las rutinas cpc_PutTrSpTileMap2 y cpc_PutTrSpriteTileMap2.\r\n\r\n\r\n11.02.2009\r\n*cpc_ScrollLeft0, cpc_ScrollLeft, cpc_ScrollRight0, cpc_ScrollRight\r\nRutinas nuevas (beta) para hacer scroll horizontal por software en el mapa de tiles.\r\n\r\n09.02.2009\r\n*cpc_PutTrSpTileMap2b: Dibuja un sprite en el mapa de tiles teniendo en cuenta que uno de los colores es transparente. El color transparente se define en tiempo de compilacin como mascara1 y mascara2\r\n\r\n16.01.2009\r\n*cpc_TestKey\r\nOptimizado el cdigo, ahora algo ms pequeo y rpido (5 bytes menos).\r\n\t\r\n*cpc_RedefineKey\r\nOptimizado el cdigo, ahora algo ms pequeo y rpido (30 bytes menos).\r\n\r\n*cpc_AnyKeyPressed\r\nReescrita entera, mucho ms corta y encima funciona... la anterior no funcionaba.\r\n\r\n*cpc_SetBorder\r\nCambiada la forma de llamar para ahorrar 4 bytes. \r\n\r\n*cpc_InitTileMap\r\nCambiada la forma de llamar para ahorrar 12 bytes. "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_AnyKeyPressed.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_AnyKeyPressed\r\n\r\nGLOBAL cpc_TestKeyboard\r\n\r\n\r\n.cpc_AnyKeyPressed\r\n\tLD A,$40\r\n.bucle_deteccion_tecla\t\r\n\tPUSH AF\r\n\tcall cpc_TestKeyboard\t\t\t\t\t;en A vuelve los valores de la linea\r\n\tOR A\r\n\tJP NZ, tecla_pulsada\t\t\t\t\t; retorna si no se ha pulsado ninguna tecla\r\n\tPOP AF\r\n\tINC A\r\n\tCP $4A\r\n\tJP NZ, bucle_deteccion_tecla\r\n\tLD HL,0\r\n\tRET\r\n\t\r\n.tecla_pulsada\r\n\tPOP AF\r\n\tLD HL,1\r\n\tRET\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_AssignKey.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_AssignKey\r\n\r\n\r\nGLOBAL cpc_KeysData\r\nGLOBAL  tabla_teclas\r\n\r\n.cpc_AssignKey\r\n\r\n\tld hl,2\r\n    add hl,sp\t\r\n    \r\n    ld a,(hl)\t;linea, byte\r\n    inc hl\r\n    ld b,(hl)\t;DE tiene el valor de la tecla a escribir en la tabla\r\n    inc hl\r\n    ld e,(hl)\r\n; En A se tiene el valor de la tecla seleccionada a comprobar [0..11]\r\n\t;A*2\r\n;______________________________________________________________________________________________\r\n;\t;En A viene la tecla a redefinir (0..11)\r\n\t;srl\te \t;A*2\t;\r\n\tsla e\r\n\t;ld e,a\r\n\tld d,0\r\n\tld hl,tabla_teclas+cpc_KeysData\r\n\r\n; gracias a Mochilote por detectar un error aqu:\t\r\n\tadd hl,de ;Nos colocamos en la tecla a redefinir y la borramos\r\n\tld (hl),$ff\r\n\tinc hl\r\n\tld (hl),$ff\r\n\tdec hl\r\n\tpush hl\r\n\t;call ejecutar_deteccion_teclado ;A tiene el valor del teclado\r\n\t;ld a,d\r\n; A tiene el byte (<>0)\r\n; B tiene la linea\t\r\n\t;guardo linea y byte\r\n\tpop hl\r\n\t;ld a,(linea)\r\n\tld (hl),a ;byte\r\n\tinc hl\r\n\t;ld a,b\t  ;linea\r\n\t;ld a,(bte)\r\n\tld (hl),b\r\n\tret\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_Chars.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_Chars\r\n\r\nGLOBAL first_char\r\n\r\n.first_char defb 48\t;first defined char number (ASCII)\r\n\r\n.cpc_Chars   ;cpc_Chars codificadas... cada pixel se define con 2 bits que definen el color.\r\n\r\n;0\r\ndefb @00010101\r\ndefb @00010001\r\ndefb @00100010\r\ndefb @00100010\r\ndefb @00110011\r\ndefb @00110011\r\ndefb @00111111\r\ndefb @00000000\r\n;1      \r\ndefb @00010100\r\ndefb @00000100\r\ndefb @00001000\r\ndefb @00001000\r\ndefb @00001100\r\ndefb @00001100\r\ndefb @00111111\r\ndefb @00000000\r\n;2      \r\ndefb @00000101\r\ndefb @00010001\r\ndefb @00000010\r\ndefb @00001000\r\ndefb @00110000\r\ndefb @00110000\r\ndefb @00111111\r\ndefb @00000000\r\n;3      \r\ndefb @00000101\r\ndefb @00010001\r\ndefb @00000010\r\ndefb @00001000\r\ndefb @00000011\r\ndefb @00110011\r\ndefb @00001100\r\ndefb @00000000\r\n;4      \r\ndefb @00010001\r\ndefb @00010001\r\ndefb @00100010\r\ndefb @00111111\r\ndefb @00000011\r\ndefb @00000011\r\ndefb @00000011\r\ndefb @00000000\r\n;5      \r\ndefb @00010101\r\ndefb @00010000\r\ndefb @00100000\r\ndefb @00001000\r\ndefb @00000011\r\ndefb @00000011\r\ndefb @00111100\r\ndefb @00000000\r\n;6      \r\ndefb @00000101\r\ndefb @00010000\r\ndefb @00100000\r\ndefb @00101000\r\ndefb @00110011\r\ndefb @00110011\r\ndefb @00001100\r\ndefb @00000000\r\n;7      \r\ndefb @00010101\r\ndefb @00000001\r\ndefb @00000010\r\ndefb @00001000\r\ndefb @00001100\r\ndefb @00110000\r\ndefb @00110000\r\ndefb @00000000\r\n;8      \r\ndefb @00000100\r\ndefb @00010001\r\ndefb @00100010\r\ndefb @00001000\r\ndefb @00110011\r\ndefb @00110011\r\ndefb @00001100\r\ndefb @00000000\r\n;9      \r\ndefb @00000100\r\ndefb @00010001\r\ndefb @00100010\r\ndefb @00001010\r\ndefb @00000011\r\ndefb @00001100\r\ndefb @00110000\r\ndefb @00000000\r\n;:\r\ndefb @00000000\r\ndefb @00000000\r\ndefb @00100000\r\ndefb @00000000\r\ndefb @00110000\r\ndefb @00000000\r\ndefb @00000000\r\ndefb @00000000\r\n;SPC (;)\r\ndefb 0,0,0,0,0,0,0,0\r\n;.   (<)\r\ndefb @00000000\r\ndefb @00000000\r\ndefb @00000000\r\ndefb @00000000\r\ndefb @00000000\r\ndefb @00000000\r\ndefb @11000000\r\ndefb @00000000\r\n;    (=)\r\ndefb @00010100\r\ndefb @00000000\r\ndefb @00101000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\r\n;!\t(>)\r\ndefb @00000000\r\ndefb @00010000\r\ndefb @00100000\r\ndefb @00100000\r\ndefb @00110000\r\ndefb @00000000\r\ndefb @00110000\r\ndefb @00000000\r\n;SPC\r\ndefb 0,0,0,0,0,0,0,0\r\n;SPC\r\ndefb 0,0,0,0,0,0,0,0\r\n;A\r\ndefb @00010000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10101000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\t\r\n;B\r\ndefb @01010000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10101000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11110000\r\ndefb @00000000\r\n;C\r\ndefb @00010100\r\ndefb @01000000\r\ndefb @10000000\r\ndefb @10000000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @00111100\r\ndefb @00000000\r\n;D\r\ndefb @01010000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11110000\r\ndefb @00000000\r\n;E\r\ndefb @01010100\r\ndefb @01000000\r\ndefb @10000000\r\ndefb @10100000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @11111100\r\ndefb @00000000\r\n;F\r\ndefb @01010100\r\ndefb @01000000\r\ndefb @10000000\r\ndefb @10100000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @00000000\r\n;G\r\ndefb @00010100\r\ndefb @01000000\r\ndefb @10000000\r\ndefb @10000000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00111100\r\ndefb @00000000\r\n;H\r\ndefb @01000100\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10101000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\r\n;I\r\ndefb @01010100\r\ndefb @00010000\r\ndefb @00100000\r\ndefb @00100000\r\ndefb @00110000\r\ndefb @00110000\r\ndefb @11111100\r\ndefb @00000000\r\n;J\r\ndefb @01010100\r\ndefb @00000100\r\ndefb @00001000\r\ndefb @00001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11111100\r\ndefb @00000000\r\n;K\r\ndefb @01000000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10100000\r\ndefb @11110000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\r\n;L\r\ndefb @01000000\r\ndefb @01000000\r\ndefb @10000000\r\ndefb @10000000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @11111100\r\ndefb @00000000\r\n;M\r\ndefb @01010100\r\ndefb @01010100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\r\n;N\r\ndefb @00010100\r\ndefb @01010100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\r\n;O\r\ndefb @00010000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00110000\r\ndefb @00000000\r\n;P\r\ndefb @01010000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10100000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @00000000\r\n;Q\r\ndefb @00010000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11111100\r\ndefb @00111100\r\ndefb @00000000\r\n;R\r\ndefb @01010000\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10100000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\r\n;S\r\ndefb @00010100\r\ndefb @01000000\r\ndefb @10000000\r\ndefb @00100000\r\ndefb @00001100\r\ndefb @00001100\r\ndefb @11110000\r\ndefb @00000000\r\n;T\r\ndefb @01010100\r\ndefb @00010000\r\ndefb @00100000\r\ndefb @00100000\r\ndefb @00110000\r\ndefb @00110000\r\ndefb @00110000\r\ndefb @00000000\r\n;U\r\ndefb @01000100\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @11111100\r\ndefb @00000000\r\n;V\r\ndefb @01000100\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00110000\r\ndefb @00000000\r\n;W\r\ndefb @01000100\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @10001000\r\ndefb @11111100\r\ndefb @11111100\r\ndefb @11001100\r\ndefb @00000000\r\n;X\r\ndefb @01000100\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @00100000\r\ndefb @00110000\r\ndefb @11001100\r\ndefb @11001100\r\ndefb @00000000\r\n;Y\r\ndefb @01000100\r\ndefb @01000100\r\ndefb @10001000\r\ndefb @00100000\r\ndefb @00110000\r\ndefb @00110000\r\ndefb @00110000\r\ndefb @00000000\r\n;Z\r\ndefb @01010100\r\ndefb @00000100\r\ndefb @00100000\r\ndefb @00100000\r\ndefb @11000000\r\ndefb @11000000\r\ndefb @11111100\r\ndefb @00000000\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_Chars8.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_Chars8\r\nGLOBAL first_char8\r\n\r\n.first_char8 defb 32\t;first defined char number (ASCII)\r\n\r\n.cpc_Chars8   ;each bit of each byte is a pixel, same way as SYMBOL function of Locomotive BASIC.\r\n\r\n;; KEY SET BY ANJUEL & NA_TH_AN FROM NANAKO CPC GAME.\r\n   DEFB     0,  0,  0,  0,  0,  0,  0,  0\r\n   DEFB    24, 36, 24,102,153, 24, 36,102\r\n   DEFB    24, 60, 24,102,153, 24, 36,102\r\n   DEFB    24, 52, 25,118,152, 24, 20, 20\r\n   DEFB    24, 44,152,110, 25, 24, 40, 40\r\n   DEFB   129,126,165,129,129,189,129,126\r\n   DEFB     0,  0, 15,252,252, 15,  0,  0\r\n   DEFB     0,  0,240, 63, 63,240,  0,  0\r\n   DEFB    60, 66,165,129, 90, 36, 36, 60\r\n   DEFB     0,128,126,200,248,192,128,  0\r\n   DEFB     0, 60, 54,223,231,122, 36, 24\r\n   DEFB     0,  0,  8, 56, 28, 16,  0,  0\r\n   DEFB    60, 66,165,153,153,165, 66, 60\r\n   DEFB    24, 60, 60, 60,126, 90, 66, 66\r\n   DEFB    24, 36, 24,  0,153,  0, 36,102\r\n   DEFB    24, 24, 24, 48, 24, 12, 24, 24\r\n   DEFB     0,  0,  0,255,  0,  0,  0,  0\r\n   DEFB    16, 62, 32, 60,  4,124,  8,  0\r\n   DEFB    62, 34,  2, 62, 32, 34, 62,  0\r\n   DEFB    62, 36,  4, 28,  4, 36, 62,  0\r\n   DEFB    32, 32, 36, 62,  4,  4, 14,  0\r\n   DEFB    62, 32, 32, 62,  2, 34, 62,  0\r\n   DEFB    62, 32, 32, 62, 34, 34, 62,  0\r\n   DEFB    62, 36,  4,  4,  4,  4, 14,  0\r\n   DEFB    62, 34, 34, 62, 34, 34, 62,  0\r\n   DEFB    62, 34, 34, 62,  2, 34, 62,  0\r\n   DEFB     0, 24, 24,  0,  0, 24, 24,  0\r\n   DEFB     0, 24, 24,  0,  0, 24, 24, 32\r\n   DEFB     4,  8, 16, 32, 16,  8,  4,  0\r\n   DEFB     0,  0,126,  0,  0,126,  0,  0\r\n   DEFB    32, 16,  8,  4,  8, 16, 32,  0\r\n   DEFB    64,124, 68,  4, 28, 16,  0, 16\r\n   DEFB     0, 56, 84, 92, 64, 60,  0,  0\r\n   DEFB   126, 36, 36, 36, 60, 36,102,  0\r\n   DEFB   124, 36, 36, 62, 34, 34,126,  0\r\n   DEFB     2,126, 66, 64, 66,126,  2,  0\r\n   DEFB   126, 34, 34, 34, 34, 34,126,  0\r\n   DEFB     2,126, 66,120, 66,126,  2,  0\r\n   DEFB     2,126, 34, 48, 32, 32,112,  0\r\n   DEFB     2,126, 34, 32, 46, 36,124,  0\r\n   DEFB   102, 36, 36, 60, 36, 36,102,  0\r\n   DEFB    56, 16, 16, 16, 16, 16, 56,  0\r\n   DEFB    28,  8,  8,  8,  8, 40, 56,  0\r\n   DEFB   108, 40, 40,124, 36, 36,102,  0\r\n   DEFB   112, 32, 32, 32, 34,126,  2,  0\r\n   DEFB   127, 42, 42, 42, 42,107,  8,  0\r\n   DEFB   126, 36, 36, 36, 36, 36,102,  0\r\n   DEFB   126, 66, 66, 66, 66, 66,126,  0\r\n   DEFB   126, 34, 34,126, 32, 32,112,  0\r\n   DEFB   126, 66, 66, 74,126,  8, 28,  0\r\n   DEFB   126, 34, 34,126, 36, 36,114,  0\r\n   DEFB   126, 66, 64,126,  2, 66,126,  0\r\n   DEFB    34, 62, 42,  8,  8,  8, 28,  0\r\n   DEFB   102, 36, 36, 36, 36, 36,126,  0\r\n   DEFB   102, 36, 36, 36, 36, 24,  0,  0\r\n   DEFB   107, 42, 42, 42, 42, 42, 62,  0\r\n   DEFB   102, 36, 36, 24, 36, 36,102,  0\r\n   DEFB   102, 36, 36, 60,  8,  8, 28,  0\r\n   DEFB   126, 66,  4,  8, 16, 34,126,  0\r\n   DEFB     4, 60, 36, 32, 36, 60,  4,  0\r\n   DEFB     0, 64, 32, 16,  8,  4,  0,  0\r\n   DEFB    32, 60, 36,  4, 36, 60, 32,  0\r\n   DEFB     0, 16, 40, 68,  0,  0,  0,  0\r\n   DEFB     0,  0,  0,  0,  0,  0,  0,  0\r\n   DEFB     0,100,104, 16, 44, 76,  0,  0\r\n   DEFB   126, 36, 36, 36, 60, 36,102,  0\r\n   DEFB   124, 36, 36, 62, 34, 34,126,  0\r\n   DEFB     2,126, 66, 64, 66,126,  2,  0\r\n   DEFB   126, 34, 34, 34, 34, 34,126,  0\r\n   DEFB     2,126, 66,120, 66,126,  2,  0\r\n   DEFB     2,126, 34, 48, 32, 32,112,  0\r\n   DEFB     2,126, 34, 32, 46, 36,124,  0\r\n   DEFB   102, 36, 36, 60, 36, 36,102,  0\r\n   DEFB    56, 16, 16, 16, 16, 16, 56,  0\r\n   DEFB    28,  8,  8,  8,  8, 40, 56,  0\r\n   DEFB   108, 40, 40,124, 36, 36,102,  0\r\n   DEFB   112, 32, 32, 32, 34,126,  2,  0\r\n   DEFB   127, 42, 42, 42, 42,107,  8,  0\r\n   DEFB   126, 36, 36, 36, 36, 36,102,  0\r\n   DEFB   126, 66, 66, 66, 66, 66,126,  0\r\n   DEFB   126, 34, 34,126, 32, 32,112,  0\r\n   DEFB   126, 66, 66, 74,126,  8, 28,  0\r\n   DEFB   126, 34, 34,126, 36, 36,114,  0\r\n   DEFB   126, 66, 64,126,  2, 66,126,  0\r\n   DEFB    34, 62, 42,  8,  8,  8, 28,  0\r\n   DEFB   102, 36, 36, 36, 36, 36,126,  0\r\n   DEFB   102, 36, 36, 36, 36, 24,  0,  0\r\n   DEFB   107, 42, 42, 42, 42, 42, 62,  0\r\n   DEFB   102, 36, 36, 24, 36, 36,102,  0\r\n   DEFB   102, 36, 36, 60,  8,  8, 28,  0\r\n   DEFB   126, 66,  4,  8, 16, 34,126,  0\r\n   DEFB     4, 60, 36, 96, 96, 36, 60,  4\r\n   DEFB     0, 16, 16, 16, 16, 16, 16,  0\r\n   DEFB    32, 60, 36,  6,  6, 36, 60, 32\r\n   DEFB     0,  0, 16, 40, 68,  0,  0,  0\r\n   DEFB   126, 66, 90, 82, 90, 66,126,  0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ClrScr.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\n\r\nGLOBAL cpc_ClrScr\t\t\r\n\r\n.cpc_ClrScr\r\n\tXOR A\r\n\tLD HL,$c000\r\n\tLD DE,$c001\r\n\tLD BC,16383\r\n\tLD (HL),A\r\n\tLDIR\r\n\tRET\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_CollSp.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_CollSp\t\t\t;Test if sprite1 and sprite2 are colliding\r\n\r\n.cpc_CollSp\r\n;first parameter sprite \r\n;second parameter value\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\tld e,(ix+0)\r\n\tld d,(ix+1)\r\n\t;A=x value\r\n\tld l,(ix+2)\r\n\tld h,(ix+3)\r\n\tpush de\r\n\tpop iy\t;ix sprite2 data\r\n\t\t\t\r\n    push hl\r\n    pop ix\t;iy sprite1 data\r\n    \r\n    ;Sprite coords & sprite dims\r\n\t\t\t\t\r\n;COLISION_sprites\r\n\r\n\r\n\r\n;entran sprite1 y sprite 2 y se actualizan los datos\r\n;ix apunta a sprite1\r\n;iy apunta a sprite2\r\n\r\n;coordenadas\r\n\tld l,(ix+8)\r\n\tld h,(ix+9)\r\n\tLD (SPR2X),HL\r\n\t\r\n\tld l,(iy+8)\r\n\tld h,(iy+9)\r\n\tLD (SPR1X),HL\t\r\n\r\n;dimensiones sprite 1\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\tld b,(hl)\r\n\tinc hl\r\n\tld c,(hl)\r\n;dimensiones sprite 12\r\n\tld l,(iy+0)\r\n\tld h,(iy+1)\r\n\tld d,(hl)\r\n\tinc hl\r\n\tld e,(hl)\t\r\n\t\r\n\t\r\n\t;ld e,(ix+6)\r\n\t;ld d,(ix+7)\t\r\n\t\r\n\t\r\n\r\n;ld de,DIMENSIONES_SP_PPAL\t;dimensiones sprite 2\r\n;ld bc,DIMENSIONES_SP_PPAL\t;dimensiones sprite 1\r\nCALL TOCADO\r\n;RET NC ;vuelve si no hay colision\r\nld h,0\r\nJP nc,no_colision\r\n;Aqu hay colisin\r\nld l,1\r\nRET\t\t\r\n\r\ndefb 'm','m','o'\r\n.no_colision\r\nld l,0\r\nret\r\n\t\r\n.TOCADO\r\nLD HL,SPR2X\t\r\nLD A,(SPR1X)\r\nCP (HL)\r\njp C,C1\r\nLD A,(HL)\r\nADD A,B\t;alto del sprite1\r\nLD B,A\r\nLD A,(SPR1X)\r\nSUB B\r\nRET NC\r\njp COMPROBAR\r\n.C1\r\nADD A,D\t;alto sprite2\r\nLD D,A\r\nLD A,(HL)\r\nSUB D\r\nRET NC\r\n.COMPROBAR\r\nINC HL\r\nLD A,(SPR1Y)\r\nCP (HL)\r\njp C,C2\r\nLD A,(HL)\r\nADD A,C\r\nLD C,A\r\nLD A,(SPR1Y)\r\nSUB C\r\nRET\r\n.C2\r\nADD A,E\r\nLD E,A\r\nLD A,(HL)\r\nSUB E\r\nRET\r\n\r\n.SPR1X defb 0\r\n.SPR1Y defb 0\r\n.SPR2X defb 0\r\n.SPR2Y defb 0\r\n\r\n\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_DeleteKeys.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_DeleteKeys\r\n\r\n;borra la tabla de las teclas para poder redefinirlas todas\r\n\r\nGLOBAL cpc_KeysData\r\nGLOBAL  tabla_teclas\r\n\r\n.cpc_DeleteKeys\r\nLD HL,cpc_KeysData+tabla_teclas\r\nLD DE,cpc_KeysData+tabla_teclas+1\r\nLD BC, 24\r\nLD (HL),$FF\r\nLDIR\r\nRET\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_DisableFirmware.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\n\r\nGLOBAL cpc_DisableFirmware\t\t\r\nGLOBAL backup\r\n\r\n.cpc_DisableFirmware\r\n\tDI\r\n\tLD HL,($0038)\r\n\tLD (backup),HL\t\t\t\t\r\n\tLD HL,$0038\r\n\tLD (hl),$FB\t\t;EI\r\n\tinc hl\r\n\tLD (hl),$C9\t;RET\r\n\tEI\r\n\tRET\r\n\r\n.backup defw  0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_EnableFirmware.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\n\r\nGLOBAL cpc_EnableFirmware\t\t\r\nGLOBAL cpc_DisableFirmware\r\nGLOBAL backup\r\n\r\n.cpc_EnableFirmware\r\n\tDI\r\n\tLD de,(backup)\r\n\t\t\t\t\r\n\tLD HL,$0038\r\n\tLD (hl),e\t\t;EI\r\n\tinc hl\r\n\tLD (hl),d\t;RET\r\n\tEI\r\n\tRET\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_GetScrAddress.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_GetScrAddress\r\nGLOBAL cpc_GetScrAddress0\r\n\r\n.cpc_GetScrAddress\r\n\t;ld ix,2\t\t;14\r\n    ;add ix,sp\t;15\r\n    \r\n    ;ld l,(ix+0)\t;19\r\n    ;ld a,(ix+2)\t;19\r\n    ;67\r\n    \r\n    \r\n\tld hl,2\t;10\r\n    add hl,sp\t;11\t\t\r\n    \r\n\tld e,(hl)\t;7\r\n\tinc hl\t\t;6\r\n\tinc hl\t\t;6\r\n\tld a,(hl)\t;7\r\n\t;ex de,hl\t;4\r\n\tld l,e\t\t;4\r\n\t;51\r\n\tjp cpc_GetScrAddress0\r\n\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_GetScrAddress0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\n.cpc_GetScrAddress0\r\n;en HL estn las coordenadas\r\n\t\r\n;LD A,H\r\nLD (inc_ancho+1),A\r\nLD A,L\r\nSRL A\r\nSRL A\r\nSRL A\r\n; A indica el bloque a multiplicar x &50\r\nLD D,A\t\t\t\t\t\t;D\r\nSLA A\r\nSLA A\r\nSLA A\r\nSUB L\r\nNEG\r\n; A indica el desplazamiento a multiplicar x &800\r\nLD E,A\t\t\t\t\t\t;E\r\nLD L,D\r\nLD H,0\r\nADD HL,HL\r\nLD BC,BLOQUES\r\nADD HL,BC\r\n;HL APUNTA AL BLOQUE BUSCADO\r\nLD C,(HL)\r\nINC HL\r\nLD H,(HL)\r\nLD L,C\r\n;HL TIENE EL VALOR DEL BLOQUE DE 8 BUSCADO\r\n\r\n\r\nPUSH HL\r\nLD D,0\r\nLD HL,SUB_BLOQUES\r\nADD HL,DE\r\nLD A,(HL)\r\nPOP HL\r\n\r\nADD H\r\nLD H,A\r\n.inc_ancho\r\nLD E,0\r\n;LD D,0\r\nADD HL,DE\r\n\r\nRET\r\n\r\n.BLOQUES\r\ndefw $C000,$C050,$C0A0,$C0F0,$C140,$C190,$C1E0,$C230,$C280,$C2D0,$C320,$C370,$C3C0,$C410,$C460,$C4B0,$C500,$C550,$C5A0,$C5F0,$C640,$C690,$C6E0,$C730,$C780\r\n.SUB_BLOQUES\r\ndefb $00,$08,$10,$18,$20,$28,$30,$38\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_GetSp.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_GetSp\r\n\r\nGLOBAL cpc_GetSp0\r\nGLOBAL suma_siguiente_lineax\r\nGLOBAL anchox\r\n\r\n\r\n.cpc_GetSp\t\r\n\tld ix,2\r\n\tadd ix,sp\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\tld a,(ix+2)\r\n\t\r\n   \tld e,(ix+6)\r\n\tld d,(ix+7)\r\n\t\r\n\t;\tdefb $DD\r\n   \t;\tLD H,c\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n   \t\t;defb $DD\r\n   \t\t;LD L,b      ;LD LX,B   ;ANCHO SPRITE\r\n\tld (cpc_GetSp0+anchox+1),a\r\n\t\r\n\t\r\n\tsub 1\r\n\tcpl\r\n\tld (cpc_GetSp0+suma_siguiente_lineax+1),a    ;comparten los 2 los mismos valores.\t\t\r\n\t\r\n\tld A,(ix+4)  \r\n\tjp cpc_GetSp0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_GetSp0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_GetSp0\r\n\r\nGLOBAL anchox \r\nGLOBAL suma_siguiente_lineax \r\n\r\n\r\n\r\n.cpc_GetSp0\t   \r\n\t\tdefb $fD\r\n   \t\tLD H,a\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t.loop_alto_2x\r\n\r\n\t    ld c,0\r\n\t\t;push hl\r\n\t\t;ldi\r\n\t.loop_ancho_2x\t\t\r\n\t\tld A,(hl)\r\n\t\tld (de),a\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\tdec c\r\n\t\tjp nz,loop_ancho_2x\r\n\t\t;pop hl\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n  \r\n.salto_lineax\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2x ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2x\t\t\t\r\n\t\t\r\nDEFC anchox = loop_alto_2x\r\nDEFC suma_siguiente_lineax = salto_lineax\t\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_GetTiles.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_GetTiles\t\t;pone un byte en la posicin de la pantalla indicada\r\n\r\nGLOBAL pantalla_juego\r\nGLOBAL ancho_pantalla_bytes\r\n\r\nGLOBAL captura\r\nGLOBAL cpc_PutTiles\r\n\r\n.cpc_GetTiles\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\t\r\n\tld h,(ix+1)\t\r\n\t\r\n\tld c,(ix+2)\t;h\r\n\t;ld b,(ix+4)\t;w\r\n\r\n\tld e,(ix+6)\t;y\r\n\tld d,(ix+8)\t;x\t\r\n\t\r\n\t\r\n\t;lee el rectngulo y lo mueve al buffer\r\n\t\r\n\t.bucle_alto\r\n\tld b,(ix+4)\r\n\t.bucle_ancho\r\n\tpush de\r\n\r\n\t;e+c\r\n\tld a,c\r\n\tadd e\r\n\tld e,a\r\n\t;d+b\r\n\tld a,b\r\n\tadd d\r\n\tpush hl\r\n\tcall captura\r\n\tld a,(hl)\r\n\tpop hl\r\n\tld (hl),a\r\n\tinc hl\t\t\r\n\tpop de\t\r\n\tdjnz bucle_ancho\t\r\n\t\r\n\tdec c\r\n\tjp nz,bucle_alto\r\n\tret\r\n\r\n\t;e=y\r\n\t;a=x\r\n\t\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_InitTileMap.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_InitTileMap\r\n\r\n\r\nGLOBAL tiles\r\n\r\n.cpc_InitTileMap\r\n\r\n\t;*LD IX,2\r\n\t;*ADD IX,SP\r\n\t\r\n\t;*LD L,(IX+0)\r\n\t;*LD H,(IX+1)\r\n\tLD (tiles),HL\r\n\tRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_InputText.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_InputText\t\t;marca un tile indicando las coordenadas del tile\r\n\r\nGLOBAL cpc_TestKeyboard\r\n\r\n\r\n.cpc_InputText\t\r\n\r\n\r\n.ejecutar_deteccion_teclado\r\n\tld b,10\r\n\t\r\n.bucle_deteccion_teclado\r\n\tld a,b\r\n\tcp 10\r\n\tjr nz, continua_deteccion_x\r\n\txor a\r\n\tld b,a\r\n\t;ld b,0\r\n\t;ld a,b\r\n.continua_deteccion_x\r\n\tpush bc\r\n\t;ld (cpc_TestKeyboard+linea_a_buscar+1),a\r\n\tadd $40\r\n\r\n\tcall cpc_TestKeyboard\t;en A vuelve los valores de la linea\r\n\r\n;_A_devuelto\r\n\tpop bc\r\n\t;cp 0 ;0 no se ha pulsado tecla...\r\n\tor a\r\n\tjr nz,key_pressed\t;no se ha pulsado nada??\r\n; A tiene el byte (<>0)\r\n; B tiene la linea\r\n\t\r\n\r\n\t;ret\r\n.continua_deteccion2\r\n\r\n;\tret nz\t;vuelve si las teclas son las anteriores a=d\r\n\r\n\tinc b\t\t\r\n\tjr bucle_deteccion_teclado\r\n\tld L,0\r\n\tld h,l\r\n;_A_devuelto\r\n.key_pressed\r\n;a tiene columna\r\n;b tiene la fila\r\n\tret\r\n\t;cp 0 ;0 no se ha pulsado tecla...\r\n\t\r\n\t\r\n\r\n\r\n\tLD HL,keyboard_table\r\n\t;incorporo el tile en su sitio, guardo x e y\r\n.bucle_keyboard_table\r\n\tLD A,(HL)\r\n\tCP $FF\t\r\n\tJP Z,tecla_invalida\t; No es una tecla vlida\r\n\tCP E\r\n\tJP Z, comprobar_segundo_byte\t\r\n\tINC HL\r\n\tINC HL\r\n\tINC HL\t;son 3 bytes por cada tecla\r\n\tJP bucle_keyboard_table\r\n.comprobar_segundo_byte\r\n\tINC HL\r\n\tLD A,(HL)\r\n\tCP D\r\n\tJP Z, tecla_valida\t;los dos bytes son iguales, es el mismo tile. No se aade\r\n\tINC HL\r\n\tINC HL\r\n\tJP bucle_keyboard_table\r\n\r\n.tecla_valida\r\n\tINC HL\r\n\tLD A,(HL)\t;mira ASCII\r\n\tRET\t\r\n.tecla_invalida\r\n\tLD A,$FF\r\n\tRET\t\r\n\t\t\r\n.keyboard_table\t\r\ndefb 20,8,'A'\r\ndefb 40,6,'B'\r\ndefb 40,7,'C'\r\ndefb 20,7,'D'\r\ndefb 4,7,'E'\r\ndefb 20,6,'F'\r\ndefb 10,6,'G'\r\ndefb 10,5,'H'\r\ndefb 8,4,'I'\r\ndefb 20,5,'J'\r\ndefb 20,4,'K'\r\ndefb 19,4,'L'\r\ndefb 40,4,'M'\r\ndefb 40,5,'N'\r\ndefb ,-40,''\r\ndefb 4,4,'O'\r\ndefb 8,3,'P'\r\ndefb 8,8,'Q'\r\ndefb 4,6,'R'\r\ndefb 10,7,'S'\r\ndefb 8,6,'T'\r\ndefb 4,5,'U'\r\ndefb 80,6,'V'\r\ndefb 8,7,'W'\r\ndefb 80,7,'X'\r\ndefb 8,5,'Y'\r\ndefb 80,8,'Z'\r\ndefb 1,4,'0'\r\ndefb 1,8,'1'\r\ndefb 2,8,'2'\r\ndefb 2,7,'3'\r\ndefb 1,7,'4'\r\ndefb 2,6,'5'\r\ndefb 1,6,'6'\r\ndefb 2,5,'7'\r\ndefb 1,5,'8'\r\ndefb 2,4,'9'\r\ndefb 80,5,'SPC'\r\ndefb 4,2,'ENTER'\r\ndefb 4,8,'ESC'\r\n\r\ndefb $ff\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_KeysData.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_KeysData\r\n\r\nGLOBAL tabla_teclas\r\nGLOBAL keymap\r\n\r\n.cpc_KeysData\r\n\r\n\r\n.keymap0 defs 10\r\n\r\n;.teclado defb 0\t\t;Este byte indicar qu teclas han sido pulsadas \r\n\t\t\t;despus de un ciclo de exploracin\r\n;x.linea defb 0\r\n;x.bte defb 0\r\n.tecla_0 defw $0204\r\n;teclado_usable\t; teclas del cursor, cada tecla est definida por su bit y su lnea.\r\n.tabla_teclas0\r\n.tecla_0_x defw $4002\t; bit 0, lnea 2\r\n.tecla_1_x defw $4101\t; bit 1, lnea 1\r\n.tecla_2_x defw $4001\t\t; bit 0, lnea 1\r\n.tecla_3_x defw $4004\t\t; bit 0, lnea 4\r\n.tecla_00_x defw $ffff\t; bit 0, lnea 2\r\n.tecla_01_x defw $ffff\t; bit 1, lnea 1\r\n.tecla_02_x defw $ffff\t\t; bit 0, lnea 1\r\n.tecla_03_x defw $ffff\t\t; bit 0, lnea 4\r\n.tecla_04_x defw $ffff\t\t; bit 0, lnea 4\r\n.tecla_05_x defw $ffff\t\t; bit 0, lnea 4\r\n.tecla_06_x defw $ffff\t\t; bit 0, lnea 4\r\n.tecla_07_x defw $ffff\t\t; bit 0, lnea 4\r\n\r\n; For increasing keys available just increase this word table\r\ndefb 0\r\n;DEFC linea_a_buscar = linea_a_buscar0\r\n\r\nDEFC tabla_teclas = tabla_teclas0\r\nDEFC keymap = keymap0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStr.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStr\r\n\r\n\r\nGLOBAL cpc_PrintGphStr0\r\nGLOBAL direcc_destino0\r\n\r\n.cpc_PrintGphStr\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\t;destino\r\n\t;ld (cpc_PrintGphStr0+direcc_destino0),hl\r\n\t\r\n   \tld e,(ix+2)\r\n\tld d,(ix+3)\t;texto origen\r\n\txor a\r\n JP cpc_PrintGphStr0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStr0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; **\t\tIncludes code by Kevin Thacker\t\t\t**\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStr0\r\nGLOBAL direcc_destino0\r\nGLOBAL colores_camb\r\n\r\nGLOBAL cola_impresion0\r\nGLOBAL pos_cola0\r\n\r\n\r\nGLOBAL cpc_Chars\r\nGLOBAL first_char\r\n\r\n.cpc_PrintGphStr0  \r\n\r\n;DE destino\r\n;HL origen\r\n;ex de,hl\r\nld (doble),a\r\n\r\n;trabajo previo: Para tener una lista de trabajos de impresin. No se interrumpe\r\n;la impresin en curso.\r\nld a,(imprimiendo)\r\ncp 1\r\njp z,add_elemento\r\n\r\nld (direcc_destino),hl\r\nex de,hl\r\ncall bucle_texto0\r\n\r\n;antes de terminar, se mira si hay algo en cola.\r\n.bucle_cola_impresion\r\nld a,(elementos_cola)\r\nor a\r\njp z,terminar_impresion\r\ncall leer_elemento\r\njp bucle_cola_impresion\r\n\r\n\r\n.terminar_impresion\r\nxor a\r\nld (imprimiendo),a\r\nret\r\n\r\n.entrar_cola_impresion\r\n;si se est imprimiendo se mete el valor en la cola\r\n\r\nret\r\n.add_elemento\r\ndi\r\n\tld ix,(pos_cola)\r\n\tld (ix+0),l\r\n\tld (ix+1),h\r\n\tld (ix+2),e\r\n\tld (ix+3),d\r\n\tinc ix\r\n\tinc ix\r\n\tinc ix\r\n\tinc ix\r\n\tld (pos_cola),ix\r\n\t\r\n\tld hl,elementos_cola\r\n\tinc (hl)\r\n\t;Se aaden los valores hl y de\r\nei\r\n\tret\r\n.leer_elemento\r\ndi\r\n\tld ix,(pos_cola)\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\tld e,(ix+2)\r\n\tld d,(ix+3)\r\n\tdec ix\r\n\tdec ix\r\n\tdec ix\r\n\tdec ix\r\n\tld (pos_cola),ix\r\n\t\r\n\tld hl,elementos_cola\r\n\tdec (hl)\r\nei\r\n\tret\r\n\r\n.elementos_cola defw 0\r\n.pos_cola defw cola_impresion\r\n;pos_escritura_cola defw cola_impresion\r\n.cola_impresion defs 12\r\n\r\n.bucle_texto0\r\nld a,1\r\nld (imprimiendo),a\r\n\r\nld a,(first_char)\r\nld b,a\t\t;resto 48 para saber el nmero del caracter (En ASCII 0=48)\r\n\r\nld a,(hl)\r\nor a ;cp 0\r\nret z\r\nsub b\r\nld bc,cpc_Chars\t;apunto a la primera letra\r\npush hl\r\n\r\n\r\nld l,a\t\t;en A tengo la letra que sera\r\nld h,0\r\nadd hl,hl\r\nadd hl,hl\r\nadd hl,hl\t;x8 porque cada letra son 8 bytes\r\nadd hl,bc\t;ahora HL apunta a los datos de la letra correspondiente\r\n\r\n\r\n\r\ncall escribe_letra\r\n\r\nld a,(doble)\r\ncp 1\r\n; ANTES DE IMPRIMIR SE CHEQUEA SI ES DE ALTURA EL DOBLE Y SE ACTA EN CONSECUENCIA\t\r\ncall z, doblar_letra\r\n\r\n\r\nld hl,(direcc_destino)\r\n\r\n\r\nld a,(doble)\r\ncp 1\r\n;alto  \r\njr z,cont_doble\r\nld de,letra_decodificada\r\ndefb $fD\r\nLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\njr cont_tot\r\n\r\n\r\n.cont_doble\r\nld de,letra_decodificada_tmp\r\ndefb $fD\r\nLD H,16\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\r\n.cont_tot\r\ncall cpc_PutSp0\r\n\r\n\r\nld hl,(direcc_destino)\r\ninc hl\r\ninc hl\r\nld (direcc_destino),hl\r\n\r\npop hl\r\ninc hl\r\njp bucle_texto0\r\n\r\n\r\n\r\n.doble defb 0\r\n.imprimiendo defb 0\r\n.direcc_destino defw 0\r\n\r\n\r\n.cpc_PutSp0\r\n;\tdefb $fD\r\n;  \t\tLD H,16\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t\tld c,b\r\n\t.loop_alto_2\r\n\r\n\t.loop_ancho_2\t\t\r\n\t\tex de,hl\r\n\t\tldi\r\n\t\tldi\r\n\t\t\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\t\r\n\t   ex de,hl   \t   \r\n.salto_linea\r\n\t\tLD C,$fe\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n.doblar_letra \r\n\tld hl,letra_decodificada\r\n\tld de,letra_decodificada_tmp\r\n\tld b,8\r\n\t.buc_doblar_letra\r\n\tld a,(hl)\r\n\tinc hl\r\n\tld (de),a\r\n\tinc de\r\n\tinc de\r\n\tld (de),a\r\n\tdec de\r\n\tld a,(hl)\r\n\tinc hl\r\n\tld (de),a\r\n\tinc de\r\n\tinc de\r\n\tld (de),a\r\n\tinc de\r\n\tdjnz buc_doblar_letra\r\n\tret\r\n\r\n\t\t\r\n.escribe_letra\t\t; Code by Kevin Thacker\r\npush de\r\nld iy,letra_decodificada\r\nld b,8\r\n.bucle_alto\r\npush bc\r\npush hl\r\n\r\nld e,(hl)\r\ncall op_colores\t\r\nld (iy+0),d\r\ninc iy\r\ncall op_colores\r\nld (iy+0),d\r\ninc iy\r\n\r\npop hl\r\ninc hl\r\npop bc\r\ndjnz bucle_alto\r\npop de\r\nret\r\n\r\n.op_colores\r\nld d,0\t\t\t;; initial byte at end will be result of 2 pixels combined\r\n\r\ncall op_colores_pixel\t;; do pixel 0 \r\nrlc d\r\ncall op_colores_pixel\r\nrrc d\r\nret\r\n\r\n;; follow through to do pixel 1\r\n\r\n.op_colores_pixel\r\n;; shift out pixel into bits 0 and 1 (source)\r\nrlc e\r\nrlc e\r\n\r\n;; isolate\r\nld a,e\r\nand $3\r\nld hl,colores_b0\r\nadd a,l\r\nld l,a\r\nld a,h\r\nadc a,0\r\nld h,a\r\n;; read it and combine with pixel so far\r\nld a,d\r\nor (hl)\r\nld d,a\r\nret\r\n\r\n\r\n.dato defb @00011011  ;aqu dejo temporalmente el byte a tratar\r\n\r\n.byte_tmp defs 3\r\n.colores_b0 ;defino los 4 colores posibles para el byte. Los colores pueden ser cualesquiera. \r\n\t  ;Pero se tienen que poner bien, en la posicin que le corresponda.\r\n;defb @00000000,  @10101000, @00100000, @00001010  ;@00000010, @00001010, @00101010, @00000000\r\ndefb @00001010,@00100000,@10100000,@00101000\r\n\r\n;defb @00000000,  @01010100, @00010000, @00000101  ;@00000001, @00000101, @00010101, @00000000\r\n\r\n.letra_decodificada defs 16 ;16\t;uso este espacio para guardar la letra que se decodifica\r\n.letra_decodificada_tmp defs 32 ;16\t;uso este espacio para guardar la letra que se decodifica para tamao doble altura\r\n\r\n\r\n\r\n\r\nDEFC direcc_destino0 = direcc_destino\r\nDEFC colores_camb = colores_b0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStr0M1.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStr0M1\r\nGLOBAL direcc_destino0_m1\r\nGLOBAL colores_cambM1\r\n\r\nGLOBAL cola_impresion0\r\nGLOBAL pos_cola0\r\nGLOBAL first_char\r\n\r\n\r\n\r\nGLOBAL cpc_Chars\r\n\r\n.cpc_PrintGphStr0M1  \r\n\r\n;DE destino\r\n;HL origen\r\n;ex de,hl\r\nld (doble),a\r\n\r\n;trabajo previo: Para tener una lista de trabajos de impresin. No se interrumpe\r\n;la impresin en curso.\r\nld a,(imprimiendo)\r\ncp 1\r\njp z,add_elemento\r\n\r\nld (direcc_destino),hl\r\nex de,hl\r\ncall bucle_texto0\r\n\r\n;antes de terminar, se mira si hay algo en cola.\r\n.bucle_cola_impresion\r\nld a,(elementos_cola)\r\nor a\r\njp z,terminar_impresion\r\ncall leer_elemento\r\njp bucle_cola_impresion\r\n\r\n\r\n.terminar_impresion\r\nxor a\r\nld (imprimiendo),a\r\nret\r\n\r\n.entrar_cola_impresion\r\n;si se est imprimiendo se mete el valor en la cola\r\n\r\nret\r\n.add_elemento\r\ndi\r\n\tld ix,(pos_cola)\r\n\tld (ix+0),l\r\n\tld (ix+1),h\r\n\tld (ix+2),e\r\n\tld (ix+3),d\r\n\tinc ix\r\n\tinc ix\r\n\tinc ix\r\n\tinc ix\r\n\tld (pos_cola),ix\r\n\t\r\n\tld hl,elementos_cola\r\n\tinc (hl)\r\n\t;Se aaden los valores hl y de\r\nei\r\n\tret\r\n.leer_elemento\r\ndi\r\n\tld ix,(pos_cola)\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\tld e,(ix+2)\r\n\tld d,(ix+3)\r\n\tdec ix\r\n\tdec ix\r\n\tdec ix\r\n\tdec ix\r\n\tld (pos_cola),ix\r\n\t\r\n\tld hl,elementos_cola\r\n\tdec (hl)\r\nei\r\n\tret\r\n\r\n.elementos_cola defw 0\r\n.pos_cola defw cola_impresion\r\n;pos_escritura_cola defw cola_impresion\r\n.cola_impresion defs 12\r\n\r\n.bucle_texto0\r\nld a,1\r\nld (imprimiendo),a\r\n\r\nld a,(first_char)\r\nld b,a\t\t;resto 48 para saber el nmero del caracter (En ASCII 0=48)\r\n\r\nld a,(hl)\r\nor a ;cp 0\r\nret z\r\nsub b\r\nld bc,cpc_Chars\t;apunto a la primera letra\r\npush hl\r\n\r\n\r\nld l,a\t\t;en A tengo la letra que sera\r\nld h,0\r\nadd hl,hl\r\nadd hl,hl\r\nadd hl,hl\t;x8 porque cada letra son 8 bytes\r\nadd hl,bc\t;ahora HL apunta a los datos de la letra correspondiente\r\n\r\n\r\n\r\ncall escribe_letra\r\n\r\nld a,(doble)\r\ncp 1\r\n; ANTES DE IMPRIMIR SE CHEQUEA SI ES DE ALTURA EL DOBLE Y SE ACTA EN CONSECUENCIA\t\r\ncall z, doblar_letra\r\n\r\n\r\n\r\nld hl,(direcc_destino)\r\n\r\nld a,(doble)\r\ncp 1\r\n;alto  \r\njr z,cont_doble\r\nld de,letra_decodificada\r\ndefb $fD\r\nLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\njr cont_tot\r\n\r\n\r\n.cont_doble\r\nld de,letra_decodificada_tmp\r\ndefb $fD\r\nLD H,16\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\r\n.cont_tot\r\ncall cpc_PutSp0\r\n\r\nld hl,(direcc_destino)\r\ninc hl\r\n\r\nld (direcc_destino),hl\r\npop hl\r\ninc hl\r\njp bucle_texto0\r\n\r\n.doble defb 0\r\n.imprimiendo defb 0\r\n.direcc_destino defw 0\r\n\r\n.doblar_letra \r\n\tld hl,letra_decodificada\r\n\tld de,letra_decodificada_tmp\r\n\tld b,8\r\n\t.buc_doblar_letra\r\n\tld a,(hl)\r\n\tinc hl\r\n\tld (de),a\r\n\tinc de\r\n\tld (de),a\r\n\tinc de\r\n\tdjnz buc_doblar_letra\r\n\tret\r\n\t\r\n\t\r\n.cpc_PutSp0\r\n\t;\tdefb $fD\r\n   \t;\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t\tld c,b\r\n\t.loop_alto_2\r\n\r\n\t.loop_ancho_2\t\t\r\n\t\tex de,hl\r\n\t\tldi\r\n\t\t;ldi\r\n\t\t\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\t\r\n\t   ex de,hl   \t   \r\n.salto_linea\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n.escribe_letra\r\n\tld iy,letra_decodificada\r\n\tld b,8\r\n\tld ix,byte_tmp\t\r\n\t.bucle_alto\r\n\t\tpush bc\r\n\t\tpush hl\r\n\r\n\t\tld a,(hl)\r\n\t\tld hl,dato\r\n\t\tld (hl),a\r\n\t\t;me deja en ix los valores convertidos\r\n\t\t;HL tiene la direccin origen de los datos de la letra\r\n\t\t;LD DE,letra\t;el destino es la posicin de decodificacin de la letra\r\n\t\t;Se analiza el byte por parejas de bits para saber el color de cada pixel.\r\n\t\tld (ix+0),0\t;reset el byte \r\n\t\tLD B,4\t;son 4 pixels por byte. Los recorro en un bucle y miro qu color tiene cada byte.\r\n\t\t.bucle_colores\r\n\t\t\t;roto el byte en (HL)\r\n\t\t\tpush hl\r\n\t\t\tcall op_colores_m1\t;voy a ver qu color es el byte. tengo un mximo de 4 colores posibles en modo 0.\r\n\t\t\tpop hl\r\n\t\t\tsrl (HL)\t\r\n\t\t\tsrl (HL)\t;voy rotando el byte para mirar los bits por pares.\r\n\t\t\tdjnz bucle_colores\r\n\t\tld a,(ix+0)\r\n\t\tld (iy+0),a\r\n\t\tinc iy\r\n\t\tpop hl\r\n\t\tinc hl\r\n\t\tpop bc\r\n\t\tdjnz bucle_alto\r\n\t\tret\r\n\r\n\r\n;.rutina\r\n;HL tiene la direccin origen de los datos de la letra\r\n\r\n;Se analiza el byte por parejas de bits para saber el color de cada pixel.\r\n;ld ix,byte_tmp\t\r\n;ld (ix+0),0\r\n\r\n;LD B,4\t;son 4 pixels por byte. Los recorro en un bucle y miro qu color tiene cada byte.\r\n;.bucle_colores\r\n;roto el byte en (HL)\r\n;push hl\r\n;call op_colores_m1\t;voy a ver qu color es el byte. tengo un mximo de 4 colores posibles en modo 0.\r\n;pop hl\r\n;sla (HL)\t\r\n;sla (HL)\t;voy rotando el byte para mirar los bits por pares.\r\n\r\n;djnz bucle_colores\r\n\r\n;ret\r\n.op_colores_m1   ;rutina en modo 1\r\n\t\t\t\t\t;mira el color del bit a pintar\r\nLD A,3\t\t;hay 4 colores posibles. Me quedo con los 2 primeros bits\r\n; \r\nAND (HL)\r\n; EN A tengo el nmero de bytes a sumar!! \r\nLD HL,colores_m1\r\nld e,a\r\nld d,0\r\nadd hl,de\r\n\r\nld c,(hl)\r\n;En C est el byte del color\r\n;ld a,4\r\n;sub b\r\nld a,b\r\ndec a\r\nor a ;cp 0\r\njp z,_sin_rotar\r\n.rotando\r\nsrl c\r\ndec a\r\njp nz, rotando\r\n._sin_rotar\r\n\r\nld a,c\r\nor (ix+0)\r\nld (ix+0),a\r\n;inc ix\r\nret\r\n\r\n\r\n.dato defb @00011011  ;aqu dejo temporalmente el byte a tratar\r\n\r\n.byte_tmp defs 2\r\n.colores_m1 \r\ndefb @00000000,@10001000,@10000000,@00001000\r\n\r\n;defb @00000000,  @01010100, @00010000, @00000101  ;@00000001, @00000101, @00010101, @00000000\r\n\r\n.letra_decodificada defs 8\t;uso este espacio para guardar la letra que se decodifica\r\n.letra_decodificada_tmp defs 16\r\n\r\nDEFC direcc_destino0_m1 = direcc_destino\r\nDEFC colores_cambM1 = colores_m1"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStr2X.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStr2X\r\n\r\n\r\nGLOBAL cpc_PrintGphStr0\r\nGLOBAL direcc_destino0\r\n\r\n.cpc_PrintGphStr2X\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\t;destino\r\n\t;ld (cpc_PrintGphStr0+direcc_destino0),hl\r\n\t\r\n   \tld e,(ix+2)\r\n\tld d,(ix+3)\t;texto origen\r\n\tld a,1\r\n JP cpc_PrintGphStr0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrM1.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrM1\r\n\r\n\r\nGLOBAL cpc_PrintGphStr0M1\r\nGLOBAL direcc_destino0_m1\r\n\r\n.cpc_PrintGphStrM1\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\t;destino\r\n\t\r\n\t\r\n   \tld e,(ix+2)\r\n\tld d,(ix+3)\t;texto origen\r\n\txor a\r\n\r\n JP cpc_PrintGphStr0M1"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrM12X.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrM12X\r\n\r\n\r\nGLOBAL cpc_PrintGphStr0M1\r\nGLOBAL direcc_destino0_m1\r\n\r\n.cpc_PrintGphStrM12X\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\t;destino\r\n\t\r\n\t\r\n   \tld e,(ix+2)\r\n\tld d,(ix+3)\t;texto origen\r\n\tld a,1\r\n\r\n JP cpc_PrintGphStr0M1"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrStd.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrStd\r\n\r\n\r\nGLOBAL cpc_PrintGphStrStd0\r\nGLOBAL direcc_destino0s_m1\r\nGLOBAL color_uso\r\n\r\n.cpc_PrintGphStrStd\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\t;destino\r\n\t\r\n\t\r\n   \tld e,(ix+2)\r\n\tld d,(ix+3)\t;texto origen\r\n\r\n\tld a,(ix+4) ;color\r\n\tld (color_uso+1),a\r\n\t\r\n JP cpc_PrintGphStrStd0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrStd0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrStd0\r\nGLOBAL direcc_destino0s_m1\r\nGLOBAL color_uso\r\n\r\nGLOBAL cola_impresion0\r\nGLOBAL pos_cola0\r\nGLOBAL first_char8\r\n\r\n\r\nGLOBAL cpc_Chars8\r\n\r\n.color0\r\nxor a\r\ncall metecolor\r\njp sigue\r\n\r\n.color1\r\nld a,@00001000\r\ncall metecolor\r\njp sigue\r\n.color2\r\nld a,@10000000\r\ncall metecolor\r\njp sigue\r\n.color3\r\nld a,@10001000\r\ncall metecolor\r\njp sigue\r\n.metecolor\r\nld (cc0-1),a\r\nld (cc4-1),a\r\nsrl a\r\nld (cc1-1),a\r\nld (cc5-1),a\r\nsrl a\r\nld (cc2-1),a\r\nld (cc6-1),a\r\nsrl a\r\nld (cc3-1),a\r\nld (cc7-1),a\r\nret\r\n\r\n.cpc_PrintGphStrStd0  \r\n\r\n;DE destino\r\n;HL origen\r\n;ex de,hl\r\n\r\n\r\n;; marcar el color con que se imprime\r\n.color_uso\r\nld a,1\r\nor a ; cp 0\r\njp z,color0\r\ncp 1\r\njp z,color1\r\ncp 2\r\njp z,color2\r\ncp 3\r\njp z,color3\r\n.sigue\r\n\r\n\r\n;trabajo previo: Para tener una lista de trabajos de impresin. No se interrumpe\r\n;la impresin en curso.\r\nld a,(imprimiendo)\r\ncp 1\r\njp z,add_elemento\r\n\r\nld (direcc_destino),hl\r\nex de,hl\r\ncall bucle_texto0\r\n\r\n;antes de terminar, se mira si hay algo en cola.\r\n.bucle_cola_impresion\r\nld a,(elementos_cola)\r\nor a\r\njp z,terminar_impresion\r\ncall leer_elemento\r\njp bucle_cola_impresion\r\n\r\n\r\n.terminar_impresion\r\nxor a\r\nld (imprimiendo),a\r\nret\r\n\r\n.entrar_cola_impresion\r\n;si se est imprimiendo se mete el valor en la cola\r\n\r\nret\r\n.add_elemento\r\ndi\r\n\tld ix,(pos_cola)\r\n\tld (ix+0),l\r\n\tld (ix+1),h\r\n\tld (ix+2),e\r\n\tld (ix+3),d\r\n\tinc ix\r\n\tinc ix\r\n\tinc ix\r\n\tinc ix\r\n\tld (pos_cola),ix\r\n\t\r\n\tld hl,elementos_cola\r\n\tinc (hl)\r\n\t;Se aaden los valores hl y de\r\nei\r\n\tret\r\n.leer_elemento\r\ndi\r\n\tld ix,(pos_cola)\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\tld e,(ix+2)\r\n\tld d,(ix+3)\r\n\tdec ix\r\n\tdec ix\r\n\tdec ix\r\n\tdec ix\r\n\tld (pos_cola),ix\r\n\t\r\n\tld hl,elementos_cola\r\n\tdec (hl)\r\nei\r\n\tret\r\n\r\n.elementos_cola defw 0\r\n.pos_cola defw cola_impresion\r\n;pos_escritura_cola defw cola_impresion\r\n.cola_impresion defs 12\r\n\r\n.bucle_texto0\r\nld a,1\r\nld (imprimiendo),a\r\n\r\nld a,(first_char8)\r\nld b,a\t\t;resto 48 para saber el nmero del caracter (En ASCII 0=48)\r\n\r\nld a,(hl)\r\nor a ;cp 0\r\nret z\r\nsub b\r\nld bc,cpc_Chars8\t;apunto a la primera letra\r\npush hl\r\n\r\n\r\nld l,a\t\t;en A tengo la letra que sera\r\nld h,0\r\nadd hl,hl\r\nadd hl,hl\r\nadd hl,hl\t;x8 porque cada letra son 8 bytes\r\nadd hl,bc\t;ahora HL apunta a los datos de la letra correspondiente\r\n\r\ncall escribe_letra\r\nld hl,(direcc_destino)\r\nld de,letra_decodificada\r\n;ld A,8\t;alto  \r\ncall cpc_PutSp0\r\nld hl,(direcc_destino)\r\ninc hl\r\ninc hl\r\nld (direcc_destino),hl\r\n\r\npop hl\r\ninc hl\r\njp bucle_texto0\r\n.imprimiendo defb 0\r\n.direcc_destino defw 0\r\n\r\n\r\n.cpc_PutSp0\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t\tld c,b\r\n\t.loop_alto_2\r\n\r\n\t.loop_ancho_2\t\t\r\n\t\tex de,hl\r\n\t\tldi\r\n\t\tldi\r\n\t\t\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\t\r\n\t   ex de,hl   \t   \r\n.salto_linea\r\n\t\tLD C,$fe\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n.escribe_letra\t\t;; lee el byte y lo interpreta\r\nld iy,letra_decodificada\r\nld b,8\r\n.bucle_alto\r\npush bc\r\n\r\n;leo el byte... ahora se miran sus bits y se rellena el caracter a imprimir\r\nxor a\r\nld b,(hl)\r\nbit 7,b\r\njp z,cc0\r\nor @10001000\r\n.cc0\r\nbit 6,b\r\njp z,cc1\r\nor @01000100\r\n.cc1\r\nbit 5,b\r\njp z,cc2\r\nor @00100010\r\n.cc2\r\nbit 4,b\r\njp z,cc3\r\nor @00010001\r\n.cc3\r\n\r\n;primer byte\r\nld (iy+0),a\r\ninc iy\r\n\r\n\r\nxor a\r\nbit 3,b\r\njp z,cc4\r\nor @10001000\r\n.cc4\r\nbit 2,b\r\njp z,cc5\r\nor @01000100\r\n.cc5\r\nbit 1,b\r\njp z,cc6\r\nor @00100010\r\n.cc6\r\nbit 0,b\r\njp z,cc7\r\nor @00010001\r\n.cc7\r\n\r\n;segundo byte\r\nld (iy+0),a\r\ninc iy\r\n\r\n\r\ninc hl\r\npop bc\r\ndjnz bucle_alto\r\nret\r\n\r\n\r\n\r\n.byte_tmp defs 2\r\n\r\n;defb @00000000,  @01010100, @00010000, @00000101  ;@00000001, @00000101, @00010101, @00000000\r\n\r\n.letra_decodificada defs 16\t;uso este espacio para guardar la letra que se decodifica\r\n\r\n\r\nDEFC direcc_destino0s_m1 = direcc_destino\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrStdXY.asm",
    "content": " ; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrStdXY\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\nGLOBAL cpc_PrintGphStrStd0\r\n\r\nGLOBAL direcc_destino0s_m1\r\nGLOBAL color_uso\r\n\r\n.cpc_PrintGphStrStdXY\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld L,(ix+0)\r\n\tld A,(ix+2)\t;pantalla\r\n\t\r\n\tcall cpc_GetScrAddress0   \r\n\r\n\t;destino\r\n\t\r\n   \tld e,(ix+4)\r\n\tld d,(ix+5)\t;texto origen\r\n\t\r\n\tld a,(ix+6) ;color\r\n\tld (color_uso+1),a\r\n    \r\n JP cpc_PrintGphStrStd0\r\n \r\n \r\n \r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrXY.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrXY\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\n\r\nGLOBAL cpc_PrintGphStr0\r\nGLOBAL direcc_destino0\r\n.cpc_PrintGphStrXY\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld L,(ix+0)\r\n\tld A,(ix+2)\t;pantalla\r\n\t\r\n\tcall cpc_GetScrAddress0   \r\n\t;ld (cpc_PrintGphStr0+direcc_destino0),hl\r\n\t;ex de,hl\r\n\t;destino\r\n\t\r\n   \tld e,(ix+4)\r\n\tld d,(ix+5)\t;texto origen\r\n\txor a\r\n    \r\n JP cpc_PrintGphStr0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrXY2X.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrXY2X\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\n\r\nGLOBAL cpc_PrintGphStr0\r\nGLOBAL direcc_destino0\r\n.cpc_PrintGphStrXY2X\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld L,(ix+0)\r\n\tld A,(ix+2)\t;pantalla\r\n\t\r\n\tcall cpc_GetScrAddress0   \r\n\t;ld (cpc_PrintGphStr0+direcc_destino0),hl\r\n\t;ex de,hl\r\n\t;destino\r\n\t\r\n   \tld e,(ix+4)\r\n\tld d,(ix+5)\t;texto origen\r\n\tld a,1\r\n    \r\n JP cpc_PrintGphStr0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrXYM1.asm",
    "content": " ; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrXYM1\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\nGLOBAL cpc_PrintGphStr0M1\r\n\r\nGLOBAL direcc_destino0_m1\r\n\r\n.cpc_PrintGphStrXYM1\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld L,(ix+0)\r\n\tld A,(ix+2)\t;pantalla\r\n\t\r\n\tcall cpc_GetScrAddress0   \r\n\r\n\t;destino\r\n\t\r\n   \tld e,(ix+4)\r\n\tld d,(ix+5)\t;texto origen\r\n\txor a\r\n    \r\n JP cpc_PrintGphStr0M1"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintGphStrXYM12X.asm",
    "content": " ; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PrintGphStrXYM12X\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\nGLOBAL cpc_PrintGphStr0M1\r\n\r\nGLOBAL direcc_destino0_m1\r\n\r\n.cpc_PrintGphStrXYM12X\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld L,(ix+0)\r\n\tld A,(ix+2)\t;pantalla\r\n\t\r\n\tcall cpc_GetScrAddress0   \r\n\r\n\t;destino\r\n\t\r\n   \tld e,(ix+4)\r\n\tld d,(ix+5)\t;texto origen\r\n\tld a,1\r\n    \r\n JP cpc_PrintGphStr0M1"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PrintStr.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\n;Rutina que emplea el firmware\r\n\r\nGLOBAL cpc_PrintStr\r\n\r\n.cpc_PrintStr \r\n\t \r\n\t;ld hl,2\r\n    ;add hl,sp\t\t\t\r\n\t;ld e,(hl)\r\n\t;inc hl\r\n\t;ld d,(hl)\r\n\t\r\n\t;pop af\t\t;guardo la pila\r\n\t;pop de\t\t;recogo el parmetro\r\n\t;push af\t\t;restauro la pila\r\n\t\r\n\t.bucle_imp_cadena\r\n\t\tld a,(hl)\t\r\n\t\tor a ;\t\tcp 0\r\n\t\tjr z,salir_bucle_imp_cadena\r\n\t\tcall $bb5a\r\n\t\tinc hl\r\n\t\tjr bucle_imp_cadena\r\n\t.salir_bucle_imp_cadena\r\n\t\tld a,$0d\t; para terminar hace un salto de lnea\r\n\t\tcall $bb5a \r\n\t\tld a,$0a\r\n\t\tjp $bb5a \r\n\t\t\r\n\t\t;ret\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutCpSpTileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutCpSpTileMap2b\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_PutCpSpTileMap2b\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n\r\n    ex de,hl\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \r\n  ;lo cambio para la rutina de multiplicar \r\n    ld a,(ix+8)\r\n    ld e,(ix+9)\r\n\r\n\r\ninclude \"multiplication1.asm\"\r\n\t\r\n\r\n\t\r\n\tld b,0\r\n\tld c,a\r\n\tadd hl,bc\r\n\tld de,posicion_inicial_superbuffer\r\n\tadd hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n\r\n\t\t\t\r\n\tld (ix+4),l\t\t;update superbuffer address\r\n    ld (ix+5),h\r\n    \r\n    \r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\t\r\nex de,hl\r\ninc hl\r\ninc hl\r\n    jp (hl)\r\n    \r\n \t\r\n\r\n\t\t\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutMaskSp.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutMaskSp\r\n\r\n\r\nGLOBAL cpc_PutMaskSp0\r\nGLOBAL suma_siguiente_linea_m0\r\nGLOBAL ancho_m0\r\n\r\n\r\n.cpc_PutMaskSp\t; dibujar en pantalla el sprite\r\n\t\t; Entradas\tbc-> Alto Ancho\r\n\t\t;\t\t\tde-> origen\r\n\t\t;\t\t\thl-> destino\r\n\t\t; Se alteran hl, bc, de, af\t\t\t\r\n\t\t\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\t\r\n\tld a,(ix+2)\r\n\t\r\n   \tld e,(ix+6)\r\n\tld d,(ix+7)\r\n\r\n    ld (cpc_PutMaskSp0+ancho_m0+1),a\t\t;actualizo rutina de captura\r\n    ;ld (anchot+1),a\t;actualizo rutina de dibujo \r\n\tsub 1\r\n\tcpl\r\n\tld (cpc_PutMaskSp0+suma_siguiente_linea_m0+1),a    ;comparten los 2 los mismos valores.\t\t\r\n\t\r\n\tld A,(ix+4)  \r\n\tjp cpc_PutMaskSp0\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutMaskSp0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutMaskSp0\r\nGLOBAL ancho_m0 \r\nGLOBAL suma_siguiente_linea_m0 \r\n\r\n\t\t\r\n.cpc_PutMaskSp0\r\n\t\tdefb $fD\r\n   \t\tLD H,a\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t.loop_alto_2m\r\n\t   ld c,4\r\n\t   ex de,hl\r\n\t.loop_ancho_2m\t\t\r\n\t\t\r\n\t\tLD A,(DE)\t;leo el byte del fondo\t\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\t\t\r\n\r\n\t\tdec c\r\n\t\tjp nz,loop_ancho_2m\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\t   ex de,hl\r\n\t   \t   \r\n.salto_lineam\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2m ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2m\t\r\n\r\n\r\n\t\t\t\t\r\nDEFC ancho_m0 = loop_alto_2m\r\nDEFC suma_siguiente_linea_m0 = salto_lineam"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutMaskSp2x8.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutMaskSp2x8\t\t\r\n; imprime un sprite de 8x8 en modo 1\r\n; El formato del sprite es el siguiente por cada lnea:\r\n; defb byte1,byte2,byte3,byte4\r\n; siendo byte1 y byte3 son las mscaras de los bytes 2 y 4\r\n; se recibe de entrada el sprite y la posicin.\r\n.cpc_PutMaskSp2x8\r\n\tld ix,2\r\n\tadd ix,sp\r\n   \t\t   \t\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\t\t\r\n\tld e,(ix+2)\r\n\tld d,(ix+3)\r\n\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t.loop_alto_mask_2x8\r\n\t.loop_ancho_mask_2x8\r\n\t\tEX DE,HL\r\n\t\tLD A,(DE)\t;leo el byte del fondo\t\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n;COMO SOLO SON 2 BYTES, es ms rpido y econmico desplegar la rutina\r\n\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro con el sprite\r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\r\n\t   defb $fD\r\n\t   dec H\t\t;decremento el alto del sprite\r\n\t   ret z\r\n\t   EX DE,HL\r\n.suma_siguiente_linea_mask_2x8\t\t;\r\n\t\tLD C,$fe\t\t\t;$07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_mask_2x8\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_mask_2x8\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutMaskSp4x16.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutMaskSp4x16\r\n\r\n.cpc_PutMaskSp4x16\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\r\n\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\t\t\r\n\tld e,(ix+2)\r\n\tld d,(ix+3)\r\n\t\r\n\t\t;ld a,16\t\t;alto\r\n\t\tdefb $fD\r\n   \t\tLD H,16\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t.loop_alto_mask_4x16\r\n\t.loop_ancho_mask_4x16\r\n\t\tEX DE,HL\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n;COMO SOLO SON 4 BYTES, es ms rpido y econmico desplegar la rutina\r\n\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\t   EX DE,HL\r\n.suma_siguiente_linea_mask_4x16\t\t;\r\n\t\tLD C,$fc\t\t\t;$07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_mask_4x16 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_mask_4x16\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutMaskSpTileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutMaskSpTileMap2b\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_PutMaskSpTileMap2b\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n    ex de,hl\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \r\n\r\n   \r\n    ld a,(ix+8)\r\n    ld e,(ix+9)\r\n    \r\ninclude \"multiplication1.asm\"\r\n   \r\n\r\n\r\n\tld b,0\r\n\tld c,a\r\n\tadd hl,bc\r\n\t;HL=E*H+D\r\n\r\n\r\n\r\n\r\n\t\r\n\tld de,posicion_inicial_superbuffer\r\n\tadd hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n\t\r\n\tld (ix+4),l\t\t;update superbuffer address\r\n    ld (ix+5),h\r\n    \r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\t\r\n    ;con el alto del sprite hago las actualizaciones necesarias a la rutina\r\n    ld a,(de)\r\n    ld (loop_alto_map_sbuffer+2),a\r\n    ld b,a\r\n    ld a,ancho_pantalla_bytes\r\n    sub b\r\n    ld (ancho_2+1),a\r\n\tinc de\r\n\tld a,(de)\r\n\tinc de\r\n\t\r\n\t;ld a,16\t\t;necesito el alto del sprite\r\n\t\r\n\t\r\n\t\r\n.sp_buffer_mask\r\n\tld b,0\r\n.ancho_2\t\r\n\tld c,ancho_pantalla_bytes-4 ;60\t;;DEPENDE DEL ANCHO\r\n\r\n\t;defb $fd\r\n\t;LD H,A\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\tld ixh,a\r\n.loop_alto_map_sbuffer\r\n\t\t;defb $fd\r\n\t\t;LD L,4\t\t;ANCHO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld ixl,4\r\n\t\tex de,hl\r\n.loop_ancho_map_sbuffer\t\t\r\n\r\n\t\t\t\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\t\t\r\n\t\t;defb $fD\r\n\t\t;DEC L\t\t;resta ancho\r\n\t\tdec ixl\r\n\t\tJP NZ,loop_ancho_map_sbuffer\r\n\t\t\r\n\t   ;defb $fd\r\n\t   ;dec H\r\n\t   dec ixh\r\n\t   ret z\r\n\t   EX DE,HL\r\n;hay que sumar 72 bytes para pasar a la siguiente lnea\r\n\t\tadd HL,BC\t\r\n\t\tjp loop_alto_map_sbuffer\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutMaskSprite.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutMaskSprite\r\n\r\n\r\nGLOBAL cpc_PutMaskSp0\r\nGLOBAL suma_siguiente_linea_m0\r\nGLOBAL ancho_m0\r\n\r\n\r\n.cpc_PutMaskSprite\t; dibujar en pantalla el sprite\r\n\t\t; Entradas\tbc-> Alto Ancho\r\n\t\t;\t\t\tde-> origen\r\n\t\t;\t\t\thl-> destino\r\n\t\t; Se alteran hl, bc, de, af\t\t\t\r\n\t\t\r\n\t\r\npop af\r\npop de\r\npop hl\r\npush af\r\n\r\n\tld a,(hl)\t\t;ancho\r\n\tinc hl\r\n\r\n    ld (cpc_PutMaskSp0+ancho_m0+1),a\t\t;actualizo rutina de captura\r\n    ;ld (anchot+1),a\t;actualizo rutina de dibujo \r\n\tsub 1\r\n\tcpl\r\n\tld (cpc_PutMaskSp0+suma_siguiente_linea_m0+1),a    ;comparten los 2 los mismos valores.\t\t\r\n\t\r\n\tld a,(hl)\t;alto\r\n\tinc hl\t\r\n\tex de,hl\r\n\t\r\n\tjp cpc_PutMaskSp0\r\n\r\n\t\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutMaskSpriteTileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutMaskSpriteTileMap2b\r\n; Put a masked sprite in superbuffer\r\n; The sprite must have coord0 updated because this routine doesn't calculate\r\n; the superbuffer address using cx,cy \r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_PutMaskSpriteTileMap2b\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n   ; ld ix,2\r\n   ; add ix,sp\r\n    \r\n    \r\n  ;  ld l,(ix+0)\r\n  ;  ld h,(ix+1)\t;HL apunta al sprite\r\n        \r\n    ;push hl\r\n    ;pop ix\r\n    \r\n    ex de,hl\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \r\n    ld l,(ix+4)\r\n    ld h,(ix+5)\r\n    \r\n  ;lo cambio para la rutina de multiplicar \r\n  ;  ld a,(ix+8)\r\n  ;  ld e,(ix+9)\r\n    ;ld (coord2),de    \r\n   \r\n    ;ld l,(ix+0)\r\n    ;ld h,(ix+1)\t;HL apunta al sprite\r\n\r\n\r\n\t;CALL transferir_sprite\r\n\r\n\t;RET\r\n\t\r\n\t\r\n\r\n\r\n.pasa_bloque_a_sbuffer\r\n\r\n\r\n\r\n\t\r\n.transferir_sprite\r\n\r\n; segn coordenadas, se busca la posicin en buffer.\r\n\r\n\t;ld de,(coord2)\t\t;E ancho D alto\r\n\r\n\t;NUEVA FORMA. LAS POSICIONES VIENEN PREVIAMENTE CALCULADAS DESDE FUERA.\r\n\t\r\n;multiplica ExH\r\n\r\n\r\n\t\r\n\r\n;en HL Tengo el valor\r\n\r\n\t;ld b,0\r\n\t;ld c,a\r\n\t;add hl,bc\r\n\t;ld de,posicion_inicial_superbuffer\r\n\t;add hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n\t\r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\t\r\n    ;con el ancho del sprite hago las actualizaciones necesarias a la rutina\r\n    ld a,(de)\r\n    ld (loop_alto_map_sbuffer+2),a\t;marco el ancho del sprite para la rutina de impresin\r\n    ld b,a\r\n    ld a,ancho_pantalla_bytes\r\n    sub b\r\n    ld (ancho_2+1),a\t;calculo el salto a la siguiene lnea en funcin del ancho\r\n    \t\t\t\t\t;de la pantalla y del sprite\r\n\tinc de\r\n\tld a,(de)\t;alto sprite en A\r\n\tinc de\r\n\t\r\n\t;ld a,16\t\t;necesito el alto del sprite\r\n\t\r\n\t\r\n\t\r\n.sp_buffer_mask\r\n\tld b,0\r\n.ancho_2\t\r\n\tld c,ancho_pantalla_bytes-4 ;60\t;;DEPENDE DEL ANCHO\r\n\r\n\t;defb $fd\r\n\t;LD H,A\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\tld ixh,a\r\n.ancho_sprite\t\t\r\n.loop_alto_map_sbuffer\r\n\t\t;defb $fd\r\n\t\t;LD L,4\t\t;ANCHO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld ixl,4\r\n\t\tex de,hl\r\n\t\t\r\n.loop_ancho_map_sbuffer\t\t\r\n\r\n\t\t\t\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n\t\tAND (HL)\t;lo enmascaro\t\t\r\n\t\tINC HL\r\n\t\tOR (HL)\t\t;lo enmascaro \r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\t\t\r\n\t\t;defb $fd\r\n\t\t;DEC L\r\n\t\tdec ixl\r\n\t\tJP NZ,loop_ancho_map_sbuffer\r\n\t\t\r\n\t   ;defb $fd\r\n\t   ;dec H\r\n\t   dec ixh\r\n\t   ret z\r\n\t   EX DE,HL\r\n;hay que sumar 72 bytes para pasar a la siguiente lnea\r\n\t\tadd HL,BC\t\r\n\t\tjp loop_alto_map_sbuffer\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutORSpTileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutORSpTileMap2b\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_PutORSpTileMap2b\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n   ; ld ix,2\r\n   ; add ix,sp\r\n    \r\n    \r\n   ; ld l,(ix+0)\r\n   ; ld h,(ix+1)\t;HL apunta al sprite\r\n        \r\n    ;push hl\r\n    ;pop ix\r\n    ex de,hl\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \r\n  ;lo cambio para la rutina de multiplicar \r\n    ld a,(ix+8)\r\n    ld e,(ix+9)\r\n\r\n    include \"multiplication1.asm\"\r\n\t\r\n\r\n\r\n\tld b,0\r\n\tld c,a\r\n\tadd hl,bc\r\n\tld de,posicion_inicial_superbuffer\r\n\tadd hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n\t\r\n\tld (ix+4),l\t\t;update superbuffer address\r\n    ld (ix+5),h\r\n    \t\r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\t\r\n    ;con el alto del sprite hago las actualizaciones necesarias a la rutina\r\n    ld a,(de)\r\n    ld (loop_alto_map_sbuffer+2),a\r\n    ld b,a\r\n    ld a,ancho_pantalla_bytes\r\n    sub b\r\n    ld (ancho_2+1),a\r\n\tinc de\r\n\tld a,(de)\r\n\tinc de\r\n\t\r\n\t;ld a,16\t\t;necesito el alto del sprite\r\n\t\r\n\t\r\n\t\r\n.sp_buffer_mask\r\n\tld b,0\r\n.ancho_2\t\r\n\tld c,ancho_pantalla_bytes-4 ;60\t;;DEPENDE DEL ANCHO\r\n\r\n\t;defb $fd\r\n\t;LD H,A\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\tld ixh,a\r\n.loop_alto_map_sbuffer\r\n\t\t;defb $fd\r\n\t\t;LD L,4\t\t;ANCHO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld ixl,4\r\n\t\tex de,hl\r\n.loop_ancho_map_sbuffer\t\t\r\n\r\n\t\t\t\r\n\t\tLD A,(DE)\t;leo el byte del fondo\r\n;\t\tAND (HL)\t;lo enmascaro\t\t\r\n;\t\tINC HL\r\n\t\tOR (HL)\t\t;hago OR con sprite y\r\n\t\tLD (DE),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\t\t\r\n;\t\tdefb $fd\r\n\t;\tDEC L\r\n\t\tdec ixl\r\n\t\tJP NZ,loop_ancho_map_sbuffer\r\n\t\t\r\n\t   ;defb $fd\r\n\t   ;dec H\r\n\t   dec ixh\r\n\t   ret z\r\n\t   EX DE,HL\r\n;hay que sumar 72 bytes para pasar a la siguiente lnea\r\n\t\tadd HL,BC\t\r\n\t\tjp loop_alto_map_sbuffer\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSp.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSp\r\n\r\n\r\nGLOBAL cpc_PutSp0\r\nGLOBAL suma_siguiente_linea0\r\nGLOBAL ancho0\r\n\r\n\r\n.cpc_PutSp\t; dibujar en pantalla el sprite\r\n\t\t; Entradas\tbc-> Alto Ancho\r\n\t\t;\t\t\tde-> origen\r\n\t\t;\t\t\thl-> destino\r\n\t\t; Se alteran hl, bc, de, af\t\t\t\r\n\t\t\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\t\r\n\tld a,(ix+2)\r\n\t\r\n   \tld e,(ix+6)\r\n\tld d,(ix+7)\r\n\r\n    ld (cpc_PutSp0+ancho0+1),a\t\t;actualizo rutina de captura\r\n    ;ld (anchot+1),a\t;actualizo rutina de dibujo \r\n\tsub 1\r\n\tcpl\r\n\tld (cpc_PutSp0+suma_siguiente_linea0+1),a    ;comparten los 2 los mismos valores.\t\t\r\n\t\r\n\tld A,(ix+4)  \r\n\tjp cpc_PutSp0\r\n\t\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSp0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSp0\r\nGLOBAL ancho0 \r\nGLOBAL suma_siguiente_linea0 \r\n\r\n\t\t\r\n.cpc_PutSp0\r\n\t\tdefb $fD\r\n   \t\tLD H,a\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t.loop_alto_2\r\n\t   ld c,4\t\t; << PARAMETRO ANCHO\r\n\t.loop_ancho_2\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\tdec c\r\n\t\tjp nz,loop_ancho_2\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\r\n\t   \t   \r\n.salto_linea\r\n\t\tLD C,$ff\t\t\t;<< PARAMETRO salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2\t\r\n\r\n\r\n\t\t\t\t\r\nDEFC ancho0 = loop_alto_2\r\nDEFC suma_siguiente_linea0 = salto_linea"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpTileMap.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpTileMap\t\t;se encarga de actualizar los tiles que toca el sprite \r\n\r\nGLOBAL bit_ancho\r\nGLOBAL bit_alto\r\nGLOBAL solo_coordenadas \r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\n\r\n\r\n\r\n\r\nGLOBAL cpc_UpdTileTable\r\n\r\n.cpc_PutSpTileMap\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n    ;ld ix,2\r\n    ;add ix,sp\r\n    ;ld l,(ix+0)\r\n    ;ld h,(ix+1)\t;HL apunta al sprite\r\n    \r\n\t\r\n\t\r\n    ex de,hl\t;4\r\n\tLD IXH,d\t;9\r\n    LD IXL,e\t;9   \r\n\r\n                                                ;Obtencion de\r\n;dimensiones, solo usadas para calcular iteraciones -> BC\r\nld l, (ix+0)\r\nld h, (ix+1)        ;dimensiones del sprite\r\nld C,(hl)    ;; ANCHO\r\ninc hl\r\nld B,(hl) ;; ANCHO\r\nDec b\r\nDec c\r\n;->BC coord -1\r\n\r\n    ld l, (ix+10)\r\n    ld h, (ix+11)    ;recoje coordenadas anteriores\r\n\r\n    ld e, (ix+8)\r\n    ld d, (ix+9)\r\n    ld  (ix+10),e\r\n    ld  (ix+11),d\r\n\r\n\r\n;Obtencion x0y0 -> HL\r\nPUSH HL\r\nSrl l  ; x0/2\r\nSrl h\r\nSrl h\r\nSrl h ; y0/8\r\nEx de,hl  ;-> Guarda de con origen de loops\r\n\r\nPOP hl ;(recuperar coord xoyo)\r\nAdd hl,bc  ;(Suma de dimensiones)\r\nSrl l ; (x0+ancho)/2\r\nSrl h\r\nSrl h\r\nSrl h; (y0+alto)/2\r\n\r\nxor a\r\nSBC hl,de        ;diferencia entre bloque inicial y bloque con dimensiones\r\n\r\n;Hl tiene iteraciones en i,j partiendo de origen loops\r\nLd a,h\r\nInc a\r\nLd (pasos_alto_xW+1),a\r\nLd a,l\r\nInc a\r\n;Ld (pasos_ancho_x+1),a\r\n\r\n;Loop from d, i veces\r\n;Loop from e, j veces\r\n\r\npasos_ancho_xW:    ; *parametro\r\n    ld b,a\r\nbucle_pasos_anchoW:\r\n    push de\r\npasos_alto_xW: ; *parametro\r\n    ld c,0\r\nbucle_pasos_altoW:\r\n        ; Mete E y D\r\n            call cpc_UpdTileTable\r\n        inc d\r\n        dec c\r\n        jp nz,bucle_pasos_altoW\r\n\r\n    pop de\r\n    inc e\r\n    dec b\r\n    jp nz,bucle_pasos_anchoW\r\n\r\n    ret\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpTileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpTileMap2b\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_PutSpTileMap2b\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n   ; ld ix,2\r\n   ; add ix,sp\r\n    \r\n    \r\n    ;ld l,(ix+0)\r\n    ;ld h,(ix+1)\t;HL apunta al sprite\r\n        \r\n    ;push hl\r\n    ;pop ix\r\n    ex de,hl\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \r\n  ;lo cambio para la rutina de multiplicar \r\n    ld a,(ix+8)\r\n    ld e,(ix+9)\r\n\r\n\r\ninclude \"multiplication1.asm\"\r\n\t\r\n\r\n\t\r\n\tld b,0\r\n\tld c,a\r\n\tadd hl,bc\r\n\tld de,posicion_inicial_superbuffer\r\n\tadd hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n\r\n\t\t\t\r\n\tld (ix+4),l\t\t;update superbuffer address\r\n    ld (ix+5),h\r\n    \r\n    \r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\t\r\n    ;con el alto del sprite hago las actualizaciones necesarias a la rutina\r\n    ld a,(de)\r\n    ld (loop_alto_map_sbuffer+2),a\r\n    ld b,a\r\n    ld a,ancho_pantalla_bytes\r\n    sub b\r\n    ld (ancho_2+1),a\r\n\tinc de\r\n\tld a,(de)\r\n\tinc de\r\n\t\r\n\t;ld a,16\t\t;necesito el alto del sprite\r\n\t\r\n\t\r\n\t\r\n.sp_buffer_mask\r\n\tld b,0\r\n.ancho_2\t\r\n\tld c,ancho_pantalla_bytes-4 ;60\t;;DEPENDE DEL ANCHO\r\n\r\n\t;defb $fD\r\n\t;LD H,A\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\tld ixh,a\r\n.loop_alto_map_sbuffer\r\n\t\t;defb $fD\r\n\t\t;LD L,4\t\t;ANCHO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld ixl,4\r\n\t\tex de,hl\r\n.loop_ancho_map_sbuffer\t\t\r\n\r\n\t\t\t\r\n\t\tLD A,(hl)\t;leo el byte del fondo\r\n\t\t;AND (HL)\t;lo enmascaro\t\t\r\n\t\t;INC HL\r\n\t\t;OR (HL)\t\t;lo enmascaro \r\n\t\tLD (de),A\t;actualizo el fondo\r\n\t\tINC DE\r\n\t\tINC HL\r\n\t\t\r\n\t\t\r\n\t\t;defb $fD\r\n\t\t;DEC L\t\t;resta ancho\r\n\t\tdec ixl\r\n\t\tJP NZ,loop_ancho_map_sbuffer\r\n\t\t\r\n\t   ;defb $fD\r\n\t   ;dec H\r\n\t   dec ixh\r\n\t   ret z\r\n\t   EX DE,HL\r\n;hay que sumar 72 bytes para pasar a la siguiente lnea\r\n\t\tadd HL,BC\t\r\n\t\tjp loop_alto_map_sbuffer\r\n\r\n\t\t\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpTileMapO.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpTileMapO\t\t;se encarga de actualizar los tiles que toca el sprite \r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL solo_coordenadas \r\n\r\nGLOBAL bit_ancho\r\nGLOBAL bit_alto\r\n\r\nGLOBAL cpc_PutSpTileMap\r\nGLOBAL cpc_UpdTileTable\r\n\r\n\r\n\r\n.cpc_PutSpTileMapO\r\n\r\n    ex de,hl\t;4\r\n\tLD IXH,d\t;9\r\n    LD IXL,e\t;9   \r\n    ld e,(ix+0)\r\n    ld d,(ix+1)\r\n    \r\n    LD A,(de)\r\n    ld (bit_ancho+1),a\r\n    \r\n    inc de\r\n    LD A,(de)\r\n\tld (bit_alto+1),a\r\n\tld e,(ix+10)\r\n    ld d,(ix+11)\r\n    jp solo_coordenadas    \r\n    \r\n "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpTr.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpTr\r\n\r\nGLOBAL cpc_PutSpTr0\r\nGLOBAL anchot\r\nGLOBAL suma_siguiente_lineat\r\n\r\n\r\n.cpc_PutSpTr\t; dibujar en pantalla el sprite\r\n\t\t; Entradas\tbc-> Alto Ancho\r\n\t\t;\t\t\tde-> origen\r\n\t\t;\t\t\thl-> destino\r\n\t\t; Se alteran hl, bc, de, af\t\t\t\r\n\t\t\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\t\r\n\tld a,(ix+2)\r\n\t\r\n   \tld e,(ix+6)\r\n\tld d,(ix+7)\r\n\r\n    \r\n    ld (cpc_PutSpTr0+anchot+1),a\t;actualizo rutina de dibujo \r\n\tsub 1\r\n\tcpl\r\n\tld (cpc_PutSpTr0+suma_siguiente_lineat+1),a    ;comparten los 2 los mismos valores.\t\t\r\n\t\r\n\tld A,(ix+4)  \r\n\tjp  cpc_PutSpTr0\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpTr0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpTr0\r\n\r\nGLOBAL suma_siguiente_lineat\r\nGLOBAL anchot\r\n\t   \r\n.cpc_PutSpTr0\r\n\t\tdefb $fD\r\n   \t\tLD H,a\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\r\n\t.loop_alto_2t\r\n\t   ld b,0\r\n\t\t;push hl\r\n\t.loop_ancho_2t\t\t\r\n\t\tld A,(DE)\r\n\t\t\r\n\tand $aa\r\n\tjp z,sig_pixn_der_2\r\n\tld c,a ;B es el nico registro libre\r\n\tld a,(hl) ;pixel actual donde pinto\r\n\tand $55\r\n\tor c\r\n\tld (hl),a ;y lo pone en pantalla\r\n.sig_pixn_der_2\r\n\tld a,(de) ;pixel del sprite\r\n\tand $55\r\n\tjp z,pon_buffer_der_2\r\n\tld c,a ;B es el nico registro libre\r\n\tld a,(hl) ;pixel actual donde pinto\r\n\tand $aa\r\n\tor c\r\n\r\n\t\r\n\t\r\n\t\tld (hl),a\r\n\t.pon_buffer_der_2\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\tdec b\r\n\t\tjp nz,loop_ancho_2t\r\n\t\t;pop hl\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n.salto_lineat\r\n\t\tLD bC,$07ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2t ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\t;ld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2t\t\t   \r\n\t     \t\t\r\n\t\tld A,H\r\n\t\tadd $08\r\n\t\tld H,A\r\n\t\tsub $C0\r\n\t\tjp nc,loop_alto_2t ;sig_linea_2\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\t\r\n\t   jp loop_alto_2t\r\n\t   \r\n\r\nDEFC anchot = loop_alto_2t\r\nDEFC suma_siguiente_lineat = salto_lineat\t   "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpXOR.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpXOR\r\n\r\n\r\nGLOBAL cpc_PutSpXOR0\r\nGLOBAL suma_siguiente_lineax0\r\nGLOBAL anchox0\r\n\r\n\r\n.cpc_PutSpXOR\t; dibujar en pantalla el sprite\r\n\t\t; Entradas\tbc-> Alto Ancho\r\n\t\t;\t\t\tde-> origen\r\n\t\t;\t\t\thl-> destino\r\n\t\t; Se alteran hl, bc, de, af\t\t\t\r\n\t\t\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\r\n\tld h,(ix+1)\r\n\t\r\n\tld a,(ix+2)\r\n\t\r\n   \tld e,(ix+6)\r\n\tld d,(ix+7)\r\n\r\n    ld (cpc_PutSpXOR0+anchox0+1),a\t\t;actualizo rutina de captura\r\n    ;ld (anchot+1),a\t;actualizo rutina de dibujo \r\n\tsub 1\r\n\tcpl\r\n\tld (cpc_PutSpXOR0+suma_siguiente_lineax0+1),a    ;comparten los 2 los mismos valores.\t\t\r\n\t\r\n\tld A,(ix+4)  \r\n\tjp cpc_PutSpXOR0\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpXOR0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpXOR0\r\nGLOBAL anchox0 \r\nGLOBAL suma_siguiente_lineax0 \r\n\r\n\t\t\r\n.cpc_PutSpXOR0\r\n\t\tdefb $fD\r\n   \t\tLD H,a\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t.loop_alto_2x\r\n\t   ld c,4\r\n\t.loop_ancho_2x\t\t\r\n\t\tld A,(DE)\r\n\t\tXOR (HL)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\tdec c\r\n\t\tjp nz,loop_ancho_2x\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\r\n\t   \t   \r\n.salto_lineax\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2x ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_2x\t\r\n\r\n\r\n\t\t\t\t\r\nDEFC anchox0 = loop_alto_2x\r\nDEFC suma_siguiente_lineax0 = salto_lineax"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSprite.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\nGLOBAL cpc_PutSprite\t\r\n;*************************************\r\n; SPRITE ROUTINE WITHOUT TRANSPARENCY\r\n; Supplied by Tim Riemann\r\n; from a German forum\r\n; DE = source address of the sprite\r\n;      (includes header with 1B width [64byte maximum!], 1B height)\r\n; HL = destination address\r\n;*************************************\r\n.cpc_PutSprite\r\n\r\npop af\r\npop de\t;destination address\r\npop hl\t;sprite data\t\r\npush af\r\n\r\n\r\n\r\n        ;ex de,hl\r\n        ld a,64\r\n        sub (hl)\r\n        add a\r\n        ld (width1+1),a\r\n        xor a\r\n        sub (hl)\r\n        ld (width2+1),a\r\n        inc hl\r\n        ld a,(hl)\r\n        inc hl \r\n\t\t\r\n.width0 \r\n\t\t;ex de,hl \r\n.width1\r\n\t\tjr width1 ;cada LDI es un byte \r\n;se hace el salto al byte correspondiente (64-ancho) \r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        \r\n                ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        \r\n                ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        \r\n                ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        \r\n                ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        \r\n                ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n        \r\n        ldi\r\n        ldi\r\n        ldi\r\n        ldi\r\n  \r\n.width2\r\n   ld bc,$700 \r\n   ex de,hl \r\n        add hl,bc \r\n        jp nc,width3 \r\n        ld bc,$c050 \r\n        add hl,bc \r\n  .width3\r\n  \tex de,hl\r\n    dec a \r\n    jp nz, width1\r\n    \r\n   ret ; z  \r\n        \r\n        "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutSpriteXOR.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutSpriteXOR\t\t;el sprite viene con dimensiones\r\n\r\n\r\nGLOBAL cpc_PutSpXOR0\r\nGLOBAL suma_siguiente_lineax0\r\nGLOBAL anchox0\r\n\r\n\r\n.cpc_PutSpriteXOR\t; dibujar en pantalla el sprite\r\n\t\t; Entradas\tbc-> Alto Ancho\r\n\t\t;\t\t\tde-> origen\r\n\t\t;\t\t\thl-> destino\r\n\t\t; Se alteran hl, bc, de, af\t\t\t\r\n\r\n\t\t\r\npop af\r\npop de\r\npop hl\r\npush af\r\n\r\n\t\t\t\t\r\n;\tld ix,2\r\n;\tadd ix,sp\r\n\t\r\n;\tld e,(ix+0)\r\n;\tld d,(ix+1)\t\t;destino\r\n\t\r\n\t;ld a,(ix+2)\r\n\t\r\n;   \tld l,(ix+2)\r\n;\tld h,(ix+3)\t\t;origen\r\n\t\r\n\tld a,(hl)\t\t;ancho\r\n\tinc hl\r\n    ld (cpc_PutSpXOR0+anchox0+1),a\t\t;actualizo rutina de captura\r\n    ;ld (anchot+1),a\t;actualizo rutina de dibujo \r\n\tsub 1\r\n\tcpl\r\n\tld (cpc_PutSpXOR0+suma_siguiente_lineax0+1),a    ;comparten los 2 los mismos valores.\t\t\r\n\r\n\tld a,(hl)\t;alto\r\n\tinc hl\t\r\n\tex de,hl\r\n\t\r\n\t;ld A,(ix+4)  \r\n\tjp cpc_PutSpXOR0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutTile2x8.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutTile2x8\t\t\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\n.cpc_PutTile2x8 ;siempre se dibujan en posicion caracter as que no hay saltos raros en HL, se puede quitar la ltima parte\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\r\n\r\n\tld L,(ix+0)\r\n\tld A,(ix+2)\t;pantalla\r\n\t\r\n\tcall cpc_GetScrAddress0\r\n\t\t\r\n\tld E,(ix+4)\r\n\tld D,(ix+5)\t;DE sprite\r\n\t\r\n\r\n\t\t;LD A,8\r\n\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t\t\r\n\t.loop_alto_tile_2x8\r\n\t.loop_ancho_tile_2x8\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n\t\t;inc hl\r\n\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\t   \r\n.suma_siguiente_linea0_tile_2x8\t\t;\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_tile_2x8 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_tile_2x8\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutTile2x8b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutTile2x8b\t\t\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\n.cpc_PutTile2x8b ;siempre se dibujan en posicion caracter as que no hay saltos raros en HL, se puede quitar la ltima parte\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\r\n\r\n\tld L,(ix+0)\r\n\tld h,(ix+1)\t;pantalla\r\n\t\r\n\t;call cpc_GetScrAddress0\r\n\t\t\r\n\tld E,(ix+2)\r\n\tld D,(ix+3)\t;DE sprite\r\n\t\r\n\r\n\t\t;LD A,8\r\n\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t\t\r\n\t.loop_alto_tile_2x8\r\n\t.loop_ancho_tile_2x8\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n;\t\tinc hl\r\n\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\t   \r\n.suma_siguiente_linea0_tile_2x8\t\t;\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_tile_2x8 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_tile_2x8\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutTile4x16.asm",
    "content": "; ******************************************************\r\n; **       Librer�a de rutinas para Amstrad CPC       **\r\n; **\t   Ra�l Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutTile4X16\t\t\r\n\r\nGLOBAL cpc_GetScrAddress0\r\n\r\n.cpc_PutTile4X16 ;siempre se dibujan en posicion caracter as� que no hay saltos raros en HL, se puede quitar la �ltima parte\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\r\n\r\n\tld L,(ix+0)\r\n\tld A,(ix+2)\t;pantalla\r\n\t\r\n\tcall cpc_GetScrAddress0\r\n\t\t\r\n\tld E,(ix+4)\r\n\tld D,(ix+5)\t;DE sprite\r\n\t\r\n\r\n\t\t;LD A,8\r\n\r\n\t\t\r\n   \t\tLD a,16\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\t;ld b,7\r\n\t\t\r\n\t.loop_alto_tile_2x8\r\n\t.loop_ancho_tile_2x8\t\r\n\tex de,hl\r\n\t\tldi\r\n\t\tldi\r\n\t\tldi\r\n\t\tldi\r\n\t\t\r\n\t \r\n\t   dec a\r\n\t   jp nz,suma_siguiente_linea0_tile_2x8\t\r\n\t   ret \r\n\t   \r\n.suma_siguiente_linea0_tile_2x8\t\t;\r\n\t\tex de,hl\r\n\t\tLD bC,$07fC\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_tile_2x8 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\t;ld b,7\t\t\t;s�lo se dar�a una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_tile_2x8\t\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutTiles.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutTiles\t\t;pone un byte en la posicin de la pantalla indicada\r\n\r\nGLOBAL pantalla_juego\r\nGLOBAL ancho_pantalla_bytes\r\n\r\n\r\nGLOBAL captura\r\n\r\n.cpc_PutTiles\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+0)\t\r\n\tld h,(ix+1)\t\r\n\t\r\n\tld c,(ix+2)\t;h\r\n\t;ld b,(ix+4)\t;w\r\n\r\n\tld e,(ix+6)\t;y\r\n\tld d,(ix+8)\t;x\t\r\n\t\r\n\t\r\n\t;lee el rectngulo y lo mueve al buffer\r\n\t\r\n\t.bucle_alto\r\n\tld b,(ix+4)\r\n\t.bucle_ancho\r\n\tpush de\r\n\tld a,(hl)\r\n\tld (tmp),a\r\n\t;e+c\r\n\tld a,c\r\n\tadd e\r\n\tld e,a\r\n\t;d+b\r\n\tld a,b\r\n\tadd d\r\n\tpush hl\r\n\tcall captura\r\n\tld a,(tmp)\r\n\tld (hl),a\r\n\tpop hl\r\n\tinc hl\t\t\r\n\tpop de\t\r\n\tdjnz bucle_ancho\t\r\n\t\r\n\tdec c\r\n\tjp nz,bucle_alto\r\n\tret\r\n\r\n\t;e=y\r\n\t;a=x\r\n.tmp defb 0\r\n\t\r\n.captura\r\n\t\tpush bc\r\n\t\tdec a\r\n\t\tdec e\r\n\t\tinclude \"multiplication2.asm\"\r\n\t\tpop bc\r\n\t\tld e,a\r\n\t\tld d,0\r\n\t\tadd hl,de\t\t;SUMA X A LA DISTANCIA Y*ANCHO\r\n\t\tld de,pantalla_juego\r\n\t\tadd hl,de\r\n\r\n\t\tret"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutTrSp8x16TileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutTrSp8x16TileMap2b\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\nGLOBAL mascara1\r\nGLOBAL mascara2\r\n\r\n.cpc_PutTrSp8x16TileMap2b\r\n\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n    ex de,hl\t;4\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n\r\n    ;push hl\t\t;10\r\n    ;pop ix\t\t\t;14\r\n    \r\n  ;lo cambio para la rutina de multiplicar \r\n    ld e,(ix+8)\t\t;x\r\n    ld l,(ix+9)\t\t;y\r\n\r\n\r\n.pasa_bloque_a_sbuffer\r\n\r\n.transferir_sprite\r\n\r\n\r\nld h,0\r\nld d,h\r\n\r\nadd hl,hl\t;2\r\nadd hl,hl\t;4\r\nld b,h\r\nld c,l\r\nadd hl,hl\t;8\r\nadd hl,hl\t;16\r\nadd hl,hl\t;32\r\nadd hl,hl\t;64\r\nsbc hl,bc\t;60\r\n\t\r\n\tadd hl,de\r\n\tld de,posicion_inicial_superbuffer\r\n\tadd hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n\r\n\t\t\t\r\n;\tld (ix+4),l\t\t;update superbuffer address\r\n;    ld (ix+5),h\r\n    \r\n    \r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\r\n\tinc de\r\n\tinc de\r\n\t\r\n\t\r\n.sp_buffer_mask\r\n\t;ld b,0\r\n.ancho_2\t\r\n\tld bc,$38\r\n\tld ixh,16\r\n.loop_alto_map_sbuffer\r\n\t\tex de,hl\r\n.loop_ancho_map_sbuffer\t\t\r\n\r\n;**********************************************\r\n\tld A,(hl)\t\t;sprite\r\n\tand $aa\r\n\tcp mascara2\r\n\tjp z,sig_pixn_der_2\r\n\t\r\n\tld b,a \r\n\tld a,(de)\t\t;fondo\r\n\tand $55\t\r\n\tor b\r\n\tld (de),a \r\n\t\r\n.sig_pixn_der_2\r\n\tld a,(hl) \r\n\tand $55\r\n\tcp mascara1\r\n\tjp z,pon_buffer_der_2\r\n\t\r\n\tld b,a \r\n\tld a,(de)\r\n\tand $aa\r\n\tor b\r\n\tld (de),a\r\n\t\r\n.pon_buffer_der_2\r\n\t\tINC DE\r\n\t\tINC HL\r\n;*************************************************\t\t\t\r\n;**********************************************\r\n\tld A,(hl)\r\n\r\n\tand $aa\t\t\t;deja solo los bits a comprobar\r\n\t\r\n\tcp mascara2\t\t;los comprueba comparando con mascara2\r\n\tjp z,sig_pixn_der_2a\r\n\tld b,a \r\n\tld a,(de)\t\t;fondo\t\r\n\tand $55\t\r\n\tor b\r\n\tld (de),a \r\n.sig_pixn_der_2a\r\n\tld a,(hl) \r\n\tand $55\r\n\tcp mascara1\r\n\tjp z,pon_buffer_der_2a\r\n\tld b,a \r\n\tld a,(de)\r\n\tand $aa\r\n\tor b\r\n\tld (de),a\r\n.pon_buffer_der_2a\r\n\t\tINC DE\r\n\t\tINC HL\r\n;*************************************************\t\t\r\n;**********************************************\r\n\tld A,(hl)\r\n\tand $aa\r\n\tcp mascara2\r\n\tjp z,sig_pixn_der_2b\r\n\tld b,a \r\n\tld a,(de)\r\n\tand $55\t\r\n\tor b\r\n\tld (de),a \r\n.sig_pixn_der_2b\r\n\tld a,(hl) \r\n\tand $55\r\n\tcp mascara1\r\n\tjp z,pon_buffer_der_2b\r\n\tld b,a \r\n\tld a,(de)\r\n\tand $aa\r\n\tor b\r\n\tld (de),a\r\n.pon_buffer_der_2b\r\n\t\tINC DE\r\n\t\tINC HL\r\n;*************************************************\t\t\r\n;**********************************************\r\n\tld A,(hl)\r\n\tand $aa\r\n\tcp mascara2\r\n\tjp z,sig_pixn_der_2c\r\n\tld b,a \r\n\tld a,(de)\r\n\tand $55\t\r\n\tor b\r\n\tld (de),a \r\n.sig_pixn_der_2c\r\n\tld a,(hl) \r\n\tand $55\r\n\tcp mascara1\r\n\tjp z,pon_buffer_der_2c\r\n\tld b,a \r\n\tld a,(de)\r\n\tand $aa\r\n\tor b\r\n\tld (de),a\r\n.pon_buffer_der_2c\r\n\t\tINC DE\r\n\t\tINC HL\r\n;*************************************************\t\t\r\n\t\t\r\n;\t\tdec ixl\r\n;\t\tJP NZ,loop_ancho_map_sbuffer\r\n\r\n\t   dec ixh\r\n\t   ret z\r\n\r\n\t   EX DE,HL\r\n\t   ld b,0\r\n       add HL,BC\t\r\n\t   jp loop_alto_map_sbuffer\r\n\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutTrSpTileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutTrSpTileMap2b\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\nGLOBAL mascara1\r\nGLOBAL mascara2\r\n\r\n.cpc_PutTrSpTileMap2b\r\n\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n    ex de,hl\r\n    \r\n  \r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \r\n;_______________________________________________________\r\n;____ GENERIC MULTIPLICATION ___________________________      \r\n  ;lo cambio para la rutina de multiplicar \r\n    ld a,(ix+8)\t\t\t;x\r\n    ld e,(ix+9)\t\t\t;y\r\n;hl = ExH\r\n\r\ninclude \"multiplication1.asm\"\r\n\r\n\r\n\r\n   \tld b,0\r\n\tld c,a\r\n\tadd hl,bc\r\n\t\r\n\t\r\n\t\r\n\tld de,posicion_inicial_superbuffer\r\n\tadd hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n\r\n\t\t\t\r\n\tld (ix+4),l\t\t;update superbuffer address\r\n    ld (ix+5),h\r\n    \r\n    \r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\t\r\n    ;con el alto del sprite hago las actualizaciones necesarias a la rutina\r\n    ld a,(de)\r\n    ld (loop_alto_map_sbuffer+2),a\r\n    ld b,a\r\n    ld a,ancho_pantalla_bytes\r\n    sub b\r\n    ld (ancho_2+1),a\r\n\tinc de\r\n\tld a,(de)\r\n\tinc de\r\n\t\r\n\t;ld a,16\t\t;necesito el alto del sprite\r\n\t\r\n\t\r\n\t\r\n.sp_buffer_mask\r\n\tld b,0\r\n.ancho_2\t\r\n\tld c,ancho_pantalla_bytes-4 ;60\t;;DEPENDE DEL ANCHO\r\n\r\n\t;defb $fD\r\n\t;LD H,A\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\tld ixh,a\r\n.loop_alto_map_sbuffer\r\n\t\t;defb $fD\r\n\t\t;LD L,4\t\t;ANCHO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld ixl,4\r\n\t\tex de,hl\r\n.loop_ancho_map_sbuffer\t\t\r\n\r\n;**********************************************\r\n\r\n;push bc\r\n;ex de,hl\r\n\tld A,(hl)\r\n\t\t\r\n\tand $aa\r\n\tcp mascara2\r\n\tjp z,sig_pixn_der_2\r\n\tld b,a ;B es el nico registro libre\r\n\tld a,(de) ;pixel actual donde pinto\r\n\tand $55\t\t;0101 0101\r\n\t;and mascara1\r\n\tor b\r\n\tld (de),a ;y lo pone en pantalla\r\n.sig_pixn_der_2\r\n\tld a,(hl) ;pixel del sprite\r\n\t;and $55   ;0101 0101\r\n\tand $55\r\n\tcp mascara1\r\n\tjp z,pon_buffer_der_2\r\n\tld b,a ;B es el nico registro libre\r\n\tld a,(de) ;pixel actual donde pinto\r\n\t;and $aa\t\t;1010 1010\r\n\tand $aa\r\n\tor b\r\n\r\n\t\r\n\t\r\n\t\tld (de),a\r\n\t.pon_buffer_der_2\r\n\t\r\n;*************************************************\t\r\n\r\n\t\t\r\n\t\tINC DE\r\n\t\tINC HL\r\n\t;ex de,hl\t\r\n;pop bc\t\t\r\n\r\n\t\tdec ixl\r\n\t\tJP NZ,loop_ancho_map_sbuffer\r\n\r\n\t   dec ixh\r\n\t   ret z\r\n\t   EX DE,HL\r\n\t   ld b,0\r\n\r\n\t\tadd HL,BC\t\r\n\t\tjp loop_alto_map_sbuffer\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_PutTrSpriteTileMap2b.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_PutTrSpriteTileMap2b\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\nGLOBAL mascara1\r\nGLOBAL mascara2\r\n\r\n.cpc_PutTrSpriteTileMap2b\r\n\r\n;segn las coordenadas x,y que tenga el sprite, se dibuja en el buffer\r\n   \r\n    ex de,hl\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \r\n  ;lo cambio para la rutina de multiplicar \r\n    ld l,(ix+4)\r\n    ld h,(ix+5)\r\n\r\n\r\n\r\n\r\n\r\n;en HL Tengo el valor\r\n    \r\n    \r\n\tld e,(ix+0)\r\n    ld d,(ix+1)\t;HL apunta al sprite\r\n\t\r\n    ;con el alto del sprite hago las actualizaciones necesarias a la rutina\r\n    ld a,(de)\r\n    ld (loop_alto_map_sbufferX+2),a\r\n    ld b,a\r\n    ld a,ancho_pantalla_bytes\r\n    sub b\r\n    ld (ancho_2X+1),a\r\n\tinc de\r\n\tld a,(de)\r\n\tinc de\r\n\t\r\n\t;ld a,16\t\t;necesito el alto del sprite\r\n\t\r\n\t\r\n\t\r\n.sp_buffer_maskX\r\n\tld b,0\r\n.ancho_2X\t\r\n\tld c,ancho_pantalla_bytes-4 ;60\t;;DEPENDE DEL ANCHO\r\n\r\n\t;defb $fD\r\n\t;LD H,A\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\tld ixh,a\r\n.loop_alto_map_sbufferX\r\n\t\t;defb $fD\r\n\t\t;LD L,4\t\t;ANCHO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld ixl,4\r\n\t\tex de,hl\r\n.loop_ancho_map_sbufferX\t\t\r\n\r\n;**********************************************\r\n\r\n;push bc\r\n;ex de,hl\r\n\tld A,(hl)\r\n\t\t\r\n\tand $aa\r\n\tcp mascara2\r\n\tjp z,sig_pixn_der_2X\r\n\tld b,a ;B es el nico registro libre\r\n\tld a,(de) ;pixel actual donde pinto\r\n\tand $55\t\t;0101 0101\r\n\t;and mascara1\r\n\tor b\r\n\tld (de),a ;y lo pone en pantalla\r\n.sig_pixn_der_2X\r\n\tld a,(hl) ;pixel del sprite\r\n\t;and $55   ;0101 0101\r\n\tand $55\r\n\tcp mascara1\r\n\tjp z,pon_buffer_der_2X\r\n\tld b,a ;B es el nico registro libre\r\n\tld a,(de) ;pixel actual donde pinto\r\n\t;and $aa\t\t;1010 1010\r\n\tand $aa\r\n\tor b\r\n\r\n\t\r\n\t\r\n\t\tld (de),a\r\n\t.pon_buffer_der_2X\r\n\t\r\n;*************************************************\t\r\n\r\n\t\t\r\n\t\tINC DE\r\n\t\tINC HL\r\n\r\n\t\tdec ixl\r\n\t\tJP NZ,loop_ancho_map_sbufferX\r\n\r\n\t   dec ixh\r\n\t   ret z\r\n\t   EX DE,HL\r\n\t   ld b,0\r\n\r\n\t\tadd HL,BC\t\r\n\t\tjp loop_alto_map_sbufferX"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_RLI.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\n\r\nGLOBAL cpc_RLI\t\t;rota las lneas que se le digan hacia la izq y mete lo rotado por la derecha.\r\n\r\n\r\n.cpc_RLI\t\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+4)\t\r\n\tld h,(ix+5)\t;posicin inicial\r\n\t\r\n\tld a,(ix+2)\t;lineas\r\n\tld (_alto+1),a\r\n\tld a,(ix+0)\t;ancho\r\n\tld (_ancho+1),a\r\n\t\r\n\t\r\ndec hl\t\r\n;ld hl,$c001\t\t\t\t;; parametro\r\n._alto\r\nld a,8\t\t\t\t\t;; parametro\r\n.ciclo0\r\npush af\r\npush hl\r\n;;\r\ninc hl\r\nld a,(hl)\r\n;;\r\nld d,h\r\nld e,l\r\ndec hl\r\nld b, 0\r\n._ancho\r\nld c,50\t; parametro\r\nlddr\r\n\r\ninc hl\r\n\r\nld (hl),a\r\n\r\npop hl\r\n\r\npop af\r\ndec a\r\n\r\nret z\r\n;jp nz, ciclo0\r\n\r\n\r\n;salto de lnea, ojo salto caracter.\r\nld bc,$800\r\nadd hl,bc\r\n\r\n\r\njp nc,ciclo0 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\nld bc,$c050\r\nadd HL,BC\r\njp ciclo0\r\n\t\t\r\n;.cont\t\t\r\n;pop af\r\n;dec a\r\n;jp nz, ciclo0\r\n\r\n\r\n;ret\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_RRI.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\n\r\nGLOBAL cpc_RRI\t\t;rota las lneas que se le digan hacia la izq y mete lo rotado por la derecha.\r\n\r\n\r\n.cpc_RRI\t\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld l,(ix+4)\t\r\n\tld h,(ix+5)\t;posicin inicial\r\n\t\r\n\tld a,(ix+2)\t;lineas\r\n\tld (_alto+1),a\r\n\tld a,(ix+0)\t;ancho\r\n\tld (_ancho+1),a\r\n\t\r\n\t\r\ninc hl\t\r\n;ld hl,$c001\t\t\t\t;; parametro\r\n._alto\r\nld a,8\t\t\t\t\t;; parametro\r\n.ciclo0\r\npush af\r\n\r\npush hl\r\n;;\r\ndec hl\r\nld a,(hl)\r\n;;\r\nld d,h\r\nld e,l\r\ninc hl\t\t; solo mueve 1 byte\r\nld b, 0\r\n._ancho\r\nld c,50\t; parametro\r\nldir\r\n\r\ndec hl\r\nld (hl),a\r\n\r\npop hl\r\npop af\r\ndec a\r\nret z\r\n;jp nz, ciclo0\r\n\r\n\r\n;salto de lnea, ojo salto caracter.\r\nld bc,$800\r\nadd hl,bc\r\n\r\n\r\njp nc,ciclo0 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\nld bc,$c050\r\nadd HL,BC\r\njp ciclo0"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_Random.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_Random\r\n\r\n.cpc_Random\r\n;push af\r\n\r\nLD A,(valor_previo)\r\nLD L,A\r\nLD A,R \r\nADD L\r\n;los 2 ltimos bits de A dirn si es 0,1,2,3\r\nLD (valor_previo),A\r\nLD L,A ;se devuelve L (CHAR)\r\n;pop af\r\nld h,0\r\nRET\r\n.valor_previo defb $FF"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ReadTile.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ReadTile\t\t;pone un byte en la posicin de la pantalla indicada\r\n\r\nGLOBAL pantalla_juego\r\nGLOBAL ancho_pantalla_bytes\r\n\r\n.cpc_ReadTile\r\n\r\n\t\r\n\t;ld ix,2\r\n\t;add ix,sp\r\n\t;ld e,(ix+0)\r\n\t;ld c,(ix+2)\r\n\t\r\n\tld hl,2\r\n    add hl,sp\t\t\t; Es la forma de pasar parmetros? Se pasan en SP+2? en la pila?\t\t\t\r\n\tld E,(hl)\t\t;Y\r\n\tinc hl\r\n\tinc hl\r\n\tld a,(hl)\t;X\r\n\t\r\n\tinclude \"multiplication2.asm\"\r\n\t\r\n\r\n\t\r\n\t\t\tld e,a\r\n\t\t\tld d,0\r\n\t\tadd hl,de\t\t;SUMA X A LA DISTANCIA Y*ANCHO\r\n\tld de,pantalla_juego\r\n\t\tadd hl,de\r\n\t\tld l,(hl)\r\n\t\tld h,0\r\n\tret\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_RedefineKey.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_RedefineKey\r\n\r\nGLOBAL cpc_TestKeyboard\r\n\r\nGLOBAL cpc_KeysData\r\nGLOBAL  tabla_teclas\r\n\r\n.cpc_RedefineKey\r\n\r\n\t;ld hl,2\r\n    ;add hl,sp\t\r\n    ;ld a,(hl)\r\n; En A se tiene el valor de la tecla seleccionada a comprobar [0..11]\r\n\t;A*2\r\n;______________________________________________________________________________________________\r\n;\t;En A viene la tecla a redefinir (0..11)\r\n\t;rla\t \t;A*2\t;\r\n\t;ld e,a\r\n\t;ld d,0\r\n\t\r\n\t\r\n\tsla l\r\n\tld h,0\r\n\tld de,cpc_KeysData+tabla_teclas\r\n\t;ld hl,cpc_TestKeyboard+tabla_teclas\r\n\r\n; gracias a Mochilote por detectar un error aqu:\t\r\n\tadd hl,de ;Nos colocamos en la tecla a redefinir \r\n\r\n\tld (hl),$ff\t\t; y la borramos\r\n\tinc hl\r\n\tld (hl),$ff\r\n\tdec hl\r\n\tpush hl\r\n\tcall ejecutar_deteccion_teclado ;A tiene el valor del teclado\r\n\tld a,d\r\n; A tiene el byte (<>0)\r\n; B tiene la linea\t\r\n\t;guardo linea y byte\r\n\tpop hl\t;recupera posicin leda\r\n\tld a,(linea)\r\n\tld (hl),a ;byte\r\n\tinc hl\r\n\t;ld a,b\t  ;linea\r\n\tld a,(bte)\r\n\tld (hl),a\r\n\tret\r\n\t\r\n\r\n\t\r\n\t\r\n.ejecutar_deteccion_teclado\r\n\tLD A,$40\r\n.bucle_deteccion_tecla\t\r\n\tPUSH AF\r\n\tLD (bte),A\r\n\t\r\n\tcall cpc_TestKeyboard\t\t\t\t\t;en A vuelve los valores de la linea\r\n\t\r\n\tor a ;\tCP 0\r\n\tJr NZ, tecla_pulsada\t\t\t\t\t; retorna si no se ha pulsado ninguna tecla\r\n\tPOP AF\r\n\tINC A\r\n\tCP $4A\r\n\tJr NZ, bucle_deteccion_tecla\r\n\tJr ejecutar_deteccion_teclado\r\n\r\n.tecla_pulsada\r\n\tld (linea),a\r\n\t;LD A,(tmb)\r\n\t;ld (bte),A\r\n\tPOP AF\r\n\tcall comprobar_si_tecla_usada\r\n\tret nc\r\n\tJr bucle_deteccion_tecla \r\n;.tmb defb 0\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n.comprobar_si_tecla_usada ; A tiene byte, B linea\r\n\t;ld (linea),a\r\n\t;LD A,B\r\n\t;add $40\r\n\t;ld (bte),A\r\n\tld b,12\t\t;numero mximo de tecla redefinibles\r\n\tld ix,cpc_KeysData+tabla_teclas ;-2 ;tecla_0\r\n\tld c,(ix+0)\r\n.bucle_bd_teclas\r\n;comprobar byte\t\r\n\tld a,(linea)\r\n\tld c,(ix+0)\r\n\tcp (ix+0)\r\n\tjr z, comprobar_linea\t\r\n\tinc ix\r\n\tinc ix\r\n\tdjnz bucle_bd_teclas\r\nscf\r\nccf\r\n\t\r\n\tret\t; si vuelve despus de comprobar, que sea NZ\r\n.comprobar_linea\t;si el byte es el mismo, mira la linea\r\n\tld a,(bte)\r\n\tcp (ix+1)\r\n;\tret z\t; Vuelve con Z si coincide el byte y la linea\r\n\tjr z, tecla_detectada\r\n\tinc ix\r\n\tinc ix\r\n\tdjnz bucle_bd_teclas\r\n\r\nscf\r\nccf\r\n\tret ; si vuelve despus de comprobar, que sea NZ\r\n.tecla_detectada\r\n\tscf\r\n\tret\r\n\t\r\n\r\n.linea defb 0\r\n.bte defb 0\r\n\r\n\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ResetTouchedTiles.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ResetTouchedTiles\r\n\r\nGLOBAL tiles_tocados\r\n \r\n.cpc_ResetTouchedTiles\r\n\tLD HL,tiles_tocados\r\n\t;LD DE,tiles_tocados+1\r\n\t;LD BC,149\r\n\tLD (HL),$FF\r\n\t;LDIR\r\n\tRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ScanKeyboard.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ScanKeyboard\r\nGLOBAL cpc_KeysData\r\nGLOBAL  keymap\r\n\r\n\r\n.cpc_ScanKeyboard\r\n\r\n        di              ;1 $$%%$$ C P C   VERSION $$%%$$   FROM CPCWIKI\r\n        ld hl,cpc_KeysData+keymap    ;3\r\n        ld bc,$f782     ;3\r\n        out (c),c       ;4\r\n        ld bc,$f40e     ;3\r\n        ld e,b          ;1\r\n        out (c),c       ;4\r\n        ld bc,$f6c0     ;3\r\n        ld d,b          ;1\r\n        out (c),c       ;4\r\n        ld c,0          ;2\r\n        out (c),c       ;4\r\n        ld bc,$f792     ;3\r\n        out (c),c       ;4\r\n        ld a,$40        ;2\r\n        ld c,$4a        ;2 44\r\n.loop    ld b,d          ;1\r\n        out (c),a       ;4 select line\r\n        ld b,e          ;1\r\n        ini             ;5 read bits and write into KEYMAP\r\n        inc a           ;1\r\n        cp c            ;1\r\n        jr c,loop       ;2/3 9*16+1*15=159\r\n        ld bc,$f782     ;3\r\n        out (c),c       ;4\r\n        ei              ;1 8 =211 microseconds\r\n        ret\r\n\r\n        \r\n        \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t\t   \t\t\r\n\r\n\t   \r\n\r\n\t   \r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ScrollLeft.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ScrollLeft\r\n\r\n\r\n\r\n\r\n\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL ColumnScr\r\nGLOBAL alto_pantalla_bytes\r\nGLOBAL pantalla_juego\r\nGLOBAL posiciones_pantalla\r\n\r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_ScrollLeft\r\n\r\nld hl,posicion_inicial_superbuffer+2\r\nld de,posicion_inicial_superbuffer\r\nld bc,alto_pantalla_bytes*ancho_pantalla_bytes -1\r\nLDIR\r\nRET\r\n\r\nxor a\r\nld (ntile),a\r\nadd 8\r\nld (contador),a\r\nld ix, ColumnScr\r\nld a,alto_pantalla_bytes\r\n.aaa\r\npush af\r\n\r\nld h,(ix+1)\r\nld l,(ix+0)\r\n\r\nld d,h\r\nld e,l\r\ninc l\r\ninc l\r\nld bc,ancho_pantalla_bytes-2\r\nldir\r\nld a,(contador)\r\ndec a\r\ncall z,tocatile\r\nld (contador),a\r\n\r\npop af\r\ndec a\r\ninc ix\r\ninc ix\r\njp nz,aaa\r\n\r\n\r\n;ld hl,pantalla_juego+1\r\n;ld de,pantalla_juego\r\n;ld bc,alto_pantalla_bytes*ancho_pantalla_bytes/16-1\r\n;LDIR\r\n\r\nret\r\n\r\n\r\n.tocatile\r\n\r\n;(a+1)*30-1\r\n\r\n\r\n;ld hl,pantalla_juego\r\n;dec hl\r\n;dec hl\r\n;ld bc,$50\r\n;sbc hl,bc\r\nld bc,14256+$50+2\r\nsbc hl,bc\r\npush hl\r\n;Se selecciona el tile correspondiente\r\nld a,(ntile) ;(a+1)*30-1\r\ninc a\r\nld (ntile),a\r\ncall calcula_entradaPantalla\r\n;En HL est el tile a dibujar\r\n;HL * ntile*16\r\nadd hl,hl\r\nadd hl,hl\r\nadd hl,hl\r\nadd hl,hl\r\nld de,tiles\r\nadd hl,de\r\nex de,hl\r\npop hl\r\n\r\ncall cpc_PutTile2x8b\r\n\r\nld a,8\r\nret\r\n\r\n.contador  defb 0\r\n.ntile defb 0\r\n\r\n\r\n\r\n.calcula_entradaPantalla\r\n\r\n; E linea\r\n    ld e,a\r\n    \r\n    include \"multiplication2.asm\"\r\n    \r\n\r\n\r\n\r\n\t    dec hl\r\n\t\tld de,pantalla_juego\r\n\t\tadd hl,de\r\n\t\tld l,(HL)\r\n\t\tld h,0\r\n\t    ret\r\n\r\n.cpc_PutTile2x8b ;siempre se dibujan en posicion caracter as que no hay saltos raros en HL, se puede quitar la ltima parte\r\n;hl screen address\r\n;de data\r\n\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t\t\r\n\t.loop_alto_tile_2x8\r\n\t.loop_ancho_tile_2x8\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n;\t\tinc hl\r\n\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\t   \r\n.suma_siguiente_linea0_tile_2x8\t\t;\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_tile_2x8 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_tile_2x8\t\t    "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ScrollLeft0.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ScrollLeft0\r\n\r\n\r\n\r\n\r\n\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL rightColumnScr\r\nGLOBAL alto_pantalla_bytes\r\nGLOBAL pantalla_juego\r\nGLOBAL posiciones_pantalla\r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n\r\n.cpc_ScrollLeft0\r\n\r\nld hl,pantalla_juego+1\r\nld de,pantalla_juego\r\nld bc,alto_pantalla_bytes*ancho_pantalla_bytes/16 -1\r\nLDIR\r\n\r\nld hl,posicion_inicial_superbuffer+2\r\nld de,posicion_inicial_superbuffer\r\nld bc,alto_pantalla_bytes*ancho_pantalla_bytes -1\r\nLDIR\r\n\r\nRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ScrollRight.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ScrollRight\r\n\r\n\r\n\r\n\r\n\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL ColumnScr\r\nGLOBAL alto_pantalla_bytes\r\nGLOBAL pantalla_juego\r\nGLOBAL posiciones_pantalla\r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n\r\n.cpc_ScrollRight\r\n\r\n;;scrollea el superbuffer\r\nld hl,posicion_inicial_superbuffer+alto_pantalla_bytes*ancho_pantalla_bytes-2 ; pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16-1\r\nld de,posicion_inicial_superbuffer+alto_pantalla_bytes*ancho_pantalla_bytes ;pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16\r\nld bc,alto_pantalla_bytes*ancho_pantalla_bytes-1 ;-1\r\nLDDR\r\nRET\r\nxor a\r\nld (ntile),a\r\nadd 8\r\nld (contador),a\r\nld ix,ColumnScr\r\nld a,alto_pantalla_bytes\r\n.aaa\r\npush af\r\n\r\nld h,(ix+1)\r\nld l,(ix+0)\r\n\r\n;Se suma el ancho de pantalla a hl\r\nld bc,ancho_pantalla_bytes-1\r\nadd hl,bc\r\n;dec l\r\nld e,l\r\nld d,h\r\n\r\n\r\ndec l\r\ndec l\r\n\r\nld bc,ancho_pantalla_bytes-2\r\n;dec bc\r\n;dec bc\r\nlddr\r\nld a,(contador)\r\ndec a\r\ncall z,tocatile\r\nld (contador),a\r\n\r\npop af\r\ndec a\r\ninc ix\r\ninc ix\r\njp nz,aaa\r\n\r\n\r\n\r\n;ld hl,pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16-1\r\n;ld de,pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16\r\n;ld bc,alto_pantalla_bytes*ancho_pantalla_bytes/16 ;-1\r\n;LDDR\r\n\r\n\r\nret\r\n\r\n\r\n.tocatile\r\n\r\n;(a+1)*30-1\r\n\r\nld de,$3800-1\r\nsbc hl,de\r\n;ld hl,pantalla_juego\r\n;dec hl\r\n;dec hl\r\n;ld bc,$50\r\n;sbc hl,bc\r\n\r\n;ld bc,14256+$50+2\r\n;sbc hl,bc\r\npush hl\r\n;Se selecciona el tile correspondiente\r\nld a,(ntile) ;(a)*30\r\nld e,a\r\ninc a\r\nld (ntile),a\r\ncall calcula_entradaPantalla\r\n;En HL est el tile a dibujar\r\n;HL * ntile*16\r\nadd hl,hl\r\nadd hl,hl\r\nadd hl,hl\r\nadd hl,hl\r\nld de,tiles\r\nadd hl,de\r\nex de,hl\r\npop hl\r\n\r\ncall cpc_PutTile2x8b\r\n\r\nld a,8\r\nret\r\n\r\n.contador  defb 0\r\n.ntile defb 0\r\n\r\n\r\n\r\n.calcula_entradaPantalla\r\n\r\ninclude \"multiplication2.asm\"\r\n\r\n\r\n\t    ;dec hl\r\n\t\tld de,pantalla_juego\r\n\t\tadd hl,de\r\n\t\tld l,(HL)\r\n\t\tld h,0\r\n\t    ret\r\n\r\n.cpc_PutTile2x8b ;siempre se dibujan en posicion caracter as que no hay saltos raros en HL, se puede quitar la ltima parte\r\n;hl screen address\r\n;de data\r\n\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\t\tld b,7\r\n\t\t\r\n\t.loop_alto_tile_2x8\r\n\t.loop_ancho_tile_2x8\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n\t\tinc hl\r\n\t\t\r\n\t\tld A,(DE)\r\n\t\tld (hl),a\r\n\t\tinc de\r\n;\t\tinc hl\r\n\r\n\t   defb $fD\r\n\t   dec H\r\n\t   ret z\r\n\t   \r\n.suma_siguiente_linea0_tile_2x8\t\t;\r\n\t\tLD C,$ff\t\t\t;&07f6 \t\t\t;salto linea menos ancho\r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_tile_2x8 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\t\r\n\t\tadd HL,BC\r\n\t\tld b,7\t\t\t;slo se dara una de cada 8 veces en un sprite\r\n\t\tjp loop_alto_tile_2x8\t\t    "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ScrollRight0.asm",
    "content": "\r\nGLOBAL cpc_ScrollRight0\r\n\r\n\r\n\r\n\r\n\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL rightColumnScr\r\nGLOBAL alto_pantalla_bytes\r\nGLOBAL pantalla_juego\r\nGLOBAL posiciones_pantalla\r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_ScrollRight0\t\t;;scrollea el area de pantalla de tiles\r\nld hl,pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16-1\r\nld de,pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16\r\nld bc,alto_pantalla_bytes*ancho_pantalla_bytes/16 -1 ;-1\r\nLDDR\r\n\r\n;;scrollea el superbuffer\r\nld hl,posicion_inicial_superbuffer+alto_pantalla_bytes*ancho_pantalla_bytes-2 ; pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16-1\r\nld de,posicion_inicial_superbuffer+alto_pantalla_bytes*ancho_pantalla_bytes ;pantalla_juego+alto_pantalla_bytes*ancho_pantalla_bytes/16\r\nld bc,alto_pantalla_bytes*ancho_pantalla_bytes-1 ;-1\r\nLDDR\r\nRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetBorder.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Augusto Ruiz, \t           2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetBorder\r\n\r\n.cpc_SetBorder\r\n  ;ld hl,2\r\n  ;add hl,sp\r\n  ;ld b,(hl)\r\n  ld b,l\r\n  ld c,b\r\n  JP $bc38\r\n;ret\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetColorGphStr.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetColorGphStr\r\n\r\nGLOBAL cpc_PrintGphStr0\r\nGLOBAL colores_camb\r\n\r\n.cpc_SetColorGphStr\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld a,(ix+0) ;valor\r\n\tld c,(ix+2)\t;color\r\n\t\r\nld hl,colores_camb+cpc_PrintGphStr0\r\nld b,0\r\nadd hl,bc\r\nld (hl),a\r\n\r\n\t\r\nret\r\n \r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetColorGphStrM1.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetInkGphStrM1\r\n\r\nGLOBAL cpc_PrintGphStr0M1\r\nGLOBAL colores_cambM1\r\n\r\n.cpc_SetInkGphStrM1\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld a,(ix+0) ;valor\r\n\tld c,(ix+2)\t;color\r\n\t\r\nld hl,colores_camb+cpc_PrintGphStr0M1\r\nld b,0\r\nadd hl,bc\r\nld (hl),a\r\n\r\n\t\r\nret"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetColour.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetColour\r\n\r\n.cpc_SetColour\t\t;El nmero de tinta 17 es el borde\r\n    LD HL,2\r\n    ADD HL,SP\t\r\n  \tLD E,(HL)\r\n    INC HL\r\n  \tINC HL\r\n    LD A,(HL)\r\n  \tLD BC,$7F00                     ;Gate Array \r\n\tOUT (C),A                       ;Nmero de tinta\r\n\tLD A,@01000000              \t;Color (y Gate Array)\r\n\tADD E\r\n\tOUT (C),A                       \r\n\tRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetInk.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Augusto Ruiz, \t           2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetInk\r\n\r\n.cpc_SetInk\r\n  ld hl,2\r\n  add hl,sp\t\r\n  ld b,(hl)\r\n  ld c,b\r\n  inc hl\r\n  inc hl\r\n  ld a,(hl)\r\n  call $bc32\r\nret"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetInkGphStr.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetInkGphStr\r\n\r\nGLOBAL cpc_PrintGphStr0\r\nGLOBAL colores_camb\r\n\r\n.cpc_SetInkGphStr\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld a,(ix+0) ;valor\r\n\tld c,(ix+2)\t;color\r\n\t\r\nld hl,colores_camb+cpc_PrintGphStr0\r\nld b,0\r\nadd hl,bc\r\nld (hl),a\r\n\r\n\t\r\nret\r\n \r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetInkGphStrM1.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetInkGphStrM1\r\n\r\nGLOBAL cpc_PrintGphStr0M1\r\nGLOBAL colores_cambM1\r\n\r\n.cpc_SetInkGphStrM1\r\n;preparacin datos impresin. El ancho y alto son fijos!\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\r\n \tld a,(ix+0) ;valor\r\n\tld c,(ix+2)\t;color\r\n\t\r\nld hl,colores_cambM1+cpc_PrintGphStr0M1\r\nld b,0\r\nadd hl,bc\r\nld (hl),a\r\n\r\n\t\r\nret"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetMode.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t                                              **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetMode\r\n\r\n.cpc_SetMode\r\n  ld a,l\r\n  LD BC,$7F00          ;Gate array port\r\n  LD D,@10001100\t   ;Mode  and  rom  selection  (and Gate Array function)\r\n  ADD D\r\n  OUT (C),A  \r\n  RET\r\n\r\n \t \r\n\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetModo.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t                                              **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetModo\r\n\r\n.cpc_SetModo\r\n  ld a,l\r\n  call $bc0e\r\n  RET"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetTile.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SetTile\t\t;pone un byte en la posicin de la pantalla indicada\r\n\r\nGLOBAL pantalla_juego\r\nGLOBAL ancho_pantalla_bytes\r\n\r\n.cpc_SetTile\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld e,(ix+2)\r\n\tld a,(ix+4)\r\n\t\r\ninclude \"multiplication2.asm\"\r\n\r\n\r\n\r\n\r\n\t\r\n\t\tld e,a\r\n\t\tld d,0\r\n\t\tadd hl,de\r\n\t\t\r\n\tld de,pantalla_juego\r\n\tadd hl,de\r\n\tld a,(ix+0)\r\n\tld (hl),a\r\n\tret\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SetTouchTileXY.asm",
    "content": "; ******************************************************\r\n\r\nGLOBAL cpc_SetTouchTileXY\t\t;marca un tile indicando las coordenadas del tile\r\n\r\nGLOBAL tiles\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\r\nGLOBAL ancho_pantalla_bytes\r\n\r\n\tGLOBAL cpc_UpdTileTable\r\n\r\n.cpc_SetTouchTileXY\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\t\r\n\tld e,(ix+2)\r\n\tld c,(ix+4)\r\n\t\r\n\tld d,e\r\n\tld e,c\r\n\tcall cpc_UpdTileTable\r\n\r\n\tld e,(ix+2)\r\n\tld a,(ix+4)\t\r\n\r\ninclude \"multiplication2.asm\"\r\n\t\r\n\t\t\tld e,a\r\n\t\t\tld d,0\r\n\t\tadd hl,de\r\n\tld de,pantalla_juego\r\n\t\tadd hl,de\r\n\tld a,(ix+0)\t\t\r\n\t\tld (hl),a\r\n\tret\r\n\t\r\n\t\r\n\t\r\n;entran las coordenadas x,y y se marca el tile para redibujarlo en pantalla\r\n;la coordenada x se divide entre 4 y da el tile\r\n;la coordenada y se divide entre 16 y da el tile\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ShowScrTileMap.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ShowTileMap\t;\tpara una pantalla de 64x160 bytes. Superbuffer 8192bytes\r\n\t\t\t\t\t\t\t\t;   los tiles son de 2x8 bytes\r\n\r\nGLOBAL tiles\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\t\t\r\nGLOBAL posicion_inicial_area_visible\r\nGLOBAL posicion_inicial_superbuffer\r\nGLOBAL ancho_pantalla_bytes\r\n\r\nGLOBAL alto_pantalla_bytes\r\nGLOBAL posiciones_pantalla\r\n\r\n\r\nGLOBAL tiles_ocultos_ancho0\r\nGLOBAL tiles_ocultos_alto0\r\n\r\nGLOBAL posicion_inicio_pantalla_visible \r\nGLOBAL posicion_inicio_pantalla_visible_sb\r\nGLOBAL posicion_inicio_pantalla_visible2\r\n\r\n\r\nGLOBAL creascanes\r\n\r\nGLOBAL cpc_PutSp\r\n\r\n\r\n\r\n\r\nGLOBAL cpc_ShowTileMap2\r\n\r\n\r\n.cpc_ShowTileMap\r\n\r\n.cont_normal\r\n\txor a\r\n\tld (contador_tiles),a\r\n;Se busca el nmero de tiles en pantalla\t\r\n\tld hl,(ntiles)\r\n\tld (contador_tiles2),hl\r\n\tld hl,pantalla_juego\r\n\tcall transferir_pantalla_a_superbuffer\r\n\t\r\n;parte donde se transfiere el superbuffer completo a la pantalla\t\r\n\r\n;\tld hl,posicion_inicial_area_visible\r\n\r\n\tld de,posicion_inicial_superbuffer\r\n\tld hl,tiles_ocultos_ancho0*2\t\r\n\tadd hl,de\t;primero posiciona en ancho\r\n\r\n\t; Posicin inicial lectura datos superbuffer\r\n\tld de,ancho_pantalla_bytes\r\n\tld b,tiles_ocultos_alto0*8\t\r\n\tXOR A\r\n\tCP B\r\n\tJR Z, NO_SUMA\r\n.bucle_alto_visible\t\r\n\tadd hl,de\r\n\tdjnz bucle_alto_visible\r\n.NO_SUMA\t\r\n\tpush hl\r\n\tld (posicion_inicio_pantalla_visible_sb+1),HL\r\n\t;ex de,hl\r\n\t;ld hl,(posiciones_pantalla)\t\r\n\r\n\t\r\n;;.otro_ancho\t\r\n\tld b,ancho_pantalla_bytes-4*(tiles_ocultos_ancho0)\t;;nuevo ancho\r\n\tld c,alto_pantalla_bytes-16*(tiles_ocultos_alto0)\t\t\t;;nuevo alto\r\n\t\r\n\t\r\n;\tld hl,(posiciones_pantalla)\r\n;\tpop de\r\n;\tjp cpc_PutSp\r\n\r\n;; a HL tb se le suma una cantidad\r\n\tld de, tiles_ocultos_alto0*2\r\n\tld hl,posiciones_pantalla\r\n\tadd hl,de\r\n\tld e,(hl)\r\n\tinc hl\r\n\tld d,(hl)\r\n\tld hl, 2*tiles_ocultos_ancho0\r\n\tadd hl,de\r\n\tld (posicion_inicio_pantalla_visible+1),HL\r\n\tld (posicion_inicio_pantalla_visible2+1),HL\t\r\n\tpop de\t;origen\r\n\t;HL destino\r\n\t;DE origen\r\n\t;call cpc_PutSp\t\t;cambiar la rutina por una que dibuje desde superbuffer\r\n\t;ret\r\n\tjp creascanes\r\n; A partir de la direccin del vector de bloques se dibuja el mapeado en pantalla\r\n\r\n\r\n.transferir_pantalla_a_superbuffer\r\n\r\n\t\r\n\tPUSH HL\r\n\tPOP IX\t;IX lleva los datos de la pantalla\r\n\tLD DE,(posiciones_super_buffer)\r\n.bucle_dibujado_fondo\r\n\t;Leo en HL el tile a meter en el superbuffer\r\n\tLD L,(IX+0)\r\n\tLD H,0\r\n\tADD HL,HL\t;x2\r\n\tADD HL,HL\t;x4\r\n\tADD HL,HL\t;x8\r\n\tADD HL,HL\t;x16\r\n\tLD BC,tiles\r\n\tADD HL,BC\t;hl apunta al tile a transferir\r\n\t;me falta conocer el destino. IY apunta al destino\r\n\tEX DE,HL\t\r\n\tPUSH HL\r\n\tcall transferir_map_sbuffer\t\t;DE origen HL destino\r\n\t\r\n\t\t; Inicio Mod. 29.06.2009\r\n; Se cambia la forma de controlar el final de datos de tiles. El $FF ahora s que se podr utilizar.\r\n\tld HL,(contador_tiles2)\r\n\tdec HL\r\n\tLD (contador_tiles2),HL\t\r\n\tLD A,H\r\n\tOR L\r\n\r\n; Fin    Mod. 29.06.2009\r\n\tPOP HL\r\n\tret z\r\n\tINC IX\t;Siguiente byte\r\n\t\r\n\r\n\r\n;\tLD A,(IX+0)\r\n;\tCP $FF\t;El fin de los datos se marca con $FF, no hay un tile que sea $FF\r\n\t;RET Z\r\n\tEX DE,HL\r\n\tLD A,(contador_tiles)\r\n\tCP ancho_pantalla_bytes/2-1 ;31\t;son 32 tiles de ancho\r\n\tJP Z,incremento2\r\n\tINC A\r\n\tLD (contador_tiles),A\r\n\tINC DE\r\n\tINC DE\t;para pasar a la siguiente posicin\r\n\t;si ya se va por el 18 el salto es mayor, es \r\n\tJP bucle_dibujado_fondo\r\n\r\n.incremento2\r\n\tXOR A\r\n\tLD (contador_tiles),A\r\n\tLD BC, 7*ancho_pantalla_bytes+2 ;450 ; 64x7+2 48x7+2  1084 ;72x15+4\r\n\tEX DE,HL\r\n\tADD HL,BC\t\r\n\tEX DE,HL\r\n\tJP bucle_dibujado_fondo\r\n\r\n.contador_tiles defb 0\t\r\n.contador_tiles2 defw 0\t\r\n; Ahora se puede usar el tile 255\r\n.ntiles defw  ( alto_pantalla_bytes / 8 ) * ( ancho_pantalla_bytes / 2\t)\r\n\t\r\n\r\n\r\n\r\n.transferir_map_sbuffer\t\r\n\r\n\t\tld bc,ancho_pantalla_bytes-1 ;63\r\n\t\t\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\r\n.loop_alto_map_sbuffer\r\n.loop_ancho_map_sbuffer\t\t\r\n\tld A,(DE)\r\n\tld (HL),A\r\n\tinc de\r\n\tinc hl\r\n\tld A,(DE)\r\n\tld (HL),A\r\n\tinc de\r\n\r\ndefb $fD\r\ndec h\r\nret z\r\n;hay que sumar el ancho de la pantalla en bytes para pasar a la siguiente lnea\r\n\r\n\tadd HL,BC\t\r\n\t;pop BC\r\n\tjp loop_alto_map_sbuffer\r\n\t\r\n\t\r\n\r\n.cpc_PutSp\t; dibujar en pantalla el sprite\r\n\r\n;di\r\nld a,b\r\nld b,c\r\nld c,a\r\n.loop_alto_2\r\n\tpush bc\r\n\tld b,c\r\n\tpush hl\r\n.loop_ancho_2\t\t\r\n\tld A,(DE)\r\n\tld (hl),a\r\n\tinc de\r\n\tinc hl\r\n\tdjnz loop_ancho_2\r\n\t\r\n\t;incremento DE con el ancho de la pantalla-el del sprite\r\n\tex de,hl\r\n.ancho_mostrable\t\r\n\tld bc,4*(tiles_ocultos_ancho0)\r\n\tadd hl,bc\r\n\tex de,hl\r\n\tpop hl\r\n\tld A,H\r\n\tadd $08\r\n\tld H,A\r\n\tsub $C0\r\n\tjp nc,sig_linea_2\r\n\tld bc,$c050\r\n\tadd HL,BC\t\r\n\t.sig_linea_2\r\n\tpop BC\r\n\tdjnz loop_alto_2\r\n;ei\r\nret\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ShowScrTileMap2.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ShowTileMap2\t;\tpara una pantalla de 64x160 bytes. Superbuffer 8192bytes\r\n\t\t\t\t\t\t\t\t;   los tiles son de 2x8 bytes\r\n\r\nGLOBAL tiles\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\t\t\r\nGLOBAL posicion_inicial_area_visible\r\nGLOBAL posicion_inicial_superbuffer\r\nGLOBAL ancho_pantalla_bytes\r\n\r\nGLOBAL alto_pantalla_bytes\r\nGLOBAL posiciones_pantalla\r\n\r\n\r\nGLOBAL tiles_ocultos_ancho0\r\nGLOBAL tiles_ocultos_alto0\r\n\r\nGLOBAL posicion_inicio_pantalla_visible \r\nGLOBAL posicion_inicio_pantalla_visible_sb\r\nGLOBAL posicion_inicio_pantalla_visible2\r\n\r\nGLOBAL cpc_PutSp\r\nGLOBAL papa\r\nGLOBAL creascanes\r\n\r\nGLOBAL cpc_ShowTileMap\r\n\r\n\r\n\r\n.cpc_ShowTileMap2\r\n\tld b,ancho_pantalla_bytes-4*(tiles_ocultos_ancho0)\t;;nuevo ancho\r\n\tld c,alto_pantalla_bytes-16*(tiles_ocultos_alto0)\t\t\t;;nuevo alto\r\n.posicion_inicio_pantalla_visible\t\r\n\tld hl,0000\r\n\t\r\n\t\r\n.posicion_inicio_pantalla_visible_sb\r\n\tld hl,0000\r\n.papa\t\t; cdigo de Xilen Wars\r\n\tdi\r\n\tld\t(auxsp),sp\r\n\tld\tsp,tablascan\r\n\tld\ta,alto_pantalla_bytes-16*(tiles_ocultos_alto0)\t;16 alto\r\n.ppv0\r\n\tpop\tde\t\t; va recogiendo de la pila!!\r\n.inicio_salto_ldi\t\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\r\n\tldi\t\r\n.CONT_salto_ldi\t\r\n\tld\tde,4*tiles_ocultos_ancho0\r\n\tadd\thl,de\r\n\tdec a\r\n\tjp nz, ppv0\r\n\tld\tsp,(auxsp)\r\n\tei\r\n\tret\r\n\r\n.auxsp\tdefw\t0\t\r\n\r\n\r\n\r\n.creascanes\t\r\n\tld\tix,tablascan\r\n.posicion_inicio_pantalla_visible2\r\n\tld\thl,0000\r\n\tld\tb, alto_pantalla_bytes/8-2*tiles_ocultos_alto0 ; 20\t; num de filas. \r\n.cts0\t\r\n\tpush\tbc\r\n\tpush\thl\r\n\tld\tb,8\r\n\tld\tde,2048\r\n.cts1\t\r\n\tld\t(ix+0),l\r\n\tinc\tix\r\n\tld\t(ix+0),h\r\n\tinc\tix\r\n\tadd\thl,de\r\n\tdjnz\tcts1\r\n\tpop\thl\r\n\tld\tbc,80\r\n\tadd\thl,bc\r\n\tpop\tbc\r\n\tdjnz\tcts0\r\n;\tjp prepara_salto_ldi\r\n.prepara_salto_ldi\t\t; para el ancho visible de la pantalla\r\n\tld hl,ancho_pantalla_bytes-4*tiles_ocultos_ancho0\r\n\tld de,inicio_salto_ldi \r\n\tadd hl,hl\r\n\tadd hl,de\r\n\tld (hl),$c3\r\n\tinc hl\r\n\tld de,CONT_salto_ldi\r\n\tld (hl),e\r\n\tinc hl\r\n\tld (hl),d\r\n\tret\r\n\r\n.tablascan\tdefs 20*16  "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ShowTileMap.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007, 2010     **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ShowTileMap\t;\tpara una pantalla de 64x160 bytes. Superbuffer 8192bytes\r\n\t\t\t\t\t\t\t\t;   los tiles son de 2x8 bytes\r\n\r\nGLOBAL tiles\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\t\t\r\nGLOBAL posicion_inicial_area_visible\r\nGLOBAL posicion_inicial_superbuffer\r\nGLOBAL ancho_pantalla_bytes\r\nGLOBAL ancho_pantalla_bytes_visible\r\nGLOBAL alto_pantalla_bytes\r\nGLOBAL posiciones_pantalla\r\n\r\n\r\n\r\n\r\n.cpc_ShowTileMap\r\n\r\n; En HL viene el ancho a usar\r\nld a,l\r\nor a ;cp 0\r\njp z, cont_normal\r\nld (otro_ancho+1),a\r\nex de,hl\r\nld hl,ancho_pantalla_bytes ;-ancho_pantalla_bytes_visible\r\nsbc hl,de\r\nld a,l\r\nld (ancho_mostrable+1),a\r\n\r\n.cont_normal\r\n\txor a\r\n\tld (contador_tiles),a\r\n;Se busca el nmero de tiles en pantalla\t\r\n\tld hl,(ntiles)\r\n\tld (contador_tiles2),hl\r\n\tld hl,pantalla_juego\r\n\tcall transferir_pantalla_a_superbuffer\r\n\t\r\n;parte donde se transfiere el superbuffer completo a la pantalla\t\r\n\r\n;\tld hl,posicion_inicial_area_visible\r\n\tld hl,(posiciones_pantalla)\r\n\tld de,posicion_inicial_superbuffer\r\n\t\r\n.otro_ancho\t\r\n\tld b,ancho_pantalla_bytes_visible\r\n\tld c,alto_pantalla_bytes\r\n\tjp cpc_PutSp\t\t;cambiar la rutina por una que dibuje desde superbuffer\r\n\t;ret\r\n\r\n; A partir de la direccin del vector de bloques se dibuja el mapeado en pantalla\r\n\r\n\r\n.transferir_pantalla_a_superbuffer\r\n\r\n\t\r\n\tPUSH HL\r\n\tPOP IX\t;IX lleva los datos de la pantalla\r\n\tLD DE,(posiciones_super_buffer)\r\n.bucle_dibujado_fondo\r\n\t;Leo en HL el tile a meter en el superbuffer\r\n\tLD L,(IX+0)\r\n\tLD H,0\r\n\tADD HL,HL\t;x2\r\n\tADD HL,HL\t;x4\r\n\tADD HL,HL\t;x8\r\n\tADD HL,HL\t;x16\r\n\tLD BC,tiles\r\n\tADD HL,BC\t;hl apunta al tile a transferir\r\n\t;me falta conocer el destino. IY apunta al destino\r\n\tEX DE,HL\t\r\n\tPUSH HL\r\n\tcall transferir_map_sbuffer\t\t;DE origen HL destino\r\n\t\r\n\t\t; Inicio Mod. 29.06.2009\r\n; Se cambia la forma de controlar el final de datos de tiles. El $FF ahora s que se podr utilizar.\r\n\tld HL,(contador_tiles2)\r\n\tdec HL\r\n\tLD (contador_tiles2),HL\t\r\n\tLD A,H\r\n\tOR L\r\n\tpop HL\r\n\tret z\r\n; Fin    Mod. 29.06.2009\r\n\tINC IX\t;Siguiente byte\r\n\tEX DE,HL\r\n\tLD A,(contador_tiles)\r\n\tCP ancho_pantalla_bytes/2-1 ;31\t;son 32 tiles de ancho\r\n\tJP Z,incremento2\r\n\tINC A\r\n\tLD (contador_tiles),A\r\n\tINC DE\r\n\tINC DE\t;para pasar a la siguiente posicin\r\n\t;si ya se va por el 18 el salto es mayor, es \r\n\tJP bucle_dibujado_fondo\r\n\r\n.incremento2\r\n\tXOR A\r\n\tLD (contador_tiles),A\r\n\tLD BC, 7*ancho_pantalla_bytes+2 \r\n\tEX DE,HL\r\n\tADD HL,BC\t\r\n\tEX DE,HL\r\n\tJP bucle_dibujado_fondo\r\n\r\n.contador_tiles defb 0\t\r\n.contador_tiles2 defw 0\t\r\n; Ahora se puede usar el tile 255\r\n.ntiles defw  ( alto_pantalla_bytes / 8 ) * ( ancho_pantalla_bytes / 2\t)\r\n\r\n\r\n.transferir_map_sbuffer\t\r\n\r\n\t\tld bc,ancho_pantalla_bytes-1 ;63\r\n\t\t\r\n\t\tdefb $fD\r\n   \t\tLD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n\r\n.loop_alto_map_sbuffer\r\n.loop_ancho_map_sbuffer\t\t\r\n\tld A,(DE)\r\n\tld (HL),A\r\n\tinc de\r\n\tinc hl\r\n\tld A,(DE)\r\n\tld (HL),A\r\n\tinc de\r\n\r\ndefb $fD\r\ndec h\r\nret z\r\n;hay que sumar el ancho de la pantalla en bytes para pasar a la siguiente lnea\r\n\r\n\tadd HL,BC\t\r\n\t;pop BC\r\n\tjp loop_alto_map_sbuffer\r\n\r\n.cpc_PutSp\t; dibujar en pantalla el sprite\r\n;di\r\nld a,b\r\nld b,c\r\nld c,a\r\n.loop_alto_2\r\n\tpush bc\r\n\tld b,c\r\n\tpush hl\r\n.loop_ancho_2\t\t\r\n\tld A,(DE)\r\n\tld (hl),a\r\n\tinc de\r\n\tinc hl\r\n\tdjnz loop_ancho_2\r\n\t\r\n\t;incremento DE con el ancho de la pantalla-el del sprite\r\n\tex de,hl\r\n.ancho_mostrable\t\r\n\tld bc,ancho_pantalla_bytes-ancho_pantalla_bytes_visible\r\n\tadd hl,bc\r\n\tex de,hl\r\n\tpop hl\r\n\tld A,H\r\n\tadd $08\r\n\tld H,A\r\n\tsub $C0\r\n\tjp nc,sig_linea_2\r\n\tld bc,$c050\r\n\tadd HL,BC\t\r\n\t.sig_linea_2\r\n\tpop BC\r\n\tdjnz loop_alto_2\r\n;ei\r\nret\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ShowTouchedTiles.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ShowTouchedTiles\t\t;OK GENERICO\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL posiciones_pantalla\r\n\r\n\r\nGLOBAL posicion_inicial_area_visible\r\nGLOBAL posicion_inicial_superbuffer\r\nGLOBAL ancho_pantalla_bytes\r\nGLOBAL alto_pantalla_bytes\r\n\r\n\r\n\r\n.cpc_ShowTouchedTiles\r\n;recoge los tiles tocados y los enva desde el superbuffer a la pantalla\r\n\r\n\tLD IX,tiles_tocados\r\n.bucle_cpc_ShowTouchedTiles\t\r\n\tLD E,(IX+0)\r\n\r\n\tLD A,$FF\r\n\tCP E\r\n\tRET Z\t\t;RETORNA SI NO HAY MS DATOS EN LA LISTA\r\n\r\n\tLD D,(IX+1)\t\r\n\tINC IX\r\n\tINC IX\r\n.posicionar_superbuffer\r\n;con la coordenada y nos situamos en la posicin vertical y con x nos movemos a su sitio definitivo\r\n\t;LD A,D\r\n\tSLA d\r\n\tLD C,d\t;x2\r\n\tLD B,0\r\n\tLD HL,posiciones_super_buffer\r\n\tADD HL,BC\r\n\tLD C,(HL)\r\n\tINC HL\r\n\tLD B,(HL)\t\r\n\t\r\n\t;LD A,E\r\n\tSLA e\r\n\tLD L,e\r\n\tLD H,0\r\n\tADD HL,BC\r\n\t;HL apunta a la posicin correspondiente en superbuffer\r\n\r\n\t\r\n.posicionar_pantalla\r\n;con la coordenada y nos situamos en la posicin vertical y con x nos movemos a su sitio definitivo\r\n\tPUSH HL\r\n\r\n\r\n\t;LD A,D\r\n\t;SLA D\r\n\tLD C,D\t;x2\r\n\tLD B,0\r\n\tLD HL,posiciones_pantalla\r\n\tADD HL,BC\r\n\tLD C,(HL)\r\n\tINC HL\r\n\tLD B,(HL)\t\r\n\t;LD A,E\r\n\t;SLA e\r\n\tLD L,e\r\n\tLD H,0\t\r\n\tADD HL,BC\r\n\t;HL apunta a la posicin correspondiente en superbuffer\r\n\t\r\n.transf_bloque_sb_pantalla\r\n\tPOP DE\r\n\t\r\n\t;ex de,hl\r\n\t\t;defb $fD\r\n   \t\t;LD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n   \t\tld a,8\r\n\t\t;ld b,7\r\n\t.loop_alto_2\r\n\t   .ancho0\r\n\t   ex de,hl\r\n\t.loop_ancho_2\t\t\r\n\t\tldi\r\n\t\tldi\t\t\r\n\t   dec a\r\n\t   JP z,bucle_cpc_ShowTouchedTiles\r\n\t\tLD BC,ancho_pantalla_bytes-2 ;->hay que actualizar desplazamiento (desp+2)\r\n\t\tADD HL,BC\r\n\t\tEX DE,HL\r\n\t\tLD bC,$07fe\t\t\t;&07f6 \r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2 ;yep ;loop_alto_2 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n.yep\t\t\r\n\t\t;EX DE,HL\r\n\t\tjp loop_alto_2\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_ShowTouchedTiles2.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_ShowTouchedTiles2\t\t;OK GENERICO\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL posiciones_pantalla\r\n\r\n\r\nGLOBAL posicion_inicial_area_visible\r\nGLOBAL posicion_inicial_superbuffer\r\nGLOBAL ancho_pantalla_bytes\r\nGLOBAL alto_pantalla_bytes\r\n\r\nGLOBAL tiles_ocultos_ancho0\r\nGLOBAL tiles_ocultos_ancho1\r\nGLOBAL tiles_ocultos_alto0\r\nGLOBAL tiles_ocultos_alto1\r\n\r\n\r\n\r\n.cpc_ShowTouchedTiles2\r\n;recoge los tiles tocados y los enva desde el superbuffer a la pantalla\r\n\r\n\tLD IX,tiles_tocados\r\n.bucle_cpc_ShowTouchedTiles\t\r\n\tLD E,(IX+0)\t;x\r\n\r\n\tLD A,$FF\r\n\tCP E\r\n\tRET Z\t\t;RETORNA SI NO HAY MS DATOS EN LA LISTA\r\n\t\r\n;; Comprueba si el tile est dentro del cuadrado visible\r\n;; x>tiles_ocultos_ancho0 && x<tiles_ocultos_ancho1\r\n;; y>tiles_ocultos_alto0 && y<tiles_ocultos_alto1\r\n\tLD D,(IX+1)\t;y\r\n\tld a,tiles_ocultos_ancho0-1\r\n\tcp e\r\n\tjp p,contkaka\t;;dentro de area visible\te<a\r\n\tld a,tiles_ocultos_ancho1\r\n\tcp e\r\n\tjp m,contkaka\t;;dentro de area visible   e>=a\r\n\tld a,tiles_ocultos_alto0-1\r\n\tcp d\r\n\tjp p,contkaka\t;;dentro de area visible\te>a\r\n\tld a,tiles_ocultos_alto1\r\n\tcp d\r\n\tjp m,contkaka\t;;dentro de area visible   e<=a\t\r\n\t\r\n\t; Si est en area visible, se actualiza la tabla\r\n\t\r\n\t\r\n\r\n\t\r\n\t\r\n\tINC IX\r\n\tINC IX\r\n.posicionar_superbuffer\r\n;con la coordenada y nos situamos en la posicin vertical y con x nos movemos a su sitio definitivo\r\n\t;LD A,D\r\n\tSLA d\r\n\tLD C,d\t;x2\r\n\tLD B,0\r\n\tLD HL,posiciones_super_buffer\r\n\tADD HL,BC\r\n\tLD C,(HL)\r\n\tINC HL\r\n\tLD B,(HL)\t\r\n\t\r\n\t;LD A,E\r\n\tSLA e\r\n\tLD L,e\r\n\tLD H,0\r\n\tADD HL,BC\r\n\t;HL apunta a la posicin correspondiente en superbuffer\r\n\r\n\t\r\n.posicionar_pantalla\r\n;con la coordenada y nos situamos en la posicin vertical y con x nos movemos a su sitio definitivo\r\n\tPUSH HL\r\n\r\n\r\n\t;LD A,D\r\n\t;SLA D\r\n\tLD C,D\t;x2\r\n\tLD B,0\r\n\tLD HL,posiciones_pantalla\r\n\tADD HL,BC\r\n\tLD C,(HL)\r\n\tINC HL\r\n\tLD B,(HL)\t\r\n\t;LD A,E\r\n\t;SLA e\r\n\tLD L,e\r\n\tLD H,0\t\r\n\tADD HL,BC\r\n\t;HL apunta a la posicin correspondiente en superbuffer\r\n\t\r\n.transf_bloque_sb_pantalla\r\n\tPOP DE\r\n\t\r\n\t;ex de,hl\r\n\t\t;defb $fD\r\n   \t\t;LD H,8\t\t;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE\r\n   \t\tld a,8\r\n\t\t;ld b,7\r\n\t.loop_alto_2\r\n\t   .ancho0\r\n\t   ex de,hl\r\n\t.loop_ancho_2\t\t\r\n\t\tldi\r\n\t\tldi\t\t\r\n\t   dec a\r\n\t   JP z,bucle_cpc_ShowTouchedTiles\r\n\t\tLD BC,ancho_pantalla_bytes-2 ;->hay que actualizar desplazamiento (desp+2)\r\n\t\tADD HL,BC\r\n\t\tEX DE,HL\r\n\t\tLD bC,$07fe\t\t\t;&07f6 \r\n\t\tADD HL,BC\r\n\t\tjp nc,loop_alto_2 ;yep ;loop_alto_2 ;sig_linea_2zz\t\t;si no desborda va a la siguiente linea\r\n\t\tld bc,$c050\r\n\t\tadd HL,BC\r\n.yep\t\t\r\n\t\t;EX DE,HL\r\n\t\tjp loop_alto_2\t\r\n.contkaka\t\t\r\n\tINC IX\r\n\tINC IX\r\n\tjp bucle_cpc_ShowTouchedTiles"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SpRLM1.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SpRLM1\r\n;la entrada es un sprite con los dos primeros bytes indicando las dimensiones\r\n\r\n\r\n.cpc_SpRLM1\r\n\r\n\r\n;ld de,sprite\r\nld b,(hl)\r\n;ld b,a\t;ancho\r\ninc hl\r\nld c,(hl)\t;alto\r\ninc hl\t\t;apunta a datos sprite\r\nxor a\r\n.mult0\t;repite el ancho\r\nadd c\r\ndjnz mult0\r\n\r\nsla a\r\nld b,a\r\n\r\n\r\n;; de = start of line to scroll\r\n\r\n;ld b,3*16*2\t;voy a hacer esto en todos los bytes del sprite\r\nld d,h\r\nld e,l\r\n\r\ninc hl\t\t\t;usando mscaras\r\n.scroll_line_0\r\ninc hl\r\n\r\nld a,(hl)\r\nand $88\r\nrrca\r\nrrca\r\nrrca\r\nld c,a\r\nld a,(de)\r\nand $77\r\nadd a\r\nor c\r\nld (de),a\r\ninc de\r\ndjnz scroll_line_0\r\ndec de\r\nand @11101110\r\nld (de),a\r\nret\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SpRRM1.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SpRRM1\r\n;la entrada es un sprite con los dos primeros bytes indicando las dimensiones\r\n\r\n\r\n.cpc_SpRRM1\r\n\r\n\r\n;ld de,sprite\r\nld b,(hl)\r\n;ld b,a\t;ancho\r\ninc hl\r\nld c,(hl)\t;alto\r\nxor a\r\ninc hl\t\t;apunta a datos sprite\r\n.mult0\t;repite el ancho\r\nadd c\r\ndjnz mult0\r\nsla a\r\n\r\nld b,0\r\nld c,a\r\nadd hl,bc\t;posiciona al final del sprite\r\n;ld de,sprite_f ;como voy para atrs, me pongo en el ltimo byte del sprite\r\nld b,c\r\n;; de = start of line to scroll\r\n.scroll_line3\r\n;ld b,3*16*2\t;ancho-1\r\nld d,h\r\nld e,l\r\n\r\ndec hl\r\n.scroll_line_02\r\ndec hl\r\nld a,(hl)\r\nand $11\r\nrlca\r\nrlca\r\nrlca\t;cojo solo los 2 bits que me interesan\r\nld c,a\r\nld a,(de)\r\nand @11101110 ;est borrando el bit del pixel 1\r\nsrl a\r\nor c\r\nld (de),a\r\ndec de\r\ndjnz scroll_line_02\r\ninc de\r\nand @01110111\r\nld (de),a\r\nret"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SpUpdX.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SpUpdX\t\t\t;Actualiza X y coord segn el incremento deseado y el signo\r\n\t\t\t\t\t\t;incrementos relativos\r\n\r\n\r\n.cpc_SpUpdX\r\n;first parameter sprite \r\n;second parameter value\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\tld a,(ix+0)\t\t;value\r\n\t;ld ,(ix+1)\r\n\t;A=x value\r\n\t\r\n\tld e,(ix+2)\r\n\tld d,(ix+3)\t\t;sprite\r\n\t\t\r\n\r\n    push de\t\t;10\r\n    pop ix\t\t;14\r\n  \r\n    ;LD IXH,d\t;9\r\n    ;LD IXL,e\t;9\r\n    \r\n    \r\n    \r\n\tld h,0\r\n    bit 7,a\t;check if negative number\r\n    jp z, negative1\r\n    dec h\r\n    .negative1\r\n  ;ix tiene el valor del sprite\r\n  ;incrementar x\r\n  ld l,a\r\n  ;ld h,0\r\n  ;ld b,(ix+8)\r\n  ;add b\r\n  add a,(ix+8)\r\n  ld (ix+8),a ;X updated\r\n  ld e,(ix+4)\r\n  ld d,(ix+5)\r\n  add hl,de\r\n  ld (ix+4),l\r\n  ld (ix+5),h ;superbufer coord updated\r\n  ret\r\n  \r\n  \r\n  ;Decrapted\r\n;.negative\r\n;  NEG A\t;pone positivo el nmero...\r\n  \r\n;  ld e,a\r\n;  ld d,0\r\n;  ld a,(ix+8)\r\n;  sub e\r\n;  ld (ix+8),a ;X updated\r\n  \r\n;  ld l,(ix+4)\r\n;  ld h,(ix+5)\r\n;  sbc hl,de\r\n;  ld (ix+4),l\r\n;  ld (ix+5),h ;superbufer coord updated\r\n;  ret  \r\n  \r\n "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SpUpdY.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SpUpdY\t\t\t;Actualiza X y coord segn el incremento deseado y el signo\r\n\t\t\t\t\t\t;incrementos relativos\r\n\r\n\r\n\r\n\r\n\r\nGLOBAL ancho_pantalla_bytes \r\n\r\n\r\n.cpc_SpUpdY\r\n;first parameter sprite \r\n;second parameter value\r\n;first parameter sprite \r\n;second parameter value\r\n\r\n\r\n  \r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\tld a,(ix+0)\r\n\t;ld ,(ix+1)\r\n\t;A=x value\r\n\tor a ;\tcp 0\r\n\tret z\t;si inc=0\r\n\t\r\n\t\t\r\n\t;ld l,(ix+2)\r\n\t;ld h,(ix+3)\r\n\t\t\r\n    ;push hl\r\n    ;pop ix\r\n    \r\n\tld e,(ix+2)\r\n\tld d,(ix+3)\t\t;sprite\r\n\t\t\r\n\r\n  ;  push de\t\t;10\r\n  ;  pop ix\t\t;14\r\n    LD IXH,d\t;9\r\n    LD IXL,e\t;9    \r\n\r\n\t\r\n\tld bc,ancho_pantalla_bytes\r\n\t\r\n    bit 7,a\t;check if negative number\r\n    jp nz, negative\r\n  ;ix tiene el valor del sprite\r\n  ;incrementar x\r\n  ld l,a\r\n  ld h,0\r\n  ;ld b,(ix+9)\t\t\t;19\r\n  ;add b\t\t\t\t;4\r\n  add a,(ix+9)\t\t\t;19\r\n  ld (ix+9),a ;Y updated\r\n  \r\n  ld a,l\r\n  \r\n  ld l,(ix+4)\r\n  ld h,(ix+5)\r\n  \r\n;  ld bc,ancho_pantalla_bytes\r\n  ;ld b,0\r\n.bucle_suma_y\r\n\tadd hl,bc\r\n\tdec a\r\n\tjp nz,bucle_suma_y\r\n\r\n\r\n  ld (ix+4),l\r\n  ld (ix+5),h ;superbufer coord updated\r\n  ret\r\n  \r\n  \r\n  \r\n.negative\r\n  NEG A\r\n  ld e,a\r\n  ld d,0\r\n  ld a,(ix+9)\r\n  sub e\r\n  ;sub (ix+9)\r\n  ld (ix+9),a ;Y updated\r\n  \r\n  ld a,e\r\n  \r\n  ld l,(ix+4)\r\n  ld h,(ix+5)\r\n \r\n  ;ld c,ancho_pantalla_bytes\r\n  ;ld b,0\r\n.bucle_resta_y\r\n\tsbc hl,bc\r\n\tdec a\r\n\tjp nz,bucle_resta_y\r\n\r\n  ld (ix+4),l\r\n  ld (ix+5),h ;superbufer coord updated\r\n  ret  \r\n  \r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_SuperbufferAddress.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_SuperbufferAddress\t\t;calcula la posicin en el superbuffer segn las coordenadas\t\r\n\t\t\t\t\t\t\t\t;del sprite y lo actualiza\r\n\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\nGLOBAL ancho_pantalla_bytes \r\nGLOBAL posicion_inicial_superbuffer\r\n\r\n.cpc_SuperbufferAddress\r\n   ; ld ix,2\r\n   ; add ix,sp\r\n\r\n   ; ld l,(ix+0)\r\n   ; ld h,(ix+1)\t;HL apunta al sprite\r\n      \r\n    push hl\r\n    pop ix\r\n    \r\n  ;lo cambio para la rutina de multiplicar \r\n    ld a,(ix+8)\r\n    ld e,(ix+9)\r\n \tinclude \"multiplication1.asm\"\r\n \t\t\r\n\r\n\r\n\tld b,0\r\n\tld c,a\r\n\tadd hl,bc\r\n\tld de,posicion_inicial_superbuffer\r\n\tadd hl,de\r\n\t;hl apunta a la posicin en buffer (destino)\r\n    ld (ix+4),l\r\n    ld (ix+5),h\r\n    ret\r\n    \r\n    ;defb 'm','m','x'"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_TestKey.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_TestKey\r\n\r\nGLOBAL cpc_TestKeyboard\r\n;GLOBAL linea_a_buscar\r\n\r\nGLOBAL cpc_KeysData\r\nGLOBAL  tabla_teclas\r\n\r\n.cpc_TestKey\r\n\t;ld hl,2\r\n    ;add hl,sp\t\r\n    ;ld a,(hl)\r\n    ;* ld a,l\r\n; En A se tiene el valor de la tecla seleccionada a comprobar [0..11]\r\n\t;A*2\r\n\t;* add a\r\n\tSLA L\r\n\tinc l\r\n\tld h,0\r\n\tld de,tabla_teclas+cpc_KeysData\r\n\t;* ld d,0\r\n\t;* ld e,l\r\n\t;* inc e\t\r\n\t;* ld hl,cpc_TestKeyboard+tabla_teclas\r\n\tadd hl,de\r\n\t\r\n\tld a,(HL)\r\n\t;ld (cpc_TestKeyboard+linea_a_buscar+1),a\t\t;cambia la lnea a explorar\r\n\t;XOR A\r\n\tcall cpc_TestKeyboard\t\t; esta rutina lee la lnea del teclado correspondiente \r\n\tDEC hl\t\t\t\t\t\t; pero slo nos interesa una de las teclas.\r\n\tand (HL) ;para filtrar por el bit de la tecla (puede haber varias pulsadas)\r\n\t;xor a\r\n\tCP (hl)\t;comprueba si el byte coincide\r\n\tld h,0\r\n\tjp z,pulsado\r\n\tld l,h\r\n\tret\r\n.pulsado\r\n\tld l,1\r\n\tret\r\n\t\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_TestKeyF.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_TestKeyF\r\n\r\nGLOBAL cpc_KeysData\r\nGLOBAL keymap\r\nGLOBAL tabla_teclas\r\n\r\n\r\n.cpc_TestKeyF\r\n\tSLA L\r\n\tinc l\r\n\tld h,0\r\n\tld de,cpc_KeysData+tabla_teclas\r\n\tadd hl,de\r\n\t\r\n\tld a,(HL)\r\n\tsub $40\r\n\r\n\tex de,hl\r\n\tld hl,cpc_KeysData+keymap\t;; lee la lnea buscada del keymap\r\n\tld c,a\r\n\tld b,0\r\n\tadd hl,bc\r\n\tld a,(hl)\r\n\tex de,hl\r\n\t\r\n\r\n\tDEC hl\t\t\t\t\t\t; pero slo nos interesa una de las teclas.\r\n\tand (HL) ;para filtrar por el bit de la tecla (puede haber varias pulsadas)\r\n\tCP (hl)\t;comprueba si el byte coincide\r\n\tld h,0\r\n\tjp nz,pulsado\r\n\tld l,h\r\n\tret\r\n.pulsado\r\n\tld l,1\r\n\tret\r\n\t\r\n\t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_TestKeyboard.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_TestKeyboard\r\n\r\n\r\n\r\n; Definiciones del hardware del CPC\r\n; Puertos de Acceso\r\n;GATE_ARRAY\tequ\t#7F\r\n;PPI_A\t\tequ #F4\r\n;PPI_B\t\tequ #F5\r\n;PPI_C\t\tequ #F6\r\n;PPI_CONTROL\tequ #F7\r\n\r\n\r\n.cpc_TestKeyboard\t;Tomado de las rutinas bsicas que aparecen \r\n\t\t\t;en los documentos de  Kevin Thacker \r\n;ld a, line\t;use the value from the table above\r\ndi\r\n\r\n\r\n;add $40\r\n\r\n;Write 14 to PPI Port A, (This is the index of the I/O Port A register of the PSG)\r\nld bc, $F40E\t\t;14 en puerto A (&F4)\r\nout (c), c\r\n;   2. Select PSG operation: write register index, by setting bit 7=\"1\" and bit 6=\"1\" of PPI port C.\r\n;      (At this stage the PSG will have selected the register specified by the data at PPI Port A)\r\nld bc, $F6C0\t;bits 6 y 7 a 1 en el puerto C (&F6)\r\nout (c), c\r\n;   3. Select PSG operation: inactive, by setting bit 7=\"0\" and bit 6=\"0\" of PPI Port C.\r\n;      (This stage is required by the CPC+. If it is missing the scanning operation will fail)\r\n; cpc+ compatible. bits 6 y 7 al puerto C (&F6)\r\n\r\n;ld c,0\r\n;out (c),c\r\ndefb $ed,$71        ;    out (c),0\r\n\r\n;   4. Set Port A of the PPI to input (use PPI Control register),\r\n;      (At this stage it is possible to read from PSG register 14)\r\nld bc, $F792\t\t\t;puerto control (&F7) a input\r\nout (c), c\r\n\r\ndec b\r\n;ld b, $F6\r\n;   5. Write matrix line into bit 3-0 of PPI Port C.\r\n;      (At this stage the matrix line data will be presented to PSG register 14).\r\nout (c), a\t\t;A indica la lnea de la matriz a leer en puerto C (&F6)\r\n\r\n\r\n;   6. Select PSG operation: read register data, by setting bit 7=\"0 and bit 6=\"1\" of PPI Port C.\r\n;      (At this stage the matrix line data will be presented to PPI port A)\r\n;ld bc, $F640\r\n;out (c),c\r\n\r\n;   7. Read matrix data from PPI port A.\r\nld b, $F4\r\nin a, (c)\r\n\r\n;\t8. No aplica\r\n;   9. Set Port A of the PPI to output (use PPI Control register),\r\n;      (At this stage it is possible to write data to the PSG. This algorithm assumes that port A \r\n;       is in this state when it starts)\r\nld bc, $F782\r\nout (c), c\r\n\r\n;  10. Select PSG operation: inactive, by setting bit 7=\"0\" and bit 6=\"0\" of PPI Port C.\r\n;      (This stage is required by the CPC+. If it is missing the scanning operation will fail) \r\ndec b\r\n;ld bc, $F600\r\n;ld c,0\r\n;out (c), c\r\ndefb $ed,$71        ;    out (c),0\r\ncpl\t\t\t\t\t; En lugar de 0 si se ha pulsado una tecla, pone 1\r\nei\r\nret\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t\t   \t\t\r\n\r\n\t   \r\n\r\n\t   \r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_TouchTileSpXY.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_TouchTileSpXY\r\n\r\nGLOBAL tiles\r\nGLOBAL tiles_tocados\r\n\r\n\r\n.cpc_TouchTileSpXY\r\n;entran las coordenadas x,y y se marca el tile para redibujarlo en pantalla\r\n;la coordenada x se divide entre 4 y da el tile\r\n;la coordenada y se divide entre 16 y da el tile\r\n\r\n\tld hl,2\r\n    add hl,sp\t\t\t; Es la forma de pasar parmetros? Se pasan en SP+2? en la pila?\t\t\t\r\n\tld d,(hl)\r\n\tinc hl\r\n\tinc hl\r\n\tld e,(hl)\r\n\t\r\n\t;E tiene X\r\n\t;d tiene Y\r\n\t\r\n\tLD A,E\r\n\tSRL A\r\n\tSRL A\r\n\tLD E,A\t;E tiene el bloque en horizontal\r\n\t\r\n\tLD A,D\r\n\tSRL A\r\n\tSRL A\r\n\tSRL A\r\n\tSRL A\r\n\tLD D,A\t;D tiene el bloque en vertical\r\n\t\r\n\t;la posicin del bloque se calcula8 18*y+x\r\n\t\r\n;\tSLA A\r\n;\tLD D,A\r\n;\tSLA A\r\n;\tSLA A\r\n;\tSLA A\r\n;\tADD D\r\n;\tADD E\t;A apunta a la posicin\r\n;\tLD E,A\r\n\t\r\n\tLD HL,tiles_tocados\r\n\t;incorporo el tile en su sitio, guardo x e y\r\n.bucle_recorrido_tiles_tocados\r\n\tLD A,(HL)\r\n\tCP $FF\t\r\n\tJP Z,incorporar_tile\t;Solo se incorpora al llegar a un hueco\r\n\tCP E\r\n\tJP Z, comprobar_segundo_byte\t\r\n\tINC HL\r\n\tINC HL\r\n\tJP bucle_recorrido_tiles_tocados\r\n.comprobar_segundo_byte\r\n\tINC HL\r\n\tLD A,(HL)\r\n\tCP D\r\n\tRET Z\t;los dos bytes son iguales, es el mismo tile. No se aade\r\n\tINC HL\r\n\tJP bucle_recorrido_tiles_tocados\r\n.incorporar_tile\r\n\tLD (HL),E\t\r\n\tINC HL\r\n\tLD (HL),D\r\n\tINC HL\r\n\tRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_TouchTileXY.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_TouchTileXY\t\t;marca un tile indicando las coordenadas del tile\r\n\r\nGLOBAL tiles\r\nGLOBAL tiles_tocados\r\n\r\nGLOBAL cpc_UpdTileTable\r\n\r\n\r\n.cpc_TouchTileXY\r\n;entran las coordenadas x,y y se marca el tile para redibujarlo en pantalla\r\n;la coordenada x se divide entre 4 y da el tile\r\n;la coordenada y se divide entre 16 y da el tile\r\n\tld hl,2\r\n    add hl,sp\t\t\t; Es la forma de pasar parmetros? Se pasan en SP+2? en la pila?\t\t\t\r\n\tld D,(hl)\r\n\tinc hl\r\n\tinc hl\r\n\tld E,(hl)\r\nJP cpc_UpdTileTable\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_TouchTiles.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2009       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_TouchTiles\t\t;pone un byte en la posicin de la pantalla indicada\r\n\r\nGLOBAL cpc_UpdTileTable\r\n\r\n\r\n.cpc_TouchTiles\r\n\r\n\tld ix,2\r\n\tadd ix,sp\r\n\r\n\tld c,(ix+0)\t;h\r\n\t;ld b,(ix+2)\t;w\r\n\r\n\tld L,(ix+4)\t;y\r\n\tld H,(ix+6)\t;x\t\r\n\t\r\n\t\r\n\t;lee el rectngulo y lo mueve al buffer\r\n\t\r\n\t.bucle_alto\r\n\tld b,(ix+2)\r\n\t.bucle_ancho\r\n\tpush HL\r\n\t;e+c\r\n\tld a,c\t\t;alto\r\n\tadd L\r\n\tLD d,a\r\n\t;d+b\r\n\tld a,b\t\t;ancho\r\n\tadd H\r\n\tLD e,a\r\n\tcall cpc_UpdTileTable\r\n\tpop HL\t\r\n\tdjnz bucle_ancho\t\r\n\tdec c\r\n\tjp nz,bucle_alto\r\n\tret\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_UnExo.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_UnExo\r\n\r\n.cpc_UnExo\r\n;Exomizer 2 Z80 decoder\r\n; by Metalbrain\r\n;\r\n; compression algorithm by Magnus Lind\r\n\r\n;input  \thl=compressed data start\r\n;\t\tde=uncompressed destination start\r\n;\r\n;\t\tyou may change exo_mapbasebits to point to any free buffer\r\npop af\r\npop de\r\npop hl\r\npush af\r\n\r\ndi\r\ncall deexo\r\nei\r\nret\r\n\r\n.deexo\r\n\t\tld\tixh,128\r\n\r\n\t\tld\tb,52\r\n\t\tld\tiy,exo_mapbasebits\r\n\t\tpush\tde\r\n.exo_initbits\r\n\tld\ta,b\r\n\t\tsub\t4\r\n\t\tand\t15\r\n\t\tjr\tnz,exo_node1\r\n\r\n\t\tld\tde,1\t\t;DE=b2\r\n.exo_node1\r\n\tld\tc,16\r\n.exo_get4bits\r\n\tcall\texo_getbit\r\n\t\trl\tc\r\n\t\tjr\tnc,exo_get4bits\r\n\t\tld\t(iy+0),c\t;bits(i)=b1\r\n\r\n\t\tpush\thl\r\n\t\tinc\tc\r\n\t\tld\thl,0\r\n\t\tscf\r\n.exo_setbit\r\n\tadc\thl,hl\r\n\t\tdec\tc\r\n\t\tjr\tnz,exo_setbit\r\n\t\tld\t(iy+52),e\r\n\t\tld\t(iy+104),d\t;base(i)=b2\r\n\t\tadd\thl,de\r\n\t\tex\tde,hl\r\n\t\tinc\tiy\r\n\r\n\t\tpop\thl\r\n\t\tdjnz\texo_initbits\r\n\t\tinc\tc\r\n\t\t\r\n.exo_literalseq\r\n\tpop\tde\r\n.exo_literalcopy\r\nldir\t\t\t;copy literal(s)\r\n.exo_mainloop\r\n\tld\tc,1\r\n\t\tcall\texo_getbit\t;literal?\r\n\t\tjr\tc,exo_literalcopy\r\n\t\tld\tc,255\r\n.exo_getindex\r\n\tinc\tc\r\n\t\tcall\texo_getbit\r\n\t\tjr\tnc,exo_getindex\r\n\t\tld\ta,c\t\t;C=index\r\n\t\tcp\t16\r\n\t\tret\tz\r\n\t\tjr\tc,exo_continue\r\n\t\tpush\tde\r\n\t\tld\td,16\r\n\t\tcall\texo_getbits\r\n\t\tjr\texo_literalseq\r\n.exo_continue\r\n\tpush\tde\r\n\t\tcall\texo_getpair\r\n\t\tpush\tbc\r\n\t\tpop\taf\r\n\t\tex\taf,af'\t\t;lenght in AF'\r\n\t\tld\tde,512+48\t;1?\r\n\t\tdec\tbc\r\n\t\tld\ta,b\r\n\t\tor\tc\r\n\t\tjr\tz,exo_goforit\r\n\t\tld\tde,1024+32\r\n\t\tdec\tbc\t\t;2?\r\n\t\tld\ta,b\r\n\t\tor\tc\r\n\t\tjr\tz,exo_goforit\r\n\t\tld\te,16\r\n.exo_goforit\r\n\tcall\texo_getbits\r\n\t\tld\ta,e\r\n\t\tadd\ta,c\r\n\t\tld\tc,a\r\n\t\tcall\texo_getpair\t;bc=offset\r\n\t\tpop\tde\t\t;de=destination\r\n\t\tpush\thl\t\t\r\n\t\tld\th,d\r\n\t\tld\tl,e\r\n\t\tsbc\thl,bc\t\t;hl=origin\r\n\t\tex\taf,af'\r\n\t\tpush\taf\r\n\t\tpop\tbc\t\t;bc=lenght\r\n\t\tldir\r\n\t\tpop\thl\t\t;Keep HL, DE is updated\r\n\t\tjr\texo_mainloop\t;Next!\r\n\r\n.exo_getpair\r\n\tld\tiy,exo_mapbasebits\r\n\t\tld\tb,0\r\n\t\tadd\tiy,bc\r\n\t\tld\td,(iy+0)\r\n\t\tcall\texo_getbits\r\n\t\tld\ta,c\r\n\t\tadd\ta,(iy+52)\r\n\t\tld\tc,a\r\n\t\tld\ta,b\r\n\t\tadc\ta,(iy+104)\r\n\t\tld\tb,a\r\n\t\tret\r\n\r\n.exo_getbits\r\n\tld\tbc,0\t\t;get D bits in BC\r\n.exo_gettingbits\r\ndec\td\r\n\t\tret\tm\r\n\t\tcall\texo_getbit\r\n\t\trl\tc\r\n\t\trl\tb\r\n\t\tjr\texo_gettingbits\r\n\r\n.exo_getbit\r\n\tld\ta,ixh\t\t;get one bit\r\n\t\tadd\ta,a\r\n\t\tld\tixh,a\r\n\t\tret\tnz\r\n\t\tld\ta,(hl)\r\n\t\tinc\thl\r\n\t\trla\r\n\t\tld\tixh,a\r\n\t\tret\r\n\r\n.exo_mapbasebits\r\ndefs\t156\t;tables for bits, baseL, baseH"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_Uncrunch.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_Uncrunch\r\n\r\n.cpc_Uncrunch\r\n; datos necesarios que vienen en la pila:\r\n; ORIGEN\tHL\r\n; DESTINO\tDE\r\n\r\n\t;Ojo, para que el pucrunch funcione hay que coger y quitar el salto de las interrupciones.\r\n\tdi\r\n\tld hl,($0038)\r\n\tld (datos_int),HL\r\n\r\n\tld hl,$00c9\r\n\tld ($0038),hl\r\n\tei\r\n\t;ld hl,2\r\n    ;add hl,sp\t\t\t\r\n\t; pongo en HL el valor buscado\r\n\t;push hl\r\n\t;pop ix\r\npop af\r\npop de\r\npop hl\r\npush af\r\n\t\r\n;\tld ix,2\r\n;\tadd ix,sp\r\n\r\n;\tld e,(ix+0)\r\n;\tld d,(ix+1)\r\n;hl tiene las coordenadas donde se dibujar el sprite  \t\t\t\r\n;\tld l,(ix+2)\r\n;\tld h,(ix+3)\r\n\r\n\r\n\t;call pucrunch\r\n\t;jp\tpucrunch\r\n\t\t\r\n\r\n.pucrunch  \r\n   push   de         ; destination pointer to 2nd register \r\n   exx            ; set \r\n   pop   de \r\n\r\n   \r\n   push   hl \r\n   push   de \r\n   push   bc \r\n   push   af \r\n\r\n   exx \r\n\r\n        ; read the header self-modifying the \r\n        ; parameters straight into the code \r\n        ; skip useless data \r\n \r\n   \r\n   ld bc,6\r\n   add hl,bc\r\n\r\n   ld   a, (hl)         ; starting escape \r\n   inc   hl \r\n   ld   (esc+1), a \r\n\r\n   inc   hl         ; skip useless data \r\n   inc   hl \r\n\r\n   ld   a, (hl)         ; number of escape bits \r\n   inc   hl \r\n   ld   (escb0+1), a \r\n   ld   (escb1+1), a \r\n\r\n   ld   b, a         ; 8 - escape bits \r\n   ld   a, 8 \r\n   sub   b \r\n   ld   (noesc+1), a \r\n\r\n   ld   a, (hl)         ; maxGamma + 1 \r\n   inc   hl \r\n   ld   (mg+1), a \r\n\r\n   ld   b, a         ; 8 - maxGamma \r\n   ld   a, 9 \r\n   sub   b \r\n   ld   (longrle+1), a \r\n\r\n   ld   a, (hl)         ; (1 << maxGamma) \r\n   inc   hl \r\n   ld   (mg1+1), a \r\n\r\n   add   a, a         ; (2 << maxGamma) - 1 \r\n   dec   a \r\n   ld   (mg21+1), a \r\n\r\n   ld   a, (hl)         ; extra lz77_0 position bits \r\n   inc   hl \r\n   ld   (elzpb+1), a \r\n\r\n   inc   hl         ; skip useless data \r\n   inc   hl \r\n\r\n   ld   e, (hl)         ; RLE table length \r\n   ld   (rlet+1), hl      ; RLE table pointer \r\n   inc   hl \r\n   ld   d, 0 \r\n   add   hl, de \r\n\r\n   ld   c, $80         ; start decompression \r\n   jp   loop_u \r\n\r\n.newesc\r\n   ld   a, (esc+1)      ; save old escape code \r\n   ld   d, a \r\n\r\n.escb0\r\n   ld   b, 2         ; ** parameter \r\n   xor   a         ; get new escape code \r\n   call   get_bits \r\n   ld   (esc+1), a \r\n\r\n   ld   a, d \r\n\r\n.noesc \r\n  ld   b, 6         ; ** parameter \r\n   call   get_bits      ; get more bits to complete a byte \r\n\r\n   exx            ; output the byte \r\n   ld   (de), a \r\n   inc   de \r\n   exx \r\n\r\n.loop_u \r\n  xor   a \r\n.escb1   \r\n\tld   b, 2         ; ** parameter \r\n   call   get_bits      ; get escape code \r\n.esc   \r\n\tcp   0         ; ** parameter \r\n   jp   nz, noesc \r\n\r\n   call   get_gamma      ; get length \r\n   exx \r\n   ld   b, 0 \r\n   ld   c, a \r\n   exx \r\n\r\n   cp   1 \r\n   jp   nz, lz77_0      ; lz77_0 \r\n\r\n   xor   a \r\n   call   get_bit \r\n   jp   nc, lz77_0_2      ; 2-byte lz77_0 \r\n\r\n   call   get_bit \r\n   jp   nc, newesc      ; escaped literal byte \r\n\r\n   call   get_gamma      ; get length \r\n   exx \r\n   ld   b, 1 \r\n   ld   c, a \r\n   exx \r\n\r\n.mg1   \r\n\tcp   64         ; ** parameter \r\n   jp   c, chrcode      ; short RLE, get bytecode \r\n\r\n.longrle   \r\n\tld   b, 2         ; ** parameter \r\n   call   get_bits      ; complete length LSB \r\n   ex   af, af' \r\n\r\n   call   get_gamma      ; length MSB \r\n   exx \r\n   ld   b, a \r\n   ex   af, af' \r\n   ld   c, a \r\n   exx \r\n\r\n.chrcode   \r\n  call   get_gamma      ; get byte to repeat \r\n\r\n   push   hl \r\n.rlet   \r\n\tld   hl, $0000      ; ** parameter \r\n   ld   d, 0 \r\n   ld   e, a \r\n   add   hl, de \r\n\r\n   cp   32 \r\n   ld   a, (hl) \r\n   pop   hl \r\n   jp   c, dorle \r\n\r\n   ld   a, e         ; get 3 more bits to complete the \r\n   ld   b, 3         ; byte \r\n   call   get_bits \r\n\r\n.dorle   \r\nexx            ; output the byte n times \r\n   inc   c \r\n.dorlei\r\n   ld   (de), a \r\n   inc   de \r\n   dec   c \r\n   jp   nz, dorlei \r\n   dec   b \r\n   jp   nz, dorlei \r\n   exx \r\n   jp   loop_u \r\n\r\n.lz77_0\r\n   call   get_gamma      ; offset MSB \r\n.mg21\r\n   cp   127         ; ** parameter \r\n\r\n   ; ret   z \r\n\r\n   jp   z, fin         ; EOF, return \r\n\r\n   dec   a         ; (1...126 -> 0...125) \r\n.elzpb\r\n   ld   b, 0         ; ** parameter \r\n   call   get_bits      ; complete offset MSB \r\n\r\n.lz77_0_2\r\n   ex   af, af' \r\n   ld   b, 8         ; offset LSB \r\n   call   get_bits \r\n   cpl            ; xor'ed by the compressor \r\n\r\n   exx            ; combine them into offset \r\n   ld   l, a \r\n   ex   af, af' \r\n   ld   h, a \r\n   inc   hl \r\n\r\n   xor   a         ; CF = 0 \r\n\r\n   push   de         ; (current output position) - (offset) \r\n   ex   de, hl \r\n   sbc   hl, de \r\n   pop   de \r\n\r\n   inc   bc \r\n\r\n   ldir            ; copy \r\n   exx \r\n   jp   loop_u \r\n\r\n;## Get a bit from the source stream. \r\n;## Return    CF = result \r\n.get_bit  \r\n   sla   c         ; shift next bit into CF \r\n   ret   nz \r\n   ld   c, (hl)         ; get next byte \r\n   inc   hl         ; increase source stream pointer \r\n   rl   c         ; shift next bit into CF, bit0 = 1 \r\n   ret \r\n\r\n;## Get multiple bits from the source stream. \r\n;## In        B = number of bits to get \r\n;## Return    A = result \r\n.get_bits  \r\n   dec   b \r\n   ret   m \r\n   sla   c         ; shift next bit into CF \r\n   jp   nz, gb1 \r\n   ld   c, (hl)         ; get next byte \r\n   inc   hl         ; increase source stream pointer \r\n   rl   c         ; shift next bit into CF, bit0 = 1 \r\n.gb1\r\n   rla            ; rotate next bit into A \r\n   jp   get_bits \r\n\r\n;## Get an Elias Gamma coded value from the source stream. \r\n;## Return    A = result \r\n.get_gamma  \r\n   ld   b, 1 \r\n.mg  \r\n ld   a, 7         ; ** parameter \r\n.gg1\r\n  call   get_bit         ; get bits until 0-bit or max \r\n   jr   nc, gg2 \r\n   inc   b \r\n   cp   b \r\n   jp   nz, gg1 \r\n.gg2\r\n   ld   a, 1         ; get the actual value \r\n   dec   b \r\n   jp   get_bits \r\n\r\n.fin \r\n   ; Restauramos los registros dobles y vuelta limpia \r\n   exx \r\n   pop   af \r\n   pop   bc \r\n   pop   de \r\n   pop   hl \r\n   exx \r\n   \r\n   ;ret   \r\n\tdi\r\n\tld hl,(datos_int)\r\n\tld ($0038),hl\t;restauro la interrupcin original\r\n\tei\r\n\tret   \r\n.datos_int defw 0\t   "
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_UpdScr.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\n\r\n\r\nGLOBAL cpc_UpdScr\t\t\t;recoge los tiles tocados, los restaura-\r\nGLOBAL tiles_tocados\r\nGLOBAL pantalla_juego\t\t\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_super_buffer\r\nGLOBAL tiles\r\n\r\n\r\nGLOBAL ancho_pantalla_bytes\r\n\r\n\r\n\r\n\r\n.cpc_UpdScr\r\n;lee la tabla de tiles tocados y va restaurando cada uno en su sitio.\r\n\r\n\tLD IX,tiles_tocados\r\n.bucle_cpc_UpdScr\t\r\n\tLD E,(IX+0)\r\n\tLD A,$FF\r\n\tCP E\r\n\tRET Z\t\t;RETORNA SI NO HAY MS DATOS EN LA LISTA\r\n\tLD D,(IX+1)\r\n\tINC IX\r\n\tINC IX\r\n\r\n\r\n\t\r\n\r\n\t\r\n.posicionar_superbuffer \r\n;con la coordenada y nos situamos en la posicin vertical y con x nos movemos a su sitio definitivo\r\n\tLD c,D\r\n\tSLA c\r\n\t\r\n\t;LD C,A\t;x2\r\n\tLD B,0\r\n\tLD HL,posiciones_super_buffer\r\n\tADD HL,BC\r\n\tLD C,(HL)\r\n\tINC HL\r\n\tLD B,(HL)\t\r\n\t\r\n\tLD l,E\r\n\tSLA l\r\n\t;LD L,A\r\n\tLD H,0\r\n\t\r\n\tADD HL,BC\r\n\t;HL apunta a la posicin correspondiente en superbuffer\r\n\t;RET\t\r\n\tpush hl\r\n\t\r\n.posicionar_tile\t\r\n\r\n\r\n\r\n;h*e+a\r\n;;;; ___________________________________________________\r\n;;;; RUTINA PARA GENRICA PARA MULTIPLICAR \r\n\r\n\tld a,e\r\n\tld e,d\r\n\r\n\tinclude \"multiplication2.asm\"\r\n\r\n\tld e,a\r\n\tLD D,0\r\n\tADD HL,DE\r\n; EN HL DEBE QUEDAR EL NUMERO MULTIPLICADO POR EL ANCHO EN TILES DE LA PANTALLA\t\r\n;;;; ___________________________________________________\r\n\r\n\r\n\t\r\n\tLD DE,pantalla_juego\r\n\tADD HL,DE\r\n\t\r\n\tLD L,(HL)\r\n\tLD H,0\r\n\r\n\tADD HL,HL\r\n\tADD HL,HL\r\n\tADD HL,HL\r\n\tADD HL,HL\t;X16\r\n\tLD DE,tiles\r\n\tADD HL,DE\r\n\t;HL apunta a los datos del tile\r\n\t\r\n\t;ex de,hl\r\n\tpop de ;hl\r\n\t;RET\r\n\t\r\n\r\n.transferir_map_sbuffer\t\r\n\tld bc,ancho_pantalla_bytes-2 ;63\r\n\tldi\r\n\tldi\r\n\tex de,hl\r\n\tld c,ancho_pantalla_bytes-2\r\n\tadd HL,BC\t\r\n\t\tex de,hl\r\n\tldi\r\n\tldi\r\n\tex de,hl\r\n\tld c,ancho_pantalla_bytes-2\r\n\tadd HL,BC\t\r\n\t\tex de,hl\r\n\tldi\r\n\tldi\r\n\tex de,hl\r\n\tld c,ancho_pantalla_bytes-2\r\n\tadd HL,BC\t\r\n\t\tex de,hl\r\n\tldi\r\n\tldi\r\n\tex de,hl\r\n\tld c,ancho_pantalla_bytes-2\r\n\tadd HL,BC\t\r\n\t\tex de,hl\r\n\tldi\r\n\tldi\r\n\tex de,hl\r\n\tld c,ancho_pantalla_bytes-2\r\n\tadd HL,BC\t\r\n\t\tex de,hl\r\n\tldi\r\n\tldi\r\n\tex de,hl\r\n\tld c,ancho_pantalla_bytes-2\r\n\tadd HL,BC\t\r\n\t\tex de,hl\r\n\tldi\r\n\tldi\r\n\tex de,hl\r\n\tld c,ancho_pantalla_bytes-2\r\n\tadd HL,BC\t\r\n\t\tex de,hl\r\n\tldi\r\n\tldi\r\n\r\njp bucle_cpc_UpdScr\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_UpdScrAddresses.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_UpdScrAddresses\t\t\t;recoge los tiles tocados, los restaura-\r\n\t\t\t;datos de la pantalla, cada byte indica un tile\r\nGLOBAL posiciones_pantalla\r\n\r\n\r\n.cpc_UpdScrAddresses\r\nex de,hl\r\nld bc,$50\r\nld a,1\r\n\r\nld ix, posiciones_pantalla\r\n.bucle_pos\r\nld hl,0\r\npush af\r\ncall mult\r\npop af\r\nadd hl,de\r\nld (ix+0),l\r\nld (ix+1),h\r\ninc ix\r\ninc ix\r\ninc a\r\ncp 20 \r\n\r\njp nz, bucle_pos\r\nret \r\n\r\n.mult\r\ndec a\r\nret z\r\nadd hl,bc\r\njp mult"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_UpdTileTable.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007       **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_UpdTileTable\t\t;marca un tile indicando las coordenadas del tile\r\n\r\nGLOBAL tiles_tocados\r\n\r\nGLOBAL tiles_ocultos_ancho0\r\nGLOBAL tiles_ocultos_ancho1\r\nGLOBAL tiles_ocultos_alto0\r\nGLOBAL tiles_ocultos_alto1\r\nGLOBAL oculto\r\n\r\n.cpc_UpdTileTable\t\r\n\r\n\r\n\t\r\n;; Comprueba si el tile est dentro del cuadrado visible\r\n;; x>tiles_ocultos_ancho0 && x<tiles_ocultos_ancho1\r\n;; y>tiles_ocultos_alto0 && y<tiles_ocultos_alto1\r\n\r\n;\tld a,tiles_ocultos_ancho0-1\r\n;\tcp e\r\n;\tjp p,contkaka\t;;dentro de area visible\te<a\r\n;\tld a,tiles_ocultos_ancho1\r\n;\tcp e\r\n;\tjp m,contkaka\t;;dentro de area visible   e>=a\r\n;\tld a,tiles_ocultos_alto0-1\r\n;\tcp d\r\n;\tjp p,contkaka\t;;dentro de area visible\te>a\r\n;\tld a,tiles_ocultos_alto1\r\n;\tcp d\r\n;\tjp m,contkaka\t;;dentro de area visible   e<=a\t\r\n\t\r\n\t; Si est en area visible, se actualiza la tabla\r\n\t\r\n\r\n\tLD HL,tiles_tocados\r\n\t;incorporo el tile en su sitio, guardo x e y\r\n.bucle_recorrido_tiles_tocados\r\n\tLD A,(HL)\r\n\tCP $FF\t\r\n\tJP Z,incorporar_tile\t;Solo se incorpora al llegar a un hueco\r\n\tCP E\r\n\tJP Z, comprobar_segundo_byte\t\r\n\tINC HL\r\n\tINC HL\r\n\tJP bucle_recorrido_tiles_tocados\r\n.comprobar_segundo_byte\r\n\tINC HL\r\n\tLD A,(HL)\r\n\tCP D\r\n\tRET Z\t;los dos bytes son iguales, es el mismo tile. No se aade\r\n\tINC HL\r\n\tJP bucle_recorrido_tiles_tocados\r\n.incorporar_tile\r\n\tLD (HL),E\t\r\n\tINC HL\r\n\tLD (HL),D\r\n\tINC HL\r\n\tLD (HL),$FF\t;End of data\r\n.contkaka\t\r\n\tRET\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpc_UpdateTileMap.asm",
    "content": "GLOBAL cpc_UpdateTileMap\r\n\r\nGLOBAL cpc_PutSpTileMap\t\r\nGLOBAL cpc_PutMaskSpriteTileMap2b\r\nGLOBAL cpc_UpdScr\r\nGLOBAL cpc_ShowTouchedTiles\r\nGLOBAL cpc_PutMaskSpTileMap2b\r\nGLOBAL cpc_PutORSpTileMap2b\r\nGLOBAL cpc_PutSpTileMap2b\r\nGLOBAL cpc_PutTrSpTileMap2b\r\nGLOBAL cpc_PutTrSpriteTileMap2b\r\n\r\n\r\n   \t;struct sprite \r\n\t;   \tint datos_fondo;\t\t//2 bytes \t01\t\r\n\t;   \tint datos_sprite;\t\t//2 bytes\t23\r\n\t;   \tint coord_pantalla;\t\t//2 bytes\t45  pos pantalla actual\r\n\t;   \tint ocoord_pantalla;\t//2 bytes\t67\tpos pantalla anterior\r\n\t;   \tchar cx, cy;\t\t\t//2 bytes \tcoordenadas nuevas\r\n\t;   \tchar ox, oy;\t\t\t//2 bytes   coordenadas anteriores\r\n\t;   \tchar dir1;\t\t\t\t//1 byte\r\n\t   \t\t\r\n   \t\r\n   \t\r\n\r\n.cpc_UpdateTileMap\r\n;HL puntero a la lista de sprites\r\npush hl\r\npush hl\r\npop iy\r\n\r\n\r\n;Se enva el sprite en HL\r\n.bucle_recorrido_lista_f1\r\n\tld e,(iy+0)\r\n\tLD a,e\r\n\tcp $ff\r\n\tjp z,cont_fase2\r\n\tld d,(iy+1)\r\n\t;push ix\r\n\t\r\n\t;push hl\t;11\r\n\t;pop ix\t\t;14\r\n\t;25\r\n\t\r\n\r\n\tLD IXH,d\t;9\r\n    LD IXL,e\t;9   \r\n    ;18\r\n    \r\n\tbit 0,(ix+12)\r\n    ;ret z\t\t\t;If the sprite doesn't have to draw\r\n    \r\n\tcall nz, cpc_PutSpTileMap+5\t;OJO, cambiado para dar algo ms de velocidad.\r\n\t;pop ix\r\n\t\r\n\tinc iy \r\n\tinc iy\r\n\tjp bucle_recorrido_lista_f1\r\n\r\n.cont_fase2\t\r\n\r\ncall cpc_UpdScr\r\n\r\npop iy\t\r\n.bucle_recorrido_lista_f2\r\n\tld e,(iy+0)\r\n\tLD a,e\r\n\tcp $ff\r\n\tjp z,cont_fase3\r\n\tld d,(iy+1)\r\n\t;push iy\r\n\t\r\n\t;push hl\r\n\t;pop ix\r\n\r\n\tLD IXH,d\t;9\r\n    LD IXL,e\t;9 \r\n    \t\r\n\tld a,(ix+12)\r\n\r\n\t\r\n\tand @00001110\r\n\t\r\n\tcp @00000010\t;2\r\n\tjp z,op1\r\n\t;ld a,b\r\n\t;and @00000100\r\n\tcp @00000100\r\n\tjp z,op2\r\n\t;ld a,b\r\n\t;and @00000110\r\n\tcp @00000110\r\n\tjp z,op3\r\n\t;ld a,b\r\n\t;and @00001000\r\n\tcp @00001000\r\n\tjp z,op4\t\t\r\n\tcp @00001010\r\n\tjp z,op5\t\t\t\r\n\tcp @00001100\r\n\tjp z,op6\t\r\n.cont_buc\t\r\n\t;pop iy\r\n\tinc iy \r\n\tinc iy\r\n\tjp bucle_recorrido_lista_f2\t\r\n.cont_fase3\t\r\njp cpc_ShowTouchedTiles\r\n;ret\r\n.op1\r\ncall cpc_PutMaskSpriteTileMap2b+5\r\njp cont_buc\r\n.op2\r\ncall cpc_PutMaskSpTileMap2b+5\r\njp cont_buc\r\n.op3\r\ncall cpc_PutORSpTileMap2b+5\r\njp cont_buc\r\n.op4\r\ncall cpc_PutSpTileMap2b+5\r\njp cont_buc\r\n.op5\r\ncall cpc_PutTrSpTileMap2b+5\r\njp cont_buc\r\n.op6\r\ncall cpc_PutTrSpriteTileMap2b+5\r\njp cont_buc"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/cpcrslib.h",
    "content": "\r\n#define _CPCRSGLOBAL_H\r\n\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_ShowTileMap(int x);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_ShowScrTileMap(int x);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_ShowScrTileMap2(int x);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_UpdScrAddresses(unsigned int x);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_TouchTileXY(unsigned char x, unsigned char y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_TouchTileSpXY(unsigned char x, unsigned char y);\r\nextern void  __CALLEE__ __GLOBAL__ \tcpc_ResetTouchedTiles(void);\r\nextern void  __CALLEE__ __GLOBAL__\t\tcpc_UpdScr(void);\r\nextern void  __CALLEE__ __GLOBAL__ \tcpc_ShowTouchedTiles2(void);\r\nextern void  __CALLEE__ __GLOBAL__ \tcpc_ShowTouchedTiles(void);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutSpTileMap(int sprite);\r\n\textern void  __FASTCALL__ __GLOBAL__   cpc_PutSpTileMapO(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutMaskSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutTrSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutORSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutCpSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutMaskSpriteTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutTrSpriteTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PutTrSp8x16TileMap2b(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_SuperbufferAddress(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_UpdateTileMap(int spritelist);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_SpUpdX(int sprite, char x);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_SpUpdY(int sprite, char y);\r\nextern unsigned char  __GLOBAL__   \tcpc_CollSp(int sprite1, int sprite2);\r\nextern void  __GLOBAL__  \t\t\t\tcpc_SetTile(unsigned char x, unsigned char y, unsigned char byte);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_SetTouchTileXY(unsigned char x, unsigned char y, unsigned char byte);\r\nextern unsigned char  __GLOBAL__   \tcpc_ReadTile(unsigned char x, unsigned char y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutSp(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutSpXOR(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __CALLEE__ __GLOBAL__  \tcpc_PutSpriteXOR(int *sprite, int *posicion);\r\nextern void  __CALLEE__ __GLOBAL__  \tcpc_PutMaskSprite(int *sprite, int *posicion);\r\nextern void  __CALLEE__ __GLOBAL__  \tcpc_PutSprite(int *sprite, int *posicion);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutMaskSp(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutSpTr(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutMaskSp2x8(int *sprite, int *posicion);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutMaskSp4x16(int *sprite, int *posicion);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutTile2x8(int *tile, char *x, char *y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutTile4x16(int *tile, char *x, char *y);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_SpRLM1(int sprite);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_SpRRM1(int sprite);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_SetInk(unsigned char pos, unsigned char color);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_SetColour(unsigned char pos, unsigned char color);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_SetBorder(unsigned char color);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_SetMode(unsigned char color);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_SetModo(unsigned char x);\r\nextern char  __FASTCALL__ __GLOBAL__   cpc_TestKey(unsigned char tecla);\t\r\nextern char  __CALLEE__ __GLOBAL__ \tcpc_AnyKeyPressed(void);\t\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_RedefineKey(unsigned char tecla);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_AssignKey(unsigned char tecla, int valor);\r\nextern void  __CALLEE__ __GLOBAL__   \tcpc_DeleteKeys(void);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_PrintStr(int *cadena);\r\nextern int   __GLOBAL__   \t\t\t\tcpc_GetScrAddress(char *x, char *y);\r\nextern void  __CALLEE__ __GLOBAL__   \tcpc_Uncrunch(int *origen, int *destino);\r\nextern void  __CALLEE__ __GLOBAL__   \tcpc_UnExo(int *origen, int *destino);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_GetSp(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStr(int *cadena, int *destino);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStr2X(int *cadena, int *destino);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrXY(int *cadena, char *x, char *y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrXY2X(int *cadena, char *x, char *y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrM1(int *cadena, int *destino);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrXYM1(int *cadena, char *x, char *y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrM12X(int *cadena, int *destino);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrXYM12X(int *cadena, char *x, char *y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrStd(int *cadena, int *destino);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PrintGphStrStdXY(int *cadena, char *x, char *y);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_SetInkGphStr(char *color, char *valor);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_SetInkGphStrM1(char *color, char *valor);\r\nextern void  __FASTCALL__ __GLOBAL__   cpc_InitTileMap(int tiles);\r\nextern char  __CALLEE__ __GLOBAL__   \tcpc_ScrollLeft0(void);\r\nextern char  __CALLEE__ __GLOBAL__   \tcpc_ScrollRight0(void);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_GetTiles(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned int buffer);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_PutTiles(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned int buffer);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_TouchTiles(unsigned char x, unsigned char y, unsigned char w, unsigned char h);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_RRI(unsigned int pos, unsigned char w, unsigned char h);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_RLI(unsigned int pos, unsigned char w, unsigned char h);\r\nextern void  __CALLEE__ __GLOBAL__   \tcpc_DisableFirmware(void);\r\nextern void  __CALLEE__ __GLOBAL__   \tcpc_EnableFirmware(void);\r\nextern void  __CALLEE__ __GLOBAL__   \tcpc_ClrScr(void);\r\nextern void  __CALLEE__ __GLOBAL__   \tcpc_ScanKeyboard(void);\r\nextern char  __FASTCALL__ __GLOBAL__   cpc_TestKeyF(unsigned char tecla);\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/make.bat",
    "content": "z80asm -v -xcpcrslib.lib @cpcrslib.lst\r\ncopy cpcrslib.lib d:\\z88dk\\lib\\clibs\r\ncopy cpcrslib.h d:\\z88dk\\include\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/multiplication1.asm",
    "content": "\r\n\r\n;_______________________________________________________\r\n;____ GENERIC MULTIPLICATION ___________________________   \r\n\r\n\r\n  ;lo cambio para la rutina de multiplicar \r\n\r\n;hl = ExH\r\n\r\n\r\n\r\n\r\n   \t    ld    h, ancho_pantalla_bytes\r\n        LD    L, 0\r\n        LD    D, L \r\n        LD    B, 8\r\n\r\nMULT:   ADD   HL, HL\r\n        JR    NC, NOADD\r\n        ADD   HL, DE\r\nNOADD:  DJNZ  MULT\t\r\n\r\n;_______________________________________________________\t    \t\r\n    \t\r\n    \t\r\n;_______________________________________________________\r\n;_______ \tSPECIFIC MULTIPLICATION\t____________________\r\n  ;lo cambio para la rutina de multiplicar \r\n    \r\n\t;;HL = e*ancho pantalla\t; (h = ancho pantalla)\r\n;ld l,e\t\r\n;ld h,0\r\n;ld d,h\r\n;add hl,hl\t;2\r\n;add hl,hl\t;4\r\n;ld b,h\r\n;ld c,l\r\n;add hl,hl\t;8\r\n;add hl,hl\t;16\r\n;add hl,hl\t;32\r\n;add hl,hl\t;64\r\n;sbc hl,bc\t;60\t\t;y * ancho\r\n\r\n;corrompe bc, de\r\n;_______________________________________________________\r\n\r\n    \t"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/multiplication2.asm",
    "content": "\r\n\t\tld   h, ancho_pantalla_bytes/2\r\n        LD    L, 0\r\n        LD    D, L \r\n        LD    B, 8\r\n\r\nMULT:   ADD   HL, HL\r\n        JR    NC, NOADD\r\n        ADD   HL, DE\r\nNOADD:  DJNZ  MULT\t\r\n\r\n\r\n\r\n\r\n\r\n;_______________________________________________________\r\n;_______ \tSPECIFIC MULTIPLICATION\t____________________\r\n  ;lo cambio para la rutina de multiplicar \r\n    \r\n\t;;HL = e*ancho pantalla\t; (h = ancho pantalla)\r\n;ld l,e\t\r\n;ld h,0\r\n;ld d,h\r\n;add hl,hl\t;2\r\n;ld b,h\r\n;ld c,l\r\n;add hl,hl\t;4\r\n\r\n;add hl,hl\t;8\r\n;add hl,hl\t;16\r\n;add hl,hl\t;32\r\n\r\n;sbc hl,bc\t;30\t\t;y * ancho\r\n\r\n;corrompe bc, de\r\n;_______________________________________________________"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib/optimizando_codigo.txt",
    "content": "Rutinas en las que se puede optimizar usando cdigo especfico para multiplicar:\r\n\r\ncpc_SuperbufferAddress\r\ncpc_SetTile\r\ncpc_SetTouchTileXY\r\ncpc_PutMaskSpTileMap2b\r\ncpc_PutTrSpTileMap2b\r\ncpc_PutSpTileMap2b\r\ncpc_ReadTile\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcrslib.h",
    "content": "\r\n#define _CPCRSLIB_H\r\n\r\nextern void  __FASTCALL__ __LIB__   cpc_ShowTileMap(int x);\r\nextern void  __FASTCALL__ __LIB__   cpc_ShowScrTileMap(int x);\r\nextern void  __FASTCALL__ __LIB__   cpc_ShowScrTileMap2(int x);\r\nextern void  __FASTCALL__ __LIB__   cpc_UpdScrAddresses(unsigned int x);\r\nextern void  __LIB__   \t\t\t\tcpc_TouchTileXY(unsigned char x, unsigned char y);\r\nextern void  __LIB__   \t\t\t\tcpc_TouchTileSpXY(unsigned char x, unsigned char y);\r\nextern void  __CALLEE__ __LIB__ \tcpc_ResetTouchedTiles(void);\r\nextern void  __CALLEE__ __LIB__\t\tcpc_UpdScr(void);\r\nextern void  __CALLEE__ __LIB__ \tcpc_ShowTouchedTiles2(void);\r\nextern void  __CALLEE__ __LIB__ \tcpc_ShowTouchedTiles(void);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutSpTileMap(int sprite);\r\n\textern void  __FASTCALL__ __LIB__   cpc_PutSpTileMapO(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutMaskSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutTrSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutORSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutCpSpTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutMaskSpriteTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutTrSpriteTileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_PutTrSp8x16TileMap2b(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_SuperbufferAddress(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_UpdateTileMap(int spritelist);\r\nextern void  __LIB__   \t\t\t\tcpc_SpUpdX(int sprite, char x);\r\nextern void  __LIB__   \t\t\t\tcpc_SpUpdY(int sprite, char y);\r\nextern unsigned char  __LIB__   \tcpc_CollSp(int sprite1, int sprite2);\r\nextern void  __LIB__  \t\t\t\tcpc_SetTile(unsigned char x, unsigned char y, unsigned char byte);\r\nextern void  __LIB__   \t\t\t\tcpc_SetTouchTileXY(unsigned char x, unsigned char y, unsigned char byte);\r\nextern unsigned char  __LIB__   \tcpc_ReadTile(unsigned char x, unsigned char y);\r\nextern void  __LIB__   \t\t\t\tcpc_PutSp(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __LIB__   \t\t\t\tcpc_PutSpXOR(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __CALLEE__ __LIB__  \tcpc_PutSpriteXOR(int *sprite, int *posicion);\r\nextern void  __CALLEE__ __LIB__  \tcpc_PutMaskSprite(int *sprite, int *posicion);\r\nextern void  __CALLEE__ __LIB__  \tcpc_PutSprite(int *sprite, int *posicion);\r\nextern void  __LIB__   \t\t\t\tcpc_PutMaskSp(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __LIB__   \t\t\t\tcpc_PutSpTr(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __LIB__   \t\t\t\tcpc_PutMaskSp2x8(int *sprite, int *posicion);\r\nextern void  __LIB__   \t\t\t\tcpc_PutMaskSp4x16(int *sprite, int *posicion);\r\nextern void  __LIB__   \t\t\t\tcpc_PutTile2x8(int *tile, char *x, char *y);\r\nextern void  __LIB__   \t\t\t\tcpc_PutTile4x16(int *tile, char *x, char *y);\r\nextern void  __FASTCALL__ __LIB__   cpc_SpRLM1(int sprite);\r\nextern void  __FASTCALL__ __LIB__   cpc_SpRRM1(int sprite);\r\nextern void  __LIB__   \t\t\t\tcpc_SetInk(unsigned char pos, unsigned char color);\r\nextern void  __LIB__   \t\t\t\tcpc_SetColour(unsigned char pos, unsigned char color);\r\nextern void  __FASTCALL__ __LIB__   cpc_SetBorder(unsigned char color);\r\nextern void  __FASTCALL__ __LIB__   cpc_SetMode(unsigned char color);\r\nextern void  __FASTCALL__ __LIB__   cpc_SetModo(unsigned char x);\r\nextern char  __FASTCALL__ __LIB__   cpc_TestKey(unsigned char tecla);\t\r\nextern char  __CALLEE__ __LIB__ \tcpc_AnyKeyPressed(void);\t\r\nextern void  __FASTCALL__ __LIB__   cpc_RedefineKey(unsigned char tecla);\r\nextern void  __LIB__   \t\t\t\tcpc_AssignKey(unsigned char tecla, int valor);\r\nextern void  __CALLEE__ __LIB__   \tcpc_DeleteKeys(void);\r\nextern void  __FASTCALL__ __LIB__   cpc_PrintStr(int *cadena);\r\nextern int   __LIB__   \t\t\t\tcpc_GetScrAddress(char *x, char *y);\r\nextern void  __CALLEE__ __LIB__   \tcpc_Uncrunch(int *origen, int *destino);\r\nextern void  __CALLEE__ __LIB__   \tcpc_UnExo(int *origen, int *destino);\r\nextern void  __LIB__   \t\t\t\tcpc_GetSp(int *sprite, char *alto, char *ancho, int *posicion);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStr(int *cadena, int *destino);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStr2X(int *cadena, int *destino);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrXY(int *cadena, char *x, char *y);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrXY2X(int *cadena, char *x, char *y);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrM1(int *cadena, int *destino);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrXYM1(int *cadena, char *x, char *y);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrM12X(int *cadena, int *destino);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrXYM12X(int *cadena, char *x, char *y);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrStd(int *cadena, int *destino);\r\nextern void  __LIB__   \t\t\t\tcpc_PrintGphStrStdXY(int *cadena, char *x, char *y);\r\nextern void  __LIB__   \t\t\t\tcpc_SetInkGphStr(char *color, char *valor);\r\nextern void  __LIB__   \t\t\t\tcpc_SetInkGphStrM1(char *color, char *valor);\r\nextern void  __FASTCALL__ __LIB__   cpc_InitTileMap(int tiles);\r\nextern char  __CALLEE__ __LIB__   \tcpc_ScrollLeft0(void);\r\nextern char  __CALLEE__ __LIB__   \tcpc_ScrollRight0(void);\r\nextern void  __LIB__   \t\t\t\tcpc_GetTiles(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned int buffer);\r\nextern void  __LIB__   \t\t\t\tcpc_PutTiles(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned int buffer);\r\nextern void  __LIB__   \t\t\t\tcpc_TouchTiles(unsigned char x, unsigned char y, unsigned char w, unsigned char h);\r\nextern void  __LIB__   \t\t\t\tcpc_RRI(unsigned int pos, unsigned char w, unsigned char h);\r\nextern void  __LIB__   \t\t\t\tcpc_RLI(unsigned int pos, unsigned char w, unsigned char h);\r\nextern void  __CALLEE__ __LIB__   \tcpc_DisableFirmware(void);\r\nextern void  __CALLEE__ __LIB__   \tcpc_EnableFirmware(void);\r\nextern void  __CALLEE__ __LIB__   \tcpc_ClrScr(void);\r\nextern void  __CALLEE__ __LIB__   \tcpc_ScanKeyboard(void);\r\nextern char  __FASTCALL__ __LIB__   cpc_TestKeyF(unsigned char tecla);\t\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/borra.bat",
    "content": "del *.obj\r\ndel *.sym"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzConfigurePlayer.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzConfigurePlayer\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL INTERRUPCION\r\n\r\n.cpc_WyzConfigurePlayer\r\n\t;LD HL,2\r\n\t;ADD HL,SP\r\n\t;LD A,(HL)\r\n\tLD a,l\r\n\t;LD HL,INTERRUPCION+cpc_WyzPlayer\r\n\t;AND (HL)\r\n\tLD (INTERRUPCION+cpc_WyzPlayer),A\r\n\tRET\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzInitPlayer.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzInitPlayer\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL TABLA_SONG\r\nGLOBAL TABLA_EFECTOS\r\nGLOBAL TABLA_PAUTAS\r\nGLOBAL TABLA_SONIDOS\r\n\r\n.cpc_WyzInitPlayer\r\n\r\n; la entrada indica las tablas de canciones, pautas, efectos,... slo hay que inicializar esos datos \r\n; en la librera\r\n\tLD IX,2\r\n\tADD IX,SP\r\n\t\r\n\tLD L,(IX+0)\r\n\tLD H,(IX+1)\r\n\tLD (cpc_WyzPlayer+TABLA_SONG),HL\r\n\tLD L,(IX+2)\r\n\tLD H,(IX+3)\r\n\tLD (cpc_WyzPlayer+TABLA_EFECTOS),HL\r\n\tLD L,(IX+4)\r\n\tLD H,(IX+5)\r\n\tLD (cpc_WyzPlayer+TABLA_PAUTAS),HL\r\n\tLD L,(IX+6)\r\n\tLD H,(IX+7)\r\n\tLD (cpc_WyzPlayer+TABLA_SONIDOS),HL\t\r\n\tRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzLoadSong.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzLoadSong\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL CARGA_CANCION_WYZ\r\n\r\n.cpc_WyzLoadSong\t\r\n\t;LD HL,2\r\n\t;ADD HL,SP\r\n\t;LD A,(HL)\r\n\tld a,l\r\n\tJP CARGA_CANCION_WYZ+cpc_WyzPlayer\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzPlayer.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2010           **\r\n; **\t   PLAYER programado por  WYZ\t\t          **\r\n; ******************************************************\r\n           \r\nGLOBAL cpc_WyzPlayer\r\n\r\n;GLOBAL BUFFER_DEC\r\n\r\nGLOBAL CARGA_CANCION_WYZ\r\nGLOBAL INICIA_EFECTO_WYZ\r\nGLOBAL cpc_WyzSetPlayerOn0\r\nGLOBAL cpc_WyzSetPlayerOff0\r\n\r\nGLOBAL TABLA_SONG\r\nGLOBAL TABLA_EFECTOS\r\nGLOBAL TABLA_PAUTAS\r\nGLOBAL TABLA_SONIDOS\r\nGLOBAL INTERRUPCION\r\n\r\nGLOBAL BUFFER_MUSICA\r\nGLOBAL direcc_tempo\r\n\r\n\r\n;DEFINE AMSTRAD = 1\r\n\r\n;DEFINE BUFFER_DEC  = $100\r\n\r\n\r\n\r\n\r\n\r\n; CPC PSG proPLAYER - WYZ 2010\r\n\r\n\r\n.cpc_WyzPlayer\r\n\r\n\r\n\r\n.cpc_WyzSetPlayerOn1\r\n\t;El player funcionar por interrupciones.\r\n\tDI\r\n\tld a,($0038)\r\n\tld (datos_int),a\r\n\tld (salto_int),a\r\n\tld a,($0039)\r\n\tld (datos_int+1),a\r\n\tld (salto_int+1),a\r\n\tld a,($003a)\r\n\tld (datos_int+2),a\r\n\tld (salto_int+2),a\r\n\t\r\n\t\r\n;\tld hl,($0038)\t\r\n;\tld (datos_int),HL\t;guardo el salto original\r\n;\tld a,l\r\n;\tld (salto_int+1),a\r\n;\tld a,h\r\n;\tld (salto_int+2),a\r\n\tld a,$C3\r\n\tld ($0038),a\r\n\tld HL,INICIO\r\n\tld ($0039),HL\r\n\tEI\r\n\tret\r\n\r\n.cpc_WyzSetPlayerOff1\r\n\t\r\n\t;apago todos los sonidos poniendo los registros a 0\r\n\tcall PLAYER_OFF\r\n\tDI\t\r\n\t;Restaura salto original\r\n\tld a,(datos_int)\t;guardo el salto original\r\n\tld ($0038),A\r\n\tld a,(datos_int+1)\t;guardo el salto original\r\n\tld ($0039),A\r\n\tld a,(datos_int+2)\t;guardo el salto original\r\n\tld ($003a),A\t\t\r\n\t\r\n\tEI\r\n\tret\r\n\t\r\n\t\r\n\t\r\n\r\n\r\n                \r\n\r\n\r\n;___________________________________________________________\r\n\r\n             ;   DEFB     \"PSG PROPLAYER BY WYZ'10\"\r\n\r\n;___________________________________________________________\r\n\r\n\t\r\n;___________________________________________________________\r\n\r\n.INICIO\r\n\r\n\r\n\t;primero mira si toca tocar :P\r\n\tpush af\r\n\tLD A,(contador)\r\n\tDEC A\r\n\tLD (contador),A\r\n\tcp 0\r\n\tJP NZ,termina_int\r\n\t.dir_tempo\t\r\n\tLD A,6\r\n \tLD (contador),A\r\n \t\r\n \tPUSH BC\r\n\tPUSH HL\r\n\tPUSH DE\r\n\tPUSH IX\r\n\tPUSH IY\t\r\n \t\r\n\t\tCALL    ROUT\r\n\t\tLD\tHL,PSG_REG\r\n\t\tLD\tDE,PSG_REG_SEC\r\n\t\tLD\tBC,14\r\n\t\tLDIR\t\t\t\t\r\n        CALL    PLAY\t        \r\n\t\tCALL    REPRODUCE_SONIDO         \r\n                \r\n                \r\n\t\tCALL\tREPRODUCE_EFECTO_A\r\n\t\tCALL\tREPRODUCE_EFECTO_B\r\n\t\tCALL\tREPRODUCE_EFECTO_C                \r\n                \r\n\tPOP IY\r\n\tPOP IX\r\n\tPOP DE\r\n\tPOP HL\r\n\tPOP BC\t\r\n\r\n\t.termina_int\t\t\r\n\t\tpop af\t\r\n\t\tei\r\n.salto_int\r\ndefb 0,0,0\r\n \r\n \t\r\n\r\n.contador defb 0\r\n.datos_int defb 0,0,0\t\t; Se guardan 3 BYTES!!!! (Dedicado a Na_th_an, por los desvelos)\r\n\r\n\r\n\r\n;INICIA EL SONIDO N (A)\r\n\r\n;INICIA EL SONIDO N (A)\r\n\r\n.INICIA_EFECTO_WYZ0\r\n\r\n;INICIA EL SONIDO N (B) EN EL CANAL (C)\r\n\t\tLD\tA,C\r\n\t\tCP\t0\r\n\t\tJP\tZ,INICIA_EFECTO_A\r\n\t\tCP\t1\r\n\t\tJP\tZ,INICIA_EFECTO_B\r\n\t\tCP\t2\r\n\t\tJP\tZ,INICIA_EFECTO_C\r\n\t\tJP INICIA_EFECTO_A\r\n\t\tRET\r\n\t\t\r\n\r\n;REPRODUCE EFECTOS\r\n\r\n\r\n\t\t\t\r\n\r\n;REPRODUCE EFECTOS CANAL A\r\n\r\n\r\n.REPRODUCE_EFECTO_A\r\n                LD      HL,INTERR   \r\n                BIT     3,(HL)          ;ESTA ACTIVADO EL EFECTO?\r\n                RET     Z\r\n                LD      HL,(PUNTERO_EFECTO_A)\r\n                LD      A,(HL)\r\n                CP      $FF\r\n                JR      Z,FIN_EFECTO_A\r\n                CALL \tBLOQUE_COMUN\r\n                LD      (PUNTERO_EFECTO_A),HL\r\n                LD      (IX+0),B                \r\n                LD      (IX+1),C\r\n                LD      (IX+8),A\r\n                RET\r\n.FIN_EFECTO_A\r\n   \t\t\t\tLD      HL,INTERR\r\n                RES     3,(HL)\r\n                XOR     A       \r\n                LD      (PSG_REG+0),A\r\n                LD      (PSG_REG+1),A\r\n                LD\t\t(PSG_REG+8),A\r\n                RET    \r\n                \r\n.REPRODUCE_EFECTO_B\r\n                LD      HL,INTERR   \r\n                BIT     5,(HL)          ;ESTA ACTIVADO EL EFECTO?\r\n                RET     Z\r\n                LD      HL,(PUNTERO_EFECTO_B)\r\n                LD      A,(HL)\r\n                CP      $FF\r\n                JR      Z,FIN_EFECTO_B\r\n                CALL \tBLOQUE_COMUN\r\n                LD      (PUNTERO_EFECTO_B),HL\r\n                LD      (IX+2),B                \r\n                LD      (IX+3),C\r\n                LD      (IX+9),A\r\n                RET\r\n.FIN_EFECTO_B\r\n   \t\t\t\tLD      HL,INTERR\r\n                RES     5,(HL)\r\n                XOR     A       \r\n                LD      (PSG_REG+2),A\r\n                LD      (PSG_REG+3),A\r\n                LD\t\t(PSG_REG+9),A\r\n                RET                 \r\n                \r\n.REPRODUCE_EFECTO_C\r\n                LD      HL,INTERR   \r\n                BIT     6,(HL)          ;ESTA ACTIVADO EL EFECTO?\r\n                RET     Z\r\n                LD      HL,(PUNTERO_EFECTO_C)\r\n                LD      A,(HL)\r\n                CP      $FF\r\n                JR      Z,FIN_EFECTO_C\r\n                CALL \tBLOQUE_COMUN\r\n                LD      (PUNTERO_EFECTO_C),HL\r\n                LD      (IX+4),B                \r\n                LD      (IX+5),C\r\n                LD      (IX+10),A\r\n                RET\r\n.FIN_EFECTO_C\r\n   \t\t\t\tLD      HL,INTERR\r\n                RES     6,(HL)\r\n                XOR     A       \r\n                LD      (PSG_REG+4),A\r\n                LD      (PSG_REG+5),A\r\n                LD\t\t(PSG_REG+10),A\r\n                RET \r\n                                \r\n.BLOQUE_COMUN                \r\n\t\t\t\tLD IX,PSG_REG\r\n                LD B,A\r\n                INC     HL\r\n                LD      A,(HL)\r\n                RRCA\r\n                RRCA\r\n                RRCA\r\n                RRCA\r\n                AND     @00001111\r\n                LD C,A\r\n                LD      A,(HL)\r\n                AND     @00001111\r\n                INC     HL\r\n\t\t\t\tRET        \r\n                \r\n.INICIA_EFECTO_A\r\n\t\t\t\tLD\t\tA,B\r\n\t\t\t\tLD      HL,(TABLA_EFECTOS0)\r\n                CALL    EXT_WORD\r\n                LD      (PUNTERO_EFECTO_A),HL\r\n                LD      HL,INTERR\r\n                SET     3,(HL)\r\n                RET       \r\n                \r\n.INICIA_EFECTO_B\r\n\t\t\t\tLD\t\tA,B\r\n\t\t\t\tLD      HL,(TABLA_EFECTOS0)\r\n                CALL    EXT_WORD\r\n                LD      (PUNTERO_EFECTO_B),HL\r\n                LD      HL,INTERR\r\n                SET     5,(HL)\r\n                RET       \r\n               \r\n.INICIA_EFECTO_C \r\n\t\t\t\tLD\t\tA,B\r\n\t\t\t\tLD      HL,(TABLA_EFECTOS0)\r\n                CALL    EXT_WORD\r\n                LD      (PUNTERO_EFECTO_C),HL\r\n                LD      HL,INTERR\r\n                SET     6,(HL)\r\n                RET       \r\n               \r\n\t\r\n\r\n.INICIA_SONIDO\r\n\t\t\t\tLD       HL,(TABLA_SONIDOS0)\r\n                CALL    EXT_WORD\r\n                LD      (PUNTERO_SONIDO),HL\r\n                LD      HL,INTERR\r\n                SET     2,(HL)\r\n                RET\r\n;PLAYER OFF\r\n\r\n.PLAYER_OFF\r\n\t\tLD\tHL,INTERR\r\n\t\tRES\t1,(HL)\r\n\t\t\r\n\t\tXOR\tA\r\n\t\tLD\tHL,PSG_REG\r\n\t\tLD\tDE,PSG_REG+1\r\n\t\tLD\tBC,14\r\n\t\tLD\t(HL),A\r\n\t\tLDIR\r\n\r\n\t\tLD\tHL,PSG_REG_SEC\r\n\t\tLD\tDE,PSG_REG_SEC+1\r\n\t\tLD\tBC,14\r\n\t\tLD\t(HL),A\r\n\t\tLDIR\r\n\t\t\r\n\t\tCALL\tROUT\r\n\t\tCALL\tFIN_SONIDO\r\n\t\tRET\r\n\r\n\r\n\t\t\r\n\t\t\r\n.CARGA_CANCION_WYZ0\t\t\r\n        DI\r\n\t\tCALL\tPLAYER_OFF\r\n; MUSICA DATOS INICIALES\r\n\r\n\r\n \t\t\t\t\r\n \t\t\t\t\r\n\t\t\t\tLD\t\tDE,$0010\t\t\t\t\t;  N BYTES RESERVADOS POR CANAL\r\n                LD      HL,BUFFER_DEC       \t;* RESERVAR MEMORIA PARA BUFFER DE SONIDO!!!!!\r\n                LD      (CANAL_A),HL\r\n                \r\n                ADD     HL,DE       \t\r\n                LD      (CANAL_B),HL       \t\r\n\r\n                ADD     HL,DE       \t\r\n                LD      (CANAL_C),HL \r\n\r\n                ADD     HL,DE       \t\r\n                LD      (CANAL_P),HL \r\n\r\n                LD      A,0             \t;* CANCION N 0\r\n                CALL    CARGA_CANCION\r\n                \r\n               \tLD A,6\r\n \t\t\t\tLD (contador),A\r\n \t\t\t\t                \r\n;PANTALLA\r\n\t\tEI\r\n\t\tret\t\t\r\n\t\t\r\n\t\t\t\t\r\n\r\n;CARGA UNA CANCION\r\n;IN:(A)=N DE CANCION\r\n\r\n.CARGA_CANCION\r\n\t\t\t\tLD      HL,INTERR       ;CARGA CANCION\r\n\t\t\r\n                SET     1,(HL)          ;REPRODUCE CANCION\r\n                LD      HL,SONG\r\n                LD      (HL),A          ;N A\r\n\r\n                \r\n\r\n;DECODIFICAR\r\n;IN-> INTERR 0 ON\r\n;     SONG\r\n\r\n;CARGA CANCION SI/NO\r\n\r\n.DECODE_SONG\r\n\t\t\t    LD      A,(SONG)\r\n\r\n;LEE CABECERA DE LA CANCION\r\n;BYTE 0=TEMPO\r\n\r\n                ;LD      HL,TABLA_SONG\r\n                LD      HL,(TABLA_SONG0)                \r\n                CALL    EXT_WORD\r\n                LD      A,(HL)\r\n                LD      (TEMPO),A\r\n\t\tXOR\tA\r\n\t\tLD\t(TTEMPO),A\r\n                \r\n;HEADER BYTE 1\r\n;(-|-|-|-|-|-|-|LOOP)\r\n\r\n                INC\tHL\t\t;LOOP 1=ON/0=OFF?\r\n                LD\tA,(HL)\r\n                BIT\t0,A\r\n                JR\tZ,NPTJP0\r\n                PUSH\tHL\r\n                LD\tHL,INTERR\r\n                SET\t4,(HL)\r\n                POP\tHL\r\n             \r\n                \r\n.NPTJP0\r\n\t\t        INC\tHL\t\t;2 BYTES RESERVADOS\r\n                INC\tHL\r\n                INC\tHL\r\n\r\n;BUSCA Y GUARDA INICIO DE LOS CANALES EN EL MODULO MUS\r\n\r\n\t\t\r\n\t\tLD\t(PUNTERO_P_DECA),HL\r\n\t\tLD\tE,$3F\t\t\t;CODIGO INTRUMENTO 0\r\n\t\tLD\tB,$FF\t\t\t;EL MODULO DEBE TENER UNA LONGITUD MENOR DE $FF00 ... o_O!\r\n.BGICMODBC1\r\n\t\tXOR\tA\t\t\t;BUSCA EL BYTE 0\r\n\t\tCPIR\r\n\t\tDEC\tHL\r\n\t\tDEC\tHL\r\n\t\tLD\tA,E\t\t\t;ES EL INSTRUMENTO 0??\r\n\t\tCP\t(HL)\r\n\t\tINC\tHL\r\n\t\tINC\tHL\r\n\t\tJR\tZ,BGICMODBC1\r\n\r\n\t\tLD\t(PUNTERO_P_DECB),HL\r\n\r\n.BGICMODBC2\r\n\t\tXOR\tA\t\t\t;BUSCA EL BYTE 0\r\n\t\tCPIR\r\n\t\tDEC\tHL\r\n\t\tDEC\tHL\r\n\t\tLD\tA,E\r\n\t\tCP\t(HL)\t\t\t;ES EL INSTRUMENTO 0??\r\n\t\tINC\tHL\r\n\t\tINC\tHL\r\n\t\tJR\tZ,BGICMODBC2\r\n\r\n\t\tLD\t(PUNTERO_P_DECC),HL\r\n\t\t\r\n.BGICMODBC3\r\n\t\tXOR\tA\t\t\t;BUSCA EL BYTE 0\r\n\t\tCPIR\r\n\t\tDEC\tHL\r\n\t\tDEC\tHL\r\n\t\tLD\tA,E\r\n\t\tCP\t(HL)\t\t\t;ES EL INSTRUMENTO 0??\r\n\t\tINC\tHL\r\n\t\tINC\tHL\r\n\t\tJR\tZ,BGICMODBC3\r\n\t\tLD\t(PUNTERO_P_DECP),HL\r\n\t\t\r\n                \r\n;LEE DATOS DE LAS NOTAS\r\n;(|)(|||||) LONGITUD\\NOTA\r\n\r\n.INIT_DECODER\r\n\t\t\t    LD      DE,(CANAL_A)\r\n                LD      (PUNTERO_A),DE\r\n                LD\tHL,(PUNTERO_P_DECA)\r\n                CALL    DECODE_CANAL    ;CANAL A\r\n                LD\t(PUNTERO_DECA),HL\r\n                \r\n                LD      DE,(CANAL_B)\r\n                LD      (PUNTERO_B),DE\r\n                LD\tHL,(PUNTERO_P_DECB)\r\n                CALL    DECODE_CANAL    ;CANAL B\r\n                LD\t(PUNTERO_DECB),HL\r\n                \r\n                LD      DE,(CANAL_C)\r\n                LD      (PUNTERO_C),DE\r\n                LD\tHL,(PUNTERO_P_DECC)\r\n                CALL    DECODE_CANAL    ;CANAL C\r\n                LD\t(PUNTERO_DECC),HL\r\n                \r\n                LD      DE,(CANAL_P)\r\n                LD      (PUNTERO_P),DE\r\n                LD\tHL,(PUNTERO_P_DECP)\r\n                CALL    DECODE_CANAL    ;CANAL P\r\n                LD\t(PUNTERO_DECP),HL\r\n               \r\n                RET\r\n\r\n\r\n;DECODIFICA NOTAS DE UN CANAL\r\n;IN (DE)=DIRECCION DESTINO\r\n;NOTA=0 FIN CANAL\r\n;NOTA=1 SILENCIO\r\n;NOTA=2 PUNTILLO\r\n;NOTA=3 COMANDO I\r\n\r\n.DECODE_CANAL\r\n\t\t\t    LD      A,(HL)\r\n                AND     A               ;FIN DEL CANAL?\r\n                JR      Z,FIN_DEC_CANAL\r\n                CALL    GETLEN\r\n\r\n                CP      @00000001       ;ES SILENCIO?\r\n                JR      NZ,NO_SILENCIO\r\n                SET     6,A\r\n                JR      NO_MODIFICA\r\n                \r\n.NO_SILENCIO\r\n\t\t\t    CP      @00111110        ;ES PUNTILLO?\r\n                JR      NZ,NO_PUNTILLO\r\n                OR      A\r\n                RRC     B\r\n                XOR     A\r\n                JR      NO_MODIFICA\r\n\r\n.NO_PUNTILLO\r\n\t\t\t    CP      @00111111        ;ES COMANDO?\r\n                JR      NZ,NO_MODIFICA\r\n                BIT     0,B             ;COMADO=INSTRUMENTO?\r\n                JR      Z,NO_INSTRUMENTO   \r\n                LD      A,@11000001      ;CODIGO DE INSTRUMENTO      \r\n                LD      (DE),A\r\n                INC     HL\r\n                INC     DE\r\n                LD      A,(HL)          ;N DE INSTRUMENTO\r\n                LD      (DE),A\r\n                INC     DE\r\n                INC\tHL\r\n                JR      DECODE_CANAL\r\n                \r\n.NO_INSTRUMENTO\r\n\t\t\t\tBIT     2,B\r\n                JR      Z,NO_ENVOLVENTE\r\n                LD      A,@11000100      ;CODIGO ENVOLVENTE\r\n                LD      (DE),A\r\n                INC     DE\r\n                INC\tHL\r\n                JR      DECODE_CANAL\r\n     \r\n.NO_ENVOLVENTE\r\n\t\t\t\tBIT     1,B\r\n                JR      Z,NO_MODIFICA           \r\n                LD      A,@11000010      ;CODIGO EFECTO\r\n                LD      (DE),A                  \r\n                INC     HL                      \r\n                INC     DE                      \r\n                LD      A,(HL)                  \r\n                CALL    GETLEN   \r\n                \r\n.NO_MODIFICA\r\n\t\t\t    LD      (DE),A\r\n                INC     DE\r\n                XOR     A\r\n                DJNZ    NO_MODIFICA\r\n\t\tSET     7,A\r\n\t\tSET \t0,A\r\n                LD      (DE),A\r\n                INC     DE\r\n                INC\tHL\r\n                RET\t\t\t;** JR      DECODE_CANAL\r\n\r\n.FIN_DEC_CANAL\r\n\t\t\t\tSET     7,A\r\n                LD      (DE),A\r\n                INC     DE\r\n                RET\r\n\r\n.GETLEN\r\n\t\t         LD      B,A\r\n                AND     @00111111\r\n                PUSH    AF\r\n                LD      A,B\r\n                AND     @11000000 \r\n                RLCA\r\n                RLCA\r\n                INC     A\r\n                LD      B,A\r\n                LD      A,@10000000 \r\n.DCBC0\r\n\t          RLCA\r\n                DJNZ    DCBC0\r\n                LD      B,A\r\n                POP     AF\r\n                RET\r\n                \r\n          \r\n                \r\n\r\n        \r\n                \r\n;PLAY __________________________________________________\r\n\r\n\r\n.PLAY\r\n\t          \tLD      HL,INTERR       ;PLAY BIT 1 ON?\r\n                BIT     1,(HL)\r\n                RET     Z\r\n;TEMPO          \r\n                LD      HL,TTEMPO       ;CONTADOR TEMPO\r\n                INC     (HL)\r\n                LD      A,(TEMPO)\r\n                CP      (HL)\r\n                JR      NZ,PAUTAS\r\n                LD      (HL),0\r\n                \r\n;INTERPRETA      \r\n                LD      IY,PSG_REG\r\n                LD      IX,PUNTERO_A\r\n                LD      BC,PSG_REG+8\r\n                CALL    LOCALIZA_NOTA\r\n                LD      IY,PSG_REG+2\r\n                LD      IX,PUNTERO_B\r\n                LD      BC,PSG_REG+9\r\n                CALL    LOCALIZA_NOTA\r\n                LD      IY,PSG_REG+4\r\n                LD      IX,PUNTERO_C\r\n                LD      BC,PSG_REG+10\r\n                CALL    LOCALIZA_NOTA\r\n                LD      IX,PUNTERO_P    ;EL CANAL DE EFECTOS ENMASCARA OTRO CANAL\r\n                CALL    LOCALIZA_EFECTO              \r\n\r\n;PAUTAS \r\n                \r\n.PAUTAS\r\n\t\t        LD      IY,PSG_REG+0\r\n                LD      IX,PUNTERO_P_A\r\n                LD      HL,PSG_REG+8\r\n                CALL    PAUTA           ;PAUTA CANAL A\r\n                LD      IY,PSG_REG+2\r\n                LD      IX,PUNTERO_P_B\r\n                LD      HL,PSG_REG+9\r\n                CALL    PAUTA           ;PAUTA CANAL B\r\n                LD      IY,PSG_REG+4\r\n                LD      IX,PUNTERO_P_C\r\n                LD      HL,PSG_REG+10\r\n                CALL    PAUTA           ;PAUTA CANAL C                \r\n\r\n                RET\r\n                \r\n\r\n\r\n;REPRODUCE EFECTOS DE SONIDO \r\n\r\n.REPRODUCE_SONIDO\r\n\r\n\t\t\t\tLD      HL,INTERR   \r\n                BIT     2,(HL)          ;ESTA ACTIVADO EL EFECTO?\r\n                RET     Z\r\n                LD      HL,(PUNTERO_SONIDO)\r\n                LD      A,(HL)\r\n                CP      $FF\r\n                JR      Z,FIN_SONIDO\r\n                LD      (PSG_REG_SEC+0),A\r\n                INC     HL\r\n                LD      A,(HL)\r\n                RRCA\r\n                RRCA\r\n                RRCA\r\n                RRCA\r\n                AND     @00001111 \r\n                LD      (PSG_REG_SEC+1),A\r\n                LD      A,(HL)\r\n                AND     @00001111 \r\n                LD      (PSG_REG_SEC+8),A\r\n                INC     HL\r\n                LD      A,(HL)\r\n                AND     A\r\n                JR      Z,NO_RUIDO\r\n                LD      (PSG_REG_SEC+6),A\r\n                LD      A,@10110000 \r\n                JR      SI_RUIDO\r\n.NO_RUIDO\r\n\t\t        LD      A,@10111000 \r\n.SI_RUIDO\r\n\t\t        LD      (PSG_REG_SEC+7),A\r\n       \r\n                INC     HL\r\n                LD      (PUNTERO_SONIDO),HL\r\n                RET\r\n.FIN_SONIDO\r\n\t\t\t    LD      HL,INTERR\r\n                RES     2,(HL)\r\n\r\n.FIN_NOPLAYER\r\n\t\t\t\tLD      A,@10111000 \t\t;2 BITS ALTOS PARA MSX / AFECTA AL CPC???\r\n       \t\t\tLD      (PSG_REG+7),A\r\n                RET         \r\n                \r\n;VUELCA BUFFER DE SONIDO AL PSG\r\n\r\n;VUELCA BUFFER DE SONIDO AL PSG\r\n\r\n.ROUT\r\n       \tXOR \tA\r\n\t\tLD \tHL,PSG_REG_SEC\r\n.LOUT\r\n\t\tCALL \tWRITEPSGHL\r\n\t\tINC \tA\r\n\t\tCP \t13\r\n\t\tJR \tNZ,LOUT\r\n\t\tLD\tA,(HL)\r\n\t\tAND \tA\r\n\t\tRET \tZ\r\n\t\tLD\tA,13\r\n\t\tCALL \tWRITEPSGHL\r\n\t\tXOR\tA\r\n\t\tLD      (PSG_REG+13),A\r\n\t\tLD      (PSG_REG_SEC+13),A\r\n\t\tRET\r\n\r\n;; A = REGISTER\r\n;; (HL) = VALUE\r\n.WRITEPSGHL\r\n\t\tLD \tB,$F4              \r\n\t\tOUT \t(C),A              \r\n\t\tLD \tBC,$F6C0           \r\n\t\tOUT \t(C),C              \r\n\t\tDEFB \t$ED                \r\n\t\tDEFB \t$71                \r\n\t\tLD \tB,$F5              \r\n\t\tOUTI                       \r\n\t\tLD \tBC,$F680           \r\n\t\tOUT \t(C),C              \r\n\t\tDEFB \t$ED                \r\n\t\tDEFB \t$71                \r\n\t\tRET\r\n\r\n;LOCALIZA NOTA CANAL A\r\n;IN (PUNTERO_A)\r\n\r\n.LOCALIZA_NOTA\r\n\t\t\t    LD      L,(IX+0)       \t\t;HL=(PUNTERO_A_C_B)\r\n                LD      H,(IX+1)\r\n                LD      A,(HL)\r\n                AND     @11000000       \t\t;COMANDO?\r\n                CP      @11000000 \r\n                JR      NZ,LNJP0\r\n\r\n;BIT(0)=INSTRUMENTO\r\n                \r\n.COMANDOS\r\n\t\t        LD      A,(HL)\r\n                BIT     0,A             \t;INSTRUMENTO\r\n                JR      Z,COM_EFECTO\r\n\r\n                INC     HL\r\n                LD      A,(HL)          \t;N DE PAUTA\r\n                INC     HL\r\n                LD      (IX+00),L\r\n                LD      (IX+01),H\r\n                ;LD      HL,TABLA_PAUTAS\r\n                LD      HL,(TABLA_PAUTAS0)\r\n                CALL    EXT_WORD\r\n                LD      (IX+18),L\r\n                LD      (IX+19),H\r\n                LD      (IX+12),L\r\n                LD      (IX+13),H\r\n                LD      L,C\r\n                LD      H,B\r\n                RES     4,(HL)        \t\t;APAGA EFECTO ENVOLVENTE\r\n                XOR     A\r\n                LD      (PSG_REG_SEC+13),A\r\n                LD\t(PSG_REG+13),A\r\n                JR      LOCALIZA_NOTA\r\n\r\n.COM_EFECTO\r\n\t\t\t    BIT     1,A             \t;EFECTO DE SONIDO\r\n                JR      Z,COM_ENVOLVENTE\r\n\r\n                INC     HL\r\n                LD      A,(HL)\r\n                INC     HL\r\n                LD      (IX+00),L\r\n                LD      (IX+01),H\r\n                CALL    INICIA_SONIDO\r\n                RET\r\n\r\n.COM_ENVOLVENTE\r\n\t\t\t\tBIT     2,A\r\n                RET     Z               \t;IGNORA - ERROR            \r\n           \r\n                INC     HL\r\n                LD      (IX+00),L\r\n                LD      (IX+01),H\r\n                LD      L,C\r\n                LD      H,B\r\n                LD\t(HL),@00010000           ;ENCIENDE EFECTO ENVOLVENTE\r\n                JR      LOCALIZA_NOTA\r\n                \r\n              \r\n.LNJP0\r\n\t\t\t    LD      A,(HL)\r\n                INC     HL\r\n                BIT     7,A\r\n                JR      Z,NO_FIN_CANAL_A\t;\r\n                BIT\t0,A\r\n                JR\tZ,FIN_CANAL_A\r\n\r\n.FIN_NOTA_A\r\n\t\tLD      E,(IX+6)\r\n\t\tLD\tD,(IX+7)\t;PUNTERO BUFFER AL INICIO\r\n\t\tLD\t(IX+0),E\r\n\t\tLD\t(IX+1),D\r\n\t\tLD\tL,(IX+30)\t;CARGA PUNTERO DECODER\r\n\t\tLD\tH,(IX+31)\r\n\t\tPUSH\tBC\r\n                CALL    DECODE_CANAL    ;DECODIFICA CANAL\r\n                POP\tBC\r\n                LD\t(IX+30),L\t;GUARDA PUNTERO DECODER\r\n                LD\t(IX+31),H\r\n                JP      LOCALIZA_NOTA\r\n                \r\n.FIN_CANAL_A\r\n\t\t\t    LD\tHL,INTERR\t;LOOP?\r\n                BIT\t4,(HL)              \r\n                JR      NZ,FCA_CONT\r\n                CALL\tPLAYER_OFF\r\n                RET\r\n\r\n.FCA_CONT\r\n\t\tLD\tL,(IX+24)\t;CARGA PUNTERO INICIAL DECODER\r\n\t\tLD\tH,(IX+25)\r\n\t\tLD\t(IX+30),L\r\n\t\tLD\t(IX+31),H\r\n\t\tJR      FIN_NOTA_A\r\n                \r\n.NO_FIN_CANAL_A\r\n\t\t\t\tLD      (IX+0),L        ;(PUNTERO_A_B_C)=HL GUARDA PUNTERO\r\n                LD      (IX+1),H\r\n                AND     A               ;NO REPRODUCE NOTA SI NOTA=0\r\n                JR      Z,FIN_RUTINA\r\n                BIT     6,A             ;SILENCIO?\r\n                JR      Z,NO_SILENCIO_A\r\n                LD\tA,(BC)\r\n                AND\t@00010000 \r\n                JR\tNZ,SILENCIO_ENVOLVENTE\r\n                XOR     A\r\n                LD\t(BC),A\t\t;RESET VOLUMEN\r\n                LD\t(IY+0),A\r\n                LD\t(IY+1),A\r\n\t\t\t\tRET\r\n\t\t\r\n.SILENCIO_ENVOLVENTE\r\n\t\t\t\tLD\tA,$FF\r\n                LD\t(PSG_REG+11),A\r\n                LD\t(PSG_REG+12),A               \r\n                XOR\tA\r\n                LD\t(PSG_REG+13),A                               \r\n                LD\t(IY+0),A\r\n                LD\t(IY+1),A\r\n                RET\r\n\r\n.NO_SILENCIO_A\r\n\t\t\t\tCALL    NOTA            ;REPRODUCE NOTA\r\n                LD      L,(IX+18)       ;HL=(PUNTERO_P_A0) RESETEA PAUTA \r\n                LD      H,(IX+19)\r\n                LD      (IX+12),L       ;(PUNTERO_P_A)=HL\r\n                LD      (IX+13),H\r\n.FIN_RUTINA\r\n\t\t\t    RET\r\n\r\n\r\n;LOCALIZA EFECTO\r\n;IN HL=(PUNTERO_P)\r\n\r\n.LOCALIZA_EFECTO\r\n\t\t\t\tLD      L,(IX+0)       ;HL=(PUNTERO_P)\r\n                LD      H,(IX+1)\r\n                LD      A,(HL)\r\n                CP      @11000010 \r\n                JR      NZ,LEJP0\r\n\r\n                INC     HL\r\n                LD      A,(HL)\r\n                INC     HL\r\n                LD      (IX+00),L\r\n                LD      (IX+01),H\r\n                CALL    INICIA_SONIDO\r\n                RET\r\n            \r\n              \r\n.LEJP0\r\n\t            INC     HL\r\n                BIT     7,A\r\n                JR      Z,NO_FIN_CANAL_P\t;\r\n                BIT\t0,A\r\n                JR\tZ,FIN_CANAL_P\r\n.FIN_NOTA_P\r\n\t\tLD      DE,(CANAL_P)\r\n\t\tLD\t(IX+0),E\r\n\t\tLD\t(IX+1),D\r\n\t\tLD\tHL,(PUNTERO_DECP)\t;CARGA PUNTERO DECODER\r\n\t\tPUSH\tBC\r\n\t\tCALL    DECODE_CANAL    \t;DECODIFICA CANAL\r\n\t\tPOP\tBC\r\n                LD\t(PUNTERO_DECP),HL\t;GUARDA PUNTERO DECODER\r\n                JP      LOCALIZA_EFECTO\r\n                \r\n.FIN_CANAL_P\r\n\t\tLD\tHL,(PUNTERO_P_DECP)\t;CARGA PUNTERO INICIAL DECODER\r\n\t\tLD\t(PUNTERO_DECP),HL\r\n\t\tJR      FIN_NOTA_P\r\n                \r\n.NO_FIN_CANAL_P\r\n\t\t\t\tLD      (IX+0),L        ;(PUNTERO_A_B_C)=HL GUARDA PUNTERO\r\n                LD      (IX+1),H\r\n                RET\r\n                \r\n; PAUTA DE LOS 3 CANALES\r\n; IN:(IX):PUNTERO DE LA PAUTA\r\n;    (HL):REGISTRO DE VOLUMEN\r\n;    (IY):REGISTROS DE FRECUENCIA\r\n\r\n; FORMATO PAUTA\t\r\n;\t    7    6     5     4   3-0                     3-0  \r\n; BYTE 1 (LOOP|OCT-1|OCT+1|SLIDE|VOL) - BYTE 2 ( | | | |PITCH)\r\n\r\n.PAUTA\r\n\t\t        BIT     4,(HL)        ;SI LA ENVOLVENTE ESTA ACTIVADA NO ACTUA PAUTA\r\n                RET     NZ\r\n\r\n\t\tLD\tA,(IY+0)\r\n\t\tLD\tB,(IY+1)\r\n\t\tOR\tB\r\n\t\tRET\tZ\r\n\r\n\r\n                PUSH\tHL\r\n                ;LD      L,(IX+0)\r\n                ;LD      H,(IX+1)\r\n                \t\t\r\n                ;LD\tA,(HL)\t\t;COMPRUEBA SLIDE BIT 4\r\n\t\t;BIT\t4,A\r\n\t\t;JR\tZ,PCAJP4\r\n\t\t;LD\tL,(IY+0)\t;FRECUENCIA FINAL\r\n\t\t;LD\tH,(IY+1)\r\n\t\t;SBC\tHL,DE\r\n\t\t;JR\tZ,PCAJP4\r\n\t\t;JR\tC,SLIDE_POS\r\n\t\t;EX\tDE,HL\r\n\t\t;RRC\tD\t\t;/4\r\n\t\t;RR\tE\r\n\t\t;RRC\tD\r\n\t\t;RR\tE\r\n\r\n\r\n\t\t;ADC\tHL,DE\r\n\t\t;LD\t(IY+0),L\r\n\t\t;LD\t(IY+1),H\r\n.SLIDE_POS\t\t\r\n\t\t;POP\tHL\r\n\t\t;RET\r\n                \r\n.PCAJP4\r\n\t\t        LD      L,(IX+0)\r\n                LD      H,(IX+1)         \r\n\t\tLD\tA,(HL)\r\n\t\t\r\n\t\tBIT     7,A\t\t;LOOP / EL RESTO DE BITS NO AFECTAN\r\n                JR      Z,PCAJP0\r\n                AND     @00011111        ;LOOP PAUTA (0,32)X2!!!-> PARA ORNAMENTOS\r\n                RLCA\t\t\t;X2\r\n                LD      D,0\r\n                LD      E,A\r\n                SBC     HL,DE\r\n                LD      A,(HL)\r\n\r\n.PCAJP0\r\n\t\tBIT\t6,A\t\t;OCTAVA -1\r\n\t\tJR\tZ,PCAJP1\r\n\t\tLD\tE,(IY+0)\r\n\t\tLD\tD,(IY+1)\r\n\r\n\t\tAND\tA\r\n\t\tRRC\tD\r\n\t\tRR\tE\r\n\t\tLD\t(IY+0),E\r\n\t\tLD\t(IY+1),D\r\n\t\tJR\tPCAJP2\r\n\t\t\r\n.PCAJP1\r\n\t\tBIT\t5,A\t\t;OCTAVA +1\r\n\t\tJR\tZ,PCAJP2\r\n\t\tLD\tE,(IY+0)\r\n\t\tLD\tD,(IY+1)\r\n\r\n\t\tAND\tA\r\n\t\tRLC\tE\r\n\t\tRL\tD\r\n\t\tLD\t(IY+0),E\r\n\t\tLD\t(IY+1),D\t\t\r\n\r\n\r\n.PCAJP2\r\n\t\tINC     HL\r\n\t\tPUSH\tHL\r\n\t\tLD\tE,A\r\n\t\tLD\tA,(HL)\t\t;PITCH DE FRECUENCIA\r\n\t\tLD\tL,A\r\n\t\tAND\tA\r\n\t\tLD\tA,E\r\n\t\tJR\tZ,ORNMJP1\r\n\r\n                LD\tA,(IY+0)\t;SI LA FRECUENCIA ES 0 NO HAY PITCH\r\n                ADD\tA,(IY+1)\r\n                AND\tA\r\n                LD\tA,E\r\n                JR\tZ,ORNMJP1\r\n                \r\n\r\n\t\tBIT\t7,L\r\n\t\tJR\tZ,ORNNEG\r\n\t\tLD\tH,$FF\r\n\t\tJR\tPCAJP3\r\n.ORNNEG\r\n\t\tLD\tH,0\r\n\t\t\r\n.PCAJP3\r\n\t\tLD\tE,(IY+0)\r\n\t\tLD\tD,(IY+1)\r\n\t\tADC\tHL,DE\r\n\t\tLD\t(IY+0),L\r\n\t\tLD\t(IY+1),H\r\n.ORNMJP1\r\n\t\tPOP\tHL\r\n\t\t\r\n\t\tINC\tHL\r\n                LD      (IX+0),L\r\n                LD      (IX+1),H\r\n.PCAJP5\r\n         POP\tHL\r\n                AND\t@00001111 \t;VOLUMEN FINAL\r\n                LD      (HL),A\r\n                RET\r\n\r\n\r\n\r\n;NOTA : REPRODUCE UNA NOTA\r\n;IN (A)=CODIGO DE LA NOTA\r\n;   (IY)=REGISTROS DE FRECUENCIA\r\n\r\n\r\n.NOTA\r\n           ;ADD\t6\t\t;*************************\r\n\t\tLD      L,C\r\n                LD      H,B\r\n                BIT     4,(HL)\r\n                LD      B,A\r\n                JR\tNZ,EVOLVENTES\r\n                LD\tA,B\r\n                LD      HL,DATOS_NOTAS\r\n                RLCA                    ;X2\r\n                LD      D,0\r\n                LD      E,A\r\n                ADD     HL,DE\r\n                LD      A,(HL)\r\n                LD      (IY+0),A\r\n                INC     HL\r\n                LD      A,(HL)\r\n                LD      (IY+1),A\r\n                RET\r\n\r\n;IN (A)=CODIGO DE LA ENVOLVENTE\r\n;   (IY)=REGISTRO DE FRECUENCIA\r\n\r\n.EVOLVENTES     \r\n\t\tPUSH\tAF\r\n\t\tCALL\tENV_RUT1\r\n\t\tLD\tDE,$0000\r\n\t\tLD      (IY+0),E\r\n                LD      (IY+1),D\t\t\r\n\t\r\n\t\tPOP\tAF\t\r\n\t\tADD\tA,48\r\n\t\tCALL\tENV_RUT1\r\n\t\t\r\n\t\r\n\t\tLD\tA,E\r\n                LD      (PSG_REG+11),A\r\n                LD\tA,D\r\n                LD      (PSG_REG+12),A\r\n                LD      A,$0E\r\n                LD      (PSG_REG+13),A\r\n                RET\r\n\r\n;IN(A) NOTA\r\n.ENV_RUT1\r\n\tLD      HL,DATOS_NOTAS\r\n\t\tRLCA                    ;X2\r\n                LD      D,0\r\n                LD      E,A\r\n                ADD     HL,DE\r\n                LD\tE,(HL)\r\n\t\tINC\tHL\r\n\t\tLD\tD,(HL)\r\n                RET\r\n\r\n\r\n\r\n.EXT_WORD\r\n\t\t        LD      D,0\r\n                SLA     A               ;*2\r\n                LD      E,A\r\n                ADD     HL,DE\r\n                LD      E,(HL)\r\n                INC     HL\r\n                LD      D,(HL)\r\n                EX      DE,HL\r\n                RET\r\n\r\n;BANCO DE INSTRUMENTOS 2 BYTES POR INT.\r\n\r\n;(0)(RET 2 OFFSET)\r\n;(1)(+-PITCH)\r\n\r\n\r\n;BANCO DE INSTRUMENTOS 2 BYTES POR INT.\r\n\r\n;(0)(RET 2 OFFSET)\r\n;(1)(+-PITCH)\r\n\r\n;.TABLA_PAUTAS DEFW \tPAUTA_1,PAUTA_2,PAUTA_3,PAUTA_4,PAUTA_5,PAUTA_6,PAUTA_7;,PAUTA_8,PAUTA_9,PAUTA_10,PAUTA_11,PAUTA_12,PAUTA_13,PAUTA_14,PAUTA_15,PAUTA_16,PAUTA_17,PAUTA_18\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n;DATOS DE LOS EFECTOS DE SONIDO\r\n\r\n;EFECTOS DE SONIDO\r\n\r\n\r\n\r\n;.TABLA_SONIDOS  DEFW    SONIDO1,SONIDO2,SONIDO3,SONIDO4,SONIDO5;,SONIDO6,SONIDO7;,SONIDO8\r\n\r\n.TABLA_PAUTAS0 defw 0  \r\n\r\n.TABLA_SONIDOS0 defw 0\r\n                \r\n\r\n;DATOS MUSICA\r\n\r\n\r\n\r\n;TABLA_SONG:     DEFW    SONG_0;,SONG_1,SONG_2;,SONG_3          ;******** TABLA DE DIRECCIONES DE ARCHIVOS MUS\r\n\r\n;DATOS_NOTAS:    .INCBIN \"C:/EM/BRMSX/PLAYER/NOTAS.DAT\"        ;DATOS DE LAS NOTAS\r\n\r\n\r\n.DATOS_NOTAS\r\n    DEFW $0000,$0000\r\n;\t\t;DW $077C,$0708\r\n;\t\tDW $06B0,$0640,$05EC,$0594,$0544,$04F8,$04B0,$0470,$042C,$03FD\r\n;\t\tDW $03BE,$0384,$0358,$0320,$02F6,$02CA,$02A2,$027C,$0258,$0238,$0216,$01F8\r\n;\t\tDW $01DF,$01C2,$01AC,$0190,$017B,$0165,$0151,$013E,$012C,$011C,$010A,$00FC\r\n;\t\tDW $00EF,$00E1,$00D6,$00C8,$00BD,$00B2,$00A8,$009F,$0096,$008E,$0085,$007E\r\n;\t\tDW $0077,$0070,$006B,$0064,$005E,$0059,$0054,$004F,$004B,$0047,$0042,$003F\r\n;\t\tDW $003B,$0038,$0035,$0032,$002F,$002C,$002A,$0027,$0025,$0023,$0021,$001F\r\n;\t\tDW $001D,$001C,$001A,$0019,$0017,$0016,$0015,$0013,$0012,$0011,$0010,$000F\r\n\t\t\r\n\r\n;TABLA3:\t;dw $0CDA,$0C22,$0B73,$0ACF,$0A33,$09A1,$0917,$0894,$0819,$07A4,$0737,$06CF,\r\n;\t\tdw $066D,$0611,$05BA,$0567,$051A,$04D0,$048B,$044A,$040C,$03D2,$039B,$0367\r\n;\t\tdw $0337,$0308,$02DD,$02B4,$028D,$0268,$0246,$0225,$0206,$01E9,$01CE,$01B4\r\n;\t\tdw $019B,$0184,$016E,$015A,$0146,$0134,$0123,$0112,$0103,$00F5,$00E7,$00DA\r\n;\t\tdw $00CE,$00C2,$00B7,$00AD,$00A3,$009A,$0091,$0089,$0082,$007A,$0073,$006D\r\n;\t\tdw $0067,$0061,$005C,$0056,$0052,$004D,$0049,$0045,$0041,$003D,$003A,$0036\r\n;\t\tdw $0033,$0031,$002E,$002B,$0029,$0027,$0024,$0022,$0020,$001F,$001D,$001B\r\n;\t\tdw $001A,$0018,$0017,$0016,$0014,$0013,$0012,$0011,$0010,$000F,$000E,$000D\r\n\r\n\r\n\t\t;DW\t$688,$62A,$5D2,$57E,$52F,$4E5,$49E,$45C,\r\n\t\tDEFW\t$41D,$3E2,$3AA,$376,$344,$315,$2E9,$2BF,$297,$272,$24F,$22E,$20E,$1F1,$1D5,$1BB\r\n\t\tDEFW\t$1A2,$18A,$174,$15F,$14B,$139,$127,$117,$107,$F8,$EA,$DD\r\n\t\tDEFW\t$D1,$C5,$BA,$AF,$A5,$9C,$93,$8B,$83,$7C,$75,$6E\r\n\t\tDEFW\t$68,$62,$5D,$57,$52,$4E,$49,$45,$41,$3E,$3A,$37\r\n\t\tDEFW\t$34,$31,$2E,$2B,$29,$27,$24,$22,$20,$1F,$1D,$1B\r\n\t\tDEFW\t$1A,$18,$17,$15,$14,$13,$12,$11,$10,$F,$E,$D\r\n\r\n\r\n\r\n\r\n.SONG_0\r\n\t\t;INCBIN\t\"WYAZOW.MUS\"\r\n\r\n\r\n\r\n; VARIABLES__________________________\r\n\r\n\r\n.INTERR\r\n         DEFB    00               ;INTERRUPTORES 1=ON 0=OFF\r\n                                        ;BIT 0=CARGA CANCION ON/OFF\r\n                                        ;BIT 1=PLAYER ON/OFF\r\n                                        ;BIT 2=SONIDOS ON/OFF\r\n                                        ;BIT 3=EFECTOS ON/OFF\r\n\r\n;MUSICA **** EL ORDEN DE LAS VARIABLES ES FIJO ******\r\n\r\n.TABLA_SONG0 defw 0\r\n.TABLA_EFECTOS0 defw 0\r\n\r\nDefB      'P','S','G',' ','P','R','O','P','L','A','Y','E','R',' ','B','Y',' ','W','Y','Z','-','1','0'\r\n\r\n\r\n.SONG           DEFB    00               ;DBN DE CANCION\r\n.TEMPO          DEFB    00               ;DEFBTEMPO\r\n.TTEMPO         DEFB    00               ;DEFBCONTADOR TEMPO\r\n.PUNTERO_A      DEFW   00               ;DW PUNTERO DEL CANAL A\r\n.PUNTERO_B      DEFW   00               ;DW PUNTERO DEL CANAL B\r\n.PUNTERO_C      DEFW   00               ;DW PUNTERO DEL CANAL C\r\n\r\n.BUFFER_MUSICA\r\n.CANAL_A        DEFW   BUFFER_DEC       ;DW DIRECION DE INICIO DE LA MUSICA A\r\n.CANAL_B        DEFW   00               ;DW DIRECION DE INICIO DE LA MUSICA B\r\n.CANAL_C        DEFW   00               ;DW DIRECION DE INICIO DE LA MUSICA C\r\n\r\n.PUNTERO_P_A    DEFW   00               ;DW PUNTERO PAUTA CANAL A\r\n.PUNTERO_P_B    DEFW   00               ;DW PUNTERO PAUTA CANAL B\r\n.PUNTERO_P_C    DEFW   00               ;DW PUNTERO PAUTA CANAL C\r\n\r\n.PUNTERO_P_A0   DEFW   00               ;DW INI PUNTERO PAUTA CANAL A\r\n.PUNTERO_P_B0   DEFW   00               ;DW INI PUNTERO PAUTA CANAL B\r\n.PUNTERO_P_C0   DEFW   00               ;DW INI PUNTERO PAUTA CANAL C\r\n\r\n\r\n.PUNTERO_P_DECA\tDEFW   00\t\t;DW PUNTERO DE INICIO DEL DECODER CANAL A\r\n.PUNTERO_P_DECB\tDEFW   00\t\t;DW PUNTERO DE INICIO DEL DECODER CANAL B\r\n.PUNTERO_P_DECC\tDEFW   00\t\t;DW PUNTERO DE INICIO DEL DECODER CANAL C\r\n\r\n.PUNTERO_DECA\tDEFW   00\t\t;DW PUNTERO DECODER CANAL A\r\n.PUNTERO_DECB\tDEFW   00\t\t;DW PUNTERO DECODER CANAL B\r\n.PUNTERO_DECC\tDEFW   00\t\t;DW PUNTERO DECODER CANAL C       \r\n\r\n\r\n;CANAL DE EFECTOS - ENMASCARA OTRO CANAL\r\n\r\n.PUNTERO_P       DEFW   00           \t;DW PUNTERO DEL CANAL EFECTOS\r\n.CANAL_P         DEFW   00           \t;DW DIRECION DE INICIO DE LOS EFECTOS\r\n.PUNTERO_P_DECP \tDEFW   00\t\t;DW PUNTERO DE INICIO DEL DECODER CANAL P\r\n.PUNTERO_DECP \tDEFW   00\t\t;DW PUNTERO DECODER CANAL P\r\n\r\n.PSG_REG         DEFB     00,00,00,00,00,00,00,@10111000 ,00,00,00,00,00,00,00    ;DEFB(11) BUFFER DE REGISTROS DEL PSG\r\n.PSG_REG_SEC     DEFB     00,00,00,00,00,00,00,@10111000 ,00,00,00,00,00,00,00    ;DEFB(11) BUFFER SECUNDARIO DE REGISTROS DEL PSG\r\n\r\n\r\n\r\n;ENVOLVENTE_A    EQU     $D033           ;DB\r\n;ENVOLVENTE_B    EQU     $D034           ;DB\r\n;ENVOLVENTE_C    EQU     $D035           ;DB\r\n\r\n\r\n\r\n\r\n;EFECTOS DE SONIDO\r\n\r\n.N_SONIDO       defb      0               ;defb  NUMERO DE SONIDO\r\n.PUNTERO_SONIDO defw      0               ;defw  PUNTERO DEL SONIDO QUE SE REPRODUCE\r\n\r\n;EFECTOS\r\n\r\n.N_EFECTO       defb      0               ;defb  NUMERO DE SONIDO\r\n;PUNTERO_EFECTO defw      0               ;defw  PUNTERO DEL SONIDO QUE SE REPRODUCE\r\n\t\t\t\t    \r\n.PUNTERO_EFECTO_A \tdefw      0             ;DW : PUNTERO DEL SONIDO QUE SE REPRODUCE\r\n.PUNTERO_EFECTO_B \tdefw      0             ;DW : PUNTERO DEL SONIDO QUE SE REPRODUCE\r\n.PUNTERO_EFECTO_C \tdefw      0             ;DW : PUNTERO DEL SONIDO QUE SE REPRODUCE\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n.BUFFER_DEC   defs $40\r\n;   DEFB     $00\t\t;************************* mucha atencion!!!!\r\n;.BUFFER_DEC defs 2048\t\t;space dinamically asigned in source code compilation!!\r\n\t\t\t\t\t; aqui se decodifica la cancion hay que dejar suficiente espacio libre.\r\n\t\t\t\t\t;*************************\r\n                \r\nDEFC CARGA_CANCION_WYZ = CARGA_CANCION_WYZ0\r\nDEFC INICIA_EFECTO_WYZ = INICIA_EFECTO_WYZ0\r\nDEFC cpc_WyzSetPlayerOn0 = cpc_WyzSetPlayerOn1\r\nDEFC cpc_WyzSetPlayerOff0 = cpc_WyzSetPlayerOff1\r\nDEFC TABLA_SONG = TABLA_SONG0\r\nDEFC TABLA_EFECTOS = TABLA_EFECTOS0\r\nDEFC TABLA_PAUTAS = TABLA_PAUTAS0\r\nDEFC TABLA_SONIDOS = TABLA_SONIDOS0\r\nDEFC INTERRUPCION = INTERR                \r\nDEFC direcc_tempo = dir_tempo\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzSetPlayerOff.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzSetPlayerOff\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL cpc_WyzSetPlayerOff0\r\n\r\n.cpc_WyzSetPlayerOff\r\nJP cpc_WyzSetPlayerOff0 + cpc_WyzPlayer"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzSetPlayerOn.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzSetPlayerOn\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL cpc_WyzSetPlayerOn0\r\n\r\n.cpc_WyzSetPlayerOn\r\nJP cpc_WyzPlayer\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzSetTempo.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzSetTempo\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL direcc_tempo\r\n\r\n.cpc_WyzSetTempo\r\n\tld a,l\r\n\tld (direcc_tempo+cpc_WyzPlayer+1),a\r\n\tret\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzStartEffect.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzStartEffect\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL INICIA_EFECTO_WYZ\r\n\r\n.cpc_WyzStartEffect\t\r\n\tLD HL,2\r\n\tADD HL,SP\r\n\tLD b,(HL)\r\n\tINC HL\r\n\tINC HL\r\n\tLD c,(HL)\r\n\t;AHORA TIENE 2 parmetros: C:canal, B:numero efecto\r\n\tJP INICIA_EFECTO_WYZ + cpc_WyzPlayer"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzStartSound.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzStartSound\t;No se suele usar directamente. No lo meto en librera.\r\n\r\nGLOBAL INICIA_SONIDO_WYZ\r\n\r\n.cpc_WyzStartSound\r\n\tLD HL,2\r\n\tADD HL,SP\r\n\tLD A,(HL)\r\n\tJP INICIA_SONIDO_WYZ"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzStopMusic.asm",
    "content": "GLOBAL cpc_WyzConfigurePlayer\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL INTERRUPCION\r\n\r\n.cpc_WyzConfigurePlayer\r\n\tLD HL,2\r\n\tADD HL,SP\r\n\tLD A,(HL)\r\n\tLD HL,INTERRUPCION+cpc_WyzPlayer\r\n\tAND (HL)\r\n\tLD (INTERRUPCION+cpc_WyzPlayer),A\r\n\tRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpc_WyzTestPlayer.asm",
    "content": "; ******************************************************\r\n; **       Librera de rutinas para Amstrad CPC       **\r\n; **\t   Ral Simarro, \t  Artaburu 2007           **\r\n; ******************************************************\r\n\r\nGLOBAL cpc_WyzTestPlayer\r\n\r\nGLOBAL cpc_WyzPlayer\r\nGLOBAL INTERRUPCION\r\n\r\n.cpc_WyzTestPlayer\r\n\tLD HL,INTERRUPCION+cpc_WyzPlayer\r\n\tLD A,(HL)\r\n\tLD L,A\r\n\tLD H,0\r\n\tRET"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/cpcwyzlib.h",
    "content": "#define _CPCWYZGLOBAL_H\r\n\r\nextern void  __FASTCALL__\t__GLOBAL__  \tcpc_WyzLoadSong(unsigned char numero);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_WyzStartEffect(unsigned char canal, unsigned char efecto);\r\nextern void  __CALLEE__\t__GLOBAL__  \t\tcpc_WyzSetPlayerOn(void);\r\nextern void  __CALLEE__\t__GLOBAL__   \t\tcpc_WyzSetPlayerOff(void);\r\nextern void  __FASTCALL__\t__GLOBAL__ \tcpc_WyzConfigurePlayer(char valor);\r\nextern char  __CALLEE__\t__GLOBAL__   \t\tcpc_WyzTestPlayer(void);\r\nextern void  __GLOBAL__   \t\t\t\tcpc_WyzInitPlayer(int sonidos, int pautas, int efectos, int canciones);\r\nextern void  __FASTCALL__\t__GLOBAL__  \tcpc_WyzSetTempo(unsigned char tempo);\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcwyzlib/make.bat",
    "content": "z80asm -v -xcpcwyzlib.lib @cpcwyzlib.lst\r\ncopy cpcwyzlib.lib C:\\z88dk\\lib\\clibs\r\ncopy cpcwyzlib.h C:\\z88dk\\include\r\n"
  },
  {
    "path": "tools/z88dk/cpc/cpcxfs/readme",
    "content": "\t\t\t\t<<<<Last Modified: Thu Feb 15 19:43:05 1996>>>>\r\n\r\n\r\nWhat is CPCfs?\r\n\r\n\tCPCfs is a program to maintain filesystems that are needed by some\r\n\tCPC emulators (especially CPCEmu by Marco Vieth).\r\n\r\n\tIf you are familiar with some emulators, you may have already\r\n\tencountered the problem, how to copy files form DOS into the\r\n\timage of an emulator, or vice versa.\r\n\r\n\tThe methods described in the documentation of CPCEmu only deal\r\n\twith transferring whole CPC disks to CPCEmu diskimages, but not\r\n\tsingle files. \r\n\r\n\tIf you use CPCEmu you can use the cassette interface to load and save\r\n\tfiles from the CPC memory to DOS files. But this method lacks\r\n\tsome (in my sense important) features, e.g. \r\n\t- transferring files > 42k\r\n\t- transferring data files without Amsdos-Header\r\n\t- installing CP/M, if you don't have a 5 1/4 inch drive at your\r\n\t  CPC and can't copy whole disks.\r\n\t- transferring is so slow as the emulator\r\n\t- you can't transfer files in a batch\r\n\r\n\tIf you don't use another emulator than CPCEmu, I do not know\r\n\tanother solution other than CPCfs.\r\n\r\n\r\nWhat other products do I need?\r\n\r\n\t- A CPC-Emulator (CPCEmu, CPE, SimCPC, CPCEmuII, ...)\r\n\t- A CPC Computer with CP/M License, if you want to copy CP/M\r\n\t  to an image.\r\n\r\n\r\nHow do I install CPCfs?\r\n\r\n\tJust unpack the archive with the -d switch to extract the \r\n\tsubdirectory src. If you omit the -d switch, you get all files\r\n\tin one directory. Then copy the\t*.EXE files, CPCFS.CFG and \r\n\tCPCFS.HLP to a place where they can be found (somewhere in the\r\n\tpath) or where you like them to be. CPCFS.CFG must be in the \r\n\tcurrent directory or in the same directory as CPCFS.EXE.\r\n\r\n\r\nWhat is new in version 0.85?\r\n\r\n\tMain features:\r\n\t- Vortex images are now supported\r\n\t- User areas and file attributes are fully supported\r\n\t- Extensible help system containing nearly the same as the manual\r\n\t- Commands can be controlled by options\r\n\t- History mechanism\r\n\r\n\tNew comamnds:\r\n\t- COPY\t\tcopy files\r\n\t- TYPE\t\tlook at files\r\n\t- DPB\t\tsee the complete Disk Parameter Block\r\n\t- COMMENT\tdescribes your images\r\n\t- ATTRIB\tchange file attributes\r\n\r\n\tExtended commands:\r\n\t- DIR\t\tshows long output, including Amsdos header\r\n\t- DUMP\t\tnow addresses single sectors or blocks\r\n\t- HELP\t\taccesses the online manual\r\n\r\n\r\nWhat files are distributed?\t\r\n\r\n\tREADME\t\t- You are reading it!\r\n\tCPCFS.EXE\t- The program itself\r\n\tCPCFS.CFG\t- The configuarion file for CPCfs\r\n\tDROP_TAG.BAT\t- A utility program; needed for CPE\r\n\tCPCFS.HLP\t- The online helpfile\r\n\tCPCFS.DOC\t\\_ The documentation\r\n\tTEMPLATE.DOC\t/\r\n\tMAKEDOC.EXE\t- Composing the documentation out of template and help\r\n\tGETCPM.BAS\t- A Locomotive BASIC Program to copy the CP/M tracks\r\n\t\t\t  to a file.\r\n\tDESCRIPT.ION\t- 4DOS' description\r\n\r\n\tSRC\\CPCFS.C\t\\\r\n\tSRC\\UI.C\t |_ The main sourcecode\r\n\tSRC\\FS.C\t |\r\n\tSRC\\TOOLS.C\t/\r\n\tSRC\\CPCFS.H\t\\\r\n\tSRC\\DOS.H\t |- Some prototypes, constants,\r\n\tSRC\\UNIX.H\t/    includes, and so on\t\r\n\tSRC\\DOS.C\t\\_  system dependent implementation\r\n\tSRC\\UNIX.C\t/    of the prototypes\r\n\tSRC\\MATCH.C\t\\_  some routines realising regular expression\r\n\tSRC\\MATCH.H\t/    matching for CP/M wildcards\r\n\tSRC\\MAKEDOC.C\t  - Source of the doc-composer\r\n\tSRC\\CPCFS.PRJ\t  - Project files for Borland C\r\n\tSRC\\MAKEFILE\t  - Unix Makefile\r\n\tSRC\\DESCRIPT.ION  - 4DOS' description\r\n\r\nHow do I use CPCfs?\r\n\r\n\tRead CPCFS.DOC or type HELP within CPCfs.\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/readme.txt",
    "content": "Example command-line for windows:\r\n\r\nnocart test.dsk test.cpr -c RUN\"\"\"test\r\n\r\nnocart -f \"DA3A\" test.dsk test.cpr -c RUN\"\"\"test\r\n\r\nFor linux:\r\n\r\nnocart test.dsk test.cpr -c 'RUN\"test'\r\n\r\nnocart -f \"DA3A\" test.dsk test.cpr -c 'RUN\"test'\r\n\r\nFor help:\r\n\r\nnocart\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/main.cpp",
    "content": "// v1.9\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <stdint.h>\r\n#include <memory.h>\r\n#include <string.h>\r\n\r\n#ifdef WIN32\r\n#define stringcmp _stricmp\r\n#else\r\n#define stringcmp strcasecmp\r\n#endif\r\n\r\nextern \"C\"\r\n{\r\n#include \"opth.h\"\r\n};\r\n#define SECTOR_ID_PATCH_DOS_OFFSET 0x056d\r\n#define FILENAME_PATCH_DOS_OFFSET 0x01c04\r\n#define DATA_XPDB_OFFSET 0x05ca /* partial; 0x00a bytes long */\r\n#define SYSTEM_XPDB_OFFSET 0x00a43 /* full; 0x016 bytes long */\r\n#define BINARY_CART_PAGE 21\r\n#define FORMAT_ID 0x056d\r\n\r\nenum\r\n{\r\n\tDISK_IMAGE_TYPE_UNKNOWN,\r\n\tDISK_IMAGE_TYPE_STANDARD,\r\n\tDISK_IMAGE_TYPE_EXTENDED\r\n};\r\n\r\nstatic int DiskImageType = DISK_IMAGE_TYPE_UNKNOWN;\r\n\r\nint UsesBinaryFile = 0;\r\nint UsesBasicCommand = 0;\r\nchar BasicCommand[16];\r\nint DskMaxChunk = 32;\r\nint UsesExtendedFormat = 0;\r\nint ChosenExtendedFormat = -1;\r\n\r\n#pragma pack(1)\r\ntypedef struct\r\n{\r\n\tunsigned char SPT_l; /* 128 byte records per track */\r\n\tunsigned char SPT_h; /* 128 byte records per track */\r\n\tunsigned char BSH;\r\n\tunsigned char BLM;\r\n\tunsigned char EXM;\r\n\tunsigned char DSM_l;\r\n\tunsigned char DSM_h;\r\n\tunsigned char DRM_l;\r\n\tunsigned char DRM_h;\r\n\tunsigned char AL_l; /* AL0 and AL1 */\r\n\tunsigned char AL_h; /* AL0 and AL1 */\r\n\tunsigned char CKS_l; /* num dir entries/4 rounded up */\r\n\tunsigned char CKS_h; /* num dir entries/4 rounded up */\r\n\tunsigned char OFF_l;\r\n\tunsigned char OFF_h;\r\n\tunsigned char SectorID;\r\n\tunsigned char SectorsPerTrack;\r\n\tunsigned char GapRW;\r\n\tunsigned char GapFormat;\r\n\tunsigned char Filler;\r\n\tunsigned char N;\r\n\tunsigned char RecordsPerSector;\r\n} XPDB_t;\r\n#pragma pack()\r\n\r\n\r\ntypedef struct\r\n{\r\n\tconst char *FormatID;\r\n\tint SectorIDMin;\r\n\tint MaxTracks;\r\n\tint SPT;\r\n\tXPDB_t XPDB;\r\n} SupportedFormat;\r\n\r\nconst SupportedFormat SupportedFormats[1]=\r\n{\r\n\t{\r\n\t\t\"DA3A\",\r\n\t\t0x0c1,\r\n\t\t60,\r\n\t\t9,\r\n\t\t{\r\n\t\t\t(0x024&0x0ff),\t/* SPT */\r\n\t\t\t((0x024>>8) & 0x0ff),\t/* SPT */\r\n\t\t\t0x03,\t/* BSH */\r\n\t\t\t0x07,\t/* BLM */\r\n\t\t\t0x0,\t/* EXM */\r\n\t\t\t(254&0x0ff),\t/* DSM */\r\n\t\t\t((254>>8)&0x0ff),\r\n\t\t\t(63 & 0x0ff),\t/* DRM */\r\n\t\t\t((63 >> 8) & 0x0ff),\r\n\t\t\t(0x00c0 & 0x0ff),\t/* AL0/AL1 */\r\n\t\t\t((0x00c0 >> 8) & 0x0ff),\r\n\t\t\t(0x010 & 0x0ff),\t/* CKS */\r\n\t\t\t((0x010 >> 8) & 0x0ff),\r\n\t\t\t(0x0 & 0x0ff),\t/* OFS */\r\n\t\t\t((0x0 >> 8) & 0x0ff),\r\n\t\t\t0xc1,/* Sector ID */\r\n\t\t\t0x09, /* SPT */\r\n\t\t\t0x2a, /* Gap RW */\r\n\t\t\t0x52, /* Gap Format */\r\n\t\t\t0xe5, /* Filler */\r\n\t\t\t0x02, /* N */\r\n\t\t\t0x04\r\n\t\t}\r\n\t}\r\n};\r\n\r\ntypedef struct\r\n{\r\n\tuint8_t\tC;\r\n\tuint8_t\tH;\r\n\tuint8_t\tR;\r\n\tuint8_t\tN;\r\n\tuint8_t\tST1;\r\n\tuint8_t\tST2;\r\n\tuint8_t\tSectorSizeLow;\r\n\tuint8_t SectorSizeHigh;\r\n} EXTDSKCHRN;\r\n\r\ntypedef struct\r\n{\r\n\tchar\tTrackHeader[12];\r\n\tchar\tpad0[4];\r\n\tunsigned char\ttrack;\r\n\tunsigned char\tside;\r\n\tunsigned char\tpad1[2];\r\n\tunsigned char\tBPS;\r\n\tunsigned char\tSPT;\r\n\tunsigned char\tGap3;\r\n\tunsigned char\tFillerByte;\r\n\tEXTDSKCHRN\tSectorIDs[29];\r\n} EXTDSKTRACKHEADER;\r\n\r\ntypedef struct\r\n{\r\n\tchar\t\tDskHeader[34];\r\n\tchar\t\tDskCreator[14];\r\n\tunsigned char\tNumTracks;\r\n\tunsigned char\tNumSides;\r\n\tunsigned char\tTrackSizeLow;\r\n\tunsigned char\tTrackSizeHigh;\r\n\tchar\t\tTrackSizeTable[255 - 4 - 14 - 33];\r\n} EXTDSKHEADER;\r\n\r\n\r\ntypedef struct\r\n{\r\n\tuint8_t\tC;\r\n\tuint8_t\tH;\r\n\tuint8_t\tR;\r\n\tuint8_t\tN;\r\n\tuint8_t\tST1;\r\n\tuint8_t\tST2;\r\n\tuint8_t\tUnused[2];\r\n} DSKCHRN;\r\n\r\ntypedef struct\r\n{\r\n\tchar\tTrackHeader[12];\r\n\tchar\tpad0[4];\r\n\tunsigned char\ttrack;\r\n\tunsigned char\tside;\r\n\tunsigned char\tpad1[2];\r\n\tunsigned char\tBPS;\r\n\tunsigned char\tSPT;\r\n\tunsigned char\tGap3;\r\n\tunsigned char\tFillerByte;\r\n\tDSKCHRN\tSectorIDs[29];\r\n} DSKTRACKHEADER;\r\n\r\n\r\ntypedef struct\r\n{\r\n\tchar\t\tDskHeader[34];\r\n\tchar\t\tDskCreator[14];\r\n\tunsigned char\tNumTracks;\r\n\tunsigned char\tNumSides;\r\n\tunsigned char\tTrackSizeLow;\r\n\tunsigned char\tTrackSizeHigh;\r\n\tchar\t\tUnused[255 - 4 - 14 - 33];\r\n} DSKHEADER;\r\n\r\nconst uint8_t *ExtendedGetSectorDataPtr(const uint8_t *pData, int PhysicalTrack, int SectorID)\r\n{\r\n\tEXTDSKHEADER *pHeader = (EXTDSKHEADER *)pData;\r\n\tEXTDSKTRACKHEADER *pTrackHeader;\r\n\tsize_t Offset = 0;\r\n\tint t;\r\n\tint s;\r\n\tint TrackIndex = PhysicalTrack*pHeader->NumSides;\r\n\r\n\tif (pHeader->TrackSizeTable[TrackIndex] == 0)\r\n\t\treturn NULL;\r\n\r\n\t/* accumulate offset to desired track using size of each track */\r\n\tfor (t = 0; t < TrackIndex; t++)\r\n\t{\r\n\t\tOffset += (pHeader->TrackSizeTable[t] & 0x0ff) << 8;\r\n\t}\r\n\r\n\t/* add main header size */\r\n\tOffset += sizeof(EXTDSKHEADER);\r\n\r\n\tpTrackHeader = (EXTDSKTRACKHEADER *)(pData + Offset);\r\n\r\n\t/* add track header */\r\n\tOffset += sizeof(EXTDSKTRACKHEADER);\r\n\r\n\t/* locate sector and accumulate sector sizes on offset */\r\n\tfor (s = 0; s < pTrackHeader->SPT; s++)\r\n\t{\r\n\t\tsize_t SectorSize = 0;\r\n\r\n\t\tif (pTrackHeader->SectorIDs[s].R == SectorID)\r\n\t\t{\r\n\t\t\treturn (uint8_t *)(pData + Offset);\r\n\t\t}\r\n\r\n\t\t/* found sector id */\r\n\t\tSectorSize =\r\n\t\t\t(pTrackHeader->SectorIDs[s].SectorSizeLow & 0x0ff) |\r\n\t\t\t((pTrackHeader->SectorIDs[s].SectorSizeHigh & 0x0ff) << 8);\r\n\t\tOffset += SectorSize;\r\n\t}\r\n\t\r\n\treturn NULL;\r\n\r\n}\r\n\r\n\r\nconst uint8_t *StandardGetSectorDataPtr(const uint8_t *pData, int PhysicalTrack, int SectorID)\r\n{\r\n\tDSKHEADER *pHeader = (DSKHEADER *)pData;\r\n\tDSKTRACKHEADER *pTrackHeader;\r\n\tsize_t Offset = 0;\r\n\tint s;\r\n\tint TrackIndex = PhysicalTrack*pHeader->NumSides;\r\n\r\n\tOffset = (\r\n\t\t(pHeader->TrackSizeLow & 0x0ff) |\r\n\t\t((pHeader->TrackSizeHigh & 0x0ff)<<8)\r\n\t\t) * TrackIndex;\r\n\r\n\t/* add main header size */\r\n\tOffset += sizeof(DSKHEADER);\r\n\r\n\tpTrackHeader = (DSKTRACKHEADER *)(pData + Offset);\r\n\r\n\t/* add track header */\r\n\tOffset += sizeof(DSKTRACKHEADER);\r\n\r\n\t/* locate sector and accumulate sector sizes on offset */\r\n\tfor (s = 0; s < pTrackHeader->SPT; s++)\r\n\t{\r\n\t\tsize_t SectorSize = 0;\r\n\r\n\t\tif (pTrackHeader->SectorIDs[s].R == SectorID)\r\n\t\t{\r\n\t\t\treturn (uint8_t *)(pData + Offset);\r\n\t\t}\r\n\r\n\t\tswitch (pTrackHeader->SectorIDs[s].N)\r\n\t\t{\r\n\t\tcase 0:\r\n\t\t\tSectorSize = 128;\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tSectorSize = 256;\r\n\t\t\tbreak;\r\n\t\tcase 2:\r\n\t\t\tSectorSize = 512;\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tSectorSize = 1024;\r\n\t\t\tbreak;\r\n\t\tcase 4:\r\n\t\t\tSectorSize = 2048;\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t\tOffset += SectorSize;\r\n\t}\r\n\r\n\treturn NULL;\r\n}\r\n\r\n\r\n\r\n#define min(a,b) \\\r\n\t(a<b) ? a : b\r\n\r\nconst char *RIFFTag = \"RIFF\";\r\nconst char *AmsTag = \"AMS!\";\r\nstatic int SectorIDMin = 0x0c1;\r\nstatic int SectorIDMax = 0x0c9;\r\n\r\n#define NUM_CHUNKS 32\r\n#define CART_CHUNK_LENGTH 16384\r\n#define RIFF_CHUNK_HEADER_SIZE (sizeof(uint32_t)*2)\r\n#define SECTOR_SIZE 512\r\n#define MAX_TRACKS 40\r\nstatic int MaxTracks = MAX_TRACKS;\r\nstatic int NumTracks = MAX_TRACKS;\r\nstatic int MaxSPT = 9;\r\nstatic int MinID = 0x0c1;\r\nstatic int MaxID = 0x0c9;\r\n\r\nstatic void WriteTag(FILE *fh, const char *sTag)\r\n{\r\n\tfwrite(sTag, 4, 1, fh);\r\n}\r\n\r\ntypedef struct \r\n{\r\n\tuint8_t *pData;\r\n\tsize_t DataLength;\r\n} DataBlock;\r\n\r\n\r\nstatic int CheckDiskValid(DataBlock *pBlock)\r\n{\r\n\tint result = -1;\r\n\tswitch (DiskImageType)\r\n\t{\r\n\t\tcase DISK_IMAGE_TYPE_EXTENDED:\r\n\t\t{\r\n\t\t\tint t;\r\n\t\t\tint TrackSizeWanted;\r\n\t\t\tint Offset;\r\n\t\t\t\r\n\t\t\tresult = 0;\r\n\t\t\tEXTDSKHEADER *pHeader = (EXTDSKHEADER *)pBlock->pData;\r\n\t\t\tif (pHeader->NumSides!=1)\r\n\t\t\t{\r\n\t\t\t\tfprintf(stderr,\"Double sided discs are not supported\\n\");\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\tfprintf(stdout,\"Single sided disc detected\\n\");\r\n\t\t\t\r\n\t\t\tNumTracks = pHeader->NumTracks;\r\n\t\t\tif (NumTracks>MaxTracks)\r\n\t\t\t{\r\n\t\t\t\tfprintf(stderr,\"Disk image has %d tracks. Only %d will be used\\n\", pHeader->NumTracks, MaxTracks);\r\n\t\t\t\tNumTracks = MaxTracks;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfprintf(stderr,\"Disk image has %d tracks.\\n\", pHeader->NumTracks);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tTrackSizeWanted = ((512*MaxSPT)+sizeof(EXTDSKTRACKHEADER))>>8;\r\n\t\t\t\r\n\t\t\t/* check track sizes */\r\n\t\t\tfor (t=0; t<NumTracks*pHeader->NumSides; t++)\r\n\t\t\t{\r\n\t\t\t\tif (pHeader->TrackSizeTable[t]!=TrackSizeWanted)\r\n\t\t\t\t{\r\n\t\t\t\t\tfprintf(stderr,\"Track %d has size %d. Not supported\\n\", t, (int)(pHeader->TrackSizeTable[t]&0x0ff)<<8);\r\n\t\t\t\t\tresult = -1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tOffset = sizeof(EXTDSKHEADER);\r\n\t\t\tSectorIDMin = 255;\r\n\t\t\tSectorIDMax = 0;\r\n\t\t\tfor (t=0; t<NumTracks; t++)\r\n\t\t\t{\r\n\t\t\t\tint s;\r\n\t\t\t\tint TrackSize = 0;\r\n\t\t\t\t\r\n\t\t\t\tEXTDSKTRACKHEADER *pTrackHeader = (EXTDSKTRACKHEADER *)(pBlock->pData + Offset);\r\n\t\t\t\t\r\n\t\t\t\tif (pTrackHeader->SPT!=MaxSPT)\r\n\t\t\t\t{\r\n\t\t\t\t\tfprintf(stderr,\"Track %d has %d sectors. Not supported\\n\", t,(int)pTrackHeader->SPT);\r\n\t\t\t\t\tresult = -1;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tfor (s=0; s<pTrackHeader->SPT; s++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( \r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].C!=t) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].H!=0) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].N!=2) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].ST1!=0) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].ST2!=0) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].SectorSizeLow!=0) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].SectorSizeHigh!=2)\r\n\t\t\t\t\t)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stderr,\"Sector %d on Track %d has unsupported ID or protection (ID: %02x %02x %02x %02x).\\n\", s,t,pTrackHeader->SectorIDs[s].C, pTrackHeader->SectorIDs[s].H, pTrackHeader->SectorIDs[s].R, pTrackHeader->SectorIDs[s].N);\r\n\t\t\t\t\t\tresult = -1;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t/* capture id */\r\n\t\t\t\t\tif (pTrackHeader->SectorIDs[s].R < SectorIDMin)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSectorIDMin = pTrackHeader->SectorIDs[s].R;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tif (pTrackHeader->SectorIDs[s].R > SectorIDMax)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSectorIDMax = pTrackHeader->SectorIDs[s].R;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tTrackSize = (pHeader->TrackSizeTable[t] & 0x0ff)<<8;\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\tOffset+=TrackSize;\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\r\n\t\tcase DISK_IMAGE_TYPE_STANDARD:\r\n\t\t{\r\n\t\t\tint t;\r\n\t\t\tint TrackSize = 0;\r\n\t\t\tsize_t Offset;\r\n\r\n\t\t\tresult = 0;\r\n\t\t\tDSKHEADER *pHeader = (DSKHEADER *)pBlock->pData;\r\n\t\t\tif (pHeader->NumSides!=1)\r\n\t\t\t{\r\n\t\t\t\tfprintf(stderr,\"Double sided discs are not supported\\n\");\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\tfprintf(stdout,\"Single sided disc detected\\n\");\r\n\t\t\t\r\n\t\t\tNumTracks = pHeader->NumTracks;\r\n\t\t\tif (NumTracks>MaxTracks)\r\n\t\t\t{\r\n\t\t\t\tfprintf(stderr,\"Disk image has %d tracks. Only %d will be used\\n\", pHeader->NumTracks, MaxTracks);\r\n\t\t\t\tNumTracks = MaxTracks;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfprintf(stderr,\"Disk image has %d tracks.\\n\", pHeader->NumTracks);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tTrackSize = (\r\n\t\t\t(pHeader->TrackSizeLow & 0x0ff) | \r\n\t\t\t((pHeader->TrackSizeHigh & 0x0ff)<<8)\r\n\t\t\t);\r\n\t\t\t\r\n\t\t\tOffset = sizeof(DSKHEADER);\r\n\t\t\tSectorIDMin = 255;\r\n\t\t\tSectorIDMax = 0;\r\n\t\t\tfor (t=0; t<NumTracks; t++)\r\n\t\t\t{\r\n\t\t\t\tint s;\r\n\t\t\t\t\r\n\t\t\t\tDSKTRACKHEADER *pTrackHeader = (DSKTRACKHEADER *)(pBlock->pData + Offset);\r\n\t\t\t\t\r\n\t\t\t\tif (pTrackHeader->SPT!= MaxSPT)\r\n\t\t\t\t{\r\n\t\t\t\t\tfprintf(stderr,\"Track %d has %d sectors. Not supported\\n\", t,pTrackHeader->SPT);\r\n\t\t\t\t\tresult = -1;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tfor (s=0; s<pTrackHeader->SPT; s++)\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( \r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].C!=t) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].H!=0) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].N!=2) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].ST1!=0) ||\r\n\t\t\t\t\t\t(pTrackHeader->SectorIDs[s].ST2!=0)\r\n\t\t\t\t\t)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stderr,\"Sector %d on Track %d has unsupported ID or protection (ID: %02x %02x %02x %02x).\\n\", s,t,pTrackHeader->SectorIDs[s].C, pTrackHeader->SectorIDs[s].H, pTrackHeader->SectorIDs[s].R, pTrackHeader->SectorIDs[s].N);\r\n\t\t\t\t\t\tresult = -1;\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t/* capture id */\r\n\t\t\t\t\tif (pTrackHeader->SectorIDs[s].R < SectorIDMin)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSectorIDMin = pTrackHeader->SectorIDs[s].R;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\tif (pTrackHeader->SectorIDs[s].R > SectorIDMax)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSectorIDMax = pTrackHeader->SectorIDs[s].R;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\tOffset+=TrackSize;\r\n\t\t\t}\r\n\r\n\t\t\t/* if result=0, then all is ok and either data or system detected */\r\n\t\t\t\r\n\t\t}\t\r\n\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\treturn -1;\r\n\t}\r\n\t\r\n\treturn result;\r\n}\r\n\r\ntypedef struct\r\n{\r\n\tint CurrentPhysicalTrack;\r\n\tint CurrentSectorID;\r\n} DiskPosition;\r\n\r\nstatic int ReadFile(const char *sFilename, DataBlock *pBlock)\r\n{\r\n\tint result = 0;\r\n\r\n\tpBlock->pData = NULL;\r\n\tpBlock->DataLength = 0;\r\n\r\n\tFILE *fhIn = fopen(sFilename, \"rb\");\r\n\tif (fhIn)\r\n\t{\r\n\t\tsize_t FileLength = 0;\r\n\t\tfseek(fhIn, 0, SEEK_END);\r\n\r\n\t\tFileLength = (size_t)ftell(fhIn);\r\n\r\n\t\tfseek(fhIn, 0, SEEK_SET);\r\n\r\n\t\tif (FileLength != 0)\r\n\t\t{\r\n\t\t\tpBlock->DataLength = FileLength;\r\n\t\t\tpBlock->pData = (uint8_t *)malloc(FileLength);\r\n\t\t\tif (pBlock->pData)\r\n\t\t\t{\r\n\t\t\t\tif (fread(pBlock->pData, FileLength, 1, fhIn)==1)\r\n\t\t\t\t{\r\n\t\t\t\t\tfprintf(stdout,\"Successfully read '%s'\\n\", sFilename);\r\n\t\t\t\t\tresult = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfclose(fhIn);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfprintf(stderr, \"Failed to open file: '%s'\\n\", sFilename);\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nstatic void PadPage(FILE *fh, int Remaining)\r\n{\r\n\t/* pad to end if size is smaller than cart chunk length */\r\n\twhile (Remaining != 0)\r\n\t{\r\n\t\tfputc(0x0ff, fh);\r\n\t\tRemaining--;\r\n\t}\r\n}\r\n\r\nstatic int WriteROM(FILE *fh, const char *sFilename)\r\n{\r\n\tint resultCode = 0;\r\n\r\n\tDataBlock block;\r\n\tif (ReadFile(sFilename, &block))\r\n\t{\r\n    \t\t\tsize_t Size = block.DataLength;\r\n\t\tsize_t Remaining = 0;\r\n\r\n\t\tif (Size > CART_CHUNK_LENGTH)\r\n\t\t{\r\n\t\t\tfprintf(stderr, \"File '%s' is larger than cart page size %d. It will be cropped\\n\", sFilename, CART_CHUNK_LENGTH);\r\n\t\t}\r\n\t\tSize = min(Size, CART_CHUNK_LENGTH);\r\n\t\tRemaining = CART_CHUNK_LENGTH - Size;\r\n\r\n\t\tfwrite(block.pData, Size, 1, fh);\r\n\r\n\t\tPadPage(fh, Remaining);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tPadPage(fh, CART_CHUNK_LENGTH);\r\n\t\tresultCode = 1;\r\n\t}\r\n\r\n\tif (block.pData!=NULL)\r\n\t{\r\n\t\tfree(block.pData);\r\n\t\tblock.pData = NULL;\r\n\t}\r\n\treturn resultCode;\r\n}\r\n\r\n\r\n\r\nstatic int NumFiles = 0;\r\nstatic const char *Filenames[2];\r\nstatic const char *os = NULL;\r\nstatic const char *pBinaryFilename;\r\n\r\nint\tNonOptionHandler(const char *pOption)\r\n{\r\n\tif (NumFiles<2)\r\n\t{\r\n\t\tFilenames[NumFiles] = pOption;\r\n\t\tNumFiles++;\r\n\t}\r\n\r\n\treturn OPTION_OK;\r\n}\r\n\r\nint SetCommandHandler(ARGUMENT_DATA *pData)\r\n{\r\n\tconst char *command = ArgumentList_GetNext(pData);\r\n\r\n\tif (command==NULL)\r\n\t\treturn OPTION_MISSING_PARAMETER;\r\n\t\r\n  UsesBasicCommand = 1;\r\n  strncat(BasicCommand, command, 15);\r\n  BasicCommand[15]='\\0';\r\n\treturn OPTION_OK;\r\n}\r\n\r\nint SetBinaryFileHandler(ARGUMENT_DATA *pData)\r\n{\r\n\tconst char *filename = ArgumentList_GetNext(pData);\r\n\r\n\tif (filename == NULL)\r\n\t\treturn OPTION_MISSING_PARAMETER;\r\n\r\n\tDskMaxChunk = 21;\r\n\tUsesBinaryFile = 1;\r\n\tpBinaryFilename = filename;\r\n\treturn OPTION_OK;\r\n}\r\n\r\nint SetAllowExtendedFormatHandler(ARGUMENT_DATA *pData)\r\n{\r\n\tint i;\r\n\tconst char *formatName = ArgumentList_GetNext(pData);\r\n\r\n\tif (formatName == NULL)\r\n\t{\r\n\t\t/* list supported formats */\r\n\t\t\r\n\t\tprintf(\"Supported extended formats: \");\r\n\t\tfor (i=0; i<sizeof(SupportedFormats)/sizeof(SupportedFormats[0]); i++)\r\n\t\t{\r\n\t\t\tif (i != 0)\r\n\t\t\t{\r\n\t\t\t\tprintf(\",\");\r\n\t\t\t}\r\n\t\t\tprintf(\"%s\",SupportedFormats[i].FormatID);\r\n\t\t}\t\r\n\t\tprintf(\"\\n\");\r\n\t\treturn OPTION_OK;\r\n\t}\r\n\t\r\n\t/* choose format */\r\n\tfor (i=0; i<sizeof(SupportedFormats)/sizeof(SupportedFormats[0]); i++)\r\n\t{\r\n\t\tif (stringcmp(SupportedFormats[i].FormatID,formatName)==0)\r\n\t\t{\r\n\t\t\tUsesExtendedFormat = 1;\r\n\t\t\tChosenExtendedFormat = i;\r\n\t\t\tMaxTracks = SupportedFormats[i].MaxTracks;\r\n\t\t\tMaxSPT = SupportedFormats[i].SPT;\r\n\t\t\tMinID = SupportedFormats[i].SectorIDMin;\r\n\t\t\tMaxID = SupportedFormats[i].SectorIDMin + (SupportedFormats[i].SPT-1);\r\n\t\t\tfprintf(stdout,\"Extended format '%s' chosen\\n\", SupportedFormats[i].FormatID);\r\n\t\t\treturn OPTION_OK;\r\n\t\t}\r\n\t}\r\n\tfprintf(stderr,\"Extended format '%s' not found\\n\",formatName);\r\n\treturn OPTION_BAD_VALUE;\r\n}\r\n\r\n\r\nvoid OutputDetails()\r\n{\r\n\tprintf(\"NoCart v1.9\\n\");\r\n#ifdef WIN32\r\n\tprintf(\"Usage: [options] <disk image> <output cart>\\ne.g. nebulus.dsk nebulus.cpr -c RUN\\\"\\\"\\\"disc\\n\\n\");\r\n#else\r\n  printf(\"Usage: [options] <disk image> <output cart>\\ne.g. nebulus.dsk nebulus.cpr -c 'RUN\\\"disc'\\n\\n\");\r\n#endif\r\n\r\n  printf(\"[options]:\\n\");\r\n\tprintf(\"-c <string> = BASIC command to execute. Limited to 16 characters\\n\");\r\n\tprintf(\"          e.g. RUN\\\"disc or |CPM\\n\");\r\n\tprintf(\"-f <format> = Choose extended format\\n\");\r\n\tprintf(\"-f = List supported extended formats\\n\");\r\n\tprintf(\"-b <filename> = add binary data. (cart block %d-31/&%02x-&ff. Max size %d)\\n\", BINARY_CART_PAGE, BINARY_CART_PAGE|0x080, (32-BINARY_CART_PAGE)*16384);\r\n}\r\n\r\n\r\nint OutputDetailsOption(ARGUMENT_DATA *pData)\r\n{\r\n\tOutputDetails();\r\n\treturn OPTION_OK;\r\n}\r\nOPTION OptionTable[]=\r\n{\r\n\t{\"c\",SetCommandHandler},\r\n\t{ \"b\", SetBinaryFileHandler},\r\n\t{ \"f\", SetAllowExtendedFormatHandler},\r\n\t{ \"?\", OutputDetailsOption },\r\n\t{NULL, NULL},\r\n};\r\n\t\r\n\r\nstatic void WriteCartTag(FILE *fh, int index)\r\n{\r\n\tchar CartTag[4];\r\n\tCartTag[0] = 'c';\r\n\tCartTag[1] = 'b';\r\n\tCartTag[2] = (index / 10) + '0';\r\n\tCartTag[3] = (index % 10) + '0';\r\n\tWriteTag(fh, CartTag);\r\n}\r\n\r\n\r\nstatic void UpdateDiskPosition(DiskPosition *position)\r\n{\r\n\tposition->CurrentSectorID++;\r\n\tif (position->CurrentSectorID > SectorIDMax)\r\n\t{\r\n\t\tposition->CurrentSectorID = SectorIDMin;\r\n\t\tposition->CurrentPhysicalTrack++;\r\n\t}\r\n}\r\n\r\nstatic int IsDiskDone(DiskPosition *position)\r\n{\r\n\treturn (\r\n\t\t(position->CurrentSectorID == SectorIDMin) &&\r\n\t\t(position->CurrentPhysicalTrack == NumTracks)\r\n\t\t);\r\n}\r\n\r\nstatic void WriteChunkLengthLittleEndian(FILE *fh, uint32_t Length)\r\n{\r\n\tunsigned char LengthBuffer[4];\r\n\tLengthBuffer[0] = Length & 0x0ff;\r\n\tLengthBuffer[1] = (Length >> 8) & 0x0ff;\r\n\tLengthBuffer[2] = (Length >> 16) & 0x0ff;\r\n\tLengthBuffer[3] = (Length >> 24) & 0x0ff;\r\n\r\n\tfwrite(LengthBuffer, 4, 1, fh);\r\n}\r\n\r\nstatic void WriteSectorDataToCartridgePage(FILE *fh, uint8_t *pDiskImageData, DiskPosition *position)\r\n{\r\n\tsize_t Remaining = CART_CHUNK_LENGTH;\r\n\r\n\tdo\r\n\t{\r\n\t\tconst uint8_t *pSectorPtr = NULL;\r\n\t\t\r\n\t\tswitch (DiskImageType)\r\n\t\t{\r\n\t\t\tcase DISK_IMAGE_TYPE_EXTENDED:\r\n\t\t\t\tpSectorPtr = ExtendedGetSectorDataPtr(pDiskImageData, position->CurrentPhysicalTrack, position->CurrentSectorID);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase DISK_IMAGE_TYPE_STANDARD:\r\n\t\t\t\tpSectorPtr = StandardGetSectorDataPtr(pDiskImageData, position->CurrentPhysicalTrack, position->CurrentSectorID);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (pSectorPtr==NULL)\r\n\t\t{\r\n\t\t\tint s;\r\n\t\t\tfprintf(stderr, \"Sector data not found (%d/%02x)\\n\",position->CurrentPhysicalTrack, position->CurrentSectorID);\r\n\t\t\tfor (s=0; s<SECTOR_SIZE; s++)\r\n\t\t\t{\r\n\t\t\t\tfputc(0x0ff, fh);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tfwrite(pSectorPtr, SECTOR_SIZE, 1, fh);\r\n\t\t}\r\n\t\tRemaining -= SECTOR_SIZE;\r\n\r\n\t\tUpdateDiskPosition(position);\r\n\t} \r\n\twhile ((Remaining >= SECTOR_SIZE) && (!IsDiskDone(position)));\r\n\r\n\tPadPage(fh, Remaining);\r\n}\r\n\r\nint main(int argc, const char **argv)\r\n{\r\n\tint nResultCode = 1;\r\n\tDskMaxChunk = 32;\r\n  UsesBasicCommand = 0;\r\n\tmemset(BasicCommand, 0, sizeof(BasicCommand));\r\n  UsesBinaryFile = 0;\r\nUsesExtendedFormat = 0;\r\n\r\n\tif (ArgumentList_Execute(argc, argv, OptionTable, printf, NonOptionHandler)==OPTION_OK)\r\n\t{\r\n\t\tif ((NumFiles < 2) || (NumFiles > 2))\r\n\t\t{\r\n\t\t\tOutputDetails();\r\n\t\t\tif (NumFiles != 0)\r\n\t\t\t{\r\n\t\t\t\tnResultCode = 1;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tnResultCode = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\t\r\n\t\t\tnResultCode = 0;\r\n      DataBlock DiskImageDataBlock;\r\n      if (!ReadFile(Filenames[0], &DiskImageDataBlock))\r\n      {\r\n        fprintf(stderr, \"Failed to read disk image '%s'\\n\", Filenames[0]);\r\n        nResultCode = 1;\r\n      }\r\n      else\r\n      {\r\n        DiskImageType = DISK_IMAGE_TYPE_UNKNOWN;\r\n        if (memcmp(DiskImageDataBlock.pData, \"MV - CPC\",8)==0)\r\n        {\r\n          DiskImageType = DISK_IMAGE_TYPE_STANDARD;\r\n\r\n          fprintf(stdout,\"Standard disk image detected\\n\");\r\n        }\r\n        else if (memcmp(DiskImageDataBlock.pData, \"EXTENDED\", 8) == 0)\r\n        {\r\n          DiskImageType = DISK_IMAGE_TYPE_EXTENDED;\r\n\r\n          fprintf(stdout,\"Extended disk image detected\\n\");\r\n        }\r\n        else \r\n        {\r\n          fprintf(stderr,\"Disk image not supported\\n\");\r\n           nResultCode = 1;\r\n        }\r\n        \r\n\t\tif (DiskImageType != DISK_IMAGE_TYPE_UNKNOWN)\r\n\t\t{\r\n\t\t\tif (CheckDiskValid(&DiskImageDataBlock) == 0)\r\n\t\t\t{\r\n\t\t\t\tDiskPosition position;\r\n\r\n\t\t\t\tif (UsesExtendedFormat)\r\n\t\t\t\t{\r\n\t\t\t\t\tif ((SectorIDMin == MinID) && (SectorIDMax == MaxID))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stdout, \"Extended format detected\\n\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stderr, \"Extended format not detected (found min ID: &%02x max ID: &%02x. Wanted min &%02x and max &%02x)\\n\", SectorIDMin, SectorIDMax, MinID, MaxID);\r\n\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif (SectorIDMin == 0x041)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stdout, \"SYSTEM format disc detected\\n\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (SectorIDMin == 0x0c1)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stdout, \"DATA format disc detected\\n\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stderr, \"format not detected\\n\");\r\n\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!UsesBasicCommand)\r\n\t\t\t\t{\r\n\t\t\t\t\tfprintf(stdout, \"No BASIC command specified\\n\");\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tfprintf(stdout, \"BASIC command: %s\\n\", BasicCommand);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (nResultCode == 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tposition.CurrentPhysicalTrack = 0;\r\n\t\t\t\t\tposition.CurrentSectorID = SectorIDMin;\r\n\r\n\t\t\t\t\tFILE *fhOut = fopen(Filenames[1], \"wb\");\r\n\t\t\t\t\tif (fhOut)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFILE *fhBinary = NULL;\r\n\t\t\t\t\t\tlong BinaryFileLength = 0;\r\n\r\n\t\t\t\t\t\tint Chunk = 0;\r\n\t\t\t\t\t\tuint32_t CartLength =\r\n\t\t\t\t\t\t\t/* all chunks and the riff chunks for each */\r\n\t\t\t\t\t\t\t(NUM_CHUNKS*(CART_CHUNK_LENGTH + RIFF_CHUNK_HEADER_SIZE)) +\r\n\t\t\t\t\t\t\t/* main header*/\r\n\t\t\t\t\t\t\tRIFF_CHUNK_HEADER_SIZE +\r\n\t\t\t\t\t\t\t/* Ams! marker */\r\n\t\t\t\t\t\t\tsizeof(uint32_t);\r\n\r\n\t\t\t\t\t\tWriteTag(fhOut, RIFFTag);\r\n\t\t\t\t\t\tWriteChunkLengthLittleEndian(fhOut, CartLength - RIFF_CHUNK_HEADER_SIZE);\r\n\t\t\t\t\t\tWriteTag(fhOut, AmsTag);\r\n\r\n\t\t\t\t\t\tif (pBinaryFilename)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tfhBinary = fopen(pBinaryFilename, \"rb\");\r\n\t\t\t\t\t\t\tif (fhBinary != NULL)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tfseek(fhBinary, 0, SEEK_END);\r\n\t\t\t\t\t\t\t\tBinaryFileLength = ftell(fhBinary);\r\n\t\t\t\t\t\t\t\tfseek(fhBinary, 0, SEEK_SET);\r\n\t\t\t\t\t\t\t\tprintf(\"Using Binary File '%s' length %d\\n\", pBinaryFilename, (int) BinaryFileLength);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\r\n\r\n\t\t\t\t\t\tfor (Chunk = 0; Chunk < NUM_CHUNKS; Chunk++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t/* header */\r\n\t\t\t\t\t\t\tWriteCartTag(fhOut, Chunk);\r\n\t\t\t\t\t\t\tWriteChunkLengthLittleEndian(fhOut, CART_CHUNK_LENGTH);\r\n\r\n\t\t\t\t\t\t\t/* data */\r\n\r\n\t\t\t\t\t\t\tswitch (Chunk)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t/* OS ROM */\r\n\t\t\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif (WriteROM(fhOut, \"os.rom\") != 0)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t\t/* BASIC ROM */\r\n\t\t\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif (WriteROM(fhOut, \"basic.rom\") != 0)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t\t/* 464/6128 Plus has disc rom at page 3. GX4000 doesn't\r\n\t\t\t\t\t\t\thave disc page. We are therefore to change the location of the\r\n\t\t\t\t\t\t\tdisc rom page */\r\n\r\n\t\t\t\t\t\t\t/* AMSDOS ROM */\r\n\t\t\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tsize_t currentPosition;\r\n\r\n\r\n\t\t\t\t\t\t\t\tif (WriteROM(fhOut, \"amsdos.rom\") != 0)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t\t\t\tcurrentPosition = ftell(fhOut);\r\n\r\n\t\t\t\t\t\t\t\tfseek(fhOut, currentPosition, SEEK_SET);\r\n\t\t\t\t\t\t\t\tfseek(fhOut, -16384 + FILENAME_PATCH_DOS_OFFSET - 1, SEEK_CUR);\r\n\r\n\t\t\t\t\t\t\t\tif (UsesBasicCommand)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t/* marker to indicate basic command follows */\r\n\t\t\t\t\t\t\t\t\tfputc(0x0aa, fhOut);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t/* marker indicates no basic command follows */\r\n\t\t\t\t\t\t\t\t\tfputc(0x00, fhOut);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tfwrite(BasicCommand, sizeof(BasicCommand), 1, fhOut);\r\n\r\n\t\t\t\t\t\t\t\t/* write XPDB for extended format */\r\n\t\t\t\t\t\t\t\tif (UsesExtendedFormat)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tfseek(fhOut, currentPosition, SEEK_SET);\r\n\t\t\t\t\t\t\t\t\tfseek(fhOut, -16384 + SYSTEM_XPDB_OFFSET, SEEK_CUR);\r\n\t\t\t\t\t\t\t\t\tfwrite(&SupportedFormats[ChosenExtendedFormat].XPDB, sizeof(XPDB_t), 1, fhOut);\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t/* write sector id to support data or system */\r\n\t\t\t\t\t\t\t\tfseek(fhOut, currentPosition, SEEK_SET);\r\n\t\t\t\t\t\t\t\tfseek(fhOut, -16384 + SECTOR_ID_PATCH_DOS_OFFSET, SEEK_CUR);\r\n\t\t\t\t\t\t\t\tif (UsesExtendedFormat)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t/* extended format replaces system */\r\n\t\t\t\t\t\t\t\t\tfputc((uint8_t)0x041, fhOut);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tfputc((uint8_t)SectorIDMin, fhOut);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tfseek(fhOut, currentPosition, SEEK_SET);\r\n\r\n\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tint BeforePosition = ftell(fhOut);\r\n\t\t\t\t\t\t\t\tint AfterPosition;\r\n\t\t\t\t\t\t\t\tint bIsDiskDone = IsDiskDone(&position);\r\n\r\n\r\n\t\t\t\t\t\t\t\tif (bIsDiskDone)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tPadPage(fhOut, CART_CHUNK_LENGTH);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tWriteSectorDataToCartridgePage(fhOut, DiskImageDataBlock.pData, &position);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tAfterPosition = ftell(fhOut);\r\n\r\n\t\t\t\t\t\t\t\tif (Chunk >= BINARY_CART_PAGE)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tif (fhBinary)\r\n\t\t\t\t\t\t\t\t\t{\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (BinaryFileLength != 0)\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\tif (!bIsDiskDone)\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfprintf(stdout, \"Warning binary file is overwriting disc data in chunk %d\\n\", Chunk);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tfseek(fhOut, BeforePosition, SEEK_SET);\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t/* we have data to write, write it */\r\n\t\t\t\t\t\t\t\t\t\t\t\tint b = 0;\r\n\t\t\t\t\t\t\t\t\t\t\t\tlong LengthToWrite = BinaryFileLength;\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (LengthToWrite > CART_CHUNK_LENGTH)\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tLengthToWrite = CART_CHUNK_LENGTH;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\tfor (b = 0; b < LengthToWrite; b++)\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tchar ch = fgetc(fhBinary);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfputc(ch, fhOut);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\tBinaryFileLength -= LengthToWrite;\r\n\t\t\t\t\t\t\t\t\t\t\t\tif ((BinaryFileLength == 0) && (LengthToWrite != 0))\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t/* pad to end of page if required */\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tPadPage(fhOut, CART_CHUNK_LENGTH - LengthToWrite);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\tfseek(fhOut, AfterPosition, SEEK_SET);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// report if binary file is too long\r\n\t\t\t\t\t\tif (fhBinary && BinaryFileLength != 0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tfprintf(stderr, \"Binary file is too large to write to cartridge. %d bytes remaining\\n\", (int) BinaryFileLength);\r\n\t\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// report if disc image is too long\r\n\t\t\t\t\t\tif (!IsDiskDone(&position))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tfprintf(stderr, \"Disc image is too large to write to cartridge (finished at track %d sector &%02x\\n\", position.CurrentPhysicalTrack, position.CurrentSectorID);\r\n\t\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (fhBinary)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tfclose(fhBinary);\r\n\t\t\t\t\t\t\tfhBinary = NULL;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfclose(fhOut);\r\n\r\n\t\t\t\t\t\tfprintf(stdout, \"Cartridge file written to '%s'\\n\", Filenames[1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfprintf(stderr, \"Failed to open output file '%s'\", Filenames[1]);\r\n\t\t\t\t\t\tnResultCode = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n      }\r\n         if (DiskImageDataBlock.pData!=NULL)\r\n    {\r\n      free(DiskImageDataBlock.pData);\r\n    }\r\n    }\r\n  }\r\n   return nResultCode;\r\n}\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/makefile",
    "content": "# Makefile for NOCART utility\n\n.PHONY: clean\n\nCC = gcc\nBIND = gcc\nRM = rm\n\n#   CFLAGS    flags for C compile\n#   LFLAGS1   flags after output file spec, before obj file list\n#   LFLAGS2   flags after obj file list (libraries, etc)\n\nCFLAGS = -O2 -O3\nLFLAGS1 =\nLFLAGS2 = -s \n\nNOCART_O=\topth.o main.o \n\nNOCART: $(NOCART_O)\r\n\t$(BIND)  $(NOCART_O) -o nocart $(LFLAGS1) $(LFLAGS2) $(LIBS)\n\nclean:\n\trm -rf *.o\n\trm -rf *.exe\n\trm -rf nocart\n\t"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/nocart.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2013\r\nVisualStudioVersion = 12.0.31101.0\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"nocart\", \"nocart.vcxproj\", \"{C5388336-6E87-4541-B4E6-0C902663BB60}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{C5388336-6E87-4541-B4E6-0C902663BB60}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{C5388336-6E87-4541-B4E6-0C902663BB60}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{C5388336-6E87-4541-B4E6-0C902663BB60}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{C5388336-6E87-4541-B4E6-0C902663BB60}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/nocart.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{C5388336-6E87-4541-B4E6-0C902663BB60}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>nocart</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v140_xp</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v140_xp</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"main.cpp\" />\r\n    <ClCompile Include=\"opth.c\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/nocart.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Resource Files\">\r\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"main.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"opth.c\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/opth.c",
    "content": "/* \r\n * (c) Kevin Thacker 2002\r\n *\r\n *  This program is free software; you can redistribute it and/or modify\r\n *  it under the terms of the GNU General Public License as published by\r\n *  the Free Software Foundation; either version 2 of the License, or\r\n *  (at your option) any later version.\r\n *\r\n *  This program is distributed in the hope that it will be useful,\r\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n *  GNU General Public License for more details.\r\n *\r\n *  You should have received a copy of the GNU General Public License\r\n *  along with this program; if not, write to the Free Software\r\n *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r\n */\r\n#include \"opth.h\"\r\n#include <string.h>\r\n#include <ctype.h>\r\n\r\n/*-------------------------------*/\r\n/* all characters must be digits */\r\n\r\n/* return 0 for not a number, 1 for is a number */\r\nint Option_VerifyDecimalNumber(const char *pOptionName)\r\n{\r\n\tunsigned long i;\r\n\r\n\tif (pOptionName==NULL)\r\n\t\treturn 0;\r\n\r\n\tfor (i=0; i<strlen(pOptionName); i++)\r\n\t{\r\n\t\tif (!isdigit(pOptionName[i]))\r\n\t\t\treturn 0;\r\n\t}\r\n\t\r\n\treturn 1;\r\n}\r\n\r\n\r\n/*----------------------------*/\r\n/* locate option data in list */\r\nstatic OPTION *Option_LookUp(OPTION *pOptionTable, const char *pOptionName)\r\n{\r\n\tOPTION *pOption;\r\n\r\n\tpOption = pOptionTable;\r\n\t\r\n\twhile (pOption->option_string!=NULL)\r\n\t{\r\n\t\t/* name matches? */\r\n\t\tif (strcmp(pOption->option_string,pOptionName)==0)\r\n\t\t{\r\n\t\t\t/* return this option */\r\n\t\t\treturn pOption;\r\n\t\t}\r\n\t\t\r\n\t\tpOption++;\r\n\t}\r\n\r\n\t/* option not found! */\r\n\treturn NULL;\r\n}\r\n\r\n/*----------------------------------*/\r\n/* initialise argument list handler */\r\nstatic void\tArgumentData_Initialise(ARGUMENT_DATA *pHandler,const int argc, const char **argv)\r\n{\r\n\t/* setup count - argument 0 is the name of the program run */\r\n\tpHandler->Count = 1;\r\n\t/* number of arguments specified */\r\n\tpHandler->argc = argc;\r\n\t/* pointer to each argument */\r\n\tpHandler->argv = argv;\r\n}\r\n\r\n/*----------------------------------------------*/\r\n/* get next item from list */\r\n/* returns NULL if no more arguments available, otherwise returns the argument */\r\nconst char *ArgumentList_GetNext(ARGUMENT_DATA *pHandler)\r\n{\r\n\t/* while there are arguments remaining */\r\n\twhile (pHandler->Count<pHandler->argc)\r\n\t{\r\n\t\tpHandler->Count++;\r\n\t\t\r\n\t\treturn pHandler->argv[pHandler->Count-1];\r\n\t}\r\n\r\n\t/* no more available */\r\n\treturn NULL;\r\n}\r\n\r\n\r\nstatic void ArgumentList_OutputError(int Code, const char *pOptionText, ERROR_FUNCTION pErrorFunction)\r\n{\r\n\tswitch (Code)\r\n\t{\r\n\t\tcase OPTION_NOT_HANDLED:\r\n\t\t{\r\n\t\t\tpErrorFunction(\"Option \\\"%s\\\" is not handled!\\n\",pOptionText);\r\n\t\t}\r\n\t\tbreak;\r\n\r\n\t\tcase OPTION_NOT_RECOGNISED:\r\n\t\t{\r\n\t\t\tpErrorFunction(\"Option \\\"%s\\\" is not recognised!\\n\",pOptionText);\r\n\t\t}\r\n\t\tbreak;\r\n\r\n\t\tcase OPTION_MISSING_PARAMETER:\r\n\t\t{\r\n\t\t\tpErrorFunction(\"Option \\\"%s\\\" is missing parameter(s)!\\n\",pOptionText);\r\n\t\t}\r\n\t\tbreak;\r\n\t\tcase OPTION_BAD_VALUE:\r\n\t\t{\r\n\t\t\tpErrorFunction(\"Option \\\"%s\\\" has an invalid value!\\n\",pOptionText);\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/*----------------------------------------------*/\r\n/* execute all options - 0 if no error occured */\r\nint ArgumentList_Execute(const int argc, const char **argv,OPTION *pOptionTable, ERROR_FUNCTION pOutputError, int (*pNonOptionHandler)(const char *pArgument))\r\n{\r\n\tconst char *pOptionText;\r\n\tARGUMENT_DATA ArgumentData;\r\n\r\n\tArgumentData_Initialise(&ArgumentData, argc, argv);\r\n\t\r\n\tpOptionText = ArgumentList_GetNext(&ArgumentData);\r\n\r\n\twhile (pOptionText)\t\r\n\t{\r\n\t\tOPTION *pOption;\r\n\r\n\t\t/* does this string begin with the option char? */\r\n\t\tif (pOptionText[0]=='-')\r\n\t\t{\r\n\t\t\t/* check option string is not just \"-\" */\r\n\t\t\tif (pOptionText[1]!='\\0')\r\n\t\t\t{\r\n\t\t\t\t/* look up */\r\n\t\t\t\tpOption  = Option_LookUp(pOptionTable, &pOptionText[1]);\r\n\t\t\t\r\n\t\t\t\tif (pOption!=NULL) \r\n\t\t\t\t{\r\n\t\t\t\t\t/* handler function exists? */\r\n\t\t\t\t\tif (pOption->pOptionFunction!=NULL)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint Status;\r\n\r\n\t\t\t\t\t\t/* execute handler function */\r\n\t\t\t\t\t\tStatus = pOption->pOptionFunction(&ArgumentData);\r\n\r\n\t\t\t\t\t\tif (Status!=OPTION_OK)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tArgumentList_OutputError(Status, pOptionText, pOutputError);\r\n\r\n\t\t\t\t\t\t\treturn Status;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tArgumentList_OutputError(OPTION_NOT_HANDLED, pOptionText, pOutputError);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\treturn OPTION_NOT_HANDLED;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\t/* option not found in the list; therefore option is not recognised */\r\n\t\t\t\t\tArgumentList_OutputError(OPTION_NOT_RECOGNISED, pOptionText, pOutputError);\r\n\r\n\t\t\t\t\treturn OPTION_NOT_RECOGNISED;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t/* option was not recognised! */\r\n\t\t\t\tArgumentList_OutputError(OPTION_NOT_HANDLED, pOptionText, pOutputError);\r\n\t\t\t\t\r\n\t\t\t\treturn OPTION_NOT_RECOGNISED;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif (pNonOptionHandler)\r\n\t\t\t\tpNonOptionHandler(pOptionText);\r\n\t\t}\r\n\r\n\t\tpOptionText = ArgumentList_GetNext(&ArgumentData);\r\n\t}\r\n\r\n\t/* no errors */\r\n\treturn OPTION_OK;\r\n}\r\n\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/opth.h",
    "content": "/* \n * (c) Kevin Thacker 2002\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n */\n#ifndef __OPTION_HANDLER_HEADER_INCLUDED__\n#define __OPTION_HANDLER_HEADER_INCLUDED__\n\n#ifndef NULL\n#define NULL 0\n#endif\n\ntypedef enum\n{\n\t/* no error */\n\tOPTION_OK,\n\t/* option specified, but not recognised */\n\tOPTION_NOT_RECOGNISED,\n\t/* option exists, but is not handled */\n\tOPTION_NOT_HANDLED,\n\t/* option is missing a parameter */\n\tOPTION_MISSING_PARAMETER,\n\t/* option is the wrong type */\n\tOPTION_WRONG_TYPE,\n\t/* bad value */\n\tOPTION_BAD_VALUE,\n} OPTION_ENUM;\n\ntypedef struct\n{\n\t/* count of current argument */\n\tint Count;\n\t/* number of args */\n\tint argc;\n\t/* argument array */\n\tconst char **argv;\n} ARGUMENT_DATA;\n\ntypedef int (*ERROR_FUNCTION)(const char *pErrorText, ...);\n\ntypedef struct\n{\n\t/* name of option */\n\tconst char *option_string;\n\t/* function to handle option */\n\tint (*pOptionFunction)(ARGUMENT_DATA *pHandler);\n} OPTION;\n\n/* execute the argument list */\nint ArgumentList_Execute(const int argc, const char **argv,OPTION *pOptionTable, ERROR_FUNCTION pOutputError, int (*pNonOptionHandler)(const char *pArgument));\n\n/* get next string in argument list */\nconst char *ArgumentList_GetNext(ARGUMENT_DATA *pHandler);\n\n/* very option is a decimal number */\nint Option_VerifyDecimalNumber(const char *pOptionName);\n\n#endif\n\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/patchbasic.asm",
    "content": "org &c000\r\nincbin \"original/basic.rom\"\r\n\r\norg &c033\r\n;; truncate BASIC's 'BASIC v1.1' startup message.\r\ndefb 0\r\n\r\norg &c0d7\r\n;; truncate BASIC's 'Ready' prompt\r\ndefb 0\r\n\r\norg &caf9\r\ncall &d583\t\r\n\r\norg &d583\r\nld hl,&ac8a\r\nld a,&aa\r\ncp (hl)\r\nret nz\r\npop af\r\nld (hl),' '\r\nscf\r\nret"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/patchdos.asm",
    "content": "org &c000\r\n\r\nincbin \"original/amsdos.rom\"\r\n\r\norg &c5f2\r\ndefs &c601-$\r\n\r\n;;--------------------------------------------------------\r\norg &c56c\r\n;; force DATA format disc auto-detect\r\nld a,&c1\t\t;; sector ID for data format\r\ndefb &18\r\ndefb &c581-$-1\r\n\r\n;;--------------------------------------------------------\r\n;; do not send specify to FDC\r\n;; GX4000 will hang if attempt is made to send specify\r\norg &c615\r\nret\r\n\r\n;;--------------------------------------------------------\r\n;; patch BIOS: get drive status\r\n;; check current track\r\n;; report if on track 0.\r\n;; report write protected\r\n;; report ready\r\norg &c630\r\nor a\r\njr z,get_dr_status0\r\n\r\nld hl,&be4b\r\nld (hl),1\r\ninc hl\r\nld a,%01000001 ;; drive 1, not ready, not write protect\r\nld (hl),a\r\ndec hl\r\nor a\r\nret\r\n\r\nget_dr_status0:\r\npush hl\r\npush de\r\nld e,a\t\t\t\t\t\t;; drive into E\r\nld a,&16\t\t\t\t\t;; XDPB: current track\r\ncall &ca63\r\nld a,(hl)\r\nor a\r\nld d,%00010000\r\njr z,gds\r\nld d,%00000000\r\ngds:\r\nor d\r\nor %01100000\t\t\t\t\t;; write protect, drive ready\r\npop de\r\npop hl\r\nscf\r\nret\r\n\r\n;;--------------------------------------------------------\r\n\r\n;; disable BIOS: write sector\r\n;; indicate fail because it's write protected\r\norg &c64e\r\njp &c652\r\n\r\n;;--------------------------------------------------------\r\n;; disable BIOS: format track\r\n;; indicate fail because it's write protected\r\norg &c652\r\ninc e\r\ndec e\r\njr z,write_drive0\r\n;; Drive B is not ready.\r\nld a,&48\r\nld hl,&be4b\r\npush hl\r\nld (hl),2\r\ninc hl\r\nld (hl),&68\r\ninc hl\r\nld (hl),0\r\npop hl\r\nor a\r\nret\r\n\r\nwrite_drive0:\r\n;; Drive A is ready but write protected\r\nld a,&42\r\nld hl,&be4c\r\npush hl\r\nld (hl),7\r\ninc hl\r\nld (hl),&40\r\ninc hl\r\nld (hl),&2\r\ninc hl\r\nld (hl),0\r\ninc hl\r\nld (hl),d\r\ninc hl\r\nld (hl),0\r\ninc hl\r\nld (hl),c\r\ninc hl\r\nld (hl),2\r\npop hl\r\nor a\r\nret\r\n\r\n;;--------------------------------------------------------\r\n;; patch BIOS: read sector\r\norg &c666\r\njp read_sector\r\n\r\n;;--------------------------------------------------------\r\n;; patch BIOS: seek track\r\norg &c763\r\ninc e\r\ndec e\r\njr nz,seek_dr0\r\nld a,&48\r\nld hl,&be4b\r\npush hl\r\nld (hl),2\r\ninc hl\r\nld (hl),&68\r\ninc hl\r\nld (hl),0\r\npop hl\r\nor a\r\nret\r\n\r\nseek_dr0:\r\npush hl\r\nld a,&16\t\t\t\t\t;; XDPB: current track\r\ncall &ca63\r\nld (hl),d\t\t\t\t\t;; store requested track\r\npop hl\r\nxor a\r\nscf\r\nret\r\n\r\n;;--------------------------------------------------------\r\norg &dc00\r\njp install_basic_command\r\n\r\n;; this is the command to run\r\ncommand_buffer:\r\ndefb &aa\t\t\t;; indicates we have command\r\ndefb 'RUN\"FILENAME.BAS',0\r\nend_command_buffer:\r\n\r\ninstall_basic_command:\r\n;; install basic run command\r\nld      hl,command_buffer\r\nld      de,&ac8a\r\nld      bc,end_command_buffer-command_buffer\r\nldir    \r\nret\r\n\r\n\r\n;;HL contains address of sector buffer \r\n;;E contains drive number \r\n;;D contains track number \r\n;;C contains sector number\r\n\r\n;; \r\n\r\nread_sector:\r\ninc e\r\ndec e\r\njr z,read_dr0\r\n;; drive B is not ready\r\nld a,&48\r\nld hl,&be4b\r\npush hl\r\nld (hl),2\r\ninc hl\r\nld (hl),&68\r\ninc hl\r\nld (hl),0\r\npop hl\r\nor a\r\nret\r\n\r\nread_dr0:\r\ndi\r\npush    bc\r\npush    de\r\npush    hl\r\n\r\npush    hl\t\t\t;; destination\r\n\r\nld      a,c\t\t\t;; sector \r\nand     &f\t\t\t;; c1->1, c2->2, c9->9\r\ndec     a\t\t\t;; 1->0, 2->1... 9->8\r\n\r\nld      e,a\r\n\r\nld      h,0\r\nld      l,d\t;; track\r\nld \t\td,h\r\nld      b,h\r\nld \t\tc,l\r\nadd     hl,hl\t;; x2\r\nadd     hl,hl\t;; x4\r\nadd     hl,hl\t;; x8\r\nadd     hl,bc\t;; x9\r\nadd\t\thl,de\r\nadd     hl,hl\t;; x18\r\n\r\n;; address\r\nld      a,l\t\t\r\nor      &c0\r\nld      d,a\r\nld      e,&0\r\n\r\nadd     hl,hl\t;; x2\r\nadd     hl,hl\t;; x4\r\nld      a,h\t\t;; page\r\n\r\npush    de\r\n\r\n;; copy the sector copy function to ram\r\nld      hl,sector_copy\r\nld      de,&be44\r\nld      bc,end_sector_copy-sector_copy\r\nldir    \r\n\r\nadd a,&83\t\t;; base page \r\npop     hl\t\t;; source\r\npop     de\t\t;; destination\r\nld      b,&df\r\ncall    &be44\t\t;; copy sector function in ram\r\npop     hl\r\npop     de\r\npop     bc\r\nld a,0\r\nscf     \r\nei      \r\nret       \r\n\r\n\r\n;; C = 0\r\n;; DE = destination\r\n;; HL = source (in cartridge page)\r\nsector_copy:\r\nout     (c),a\t\t\t\t\t;; select cartridge page\r\nld      bc,&200\t\t\t\t\t;; 512 bytes\r\nldir    \r\nld      bc,&df82 ;; restore disc rom\r\nout     (c),c\r\nret     \r\nend_sector_copy:\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/patchos.asm",
    "content": ";; Patch CPC6128 English OS ROM\r\norg &0000\r\nincbin \"original/os.rom\"\r\n\r\norg &67d\r\n;; original:\r\n;;call &0723\r\n;;call &06fc\r\n;;ld hl,&0688\r\n;;jr   &6fc\r\n\r\n;; new:\r\ncall &b900 \t;; enable upper rom\r\n\r\nld bc,&df82\t;; select disc page (compatible with GX4000)\r\nout (c),c\r\n\r\n;; poke BASIC command into RAM\r\njp &dc00\t;; call into DOS rom\r\n\r\n;; this is placed over the copyright message; the message is no longer displayed so it's free to use\r\ncopy_high_jumpblock\r\nld      hl,&03a6            ; copy high kernel jumpblock from ROM into RAM\r\nld      de,&b900\r\nld      bc,&01e4\r\nldir\r\n\r\n;; copy our extra code for remapping ROM access\r\nld hl,bae4\r\nld de,&bae4\r\nld bc,end_bae4-bae4\r\nldir\r\nret\r\n\r\n;; this code is located at bae4 in ram and fits in a small area.\r\n;; replaces the ld b,&df: out (c),a code.\r\n\r\nbae4:\r\n;; C = rom\r\npush af\r\nld a,c\r\ncall bae4b-bae4+&bae4\r\npop af\r\nret\r\n\r\n;; replaces the ld b,&df: out (c),c\r\nbae4b:\r\npush bc\r\nld c,&82   ;; if disc rom use this page (not normal disc page)\r\ncp &7      ;; disc rom selected?\r\njr z,sel_disc_rom\r\nld c,&81 ;; choose basic page\r\nsel_disc_rom:\r\nld b,&df\r\nout (c),c ;; select page\r\npop bc\r\nret\r\nend_bae4:\r\n\r\n\r\n;; replace LDIR to copy high kernal jumpblock, we want to do more.\r\norg &0051\r\ncall copy_high_jumpblock\r\ndefs &005c-$\r\n\r\n;;------------------------------------------------------------------------\r\n;; patch RST 3 - LOW: FAR CALL\r\n;;\r\n;; we redirect ROM numbers in the range 0-15 with cartridge pages.\r\n;; In this case, we recognise ROM 7 (AMSDOS) and direct it to page we have chosen\r\n;; for DOS, all other numbers go to the BASIC page. This makes the OS on the cartridge\r\n;; think we have BASIC and AMSDOS only. The OS will not initialise ROMs on an expansion\r\n;; board unless they respond to cartridge pages. This allows games to run as if expansion\r\n;; ROMs had been disabled making the cartridge more compatible.\r\n\r\n;; patch RST 3 - LOW: FAR CALL\r\norg &480\r\n;; replacing this:\r\n\r\n;; replacing this (direct ROM select using hardware):\r\n;; 0480 06df      ld      b,$df            ; ROM select I/O port\r\n;; 0482 ed79      out     (c),a            ; select upper rom\r\n;; with this:\r\ncall bae4b-bae4+&bae4\r\nnop\r\n\r\n;; patch RST 3 - LOW: FAR CALL\r\n;; replacing this:\r\n;;04b1 06df      ld      b,$df            ; ROM select I/O port\r\n;;04b3 ed79      out     (c),a            ; restore upper rom selection\r\n\r\norg &4b1\r\ncall bae4b-bae4+&bae4\r\nnop\r\n\r\n;; common upper rom selection code.\r\norg &535\r\n;; replace this:\r\n;;0535 06df      ld      b,$df            ;; ROM select I/O port\r\n;;0537 ed49      out     (c),c            ;; select upper rom\r\n;; with this:\r\ncall &bae4\r\nnop\r\n\r\n\r\n;; patch palettes used by OS - these are toggled\r\n;; to make flashing colours.\r\n\r\n;; patch palette set 1\r\norg &1052\r\ndefb &14\t\t;; border -> black\r\ndefb &14\t\t;; pen 0 -> black\r\n\r\n;; patch palette set 2\r\norg &1063\r\ndefb &14\t\t;; border -> black\r\ndefb &14\t\t;; pen 0 -> black\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/patchroms.bat",
    "content": "set PATH=c:\\tools;%PATH%\r\npasmo --bin patchos.asm os.rom\r\npasmo --bin patchbasic.asm basic.rom\r\npasmo --bin patchdos.asm amsdos.rom\r\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/src/patchroms.sh",
    "content": "#!/bin/sh\nrm os.rom\nrm basic.rom\nrm amsdos.rom\npasmo --bin patchos.asm os.rom\npasmo --bin patchbasic.asm basic.rom\npasmo --bin patchdos.asm amsdos.rom\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/test/test.asm",
    "content": "org &4000\r\n\r\ntxt_output equ &bb5a\r\nscr_set_mode equ &bc0e\r\nkm_wait_char equ &bb06\r\n\r\nstart:\r\nld a,1\r\ncall scr_set_mode\r\nld hl,message\r\ncall display_msg\r\ncall km_wait_char\r\nrst 0\r\n\r\nmessage:\r\ndefb \"Welcome to the test\",0\r\n\r\ndisplay_msg:\r\nld a,(hl)\r\ninc hl\r\nor a\r\nret z\r\ncall txt_output\r\njr display_msg\r\n\r\njp start"
  },
  {
    "path": "tools/z88dk/cpc/nocart/test/test.bat",
    "content": "color 07\ncopy ..\\*.rom .\nset PATH=%PATH%;c:\\tools\npasmo --amsdos test.asm test.bin\nif %ERRORLEVEL% NEQ 0 goto :errorend\ncpcxfsw -f -nd test.dsk\nif %ERRORLEVEL% NEQ 0 goto :errorend\ncpcxfsw test.dsk -f -p test.bin test.bin\nif %ERRORLEVEL% NEQ 0 goto :errorend\n..\\nocart test.dsk test.cpr -c RUN\"\"\"test\nif %ERRORLEVEL% NEQ 0 goto :errorend\n..\\nocart -f\nif %ERRORLEVEL% NEQ 0 goto :errorend\ncpcxfsw -f -e format -f \"DA3A\" da3a.dsk\nif %ERRORLEVEL% NEQ 0 goto :errorend\ncpcxfsw da3a.dsk -f -p test.bin test.bin\nif %ERRORLEVEL% NEQ 0 goto :errorend\n..\\nocart -f \"DA3A\" da3a.dsk test.cpr -c RUN\"\"\"test\nif %ERRORLEVEL% NEQ 0 goto :errorend\n..\\nocart -f \"UNKN\" da3a.dsk test.cpr -c RUN\"\"\"test\nif %ERRORLEVEL% EQU 0 goto :errorend\n..\\nocart test2.dsk test.cpr -c RUN\"\"\"test\nif %ERRORLEVEL% EQU 0 goto :errorend\n..\\nocart test2.dsk -c RUN\"\"\"test\nif %ERRORLEVEL% EQU 0 goto :errorend\n..\\nocart test.dsk test.cpr -b test.bin\nif %ERRORLEVEL% NEQ 0 goto :errorend\n..\\nocart test.dsk test.cpr -b da3a.dsk \nif %ERRORLEVEL% EQU 0 goto :errorend\n\ngoto :ok\n:errorend\ncolor c7\n%COMSPEC% /C exit 1 >nul\ngoto :end\n:ok\ncolor a0\n\n%COMSPEC% /C exit 0 >nul\n:end\n\n\n\n"
  },
  {
    "path": "tools/z88dk/cpc/nocart/test/test.sh",
    "content": "#!/bin/sh\nset -eu\npasmo --amsdos test.asm test.bin\n\ncpcxfs -f -nd test.dsk\ncpcxfs test.dsk -f -p test.bin test.bin\n../nocart test.dsk test.cpr -c 'RUN\"test\"'\n\ncpcxfs -f \"DA4A\" test.dsk\ncpcxfs test.dsk -f -p test.bin test.bin\n../nocart -f \"DA4A\" test.dsk test.cpr -c 'RUN\"test\"'\n\n\n\n"
  },
  {
    "path": "tools/z88dk/einstein/EDIP1e/EDIPV1e.txt",
    "content": "EDIP VERSION 1e 22/Jan/2011 20:55\r\n\r\n1) will open an Einstein extended disk image\r\n2) and show directory of files within the image\r\n3) extract files from the disk image to a PC storage medium\r\n   i.e. MS Windows Folder on a hard drive\r\n4) create a blank disk image from existing image\r\n   using the original disk image's system tracks\r\n5) insert files into a newly created disk image\r\n   from a PC folder\r\n6) extract a copy of an Einstein disk image's system tracks\r\n   to a PC folder\r\n7) extract a raw image of just all disk image's sectors to a\r\n   PC folder in the order of the operating system's DOS.\r\n\r\nUpgrades and bug fixes from previous versions.\r\n\r\nEXTRACTED FILES CORRECTLY SIZED\r\nDisk Image files are now extracted correctly to the smallest\r\nnumber of 128 byte records. Instead of to the smallest\r\nnumber of 2kb blocks.\r\n\r\nExtracted files will now have added to their extension\r\n_EDIPv1e_ Plus DOS type\r\ni.e. myfile.txt_EDIPv1e_XTAL\r\n     myfile.txt_EDIPv1e_ZDOS\r\n     myfile.txt_EDIPv1e_CPM2\r\n     myfile.txt_EDIPv1e_CHECK or myfile.txt_EDIPv1e_NO_CHECK\r\nAll files extracted into the PC environment will be in MS DOS format\r\nDOS type only indicates the original disc images system it will not\r\nrestrict insertion of the file into a newly EDIP created images with\r\na different DOS type.\r\nFor an unrecognized DOS the CPM check box will not be greyed out\r\nthe user will then need to judge whether the Image's dos is of the XTAL or\r\nCPM type. If wrongly used the file will be corrupt and will not run in\r\nthe Einstein or under Einstein Emulation. The user should then try\r\nusing the CPM check Box with a different setting for extracting files.\r\nFiles extracted with the CPM box ticked will have \"_EDIPv1e_CHECK\" added\r\nto filename extension. Un ticked \"_EDIPv1e_NO_CHECK\" will be  added to\r\nfilename extension.\r\n\r\nDELETED FILES\r\nFiles that have been deleted during Einstein run time\r\nconditions (i.e Einstein emulation or in the physical\r\nEinstein) will be shown prefixed with four exclamation marks\r\nin the image directory i.e. !!!!MYFILE.XBS.\r\n\r\nFiles with the prefix \"!!!!\" would have been intended to be deleted \r\nby the original floppy disk owner before a disk image was made of it.\r\nIn some cases the file can be extracted by EDIP to an original file make up.\r\nOther files with the prefix \"!!!!\" could have had their original allocated\r\nsectors over written by new files written to disk after deletion. The user\r\nmust be aware that not all \"!!!!\" prefixed files can be salvaged. The only\r\nway to test \"!!!!\" prefixed files are not corrupt is to use them under run\r\ntime conditions.   \r\n\r\nICON ON THE TASK BAR and ADDED WINDOW\r\nEDIP now opens a window with a black back ground. When a\r\ndisk image is opened the dialogue box holding its directory\r\nwill be positioned on the window.\r\n\r\nCP/M 2.2 and ZDOS Disc Images\r\nThese files use a different format in the directory of extents\r\nin the extended disk image for allocating blocks than XTAL.\r\nPrevious EDIP versions did not take this fully into account\r\nsmall files apparently were extracted or inserted ok for use\r\nbut larger files became corrupted. This has now been fixed.\r\n\r\nTHE CPM CHECK BOX\r\nIn previous EDIP versions the CPM check box in EDIP was needed by\r\nthe user when the image's O/S is known. Left unchecked for Xtal\r\nsystems ticked for CP/M and ZDOS. An exception to this were blank\r\nimages created and distributed with EDIP. Copies of these images\r\nmade with EDIP for inserting files would automatically have the\r\ncheck box configured and greyed out for the correct operating system.\r\n\r\n*EDIP version 1e now reads specific areas in the system tracks of\r\nan opened disk image to identify known DOSs and set the CPM check\r\nbox automatically.\r\nKnown DOSs Recognized\r\nTATUNG/XtalDOS 1.11\r\nXtalDOS 1.31,\r\nXtalDOS 2.05,\r\nCP/M 2.2 EINSTEIN ver 1.2,\r\nZdos 1.61,\r\nTatung Xtal DOS80\r\n\r\nDISK IMAGE DETAILS DROP DOWN BOX\r\nVERSION 1e\r\n1: will display known DOS of Image + original software that\r\ncreated the image i.e.\r\n\"DOS XtalDOS 2.05   Origin CPDRead v3.24\"\r\n2: will display confirmation for extended image file.\r\nIf it is a copy created by EDIP\r\n\"EXTENDED CPC DSK File- EDIP COPY  OK\"\r\nFor an original disk image.\r\n\"EXTENDED CPC DSK File- Disk-Info OK\"\r\n3: Tracks per Side\r\n4: Sectors per Track\r\n5: Sector Size bytes\r\n6: Sides per disc\r\n7: FLOPPY DRIVE Sides Used\r\nnote: 1:Some disk images can be corrupted by being twice the size\r\n      they should be.\r\n      2:Some Einstein users added a hardware switch to use both\r\n      sides of a 3.5 floppy for single side side format.\r\n8: Side 1 1st track Sector Sequence\r\n9: For double side disks Side 2 1st track Sector Sequence\r\nnote: Side 2 1st track Sector Sequence will only be shown for\r\n      double side discs.\r\n      Sector numbers for side 2 usually incremented from side 1.\r\n      Sector scew can vary. Some Einstein users have modified\r\n      FORMAT.COM to create their own sector scew.\r\n      Disc Images created by EinTrans do not have sectors scewed.\r\n\r\nDrive Configuration\r\nA new feature added since version 1d is the drive\r\nconfiguration shown in EDIP's disk details drop down box. example \"Drives\r\nConfigured S40 S40 S40 S40\" Reading from left to right the first \"S40\" will mean\r\nboot drive 0/A is single side 40 track format. The second, third and forth S40\r\nwould mean dives 1/B 2/C 3/D would also be side 40 track format. Each settings\r\ncould be different and shown as S40 single side 40 track, D40 double side 40\r\ntrack, S80 single side 80 track, D80 double side 80 track.\r\n\r\nNote for use Within the system tracks of an Einstein floppy disk and an extended\r\ndisk image made from it there is one byte which according to its value will\r\ninitial disk parameter blocks and disk header blocks when loaded into RAM to\r\nread and write up to four differently formatted floppy drives.\r\n\r\nThe Einstein computer has the ability to read and write to floppy drives\r\nconfigured for single side 40 track, single side 80 track, single side 80 track\r\nand double side 80 track . Up to four floppy drives can all be set to a\r\ndifferent setting for sides and tracks according to to the byte in the boot\r\ndisk.\r\n\r\nEDIP version 1e displays the drive configuration in the drop down disk image\r\ndetails box. Example \"Drives Configured S40 S40 S40 S40\" will be shown for the\r\nstandard Einstein format used with the original one or two single side only flip\r\nover three inch floppy drives built into the Einstein TC01 when purchased.\r\n\r\nWith a mix of original single side only, flip over three inch floppy drives for\r\nthe Einstein and modern double side floppy drives, a boot disk could miss match\r\nthe format configuration for a particular four drive set up. e.g. configure a\r\nsingle side only three inch drive as a double side disk. For those new to the\r\nEinstein with a mix of drives it is recommended that they use only disk images\r\nwhich configure all Einstein floppy drives to single side 40 track for creating\r\nboot disks.\r\n\r\nExamples \"Drives Configured S40 S40 S40 S40\" A safe mode for all mixed drive set\r\nups.\r\n\r\n\r\n\"Drives Configured S40 S40 D80 D80\" This configuration could have been\r\ntransferred to a single side three inch boot floppy. It is a safe mode where\r\ndrive 0/A and 1/B are the original single side floppy drives built into the\r\nEinstein TC01. Later three and a half inch drives can be added to the external\r\nfloppy drive port for double side 80 track format.\r\n\r\n\"Drives Configured D80 D80 D80 S40\" This configuration will not work where the\r\nboot drive is a single side only three inch drive. The configuration needs\r\nmanually for the Einstein TC01 to be opened up and the hardware settings for\r\nfloppy drives to be altered so at least the boot drive 0/A is an external three\r\nand a half inch drive and one internal or external single side only three inch\r\ndrive is 3/D. This will enable one double side floppy and one three inch single\r\nside floppy to be read. Ideally three three and half inch drives should be\r\nattached externally and one three inch internal drive set to 3/C. This set up\r\nhas been popular with einstein users who are transferring all their Einstein\r\nsoftware to double side 80 track floppies and want to keep the option of three\r\ninch floppy drive access for further transfers.\r\n\r\n\"SYS\" BUTTON Extract a copy of an Einstein disk image's system tracks. Twenty\r\nsectors of the first two tracks are extracted from the disk image to a file in a\r\nwindows folder. The file name will be the same as the disk image it is extracted\r\nfrom. The file extension will be SYS_Einstein. Example disk image name\r\n\"name.dsk\" extracted file \"name.SYS_EINSTEIN\".\r\n\r\n\"RAW\" BUTTON Extracts a file from the disk image into a windows folder of all\r\nsectors and only sectors. Extended disk image header and track headers are\r\nexcluded. The sectors are in order of the way they would be accessed by the\r\nEinstein computer. Sectors are in sequence according to track by track order and\r\nsector ID eliminating sector scew. The file name will be the same as the disk\r\nimage it is extracted from. The file extension will RAW_EINSTEIN. Example disk\r\nimage name \"name.dsk\" extracted file \"name.RAW_EINSTEIN\".\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/einstein/EDIP1e/README.txt",
    "content": "IN THE ZIP ARCHIVE\r\n\r\nEDIPv1e.exe EDIP version 1e\r\n\r\nEDIPV1e.txt listed updates,\r\n\r\nExtension_Trim.exe\r\nThis program simply renames a file to have only thee\r\ncharacters for its extension.\r\ne.g. An Einstein file extracted by EDIP\r\nD:\\Einsteinfiles\\Disc1\\COPY   .COM_EDIPv1e_XTAL\r\nto\r\nD:\\Einsteinfiles\\Disc1\\COPY   .COM\r\nOther files which only have three character extensions will not\r\nbe altered.\r\nCaution with other MS files\r\ni.e. *.html will be changed to *.htm\r\n\r\nTESTlge.txt A text file used for testing Edip extraction\r\nand insertion with a HEX editor.\r\nWhen viewed in a Hex editor displaying offset, 16 bytes and ascii text.\r\nA text value should match that of the offset.\r\n0x0000 3030 3030 424C 3043 4B2D 3030 3030 0D0A 0000BLOCK_0000..\r\n0x0010 3030 3130 2D2D 2D2D 4254 2D2D 2D2D 0D0A 0010____BT____..\r\n0x0020 3030 3230 2D2D 2D2D 4254 2D2D 2D2D 0D0A 0020____BT____..\r\n  |..|                 same as                 |..|\r\n\r\nThe last line will show an offset of 0x8800.\r\nIf the file is inserted into a disk image by EDIP\r\nthen a copy of TESTlge.txt is extracted from the image\r\nthe new file will be increased in size rounded up to\r\nthe nearest 128 byte sector. This complies to the CP/M\r\noperating systems. Additional bytes having the value\r\n&00. This is correct any thing else will show\r\ncorruption when viewed with an HEX editor.\r\nThe last line of the extracted file will show an offset\r\nof 0x8870.\r\n\r\nIn the Einstein if the Xtal DOS LOAD TESTlge.txt command\r\nis used then MOS tabulate command used the offset should\r\nshow a value a &100 greater than that shown in the text\r\npart of the table.\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tools/z88dk/einstein/EDIP1e/TESTlge.TXT",
    "content": "0000BL0CK-0000\r\n0010----BT----\r\n0020----BT----\r\n0030----BT----\r\n0040----BT----\r\n0050----BT----\r\n0060----BT----\r\n0070----BT----\r\n0080----BT----\r\n0090----BT----\r\n00A0----BT----\r\n00B0----BT----\r\n00C0----BT----\r\n00D0----BT----\r\n00E0----BT----\r\n00F0----BT----\r\n0100----BT----\r\n0110----BT----\r\n0120----BT----\r\n0130----BT----\r\n0140----BT----\r\n0150----BT----\r\n0160----BT----\r\n0170----BT----\r\n0180----BT----\r\n0190----BT----\r\n01A0----BT----\r\n01B0----BT----\r\n01C0----BT----\r\n01D0----BT----\r\n01E0----BT----\r\n01F0----BT----\r\n0200SECTR-0001\r\n0210----BT----\r\n0220----BT----\r\n0230----BT----\r\n0240----BT----\r\n0250----BT----\r\n0260----BT----\r\n0270----BT----\r\n0280----BT----\r\n0290----BT----\r\n02A0----BT----\r\n02B0----BT----\r\n02C0----BT----\r\n02D0----BT----\r\n02E0----BT----\r\n02F0----BT----\r\n0300----BT----\r\n0310----BT----\r\n0320----BT----\r\n0330----BT----\r\n0340----BT----\r\n0350----BT----\r\n0360----BT----\r\n0370----BT----\r\n0380----BT----\r\n0390----BT----\r\n03A0----BT----\r\n03B0----BT----\r\n03C0----BT----\r\n03D0----BT----\r\n03E0----BT----\r\n03F0----BT----\r\n0400SECTR-0002\r\n0410----BT----\r\n0420----BT----\r\n0430----BT----\r\n0440----BT----\r\n0450----BT----\r\n0460----BT----\r\n0470----BT----\r\n0480----BT----\r\n0490----BT----\r\n04A0----BT----\r\n04B0----BT----\r\n04C0----BT----\r\n04D0----BT----\r\n04E0----BT----\r\n04F0----BT----\r\n0500----BT----\r\n0510----BT----\r\n0520----BT----\r\n0530----BT----\r\n0540----BT----\r\n0550----BT----\r\n0560----BT----\r\n0570----BT----\r\n0580----BT----\r\n0590----BT----\r\n05A0----BT----\r\n05B0----BT----\r\n05C0----BT----\r\n05D0----BT----\r\n05E0----BT----\r\n05F0----BT----\r\n0600SECTR-0003\r\n0610----BT----\r\n0620----BT----\r\n0630----BT----\r\n0640----BT----\r\n0650----BT----\r\n0660----BT----\r\n0670----BT----\r\n0680----BT----\r\n0690----BT----\r\n06A0----BT----\r\n06B0----BT----\r\n06C0----BT----\r\n06D0----BT----\r\n06E0----BT----\r\n06F0----BT----\r\n0700----BT----\r\n0710----BT----\r\n0720----BT----\r\n0730----BT----\r\n0740----BT----\r\n0750----BT----\r\n0760----BT----\r\n0770----BT----\r\n0780----BT----\r\n0790----BT----\r\n07A0----BT----\r\n07B0----BT----\r\n07C0----BT----\r\n07D0----BT----\r\n07E0----BT----\r\n07F0----BT----\r\n0800BL0CK-0004\r\n0810----BT----\r\n0820----BT----\r\n0830----BT----\r\n0840----BT----\r\n0850----BT----\r\n0860----BT----\r\n0870----BT----\r\n0880----BT----\r\n0890----BT----\r\n08A0----BT----\r\n08B0----BT----\r\n08C0----BT----\r\n08D0----BT----\r\n08E0----BT----\r\n08F0----BT----\r\n0900----BT----\r\n0910----BT----\r\n0920----BT----\r\n0930----BT----\r\n0940----BT----\r\n0950----BT----\r\n0960----BT----\r\n0970----BT----\r\n0980----BT----\r\n0990----BT----\r\n09A0----BT----\r\n09B0----BT----\r\n09C0----BT----\r\n09D0----BT----\r\n09E0----BT----\r\n09F0----BT----\r\n0A00SECTR-0005\r\n0A10----BT----\r\n0A20----BT----\r\n0A30----BT----\r\n0A40----BT----\r\n0A50----BT----\r\n0A60----BT----\r\n0A70----BT----\r\n0A80----BT----\r\n0A90----BT----\r\n0AA0----BT----\r\n0AB0----BT----\r\n0AC0----BT----\r\n0AD0----BT----\r\n0AE0----BT----\r\n0AF0----BT----\r\n0B00----BT----\r\n0B10----BT----\r\n0B20----BT----\r\n0B30----BT----\r\n0B40----BT----\r\n0B50----BT----\r\n0B60----BT----\r\n0B70----BT----\r\n0B80----BT----\r\n0B90----BT----\r\n0BA0----BT----\r\n0BB0----BT----\r\n0BC0----BT----\r\n0BD0----BT----\r\n0BE0----BT----\r\n0BF0----BT----\r\n0C00SECTR-0006\r\n0C10----BT----\r\n0C20----BT----\r\n0C30----BT----\r\n0C40----BT----\r\n0C50----BT----\r\n0C60----BT----\r\n0C70----BT----\r\n0C80----BT----\r\n0C90----BT----\r\n0CA0----BT----\r\n0CB0----BT----\r\n0CC0----BT----\r\n0CD0----BT----\r\n0CE0----BT----\r\n0CF0----BT----\r\n0D00----BT----\r\n0D10----BT----\r\n0D20----BT----\r\n0D30----BT----\r\n0D40----BT----\r\n0D50----BT----\r\n0D60----BT----\r\n0D70----BT----\r\n0D80----BT----\r\n0D90----BT----\r\n0DA0----BT----\r\n0DB0----BT----\r\n0DC0----BT----\r\n0DD0----BT----\r\n0DE0----BT----\r\n0DF0----BT----\r\n0E00SECTR-0007\r\n0E10----BT----\r\n0E20----BT----\r\n0E30----BT----\r\n0E40----BT----\r\n0E50----BT----\r\n0E60----BT----\r\n0E70----BT----\r\n0E80----BT----\r\n0E90----BT----\r\n0EA0----BT----\r\n0EB0----BT----\r\n0EC0----BT----\r\n0ED0----BT----\r\n0EE0----BT----\r\n0EF0----BT----\r\n0F00----BT----\r\n0F10----BT----\r\n0F20----BT----\r\n0F30----BT----\r\n0F40----BT----\r\n0F50----BT----\r\n0F60----BT----\r\n0F70----BT----\r\n0F80----BT----\r\n0F90----BT----\r\n0FA0----BT----\r\n0FB0----BT----\r\n0FC0----BT----\r\n0FD0----BT----\r\n0FE0----BT----\r\n0FF0----BT----\r\n1000BL0CK-0008\r\n1010----BT----\r\n1020----BT----\r\n1030----BT----\r\n1040----BT----\r\n1050----BT----\r\n1060----BT----\r\n1070----BT----\r\n1080----BT----\r\n1090----BT----\r\n10A0----BT----\r\n10B0----BT----\r\n10C0----BT----\r\n10D0----BT----\r\n10E0----BT----\r\n10F0----BT----\r\n1100----BT----\r\n1110----BT----\r\n1120----BT----\r\n1130----BT----\r\n1140----BT----\r\n1150----BT----\r\n1160----BT----\r\n1170----BT----\r\n1180----BT----\r\n1190----BT----\r\n11A0----BT----\r\n11B0----BT----\r\n11C0----BT----\r\n11D0----BT----\r\n11E0----BT----\r\n11F0----BT----\r\n1200SECTR-0009\r\n1210----BT----\r\n1220----BT----\r\n1230----BT----\r\n1240----BT----\r\n1250----BT----\r\n1260----BT----\r\n1270----BT----\r\n1280----BT----\r\n1290----BT----\r\n12A0----BT----\r\n12B0----BT----\r\n12C0----BT----\r\n12D0----BT----\r\n12E0----BT----\r\n12F0----BT----\r\n1300----BT----\r\n1310----BT----\r\n1320----BT----\r\n1330----BT----\r\n1340----BT----\r\n1350----BT----\r\n1360----BT----\r\n1370----BT----\r\n1380----BT----\r\n1390----BT----\r\n13A0----BT----\r\n13B0----BT----\r\n13C0----BT----\r\n13D0----BT----\r\n13E0----BT----\r\n13F0----BT----\r\n1400SECTR-0010\r\n1410----BT----\r\n1420----BT----\r\n1430----BT----\r\n1440----BT----\r\n1450----BT----\r\n1460----BT----\r\n1470----BT----\r\n1480----BT----\r\n1490----BT----\r\n14A0----BT----\r\n14B0----BT----\r\n14C0----BT----\r\n14D0----BT----\r\n14E0----BT----\r\n14F0----BT----\r\n1500----BT----\r\n1510----BT----\r\n1520----BT----\r\n1530----BT----\r\n1540----BT----\r\n1550----BT----\r\n1560----BT----\r\n1570----BT----\r\n1580----BT----\r\n1590----BT----\r\n15A0----BT----\r\n15B0----BT----\r\n15C0----BT----\r\n15D0----BT----\r\n15E0----BT----\r\n15F0----BT----\r\n1600SECTR-0011\r\n1610----BT----\r\n1620----BT----\r\n1630----BT----\r\n1640----BT----\r\n1650----BT----\r\n1660----BT----\r\n1670----BT----\r\n1680----BT----\r\n1690----BT----\r\n16A0----BT----\r\n16B0----BT----\r\n16C0----BT----\r\n16D0----BT----\r\n16E0----BT----\r\n16F0----BT----\r\n1700----BT----\r\n1710----BT----\r\n1720----BT----\r\n1730----BT----\r\n1740----BT----\r\n1750----BT----\r\n1760----BT----\r\n1770----BT----\r\n1780----BT----\r\n1790----BT----\r\n17A0----BT----\r\n17B0----BT----\r\n17C0----BT----\r\n17D0----BT----\r\n17E0----BT----\r\n17F0----BT----\r\n1800BL0CK-0012\r\n1810----BT----\r\n1820----BT----\r\n1830----BT----\r\n1840----BT----\r\n1850----BT----\r\n1860----BT----\r\n1870----BT----\r\n1880----BT----\r\n1890----BT----\r\n18A0----BT----\r\n18B0----BT----\r\n18C0----BT----\r\n18D0----BT----\r\n18E0----BT----\r\n18F0----BT----\r\n1900----BT----\r\n1910----BT----\r\n1920----BT----\r\n1930----BT----\r\n1940----BT----\r\n1950----BT----\r\n1960----BT----\r\n1970----BT----\r\n1980----BT----\r\n1990----BT----\r\n19A0----BT----\r\n19B0----BT----\r\n19C0----BT----\r\n19D0----BT----\r\n19E0----BT----\r\n19F0----BT----\r\n1A00SECTR-0013\r\n1A10----BT----\r\n1A20----BT----\r\n1A30----BT----\r\n1A40----BT----\r\n1A50----BT----\r\n1A60----BT----\r\n1A70----BT----\r\n1A80----BT----\r\n1A90----BT----\r\n1AA0----BT----\r\n1AB0----BT----\r\n1AC0----BT----\r\n1AD0----BT----\r\n1AE0----BT----\r\n1AF0----BT----\r\n1B00----BT----\r\n1B10----BT----\r\n1B20----BT----\r\n1B30----BT----\r\n1B40----BT----\r\n1B50----BT----\r\n1B60----BT----\r\n1B70----BT----\r\n1B80----BT----\r\n1B90----BT----\r\n1BA0----BT----\r\n1BB0----BT----\r\n1BC0----BT----\r\n1BD0----BT----\r\n1BE0----BT----\r\n1BF0----BT----\r\n1C00SECTR-0014\r\n1C10----BT----\r\n1C20----BT----\r\n1C30----BT----\r\n1C40----BT----\r\n1C50----BT----\r\n1C60----BT----\r\n1C70----BT----\r\n1C80----BT----\r\n1C90----BT----\r\n1CA0----BT----\r\n1CB0----BT----\r\n1CC0----BT----\r\n1CD0----BT----\r\n1CE0----BT----\r\n1CF0----BT----\r\n1D00----BT----\r\n1D10----BT----\r\n1D20----BT----\r\n1D30----BT----\r\n1D40----BT----\r\n1D50----BT----\r\n1D60----BT----\r\n1D70----BT----\r\n1D80----BT----\r\n1D90----BT----\r\n1DA0----BT----\r\n1DB0----BT----\r\n1DC0----BT----\r\n1DD0----BT----\r\n1DE0----BT----\r\n1DF0----BT----\r\n1E00SECTR-0015\r\n1E10----BT----\r\n1E20----BT----\r\n1E30----BT----\r\n1E40----BT----\r\n1E50----BT----\r\n1E60----BT----\r\n1E70----BT----\r\n1E80----BT----\r\n1E90----BT----\r\n1EA0----BT----\r\n1EB0----BT----\r\n1EC0----BT----\r\n1ED0----BT----\r\n1EE0----BT----\r\n1EF0----BT----\r\n1F00----BT----\r\n1F10----BT----\r\n1F20----BT----\r\n1F30----BT----\r\n1F40----BT----\r\n1F50----BT----\r\n1F60----BT----\r\n1F70----BT----\r\n1F80----BT----\r\n1F90----BT----\r\n1FA0----BT----\r\n1FB0----BT----\r\n1FC0----BT----\r\n1FD0----BT----\r\n1FE0----BT----\r\n1FF0----BT----\r\n2000BL0CK-0016\r\n2010----BT----\r\n2020----BT----\r\n2030----BT----\r\n2040----BT----\r\n2050----BT----\r\n2060----BT----\r\n2070----BT----\r\n2080----BT----\r\n2090----BT----\r\n20A0----BT----\r\n20B0----BT----\r\n20C0----BT----\r\n20D0----BT----\r\n20E0----BT----\r\n20F0----BT----\r\n2100----BT----\r\n2110----BT----\r\n2120----BT----\r\n2130----BT----\r\n2140----BT----\r\n2150----BT----\r\n2160----BT----\r\n2170----BT----\r\n2180----BT----\r\n2190----BT----\r\n21A0----BT----\r\n21B0----BT----\r\n21C0----BT----\r\n21D0----BT----\r\n21E0----BT----\r\n21F0----BT----\r\n2200SECTR-0017\r\n2210----BT----\r\n2220----BT----\r\n2230----BT----\r\n2240----BT----\r\n2250----BT----\r\n2260----BT----\r\n2270----BT----\r\n2280----BT----\r\n2290----BT----\r\n22A0----BT----\r\n22B0----BT----\r\n22C0----BT----\r\n22D0----BT----\r\n22E0----BT----\r\n22F0----BT----\r\n2300----BT----\r\n2310----BT----\r\n2320----BT----\r\n2330----BT----\r\n2340----BT----\r\n2350----BT----\r\n2360----BT----\r\n2370----BT----\r\n2380----BT----\r\n2390----BT----\r\n23A0----BT----\r\n23B0----BT----\r\n23C0----BT----\r\n23D0----BT----\r\n23E0----BT----\r\n23F0----BT----\r\n2400SECTR-0018\r\n2410----BT----\r\n2420----BT----\r\n2430----BT----\r\n2440----BT----\r\n2450----BT----\r\n2460----BT----\r\n2470----BT----\r\n2480----BT----\r\n2490----BT----\r\n24A0----BT----\r\n24B0----BT----\r\n24C0----BT----\r\n24D0----BT----\r\n24E0----BT----\r\n24F0----BT----\r\n2500----BT----\r\n2510----BT----\r\n2520----BT----\r\n2530----BT----\r\n2540----BT----\r\n2550----BT----\r\n2560----BT----\r\n2570----BT----\r\n2580----BT----\r\n2590----BT----\r\n25A0----BT----\r\n25B0----BT----\r\n25C0----BT----\r\n25D0----BT----\r\n25E0----BT----\r\n25F0----BT----\r\n2600SECTR-0019\r\n2610----BT----\r\n2620----BT----\r\n2630----BT----\r\n2640----BT----\r\n2650----BT----\r\n2660----BT----\r\n2670----BT----\r\n2680----BT----\r\n2690----BT----\r\n26A0----BT----\r\n26B0----BT----\r\n26C0----BT----\r\n26D0----BT----\r\n26E0----BT----\r\n26F0----BT----\r\n2700----BT----\r\n2710----BT----\r\n2720----BT----\r\n2730----BT----\r\n2740----BT----\r\n2750----BT----\r\n2760----BT----\r\n2770----BT----\r\n2780----BT----\r\n2790----BT----\r\n27A0----BT----\r\n27B0----BT----\r\n27C0----BT----\r\n27D0----BT----\r\n27E0----BT----\r\n27F0----BT----\r\n2800BL0CK-0020\r\n2810----BT----\r\n2820----BT----\r\n2830----BT----\r\n2840----BT----\r\n2850----BT----\r\n2860----BT----\r\n2870----BT----\r\n2880----BT----\r\n2890----BT----\r\n28A0----BT----\r\n28B0----BT----\r\n28C0----BT----\r\n28D0----BT----\r\n28E0----BT----\r\n28F0----BT----\r\n2900----BT----\r\n2910----BT----\r\n2920----BT----\r\n2930----BT----\r\n2940----BT----\r\n2950----BT----\r\n2960----BT----\r\n2970----BT----\r\n2980----BT----\r\n2990----BT----\r\n29A0----BT----\r\n29B0----BT----\r\n29C0----BT----\r\n29D0----BT----\r\n29E0----BT----\r\n29F0----BT----\r\n2A00SECTR-0021\r\n2A10----BT----\r\n2A20----BT----\r\n2A30----BT----\r\n2A40----BT----\r\n2A50----BT----\r\n2A60----BT----\r\n2A70----BT----\r\n2A80----BT----\r\n2A90----BT----\r\n2AA0----BT----\r\n2AB0----BT----\r\n2AC0----BT----\r\n2AD0----BT----\r\n2AE0----BT----\r\n2AF0----BT----\r\n2B00----BT----\r\n2B10----BT----\r\n2B20----BT----\r\n2B30----BT----\r\n2B40----BT----\r\n2B50----BT----\r\n2B60----BT----\r\n2B70----BT----\r\n2B80----BT----\r\n2B90----BT----\r\n2BA0----BT----\r\n2BB0----BT----\r\n2BC0----BT----\r\n2BD0----BT----\r\n2BE0----BT----\r\n2BF0----BT----\r\n2C00SECTR-0022\r\n2C10----BT----\r\n2C20----BT----\r\n2C30----BT----\r\n2C40----BT----\r\n2C50----BT----\r\n2C60----BT----\r\n2C70----BT----\r\n2C80----BT----\r\n2C90----BT----\r\n2CA0----BT----\r\n2CB0----BT----\r\n2CC0----BT----\r\n2CD0----BT----\r\n2CE0----BT----\r\n2CF0----BT----\r\n2D00----BT----\r\n2D10----BT----\r\n2D20----BT----\r\n2D30----BT----\r\n2D40----BT----\r\n2D50----BT----\r\n2D60----BT----\r\n2D70----BT----\r\n2D80----BT----\r\n2D90----BT----\r\n2DA0----BT----\r\n2DB0----BT----\r\n2DC0----BT----\r\n2DD0----BT----\r\n2DE0----BT----\r\n2DF0----BT----\r\n2E00SECTR-0023\r\n2E10----BT----\r\n2E20----BT----\r\n2E30----BT----\r\n2E40----BT----\r\n2E50----BT----\r\n2E60----BT----\r\n2E70----BT----\r\n2E80----BT----\r\n2E90----BT----\r\n2EA0----BT----\r\n2EB0----BT----\r\n2EC0----BT----\r\n2ED0----BT----\r\n2EE0----BT----\r\n2EF0----BT----\r\n2F00----BT----\r\n2F10----BT----\r\n2F20----BT----\r\n2F30----BT----\r\n2F40----BT----\r\n2F50----BT----\r\n2F60----BT----\r\n2F70----BT----\r\n2F80----BT----\r\n2F90----BT----\r\n2FA0----BT----\r\n2FB0----BT----\r\n2FC0----BT----\r\n2FD0----BT----\r\n2FE0----BT----\r\n2FF0----BT----\r\n3000BL0CK-0024\r\n3010----BT----\r\n3020----BT----\r\n3030----BT----\r\n3040----BT----\r\n3050----BT----\r\n3060----BT----\r\n3070----BT----\r\n3080----BT----\r\n3090----BT----\r\n30A0----BT----\r\n30B0----BT----\r\n30C0----BT----\r\n30D0----BT----\r\n30E0----BT----\r\n30F0----BT----\r\n3100----BT----\r\n3110----BT----\r\n3120----BT----\r\n3130----BT----\r\n3140----BT----\r\n3150----BT----\r\n3160----BT----\r\n3170----BT----\r\n3180----BT----\r\n3190----BT----\r\n31A0----BT----\r\n31B0----BT----\r\n31C0----BT----\r\n31D0----BT----\r\n31E0----BT----\r\n31F0----BT----\r\n3200SECTR-0025\r\n3210----BT----\r\n3220----BT----\r\n3230----BT----\r\n3240----BT----\r\n3250----BT----\r\n3260----BT----\r\n3270----BT----\r\n3280----BT----\r\n3290----BT----\r\n32A0----BT----\r\n32B0----BT----\r\n32C0----BT----\r\n32D0----BT----\r\n32E0----BT----\r\n32F0----BT----\r\n3300----BT----\r\n3310----BT----\r\n3320----BT----\r\n3330----BT----\r\n3340----BT----\r\n3350----BT----\r\n3360----BT----\r\n3370----BT----\r\n3380----BT----\r\n3390----BT----\r\n33A0----BT----\r\n33B0----BT----\r\n33C0----BT----\r\n33D0----BT----\r\n33E0----BT----\r\n33F0----BT----\r\n3400SECTR-0026\r\n3410----BT----\r\n3420----BT----\r\n3430----BT----\r\n3440----BT----\r\n3450----BT----\r\n3460----BT----\r\n3470----BT----\r\n3480----BT----\r\n3490----BT----\r\n34A0----BT----\r\n34B0----BT----\r\n34C0----BT----\r\n34D0----BT----\r\n34E0----BT----\r\n34F0----BT----\r\n3500----BT----\r\n3510----BT----\r\n3520----BT----\r\n3530----BT----\r\n3540----BT----\r\n3550----BT----\r\n3560----BT----\r\n3570----BT----\r\n3580----BT----\r\n3590----BT----\r\n35A0----BT----\r\n35B0----BT----\r\n35C0----BT----\r\n35D0----BT----\r\n35E0----BT----\r\n35F0----BT----\r\n3600SECTR-0027\r\n3610----BT----\r\n3620----BT----\r\n3630----BT----\r\n3640----BT----\r\n3650----BT----\r\n3660----BT----\r\n3670----BT----\r\n3680----BT----\r\n3690----BT----\r\n36A0----BT----\r\n36B0----BT----\r\n36C0----BT----\r\n36D0----BT----\r\n36E0----BT----\r\n36F0----BT----\r\n3700----BT----\r\n3710----BT----\r\n3720----BT----\r\n3730----BT----\r\n3740----BT----\r\n3750----BT----\r\n3760----BT----\r\n3770----BT----\r\n3780----BT----\r\n3790----BT----\r\n37A0----BT----\r\n37B0----BT----\r\n37C0----BT----\r\n37D0----BT----\r\n37E0----BT----\r\n37F0----BT----\r\n3800BL0CK-0028\r\n3810----BT----\r\n3820----BT----\r\n3830----BT----\r\n3840----BT----\r\n3850----BT----\r\n3860----BT----\r\n3870----BT----\r\n3880----BT----\r\n3890----BT----\r\n38A0----BT----\r\n38B0----BT----\r\n38C0----BT----\r\n38D0----BT----\r\n38E0----BT----\r\n38F0----BT----\r\n3900----BT----\r\n3910----BT----\r\n3920----BT----\r\n3930----BT----\r\n3940----BT----\r\n3950----BT----\r\n3960----BT----\r\n3970----BT----\r\n3980----BT----\r\n3990----BT----\r\n39A0----BT----\r\n39B0----BT----\r\n39C0----BT----\r\n39D0----BT----\r\n39E0----BT----\r\n39F0----BT----\r\n3A00SECTR-0029\r\n3A10----BT----\r\n3A20----BT----\r\n3A30----BT----\r\n3A40----BT----\r\n3A50----BT----\r\n3A60----BT----\r\n3A70----BT----\r\n3A80----BT----\r\n3A90----BT----\r\n3AA0----BT----\r\n3AB0----BT----\r\n3AC0----BT----\r\n3AD0----BT----\r\n3AE0----BT----\r\n3AF0----BT----\r\n3B00----BT----\r\n3B10----BT----\r\n3B20----BT----\r\n3B30----BT----\r\n3B40----BT----\r\n3B50----BT----\r\n3B60----BT----\r\n3B70----BT----\r\n3B80----BT----\r\n3B90----BT----\r\n3BA0----BT----\r\n3BB0----BT----\r\n3BC0----BT----\r\n3BD0----BT----\r\n3BE0----BT----\r\n3BF0----BT----\r\n3C00SECTR-0030\r\n3C10----BT----\r\n3C20----BT----\r\n3C30----BT----\r\n3C40----BT----\r\n3C50----BT----\r\n3C60----BT----\r\n3C70----BT----\r\n3C80----BT----\r\n3C90----BT----\r\n3CA0----BT----\r\n3CB0----BT----\r\n3CC0----BT----\r\n3CD0----BT----\r\n3CE0----BT----\r\n3CF0----BT----\r\n3D00----BT----\r\n3D10----BT----\r\n3D20----BT----\r\n3D30----BT----\r\n3D40----BT----\r\n3D50----BT----\r\n3D60----BT----\r\n3D70----BT----\r\n3D80----BT----\r\n3D90----BT----\r\n3DA0----BT----\r\n3DB0----BT----\r\n3DC0----BT----\r\n3DD0----BT----\r\n3DE0----BT----\r\n3DF0----BT----\r\n3E00SECTR-0031\r\n3E10----BT----\r\n3E20----BT----\r\n3E30----BT----\r\n3E40----BT----\r\n3E50----BT----\r\n3E60----BT----\r\n3E70----BT----\r\n3E80----BT----\r\n3E90----BT----\r\n3EA0----BT----\r\n3EB0----BT----\r\n3EC0----BT----\r\n3ED0----BT----\r\n3EE0----BT----\r\n3EF0----BT----\r\n3F00----BT----\r\n3F10----BT----\r\n3F20----BT----\r\n3F30----BT----\r\n3F40----BT----\r\n3F50----BT----\r\n3F60----BT----\r\n3F70----BT----\r\n3F80----BT----\r\n3F90----BT----\r\n3FA0----BT----\r\n3FB0----BT----\r\n3FC0----BT----\r\n3FD0----BT----\r\n3FE0----BT----\r\n3FF0----BT----\r\n4000BL0CK-0032\r\n4010----BT----\r\n4020----BT----\r\n4030----BT----\r\n4040----BT----\r\n4050----BT----\r\n4060----BT----\r\n4070----BT----\r\n4080----BT----\r\n4090----BT----\r\n40A0----BT----\r\n40B0----BT----\r\n40C0----BT----\r\n40D0----BT----\r\n40E0----BT----\r\n40F0----BT----\r\n4100----BT----\r\n4110----BT----\r\n4120----BT----\r\n4130----BT----\r\n4140----BT----\r\n4150----BT----\r\n4160----BT----\r\n4170----BT----\r\n4180----BT----\r\n4190----BT----\r\n41A0----BT----\r\n41B0----BT----\r\n41C0----BT----\r\n41D0----BT----\r\n41E0----BT----\r\n41F0----BT----\r\n4200SECTR-0033\r\n4210----BT----\r\n4220----BT----\r\n4230----BT----\r\n4240----BT----\r\n4250----BT----\r\n4260----BT----\r\n4270----BT----\r\n4280----BT----\r\n4290----BT----\r\n42A0----BT----\r\n42B0----BT----\r\n42C0----BT----\r\n42D0----BT----\r\n42E0----BT----\r\n42F0----BT----\r\n4300----BT----\r\n4310----BT----\r\n4320----BT----\r\n4330----BT----\r\n4340----BT----\r\n4350----BT----\r\n4360----BT----\r\n4370----BT----\r\n4380----BT----\r\n4390----BT----\r\n43A0----BT----\r\n43B0----BT----\r\n43C0----BT----\r\n43D0----BT----\r\n43E0----BT----\r\n43F0----BT----\r\n4400SECTR-0034\r\n4410----BT----\r\n4420----BT----\r\n4430----BT----\r\n4440----BT----\r\n4450----BT----\r\n4460----BT----\r\n4470----BT----\r\n4480----BT----\r\n4490----BT----\r\n44A0----BT----\r\n44B0----BT----\r\n44C0----BT----\r\n44D0----BT----\r\n44E0----BT----\r\n44F0----BT----\r\n4500----BT----\r\n4510----BT----\r\n4520----BT----\r\n4530----BT----\r\n4540----BT----\r\n4550----BT----\r\n4560----BT----\r\n4570----BT----\r\n4580----BT----\r\n4590----BT----\r\n45A0----BT----\r\n45B0----BT----\r\n45C0----BT----\r\n45D0----BT----\r\n45E0----BT----\r\n45F0----BT----\r\n4600SECTR-0035\r\n4610----BT----\r\n4620----BT----\r\n4630----BT----\r\n4640----BT----\r\n4650----BT----\r\n4660----BT----\r\n4670----BT----\r\n4680----BT----\r\n4690----BT----\r\n46A0----BT----\r\n46B0----BT----\r\n46C0----BT----\r\n46D0----BT----\r\n46E0----BT----\r\n46F0----BT----\r\n4700----BT----\r\n4710----BT----\r\n4720----BT----\r\n4730----BT----\r\n4740----BT----\r\n4750----BT----\r\n4760----BT----\r\n4770----BT----\r\n4780----BT----\r\n4790----BT----\r\n47A0----BT----\r\n47B0----BT----\r\n47C0----BT----\r\n47D0----BT----\r\n47E0----BT----\r\n47F0----BT----\r\n4800BL0CK-0036\r\n4810----BT----\r\n4820----BT----\r\n4830----BT----\r\n4840----BT----\r\n4850----BT----\r\n4860----BT----\r\n4870----BT----\r\n4880----BT----\r\n4890----BT----\r\n48A0----BT----\r\n48B0----BT----\r\n48C0----BT----\r\n48D0----BT----\r\n48E0----BT----\r\n48F0----BT----\r\n4900----BT----\r\n4910----BT----\r\n4920----BT----\r\n4930----BT----\r\n4940----BT----\r\n4950----BT----\r\n4960----BT----\r\n4970----BT----\r\n4980----BT----\r\n4990----BT----\r\n49A0----BT----\r\n49B0----BT----\r\n49C0----BT----\r\n49D0----BT----\r\n49E0----BT----\r\n49F0----BT----\r\n4A00SECTR-0037\r\n4A10----BT----\r\n4A20----BT----\r\n4A30----BT----\r\n4A40----BT----\r\n4A50----BT----\r\n4A60----BT----\r\n4A70----BT----\r\n4A80----BT----\r\n4A90----BT----\r\n4AA0----BT----\r\n4AB0----BT----\r\n4AC0----BT----\r\n4AD0----BT----\r\n4AE0----BT----\r\n4AF0----BT----\r\n4B00----BT----\r\n4B10----BT----\r\n4B20----BT----\r\n4B30----BT----\r\n4B40----BT----\r\n4B50----BT----\r\n4B60----BT----\r\n4B70----BT----\r\n4B80----BT----\r\n4B90----BT----\r\n4BA0----BT----\r\n4BB0----BT----\r\n4BC0----BT----\r\n4BD0----BT----\r\n4BE0----BT----\r\n4BF0----BT----\r\n4C00SECTR-0038\r\n4C10----BT----\r\n4C20----BT----\r\n4C30----BT----\r\n4C40----BT----\r\n4C50----BT----\r\n4C60----BT----\r\n4C70----BT----\r\n4C80----BT----\r\n4C90----BT----\r\n4CA0----BT----\r\n4CB0----BT----\r\n4CC0----BT----\r\n4CD0----BT----\r\n4CE0----BT----\r\n4CF0----BT----\r\n4D00----BT----\r\n4D10----BT----\r\n4D20----BT----\r\n4D30----BT----\r\n4D40----BT----\r\n4D50----BT----\r\n4D60----BT----\r\n4D70----BT----\r\n4D80----BT----\r\n4D90----BT----\r\n4DA0----BT----\r\n4DB0----BT----\r\n4DC0----BT----\r\n4DD0----BT----\r\n4DE0----BT----\r\n4DF0----BT----\r\n4E00SECTR-0039\r\n4E10----BT----\r\n4E20----BT----\r\n4E30----BT----\r\n4E40----BT----\r\n4E50----BT----\r\n4E60----BT----\r\n4E70----BT----\r\n4E80----BT----\r\n4E90----BT----\r\n4EA0----BT----\r\n4EB0----BT----\r\n4EC0----BT----\r\n4ED0----BT----\r\n4EE0----BT----\r\n4EF0----BT----\r\n4F00----BT----\r\n4F10----BT----\r\n4F20----BT----\r\n4F30----BT----\r\n4F40----BT----\r\n4F50----BT----\r\n4F60----BT----\r\n4F70----BT----\r\n4F80----BT----\r\n4F90----BT----\r\n4FA0----BT----\r\n4FB0----BT----\r\n4FC0----BT----\r\n4FD0----BT----\r\n4FE0----BT----\r\n4FF0----BT----\r\n5000BL0CK-0040\r\n5010----BT----\r\n5020----BT----\r\n5030----BT----\r\n5040----BT----\r\n5050----BT----\r\n5060----BT----\r\n5070----BT----\r\n5080----BT----\r\n5090----BT----\r\n50A0----BT----\r\n50B0----BT----\r\n50C0----BT----\r\n50D0----BT----\r\n50E0----BT----\r\n50F0----BT----\r\n5100----BT----\r\n5110----BT----\r\n5120----BT----\r\n5130----BT----\r\n5140----BT----\r\n5150----BT----\r\n5160----BT----\r\n5170----BT----\r\n5180----BT----\r\n5190----BT----\r\n51A0----BT----\r\n51B0----BT----\r\n51C0----BT----\r\n51D0----BT----\r\n51E0----BT----\r\n51F0----BT----\r\n5200SECTR-0041\r\n5210----BT----\r\n5220----BT----\r\n5230----BT----\r\n5240----BT----\r\n5250----BT----\r\n5260----BT----\r\n5270----BT----\r\n5280----BT----\r\n5290----BT----\r\n52A0----BT----\r\n52B0----BT----\r\n52C0----BT----\r\n52D0----BT----\r\n52E0----BT----\r\n52F0----BT----\r\n5300----BT----\r\n5310----BT----\r\n5320----BT----\r\n5330----BT----\r\n5340----BT----\r\n5350----BT----\r\n5360----BT----\r\n5370----BT----\r\n5380----BT----\r\n5390----BT----\r\n53A0----BT----\r\n53B0----BT----\r\n53C0----BT----\r\n53D0----BT----\r\n53E0----BT----\r\n53F0----BT----\r\n5400SECTR-0042\r\n5410----BT----\r\n5420----BT----\r\n5430----BT----\r\n5440----BT----\r\n5450----BT----\r\n5460----BT----\r\n5470----BT----\r\n5480----BT----\r\n5490----BT----\r\n54A0----BT----\r\n54B0----BT----\r\n54C0----BT----\r\n54D0----BT----\r\n54E0----BT----\r\n54F0----BT----\r\n5500----BT----\r\n5510----BT----\r\n5520----BT----\r\n5530----BT----\r\n5540----BT----\r\n5550----BT----\r\n5560----BT----\r\n5570----BT----\r\n5580----BT----\r\n5590----BT----\r\n55A0----BT----\r\n55B0----BT----\r\n55C0----BT----\r\n55D0----BT----\r\n55E0----BT----\r\n55F0----BT----\r\n5600SECTR-0043\r\n5610----BT----\r\n5620----BT----\r\n5630----BT----\r\n5640----BT----\r\n5650----BT----\r\n5660----BT----\r\n5670----BT----\r\n5680----BT----\r\n5690----BT----\r\n56A0----BT----\r\n56B0----BT----\r\n56C0----BT----\r\n56D0----BT----\r\n56E0----BT----\r\n56F0----BT----\r\n5700----BT----\r\n5710----BT----\r\n5720----BT----\r\n5730----BT----\r\n5740----BT----\r\n5750----BT----\r\n5760----BT----\r\n5770----BT----\r\n5780----BT----\r\n5790----BT----\r\n57A0----BT----\r\n57B0----BT----\r\n57C0----BT----\r\n57D0----BT----\r\n57E0----BT----\r\n57F0----BT----\r\n5800BL0CK-0044\r\n5810----BT----\r\n5820----BT----\r\n5830----BT----\r\n5840----BT----\r\n5850----BT----\r\n5860----BT----\r\n5870----BT----\r\n5880----BT----\r\n5890----BT----\r\n58A0----BT----\r\n58B0----BT----\r\n58C0----BT----\r\n58D0----BT----\r\n58E0----BT----\r\n58F0----BT----\r\n5900----BT----\r\n5910----BT----\r\n5920----BT----\r\n5930----BT----\r\n5940----BT----\r\n5950----BT----\r\n5960----BT----\r\n5970----BT----\r\n5980----BT----\r\n5990----BT----\r\n59A0----BT----\r\n59B0----BT----\r\n59C0----BT----\r\n59D0----BT----\r\n59E0----BT----\r\n59F0----BT----\r\n5A00SECTR-0045\r\n5A10----BT----\r\n5A20----BT----\r\n5A30----BT----\r\n5A40----BT----\r\n5A50----BT----\r\n5A60----BT----\r\n5A70----BT----\r\n5A80----BT----\r\n5A90----BT----\r\n5AA0----BT----\r\n5AB0----BT----\r\n5AC0----BT----\r\n5AD0----BT----\r\n5AE0----BT----\r\n5AF0----BT----\r\n5B00----BT----\r\n5B10----BT----\r\n5B20----BT----\r\n5B30----BT----\r\n5B40----BT----\r\n5B50----BT----\r\n5B60----BT----\r\n5B70----BT----\r\n5B80----BT----\r\n5B90----BT----\r\n5BA0----BT----\r\n5BB0----BT----\r\n5BC0----BT----\r\n5BD0----BT----\r\n5BE0----BT----\r\n5BF0----BT----\r\n5C00SECTR-0046\r\n5C10----BT----\r\n5C20----BT----\r\n5C30----BT----\r\n5C40----BT----\r\n5C50----BT----\r\n5C60----BT----\r\n5C70----BT----\r\n5C80----BT----\r\n5C90----BT----\r\n5CA0----BT----\r\n5CB0----BT----\r\n5CC0----BT----\r\n5CD0----BT----\r\n5CE0----BT----\r\n5CF0----BT----\r\n5D00----BT----\r\n5D10----BT----\r\n5D20----BT----\r\n5D30----BT----\r\n5D40----BT----\r\n5D50----BT----\r\n5D60----BT----\r\n5D70----BT----\r\n5D80----BT----\r\n5D90----BT----\r\n5DA0----BT----\r\n5DB0----BT----\r\n5DC0----BT----\r\n5DD0----BT----\r\n5DE0----BT----\r\n5DF0----BT----\r\n5E00SECTR-0047\r\n5E10----BT----\r\n5E20----BT----\r\n5E30----BT----\r\n5E40----BT----\r\n5E50----BT----\r\n5E60----BT----\r\n5E70----BT----\r\n5E80----BT----\r\n5E90----BT----\r\n5EA0----BT----\r\n5EB0----BT----\r\n5EC0----BT----\r\n5ED0----BT----\r\n5EE0----BT----\r\n5EF0----BT----\r\n5F00----BT----\r\n5F10----BT----\r\n5F20----BT----\r\n5F30----BT----\r\n5F40----BT----\r\n5F50----BT----\r\n5F60----BT----\r\n5F70----BT----\r\n5F80----BT----\r\n5F90----BT----\r\n5FA0----BT----\r\n5FB0----BT----\r\n5FC0----BT----\r\n5FD0----BT----\r\n5FE0----BT----\r\n5FF0----BT----\r\n6000BL0CK-0048\r\n6010----BT----\r\n6020----BT----\r\n6030----BT----\r\n6040----BT----\r\n6050----BT----\r\n6060----BT----\r\n6070----BT----\r\n6080----BT----\r\n6090----BT----\r\n60A0----BT----\r\n60B0----BT----\r\n60C0----BT----\r\n60D0----BT----\r\n60E0----BT----\r\n60F0----BT----\r\n6100----BT----\r\n6110----BT----\r\n6120----BT----\r\n6130----BT----\r\n6140----BT----\r\n6150----BT----\r\n6160----BT----\r\n6170----BT----\r\n6180----BT----\r\n6190----BT----\r\n61A0----BT----\r\n61B0----BT----\r\n61C0----BT----\r\n61D0----BT----\r\n61E0----BT----\r\n61F0----BT----\r\n6200SECTR-0049\r\n6210----BT----\r\n6220----BT----\r\n6230----BT----\r\n6240----BT----\r\n6250----BT----\r\n6260----BT----\r\n6270----BT----\r\n6280----BT----\r\n6290----BT----\r\n62A0----BT----\r\n62B0----BT----\r\n62C0----BT----\r\n62D0----BT----\r\n62E0----BT----\r\n62F0----BT----\r\n6300----BT----\r\n6310----BT----\r\n6320----BT----\r\n6330----BT----\r\n6340----BT----\r\n6350----BT----\r\n6360----BT----\r\n6370----BT----\r\n6380----BT----\r\n6390----BT----\r\n63A0----BT----\r\n63B0----BT----\r\n63C0----BT----\r\n63D0----BT----\r\n63E0----BT----\r\n63F0----BT----\r\n6400SECTR-0050\r\n6410----BT----\r\n6420----BT----\r\n6430----BT----\r\n6440----BT----\r\n6450----BT----\r\n6460----BT----\r\n6470----BT----\r\n6480----BT----\r\n6490----BT----\r\n64A0----BT----\r\n64B0----BT----\r\n64C0----BT----\r\n64D0----BT----\r\n64E0----BT----\r\n64F0----BT----\r\n6500----BT----\r\n6510----BT----\r\n6520----BT----\r\n6530----BT----\r\n6540----BT----\r\n6550----BT----\r\n6560----BT----\r\n6570----BT----\r\n6580----BT----\r\n6590----BT----\r\n65A0----BT----\r\n65B0----BT----\r\n65C0----BT----\r\n65D0----BT----\r\n65E0----BT----\r\n65F0----BT----\r\n6600SECTR-0051\r\n6610----BT----\r\n6620----BT----\r\n6630----BT----\r\n6640----BT----\r\n6650----BT----\r\n6660----BT----\r\n6670----BT----\r\n6680----BT----\r\n6690----BT----\r\n66A0----BT----\r\n66B0----BT----\r\n66C0----BT----\r\n66D0----BT----\r\n66E0----BT----\r\n66F0----BT----\r\n6700----BT----\r\n6710----BT----\r\n6720----BT----\r\n6730----BT----\r\n6740----BT----\r\n6750----BT----\r\n6760----BT----\r\n6770----BT----\r\n6780----BT----\r\n6790----BT----\r\n67A0----BT----\r\n67B0----BT----\r\n67C0----BT----\r\n67D0----BT----\r\n67E0----BT----\r\n67F0----BT----\r\n6800BL0CK-0052\r\n6810----BT----\r\n6820----BT----\r\n6830----BT----\r\n6840----BT----\r\n6850----BT----\r\n6860----BT----\r\n6870----BT----\r\n6880----BT----\r\n6890----BT----\r\n68A0----BT----\r\n68B0----BT----\r\n68C0----BT----\r\n68D0----BT----\r\n68E0----BT----\r\n68F0----BT----\r\n6900----BT----\r\n6910----BT----\r\n6920----BT----\r\n6930----BT----\r\n6940----BT----\r\n6950----BT----\r\n6960----BT----\r\n6970----BT----\r\n6980----BT----\r\n6990----BT----\r\n69A0----BT----\r\n69B0----BT----\r\n69C0----BT----\r\n69D0----BT----\r\n69E0----BT----\r\n69F0----BT----\r\n6A00SECTR-0053\r\n6A10----BT----\r\n6A20----BT----\r\n6A30----BT----\r\n6A40----BT----\r\n6A50----BT----\r\n6A60----BT----\r\n6A70----BT----\r\n6A80----BT----\r\n6A90----BT----\r\n6AA0----BT----\r\n6AB0----BT----\r\n6AC0----BT----\r\n6AD0----BT----\r\n6AE0----BT----\r\n6AF0----BT----\r\n6B00----BT----\r\n6B10----BT----\r\n6B20----BT----\r\n6B30----BT----\r\n6B40----BT----\r\n6B50----BT----\r\n6B60----BT----\r\n6B70----BT----\r\n6B80----BT----\r\n6B90----BT----\r\n6BA0----BT----\r\n6BB0----BT----\r\n6BC0----BT----\r\n6BD0----BT----\r\n6BE0----BT----\r\n6BF0----BT----\r\n6C00SECTR-0054\r\n6C10----BT----\r\n6C20----BT----\r\n6C30----BT----\r\n6C40----BT----\r\n6C50----BT----\r\n6C60----BT----\r\n6C70----BT----\r\n6C80----BT----\r\n6C90----BT----\r\n6CA0----BT----\r\n6CB0----BT----\r\n6CC0----BT----\r\n6CD0----BT----\r\n6CE0----BT----\r\n6CF0----BT----\r\n6D00----BT----\r\n6D10----BT----\r\n6D20----BT----\r\n6D30----BT----\r\n6D40----BT----\r\n6D50----BT----\r\n6D60----BT----\r\n6D70----BT----\r\n6D80----BT----\r\n6D90----BT----\r\n6DA0----BT----\r\n6DB0----BT----\r\n6DC0----BT----\r\n6DD0----BT----\r\n6DE0----BT----\r\n6DF0----BT----\r\n6E00SECTR-0055\r\n6E10----BT----\r\n6E20----BT----\r\n6E30----BT----\r\n6E40----BT----\r\n6E50----BT----\r\n6E60----BT----\r\n6E70----BT----\r\n6E80----BT----\r\n6E90----BT----\r\n6EA0----BT----\r\n6EB0----BT----\r\n6EC0----BT----\r\n6ED0----BT----\r\n6EE0----BT----\r\n6EF0----BT----\r\n6F00----BT----\r\n6F10----BT----\r\n6F20----BT----\r\n6F30----BT----\r\n6F40----BT----\r\n6F50----BT----\r\n6F60----BT----\r\n6F70----BT----\r\n6F80----BT----\r\n6F90----BT----\r\n6FA0----BT----\r\n6FB0----BT----\r\n6FC0----BT----\r\n6FD0----BT----\r\n6FE0----BT----\r\n6FF0----BT----\r\n7000BL0CK-0056\r\n7010----BT----\r\n7020----BT----\r\n7030----BT----\r\n7040----BT----\r\n7050----BT----\r\n7060----BT----\r\n7070----BT----\r\n7080----BT----\r\n7090----BT----\r\n70A0----BT----\r\n70B0----BT----\r\n70C0----BT----\r\n70D0----BT----\r\n70E0----BT----\r\n70F0----BT----\r\n7100----BT----\r\n7110----BT----\r\n7120----BT----\r\n7130----BT----\r\n7140----BT----\r\n7150----BT----\r\n7160----BT----\r\n7170----BT----\r\n7180----BT----\r\n7190----BT----\r\n71A0----BT----\r\n71B0----BT----\r\n71C0----BT----\r\n71D0----BT----\r\n71E0----BT----\r\n71F0----BT----\r\n7200SECTR-0057\r\n7210----BT----\r\n7220----BT----\r\n7230----BT----\r\n7240----BT----\r\n7250----BT----\r\n7260----BT----\r\n7270----BT----\r\n7280----BT----\r\n7290----BT----\r\n72A0----BT----\r\n72B0----BT----\r\n72C0----BT----\r\n72D0----BT----\r\n72E0----BT----\r\n72F0----BT----\r\n7300----BT----\r\n7310----BT----\r\n7320----BT----\r\n7330----BT----\r\n7340----BT----\r\n7350----BT----\r\n7360----BT----\r\n7370----BT----\r\n7380----BT----\r\n7390----BT----\r\n73A0----BT----\r\n73B0----BT----\r\n73C0----BT----\r\n73D0----BT----\r\n73E0----BT----\r\n73F0----BT----\r\n7400SECTR-0058\r\n7410----BT----\r\n7420----BT----\r\n7430----BT----\r\n7440----BT----\r\n7450----BT----\r\n7460----BT----\r\n7470----BT----\r\n7480----BT----\r\n7490----BT----\r\n74A0----BT----\r\n74B0----BT----\r\n74C0----BT----\r\n74D0----BT----\r\n74E0----BT----\r\n74F0----BT----\r\n7500----BT----\r\n7510----BT----\r\n7520----BT----\r\n7530----BT----\r\n7540----BT----\r\n7550----BT----\r\n7560----BT----\r\n7570----BT----\r\n7580----BT----\r\n7590----BT----\r\n75A0----BT----\r\n75B0----BT----\r\n75C0----BT----\r\n75D0----BT----\r\n75E0----BT----\r\n75F0----BT----\r\n7600SECTR-0059\r\n7610----BT----\r\n7620----BT----\r\n7630----BT----\r\n7640----BT----\r\n7650----BT----\r\n7660----BT----\r\n7670----BT----\r\n7680----BT----\r\n7690----BT----\r\n76A0----BT----\r\n76B0----BT----\r\n76C0----BT----\r\n76D0----BT----\r\n76E0----BT----\r\n76F0----BT----\r\n7700----BT----\r\n7710----BT----\r\n7720----BT----\r\n7730----BT----\r\n7740----BT----\r\n7750----BT----\r\n7760----BT----\r\n7770----BT----\r\n7780----BT----\r\n7790----BT----\r\n77A0----BT----\r\n77B0----BT----\r\n77C0----BT----\r\n77D0----BT----\r\n77E0----BT----\r\n77F0----BT----\r\n7800BL0CK-0060\r\n7810----BT----\r\n7820----BT----\r\n7830----BT----\r\n7840----BT----\r\n7850----BT----\r\n7860----BT----\r\n7870----BT----\r\n7880----BT----\r\n7890----BT----\r\n78A0----BT----\r\n78B0----BT----\r\n78C0----BT----\r\n78D0----BT----\r\n78E0----BT----\r\n78F0----BT----\r\n7900----BT----\r\n7910----BT----\r\n7920----BT----\r\n7930----BT----\r\n7940----BT----\r\n7950----BT----\r\n7960----BT----\r\n7970----BT----\r\n7980----BT----\r\n7990----BT----\r\n79A0----BT----\r\n79B0----BT----\r\n79C0----BT----\r\n79D0----BT----\r\n79E0----BT----\r\n79F0----BT----\r\n7A00SECTR-0061\r\n7A10----BT----\r\n7A20----BT----\r\n7A30----BT----\r\n7A40----BT----\r\n7A50----BT----\r\n7A60----BT----\r\n7A70----BT----\r\n7A80----BT----\r\n7A90----BT----\r\n7AA0----BT----\r\n7AB0----BT----\r\n7AC0----BT----\r\n7AD0----BT----\r\n7AE0----BT----\r\n7AF0----BT----\r\n7B00----BT----\r\n7B10----BT----\r\n7B20----BT----\r\n7B30----BT----\r\n7B40----BT----\r\n7B50----BT----\r\n7B60----BT----\r\n7B70----BT----\r\n7B80----BT----\r\n7B90----BT----\r\n7BA0----BT----\r\n7BB0----BT----\r\n7BC0----BT----\r\n7BD0----BT----\r\n7BE0----BT----\r\n7BF0----BT----\r\n7C00SECTR-0062\r\n7C10----BT----\r\n7C20----BT----\r\n7C30----BT----\r\n7C40----BT----\r\n7C50----BT----\r\n7C60----BT----\r\n7C70----BT----\r\n7C80----BT----\r\n7C90----BT----\r\n7CA0----BT----\r\n7CB0----BT----\r\n7CC0----BT----\r\n7CD0----BT----\r\n7CE0----BT----\r\n7CF0----BT----\r\n7D00----BT----\r\n7D10----BT----\r\n7D20----BT----\r\n7D30----BT----\r\n7D40----BT----\r\n7D50----BT----\r\n7D60----BT----\r\n7D70----BT----\r\n7D80----BT----\r\n7D90----BT----\r\n7DA0----BT----\r\n7DB0----BT----\r\n7DC0----BT----\r\n7DD0----BT----\r\n7DE0----BT----\r\n7DF0----BT----\r\n7E00SECTR-0063\r\n7E10----BT----\r\n7E20----BT----\r\n7E30----BT----\r\n7E40----BT----\r\n7E50----BT----\r\n7E60----BT----\r\n7E70----BT----\r\n7E80----BT----\r\n7E90----BT----\r\n7EA0----BT----\r\n7EB0----BT----\r\n7EC0----BT----\r\n7ED0----BT----\r\n7EE0----BT----\r\n7EF0----BT----\r\n7F00----BT----\r\n7F10----BT----\r\n7F20----BT----\r\n7F30----BT----\r\n7F40----BT----\r\n7F50----BT----\r\n7F60----BT----\r\n7F70----BT----\r\n7F80----BT----\r\n7F90----BT----\r\n7FA0----BT----\r\n7FB0----BT----\r\n7FC0----BT----\r\n7FD0----BT----\r\n7FE0----BT----\r\n7FF0----BT----\r\n8000BL0CK-0064\r\n8010----BT----\r\n8020----BT----\r\n8030----BT----\r\n8040----BT----\r\n8050----BT----\r\n8060----BT----\r\n8070----BT----\r\n8080----BT----\r\n8090----BT----\r\n80A0----BT----\r\n80B0----BT----\r\n80C0----BT----\r\n80D0----BT----\r\n80E0----BT----\r\n80F0----BT----\r\n8100----BT----\r\n8110----BT----\r\n8120----BT----\r\n8130----BT----\r\n8140----BT----\r\n8150----BT----\r\n8160----BT----\r\n8170----BT----\r\n8180----BT----\r\n8190----BT----\r\n81A0----BT----\r\n81B0----BT----\r\n81C0----BT----\r\n81D0----BT----\r\n81E0----BT----\r\n81F0----BT----\r\n8200SECTR-0065\r\n8210----BT----\r\n8220----BT----\r\n8230----BT----\r\n8240----BT----\r\n8250----BT----\r\n8260----BT----\r\n8270----BT----\r\n8280----BT----\r\n8290----BT----\r\n82A0----BT----\r\n82B0----BT----\r\n82C0----BT----\r\n82D0----BT----\r\n82E0----BT----\r\n82F0----BT----\r\n8300----BT----\r\n8310----BT----\r\n8320----BT----\r\n8330----BT----\r\n8340----BT----\r\n8350----BT----\r\n8360----BT----\r\n8370----BT----\r\n8380----BT----\r\n8390----BT----\r\n83A0----BT----\r\n83B0----BT----\r\n83C0----BT----\r\n83D0----BT----\r\n83E0----BT----\r\n83F0----BT----\r\n8400SECTR-0066\r\n8410----BT----\r\n8420----BT----\r\n8430----BT----\r\n8440----BT----\r\n8450----BT----\r\n8460----BT----\r\n8470----BT----\r\n8480----BT----\r\n8490----BT----\r\n84A0----BT----\r\n84B0----BT----\r\n84C0----BT----\r\n84D0----BT----\r\n84E0----BT----\r\n84F0----BT----\r\n8500----BT----\r\n8510----BT----\r\n8520----BT----\r\n8530----BT----\r\n8540----BT----\r\n8550----BT----\r\n8560----BT----\r\n8570----BT----\r\n8580----BT----\r\n8590----BT----\r\n85A0----BT----\r\n85B0----BT----\r\n85C0----BT----\r\n85D0----BT----\r\n85E0----BT----\r\n85F0----BT----\r\n8600SECTR-0067\r\n8610----BT----\r\n8620----BT----\r\n8630----BT----\r\n8640----BT----\r\n8650----BT----\r\n8660----BT----\r\n8670----BT----\r\n8680----BT----\r\n8690----BT----\r\n86A0----BT----\r\n86B0----BT----\r\n86C0----BT----\r\n86D0----BT----\r\n86E0----BT----\r\n86F0----BT----\r\n8700----BT----\r\n8710----BT----\r\n8720----BT----\r\n8730----BT----\r\n8740----BT----\r\n8750----BT----\r\n8760----BT----\r\n8770----BT----\r\n8780----BT----\r\n8790----BT----\r\n87A0----BT----\r\n87B0----BT----\r\n87C0----BT----\r\n87D0----BT----\r\n87E0----BT----\r\n87F0----BT----\r\n8800BL0CK-0068\r\n"
  },
  {
    "path": "tools/z88dk/oz/makewzd.c",
    "content": "/*\r\n *   Binary to WZD conversion utility\r\n *   this tool comes from the OZ-7xx Developement Kit\r\n *   by Alexander R. Pruss \r\n *\r\n *      If (and only if) you use any of the read*() or write*()\r\n *      functions and publically release your program, you MUST apply to\r\n *      Alexander R. Pruss (ap85@georgetown.edu) for an owner ID for\r\n *      your program and you MUST link an owner ID into your program\r\n *      with makewzd or equivalent.  For in-house testing, you may use\r\n *      the ID of 65535, but not for public release.  Owner IDs will be\r\n *      granted free of charge.  Specify what programs you plan to write\r\n *      and how many IDs you'd like (you can get up to ten each time you\r\n *      apply). It is illegal to use either an owner ID not assigned to\r\n *      you or the ID of 65535 for publically released programs.  A\r\n *      program counts as publically released if it is posted in a\r\n *      publically available way (e.g., a web site) or sold to the\r\n *      public.\r\n *      There is, however, one exception to this rule.  If you write a\r\n *      program that processes files generated by other applications\r\n *      which duly have owner IDs assigned, e.g., a program that reads\r\n *      font files, or a file manager, or a multi-purpose binary file\r\n *      viewer, you do not need to apply for an owner ID.\r\n *\r\n *   $Id: makewzd.c,v 1.2 2005-05-25 17:18:30 stefano Exp $\r\n */\r\n\r\n\r\n\r\n#include <stdlib.h>\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <time.h>\r\n\r\n#ifdef __APPLE__\r\n#define O_BINARY 0\r\n#define __unix__\r\n#else\r\n#ifndef __unix__\r\n#include <io.h>\r\n#endif\r\n#endif\r\n\r\n#include <fcntl.h>\r\n#include <unistd.h>\r\n\r\n\r\nchar *randname(void);\r\nunsigned long getlength(char *s);\r\n\r\n/* BASIC ICON */\r\n/*static char thehead[]={\r\n0x1A, 0xFC, 0x0F, 0x02, 0x0C, 0x01, 0x0A, 0xFF, 0x09, 0x01, 0x0D, 0x3D,\r\n0x0D,\r\n0x45, 0x0D, 0x3D, 0x0D, 0x45, 0x0D, 0x3D, 0x0D, 0x01, 0x0D, 0xFF, 0x07,\r\n0x00, 0x00 };\r\n*/\r\n/* C Program Icon */\r\n/*static char thehead[]={\r\n0x1A, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x02, 0x00, 0xe2, 0x03, 0x22,\r\n0x04,\r\n0x22, 0x04, 0xe2, 0x03, 0x22, 0x00, 0xa4, 0x00, 0x78, 0x00, 0x20, 0x00,\r\n0x00, 0x00 };\r\n*/\r\n/* New C Program Icon */\r\nstatic char thehead[]={\r\n0x1a, 0xFF, 0x03, 0x01, 0x06, 0xF1, 0x0E, 0xF9, 0x09, 0x99, 0x09, 0x19, 0x08, 0x19,\r\n0x08, 0x99, 0x09, 0xF9, 0x09, 0xF1, 0x08, 0x01, 0x08, 0xFF, 0x0F, 0x00, 0x00 };\r\n\r\n#ifndef __unix__\r\nunsigned long getlength(char *s)\r\n{\r\n   int h;\r\n   unsigned long l;\r\n   if(!(h=open(s,O_BINARY|O_RDONLY))) return 0;\r\n   l=filelength(h);\r\n   close(h);\r\n   return l;\r\n}\r\n#else\r\nunsigned long getlength(char *s)\r\n{\r\n    unsigned long l;\r\n    FILE *fh=fopen(s,\"rb\");\r\n    if(!fh) return 0;\r\n    fseek(fh,0,SEEK_END);\r\n    l=ftell(fh);\r\n    fclose(fh);\r\n    return l;\r\n}\r\n#endif\r\n\r\nchar *randname()\r\n{\r\n    static char name[9];\r\n    int i;\r\n    int r;\r\n    name[0]='B';\r\n    for(i=1; i<8; i++)\r\n    {\r\n        r=rand()%(26+10);\r\n\tif(r<10) name[i]=(char)(r+'0'); else name[i]=(char)(r+'A'-10);\r\n    }\r\n    name[8]=0;\r\n    return name;\r\n}\r\n\r\n// int main(argc,OrigArgv)\r\nint main(int argc, char *OrigArgv[]) \r\n// int argc;\r\n// char **OrigArgv;\r\n{\r\n\tFILE *in, *out;\r\n    int c;\r\n\tchar name[128];\r\n    char *rn;\r\n    char locname[12];\r\n    char **argv;\r\n\tunsigned i;\r\n    unsigned short owner,oldowner;\r\n    time_t s;\r\n    srand(time(&s));\r\n    argv=OrigArgv;\r\n    if(argc>1 && argv[1][0]=='-')\r\n    {\r\n      sscanf(argv[1]+1,\"%hu\",&owner);\r\n      argv++;\r\n      argc--;\r\n    }\r\n    else owner=65535;\r\n    if(argc!=2 && argc!=3 && argc!=4 && argc!=5)\r\n    {\r\n        fprintf(stderr,\"makewzd [-ownerid] filename [Title [(\\\"Description\\\" | @descfile) [iconfile]]]\\n\\n\"\r\n            \"  Creates filename.wzd from filename.bin, adding Title and\\n\"\r\n            \"  Description if specified, and loading in an iconfile if provided.\\n\"\r\n            \"  The default title is the filename.\\n\");\r\n        return 1;\r\n    }\r\n    strcpy(name,argv[1]);\r\n    strcat(name,\".bin\");\r\n    if(!getlength(name) || NULL==(in=fopen(name,\"rb\")))\r\n    {\r\n\t\tfprintf(stderr,\"File `%s' is either unaccessible or zero length.\\n\",name);\r\n\t\treturn 4;\r\n    }\r\n    strcpy(name,argv[1]);\r\n    strcat(name,\".wzd\");\r\n\tif(NULL==(out=fopen(name,\"wb\")))\r\n\t{\r\n\t\tfprintf(stderr,\"Cannot open `%s' for writing.\\n\",name);\r\n\t\treturn 5;\r\n\t}\r\n\tfprintf(out,\"<SHARP WZD DATA>\\r\\n\"\r\n\t\"<DATA TYPE>\\r\\n\"\r\n\t\"MY PROGRAMS\\r\\n\"\r\n\t\"</DATA TYPE>\\r\\n\"\r\n\t\"<TITLE>\\r\\n\"\r\n\t\"%s\\r\\n\"\r\n\t\"</TITLE>\\r\\n\"\r\n\t\"<CATEGORY>\\r\\n\"\r\n\t\"PROGRAM\\r\\n\"\r\n\t\"</CATEGORY>\\r\\n\"\r\n    \"<DESCRIPTION>\\r\\n\", ( (argc==2)?argv[1]: argv[2] ));\r\n    if(argc>=4 && argv[3][0]=='@')\r\n    {\r\n        FILE *desc=fopen(argv[3]+1,\"r\");\r\n        if(desc==NULL)\r\n        {\r\n            fprintf(stderr,\"Cannot open %s.\\n\",argv[3]+1);\r\n            return 6;\r\n        }\r\n        while(-1!=(c=fgetc(desc)))\r\n          if(c=='\\n') fputs(\"\\r\\n\",out); else fputc(c,out);\r\n        fputs(\"\\r\\n\",out);\r\n        fclose(desc);\r\n    }\r\n    else fprintf(out,\"%s\\r\\n\",(argc==2)?argv[1]:( (argc==3)?argv[2]: argv[3] ));\r\n    fprintf(out,\r\n\t\"</DESCRIPTION>\\r\\n\"\r\n\t\"<CONTENT>\\r\\n\"\r\n\t\"BIN_PROG_1\\r\\n\"\r\n\t\"</CONTENT>\\r\\n\"\r\n\t\"<DATA>\\r\\n\"\r\n    \"PFILE:%s.BAS\\r\\n\"\r\n\t\"</DATA>\\r\\n\"\r\n    \"<BIN>\\r\\n\",\r\n    rn=randname());\r\n    if(argc==5)\r\n    {\r\n        FILE *icon=fopen(argv[4],\"rb\");\r\n        if(NULL==icon)\r\n        {\r\n            fprintf(stderr,\"Cannot open icon file.\\n\");\r\n            fclose(out);\r\n            unlink(name);\r\n            return 17;\r\n        }\r\n        while(-1!=(c=getc(icon))) fputc(c,out);\r\n        fclose(icon);\r\n    }\r\n    else\r\n    for(i=0; i<sizeof(thehead)/sizeof(char); i++) fputc(thehead[i],out);\r\n    for(i=0; i<0x14 && -1!=(c=fgetc(in)); i++)  fputc(c,out);\r\n    if(c==-1)\r\n    {\r\n        fprintf(stderr,\"Error reading!\\n\");\r\n        fclose(out);\r\n        unlink(name);\r\n    }\r\n    fread(locname,12,1,in);\r\n    if(strcmp(locname,\"BFILNAMEBAS\"))\r\n    {\r\n        fprintf(stderr,\"Warning: Old init code, no filename record.\\n\");\r\n        fwrite(locname,12,1,out);\r\n    }\r\n    else\r\n    {\r\n        fwrite(rn,8,1,out);\r\n        fwrite(\"BAS\",4,1,out);\r\n    }\r\n    fread(&oldowner,2,1,in);\r\n    if(oldowner!=65535)\r\n    {\r\n        fprintf(stderr,\"Warning: No room for owner ID.\\n\");\r\n        owner=oldowner;\r\n    }\r\n    fwrite(&owner,2,1,out);\r\n    while(-1!=(c=fgetc(in))) fputc(c,out);\r\n    fclose(in);\r\n\tfclose(out);\r\n\treturn 0;\r\n}\r\n\r\n"
  },
  {
    "path": "tools/z88dk/samcoupe/pyz80.py",
    "content": "#!/usr/bin/env python\n\nfrom __future__ import print_function\n\n# TODO: define and assemble macro blocks\n# added FILESIZE(\"filename\")\n# defs doesn't cause bytes to be written to output unless real data follows\n\ndef printusage():\n    print(\"pyz80 by Andrew Collier, modified by Simon Owen\")\n    print(\" https://github.com/simonowen/pyz80/\")\n    print(\"Usage:\")\n    print(\"     pyz80 (options) inputfile(s)\")\n    print(\"Options:\")\n    print(\"-o outputfile\")\n    print(\"   save the resulting disk image at the given path\")\n    print(\"--nozip\")\n    print(\"   do not compress the resulting disk image\")\n    print(\"-I filepath\")\n    print(\"   Add this file to the disk image before assembling\")\n    print(\"   May be used multiple times to add multiple files\")\n    print(\"--obj=outputfile\")\n    print(\"   save the output code as a raw binary file at the given path\")\n    print(\"-D symbol\")\n    print(\"-D symbol=value\")\n    print(\"   Define a symbol before parseing the source\")\n    print(\"   (value is integer; if omitted, assume 1)\")\n    print(\"--exportfile=filename\")\n    print(\"   Save all symbol information into the given file\")\n    print(\"--importfile=filename\")\n    print(\"   Define symbols before assembly, from a file previously exported\")\n    print(\"--mapfile=filename\")\n    print(\"   Save address-to-symbol map into the given file\")\n    print(\"--lstfile=filename\")\n    print(\"   Produce assembly listing into given file\")\n    print(\"--case\")\n    print(\"   treat source labels as case sensitive (as COMET itself did)\")\n    print(\"--nobodmas\")\n    print(\"   treat arithmetic operators without precedence (as COMET itself did)\")\n    print(\"-s regexp\")\n    print(\"   print the value of any symbols matching the given regular expression\")\n    print(\"   This may be used multiple times to output more than one subset\")\n    print(\"-e\")\n    print(\"   use python's own error handling instead of trying to catch parse errors\")\n    \n\ndef printlicense():\n    print(\"This program is free software; you can redistribute it and/or modify\")\n    print(\"it under the terms of the GNU General Public License as published by\")\n    print(\"the Free Software Foundation; either version 2 of the License, or\")\n    print(\"(at your option) any later version.\")\n    print(\" \")\n    print(\"This program is distributed in the hope that it will be useful,\")\n    print(\"but WITHOUT ANY WARRANTY; without even the implied warranty of\")\n    print(\"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\")\n    print(\"GNU General Public License for more details.\")\n    print(\" \")\n    print(\"You should have received a copy of the GNU General Public License\")\n    print(\"along with this program; if not, write to the Free Software\")\n    print(\"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\")\n\nimport getopt\nimport sys, os\nimport array\nimport fileinput\nimport re\nimport gzip\nimport math # for use by expressions in source files\nimport random\n\n# Try for native pickle (2.x), fall back on Python version (3.x)\ntry:\n    import cPickle as pickle\nexcept ImportError:\n    import pickle\n\ndef new_disk_image():\n    \n    image = array.array('B')\n    image.append(0)\n    targetsize = 80*10*2*512\n    # disk image is arranged as: tr 0 s 1-10, tr 128 s 1-10, tr 1 s 1-10, tr 129 s 1-10 etc\n    \n    while len(image) < targetsize:\n        image.extend(image)\n    while len(image) > targetsize:\n        image.pop()\n\n    return image\n\ndef dsk_at(track,side,sector):\n    return (track*20+side*10+(sector-1))*512\n    # uses numbering 1-10 for sectors, because SAMDOS internal format also does\n\n\ndef add_file_to_disk_image(image, filename, codestartpage, codestartoffset, execpage=0, execoffset=0, filelength=None, fromfile=None ):\n    global firstpageoffset\n\n    if fromfile != None:\n        fromfilefile = open(fromfile,'rb')\n        fromfilefile.seek(0,2)\n        filelength = fromfilefile.tell()\n        \n        fromfilefile.seek(0)\n        fromfile = array.array('B')\n        fromfile.fromfile(fromfilefile, filelength)\n\n    sectors_already_used = 0\n    # we're writing the whole image, so we can take a bit of a shortcut\n    # instead of reading the entire sector map to find unused space, we can assume all files are contiguous\n    # and place new files just at the end of the used space\n\n    #find an unused directory entry\n    for direntry in range(80):\n        dirpos = dsk_at(direntry//20,0,1+(direntry%20)//2) + 256*(direntry%2)\n        if image[dirpos] == 0:\n            break;\n        else:\n            sectors_already_used += image[dirpos+11]*256 +image[dirpos+12]\n            \n    else:\n        fatal (\"Too many files for dsk format\")\n\n    image[dirpos] = 19 # code file\n\n    for i in range(10):\n        image[dirpos+1+i]  = ord((filename+\"          \")[i])\n\n    nsectors = 1 + (filelength+9)//510\n    image[dirpos+11] = nsectors // 256 # MSB number of sectors used\n    image[dirpos+12] = nsectors % 256 # LSB number of sectors used\n    \n    starting_side =  (4 + sectors_already_used//10)//80\n    starting_track = (4 + sectors_already_used//10)%80\n    starting_sector = sectors_already_used%10 + 1\n    \n    image[dirpos+13] = starting_track + 128*starting_side # starting track\n    image[dirpos+14] = starting_sector # starting sector\n\n    # 15 - 209 sector address map\n \n    # write table of used sectors (can precalculate from number of used bits)\n    while nsectors > 0:\n        image[dirpos+15 + sectors_already_used//8] |= (1 << (sectors_already_used & 7))\n        sectors_already_used += 1\n        nsectors -= 1\n    \n    # 210-219 MGT future and past (reserved)\n        \n    image[dirpos+220] = 0 # flags (reserved)\n\n    # 221-231 File type information (n/a for code files)\n    # 232-235 reserved\n    \n    image[dirpos+236] = codestartpage # start page number\n    image[dirpos+237] = (codestartoffset%256) # page offset (in section C, 0x8000 - 0xbfff)\n    image[dirpos+238] = 128 + (codestartoffset // 256)\n    \n    image[dirpos+239] = filelength//16384 # pages in length\n    image[dirpos+240] = filelength%256 # file length % 16384\n    image[dirpos+241] = (filelength%16384)//256\n    \n    if (execpage>0) :\n        image[dirpos+242] = execpage # execution address or 255 255 255 (basicpage, L, H - offset in page C)\n        image[dirpos+243] = execoffset % 256;\n        image[dirpos+244] = (execoffset%16384)//256 + 128\n    else:\n        image[dirpos+242] = 255 # execution address or 255 255 255 (basicpage, L, H - offset in page C)\n        image[dirpos+243] = 255\n        image[dirpos+244] = 255\n\n\n    side = starting_side\n    track = starting_track\n    sector = starting_sector\n    fpos = 0\n\n# write file's 9 byte header and file\n    imagepos = dsk_at(track,side,sector)\n    \n# 0       File type               19 for a code file\n    image[imagepos + 0] = 19\n# 1-2     Modulo length           Length of file % 16384\n    image[imagepos + 1] = filelength%256\n    image[imagepos + 2] = (filelength%16384)//256\n# 3-4     Offset start            Start address\n    image[imagepos + 3] = (codestartoffset%256)\n    image[imagepos + 4] = 128 + (codestartoffset // 256)\n# 5-6     Unused\n# 7       Number of pages\n    image[imagepos + 7] = filelength//16384\n# 8       Starting page number\n    image[imagepos + 8] = codestartpage\n\n    start_of_file = True\n    while fpos < filelength:\n        imagepos = dsk_at(track,side,sector)\n        unadjustedimagepos = imagepos\n        if start_of_file:\n            if filelength > 500:\n                copylen = 501\n            else:\n                copylen = filelength\n            imagepos += 9\n            start_of_file = False\n        else:\n            if (filelength-fpos) > 509:\n                copylen = 510\n            else:\n                copylen = (filelength-fpos)\n        \n        if fromfile != None:\n            image[imagepos:imagepos+copylen] = fromfile[fpos:fpos+copylen]\n        else:\n            if ((fpos+firstpageoffset)//16384) == (((fpos+codestartoffset)+copylen-1)//16384):\n                if memory[codestartpage+(fpos+codestartoffset)//16384] != '':\n                    image[imagepos:imagepos+copylen] = memory[codestartpage+(fpos+firstpageoffset)//16384][(fpos+codestartoffset)%16384 : (fpos+codestartoffset)%16384+copylen]\n            else:\n                copylen1 = 16384 - ((fpos+codestartoffset)%16384)\n                page1 = (codestartpage+(fpos+codestartoffset)//16384)\n                if memory[page1] != '':\n                    image[imagepos:imagepos+copylen1] = memory[page1][(fpos+codestartoffset)%16384 : ((fpos+codestartoffset)%16384)+copylen1]\n                if (page1 < 31) and memory[page1+1] != '':\n                    image[imagepos+copylen1:imagepos+copylen] = memory[page1+1][0 : ((fpos+codestartoffset)+copylen)%16384]\n        \n        fpos += copylen\n        \n        sector += 1\n        if sector == 11:\n            sector = 1\n            track += 1\n            if track == 80:\n                track = 0\n                side += 1\n                if side==2:\n                    fatal(\"Disk full writing \"+filename)\n        \n        # pointers to next sector and track\n        if (fpos < filelength):\n            image[unadjustedimagepos+510] = track + 128*side\n            image[unadjustedimagepos+511] = sector\n\n\ndef save_disk_image(image, pathname):\n    imagestr = image.tobytes() if sys.version_info[0] >= 3 and sys.version_info[1] >= 2 else image.tostring()\n    if ZIP:\n        dskfile = gzip.open(pathname, 'wb')\n    else:\n        dskfile = open(pathname, 'wb')\n    dskfile.write(imagestr)\n    dskfile.close()\n    \n\ndef save_memory(memory, image=None, filename=None):\n    global firstpage,firstpageoffset\n    \n    if firstpage==32:\n        # code was assembled without using a DUMP directive\n        firstpage = 1\n        firstpageoffset = 0\n    \n    if memory[firstpage] != '':\n        # check that something has been assembled at all\n    \n        filelength = (lastpage - firstpage + 1) * 16384\n        \n        filelength -= firstpageoffset\n        filelength -= 16384-lastpageoffset\n        \n        if (autoexecpage>0) :\n            savefilename = (\"AUTO\" + filename + \"    \")[:8]+\".O\"\n        else:\n            savefilename = (filename + \"    \")[:8]+\".O\"\n\n        if image:\n            add_file_to_disk_image(image,savefilename,firstpage, firstpageoffset, autoexecpage, autoexecorigin, filelength)\n        else:\n            save_memory_to_file(filename, firstpage, firstpageoffset, filelength)\n\ndef save_file_to_image(image, pathname):\n    sam_filename = os.path.basename(pathname)\n    \n    if len(sam_filename)>10:\n        if sam_filename.count(\".\"):\n            extpos = sam_filename.rindex(\".\")\n            extlen = len(sam_filename)-extpos\n            sam_filename = sam_filename[:10-extlen] + sam_filename[extpos:]\n        else:\n            sam_filename = sam_filename[:10]\n    \n    add_file_to_disk_image(image,sam_filename, 1, 0, fromfile=pathname)\n\ndef save_memory_to_file(filename, firstusedpage, firstpageoffset, filelength):\n    objfile = open(filename, 'wb')\n    \n    flen = filelength\n    page = firstusedpage\n    offset = firstpageoffset\n    \n    while flen:\n        wlen = min(16384-offset, flen)\n        \n        if memory[page] != \"\":\n            pagestr = memory[page].tostring()\n            objfile.write(pagestr[offset:offset+wlen])\n            \n            \n        else:\n            # write wlen nothings into the file\n            objfile.seek(wlen,1)\n        \n        flen -= wlen\n        page += 1\n        offset=0\n    \n    objfile.close()\n\ndef warning(message):\n    print(global_currentfile, 'warning:', message)\n    print('\\t', global_currentline.strip())\n\ndef fatal(message):\n    print(global_currentfile, 'error:', message)\n    print ('\\t', global_currentline.strip())\n    sys.exit(1)\n\ndef expand_symbol(sym):\n    while 1:\n        match = re.search('\\{([^\\{\\}]*)\\}', sym)\n        if match:            \n            value = parse_expression(match.group(1))\n            sym = sym.replace(match.group(0),str(value))\n        else:\n            break\n    return sym\n\ndef file_and_stack(explicit_currentfile=None):\n    \n    if explicit_currentfile==None:\n        explicit_currentfile = global_currentfile\n    \n    f,l = explicit_currentfile.split(':')\n    s=''\n    for i in forstack:\n        s=s+\"^\"+str(i[2])\n    return f+s+':'+l\n\ndef set_symbol(sym, value, explicit_currentfile=None, is_label=False):\n    symorig = expand_symbol(sym)\n    sym = symorig if CASE else symorig.upper()\n\n    if sym[0]=='@':\n        sym = sym + '@' + file_and_stack(explicit_currentfile=explicit_currentfile)\n    symboltable[sym] = value \n    symbolcase[sym] = symorig\n\n    if is_label:\n        labeltable[sym] = value\n\ndef get_symbol(sym):\n    symorig = expand_symbol(sym)\n    sym = symorig if CASE else symorig.upper()\n \n    if sym[0]=='@':\n        if (sym + '@' + file_and_stack()) in symboltable:\n            return symboltable[sym + '@' + file_and_stack()]\n        else:\n            if len(sym) > 1 and (sym[1]=='-' or sym[1]=='+'):\n                directive = sym[1]\n                sym = sym[0]+sym[2:]\n            else:\n                directive=''\n            \n            reqfile,reqline = file_and_stack().split(':')\n            reqline = int(reqline)\n \n            closestKey = None\n            for key in symboltable:\n                if (sym+'@'+reqfile+\":\").startswith(key.split(\":\",1)[0]+\":\") or (sym+'@'+reqfile+\":\").startswith(key.split(\":\",1)[0]+\"^\"):\n                    # key is allowed fewer layers of FOR stack, but any layers it has must match\n                    # ensure a whole number (ie 1 doesn't match 11) by forceing a colon or hat\n                    symfile,symline = key.split(':')\n                    symline=int(symline)\n                    \n                    difference = reqline - symline\n                    \n                    if (difference < 0 or directive != '+') and (difference > 0 or directive != '-') and ((closestKey == None) or (abs(difference) < closest)):\n                        closest = abs(difference)\n                        closestKey = key\n\n            if (not closestKey) and (directive == '-'):\n                global include_stack\n                use_include_stack = include_stack\n                use_include_stack.reverse()\n                # try searching up the include stack\n                for include_item in use_include_stack:\n                    include_file, include_line = include_item[1].split(\":\",1)\n                    if not closestKey:\n                        for key in symboltable:\n                            if (sym+'@'+include_file+\":\").startswith(key.split(\":\",1)[0]+\":\") or (sym+'@'+include_file+\":\").startswith(key.split(\":\",1)[0]+\"^\"):\n                                # key is allowed fewer layers of FOR stack, but any layers it has must match\n                                # ensure a whole number (ie 1 doesn't match 11) by forceing a colon or hat\n                                symfile,symline = key.split(':')\n                                symline=int(symline)\n\n                                difference = int(include_line) - symline\n                                \n                                if (difference < 0 or directive != '+') and (difference > 0 or directive != '-') and ((closestKey == None) or (abs(difference) < closest)):\n                                    closest = abs(difference)\n                                    closestKey = key\n    \n    \n\n            if closestKey != None:\n                sym = closestKey\n\n            \n    \n    \n    if sym in symboltable:\n        symusetable[sym] = symusetable.get(sym,0)+1\n        return symboltable[sym]\n\n    return None\n\n\n\n\ndef parse_expression(arg, signed=0, byte=0, word=0, silenterror=0):\n    if ',' in arg:\n        if silenterror:\n            return ''\n        fatal(\"Erroneous comma in expression\"+arg)\n    \n    while 1:\n        match = re.search('\"(.)\"', arg)\n        if match:\n            arg = arg.replace('\"'+match.group(1)+'\"',str(ord(match.group(1))))\n        else:\n            break\n\n    while 1:\n        match = re.search('defined\\s*\\(\\s*(.*)\\s*\\)', arg, re.IGNORECASE)\n        if match:\n            result = (get_symbol(match.group(1)) != None)\n            arg = arg.replace(match.group(0),str(int(result)))\n            \n        else:\n            break\n    \n    arg = arg.replace('$','('+str(origin)+')')\n    arg = arg.replace('%','0b') # COMET syntax for binary literals (parsed later, change to save confusion with modulus)\n    arg = arg.replace('\\\\','%') # COMET syntax for modulus\n    arg = arg.replace('&','0x') # COMET syntax for hex numbers\n    \n    #    don't do these except at the start of a token:    \n    arg = re.sub('\\\\b0X', '0x', arg) # darnit, this got capitalized\n    arg = re.sub('\\\\b0B', '0b', arg) # darnit, this got capitalized\n        \n# if the argument contains letters at this point,\n# it's a symbol which needs to be replaced\n    \n    testsymbol=''\n    argcopy = ''\n    \n    incurly = 0\n    inquotes = False\n    \n    for c in arg+' ':\n        if c.isalnum() or c in '\"_.@{}' or (c==\"+\" and testsymbol=='@') or (c==\"-\" and testsymbol=='@') or incurly or inquotes:\n            testsymbol += c\n            if c=='{':\n                incurly += 1\n            elif c=='}':\n                incurly -= 1\n            elif c=='\"':\n                inquotes = not inquotes\n\n\n        else:\n            if (testsymbol != ''):\n                if not testsymbol[0].isdigit():\n                    result = get_symbol(testsymbol)\n                    if (result != None):\n                        testsymbol = str(result)\n                    elif testsymbol[0] == '\"' and testsymbol[-1]=='\"':\n                        # string literal used in some expressions\n                        pass\n                    else:\n                        understood = 0\n                        # some of python's math expressions should be available to the parser\n                        if not understood and testsymbol.lower() != 'e':\n                            parsestr = 'math.'+testsymbol.lower()\n                            try:\n                                eval(parsestr)\n                                understood = 1\n                            except:\n                                understood = 0\n                        \n                        if not understood:\n                            parsestr = 'random.'+testsymbol.lower()\n                            try:\n                                eval(parsestr)\n                                understood = 1\n                            except:\n                                understood = 0\n                        \n                        if testsymbol in [\"FILESIZE\"]:\n                            parsestr = 'os.path.getsize'\n                            understood = 1\n                        \n                        if not understood :\n                            if silenterror:\n                                return ''\n                            fatal(\"Error in expression \"+arg+\": Undefined symbol \"+expand_symbol(testsymbol))\n                        \n                        testsymbol = parsestr\n                        \n                elif testsymbol[0]=='0' and len(testsymbol)>2 and testsymbol[1]=='b':\n                # binary literal\n                    literal = 0\n                    for digit in testsymbol[2:]:\n                        literal *= 2\n                        if digit == '1':\n                            literal += 1\n                    testsymbol = str(literal)\n                \n                elif testsymbol[0]=='0' and len(testsymbol)>1 and testsymbol[1]!='x':\n                # literals with leading zero would be treated as octal,\n                # COMET source files do not expect this\n                    decimal = testsymbol\n                    while decimal[0] == '0' and len(decimal)>1:\n                        decimal = decimal[1:]\n                    testsymbol = decimal\n                \n                argcopy += testsymbol\n                testsymbol = ''\n            argcopy += c\n    \n    if NOBODMAS:\n        # add bracket pairs at interesting locations to simulate left-to-right evaluation\n        \n        aslist = list(argcopy) # turn it into a list so that we can add characters without affecting indexes\n        bracketstack=[0]\n        symvalid = False\n    \n        for c in range (len(aslist)):\n            if aslist[c] == \"(\":\n                bracketstack = [c]+bracketstack\n            elif aslist[c] == \")\":\n                bracketstack = bracketstack[1:]\n            elif (not aslist[c].isalnum()) and (not aslist[c]=='.') and (not aslist[c].isspace()) and symvalid:\n                aslist[c] = \")\"+aslist[c]\n                aslist[bracketstack[0]] = '('+aslist[bracketstack[0]]\n                symvalid = False\n            elif aslist[c].isalnum():\n                symvalid = True\n    \n        argcopy2=\"\"\n        for entry in aslist:\n            argcopy2 += entry\n    #    print(argcopy,\"->\",argcopy2)\n        argcopy = argcopy2\n    \n    farg = eval(argcopy)\n    if farg >= -.5:\n        farg += 0.5\n    else:\n        farg -= 0.5\n    narg = int(farg)\n#    print(arg, \" -> \",argcopy,\" == \",narg)\n    \n    if signed:\n        if byte:\n            if (  -128 < narg > 127):\n                warning (\"Signed byte value truncated from \"+str(narg));\n            narg = (narg + 128)%256 -128\n        elif word:\n            if (  -32768 < narg > 32767):\n                warning (\"Signed word value truncated from \"+str(narg));\n            narg = (narg + 32768)%65536 - 32768\n    else:\n        if byte:\n            if (  0 < narg > 255):\n                warning (\"Unsigned byte value truncated from \"+str(narg));\n            narg %= 256\n        elif word:\n            if (  0 < narg > 65535):\n                warning (\"Unsigned byte value truncated from \"+str(narg));\n            narg %= 65536\n    return narg\n\ndef double(arg, allow_af_instead_of_sp=0, allow_af_alt=0, allow_index=1):\n# decode double register [bc, de, hl, sp][ix,iy] --special:  af af'\n    double_mapping = {'BC':([],0), 'DE':([],1), 'HL':([],2), 'SP':([],3), 'IX':([0xdd],2), 'IY':([0xfd],2), 'AF':([],5), \"AF'\":([],4) }\n    rr = double_mapping.get(arg.strip().upper(),([],-1))\n    if (rr[1]==3) and allow_af_instead_of_sp:\n        rr = ([],-1)\n    if rr[1]==5:\n        if allow_af_instead_of_sp:\n            rr = ([],3)\n        else:\n            rr = ([],-1)\n    if (rr[1]==4) and not allow_af_alt:\n        rr = ([],-1)\n    \n    if (rr[0] != []) and not allow_index:\n        rr = ([],-1)\n    \n    return rr\n\ndef single(arg, allow_i=0, allow_r=0, allow_index=1, allow_offset=1, allow_half=1):\n#decode single register [b,c,d,e,h,l,(hl),a][(ix {+c}),(iy {+c})]\n    single_mapping = {'B':0, 'C':1, 'D':2, 'E':3, 'H':4, 'L':5, 'A':7, 'I':8, 'R':9, 'IXH':10, 'IXL':11, 'IYH':12, 'IYL':13 }\n    m = single_mapping.get(arg.strip().upper(),-1)\n    prefix=[]\n    postfix=[]\n    \n    if m==8 and not allow_i:\n        m = -1\n    if m==9 and not allow_r:\n        m = -1\n \n    if allow_half:\n        if m==10:\n            prefix = [0xdd]\n            m = 4\n        if m==11:\n            prefix = [0xdd]\n            m = 5\n        if m==12:\n            prefix = [0xfd]\n            m = 4\n        if m==13:\n            prefix = [0xfd]\n            m = 5\n    else:\n        if m >= 10 and m <= 13:\n            m = -1\n    \n    if m==-1 and re.search(\"\\A\\s*\\(\\s*HL\\s*\\)\\s*\\Z\", arg, re.IGNORECASE):\n        m = 6\n    \n    if m==-1 and allow_index:\n        match = re.search(\"\\A\\s*\\(\\s*IX\\s*\\)\\s*\\Z\", arg, re.IGNORECASE)\n        if match:\n            m = 6\n            prefix = [0xdd]\n            postfix = [0]\n            \n        elif allow_offset:\n            match = re.search(\"\\A\\s*\\(\\s*IX\\s*([+-].*)\\s*\\)\\s*\\Z\", arg, re.IGNORECASE)\n            if match:\n                m = 6\n                prefix = [0xdd]\n                if p==2:\n                    postfix = [parse_expression(match.group(1), byte=1)]\n                else:\n                    postfix = [0]\n\n    if m==-1 and allow_index:\n        match = re.search(\"\\A\\s*\\(\\s*IY\\s*\\)\\s*\\Z\", arg, re.IGNORECASE)\n        if match:\n            m = 6\n            prefix = [0xfd]\n            postfix = [0]\n\n        elif allow_offset:\n            match = re.search(\"\\A\\s*\\(\\s*IY\\s*([+-].*)\\s*\\)\\s*\\Z\", arg, re.IGNORECASE)\n            if match:\n                m = 6\n                prefix = [0xfd]\n                if p==2:\n                    postfix = [parse_expression(match.group(1), byte=1)]\n                else:\n                    postfix = [0]\n    \n    return prefix,m,postfix\n\ndef condition(arg):\n# decode condition [nz, z, nc, c, po, pe, p, m]\n    condition_mapping = {'NZ':0, 'Z':1, 'NC':2, 'C':3, 'PO':4, 'PE':5, 'P':6, 'M':7 }\n    return condition_mapping.get(arg.upper(),-1)\n\n\ndef dump(bytes):\n    def initpage(page):\n        memory[page] = array.array('B')\n        \n        memory[page].append(0)\n        while len(memory[page]) < 16384:\n            memory[page].extend(memory[page])\n    \n    global dumppage, dumporigin, dumpspace_pending, lstcode, listingfile\n    \n    if (p==2):\n        if dumpspace_pending > 0:\n            dumporigin += dumpspace_pending\n            dumppage += dumporigin // 16384\n            dumporigin %= 16384\n            dumpspace_pending = 0\n        \n        if memory[dumppage]=='':\n            initpage(dumppage)\n        lstcode = \"\"\n        for b in bytes:\n           # if b<0 or b>255:\n           #     warning(\"Dump byte out of range\")\n            memory[dumppage][dumporigin] = b\n            if listingfile != None:\n              lstcode=lstcode+\"%02X \"%(b)\n            dumporigin += 1\n            if dumporigin == 16384:\n                dumporigin = 0\n                dumppage += 1\n                \n                if memory[dumppage]=='':\n                    initpage(dumppage)\n\ndef check_args(args,expected):\n    if args=='':\n        received = 0\n    else:\n        received = len(args.split(','))\n    if expected!=received:\n        fatal(\"Opcode wrong number of arguments, expected \"+str(expected)+\" received \"+str(args))\n\ndef op_ORG(p,opargs):\n    global origin\n    check_args(opargs,1)\n    origin = parse_expression(opargs, word=1)\n    return 0\n\ndef op_DUMP(p,opargs):\n    global dumppage, dumporigin, dumpused, firstpage, firstpageoffset, dumpspace_pending\n\n    if dumpused:\n        check_lastpage()\n    dumpused = True\n\n    dumpspace_pending = 0\n    if ',' in opargs:\n        page,offset = opargs.split(',',1)\n        offset = parse_expression(offset, word=1)\n        dumppage = parse_expression(page) + (offset//16384)\n        dumporigin = offset % 16384\n    else:\n        offset = parse_expression(opargs)\n        if (offset<16384):\n            error (\"DUMP value out of range\")\n        dumppage = (offset//16384) - 1\n        dumporigin = offset % 16384\n    \n    if ((dumppage*16384 + dumporigin) < (firstpage*16384 + firstpageoffset)):\n        firstpage = dumppage\n        firstpageoffset = dumporigin\n    \n    return 0\n\ndef op_PRINT(p, opargs):\n    text = []\n    for expr in opargs.split(\",\"):\n        if expr.strip().startswith('\"'):\n            text.append(expr.strip().rstrip()[1:-1])\n        else:\n            a = parse_expression(expr, silenterror=True)\n            if a:\n                text.append(str(a))\n            else:\n                text.append(\"?\")\n    print(global_currentfile, \"PRINT: \", \",\".join(text))\n    return 0\n\ndef check_lastpage():\n    global lastpage, lastpageoffset\n    if dumppage > lastpage:\n        lastpage = dumppage\n        lastpageoffset = dumporigin\n    elif (dumppage == lastpage) and (dumporigin > lastpageoffset):\n        lastpageoffset = dumporigin\n\ndef op_AUTOEXEC(p,opargs):\n    global autoexecpage, autoexecorigin\n    check_args(opargs,0)\n    if (p==2):\n        if (autoexecpage>0 or autoexecorigin>0):\n            fatal(\"AUTOEXEC may only be used once.\");\n        autoexecpage = dumppage + 1; # basic type page numbering\n        autoexecorigin = dumporigin;\n\n    \n    return 0\n\ndef op_EQU(p,opargs):\n    global symboltable\n    check_args(opargs,1)\n    if (symbol):\n        if opargs.upper().startswith(\"FOR\") and (opargs[3].isspace() or opargs[3]=='('):\n            set_symbol(symbol, 0)\n            \n            limit = parse_expression(opargs[4:].strip())\n            if limit < 1:\n                error(\"FOR range < 1 not allowed\")\n            forstack.append( [symbol,global_currentfile,0,limit] )\n\n        else:\n            if p==1:\n                set_symbol(symbol, parse_expression(opargs, signed=1, silenterror=1))\n            else:\n                expr_result = parse_expression(opargs, signed=1)\n\n                existing = get_symbol(symbol)\n\n                if existing == '':\n                    set_symbol(symbol, expr_result)\n                elif existing != expr_result:\n                    fatal(\"Symbol \"+expand_symbol(symbol)+\": expected \"+str(existing)+\" but calculated \"+str(expr_result)+\", has this symbol been used twice?\")\n    else:\n        warning(\"EQU without symbol name\")\n    return 0\n\ndef op_NEXT(p,opargs):\n    global global_currentfile\n\n    \n    check_args(opargs,1)\n    foritem = forstack.pop()\n    if opargs != foritem[0]:\n        fatal(\"NEXT symbol \"+opargs+\" doesn't match FOR: expected \"+foritem[0])\n    foritem[2] += 1\n\n    set_symbol(foritem[0], foritem[2], explicit_currentfile=foritem[1])\n\n    if foritem[2] < foritem[3]:\n        global_currentfile = foritem[1]\n        forstack.append(foritem)\n    \n    return 0\n\ndef op_ALIGN(p,opargs):\n    global dumpspace_pending\n    check_args(opargs,1)\n\n    align = parse_expression(opargs)\n    if align<1:\n        fatal(\"Invalid alignment\")\n    elif (align & (-align)) != align:\n        fatal(\"Alignment is not a power of 2\")\n\n    s = (align - origin%align)%align\n    dumpspace_pending += s\n    return s;\n\ndef op_DS(p,opargs):\n    return op_DEFS(p,opargs)\ndef op_DEFS(p,opargs):\n    global dumppage, dumporigin, dumpspace_pending\n    check_args(opargs,1)\n    \n    if opargs.upper().startswith(\"ALIGN\") and (opargs[5].isspace() or opargs[5]=='('):\n        return op_ALIGN(p,opargs[5:].strip())\n\n    s = parse_expression(opargs)\n    if s<0:\n        fatal(\"Allocated invalid space < 0 bytes (\"+str(s)+\")\")\n    dumpspace_pending += s\n    return s\n\ndef op_DB(p,opargs):\n    return op_DEFB(p,opargs)\ndef op_DEFB(p,opargs):\n    s = opargs.split(',')\n    if (p==2):\n        for b in s:\n            byte=(parse_expression(b, byte=1, silenterror=1))\n            if byte=='':\n                fatal(\"Didn't understand DB or character constant \"+b)\n            else:\n                dump([byte])\n    return len(s)\n\ndef op_DW(p,opargs):\n    return op_DEFW(p,opargs)\ndef op_DEFW(p,opargs):\n    s = opargs.split(',')\n    if (p==2):\n        for b in s:\n            b=(parse_expression(b, word=1))\n            dump([b%256, b//256])\n    return 2*len(s)\n\ndef op_DM(p,opargs):\n    return op_DEFM(p,opargs)\ndef op_DEFM(p,opargs):\n    messagelen = 0\n    if opargs.strip()==\"44\" or opargs==\"(44)\":\n        dump ([44])\n        messagelen = 1\n    else:\n        matchstr = opargs\n        while matchstr.strip():\n            match = re.match('\\s*\\\"(.*)\\\"(\\s*,)?(.*)', matchstr)\n            if not match:\n                match = re.match('\\s*([^,]*)(\\s*,)?(.*)', matchstr)\n                byte=(parse_expression(match.group(1), byte=1, silenterror=1))\n                if byte=='':\n                    fatal(\"Didn't understand DM character constant \"+b)\n                elif p==2:\n                    dump([byte])\n\n                messagelen += 1            \n            else:\n                message = list(match.group(1))\n\n                if p==2:\n                    for i in message:\n                        dump ([ord(i)])\n                messagelen += len(message)\n\n            matchstr = match.group(3)\n\n            if match.group(3) and not match.group(2):\n                matchstr = '\"\"' + matchstr\n                # For cases such as  DEFM \"message with a \"\" in it\"\n                # I can only apologise for this, this is an artefact of my parsing quotes\n                # badly at the top level but it's too much for me to go back and refactor it all.\n                # Of course, it would have helped if Comet had had sane quoting rules in the first place.\n    return messagelen\n\ndef op_MDAT(p,opargs):\n    global dumppage, dumporigin\n    match = re.search('\\A\\s*\\\"(.*)\\\"\\s*\\Z', opargs)\n    filename = os.path.join(global_path, match.group(1))\n    \n    try:\n        mdatfile = open(filename,'rb')\n    except:\n        fatal(\"Unable to open file for reading: \"+filename)\n    \n    mdatfile.seek(0,2)\n    filelength = mdatfile.tell()\n    if p==1:\n        dumporigin += filelength\n        dumppage += dumporigin // 16384\n        dumporigin %= 16384\n    elif p==2:\n        mdatfile.seek(0)\n        mdatafilearray = array.array('B')\n        mdatafilearray.fromfile(mdatfile, filelength)\n        dump(mdatafilearray)\n    \n    mdatfile.close()\n    return filelength\n\ndef op_INCLUDE(p,opargs):\n    global global_path, global_currentfile\n    global include_stack\n    \n    savedorigin = origin\n    \n    match = re.search('\\A\\s*\\\"(.*)\\\"\\s*\\Z', opargs)\n    filename = match.group(1)\n    \n    include_stack.append((global_path, global_currentfile))\n    assembler_pass(p, filename)\n    global_path, global_currentfile = include_stack.pop()\n\n    return 0\n    # global origin has already been updated\n\n\ndef op_FOR(p,opargs):\n    args = opargs.split(',',1)\n    limit = parse_expression(args[0])\n    bytes = 0\n    for iterate in range(limit):\n        symboltable['FOR'] = iterate\n        if CASE:\n            symboltable['for'] = iterate\n        bytes += assemble_instruction(p,args[1].strip())\n    \n    if limit != 0:\n        del symboltable['FOR']\n        if CASE:\n            del symboltable['for']\n\n    return bytes\n\ndef op_noargs_type(p,opargs,instr):\n    check_args(opargs,0)\n    if (p==2):\n        dump(instr)\n    return len(instr)\n   \ndef op_ASSERT(p,opargs):\n    check_args(opargs,1)\n    if (p==2):\n        value = parse_expression(opargs)\n        if value == 0:\n            fatal(\"Assertion failed (\"+opargs+\")\")\n    return 0\n\n\ndef op_NOP(p,opargs):\n    return op_noargs_type(p,opargs,[0x00])\ndef op_RLCA(p,opargs):\n    return op_noargs_type(p,opargs,[0x07])\ndef op_RRCA(p,opargs):\n    return op_noargs_type(p,opargs,[0x0F])\ndef op_RLA(p,opargs):\n    return op_noargs_type(p,opargs,[0x17])\ndef op_RRA(p,opargs):\n    return op_noargs_type(p,opargs,[0x1F])\ndef op_DAA(p,opargs):\n    return op_noargs_type(p,opargs,[0x27])\ndef op_CPL(p,opargs):\n    return op_noargs_type(p,opargs,[0x2F])\ndef op_SCF(p,opargs):\n    return op_noargs_type(p,opargs,[0x37])\ndef op_CCF(p,opargs):\n    return op_noargs_type(p,opargs,[0x3F])\ndef op_HALT(p,opargs):\n    return op_noargs_type(p,opargs,[0x76])\ndef op_DI(p,opargs):\n    return op_noargs_type(p,opargs,[0xf3])\ndef op_EI(p,opargs):\n    return op_noargs_type(p,opargs,[0xfb])\ndef op_EXX(p,opargs):\n    return op_noargs_type(p,opargs,[0xd9])\ndef op_NEG(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0x44])\ndef op_RETN(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0x45])\ndef op_RETI(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0x4d])\ndef op_RRD(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0x67])\ndef op_RLD(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0x6F])\ndef op_LDI(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xa0])\ndef op_CPI(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xa1])\ndef op_INI(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xa2])\ndef op_OUTI(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xa3])\ndef op_LDD(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xa8])\ndef op_CPD(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xa9])\ndef op_IND(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xaa])\ndef op_OUTD(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xab])\ndef op_LDIR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xb0])\ndef op_CPIR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xb1])\ndef op_INIR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xb2])\ndef op_OTIR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xb3])\ndef op_LDDR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xb8])\ndef op_CPDR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xb9])\ndef op_INDR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xba])\ndef op_OTDR(p,opargs):\n    return op_noargs_type(p,opargs,[0xed,0xbb])\n\ndef op_cbshifts_type(p,opargs,offset,step_per_register=1):\n    args = opargs.split(',',1)\n    if len(args) == 2:\n        # compound instruction of the form RLC B,(IX+c)\n        pre1,r1,post1 = single(args[0], allow_half=0, allow_index=0)\n        pre2,r2,post2 = single(args[1], allow_half=0, allow_index=1)\n        if r1==-1 or r2==-1:\n            fatal(\"Registers not recognized for compound instruction\")\n        if r1==6:\n            fatal(\"(HL) not allowed as target of compound instruction\")\n        if len(pre2)==0:\n            fatal(\"Must use index register as operand of compound instruction\")\n                \n        instr=pre2\n        instr.extend([0xcb])\n        instr.extend(post2)\n        instr.append(offset + step_per_register*r1)\n        \n    else:\n        check_args(opargs,1)\n        pre,r,post = single(opargs,allow_half=0)\n        instr = pre\n        instr.extend([0xcb])\n        instr.extend(post)\n        if r==-1:\n            fatal (\"Invalid argument\")\n        else:\n            instr.append(offset + step_per_register*r)\n\n    if (p==2):\n        dump(instr)\n    return len(instr)\n\ndef op_RLC(p,opargs):\n    return op_cbshifts_type(p,opargs,0x00)\ndef op_RRC(p,opargs):\n    return op_cbshifts_type(p,opargs,0x08)\ndef op_RL(p,opargs):\n    return op_cbshifts_type(p,opargs,0x10)\ndef op_RR(p,opargs):\n    return op_cbshifts_type(p,opargs,0x18)\ndef op_SLA(p,opargs):\n    return op_cbshifts_type(p,opargs,0x20)\ndef op_SRA(p,opargs):\n    return op_cbshifts_type(p,opargs,0x28)\ndef op_SLL(p,opargs):\n    if (p==1):\n        warning(\"SLL doesn't do what you probably expect on z80b! Use SL1 if you know what you're doing.\")\n    return op_cbshifts_type(p,opargs,0x30)\ndef op_SL1(p,opargs):\n    return op_cbshifts_type(p,opargs,0x30)\ndef op_SRL(p,opargs):\n    return op_cbshifts_type(p,opargs,0x38)\n\n\n\ndef op_register_arg_type(p,opargs,offset,ninstr,step_per_register=1):\n    check_args(opargs,1)\n    pre,r,post = single(opargs,allow_half=1)\n    instr = pre\n    if r==-1:\n        match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", opargs)\n        if match:\n            fatal (\"Illegal indirection\")\n\n        instr.extend(ninstr)\n        if (p==2):\n            n = parse_expression(opargs, byte=1)\n        else:\n            n = 0\n        instr.append(n)\n    else:\n        instr.append(offset + step_per_register*r)\n    instr.extend(post)\n    if (p==2):\n        dump(instr)\n    return len(instr)\n\ndef op_SUB(p,opargs):\n    return op_register_arg_type(p,opargs, 0x90, [0xd6])\ndef op_AND(p,opargs):\n    return op_register_arg_type(p,opargs, 0xa0, [0xe6])\ndef op_XOR(p,opargs):\n    return op_register_arg_type(p,opargs, 0xa8, [0xee])\ndef op_OR(p,opargs):\n    return op_register_arg_type(p,opargs, 0xb0, [0xf6])\ndef op_CP(p,opargs):\n    return op_register_arg_type(p,opargs, 0xb8, [0xfe])\n\ndef op_registerorpair_arg_type(p,opargs,rinstr,rrinstr,step_per_register=8,step_per_pair=16):\n    check_args(opargs,1)\n    pre,r,post = single(opargs)\n    \n    if r==-1:\n        pre,rr = double(opargs)\n        if rr==-1:\n            fatal (\"Invalid argument\")\n        \n        instr = pre\n        instr.append(rrinstr + step_per_pair*rr)\n    else:\n        instr = pre\n        instr.append(rinstr + step_per_register*r)\n        instr.extend(post)\n    if (p==2):\n        dump(instr)\n    return len(instr)\n\ndef op_INC(p,opargs):\n# Oh dear - COMET also used \"INC\" for INClude source file\n    if '\"' in opargs:\n        return op_INCLUDE(p,opargs)\n    \n    return op_registerorpair_arg_type(p,opargs, 0x04, 0x03)\ndef op_DEC(p,opargs):\n    return op_registerorpair_arg_type(p,opargs, 0x05, 0x0b)\n\ndef op_add_type(p,opargs,rinstr,ninstr,rrinstr,step_per_register=1,step_per_pair=16):\n    args = opargs.split(',',1)\n    r=-1\n    \n    if len(args) == 2:\n        pre,r,post = single(args[0])\n    \n    if (len(args) == 1) or r==7:\n        pre,r,post = single(args[-1])\n        instr = pre\n        if r==-1:\n            match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", args[-1])\n            if match:\n                fatal (\"Illegal indirection\")\n\n            instr.extend(ninstr)\n            if (p==2):\n                n = parse_expression(args[-1], byte=1)\n            else:\n                n = 0\n            instr.append(n)\n        else:\n            instr.extend(rinstr)\n            instr[-1] += step_per_register*r\n        \n        instr.extend(post)\n    else:\n        pre,rr1 = double(args[0])\n        dummy,rr2 = double(args[1])\n        \n        if (rr1 == rr2) and (pre != dummy):\n            fatal (\"Can't mix index registers and HL\")\n        if (len(rrinstr) > 1) and pre:\n            fatal (\"Can't use index registers in this instruction\")\n        \n        if (len(args) != 2) or (rr1 != 2):\n            fatal(\"Invalid argument\")\n        \n        instr = pre\n        instr.extend(rrinstr)\n        instr[-1] += step_per_pair*rr2\n    \n    if (p==2):\n        dump(instr)\n    return len(instr)\n\ndef op_ADD(p,opargs):\n    return op_add_type(p,opargs,[0x80], [0xc6],[0x09])\ndef op_ADC(p,opargs):\n    return op_add_type(p,opargs,[0x88], [0xce],[0xed,0x4a])\ndef op_SBC(p,opargs):\n    return op_add_type(p,opargs,[0x98], [0xde],[0xed,0x42])\n\ndef op_bit_type(p,opargs,offset):\n    check_args(opargs,2)\n    arg1,arg2 = opargs.split(',',1)\n    b = parse_expression(arg1)\n    if b>7 or b<0:\n        fatal (\"argument out of range\")\n    pre,r,post = single(arg2,allow_half=0)\n    instr = pre\n    instr.append(0xcb)\n    instr.extend(post)\n    instr.append(offset + r + 8*b)\n    if (p==2):\n        dump(instr)\n    return len(instr)\n\ndef op_BIT(p,opargs):\n    return op_bit_type(p,opargs, 0x40)\ndef op_RES(p,opargs):\n    return op_bit_type(p,opargs, 0x80)\ndef op_SET(p,opargs):\n    return op_bit_type(p,opargs, 0xc0)\n\ndef op_pushpop_type(p,opargs,offset):\n    \n    check_args(opargs,1)\n    prefix, rr = double(opargs, allow_af_instead_of_sp=1)\n    instr = prefix\n    if rr==-1:\n        fatal (\"Invalid argument\")\n    else:\n        instr.append(offset + 16 * rr)\n    if (p==2):\n        dump(instr)\n    return len(instr)\n\ndef op_POP(p,opargs):\n    return op_pushpop_type(p,opargs, 0xc1)\ndef op_PUSH(p,opargs):\n    return op_pushpop_type(p,opargs, 0xc5)\n\ndef op_jumpcall_type(p,opargs,offset, condoffset):\n    args = opargs.split(',',1)\n    if len(args) == 1:\n        instr = [offset]\n    else:\n        cond = condition(args[0])\n        if cond == -1:\n            fatal (\"Expected condition, received \"+opargs)\n        instr = [condoffset + 8*cond]\n\n    match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", args[-1])\n    if match:\n        fatal (\"Illegal indirection\")\n    \n    if (p==2):\n        nn = parse_expression(args[-1],word=1)\n        instr.extend([nn%256, nn//256])\n        dump(instr)\n    \n    return 3\n\ndef op_JP(p,opargs):\n    if (len(opargs.split(',',1)) == 1):\n        prefix, r, postfix = single(opargs, allow_offset=0,allow_half=0)\n        if r==6:\n            instr = prefix\n            instr.append(0xe9)\n            if (p==2):\n                dump(instr)\n            return len(instr)\n    return op_jumpcall_type(p,opargs, 0xc3, 0xc2)\n\ndef op_CALL(p,opargs):\n    return op_jumpcall_type(p,opargs, 0xcd, 0xc4)\n\ndef op_DJNZ(p,opargs):\n    check_args(opargs,1)\n    if (p==2):\n        target = parse_expression(opargs,word=1)\n        displacement = target - (origin + 2)\n        if displacement > 127 or displacement < -128:\n            fatal (\"Displacement from \"+str(origin)+\" to \"+str(target)+\" is out of range\")\n        dump([0x10,(displacement+256)%256])\n    \n    return 2\n\ndef op_JR(p,opargs):\n    args = opargs.split(',',1)\n    if len(args) == 1:\n        instr = 0x18\n    else:\n        cond = condition(args[0])\n        if cond == -1:\n            fatal (\"Expected condition, received \"+opargs)\n        elif cond >= 4:\n            fatal (\"Invalid condition for JR\")\n        instr = 0x20 + 8*cond\n    if (p==2):\n        target = parse_expression(args[-1],word=1)\n        displacement = target - (origin + 2)\n        if displacement > 127 or displacement < -128:\n            fatal (\"Displacement from \"+str(origin)+\" to \"+str(target)+\" is out of range\")\n        dump([instr,(displacement+256)%256])\n    \n    return 2\n\ndef op_RET(p,opargs):\n    if opargs=='':\n        if (p==2):\n            dump([0xc9])\n    else:\n        check_args(opargs,1)\n        cond = condition(opargs)\n        if cond == -1:\n            fatal (\"Expected condition, received \"+opargs)\n        if (p==2):\n            dump([0xc0 + 8*cond])\n    return 1\n\ndef op_IM(p,opargs):\n    check_args(opargs,1)\n    if (p==2):\n        mode = parse_expression(opargs)\n        if (mode>2) or (mode<0):\n            fatal (\"argument out of range\")\n        if mode > 0:\n            mode += 1\n        \n        dump([0xed, 0x46 + 8*mode])\n    return 2\n\ndef op_RST(p,opargs):\n    check_args(opargs,1)\n    if (p==2):\n        vector = parse_expression(opargs)\n        if (vector>0x38) or (vector<0) or ((vector%8) != 0):\n            fatal (\"argument out of range or doesn't divide by 8\")\n        \n        dump([0xc7 + vector])\n    return 1\n\ndef op_EX(p,opargs):\n    check_args(opargs,2)\n    args = opargs.split(',',1)\n    \n    if re.search(\"\\A\\s*\\(\\s*SP\\s*\\)\\s*\\Z\", args[0], re.IGNORECASE):\n        pre2,rr2 = double(args[1],allow_af_instead_of_sp=1, allow_af_alt=1, allow_index=1)\n    \n        if rr2==2:\n            instr = pre2\n            instr.append(0xe3)\n        else:\n            fatal(\"Can't exchange \"+args[0]+\" with \"+args[1])\n    else:\n        pre1,rr1 = double(args[0],allow_af_instead_of_sp=1, allow_index=0)\n        pre2,rr2 = double(args[1],allow_af_instead_of_sp=1, allow_af_alt=1, allow_index=0)\n    \n        if rr1==1 and rr2==2:\n            # EX DE,HL\n            instr = pre1\n            instr.extend(pre2)\n            instr.append(0xeb)\n        elif (rr1==3 and rr2==4):\n            instr=[0x08]\n        else:\n            fatal(\"Can't exchange \"+args[0]+\" with \"+args[1])\n    \n    if (p==2):\n        dump(instr)\n    \n    return len(instr)\n\ndef op_IN(p,opargs):\n    check_args(opargs,2)\n    args = opargs.split(',',1)\n    if (p==2):\n        pre,r,post = single(args[0],allow_index=0,allow_half=0)\n        if r!=-1 and r!=6 and re.search(\"\\A\\s*\\(\\s*C\\s*\\)\\s*\\Z\", args[1], re.IGNORECASE):\n            dump([0xed, 0x40+8*r])\n        elif r==7:\n            match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", args[1])\n            if match==None:\n                fatal(\"No expression in \"+args[1])\n            \n            n = parse_expression(match.group(1))\n            dump([0xdb, n])\n        else:\n            fatal(\"Invalid argument\")\n    return 2\n\ndef op_OUT(p,opargs):\n    check_args(opargs,2)\n    args = opargs.split(',',1)\n    if (p==2):\n        pre,r,post = single(args[1],allow_index=0,allow_half=0)\n        if r!=-1 and r!=6 and re.search(\"\\A\\s*\\(\\s*C\\s*\\)\\s*\\Z\", args[0], re.IGNORECASE):\n            dump([0xed, 0x41+8*r])\n        elif r==7:\n            match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", args[0])\n            n = parse_expression(match.group(1))\n            dump([0xd3, n])\n        else:\n            fatal(\"Invalid argument\")\n    return 2\n\ndef op_LD(p,opargs):\n    check_args(opargs,2)\n    arg1,arg2 = opargs.split(',',1)\n    \n    prefix, rr1 = double(arg1)\n    if rr1 != -1:\n        prefix2, rr2 = double(arg2)\n        if rr1==3 and rr2==2:\n            instr = prefix2\n            instr.append(0xf9)\n            dump(instr)\n            return len(instr)\n        \n        match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", arg2)\n        if match:\n            # ld rr, (nn)\n            if p==2:\n                nn = parse_expression(match.group(1),word=1)\n            else:\n                nn = 0\n            instr = prefix\n            if rr1==2:\n                instr.extend([0x2a, nn%256, nn//256])\n            else:\n                instr.extend([0xed, 0x4b + 16*rr1, nn%256, nn//256])\n            dump(instr)\n            return len (instr)\n        else:\n            #ld rr, nn\n            if p==2:\n                nn = parse_expression(arg2,word=1)\n            else:\n                nn = 0\n            instr = prefix\n            instr.extend([0x01 + 16*rr1, nn%256, nn//256])\n            dump(instr)\n            return len (instr)\n    \n    prefix, rr2 = double(arg2)\n    if rr2 != -1:\n        match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", arg1)\n        if match:\n            # ld (nn), rr\n            if p==2:\n                nn = parse_expression(match.group(1))\n            else:\n                nn = 0\n            instr = prefix\n            if rr2==2:\n                instr.extend([0x22, nn%256, nn//256])\n            else:\n                instr.extend([0xed, 0x43 + 16*rr2, nn%256, nn//256])\n            dump(instr)\n            return len (instr)\n    \n    prefix1,r1,postfix1 = single(arg1, allow_i=1, allow_r=1)\n    prefix2,r2,postfix2 = single(arg2, allow_i=1, allow_r=1)\n    if r1 != -1 :\n        if r2 != -1:\n            if (r1 > 7) or (r2 > 7):\n                if r1==7:\n                    if r2==8:\n                        dump([0xed,0x57])\n                        return 2\n                    elif r2==9:\n                        dump([0xed,0x5f])\n                        return 2\n                if r2==7:\n                    if r1==8:\n                        dump([0xed,0x47])\n                        return 2\n                    elif r1==9:\n                        dump([0xed,0x4f])\n                        return 2\n                fatal(\"Invalid argument\")\n            \n            if r1==6 and r2==6:\n                fatal(\"Ha - nice try. That's a HALT.\")\n            \n            if (r1==4 or r1==5) and (r2==4 or r2==5) and prefix1 != prefix2:\n                fatal(\"Illegal combination of operands\")\n            \n            if r1==6 and (r2==4 or r2==5) and len(prefix2) != 0:\n                fatal(\"Illegal combination of operands\")\n\n            if r2==6 and (r1==4 or r1==5) and len(prefix1) != 0:\n                fatal(\"Illegal combination of operands\")\n\n            instr = prefix1\n            if len(prefix1) == 0:\n                instr.extend(prefix2)\n            instr.append(0x40 + 8*r1 + r2)\n            instr.extend(postfix1)\n            instr.extend(postfix2)\n            dump(instr)\n            return len(instr)\n        \n        else:\n            if r1 > 7:\n                fatal(\"Invalid argument\")\n\n            if r1==7 and re.search(\"\\A\\s*\\(\\s*BC\\s*\\)\\s*\\Z\", arg2, re.IGNORECASE):\n                dump([0x0a])\n                return 1\n            if r1==7 and re.search(\"\\A\\s*\\(\\s*DE\\s*\\)\\s*\\Z\", arg2, re.IGNORECASE):\n                dump([0x1a])\n                return 1\n            match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", arg2)\n            if match:\n                if r1 != 7:\n                    fatal(\"Illegal indirection\")\n                if p==2:\n                    nn = parse_expression(match.group(1), word=1)\n                    dump([0x3a, nn%256, nn//256])\n                return 3\n            \n            instr = prefix1\n            instr.append(0x06 + 8*r1)\n            instr.extend(postfix1)\n            if (p==2):\n                n = parse_expression(arg2, byte=1)\n            else:\n                n = 0\n            instr.append(n)\n            dump(instr)\n            return len(instr)\n    \n    elif r2==7:\n        # ld (bc/de/nn),a\n        if re.search(\"\\A\\s*\\(\\s*BC\\s*\\)\\s*\\Z\", arg1, re.IGNORECASE):\n            dump([0x02])\n            return 1\n        if re.search(\"\\A\\s*\\(\\s*DE\\s*\\)\\s*\\Z\", arg1, re.IGNORECASE):\n            dump([0x12])\n            return 1\n        match = re.search(\"\\A\\s*\\(\\s*(.*)\\s*\\)\\s*\\Z\", arg1)\n        if match:\n            if p==2:\n                nn = parse_expression(match.group(1), word=1)\n                dump([0x32, nn%256, nn//256])\n            return 3\n    fatal(\"LD args not understood - \"+arg1+\", \"+arg2)\n    \n    return 1\n\n#ifstate=0: parse all code\n#ifstate=1: parse this code, but stop at ELSE\n#ifstate=2: do not parse this code, but might start at ELSE\n#ifstate=3: do not parse any code until ENDIF\n\ndef op_IF(p,opargs):\n    global ifstate, ifstack\n    check_args(opargs,1)\n    \n    ifstack.append( (global_currentfile,ifstate) )\n    if ifstate < 2:\n        cond = parse_expression(opargs)\n        if cond:\n            ifstate = 1\n        else:\n            ifstate = 2\n    else:\n        ifstate = 3\n    return 0\n\ndef op_ELSE(p,opargs):\n    global ifstate, ifstack\n    if ifstate==1 or ifstate==3:\n        ifstate = 3\n    elif ifstate==2:\n        if opargs.upper().startswith(\"IF\"):\n            cond = parse_expression(opargs[2:].strip())\n            if cond:\n                ifstate = 1\n            else:\n                ifstate = 2\n        else:\n            ifstate = 1\n    else:\n        fatal(\"Mismatched ELSE\")\n\n    return 0\n\ndef op_ENDIF(p,opargs):\n    global ifstate, ifstack\n    check_args(opargs,0)\n\n    if len(ifstack) == 0:\n        fatal(\"Mismatched ENDIF\")\n\n    ifline,state = ifstack.pop()\n    ifstate = state\n    \n    return 0\n\ndef assemble_instruction(p, line):\n    opcodeargs = line.split(None,1)\n    if '(' in opcodeargs[0]:\n        opcodeargs = [line[:line.index('(')] , line[line.index('('):] ]\n\n    if len(opcodeargs)>1:\n        args = opcodeargs[1].strip()\n    else:\n        args=''\n        \n    inst = opcodeargs[0].upper()\n    if (ifstate < 2) or inst=='IF' or inst=='ELSE' or inst=='ENDIF':\n        functioncall = 'op_'+inst+'(p,args)'\n        if PYTHONERRORS:\n            return eval(functioncall)\n        else:\n            try:\n                return eval(functioncall)\n            except SystemExit as e:\n                sys.exit(e)\n            except:\n                fatal(\"OpCode not recognised\")\n    else:\n        return 0\n\ndef assembler_pass(p, inputfile):\n    global memory, symboltable, symusetable, labeltable, origin, dumppage, dumporigin, symbol\n    global global_currentfile, global_currentline, lstcode, listingfile\n# file references are local, so assembler_pass can be called recursively (for op_INC)\n# but copied to a global identifier for warning printouts\n    global global_path\n    \n    global_currentfile=\"command line\"\n    global_currentline=\"0\"\n    \n    # just read the whole file into memory, it's not going to be huge (probably)\n    # I'd prefer not to, but assembler_pass can be called recursively\n    # (by op_INCLUDE for example) and fileinput does not support two files simultaneously\n    \n    this_currentfilename = os.path.join(global_path, inputfile)\n    if os.sep in this_currentfilename:\n        global_path = os.path.dirname(this_currentfilename)\n    \n    try:\n        currentfile = open(this_currentfilename,'r')\n        wholefile=currentfile.readlines()\n        wholefile.insert(0, '') # prepend blank so line numbers are 1-based\n        currentfile.close()\n    except:\n        fatal(\"Couldn't open file \"+this_currentfilename+\" for reading\")\n    \n    \n    consider_linenumber=0\n    while consider_linenumber < len(wholefile):\n\n        currentline = wholefile[consider_linenumber]\n\n        global_currentline = currentline\n        global_currentfile = this_currentfilename+\":\"+str(consider_linenumber)\n            # write these every instruction because an INCLUDE may have overwritten them\n        \n        symbol = ''\n        opcode = ''\n        inquotes = ''\n        inquoteliteral = False\n        i = \"\"\n        for nexti in currentline+\" \":\n            if (i==';' or i=='#') and not inquotes:\n                break\n            if i==':' and not inquotes:\n                symbol = opcode\n                opcode=''\n                i = ''\n            \n            if i == '\"':\n                if not inquotes:\n                    inquotes = i\n                else:\n                    if (not inquoteliteral) and nexti=='\"':\n                        inquoteliteral = True\n                        \n                    elif inquoteliteral:\n                        inquoteliteral = False\n                        inquotes += i\n                        \n                    else:\n                        inquotes += i\n                    \n                        if inquotes == '\"\"':\n                            inquotes = '\"\"\"'\n                        elif inquotes == '\",\"':\n                            inquotes = \" 44 \"\n                            i = \"\"\n                    \n                        opcode += inquotes\n                        inquotes = \"\"\n            elif inquotes:\n                inquotes += i\n            else:\n                opcode += i\n            \n            lasti = i\n            i = nexti\n        \n        symbol = symbol.strip()\n        opcode = opcode.strip()\n        \n        if inquotes:\n            fatal(\"Mismatched quotes\")\n        \n        if len( symbol.split()) > 1:\n            fatal(\"Whitespace not allowed in symbol name\")\n        \n        if (symbol and (opcode[0:3].upper() !=\"EQU\") and (ifstate < 2)):\n            if p==1:\n                set_symbol(symbol, origin, is_label=True)\n            elif get_symbol(symbol) != origin:\n                fatal(\"Symbol \"+symbol+\": expected \"+str(get_symbol(symbol))+\" but calculated \"+str(origin)+\", has this symbol been used twice?\")\n        \n        if (opcode):\n            bytes = assemble_instruction(p,opcode)\n            if p>1 and listingfile != None:\n              lstout=\"%04X %-13s\\t%s\"%(origin,lstcode,wholefile[consider_linenumber].rstrip())\n              lstcode=\"\"\n              writelisting(lstout)\n            origin = (origin + bytes) % 65536\n        else:\n          if p>1 and listingfile != None:\n            lstout=\"    %-13s\\t%s\"%(\"\",wholefile[consider_linenumber].rstrip())\n            lstcode=\"\"\n            writelisting(lstout)\n\n        if global_currentfile.startswith(this_currentfilename+\":\") and int(global_currentfile.rsplit(':',1)[1]) != consider_linenumber:\n            consider_linenumber = int(global_currentfile.rsplit(':')[1])\n\n        consider_linenumber += 1\n\n###########################################################################\n\ntry:\n    option_args, file_args = getopt.getopt(sys.argv[1:], 'ho:s:eD:I:', ['version','help','nozip','obj=','case','nobodmas','exportfile=','importfile=','mapfile=','lstfile='])\n    file_args = [os.path.normpath(x) for x in file_args]\nexcept getopt.GetoptError:\n    printusage()\n    sys.exit(2)\n\ninputfile = ''\noutputfile = ''\nobjectfile = ''\n\nPYTHONERRORS = False\nZIP = True\nCASE = False\nNOBODMAS = False\n\nlstcode=\"\"\nlistsymbols=[]\npredefsymbols=[]\nincludefiles=[]\nimportfiles=[]\nexportfile = None\nmapfile = None\nlistingfile = None\n\ndef writelisting(line):\n  if listingfile != None:\n    listingfile.write(line+\"\\n\")\n\nfor option,value in option_args:\n    if option in ['--version']:\n        printusage()\n        print(\"\")\n        printlicense()\n        sys.exit(0)\n    if option in ['--help','-h']:\n        printusage()\n        sys.exit(0)\n    \n    if option in ['-o']:\n        outputfile=value\n\n    if option in ['--obj']:\n        objectfile=value\n    \n    if option in ['-s']:\n        listsymbols.append(value)\n    \n    if option in ['-e']:\n        PYTHONERRORS = True # let python do its own error handling\n    \n    if option in ['--nozip']:\n        ZIP = False # save the disk image without compression\n\n    if option in ['--nobodmas']:\n        NOBODMAS = True # use no operator precedence\n    \n    if option in ['--case']:\n        CASE = True\n\n    if option in ['--exportfile']:\n        if exportfile == None:\n            exportfile = value\n        else:\n            print(\"Export file specified twice\")\n            printusage()\n            sys.exit(2)\n\n    if option in  ['--importfile']:\n        importfiles.append(value)\n\n    if option in ['--mapfile']:\n        if mapfile == None:\n            mapfile = value\n        else:\n            print(\"Map file specified twice\")\n            printusage()\n            sys.exit(2)\n\n    if option in ['--lstfile']:\n        if listingfile == None:\n            listingfile=open(value,\"wt\")\n        else:\n            print(\"List file specified twice\")\n            printusage()\n            sys.exit(2)\n\n    if option in ['-D']:\n        predefsymbols.append(value)\n\n    if option in ['-I']:\n        includefiles.append(value)\n\nif len(file_args) == 0 and len(includefiles) == 0:\n    print(\"No input file specified\")\n    printusage()\n    sys.exit(2)\n\nif (objectfile != '') and (len(file_args) != 1):\n    print(\"Object file output supports only a single source file\")\n    printusage()\n    sys.exit(2)\n\nif (outputfile == '') and (objectfile == ''):\n    outputfile = os.path.splitext(file_args[0])[0] + \".dsk\";\n\nimage = new_disk_image()\n\nfor pathname in includefiles:\n    save_file_to_image(image,pathname)\n    \nfor inputfile in file_args:\n\n    if (inputfile == outputfile) or (inputfile == objectfile):\n        print(\"Output file and input file are the same!\")\n        printusage()\n        sys.exit(2)\n\n    symboltable = {}\n    symbolcase = {}\n    symusetable = {}\n    labeltable = {}\n    memory = []\n    forstack=[]\n    ifstack = []\n    ifstate = 0\n\n    for value in predefsymbols:\n        sym=value.split('=',1)\n        if len(sym)==1:\n            sym.append(\"1\")\n        if not CASE:\n            sym[0]=sym[0].upper()\n        if PYTHONERRORS:\n            val = int(sym[1])\n        else:\n            try:\n                val = int(sym[1])\n            except:\n                print(\"Error: Invalid value for symbol predefined on command line, \"+value)\n                sys.exit(1)\n        set_symbol(sym[0], int(sym[1]))\n\n    for picklefilename in importfiles:\n        picklefile = open(picklefilename)\n        u = pickle.Unpickler(picklefile)\n        ImportSymbols = u.load()\n        for sym,val in list(ImportSymbols.items()):\n            if not CASE:\n                symboltable[sym.upper()]=val\n            else:\n                symboltable[sym]=val\n        picklefile.close()\n\n    firstpage=32\n    firstpageoffset=16384\n    lastpage=-1\n    lastpageoffset=0\n\n    # always 32 memory pages, each a 16k array allocate-on-write\n    for initmemorypage in range(32):\n        memory.append('')\n\n    for p in 1,2:\n        print(\"pass \",p,\"...\")\n    \n        global_path=''\n        include_stack=[]\n    \n        origin = 32768\n        dumppage = 1\n        dumporigin = 0\n        dumpspace_pending = 0\n        dumpused = False\n        autoexecpage = 0\n        autoexecorigin = 0\n    \n        assembler_pass(p, inputfile)\n\n    check_lastpage()\n\n    if len(ifstack) > 0:\n        print(\"Error: Mismatched IF and ENDIF statements, too many IF\")\n        for item in ifstack:\n            print(item[0])\n        sys.exit(1)\n    if len(forstack) > 0:\n        print(\"Error: Mismatched EQU FOR and NEXT statements, too many EQU FOR\")\n        for item in forstackstack:\n            print(item[1])\n        sys.exit(1)\n\n    printsymbols = {}\n    for symreg in listsymbols:\n        # add to printsymbols any pair from symboltable whose key matches symreg\n        for sym in symboltable:\n            if re.search(symreg, sym, re.IGNORECASE):\n                printsymbols[symbolcase[sym]] = symboltable[sym]\n\n    if printsymbols != {}:\n        print(printsymbols)\n\n    if exportfile:\n        f = open(exportfile,'w')\n        p = pickle.Pickler(f)\n        p.dump(symboltable)\n\n    if mapfile:\n        addrmap = {}\n        for sym,count in sorted(list(symusetable.items()), key=lambda x: x[1]):\n            if sym in labeltable:\n                addrmap[labeltable[sym]] = symbolcase[sym]\n\n        with open(mapfile,'w') as f:\n            for addr,sym in sorted(addrmap.items()):\n                f.write(\"%04X=%s\\n\" % (addr,sym))\n\n    save_memory(memory, image=image, filename=os.path.splitext(os.path.basename(inputfile))[0])\n    if objectfile != \"\":\n        save_memory(memory, filename=objectfile)\n\n\nif outputfile != '':\n    save_disk_image(image, outputfile)\n\nprint(\"Finished\")\n"
  },
  {
    "path": "tools/z88dk/samcoupe/sam_wrapper.asm",
    "content": "org &8000\r\ndump $\r\nautoexec\r\nmdat \"../../../build/FULL_samcoupe.bin\"\r\n"
  }
]